From 5522b00ad27afe45643631b0873a12f7a5b6e928 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Fri, 8 Aug 2025 14:26:48 +0200 Subject: [PATCH 01/44] Experimental Platform split --- site/content/3.12/_index.md | 4 ++-- .../3.12/about-arangodb/features/platform.md | 12 +++++----- site/content/3.12/aql/functions/vector.md | 2 +- site/content/3.12/deploy/_index.md | 2 +- .../working-with-indexes/vector-indexes.md | 2 +- site/content/platform/_index.md | 24 +++++++++++++++++++ .../about-the-platform/_index.md} | 4 ++-- .../{3.12 => platform}/data-science/_index.md | 18 +++++++------- .../data-science/graphml/_index.md | 0 .../data-science/graphml/notebooks-api.md | 2 +- .../data-science/graphml/quickstart.md | 0 .../data-science/graphml/ui.md | 0 .../data-science/graphrag/_index.md | 0 .../data-science/graphrag/services/_index.md | 0 .../data-science/graphrag/services/gen-ai.md | 2 +- .../graphrag/services/importer.md | 0 .../data-science/graphrag/services/mlflow.md | 2 +- .../services/natural-language-to-aql.md | 0 .../graphrag/services/retriever.md | 0 .../services/triton-inference-server.md | 0 .../graphrag/tutorial-notebook.md | 2 +- .../data-science/graphrag/web-interface.md | 2 +- .../data-science/integrations/_index.md | 0 .../integrations/arangodb-cugraph-adapter.md | 0 .../integrations/arangodb-dgl-adapter.md | 0 .../integrations/arangodb-networkx-adapter.md | 0 .../integrations/arangodb-pyg-adapter.md | 0 .../integrations/arangodb-rdf-adapter.md | 0 .../data-science/integrations/langchain.md | 0 .../data-science/notebook-servers.md | 2 +- .../platform/graph-intelligence/_index.md | 5 ++++ .../graph-intelligence}/graph-analytics.md | 12 +++++----- .../graph-intelligence}/graph-visualizer.md | 4 ++-- .../platform.md => platform/release-notes.md} | 8 +++---- site/data/versions.yaml | 5 ++++ .../layouts/partials/shortcodes/version.html | 4 +++- .../arangoproxy/internal/service/service.go | 3 +++ 37 files changed, 80 insertions(+), 41 deletions(-) create mode 100644 site/content/platform/_index.md rename site/content/{3.12/components/platform.md => platform/about-the-platform/_index.md} (98%) rename site/content/{3.12 => platform}/data-science/_index.md (89%) rename site/content/{3.12 => platform}/data-science/graphml/_index.md (100%) rename site/content/{3.12 => platform}/data-science/graphml/notebooks-api.md (99%) rename site/content/{3.12 => platform}/data-science/graphml/quickstart.md (100%) rename site/content/{3.12 => platform}/data-science/graphml/ui.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/_index.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/services/_index.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/services/gen-ai.md (98%) rename site/content/{3.12 => platform}/data-science/graphrag/services/importer.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/services/mlflow.md (98%) rename site/content/{3.12 => platform}/data-science/graphrag/services/natural-language-to-aql.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/services/retriever.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/services/triton-inference-server.md (100%) rename site/content/{3.12 => platform}/data-science/graphrag/tutorial-notebook.md (99%) rename site/content/{3.12 => platform}/data-science/graphrag/web-interface.md (98%) rename site/content/{3.12 => platform}/data-science/integrations/_index.md (100%) rename site/content/{3.12 => platform}/data-science/integrations/arangodb-cugraph-adapter.md (100%) rename site/content/{3.12 => platform}/data-science/integrations/arangodb-dgl-adapter.md (100%) rename site/content/{3.12 => platform}/data-science/integrations/arangodb-networkx-adapter.md (100%) rename site/content/{3.12 => platform}/data-science/integrations/arangodb-pyg-adapter.md (100%) rename site/content/{3.12 => platform}/data-science/integrations/arangodb-rdf-adapter.md (100%) rename site/content/{3.12 => platform}/data-science/integrations/langchain.md (100%) rename site/content/{3.12 => platform}/data-science/notebook-servers.md (96%) create mode 100644 site/content/platform/graph-intelligence/_index.md rename site/content/{3.12/graphs => platform/graph-intelligence}/graph-analytics.md (98%) rename site/content/{3.12/graphs => platform/graph-intelligence}/graph-visualizer.md (99%) rename site/content/{3.12/release-notes/platform.md => platform/release-notes.md} (82%) diff --git a/site/content/3.12/_index.md b/site/content/3.12/_index.md index 55372ec34b..cc569bfae0 100644 --- a/site/content/3.12/_index.md +++ b/site/content/3.12/_index.md @@ -26,11 +26,11 @@ ArangoDB's Query Language AQL lets you use graphs, JSON documents, and search via a single, composable query language. {{% /card %}} -{{% card title="GenAI & Data Science" link="data-science/" %}} +{{% card title="GenAI & Data Science" link="../platform/data-science/" %}} Discover the graph-powered machine learning and GraphRAG features of ArangoDB. {{% /card %}} -{{% card title="ArangoDB Platform" link="components/platform/" %}} +{{% card title="ArangoDB Platform" link="../platform/" %}} The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering of products, including GraphML and GraphRAG. {{% /card %}} diff --git a/site/content/3.12/about-arangodb/features/platform.md b/site/content/3.12/about-arangodb/features/platform.md index 2b833379d4..d6ef7fd320 100644 --- a/site/content/3.12/about-arangodb/features/platform.md +++ b/site/content/3.12/about-arangodb/features/platform.md @@ -8,7 +8,7 @@ description: >- solution with a unified interface --- For in-depth information about the ArangoDB Platform as a whole and how to -deploy and use it, see [The ArangoDB Platform](../../components/platform.md). +deploy and use it, see [The ArangoDB Platform](../../../platform/about-the-platform/_index.md). ## Architecture @@ -34,24 +34,24 @@ deploy and use it, see [The ArangoDB Platform](../../components/platform.md). - [**ArangoDB Core**](core.md): The ArangoDB database system with support for graphs, documents, key-value, full-text search, and vector search. -- [**Graph Visualizer**](../../graphs/graph-visualizer.md): +- [**Graph Visualizer**](../../../platform/graph-intelligence/graph-visualizer.md): A web-based tool for exploring your graph data with an intuitive interface and sophisticated querying capabilities. -- [**Graph Analytics**](../../graphs/graph-analytics.md): +- [**Graph Analytics**](../../../platform/graph-intelligence/graph-analytics.md): A service that can efficiently load graph data from the core database system and run graph algorithms such as PageRank and many more. -- [**GenAI Suite**](../../data-science/_index.md): +- [**GenAI Suite**](../../../platform/data-science/_index.md): ArangoDB's graph-powered machine learning (GraphML) as well as GraphRAG for automatically building knowledge graphs from text and taking advantage of both excerpts and higher-level summaries as context for turbocharging GenAI applications. -- [**Notebook servers**](../../data-science/notebook-servers.md): +- [**Notebook servers**](../../../platform/data-science/notebook-servers.md): Run Jupyter kernels in the Platform for hosting interactive, Python-based notebooks to experiment and develop applications. -- [**MLflow integration**](../../data-science/graphrag/services/mlflow.md): +- [**MLflow integration**](../../../platform/data-science/graphrag/services/mlflow.md): Use the popular MLflow for machine learning practitioners as part of the ArangoDB Platform. diff --git a/site/content/3.12/aql/functions/vector.md b/site/content/3.12/aql/functions/vector.md index 45341b8ea8..987de8e45e 100644 --- a/site/content/3.12/aql/functions/vector.md +++ b/site/content/3.12/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../data-science/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../platform/data-science/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. {{< warning >}} diff --git a/site/content/3.12/deploy/_index.md b/site/content/3.12/deploy/_index.md index e0d36ebcd0..e99d1d56e5 100644 --- a/site/content/3.12/deploy/_index.md +++ b/site/content/3.12/deploy/_index.md @@ -50,7 +50,7 @@ ArangoDB product offering with a unified interface in a Kubernetes cluster. It is offered for self-hosting on-prem or in the cloud and as a managed service, superseding the ArangoGraph Insights Platform. -See [The ArangoDB Platform](../components/platform.md) for details. +See [The ArangoDB Platform](../../platform/about-the-platform/_index.md) for details. ## How to deploy diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md index 17d9be8fe3..955051efc6 100644 --- a/site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -33,7 +33,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the experimental vector index feature. -2. Calculate vector embeddings using [ArangoDB's GraphML](../../../data-science/graphml/_index.md) +2. Calculate vector embeddings using [ArangoDB's GraphML](../../../../platform/data-science/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/platform/_index.md b/site/content/platform/_index.md new file mode 100644 index 0000000000..a70a2b36e7 --- /dev/null +++ b/site/content/platform/_index.md @@ -0,0 +1,24 @@ +--- +title: Recommended Resources +menuTitle: 'Platform' +weight: 0 +layout: default +--- +{{< cloudbanner >}} + +{{< cards >}} + +{{% card title="What is the ArangoDB Platform?" link="about-the-platform/" %}} +The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering +of products, including GraphML and GraphRAG. +{{% /card %}} + +{{% card title="Graph Intelligence" link="graph-intelligence/" %}} +Analyze and visualize your data with the Graph Analytics and Graph Visualizer features. +{{% /card %}} + +{{% card title="GenAI & Data Science" link="data-science/" %}} +Discover the graph-powered machine learning and GraphRAG features of ArangoDB. +{{% /card %}} + +{{< /cards >}} diff --git a/site/content/3.12/components/platform.md b/site/content/platform/about-the-platform/_index.md similarity index 98% rename from site/content/3.12/components/platform.md rename to site/content/platform/about-the-platform/_index.md index ba034f43cf..e643b843c7 100644 --- a/site/content/3.12/components/platform.md +++ b/site/content/platform/about-the-platform/_index.md @@ -1,7 +1,7 @@ --- title: The ArangoDB Platform menuTitle: Platform -weight: 169 +weight: 5 description: >- The ArangoDB Platform brings everything ArangoDB offers together to a single solution that you can deploy on-prem or use as a managed service @@ -65,7 +65,7 @@ of the platform features. ### Use the ArangoDB Platform as a managed service The ArangoDB Platform is not available as a managed service yet, but it will -become available for the [ArangoGraph Insights Platform](../arangograph/_index.md) +become available for the [ArangoGraph Insights Platform](../../3.12/arangograph/_index.md) in the future. Until then, you can request early access to the self-hosted ArangoDB Platform for testing. diff --git a/site/content/3.12/data-science/_index.md b/site/content/platform/data-science/_index.md similarity index 89% rename from site/content/3.12/data-science/_index.md rename to site/content/platform/data-science/_index.md index 3e0f3d853d..c6981e809c 100644 --- a/site/content/3.12/data-science/_index.md +++ b/site/content/platform/data-science/_index.md @@ -1,7 +1,7 @@ --- title: Generative Artificial Intelligence (GenAI) and Data Science menuTitle: GenAI & Data Science -weight: 115 +weight: 15 description: >- ArangoDB's set of tools and technologies enables analytics, machine learning, and GenAI applications powered by graph data @@ -48,16 +48,16 @@ ArangoDB Platform web interface, guiding you through the process. Alongside these components, you also get the following additional features: -- [**Graph Visualizer**](../graphs/graph-visualizer.md): A web-based tool for exploring your graph data with an +- [**Graph Visualizer**](../graph-intelligence/graph-visualizer.md): A web-based tool for exploring your graph data with an intuitive interface and sophisticated querying capabilities. - [**Jupyter notebooks**](notebook-servers.md): Run a Jupyter kernel in the platform for hosting interactive notebooks for experimentation and development of applications that use ArangoDB as their backend. - **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../data-science/graphrag/services/triton-inference-server.md). -- [**MLflow integration**](./graphrag/services/mlflow.md): Use the popular MLflow as a model registry for private LLMs + or private LLMs with [Triton Inference Server](graphrag/services/triton-inference-server.md). +- [**MLflow integration**](graphrag/services/mlflow.md): Use the popular MLflow as a model registry for private LLMs or to run machine learning experiments as part of the ArangoDB Platform. -- [**Integrations**](./integrations/_index.md): Use ArangoDB together with cuGraph, NetworkX, +- [**Integrations**](integrations/_index.md): Use ArangoDB together with cuGraph, NetworkX, and other data science tools. - **Application Programming Interfaces**: Use the underlying APIs of the GenAI Suite services and build your own integrations. See the @@ -69,7 +69,7 @@ Alongside these components, you also get the following additional features: The ArangoDB Platform includes the following features independent of the GenAI Suite: -- [**Graph Analytics**](../graphs/graph-analytics.md): Run graph algorithms such as PageRank +- [**Graph Analytics**](../graph-intelligence/graph-analytics.md): Run graph algorithms such as PageRank on dedicated compute resources. ## From graph to AI @@ -92,7 +92,7 @@ Graph queries can answer questions like _**Who can introduce me to person X**_? ![Graph Query](../../images/graph-query.png) -See [Graphs in AQL](../aql/graphs/_index.md) for the supported graph queries. +See [Graphs in AQL](../../3.12/aql/graphs/_index.md) for the supported graph queries. ### Graph Analytics @@ -106,7 +106,7 @@ Graph analytics can answer questions like _**Who are the most connected persons* ArangoDB offers _Graph Analytics Engines_ to run algorithms such as connected components, label propagation, and PageRank on your data. This feature is available for the ArangoGraph Insights Platform. See -[Graph Analytics](../graphs/graph-analytics.md) for details. +[Graph Analytics](../graph-intelligence/graph-analytics.md) for details. ### GraphML @@ -168,5 +168,5 @@ the following tasks: ## Sample datasets If you want to try out ArangoDB's data science features, you may use the -[`arango-datasets` Python package](../components/tools/arango-datasets.md) +[`arango-datasets` Python package](../../3.12/components/tools/arango-datasets.md) to load sample datasets into a deployment. diff --git a/site/content/3.12/data-science/graphml/_index.md b/site/content/platform/data-science/graphml/_index.md similarity index 100% rename from site/content/3.12/data-science/graphml/_index.md rename to site/content/platform/data-science/graphml/_index.md diff --git a/site/content/3.12/data-science/graphml/notebooks-api.md b/site/content/platform/data-science/graphml/notebooks-api.md similarity index 99% rename from site/content/3.12/data-science/graphml/notebooks-api.md rename to site/content/platform/data-science/graphml/notebooks-api.md index c9ade4cacf..9b0d593a2a 100644 --- a/site/content/3.12/data-science/graphml/notebooks-api.md +++ b/site/content/platform/data-science/graphml/notebooks-api.md @@ -82,7 +82,7 @@ news sources, and locations are interconnected into a large graph. ![Example Event](../../../images/ArangoML_open_intelligence_visualization.png) -The [`arango-datasets`](../../components/tools/arango-datasets.md) Python package +The [`arango-datasets`](../../../3.12/components/tools/arango-datasets.md) Python package allows you to load pre-defined datasets into ArangoDB Platform. It comes pre-installed in the GraphML notebook environment. diff --git a/site/content/3.12/data-science/graphml/quickstart.md b/site/content/platform/data-science/graphml/quickstart.md similarity index 100% rename from site/content/3.12/data-science/graphml/quickstart.md rename to site/content/platform/data-science/graphml/quickstart.md diff --git a/site/content/3.12/data-science/graphml/ui.md b/site/content/platform/data-science/graphml/ui.md similarity index 100% rename from site/content/3.12/data-science/graphml/ui.md rename to site/content/platform/data-science/graphml/ui.md diff --git a/site/content/3.12/data-science/graphrag/_index.md b/site/content/platform/data-science/graphrag/_index.md similarity index 100% rename from site/content/3.12/data-science/graphrag/_index.md rename to site/content/platform/data-science/graphrag/_index.md diff --git a/site/content/3.12/data-science/graphrag/services/_index.md b/site/content/platform/data-science/graphrag/services/_index.md similarity index 100% rename from site/content/3.12/data-science/graphrag/services/_index.md rename to site/content/platform/data-science/graphrag/services/_index.md diff --git a/site/content/3.12/data-science/graphrag/services/gen-ai.md b/site/content/platform/data-science/graphrag/services/gen-ai.md similarity index 98% rename from site/content/3.12/data-science/graphrag/services/gen-ai.md rename to site/content/platform/data-science/graphrag/services/gen-ai.md index 280dfd2511..a87c3c44df 100644 --- a/site/content/3.12/data-science/graphrag/services/gen-ai.md +++ b/site/content/platform/data-science/graphrag/services/gen-ai.md @@ -98,7 +98,7 @@ curl -X POST https://:8529/_open/auth \ This returns a JWT token that you can use as your Bearer token. For more details about ArangoDB authentication and JWT tokens, see -the [ArangoDB Authentication](../../../develop/http-api/authentication/#jwt-user-tokens) +the [ArangoDB Authentication](../../../../3.12/develop/http-api/authentication/#jwt-user-tokens) documentation. ## Complete Service lifecycle example diff --git a/site/content/3.12/data-science/graphrag/services/importer.md b/site/content/platform/data-science/graphrag/services/importer.md similarity index 100% rename from site/content/3.12/data-science/graphrag/services/importer.md rename to site/content/platform/data-science/graphrag/services/importer.md diff --git a/site/content/3.12/data-science/graphrag/services/mlflow.md b/site/content/platform/data-science/graphrag/services/mlflow.md similarity index 98% rename from site/content/3.12/data-science/graphrag/services/mlflow.md rename to site/content/platform/data-science/graphrag/services/mlflow.md index 0de3c91d3b..305ea90a1b 100644 --- a/site/content/3.12/data-science/graphrag/services/mlflow.md +++ b/site/content/platform/data-science/graphrag/services/mlflow.md @@ -93,7 +93,7 @@ curl -X POST https://:8529/_open/auth \ This returns a JWT token that you can use as your Bearer token. For more details about ArangoDB authentication and JWT tokens, see the -[ArangoDB Authentication](https://docs.arangodb.com/stable/develop/http-api/authentication/#jwt-user-tokens) +[ArangoDB Authentication](../../../../3.12/develop/http-api/authentication/#jwt-user-tokens) documentation. ## Installation diff --git a/site/content/3.12/data-science/graphrag/services/natural-language-to-aql.md b/site/content/platform/data-science/graphrag/services/natural-language-to-aql.md similarity index 100% rename from site/content/3.12/data-science/graphrag/services/natural-language-to-aql.md rename to site/content/platform/data-science/graphrag/services/natural-language-to-aql.md diff --git a/site/content/3.12/data-science/graphrag/services/retriever.md b/site/content/platform/data-science/graphrag/services/retriever.md similarity index 100% rename from site/content/3.12/data-science/graphrag/services/retriever.md rename to site/content/platform/data-science/graphrag/services/retriever.md diff --git a/site/content/3.12/data-science/graphrag/services/triton-inference-server.md b/site/content/platform/data-science/graphrag/services/triton-inference-server.md similarity index 100% rename from site/content/3.12/data-science/graphrag/services/triton-inference-server.md rename to site/content/platform/data-science/graphrag/services/triton-inference-server.md diff --git a/site/content/3.12/data-science/graphrag/tutorial-notebook.md b/site/content/platform/data-science/graphrag/tutorial-notebook.md similarity index 99% rename from site/content/3.12/data-science/graphrag/tutorial-notebook.md rename to site/content/platform/data-science/graphrag/tutorial-notebook.md index 00df23951e..2738493dcc 100644 --- a/site/content/3.12/data-science/graphrag/tutorial-notebook.md +++ b/site/content/platform/data-science/graphrag/tutorial-notebook.md @@ -201,7 +201,7 @@ pprint(importerResponse) ### Visualize and interact with the Knowledge Graph Once the importer service has processed the document, you can visualize and -interact with the generated Knowledge Graph using the [Graph Visualizer](../../graphs/graph-visualizer.md) +interact with the generated Knowledge Graph using the [Graph Visualizer](../../graph-intelligence/graph-visualizer.md) directly from the ArangoDB Platform web interface. 1. In the ArangoDB Platform web interface, select the database you have previously used. diff --git a/site/content/3.12/data-science/graphrag/web-interface.md b/site/content/platform/data-science/graphrag/web-interface.md similarity index 98% rename from site/content/3.12/data-science/graphrag/web-interface.md rename to site/content/platform/data-science/graphrag/web-interface.md index b167f66616..275bbeb81a 100644 --- a/site/content/3.12/data-science/graphrag/web-interface.md +++ b/site/content/platform/data-science/graphrag/web-interface.md @@ -107,7 +107,7 @@ You can only import a single file, either in `.md` or `.txt` format. You can open and explore the Knowledge Graph that has been generated by clicking on the **Explore in visualizer** button. -For more information, see the [Graph Visualizer](../../graphs/graph-visualizer.md) documentation. +For more information, see the [Graph Visualizer](../../graph-intelligence/graph-visualizer.md) documentation. ## Configure the Retriever service diff --git a/site/content/3.12/data-science/integrations/_index.md b/site/content/platform/data-science/integrations/_index.md similarity index 100% rename from site/content/3.12/data-science/integrations/_index.md rename to site/content/platform/data-science/integrations/_index.md diff --git a/site/content/3.12/data-science/integrations/arangodb-cugraph-adapter.md b/site/content/platform/data-science/integrations/arangodb-cugraph-adapter.md similarity index 100% rename from site/content/3.12/data-science/integrations/arangodb-cugraph-adapter.md rename to site/content/platform/data-science/integrations/arangodb-cugraph-adapter.md diff --git a/site/content/3.12/data-science/integrations/arangodb-dgl-adapter.md b/site/content/platform/data-science/integrations/arangodb-dgl-adapter.md similarity index 100% rename from site/content/3.12/data-science/integrations/arangodb-dgl-adapter.md rename to site/content/platform/data-science/integrations/arangodb-dgl-adapter.md diff --git a/site/content/3.12/data-science/integrations/arangodb-networkx-adapter.md b/site/content/platform/data-science/integrations/arangodb-networkx-adapter.md similarity index 100% rename from site/content/3.12/data-science/integrations/arangodb-networkx-adapter.md rename to site/content/platform/data-science/integrations/arangodb-networkx-adapter.md diff --git a/site/content/3.12/data-science/integrations/arangodb-pyg-adapter.md b/site/content/platform/data-science/integrations/arangodb-pyg-adapter.md similarity index 100% rename from site/content/3.12/data-science/integrations/arangodb-pyg-adapter.md rename to site/content/platform/data-science/integrations/arangodb-pyg-adapter.md diff --git a/site/content/3.12/data-science/integrations/arangodb-rdf-adapter.md b/site/content/platform/data-science/integrations/arangodb-rdf-adapter.md similarity index 100% rename from site/content/3.12/data-science/integrations/arangodb-rdf-adapter.md rename to site/content/platform/data-science/integrations/arangodb-rdf-adapter.md diff --git a/site/content/3.12/data-science/integrations/langchain.md b/site/content/platform/data-science/integrations/langchain.md similarity index 100% rename from site/content/3.12/data-science/integrations/langchain.md rename to site/content/platform/data-science/integrations/langchain.md diff --git a/site/content/3.12/data-science/notebook-servers.md b/site/content/platform/data-science/notebook-servers.md similarity index 96% rename from site/content/3.12/data-science/notebook-servers.md rename to site/content/platform/data-science/notebook-servers.md index e84a9ebbb7..c9b8f67a05 100644 --- a/site/content/3.12/data-science/notebook-servers.md +++ b/site/content/platform/data-science/notebook-servers.md @@ -35,7 +35,7 @@ The notebooks are primarily focused on the following solutions: The ArangoDB Notebooks include the following: - Automatically connect to ArangoDB databases and GenAI platform services -- [Magic commands](../arangograph/notebooks.md#arangograph-magic-commands) +- [Magic commands](../../3.12/arangograph/notebooks.md#arangograph-magic-commands) that simplify database interactions - Example notebooks for learning diff --git a/site/content/platform/graph-intelligence/_index.md b/site/content/platform/graph-intelligence/_index.md new file mode 100644 index 0000000000..9d5ac11917 --- /dev/null +++ b/site/content/platform/graph-intelligence/_index.md @@ -0,0 +1,5 @@ +--- +title: Graph intelligence +menuTitle: Graph intelligence +weight: 10 +--- diff --git a/site/content/3.12/graphs/graph-analytics.md b/site/content/platform/graph-intelligence/graph-analytics.md similarity index 98% rename from site/content/3.12/graphs/graph-analytics.md rename to site/content/platform/graph-intelligence/graph-analytics.md index ee01851ba8..ef55508402 100644 --- a/site/content/3.12/graphs/graph-analytics.md +++ b/site/content/platform/graph-intelligence/graph-analytics.md @@ -1,7 +1,7 @@ --- title: Graph Analytics menuTitle: Graph Analytics -weight: 115 +weight: 5 description: | ArangoGraph offers Graph Analytics Engines to run graph algorithms on your data separately from your ArangoDB deployments @@ -64,22 +64,22 @@ Single server deployments using ArangoDB version 3.11 are not supported. The [Management API](#management-api) for deploying and deleting engines requires an ArangoGraph **API key**. See -[Generating an API Key](../arangograph/api/get-started.md#generating-an-api-key) +[Generating an API Key](../../3.12/arangograph/api/get-started.md#generating-an-api-key) on how to create one. You then need to generate an **access token** using the API key. See -[Authenticating with Oasisctl](../arangograph/api/get-started.md#authenticating-with-oasisctl) +[Authenticating with Oasisctl](../../3.12/arangograph/api/get-started.md#authenticating-with-oasisctl) on how to do so using `oasisctl login`. The [Engine API](#engine-api) uses one of two authentication methods, depending -on the [__auto login to database UI__](../arangograph/deployments/_index.md#auto-login-to-database-ui) +on the [__auto login to database UI__](../../3.12/arangograph/deployments/_index.md#auto-login-to-database-ui) setting in ArangoGraph: - **Enabled**: You can use an ArangoGraph access token created with an API key (see above), allowing you to use one token for both the Management API and the Engine API. - **Disabled**: You need use a JWT user token created from ArangoDB credentials. These session tokens need to be renewed every hour by default. See - [HTTP API Authentication](../develop/http-api/authentication.md#jwt-user-tokens) + [HTTP API Authentication](../../3.12/develop/http-api/authentication.md#jwt-user-tokens) for details. ## Management API @@ -246,7 +246,7 @@ Request and response payloads are JSON-encoded in the engine API. Import graph data from a database of the ArangoDB deployment. You can import named graphs as well as sets of vertex and edge collections (see -[Managed and unmanaged graphs](../graphs/_index.md#managed-and-unmanaged-graphs)). +[Managed and unmanaged graphs](../../3.12/graphs/_index.md#managed-and-unmanaged-graphs)). ```bash curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d '{"database":"_system","graph_name":"connectedComponentsGraph"}' "$ENGINE_URL/v1/loaddata" diff --git a/site/content/3.12/graphs/graph-visualizer.md b/site/content/platform/graph-intelligence/graph-visualizer.md similarity index 99% rename from site/content/3.12/graphs/graph-visualizer.md rename to site/content/platform/graph-intelligence/graph-visualizer.md index f3125d6d4d..76d34e383d 100644 --- a/site/content/3.12/graphs/graph-visualizer.md +++ b/site/content/platform/graph-intelligence/graph-visualizer.md @@ -1,7 +1,7 @@ --- title: Graph Visualizer menuTitle: Graph Visualizer -weight: 102 +weight: 10 description: >- Visually explore and interact with your ArangoDB graphs through an intuitive interface --- @@ -24,7 +24,7 @@ create new nodes (vertices) and relations (edges). {{< info >}} Graph creation is **not** performed within the Graph Visualizer. Graphs must be created in the **Management** section under **Graphs** of the second-level -navigation in the [web interface](../components/web-interface/graphs.md). Once +navigation in the [web interface](../../3.12/components/web-interface/graphs.md). Once created, you can select a graph from the list for exploration and visualization. {{< /info >}} diff --git a/site/content/3.12/release-notes/platform.md b/site/content/platform/release-notes.md similarity index 82% rename from site/content/3.12/release-notes/platform.md rename to site/content/platform/release-notes.md index 84ecec3536..22e37bf1ee 100644 --- a/site/content/3.12/release-notes/platform.md +++ b/site/content/platform/release-notes.md @@ -1,7 +1,7 @@ --- title: What's new in the ArangoDB Platform -menuTitle: ArangoDB Platform -weight: 5 +menuTitle: Release notes +weight: 50 description: >- Features and improvements in the ArangoDB Platform --- @@ -20,7 +20,7 @@ of the core ArangoDB database system along with graph-powered machine learning and GenAI capabilities as a single solution with a unified interface. Deploy the Platform on-premise or in the cloud on top of Kubernetes. -To get started, see [Self-host the ArangoDB Platform](../components/platform.md#self-host-the-arangodb-platform). +To get started, see [Self-host the ArangoDB Platform](about-the-platform/_index.md#self-host-the-arangodb-platform). ### GenAI Suite @@ -35,5 +35,5 @@ user-friendly interface seamlessly integrated into the ArangoDB Platform web int - MLflow integration - Graph Visualizer -To learn more, see the [GenAI Suite](../data-science/_index.md#genai-suite) +To learn more, see the [GenAI Suite](data-science/_index.md#genai-suite) documentation. diff --git a/site/data/versions.yaml b/site/data/versions.yaml index f58386be72..f3da90f719 100644 --- a/site/data/versions.yaml +++ b/site/data/versions.yaml @@ -1,3 +1,8 @@ +- name: "platform" + version: "0.1.0" + alias: "platform" + deprecated: false + - name: "3.13" version: "3.13.0" alias: "devel" diff --git a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html index add77a0252..520418c334 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html @@ -6,7 +6,9 @@ {{- $page.Store.Set "versionShort" $version.name }} {{- $page.Store.Set "alias" $version.alias }} {{- $page.Store.Set "deprecated" $version.deprecated }} - {{- template "checkVersionIsInDevelopment" dict "page" $page "pageVersion" $version.name "versions" $versions }} + {{- if ne $version.name "platform" }} + {{- template "checkVersionIsInDevelopment" dict "page" $page "pageVersion" $version.name "versions" $versions }} + {{- end }} {{- end }} {{- end }} diff --git a/toolchain/arangoproxy/internal/service/service.go b/toolchain/arangoproxy/internal/service/service.go index b9f3b6caab..6f525ca79c 100644 --- a/toolchain/arangoproxy/internal/service/service.go +++ b/toolchain/arangoproxy/internal/service/service.go @@ -226,6 +226,9 @@ func (service OpenapiService) ValidateOpenapiGlobalSpec() { models.Logger.Summary("

OPENAPI

") for _, version := range Versions { + if version.Name == "platform" { + continue + } wg.Add(1) go service.ValidateFile(version.Name, &wg) } From 55dfbbf3bb1467e04058bab1b2695ac38f621f2e Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Fri, 8 Aug 2025 14:45:17 +0200 Subject: [PATCH 02/44] WIP: Don't attempt to navigate to path but different version between Platform and Core docs --- site/themes/arangodb-docs-theme/static/js/theme.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/site/themes/arangodb-docs-theme/static/js/theme.js b/site/themes/arangodb-docs-theme/static/js/theme.js index cf6e186757..208f8e9d66 100644 --- a/site/themes/arangodb-docs-theme/static/js/theme.js +++ b/site/themes/arangodb-docs-theme/static/js/theme.js @@ -466,8 +466,13 @@ function changeVersion() { changeVersion(); } - - var newUrl = window.location.pathname.replace(getVersionFromURL(), getVersionInfo(newVersion).alias) + window.location.hash; + var currentVersion = getVersionFromURL(); + var newVersionAlias = getVersionInfo(newVersion).alias; + if (currentVersion == "platform" || newVersion == "platform") { + var newUrl = window.location.pathname = "/" + newVersionAlias + "/"; + } else { + var newUrl = window.location.pathname.replace(currentVersion, newVersionAlias) + window.location.hash; + } updateHistory(newUrl); } From d7a9917e98d35c3710ffe4f73357fc9c12c2a036 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Thu, 4 Sep 2025 14:26:11 +0200 Subject: [PATCH 03/44] WIP: Navigation --- site/config/_default/config.yaml | 6 + .../layouts/_default/home.navigation.html | 13 +- .../layouts/partials/meta.html | 6 - .../layouts/partials/shortcodes/version.html | 3 +- .../layouts/partials/version-selector.html | 4 + .../arangodb-docs-theme/static/js/theme.js | 448 ++++++++++++------ 6 files changed, 314 insertions(+), 166 deletions(-) diff --git a/site/config/_default/config.yaml b/site/config/_default/config.yaml index 67c2321b61..e2b7760a81 100644 --- a/site/config/_default/config.yaml +++ b/site/config/_default/config.yaml @@ -19,6 +19,12 @@ module: - source: "static" target: "static" + - source: content/3.12 + target: content/stable + + - source: content/3.13 + target: content/devel + # Version folders can be ignored temporarily for faster local builds # of a single version (here: 3.12) # - excludeFiles: diff --git a/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html b/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html index a1ca735f4d..55ad423ade 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html @@ -3,14 +3,11 @@
    - {{- range .Site.Sections.ByWeight }} - {{/* version folders */}} - {{- if ne .Type "hooks" }} -
      {{/* TODO: hide non-stable versions by default? */}} - {{- template "section-tree-nav" . }} -
    - {{- end }} - {{- end }} + {{- range .Site.Sections.ByWeight }} +
      {{/* TODO: hide non-stable versions by default? */}} + {{- template "section-tree-nav" . }} +
    + {{- end }}
diff --git a/site/themes/arangodb-docs-theme/layouts/partials/meta.html b/site/themes/arangodb-docs-theme/layouts/partials/meta.html index 67aadd8e32..0a1a0e646f 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/meta.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/meta.html @@ -25,9 +25,3 @@ {{- end }} {{- end }} -{{- if or (eq .Type "hooks") (.IsHome) }} - {{- $redirectPath := printf "/%s" (index (where site.Data.versions "alias" "stable") 0).alias }} - -{{- end }} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html index 520418c334..c82297d40e 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html @@ -1,7 +1,7 @@ {{- $page := .page }} {{- $versions := site.Data.versions }} {{- range $i, $version := $versions }} - {{- if eq $page.Type $version.name }} + {{- if or (eq $page.Type $version.name) (eq $page.Type $version.alias) }} {{- $page.Store.Set "version" $version.version }} {{- $page.Store.Set "versionShort" $version.name }} {{- $page.Store.Set "alias" $version.alias }} @@ -9,6 +9,7 @@ {{- if ne $version.name "platform" }} {{- template "checkVersionIsInDevelopment" dict "page" $page "pageVersion" $version.name "versions" $versions }} {{- end }} + {{- break }} {{- end }} {{- end }} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html index 71a3db016c..918cbf161c 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html @@ -2,6 +2,10 @@ diff --git a/site/themes/arangodb-docs-theme/static/js/theme.js b/site/themes/arangodb-docs-theme/static/js/theme.js index da7da401c2..5efc2c16a2 100644 --- a/site/themes/arangodb-docs-theme/static/js/theme.js +++ b/site/themes/arangodb-docs-theme/static/js/theme.js @@ -9,7 +9,16 @@ function toggleMenuItem(event) { if (listItem.classList.contains("leaf")) return; listItem.querySelector("label").classList.toggle("open"); - $(listItem.querySelector(".submenu")).slideToggle(); + slideToggle(listItem.querySelector(".submenu")); +} + +// Vanilla JS slideToggle implementation +function slideToggle(element) { + if (element.style.display === "none" || element.style.display === "") { + element.style.display = "block"; + } else { + element.style.display = "none"; + } } function menuToggleClick(event) { @@ -18,21 +27,17 @@ function menuToggleClick(event) { toggleMenuItem(event); } -function menuEntryClickListener() { - $('.menu-link').on("click", function(event) { - event.preventDefault(); - if (event.target.pathname == window.location.pathname) { - toggleMenuItem(event) - return - } - updateHistory(event.target.getAttribute('href')) - $('.sidebar.mobile').removeClass("active") +function renderVersion() { + var version = getVersionFromURL(); - }); -} + var versionSelector = document.querySelector(".arangodb-version"); + if (!version || version === "platform") { + versionSelector.style.display = "none"; + } else { + versionSelector.style.display = "block"; + } -function renderVersion() { - var version = localStorage.getItem('docs-version'); + version = "version-" + version.replace('.', '_'); var menuEntry = document.getElementsByClassName('version-menu'); for ( let entry of menuEntry ) { if (entry.classList.contains(version)) { @@ -44,38 +49,74 @@ function renderVersion() { } function closeAllEntries() { - $(".dd-item.active").removeClass("active"); - $(".dd-item > label.open").removeClass("open"); - $(".submenu").hide(); - $(".dd-item.parent").removeClass("parent"); + document.querySelectorAll(".dd-item.active").forEach(el => el.classList.remove("active")); + document.querySelectorAll(".dd-item > label.open").forEach(el => el.classList.remove("open")); + document.querySelectorAll(".submenu").forEach(el => el.style.display = "none"); + document.querySelectorAll(".dd-item.parent").forEach(el => el.classList.remove("parent")); } function loadMenu(url) { closeAllEntries(); var version = getVersionFromURL() - $('.version-menu.'+version).find('a').each(function() { - $(this).attr("href", function(index, old) { - return old.replace(old.split("/")[1], version) - }); + document.querySelectorAll('.version-menu.version-' + version.replace('.', '_') + ' a').forEach(function(link) { + const oldHref = link.getAttribute('href'); + const newHref = oldHref.replace(oldHref.split("/")[1], version); + link.setAttribute('href', newHref); }); - var current = $('.dd-item > a[href="' + url + '"]').parent(); - current.addClass("active"); - while (current.length > 0 && current.prop("class") != "topics collapsible-menu") { - if (current.prop("tagName") == "LI") { - current.addClass("parent"); - current.children("label:first").addClass("open"); - current.children(".submenu:first").show(); + // Try to find the menu item - first try exact match, then try without hash + console.log('loadMenu: Looking for URL:', url); + var current = document.querySelector('.dd-item > a[href="' + url + '"]'); + console.log('loadMenu: Exact match found:', current); + + if (!current && url.includes('#')) { + // Try without the hash fragment + const urlWithoutHash = url.split('#')[0]; + console.log('loadMenu: Trying without hash:', urlWithoutHash); + current = document.querySelector('.dd-item > a[href="' + urlWithoutHash + '"]'); + console.log('loadMenu: Without hash found:', current); + } + if (!current) { + // Try to find by pathname only (in case of different origins or protocols) + const pathname = new URL(url, window.location.origin).pathname; + console.log('loadMenu: Trying pathname only:', pathname); + current = document.querySelector('.dd-item > a[href="' + pathname + '"]'); + console.log('loadMenu: Pathname match found:', current); + } + + if (current) { + console.log('loadMenu: Found menu item, expanding parents'); + current = current.parentNode; + current.classList.add("active"); + let expandedCount = 0; + while (current && !current.classList.contains("topics") && !current.classList.contains("collapsible-menu")) { + if (current.tagName === "LI") { + console.log('loadMenu: Expanding parent LI:', current); + current.classList.add("parent"); + const label = current.querySelector("label"); + if (label) { + label.classList.add("open"); + console.log('loadMenu: Added open class to label'); + } + const submenu = current.querySelector(".submenu"); + if (submenu) { + submenu.style.display = "block"; + expandedCount++; + console.log('loadMenu: Set submenu display to block, count:', expandedCount); + } + } + current = current.parentNode; } - - current = current.parent(); + console.log('loadMenu: Total submenus expanded:', expandedCount); + } else { + console.log('loadMenu: No menu item found for URL:', url); } } function showSidebarHandler() { - $(".sidebar").toggleClass("active"); - } + document.querySelectorAll(".sidebar").forEach(el => el.classList.toggle("active")); +} /* @@ -96,6 +137,16 @@ function replaceArticle(href, newDoc) { var re = /(.*?)<\/title>/; var match = re.exec(newDoc); + /* TODO: Replace with DOMParser? + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newDoc; + const newContainer = tempDiv.querySelector(".container-main"); + const currentContainer = document.querySelector(".container-main"); + + if (newContainer && currentContainer) { + currentContainer.parentNode.replaceChild(newContainer, currentContainer); + } + */ $(".container-main").replaceWith($(".container-main", newDoc)); if (match) { document.title = decodeHtmlEntities(match[1]); @@ -108,7 +159,7 @@ function replaceArticle(href, newDoc) { function updateHistory(urlPath) { - if (urlPath == window.location.pathname + window.location.hash) { + if (!urlPath || urlPath == window.location.pathname + window.location.hash) { return } @@ -131,21 +182,22 @@ function styleImages() { } function loadNotFoundPage() { - $.get({ - url: window.location.origin + "/notfound.html", - success: function(newDoc) { + fetch(window.location.origin + "/notfound.html") + .then(response => response.text()) + .then(newDoc => { replaceArticle("", newDoc) initArticle(""); return true; - }, - }); + }) + .catch(error => console.error('Error loading not found page:', error)); } function loadPage(target) { var href = target; - if (getVersionInfo(getVersionFromURL()) == undefined) { + var versionUrl = getVersionFromURL(); + if (versionUrl !== "platform" && getVersionInfo(versionUrl) == undefined) { loadNotFoundPage(); return; } @@ -155,15 +207,16 @@ function loadPage(target) { loadMenu(new URL(href).pathname); var version = getVersionInfo(getVersionFromURL()).name; href = href.replace(getVersionFromURL(), version); - var xhr = new XMLHttpRequest(); - $.get({ - xhr: function() { return xhr; }, - url: href, - success: function(newDoc) { - if (xhr.responseURL && href.replace(/#.*/, "") !== xhr.responseURL) { - updateHistory(xhr.responseURL.replace(version, getVersionFromURL())); + fetch(href) + .then(response => { + if (response.url && href.replace(/#.*/, "") !== response.url) { + updateHistory(response.url.replace(version, getVersionFromURL())); return; } + return response.text(); + }) + .then(newDoc => { + if (!newDoc) return; if (!newDoc.includes("<body>")) { // https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/alias.html var match = /<title>(.*?)<\/title>/.exec(newDoc)[1]; @@ -174,35 +227,10 @@ function loadPage(target) { scrollToFragment(); initArticle(href); return true; - }, - error: function(newDoc) { + }) + .catch(error => { loadNotFoundPage(href) - }, - }); -} - -function internalLinkListener() { - $('.link').on("click", function(event) { - if (event.target.getAttribute("target")) { - // external link - return; - } - event.preventDefault(); - updateHistory(event.target.getAttribute('href')) - }); - - $('.card-link').on('click', function(event) { - event.preventDefault(); - updateHistory(this.getAttribute('href')) - }); -} - -function codeShowMoreListener() { - $('article').on('click', '.code-show-more', function(event) { - var t = $(event.target) - t.toggleClass("expanded") - t.prev().toggleClass("expanded") - }); + }); } function trackPageView(title, urlPath) { @@ -222,25 +250,24 @@ function initArticle(url) { restoreTabSelections(); initCopyToClipboard(); addShowMoreButton('article'); - initClickHandlers(); + hideEmptyOpenapiDiv(); goToTop(); styleImages(); - internalLinkListener(); - codeShowMoreListener(); - aliazeLinks('article', 'a.link:not([target]), a.card-link, a.header-link'); - aliazeLinks('.breadcrumbs', 'a') + //aliazeLinks('article', 'a.link:not([target]), a.card-link, a.header-link'); + //aliazeLinks('.breadcrumbs', 'a') + linkToVersionedContent(); } -$(window).on('popstate', function (e) { - var state = e.originalEvent.state; +window.addEventListener('popstate', function (e) { + var state = e.state; if (state !== null) { loadPage(window.location.href); } }); -$(window).on('hashchange', function (e) { +window.addEventListener('hashchange', function (e) { window.history.pushState("popstate", "ArangoDB Documentation", window.location.href); scrollToFragment() }); @@ -273,7 +300,7 @@ function tocHiglighter() { if (window.innerWidth <= 768) return; var anchors = getAllAnchors(); - var scrollTop = $(document).scrollTop(); + var scrollTop = window.pageYOffset || document.documentElement.scrollTop; anchors.forEach(anchor => { const rect = anchor.getBoundingClientRect(); @@ -303,7 +330,7 @@ function throttle(callback, limit) { } } -$(window).scroll(throttle(function() { +window.addEventListener('scroll', throttle(function() { tocHiglighter(); backToTopButton(); }, 250)); @@ -314,17 +341,28 @@ $(window).scroll(throttle(function() { */ function switchTab(tabGroup, tabId, event) { - var tabs = jQuery(".tab-panel").has("[data-tab-group='"+tabGroup+"'][data-tab-item='"+tabId+"']"); - var allTabItems = tabs.find("[data-tab-group='"+tabGroup+"']"); - var targetTabItems = tabs.find("[data-tab-group='"+tabGroup+"'][data-tab-item='"+tabId+"']"); + var tabs = document.querySelectorAll(".tab-panel"); + var allTabItems = []; + var targetTabItems = []; + + tabs.forEach(tab => { + const groupItems = tab.querySelectorAll("[data-tab-group='" + tabGroup + "']"); + const targetItems = tab.querySelectorAll("[data-tab-group='" + tabGroup + "'][data-tab-item='" + tabId + "']"); + if (targetItems.length > 0) { + allTabItems.push(...groupItems); + targetTabItems.push(...targetItems); + } + }); + if (event) { var clickedTab = event.target; var topBefore = clickedTab.getBoundingClientRect().top; } - allTabItems.removeClass("selected"); - targetTabItems.addClass("selected"); - addShowMoreButton(targetTabItems); + allTabItems.forEach(item => item.classList.remove("selected")); + targetTabItems.forEach(item => item.classList.add("selected")); + targetTabItems.forEach(item => addShowMoreButton(item)); + if (event) { // Keep relative offset of tab in viewport to avoid jumping content var topAfter = clickedTab.getBoundingClientRect().top; @@ -394,15 +432,14 @@ function aliazeLinks(parentSelector, linkSelector) { nameAliasMapping[v.name] = v.alias; } - $(parentSelector).find(linkSelector).each(function() { - $(this).attr("href", function(index, old) { - if (old == undefined || old.startsWith("#")) return old; - let splitLink = old.split("/"); - let linkVersion = splitLink[1]; - let alias = nameAliasMapping[linkVersion] || linkVersion; - splitLink.splice(1, 1, alias); - return splitLink.join("/"); - }); + document.querySelectorAll(parentSelector + ' ' + linkSelector).forEach(function(link) { + const old = link.getAttribute("href"); + if (old == undefined || old.startsWith("#")) return; + let splitLink = old.split("/"); + let linkVersion = splitLink[1]; + let alias = nameAliasMapping[linkVersion] || linkVersion; + splitLink.splice(1, 1, alias); + link.setAttribute("href", splitLink.join("/")); }); } @@ -414,45 +451,44 @@ function setVersionSelector(version) { } } -function getCurrentVersion() { - var urlVersion = stableVersion.name +function getCurrentVersion(href) { + var newVersion = stableVersion.name if (window.location.pathname.split("/").length > 0) { - newVersion = getVersionFromURL() - - if (getVersionInfo(newVersion) == undefined) { + newVersion = getVersionFromURL(); + if (newVersion === "platform") { + return; + } + if ((href === "" || href === "/") && getVersionInfo(newVersion) == undefined) { loadNotFoundPage(); return; } - - urlVersion = getVersionInfo(newVersion).name } - localStorage.setItem('docs-version', urlVersion); - setVersionSelector(urlVersion); + localStorage.setItem('docs-version', newVersion); + setVersionSelector(newVersion); } function changeVersion() { - var oldVersion = localStorage.getItem('docs-version'); var versionSelector = document.querySelector(".arangodb-version"); - var newVersion = versionSelector.options[versionSelector.selectedIndex].value; + var newVersion = versionSelector.options[versionSelector.selectedIndex].value; try { - localStorage.setItem('docs-version', newVersion); - renderVersion(); - window.setupDocSearch(newVersion); + localStorage.setItem('docs-version', newVersion); + renderVersion(); + window.setupDocSearch(newVersion); } catch(exception) { console.log({exception}) - changeVersion(); + changeVersion(); } var currentVersion = getVersionFromURL(); - var newVersionAlias = getVersionInfo(newVersion).alias; + //var newVersionAlias = getVersionInfo(newVersion).alias; if (currentVersion == "platform" || newVersion == "platform") { - var newUrl = window.location.pathname = "/" + newVersionAlias + "/"; + var newUrl = window.location.pathname = "/" + newVersion + "/"; } else { - var newUrl = window.location.pathname.replace(currentVersion, newVersionAlias) + window.location.hash; + var newUrl = window.location.pathname.replace(currentVersion, newVersion) + window.location.hash; } updateHistory(newUrl); } @@ -466,8 +502,9 @@ function changeVersion() { function hideEmptyOpenapiDiv() { var lists = document.getElementsByClassName("openapi-parameters") for (let list of lists) { - if ($(list).find(".openapi-table").text().trim() == "") { - $(list).addClass("hidden"); + const table = list.querySelector(".openapi-table"); + if (table && table.textContent.trim() == "") { + list.classList.add("hidden"); } } } @@ -492,23 +529,6 @@ function hideEmptyOpenapiDiv() { } } -function initClickHandlers() { - hideEmptyOpenapiDiv(); - - $(".openapi-prop").on("click", function(event) { - if (this === event.target) { - $(event.target).toggleClass("collapsed"); - $(event.target).find('.openapi-prop-content').first().toggleClass("hidden"); - } - }); - - $(".openapi-table.show-children").on("click", function(event) { - $(event.target).toggleClass("collapsed"); - $(event.target).next(".openapi-table").toggleClass("hidden"); - }); - -} - /* Common custom functions @@ -548,17 +568,144 @@ function copyURI(evt) { } function toggleExpandShortcode(event) { - var t = $(event.target.closest("a")); - if (t.parent('.expand-expanded.expand-marked').length) { - t.next().css('display','none'); - } else if (t.parent('.expand-marked').length) { - t.next().css('display','block') + var t = event.target.closest("a"); + var parent = t.parentNode; + if (parent.classList.contains('expand-expanded') && parent.classList.contains('expand-marked')) { + t.nextElementSibling.style.display = 'none'; + } else if (parent.classList.contains('expand-marked')) { + t.nextElementSibling.style.display = 'block'; } else { - t.next('.expand-content').slideToggle(100); + const nextElement = t.querySelector('.expand-content') || t.nextElementSibling; + if (nextElement) { + slideToggle(nextElement); + } } - t.parent().toggleClass('expand-expanded'); + parent.classList.toggle('expand-expanded'); } +function linkToVersionedContent() { + const currentVersion = getVersionFromURL(); + if (currentVersion !== "platform") return; + document.querySelectorAll("a.link:not([target])").forEach(el => { + const matches = el.getAttribute("href").match(/^\/(\d\.\d{1,2})(\/.*)/); + const previousVersion = localStorage.getItem('docs-version') || "stable"; + if (matches && matches.length > 2 && previousVersion) { + el.setAttribute("href", "/" + previousVersion + matches[2]); + } + }); +} + +// Central click handler using event delegation +function handleDocumentClick(event) { + const target = event.target; + const closest = (selector) => target.closest(selector); + + // Menu link clicks + if (closest('.menu-link')) { + event.preventDefault(); + const menuLink = closest('.menu-link'); + const href = menuLink.getAttribute('href'); + if (href) { + updateHistory(href); + } + document.querySelectorAll('.sidebar.mobile').forEach(el => el.classList.remove("active")); + return; + } + + // Internal link clicks (.link) + const linkElement = closest('.link'); + if (linkElement && !linkElement.getAttribute("target")) { + event.preventDefault(); + let href = linkElement.getAttribute('href'); + if (href) { + updateHistory(href); + } + return; + } + + // Card link clicks + if (closest('.card-link')) { + event.preventDefault(); + const cardLink = closest('.card-link'); + const href = cardLink.getAttribute('href'); + if (href) { + updateHistory(href); + } + return; + } + + // Code show more button clicks + if (closest('.code-show-more')) { + target.classList.toggle("expanded"); + const prevElement = target.previousElementSibling; + if (prevElement) prevElement.classList.toggle("expanded"); + return; + } + + // OpenAPI property clicks + if (closest('.openapi-prop') && target === closest('.openapi-prop')) { + target.classList.toggle("collapsed"); + const content = target.querySelector('.openapi-prop-content'); + if (content) content.classList.toggle("hidden"); + return; + } + + // OpenAPI table show children clicks + if (closest('.openapi-table.show-children')) { + target.classList.toggle("collapsed"); + const nextTable = target.nextElementSibling; + if (nextTable && nextTable.classList.contains('openapi-table')) { + nextTable.classList.toggle("hidden"); + } + return; + } + + // Menu toggle clicks (labels) + if (target.tagName === "LABEL" && closest('.sidebar')) { + event.preventDefault(); + toggleMenuItem(event); + return; + } + + // Tab clicks + if (target.hasAttribute('data-tab-group') && target.hasAttribute('data-tab-item')) { + event.preventDefault(); + switchTab(target.getAttribute('data-tab-group'), target.getAttribute('data-tab-item'), event); + return; + } + + // Back to top button + if (closest('.back-to-top')) { + event.preventDefault(); + goToTop(event); + return; + } + + // Copy URI clicks + if (closest('.header-link')) { + copyURI(event); + return; + } + + // Expand shortcode clicks + if (closest('.expand-label')) { + event.preventDefault(); + toggleExpandShortcode(event); + return; + } + + // Homepage clicks + if (closest('.home-link')) { + goToHomepage(event); + return; + } + + // Sidebar toggle + if (closest('.sidebar-toggle')) { + showSidebarHandler(); + return; + } +} window.onload = () => { window.history.pushState("popstate", "ArangoDB Documentation", window.location.href); @@ -571,7 +718,6 @@ window.onload = () => { iframe.replaceWith(content); getCurrentVersion(window.location.href); - menuEntryClickListener(); renderVersion(); loadPage(window.location.href) @@ -579,17 +725,17 @@ window.onload = () => { window.setupDocSearch(getVersionInfo(getVersionFromURL()).name); } else { window.setupDocSearch(stableVersion); - } - content.addEventListener("click", menuToggleClick); - + // Add central click handler to document + document.addEventListener("click", handleDocumentClick); var isMobile = window.innerWidth <= 768; if (isMobile) { - $('.sidebar').addClass("mobile"); - $('.sidebar.mobile').removeClass("active"); + document.querySelectorAll('.sidebar').forEach(el => el.classList.add("mobile")); + document.querySelectorAll('.sidebar.mobile').forEach(el => el.classList.remove("active")); } - $('.page-wrapper').css("opacity", "1") + const pageWrapper = document.querySelector('.page-wrapper'); + if (pageWrapper) pageWrapper.style.opacity = "1"; } \ No newline at end of file From 1085cbdb904d77e14e32b9f3f81aa64b933c0cf6 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 4 Sep 2025 14:26:32 +0200 Subject: [PATCH 04/44] Fix link --- site/content/platform/graph-intelligence/graph-analytics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/content/platform/graph-intelligence/graph-analytics.md b/site/content/platform/graph-intelligence/graph-analytics.md index a3d013b046..2c273b0c38 100644 --- a/site/content/platform/graph-intelligence/graph-analytics.md +++ b/site/content/platform/graph-intelligence/graph-analytics.md @@ -19,7 +19,7 @@ and network flow analysis. ArangoDB offers a feature for running algorithms on your graph data, called Graph Analytics Engines (GAEs). It is available on request for the [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) -and included in the [ArangoDB Platform](../components/platform.md). +and included in the [ArangoDB Platform](../about-the-platform/_index.md). Key features: From 599f2ceb2f8ad55a044bdf692539cb3e813d2a80 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 4 Sep 2025 14:26:42 +0200 Subject: [PATCH 05/44] Test: Links between Platform and Core --- site/content/3.12/aql/_index.md | 2 ++ site/content/3.13/aql/_index.md | 2 ++ site/content/platform/data-science/_index.md | 2 ++ 3 files changed, 6 insertions(+) diff --git a/site/content/3.12/aql/_index.md b/site/content/3.12/aql/_index.md index 688215f3dc..befe676097 100644 --- a/site/content/3.12/aql/_index.md +++ b/site/content/3.12/aql/_index.md @@ -6,6 +6,8 @@ description: >- The ArangoDB Query Language (AQL) lets you store, retrieve, and modify data in various ways in ArangoDB --- +- [Link to Platform](../../platform/data-science/_index.md) + AQL is mainly a declarative language, meaning that a query expresses what result should be achieved but not how it should be achieved. AQL aims to be human-readable and therefore uses keywords from the English language. Another diff --git a/site/content/3.13/aql/_index.md b/site/content/3.13/aql/_index.md index 688215f3dc..befe676097 100644 --- a/site/content/3.13/aql/_index.md +++ b/site/content/3.13/aql/_index.md @@ -6,6 +6,8 @@ description: >- The ArangoDB Query Language (AQL) lets you store, retrieve, and modify data in various ways in ArangoDB --- +- [Link to Platform](../../platform/data-science/_index.md) + AQL is mainly a declarative language, meaning that a query expresses what result should be achieved but not how it should be achieved. AQL aims to be human-readable and therefore uses keywords from the English language. Another diff --git a/site/content/platform/data-science/_index.md b/site/content/platform/data-science/_index.md index ec24ec73ea..485687e4d7 100644 --- a/site/content/platform/data-science/_index.md +++ b/site/content/platform/data-science/_index.md @@ -8,6 +8,8 @@ description: >- aliases: - data-science/overview --- +- [Link to 3.12](../../3.12/aql/_index.md) + {{< tag "ArangoDB Platform" >}} {{< tip >}} From 4237c0c4d9757acf95ee81fe6699bc0263cdae98 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 4 Sep 2025 15:40:57 +0200 Subject: [PATCH 06/44] Try to exclude aliases in link check --- .../layouts/_default/_markup/render-link.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html b/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html index 74b4be1301..70df3678d4 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html @@ -41,7 +41,7 @@ {{- end }} {{- $permalink = printf "%s%s" $page.RelPermalink $fragment }} {{- else }} - {{- if ne $currentPage "/" }} + {{- if and (ne $currentPage "/") (not (or (strings.HasPrefix $currentPage "/stable/") (strings.HasPrefix $currentPage "/devel/"))) }} {{- if site.Params.failOnBrokenLinks }} {{- errorf "<error code=1> Broken link '%v' found in %s </error><br>" $link $currentFile }} {{- else }} From 0fb6d21a76e40136cd95ea03f2f7d2e66a717f37 Mon Sep 17 00:00:00 2001 From: Palash Karia <2976363+palashkaria@users.noreply.github.com> Date: Thu, 2 Oct 2025 15:41:17 +0530 Subject: [PATCH 07/44] chore: update greens/reds --- .../arangodb-docs-theme/static/css/theme.css | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index 09be3245c1..a90a85fe9a 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -1,25 +1,25 @@ :root { - --green-50: #f5faeb; - --green-100: #e9f4d3; - --green-200: #d5e9ad; - --green-300: #b8da7c; - --green-400: #9dc853; - --green-500: #7ead35; - --green-600: #608726; - --green-700: #4b6922; - --green-800: #3e5420; - --green-900: #35481f; + --green-50: #e3f2e0; + --green-100: #dcebd9; + --green-200: #98D78C; + --green-300: #55AB45; + --green-400: #217846; + --green-500: #007339; + --green-600: #006532; + --green-700: #005329; + --green-800: #004020; + --green-900: #002e17; --green-950: #1a270c; - --red-50: #fff2f1; - --red-100: #ffe1df; - --red-200: #ffc7c4; - --red-300: #ffa19b; - --red-400: #ff6a61; - --red-500: #ff3b30; - --red-600: #e6190d; - --red-700: #cc1409; - --red-800: #a8150c; - --red-900: #8b1811; + --red-50: #f8c5c6; + --red-100: #f5acae; + --red-200: #f18b8e; + --red-300: #ed6a6e; + --red-400: #e9494d; + --red-500: #e63035; + --red-600: #da1a20; + --red-700: #b3161a; + --red-800: #8b1114; + --red-900: #630c0e; --red-950: #4c0703; --orange-50: #fff4ed; --orange-100: #ffe6d5; From 549bb30a08ae945f13ba95d1b54edc3d204d7c17 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 12:21:39 +0200 Subject: [PATCH 08/44] Hugo config: Temporarily disable aliases and exclude legacy versions --- site/config/_default/config.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/site/config/_default/config.yaml b/site/config/_default/config.yaml index e2b7760a81..0a7d2c1541 100644 --- a/site/config/_default/config.yaml +++ b/site/config/_default/config.yaml @@ -19,20 +19,20 @@ module: - source: "static" target: "static" - - source: content/3.12 - target: content/stable +# - source: content/arangodb/3.12 +# target: content/arangodb/stable - - source: content/3.13 - target: content/devel +# - source: content/arangodb/3.13 +# target: content/arangodb/devel # Version folders can be ignored temporarily for faster local builds # of a single version (here: 3.12) -# - excludeFiles: -# - 3.10/* -# - 3.11/* -# - 3.13/* -# source: content -# target: content + - source: content + target: content + excludeFiles: + - arangodb/3.10/* + - arangodb/3.11/* +# - arangodb/3.13/* markup: highlight: From c643c101a034c83b78507334b3da09f2d66e3929 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 12:24:49 +0200 Subject: [PATCH 09/44] Preliminary support for versioned subfolders --- site/data/versions.yaml | 37 ++++---- .../layouts/partials/breadcrumbs.html | 16 ++-- .../layouts/partials/javascript.html | 2 +- .../layouts/partials/meta.html | 4 +- .../layouts/partials/shortcodes/version.html | 23 ++--- .../layouts/partials/version-selector.html | 4 +- .../layouts/shortcodes/card.html | 2 +- .../layouts/shortcodes/full-version.html | 2 +- .../arangoproxy/internal/models/version.go | 4 +- .../arangoproxy/internal/service/service.go | 87 ++++++++++--------- 10 files changed, 95 insertions(+), 86 deletions(-) diff --git a/site/data/versions.yaml b/site/data/versions.yaml index f3da90f719..d8f36acdb9 100644 --- a/site/data/versions.yaml +++ b/site/data/versions.yaml @@ -1,24 +1,21 @@ -- name: "platform" - version: "0.1.0" - alias: "platform" - deprecated: false +/arangodb/: -- name: "3.13" - version: "3.13.0" - alias: "devel" - deprecated: false + - name: "3.13" + version: "3.13.0" + alias: "devel" + deprecated: false -- name: "3.12" - version: "3.12.5" - alias: "stable" - deprecated: false + - name: "3.12" + version: "3.12.5" + alias: "stable" + deprecated: false -- name: "3.11" - version: "3.11.14" - alias: "3.11" - deprecated: true + - name: "3.11" + version: "3.11.14" + alias: "3.11" + deprecated: true -- name: "3.10" - version: "3.10.14" - alias: "3.10" - deprecated: true + - name: "3.10" + version: "3.10.14" + alias: "3.10" + deprecated: true diff --git a/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html b/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html index 7e4d6f9eb7..cc19ff682d 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html @@ -7,8 +7,9 @@ <meta itemprop="position" content="{{ .Params.menuTitle | markdownify }}" /> <a itemprop="item" class="link" href="{{ .RelPermalink }}"> <span itemprop="name" class="breadcrumb-entry"> - {{ if eq (len .Ancestors) 1 -}} - {{ template "getVersionLong" dict "pageType" .Page.Type -}} + {{ if eq .Path "/arangodb/" -}} + {{ $coreVersion := index (split .Path "/") 2 }} + {{ template "getVersionLong" dict "coreVersion" $coreVersion -}} {{ else -}} {{ .Params.menuTitle | markdownify -}} {{ end -}} @@ -23,8 +24,9 @@ <meta itemprop="position" content="{{ .Params.menuTitle | markdownify }}" /> <a itemprop="item" class="link" href="{{ .RelPermalink }}"> <span itemprop="name" class="breadcrumb-entry"> - {{ if eq (len .Ancestors) 1 -}} - {{ template "getVersionLong" dict "pageType" .Page.Type -}} + {{ if eq .Path "/arangodb/" -}} + {{ $coreVersion := index (split .Path "/") 2 }} + {{ template "getVersionLong" dict "coreVersion" $coreVersion -}} {{ else -}} {{ .Params.menuTitle | markdownify -}} {{ end -}} @@ -36,10 +38,10 @@ </nav> {{ define "getVersionLong" -}} - {{ $pageType := .pageType -}} - {{ $versions := site.Data.versions -}} + {{ $coreVersion := .coreVersion -}} + {{ $versions := index site.Data.versions "/arangodb/" -}} {{ range $i, $version := $versions -}} - {{ if eq $pageType $version.name -}} + {{ if eq $coreVersion $version.name -}} {{ $version.version -}} {{ end -}} {{ end -}} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/javascript.html b/site/themes/arangodb-docs-theme/layouts/partials/javascript.html index 760d1179fb..b1cdae7133 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/javascript.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/javascript.html @@ -2,7 +2,7 @@ <script src="{{"js/clipboard.min.js" | relURL}}{{ if not .Site.Params.disableAssetsBusting }}?{{ now.Unix }}{{ end }}" defer></script> <script src="{{"js/featherlight.min.js" | relURL}}{{ if not .Site.Params.disableAssetsBusting }}?{{ now.Unix }}{{ end }}" defer></script> -{{ $versions := site.Data.versions -}} +{{ $versions := index site.Data.versions "/arangodb/" -}} <script> var versions = {{ $versions }} </script> diff --git a/site/themes/arangodb-docs-theme/layouts/partials/meta.html b/site/themes/arangodb-docs-theme/layouts/partials/meta.html index 0a1a0e646f..a94a868890 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/meta.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/meta.html @@ -17,9 +17,9 @@ {{- with $versionShort }} <meta name="docsearch:version" content="{{ . }}"> {{- end }} -{{- if .Page.IsHome }} +{{- if eq .Path "/arangodb/" }} {{- $shortVersions := slice }} - {{- $versions := site.Data.versions }} + {{- $versions := index site.Data.versions "/arangodb/" }} {{- range $version := $versions }} {{- $shortVersions = $shortVersions | append $version.name }} {{- end }} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html index c82297d40e..3466579da1 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html @@ -1,15 +1,18 @@ {{- $page := .page }} -{{- $versions := site.Data.versions }} -{{- range $i, $version := $versions }} - {{- if or (eq $page.Type $version.name) (eq $page.Type $version.alias) }} - {{- $page.Store.Set "version" $version.version }} - {{- $page.Store.Set "versionShort" $version.name }} - {{- $page.Store.Set "alias" $version.alias }} - {{- $page.Store.Set "deprecated" $version.deprecated }} - {{- if ne $version.name "platform" }} - {{- template "checkVersionIsInDevelopment" dict "page" $page "pageVersion" $version.name "versions" $versions }} +{{- if hasPrefix $page.Path "/arangodb/" }} + {{- $versions := index site.Data.versions "/arangodb/" }} + {{- $coreVersion := index (split $page.Path "/") 2 }} + {{- range $i, $version := $versions }} + {{- if or (eq $coreVersion $version.name) (eq $coreVersion $version.alias) }} + {{- $page.Store.Set "version" $version.version }} + {{- $page.Store.Set "versionShort" $version.name }} + {{- $page.Store.Set "alias" $version.alias }} + {{- $page.Store.Set "deprecated" $version.deprecated }} + {{- if ne $version.name "platform" }} + {{- template "checkVersionIsInDevelopment" dict "page" $page "pageVersion" $version.name "versions" $versions }} + {{- end }} + {{- break }} {{- end }} - {{- break }} {{- end }} {{- end }} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html index 918cbf161c..059dc6eec9 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html @@ -1,8 +1,8 @@ <div class="version-selector"> <select class="arangodb-version" onchange="changeVersion();"> - {{ $versions := site.Data.versions }} + {{ $versions := index site.Data.versions "/arangodb/" }} {{ range $i, $version := $versions }} - {{ if eq $version.name "platform" }}{{ continue }}{{ end }} + {{/* if eq $version.name "platform" }}{{ continue }}{{ end */}} {{ if ne $version.name $version.alias }} <option value="{{ $version.alias }}">{{ $version.alias }}</option> {{ end }} diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/card.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/card.html index 715ea43acf..0fc929d810 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/card.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/card.html @@ -1,7 +1,7 @@ {{- $title := .Get "title" }} {{- $link := .Get "link" }} {{- $image := resources.GetMatch (printf "images/%s" ( .Get "icon" )) }} -{{- $versions := .Site.Data.versions }} +{{- $versions := index .Site.Data.versions "/arangodb/" }} {{- $stableVersion := (index (where $versions "alias" "stable") 0).name }} {{- /* TODO: Check if relative links are resolved in the context of the linking page */}} {{- partial "shortcodes/card.html" (dict diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html index 9e1f7961ed..20883b4ac0 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html @@ -1,5 +1,5 @@ {{ $ver := (.Get 0) -}} -{{- $versions := (where .Site.Data.versions "name" $ver) -}} +{{- $versions := (where (index .Site.Data.versions "/arangodb/") "name" $ver) -}} {{ if $versions -}} {{ (index $versions 0).version | htmlEscape -}} {{ else -}} diff --git a/toolchain/arangoproxy/internal/models/version.go b/toolchain/arangoproxy/internal/models/version.go index 7d6ddf7dfa..6b1383a397 100644 --- a/toolchain/arangoproxy/internal/models/version.go +++ b/toolchain/arangoproxy/internal/models/version.go @@ -13,8 +13,8 @@ type Version struct { Alias string `yaml:"alias,omitempty" json:"alias,omitempty"` } -func LoadVersions() []Version { - versions := []Version{} +func LoadVersions() map[string][]Version { + versions := map[string][]Version{} yamlFile, _ := os.ReadFile("/home/site/data/versions.yaml") yaml.Unmarshal(yamlFile, &versions) diff --git a/toolchain/arangoproxy/internal/service/service.go b/toolchain/arangoproxy/internal/service/service.go index 600bb90e60..fbda00d06b 100644 --- a/toolchain/arangoproxy/internal/service/service.go +++ b/toolchain/arangoproxy/internal/service/service.go @@ -136,50 +136,55 @@ type OpenapiService struct{} var OpenapiFormatter = format.OpenapiFormatter{} var OpenapiGlobalMap map[string]interface{} -var Versions []models.Version +var Versions map[string][]models.Version func init() { OpenapiGlobalMap = make(map[string]interface{}) Versions = models.LoadVersions() - for _, version := range Versions { - tags := []map[string]string{} - yamlFile, err := os.ReadFile("/home/site/data/openapi_tags.yaml") - if err != nil { - models.Logger.Printf("[ERROR] Opening openapi_tags file: %s", err.Error()) - os.Exit(1) + for key, versionList := range Versions { + if key != "/arangodb/" { + continue } + for _, version := range versionList { + tags := []map[string]string{} + yamlFile, err := os.ReadFile("/home/site/data/openapi_tags.yaml") + if err != nil { + models.Logger.Printf("[ERROR] Opening openapi_tags file: %s", err.Error()) + os.Exit(1) + } - yaml.Unmarshal(yamlFile, &tags) + yaml.Unmarshal(yamlFile, &tags) - // License of the exposed API (but we assume it is the same as the source code) - license := map[string]interface{}{ - "name": "Business Source License 1.1", - "url": "https://github.com/arangodb/arangodb/blob/devel/LICENSE", - } - if version.Name == "3.10" || version.Name == "3.11" { - license["name"] = "Apache 2.0" - license["url"] = fmt.Sprintf("https://github.com/arangodb/arangodb/blob/%s/LICENSE", version.Name) - } + // License of the exposed API (but we assume it is the same as the source code) + license := map[string]interface{}{ + "name": "Business Source License 1.1", + "url": "https://github.com/arangodb/arangodb/blob/devel/LICENSE", + } + if version.Name == "3.10" || version.Name == "3.11" { + license["name"] = "Apache 2.0" + license["url"] = fmt.Sprintf("https://github.com/arangodb/arangodb/blob/%s/LICENSE", version.Name) + } - OpenapiGlobalMap[version.Name] = map[string]interface{}{ - "openapi": "3.1.0", - "info": map[string]interface{}{ - "title": "ArangoDB Core API", - "summary": "The RESTful HTTP API of the ArangoDB Core Database System", - "version": version.Version, - "license": license, - "contact": map[string]interface{}{ - "name": "ArangoDB Inc.", - "url": "https://arangodb.com", + OpenapiGlobalMap[version.Name] = map[string]interface{}{ + "openapi": "3.1.0", + "info": map[string]interface{}{ + "title": "ArangoDB Core API", + "summary": "The RESTful HTTP API of the ArangoDB Core Database System", + "version": version.Version, + "license": license, + "contact": map[string]interface{}{ + "name": "ArangoDB Inc.", + "url": "https://arangodb.com", + }, }, - }, - "paths": make(map[string]interface{}), - "tags": tags, - "externalDocs": map[string]interface{}{ - "description": "ArangoDB Documentation", - "url": "https://docs.arangodb.com", - }, + "paths": make(map[string]interface{}), + "tags": tags, + "externalDocs": map[string]interface{}{ + "description": "ArangoDB Documentation", + "url": "https://docs.arangodb.com", + }, + } } } } @@ -223,15 +228,17 @@ func (service OpenapiService) ValidateOpenapiGlobalSpec() { var wg sync.WaitGroup models.Logger.Summary("<h2>OPENAPI</h2>") - for _, version := range Versions { - if version.Name == "platform" { + for key, versionList := range Versions { + if key != "/arangodb/" { continue } - wg.Add(1) - go service.ValidateFile(version.Name, &wg) - } + for _, version := range versionList { + wg.Add(1) + go service.ValidateFile(version.Name, &wg) + } - wg.Wait() + wg.Wait() + } } func (service OpenapiService) ValidateFile(version string, wg *sync.WaitGroup) error { From 29c47638cd175ec07671b4e15df54659cf42c57a Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 12:26:09 +0200 Subject: [PATCH 10/44] Content re-organization and product renaming --- README.md | 23 +- site/content/3.10/arangograph/_index.md | 38 - site/content/3.10/arangograph/api/_index.md | 37 - .../3.10/arangograph/api/get-started.md | 481 ---------- site/content/3.10/arangograph/backups.md | 172 ---- .../3.10/arangograph/data-loader/_index.md | 70 -- .../3.10/arangograph/data-loader/add-files.md | 59 -- .../arangograph/data-loader/design-graph.md | 68 -- .../3.10/arangograph/deployments/_index.md | 301 ------ .../deployments/private-endpoints.md | 221 ----- .../3.10/arangograph/migrate-to-the-cloud.md | 259 ------ .../arangograph/monitoring-and-metrics.md | 137 --- site/content/3.10/arangograph/my-account.md | 171 ---- site/content/3.10/arangograph/notebooks.md | 170 ---- .../3.10/arangograph/organizations/_index.md | 111 --- .../3.10/arangograph/organizations/billing.md | 36 - .../security-and-access-control/_index.md | 698 -------------- .../single-sign-on/_index.md | 94 -- .../single-sign-on/scim-provisioning.md | 76 -- .../x-509-certificates.md | 179 ---- .../data-science/arangograph-notebooks.md | 22 - .../3.11/arangograph/api/get-started.md | 481 ---------- .../arangograph/api/set-up-a-connection.md | 108 --- site/content/3.11/arangograph/backups.md | 172 ---- .../3.11/arangograph/data-loader/_index.md | 62 -- .../arangograph/data-loader/design-graph.md | 68 -- .../3.11/arangograph/data-loader/example.md | 103 -- .../3.11/arangograph/data-loader/import.md | 72 -- .../3.11/arangograph/deployments/_index.md | 301 ------ .../deployments/private-endpoints.md | 168 ---- .../deployments/upgrades-and-versioning.md | 92 -- .../arangograph/monitoring-and-metrics.md | 137 --- site/content/3.11/arangograph/my-account.md | 171 ---- site/content/3.11/arangograph/notebooks.md | 170 ---- .../3.11/arangograph/oasisctl/_index.md | 18 - .../arangograph/oasisctl/accept/_index.md | 29 - .../accept/accept-organization-invite.md | 30 - .../oasisctl/accept/accept-organization.md | 29 - .../3.11/arangograph/oasisctl/add/_index.md | 30 - .../oasisctl/add/add-auditlog-destination.md | 37 - .../arangograph/oasisctl/add/add-auditlog.md | 29 - .../oasisctl/add/add-group-members.md | 31 - .../arangograph/oasisctl/add/add-group.md | 29 - .../arangograph/oasisctl/auditlog/_index.md | 31 - .../oasisctl/auditlog/auditlog-attach.md | 31 - .../oasisctl/auditlog/auditlog-detach.md | 30 - .../auditlog/auditlog-get-attached-project.md | 30 - .../auditlog/auditlog-get-attached.md | 29 - .../oasisctl/auditlog/auditlog-get.md | 29 - .../arangograph/oasisctl/backup/_index.md | 30 - .../oasisctl/backup/backup-copy.md | 30 - .../oasisctl/backup/backup-download.md | 32 - .../3.11/arangograph/oasisctl/clone/_index.md | 29 - .../oasisctl/clone/clone-deployment-backup.md | 33 - .../oasisctl/clone/clone-deployment.md | 29 - .../3.11/arangograph/oasisctl/completion.md | 39 - .../arangograph/oasisctl/create/_index.md | 42 - .../oasisctl/create/create-apikey.md | 30 - .../oasisctl/create/create-auditlog.md | 32 - .../oasisctl/create/create-backup-policy.md | 50 - .../oasisctl/create/create-backup.md | 34 - .../oasisctl/create/create-cacertificate.md | 33 - .../oasisctl/create/create-deployment.md | 54 -- .../create/create-example-installation.md | 32 - .../oasisctl/create/create-example.md | 29 - .../oasisctl/create/create-group.md | 31 - .../oasisctl/create/create-ipallowlist.md | 34 - .../oasisctl/create/create-metrics-token.md | 34 - .../oasisctl/create/create-metrics.md | 29 - .../oasisctl/create/create-notebook.md | 35 - .../create/create-organization-invite.md | 30 - .../oasisctl/create/create-organization.md | 31 - .../create/create-private-endpoint-service.md | 38 - .../create/create-private-endpoint.md | 29 - .../oasisctl/create/create-private.md | 29 - .../oasisctl/create/create-project.md | 31 - .../oasisctl/create/create-role.md | 32 - .../arangograph/oasisctl/delete/_index.md | 41 - .../oasisctl/delete/delete-apikey.md | 29 - .../delete/delete-auditlog-archive-events.md | 30 - .../delete/delete-auditlog-archive.md | 30 - .../delete/delete-auditlog-destination.md | 33 - .../oasisctl/delete/delete-auditlog.md | 32 - .../oasisctl/delete/delete-backup-policy.md | 31 - .../oasisctl/delete/delete-backup.md | 30 - .../oasisctl/delete/delete-cacertificate.md | 31 - .../oasisctl/delete/delete-deployment.md | 31 - .../delete/delete-example-installation.md | 32 - .../oasisctl/delete/delete-example.md | 29 - .../oasisctl/delete/delete-group-members.md | 31 - .../oasisctl/delete/delete-group.md | 31 - .../oasisctl/delete/delete-ipallowlist.md | 31 - .../oasisctl/delete/delete-metrics-token.md | 32 - .../oasisctl/delete/delete-metrics.md | 29 - .../oasisctl/delete/delete-notebook.md | 29 - .../delete/delete-organization-invite.md | 30 - .../delete/delete-organization-members.md | 30 - .../oasisctl/delete/delete-organization.md | 31 - .../oasisctl/delete/delete-project.md | 30 - .../oasisctl/delete/delete-role.md | 30 - .../arangograph/oasisctl/disable/_index.md | 29 - ...isable-scheduled-root-password-rotation.md | 31 - .../arangograph/oasisctl/enable/_index.md | 29 - ...enable-scheduled-root-password-rotation.md | 31 - .../arangograph/oasisctl/generate-docs.md | 31 - .../3.11/arangograph/oasisctl/get/_index.md | 47 - .../oasisctl/get/get-auditlog-archive.md | 29 - .../oasisctl/get/get-auditlog-events.md | 35 - .../arangograph/oasisctl/get/get-auditlog.md | 32 - .../oasisctl/get/get-backup-policy.md | 29 - .../arangograph/oasisctl/get/get-backup.md | 30 - .../oasisctl/get/get-cacertificate.md | 31 - .../oasisctl/get/get-deployment.md | 32 - .../oasisctl/get/get-example-installation.md | 32 - .../arangograph/oasisctl/get/get-example.md | 30 - .../arangograph/oasisctl/get/get-group.md | 30 - .../oasisctl/get/get-ipallowlist.md | 31 - .../oasisctl/get/get-metrics-token.md | 32 - .../arangograph/oasisctl/get/get-metrics.md | 29 - .../arangograph/oasisctl/get/get-notebook.md | 29 - ...t-organization-authentication-providers.md | 29 - .../get/get-organization-authentication.md | 29 - ...-organization-email-domain-restrictions.md | 29 - .../get/get-organization-email-domain.md | 29 - .../oasisctl/get/get-organization-email.md | 29 - .../oasisctl/get/get-organization-invite.md | 30 - .../oasisctl/get/get-organization.md | 32 - .../arangograph/oasisctl/get/get-policy.md | 29 - .../get/get-private-endpoint-service.md | 31 - .../oasisctl/get/get-private-endpoint.md | 29 - .../arangograph/oasisctl/get/get-private.md | 29 - .../arangograph/oasisctl/get/get-project.md | 30 - .../arangograph/oasisctl/get/get-provider.md | 30 - .../arangograph/oasisctl/get/get-region.md | 31 - .../3.11/arangograph/oasisctl/get/get-role.md | 30 - .../3.11/arangograph/oasisctl/get/get-self.md | 28 - .../oasisctl/get/get-server-status.md | 31 - .../arangograph/oasisctl/get/get-server.md | 29 - .../arangograph/oasisctl/get/get-tandc.md | 30 - .../3.11/arangograph/oasisctl/import.md | 46 - .../3.11/arangograph/oasisctl/list/_index.md | 56 -- .../arangograph/oasisctl/list/list-apikeys.md | 28 - .../oasisctl/list/list-arangodb-versions.md | 29 - .../oasisctl/list/list-arangodb.md | 29 - .../oasisctl/list/list-auditlog-archives.md | 30 - .../list/list-auditlog-destinations.md | 30 - .../oasisctl/list/list-auditlog.md | 30 - .../oasisctl/list/list-auditlogs.md | 29 - .../oasisctl/list/list-backup-policies.md | 30 - .../arangograph/oasisctl/list/list-backup.md | 29 - .../arangograph/oasisctl/list/list-backups.md | 31 - .../oasisctl/list/list-cacertificates.md | 30 - .../oasisctl/list/list-cpusizes.md | 31 - .../oasisctl/list/list-deployments.md | 30 - .../oasisctl/list/list-diskperformances.md | 33 - .../list/list-effective-permissions.md | 29 - .../oasisctl/list/list-effective.md | 29 - .../list/list-example-installations.md | 31 - .../arangograph/oasisctl/list/list-example.md | 29 - .../oasisctl/list/list-examples.md | 29 - .../oasisctl/list/list-group-members.md | 30 - .../arangograph/oasisctl/list/list-group.md | 29 - .../arangograph/oasisctl/list/list-groups.md | 29 - .../oasisctl/list/list-ipallowlists.md | 30 - .../oasisctl/list/list-metrics-tokens.md | 31 - .../arangograph/oasisctl/list/list-metrics.md | 29 - .../oasisctl/list/list-nodesizes.md | 33 - .../oasisctl/list/list-notebookmodels.md | 31 - .../oasisctl/list/list-notebooks.md | 31 - .../list/list-organization-invites.md | 29 - .../list/list-organization-members.md | 29 - .../oasisctl/list/list-organization.md | 30 - .../oasisctl/list/list-organizations.md | 28 - .../oasisctl/list/list-permissions.md | 28 - .../oasisctl/list/list-projects.md | 29 - .../oasisctl/list/list-providers.md | 29 - .../arangograph/oasisctl/list/list-regions.md | 30 - .../arangograph/oasisctl/list/list-roles.md | 29 - .../arangograph/oasisctl/list/list-servers.md | 28 - .../3.11/arangograph/oasisctl/lock/_index.md | 34 - .../oasisctl/lock/lock-cacertificate.md | 31 - .../oasisctl/lock/lock-deployment.md | 31 - .../oasisctl/lock/lock-ipallowlist.md | 31 - .../oasisctl/lock/lock-organization.md | 29 - .../arangograph/oasisctl/lock/lock-policy.md | 29 - .../arangograph/oasisctl/lock/lock-project.md | 30 - .../3.11/arangograph/oasisctl/login.md | 36 - .../content/3.11/arangograph/oasisctl/logs.md | 35 - .../3.11/arangograph/oasisctl/options.md | 57 -- .../3.11/arangograph/oasisctl/pause/_index.md | 29 - .../oasisctl/pause/pause-notebook.md | 29 - .../arangograph/oasisctl/rebalance/_index.md | 29 - .../rebalance/rebalance-deployment-shards.md | 29 - .../rebalance/rebalance-deployment.md | 29 - .../arangograph/oasisctl/reject/_index.md | 29 - .../reject/reject-organization-invite.md | 30 - .../oasisctl/reject/reject-organization.md | 29 - .../3.11/arangograph/oasisctl/renew/_index.md | 29 - .../oasisctl/renew/renew-apikey-token.md | 31 - .../oasisctl/renew/renew-apikey.md | 29 - .../arangograph/oasisctl/resume/_index.md | 30 - .../oasisctl/resume/resume-deployment.md | 31 - .../oasisctl/resume/resume-notebook.md | 29 - .../arangograph/oasisctl/revoke/_index.md | 30 - .../oasisctl/revoke/revoke-apikey-token.md | 31 - .../oasisctl/revoke/revoke-apikey.md | 30 - .../oasisctl/revoke/revoke-metrics-token.md | 32 - .../oasisctl/revoke/revoke-metrics.md | 29 - .../arangograph/oasisctl/rotate/_index.md | 29 - .../rotate/rotate-deployment-server.md | 32 - .../oasisctl/rotate/rotate-deployment.md | 29 - site/content/3.11/arangograph/oasisctl/top.md | 31 - .../arangograph/oasisctl/unlock/_index.md | 34 - .../oasisctl/unlock/unlock-cacertificate.md | 31 - .../oasisctl/unlock/unlock-deployment.md | 31 - .../oasisctl/unlock/unlock-ipallowlist.md | 31 - .../oasisctl/unlock/unlock-organization.md | 29 - .../oasisctl/unlock/unlock-policy.md | 29 - .../oasisctl/unlock/unlock-project.md | 30 - .../arangograph/oasisctl/update/_index.md | 41 - .../oasisctl/update/update-auditlog.md | 33 - .../oasisctl/update/update-backup-policy.md | 50 - .../oasisctl/update/update-backup.md | 34 - .../oasisctl/update/update-cacertificate.md | 34 - .../oasisctl/update/update-deployment.md | 52 -- .../oasisctl/update/update-group.md | 32 - .../oasisctl/update/update-ipallowlist.md | 36 - .../oasisctl/update/update-metrics-token.md | 34 - .../oasisctl/update/update-metrics.md | 29 - .../oasisctl/update/update-notebook.md | 33 - ...e-organization-authentication-providers.md | 34 - .../update-organization-authentication.md | 29 - ...-organization-email-domain-restrictions.md | 30 - .../update-organization-email-domain.md | 29 - .../update/update-organization-email.md | 29 - .../oasisctl/update/update-organization.md | 33 - .../update/update-policy-add-binding.md | 32 - .../oasisctl/update/update-policy-add.md | 29 - .../update/update-policy-delete-binding.md | 32 - .../oasisctl/update/update-policy-delete.md | 29 - .../oasisctl/update/update-policy.md | 30 - .../update/update-private-endpoint-service.md | 38 - .../update/update-private-endpoint.md | 29 - .../oasisctl/update/update-private.md | 29 - .../oasisctl/update/update-project.md | 32 - .../oasisctl/update/update-role.md | 34 - .../3.11/arangograph/oasisctl/upgrade.md | 33 - .../3.11/arangograph/oasisctl/version.md | 28 - .../3.11/arangograph/oasisctl/wait/_index.md | 29 - .../oasisctl/wait/wait-deployment.md | 32 - .../3.11/arangograph/organizations/_index.md | 111 --- .../organizations/credits-and-usage.md | 147 --- .../organizations/users-and-groups.md | 125 --- site/content/3.11/arangograph/projects.md | 82 -- .../security-and-access-control/_index.md | 699 -------------- .../single-sign-on/scim-provisioning.md | 76 -- .../x-509-certificates.md | 178 ---- .../data-science/arangograph-notebooks.md | 22 - .../3.12/about-arangodb/features/platform.md | 57 -- site/content/3.12/arangograph/_index.md | 38 - site/content/3.12/arangograph/api/_index.md | 37 - .../3.12/arangograph/api/get-started.md | 481 ---------- .../arangograph/api/set-up-a-connection.md | 108 --- .../3.12/arangograph/data-loader/add-files.md | 59 -- .../3.12/arangograph/data-loader/example.md | 103 -- .../3.12/arangograph/data-loader/import.md | 72 -- .../deployments/upgrades-and-versioning.md | 92 -- .../3.12/arangograph/migrate-to-the-cloud.md | 259 ------ .../3.12/arangograph/oasisctl/_index.md | 18 - .../arangograph/oasisctl/accept/_index.md | 29 - .../accept/accept-organization-invite.md | 30 - .../oasisctl/accept/accept-organization.md | 29 - .../3.12/arangograph/oasisctl/add/_index.md | 30 - .../oasisctl/add/add-auditlog-destination.md | 37 - .../arangograph/oasisctl/add/add-auditlog.md | 29 - .../oasisctl/add/add-group-members.md | 31 - .../arangograph/oasisctl/add/add-group.md | 29 - .../arangograph/oasisctl/auditlog/_index.md | 31 - .../oasisctl/auditlog/auditlog-attach.md | 31 - .../oasisctl/auditlog/auditlog-detach.md | 30 - .../auditlog/auditlog-get-attached-project.md | 30 - .../auditlog/auditlog-get-attached.md | 29 - .../oasisctl/auditlog/auditlog-get.md | 29 - .../arangograph/oasisctl/backup/_index.md | 30 - .../oasisctl/backup/backup-copy.md | 30 - .../oasisctl/backup/backup-download.md | 32 - .../3.12/arangograph/oasisctl/clone/_index.md | 29 - .../oasisctl/clone/clone-deployment-backup.md | 33 - .../oasisctl/clone/clone-deployment.md | 29 - .../3.12/arangograph/oasisctl/completion.md | 39 - .../arangograph/oasisctl/create/_index.md | 42 - .../oasisctl/create/create-apikey.md | 30 - .../oasisctl/create/create-auditlog.md | 32 - .../oasisctl/create/create-backup-policy.md | 50 - .../oasisctl/create/create-backup.md | 34 - .../oasisctl/create/create-cacertificate.md | 33 - .../oasisctl/create/create-deployment.md | 54 -- .../create/create-example-installation.md | 32 - .../oasisctl/create/create-example.md | 29 - .../oasisctl/create/create-group.md | 31 - .../oasisctl/create/create-ipallowlist.md | 34 - .../oasisctl/create/create-metrics-token.md | 34 - .../oasisctl/create/create-metrics.md | 29 - .../oasisctl/create/create-notebook.md | 35 - .../create/create-organization-invite.md | 30 - .../oasisctl/create/create-organization.md | 31 - .../create/create-private-endpoint-service.md | 38 - .../create/create-private-endpoint.md | 29 - .../oasisctl/create/create-private.md | 29 - .../oasisctl/create/create-project.md | 31 - .../oasisctl/create/create-role.md | 32 - .../arangograph/oasisctl/delete/_index.md | 41 - .../oasisctl/delete/delete-apikey.md | 29 - .../delete/delete-auditlog-archive-events.md | 30 - .../delete/delete-auditlog-archive.md | 30 - .../delete/delete-auditlog-destination.md | 33 - .../oasisctl/delete/delete-auditlog.md | 32 - .../oasisctl/delete/delete-backup-policy.md | 31 - .../oasisctl/delete/delete-backup.md | 30 - .../oasisctl/delete/delete-cacertificate.md | 31 - .../oasisctl/delete/delete-deployment.md | 31 - .../delete/delete-example-installation.md | 32 - .../oasisctl/delete/delete-example.md | 29 - .../oasisctl/delete/delete-group-members.md | 31 - .../oasisctl/delete/delete-group.md | 31 - .../oasisctl/delete/delete-ipallowlist.md | 31 - .../oasisctl/delete/delete-metrics-token.md | 32 - .../oasisctl/delete/delete-metrics.md | 29 - .../oasisctl/delete/delete-notebook.md | 29 - .../delete/delete-organization-invite.md | 30 - .../delete/delete-organization-members.md | 30 - .../oasisctl/delete/delete-organization.md | 31 - .../oasisctl/delete/delete-project.md | 30 - .../oasisctl/delete/delete-role.md | 30 - .../arangograph/oasisctl/disable/_index.md | 29 - ...isable-scheduled-root-password-rotation.md | 31 - .../arangograph/oasisctl/enable/_index.md | 29 - ...enable-scheduled-root-password-rotation.md | 31 - .../arangograph/oasisctl/generate-docs.md | 31 - .../3.12/arangograph/oasisctl/get/_index.md | 47 - .../oasisctl/get/get-auditlog-archive.md | 29 - .../oasisctl/get/get-auditlog-events.md | 35 - .../arangograph/oasisctl/get/get-auditlog.md | 32 - .../oasisctl/get/get-backup-policy.md | 29 - .../arangograph/oasisctl/get/get-backup.md | 30 - .../oasisctl/get/get-cacertificate.md | 31 - .../oasisctl/get/get-deployment.md | 32 - .../oasisctl/get/get-example-installation.md | 32 - .../arangograph/oasisctl/get/get-example.md | 30 - .../arangograph/oasisctl/get/get-group.md | 30 - .../oasisctl/get/get-ipallowlist.md | 31 - .../oasisctl/get/get-metrics-token.md | 32 - .../arangograph/oasisctl/get/get-metrics.md | 29 - .../arangograph/oasisctl/get/get-notebook.md | 29 - ...t-organization-authentication-providers.md | 29 - .../get/get-organization-authentication.md | 29 - ...-organization-email-domain-restrictions.md | 29 - .../get/get-organization-email-domain.md | 29 - .../oasisctl/get/get-organization-email.md | 29 - .../oasisctl/get/get-organization-invite.md | 30 - .../oasisctl/get/get-organization.md | 32 - .../arangograph/oasisctl/get/get-policy.md | 29 - .../get/get-private-endpoint-service.md | 31 - .../oasisctl/get/get-private-endpoint.md | 29 - .../arangograph/oasisctl/get/get-private.md | 29 - .../arangograph/oasisctl/get/get-project.md | 30 - .../arangograph/oasisctl/get/get-provider.md | 30 - .../arangograph/oasisctl/get/get-region.md | 31 - .../3.12/arangograph/oasisctl/get/get-role.md | 30 - .../3.12/arangograph/oasisctl/get/get-self.md | 28 - .../oasisctl/get/get-server-status.md | 31 - .../arangograph/oasisctl/get/get-server.md | 29 - .../arangograph/oasisctl/get/get-tandc.md | 30 - .../3.12/arangograph/oasisctl/import.md | 46 - .../3.12/arangograph/oasisctl/list/_index.md | 56 -- .../arangograph/oasisctl/list/list-apikeys.md | 28 - .../oasisctl/list/list-arangodb-versions.md | 29 - .../oasisctl/list/list-arangodb.md | 29 - .../oasisctl/list/list-auditlog-archives.md | 30 - .../list/list-auditlog-destinations.md | 30 - .../oasisctl/list/list-auditlog.md | 30 - .../oasisctl/list/list-auditlogs.md | 29 - .../oasisctl/list/list-backup-policies.md | 30 - .../arangograph/oasisctl/list/list-backup.md | 29 - .../arangograph/oasisctl/list/list-backups.md | 31 - .../oasisctl/list/list-cacertificates.md | 30 - .../oasisctl/list/list-cpusizes.md | 31 - .../oasisctl/list/list-deployments.md | 30 - .../oasisctl/list/list-diskperformances.md | 33 - .../list/list-effective-permissions.md | 29 - .../oasisctl/list/list-effective.md | 29 - .../list/list-example-installations.md | 31 - .../arangograph/oasisctl/list/list-example.md | 29 - .../oasisctl/list/list-examples.md | 29 - .../oasisctl/list/list-group-members.md | 30 - .../arangograph/oasisctl/list/list-group.md | 29 - .../arangograph/oasisctl/list/list-groups.md | 29 - .../oasisctl/list/list-ipallowlists.md | 30 - .../oasisctl/list/list-metrics-tokens.md | 31 - .../arangograph/oasisctl/list/list-metrics.md | 29 - .../oasisctl/list/list-nodesizes.md | 33 - .../oasisctl/list/list-notebookmodels.md | 31 - .../oasisctl/list/list-notebooks.md | 31 - .../list/list-organization-invites.md | 29 - .../list/list-organization-members.md | 29 - .../oasisctl/list/list-organization.md | 30 - .../oasisctl/list/list-organizations.md | 28 - .../oasisctl/list/list-permissions.md | 28 - .../oasisctl/list/list-projects.md | 29 - .../oasisctl/list/list-providers.md | 29 - .../arangograph/oasisctl/list/list-regions.md | 30 - .../arangograph/oasisctl/list/list-roles.md | 29 - .../arangograph/oasisctl/list/list-servers.md | 28 - .../3.12/arangograph/oasisctl/lock/_index.md | 34 - .../oasisctl/lock/lock-cacertificate.md | 31 - .../oasisctl/lock/lock-deployment.md | 31 - .../oasisctl/lock/lock-ipallowlist.md | 31 - .../oasisctl/lock/lock-organization.md | 29 - .../arangograph/oasisctl/lock/lock-policy.md | 29 - .../arangograph/oasisctl/lock/lock-project.md | 30 - .../3.12/arangograph/oasisctl/login.md | 36 - .../content/3.12/arangograph/oasisctl/logs.md | 35 - .../3.12/arangograph/oasisctl/options.md | 57 -- .../3.12/arangograph/oasisctl/pause/_index.md | 29 - .../oasisctl/pause/pause-notebook.md | 29 - .../arangograph/oasisctl/rebalance/_index.md | 29 - .../rebalance/rebalance-deployment-shards.md | 29 - .../rebalance/rebalance-deployment.md | 29 - .../arangograph/oasisctl/reject/_index.md | 29 - .../reject/reject-organization-invite.md | 30 - .../oasisctl/reject/reject-organization.md | 29 - .../3.12/arangograph/oasisctl/renew/_index.md | 29 - .../oasisctl/renew/renew-apikey-token.md | 31 - .../oasisctl/renew/renew-apikey.md | 29 - .../arangograph/oasisctl/resume/_index.md | 30 - .../oasisctl/resume/resume-deployment.md | 31 - .../oasisctl/resume/resume-notebook.md | 29 - .../arangograph/oasisctl/revoke/_index.md | 30 - .../oasisctl/revoke/revoke-apikey-token.md | 31 - .../oasisctl/revoke/revoke-apikey.md | 30 - .../oasisctl/revoke/revoke-metrics-token.md | 32 - .../oasisctl/revoke/revoke-metrics.md | 29 - .../arangograph/oasisctl/rotate/_index.md | 29 - .../rotate/rotate-deployment-server.md | 32 - .../oasisctl/rotate/rotate-deployment.md | 29 - site/content/3.12/arangograph/oasisctl/top.md | 31 - .../arangograph/oasisctl/unlock/_index.md | 34 - .../oasisctl/unlock/unlock-cacertificate.md | 31 - .../oasisctl/unlock/unlock-deployment.md | 31 - .../oasisctl/unlock/unlock-ipallowlist.md | 31 - .../oasisctl/unlock/unlock-organization.md | 29 - .../oasisctl/unlock/unlock-policy.md | 29 - .../oasisctl/unlock/unlock-project.md | 30 - .../arangograph/oasisctl/update/_index.md | 41 - .../oasisctl/update/update-auditlog.md | 33 - .../oasisctl/update/update-backup-policy.md | 50 - .../oasisctl/update/update-backup.md | 34 - .../oasisctl/update/update-cacertificate.md | 34 - .../oasisctl/update/update-deployment.md | 52 -- .../oasisctl/update/update-group.md | 32 - .../oasisctl/update/update-ipallowlist.md | 36 - .../oasisctl/update/update-metrics-token.md | 34 - .../oasisctl/update/update-metrics.md | 29 - .../oasisctl/update/update-notebook.md | 33 - ...e-organization-authentication-providers.md | 34 - .../update-organization-authentication.md | 29 - ...-organization-email-domain-restrictions.md | 30 - .../update-organization-email-domain.md | 29 - .../update/update-organization-email.md | 29 - .../oasisctl/update/update-organization.md | 33 - .../update/update-policy-add-binding.md | 32 - .../oasisctl/update/update-policy-add.md | 29 - .../update/update-policy-delete-binding.md | 32 - .../oasisctl/update/update-policy-delete.md | 29 - .../oasisctl/update/update-policy.md | 30 - .../update/update-private-endpoint-service.md | 38 - .../update/update-private-endpoint.md | 29 - .../oasisctl/update/update-private.md | 29 - .../oasisctl/update/update-project.md | 32 - .../oasisctl/update/update-role.md | 34 - .../3.12/arangograph/oasisctl/upgrade.md | 33 - .../3.12/arangograph/oasisctl/version.md | 28 - .../3.12/arangograph/oasisctl/wait/_index.md | 29 - .../oasisctl/wait/wait-deployment.md | 32 - .../3.12/arangograph/organizations/_index.md | 111 --- .../3.12/arangograph/organizations/billing.md | 36 - .../organizations/credits-and-usage.md | 147 --- .../organizations/users-and-groups.md | 125 --- site/content/3.12/arangograph/projects.md | 82 -- .../single-sign-on/_index.md | 104 --- site/content/3.13/arangograph/_index.md | 38 - site/content/3.13/arangograph/api/_index.md | 37 - .../arangograph/api/set-up-a-connection.md | 108 --- site/content/3.13/arangograph/backups.md | 172 ---- .../3.13/arangograph/data-loader/_index.md | 62 -- .../3.13/arangograph/data-loader/add-files.md | 59 -- .../arangograph/data-loader/design-graph.md | 68 -- .../3.13/arangograph/data-loader/example.md | 103 -- .../3.13/arangograph/data-loader/import.md | 72 -- .../3.13/arangograph/deployments/_index.md | 314 ------- .../deployments/private-endpoints.md | 168 ---- .../deployments/upgrades-and-versioning.md | 92 -- .../3.13/arangograph/migrate-to-the-cloud.md | 259 ------ .../arangograph/monitoring-and-metrics.md | 137 --- site/content/3.13/arangograph/my-account.md | 171 ---- site/content/3.13/arangograph/notebooks.md | 170 ---- .../3.13/arangograph/oasisctl/_index.md | 18 - .../arangograph/oasisctl/accept/_index.md | 29 - .../accept/accept-organization-invite.md | 30 - .../oasisctl/accept/accept-organization.md | 29 - .../3.13/arangograph/oasisctl/add/_index.md | 30 - .../oasisctl/add/add-auditlog-destination.md | 37 - .../arangograph/oasisctl/add/add-auditlog.md | 29 - .../oasisctl/add/add-group-members.md | 31 - .../arangograph/oasisctl/add/add-group.md | 29 - .../arangograph/oasisctl/auditlog/_index.md | 31 - .../oasisctl/auditlog/auditlog-attach.md | 31 - .../oasisctl/auditlog/auditlog-detach.md | 30 - .../auditlog/auditlog-get-attached-project.md | 30 - .../auditlog/auditlog-get-attached.md | 29 - .../oasisctl/auditlog/auditlog-get.md | 29 - .../arangograph/oasisctl/backup/_index.md | 30 - .../oasisctl/backup/backup-copy.md | 30 - .../oasisctl/backup/backup-download.md | 32 - .../3.13/arangograph/oasisctl/clone/_index.md | 29 - .../oasisctl/clone/clone-deployment-backup.md | 33 - .../oasisctl/clone/clone-deployment.md | 29 - .../3.13/arangograph/oasisctl/completion.md | 39 - .../arangograph/oasisctl/create/_index.md | 42 - .../oasisctl/create/create-apikey.md | 30 - .../oasisctl/create/create-auditlog.md | 32 - .../oasisctl/create/create-backup-policy.md | 50 - .../oasisctl/create/create-backup.md | 34 - .../oasisctl/create/create-cacertificate.md | 33 - .../oasisctl/create/create-deployment.md | 54 -- .../create/create-example-installation.md | 32 - .../oasisctl/create/create-example.md | 29 - .../oasisctl/create/create-group.md | 31 - .../oasisctl/create/create-ipallowlist.md | 34 - .../oasisctl/create/create-metrics-token.md | 34 - .../oasisctl/create/create-metrics.md | 29 - .../oasisctl/create/create-notebook.md | 35 - .../create/create-organization-invite.md | 30 - .../oasisctl/create/create-organization.md | 31 - .../create/create-private-endpoint-service.md | 38 - .../create/create-private-endpoint.md | 29 - .../oasisctl/create/create-private.md | 29 - .../oasisctl/create/create-project.md | 31 - .../oasisctl/create/create-role.md | 32 - .../arangograph/oasisctl/delete/_index.md | 41 - .../oasisctl/delete/delete-apikey.md | 29 - .../delete/delete-auditlog-archive-events.md | 30 - .../delete/delete-auditlog-archive.md | 30 - .../delete/delete-auditlog-destination.md | 33 - .../oasisctl/delete/delete-auditlog.md | 32 - .../oasisctl/delete/delete-backup-policy.md | 31 - .../oasisctl/delete/delete-backup.md | 30 - .../oasisctl/delete/delete-cacertificate.md | 31 - .../oasisctl/delete/delete-deployment.md | 31 - .../delete/delete-example-installation.md | 32 - .../oasisctl/delete/delete-example.md | 29 - .../oasisctl/delete/delete-group-members.md | 31 - .../oasisctl/delete/delete-group.md | 31 - .../oasisctl/delete/delete-ipallowlist.md | 31 - .../oasisctl/delete/delete-metrics-token.md | 32 - .../oasisctl/delete/delete-metrics.md | 29 - .../oasisctl/delete/delete-notebook.md | 29 - .../delete/delete-organization-invite.md | 30 - .../delete/delete-organization-members.md | 30 - .../oasisctl/delete/delete-organization.md | 31 - .../oasisctl/delete/delete-project.md | 30 - .../oasisctl/delete/delete-role.md | 30 - .../arangograph/oasisctl/disable/_index.md | 29 - ...isable-scheduled-root-password-rotation.md | 31 - .../arangograph/oasisctl/enable/_index.md | 29 - ...enable-scheduled-root-password-rotation.md | 31 - .../arangograph/oasisctl/generate-docs.md | 31 - .../3.13/arangograph/oasisctl/get/_index.md | 47 - .../oasisctl/get/get-auditlog-archive.md | 29 - .../oasisctl/get/get-auditlog-events.md | 35 - .../arangograph/oasisctl/get/get-auditlog.md | 32 - .../oasisctl/get/get-backup-policy.md | 29 - .../arangograph/oasisctl/get/get-backup.md | 30 - .../oasisctl/get/get-cacertificate.md | 31 - .../oasisctl/get/get-deployment.md | 32 - .../oasisctl/get/get-example-installation.md | 32 - .../arangograph/oasisctl/get/get-example.md | 30 - .../arangograph/oasisctl/get/get-group.md | 30 - .../oasisctl/get/get-ipallowlist.md | 31 - .../oasisctl/get/get-metrics-token.md | 32 - .../arangograph/oasisctl/get/get-metrics.md | 29 - .../arangograph/oasisctl/get/get-notebook.md | 29 - ...t-organization-authentication-providers.md | 29 - .../get/get-organization-authentication.md | 29 - ...-organization-email-domain-restrictions.md | 29 - .../get/get-organization-email-domain.md | 29 - .../oasisctl/get/get-organization-email.md | 29 - .../oasisctl/get/get-organization-invite.md | 30 - .../oasisctl/get/get-organization.md | 32 - .../arangograph/oasisctl/get/get-policy.md | 29 - .../get/get-private-endpoint-service.md | 31 - .../oasisctl/get/get-private-endpoint.md | 29 - .../arangograph/oasisctl/get/get-private.md | 29 - .../arangograph/oasisctl/get/get-project.md | 30 - .../arangograph/oasisctl/get/get-provider.md | 30 - .../arangograph/oasisctl/get/get-region.md | 31 - .../3.13/arangograph/oasisctl/get/get-role.md | 30 - .../3.13/arangograph/oasisctl/get/get-self.md | 28 - .../oasisctl/get/get-server-status.md | 31 - .../arangograph/oasisctl/get/get-server.md | 29 - .../arangograph/oasisctl/get/get-tandc.md | 30 - .../3.13/arangograph/oasisctl/import.md | 46 - .../3.13/arangograph/oasisctl/list/_index.md | 56 -- .../arangograph/oasisctl/list/list-apikeys.md | 28 - .../oasisctl/list/list-arangodb-versions.md | 29 - .../oasisctl/list/list-arangodb.md | 29 - .../oasisctl/list/list-auditlog-archives.md | 30 - .../list/list-auditlog-destinations.md | 30 - .../oasisctl/list/list-auditlog.md | 30 - .../oasisctl/list/list-auditlogs.md | 29 - .../oasisctl/list/list-backup-policies.md | 30 - .../arangograph/oasisctl/list/list-backup.md | 29 - .../arangograph/oasisctl/list/list-backups.md | 31 - .../oasisctl/list/list-cacertificates.md | 30 - .../oasisctl/list/list-cpusizes.md | 31 - .../oasisctl/list/list-deployments.md | 30 - .../oasisctl/list/list-diskperformances.md | 33 - .../list/list-effective-permissions.md | 29 - .../oasisctl/list/list-effective.md | 29 - .../list/list-example-installations.md | 31 - .../arangograph/oasisctl/list/list-example.md | 29 - .../oasisctl/list/list-examples.md | 29 - .../oasisctl/list/list-group-members.md | 30 - .../arangograph/oasisctl/list/list-group.md | 29 - .../arangograph/oasisctl/list/list-groups.md | 29 - .../oasisctl/list/list-ipallowlists.md | 30 - .../oasisctl/list/list-metrics-tokens.md | 31 - .../arangograph/oasisctl/list/list-metrics.md | 29 - .../oasisctl/list/list-nodesizes.md | 33 - .../oasisctl/list/list-notebookmodels.md | 31 - .../oasisctl/list/list-notebooks.md | 31 - .../list/list-organization-invites.md | 29 - .../list/list-organization-members.md | 29 - .../oasisctl/list/list-organization.md | 30 - .../oasisctl/list/list-organizations.md | 28 - .../oasisctl/list/list-permissions.md | 28 - .../oasisctl/list/list-projects.md | 29 - .../oasisctl/list/list-providers.md | 29 - .../arangograph/oasisctl/list/list-regions.md | 30 - .../arangograph/oasisctl/list/list-roles.md | 29 - .../arangograph/oasisctl/list/list-servers.md | 28 - .../3.13/arangograph/oasisctl/lock/_index.md | 34 - .../oasisctl/lock/lock-cacertificate.md | 31 - .../oasisctl/lock/lock-deployment.md | 31 - .../oasisctl/lock/lock-ipallowlist.md | 31 - .../oasisctl/lock/lock-organization.md | 29 - .../arangograph/oasisctl/lock/lock-policy.md | 29 - .../arangograph/oasisctl/lock/lock-project.md | 30 - .../3.13/arangograph/oasisctl/login.md | 36 - .../content/3.13/arangograph/oasisctl/logs.md | 35 - .../3.13/arangograph/oasisctl/options.md | 57 -- .../3.13/arangograph/oasisctl/pause/_index.md | 29 - .../oasisctl/pause/pause-notebook.md | 29 - .../arangograph/oasisctl/rebalance/_index.md | 29 - .../rebalance/rebalance-deployment-shards.md | 29 - .../rebalance/rebalance-deployment.md | 29 - .../arangograph/oasisctl/reject/_index.md | 29 - .../reject/reject-organization-invite.md | 30 - .../oasisctl/reject/reject-organization.md | 29 - .../3.13/arangograph/oasisctl/renew/_index.md | 29 - .../oasisctl/renew/renew-apikey-token.md | 31 - .../oasisctl/renew/renew-apikey.md | 29 - .../arangograph/oasisctl/resume/_index.md | 30 - .../oasisctl/resume/resume-deployment.md | 31 - .../oasisctl/resume/resume-notebook.md | 29 - .../arangograph/oasisctl/revoke/_index.md | 30 - .../oasisctl/revoke/revoke-apikey-token.md | 31 - .../oasisctl/revoke/revoke-apikey.md | 30 - .../oasisctl/revoke/revoke-metrics-token.md | 32 - .../oasisctl/revoke/revoke-metrics.md | 29 - .../arangograph/oasisctl/rotate/_index.md | 29 - .../rotate/rotate-deployment-server.md | 32 - .../oasisctl/rotate/rotate-deployment.md | 29 - site/content/3.13/arangograph/oasisctl/top.md | 31 - .../arangograph/oasisctl/unlock/_index.md | 34 - .../oasisctl/unlock/unlock-cacertificate.md | 31 - .../oasisctl/unlock/unlock-deployment.md | 31 - .../oasisctl/unlock/unlock-ipallowlist.md | 31 - .../oasisctl/unlock/unlock-organization.md | 29 - .../oasisctl/unlock/unlock-policy.md | 29 - .../oasisctl/unlock/unlock-project.md | 30 - .../arangograph/oasisctl/update/_index.md | 41 - .../oasisctl/update/update-auditlog.md | 33 - .../oasisctl/update/update-backup-policy.md | 50 - .../oasisctl/update/update-backup.md | 34 - .../oasisctl/update/update-cacertificate.md | 34 - .../oasisctl/update/update-deployment.md | 52 -- .../oasisctl/update/update-group.md | 32 - .../oasisctl/update/update-ipallowlist.md | 36 - .../oasisctl/update/update-metrics-token.md | 34 - .../oasisctl/update/update-metrics.md | 29 - .../oasisctl/update/update-notebook.md | 33 - ...e-organization-authentication-providers.md | 34 - .../update-organization-authentication.md | 29 - ...-organization-email-domain-restrictions.md | 30 - .../update-organization-email-domain.md | 29 - .../update/update-organization-email.md | 29 - .../oasisctl/update/update-organization.md | 33 - .../update/update-policy-add-binding.md | 32 - .../oasisctl/update/update-policy-add.md | 29 - .../update/update-policy-delete-binding.md | 32 - .../oasisctl/update/update-policy-delete.md | 29 - .../oasisctl/update/update-policy.md | 30 - .../update/update-private-endpoint-service.md | 38 - .../update/update-private-endpoint.md | 29 - .../oasisctl/update/update-private.md | 29 - .../oasisctl/update/update-project.md | 32 - .../oasisctl/update/update-role.md | 34 - .../3.13/arangograph/oasisctl/upgrade.md | 33 - .../3.13/arangograph/oasisctl/version.md | 28 - .../3.13/arangograph/oasisctl/wait/_index.md | 29 - .../oasisctl/wait/wait-deployment.md | 32 - .../3.13/arangograph/organizations/billing.md | 36 - .../organizations/credits-and-usage.md | 147 --- .../organizations/users-and-groups.md | 125 --- site/content/3.13/arangograph/projects.md | 82 -- .../security-and-access-control/_index.md | 699 -------------- .../single-sign-on/_index.md | 104 --- .../single-sign-on/scim-provisioning.md | 76 -- .../x-509-certificates.md | 178 ---- .../3.13/data-science/graphrag/_index.md | 163 ---- site/content/3.13/graphs/graph-visualizer.md | 299 ------ .../{3.11/arangograph => amp}/_index.md | 14 +- .../{3.11/arangograph => amp}/api/_index.md | 17 +- .../arangograph => amp}/api/get-started.md | 32 +- .../api/set-up-a-connection.md | 0 .../{3.12/arangograph => amp}/backups.md | 30 +- .../arangograph => amp}/data-loader/_index.md | 10 +- .../data-loader/add-files.md | 2 +- .../data-loader/design-graph.md | 6 +- .../data-loader/example.md | 14 +- .../arangograph => amp}/data-loader/import.md | 0 .../arangograph => amp}/deployments/_index.md | 18 +- .../deployments/private-endpoints.md | 16 +- .../deployments/upgrades-and-versioning.md | 0 .../migrate-to-the-cloud.md | 4 +- .../monitoring-and-metrics.md | 14 +- .../{3.12/arangograph => amp}/my-account.md | 26 +- .../{3.12/arangograph => amp}/notebooks.md | 4 +- .../arangograph => amp}/oasisctl/_index.md | 0 .../oasisctl/accept/_index.md | 0 .../accept/accept-organization-invite.md | 0 .../oasisctl/accept/accept-organization.md | 0 .../oasisctl/add/_index.md | 0 .../oasisctl/add/add-auditlog-destination.md | 0 .../oasisctl/add/add-auditlog.md | 0 .../oasisctl/add/add-group-members.md | 0 .../oasisctl/add/add-group.md | 0 .../oasisctl/auditlog/_index.md | 0 .../oasisctl/auditlog/auditlog-attach.md | 0 .../oasisctl/auditlog/auditlog-detach.md | 0 .../auditlog/auditlog-get-attached-project.md | 0 .../auditlog/auditlog-get-attached.md | 0 .../oasisctl/auditlog/auditlog-get.md | 0 .../oasisctl/backup/_index.md | 0 .../oasisctl/backup/backup-copy.md | 0 .../oasisctl/backup/backup-download.md | 0 .../oasisctl/clone/_index.md | 0 .../oasisctl/clone/clone-deployment-backup.md | 0 .../oasisctl/clone/clone-deployment.md | 0 .../oasisctl/completion.md | 0 .../oasisctl/create/_index.md | 0 .../oasisctl/create/create-apikey.md | 0 .../oasisctl/create/create-auditlog.md | 0 .../oasisctl/create/create-backup-policy.md | 0 .../oasisctl/create/create-backup.md | 0 .../oasisctl/create/create-cacertificate.md | 0 .../oasisctl/create/create-deployment.md | 0 .../create/create-example-installation.md | 0 .../oasisctl/create/create-example.md | 0 .../oasisctl/create/create-group.md | 0 .../oasisctl/create/create-ipallowlist.md | 0 .../oasisctl/create/create-metrics-token.md | 0 .../oasisctl/create/create-metrics.md | 0 .../oasisctl/create/create-notebook.md | 0 .../create/create-organization-invite.md | 0 .../oasisctl/create/create-organization.md | 0 .../create/create-private-endpoint-service.md | 0 .../create/create-private-endpoint.md | 0 .../oasisctl/create/create-private.md | 0 .../oasisctl/create/create-project.md | 0 .../oasisctl/create/create-role.md | 0 .../oasisctl/delete/_index.md | 0 .../oasisctl/delete/delete-apikey.md | 0 .../delete/delete-auditlog-archive-events.md | 0 .../delete/delete-auditlog-archive.md | 0 .../delete/delete-auditlog-destination.md | 0 .../oasisctl/delete/delete-auditlog.md | 0 .../oasisctl/delete/delete-backup-policy.md | 0 .../oasisctl/delete/delete-backup.md | 0 .../oasisctl/delete/delete-cacertificate.md | 0 .../oasisctl/delete/delete-deployment.md | 0 .../delete/delete-example-installation.md | 0 .../oasisctl/delete/delete-example.md | 0 .../oasisctl/delete/delete-group-members.md | 0 .../oasisctl/delete/delete-group.md | 0 .../oasisctl/delete/delete-ipallowlist.md | 0 .../oasisctl/delete/delete-metrics-token.md | 0 .../oasisctl/delete/delete-metrics.md | 0 .../oasisctl/delete/delete-notebook.md | 0 .../delete/delete-organization-invite.md | 0 .../delete/delete-organization-members.md | 0 .../oasisctl/delete/delete-organization.md | 0 .../oasisctl/delete/delete-project.md | 0 .../oasisctl/delete/delete-role.md | 0 .../oasisctl/disable/_index.md | 0 ...isable-scheduled-root-password-rotation.md | 0 .../oasisctl/enable/_index.md | 0 ...enable-scheduled-root-password-rotation.md | 0 .../oasisctl/generate-docs.md | 0 .../oasisctl/get/_index.md | 0 .../oasisctl/get/get-auditlog-archive.md | 0 .../oasisctl/get/get-auditlog-events.md | 0 .../oasisctl/get/get-auditlog.md | 0 .../oasisctl/get/get-backup-policy.md | 0 .../oasisctl/get/get-backup.md | 0 .../oasisctl/get/get-cacertificate.md | 0 .../oasisctl/get/get-deployment.md | 0 .../oasisctl/get/get-example-installation.md | 0 .../oasisctl/get/get-example.md | 0 .../oasisctl/get/get-group.md | 0 .../oasisctl/get/get-ipallowlist.md | 0 .../oasisctl/get/get-metrics-token.md | 0 .../oasisctl/get/get-metrics.md | 0 .../oasisctl/get/get-notebook.md | 0 ...t-organization-authentication-providers.md | 0 .../get/get-organization-authentication.md | 0 ...-organization-email-domain-restrictions.md | 0 .../get/get-organization-email-domain.md | 0 .../oasisctl/get/get-organization-email.md | 0 .../oasisctl/get/get-organization-invite.md | 0 .../oasisctl/get/get-organization.md | 0 .../oasisctl/get/get-policy.md | 0 .../get/get-private-endpoint-service.md | 0 .../oasisctl/get/get-private-endpoint.md | 0 .../oasisctl/get/get-private.md | 0 .../oasisctl/get/get-project.md | 0 .../oasisctl/get/get-provider.md | 0 .../oasisctl/get/get-region.md | 0 .../oasisctl/get/get-role.md | 0 .../oasisctl/get/get-self.md | 0 .../oasisctl/get/get-server-status.md | 0 .../oasisctl/get/get-server.md | 0 .../oasisctl/get/get-tandc.md | 0 .../arangograph => amp}/oasisctl/import.md | 0 .../oasisctl/list/_index.md | 0 .../oasisctl/list/list-apikeys.md | 0 .../oasisctl/list/list-arangodb-versions.md | 0 .../oasisctl/list/list-arangodb.md | 0 .../oasisctl/list/list-auditlog-archives.md | 0 .../list/list-auditlog-destinations.md | 0 .../oasisctl/list/list-auditlog.md | 0 .../oasisctl/list/list-auditlogs.md | 0 .../oasisctl/list/list-backup-policies.md | 0 .../oasisctl/list/list-backup.md | 0 .../oasisctl/list/list-backups.md | 0 .../oasisctl/list/list-cacertificates.md | 0 .../oasisctl/list/list-cpusizes.md | 0 .../oasisctl/list/list-deployments.md | 0 .../oasisctl/list/list-diskperformances.md | 0 .../list/list-effective-permissions.md | 0 .../oasisctl/list/list-effective.md | 0 .../list/list-example-installations.md | 0 .../oasisctl/list/list-example.md | 0 .../oasisctl/list/list-examples.md | 0 .../oasisctl/list/list-group-members.md | 0 .../oasisctl/list/list-group.md | 0 .../oasisctl/list/list-groups.md | 0 .../oasisctl/list/list-ipallowlists.md | 0 .../oasisctl/list/list-metrics-tokens.md | 0 .../oasisctl/list/list-metrics.md | 0 .../oasisctl/list/list-nodesizes.md | 0 .../oasisctl/list/list-notebookmodels.md | 0 .../oasisctl/list/list-notebooks.md | 0 .../list/list-organization-invites.md | 0 .../list/list-organization-members.md | 0 .../oasisctl/list/list-organization.md | 0 .../oasisctl/list/list-organizations.md | 0 .../oasisctl/list/list-permissions.md | 0 .../oasisctl/list/list-projects.md | 0 .../oasisctl/list/list-providers.md | 0 .../oasisctl/list/list-regions.md | 0 .../oasisctl/list/list-roles.md | 0 .../oasisctl/list/list-servers.md | 0 .../oasisctl/lock/_index.md | 0 .../oasisctl/lock/lock-cacertificate.md | 0 .../oasisctl/lock/lock-deployment.md | 0 .../oasisctl/lock/lock-ipallowlist.md | 0 .../oasisctl/lock/lock-organization.md | 0 .../oasisctl/lock/lock-policy.md | 0 .../oasisctl/lock/lock-project.md | 0 .../arangograph => amp}/oasisctl/login.md | 0 .../arangograph => amp}/oasisctl/logs.md | 0 .../arangograph => amp}/oasisctl/options.md | 0 .../oasisctl/pause/_index.md | 0 .../oasisctl/pause/pause-notebook.md | 0 .../oasisctl/rebalance/_index.md | 0 .../rebalance/rebalance-deployment-shards.md | 0 .../rebalance/rebalance-deployment.md | 0 .../oasisctl/reject/_index.md | 0 .../reject/reject-organization-invite.md | 0 .../oasisctl/reject/reject-organization.md | 0 .../oasisctl/renew/_index.md | 0 .../oasisctl/renew/renew-apikey-token.md | 0 .../oasisctl/renew/renew-apikey.md | 0 .../oasisctl/resume/_index.md | 0 .../oasisctl/resume/resume-deployment.md | 0 .../oasisctl/resume/resume-notebook.md | 0 .../oasisctl/revoke/_index.md | 0 .../oasisctl/revoke/revoke-apikey-token.md | 0 .../oasisctl/revoke/revoke-apikey.md | 0 .../oasisctl/revoke/revoke-metrics-token.md | 0 .../oasisctl/revoke/revoke-metrics.md | 0 .../oasisctl/rotate/_index.md | 0 .../rotate/rotate-deployment-server.md | 0 .../oasisctl/rotate/rotate-deployment.md | 0 .../{3.10/arangograph => amp}/oasisctl/top.md | 0 .../oasisctl/unlock/_index.md | 0 .../oasisctl/unlock/unlock-cacertificate.md | 0 .../oasisctl/unlock/unlock-deployment.md | 0 .../oasisctl/unlock/unlock-ipallowlist.md | 0 .../oasisctl/unlock/unlock-organization.md | 0 .../oasisctl/unlock/unlock-policy.md | 0 .../oasisctl/unlock/unlock-project.md | 0 .../oasisctl/update/_index.md | 0 .../oasisctl/update/update-auditlog.md | 0 .../oasisctl/update/update-backup-policy.md | 0 .../oasisctl/update/update-backup.md | 0 .../oasisctl/update/update-cacertificate.md | 0 .../oasisctl/update/update-deployment.md | 0 .../oasisctl/update/update-group.md | 0 .../oasisctl/update/update-ipallowlist.md | 0 .../oasisctl/update/update-metrics-token.md | 0 .../oasisctl/update/update-metrics.md | 0 .../oasisctl/update/update-notebook.md | 0 ...e-organization-authentication-providers.md | 0 .../update-organization-authentication.md | 0 ...-organization-email-domain-restrictions.md | 0 .../update-organization-email-domain.md | 0 .../update/update-organization-email.md | 0 .../oasisctl/update/update-organization.md | 0 .../update/update-policy-add-binding.md | 0 .../oasisctl/update/update-policy-add.md | 0 .../update/update-policy-delete-binding.md | 0 .../oasisctl/update/update-policy-delete.md | 0 .../oasisctl/update/update-policy.md | 0 .../update/update-private-endpoint-service.md | 0 .../update/update-private-endpoint.md | 0 .../oasisctl/update/update-private.md | 0 .../oasisctl/update/update-project.md | 0 .../oasisctl/update/update-role.md | 0 .../arangograph => amp}/oasisctl/upgrade.md | 0 .../arangograph => amp}/oasisctl/version.md | 0 .../oasisctl/wait/_index.md | 0 .../oasisctl/wait/wait-deployment.md | 0 .../organizations/_index.md | 8 +- .../organizations/billing.md | 4 +- .../organizations/credits-and-usage.md | 2 +- .../organizations/users-and-groups.md | 12 +- .../{3.10/arangograph => amp}/projects.md | 6 +- .../security-and-access-control/_index.md | 12 +- .../single-sign-on/_index.md | 12 +- .../single-sign-on/scim-provisioning.md | 2 +- .../x-509-certificates.md | 10 +- site/content/{ => arangodb}/3.10/_index.md | 8 +- .../3.10/about}/_index.md | 12 +- .../3.10/about}/features/_index.md | 4 +- .../3.10/about}/features/community-edition.md | 0 .../about}/features/enterprise-edition.md | 2 +- .../about}/features/highlights-by-version.md | 0 .../3.10/about}/use-cases.md | 24 +- .../content/{ => arangodb}/3.10/aql/_index.md | 0 .../{ => arangodb}/3.10/aql/common-errors.md | 0 .../{ => arangodb}/3.10/aql/data-queries.md | 0 .../aql/examples-and-query-patterns/_index.md | 0 .../actors-and-movies-dataset-queries.md | 0 .../examples-and-query-patterns/counting.md | 0 .../create-test-data.md | 0 .../diffing-two-documents.md | 0 .../dynamic-attribute-names.md | 0 .../examples-and-query-patterns/grouping.md | 0 .../aql/examples-and-query-patterns/joins.md | 0 .../projections-and-filters.md | 0 .../queries-without-collections.md | 0 .../remove-vertex.md | 4 +- .../examples-and-query-patterns/traversals.md | 2 +- .../upsert-repsert-guide.md | 0 .../aql/execution-and-performance/_index.md | 0 .../caching-query-results.md | 0 .../explaining-queries.md | 0 .../parsing-queries.md | 0 .../query-optimization.md | 0 .../query-profiling.md | 0 .../query-statistics.md | 0 .../3.10/aql/functions/_index.md | 0 .../3.10/aql/functions/arangosearch.md | 0 .../3.10/aql/functions/array.md | 0 .../{ => arangodb}/3.10/aql/functions/bit.md | 0 .../{ => arangodb}/3.10/aql/functions/date.md | 0 .../3.10/aql/functions/document-object.md | 0 .../3.10/aql/functions/fulltext.md | 0 .../{ => arangodb}/3.10/aql/functions/geo.md | 6 +- .../3.10/aql/functions/miscellaneous.md | 0 .../3.10/aql/functions/numeric.md | 0 .../3.10/aql/functions/string.md | 0 .../3.10/aql/functions/type-check-and-cast.md | 0 .../3.10/aql/fundamentals/_index.md | 0 .../accessing-data-from-collections.md | 0 .../3.10/aql/fundamentals/bind-parameters.md | 0 .../3.10/aql/fundamentals/data-types.md | 0 .../3.10/aql/fundamentals/limitations.md | 0 .../3.10/aql/fundamentals/query-errors.md | 0 .../3.10/aql/fundamentals/query-results.md | 0 .../3.10/aql/fundamentals/subqueries.md | 0 .../3.10/aql/fundamentals/syntax.md | 0 .../aql/fundamentals/type-and-value-order.md | 0 .../{ => arangodb}/3.10/aql/graphs/_index.md | 0 .../3.10/aql/graphs/all-shortest-paths.md | 4 +- .../{ => arangodb}/3.10/aql/graphs/k-paths.md | 4 +- .../3.10/aql/graphs/k-shortest-paths.md | 4 +- .../3.10/aql/graphs/shortest-path.md | 4 +- .../3.10/aql/graphs/traversals-explained.md | 16 +- .../3.10/aql/graphs/traversals.md | 4 +- .../3.10/aql/high-level-operations/_index.md | 0 .../3.10/aql/high-level-operations/collect.md | 0 .../3.10/aql/high-level-operations/filter.md | 0 .../3.10/aql/high-level-operations/for.md | 0 .../3.10/aql/high-level-operations/insert.md | 0 .../3.10/aql/high-level-operations/let.md | 0 .../3.10/aql/high-level-operations/limit.md | 0 .../3.10/aql/high-level-operations/remove.md | 0 .../3.10/aql/high-level-operations/replace.md | 0 .../3.10/aql/high-level-operations/return.md | 0 .../3.10/aql/high-level-operations/search.md | 0 .../3.10/aql/high-level-operations/sort.md | 0 .../3.10/aql/high-level-operations/update.md | 0 .../3.10/aql/high-level-operations/upsert.md | 0 .../3.10/aql/high-level-operations/window.md | 0 .../3.10/aql/high-level-operations/with.md | 0 .../3.10/aql/how-to-invoke-aql/_index.md | 0 .../aql/how-to-invoke-aql/with-arangosh.md | 0 .../with-the-web-interface.md | 0 .../{ => arangodb}/3.10/aql/operators.md | 0 .../3.10/aql/user-defined-functions.md | 0 .../{ => arangodb}/3.10/components/_index.md | 0 .../3.10/components/arangodb-server/_index.md | 4 +- .../arangodb-server/environment-variables.md | 0 .../3.10/components/arangodb-server/ldap.md | 0 .../components/arangodb-server/options.md | 0 .../arangodb-server/storage-engine.md | 0 .../3.10/components/tools/_index.md | 2 +- .../components/tools/arangobackup/_index.md | 0 .../components/tools/arangobackup/examples.md | 0 .../components/tools/arangobackup/options.md | 0 .../components/tools/arangobench/_index.md | 0 .../components/tools/arangobench/options.md | 0 .../components/tools/arangodb-shell/_index.md | 0 .../tools/arangodb-shell/details.md | 0 .../tools/arangodb-shell/examples.md | 0 .../tools/arangodb-shell/options.md | 0 .../tools/arangodb-starter/_index.md | 0 .../tools/arangodb-starter/architecture.md | 0 .../tools/arangodb-starter/options.md | 0 .../tools/arangodb-starter/security.md | 0 .../components/tools/arangodump/_index.md | 0 .../components/tools/arangodump/examples.md | 0 .../tools/arangodump/limitations.md | 0 .../components/tools/arangodump/maskings.md | 0 .../components/tools/arangodump/options.md | 0 .../components/tools/arangoexport/_index.md | 0 .../components/tools/arangoexport/examples.md | 0 .../components/tools/arangoexport/options.md | 0 .../components/tools/arangoimport/_index.md | 0 .../components/tools/arangoimport/details.md | 0 .../tools/arangoimport/examples-csv.md | 0 .../tools/arangoimport/examples-json.md | 0 .../components/tools/arangoimport/options.md | 0 .../components/tools/arangoinspect/_index.md | 0 .../tools/arangoinspect/examples.md | 0 .../components/tools/arangoinspect/options.md | 0 .../components/tools/arangorestore/_index.md | 0 .../tools/arangorestore/examples.md | 0 .../arangorestore/fast-cluster-restore.md | 0 .../components/tools/arangorestore/options.md | 0 .../components/tools/arangovpack/_index.md | 0 .../components/tools/arangovpack/options.md | 0 .../3.10/components/tools/foxx-cli/_index.md | 0 .../3.10/components/tools/foxx-cli/details.md | 0 .../3.10}/components/web-interface/_index.md | 2 +- .../3.10/components/web-interface/cluster.md | 6 +- .../components/web-interface/collections.md | 4 +- .../components/web-interface/dashboard.md | 2 +- .../components/web-interface/document.md | 2 +- .../3.10/components/web-interface/graphs.md | 6 +- .../3.10}/components/web-interface/logs.md | 2 +- .../3.10/components/web-interface/queries.md | 12 +- .../3.10/components/web-interface/services.md | 6 +- .../3.10}/components/web-interface/users.md | 6 +- .../{ => arangodb}/3.10/concepts/_index.md | 0 .../3.10/concepts/data-models.md | 0 .../3.10/concepts/data-retrieval.md | 0 .../3.10/concepts/data-structure/_index.md | 0 .../concepts/data-structure/collections.md | 0 .../3.10/concepts/data-structure/databases.md | 0 .../data-structure/documents/_index.md | 0 .../documents/computed-values.md | 0 .../documents/schema-validation.md | 0 .../3.10/concepts/data-structure/views.md | 0 .../3.10/data-science/_index.md | 10 +- .../3.10/data-science/adapters/_index.md | 0 .../adapters/arangodb-cugraph-adapter.md | 0 .../adapters/arangodb-dgl-adapter.md | 0 .../adapters/arangodb-networkx-adapter.md | 0 .../adapters/arangodb-pyg-adapter.md | 0 .../adapters/arangodb-rdf-adapter.md | 0 .../data-science/arangograph-notebooks.md | 22 + .../3.10/data-science/arangographml/_index.md | 4 +- .../3.10/data-science/arangographml/deploy.md | 12 +- .../arangographml/getting-started.md | 4 +- .../3.10/data-science/llm-knowledge-graphs.md | 2 +- .../3.10/data-science/pregel/_index.md | 0 .../3.10/data-science/pregel/algorithms.md | 6 +- .../{ => arangodb}/3.10/deploy/_index.md | 2 +- .../3.10/deploy/active-failover/_index.md | 2 +- .../deploy/active-failover/administration.md | 0 .../deploy/active-failover/manual-start.md | 0 .../using-the-arangodb-starter.md | 0 .../3.10/deploy/arangosync/_index.md | 2 +- .../3.10/deploy/arangosync/administration.md | 0 .../deploy/arangosync/deployment/_index.md | 0 .../arangosync/deployment/arangodb-cluster.md | 0 .../deployment/arangosync-master.md | 0 .../deployment/arangosync-workers.md | 0 .../deployment/prometheus-and-grafana.md | 0 .../3.10/deploy/arangosync/monitoring.md | 0 .../arangosync/operations-and-maintenance.md | 0 .../3.10/deploy/arangosync/security.md | 0 .../3.10/deploy/arangosync/troubleshooting.md | 0 .../3.10/deploy/architecture/_index.md | 0 .../3.10/deploy/architecture/data-sharding.md | 4 +- .../3.10/deploy/architecture/replication.md | 0 .../3.10/deploy/architecture/scalability.md | 0 .../3.10/deploy/cluster/_index.md | 6 +- .../3.10/deploy/cluster/administration.md | 0 .../3.10/deploy/cluster/deployment/_index.md | 2 +- .../deploy/cluster/deployment/manual-start.md | 0 .../deployment/using-the-arangodb-starter.md | 0 .../3.10/deploy/cluster/limitations.md | 0 .../3.10/deploy/in-the-cloud.md | 0 .../{ => arangodb}/3.10/deploy/kubernetes.md | 0 .../3.10}/deploy/oneshard.md | 2 +- .../3.10/deploy/production-checklist.md | 0 .../3.10/deploy/single-instance-vs-cluster.md | 0 .../3.10/deploy/single-instance/_index.md | 0 .../deploy/single-instance/manual-start.md | 0 .../using-the-arangodb-starter.md | 0 .../{ => arangodb}/3.10/develop/_index.md | 0 .../3.10/develop/drivers/_index.md | 0 .../3.10/develop/drivers/csharp-dotnet.md | 0 .../{ => arangodb}/3.10/develop/drivers/go.md | 0 .../3.10/develop/drivers/java/_index.md | 0 .../java/reference-version-6/_index.md | 0 .../java/reference-version-6/driver-setup.md | 0 .../java/reference-version-6/serialization.md | 0 .../java/reference-version-7/_index.md | 0 .../changes-in-version-7.md | 0 .../java/reference-version-7/driver-setup.md | 0 .../java/reference-version-7/serialization.md | 0 .../3.10/develop/drivers/nodejs.md | 0 .../3.10/develop/drivers/python.md | 0 .../3.10/develop/error-codes-and-meanings.md | 0 .../3.10/develop/foxx-microservices/_index.md | 0 .../develop/foxx-microservices/deployment.md | 0 .../foxx-microservices/getting-started.md | 0 .../foxx-microservices/guides/_index.md | 0 .../guides/access-from-the-browser.md | 0 .../guides/authentication-and-sessions.md | 0 .../guides/development-mode.md | 0 .../guides/foxx-in-a-cluster.md | 0 .../guides/linking-services-together.md | 0 .../guides/making-requests.md | 0 .../guides/scripts-and-scheduling.md | 0 .../guides/testing-foxx-services.md | 0 .../guides/using-node-modules.md | 0 .../guides/using-webpack-with-foxx.md | 0 .../guides/working-with-collections.md | 0 .../guides/working-with-files.md | 0 .../guides/working-with-routers.md | 0 .../guides/writing-queries.md | 0 .../foxx-microservices/reference/_index.md | 0 .../reference/configuration.md | 0 .../reference/related-modules/_index.md | 0 .../related-modules/authentication.md | 0 .../reference/related-modules/graphql.md | 0 .../reference/related-modules/oauth-1-0a.md | 0 .../reference/related-modules/oauth-2-0.md | 0 .../reference/related-modules/queues.md | 0 .../reference/routers/_index.md | 0 .../reference/routers/endpoints.md | 0 .../reference/routers/middleware.md | 0 .../reference/routers/request.md | 0 .../reference/routers/response.md | 0 .../reference/service-context.md | 0 .../reference/service-manifest.md | 0 .../reference/sessions-middleware/_index.md | 0 .../session-storages/_index.md | 0 .../session-storages/collection-storage.md | 0 .../session-storages/jwt-storage.md | 0 .../session-transports/_index.md | 0 .../session-transports/cookie-transport.md | 0 .../session-transports/header-transport.md | 0 .../3.10/develop/http-api/_index.md | 2 +- .../3.10/develop/http-api/administration.md | 0 .../3.10/develop/http-api/analyzers.md | 0 .../3.10/develop/http-api/authentication.md | 0 .../3.10/develop/http-api/batch-requests.md | 0 .../3.10/develop/http-api/cluster.md | 0 .../3.10/develop/http-api/collections.md | 0 .../3.10/develop/http-api/databases.md | 0 .../3.10/develop/http-api/documents.md | 0 .../3.10/develop/http-api/foxx.md | 0 .../http-api/general-request-handling.md | 0 .../3.10/develop/http-api/graphs/_index.md | 0 .../3.10/develop/http-api/graphs/edges.md | 0 .../develop/http-api/graphs/named-graphs.md | 4 +- .../3.10/develop/http-api/hot-backups.md | 0 .../3.10/develop/http-api/import.md | 0 .../3.10/develop/http-api/indexes/_index.md | 0 .../3.10/develop/http-api/indexes/fulltext.md | 0 .../develop/http-api/indexes/geo-spatial.md | 0 .../3.10/develop/http-api/indexes/inverted.md | 0 .../http-api/indexes/multi-dimensional.md | 0 .../develop/http-api/indexes/persistent.md | 0 .../3.10/develop/http-api/indexes/ttl.md | 0 .../3.10/develop/http-api/jobs.md | 0 .../develop/http-api/monitoring/_index.md | 0 .../3.10/develop/http-api/monitoring/logs.md | 0 .../develop/http-api/monitoring/metrics.md | 0 .../develop/http-api/monitoring/statistics.md | 0 .../3.10/develop/http-api/pregel.md | 0 .../3.10/develop/http-api/queries/_index.md | 0 .../develop/http-api/queries/aql-queries.md | 0 .../queries/aql-query-results-cache.md | 0 .../queries/user-defined-aql-functions.md | 0 .../develop/http-api/replication/_index.md | 0 .../replication/other-replication-commands.md | 0 .../replication/replication-applier.md | 0 .../http-api/replication/replication-dump.md | 0 .../replication/replication-logger.md | 0 .../http-api/replication/write-ahead-log.md | 0 .../3.10/develop/http-api/security.md | 0 .../3.10/develop/http-api/tasks.md | 0 .../develop/http-api/transactions/_index.md | 0 .../transactions/javascript-transactions.md | 0 .../transactions/stream-transactions.md | 0 .../3.10/develop/http-api/users.md | 0 .../3.10/develop/http-api/views/_index.md | 0 .../http-api/views/arangosearch-views.md | 0 .../http-api/views/search-alias-views.md | 0 .../3.10/develop/integrations/_index.md | 0 .../arangodb-datasource-for-apache-spark.md | 2 +- .../_index.md | 0 .../configuration.md | 0 .../integrations/spring-boot-arangodb.md | 0 .../spring-data-arangodb/_index.md | 0 .../spring-data-arangodb/migration.md | 0 .../reference-version-3/_index.md | 0 .../reference-version-3/mapping/_index.md | 0 .../reference-version-3/mapping/auditing.md | 0 .../reference-version-3/mapping/converter.md | 0 .../reference-version-3/mapping/document.md | 0 .../reference-version-3/mapping/edge.md | 0 .../reference-version-3/mapping/events.md | 0 .../reference-version-3/mapping/indexes.md | 0 .../reference-version-3/mapping/reference.md | 0 .../reference-version-3/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-3/template.md | 0 .../reference-version-4/_index.md | 0 .../reference-version-4/mapping/_index.md | 0 .../reference-version-4/mapping/auditing.md | 0 .../mapping/computed-values.md | 0 .../reference-version-4/mapping/converter.md | 0 .../reference-version-4/mapping/document.md | 0 .../reference-version-4/mapping/edge.md | 0 .../reference-version-4/mapping/events.md | 0 .../reference-version-4/mapping/indexes.md | 0 .../reference-version-4/mapping/reference.md | 0 .../reference-version-4/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-4/template.md | 0 .../javascript-api/@arangodb/_index.md | 0 .../@arangodb/collection-object.md | 0 .../javascript-api/@arangodb/cursor-object.md | 0 .../javascript-api/@arangodb/db-object.md | 0 .../javascript-api/@arangodb/view-object.md | 0 .../3.10/develop/javascript-api/_index.md | 0 .../3.10/develop/javascript-api/actions.md | 0 .../3.10/develop/javascript-api/analyzers.md | 0 .../develop/javascript-api/aql-queries.md | 0 .../3.10/develop/javascript-api/console.md | 0 .../3.10/develop/javascript-api/crypto.md | 0 .../3.10/develop/javascript-api/fs.md | 0 .../3.10/develop/javascript-api/request.md | 0 .../3.10/develop/javascript-api/tasks.md | 0 .../3.10/develop/operational-factors.md | 0 .../3.10/develop/satellitecollections.md | 0 .../{ => arangodb}/3.10/develop/smartjoins.md | 0 .../3.10/develop/transactions/_index.md | 0 .../3.10/develop/transactions/durability.md | 0 .../transactions/javascript-transactions.md | 0 .../3.10/develop/transactions/limitations.md | 0 .../transactions/locking-and-isolation.md | 0 .../transactions/stream-transactions.md | 0 .../{ => arangodb}/3.10/get-started/_index.md | 0 .../how-to-interact-with-arangodb.md | 0 .../get-started/on-premises-installation.md | 6 +- .../get-started/set-up-a-cloud-instance.md | 56 +- .../3.10/get-started/start-using-aql.md | 0 .../{ => arangodb}/3.10/graphs/_index.md | 14 +- .../3.10/graphs/enterprisegraphs/_index.md | 0 .../enterprisegraphs/getting-started.md | 2 +- .../graphs/enterprisegraphs/management.md | 0 .../3.10}/graphs/example-graphs.md | 16 +- .../3.10/graphs/general-graphs/_index.md | 2 +- .../3.10}/graphs/general-graphs/functions.md | 2 +- .../3.10/graphs/general-graphs/management.md | 0 .../3.10/graphs/satellitegraphs/_index.md | 2 +- .../3.10/graphs/satellitegraphs/details.md | 0 .../3.10/graphs/satellitegraphs/management.md | 0 .../3.10/graphs/smartgraphs/_index.md | 8 +- .../graphs/smartgraphs/getting-started.md | 2 +- .../3.10/graphs/smartgraphs/management.md | 0 .../testing-graphs-on-single-server.md | 0 .../3.10/graphs/working-with-edges.md | 0 .../3.10/index-and-search/_index.md | 0 .../3.10/index-and-search/analyzers.md | 0 .../index-and-search/arangosearch/_index.md | 2 +- .../arangosearch-views-reference.md | 0 .../case-sensitivity-and-diacritics.md | 0 .../arangosearch/exact-value-matching.md | 0 .../arangosearch/example-datasets.md | 0 .../arangosearch/faceted-search.md | 0 .../arangosearch/full-text-token-search.md | 0 .../arangosearch/fuzzy-search.md | 0 .../arangosearch/geospatial-search.md | 6 +- .../arangosearch/nested-search.md | 0 .../arangosearch/performance.md | 0 .../phrase-and-proximity-search.md | 0 .../arangosearch/prefix-matching.md | 0 .../arangosearch/range-queries.md | 0 .../index-and-search/arangosearch/ranking.md | 0 .../search-alias-views-reference.md | 0 .../arangosearch/search-highlighting.md | 0 .../arangosearch/wildcard-search.md | 0 .../3.10/index-and-search/indexing/_index.md | 0 .../3.10/index-and-search/indexing/basics.md | 0 .../indexing/index-utilization.md | 0 .../indexing/which-index-to-use-when.md | 0 .../indexing/working-with-indexes/_index.md | 0 .../working-with-indexes/fulltext-indexes.md | 0 .../geo-spatial-indexes.md | 0 .../working-with-indexes/inverted-indexes.md | 0 .../multi-dimensional-indexes.md | 0 .../persistent-indexes.md | 0 .../working-with-indexes/ttl-indexes.md | 0 .../vertex-centric-indexes.md | 0 .../{ => arangodb}/3.10/operations/_index.md | 0 .../3.10/operations/administration/_index.md | 0 .../administration/arangodb-starter/_index.md | 0 .../arangodb-starter/recovery-procedure.md | 0 .../arangodb-starter/removal-procedure.md | 0 .../administration/configuration.md | 0 .../administration/import-and-export.md | 0 .../administration/license-management.md | 0 .../operations/administration/log-levels.md | 0 .../administration/reduce-memory-footprint.md | 2 +- .../administration/user-management/_index.md | 0 .../user-management/in-arangosh.md | 0 .../3.10/operations/backup-and-restore.md | 0 .../3.10/operations/installation/_index.md | 2 +- .../installation/compiling/_index.md | 0 .../compiling/compile-on-debian.md | 0 .../compiling/compile-on-windows.md | 2 +- .../compiling/recompiling-jemalloc.md | 0 .../compiling/running-custom-build.md | 0 .../3.10/operations/installation/docker.md | 0 .../operations/installation/linux/_index.md | 0 .../linux/linux-os-tuning-script-examples.md | 0 .../linux/operating-system-configuration.md | 0 .../3.10/operations/installation/macos.md | 0 .../operations/installation/uninstallation.md | 0 .../3.10/operations/installation/windows.md | 0 .../3.10/operations/security/_index.md | 0 .../3.10/operations/security/audit-logging.md | 2 +- .../security/change-root-password.md | 0 .../operations/security/encryption-at-rest.md | 4 +- .../security/securing-starter-deployments.md | 0 .../operations/security/security-options.md | 0 .../3.10/operations/troubleshooting/_index.md | 0 .../operations/troubleshooting/arangod.md | 0 .../troubleshooting/cluster/_index.md | 0 .../troubleshooting/cluster/agency-dump.md | 0 .../troubleshooting/emergency-console.md | 0 .../troubleshooting/query-debug-packages.md | 0 .../3.10/operations/upgrading/_index.md | 0 .../community-to-enterprise-upgrade.md | 0 .../3.10/operations/upgrading/downgrading.md | 0 .../upgrading/manual-deployments/_index.md | 0 .../manual-deployments/active-failover.md | 0 .../upgrading/manual-deployments/cluster.md | 0 .../os-specific-information/_index.md | 0 .../os-specific-information/linux.md | 0 .../os-specific-information/macos.md | 2 +- .../os-specific-information/windows.md | 6 +- .../upgrading/starter-deployments.md | 0 .../3.10/release-notes/_index.md | 0 .../deprecated-and-removed-features.md | 0 .../3.10/release-notes/version-3.0/_index.md | 0 .../incompatible-changes-in-3-0.md | 0 .../version-3.0/whats-new-in-3-0.md | 0 .../3.10/release-notes/version-3.1/_index.md | 0 .../incompatible-changes-in-3-1.md | 0 .../version-3.1/whats-new-in-3-1.md | 0 .../3.10/release-notes/version-3.10/_index.md | 0 .../version-3.10/api-changes-in-3-10.md | 0 .../incompatible-changes-in-3-10.md | 0 .../version-3.10/known-issues-in-3-10.md | 0 .../version-3.10/whats-new-in-3-10.md | 0 .../3.10/release-notes/version-3.2/_index.md | 0 .../incompatible-changes-in-3-2.md | 0 .../version-3.2/known-issues-in-3-2.md | 0 .../version-3.2/whats-new-in-3-2.md | 0 .../3.10/release-notes/version-3.3/_index.md | 0 .../incompatible-changes-in-3-3.md | 0 .../version-3.3/known-issues-in-3-3.md | 0 .../version-3.3/whats-new-in-3-3.md | 0 .../3.10/release-notes/version-3.4/_index.md | 0 .../incompatible-changes-in-3-4.md | 0 .../version-3.4/known-issues-in-3-4.md | 0 .../version-3.4/whats-new-in-3-4.md | 0 .../3.10/release-notes/version-3.5/_index.md | 0 .../incompatible-changes-in-3-5.md | 0 .../version-3.5/known-issues-in-3-5.md | 0 .../version-3.5/whats-new-in-3-5.md | 0 .../3.10/release-notes/version-3.6/_index.md | 0 .../incompatible-changes-in-3-6.md | 0 .../version-3.6/known-issues-in-3-6.md | 0 .../version-3.6/whats-new-in-3-6.md | 0 .../3.10/release-notes/version-3.7/_index.md | 0 .../version-3.7/api-changes-in-3-7.md | 0 .../incompatible-changes-in-3-7.md | 0 .../version-3.7/known-issues-in-3-7.md | 0 .../version-3.7/whats-new-in-3-7.md | 0 .../3.10/release-notes/version-3.8/_index.md | 0 .../version-3.8/api-changes-in-3-8.md | 0 .../incompatible-changes-in-3-8.md | 0 .../version-3.8/known-issues-in-3-8.md | 0 .../version-3.8/whats-new-in-3-8.md | 0 .../3.10/release-notes/version-3.9/_index.md | 0 .../version-3.9/api-changes-in-3-9.md | 0 .../incompatible-changes-in-3-9.md | 0 .../version-3.9/known-issues-in-3-9.md | 0 .../version-3.9/whats-new-in-3-9.md | 0 site/content/{ => arangodb}/3.11/_index.md | 6 +- .../3.11/about}/_index.md | 12 +- .../3.11/about}/features/_index.md | 4 +- .../3.11/about}/features/community-edition.md | 0 .../about}/features/enterprise-edition.md | 0 .../about}/features/highlights-by-version.md | 0 .../3.11/about}/use-cases.md | 24 +- .../content/{ => arangodb}/3.11/aql/_index.md | 0 .../{ => arangodb}/3.11/aql/common-errors.md | 0 .../{ => arangodb}/3.11/aql/data-queries.md | 0 .../aql/examples-and-query-patterns/_index.md | 0 .../actors-and-movies-dataset-queries.md | 0 .../examples-and-query-patterns/counting.md | 0 .../create-test-data.md | 0 .../diffing-two-documents.md | 0 .../dynamic-attribute-names.md | 0 .../examples-and-query-patterns/grouping.md | 0 .../aql/examples-and-query-patterns/joins.md | 0 .../projections-and-filters.md | 0 .../queries-without-collections.md | 0 .../remove-vertex.md | 4 +- .../examples-and-query-patterns/traversals.md | 2 +- .../upsert-repsert-guide.md | 0 .../aql/execution-and-performance/_index.md | 0 .../caching-query-results.md | 0 .../explaining-queries.md | 0 .../parsing-queries.md | 0 .../query-optimization.md | 0 .../query-profiling.md | 0 .../query-statistics.md | 0 .../3.11/aql/functions/_index.md | 0 .../3.11/aql/functions/arangosearch.md | 0 .../3.11/aql/functions/array.md | 0 .../{ => arangodb}/3.11/aql/functions/bit.md | 0 .../{ => arangodb}/3.11/aql/functions/date.md | 0 .../3.11/aql/functions/document-object.md | 0 .../3.11/aql/functions/fulltext.md | 0 .../3.11}/aql/functions/geo.md | 6 +- .../3.11/aql/functions/miscellaneous.md | 0 .../3.11/aql/functions/numeric.md | 0 .../3.11/aql/functions/string.md | 0 .../3.11/aql/functions/type-check-and-cast.md | 0 .../3.11/aql/fundamentals/_index.md | 0 .../accessing-data-from-collections.md | 0 .../3.11/aql/fundamentals/bind-parameters.md | 0 .../3.11/aql/fundamentals/data-types.md | 0 .../3.11/aql/fundamentals/limitations.md | 0 .../3.11/aql/fundamentals/query-errors.md | 0 .../3.11/aql/fundamentals/query-results.md | 0 .../3.11/aql/fundamentals/subqueries.md | 0 .../3.11/aql/fundamentals/syntax.md | 0 .../aql/fundamentals/type-and-value-order.md | 0 .../{ => arangodb}/3.11/aql/graphs/_index.md | 0 .../3.11/aql/graphs/all-shortest-paths.md | 4 +- .../{ => arangodb}/3.11/aql/graphs/k-paths.md | 4 +- .../3.11/aql/graphs/k-shortest-paths.md | 4 +- .../3.11/aql/graphs/shortest-path.md | 4 +- .../3.11/aql/graphs/traversals-explained.md | 16 +- .../3.11/aql/graphs/traversals.md | 4 +- .../3.11/aql/high-level-operations/_index.md | 0 .../3.11/aql/high-level-operations/collect.md | 0 .../3.11/aql/high-level-operations/filter.md | 0 .../3.11/aql/high-level-operations/for.md | 0 .../3.11/aql/high-level-operations/insert.md | 0 .../3.11/aql/high-level-operations/let.md | 0 .../3.11/aql/high-level-operations/limit.md | 0 .../3.11/aql/high-level-operations/remove.md | 0 .../3.11/aql/high-level-operations/replace.md | 0 .../3.11/aql/high-level-operations/return.md | 0 .../3.11/aql/high-level-operations/search.md | 0 .../3.11/aql/high-level-operations/sort.md | 0 .../3.11/aql/high-level-operations/update.md | 0 .../3.11/aql/high-level-operations/upsert.md | 0 .../3.11/aql/high-level-operations/window.md | 0 .../3.11/aql/high-level-operations/with.md | 0 .../3.11/aql/how-to-invoke-aql/_index.md | 0 .../aql/how-to-invoke-aql/with-arangosh.md | 0 .../with-the-web-interface.md | 0 .../{ => arangodb}/3.11/aql/operators.md | 0 .../3.11/aql/user-defined-functions.md | 0 .../{ => arangodb}/3.11/components/_index.md | 0 .../3.11/components/arangodb-server/_index.md | 4 +- .../arangodb-server/environment-variables.md | 0 .../3.11/components/arangodb-server/ldap.md | 0 .../components/arangodb-server/options.md | 0 .../arangodb-server/storage-engine.md | 0 .../3.11}/components/tools/_index.md | 2 +- .../3.11/components/tools/arango-datasets.md | 0 .../components/tools/arangobackup/_index.md | 0 .../components/tools/arangobackup/examples.md | 0 .../components/tools/arangobackup/options.md | 0 .../components/tools/arangobench/_index.md | 0 .../components/tools/arangobench/options.md | 0 .../components/tools/arangodb-shell/_index.md | 0 .../tools/arangodb-shell/details.md | 0 .../tools/arangodb-shell/examples.md | 0 .../tools/arangodb-shell/options.md | 0 .../tools/arangodb-starter/_index.md | 0 .../tools/arangodb-starter/architecture.md | 0 .../tools/arangodb-starter/options.md | 0 .../tools/arangodb-starter/security.md | 0 .../components/tools/arangodump/_index.md | 0 .../components/tools/arangodump/examples.md | 0 .../tools/arangodump/limitations.md | 0 .../components/tools/arangodump/maskings.md | 0 .../components/tools/arangodump/options.md | 0 .../components/tools/arangoexport/_index.md | 0 .../components/tools/arangoexport/examples.md | 0 .../components/tools/arangoexport/options.md | 0 .../components/tools/arangoimport/_index.md | 0 .../components/tools/arangoimport/details.md | 0 .../tools/arangoimport/examples-csv.md | 0 .../tools/arangoimport/examples-json.md | 0 .../components/tools/arangoimport/options.md | 0 .../components/tools/arangoinspect/_index.md | 0 .../tools/arangoinspect/examples.md | 0 .../components/tools/arangoinspect/options.md | 0 .../components/tools/arangorestore/_index.md | 0 .../tools/arangorestore/examples.md | 0 .../components/tools/arangorestore/options.md | 0 .../components/tools/arangovpack/_index.md | 0 .../components/tools/arangovpack/options.md | 0 .../3.11/components/tools/foxx-cli/_index.md | 0 .../3.11/components/tools/foxx-cli/details.md | 0 .../3.11}/components/web-interface/_index.md | 2 +- .../3.11/components/web-interface/cluster.md | 6 +- .../components/web-interface/collections.md | 4 +- .../components/web-interface/dashboard.md | 2 +- .../components/web-interface/document.md | 2 +- .../3.11/components/web-interface/graphs.md | 4 +- .../3.11}/components/web-interface/logs.md | 2 +- .../3.11/components/web-interface/queries.md | 12 +- .../3.11/components/web-interface/services.md | 6 +- .../3.11}/components/web-interface/users.md | 6 +- .../{ => arangodb}/3.11/concepts/_index.md | 0 .../3.11/concepts/data-models.md | 0 .../3.11/concepts/data-retrieval.md | 0 .../3.11/concepts/data-structure/_index.md | 0 .../concepts/data-structure/collections.md | 0 .../3.11/concepts/data-structure/databases.md | 0 .../data-structure/documents/_index.md | 0 .../documents/computed-values.md | 0 .../documents/schema-validation.md | 0 .../3.11/concepts/data-structure/views.md | 0 .../3.11/data-science/_index.md | 10 +- .../3.11/data-science/adapters/_index.md | 0 .../adapters/arangodb-cugraph-adapter.md | 0 .../adapters/arangodb-dgl-adapter.md | 0 .../adapters/arangodb-networkx-adapter.md | 0 .../adapters/arangodb-pyg-adapter.md | 0 .../adapters/arangodb-rdf-adapter.md | 0 .../data-science/arangograph-notebooks.md | 22 + .../3.11/data-science/arangographml/_index.md | 4 +- .../3.11/data-science/arangographml/deploy.md | 4 +- .../arangographml/getting-started.md | 4 +- .../3.11/data-science/graph-analytics.md | 12 +- .../3.11/data-science/llm-knowledge-graphs.md | 2 +- .../3.11/data-science/pregel/_index.md | 0 .../3.11/data-science/pregel/algorithms.md | 6 +- .../{ => arangodb}/3.11/deploy/_index.md | 4 +- .../3.11/deploy/active-failover/_index.md | 2 +- .../deploy/active-failover/administration.md | 0 .../deploy/active-failover/manual-start.md | 0 .../using-the-arangodb-starter.md | 0 .../3.11/deploy/arangosync/_index.md | 2 +- .../3.11/deploy/arangosync/administration.md | 0 .../deploy/arangosync/deployment/_index.md | 0 .../arangosync/deployment/arangodb-cluster.md | 0 .../deployment/arangosync-master.md | 0 .../deployment/arangosync-workers.md | 0 .../deployment/prometheus-and-grafana.md | 0 .../3.11/deploy/arangosync/monitoring.md | 0 .../arangosync/operations-and-maintenance.md | 0 .../3.11/deploy/arangosync/security.md | 0 .../3.11/deploy/arangosync/troubleshooting.md | 0 .../3.11/deploy/architecture/_index.md | 0 .../3.11/deploy/architecture/data-sharding.md | 4 +- .../3.11/deploy/architecture/replication.md | 0 .../3.11/deploy/architecture/scalability.md | 0 .../3.11/deploy/cluster/_index.md | 6 +- .../3.11/deploy/cluster/administration.md | 0 .../3.11/deploy/cluster/deployment/_index.md | 2 +- .../deploy/cluster/deployment/manual-start.md | 0 .../deployment/using-the-arangodb-starter.md | 0 .../3.11/deploy/cluster/limitations.md | 0 .../3.11/deploy/in-the-cloud.md | 0 .../{ => arangodb}/3.11/deploy/kubernetes.md | 0 .../3.11}/deploy/oneshard.md | 2 +- .../3.11/deploy/production-checklist.md | 0 .../3.11/deploy/single-instance-vs-cluster.md | 0 .../3.11/deploy/single-instance/_index.md | 0 .../deploy/single-instance/manual-start.md | 0 .../using-the-arangodb-starter.md | 0 .../{ => arangodb}/3.11/develop/_index.md | 0 .../3.11/develop/drivers/_index.md | 0 .../{ => arangodb}/3.11/develop/drivers/go.md | 0 .../3.11/develop/drivers/java/_index.md | 0 .../java/reference-version-6/_index.md | 0 .../java/reference-version-6/driver-setup.md | 0 .../java/reference-version-6/serialization.md | 0 .../java/reference-version-7/_index.md | 0 .../changes-in-version-7.md | 0 .../java/reference-version-7/driver-setup.md | 0 .../java/reference-version-7/serialization.md | 0 .../3.11/develop/drivers/javascript.md | 0 .../3.11/develop/drivers/python.md | 0 .../3.11/develop/error-codes.md | 0 .../{ => arangodb}/3.11/develop/exit-codes.md | 0 .../3.11/develop/foxx-microservices/_index.md | 0 .../develop/foxx-microservices/deployment.md | 0 .../foxx-microservices/getting-started.md | 0 .../foxx-microservices/guides/_index.md | 0 .../guides/access-from-the-browser.md | 0 .../guides/authentication-and-sessions.md | 0 .../guides/development-mode.md | 0 .../guides/foxx-in-a-cluster.md | 0 .../guides/linking-services-together.md | 0 .../guides/making-requests.md | 0 .../guides/scripts-and-scheduling.md | 0 .../guides/testing-foxx-services.md | 0 .../guides/using-node-modules.md | 0 .../guides/using-webpack-with-foxx.md | 0 .../guides/working-with-collections.md | 0 .../guides/working-with-files.md | 0 .../guides/working-with-routers.md | 0 .../guides/writing-queries.md | 0 .../foxx-microservices/reference/_index.md | 0 .../reference/configuration.md | 0 .../reference/related-modules/_index.md | 0 .../related-modules/authentication.md | 0 .../reference/related-modules/graphql.md | 0 .../reference/related-modules/oauth-1-0a.md | 0 .../reference/related-modules/oauth-2-0.md | 0 .../reference/related-modules/queues.md | 0 .../reference/routers/_index.md | 0 .../reference/routers/endpoints.md | 0 .../reference/routers/middleware.md | 0 .../reference/routers/request.md | 0 .../reference/routers/response.md | 0 .../reference/service-context.md | 0 .../reference/service-manifest.md | 0 .../reference/sessions-middleware/_index.md | 0 .../session-storages/_index.md | 0 .../session-storages/collection-storage.md | 0 .../session-storages/jwt-storage.md | 0 .../session-transports/_index.md | 0 .../session-transports/cookie-transport.md | 0 .../session-transports/header-transport.md | 0 .../3.11/develop/http-api/_index.md | 2 +- .../3.11/develop/http-api/administration.md | 0 .../3.11/develop/http-api/analyzers.md | 0 .../3.11/develop/http-api/authentication.md | 0 .../3.11/develop/http-api/batch-requests.md | 0 .../3.11/develop/http-api/cluster.md | 0 .../3.11/develop/http-api/collections.md | 0 .../3.11/develop/http-api/databases.md | 0 .../3.11/develop/http-api/documents.md | 0 .../3.11/develop/http-api/foxx.md | 0 .../http-api/general-request-handling.md | 0 .../3.11/develop/http-api/graphs/_index.md | 0 .../3.11/develop/http-api/graphs/edges.md | 0 .../develop/http-api/graphs/named-graphs.md | 4 +- .../3.11/develop/http-api/hot-backups.md | 0 .../3.11/develop/http-api/import.md | 0 .../3.11/develop/http-api/indexes/_index.md | 0 .../3.11/develop/http-api/indexes/fulltext.md | 0 .../develop/http-api/indexes/geo-spatial.md | 0 .../3.11/develop/http-api/indexes/inverted.md | 0 .../http-api/indexes/multi-dimensional.md | 0 .../develop/http-api/indexes/persistent.md | 0 .../3.11/develop/http-api/indexes/ttl.md | 0 .../3.11/develop/http-api/jobs.md | 0 .../develop/http-api/monitoring/_index.md | 0 .../3.11/develop/http-api/monitoring/logs.md | 0 .../develop/http-api/monitoring/metrics.md | 0 .../develop/http-api/monitoring/statistics.md | 0 .../3.11/develop/http-api/pregel.md | 0 .../3.11/develop/http-api/queries/_index.md | 0 .../develop/http-api/queries/aql-queries.md | 0 .../queries/aql-query-results-cache.md | 0 .../queries/user-defined-aql-functions.md | 0 .../develop/http-api/replication/_index.md | 0 .../replication/other-replication-commands.md | 0 .../replication/replication-applier.md | 0 .../http-api/replication/replication-dump.md | 0 .../replication/replication-logger.md | 0 .../http-api/replication/write-ahead-log.md | 0 .../3.11/develop/http-api/security.md | 0 .../3.11/develop/http-api/tasks.md | 0 .../develop/http-api/transactions/_index.md | 0 .../transactions/javascript-transactions.md | 0 .../transactions/stream-transactions.md | 0 .../3.11/develop/http-api/users.md | 0 .../3.11/develop/http-api/views/_index.md | 0 .../http-api/views/arangosearch-views.md | 0 .../http-api/views/search-alias-views.md | 0 .../3.11/develop/integrations/_index.md | 0 .../arangodb-datasource-for-apache-spark.md | 2 +- .../_index.md | 0 .../configuration.md | 0 .../integrations/spring-boot-arangodb.md | 0 .../spring-data-arangodb/_index.md | 0 .../spring-data-arangodb/migration.md | 0 .../reference-version-3/_index.md | 0 .../reference-version-3/mapping/_index.md | 0 .../reference-version-3/mapping/auditing.md | 0 .../reference-version-3/mapping/converter.md | 0 .../reference-version-3/mapping/document.md | 0 .../reference-version-3/mapping/edge.md | 0 .../reference-version-3/mapping/events.md | 0 .../reference-version-3/mapping/indexes.md | 0 .../reference-version-3/mapping/reference.md | 0 .../reference-version-3/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-3/template.md | 0 .../reference-version-4/_index.md | 0 .../reference-version-4/mapping/_index.md | 0 .../reference-version-4/mapping/auditing.md | 0 .../mapping/computed-values.md | 0 .../reference-version-4/mapping/converter.md | 0 .../reference-version-4/mapping/document.md | 0 .../reference-version-4/mapping/edge.md | 0 .../reference-version-4/mapping/events.md | 0 .../reference-version-4/mapping/indexes.md | 0 .../reference-version-4/mapping/reference.md | 0 .../reference-version-4/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-4/template.md | 0 .../javascript-api/@arangodb/_index.md | 0 .../@arangodb/collection-object.md | 0 .../javascript-api/@arangodb/cursor-object.md | 0 .../javascript-api/@arangodb/db-object.md | 0 .../javascript-api/@arangodb/view-object.md | 0 .../3.11/develop/javascript-api/_index.md | 0 .../3.11/develop/javascript-api/actions.md | 0 .../3.11/develop/javascript-api/analyzers.md | 0 .../develop/javascript-api/aql-queries.md | 0 .../3.11/develop/javascript-api/console.md | 0 .../3.11/develop/javascript-api/crypto.md | 0 .../3.11/develop/javascript-api/fs.md | 0 .../3.11/develop/javascript-api/request.md | 0 .../3.11/develop/javascript-api/tasks.md | 0 .../3.11/develop/operational-factors.md | 0 .../3.11/develop/satellitecollections.md | 0 .../{ => arangodb}/3.11/develop/smartjoins.md | 0 .../3.11/develop/transactions/_index.md | 0 .../3.11/develop/transactions/durability.md | 0 .../transactions/javascript-transactions.md | 0 .../3.11/develop/transactions/limitations.md | 0 .../transactions/locking-and-isolation.md | 0 .../transactions/stream-transactions.md | 0 .../{ => arangodb}/3.11/get-started/_index.md | 0 .../how-to-interact-with-arangodb.md | 0 .../get-started/on-premises-installation.md | 6 +- .../get-started/set-up-a-cloud-instance.md | 56 +- .../get-started/start-using-aql/_index.md | 0 .../3.11/get-started/start-using-aql/crud.md | 0 .../get-started/start-using-aql/dataset.md | 0 .../get-started/start-using-aql/filter.md | 0 .../3.11/get-started/start-using-aql/geo.md | 0 .../get-started/start-using-aql/graphs.md | 4 +- .../3.11/get-started/start-using-aql/joins.md | 0 .../get-started/start-using-aql/sort-limit.md | 0 .../{ => arangodb}/3.11/graphs/_index.md | 14 +- .../3.11/graphs/enterprisegraphs/_index.md | 0 .../enterprisegraphs/getting-started.md | 2 +- .../graphs/enterprisegraphs/management.md | 0 .../3.11}/graphs/example-graphs.md | 16 +- .../3.11/graphs/general-graphs/_index.md | 2 +- .../3.11}/graphs/general-graphs/functions.md | 2 +- .../3.11/graphs/general-graphs/management.md | 0 .../3.11/graphs/satellitegraphs/_index.md | 2 +- .../3.11/graphs/satellitegraphs/details.md | 0 .../3.11/graphs/satellitegraphs/management.md | 0 .../3.11/graphs/smartgraphs/_index.md | 8 +- .../graphs/smartgraphs/getting-started.md | 2 +- .../3.11/graphs/smartgraphs/management.md | 0 .../testing-graphs-on-single-server.md | 0 .../3.11/graphs/working-with-edges.md | 0 .../3.11/index-and-search/_index.md | 0 .../3.11/index-and-search/analyzers.md | 0 .../index-and-search/arangosearch/_index.md | 2 +- .../arangosearch-views-reference.md | 2 +- .../case-sensitivity-and-diacritics.md | 0 .../arangosearch/exact-value-matching.md | 0 .../arangosearch/example-datasets.md | 0 .../arangosearch/faceted-search.md | 0 .../arangosearch/full-text-token-search.md | 0 .../arangosearch/fuzzy-search.md | 0 .../arangosearch/geospatial-search.md | 6 +- .../arangosearch/nested-search.md | 0 .../arangosearch/performance.md | 0 .../phrase-and-proximity-search.md | 0 .../arangosearch/prefix-matching.md | 0 .../arangosearch/range-queries.md | 0 .../index-and-search/arangosearch/ranking.md | 0 .../search-alias-views-reference.md | 2 +- .../arangosearch/search-highlighting.md | 0 .../arangosearch/wildcard-search.md | 0 .../3.11/index-and-search/indexing/_index.md | 0 .../3.11/index-and-search/indexing/basics.md | 0 .../indexing/index-utilization.md | 0 .../indexing/which-index-to-use-when.md | 0 .../indexing/working-with-indexes/_index.md | 0 .../working-with-indexes/fulltext-indexes.md | 0 .../geo-spatial-indexes.md | 0 .../working-with-indexes/inverted-indexes.md | 0 .../multi-dimensional-indexes.md | 0 .../persistent-indexes.md | 0 .../working-with-indexes/ttl-indexes.md | 0 .../vertex-centric-indexes.md | 0 .../{ => arangodb}/3.11/operations/_index.md | 0 .../3.11/operations/administration/_index.md | 0 .../administration/arangodb-starter/_index.md | 0 .../arangodb-starter/recovery-procedure.md | 0 .../arangodb-starter/removal-procedure.md | 0 .../administration/configuration.md | 0 .../administration/import-and-export.md | 0 .../administration/license-management.md | 0 .../operations/administration/log-levels.md | 0 .../administration/reduce-memory-footprint.md | 2 +- .../operations/administration/telemetrics.md | 0 .../administration/user-management/_index.md | 0 .../user-management/in-arangosh.md | 0 .../3.11/operations/backup-and-restore.md | 0 .../3.11/operations/installation/_index.md | 2 +- .../installation/compiling/_index.md | 0 .../compiling/compile-on-debian.md | 0 .../compiling/compile-on-windows.md | 2 +- .../compiling/recompiling-jemalloc.md | 0 .../compiling/running-custom-build.md | 0 .../3.11/operations/installation/docker.md | 0 .../operations/installation/linux/_index.md | 0 .../linux/linux-os-tuning-script-examples.md | 0 .../linux/operating-system-configuration.md | 0 .../3.11/operations/installation/macos.md | 0 .../operations/installation/uninstallation.md | 0 .../3.11/operations/installation/windows.md | 0 .../3.11/operations/security/_index.md | 0 .../3.11/operations/security/audit-logging.md | 2 +- .../security/change-root-password.md | 0 .../operations/security/encryption-at-rest.md | 4 +- .../security/securing-starter-deployments.md | 0 .../operations/security/security-options.md | 0 .../3.11/operations/troubleshooting/_index.md | 0 .../operations/troubleshooting/arangod.md | 0 .../troubleshooting/cluster/_index.md | 0 .../troubleshooting/cluster/agency-dump.md | 0 .../troubleshooting/emergency-console.md | 0 .../troubleshooting/query-debug-packages.md | 0 .../3.11/operations/upgrading/_index.md | 0 .../community-to-enterprise-upgrade.md | 0 .../3.11/operations/upgrading/downgrading.md | 0 .../upgrading/manual-deployments/_index.md | 0 .../manual-deployments/active-failover.md | 0 .../upgrading/manual-deployments/cluster.md | 0 .../os-specific-information/_index.md | 0 .../os-specific-information/linux.md | 0 .../os-specific-information/macos.md | 2 +- .../os-specific-information/windows.md | 6 +- .../upgrading/starter-deployments.md | 0 .../3.11/release-notes/_index.md | 0 .../deprecated-and-removed-features.md | 0 .../3.11/release-notes/version-3.0/_index.md | 0 .../incompatible-changes-in-3-0.md | 0 .../version-3.0/whats-new-in-3-0.md | 0 .../3.11/release-notes/version-3.1/_index.md | 0 .../incompatible-changes-in-3-1.md | 0 .../version-3.1/whats-new-in-3-1.md | 0 .../3.11/release-notes/version-3.10/_index.md | 0 .../version-3.10/api-changes-in-3-10.md | 0 .../incompatible-changes-in-3-10.md | 0 .../version-3.10/known-issues-in-3-10.md | 0 .../version-3.10/whats-new-in-3-10.md | 0 .../3.11/release-notes/version-3.11/_index.md | 0 .../version-3.11/api-changes-in-3-11.md | 0 .../incompatible-changes-in-3-11.md | 0 .../version-3.11/known-issues-in-3-11.md | 0 .../version-3.11/whats-new-in-3-11.md | 2 +- .../3.11/release-notes/version-3.2/_index.md | 0 .../incompatible-changes-in-3-2.md | 0 .../version-3.2/known-issues-in-3-2.md | 0 .../version-3.2/whats-new-in-3-2.md | 0 .../3.11/release-notes/version-3.3/_index.md | 0 .../incompatible-changes-in-3-3.md | 0 .../version-3.3/known-issues-in-3-3.md | 0 .../version-3.3/whats-new-in-3-3.md | 0 .../3.11/release-notes/version-3.4/_index.md | 0 .../incompatible-changes-in-3-4.md | 0 .../version-3.4/known-issues-in-3-4.md | 0 .../version-3.4/whats-new-in-3-4.md | 0 .../3.11/release-notes/version-3.5/_index.md | 0 .../incompatible-changes-in-3-5.md | 0 .../version-3.5/known-issues-in-3-5.md | 0 .../version-3.5/whats-new-in-3-5.md | 0 .../3.11/release-notes/version-3.6/_index.md | 0 .../incompatible-changes-in-3-6.md | 0 .../version-3.6/known-issues-in-3-6.md | 0 .../version-3.6/whats-new-in-3-6.md | 0 .../3.11/release-notes/version-3.7/_index.md | 0 .../version-3.7/api-changes-in-3-7.md | 0 .../incompatible-changes-in-3-7.md | 0 .../version-3.7/known-issues-in-3-7.md | 0 .../version-3.7/whats-new-in-3-7.md | 0 .../3.11/release-notes/version-3.8/_index.md | 0 .../version-3.8/api-changes-in-3-8.md | 0 .../incompatible-changes-in-3-8.md | 0 .../version-3.8/known-issues-in-3-8.md | 0 .../version-3.8/whats-new-in-3-8.md | 0 .../3.11/release-notes/version-3.9/_index.md | 0 .../version-3.9/api-changes-in-3-9.md | 0 .../incompatible-changes-in-3-9.md | 0 .../version-3.9/known-issues-in-3-9.md | 0 .../version-3.9/whats-new-in-3-9.md | 0 site/content/{ => arangodb}/3.12/_index.md | 17 +- .../3.12/about}/_index.md | 12 +- .../3.12/about}/features/_index.md | 8 +- .../about}/features/highlights-by-version.md | 0 .../3.12/about/features/list.md} | 0 .../3.12/about}/use-cases.md | 24 +- .../content/{ => arangodb}/3.12/aql/_index.md | 2 +- .../{ => arangodb}/3.12/aql/common-errors.md | 0 .../{ => arangodb}/3.12/aql/data-queries.md | 0 .../aql/examples-and-query-patterns/_index.md | 0 .../actors-and-movies-dataset-queries.md | 0 .../examples-and-query-patterns/counting.md | 0 .../create-test-data.md | 0 .../diffing-two-documents.md | 0 .../dynamic-attribute-names.md | 0 .../examples-and-query-patterns/grouping.md | 0 .../aql/examples-and-query-patterns/joins.md | 0 .../projections-and-filters.md | 0 .../queries-without-collections.md | 0 .../remove-nodes.md | 4 +- .../examples-and-query-patterns/traversals.md | 2 +- .../upsert-repsert-guide.md | 0 .../aql/execution-and-performance/_index.md | 0 .../caching-query-plans.md | 0 .../caching-query-results.md | 0 .../explaining-queries.md | 0 .../parsing-queries.md | 0 .../query-logging.md | 0 .../query-optimization.md | 0 .../query-profiling.md | 0 .../query-statistics.md | 0 .../3.12/aql/functions/_index.md | 0 .../3.12/aql/functions/arangosearch.md | 0 .../3.12/aql/functions/array.md | 0 .../{ => arangodb}/3.12/aql/functions/bit.md | 0 .../{ => arangodb}/3.12/aql/functions/date.md | 0 .../3.12/aql/functions/document-object.md | 0 .../3.12/aql/functions/fulltext.md | 0 .../3.12}/aql/functions/geo.md | 6 +- .../3.12/aql/functions/miscellaneous.md | 0 .../3.12/aql/functions/numeric.md | 0 .../3.12/aql/functions/string.md | 0 .../3.12/aql/functions/type-check-and-cast.md | 0 .../3.12}/aql/functions/vector.md | 2 +- .../3.12/aql/fundamentals/_index.md | 0 .../accessing-data-from-collections.md | 0 .../3.12/aql/fundamentals/bind-parameters.md | 0 .../3.12/aql/fundamentals/data-types.md | 0 .../3.12/aql/fundamentals/limitations.md | 0 .../3.12/aql/fundamentals/query-errors.md | 0 .../3.12/aql/fundamentals/query-results.md | 0 .../3.12/aql/fundamentals/subqueries.md | 0 .../3.12/aql/fundamentals/syntax.md | 0 .../aql/fundamentals/type-and-value-order.md | 0 .../{ => arangodb}/3.12/aql/graphs/_index.md | 0 .../3.12/aql/graphs/all-shortest-paths.md | 4 +- .../{ => arangodb}/3.12/aql/graphs/k-paths.md | 4 +- .../3.12}/aql/graphs/k-shortest-paths.md | 4 +- .../3.12}/aql/graphs/shortest-path.md | 4 +- .../3.12}/aql/graphs/traversals-explained.md | 16 +- .../3.12/aql/graphs/traversals.md | 4 +- .../3.12/aql/high-level-operations/_index.md | 0 .../3.12/aql/high-level-operations/collect.md | 0 .../3.12/aql/high-level-operations/filter.md | 0 .../3.12/aql/high-level-operations/for.md | 0 .../3.12/aql/high-level-operations/insert.md | 0 .../3.12/aql/high-level-operations/let.md | 0 .../3.12/aql/high-level-operations/limit.md | 0 .../3.12/aql/high-level-operations/remove.md | 0 .../3.12/aql/high-level-operations/replace.md | 0 .../3.12/aql/high-level-operations/return.md | 0 .../3.12/aql/high-level-operations/search.md | 0 .../3.12/aql/high-level-operations/sort.md | 0 .../3.12/aql/high-level-operations/update.md | 0 .../3.12/aql/high-level-operations/upsert.md | 0 .../3.12/aql/high-level-operations/window.md | 0 .../3.12/aql/high-level-operations/with.md | 0 .../3.12/aql/how-to-invoke-aql/_index.md | 0 .../aql/how-to-invoke-aql/with-arangosh.md | 0 .../with-the-web-interface.md | 0 .../{ => arangodb}/3.12/aql/operators.md | 0 .../3.12/aql/user-defined-functions.md | 0 .../{ => arangodb}/3.12/components/_index.md | 0 .../3.12/components/arangodb-server/_index.md | 0 .../arangodb-server/environment-variables.md | 0 .../components/arangodb-server/options.md | 0 .../arangodb-server/storage-engine.md | 0 .../3.12}/components/tools/_index.md | 2 +- .../3.12/components/tools/arango-datasets.md | 0 .../components/tools/arangobackup/_index.md | 4 +- .../components/tools/arangobackup/examples.md | 0 .../components/tools/arangobackup/options.md | 0 .../components/tools/arangobench/_index.md | 0 .../components/tools/arangobench/options.md | 0 .../components/tools/arangodb-shell/_index.md | 0 .../tools/arangodb-shell/details.md | 0 .../tools/arangodb-shell/examples.md | 0 .../tools/arangodb-shell/options.md | 0 .../tools/arangodb-starter/_index.md | 0 .../tools/arangodb-starter/architecture.md | 0 .../tools/arangodb-starter/options.md | 0 .../tools/arangodb-starter/security.md | 0 .../components/tools/arangodump/_index.md | 0 .../components/tools/arangodump/examples.md | 0 .../tools/arangodump/limitations.md | 0 .../components/tools/arangodump/maskings.md | 0 .../components/tools/arangodump/options.md | 0 .../components/tools/arangoexport/_index.md | 0 .../components/tools/arangoexport/examples.md | 0 .../components/tools/arangoexport/options.md | 0 .../components/tools/arangoimport/_index.md | 0 .../components/tools/arangoimport/details.md | 0 .../tools/arangoimport/examples-csv.md | 0 .../tools/arangoimport/examples-json.md | 0 .../components/tools/arangoimport/options.md | 0 .../components/tools/arangoinspect/_index.md | 0 .../tools/arangoinspect/examples.md | 0 .../components/tools/arangoinspect/options.md | 0 .../components/tools/arangorestore/_index.md | 0 .../tools/arangorestore/examples.md | 0 .../components/tools/arangorestore/options.md | 0 .../components/tools/arangovpack/_index.md | 0 .../components/tools/arangovpack/options.md | 0 .../3.12/components/tools/foxx-cli/_index.md | 0 .../3.12/components/tools/foxx-cli/details.md | 0 .../3.12/components/web-interface/_index.md | 2 +- .../3.12/components/web-interface/cluster.md | 2 +- .../components/web-interface/collections.md | 0 .../components/web-interface/dashboard.md | 2 +- .../3.12/components/web-interface/document.md | 0 .../3.12}/components/web-interface/graphs.md | 2 +- .../3.12/components/web-interface/logs.md | 0 .../3.12/components/web-interface/queries.md | 2 +- .../3.12/components/web-interface/services.md | 0 .../3.12/components/web-interface/users.md | 0 .../{ => arangodb}/3.12/concepts/_index.md | 0 .../3.12/concepts/data-models.md | 0 .../3.12/concepts/data-retrieval.md | 0 .../3.12/concepts/data-structure/_index.md | 0 .../concepts/data-structure/collections.md | 0 .../3.12/concepts/data-structure/databases.md | 0 .../data-structure/documents/_index.md | 0 .../documents/computed-values.md | 0 .../documents/schema-validation.md | 0 .../3.12/concepts/data-structure/views.md | 0 .../{ => arangodb}/3.12/deploy/_index.md | 8 +- .../3.12/deploy/architecture/_index.md | 0 .../3.12/deploy/architecture/data-sharding.md | 4 +- .../3.12/deploy/architecture/replication.md | 0 .../3.12/deploy/architecture/scalability.md | 0 .../3.12/deploy/cluster/_index.md | 6 +- .../3.12/deploy/cluster/administration.md | 0 .../3.12/deploy/cluster/deployment/_index.md | 2 +- .../deploy/cluster/deployment/manual-start.md | 0 .../deployment/using-the-arangodb-starter.md | 0 .../3.12/deploy/cluster/limitations.md | 0 .../3.12/deploy/in-the-cloud.md | 0 .../{ => arangodb}/3.12/deploy/kubernetes.md | 0 .../{ => arangodb}/3.12/deploy/oneshard.md | 2 +- .../3.12/deploy/production-checklist.md | 0 .../3.12/deploy/single-instance-vs-cluster.md | 0 .../3.12/deploy/single-instance/_index.md | 0 .../deploy/single-instance/manual-start.md | 0 .../using-the-arangodb-starter.md | 0 .../{ => arangodb}/3.12/develop/_index.md | 0 .../3.12/develop/drivers/_index.md | 0 .../{ => arangodb}/3.12/develop/drivers/go.md | 0 .../3.12/develop/drivers/java/_index.md | 0 .../java/reference-version-6/_index.md | 0 .../java/reference-version-6/driver-setup.md | 0 .../java/reference-version-6/serialization.md | 0 .../java/reference-version-7/_index.md | 0 .../changes-in-version-7.md | 0 .../java/reference-version-7/driver-setup.md | 0 .../java/reference-version-7/serialization.md | 0 .../3.12/develop/drivers/javascript.md | 0 .../3.12/develop/drivers/python.md | 0 .../3.12/develop/error-codes.md | 0 .../{ => arangodb}/3.12/develop/exit-codes.md | 0 .../3.12/develop/foxx-microservices/_index.md | 0 .../develop/foxx-microservices/deployment.md | 0 .../foxx-microservices/getting-started.md | 0 .../foxx-microservices/guides/_index.md | 0 .../guides/access-from-the-browser.md | 0 .../guides/authentication-and-sessions.md | 0 .../guides/development-mode.md | 0 .../guides/foxx-in-a-cluster.md | 0 .../guides/linking-services-together.md | 0 .../guides/making-requests.md | 0 .../guides/scripts-and-scheduling.md | 0 .../guides/testing-foxx-services.md | 0 .../guides/using-node-modules.md | 0 .../guides/using-webpack-with-foxx.md | 0 .../guides/working-with-collections.md | 0 .../guides/working-with-files.md | 0 .../guides/working-with-routers.md | 0 .../guides/writing-queries.md | 0 .../foxx-microservices/reference/_index.md | 0 .../reference/configuration.md | 0 .../reference/related-modules/_index.md | 0 .../related-modules/authentication.md | 0 .../reference/related-modules/graphql.md | 0 .../reference/related-modules/oauth-1-0a.md | 0 .../reference/related-modules/oauth-2-0.md | 0 .../reference/related-modules/queues.md | 0 .../reference/routers/_index.md | 0 .../reference/routers/endpoints.md | 0 .../reference/routers/middleware.md | 0 .../reference/routers/request.md | 0 .../reference/routers/response.md | 0 .../reference/service-context.md | 0 .../reference/service-manifest.md | 0 .../reference/sessions-middleware/_index.md | 0 .../session-storages/_index.md | 0 .../session-storages/collection-storage.md | 0 .../session-storages/jwt-storage.md | 0 .../session-transports/_index.md | 0 .../session-transports/cookie-transport.md | 0 .../session-transports/header-transport.md | 0 .../3.12/develop/http-api/_index.md | 2 +- .../3.12/develop/http-api/administration.md | 0 .../3.12/develop/http-api/analyzers.md | 0 .../3.12/develop/http-api/authentication.md | 2 +- .../3.12/develop/http-api/batch-requests.md | 0 .../3.12/develop/http-api/cluster.md | 0 .../3.12/develop/http-api/collections.md | 0 .../3.12/develop/http-api/databases.md | 0 .../3.12/develop/http-api/documents.md | 0 .../3.12/develop/http-api/foxx.md | 0 .../http-api/general-request-handling.md | 0 .../3.12/develop/http-api/graphs/_index.md | 0 .../3.12/develop/http-api/graphs/edges.md | 0 .../develop/http-api/graphs/named-graphs.md | 4 +- .../3.12/develop/http-api/hot-backups.md | 4 +- .../3.12/develop/http-api/import.md | 0 .../3.12/develop/http-api/indexes/_index.md | 0 .../3.12/develop/http-api/indexes/fulltext.md | 0 .../develop/http-api/indexes/geo-spatial.md | 0 .../3.12/develop/http-api/indexes/inverted.md | 0 .../http-api/indexes/multi-dimensional.md | 0 .../develop/http-api/indexes/persistent.md | 0 .../3.12/develop/http-api/indexes/ttl.md | 0 .../3.12/develop/http-api/indexes/vector.md | 0 .../3.12/develop/http-api/jobs.md | 0 .../develop/http-api/monitoring/_index.md | 0 .../3.12/develop/http-api/monitoring/logs.md | 0 .../develop/http-api/monitoring/metrics.md | 0 .../develop/http-api/monitoring/statistics.md | 0 .../3.12/develop/http-api/queries/_index.md | 0 .../develop/http-api/queries/aql-queries.md | 0 .../http-api/queries/aql-query-plan-cache.md | 0 .../queries/aql-query-results-cache.md | 0 .../queries/user-defined-aql-functions.md | 0 .../develop/http-api/replication/_index.md | 0 .../replication/other-replication-commands.md | 0 .../replication/replication-applier.md | 0 .../http-api/replication/replication-dump.md | 0 .../replication/replication-logger.md | 0 .../http-api/replication/write-ahead-log.md | 0 .../3.12/develop/http-api/security.md | 0 .../3.12/develop/http-api/tasks.md | 0 .../develop/http-api/transactions/_index.md | 0 .../transactions/javascript-transactions.md | 0 .../transactions/stream-transactions.md | 0 .../3.12/develop/http-api/users.md | 0 .../3.12/develop/http-api/views/_index.md | 0 .../http-api/views/arangosearch-views.md | 0 .../http-api/views/search-alias-views.md | 0 .../3.12/develop/integrations/_index.md | 0 .../arangodb-datasource-for-apache-spark.md | 2 +- .../_index.md | 0 .../configuration.md | 0 .../integrations/spring-boot-arangodb.md | 0 .../spring-data-arangodb/_index.md | 0 .../spring-data-arangodb/migration.md | 0 .../reference-version-3/_index.md | 0 .../reference-version-3/mapping/_index.md | 0 .../reference-version-3/mapping/auditing.md | 0 .../reference-version-3/mapping/converter.md | 0 .../reference-version-3/mapping/document.md | 0 .../reference-version-3/mapping/edge.md | 0 .../reference-version-3/mapping/events.md | 0 .../reference-version-3/mapping/indexes.md | 0 .../reference-version-3/mapping/reference.md | 0 .../reference-version-3/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-3/template.md | 0 .../reference-version-4/_index.md | 0 .../reference-version-4/mapping/_index.md | 0 .../reference-version-4/mapping/auditing.md | 0 .../mapping/computed-values.md | 0 .../reference-version-4/mapping/converter.md | 0 .../reference-version-4/mapping/document.md | 0 .../reference-version-4/mapping/edge.md | 0 .../reference-version-4/mapping/events.md | 0 .../reference-version-4/mapping/indexes.md | 0 .../reference-version-4/mapping/reference.md | 0 .../reference-version-4/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-4/template.md | 0 .../javascript-api/@arangodb/_index.md | 0 .../@arangodb/collection-object.md | 0 .../javascript-api/@arangodb/cursor-object.md | 0 .../javascript-api/@arangodb/db-object.md | 0 .../javascript-api/@arangodb/view-object.md | 0 .../3.12/develop/javascript-api/_index.md | 0 .../3.12/develop/javascript-api/actions.md | 0 .../3.12/develop/javascript-api/analyzers.md | 0 .../develop/javascript-api/aql-queries.md | 0 .../3.12/develop/javascript-api/console.md | 0 .../3.12/develop/javascript-api/crypto.md | 0 .../3.12/develop/javascript-api/fs.md | 0 .../3.12/develop/javascript-api/request.md | 0 .../3.12/develop/javascript-api/tasks.md | 0 .../3.12/develop/operational-factors.md | 0 .../3.12/develop/satellitecollections.md | 0 .../{ => arangodb}/3.12/develop/smartjoins.md | 0 .../3.12/develop/transactions/_index.md | 0 .../3.12/develop/transactions/durability.md | 0 .../transactions/javascript-transactions.md | 0 .../3.12/develop/transactions/limitations.md | 0 .../transactions/locking-and-isolation.md | 0 .../transactions/stream-transactions.md | 0 .../{ => arangodb}/3.12/get-started/_index.md | 0 .../how-to-interact-with-arangodb.md | 0 .../get-started/on-premises-installation.md | 6 +- .../get-started/set-up-a-cloud-instance.md | 54 +- .../get-started/start-using-aql/_index.md | 0 .../3.12/get-started/start-using-aql/crud.md | 0 .../get-started/start-using-aql/dataset.md | 0 .../get-started/start-using-aql/filter.md | 0 .../3.12/get-started/start-using-aql/geo.md | 0 .../get-started/start-using-aql/graphs.md | 4 +- .../3.12/get-started/start-using-aql/joins.md | 0 .../get-started/start-using-aql/sort-limit.md | 0 .../{ => arangodb}/3.12/graphs/_index.md | 14 +- .../3.12/graphs/enterprisegraphs/_index.md | 0 .../enterprisegraphs/getting-started.md | 2 +- .../graphs/enterprisegraphs/management.md | 0 .../3.12}/graphs/example-graphs.md | 16 +- .../3.12/graphs/general-graphs/_index.md | 2 +- .../3.12}/graphs/general-graphs/functions.md | 2 +- .../3.12/graphs/general-graphs/management.md | 0 .../3.12/graphs/satellitegraphs/_index.md | 2 +- .../3.12/graphs/satellitegraphs/details.md | 0 .../3.12/graphs/satellitegraphs/management.md | 0 .../3.12}/graphs/smartgraphs/_index.md | 8 +- .../graphs/smartgraphs/getting-started.md | 2 +- .../3.12/graphs/smartgraphs/management.md | 0 .../testing-graphs-on-single-server.md | 0 .../3.12/graphs/working-with-edges.md | 0 .../3.12/index-and-search/_index.md | 0 .../3.12/index-and-search/analyzers.md | 0 .../index-and-search/arangosearch/_index.md | 2 +- .../arangosearch-views-reference.md | 2 +- .../case-sensitivity-and-diacritics.md | 0 .../arangosearch/exact-value-matching.md | 0 .../arangosearch/example-datasets.md | 0 .../arangosearch/faceted-search.md | 0 .../arangosearch/full-text-token-search.md | 0 .../arangosearch/fuzzy-search.md | 0 .../arangosearch/geospatial-search.md | 6 +- .../arangosearch/nested-search.md | 0 .../arangosearch/performance.md | 0 .../phrase-and-proximity-search.md | 0 .../arangosearch/prefix-matching.md | 0 .../arangosearch/range-queries.md | 0 .../index-and-search/arangosearch/ranking.md | 0 .../search-alias-views-reference.md | 2 +- .../arangosearch/search-highlighting.md | 0 .../arangosearch/wildcard-search.md | 0 .../3.12/index-and-search/indexing/_index.md | 0 .../3.12/index-and-search/indexing/basics.md | 0 .../indexing/index-utilization.md | 0 .../indexing/which-index-to-use-when.md | 0 .../indexing/working-with-indexes/_index.md | 0 .../working-with-indexes/fulltext-indexes.md | 0 .../geo-spatial-indexes.md | 0 .../working-with-indexes/inverted-indexes.md | 0 .../multi-dimensional-indexes.md | 0 .../persistent-indexes.md | 0 .../working-with-indexes/ttl-indexes.md | 0 .../working-with-indexes/vector-indexes.md | 2 +- .../vertex-centric-indexes.md | 0 .../{ => arangodb}/3.12/operations/_index.md | 0 .../3.12/operations/administration/_index.md | 0 .../administration/arangodb-starter/_index.md | 0 .../arangodb-starter/recovery-procedure.md | 0 .../arangodb-starter/removal-procedure.md | 0 .../administration/configuration.md | 0 .../administration/import-and-export.md | 0 .../administration/license-management.md | 2 +- .../operations/administration/log-levels.md | 0 .../administration/reduce-memory-footprint.md | 2 +- .../operations/administration/telemetrics.md | 0 .../administration/user-management/_index.md | 0 .../user-management/in-arangosh.md | 0 .../3.12/operations/backup-and-restore.md | 0 .../3.12/operations/installation/_index.md | 2 +- .../3.12/operations/installation/docker.md | 0 .../operations/installation/linux/_index.md | 0 .../linux/linux-os-tuning-script-examples.md | 0 .../linux/operating-system-configuration.md | 0 .../operations/installation/uninstallation.md | 0 .../3.12/operations/security/_index.md | 0 .../3.12/operations/security/audit-logging.md | 2 +- .../security/change-root-password.md | 0 .../operations/security/encryption-at-rest.md | 4 +- .../security/securing-starter-deployments.md | 0 .../operations/security/security-options.md | 0 .../3.12/operations/troubleshooting/_index.md | 0 .../operations/troubleshooting/arangod.md | 0 .../troubleshooting/cluster/_index.md | 0 .../troubleshooting/cluster/agency-dump.md | 0 .../troubleshooting/emergency-console.md | 0 .../troubleshooting/query-debug-packages.md | 0 .../3.12/operations/upgrading/_index.md | 0 .../community-to-enterprise-upgrade.md | 2 +- .../3.12/operations/upgrading/downgrading.md | 0 .../upgrading/manual-deployments/_index.md | 0 .../upgrading/manual-deployments/cluster.md | 0 .../manual-deployments/single-server.md | 0 .../upgrading/starter-deployments.md | 0 .../3.12/release-notes/_index.md | 0 .../deprecated-and-removed-features.md | 0 .../3.12/release-notes/version-3.0/_index.md | 0 .../incompatible-changes-in-3-0.md | 0 .../version-3.0/whats-new-in-3-0.md | 0 .../3.12/release-notes/version-3.1/_index.md | 0 .../incompatible-changes-in-3-1.md | 0 .../version-3.1/whats-new-in-3-1.md | 0 .../3.12/release-notes/version-3.10/_index.md | 0 .../version-3.10/api-changes-in-3-10.md | 0 .../incompatible-changes-in-3-10.md | 0 .../version-3.10/known-issues-in-3-10.md | 0 .../version-3.10/whats-new-in-3-10.md | 0 .../3.12/release-notes/version-3.11/_index.md | 0 .../version-3.11/api-changes-in-3-11.md | 0 .../incompatible-changes-in-3-11.md | 0 .../version-3.11/known-issues-in-3-11.md | 0 .../version-3.11/whats-new-in-3-11.md | 2 +- .../3.12/release-notes/version-3.12/_index.md | 0 .../version-3.12/api-changes-in-3-12.md | 0 .../incompatible-changes-in-3-12.md | 0 .../version-3.12/known-issues-in-3-12.md | 0 .../version-3.12/whats-new-in-3-12.md | 0 .../3.12/release-notes/version-3.2/_index.md | 0 .../incompatible-changes-in-3-2.md | 0 .../version-3.2/known-issues-in-3-2.md | 0 .../version-3.2/whats-new-in-3-2.md | 0 .../3.12/release-notes/version-3.3/_index.md | 0 .../incompatible-changes-in-3-3.md | 0 .../version-3.3/known-issues-in-3-3.md | 0 .../version-3.3/whats-new-in-3-3.md | 0 .../3.12/release-notes/version-3.4/_index.md | 0 .../incompatible-changes-in-3-4.md | 0 .../version-3.4/known-issues-in-3-4.md | 0 .../version-3.4/whats-new-in-3-4.md | 0 .../3.12/release-notes/version-3.5/_index.md | 0 .../incompatible-changes-in-3-5.md | 0 .../version-3.5/known-issues-in-3-5.md | 0 .../version-3.5/whats-new-in-3-5.md | 0 .../3.12/release-notes/version-3.6/_index.md | 0 .../incompatible-changes-in-3-6.md | 0 .../version-3.6/known-issues-in-3-6.md | 0 .../version-3.6/whats-new-in-3-6.md | 0 .../3.12/release-notes/version-3.7/_index.md | 0 .../version-3.7/api-changes-in-3-7.md | 0 .../incompatible-changes-in-3-7.md | 0 .../version-3.7/known-issues-in-3-7.md | 0 .../version-3.7/whats-new-in-3-7.md | 0 .../3.12/release-notes/version-3.8/_index.md | 0 .../version-3.8/api-changes-in-3-8.md | 0 .../incompatible-changes-in-3-8.md | 0 .../version-3.8/known-issues-in-3-8.md | 0 .../version-3.8/whats-new-in-3-8.md | 0 .../3.12/release-notes/version-3.9/_index.md | 0 .../version-3.9/api-changes-in-3-9.md | 0 .../incompatible-changes-in-3-9.md | 0 .../version-3.9/known-issues-in-3-9.md | 0 .../version-3.9/whats-new-in-3-9.md | 0 site/content/{ => arangodb}/3.13/_index.md | 15 +- .../3.13/about}/_index.md | 12 +- .../3.13/about}/features/_index.md | 8 +- .../about}/features/highlights-by-version.md | 0 .../3.13/about/features/list.md} | 0 .../3.13/about}/use-cases.md | 24 +- .../content/{ => arangodb}/3.13/aql/_index.md | 2 +- .../{ => arangodb}/3.13/aql/common-errors.md | 0 .../{ => arangodb}/3.13/aql/data-queries.md | 0 .../aql/examples-and-query-patterns/_index.md | 0 .../actors-and-movies-dataset-queries.md | 0 .../examples-and-query-patterns/counting.md | 0 .../create-test-data.md | 0 .../diffing-two-documents.md | 0 .../dynamic-attribute-names.md | 0 .../examples-and-query-patterns/grouping.md | 0 .../aql/examples-and-query-patterns/joins.md | 0 .../projections-and-filters.md | 0 .../queries-without-collections.md | 0 .../remove-nodes.md | 4 +- .../examples-and-query-patterns/traversals.md | 2 +- .../upsert-repsert-guide.md | 0 .../aql/execution-and-performance/_index.md | 0 .../caching-query-plans.md | 0 .../caching-query-results.md | 0 .../explaining-queries.md | 0 .../parsing-queries.md | 0 .../query-logging.md | 0 .../query-optimization.md | 0 .../query-profiling.md | 0 .../query-statistics.md | 0 .../3.13/aql/functions/_index.md | 0 .../3.13/aql/functions/arangosearch.md | 0 .../3.13/aql/functions/array.md | 0 .../{ => arangodb}/3.13/aql/functions/bit.md | 0 .../{ => arangodb}/3.13/aql/functions/date.md | 0 .../3.13/aql/functions/document-object.md | 0 .../3.13/aql/functions/fulltext.md | 0 .../3.13}/aql/functions/geo.md | 6 +- .../3.13/aql/functions/miscellaneous.md | 0 .../3.13/aql/functions/numeric.md | 0 .../3.13/aql/functions/string.md | 0 .../3.13/aql/functions/type-check-and-cast.md | 0 .../3.13}/aql/functions/vector.md | 2 +- .../3.13/aql/fundamentals/_index.md | 0 .../accessing-data-from-collections.md | 0 .../3.13/aql/fundamentals/bind-parameters.md | 0 .../3.13/aql/fundamentals/data-types.md | 0 .../3.13/aql/fundamentals/limitations.md | 0 .../3.13/aql/fundamentals/query-errors.md | 0 .../3.13/aql/fundamentals/query-results.md | 0 .../3.13/aql/fundamentals/subqueries.md | 0 .../3.13/aql/fundamentals/syntax.md | 0 .../aql/fundamentals/type-and-value-order.md | 0 .../{ => arangodb}/3.13/aql/graphs/_index.md | 0 .../3.13/aql/graphs/all-shortest-paths.md | 4 +- .../{ => arangodb}/3.13/aql/graphs/k-paths.md | 4 +- .../3.13}/aql/graphs/k-shortest-paths.md | 4 +- .../3.13}/aql/graphs/shortest-path.md | 4 +- .../3.13}/aql/graphs/traversals-explained.md | 16 +- .../3.13/aql/graphs/traversals.md | 4 +- .../3.13/aql/high-level-operations/_index.md | 0 .../3.13/aql/high-level-operations/collect.md | 0 .../3.13/aql/high-level-operations/filter.md | 0 .../3.13/aql/high-level-operations/for.md | 0 .../3.13/aql/high-level-operations/insert.md | 0 .../3.13/aql/high-level-operations/let.md | 0 .../3.13/aql/high-level-operations/limit.md | 0 .../3.13/aql/high-level-operations/remove.md | 0 .../3.13/aql/high-level-operations/replace.md | 0 .../3.13/aql/high-level-operations/return.md | 0 .../3.13/aql/high-level-operations/search.md | 0 .../3.13/aql/high-level-operations/sort.md | 0 .../3.13/aql/high-level-operations/update.md | 0 .../3.13/aql/high-level-operations/upsert.md | 0 .../3.13/aql/high-level-operations/window.md | 0 .../3.13/aql/high-level-operations/with.md | 0 .../3.13/aql/how-to-invoke-aql/_index.md | 0 .../aql/how-to-invoke-aql/with-arangosh.md | 0 .../with-the-web-interface.md | 0 .../{ => arangodb}/3.13/aql/operators.md | 0 .../3.13/aql/user-defined-functions.md | 0 .../{ => arangodb}/3.13/components/_index.md | 0 .../3.13/components/arangodb-server/_index.md | 0 .../arangodb-server/environment-variables.md | 0 .../components/arangodb-server/options.md | 0 .../arangodb-server/storage-engine.md | 0 .../3.13/components/platform.md | 4 +- .../3.13/components/tools/_index.md | 2 +- .../3.13/components/tools/arango-datasets.md | 0 .../components/tools/arangobackup/_index.md | 4 +- .../components/tools/arangobackup/examples.md | 0 .../components/tools/arangobackup/options.md | 0 .../components/tools/arangobench/_index.md | 0 .../components/tools/arangobench/options.md | 0 .../components/tools/arangodb-shell/_index.md | 0 .../tools/arangodb-shell/details.md | 0 .../tools/arangodb-shell/examples.md | 0 .../tools/arangodb-shell/options.md | 0 .../tools/arangodb-starter/_index.md | 0 .../tools/arangodb-starter/architecture.md | 0 .../tools/arangodb-starter/options.md | 0 .../tools/arangodb-starter/security.md | 0 .../components/tools/arangodump/_index.md | 0 .../components/tools/arangodump/examples.md | 0 .../tools/arangodump/limitations.md | 0 .../components/tools/arangodump/maskings.md | 0 .../components/tools/arangodump/options.md | 0 .../components/tools/arangoexport/_index.md | 0 .../components/tools/arangoexport/examples.md | 0 .../components/tools/arangoexport/options.md | 0 .../components/tools/arangoimport/_index.md | 0 .../components/tools/arangoimport/details.md | 0 .../tools/arangoimport/examples-csv.md | 0 .../tools/arangoimport/examples-json.md | 0 .../components/tools/arangoimport/options.md | 0 .../components/tools/arangoinspect/_index.md | 0 .../tools/arangoinspect/examples.md | 0 .../components/tools/arangoinspect/options.md | 0 .../components/tools/arangorestore/_index.md | 0 .../tools/arangorestore/examples.md | 0 .../components/tools/arangorestore/options.md | 0 .../components/tools/arangovpack/_index.md | 0 .../components/tools/arangovpack/options.md | 0 .../3.13/components/tools/foxx-cli/_index.md | 0 .../3.13/components/tools/foxx-cli/details.md | 0 .../3.13/components/web-interface/_index.md | 2 +- .../3.13/components/web-interface/cluster.md | 2 +- .../components/web-interface/collections.md | 0 .../components/web-interface/dashboard.md | 2 +- .../3.13/components/web-interface/document.md | 0 .../3.13}/components/web-interface/graphs.md | 2 +- .../3.13/components/web-interface/logs.md | 0 .../3.13/components/web-interface/queries.md | 2 +- .../3.13/components/web-interface/services.md | 0 .../3.13/components/web-interface/users.md | 0 .../{ => arangodb}/3.13/concepts/_index.md | 0 .../3.13/concepts/data-models.md | 0 .../3.13/concepts/data-retrieval.md | 0 .../3.13/concepts/data-structure/_index.md | 0 .../concepts/data-structure/collections.md | 0 .../3.13/concepts/data-structure/databases.md | 0 .../data-structure/documents/_index.md | 0 .../documents/computed-values.md | 0 .../documents/schema-validation.md | 0 .../3.13/concepts/data-structure/views.md | 0 .../{ => arangodb}/3.13/deploy/_index.md | 6 +- .../3.13/deploy/architecture/_index.md | 0 .../3.13/deploy/architecture/data-sharding.md | 4 +- .../3.13/deploy/architecture/replication.md | 0 .../3.13/deploy/architecture/scalability.md | 0 .../3.13/deploy/cluster/_index.md | 6 +- .../3.13/deploy/cluster/administration.md | 0 .../3.13/deploy/cluster/deployment/_index.md | 2 +- .../deploy/cluster/deployment/manual-start.md | 0 .../deployment/using-the-arangodb-starter.md | 0 .../3.13/deploy/cluster/limitations.md | 0 .../3.13/deploy/in-the-cloud.md | 0 .../{ => arangodb}/3.13/deploy/kubernetes.md | 0 .../{ => arangodb}/3.13/deploy/oneshard.md | 2 +- .../3.13/deploy/production-checklist.md | 0 .../3.13/deploy/single-instance-vs-cluster.md | 0 .../3.13/deploy/single-instance/_index.md | 0 .../deploy/single-instance/manual-start.md | 0 .../using-the-arangodb-starter.md | 0 .../{ => arangodb}/3.13/develop/_index.md | 0 .../3.13/develop/drivers/_index.md | 0 .../{ => arangodb}/3.13/develop/drivers/go.md | 0 .../3.13/develop/drivers/java/_index.md | 0 .../java/reference-version-7/_index.md | 0 .../changes-in-version-7.md | 0 .../java/reference-version-7/driver-setup.md | 0 .../java/reference-version-7/serialization.md | 0 .../3.13/develop/drivers/javascript.md | 0 .../3.13/develop/drivers/python.md | 0 .../3.13/develop/error-codes.md | 0 .../{ => arangodb}/3.13/develop/exit-codes.md | 0 .../3.13/develop/foxx-microservices/_index.md | 0 .../develop/foxx-microservices/deployment.md | 0 .../foxx-microservices/getting-started.md | 0 .../foxx-microservices/guides/_index.md | 0 .../guides/access-from-the-browser.md | 0 .../guides/authentication-and-sessions.md | 0 .../guides/development-mode.md | 0 .../guides/foxx-in-a-cluster.md | 0 .../guides/linking-services-together.md | 0 .../guides/making-requests.md | 0 .../guides/scripts-and-scheduling.md | 0 .../guides/testing-foxx-services.md | 0 .../guides/using-node-modules.md | 0 .../guides/using-webpack-with-foxx.md | 0 .../guides/working-with-collections.md | 0 .../guides/working-with-files.md | 0 .../guides/working-with-routers.md | 0 .../guides/writing-queries.md | 0 .../foxx-microservices/reference/_index.md | 0 .../reference/configuration.md | 0 .../reference/related-modules/_index.md | 0 .../related-modules/authentication.md | 0 .../reference/related-modules/graphql.md | 0 .../reference/related-modules/oauth-1-0a.md | 0 .../reference/related-modules/oauth-2-0.md | 0 .../reference/related-modules/queues.md | 0 .../reference/routers/_index.md | 0 .../reference/routers/endpoints.md | 0 .../reference/routers/middleware.md | 0 .../reference/routers/request.md | 0 .../reference/routers/response.md | 0 .../reference/service-context.md | 0 .../reference/service-manifest.md | 0 .../reference/sessions-middleware/_index.md | 0 .../session-storages/_index.md | 0 .../session-storages/collection-storage.md | 0 .../session-storages/jwt-storage.md | 0 .../session-transports/_index.md | 0 .../session-transports/cookie-transport.md | 0 .../session-transports/header-transport.md | 0 .../3.13/develop/http-api/_index.md | 2 +- .../3.13/develop/http-api/administration.md | 0 .../3.13/develop/http-api/analyzers.md | 0 .../3.13/develop/http-api/authentication.md | 2 +- .../3.13/develop/http-api/cluster.md | 0 .../3.13/develop/http-api/collections.md | 0 .../3.13/develop/http-api/databases.md | 0 .../3.13/develop/http-api/documents.md | 0 .../3.13/develop/http-api/foxx.md | 0 .../http-api/general-request-handling.md | 0 .../3.13/develop/http-api/graphs/_index.md | 0 .../3.13/develop/http-api/graphs/edges.md | 0 .../develop/http-api/graphs/named-graphs.md | 4 +- .../3.13/develop/http-api/hot-backups.md | 4 +- .../3.13/develop/http-api/import.md | 0 .../3.13/develop/http-api/indexes/_index.md | 0 .../3.13/develop/http-api/indexes/fulltext.md | 0 .../develop/http-api/indexes/geo-spatial.md | 0 .../3.13/develop/http-api/indexes/inverted.md | 0 .../http-api/indexes/multi-dimensional.md | 0 .../develop/http-api/indexes/persistent.md | 0 .../3.13/develop/http-api/indexes/ttl.md | 0 .../3.13/develop/http-api/indexes/vector.md | 0 .../3.13/develop/http-api/jobs.md | 0 .../develop/http-api/monitoring/_index.md | 0 .../3.13/develop/http-api/monitoring/logs.md | 0 .../develop/http-api/monitoring/metrics.md | 0 .../develop/http-api/monitoring/statistics.md | 0 .../3.13/develop/http-api/queries/_index.md | 0 .../develop/http-api/queries/aql-queries.md | 0 .../http-api/queries/aql-query-plan-cache.md | 0 .../queries/aql-query-results-cache.md | 0 .../queries/user-defined-aql-functions.md | 0 .../develop/http-api/replication/_index.md | 0 .../replication/other-replication-commands.md | 0 .../replication/replication-applier.md | 0 .../http-api/replication/replication-dump.md | 0 .../replication/replication-logger.md | 0 .../http-api/replication/write-ahead-log.md | 0 .../3.13/develop/http-api/security.md | 0 .../3.13/develop/http-api/tasks.md | 0 .../develop/http-api/transactions/_index.md | 0 .../transactions/javascript-transactions.md | 0 .../transactions/stream-transactions.md | 0 .../3.13/develop/http-api/users.md | 0 .../3.13/develop/http-api/views/_index.md | 0 .../http-api/views/arangosearch-views.md | 0 .../http-api/views/search-alias-views.md | 0 .../3.13/develop/integrations/_index.md | 0 .../arangodb-datasource-for-apache-spark.md | 2 +- .../_index.md | 0 .../configuration.md | 0 .../integrations/spring-boot-arangodb.md | 0 .../spring-data-arangodb/_index.md | 0 .../spring-data-arangodb/migration.md | 0 .../reference-version-4/_index.md | 0 .../reference-version-4/mapping/_index.md | 0 .../reference-version-4/mapping/auditing.md | 0 .../mapping/computed-values.md | 0 .../reference-version-4/mapping/converter.md | 0 .../reference-version-4/mapping/document.md | 0 .../reference-version-4/mapping/edge.md | 0 .../reference-version-4/mapping/events.md | 0 .../reference-version-4/mapping/indexes.md | 0 .../reference-version-4/mapping/reference.md | 0 .../reference-version-4/mapping/relations.md | 0 .../repositories/_index.md | 0 .../repositories/queries/_index.md | 0 .../repositories/queries/derived-queries.md | 0 .../repositories/queries/named-queries.md | 0 .../repositories/queries/query-methods.md | 0 .../reference-version-4/template.md | 0 .../javascript-api/@arangodb/_index.md | 0 .../@arangodb/collection-object.md | 0 .../javascript-api/@arangodb/cursor-object.md | 0 .../javascript-api/@arangodb/db-object.md | 0 .../javascript-api/@arangodb/view-object.md | 0 .../3.13/develop/javascript-api/_index.md | 0 .../3.13/develop/javascript-api/actions.md | 0 .../3.13/develop/javascript-api/analyzers.md | 0 .../develop/javascript-api/aql-queries.md | 0 .../3.13/develop/javascript-api/console.md | 0 .../3.13/develop/javascript-api/crypto.md | 0 .../3.13/develop/javascript-api/fs.md | 0 .../3.13/develop/javascript-api/request.md | 0 .../3.13/develop/javascript-api/tasks.md | 0 .../3.13/develop/operational-factors.md | 0 .../3.13/develop/satellitecollections.md | 0 .../{ => arangodb}/3.13/develop/smartjoins.md | 0 .../3.13/develop/transactions/_index.md | 0 .../3.13/develop/transactions/durability.md | 0 .../transactions/javascript-transactions.md | 0 .../3.13/develop/transactions/limitations.md | 0 .../transactions/locking-and-isolation.md | 0 .../transactions/stream-transactions.md | 0 .../{ => arangodb}/3.13/get-started/_index.md | 0 .../how-to-interact-with-arangodb.md | 0 .../get-started/on-premises-installation.md | 6 +- .../get-started/set-up-a-cloud-instance.md | 54 +- .../get-started/start-using-aql/_index.md | 0 .../3.13/get-started/start-using-aql/crud.md | 0 .../get-started/start-using-aql/dataset.md | 0 .../get-started/start-using-aql/filter.md | 0 .../3.13/get-started/start-using-aql/geo.md | 0 .../get-started/start-using-aql/graphs.md | 4 +- .../3.13/get-started/start-using-aql/joins.md | 0 .../get-started/start-using-aql/sort-limit.md | 0 .../{ => arangodb}/3.13/graphs/_index.md | 14 +- .../3.13/graphs/enterprisegraphs/_index.md | 0 .../enterprisegraphs/getting-started.md | 2 +- .../graphs/enterprisegraphs/management.md | 0 .../3.13}/graphs/example-graphs.md | 16 +- .../3.13/graphs/general-graphs/_index.md | 2 +- .../3.13}/graphs/general-graphs/functions.md | 2 +- .../3.13/graphs/general-graphs/management.md | 0 .../3.13/graphs/satellitegraphs/_index.md | 2 +- .../3.13/graphs/satellitegraphs/details.md | 0 .../3.13/graphs/satellitegraphs/management.md | 0 .../3.13}/graphs/smartgraphs/_index.md | 8 +- .../graphs/smartgraphs/getting-started.md | 2 +- .../3.13/graphs/smartgraphs/management.md | 0 .../testing-graphs-on-single-server.md | 0 .../3.13/graphs/working-with-edges.md | 0 .../3.13/index-and-search/_index.md | 0 .../3.13/index-and-search/analyzers.md | 0 .../index-and-search/arangosearch/_index.md | 2 +- .../arangosearch-views-reference.md | 2 +- .../case-sensitivity-and-diacritics.md | 0 .../arangosearch/exact-value-matching.md | 0 .../arangosearch/example-datasets.md | 0 .../arangosearch/faceted-search.md | 0 .../arangosearch/full-text-token-search.md | 0 .../arangosearch/fuzzy-search.md | 0 .../arangosearch/geospatial-search.md | 6 +- .../arangosearch/nested-search.md | 0 .../arangosearch/performance.md | 0 .../phrase-and-proximity-search.md | 0 .../arangosearch/prefix-matching.md | 0 .../arangosearch/range-queries.md | 0 .../index-and-search/arangosearch/ranking.md | 0 .../search-alias-views-reference.md | 2 +- .../arangosearch/search-highlighting.md | 0 .../arangosearch/wildcard-search.md | 0 .../3.13/index-and-search/indexing/_index.md | 0 .../3.13/index-and-search/indexing/basics.md | 0 .../indexing/index-utilization.md | 0 .../indexing/which-index-to-use-when.md | 0 .../indexing/working-with-indexes/_index.md | 0 .../working-with-indexes/fulltext-indexes.md | 0 .../geo-spatial-indexes.md | 0 .../working-with-indexes/inverted-indexes.md | 0 .../multi-dimensional-indexes.md | 0 .../persistent-indexes.md | 0 .../working-with-indexes/ttl-indexes.md | 0 .../working-with-indexes/vector-indexes.md | 2 +- .../vertex-centric-indexes.md | 0 .../{ => arangodb}/3.13/operations/_index.md | 0 .../3.13/operations/administration/_index.md | 0 .../administration/arangodb-starter/_index.md | 0 .../arangodb-starter/recovery-procedure.md | 0 .../arangodb-starter/removal-procedure.md | 0 .../administration/configuration.md | 0 .../administration/import-and-export.md | 0 .../administration/license-management.md | 2 +- .../operations/administration/log-levels.md | 0 .../administration/reduce-memory-footprint.md | 2 +- .../operations/administration/telemetrics.md | 0 .../administration/user-management/_index.md | 0 .../user-management/in-arangosh.md | 0 .../3.13/operations/backup-and-restore.md | 0 .../3.13/operations/installation/_index.md | 2 +- .../3.13/operations/installation/docker.md | 0 .../operations/installation/linux/_index.md | 0 .../linux/linux-os-tuning-script-examples.md | 0 .../linux/operating-system-configuration.md | 0 .../operations/installation/uninstallation.md | 0 .../3.13/operations/security/_index.md | 0 .../3.13/operations/security/audit-logging.md | 2 +- .../security/change-root-password.md | 0 .../operations/security/encryption-at-rest.md | 4 +- .../security/securing-starter-deployments.md | 0 .../operations/security/security-options.md | 0 .../3.13/operations/troubleshooting/_index.md | 0 .../operations/troubleshooting/arangod.md | 0 .../troubleshooting/cluster/_index.md | 0 .../troubleshooting/cluster/agency-dump.md | 0 .../troubleshooting/emergency-console.md | 0 .../troubleshooting/query-debug-packages.md | 0 .../3.13/operations/upgrading/_index.md | 0 .../3.13/operations/upgrading/downgrading.md | 0 .../upgrading/manual-deployments/_index.md | 0 .../upgrading/manual-deployments/cluster.md | 0 .../manual-deployments/single-server.md | 0 .../upgrading/starter-deployments.md | 0 .../3.13/release-notes/_index.md | 0 .../deprecated-and-removed-features.md | 0 .../3.13/release-notes/platform.md | 2 +- .../3.13/release-notes/version-3.0/_index.md | 0 .../incompatible-changes-in-3-0.md | 0 .../version-3.0/whats-new-in-3-0.md | 0 .../3.13/release-notes/version-3.1/_index.md | 0 .../incompatible-changes-in-3-1.md | 0 .../version-3.1/whats-new-in-3-1.md | 0 .../3.13/release-notes/version-3.10/_index.md | 0 .../version-3.10/api-changes-in-3-10.md | 0 .../incompatible-changes-in-3-10.md | 0 .../version-3.10/known-issues-in-3-10.md | 0 .../version-3.10/whats-new-in-3-10.md | 0 .../3.13/release-notes/version-3.11/_index.md | 0 .../version-3.11/api-changes-in-3-11.md | 0 .../incompatible-changes-in-3-11.md | 0 .../version-3.11/known-issues-in-3-11.md | 0 .../version-3.11/whats-new-in-3-11.md | 2 +- .../3.13/release-notes/version-3.12/_index.md | 0 .../version-3.12/api-changes-in-3-12.md | 0 .../incompatible-changes-in-3-12.md | 0 .../version-3.12/known-issues-in-3-12.md | 0 .../version-3.12/whats-new-in-3-12.md | 0 .../3.13/release-notes/version-3.13/_index.md | 0 .../version-3.13/api-changes-in-3-13.md | 0 .../incompatible-changes-in-3-13.md | 0 .../version-3.13/known-issues-in-3-13.md | 0 .../version-3.13/whats-new-in-3-13.md | 0 .../3.13/release-notes/version-3.2/_index.md | 0 .../incompatible-changes-in-3-2.md | 0 .../version-3.2/known-issues-in-3-2.md | 0 .../version-3.2/whats-new-in-3-2.md | 0 .../3.13/release-notes/version-3.3/_index.md | 0 .../incompatible-changes-in-3-3.md | 0 .../version-3.3/known-issues-in-3-3.md | 0 .../version-3.3/whats-new-in-3-3.md | 0 .../3.13/release-notes/version-3.4/_index.md | 0 .../incompatible-changes-in-3-4.md | 0 .../version-3.4/known-issues-in-3-4.md | 0 .../version-3.4/whats-new-in-3-4.md | 0 .../3.13/release-notes/version-3.5/_index.md | 0 .../incompatible-changes-in-3-5.md | 0 .../version-3.5/known-issues-in-3-5.md | 0 .../version-3.5/whats-new-in-3-5.md | 0 .../3.13/release-notes/version-3.6/_index.md | 0 .../incompatible-changes-in-3-6.md | 0 .../version-3.6/known-issues-in-3-6.md | 0 .../version-3.6/whats-new-in-3-6.md | 0 .../3.13/release-notes/version-3.7/_index.md | 0 .../version-3.7/api-changes-in-3-7.md | 0 .../incompatible-changes-in-3-7.md | 0 .../version-3.7/known-issues-in-3-7.md | 0 .../version-3.7/whats-new-in-3-7.md | 0 .../3.13/release-notes/version-3.8/_index.md | 0 .../version-3.8/api-changes-in-3-8.md | 0 .../incompatible-changes-in-3-8.md | 0 .../version-3.8/known-issues-in-3-8.md | 0 .../version-3.8/whats-new-in-3-8.md | 0 .../3.13/release-notes/version-3.9/_index.md | 0 .../version-3.9/api-changes-in-3-9.md | 0 .../incompatible-changes-in-3-9.md | 0 .../version-3.9/known-issues-in-3-9.md | 0 .../version-3.9/whats-new-in-3-9.md | 0 site/content/arangodb/_index.md | 7 + site/content/data-platform/_index.md | 20 + .../about}/_index.md | 4 +- .../about/features.md} | 15 +- .../graph-visualizer.md | 16 +- .../release-notes.md | 4 +- site/content/ecosystem/_index.md | 6 + .../adapters}/_index.md | 0 .../adapters}/arangodb-cugraph-adapter.md | 0 .../adapters}/arangodb-dgl-adapter.md | 0 .../adapters}/arangodb-networkx-adapter.md | 0 .../adapters}/arangodb-pyg-adapter.md | 0 .../adapters}/arangodb-rdf-adapter.md | 0 .../adapters}/langchain.md | 0 site/content/gen-ai/_index.md | 24 + .../graphs => gen-ai}/graph-analytics.md | 32 +- .../_index.md => gen-ai/graph-to-ai.md} | 28 +- .../data-science => gen-ai}/graphml/_index.md | 6 +- .../graphml/notebooks-api.md | 6 +- .../graphml/quickstart.md | 6 +- .../data-science => gen-ai}/graphml/ui.md | 14 +- .../graphrag/_index.md | 8 +- .../graphrag/tutorial-notebook.md | 2 +- .../graphrag/web-interface.md | 30 +- .../notebook-servers.md | 6 +- .../graphrag => gen-ai}/services/_index.md | 2 +- .../graphrag => gen-ai}/services/gen-ai.md | 2 +- .../graphrag => gen-ai}/services/importer.md | 2 +- .../graphrag => gen-ai}/services/mlflow.md | 2 +- .../services/natural-language-to-aql.md | 0 .../graphrag => gen-ai}/services/retriever.md | 2 +- .../services/triton-inference-server.md | 0 site/content/platform/_index.md | 24 - site/content/platform/data-science/_index.md | 174 ---- .../platform/data-science/graphml/_index.md | 207 ----- .../data-science/graphml/notebooks-api.md | 860 ----------------- .../data-science/graphml/quickstart.md | 58 -- .../platform/data-science/graphml/ui.md | 236 ----- .../data-science/graphrag/services/_index.md | 6 - .../data-science/graphrag/services/gen-ai.md | 216 ----- .../graphrag/services/importer.md | 350 ------- .../data-science/graphrag/services/mlflow.md | 162 ---- .../services/natural-language-to-aql.md | 241 ----- .../graphrag/services/retriever.md | 269 ------ .../services/triton-inference-server.md | 197 ---- .../graphrag/tutorial-notebook.md | 412 -------- .../data-science/graphrag/web-interface.md | 176 ---- .../data-science/integrations/_index.md | 22 - .../integrations/arangodb-cugraph-adapter.md | 151 --- .../integrations/arangodb-dgl-adapter.md | 253 ----- .../integrations/arangodb-networkx-adapter.md | 204 ---- .../integrations/arangodb-pyg-adapter.md | 261 ------ .../integrations/arangodb-rdf-adapter.md | 171 ---- .../data-science/integrations/langchain.md | 29 - .../platform/data-science/notebook-servers.md | 58 -- .../platform/graph-intelligence/_index.md | 5 - .../graph-intelligence/graph-analytics.md | 877 ------------------ .../layouts/shortcodes/tag.html | 7 +- 3026 files changed, 1003 insertions(+), 39710 deletions(-) delete mode 100644 site/content/3.10/arangograph/_index.md delete mode 100644 site/content/3.10/arangograph/api/_index.md delete mode 100644 site/content/3.10/arangograph/api/get-started.md delete mode 100644 site/content/3.10/arangograph/backups.md delete mode 100644 site/content/3.10/arangograph/data-loader/_index.md delete mode 100644 site/content/3.10/arangograph/data-loader/add-files.md delete mode 100644 site/content/3.10/arangograph/data-loader/design-graph.md delete mode 100644 site/content/3.10/arangograph/deployments/_index.md delete mode 100644 site/content/3.10/arangograph/deployments/private-endpoints.md delete mode 100644 site/content/3.10/arangograph/migrate-to-the-cloud.md delete mode 100644 site/content/3.10/arangograph/monitoring-and-metrics.md delete mode 100644 site/content/3.10/arangograph/my-account.md delete mode 100644 site/content/3.10/arangograph/notebooks.md delete mode 100644 site/content/3.10/arangograph/organizations/_index.md delete mode 100644 site/content/3.10/arangograph/organizations/billing.md delete mode 100644 site/content/3.10/arangograph/security-and-access-control/_index.md delete mode 100644 site/content/3.10/arangograph/security-and-access-control/single-sign-on/_index.md delete mode 100644 site/content/3.10/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md delete mode 100644 site/content/3.10/arangograph/security-and-access-control/x-509-certificates.md delete mode 100644 site/content/3.10/data-science/arangograph-notebooks.md delete mode 100644 site/content/3.11/arangograph/api/get-started.md delete mode 100644 site/content/3.11/arangograph/api/set-up-a-connection.md delete mode 100644 site/content/3.11/arangograph/backups.md delete mode 100644 site/content/3.11/arangograph/data-loader/_index.md delete mode 100644 site/content/3.11/arangograph/data-loader/design-graph.md delete mode 100644 site/content/3.11/arangograph/data-loader/example.md delete mode 100644 site/content/3.11/arangograph/data-loader/import.md delete mode 100644 site/content/3.11/arangograph/deployments/_index.md delete mode 100644 site/content/3.11/arangograph/deployments/private-endpoints.md delete mode 100644 site/content/3.11/arangograph/deployments/upgrades-and-versioning.md delete mode 100644 site/content/3.11/arangograph/monitoring-and-metrics.md delete mode 100644 site/content/3.11/arangograph/my-account.md delete mode 100644 site/content/3.11/arangograph/notebooks.md delete mode 100644 site/content/3.11/arangograph/oasisctl/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/accept/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/accept/accept-organization-invite.md delete mode 100644 site/content/3.11/arangograph/oasisctl/accept/accept-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/add/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/add/add-auditlog-destination.md delete mode 100644 site/content/3.11/arangograph/oasisctl/add/add-auditlog.md delete mode 100644 site/content/3.11/arangograph/oasisctl/add/add-group-members.md delete mode 100644 site/content/3.11/arangograph/oasisctl/add/add-group.md delete mode 100644 site/content/3.11/arangograph/oasisctl/auditlog/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/auditlog/auditlog-attach.md delete mode 100644 site/content/3.11/arangograph/oasisctl/auditlog/auditlog-detach.md delete mode 100644 site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached.md delete mode 100644 site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get.md delete mode 100644 site/content/3.11/arangograph/oasisctl/backup/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/backup/backup-copy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/backup/backup-download.md delete mode 100644 site/content/3.11/arangograph/oasisctl/clone/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/clone/clone-deployment-backup.md delete mode 100644 site/content/3.11/arangograph/oasisctl/clone/clone-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/completion.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-apikey.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-auditlog.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-backup-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-backup.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-cacertificate.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-example-installation.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-example.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-group.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-ipallowlist.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-metrics-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-metrics.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-notebook.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-organization-invite.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-private-endpoint-service.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-private-endpoint.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-private.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/create/create-role.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-apikey.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive-events.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-destination.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-auditlog.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-backup-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-backup.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-cacertificate.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-example-installation.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-example.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-group-members.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-group.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-ipallowlist.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-metrics-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-metrics.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-notebook.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-organization-invite.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-organization-members.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/delete/delete-role.md delete mode 100644 site/content/3.11/arangograph/oasisctl/disable/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md delete mode 100644 site/content/3.11/arangograph/oasisctl/enable/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md delete mode 100644 site/content/3.11/arangograph/oasisctl/generate-docs.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-auditlog-archive.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-auditlog-events.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-auditlog.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-backup-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-backup.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-cacertificate.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-example-installation.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-example.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-group.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-ipallowlist.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-metrics-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-metrics.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-notebook.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization-authentication-providers.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization-authentication.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization-email.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization-invite.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-private-endpoint-service.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-private-endpoint.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-private.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-provider.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-region.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-role.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-self.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-server-status.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-server.md delete mode 100644 site/content/3.11/arangograph/oasisctl/get/get-tandc.md delete mode 100644 site/content/3.11/arangograph/oasisctl/import.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-apikeys.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-arangodb-versions.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-arangodb.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-auditlog-archives.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-auditlog-destinations.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-auditlog.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-auditlogs.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-backup-policies.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-backup.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-backups.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-cacertificates.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-cpusizes.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-deployments.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-diskperformances.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-effective-permissions.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-effective.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-example-installations.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-example.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-examples.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-group-members.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-group.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-groups.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-ipallowlists.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-metrics-tokens.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-metrics.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-nodesizes.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-notebookmodels.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-notebooks.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-organization-invites.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-organization-members.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-organizations.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-permissions.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-projects.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-providers.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-regions.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-roles.md delete mode 100644 site/content/3.11/arangograph/oasisctl/list/list-servers.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/lock-cacertificate.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/lock-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/lock-ipallowlist.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/lock-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/lock-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/lock/lock-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/login.md delete mode 100644 site/content/3.11/arangograph/oasisctl/logs.md delete mode 100644 site/content/3.11/arangograph/oasisctl/options.md delete mode 100644 site/content/3.11/arangograph/oasisctl/pause/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/pause/pause-notebook.md delete mode 100644 site/content/3.11/arangograph/oasisctl/rebalance/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md delete mode 100644 site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/reject/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/reject/reject-organization-invite.md delete mode 100644 site/content/3.11/arangograph/oasisctl/reject/reject-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/renew/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/renew/renew-apikey-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/renew/renew-apikey.md delete mode 100644 site/content/3.11/arangograph/oasisctl/resume/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/resume/resume-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/resume/resume-notebook.md delete mode 100644 site/content/3.11/arangograph/oasisctl/revoke/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey.md delete mode 100644 site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics.md delete mode 100644 site/content/3.11/arangograph/oasisctl/rotate/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment-server.md delete mode 100644 site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/top.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/unlock-cacertificate.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/unlock-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/unlock-ipallowlist.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/unlock-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/unlock-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/unlock/unlock-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-auditlog.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-backup-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-backup.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-cacertificate.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-deployment.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-group.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-ipallowlist.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-metrics-token.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-metrics.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-notebook.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-organization-authentication-providers.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-organization-authentication.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-organization-email.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-organization.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-policy-add-binding.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-policy-add.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-policy-delete-binding.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-policy-delete.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-policy.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-private-endpoint-service.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-private-endpoint.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-private.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-project.md delete mode 100644 site/content/3.11/arangograph/oasisctl/update/update-role.md delete mode 100644 site/content/3.11/arangograph/oasisctl/upgrade.md delete mode 100644 site/content/3.11/arangograph/oasisctl/version.md delete mode 100644 site/content/3.11/arangograph/oasisctl/wait/_index.md delete mode 100644 site/content/3.11/arangograph/oasisctl/wait/wait-deployment.md delete mode 100644 site/content/3.11/arangograph/organizations/_index.md delete mode 100644 site/content/3.11/arangograph/organizations/credits-and-usage.md delete mode 100644 site/content/3.11/arangograph/organizations/users-and-groups.md delete mode 100644 site/content/3.11/arangograph/projects.md delete mode 100644 site/content/3.11/arangograph/security-and-access-control/_index.md delete mode 100644 site/content/3.11/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md delete mode 100644 site/content/3.11/arangograph/security-and-access-control/x-509-certificates.md delete mode 100644 site/content/3.11/data-science/arangograph-notebooks.md delete mode 100644 site/content/3.12/about-arangodb/features/platform.md delete mode 100644 site/content/3.12/arangograph/_index.md delete mode 100644 site/content/3.12/arangograph/api/_index.md delete mode 100644 site/content/3.12/arangograph/api/get-started.md delete mode 100644 site/content/3.12/arangograph/api/set-up-a-connection.md delete mode 100644 site/content/3.12/arangograph/data-loader/add-files.md delete mode 100644 site/content/3.12/arangograph/data-loader/example.md delete mode 100644 site/content/3.12/arangograph/data-loader/import.md delete mode 100644 site/content/3.12/arangograph/deployments/upgrades-and-versioning.md delete mode 100644 site/content/3.12/arangograph/migrate-to-the-cloud.md delete mode 100644 site/content/3.12/arangograph/oasisctl/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/accept/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/accept/accept-organization-invite.md delete mode 100644 site/content/3.12/arangograph/oasisctl/accept/accept-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/add/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/add/add-auditlog-destination.md delete mode 100644 site/content/3.12/arangograph/oasisctl/add/add-auditlog.md delete mode 100644 site/content/3.12/arangograph/oasisctl/add/add-group-members.md delete mode 100644 site/content/3.12/arangograph/oasisctl/add/add-group.md delete mode 100644 site/content/3.12/arangograph/oasisctl/auditlog/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/auditlog/auditlog-attach.md delete mode 100644 site/content/3.12/arangograph/oasisctl/auditlog/auditlog-detach.md delete mode 100644 site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached.md delete mode 100644 site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get.md delete mode 100644 site/content/3.12/arangograph/oasisctl/backup/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/backup/backup-copy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/backup/backup-download.md delete mode 100644 site/content/3.12/arangograph/oasisctl/clone/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/clone/clone-deployment-backup.md delete mode 100644 site/content/3.12/arangograph/oasisctl/clone/clone-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/completion.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-apikey.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-auditlog.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-backup-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-backup.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-cacertificate.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-example-installation.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-example.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-group.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-ipallowlist.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-metrics-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-metrics.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-notebook.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-organization-invite.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-private-endpoint-service.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-private-endpoint.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-private.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/create/create-role.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-apikey.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive-events.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-destination.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-auditlog.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-backup-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-backup.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-cacertificate.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-example-installation.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-example.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-group-members.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-group.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-ipallowlist.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-metrics-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-metrics.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-notebook.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-organization-invite.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-organization-members.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/delete/delete-role.md delete mode 100644 site/content/3.12/arangograph/oasisctl/disable/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md delete mode 100644 site/content/3.12/arangograph/oasisctl/enable/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md delete mode 100644 site/content/3.12/arangograph/oasisctl/generate-docs.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-auditlog-archive.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-auditlog-events.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-auditlog.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-backup-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-backup.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-cacertificate.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-example-installation.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-example.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-group.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-ipallowlist.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-metrics-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-metrics.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-notebook.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization-authentication-providers.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization-authentication.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization-email.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization-invite.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-private-endpoint-service.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-private-endpoint.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-private.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-provider.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-region.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-role.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-self.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-server-status.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-server.md delete mode 100644 site/content/3.12/arangograph/oasisctl/get/get-tandc.md delete mode 100644 site/content/3.12/arangograph/oasisctl/import.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-apikeys.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-arangodb-versions.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-arangodb.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-auditlog-archives.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-auditlog-destinations.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-auditlog.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-auditlogs.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-backup-policies.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-backup.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-backups.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-cacertificates.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-cpusizes.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-deployments.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-diskperformances.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-effective-permissions.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-effective.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-example-installations.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-example.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-examples.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-group-members.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-group.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-groups.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-ipallowlists.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-metrics-tokens.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-metrics.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-nodesizes.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-notebookmodels.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-notebooks.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-organization-invites.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-organization-members.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-organizations.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-permissions.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-projects.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-providers.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-regions.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-roles.md delete mode 100644 site/content/3.12/arangograph/oasisctl/list/list-servers.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/lock-cacertificate.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/lock-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/lock-ipallowlist.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/lock-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/lock-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/lock/lock-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/login.md delete mode 100644 site/content/3.12/arangograph/oasisctl/logs.md delete mode 100644 site/content/3.12/arangograph/oasisctl/options.md delete mode 100644 site/content/3.12/arangograph/oasisctl/pause/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/pause/pause-notebook.md delete mode 100644 site/content/3.12/arangograph/oasisctl/rebalance/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md delete mode 100644 site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/reject/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/reject/reject-organization-invite.md delete mode 100644 site/content/3.12/arangograph/oasisctl/reject/reject-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/renew/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/renew/renew-apikey-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/renew/renew-apikey.md delete mode 100644 site/content/3.12/arangograph/oasisctl/resume/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/resume/resume-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/resume/resume-notebook.md delete mode 100644 site/content/3.12/arangograph/oasisctl/revoke/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey.md delete mode 100644 site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics.md delete mode 100644 site/content/3.12/arangograph/oasisctl/rotate/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment-server.md delete mode 100644 site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/top.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/unlock-cacertificate.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/unlock-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/unlock-ipallowlist.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/unlock-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/unlock-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/unlock/unlock-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-auditlog.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-backup-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-backup.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-cacertificate.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-deployment.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-group.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-ipallowlist.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-metrics-token.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-metrics.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-notebook.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-organization-authentication-providers.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-organization-authentication.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-organization-email.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-organization.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-policy-add-binding.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-policy-add.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-policy-delete-binding.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-policy-delete.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-policy.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-private-endpoint-service.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-private-endpoint.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-private.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-project.md delete mode 100644 site/content/3.12/arangograph/oasisctl/update/update-role.md delete mode 100644 site/content/3.12/arangograph/oasisctl/upgrade.md delete mode 100644 site/content/3.12/arangograph/oasisctl/version.md delete mode 100644 site/content/3.12/arangograph/oasisctl/wait/_index.md delete mode 100644 site/content/3.12/arangograph/oasisctl/wait/wait-deployment.md delete mode 100644 site/content/3.12/arangograph/organizations/_index.md delete mode 100644 site/content/3.12/arangograph/organizations/billing.md delete mode 100644 site/content/3.12/arangograph/organizations/credits-and-usage.md delete mode 100644 site/content/3.12/arangograph/organizations/users-and-groups.md delete mode 100644 site/content/3.12/arangograph/projects.md delete mode 100644 site/content/3.12/arangograph/security-and-access-control/single-sign-on/_index.md delete mode 100644 site/content/3.13/arangograph/_index.md delete mode 100644 site/content/3.13/arangograph/api/_index.md delete mode 100644 site/content/3.13/arangograph/api/set-up-a-connection.md delete mode 100644 site/content/3.13/arangograph/backups.md delete mode 100644 site/content/3.13/arangograph/data-loader/_index.md delete mode 100644 site/content/3.13/arangograph/data-loader/add-files.md delete mode 100644 site/content/3.13/arangograph/data-loader/design-graph.md delete mode 100644 site/content/3.13/arangograph/data-loader/example.md delete mode 100644 site/content/3.13/arangograph/data-loader/import.md delete mode 100644 site/content/3.13/arangograph/deployments/_index.md delete mode 100644 site/content/3.13/arangograph/deployments/private-endpoints.md delete mode 100644 site/content/3.13/arangograph/deployments/upgrades-and-versioning.md delete mode 100644 site/content/3.13/arangograph/migrate-to-the-cloud.md delete mode 100644 site/content/3.13/arangograph/monitoring-and-metrics.md delete mode 100644 site/content/3.13/arangograph/my-account.md delete mode 100644 site/content/3.13/arangograph/notebooks.md delete mode 100644 site/content/3.13/arangograph/oasisctl/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/accept/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/accept/accept-organization-invite.md delete mode 100644 site/content/3.13/arangograph/oasisctl/accept/accept-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/add/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/add/add-auditlog-destination.md delete mode 100644 site/content/3.13/arangograph/oasisctl/add/add-auditlog.md delete mode 100644 site/content/3.13/arangograph/oasisctl/add/add-group-members.md delete mode 100644 site/content/3.13/arangograph/oasisctl/add/add-group.md delete mode 100644 site/content/3.13/arangograph/oasisctl/auditlog/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/auditlog/auditlog-attach.md delete mode 100644 site/content/3.13/arangograph/oasisctl/auditlog/auditlog-detach.md delete mode 100644 site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached.md delete mode 100644 site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get.md delete mode 100644 site/content/3.13/arangograph/oasisctl/backup/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/backup/backup-copy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/backup/backup-download.md delete mode 100644 site/content/3.13/arangograph/oasisctl/clone/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/clone/clone-deployment-backup.md delete mode 100644 site/content/3.13/arangograph/oasisctl/clone/clone-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/completion.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-apikey.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-auditlog.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-backup-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-backup.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-cacertificate.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-example-installation.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-example.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-group.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-ipallowlist.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-metrics-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-metrics.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-notebook.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-organization-invite.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-private-endpoint-service.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-private-endpoint.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-private.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/create/create-role.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-apikey.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive-events.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-destination.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-auditlog.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-backup-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-backup.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-cacertificate.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-example-installation.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-example.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-group-members.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-group.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-ipallowlist.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-metrics-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-metrics.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-notebook.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-organization-invite.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-organization-members.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/delete/delete-role.md delete mode 100644 site/content/3.13/arangograph/oasisctl/disable/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md delete mode 100644 site/content/3.13/arangograph/oasisctl/enable/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md delete mode 100644 site/content/3.13/arangograph/oasisctl/generate-docs.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-auditlog-archive.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-auditlog-events.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-auditlog.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-backup-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-backup.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-cacertificate.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-example-installation.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-example.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-group.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-ipallowlist.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-metrics-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-metrics.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-notebook.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization-authentication-providers.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization-authentication.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization-email.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization-invite.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-private-endpoint-service.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-private-endpoint.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-private.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-provider.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-region.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-role.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-self.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-server-status.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-server.md delete mode 100644 site/content/3.13/arangograph/oasisctl/get/get-tandc.md delete mode 100644 site/content/3.13/arangograph/oasisctl/import.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-apikeys.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-arangodb-versions.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-arangodb.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-auditlog-archives.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-auditlog-destinations.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-auditlog.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-auditlogs.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-backup-policies.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-backup.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-backups.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-cacertificates.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-cpusizes.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-deployments.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-diskperformances.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-effective-permissions.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-effective.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-example-installations.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-example.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-examples.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-group-members.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-group.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-groups.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-ipallowlists.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-metrics-tokens.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-metrics.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-nodesizes.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-notebookmodels.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-notebooks.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-organization-invites.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-organization-members.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-organizations.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-permissions.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-projects.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-providers.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-regions.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-roles.md delete mode 100644 site/content/3.13/arangograph/oasisctl/list/list-servers.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/lock-cacertificate.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/lock-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/lock-ipallowlist.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/lock-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/lock-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/lock/lock-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/login.md delete mode 100644 site/content/3.13/arangograph/oasisctl/logs.md delete mode 100644 site/content/3.13/arangograph/oasisctl/options.md delete mode 100644 site/content/3.13/arangograph/oasisctl/pause/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/pause/pause-notebook.md delete mode 100644 site/content/3.13/arangograph/oasisctl/rebalance/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md delete mode 100644 site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/reject/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/reject/reject-organization-invite.md delete mode 100644 site/content/3.13/arangograph/oasisctl/reject/reject-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/renew/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/renew/renew-apikey-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/renew/renew-apikey.md delete mode 100644 site/content/3.13/arangograph/oasisctl/resume/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/resume/resume-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/resume/resume-notebook.md delete mode 100644 site/content/3.13/arangograph/oasisctl/revoke/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey.md delete mode 100644 site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics.md delete mode 100644 site/content/3.13/arangograph/oasisctl/rotate/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment-server.md delete mode 100644 site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/top.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/unlock-cacertificate.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/unlock-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/unlock-ipallowlist.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/unlock-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/unlock-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/unlock/unlock-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-auditlog.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-backup-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-backup.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-cacertificate.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-deployment.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-group.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-ipallowlist.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-metrics-token.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-metrics.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-notebook.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-organization-authentication-providers.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-organization-authentication.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-organization-email.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-organization.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-policy-add-binding.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-policy-add.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-policy-delete-binding.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-policy-delete.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-policy.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-private-endpoint-service.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-private-endpoint.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-private.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-project.md delete mode 100644 site/content/3.13/arangograph/oasisctl/update/update-role.md delete mode 100644 site/content/3.13/arangograph/oasisctl/upgrade.md delete mode 100644 site/content/3.13/arangograph/oasisctl/version.md delete mode 100644 site/content/3.13/arangograph/oasisctl/wait/_index.md delete mode 100644 site/content/3.13/arangograph/oasisctl/wait/wait-deployment.md delete mode 100644 site/content/3.13/arangograph/organizations/billing.md delete mode 100644 site/content/3.13/arangograph/organizations/credits-and-usage.md delete mode 100644 site/content/3.13/arangograph/organizations/users-and-groups.md delete mode 100644 site/content/3.13/arangograph/projects.md delete mode 100644 site/content/3.13/arangograph/security-and-access-control/_index.md delete mode 100644 site/content/3.13/arangograph/security-and-access-control/single-sign-on/_index.md delete mode 100644 site/content/3.13/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md delete mode 100644 site/content/3.13/arangograph/security-and-access-control/x-509-certificates.md delete mode 100644 site/content/3.13/data-science/graphrag/_index.md delete mode 100644 site/content/3.13/graphs/graph-visualizer.md rename site/content/{3.11/arangograph => amp}/_index.md (79%) rename site/content/{3.11/arangograph => amp}/api/_index.md (65%) rename site/content/{3.13/arangograph => amp}/api/get-started.md (93%) rename site/content/{3.10/arangograph => amp}/api/set-up-a-connection.md (100%) rename site/content/{3.12/arangograph => amp}/backups.md (83%) rename site/content/{3.12/arangograph => amp}/data-loader/_index.md (84%) rename site/content/{3.11/arangograph => amp}/data-loader/add-files.md (95%) rename site/content/{3.12/arangograph => amp}/data-loader/design-graph.md (91%) rename site/content/{3.10/arangograph => amp}/data-loader/example.md (85%) rename site/content/{3.10/arangograph => amp}/data-loader/import.md (100%) rename site/content/{3.12/arangograph => amp}/deployments/_index.md (94%) rename site/content/{3.12/arangograph => amp}/deployments/private-endpoints.md (91%) rename site/content/{3.10/arangograph => amp}/deployments/upgrades-and-versioning.md (100%) rename site/content/{3.11/arangograph => amp}/migrate-to-the-cloud.md (98%) rename site/content/{3.12/arangograph => amp}/monitoring-and-metrics.md (89%) rename site/content/{3.12/arangograph => amp}/my-account.md (85%) rename site/content/{3.12/arangograph => amp}/notebooks.md (98%) rename site/content/{3.10/arangograph => amp}/oasisctl/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/accept/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/accept/accept-organization-invite.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/accept/accept-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/add/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/add/add-auditlog-destination.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/add/add-auditlog.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/add/add-group-members.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/add/add-group.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/auditlog/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/auditlog/auditlog-attach.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/auditlog/auditlog-detach.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/auditlog/auditlog-get-attached-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/auditlog/auditlog-get-attached.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/auditlog/auditlog-get.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/backup/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/backup/backup-copy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/backup/backup-download.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/clone/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/clone/clone-deployment-backup.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/clone/clone-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/completion.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-apikey.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-auditlog.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-backup-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-backup.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-cacertificate.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-example-installation.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-example.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-group.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-ipallowlist.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-metrics-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-metrics.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-notebook.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-organization-invite.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-private-endpoint-service.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-private-endpoint.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-private.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/create/create-role.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-apikey.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-auditlog-archive-events.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-auditlog-archive.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-auditlog-destination.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-auditlog.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-backup-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-backup.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-cacertificate.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-example-installation.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-example.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-group-members.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-group.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-ipallowlist.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-metrics-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-metrics.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-notebook.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-organization-invite.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-organization-members.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/delete/delete-role.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/disable/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/disable/disable-scheduled-root-password-rotation.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/enable/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/enable/enable-scheduled-root-password-rotation.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/generate-docs.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-auditlog-archive.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-auditlog-events.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-auditlog.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-backup-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-backup.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-cacertificate.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-example-installation.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-example.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-group.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-ipallowlist.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-metrics-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-metrics.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-notebook.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization-authentication-providers.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization-authentication.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization-email-domain-restrictions.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization-email-domain.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization-email.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization-invite.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-private-endpoint-service.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-private-endpoint.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-private.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-provider.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-region.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-role.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-self.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-server-status.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-server.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/get/get-tandc.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/import.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-apikeys.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-arangodb-versions.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-arangodb.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-auditlog-archives.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-auditlog-destinations.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-auditlog.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-auditlogs.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-backup-policies.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-backup.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-backups.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-cacertificates.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-cpusizes.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-deployments.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-diskperformances.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-effective-permissions.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-effective.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-example-installations.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-example.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-examples.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-group-members.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-group.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-groups.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-ipallowlists.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-metrics-tokens.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-metrics.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-nodesizes.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-notebookmodels.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-notebooks.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-organization-invites.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-organization-members.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-organizations.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-permissions.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-projects.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-providers.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-regions.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-roles.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/list/list-servers.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/lock-cacertificate.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/lock-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/lock-ipallowlist.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/lock-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/lock-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/lock/lock-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/login.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/logs.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/options.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/pause/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/pause/pause-notebook.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/rebalance/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/rebalance/rebalance-deployment-shards.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/rebalance/rebalance-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/reject/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/reject/reject-organization-invite.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/reject/reject-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/renew/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/renew/renew-apikey-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/renew/renew-apikey.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/resume/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/resume/resume-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/resume/resume-notebook.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/revoke/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/revoke/revoke-apikey-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/revoke/revoke-apikey.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/revoke/revoke-metrics-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/revoke/revoke-metrics.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/rotate/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/rotate/rotate-deployment-server.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/rotate/rotate-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/top.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/unlock-cacertificate.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/unlock-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/unlock-ipallowlist.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/unlock-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/unlock-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/unlock/unlock-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-auditlog.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-backup-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-backup.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-cacertificate.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-deployment.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-group.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-ipallowlist.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-metrics-token.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-metrics.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-notebook.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-organization-authentication-providers.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-organization-authentication.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-organization-email-domain-restrictions.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-organization-email-domain.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-organization-email.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-organization.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-policy-add-binding.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-policy-add.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-policy-delete-binding.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-policy-delete.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-policy.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-private-endpoint-service.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-private-endpoint.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-private.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-project.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/update/update-role.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/upgrade.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/version.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/wait/_index.md (100%) rename site/content/{3.10/arangograph => amp}/oasisctl/wait/wait-deployment.md (100%) rename site/content/{3.13/arangograph => amp}/organizations/_index.md (92%) rename site/content/{3.11/arangograph => amp}/organizations/billing.md (85%) rename site/content/{3.10/arangograph => amp}/organizations/credits-and-usage.md (98%) rename site/content/{3.10/arangograph => amp}/organizations/users-and-groups.md (90%) rename site/content/{3.10/arangograph => amp}/projects.md (93%) rename site/content/{3.12/arangograph => amp}/security-and-access-control/_index.md (98%) rename site/content/{3.11/arangograph => amp}/security-and-access-control/single-sign-on/_index.md (87%) rename site/content/{3.12/arangograph => amp}/security-and-access-control/single-sign-on/scim-provisioning.md (97%) rename site/content/{3.12/arangograph => amp}/security-and-access-control/x-509-certificates.md (94%) rename site/content/{ => arangodb}/3.10/_index.md (82%) rename site/content/{3.11/about-arangodb => arangodb/3.10/about}/_index.md (82%) rename site/content/{3.10/about-arangodb => arangodb/3.10/about}/features/_index.md (98%) rename site/content/{3.10/about-arangodb => arangodb/3.10/about}/features/community-edition.md (100%) rename site/content/{3.11/about-arangodb => arangodb/3.10/about}/features/enterprise-edition.md (98%) rename site/content/{3.10/about-arangodb => arangodb/3.10/about}/features/highlights-by-version.md (100%) rename site/content/{3.13/about-arangodb => arangodb/3.10/about}/use-cases.md (77%) rename site/content/{ => arangodb}/3.10/aql/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/common-errors.md (100%) rename site/content/{ => arangodb}/3.10/aql/data-queries.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/counting.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/create-test-data.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/diffing-two-documents.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/dynamic-attribute-names.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/grouping.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/joins.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/projections-and-filters.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/queries-without-collections.md (100%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/remove-vertex.md (96%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/traversals.md (98%) rename site/content/{ => arangodb}/3.10/aql/examples-and-query-patterns/upsert-repsert-guide.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/caching-query-results.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/explaining-queries.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/parsing-queries.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/query-optimization.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/query-profiling.md (100%) rename site/content/{ => arangodb}/3.10/aql/execution-and-performance/query-statistics.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/arangosearch.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/array.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/bit.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/date.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/document-object.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/fulltext.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/geo.md (99%) rename site/content/{ => arangodb}/3.10/aql/functions/miscellaneous.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/numeric.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/string.md (100%) rename site/content/{ => arangodb}/3.10/aql/functions/type-check-and-cast.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/accessing-data-from-collections.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/bind-parameters.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/data-types.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/limitations.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/query-errors.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/query-results.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/subqueries.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/syntax.md (100%) rename site/content/{ => arangodb}/3.10/aql/fundamentals/type-and-value-order.md (100%) rename site/content/{ => arangodb}/3.10/aql/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/graphs/all-shortest-paths.md (98%) rename site/content/{ => arangodb}/3.10/aql/graphs/k-paths.md (98%) rename site/content/{ => arangodb}/3.10/aql/graphs/k-shortest-paths.md (98%) rename site/content/{ => arangodb}/3.10/aql/graphs/shortest-path.md (98%) rename site/content/{ => arangodb}/3.10/aql/graphs/traversals-explained.md (83%) rename site/content/{ => arangodb}/3.10/aql/graphs/traversals.md (99%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/collect.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/filter.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/for.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/insert.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/let.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/limit.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/remove.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/replace.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/return.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/search.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/sort.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/update.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/upsert.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/window.md (100%) rename site/content/{ => arangodb}/3.10/aql/high-level-operations/with.md (100%) rename site/content/{ => arangodb}/3.10/aql/how-to-invoke-aql/_index.md (100%) rename site/content/{ => arangodb}/3.10/aql/how-to-invoke-aql/with-arangosh.md (100%) rename site/content/{ => arangodb}/3.10/aql/how-to-invoke-aql/with-the-web-interface.md (100%) rename site/content/{ => arangodb}/3.10/aql/operators.md (100%) rename site/content/{ => arangodb}/3.10/aql/user-defined-functions.md (100%) rename site/content/{ => arangodb}/3.10/components/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/arangodb-server/_index.md (88%) rename site/content/{ => arangodb}/3.10/components/arangodb-server/environment-variables.md (100%) rename site/content/{ => arangodb}/3.10/components/arangodb-server/ldap.md (100%) rename site/content/{ => arangodb}/3.10/components/arangodb-server/options.md (100%) rename site/content/{ => arangodb}/3.10/components/arangodb-server/storage-engine.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/_index.md (94%) rename site/content/{ => arangodb}/3.10/components/tools/arangobackup/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangobackup/examples.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangobackup/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangobench/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangobench/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-shell/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-shell/details.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-shell/examples.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-shell/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-starter/architecture.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-starter/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodb-starter/security.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodump/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodump/examples.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodump/limitations.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodump/maskings.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangodump/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoexport/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoexport/examples.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoexport/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoimport/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoimport/details.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoimport/examples-csv.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoimport/examples-json.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoimport/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoinspect/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoinspect/examples.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangoinspect/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangorestore/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangorestore/examples.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangorestore/fast-cluster-restore.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangorestore/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangovpack/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/arangovpack/options.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/foxx-cli/_index.md (100%) rename site/content/{ => arangodb}/3.10/components/tools/foxx-cli/details.md (100%) rename site/content/{3.11 => arangodb/3.10}/components/web-interface/_index.md (90%) rename site/content/{ => arangodb}/3.10/components/web-interface/cluster.md (94%) rename site/content/{ => arangodb}/3.10/components/web-interface/collections.md (91%) rename site/content/{ => arangodb}/3.10/components/web-interface/dashboard.md (92%) rename site/content/{3.11 => arangodb/3.10}/components/web-interface/document.md (87%) rename site/content/{ => arangodb}/3.10/components/web-interface/graphs.md (95%) rename site/content/{3.11 => arangodb/3.10}/components/web-interface/logs.md (87%) rename site/content/{ => arangodb}/3.10/components/web-interface/queries.md (91%) rename site/content/{ => arangodb}/3.10/components/web-interface/services.md (87%) rename site/content/{3.11 => arangodb/3.10}/components/web-interface/users.md (90%) rename site/content/{ => arangodb}/3.10/concepts/_index.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-models.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-retrieval.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/_index.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/collections.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/databases.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/documents/_index.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/documents/computed-values.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/documents/schema-validation.md (100%) rename site/content/{ => arangodb}/3.10/concepts/data-structure/views.md (100%) rename site/content/{ => arangodb}/3.10/data-science/_index.md (95%) rename site/content/{ => arangodb}/3.10/data-science/adapters/_index.md (100%) rename site/content/{ => arangodb}/3.10/data-science/adapters/arangodb-cugraph-adapter.md (100%) rename site/content/{ => arangodb}/3.10/data-science/adapters/arangodb-dgl-adapter.md (100%) rename site/content/{ => arangodb}/3.10/data-science/adapters/arangodb-networkx-adapter.md (100%) rename site/content/{ => arangodb}/3.10/data-science/adapters/arangodb-pyg-adapter.md (100%) rename site/content/{ => arangodb}/3.10/data-science/adapters/arangodb-rdf-adapter.md (100%) create mode 100644 site/content/arangodb/3.10/data-science/arangograph-notebooks.md rename site/content/{ => arangodb}/3.10/data-science/arangographml/_index.md (97%) rename site/content/{ => arangodb}/3.10/data-science/arangographml/deploy.md (79%) rename site/content/{ => arangodb}/3.10/data-science/arangographml/getting-started.md (99%) rename site/content/{ => arangodb}/3.10/data-science/llm-knowledge-graphs.md (97%) rename site/content/{ => arangodb}/3.10/data-science/pregel/_index.md (100%) rename site/content/{ => arangodb}/3.10/data-science/pregel/algorithms.md (98%) rename site/content/{ => arangodb}/3.10/deploy/_index.md (98%) rename site/content/{ => arangodb}/3.10/deploy/active-failover/_index.md (98%) rename site/content/{ => arangodb}/3.10/deploy/active-failover/administration.md (100%) rename site/content/{ => arangodb}/3.10/deploy/active-failover/manual-start.md (100%) rename site/content/{ => arangodb}/3.10/deploy/active-failover/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/_index.md (99%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/administration.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/deployment/_index.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/deployment/arangodb-cluster.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/deployment/arangosync-master.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/deployment/arangosync-workers.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/deployment/prometheus-and-grafana.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/monitoring.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/operations-and-maintenance.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/security.md (100%) rename site/content/{ => arangodb}/3.10/deploy/arangosync/troubleshooting.md (100%) rename site/content/{ => arangodb}/3.10/deploy/architecture/_index.md (100%) rename site/content/{ => arangodb}/3.10/deploy/architecture/data-sharding.md (98%) rename site/content/{ => arangodb}/3.10/deploy/architecture/replication.md (100%) rename site/content/{ => arangodb}/3.10/deploy/architecture/scalability.md (100%) rename site/content/{ => arangodb}/3.10/deploy/cluster/_index.md (98%) rename site/content/{ => arangodb}/3.10/deploy/cluster/administration.md (100%) rename site/content/{ => arangodb}/3.10/deploy/cluster/deployment/_index.md (97%) rename site/content/{ => arangodb}/3.10/deploy/cluster/deployment/manual-start.md (100%) rename site/content/{ => arangodb}/3.10/deploy/cluster/deployment/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.10/deploy/cluster/limitations.md (100%) rename site/content/{ => arangodb}/3.10/deploy/in-the-cloud.md (100%) rename site/content/{ => arangodb}/3.10/deploy/kubernetes.md (100%) rename site/content/{3.11 => arangodb/3.10}/deploy/oneshard.md (99%) rename site/content/{ => arangodb}/3.10/deploy/production-checklist.md (100%) rename site/content/{ => arangodb}/3.10/deploy/single-instance-vs-cluster.md (100%) rename site/content/{ => arangodb}/3.10/deploy/single-instance/_index.md (100%) rename site/content/{ => arangodb}/3.10/deploy/single-instance/manual-start.md (100%) rename site/content/{ => arangodb}/3.10/deploy/single-instance/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.10/develop/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/csharp-dotnet.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/go.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-6/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-6/driver-setup.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-6/serialization.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-7/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-7/changes-in-version-7.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-7/driver-setup.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/java/reference-version-7/serialization.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/nodejs.md (100%) rename site/content/{ => arangodb}/3.10/develop/drivers/python.md (100%) rename site/content/{ => arangodb}/3.10/develop/error-codes-and-meanings.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/deployment.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/getting-started.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/access-from-the-browser.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/development-mode.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/foxx-in-a-cluster.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/linking-services-together.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/making-requests.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/scripts-and-scheduling.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/testing-foxx-services.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/using-node-modules.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/using-webpack-with-foxx.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/working-with-collections.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/working-with-files.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/working-with-routers.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/guides/writing-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/configuration.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/related-modules/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/related-modules/authentication.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/related-modules/graphql.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/related-modules/oauth-2-0.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/related-modules/queues.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/routers/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/routers/endpoints.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/routers/middleware.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/routers/request.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/routers/response.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/service-context.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/service-manifest.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md (100%) rename site/content/{ => arangodb}/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/_index.md (98%) rename site/content/{ => arangodb}/3.10/develop/http-api/administration.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/authentication.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/batch-requests.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/cluster.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/collections.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/databases.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/documents.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/foxx.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/general-request-handling.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/graphs/edges.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/graphs/named-graphs.md (99%) rename site/content/{ => arangodb}/3.10/develop/http-api/hot-backups.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/import.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/fulltext.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/geo-spatial.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/inverted.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/multi-dimensional.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/persistent.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/indexes/ttl.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/jobs.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/monitoring/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/monitoring/logs.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/monitoring/metrics.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/monitoring/statistics.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/pregel.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/queries/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/queries/aql-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/queries/aql-query-results-cache.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/queries/user-defined-aql-functions.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/replication/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/replication/other-replication-commands.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/replication/replication-applier.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/replication/replication-dump.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/replication/replication-logger.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/replication/write-ahead-log.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/security.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/tasks.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/users.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/views/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/views/arangosearch-views.md (100%) rename site/content/{ => arangodb}/3.10/develop/http-api/views/search-alias-views.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md (99%) rename site/content/{ => arangodb}/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-boot-arangodb.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/migration.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-3/template.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.10/develop/integrations/spring-data-arangodb/reference-version-4/template.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/@arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/@arangodb/collection-object.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/@arangodb/cursor-object.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/@arangodb/db-object.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/@arangodb/view-object.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/actions.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/aql-queries.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/console.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/crypto.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/fs.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/request.md (100%) rename site/content/{ => arangodb}/3.10/develop/javascript-api/tasks.md (100%) rename site/content/{ => arangodb}/3.10/develop/operational-factors.md (100%) rename site/content/{ => arangodb}/3.10/develop/satellitecollections.md (100%) rename site/content/{ => arangodb}/3.10/develop/smartjoins.md (100%) rename site/content/{ => arangodb}/3.10/develop/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.10/develop/transactions/durability.md (100%) rename site/content/{ => arangodb}/3.10/develop/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.10/develop/transactions/limitations.md (100%) rename site/content/{ => arangodb}/3.10/develop/transactions/locking-and-isolation.md (100%) rename site/content/{ => arangodb}/3.10/develop/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.10/get-started/_index.md (100%) rename site/content/{ => arangodb}/3.10/get-started/how-to-interact-with-arangodb.md (100%) rename site/content/{ => arangodb}/3.10/get-started/on-premises-installation.md (94%) rename site/content/{ => arangodb}/3.10/get-started/set-up-a-cloud-instance.md (70%) rename site/content/{ => arangodb}/3.10/get-started/start-using-aql.md (100%) rename site/content/{ => arangodb}/3.10/graphs/_index.md (97%) rename site/content/{ => arangodb}/3.10/graphs/enterprisegraphs/_index.md (100%) rename site/content/{ => arangodb}/3.10/graphs/enterprisegraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.10/graphs/enterprisegraphs/management.md (100%) rename site/content/{3.11 => arangodb/3.10}/graphs/example-graphs.md (94%) rename site/content/{ => arangodb}/3.10/graphs/general-graphs/_index.md (98%) rename site/content/{3.11 => arangodb/3.10}/graphs/general-graphs/functions.md (99%) rename site/content/{ => arangodb}/3.10/graphs/general-graphs/management.md (100%) rename site/content/{ => arangodb}/3.10/graphs/satellitegraphs/_index.md (98%) rename site/content/{ => arangodb}/3.10/graphs/satellitegraphs/details.md (100%) rename site/content/{ => arangodb}/3.10/graphs/satellitegraphs/management.md (100%) rename site/content/{ => arangodb}/3.10/graphs/smartgraphs/_index.md (94%) rename site/content/{ => arangodb}/3.10/graphs/smartgraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.10/graphs/smartgraphs/management.md (100%) rename site/content/{ => arangodb}/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md (100%) rename site/content/{ => arangodb}/3.10/graphs/working-with-edges.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/_index.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/analyzers.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/_index.md (99%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/arangosearch-views-reference.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/case-sensitivity-and-diacritics.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/exact-value-matching.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/example-datasets.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/faceted-search.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/full-text-token-search.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/fuzzy-search.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/geospatial-search.md (99%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/nested-search.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/performance.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/phrase-and-proximity-search.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/prefix-matching.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/range-queries.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/ranking.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/search-alias-views-reference.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/search-highlighting.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/arangosearch/wildcard-search.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/_index.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/basics.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/index-utilization.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/which-index-to-use-when.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/_index.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/fulltext-indexes.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/inverted-indexes.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/persistent-indexes.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/ttl-indexes.md (100%) rename site/content/{ => arangodb}/3.10/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md (100%) rename site/content/{ => arangodb}/3.10/operations/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/arangodb-starter/recovery-procedure.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/arangodb-starter/removal-procedure.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/configuration.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/import-and-export.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/license-management.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/log-levels.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/reduce-memory-footprint.md (99%) rename site/content/{ => arangodb}/3.10/operations/administration/user-management/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/administration/user-management/in-arangosh.md (100%) rename site/content/{ => arangodb}/3.10/operations/backup-and-restore.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/_index.md (97%) rename site/content/{ => arangodb}/3.10/operations/installation/compiling/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/compiling/compile-on-debian.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/compiling/compile-on-windows.md (99%) rename site/content/{ => arangodb}/3.10/operations/installation/compiling/recompiling-jemalloc.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/compiling/running-custom-build.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/docker.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/linux/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/linux/linux-os-tuning-script-examples.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/linux/operating-system-configuration.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/macos.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/uninstallation.md (100%) rename site/content/{ => arangodb}/3.10/operations/installation/windows.md (100%) rename site/content/{ => arangodb}/3.10/operations/security/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/security/audit-logging.md (98%) rename site/content/{ => arangodb}/3.10/operations/security/change-root-password.md (100%) rename site/content/{ => arangodb}/3.10/operations/security/encryption-at-rest.md (97%) rename site/content/{ => arangodb}/3.10/operations/security/securing-starter-deployments.md (100%) rename site/content/{ => arangodb}/3.10/operations/security/security-options.md (100%) rename site/content/{ => arangodb}/3.10/operations/troubleshooting/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/troubleshooting/arangod.md (100%) rename site/content/{ => arangodb}/3.10/operations/troubleshooting/cluster/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/troubleshooting/cluster/agency-dump.md (100%) rename site/content/{ => arangodb}/3.10/operations/troubleshooting/emergency-console.md (100%) rename site/content/{ => arangodb}/3.10/operations/troubleshooting/query-debug-packages.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/community-to-enterprise-upgrade.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/downgrading.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/manual-deployments/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/manual-deployments/active-failover.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/manual-deployments/cluster.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/os-specific-information/_index.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/os-specific-information/linux.md (100%) rename site/content/{ => arangodb}/3.10/operations/upgrading/os-specific-information/macos.md (95%) rename site/content/{ => arangodb}/3.10/operations/upgrading/os-specific-information/windows.md (96%) rename site/content/{ => arangodb}/3.10/operations/upgrading/starter-deployments.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/deprecated-and-removed-features.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.0/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.0/incompatible-changes-in-3-0.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.0/whats-new-in-3-0.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.1/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.1/incompatible-changes-in-3-1.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.1/whats-new-in-3-1.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.10/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.10/api-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.10/incompatible-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.10/known-issues-in-3-10.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.10/whats-new-in-3-10.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.2/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.2/incompatible-changes-in-3-2.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.2/known-issues-in-3-2.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.2/whats-new-in-3-2.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.3/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.3/incompatible-changes-in-3-3.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.3/known-issues-in-3-3.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.3/whats-new-in-3-3.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.4/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.4/incompatible-changes-in-3-4.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.4/known-issues-in-3-4.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.4/whats-new-in-3-4.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.5/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.5/incompatible-changes-in-3-5.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.5/known-issues-in-3-5.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.5/whats-new-in-3-5.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.6/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.6/incompatible-changes-in-3-6.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.6/known-issues-in-3-6.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.6/whats-new-in-3-6.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.7/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.7/api-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.7/incompatible-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.7/known-issues-in-3-7.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.7/whats-new-in-3-7.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.8/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.8/api-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.8/incompatible-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.8/known-issues-in-3-8.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.8/whats-new-in-3-8.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.9/_index.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.9/api-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.9/incompatible-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.9/known-issues-in-3-9.md (100%) rename site/content/{ => arangodb}/3.10/release-notes/version-3.9/whats-new-in-3-9.md (100%) rename site/content/{ => arangodb}/3.11/_index.md (88%) rename site/content/{3.10/about-arangodb => arangodb/3.11/about}/_index.md (82%) rename site/content/{3.11/about-arangodb => arangodb/3.11/about}/features/_index.md (98%) rename site/content/{3.11/about-arangodb => arangodb/3.11/about}/features/community-edition.md (100%) rename site/content/{3.10/about-arangodb => arangodb/3.11/about}/features/enterprise-edition.md (100%) rename site/content/{3.11/about-arangodb => arangodb/3.11/about}/features/highlights-by-version.md (100%) rename site/content/{3.10/about-arangodb => arangodb/3.11/about}/use-cases.md (77%) rename site/content/{ => arangodb}/3.11/aql/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/common-errors.md (100%) rename site/content/{ => arangodb}/3.11/aql/data-queries.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/counting.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/create-test-data.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/diffing-two-documents.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/dynamic-attribute-names.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/grouping.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/joins.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/projections-and-filters.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/queries-without-collections.md (100%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/remove-vertex.md (96%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/traversals.md (98%) rename site/content/{ => arangodb}/3.11/aql/examples-and-query-patterns/upsert-repsert-guide.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/caching-query-results.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/explaining-queries.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/parsing-queries.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/query-optimization.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/query-profiling.md (100%) rename site/content/{ => arangodb}/3.11/aql/execution-and-performance/query-statistics.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/arangosearch.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/array.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/bit.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/date.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/document-object.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/fulltext.md (100%) rename site/content/{3.12 => arangodb/3.11}/aql/functions/geo.md (99%) rename site/content/{ => arangodb}/3.11/aql/functions/miscellaneous.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/numeric.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/string.md (100%) rename site/content/{ => arangodb}/3.11/aql/functions/type-check-and-cast.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/accessing-data-from-collections.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/bind-parameters.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/data-types.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/limitations.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/query-errors.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/query-results.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/subqueries.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/syntax.md (100%) rename site/content/{ => arangodb}/3.11/aql/fundamentals/type-and-value-order.md (100%) rename site/content/{ => arangodb}/3.11/aql/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/graphs/all-shortest-paths.md (98%) rename site/content/{ => arangodb}/3.11/aql/graphs/k-paths.md (98%) rename site/content/{ => arangodb}/3.11/aql/graphs/k-shortest-paths.md (98%) rename site/content/{ => arangodb}/3.11/aql/graphs/shortest-path.md (98%) rename site/content/{ => arangodb}/3.11/aql/graphs/traversals-explained.md (83%) rename site/content/{ => arangodb}/3.11/aql/graphs/traversals.md (99%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/collect.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/filter.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/for.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/insert.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/let.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/limit.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/remove.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/replace.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/return.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/search.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/sort.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/update.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/upsert.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/window.md (100%) rename site/content/{ => arangodb}/3.11/aql/high-level-operations/with.md (100%) rename site/content/{ => arangodb}/3.11/aql/how-to-invoke-aql/_index.md (100%) rename site/content/{ => arangodb}/3.11/aql/how-to-invoke-aql/with-arangosh.md (100%) rename site/content/{ => arangodb}/3.11/aql/how-to-invoke-aql/with-the-web-interface.md (100%) rename site/content/{ => arangodb}/3.11/aql/operators.md (100%) rename site/content/{ => arangodb}/3.11/aql/user-defined-functions.md (100%) rename site/content/{ => arangodb}/3.11/components/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/arangodb-server/_index.md (88%) rename site/content/{ => arangodb}/3.11/components/arangodb-server/environment-variables.md (100%) rename site/content/{ => arangodb}/3.11/components/arangodb-server/ldap.md (100%) rename site/content/{ => arangodb}/3.11/components/arangodb-server/options.md (100%) rename site/content/{ => arangodb}/3.11/components/arangodb-server/storage-engine.md (100%) rename site/content/{3.12 => arangodb/3.11}/components/tools/_index.md (94%) rename site/content/{ => arangodb}/3.11/components/tools/arango-datasets.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangobackup/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangobackup/examples.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangobackup/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangobench/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangobench/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-shell/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-shell/details.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-shell/examples.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-shell/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-starter/architecture.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-starter/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodb-starter/security.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodump/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodump/examples.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodump/limitations.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodump/maskings.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangodump/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoexport/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoexport/examples.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoexport/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoimport/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoimport/details.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoimport/examples-csv.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoimport/examples-json.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoimport/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoinspect/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoinspect/examples.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangoinspect/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangorestore/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangorestore/examples.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangorestore/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangovpack/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/arangovpack/options.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/foxx-cli/_index.md (100%) rename site/content/{ => arangodb}/3.11/components/tools/foxx-cli/details.md (100%) rename site/content/{3.10 => arangodb/3.11}/components/web-interface/_index.md (90%) rename site/content/{ => arangodb}/3.11/components/web-interface/cluster.md (94%) rename site/content/{ => arangodb}/3.11/components/web-interface/collections.md (91%) rename site/content/{ => arangodb}/3.11/components/web-interface/dashboard.md (92%) rename site/content/{3.10 => arangodb/3.11}/components/web-interface/document.md (87%) rename site/content/{ => arangodb}/3.11/components/web-interface/graphs.md (98%) rename site/content/{3.10 => arangodb/3.11}/components/web-interface/logs.md (87%) rename site/content/{ => arangodb}/3.11/components/web-interface/queries.md (91%) rename site/content/{ => arangodb}/3.11/components/web-interface/services.md (87%) rename site/content/{3.10 => arangodb/3.11}/components/web-interface/users.md (90%) rename site/content/{ => arangodb}/3.11/concepts/_index.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-models.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-retrieval.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/_index.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/collections.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/databases.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/documents/_index.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/documents/computed-values.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/documents/schema-validation.md (100%) rename site/content/{ => arangodb}/3.11/concepts/data-structure/views.md (100%) rename site/content/{ => arangodb}/3.11/data-science/_index.md (94%) rename site/content/{ => arangodb}/3.11/data-science/adapters/_index.md (100%) rename site/content/{ => arangodb}/3.11/data-science/adapters/arangodb-cugraph-adapter.md (100%) rename site/content/{ => arangodb}/3.11/data-science/adapters/arangodb-dgl-adapter.md (100%) rename site/content/{ => arangodb}/3.11/data-science/adapters/arangodb-networkx-adapter.md (100%) rename site/content/{ => arangodb}/3.11/data-science/adapters/arangodb-pyg-adapter.md (100%) rename site/content/{ => arangodb}/3.11/data-science/adapters/arangodb-rdf-adapter.md (100%) create mode 100644 site/content/arangodb/3.11/data-science/arangograph-notebooks.md rename site/content/{ => arangodb}/3.11/data-science/arangographml/_index.md (98%) rename site/content/{ => arangodb}/3.11/data-science/arangographml/deploy.md (94%) rename site/content/{ => arangodb}/3.11/data-science/arangographml/getting-started.md (99%) rename site/content/{ => arangodb}/3.11/data-science/graph-analytics.md (98%) rename site/content/{ => arangodb}/3.11/data-science/llm-knowledge-graphs.md (97%) rename site/content/{ => arangodb}/3.11/data-science/pregel/_index.md (100%) rename site/content/{ => arangodb}/3.11/data-science/pregel/algorithms.md (98%) rename site/content/{ => arangodb}/3.11/deploy/_index.md (97%) rename site/content/{ => arangodb}/3.11/deploy/active-failover/_index.md (99%) rename site/content/{ => arangodb}/3.11/deploy/active-failover/administration.md (100%) rename site/content/{ => arangodb}/3.11/deploy/active-failover/manual-start.md (100%) rename site/content/{ => arangodb}/3.11/deploy/active-failover/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/_index.md (99%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/administration.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/deployment/_index.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/deployment/arangodb-cluster.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/deployment/arangosync-master.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/deployment/arangosync-workers.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/deployment/prometheus-and-grafana.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/monitoring.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/operations-and-maintenance.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/security.md (100%) rename site/content/{ => arangodb}/3.11/deploy/arangosync/troubleshooting.md (100%) rename site/content/{ => arangodb}/3.11/deploy/architecture/_index.md (100%) rename site/content/{ => arangodb}/3.11/deploy/architecture/data-sharding.md (98%) rename site/content/{ => arangodb}/3.11/deploy/architecture/replication.md (100%) rename site/content/{ => arangodb}/3.11/deploy/architecture/scalability.md (100%) rename site/content/{ => arangodb}/3.11/deploy/cluster/_index.md (98%) rename site/content/{ => arangodb}/3.11/deploy/cluster/administration.md (100%) rename site/content/{ => arangodb}/3.11/deploy/cluster/deployment/_index.md (97%) rename site/content/{ => arangodb}/3.11/deploy/cluster/deployment/manual-start.md (100%) rename site/content/{ => arangodb}/3.11/deploy/cluster/deployment/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.11/deploy/cluster/limitations.md (100%) rename site/content/{ => arangodb}/3.11/deploy/in-the-cloud.md (100%) rename site/content/{ => arangodb}/3.11/deploy/kubernetes.md (100%) rename site/content/{3.10 => arangodb/3.11}/deploy/oneshard.md (99%) rename site/content/{ => arangodb}/3.11/deploy/production-checklist.md (100%) rename site/content/{ => arangodb}/3.11/deploy/single-instance-vs-cluster.md (100%) rename site/content/{ => arangodb}/3.11/deploy/single-instance/_index.md (100%) rename site/content/{ => arangodb}/3.11/deploy/single-instance/manual-start.md (100%) rename site/content/{ => arangodb}/3.11/deploy/single-instance/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.11/develop/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/go.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-6/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-6/driver-setup.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-6/serialization.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-7/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-7/changes-in-version-7.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-7/driver-setup.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/java/reference-version-7/serialization.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/javascript.md (100%) rename site/content/{ => arangodb}/3.11/develop/drivers/python.md (100%) rename site/content/{ => arangodb}/3.11/develop/error-codes.md (100%) rename site/content/{ => arangodb}/3.11/develop/exit-codes.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/deployment.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/getting-started.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/access-from-the-browser.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/development-mode.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/foxx-in-a-cluster.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/linking-services-together.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/making-requests.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/scripts-and-scheduling.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/testing-foxx-services.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/using-node-modules.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/using-webpack-with-foxx.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/working-with-collections.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/working-with-files.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/working-with-routers.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/guides/writing-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/configuration.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/related-modules/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/related-modules/authentication.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/related-modules/graphql.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/related-modules/oauth-2-0.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/related-modules/queues.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/routers/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/routers/endpoints.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/routers/middleware.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/routers/request.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/routers/response.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/service-context.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/service-manifest.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md (100%) rename site/content/{ => arangodb}/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/_index.md (98%) rename site/content/{ => arangodb}/3.11/develop/http-api/administration.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/authentication.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/batch-requests.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/cluster.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/collections.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/databases.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/documents.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/foxx.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/general-request-handling.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/graphs/edges.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/graphs/named-graphs.md (99%) rename site/content/{ => arangodb}/3.11/develop/http-api/hot-backups.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/import.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/fulltext.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/geo-spatial.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/inverted.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/multi-dimensional.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/persistent.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/indexes/ttl.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/jobs.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/monitoring/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/monitoring/logs.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/monitoring/metrics.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/monitoring/statistics.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/pregel.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/queries/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/queries/aql-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/queries/aql-query-results-cache.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/queries/user-defined-aql-functions.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/replication/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/replication/other-replication-commands.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/replication/replication-applier.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/replication/replication-dump.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/replication/replication-logger.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/replication/write-ahead-log.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/security.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/tasks.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/users.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/views/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/views/arangosearch-views.md (100%) rename site/content/{ => arangodb}/3.11/develop/http-api/views/search-alias-views.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md (99%) rename site/content/{ => arangodb}/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-boot-arangodb.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/migration.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-3/template.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.11/develop/integrations/spring-data-arangodb/reference-version-4/template.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/@arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/@arangodb/collection-object.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/@arangodb/cursor-object.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/@arangodb/db-object.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/@arangodb/view-object.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/actions.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/aql-queries.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/console.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/crypto.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/fs.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/request.md (100%) rename site/content/{ => arangodb}/3.11/develop/javascript-api/tasks.md (100%) rename site/content/{ => arangodb}/3.11/develop/operational-factors.md (100%) rename site/content/{ => arangodb}/3.11/develop/satellitecollections.md (100%) rename site/content/{ => arangodb}/3.11/develop/smartjoins.md (100%) rename site/content/{ => arangodb}/3.11/develop/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.11/develop/transactions/durability.md (100%) rename site/content/{ => arangodb}/3.11/develop/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.11/develop/transactions/limitations.md (100%) rename site/content/{ => arangodb}/3.11/develop/transactions/locking-and-isolation.md (100%) rename site/content/{ => arangodb}/3.11/develop/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.11/get-started/_index.md (100%) rename site/content/{ => arangodb}/3.11/get-started/how-to-interact-with-arangodb.md (100%) rename site/content/{ => arangodb}/3.11/get-started/on-premises-installation.md (94%) rename site/content/{ => arangodb}/3.11/get-started/set-up-a-cloud-instance.md (71%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/_index.md (100%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/crud.md (100%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/dataset.md (100%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/filter.md (100%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/geo.md (100%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/graphs.md (98%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/joins.md (100%) rename site/content/{ => arangodb}/3.11/get-started/start-using-aql/sort-limit.md (100%) rename site/content/{ => arangodb}/3.11/graphs/_index.md (97%) rename site/content/{ => arangodb}/3.11/graphs/enterprisegraphs/_index.md (100%) rename site/content/{ => arangodb}/3.11/graphs/enterprisegraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.11/graphs/enterprisegraphs/management.md (100%) rename site/content/{3.10 => arangodb/3.11}/graphs/example-graphs.md (94%) rename site/content/{ => arangodb}/3.11/graphs/general-graphs/_index.md (98%) rename site/content/{3.10 => arangodb/3.11}/graphs/general-graphs/functions.md (99%) rename site/content/{ => arangodb}/3.11/graphs/general-graphs/management.md (100%) rename site/content/{ => arangodb}/3.11/graphs/satellitegraphs/_index.md (98%) rename site/content/{ => arangodb}/3.11/graphs/satellitegraphs/details.md (100%) rename site/content/{ => arangodb}/3.11/graphs/satellitegraphs/management.md (100%) rename site/content/{ => arangodb}/3.11/graphs/smartgraphs/_index.md (94%) rename site/content/{ => arangodb}/3.11/graphs/smartgraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.11/graphs/smartgraphs/management.md (100%) rename site/content/{ => arangodb}/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md (100%) rename site/content/{ => arangodb}/3.11/graphs/working-with-edges.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/_index.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/analyzers.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/_index.md (99%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/arangosearch-views-reference.md (99%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/case-sensitivity-and-diacritics.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/exact-value-matching.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/example-datasets.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/faceted-search.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/full-text-token-search.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/fuzzy-search.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/geospatial-search.md (99%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/nested-search.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/performance.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/phrase-and-proximity-search.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/prefix-matching.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/range-queries.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/ranking.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/search-alias-views-reference.md (97%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/search-highlighting.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/arangosearch/wildcard-search.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/_index.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/basics.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/index-utilization.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/which-index-to-use-when.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/_index.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/fulltext-indexes.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/inverted-indexes.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/persistent-indexes.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/ttl-indexes.md (100%) rename site/content/{ => arangodb}/3.11/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md (100%) rename site/content/{ => arangodb}/3.11/operations/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/arangodb-starter/recovery-procedure.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/arangodb-starter/removal-procedure.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/configuration.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/import-and-export.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/license-management.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/log-levels.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/reduce-memory-footprint.md (99%) rename site/content/{ => arangodb}/3.11/operations/administration/telemetrics.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/user-management/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/administration/user-management/in-arangosh.md (100%) rename site/content/{ => arangodb}/3.11/operations/backup-and-restore.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/_index.md (97%) rename site/content/{ => arangodb}/3.11/operations/installation/compiling/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/compiling/compile-on-debian.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/compiling/compile-on-windows.md (99%) rename site/content/{ => arangodb}/3.11/operations/installation/compiling/recompiling-jemalloc.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/compiling/running-custom-build.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/docker.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/linux/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/linux/linux-os-tuning-script-examples.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/linux/operating-system-configuration.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/macos.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/uninstallation.md (100%) rename site/content/{ => arangodb}/3.11/operations/installation/windows.md (100%) rename site/content/{ => arangodb}/3.11/operations/security/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/security/audit-logging.md (98%) rename site/content/{ => arangodb}/3.11/operations/security/change-root-password.md (100%) rename site/content/{ => arangodb}/3.11/operations/security/encryption-at-rest.md (97%) rename site/content/{ => arangodb}/3.11/operations/security/securing-starter-deployments.md (100%) rename site/content/{ => arangodb}/3.11/operations/security/security-options.md (100%) rename site/content/{ => arangodb}/3.11/operations/troubleshooting/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/troubleshooting/arangod.md (100%) rename site/content/{ => arangodb}/3.11/operations/troubleshooting/cluster/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/troubleshooting/cluster/agency-dump.md (100%) rename site/content/{ => arangodb}/3.11/operations/troubleshooting/emergency-console.md (100%) rename site/content/{ => arangodb}/3.11/operations/troubleshooting/query-debug-packages.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/community-to-enterprise-upgrade.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/downgrading.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/manual-deployments/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/manual-deployments/active-failover.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/manual-deployments/cluster.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/os-specific-information/_index.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/os-specific-information/linux.md (100%) rename site/content/{ => arangodb}/3.11/operations/upgrading/os-specific-information/macos.md (95%) rename site/content/{ => arangodb}/3.11/operations/upgrading/os-specific-information/windows.md (96%) rename site/content/{ => arangodb}/3.11/operations/upgrading/starter-deployments.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/deprecated-and-removed-features.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.0/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.0/incompatible-changes-in-3-0.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.0/whats-new-in-3-0.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.1/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.1/incompatible-changes-in-3-1.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.1/whats-new-in-3-1.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.10/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.10/api-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.10/incompatible-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.10/known-issues-in-3-10.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.10/whats-new-in-3-10.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.11/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.11/api-changes-in-3-11.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.11/known-issues-in-3-11.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.11/whats-new-in-3-11.md (99%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.2/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.2/incompatible-changes-in-3-2.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.2/known-issues-in-3-2.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.2/whats-new-in-3-2.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.3/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.3/incompatible-changes-in-3-3.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.3/known-issues-in-3-3.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.3/whats-new-in-3-3.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.4/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.4/incompatible-changes-in-3-4.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.4/known-issues-in-3-4.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.4/whats-new-in-3-4.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.5/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.5/incompatible-changes-in-3-5.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.5/known-issues-in-3-5.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.5/whats-new-in-3-5.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.6/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.6/incompatible-changes-in-3-6.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.6/known-issues-in-3-6.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.6/whats-new-in-3-6.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.7/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.7/api-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.7/incompatible-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.7/known-issues-in-3-7.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.7/whats-new-in-3-7.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.8/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.8/api-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.8/incompatible-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.8/known-issues-in-3-8.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.8/whats-new-in-3-8.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.9/_index.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.9/api-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.9/incompatible-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.9/known-issues-in-3-9.md (100%) rename site/content/{ => arangodb}/3.11/release-notes/version-3.9/whats-new-in-3-9.md (100%) rename site/content/{ => arangodb}/3.12/_index.md (58%) rename site/content/{3.12/about-arangodb => arangodb/3.12/about}/_index.md (83%) rename site/content/{3.13/about-arangodb => arangodb/3.12/about}/features/_index.md (94%) rename site/content/{3.12/about-arangodb => arangodb/3.12/about}/features/highlights-by-version.md (100%) rename site/content/{3.12/about-arangodb/features/core.md => arangodb/3.12/about/features/list.md} (100%) rename site/content/{3.11/about-arangodb => arangodb/3.12/about}/use-cases.md (77%) rename site/content/{ => arangodb}/3.12/aql/_index.md (96%) rename site/content/{ => arangodb}/3.12/aql/common-errors.md (100%) rename site/content/{ => arangodb}/3.12/aql/data-queries.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/counting.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/create-test-data.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/diffing-two-documents.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/dynamic-attribute-names.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/grouping.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/joins.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/projections-and-filters.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/queries-without-collections.md (100%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/remove-nodes.md (96%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/traversals.md (97%) rename site/content/{ => arangodb}/3.12/aql/examples-and-query-patterns/upsert-repsert-guide.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/caching-query-plans.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/caching-query-results.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/explaining-queries.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/parsing-queries.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/query-logging.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/query-optimization.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/query-profiling.md (100%) rename site/content/{ => arangodb}/3.12/aql/execution-and-performance/query-statistics.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/arangosearch.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/array.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/bit.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/date.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/document-object.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/fulltext.md (100%) rename site/content/{3.13 => arangodb/3.12}/aql/functions/geo.md (99%) rename site/content/{ => arangodb}/3.12/aql/functions/miscellaneous.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/numeric.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/string.md (100%) rename site/content/{ => arangodb}/3.12/aql/functions/type-check-and-cast.md (100%) rename site/content/{3.13 => arangodb/3.12}/aql/functions/vector.md (99%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/accessing-data-from-collections.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/bind-parameters.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/data-types.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/limitations.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/query-errors.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/query-results.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/subqueries.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/syntax.md (100%) rename site/content/{ => arangodb}/3.12/aql/fundamentals/type-and-value-order.md (100%) rename site/content/{ => arangodb}/3.12/aql/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/graphs/all-shortest-paths.md (98%) rename site/content/{ => arangodb}/3.12/aql/graphs/k-paths.md (98%) rename site/content/{3.13 => arangodb/3.12}/aql/graphs/k-shortest-paths.md (98%) rename site/content/{3.13 => arangodb/3.12}/aql/graphs/shortest-path.md (98%) rename site/content/{3.13 => arangodb/3.12}/aql/graphs/traversals-explained.md (83%) rename site/content/{ => arangodb}/3.12/aql/graphs/traversals.md (99%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/collect.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/filter.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/for.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/insert.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/let.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/limit.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/remove.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/replace.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/return.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/search.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/sort.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/update.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/upsert.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/window.md (100%) rename site/content/{ => arangodb}/3.12/aql/high-level-operations/with.md (100%) rename site/content/{ => arangodb}/3.12/aql/how-to-invoke-aql/_index.md (100%) rename site/content/{ => arangodb}/3.12/aql/how-to-invoke-aql/with-arangosh.md (100%) rename site/content/{ => arangodb}/3.12/aql/how-to-invoke-aql/with-the-web-interface.md (100%) rename site/content/{ => arangodb}/3.12/aql/operators.md (100%) rename site/content/{ => arangodb}/3.12/aql/user-defined-functions.md (100%) rename site/content/{ => arangodb}/3.12/components/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/arangodb-server/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/arangodb-server/environment-variables.md (100%) rename site/content/{ => arangodb}/3.12/components/arangodb-server/options.md (100%) rename site/content/{ => arangodb}/3.12/components/arangodb-server/storage-engine.md (100%) rename site/content/{3.11 => arangodb/3.12}/components/tools/_index.md (94%) rename site/content/{ => arangodb}/3.12/components/tools/arango-datasets.md (100%) rename site/content/{3.13 => arangodb/3.12}/components/tools/arangobackup/_index.md (92%) rename site/content/{ => arangodb}/3.12/components/tools/arangobackup/examples.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangobackup/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangobench/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangobench/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-shell/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-shell/details.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-shell/examples.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-shell/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-starter/architecture.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-starter/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodb-starter/security.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodump/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodump/examples.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodump/limitations.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodump/maskings.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangodump/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoexport/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoexport/examples.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoexport/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoimport/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoimport/details.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoimport/examples-csv.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoimport/examples-json.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoimport/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoinspect/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoinspect/examples.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangoinspect/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangorestore/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangorestore/examples.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangorestore/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangovpack/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/arangovpack/options.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/foxx-cli/_index.md (100%) rename site/content/{ => arangodb}/3.12/components/tools/foxx-cli/details.md (100%) rename site/content/{ => arangodb}/3.12/components/web-interface/_index.md (89%) rename site/content/{ => arangodb}/3.12/components/web-interface/cluster.md (97%) rename site/content/{ => arangodb}/3.12/components/web-interface/collections.md (100%) rename site/content/{ => arangodb}/3.12/components/web-interface/dashboard.md (90%) rename site/content/{ => arangodb}/3.12/components/web-interface/document.md (100%) rename site/content/{3.13 => arangodb/3.12}/components/web-interface/graphs.md (98%) rename site/content/{ => arangodb}/3.12/components/web-interface/logs.md (100%) rename site/content/{ => arangodb}/3.12/components/web-interface/queries.md (98%) rename site/content/{ => arangodb}/3.12/components/web-interface/services.md (100%) rename site/content/{ => arangodb}/3.12/components/web-interface/users.md (100%) rename site/content/{ => arangodb}/3.12/concepts/_index.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-models.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-retrieval.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/_index.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/collections.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/databases.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/documents/_index.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/documents/computed-values.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/documents/schema-validation.md (100%) rename site/content/{ => arangodb}/3.12/concepts/data-structure/views.md (100%) rename site/content/{ => arangodb}/3.12/deploy/_index.md (94%) rename site/content/{ => arangodb}/3.12/deploy/architecture/_index.md (100%) rename site/content/{ => arangodb}/3.12/deploy/architecture/data-sharding.md (98%) rename site/content/{ => arangodb}/3.12/deploy/architecture/replication.md (100%) rename site/content/{ => arangodb}/3.12/deploy/architecture/scalability.md (100%) rename site/content/{ => arangodb}/3.12/deploy/cluster/_index.md (98%) rename site/content/{ => arangodb}/3.12/deploy/cluster/administration.md (100%) rename site/content/{ => arangodb}/3.12/deploy/cluster/deployment/_index.md (97%) rename site/content/{ => arangodb}/3.12/deploy/cluster/deployment/manual-start.md (100%) rename site/content/{ => arangodb}/3.12/deploy/cluster/deployment/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.12/deploy/cluster/limitations.md (100%) rename site/content/{ => arangodb}/3.12/deploy/in-the-cloud.md (100%) rename site/content/{ => arangodb}/3.12/deploy/kubernetes.md (100%) rename site/content/{ => arangodb}/3.12/deploy/oneshard.md (99%) rename site/content/{ => arangodb}/3.12/deploy/production-checklist.md (100%) rename site/content/{ => arangodb}/3.12/deploy/single-instance-vs-cluster.md (100%) rename site/content/{ => arangodb}/3.12/deploy/single-instance/_index.md (100%) rename site/content/{ => arangodb}/3.12/deploy/single-instance/manual-start.md (100%) rename site/content/{ => arangodb}/3.12/deploy/single-instance/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.12/develop/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/go.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-6/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-6/driver-setup.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-6/serialization.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-7/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-7/changes-in-version-7.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-7/driver-setup.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/java/reference-version-7/serialization.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/javascript.md (100%) rename site/content/{ => arangodb}/3.12/develop/drivers/python.md (100%) rename site/content/{ => arangodb}/3.12/develop/error-codes.md (100%) rename site/content/{ => arangodb}/3.12/develop/exit-codes.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/deployment.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/getting-started.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/access-from-the-browser.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/authentication-and-sessions.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/development-mode.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/foxx-in-a-cluster.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/linking-services-together.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/making-requests.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/scripts-and-scheduling.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/testing-foxx-services.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/using-node-modules.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/using-webpack-with-foxx.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/working-with-collections.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/working-with-files.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/working-with-routers.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/guides/writing-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/configuration.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/related-modules/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/related-modules/authentication.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/related-modules/graphql.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/related-modules/oauth-2-0.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/related-modules/queues.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/routers/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/routers/endpoints.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/routers/middleware.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/routers/request.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/routers/response.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/service-context.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/service-manifest.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md (100%) rename site/content/{ => arangodb}/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/_index.md (98%) rename site/content/{ => arangodb}/3.12/develop/http-api/administration.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/authentication.md (99%) rename site/content/{ => arangodb}/3.12/develop/http-api/batch-requests.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/cluster.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/collections.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/databases.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/documents.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/foxx.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/general-request-handling.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/graphs/edges.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/graphs/named-graphs.md (99%) rename site/content/{ => arangodb}/3.12/develop/http-api/hot-backups.md (99%) rename site/content/{ => arangodb}/3.12/develop/http-api/import.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/fulltext.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/geo-spatial.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/inverted.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/multi-dimensional.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/persistent.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/ttl.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/indexes/vector.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/jobs.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/monitoring/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/monitoring/logs.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/monitoring/metrics.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/monitoring/statistics.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/queries/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/queries/aql-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/queries/aql-query-plan-cache.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/queries/aql-query-results-cache.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/queries/user-defined-aql-functions.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/replication/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/replication/other-replication-commands.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/replication/replication-applier.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/replication/replication-dump.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/replication/replication-logger.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/replication/write-ahead-log.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/security.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/tasks.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/users.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/views/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/views/arangosearch-views.md (100%) rename site/content/{ => arangodb}/3.12/develop/http-api/views/search-alias-views.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md (99%) rename site/content/{ => arangodb}/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-boot-arangodb.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/migration.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-3/template.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.12/develop/integrations/spring-data-arangodb/reference-version-4/template.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/@arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/@arangodb/collection-object.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/@arangodb/cursor-object.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/@arangodb/db-object.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/@arangodb/view-object.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/actions.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/aql-queries.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/console.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/crypto.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/fs.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/request.md (100%) rename site/content/{ => arangodb}/3.12/develop/javascript-api/tasks.md (100%) rename site/content/{ => arangodb}/3.12/develop/operational-factors.md (100%) rename site/content/{ => arangodb}/3.12/develop/satellitecollections.md (100%) rename site/content/{ => arangodb}/3.12/develop/smartjoins.md (100%) rename site/content/{ => arangodb}/3.12/develop/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.12/develop/transactions/durability.md (100%) rename site/content/{ => arangodb}/3.12/develop/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.12/develop/transactions/limitations.md (100%) rename site/content/{ => arangodb}/3.12/develop/transactions/locking-and-isolation.md (100%) rename site/content/{ => arangodb}/3.12/develop/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.12/get-started/_index.md (100%) rename site/content/{ => arangodb}/3.12/get-started/how-to-interact-with-arangodb.md (100%) rename site/content/{ => arangodb}/3.12/get-started/on-premises-installation.md (93%) rename site/content/{ => arangodb}/3.12/get-started/set-up-a-cloud-instance.md (71%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/_index.md (100%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/crud.md (100%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/dataset.md (100%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/filter.md (100%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/geo.md (100%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/graphs.md (98%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/joins.md (100%) rename site/content/{ => arangodb}/3.12/get-started/start-using-aql/sort-limit.md (100%) rename site/content/{ => arangodb}/3.12/graphs/_index.md (97%) rename site/content/{ => arangodb}/3.12/graphs/enterprisegraphs/_index.md (100%) rename site/content/{ => arangodb}/3.12/graphs/enterprisegraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.12/graphs/enterprisegraphs/management.md (100%) rename site/content/{3.13 => arangodb/3.12}/graphs/example-graphs.md (94%) rename site/content/{ => arangodb}/3.12/graphs/general-graphs/_index.md (98%) rename site/content/{3.13 => arangodb/3.12}/graphs/general-graphs/functions.md (99%) rename site/content/{ => arangodb}/3.12/graphs/general-graphs/management.md (100%) rename site/content/{ => arangodb}/3.12/graphs/satellitegraphs/_index.md (98%) rename site/content/{ => arangodb}/3.12/graphs/satellitegraphs/details.md (100%) rename site/content/{ => arangodb}/3.12/graphs/satellitegraphs/management.md (100%) rename site/content/{3.13 => arangodb/3.12}/graphs/smartgraphs/_index.md (94%) rename site/content/{3.13 => arangodb/3.12}/graphs/smartgraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.12/graphs/smartgraphs/management.md (100%) rename site/content/{ => arangodb}/3.12/graphs/smartgraphs/testing-graphs-on-single-server.md (100%) rename site/content/{ => arangodb}/3.12/graphs/working-with-edges.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/_index.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/analyzers.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/_index.md (99%) rename site/content/{3.13 => arangodb/3.12}/index-and-search/arangosearch/arangosearch-views-reference.md (99%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/case-sensitivity-and-diacritics.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/exact-value-matching.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/example-datasets.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/faceted-search.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/full-text-token-search.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/fuzzy-search.md (100%) rename site/content/{3.13 => arangodb/3.12}/index-and-search/arangosearch/geospatial-search.md (99%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/nested-search.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/performance.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/phrase-and-proximity-search.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/prefix-matching.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/range-queries.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/ranking.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/search-alias-views-reference.md (97%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/search-highlighting.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/arangosearch/wildcard-search.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/_index.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/basics.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/index-utilization.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/which-index-to-use-when.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/_index.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/fulltext-indexes.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/inverted-indexes.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/persistent-indexes.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/ttl-indexes.md (100%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md (99%) rename site/content/{ => arangodb}/3.12/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md (100%) rename site/content/{ => arangodb}/3.12/operations/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/arangodb-starter/recovery-procedure.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/arangodb-starter/removal-procedure.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/configuration.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/import-and-export.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/license-management.md (99%) rename site/content/{ => arangodb}/3.12/operations/administration/log-levels.md (100%) rename site/content/{3.13 => arangodb/3.12}/operations/administration/reduce-memory-footprint.md (99%) rename site/content/{ => arangodb}/3.12/operations/administration/telemetrics.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/user-management/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/administration/user-management/in-arangosh.md (100%) rename site/content/{ => arangodb}/3.12/operations/backup-and-restore.md (100%) rename site/content/{ => arangodb}/3.12/operations/installation/_index.md (97%) rename site/content/{ => arangodb}/3.12/operations/installation/docker.md (100%) rename site/content/{ => arangodb}/3.12/operations/installation/linux/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/installation/linux/linux-os-tuning-script-examples.md (100%) rename site/content/{ => arangodb}/3.12/operations/installation/linux/operating-system-configuration.md (100%) rename site/content/{ => arangodb}/3.12/operations/installation/uninstallation.md (100%) rename site/content/{ => arangodb}/3.12/operations/security/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/security/audit-logging.md (98%) rename site/content/{ => arangodb}/3.12/operations/security/change-root-password.md (100%) rename site/content/{3.13 => arangodb/3.12}/operations/security/encryption-at-rest.md (97%) rename site/content/{ => arangodb}/3.12/operations/security/securing-starter-deployments.md (100%) rename site/content/{ => arangodb}/3.12/operations/security/security-options.md (100%) rename site/content/{ => arangodb}/3.12/operations/troubleshooting/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/troubleshooting/arangod.md (100%) rename site/content/{ => arangodb}/3.12/operations/troubleshooting/cluster/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/troubleshooting/cluster/agency-dump.md (100%) rename site/content/{ => arangodb}/3.12/operations/troubleshooting/emergency-console.md (100%) rename site/content/{ => arangodb}/3.12/operations/troubleshooting/query-debug-packages.md (100%) rename site/content/{ => arangodb}/3.12/operations/upgrading/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/upgrading/community-to-enterprise-upgrade.md (97%) rename site/content/{ => arangodb}/3.12/operations/upgrading/downgrading.md (100%) rename site/content/{ => arangodb}/3.12/operations/upgrading/manual-deployments/_index.md (100%) rename site/content/{ => arangodb}/3.12/operations/upgrading/manual-deployments/cluster.md (100%) rename site/content/{ => arangodb}/3.12/operations/upgrading/manual-deployments/single-server.md (100%) rename site/content/{ => arangodb}/3.12/operations/upgrading/starter-deployments.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/deprecated-and-removed-features.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.0/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.0/incompatible-changes-in-3-0.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.0/whats-new-in-3-0.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.1/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.1/incompatible-changes-in-3-1.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.1/whats-new-in-3-1.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.10/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.10/api-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.10/incompatible-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.10/known-issues-in-3-10.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.10/whats-new-in-3-10.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.11/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.11/api-changes-in-3-11.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.11/known-issues-in-3-11.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.11/whats-new-in-3-11.md (99%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.12/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.12/api-changes-in-3-12.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.12/known-issues-in-3-12.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.12/whats-new-in-3-12.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.2/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.2/incompatible-changes-in-3-2.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.2/known-issues-in-3-2.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.2/whats-new-in-3-2.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.3/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.3/incompatible-changes-in-3-3.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.3/known-issues-in-3-3.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.3/whats-new-in-3-3.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.4/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.4/incompatible-changes-in-3-4.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.4/known-issues-in-3-4.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.4/whats-new-in-3-4.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.5/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.5/incompatible-changes-in-3-5.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.5/known-issues-in-3-5.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.5/whats-new-in-3-5.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.6/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.6/incompatible-changes-in-3-6.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.6/known-issues-in-3-6.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.6/whats-new-in-3-6.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.7/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.7/api-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.7/incompatible-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.7/known-issues-in-3-7.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.7/whats-new-in-3-7.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.8/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.8/api-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.8/incompatible-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.8/known-issues-in-3-8.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.8/whats-new-in-3-8.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.9/_index.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.9/api-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.9/incompatible-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.9/known-issues-in-3-9.md (100%) rename site/content/{ => arangodb}/3.12/release-notes/version-3.9/whats-new-in-3-9.md (100%) rename site/content/{ => arangodb}/3.13/_index.md (59%) rename site/content/{3.13/about-arangodb => arangodb/3.13/about}/_index.md (82%) rename site/content/{3.12/about-arangodb => arangodb/3.13/about}/features/_index.md (94%) rename site/content/{3.13/about-arangodb => arangodb/3.13/about}/features/highlights-by-version.md (100%) rename site/content/{3.13/about-arangodb/features/core.md => arangodb/3.13/about/features/list.md} (100%) rename site/content/{3.12/about-arangodb => arangodb/3.13/about}/use-cases.md (77%) rename site/content/{ => arangodb}/3.13/aql/_index.md (96%) rename site/content/{ => arangodb}/3.13/aql/common-errors.md (100%) rename site/content/{ => arangodb}/3.13/aql/data-queries.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/counting.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/create-test-data.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/diffing-two-documents.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/dynamic-attribute-names.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/grouping.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/joins.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/projections-and-filters.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/queries-without-collections.md (100%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/remove-nodes.md (96%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/traversals.md (97%) rename site/content/{ => arangodb}/3.13/aql/examples-and-query-patterns/upsert-repsert-guide.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/caching-query-plans.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/caching-query-results.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/explaining-queries.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/parsing-queries.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/query-logging.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/query-optimization.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/query-profiling.md (100%) rename site/content/{ => arangodb}/3.13/aql/execution-and-performance/query-statistics.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/arangosearch.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/array.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/bit.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/date.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/document-object.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/fulltext.md (100%) rename site/content/{3.11 => arangodb/3.13}/aql/functions/geo.md (99%) rename site/content/{ => arangodb}/3.13/aql/functions/miscellaneous.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/numeric.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/string.md (100%) rename site/content/{ => arangodb}/3.13/aql/functions/type-check-and-cast.md (100%) rename site/content/{3.12 => arangodb/3.13}/aql/functions/vector.md (99%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/accessing-data-from-collections.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/bind-parameters.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/data-types.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/limitations.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/query-errors.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/query-results.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/subqueries.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/syntax.md (100%) rename site/content/{ => arangodb}/3.13/aql/fundamentals/type-and-value-order.md (100%) rename site/content/{ => arangodb}/3.13/aql/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/graphs/all-shortest-paths.md (98%) rename site/content/{ => arangodb}/3.13/aql/graphs/k-paths.md (98%) rename site/content/{3.12 => arangodb/3.13}/aql/graphs/k-shortest-paths.md (98%) rename site/content/{3.12 => arangodb/3.13}/aql/graphs/shortest-path.md (98%) rename site/content/{3.12 => arangodb/3.13}/aql/graphs/traversals-explained.md (83%) rename site/content/{ => arangodb}/3.13/aql/graphs/traversals.md (99%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/collect.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/filter.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/for.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/insert.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/let.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/limit.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/remove.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/replace.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/return.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/search.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/sort.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/update.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/upsert.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/window.md (100%) rename site/content/{ => arangodb}/3.13/aql/high-level-operations/with.md (100%) rename site/content/{ => arangodb}/3.13/aql/how-to-invoke-aql/_index.md (100%) rename site/content/{ => arangodb}/3.13/aql/how-to-invoke-aql/with-arangosh.md (100%) rename site/content/{ => arangodb}/3.13/aql/how-to-invoke-aql/with-the-web-interface.md (100%) rename site/content/{ => arangodb}/3.13/aql/operators.md (100%) rename site/content/{ => arangodb}/3.13/aql/user-defined-functions.md (100%) rename site/content/{ => arangodb}/3.13/components/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/arangodb-server/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/arangodb-server/environment-variables.md (100%) rename site/content/{ => arangodb}/3.13/components/arangodb-server/options.md (100%) rename site/content/{ => arangodb}/3.13/components/arangodb-server/storage-engine.md (100%) rename site/content/{ => arangodb}/3.13/components/platform.md (98%) rename site/content/{ => arangodb}/3.13/components/tools/_index.md (94%) rename site/content/{ => arangodb}/3.13/components/tools/arango-datasets.md (100%) rename site/content/{3.12 => arangodb/3.13}/components/tools/arangobackup/_index.md (92%) rename site/content/{ => arangodb}/3.13/components/tools/arangobackup/examples.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangobackup/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangobench/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangobench/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-shell/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-shell/details.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-shell/examples.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-shell/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-starter/architecture.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-starter/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodb-starter/security.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodump/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodump/examples.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodump/limitations.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodump/maskings.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangodump/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoexport/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoexport/examples.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoexport/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoimport/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoimport/details.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoimport/examples-csv.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoimport/examples-json.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoimport/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoinspect/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoinspect/examples.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangoinspect/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangorestore/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangorestore/examples.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangorestore/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangovpack/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/arangovpack/options.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/foxx-cli/_index.md (100%) rename site/content/{ => arangodb}/3.13/components/tools/foxx-cli/details.md (100%) rename site/content/{ => arangodb}/3.13/components/web-interface/_index.md (89%) rename site/content/{ => arangodb}/3.13/components/web-interface/cluster.md (97%) rename site/content/{ => arangodb}/3.13/components/web-interface/collections.md (100%) rename site/content/{ => arangodb}/3.13/components/web-interface/dashboard.md (90%) rename site/content/{ => arangodb}/3.13/components/web-interface/document.md (100%) rename site/content/{3.12 => arangodb/3.13}/components/web-interface/graphs.md (98%) rename site/content/{ => arangodb}/3.13/components/web-interface/logs.md (100%) rename site/content/{ => arangodb}/3.13/components/web-interface/queries.md (98%) rename site/content/{ => arangodb}/3.13/components/web-interface/services.md (100%) rename site/content/{ => arangodb}/3.13/components/web-interface/users.md (100%) rename site/content/{ => arangodb}/3.13/concepts/_index.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-models.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-retrieval.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/_index.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/collections.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/databases.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/documents/_index.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/documents/computed-values.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/documents/schema-validation.md (100%) rename site/content/{ => arangodb}/3.13/concepts/data-structure/views.md (100%) rename site/content/{ => arangodb}/3.13/deploy/_index.md (96%) rename site/content/{ => arangodb}/3.13/deploy/architecture/_index.md (100%) rename site/content/{ => arangodb}/3.13/deploy/architecture/data-sharding.md (98%) rename site/content/{ => arangodb}/3.13/deploy/architecture/replication.md (100%) rename site/content/{ => arangodb}/3.13/deploy/architecture/scalability.md (100%) rename site/content/{ => arangodb}/3.13/deploy/cluster/_index.md (98%) rename site/content/{ => arangodb}/3.13/deploy/cluster/administration.md (100%) rename site/content/{ => arangodb}/3.13/deploy/cluster/deployment/_index.md (97%) rename site/content/{ => arangodb}/3.13/deploy/cluster/deployment/manual-start.md (100%) rename site/content/{ => arangodb}/3.13/deploy/cluster/deployment/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.13/deploy/cluster/limitations.md (100%) rename site/content/{ => arangodb}/3.13/deploy/in-the-cloud.md (100%) rename site/content/{ => arangodb}/3.13/deploy/kubernetes.md (100%) rename site/content/{ => arangodb}/3.13/deploy/oneshard.md (99%) rename site/content/{ => arangodb}/3.13/deploy/production-checklist.md (100%) rename site/content/{ => arangodb}/3.13/deploy/single-instance-vs-cluster.md (100%) rename site/content/{ => arangodb}/3.13/deploy/single-instance/_index.md (100%) rename site/content/{ => arangodb}/3.13/deploy/single-instance/manual-start.md (100%) rename site/content/{ => arangodb}/3.13/deploy/single-instance/using-the-arangodb-starter.md (100%) rename site/content/{ => arangodb}/3.13/develop/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/go.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/java/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/java/reference-version-7/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/java/reference-version-7/changes-in-version-7.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/java/reference-version-7/driver-setup.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/java/reference-version-7/serialization.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/javascript.md (100%) rename site/content/{ => arangodb}/3.13/develop/drivers/python.md (100%) rename site/content/{ => arangodb}/3.13/develop/error-codes.md (100%) rename site/content/{ => arangodb}/3.13/develop/exit-codes.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/deployment.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/getting-started.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/access-from-the-browser.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/authentication-and-sessions.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/development-mode.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/foxx-in-a-cluster.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/linking-services-together.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/making-requests.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/scripts-and-scheduling.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/testing-foxx-services.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/using-node-modules.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/using-webpack-with-foxx.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/working-with-collections.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/working-with-files.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/working-with-routers.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/guides/writing-queries.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/configuration.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/related-modules/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/related-modules/authentication.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/related-modules/graphql.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/related-modules/oauth-2-0.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/related-modules/queues.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/routers/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/routers/endpoints.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/routers/middleware.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/routers/request.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/routers/response.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/service-context.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/service-manifest.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md (100%) rename site/content/{ => arangodb}/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/_index.md (98%) rename site/content/{ => arangodb}/3.13/develop/http-api/administration.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/authentication.md (99%) rename site/content/{ => arangodb}/3.13/develop/http-api/cluster.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/collections.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/databases.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/documents.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/foxx.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/general-request-handling.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/graphs/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/graphs/edges.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/graphs/named-graphs.md (99%) rename site/content/{ => arangodb}/3.13/develop/http-api/hot-backups.md (99%) rename site/content/{ => arangodb}/3.13/develop/http-api/import.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/fulltext.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/geo-spatial.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/inverted.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/multi-dimensional.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/persistent.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/ttl.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/indexes/vector.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/jobs.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/monitoring/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/monitoring/logs.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/monitoring/metrics.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/monitoring/statistics.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/queries/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/queries/aql-queries.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/queries/aql-query-plan-cache.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/queries/aql-query-results-cache.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/queries/user-defined-aql-functions.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/replication/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/replication/other-replication-commands.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/replication/replication-applier.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/replication/replication-dump.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/replication/replication-logger.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/replication/write-ahead-log.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/security.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/tasks.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/users.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/views/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/views/arangosearch-views.md (100%) rename site/content/{ => arangodb}/3.13/develop/http-api/views/search-alias-views.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md (99%) rename site/content/{ => arangodb}/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-boot-arangodb.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/migration.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md (100%) rename site/content/{ => arangodb}/3.13/develop/integrations/spring-data-arangodb/reference-version-4/template.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/@arangodb/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/@arangodb/collection-object.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/@arangodb/cursor-object.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/@arangodb/db-object.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/@arangodb/view-object.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/actions.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/analyzers.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/aql-queries.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/console.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/crypto.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/fs.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/request.md (100%) rename site/content/{ => arangodb}/3.13/develop/javascript-api/tasks.md (100%) rename site/content/{ => arangodb}/3.13/develop/operational-factors.md (100%) rename site/content/{ => arangodb}/3.13/develop/satellitecollections.md (100%) rename site/content/{ => arangodb}/3.13/develop/smartjoins.md (100%) rename site/content/{ => arangodb}/3.13/develop/transactions/_index.md (100%) rename site/content/{ => arangodb}/3.13/develop/transactions/durability.md (100%) rename site/content/{ => arangodb}/3.13/develop/transactions/javascript-transactions.md (100%) rename site/content/{ => arangodb}/3.13/develop/transactions/limitations.md (100%) rename site/content/{ => arangodb}/3.13/develop/transactions/locking-and-isolation.md (100%) rename site/content/{ => arangodb}/3.13/develop/transactions/stream-transactions.md (100%) rename site/content/{ => arangodb}/3.13/get-started/_index.md (100%) rename site/content/{ => arangodb}/3.13/get-started/how-to-interact-with-arangodb.md (100%) rename site/content/{ => arangodb}/3.13/get-started/on-premises-installation.md (93%) rename site/content/{ => arangodb}/3.13/get-started/set-up-a-cloud-instance.md (71%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/_index.md (100%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/crud.md (100%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/dataset.md (100%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/filter.md (100%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/geo.md (100%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/graphs.md (98%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/joins.md (100%) rename site/content/{ => arangodb}/3.13/get-started/start-using-aql/sort-limit.md (100%) rename site/content/{ => arangodb}/3.13/graphs/_index.md (97%) rename site/content/{ => arangodb}/3.13/graphs/enterprisegraphs/_index.md (100%) rename site/content/{ => arangodb}/3.13/graphs/enterprisegraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.13/graphs/enterprisegraphs/management.md (100%) rename site/content/{3.12 => arangodb/3.13}/graphs/example-graphs.md (94%) rename site/content/{ => arangodb}/3.13/graphs/general-graphs/_index.md (98%) rename site/content/{3.12 => arangodb/3.13}/graphs/general-graphs/functions.md (99%) rename site/content/{ => arangodb}/3.13/graphs/general-graphs/management.md (100%) rename site/content/{ => arangodb}/3.13/graphs/satellitegraphs/_index.md (98%) rename site/content/{ => arangodb}/3.13/graphs/satellitegraphs/details.md (100%) rename site/content/{ => arangodb}/3.13/graphs/satellitegraphs/management.md (100%) rename site/content/{3.12 => arangodb/3.13}/graphs/smartgraphs/_index.md (94%) rename site/content/{3.12 => arangodb/3.13}/graphs/smartgraphs/getting-started.md (99%) rename site/content/{ => arangodb}/3.13/graphs/smartgraphs/management.md (100%) rename site/content/{ => arangodb}/3.13/graphs/smartgraphs/testing-graphs-on-single-server.md (100%) rename site/content/{ => arangodb}/3.13/graphs/working-with-edges.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/_index.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/analyzers.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/_index.md (99%) rename site/content/{3.12 => arangodb/3.13}/index-and-search/arangosearch/arangosearch-views-reference.md (99%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/case-sensitivity-and-diacritics.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/exact-value-matching.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/example-datasets.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/faceted-search.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/full-text-token-search.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/fuzzy-search.md (100%) rename site/content/{3.12 => arangodb/3.13}/index-and-search/arangosearch/geospatial-search.md (99%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/nested-search.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/performance.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/phrase-and-proximity-search.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/prefix-matching.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/range-queries.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/ranking.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/search-alias-views-reference.md (97%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/search-highlighting.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/arangosearch/wildcard-search.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/_index.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/basics.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/index-utilization.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/which-index-to-use-when.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/_index.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/fulltext-indexes.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/inverted-indexes.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/persistent-indexes.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/ttl-indexes.md (100%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md (99%) rename site/content/{ => arangodb}/3.13/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md (100%) rename site/content/{ => arangodb}/3.13/operations/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/arangodb-starter/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/arangodb-starter/recovery-procedure.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/arangodb-starter/removal-procedure.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/configuration.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/import-and-export.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/license-management.md (99%) rename site/content/{ => arangodb}/3.13/operations/administration/log-levels.md (100%) rename site/content/{3.12 => arangodb/3.13}/operations/administration/reduce-memory-footprint.md (99%) rename site/content/{ => arangodb}/3.13/operations/administration/telemetrics.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/user-management/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/administration/user-management/in-arangosh.md (100%) rename site/content/{ => arangodb}/3.13/operations/backup-and-restore.md (100%) rename site/content/{ => arangodb}/3.13/operations/installation/_index.md (97%) rename site/content/{ => arangodb}/3.13/operations/installation/docker.md (100%) rename site/content/{ => arangodb}/3.13/operations/installation/linux/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/installation/linux/linux-os-tuning-script-examples.md (100%) rename site/content/{ => arangodb}/3.13/operations/installation/linux/operating-system-configuration.md (100%) rename site/content/{ => arangodb}/3.13/operations/installation/uninstallation.md (100%) rename site/content/{ => arangodb}/3.13/operations/security/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/security/audit-logging.md (98%) rename site/content/{ => arangodb}/3.13/operations/security/change-root-password.md (100%) rename site/content/{3.12 => arangodb/3.13}/operations/security/encryption-at-rest.md (97%) rename site/content/{ => arangodb}/3.13/operations/security/securing-starter-deployments.md (100%) rename site/content/{ => arangodb}/3.13/operations/security/security-options.md (100%) rename site/content/{ => arangodb}/3.13/operations/troubleshooting/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/troubleshooting/arangod.md (100%) rename site/content/{ => arangodb}/3.13/operations/troubleshooting/cluster/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/troubleshooting/cluster/agency-dump.md (100%) rename site/content/{ => arangodb}/3.13/operations/troubleshooting/emergency-console.md (100%) rename site/content/{ => arangodb}/3.13/operations/troubleshooting/query-debug-packages.md (100%) rename site/content/{ => arangodb}/3.13/operations/upgrading/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/upgrading/downgrading.md (100%) rename site/content/{ => arangodb}/3.13/operations/upgrading/manual-deployments/_index.md (100%) rename site/content/{ => arangodb}/3.13/operations/upgrading/manual-deployments/cluster.md (100%) rename site/content/{ => arangodb}/3.13/operations/upgrading/manual-deployments/single-server.md (100%) rename site/content/{ => arangodb}/3.13/operations/upgrading/starter-deployments.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/deprecated-and-removed-features.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/platform.md (94%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.0/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.0/incompatible-changes-in-3-0.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.0/whats-new-in-3-0.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.1/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.1/incompatible-changes-in-3-1.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.1/whats-new-in-3-1.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.10/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.10/api-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.10/incompatible-changes-in-3-10.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.10/known-issues-in-3-10.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.10/whats-new-in-3-10.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.11/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.11/api-changes-in-3-11.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.11/known-issues-in-3-11.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.11/whats-new-in-3-11.md (99%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.12/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.12/api-changes-in-3-12.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.12/known-issues-in-3-12.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.12/whats-new-in-3-12.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.13/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.13/api-changes-in-3-13.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.13/incompatible-changes-in-3-13.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.13/known-issues-in-3-13.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.13/whats-new-in-3-13.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.2/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.2/incompatible-changes-in-3-2.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.2/known-issues-in-3-2.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.2/whats-new-in-3-2.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.3/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.3/incompatible-changes-in-3-3.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.3/known-issues-in-3-3.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.3/whats-new-in-3-3.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.4/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.4/incompatible-changes-in-3-4.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.4/known-issues-in-3-4.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.4/whats-new-in-3-4.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.5/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.5/incompatible-changes-in-3-5.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.5/known-issues-in-3-5.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.5/whats-new-in-3-5.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.6/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.6/incompatible-changes-in-3-6.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.6/known-issues-in-3-6.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.6/whats-new-in-3-6.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.7/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.7/api-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.7/incompatible-changes-in-3-7.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.7/known-issues-in-3-7.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.7/whats-new-in-3-7.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.8/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.8/api-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.8/incompatible-changes-in-3-8.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.8/known-issues-in-3-8.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.8/whats-new-in-3-8.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.9/_index.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.9/api-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.9/incompatible-changes-in-3-9.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.9/known-issues-in-3-9.md (100%) rename site/content/{ => arangodb}/3.13/release-notes/version-3.9/whats-new-in-3-9.md (100%) create mode 100644 site/content/arangodb/_index.md create mode 100644 site/content/data-platform/_index.md rename site/content/{platform/about-the-platform => data-platform/about}/_index.md (97%) rename site/content/{3.13/about-arangodb/features/platform.md => data-platform/about/features.md} (78%) rename site/content/{platform/graph-intelligence => data-platform}/graph-visualizer.md (95%) rename site/content/{platform => data-platform}/release-notes.md (85%) create mode 100644 site/content/ecosystem/_index.md rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/_index.md (100%) rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/arangodb-cugraph-adapter.md (100%) rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/arangodb-dgl-adapter.md (100%) rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/arangodb-networkx-adapter.md (100%) rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/arangodb-pyg-adapter.md (100%) rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/arangodb-rdf-adapter.md (100%) rename site/content/{3.13/data-science/integrations => ecosystem/adapters}/langchain.md (100%) create mode 100644 site/content/gen-ai/_index.md rename site/content/{3.13/graphs => gen-ai}/graph-analytics.md (96%) rename site/content/{3.13/data-science/_index.md => gen-ai/graph-to-ai.md} (86%) rename site/content/{3.13/data-science => gen-ai}/graphml/_index.md (98%) rename site/content/{3.13/data-science => gen-ai}/graphml/notebooks-api.md (99%) rename site/content/{3.13/data-science => gen-ai}/graphml/quickstart.md (88%) rename site/content/{3.13/data-science => gen-ai}/graphml/ui.md (96%) rename site/content/{platform/data-science => gen-ai}/graphrag/_index.md (97%) rename site/content/{3.13/data-science => gen-ai}/graphrag/tutorial-notebook.md (99%) rename site/content/{3.13/data-science => gen-ai}/graphrag/web-interface.md (80%) rename site/content/{3.13/data-science => gen-ai}/notebook-servers.md (93%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/_index.md (64%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/gen-ai.md (98%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/importer.md (99%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/mlflow.md (98%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/natural-language-to-aql.md (100%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/retriever.md (99%) rename site/content/{3.13/data-science/graphrag => gen-ai}/services/triton-inference-server.md (100%) delete mode 100644 site/content/platform/_index.md delete mode 100644 site/content/platform/data-science/_index.md delete mode 100644 site/content/platform/data-science/graphml/_index.md delete mode 100644 site/content/platform/data-science/graphml/notebooks-api.md delete mode 100644 site/content/platform/data-science/graphml/quickstart.md delete mode 100644 site/content/platform/data-science/graphml/ui.md delete mode 100644 site/content/platform/data-science/graphrag/services/_index.md delete mode 100644 site/content/platform/data-science/graphrag/services/gen-ai.md delete mode 100644 site/content/platform/data-science/graphrag/services/importer.md delete mode 100644 site/content/platform/data-science/graphrag/services/mlflow.md delete mode 100644 site/content/platform/data-science/graphrag/services/natural-language-to-aql.md delete mode 100644 site/content/platform/data-science/graphrag/services/retriever.md delete mode 100644 site/content/platform/data-science/graphrag/services/triton-inference-server.md delete mode 100644 site/content/platform/data-science/graphrag/tutorial-notebook.md delete mode 100644 site/content/platform/data-science/graphrag/web-interface.md delete mode 100644 site/content/platform/data-science/integrations/_index.md delete mode 100644 site/content/platform/data-science/integrations/arangodb-cugraph-adapter.md delete mode 100644 site/content/platform/data-science/integrations/arangodb-dgl-adapter.md delete mode 100644 site/content/platform/data-science/integrations/arangodb-networkx-adapter.md delete mode 100644 site/content/platform/data-science/integrations/arangodb-pyg-adapter.md delete mode 100644 site/content/platform/data-science/integrations/arangodb-rdf-adapter.md delete mode 100644 site/content/platform/data-science/integrations/langchain.md delete mode 100644 site/content/platform/data-science/notebook-servers.md delete mode 100644 site/content/platform/graph-intelligence/_index.md delete mode 100644 site/content/platform/graph-intelligence/graph-analytics.md diff --git a/README.md b/README.md index 0466fbd353..56f14f3459 100644 --- a/README.md +++ b/README.md @@ -367,8 +367,8 @@ Inner shortcode Tags let you display badges, usually below a headline. This is mainly used for pointing out if a feature is only available in the -ArangoDB Platform, the ArangoGraph Insights Platform, or both. -See [Environment remarks](#environment-remarks) for details. +GenAI Suite, the Data Platform, the Arango Managed Platform (AMP), or multiple +of them. See [Environment remarks](#environment-remarks) for details. It is also used for [Edition remarks](#edition-remarks) in content before version 3.12.5. @@ -570,7 +570,7 @@ The following shortcodes also exist but are rarely used: - _DB-Server_, not ~~dbserver~~, ~~db-server~~, ~~DBserver~~ (unless it is a code value) - _Coordinator_ (uppercase C) - _Agent_, _Agency_ (uppercase A) - - _ArangoGraph Insights Platform_ and _ArangoGraph_ for short, but not + - _Arango Managed Platform (AMP)_ and _ArangoGraph_ for short, but not ~~Oasis~~, ~~ArangoDB Oasis~~, or ~~ArangoDB Cloud~~ - _Deployment mode_ (single server, cluster, etc.), not ~~deployment type~~ @@ -586,7 +586,7 @@ For external links, use standard Markdown. Clicking these links automatically opens them in a new tab: ```markdown -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud) ``` For internal links, use relative paths to the Markdown files. Always link to @@ -674,25 +674,26 @@ deprecated features in the same manner with `Deprecated in: ...`. ### Environment remarks Pages and sections about features that are only available in certain environments -such as the ArangoDB Platform, the ArangoGraph Insight Platform, or the +such as the GenAI Suite, the Data Platform, the Arango Managed Platform (AMP), or the ArangoDB Shell should indicate where they are available using the `tag` shortcode. -In the unified Platform and ArangoGraph but not in the Core: +In the Data Platform (and therefore also in the GenAI Data Suite) and +Arango Managed Platform but not in ArangoDB: ```markdown -{{< tag "ArangoDB Platform" "ArangoGraph" >}} +{{< tag "Data Platform" "AMP" >}} ``` -In the unified Platform only: +In the GenAI Data Platform only: ```markdown -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} ``` -In ArangoGraph only: +In the Arango Managed Platform only: ```markdown -{{< tag "ArangoGraph" >}} +{{< tag "AMP" >}} ``` In the ArangoDB Shell but not the server-side JavaScript API: diff --git a/site/content/3.10/arangograph/_index.md b/site/content/3.10/arangograph/_index.md deleted file mode 100644 index 9ba6efedf4..0000000000 --- a/site/content/3.10/arangograph/_index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: ArangoGraph Insights Platform -menuTitle: ArangoGraph -weight: 65 -description: >- - The ArangoGraph Insights Platform provides the entire functionality of - ArangoDB as a service, without the need to run or manage databases yourself -aliases: - - arangograph/changelog ---- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), -formerly called Oasis, provides ArangoDB databases as a Service (DBaaS). -It enables you to use the entire functionality of an ArangoDB cluster -deployment without the need to run or manage the system yourself. - -The ArangoGraph Insights Platform... - -- runs your databases in data centers of the cloud provider - of your choice: Google Cloud Platform (GCP), Amazon Web Services (AWS), - Microsoft Azure. This optimizes performance and reduces cost. - -- ensures that your databases are always available and - healthy by monitoring them 24/7. - -- ensures that your databases are kept up to date by - installing new versions without service interruption. - -- ensures that your data is safe by providing encryption & - audit logs and making frequent data backups. - -- guarantees that your data always remains your property and - access to it is protected with industry standard safeguards. - -For more information see -[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) - -For quick start guide, see -[Use ArangoDB in the Cloud](../get-started/set-up-a-cloud-instance.md). diff --git a/site/content/3.10/arangograph/api/_index.md b/site/content/3.10/arangograph/api/_index.md deleted file mode 100644 index ee4f21371f..0000000000 --- a/site/content/3.10/arangograph/api/_index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: The ArangoGraph API -menuTitle: ArangoGraph API -weight: 60 -description: >- - Interface to control all resources inside ArangoGraph in a scriptable manner -aliases: - - arangograph-api ---- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), -comes with its own API. This API enables you to control all -resources inside ArangoGraph in a scriptable manner. Typical use cases are spinning -up ArangoGraph deployments during continuous integration and infrastructure as code. - -The ArangoGraph API… - -- is a well-specified API that uses - [Protocol Buffers](https://developers.google.com/protocol-buffers/) - as interface definition and [gRPC](https://grpc.io/) as - underlying protocol. - -- allows for automatic generation of clients for a large list of languages. - A Go client is available out of the box. - -- uses API keys for authentication. API keys impersonate a user and inherit - the permissions of that user. - -- is also available as a command-line tool called [oasisctl](../oasisctl/_index.md). - -- is also available as a - [Terraform plugin](https://github.com/arangodb-managed/terraform-provider-oasis/). - This plugin makes integration of ArangoGraph in infrastructure as code projects - very simple. To learn more, refer to the [plugin documentation](https://registry.terraform.io/providers/arangodb-managed/oasis/latest/docs). - -Also see: -- [github.com/arangodb-managed/apis](https://github.com/arangodb-managed/apis/) -- [API definitions](https://arangodb-managed.github.io/apis/index.html) diff --git a/site/content/3.10/arangograph/api/get-started.md b/site/content/3.10/arangograph/api/get-started.md deleted file mode 100644 index ee72c989a8..0000000000 --- a/site/content/3.10/arangograph/api/get-started.md +++ /dev/null @@ -1,481 +0,0 @@ ---- -title: Get started with the ArangoGraph API and Oasisctl -menuTitle: Get started with Oasisctl -weight: 10 -description: >- - A tutorial that guides you through the ArangoGraph API as well as the Oasisctl - command-line tool -aliases: - - ../arangograph-api/getting-started ---- -This tutorial shows you how to do the following: - -- Generate an API key and authenticate with Oasisctl -- View information related to your organizations, projects, and deployments -- Configure, create and delete a deployment - -With Oasisctl the general command structure is to execute commands such as: - -``` -oasisctl list deployments -``` - -This command lists all deployments available to the authenticated user and we -will explore it in more detail later. Most commands also have associated -`--flags` that are required or provide additional options, this aligns with the -interaction method for many command line utilities. If you aren’t already -familiar with this, follow along as there are many examples in this guide that -will familiarize you with this command structure and using flags, along with -how to use OasisCtl to access the ArangoGraph API. - -Note: A good rule of thumb for all variables, resource names, and identifiers -is to **assume they are all case sensitive**, when being used with Oasisctl. - -## API Authentication - -### Generating an API Key - -The first step to using the ArangoGraph API is to generate an API key. To generate a -key you will need to be signed into your account at -[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -Once you are signed in, hover over the profile icon in the top right corner. - -![Profile Icon](../../../images/arangograph-my-account-hover.png) - -Click _My API keys_. - -This will bring you to your API key management screen. From this screen you can -create, reject, and delete API keys. - -Click the _New API key_ button. - -![Blank API Screen](../../../images/arangograph-my-api-keys.png) - -The pop-up box that follows has a few options for customizing the access level -of this API key. - -The options you have available include: - -- Limit access to 1 organization or all organizations this user has access to -- Set an expiration time, specified in number of hours -- Limit key to read-only access - -Once you have configured the API key access options, you will be presented with -your API key ID and API key secret. It is very important that you capture the -API key secret before clicking the close button. There is no way to retrieve -the API key secret after closing this pop-up window. - -![API Secret Key](../../../images/arangograph-api-key-secret.png) - -Once you have securely stored your API key ID and secret, click close. - -That is all there is to setting up API access to your ArangoGraph organizations. - -### Authenticating with Oasisctl - -Now that you have API access it is time to login with Oasisctl. - -Running the Oasisctl utility without any arguments is the equivalent of -including the --help flag. This shows all of the top level commands available -and you can continue exploring each command by typing the command name -followed by the --help flag to see the options available for that command. - -Let’s start with doing that for the login command: - -```bash -oasisctl login --help -``` - -You should see an output similar to this: - -![login help output](../../../images/oasisctl-login-help.png) - -This shows two additional flags are available, aside from the help flag. - -- `--key-id` -- `--key-secret` - -These require the values we received when creating the API key. Once you run -this command you will receive an authentication token that can be used for the -remainder of the session. - -```bash -oasisctl login \ - --key-id cncApiKeyId \ - --key-secret 873-secret-key-id -``` - -Upon successful login you should receive an authentication token: - -![On Successful Login](../../../images/oasisctl-login-success.png) - -Depending on your environment, you could instead store this token for easier -access. For example: - -With Linux: - -```bash -export OASIS_TOKEN=$(oasisctl login --key-id cncApiKeyId --key-secret 873-secret-key-id) -``` - -Or Windows Powershell: - -```powershell -setx OASIS_TOKEN (oasisctl login --key-id cncApiKeyId --key-secret 873-secret-key-id) -``` - -In the coming sections you will see how to authenticate with this token when -using other commands that require authentication. - -## Viewing and Managing Organizations and Deployments - -### Format - -This section covers the basics of retrieving information from the ArangoGraph API. -Depending on the data you are requesting from the ArangoGraph API, being able to read -it in the command line can start to become difficult. To make text easier to -read for humans and your applications, Oasisctl offers two options for -formatting the data received: - -- Table -- JSON - -You can define the format of the data by supplying the `--format` flag along -with your preferred format, like so: - -```bash -oasisctl --format json -``` - -### Viewing Information with the List Command - -This section will cover the two main functions of retrieving data with the -ArangoGraph API. These are: - -- `list` - List resources -- `get` - Get information - -Before you can jump right into making new deployments you need to be aware of -what resources you have available. This is where the list command comes in. -List serves as a way to retrieve general information, you can see all of the -available list options by accessing its help output. - -```bash -oasisctl list --help -``` - -This should output a screen similar to: - -![List help output](../../../images/oasisctl-list-help.png) - -As you can see you can get information on anything you would need about your -ArangoGraph organizations, deployments, and access control. To start, let’s take a -look at a few examples of listing information and then getting more details on -our results. - -### List Organizations - -One of the first pieces of information you may be interested in is the -organizations you have access to. This is useful to know because most commands -require an explicit declaration of the organization you are interacting with. -To find this, use list to list your available organizations: - -```bash -oasisctl list organizations --format json -``` - -Once you have your available organizations you can refer to your desired -organization using its name or id. - -![List organizations output](../../../images/oasisctl-list-org.png) - -Note: You may also notice the url attribute, this is for internal use only and -should not be treated as a publicly accessible path. - -### List Projects - -Once you have the organization name that you wish to interact with, the next -step is to list the available projects within that organization. Do this by -following the same command structure as before and instead exchange -organizations for projects, this time providing the desired organization name -with the `--organization-id` flag. - -```bash -oasisctl list projects \ - --organization-id "ArangoGraph Organization" \ - --format json -``` - -This will return information on all projects that the authenticated user has -access to. - -![List projects output](../../../images/oasisctl-list-projects.png) - -### List Deployments - -Things start getting a bit more interesting with information related to -deployments. Now that you have obtained an organization iD and a project ID, -you can list all of the associated deployments for that project. - -```bash -oasisctl list deployments \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --format json - ``` - -![List deployments output](../../../images/oasisctl-list-deployments.png) - -This provides some basic details for all of the deployments associated with the -project. Namely, it provides a deployment ID which we can use to start making -modifications to the deployment or to get more detailed information, with the -`get` command. - -### Using the Get Command - -In Oasisctl, you use the get command to obtain more detailed information about -any of your available resources. It follows the same command structure as the -previous commands but typically requires a bit more information. For example, -to get more information on a specific deployment means you need to know at -least: - -- Organization ID -- Project ID -- Deployment ID - -To get more information about our example deployment we would need to execute -the following command: - -```bash -oasisctl get deployment \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --deployment-id "abc123DeploymentID" \ - --format json -``` - -This returns quite a bit more information about the deployment including more -detailed server information, the endpoint URL where you can access the web interface, -and optionally the root user password. - -![Get deployment details](../../../images/oasisctl-get-deployment.png) - -### Node Size ID - -We won’t be exploring every flag available for creating a deployment but it is -a good idea to explore the concept of the node size ID value. This is an -indicator that is unique to each provider (Google, Azure, AWS) and indicates -the CPU and memory. Depending on the provider and region this can also -determine the available disk sizes for your deployment. In other words, it is -pretty important to know which `node-size-id` your deployment will be using. - -The command you execute will determine on the available providers and regions -for your organization but here is an example command that lists the available -options in the US West region for the Google Cloud Platform: - -```bash -oasisctl list nodesizes \ - --organization-id "ArangoGraph Organization" \ - --provider-id "Google Cloud Platform" \ - --region-id gcp-us-west2 -``` - -The output you will see will be similar to this: - -![List node size id](../../../images/oasisctl-list-node-size-id.png) - -It is important to note that you can scale up with more disk size but you are -unable to scale down your deployment disk size. The only way to revert back to -a lower disk size is to destroy and recreate your deployment. - -Once you have decided what your starting deployment needs are you can reference -your decision with the Id value for the corresponding configuration. So, for -our example, we will be choosing the c4-a4 configuration. The availability and -options are different for each provider and region, so be sure to confirm the -node size options before creating a new deployment. - -### Challenge - -You can use this combination of listing and getting to obtain all of the -information you want for your ArangoGraph organizations. We only explored a few of -the commands available but you can explore them all within the utility by -utilizing the `--help` flag or you can see all of the available options -in the [documentation](../oasisctl/options.md). - -Something that might be useful practice before moving on is getting the rest -of the information that you need to create a deployment. Here are a list of -items that won’t have defaults available when you attempt to create your -first deployment and you will need to supply: - -- CA Certificate ID (name) -- IP Allowlist ID (id) (optional) -- Node Size ID (id) -- Node Disk Size (GB disk size dependent on Node Size ID) -- Organization ID (name) -- Project ID (name) -- Region ID (name) - -Try looking up that information to get more familiar with how to find -information with Oasisctl. When in doubt use the `--help` flag with any -command. - -## Creating Resources - -Now that you have seen how to obtain information about your available -resources, it’s time to start using those skills to start creating your own -deployment. To create resources with Oasisctl you use the create command. -To see all the possible options you can start with the following command: - -```bash -oasisctl create --help -``` - -![Create command help output](../../../images/oasisctl-create-help.png) - -### Create a Deployment - -To take a look at all of the options available when creating a deployment the -best place to start is with our trusty help command. - -```bash -oasisctl create deployment --help -``` - -![Create deployment help output](../../../images/oasisctl-create-deployment-help.png) - -As you can see there are a lot of default options but also a few that require -some knowledge of our pre-existing resources. Attempting to create a deployment -without one of the required options will return an error indicating which value -is missing or invalid. - -Once you have collected all of the necessary information the command for -creating a deployment is simply supplying the values along with the appropriate -flags. This command will create a deployment: - -```bash -oasisctl create deployment \ - --region-id gcp-us-west2 \ - --node-size-id c4-a4 \ - --node-disk-size 10 \ - --version 3.9.2 \ - --cacertificate-id OasisCert \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --name "First Oasisctl Deployment" \ - --description "The first deployment created using the awesome Oasisctl utility!" -``` - -If everything went according to play you should see similar output: - -![Deployment created successfully](../../../images/oasisctl-create-first-deployment-success.png) - -### Wait on Deployment Status - -When you create a deployment it begins the process of _bootstrapping_ which is -getting the deployment ready for use. This should happen quickly and to see if -it is ready for use you can run the wait command using the ID of the newly -created deployment, shown at the top of the information you received above. - -```bash -oasisctl wait deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -Once you receive a response of _Deployment Ready_, your deployment is indeed -ready to use. You can get some new details by running the get command. - -```bash -oasisctl get deployment \ - --organization-id "ArangoGraph Organization" \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -![Get deployment bootstrap status](../../../images/oasisctl-get-first-deployment-bootstrapped.png) - -Once the deployment is ready you will get two new pieces of information, the -endpoint URL and Bootstrapped-At will indicate the time it became available. -If you would like to login to the web interface to verify that your server is in fact -up and running you will need to supply the `--show-root-password` flag along -with the get command, this flag does not take a value. - -### The Update Command - -The inevitable time comes when something about your deployment must change and -this is where the update command comes in. You can use update to change or -update a number of things including updating the groups, policies, and roles -for user access control. You can also update some of your deployment -information or, for our situation, add an IP Allowlist if you didn’t add one -during creation. - -There are, of course, many options available and it is always recommended to -start with the --help flag to read about all of them. - -### Update a Deployment - -This section will show an example of how to update a deployment to use a -pre-existing allowlist. To add an IP Allowlist after the fact we are really -just updating the IP Allowlist value, which is currently empty. In order to -update the IP Allowlist of a deployment you must create a allowlist and then -you can simply reference its id like so: - -```bash -oasisctl update deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i \ - --ipallowlist-id abc123AllowlistID -``` - -You should receive a response with the deployment information and an indication -that deployment was updated at the top. - -You can use the update command to update everything about your deployments as -well. If you run: - -```bash -oasisctl update deployment --help -``` - -You will see the full list of options available that will allow you to scale -your deployment as needed. - -![Update deployment help output](../../../images/oasisctl-update-deployment-help.png) - -## Delete a Deployment - -There may come a day where you need to delete a resource. The process for this -follows right along with the conventions for the other commands detailed -throughout this guide. - -### The Delete Command - -For the final example in this guide we will delete the deployment that has -been created. This only requires the deployment ID and the permissions to -delete the deployment. - -```bash -oasisctl delete deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -Once the deployment has been deleted you can confirm it is gone by listing -your deployments. - -```bash -oasisctl list deployments \ - --organization-id "ArangoGraph Organization" \ - --format json -``` - -## Next Steps - -As promised, this guide covered the basics of using Oasisctl with the ArangoDB -API. While we primarily focused on viewing and managing deployments there is -also a lot more to explore, including: - -- Organization Invites Management -- Backups -- API Key Management -- Certificate Management -- User Access Control - -You can check out all these features and further details on the ones discussed -in this guide in the documentation. diff --git a/site/content/3.10/arangograph/backups.md b/site/content/3.10/arangograph/backups.md deleted file mode 100644 index e4adcd0a0e..0000000000 --- a/site/content/3.10/arangograph/backups.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -title: Backups in ArangoGraph -menuTitle: Backups -weight: 50 -description: >- - You can manually create backups or use a backup policy to schedule periodic - backups, and both ways allow you to store your backups in multiple regions simultaneously ---- -## How to create backups - -To backup data in ArangoGraph for an ArangoDB installation, navigate to the -**Backups** section of your deployment created previously. - -![Backup ArangoDB](../../images/arangograph-backup-section.png) - -There are two ways to create backups. Create periodic backups using a -**Backup policy**, or create a backup manually. -Both ways allow you to create [backups in multiple regions](#multi-region-backups) -as well. - -### Periodic backups - -Periodic backups are created at a given schedule. To see when the new backup is -due, observe the schedule section. - -![Backup Policy schedule](../../images/arangograph-backup-policy-schedule.png) - -When a new deployment is created, a default **Backup policy** is created for it -as well. This policy creates backups every two hours. To edit this policy -(or any policy), highlight it in the row above and hit the pencil icon. - -![Edit Backup Policy](../../images/arangograph-edit-backup-policy.png) - -These backups are not automatically uploaded. To enable this, use the -**Upload backup to storage** option and choose a retention period that -specifies how long backups are retained after creation. - -If the **Upload backup to storage** option is enabled for a backup policy, -you can then create backups in different regions than the default one. -The regions where the default backup is copied are shown in the -**Additional regions** column in the **Policies** section. - -### Manual backups - -It's also possible to create a backup on demand. To do this, click **Back up now**. - -![Back up Now](../../images/arangograph-back-up-now.png) - -![Back up Now Dialog](../../images/arangograph-back-up-now-dialog.png) - -If you want to manually copy a backup to a different region than the default -one, first ensure that the **Upload backup to storage** option is enabled. -Then, highlight the backup row and use the -**Copy backup to a different region** button from the **Actions** column. - -The source backup ID from -which the copy is created is displayed in the **Copied from Backup** column. - -![Copy backup to a different region](../../images/arangograph-copy-backup-different-region.png) - -![Multiple Backups](../../images/arangograph-multiple-backups.png) - -### Uploading backups - -By default, a backup is not uploaded to the cloud, instead it remains on the -servers of the deployment. To make a backup that is resilient against server -(disk) failures, upload the backup to cloud storage. - -When the **Upload backup to cloud storage** option is enabled, the backup is -preserved for a long time and does not occupy any disk space on the servers. -This also allows copying the backup to different regions and it can be -configured in the **Multiple region backup** section. - -Uploaded backups are -required for [cloning](#how-to-clone-deployments-using-backups). - -#### Best practices for uploading backups - -When utilizing the **Upload backup to cloud storage** feature, a recommended -approach is to implement a backup strategy that balances granularity and storage -efficiency. - -One effective strategy involves creating a combination of backup intervals and -retention periods. For instance, consider the following example: - -1. Perform a backup every 4 hours with a retention period of 24 hours. This - provides frequent snapshots of your data, allowing you to recover recent - changes. -2. Perform a backup every day with a retention period of a week. Daily backups - offer a broader time range for recovery, enabling you to restore data from - any point within the past week. -3. Perform a backup every week with a retention period of a month. Weekly - backups allow you to recover from more extensive data. -4. Perform a backup every month with a retention period of a year. Monthly - backups provide a long-term perspective, enabling you to restore data from - any month within the past year. - -This backup strategy offers good granularity, providing multiple recovery -options for different timeframes. By implementing this approach, you have a -total number of backups that is considerable lower in comparison to other -alternatives such as having hourly backups with a retention period of a year. - -## Multi-region backups - -Using the multi-region backup feature, you can store backups in multiple regions -simultaneously either manually or automatically as part of a **Backup policy**. -If a backup created in one region goes down, it is still available in other -regions, significantly improving reliability. - -Multiple region backup is only available when the -**Upload backup to cloud storage** option is enabled. - -![Multiple Region Backup](../../images/arangograph-multi-region-backup.png) - -## How to restore backups - -To restore a database from a backup, highlight the desired backup and click the restore icon. - -{{< warning >}} -All current data will be lost when restoring. To make sure that new data that -has been inserted after the backup creation is also restored, create a new -backup before using the **Restore Backup** feature. - -During restore, the deployment is temporarily not available. -{{< /warning >}} - -![Restore From Backup](../../images/arangograph-restore-from-backup.png) - -![Restore From Backup Dialog](../../images/arangograph-restore-from-backup-dialog.png) - -![Restore From Backup Status Pending](../../images/arangograph-restore-from-backup-status-pending.png) - -![Restore From Backup Status Restored](../../images/arangograph-restore-from-backup-status-restored.png) - -## How to clone deployments using backups - -Creating a deployment from a backup allows you to duplicate an existing -deployment with all its data, for example, to create a test environment or to -move to a different cloud provider or region within ArangoGraph. - -{{< info >}} -This feature is only available if the backup you wish to clone has been -uploaded to cloud storage. -{{< /info >}} - -{{< info >}} -The cloned deployment will have the exact same features as the previous -deployment including node size and model. The cloud provider and the region -can stay the same or you can select a different one. -For restoring a deployment as quick as possible, it is recommended to create a -deployment in the same region as where the backup resides to avoid cross-region -data transfer. -The data contained in the backup will be restored to this new deployment. - -The *root password* for this deployment will be different. -{{< /info >}} - -1. Highlight the backup you wish to clone from and hit **Clone backup to new deployment**. - - ![ArangoGraph Clone Deployment From Backup](../../images/arangograph-clone-deployment-from-backup.png) - -2. Choose whether the clone should be created using the current provider and in - the same region as the backup or using a different provider, a different region, - or both. - - ![ArangoGraph Clone Deployment Select Region](../../images/arangograph-clone-deployment-select.png) - -3. The view should navigate to the new deployment being bootstrapped. - - ![ArangoGraph Cloned Deployment](../../images/arangograph-cloned-deployment.png) - -This feature is also available through [oasisctl](oasisctl/_index.md). diff --git a/site/content/3.10/arangograph/data-loader/_index.md b/site/content/3.10/arangograph/data-loader/_index.md deleted file mode 100644 index 38f96ab442..0000000000 --- a/site/content/3.10/arangograph/data-loader/_index.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Load your data into ArangoGraph -menuTitle: Data Loader -weight: 22 -description: >- - Load your data into ArangoGraph and transform it into richly-connected graph - structures, without needing to write any code or deploy any infrastructure ---- - -ArangoGraph provides different ways of loading your data into the platform, -based on your migration use case. - -## Transform data into a graph - -The ArangoGraph Data Loader allows you to transform existing data from CSV file -formats into data that can be analyzed by the ArangoGraph platform. - -You provide your data in CSV format, a common format used for exports of data -from various systems. Then, using a no-code editor, you can model the schema of -this data and the relationships between them. This allows you to ingest your -existing datasets into your ArangoGraph database, without the need for any -development effort. - -You can get started in a few easy steps. - -{{< tabs "data-loader-steps" >}} - -{{< tab "1. Create database" >}} -Choose an existing database or create a new one and enter a name for your new graph. -{{< /tab >}} - -{{< tab "2. Add files" >}} -Drag and drop your data files in CSV format. -{{< /tab >}} - -{{< tab "3. Design your graph" >}} -Model your graph schema by adding nodes and connecting them via edges. -{{< /tab >}} - -{{< tab "4. Import data" >}} -Once you are ready, save and start the import. The resulting graph is an -[EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) with its -corresponding collections, available in your ArangoDB web interface. -{{< /tab >}} - -{{< /tabs >}} - -Follow this [working example](../data-loader/example.md) to see how easy it is -to transform existing data into a graph. - -## Import data to the cloud - -To import data from various files into collections **without creating a graph**, -get the ArangoDB client tools for your operating system from the -[download page](https://arangodb.com/download-major/). - -- To import data to ArangoGraph from an existing ArangoDB instance, see - [arangodump](../../components/tools/arangodump/) and - [arangorestore](../../components/tools/arangorestore/). -- To import pre-existing data in JSON, CSV, or TSV format, see - [arangoimport](../../components/tools/arangoimport/). - -## How to access the Data Loader - -1. If you do not have a deployment yet, [create a deployment](../deployments/_index.md#how-to-create-a-new-deployment) first. -2. Open the deployment you want to load data into. -3. In the **Load Data** section, click the **Load your data** button. -4. Select your migration use case. - -![ArangoGraph Data Loader Migration Use Cases](../../../images/arangograph-data-loader-migration-use-cases.png) \ No newline at end of file diff --git a/site/content/3.10/arangograph/data-loader/add-files.md b/site/content/3.10/arangograph/data-loader/add-files.md deleted file mode 100644 index 114b588e40..0000000000 --- a/site/content/3.10/arangograph/data-loader/add-files.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Add files into Data Loader -menuTitle: Add files -weight: 5 -description: >- - Provide your set of files in CSV format containing the data to be imported ---- - -The Data Loader allows you to upload your data files in CSV format into -ArangoGraph and then use these data sources to design a graph using the -built-in graph designer. - -## Upload your files - -You can upload your CSV files in the following ways: - -- Drag and drop your files in the designated area. -- Click the **Browse files** button and select the files you want to add. - -![ArangoGraph Data Loader Upload Files](../../../images/arangograph-data-loader-upload-files.png) - -You have the option to either upload several files collectively as a batch or -add them individually. Furthermore, you can supplement additional files later on. -After a file has been uploaded, you can expand it to preview both the header and -the first row of data within the file. - -In case you upload CSV files without fields, they will not be available for -manipulation. - -Once the files are uploaded, you can start [designing your graph](../data-loader/design-graph.md). - -### File formatting limitations - -Ensure that the files you upload are correctly formatted. Otherwise, errors may -occur, the upload may fail, or the data may not be correctly mapped. - -The following restrictions and limitations apply: - -- The only supported file format is CSV. If you submit an invalid file format, - the upload of that specific file will be prevented. -- It is required that all CSV files have a header row. If you upload a file - without a header, the first row of data is treated as the header. To avoid - losing the first row of the data, make sure to include headers in your files. -- The CSV file should have unique header names. It is not possible to have two - columns with the same name within the same file. - -For more details, see the [File validation](../data-loader/import.md#file-validation) section. - -### Upload limits - -Note that there is a cumulative file upload limit of 1GB. This means that the -combined size of all files you upload should not exceed 1GB. If the total size -of the uploaded files surpasses this limit, the upload may not be successful. - -## Delete files - -You can remove uploaded files by clicking the **Delete file** button in the -**Your files** panel. Please keep in mind that in order to delete a file, -you must first remove all graph associations associated with it. \ No newline at end of file diff --git a/site/content/3.10/arangograph/data-loader/design-graph.md b/site/content/3.10/arangograph/data-loader/design-graph.md deleted file mode 100644 index b1c5eaf3af..0000000000 --- a/site/content/3.10/arangograph/data-loader/design-graph.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Design your graph -menuTitle: Design graph -weight: 10 -description: >- - Design your graph database schema using the integrated graph modeler in the Data Loader ---- - -Based on the data you have uploaded, you can start designing your graph. -The graph designer allows you to create a schema using nodes and edges. -Once this is done, you can save and start the import. The resulting -[EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and the -corresponding collections are created in your ArangoDB database instance. - -## How to add a node - -Nodes are the main objects in your data model and include the attributes of the -objects. - -1. To create a new node, click the **Add node** button. -2. In the graph designer, click on the newly created node to view the **Node details**. -3. In the **Node details** panel, fill in the following fields: - - For **Node label**, enter a name you want to use for the node. - - For **File**, select a file from the list to associate it with the node. - - For **Primary Identifier**, select a field from the list. This is used to - reference the nodes when you define relations with edges. - - For **File Headers**, select one or more attributes from the list. - -![ArangoGraph Data Loader Add Node](../../../images/arangograph-data-loader-add-node.png) - -## How to connect nodes - -Nodes can be connected by edges to express and categorize the relations between -them. A relation always has a direction, going from one node to another. You can -define this direction in the graph designer by dragging your cursor from one -particular node to another. - -To connect two nodes, you can use the **Connect node(s)** button. Click on any -node to self-reference it or drag it to connect it to another node. Alternatively, -when you select a node, a plus sign will appear, allowing you to directly add a -new node with an edge. - -{{< tip >}} -To quickly recenter your elements on the canvas, you can use the **Center View** -button located in the bottom right corner. This brings your nodes and edges back -into focus. -{{< /tip >}} - -The edge needs to be associated with a file and must have a label. Note that a -node and an edge cannot have the same label. - -See below the steps to add details to an edge. - -1. Click on an edge in the graph designer. -2. In the **Edit Edge** panel, fill in the following fields: - - For **Edge label**, enter a name you want to use for the edge. - - For **Relation file**, select a file from the list to associate it with the edge. - - To define how the relation points from one node to another, select the - corresponding relation file header for both the origin file (`_from`) and the - destination file (`_to`). - - For **File Headers**, select one or more attributes from the list. - -![ArangoGraph Data Loader Edit Edge](../../../images/arangograph-data-loader-edit-edge.png) - -## How to delete elements - -To remove a node or an edge, simply select it in the graph designer and click the -**Delete** icon. \ No newline at end of file diff --git a/site/content/3.10/arangograph/deployments/_index.md b/site/content/3.10/arangograph/deployments/_index.md deleted file mode 100644 index b8dd98d490..0000000000 --- a/site/content/3.10/arangograph/deployments/_index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Deployments in ArangoGraph -menuTitle: Deployments -weight: 20 -description: >- - How to create and manage deployments in ArangoGraph ---- -An ArangoGraph deployment is an ArangoDB cluster or single server, configured -as you choose. - -Each deployment belongs to a project, which belongs to an organization in turn. -You can have any number of deployments under one project. - -**Organizations → Projects → <u>Deployments</u>** - -![ArangoGraph Deployments](../../../images/arangograph-deployments-page.png) - -## How to create a new deployment - -1. If you do not have a project yet, - [create a project](../projects.md#how-to-create-a-new-project) first. -2. In the main navigation, click __Deployments__. -3. Click the __New deployment__ button. -4. Select the project you want to create the deployment for. -5. Set up your deployment. The configuration options are described below. - -{{< info >}} -Deployments contain exactly **one policy**. Within that policy, you can define -role bindings to regulate access control on a deployment level. -{{< /info >}} - -### In the **General** section - -- Enter the __Name__ and optionally a __Short description__ for the deployment. -- Select the __Provider__ and __Region__ of the provider. - {{< warning >}} - Once a deployment has been created, it is not possible to change the - provider and region anymore. - {{< /warning >}} - -![ArangoGraph New Deployment General](../../../images/arangograph-new-deployment-general.png) - -### In the **Sizing** section - -- Choose a __Model__ for the deployment: - - - __OneShard__ deployments are suitable when your data set fits in a single node. - They are ideal for graph use cases. This model has a fixed number of 3 nodes. - - - __Sharded__ deployments are suitable when your data set is larger than a single - node. The data will be sharded across multiple nodes. You can select the - __Number of nodes__ for this deployment model. The more nodes you have, the - higher the replication factor can be. - - - __Single Server__ deployments are suitable when you want to try out ArangoDB without - the need for high availability or scalability. The deployment will contain a - single server only. Your data will not be replicated and your deployment can - be restarted at any time. - -- Select a __NODE SIZE__ from the list of available options. Each option is a - combination of vCPUs, memory, and disk space per node. - -![ArangoGraph New Deployment Sizing](../../../images/arangograph-new-deployment-sizing.png) - -### In the **Advanced** section - -- Select the __DB Version__. - If you don't know which DB version to select, use the version selected by default. -- Select the desired __Support Plan__. Click the link below the field to get - more information about the different support plans. -- In the __Certificate__ field: - - The default certificate created for your project is selected automatically. - - If you have no default certificate, or want to use a new certificate, - create a new certificate by typing the desired name for it and hitting - enter or clicking __Create "\<name\>"__ when done. - - Or, if you already have multiple certificates, select the desired one. -- _Optional but strongly recommended:_ In the __IP allowlist__ field, select the - desired one in case you want to limit access to your deployment to certain - IP ranges. To create a allowlist, navigate to your project and select the - __IP allowlists__ tab. See [How to manage IP allowlists](../projects.md#how-to-manage-ip-allowlists) - for details. - {{< security >}} - For any kind of production deployment it is strongly advise to use an IP allowlist. - {{< /security >}} -- Select a __Deployment Profile__. Profile options are only available on request. - -![ArangoGraph New Deployment Advanced](../../../images/arangograph-new-deployment-advanced.png) - -### In the **Summary** panel - -1. Review the configuration, and if you're okay with the setup, press the - __Create deployment__ button. -2. You are taken to the deployment overview page. - **Note:** Your deployment is being bootstrapped at that point. This process - takes a few minutes. Once the deployment is ready, you receive a confirmation - email. - -## How to access your deployment - -1. In the main navigation, click the __Dashboard__ icon and then click __Projects__. -2. In the __Projects__ page, click the project for - which you created a deployment earlier. -3. Alternatively, you can access your deployment by clicking __Deployments__ in the - dashboard navigation. This page shows all deployments from all projects. - Click the name of the deployment you want to view. -4. For each deployment in your project, you see the status. While your new - deployment is being set up, it displays the __bootstrapping__ status. -5. Press the __View__ button to show the deployment page. -6. When a deployment displays a status of __OK__, you can access it. -7. Click the __Open database UI__ button or on the database UI link to open - the dashboard of your new ArangoDB deployment. - -At this point your ArangoDB deployment is available for you to use — **Have fun!** - -If you have disabled the [auto-login option](#auto-login-to-database-ui) to the -database web interface, you need to follow the additional steps outlined below -to access your deployment: - -1. Click the copy icon next to the root password. This copies the deployment - root password to your clipboard. You can also click the view icon to unmask - the root password to see it. - {{< security >}} - Do not use the root username/password for everyday operations. It is recommended - to use them only to create other user accounts with appropriate permissions. - {{< /security >}} -2. Click the __Open database UI__ button or on the database UI link to open - the dashboard of your new ArangoDB deployment. -3. In the __username__ field type `root`, and in the __password__ field paste the - password that you copied earlier. -4. Press the __Login__ button. -5. Press the __Select DB: \_system__ button. - -{{< info >}} -Each deployment is accessible on two ports: - -- Port `8529` is the standard port recommended for use by web-browsers. -- Port `18529` is the alternate port that is recommended for use by automated services. - -The difference between these ports is the certificate used. If you enable -__Use well-known certificate__, the certificates used on port `8529` is well-known -and automatically accepted by most web browsers. The certificate used on port -`18529` is a self-signed certificate. For securing automated services, the use of -a self-signed certificate is recommended. Read more on the -[Certificates](../security-and-access-control/x-509-certificates.md) page. -{{< /info >}} - -## Password settings - -### How to enable the automatic root user password rotation - -Password rotation refers to changing passwords regularly - a security best -practice to reduce the vulnerability to password-based attacks and exploits -by limiting for how long passwords are valid. The ArangoGraph Insights Platform -can automatically change the `root` user password of an ArangoDB deployment -periodically to improve security. - -1. Navigate to the __Deployment__ for which you want to enable an automatic - password rotation for the root user. -2. In the __Quick start__ section, click the button with the __gear__ icon next to the - __ROOT PASSWORD__. -3. In the __Password Settings__ dialog, turn the automatic password rotation on - and click the __Confirm__ button. - - ![ArangoGraph Deployment Password Rotation](../../../images/arangograph-deployment-password-rotation.png) -4. You can expand the __Root password__ panel to see when the password was - rotated last. The rotation takes place every three months. - -### Auto login to database UI - -ArangoGraph provides the ability to automatically login to your database using -your existing ArangoGraph credentials. This not only provides a seamless -experience, preventing you from having to manage multiple sets of credentials -but also improves the overall security of your database. As your credentials -are shared between ArangoGraph and your database, you can benefit from -end-to-end audit traceability for a given user, as well as integration with -ArangoGraph SSO. - -You can enable this feature in the **Password Settings** dialog. Please note -that it may take a few minutes to get activated. -Once enabled, you no longer have to fill in the `root` user and password of -your ArangoDB deployment. - -{{< info >}} -If you use the auto login feature with AWS -[private endpoints](../deployments/private-endpoints.md), it is recommended -to switch off the `custom DNS` setting. -{{< /info >}} - -This feature can be disabled at any time. You may wish to consider explicitly -disabling this feature in the following situations: -- Your workflow requires you to access the database UI using different accounts - with differing permission sets, as you cannot switch database users when - automatic login is enabled. -- You need to give individuals access to a database's UI without giving them - any access to ArangoGraph. Note, however, that it's possible to only give an - ArangoGraph user database UI access, without other ArangoGraph permissions. - -{{< warning >}} -When the auto login feature is enabled, users cannot edit their permissions on -the ArangoDB database web interface as all permissions are managed by the -ArangoGraph platform. -{{< /warning >}} - -Before getting started, make sure you are signed into ArangoGraph as a user -with one of the following permissions in your project: -- `data.deployment.full-access` -- `data.deployment.read-only-access` - -Organization owners have these permissions enabled by default. -The `deployment-full-access-user` and `deployment-read-only-user` roles which -contain these permissions can also be granted to other members of the -organization. See how to create a -[role binding](../security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy). - -{{< warning >}} -This feature is available on `443` port only. -{{< /warning >}} - -## How to edit a deployment - -You can modify a deployment's configuration, including the ArangoDB version -that is being used, change the memory size, or even switch from -a OneShard deployment to a Sharded one if your data set no longer fits in a -single node. - -{{< tip >}} -To edit an existing deployment, you must have the necessary set of permissions -attached to your role. Read more about [roles and permissions](../security-and-access-control/_index.md#roles). -{{< /tip >}} - -1. In the main navigation, click **Deployments** and select an existing - deployment from the list, or click **Projects**, select a project, and then - select a deployment. -2. In the **Quick start** section, click the **Edit** button. -3. In the **General** section, you can do the following: - - Change the deployment name - - Change the deployment description -4. In the **Sizing** section, you can do the following: - - Change **OneShard** deployments into **Sharded** deployments. To do so, - select **Sharded** in the **Model** dropdown list. You can select the - number of nodes for your deployment. This can also be modified later on. - {{< warning >}} - You cannot switch from **Sharded** back to **OneShard**. - {{< /warning >}} - - Change **Single Server** deployments into **OneShard** or **Sharded** deployments. - {{< warning >}} - You cannot switch from **Sharded** or **OneShard** back to **Single Server**. - {{< /warning >}} - - Scale up or down the node size. - {{< warning >}} - When scaling up or down the size in AWS deployments, the new value gets locked - and cannot be changed again until the cloud provider rate limit is reset. - {{< /warning >}} -5. In the **Advanced** section, you can do the following: - - Upgrade the ArangoDB version that is currently being used. See also - [Upgrades and Versioning](upgrades-and-versioning.md) - - Select a different certificate. - - Add or remove an IP allowlist. - - Select a deployment profile. -6. All changes are reflected in the **Summary** panel. Review the new - configuration and click **Save changes**. - -## How to connect a driver to your deployment - -[ArangoDB drivers](../../develop/drivers/_index.md) allow you to use your ArangoGraph -deployment as a database system for your applications. Drivers act as interfaces -between different programming languages and ArangoDB, which enable you to -connect to and manipulate ArangoDB deployments from within compiled programs -or using scripting languages. - -To get started, open a deployment. -In the **Quick start** section, click on the **Connecting drivers** button and -select your programming language. The code snippets provide examples on how to -connect to your instance. - -{{< tip >}} -Note that ArangoGraph Insights Platform runs deployments in a cluster -configuration. To achieve the best possible availability, your client -application has to handle connection failures by retrying operations if needed. -{{< /tip >}} - -![ArangoGraph Connecting Drivers Example](../../../images/arangograph-connecting-drivers-example.png) - -## How to delete a deployment - -{{< danger >}} -Deleting a deployment deletes all its data and backups. -This operation is **irreversible**. Please proceed with caution. -{{< /danger >}} - -1. In the main navigation, in the __Projects__ section, click the project that - holds the deployment you wish to delete. -2. In the __Deployments__ page, click the deployment you wish to delete. -3. Click the __Delete/Lock__ entry in the navigation. -4. Click the __Delete deployment__ button. -5. In the modal dialog, confirm the deletion by entering `Delete!` into the - designated text field. -6. Confirm the deletion by pressing the __Yes__ button. -7. You will be taken back to the deployments page of the project. - The deployment being deleted will display the __Deleting__ status until it has - been successfully removed. diff --git a/site/content/3.10/arangograph/deployments/private-endpoints.md b/site/content/3.10/arangograph/deployments/private-endpoints.md deleted file mode 100644 index 39e42514fd..0000000000 --- a/site/content/3.10/arangograph/deployments/private-endpoints.md +++ /dev/null @@ -1,221 +0,0 @@ ---- -title: Private endpoint deployments in ArangoGraph -menuTitle: Private endpoints -weight: 5 -description: >- - Use the private endpoint feature to isolate your deployments and increase - security ---- -This topic describes how to create a private endpoint deployment and -securely deploy to various cloud providers such as Google Cloud Platform (GCP), -Microsoft Azure, and Amazon Web Services (AWS). Follow the steps outlined below -to get started. - -{{< tip >}} -Private endpoints on Microsoft Azure can be cross region; in AWS they should be -located in the same region. -{{< /tip >}} - -{{< info >}} -For more information about the certificates used for private endpoints, please -refer to the [How to manage certificates](../security-and-access-control/x-509-certificates.md) -section. -{{< /info >}} - -## Google Cloud Platform (GCP) - -Google Cloud Platform (GCP) offers a feature called -[Private Service Connect](https://cloud.google.com/vpc/docs/private-service-connect) -that allows private consumption of services across VPC networks that belong to -different groups, teams, projects, or organizations. You can publish and consume -services using the defined IP addresses which are internal to your VPC network. - -In ArangoGraph, you can -[create a regular deployment](_index.md#how-to-create-a-new-deployment) -and change it to a private endpoint deployment afterwards. - -Such a deployment is not reachable from the internet anymore, other than via -the ArangoGraph dashboard to administrate it. To revert to a public deployment, -please contact support via **Request help** in the help menu. - -To configure a private endpoint for GCP, you need to provide your Google project -names. ArangoGraph then configures a **Private Endpoint Service** that automatically -connect to private endpoints that are created for those projects. - -After the creation of the **Private Endpoint Service**, you should receive a -service attachment that you need during the creation of your private endpoint(s). - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment Private Endpoint Menu](../../../images/arangograph-gcp-change.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Enter one or more Google project names. You can also add them later in the summary view. - Click **Next**. - ![ArangoGraph Deployment Private Endpoint Setup 2](../../../images/arangograph-gcp-private-endpoint.png) -6. Configure custom DNS names. This step is optional and disabled by default. - Note that, once enabled, this setting is immutable and cannot be reverted. - Click **Next** to continue. - {{< info >}} - By default, your private endpoint is available to all VPCs that connect to it - at `https://<endpoint_id>-pe.arangodb.cloud` with the - [well-known certificate](../security-and-access-control/x-509-certificates.md#well-known-x509-certificates). - If the custom DNS is enabled, you will be responsible for the DNS of your - private endpoints. - {{< /info >}} - ![ArangoGraph Private Endpoint Custom DNS](../../../images/arangograph-gcp-custom-dns.png) -7. Click **Confirm Settings** to change the deployment. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and to change the - configuration. -9. ArangoGraph configures a **Private Endpoint Service**. As soon as the - **Service Attachment** is ready, you can use it to configure the Private - Service Connect in your VPC. - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} - -## Microsoft Azure - -Microsoft Azure offers a feature called -[Azure Private Link](https://docs.microsoft.com/en-us/azure/private-link) -that allows you to limit communication between different Azure servers and -services to Microsoft's backbone network without exposure to the internet. -It can lower network latency and increase security. - -If you want to connect an ArangoGraph deployment running on Azure with other -services you run on Azure using such a tunnel, then -[create a regular deployment](_index.md#how-to-create-a-new-deployment) -and change it to a private endpoint deployment afterwards. - -The deployment is not reachable from the internet anymore, other than via -the ArangoGraph dashboard to administrate it. To revert to a public deployment, -please contact support via **Request help** in the help menu. - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment Private Endpoint Menu](../../../images/arangograph-deployment-private-endpoint-menu.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Enter one or more Azure Subscription IDs (GUIDs). They cannot be - changed anymore once a connection has been established. - Proceed by clicking **Next**. - ![ArangoGraph Deployment Private Endpoint Setup 2](../../../images/arangograph-deployment-private-endpoint-setup2.png) -6. Configure custom DNS names. This step is optional and disabled by default, - you can also add or change them later from the summary view. - Click **Next** to continue. - {{< info >}} - When using custom DNS names on private endpoints running on Azure, you need - to use the [self-signed certificate](../security-and-access-control/x-509-certificates.md#self-signed-x509-certificates). - {{< /info >}} -7. Click **Confirm Settings** to change the deployment. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and to change the - configuration. -9. ArangoGraph configures a **Private Endpoint Service**. As soon as the **Azure alias** - becomes available, you can copy it and then go to your Microsoft Azure portal - to create Private Endpoints using this alias. The number of established - **Connections** increases and you can view the connection details by - clicking it. - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} - -## Amazon Web Services (AWS) - -AWS offers a feature called [AWS PrivateLink](https://aws.amazon.com/privatelink) -that enables you to privately connect your Virtual Private Cloud (VPC) to -services, without exposure to the internet. You can control the specific API -endpoints, sites, and services that are reachable from your VPC. - -Amazon VPC allows you to launch AWS resources into a -virtual network that you have defined. It closely resembles a traditional -network that you would normally operate, with the benefits of using the AWS -scalable infrastructure. - -In ArangoGraph, you can -[create a regular deployment](_index.md#how-to-create-a-new-deployment) and change it -to a private endpoint deployment afterwards. - -The ArangoDB private endpoint deployment is not exposed to public internet -anymore, other than via the ArangoGraph dashboard to administrate it. To revert -it to a public deployment, please contact the support team via **Request help** -in the help menu. - -To configure a private endpoint for AWS, you need to provide the AWS principals related -to your VPC. The ArangoGraph Insights Platform configures a **Private Endpoint Service** -that automatically connects to private endpoints that are created in those principals. - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment AWS Change to Private Endpoint](../../../images/arangograph-aws-change-to-private-endpoint.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Click **Add Principal** to start configuring the AWS principal(s). - You need to enter a valid account, which is your 12 digit AWS account ID. - Adding usernames or role names is optional. You can also - skip this step and add them later from the summary view. - {{< info >}} - Principals cannot be changed anymore once a connection has been established. - {{< /info >}} - {{< warning >}} - To verify your endpoint service in AWS, you must use the same principal as - configured in ArangoGraph. Otherwise, the service name cannot be verified. - {{< /warning >}} - ![ArangoGraph AWS Private Endpoint Configure Principals](../../../images/arangograph-aws-endpoint-configure-principals.png) -6. Configure custom DNS names. This step is optional and disabled by default, - you can also add or change them later from the summary view. - Click **Next** to continue. - {{< info >}} - By default, your private endpoint is available to all VPCs that connect to it - at `https://<endpoint_id>-pe.arangodb.cloud` with the well-known certificate. - If the custom DNS is enabled, you will be responsible for the DNS of your - private endpoints. - {{< /info >}} - ![ArangoGraph AWS Private Endpoint Alternate DNS](../../../images/arangograph-aws-private-endpoint-dns.png) -7. Confirm that you want to use a private endpoint for your deployment by - clicking **Confirm Settings**. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and change the - configuration, if needed. - ![ArangoGraph AWS Private Endpoint Overview](../../../images/arangograph-aws-private-endpoint-overview.png) - {{< info >}} - Note that - [Availability Zones](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones) - are independently mapped for each AWS account. The physical location of a - zone may differ from one account to another account. To coordinate - Availability Zones across AWS accounts, you must use the - [Availability Zone ID](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html). - {{< /info >}} - - {{< tip >}} - To learn more or request help from the ArangoGraph support team, click **Help** - in the top right corner of the **Private Endpoint** section. - {{< /tip >}} -9. ArangoGraph configures a **Private Endpoint Service**. As soon as this is available, - you can use it in the AWS portal to create an interface endpoint to connect - to your endpoint service. For more details, see - [How to connect to an endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html#share-endpoint-service). - -{{< tip >}} -To establish connectivity and enable traffic flow, make sure you add a route -from the originating machine to the interface endpoint. -{{< /tip >}} - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} diff --git a/site/content/3.10/arangograph/migrate-to-the-cloud.md b/site/content/3.10/arangograph/migrate-to-the-cloud.md deleted file mode 100644 index 8a3f4a9802..0000000000 --- a/site/content/3.10/arangograph/migrate-to-the-cloud.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -title: Cloud Migration Tool -menuTitle: Migrate to the cloud -weight: 30 -description: >- - Migrating data from bare metal servers to the cloud with minimal downtime -draft: true ---- -The `arangosync-migration` tool allows you to easily move from on-premises to -the cloud while ensuring a smooth transition with minimal downtime. -Start the cloud migration, let the tool do the job and, at the same time, -keep your local cluster up and running. - -Some of the key benefits of the cloud migration tool include: -- Safety comes first - pre-checks and potential failures are carefully handled. -- Your data is secure and fully encrypted. -- Ease-of-use with a live migration while your local cluster is still in use. -- Get access to what a cloud-based fully managed service has to offer: - high availability and reliability, elastic scalability, and much more. - -## Downloading the tool - -The `arangosync-migration` tool is available to download for the following -operating systems: - -**Linux** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/linux/amd64/arangosync-migration) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/linux/arm64/arangosync-migration) - -**macOS / Darwin** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/darwin/amd64/arangosync-migration) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/darwin/arm64/arangosync-migration) - -**Windows** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/windows/amd64/arangosync-migration.exe) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/windows/arm64/arangosync-migration.exe) - -For macOS as well as other Unix-based operating systems, run the following -command to make sure you can execute the binary: - -```bash -chmod 755 ./arangosync-migration -``` - -## Prerequisites - -Before getting started, make sure the following prerequisites are in place: - -- Go to the [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home) - and sign in. If you don’t have an account yet, sign-up to create one. - -- Generate an ArangoGraph API key and API secret. See a detailed guide on - [how to create an API key](api/set-up-a-connection.md#creating-an-api-key). - -{{< info >}} -The cloud migration tool is only available for clusters. -{{< /info >}} - -### Setting up the target deployment in ArangoGraph - -Continue by [creating a new ArangoGraph deployment](deployments/_index.md#how-to-create-a-new-deployment) -or choose an existing one. - -The target deployment in ArangoGraph requires specific configuration rules to be -set up before the migration can start: - -- **Configuration settings**: The target deployment must be compatible with the - source data cluster. This includes the ArangoDB version that is being used, - the DB-Servers count, and disk space. -- **Deployment region and cloud provider**: Choose the closest region to your - data cluster. This factor can speed up your migration to the cloud. - -After setting up your ArangoGraph deployment, wait for a few minutes for it to become -fully operational. - -{{< info >}} -Note that Developer mode deployments are not supported. -{{< /info >}} - -## Running the migration tool - -The `arangosync-migration` tool provides a set of commands that allow you to: -- start the migration process -- check whether your source and target clusters are fully compatible -- get the current status of the migration process -- stop or abort the migration process -- switch the local cluster to read-only mode - -### Starting the migration process - -To start the migration process, run the following command: - -```bash -arangosync-migration start -``` -The `start` command runs some pre-checks. Among other things, it measures -the disk space which is occupied by your ArangoDB cluster. If you are using the -same data volume for ArangoDB servers and other data as well, the measurements -can be incorrect. Provide the `--source.ignore-metrics` option to overcome this. - -You also have the option of doing a `--check-only` without starting the actual -migration. If specified, this checks if your local cluster and target deployment -are compatible without sending any data to ArangoGraph. - -Once the migration starts, the local cluster enters into monitoring mode and the -synchronization status is displayed in real-time. If you don't want to see the -status you can terminate this process, as the underlying agent process -continues to work. If something goes wrong, restarting the same command restores -the replication state. - -To restart the migration, first `stop` or `stop --abort` the migration. Then, -start it again using the `start` command. - -{{< warning >}} -Starting the migration creates a full copy of all data from the source cluster -to the target deployment in ArangoGraph. All data that has previously existed in the -target deployment will be lost. -{{< /warning >}} - -### During the migration - -The following takes place during an active migration: -- The source data cluster remains usable. -- The target deployment in ArangoGraph is switched to read-only mode. -- Your root user password is not copied to the target deployment in ArangoGraph. - To get your root password, select the target deployment from the ArangoGraph - Dashboard and go to the **Overview** tab. All other users are fully synchronized. - -{{< warning >}} -The migration tool increases the CPU and memory usage of the server you are -running it on. Depending on your ArangoDB usage pattern, it may take a lot of CPU -to handle the replication. You can stop the migration process anytime -if you see any problems. -{{< /warning >}} - -```bash -./arangosync-migration start \ - --source.endpoint=$COORDINATOR_ENDPOINT \ - --source.jwt-secret=/path-to/jwt-secret.file \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -### How long does it take? - -The total time required to complete the migration depends on how much data you -have and how often write operations are executed during the process. - -You can also track the progress by checking the **Migration status** section of -your target deployment in ArangoGraph dashboard. - -![ArangoGraph Cloud Migration Progress](../../images/arangograph-migration-agent.png) - -### Getting the current status - -To print the current status of the migration, run the following command: - -```bash -./arangosync-migration status \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -You can also add the `--watch` option to start monitoring the status in real-time. - -### Stopping the migration process - -The `arangosync-migration stop` command stops the migration and terminates -the migration agent process. - -If replication is running normally, the command waits until all shards are -in sync. The local cluster is then switched into read-only mode. -After all shards are in-sync and the migration stopped, the target deployment -is switched into the mode specified in `--source.server-mode` option. If no -option is specified, it defaults to the read/write mode. - -```bash -./arangosync-migration stop \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -The additional `--abort` option is supported. If specified, the `stop` command -will not check anymore if both deployments are in-sync and stops all -migration-related processes as soon as possible. - -### Switching the local cluster to read-only mode - -The `arangosync-migration set-server-mode` command allows switching -[read-only mode](../develop/http-api/administration.md#set-the-server-mode-to-read-only-or-default) -for your local cluster on and off. - -In a read-only mode, all write operations are going to fail with an error code -of `1004` (ERROR_READ_ONLY). -Creating or dropping databases and collections are also going to fail with -error code `11` (ERROR_FORBIDDEN). - -```bash -./arangosync-migration set-server-mode \ - --source.endpoint=$COORDINATOR_ENDPOINT \ - --source.jwt-secret=/path-to/jwt-secret.file \ - --source.server-mode=readonly -``` -The `--source.server-mode` option allows you to specify the desired server mode. -Allowed values are `readonly` or `default`. - -### Supported environment variables - -The `arangosync-migration` tool supports the following environment variables: - -- `$ARANGO_GRAPH_API_KEY` -- `$ARANGO_GRAPH_API_SECRET` -- `$ARANGO_GRAPH_DEPLOYMENT_ID` - -Using these environment variables is highly recommended to ensure a secure way -of providing sensitive data to the application. - -### Restrictions and limitations - -When running the migration, ensure that your target deployment has the same (or -bigger) amount of resources (CPU, RAM) than your cluster. Otherwise, the -migration process might get stuck or require manual intervention. This is closely -connected to the type of data you have and how it is distributed between shards -and collections. - -In general, the most important parameters are: -- Total number of leader shards -- The amount of data in bytes per collection - -Both parameters can be retrieved from the ArangoDB Web Interface. - -The `arangosync-migration` tool supports migrating large datasets of up to -5 TB of data and 3800 leader shards, as well as collections as big as 250 GB. - -In case you have any questions, please -[reach out to us](https://www.arangodb.com/contact). - -## Cloud migration workflow for minimal downtime - -1. Download and start the `arangosync-migration` tool. The target deployment - is switched into read-only mode automatically. -2. Wait until all shards are in sync. You can use the `status` or the `start` - command with the same parameters to track that. -3. Optionally, when all shards are in-sync, you can switch your applications - to use the endpoint of the ArangoGraph deployment, but note that it stays in - read-only mode until the migration process is fully completed. -4. Stop the migration using the `stop` subcommand. The following steps are executed: - - The source data cluster is switched into read-only mode. - - It waits until all shards are synchronized. - - The target deployment is switched into default read/write mode. - - {{< info >}} - If you switched the source data cluster into read-only mode, - you can switch it back to default (read/write) mode using the - `set-server-mode` subcommand. - {{< /info >}} diff --git a/site/content/3.10/arangograph/monitoring-and-metrics.md b/site/content/3.10/arangograph/monitoring-and-metrics.md deleted file mode 100644 index 2b9ede4b4a..0000000000 --- a/site/content/3.10/arangograph/monitoring-and-metrics.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Monitoring & Metrics in ArangoGraph -menuTitle: Monitoring & Metrics -weight: 40 -description: >- - ArangoGraph provides various built-in tools and integrations to help you - monitor your deployment ---- -The ArangoGraph Insights Platform provides integrated charts, metrics, and logs -to help you monitor your deployment. This allows you to track your deployment's -performance, resource utilization, and its overall status. - -The key features include: -- **Built-in monitoring**: Get immediate access to monitoring capabilities for - your deployments without any additional setup. -- **Chart-based metrics representation**: Visualize the usage of the DB-Servers - and Coordinators over a selected timeframe. -- **Integration with Prometheus and Grafana**: Connect your metrics to Prometheus - and Grafana for in-depth visualization and analysis. - -To get started, select an existing deployment from within a project and -click **Monitoring** in the navigation. - -![ArangoGraph Monitoring tab](../../images/arangograph-monitoring-tab.png) - -## Built-in monitoring and metrics - -### In the **Servers** section - -The **Servers** section offers an overview of the DB-Servers, Coordinators, -and Agents used in your deployment. It provides essential details such as each -server's ID and type, the running ArangoDB version, as well as their memory, -CPU, and disk usage. - -In case you need to perform a restart on a server, you can do so by using the -**Gracefully restart this server** action button. This shuts down all services -normally, allowing ongoing operations to finish gracefully before the restart -occurs. - -Additionally, you can access detailed logs via the **Logs** button. This allows -you to apply filters to obtain logs from all server types or select specific ones -(i.e. only Coordinators or only DB-Servers) within a timeframe. To download the -logs, click the **Save** button. - -![ArangoGraph Monitoring Servers](../../images/arangograph-monitoring-servers.png) - -### In the **Metrics** section - -The **Metrics** section displays a chart-based representation depicting the -resource utilization of DB-Servers and Coordinators within a specified timeframe. - -You can select one or more DB-Servers and choose **CPU**, **Memory**, or **Disk** -to visualize their respective usage. The search box enables you to easily find -a server by its ID, particularly useful when having a large number of servers -or when needing to quickly find a particular one among many. - -Similarly, you can repeat the process for Coordinators to see the **CPU** and -**Memory** usage. - -![Arangograph Monitoring Metrics Chart](../../images/arangograph-monitoring-metrics-chart.png) - -## Connect with Prometheus and Grafana - -The ArangoGraph Insights Platform provides metrics for each deployment in a -[Prometheus](https://prometheus.io/)-compatible format. -You can use these metrics to gather detailed insights into the current -and previous states of your deployment. -Once metrics are collected by Prometheus, you can inspect them using tools -such as [Grafana](https://grafana.com/oss/grafana/). - -![ArangoGraph Connect Metrics Section](../../images/arangograph-connect-metrics-section.png) - -### Metrics tokens - -The **Metrics tokens** section allows you to create a new metrics token, -which is required for connecting to Prometheus. - -1. To create a metrics token, click **New metrics token**. -2. For **Name**, enter a name for the metrics token. -3. Optionally, you can also enter a **Short description**. -4. Select the **Lifetime** of the metrics token. -5. Click **Create**. - -![ArangoGraph Metrics Tokens](../../images/arangograph-metrics-token.png) - -### How to connect Prometheus - -1. In the **Metrics** section, click **Connect Prometheus**. -2. Create the `prometheus.yml` file with the following content: - ```yaml - global: - scrape_interval: 60s - scrape_configs: - - job_name: 'deployment' - bearer_token: '<fill-your-metrics-token-here>' - scheme: 'https' - static_configs: - - targets: ['6775e7d48152.arangodb.cloud:8829'] - tls_config: - insecure_skip_verify: true - ``` -3. Start Prometheus with the following command: - ```sh - docker run -d \ - -p 9090:9090 -p 3000:3000 --name prometheus \ - -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml:ro \ - prom/prometheus - ``` - {{< info >}} - This command also opens a port 3000 for Grafana. In a production environment, - this is not needed and not recommended to have it open. - {{< /info >}} - -### How to connect Grafana - -1. Start Grafana with the following command: - ```sh - docker run -d \ - --network container:prometheus \ - grafana/grafana - ``` -2. Go to `localhost:3000` and log in with the following credentials: - - For username, enter *admin*. - - For password, enter *admin*. - - {{< tip >}} - After the initial login, make sure to change your password. - {{< /tip >}} - -3. To add a data source, click **Add your first data source** and then do the following: - - Select **Prometheus**. - - For **HTTP URL**, enter `http://localhost:9090`. - - Click **Save & Test**. -4. To add a dashboard, open the menu and click **Create** and then **Import**. -5. Download the [Grafana dashboard for ArangoGraph](https://github.com/arangodb-managed/grafana-dashboards). -6. Copy the contents of the `main.json` file into the **Import via panel json** field in Grafana. -7. Click **Load**. diff --git a/site/content/3.10/arangograph/my-account.md b/site/content/3.10/arangograph/my-account.md deleted file mode 100644 index e79415060a..0000000000 --- a/site/content/3.10/arangograph/my-account.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: My Account in ArangoGraph -menuTitle: My Account -weight: 35 -description: >- - How to manage your user account, your organizations, and your API keys in ArangoGraph ---- -You can access information related to your account via the __User Toolbar__. -The toolbar is in the top right corner in the ArangoGraph dashboard and -accessible from every view. There are two elements: - -- __Question mark icon__: Help -- __User icon__: My Account - -![ArangoGraph My Account](../../images/arangograph-my-account.png) - -## Overview - -### How to view my account - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __Overview__ in the __My account__ section. -3. The __Overview__ displays your name, email address, company and when the - account was created. - -### How to edit the profile of my account - -1. Hover over or click the user icon in the __User Toolbar__ in the top right corner. -2. Click __Overview__ in the __My account__ section. -3. Click the __Edit__ button. -4. Change your personal information and __Save__. - -![ArangoGraph My Account Info](../../images/arangograph-my-account-info.png) - -## Organizations - -### How to view my organizations - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Your organizations are listed in a table. - Click the organization name or the eye icon in the __Actions__ column to - jump to the organization overview. - -### How to create a new organization - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Click the __New organization__ button. -4. Enter a name and and a description for the new organization and click the - __Create__ button. - -{{< info >}} -The free to try tier is limited to a single organization. -{{< /info >}} - -### How to delete an organization - -{{< danger >}} -Removing an organization implies the deletion of projects and deployments. -This operation cannot be undone and **all deployment data will be lost**. -Please proceed with caution. -{{< /danger >}} - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Click the __recycle bin__ icon in the __Actions__ column. -4. Enter `Delete!` to confirm and click __Yes__. - -{{< info >}} -If you are no longer a member of any organization, then a new organization is -created for you when you log in again. -{{< /info >}} - -![ArangoGraph New Organization](../../images/arangograph-new-org.png) - -## Invites - -Invitations are requests to join organizations. You can accept or reject -pending invites. - -### How to create invites - -See [Users and Groups: How to add a new member to the organization](organizations/users-and-groups.md#how-to-add-a-new-member-to-the-organization) - -### How to respond to my invites - -#### I am not a member of an organization yet - -1. Once invited, you will receive an email asking to join your - ArangoGraph organization. - ![ArangoGraph Organization Invite Email](../../images/arangograph-org-invite-email.png) -2. Click the __View my organization invite__ link in the email. You will be - asked to log in or to create a new account. -3. To sign up for a new account, click the __Start Free__ button or the - __Sign up__ link in the header navigation. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) -4. After successfully signing up, you will receive a verification email. -5. Click the __Verify my email address__ link in the email. It takes you back - to the ArangoGraph Insights Platform site. - ![ArangoGraph Organization Invite Email Verify](../../images/arangograph-org-invite-email-verify.png) -6. After successfully logging in, you can accept or reject the invite to - join your organization. - ![ArangoGraph Organization Invite](../../images/arangograph-org-invite.png) -7. After accepting the invite, you become a member of your organization and - will be granted access to the organization and its related projects and - deployments. - -#### I am already a member of an organization - -1. Once invited, you will receive an email asking to join your - ArangoGraph organization, as well as a notification in the ArangoGraph dashboard. -2. Click the __View my organization invites__ link in the email, or hover over the - user icon in the top right corner of the dashboard and click - __My organization invites__. - ![ArangoGraph Organization Invite Notification](../../images/arangograph-org-invite-notification.png) -3. On the __Invites__ tab of the __My account__ view, you can accept or reject - pending invitations, as well as see past invitations that you accepted or - rejected. Click the button with a checkmark icon to join the organization. - ![ArangoGraph Organization Invites Accept](../../images/arangograph-org-invites-accept.png) - -## API Keys - -API keys are authentication tokens intended to be used for scripting. -They allow a script to authenticate on behalf of a user. - -An API key consists of a key and a secret. You need both to complete -authentication. - -### How to view my API keys - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Information about the API keys are listed in the __My API keys__ section. - -![ArangoGraph My API keys](../../images/arangograph-my-api-keys.png) - -### How to create a new API key - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Click the __New API key__ button. -4. Optionally limit the API key to a specific organization. -5. Optionally specify after how many hours the API key should expire into the - __Time to live__ field. -6. Optionally limit the API key to read-only APIs -7. Click the __Create__ button. -8. Copy the API key ID and Secret, then click the __Close__ button. - -{{< security >}} -The secret is only shown once at creation time. -You have to store it in a safe place. -{{< /security >}} - -![ArangoGraph New API key](../../images/arangograph-new-api-key.png) - -![ArangoGraph API key Secret](../../images/arangograph-api-key-secret.png) - -### How to revoke or delete an API key - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Click an icon in the __Actions__ column: - - __Counter-clockwise arrow__ icon: Revoke API key - - __Recycle bin__ icon: Delete API key -4. Click the __Yes__ button to confirm. - -{{% comment %}} -TODO: Copy to clipboard button -Access token that should expire after 1 hour unless renewed, might get removed as it's confusing. -{{% /comment %}} diff --git a/site/content/3.10/arangograph/notebooks.md b/site/content/3.10/arangograph/notebooks.md deleted file mode 100644 index b581dc44d8..0000000000 --- a/site/content/3.10/arangograph/notebooks.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: ArangoGraph Notebooks -menuTitle: Notebooks -weight: 25 -description: >- - How to create and manage colocated Jupyter Notebooks within ArangoGraph ---- -{{< info >}} -This documentation describes the beta version of the Notebooks feature and is -subject to change. The beta version is free for all. -{{< /info >}} - -The ArangoGraph Notebook is a JupyterLab notebook embedded in the ArangoGraph -Insights Platform. The notebook integrates seamlessly with platform, -automatically connecting to ArangoGraph services, including ArangoDB and the -ArangoML platform services. This makes it much easier to leverage these -resources without having to download any data locally or to remember user IDs, -passwords, and endpoint URLs. - -![ArangoGraph Notebooks Architecture](../../images/arangograph-notebooks-architecture.png) - -The ArangoGraph Notebook has built-in [ArangoGraph Magic Commands](#arangograph-magic-commands) -that answer questions like: -- What ArangoDB database am I connected to at the moment? -- What data does the ArangoDB instance contain? -- How can I access certain documents? -- How do I create a graph? - -The ArangoGraph Notebook also pre-installs [python-arango](https://docs.python-arango.com/en/main/) -and ArangoML connectors -to [PyG](https://github.com/arangoml/pyg-adapter), -[DGL](https://github.com/arangoml/dgl-adapter), -[CuGraph](https://github.com/arangoml/cugraph-adapter), as well as the -[FastGraphML](https://github.com/arangoml/fastgraphml) -library, so you can get started -right away accessing data in ArangoDB to develop GraphML models using your -favorite GraphML libraries with GPUs. - -## How to create a new notebook - -1. Open the deployment in which you want to create the notebook. -2. Go to the **Data science** section and click the **Create Notebook** button. -3. Enter a name and optionally a description for your new notebook. -4. Select a configuration model from the dropdown menu. Click **Save**. -5. The notebook's phase is set to **Initializing**. Once the phase changes to - **Running**, the notebook's endpoint is accessible. -6. Click the **Open notebook** button to access your notebook. -7. To access your notebook, you need to be signed into ArangoGraph as a user with - the `notebook.notebook.execute` permission in your project. Organization - owners have this permission enabled by default. The `notebook-executor` role - which contains the permission can also be granted to other members of the - organization via roles. See how to create a - [role binding](security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy). - -{{< info >}} -Depending on the tier your organization belongs to, different limitations apply: -- On-Demand and Committed: you can create up to three notebooks per deployment. -- Free-to-try: you can only create one notebook per deployment. -{{< /info >}} - -![Notebooks](../../images/arangograph-notebooks.png) - -{{< info >}} -Notebooks in beta version have a fixed configuration of 10 GB of disk size. -{{< /info >}} - -## How to edit a notebook - -1. Select the notebook that you want to change from the **Notebooks** tab. -2. Click **Edit notebook**. You can modify its name and description. -3. To pause a notebook, click the **Pause notebook** button. You can resume it -at anytime. The notebook's phase is updated accordingly. - -## How to delete a notebook - -1. Select the notebook that you want to remove from the **Notebooks** tab. -2. Click the **Delete notebook** button. - -## Getting Started notebook - -To get a better understanding of how to interact with your ArangoDB database -cluster, use the ArangoGraph Getting Started template. -The ArangoGraph Notebook automatically connects to the ArangoDB service -endpoint, so you can immediately start interacting with it. - -1. Log in to the notebook you have created by using your deployment's root password. -2. Select the `GettingStarted.ipynb` template from the file browser. - -## ArangoGraph Magic Commands - -A list of the available magic commands you can interact with. -Single line commands have `%` prefix and multi-line commands have `%%` prefix. - -**Database Commands** - -- `%listDatabases` - lists the databases on the database server. -- `%whichDatabase` - returns the database name you are connected to. -- `%createDatabase databaseName` - creates a database. -- `%selectDatabase databaseName` - selects a database as the current database. -- `%useDatabase databasename` - uses a database as the current database; - alias for `%selectDatabase`. -- `%getDatabase databaseName` - gets a database. Used for assigning a database, - e.g. `studentDB` = `getDatabase student_database`. -- `%deleteDatabase databaseName` - deletes the database. - -**Graph Commands** - -- `%listGraphs` - lists the graphs defined in the currently selected database. -- `%whichGraph` - returns the graph name that is currently selected. -- `%createGraph graphName` - creates a named graph. -- `%selectGraph graphName` - selects the graph as the current graph. -- `%useGraph graphName` - uses the graph as the current graph; - alias for `%selectGraph`. -- `%getGraph graphName` - gets the graph for variable assignment, - e.g. `studentGraph` = `%getGraph student-graph`. -- `%deleteGraph graphName` - deletes a graph. - -**Collection Commands** - -- `%listCollections` - lists the collections on the selected current database. -- `%whichCollection` - returns the collection name that is currently selected. -- `%createCollection collectionName` - creates a collection. -- `%selectCollection collectionName` - selects a collection as the current collection. -- `%useCollection collectionName` - uses the collection as the current collection; - alias for `%selectCollection`. -- `%getCollection collectionName` - gets a collection for variable assignment, - e.g. `student` = `% getCollection Student`. -- `%createEdgeCollection` - creates an edge collection. -- `%createVertexCollection` - creates a vertex collection. -- `%createEdgeDefinition` - creates an edge definition. -- `%deleteCollection collectionName` - deletes the collection. -- `%truncateCollection collectionName` - truncates the collection. -- `%sampleCollection collectionName` - returns a random document from the collection. - If no collection is specified, then it uses the selected collection. - -**Document Commands** - -- `%insertDocument jsonDocument` - inserts the document into the currently selected collection. -- `%replaceDocument jsonDocument` - replaces the document in the currently selected collection. -- `%updateDocument jsonDocument` - updates the document in the currently selected collection. -- `%deleteDocument jsonDocument` - deletes the document from the currently selected collection. -- `%%importBulk jsonDocumentArray` - imports an array of documents into the currently selected collection. - -**AQL Commands** - -- `%aql single-line_aql_query` - executes a single line AQL query. -- `%%aqlm multi-line_aql_query` - executes a multi-line AQL query. - -**Variables** - -- `_endpoint` - the endpoint (URL) of the ArangoDB Server. -- `_system` - the system database used for creating, listing, and deleting databases. -- `_db` - the selected (current) database. To select a different database, use `%selectDatabase`. -- `_graph` - the selected (current) graph. To select a different graph, use `%selectGraph`. -- `_collection` - the selected (current) collection. To select a different collection, use `%selectCollection`. -- `_user` - the current user. - -You can use these variables directly, for example, `_db.collections()` to list -collections or `_system.databases` to list databases. - -You can also create your own variable assignments, such as: - -- `schoolDB` = `%getDatabase schoolDB` -- `school_graph` = `%getGraph school_graph` -- `student` = `%getCollection Student` - -**Reset environment** - -In the event that any of the above variables have been unintentionally changed, -you can revert all of them to the default state with `reset_environment()`. diff --git a/site/content/3.10/arangograph/organizations/_index.md b/site/content/3.10/arangograph/organizations/_index.md deleted file mode 100644 index 85ee2c7656..0000000000 --- a/site/content/3.10/arangograph/organizations/_index.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Organizations in ArangoGraph -menuTitle: Organizations -weight: 10 -description: >- - How to manage organizations and what type of packages ArangoGraph offers ---- -An ArangoGraph organizations is a container for projects. An organization -typically represents a (commercial) entity such as a company, a company division, -an institution, or a non-profit organization. - -**<u>Organizations</u> → Projects → Deployments** - -Users can be members of one or more organizations. However, you can only be a -member of one _Free-to-try_ tier organization at a time. - -## How to switch between my organizations - -1. The first entry in the main navigation (with a double arrow icon) indicates - the current organization. -2. Click it to bring up a dropdown menu to select another organization of which you - are a member. -3. The overview will open for the selected organization, showing the number of - projects, the tier and when it was created. - -![ArangoGraph Organization Switcher](../../../images/arangograph-organization-switcher.png) - -![ArangoGraph Organization Overview](../../../images/arangograph-organization-overview.png) - -## ArangoGraph Packages - -With the ArangoGraph Insights Platform, your organization can choose one of the -following packages. - -### Free Trial - -ArangoGraph comes with a free-to-try tier that lets you test ArangoGraph for -free for 14 days. You can get started quickly, without needing to enter a -credit card. - -The free trial gives you access to: -- One small deployment (4GB) in a region of your choice for 14 days -- Local backups -- One ArangoGraph Notebook for learning and data science - -After the trial period, your deployment will be deleted automatically. - -### On-Demand - -Add a payment payment method to gain access to ArangoGraph's full feature set. -Pay monthly via a credit card for what you actually use. - -This package unlocks all ArangoGraph functionality, including: -- Multiple and larger deployments -- Backups to cloud storage, with multi-region support -- Enhanced security features such as Private Endpoints - -### Committed - -Commit up-front for a year and pay via the Sales team. This package provides -the same flexibility of On-Demand, but at a lower price. - -In addition, you gain access to: -- 24/7 Premium Support -- ArangoDB Professional Services Engagements -- Ability to transact via the AWS and GCP marketplaces - -To take advantage of this, you need to get in touch with the ArangoDB -team. [Contact us](https://www.arangodb.com/contact/) for more details. - -## How to unlock all features - -You can unlock all features in ArangoGraph at any time by adding your billing -details and a payment method. As soon as you have added a payment method, all -ArangoGraph functionalities are immediately unlocked. From that point on, your -deployments will no longer expire and you can create more and larger deployments. - -See [Billing: How to add billing details / payment methods](billing.md) - -![ArangoGraph Billing](../../../images/arangograph-billing.png) - -## How to create a new organization - -See [My Account: How to create a new organization](../my-account.md#how-to-create-a-new-organization) - -## How to restrict access to an organization - -If you want to restrict access to an organization, you can do it by specifying which authentication providers are accepted for users trying to access the organization. For more information, refer to the [Access Control](../security-and-access-control/_index.md#restricting-access-to-organizations) section. - -## How to delete the current organization - -{{< danger >}} -Removing an organization implies the deletion of projects and deployments. -This operation cannot be undone and **all deployment data will be lost**. -Please proceed with caution. -{{< /danger >}} - -1. Click **Overview** in the **Organization** section of the main navigation. -2. Open the **Danger zone** tab. -3. Click the **Delete organization** button. -4. Enter `Delete!` to confirm and click **Yes**. - -{{< info >}} -If you are no longer a member of any organization, then a new organization is -created for you when you log in again. -{{< /info >}} - -{{< tip >}} -If the organization has a locked resource (a project or a deployment), you need to [unlock](../security-and-access-control/_index.md#locked-resources) -that resource first to be able to delete the organization. -{{< /tip >}} diff --git a/site/content/3.10/arangograph/organizations/billing.md b/site/content/3.10/arangograph/organizations/billing.md deleted file mode 100644 index 9b892b5500..0000000000 --- a/site/content/3.10/arangograph/organizations/billing.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Billing in ArangoGraph -menuTitle: Billing -weight: 10 -description: >- - How to manage billing details and payment methods in ArangoGraph ---- -## How to add billing details - -1. In the main navigation menu, click the **Organization** icon. -2. Click **Billing** in the **Organization** section. -3. In the **Billing Details** section, click **Edit**. -4. Enter your company name, billing address, and EU VAT identification number (if applicable). -5. Optionally, enter the email address(es) to which invoices should be emailed - to automatically. -6. Click **Save**. - -![ArangoGraph Billing Details](../../../images/arangograph-billing-details.png) - -## How to add a payment method - -1. In the main navigation menu, click the **Organization** icon. -2. Click **Billing** in the **Organization** section. -3. In the **Payment methods** section, click **Add**. -4. Fill out the form with your credit card details. Currently, a credit card is the only available payment method. -5. Click **Save**. - -![ArangoGraph Payment Method](../../../images/arangograph-add-payment-method-credit-card.png) - -{{% comment %}} -TODO: Need screenshot with invoice - -### How to view invoices - - -{{% /comment %}} diff --git a/site/content/3.10/arangograph/security-and-access-control/_index.md b/site/content/3.10/arangograph/security-and-access-control/_index.md deleted file mode 100644 index 27742b57b3..0000000000 --- a/site/content/3.10/arangograph/security-and-access-control/_index.md +++ /dev/null @@ -1,698 +0,0 @@ ---- -title: Security and access control in ArangoGraph -menuTitle: Security and Access Control -weight: 45 -description: >- - This guide explains which access control concepts are available in - ArangoGraph and how to use them ---- -The ArangoGraph Insights Platform has a structured set of resources that are subject to security and -access control: - -- Organizations -- Projects -- Deployments - -For each of these resources, you can perform various operations. -For example, you can create a project in an organization and create a deployment -inside a project. - -## Locked resources - -In ArangoGraph, you can lock the resources to prevent accidental deletion. When -a resource is locked, it cannot be deleted and must be unlocked first. - -The hierarchical structure of the resources (organization-project-deployment) -is used in the locking functionality: if a child resource is locked -(for example, a deployment), you cannot delete the parent project without -unlocking that deployment first. - -{{< info >}} -If you lock a backup policy of a deployment or an IP allowlist, CA certificate, -and IAM provider of a project, it is still possible to delete -the corresponding parent resource without unlocking those properties first. -{{< /info >}} - -## Policy - -Various actions in ArangoGraph require different permissions, which can be -granted to users via **roles**. - -The association of a member with a role is called a **role binding**. -All role bindings of a resource comprise a **policy**. - -Roles can be bound on an organization, project, and deployment level (listed in -the high to low level order, with lower levels inheriting permissions from their -parents). This means that there is a unique policy per resource (an organization, -a project, or a deployment). - -For example, an organization has exactly one policy, -which binds roles to members of the organization. These bindings are used to -give the users permissions to perform operations in this organization. -This is useful when, as an organization owner, you need to extend the permissions -for an organization member. - -{{< info >}} -Permissions linked to predefined roles vary between organization owners and -organization members. If you need to extend permissions for an organization -member, you can create a new role binding. The complete list of roles and -their respective permissions for both organization owners and members can be -viewed on the **Policy** page of an organization within the ArangoGraph dashboard. -{{< /info >}} - -### How to view, edit, or remove role bindings of a policy - -Decide whether you want to edit the policy for an organization, a project, -or a deployment: - -- **Organization**: In the main navigation, click the __Organization__ icon and - then click __Policy__. -- **Project**: In the main navigation, click the __Dashboard__ icon, then click - __Projects__, click the name of the desired project, and finally click __Policy__. -- **Deployment**: In the main navigation, click the __Dashboard__ icon, then - click __Deployments__, click the name of the desired deployment, and finally - click __Policy__. - -To delete a role binding, click the **Recycle Bin** icon in the **Actions** column. - -{{< info >}} -Currently, you cannot edit a role binding, you can only delete it. -{{< /info >}} - -![ArangoGraph Project Policy](../../../images/arangograph-policy-page.png) - -### How to add a role binding to a policy - -1. Navigate to the **Policy** tab of an organization, a project or a deployment. -2. Click the **New role binding** button. -3. Select one or more users and/or groups. -4. Select one or more roles you want to assign to the specified members. -5. Click **Create**. - -![ArangoGraph New Role Binding](../../../images/arangograph-new-policy-role-binding.png) - -## Roles - -Operations on resources in ArangoGraph require zero (just an authentication) or -more permissions. Since the -number of permissions is large and very detailed, it is not practical to assign -permissions directly to users. Instead, ArangoGraph uses **roles**. - -A role is a set of permissions. Roles can be bound to groups (preferably) -or individual users. You can create such bindings for the respective organization, -project, or deployment policy. - -There are predefined roles, but you can also create custom ones. - -![ArangoGraph Roles](../../../images/arangograph-access-control-roles.png) - -### Predefined roles - -Predefined roles are created by ArangoGraph and group related permissions together. -An example of a predefined role is `deployment-viewer`. This role -contains all permissions needed to view deployments in a project. - -Predefined roles cannot be deleted. Note that permissions linked to predefined -roles vary between organization owners and organization members. - -{{% comment %}} -Command to generate below list with (Git)Bash: - -export OASIS_TOKEN='<TOKEN>' -./oasisctl list roles --organization-id <ID> --format json | jq -r '.[] | select(.predefined == true) | "**\(.description)** (`\(.id)`):\n\(.permissions | split(", ") | map("- `\(.)`\n") | join(""))"' -{{% /comment %}} - -{{< details summary="List of predefined roles and their permissions" >}} - -{{</* tip */>}} -The roles below are described following this pattern: - -**Role description** (`role ID`): -- `Permission` -{{</* /tip */>}} - -**Audit Log Admin** (`auditlog-admin`): -- `audit.auditlog.create` -- `audit.auditlog.delete` -- `audit.auditlog.get` -- `audit.auditlog.list` -- `audit.auditlog.set-default` -- `audit.auditlog.test-https-post-destination` -- `audit.auditlog.update` - -**Audit Log Archive Admin** (`auditlog-archive-admin`): -- `audit.auditlogarchive.delete` -- `audit.auditlogarchive.get` -- `audit.auditlogarchive.list` - -**Audit Log Archive Viewer** (`auditlog-archive-viewer`): -- `audit.auditlogarchive.get` -- `audit.auditlogarchive.list` - -**Audit Log Attachment Admin** (`auditlog-attachment-admin`): -- `audit.auditlogattachment.create` -- `audit.auditlogattachment.delete` -- `audit.auditlogattachment.get` - -**Audit Log Attachment Viewer** (`auditlog-attachment-viewer`): -- `audit.auditlogattachment.get` - -**Audit Log Event Admin** (`auditlog-event-admin`): -- `audit.auditlogevent.delete` -- `audit.auditlogevents.get` - -**Audit Log Event Viewer** (`auditlog-event-viewer`): -- `audit.auditlogevents.get` - -**Audit Log Viewer** (`auditlog-viewer`): -- `audit.auditlog.get` -- `audit.auditlog.list` - -**Backup Administrator** (`backup-admin`): -- `backup.backup.copy` -- `backup.backup.create` -- `backup.backup.delete` -- `backup.backup.download` -- `backup.backup.get` -- `backup.backup.list` -- `backup.backup.restore` -- `backup.backup.update` -- `backup.feature.get` -- `data.deployment.restore-backup` - -**Backup Viewer** (`backup-viewer`): -- `backup.backup.get` -- `backup.backup.list` -- `backup.feature.get` - -**Backup Policy Administrator** (`backuppolicy-admin`): -- `backup.backuppolicy.create` -- `backup.backuppolicy.delete` -- `backup.backuppolicy.get` -- `backup.backuppolicy.list` -- `backup.backuppolicy.update` -- `backup.feature.get` - -**Backup Policy Viewer** (`backuppolicy-viewer`): -- `backup.backuppolicy.get` -- `backup.backuppolicy.list` -- `backup.feature.get` - -**Billing Administrator** (`billing-admin`): -- `billing.config.get` -- `billing.config.set` -- `billing.invoice.get` -- `billing.invoice.get-preliminary` -- `billing.invoice.get-statistics` -- `billing.invoice.list` -- `billing.organization.get` -- `billing.paymentmethod.create` -- `billing.paymentmethod.delete` -- `billing.paymentmethod.get` -- `billing.paymentmethod.get-default` -- `billing.paymentmethod.list` -- `billing.paymentmethod.set-default` -- `billing.paymentmethod.update` -- `billing.paymentprovider.list` - -**Billing Viewer** (`billing-viewer`): -- `billing.config.get` -- `billing.invoice.get` -- `billing.invoice.get-preliminary` -- `billing.invoice.get-statistics` -- `billing.invoice.list` -- `billing.organization.get` -- `billing.paymentmethod.get` -- `billing.paymentmethod.get-default` -- `billing.paymentmethod.list` -- `billing.paymentprovider.list` - -**CA Certificate Administrator** (`cacertificate-admin`): -- `crypto.cacertificate.create` -- `crypto.cacertificate.delete` -- `crypto.cacertificate.get` -- `crypto.cacertificate.list` -- `crypto.cacertificate.set-default` -- `crypto.cacertificate.update` - -**CA Certificate Viewer** (`cacertificate-viewer`): -- `crypto.cacertificate.get` -- `crypto.cacertificate.list` - -**Dataloader Administrator** (`dataloader-admin`): -- `dataloader.deployment.import` - -**Deployment Administrator** (`deployment-admin`): -- `data.cpusize.list` -- `data.deployment.create` -- `data.deployment.create-test-database` -- `data.deployment.delete` -- `data.deployment.get` -- `data.deployment.list` -- `data.deployment.pause` -- `data.deployment.rebalance-shards` -- `data.deployment.resume` -- `data.deployment.rotate-server` -- `data.deployment.update` -- `data.deployment.update-scheduled-root-password-rotation` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.logs.get` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Content Administrator** (`deployment-content-admin`): -- `data.cpusize.list` -- `data.deployment.create-test-database` -- `data.deployment.get` -- `data.deployment.list` -- `data.deploymentcredentials.get` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.logs.get` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Full Access User** (`deployment-full-access-user`): -- `data.deployment.full-access` - -**Deployment Read Only User** (`deployment-read-only-user`): -- `data.deployment.read-only-access` - -**Deployment Viewer** (`deployment-viewer`): -- `data.cpusize.list` -- `data.deployment.get` -- `data.deployment.list` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Profile Viewer** (`deploymentprofile-viewer`): -- `deploymentprofile.deploymentprofile.list` - -**Example Datasets Viewer** (`exampledataset-viewer`): -- `example.exampledataset.get` -- `example.exampledataset.list` - -**Example Dataset Installation Administrator** (`exampledatasetinstallation-admin`): -- `example.exampledatasetinstallation.create` -- `example.exampledatasetinstallation.delete` -- `example.exampledatasetinstallation.get` -- `example.exampledatasetinstallation.list` -- `example.exampledatasetinstallation.update` - -**Example Dataset Installation Viewer** (`exampledatasetinstallation-viewer`): -- `example.exampledatasetinstallation.get` -- `example.exampledatasetinstallation.list` - -**Group Administrator** (`group-admin`): -- `iam.group.create` -- `iam.group.delete` -- `iam.group.get` -- `iam.group.list` -- `iam.group.update` - -**Group Viewer** (`group-viewer`): -- `iam.group.get` -- `iam.group.list` - -**IAM provider Administrator** (`iamprovider-admin`): -- `security.iamprovider.create` -- `security.iamprovider.delete` -- `security.iamprovider.get` -- `security.iamprovider.list` -- `security.iamprovider.set-default` -- `security.iamprovider.update` - -**IAM provider Viewer** (`iamprovider-viewer`): -- `security.iamprovider.get` -- `security.iamprovider.list` - -**IP allowlist Administrator** (`ipwhitelist-admin`): -- `security.ipallowlist.create` -- `security.ipallowlist.delete` -- `security.ipallowlist.get` -- `security.ipallowlist.list` -- `security.ipallowlist.update` - -**IP allowlist Viewer** (`ipwhitelist-viewer`): -- `security.ipallowlist.get` -- `security.ipallowlist.list` - -**Metrics Administrator** (`metrics-admin`): -- `metrics.endpoint.get` -- `metrics.token.create` -- `metrics.token.delete` -- `metrics.token.get` -- `metrics.token.list` -- `metrics.token.revoke` -- `metrics.token.update` - -**Migration Administrator** (`migration-admin`): -- `replication.deploymentmigration.create` -- `replication.deploymentmigration.delete` -- `replication.deploymentmigration.get` - -**MLServices Admin** (`mlservices-admin`): -- `ml.mlservices.get` - -**Notebook Administrator** (`notebook-admin`): -- `notebook.model.list` -- `notebook.notebook.create` -- `notebook.notebook.delete` -- `notebook.notebook.get` -- `notebook.notebook.list` -- `notebook.notebook.pause` -- `notebook.notebook.resume` -- `notebook.notebook.update` - -**Notebook Executor** (`notebook-executor`): -- `notebook.notebook.execute` - -**Notebook Viewer** (`notebook-viewer`): -- `notebook.model.list` -- `notebook.notebook.get` -- `notebook.notebook.list` - -**Organization Administrator** (`organization-admin`): -- `billing.organization.get` -- `resourcemanager.organization-invite.create` -- `resourcemanager.organization-invite.delete` -- `resourcemanager.organization-invite.get` -- `resourcemanager.organization-invite.list` -- `resourcemanager.organization-invite.update` -- `resourcemanager.organization.delete` -- `resourcemanager.organization.get` -- `resourcemanager.organization.update` - -**Organization Viewer** (`organization-viewer`): -- `billing.organization.get` -- `resourcemanager.organization-invite.get` -- `resourcemanager.organization-invite.list` -- `resourcemanager.organization.get` - -**Policy Administrator** (`policy-admin`): -- `iam.policy.get` -- `iam.policy.update` - -**Policy Viewer** (`policy-viewer`): -- `iam.policy.get` - -**Prepaid Deployment Viewer** (`prepaid-deployment-viewer`): -- `prepaid.prepaiddeployment.get` -- `prepaid.prepaiddeployment.list` - -**Private Endpoint Service Administrator** (`privateendpointservice-admin`): -- `network.privateendpointservice.create` -- `network.privateendpointservice.get` -- `network.privateendpointservice.get-by-deployment-id` -- `network.privateendpointservice.get-feature` -- `network.privateendpointservice.update` - -**Private Endpoint Service Viewer** (`privateendpointservice-viewer`): -- `network.privateendpointservice.get` -- `network.privateendpointservice.get-by-deployment-id` -- `network.privateendpointservice.get-feature` - -**Project Administrator** (`project-admin`): -- `resourcemanager.project.create` -- `resourcemanager.project.delete` -- `resourcemanager.project.get` -- `resourcemanager.project.list` -- `resourcemanager.project.update` - -**Project Viewer** (`project-viewer`): -- `resourcemanager.project.get` -- `resourcemanager.project.list` - -**Replication Administrator** (`replication-admin`): -- `replication.deployment.clone-from-backup` -- `replication.deploymentreplication.get` -- `replication.deploymentreplication.update` -- `replication.migration-forwarder.upgrade-connection` - -**Role Administrator** (`role-admin`): -- `iam.role.create` -- `iam.role.delete` -- `iam.role.get` -- `iam.role.list` -- `iam.role.update` - -**Role Viewer** (`role-viewer`): -- `iam.role.get` -- `iam.role.list` - -**SCIM Administrator** (`scim-admin`): -- `scim.user.add` -- `scim.user.delete` -- `scim.user.get` -- `scim.user.list` -- `scim.user.update` - -**User Administrator** (`user-admin`): -- `iam.user.get-personal-data` -- `iam.user.update` - -{{< /details >}} - -### How to create a custom role - -1. In the main navigation menu, click **Access Control**. -2. On the **Roles** tab, click **New role**. -3. Enter a name and optionally a description for the new role. -4. Select the required permissions. -5. Click **Create**. - -![ArangoGraph New Role](../../../images/arangograph-create-role.png) - -### How to view, edit or remove a custom role - -1. In the main navigation menu, click **Access Control**. -2. On the **Roles** tab, click: - - A role name or the **eye** icon in the **Actions** column to view the role. - - The **pencil** icon in the **Actions** column to edit the role. - You can also view a role and click the **Edit** button in the detail view. - - The **recycle bin** icon to delete the role. - You can also view a role and click the **Delete** button in the detail view. - -## Permissions - -Each operation done on a resource requires zero (just authentication) or more **permissions**. -A permission is a constant string such as `resourcemanager.project.create`, -following this schema: `<api>.<kind>.<verb>`. - -Permissions are solely defined by the ArangoGraph API. - -{{% comment %}} -Retrieved with the below command, with manual adjustments: -oasisctl list permissions - -Note that if the tier is "internal", there is an `internal-dashboard` API that should be excluded in below list! -{{% /comment %}} - -| API | Kind | Verbs -|:--------------------|:-----------------------------|:------------------------------------------- -| `audit` | `auditlogarchive` | `delete`, `get`, `list` -| `audit` | `auditlogattachment` | `create`, `delete`, `get` -| `audit` | `auditlogevents` | `get` -| `audit` | `auditlogevent` | `delete` -| `audit` | `auditlog` | `create`, `delete`, `get`, `list`, `set-default`, `test-https-post-destination`, `update` -| `backup` | `backuppolicy` | `create`, `delete`, `get`, `list`, `update` -| `backup` | `backup` | `copy`, `create`, `delete`, `download`, `get`, `list`, `restore`, `update` -| `backup` | `feature` | `get` -| `billing` | `config` | `get`, `set` -| `billing` | `invoice` | `get`, `get-preliminary`, `get-statistics`, `list` -| `billing` | `organization` | `get` -| `billing` | `paymentmethod` | `create`, `delete`, `get`, `get-default`, `list`, `set-default`, `update` -| `billing` | `paymentprovider` | `list` -| `crypto` | `cacertificate` | `create`, `delete`, `get`, `list`, `set-default`, `update` -| `dataloader` | `deployment` | `import` -| `data` | `cpusize` | `list` -| `data` | `deploymentcredentials` | `get` -| `data` | `deploymentfeatures` | `get` -| `data` | `deploymentmodel` | `list` -| `data` | `deploymentprice` | `calculate` -| `data` | `deployment` | `create`, `create-test-database`, `delete`, `full-access`, `get`, `list`, `pause`, `read-only-access`, `rebalance-shards`, `restore-backup`, `resume`, `rotate-server`, `update`, `update-scheduled-root-password-rotation` -| `data` | `diskperformance` | `list` -| `data` | `limits` | `get` -| `data` | `nodesize` | `list` -| `data` | `presets` | `list` -| `deploymentprofile` | `deploymentprofile` | `list` -| `example` | `exampledatasetinstallation` | `create`, `delete`, `get`, `list`, `update` -| `example` | `exampledataset` | `get`, `list` -| `iam` | `group` | `create`, `delete`, `get`, `list`, `update` -| `iam` | `policy` | `get`, `update` -| `iam` | `role` | `create`, `delete`, `get`, `list`, `update` -| `iam` | `user` | `get-personal-data`, `update` -| `metrics` | `endpoint` | `get` -| `metrics` | `token` | `create`, `delete`, `get`, `list`, `revoke`, `update` -| `ml` | `mlservices` | `get` -| `monitoring` | `logs` | `get` -| `monitoring` | `metrics` | `get` -| `network` | `privateendpointservice` | `create`, `get`, `get-by-deployment-id`, `get-feature`, `update` -| `notebook` | `model` | `list` -| `notebook` | `notebook` | `create`, `delete`, `execute`, `get`, `list`, `pause`, `resume`, `update` -| `notification` | `deployment-notification` | `list`, `mark-as-read`, `mark-as-unread` -| `prepaid` | `prepaiddeployment` | `get`, `list` -| `replication` | `deploymentmigration` | `create`, `delete`, `get` -| `replication` | `deploymentreplication` | `get`, `update` -| `replication` | `deployment` | `clone-from-backup` -| `replication` | `migration-forwarder` | `upgrade-connection` -| `resourcemanager` | `organization-invite` | `create`, `delete`, `get`, `list`, `update` -| `resourcemanager` | `organization` | `delete`, `get`, `update` -| `resourcemanager` | `project` | `create`, `delete`, `get`, `list`, `update` -| `scim` | `user` | `add`, `delete`, `get`, `list`, `update` -| `security` | `iamprovider` | `create`, `delete`, `get`, `list`, `set-default`, `update` -| `security` | `ipallowlist` | `create`, `delete`, `get`, `list`, `update` - -### Permission inheritance - -Each resource (organization, project, deployment) has its own policy, but this does not mean that you have to -repeat role bindings in all these policies. - -Once you assign a role to a user (or group of users) in a policy at one level, -all the permissions of this role are inherited in lower levels - -permissions are inherited downwards from an organization to its projects and -from a project to its deployments. - -For more general permissions, which you want to be propagated to other levels, -add a role for a user/group at the organization level. -For example, if you bind the `deployment-viewer` role to user `John` in the -organization policy, `John` will have the role permissions in all projects of -that organization and all deployments of the projects. - -For more restrictive permissions, which you don't necessarily want to be -propagated to other levels, add a role at the project or even deployment level. -For example, if you bind the `deployment-viewer` role to user `John` -in a project, `John` will have the role permissions in -this project as well as in all the deployments of it, but not -in other projects of the parent organization. - -**Inheritance example** - -- Let's assume you have a group called "Deployers" which includes users who deal with deployments. -- Then you create a role "Deployment Viewer", containing - `data.deployment.get` and `data.deployment.list` permissions. -- You can now add a role binding of the "Deployers" group to the "Deployment Viewer" role. -- If you add the binding to an organization policy, members of this group - will be granted the defined permissions for the organization, all its projects and all its deployments. -- If you add the role binding to a policy of project ABC, members of this group will be granted - the defined permissions for project ABC only and its deployments, but not for - other projects and their deployments. -- If you add the role binding to a policy of deployment X, members of this - group will be granted the defined permissions for deployment X only, and not - any other deployment of the parent project or any other project of the organization. - -The "Deployment Viewer" role is effective for the following entities depending -on which policy the binding is added to: - -Role binding added to →<br>Role effective on ↓ | Organization policy | Project ABC's policy | Deployment X's policy of project ABC | -|:---:|:---:|:---:|:---:| -Organization, its projects and deployments | ✓ | — | — -Project ABC and its deployments | ✓ | ✓ | — -Project DEF and its deployments | ✓ | — | — -Deployment X of project ABC | ✓ | ✓ | ✓ -Deployment Y of project ABC | ✓ | ✓ | — -Deployment Z of project DEF | ✓ | — | — - -## Restricting access to organizations - -To enhance security, you can implement the following restrictions via [Oasisctl](../oasisctl/_index.md): - -1. Limit allowed authentication providers. -2. Specify an allowed domain list. - -{{< info >}} -Note that users who do not meet the restrictions will not be granted permissions for any resource in -the organization. These users can still be members of the organization. -{{< /info >}} - -Using the first option, you can limit which **authentication providers** are -accepted for users trying to access an organization in ArangoGraph. -The following commands are available to configure this option: - -- `oasisctl get organization authentication providers` - allows you to see which - authentication providers are enabled for accessing a specific organization -- `oasisctl update organization authentication providers` - allows you to update - a list of authentication providers for an organization to which the - authenticated user has access - - `--enable-github` - if set, allow access from user accounts authenticated via Github - - `--enable-google` - if set, allow access from user accounts authenticated via Google - - `--enable-username-password` - if set, allow access from user accounts - authenticated via a username/password - -Using the second option, you can configure a **list of domains**, and only users -with email addresses from the specified domains will be able to access an -organization. The following commands are available to configure this option: - -- `oasisctl get organization email domain restrictions -o <your_organization_id>` - - allows you to see which domains are in the allowed list for a specific organization -- `oasisctl update organization email domain restrictions -o <your_organization_id> --allowed-domain=<domain_name1> --allowed-domain=<domain_name2>` - - allows you to update a list of the allowed domains for a specific organization -- `oasisctl update organization email domain restrictions -o <your_organization_id> --allowed-domain=` - - allows you to reset a list and accept any domains for accessing a specific organization - -## Using an audit log - -{{< info >}} -To enable the audit log feature, get in touch with the ArangoGraph team via **Request Help**, available in the left sidebar menu of the ArangoGraph Dashboard. -{{< /info >}} - -To have a better overview of the events happening in your ArangoGraph organization, -you can set up an audit log, which will track and log auditing information for you. -The audit log is created on the organization level, then you can use the log for -projects belonging to that organization. - -***To create an audit log*** - -1. In the main navigation menu, click **Access Control** in the **Organization** section. -2. Open the **Audit logs** tab and click the **New audit log** button. -3. In the dialog, fill out the following settings: - - - **Name** - enter a name for your audit log. - - **Description** - enter an optional description for your audit log. - - **Destinations** - specify one or several destinations to which you want to - upload the audit log. If you choose **Upload to cloud**, the log will be - available on the **Audit logs** tab of your organization. To send the log - entries to your custom destination, specify a destination URL with - authentication parameters (the **HTTP destination** option). - - {{< info >}} - The **Upload to cloud** option is not available for the free-to-try tier. - {{< /info >}} - - - **Excluded topics** - select topics that will not be included in the log. - Please note, that some are excluded by default (for example, `audit-document`). - - {{< warning >}} - Enabling the audit log for all events will have a negative impact on performance. - {{< /warning >}} - - - **Confirmation** - confirm that logging auditing events increases the price of your deployments. - - ![ArangoGraph audit log](../../../images/arangograph-audit-log.png) - -4. Click **Create** to add the audit log. You can now use it in the projects - belonging to your organization. diff --git a/site/content/3.10/arangograph/security-and-access-control/single-sign-on/_index.md b/site/content/3.10/arangograph/security-and-access-control/single-sign-on/_index.md deleted file mode 100644 index 1144d59ebd..0000000000 --- a/site/content/3.10/arangograph/security-and-access-control/single-sign-on/_index.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Single Sign-On (SSO) in ArangoGraph -menuTitle: Single Sign-On -weight: 10 -description: >- - ArangoGraph supports **Single Sign-On** (SSO) authentication using - **Security Assertion Markup language 2.0** (SAML 2.0) ---- -{{< info >}} -To enable the Single Sign-On (SSO) feature, get in touch with the ArangoGraph -team via **Request Help**, available in the left sidebar menu of the -ArangoGraph Dashboard. -{{< /info >}} - -## About SAML 2.0 - -The Security Assertion Markup language 2.0 (SAML 2.0) is an open standard created -to provide cross-domain single sign-on (SSO). It allows you to authenticate in -multiple web applications by using a single set of login credentials. - -SAML SSO works by transferring user authentication data from the identity -provider (IdP) to the service provider (SP) through an exchange of digitally -signed XML documents. - -## Configure SAML 2.0 using Okta - -You can enable SSO for your ArangoGraph organization using Okta as an Identity -Provider (IdP). For more information about Okta, please refer to the -[Okta Documentation](https://help.okta.com/en-us/Content/index.htm?cshid=csh-index). - -### Create the SAML app integration in Okta - -1. Sign in to your Okta account and select **Applications** from the left sidebar menu. -2. Click **Create App Integration**. -3. In the **Create a new app integration** dialog, select **SAML 2.0**. - - ![ArangoGraph Create Okta App Integration](../../../../images/arangograph-okta-create-integration.png) -4. In the **General Settings**, specify a name for your integration and click **Next**. - - ![ArangoGraph Okta Integration Name](../../../../images/arangograph-okta-integration-name.png) -5. Configure the SAML settings: - - For **Single sign-on URL**, use `https://auth.arangodb.com/login/callback?connection=ORG_ID` - - For **Audience URI (SP Entity ID)**, use `urn:auth0:arangodb:ORG_ID` - - ![ArangoGraph Okta SAML General Settings](../../../../images/arangograph-okta-saml-general-settings.png) - -6. Replace **ORG_ID** with your organization identifier from the - ArangoGraph Dashboard. To find your organization ID, go to the **User Toolbar** - in the top right corner, which is accessible from every view of the Dashboard, - and click **My organizations**. - - If, for example, your organization ID is 14587062, here are the values you - would use when configuring the SAML settings: - - `https://auth.arangodb.com/login/callback?connection=14587062` - - `urn:auth0:arangodb:14587062` - - ![ArangoGraph Organization ID](../../../../images/arangograph-organization-id.png) -7. In the **Attribute Statements** section, add custom attributes as seen in the image below: - - email: `user.email` - - given_name: `user.firstName` - - family_name: `user.lastName` - - picture: `user.profileUrl` - - This step consists of a mapping between the ArangoGraph attribute names and - Okta attribute names. The values of these attributes are automatically filled - in based on the users list that is defined in Okta. - - ![ArangoGraph Okta SAML Attributes](../../../../images/arangograph-okta-saml-attributes.png) -8. Click **Next**. -9. In the **Configure feedback** section, select **I'm an Okta customer adding an internal app**. -10. Click **Finish**. The SAML app integration is now created. - -### SAML Setup - -After creating the app integration, you must perform the SAML setup to finalize -the SSO configuration. - -1. Go to the **SAML Signing Certificates** section, displayed under the **Sign On** tab. -2. Click **View SAML setup instructions**. - - ![ArangoGraph Okta SAML Setup](../../../../images/arangograph-okta-saml-setup.png) -3. The setup instructions include the following items: - - **Identity Provider Single Sign-On URL** - - **Identity Provider Issuer** - - **X.509 Certificate** -4. Copy the IdP settings, download the certificate using the - **Download X.509 certificate** button, and share them with the ArangoGraph - team via an ArangoGraph Support Ticket in order to complete the SSO - configuration. - -{{< info >}} -If you would like to enable SCIM provisioning in addition to the SSO SAML -configuration, please refer to the [SCIM](scim-provisioning.md) documentation. -{{< /info >}} diff --git a/site/content/3.10/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md b/site/content/3.10/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md deleted file mode 100644 index 8cf40b8009..0000000000 --- a/site/content/3.10/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: SCIM Provisioning -menuTitle: SCIM Provisioning -weight: 5 -description: >- - How to enable SCIM provisioning with Okta for your ArangoGraph project ---- -ArangoGraph provides support to control and manage members access in -ArangoGraph organizations with the -**System for Cross-domain Identity Management** (SCIM) provisioning. -This enables you to propagate to ArangoGraph any user access changes by using -the dedicated API. - -{{< info >}} -To enable the SCIM feature, get in touch with the ArangoGraph team via -**Request Help**, available in the left sidebar menu of the ArangoGraph Dashboard. -{{< /info >}} - -## About SCIM - -[SCIM](https://www.rfc-editor.org/rfc/rfc7644), or the System -for Cross-domain Identity Management [specification](http://www.simplecloud.info/), -is an open standard designed to manage user identity information. -SCIM provides a defined schema for representing users, and a RESTful -API to run CRUD operations on these user resources. - -The SCIM specification expects the following operations so that the SSO system -can sync the information about user resources in real time: - -- `GET /Users` - List all users. -- `GET /Users/:user_id` - Get details for a given user ID. -- `POST /Users` - Invite a new user to ArangoGraph. -- `PUT /Users/:user_id` - Update a given user ID. -- `DELETE /Users/:user_id` - Delete a specified user ID. - -ArangoGraph organization administrators can generate an API key for a specific organization. -The API token consists of a key and a secret. Using this key and secret as the -Basic Authentication Header (Basic Auth) in SCIM provisioning, you can access the APIs and -manage the user resources. - -To learn how to generate a new API key in the ArangoGraph Dashboard, see the -[API Keys](../../my-account.md#api-keys) section. - -{{< info >}} -When creating an API key, it is required to select an organization from the -list. -{{< /info >}} - -## Enable SCIM provisioning in Okta - -To enable SCIM provisioning, you first need to create an SSO integration that -supports the SCIM provisioning feature. - -1. To enable SCIM provisioning for your integration, go to the **General** tab. -2. In the **App Settings** section, select **Enable SCIM provisioning**. -3. Navigate to the **Provisioning** tab. The SCIM connection settings are - displayed under **Settings > Integration**. -4. Fill in the following fields: - - For **SCIM connector base URL**, use `https://dashboard.arangodb.cloud/api/scim/v1` - - For **Unique identifier field for users**, use `userName` -5. For **Supported provisioning actions**, enable the following: - - **Import New Users and Profile Updates** - - **Push New Users** - - **Push Profile Updates** -6. From the **Authentication Mode** menu, select the **Basic Auth** option. - To authenticate using this mode, you need to provide the username and password - for the account that handles the SCIM actions - in this case ArangoGraph. -7. Go to the ArangoGraph Dashboard and create a new API key ID and Secret. - - ![ArangoGraph Create new API key](../../../../images/arangograph-okta-api-key.png) - - Make sure to select one organization from the list and do not set any - value in the **Time to live** field. For more information, - see [How to create a new API key](../../my-account.md#how-to-create-a-new-api-key). -8. Use these authentication tokens as username and password when using the - **Basic Auth** mode and click **Save**. diff --git a/site/content/3.10/arangograph/security-and-access-control/x-509-certificates.md b/site/content/3.10/arangograph/security-and-access-control/x-509-certificates.md deleted file mode 100644 index 1ef13ef4e0..0000000000 --- a/site/content/3.10/arangograph/security-and-access-control/x-509-certificates.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: X.509 Certificates in ArangoGraph -menuTitle: X.509 Certificates -weight: 5 -description: >- - X.509 certificates in ArangoGraph are utilized for encrypted remote administration. - The communication with and between the servers of an ArangoGraph deployment is - encrypted using the TLS protocol ---- -X.509 certificates are digital certificates that are used to verify the -authenticity of a website, user, or organization using a public key infrastructure -(PKI). They are used in various applications, including SSL/TLS encryption, -which is the basis for HTTPS - the primary protocol for securing communication -and data transfer over a network. - -The X.509 certificate format is a standard defined by the -[International Telecommunication Union (ITU)](https://www.itu.int/en/Pages/default.aspx) -and contains information such as the name of the certificate holder, the public -key associated with the certificate, the certificate's issuer, and the -certificate's expiration date. An X.509 certificate can be signed by a -certificate authority (CA) or self-signed. - -ArangoGraph is using: -- **well-known X.509 certificates** created by -[Let's Encrypt](https://letsencrypt.org/) -- **self-signed X.509 certificates** created by ArangoGraph platform - -## Certificate chains - -A certificate chain, also called the chain of trust, is a hierarchical structure -that links together a series of digital certificates. The trust in the chain is -established by verifying the identity of the issuer of each certificate in the -chain. The root of the chain is a trusted third-party, such as a certificate -authority (CA). The CA issues a certificate to an organization, which in turn -can issue certificates to servers and other entities. - -For example, when you visit a website with an SSL/TLS certificate, the browser -checks the chain of trust to verify the authenticity of the digital certificate. -The browser checks to see if the root certificate is trusted, and if it is, it -trusts the chain of certificates that lead to the end-entity certificate. -If any of the certificates in the chain are invalid, expired, or revoked, the -browser does not trust the digital certificate. - -## X.509 certificates in ArangoGraph - -Each ArangoGraph deployment is accessible on different port numbers: -- default port `8529`, `443` -- high port `18529` - -Each ArangoGraph Notebook is accessible on different port numbers: -- default port `8840`, `443` -- high port `18840` - -Metrics are accessible on different port numbers: -- default port `8829`, `443` -- high port `18829` - -The distinction between these port numbers is in the certificate used for the -TLS connection. - -{{< info >}} -The default ports (`8529` and `443`) always serve the well-known certificate. -The [auto login to database UI](../deployments/_index.md#auto-login-to-database-ui) -feature is only available on the `443` port and is enabled by default. -{{< /info >}} - -### Well-known X.509 certificates - -**Well-known X.509 certificates** created by -[Let's Encrypt](https://letsencrypt.org/) are used on the -default ports, `8529` and `443`. - -This type of certificate has a lifetime of 5 years and is rotated automatically. -It is recommended to use well-known certificates, as this eases access of a -deployment in your browser. - -{{< info >}} -The well-known certificate is a wildcard certificate and cannot contain -Subject Alternative Names (SANs). To include a SAN field, which is needed -for private endpoints running on Azure, please use the self-signed certificate -option. -{{< /info >}} - -### Self-signed X.509 certificates - -**Self-signed X.509 certificates** are used on the high ports, i.e. `18529`. -This type of certificate has a lifetime of 1 year, and it is created by the -ArangoGraph platform. It is also rotated automatically before the expiration -date. - -{{< info >}} -Unless you switch off the **Use well-known certificate** option in the -certificate generation, both the default and high port serve the same -self-signed certificate. -{{< /info >}} - -### Subject Alternative Name (SAN) - -The Subject Alternative Name (SAN) is an extension to the X.509 specification -that allows you to specify additional host names for a single SSL certificate. - -When using [private endpoints](../deployments/private-endpoints.md), -you can specify custom domain names. Note that these are added **only** to -the self-signed certificate as Subject Alternative Name (SAN). - -## How to create a new certificate - -1. Click a project name in the **Projects** section of the main navigation. -2. Click **Security**. -3. In the **Certificates** section, click: - - The **New certificate** button to create a new certificate. - - A name or the **eye** icon in the **Actions** column to view a certificate. - The dialog that opens provides commands for installing and uninstalling - the certificate through a console. - - The **pencil** icon to edit a certificate. - You can also view a certificate and click the **Edit** button. - - The **tag** icon to make the certificate the new default. - - The **recycle bin** icon to delete a certificate. - -![ArangoGraph Create New Certificate](../../../images/arangograph-new-certificate.png) - -## How to install a certificate - -Certificates that have the **Use well-known certificate** option enabled do -not need any installation and are supported by almost all web browsers -automatically. - -When creating a self-signed certificate that has the **Use well-known certificate** -option disabled, the certificate needs to be installed on your local machine as -well. This operation varies between operating systems. To install a self-signed -certificate on your local machine, open the certificate and follow the -installation instructions. - -![ArangoGraph Certificates](../../../images/arangograph-cert-page-with-cert-present.png) - -![ArangoGraph Certificate Install Instructions](../../../images/arangograph-cert-install-instructions.png) - -You can also extract the information from all certificates in the chain using the -`openssl` tool. - -- For **well-known certificates**, run the following command: - ``` - openssl s_client -showcerts -servername <123456abcdef>.arangodb.cloud -connect <123456abcdef>.arangodb.cloud:8529 </dev/null - ``` - -- For **self-signed certificates**, run the following command: - ``` - openssl s_client -showcerts -servername <123456abcdef>.arangodb.cloud -connect <123456abcdef>.arangodb.cloud:18529 </dev/null - ``` - -Note that `<123456abcdef>` is a placeholder that needs to be replaced with the -unique ID that is part of your ArangoGraph deployment endpoint URL. - -## How to connect to your application - -[ArangoDB drivers](../../develop/drivers/_index.md), also called connectors, allow you to -easily connect ArangoGraph deployments to your application. - -1. Navigate to **Deployments** and click the **View** button to show the - deployment page. -2. In the **Quick start** section, click the **Connecting drivers** button. -3. Select your programming language, i.e. Go, Java, Python, etc. -4. Follow the examples to connect a driver to your deployment. They include - code examples on how to use certificates in your application. - -![ArangoGraph Connecting Drivers](../../../images/arangograph-connecting-drivers.png) - -## Certificate Rotation - -Every certificate has a self-signed root certificate that is going to expire. -When certificates that are used in existing deployments are about to expire, -an automatic rotation of the certificates is triggered. This means that the -certificate is cloned (all existing settings are copied over to a new certificate) -and all affected deployments then start using the cloned certificate. - -Based on the type of certificate used, you may also need to install the new -certificate on your local machine. For example, self-signed certificates require -installation. To prevent any downtime, it is recommended to manually create a -new certificate and apply the required changes prior to the expiration date. diff --git a/site/content/3.10/data-science/arangograph-notebooks.md b/site/content/3.10/data-science/arangograph-notebooks.md deleted file mode 100644 index 34ca9529be..0000000000 --- a/site/content/3.10/data-science/arangograph-notebooks.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: ArangoGraph Notebooks -menuTitle: ArangoGraph Notebooks -weight: 130 -description: >- - Colocated Jupyter Notebooks within the ArangoGraph Insights Platform ---- -{{< tip >}} -ArangoGraph Notebooks don't include the ArangoGraphML services. -To enable the ArangoGraphML services, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. -{{< /tip >}} - -The ArangoGraph Notebook is a JupyterLab notebook embedded in the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -The notebook integrates seamlessly with the platform, -automatically connecting to ArangoGraph services and ArangoDB. -This makes it much easier to leverage these resources without having -to download any data locally or to remember user IDs, passwords, and endpoint URLs. - -For more information, see the [Notebooks](../arangograph/notebooks.md) documentation. diff --git a/site/content/3.11/arangograph/api/get-started.md b/site/content/3.11/arangograph/api/get-started.md deleted file mode 100644 index b4ea00e39d..0000000000 --- a/site/content/3.11/arangograph/api/get-started.md +++ /dev/null @@ -1,481 +0,0 @@ ---- -title: Get started with the ArangoGraph API and Oasisctl -menuTitle: Get started with Oasisctl -weight: 10 -description: >- - A tutorial that guides you through the ArangoGraph API as well as the Oasisctl - command-line tool -aliases: - - ../arangograph-api/getting-started ---- -This tutorial shows you how to do the following: - -- Generate an API key and authenticate with Oasisctl -- View information related to your organizations, projects, and deployments -- Configure, create and delete a deployment - -With Oasisctl the general command structure is to execute commands such as: - -``` -oasisctl list deployments -``` - -This command lists all deployments available to the authenticated user and we -will explore it in more detail later. Most commands also have associated -`--flags` that are required or provide additional options, this aligns with the -interaction method for many command line utilities. If you aren’t already -familiar with this, follow along as there are many examples in this guide that -will familiarize you with this command structure and using flags, along with -how to use OasisCtl to access the ArangoGraph API. - -Note: A good rule of thumb for all variables, resource names, and identifiers -is to **assume they are all case sensitive**, when being used with Oasisctl. - -## API Authentication - -### Generating an API Key - -The first step to using the ArangoGraph API is to generate an API key. To generate a -key you will need to be signed into your account at -[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -Once you are signed in, hover over the profile icon in the top right corner. - -![Profile Icon](../../../images/arangograph-my-account-hover.png) - -Click _My API keys_. - -This will bring you to your API key management screen. From this screen you can -create, reject, and delete API keys. - -Click the _New API key_ button. - -![Blank API Screen](../../../images/arangograph-my-api-keys.png) - -The pop-up box that follows has a few options for customizing the access level -of this API key. - -The options you have available include: - -- Limit access to 1 organization or all organizations this user has access to -- Set an expiration time, specified in number of hours -- Limit key to read-only access - -Once you have configured the API key access options, you will be presented with -your API key ID and API key secret. It is very important that you capture the -API key secret before clicking the close button. There is no way to retrieve -the API key secret after closing this pop-up window. - -![API Secret Key](../../../images/arangograph-api-key-secret.png) - -Once you have securely stored your API key ID and secret, click close. - -That is all there is to setting up API access to your ArangoGraph organizations. - -### Authenticating with Oasisctl - -Now that you have API access it is time to login with Oasisctl. - -Running the Oasisctl utility without any arguments is the equivalent of -including the --help flag. This shows all of the top level commands available -and you can continue exploring each command by typing the command name -followed by the --help flag to see the options available for that command. - -Let’s start with doing that for the login command: - -```bash -oasisctl login --help -``` - -You should see an output similar to this: - -![login help output](../../../images/oasisctl-login-help.png) - -This shows two additional flags are available, aside from the help flag. - -- `--key-id` -- `--key-secret` - -These require the values we received when creating the API key. Once you run -this command you will receive an authentication token that can be used for the -remainder of the session. - -```bash -oasisctl login \ - --key-id cncApiKeyId \ - --key-secret 873-secret-key-id -``` - -Upon successful login you should receive an authentication token: - -![On Successful Login](../../../images/oasisctl-login-success.png) - -Depending on your environment, you could instead store this token for easier -access. For example: - -With Linux: - -```bash -export OASIS_TOKEN=$(oasisctl login --key-id cncApiKeyId --key-secret 873-secret-key-id) -``` - -Or Windows Powershell: - -```powershell -setx OASIS_TOKEN (oasisctl login --key-id cncApiKeyId --key-secret 873-secret-key-id) -``` - -In the coming sections you will see how to authenticate with this token when -using other commands that require authentication. - -## Viewing and Managing Organizations and Deployments - -### Format - -This section covers the basics of retrieving information from the ArangoGraph API. -Depending on the data you are requesting from the ArangoGraph API, being able to read -it in the command line can start to become difficult. To make text easier to -read for humans and your applications, Oasisctl offers two options for -formatting the data received: - -- Table -- JSON - -You can define the format of the data by supplying the `--format` flag along -with your preferred format, like so: - -```bash -oasisctl --format json -``` - -### Viewing Information with the List Command - -This section will cover the two main functions of retrieving data with the -ArangoGraph API. These are: - -- `list` - List resources -- `get` - Get information - -Before you can jump right into making new deployments you need to be aware of -what resources you have available. This is where the list command comes in. -List serves as a way to retrieve general information, you can see all of the -available list options by accessing its help output. - -```bash -oasisctl list --help -``` - -This should output a screen similar to: - -![List help output](../../../images/oasisctl-list-help.png) - -As you can see you can get information on anything you would need about your -ArangoGraph organizations, deployments, and access control. To start, let’s take a -look at a few examples of listing information and then getting more details on -our results. - -### List Organizations - -One of the first pieces of information you may be interested in is the -organizations you have access to. This is useful to know because most commands -require an explicit declaration of the organization you are interacting with. -To find this, use list to list your available organizations: - -```bash -oasisctl list organizations --format json -``` - -Once you have your available organizations you can refer to your desired -organization using its name or id. - -![List organizations output](../../../images/oasisctl-list-org.png) - -Note: You may also notice the url attribute, this is for internal use only and -should not be treated as a publicly accessible path. - -### List Projects - -Once you have the organization name that you wish to interact with, the next -step is to list the available projects within that organization. Do this by -following the same command structure as before and instead exchange -organizations for projects, this time providing the desired organization name -with the `--organization-id` flag. - -```bash -oasisctl list projects \ - --organization-id "ArangoGraph Organization" \ - --format json -``` - -This will return information on all projects that the authenticated user has -access to. - -![List projects output](../../../images/oasisctl-list-projects.png) - -### List Deployments - -Things start getting a bit more interesting with information related to -deployments. Now that you have obtained an organization iD and a project ID, -you can list all of the associated deployments for that project. - -```bash -oasisctl list deployments \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --format json - ``` - -![List deployments output](../../../images/oasisctl-list-deployments.png) - -This provides some basic details for all of the deployments associated with the -project. Namely, it provides a deployment ID which we can use to start making -modifications to the deployment or to get more detailed information, with the -`get` command. - -### Using the Get Command - -In Oasisctl, you use the get command to obtain more detailed information about -any of your available resources. It follows the same command structure as the -previous commands but typically requires a bit more information. For example, -to get more information on a specific deployment means you need to know at -least: - -- Organization ID -- Project ID -- Deployment ID - -To get more information about our example deployment we would need to execute -the following command: - -```bash -oasisctl get deployment \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --deployment-id "abc123DeploymentID" \ - --format json -``` - -This returns quite a bit more information about the deployment including more -detailed server information, the endpoint URL where you can access the web interface, -and optionally the root user password. - -![Get deployment details](../../../images/oasisctl-get-deployment.png) - -### Node Size ID - -We won’t be exploring every flag available for creating a deployment but it is -a good idea to explore the concept of the node size ID value. This is an -indicator that is unique to each provider (Google, AWS) and indicates -the CPU and memory. Depending on the provider and region this can also -determine the available disk sizes for your deployment. In other words, it is -pretty important to know which `node-size-id` your deployment will be using. - -The command you execute will determine on the available providers and regions -for your organization but here is an example command that lists the available -options in the US West region for the Google Cloud Platform: - -```bash -oasisctl list nodesizes \ - --organization-id "ArangoGraph Organization" \ - --provider-id "Google Cloud Platform" \ - --region-id gcp-us-west2 -``` - -The output you will see will be similar to this: - -![List node size id](../../../images/oasisctl-list-node-size-id.png) - -It is important to note that you can scale up with more disk size but you are -unable to scale down your deployment disk size. The only way to revert back to -a lower disk size is to destroy and recreate your deployment. - -Once you have decided what your starting deployment needs are you can reference -your decision with the Id value for the corresponding configuration. So, for -our example, we will be choosing the c4-a4 configuration. The availability and -options are different for each provider and region, so be sure to confirm the -node size options before creating a new deployment. - -### Challenge - -You can use this combination of listing and getting to obtain all of the -information you want for your ArangoGraph organizations. We only explored a few of -the commands available but you can explore them all within the utility by -utilizing the `--help` flag or you can see all of the available options -in the [documentation](../oasisctl/options.md). - -Something that might be useful practice before moving on is getting the rest -of the information that you need to create a deployment. Here are a list of -items that won’t have defaults available when you attempt to create your -first deployment and you will need to supply: - -- CA Certificate ID (name) -- IP Allowlist ID (id) (optional) -- Node Size ID (id) -- Node Disk Size (GB disk size dependent on Node Size ID) -- Organization ID (name) -- Project ID (name) -- Region ID (name) - -Try looking up that information to get more familiar with how to find -information with Oasisctl. When in doubt use the `--help` flag with any -command. - -## Creating Resources - -Now that you have seen how to obtain information about your available -resources, it’s time to start using those skills to start creating your own -deployment. To create resources with Oasisctl you use the create command. -To see all the possible options you can start with the following command: - -```bash -oasisctl create --help -``` - -![Create command help output](../../../images/oasisctl-create-help.png) - -### Create a Deployment - -To take a look at all of the options available when creating a deployment the -best place to start is with our trusty help command. - -```bash -oasisctl create deployment --help -``` - -![Create deployment help output](../../../images/oasisctl-create-deployment-help.png) - -As you can see there are a lot of default options but also a few that require -some knowledge of our pre-existing resources. Attempting to create a deployment -without one of the required options will return an error indicating which value -is missing or invalid. - -Once you have collected all of the necessary information the command for -creating a deployment is simply supplying the values along with the appropriate -flags. This command will create a deployment: - -```bash -oasisctl create deployment \ - --region-id gcp-us-west2 \ - --node-size-id c4-a4 \ - --node-disk-size 10 \ - --version 3.9.2 \ - --cacertificate-id OasisCert \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --name "First Oasisctl Deployment" \ - --description "The first deployment created using the awesome Oasisctl utility!" -``` - -If everything went according to play you should see similar output: - -![Deployment created successfully](../../../images/oasisctl-create-first-deployment-success.png) - -### Wait on Deployment Status - -When you create a deployment it begins the process of _bootstrapping_ which is -getting the deployment ready for use. This should happen quickly and to see if -it is ready for use you can run the wait command using the ID of the newly -created deployment, shown at the top of the information you received above. - -```bash -oasisctl wait deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -Once you receive a response of _Deployment Ready_, your deployment is indeed -ready to use. You can get some new details by running the get command. - -```bash -oasisctl get deployment \ - --organization-id "ArangoGraph Organization" \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -![Get deployment bootstrap status](../../../images/oasisctl-get-first-deployment-bootstrapped.png) - -Once the deployment is ready you will get two new pieces of information, the -endpoint URL and Bootstrapped-At will indicate the time it became available. -If you would like to login to the web interface to verify that your server is in fact -up and running you will need to supply the `--show-root-password` flag along -with the get command, this flag does not take a value. - -### The Update Command - -The inevitable time comes when something about your deployment must change and -this is where the update command comes in. You can use update to change or -update a number of things including updating the groups, policies, and roles -for user access control. You can also update some of your deployment -information or, for our situation, add an IP Allowlist if you didn’t add one -during creation. - -There are, of course, many options available and it is always recommended to -start with the --help flag to read about all of them. - -### Update a Deployment - -This section will show an example of how to update a deployment to use a -pre-existing allowlist. To add an IP Allowlist after the fact we are really -just updating the IP Allowlist value, which is currently empty. In order to -update the IP Allowlist of a deployment you must create a allowlist and then -you can simply reference its id like so: - -```bash -oasisctl update deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i \ - --ipallowlist-id abc123AllowlistID -``` - -You should receive a response with the deployment information and an indication -that deployment was updated at the top. - -You can use the update command to update everything about your deployments as -well. If you run: - -```bash -oasisctl update deployment --help -``` - -You will see the full list of options available that will allow you to scale -your deployment as needed. - -![Update deployment help output](../../../images/oasisctl-update-deployment-help.png) - -## Delete a Deployment - -There may come a day where you need to delete a resource. The process for this -follows right along with the conventions for the other commands detailed -throughout this guide. - -### The Delete Command - -For the final example in this guide we will delete the deployment that has -been created. This only requires the deployment ID and the permissions to -delete the deployment. - -```bash -oasisctl delete deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -Once the deployment has been deleted you can confirm it is gone by listing -your deployments. - -```bash -oasisctl list deployments \ - --organization-id "ArangoGraph Organization" \ - --format json -``` - -## Next Steps - -As promised, this guide covered the basics of using Oasisctl with the ArangoDB -API. While we primarily focused on viewing and managing deployments there is -also a lot more to explore, including: - -- Organization Invites Management -- Backups -- API Key Management -- Certificate Management -- User Access Control - -You can check out all these features and further details on the ones discussed -in this guide in the documentation. diff --git a/site/content/3.11/arangograph/api/set-up-a-connection.md b/site/content/3.11/arangograph/api/set-up-a-connection.md deleted file mode 100644 index 7cbc2b76e2..0000000000 --- a/site/content/3.11/arangograph/api/set-up-a-connection.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Get started with the ArangoGraph API -menuTitle: Get started with the API -weight: 5 -description: >- - Quick start guide on how to set up a connection to the ArangoGraph API -aliases: - - ../arangograph-api/getting-started-with-the-api ---- -The instructions below are a quick start guide on how to set up a connection to the ArangoGraph API. - -All examples below will use the Go programming language. -Since the ArangoGraph API is using gRPC with protocol buffers, -all examples can be easily translated to many different languages. - -## Prerequisites - -Make sure that you have already [signed up for ArangoGraph](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). - -## Creating an API key - -1. Go to [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) and login. -2. Click the user icon in the top-right of the dashboard. -3. Select __My API keys__ -4. Click __New API key__ -5. Click __Create__ to select the default settings. -6. You'll now see a dialog showing the __API key ID__ and - the __API key Secret__. This is the only time you will see - the secret, so make sure to store it in a safe place. - -## Create an access token with your API key - -```go -import ( - "context" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "github.com/arangodb-managed/apis/common/auth" - common "github.com/arangodb-managed/apis/common/v1" - data "github.com/arangodb-managed/apis/data/v1" - iam "github.com/arangodb-managed/apis/iam/v1" -) - -... - -// Set up a connection to the API. -tc := credentials.NewTLS(&tls.Config{}) -conn, err := grpc.Dial("https://api.cloud.arangodb.com", - grpc.WithTransportCredentials(tc)) -if err != nil { - // handle error -} - -// Create client for IAM service -iamc := iam.NewIAMServiceClient(conn) - -// Call AuthenticateAPIKey to create token -resp, err := iamc.AuthenticateAPIKey(ctx, - &iam.AuthenticateAPIKeyRequest{ - Id: keyID, - Secret: keySecret, -}) -if err != nil { - // handle error -} -token := resp.GetToken() -``` - -## Make an authenticated API call - -We're going to list all deployments in a project. -The connection and token created in the previous sample is re-used. - -The authentication token is passed as standard `bearer` token to the call. -If Go, there is a helper method (`WithAccessToken`) to create a context using -an authentication token. - -```go -// Create client for Data service -datac := data.NewDataServiceClient(conn) - -// Prepare context with authentication token -ctx := auth.WithAccessToken(context.Background(), token) - -// Call list deployments -list, err := datac.ListDeployments(ctx, - &common.ListOptions{ContextId: myProjectID}) -if err != nil { - // handle error -} -for _, depl := range list.GetItems() { - fmt.Printf("Found deployment with id %s\n", depl.GetId()) -} - -``` - -## API Errors - -All API methods return errors as gRPC error codes. - -The `github.com/arangodb-managed/apis/common/v1` package contains several helpers to check for common errors. - -```go -if common.IsNotFound(err) { - // Error is caused by a not-found situation -} -``` diff --git a/site/content/3.11/arangograph/backups.md b/site/content/3.11/arangograph/backups.md deleted file mode 100644 index e4adcd0a0e..0000000000 --- a/site/content/3.11/arangograph/backups.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -title: Backups in ArangoGraph -menuTitle: Backups -weight: 50 -description: >- - You can manually create backups or use a backup policy to schedule periodic - backups, and both ways allow you to store your backups in multiple regions simultaneously ---- -## How to create backups - -To backup data in ArangoGraph for an ArangoDB installation, navigate to the -**Backups** section of your deployment created previously. - -![Backup ArangoDB](../../images/arangograph-backup-section.png) - -There are two ways to create backups. Create periodic backups using a -**Backup policy**, or create a backup manually. -Both ways allow you to create [backups in multiple regions](#multi-region-backups) -as well. - -### Periodic backups - -Periodic backups are created at a given schedule. To see when the new backup is -due, observe the schedule section. - -![Backup Policy schedule](../../images/arangograph-backup-policy-schedule.png) - -When a new deployment is created, a default **Backup policy** is created for it -as well. This policy creates backups every two hours. To edit this policy -(or any policy), highlight it in the row above and hit the pencil icon. - -![Edit Backup Policy](../../images/arangograph-edit-backup-policy.png) - -These backups are not automatically uploaded. To enable this, use the -**Upload backup to storage** option and choose a retention period that -specifies how long backups are retained after creation. - -If the **Upload backup to storage** option is enabled for a backup policy, -you can then create backups in different regions than the default one. -The regions where the default backup is copied are shown in the -**Additional regions** column in the **Policies** section. - -### Manual backups - -It's also possible to create a backup on demand. To do this, click **Back up now**. - -![Back up Now](../../images/arangograph-back-up-now.png) - -![Back up Now Dialog](../../images/arangograph-back-up-now-dialog.png) - -If you want to manually copy a backup to a different region than the default -one, first ensure that the **Upload backup to storage** option is enabled. -Then, highlight the backup row and use the -**Copy backup to a different region** button from the **Actions** column. - -The source backup ID from -which the copy is created is displayed in the **Copied from Backup** column. - -![Copy backup to a different region](../../images/arangograph-copy-backup-different-region.png) - -![Multiple Backups](../../images/arangograph-multiple-backups.png) - -### Uploading backups - -By default, a backup is not uploaded to the cloud, instead it remains on the -servers of the deployment. To make a backup that is resilient against server -(disk) failures, upload the backup to cloud storage. - -When the **Upload backup to cloud storage** option is enabled, the backup is -preserved for a long time and does not occupy any disk space on the servers. -This also allows copying the backup to different regions and it can be -configured in the **Multiple region backup** section. - -Uploaded backups are -required for [cloning](#how-to-clone-deployments-using-backups). - -#### Best practices for uploading backups - -When utilizing the **Upload backup to cloud storage** feature, a recommended -approach is to implement a backup strategy that balances granularity and storage -efficiency. - -One effective strategy involves creating a combination of backup intervals and -retention periods. For instance, consider the following example: - -1. Perform a backup every 4 hours with a retention period of 24 hours. This - provides frequent snapshots of your data, allowing you to recover recent - changes. -2. Perform a backup every day with a retention period of a week. Daily backups - offer a broader time range for recovery, enabling you to restore data from - any point within the past week. -3. Perform a backup every week with a retention period of a month. Weekly - backups allow you to recover from more extensive data. -4. Perform a backup every month with a retention period of a year. Monthly - backups provide a long-term perspective, enabling you to restore data from - any month within the past year. - -This backup strategy offers good granularity, providing multiple recovery -options for different timeframes. By implementing this approach, you have a -total number of backups that is considerable lower in comparison to other -alternatives such as having hourly backups with a retention period of a year. - -## Multi-region backups - -Using the multi-region backup feature, you can store backups in multiple regions -simultaneously either manually or automatically as part of a **Backup policy**. -If a backup created in one region goes down, it is still available in other -regions, significantly improving reliability. - -Multiple region backup is only available when the -**Upload backup to cloud storage** option is enabled. - -![Multiple Region Backup](../../images/arangograph-multi-region-backup.png) - -## How to restore backups - -To restore a database from a backup, highlight the desired backup and click the restore icon. - -{{< warning >}} -All current data will be lost when restoring. To make sure that new data that -has been inserted after the backup creation is also restored, create a new -backup before using the **Restore Backup** feature. - -During restore, the deployment is temporarily not available. -{{< /warning >}} - -![Restore From Backup](../../images/arangograph-restore-from-backup.png) - -![Restore From Backup Dialog](../../images/arangograph-restore-from-backup-dialog.png) - -![Restore From Backup Status Pending](../../images/arangograph-restore-from-backup-status-pending.png) - -![Restore From Backup Status Restored](../../images/arangograph-restore-from-backup-status-restored.png) - -## How to clone deployments using backups - -Creating a deployment from a backup allows you to duplicate an existing -deployment with all its data, for example, to create a test environment or to -move to a different cloud provider or region within ArangoGraph. - -{{< info >}} -This feature is only available if the backup you wish to clone has been -uploaded to cloud storage. -{{< /info >}} - -{{< info >}} -The cloned deployment will have the exact same features as the previous -deployment including node size and model. The cloud provider and the region -can stay the same or you can select a different one. -For restoring a deployment as quick as possible, it is recommended to create a -deployment in the same region as where the backup resides to avoid cross-region -data transfer. -The data contained in the backup will be restored to this new deployment. - -The *root password* for this deployment will be different. -{{< /info >}} - -1. Highlight the backup you wish to clone from and hit **Clone backup to new deployment**. - - ![ArangoGraph Clone Deployment From Backup](../../images/arangograph-clone-deployment-from-backup.png) - -2. Choose whether the clone should be created using the current provider and in - the same region as the backup or using a different provider, a different region, - or both. - - ![ArangoGraph Clone Deployment Select Region](../../images/arangograph-clone-deployment-select.png) - -3. The view should navigate to the new deployment being bootstrapped. - - ![ArangoGraph Cloned Deployment](../../images/arangograph-cloned-deployment.png) - -This feature is also available through [oasisctl](oasisctl/_index.md). diff --git a/site/content/3.11/arangograph/data-loader/_index.md b/site/content/3.11/arangograph/data-loader/_index.md deleted file mode 100644 index 7955fcb47a..0000000000 --- a/site/content/3.11/arangograph/data-loader/_index.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Load your data into ArangoGraph -menuTitle: Data Loader -weight: 22 -description: >- - Load your data into ArangoGraph and transform it into richly-connected graph - structures, without needing to write any code or deploy any infrastructure ---- - -ArangoGraph provides different ways of loading your data into the platform, -based on your migration use case. - -## Transform data into a graph - -The ArangoGraph Data Loader allows you to transform existing data from CSV file -formats into data that can be analyzed by the ArangoGraph platform. - -You provide your data in CSV format, a common format used for exports of data -from various systems. Then, using a no-code editor, you can model the schema of -this data and the relationships between them. This allows you to ingest your -existing datasets into your ArangoGraph database, without the need for any -development effort. - -You can get started in a few easy steps. - -1. **Create database**: - Choose an existing database or create a new one and enter a name for your new graph. - -2. **Add files**: - Drag and drop your data files in CSV format. - -3. **Design your graph**: - Model your graph schema by adding nodes and connecting them via edges. - -4. **Import data**: - Once you are ready, save and start the import. The resulting graph is an - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) with its - corresponding collections, available in your ArangoDB web interface. - -Follow this [working example](../data-loader/example.md) to see how easy it is -to transform existing data into a graph. - -## Import data to the cloud - -To import data from various files into collections **without creating a graph**, -get the ArangoDB client tools for your operating system from the -[download page](https://arangodb.com/download-major/). - -- To import data to ArangoGraph from an existing ArangoDB instance, see - [arangodump](../../components/tools/arangodump/) and - [arangorestore](../../components/tools/arangorestore/). -- To import pre-existing data in JSON, CSV, or TSV format, see - [arangoimport](../../components/tools/arangoimport/). - -## How to access the Data Loader - -1. If you do not have a deployment yet, [create a deployment](../deployments/_index.md#how-to-create-a-new-deployment) first. -2. Open the deployment you want to load data into. -3. In the **Load Data** section, click the **Load your data** button. -4. Select your migration use case. - -![ArangoGraph Data Loader Migration Use Cases](../../../images/arangograph-data-loader-migration-use-cases.png) \ No newline at end of file diff --git a/site/content/3.11/arangograph/data-loader/design-graph.md b/site/content/3.11/arangograph/data-loader/design-graph.md deleted file mode 100644 index b1c5eaf3af..0000000000 --- a/site/content/3.11/arangograph/data-loader/design-graph.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Design your graph -menuTitle: Design graph -weight: 10 -description: >- - Design your graph database schema using the integrated graph modeler in the Data Loader ---- - -Based on the data you have uploaded, you can start designing your graph. -The graph designer allows you to create a schema using nodes and edges. -Once this is done, you can save and start the import. The resulting -[EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and the -corresponding collections are created in your ArangoDB database instance. - -## How to add a node - -Nodes are the main objects in your data model and include the attributes of the -objects. - -1. To create a new node, click the **Add node** button. -2. In the graph designer, click on the newly created node to view the **Node details**. -3. In the **Node details** panel, fill in the following fields: - - For **Node label**, enter a name you want to use for the node. - - For **File**, select a file from the list to associate it with the node. - - For **Primary Identifier**, select a field from the list. This is used to - reference the nodes when you define relations with edges. - - For **File Headers**, select one or more attributes from the list. - -![ArangoGraph Data Loader Add Node](../../../images/arangograph-data-loader-add-node.png) - -## How to connect nodes - -Nodes can be connected by edges to express and categorize the relations between -them. A relation always has a direction, going from one node to another. You can -define this direction in the graph designer by dragging your cursor from one -particular node to another. - -To connect two nodes, you can use the **Connect node(s)** button. Click on any -node to self-reference it or drag it to connect it to another node. Alternatively, -when you select a node, a plus sign will appear, allowing you to directly add a -new node with an edge. - -{{< tip >}} -To quickly recenter your elements on the canvas, you can use the **Center View** -button located in the bottom right corner. This brings your nodes and edges back -into focus. -{{< /tip >}} - -The edge needs to be associated with a file and must have a label. Note that a -node and an edge cannot have the same label. - -See below the steps to add details to an edge. - -1. Click on an edge in the graph designer. -2. In the **Edit Edge** panel, fill in the following fields: - - For **Edge label**, enter a name you want to use for the edge. - - For **Relation file**, select a file from the list to associate it with the edge. - - To define how the relation points from one node to another, select the - corresponding relation file header for both the origin file (`_from`) and the - destination file (`_to`). - - For **File Headers**, select one or more attributes from the list. - -![ArangoGraph Data Loader Edit Edge](../../../images/arangograph-data-loader-edit-edge.png) - -## How to delete elements - -To remove a node or an edge, simply select it in the graph designer and click the -**Delete** icon. \ No newline at end of file diff --git a/site/content/3.11/arangograph/data-loader/example.md b/site/content/3.11/arangograph/data-loader/example.md deleted file mode 100644 index 46fdd1b38e..0000000000 --- a/site/content/3.11/arangograph/data-loader/example.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Data Loader Example -menuTitle: Example -weight: 20 -description: >- - Follow this complete working example to see how easy it is to transform existing - data into a graph and get insights from the connected entities ---- - -To transform your data into a graph, you need to have CSV files with entities -representing the nodes and a corresponding CSV file representing the edges. - -This example uses a sample data set of two files, `airports.csv`, and `flights.csv`. -These files are used to create a graph showing flights arriving at and departing -from various cities. -You can download the files from [GitHub](https://github.com/arangodb/example-datasets/tree/master/Data%20Loader). - -The `airports.csv` contains rows of airport entries, which are the future nodes -in your graph. The `flights.csv` contains rows of flight entries, which are the -future edges connecting the nodes. - -The whole process can be broken down into these steps: - -1. **Database and graph setup**: Begin by choosing an existing database or - create a new one and enter a name for your new graph. -2. **Add files**: Upload the CSV files to the Data Loader web interface. You can - simply drag and drop them or upload them through the file browser window. -3. **Design graph**: Design your graph schema by adding nodes and edges and map - data from the uploaded files to them. This allows creating the corresponding - documents and collections for your graph. -4. **Import data**: Import the data and start using your newly created - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and its - corresponding collections. - -## Step 1: Create a database and choose the graph name - -Start by creating a new database and adding a name for your graph. - -![Data Loader Example Step 1](../../../images/arangograph-data-loader-example-choose-names.png) - -## Step 2: Add files - -Upload your CSV files to the Data Loader web interface. You can drag and drop -them or upload them via a file browser window. - -![Data Loader Example Step 2](../../../images/arangograph-data-loader-example-add-files.png) - -See also [Add files into Data Loader](../data-loader/add-files.md). - -## Step 3: Design graph schema - -Once the files are added, you can start designing the graph schema. This example -uses a simple graph consisting of: -- Two nodes (`origin_airport` and `destination_airport`) -- One directed edge going from the origin airport to the destination one - representing a flight - -Click **Add node** to create the nodes and connect them with edges. - -Next, for each of the nodes and edges, you need to create a mapping to the -corresponding file and headers. - -For nodes, the **Node label** is going to be a node collection name and the -**Primary identifier** will be used to populate the `_key` attribute of documents. -You can also select any additional headers to be included as document attributes. - -In this example, two node collections have been created (`origin_airport` and -`destination_airport`) and `AirportID` header is used to create the `_key` -attribute for documents in both node collections. The header preview makes it -easy to select the headers you want to use. - -![Data Loader Example Step 3 Nodes](../../../images/arangograph-data-loader-example-map-nodes.png) - -For edges, the **Edge label** is going to be an edge collection name. Then, you -need to specify how edges will connect nodes. You can do this by selecting the -*from* and *to* nodes to give a direction to the edge. -In this example, the `source airport` header has been selected as a source and -the `destination airport` header as a target for the edge. - -![Data Loader Example Step 3 Edges](../../../images/arangograph-data-loader-example-map-edges.png) - -Note that the values of the source and target for the edge correspond to the -**Primary identifier** (`_key` attribute) of the nodes. In this case, it is the -airport code (i.e. GKA) used as the `_key` in the node documents and in the source -and destination headers to configure the edges. - -See also [Design your graph in the Data Loader](../data-loader/design-graph.md). - -## Step 4: Import and see the resulting graph - -After all the mapping is done, all you need to do is click -**Save and start import**. The report provides an overview of the files -processed and the documents created, as well as a link to your new graph. -See also [Start import](../data-loader/import.md). - -![Data Loader Example Step 4 See your new graph](../../../images/arangograph-data-loader-example-data-import.png) - -Finally, click **See your new graph** to open the ArangoDB web interface and -explore your new collections and graph. - -![Data Loader Example Step 4 Resulting graph](../../../images/arangograph-data-loader-example-resulting-graph.png) - -Happy graphing! \ No newline at end of file diff --git a/site/content/3.11/arangograph/data-loader/import.md b/site/content/3.11/arangograph/data-loader/import.md deleted file mode 100644 index 1589244278..0000000000 --- a/site/content/3.11/arangograph/data-loader/import.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Start the import -menuTitle: Start import -weight: 15 -description: >- - Once the data files are provided and the graph is designed, you can start the import ---- - -Before starting the actual import, make sure that: -- You have selected a database for import or created a new one; -- You have provided a valid name for your graph; -- You have created at least one node; -- You have created at least one edge; -- You have uploaded at least one file; -- Every file is related to at least one node or edge; -- Every node and edge is linked to a file; -- Every node and edge has a unique label; -- Every node has a primary identifier selected; -- Every edge has an origin and destination file header selected. - -To continue with the import, click the **Save and start import** button. The data -importer provides an overview showing results with the collections that have been -created with the data provided in the files. - -To access your newly created graph in the ArangoDB web interface, click the -**See your new graph** button. - -## File validation - -Once the import has started, the files that you have provided are being validated. -If the validation process detects parsing errors in any of the files, the import -is temporarily paused and the validation errors are shown. You can get a full -report by clicking the **See full report** button. - -At this point, you can: -- Continue with the import without addressing the errors. The CSV files will still - be included in the migration. However, the invalid rows are skipped and - excluded from the migration. -- Revisit the problematic file(s), resolve the issues, and then re-upload the - file(s) again. - -{{< tip >}} -To ensure the integrity of your data, it is recommended to address all the errors -detected during the validation process. -{{< /tip >}} - -### Validation errors and their meanings - -#### Invalid Quotation Mark - -This error indicates issues with quotation marks in the CSV data. -It can occur due to improper use of quotes. - -#### Missing Quotation Marks - -This error occurs when quotation marks are missing or improperly placed in the -CSV data, potentially affecting data enclosure. - -#### Insufficient Data Fields - -This error occurs when a CSV row has fewer fields than expected. It may indicate -missing or improperly formatted data. - -#### Excessive Data Fields - -This error occurs when a CSV row has more fields than expected, possibly due to -extra data or formatting issues. - -#### Unidentifiable Field Separator - -This error suggests that the parser could not identify the field separator -character in the CSV data. \ No newline at end of file diff --git a/site/content/3.11/arangograph/deployments/_index.md b/site/content/3.11/arangograph/deployments/_index.md deleted file mode 100644 index b8dd98d490..0000000000 --- a/site/content/3.11/arangograph/deployments/_index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Deployments in ArangoGraph -menuTitle: Deployments -weight: 20 -description: >- - How to create and manage deployments in ArangoGraph ---- -An ArangoGraph deployment is an ArangoDB cluster or single server, configured -as you choose. - -Each deployment belongs to a project, which belongs to an organization in turn. -You can have any number of deployments under one project. - -**Organizations → Projects → <u>Deployments</u>** - -![ArangoGraph Deployments](../../../images/arangograph-deployments-page.png) - -## How to create a new deployment - -1. If you do not have a project yet, - [create a project](../projects.md#how-to-create-a-new-project) first. -2. In the main navigation, click __Deployments__. -3. Click the __New deployment__ button. -4. Select the project you want to create the deployment for. -5. Set up your deployment. The configuration options are described below. - -{{< info >}} -Deployments contain exactly **one policy**. Within that policy, you can define -role bindings to regulate access control on a deployment level. -{{< /info >}} - -### In the **General** section - -- Enter the __Name__ and optionally a __Short description__ for the deployment. -- Select the __Provider__ and __Region__ of the provider. - {{< warning >}} - Once a deployment has been created, it is not possible to change the - provider and region anymore. - {{< /warning >}} - -![ArangoGraph New Deployment General](../../../images/arangograph-new-deployment-general.png) - -### In the **Sizing** section - -- Choose a __Model__ for the deployment: - - - __OneShard__ deployments are suitable when your data set fits in a single node. - They are ideal for graph use cases. This model has a fixed number of 3 nodes. - - - __Sharded__ deployments are suitable when your data set is larger than a single - node. The data will be sharded across multiple nodes. You can select the - __Number of nodes__ for this deployment model. The more nodes you have, the - higher the replication factor can be. - - - __Single Server__ deployments are suitable when you want to try out ArangoDB without - the need for high availability or scalability. The deployment will contain a - single server only. Your data will not be replicated and your deployment can - be restarted at any time. - -- Select a __NODE SIZE__ from the list of available options. Each option is a - combination of vCPUs, memory, and disk space per node. - -![ArangoGraph New Deployment Sizing](../../../images/arangograph-new-deployment-sizing.png) - -### In the **Advanced** section - -- Select the __DB Version__. - If you don't know which DB version to select, use the version selected by default. -- Select the desired __Support Plan__. Click the link below the field to get - more information about the different support plans. -- In the __Certificate__ field: - - The default certificate created for your project is selected automatically. - - If you have no default certificate, or want to use a new certificate, - create a new certificate by typing the desired name for it and hitting - enter or clicking __Create "\<name\>"__ when done. - - Or, if you already have multiple certificates, select the desired one. -- _Optional but strongly recommended:_ In the __IP allowlist__ field, select the - desired one in case you want to limit access to your deployment to certain - IP ranges. To create a allowlist, navigate to your project and select the - __IP allowlists__ tab. See [How to manage IP allowlists](../projects.md#how-to-manage-ip-allowlists) - for details. - {{< security >}} - For any kind of production deployment it is strongly advise to use an IP allowlist. - {{< /security >}} -- Select a __Deployment Profile__. Profile options are only available on request. - -![ArangoGraph New Deployment Advanced](../../../images/arangograph-new-deployment-advanced.png) - -### In the **Summary** panel - -1. Review the configuration, and if you're okay with the setup, press the - __Create deployment__ button. -2. You are taken to the deployment overview page. - **Note:** Your deployment is being bootstrapped at that point. This process - takes a few minutes. Once the deployment is ready, you receive a confirmation - email. - -## How to access your deployment - -1. In the main navigation, click the __Dashboard__ icon and then click __Projects__. -2. In the __Projects__ page, click the project for - which you created a deployment earlier. -3. Alternatively, you can access your deployment by clicking __Deployments__ in the - dashboard navigation. This page shows all deployments from all projects. - Click the name of the deployment you want to view. -4. For each deployment in your project, you see the status. While your new - deployment is being set up, it displays the __bootstrapping__ status. -5. Press the __View__ button to show the deployment page. -6. When a deployment displays a status of __OK__, you can access it. -7. Click the __Open database UI__ button or on the database UI link to open - the dashboard of your new ArangoDB deployment. - -At this point your ArangoDB deployment is available for you to use — **Have fun!** - -If you have disabled the [auto-login option](#auto-login-to-database-ui) to the -database web interface, you need to follow the additional steps outlined below -to access your deployment: - -1. Click the copy icon next to the root password. This copies the deployment - root password to your clipboard. You can also click the view icon to unmask - the root password to see it. - {{< security >}} - Do not use the root username/password for everyday operations. It is recommended - to use them only to create other user accounts with appropriate permissions. - {{< /security >}} -2. Click the __Open database UI__ button or on the database UI link to open - the dashboard of your new ArangoDB deployment. -3. In the __username__ field type `root`, and in the __password__ field paste the - password that you copied earlier. -4. Press the __Login__ button. -5. Press the __Select DB: \_system__ button. - -{{< info >}} -Each deployment is accessible on two ports: - -- Port `8529` is the standard port recommended for use by web-browsers. -- Port `18529` is the alternate port that is recommended for use by automated services. - -The difference between these ports is the certificate used. If you enable -__Use well-known certificate__, the certificates used on port `8529` is well-known -and automatically accepted by most web browsers. The certificate used on port -`18529` is a self-signed certificate. For securing automated services, the use of -a self-signed certificate is recommended. Read more on the -[Certificates](../security-and-access-control/x-509-certificates.md) page. -{{< /info >}} - -## Password settings - -### How to enable the automatic root user password rotation - -Password rotation refers to changing passwords regularly - a security best -practice to reduce the vulnerability to password-based attacks and exploits -by limiting for how long passwords are valid. The ArangoGraph Insights Platform -can automatically change the `root` user password of an ArangoDB deployment -periodically to improve security. - -1. Navigate to the __Deployment__ for which you want to enable an automatic - password rotation for the root user. -2. In the __Quick start__ section, click the button with the __gear__ icon next to the - __ROOT PASSWORD__. -3. In the __Password Settings__ dialog, turn the automatic password rotation on - and click the __Confirm__ button. - - ![ArangoGraph Deployment Password Rotation](../../../images/arangograph-deployment-password-rotation.png) -4. You can expand the __Root password__ panel to see when the password was - rotated last. The rotation takes place every three months. - -### Auto login to database UI - -ArangoGraph provides the ability to automatically login to your database using -your existing ArangoGraph credentials. This not only provides a seamless -experience, preventing you from having to manage multiple sets of credentials -but also improves the overall security of your database. As your credentials -are shared between ArangoGraph and your database, you can benefit from -end-to-end audit traceability for a given user, as well as integration with -ArangoGraph SSO. - -You can enable this feature in the **Password Settings** dialog. Please note -that it may take a few minutes to get activated. -Once enabled, you no longer have to fill in the `root` user and password of -your ArangoDB deployment. - -{{< info >}} -If you use the auto login feature with AWS -[private endpoints](../deployments/private-endpoints.md), it is recommended -to switch off the `custom DNS` setting. -{{< /info >}} - -This feature can be disabled at any time. You may wish to consider explicitly -disabling this feature in the following situations: -- Your workflow requires you to access the database UI using different accounts - with differing permission sets, as you cannot switch database users when - automatic login is enabled. -- You need to give individuals access to a database's UI without giving them - any access to ArangoGraph. Note, however, that it's possible to only give an - ArangoGraph user database UI access, without other ArangoGraph permissions. - -{{< warning >}} -When the auto login feature is enabled, users cannot edit their permissions on -the ArangoDB database web interface as all permissions are managed by the -ArangoGraph platform. -{{< /warning >}} - -Before getting started, make sure you are signed into ArangoGraph as a user -with one of the following permissions in your project: -- `data.deployment.full-access` -- `data.deployment.read-only-access` - -Organization owners have these permissions enabled by default. -The `deployment-full-access-user` and `deployment-read-only-user` roles which -contain these permissions can also be granted to other members of the -organization. See how to create a -[role binding](../security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy). - -{{< warning >}} -This feature is available on `443` port only. -{{< /warning >}} - -## How to edit a deployment - -You can modify a deployment's configuration, including the ArangoDB version -that is being used, change the memory size, or even switch from -a OneShard deployment to a Sharded one if your data set no longer fits in a -single node. - -{{< tip >}} -To edit an existing deployment, you must have the necessary set of permissions -attached to your role. Read more about [roles and permissions](../security-and-access-control/_index.md#roles). -{{< /tip >}} - -1. In the main navigation, click **Deployments** and select an existing - deployment from the list, or click **Projects**, select a project, and then - select a deployment. -2. In the **Quick start** section, click the **Edit** button. -3. In the **General** section, you can do the following: - - Change the deployment name - - Change the deployment description -4. In the **Sizing** section, you can do the following: - - Change **OneShard** deployments into **Sharded** deployments. To do so, - select **Sharded** in the **Model** dropdown list. You can select the - number of nodes for your deployment. This can also be modified later on. - {{< warning >}} - You cannot switch from **Sharded** back to **OneShard**. - {{< /warning >}} - - Change **Single Server** deployments into **OneShard** or **Sharded** deployments. - {{< warning >}} - You cannot switch from **Sharded** or **OneShard** back to **Single Server**. - {{< /warning >}} - - Scale up or down the node size. - {{< warning >}} - When scaling up or down the size in AWS deployments, the new value gets locked - and cannot be changed again until the cloud provider rate limit is reset. - {{< /warning >}} -5. In the **Advanced** section, you can do the following: - - Upgrade the ArangoDB version that is currently being used. See also - [Upgrades and Versioning](upgrades-and-versioning.md) - - Select a different certificate. - - Add or remove an IP allowlist. - - Select a deployment profile. -6. All changes are reflected in the **Summary** panel. Review the new - configuration and click **Save changes**. - -## How to connect a driver to your deployment - -[ArangoDB drivers](../../develop/drivers/_index.md) allow you to use your ArangoGraph -deployment as a database system for your applications. Drivers act as interfaces -between different programming languages and ArangoDB, which enable you to -connect to and manipulate ArangoDB deployments from within compiled programs -or using scripting languages. - -To get started, open a deployment. -In the **Quick start** section, click on the **Connecting drivers** button and -select your programming language. The code snippets provide examples on how to -connect to your instance. - -{{< tip >}} -Note that ArangoGraph Insights Platform runs deployments in a cluster -configuration. To achieve the best possible availability, your client -application has to handle connection failures by retrying operations if needed. -{{< /tip >}} - -![ArangoGraph Connecting Drivers Example](../../../images/arangograph-connecting-drivers-example.png) - -## How to delete a deployment - -{{< danger >}} -Deleting a deployment deletes all its data and backups. -This operation is **irreversible**. Please proceed with caution. -{{< /danger >}} - -1. In the main navigation, in the __Projects__ section, click the project that - holds the deployment you wish to delete. -2. In the __Deployments__ page, click the deployment you wish to delete. -3. Click the __Delete/Lock__ entry in the navigation. -4. Click the __Delete deployment__ button. -5. In the modal dialog, confirm the deletion by entering `Delete!` into the - designated text field. -6. Confirm the deletion by pressing the __Yes__ button. -7. You will be taken back to the deployments page of the project. - The deployment being deleted will display the __Deleting__ status until it has - been successfully removed. diff --git a/site/content/3.11/arangograph/deployments/private-endpoints.md b/site/content/3.11/arangograph/deployments/private-endpoints.md deleted file mode 100644 index c3400b9711..0000000000 --- a/site/content/3.11/arangograph/deployments/private-endpoints.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Private endpoint deployments in ArangoGraph -menuTitle: Private endpoints -weight: 5 -description: >- - Use the private endpoint feature to isolate your deployments and increase - security ---- -This topic describes how to create a private endpoint deployment and -securely deploy to various cloud providers such as Google Cloud Platform (GCP) -and Amazon Web Services (AWS). Follow the steps outlined below to get started. - -{{< tip >}} -In AWS, private endpoints should be located in the same region. -{{< /tip >}} - -{{< info >}} -For more information about the certificates used for private endpoints, please -refer to the [How to manage certificates](../security-and-access-control/x-509-certificates.md) -section. -{{< /info >}} - -## Google Cloud Platform (GCP) - -Google Cloud Platform (GCP) offers a feature called -[Private Service Connect](https://cloud.google.com/vpc/docs/private-service-connect) -that allows private consumption of services across VPC networks that belong to -different groups, teams, projects, or organizations. You can publish and consume -services using the defined IP addresses which are internal to your VPC network. - -In ArangoGraph, you can -[create a regular deployment](_index.md#how-to-create-a-new-deployment) -and change it to a private endpoint deployment afterwards. - -Such a deployment is not reachable from the internet anymore, other than via -the ArangoGraph dashboard to administrate it. To revert to a public deployment, -please contact support via **Request help** in the help menu. - -To configure a private endpoint for GCP, you need to provide your Google project -names. ArangoGraph then configures a **Private Endpoint Service** that automatically -connect to private endpoints that are created for those projects. - -After the creation of the **Private Endpoint Service**, you should receive a -service attachment that you need during the creation of your private endpoint(s). - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment Private Endpoint Menu](../../../images/arangograph-gcp-change.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Enter one or more Google project names. You can also add them later in the summary view. - Click **Next**. - ![ArangoGraph Deployment Private Endpoint Setup 2](../../../images/arangograph-gcp-private-endpoint.png) -6. Configure custom DNS names. This step is optional and disabled by default. - Note that, once enabled, this setting is immutable and cannot be reverted. - Click **Next** to continue. - {{< info >}} - By default, your private endpoint is available to all VPCs that connect to it - at `https://<endpoint_id>-pe.arangodb.cloud` with the - [well-known certificate](../security-and-access-control/x-509-certificates.md#well-known-x509-certificates). - If the custom DNS is enabled, you will be responsible for the DNS of your - private endpoints. - {{< /info >}} - ![ArangoGraph Private Endpoint Custom DNS](../../../images/arangograph-gcp-custom-dns.png) -7. Click **Confirm Settings** to change the deployment. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and to change the - configuration. -9. ArangoGraph configures a **Private Endpoint Service**. As soon as the - **Service Attachment** is ready, you can use it to configure the Private - Service Connect in your VPC. - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} - -## Amazon Web Services (AWS) - -AWS offers a feature called [AWS PrivateLink](https://aws.amazon.com/privatelink) -that enables you to privately connect your Virtual Private Cloud (VPC) to -services, without exposure to the internet. You can control the specific API -endpoints, sites, and services that are reachable from your VPC. - -Amazon VPC allows you to launch AWS resources into a -virtual network that you have defined. It closely resembles a traditional -network that you would normally operate, with the benefits of using the AWS -scalable infrastructure. - -In ArangoGraph, you can -[create a regular deployment](_index.md#how-to-create-a-new-deployment) and change it -to a private endpoint deployment afterwards. - -The ArangoDB private endpoint deployment is not exposed to public internet -anymore, other than via the ArangoGraph dashboard to administrate it. To revert -it to a public deployment, please contact the support team via **Request help** -in the help menu. - -To configure a private endpoint for AWS, you need to provide the AWS principals related -to your VPC. The ArangoGraph Insights Platform configures a **Private Endpoint Service** -that automatically connects to private endpoints that are created in those principals. - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment AWS Change to Private Endpoint](../../../images/arangograph-aws-change-to-private-endpoint.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Click **Add Principal** to start configuring the AWS principal(s). - You need to enter a valid account, which is your 12 digit AWS account ID. - Adding usernames or role names is optional. You can also - skip this step and add them later from the summary view. - {{< info >}} - Principals cannot be changed anymore once a connection has been established. - {{< /info >}} - {{< warning >}} - To verify your endpoint service in AWS, you must use the same principal as - configured in ArangoGraph. Otherwise, the service name cannot be verified. - {{< /warning >}} - ![ArangoGraph AWS Private Endpoint Configure Principals](../../../images/arangograph-aws-endpoint-configure-principals.png) -6. Configure custom DNS names. This step is optional and disabled by default, - you can also add or change them later from the summary view. - Click **Next** to continue. - {{< info >}} - By default, your private endpoint is available to all VPCs that connect to it - at `https://<endpoint_id>-pe.arangodb.cloud` with the well-known certificate. - If the custom DNS is enabled, you will be responsible for the DNS of your - private endpoints. - {{< /info >}} - ![ArangoGraph AWS Private Endpoint Alternate DNS](../../../images/arangograph-aws-private-endpoint-dns.png) -7. Confirm that you want to use a private endpoint for your deployment by - clicking **Confirm Settings**. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and change the - configuration, if needed. - ![ArangoGraph AWS Private Endpoint Overview](../../../images/arangograph-aws-private-endpoint-overview.png) - {{< info >}} - Note that - [Availability Zones](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones) - are independently mapped for each AWS account. The physical location of a - zone may differ from one account to another account. To coordinate - Availability Zones across AWS accounts, you must use the - [Availability Zone ID](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html). - {{< /info >}} - - {{< tip >}} - To learn more or request help from the ArangoGraph support team, click **Help** - in the top right corner of the **Private Endpoint** section. - {{< /tip >}} -9. ArangoGraph configures a **Private Endpoint Service**. As soon as this is available, - you can use it in the AWS portal to create an interface endpoint to connect - to your endpoint service. For more details, see - [How to connect to an endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html#share-endpoint-service). - -{{< tip >}} -To establish connectivity and enable traffic flow, make sure you add a route -from the originating machine to the interface endpoint. -{{< /tip >}} - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} diff --git a/site/content/3.11/arangograph/deployments/upgrades-and-versioning.md b/site/content/3.11/arangograph/deployments/upgrades-and-versioning.md deleted file mode 100644 index 211d271c92..0000000000 --- a/site/content/3.11/arangograph/deployments/upgrades-and-versioning.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Upgrades and Versioning in ArangoGraph -menuTitle: Upgrades and Versioning -weight: 10 -description: >- - Select which version of ArangoDB you want to use within your ArangoGraph - deployment and choose when to roll out your upgrades ---- -{{< info >}} -Please note that this policy comes into effect in April 2023. -{{< /info >}} - -## Release Definitions - -The following definitions are used for release types of ArangoDB within ArangoGraph: - -| Release | Introduces | Contains breaking changes | -|----------|-------------|----------------------------| -| **Major** (`X.y.z`) | Major new features and functionalities | Likely large changes | -| **Minor** (`x.Y.z`) | Some new features or improvements | Likely small changes | -| **Patch** (`x.y.Z`) | Essential fixes and improvements | Small changes in exceptional circumstances | - -## Release Channels - -When creating a deployment in ArangoGraph, you can select the minor version -of ArangoDB that your deployment is going to use. This minor version is in the -format `Major.Minor` and indicates the major and minor version of ArangoDB that -is used in this deployment, for example `3.10` or `3.9`. - -To provide secure and reliable service, databases are deployed on the latest -available patch version in the selected version. For example, if `3.10` is -selected and `3.10.3` is the latest version of ArangoDB available for the `3.10` -minor version, then the deployment is initially using ArangoDB `3.10.3`. - -## Upgrades - -### Manual Upgrades - -At any time, you can change the release channel of your deployment to a later -release channel, but not to an earlier one. For example, if you are using `3.10` -then you can change your deployment’s release channel to `3.11`, but you would -not be able to change the release channel to `3.9`. -See [how to edit a deployment](_index.md#how-to-edit-a-deployment). - -Upon changing your release channel, an upgrade process for your deployment is -initiated to upgrade your running database to the latest patch release of your -selected release channel. You can use this mechanism to upgrade your deployments -at a time that suits you, prior to the forced upgrade when your release channel -is no longer available. - -### Automatic Upgrades - -#### Major Versions (`X.y.z`) - -The potential disruption of a major version upgrade requires additional testing -of any applications connecting to your ArangoGraph deployment. As a result, when -a new major version is released on the ArangoGraph platform, an email is sent out -to inform you of this release. - -If the ArangoDB version that you are currently using is no longer available on the -ArangoGraph platform, you are forced to upgrade to the next available version. -Prior to the removal of the version, an email is sent out to inform you of this -forced upgrade. - -#### Minor Versions (`x.Y.z`) - -Although minor upgrades are not expected to cause significant compatibility -changes like major versions, they may still require additional planning and -validation. - -This is why minor upgrades are treated in the same manner as major upgrades -within ArangoGraph. When a new minor version is released on the ArangoGraph -platform, an email is sent out to inform you of this release. - -If the ArangoDB version that you are currently using is no longer available on the -ArangoGraph platform, you are forced to upgrade to the next available version. -Prior to the removal of the version, an email is sent out to inform you of this -forced upgrade. - -#### Patch Versions (`x.y.Z`) - -Upgrades between patch versions are transparent, with no significant disruption -to your applications. As such, you can expect to be automatically upgraded to -the latest patch version of your selected minor version shortly after it becomes -available in ArangoGraph. - -ArangoGraph aims to give approximately one week’s notice prior to upgrading your -deployments to the latest patch release. Although in exceptional circumstances -(such as a critical security issue) the upgrade may be triggered with less than -one week's notice. -The upgrade is carried out automatically. However, if you need the upgrade to be -deferred temporarily, contact the ArangoGraph Support team to request that. diff --git a/site/content/3.11/arangograph/monitoring-and-metrics.md b/site/content/3.11/arangograph/monitoring-and-metrics.md deleted file mode 100644 index 2b9ede4b4a..0000000000 --- a/site/content/3.11/arangograph/monitoring-and-metrics.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Monitoring & Metrics in ArangoGraph -menuTitle: Monitoring & Metrics -weight: 40 -description: >- - ArangoGraph provides various built-in tools and integrations to help you - monitor your deployment ---- -The ArangoGraph Insights Platform provides integrated charts, metrics, and logs -to help you monitor your deployment. This allows you to track your deployment's -performance, resource utilization, and its overall status. - -The key features include: -- **Built-in monitoring**: Get immediate access to monitoring capabilities for - your deployments without any additional setup. -- **Chart-based metrics representation**: Visualize the usage of the DB-Servers - and Coordinators over a selected timeframe. -- **Integration with Prometheus and Grafana**: Connect your metrics to Prometheus - and Grafana for in-depth visualization and analysis. - -To get started, select an existing deployment from within a project and -click **Monitoring** in the navigation. - -![ArangoGraph Monitoring tab](../../images/arangograph-monitoring-tab.png) - -## Built-in monitoring and metrics - -### In the **Servers** section - -The **Servers** section offers an overview of the DB-Servers, Coordinators, -and Agents used in your deployment. It provides essential details such as each -server's ID and type, the running ArangoDB version, as well as their memory, -CPU, and disk usage. - -In case you need to perform a restart on a server, you can do so by using the -**Gracefully restart this server** action button. This shuts down all services -normally, allowing ongoing operations to finish gracefully before the restart -occurs. - -Additionally, you can access detailed logs via the **Logs** button. This allows -you to apply filters to obtain logs from all server types or select specific ones -(i.e. only Coordinators or only DB-Servers) within a timeframe. To download the -logs, click the **Save** button. - -![ArangoGraph Monitoring Servers](../../images/arangograph-monitoring-servers.png) - -### In the **Metrics** section - -The **Metrics** section displays a chart-based representation depicting the -resource utilization of DB-Servers and Coordinators within a specified timeframe. - -You can select one or more DB-Servers and choose **CPU**, **Memory**, or **Disk** -to visualize their respective usage. The search box enables you to easily find -a server by its ID, particularly useful when having a large number of servers -or when needing to quickly find a particular one among many. - -Similarly, you can repeat the process for Coordinators to see the **CPU** and -**Memory** usage. - -![Arangograph Monitoring Metrics Chart](../../images/arangograph-monitoring-metrics-chart.png) - -## Connect with Prometheus and Grafana - -The ArangoGraph Insights Platform provides metrics for each deployment in a -[Prometheus](https://prometheus.io/)-compatible format. -You can use these metrics to gather detailed insights into the current -and previous states of your deployment. -Once metrics are collected by Prometheus, you can inspect them using tools -such as [Grafana](https://grafana.com/oss/grafana/). - -![ArangoGraph Connect Metrics Section](../../images/arangograph-connect-metrics-section.png) - -### Metrics tokens - -The **Metrics tokens** section allows you to create a new metrics token, -which is required for connecting to Prometheus. - -1. To create a metrics token, click **New metrics token**. -2. For **Name**, enter a name for the metrics token. -3. Optionally, you can also enter a **Short description**. -4. Select the **Lifetime** of the metrics token. -5. Click **Create**. - -![ArangoGraph Metrics Tokens](../../images/arangograph-metrics-token.png) - -### How to connect Prometheus - -1. In the **Metrics** section, click **Connect Prometheus**. -2. Create the `prometheus.yml` file with the following content: - ```yaml - global: - scrape_interval: 60s - scrape_configs: - - job_name: 'deployment' - bearer_token: '<fill-your-metrics-token-here>' - scheme: 'https' - static_configs: - - targets: ['6775e7d48152.arangodb.cloud:8829'] - tls_config: - insecure_skip_verify: true - ``` -3. Start Prometheus with the following command: - ```sh - docker run -d \ - -p 9090:9090 -p 3000:3000 --name prometheus \ - -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml:ro \ - prom/prometheus - ``` - {{< info >}} - This command also opens a port 3000 for Grafana. In a production environment, - this is not needed and not recommended to have it open. - {{< /info >}} - -### How to connect Grafana - -1. Start Grafana with the following command: - ```sh - docker run -d \ - --network container:prometheus \ - grafana/grafana - ``` -2. Go to `localhost:3000` and log in with the following credentials: - - For username, enter *admin*. - - For password, enter *admin*. - - {{< tip >}} - After the initial login, make sure to change your password. - {{< /tip >}} - -3. To add a data source, click **Add your first data source** and then do the following: - - Select **Prometheus**. - - For **HTTP URL**, enter `http://localhost:9090`. - - Click **Save & Test**. -4. To add a dashboard, open the menu and click **Create** and then **Import**. -5. Download the [Grafana dashboard for ArangoGraph](https://github.com/arangodb-managed/grafana-dashboards). -6. Copy the contents of the `main.json` file into the **Import via panel json** field in Grafana. -7. Click **Load**. diff --git a/site/content/3.11/arangograph/my-account.md b/site/content/3.11/arangograph/my-account.md deleted file mode 100644 index e79415060a..0000000000 --- a/site/content/3.11/arangograph/my-account.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: My Account in ArangoGraph -menuTitle: My Account -weight: 35 -description: >- - How to manage your user account, your organizations, and your API keys in ArangoGraph ---- -You can access information related to your account via the __User Toolbar__. -The toolbar is in the top right corner in the ArangoGraph dashboard and -accessible from every view. There are two elements: - -- __Question mark icon__: Help -- __User icon__: My Account - -![ArangoGraph My Account](../../images/arangograph-my-account.png) - -## Overview - -### How to view my account - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __Overview__ in the __My account__ section. -3. The __Overview__ displays your name, email address, company and when the - account was created. - -### How to edit the profile of my account - -1. Hover over or click the user icon in the __User Toolbar__ in the top right corner. -2. Click __Overview__ in the __My account__ section. -3. Click the __Edit__ button. -4. Change your personal information and __Save__. - -![ArangoGraph My Account Info](../../images/arangograph-my-account-info.png) - -## Organizations - -### How to view my organizations - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Your organizations are listed in a table. - Click the organization name or the eye icon in the __Actions__ column to - jump to the organization overview. - -### How to create a new organization - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Click the __New organization__ button. -4. Enter a name and and a description for the new organization and click the - __Create__ button. - -{{< info >}} -The free to try tier is limited to a single organization. -{{< /info >}} - -### How to delete an organization - -{{< danger >}} -Removing an organization implies the deletion of projects and deployments. -This operation cannot be undone and **all deployment data will be lost**. -Please proceed with caution. -{{< /danger >}} - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Click the __recycle bin__ icon in the __Actions__ column. -4. Enter `Delete!` to confirm and click __Yes__. - -{{< info >}} -If you are no longer a member of any organization, then a new organization is -created for you when you log in again. -{{< /info >}} - -![ArangoGraph New Organization](../../images/arangograph-new-org.png) - -## Invites - -Invitations are requests to join organizations. You can accept or reject -pending invites. - -### How to create invites - -See [Users and Groups: How to add a new member to the organization](organizations/users-and-groups.md#how-to-add-a-new-member-to-the-organization) - -### How to respond to my invites - -#### I am not a member of an organization yet - -1. Once invited, you will receive an email asking to join your - ArangoGraph organization. - ![ArangoGraph Organization Invite Email](../../images/arangograph-org-invite-email.png) -2. Click the __View my organization invite__ link in the email. You will be - asked to log in or to create a new account. -3. To sign up for a new account, click the __Start Free__ button or the - __Sign up__ link in the header navigation. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) -4. After successfully signing up, you will receive a verification email. -5. Click the __Verify my email address__ link in the email. It takes you back - to the ArangoGraph Insights Platform site. - ![ArangoGraph Organization Invite Email Verify](../../images/arangograph-org-invite-email-verify.png) -6. After successfully logging in, you can accept or reject the invite to - join your organization. - ![ArangoGraph Organization Invite](../../images/arangograph-org-invite.png) -7. After accepting the invite, you become a member of your organization and - will be granted access to the organization and its related projects and - deployments. - -#### I am already a member of an organization - -1. Once invited, you will receive an email asking to join your - ArangoGraph organization, as well as a notification in the ArangoGraph dashboard. -2. Click the __View my organization invites__ link in the email, or hover over the - user icon in the top right corner of the dashboard and click - __My organization invites__. - ![ArangoGraph Organization Invite Notification](../../images/arangograph-org-invite-notification.png) -3. On the __Invites__ tab of the __My account__ view, you can accept or reject - pending invitations, as well as see past invitations that you accepted or - rejected. Click the button with a checkmark icon to join the organization. - ![ArangoGraph Organization Invites Accept](../../images/arangograph-org-invites-accept.png) - -## API Keys - -API keys are authentication tokens intended to be used for scripting. -They allow a script to authenticate on behalf of a user. - -An API key consists of a key and a secret. You need both to complete -authentication. - -### How to view my API keys - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Information about the API keys are listed in the __My API keys__ section. - -![ArangoGraph My API keys](../../images/arangograph-my-api-keys.png) - -### How to create a new API key - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Click the __New API key__ button. -4. Optionally limit the API key to a specific organization. -5. Optionally specify after how many hours the API key should expire into the - __Time to live__ field. -6. Optionally limit the API key to read-only APIs -7. Click the __Create__ button. -8. Copy the API key ID and Secret, then click the __Close__ button. - -{{< security >}} -The secret is only shown once at creation time. -You have to store it in a safe place. -{{< /security >}} - -![ArangoGraph New API key](../../images/arangograph-new-api-key.png) - -![ArangoGraph API key Secret](../../images/arangograph-api-key-secret.png) - -### How to revoke or delete an API key - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Click an icon in the __Actions__ column: - - __Counter-clockwise arrow__ icon: Revoke API key - - __Recycle bin__ icon: Delete API key -4. Click the __Yes__ button to confirm. - -{{% comment %}} -TODO: Copy to clipboard button -Access token that should expire after 1 hour unless renewed, might get removed as it's confusing. -{{% /comment %}} diff --git a/site/content/3.11/arangograph/notebooks.md b/site/content/3.11/arangograph/notebooks.md deleted file mode 100644 index b581dc44d8..0000000000 --- a/site/content/3.11/arangograph/notebooks.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: ArangoGraph Notebooks -menuTitle: Notebooks -weight: 25 -description: >- - How to create and manage colocated Jupyter Notebooks within ArangoGraph ---- -{{< info >}} -This documentation describes the beta version of the Notebooks feature and is -subject to change. The beta version is free for all. -{{< /info >}} - -The ArangoGraph Notebook is a JupyterLab notebook embedded in the ArangoGraph -Insights Platform. The notebook integrates seamlessly with platform, -automatically connecting to ArangoGraph services, including ArangoDB and the -ArangoML platform services. This makes it much easier to leverage these -resources without having to download any data locally or to remember user IDs, -passwords, and endpoint URLs. - -![ArangoGraph Notebooks Architecture](../../images/arangograph-notebooks-architecture.png) - -The ArangoGraph Notebook has built-in [ArangoGraph Magic Commands](#arangograph-magic-commands) -that answer questions like: -- What ArangoDB database am I connected to at the moment? -- What data does the ArangoDB instance contain? -- How can I access certain documents? -- How do I create a graph? - -The ArangoGraph Notebook also pre-installs [python-arango](https://docs.python-arango.com/en/main/) -and ArangoML connectors -to [PyG](https://github.com/arangoml/pyg-adapter), -[DGL](https://github.com/arangoml/dgl-adapter), -[CuGraph](https://github.com/arangoml/cugraph-adapter), as well as the -[FastGraphML](https://github.com/arangoml/fastgraphml) -library, so you can get started -right away accessing data in ArangoDB to develop GraphML models using your -favorite GraphML libraries with GPUs. - -## How to create a new notebook - -1. Open the deployment in which you want to create the notebook. -2. Go to the **Data science** section and click the **Create Notebook** button. -3. Enter a name and optionally a description for your new notebook. -4. Select a configuration model from the dropdown menu. Click **Save**. -5. The notebook's phase is set to **Initializing**. Once the phase changes to - **Running**, the notebook's endpoint is accessible. -6. Click the **Open notebook** button to access your notebook. -7. To access your notebook, you need to be signed into ArangoGraph as a user with - the `notebook.notebook.execute` permission in your project. Organization - owners have this permission enabled by default. The `notebook-executor` role - which contains the permission can also be granted to other members of the - organization via roles. See how to create a - [role binding](security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy). - -{{< info >}} -Depending on the tier your organization belongs to, different limitations apply: -- On-Demand and Committed: you can create up to three notebooks per deployment. -- Free-to-try: you can only create one notebook per deployment. -{{< /info >}} - -![Notebooks](../../images/arangograph-notebooks.png) - -{{< info >}} -Notebooks in beta version have a fixed configuration of 10 GB of disk size. -{{< /info >}} - -## How to edit a notebook - -1. Select the notebook that you want to change from the **Notebooks** tab. -2. Click **Edit notebook**. You can modify its name and description. -3. To pause a notebook, click the **Pause notebook** button. You can resume it -at anytime. The notebook's phase is updated accordingly. - -## How to delete a notebook - -1. Select the notebook that you want to remove from the **Notebooks** tab. -2. Click the **Delete notebook** button. - -## Getting Started notebook - -To get a better understanding of how to interact with your ArangoDB database -cluster, use the ArangoGraph Getting Started template. -The ArangoGraph Notebook automatically connects to the ArangoDB service -endpoint, so you can immediately start interacting with it. - -1. Log in to the notebook you have created by using your deployment's root password. -2. Select the `GettingStarted.ipynb` template from the file browser. - -## ArangoGraph Magic Commands - -A list of the available magic commands you can interact with. -Single line commands have `%` prefix and multi-line commands have `%%` prefix. - -**Database Commands** - -- `%listDatabases` - lists the databases on the database server. -- `%whichDatabase` - returns the database name you are connected to. -- `%createDatabase databaseName` - creates a database. -- `%selectDatabase databaseName` - selects a database as the current database. -- `%useDatabase databasename` - uses a database as the current database; - alias for `%selectDatabase`. -- `%getDatabase databaseName` - gets a database. Used for assigning a database, - e.g. `studentDB` = `getDatabase student_database`. -- `%deleteDatabase databaseName` - deletes the database. - -**Graph Commands** - -- `%listGraphs` - lists the graphs defined in the currently selected database. -- `%whichGraph` - returns the graph name that is currently selected. -- `%createGraph graphName` - creates a named graph. -- `%selectGraph graphName` - selects the graph as the current graph. -- `%useGraph graphName` - uses the graph as the current graph; - alias for `%selectGraph`. -- `%getGraph graphName` - gets the graph for variable assignment, - e.g. `studentGraph` = `%getGraph student-graph`. -- `%deleteGraph graphName` - deletes a graph. - -**Collection Commands** - -- `%listCollections` - lists the collections on the selected current database. -- `%whichCollection` - returns the collection name that is currently selected. -- `%createCollection collectionName` - creates a collection. -- `%selectCollection collectionName` - selects a collection as the current collection. -- `%useCollection collectionName` - uses the collection as the current collection; - alias for `%selectCollection`. -- `%getCollection collectionName` - gets a collection for variable assignment, - e.g. `student` = `% getCollection Student`. -- `%createEdgeCollection` - creates an edge collection. -- `%createVertexCollection` - creates a vertex collection. -- `%createEdgeDefinition` - creates an edge definition. -- `%deleteCollection collectionName` - deletes the collection. -- `%truncateCollection collectionName` - truncates the collection. -- `%sampleCollection collectionName` - returns a random document from the collection. - If no collection is specified, then it uses the selected collection. - -**Document Commands** - -- `%insertDocument jsonDocument` - inserts the document into the currently selected collection. -- `%replaceDocument jsonDocument` - replaces the document in the currently selected collection. -- `%updateDocument jsonDocument` - updates the document in the currently selected collection. -- `%deleteDocument jsonDocument` - deletes the document from the currently selected collection. -- `%%importBulk jsonDocumentArray` - imports an array of documents into the currently selected collection. - -**AQL Commands** - -- `%aql single-line_aql_query` - executes a single line AQL query. -- `%%aqlm multi-line_aql_query` - executes a multi-line AQL query. - -**Variables** - -- `_endpoint` - the endpoint (URL) of the ArangoDB Server. -- `_system` - the system database used for creating, listing, and deleting databases. -- `_db` - the selected (current) database. To select a different database, use `%selectDatabase`. -- `_graph` - the selected (current) graph. To select a different graph, use `%selectGraph`. -- `_collection` - the selected (current) collection. To select a different collection, use `%selectCollection`. -- `_user` - the current user. - -You can use these variables directly, for example, `_db.collections()` to list -collections or `_system.databases` to list databases. - -You can also create your own variable assignments, such as: - -- `schoolDB` = `%getDatabase schoolDB` -- `school_graph` = `%getGraph school_graph` -- `student` = `%getCollection Student` - -**Reset environment** - -In the event that any of the above variables have been unintentionally changed, -you can revert all of them to the default state with `reset_environment()`. diff --git a/site/content/3.11/arangograph/oasisctl/_index.md b/site/content/3.11/arangograph/oasisctl/_index.md deleted file mode 100644 index 9d22a68e31..0000000000 --- a/site/content/3.11/arangograph/oasisctl/_index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Oasisctl -menuTitle: Oasisctl -weight: 65 -description: >- - Command-line client tool for managing the ArangoGraph Insights Platform ---- -Oasisctl is a command-line tool for using the [ArangoGraph API](../api/_index.md). -This tool makes integration of ArangoGraph in all kinds of (bash) scripts easy. -It is also a good example on how to use the API. - -See [Getting started with Oasisctl](../api/get-started.md) for a -tutorial. - -Oasisctl is available for Linux, macOS and Windows. -Download and source code: - -[github.com/arangodb-managed/oasisctl](https://github.com/arangodb-managed/oasisctl/) diff --git a/site/content/3.11/arangograph/oasisctl/accept/_index.md b/site/content/3.11/arangograph/oasisctl/accept/_index.md deleted file mode 100644 index e9c0e05a01..0000000000 --- a/site/content/3.11/arangograph/oasisctl/accept/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Accept -menuTitle: Accept -weight: 2 ---- -## oasisctl accept - -Accept invites - -``` -oasisctl accept [flags] -``` - -## Options -``` - -h, --help help for accept -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl accept organization](accept-organization.md) - Accept organization related invites - diff --git a/site/content/3.11/arangograph/oasisctl/accept/accept-organization-invite.md b/site/content/3.11/arangograph/oasisctl/accept/accept-organization-invite.md deleted file mode 100644 index 3f52fbb67b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/accept/accept-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Accept Organization Invite -menuTitle: Accept Organization Invite -weight: 2 ---- -## oasisctl accept organization invite - -Accept an organization invite the authenticated user has access to - -``` -oasisctl accept organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept organization](accept-organization.md) - Accept organization related invites - diff --git a/site/content/3.11/arangograph/oasisctl/accept/accept-organization.md b/site/content/3.11/arangograph/oasisctl/accept/accept-organization.md deleted file mode 100644 index f4d5310a16..0000000000 --- a/site/content/3.11/arangograph/oasisctl/accept/accept-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Accept Organization -menuTitle: Accept Organization -weight: 1 ---- -## oasisctl accept organization - -Accept organization related invites - -``` -oasisctl accept organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept](_index.md) - Accept invites -* [oasisctl accept organization invite](accept-organization-invite.md) - Accept an organization invite the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/add/_index.md b/site/content/3.11/arangograph/oasisctl/add/_index.md deleted file mode 100644 index c44318f848..0000000000 --- a/site/content/3.11/arangograph/oasisctl/add/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Add -menuTitle: Add -weight: 3 ---- -## oasisctl add - -Add resources - -``` -oasisctl add [flags] -``` - -## Options -``` - -h, --help help for add -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl add auditlog](add-auditlog.md) - Add auditlog resources -* [oasisctl add group](add-group.md) - Add group resources - diff --git a/site/content/3.11/arangograph/oasisctl/add/add-auditlog-destination.md b/site/content/3.11/arangograph/oasisctl/add/add-auditlog-destination.md deleted file mode 100644 index 378e456833..0000000000 --- a/site/content/3.11/arangograph/oasisctl/add/add-auditlog-destination.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Oasisctl Add Audit Log Destination -menuTitle: Add Audit Log Destination -weight: 2 ---- -## oasisctl add auditlog destination - -Add a destination to an auditlog. - -``` -oasisctl add auditlog destination [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - --destination-excluded-topics strings Do not send audit events with these topics to this destination. - --destination-https-client-certificate-pem string PEM encoded public key of the client certificate. - --destination-https-client-key-pem string PEM encoded private key of the client certificate. - --destination-https-headers strings A key=value formatted list of headers for the request. Repeating headers are allowed. - --destination-https-trusted-server-ca-pem string PEM encoded public key of the CA used to sign the server TLS certificate. If empty, a well known CA is expected. - --destination-https-url string URL of the server to POST to. Scheme must be HTTPS. - --destination-type string Type of destination. Possible values are: "cloud", "https-post" - -h, --help help for destination - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add auditlog](add-auditlog.md) - Add auditlog resources - diff --git a/site/content/3.11/arangograph/oasisctl/add/add-auditlog.md b/site/content/3.11/arangograph/oasisctl/add/add-auditlog.md deleted file mode 100644 index dca21fda97..0000000000 --- a/site/content/3.11/arangograph/oasisctl/add/add-auditlog.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Add Audit Log -menuTitle: Add Audit Log -weight: 1 ---- -## oasisctl add auditlog - -Add auditlog resources - -``` -oasisctl add auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add](_index.md) - Add resources -* [oasisctl add auditlog destination](add-auditlog-destination.md) - Add a destination to an auditlog. - diff --git a/site/content/3.11/arangograph/oasisctl/add/add-group-members.md b/site/content/3.11/arangograph/oasisctl/add/add-group-members.md deleted file mode 100644 index db2677d276..0000000000 --- a/site/content/3.11/arangograph/oasisctl/add/add-group-members.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Add Group Members -menuTitle: Add Group Members -weight: 4 ---- -## oasisctl add group members - -Add members to group - -``` -oasisctl add group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group to add members to - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add group](add-group.md) - Add group resources - diff --git a/site/content/3.11/arangograph/oasisctl/add/add-group.md b/site/content/3.11/arangograph/oasisctl/add/add-group.md deleted file mode 100644 index a51b0b7102..0000000000 --- a/site/content/3.11/arangograph/oasisctl/add/add-group.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Add Group -menuTitle: Add Group -weight: 3 ---- -## oasisctl add group - -Add group resources - -``` -oasisctl add group [flags] -``` - -## Options -``` - -h, --help help for group -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add](_index.md) - Add resources -* [oasisctl add group members](add-group-members.md) - Add members to group - diff --git a/site/content/3.11/arangograph/oasisctl/auditlog/_index.md b/site/content/3.11/arangograph/oasisctl/auditlog/_index.md deleted file mode 100644 index fd71b3b653..0000000000 --- a/site/content/3.11/arangograph/oasisctl/auditlog/_index.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Audit Log -menuTitle: Audit Log -weight: 4 ---- -## oasisctl auditlog - -AuditLog resources - -``` -oasisctl auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl auditlog attach](auditlog-attach.md) - Attach a project to an audit log -* [oasisctl auditlog detach](auditlog-detach.md) - Detach a project from an auditlog -* [oasisctl auditlog get](auditlog-get.md) - Audit log get resources - diff --git a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-attach.md b/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-attach.md deleted file mode 100644 index 7ffcd50360..0000000000 --- a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-attach.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Audit Log Attach -menuTitle: Audit Log Attach -weight: 1 ---- -## oasisctl auditlog attach - -Attach a project to an audit log - -``` -oasisctl auditlog attach [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to attach to. - -h, --help help for attach - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources - diff --git a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-detach.md b/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-detach.md deleted file mode 100644 index 4043614c32..0000000000 --- a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-detach.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Audit Log Detach -menuTitle: Audit Log Detach -weight: 2 ---- -## oasisctl auditlog detach - -Detach a project from an auditlog - -``` -oasisctl auditlog detach [flags] -``` - -## Options -``` - -h, --help help for detach - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources - diff --git a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md b/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md deleted file mode 100644 index b4c2a69666..0000000000 --- a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Audit Log Get Attached Project -menuTitle: Audit Log Get Attached Project -weight: 5 ---- -## oasisctl auditlog get attached project - -Get an attached log to a project - -``` -oasisctl auditlog get attached project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog get attached](auditlog-get-attached.md) - Audit get attached resources - diff --git a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached.md b/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached.md deleted file mode 100644 index 004400da64..0000000000 --- a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get-attached.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Audit Log Get Attached -menuTitle: Audit Log Get Attached -weight: 4 ---- -## oasisctl auditlog get attached - -Audit get attached resources - -``` -oasisctl auditlog get attached [flags] -``` - -## Options -``` - -h, --help help for attached -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog get](auditlog-get.md) - Audit log get resources -* [oasisctl auditlog get attached project](auditlog-get-attached-project.md) - Get an attached log to a project - diff --git a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get.md b/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get.md deleted file mode 100644 index d3b170c666..0000000000 --- a/site/content/3.11/arangograph/oasisctl/auditlog/auditlog-get.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Audit Log Get -menuTitle: Audit Log Get -weight: 3 ---- -## oasisctl auditlog get - -Audit log get resources - -``` -oasisctl auditlog get [flags] -``` - -## Options -``` - -h, --help help for get -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources -* [oasisctl auditlog get attached](auditlog-get-attached.md) - Audit get attached resources - diff --git a/site/content/3.11/arangograph/oasisctl/backup/_index.md b/site/content/3.11/arangograph/oasisctl/backup/_index.md deleted file mode 100644 index 2a19e74e37..0000000000 --- a/site/content/3.11/arangograph/oasisctl/backup/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Backup -menuTitle: Backup -weight: 5 ---- -## oasisctl backup - -Backup commands - -``` -oasisctl backup [flags] -``` - -## Options -``` - -h, --help help for backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl backup copy](backup-copy.md) - Copy a backup from source backup to given region -* [oasisctl backup download](backup-download.md) - Download a backup - diff --git a/site/content/3.11/arangograph/oasisctl/backup/backup-copy.md b/site/content/3.11/arangograph/oasisctl/backup/backup-copy.md deleted file mode 100644 index b492b5d92b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/backup/backup-copy.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Backup Copy -menuTitle: Backup Copy -weight: 1 ---- -## oasisctl backup copy - -Copy a backup from source backup to given region - -``` -oasisctl backup copy [flags] -``` - -## Options -``` - -h, --help help for copy - --region-id string Identifier of the region where the new backup is to be created - --source-backup-id string Identifier of the source backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl backup](_index.md) - Backup commands - diff --git a/site/content/3.11/arangograph/oasisctl/backup/backup-download.md b/site/content/3.11/arangograph/oasisctl/backup/backup-download.md deleted file mode 100644 index b458b57b48..0000000000 --- a/site/content/3.11/arangograph/oasisctl/backup/backup-download.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Backup Download -menuTitle: Backup Download -weight: 2 ---- -## oasisctl backup download - -Download a backup - -## Synopsis -Download a backup from the cloud storage to the local deployment disks, so it can be restored. - -``` -oasisctl backup download [flags] -``` - -## Options -``` - -h, --help help for download - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl backup](_index.md) - Backup commands - diff --git a/site/content/3.11/arangograph/oasisctl/clone/_index.md b/site/content/3.11/arangograph/oasisctl/clone/_index.md deleted file mode 100644 index 7edaf4178e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/clone/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Clone -menuTitle: Clone -weight: 6 ---- -## oasisctl clone - -Clone resources - -``` -oasisctl clone [flags] -``` - -## Options -``` - -h, --help help for clone -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl clone deployment](clone-deployment.md) - Clone deployment resources - diff --git a/site/content/3.11/arangograph/oasisctl/clone/clone-deployment-backup.md b/site/content/3.11/arangograph/oasisctl/clone/clone-deployment-backup.md deleted file mode 100644 index 5f98d22b91..0000000000 --- a/site/content/3.11/arangograph/oasisctl/clone/clone-deployment-backup.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Clone Deployment Backup -menuTitle: Clone Deployment Backup -weight: 2 ---- -## oasisctl clone deployment backup - -Clone a deployment from a backup. - -``` -oasisctl clone deployment backup [flags] -``` - -## Options -``` - --accept Accept the current terms and conditions. - -b, --backup-id string Clone a deployment from a backup using the backup's ID. - -h, --help help for backup - -o, --organization-id string Identifier of the organization to create the clone in - -p, --project-id string An optional identifier of the project to create the clone in - -r, --region-id string An optionally defined region in which the new deployment should be created in. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl clone deployment](clone-deployment.md) - Clone deployment resources - diff --git a/site/content/3.11/arangograph/oasisctl/clone/clone-deployment.md b/site/content/3.11/arangograph/oasisctl/clone/clone-deployment.md deleted file mode 100644 index 0b76d1fec8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/clone/clone-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Clone Deployment -menuTitle: Clone Deployment -weight: 1 ---- -## oasisctl clone deployment - -Clone deployment resources - -``` -oasisctl clone deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl clone](_index.md) - Clone resources -* [oasisctl clone deployment backup](clone-deployment-backup.md) - Clone a deployment from a backup. - diff --git a/site/content/3.11/arangograph/oasisctl/completion.md b/site/content/3.11/arangograph/oasisctl/completion.md deleted file mode 100644 index 9cd58cd4f6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/completion.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Oasisctl Completion -menuTitle: Completion -weight: 7 ---- -## oasisctl completion - -Generates bash completion scripts - -## Synopsis -To load completion run - - . <(oasisctl completion [bash|fish|powershell|zsh]) - -To configure your bash shell to load completions for each session add to your bashrc - - # ~/.bashrc or ~/.profile - . <(oasisctl completion bash) - - -``` -oasisctl completion [flags] -``` - -## Options -``` - -h, --help help for completion -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/create/_index.md b/site/content/3.11/arangograph/oasisctl/create/_index.md deleted file mode 100644 index 87ef865918..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/_index.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Oasisctl Create -menuTitle: Create -weight: 8 ---- -## oasisctl create - -Create resources - -``` -oasisctl create [flags] -``` - -## Options -``` - -h, --help help for create -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl create apikey](create-apikey.md) - Create a new API key -* [oasisctl create auditlog](create-auditlog.md) - Create an auditlog -* [oasisctl create backup](create-backup.md) - Create backup ... -* [oasisctl create cacertificate](create-cacertificate.md) - Create a new CA certificate -* [oasisctl create deployment](create-deployment.md) - Create a new deployment -* [oasisctl create example](create-example.md) - Create example ... -* [oasisctl create group](create-group.md) - Create a new group -* [oasisctl create ipallowlist](create-ipallowlist.md) - Create a new IP allowlist -* [oasisctl create metrics](create-metrics.md) - Create metrics resources -* [oasisctl create notebook](create-notebook.md) - Create a new notebook -* [oasisctl create organization](create-organization.md) - Create a new organization -* [oasisctl create private](create-private.md) - Create private resources -* [oasisctl create project](create-project.md) - Create a new project -* [oasisctl create role](create-role.md) - Create a new role - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-apikey.md b/site/content/3.11/arangograph/oasisctl/create/create-apikey.md deleted file mode 100644 index 1177d5cc67..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-apikey.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Create API Key -menuTitle: Create API Key -weight: 1 ---- -## oasisctl create apikey - -Create a new API key - -``` -oasisctl create apikey [flags] -``` - -## Options -``` - -h, --help help for apikey - -o, --organization-id string If set, the newly created API key will grant access to this organization only - --readonly If set, the newly created API key will grant readonly access only -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-auditlog.md b/site/content/3.11/arangograph/oasisctl/create/create-auditlog.md deleted file mode 100644 index 5863da66e8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Audit Log -menuTitle: Create Audit Log -weight: 2 ---- -## oasisctl create auditlog - -Create an auditlog - -``` -oasisctl create auditlog [flags] -``` - -## Options -``` - --default If set, this AuditLog is the default for the organization. - --description string Description of the audit log. - -h, --help help for auditlog - --name string Name of the audit log. - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-backup-policy.md b/site/content/3.11/arangograph/oasisctl/create/create-backup-policy.md deleted file mode 100644 index 99f899b951..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-backup-policy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Oasisctl Create Backup Policy -menuTitle: Create Backup Policy -weight: 4 ---- -## oasisctl create backup policy - -Create a new backup policy - -``` -oasisctl create backup policy [flags] -``` - -## Options -``` - --additional-region-ids strings Add backup to the specified addition regions - --day-of-the-month int32 Run the backup on the specified day of the month (1-31) (default 1) - --deployment-id string ID of the deployment - --description string Description of the backup policy - --email-notification string Email notification setting (Never|FailureOnly|Always) - --every-interval-hours int32 Schedule should run with an interval of the specified hours (1-23) - --friday If set, a backup will be created on Fridays. - -h, --help help for policy - --hours int32 Hours part of the time of day (0-23) - --minutes int32 Minutes part of the time of day (0-59) - --minutes-offset int32 Schedule should run with specific minutes offset (0-59) - --monday If set, a backup will be created on Mondays - --name string Name of the deployment - --paused The policy is paused - --retention-period int Backups created by this policy will be automatically deleted after the specified retention period. A value of 0 means that backup will never be deleted. - --saturday If set, a backup will be created on Saturdays - --schedule-type string Schedule of the policy (Hourly|Daily|Monthly) - --sunday If set, a backup will be created on Sundays - --thursday If set, a backup will be created on Thursdays - --time-zone string The time-zone this time of day applies to (empty means UTC). Names MUST be exactly as defined in RFC-822. (default "UTC") - --tuesday If set, a backup will be created on Tuesdays - --upload The backup should be uploaded - --wednesday If set, a backup will be created on Wednesdays -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create backup](create-backup.md) - Create backup ... - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-backup.md b/site/content/3.11/arangograph/oasisctl/create/create-backup.md deleted file mode 100644 index 8ca544206c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-backup.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create Backup -menuTitle: Create Backup -weight: 3 ---- -## oasisctl create backup - -Create backup ... - -``` -oasisctl create backup [flags] -``` - -## Options -``` - --auto-deleted-at int Time (h) until auto delete of the backup - --deployment-id string ID of the deployment - --description string Description of the backup - -h, --help help for backup - --name string Name of the deployment - --upload The backup should be uploaded -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create backup policy](create-backup-policy.md) - Create a new backup policy - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-cacertificate.md b/site/content/3.11/arangograph/oasisctl/create/create-cacertificate.md deleted file mode 100644 index b27b6e7db8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-cacertificate.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Create CA Certificate -menuTitle: Create CA Certificate -weight: 5 ---- -## oasisctl create cacertificate - -Create a new CA certificate - -``` -oasisctl create cacertificate [flags] -``` - -## Options -``` - --description string Description of the CA certificate - -h, --help help for cacertificate - --lifetime duration Lifetime of the CA certificate. - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization to create the CA certificate in - -p, --project-id string Identifier of the project to create the CA certificate in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-deployment.md b/site/content/3.11/arangograph/oasisctl/create/create-deployment.md deleted file mode 100644 index c9f633fd99..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-deployment.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Oasisctl Create Deployment -menuTitle: Create Deployment -weight: 6 ---- -## oasisctl create deployment - -Create a new deployment - -``` -oasisctl create deployment [flags] -``` - -## Options -``` - --accept Accept the current terms and conditions. - -c, --cacertificate-id string Identifier of the CA certificate to use for the deployment - --coordinator-memory-size int32 Set memory size of Coordinators for flexible deployments (GiB) (default 4) - --coordinators int32 Set number of Coordinators for flexible deployments (default 3) - --custom-image string Set a custom image to use for the deployment. Only available for selected customers. - --dbserver-disk-size int32 Set disk size of DB-Servers for flexible deployments (GiB) (default 32) - --dbserver-memory-size int32 Set memory size of DB-Servers for flexible deployments (GiB) (default 4) - --dbservers int32 Set number of DB-Servers for flexible deployments (default 3) - --deployment-profile-id string Set the Deployment Profile to use for this deployment. - --description string Description of the deployment - --disable-foxx-authentication Disable authentication of requests to Foxx application. - --disk-performance-id string Set the disk performance to use for this deployment. - --drop-vst-support Drop VST protocol support to improve resilience. - -h, --help help for deployment - -i, --ipallowlist-id string Identifier of the IP allowlist to use for the deployment - --is-platform-authentication-enabled Enable platform authentication for deployment. - --max-node-disk-size int32 Set maximum disk size for nodes for autoscaler (GiB) - --model string Set model of the deployment (default "oneshard") - --name string Name of the deployment - --node-count int32 Set the number of desired nodes (default 3) - --node-disk-size int32 Set disk size for nodes (GiB) - --node-size-id string Set the node size to use for this deployment - --notification-email-address strings Set email address(-es) that will be used for notifications related to this deployment. - -o, --organization-id string Identifier of the organization to create the deployment in - -p, --project-id string Identifier of the project to create the deployment in - -r, --region-id string Identifier of the region to create the deployment in - --version string Version of ArangoDB to use for the deployment (default "default") -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-example-installation.md b/site/content/3.11/arangograph/oasisctl/create/create-example-installation.md deleted file mode 100644 index 121d13dccd..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Example Installation -menuTitle: Create Example Installation -weight: 8 ---- -## oasisctl create example installation - -Create a new example dataset installation - -``` -oasisctl create example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -e, --example-dataset-id string ID of the example dataset - -h, --help help for installation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create example](create-example.md) - Create example ... - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-example.md b/site/content/3.11/arangograph/oasisctl/create/create-example.md deleted file mode 100644 index 5b1a50cf0e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Example -menuTitle: Create Example -weight: 7 ---- -## oasisctl create example - -Create example ... - -``` -oasisctl create example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create example installation](create-example-installation.md) - Create a new example dataset installation - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-group.md b/site/content/3.11/arangograph/oasisctl/create/create-group.md deleted file mode 100644 index d28e7ec7d2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-group.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Group -menuTitle: Create Group -weight: 9 ---- -## oasisctl create group - -Create a new group - -``` -oasisctl create group [flags] -``` - -## Options -``` - --description string Description of the group - -h, --help help for group - --name string Name of the group - -o, --organization-id string Identifier of the organization to create the group in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-ipallowlist.md b/site/content/3.11/arangograph/oasisctl/create/create-ipallowlist.md deleted file mode 100644 index 07f4308515..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-ipallowlist.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create IP Allowlist -menuTitle: Create IP Allowlist -weight: 10 ---- -## oasisctl create ipallowlist - -Create a new IP allowlist - -``` -oasisctl create ipallowlist [flags] -``` - -## Options -``` - --cidr-range strings List of CIDR ranges from which deployments are accessible - --description string Description of the IP allowlist - -h, --help help for ipallowlist - --name string Name of the IP allowlist - -o, --organization-id string Identifier of the organization to create the IP allowlist in - -p, --project-id string Identifier of the project to create the IP allowlist in - --remote-inspection-allowed If set, remote connectivity checks by the Oasis platform are allowed -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-metrics-token.md b/site/content/3.11/arangograph/oasisctl/create/create-metrics-token.md deleted file mode 100644 index a5e0e9a9dd..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-metrics-token.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create Metrics Token -menuTitle: Create Metrics Token -weight: 12 ---- -## oasisctl create metrics token - -Create a new metrics access token - -``` -oasisctl create metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to create the token for - --description string Description of the token - -h, --help help for token - --lifetime duration Lifetime of the token. - --name string Name of the token - -o, --organization-id string Identifier of the organization to create the token in - -p, --project-id string Identifier of the project to create the token in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create metrics](create-metrics.md) - Create metrics resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-metrics.md b/site/content/3.11/arangograph/oasisctl/create/create-metrics.md deleted file mode 100644 index d504981b04..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Metrics -menuTitle: Create Metrics -weight: 11 ---- -## oasisctl create metrics - -Create metrics resources - -``` -oasisctl create metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create metrics token](create-metrics-token.md) - Create a new metrics access token - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-notebook.md b/site/content/3.11/arangograph/oasisctl/create/create-notebook.md deleted file mode 100644 index 8e1f2dcd53..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-notebook.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Create Notebook -menuTitle: Create Notebook -weight: 13 ---- -## oasisctl create notebook - -Create a new notebook - -``` -oasisctl create notebook [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebook has to run next to - --description string Description of the notebook - -s, --disk-size int32 Disk size in GiB that has to be attached to given notebook - -h, --help help for notebook - -n, --name string Name of the notebook - -m, --notebook-model string Identifier of the notebook model that the notebook has to use - -o, --organization-id string Identifier of the organization to create the notebook in - -p, --project-id string Identifier of the project to create the notebook in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-organization-invite.md b/site/content/3.11/arangograph/oasisctl/create/create-organization-invite.md deleted file mode 100644 index 3fbe04a1fe..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Create Organization Invite -menuTitle: Create Organization Invite -weight: 15 ---- -## oasisctl create organization invite - -Create a new invite to an organization - -``` -oasisctl create organization invite [flags] -``` - -## Options -``` - --email string Email address of the person to invite - -h, --help help for invite - -o, --organization-id string Identifier of the organization to create the invite in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create organization](create-organization.md) - Create a new organization - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-organization.md b/site/content/3.11/arangograph/oasisctl/create/create-organization.md deleted file mode 100644 index 8ca1b9065b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-organization.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Organization -menuTitle: Create Organization -weight: 14 ---- -## oasisctl create organization - -Create a new organization - -``` -oasisctl create organization [flags] -``` - -## Options -``` - --description string Description of the organization - -h, --help help for organization - --name string Name of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create organization invite](create-organization-invite.md) - Create a new invite to an organization - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-private-endpoint-service.md b/site/content/3.11/arangograph/oasisctl/create/create-private-endpoint-service.md deleted file mode 100644 index 01999a99ce..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-private-endpoint-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Oasisctl Create Private Endpoint Service -menuTitle: Create Private Endpoint Service -weight: 18 ---- -## oasisctl create private endpoint service - -Create a Private Endpoint Service attached to an existing deployment - -``` -oasisctl create private endpoint service [flags] -``` - -## Options -``` - --alternate-dns-name strings DNS names used for the deployment in the private network - --aws-principal strings List of AWS Principals from which a Private Endpoint can be created (Format: <AccountID>[/Role/<RoleName>|/User/<UserName>]) - --azure-client-subscription-id strings List of Azure subscription IDs from which a Private Endpoint can be created - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - --description string Description of the private endpoint service - --enable-private-dns Enable private DNS for the deployment (applicable for AWS and GKE only) - --gcp-project strings List of GCP projects from which a Private Endpoint can be created - -h, --help help for service - --name string Name of the private endpoint service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create private endpoint](create-private-endpoint.md) - - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-private-endpoint.md b/site/content/3.11/arangograph/oasisctl/create/create-private-endpoint.md deleted file mode 100644 index cac7dbfcb7..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Private Endpoint -menuTitle: Create Private Endpoint -weight: 17 ---- -## oasisctl create private endpoint - - - -``` -oasisctl create private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create private](create-private.md) - Create private resources -* [oasisctl create private endpoint service](create-private-endpoint-service.md) - Create a Private Endpoint Service attached to an existing deployment - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-private.md b/site/content/3.11/arangograph/oasisctl/create/create-private.md deleted file mode 100644 index 3cb40e735b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Private -menuTitle: Create Private -weight: 16 ---- -## oasisctl create private - -Create private resources - -``` -oasisctl create private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create private endpoint](create-private-endpoint.md) - - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-project.md b/site/content/3.11/arangograph/oasisctl/create/create-project.md deleted file mode 100644 index 59d997efb7..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-project.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Project -menuTitle: Create Project -weight: 19 ---- -## oasisctl create project - -Create a new project - -``` -oasisctl create project [flags] -``` - -## Options -``` - --description string Description of the project - -h, --help help for project - --name string Name of the project - -o, --organization-id string Identifier of the organization to create the project in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/create/create-role.md b/site/content/3.11/arangograph/oasisctl/create/create-role.md deleted file mode 100644 index 52cec0a672..0000000000 --- a/site/content/3.11/arangograph/oasisctl/create/create-role.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Role -menuTitle: Create Role -weight: 20 ---- -## oasisctl create role - -Create a new role - -``` -oasisctl create role [flags] -``` - -## Options -``` - --description string Description of the role - -h, --help help for role - --name string Name of the role - -o, --organization-id string Identifier of the organization to create the role in - -p, --permission strings Permissions granted by the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/_index.md b/site/content/3.11/arangograph/oasisctl/delete/_index.md deleted file mode 100644 index 75b76a80b6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/_index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Oasisctl Delete -menuTitle: Delete -weight: 9 ---- -## oasisctl delete - -Delete resources - -``` -oasisctl delete [flags] -``` - -## Options -``` - -h, --help help for delete -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl delete apikey](delete-apikey.md) - Delete an API key with given identifier -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog -* [oasisctl delete backup](delete-backup.md) - Delete a backup for a given ID. -* [oasisctl delete cacertificate](delete-cacertificate.md) - Delete a CA certificate the authenticated user has access to -* [oasisctl delete deployment](delete-deployment.md) - Delete a deployment the authenticated user has access to -* [oasisctl delete example](delete-example.md) - Delete example ... -* [oasisctl delete group](delete-group.md) - Delete a group the authenticated user has access to -* [oasisctl delete ipallowlist](delete-ipallowlist.md) - Delete an IP allowlist the authenticated user has access to -* [oasisctl delete metrics](delete-metrics.md) - Delete metrics resources -* [oasisctl delete notebook](delete-notebook.md) - Delete a notebook -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to -* [oasisctl delete project](delete-project.md) - Delete a project the authenticated user has access to -* [oasisctl delete role](delete-role.md) - Delete a role the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-apikey.md b/site/content/3.11/arangograph/oasisctl/delete/delete-apikey.md deleted file mode 100644 index d18236eac3..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-apikey.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete API Key -menuTitle: Delete API Key -weight: 1 ---- -## oasisctl delete apikey - -Delete an API key with given identifier - -``` -oasisctl delete apikey [flags] -``` - -## Options -``` - -i, --apikey-id string Identifier of the API key to delete - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive-events.md b/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive-events.md deleted file mode 100644 index d337652b7b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive-events.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Archive Events -menuTitle: Delete Audit Log Archive Events -weight: 4 ---- -## oasisctl delete auditlog archive events - -Delete auditlog archive events - -``` -oasisctl delete auditlog archive events [flags] -``` - -## Options -``` - -i, --auditlog-archive-id string Identifier of the auditlog archive to delete events from. - -h, --help help for events - --to string Remove events created before this timestamp. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog archive](delete-auditlog-archive.md) - Delete an auditlog archive - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive.md b/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive.md deleted file mode 100644 index 59153bfbdd..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-archive.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Archive -menuTitle: Delete Audit Log Archive -weight: 3 ---- -## oasisctl delete auditlog archive - -Delete an auditlog archive - -``` -oasisctl delete auditlog archive [flags] -``` - -## Options -``` - -i, --auditlog-archive-id string Identifier of the auditlog archive to delete. - -h, --help help for archive -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog -* [oasisctl delete auditlog archive events](delete-auditlog-archive-events.md) - Delete auditlog archive events - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-destination.md b/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-destination.md deleted file mode 100644 index 6dcb135925..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog-destination.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Destination -menuTitle: Delete Audit Log Destination -weight: 5 ---- -## oasisctl delete auditlog destination - -Delete a destination from an auditlog - -``` -oasisctl delete auditlog destination [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to delete. - -h, --help help for destination - --index int Index of the destination to remove. Only one delete option can be specified. (default -1) - -o, --organization-id string Identifier of the organization. - --type string Type of the destination to remove. This will remove ALL destinations with that type. - --url string An optional URL which will be used to delete a single destination instead of all. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog.md b/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog.md deleted file mode 100644 index 6895de151f..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Audit Log -menuTitle: Delete Audit Log -weight: 2 ---- -## oasisctl delete auditlog - -Delete an auditlog - -``` -oasisctl delete auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to delete. - -h, --help help for auditlog - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete auditlog archive](delete-auditlog-archive.md) - Delete an auditlog archive -* [oasisctl delete auditlog destination](delete-auditlog-destination.md) - Delete a destination from an auditlog - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-backup-policy.md b/site/content/3.11/arangograph/oasisctl/delete/delete-backup-policy.md deleted file mode 100644 index 99e8ac2deb..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-backup-policy.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Backup Policy -menuTitle: Delete Backup Policy -weight: 7 ---- -## oasisctl delete backup policy - -Delete a backup policy for a given ID. - -``` -oasisctl delete backup policy [flags] -``` - -## Options -``` - -h, --help help for policy - -i, --id string Identifier of the backup policy - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete backup](delete-backup.md) - Delete a backup for a given ID. - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-backup.md b/site/content/3.11/arangograph/oasisctl/delete/delete-backup.md deleted file mode 100644 index cf116f93a1..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-backup.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Backup -menuTitle: Delete Backup -weight: 6 ---- -## oasisctl delete backup - -Delete a backup for a given ID. - -``` -oasisctl delete backup [flags] -``` - -## Options -``` - -h, --help help for backup - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete backup policy](delete-backup-policy.md) - Delete a backup policy for a given ID. - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-cacertificate.md b/site/content/3.11/arangograph/oasisctl/delete/delete-cacertificate.md deleted file mode 100644 index aad85c751b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete CA Certificate -menuTitle: Delete CA Certificate -weight: 8 ---- -## oasisctl delete cacertificate - -Delete a CA certificate the authenticated user has access to - -``` -oasisctl delete cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-deployment.md b/site/content/3.11/arangograph/oasisctl/delete/delete-deployment.md deleted file mode 100644 index 15450ecb9b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Deployment -menuTitle: Delete Deployment -weight: 9 ---- -## oasisctl delete deployment - -Delete a deployment the authenticated user has access to - -``` -oasisctl delete deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-example-installation.md b/site/content/3.11/arangograph/oasisctl/delete/delete-example-installation.md deleted file mode 100644 index 569152227e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Example Installation -menuTitle: Delete Example Installation -weight: 11 ---- -## oasisctl delete example installation - -Delete an example datasets installation - -``` -oasisctl delete example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installation - --installation-id string The ID of the installation to delete. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete example](delete-example.md) - Delete example ... - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-example.md b/site/content/3.11/arangograph/oasisctl/delete/delete-example.md deleted file mode 100644 index 9518b2d7d1..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Example -menuTitle: Delete Example -weight: 10 ---- -## oasisctl delete example - -Delete example ... - -``` -oasisctl delete example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete example installation](delete-example-installation.md) - Delete an example datasets installation - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-group-members.md b/site/content/3.11/arangograph/oasisctl/delete/delete-group-members.md deleted file mode 100644 index ae6dc82a96..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-group-members.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Group Members -menuTitle: Delete Group Members -weight: 13 ---- -## oasisctl delete group members - -Delete members from group - -``` -oasisctl delete group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group to delete members from - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete group](delete-group.md) - Delete a group the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-group.md b/site/content/3.11/arangograph/oasisctl/delete/delete-group.md deleted file mode 100644 index 4f6fe7d91c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-group.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Group -menuTitle: Delete Group -weight: 12 ---- -## oasisctl delete group - -Delete a group the authenticated user has access to - -``` -oasisctl delete group [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete group members](delete-group-members.md) - Delete members from group - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-ipallowlist.md b/site/content/3.11/arangograph/oasisctl/delete/delete-ipallowlist.md deleted file mode 100644 index 1806667457..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete IP Allowlist -menuTitle: Delete IP Allowlist -weight: 14 ---- -## oasisctl delete ipallowlist - -Delete an IP allowlist the authenticated user has access to - -``` -oasisctl delete ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-metrics-token.md b/site/content/3.11/arangograph/oasisctl/delete/delete-metrics-token.md deleted file mode 100644 index c18927e996..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Metrics Token -menuTitle: Delete Metrics Token -weight: 16 ---- -## oasisctl delete metrics token - -Delete a metrics token for a deployment - -``` -oasisctl delete metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete metrics](delete-metrics.md) - Delete metrics resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-metrics.md b/site/content/3.11/arangograph/oasisctl/delete/delete-metrics.md deleted file mode 100644 index 36052afbce..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Metrics -menuTitle: Delete Metrics -weight: 15 ---- -## oasisctl delete metrics - -Delete metrics resources - -``` -oasisctl delete metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete metrics token](delete-metrics-token.md) - Delete a metrics token for a deployment - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-notebook.md b/site/content/3.11/arangograph/oasisctl/delete/delete-notebook.md deleted file mode 100644 index 3992653923..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Notebook -menuTitle: Delete Notebook -weight: 17 ---- -## oasisctl delete notebook - -Delete a notebook - -``` -oasisctl delete notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-organization-invite.md b/site/content/3.11/arangograph/oasisctl/delete/delete-organization-invite.md deleted file mode 100644 index dae7596f39..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Organization Invite -menuTitle: Delete Organization Invite -weight: 19 ---- -## oasisctl delete organization invite - -Delete an organization invite the authenticated user has access to - -``` -oasisctl delete organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-organization-members.md b/site/content/3.11/arangograph/oasisctl/delete/delete-organization-members.md deleted file mode 100644 index c3d4151366..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-organization-members.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Organization Members -menuTitle: Delete Organization Members -weight: 20 ---- -## oasisctl delete organization members - -Delete members from organization - -``` -oasisctl delete organization members [flags] -``` - -## Options -``` - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-organization.md b/site/content/3.11/arangograph/oasisctl/delete/delete-organization.md deleted file mode 100644 index 362056323c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-organization.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Organization -menuTitle: Delete Organization -weight: 18 ---- -## oasisctl delete organization - -Delete an organization the authenticated user has access to - -``` -oasisctl delete organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete organization invite](delete-organization-invite.md) - Delete an organization invite the authenticated user has access to -* [oasisctl delete organization members](delete-organization-members.md) - Delete members from organization - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-project.md b/site/content/3.11/arangograph/oasisctl/delete/delete-project.md deleted file mode 100644 index 9b45160be9..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Project -menuTitle: Delete Project -weight: 21 ---- -## oasisctl delete project - -Delete a project the authenticated user has access to - -``` -oasisctl delete project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/delete/delete-role.md b/site/content/3.11/arangograph/oasisctl/delete/delete-role.md deleted file mode 100644 index c8bcbb67f2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/delete/delete-role.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Role -menuTitle: Delete Role -weight: 22 ---- -## oasisctl delete role - -Delete a role the authenticated user has access to - -``` -oasisctl delete role [flags] -``` - -## Options -``` - -h, --help help for role - -o, --organization-id string Identifier of the organization - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.11/arangograph/oasisctl/disable/_index.md b/site/content/3.11/arangograph/oasisctl/disable/_index.md deleted file mode 100644 index 916ad96f01..0000000000 --- a/site/content/3.11/arangograph/oasisctl/disable/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Disable -menuTitle: Disable -weight: 10 ---- -## oasisctl disable - -Disable some settings related to deployment - -``` -oasisctl disable [flags] -``` - -## Options -``` - -h, --help help for disable -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl disable scheduled-root-password-rotation](disable-scheduled-root-password-rotation.md) - Disable scheduled root password rotation - diff --git a/site/content/3.11/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md b/site/content/3.11/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md deleted file mode 100644 index 52ac637431..0000000000 --- a/site/content/3.11/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Disable Scheduled-Root-Password-Rotation -menuTitle: Disable Scheduled-Root-Password-Rotation -weight: 1 ---- -## oasisctl disable scheduled-root-password-rotation - -Disable scheduled root password rotation - -``` -oasisctl disable scheduled-root-password-rotation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for scheduled-root-password-rotation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl disable](_index.md) - Disable some settings related to deployment - diff --git a/site/content/3.11/arangograph/oasisctl/enable/_index.md b/site/content/3.11/arangograph/oasisctl/enable/_index.md deleted file mode 100644 index 61a3b03d10..0000000000 --- a/site/content/3.11/arangograph/oasisctl/enable/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Enable -menuTitle: Enable -weight: 11 ---- -## oasisctl enable - -Enable some settings related to deployment - -``` -oasisctl enable [flags] -``` - -## Options -``` - -h, --help help for enable -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl enable scheduled-root-password-rotation](enable-scheduled-root-password-rotation.md) - Enable scheduled root password rotation - diff --git a/site/content/3.11/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md b/site/content/3.11/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md deleted file mode 100644 index 8628abc79c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Enable Scheduled-Root-Password-Rotation -menuTitle: Enable Scheduled-Root-Password-Rotation -weight: 1 ---- -## oasisctl enable scheduled-root-password-rotation - -Enable scheduled root password rotation - -``` -oasisctl enable scheduled-root-password-rotation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for scheduled-root-password-rotation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl enable](_index.md) - Enable some settings related to deployment - diff --git a/site/content/3.11/arangograph/oasisctl/generate-docs.md b/site/content/3.11/arangograph/oasisctl/generate-docs.md deleted file mode 100644 index f1d83f8437..0000000000 --- a/site/content/3.11/arangograph/oasisctl/generate-docs.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Generate Documentation -menuTitle: Generate Documentation -weight: 12 ---- -## oasisctl generate-docs - -Generate output - -``` -oasisctl generate-docs [flags] -``` - -## Options -``` - -h, --help help for generate-docs - -l, --link-file-ext string What file extensions the links should point to - -o, --output-dir string Output directory (default "./docs") - -r, --replace-underscore-with string Replace the underscore in links with the given character -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/get/_index.md b/site/content/3.11/arangograph/oasisctl/get/_index.md deleted file mode 100644 index 20021e7831..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/_index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Oasisctl Get -menuTitle: Get -weight: 13 ---- -## oasisctl get - -Get information - -``` -oasisctl get [flags] -``` - -## Options -``` - -h, --help help for get -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive -* [oasisctl get backup](get-backup.md) - Get a backup -* [oasisctl get cacertificate](get-cacertificate.md) - Get a CA certificate the authenticated user has access to -* [oasisctl get deployment](get-deployment.md) - Get a deployment the authenticated user has access to -* [oasisctl get example](get-example.md) - Get a single example dataset -* [oasisctl get group](get-group.md) - Get a group the authenticated user has access to -* [oasisctl get ipallowlist](get-ipallowlist.md) - Get an IP allowlist the authenticated user has access to -* [oasisctl get metrics](get-metrics.md) - Get metrics information -* [oasisctl get notebook](get-notebook.md) - Get a notebook -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get policy](get-policy.md) - Get a policy the authenticated user has access to -* [oasisctl get private](get-private.md) - Get private information -* [oasisctl get project](get-project.md) - Get a project the authenticated user has access to -* [oasisctl get provider](get-provider.md) - Get a provider the authenticated user has access to -* [oasisctl get region](get-region.md) - Get a region the authenticated user has access to -* [oasisctl get role](get-role.md) - Get a role the authenticated user has access to -* [oasisctl get self](get-self.md) - Get information about the authenticated user -* [oasisctl get server](get-server.md) - Get server information -* [oasisctl get tandc](get-tandc.md) - Get current terms and conditions or get one by ID - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-auditlog-archive.md b/site/content/3.11/arangograph/oasisctl/get/get-auditlog-archive.md deleted file mode 100644 index 546b9a55c4..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-auditlog-archive.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Audit Log Archive -menuTitle: Get Audit Log Archive -weight: 2 ---- -## oasisctl get auditlog archive - -Get auditlog archive - -``` -oasisctl get auditlog archive [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for archive -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-auditlog-events.md b/site/content/3.11/arangograph/oasisctl/get/get-auditlog-events.md deleted file mode 100644 index 44c9088765..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-auditlog-events.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Get Audit Log Events -menuTitle: Get Audit Log Events -weight: 3 ---- -## oasisctl get auditlog events - -Get auditlog events - -``` -oasisctl get auditlog events [flags] -``` - -## Options -``` - --auditlog-archive-id string If set, include only events from this AuditLogArchive - -i, --auditlog-id string Identifier of the auditlog - --excluded-topics strings If non-empty, leave out events with one of these topics. This takes priority over included - --from string Request events created at or after this timestamp - -h, --help help for events - --included-topics strings If non-empty, only request events with one of these topics - --limit int Limit the number of audit log events. Defaults to 0, meaning no limit - --to string Request events created before this timestamp -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-auditlog.md b/site/content/3.11/arangograph/oasisctl/get/get-auditlog.md deleted file mode 100644 index 025710b835..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Audit Log -menuTitle: Get Audit Log -weight: 1 ---- -## oasisctl get auditlog - -Get auditlog archive - -``` -oasisctl get auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for auditlog - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get auditlog archive](get-auditlog-archive.md) - Get auditlog archive -* [oasisctl get auditlog events](get-auditlog-events.md) - Get auditlog events - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-backup-policy.md b/site/content/3.11/arangograph/oasisctl/get/get-backup-policy.md deleted file mode 100644 index 916ad22e61..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-backup-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Backup Policy -menuTitle: Get Backup Policy -weight: 5 ---- -## oasisctl get backup policy - -Get an existing backup policy - -``` -oasisctl get backup policy [flags] -``` - -## Options -``` - -h, --help help for policy - -i, --id string Identifier of the backup policy (Id|Name|Url) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get backup](get-backup.md) - Get a backup - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-backup.md b/site/content/3.11/arangograph/oasisctl/get/get-backup.md deleted file mode 100644 index 2792a98b02..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-backup.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Backup -menuTitle: Get Backup -weight: 4 ---- -## oasisctl get backup - -Get a backup - -``` -oasisctl get backup [flags] -``` - -## Options -``` - -h, --help help for backup - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get backup policy](get-backup-policy.md) - Get an existing backup policy - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-cacertificate.md b/site/content/3.11/arangograph/oasisctl/get/get-cacertificate.md deleted file mode 100644 index 0be6d11e44..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get CA Certificate -menuTitle: Get CA Certificate -weight: 6 ---- -## oasisctl get cacertificate - -Get a CA certificate the authenticated user has access to - -``` -oasisctl get cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-deployment.md b/site/content/3.11/arangograph/oasisctl/get/get-deployment.md deleted file mode 100644 index ab8d86e3d3..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Deployment -menuTitle: Get Deployment -weight: 7 ---- -## oasisctl get deployment - -Get a deployment the authenticated user has access to - -``` -oasisctl get deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --show-root-password show the root password of the database -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-example-installation.md b/site/content/3.11/arangograph/oasisctl/get/get-example-installation.md deleted file mode 100644 index 4190e8e288..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Example Installation -menuTitle: Get Example Installation -weight: 9 ---- -## oasisctl get example installation - -Get a single example dataset installation - -``` -oasisctl get example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installation - --installation-id string The ID of the installation to get. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get example](get-example.md) - Get a single example dataset - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-example.md b/site/content/3.11/arangograph/oasisctl/get/get-example.md deleted file mode 100644 index 1238d443ed..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-example.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Example -menuTitle: Get Example -weight: 8 ---- -## oasisctl get example - -Get a single example dataset - -``` -oasisctl get example [flags] -``` - -## Options -``` - -e, --example-dataset-id string ID of the example dataset - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get example installation](get-example-installation.md) - Get a single example dataset installation - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-group.md b/site/content/3.11/arangograph/oasisctl/get/get-group.md deleted file mode 100644 index 9b8e72e16b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-group.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Group -menuTitle: Get Group -weight: 10 ---- -## oasisctl get group - -Get a group the authenticated user has access to - -``` -oasisctl get group [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-ipallowlist.md b/site/content/3.11/arangograph/oasisctl/get/get-ipallowlist.md deleted file mode 100644 index 379c324604..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get IP Allowlist -menuTitle: Get IP Allowlist -weight: 11 ---- -## oasisctl get ipallowlist - -Get an IP allowlist the authenticated user has access to - -``` -oasisctl get ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-metrics-token.md b/site/content/3.11/arangograph/oasisctl/get/get-metrics-token.md deleted file mode 100644 index 6226b02793..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Metrics Token -menuTitle: Get Metrics Token -weight: 13 ---- -## oasisctl get metrics token - -Get a metrics token - -``` -oasisctl get metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get metrics](get-metrics.md) - Get metrics information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-metrics.md b/site/content/3.11/arangograph/oasisctl/get/get-metrics.md deleted file mode 100644 index f2699417aa..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Metrics -menuTitle: Get Metrics -weight: 12 ---- -## oasisctl get metrics - -Get metrics information - -``` -oasisctl get metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get metrics token](get-metrics-token.md) - Get a metrics token - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-notebook.md b/site/content/3.11/arangograph/oasisctl/get/get-notebook.md deleted file mode 100644 index 8526fb293a..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Notebook -menuTitle: Get Notebook -weight: 14 ---- -## oasisctl get notebook - -Get a notebook - -``` -oasisctl get notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization-authentication-providers.md b/site/content/3.11/arangograph/oasisctl/get/get-organization-authentication-providers.md deleted file mode 100644 index da20b01a1a..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization-authentication-providers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Authentication Providers -menuTitle: Get Organization Authentication Providers -weight: 17 ---- -## oasisctl get organization authentication providers - -Get which authentication providers are allowed for accessing a specific organization - -``` -oasisctl get organization authentication providers [flags] -``` - -## Options -``` - -h, --help help for providers - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization authentication](get-organization-authentication.md) - Get authentication specific information for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization-authentication.md b/site/content/3.11/arangograph/oasisctl/get/get-organization-authentication.md deleted file mode 100644 index cd16e2841b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization-authentication.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Authentication -menuTitle: Get Organization Authentication -weight: 16 ---- -## oasisctl get organization authentication - -Get authentication specific information for an organization - -``` -oasisctl get organization authentication [flags] -``` - -## Options -``` - -h, --help help for authentication -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get organization authentication providers](get-organization-authentication-providers.md) - Get which authentication providers are allowed for accessing a specific organization - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md b/site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md deleted file mode 100644 index 400ad06087..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email Domain Restrictions -menuTitle: Get Organization Email Domain Restrictions -weight: 20 ---- -## oasisctl get organization email domain restrictions - -Get which email domain restrictions are placed on accessing a specific organization - -``` -oasisctl get organization email domain restrictions [flags] -``` - -## Options -``` - -h, --help help for restrictions - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization email domain](get-organization-email-domain.md) - Get email domain specific information for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain.md b/site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain.md deleted file mode 100644 index 305097e72f..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization-email-domain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email Domain -menuTitle: Get Organization Email Domain -weight: 19 ---- -## oasisctl get organization email domain - -Get email domain specific information for an organization - -``` -oasisctl get organization email domain [flags] -``` - -## Options -``` - -h, --help help for domain -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization email](get-organization-email.md) - Get email specific information for an organization -* [oasisctl get organization email domain restrictions](get-organization-email-domain-restrictions.md) - Get which email domain restrictions are placed on accessing a specific organization - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization-email.md b/site/content/3.11/arangograph/oasisctl/get/get-organization-email.md deleted file mode 100644 index 5ca941ffcd..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization-email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email -menuTitle: Get Organization Email -weight: 18 ---- -## oasisctl get organization email - -Get email specific information for an organization - -``` -oasisctl get organization email [flags] -``` - -## Options -``` - -h, --help help for email -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get organization email domain](get-organization-email-domain.md) - Get email domain specific information for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization-invite.md b/site/content/3.11/arangograph/oasisctl/get/get-organization-invite.md deleted file mode 100644 index 093ed06c05..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Organization Invite -menuTitle: Get Organization Invite -weight: 21 ---- -## oasisctl get organization invite - -Get an organization invite the authenticated user has access to - -``` -oasisctl get organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-organization.md b/site/content/3.11/arangograph/oasisctl/get/get-organization.md deleted file mode 100644 index b05c6201ab..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-organization.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Organization -menuTitle: Get Organization -weight: 15 ---- -## oasisctl get organization - -Get an organization the authenticated user is a member of - -``` -oasisctl get organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get organization authentication](get-organization-authentication.md) - Get authentication specific information for an organization -* [oasisctl get organization email](get-organization-email.md) - Get email specific information for an organization -* [oasisctl get organization invite](get-organization-invite.md) - Get an organization invite the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-policy.md b/site/content/3.11/arangograph/oasisctl/get/get-policy.md deleted file mode 100644 index 599e5601cb..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Policy -menuTitle: Get Policy -weight: 22 ---- -## oasisctl get policy - -Get a policy the authenticated user has access to - -``` -oasisctl get policy [flags] -``` - -## Options -``` - -h, --help help for policy - -u, --url string URL of the resource to inspect the policy for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-private-endpoint-service.md b/site/content/3.11/arangograph/oasisctl/get/get-private-endpoint-service.md deleted file mode 100644 index a9c56b8b0f..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-private-endpoint-service.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Private Endpoint Service -menuTitle: Get Private Endpoint Service -weight: 25 ---- -## oasisctl get private endpoint service - -Get a Private Endpoint Service the authenticated user has access to - -``` -oasisctl get private endpoint service [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - -h, --help help for service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get private endpoint](get-private-endpoint.md) - - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-private-endpoint.md b/site/content/3.11/arangograph/oasisctl/get/get-private-endpoint.md deleted file mode 100644 index 38afeb2dd8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Private Endpoint -menuTitle: Get Private Endpoint -weight: 24 ---- -## oasisctl get private endpoint - - - -``` -oasisctl get private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get private](get-private.md) - Get private information -* [oasisctl get private endpoint service](get-private-endpoint-service.md) - Get a Private Endpoint Service the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-private.md b/site/content/3.11/arangograph/oasisctl/get/get-private.md deleted file mode 100644 index e84921fd32..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Private -menuTitle: Get Private -weight: 23 ---- -## oasisctl get private - -Get private information - -``` -oasisctl get private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get private endpoint](get-private-endpoint.md) - - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-project.md b/site/content/3.11/arangograph/oasisctl/get/get-project.md deleted file mode 100644 index 5bfb087e53..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Project -menuTitle: Get Project -weight: 26 ---- -## oasisctl get project - -Get a project the authenticated user has access to - -``` -oasisctl get project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-provider.md b/site/content/3.11/arangograph/oasisctl/get/get-provider.md deleted file mode 100644 index da7d632e1b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-provider.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Provider -menuTitle: Get Provider -weight: 27 ---- -## oasisctl get provider - -Get a provider the authenticated user has access to - -``` -oasisctl get provider [flags] -``` - -## Options -``` - -h, --help help for provider - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-region.md b/site/content/3.11/arangograph/oasisctl/get/get-region.md deleted file mode 100644 index 25ca81e867..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-region.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Region -menuTitle: Get Region -weight: 28 ---- -## oasisctl get region - -Get a region the authenticated user has access to - -``` -oasisctl get region [flags] -``` - -## Options -``` - -h, --help help for region - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-role.md b/site/content/3.11/arangograph/oasisctl/get/get-role.md deleted file mode 100644 index 898605e245..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-role.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Role -menuTitle: Get Role -weight: 29 ---- -## oasisctl get role - -Get a role the authenticated user has access to - -``` -oasisctl get role [flags] -``` - -## Options -``` - -h, --help help for role - -o, --organization-id string Identifier of the organization - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-self.md b/site/content/3.11/arangograph/oasisctl/get/get-self.md deleted file mode 100644 index 26d48ad423..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-self.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl Get Self -menuTitle: Get Self -weight: 30 ---- -## oasisctl get self - -Get information about the authenticated user - -``` -oasisctl get self [flags] -``` - -## Options -``` - -h, --help help for self -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-server-status.md b/site/content/3.11/arangograph/oasisctl/get/get-server-status.md deleted file mode 100644 index 302fb17a1d..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-server-status.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Server Status -menuTitle: Get Server Status -weight: 32 ---- -## oasisctl get server status - -Get the status of servers for a deployment - -``` -oasisctl get server status [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for status - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get server](get-server.md) - Get server information - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-server.md b/site/content/3.11/arangograph/oasisctl/get/get-server.md deleted file mode 100644 index ad54b9dfd2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-server.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Server -menuTitle: Get Server -weight: 31 ---- -## oasisctl get server - -Get server information - -``` -oasisctl get server [flags] -``` - -## Options -``` - -h, --help help for server -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get server status](get-server-status.md) - Get the status of servers for a deployment - diff --git a/site/content/3.11/arangograph/oasisctl/get/get-tandc.md b/site/content/3.11/arangograph/oasisctl/get/get-tandc.md deleted file mode 100644 index c33b546252..0000000000 --- a/site/content/3.11/arangograph/oasisctl/get/get-tandc.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Terms & Conditions -menuTitle: Get Terms & Conditions -weight: 33 ---- -## oasisctl get tandc - -Get current terms and conditions or get one by ID - -``` -oasisctl get tandc [flags] -``` - -## Options -``` - -h, --help help for tandc - -o, --organization-id string Identifier of the organization - -t, --terms-and-conditions-id string Identifier of the terms and conditions to accept. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.11/arangograph/oasisctl/import.md b/site/content/3.11/arangograph/oasisctl/import.md deleted file mode 100644 index 385375d640..0000000000 --- a/site/content/3.11/arangograph/oasisctl/import.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Oasisctl Import -menuTitle: Import -weight: 14 ---- -## oasisctl import - -Import data from a local database or from another remote database into an Oasis deployment. - -``` -oasisctl import [flags] -``` - -## Options -``` - -b, --batch-size int The number of documents to write at once. (default 4096) - -d, --destination-deployment-id string Destination deployment id to import data into. It can be provided instead of address, username and password. - --excluded-collection strings A list of collections names which should be excluded. Exclusion takes priority over inclusion. - --excluded-database strings A list of database names which should be excluded. Exclusion takes priority over inclusion. - --excluded-graph strings A list of graph names which should be excluded. Exclusion takes priority over inclusion. - --excluded-view strings A list of view names which should be excluded. Exclusion takes priority over inclusion. - -f, --force Force the copy automatically overwriting everything at destination. - -h, --help help for import - --included-collection strings A list of collection names which should be included. If provided, only these collections will be copied. - --included-database strings A list of database names which should be included. If provided, only these databases will be copied. - --included-graph strings A list of graph names which should be included. If provided, only these graphs will be copied. - --included-view strings A list of view names which should be included. If provided, only these views will be copied. - -r, --max-retries int The number of maximum retries attempts. Increasing this number will also increase the exponential fallback timer. (default 9) - -m, --maximum-parallel-collections int Maximum number of collections being copied in parallel. (default 10) - --no-progress-bar Disable the progress bar but still have partial progress output. - --query-ttl duration Cursor TTL defined as a duration. (default 2h0m0s) - --source-address string Source database address to copy data from. - --source-password string Source database password if required. - --source-username string Source database username if required. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/list/_index.md b/site/content/3.11/arangograph/oasisctl/list/_index.md deleted file mode 100644 index b8a7496441..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/_index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Oasisctl List -menuTitle: List -weight: 15 ---- -## oasisctl list - -List resources - -``` -oasisctl list [flags] -``` - -## Options -``` - -h, --help help for list -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl list apikeys](list-apikeys.md) - List all API keys created for the current user -* [oasisctl list arangodb](list-arangodb.md) - List ArangoDB information -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs -* [oasisctl list auditlogs](list-auditlogs.md) - List auditlogs -* [oasisctl list backup](list-backup.md) - A list command for various backup resources -* [oasisctl list backups](list-backups.md) - List backups -* [oasisctl list cacertificates](list-cacertificates.md) - List all CA certificates of the given project -* [oasisctl list cpusizes](list-cpusizes.md) - List CPU sizes -* [oasisctl list deployments](list-deployments.md) - List all deployments of the given project -* [oasisctl list diskperformances](list-diskperformances.md) - List disk performances -* [oasisctl list effective](list-effective.md) - List effective information -* [oasisctl list example](list-example.md) - List example ... -* [oasisctl list examples](list-examples.md) - List all example datasets -* [oasisctl list group](list-group.md) - List group resources -* [oasisctl list groups](list-groups.md) - List all groups of the given organization -* [oasisctl list ipallowlists](list-ipallowlists.md) - List all IP allowlists of the given project -* [oasisctl list metrics](list-metrics.md) - List metrics resources -* [oasisctl list nodesizes](list-nodesizes.md) - List node sizes -* [oasisctl list notebookmodels](list-notebookmodels.md) - List notebook models -* [oasisctl list notebooks](list-notebooks.md) - List notebooks -* [oasisctl list organization](list-organization.md) - List organization resources -* [oasisctl list organizations](list-organizations.md) - List all organizations the authenticated user is a member of -* [oasisctl list permissions](list-permissions.md) - List the known permissions -* [oasisctl list projects](list-projects.md) - List all projects of the given organization -* [oasisctl list providers](list-providers.md) - List all providers the authenticated user has access to -* [oasisctl list regions](list-regions.md) - List all regions of the given provider -* [oasisctl list roles](list-roles.md) - List all roles of the given organization -* [oasisctl list servers](list-servers.md) - List servers information - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-apikeys.md b/site/content/3.11/arangograph/oasisctl/list/list-apikeys.md deleted file mode 100644 index 44984cb38b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-apikeys.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List API Keys -menuTitle: List API Keys -weight: 1 ---- -## oasisctl list apikeys - -List all API keys created for the current user - -``` -oasisctl list apikeys [flags] -``` - -## Options -``` - -h, --help help for apikeys -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-arangodb-versions.md b/site/content/3.11/arangograph/oasisctl/list/list-arangodb-versions.md deleted file mode 100644 index 22411cf8a8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-arangodb-versions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List ArangoDB Versions -menuTitle: List ArangoDB Versions -weight: 3 ---- -## oasisctl list arangodb versions - -List all supported ArangoDB versions - -``` -oasisctl list arangodb versions [flags] -``` - -## Options -``` - -h, --help help for versions - -o, --organization-id string Optional Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list arangodb](list-arangodb.md) - List ArangoDB information - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-arangodb.md b/site/content/3.11/arangograph/oasisctl/list/list-arangodb.md deleted file mode 100644 index 04445b917d..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-arangodb.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List ArangoDB -menuTitle: List ArangoDB -weight: 2 ---- -## oasisctl list arangodb - -List ArangoDB information - -``` -oasisctl list arangodb [flags] -``` - -## Options -``` - -h, --help help for arangodb -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list arangodb versions](list-arangodb-versions.md) - List all supported ArangoDB versions - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-auditlog-archives.md b/site/content/3.11/arangograph/oasisctl/list/list-auditlog-archives.md deleted file mode 100644 index efe237a2b6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-auditlog-archives.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log Archives -menuTitle: List Audit Log Archives -weight: 5 ---- -## oasisctl list auditlog archives - -List auditlog archives - -``` -oasisctl list auditlog archives [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for archives - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-auditlog-destinations.md b/site/content/3.11/arangograph/oasisctl/list/list-auditlog-destinations.md deleted file mode 100644 index f6fc395ce0..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-auditlog-destinations.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log Destinations -menuTitle: List Audit Log Destinations -weight: 6 ---- -## oasisctl list auditlog destinations - -List auditlog destinations - -``` -oasisctl list auditlog destinations [flags] -``` - -## Options -``` - --auditlog-id string Identifier of the auditlog to list the destinations for - -h, --help help for destinations - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-auditlog.md b/site/content/3.11/arangograph/oasisctl/list/list-auditlog.md deleted file mode 100644 index 4a86f9969e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-auditlog.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log -menuTitle: List Audit Log -weight: 4 ---- -## oasisctl list auditlog - -List resources for auditlogs - -``` -oasisctl list auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list auditlog archives](list-auditlog-archives.md) - List auditlog archives -* [oasisctl list auditlog destinations](list-auditlog-destinations.md) - List auditlog destinations - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-auditlogs.md b/site/content/3.11/arangograph/oasisctl/list/list-auditlogs.md deleted file mode 100644 index 83e17ba2e2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-auditlogs.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Audit Logs -menuTitle: List Audit Logs -weight: 7 ---- -## oasisctl list auditlogs - -List auditlogs - -``` -oasisctl list auditlogs [flags] -``` - -## Options -``` - -h, --help help for auditlogs - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-backup-policies.md b/site/content/3.11/arangograph/oasisctl/list/list-backup-policies.md deleted file mode 100644 index ec1b895990..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-backup-policies.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Backup Policies -menuTitle: List Backup Policies -weight: 9 ---- -## oasisctl list backup policies - -List backup policies - -``` -oasisctl list backup policies [flags] -``` - -## Options -``` - --deployment-id string The ID of the deployment to list backup policies for - -h, --help help for policies - --include-deleted If set, the result includes all backup policies, including those who set to deleted, however are not removed from the system currently -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list backup](list-backup.md) - A list command for various backup resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-backup.md b/site/content/3.11/arangograph/oasisctl/list/list-backup.md deleted file mode 100644 index 3c0b2d78a8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-backup.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Backup -menuTitle: List Backup -weight: 8 ---- -## oasisctl list backup - -A list command for various backup resources - -``` -oasisctl list backup [flags] -``` - -## Options -``` - -h, --help help for backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list backup policies](list-backup-policies.md) - List backup policies - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-backups.md b/site/content/3.11/arangograph/oasisctl/list/list-backups.md deleted file mode 100644 index ace03c781e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-backups.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Backups -menuTitle: List Backups -weight: 10 ---- -## oasisctl list backups - -List backups - -``` -oasisctl list backups [flags] -``` - -## Options -``` - --deployment-id string The ID of the deployment to list backups for - --from string Request backups that are created at or after this timestamp - -h, --help help for backups - --to string Request backups that are created before this timestamp -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-cacertificates.md b/site/content/3.11/arangograph/oasisctl/list/list-cacertificates.md deleted file mode 100644 index 903063bb34..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-cacertificates.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List CA Certificates -menuTitle: List CA Certificates -weight: 11 ---- -## oasisctl list cacertificates - -List all CA certificates of the given project - -``` -oasisctl list cacertificates [flags] -``` - -## Options -``` - -h, --help help for cacertificates - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-cpusizes.md b/site/content/3.11/arangograph/oasisctl/list/list-cpusizes.md deleted file mode 100644 index 85188eac3b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-cpusizes.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List CPU Sizes -menuTitle: List CPU Sizes -weight: 12 ---- -## oasisctl list cpusizes - -List CPU sizes - -``` -oasisctl list cpusizes [flags] -``` - -## Options -``` - -h, --help help for cpusizes - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-deployments.md b/site/content/3.11/arangograph/oasisctl/list/list-deployments.md deleted file mode 100644 index 66b3d739d2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-deployments.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Deployments -menuTitle: List Deployments -weight: 13 ---- -## oasisctl list deployments - -List all deployments of the given project - -``` -oasisctl list deployments [flags] -``` - -## Options -``` - -h, --help help for deployments - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-diskperformances.md b/site/content/3.11/arangograph/oasisctl/list/list-diskperformances.md deleted file mode 100644 index ddbd5714c0..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-diskperformances.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl List Disk Performances -menuTitle: List Disk Performances -weight: 14 ---- -## oasisctl list diskperformances - -List disk performances - -``` -oasisctl list diskperformances [flags] -``` - -## Options -``` - --dbserver-disk-size int32 The disk size of DB-Servers (GiB) (default 32) - -h, --help help for diskperformances - --node-size-id string Identifier of the node size - -o, --organization-id string Identifier of the organization - --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-effective-permissions.md b/site/content/3.11/arangograph/oasisctl/list/list-effective-permissions.md deleted file mode 100644 index 394cc1006e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-effective-permissions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Effective Permissions -menuTitle: List Effective Permissions -weight: 16 ---- -## oasisctl list effective permissions - -List the effective permissions, the authenticated user has for a given URL - -``` -oasisctl list effective permissions [flags] -``` - -## Options -``` - -h, --help help for permissions - -u, --url string URL of resource to get effective permissions for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list effective](list-effective.md) - List effective information - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-effective.md b/site/content/3.11/arangograph/oasisctl/list/list-effective.md deleted file mode 100644 index 431f601dc1..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-effective.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Effective -menuTitle: List Effective -weight: 15 ---- -## oasisctl list effective - -List effective information - -``` -oasisctl list effective [flags] -``` - -## Options -``` - -h, --help help for effective -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list effective permissions](list-effective-permissions.md) - List the effective permissions, the authenticated user has for a given URL - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-example-installations.md b/site/content/3.11/arangograph/oasisctl/list/list-example-installations.md deleted file mode 100644 index 5a9167f5b9..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-example-installations.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Example Installations -menuTitle: List Example Installations -weight: 18 ---- -## oasisctl list example installations - -List all example dataset installations for a deployment - -``` -oasisctl list example installations [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installations - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list example](list-example.md) - List example ... - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-example.md b/site/content/3.11/arangograph/oasisctl/list/list-example.md deleted file mode 100644 index e389b299c2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Example -menuTitle: List Example -weight: 17 ---- -## oasisctl list example - -List example ... - -``` -oasisctl list example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list example installations](list-example-installations.md) - List all example dataset installations for a deployment - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-examples.md b/site/content/3.11/arangograph/oasisctl/list/list-examples.md deleted file mode 100644 index 1cc1d11b86..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-examples.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Examples -menuTitle: List Examples -weight: 19 ---- -## oasisctl list examples - -List all example datasets - -``` -oasisctl list examples [flags] -``` - -## Options -``` - -h, --help help for examples - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-group-members.md b/site/content/3.11/arangograph/oasisctl/list/list-group-members.md deleted file mode 100644 index 6bc87e0b73..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-group-members.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Group Members -menuTitle: List Group Members -weight: 21 ---- -## oasisctl list group members - -List members of a group the authenticated user is a member of - -``` -oasisctl list group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for members - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list group](list-group.md) - List group resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-group.md b/site/content/3.11/arangograph/oasisctl/list/list-group.md deleted file mode 100644 index 28f5caa79d..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-group.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Group -menuTitle: List Group -weight: 20 ---- -## oasisctl list group - -List group resources - -``` -oasisctl list group [flags] -``` - -## Options -``` - -h, --help help for group -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list group members](list-group-members.md) - List members of a group the authenticated user is a member of - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-groups.md b/site/content/3.11/arangograph/oasisctl/list/list-groups.md deleted file mode 100644 index 8908ae0fb3..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-groups.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Groups -menuTitle: List Groups -weight: 22 ---- -## oasisctl list groups - -List all groups of the given organization - -``` -oasisctl list groups [flags] -``` - -## Options -``` - -h, --help help for groups - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-ipallowlists.md b/site/content/3.11/arangograph/oasisctl/list/list-ipallowlists.md deleted file mode 100644 index 33ef91495d..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-ipallowlists.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List IP Allowlists -menuTitle: List IP Allowlists -weight: 23 ---- -## oasisctl list ipallowlists - -List all IP allowlists of the given project - -``` -oasisctl list ipallowlists [flags] -``` - -## Options -``` - -h, --help help for ipallowlists - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-metrics-tokens.md b/site/content/3.11/arangograph/oasisctl/list/list-metrics-tokens.md deleted file mode 100644 index ce1713add8..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-metrics-tokens.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Metrics Tokens -menuTitle: List Metrics Tokens -weight: 25 ---- -## oasisctl list metrics tokens - -List all metrics tokens of the given deployment - -``` -oasisctl list metrics tokens [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for tokens - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list metrics](list-metrics.md) - List metrics resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-metrics.md b/site/content/3.11/arangograph/oasisctl/list/list-metrics.md deleted file mode 100644 index fe3a321be3..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Metrics -menuTitle: List Metrics -weight: 24 ---- -## oasisctl list metrics - -List metrics resources - -``` -oasisctl list metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list metrics tokens](list-metrics-tokens.md) - List all metrics tokens of the given deployment - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-nodesizes.md b/site/content/3.11/arangograph/oasisctl/list/list-nodesizes.md deleted file mode 100644 index 60c0bc9d56..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-nodesizes.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl List Node Sizes -menuTitle: List Node Sizes -weight: 26 ---- -## oasisctl list nodesizes - -List node sizes - -``` -oasisctl list nodesizes [flags] -``` - -## Options -``` - -h, --help help for nodesizes - --model string Identifier of the model (default "oneshard") - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-notebookmodels.md b/site/content/3.11/arangograph/oasisctl/list/list-notebookmodels.md deleted file mode 100644 index cdca9cb6a5..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-notebookmodels.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Notebook Models -menuTitle: List Notebook Models -weight: 27 ---- -## oasisctl list notebookmodels - -List notebook models - -``` -oasisctl list notebookmodels [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebook has to run next to - -h, --help help for notebookmodels - -o, --organization-id string Identifier of the organization that deployment is in - -p, --project-id string Identifier of the project that deployment is in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-notebooks.md b/site/content/3.11/arangograph/oasisctl/list/list-notebooks.md deleted file mode 100644 index 29aa77467f..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-notebooks.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Notebooks -menuTitle: List Notebooks -weight: 28 ---- -## oasisctl list notebooks - -List notebooks - -``` -oasisctl list notebooks [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebooks run next to - -h, --help help for notebooks - -o, --organization-id string Identifier of the organization that has notebooks - -p, --project-id string Identifier of the project that has notebooks -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-organization-invites.md b/site/content/3.11/arangograph/oasisctl/list/list-organization-invites.md deleted file mode 100644 index d3fbe58668..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-organization-invites.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Organization Invites -menuTitle: List Organization Invites -weight: 30 ---- -## oasisctl list organization invites - -List invites of an organization the authenticated user is a member of - -``` -oasisctl list organization invites [flags] -``` - -## Options -``` - -h, --help help for invites - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list organization](list-organization.md) - List organization resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-organization-members.md b/site/content/3.11/arangograph/oasisctl/list/list-organization-members.md deleted file mode 100644 index f143d66886..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-organization-members.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Organization Members -menuTitle: List Organization Members -weight: 31 ---- -## oasisctl list organization members - -List members of an organization the authenticated user is a member of - -``` -oasisctl list organization members [flags] -``` - -## Options -``` - -h, --help help for members - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list organization](list-organization.md) - List organization resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-organization.md b/site/content/3.11/arangograph/oasisctl/list/list-organization.md deleted file mode 100644 index c41e4a9750..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-organization.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Organization -menuTitle: List Organization -weight: 29 ---- -## oasisctl list organization - -List organization resources - -``` -oasisctl list organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list organization invites](list-organization-invites.md) - List invites of an organization the authenticated user is a member of -* [oasisctl list organization members](list-organization-members.md) - List members of an organization the authenticated user is a member of - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-organizations.md b/site/content/3.11/arangograph/oasisctl/list/list-organizations.md deleted file mode 100644 index 7cde4a6da1..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-organizations.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Organizations -menuTitle: List Organizations -weight: 32 ---- -## oasisctl list organizations - -List all organizations the authenticated user is a member of - -``` -oasisctl list organizations [flags] -``` - -## Options -``` - -h, --help help for organizations -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-permissions.md b/site/content/3.11/arangograph/oasisctl/list/list-permissions.md deleted file mode 100644 index db4c2bd43c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-permissions.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Permissions -menuTitle: List Permissions -weight: 33 ---- -## oasisctl list permissions - -List the known permissions - -``` -oasisctl list permissions [flags] -``` - -## Options -``` - -h, --help help for permissions -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-projects.md b/site/content/3.11/arangograph/oasisctl/list/list-projects.md deleted file mode 100644 index 959e80a2fa..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-projects.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Projects -menuTitle: List Projects -weight: 34 ---- -## oasisctl list projects - -List all projects of the given organization - -``` -oasisctl list projects [flags] -``` - -## Options -``` - -h, --help help for projects - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-providers.md b/site/content/3.11/arangograph/oasisctl/list/list-providers.md deleted file mode 100644 index 1b9c90f744..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-providers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Providers -menuTitle: List Providers -weight: 35 ---- -## oasisctl list providers - -List all providers the authenticated user has access to - -``` -oasisctl list providers [flags] -``` - -## Options -``` - -h, --help help for providers - -o, --organization-id string Optional Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-regions.md b/site/content/3.11/arangograph/oasisctl/list/list-regions.md deleted file mode 100644 index 083b85a4a5..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-regions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Regions -menuTitle: List Regions -weight: 36 ---- -## oasisctl list regions - -List all regions of the given provider - -``` -oasisctl list regions [flags] -``` - -## Options -``` - -h, --help help for regions - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-roles.md b/site/content/3.11/arangograph/oasisctl/list/list-roles.md deleted file mode 100644 index ffa2a3ee89..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-roles.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Roles -menuTitle: List Roles -weight: 37 ---- -## oasisctl list roles - -List all roles of the given organization - -``` -oasisctl list roles [flags] -``` - -## Options -``` - -h, --help help for roles - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/list/list-servers.md b/site/content/3.11/arangograph/oasisctl/list/list-servers.md deleted file mode 100644 index f1e3a5f636..0000000000 --- a/site/content/3.11/arangograph/oasisctl/list/list-servers.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Servers -menuTitle: List Servers -weight: 38 ---- -## oasisctl list servers - -List servers information - -``` -oasisctl list servers [flags] -``` - -## Options -``` - -h, --help help for servers -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.11/arangograph/oasisctl/lock/_index.md b/site/content/3.11/arangograph/oasisctl/lock/_index.md deleted file mode 100644 index 1b432aa982..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/_index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Lock -menuTitle: Lock -weight: 16 ---- -## oasisctl lock - -Lock resources - -``` -oasisctl lock [flags] -``` - -## Options -``` - -h, --help help for lock -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl lock cacertificate](lock-cacertificate.md) - Lock a CA certificate, so it cannot be deleted -* [oasisctl lock deployment](lock-deployment.md) - Lock a deployment, so it cannot be deleted -* [oasisctl lock ipallowlist](lock-ipallowlist.md) - Lock an IP allowlist, so it cannot be deleted -* [oasisctl lock organization](lock-organization.md) - Lock an organization, so it cannot be deleted -* [oasisctl lock policy](lock-policy.md) - Lock a backup policy -* [oasisctl lock project](lock-project.md) - Lock a project, so it cannot be deleted - diff --git a/site/content/3.11/arangograph/oasisctl/lock/lock-cacertificate.md b/site/content/3.11/arangograph/oasisctl/lock/lock-cacertificate.md deleted file mode 100644 index 274471190b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/lock-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock CA Certificate -menuTitle: Lock CA Certificate -weight: 1 ---- -## oasisctl lock cacertificate - -Lock a CA certificate, so it cannot be deleted - -``` -oasisctl lock cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.11/arangograph/oasisctl/lock/lock-deployment.md b/site/content/3.11/arangograph/oasisctl/lock/lock-deployment.md deleted file mode 100644 index 3a64c29d17..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/lock-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock Deployment -menuTitle: Lock Deployment -weight: 2 ---- -## oasisctl lock deployment - -Lock a deployment, so it cannot be deleted - -``` -oasisctl lock deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.11/arangograph/oasisctl/lock/lock-ipallowlist.md b/site/content/3.11/arangograph/oasisctl/lock/lock-ipallowlist.md deleted file mode 100644 index 9f4460b2e2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/lock-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock IP Allowlist -menuTitle: Lock IP Allowlist -weight: 3 ---- -## oasisctl lock ipallowlist - -Lock an IP allowlist, so it cannot be deleted - -``` -oasisctl lock ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.11/arangograph/oasisctl/lock/lock-organization.md b/site/content/3.11/arangograph/oasisctl/lock/lock-organization.md deleted file mode 100644 index e65abeea81..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/lock-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Lock Organization -menuTitle: Lock Organization -weight: 4 ---- -## oasisctl lock organization - -Lock an organization, so it cannot be deleted - -``` -oasisctl lock organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.11/arangograph/oasisctl/lock/lock-policy.md b/site/content/3.11/arangograph/oasisctl/lock/lock-policy.md deleted file mode 100644 index 8b70ed3617..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/lock-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Lock Policy -menuTitle: Lock Policy -weight: 5 ---- -## oasisctl lock policy - -Lock a backup policy - -``` -oasisctl lock policy [flags] -``` - -## Options -``` - -d, --backup-policy-id string Identifier of the backup policy - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.11/arangograph/oasisctl/lock/lock-project.md b/site/content/3.11/arangograph/oasisctl/lock/lock-project.md deleted file mode 100644 index f71ac58f82..0000000000 --- a/site/content/3.11/arangograph/oasisctl/lock/lock-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Lock Project -menuTitle: Lock Project -weight: 6 ---- -## oasisctl lock project - -Lock a project, so it cannot be deleted - -``` -oasisctl lock project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.11/arangograph/oasisctl/login.md b/site/content/3.11/arangograph/oasisctl/login.md deleted file mode 100644 index a507d3e942..0000000000 --- a/site/content/3.11/arangograph/oasisctl/login.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Oasisctl Login -menuTitle: Login -weight: 17 ---- -## oasisctl login - -Login to ArangoDB Oasis using an API key - -## Synopsis -To authenticate in a script environment, run: - - export OASIS_TOKEN=$(oasisctl login --key-id=<your-key-id> --key-secret=<your-key-secret>) - - -``` -oasisctl login [flags] -``` - -## Options -``` - -h, --help help for login - -i, --key-id string API key identifier - -s, --key-secret string API key secret -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/logs.md b/site/content/3.11/arangograph/oasisctl/logs.md deleted file mode 100644 index 71f2555f94..0000000000 --- a/site/content/3.11/arangograph/oasisctl/logs.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Logs -menuTitle: Logs -weight: 18 ---- -## oasisctl logs - -Get logs of the servers of a deployment the authenticated user has access to - -``` -oasisctl logs [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - --end string End fetching logs at this timestamp (pass timestamp or duration before now) - --format string Formatting of the log output. It can be one of two: text, json. Text is the default value. (default "text") - -h, --help help for logs - -l, --limit int Limit the number of log lines - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -r, --role string Limit logs to servers with given role only (agents|coordinators|dbservers) - --start string Start fetching logs from this timestamp (pass timestamp or duration before now) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/options.md b/site/content/3.11/arangograph/oasisctl/options.md deleted file mode 100644 index 75823ecb85..0000000000 --- a/site/content/3.11/arangograph/oasisctl/options.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: Command-line client tool for managing ArangoGraph -title: ArangoGraph Shell oasisctl -menuTitle: Options -weight: 1 ---- -## oasisctl - -ArangoGraph Insights Platform - -## Synopsis -ArangoGraph Insights Platform (formerly called Oasis): The Managed Cloud for ArangoDB - -``` -oasisctl [flags] -``` - -## Options -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - -h, --help help for oasisctl - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept](accept/_index.md) - Accept invites -* [oasisctl add](add/_index.md) - Add resources -* [oasisctl auditlog](auditlog/_index.md) - AuditLog resources -* [oasisctl backup](backup/_index.md) - Backup commands -* [oasisctl clone](clone/_index.md) - Clone resources -* [oasisctl completion](completion.md) - Generates bash completion scripts -* [oasisctl create](create/_index.md) - Create resources -* [oasisctl delete](delete/_index.md) - Delete resources -* [oasisctl disable](disable/_index.md) - Disable some settings related to deployment -* [oasisctl enable](enable/_index.md) - Enable some settings related to deployment -* [oasisctl generate-docs](generate-docs.md) - Generate output -* [oasisctl get](get/_index.md) - Get information -* [oasisctl import](import.md) - Import data from a local database or from another remote database into an Oasis deployment. -* [oasisctl list](list/_index.md) - List resources -* [oasisctl lock](lock/_index.md) - Lock resources -* [oasisctl login](login.md) - Login to ArangoDB Oasis using an API key -* [oasisctl logs](logs.md) - Get logs of the servers of a deployment the authenticated user has access to -* [oasisctl pause](pause/_index.md) - Pause resources -* [oasisctl rebalance](rebalance/_index.md) - Rebalance resources -* [oasisctl reject](reject/_index.md) - Reject invites -* [oasisctl renew](renew/_index.md) - Renew keys & tokens -* [oasisctl resume](resume/_index.md) - Resume resources -* [oasisctl revoke](revoke/_index.md) - Revoke keys & tokens -* [oasisctl rotate](rotate/_index.md) - Rotate resources -* [oasisctl top](top.md) - Show the most important server metrics -* [oasisctl unlock](unlock/_index.md) - Unlock resources -* [oasisctl update](update/_index.md) - Update resources -* [oasisctl upgrade](upgrade.md) - Upgrade Oasisctl tool -* [oasisctl version](version.md) - Show the current version of this tool -* [oasisctl wait](wait/_index.md) - Wait for a status change - diff --git a/site/content/3.11/arangograph/oasisctl/pause/_index.md b/site/content/3.11/arangograph/oasisctl/pause/_index.md deleted file mode 100644 index ce02e840c5..0000000000 --- a/site/content/3.11/arangograph/oasisctl/pause/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Pause -menuTitle: Pause -weight: 19 ---- -## oasisctl pause - -Pause resources - -``` -oasisctl pause [flags] -``` - -## Options -``` - -h, --help help for pause -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl pause notebook](pause-notebook.md) - Pause a notebook - diff --git a/site/content/3.11/arangograph/oasisctl/pause/pause-notebook.md b/site/content/3.11/arangograph/oasisctl/pause/pause-notebook.md deleted file mode 100644 index 0db646d81b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/pause/pause-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Pause Notebook -menuTitle: Pause Notebook -weight: 1 ---- -## oasisctl pause notebook - -Pause a notebook - -``` -oasisctl pause notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl pause](_index.md) - Pause resources - diff --git a/site/content/3.11/arangograph/oasisctl/rebalance/_index.md b/site/content/3.11/arangograph/oasisctl/rebalance/_index.md deleted file mode 100644 index c1532b7f91..0000000000 --- a/site/content/3.11/arangograph/oasisctl/rebalance/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance -menuTitle: Rebalance -weight: 20 ---- -## oasisctl rebalance - -Rebalance resources - -``` -oasisctl rebalance [flags] -``` - -## Options -``` - -h, --help help for rebalance -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl rebalance deployment](rebalance-deployment.md) - Rebalance deployment resources - diff --git a/site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md b/site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md deleted file mode 100644 index 706b6339e9..0000000000 --- a/site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance Deployment Shards -menuTitle: Rebalance Deployment Shards -weight: 2 ---- -## oasisctl rebalance deployment shards - -Rebalance shards of a deployment - -``` -oasisctl rebalance deployment shards [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for shards -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rebalance deployment](rebalance-deployment.md) - Rebalance deployment resources - diff --git a/site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment.md b/site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment.md deleted file mode 100644 index 7759314ec5..0000000000 --- a/site/content/3.11/arangograph/oasisctl/rebalance/rebalance-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance Deployment -menuTitle: Rebalance Deployment -weight: 1 ---- -## oasisctl rebalance deployment - -Rebalance deployment resources - -``` -oasisctl rebalance deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rebalance](_index.md) - Rebalance resources -* [oasisctl rebalance deployment shards](rebalance-deployment-shards.md) - Rebalance shards of a deployment - diff --git a/site/content/3.11/arangograph/oasisctl/reject/_index.md b/site/content/3.11/arangograph/oasisctl/reject/_index.md deleted file mode 100644 index 69cff60ece..0000000000 --- a/site/content/3.11/arangograph/oasisctl/reject/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Reject -menuTitle: Reject -weight: 21 ---- -## oasisctl reject - -Reject invites - -``` -oasisctl reject [flags] -``` - -## Options -``` - -h, --help help for reject -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl reject organization](reject-organization.md) - Reject organization related invites - diff --git a/site/content/3.11/arangograph/oasisctl/reject/reject-organization-invite.md b/site/content/3.11/arangograph/oasisctl/reject/reject-organization-invite.md deleted file mode 100644 index d43ecfca52..0000000000 --- a/site/content/3.11/arangograph/oasisctl/reject/reject-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Reject Organization Invite -menuTitle: Reject Organization Invite -weight: 2 ---- -## oasisctl reject organization invite - -Reject an organization invite the authenticated user has access to - -``` -oasisctl reject organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl reject organization](reject-organization.md) - Reject organization related invites - diff --git a/site/content/3.11/arangograph/oasisctl/reject/reject-organization.md b/site/content/3.11/arangograph/oasisctl/reject/reject-organization.md deleted file mode 100644 index c688b02cd1..0000000000 --- a/site/content/3.11/arangograph/oasisctl/reject/reject-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Reject Organization -menuTitle: Reject Organization -weight: 1 ---- -## oasisctl reject organization - -Reject organization related invites - -``` -oasisctl reject organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl reject](_index.md) - Reject invites -* [oasisctl reject organization invite](reject-organization-invite.md) - Reject an organization invite the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/renew/_index.md b/site/content/3.11/arangograph/oasisctl/renew/_index.md deleted file mode 100644 index b140a835de..0000000000 --- a/site/content/3.11/arangograph/oasisctl/renew/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Renew -menuTitle: Renew -weight: 22 ---- -## oasisctl renew - -Renew keys & tokens - -``` -oasisctl renew [flags] -``` - -## Options -``` - -h, --help help for renew -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl renew apikey](renew-apikey.md) - Renew API keys & tokens - diff --git a/site/content/3.11/arangograph/oasisctl/renew/renew-apikey-token.md b/site/content/3.11/arangograph/oasisctl/renew/renew-apikey-token.md deleted file mode 100644 index e6a1798243..0000000000 --- a/site/content/3.11/arangograph/oasisctl/renew/renew-apikey-token.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Renew API Key Token -menuTitle: Renew API Key Token -weight: 2 ---- -## oasisctl renew apikey token - -Renew an API key token - -## Synopsis -Renew the token (resulting from API key authentication) - -``` -oasisctl renew apikey token [flags] -``` - -## Options -``` - -h, --help help for token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl renew apikey](renew-apikey.md) - Renew API keys & tokens - diff --git a/site/content/3.11/arangograph/oasisctl/renew/renew-apikey.md b/site/content/3.11/arangograph/oasisctl/renew/renew-apikey.md deleted file mode 100644 index 14c1b7ec4d..0000000000 --- a/site/content/3.11/arangograph/oasisctl/renew/renew-apikey.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Renew API Key -menuTitle: Renew API Key -weight: 1 ---- -## oasisctl renew apikey - -Renew API keys & tokens - -``` -oasisctl renew apikey [flags] -``` - -## Options -``` - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl renew](_index.md) - Renew keys & tokens -* [oasisctl renew apikey token](renew-apikey-token.md) - Renew an API key token - diff --git a/site/content/3.11/arangograph/oasisctl/resume/_index.md b/site/content/3.11/arangograph/oasisctl/resume/_index.md deleted file mode 100644 index 78485175c1..0000000000 --- a/site/content/3.11/arangograph/oasisctl/resume/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Resume -menuTitle: Resume -weight: 23 ---- -## oasisctl resume - -Resume resources - -``` -oasisctl resume [flags] -``` - -## Options -``` - -h, --help help for resume -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl resume deployment](resume-deployment.md) - Resume a paused deployment the authenticated user has access to -* [oasisctl resume notebook](resume-notebook.md) - Resume a notebook - diff --git a/site/content/3.11/arangograph/oasisctl/resume/resume-deployment.md b/site/content/3.11/arangograph/oasisctl/resume/resume-deployment.md deleted file mode 100644 index 7cbc18ef00..0000000000 --- a/site/content/3.11/arangograph/oasisctl/resume/resume-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Resume Deployment -menuTitle: Resume Deployment -weight: 1 ---- -## oasisctl resume deployment - -Resume a paused deployment the authenticated user has access to - -``` -oasisctl resume deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl resume](_index.md) - Resume resources - diff --git a/site/content/3.11/arangograph/oasisctl/resume/resume-notebook.md b/site/content/3.11/arangograph/oasisctl/resume/resume-notebook.md deleted file mode 100644 index 17add47562..0000000000 --- a/site/content/3.11/arangograph/oasisctl/resume/resume-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Resume Notebook -menuTitle: Resume Notebook -weight: 2 ---- -## oasisctl resume notebook - -Resume a notebook - -``` -oasisctl resume notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl resume](_index.md) - Resume resources - diff --git a/site/content/3.11/arangograph/oasisctl/revoke/_index.md b/site/content/3.11/arangograph/oasisctl/revoke/_index.md deleted file mode 100644 index 80ad7af060..0000000000 --- a/site/content/3.11/arangograph/oasisctl/revoke/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Revoke -menuTitle: Revoke -weight: 24 ---- -## oasisctl revoke - -Revoke keys & tokens - -``` -oasisctl revoke [flags] -``` - -## Options -``` - -h, --help help for revoke -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl revoke apikey](revoke-apikey.md) - Revoke an API key with given identifier -* [oasisctl revoke metrics](revoke-metrics.md) - Revoke keys & tokens - diff --git a/site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey-token.md b/site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey-token.md deleted file mode 100644 index 795b5e5605..0000000000 --- a/site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey-token.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Revoke API Key Token -menuTitle: Revoke API Key Token -weight: 2 ---- -## oasisctl revoke apikey token - -Revoke an API key token - -## Synopsis -Revoke the token (resulting from API key authentication) - -``` -oasisctl revoke apikey token [flags] -``` - -## Options -``` - -h, --help help for token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke apikey](revoke-apikey.md) - Revoke an API key with given identifier - diff --git a/site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey.md b/site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey.md deleted file mode 100644 index 5c15ef927a..0000000000 --- a/site/content/3.11/arangograph/oasisctl/revoke/revoke-apikey.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Revoke API Key -menuTitle: Revoke API Key -weight: 1 ---- -## oasisctl revoke apikey - -Revoke an API key with given identifier - -``` -oasisctl revoke apikey [flags] -``` - -## Options -``` - -i, --apikey-id string Identifier of the API key to revoke - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke](_index.md) - Revoke keys & tokens -* [oasisctl revoke apikey token](revoke-apikey-token.md) - Revoke an API key token - diff --git a/site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics-token.md b/site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics-token.md deleted file mode 100644 index 0876f21606..0000000000 --- a/site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Revoke Metrics Token -menuTitle: Revoke Metrics Token -weight: 4 ---- -## oasisctl revoke metrics token - -Revoke a metrics token for a deployment - -``` -oasisctl revoke metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke metrics](revoke-metrics.md) - Revoke keys & tokens - diff --git a/site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics.md b/site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics.md deleted file mode 100644 index 638a17df00..0000000000 --- a/site/content/3.11/arangograph/oasisctl/revoke/revoke-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Revoke Metrics -menuTitle: Revoke Metrics -weight: 3 ---- -## oasisctl revoke metrics - -Revoke keys & tokens - -``` -oasisctl revoke metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke](_index.md) - Revoke keys & tokens -* [oasisctl revoke metrics token](revoke-metrics-token.md) - Revoke a metrics token for a deployment - diff --git a/site/content/3.11/arangograph/oasisctl/rotate/_index.md b/site/content/3.11/arangograph/oasisctl/rotate/_index.md deleted file mode 100644 index e24096c868..0000000000 --- a/site/content/3.11/arangograph/oasisctl/rotate/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rotate -menuTitle: Rotate -weight: 25 ---- -## oasisctl rotate - -Rotate resources - -``` -oasisctl rotate [flags] -``` - -## Options -``` - -h, --help help for rotate -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl rotate deployment](rotate-deployment.md) - Rotate deployment resources - diff --git a/site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment-server.md b/site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment-server.md deleted file mode 100644 index 5d281d1ae4..0000000000 --- a/site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment-server.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Rotate Deployment Server -menuTitle: Rotate Deployment Server -weight: 2 ---- -## oasisctl rotate deployment server - -Rotate a single server of a deployment - -``` -oasisctl rotate deployment server [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for server - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -s, --server-id strings Identifier of the deployment server -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rotate deployment](rotate-deployment.md) - Rotate deployment resources - diff --git a/site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment.md b/site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment.md deleted file mode 100644 index de899d924d..0000000000 --- a/site/content/3.11/arangograph/oasisctl/rotate/rotate-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rotate Deployment -menuTitle: Rotate Deployment -weight: 1 ---- -## oasisctl rotate deployment - -Rotate deployment resources - -``` -oasisctl rotate deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rotate](_index.md) - Rotate resources -* [oasisctl rotate deployment server](rotate-deployment-server.md) - Rotate a single server of a deployment - diff --git a/site/content/3.11/arangograph/oasisctl/top.md b/site/content/3.11/arangograph/oasisctl/top.md deleted file mode 100644 index d89a83ebfe..0000000000 --- a/site/content/3.11/arangograph/oasisctl/top.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Top -menuTitle: Top -weight: 26 ---- -## oasisctl top - -Show the most important server metrics - -``` -oasisctl top [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for top - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/_index.md b/site/content/3.11/arangograph/oasisctl/unlock/_index.md deleted file mode 100644 index 2c376ce6fd..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/_index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Unlock -menuTitle: Unlock -weight: 27 ---- -## oasisctl unlock - -Unlock resources - -``` -oasisctl unlock [flags] -``` - -## Options -``` - -h, --help help for unlock -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl unlock cacertificate](unlock-cacertificate.md) - Unlock a CA certificate, so it can be deleted -* [oasisctl unlock deployment](unlock-deployment.md) - Unlock a deployment, so it can be deleted -* [oasisctl unlock ipallowlist](unlock-ipallowlist.md) - Unlock an IP allowlist, so it can be deleted -* [oasisctl unlock organization](unlock-organization.md) - Unlock an organization, so it can be deleted -* [oasisctl unlock policy](unlock-policy.md) - Unlock a backup policy -* [oasisctl unlock project](unlock-project.md) - Unlock a project, so it can be deleted - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/unlock-cacertificate.md b/site/content/3.11/arangograph/oasisctl/unlock/unlock-cacertificate.md deleted file mode 100644 index 418fb91ae6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/unlock-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock CA Certificate -menuTitle: Unlock CA Certificate -weight: 1 ---- -## oasisctl unlock cacertificate - -Unlock a CA certificate, so it can be deleted - -``` -oasisctl unlock cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/unlock-deployment.md b/site/content/3.11/arangograph/oasisctl/unlock/unlock-deployment.md deleted file mode 100644 index 6d870921e6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/unlock-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock Deployment -menuTitle: Unlock Deployment -weight: 2 ---- -## oasisctl unlock deployment - -Unlock a deployment, so it can be deleted - -``` -oasisctl unlock deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/unlock-ipallowlist.md b/site/content/3.11/arangograph/oasisctl/unlock/unlock-ipallowlist.md deleted file mode 100644 index 36f8fdbaed..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/unlock-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock IP Allowlist -menuTitle: Unlock IP Allowlist -weight: 3 ---- -## oasisctl unlock ipallowlist - -Unlock an IP allowlist, so it can be deleted - -``` -oasisctl unlock ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/unlock-organization.md b/site/content/3.11/arangograph/oasisctl/unlock/unlock-organization.md deleted file mode 100644 index bfc70efccd..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/unlock-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Unlock Organization -menuTitle: Unlock Organization -weight: 4 ---- -## oasisctl unlock organization - -Unlock an organization, so it can be deleted - -``` -oasisctl unlock organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/unlock-policy.md b/site/content/3.11/arangograph/oasisctl/unlock/unlock-policy.md deleted file mode 100644 index 2646b5af51..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/unlock-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Unlock Policy -menuTitle: Unlock Policy -weight: 5 ---- -## oasisctl unlock policy - -Unlock a backup policy - -``` -oasisctl unlock policy [flags] -``` - -## Options -``` - -d, --backup-policy-id string Identifier of the backup policy - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.11/arangograph/oasisctl/unlock/unlock-project.md b/site/content/3.11/arangograph/oasisctl/unlock/unlock-project.md deleted file mode 100644 index 211e810283..0000000000 --- a/site/content/3.11/arangograph/oasisctl/unlock/unlock-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Unlock Project -menuTitle: Unlock Project -weight: 6 ---- -## oasisctl unlock project - -Unlock a project, so it can be deleted - -``` -oasisctl unlock project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/_index.md b/site/content/3.11/arangograph/oasisctl/update/_index.md deleted file mode 100644 index 0d1501cbe5..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/_index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Oasisctl Update -menuTitle: Update -weight: 28 ---- -## oasisctl update - -Update resources - -``` -oasisctl update [flags] -``` - -## Options -``` - -h, --help help for update -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl update auditlog](update-auditlog.md) - Update an auditlog -* [oasisctl update backup](update-backup.md) - Update a backup -* [oasisctl update cacertificate](update-cacertificate.md) - Update a CA certificate the authenticated user has access to -* [oasisctl update deployment](update-deployment.md) - Update a deployment the authenticated user has access to -* [oasisctl update group](update-group.md) - Update a group the authenticated user has access to -* [oasisctl update ipallowlist](update-ipallowlist.md) - Update an IP allowlist the authenticated user has access to -* [oasisctl update metrics](update-metrics.md) - Update metrics resources -* [oasisctl update notebook](update-notebook.md) - Update notebook -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update private](update-private.md) - Update private resources -* [oasisctl update project](update-project.md) - Update a project the authenticated user has access to -* [oasisctl update role](update-role.md) - Update a role the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-auditlog.md b/site/content/3.11/arangograph/oasisctl/update/update-auditlog.md deleted file mode 100644 index 8c92aa1c12..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-auditlog.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Audit Log -menuTitle: Update Audit Log -weight: 1 ---- -## oasisctl update auditlog - -Update an auditlog - -``` -oasisctl update auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to update. - --default If set, this AuditLog is the default for the organization. - --description string Description of the audit log. - -h, --help help for auditlog - --name string Name of the audit log. - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-backup-policy.md b/site/content/3.11/arangograph/oasisctl/update/update-backup-policy.md deleted file mode 100644 index cad0d2417f..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-backup-policy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Oasisctl Update Backup Policy -menuTitle: Update Backup Policy -weight: 3 ---- -## oasisctl update backup policy - -Update a backup policy - -``` -oasisctl update backup policy [flags] -``` - -## Options -``` - --additional-region-ids strings Add backup to the specified addition regions - -d, --backup-policy-id string Identifier of the backup policy - --day-of-the-month int32 Run the backup on the specified day of the month (1-31) (default 1) - --description string Description of the backup - --email-notification string Email notification setting (Never|FailureOnly|Always) - --every-interval-hours int32 Schedule should run with an interval of the specified hours (1-23) - --friday If set, a backup will be created on Fridays. Set to false explicitly to clear the flag. - -h, --help help for policy - --hours int32 Hours part of the time of day (0-23) - --minutes int32 Minutes part of the time of day (0-59) - --minutes-offset int32 Schedule should run with specific minutes offset (0-59) - --monday If set, a backup will be created on Mondays. Set to false explicitly to clear the flag. - --name string Name of the deployment - --paused The policy is paused. Set to false explicitly to clear the flag. - --retention-period int Backups created by this policy will be automatically deleted after the specified retention period. A value of 0 means that backup will never be deleted. - --saturday If set, a backup will be created on Saturdays. Set to false explicitly to clear the flag. - --schedule-type string Schedule of the policy (Hourly|Daily|Monthly) - --sunday If set, a backup will be created on Sundays. Set to false explicitly to clear the flag. - --thursday If set, a backup will be created on Thursdays. Set to false explicitly to clear the flag. - --time-zone string The time-zone this time of day applies to (empty means UTC). Names MUST be exactly as defined in RFC-822. (default "UTC") - --tuesday If set, a backup will be created on Tuesdays. Set to false explicitly to clear the flag. - --upload The backup should be uploaded. Set to false explicitly to clear the flag. - --wednesday If set, a backup will be created on Wednesdays. Set to false explicitly to clear the flag. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update backup](update-backup.md) - Update a backup - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-backup.md b/site/content/3.11/arangograph/oasisctl/update/update-backup.md deleted file mode 100644 index 9ce085b61b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-backup.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Backup -menuTitle: Update Backup -weight: 2 ---- -## oasisctl update backup - -Update a backup - -``` -oasisctl update backup [flags] -``` - -## Options -``` - --auto-deleted-at int Time (h) until auto delete of the backup - -d, --backup-id string Identifier of the backup - --description string Description of the backup - -h, --help help for backup - --name string Name of the backup - --upload The backups should be uploaded -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update backup policy](update-backup-policy.md) - Update a backup policy - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-cacertificate.md b/site/content/3.11/arangograph/oasisctl/update/update-cacertificate.md deleted file mode 100644 index 1b97fe7a45..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-cacertificate.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update CA Certificate -menuTitle: Update CA Certificate -weight: 4 ---- -## oasisctl update cacertificate - -Update a CA certificate the authenticated user has access to - -``` -oasisctl update cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - --description string Description of the CA certificate - -h, --help help for cacertificate - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --use-well-known-certificate Sets the usage of a well known certificate ie. Let's Encrypt -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-deployment.md b/site/content/3.11/arangograph/oasisctl/update/update-deployment.md deleted file mode 100644 index b7c36cace2..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-deployment.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Oasisctl Update Deployment -menuTitle: Update Deployment -weight: 5 ---- -## oasisctl update deployment - -Update a deployment the authenticated user has access to - -``` -oasisctl update deployment [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate to use for the deployment - --coordinator-memory-size int32 Set memory size of Coordinators for flexible deployments (GiB) (default 4) - --coordinators int32 Set number of Coordinators for flexible deployments (default 3) - --custom-image string Set a custom image to use for the deployment. Only available for selected customers. - --dbserver-disk-size int32 Set disk size of DB-Servers for flexible deployments (GiB) (default 32) - --dbserver-memory-size int32 Set memory size of DB-Servers for flexible deployments (GiB) (default 4) - --dbservers int32 Set number of DB-Servers for flexible deployments (default 3) - -d, --deployment-id string Identifier of the deployment - --description string Description of the deployment - --disable-foxx-authentication Disable authentication of requests to Foxx application. - --disk-performance-id string Set the disk performance to use for this deployment. - --drop-vst-support Drop VST protocol support to improve resilience. - -h, --help help for deployment - -i, --ipallowlist-id string Identifier of the IP allowlist to use for the deployment - --is-platform-authentication-enabled Enable platform authentication for deployment. - --max-node-disk-size int32 Set maximum disk size for nodes for autoscaler (GiB) - --model string Set model of the deployment (default "oneshard") - --name string Name of the deployment - --node-count int32 Set the number of desired nodes (default 3) - --node-disk-size int32 Set disk size for nodes (GiB) - --node-size-id string Set the node size to use for this deployment - --notification-email-address strings Set email address(-es) that will be used for notifications related to this deployment. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --version string Version of ArangoDB to use for the deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-group.md b/site/content/3.11/arangograph/oasisctl/update/update-group.md deleted file mode 100644 index 7021923d4c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-group.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Group -menuTitle: Update Group -weight: 6 ---- -## oasisctl update group - -Update a group the authenticated user has access to - -``` -oasisctl update group [flags] -``` - -## Options -``` - --description string Description of the group - -g, --group-id string Identifier of the group - -h, --help help for group - --name string Name of the group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-ipallowlist.md b/site/content/3.11/arangograph/oasisctl/update/update-ipallowlist.md deleted file mode 100644 index 089d41026c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-ipallowlist.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Oasisctl Update IP Allowlist -menuTitle: Update IP Allowlist -weight: 7 ---- -## oasisctl update ipallowlist - -Update an IP allowlist the authenticated user has access to - -``` -oasisctl update ipallowlist [flags] -``` - -## Options -``` - --add-cidr-range strings List of CIDR ranges to add to the IP allowlist - --description string Description of the CA certificate - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --remote-inspection-allowed If set, remote connectivity checks by the Oasis platform are allowed - --remove-cidr-range strings List of CIDR ranges to remove from the IP allowlist -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-metrics-token.md b/site/content/3.11/arangograph/oasisctl/update/update-metrics-token.md deleted file mode 100644 index 2ff4a301aa..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-metrics-token.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Metrics Token -menuTitle: Update Metrics Token -weight: 9 ---- -## oasisctl update metrics token - -Update a metrics token - -``` -oasisctl update metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - --description string Description of the CA certificate - -h, --help help for token - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update metrics](update-metrics.md) - Update metrics resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-metrics.md b/site/content/3.11/arangograph/oasisctl/update/update-metrics.md deleted file mode 100644 index d8fc683f1e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Metrics -menuTitle: Update Metrics -weight: 8 ---- -## oasisctl update metrics - -Update metrics resources - -``` -oasisctl update metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update metrics token](update-metrics-token.md) - Update a metrics token - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-notebook.md b/site/content/3.11/arangograph/oasisctl/update/update-notebook.md deleted file mode 100644 index 2b6fee7bb0..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-notebook.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Notebook -menuTitle: Update Notebook -weight: 10 ---- -## oasisctl update notebook - -Update notebook - -``` -oasisctl update notebook [flags] -``` - -## Options -``` - -d, --description string Description of the notebook - -s, --disk-size int32 Notebook disk size in GiB - -h, --help help for notebook - --name string Name of the notebook - -n, --notebook-id string Identifier of the notebook - -m, --notebook-model string Identifier of the notebook model -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-organization-authentication-providers.md b/site/content/3.11/arangograph/oasisctl/update/update-organization-authentication-providers.md deleted file mode 100644 index 8d8d9be5de..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-organization-authentication-providers.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Organization Authentication Providers -menuTitle: Update Organization Authentication Providers -weight: 13 ---- -## oasisctl update organization authentication providers - -Update allowed authentication providers for an organization the authenticated user has access to - -``` -oasisctl update organization authentication providers [flags] -``` - -## Options -``` - --enable-github If set, allow access from user accounts authentication through Github - --enable-google If set, allow access from user accounts authentication through Google - --enable-microsoft If set, allow access from user accounts authentication through Microsoft - --enable-sso If set, allow access from user accounts authentication through single sign on (sso) - --enable-username-password If set, allow access from user accounts authentication through username-password - -h, --help help for providers - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization authentication](update-organization-authentication.md) - Update authentication settings for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-organization-authentication.md b/site/content/3.11/arangograph/oasisctl/update/update-organization-authentication.md deleted file mode 100644 index 328b81b297..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-organization-authentication.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Authentication -menuTitle: Update Organization Authentication -weight: 12 ---- -## oasisctl update organization authentication - -Update authentication settings for an organization - -``` -oasisctl update organization authentication [flags] -``` - -## Options -``` - -h, --help help for authentication -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update organization authentication providers](update-organization-authentication-providers.md) - Update allowed authentication providers for an organization the authenticated user has access to - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md b/site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md deleted file mode 100644 index 6d860fa8d6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Update Organization Email Domain Restrictions -menuTitle: Update Organization Email Domain Restrictions -weight: 16 ---- -## oasisctl update organization email domain restrictions - -Update which domain restrictions are placed on accessing a specific organization - -``` -oasisctl update organization email domain restrictions [flags] -``` - -## Options -``` - -d, --allowed-domain strings Allowed email domains for users of the organization - -h, --help help for restrictions - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization email domain](update-organization-email-domain.md) - Update email domain specific information for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain.md b/site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain.md deleted file mode 100644 index 57f79b6fbb..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-organization-email-domain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Email Domain -menuTitle: Update Organization Email Domain -weight: 15 ---- -## oasisctl update organization email domain - -Update email domain specific information for an organization - -``` -oasisctl update organization email domain [flags] -``` - -## Options -``` - -h, --help help for domain -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization email](update-organization-email.md) - Update email specific information for an organization -* [oasisctl update organization email domain restrictions](update-organization-email-domain-restrictions.md) - Update which domain restrictions are placed on accessing a specific organization - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-organization-email.md b/site/content/3.11/arangograph/oasisctl/update/update-organization-email.md deleted file mode 100644 index 89f05ed737..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-organization-email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Email -menuTitle: Update Organization Email -weight: 14 ---- -## oasisctl update organization email - -Update email specific information for an organization - -``` -oasisctl update organization email [flags] -``` - -## Options -``` - -h, --help help for email -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update organization email domain](update-organization-email-domain.md) - Update email domain specific information for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-organization.md b/site/content/3.11/arangograph/oasisctl/update/update-organization.md deleted file mode 100644 index 670d291842..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-organization.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Organization -menuTitle: Update Organization -weight: 11 ---- -## oasisctl update organization - -Update an organization the authenticated user has access to - -``` -oasisctl update organization [flags] -``` - -## Options -``` - --description string Description of the organization - -h, --help help for organization - --name string Name of the organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update organization authentication](update-organization-authentication.md) - Update authentication settings for an organization -* [oasisctl update organization email](update-organization-email.md) - Update email specific information for an organization - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-policy-add-binding.md b/site/content/3.11/arangograph/oasisctl/update/update-policy-add-binding.md deleted file mode 100644 index df89601244..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-policy-add-binding.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Policy Add Binding -menuTitle: Update Policy Add Binding -weight: 19 ---- -## oasisctl update policy add binding - -Add a role binding to a policy - -``` -oasisctl update policy add binding [flags] -``` - -## Options -``` - --group-id strings Identifiers of the groups to add bindings for - -h, --help help for binding - -r, --role-id string Identifier of the role to bind to - -u, --url string URL of the resource to update the policy for - --user-id strings Identifiers of the users to add bindings for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy add](update-policy-add.md) - Add to a policy - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-policy-add.md b/site/content/3.11/arangograph/oasisctl/update/update-policy-add.md deleted file mode 100644 index 42e655fe7c..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-policy-add.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Policy Add -menuTitle: Update Policy Add -weight: 18 ---- -## oasisctl update policy add - -Add to a policy - -``` -oasisctl update policy add [flags] -``` - -## Options -``` - -h, --help help for add -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update policy add binding](update-policy-add-binding.md) - Add a role binding to a policy - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-policy-delete-binding.md b/site/content/3.11/arangograph/oasisctl/update/update-policy-delete-binding.md deleted file mode 100644 index 602bc93e93..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-policy-delete-binding.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Policy Delete Binding -menuTitle: Update Policy Delete Binding -weight: 21 ---- -## oasisctl update policy delete binding - -Delete a role binding from a policy - -``` -oasisctl update policy delete binding [flags] -``` - -## Options -``` - --group-id strings Identifiers of the groups to delete bindings for - -h, --help help for binding - -r, --role-id string Identifier of the role to delete bind for - -u, --url string URL of the resource to update the policy for - --user-id strings Identifiers of the users to delete bindings for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy delete](update-policy-delete.md) - Delete from a policy - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-policy-delete.md b/site/content/3.11/arangograph/oasisctl/update/update-policy-delete.md deleted file mode 100644 index dec2527590..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-policy-delete.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Policy Delete -menuTitle: Update Policy Delete -weight: 20 ---- -## oasisctl update policy delete - -Delete from a policy - -``` -oasisctl update policy delete [flags] -``` - -## Options -``` - -h, --help help for delete -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update policy delete binding](update-policy-delete-binding.md) - Delete a role binding from a policy - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-policy.md b/site/content/3.11/arangograph/oasisctl/update/update-policy.md deleted file mode 100644 index 132c0b4123..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-policy.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Update Policy -menuTitle: Update Policy -weight: 17 ---- -## oasisctl update policy - -Update a policy - -``` -oasisctl update policy [flags] -``` - -## Options -``` - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update policy add](update-policy-add.md) - Add to a policy -* [oasisctl update policy delete](update-policy-delete.md) - Delete from a policy - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-private-endpoint-service.md b/site/content/3.11/arangograph/oasisctl/update/update-private-endpoint-service.md deleted file mode 100644 index 81aa0917f6..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-private-endpoint-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Oasisctl Update Private Endpoint Service -menuTitle: Update Private Endpoint Service -weight: 24 ---- -## oasisctl update private endpoint service - -Update a Private Endpoint Service attached to an existing deployment - -``` -oasisctl update private endpoint service [flags] -``` - -## Options -``` - --alternate-dns-name strings DNS names used for the deployment in the private network - --aws-principal strings List of AWS Principals from which a Private Endpoint can be created (Format: <AccountID>[/Role/<RoleName>|/User/<UserName>]) - --azure-client-subscription-id strings List of Azure subscription IDs from which a Private Endpoint can be created - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - --description string Description of the private endpoint service - --enable-private-dns Enable private DNS (applicable for AWS only) - --gcp-project strings List of GCP projects from which a Private Endpoint can be created - -h, --help help for service - --name string Name of the private endpoint service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update private endpoint](update-private-endpoint.md) - - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-private-endpoint.md b/site/content/3.11/arangograph/oasisctl/update/update-private-endpoint.md deleted file mode 100644 index a66ead3924..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Private Endpoint -menuTitle: Update Private Endpoint -weight: 23 ---- -## oasisctl update private endpoint - - - -``` -oasisctl update private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update private](update-private.md) - Update private resources -* [oasisctl update private endpoint service](update-private-endpoint-service.md) - Update a Private Endpoint Service attached to an existing deployment - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-private.md b/site/content/3.11/arangograph/oasisctl/update/update-private.md deleted file mode 100644 index 8c414612ac..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Private -menuTitle: Update Private -weight: 22 ---- -## oasisctl update private - -Update private resources - -``` -oasisctl update private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update private endpoint](update-private-endpoint.md) - - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-project.md b/site/content/3.11/arangograph/oasisctl/update/update-project.md deleted file mode 100644 index 0965a3684e..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-project.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Project -menuTitle: Update Project -weight: 25 ---- -## oasisctl update project - -Update a project the authenticated user has access to - -``` -oasisctl update project [flags] -``` - -## Options -``` - --description string Description of the project - -h, --help help for project - --name string Name of the project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/update/update-role.md b/site/content/3.11/arangograph/oasisctl/update/update-role.md deleted file mode 100644 index 58d7f2e8ab..0000000000 --- a/site/content/3.11/arangograph/oasisctl/update/update-role.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Role -menuTitle: Update Role -weight: 26 ---- -## oasisctl update role - -Update a role the authenticated user has access to - -``` -oasisctl update role [flags] -``` - -## Options -``` - --add-permission strings Permissions to add to the role - --description string Description of the role - -h, --help help for role - --name string Name of the role - -o, --organization-id string Identifier of the organization - --remove-permission strings Permissions to remove from the role - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.11/arangograph/oasisctl/upgrade.md b/site/content/3.11/arangograph/oasisctl/upgrade.md deleted file mode 100644 index 8d77aa3ecf..0000000000 --- a/site/content/3.11/arangograph/oasisctl/upgrade.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Upgrade -menuTitle: Upgrade -weight: 29 ---- -## oasisctl upgrade - -Upgrade Oasisctl tool - -## Synopsis -Check the latest, compatible version and upgrade this tool to that. - -``` -oasisctl upgrade [flags] -``` - -## Options -``` - -d, --dry-run Do an upgrade without applying the version. - -f, --force Force an upgrade even if the versions match. - -h, --help help for upgrade -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/version.md b/site/content/3.11/arangograph/oasisctl/version.md deleted file mode 100644 index e8e5ee7c8b..0000000000 --- a/site/content/3.11/arangograph/oasisctl/version.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl Version -menuTitle: Version -weight: 30 ---- -## oasisctl version - -Show the current version of this tool - -``` -oasisctl version [flags] -``` - -## Options -``` - -h, --help help for version -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.11/arangograph/oasisctl/wait/_index.md b/site/content/3.11/arangograph/oasisctl/wait/_index.md deleted file mode 100644 index 1ccac25259..0000000000 --- a/site/content/3.11/arangograph/oasisctl/wait/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Wait -menuTitle: Wait -weight: 31 ---- -## oasisctl wait - -Wait for a status change - -``` -oasisctl wait [flags] -``` - -## Options -``` - -h, --help help for wait -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl wait deployment](wait-deployment.md) - Wait for a deployment to reach the ready status - diff --git a/site/content/3.11/arangograph/oasisctl/wait/wait-deployment.md b/site/content/3.11/arangograph/oasisctl/wait/wait-deployment.md deleted file mode 100644 index ddc2c82d76..0000000000 --- a/site/content/3.11/arangograph/oasisctl/wait/wait-deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Wait Deployment -menuTitle: Wait Deployment -weight: 1 ---- -## oasisctl wait deployment - -Wait for a deployment to reach the ready status - -``` -oasisctl wait deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --timeout duration How long to wait for the deployment to reach the ready status (default 20m0s) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl wait](_index.md) - Wait for a status change - diff --git a/site/content/3.11/arangograph/organizations/_index.md b/site/content/3.11/arangograph/organizations/_index.md deleted file mode 100644 index 083b746dda..0000000000 --- a/site/content/3.11/arangograph/organizations/_index.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Organizations in ArangoGraph -menuTitle: Organizations -weight: 10 -description: >- - How to manage organizations and what type of packages ArangoGraph offers ---- -An ArangoGraph organizations is a container for projects. An organization -typically represents a (commercial) entity such as a company, a company division, -an institution, or a non-profit organization. - -**<u>Organizations</u> → Projects → Deployments** - -Users can be members of one or more organizations. However, you can only be a -member of one _Free-to-try_ tier organization at a time. - -## How to switch between my organizations - -1. The first entry in the main navigation (with a double arrow icon) indicates - the current organization. -2. Click it to bring up a dropdown menu to select another organization of which you - are a member. -3. The overview will open for the selected organization, showing the number of - projects, the tier and when it was created. - -![ArangoGraph Organization Switcher](../../../images/arangograph-organization-switcher.png) - -![ArangoGraph Organization Overview](../../../images/arangograph-organization-overview.png) - -## ArangoGraph Packages - -With the ArangoGraph Insights Platform, your organization can choose one of the -following packages. - -### Free Trial - -ArangoGraph comes with a free-to-try tier that lets you test ArangoGraph for -free for 14 days. You can get started quickly, without needing to enter a -credit card. - -The free trial gives you access to: -- One small deployment (4GB) in a region of your choice for 14 days -- Local backups -- One ArangoGraph Notebook for learning and data science - -After the trial period, your deployment will be deleted automatically. - -### On-Demand - -Add a payment method to gain access to ArangoGraph's full feature set. -Pay monthly via a credit card for what you actually use. - -This package unlocks all ArangoGraph functionality, including: -- Multiple and larger deployments -- Backups to cloud storage, with multi-region support -- Enhanced security features such as Private Endpoints - -### Committed - -Commit up-front for a year and pay via the Sales team. This package provides -the same flexibility of On-Demand, but at a lower price. - -In addition, you gain access to: -- 24/7 Premium Support -- ArangoDB Professional Services Engagements -- Ability to transact via the AWS and GCP marketplaces - -To take advantage of this, you need to get in touch with the ArangoDB -team. [Contact us](https://www.arangodb.com/contact/) for more details. - -## How to unlock all features - -You can unlock all features in ArangoGraph at any time by adding your billing -details and a payment method. As soon as you have added a payment method, all -ArangoGraph functionalities are immediately unlocked. From that point on, your -deployments will no longer expire and you can create more and larger deployments. - -See [Billing: How to add billing details / payment methods](billing.md) - -![ArangoGraph Billing](../../../images/arangograph-billing.png) - -## How to create a new organization - -See [My Account: How to create a new organization](../my-account.md#how-to-create-a-new-organization) - -## How to restrict access to an organization - -If you want to restrict access to an organization, you can do it by specifying which authentication providers are accepted for users trying to access the organization. For more information, refer to the [Access Control](../security-and-access-control/_index.md#restricting-access-to-organizations) section. - -## How to delete the current organization - -{{< danger >}} -Removing an organization implies the deletion of projects and deployments. -This operation cannot be undone and **all deployment data will be lost**. -Please proceed with caution. -{{< /danger >}} - -1. Click **Overview** in the **Organization** section of the main navigation. -2. Open the **Danger zone** tab. -3. Click the **Delete organization** button. -4. Enter `Delete!` to confirm and click **Yes**. - -{{< info >}} -If you are no longer a member of any organization, then a new organization is -created for you when you log in again. -{{< /info >}} - -{{< tip >}} -If the organization has a locked resource (a project or a deployment), you need to [unlock](../security-and-access-control/_index.md#locked-resources) -that resource first to be able to delete the organization. -{{< /tip >}} diff --git a/site/content/3.11/arangograph/organizations/credits-and-usage.md b/site/content/3.11/arangograph/organizations/credits-and-usage.md deleted file mode 100644 index 34dafb8488..0000000000 --- a/site/content/3.11/arangograph/organizations/credits-and-usage.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Credits & Usage in ArangoGraph -menuTitle: Credits & Usage -weight: 15 -description: >- - Credits give you access to a flexible prepaid model, so you can allocate them - across multiple deployments as needed ---- -{{< info >}} -Credits are only available if your organization has signed up for -ArangoGraph's [Committed](../organizations/_index.md#committed) package. -{{< /info >}} - -The ArangoGraph credit model is a versatile prepaid model that allows you to -purchase credits and use them in a flexible way, based on what you have running -in ArangoGraph. - -Instead of purchasing a particular deployment for a year, you can purchase a -number of ArangoGraph credits that expire a year after purchase. These credits -are then consumed over that time period, based on the deployments you run -in ArangoGraph. - -For example, a OneShard (three nodes) A64 deployment consumes more credits per -hour than a smaller deployment such as A8. If you are running multiple deployments, -like pre-production environments or for different use-cases, these would each consume -from the same credit balance. However, if you are not running any deployments -and do not have any backup storage, then none of your credits will be consumed. - -{{< tip >}} -To purchase credits for your organization, you need to get in touch with the -ArangoDB team. [Contact us](https://www.arangodb.com/contact/) for more details. -{{< /tip >}} - -There are a number of benefits that ArangoGraph credits provide: -- **Adaptability**: The pre-paid credit model allows you to adapt your usage to - changing project requirements or fluctuating workloads. By enabling the use of - credits for various instance types and sizes, you can easily adjust your - resource allocation. -- **Efficient handling of resources**: With the ability to purchase credits in - advance, you can better align your needs in terms of resources and costs. - You can purchase credits in bulk and then allocate them as needed. -- **Workload Optimization**: By having a clear view of credit consumption and - remaining balance, you can identify inefficiencies to further optimize your - infrastructure, resulting in cost savings and better performance. - -## How to view the credit usage - -1. In the main navigation, click the **Organization** icon. -2. Click **Credits & Usage** in the **Organization** section. -3. In the **Credits & Usage** page, you can: - - See the remaining credit balance. - - Track your total credit balance. - - See a projection of when you will run out of credits, based on the last 30 days of usage. - - Get a detailed consumption report in PDF format that shows: - - The number of credits you had at the start of the month. - - The number of credits consumed in the month. - - The number of credits remaining. - - The number of credits consumed for each deployment. - -![ArangoGraph Credits and Usage](../../../images/arangograph-credits-and-usage.png) - -## FAQs - -### Are there any configuration constraints for using the credits? - -No. Credits are designed to be used completely flexibly. You can use all of your -credits for multiple small deployments (i.e. A8s) or you can use them for a single -large deployment (i.e. A256), or even multiple large deployments, as long as you -have enough credits remaining. - -### What is the flexibility of moving up or down in configuration size of the infrastructure? - -You can move up sizes in configuration at any point by editing your deployment -within ArangoGraph, once every 6 hours to allow for in-place disk expansion. - -### Is there a limit to how many deployments I can use my credits on? - -There is no specific limit to the number of deployments you can use your credits -on. The credit model is designed to provide you with the flexibility to allocate -credits across multiple deployments as needed. This enables you to effectively -manage and distribute your resources according to your specific requirements and -priorities. However, it is essential to monitor your credit consumption to ensure -that you have sufficient credits to cover your deployments. - -### Do the credits I purchase expire? - -Yes, credits expire 1 year after purchase. You should ensure that you consume -all of these credits within the year. - -### Can I make multiple purchases of credits within a year? - -As an organization’s usage of ArangoGraph grows, particularly in the initial -phases of application development and early production release, it is common -to purchase a smaller credit package that is later supplemented by a larger -credit package part-way through the initial credit expiry term. -In this case, all sets of credits will be available for ArangoGraph consumption -as a single credit balance. The credits with the earlier expiry date are consumed -first to avoid credit expiry where possible. - -### Can I purchase a specific number of credits (i.e. 3361, 4185)? - -ArangoGraph offers a variety of predefined credit packages designed to -accommodate different needs and stages of the application lifecycle. -For any credit purchasing needs, please [contact us](https://www.arangodb.com/contact/) -and we are happy to help find an appropriate package for you. - -### How quickly will the credits I purchase be consumed? - -The rate at which your purchased credits will be consumed depends on several -factors, including the type and size of instances you deploy, the amount of -resources used, and the duration of usage. Each machine size has an hourly credit -consumption rate, and the overall rate of credit consumption will increase for -larger sizes or for more machines/deployments. Credits will also be consumed for -any variable usage charges such as outbound network traffic and backup storage. - -### How can I see how many credits I have remaining? - -All details about credits, including how many credits have been purchased, -how many remain, and how they are being consumed are available in the -**Credits & Usage** page within the ArangoGraph web interface. - -### I have a large sharded deployment, how do I know how many credits it will consume? - -If you are using credits, then you will be able to see how many credits your -configured deployment will consume when [creating](../deployments/_index.md#how-to-create-a-new-deployment) -or [editing a deployment](../deployments/_index.md#how-to-edit-a-deployment). - -You can download a detailed consumption report in the -[**Credits & Usage** section](#how-to-view-the-credit-usage). It shows you the -number of credits consumed by any deployment you are creating or editing. - -All users can see the credit price of each node size in the **Pricing** section. - -### What happens if I run out of credits? - -If you run out of credits, your access to ArangoGraph's services and resources -will be temporarily suspended until you purchase additional credits. - -### Can I buy credits for a short time period (e.g. 2 months)? - -No, you cannot but credits with an expiry of less than 12 months. -If you require credits for a shorter time frame, such as 2 months, you can still -purchase one of the standard credit packages and consume the credits as needed -during that time. You may opt for a smaller credit package that aligns with your -expected usage during the desired period, rather than the full year’s expected usage. -Although the credits will have a longer expiration period, this allows you to have -the flexibility of utilizing the remaining credits for any future needs. \ No newline at end of file diff --git a/site/content/3.11/arangograph/organizations/users-and-groups.md b/site/content/3.11/arangograph/organizations/users-and-groups.md deleted file mode 100644 index abed36697b..0000000000 --- a/site/content/3.11/arangograph/organizations/users-and-groups.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Users and Groups in ArangoGraph -menuTitle: Users & Groups -weight: 5 -description: >- - How to manage individual members and user groups in ArangoGraph ---- -## Users, groups & members - -When you use ArangoGraph, you are logged in as a user. -A user has properties such as name & email address. -Most important of the user is that it serves as an identity of a person. - -A user is member of one or more organizations in ArangoGraph. -You can become a member of an organization in the following ways: - -- Create a new organization. You will become the first member and owner of that - organization. -- Be invited to join an organization. Once accepted (by the invited user), this - user becomes a member of the organization. - -If the number of members of an organization becomes large, it helps to group -users. In ArangoGraph a group is part of an organization and a group contains -a list of users. All users of the group must be member of the owning organization. - -In the **People** section of the dashboard you can manage users, groups and -invites for the organization. - -To edit permissions of members see [Access Control](../security-and-access-control/_index.md). - -## Members - -Members are a list of users that can access an organization. - -![ArangoGraph Member Access Control](../../../images/arangograph-access-control-members.png) - -### How to add a new member to the organization - -1. In the main navigation, click the __Organization__ icon. -2. Click __Members__ in the __People__ section. -3. Optionally, click the __Invites__ entry. -4. Click the __Invite new member__ button. -5. In the form that appears, enter the email address of the person you want to - invite. -6. Click the __Create__ button. -7. An email with an organization invite will now be sent to the specified - email address. -8. After accepting the invite the person will be added to the organization - [members](#members). - -![ArangoGraph Organization Invites](../../../images/arangograph-new-invite.png) - -### How to respond to an organization invite - -See [My Account: How to respond to my invites](../my-account.md#how-to-respond-to-my-invites) - -### How to remove a member from the organization - -1. Click __Members__ in the __People__ section of the main navigation. -2. Delete a member by pressing the __recycle bin__ icon in the __Actions__ column. -3. Confirm the deletion in the dialog that pops up. - -{{< info >}} -You cannot delete members who are organization owners. -{{< /info >}} - -### How to make a member an organization owner - -1. Click __Members__ in the __People__ section of the main navigation. -2. You can convert a member to an organization owner by pressing the __Key__ icon - in the __Actions__ column. -3. You can convert a member back to a normal user by pressing the __User__ icon - in the __Actions__ column. - -## Groups - -A group is a defined set of members. Groups can then be bound to roles. These -bindings contribute to the respective organization, project or deployment policy. - -![ArangoGraph Groups](../../../images/arangograph-groups.png) - -### How to create a new group - -1. Click __Groups__ in the __People__ section of the main navigation. -2. Press the __New group__ button. -3. Enter a name and optionally a description for your new group. -4. Select the members you want to be part of the group. -5. Press the __Create__ button. - -![ArangoGraph New Group](../../../images/arangograph-new-group.png) - -### How to view, edit or remove a group - -1. Click __Groups__ in the __People__ section of the main navigation. -2. Click an icon in the __Actions__ column: - - __Eye__: View group - - __Pencil__: Edit group - - __Recycle bin__: Delete group - -You can also click a group name to view it. There are buttons to __Edit__ and -__Delete__ the currently viewed group. - -![ArangoGraph Group](../../../images/arangograph-group.png) - -{{< info >}} -The groups __Organization members__ and __Organization owners__ are virtual groups -and cannot be changed. They always reflect the current set of organization -members and owners. -{{< /info >}} - -## Invites - -### How to create a new organization invite - -See [How to add a new member to the organization](#how-to-add-a-new-member-to-the-organization) - -### How to view the status of invitations - -1. Click __Invites__ in the __People__ section of the main navigation. -2. The created invites are displayed, grouped by status __Pending__, - __Accepted__ and __Rejected__. -3. You may delete pending invites by clicking the __recycle bin__ icon in the - __Actions__ column. - -![ArangoGraph Organization Invites](../../../images/arangograph-org-invites.png) diff --git a/site/content/3.11/arangograph/projects.md b/site/content/3.11/arangograph/projects.md deleted file mode 100644 index f4efd27833..0000000000 --- a/site/content/3.11/arangograph/projects.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Projects in ArangoGraph -menuTitle: Projects -weight: 15 -description: >- - How to manage projects and IP allowlists in ArangoGraph ---- -ArangoGraph projects can represent organizational units such as teams, -product groups, environments (e.g. staging vs. production). You can have any -number of projects under one organization. - -**Organizations → <u>Projects</u> → Deployments** - -Projects are a container for related deployments, certificates & IP allowlists. -Projects also come with their own policy for access control. You can have any -number of deployment under one project. - -![ArangoGraph Projects Overview](../../images/arangograph-projects-overview.png) - -## How to create a new project - -1. In the main navigation, click the __Dashboard__ icon. -2. Click __Projects__ in the __Dashboard__ section. -3. Click the __New project__ button. -4. Enter a name and optionally a description for your new project. -5. Click the __Create__ button. -6. You will be taken to the project page. -7. To change the name or description, click either at the top of the page. - -![ArangoGraph New Project](../../images/arangograph-new-project.png) - -![ArangoGraph Project Summary](../../images/arangograph-project.png) - -{{< info >}} -Projects contain exactly **one policy**. Within that policy, you can define -role bindings to regulate access control on a project level. -{{< /info >}} - -## How to create a new deployment - -See [Deployments: How to create a new deployment](deployments/_index.md#how-to-create-a-new-deployment) - -## How to delete a project - -{{< danger >}} -Deleting a project will delete contained deployments, certificates & IP allowlists. -This operation is **irreversible**. -{{< /danger >}} - -1. Click __Projects__ in the __Dashboard__ section of the main navigation. -2. Click the __recycle bin__ icon in the __Actions__ column of the project to be deleted. -3. Enter `Delete!` to confirm and click __Yes__. - -{{< tip >}} -If the project has a locked deployment, you need to [unlock](security-and-access-control/_index.md#locked-resources) -it first to be able to delete the project. -{{< /tip >}} - -## How to manage IP allowlists - -IP allowlists let you limit access to your deployment to certain IP ranges. -It is optional, but strongly recommended to do so. - -You can create an allowlist as part of a project. - -1. Click a project name in the __Projects__ section of the main navigation. -2. Click the __Security__ entry. -3. In the __IP allowlists__ section, click: - - The __New IP allowlist__ button to create a new allowlist. - When creating or editing a list, you can add comments - in the __Allowed CIDR ranges (1 per line)__ section. - Everything after `//` or `#` is considered a comment until the end of the line. - - A name or the __eye__ icon in the __Actions__ column to view the allowlist. - - The __pencil__ icon to edit the allowlist. - You can also view the allowlist and click the __Edit__ button. - - The __recycle bin__ icon to delete the allowlist. - -## How to manage role bindings - -See: -- [Access Control: How to view, edit or remove role bindings of a policy](security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy) -- [Access Control: How to add a role binding to a policy](security-and-access-control/_index.md#how-to-add-a-role-binding-to-a-policy) diff --git a/site/content/3.11/arangograph/security-and-access-control/_index.md b/site/content/3.11/arangograph/security-and-access-control/_index.md deleted file mode 100644 index fa37f9af13..0000000000 --- a/site/content/3.11/arangograph/security-and-access-control/_index.md +++ /dev/null @@ -1,699 +0,0 @@ ---- -title: Security and access control in ArangoGraph -menuTitle: Security and Access Control -weight: 45 -description: >- - This guide explains which access control concepts are available in - ArangoGraph and how to use them ---- -The ArangoGraph Insights Platform has a structured set of resources that are subject to security and -access control: - -- Organizations -- Projects -- Deployments - -For each of these resources, you can perform various operations. -For example, you can create a project in an organization and create a deployment -inside a project. - -## Locked resources - -In ArangoGraph, you can lock the resources to prevent accidental deletion. When -a resource is locked, it cannot be deleted and must be unlocked first. - -The hierarchical structure of the resources (organization-project-deployment) -is used in the locking functionality: if a child resource is locked -(for example, a deployment), you cannot delete the parent project without -unlocking that deployment first. - -{{< info >}} -If you lock a backup policy of a deployment or an IP allowlist, CA certificate, -and IAM provider of a project, it is still possible to delete -the corresponding parent resource without unlocking those properties first. -{{< /info >}} - -## Policy - -Various actions in ArangoGraph require different permissions, which can be -granted to users via **roles**. - -The association of a member with a role is called a **role binding**. -All role bindings of a resource comprise a **policy**. - -Roles can be bound on an organization, project, and deployment level (listed in -the high to low level order, with lower levels inheriting permissions from their -parents). This means that there is a unique policy per resource (an organization, -a project, or a deployment). - -For example, an organization has exactly one policy, -which binds roles to members of the organization. These bindings are used to -give the users permissions to perform operations in this organization. -This is useful when, as an organization owner, you need to extend the permissions -for an organization member. - -{{< info >}} -Permissions linked to predefined roles vary between organization owners and -organization members. If you need to extend permissions for an organization -member, you can create a new role binding. The complete list of roles and -their respective permissions for both organization owners and members can be -viewed on the **Policy** page of an organization within the ArangoGraph dashboard. -{{< /info >}} - -### How to view, edit, or remove role bindings of a policy - -Decide whether you want to edit the policy for an organization, a project, -or a deployment: - -- **Organization**: In the main navigation, click the __Organization__ icon and - then click __Policy__. -- **Project**: In the main navigation, click the __Dashboard__ icon, then click - __Projects__, click the name of the desired project, and finally click __Policy__. -- **Deployment**: In the main navigation, click the __Dashboard__ icon, then - click __Deployments__, click the name of the desired deployment, and finally - click __Policy__. - -To delete a role binding, click the **Recycle Bin** icon in the **Actions** column. - -{{< info >}} -Currently, you cannot edit a role binding, you can only delete it. -{{< /info >}} - -![ArangoGraph Project Policy](../../../images/arangograph-policy-page.png) - -### How to add a role binding to a policy - -1. Navigate to the **Policy** tab of an organization, a project or a deployment. -2. Click the **New role binding** button. -3. Select one or more users and/or groups. -4. Select one or more roles you want to assign to the specified members. -5. Click **Create**. - -![ArangoGraph New Role Binding](../../../images/arangograph-new-policy-role-binding.png) - -## Roles - -Operations on resources in ArangoGraph require zero (just an authentication) or -more permissions. Since the -number of permissions is large and very detailed, it is not practical to assign -permissions directly to users. Instead, ArangoGraph uses **roles**. - -A role is a set of permissions. Roles can be bound to groups (preferably) -or individual users. You can create such bindings for the respective organization, -project, or deployment policy. - -There are predefined roles, but you can also create custom ones. - -![ArangoGraph Roles](../../../images/arangograph-access-control-roles.png) - -### Predefined roles - -Predefined roles are created by ArangoGraph and group related permissions together. -An example of a predefined role is `deployment-viewer`. This role -contains all permissions needed to view deployments in a project. - -Predefined roles cannot be deleted. Note that permissions linked to predefined -roles vary between organization owners and organization members. - -{{% comment %}} -Command to generate below list with (Git)Bash: - -export OASIS_TOKEN='<TOKEN>' -./oasisctl list roles --organization-id <ID> --format json | jq -r '.[] | select(.predefined == true) | "**\(.description)** (`\(.id)`):\n\(.permissions | split(", ") | map("- `\(.)`\n") | join(""))"' -{{% /comment %}} - -{{< details summary="List of predefined roles and their permissions" >}} - -{{</* tip */>}} -The roles below are described following this pattern: - -**Role description** (`role ID`): -- `Permission` -{{</* /tip */>}} - -**Audit Log Admin** (`auditlog-admin`): -- `audit.auditlog.create` -- `audit.auditlog.delete` -- `audit.auditlog.get` -- `audit.auditlog.list` -- `audit.auditlog.set-default` -- `audit.auditlog.test-https-post-destination` -- `audit.auditlog.update` - -**Audit Log Archive Admin** (`auditlog-archive-admin`): -- `audit.auditlogarchive.delete` -- `audit.auditlogarchive.get` -- `audit.auditlogarchive.list` - -**Audit Log Archive Viewer** (`auditlog-archive-viewer`): -- `audit.auditlogarchive.get` -- `audit.auditlogarchive.list` - -**Audit Log Attachment Admin** (`auditlog-attachment-admin`): -- `audit.auditlogattachment.create` -- `audit.auditlogattachment.delete` -- `audit.auditlogattachment.get` - -**Audit Log Attachment Viewer** (`auditlog-attachment-viewer`): -- `audit.auditlogattachment.get` - -**Audit Log Event Admin** (`auditlog-event-admin`): -- `audit.auditlogevent.delete` -- `audit.auditlogevents.get` - -**Audit Log Event Viewer** (`auditlog-event-viewer`): -- `audit.auditlogevents.get` - -**Audit Log Viewer** (`auditlog-viewer`): -- `audit.auditlog.get` -- `audit.auditlog.list` - -**Backup Administrator** (`backup-admin`): -- `backup.backup.copy` -- `backup.backup.create` -- `backup.backup.delete` -- `backup.backup.download` -- `backup.backup.get` -- `backup.backup.list` -- `backup.backup.restore` -- `backup.backup.update` -- `backup.feature.get` -- `data.deployment.restore-backup` - -**Backup Viewer** (`backup-viewer`): -- `backup.backup.get` -- `backup.backup.list` -- `backup.feature.get` - -**Backup Policy Administrator** (`backuppolicy-admin`): -- `backup.backuppolicy.create` -- `backup.backuppolicy.delete` -- `backup.backuppolicy.get` -- `backup.backuppolicy.list` -- `backup.backuppolicy.update` -- `backup.feature.get` - -**Backup Policy Viewer** (`backuppolicy-viewer`): -- `backup.backuppolicy.get` -- `backup.backuppolicy.list` -- `backup.feature.get` - -**Billing Administrator** (`billing-admin`): -- `billing.config.get` -- `billing.config.set` -- `billing.invoice.get` -- `billing.invoice.get-preliminary` -- `billing.invoice.get-statistics` -- `billing.invoice.list` -- `billing.organization.get` -- `billing.paymentmethod.create` -- `billing.paymentmethod.delete` -- `billing.paymentmethod.get` -- `billing.paymentmethod.get-default` -- `billing.paymentmethod.list` -- `billing.paymentmethod.set-default` -- `billing.paymentmethod.update` -- `billing.paymentprovider.list` - -**Billing Viewer** (`billing-viewer`): -- `billing.config.get` -- `billing.invoice.get` -- `billing.invoice.get-preliminary` -- `billing.invoice.get-statistics` -- `billing.invoice.list` -- `billing.organization.get` -- `billing.paymentmethod.get` -- `billing.paymentmethod.get-default` -- `billing.paymentmethod.list` -- `billing.paymentprovider.list` - -**CA Certificate Administrator** (`cacertificate-admin`): -- `crypto.cacertificate.create` -- `crypto.cacertificate.delete` -- `crypto.cacertificate.get` -- `crypto.cacertificate.list` -- `crypto.cacertificate.set-default` -- `crypto.cacertificate.update` - -**CA Certificate Viewer** (`cacertificate-viewer`): -- `crypto.cacertificate.get` -- `crypto.cacertificate.list` - -**Dataloader Administrator** (`dataloader-admin`): -- `dataloader.deployment.import` - -**Deployment Administrator** (`deployment-admin`): -- `data.cpusize.list` -- `data.deployment.create` -- `data.deployment.create-test-database` -- `data.deployment.delete` -- `data.deployment.get` -- `data.deployment.list` -- `data.deployment.pause` -- `data.deployment.rebalance-shards` -- `data.deployment.resume` -- `data.deployment.rotate-server` -- `data.deployment.update` -- `data.deployment.update-scheduled-root-password-rotation` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.logs.get` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Content Administrator** (`deployment-content-admin`): -- `data.cpusize.list` -- `data.deployment.create-test-database` -- `data.deployment.get` -- `data.deployment.list` -- `data.deploymentcredentials.get` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.logs.get` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Full Access User** (`deployment-full-access-user`): -- `data.deployment.full-access` - -**Deployment Read Only User** (`deployment-read-only-user`): -- `data.deployment.read-only-access` - -**Deployment Viewer** (`deployment-viewer`): -- `data.cpusize.list` -- `data.deployment.get` -- `data.deployment.list` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Profile Viewer** (`deploymentprofile-viewer`): -- `deploymentprofile.deploymentprofile.list` - -**Example Datasets Viewer** (`exampledataset-viewer`): -- `example.exampledataset.get` -- `example.exampledataset.list` - -**Example Dataset Installation Administrator** (`exampledatasetinstallation-admin`): -- `example.exampledatasetinstallation.create` -- `example.exampledatasetinstallation.delete` -- `example.exampledatasetinstallation.get` -- `example.exampledatasetinstallation.list` -- `example.exampledatasetinstallation.update` - -**Example Dataset Installation Viewer** (`exampledatasetinstallation-viewer`): -- `example.exampledatasetinstallation.get` -- `example.exampledatasetinstallation.list` - -**Group Administrator** (`group-admin`): -- `iam.group.create` -- `iam.group.delete` -- `iam.group.get` -- `iam.group.list` -- `iam.group.update` - -**Group Viewer** (`group-viewer`): -- `iam.group.get` -- `iam.group.list` - -**IAM provider Administrator** (`iamprovider-admin`): -- `security.iamprovider.create` -- `security.iamprovider.delete` -- `security.iamprovider.get` -- `security.iamprovider.list` -- `security.iamprovider.set-default` -- `security.iamprovider.update` - -**IAM provider Viewer** (`iamprovider-viewer`): -- `security.iamprovider.get` -- `security.iamprovider.list` - -**IP allowlist Administrator** (`ipwhitelist-admin`): -- `security.ipallowlist.create` -- `security.ipallowlist.delete` -- `security.ipallowlist.get` -- `security.ipallowlist.list` -- `security.ipallowlist.update` - -**IP allowlist Viewer** (`ipwhitelist-viewer`): -- `security.ipallowlist.get` -- `security.ipallowlist.list` - -**Metrics Administrator** (`metrics-admin`): -- `metrics.endpoint.get` -- `metrics.token.create` -- `metrics.token.delete` -- `metrics.token.get` -- `metrics.token.list` -- `metrics.token.revoke` -- `metrics.token.update` - -**Migration Administrator** (`migration-admin`): -- `replication.deploymentmigration.create` -- `replication.deploymentmigration.delete` -- `replication.deploymentmigration.get` - -**MLServices Admin** (`mlservices-admin`): -- `ml.mlservices.get` - -**Notebook Administrator** (`notebook-admin`): -- `notebook.model.list` -- `notebook.notebook.create` -- `notebook.notebook.delete` -- `notebook.notebook.get` -- `notebook.notebook.list` -- `notebook.notebook.pause` -- `notebook.notebook.resume` -- `notebook.notebook.update` - -**Notebook Executor** (`notebook-executor`): -- `notebook.notebook.execute` - -**Notebook Viewer** (`notebook-viewer`): -- `notebook.model.list` -- `notebook.notebook.get` -- `notebook.notebook.list` - -**Organization Administrator** (`organization-admin`): -- `billing.organization.get` -- `resourcemanager.organization-invite.create` -- `resourcemanager.organization-invite.delete` -- `resourcemanager.organization-invite.get` -- `resourcemanager.organization-invite.list` -- `resourcemanager.organization-invite.update` -- `resourcemanager.organization.delete` -- `resourcemanager.organization.get` -- `resourcemanager.organization.update` - -**Organization Viewer** (`organization-viewer`): -- `billing.organization.get` -- `resourcemanager.organization-invite.get` -- `resourcemanager.organization-invite.list` -- `resourcemanager.organization.get` - -**Policy Administrator** (`policy-admin`): -- `iam.policy.get` -- `iam.policy.update` - -**Policy Viewer** (`policy-viewer`): -- `iam.policy.get` - -**Prepaid Deployment Viewer** (`prepaid-deployment-viewer`): -- `prepaid.prepaiddeployment.get` -- `prepaid.prepaiddeployment.list` - -**Private Endpoint Service Administrator** (`privateendpointservice-admin`): -- `network.privateendpointservice.create` -- `network.privateendpointservice.get` -- `network.privateendpointservice.get-by-deployment-id` -- `network.privateendpointservice.get-feature` -- `network.privateendpointservice.update` - -**Private Endpoint Service Viewer** (`privateendpointservice-viewer`): -- `network.privateendpointservice.get` -- `network.privateendpointservice.get-by-deployment-id` -- `network.privateendpointservice.get-feature` - -**Project Administrator** (`project-admin`): -- `resourcemanager.project.create` -- `resourcemanager.project.delete` -- `resourcemanager.project.get` -- `resourcemanager.project.list` -- `resourcemanager.project.update` - -**Project Viewer** (`project-viewer`): -- `resourcemanager.project.get` -- `resourcemanager.project.list` - -**Replication Administrator** (`replication-admin`): -- `replication.deployment.clone-from-backup` -- `replication.deploymentreplication.get` -- `replication.deploymentreplication.update` -- `replication.migration-forwarder.upgrade-connection` - -**Role Administrator** (`role-admin`): -- `iam.role.create` -- `iam.role.delete` -- `iam.role.get` -- `iam.role.list` -- `iam.role.update` - -**Role Viewer** (`role-viewer`): -- `iam.role.get` -- `iam.role.list` - -**SCIM Administrator** (`scim-admin`): -- `scim.user.add` -- `scim.user.delete` -- `scim.user.get` -- `scim.user.list` -- `scim.user.update` - -**User Administrator** (`user-admin`): -- `iam.user.get-personal-data` -- `iam.user.update` - -{{< /details >}} - -### How to create a custom role - -1. In the main navigation menu, click **Access Control**. -2. On the **Roles** tab, click **New role**. -3. Enter a name and optionally a description for the new role. -4. Select the required permissions. -5. Click **Create**. - -![ArangoGraph New Role](../../../images/arangograph-create-role.png) - -### How to view, edit or remove a custom role - -1. In the main navigation menu, click **Access Control**. -2. On the **Roles** tab, click: - - A role name or the **eye** icon in the **Actions** column to view the role. - - The **pencil** icon in the **Actions** column to edit the role. - You can also view a role and click the **Edit** button in the detail view. - - The **recycle bin** icon to delete the role. - You can also view a role and click the **Delete** button in the detail view. - -## Permissions - -Each operation done on a resource requires zero (just authentication) or more **permissions**. -A permission is a constant string such as `resourcemanager.project.create`, -following this schema: `<api>.<kind>.<verb>`. - -Permissions are solely defined by the ArangoGraph API. - -{{% comment %}} -Retrieved with the below command, with manual adjustments: -oasisctl list permissions - -Note that if the tier is "internal", there is an `internal-dashboard` API that should be excluded in below list! -{{% /comment %}} - -| API | Kind | Verbs -|:--------------------|:-----------------------------|:------------------------------------------- -| `audit` | `auditlogarchive` | `delete`, `get`, `list` -| `audit` | `auditlogattachment` | `create`, `delete`, `get` -| `audit` | `auditlogevents` | `get` -| `audit` | `auditlogevent` | `delete` -| `audit` | `auditlog` | `create`, `delete`, `get`, `list`, `set-default`, `test-https-post-destination`, `update` -| `backup` | `backuppolicy` | `create`, `delete`, `get`, `list`, `update` -| `backup` | `backup` | `copy`, `create`, `delete`, `download`, `get`, `list`, `restore`, `update` -| `backup` | `feature` | `get` -| `billing` | `config` | `get`, `set` -| `billing` | `invoice` | `get`, `get-preliminary`, `get-statistics`, `list` -| `billing` | `organization` | `get` -| `billing` | `paymentmethod` | `create`, `delete`, `get`, `get-default`, `list`, `set-default`, `update` -| `billing` | `paymentprovider` | `list` -| `crypto` | `cacertificate` | `create`, `delete`, `get`, `list`, `set-default`, `update` -| `dataloader` | `deployment` | `import` -| `data` | `cpusize` | `list` -| `data` | `deploymentcredentials` | `get` -| `data` | `deploymentfeatures` | `get` -| `data` | `deploymentmodel` | `list` -| `data` | `deploymentprice` | `calculate` -| `data` | `deployment` | `create`, `create-test-database`, `delete`, `full-access`, `get`, `list`, `pause`, `read-only-access`, `rebalance-shards`, `restore-backup`, `resume`, `rotate-server`, `update`, `update-scheduled-root-password-rotation` -| `data` | `diskperformance` | `list` -| `data` | `limits` | `get` -| `data` | `nodesize` | `list` -| `data` | `presets` | `list` -| `deploymentprofile` | `deploymentprofile` | `list` -| `example` | `exampledatasetinstallation` | `create`, `delete`, `get`, `list`, `update` -| `example` | `exampledataset` | `get`, `list` -| `iam` | `group` | `create`, `delete`, `get`, `list`, `update` -| `iam` | `policy` | `get`, `update` -| `iam` | `role` | `create`, `delete`, `get`, `list`, `update` -| `iam` | `user` | `get-personal-data`, `update` -| `metrics` | `endpoint` | `get` -| `metrics` | `token` | `create`, `delete`, `get`, `list`, `revoke`, `update` -| `ml` | `mlservices` | `get` -| `monitoring` | `logs` | `get` -| `monitoring` | `metrics` | `get` -| `network` | `privateendpointservice` | `create`, `get`, `get-by-deployment-id`, `get-feature`, `update` -| `notebook` | `model` | `list` -| `notebook` | `notebook` | `create`, `delete`, `execute`, `get`, `list`, `pause`, `resume`, `update` -| `notification` | `deployment-notification` | `list`, `mark-as-read`, `mark-as-unread` -| `prepaid` | `prepaiddeployment` | `get`, `list` -| `replication` | `deploymentmigration` | `create`, `delete`, `get` -| `replication` | `deploymentreplication` | `get`, `update` -| `replication` | `deployment` | `clone-from-backup` -| `replication` | `migration-forwarder` | `upgrade-connection` -| `resourcemanager` | `organization-invite` | `create`, `delete`, `get`, `list`, `update` -| `resourcemanager` | `organization` | `delete`, `get`, `update` -| `resourcemanager` | `project` | `create`, `delete`, `get`, `list`, `update` -| `scim` | `user` | `add`, `delete`, `get`, `list`, `update` -| `security` | `iamprovider` | `create`, `delete`, `get`, `list`, `set-default`, `update` -| `security` | `ipallowlist` | `create`, `delete`, `get`, `list`, `update` - -### Permission inheritance - -Each resource (organization, project, deployment) has its own policy, but this does not mean that you have to -repeat role bindings in all these policies. - -Once you assign a role to a user (or group of users) in a policy at one level, -all the permissions of this role are inherited in lower levels - -permissions are inherited downwards from an organization to its projects and -from a project to its deployments. - -For more general permissions, which you want to be propagated to other levels, -add a role for a user/group at the organization level. -For example, if you bind the `deployment-viewer` role to user `John` in the -organization policy, `John` will have the role permissions in all projects of -that organization and all deployments of the projects. - -For more restrictive permissions, which you don't necessarily want to be -propagated to other levels, add a role at the project or even deployment level. -For example, if you bind the `deployment-viewer` role to user `John` -in a project, `John` will have the role permissions in -this project as well as in all the deployments of it, but not -in other projects of the parent organization. - -**Inheritance example** - -- Let's assume you have a group called "Deployers" which includes users who deal with deployments. -- Then you create a role "Deployment Viewer", containing - `data.deployment.get` and `data.deployment.list` permissions. -- You can now add a role binding of the "Deployers" group to the "Deployment Viewer" role. -- If you add the binding to an organization policy, members of this group - will be granted the defined permissions for the organization, all its projects and all its deployments. -- If you add the role binding to a policy of project ABC, members of this group will be granted - the defined permissions for project ABC only and its deployments, but not for - other projects and their deployments. -- If you add the role binding to a policy of deployment X, members of this - group will be granted the defined permissions for deployment X only, and not - any other deployment of the parent project or any other project of the organization. - -The "Deployment Viewer" role is effective for the following entities depending -on which policy the binding is added to: - -Role binding added to →<br>Role effective on ↓ | Organization policy | Project ABC's policy | Deployment X's policy of project ABC | -|:---:|:---:|:---:|:---:| -Organization, its projects and deployments | ✓ | — | — -Project ABC and its deployments | ✓ | ✓ | — -Project DEF and its deployments | ✓ | — | — -Deployment X of project ABC | ✓ | ✓ | ✓ -Deployment Y of project ABC | ✓ | ✓ | — -Deployment Z of project DEF | ✓ | — | — - -## Restricting access to organizations - -To enhance security, you can implement the following restrictions via [Oasisctl](../oasisctl/_index.md): - -1. Limit allowed authentication providers. -2. Specify an allowed domain list. - -{{< info >}} -Note that users who do not meet the restrictions will not be granted permissions for any resource in -the organization. These users can still be members of the organization. -{{< /info >}} - -Using the first option, you can limit which **authentication providers** are -accepted for users trying to access an organization in ArangoGraph. -The following commands are available to configure this option: - -- `oasisctl get organization authentication providers` - allows you to see which - authentication providers are enabled for accessing a specific organization -- `oasisctl update organization authentication providers` - allows you to update - a list of authentication providers for an organization to which the - authenticated user has access - - `--enable-github` - if set, allow access from user accounts authenticated via Github - - `--enable-google` - if set, allow access from user accounts authenticated via Google - - `--enable-microsoft` - if set, allow access from user accounts authenticated via Microsoft - - `--enable-username-password` - if set, allow access from user accounts - authenticated via a username/password - -Using the second option, you can configure a **list of domains**, and only users -with email addresses from the specified domains will be able to access an -organization. The following commands are available to configure this option: - -- `oasisctl get organization email domain restrictions -o <your_organization_id>` - - allows you to see which domains are in the allowed list for a specific organization -- `oasisctl update organization email domain restrictions -o <your_organization_id> --allowed-domain=<domain_name1> --allowed-domain=<domain_name2>` - - allows you to update a list of the allowed domains for a specific organization -- `oasisctl update organization email domain restrictions -o <your_organization_id> --allowed-domain=` - - allows you to reset a list and accept any domains for accessing a specific organization - -## Using an audit log - -{{< info >}} -To enable the audit log feature, get in touch with the ArangoGraph team via **Request Help**, available in the left sidebar menu of the ArangoGraph Dashboard. -{{< /info >}} - -To have a better overview of the events happening in your ArangoGraph organization, -you can set up an audit log, which will track and log auditing information for you. -The audit log is created on the organization level, then you can use the log for -projects belonging to that organization. - -***To create an audit log*** - -1. In the main navigation menu, click **Access Control** in the **Organization** section. -2. Open the **Audit logs** tab and click the **New audit log** button. -3. In the dialog, fill out the following settings: - - - **Name** - enter a name for your audit log. - - **Description** - enter an optional description for your audit log. - - **Destinations** - specify one or several destinations to which you want to - upload the audit log. If you choose **Upload to cloud**, the log will be - available on the **Audit logs** tab of your organization. To send the log - entries to your custom destination, specify a destination URL with - authentication parameters (the **HTTP destination** option). - - {{< info >}} - The **Upload to cloud** option is not available for the free-to-try tier. - {{< /info >}} - - - **Excluded topics** - select topics that will not be included in the log. - Please note, that some are excluded by default (for example, `audit-document`). - - {{< warning >}} - Enabling the audit log for all events will have a negative impact on performance. - {{< /warning >}} - - - **Confirmation** - confirm that logging auditing events increases the price of your deployments. - - ![ArangoGraph audit log](../../../images/arangograph-audit-log.png) - -4. Click **Create** to add the audit log. You can now use it in the projects - belonging to your organization. diff --git a/site/content/3.11/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md b/site/content/3.11/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md deleted file mode 100644 index 8cf40b8009..0000000000 --- a/site/content/3.11/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: SCIM Provisioning -menuTitle: SCIM Provisioning -weight: 5 -description: >- - How to enable SCIM provisioning with Okta for your ArangoGraph project ---- -ArangoGraph provides support to control and manage members access in -ArangoGraph organizations with the -**System for Cross-domain Identity Management** (SCIM) provisioning. -This enables you to propagate to ArangoGraph any user access changes by using -the dedicated API. - -{{< info >}} -To enable the SCIM feature, get in touch with the ArangoGraph team via -**Request Help**, available in the left sidebar menu of the ArangoGraph Dashboard. -{{< /info >}} - -## About SCIM - -[SCIM](https://www.rfc-editor.org/rfc/rfc7644), or the System -for Cross-domain Identity Management [specification](http://www.simplecloud.info/), -is an open standard designed to manage user identity information. -SCIM provides a defined schema for representing users, and a RESTful -API to run CRUD operations on these user resources. - -The SCIM specification expects the following operations so that the SSO system -can sync the information about user resources in real time: - -- `GET /Users` - List all users. -- `GET /Users/:user_id` - Get details for a given user ID. -- `POST /Users` - Invite a new user to ArangoGraph. -- `PUT /Users/:user_id` - Update a given user ID. -- `DELETE /Users/:user_id` - Delete a specified user ID. - -ArangoGraph organization administrators can generate an API key for a specific organization. -The API token consists of a key and a secret. Using this key and secret as the -Basic Authentication Header (Basic Auth) in SCIM provisioning, you can access the APIs and -manage the user resources. - -To learn how to generate a new API key in the ArangoGraph Dashboard, see the -[API Keys](../../my-account.md#api-keys) section. - -{{< info >}} -When creating an API key, it is required to select an organization from the -list. -{{< /info >}} - -## Enable SCIM provisioning in Okta - -To enable SCIM provisioning, you first need to create an SSO integration that -supports the SCIM provisioning feature. - -1. To enable SCIM provisioning for your integration, go to the **General** tab. -2. In the **App Settings** section, select **Enable SCIM provisioning**. -3. Navigate to the **Provisioning** tab. The SCIM connection settings are - displayed under **Settings > Integration**. -4. Fill in the following fields: - - For **SCIM connector base URL**, use `https://dashboard.arangodb.cloud/api/scim/v1` - - For **Unique identifier field for users**, use `userName` -5. For **Supported provisioning actions**, enable the following: - - **Import New Users and Profile Updates** - - **Push New Users** - - **Push Profile Updates** -6. From the **Authentication Mode** menu, select the **Basic Auth** option. - To authenticate using this mode, you need to provide the username and password - for the account that handles the SCIM actions - in this case ArangoGraph. -7. Go to the ArangoGraph Dashboard and create a new API key ID and Secret. - - ![ArangoGraph Create new API key](../../../../images/arangograph-okta-api-key.png) - - Make sure to select one organization from the list and do not set any - value in the **Time to live** field. For more information, - see [How to create a new API key](../../my-account.md#how-to-create-a-new-api-key). -8. Use these authentication tokens as username and password when using the - **Basic Auth** mode and click **Save**. diff --git a/site/content/3.11/arangograph/security-and-access-control/x-509-certificates.md b/site/content/3.11/arangograph/security-and-access-control/x-509-certificates.md deleted file mode 100644 index d8d694a139..0000000000 --- a/site/content/3.11/arangograph/security-and-access-control/x-509-certificates.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: X.509 Certificates in ArangoGraph -menuTitle: X.509 Certificates -weight: 5 -description: >- - X.509 certificates in ArangoGraph are utilized for encrypted remote administration. - The communication with and between the servers of an ArangoGraph deployment is - encrypted using the TLS protocol ---- -X.509 certificates are digital certificates that are used to verify the -authenticity of a website, user, or organization using a public key infrastructure -(PKI). They are used in various applications, including SSL/TLS encryption, -which is the basis for HTTPS - the primary protocol for securing communication -and data transfer over a network. - -The X.509 certificate format is a standard defined by the -[International Telecommunication Union (ITU)](https://www.itu.int/en/Pages/default.aspx) -and contains information such as the name of the certificate holder, the public -key associated with the certificate, the certificate's issuer, and the -certificate's expiration date. An X.509 certificate can be signed by a -certificate authority (CA) or self-signed. - -ArangoGraph is using: -- **well-known X.509 certificates** created by -[Let's Encrypt](https://letsencrypt.org/) -- **self-signed X.509 certificates** created by ArangoGraph platform - -## Certificate chains - -A certificate chain, also called the chain of trust, is a hierarchical structure -that links together a series of digital certificates. The trust in the chain is -established by verifying the identity of the issuer of each certificate in the -chain. The root of the chain is a trusted third-party, such as a certificate -authority (CA). The CA issues a certificate to an organization, which in turn -can issue certificates to servers and other entities. - -For example, when you visit a website with an SSL/TLS certificate, the browser -checks the chain of trust to verify the authenticity of the digital certificate. -The browser checks to see if the root certificate is trusted, and if it is, it -trusts the chain of certificates that lead to the end-entity certificate. -If any of the certificates in the chain are invalid, expired, or revoked, the -browser does not trust the digital certificate. - -## X.509 certificates in ArangoGraph - -Each ArangoGraph deployment is accessible on different port numbers: -- default port `8529`, `443` -- high port `18529` - -Each ArangoGraph Notebook is accessible on different port numbers: -- default port `8840`, `443` -- high port `18840` - -Metrics are accessible on different port numbers: -- default port `8829`, `443` -- high port `18829` - -The distinction between these port numbers is in the certificate used for the -TLS connection. - -{{< info >}} -The default ports (`8529` and `443`) always serve the well-known certificate. -The [auto login to database UI](../deployments/_index.md#auto-login-to-database-ui) -feature is only available on the `443` port and is enabled by default. -{{< /info >}} - -### Well-known X.509 certificates - -**Well-known X.509 certificates** created by -[Let's Encrypt](https://letsencrypt.org/) are used on the -default ports, `8529` and `443`. - -This type of certificate has a lifetime of 5 years and is rotated automatically. -It is recommended to use well-known certificates, as this eases access of a -deployment in your browser. - -{{< info >}} -The well-known certificate is a wildcard certificate and cannot contain -Subject Alternative Names (SANs). To include a SAN field, please use the -self-signed certificate option. -{{< /info >}} - -### Self-signed X.509 certificates - -**Self-signed X.509 certificates** are used on the high ports, i.e. `18529`. -This type of certificate has a lifetime of 1 year, and it is created by the -ArangoGraph platform. It is also rotated automatically before the expiration -date. - -{{< info >}} -Unless you switch off the **Use well-known certificate** option in the -certificate generation, both the default and high port serve the same -self-signed certificate. -{{< /info >}} - -### Subject Alternative Name (SAN) - -The Subject Alternative Name (SAN) is an extension to the X.509 specification -that allows you to specify additional host names for a single SSL certificate. - -When using [private endpoints](../deployments/private-endpoints.md), -you can specify custom domain names. Note that these are added **only** to -the self-signed certificate as Subject Alternative Name (SAN). - -## How to create a new certificate - -1. Click a project name in the **Projects** section of the main navigation. -2. Click **Security**. -3. In the **Certificates** section, click: - - The **New certificate** button to create a new certificate. - - A name or the **eye** icon in the **Actions** column to view a certificate. - The dialog that opens provides commands for installing and uninstalling - the certificate through a console. - - The **pencil** icon to edit a certificate. - You can also view a certificate and click the **Edit** button. - - The **tag** icon to make the certificate the new default. - - The **recycle bin** icon to delete a certificate. - -![ArangoGraph Create New Certificate](../../../images/arangograph-new-certificate.png) - -## How to install a certificate - -Certificates that have the **Use well-known certificate** option enabled do -not need any installation and are supported by almost all web browsers -automatically. - -When creating a self-signed certificate that has the **Use well-known certificate** -option disabled, the certificate needs to be installed on your local machine as -well. This operation varies between operating systems. To install a self-signed -certificate on your local machine, open the certificate and follow the -installation instructions. - -![ArangoGraph Certificates](../../../images/arangograph-cert-page-with-cert-present.png) - -![ArangoGraph Certificate Install Instructions](../../../images/arangograph-cert-install-instructions.png) - -You can also extract the information from all certificates in the chain using the -`openssl` tool. - -- For **well-known certificates**, run the following command: - ``` - openssl s_client -showcerts -servername <123456abcdef>.arangodb.cloud -connect <123456abcdef>.arangodb.cloud:8529 </dev/null - ``` - -- For **self-signed certificates**, run the following command: - ``` - openssl s_client -showcerts -servername <123456abcdef>.arangodb.cloud -connect <123456abcdef>.arangodb.cloud:18529 </dev/null - ``` - -Note that `<123456abcdef>` is a placeholder that needs to be replaced with the -unique ID that is part of your ArangoGraph deployment endpoint URL. - -## How to connect to your application - -[ArangoDB drivers](../../develop/drivers/_index.md), also called connectors, allow you to -easily connect ArangoGraph deployments to your application. - -1. Navigate to **Deployments** and click the **View** button to show the - deployment page. -2. In the **Quick start** section, click the **Connecting drivers** button. -3. Select your programming language, i.e. Go, Java, Python, etc. -4. Follow the examples to connect a driver to your deployment. They include - code examples on how to use certificates in your application. - -![ArangoGraph Connecting Drivers](../../../images/arangograph-connecting-drivers.png) - -## Certificate Rotation - -Every certificate has a self-signed root certificate that is going to expire. -When certificates that are used in existing deployments are about to expire, -an automatic rotation of the certificates is triggered. This means that the -certificate is cloned (all existing settings are copied over to a new certificate) -and all affected deployments then start using the cloned certificate. - -Based on the type of certificate used, you may also need to install the new -certificate on your local machine. For example, self-signed certificates require -installation. To prevent any downtime, it is recommended to manually create a -new certificate and apply the required changes prior to the expiration date. diff --git a/site/content/3.11/data-science/arangograph-notebooks.md b/site/content/3.11/data-science/arangograph-notebooks.md deleted file mode 100644 index 34ca9529be..0000000000 --- a/site/content/3.11/data-science/arangograph-notebooks.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: ArangoGraph Notebooks -menuTitle: ArangoGraph Notebooks -weight: 130 -description: >- - Colocated Jupyter Notebooks within the ArangoGraph Insights Platform ---- -{{< tip >}} -ArangoGraph Notebooks don't include the ArangoGraphML services. -To enable the ArangoGraphML services, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. -{{< /tip >}} - -The ArangoGraph Notebook is a JupyterLab notebook embedded in the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -The notebook integrates seamlessly with the platform, -automatically connecting to ArangoGraph services and ArangoDB. -This makes it much easier to leverage these resources without having -to download any data locally or to remember user IDs, passwords, and endpoint URLs. - -For more information, see the [Notebooks](../arangograph/notebooks.md) documentation. diff --git a/site/content/3.12/about-arangodb/features/platform.md b/site/content/3.12/about-arangodb/features/platform.md deleted file mode 100644 index d6ef7fd320..0000000000 --- a/site/content/3.12/about-arangodb/features/platform.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Feature list of the ArangoDB Platform -menuTitle: ArangoDB Platform -weight: 10 -description: >- - The ArangoDB Platform is a scalable architecture that gets you all features - of ArangoDB including graph-powered machine learning and GenAI as a single - solution with a unified interface ---- -For in-depth information about the ArangoDB Platform as a whole and how to -deploy and use it, see [The ArangoDB Platform](../../../platform/about-the-platform/_index.md). - -## Architecture - -- **Core Database**: The ArangoDB database system forms the solid core - of the ArangoDB Platform. - -- **Kubernetes**: An open-source container orchestration system for automating - software deployment, scaling, and management designed by Google. It is the - autopilot for operating ArangoDB clusters and the additional Platform services. - -- **Helm**: A package manager for Kubernetes that enables consistent, repeatable - installations and version control. - -- **Envoy**: A high-performance service proxy that acts as the gateway for the - ArangoDB Platform for centralizing authentication and routing. - -- **Web interface**: The Platform includes a unified, browser-based UI that lets - you access its features in an intuitive way. Optional products like the - GenAI Suite seamlessly integrate into the UI if installed. - -## Features - -- [**ArangoDB Core**](core.md): The ArangoDB database system with support for - graphs, documents, key-value, full-text search, and vector search. - -- [**Graph Visualizer**](../../../platform/graph-intelligence/graph-visualizer.md): - A web-based tool for exploring your graph data with an intuitive interface and - sophisticated querying capabilities. - -- [**Graph Analytics**](../../../platform/graph-intelligence/graph-analytics.md): - A service that can efficiently load graph data from the core database system - and run graph algorithms such as PageRank and many more. - -- [**GenAI Suite**](../../../platform/data-science/_index.md): - ArangoDB's graph-powered machine learning (GraphML) as well as GraphRAG for - automatically building knowledge graphs from text and taking advantage of both - excerpts and higher-level summaries as context for turbocharging GenAI - applications. - -- [**Notebook servers**](../../../platform/data-science/notebook-servers.md): - Run Jupyter kernels in the Platform for hosting interactive, Python-based - notebooks to experiment and develop applications. - -- [**MLflow integration**](../../../platform/data-science/graphrag/services/mlflow.md): - Use the popular MLflow for machine learning practitioners as part of the - ArangoDB Platform. diff --git a/site/content/3.12/arangograph/_index.md b/site/content/3.12/arangograph/_index.md deleted file mode 100644 index 0e07d4c600..0000000000 --- a/site/content/3.12/arangograph/_index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: ArangoGraph Insights Platform -menuTitle: ArangoGraph -weight: 65 -description: >- - The ArangoGraph Insights Platform provides the entire functionality of - ArangoDB as a service, without the need to run or manage databases yourself -aliases: - - arangograph/changelog ---- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), -formerly called Oasis, provides ArangoDB databases as a Service (DBaaS). -It enables you to use the entire functionality of an ArangoDB cluster -deployment without the need to run or manage the system yourself. - -The ArangoGraph Insights Platform... - -- runs your databases in data centers of the cloud provider - of your choice: Google Cloud Platform (GCP) or Amazon Web Services (AWS). - This optimizes performance and reduces cost. - -- ensures that your databases are always available and - healthy by monitoring them 24/7. - -- ensures that your databases are kept up to date by - installing new versions without service interruption. - -- ensures that your data is safe by providing encryption & - audit logs and making frequent data backups. - -- guarantees that your data always remains your property and - access to it is protected with industry standard safeguards. - -For more information see -[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) - -For quick start guide, see -[Use ArangoDB in the Cloud](../get-started/set-up-a-cloud-instance.md). diff --git a/site/content/3.12/arangograph/api/_index.md b/site/content/3.12/arangograph/api/_index.md deleted file mode 100644 index ee4f21371f..0000000000 --- a/site/content/3.12/arangograph/api/_index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: The ArangoGraph API -menuTitle: ArangoGraph API -weight: 60 -description: >- - Interface to control all resources inside ArangoGraph in a scriptable manner -aliases: - - arangograph-api ---- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), -comes with its own API. This API enables you to control all -resources inside ArangoGraph in a scriptable manner. Typical use cases are spinning -up ArangoGraph deployments during continuous integration and infrastructure as code. - -The ArangoGraph API… - -- is a well-specified API that uses - [Protocol Buffers](https://developers.google.com/protocol-buffers/) - as interface definition and [gRPC](https://grpc.io/) as - underlying protocol. - -- allows for automatic generation of clients for a large list of languages. - A Go client is available out of the box. - -- uses API keys for authentication. API keys impersonate a user and inherit - the permissions of that user. - -- is also available as a command-line tool called [oasisctl](../oasisctl/_index.md). - -- is also available as a - [Terraform plugin](https://github.com/arangodb-managed/terraform-provider-oasis/). - This plugin makes integration of ArangoGraph in infrastructure as code projects - very simple. To learn more, refer to the [plugin documentation](https://registry.terraform.io/providers/arangodb-managed/oasis/latest/docs). - -Also see: -- [github.com/arangodb-managed/apis](https://github.com/arangodb-managed/apis/) -- [API definitions](https://arangodb-managed.github.io/apis/index.html) diff --git a/site/content/3.12/arangograph/api/get-started.md b/site/content/3.12/arangograph/api/get-started.md deleted file mode 100644 index b4ea00e39d..0000000000 --- a/site/content/3.12/arangograph/api/get-started.md +++ /dev/null @@ -1,481 +0,0 @@ ---- -title: Get started with the ArangoGraph API and Oasisctl -menuTitle: Get started with Oasisctl -weight: 10 -description: >- - A tutorial that guides you through the ArangoGraph API as well as the Oasisctl - command-line tool -aliases: - - ../arangograph-api/getting-started ---- -This tutorial shows you how to do the following: - -- Generate an API key and authenticate with Oasisctl -- View information related to your organizations, projects, and deployments -- Configure, create and delete a deployment - -With Oasisctl the general command structure is to execute commands such as: - -``` -oasisctl list deployments -``` - -This command lists all deployments available to the authenticated user and we -will explore it in more detail later. Most commands also have associated -`--flags` that are required or provide additional options, this aligns with the -interaction method for many command line utilities. If you aren’t already -familiar with this, follow along as there are many examples in this guide that -will familiarize you with this command structure and using flags, along with -how to use OasisCtl to access the ArangoGraph API. - -Note: A good rule of thumb for all variables, resource names, and identifiers -is to **assume they are all case sensitive**, when being used with Oasisctl. - -## API Authentication - -### Generating an API Key - -The first step to using the ArangoGraph API is to generate an API key. To generate a -key you will need to be signed into your account at -[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -Once you are signed in, hover over the profile icon in the top right corner. - -![Profile Icon](../../../images/arangograph-my-account-hover.png) - -Click _My API keys_. - -This will bring you to your API key management screen. From this screen you can -create, reject, and delete API keys. - -Click the _New API key_ button. - -![Blank API Screen](../../../images/arangograph-my-api-keys.png) - -The pop-up box that follows has a few options for customizing the access level -of this API key. - -The options you have available include: - -- Limit access to 1 organization or all organizations this user has access to -- Set an expiration time, specified in number of hours -- Limit key to read-only access - -Once you have configured the API key access options, you will be presented with -your API key ID and API key secret. It is very important that you capture the -API key secret before clicking the close button. There is no way to retrieve -the API key secret after closing this pop-up window. - -![API Secret Key](../../../images/arangograph-api-key-secret.png) - -Once you have securely stored your API key ID and secret, click close. - -That is all there is to setting up API access to your ArangoGraph organizations. - -### Authenticating with Oasisctl - -Now that you have API access it is time to login with Oasisctl. - -Running the Oasisctl utility without any arguments is the equivalent of -including the --help flag. This shows all of the top level commands available -and you can continue exploring each command by typing the command name -followed by the --help flag to see the options available for that command. - -Let’s start with doing that for the login command: - -```bash -oasisctl login --help -``` - -You should see an output similar to this: - -![login help output](../../../images/oasisctl-login-help.png) - -This shows two additional flags are available, aside from the help flag. - -- `--key-id` -- `--key-secret` - -These require the values we received when creating the API key. Once you run -this command you will receive an authentication token that can be used for the -remainder of the session. - -```bash -oasisctl login \ - --key-id cncApiKeyId \ - --key-secret 873-secret-key-id -``` - -Upon successful login you should receive an authentication token: - -![On Successful Login](../../../images/oasisctl-login-success.png) - -Depending on your environment, you could instead store this token for easier -access. For example: - -With Linux: - -```bash -export OASIS_TOKEN=$(oasisctl login --key-id cncApiKeyId --key-secret 873-secret-key-id) -``` - -Or Windows Powershell: - -```powershell -setx OASIS_TOKEN (oasisctl login --key-id cncApiKeyId --key-secret 873-secret-key-id) -``` - -In the coming sections you will see how to authenticate with this token when -using other commands that require authentication. - -## Viewing and Managing Organizations and Deployments - -### Format - -This section covers the basics of retrieving information from the ArangoGraph API. -Depending on the data you are requesting from the ArangoGraph API, being able to read -it in the command line can start to become difficult. To make text easier to -read for humans and your applications, Oasisctl offers two options for -formatting the data received: - -- Table -- JSON - -You can define the format of the data by supplying the `--format` flag along -with your preferred format, like so: - -```bash -oasisctl --format json -``` - -### Viewing Information with the List Command - -This section will cover the two main functions of retrieving data with the -ArangoGraph API. These are: - -- `list` - List resources -- `get` - Get information - -Before you can jump right into making new deployments you need to be aware of -what resources you have available. This is where the list command comes in. -List serves as a way to retrieve general information, you can see all of the -available list options by accessing its help output. - -```bash -oasisctl list --help -``` - -This should output a screen similar to: - -![List help output](../../../images/oasisctl-list-help.png) - -As you can see you can get information on anything you would need about your -ArangoGraph organizations, deployments, and access control. To start, let’s take a -look at a few examples of listing information and then getting more details on -our results. - -### List Organizations - -One of the first pieces of information you may be interested in is the -organizations you have access to. This is useful to know because most commands -require an explicit declaration of the organization you are interacting with. -To find this, use list to list your available organizations: - -```bash -oasisctl list organizations --format json -``` - -Once you have your available organizations you can refer to your desired -organization using its name or id. - -![List organizations output](../../../images/oasisctl-list-org.png) - -Note: You may also notice the url attribute, this is for internal use only and -should not be treated as a publicly accessible path. - -### List Projects - -Once you have the organization name that you wish to interact with, the next -step is to list the available projects within that organization. Do this by -following the same command structure as before and instead exchange -organizations for projects, this time providing the desired organization name -with the `--organization-id` flag. - -```bash -oasisctl list projects \ - --organization-id "ArangoGraph Organization" \ - --format json -``` - -This will return information on all projects that the authenticated user has -access to. - -![List projects output](../../../images/oasisctl-list-projects.png) - -### List Deployments - -Things start getting a bit more interesting with information related to -deployments. Now that you have obtained an organization iD and a project ID, -you can list all of the associated deployments for that project. - -```bash -oasisctl list deployments \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --format json - ``` - -![List deployments output](../../../images/oasisctl-list-deployments.png) - -This provides some basic details for all of the deployments associated with the -project. Namely, it provides a deployment ID which we can use to start making -modifications to the deployment or to get more detailed information, with the -`get` command. - -### Using the Get Command - -In Oasisctl, you use the get command to obtain more detailed information about -any of your available resources. It follows the same command structure as the -previous commands but typically requires a bit more information. For example, -to get more information on a specific deployment means you need to know at -least: - -- Organization ID -- Project ID -- Deployment ID - -To get more information about our example deployment we would need to execute -the following command: - -```bash -oasisctl get deployment \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --deployment-id "abc123DeploymentID" \ - --format json -``` - -This returns quite a bit more information about the deployment including more -detailed server information, the endpoint URL where you can access the web interface, -and optionally the root user password. - -![Get deployment details](../../../images/oasisctl-get-deployment.png) - -### Node Size ID - -We won’t be exploring every flag available for creating a deployment but it is -a good idea to explore the concept of the node size ID value. This is an -indicator that is unique to each provider (Google, AWS) and indicates -the CPU and memory. Depending on the provider and region this can also -determine the available disk sizes for your deployment. In other words, it is -pretty important to know which `node-size-id` your deployment will be using. - -The command you execute will determine on the available providers and regions -for your organization but here is an example command that lists the available -options in the US West region for the Google Cloud Platform: - -```bash -oasisctl list nodesizes \ - --organization-id "ArangoGraph Organization" \ - --provider-id "Google Cloud Platform" \ - --region-id gcp-us-west2 -``` - -The output you will see will be similar to this: - -![List node size id](../../../images/oasisctl-list-node-size-id.png) - -It is important to note that you can scale up with more disk size but you are -unable to scale down your deployment disk size. The only way to revert back to -a lower disk size is to destroy and recreate your deployment. - -Once you have decided what your starting deployment needs are you can reference -your decision with the Id value for the corresponding configuration. So, for -our example, we will be choosing the c4-a4 configuration. The availability and -options are different for each provider and region, so be sure to confirm the -node size options before creating a new deployment. - -### Challenge - -You can use this combination of listing and getting to obtain all of the -information you want for your ArangoGraph organizations. We only explored a few of -the commands available but you can explore them all within the utility by -utilizing the `--help` flag or you can see all of the available options -in the [documentation](../oasisctl/options.md). - -Something that might be useful practice before moving on is getting the rest -of the information that you need to create a deployment. Here are a list of -items that won’t have defaults available when you attempt to create your -first deployment and you will need to supply: - -- CA Certificate ID (name) -- IP Allowlist ID (id) (optional) -- Node Size ID (id) -- Node Disk Size (GB disk size dependent on Node Size ID) -- Organization ID (name) -- Project ID (name) -- Region ID (name) - -Try looking up that information to get more familiar with how to find -information with Oasisctl. When in doubt use the `--help` flag with any -command. - -## Creating Resources - -Now that you have seen how to obtain information about your available -resources, it’s time to start using those skills to start creating your own -deployment. To create resources with Oasisctl you use the create command. -To see all the possible options you can start with the following command: - -```bash -oasisctl create --help -``` - -![Create command help output](../../../images/oasisctl-create-help.png) - -### Create a Deployment - -To take a look at all of the options available when creating a deployment the -best place to start is with our trusty help command. - -```bash -oasisctl create deployment --help -``` - -![Create deployment help output](../../../images/oasisctl-create-deployment-help.png) - -As you can see there are a lot of default options but also a few that require -some knowledge of our pre-existing resources. Attempting to create a deployment -without one of the required options will return an error indicating which value -is missing or invalid. - -Once you have collected all of the necessary information the command for -creating a deployment is simply supplying the values along with the appropriate -flags. This command will create a deployment: - -```bash -oasisctl create deployment \ - --region-id gcp-us-west2 \ - --node-size-id c4-a4 \ - --node-disk-size 10 \ - --version 3.9.2 \ - --cacertificate-id OasisCert \ - --organization-id "ArangoGraph Organization" \ - --project-id "Getting Started with ArangoGraph" \ - --name "First Oasisctl Deployment" \ - --description "The first deployment created using the awesome Oasisctl utility!" -``` - -If everything went according to play you should see similar output: - -![Deployment created successfully](../../../images/oasisctl-create-first-deployment-success.png) - -### Wait on Deployment Status - -When you create a deployment it begins the process of _bootstrapping_ which is -getting the deployment ready for use. This should happen quickly and to see if -it is ready for use you can run the wait command using the ID of the newly -created deployment, shown at the top of the information you received above. - -```bash -oasisctl wait deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -Once you receive a response of _Deployment Ready_, your deployment is indeed -ready to use. You can get some new details by running the get command. - -```bash -oasisctl get deployment \ - --organization-id "ArangoGraph Organization" \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -![Get deployment bootstrap status](../../../images/oasisctl-get-first-deployment-bootstrapped.png) - -Once the deployment is ready you will get two new pieces of information, the -endpoint URL and Bootstrapped-At will indicate the time it became available. -If you would like to login to the web interface to verify that your server is in fact -up and running you will need to supply the `--show-root-password` flag along -with the get command, this flag does not take a value. - -### The Update Command - -The inevitable time comes when something about your deployment must change and -this is where the update command comes in. You can use update to change or -update a number of things including updating the groups, policies, and roles -for user access control. You can also update some of your deployment -information or, for our situation, add an IP Allowlist if you didn’t add one -during creation. - -There are, of course, many options available and it is always recommended to -start with the --help flag to read about all of them. - -### Update a Deployment - -This section will show an example of how to update a deployment to use a -pre-existing allowlist. To add an IP Allowlist after the fact we are really -just updating the IP Allowlist value, which is currently empty. In order to -update the IP Allowlist of a deployment you must create a allowlist and then -you can simply reference its id like so: - -```bash -oasisctl update deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i \ - --ipallowlist-id abc123AllowlistID -``` - -You should receive a response with the deployment information and an indication -that deployment was updated at the top. - -You can use the update command to update everything about your deployments as -well. If you run: - -```bash -oasisctl update deployment --help -``` - -You will see the full list of options available that will allow you to scale -your deployment as needed. - -![Update deployment help output](../../../images/oasisctl-update-deployment-help.png) - -## Delete a Deployment - -There may come a day where you need to delete a resource. The process for this -follows right along with the conventions for the other commands detailed -throughout this guide. - -### The Delete Command - -For the final example in this guide we will delete the deployment that has -been created. This only requires the deployment ID and the permissions to -delete the deployment. - -```bash -oasisctl delete deployment \ - --deployment-id hmkuedzw9oavvjmjdo0i -``` - -Once the deployment has been deleted you can confirm it is gone by listing -your deployments. - -```bash -oasisctl list deployments \ - --organization-id "ArangoGraph Organization" \ - --format json -``` - -## Next Steps - -As promised, this guide covered the basics of using Oasisctl with the ArangoDB -API. While we primarily focused on viewing and managing deployments there is -also a lot more to explore, including: - -- Organization Invites Management -- Backups -- API Key Management -- Certificate Management -- User Access Control - -You can check out all these features and further details on the ones discussed -in this guide in the documentation. diff --git a/site/content/3.12/arangograph/api/set-up-a-connection.md b/site/content/3.12/arangograph/api/set-up-a-connection.md deleted file mode 100644 index 7cbc2b76e2..0000000000 --- a/site/content/3.12/arangograph/api/set-up-a-connection.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Get started with the ArangoGraph API -menuTitle: Get started with the API -weight: 5 -description: >- - Quick start guide on how to set up a connection to the ArangoGraph API -aliases: - - ../arangograph-api/getting-started-with-the-api ---- -The instructions below are a quick start guide on how to set up a connection to the ArangoGraph API. - -All examples below will use the Go programming language. -Since the ArangoGraph API is using gRPC with protocol buffers, -all examples can be easily translated to many different languages. - -## Prerequisites - -Make sure that you have already [signed up for ArangoGraph](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). - -## Creating an API key - -1. Go to [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) and login. -2. Click the user icon in the top-right of the dashboard. -3. Select __My API keys__ -4. Click __New API key__ -5. Click __Create__ to select the default settings. -6. You'll now see a dialog showing the __API key ID__ and - the __API key Secret__. This is the only time you will see - the secret, so make sure to store it in a safe place. - -## Create an access token with your API key - -```go -import ( - "context" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "github.com/arangodb-managed/apis/common/auth" - common "github.com/arangodb-managed/apis/common/v1" - data "github.com/arangodb-managed/apis/data/v1" - iam "github.com/arangodb-managed/apis/iam/v1" -) - -... - -// Set up a connection to the API. -tc := credentials.NewTLS(&tls.Config{}) -conn, err := grpc.Dial("https://api.cloud.arangodb.com", - grpc.WithTransportCredentials(tc)) -if err != nil { - // handle error -} - -// Create client for IAM service -iamc := iam.NewIAMServiceClient(conn) - -// Call AuthenticateAPIKey to create token -resp, err := iamc.AuthenticateAPIKey(ctx, - &iam.AuthenticateAPIKeyRequest{ - Id: keyID, - Secret: keySecret, -}) -if err != nil { - // handle error -} -token := resp.GetToken() -``` - -## Make an authenticated API call - -We're going to list all deployments in a project. -The connection and token created in the previous sample is re-used. - -The authentication token is passed as standard `bearer` token to the call. -If Go, there is a helper method (`WithAccessToken`) to create a context using -an authentication token. - -```go -// Create client for Data service -datac := data.NewDataServiceClient(conn) - -// Prepare context with authentication token -ctx := auth.WithAccessToken(context.Background(), token) - -// Call list deployments -list, err := datac.ListDeployments(ctx, - &common.ListOptions{ContextId: myProjectID}) -if err != nil { - // handle error -} -for _, depl := range list.GetItems() { - fmt.Printf("Found deployment with id %s\n", depl.GetId()) -} - -``` - -## API Errors - -All API methods return errors as gRPC error codes. - -The `github.com/arangodb-managed/apis/common/v1` package contains several helpers to check for common errors. - -```go -if common.IsNotFound(err) { - // Error is caused by a not-found situation -} -``` diff --git a/site/content/3.12/arangograph/data-loader/add-files.md b/site/content/3.12/arangograph/data-loader/add-files.md deleted file mode 100644 index 114b588e40..0000000000 --- a/site/content/3.12/arangograph/data-loader/add-files.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Add files into Data Loader -menuTitle: Add files -weight: 5 -description: >- - Provide your set of files in CSV format containing the data to be imported ---- - -The Data Loader allows you to upload your data files in CSV format into -ArangoGraph and then use these data sources to design a graph using the -built-in graph designer. - -## Upload your files - -You can upload your CSV files in the following ways: - -- Drag and drop your files in the designated area. -- Click the **Browse files** button and select the files you want to add. - -![ArangoGraph Data Loader Upload Files](../../../images/arangograph-data-loader-upload-files.png) - -You have the option to either upload several files collectively as a batch or -add them individually. Furthermore, you can supplement additional files later on. -After a file has been uploaded, you can expand it to preview both the header and -the first row of data within the file. - -In case you upload CSV files without fields, they will not be available for -manipulation. - -Once the files are uploaded, you can start [designing your graph](../data-loader/design-graph.md). - -### File formatting limitations - -Ensure that the files you upload are correctly formatted. Otherwise, errors may -occur, the upload may fail, or the data may not be correctly mapped. - -The following restrictions and limitations apply: - -- The only supported file format is CSV. If you submit an invalid file format, - the upload of that specific file will be prevented. -- It is required that all CSV files have a header row. If you upload a file - without a header, the first row of data is treated as the header. To avoid - losing the first row of the data, make sure to include headers in your files. -- The CSV file should have unique header names. It is not possible to have two - columns with the same name within the same file. - -For more details, see the [File validation](../data-loader/import.md#file-validation) section. - -### Upload limits - -Note that there is a cumulative file upload limit of 1GB. This means that the -combined size of all files you upload should not exceed 1GB. If the total size -of the uploaded files surpasses this limit, the upload may not be successful. - -## Delete files - -You can remove uploaded files by clicking the **Delete file** button in the -**Your files** panel. Please keep in mind that in order to delete a file, -you must first remove all graph associations associated with it. \ No newline at end of file diff --git a/site/content/3.12/arangograph/data-loader/example.md b/site/content/3.12/arangograph/data-loader/example.md deleted file mode 100644 index 46fdd1b38e..0000000000 --- a/site/content/3.12/arangograph/data-loader/example.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Data Loader Example -menuTitle: Example -weight: 20 -description: >- - Follow this complete working example to see how easy it is to transform existing - data into a graph and get insights from the connected entities ---- - -To transform your data into a graph, you need to have CSV files with entities -representing the nodes and a corresponding CSV file representing the edges. - -This example uses a sample data set of two files, `airports.csv`, and `flights.csv`. -These files are used to create a graph showing flights arriving at and departing -from various cities. -You can download the files from [GitHub](https://github.com/arangodb/example-datasets/tree/master/Data%20Loader). - -The `airports.csv` contains rows of airport entries, which are the future nodes -in your graph. The `flights.csv` contains rows of flight entries, which are the -future edges connecting the nodes. - -The whole process can be broken down into these steps: - -1. **Database and graph setup**: Begin by choosing an existing database or - create a new one and enter a name for your new graph. -2. **Add files**: Upload the CSV files to the Data Loader web interface. You can - simply drag and drop them or upload them through the file browser window. -3. **Design graph**: Design your graph schema by adding nodes and edges and map - data from the uploaded files to them. This allows creating the corresponding - documents and collections for your graph. -4. **Import data**: Import the data and start using your newly created - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and its - corresponding collections. - -## Step 1: Create a database and choose the graph name - -Start by creating a new database and adding a name for your graph. - -![Data Loader Example Step 1](../../../images/arangograph-data-loader-example-choose-names.png) - -## Step 2: Add files - -Upload your CSV files to the Data Loader web interface. You can drag and drop -them or upload them via a file browser window. - -![Data Loader Example Step 2](../../../images/arangograph-data-loader-example-add-files.png) - -See also [Add files into Data Loader](../data-loader/add-files.md). - -## Step 3: Design graph schema - -Once the files are added, you can start designing the graph schema. This example -uses a simple graph consisting of: -- Two nodes (`origin_airport` and `destination_airport`) -- One directed edge going from the origin airport to the destination one - representing a flight - -Click **Add node** to create the nodes and connect them with edges. - -Next, for each of the nodes and edges, you need to create a mapping to the -corresponding file and headers. - -For nodes, the **Node label** is going to be a node collection name and the -**Primary identifier** will be used to populate the `_key` attribute of documents. -You can also select any additional headers to be included as document attributes. - -In this example, two node collections have been created (`origin_airport` and -`destination_airport`) and `AirportID` header is used to create the `_key` -attribute for documents in both node collections. The header preview makes it -easy to select the headers you want to use. - -![Data Loader Example Step 3 Nodes](../../../images/arangograph-data-loader-example-map-nodes.png) - -For edges, the **Edge label** is going to be an edge collection name. Then, you -need to specify how edges will connect nodes. You can do this by selecting the -*from* and *to* nodes to give a direction to the edge. -In this example, the `source airport` header has been selected as a source and -the `destination airport` header as a target for the edge. - -![Data Loader Example Step 3 Edges](../../../images/arangograph-data-loader-example-map-edges.png) - -Note that the values of the source and target for the edge correspond to the -**Primary identifier** (`_key` attribute) of the nodes. In this case, it is the -airport code (i.e. GKA) used as the `_key` in the node documents and in the source -and destination headers to configure the edges. - -See also [Design your graph in the Data Loader](../data-loader/design-graph.md). - -## Step 4: Import and see the resulting graph - -After all the mapping is done, all you need to do is click -**Save and start import**. The report provides an overview of the files -processed and the documents created, as well as a link to your new graph. -See also [Start import](../data-loader/import.md). - -![Data Loader Example Step 4 See your new graph](../../../images/arangograph-data-loader-example-data-import.png) - -Finally, click **See your new graph** to open the ArangoDB web interface and -explore your new collections and graph. - -![Data Loader Example Step 4 Resulting graph](../../../images/arangograph-data-loader-example-resulting-graph.png) - -Happy graphing! \ No newline at end of file diff --git a/site/content/3.12/arangograph/data-loader/import.md b/site/content/3.12/arangograph/data-loader/import.md deleted file mode 100644 index 1589244278..0000000000 --- a/site/content/3.12/arangograph/data-loader/import.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Start the import -menuTitle: Start import -weight: 15 -description: >- - Once the data files are provided and the graph is designed, you can start the import ---- - -Before starting the actual import, make sure that: -- You have selected a database for import or created a new one; -- You have provided a valid name for your graph; -- You have created at least one node; -- You have created at least one edge; -- You have uploaded at least one file; -- Every file is related to at least one node or edge; -- Every node and edge is linked to a file; -- Every node and edge has a unique label; -- Every node has a primary identifier selected; -- Every edge has an origin and destination file header selected. - -To continue with the import, click the **Save and start import** button. The data -importer provides an overview showing results with the collections that have been -created with the data provided in the files. - -To access your newly created graph in the ArangoDB web interface, click the -**See your new graph** button. - -## File validation - -Once the import has started, the files that you have provided are being validated. -If the validation process detects parsing errors in any of the files, the import -is temporarily paused and the validation errors are shown. You can get a full -report by clicking the **See full report** button. - -At this point, you can: -- Continue with the import without addressing the errors. The CSV files will still - be included in the migration. However, the invalid rows are skipped and - excluded from the migration. -- Revisit the problematic file(s), resolve the issues, and then re-upload the - file(s) again. - -{{< tip >}} -To ensure the integrity of your data, it is recommended to address all the errors -detected during the validation process. -{{< /tip >}} - -### Validation errors and their meanings - -#### Invalid Quotation Mark - -This error indicates issues with quotation marks in the CSV data. -It can occur due to improper use of quotes. - -#### Missing Quotation Marks - -This error occurs when quotation marks are missing or improperly placed in the -CSV data, potentially affecting data enclosure. - -#### Insufficient Data Fields - -This error occurs when a CSV row has fewer fields than expected. It may indicate -missing or improperly formatted data. - -#### Excessive Data Fields - -This error occurs when a CSV row has more fields than expected, possibly due to -extra data or formatting issues. - -#### Unidentifiable Field Separator - -This error suggests that the parser could not identify the field separator -character in the CSV data. \ No newline at end of file diff --git a/site/content/3.12/arangograph/deployments/upgrades-and-versioning.md b/site/content/3.12/arangograph/deployments/upgrades-and-versioning.md deleted file mode 100644 index 211d271c92..0000000000 --- a/site/content/3.12/arangograph/deployments/upgrades-and-versioning.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Upgrades and Versioning in ArangoGraph -menuTitle: Upgrades and Versioning -weight: 10 -description: >- - Select which version of ArangoDB you want to use within your ArangoGraph - deployment and choose when to roll out your upgrades ---- -{{< info >}} -Please note that this policy comes into effect in April 2023. -{{< /info >}} - -## Release Definitions - -The following definitions are used for release types of ArangoDB within ArangoGraph: - -| Release | Introduces | Contains breaking changes | -|----------|-------------|----------------------------| -| **Major** (`X.y.z`) | Major new features and functionalities | Likely large changes | -| **Minor** (`x.Y.z`) | Some new features or improvements | Likely small changes | -| **Patch** (`x.y.Z`) | Essential fixes and improvements | Small changes in exceptional circumstances | - -## Release Channels - -When creating a deployment in ArangoGraph, you can select the minor version -of ArangoDB that your deployment is going to use. This minor version is in the -format `Major.Minor` and indicates the major and minor version of ArangoDB that -is used in this deployment, for example `3.10` or `3.9`. - -To provide secure and reliable service, databases are deployed on the latest -available patch version in the selected version. For example, if `3.10` is -selected and `3.10.3` is the latest version of ArangoDB available for the `3.10` -minor version, then the deployment is initially using ArangoDB `3.10.3`. - -## Upgrades - -### Manual Upgrades - -At any time, you can change the release channel of your deployment to a later -release channel, but not to an earlier one. For example, if you are using `3.10` -then you can change your deployment’s release channel to `3.11`, but you would -not be able to change the release channel to `3.9`. -See [how to edit a deployment](_index.md#how-to-edit-a-deployment). - -Upon changing your release channel, an upgrade process for your deployment is -initiated to upgrade your running database to the latest patch release of your -selected release channel. You can use this mechanism to upgrade your deployments -at a time that suits you, prior to the forced upgrade when your release channel -is no longer available. - -### Automatic Upgrades - -#### Major Versions (`X.y.z`) - -The potential disruption of a major version upgrade requires additional testing -of any applications connecting to your ArangoGraph deployment. As a result, when -a new major version is released on the ArangoGraph platform, an email is sent out -to inform you of this release. - -If the ArangoDB version that you are currently using is no longer available on the -ArangoGraph platform, you are forced to upgrade to the next available version. -Prior to the removal of the version, an email is sent out to inform you of this -forced upgrade. - -#### Minor Versions (`x.Y.z`) - -Although minor upgrades are not expected to cause significant compatibility -changes like major versions, they may still require additional planning and -validation. - -This is why minor upgrades are treated in the same manner as major upgrades -within ArangoGraph. When a new minor version is released on the ArangoGraph -platform, an email is sent out to inform you of this release. - -If the ArangoDB version that you are currently using is no longer available on the -ArangoGraph platform, you are forced to upgrade to the next available version. -Prior to the removal of the version, an email is sent out to inform you of this -forced upgrade. - -#### Patch Versions (`x.y.Z`) - -Upgrades between patch versions are transparent, with no significant disruption -to your applications. As such, you can expect to be automatically upgraded to -the latest patch version of your selected minor version shortly after it becomes -available in ArangoGraph. - -ArangoGraph aims to give approximately one week’s notice prior to upgrading your -deployments to the latest patch release. Although in exceptional circumstances -(such as a critical security issue) the upgrade may be triggered with less than -one week's notice. -The upgrade is carried out automatically. However, if you need the upgrade to be -deferred temporarily, contact the ArangoGraph Support team to request that. diff --git a/site/content/3.12/arangograph/migrate-to-the-cloud.md b/site/content/3.12/arangograph/migrate-to-the-cloud.md deleted file mode 100644 index 8a3f4a9802..0000000000 --- a/site/content/3.12/arangograph/migrate-to-the-cloud.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -title: Cloud Migration Tool -menuTitle: Migrate to the cloud -weight: 30 -description: >- - Migrating data from bare metal servers to the cloud with minimal downtime -draft: true ---- -The `arangosync-migration` tool allows you to easily move from on-premises to -the cloud while ensuring a smooth transition with minimal downtime. -Start the cloud migration, let the tool do the job and, at the same time, -keep your local cluster up and running. - -Some of the key benefits of the cloud migration tool include: -- Safety comes first - pre-checks and potential failures are carefully handled. -- Your data is secure and fully encrypted. -- Ease-of-use with a live migration while your local cluster is still in use. -- Get access to what a cloud-based fully managed service has to offer: - high availability and reliability, elastic scalability, and much more. - -## Downloading the tool - -The `arangosync-migration` tool is available to download for the following -operating systems: - -**Linux** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/linux/amd64/arangosync-migration) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/linux/arm64/arangosync-migration) - -**macOS / Darwin** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/darwin/amd64/arangosync-migration) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/darwin/arm64/arangosync-migration) - -**Windows** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/windows/amd64/arangosync-migration.exe) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/windows/arm64/arangosync-migration.exe) - -For macOS as well as other Unix-based operating systems, run the following -command to make sure you can execute the binary: - -```bash -chmod 755 ./arangosync-migration -``` - -## Prerequisites - -Before getting started, make sure the following prerequisites are in place: - -- Go to the [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home) - and sign in. If you don’t have an account yet, sign-up to create one. - -- Generate an ArangoGraph API key and API secret. See a detailed guide on - [how to create an API key](api/set-up-a-connection.md#creating-an-api-key). - -{{< info >}} -The cloud migration tool is only available for clusters. -{{< /info >}} - -### Setting up the target deployment in ArangoGraph - -Continue by [creating a new ArangoGraph deployment](deployments/_index.md#how-to-create-a-new-deployment) -or choose an existing one. - -The target deployment in ArangoGraph requires specific configuration rules to be -set up before the migration can start: - -- **Configuration settings**: The target deployment must be compatible with the - source data cluster. This includes the ArangoDB version that is being used, - the DB-Servers count, and disk space. -- **Deployment region and cloud provider**: Choose the closest region to your - data cluster. This factor can speed up your migration to the cloud. - -After setting up your ArangoGraph deployment, wait for a few minutes for it to become -fully operational. - -{{< info >}} -Note that Developer mode deployments are not supported. -{{< /info >}} - -## Running the migration tool - -The `arangosync-migration` tool provides a set of commands that allow you to: -- start the migration process -- check whether your source and target clusters are fully compatible -- get the current status of the migration process -- stop or abort the migration process -- switch the local cluster to read-only mode - -### Starting the migration process - -To start the migration process, run the following command: - -```bash -arangosync-migration start -``` -The `start` command runs some pre-checks. Among other things, it measures -the disk space which is occupied by your ArangoDB cluster. If you are using the -same data volume for ArangoDB servers and other data as well, the measurements -can be incorrect. Provide the `--source.ignore-metrics` option to overcome this. - -You also have the option of doing a `--check-only` without starting the actual -migration. If specified, this checks if your local cluster and target deployment -are compatible without sending any data to ArangoGraph. - -Once the migration starts, the local cluster enters into monitoring mode and the -synchronization status is displayed in real-time. If you don't want to see the -status you can terminate this process, as the underlying agent process -continues to work. If something goes wrong, restarting the same command restores -the replication state. - -To restart the migration, first `stop` or `stop --abort` the migration. Then, -start it again using the `start` command. - -{{< warning >}} -Starting the migration creates a full copy of all data from the source cluster -to the target deployment in ArangoGraph. All data that has previously existed in the -target deployment will be lost. -{{< /warning >}} - -### During the migration - -The following takes place during an active migration: -- The source data cluster remains usable. -- The target deployment in ArangoGraph is switched to read-only mode. -- Your root user password is not copied to the target deployment in ArangoGraph. - To get your root password, select the target deployment from the ArangoGraph - Dashboard and go to the **Overview** tab. All other users are fully synchronized. - -{{< warning >}} -The migration tool increases the CPU and memory usage of the server you are -running it on. Depending on your ArangoDB usage pattern, it may take a lot of CPU -to handle the replication. You can stop the migration process anytime -if you see any problems. -{{< /warning >}} - -```bash -./arangosync-migration start \ - --source.endpoint=$COORDINATOR_ENDPOINT \ - --source.jwt-secret=/path-to/jwt-secret.file \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -### How long does it take? - -The total time required to complete the migration depends on how much data you -have and how often write operations are executed during the process. - -You can also track the progress by checking the **Migration status** section of -your target deployment in ArangoGraph dashboard. - -![ArangoGraph Cloud Migration Progress](../../images/arangograph-migration-agent.png) - -### Getting the current status - -To print the current status of the migration, run the following command: - -```bash -./arangosync-migration status \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -You can also add the `--watch` option to start monitoring the status in real-time. - -### Stopping the migration process - -The `arangosync-migration stop` command stops the migration and terminates -the migration agent process. - -If replication is running normally, the command waits until all shards are -in sync. The local cluster is then switched into read-only mode. -After all shards are in-sync and the migration stopped, the target deployment -is switched into the mode specified in `--source.server-mode` option. If no -option is specified, it defaults to the read/write mode. - -```bash -./arangosync-migration stop \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -The additional `--abort` option is supported. If specified, the `stop` command -will not check anymore if both deployments are in-sync and stops all -migration-related processes as soon as possible. - -### Switching the local cluster to read-only mode - -The `arangosync-migration set-server-mode` command allows switching -[read-only mode](../develop/http-api/administration.md#set-the-server-mode-to-read-only-or-default) -for your local cluster on and off. - -In a read-only mode, all write operations are going to fail with an error code -of `1004` (ERROR_READ_ONLY). -Creating or dropping databases and collections are also going to fail with -error code `11` (ERROR_FORBIDDEN). - -```bash -./arangosync-migration set-server-mode \ - --source.endpoint=$COORDINATOR_ENDPOINT \ - --source.jwt-secret=/path-to/jwt-secret.file \ - --source.server-mode=readonly -``` -The `--source.server-mode` option allows you to specify the desired server mode. -Allowed values are `readonly` or `default`. - -### Supported environment variables - -The `arangosync-migration` tool supports the following environment variables: - -- `$ARANGO_GRAPH_API_KEY` -- `$ARANGO_GRAPH_API_SECRET` -- `$ARANGO_GRAPH_DEPLOYMENT_ID` - -Using these environment variables is highly recommended to ensure a secure way -of providing sensitive data to the application. - -### Restrictions and limitations - -When running the migration, ensure that your target deployment has the same (or -bigger) amount of resources (CPU, RAM) than your cluster. Otherwise, the -migration process might get stuck or require manual intervention. This is closely -connected to the type of data you have and how it is distributed between shards -and collections. - -In general, the most important parameters are: -- Total number of leader shards -- The amount of data in bytes per collection - -Both parameters can be retrieved from the ArangoDB Web Interface. - -The `arangosync-migration` tool supports migrating large datasets of up to -5 TB of data and 3800 leader shards, as well as collections as big as 250 GB. - -In case you have any questions, please -[reach out to us](https://www.arangodb.com/contact). - -## Cloud migration workflow for minimal downtime - -1. Download and start the `arangosync-migration` tool. The target deployment - is switched into read-only mode automatically. -2. Wait until all shards are in sync. You can use the `status` or the `start` - command with the same parameters to track that. -3. Optionally, when all shards are in-sync, you can switch your applications - to use the endpoint of the ArangoGraph deployment, but note that it stays in - read-only mode until the migration process is fully completed. -4. Stop the migration using the `stop` subcommand. The following steps are executed: - - The source data cluster is switched into read-only mode. - - It waits until all shards are synchronized. - - The target deployment is switched into default read/write mode. - - {{< info >}} - If you switched the source data cluster into read-only mode, - you can switch it back to default (read/write) mode using the - `set-server-mode` subcommand. - {{< /info >}} diff --git a/site/content/3.12/arangograph/oasisctl/_index.md b/site/content/3.12/arangograph/oasisctl/_index.md deleted file mode 100644 index 9d22a68e31..0000000000 --- a/site/content/3.12/arangograph/oasisctl/_index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Oasisctl -menuTitle: Oasisctl -weight: 65 -description: >- - Command-line client tool for managing the ArangoGraph Insights Platform ---- -Oasisctl is a command-line tool for using the [ArangoGraph API](../api/_index.md). -This tool makes integration of ArangoGraph in all kinds of (bash) scripts easy. -It is also a good example on how to use the API. - -See [Getting started with Oasisctl](../api/get-started.md) for a -tutorial. - -Oasisctl is available for Linux, macOS and Windows. -Download and source code: - -[github.com/arangodb-managed/oasisctl](https://github.com/arangodb-managed/oasisctl/) diff --git a/site/content/3.12/arangograph/oasisctl/accept/_index.md b/site/content/3.12/arangograph/oasisctl/accept/_index.md deleted file mode 100644 index e9c0e05a01..0000000000 --- a/site/content/3.12/arangograph/oasisctl/accept/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Accept -menuTitle: Accept -weight: 2 ---- -## oasisctl accept - -Accept invites - -``` -oasisctl accept [flags] -``` - -## Options -``` - -h, --help help for accept -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl accept organization](accept-organization.md) - Accept organization related invites - diff --git a/site/content/3.12/arangograph/oasisctl/accept/accept-organization-invite.md b/site/content/3.12/arangograph/oasisctl/accept/accept-organization-invite.md deleted file mode 100644 index 3f52fbb67b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/accept/accept-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Accept Organization Invite -menuTitle: Accept Organization Invite -weight: 2 ---- -## oasisctl accept organization invite - -Accept an organization invite the authenticated user has access to - -``` -oasisctl accept organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept organization](accept-organization.md) - Accept organization related invites - diff --git a/site/content/3.12/arangograph/oasisctl/accept/accept-organization.md b/site/content/3.12/arangograph/oasisctl/accept/accept-organization.md deleted file mode 100644 index f4d5310a16..0000000000 --- a/site/content/3.12/arangograph/oasisctl/accept/accept-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Accept Organization -menuTitle: Accept Organization -weight: 1 ---- -## oasisctl accept organization - -Accept organization related invites - -``` -oasisctl accept organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept](_index.md) - Accept invites -* [oasisctl accept organization invite](accept-organization-invite.md) - Accept an organization invite the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/add/_index.md b/site/content/3.12/arangograph/oasisctl/add/_index.md deleted file mode 100644 index c44318f848..0000000000 --- a/site/content/3.12/arangograph/oasisctl/add/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Add -menuTitle: Add -weight: 3 ---- -## oasisctl add - -Add resources - -``` -oasisctl add [flags] -``` - -## Options -``` - -h, --help help for add -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl add auditlog](add-auditlog.md) - Add auditlog resources -* [oasisctl add group](add-group.md) - Add group resources - diff --git a/site/content/3.12/arangograph/oasisctl/add/add-auditlog-destination.md b/site/content/3.12/arangograph/oasisctl/add/add-auditlog-destination.md deleted file mode 100644 index 378e456833..0000000000 --- a/site/content/3.12/arangograph/oasisctl/add/add-auditlog-destination.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Oasisctl Add Audit Log Destination -menuTitle: Add Audit Log Destination -weight: 2 ---- -## oasisctl add auditlog destination - -Add a destination to an auditlog. - -``` -oasisctl add auditlog destination [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - --destination-excluded-topics strings Do not send audit events with these topics to this destination. - --destination-https-client-certificate-pem string PEM encoded public key of the client certificate. - --destination-https-client-key-pem string PEM encoded private key of the client certificate. - --destination-https-headers strings A key=value formatted list of headers for the request. Repeating headers are allowed. - --destination-https-trusted-server-ca-pem string PEM encoded public key of the CA used to sign the server TLS certificate. If empty, a well known CA is expected. - --destination-https-url string URL of the server to POST to. Scheme must be HTTPS. - --destination-type string Type of destination. Possible values are: "cloud", "https-post" - -h, --help help for destination - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add auditlog](add-auditlog.md) - Add auditlog resources - diff --git a/site/content/3.12/arangograph/oasisctl/add/add-auditlog.md b/site/content/3.12/arangograph/oasisctl/add/add-auditlog.md deleted file mode 100644 index dca21fda97..0000000000 --- a/site/content/3.12/arangograph/oasisctl/add/add-auditlog.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Add Audit Log -menuTitle: Add Audit Log -weight: 1 ---- -## oasisctl add auditlog - -Add auditlog resources - -``` -oasisctl add auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add](_index.md) - Add resources -* [oasisctl add auditlog destination](add-auditlog-destination.md) - Add a destination to an auditlog. - diff --git a/site/content/3.12/arangograph/oasisctl/add/add-group-members.md b/site/content/3.12/arangograph/oasisctl/add/add-group-members.md deleted file mode 100644 index db2677d276..0000000000 --- a/site/content/3.12/arangograph/oasisctl/add/add-group-members.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Add Group Members -menuTitle: Add Group Members -weight: 4 ---- -## oasisctl add group members - -Add members to group - -``` -oasisctl add group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group to add members to - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add group](add-group.md) - Add group resources - diff --git a/site/content/3.12/arangograph/oasisctl/add/add-group.md b/site/content/3.12/arangograph/oasisctl/add/add-group.md deleted file mode 100644 index a51b0b7102..0000000000 --- a/site/content/3.12/arangograph/oasisctl/add/add-group.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Add Group -menuTitle: Add Group -weight: 3 ---- -## oasisctl add group - -Add group resources - -``` -oasisctl add group [flags] -``` - -## Options -``` - -h, --help help for group -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add](_index.md) - Add resources -* [oasisctl add group members](add-group-members.md) - Add members to group - diff --git a/site/content/3.12/arangograph/oasisctl/auditlog/_index.md b/site/content/3.12/arangograph/oasisctl/auditlog/_index.md deleted file mode 100644 index fd71b3b653..0000000000 --- a/site/content/3.12/arangograph/oasisctl/auditlog/_index.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Audit Log -menuTitle: Audit Log -weight: 4 ---- -## oasisctl auditlog - -AuditLog resources - -``` -oasisctl auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl auditlog attach](auditlog-attach.md) - Attach a project to an audit log -* [oasisctl auditlog detach](auditlog-detach.md) - Detach a project from an auditlog -* [oasisctl auditlog get](auditlog-get.md) - Audit log get resources - diff --git a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-attach.md b/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-attach.md deleted file mode 100644 index 7ffcd50360..0000000000 --- a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-attach.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Audit Log Attach -menuTitle: Audit Log Attach -weight: 1 ---- -## oasisctl auditlog attach - -Attach a project to an audit log - -``` -oasisctl auditlog attach [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to attach to. - -h, --help help for attach - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources - diff --git a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-detach.md b/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-detach.md deleted file mode 100644 index 4043614c32..0000000000 --- a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-detach.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Audit Log Detach -menuTitle: Audit Log Detach -weight: 2 ---- -## oasisctl auditlog detach - -Detach a project from an auditlog - -``` -oasisctl auditlog detach [flags] -``` - -## Options -``` - -h, --help help for detach - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources - diff --git a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md b/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md deleted file mode 100644 index b4c2a69666..0000000000 --- a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Audit Log Get Attached Project -menuTitle: Audit Log Get Attached Project -weight: 5 ---- -## oasisctl auditlog get attached project - -Get an attached log to a project - -``` -oasisctl auditlog get attached project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog get attached](auditlog-get-attached.md) - Audit get attached resources - diff --git a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached.md b/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached.md deleted file mode 100644 index 004400da64..0000000000 --- a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get-attached.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Audit Log Get Attached -menuTitle: Audit Log Get Attached -weight: 4 ---- -## oasisctl auditlog get attached - -Audit get attached resources - -``` -oasisctl auditlog get attached [flags] -``` - -## Options -``` - -h, --help help for attached -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog get](auditlog-get.md) - Audit log get resources -* [oasisctl auditlog get attached project](auditlog-get-attached-project.md) - Get an attached log to a project - diff --git a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get.md b/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get.md deleted file mode 100644 index d3b170c666..0000000000 --- a/site/content/3.12/arangograph/oasisctl/auditlog/auditlog-get.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Audit Log Get -menuTitle: Audit Log Get -weight: 3 ---- -## oasisctl auditlog get - -Audit log get resources - -``` -oasisctl auditlog get [flags] -``` - -## Options -``` - -h, --help help for get -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources -* [oasisctl auditlog get attached](auditlog-get-attached.md) - Audit get attached resources - diff --git a/site/content/3.12/arangograph/oasisctl/backup/_index.md b/site/content/3.12/arangograph/oasisctl/backup/_index.md deleted file mode 100644 index 2a19e74e37..0000000000 --- a/site/content/3.12/arangograph/oasisctl/backup/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Backup -menuTitle: Backup -weight: 5 ---- -## oasisctl backup - -Backup commands - -``` -oasisctl backup [flags] -``` - -## Options -``` - -h, --help help for backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl backup copy](backup-copy.md) - Copy a backup from source backup to given region -* [oasisctl backup download](backup-download.md) - Download a backup - diff --git a/site/content/3.12/arangograph/oasisctl/backup/backup-copy.md b/site/content/3.12/arangograph/oasisctl/backup/backup-copy.md deleted file mode 100644 index b492b5d92b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/backup/backup-copy.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Backup Copy -menuTitle: Backup Copy -weight: 1 ---- -## oasisctl backup copy - -Copy a backup from source backup to given region - -``` -oasisctl backup copy [flags] -``` - -## Options -``` - -h, --help help for copy - --region-id string Identifier of the region where the new backup is to be created - --source-backup-id string Identifier of the source backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl backup](_index.md) - Backup commands - diff --git a/site/content/3.12/arangograph/oasisctl/backup/backup-download.md b/site/content/3.12/arangograph/oasisctl/backup/backup-download.md deleted file mode 100644 index b458b57b48..0000000000 --- a/site/content/3.12/arangograph/oasisctl/backup/backup-download.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Backup Download -menuTitle: Backup Download -weight: 2 ---- -## oasisctl backup download - -Download a backup - -## Synopsis -Download a backup from the cloud storage to the local deployment disks, so it can be restored. - -``` -oasisctl backup download [flags] -``` - -## Options -``` - -h, --help help for download - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl backup](_index.md) - Backup commands - diff --git a/site/content/3.12/arangograph/oasisctl/clone/_index.md b/site/content/3.12/arangograph/oasisctl/clone/_index.md deleted file mode 100644 index 7edaf4178e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/clone/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Clone -menuTitle: Clone -weight: 6 ---- -## oasisctl clone - -Clone resources - -``` -oasisctl clone [flags] -``` - -## Options -``` - -h, --help help for clone -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl clone deployment](clone-deployment.md) - Clone deployment resources - diff --git a/site/content/3.12/arangograph/oasisctl/clone/clone-deployment-backup.md b/site/content/3.12/arangograph/oasisctl/clone/clone-deployment-backup.md deleted file mode 100644 index 5f98d22b91..0000000000 --- a/site/content/3.12/arangograph/oasisctl/clone/clone-deployment-backup.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Clone Deployment Backup -menuTitle: Clone Deployment Backup -weight: 2 ---- -## oasisctl clone deployment backup - -Clone a deployment from a backup. - -``` -oasisctl clone deployment backup [flags] -``` - -## Options -``` - --accept Accept the current terms and conditions. - -b, --backup-id string Clone a deployment from a backup using the backup's ID. - -h, --help help for backup - -o, --organization-id string Identifier of the organization to create the clone in - -p, --project-id string An optional identifier of the project to create the clone in - -r, --region-id string An optionally defined region in which the new deployment should be created in. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl clone deployment](clone-deployment.md) - Clone deployment resources - diff --git a/site/content/3.12/arangograph/oasisctl/clone/clone-deployment.md b/site/content/3.12/arangograph/oasisctl/clone/clone-deployment.md deleted file mode 100644 index 0b76d1fec8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/clone/clone-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Clone Deployment -menuTitle: Clone Deployment -weight: 1 ---- -## oasisctl clone deployment - -Clone deployment resources - -``` -oasisctl clone deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl clone](_index.md) - Clone resources -* [oasisctl clone deployment backup](clone-deployment-backup.md) - Clone a deployment from a backup. - diff --git a/site/content/3.12/arangograph/oasisctl/completion.md b/site/content/3.12/arangograph/oasisctl/completion.md deleted file mode 100644 index 9cd58cd4f6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/completion.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Oasisctl Completion -menuTitle: Completion -weight: 7 ---- -## oasisctl completion - -Generates bash completion scripts - -## Synopsis -To load completion run - - . <(oasisctl completion [bash|fish|powershell|zsh]) - -To configure your bash shell to load completions for each session add to your bashrc - - # ~/.bashrc or ~/.profile - . <(oasisctl completion bash) - - -``` -oasisctl completion [flags] -``` - -## Options -``` - -h, --help help for completion -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/create/_index.md b/site/content/3.12/arangograph/oasisctl/create/_index.md deleted file mode 100644 index 87ef865918..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/_index.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Oasisctl Create -menuTitle: Create -weight: 8 ---- -## oasisctl create - -Create resources - -``` -oasisctl create [flags] -``` - -## Options -``` - -h, --help help for create -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl create apikey](create-apikey.md) - Create a new API key -* [oasisctl create auditlog](create-auditlog.md) - Create an auditlog -* [oasisctl create backup](create-backup.md) - Create backup ... -* [oasisctl create cacertificate](create-cacertificate.md) - Create a new CA certificate -* [oasisctl create deployment](create-deployment.md) - Create a new deployment -* [oasisctl create example](create-example.md) - Create example ... -* [oasisctl create group](create-group.md) - Create a new group -* [oasisctl create ipallowlist](create-ipallowlist.md) - Create a new IP allowlist -* [oasisctl create metrics](create-metrics.md) - Create metrics resources -* [oasisctl create notebook](create-notebook.md) - Create a new notebook -* [oasisctl create organization](create-organization.md) - Create a new organization -* [oasisctl create private](create-private.md) - Create private resources -* [oasisctl create project](create-project.md) - Create a new project -* [oasisctl create role](create-role.md) - Create a new role - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-apikey.md b/site/content/3.12/arangograph/oasisctl/create/create-apikey.md deleted file mode 100644 index 1177d5cc67..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-apikey.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Create API Key -menuTitle: Create API Key -weight: 1 ---- -## oasisctl create apikey - -Create a new API key - -``` -oasisctl create apikey [flags] -``` - -## Options -``` - -h, --help help for apikey - -o, --organization-id string If set, the newly created API key will grant access to this organization only - --readonly If set, the newly created API key will grant readonly access only -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-auditlog.md b/site/content/3.12/arangograph/oasisctl/create/create-auditlog.md deleted file mode 100644 index 5863da66e8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Audit Log -menuTitle: Create Audit Log -weight: 2 ---- -## oasisctl create auditlog - -Create an auditlog - -``` -oasisctl create auditlog [flags] -``` - -## Options -``` - --default If set, this AuditLog is the default for the organization. - --description string Description of the audit log. - -h, --help help for auditlog - --name string Name of the audit log. - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-backup-policy.md b/site/content/3.12/arangograph/oasisctl/create/create-backup-policy.md deleted file mode 100644 index 99f899b951..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-backup-policy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Oasisctl Create Backup Policy -menuTitle: Create Backup Policy -weight: 4 ---- -## oasisctl create backup policy - -Create a new backup policy - -``` -oasisctl create backup policy [flags] -``` - -## Options -``` - --additional-region-ids strings Add backup to the specified addition regions - --day-of-the-month int32 Run the backup on the specified day of the month (1-31) (default 1) - --deployment-id string ID of the deployment - --description string Description of the backup policy - --email-notification string Email notification setting (Never|FailureOnly|Always) - --every-interval-hours int32 Schedule should run with an interval of the specified hours (1-23) - --friday If set, a backup will be created on Fridays. - -h, --help help for policy - --hours int32 Hours part of the time of day (0-23) - --minutes int32 Minutes part of the time of day (0-59) - --minutes-offset int32 Schedule should run with specific minutes offset (0-59) - --monday If set, a backup will be created on Mondays - --name string Name of the deployment - --paused The policy is paused - --retention-period int Backups created by this policy will be automatically deleted after the specified retention period. A value of 0 means that backup will never be deleted. - --saturday If set, a backup will be created on Saturdays - --schedule-type string Schedule of the policy (Hourly|Daily|Monthly) - --sunday If set, a backup will be created on Sundays - --thursday If set, a backup will be created on Thursdays - --time-zone string The time-zone this time of day applies to (empty means UTC). Names MUST be exactly as defined in RFC-822. (default "UTC") - --tuesday If set, a backup will be created on Tuesdays - --upload The backup should be uploaded - --wednesday If set, a backup will be created on Wednesdays -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create backup](create-backup.md) - Create backup ... - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-backup.md b/site/content/3.12/arangograph/oasisctl/create/create-backup.md deleted file mode 100644 index 8ca544206c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-backup.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create Backup -menuTitle: Create Backup -weight: 3 ---- -## oasisctl create backup - -Create backup ... - -``` -oasisctl create backup [flags] -``` - -## Options -``` - --auto-deleted-at int Time (h) until auto delete of the backup - --deployment-id string ID of the deployment - --description string Description of the backup - -h, --help help for backup - --name string Name of the deployment - --upload The backup should be uploaded -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create backup policy](create-backup-policy.md) - Create a new backup policy - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-cacertificate.md b/site/content/3.12/arangograph/oasisctl/create/create-cacertificate.md deleted file mode 100644 index b27b6e7db8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-cacertificate.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Create CA Certificate -menuTitle: Create CA Certificate -weight: 5 ---- -## oasisctl create cacertificate - -Create a new CA certificate - -``` -oasisctl create cacertificate [flags] -``` - -## Options -``` - --description string Description of the CA certificate - -h, --help help for cacertificate - --lifetime duration Lifetime of the CA certificate. - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization to create the CA certificate in - -p, --project-id string Identifier of the project to create the CA certificate in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-deployment.md b/site/content/3.12/arangograph/oasisctl/create/create-deployment.md deleted file mode 100644 index c9f633fd99..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-deployment.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Oasisctl Create Deployment -menuTitle: Create Deployment -weight: 6 ---- -## oasisctl create deployment - -Create a new deployment - -``` -oasisctl create deployment [flags] -``` - -## Options -``` - --accept Accept the current terms and conditions. - -c, --cacertificate-id string Identifier of the CA certificate to use for the deployment - --coordinator-memory-size int32 Set memory size of Coordinators for flexible deployments (GiB) (default 4) - --coordinators int32 Set number of Coordinators for flexible deployments (default 3) - --custom-image string Set a custom image to use for the deployment. Only available for selected customers. - --dbserver-disk-size int32 Set disk size of DB-Servers for flexible deployments (GiB) (default 32) - --dbserver-memory-size int32 Set memory size of DB-Servers for flexible deployments (GiB) (default 4) - --dbservers int32 Set number of DB-Servers for flexible deployments (default 3) - --deployment-profile-id string Set the Deployment Profile to use for this deployment. - --description string Description of the deployment - --disable-foxx-authentication Disable authentication of requests to Foxx application. - --disk-performance-id string Set the disk performance to use for this deployment. - --drop-vst-support Drop VST protocol support to improve resilience. - -h, --help help for deployment - -i, --ipallowlist-id string Identifier of the IP allowlist to use for the deployment - --is-platform-authentication-enabled Enable platform authentication for deployment. - --max-node-disk-size int32 Set maximum disk size for nodes for autoscaler (GiB) - --model string Set model of the deployment (default "oneshard") - --name string Name of the deployment - --node-count int32 Set the number of desired nodes (default 3) - --node-disk-size int32 Set disk size for nodes (GiB) - --node-size-id string Set the node size to use for this deployment - --notification-email-address strings Set email address(-es) that will be used for notifications related to this deployment. - -o, --organization-id string Identifier of the organization to create the deployment in - -p, --project-id string Identifier of the project to create the deployment in - -r, --region-id string Identifier of the region to create the deployment in - --version string Version of ArangoDB to use for the deployment (default "default") -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-example-installation.md b/site/content/3.12/arangograph/oasisctl/create/create-example-installation.md deleted file mode 100644 index 121d13dccd..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Example Installation -menuTitle: Create Example Installation -weight: 8 ---- -## oasisctl create example installation - -Create a new example dataset installation - -``` -oasisctl create example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -e, --example-dataset-id string ID of the example dataset - -h, --help help for installation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create example](create-example.md) - Create example ... - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-example.md b/site/content/3.12/arangograph/oasisctl/create/create-example.md deleted file mode 100644 index 5b1a50cf0e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Example -menuTitle: Create Example -weight: 7 ---- -## oasisctl create example - -Create example ... - -``` -oasisctl create example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create example installation](create-example-installation.md) - Create a new example dataset installation - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-group.md b/site/content/3.12/arangograph/oasisctl/create/create-group.md deleted file mode 100644 index d28e7ec7d2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-group.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Group -menuTitle: Create Group -weight: 9 ---- -## oasisctl create group - -Create a new group - -``` -oasisctl create group [flags] -``` - -## Options -``` - --description string Description of the group - -h, --help help for group - --name string Name of the group - -o, --organization-id string Identifier of the organization to create the group in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-ipallowlist.md b/site/content/3.12/arangograph/oasisctl/create/create-ipallowlist.md deleted file mode 100644 index 07f4308515..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-ipallowlist.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create IP Allowlist -menuTitle: Create IP Allowlist -weight: 10 ---- -## oasisctl create ipallowlist - -Create a new IP allowlist - -``` -oasisctl create ipallowlist [flags] -``` - -## Options -``` - --cidr-range strings List of CIDR ranges from which deployments are accessible - --description string Description of the IP allowlist - -h, --help help for ipallowlist - --name string Name of the IP allowlist - -o, --organization-id string Identifier of the organization to create the IP allowlist in - -p, --project-id string Identifier of the project to create the IP allowlist in - --remote-inspection-allowed If set, remote connectivity checks by the Oasis platform are allowed -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-metrics-token.md b/site/content/3.12/arangograph/oasisctl/create/create-metrics-token.md deleted file mode 100644 index a5e0e9a9dd..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-metrics-token.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create Metrics Token -menuTitle: Create Metrics Token -weight: 12 ---- -## oasisctl create metrics token - -Create a new metrics access token - -``` -oasisctl create metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to create the token for - --description string Description of the token - -h, --help help for token - --lifetime duration Lifetime of the token. - --name string Name of the token - -o, --organization-id string Identifier of the organization to create the token in - -p, --project-id string Identifier of the project to create the token in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create metrics](create-metrics.md) - Create metrics resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-metrics.md b/site/content/3.12/arangograph/oasisctl/create/create-metrics.md deleted file mode 100644 index d504981b04..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Metrics -menuTitle: Create Metrics -weight: 11 ---- -## oasisctl create metrics - -Create metrics resources - -``` -oasisctl create metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create metrics token](create-metrics-token.md) - Create a new metrics access token - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-notebook.md b/site/content/3.12/arangograph/oasisctl/create/create-notebook.md deleted file mode 100644 index 8e1f2dcd53..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-notebook.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Create Notebook -menuTitle: Create Notebook -weight: 13 ---- -## oasisctl create notebook - -Create a new notebook - -``` -oasisctl create notebook [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebook has to run next to - --description string Description of the notebook - -s, --disk-size int32 Disk size in GiB that has to be attached to given notebook - -h, --help help for notebook - -n, --name string Name of the notebook - -m, --notebook-model string Identifier of the notebook model that the notebook has to use - -o, --organization-id string Identifier of the organization to create the notebook in - -p, --project-id string Identifier of the project to create the notebook in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-organization-invite.md b/site/content/3.12/arangograph/oasisctl/create/create-organization-invite.md deleted file mode 100644 index 3fbe04a1fe..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Create Organization Invite -menuTitle: Create Organization Invite -weight: 15 ---- -## oasisctl create organization invite - -Create a new invite to an organization - -``` -oasisctl create organization invite [flags] -``` - -## Options -``` - --email string Email address of the person to invite - -h, --help help for invite - -o, --organization-id string Identifier of the organization to create the invite in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create organization](create-organization.md) - Create a new organization - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-organization.md b/site/content/3.12/arangograph/oasisctl/create/create-organization.md deleted file mode 100644 index 8ca1b9065b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-organization.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Organization -menuTitle: Create Organization -weight: 14 ---- -## oasisctl create organization - -Create a new organization - -``` -oasisctl create organization [flags] -``` - -## Options -``` - --description string Description of the organization - -h, --help help for organization - --name string Name of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create organization invite](create-organization-invite.md) - Create a new invite to an organization - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-private-endpoint-service.md b/site/content/3.12/arangograph/oasisctl/create/create-private-endpoint-service.md deleted file mode 100644 index 01999a99ce..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-private-endpoint-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Oasisctl Create Private Endpoint Service -menuTitle: Create Private Endpoint Service -weight: 18 ---- -## oasisctl create private endpoint service - -Create a Private Endpoint Service attached to an existing deployment - -``` -oasisctl create private endpoint service [flags] -``` - -## Options -``` - --alternate-dns-name strings DNS names used for the deployment in the private network - --aws-principal strings List of AWS Principals from which a Private Endpoint can be created (Format: <AccountID>[/Role/<RoleName>|/User/<UserName>]) - --azure-client-subscription-id strings List of Azure subscription IDs from which a Private Endpoint can be created - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - --description string Description of the private endpoint service - --enable-private-dns Enable private DNS for the deployment (applicable for AWS and GKE only) - --gcp-project strings List of GCP projects from which a Private Endpoint can be created - -h, --help help for service - --name string Name of the private endpoint service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create private endpoint](create-private-endpoint.md) - - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-private-endpoint.md b/site/content/3.12/arangograph/oasisctl/create/create-private-endpoint.md deleted file mode 100644 index cac7dbfcb7..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Private Endpoint -menuTitle: Create Private Endpoint -weight: 17 ---- -## oasisctl create private endpoint - - - -``` -oasisctl create private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create private](create-private.md) - Create private resources -* [oasisctl create private endpoint service](create-private-endpoint-service.md) - Create a Private Endpoint Service attached to an existing deployment - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-private.md b/site/content/3.12/arangograph/oasisctl/create/create-private.md deleted file mode 100644 index 3cb40e735b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Private -menuTitle: Create Private -weight: 16 ---- -## oasisctl create private - -Create private resources - -``` -oasisctl create private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create private endpoint](create-private-endpoint.md) - - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-project.md b/site/content/3.12/arangograph/oasisctl/create/create-project.md deleted file mode 100644 index 59d997efb7..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-project.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Project -menuTitle: Create Project -weight: 19 ---- -## oasisctl create project - -Create a new project - -``` -oasisctl create project [flags] -``` - -## Options -``` - --description string Description of the project - -h, --help help for project - --name string Name of the project - -o, --organization-id string Identifier of the organization to create the project in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/create/create-role.md b/site/content/3.12/arangograph/oasisctl/create/create-role.md deleted file mode 100644 index 52cec0a672..0000000000 --- a/site/content/3.12/arangograph/oasisctl/create/create-role.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Role -menuTitle: Create Role -weight: 20 ---- -## oasisctl create role - -Create a new role - -``` -oasisctl create role [flags] -``` - -## Options -``` - --description string Description of the role - -h, --help help for role - --name string Name of the role - -o, --organization-id string Identifier of the organization to create the role in - -p, --permission strings Permissions granted by the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/_index.md b/site/content/3.12/arangograph/oasisctl/delete/_index.md deleted file mode 100644 index 75b76a80b6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/_index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Oasisctl Delete -menuTitle: Delete -weight: 9 ---- -## oasisctl delete - -Delete resources - -``` -oasisctl delete [flags] -``` - -## Options -``` - -h, --help help for delete -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl delete apikey](delete-apikey.md) - Delete an API key with given identifier -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog -* [oasisctl delete backup](delete-backup.md) - Delete a backup for a given ID. -* [oasisctl delete cacertificate](delete-cacertificate.md) - Delete a CA certificate the authenticated user has access to -* [oasisctl delete deployment](delete-deployment.md) - Delete a deployment the authenticated user has access to -* [oasisctl delete example](delete-example.md) - Delete example ... -* [oasisctl delete group](delete-group.md) - Delete a group the authenticated user has access to -* [oasisctl delete ipallowlist](delete-ipallowlist.md) - Delete an IP allowlist the authenticated user has access to -* [oasisctl delete metrics](delete-metrics.md) - Delete metrics resources -* [oasisctl delete notebook](delete-notebook.md) - Delete a notebook -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to -* [oasisctl delete project](delete-project.md) - Delete a project the authenticated user has access to -* [oasisctl delete role](delete-role.md) - Delete a role the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-apikey.md b/site/content/3.12/arangograph/oasisctl/delete/delete-apikey.md deleted file mode 100644 index d18236eac3..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-apikey.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete API Key -menuTitle: Delete API Key -weight: 1 ---- -## oasisctl delete apikey - -Delete an API key with given identifier - -``` -oasisctl delete apikey [flags] -``` - -## Options -``` - -i, --apikey-id string Identifier of the API key to delete - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive-events.md b/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive-events.md deleted file mode 100644 index d337652b7b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive-events.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Archive Events -menuTitle: Delete Audit Log Archive Events -weight: 4 ---- -## oasisctl delete auditlog archive events - -Delete auditlog archive events - -``` -oasisctl delete auditlog archive events [flags] -``` - -## Options -``` - -i, --auditlog-archive-id string Identifier of the auditlog archive to delete events from. - -h, --help help for events - --to string Remove events created before this timestamp. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog archive](delete-auditlog-archive.md) - Delete an auditlog archive - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive.md b/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive.md deleted file mode 100644 index 59153bfbdd..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-archive.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Archive -menuTitle: Delete Audit Log Archive -weight: 3 ---- -## oasisctl delete auditlog archive - -Delete an auditlog archive - -``` -oasisctl delete auditlog archive [flags] -``` - -## Options -``` - -i, --auditlog-archive-id string Identifier of the auditlog archive to delete. - -h, --help help for archive -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog -* [oasisctl delete auditlog archive events](delete-auditlog-archive-events.md) - Delete auditlog archive events - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-destination.md b/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-destination.md deleted file mode 100644 index 6dcb135925..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog-destination.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Destination -menuTitle: Delete Audit Log Destination -weight: 5 ---- -## oasisctl delete auditlog destination - -Delete a destination from an auditlog - -``` -oasisctl delete auditlog destination [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to delete. - -h, --help help for destination - --index int Index of the destination to remove. Only one delete option can be specified. (default -1) - -o, --organization-id string Identifier of the organization. - --type string Type of the destination to remove. This will remove ALL destinations with that type. - --url string An optional URL which will be used to delete a single destination instead of all. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog.md b/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog.md deleted file mode 100644 index 6895de151f..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Audit Log -menuTitle: Delete Audit Log -weight: 2 ---- -## oasisctl delete auditlog - -Delete an auditlog - -``` -oasisctl delete auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to delete. - -h, --help help for auditlog - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete auditlog archive](delete-auditlog-archive.md) - Delete an auditlog archive -* [oasisctl delete auditlog destination](delete-auditlog-destination.md) - Delete a destination from an auditlog - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-backup-policy.md b/site/content/3.12/arangograph/oasisctl/delete/delete-backup-policy.md deleted file mode 100644 index 99e8ac2deb..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-backup-policy.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Backup Policy -menuTitle: Delete Backup Policy -weight: 7 ---- -## oasisctl delete backup policy - -Delete a backup policy for a given ID. - -``` -oasisctl delete backup policy [flags] -``` - -## Options -``` - -h, --help help for policy - -i, --id string Identifier of the backup policy - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete backup](delete-backup.md) - Delete a backup for a given ID. - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-backup.md b/site/content/3.12/arangograph/oasisctl/delete/delete-backup.md deleted file mode 100644 index cf116f93a1..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-backup.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Backup -menuTitle: Delete Backup -weight: 6 ---- -## oasisctl delete backup - -Delete a backup for a given ID. - -``` -oasisctl delete backup [flags] -``` - -## Options -``` - -h, --help help for backup - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete backup policy](delete-backup-policy.md) - Delete a backup policy for a given ID. - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-cacertificate.md b/site/content/3.12/arangograph/oasisctl/delete/delete-cacertificate.md deleted file mode 100644 index aad85c751b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete CA Certificate -menuTitle: Delete CA Certificate -weight: 8 ---- -## oasisctl delete cacertificate - -Delete a CA certificate the authenticated user has access to - -``` -oasisctl delete cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-deployment.md b/site/content/3.12/arangograph/oasisctl/delete/delete-deployment.md deleted file mode 100644 index 15450ecb9b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Deployment -menuTitle: Delete Deployment -weight: 9 ---- -## oasisctl delete deployment - -Delete a deployment the authenticated user has access to - -``` -oasisctl delete deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-example-installation.md b/site/content/3.12/arangograph/oasisctl/delete/delete-example-installation.md deleted file mode 100644 index 569152227e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Example Installation -menuTitle: Delete Example Installation -weight: 11 ---- -## oasisctl delete example installation - -Delete an example datasets installation - -``` -oasisctl delete example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installation - --installation-id string The ID of the installation to delete. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete example](delete-example.md) - Delete example ... - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-example.md b/site/content/3.12/arangograph/oasisctl/delete/delete-example.md deleted file mode 100644 index 9518b2d7d1..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Example -menuTitle: Delete Example -weight: 10 ---- -## oasisctl delete example - -Delete example ... - -``` -oasisctl delete example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete example installation](delete-example-installation.md) - Delete an example datasets installation - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-group-members.md b/site/content/3.12/arangograph/oasisctl/delete/delete-group-members.md deleted file mode 100644 index ae6dc82a96..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-group-members.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Group Members -menuTitle: Delete Group Members -weight: 13 ---- -## oasisctl delete group members - -Delete members from group - -``` -oasisctl delete group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group to delete members from - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete group](delete-group.md) - Delete a group the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-group.md b/site/content/3.12/arangograph/oasisctl/delete/delete-group.md deleted file mode 100644 index 4f6fe7d91c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-group.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Group -menuTitle: Delete Group -weight: 12 ---- -## oasisctl delete group - -Delete a group the authenticated user has access to - -``` -oasisctl delete group [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete group members](delete-group-members.md) - Delete members from group - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-ipallowlist.md b/site/content/3.12/arangograph/oasisctl/delete/delete-ipallowlist.md deleted file mode 100644 index 1806667457..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete IP Allowlist -menuTitle: Delete IP Allowlist -weight: 14 ---- -## oasisctl delete ipallowlist - -Delete an IP allowlist the authenticated user has access to - -``` -oasisctl delete ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-metrics-token.md b/site/content/3.12/arangograph/oasisctl/delete/delete-metrics-token.md deleted file mode 100644 index c18927e996..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Metrics Token -menuTitle: Delete Metrics Token -weight: 16 ---- -## oasisctl delete metrics token - -Delete a metrics token for a deployment - -``` -oasisctl delete metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete metrics](delete-metrics.md) - Delete metrics resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-metrics.md b/site/content/3.12/arangograph/oasisctl/delete/delete-metrics.md deleted file mode 100644 index 36052afbce..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Metrics -menuTitle: Delete Metrics -weight: 15 ---- -## oasisctl delete metrics - -Delete metrics resources - -``` -oasisctl delete metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete metrics token](delete-metrics-token.md) - Delete a metrics token for a deployment - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-notebook.md b/site/content/3.12/arangograph/oasisctl/delete/delete-notebook.md deleted file mode 100644 index 3992653923..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Notebook -menuTitle: Delete Notebook -weight: 17 ---- -## oasisctl delete notebook - -Delete a notebook - -``` -oasisctl delete notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-organization-invite.md b/site/content/3.12/arangograph/oasisctl/delete/delete-organization-invite.md deleted file mode 100644 index dae7596f39..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Organization Invite -menuTitle: Delete Organization Invite -weight: 19 ---- -## oasisctl delete organization invite - -Delete an organization invite the authenticated user has access to - -``` -oasisctl delete organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-organization-members.md b/site/content/3.12/arangograph/oasisctl/delete/delete-organization-members.md deleted file mode 100644 index c3d4151366..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-organization-members.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Organization Members -menuTitle: Delete Organization Members -weight: 20 ---- -## oasisctl delete organization members - -Delete members from organization - -``` -oasisctl delete organization members [flags] -``` - -## Options -``` - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-organization.md b/site/content/3.12/arangograph/oasisctl/delete/delete-organization.md deleted file mode 100644 index 362056323c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-organization.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Organization -menuTitle: Delete Organization -weight: 18 ---- -## oasisctl delete organization - -Delete an organization the authenticated user has access to - -``` -oasisctl delete organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete organization invite](delete-organization-invite.md) - Delete an organization invite the authenticated user has access to -* [oasisctl delete organization members](delete-organization-members.md) - Delete members from organization - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-project.md b/site/content/3.12/arangograph/oasisctl/delete/delete-project.md deleted file mode 100644 index 9b45160be9..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Project -menuTitle: Delete Project -weight: 21 ---- -## oasisctl delete project - -Delete a project the authenticated user has access to - -``` -oasisctl delete project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/delete/delete-role.md b/site/content/3.12/arangograph/oasisctl/delete/delete-role.md deleted file mode 100644 index c8bcbb67f2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/delete/delete-role.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Role -menuTitle: Delete Role -weight: 22 ---- -## oasisctl delete role - -Delete a role the authenticated user has access to - -``` -oasisctl delete role [flags] -``` - -## Options -``` - -h, --help help for role - -o, --organization-id string Identifier of the organization - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.12/arangograph/oasisctl/disable/_index.md b/site/content/3.12/arangograph/oasisctl/disable/_index.md deleted file mode 100644 index 916ad96f01..0000000000 --- a/site/content/3.12/arangograph/oasisctl/disable/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Disable -menuTitle: Disable -weight: 10 ---- -## oasisctl disable - -Disable some settings related to deployment - -``` -oasisctl disable [flags] -``` - -## Options -``` - -h, --help help for disable -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl disable scheduled-root-password-rotation](disable-scheduled-root-password-rotation.md) - Disable scheduled root password rotation - diff --git a/site/content/3.12/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md b/site/content/3.12/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md deleted file mode 100644 index 52ac637431..0000000000 --- a/site/content/3.12/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Disable Scheduled-Root-Password-Rotation -menuTitle: Disable Scheduled-Root-Password-Rotation -weight: 1 ---- -## oasisctl disable scheduled-root-password-rotation - -Disable scheduled root password rotation - -``` -oasisctl disable scheduled-root-password-rotation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for scheduled-root-password-rotation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl disable](_index.md) - Disable some settings related to deployment - diff --git a/site/content/3.12/arangograph/oasisctl/enable/_index.md b/site/content/3.12/arangograph/oasisctl/enable/_index.md deleted file mode 100644 index 61a3b03d10..0000000000 --- a/site/content/3.12/arangograph/oasisctl/enable/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Enable -menuTitle: Enable -weight: 11 ---- -## oasisctl enable - -Enable some settings related to deployment - -``` -oasisctl enable [flags] -``` - -## Options -``` - -h, --help help for enable -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl enable scheduled-root-password-rotation](enable-scheduled-root-password-rotation.md) - Enable scheduled root password rotation - diff --git a/site/content/3.12/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md b/site/content/3.12/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md deleted file mode 100644 index 8628abc79c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Enable Scheduled-Root-Password-Rotation -menuTitle: Enable Scheduled-Root-Password-Rotation -weight: 1 ---- -## oasisctl enable scheduled-root-password-rotation - -Enable scheduled root password rotation - -``` -oasisctl enable scheduled-root-password-rotation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for scheduled-root-password-rotation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl enable](_index.md) - Enable some settings related to deployment - diff --git a/site/content/3.12/arangograph/oasisctl/generate-docs.md b/site/content/3.12/arangograph/oasisctl/generate-docs.md deleted file mode 100644 index f1d83f8437..0000000000 --- a/site/content/3.12/arangograph/oasisctl/generate-docs.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Generate Documentation -menuTitle: Generate Documentation -weight: 12 ---- -## oasisctl generate-docs - -Generate output - -``` -oasisctl generate-docs [flags] -``` - -## Options -``` - -h, --help help for generate-docs - -l, --link-file-ext string What file extensions the links should point to - -o, --output-dir string Output directory (default "./docs") - -r, --replace-underscore-with string Replace the underscore in links with the given character -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/get/_index.md b/site/content/3.12/arangograph/oasisctl/get/_index.md deleted file mode 100644 index 20021e7831..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/_index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Oasisctl Get -menuTitle: Get -weight: 13 ---- -## oasisctl get - -Get information - -``` -oasisctl get [flags] -``` - -## Options -``` - -h, --help help for get -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive -* [oasisctl get backup](get-backup.md) - Get a backup -* [oasisctl get cacertificate](get-cacertificate.md) - Get a CA certificate the authenticated user has access to -* [oasisctl get deployment](get-deployment.md) - Get a deployment the authenticated user has access to -* [oasisctl get example](get-example.md) - Get a single example dataset -* [oasisctl get group](get-group.md) - Get a group the authenticated user has access to -* [oasisctl get ipallowlist](get-ipallowlist.md) - Get an IP allowlist the authenticated user has access to -* [oasisctl get metrics](get-metrics.md) - Get metrics information -* [oasisctl get notebook](get-notebook.md) - Get a notebook -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get policy](get-policy.md) - Get a policy the authenticated user has access to -* [oasisctl get private](get-private.md) - Get private information -* [oasisctl get project](get-project.md) - Get a project the authenticated user has access to -* [oasisctl get provider](get-provider.md) - Get a provider the authenticated user has access to -* [oasisctl get region](get-region.md) - Get a region the authenticated user has access to -* [oasisctl get role](get-role.md) - Get a role the authenticated user has access to -* [oasisctl get self](get-self.md) - Get information about the authenticated user -* [oasisctl get server](get-server.md) - Get server information -* [oasisctl get tandc](get-tandc.md) - Get current terms and conditions or get one by ID - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-auditlog-archive.md b/site/content/3.12/arangograph/oasisctl/get/get-auditlog-archive.md deleted file mode 100644 index 546b9a55c4..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-auditlog-archive.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Audit Log Archive -menuTitle: Get Audit Log Archive -weight: 2 ---- -## oasisctl get auditlog archive - -Get auditlog archive - -``` -oasisctl get auditlog archive [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for archive -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-auditlog-events.md b/site/content/3.12/arangograph/oasisctl/get/get-auditlog-events.md deleted file mode 100644 index 44c9088765..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-auditlog-events.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Get Audit Log Events -menuTitle: Get Audit Log Events -weight: 3 ---- -## oasisctl get auditlog events - -Get auditlog events - -``` -oasisctl get auditlog events [flags] -``` - -## Options -``` - --auditlog-archive-id string If set, include only events from this AuditLogArchive - -i, --auditlog-id string Identifier of the auditlog - --excluded-topics strings If non-empty, leave out events with one of these topics. This takes priority over included - --from string Request events created at or after this timestamp - -h, --help help for events - --included-topics strings If non-empty, only request events with one of these topics - --limit int Limit the number of audit log events. Defaults to 0, meaning no limit - --to string Request events created before this timestamp -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-auditlog.md b/site/content/3.12/arangograph/oasisctl/get/get-auditlog.md deleted file mode 100644 index 025710b835..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Audit Log -menuTitle: Get Audit Log -weight: 1 ---- -## oasisctl get auditlog - -Get auditlog archive - -``` -oasisctl get auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for auditlog - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get auditlog archive](get-auditlog-archive.md) - Get auditlog archive -* [oasisctl get auditlog events](get-auditlog-events.md) - Get auditlog events - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-backup-policy.md b/site/content/3.12/arangograph/oasisctl/get/get-backup-policy.md deleted file mode 100644 index 916ad22e61..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-backup-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Backup Policy -menuTitle: Get Backup Policy -weight: 5 ---- -## oasisctl get backup policy - -Get an existing backup policy - -``` -oasisctl get backup policy [flags] -``` - -## Options -``` - -h, --help help for policy - -i, --id string Identifier of the backup policy (Id|Name|Url) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get backup](get-backup.md) - Get a backup - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-backup.md b/site/content/3.12/arangograph/oasisctl/get/get-backup.md deleted file mode 100644 index 2792a98b02..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-backup.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Backup -menuTitle: Get Backup -weight: 4 ---- -## oasisctl get backup - -Get a backup - -``` -oasisctl get backup [flags] -``` - -## Options -``` - -h, --help help for backup - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get backup policy](get-backup-policy.md) - Get an existing backup policy - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-cacertificate.md b/site/content/3.12/arangograph/oasisctl/get/get-cacertificate.md deleted file mode 100644 index 0be6d11e44..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get CA Certificate -menuTitle: Get CA Certificate -weight: 6 ---- -## oasisctl get cacertificate - -Get a CA certificate the authenticated user has access to - -``` -oasisctl get cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-deployment.md b/site/content/3.12/arangograph/oasisctl/get/get-deployment.md deleted file mode 100644 index ab8d86e3d3..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Deployment -menuTitle: Get Deployment -weight: 7 ---- -## oasisctl get deployment - -Get a deployment the authenticated user has access to - -``` -oasisctl get deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --show-root-password show the root password of the database -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-example-installation.md b/site/content/3.12/arangograph/oasisctl/get/get-example-installation.md deleted file mode 100644 index 4190e8e288..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Example Installation -menuTitle: Get Example Installation -weight: 9 ---- -## oasisctl get example installation - -Get a single example dataset installation - -``` -oasisctl get example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installation - --installation-id string The ID of the installation to get. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get example](get-example.md) - Get a single example dataset - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-example.md b/site/content/3.12/arangograph/oasisctl/get/get-example.md deleted file mode 100644 index 1238d443ed..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-example.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Example -menuTitle: Get Example -weight: 8 ---- -## oasisctl get example - -Get a single example dataset - -``` -oasisctl get example [flags] -``` - -## Options -``` - -e, --example-dataset-id string ID of the example dataset - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get example installation](get-example-installation.md) - Get a single example dataset installation - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-group.md b/site/content/3.12/arangograph/oasisctl/get/get-group.md deleted file mode 100644 index 9b8e72e16b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-group.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Group -menuTitle: Get Group -weight: 10 ---- -## oasisctl get group - -Get a group the authenticated user has access to - -``` -oasisctl get group [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-ipallowlist.md b/site/content/3.12/arangograph/oasisctl/get/get-ipallowlist.md deleted file mode 100644 index 379c324604..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get IP Allowlist -menuTitle: Get IP Allowlist -weight: 11 ---- -## oasisctl get ipallowlist - -Get an IP allowlist the authenticated user has access to - -``` -oasisctl get ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-metrics-token.md b/site/content/3.12/arangograph/oasisctl/get/get-metrics-token.md deleted file mode 100644 index 6226b02793..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Metrics Token -menuTitle: Get Metrics Token -weight: 13 ---- -## oasisctl get metrics token - -Get a metrics token - -``` -oasisctl get metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get metrics](get-metrics.md) - Get metrics information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-metrics.md b/site/content/3.12/arangograph/oasisctl/get/get-metrics.md deleted file mode 100644 index f2699417aa..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Metrics -menuTitle: Get Metrics -weight: 12 ---- -## oasisctl get metrics - -Get metrics information - -``` -oasisctl get metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get metrics token](get-metrics-token.md) - Get a metrics token - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-notebook.md b/site/content/3.12/arangograph/oasisctl/get/get-notebook.md deleted file mode 100644 index 8526fb293a..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Notebook -menuTitle: Get Notebook -weight: 14 ---- -## oasisctl get notebook - -Get a notebook - -``` -oasisctl get notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization-authentication-providers.md b/site/content/3.12/arangograph/oasisctl/get/get-organization-authentication-providers.md deleted file mode 100644 index da20b01a1a..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization-authentication-providers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Authentication Providers -menuTitle: Get Organization Authentication Providers -weight: 17 ---- -## oasisctl get organization authentication providers - -Get which authentication providers are allowed for accessing a specific organization - -``` -oasisctl get organization authentication providers [flags] -``` - -## Options -``` - -h, --help help for providers - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization authentication](get-organization-authentication.md) - Get authentication specific information for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization-authentication.md b/site/content/3.12/arangograph/oasisctl/get/get-organization-authentication.md deleted file mode 100644 index cd16e2841b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization-authentication.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Authentication -menuTitle: Get Organization Authentication -weight: 16 ---- -## oasisctl get organization authentication - -Get authentication specific information for an organization - -``` -oasisctl get organization authentication [flags] -``` - -## Options -``` - -h, --help help for authentication -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get organization authentication providers](get-organization-authentication-providers.md) - Get which authentication providers are allowed for accessing a specific organization - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md b/site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md deleted file mode 100644 index 400ad06087..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email Domain Restrictions -menuTitle: Get Organization Email Domain Restrictions -weight: 20 ---- -## oasisctl get organization email domain restrictions - -Get which email domain restrictions are placed on accessing a specific organization - -``` -oasisctl get organization email domain restrictions [flags] -``` - -## Options -``` - -h, --help help for restrictions - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization email domain](get-organization-email-domain.md) - Get email domain specific information for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain.md b/site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain.md deleted file mode 100644 index 305097e72f..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization-email-domain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email Domain -menuTitle: Get Organization Email Domain -weight: 19 ---- -## oasisctl get organization email domain - -Get email domain specific information for an organization - -``` -oasisctl get organization email domain [flags] -``` - -## Options -``` - -h, --help help for domain -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization email](get-organization-email.md) - Get email specific information for an organization -* [oasisctl get organization email domain restrictions](get-organization-email-domain-restrictions.md) - Get which email domain restrictions are placed on accessing a specific organization - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization-email.md b/site/content/3.12/arangograph/oasisctl/get/get-organization-email.md deleted file mode 100644 index 5ca941ffcd..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization-email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email -menuTitle: Get Organization Email -weight: 18 ---- -## oasisctl get organization email - -Get email specific information for an organization - -``` -oasisctl get organization email [flags] -``` - -## Options -``` - -h, --help help for email -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get organization email domain](get-organization-email-domain.md) - Get email domain specific information for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization-invite.md b/site/content/3.12/arangograph/oasisctl/get/get-organization-invite.md deleted file mode 100644 index 093ed06c05..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Organization Invite -menuTitle: Get Organization Invite -weight: 21 ---- -## oasisctl get organization invite - -Get an organization invite the authenticated user has access to - -``` -oasisctl get organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-organization.md b/site/content/3.12/arangograph/oasisctl/get/get-organization.md deleted file mode 100644 index b05c6201ab..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-organization.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Organization -menuTitle: Get Organization -weight: 15 ---- -## oasisctl get organization - -Get an organization the authenticated user is a member of - -``` -oasisctl get organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get organization authentication](get-organization-authentication.md) - Get authentication specific information for an organization -* [oasisctl get organization email](get-organization-email.md) - Get email specific information for an organization -* [oasisctl get organization invite](get-organization-invite.md) - Get an organization invite the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-policy.md b/site/content/3.12/arangograph/oasisctl/get/get-policy.md deleted file mode 100644 index 599e5601cb..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Policy -menuTitle: Get Policy -weight: 22 ---- -## oasisctl get policy - -Get a policy the authenticated user has access to - -``` -oasisctl get policy [flags] -``` - -## Options -``` - -h, --help help for policy - -u, --url string URL of the resource to inspect the policy for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-private-endpoint-service.md b/site/content/3.12/arangograph/oasisctl/get/get-private-endpoint-service.md deleted file mode 100644 index a9c56b8b0f..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-private-endpoint-service.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Private Endpoint Service -menuTitle: Get Private Endpoint Service -weight: 25 ---- -## oasisctl get private endpoint service - -Get a Private Endpoint Service the authenticated user has access to - -``` -oasisctl get private endpoint service [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - -h, --help help for service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get private endpoint](get-private-endpoint.md) - - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-private-endpoint.md b/site/content/3.12/arangograph/oasisctl/get/get-private-endpoint.md deleted file mode 100644 index 38afeb2dd8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Private Endpoint -menuTitle: Get Private Endpoint -weight: 24 ---- -## oasisctl get private endpoint - - - -``` -oasisctl get private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get private](get-private.md) - Get private information -* [oasisctl get private endpoint service](get-private-endpoint-service.md) - Get a Private Endpoint Service the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-private.md b/site/content/3.12/arangograph/oasisctl/get/get-private.md deleted file mode 100644 index e84921fd32..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Private -menuTitle: Get Private -weight: 23 ---- -## oasisctl get private - -Get private information - -``` -oasisctl get private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get private endpoint](get-private-endpoint.md) - - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-project.md b/site/content/3.12/arangograph/oasisctl/get/get-project.md deleted file mode 100644 index 5bfb087e53..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Project -menuTitle: Get Project -weight: 26 ---- -## oasisctl get project - -Get a project the authenticated user has access to - -``` -oasisctl get project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-provider.md b/site/content/3.12/arangograph/oasisctl/get/get-provider.md deleted file mode 100644 index da7d632e1b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-provider.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Provider -menuTitle: Get Provider -weight: 27 ---- -## oasisctl get provider - -Get a provider the authenticated user has access to - -``` -oasisctl get provider [flags] -``` - -## Options -``` - -h, --help help for provider - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-region.md b/site/content/3.12/arangograph/oasisctl/get/get-region.md deleted file mode 100644 index 25ca81e867..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-region.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Region -menuTitle: Get Region -weight: 28 ---- -## oasisctl get region - -Get a region the authenticated user has access to - -``` -oasisctl get region [flags] -``` - -## Options -``` - -h, --help help for region - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-role.md b/site/content/3.12/arangograph/oasisctl/get/get-role.md deleted file mode 100644 index 898605e245..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-role.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Role -menuTitle: Get Role -weight: 29 ---- -## oasisctl get role - -Get a role the authenticated user has access to - -``` -oasisctl get role [flags] -``` - -## Options -``` - -h, --help help for role - -o, --organization-id string Identifier of the organization - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-self.md b/site/content/3.12/arangograph/oasisctl/get/get-self.md deleted file mode 100644 index 26d48ad423..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-self.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl Get Self -menuTitle: Get Self -weight: 30 ---- -## oasisctl get self - -Get information about the authenticated user - -``` -oasisctl get self [flags] -``` - -## Options -``` - -h, --help help for self -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-server-status.md b/site/content/3.12/arangograph/oasisctl/get/get-server-status.md deleted file mode 100644 index 302fb17a1d..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-server-status.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Server Status -menuTitle: Get Server Status -weight: 32 ---- -## oasisctl get server status - -Get the status of servers for a deployment - -``` -oasisctl get server status [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for status - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get server](get-server.md) - Get server information - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-server.md b/site/content/3.12/arangograph/oasisctl/get/get-server.md deleted file mode 100644 index ad54b9dfd2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-server.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Server -menuTitle: Get Server -weight: 31 ---- -## oasisctl get server - -Get server information - -``` -oasisctl get server [flags] -``` - -## Options -``` - -h, --help help for server -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get server status](get-server-status.md) - Get the status of servers for a deployment - diff --git a/site/content/3.12/arangograph/oasisctl/get/get-tandc.md b/site/content/3.12/arangograph/oasisctl/get/get-tandc.md deleted file mode 100644 index c33b546252..0000000000 --- a/site/content/3.12/arangograph/oasisctl/get/get-tandc.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Terms & Conditions -menuTitle: Get Terms & Conditions -weight: 33 ---- -## oasisctl get tandc - -Get current terms and conditions or get one by ID - -``` -oasisctl get tandc [flags] -``` - -## Options -``` - -h, --help help for tandc - -o, --organization-id string Identifier of the organization - -t, --terms-and-conditions-id string Identifier of the terms and conditions to accept. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.12/arangograph/oasisctl/import.md b/site/content/3.12/arangograph/oasisctl/import.md deleted file mode 100644 index 385375d640..0000000000 --- a/site/content/3.12/arangograph/oasisctl/import.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Oasisctl Import -menuTitle: Import -weight: 14 ---- -## oasisctl import - -Import data from a local database or from another remote database into an Oasis deployment. - -``` -oasisctl import [flags] -``` - -## Options -``` - -b, --batch-size int The number of documents to write at once. (default 4096) - -d, --destination-deployment-id string Destination deployment id to import data into. It can be provided instead of address, username and password. - --excluded-collection strings A list of collections names which should be excluded. Exclusion takes priority over inclusion. - --excluded-database strings A list of database names which should be excluded. Exclusion takes priority over inclusion. - --excluded-graph strings A list of graph names which should be excluded. Exclusion takes priority over inclusion. - --excluded-view strings A list of view names which should be excluded. Exclusion takes priority over inclusion. - -f, --force Force the copy automatically overwriting everything at destination. - -h, --help help for import - --included-collection strings A list of collection names which should be included. If provided, only these collections will be copied. - --included-database strings A list of database names which should be included. If provided, only these databases will be copied. - --included-graph strings A list of graph names which should be included. If provided, only these graphs will be copied. - --included-view strings A list of view names which should be included. If provided, only these views will be copied. - -r, --max-retries int The number of maximum retries attempts. Increasing this number will also increase the exponential fallback timer. (default 9) - -m, --maximum-parallel-collections int Maximum number of collections being copied in parallel. (default 10) - --no-progress-bar Disable the progress bar but still have partial progress output. - --query-ttl duration Cursor TTL defined as a duration. (default 2h0m0s) - --source-address string Source database address to copy data from. - --source-password string Source database password if required. - --source-username string Source database username if required. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/list/_index.md b/site/content/3.12/arangograph/oasisctl/list/_index.md deleted file mode 100644 index b8a7496441..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/_index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Oasisctl List -menuTitle: List -weight: 15 ---- -## oasisctl list - -List resources - -``` -oasisctl list [flags] -``` - -## Options -``` - -h, --help help for list -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl list apikeys](list-apikeys.md) - List all API keys created for the current user -* [oasisctl list arangodb](list-arangodb.md) - List ArangoDB information -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs -* [oasisctl list auditlogs](list-auditlogs.md) - List auditlogs -* [oasisctl list backup](list-backup.md) - A list command for various backup resources -* [oasisctl list backups](list-backups.md) - List backups -* [oasisctl list cacertificates](list-cacertificates.md) - List all CA certificates of the given project -* [oasisctl list cpusizes](list-cpusizes.md) - List CPU sizes -* [oasisctl list deployments](list-deployments.md) - List all deployments of the given project -* [oasisctl list diskperformances](list-diskperformances.md) - List disk performances -* [oasisctl list effective](list-effective.md) - List effective information -* [oasisctl list example](list-example.md) - List example ... -* [oasisctl list examples](list-examples.md) - List all example datasets -* [oasisctl list group](list-group.md) - List group resources -* [oasisctl list groups](list-groups.md) - List all groups of the given organization -* [oasisctl list ipallowlists](list-ipallowlists.md) - List all IP allowlists of the given project -* [oasisctl list metrics](list-metrics.md) - List metrics resources -* [oasisctl list nodesizes](list-nodesizes.md) - List node sizes -* [oasisctl list notebookmodels](list-notebookmodels.md) - List notebook models -* [oasisctl list notebooks](list-notebooks.md) - List notebooks -* [oasisctl list organization](list-organization.md) - List organization resources -* [oasisctl list organizations](list-organizations.md) - List all organizations the authenticated user is a member of -* [oasisctl list permissions](list-permissions.md) - List the known permissions -* [oasisctl list projects](list-projects.md) - List all projects of the given organization -* [oasisctl list providers](list-providers.md) - List all providers the authenticated user has access to -* [oasisctl list regions](list-regions.md) - List all regions of the given provider -* [oasisctl list roles](list-roles.md) - List all roles of the given organization -* [oasisctl list servers](list-servers.md) - List servers information - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-apikeys.md b/site/content/3.12/arangograph/oasisctl/list/list-apikeys.md deleted file mode 100644 index 44984cb38b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-apikeys.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List API Keys -menuTitle: List API Keys -weight: 1 ---- -## oasisctl list apikeys - -List all API keys created for the current user - -``` -oasisctl list apikeys [flags] -``` - -## Options -``` - -h, --help help for apikeys -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-arangodb-versions.md b/site/content/3.12/arangograph/oasisctl/list/list-arangodb-versions.md deleted file mode 100644 index 22411cf8a8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-arangodb-versions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List ArangoDB Versions -menuTitle: List ArangoDB Versions -weight: 3 ---- -## oasisctl list arangodb versions - -List all supported ArangoDB versions - -``` -oasisctl list arangodb versions [flags] -``` - -## Options -``` - -h, --help help for versions - -o, --organization-id string Optional Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list arangodb](list-arangodb.md) - List ArangoDB information - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-arangodb.md b/site/content/3.12/arangograph/oasisctl/list/list-arangodb.md deleted file mode 100644 index 04445b917d..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-arangodb.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List ArangoDB -menuTitle: List ArangoDB -weight: 2 ---- -## oasisctl list arangodb - -List ArangoDB information - -``` -oasisctl list arangodb [flags] -``` - -## Options -``` - -h, --help help for arangodb -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list arangodb versions](list-arangodb-versions.md) - List all supported ArangoDB versions - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-auditlog-archives.md b/site/content/3.12/arangograph/oasisctl/list/list-auditlog-archives.md deleted file mode 100644 index efe237a2b6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-auditlog-archives.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log Archives -menuTitle: List Audit Log Archives -weight: 5 ---- -## oasisctl list auditlog archives - -List auditlog archives - -``` -oasisctl list auditlog archives [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for archives - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-auditlog-destinations.md b/site/content/3.12/arangograph/oasisctl/list/list-auditlog-destinations.md deleted file mode 100644 index f6fc395ce0..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-auditlog-destinations.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log Destinations -menuTitle: List Audit Log Destinations -weight: 6 ---- -## oasisctl list auditlog destinations - -List auditlog destinations - -``` -oasisctl list auditlog destinations [flags] -``` - -## Options -``` - --auditlog-id string Identifier of the auditlog to list the destinations for - -h, --help help for destinations - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-auditlog.md b/site/content/3.12/arangograph/oasisctl/list/list-auditlog.md deleted file mode 100644 index 4a86f9969e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-auditlog.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log -menuTitle: List Audit Log -weight: 4 ---- -## oasisctl list auditlog - -List resources for auditlogs - -``` -oasisctl list auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list auditlog archives](list-auditlog-archives.md) - List auditlog archives -* [oasisctl list auditlog destinations](list-auditlog-destinations.md) - List auditlog destinations - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-auditlogs.md b/site/content/3.12/arangograph/oasisctl/list/list-auditlogs.md deleted file mode 100644 index 83e17ba2e2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-auditlogs.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Audit Logs -menuTitle: List Audit Logs -weight: 7 ---- -## oasisctl list auditlogs - -List auditlogs - -``` -oasisctl list auditlogs [flags] -``` - -## Options -``` - -h, --help help for auditlogs - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-backup-policies.md b/site/content/3.12/arangograph/oasisctl/list/list-backup-policies.md deleted file mode 100644 index ec1b895990..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-backup-policies.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Backup Policies -menuTitle: List Backup Policies -weight: 9 ---- -## oasisctl list backup policies - -List backup policies - -``` -oasisctl list backup policies [flags] -``` - -## Options -``` - --deployment-id string The ID of the deployment to list backup policies for - -h, --help help for policies - --include-deleted If set, the result includes all backup policies, including those who set to deleted, however are not removed from the system currently -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list backup](list-backup.md) - A list command for various backup resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-backup.md b/site/content/3.12/arangograph/oasisctl/list/list-backup.md deleted file mode 100644 index 3c0b2d78a8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-backup.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Backup -menuTitle: List Backup -weight: 8 ---- -## oasisctl list backup - -A list command for various backup resources - -``` -oasisctl list backup [flags] -``` - -## Options -``` - -h, --help help for backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list backup policies](list-backup-policies.md) - List backup policies - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-backups.md b/site/content/3.12/arangograph/oasisctl/list/list-backups.md deleted file mode 100644 index ace03c781e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-backups.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Backups -menuTitle: List Backups -weight: 10 ---- -## oasisctl list backups - -List backups - -``` -oasisctl list backups [flags] -``` - -## Options -``` - --deployment-id string The ID of the deployment to list backups for - --from string Request backups that are created at or after this timestamp - -h, --help help for backups - --to string Request backups that are created before this timestamp -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-cacertificates.md b/site/content/3.12/arangograph/oasisctl/list/list-cacertificates.md deleted file mode 100644 index 903063bb34..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-cacertificates.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List CA Certificates -menuTitle: List CA Certificates -weight: 11 ---- -## oasisctl list cacertificates - -List all CA certificates of the given project - -``` -oasisctl list cacertificates [flags] -``` - -## Options -``` - -h, --help help for cacertificates - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-cpusizes.md b/site/content/3.12/arangograph/oasisctl/list/list-cpusizes.md deleted file mode 100644 index 85188eac3b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-cpusizes.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List CPU Sizes -menuTitle: List CPU Sizes -weight: 12 ---- -## oasisctl list cpusizes - -List CPU sizes - -``` -oasisctl list cpusizes [flags] -``` - -## Options -``` - -h, --help help for cpusizes - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-deployments.md b/site/content/3.12/arangograph/oasisctl/list/list-deployments.md deleted file mode 100644 index 66b3d739d2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-deployments.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Deployments -menuTitle: List Deployments -weight: 13 ---- -## oasisctl list deployments - -List all deployments of the given project - -``` -oasisctl list deployments [flags] -``` - -## Options -``` - -h, --help help for deployments - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-diskperformances.md b/site/content/3.12/arangograph/oasisctl/list/list-diskperformances.md deleted file mode 100644 index ddbd5714c0..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-diskperformances.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl List Disk Performances -menuTitle: List Disk Performances -weight: 14 ---- -## oasisctl list diskperformances - -List disk performances - -``` -oasisctl list diskperformances [flags] -``` - -## Options -``` - --dbserver-disk-size int32 The disk size of DB-Servers (GiB) (default 32) - -h, --help help for diskperformances - --node-size-id string Identifier of the node size - -o, --organization-id string Identifier of the organization - --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-effective-permissions.md b/site/content/3.12/arangograph/oasisctl/list/list-effective-permissions.md deleted file mode 100644 index 394cc1006e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-effective-permissions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Effective Permissions -menuTitle: List Effective Permissions -weight: 16 ---- -## oasisctl list effective permissions - -List the effective permissions, the authenticated user has for a given URL - -``` -oasisctl list effective permissions [flags] -``` - -## Options -``` - -h, --help help for permissions - -u, --url string URL of resource to get effective permissions for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list effective](list-effective.md) - List effective information - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-effective.md b/site/content/3.12/arangograph/oasisctl/list/list-effective.md deleted file mode 100644 index 431f601dc1..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-effective.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Effective -menuTitle: List Effective -weight: 15 ---- -## oasisctl list effective - -List effective information - -``` -oasisctl list effective [flags] -``` - -## Options -``` - -h, --help help for effective -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list effective permissions](list-effective-permissions.md) - List the effective permissions, the authenticated user has for a given URL - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-example-installations.md b/site/content/3.12/arangograph/oasisctl/list/list-example-installations.md deleted file mode 100644 index 5a9167f5b9..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-example-installations.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Example Installations -menuTitle: List Example Installations -weight: 18 ---- -## oasisctl list example installations - -List all example dataset installations for a deployment - -``` -oasisctl list example installations [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installations - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list example](list-example.md) - List example ... - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-example.md b/site/content/3.12/arangograph/oasisctl/list/list-example.md deleted file mode 100644 index e389b299c2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Example -menuTitle: List Example -weight: 17 ---- -## oasisctl list example - -List example ... - -``` -oasisctl list example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list example installations](list-example-installations.md) - List all example dataset installations for a deployment - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-examples.md b/site/content/3.12/arangograph/oasisctl/list/list-examples.md deleted file mode 100644 index 1cc1d11b86..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-examples.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Examples -menuTitle: List Examples -weight: 19 ---- -## oasisctl list examples - -List all example datasets - -``` -oasisctl list examples [flags] -``` - -## Options -``` - -h, --help help for examples - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-group-members.md b/site/content/3.12/arangograph/oasisctl/list/list-group-members.md deleted file mode 100644 index 6bc87e0b73..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-group-members.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Group Members -menuTitle: List Group Members -weight: 21 ---- -## oasisctl list group members - -List members of a group the authenticated user is a member of - -``` -oasisctl list group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for members - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list group](list-group.md) - List group resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-group.md b/site/content/3.12/arangograph/oasisctl/list/list-group.md deleted file mode 100644 index 28f5caa79d..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-group.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Group -menuTitle: List Group -weight: 20 ---- -## oasisctl list group - -List group resources - -``` -oasisctl list group [flags] -``` - -## Options -``` - -h, --help help for group -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list group members](list-group-members.md) - List members of a group the authenticated user is a member of - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-groups.md b/site/content/3.12/arangograph/oasisctl/list/list-groups.md deleted file mode 100644 index 8908ae0fb3..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-groups.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Groups -menuTitle: List Groups -weight: 22 ---- -## oasisctl list groups - -List all groups of the given organization - -``` -oasisctl list groups [flags] -``` - -## Options -``` - -h, --help help for groups - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-ipallowlists.md b/site/content/3.12/arangograph/oasisctl/list/list-ipallowlists.md deleted file mode 100644 index 33ef91495d..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-ipallowlists.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List IP Allowlists -menuTitle: List IP Allowlists -weight: 23 ---- -## oasisctl list ipallowlists - -List all IP allowlists of the given project - -``` -oasisctl list ipallowlists [flags] -``` - -## Options -``` - -h, --help help for ipallowlists - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-metrics-tokens.md b/site/content/3.12/arangograph/oasisctl/list/list-metrics-tokens.md deleted file mode 100644 index ce1713add8..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-metrics-tokens.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Metrics Tokens -menuTitle: List Metrics Tokens -weight: 25 ---- -## oasisctl list metrics tokens - -List all metrics tokens of the given deployment - -``` -oasisctl list metrics tokens [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for tokens - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list metrics](list-metrics.md) - List metrics resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-metrics.md b/site/content/3.12/arangograph/oasisctl/list/list-metrics.md deleted file mode 100644 index fe3a321be3..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Metrics -menuTitle: List Metrics -weight: 24 ---- -## oasisctl list metrics - -List metrics resources - -``` -oasisctl list metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list metrics tokens](list-metrics-tokens.md) - List all metrics tokens of the given deployment - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-nodesizes.md b/site/content/3.12/arangograph/oasisctl/list/list-nodesizes.md deleted file mode 100644 index 60c0bc9d56..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-nodesizes.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl List Node Sizes -menuTitle: List Node Sizes -weight: 26 ---- -## oasisctl list nodesizes - -List node sizes - -``` -oasisctl list nodesizes [flags] -``` - -## Options -``` - -h, --help help for nodesizes - --model string Identifier of the model (default "oneshard") - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-notebookmodels.md b/site/content/3.12/arangograph/oasisctl/list/list-notebookmodels.md deleted file mode 100644 index cdca9cb6a5..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-notebookmodels.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Notebook Models -menuTitle: List Notebook Models -weight: 27 ---- -## oasisctl list notebookmodels - -List notebook models - -``` -oasisctl list notebookmodels [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebook has to run next to - -h, --help help for notebookmodels - -o, --organization-id string Identifier of the organization that deployment is in - -p, --project-id string Identifier of the project that deployment is in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-notebooks.md b/site/content/3.12/arangograph/oasisctl/list/list-notebooks.md deleted file mode 100644 index 29aa77467f..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-notebooks.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Notebooks -menuTitle: List Notebooks -weight: 28 ---- -## oasisctl list notebooks - -List notebooks - -``` -oasisctl list notebooks [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebooks run next to - -h, --help help for notebooks - -o, --organization-id string Identifier of the organization that has notebooks - -p, --project-id string Identifier of the project that has notebooks -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-organization-invites.md b/site/content/3.12/arangograph/oasisctl/list/list-organization-invites.md deleted file mode 100644 index d3fbe58668..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-organization-invites.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Organization Invites -menuTitle: List Organization Invites -weight: 30 ---- -## oasisctl list organization invites - -List invites of an organization the authenticated user is a member of - -``` -oasisctl list organization invites [flags] -``` - -## Options -``` - -h, --help help for invites - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list organization](list-organization.md) - List organization resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-organization-members.md b/site/content/3.12/arangograph/oasisctl/list/list-organization-members.md deleted file mode 100644 index f143d66886..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-organization-members.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Organization Members -menuTitle: List Organization Members -weight: 31 ---- -## oasisctl list organization members - -List members of an organization the authenticated user is a member of - -``` -oasisctl list organization members [flags] -``` - -## Options -``` - -h, --help help for members - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list organization](list-organization.md) - List organization resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-organization.md b/site/content/3.12/arangograph/oasisctl/list/list-organization.md deleted file mode 100644 index c41e4a9750..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-organization.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Organization -menuTitle: List Organization -weight: 29 ---- -## oasisctl list organization - -List organization resources - -``` -oasisctl list organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list organization invites](list-organization-invites.md) - List invites of an organization the authenticated user is a member of -* [oasisctl list organization members](list-organization-members.md) - List members of an organization the authenticated user is a member of - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-organizations.md b/site/content/3.12/arangograph/oasisctl/list/list-organizations.md deleted file mode 100644 index 7cde4a6da1..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-organizations.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Organizations -menuTitle: List Organizations -weight: 32 ---- -## oasisctl list organizations - -List all organizations the authenticated user is a member of - -``` -oasisctl list organizations [flags] -``` - -## Options -``` - -h, --help help for organizations -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-permissions.md b/site/content/3.12/arangograph/oasisctl/list/list-permissions.md deleted file mode 100644 index db4c2bd43c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-permissions.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Permissions -menuTitle: List Permissions -weight: 33 ---- -## oasisctl list permissions - -List the known permissions - -``` -oasisctl list permissions [flags] -``` - -## Options -``` - -h, --help help for permissions -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-projects.md b/site/content/3.12/arangograph/oasisctl/list/list-projects.md deleted file mode 100644 index 959e80a2fa..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-projects.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Projects -menuTitle: List Projects -weight: 34 ---- -## oasisctl list projects - -List all projects of the given organization - -``` -oasisctl list projects [flags] -``` - -## Options -``` - -h, --help help for projects - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-providers.md b/site/content/3.12/arangograph/oasisctl/list/list-providers.md deleted file mode 100644 index 1b9c90f744..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-providers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Providers -menuTitle: List Providers -weight: 35 ---- -## oasisctl list providers - -List all providers the authenticated user has access to - -``` -oasisctl list providers [flags] -``` - -## Options -``` - -h, --help help for providers - -o, --organization-id string Optional Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-regions.md b/site/content/3.12/arangograph/oasisctl/list/list-regions.md deleted file mode 100644 index 083b85a4a5..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-regions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Regions -menuTitle: List Regions -weight: 36 ---- -## oasisctl list regions - -List all regions of the given provider - -``` -oasisctl list regions [flags] -``` - -## Options -``` - -h, --help help for regions - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-roles.md b/site/content/3.12/arangograph/oasisctl/list/list-roles.md deleted file mode 100644 index ffa2a3ee89..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-roles.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Roles -menuTitle: List Roles -weight: 37 ---- -## oasisctl list roles - -List all roles of the given organization - -``` -oasisctl list roles [flags] -``` - -## Options -``` - -h, --help help for roles - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/list/list-servers.md b/site/content/3.12/arangograph/oasisctl/list/list-servers.md deleted file mode 100644 index f1e3a5f636..0000000000 --- a/site/content/3.12/arangograph/oasisctl/list/list-servers.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Servers -menuTitle: List Servers -weight: 38 ---- -## oasisctl list servers - -List servers information - -``` -oasisctl list servers [flags] -``` - -## Options -``` - -h, --help help for servers -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.12/arangograph/oasisctl/lock/_index.md b/site/content/3.12/arangograph/oasisctl/lock/_index.md deleted file mode 100644 index 1b432aa982..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/_index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Lock -menuTitle: Lock -weight: 16 ---- -## oasisctl lock - -Lock resources - -``` -oasisctl lock [flags] -``` - -## Options -``` - -h, --help help for lock -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl lock cacertificate](lock-cacertificate.md) - Lock a CA certificate, so it cannot be deleted -* [oasisctl lock deployment](lock-deployment.md) - Lock a deployment, so it cannot be deleted -* [oasisctl lock ipallowlist](lock-ipallowlist.md) - Lock an IP allowlist, so it cannot be deleted -* [oasisctl lock organization](lock-organization.md) - Lock an organization, so it cannot be deleted -* [oasisctl lock policy](lock-policy.md) - Lock a backup policy -* [oasisctl lock project](lock-project.md) - Lock a project, so it cannot be deleted - diff --git a/site/content/3.12/arangograph/oasisctl/lock/lock-cacertificate.md b/site/content/3.12/arangograph/oasisctl/lock/lock-cacertificate.md deleted file mode 100644 index 274471190b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/lock-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock CA Certificate -menuTitle: Lock CA Certificate -weight: 1 ---- -## oasisctl lock cacertificate - -Lock a CA certificate, so it cannot be deleted - -``` -oasisctl lock cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.12/arangograph/oasisctl/lock/lock-deployment.md b/site/content/3.12/arangograph/oasisctl/lock/lock-deployment.md deleted file mode 100644 index 3a64c29d17..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/lock-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock Deployment -menuTitle: Lock Deployment -weight: 2 ---- -## oasisctl lock deployment - -Lock a deployment, so it cannot be deleted - -``` -oasisctl lock deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.12/arangograph/oasisctl/lock/lock-ipallowlist.md b/site/content/3.12/arangograph/oasisctl/lock/lock-ipallowlist.md deleted file mode 100644 index 9f4460b2e2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/lock-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock IP Allowlist -menuTitle: Lock IP Allowlist -weight: 3 ---- -## oasisctl lock ipallowlist - -Lock an IP allowlist, so it cannot be deleted - -``` -oasisctl lock ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.12/arangograph/oasisctl/lock/lock-organization.md b/site/content/3.12/arangograph/oasisctl/lock/lock-organization.md deleted file mode 100644 index e65abeea81..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/lock-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Lock Organization -menuTitle: Lock Organization -weight: 4 ---- -## oasisctl lock organization - -Lock an organization, so it cannot be deleted - -``` -oasisctl lock organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.12/arangograph/oasisctl/lock/lock-policy.md b/site/content/3.12/arangograph/oasisctl/lock/lock-policy.md deleted file mode 100644 index 8b70ed3617..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/lock-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Lock Policy -menuTitle: Lock Policy -weight: 5 ---- -## oasisctl lock policy - -Lock a backup policy - -``` -oasisctl lock policy [flags] -``` - -## Options -``` - -d, --backup-policy-id string Identifier of the backup policy - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.12/arangograph/oasisctl/lock/lock-project.md b/site/content/3.12/arangograph/oasisctl/lock/lock-project.md deleted file mode 100644 index f71ac58f82..0000000000 --- a/site/content/3.12/arangograph/oasisctl/lock/lock-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Lock Project -menuTitle: Lock Project -weight: 6 ---- -## oasisctl lock project - -Lock a project, so it cannot be deleted - -``` -oasisctl lock project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.12/arangograph/oasisctl/login.md b/site/content/3.12/arangograph/oasisctl/login.md deleted file mode 100644 index a507d3e942..0000000000 --- a/site/content/3.12/arangograph/oasisctl/login.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Oasisctl Login -menuTitle: Login -weight: 17 ---- -## oasisctl login - -Login to ArangoDB Oasis using an API key - -## Synopsis -To authenticate in a script environment, run: - - export OASIS_TOKEN=$(oasisctl login --key-id=<your-key-id> --key-secret=<your-key-secret>) - - -``` -oasisctl login [flags] -``` - -## Options -``` - -h, --help help for login - -i, --key-id string API key identifier - -s, --key-secret string API key secret -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/logs.md b/site/content/3.12/arangograph/oasisctl/logs.md deleted file mode 100644 index 71f2555f94..0000000000 --- a/site/content/3.12/arangograph/oasisctl/logs.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Logs -menuTitle: Logs -weight: 18 ---- -## oasisctl logs - -Get logs of the servers of a deployment the authenticated user has access to - -``` -oasisctl logs [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - --end string End fetching logs at this timestamp (pass timestamp or duration before now) - --format string Formatting of the log output. It can be one of two: text, json. Text is the default value. (default "text") - -h, --help help for logs - -l, --limit int Limit the number of log lines - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -r, --role string Limit logs to servers with given role only (agents|coordinators|dbservers) - --start string Start fetching logs from this timestamp (pass timestamp or duration before now) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/options.md b/site/content/3.12/arangograph/oasisctl/options.md deleted file mode 100644 index 75823ecb85..0000000000 --- a/site/content/3.12/arangograph/oasisctl/options.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: Command-line client tool for managing ArangoGraph -title: ArangoGraph Shell oasisctl -menuTitle: Options -weight: 1 ---- -## oasisctl - -ArangoGraph Insights Platform - -## Synopsis -ArangoGraph Insights Platform (formerly called Oasis): The Managed Cloud for ArangoDB - -``` -oasisctl [flags] -``` - -## Options -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - -h, --help help for oasisctl - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept](accept/_index.md) - Accept invites -* [oasisctl add](add/_index.md) - Add resources -* [oasisctl auditlog](auditlog/_index.md) - AuditLog resources -* [oasisctl backup](backup/_index.md) - Backup commands -* [oasisctl clone](clone/_index.md) - Clone resources -* [oasisctl completion](completion.md) - Generates bash completion scripts -* [oasisctl create](create/_index.md) - Create resources -* [oasisctl delete](delete/_index.md) - Delete resources -* [oasisctl disable](disable/_index.md) - Disable some settings related to deployment -* [oasisctl enable](enable/_index.md) - Enable some settings related to deployment -* [oasisctl generate-docs](generate-docs.md) - Generate output -* [oasisctl get](get/_index.md) - Get information -* [oasisctl import](import.md) - Import data from a local database or from another remote database into an Oasis deployment. -* [oasisctl list](list/_index.md) - List resources -* [oasisctl lock](lock/_index.md) - Lock resources -* [oasisctl login](login.md) - Login to ArangoDB Oasis using an API key -* [oasisctl logs](logs.md) - Get logs of the servers of a deployment the authenticated user has access to -* [oasisctl pause](pause/_index.md) - Pause resources -* [oasisctl rebalance](rebalance/_index.md) - Rebalance resources -* [oasisctl reject](reject/_index.md) - Reject invites -* [oasisctl renew](renew/_index.md) - Renew keys & tokens -* [oasisctl resume](resume/_index.md) - Resume resources -* [oasisctl revoke](revoke/_index.md) - Revoke keys & tokens -* [oasisctl rotate](rotate/_index.md) - Rotate resources -* [oasisctl top](top.md) - Show the most important server metrics -* [oasisctl unlock](unlock/_index.md) - Unlock resources -* [oasisctl update](update/_index.md) - Update resources -* [oasisctl upgrade](upgrade.md) - Upgrade Oasisctl tool -* [oasisctl version](version.md) - Show the current version of this tool -* [oasisctl wait](wait/_index.md) - Wait for a status change - diff --git a/site/content/3.12/arangograph/oasisctl/pause/_index.md b/site/content/3.12/arangograph/oasisctl/pause/_index.md deleted file mode 100644 index ce02e840c5..0000000000 --- a/site/content/3.12/arangograph/oasisctl/pause/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Pause -menuTitle: Pause -weight: 19 ---- -## oasisctl pause - -Pause resources - -``` -oasisctl pause [flags] -``` - -## Options -``` - -h, --help help for pause -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl pause notebook](pause-notebook.md) - Pause a notebook - diff --git a/site/content/3.12/arangograph/oasisctl/pause/pause-notebook.md b/site/content/3.12/arangograph/oasisctl/pause/pause-notebook.md deleted file mode 100644 index 0db646d81b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/pause/pause-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Pause Notebook -menuTitle: Pause Notebook -weight: 1 ---- -## oasisctl pause notebook - -Pause a notebook - -``` -oasisctl pause notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl pause](_index.md) - Pause resources - diff --git a/site/content/3.12/arangograph/oasisctl/rebalance/_index.md b/site/content/3.12/arangograph/oasisctl/rebalance/_index.md deleted file mode 100644 index c1532b7f91..0000000000 --- a/site/content/3.12/arangograph/oasisctl/rebalance/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance -menuTitle: Rebalance -weight: 20 ---- -## oasisctl rebalance - -Rebalance resources - -``` -oasisctl rebalance [flags] -``` - -## Options -``` - -h, --help help for rebalance -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl rebalance deployment](rebalance-deployment.md) - Rebalance deployment resources - diff --git a/site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md b/site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md deleted file mode 100644 index 706b6339e9..0000000000 --- a/site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance Deployment Shards -menuTitle: Rebalance Deployment Shards -weight: 2 ---- -## oasisctl rebalance deployment shards - -Rebalance shards of a deployment - -``` -oasisctl rebalance deployment shards [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for shards -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rebalance deployment](rebalance-deployment.md) - Rebalance deployment resources - diff --git a/site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment.md b/site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment.md deleted file mode 100644 index 7759314ec5..0000000000 --- a/site/content/3.12/arangograph/oasisctl/rebalance/rebalance-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance Deployment -menuTitle: Rebalance Deployment -weight: 1 ---- -## oasisctl rebalance deployment - -Rebalance deployment resources - -``` -oasisctl rebalance deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rebalance](_index.md) - Rebalance resources -* [oasisctl rebalance deployment shards](rebalance-deployment-shards.md) - Rebalance shards of a deployment - diff --git a/site/content/3.12/arangograph/oasisctl/reject/_index.md b/site/content/3.12/arangograph/oasisctl/reject/_index.md deleted file mode 100644 index 69cff60ece..0000000000 --- a/site/content/3.12/arangograph/oasisctl/reject/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Reject -menuTitle: Reject -weight: 21 ---- -## oasisctl reject - -Reject invites - -``` -oasisctl reject [flags] -``` - -## Options -``` - -h, --help help for reject -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl reject organization](reject-organization.md) - Reject organization related invites - diff --git a/site/content/3.12/arangograph/oasisctl/reject/reject-organization-invite.md b/site/content/3.12/arangograph/oasisctl/reject/reject-organization-invite.md deleted file mode 100644 index d43ecfca52..0000000000 --- a/site/content/3.12/arangograph/oasisctl/reject/reject-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Reject Organization Invite -menuTitle: Reject Organization Invite -weight: 2 ---- -## oasisctl reject organization invite - -Reject an organization invite the authenticated user has access to - -``` -oasisctl reject organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl reject organization](reject-organization.md) - Reject organization related invites - diff --git a/site/content/3.12/arangograph/oasisctl/reject/reject-organization.md b/site/content/3.12/arangograph/oasisctl/reject/reject-organization.md deleted file mode 100644 index c688b02cd1..0000000000 --- a/site/content/3.12/arangograph/oasisctl/reject/reject-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Reject Organization -menuTitle: Reject Organization -weight: 1 ---- -## oasisctl reject organization - -Reject organization related invites - -``` -oasisctl reject organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl reject](_index.md) - Reject invites -* [oasisctl reject organization invite](reject-organization-invite.md) - Reject an organization invite the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/renew/_index.md b/site/content/3.12/arangograph/oasisctl/renew/_index.md deleted file mode 100644 index b140a835de..0000000000 --- a/site/content/3.12/arangograph/oasisctl/renew/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Renew -menuTitle: Renew -weight: 22 ---- -## oasisctl renew - -Renew keys & tokens - -``` -oasisctl renew [flags] -``` - -## Options -``` - -h, --help help for renew -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl renew apikey](renew-apikey.md) - Renew API keys & tokens - diff --git a/site/content/3.12/arangograph/oasisctl/renew/renew-apikey-token.md b/site/content/3.12/arangograph/oasisctl/renew/renew-apikey-token.md deleted file mode 100644 index e6a1798243..0000000000 --- a/site/content/3.12/arangograph/oasisctl/renew/renew-apikey-token.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Renew API Key Token -menuTitle: Renew API Key Token -weight: 2 ---- -## oasisctl renew apikey token - -Renew an API key token - -## Synopsis -Renew the token (resulting from API key authentication) - -``` -oasisctl renew apikey token [flags] -``` - -## Options -``` - -h, --help help for token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl renew apikey](renew-apikey.md) - Renew API keys & tokens - diff --git a/site/content/3.12/arangograph/oasisctl/renew/renew-apikey.md b/site/content/3.12/arangograph/oasisctl/renew/renew-apikey.md deleted file mode 100644 index 14c1b7ec4d..0000000000 --- a/site/content/3.12/arangograph/oasisctl/renew/renew-apikey.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Renew API Key -menuTitle: Renew API Key -weight: 1 ---- -## oasisctl renew apikey - -Renew API keys & tokens - -``` -oasisctl renew apikey [flags] -``` - -## Options -``` - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl renew](_index.md) - Renew keys & tokens -* [oasisctl renew apikey token](renew-apikey-token.md) - Renew an API key token - diff --git a/site/content/3.12/arangograph/oasisctl/resume/_index.md b/site/content/3.12/arangograph/oasisctl/resume/_index.md deleted file mode 100644 index 78485175c1..0000000000 --- a/site/content/3.12/arangograph/oasisctl/resume/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Resume -menuTitle: Resume -weight: 23 ---- -## oasisctl resume - -Resume resources - -``` -oasisctl resume [flags] -``` - -## Options -``` - -h, --help help for resume -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl resume deployment](resume-deployment.md) - Resume a paused deployment the authenticated user has access to -* [oasisctl resume notebook](resume-notebook.md) - Resume a notebook - diff --git a/site/content/3.12/arangograph/oasisctl/resume/resume-deployment.md b/site/content/3.12/arangograph/oasisctl/resume/resume-deployment.md deleted file mode 100644 index 7cbc18ef00..0000000000 --- a/site/content/3.12/arangograph/oasisctl/resume/resume-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Resume Deployment -menuTitle: Resume Deployment -weight: 1 ---- -## oasisctl resume deployment - -Resume a paused deployment the authenticated user has access to - -``` -oasisctl resume deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl resume](_index.md) - Resume resources - diff --git a/site/content/3.12/arangograph/oasisctl/resume/resume-notebook.md b/site/content/3.12/arangograph/oasisctl/resume/resume-notebook.md deleted file mode 100644 index 17add47562..0000000000 --- a/site/content/3.12/arangograph/oasisctl/resume/resume-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Resume Notebook -menuTitle: Resume Notebook -weight: 2 ---- -## oasisctl resume notebook - -Resume a notebook - -``` -oasisctl resume notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl resume](_index.md) - Resume resources - diff --git a/site/content/3.12/arangograph/oasisctl/revoke/_index.md b/site/content/3.12/arangograph/oasisctl/revoke/_index.md deleted file mode 100644 index 80ad7af060..0000000000 --- a/site/content/3.12/arangograph/oasisctl/revoke/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Revoke -menuTitle: Revoke -weight: 24 ---- -## oasisctl revoke - -Revoke keys & tokens - -``` -oasisctl revoke [flags] -``` - -## Options -``` - -h, --help help for revoke -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl revoke apikey](revoke-apikey.md) - Revoke an API key with given identifier -* [oasisctl revoke metrics](revoke-metrics.md) - Revoke keys & tokens - diff --git a/site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey-token.md b/site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey-token.md deleted file mode 100644 index 795b5e5605..0000000000 --- a/site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey-token.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Revoke API Key Token -menuTitle: Revoke API Key Token -weight: 2 ---- -## oasisctl revoke apikey token - -Revoke an API key token - -## Synopsis -Revoke the token (resulting from API key authentication) - -``` -oasisctl revoke apikey token [flags] -``` - -## Options -``` - -h, --help help for token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke apikey](revoke-apikey.md) - Revoke an API key with given identifier - diff --git a/site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey.md b/site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey.md deleted file mode 100644 index 5c15ef927a..0000000000 --- a/site/content/3.12/arangograph/oasisctl/revoke/revoke-apikey.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Revoke API Key -menuTitle: Revoke API Key -weight: 1 ---- -## oasisctl revoke apikey - -Revoke an API key with given identifier - -``` -oasisctl revoke apikey [flags] -``` - -## Options -``` - -i, --apikey-id string Identifier of the API key to revoke - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke](_index.md) - Revoke keys & tokens -* [oasisctl revoke apikey token](revoke-apikey-token.md) - Revoke an API key token - diff --git a/site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics-token.md b/site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics-token.md deleted file mode 100644 index 0876f21606..0000000000 --- a/site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Revoke Metrics Token -menuTitle: Revoke Metrics Token -weight: 4 ---- -## oasisctl revoke metrics token - -Revoke a metrics token for a deployment - -``` -oasisctl revoke metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke metrics](revoke-metrics.md) - Revoke keys & tokens - diff --git a/site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics.md b/site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics.md deleted file mode 100644 index 638a17df00..0000000000 --- a/site/content/3.12/arangograph/oasisctl/revoke/revoke-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Revoke Metrics -menuTitle: Revoke Metrics -weight: 3 ---- -## oasisctl revoke metrics - -Revoke keys & tokens - -``` -oasisctl revoke metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke](_index.md) - Revoke keys & tokens -* [oasisctl revoke metrics token](revoke-metrics-token.md) - Revoke a metrics token for a deployment - diff --git a/site/content/3.12/arangograph/oasisctl/rotate/_index.md b/site/content/3.12/arangograph/oasisctl/rotate/_index.md deleted file mode 100644 index e24096c868..0000000000 --- a/site/content/3.12/arangograph/oasisctl/rotate/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rotate -menuTitle: Rotate -weight: 25 ---- -## oasisctl rotate - -Rotate resources - -``` -oasisctl rotate [flags] -``` - -## Options -``` - -h, --help help for rotate -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl rotate deployment](rotate-deployment.md) - Rotate deployment resources - diff --git a/site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment-server.md b/site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment-server.md deleted file mode 100644 index 5d281d1ae4..0000000000 --- a/site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment-server.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Rotate Deployment Server -menuTitle: Rotate Deployment Server -weight: 2 ---- -## oasisctl rotate deployment server - -Rotate a single server of a deployment - -``` -oasisctl rotate deployment server [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for server - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -s, --server-id strings Identifier of the deployment server -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rotate deployment](rotate-deployment.md) - Rotate deployment resources - diff --git a/site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment.md b/site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment.md deleted file mode 100644 index de899d924d..0000000000 --- a/site/content/3.12/arangograph/oasisctl/rotate/rotate-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rotate Deployment -menuTitle: Rotate Deployment -weight: 1 ---- -## oasisctl rotate deployment - -Rotate deployment resources - -``` -oasisctl rotate deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rotate](_index.md) - Rotate resources -* [oasisctl rotate deployment server](rotate-deployment-server.md) - Rotate a single server of a deployment - diff --git a/site/content/3.12/arangograph/oasisctl/top.md b/site/content/3.12/arangograph/oasisctl/top.md deleted file mode 100644 index d89a83ebfe..0000000000 --- a/site/content/3.12/arangograph/oasisctl/top.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Top -menuTitle: Top -weight: 26 ---- -## oasisctl top - -Show the most important server metrics - -``` -oasisctl top [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for top - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/_index.md b/site/content/3.12/arangograph/oasisctl/unlock/_index.md deleted file mode 100644 index 2c376ce6fd..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/_index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Unlock -menuTitle: Unlock -weight: 27 ---- -## oasisctl unlock - -Unlock resources - -``` -oasisctl unlock [flags] -``` - -## Options -``` - -h, --help help for unlock -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl unlock cacertificate](unlock-cacertificate.md) - Unlock a CA certificate, so it can be deleted -* [oasisctl unlock deployment](unlock-deployment.md) - Unlock a deployment, so it can be deleted -* [oasisctl unlock ipallowlist](unlock-ipallowlist.md) - Unlock an IP allowlist, so it can be deleted -* [oasisctl unlock organization](unlock-organization.md) - Unlock an organization, so it can be deleted -* [oasisctl unlock policy](unlock-policy.md) - Unlock a backup policy -* [oasisctl unlock project](unlock-project.md) - Unlock a project, so it can be deleted - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/unlock-cacertificate.md b/site/content/3.12/arangograph/oasisctl/unlock/unlock-cacertificate.md deleted file mode 100644 index 418fb91ae6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/unlock-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock CA Certificate -menuTitle: Unlock CA Certificate -weight: 1 ---- -## oasisctl unlock cacertificate - -Unlock a CA certificate, so it can be deleted - -``` -oasisctl unlock cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/unlock-deployment.md b/site/content/3.12/arangograph/oasisctl/unlock/unlock-deployment.md deleted file mode 100644 index 6d870921e6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/unlock-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock Deployment -menuTitle: Unlock Deployment -weight: 2 ---- -## oasisctl unlock deployment - -Unlock a deployment, so it can be deleted - -``` -oasisctl unlock deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/unlock-ipallowlist.md b/site/content/3.12/arangograph/oasisctl/unlock/unlock-ipallowlist.md deleted file mode 100644 index 36f8fdbaed..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/unlock-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock IP Allowlist -menuTitle: Unlock IP Allowlist -weight: 3 ---- -## oasisctl unlock ipallowlist - -Unlock an IP allowlist, so it can be deleted - -``` -oasisctl unlock ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/unlock-organization.md b/site/content/3.12/arangograph/oasisctl/unlock/unlock-organization.md deleted file mode 100644 index bfc70efccd..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/unlock-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Unlock Organization -menuTitle: Unlock Organization -weight: 4 ---- -## oasisctl unlock organization - -Unlock an organization, so it can be deleted - -``` -oasisctl unlock organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/unlock-policy.md b/site/content/3.12/arangograph/oasisctl/unlock/unlock-policy.md deleted file mode 100644 index 2646b5af51..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/unlock-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Unlock Policy -menuTitle: Unlock Policy -weight: 5 ---- -## oasisctl unlock policy - -Unlock a backup policy - -``` -oasisctl unlock policy [flags] -``` - -## Options -``` - -d, --backup-policy-id string Identifier of the backup policy - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.12/arangograph/oasisctl/unlock/unlock-project.md b/site/content/3.12/arangograph/oasisctl/unlock/unlock-project.md deleted file mode 100644 index 211e810283..0000000000 --- a/site/content/3.12/arangograph/oasisctl/unlock/unlock-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Unlock Project -menuTitle: Unlock Project -weight: 6 ---- -## oasisctl unlock project - -Unlock a project, so it can be deleted - -``` -oasisctl unlock project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/_index.md b/site/content/3.12/arangograph/oasisctl/update/_index.md deleted file mode 100644 index 0d1501cbe5..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/_index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Oasisctl Update -menuTitle: Update -weight: 28 ---- -## oasisctl update - -Update resources - -``` -oasisctl update [flags] -``` - -## Options -``` - -h, --help help for update -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl update auditlog](update-auditlog.md) - Update an auditlog -* [oasisctl update backup](update-backup.md) - Update a backup -* [oasisctl update cacertificate](update-cacertificate.md) - Update a CA certificate the authenticated user has access to -* [oasisctl update deployment](update-deployment.md) - Update a deployment the authenticated user has access to -* [oasisctl update group](update-group.md) - Update a group the authenticated user has access to -* [oasisctl update ipallowlist](update-ipallowlist.md) - Update an IP allowlist the authenticated user has access to -* [oasisctl update metrics](update-metrics.md) - Update metrics resources -* [oasisctl update notebook](update-notebook.md) - Update notebook -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update private](update-private.md) - Update private resources -* [oasisctl update project](update-project.md) - Update a project the authenticated user has access to -* [oasisctl update role](update-role.md) - Update a role the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-auditlog.md b/site/content/3.12/arangograph/oasisctl/update/update-auditlog.md deleted file mode 100644 index 8c92aa1c12..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-auditlog.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Audit Log -menuTitle: Update Audit Log -weight: 1 ---- -## oasisctl update auditlog - -Update an auditlog - -``` -oasisctl update auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to update. - --default If set, this AuditLog is the default for the organization. - --description string Description of the audit log. - -h, --help help for auditlog - --name string Name of the audit log. - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-backup-policy.md b/site/content/3.12/arangograph/oasisctl/update/update-backup-policy.md deleted file mode 100644 index cad0d2417f..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-backup-policy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Oasisctl Update Backup Policy -menuTitle: Update Backup Policy -weight: 3 ---- -## oasisctl update backup policy - -Update a backup policy - -``` -oasisctl update backup policy [flags] -``` - -## Options -``` - --additional-region-ids strings Add backup to the specified addition regions - -d, --backup-policy-id string Identifier of the backup policy - --day-of-the-month int32 Run the backup on the specified day of the month (1-31) (default 1) - --description string Description of the backup - --email-notification string Email notification setting (Never|FailureOnly|Always) - --every-interval-hours int32 Schedule should run with an interval of the specified hours (1-23) - --friday If set, a backup will be created on Fridays. Set to false explicitly to clear the flag. - -h, --help help for policy - --hours int32 Hours part of the time of day (0-23) - --minutes int32 Minutes part of the time of day (0-59) - --minutes-offset int32 Schedule should run with specific minutes offset (0-59) - --monday If set, a backup will be created on Mondays. Set to false explicitly to clear the flag. - --name string Name of the deployment - --paused The policy is paused. Set to false explicitly to clear the flag. - --retention-period int Backups created by this policy will be automatically deleted after the specified retention period. A value of 0 means that backup will never be deleted. - --saturday If set, a backup will be created on Saturdays. Set to false explicitly to clear the flag. - --schedule-type string Schedule of the policy (Hourly|Daily|Monthly) - --sunday If set, a backup will be created on Sundays. Set to false explicitly to clear the flag. - --thursday If set, a backup will be created on Thursdays. Set to false explicitly to clear the flag. - --time-zone string The time-zone this time of day applies to (empty means UTC). Names MUST be exactly as defined in RFC-822. (default "UTC") - --tuesday If set, a backup will be created on Tuesdays. Set to false explicitly to clear the flag. - --upload The backup should be uploaded. Set to false explicitly to clear the flag. - --wednesday If set, a backup will be created on Wednesdays. Set to false explicitly to clear the flag. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update backup](update-backup.md) - Update a backup - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-backup.md b/site/content/3.12/arangograph/oasisctl/update/update-backup.md deleted file mode 100644 index 9ce085b61b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-backup.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Backup -menuTitle: Update Backup -weight: 2 ---- -## oasisctl update backup - -Update a backup - -``` -oasisctl update backup [flags] -``` - -## Options -``` - --auto-deleted-at int Time (h) until auto delete of the backup - -d, --backup-id string Identifier of the backup - --description string Description of the backup - -h, --help help for backup - --name string Name of the backup - --upload The backups should be uploaded -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update backup policy](update-backup-policy.md) - Update a backup policy - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-cacertificate.md b/site/content/3.12/arangograph/oasisctl/update/update-cacertificate.md deleted file mode 100644 index 1b97fe7a45..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-cacertificate.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update CA Certificate -menuTitle: Update CA Certificate -weight: 4 ---- -## oasisctl update cacertificate - -Update a CA certificate the authenticated user has access to - -``` -oasisctl update cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - --description string Description of the CA certificate - -h, --help help for cacertificate - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --use-well-known-certificate Sets the usage of a well known certificate ie. Let's Encrypt -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-deployment.md b/site/content/3.12/arangograph/oasisctl/update/update-deployment.md deleted file mode 100644 index b7c36cace2..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-deployment.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Oasisctl Update Deployment -menuTitle: Update Deployment -weight: 5 ---- -## oasisctl update deployment - -Update a deployment the authenticated user has access to - -``` -oasisctl update deployment [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate to use for the deployment - --coordinator-memory-size int32 Set memory size of Coordinators for flexible deployments (GiB) (default 4) - --coordinators int32 Set number of Coordinators for flexible deployments (default 3) - --custom-image string Set a custom image to use for the deployment. Only available for selected customers. - --dbserver-disk-size int32 Set disk size of DB-Servers for flexible deployments (GiB) (default 32) - --dbserver-memory-size int32 Set memory size of DB-Servers for flexible deployments (GiB) (default 4) - --dbservers int32 Set number of DB-Servers for flexible deployments (default 3) - -d, --deployment-id string Identifier of the deployment - --description string Description of the deployment - --disable-foxx-authentication Disable authentication of requests to Foxx application. - --disk-performance-id string Set the disk performance to use for this deployment. - --drop-vst-support Drop VST protocol support to improve resilience. - -h, --help help for deployment - -i, --ipallowlist-id string Identifier of the IP allowlist to use for the deployment - --is-platform-authentication-enabled Enable platform authentication for deployment. - --max-node-disk-size int32 Set maximum disk size for nodes for autoscaler (GiB) - --model string Set model of the deployment (default "oneshard") - --name string Name of the deployment - --node-count int32 Set the number of desired nodes (default 3) - --node-disk-size int32 Set disk size for nodes (GiB) - --node-size-id string Set the node size to use for this deployment - --notification-email-address strings Set email address(-es) that will be used for notifications related to this deployment. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --version string Version of ArangoDB to use for the deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-group.md b/site/content/3.12/arangograph/oasisctl/update/update-group.md deleted file mode 100644 index 7021923d4c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-group.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Group -menuTitle: Update Group -weight: 6 ---- -## oasisctl update group - -Update a group the authenticated user has access to - -``` -oasisctl update group [flags] -``` - -## Options -``` - --description string Description of the group - -g, --group-id string Identifier of the group - -h, --help help for group - --name string Name of the group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-ipallowlist.md b/site/content/3.12/arangograph/oasisctl/update/update-ipallowlist.md deleted file mode 100644 index 089d41026c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-ipallowlist.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Oasisctl Update IP Allowlist -menuTitle: Update IP Allowlist -weight: 7 ---- -## oasisctl update ipallowlist - -Update an IP allowlist the authenticated user has access to - -``` -oasisctl update ipallowlist [flags] -``` - -## Options -``` - --add-cidr-range strings List of CIDR ranges to add to the IP allowlist - --description string Description of the CA certificate - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --remote-inspection-allowed If set, remote connectivity checks by the Oasis platform are allowed - --remove-cidr-range strings List of CIDR ranges to remove from the IP allowlist -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-metrics-token.md b/site/content/3.12/arangograph/oasisctl/update/update-metrics-token.md deleted file mode 100644 index 2ff4a301aa..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-metrics-token.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Metrics Token -menuTitle: Update Metrics Token -weight: 9 ---- -## oasisctl update metrics token - -Update a metrics token - -``` -oasisctl update metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - --description string Description of the CA certificate - -h, --help help for token - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update metrics](update-metrics.md) - Update metrics resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-metrics.md b/site/content/3.12/arangograph/oasisctl/update/update-metrics.md deleted file mode 100644 index d8fc683f1e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Metrics -menuTitle: Update Metrics -weight: 8 ---- -## oasisctl update metrics - -Update metrics resources - -``` -oasisctl update metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update metrics token](update-metrics-token.md) - Update a metrics token - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-notebook.md b/site/content/3.12/arangograph/oasisctl/update/update-notebook.md deleted file mode 100644 index 2b6fee7bb0..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-notebook.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Notebook -menuTitle: Update Notebook -weight: 10 ---- -## oasisctl update notebook - -Update notebook - -``` -oasisctl update notebook [flags] -``` - -## Options -``` - -d, --description string Description of the notebook - -s, --disk-size int32 Notebook disk size in GiB - -h, --help help for notebook - --name string Name of the notebook - -n, --notebook-id string Identifier of the notebook - -m, --notebook-model string Identifier of the notebook model -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-organization-authentication-providers.md b/site/content/3.12/arangograph/oasisctl/update/update-organization-authentication-providers.md deleted file mode 100644 index 8d8d9be5de..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-organization-authentication-providers.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Organization Authentication Providers -menuTitle: Update Organization Authentication Providers -weight: 13 ---- -## oasisctl update organization authentication providers - -Update allowed authentication providers for an organization the authenticated user has access to - -``` -oasisctl update organization authentication providers [flags] -``` - -## Options -``` - --enable-github If set, allow access from user accounts authentication through Github - --enable-google If set, allow access from user accounts authentication through Google - --enable-microsoft If set, allow access from user accounts authentication through Microsoft - --enable-sso If set, allow access from user accounts authentication through single sign on (sso) - --enable-username-password If set, allow access from user accounts authentication through username-password - -h, --help help for providers - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization authentication](update-organization-authentication.md) - Update authentication settings for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-organization-authentication.md b/site/content/3.12/arangograph/oasisctl/update/update-organization-authentication.md deleted file mode 100644 index 328b81b297..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-organization-authentication.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Authentication -menuTitle: Update Organization Authentication -weight: 12 ---- -## oasisctl update organization authentication - -Update authentication settings for an organization - -``` -oasisctl update organization authentication [flags] -``` - -## Options -``` - -h, --help help for authentication -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update organization authentication providers](update-organization-authentication-providers.md) - Update allowed authentication providers for an organization the authenticated user has access to - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md b/site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md deleted file mode 100644 index 6d860fa8d6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Update Organization Email Domain Restrictions -menuTitle: Update Organization Email Domain Restrictions -weight: 16 ---- -## oasisctl update organization email domain restrictions - -Update which domain restrictions are placed on accessing a specific organization - -``` -oasisctl update organization email domain restrictions [flags] -``` - -## Options -``` - -d, --allowed-domain strings Allowed email domains for users of the organization - -h, --help help for restrictions - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization email domain](update-organization-email-domain.md) - Update email domain specific information for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain.md b/site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain.md deleted file mode 100644 index 57f79b6fbb..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-organization-email-domain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Email Domain -menuTitle: Update Organization Email Domain -weight: 15 ---- -## oasisctl update organization email domain - -Update email domain specific information for an organization - -``` -oasisctl update organization email domain [flags] -``` - -## Options -``` - -h, --help help for domain -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization email](update-organization-email.md) - Update email specific information for an organization -* [oasisctl update organization email domain restrictions](update-organization-email-domain-restrictions.md) - Update which domain restrictions are placed on accessing a specific organization - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-organization-email.md b/site/content/3.12/arangograph/oasisctl/update/update-organization-email.md deleted file mode 100644 index 89f05ed737..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-organization-email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Email -menuTitle: Update Organization Email -weight: 14 ---- -## oasisctl update organization email - -Update email specific information for an organization - -``` -oasisctl update organization email [flags] -``` - -## Options -``` - -h, --help help for email -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update organization email domain](update-organization-email-domain.md) - Update email domain specific information for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-organization.md b/site/content/3.12/arangograph/oasisctl/update/update-organization.md deleted file mode 100644 index 670d291842..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-organization.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Organization -menuTitle: Update Organization -weight: 11 ---- -## oasisctl update organization - -Update an organization the authenticated user has access to - -``` -oasisctl update organization [flags] -``` - -## Options -``` - --description string Description of the organization - -h, --help help for organization - --name string Name of the organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update organization authentication](update-organization-authentication.md) - Update authentication settings for an organization -* [oasisctl update organization email](update-organization-email.md) - Update email specific information for an organization - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-policy-add-binding.md b/site/content/3.12/arangograph/oasisctl/update/update-policy-add-binding.md deleted file mode 100644 index df89601244..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-policy-add-binding.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Policy Add Binding -menuTitle: Update Policy Add Binding -weight: 19 ---- -## oasisctl update policy add binding - -Add a role binding to a policy - -``` -oasisctl update policy add binding [flags] -``` - -## Options -``` - --group-id strings Identifiers of the groups to add bindings for - -h, --help help for binding - -r, --role-id string Identifier of the role to bind to - -u, --url string URL of the resource to update the policy for - --user-id strings Identifiers of the users to add bindings for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy add](update-policy-add.md) - Add to a policy - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-policy-add.md b/site/content/3.12/arangograph/oasisctl/update/update-policy-add.md deleted file mode 100644 index 42e655fe7c..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-policy-add.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Policy Add -menuTitle: Update Policy Add -weight: 18 ---- -## oasisctl update policy add - -Add to a policy - -``` -oasisctl update policy add [flags] -``` - -## Options -``` - -h, --help help for add -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update policy add binding](update-policy-add-binding.md) - Add a role binding to a policy - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-policy-delete-binding.md b/site/content/3.12/arangograph/oasisctl/update/update-policy-delete-binding.md deleted file mode 100644 index 602bc93e93..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-policy-delete-binding.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Policy Delete Binding -menuTitle: Update Policy Delete Binding -weight: 21 ---- -## oasisctl update policy delete binding - -Delete a role binding from a policy - -``` -oasisctl update policy delete binding [flags] -``` - -## Options -``` - --group-id strings Identifiers of the groups to delete bindings for - -h, --help help for binding - -r, --role-id string Identifier of the role to delete bind for - -u, --url string URL of the resource to update the policy for - --user-id strings Identifiers of the users to delete bindings for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy delete](update-policy-delete.md) - Delete from a policy - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-policy-delete.md b/site/content/3.12/arangograph/oasisctl/update/update-policy-delete.md deleted file mode 100644 index dec2527590..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-policy-delete.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Policy Delete -menuTitle: Update Policy Delete -weight: 20 ---- -## oasisctl update policy delete - -Delete from a policy - -``` -oasisctl update policy delete [flags] -``` - -## Options -``` - -h, --help help for delete -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update policy delete binding](update-policy-delete-binding.md) - Delete a role binding from a policy - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-policy.md b/site/content/3.12/arangograph/oasisctl/update/update-policy.md deleted file mode 100644 index 132c0b4123..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-policy.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Update Policy -menuTitle: Update Policy -weight: 17 ---- -## oasisctl update policy - -Update a policy - -``` -oasisctl update policy [flags] -``` - -## Options -``` - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update policy add](update-policy-add.md) - Add to a policy -* [oasisctl update policy delete](update-policy-delete.md) - Delete from a policy - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-private-endpoint-service.md b/site/content/3.12/arangograph/oasisctl/update/update-private-endpoint-service.md deleted file mode 100644 index 81aa0917f6..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-private-endpoint-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Oasisctl Update Private Endpoint Service -menuTitle: Update Private Endpoint Service -weight: 24 ---- -## oasisctl update private endpoint service - -Update a Private Endpoint Service attached to an existing deployment - -``` -oasisctl update private endpoint service [flags] -``` - -## Options -``` - --alternate-dns-name strings DNS names used for the deployment in the private network - --aws-principal strings List of AWS Principals from which a Private Endpoint can be created (Format: <AccountID>[/Role/<RoleName>|/User/<UserName>]) - --azure-client-subscription-id strings List of Azure subscription IDs from which a Private Endpoint can be created - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - --description string Description of the private endpoint service - --enable-private-dns Enable private DNS (applicable for AWS only) - --gcp-project strings List of GCP projects from which a Private Endpoint can be created - -h, --help help for service - --name string Name of the private endpoint service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update private endpoint](update-private-endpoint.md) - - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-private-endpoint.md b/site/content/3.12/arangograph/oasisctl/update/update-private-endpoint.md deleted file mode 100644 index a66ead3924..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Private Endpoint -menuTitle: Update Private Endpoint -weight: 23 ---- -## oasisctl update private endpoint - - - -``` -oasisctl update private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update private](update-private.md) - Update private resources -* [oasisctl update private endpoint service](update-private-endpoint-service.md) - Update a Private Endpoint Service attached to an existing deployment - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-private.md b/site/content/3.12/arangograph/oasisctl/update/update-private.md deleted file mode 100644 index 8c414612ac..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Private -menuTitle: Update Private -weight: 22 ---- -## oasisctl update private - -Update private resources - -``` -oasisctl update private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update private endpoint](update-private-endpoint.md) - - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-project.md b/site/content/3.12/arangograph/oasisctl/update/update-project.md deleted file mode 100644 index 0965a3684e..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-project.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Project -menuTitle: Update Project -weight: 25 ---- -## oasisctl update project - -Update a project the authenticated user has access to - -``` -oasisctl update project [flags] -``` - -## Options -``` - --description string Description of the project - -h, --help help for project - --name string Name of the project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/update/update-role.md b/site/content/3.12/arangograph/oasisctl/update/update-role.md deleted file mode 100644 index 58d7f2e8ab..0000000000 --- a/site/content/3.12/arangograph/oasisctl/update/update-role.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Role -menuTitle: Update Role -weight: 26 ---- -## oasisctl update role - -Update a role the authenticated user has access to - -``` -oasisctl update role [flags] -``` - -## Options -``` - --add-permission strings Permissions to add to the role - --description string Description of the role - -h, --help help for role - --name string Name of the role - -o, --organization-id string Identifier of the organization - --remove-permission strings Permissions to remove from the role - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.12/arangograph/oasisctl/upgrade.md b/site/content/3.12/arangograph/oasisctl/upgrade.md deleted file mode 100644 index 8d77aa3ecf..0000000000 --- a/site/content/3.12/arangograph/oasisctl/upgrade.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Upgrade -menuTitle: Upgrade -weight: 29 ---- -## oasisctl upgrade - -Upgrade Oasisctl tool - -## Synopsis -Check the latest, compatible version and upgrade this tool to that. - -``` -oasisctl upgrade [flags] -``` - -## Options -``` - -d, --dry-run Do an upgrade without applying the version. - -f, --force Force an upgrade even if the versions match. - -h, --help help for upgrade -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/version.md b/site/content/3.12/arangograph/oasisctl/version.md deleted file mode 100644 index e8e5ee7c8b..0000000000 --- a/site/content/3.12/arangograph/oasisctl/version.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl Version -menuTitle: Version -weight: 30 ---- -## oasisctl version - -Show the current version of this tool - -``` -oasisctl version [flags] -``` - -## Options -``` - -h, --help help for version -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.12/arangograph/oasisctl/wait/_index.md b/site/content/3.12/arangograph/oasisctl/wait/_index.md deleted file mode 100644 index 1ccac25259..0000000000 --- a/site/content/3.12/arangograph/oasisctl/wait/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Wait -menuTitle: Wait -weight: 31 ---- -## oasisctl wait - -Wait for a status change - -``` -oasisctl wait [flags] -``` - -## Options -``` - -h, --help help for wait -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl wait deployment](wait-deployment.md) - Wait for a deployment to reach the ready status - diff --git a/site/content/3.12/arangograph/oasisctl/wait/wait-deployment.md b/site/content/3.12/arangograph/oasisctl/wait/wait-deployment.md deleted file mode 100644 index ddc2c82d76..0000000000 --- a/site/content/3.12/arangograph/oasisctl/wait/wait-deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Wait Deployment -menuTitle: Wait Deployment -weight: 1 ---- -## oasisctl wait deployment - -Wait for a deployment to reach the ready status - -``` -oasisctl wait deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --timeout duration How long to wait for the deployment to reach the ready status (default 20m0s) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl wait](_index.md) - Wait for a status change - diff --git a/site/content/3.12/arangograph/organizations/_index.md b/site/content/3.12/arangograph/organizations/_index.md deleted file mode 100644 index 083b746dda..0000000000 --- a/site/content/3.12/arangograph/organizations/_index.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Organizations in ArangoGraph -menuTitle: Organizations -weight: 10 -description: >- - How to manage organizations and what type of packages ArangoGraph offers ---- -An ArangoGraph organizations is a container for projects. An organization -typically represents a (commercial) entity such as a company, a company division, -an institution, or a non-profit organization. - -**<u>Organizations</u> → Projects → Deployments** - -Users can be members of one or more organizations. However, you can only be a -member of one _Free-to-try_ tier organization at a time. - -## How to switch between my organizations - -1. The first entry in the main navigation (with a double arrow icon) indicates - the current organization. -2. Click it to bring up a dropdown menu to select another organization of which you - are a member. -3. The overview will open for the selected organization, showing the number of - projects, the tier and when it was created. - -![ArangoGraph Organization Switcher](../../../images/arangograph-organization-switcher.png) - -![ArangoGraph Organization Overview](../../../images/arangograph-organization-overview.png) - -## ArangoGraph Packages - -With the ArangoGraph Insights Platform, your organization can choose one of the -following packages. - -### Free Trial - -ArangoGraph comes with a free-to-try tier that lets you test ArangoGraph for -free for 14 days. You can get started quickly, without needing to enter a -credit card. - -The free trial gives you access to: -- One small deployment (4GB) in a region of your choice for 14 days -- Local backups -- One ArangoGraph Notebook for learning and data science - -After the trial period, your deployment will be deleted automatically. - -### On-Demand - -Add a payment method to gain access to ArangoGraph's full feature set. -Pay monthly via a credit card for what you actually use. - -This package unlocks all ArangoGraph functionality, including: -- Multiple and larger deployments -- Backups to cloud storage, with multi-region support -- Enhanced security features such as Private Endpoints - -### Committed - -Commit up-front for a year and pay via the Sales team. This package provides -the same flexibility of On-Demand, but at a lower price. - -In addition, you gain access to: -- 24/7 Premium Support -- ArangoDB Professional Services Engagements -- Ability to transact via the AWS and GCP marketplaces - -To take advantage of this, you need to get in touch with the ArangoDB -team. [Contact us](https://www.arangodb.com/contact/) for more details. - -## How to unlock all features - -You can unlock all features in ArangoGraph at any time by adding your billing -details and a payment method. As soon as you have added a payment method, all -ArangoGraph functionalities are immediately unlocked. From that point on, your -deployments will no longer expire and you can create more and larger deployments. - -See [Billing: How to add billing details / payment methods](billing.md) - -![ArangoGraph Billing](../../../images/arangograph-billing.png) - -## How to create a new organization - -See [My Account: How to create a new organization](../my-account.md#how-to-create-a-new-organization) - -## How to restrict access to an organization - -If you want to restrict access to an organization, you can do it by specifying which authentication providers are accepted for users trying to access the organization. For more information, refer to the [Access Control](../security-and-access-control/_index.md#restricting-access-to-organizations) section. - -## How to delete the current organization - -{{< danger >}} -Removing an organization implies the deletion of projects and deployments. -This operation cannot be undone and **all deployment data will be lost**. -Please proceed with caution. -{{< /danger >}} - -1. Click **Overview** in the **Organization** section of the main navigation. -2. Open the **Danger zone** tab. -3. Click the **Delete organization** button. -4. Enter `Delete!` to confirm and click **Yes**. - -{{< info >}} -If you are no longer a member of any organization, then a new organization is -created for you when you log in again. -{{< /info >}} - -{{< tip >}} -If the organization has a locked resource (a project or a deployment), you need to [unlock](../security-and-access-control/_index.md#locked-resources) -that resource first to be able to delete the organization. -{{< /tip >}} diff --git a/site/content/3.12/arangograph/organizations/billing.md b/site/content/3.12/arangograph/organizations/billing.md deleted file mode 100644 index 9b892b5500..0000000000 --- a/site/content/3.12/arangograph/organizations/billing.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Billing in ArangoGraph -menuTitle: Billing -weight: 10 -description: >- - How to manage billing details and payment methods in ArangoGraph ---- -## How to add billing details - -1. In the main navigation menu, click the **Organization** icon. -2. Click **Billing** in the **Organization** section. -3. In the **Billing Details** section, click **Edit**. -4. Enter your company name, billing address, and EU VAT identification number (if applicable). -5. Optionally, enter the email address(es) to which invoices should be emailed - to automatically. -6. Click **Save**. - -![ArangoGraph Billing Details](../../../images/arangograph-billing-details.png) - -## How to add a payment method - -1. In the main navigation menu, click the **Organization** icon. -2. Click **Billing** in the **Organization** section. -3. In the **Payment methods** section, click **Add**. -4. Fill out the form with your credit card details. Currently, a credit card is the only available payment method. -5. Click **Save**. - -![ArangoGraph Payment Method](../../../images/arangograph-add-payment-method-credit-card.png) - -{{% comment %}} -TODO: Need screenshot with invoice - -### How to view invoices - - -{{% /comment %}} diff --git a/site/content/3.12/arangograph/organizations/credits-and-usage.md b/site/content/3.12/arangograph/organizations/credits-and-usage.md deleted file mode 100644 index 34dafb8488..0000000000 --- a/site/content/3.12/arangograph/organizations/credits-and-usage.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Credits & Usage in ArangoGraph -menuTitle: Credits & Usage -weight: 15 -description: >- - Credits give you access to a flexible prepaid model, so you can allocate them - across multiple deployments as needed ---- -{{< info >}} -Credits are only available if your organization has signed up for -ArangoGraph's [Committed](../organizations/_index.md#committed) package. -{{< /info >}} - -The ArangoGraph credit model is a versatile prepaid model that allows you to -purchase credits and use them in a flexible way, based on what you have running -in ArangoGraph. - -Instead of purchasing a particular deployment for a year, you can purchase a -number of ArangoGraph credits that expire a year after purchase. These credits -are then consumed over that time period, based on the deployments you run -in ArangoGraph. - -For example, a OneShard (three nodes) A64 deployment consumes more credits per -hour than a smaller deployment such as A8. If you are running multiple deployments, -like pre-production environments or for different use-cases, these would each consume -from the same credit balance. However, if you are not running any deployments -and do not have any backup storage, then none of your credits will be consumed. - -{{< tip >}} -To purchase credits for your organization, you need to get in touch with the -ArangoDB team. [Contact us](https://www.arangodb.com/contact/) for more details. -{{< /tip >}} - -There are a number of benefits that ArangoGraph credits provide: -- **Adaptability**: The pre-paid credit model allows you to adapt your usage to - changing project requirements or fluctuating workloads. By enabling the use of - credits for various instance types and sizes, you can easily adjust your - resource allocation. -- **Efficient handling of resources**: With the ability to purchase credits in - advance, you can better align your needs in terms of resources and costs. - You can purchase credits in bulk and then allocate them as needed. -- **Workload Optimization**: By having a clear view of credit consumption and - remaining balance, you can identify inefficiencies to further optimize your - infrastructure, resulting in cost savings and better performance. - -## How to view the credit usage - -1. In the main navigation, click the **Organization** icon. -2. Click **Credits & Usage** in the **Organization** section. -3. In the **Credits & Usage** page, you can: - - See the remaining credit balance. - - Track your total credit balance. - - See a projection of when you will run out of credits, based on the last 30 days of usage. - - Get a detailed consumption report in PDF format that shows: - - The number of credits you had at the start of the month. - - The number of credits consumed in the month. - - The number of credits remaining. - - The number of credits consumed for each deployment. - -![ArangoGraph Credits and Usage](../../../images/arangograph-credits-and-usage.png) - -## FAQs - -### Are there any configuration constraints for using the credits? - -No. Credits are designed to be used completely flexibly. You can use all of your -credits for multiple small deployments (i.e. A8s) or you can use them for a single -large deployment (i.e. A256), or even multiple large deployments, as long as you -have enough credits remaining. - -### What is the flexibility of moving up or down in configuration size of the infrastructure? - -You can move up sizes in configuration at any point by editing your deployment -within ArangoGraph, once every 6 hours to allow for in-place disk expansion. - -### Is there a limit to how many deployments I can use my credits on? - -There is no specific limit to the number of deployments you can use your credits -on. The credit model is designed to provide you with the flexibility to allocate -credits across multiple deployments as needed. This enables you to effectively -manage and distribute your resources according to your specific requirements and -priorities. However, it is essential to monitor your credit consumption to ensure -that you have sufficient credits to cover your deployments. - -### Do the credits I purchase expire? - -Yes, credits expire 1 year after purchase. You should ensure that you consume -all of these credits within the year. - -### Can I make multiple purchases of credits within a year? - -As an organization’s usage of ArangoGraph grows, particularly in the initial -phases of application development and early production release, it is common -to purchase a smaller credit package that is later supplemented by a larger -credit package part-way through the initial credit expiry term. -In this case, all sets of credits will be available for ArangoGraph consumption -as a single credit balance. The credits with the earlier expiry date are consumed -first to avoid credit expiry where possible. - -### Can I purchase a specific number of credits (i.e. 3361, 4185)? - -ArangoGraph offers a variety of predefined credit packages designed to -accommodate different needs and stages of the application lifecycle. -For any credit purchasing needs, please [contact us](https://www.arangodb.com/contact/) -and we are happy to help find an appropriate package for you. - -### How quickly will the credits I purchase be consumed? - -The rate at which your purchased credits will be consumed depends on several -factors, including the type and size of instances you deploy, the amount of -resources used, and the duration of usage. Each machine size has an hourly credit -consumption rate, and the overall rate of credit consumption will increase for -larger sizes or for more machines/deployments. Credits will also be consumed for -any variable usage charges such as outbound network traffic and backup storage. - -### How can I see how many credits I have remaining? - -All details about credits, including how many credits have been purchased, -how many remain, and how they are being consumed are available in the -**Credits & Usage** page within the ArangoGraph web interface. - -### I have a large sharded deployment, how do I know how many credits it will consume? - -If you are using credits, then you will be able to see how many credits your -configured deployment will consume when [creating](../deployments/_index.md#how-to-create-a-new-deployment) -or [editing a deployment](../deployments/_index.md#how-to-edit-a-deployment). - -You can download a detailed consumption report in the -[**Credits & Usage** section](#how-to-view-the-credit-usage). It shows you the -number of credits consumed by any deployment you are creating or editing. - -All users can see the credit price of each node size in the **Pricing** section. - -### What happens if I run out of credits? - -If you run out of credits, your access to ArangoGraph's services and resources -will be temporarily suspended until you purchase additional credits. - -### Can I buy credits for a short time period (e.g. 2 months)? - -No, you cannot but credits with an expiry of less than 12 months. -If you require credits for a shorter time frame, such as 2 months, you can still -purchase one of the standard credit packages and consume the credits as needed -during that time. You may opt for a smaller credit package that aligns with your -expected usage during the desired period, rather than the full year’s expected usage. -Although the credits will have a longer expiration period, this allows you to have -the flexibility of utilizing the remaining credits for any future needs. \ No newline at end of file diff --git a/site/content/3.12/arangograph/organizations/users-and-groups.md b/site/content/3.12/arangograph/organizations/users-and-groups.md deleted file mode 100644 index abed36697b..0000000000 --- a/site/content/3.12/arangograph/organizations/users-and-groups.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Users and Groups in ArangoGraph -menuTitle: Users & Groups -weight: 5 -description: >- - How to manage individual members and user groups in ArangoGraph ---- -## Users, groups & members - -When you use ArangoGraph, you are logged in as a user. -A user has properties such as name & email address. -Most important of the user is that it serves as an identity of a person. - -A user is member of one or more organizations in ArangoGraph. -You can become a member of an organization in the following ways: - -- Create a new organization. You will become the first member and owner of that - organization. -- Be invited to join an organization. Once accepted (by the invited user), this - user becomes a member of the organization. - -If the number of members of an organization becomes large, it helps to group -users. In ArangoGraph a group is part of an organization and a group contains -a list of users. All users of the group must be member of the owning organization. - -In the **People** section of the dashboard you can manage users, groups and -invites for the organization. - -To edit permissions of members see [Access Control](../security-and-access-control/_index.md). - -## Members - -Members are a list of users that can access an organization. - -![ArangoGraph Member Access Control](../../../images/arangograph-access-control-members.png) - -### How to add a new member to the organization - -1. In the main navigation, click the __Organization__ icon. -2. Click __Members__ in the __People__ section. -3. Optionally, click the __Invites__ entry. -4. Click the __Invite new member__ button. -5. In the form that appears, enter the email address of the person you want to - invite. -6. Click the __Create__ button. -7. An email with an organization invite will now be sent to the specified - email address. -8. After accepting the invite the person will be added to the organization - [members](#members). - -![ArangoGraph Organization Invites](../../../images/arangograph-new-invite.png) - -### How to respond to an organization invite - -See [My Account: How to respond to my invites](../my-account.md#how-to-respond-to-my-invites) - -### How to remove a member from the organization - -1. Click __Members__ in the __People__ section of the main navigation. -2. Delete a member by pressing the __recycle bin__ icon in the __Actions__ column. -3. Confirm the deletion in the dialog that pops up. - -{{< info >}} -You cannot delete members who are organization owners. -{{< /info >}} - -### How to make a member an organization owner - -1. Click __Members__ in the __People__ section of the main navigation. -2. You can convert a member to an organization owner by pressing the __Key__ icon - in the __Actions__ column. -3. You can convert a member back to a normal user by pressing the __User__ icon - in the __Actions__ column. - -## Groups - -A group is a defined set of members. Groups can then be bound to roles. These -bindings contribute to the respective organization, project or deployment policy. - -![ArangoGraph Groups](../../../images/arangograph-groups.png) - -### How to create a new group - -1. Click __Groups__ in the __People__ section of the main navigation. -2. Press the __New group__ button. -3. Enter a name and optionally a description for your new group. -4. Select the members you want to be part of the group. -5. Press the __Create__ button. - -![ArangoGraph New Group](../../../images/arangograph-new-group.png) - -### How to view, edit or remove a group - -1. Click __Groups__ in the __People__ section of the main navigation. -2. Click an icon in the __Actions__ column: - - __Eye__: View group - - __Pencil__: Edit group - - __Recycle bin__: Delete group - -You can also click a group name to view it. There are buttons to __Edit__ and -__Delete__ the currently viewed group. - -![ArangoGraph Group](../../../images/arangograph-group.png) - -{{< info >}} -The groups __Organization members__ and __Organization owners__ are virtual groups -and cannot be changed. They always reflect the current set of organization -members and owners. -{{< /info >}} - -## Invites - -### How to create a new organization invite - -See [How to add a new member to the organization](#how-to-add-a-new-member-to-the-organization) - -### How to view the status of invitations - -1. Click __Invites__ in the __People__ section of the main navigation. -2. The created invites are displayed, grouped by status __Pending__, - __Accepted__ and __Rejected__. -3. You may delete pending invites by clicking the __recycle bin__ icon in the - __Actions__ column. - -![ArangoGraph Organization Invites](../../../images/arangograph-org-invites.png) diff --git a/site/content/3.12/arangograph/projects.md b/site/content/3.12/arangograph/projects.md deleted file mode 100644 index f4efd27833..0000000000 --- a/site/content/3.12/arangograph/projects.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Projects in ArangoGraph -menuTitle: Projects -weight: 15 -description: >- - How to manage projects and IP allowlists in ArangoGraph ---- -ArangoGraph projects can represent organizational units such as teams, -product groups, environments (e.g. staging vs. production). You can have any -number of projects under one organization. - -**Organizations → <u>Projects</u> → Deployments** - -Projects are a container for related deployments, certificates & IP allowlists. -Projects also come with their own policy for access control. You can have any -number of deployment under one project. - -![ArangoGraph Projects Overview](../../images/arangograph-projects-overview.png) - -## How to create a new project - -1. In the main navigation, click the __Dashboard__ icon. -2. Click __Projects__ in the __Dashboard__ section. -3. Click the __New project__ button. -4. Enter a name and optionally a description for your new project. -5. Click the __Create__ button. -6. You will be taken to the project page. -7. To change the name or description, click either at the top of the page. - -![ArangoGraph New Project](../../images/arangograph-new-project.png) - -![ArangoGraph Project Summary](../../images/arangograph-project.png) - -{{< info >}} -Projects contain exactly **one policy**. Within that policy, you can define -role bindings to regulate access control on a project level. -{{< /info >}} - -## How to create a new deployment - -See [Deployments: How to create a new deployment](deployments/_index.md#how-to-create-a-new-deployment) - -## How to delete a project - -{{< danger >}} -Deleting a project will delete contained deployments, certificates & IP allowlists. -This operation is **irreversible**. -{{< /danger >}} - -1. Click __Projects__ in the __Dashboard__ section of the main navigation. -2. Click the __recycle bin__ icon in the __Actions__ column of the project to be deleted. -3. Enter `Delete!` to confirm and click __Yes__. - -{{< tip >}} -If the project has a locked deployment, you need to [unlock](security-and-access-control/_index.md#locked-resources) -it first to be able to delete the project. -{{< /tip >}} - -## How to manage IP allowlists - -IP allowlists let you limit access to your deployment to certain IP ranges. -It is optional, but strongly recommended to do so. - -You can create an allowlist as part of a project. - -1. Click a project name in the __Projects__ section of the main navigation. -2. Click the __Security__ entry. -3. In the __IP allowlists__ section, click: - - The __New IP allowlist__ button to create a new allowlist. - When creating or editing a list, you can add comments - in the __Allowed CIDR ranges (1 per line)__ section. - Everything after `//` or `#` is considered a comment until the end of the line. - - A name or the __eye__ icon in the __Actions__ column to view the allowlist. - - The __pencil__ icon to edit the allowlist. - You can also view the allowlist and click the __Edit__ button. - - The __recycle bin__ icon to delete the allowlist. - -## How to manage role bindings - -See: -- [Access Control: How to view, edit or remove role bindings of a policy](security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy) -- [Access Control: How to add a role binding to a policy](security-and-access-control/_index.md#how-to-add-a-role-binding-to-a-policy) diff --git a/site/content/3.12/arangograph/security-and-access-control/single-sign-on/_index.md b/site/content/3.12/arangograph/security-and-access-control/single-sign-on/_index.md deleted file mode 100644 index 1004352974..0000000000 --- a/site/content/3.12/arangograph/security-and-access-control/single-sign-on/_index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Single Sign-On (SSO) in ArangoGraph -menuTitle: Single Sign-On -weight: 10 -description: >- - ArangoGraph supports **Single Sign-On** (SSO) authentication using - **Security Assertion Markup language 2.0** (SAML 2.0) ---- -{{< info >}} -To enable the Single Sign-On (SSO) feature, get in touch with the ArangoGraph -team via **Request Help**, available in the left sidebar menu of the -ArangoGraph Dashboard. -{{< /info >}} - -## About SAML 2.0 - -The Security Assertion Markup language 2.0 (SAML 2.0) is an open standard created -to provide cross-domain single sign-on (SSO). It allows you to authenticate in -multiple web applications by using a single set of login credentials. - -SAML SSO works by transferring user authentication data from the identity -provider (IdP) to the service provider (SP) through an exchange of digitally -signed XML documents. - -## IdP-initiated versus SP-initiated SSO - -There are generally two methods for starting Single Sign-On: - -- **Identity Provider Initiated** (IdP-initiated): - You log into the Identity Provider and are then redirected to ArangoGraph. -- **Service Provider Initiated** (SP-initiated): - You access the ArangoGraph site which then redirects you to the - Identity Provider for authentication. - -**ArangoGraph only supports SP-initiated SSO** because IdP-Initiated SSO is -vulnerable to Man-in-the-Middle attacks. In order to initiate the SSO login -process, you must start at ArangoGraph. - -## Configure SAML 2.0 using Okta - -You can enable SSO for your ArangoGraph organization using Okta as an Identity -Provider (IdP). For more information about Okta, please refer to the -[Okta Documentation](https://help.okta.com/en-us/Content/index.htm?cshid=csh-index). - -### Create the SAML app integration in Okta - -1. Sign in to your Okta account and select **Applications** from the left sidebar menu. -2. Click **Create App Integration**. -3. In the **Create a new app integration** dialog, select **SAML 2.0**. - - ![ArangoGraph Create Okta App Integration](../../../../images/arangograph-okta-create-integration.png) -4. In the **General Settings**, specify a name for your integration and click **Next**. - - ![ArangoGraph Okta Integration Name](../../../../images/arangograph-okta-integration-name.png) -5. Configure the SAML settings: - - For **Single sign-on URL**, use `https://auth.arangodb.com/login/callback?connection=ORG_ID` - - For **Audience URI (SP Entity ID)**, use `urn:auth0:arangodb:ORG_ID` - - ![ArangoGraph Okta SAML General Settings](../../../../images/arangograph-okta-saml-general-settings.png) - -6. Replace **ORG_ID** with your organization identifier from the - ArangoGraph Dashboard. To find your organization ID, go to the **User Toolbar** - in the top right corner, which is accessible from every view of the Dashboard, - and click **My organizations**. - - If, for example, your organization ID is 14587062, here are the values you - would use when configuring the SAML settings: - - `https://auth.arangodb.com/login/callback?connection=14587062` - - `urn:auth0:arangodb:14587062` - - ![ArangoGraph Organization ID](../../../../images/arangograph-organization-id.png) -7. In the **Attribute Statements** section, add custom attributes as seen in the image below: - - email: `user.email` - - given_name: `user.firstName` - - family_name: `user.lastName` - - picture: `user.profileUrl` - - This step consists of a mapping between the ArangoGraph attribute names and - Okta attribute names. The values of these attributes are automatically filled - in based on the users list that is defined in Okta. - - ![ArangoGraph Okta SAML Attributes](../../../../images/arangograph-okta-saml-attributes.png) -8. Click **Next**. -9. In the **Configure feedback** section, select **I'm an Okta customer adding an internal app**. -10. Click **Finish**. The SAML app integration is now created. - -### SAML Setup - -After creating the app integration, you must perform the SAML setup to finalize -the SSO configuration. - -1. Go to the **SAML Signing Certificates** section, displayed under the **Sign On** tab. -2. Click **View SAML setup instructions**. - - ![ArangoGraph Okta SAML Setup](../../../../images/arangograph-okta-saml-setup.png) -3. The setup instructions include the following items: - - **Identity Provider Single Sign-On URL** - - **Identity Provider Issuer** - - **X.509 Certificate** -4. Copy the IdP settings, download the certificate using the - **Download X.509 certificate** button, and share them with the ArangoGraph - team via an ArangoGraph Support Ticket in order to complete the SSO - configuration. - diff --git a/site/content/3.13/arangograph/_index.md b/site/content/3.13/arangograph/_index.md deleted file mode 100644 index 0e07d4c600..0000000000 --- a/site/content/3.13/arangograph/_index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: ArangoGraph Insights Platform -menuTitle: ArangoGraph -weight: 65 -description: >- - The ArangoGraph Insights Platform provides the entire functionality of - ArangoDB as a service, without the need to run or manage databases yourself -aliases: - - arangograph/changelog ---- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), -formerly called Oasis, provides ArangoDB databases as a Service (DBaaS). -It enables you to use the entire functionality of an ArangoDB cluster -deployment without the need to run or manage the system yourself. - -The ArangoGraph Insights Platform... - -- runs your databases in data centers of the cloud provider - of your choice: Google Cloud Platform (GCP) or Amazon Web Services (AWS). - This optimizes performance and reduces cost. - -- ensures that your databases are always available and - healthy by monitoring them 24/7. - -- ensures that your databases are kept up to date by - installing new versions without service interruption. - -- ensures that your data is safe by providing encryption & - audit logs and making frequent data backups. - -- guarantees that your data always remains your property and - access to it is protected with industry standard safeguards. - -For more information see -[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) - -For quick start guide, see -[Use ArangoDB in the Cloud](../get-started/set-up-a-cloud-instance.md). diff --git a/site/content/3.13/arangograph/api/_index.md b/site/content/3.13/arangograph/api/_index.md deleted file mode 100644 index ee4f21371f..0000000000 --- a/site/content/3.13/arangograph/api/_index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: The ArangoGraph API -menuTitle: ArangoGraph API -weight: 60 -description: >- - Interface to control all resources inside ArangoGraph in a scriptable manner -aliases: - - arangograph-api ---- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), -comes with its own API. This API enables you to control all -resources inside ArangoGraph in a scriptable manner. Typical use cases are spinning -up ArangoGraph deployments during continuous integration and infrastructure as code. - -The ArangoGraph API… - -- is a well-specified API that uses - [Protocol Buffers](https://developers.google.com/protocol-buffers/) - as interface definition and [gRPC](https://grpc.io/) as - underlying protocol. - -- allows for automatic generation of clients for a large list of languages. - A Go client is available out of the box. - -- uses API keys for authentication. API keys impersonate a user and inherit - the permissions of that user. - -- is also available as a command-line tool called [oasisctl](../oasisctl/_index.md). - -- is also available as a - [Terraform plugin](https://github.com/arangodb-managed/terraform-provider-oasis/). - This plugin makes integration of ArangoGraph in infrastructure as code projects - very simple. To learn more, refer to the [plugin documentation](https://registry.terraform.io/providers/arangodb-managed/oasis/latest/docs). - -Also see: -- [github.com/arangodb-managed/apis](https://github.com/arangodb-managed/apis/) -- [API definitions](https://arangodb-managed.github.io/apis/index.html) diff --git a/site/content/3.13/arangograph/api/set-up-a-connection.md b/site/content/3.13/arangograph/api/set-up-a-connection.md deleted file mode 100644 index 7cbc2b76e2..0000000000 --- a/site/content/3.13/arangograph/api/set-up-a-connection.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Get started with the ArangoGraph API -menuTitle: Get started with the API -weight: 5 -description: >- - Quick start guide on how to set up a connection to the ArangoGraph API -aliases: - - ../arangograph-api/getting-started-with-the-api ---- -The instructions below are a quick start guide on how to set up a connection to the ArangoGraph API. - -All examples below will use the Go programming language. -Since the ArangoGraph API is using gRPC with protocol buffers, -all examples can be easily translated to many different languages. - -## Prerequisites - -Make sure that you have already [signed up for ArangoGraph](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). - -## Creating an API key - -1. Go to [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) and login. -2. Click the user icon in the top-right of the dashboard. -3. Select __My API keys__ -4. Click __New API key__ -5. Click __Create__ to select the default settings. -6. You'll now see a dialog showing the __API key ID__ and - the __API key Secret__. This is the only time you will see - the secret, so make sure to store it in a safe place. - -## Create an access token with your API key - -```go -import ( - "context" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "github.com/arangodb-managed/apis/common/auth" - common "github.com/arangodb-managed/apis/common/v1" - data "github.com/arangodb-managed/apis/data/v1" - iam "github.com/arangodb-managed/apis/iam/v1" -) - -... - -// Set up a connection to the API. -tc := credentials.NewTLS(&tls.Config{}) -conn, err := grpc.Dial("https://api.cloud.arangodb.com", - grpc.WithTransportCredentials(tc)) -if err != nil { - // handle error -} - -// Create client for IAM service -iamc := iam.NewIAMServiceClient(conn) - -// Call AuthenticateAPIKey to create token -resp, err := iamc.AuthenticateAPIKey(ctx, - &iam.AuthenticateAPIKeyRequest{ - Id: keyID, - Secret: keySecret, -}) -if err != nil { - // handle error -} -token := resp.GetToken() -``` - -## Make an authenticated API call - -We're going to list all deployments in a project. -The connection and token created in the previous sample is re-used. - -The authentication token is passed as standard `bearer` token to the call. -If Go, there is a helper method (`WithAccessToken`) to create a context using -an authentication token. - -```go -// Create client for Data service -datac := data.NewDataServiceClient(conn) - -// Prepare context with authentication token -ctx := auth.WithAccessToken(context.Background(), token) - -// Call list deployments -list, err := datac.ListDeployments(ctx, - &common.ListOptions{ContextId: myProjectID}) -if err != nil { - // handle error -} -for _, depl := range list.GetItems() { - fmt.Printf("Found deployment with id %s\n", depl.GetId()) -} - -``` - -## API Errors - -All API methods return errors as gRPC error codes. - -The `github.com/arangodb-managed/apis/common/v1` package contains several helpers to check for common errors. - -```go -if common.IsNotFound(err) { - // Error is caused by a not-found situation -} -``` diff --git a/site/content/3.13/arangograph/backups.md b/site/content/3.13/arangograph/backups.md deleted file mode 100644 index e4adcd0a0e..0000000000 --- a/site/content/3.13/arangograph/backups.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -title: Backups in ArangoGraph -menuTitle: Backups -weight: 50 -description: >- - You can manually create backups or use a backup policy to schedule periodic - backups, and both ways allow you to store your backups in multiple regions simultaneously ---- -## How to create backups - -To backup data in ArangoGraph for an ArangoDB installation, navigate to the -**Backups** section of your deployment created previously. - -![Backup ArangoDB](../../images/arangograph-backup-section.png) - -There are two ways to create backups. Create periodic backups using a -**Backup policy**, or create a backup manually. -Both ways allow you to create [backups in multiple regions](#multi-region-backups) -as well. - -### Periodic backups - -Periodic backups are created at a given schedule. To see when the new backup is -due, observe the schedule section. - -![Backup Policy schedule](../../images/arangograph-backup-policy-schedule.png) - -When a new deployment is created, a default **Backup policy** is created for it -as well. This policy creates backups every two hours. To edit this policy -(or any policy), highlight it in the row above and hit the pencil icon. - -![Edit Backup Policy](../../images/arangograph-edit-backup-policy.png) - -These backups are not automatically uploaded. To enable this, use the -**Upload backup to storage** option and choose a retention period that -specifies how long backups are retained after creation. - -If the **Upload backup to storage** option is enabled for a backup policy, -you can then create backups in different regions than the default one. -The regions where the default backup is copied are shown in the -**Additional regions** column in the **Policies** section. - -### Manual backups - -It's also possible to create a backup on demand. To do this, click **Back up now**. - -![Back up Now](../../images/arangograph-back-up-now.png) - -![Back up Now Dialog](../../images/arangograph-back-up-now-dialog.png) - -If you want to manually copy a backup to a different region than the default -one, first ensure that the **Upload backup to storage** option is enabled. -Then, highlight the backup row and use the -**Copy backup to a different region** button from the **Actions** column. - -The source backup ID from -which the copy is created is displayed in the **Copied from Backup** column. - -![Copy backup to a different region](../../images/arangograph-copy-backup-different-region.png) - -![Multiple Backups](../../images/arangograph-multiple-backups.png) - -### Uploading backups - -By default, a backup is not uploaded to the cloud, instead it remains on the -servers of the deployment. To make a backup that is resilient against server -(disk) failures, upload the backup to cloud storage. - -When the **Upload backup to cloud storage** option is enabled, the backup is -preserved for a long time and does not occupy any disk space on the servers. -This also allows copying the backup to different regions and it can be -configured in the **Multiple region backup** section. - -Uploaded backups are -required for [cloning](#how-to-clone-deployments-using-backups). - -#### Best practices for uploading backups - -When utilizing the **Upload backup to cloud storage** feature, a recommended -approach is to implement a backup strategy that balances granularity and storage -efficiency. - -One effective strategy involves creating a combination of backup intervals and -retention periods. For instance, consider the following example: - -1. Perform a backup every 4 hours with a retention period of 24 hours. This - provides frequent snapshots of your data, allowing you to recover recent - changes. -2. Perform a backup every day with a retention period of a week. Daily backups - offer a broader time range for recovery, enabling you to restore data from - any point within the past week. -3. Perform a backup every week with a retention period of a month. Weekly - backups allow you to recover from more extensive data. -4. Perform a backup every month with a retention period of a year. Monthly - backups provide a long-term perspective, enabling you to restore data from - any month within the past year. - -This backup strategy offers good granularity, providing multiple recovery -options for different timeframes. By implementing this approach, you have a -total number of backups that is considerable lower in comparison to other -alternatives such as having hourly backups with a retention period of a year. - -## Multi-region backups - -Using the multi-region backup feature, you can store backups in multiple regions -simultaneously either manually or automatically as part of a **Backup policy**. -If a backup created in one region goes down, it is still available in other -regions, significantly improving reliability. - -Multiple region backup is only available when the -**Upload backup to cloud storage** option is enabled. - -![Multiple Region Backup](../../images/arangograph-multi-region-backup.png) - -## How to restore backups - -To restore a database from a backup, highlight the desired backup and click the restore icon. - -{{< warning >}} -All current data will be lost when restoring. To make sure that new data that -has been inserted after the backup creation is also restored, create a new -backup before using the **Restore Backup** feature. - -During restore, the deployment is temporarily not available. -{{< /warning >}} - -![Restore From Backup](../../images/arangograph-restore-from-backup.png) - -![Restore From Backup Dialog](../../images/arangograph-restore-from-backup-dialog.png) - -![Restore From Backup Status Pending](../../images/arangograph-restore-from-backup-status-pending.png) - -![Restore From Backup Status Restored](../../images/arangograph-restore-from-backup-status-restored.png) - -## How to clone deployments using backups - -Creating a deployment from a backup allows you to duplicate an existing -deployment with all its data, for example, to create a test environment or to -move to a different cloud provider or region within ArangoGraph. - -{{< info >}} -This feature is only available if the backup you wish to clone has been -uploaded to cloud storage. -{{< /info >}} - -{{< info >}} -The cloned deployment will have the exact same features as the previous -deployment including node size and model. The cloud provider and the region -can stay the same or you can select a different one. -For restoring a deployment as quick as possible, it is recommended to create a -deployment in the same region as where the backup resides to avoid cross-region -data transfer. -The data contained in the backup will be restored to this new deployment. - -The *root password* for this deployment will be different. -{{< /info >}} - -1. Highlight the backup you wish to clone from and hit **Clone backup to new deployment**. - - ![ArangoGraph Clone Deployment From Backup](../../images/arangograph-clone-deployment-from-backup.png) - -2. Choose whether the clone should be created using the current provider and in - the same region as the backup or using a different provider, a different region, - or both. - - ![ArangoGraph Clone Deployment Select Region](../../images/arangograph-clone-deployment-select.png) - -3. The view should navigate to the new deployment being bootstrapped. - - ![ArangoGraph Cloned Deployment](../../images/arangograph-cloned-deployment.png) - -This feature is also available through [oasisctl](oasisctl/_index.md). diff --git a/site/content/3.13/arangograph/data-loader/_index.md b/site/content/3.13/arangograph/data-loader/_index.md deleted file mode 100644 index 7955fcb47a..0000000000 --- a/site/content/3.13/arangograph/data-loader/_index.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Load your data into ArangoGraph -menuTitle: Data Loader -weight: 22 -description: >- - Load your data into ArangoGraph and transform it into richly-connected graph - structures, without needing to write any code or deploy any infrastructure ---- - -ArangoGraph provides different ways of loading your data into the platform, -based on your migration use case. - -## Transform data into a graph - -The ArangoGraph Data Loader allows you to transform existing data from CSV file -formats into data that can be analyzed by the ArangoGraph platform. - -You provide your data in CSV format, a common format used for exports of data -from various systems. Then, using a no-code editor, you can model the schema of -this data and the relationships between them. This allows you to ingest your -existing datasets into your ArangoGraph database, without the need for any -development effort. - -You can get started in a few easy steps. - -1. **Create database**: - Choose an existing database or create a new one and enter a name for your new graph. - -2. **Add files**: - Drag and drop your data files in CSV format. - -3. **Design your graph**: - Model your graph schema by adding nodes and connecting them via edges. - -4. **Import data**: - Once you are ready, save and start the import. The resulting graph is an - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) with its - corresponding collections, available in your ArangoDB web interface. - -Follow this [working example](../data-loader/example.md) to see how easy it is -to transform existing data into a graph. - -## Import data to the cloud - -To import data from various files into collections **without creating a graph**, -get the ArangoDB client tools for your operating system from the -[download page](https://arangodb.com/download-major/). - -- To import data to ArangoGraph from an existing ArangoDB instance, see - [arangodump](../../components/tools/arangodump/) and - [arangorestore](../../components/tools/arangorestore/). -- To import pre-existing data in JSON, CSV, or TSV format, see - [arangoimport](../../components/tools/arangoimport/). - -## How to access the Data Loader - -1. If you do not have a deployment yet, [create a deployment](../deployments/_index.md#how-to-create-a-new-deployment) first. -2. Open the deployment you want to load data into. -3. In the **Load Data** section, click the **Load your data** button. -4. Select your migration use case. - -![ArangoGraph Data Loader Migration Use Cases](../../../images/arangograph-data-loader-migration-use-cases.png) \ No newline at end of file diff --git a/site/content/3.13/arangograph/data-loader/add-files.md b/site/content/3.13/arangograph/data-loader/add-files.md deleted file mode 100644 index 114b588e40..0000000000 --- a/site/content/3.13/arangograph/data-loader/add-files.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Add files into Data Loader -menuTitle: Add files -weight: 5 -description: >- - Provide your set of files in CSV format containing the data to be imported ---- - -The Data Loader allows you to upload your data files in CSV format into -ArangoGraph and then use these data sources to design a graph using the -built-in graph designer. - -## Upload your files - -You can upload your CSV files in the following ways: - -- Drag and drop your files in the designated area. -- Click the **Browse files** button and select the files you want to add. - -![ArangoGraph Data Loader Upload Files](../../../images/arangograph-data-loader-upload-files.png) - -You have the option to either upload several files collectively as a batch or -add them individually. Furthermore, you can supplement additional files later on. -After a file has been uploaded, you can expand it to preview both the header and -the first row of data within the file. - -In case you upload CSV files without fields, they will not be available for -manipulation. - -Once the files are uploaded, you can start [designing your graph](../data-loader/design-graph.md). - -### File formatting limitations - -Ensure that the files you upload are correctly formatted. Otherwise, errors may -occur, the upload may fail, or the data may not be correctly mapped. - -The following restrictions and limitations apply: - -- The only supported file format is CSV. If you submit an invalid file format, - the upload of that specific file will be prevented. -- It is required that all CSV files have a header row. If you upload a file - without a header, the first row of data is treated as the header. To avoid - losing the first row of the data, make sure to include headers in your files. -- The CSV file should have unique header names. It is not possible to have two - columns with the same name within the same file. - -For more details, see the [File validation](../data-loader/import.md#file-validation) section. - -### Upload limits - -Note that there is a cumulative file upload limit of 1GB. This means that the -combined size of all files you upload should not exceed 1GB. If the total size -of the uploaded files surpasses this limit, the upload may not be successful. - -## Delete files - -You can remove uploaded files by clicking the **Delete file** button in the -**Your files** panel. Please keep in mind that in order to delete a file, -you must first remove all graph associations associated with it. \ No newline at end of file diff --git a/site/content/3.13/arangograph/data-loader/design-graph.md b/site/content/3.13/arangograph/data-loader/design-graph.md deleted file mode 100644 index b1c5eaf3af..0000000000 --- a/site/content/3.13/arangograph/data-loader/design-graph.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Design your graph -menuTitle: Design graph -weight: 10 -description: >- - Design your graph database schema using the integrated graph modeler in the Data Loader ---- - -Based on the data you have uploaded, you can start designing your graph. -The graph designer allows you to create a schema using nodes and edges. -Once this is done, you can save and start the import. The resulting -[EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and the -corresponding collections are created in your ArangoDB database instance. - -## How to add a node - -Nodes are the main objects in your data model and include the attributes of the -objects. - -1. To create a new node, click the **Add node** button. -2. In the graph designer, click on the newly created node to view the **Node details**. -3. In the **Node details** panel, fill in the following fields: - - For **Node label**, enter a name you want to use for the node. - - For **File**, select a file from the list to associate it with the node. - - For **Primary Identifier**, select a field from the list. This is used to - reference the nodes when you define relations with edges. - - For **File Headers**, select one or more attributes from the list. - -![ArangoGraph Data Loader Add Node](../../../images/arangograph-data-loader-add-node.png) - -## How to connect nodes - -Nodes can be connected by edges to express and categorize the relations between -them. A relation always has a direction, going from one node to another. You can -define this direction in the graph designer by dragging your cursor from one -particular node to another. - -To connect two nodes, you can use the **Connect node(s)** button. Click on any -node to self-reference it or drag it to connect it to another node. Alternatively, -when you select a node, a plus sign will appear, allowing you to directly add a -new node with an edge. - -{{< tip >}} -To quickly recenter your elements on the canvas, you can use the **Center View** -button located in the bottom right corner. This brings your nodes and edges back -into focus. -{{< /tip >}} - -The edge needs to be associated with a file and must have a label. Note that a -node and an edge cannot have the same label. - -See below the steps to add details to an edge. - -1. Click on an edge in the graph designer. -2. In the **Edit Edge** panel, fill in the following fields: - - For **Edge label**, enter a name you want to use for the edge. - - For **Relation file**, select a file from the list to associate it with the edge. - - To define how the relation points from one node to another, select the - corresponding relation file header for both the origin file (`_from`) and the - destination file (`_to`). - - For **File Headers**, select one or more attributes from the list. - -![ArangoGraph Data Loader Edit Edge](../../../images/arangograph-data-loader-edit-edge.png) - -## How to delete elements - -To remove a node or an edge, simply select it in the graph designer and click the -**Delete** icon. \ No newline at end of file diff --git a/site/content/3.13/arangograph/data-loader/example.md b/site/content/3.13/arangograph/data-loader/example.md deleted file mode 100644 index 46fdd1b38e..0000000000 --- a/site/content/3.13/arangograph/data-loader/example.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Data Loader Example -menuTitle: Example -weight: 20 -description: >- - Follow this complete working example to see how easy it is to transform existing - data into a graph and get insights from the connected entities ---- - -To transform your data into a graph, you need to have CSV files with entities -representing the nodes and a corresponding CSV file representing the edges. - -This example uses a sample data set of two files, `airports.csv`, and `flights.csv`. -These files are used to create a graph showing flights arriving at and departing -from various cities. -You can download the files from [GitHub](https://github.com/arangodb/example-datasets/tree/master/Data%20Loader). - -The `airports.csv` contains rows of airport entries, which are the future nodes -in your graph. The `flights.csv` contains rows of flight entries, which are the -future edges connecting the nodes. - -The whole process can be broken down into these steps: - -1. **Database and graph setup**: Begin by choosing an existing database or - create a new one and enter a name for your new graph. -2. **Add files**: Upload the CSV files to the Data Loader web interface. You can - simply drag and drop them or upload them through the file browser window. -3. **Design graph**: Design your graph schema by adding nodes and edges and map - data from the uploaded files to them. This allows creating the corresponding - documents and collections for your graph. -4. **Import data**: Import the data and start using your newly created - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and its - corresponding collections. - -## Step 1: Create a database and choose the graph name - -Start by creating a new database and adding a name for your graph. - -![Data Loader Example Step 1](../../../images/arangograph-data-loader-example-choose-names.png) - -## Step 2: Add files - -Upload your CSV files to the Data Loader web interface. You can drag and drop -them or upload them via a file browser window. - -![Data Loader Example Step 2](../../../images/arangograph-data-loader-example-add-files.png) - -See also [Add files into Data Loader](../data-loader/add-files.md). - -## Step 3: Design graph schema - -Once the files are added, you can start designing the graph schema. This example -uses a simple graph consisting of: -- Two nodes (`origin_airport` and `destination_airport`) -- One directed edge going from the origin airport to the destination one - representing a flight - -Click **Add node** to create the nodes and connect them with edges. - -Next, for each of the nodes and edges, you need to create a mapping to the -corresponding file and headers. - -For nodes, the **Node label** is going to be a node collection name and the -**Primary identifier** will be used to populate the `_key` attribute of documents. -You can also select any additional headers to be included as document attributes. - -In this example, two node collections have been created (`origin_airport` and -`destination_airport`) and `AirportID` header is used to create the `_key` -attribute for documents in both node collections. The header preview makes it -easy to select the headers you want to use. - -![Data Loader Example Step 3 Nodes](../../../images/arangograph-data-loader-example-map-nodes.png) - -For edges, the **Edge label** is going to be an edge collection name. Then, you -need to specify how edges will connect nodes. You can do this by selecting the -*from* and *to* nodes to give a direction to the edge. -In this example, the `source airport` header has been selected as a source and -the `destination airport` header as a target for the edge. - -![Data Loader Example Step 3 Edges](../../../images/arangograph-data-loader-example-map-edges.png) - -Note that the values of the source and target for the edge correspond to the -**Primary identifier** (`_key` attribute) of the nodes. In this case, it is the -airport code (i.e. GKA) used as the `_key` in the node documents and in the source -and destination headers to configure the edges. - -See also [Design your graph in the Data Loader](../data-loader/design-graph.md). - -## Step 4: Import and see the resulting graph - -After all the mapping is done, all you need to do is click -**Save and start import**. The report provides an overview of the files -processed and the documents created, as well as a link to your new graph. -See also [Start import](../data-loader/import.md). - -![Data Loader Example Step 4 See your new graph](../../../images/arangograph-data-loader-example-data-import.png) - -Finally, click **See your new graph** to open the ArangoDB web interface and -explore your new collections and graph. - -![Data Loader Example Step 4 Resulting graph](../../../images/arangograph-data-loader-example-resulting-graph.png) - -Happy graphing! \ No newline at end of file diff --git a/site/content/3.13/arangograph/data-loader/import.md b/site/content/3.13/arangograph/data-loader/import.md deleted file mode 100644 index 1589244278..0000000000 --- a/site/content/3.13/arangograph/data-loader/import.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Start the import -menuTitle: Start import -weight: 15 -description: >- - Once the data files are provided and the graph is designed, you can start the import ---- - -Before starting the actual import, make sure that: -- You have selected a database for import or created a new one; -- You have provided a valid name for your graph; -- You have created at least one node; -- You have created at least one edge; -- You have uploaded at least one file; -- Every file is related to at least one node or edge; -- Every node and edge is linked to a file; -- Every node and edge has a unique label; -- Every node has a primary identifier selected; -- Every edge has an origin and destination file header selected. - -To continue with the import, click the **Save and start import** button. The data -importer provides an overview showing results with the collections that have been -created with the data provided in the files. - -To access your newly created graph in the ArangoDB web interface, click the -**See your new graph** button. - -## File validation - -Once the import has started, the files that you have provided are being validated. -If the validation process detects parsing errors in any of the files, the import -is temporarily paused and the validation errors are shown. You can get a full -report by clicking the **See full report** button. - -At this point, you can: -- Continue with the import without addressing the errors. The CSV files will still - be included in the migration. However, the invalid rows are skipped and - excluded from the migration. -- Revisit the problematic file(s), resolve the issues, and then re-upload the - file(s) again. - -{{< tip >}} -To ensure the integrity of your data, it is recommended to address all the errors -detected during the validation process. -{{< /tip >}} - -### Validation errors and their meanings - -#### Invalid Quotation Mark - -This error indicates issues with quotation marks in the CSV data. -It can occur due to improper use of quotes. - -#### Missing Quotation Marks - -This error occurs when quotation marks are missing or improperly placed in the -CSV data, potentially affecting data enclosure. - -#### Insufficient Data Fields - -This error occurs when a CSV row has fewer fields than expected. It may indicate -missing or improperly formatted data. - -#### Excessive Data Fields - -This error occurs when a CSV row has more fields than expected, possibly due to -extra data or formatting issues. - -#### Unidentifiable Field Separator - -This error suggests that the parser could not identify the field separator -character in the CSV data. \ No newline at end of file diff --git a/site/content/3.13/arangograph/deployments/_index.md b/site/content/3.13/arangograph/deployments/_index.md deleted file mode 100644 index b3416805a1..0000000000 --- a/site/content/3.13/arangograph/deployments/_index.md +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: Deployments in ArangoGraph -menuTitle: Deployments -weight: 20 -description: >- - How to create and manage deployments in ArangoGraph ---- -An ArangoGraph deployment is an ArangoDB cluster or single server, configured -as you choose. - -Each deployment belongs to a project, which belongs to an organization in turn. -You can have any number of deployments under one project. - -**Organizations → Projects → <u>Deployments</u>** - -![ArangoGraph Deployments](../../../images/arangograph-deployments-page.png) - -## How to create a new deployment - -1. If you do not have a project yet, - [create a project](../projects.md#how-to-create-a-new-project) first. -2. In the main navigation, click __Deployments__. -3. Click the __New deployment__ button. -4. Select the project you want to create the deployment for. -5. Set up your deployment. The configuration options are described below. - -{{< info >}} -Deployments contain exactly **one policy**. Within that policy, you can define -role bindings to regulate access control on a deployment level. -{{< /info >}} - -### In the **General** section - -- Enter the __Name__ and optionally a __Short description__ for the deployment. -- Select the __Provider__ and __Region__ of the provider. - {{< warning >}} - Once a deployment has been created, it is not possible to change the - provider and region anymore. - {{< /warning >}} - -![ArangoGraph New Deployment General](../../../images/arangograph-new-deployment-general.png) - -### In the **Sizing** section - -- Choose a __Model__ for the deployment: - - - __OneShard__ deployments are suitable when your data set fits in a single node. - They are ideal for graph use cases. This model has a fixed number of 3 nodes. - - - __Sharded__ deployments are suitable when your data set is larger than a single - node. The data will be sharded across multiple nodes. You can select the - __Number of nodes__ for this deployment model. The more nodes you have, the - higher the replication factor can be. - - - __Single Server__ deployments are suitable when you want to try out ArangoDB without - the need for high availability or scalability. The deployment will contain a - single server only. Your data will not be replicated and your deployment can - be restarted at any time. - -- Select a __NODE SIZE__ from the list of available options. Each option is a - combination of vCPUs, memory, and disk space per node. - -![ArangoGraph New Deployment Sizing](../../../images/arangograph-new-deployment-sizing.png) - -### In the **Advanced** section - -- Select the __DB Version__. - If you don't know which DB version to select, use the version selected by default. -- Select the desired __Support Plan__. Click the link below the field to get - more information about the different support plans. -- In the __Certificate__ field: - - The default certificate created for your project is selected automatically. - - If you have no default certificate, or want to use a new certificate, - create a new certificate by typing the desired name for it and hitting - enter or clicking __Create "\<name\>"__ when done. - - Or, if you already have multiple certificates, select the desired one. -- _Optional but strongly recommended:_ In the __IP allowlist__ field, select the - desired one in case you want to limit access to your deployment to certain - IP ranges. To create a allowlist, navigate to your project and select the - __IP allowlists__ tab. See [How to manage IP allowlists](../projects.md#how-to-manage-ip-allowlists) - for details. - {{< security >}} - For any kind of production deployment it is strongly advise to use an IP allowlist. - {{< /security >}} -- Select a __Deployment Profile__. Profile options are only available on request. - -![ArangoGraph New Deployment Advanced](../../../images/arangograph-new-deployment-advanced.png) - -### In the **Summary** panel - -1. Review the configuration, and if you're okay with the setup, press the - __Create deployment__ button. -2. You are taken to the deployment overview page. - **Note:** Your deployment is being bootstrapped at that point. This process - takes a few minutes. Once the deployment is ready, you receive a confirmation - email. - -## How to access your deployment - -1. In the main navigation, click the __Dashboard__ icon and then click __Projects__. -2. In the __Projects__ page, click the project for - which you created a deployment earlier. -3. Alternatively, you can access your deployment by clicking __Deployments__ in the - dashboard navigation. This page shows all deployments from all projects. - Click the name of the deployment you want to view. -4. For each deployment in your project, you see the status. While your new - deployment is being set up, it displays the __bootstrapping__ status. -5. Press the __View__ button to show the deployment page. -6. When a deployment displays a status of __OK__, you can access it. -7. Click the __Open database UI__ button or on the database UI link to open - the dashboard of your new ArangoDB deployment. - -At this point your ArangoDB deployment is available for you to use — **Have fun!** - -If you have disabled the [auto-login option](#auto-login-to-database-ui) to the -database web interface, you need to follow the additional steps outlined below -to access your deployment: - -1. Click the copy icon next to the root password. This copies the deployment - root password to your clipboard. You can also click the view icon to unmask - the root password to see it. - {{< security >}} - Do not use the root username/password for everyday operations. It is recommended - to use them only to create other user accounts with appropriate permissions. - {{< /security >}} -2. Click the __Open database UI__ button or on the database UI link to open - the dashboard of your new ArangoDB deployment. -3. In the __username__ field type `root`, and in the __password__ field paste the - password that you copied earlier. -4. Press the __Login__ button. -5. Press the __Select DB: \_system__ button. - -{{< info >}} -Each deployment is accessible on two ports: - -- Port `8529` is the standard port recommended for use by web-browsers. -- Port `18529` is the alternate port that is recommended for use by automated services. - -The difference between these ports is the certificate used. If you enable -__Use well-known certificate__, the certificates used on port `8529` is well-known -and automatically accepted by most web browsers. The certificate used on port -`18529` is a self-signed certificate. For securing automated services, the use of -a self-signed certificate is recommended. Read more on the -[Certificates](../security-and-access-control/x-509-certificates.md) page. -{{< /info >}} - -## Password settings - -### How to enable the automatic root user password rotation - -Password rotation refers to changing passwords regularly - a security best -practice to reduce the vulnerability to password-based attacks and exploits -by limiting for how long passwords are valid. The ArangoGraph Insights Platform -can automatically change the `root` user password of an ArangoDB deployment -periodically to improve security. - -1. Navigate to the __Deployment__ for which you want to enable an automatic - password rotation for the root user. -2. In the __Deployment details__ section, click the button with the __gear__ icon next to the - __ROOT PASSWORD__. -3. In the __Password Settings__ dialog, turn the automatic password rotation on - and click the __Save__ button. - - ![ArangoGraph Deployment Password Rotation](../../../images/arangograph-deployment-password-rotation.png) -4. You can expand the __Root password__ panel to see when the password was - rotated last. The rotation takes place every three months. - -### Auto login to database UI - -ArangoGraph provides the ability to automatically login to your database using -your existing ArangoGraph credentials. This not only provides a seamless -experience, preventing you from having to manage multiple sets of credentials -but also improves the overall security of your database. As your credentials -are shared between ArangoGraph and your database, you can benefit from -end-to-end audit traceability for a given user, as well as integration with -ArangoGraph SSO. - -You can enable this feature in the **Deployment details** section by turning -the **USE AUTO LOGIN FOR DATABASE UI** toggle on. Please note -that it may take a few minutes to get activated. -Once enabled, you no longer have to fill in the `root` user and password of -your ArangoDB deployment. - -{{< info >}} -If you use the auto login feature with AWS -[private endpoints](../deployments/private-endpoints.md), it is recommended -to switch off the `custom DNS` setting. -{{< /info >}} - -This feature can be disabled at any time. You may wish to consider explicitly -disabling this feature in the following situations: -- Your workflow requires you to access the database UI using different accounts - with differing permission sets, as you cannot switch database users when - automatic login is enabled. -- You need to give individuals access to a database's UI without giving them - any access to ArangoGraph. Note, however, that it's possible to only give an - ArangoGraph user database UI access, without other ArangoGraph permissions. - -{{< warning >}} -When the auto login feature is enabled, users cannot edit their permissions on -the ArangoDB database web interface as all permissions are managed by the -ArangoGraph platform. -{{< /warning >}} - -Before getting started, make sure you are signed in to ArangoGraph as a user -with one of the following permissions in your project: -- `data.deployment.full-access` -- `data.deployment.read-only-access` - -Organization owners have these permissions enabled by default. -The `deployment-full-access-user` and `deployment-read-only-user` roles which -contain these permissions can also be granted to other members of the -organization. See how to create a -[role binding](../security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy). - -{{< warning >}} -This feature is available on `443` port only. -{{< /warning >}} - -## How to edit a deployment - -You can modify a deployment's configuration, including the ArangoDB version -that is being used, change the memory size, or even switch from -a OneShard deployment to a Sharded one if your data set no longer fits in a -single node. - -{{< tip >}} -To edit an existing deployment, you must have the necessary set of permissions -attached to your role. Read more about [roles and permissions](../security-and-access-control/_index.md#roles). -{{< /tip >}} - -1. In the main navigation, click **Deployments** and select an existing - deployment from the list, or click **Projects**, select a project, and then - select a deployment. -2. In the **Quick start** section, click the **Edit** button. -3. In the **General** section, you can do the following: - - Change the deployment name - - Change the deployment description -4. In the **Sizing** section, you can do the following: - - Change **OneShard** deployments into **Sharded** deployments. To do so, - select **Sharded** in the **Model** dropdown list. You can select the - number of nodes for your deployment. This can also be modified later on. - {{< warning >}} - You cannot switch from **Sharded** back to **OneShard**. - {{< /warning >}} - - Change **Single Server** deployments into **OneShard** or **Sharded** deployments. - {{< warning >}} - You cannot switch from **Sharded** or **OneShard** back to **Single Server**. - {{< /warning >}} - - Scale up or down the node size. - {{< warning >}} - When scaling up or down the size in AWS deployments, the new value gets locked - and cannot be changed again until the cloud provider rate limit is reset. - {{< /warning >}} -5. In the **Advanced** section, you can do the following: - - Upgrade the ArangoDB version that is currently being used. See also - [Upgrades and Versioning](upgrades-and-versioning.md) - - Select a different certificate. - - Add or remove an IP allowlist. - - Select a deployment profile. -6. All changes are reflected in the **Summary** panel. Review the new - configuration and click **Save changes**. - -## How to connect a driver to your deployment - -[ArangoDB drivers](../../develop/drivers/_index.md) allow you to use your ArangoGraph -deployment as a database system for your applications. Drivers act as interfaces -between different programming languages and ArangoDB, which enable you to -connect to and manipulate ArangoDB deployments from within compiled programs -or using scripting languages. - -To get started, open a deployment. -In the **Quick start** section, click on the **Connecting drivers** button and -select your programming language. The code snippets provide examples on how to -connect to your instance. - -{{< tip >}} -Note that ArangoGraph Insights Platform runs deployments in a cluster -configuration. To achieve the best possible availability, your client -application has to handle connection failures by retrying operations if needed. -{{< /tip >}} - -![ArangoGraph Connecting Drivers Example](../../../images/arangograph-connecting-drivers-example.png) - -## How to pause a deployment - -1. In the __Deployments__ page, click the deployment you wish to pause. -2. Click the __Delete/Lock__ entry in the navigation. -3. Click the __Pause deployment...__ button. -4. To resume the deployment, go to the __Overview__ tab and click __Resume deployment__. The - deployment being paused displays the __Hibernated__ status until it has been - successfully resumed. - -## How to delete a deployment - -{{< danger >}} -Deleting a deployment deletes all its data and backups. -This operation is **irreversible**. Please proceed with caution. -{{< /danger >}} - -1. In the __Deployments__ page, click the deployment you wish to delete. -2. Click the __Delete/Lock__ entry in the navigation. -3. Click the __Delete deployment...__ button. -4. In the modal dialog, confirm the deletion by entering `Delete!` into the - designated text field. -5. Confirm the deletion by pressing the __Yes__ button. -6. You will be taken back to the __Deployments__ page of the project. - The deployment being deleted will display the __Deleting__ status until it has - been successfully removed. - -{{< info >}} -Locked deployments cannot be deleted. Learn more about -[locked resources](../security-and-access-control/_index.md#locked-resources) in ArangoGraph. -{{< /info >}} \ No newline at end of file diff --git a/site/content/3.13/arangograph/deployments/private-endpoints.md b/site/content/3.13/arangograph/deployments/private-endpoints.md deleted file mode 100644 index c3400b9711..0000000000 --- a/site/content/3.13/arangograph/deployments/private-endpoints.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Private endpoint deployments in ArangoGraph -menuTitle: Private endpoints -weight: 5 -description: >- - Use the private endpoint feature to isolate your deployments and increase - security ---- -This topic describes how to create a private endpoint deployment and -securely deploy to various cloud providers such as Google Cloud Platform (GCP) -and Amazon Web Services (AWS). Follow the steps outlined below to get started. - -{{< tip >}} -In AWS, private endpoints should be located in the same region. -{{< /tip >}} - -{{< info >}} -For more information about the certificates used for private endpoints, please -refer to the [How to manage certificates](../security-and-access-control/x-509-certificates.md) -section. -{{< /info >}} - -## Google Cloud Platform (GCP) - -Google Cloud Platform (GCP) offers a feature called -[Private Service Connect](https://cloud.google.com/vpc/docs/private-service-connect) -that allows private consumption of services across VPC networks that belong to -different groups, teams, projects, or organizations. You can publish and consume -services using the defined IP addresses which are internal to your VPC network. - -In ArangoGraph, you can -[create a regular deployment](_index.md#how-to-create-a-new-deployment) -and change it to a private endpoint deployment afterwards. - -Such a deployment is not reachable from the internet anymore, other than via -the ArangoGraph dashboard to administrate it. To revert to a public deployment, -please contact support via **Request help** in the help menu. - -To configure a private endpoint for GCP, you need to provide your Google project -names. ArangoGraph then configures a **Private Endpoint Service** that automatically -connect to private endpoints that are created for those projects. - -After the creation of the **Private Endpoint Service**, you should receive a -service attachment that you need during the creation of your private endpoint(s). - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment Private Endpoint Menu](../../../images/arangograph-gcp-change.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Enter one or more Google project names. You can also add them later in the summary view. - Click **Next**. - ![ArangoGraph Deployment Private Endpoint Setup 2](../../../images/arangograph-gcp-private-endpoint.png) -6. Configure custom DNS names. This step is optional and disabled by default. - Note that, once enabled, this setting is immutable and cannot be reverted. - Click **Next** to continue. - {{< info >}} - By default, your private endpoint is available to all VPCs that connect to it - at `https://<endpoint_id>-pe.arangodb.cloud` with the - [well-known certificate](../security-and-access-control/x-509-certificates.md#well-known-x509-certificates). - If the custom DNS is enabled, you will be responsible for the DNS of your - private endpoints. - {{< /info >}} - ![ArangoGraph Private Endpoint Custom DNS](../../../images/arangograph-gcp-custom-dns.png) -7. Click **Confirm Settings** to change the deployment. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and to change the - configuration. -9. ArangoGraph configures a **Private Endpoint Service**. As soon as the - **Service Attachment** is ready, you can use it to configure the Private - Service Connect in your VPC. - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} - -## Amazon Web Services (AWS) - -AWS offers a feature called [AWS PrivateLink](https://aws.amazon.com/privatelink) -that enables you to privately connect your Virtual Private Cloud (VPC) to -services, without exposure to the internet. You can control the specific API -endpoints, sites, and services that are reachable from your VPC. - -Amazon VPC allows you to launch AWS resources into a -virtual network that you have defined. It closely resembles a traditional -network that you would normally operate, with the benefits of using the AWS -scalable infrastructure. - -In ArangoGraph, you can -[create a regular deployment](_index.md#how-to-create-a-new-deployment) and change it -to a private endpoint deployment afterwards. - -The ArangoDB private endpoint deployment is not exposed to public internet -anymore, other than via the ArangoGraph dashboard to administrate it. To revert -it to a public deployment, please contact the support team via **Request help** -in the help menu. - -To configure a private endpoint for AWS, you need to provide the AWS principals related -to your VPC. The ArangoGraph Insights Platform configures a **Private Endpoint Service** -that automatically connects to private endpoints that are created in those principals. - -1. Open the deployment you want to change. -2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) - icon. -3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment AWS Change to Private Endpoint](../../../images/arangograph-aws-change-to-private-endpoint.png) -4. In the configuration wizard, click **Next** to enter your configuration details. -5. Click **Add Principal** to start configuring the AWS principal(s). - You need to enter a valid account, which is your 12 digit AWS account ID. - Adding usernames or role names is optional. You can also - skip this step and add them later from the summary view. - {{< info >}} - Principals cannot be changed anymore once a connection has been established. - {{< /info >}} - {{< warning >}} - To verify your endpoint service in AWS, you must use the same principal as - configured in ArangoGraph. Otherwise, the service name cannot be verified. - {{< /warning >}} - ![ArangoGraph AWS Private Endpoint Configure Principals](../../../images/arangograph-aws-endpoint-configure-principals.png) -6. Configure custom DNS names. This step is optional and disabled by default, - you can also add or change them later from the summary view. - Click **Next** to continue. - {{< info >}} - By default, your private endpoint is available to all VPCs that connect to it - at `https://<endpoint_id>-pe.arangodb.cloud` with the well-known certificate. - If the custom DNS is enabled, you will be responsible for the DNS of your - private endpoints. - {{< /info >}} - ![ArangoGraph AWS Private Endpoint Alternate DNS](../../../images/arangograph-aws-private-endpoint-dns.png) -7. Confirm that you want to use a private endpoint for your deployment by - clicking **Confirm Settings**. -8. Back in the **Overview** page, scroll down to the **Private Endpoint** section - that is now displayed to see the connection status and change the - configuration, if needed. - ![ArangoGraph AWS Private Endpoint Overview](../../../images/arangograph-aws-private-endpoint-overview.png) - {{< info >}} - Note that - [Availability Zones](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones) - are independently mapped for each AWS account. The physical location of a - zone may differ from one account to another account. To coordinate - Availability Zones across AWS accounts, you must use the - [Availability Zone ID](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html). - {{< /info >}} - - {{< tip >}} - To learn more or request help from the ArangoGraph support team, click **Help** - in the top right corner of the **Private Endpoint** section. - {{< /tip >}} -9. ArangoGraph configures a **Private Endpoint Service**. As soon as this is available, - you can use it in the AWS portal to create an interface endpoint to connect - to your endpoint service. For more details, see - [How to connect to an endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html#share-endpoint-service). - -{{< tip >}} -To establish connectivity and enable traffic flow, make sure you add a route -from the originating machine to the interface endpoint. -{{< /tip >}} - -{{< tip >}} -When you create a private endpoint in ArangoGraph, both endpoints (the regular -one and the new private one) are available for two hours. During this time period, -you can switch your application to the new private endpoint. After this period, -the old endpoint is not available anymore. -{{< /tip >}} diff --git a/site/content/3.13/arangograph/deployments/upgrades-and-versioning.md b/site/content/3.13/arangograph/deployments/upgrades-and-versioning.md deleted file mode 100644 index 211d271c92..0000000000 --- a/site/content/3.13/arangograph/deployments/upgrades-and-versioning.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Upgrades and Versioning in ArangoGraph -menuTitle: Upgrades and Versioning -weight: 10 -description: >- - Select which version of ArangoDB you want to use within your ArangoGraph - deployment and choose when to roll out your upgrades ---- -{{< info >}} -Please note that this policy comes into effect in April 2023. -{{< /info >}} - -## Release Definitions - -The following definitions are used for release types of ArangoDB within ArangoGraph: - -| Release | Introduces | Contains breaking changes | -|----------|-------------|----------------------------| -| **Major** (`X.y.z`) | Major new features and functionalities | Likely large changes | -| **Minor** (`x.Y.z`) | Some new features or improvements | Likely small changes | -| **Patch** (`x.y.Z`) | Essential fixes and improvements | Small changes in exceptional circumstances | - -## Release Channels - -When creating a deployment in ArangoGraph, you can select the minor version -of ArangoDB that your deployment is going to use. This minor version is in the -format `Major.Minor` and indicates the major and minor version of ArangoDB that -is used in this deployment, for example `3.10` or `3.9`. - -To provide secure and reliable service, databases are deployed on the latest -available patch version in the selected version. For example, if `3.10` is -selected and `3.10.3` is the latest version of ArangoDB available for the `3.10` -minor version, then the deployment is initially using ArangoDB `3.10.3`. - -## Upgrades - -### Manual Upgrades - -At any time, you can change the release channel of your deployment to a later -release channel, but not to an earlier one. For example, if you are using `3.10` -then you can change your deployment’s release channel to `3.11`, but you would -not be able to change the release channel to `3.9`. -See [how to edit a deployment](_index.md#how-to-edit-a-deployment). - -Upon changing your release channel, an upgrade process for your deployment is -initiated to upgrade your running database to the latest patch release of your -selected release channel. You can use this mechanism to upgrade your deployments -at a time that suits you, prior to the forced upgrade when your release channel -is no longer available. - -### Automatic Upgrades - -#### Major Versions (`X.y.z`) - -The potential disruption of a major version upgrade requires additional testing -of any applications connecting to your ArangoGraph deployment. As a result, when -a new major version is released on the ArangoGraph platform, an email is sent out -to inform you of this release. - -If the ArangoDB version that you are currently using is no longer available on the -ArangoGraph platform, you are forced to upgrade to the next available version. -Prior to the removal of the version, an email is sent out to inform you of this -forced upgrade. - -#### Minor Versions (`x.Y.z`) - -Although minor upgrades are not expected to cause significant compatibility -changes like major versions, they may still require additional planning and -validation. - -This is why minor upgrades are treated in the same manner as major upgrades -within ArangoGraph. When a new minor version is released on the ArangoGraph -platform, an email is sent out to inform you of this release. - -If the ArangoDB version that you are currently using is no longer available on the -ArangoGraph platform, you are forced to upgrade to the next available version. -Prior to the removal of the version, an email is sent out to inform you of this -forced upgrade. - -#### Patch Versions (`x.y.Z`) - -Upgrades between patch versions are transparent, with no significant disruption -to your applications. As such, you can expect to be automatically upgraded to -the latest patch version of your selected minor version shortly after it becomes -available in ArangoGraph. - -ArangoGraph aims to give approximately one week’s notice prior to upgrading your -deployments to the latest patch release. Although in exceptional circumstances -(such as a critical security issue) the upgrade may be triggered with less than -one week's notice. -The upgrade is carried out automatically. However, if you need the upgrade to be -deferred temporarily, contact the ArangoGraph Support team to request that. diff --git a/site/content/3.13/arangograph/migrate-to-the-cloud.md b/site/content/3.13/arangograph/migrate-to-the-cloud.md deleted file mode 100644 index 8a3f4a9802..0000000000 --- a/site/content/3.13/arangograph/migrate-to-the-cloud.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -title: Cloud Migration Tool -menuTitle: Migrate to the cloud -weight: 30 -description: >- - Migrating data from bare metal servers to the cloud with minimal downtime -draft: true ---- -The `arangosync-migration` tool allows you to easily move from on-premises to -the cloud while ensuring a smooth transition with minimal downtime. -Start the cloud migration, let the tool do the job and, at the same time, -keep your local cluster up and running. - -Some of the key benefits of the cloud migration tool include: -- Safety comes first - pre-checks and potential failures are carefully handled. -- Your data is secure and fully encrypted. -- Ease-of-use with a live migration while your local cluster is still in use. -- Get access to what a cloud-based fully managed service has to offer: - high availability and reliability, elastic scalability, and much more. - -## Downloading the tool - -The `arangosync-migration` tool is available to download for the following -operating systems: - -**Linux** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/linux/amd64/arangosync-migration) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/linux/arm64/arangosync-migration) - -**macOS / Darwin** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/darwin/amd64/arangosync-migration) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/darwin/arm64/arangosync-migration) - -**Windows** -- [AMD64 (x86_64) architecture](https://download.arangodb.com/arangosync-migration/windows/amd64/arangosync-migration.exe) -- [ARM64 (AArch64) architecture](https://download.arangodb.com/arangosync-migration/windows/arm64/arangosync-migration.exe) - -For macOS as well as other Unix-based operating systems, run the following -command to make sure you can execute the binary: - -```bash -chmod 755 ./arangosync-migration -``` - -## Prerequisites - -Before getting started, make sure the following prerequisites are in place: - -- Go to the [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home) - and sign in. If you don’t have an account yet, sign-up to create one. - -- Generate an ArangoGraph API key and API secret. See a detailed guide on - [how to create an API key](api/set-up-a-connection.md#creating-an-api-key). - -{{< info >}} -The cloud migration tool is only available for clusters. -{{< /info >}} - -### Setting up the target deployment in ArangoGraph - -Continue by [creating a new ArangoGraph deployment](deployments/_index.md#how-to-create-a-new-deployment) -or choose an existing one. - -The target deployment in ArangoGraph requires specific configuration rules to be -set up before the migration can start: - -- **Configuration settings**: The target deployment must be compatible with the - source data cluster. This includes the ArangoDB version that is being used, - the DB-Servers count, and disk space. -- **Deployment region and cloud provider**: Choose the closest region to your - data cluster. This factor can speed up your migration to the cloud. - -After setting up your ArangoGraph deployment, wait for a few minutes for it to become -fully operational. - -{{< info >}} -Note that Developer mode deployments are not supported. -{{< /info >}} - -## Running the migration tool - -The `arangosync-migration` tool provides a set of commands that allow you to: -- start the migration process -- check whether your source and target clusters are fully compatible -- get the current status of the migration process -- stop or abort the migration process -- switch the local cluster to read-only mode - -### Starting the migration process - -To start the migration process, run the following command: - -```bash -arangosync-migration start -``` -The `start` command runs some pre-checks. Among other things, it measures -the disk space which is occupied by your ArangoDB cluster. If you are using the -same data volume for ArangoDB servers and other data as well, the measurements -can be incorrect. Provide the `--source.ignore-metrics` option to overcome this. - -You also have the option of doing a `--check-only` without starting the actual -migration. If specified, this checks if your local cluster and target deployment -are compatible without sending any data to ArangoGraph. - -Once the migration starts, the local cluster enters into monitoring mode and the -synchronization status is displayed in real-time. If you don't want to see the -status you can terminate this process, as the underlying agent process -continues to work. If something goes wrong, restarting the same command restores -the replication state. - -To restart the migration, first `stop` or `stop --abort` the migration. Then, -start it again using the `start` command. - -{{< warning >}} -Starting the migration creates a full copy of all data from the source cluster -to the target deployment in ArangoGraph. All data that has previously existed in the -target deployment will be lost. -{{< /warning >}} - -### During the migration - -The following takes place during an active migration: -- The source data cluster remains usable. -- The target deployment in ArangoGraph is switched to read-only mode. -- Your root user password is not copied to the target deployment in ArangoGraph. - To get your root password, select the target deployment from the ArangoGraph - Dashboard and go to the **Overview** tab. All other users are fully synchronized. - -{{< warning >}} -The migration tool increases the CPU and memory usage of the server you are -running it on. Depending on your ArangoDB usage pattern, it may take a lot of CPU -to handle the replication. You can stop the migration process anytime -if you see any problems. -{{< /warning >}} - -```bash -./arangosync-migration start \ - --source.endpoint=$COORDINATOR_ENDPOINT \ - --source.jwt-secret=/path-to/jwt-secret.file \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -### How long does it take? - -The total time required to complete the migration depends on how much data you -have and how often write operations are executed during the process. - -You can also track the progress by checking the **Migration status** section of -your target deployment in ArangoGraph dashboard. - -![ArangoGraph Cloud Migration Progress](../../images/arangograph-migration-agent.png) - -### Getting the current status - -To print the current status of the migration, run the following command: - -```bash -./arangosync-migration status \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -You can also add the `--watch` option to start monitoring the status in real-time. - -### Stopping the migration process - -The `arangosync-migration stop` command stops the migration and terminates -the migration agent process. - -If replication is running normally, the command waits until all shards are -in sync. The local cluster is then switched into read-only mode. -After all shards are in-sync and the migration stopped, the target deployment -is switched into the mode specified in `--source.server-mode` option. If no -option is specified, it defaults to the read/write mode. - -```bash -./arangosync-migration stop \ - --arango-graph.api-key=$ARANGO_GRAPH_API_KEY \ - --arango-graph.api-secret=$ARANGO_GRAPH_API_SECRET \ - --arango-graph.deployment-id=$ARANGO_GRAPH_DEPLOYMENT_ID -``` - -The additional `--abort` option is supported. If specified, the `stop` command -will not check anymore if both deployments are in-sync and stops all -migration-related processes as soon as possible. - -### Switching the local cluster to read-only mode - -The `arangosync-migration set-server-mode` command allows switching -[read-only mode](../develop/http-api/administration.md#set-the-server-mode-to-read-only-or-default) -for your local cluster on and off. - -In a read-only mode, all write operations are going to fail with an error code -of `1004` (ERROR_READ_ONLY). -Creating or dropping databases and collections are also going to fail with -error code `11` (ERROR_FORBIDDEN). - -```bash -./arangosync-migration set-server-mode \ - --source.endpoint=$COORDINATOR_ENDPOINT \ - --source.jwt-secret=/path-to/jwt-secret.file \ - --source.server-mode=readonly -``` -The `--source.server-mode` option allows you to specify the desired server mode. -Allowed values are `readonly` or `default`. - -### Supported environment variables - -The `arangosync-migration` tool supports the following environment variables: - -- `$ARANGO_GRAPH_API_KEY` -- `$ARANGO_GRAPH_API_SECRET` -- `$ARANGO_GRAPH_DEPLOYMENT_ID` - -Using these environment variables is highly recommended to ensure a secure way -of providing sensitive data to the application. - -### Restrictions and limitations - -When running the migration, ensure that your target deployment has the same (or -bigger) amount of resources (CPU, RAM) than your cluster. Otherwise, the -migration process might get stuck or require manual intervention. This is closely -connected to the type of data you have and how it is distributed between shards -and collections. - -In general, the most important parameters are: -- Total number of leader shards -- The amount of data in bytes per collection - -Both parameters can be retrieved from the ArangoDB Web Interface. - -The `arangosync-migration` tool supports migrating large datasets of up to -5 TB of data and 3800 leader shards, as well as collections as big as 250 GB. - -In case you have any questions, please -[reach out to us](https://www.arangodb.com/contact). - -## Cloud migration workflow for minimal downtime - -1. Download and start the `arangosync-migration` tool. The target deployment - is switched into read-only mode automatically. -2. Wait until all shards are in sync. You can use the `status` or the `start` - command with the same parameters to track that. -3. Optionally, when all shards are in-sync, you can switch your applications - to use the endpoint of the ArangoGraph deployment, but note that it stays in - read-only mode until the migration process is fully completed. -4. Stop the migration using the `stop` subcommand. The following steps are executed: - - The source data cluster is switched into read-only mode. - - It waits until all shards are synchronized. - - The target deployment is switched into default read/write mode. - - {{< info >}} - If you switched the source data cluster into read-only mode, - you can switch it back to default (read/write) mode using the - `set-server-mode` subcommand. - {{< /info >}} diff --git a/site/content/3.13/arangograph/monitoring-and-metrics.md b/site/content/3.13/arangograph/monitoring-and-metrics.md deleted file mode 100644 index 2b9ede4b4a..0000000000 --- a/site/content/3.13/arangograph/monitoring-and-metrics.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Monitoring & Metrics in ArangoGraph -menuTitle: Monitoring & Metrics -weight: 40 -description: >- - ArangoGraph provides various built-in tools and integrations to help you - monitor your deployment ---- -The ArangoGraph Insights Platform provides integrated charts, metrics, and logs -to help you monitor your deployment. This allows you to track your deployment's -performance, resource utilization, and its overall status. - -The key features include: -- **Built-in monitoring**: Get immediate access to monitoring capabilities for - your deployments without any additional setup. -- **Chart-based metrics representation**: Visualize the usage of the DB-Servers - and Coordinators over a selected timeframe. -- **Integration with Prometheus and Grafana**: Connect your metrics to Prometheus - and Grafana for in-depth visualization and analysis. - -To get started, select an existing deployment from within a project and -click **Monitoring** in the navigation. - -![ArangoGraph Monitoring tab](../../images/arangograph-monitoring-tab.png) - -## Built-in monitoring and metrics - -### In the **Servers** section - -The **Servers** section offers an overview of the DB-Servers, Coordinators, -and Agents used in your deployment. It provides essential details such as each -server's ID and type, the running ArangoDB version, as well as their memory, -CPU, and disk usage. - -In case you need to perform a restart on a server, you can do so by using the -**Gracefully restart this server** action button. This shuts down all services -normally, allowing ongoing operations to finish gracefully before the restart -occurs. - -Additionally, you can access detailed logs via the **Logs** button. This allows -you to apply filters to obtain logs from all server types or select specific ones -(i.e. only Coordinators or only DB-Servers) within a timeframe. To download the -logs, click the **Save** button. - -![ArangoGraph Monitoring Servers](../../images/arangograph-monitoring-servers.png) - -### In the **Metrics** section - -The **Metrics** section displays a chart-based representation depicting the -resource utilization of DB-Servers and Coordinators within a specified timeframe. - -You can select one or more DB-Servers and choose **CPU**, **Memory**, or **Disk** -to visualize their respective usage. The search box enables you to easily find -a server by its ID, particularly useful when having a large number of servers -or when needing to quickly find a particular one among many. - -Similarly, you can repeat the process for Coordinators to see the **CPU** and -**Memory** usage. - -![Arangograph Monitoring Metrics Chart](../../images/arangograph-monitoring-metrics-chart.png) - -## Connect with Prometheus and Grafana - -The ArangoGraph Insights Platform provides metrics for each deployment in a -[Prometheus](https://prometheus.io/)-compatible format. -You can use these metrics to gather detailed insights into the current -and previous states of your deployment. -Once metrics are collected by Prometheus, you can inspect them using tools -such as [Grafana](https://grafana.com/oss/grafana/). - -![ArangoGraph Connect Metrics Section](../../images/arangograph-connect-metrics-section.png) - -### Metrics tokens - -The **Metrics tokens** section allows you to create a new metrics token, -which is required for connecting to Prometheus. - -1. To create a metrics token, click **New metrics token**. -2. For **Name**, enter a name for the metrics token. -3. Optionally, you can also enter a **Short description**. -4. Select the **Lifetime** of the metrics token. -5. Click **Create**. - -![ArangoGraph Metrics Tokens](../../images/arangograph-metrics-token.png) - -### How to connect Prometheus - -1. In the **Metrics** section, click **Connect Prometheus**. -2. Create the `prometheus.yml` file with the following content: - ```yaml - global: - scrape_interval: 60s - scrape_configs: - - job_name: 'deployment' - bearer_token: '<fill-your-metrics-token-here>' - scheme: 'https' - static_configs: - - targets: ['6775e7d48152.arangodb.cloud:8829'] - tls_config: - insecure_skip_verify: true - ``` -3. Start Prometheus with the following command: - ```sh - docker run -d \ - -p 9090:9090 -p 3000:3000 --name prometheus \ - -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml:ro \ - prom/prometheus - ``` - {{< info >}} - This command also opens a port 3000 for Grafana. In a production environment, - this is not needed and not recommended to have it open. - {{< /info >}} - -### How to connect Grafana - -1. Start Grafana with the following command: - ```sh - docker run -d \ - --network container:prometheus \ - grafana/grafana - ``` -2. Go to `localhost:3000` and log in with the following credentials: - - For username, enter *admin*. - - For password, enter *admin*. - - {{< tip >}} - After the initial login, make sure to change your password. - {{< /tip >}} - -3. To add a data source, click **Add your first data source** and then do the following: - - Select **Prometheus**. - - For **HTTP URL**, enter `http://localhost:9090`. - - Click **Save & Test**. -4. To add a dashboard, open the menu and click **Create** and then **Import**. -5. Download the [Grafana dashboard for ArangoGraph](https://github.com/arangodb-managed/grafana-dashboards). -6. Copy the contents of the `main.json` file into the **Import via panel json** field in Grafana. -7. Click **Load**. diff --git a/site/content/3.13/arangograph/my-account.md b/site/content/3.13/arangograph/my-account.md deleted file mode 100644 index 91cd87fb3c..0000000000 --- a/site/content/3.13/arangograph/my-account.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: My Account in ArangoGraph -menuTitle: My Account -weight: 35 -description: >- - How to manage your user account, your organizations, and your API keys in ArangoGraph ---- -You can access information related to your account via the __User Toolbar__. -The toolbar is in the top right corner in the ArangoGraph dashboard and -accessible from every view. There are two elements: - -- __Question mark icon__: Help -- __User icon__: My Account - -![ArangoGraph My Account](../../images/arangograph-my-account.png) - -## Overview - -### How to view my account - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __Overview__ in the __My account__ section. -3. The __Overview__ displays your name, email address, company and when the - account was created. - -### How to edit the profile of my account - -1. Hover over or click the user icon in the __User Toolbar__ in the top right corner. -2. Click __Overview__ in the __My account__ section. -3. Click the __Edit__ button. -4. Change your personal information and __Save__. - -![ArangoGraph My Account Info](../../images/arangograph-my-account-info.png) - -## Organizations - -### How to view my organizations - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Your organizations are listed in a table. - Click the organization name or the eye icon in the __Actions__ column to - jump to the organization overview. - -### How to create a new organization - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Click the __New organization__ button. -4. Enter a name and a description for the new organization and click the - __Create__ button. - -{{< info >}} -The free to try tier is limited to a single organization. -{{< /info >}} - -### How to delete an organization - -{{< danger >}} -Removing an organization implies the deletion of projects and deployments. -This operation cannot be undone and **all deployment data will be lost**. -Please proceed with caution. -{{< /danger >}} - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My organizations__ in the __My account__ section. -3. Click the __recycle bin__ icon in the __Actions__ column. -4. Enter `Delete!` to confirm and click __Yes__. - -{{< info >}} -If you are no longer a member of any organization, then a new organization is -created for you when you log in again. -{{< /info >}} - -![ArangoGraph New Organization](../../images/arangograph-new-org.png) - -## Invites - -Invitations are requests to join organizations. You can accept or reject -pending invites. - -### How to create invites - -See [Users and Groups: How to add a new member to the organization](organizations/users-and-groups.md#how-to-add-a-new-member-to-the-organization) - -### How to respond to my invites - -#### I am not a member of an organization yet - -1. Once invited, you will receive an email asking to join your - ArangoGraph organization. - ![ArangoGraph Organization Invite Email](../../images/arangograph-org-invite-email.png) -2. Click the __View my organization invite__ link in the email. You will be - asked to log in or to create a new account. -3. To sign up for a new account, click the __Start Free__ button or the - __Sign up__ link in the header navigation. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) -4. After successfully signing up, you will receive a verification email. -5. Click the __Verify my email address__ link in the email. It takes you back - to the ArangoGraph Insights Platform site. - ![ArangoGraph Organization Invite Email Verify](../../images/arangograph-org-invite-email-verify.png) -6. After successfully logging in, you can accept or reject the invite to - join your organization. - ![ArangoGraph Organization Invite](../../images/arangograph-org-invite.png) -7. After accepting the invite, you become a member of your organization and - will be granted access to the organization and its related projects and - deployments. - -#### I am already a member of an organization - -1. Once invited, you will receive an email asking to join your - ArangoGraph organization, as well as a notification in the ArangoGraph dashboard. -2. Click the __View my organization invites__ link in the email, or hover over the - user icon in the top right corner of the dashboard and click - __My organization invites__. - ![ArangoGraph Organization Invite Notification](../../images/arangograph-org-invite-notification.png) -3. On the __Invites__ tab of the __My account__ view, you can accept or reject - pending invitations, as well as see past invitations that you accepted or - rejected. Click the button with a checkmark icon to join the organization. - ![ArangoGraph Organization Invites Accept](../../images/arangograph-org-invites-accept.png) - -## API Keys - -API keys are authentication tokens intended to be used for scripting. -They allow a script to authenticate on behalf of a user. - -An API key consists of a key and a secret. You need both to complete -authentication. - -### How to view my API keys - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Information about the API keys are listed in the __My API keys__ section. - -![ArangoGraph My API keys](../../images/arangograph-my-api-keys.png) - -### How to create a new API key - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Click the __New API key__ button. -4. Optionally limit the API key to a specific organization. -5. Optionally specify after how many hours the API key should expire into the - __Time to live__ field. -6. Optionally limit the API key to read-only APIs -7. Click the __Create__ button. -8. Copy the API key ID and Secret, then click the __Close__ button. - -{{< security >}} -The secret is only shown once at creation time. -You have to store it in a safe place. -{{< /security >}} - -![ArangoGraph New API key](../../images/arangograph-new-api-key.png) - -![ArangoGraph API key Secret](../../images/arangograph-api-key-secret.png) - -### How to revoke or delete an API key - -1. Hover over or click the user icon of the __User Toolbar__ in the top right corner. -2. Click __My API keys__ in the __My account__ section. -3. Click an icon in the __Actions__ column: - - __Counter-clockwise arrow__ icon: Revoke API key - - __Recycle bin__ icon: Delete API key -4. Click the __Yes__ button to confirm. - -{{% comment %}} -TODO: Copy to clipboard button -Access token that should expire after 1 hour unless renewed, might get removed as it's confusing. -{{% /comment %}} diff --git a/site/content/3.13/arangograph/notebooks.md b/site/content/3.13/arangograph/notebooks.md deleted file mode 100644 index 7c8b0afff9..0000000000 --- a/site/content/3.13/arangograph/notebooks.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: ArangoGraph Notebooks -menuTitle: Notebooks -weight: 25 -description: >- - How to create and manage colocated Jupyter Notebooks within ArangoGraph ---- -{{< info >}} -This documentation describes the beta version of the Notebooks feature and is -subject to change. The beta version is free for all. -{{< /info >}} - -The ArangoGraph Notebook is a JupyterLab notebook embedded in the ArangoGraph -Insights Platform. The notebook integrates seamlessly with platform, -automatically connecting to ArangoGraph services, including ArangoDB and the -ArangoML platform services. This makes it much easier to leverage these -resources without having to download any data locally or to remember user IDs, -passwords, and endpoint URLs. - -![ArangoGraph Notebooks Architecture](../../images/arangograph-notebooks-architecture.png) - -The ArangoGraph Notebook has built-in [ArangoGraph Magic Commands](#arangograph-magic-commands) -that answer questions like: -- What ArangoDB database am I connected to at the moment? -- What data does the ArangoDB instance contain? -- How can I access certain documents? -- How do I create a graph? - -The ArangoGraph Notebook also pre-installs [python-arango](https://docs.python-arango.com/en/main/) -and ArangoML connectors -to [PyG](https://github.com/arangoml/pyg-adapter), -[DGL](https://github.com/arangoml/dgl-adapter), -[CuGraph](https://github.com/arangoml/cugraph-adapter), as well as the -[FastGraphML](https://github.com/arangoml/fastgraphml) -library, so you can get started -right away accessing data in ArangoDB to develop GraphML models using your -favorite GraphML libraries with GPUs. - -## How to create a new notebook - -1. Open the deployment in which you want to create the notebook. -2. Go to the **Data science** section and click the **Create Notebook** button. -3. Enter a name and optionally a description for your new notebook. -4. Select a configuration model from the dropdown menu. Click **Save**. -5. The notebook's phase is set to **Initializing**. Once the phase changes to - **Running**, the notebook's endpoint is accessible. -6. Click the **Open notebook** button to access your notebook. -7. To access your notebook, you need to be signed into ArangoGraph as a user with - the `notebook.notebook.execute` permission in your project. Organization - owners have this permission enabled by default. The `notebook-executor` role - which contains the permission can also be granted to other members of the - organization via roles. See how to create a - [role binding](security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy). - -{{< info >}} -Depending on the tier your organization belongs to, different limitations apply: -- On-Demand and Committed: you can create up to three notebooks per deployment. -- Free-to-try: you can only create one notebook per deployment. -{{< /info >}} - -![Notebooks](../../images/arangograph-notebooks.png) - -{{< info >}} -Notebooks in beta version have a fixed configuration of 10 GB of disk size. -{{< /info >}} - -## How to edit a notebook - -1. Select the notebook that you want to change from the **Notebooks** tab. -2. Click **Edit notebook**. You can modify its name and description. -3. To pause a notebook, click the **Pause notebook** button. You can resume it -at anytime. The notebook's phase is updated accordingly. - -## How to delete a notebook - -1. Select the notebook that you want to remove from the **Notebooks** tab. -2. Click the **Delete notebook** button. - -## Getting Started notebook - -To get a better understanding of how to interact with your ArangoDB database -cluster, use the ArangoGraph Getting Started template. -The ArangoGraph Notebook automatically connects to the ArangoDB service -endpoint, so you can immediately start interacting with it. - -1. Log in to the notebook you have created by using your deployment's root password. -2. Select the `GettingStarted.ipynb` template from the file browser. - -## ArangoGraph Magic Commands - -A list of the available magic commands you can interact with. -Single line commands have `%` prefix and multi-line commands have `%%` prefix. - -**Database Commands** - -- `%listDatabases` - lists the databases on the database server. -- `%whichDatabase` - returns the database name you are connected to. -- `%createDatabase databaseName` - creates a database. -- `%selectDatabase databaseName` - selects a database as the current database. -- `%useDatabase databasename` - uses a database as the current database; - alias for `%selectDatabase`. -- `%getDatabase databaseName` - gets a database. Used for assigning a database, - e.g. `studentDB` = `getDatabase student_database`. -- `%deleteDatabase databaseName` - deletes the database. - -**Graph Commands** - -- `%listGraphs` - lists the graphs defined in the currently selected database. -- `%whichGraph` - returns the graph name that is currently selected. -- `%createGraph graphName` - creates a named graph. -- `%selectGraph graphName` - selects the graph as the current graph. -- `%useGraph graphName` - uses the graph as the current graph; - alias for `%selectGraph`. -- `%getGraph graphName` - gets the graph for variable assignment, - e.g. `studentGraph` = `%getGraph student-graph`. -- `%deleteGraph graphName` - deletes a graph. - -**Collection Commands** - -- `%listCollections` - lists the collections on the selected current database. -- `%whichCollection` - returns the collection name that is currently selected. -- `%createCollection collectionName` - creates a collection. -- `%selectCollection collectionName` - selects a collection as the current collection. -- `%useCollection collectionName` - uses the collection as the current collection; - alias for `%selectCollection`. -- `%getCollection collectionName` - gets a collection for variable assignment, - e.g. `student` = `% getCollection Student`. -- `%createEdgeCollection` - creates an edge collection. -- `%createVertexCollection` - creates a node collection. -- `%createEdgeDefinition` - creates an edge definition. -- `%deleteCollection collectionName` - deletes the collection. -- `%truncateCollection collectionName` - truncates the collection. -- `%sampleCollection collectionName` - returns a random document from the collection. - If no collection is specified, then it uses the selected collection. - -**Document Commands** - -- `%insertDocument jsonDocument` - inserts the document into the currently selected collection. -- `%replaceDocument jsonDocument` - replaces the document in the currently selected collection. -- `%updateDocument jsonDocument` - updates the document in the currently selected collection. -- `%deleteDocument jsonDocument` - deletes the document from the currently selected collection. -- `%%importBulk jsonDocumentArray` - imports an array of documents into the currently selected collection. - -**AQL Commands** - -- `%aql single-line_aql_query` - executes a single line AQL query. -- `%%aqlm multi-line_aql_query` - executes a multi-line AQL query. - -**Variables** - -- `_endpoint` - the endpoint (URL) of the ArangoDB Server. -- `_system` - the system database used for creating, listing, and deleting databases. -- `_db` - the selected (current) database. To select a different database, use `%selectDatabase`. -- `_graph` - the selected (current) graph. To select a different graph, use `%selectGraph`. -- `_collection` - the selected (current) collection. To select a different collection, use `%selectCollection`. -- `_user` - the current user. - -You can use these variables directly, for example, `_db.collections()` to list -collections or `_system.databases` to list databases. - -You can also create your own variable assignments, such as: - -- `schoolDB` = `%getDatabase schoolDB` -- `school_graph` = `%getGraph school_graph` -- `student` = `%getCollection Student` - -**Reset environment** - -In the event that any of the above variables have been unintentionally changed, -you can revert all of them to the default state with `reset_environment()`. diff --git a/site/content/3.13/arangograph/oasisctl/_index.md b/site/content/3.13/arangograph/oasisctl/_index.md deleted file mode 100644 index 9d22a68e31..0000000000 --- a/site/content/3.13/arangograph/oasisctl/_index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Oasisctl -menuTitle: Oasisctl -weight: 65 -description: >- - Command-line client tool for managing the ArangoGraph Insights Platform ---- -Oasisctl is a command-line tool for using the [ArangoGraph API](../api/_index.md). -This tool makes integration of ArangoGraph in all kinds of (bash) scripts easy. -It is also a good example on how to use the API. - -See [Getting started with Oasisctl](../api/get-started.md) for a -tutorial. - -Oasisctl is available for Linux, macOS and Windows. -Download and source code: - -[github.com/arangodb-managed/oasisctl](https://github.com/arangodb-managed/oasisctl/) diff --git a/site/content/3.13/arangograph/oasisctl/accept/_index.md b/site/content/3.13/arangograph/oasisctl/accept/_index.md deleted file mode 100644 index e9c0e05a01..0000000000 --- a/site/content/3.13/arangograph/oasisctl/accept/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Accept -menuTitle: Accept -weight: 2 ---- -## oasisctl accept - -Accept invites - -``` -oasisctl accept [flags] -``` - -## Options -``` - -h, --help help for accept -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl accept organization](accept-organization.md) - Accept organization related invites - diff --git a/site/content/3.13/arangograph/oasisctl/accept/accept-organization-invite.md b/site/content/3.13/arangograph/oasisctl/accept/accept-organization-invite.md deleted file mode 100644 index 3f52fbb67b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/accept/accept-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Accept Organization Invite -menuTitle: Accept Organization Invite -weight: 2 ---- -## oasisctl accept organization invite - -Accept an organization invite the authenticated user has access to - -``` -oasisctl accept organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept organization](accept-organization.md) - Accept organization related invites - diff --git a/site/content/3.13/arangograph/oasisctl/accept/accept-organization.md b/site/content/3.13/arangograph/oasisctl/accept/accept-organization.md deleted file mode 100644 index f4d5310a16..0000000000 --- a/site/content/3.13/arangograph/oasisctl/accept/accept-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Accept Organization -menuTitle: Accept Organization -weight: 1 ---- -## oasisctl accept organization - -Accept organization related invites - -``` -oasisctl accept organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept](_index.md) - Accept invites -* [oasisctl accept organization invite](accept-organization-invite.md) - Accept an organization invite the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/add/_index.md b/site/content/3.13/arangograph/oasisctl/add/_index.md deleted file mode 100644 index c44318f848..0000000000 --- a/site/content/3.13/arangograph/oasisctl/add/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Add -menuTitle: Add -weight: 3 ---- -## oasisctl add - -Add resources - -``` -oasisctl add [flags] -``` - -## Options -``` - -h, --help help for add -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl add auditlog](add-auditlog.md) - Add auditlog resources -* [oasisctl add group](add-group.md) - Add group resources - diff --git a/site/content/3.13/arangograph/oasisctl/add/add-auditlog-destination.md b/site/content/3.13/arangograph/oasisctl/add/add-auditlog-destination.md deleted file mode 100644 index 378e456833..0000000000 --- a/site/content/3.13/arangograph/oasisctl/add/add-auditlog-destination.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Oasisctl Add Audit Log Destination -menuTitle: Add Audit Log Destination -weight: 2 ---- -## oasisctl add auditlog destination - -Add a destination to an auditlog. - -``` -oasisctl add auditlog destination [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - --destination-excluded-topics strings Do not send audit events with these topics to this destination. - --destination-https-client-certificate-pem string PEM encoded public key of the client certificate. - --destination-https-client-key-pem string PEM encoded private key of the client certificate. - --destination-https-headers strings A key=value formatted list of headers for the request. Repeating headers are allowed. - --destination-https-trusted-server-ca-pem string PEM encoded public key of the CA used to sign the server TLS certificate. If empty, a well known CA is expected. - --destination-https-url string URL of the server to POST to. Scheme must be HTTPS. - --destination-type string Type of destination. Possible values are: "cloud", "https-post" - -h, --help help for destination - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add auditlog](add-auditlog.md) - Add auditlog resources - diff --git a/site/content/3.13/arangograph/oasisctl/add/add-auditlog.md b/site/content/3.13/arangograph/oasisctl/add/add-auditlog.md deleted file mode 100644 index dca21fda97..0000000000 --- a/site/content/3.13/arangograph/oasisctl/add/add-auditlog.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Add Audit Log -menuTitle: Add Audit Log -weight: 1 ---- -## oasisctl add auditlog - -Add auditlog resources - -``` -oasisctl add auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add](_index.md) - Add resources -* [oasisctl add auditlog destination](add-auditlog-destination.md) - Add a destination to an auditlog. - diff --git a/site/content/3.13/arangograph/oasisctl/add/add-group-members.md b/site/content/3.13/arangograph/oasisctl/add/add-group-members.md deleted file mode 100644 index db2677d276..0000000000 --- a/site/content/3.13/arangograph/oasisctl/add/add-group-members.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Add Group Members -menuTitle: Add Group Members -weight: 4 ---- -## oasisctl add group members - -Add members to group - -``` -oasisctl add group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group to add members to - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add group](add-group.md) - Add group resources - diff --git a/site/content/3.13/arangograph/oasisctl/add/add-group.md b/site/content/3.13/arangograph/oasisctl/add/add-group.md deleted file mode 100644 index a51b0b7102..0000000000 --- a/site/content/3.13/arangograph/oasisctl/add/add-group.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Add Group -menuTitle: Add Group -weight: 3 ---- -## oasisctl add group - -Add group resources - -``` -oasisctl add group [flags] -``` - -## Options -``` - -h, --help help for group -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl add](_index.md) - Add resources -* [oasisctl add group members](add-group-members.md) - Add members to group - diff --git a/site/content/3.13/arangograph/oasisctl/auditlog/_index.md b/site/content/3.13/arangograph/oasisctl/auditlog/_index.md deleted file mode 100644 index fd71b3b653..0000000000 --- a/site/content/3.13/arangograph/oasisctl/auditlog/_index.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Audit Log -menuTitle: Audit Log -weight: 4 ---- -## oasisctl auditlog - -AuditLog resources - -``` -oasisctl auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl auditlog attach](auditlog-attach.md) - Attach a project to an audit log -* [oasisctl auditlog detach](auditlog-detach.md) - Detach a project from an auditlog -* [oasisctl auditlog get](auditlog-get.md) - Audit log get resources - diff --git a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-attach.md b/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-attach.md deleted file mode 100644 index 7ffcd50360..0000000000 --- a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-attach.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Audit Log Attach -menuTitle: Audit Log Attach -weight: 1 ---- -## oasisctl auditlog attach - -Attach a project to an audit log - -``` -oasisctl auditlog attach [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to attach to. - -h, --help help for attach - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources - diff --git a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-detach.md b/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-detach.md deleted file mode 100644 index 4043614c32..0000000000 --- a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-detach.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Audit Log Detach -menuTitle: Audit Log Detach -weight: 2 ---- -## oasisctl auditlog detach - -Detach a project from an auditlog - -``` -oasisctl auditlog detach [flags] -``` - -## Options -``` - -h, --help help for detach - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources - diff --git a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md b/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md deleted file mode 100644 index b4c2a69666..0000000000 --- a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Audit Log Get Attached Project -menuTitle: Audit Log Get Attached Project -weight: 5 ---- -## oasisctl auditlog get attached project - -Get an attached log to a project - -``` -oasisctl auditlog get attached project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog get attached](auditlog-get-attached.md) - Audit get attached resources - diff --git a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached.md b/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached.md deleted file mode 100644 index 004400da64..0000000000 --- a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get-attached.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Audit Log Get Attached -menuTitle: Audit Log Get Attached -weight: 4 ---- -## oasisctl auditlog get attached - -Audit get attached resources - -``` -oasisctl auditlog get attached [flags] -``` - -## Options -``` - -h, --help help for attached -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog get](auditlog-get.md) - Audit log get resources -* [oasisctl auditlog get attached project](auditlog-get-attached-project.md) - Get an attached log to a project - diff --git a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get.md b/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get.md deleted file mode 100644 index d3b170c666..0000000000 --- a/site/content/3.13/arangograph/oasisctl/auditlog/auditlog-get.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Audit Log Get -menuTitle: Audit Log Get -weight: 3 ---- -## oasisctl auditlog get - -Audit log get resources - -``` -oasisctl auditlog get [flags] -``` - -## Options -``` - -h, --help help for get -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl auditlog](_index.md) - AuditLog resources -* [oasisctl auditlog get attached](auditlog-get-attached.md) - Audit get attached resources - diff --git a/site/content/3.13/arangograph/oasisctl/backup/_index.md b/site/content/3.13/arangograph/oasisctl/backup/_index.md deleted file mode 100644 index 2a19e74e37..0000000000 --- a/site/content/3.13/arangograph/oasisctl/backup/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Backup -menuTitle: Backup -weight: 5 ---- -## oasisctl backup - -Backup commands - -``` -oasisctl backup [flags] -``` - -## Options -``` - -h, --help help for backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl backup copy](backup-copy.md) - Copy a backup from source backup to given region -* [oasisctl backup download](backup-download.md) - Download a backup - diff --git a/site/content/3.13/arangograph/oasisctl/backup/backup-copy.md b/site/content/3.13/arangograph/oasisctl/backup/backup-copy.md deleted file mode 100644 index b492b5d92b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/backup/backup-copy.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Backup Copy -menuTitle: Backup Copy -weight: 1 ---- -## oasisctl backup copy - -Copy a backup from source backup to given region - -``` -oasisctl backup copy [flags] -``` - -## Options -``` - -h, --help help for copy - --region-id string Identifier of the region where the new backup is to be created - --source-backup-id string Identifier of the source backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl backup](_index.md) - Backup commands - diff --git a/site/content/3.13/arangograph/oasisctl/backup/backup-download.md b/site/content/3.13/arangograph/oasisctl/backup/backup-download.md deleted file mode 100644 index b458b57b48..0000000000 --- a/site/content/3.13/arangograph/oasisctl/backup/backup-download.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Backup Download -menuTitle: Backup Download -weight: 2 ---- -## oasisctl backup download - -Download a backup - -## Synopsis -Download a backup from the cloud storage to the local deployment disks, so it can be restored. - -``` -oasisctl backup download [flags] -``` - -## Options -``` - -h, --help help for download - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl backup](_index.md) - Backup commands - diff --git a/site/content/3.13/arangograph/oasisctl/clone/_index.md b/site/content/3.13/arangograph/oasisctl/clone/_index.md deleted file mode 100644 index 7edaf4178e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/clone/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Clone -menuTitle: Clone -weight: 6 ---- -## oasisctl clone - -Clone resources - -``` -oasisctl clone [flags] -``` - -## Options -``` - -h, --help help for clone -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl clone deployment](clone-deployment.md) - Clone deployment resources - diff --git a/site/content/3.13/arangograph/oasisctl/clone/clone-deployment-backup.md b/site/content/3.13/arangograph/oasisctl/clone/clone-deployment-backup.md deleted file mode 100644 index 5f98d22b91..0000000000 --- a/site/content/3.13/arangograph/oasisctl/clone/clone-deployment-backup.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Clone Deployment Backup -menuTitle: Clone Deployment Backup -weight: 2 ---- -## oasisctl clone deployment backup - -Clone a deployment from a backup. - -``` -oasisctl clone deployment backup [flags] -``` - -## Options -``` - --accept Accept the current terms and conditions. - -b, --backup-id string Clone a deployment from a backup using the backup's ID. - -h, --help help for backup - -o, --organization-id string Identifier of the organization to create the clone in - -p, --project-id string An optional identifier of the project to create the clone in - -r, --region-id string An optionally defined region in which the new deployment should be created in. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl clone deployment](clone-deployment.md) - Clone deployment resources - diff --git a/site/content/3.13/arangograph/oasisctl/clone/clone-deployment.md b/site/content/3.13/arangograph/oasisctl/clone/clone-deployment.md deleted file mode 100644 index 0b76d1fec8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/clone/clone-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Clone Deployment -menuTitle: Clone Deployment -weight: 1 ---- -## oasisctl clone deployment - -Clone deployment resources - -``` -oasisctl clone deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl clone](_index.md) - Clone resources -* [oasisctl clone deployment backup](clone-deployment-backup.md) - Clone a deployment from a backup. - diff --git a/site/content/3.13/arangograph/oasisctl/completion.md b/site/content/3.13/arangograph/oasisctl/completion.md deleted file mode 100644 index 9cd58cd4f6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/completion.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Oasisctl Completion -menuTitle: Completion -weight: 7 ---- -## oasisctl completion - -Generates bash completion scripts - -## Synopsis -To load completion run - - . <(oasisctl completion [bash|fish|powershell|zsh]) - -To configure your bash shell to load completions for each session add to your bashrc - - # ~/.bashrc or ~/.profile - . <(oasisctl completion bash) - - -``` -oasisctl completion [flags] -``` - -## Options -``` - -h, --help help for completion -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/create/_index.md b/site/content/3.13/arangograph/oasisctl/create/_index.md deleted file mode 100644 index 87ef865918..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/_index.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Oasisctl Create -menuTitle: Create -weight: 8 ---- -## oasisctl create - -Create resources - -``` -oasisctl create [flags] -``` - -## Options -``` - -h, --help help for create -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl create apikey](create-apikey.md) - Create a new API key -* [oasisctl create auditlog](create-auditlog.md) - Create an auditlog -* [oasisctl create backup](create-backup.md) - Create backup ... -* [oasisctl create cacertificate](create-cacertificate.md) - Create a new CA certificate -* [oasisctl create deployment](create-deployment.md) - Create a new deployment -* [oasisctl create example](create-example.md) - Create example ... -* [oasisctl create group](create-group.md) - Create a new group -* [oasisctl create ipallowlist](create-ipallowlist.md) - Create a new IP allowlist -* [oasisctl create metrics](create-metrics.md) - Create metrics resources -* [oasisctl create notebook](create-notebook.md) - Create a new notebook -* [oasisctl create organization](create-organization.md) - Create a new organization -* [oasisctl create private](create-private.md) - Create private resources -* [oasisctl create project](create-project.md) - Create a new project -* [oasisctl create role](create-role.md) - Create a new role - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-apikey.md b/site/content/3.13/arangograph/oasisctl/create/create-apikey.md deleted file mode 100644 index 1177d5cc67..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-apikey.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Create API Key -menuTitle: Create API Key -weight: 1 ---- -## oasisctl create apikey - -Create a new API key - -``` -oasisctl create apikey [flags] -``` - -## Options -``` - -h, --help help for apikey - -o, --organization-id string If set, the newly created API key will grant access to this organization only - --readonly If set, the newly created API key will grant readonly access only -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-auditlog.md b/site/content/3.13/arangograph/oasisctl/create/create-auditlog.md deleted file mode 100644 index 5863da66e8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Audit Log -menuTitle: Create Audit Log -weight: 2 ---- -## oasisctl create auditlog - -Create an auditlog - -``` -oasisctl create auditlog [flags] -``` - -## Options -``` - --default If set, this AuditLog is the default for the organization. - --description string Description of the audit log. - -h, --help help for auditlog - --name string Name of the audit log. - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-backup-policy.md b/site/content/3.13/arangograph/oasisctl/create/create-backup-policy.md deleted file mode 100644 index 99f899b951..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-backup-policy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Oasisctl Create Backup Policy -menuTitle: Create Backup Policy -weight: 4 ---- -## oasisctl create backup policy - -Create a new backup policy - -``` -oasisctl create backup policy [flags] -``` - -## Options -``` - --additional-region-ids strings Add backup to the specified addition regions - --day-of-the-month int32 Run the backup on the specified day of the month (1-31) (default 1) - --deployment-id string ID of the deployment - --description string Description of the backup policy - --email-notification string Email notification setting (Never|FailureOnly|Always) - --every-interval-hours int32 Schedule should run with an interval of the specified hours (1-23) - --friday If set, a backup will be created on Fridays. - -h, --help help for policy - --hours int32 Hours part of the time of day (0-23) - --minutes int32 Minutes part of the time of day (0-59) - --minutes-offset int32 Schedule should run with specific minutes offset (0-59) - --monday If set, a backup will be created on Mondays - --name string Name of the deployment - --paused The policy is paused - --retention-period int Backups created by this policy will be automatically deleted after the specified retention period. A value of 0 means that backup will never be deleted. - --saturday If set, a backup will be created on Saturdays - --schedule-type string Schedule of the policy (Hourly|Daily|Monthly) - --sunday If set, a backup will be created on Sundays - --thursday If set, a backup will be created on Thursdays - --time-zone string The time-zone this time of day applies to (empty means UTC). Names MUST be exactly as defined in RFC-822. (default "UTC") - --tuesday If set, a backup will be created on Tuesdays - --upload The backup should be uploaded - --wednesday If set, a backup will be created on Wednesdays -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create backup](create-backup.md) - Create backup ... - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-backup.md b/site/content/3.13/arangograph/oasisctl/create/create-backup.md deleted file mode 100644 index 8ca544206c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-backup.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create Backup -menuTitle: Create Backup -weight: 3 ---- -## oasisctl create backup - -Create backup ... - -``` -oasisctl create backup [flags] -``` - -## Options -``` - --auto-deleted-at int Time (h) until auto delete of the backup - --deployment-id string ID of the deployment - --description string Description of the backup - -h, --help help for backup - --name string Name of the deployment - --upload The backup should be uploaded -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create backup policy](create-backup-policy.md) - Create a new backup policy - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-cacertificate.md b/site/content/3.13/arangograph/oasisctl/create/create-cacertificate.md deleted file mode 100644 index b27b6e7db8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-cacertificate.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Create CA Certificate -menuTitle: Create CA Certificate -weight: 5 ---- -## oasisctl create cacertificate - -Create a new CA certificate - -``` -oasisctl create cacertificate [flags] -``` - -## Options -``` - --description string Description of the CA certificate - -h, --help help for cacertificate - --lifetime duration Lifetime of the CA certificate. - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization to create the CA certificate in - -p, --project-id string Identifier of the project to create the CA certificate in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-deployment.md b/site/content/3.13/arangograph/oasisctl/create/create-deployment.md deleted file mode 100644 index c9f633fd99..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-deployment.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Oasisctl Create Deployment -menuTitle: Create Deployment -weight: 6 ---- -## oasisctl create deployment - -Create a new deployment - -``` -oasisctl create deployment [flags] -``` - -## Options -``` - --accept Accept the current terms and conditions. - -c, --cacertificate-id string Identifier of the CA certificate to use for the deployment - --coordinator-memory-size int32 Set memory size of Coordinators for flexible deployments (GiB) (default 4) - --coordinators int32 Set number of Coordinators for flexible deployments (default 3) - --custom-image string Set a custom image to use for the deployment. Only available for selected customers. - --dbserver-disk-size int32 Set disk size of DB-Servers for flexible deployments (GiB) (default 32) - --dbserver-memory-size int32 Set memory size of DB-Servers for flexible deployments (GiB) (default 4) - --dbservers int32 Set number of DB-Servers for flexible deployments (default 3) - --deployment-profile-id string Set the Deployment Profile to use for this deployment. - --description string Description of the deployment - --disable-foxx-authentication Disable authentication of requests to Foxx application. - --disk-performance-id string Set the disk performance to use for this deployment. - --drop-vst-support Drop VST protocol support to improve resilience. - -h, --help help for deployment - -i, --ipallowlist-id string Identifier of the IP allowlist to use for the deployment - --is-platform-authentication-enabled Enable platform authentication for deployment. - --max-node-disk-size int32 Set maximum disk size for nodes for autoscaler (GiB) - --model string Set model of the deployment (default "oneshard") - --name string Name of the deployment - --node-count int32 Set the number of desired nodes (default 3) - --node-disk-size int32 Set disk size for nodes (GiB) - --node-size-id string Set the node size to use for this deployment - --notification-email-address strings Set email address(-es) that will be used for notifications related to this deployment. - -o, --organization-id string Identifier of the organization to create the deployment in - -p, --project-id string Identifier of the project to create the deployment in - -r, --region-id string Identifier of the region to create the deployment in - --version string Version of ArangoDB to use for the deployment (default "default") -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-example-installation.md b/site/content/3.13/arangograph/oasisctl/create/create-example-installation.md deleted file mode 100644 index 121d13dccd..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Example Installation -menuTitle: Create Example Installation -weight: 8 ---- -## oasisctl create example installation - -Create a new example dataset installation - -``` -oasisctl create example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -e, --example-dataset-id string ID of the example dataset - -h, --help help for installation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create example](create-example.md) - Create example ... - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-example.md b/site/content/3.13/arangograph/oasisctl/create/create-example.md deleted file mode 100644 index 5b1a50cf0e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Example -menuTitle: Create Example -weight: 7 ---- -## oasisctl create example - -Create example ... - -``` -oasisctl create example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create example installation](create-example-installation.md) - Create a new example dataset installation - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-group.md b/site/content/3.13/arangograph/oasisctl/create/create-group.md deleted file mode 100644 index d28e7ec7d2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-group.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Group -menuTitle: Create Group -weight: 9 ---- -## oasisctl create group - -Create a new group - -``` -oasisctl create group [flags] -``` - -## Options -``` - --description string Description of the group - -h, --help help for group - --name string Name of the group - -o, --organization-id string Identifier of the organization to create the group in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-ipallowlist.md b/site/content/3.13/arangograph/oasisctl/create/create-ipallowlist.md deleted file mode 100644 index 07f4308515..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-ipallowlist.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create IP Allowlist -menuTitle: Create IP Allowlist -weight: 10 ---- -## oasisctl create ipallowlist - -Create a new IP allowlist - -``` -oasisctl create ipallowlist [flags] -``` - -## Options -``` - --cidr-range strings List of CIDR ranges from which deployments are accessible - --description string Description of the IP allowlist - -h, --help help for ipallowlist - --name string Name of the IP allowlist - -o, --organization-id string Identifier of the organization to create the IP allowlist in - -p, --project-id string Identifier of the project to create the IP allowlist in - --remote-inspection-allowed If set, remote connectivity checks by the Oasis platform are allowed -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-metrics-token.md b/site/content/3.13/arangograph/oasisctl/create/create-metrics-token.md deleted file mode 100644 index a5e0e9a9dd..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-metrics-token.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Create Metrics Token -menuTitle: Create Metrics Token -weight: 12 ---- -## oasisctl create metrics token - -Create a new metrics access token - -``` -oasisctl create metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to create the token for - --description string Description of the token - -h, --help help for token - --lifetime duration Lifetime of the token. - --name string Name of the token - -o, --organization-id string Identifier of the organization to create the token in - -p, --project-id string Identifier of the project to create the token in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create metrics](create-metrics.md) - Create metrics resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-metrics.md b/site/content/3.13/arangograph/oasisctl/create/create-metrics.md deleted file mode 100644 index d504981b04..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Metrics -menuTitle: Create Metrics -weight: 11 ---- -## oasisctl create metrics - -Create metrics resources - -``` -oasisctl create metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create metrics token](create-metrics-token.md) - Create a new metrics access token - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-notebook.md b/site/content/3.13/arangograph/oasisctl/create/create-notebook.md deleted file mode 100644 index 8e1f2dcd53..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-notebook.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Create Notebook -menuTitle: Create Notebook -weight: 13 ---- -## oasisctl create notebook - -Create a new notebook - -``` -oasisctl create notebook [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebook has to run next to - --description string Description of the notebook - -s, --disk-size int32 Disk size in GiB that has to be attached to given notebook - -h, --help help for notebook - -n, --name string Name of the notebook - -m, --notebook-model string Identifier of the notebook model that the notebook has to use - -o, --organization-id string Identifier of the organization to create the notebook in - -p, --project-id string Identifier of the project to create the notebook in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-organization-invite.md b/site/content/3.13/arangograph/oasisctl/create/create-organization-invite.md deleted file mode 100644 index 3fbe04a1fe..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Create Organization Invite -menuTitle: Create Organization Invite -weight: 15 ---- -## oasisctl create organization invite - -Create a new invite to an organization - -``` -oasisctl create organization invite [flags] -``` - -## Options -``` - --email string Email address of the person to invite - -h, --help help for invite - -o, --organization-id string Identifier of the organization to create the invite in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create organization](create-organization.md) - Create a new organization - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-organization.md b/site/content/3.13/arangograph/oasisctl/create/create-organization.md deleted file mode 100644 index 8ca1b9065b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-organization.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Organization -menuTitle: Create Organization -weight: 14 ---- -## oasisctl create organization - -Create a new organization - -``` -oasisctl create organization [flags] -``` - -## Options -``` - --description string Description of the organization - -h, --help help for organization - --name string Name of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create organization invite](create-organization-invite.md) - Create a new invite to an organization - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-private-endpoint-service.md b/site/content/3.13/arangograph/oasisctl/create/create-private-endpoint-service.md deleted file mode 100644 index 01999a99ce..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-private-endpoint-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Oasisctl Create Private Endpoint Service -menuTitle: Create Private Endpoint Service -weight: 18 ---- -## oasisctl create private endpoint service - -Create a Private Endpoint Service attached to an existing deployment - -``` -oasisctl create private endpoint service [flags] -``` - -## Options -``` - --alternate-dns-name strings DNS names used for the deployment in the private network - --aws-principal strings List of AWS Principals from which a Private Endpoint can be created (Format: <AccountID>[/Role/<RoleName>|/User/<UserName>]) - --azure-client-subscription-id strings List of Azure subscription IDs from which a Private Endpoint can be created - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - --description string Description of the private endpoint service - --enable-private-dns Enable private DNS for the deployment (applicable for AWS and GKE only) - --gcp-project strings List of GCP projects from which a Private Endpoint can be created - -h, --help help for service - --name string Name of the private endpoint service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create private endpoint](create-private-endpoint.md) - - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-private-endpoint.md b/site/content/3.13/arangograph/oasisctl/create/create-private-endpoint.md deleted file mode 100644 index cac7dbfcb7..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Private Endpoint -menuTitle: Create Private Endpoint -weight: 17 ---- -## oasisctl create private endpoint - - - -``` -oasisctl create private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create private](create-private.md) - Create private resources -* [oasisctl create private endpoint service](create-private-endpoint-service.md) - Create a Private Endpoint Service attached to an existing deployment - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-private.md b/site/content/3.13/arangograph/oasisctl/create/create-private.md deleted file mode 100644 index 3cb40e735b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Create Private -menuTitle: Create Private -weight: 16 ---- -## oasisctl create private - -Create private resources - -``` -oasisctl create private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources -* [oasisctl create private endpoint](create-private-endpoint.md) - - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-project.md b/site/content/3.13/arangograph/oasisctl/create/create-project.md deleted file mode 100644 index 59d997efb7..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-project.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Create Project -menuTitle: Create Project -weight: 19 ---- -## oasisctl create project - -Create a new project - -``` -oasisctl create project [flags] -``` - -## Options -``` - --description string Description of the project - -h, --help help for project - --name string Name of the project - -o, --organization-id string Identifier of the organization to create the project in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/create/create-role.md b/site/content/3.13/arangograph/oasisctl/create/create-role.md deleted file mode 100644 index 52cec0a672..0000000000 --- a/site/content/3.13/arangograph/oasisctl/create/create-role.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Create Role -menuTitle: Create Role -weight: 20 ---- -## oasisctl create role - -Create a new role - -``` -oasisctl create role [flags] -``` - -## Options -``` - --description string Description of the role - -h, --help help for role - --name string Name of the role - -o, --organization-id string Identifier of the organization to create the role in - -p, --permission strings Permissions granted by the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl create](_index.md) - Create resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/_index.md b/site/content/3.13/arangograph/oasisctl/delete/_index.md deleted file mode 100644 index 75b76a80b6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/_index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Oasisctl Delete -menuTitle: Delete -weight: 9 ---- -## oasisctl delete - -Delete resources - -``` -oasisctl delete [flags] -``` - -## Options -``` - -h, --help help for delete -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl delete apikey](delete-apikey.md) - Delete an API key with given identifier -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog -* [oasisctl delete backup](delete-backup.md) - Delete a backup for a given ID. -* [oasisctl delete cacertificate](delete-cacertificate.md) - Delete a CA certificate the authenticated user has access to -* [oasisctl delete deployment](delete-deployment.md) - Delete a deployment the authenticated user has access to -* [oasisctl delete example](delete-example.md) - Delete example ... -* [oasisctl delete group](delete-group.md) - Delete a group the authenticated user has access to -* [oasisctl delete ipallowlist](delete-ipallowlist.md) - Delete an IP allowlist the authenticated user has access to -* [oasisctl delete metrics](delete-metrics.md) - Delete metrics resources -* [oasisctl delete notebook](delete-notebook.md) - Delete a notebook -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to -* [oasisctl delete project](delete-project.md) - Delete a project the authenticated user has access to -* [oasisctl delete role](delete-role.md) - Delete a role the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-apikey.md b/site/content/3.13/arangograph/oasisctl/delete/delete-apikey.md deleted file mode 100644 index d18236eac3..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-apikey.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete API Key -menuTitle: Delete API Key -weight: 1 ---- -## oasisctl delete apikey - -Delete an API key with given identifier - -``` -oasisctl delete apikey [flags] -``` - -## Options -``` - -i, --apikey-id string Identifier of the API key to delete - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive-events.md b/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive-events.md deleted file mode 100644 index d337652b7b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive-events.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Archive Events -menuTitle: Delete Audit Log Archive Events -weight: 4 ---- -## oasisctl delete auditlog archive events - -Delete auditlog archive events - -``` -oasisctl delete auditlog archive events [flags] -``` - -## Options -``` - -i, --auditlog-archive-id string Identifier of the auditlog archive to delete events from. - -h, --help help for events - --to string Remove events created before this timestamp. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog archive](delete-auditlog-archive.md) - Delete an auditlog archive - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive.md b/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive.md deleted file mode 100644 index 59153bfbdd..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-archive.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Archive -menuTitle: Delete Audit Log Archive -weight: 3 ---- -## oasisctl delete auditlog archive - -Delete an auditlog archive - -``` -oasisctl delete auditlog archive [flags] -``` - -## Options -``` - -i, --auditlog-archive-id string Identifier of the auditlog archive to delete. - -h, --help help for archive -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog -* [oasisctl delete auditlog archive events](delete-auditlog-archive-events.md) - Delete auditlog archive events - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-destination.md b/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-destination.md deleted file mode 100644 index 6dcb135925..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog-destination.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Delete Audit Log Destination -menuTitle: Delete Audit Log Destination -weight: 5 ---- -## oasisctl delete auditlog destination - -Delete a destination from an auditlog - -``` -oasisctl delete auditlog destination [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to delete. - -h, --help help for destination - --index int Index of the destination to remove. Only one delete option can be specified. (default -1) - -o, --organization-id string Identifier of the organization. - --type string Type of the destination to remove. This will remove ALL destinations with that type. - --url string An optional URL which will be used to delete a single destination instead of all. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete auditlog](delete-auditlog.md) - Delete an auditlog - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog.md b/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog.md deleted file mode 100644 index 6895de151f..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Audit Log -menuTitle: Delete Audit Log -weight: 2 ---- -## oasisctl delete auditlog - -Delete an auditlog - -``` -oasisctl delete auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to delete. - -h, --help help for auditlog - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete auditlog archive](delete-auditlog-archive.md) - Delete an auditlog archive -* [oasisctl delete auditlog destination](delete-auditlog-destination.md) - Delete a destination from an auditlog - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-backup-policy.md b/site/content/3.13/arangograph/oasisctl/delete/delete-backup-policy.md deleted file mode 100644 index 99e8ac2deb..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-backup-policy.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Backup Policy -menuTitle: Delete Backup Policy -weight: 7 ---- -## oasisctl delete backup policy - -Delete a backup policy for a given ID. - -``` -oasisctl delete backup policy [flags] -``` - -## Options -``` - -h, --help help for policy - -i, --id string Identifier of the backup policy - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete backup](delete-backup.md) - Delete a backup for a given ID. - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-backup.md b/site/content/3.13/arangograph/oasisctl/delete/delete-backup.md deleted file mode 100644 index cf116f93a1..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-backup.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Backup -menuTitle: Delete Backup -weight: 6 ---- -## oasisctl delete backup - -Delete a backup for a given ID. - -``` -oasisctl delete backup [flags] -``` - -## Options -``` - -h, --help help for backup - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete backup policy](delete-backup-policy.md) - Delete a backup policy for a given ID. - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-cacertificate.md b/site/content/3.13/arangograph/oasisctl/delete/delete-cacertificate.md deleted file mode 100644 index aad85c751b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete CA Certificate -menuTitle: Delete CA Certificate -weight: 8 ---- -## oasisctl delete cacertificate - -Delete a CA certificate the authenticated user has access to - -``` -oasisctl delete cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-deployment.md b/site/content/3.13/arangograph/oasisctl/delete/delete-deployment.md deleted file mode 100644 index 15450ecb9b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Deployment -menuTitle: Delete Deployment -weight: 9 ---- -## oasisctl delete deployment - -Delete a deployment the authenticated user has access to - -``` -oasisctl delete deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-example-installation.md b/site/content/3.13/arangograph/oasisctl/delete/delete-example-installation.md deleted file mode 100644 index 569152227e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Example Installation -menuTitle: Delete Example Installation -weight: 11 ---- -## oasisctl delete example installation - -Delete an example datasets installation - -``` -oasisctl delete example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installation - --installation-id string The ID of the installation to delete. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete example](delete-example.md) - Delete example ... - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-example.md b/site/content/3.13/arangograph/oasisctl/delete/delete-example.md deleted file mode 100644 index 9518b2d7d1..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Example -menuTitle: Delete Example -weight: 10 ---- -## oasisctl delete example - -Delete example ... - -``` -oasisctl delete example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete example installation](delete-example-installation.md) - Delete an example datasets installation - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-group-members.md b/site/content/3.13/arangograph/oasisctl/delete/delete-group-members.md deleted file mode 100644 index ae6dc82a96..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-group-members.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Group Members -menuTitle: Delete Group Members -weight: 13 ---- -## oasisctl delete group members - -Delete members from group - -``` -oasisctl delete group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group to delete members from - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete group](delete-group.md) - Delete a group the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-group.md b/site/content/3.13/arangograph/oasisctl/delete/delete-group.md deleted file mode 100644 index 4f6fe7d91c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-group.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Group -menuTitle: Delete Group -weight: 12 ---- -## oasisctl delete group - -Delete a group the authenticated user has access to - -``` -oasisctl delete group [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete group members](delete-group-members.md) - Delete members from group - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-ipallowlist.md b/site/content/3.13/arangograph/oasisctl/delete/delete-ipallowlist.md deleted file mode 100644 index 1806667457..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete IP Allowlist -menuTitle: Delete IP Allowlist -weight: 14 ---- -## oasisctl delete ipallowlist - -Delete an IP allowlist the authenticated user has access to - -``` -oasisctl delete ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-metrics-token.md b/site/content/3.13/arangograph/oasisctl/delete/delete-metrics-token.md deleted file mode 100644 index c18927e996..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Delete Metrics Token -menuTitle: Delete Metrics Token -weight: 16 ---- -## oasisctl delete metrics token - -Delete a metrics token for a deployment - -``` -oasisctl delete metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete metrics](delete-metrics.md) - Delete metrics resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-metrics.md b/site/content/3.13/arangograph/oasisctl/delete/delete-metrics.md deleted file mode 100644 index 36052afbce..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Metrics -menuTitle: Delete Metrics -weight: 15 ---- -## oasisctl delete metrics - -Delete metrics resources - -``` -oasisctl delete metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete metrics token](delete-metrics-token.md) - Delete a metrics token for a deployment - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-notebook.md b/site/content/3.13/arangograph/oasisctl/delete/delete-notebook.md deleted file mode 100644 index 3992653923..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Delete Notebook -menuTitle: Delete Notebook -weight: 17 ---- -## oasisctl delete notebook - -Delete a notebook - -``` -oasisctl delete notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-organization-invite.md b/site/content/3.13/arangograph/oasisctl/delete/delete-organization-invite.md deleted file mode 100644 index dae7596f39..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Organization Invite -menuTitle: Delete Organization Invite -weight: 19 ---- -## oasisctl delete organization invite - -Delete an organization invite the authenticated user has access to - -``` -oasisctl delete organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-organization-members.md b/site/content/3.13/arangograph/oasisctl/delete/delete-organization-members.md deleted file mode 100644 index c3d4151366..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-organization-members.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Organization Members -menuTitle: Delete Organization Members -weight: 20 ---- -## oasisctl delete organization members - -Delete members from organization - -``` -oasisctl delete organization members [flags] -``` - -## Options -``` - -h, --help help for members - -o, --organization-id string Identifier of the organization - -u, --user-emails strings A comma separated list of user email addresses -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete organization](delete-organization.md) - Delete an organization the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-organization.md b/site/content/3.13/arangograph/oasisctl/delete/delete-organization.md deleted file mode 100644 index 362056323c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-organization.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Delete Organization -menuTitle: Delete Organization -weight: 18 ---- -## oasisctl delete organization - -Delete an organization the authenticated user has access to - -``` -oasisctl delete organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources -* [oasisctl delete organization invite](delete-organization-invite.md) - Delete an organization invite the authenticated user has access to -* [oasisctl delete organization members](delete-organization-members.md) - Delete members from organization - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-project.md b/site/content/3.13/arangograph/oasisctl/delete/delete-project.md deleted file mode 100644 index 9b45160be9..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Project -menuTitle: Delete Project -weight: 21 ---- -## oasisctl delete project - -Delete a project the authenticated user has access to - -``` -oasisctl delete project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/delete/delete-role.md b/site/content/3.13/arangograph/oasisctl/delete/delete-role.md deleted file mode 100644 index c8bcbb67f2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/delete/delete-role.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Delete Role -menuTitle: Delete Role -weight: 22 ---- -## oasisctl delete role - -Delete a role the authenticated user has access to - -``` -oasisctl delete role [flags] -``` - -## Options -``` - -h, --help help for role - -o, --organization-id string Identifier of the organization - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl delete](_index.md) - Delete resources - diff --git a/site/content/3.13/arangograph/oasisctl/disable/_index.md b/site/content/3.13/arangograph/oasisctl/disable/_index.md deleted file mode 100644 index 916ad96f01..0000000000 --- a/site/content/3.13/arangograph/oasisctl/disable/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Disable -menuTitle: Disable -weight: 10 ---- -## oasisctl disable - -Disable some settings related to deployment - -``` -oasisctl disable [flags] -``` - -## Options -``` - -h, --help help for disable -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl disable scheduled-root-password-rotation](disable-scheduled-root-password-rotation.md) - Disable scheduled root password rotation - diff --git a/site/content/3.13/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md b/site/content/3.13/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md deleted file mode 100644 index 52ac637431..0000000000 --- a/site/content/3.13/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Disable Scheduled-Root-Password-Rotation -menuTitle: Disable Scheduled-Root-Password-Rotation -weight: 1 ---- -## oasisctl disable scheduled-root-password-rotation - -Disable scheduled root password rotation - -``` -oasisctl disable scheduled-root-password-rotation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for scheduled-root-password-rotation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl disable](_index.md) - Disable some settings related to deployment - diff --git a/site/content/3.13/arangograph/oasisctl/enable/_index.md b/site/content/3.13/arangograph/oasisctl/enable/_index.md deleted file mode 100644 index 61a3b03d10..0000000000 --- a/site/content/3.13/arangograph/oasisctl/enable/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Enable -menuTitle: Enable -weight: 11 ---- -## oasisctl enable - -Enable some settings related to deployment - -``` -oasisctl enable [flags] -``` - -## Options -``` - -h, --help help for enable -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl enable scheduled-root-password-rotation](enable-scheduled-root-password-rotation.md) - Enable scheduled root password rotation - diff --git a/site/content/3.13/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md b/site/content/3.13/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md deleted file mode 100644 index 8628abc79c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Enable Scheduled-Root-Password-Rotation -menuTitle: Enable Scheduled-Root-Password-Rotation -weight: 1 ---- -## oasisctl enable scheduled-root-password-rotation - -Enable scheduled root password rotation - -``` -oasisctl enable scheduled-root-password-rotation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for scheduled-root-password-rotation - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl enable](_index.md) - Enable some settings related to deployment - diff --git a/site/content/3.13/arangograph/oasisctl/generate-docs.md b/site/content/3.13/arangograph/oasisctl/generate-docs.md deleted file mode 100644 index f1d83f8437..0000000000 --- a/site/content/3.13/arangograph/oasisctl/generate-docs.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Generate Documentation -menuTitle: Generate Documentation -weight: 12 ---- -## oasisctl generate-docs - -Generate output - -``` -oasisctl generate-docs [flags] -``` - -## Options -``` - -h, --help help for generate-docs - -l, --link-file-ext string What file extensions the links should point to - -o, --output-dir string Output directory (default "./docs") - -r, --replace-underscore-with string Replace the underscore in links with the given character -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/get/_index.md b/site/content/3.13/arangograph/oasisctl/get/_index.md deleted file mode 100644 index 20021e7831..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/_index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Oasisctl Get -menuTitle: Get -weight: 13 ---- -## oasisctl get - -Get information - -``` -oasisctl get [flags] -``` - -## Options -``` - -h, --help help for get -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive -* [oasisctl get backup](get-backup.md) - Get a backup -* [oasisctl get cacertificate](get-cacertificate.md) - Get a CA certificate the authenticated user has access to -* [oasisctl get deployment](get-deployment.md) - Get a deployment the authenticated user has access to -* [oasisctl get example](get-example.md) - Get a single example dataset -* [oasisctl get group](get-group.md) - Get a group the authenticated user has access to -* [oasisctl get ipallowlist](get-ipallowlist.md) - Get an IP allowlist the authenticated user has access to -* [oasisctl get metrics](get-metrics.md) - Get metrics information -* [oasisctl get notebook](get-notebook.md) - Get a notebook -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get policy](get-policy.md) - Get a policy the authenticated user has access to -* [oasisctl get private](get-private.md) - Get private information -* [oasisctl get project](get-project.md) - Get a project the authenticated user has access to -* [oasisctl get provider](get-provider.md) - Get a provider the authenticated user has access to -* [oasisctl get region](get-region.md) - Get a region the authenticated user has access to -* [oasisctl get role](get-role.md) - Get a role the authenticated user has access to -* [oasisctl get self](get-self.md) - Get information about the authenticated user -* [oasisctl get server](get-server.md) - Get server information -* [oasisctl get tandc](get-tandc.md) - Get current terms and conditions or get one by ID - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-auditlog-archive.md b/site/content/3.13/arangograph/oasisctl/get/get-auditlog-archive.md deleted file mode 100644 index 546b9a55c4..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-auditlog-archive.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Audit Log Archive -menuTitle: Get Audit Log Archive -weight: 2 ---- -## oasisctl get auditlog archive - -Get auditlog archive - -``` -oasisctl get auditlog archive [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for archive -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-auditlog-events.md b/site/content/3.13/arangograph/oasisctl/get/get-auditlog-events.md deleted file mode 100644 index 44c9088765..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-auditlog-events.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Get Audit Log Events -menuTitle: Get Audit Log Events -weight: 3 ---- -## oasisctl get auditlog events - -Get auditlog events - -``` -oasisctl get auditlog events [flags] -``` - -## Options -``` - --auditlog-archive-id string If set, include only events from this AuditLogArchive - -i, --auditlog-id string Identifier of the auditlog - --excluded-topics strings If non-empty, leave out events with one of these topics. This takes priority over included - --from string Request events created at or after this timestamp - -h, --help help for events - --included-topics strings If non-empty, only request events with one of these topics - --limit int Limit the number of audit log events. Defaults to 0, meaning no limit - --to string Request events created before this timestamp -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get auditlog](get-auditlog.md) - Get auditlog archive - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-auditlog.md b/site/content/3.13/arangograph/oasisctl/get/get-auditlog.md deleted file mode 100644 index 025710b835..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-auditlog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Audit Log -menuTitle: Get Audit Log -weight: 1 ---- -## oasisctl get auditlog - -Get auditlog archive - -``` -oasisctl get auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for auditlog - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get auditlog archive](get-auditlog-archive.md) - Get auditlog archive -* [oasisctl get auditlog events](get-auditlog-events.md) - Get auditlog events - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-backup-policy.md b/site/content/3.13/arangograph/oasisctl/get/get-backup-policy.md deleted file mode 100644 index 916ad22e61..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-backup-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Backup Policy -menuTitle: Get Backup Policy -weight: 5 ---- -## oasisctl get backup policy - -Get an existing backup policy - -``` -oasisctl get backup policy [flags] -``` - -## Options -``` - -h, --help help for policy - -i, --id string Identifier of the backup policy (Id|Name|Url) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get backup](get-backup.md) - Get a backup - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-backup.md b/site/content/3.13/arangograph/oasisctl/get/get-backup.md deleted file mode 100644 index 2792a98b02..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-backup.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Backup -menuTitle: Get Backup -weight: 4 ---- -## oasisctl get backup - -Get a backup - -``` -oasisctl get backup [flags] -``` - -## Options -``` - -h, --help help for backup - -i, --id string Identifier of the backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get backup policy](get-backup-policy.md) - Get an existing backup policy - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-cacertificate.md b/site/content/3.13/arangograph/oasisctl/get/get-cacertificate.md deleted file mode 100644 index 0be6d11e44..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get CA Certificate -menuTitle: Get CA Certificate -weight: 6 ---- -## oasisctl get cacertificate - -Get a CA certificate the authenticated user has access to - -``` -oasisctl get cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-deployment.md b/site/content/3.13/arangograph/oasisctl/get/get-deployment.md deleted file mode 100644 index ab8d86e3d3..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Deployment -menuTitle: Get Deployment -weight: 7 ---- -## oasisctl get deployment - -Get a deployment the authenticated user has access to - -``` -oasisctl get deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --show-root-password show the root password of the database -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-example-installation.md b/site/content/3.13/arangograph/oasisctl/get/get-example-installation.md deleted file mode 100644 index 4190e8e288..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-example-installation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Example Installation -menuTitle: Get Example Installation -weight: 9 ---- -## oasisctl get example installation - -Get a single example dataset installation - -``` -oasisctl get example installation [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installation - --installation-id string The ID of the installation to get. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get example](get-example.md) - Get a single example dataset - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-example.md b/site/content/3.13/arangograph/oasisctl/get/get-example.md deleted file mode 100644 index 1238d443ed..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-example.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Example -menuTitle: Get Example -weight: 8 ---- -## oasisctl get example - -Get a single example dataset - -``` -oasisctl get example [flags] -``` - -## Options -``` - -e, --example-dataset-id string ID of the example dataset - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get example installation](get-example-installation.md) - Get a single example dataset installation - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-group.md b/site/content/3.13/arangograph/oasisctl/get/get-group.md deleted file mode 100644 index 9b8e72e16b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-group.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Group -menuTitle: Get Group -weight: 10 ---- -## oasisctl get group - -Get a group the authenticated user has access to - -``` -oasisctl get group [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-ipallowlist.md b/site/content/3.13/arangograph/oasisctl/get/get-ipallowlist.md deleted file mode 100644 index 379c324604..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get IP Allowlist -menuTitle: Get IP Allowlist -weight: 11 ---- -## oasisctl get ipallowlist - -Get an IP allowlist the authenticated user has access to - -``` -oasisctl get ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-metrics-token.md b/site/content/3.13/arangograph/oasisctl/get/get-metrics-token.md deleted file mode 100644 index 6226b02793..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Metrics Token -menuTitle: Get Metrics Token -weight: 13 ---- -## oasisctl get metrics token - -Get a metrics token - -``` -oasisctl get metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get metrics](get-metrics.md) - Get metrics information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-metrics.md b/site/content/3.13/arangograph/oasisctl/get/get-metrics.md deleted file mode 100644 index f2699417aa..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Metrics -menuTitle: Get Metrics -weight: 12 ---- -## oasisctl get metrics - -Get metrics information - -``` -oasisctl get metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get metrics token](get-metrics-token.md) - Get a metrics token - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-notebook.md b/site/content/3.13/arangograph/oasisctl/get/get-notebook.md deleted file mode 100644 index 8526fb293a..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Notebook -menuTitle: Get Notebook -weight: 14 ---- -## oasisctl get notebook - -Get a notebook - -``` -oasisctl get notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization-authentication-providers.md b/site/content/3.13/arangograph/oasisctl/get/get-organization-authentication-providers.md deleted file mode 100644 index da20b01a1a..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization-authentication-providers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Authentication Providers -menuTitle: Get Organization Authentication Providers -weight: 17 ---- -## oasisctl get organization authentication providers - -Get which authentication providers are allowed for accessing a specific organization - -``` -oasisctl get organization authentication providers [flags] -``` - -## Options -``` - -h, --help help for providers - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization authentication](get-organization-authentication.md) - Get authentication specific information for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization-authentication.md b/site/content/3.13/arangograph/oasisctl/get/get-organization-authentication.md deleted file mode 100644 index cd16e2841b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization-authentication.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Authentication -menuTitle: Get Organization Authentication -weight: 16 ---- -## oasisctl get organization authentication - -Get authentication specific information for an organization - -``` -oasisctl get organization authentication [flags] -``` - -## Options -``` - -h, --help help for authentication -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get organization authentication providers](get-organization-authentication-providers.md) - Get which authentication providers are allowed for accessing a specific organization - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md b/site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md deleted file mode 100644 index 400ad06087..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email Domain Restrictions -menuTitle: Get Organization Email Domain Restrictions -weight: 20 ---- -## oasisctl get organization email domain restrictions - -Get which email domain restrictions are placed on accessing a specific organization - -``` -oasisctl get organization email domain restrictions [flags] -``` - -## Options -``` - -h, --help help for restrictions - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization email domain](get-organization-email-domain.md) - Get email domain specific information for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain.md b/site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain.md deleted file mode 100644 index 305097e72f..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization-email-domain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email Domain -menuTitle: Get Organization Email Domain -weight: 19 ---- -## oasisctl get organization email domain - -Get email domain specific information for an organization - -``` -oasisctl get organization email domain [flags] -``` - -## Options -``` - -h, --help help for domain -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization email](get-organization-email.md) - Get email specific information for an organization -* [oasisctl get organization email domain restrictions](get-organization-email-domain-restrictions.md) - Get which email domain restrictions are placed on accessing a specific organization - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization-email.md b/site/content/3.13/arangograph/oasisctl/get/get-organization-email.md deleted file mode 100644 index 5ca941ffcd..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization-email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Organization Email -menuTitle: Get Organization Email -weight: 18 ---- -## oasisctl get organization email - -Get email specific information for an organization - -``` -oasisctl get organization email [flags] -``` - -## Options -``` - -h, --help help for email -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of -* [oasisctl get organization email domain](get-organization-email-domain.md) - Get email domain specific information for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization-invite.md b/site/content/3.13/arangograph/oasisctl/get/get-organization-invite.md deleted file mode 100644 index 093ed06c05..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Organization Invite -menuTitle: Get Organization Invite -weight: 21 ---- -## oasisctl get organization invite - -Get an organization invite the authenticated user has access to - -``` -oasisctl get organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get organization](get-organization.md) - Get an organization the authenticated user is a member of - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-organization.md b/site/content/3.13/arangograph/oasisctl/get/get-organization.md deleted file mode 100644 index b05c6201ab..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-organization.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Get Organization -menuTitle: Get Organization -weight: 15 ---- -## oasisctl get organization - -Get an organization the authenticated user is a member of - -``` -oasisctl get organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get organization authentication](get-organization-authentication.md) - Get authentication specific information for an organization -* [oasisctl get organization email](get-organization-email.md) - Get email specific information for an organization -* [oasisctl get organization invite](get-organization-invite.md) - Get an organization invite the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-policy.md b/site/content/3.13/arangograph/oasisctl/get/get-policy.md deleted file mode 100644 index 599e5601cb..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Policy -menuTitle: Get Policy -weight: 22 ---- -## oasisctl get policy - -Get a policy the authenticated user has access to - -``` -oasisctl get policy [flags] -``` - -## Options -``` - -h, --help help for policy - -u, --url string URL of the resource to inspect the policy for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-private-endpoint-service.md b/site/content/3.13/arangograph/oasisctl/get/get-private-endpoint-service.md deleted file mode 100644 index a9c56b8b0f..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-private-endpoint-service.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Private Endpoint Service -menuTitle: Get Private Endpoint Service -weight: 25 ---- -## oasisctl get private endpoint service - -Get a Private Endpoint Service the authenticated user has access to - -``` -oasisctl get private endpoint service [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - -h, --help help for service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get private endpoint](get-private-endpoint.md) - - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-private-endpoint.md b/site/content/3.13/arangograph/oasisctl/get/get-private-endpoint.md deleted file mode 100644 index 38afeb2dd8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Private Endpoint -menuTitle: Get Private Endpoint -weight: 24 ---- -## oasisctl get private endpoint - - - -``` -oasisctl get private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get private](get-private.md) - Get private information -* [oasisctl get private endpoint service](get-private-endpoint-service.md) - Get a Private Endpoint Service the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-private.md b/site/content/3.13/arangograph/oasisctl/get/get-private.md deleted file mode 100644 index e84921fd32..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Private -menuTitle: Get Private -weight: 23 ---- -## oasisctl get private - -Get private information - -``` -oasisctl get private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get private endpoint](get-private-endpoint.md) - - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-project.md b/site/content/3.13/arangograph/oasisctl/get/get-project.md deleted file mode 100644 index 5bfb087e53..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Project -menuTitle: Get Project -weight: 26 ---- -## oasisctl get project - -Get a project the authenticated user has access to - -``` -oasisctl get project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-provider.md b/site/content/3.13/arangograph/oasisctl/get/get-provider.md deleted file mode 100644 index da7d632e1b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-provider.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Provider -menuTitle: Get Provider -weight: 27 ---- -## oasisctl get provider - -Get a provider the authenticated user has access to - -``` -oasisctl get provider [flags] -``` - -## Options -``` - -h, --help help for provider - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-region.md b/site/content/3.13/arangograph/oasisctl/get/get-region.md deleted file mode 100644 index 25ca81e867..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-region.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Region -menuTitle: Get Region -weight: 28 ---- -## oasisctl get region - -Get a region the authenticated user has access to - -``` -oasisctl get region [flags] -``` - -## Options -``` - -h, --help help for region - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-role.md b/site/content/3.13/arangograph/oasisctl/get/get-role.md deleted file mode 100644 index 898605e245..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-role.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Role -menuTitle: Get Role -weight: 29 ---- -## oasisctl get role - -Get a role the authenticated user has access to - -``` -oasisctl get role [flags] -``` - -## Options -``` - -h, --help help for role - -o, --organization-id string Identifier of the organization - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-self.md b/site/content/3.13/arangograph/oasisctl/get/get-self.md deleted file mode 100644 index 26d48ad423..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-self.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl Get Self -menuTitle: Get Self -weight: 30 ---- -## oasisctl get self - -Get information about the authenticated user - -``` -oasisctl get self [flags] -``` - -## Options -``` - -h, --help help for self -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-server-status.md b/site/content/3.13/arangograph/oasisctl/get/get-server-status.md deleted file mode 100644 index 302fb17a1d..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-server-status.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Get Server Status -menuTitle: Get Server Status -weight: 32 ---- -## oasisctl get server status - -Get the status of servers for a deployment - -``` -oasisctl get server status [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for status - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get server](get-server.md) - Get server information - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-server.md b/site/content/3.13/arangograph/oasisctl/get/get-server.md deleted file mode 100644 index ad54b9dfd2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-server.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Get Server -menuTitle: Get Server -weight: 31 ---- -## oasisctl get server - -Get server information - -``` -oasisctl get server [flags] -``` - -## Options -``` - -h, --help help for server -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information -* [oasisctl get server status](get-server-status.md) - Get the status of servers for a deployment - diff --git a/site/content/3.13/arangograph/oasisctl/get/get-tandc.md b/site/content/3.13/arangograph/oasisctl/get/get-tandc.md deleted file mode 100644 index c33b546252..0000000000 --- a/site/content/3.13/arangograph/oasisctl/get/get-tandc.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Get Terms & Conditions -menuTitle: Get Terms & Conditions -weight: 33 ---- -## oasisctl get tandc - -Get current terms and conditions or get one by ID - -``` -oasisctl get tandc [flags] -``` - -## Options -``` - -h, --help help for tandc - -o, --organization-id string Identifier of the organization - -t, --terms-and-conditions-id string Identifier of the terms and conditions to accept. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl get](_index.md) - Get information - diff --git a/site/content/3.13/arangograph/oasisctl/import.md b/site/content/3.13/arangograph/oasisctl/import.md deleted file mode 100644 index 385375d640..0000000000 --- a/site/content/3.13/arangograph/oasisctl/import.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Oasisctl Import -menuTitle: Import -weight: 14 ---- -## oasisctl import - -Import data from a local database or from another remote database into an Oasis deployment. - -``` -oasisctl import [flags] -``` - -## Options -``` - -b, --batch-size int The number of documents to write at once. (default 4096) - -d, --destination-deployment-id string Destination deployment id to import data into. It can be provided instead of address, username and password. - --excluded-collection strings A list of collections names which should be excluded. Exclusion takes priority over inclusion. - --excluded-database strings A list of database names which should be excluded. Exclusion takes priority over inclusion. - --excluded-graph strings A list of graph names which should be excluded. Exclusion takes priority over inclusion. - --excluded-view strings A list of view names which should be excluded. Exclusion takes priority over inclusion. - -f, --force Force the copy automatically overwriting everything at destination. - -h, --help help for import - --included-collection strings A list of collection names which should be included. If provided, only these collections will be copied. - --included-database strings A list of database names which should be included. If provided, only these databases will be copied. - --included-graph strings A list of graph names which should be included. If provided, only these graphs will be copied. - --included-view strings A list of view names which should be included. If provided, only these views will be copied. - -r, --max-retries int The number of maximum retries attempts. Increasing this number will also increase the exponential fallback timer. (default 9) - -m, --maximum-parallel-collections int Maximum number of collections being copied in parallel. (default 10) - --no-progress-bar Disable the progress bar but still have partial progress output. - --query-ttl duration Cursor TTL defined as a duration. (default 2h0m0s) - --source-address string Source database address to copy data from. - --source-password string Source database password if required. - --source-username string Source database username if required. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/list/_index.md b/site/content/3.13/arangograph/oasisctl/list/_index.md deleted file mode 100644 index b8a7496441..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/_index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Oasisctl List -menuTitle: List -weight: 15 ---- -## oasisctl list - -List resources - -``` -oasisctl list [flags] -``` - -## Options -``` - -h, --help help for list -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl list apikeys](list-apikeys.md) - List all API keys created for the current user -* [oasisctl list arangodb](list-arangodb.md) - List ArangoDB information -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs -* [oasisctl list auditlogs](list-auditlogs.md) - List auditlogs -* [oasisctl list backup](list-backup.md) - A list command for various backup resources -* [oasisctl list backups](list-backups.md) - List backups -* [oasisctl list cacertificates](list-cacertificates.md) - List all CA certificates of the given project -* [oasisctl list cpusizes](list-cpusizes.md) - List CPU sizes -* [oasisctl list deployments](list-deployments.md) - List all deployments of the given project -* [oasisctl list diskperformances](list-diskperformances.md) - List disk performances -* [oasisctl list effective](list-effective.md) - List effective information -* [oasisctl list example](list-example.md) - List example ... -* [oasisctl list examples](list-examples.md) - List all example datasets -* [oasisctl list group](list-group.md) - List group resources -* [oasisctl list groups](list-groups.md) - List all groups of the given organization -* [oasisctl list ipallowlists](list-ipallowlists.md) - List all IP allowlists of the given project -* [oasisctl list metrics](list-metrics.md) - List metrics resources -* [oasisctl list nodesizes](list-nodesizes.md) - List node sizes -* [oasisctl list notebookmodels](list-notebookmodels.md) - List notebook models -* [oasisctl list notebooks](list-notebooks.md) - List notebooks -* [oasisctl list organization](list-organization.md) - List organization resources -* [oasisctl list organizations](list-organizations.md) - List all organizations the authenticated user is a member of -* [oasisctl list permissions](list-permissions.md) - List the known permissions -* [oasisctl list projects](list-projects.md) - List all projects of the given organization -* [oasisctl list providers](list-providers.md) - List all providers the authenticated user has access to -* [oasisctl list regions](list-regions.md) - List all regions of the given provider -* [oasisctl list roles](list-roles.md) - List all roles of the given organization -* [oasisctl list servers](list-servers.md) - List servers information - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-apikeys.md b/site/content/3.13/arangograph/oasisctl/list/list-apikeys.md deleted file mode 100644 index 44984cb38b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-apikeys.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List API Keys -menuTitle: List API Keys -weight: 1 ---- -## oasisctl list apikeys - -List all API keys created for the current user - -``` -oasisctl list apikeys [flags] -``` - -## Options -``` - -h, --help help for apikeys -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-arangodb-versions.md b/site/content/3.13/arangograph/oasisctl/list/list-arangodb-versions.md deleted file mode 100644 index 22411cf8a8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-arangodb-versions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List ArangoDB Versions -menuTitle: List ArangoDB Versions -weight: 3 ---- -## oasisctl list arangodb versions - -List all supported ArangoDB versions - -``` -oasisctl list arangodb versions [flags] -``` - -## Options -``` - -h, --help help for versions - -o, --organization-id string Optional Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list arangodb](list-arangodb.md) - List ArangoDB information - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-arangodb.md b/site/content/3.13/arangograph/oasisctl/list/list-arangodb.md deleted file mode 100644 index 04445b917d..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-arangodb.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List ArangoDB -menuTitle: List ArangoDB -weight: 2 ---- -## oasisctl list arangodb - -List ArangoDB information - -``` -oasisctl list arangodb [flags] -``` - -## Options -``` - -h, --help help for arangodb -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list arangodb versions](list-arangodb-versions.md) - List all supported ArangoDB versions - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-auditlog-archives.md b/site/content/3.13/arangograph/oasisctl/list/list-auditlog-archives.md deleted file mode 100644 index efe237a2b6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-auditlog-archives.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log Archives -menuTitle: List Audit Log Archives -weight: 5 ---- -## oasisctl list auditlog archives - -List auditlog archives - -``` -oasisctl list auditlog archives [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog - -h, --help help for archives - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-auditlog-destinations.md b/site/content/3.13/arangograph/oasisctl/list/list-auditlog-destinations.md deleted file mode 100644 index f6fc395ce0..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-auditlog-destinations.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log Destinations -menuTitle: List Audit Log Destinations -weight: 6 ---- -## oasisctl list auditlog destinations - -List auditlog destinations - -``` -oasisctl list auditlog destinations [flags] -``` - -## Options -``` - --auditlog-id string Identifier of the auditlog to list the destinations for - -h, --help help for destinations - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list auditlog](list-auditlog.md) - List resources for auditlogs - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-auditlog.md b/site/content/3.13/arangograph/oasisctl/list/list-auditlog.md deleted file mode 100644 index 4a86f9969e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-auditlog.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Audit Log -menuTitle: List Audit Log -weight: 4 ---- -## oasisctl list auditlog - -List resources for auditlogs - -``` -oasisctl list auditlog [flags] -``` - -## Options -``` - -h, --help help for auditlog -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list auditlog archives](list-auditlog-archives.md) - List auditlog archives -* [oasisctl list auditlog destinations](list-auditlog-destinations.md) - List auditlog destinations - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-auditlogs.md b/site/content/3.13/arangograph/oasisctl/list/list-auditlogs.md deleted file mode 100644 index 83e17ba2e2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-auditlogs.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Audit Logs -menuTitle: List Audit Logs -weight: 7 ---- -## oasisctl list auditlogs - -List auditlogs - -``` -oasisctl list auditlogs [flags] -``` - -## Options -``` - -h, --help help for auditlogs - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-backup-policies.md b/site/content/3.13/arangograph/oasisctl/list/list-backup-policies.md deleted file mode 100644 index ec1b895990..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-backup-policies.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Backup Policies -menuTitle: List Backup Policies -weight: 9 ---- -## oasisctl list backup policies - -List backup policies - -``` -oasisctl list backup policies [flags] -``` - -## Options -``` - --deployment-id string The ID of the deployment to list backup policies for - -h, --help help for policies - --include-deleted If set, the result includes all backup policies, including those who set to deleted, however are not removed from the system currently -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list backup](list-backup.md) - A list command for various backup resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-backup.md b/site/content/3.13/arangograph/oasisctl/list/list-backup.md deleted file mode 100644 index 3c0b2d78a8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-backup.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Backup -menuTitle: List Backup -weight: 8 ---- -## oasisctl list backup - -A list command for various backup resources - -``` -oasisctl list backup [flags] -``` - -## Options -``` - -h, --help help for backup -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list backup policies](list-backup-policies.md) - List backup policies - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-backups.md b/site/content/3.13/arangograph/oasisctl/list/list-backups.md deleted file mode 100644 index ace03c781e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-backups.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Backups -menuTitle: List Backups -weight: 10 ---- -## oasisctl list backups - -List backups - -``` -oasisctl list backups [flags] -``` - -## Options -``` - --deployment-id string The ID of the deployment to list backups for - --from string Request backups that are created at or after this timestamp - -h, --help help for backups - --to string Request backups that are created before this timestamp -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-cacertificates.md b/site/content/3.13/arangograph/oasisctl/list/list-cacertificates.md deleted file mode 100644 index 903063bb34..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-cacertificates.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List CA Certificates -menuTitle: List CA Certificates -weight: 11 ---- -## oasisctl list cacertificates - -List all CA certificates of the given project - -``` -oasisctl list cacertificates [flags] -``` - -## Options -``` - -h, --help help for cacertificates - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-cpusizes.md b/site/content/3.13/arangograph/oasisctl/list/list-cpusizes.md deleted file mode 100644 index 85188eac3b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-cpusizes.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List CPU Sizes -menuTitle: List CPU Sizes -weight: 12 ---- -## oasisctl list cpusizes - -List CPU sizes - -``` -oasisctl list cpusizes [flags] -``` - -## Options -``` - -h, --help help for cpusizes - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-deployments.md b/site/content/3.13/arangograph/oasisctl/list/list-deployments.md deleted file mode 100644 index 66b3d739d2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-deployments.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Deployments -menuTitle: List Deployments -weight: 13 ---- -## oasisctl list deployments - -List all deployments of the given project - -``` -oasisctl list deployments [flags] -``` - -## Options -``` - -h, --help help for deployments - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-diskperformances.md b/site/content/3.13/arangograph/oasisctl/list/list-diskperformances.md deleted file mode 100644 index ddbd5714c0..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-diskperformances.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl List Disk Performances -menuTitle: List Disk Performances -weight: 14 ---- -## oasisctl list diskperformances - -List disk performances - -``` -oasisctl list diskperformances [flags] -``` - -## Options -``` - --dbserver-disk-size int32 The disk size of DB-Servers (GiB) (default 32) - -h, --help help for diskperformances - --node-size-id string Identifier of the node size - -o, --organization-id string Identifier of the organization - --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-effective-permissions.md b/site/content/3.13/arangograph/oasisctl/list/list-effective-permissions.md deleted file mode 100644 index 394cc1006e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-effective-permissions.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Effective Permissions -menuTitle: List Effective Permissions -weight: 16 ---- -## oasisctl list effective permissions - -List the effective permissions, the authenticated user has for a given URL - -``` -oasisctl list effective permissions [flags] -``` - -## Options -``` - -h, --help help for permissions - -u, --url string URL of resource to get effective permissions for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list effective](list-effective.md) - List effective information - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-effective.md b/site/content/3.13/arangograph/oasisctl/list/list-effective.md deleted file mode 100644 index 431f601dc1..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-effective.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Effective -menuTitle: List Effective -weight: 15 ---- -## oasisctl list effective - -List effective information - -``` -oasisctl list effective [flags] -``` - -## Options -``` - -h, --help help for effective -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list effective permissions](list-effective-permissions.md) - List the effective permissions, the authenticated user has for a given URL - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-example-installations.md b/site/content/3.13/arangograph/oasisctl/list/list-example-installations.md deleted file mode 100644 index 5a9167f5b9..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-example-installations.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Example Installations -menuTitle: List Example Installations -weight: 18 ---- -## oasisctl list example installations - -List all example dataset installations for a deployment - -``` -oasisctl list example installations [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment to list installations for - -h, --help help for installations - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list example](list-example.md) - List example ... - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-example.md b/site/content/3.13/arangograph/oasisctl/list/list-example.md deleted file mode 100644 index e389b299c2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-example.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Example -menuTitle: List Example -weight: 17 ---- -## oasisctl list example - -List example ... - -``` -oasisctl list example [flags] -``` - -## Options -``` - -h, --help help for example -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list example installations](list-example-installations.md) - List all example dataset installations for a deployment - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-examples.md b/site/content/3.13/arangograph/oasisctl/list/list-examples.md deleted file mode 100644 index 1cc1d11b86..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-examples.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Examples -menuTitle: List Examples -weight: 19 ---- -## oasisctl list examples - -List all example datasets - -``` -oasisctl list examples [flags] -``` - -## Options -``` - -h, --help help for examples - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-group-members.md b/site/content/3.13/arangograph/oasisctl/list/list-group-members.md deleted file mode 100644 index 6bc87e0b73..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-group-members.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Group Members -menuTitle: List Group Members -weight: 21 ---- -## oasisctl list group members - -List members of a group the authenticated user is a member of - -``` -oasisctl list group members [flags] -``` - -## Options -``` - -g, --group-id string Identifier of the group - -h, --help help for members - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list group](list-group.md) - List group resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-group.md b/site/content/3.13/arangograph/oasisctl/list/list-group.md deleted file mode 100644 index 28f5caa79d..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-group.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Group -menuTitle: List Group -weight: 20 ---- -## oasisctl list group - -List group resources - -``` -oasisctl list group [flags] -``` - -## Options -``` - -h, --help help for group -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list group members](list-group-members.md) - List members of a group the authenticated user is a member of - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-groups.md b/site/content/3.13/arangograph/oasisctl/list/list-groups.md deleted file mode 100644 index 8908ae0fb3..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-groups.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Groups -menuTitle: List Groups -weight: 22 ---- -## oasisctl list groups - -List all groups of the given organization - -``` -oasisctl list groups [flags] -``` - -## Options -``` - -h, --help help for groups - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-ipallowlists.md b/site/content/3.13/arangograph/oasisctl/list/list-ipallowlists.md deleted file mode 100644 index 33ef91495d..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-ipallowlists.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List IP Allowlists -menuTitle: List IP Allowlists -weight: 23 ---- -## oasisctl list ipallowlists - -List all IP allowlists of the given project - -``` -oasisctl list ipallowlists [flags] -``` - -## Options -``` - -h, --help help for ipallowlists - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-metrics-tokens.md b/site/content/3.13/arangograph/oasisctl/list/list-metrics-tokens.md deleted file mode 100644 index ce1713add8..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-metrics-tokens.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Metrics Tokens -menuTitle: List Metrics Tokens -weight: 25 ---- -## oasisctl list metrics tokens - -List all metrics tokens of the given deployment - -``` -oasisctl list metrics tokens [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for tokens - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list metrics](list-metrics.md) - List metrics resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-metrics.md b/site/content/3.13/arangograph/oasisctl/list/list-metrics.md deleted file mode 100644 index fe3a321be3..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Metrics -menuTitle: List Metrics -weight: 24 ---- -## oasisctl list metrics - -List metrics resources - -``` -oasisctl list metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list metrics tokens](list-metrics-tokens.md) - List all metrics tokens of the given deployment - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-nodesizes.md b/site/content/3.13/arangograph/oasisctl/list/list-nodesizes.md deleted file mode 100644 index 60c0bc9d56..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-nodesizes.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl List Node Sizes -menuTitle: List Node Sizes -weight: 26 ---- -## oasisctl list nodesizes - -List node sizes - -``` -oasisctl list nodesizes [flags] -``` - -## Options -``` - -h, --help help for nodesizes - --model string Identifier of the model (default "oneshard") - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --provider-id string Identifier of the provider - -r, --region-id string Identifier of the region -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-notebookmodels.md b/site/content/3.13/arangograph/oasisctl/list/list-notebookmodels.md deleted file mode 100644 index cdca9cb6a5..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-notebookmodels.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Notebook Models -menuTitle: List Notebook Models -weight: 27 ---- -## oasisctl list notebookmodels - -List notebook models - -``` -oasisctl list notebookmodels [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebook has to run next to - -h, --help help for notebookmodels - -o, --organization-id string Identifier of the organization that deployment is in - -p, --project-id string Identifier of the project that deployment is in -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-notebooks.md b/site/content/3.13/arangograph/oasisctl/list/list-notebooks.md deleted file mode 100644 index 29aa77467f..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-notebooks.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl List Notebooks -menuTitle: List Notebooks -weight: 28 ---- -## oasisctl list notebooks - -List notebooks - -``` -oasisctl list notebooks [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment that the notebooks run next to - -h, --help help for notebooks - -o, --organization-id string Identifier of the organization that has notebooks - -p, --project-id string Identifier of the project that has notebooks -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-organization-invites.md b/site/content/3.13/arangograph/oasisctl/list/list-organization-invites.md deleted file mode 100644 index d3fbe58668..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-organization-invites.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Organization Invites -menuTitle: List Organization Invites -weight: 30 ---- -## oasisctl list organization invites - -List invites of an organization the authenticated user is a member of - -``` -oasisctl list organization invites [flags] -``` - -## Options -``` - -h, --help help for invites - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list organization](list-organization.md) - List organization resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-organization-members.md b/site/content/3.13/arangograph/oasisctl/list/list-organization-members.md deleted file mode 100644 index f143d66886..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-organization-members.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Organization Members -menuTitle: List Organization Members -weight: 31 ---- -## oasisctl list organization members - -List members of an organization the authenticated user is a member of - -``` -oasisctl list organization members [flags] -``` - -## Options -``` - -h, --help help for members - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list organization](list-organization.md) - List organization resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-organization.md b/site/content/3.13/arangograph/oasisctl/list/list-organization.md deleted file mode 100644 index c41e4a9750..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-organization.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Organization -menuTitle: List Organization -weight: 29 ---- -## oasisctl list organization - -List organization resources - -``` -oasisctl list organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources -* [oasisctl list organization invites](list-organization-invites.md) - List invites of an organization the authenticated user is a member of -* [oasisctl list organization members](list-organization-members.md) - List members of an organization the authenticated user is a member of - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-organizations.md b/site/content/3.13/arangograph/oasisctl/list/list-organizations.md deleted file mode 100644 index 7cde4a6da1..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-organizations.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Organizations -menuTitle: List Organizations -weight: 32 ---- -## oasisctl list organizations - -List all organizations the authenticated user is a member of - -``` -oasisctl list organizations [flags] -``` - -## Options -``` - -h, --help help for organizations -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-permissions.md b/site/content/3.13/arangograph/oasisctl/list/list-permissions.md deleted file mode 100644 index db4c2bd43c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-permissions.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Permissions -menuTitle: List Permissions -weight: 33 ---- -## oasisctl list permissions - -List the known permissions - -``` -oasisctl list permissions [flags] -``` - -## Options -``` - -h, --help help for permissions -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-projects.md b/site/content/3.13/arangograph/oasisctl/list/list-projects.md deleted file mode 100644 index 959e80a2fa..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-projects.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Projects -menuTitle: List Projects -weight: 34 ---- -## oasisctl list projects - -List all projects of the given organization - -``` -oasisctl list projects [flags] -``` - -## Options -``` - -h, --help help for projects - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-providers.md b/site/content/3.13/arangograph/oasisctl/list/list-providers.md deleted file mode 100644 index 1b9c90f744..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-providers.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Providers -menuTitle: List Providers -weight: 35 ---- -## oasisctl list providers - -List all providers the authenticated user has access to - -``` -oasisctl list providers [flags] -``` - -## Options -``` - -h, --help help for providers - -o, --organization-id string Optional Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-regions.md b/site/content/3.13/arangograph/oasisctl/list/list-regions.md deleted file mode 100644 index 083b85a4a5..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-regions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl List Regions -menuTitle: List Regions -weight: 36 ---- -## oasisctl list regions - -List all regions of the given provider - -``` -oasisctl list regions [flags] -``` - -## Options -``` - -h, --help help for regions - -o, --organization-id string Optional Identifier of the organization - -p, --provider-id string Identifier of the provider -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-roles.md b/site/content/3.13/arangograph/oasisctl/list/list-roles.md deleted file mode 100644 index ffa2a3ee89..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-roles.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl List Roles -menuTitle: List Roles -weight: 37 ---- -## oasisctl list roles - -List all roles of the given organization - -``` -oasisctl list roles [flags] -``` - -## Options -``` - -h, --help help for roles - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/list/list-servers.md b/site/content/3.13/arangograph/oasisctl/list/list-servers.md deleted file mode 100644 index f1e3a5f636..0000000000 --- a/site/content/3.13/arangograph/oasisctl/list/list-servers.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl List Servers -menuTitle: List Servers -weight: 38 ---- -## oasisctl list servers - -List servers information - -``` -oasisctl list servers [flags] -``` - -## Options -``` - -h, --help help for servers -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl list](_index.md) - List resources - diff --git a/site/content/3.13/arangograph/oasisctl/lock/_index.md b/site/content/3.13/arangograph/oasisctl/lock/_index.md deleted file mode 100644 index 1b432aa982..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/_index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Lock -menuTitle: Lock -weight: 16 ---- -## oasisctl lock - -Lock resources - -``` -oasisctl lock [flags] -``` - -## Options -``` - -h, --help help for lock -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl lock cacertificate](lock-cacertificate.md) - Lock a CA certificate, so it cannot be deleted -* [oasisctl lock deployment](lock-deployment.md) - Lock a deployment, so it cannot be deleted -* [oasisctl lock ipallowlist](lock-ipallowlist.md) - Lock an IP allowlist, so it cannot be deleted -* [oasisctl lock organization](lock-organization.md) - Lock an organization, so it cannot be deleted -* [oasisctl lock policy](lock-policy.md) - Lock a backup policy -* [oasisctl lock project](lock-project.md) - Lock a project, so it cannot be deleted - diff --git a/site/content/3.13/arangograph/oasisctl/lock/lock-cacertificate.md b/site/content/3.13/arangograph/oasisctl/lock/lock-cacertificate.md deleted file mode 100644 index 274471190b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/lock-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock CA Certificate -menuTitle: Lock CA Certificate -weight: 1 ---- -## oasisctl lock cacertificate - -Lock a CA certificate, so it cannot be deleted - -``` -oasisctl lock cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.13/arangograph/oasisctl/lock/lock-deployment.md b/site/content/3.13/arangograph/oasisctl/lock/lock-deployment.md deleted file mode 100644 index 3a64c29d17..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/lock-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock Deployment -menuTitle: Lock Deployment -weight: 2 ---- -## oasisctl lock deployment - -Lock a deployment, so it cannot be deleted - -``` -oasisctl lock deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.13/arangograph/oasisctl/lock/lock-ipallowlist.md b/site/content/3.13/arangograph/oasisctl/lock/lock-ipallowlist.md deleted file mode 100644 index 9f4460b2e2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/lock-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Lock IP Allowlist -menuTitle: Lock IP Allowlist -weight: 3 ---- -## oasisctl lock ipallowlist - -Lock an IP allowlist, so it cannot be deleted - -``` -oasisctl lock ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.13/arangograph/oasisctl/lock/lock-organization.md b/site/content/3.13/arangograph/oasisctl/lock/lock-organization.md deleted file mode 100644 index e65abeea81..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/lock-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Lock Organization -menuTitle: Lock Organization -weight: 4 ---- -## oasisctl lock organization - -Lock an organization, so it cannot be deleted - -``` -oasisctl lock organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.13/arangograph/oasisctl/lock/lock-policy.md b/site/content/3.13/arangograph/oasisctl/lock/lock-policy.md deleted file mode 100644 index 8b70ed3617..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/lock-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Lock Policy -menuTitle: Lock Policy -weight: 5 ---- -## oasisctl lock policy - -Lock a backup policy - -``` -oasisctl lock policy [flags] -``` - -## Options -``` - -d, --backup-policy-id string Identifier of the backup policy - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.13/arangograph/oasisctl/lock/lock-project.md b/site/content/3.13/arangograph/oasisctl/lock/lock-project.md deleted file mode 100644 index f71ac58f82..0000000000 --- a/site/content/3.13/arangograph/oasisctl/lock/lock-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Lock Project -menuTitle: Lock Project -weight: 6 ---- -## oasisctl lock project - -Lock a project, so it cannot be deleted - -``` -oasisctl lock project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl lock](_index.md) - Lock resources - diff --git a/site/content/3.13/arangograph/oasisctl/login.md b/site/content/3.13/arangograph/oasisctl/login.md deleted file mode 100644 index a507d3e942..0000000000 --- a/site/content/3.13/arangograph/oasisctl/login.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Oasisctl Login -menuTitle: Login -weight: 17 ---- -## oasisctl login - -Login to ArangoDB Oasis using an API key - -## Synopsis -To authenticate in a script environment, run: - - export OASIS_TOKEN=$(oasisctl login --key-id=<your-key-id> --key-secret=<your-key-secret>) - - -``` -oasisctl login [flags] -``` - -## Options -``` - -h, --help help for login - -i, --key-id string API key identifier - -s, --key-secret string API key secret -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/logs.md b/site/content/3.13/arangograph/oasisctl/logs.md deleted file mode 100644 index 71f2555f94..0000000000 --- a/site/content/3.13/arangograph/oasisctl/logs.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Oasisctl Logs -menuTitle: Logs -weight: 18 ---- -## oasisctl logs - -Get logs of the servers of a deployment the authenticated user has access to - -``` -oasisctl logs [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - --end string End fetching logs at this timestamp (pass timestamp or duration before now) - --format string Formatting of the log output. It can be one of two: text, json. Text is the default value. (default "text") - -h, --help help for logs - -l, --limit int Limit the number of log lines - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -r, --role string Limit logs to servers with given role only (agents|coordinators|dbservers) - --start string Start fetching logs from this timestamp (pass timestamp or duration before now) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/options.md b/site/content/3.13/arangograph/oasisctl/options.md deleted file mode 100644 index 75823ecb85..0000000000 --- a/site/content/3.13/arangograph/oasisctl/options.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: Command-line client tool for managing ArangoGraph -title: ArangoGraph Shell oasisctl -menuTitle: Options -weight: 1 ---- -## oasisctl - -ArangoGraph Insights Platform - -## Synopsis -ArangoGraph Insights Platform (formerly called Oasis): The Managed Cloud for ArangoDB - -``` -oasisctl [flags] -``` - -## Options -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - -h, --help help for oasisctl - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl accept](accept/_index.md) - Accept invites -* [oasisctl add](add/_index.md) - Add resources -* [oasisctl auditlog](auditlog/_index.md) - AuditLog resources -* [oasisctl backup](backup/_index.md) - Backup commands -* [oasisctl clone](clone/_index.md) - Clone resources -* [oasisctl completion](completion.md) - Generates bash completion scripts -* [oasisctl create](create/_index.md) - Create resources -* [oasisctl delete](delete/_index.md) - Delete resources -* [oasisctl disable](disable/_index.md) - Disable some settings related to deployment -* [oasisctl enable](enable/_index.md) - Enable some settings related to deployment -* [oasisctl generate-docs](generate-docs.md) - Generate output -* [oasisctl get](get/_index.md) - Get information -* [oasisctl import](import.md) - Import data from a local database or from another remote database into an Oasis deployment. -* [oasisctl list](list/_index.md) - List resources -* [oasisctl lock](lock/_index.md) - Lock resources -* [oasisctl login](login.md) - Login to ArangoDB Oasis using an API key -* [oasisctl logs](logs.md) - Get logs of the servers of a deployment the authenticated user has access to -* [oasisctl pause](pause/_index.md) - Pause resources -* [oasisctl rebalance](rebalance/_index.md) - Rebalance resources -* [oasisctl reject](reject/_index.md) - Reject invites -* [oasisctl renew](renew/_index.md) - Renew keys & tokens -* [oasisctl resume](resume/_index.md) - Resume resources -* [oasisctl revoke](revoke/_index.md) - Revoke keys & tokens -* [oasisctl rotate](rotate/_index.md) - Rotate resources -* [oasisctl top](top.md) - Show the most important server metrics -* [oasisctl unlock](unlock/_index.md) - Unlock resources -* [oasisctl update](update/_index.md) - Update resources -* [oasisctl upgrade](upgrade.md) - Upgrade Oasisctl tool -* [oasisctl version](version.md) - Show the current version of this tool -* [oasisctl wait](wait/_index.md) - Wait for a status change - diff --git a/site/content/3.13/arangograph/oasisctl/pause/_index.md b/site/content/3.13/arangograph/oasisctl/pause/_index.md deleted file mode 100644 index ce02e840c5..0000000000 --- a/site/content/3.13/arangograph/oasisctl/pause/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Pause -menuTitle: Pause -weight: 19 ---- -## oasisctl pause - -Pause resources - -``` -oasisctl pause [flags] -``` - -## Options -``` - -h, --help help for pause -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl pause notebook](pause-notebook.md) - Pause a notebook - diff --git a/site/content/3.13/arangograph/oasisctl/pause/pause-notebook.md b/site/content/3.13/arangograph/oasisctl/pause/pause-notebook.md deleted file mode 100644 index 0db646d81b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/pause/pause-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Pause Notebook -menuTitle: Pause Notebook -weight: 1 ---- -## oasisctl pause notebook - -Pause a notebook - -``` -oasisctl pause notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl pause](_index.md) - Pause resources - diff --git a/site/content/3.13/arangograph/oasisctl/rebalance/_index.md b/site/content/3.13/arangograph/oasisctl/rebalance/_index.md deleted file mode 100644 index c1532b7f91..0000000000 --- a/site/content/3.13/arangograph/oasisctl/rebalance/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance -menuTitle: Rebalance -weight: 20 ---- -## oasisctl rebalance - -Rebalance resources - -``` -oasisctl rebalance [flags] -``` - -## Options -``` - -h, --help help for rebalance -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl rebalance deployment](rebalance-deployment.md) - Rebalance deployment resources - diff --git a/site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md b/site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md deleted file mode 100644 index 706b6339e9..0000000000 --- a/site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance Deployment Shards -menuTitle: Rebalance Deployment Shards -weight: 2 ---- -## oasisctl rebalance deployment shards - -Rebalance shards of a deployment - -``` -oasisctl rebalance deployment shards [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for shards -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rebalance deployment](rebalance-deployment.md) - Rebalance deployment resources - diff --git a/site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment.md b/site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment.md deleted file mode 100644 index 7759314ec5..0000000000 --- a/site/content/3.13/arangograph/oasisctl/rebalance/rebalance-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rebalance Deployment -menuTitle: Rebalance Deployment -weight: 1 ---- -## oasisctl rebalance deployment - -Rebalance deployment resources - -``` -oasisctl rebalance deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rebalance](_index.md) - Rebalance resources -* [oasisctl rebalance deployment shards](rebalance-deployment-shards.md) - Rebalance shards of a deployment - diff --git a/site/content/3.13/arangograph/oasisctl/reject/_index.md b/site/content/3.13/arangograph/oasisctl/reject/_index.md deleted file mode 100644 index 69cff60ece..0000000000 --- a/site/content/3.13/arangograph/oasisctl/reject/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Reject -menuTitle: Reject -weight: 21 ---- -## oasisctl reject - -Reject invites - -``` -oasisctl reject [flags] -``` - -## Options -``` - -h, --help help for reject -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl reject organization](reject-organization.md) - Reject organization related invites - diff --git a/site/content/3.13/arangograph/oasisctl/reject/reject-organization-invite.md b/site/content/3.13/arangograph/oasisctl/reject/reject-organization-invite.md deleted file mode 100644 index d43ecfca52..0000000000 --- a/site/content/3.13/arangograph/oasisctl/reject/reject-organization-invite.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Reject Organization Invite -menuTitle: Reject Organization Invite -weight: 2 ---- -## oasisctl reject organization invite - -Reject an organization invite the authenticated user has access to - -``` -oasisctl reject organization invite [flags] -``` - -## Options -``` - -h, --help help for invite - -i, --invite-id string Identifier of the organization invite - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl reject organization](reject-organization.md) - Reject organization related invites - diff --git a/site/content/3.13/arangograph/oasisctl/reject/reject-organization.md b/site/content/3.13/arangograph/oasisctl/reject/reject-organization.md deleted file mode 100644 index c688b02cd1..0000000000 --- a/site/content/3.13/arangograph/oasisctl/reject/reject-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Reject Organization -menuTitle: Reject Organization -weight: 1 ---- -## oasisctl reject organization - -Reject organization related invites - -``` -oasisctl reject organization [flags] -``` - -## Options -``` - -h, --help help for organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl reject](_index.md) - Reject invites -* [oasisctl reject organization invite](reject-organization-invite.md) - Reject an organization invite the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/renew/_index.md b/site/content/3.13/arangograph/oasisctl/renew/_index.md deleted file mode 100644 index b140a835de..0000000000 --- a/site/content/3.13/arangograph/oasisctl/renew/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Renew -menuTitle: Renew -weight: 22 ---- -## oasisctl renew - -Renew keys & tokens - -``` -oasisctl renew [flags] -``` - -## Options -``` - -h, --help help for renew -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl renew apikey](renew-apikey.md) - Renew API keys & tokens - diff --git a/site/content/3.13/arangograph/oasisctl/renew/renew-apikey-token.md b/site/content/3.13/arangograph/oasisctl/renew/renew-apikey-token.md deleted file mode 100644 index e6a1798243..0000000000 --- a/site/content/3.13/arangograph/oasisctl/renew/renew-apikey-token.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Renew API Key Token -menuTitle: Renew API Key Token -weight: 2 ---- -## oasisctl renew apikey token - -Renew an API key token - -## Synopsis -Renew the token (resulting from API key authentication) - -``` -oasisctl renew apikey token [flags] -``` - -## Options -``` - -h, --help help for token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl renew apikey](renew-apikey.md) - Renew API keys & tokens - diff --git a/site/content/3.13/arangograph/oasisctl/renew/renew-apikey.md b/site/content/3.13/arangograph/oasisctl/renew/renew-apikey.md deleted file mode 100644 index 14c1b7ec4d..0000000000 --- a/site/content/3.13/arangograph/oasisctl/renew/renew-apikey.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Renew API Key -menuTitle: Renew API Key -weight: 1 ---- -## oasisctl renew apikey - -Renew API keys & tokens - -``` -oasisctl renew apikey [flags] -``` - -## Options -``` - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl renew](_index.md) - Renew keys & tokens -* [oasisctl renew apikey token](renew-apikey-token.md) - Renew an API key token - diff --git a/site/content/3.13/arangograph/oasisctl/resume/_index.md b/site/content/3.13/arangograph/oasisctl/resume/_index.md deleted file mode 100644 index 78485175c1..0000000000 --- a/site/content/3.13/arangograph/oasisctl/resume/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Resume -menuTitle: Resume -weight: 23 ---- -## oasisctl resume - -Resume resources - -``` -oasisctl resume [flags] -``` - -## Options -``` - -h, --help help for resume -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl resume deployment](resume-deployment.md) - Resume a paused deployment the authenticated user has access to -* [oasisctl resume notebook](resume-notebook.md) - Resume a notebook - diff --git a/site/content/3.13/arangograph/oasisctl/resume/resume-deployment.md b/site/content/3.13/arangograph/oasisctl/resume/resume-deployment.md deleted file mode 100644 index 7cbc18ef00..0000000000 --- a/site/content/3.13/arangograph/oasisctl/resume/resume-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Resume Deployment -menuTitle: Resume Deployment -weight: 1 ---- -## oasisctl resume deployment - -Resume a paused deployment the authenticated user has access to - -``` -oasisctl resume deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl resume](_index.md) - Resume resources - diff --git a/site/content/3.13/arangograph/oasisctl/resume/resume-notebook.md b/site/content/3.13/arangograph/oasisctl/resume/resume-notebook.md deleted file mode 100644 index 17add47562..0000000000 --- a/site/content/3.13/arangograph/oasisctl/resume/resume-notebook.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Resume Notebook -menuTitle: Resume Notebook -weight: 2 ---- -## oasisctl resume notebook - -Resume a notebook - -``` -oasisctl resume notebook [flags] -``` - -## Options -``` - -h, --help help for notebook - -n, --notebook-id string Identifier of the notebook -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl resume](_index.md) - Resume resources - diff --git a/site/content/3.13/arangograph/oasisctl/revoke/_index.md b/site/content/3.13/arangograph/oasisctl/revoke/_index.md deleted file mode 100644 index 80ad7af060..0000000000 --- a/site/content/3.13/arangograph/oasisctl/revoke/_index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Revoke -menuTitle: Revoke -weight: 24 ---- -## oasisctl revoke - -Revoke keys & tokens - -``` -oasisctl revoke [flags] -``` - -## Options -``` - -h, --help help for revoke -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl revoke apikey](revoke-apikey.md) - Revoke an API key with given identifier -* [oasisctl revoke metrics](revoke-metrics.md) - Revoke keys & tokens - diff --git a/site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey-token.md b/site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey-token.md deleted file mode 100644 index 795b5e5605..0000000000 --- a/site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey-token.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Revoke API Key Token -menuTitle: Revoke API Key Token -weight: 2 ---- -## oasisctl revoke apikey token - -Revoke an API key token - -## Synopsis -Revoke the token (resulting from API key authentication) - -``` -oasisctl revoke apikey token [flags] -``` - -## Options -``` - -h, --help help for token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke apikey](revoke-apikey.md) - Revoke an API key with given identifier - diff --git a/site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey.md b/site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey.md deleted file mode 100644 index 5c15ef927a..0000000000 --- a/site/content/3.13/arangograph/oasisctl/revoke/revoke-apikey.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Revoke API Key -menuTitle: Revoke API Key -weight: 1 ---- -## oasisctl revoke apikey - -Revoke an API key with given identifier - -``` -oasisctl revoke apikey [flags] -``` - -## Options -``` - -i, --apikey-id string Identifier of the API key to revoke - -h, --help help for apikey -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke](_index.md) - Revoke keys & tokens -* [oasisctl revoke apikey token](revoke-apikey-token.md) - Revoke an API key token - diff --git a/site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics-token.md b/site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics-token.md deleted file mode 100644 index 0876f21606..0000000000 --- a/site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics-token.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Revoke Metrics Token -menuTitle: Revoke Metrics Token -weight: 4 ---- -## oasisctl revoke metrics token - -Revoke a metrics token for a deployment - -``` -oasisctl revoke metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for token - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke metrics](revoke-metrics.md) - Revoke keys & tokens - diff --git a/site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics.md b/site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics.md deleted file mode 100644 index 638a17df00..0000000000 --- a/site/content/3.13/arangograph/oasisctl/revoke/revoke-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Revoke Metrics -menuTitle: Revoke Metrics -weight: 3 ---- -## oasisctl revoke metrics - -Revoke keys & tokens - -``` -oasisctl revoke metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl revoke](_index.md) - Revoke keys & tokens -* [oasisctl revoke metrics token](revoke-metrics-token.md) - Revoke a metrics token for a deployment - diff --git a/site/content/3.13/arangograph/oasisctl/rotate/_index.md b/site/content/3.13/arangograph/oasisctl/rotate/_index.md deleted file mode 100644 index e24096c868..0000000000 --- a/site/content/3.13/arangograph/oasisctl/rotate/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rotate -menuTitle: Rotate -weight: 25 ---- -## oasisctl rotate - -Rotate resources - -``` -oasisctl rotate [flags] -``` - -## Options -``` - -h, --help help for rotate -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl rotate deployment](rotate-deployment.md) - Rotate deployment resources - diff --git a/site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment-server.md b/site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment-server.md deleted file mode 100644 index 5d281d1ae4..0000000000 --- a/site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment-server.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Rotate Deployment Server -menuTitle: Rotate Deployment Server -weight: 2 ---- -## oasisctl rotate deployment server - -Rotate a single server of a deployment - -``` -oasisctl rotate deployment server [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for server - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -s, --server-id strings Identifier of the deployment server -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rotate deployment](rotate-deployment.md) - Rotate deployment resources - diff --git a/site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment.md b/site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment.md deleted file mode 100644 index de899d924d..0000000000 --- a/site/content/3.13/arangograph/oasisctl/rotate/rotate-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Rotate Deployment -menuTitle: Rotate Deployment -weight: 1 ---- -## oasisctl rotate deployment - -Rotate deployment resources - -``` -oasisctl rotate deployment [flags] -``` - -## Options -``` - -h, --help help for deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl rotate](_index.md) - Rotate resources -* [oasisctl rotate deployment server](rotate-deployment-server.md) - Rotate a single server of a deployment - diff --git a/site/content/3.13/arangograph/oasisctl/top.md b/site/content/3.13/arangograph/oasisctl/top.md deleted file mode 100644 index d89a83ebfe..0000000000 --- a/site/content/3.13/arangograph/oasisctl/top.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Top -menuTitle: Top -weight: 26 ---- -## oasisctl top - -Show the most important server metrics - -``` -oasisctl top [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for top - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/_index.md b/site/content/3.13/arangograph/oasisctl/unlock/_index.md deleted file mode 100644 index 2c376ce6fd..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/_index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Unlock -menuTitle: Unlock -weight: 27 ---- -## oasisctl unlock - -Unlock resources - -``` -oasisctl unlock [flags] -``` - -## Options -``` - -h, --help help for unlock -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl unlock cacertificate](unlock-cacertificate.md) - Unlock a CA certificate, so it can be deleted -* [oasisctl unlock deployment](unlock-deployment.md) - Unlock a deployment, so it can be deleted -* [oasisctl unlock ipallowlist](unlock-ipallowlist.md) - Unlock an IP allowlist, so it can be deleted -* [oasisctl unlock organization](unlock-organization.md) - Unlock an organization, so it can be deleted -* [oasisctl unlock policy](unlock-policy.md) - Unlock a backup policy -* [oasisctl unlock project](unlock-project.md) - Unlock a project, so it can be deleted - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/unlock-cacertificate.md b/site/content/3.13/arangograph/oasisctl/unlock/unlock-cacertificate.md deleted file mode 100644 index 418fb91ae6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/unlock-cacertificate.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock CA Certificate -menuTitle: Unlock CA Certificate -weight: 1 ---- -## oasisctl unlock cacertificate - -Unlock a CA certificate, so it can be deleted - -``` -oasisctl unlock cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - -h, --help help for cacertificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/unlock-deployment.md b/site/content/3.13/arangograph/oasisctl/unlock/unlock-deployment.md deleted file mode 100644 index 6d870921e6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/unlock-deployment.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock Deployment -menuTitle: Unlock Deployment -weight: 2 ---- -## oasisctl unlock deployment - -Unlock a deployment, so it can be deleted - -``` -oasisctl unlock deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/unlock-ipallowlist.md b/site/content/3.13/arangograph/oasisctl/unlock/unlock-ipallowlist.md deleted file mode 100644 index 36f8fdbaed..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/unlock-ipallowlist.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Oasisctl Unlock IP Allowlist -menuTitle: Unlock IP Allowlist -weight: 3 ---- -## oasisctl unlock ipallowlist - -Unlock an IP allowlist, so it can be deleted - -``` -oasisctl unlock ipallowlist [flags] -``` - -## Options -``` - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/unlock-organization.md b/site/content/3.13/arangograph/oasisctl/unlock/unlock-organization.md deleted file mode 100644 index bfc70efccd..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/unlock-organization.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Unlock Organization -menuTitle: Unlock Organization -weight: 4 ---- -## oasisctl unlock organization - -Unlock an organization, so it can be deleted - -``` -oasisctl unlock organization [flags] -``` - -## Options -``` - -h, --help help for organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/unlock-policy.md b/site/content/3.13/arangograph/oasisctl/unlock/unlock-policy.md deleted file mode 100644 index 2646b5af51..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/unlock-policy.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Unlock Policy -menuTitle: Unlock Policy -weight: 5 ---- -## oasisctl unlock policy - -Unlock a backup policy - -``` -oasisctl unlock policy [flags] -``` - -## Options -``` - -d, --backup-policy-id string Identifier of the backup policy - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.13/arangograph/oasisctl/unlock/unlock-project.md b/site/content/3.13/arangograph/oasisctl/unlock/unlock-project.md deleted file mode 100644 index 211e810283..0000000000 --- a/site/content/3.13/arangograph/oasisctl/unlock/unlock-project.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Unlock Project -menuTitle: Unlock Project -weight: 6 ---- -## oasisctl unlock project - -Unlock a project, so it can be deleted - -``` -oasisctl unlock project [flags] -``` - -## Options -``` - -h, --help help for project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl unlock](_index.md) - Unlock resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/_index.md b/site/content/3.13/arangograph/oasisctl/update/_index.md deleted file mode 100644 index 0d1501cbe5..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/_index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Oasisctl Update -menuTitle: Update -weight: 28 ---- -## oasisctl update - -Update resources - -``` -oasisctl update [flags] -``` - -## Options -``` - -h, --help help for update -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl update auditlog](update-auditlog.md) - Update an auditlog -* [oasisctl update backup](update-backup.md) - Update a backup -* [oasisctl update cacertificate](update-cacertificate.md) - Update a CA certificate the authenticated user has access to -* [oasisctl update deployment](update-deployment.md) - Update a deployment the authenticated user has access to -* [oasisctl update group](update-group.md) - Update a group the authenticated user has access to -* [oasisctl update ipallowlist](update-ipallowlist.md) - Update an IP allowlist the authenticated user has access to -* [oasisctl update metrics](update-metrics.md) - Update metrics resources -* [oasisctl update notebook](update-notebook.md) - Update notebook -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update private](update-private.md) - Update private resources -* [oasisctl update project](update-project.md) - Update a project the authenticated user has access to -* [oasisctl update role](update-role.md) - Update a role the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-auditlog.md b/site/content/3.13/arangograph/oasisctl/update/update-auditlog.md deleted file mode 100644 index 8c92aa1c12..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-auditlog.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Audit Log -menuTitle: Update Audit Log -weight: 1 ---- -## oasisctl update auditlog - -Update an auditlog - -``` -oasisctl update auditlog [flags] -``` - -## Options -``` - -i, --auditlog-id string Identifier of the auditlog to update. - --default If set, this AuditLog is the default for the organization. - --description string Description of the audit log. - -h, --help help for auditlog - --name string Name of the audit log. - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-backup-policy.md b/site/content/3.13/arangograph/oasisctl/update/update-backup-policy.md deleted file mode 100644 index cad0d2417f..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-backup-policy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Oasisctl Update Backup Policy -menuTitle: Update Backup Policy -weight: 3 ---- -## oasisctl update backup policy - -Update a backup policy - -``` -oasisctl update backup policy [flags] -``` - -## Options -``` - --additional-region-ids strings Add backup to the specified addition regions - -d, --backup-policy-id string Identifier of the backup policy - --day-of-the-month int32 Run the backup on the specified day of the month (1-31) (default 1) - --description string Description of the backup - --email-notification string Email notification setting (Never|FailureOnly|Always) - --every-interval-hours int32 Schedule should run with an interval of the specified hours (1-23) - --friday If set, a backup will be created on Fridays. Set to false explicitly to clear the flag. - -h, --help help for policy - --hours int32 Hours part of the time of day (0-23) - --minutes int32 Minutes part of the time of day (0-59) - --minutes-offset int32 Schedule should run with specific minutes offset (0-59) - --monday If set, a backup will be created on Mondays. Set to false explicitly to clear the flag. - --name string Name of the deployment - --paused The policy is paused. Set to false explicitly to clear the flag. - --retention-period int Backups created by this policy will be automatically deleted after the specified retention period. A value of 0 means that backup will never be deleted. - --saturday If set, a backup will be created on Saturdays. Set to false explicitly to clear the flag. - --schedule-type string Schedule of the policy (Hourly|Daily|Monthly) - --sunday If set, a backup will be created on Sundays. Set to false explicitly to clear the flag. - --thursday If set, a backup will be created on Thursdays. Set to false explicitly to clear the flag. - --time-zone string The time-zone this time of day applies to (empty means UTC). Names MUST be exactly as defined in RFC-822. (default "UTC") - --tuesday If set, a backup will be created on Tuesdays. Set to false explicitly to clear the flag. - --upload The backup should be uploaded. Set to false explicitly to clear the flag. - --wednesday If set, a backup will be created on Wednesdays. Set to false explicitly to clear the flag. -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update backup](update-backup.md) - Update a backup - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-backup.md b/site/content/3.13/arangograph/oasisctl/update/update-backup.md deleted file mode 100644 index 9ce085b61b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-backup.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Backup -menuTitle: Update Backup -weight: 2 ---- -## oasisctl update backup - -Update a backup - -``` -oasisctl update backup [flags] -``` - -## Options -``` - --auto-deleted-at int Time (h) until auto delete of the backup - -d, --backup-id string Identifier of the backup - --description string Description of the backup - -h, --help help for backup - --name string Name of the backup - --upload The backups should be uploaded -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update backup policy](update-backup-policy.md) - Update a backup policy - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-cacertificate.md b/site/content/3.13/arangograph/oasisctl/update/update-cacertificate.md deleted file mode 100644 index 1b97fe7a45..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-cacertificate.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update CA Certificate -menuTitle: Update CA Certificate -weight: 4 ---- -## oasisctl update cacertificate - -Update a CA certificate the authenticated user has access to - -``` -oasisctl update cacertificate [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate - --description string Description of the CA certificate - -h, --help help for cacertificate - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --use-well-known-certificate Sets the usage of a well known certificate ie. Let's Encrypt -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-deployment.md b/site/content/3.13/arangograph/oasisctl/update/update-deployment.md deleted file mode 100644 index b7c36cace2..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-deployment.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Oasisctl Update Deployment -menuTitle: Update Deployment -weight: 5 ---- -## oasisctl update deployment - -Update a deployment the authenticated user has access to - -``` -oasisctl update deployment [flags] -``` - -## Options -``` - -c, --cacertificate-id string Identifier of the CA certificate to use for the deployment - --coordinator-memory-size int32 Set memory size of Coordinators for flexible deployments (GiB) (default 4) - --coordinators int32 Set number of Coordinators for flexible deployments (default 3) - --custom-image string Set a custom image to use for the deployment. Only available for selected customers. - --dbserver-disk-size int32 Set disk size of DB-Servers for flexible deployments (GiB) (default 32) - --dbserver-memory-size int32 Set memory size of DB-Servers for flexible deployments (GiB) (default 4) - --dbservers int32 Set number of DB-Servers for flexible deployments (default 3) - -d, --deployment-id string Identifier of the deployment - --description string Description of the deployment - --disable-foxx-authentication Disable authentication of requests to Foxx application. - --disk-performance-id string Set the disk performance to use for this deployment. - --drop-vst-support Drop VST protocol support to improve resilience. - -h, --help help for deployment - -i, --ipallowlist-id string Identifier of the IP allowlist to use for the deployment - --is-platform-authentication-enabled Enable platform authentication for deployment. - --max-node-disk-size int32 Set maximum disk size for nodes for autoscaler (GiB) - --model string Set model of the deployment (default "oneshard") - --name string Name of the deployment - --node-count int32 Set the number of desired nodes (default 3) - --node-disk-size int32 Set disk size for nodes (GiB) - --node-size-id string Set the node size to use for this deployment - --notification-email-address strings Set email address(-es) that will be used for notifications related to this deployment. - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --version string Version of ArangoDB to use for the deployment -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-group.md b/site/content/3.13/arangograph/oasisctl/update/update-group.md deleted file mode 100644 index 7021923d4c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-group.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Group -menuTitle: Update Group -weight: 6 ---- -## oasisctl update group - -Update a group the authenticated user has access to - -``` -oasisctl update group [flags] -``` - -## Options -``` - --description string Description of the group - -g, --group-id string Identifier of the group - -h, --help help for group - --name string Name of the group - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-ipallowlist.md b/site/content/3.13/arangograph/oasisctl/update/update-ipallowlist.md deleted file mode 100644 index 089d41026c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-ipallowlist.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Oasisctl Update IP Allowlist -menuTitle: Update IP Allowlist -weight: 7 ---- -## oasisctl update ipallowlist - -Update an IP allowlist the authenticated user has access to - -``` -oasisctl update ipallowlist [flags] -``` - -## Options -``` - --add-cidr-range strings List of CIDR ranges to add to the IP allowlist - --description string Description of the CA certificate - -h, --help help for ipallowlist - -i, --ipallowlist-id string Identifier of the IP allowlist - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - --remote-inspection-allowed If set, remote connectivity checks by the Oasis platform are allowed - --remove-cidr-range strings List of CIDR ranges to remove from the IP allowlist -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-metrics-token.md b/site/content/3.13/arangograph/oasisctl/update/update-metrics-token.md deleted file mode 100644 index 2ff4a301aa..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-metrics-token.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Metrics Token -menuTitle: Update Metrics Token -weight: 9 ---- -## oasisctl update metrics token - -Update a metrics token - -``` -oasisctl update metrics token [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - --description string Description of the CA certificate - -h, --help help for token - --name string Name of the CA certificate - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --token-id string Identifier of the metrics token -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update metrics](update-metrics.md) - Update metrics resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-metrics.md b/site/content/3.13/arangograph/oasisctl/update/update-metrics.md deleted file mode 100644 index d8fc683f1e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Metrics -menuTitle: Update Metrics -weight: 8 ---- -## oasisctl update metrics - -Update metrics resources - -``` -oasisctl update metrics [flags] -``` - -## Options -``` - -h, --help help for metrics -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update metrics token](update-metrics-token.md) - Update a metrics token - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-notebook.md b/site/content/3.13/arangograph/oasisctl/update/update-notebook.md deleted file mode 100644 index 2b6fee7bb0..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-notebook.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Notebook -menuTitle: Update Notebook -weight: 10 ---- -## oasisctl update notebook - -Update notebook - -``` -oasisctl update notebook [flags] -``` - -## Options -``` - -d, --description string Description of the notebook - -s, --disk-size int32 Notebook disk size in GiB - -h, --help help for notebook - --name string Name of the notebook - -n, --notebook-id string Identifier of the notebook - -m, --notebook-model string Identifier of the notebook model -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-organization-authentication-providers.md b/site/content/3.13/arangograph/oasisctl/update/update-organization-authentication-providers.md deleted file mode 100644 index 8d8d9be5de..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-organization-authentication-providers.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Organization Authentication Providers -menuTitle: Update Organization Authentication Providers -weight: 13 ---- -## oasisctl update organization authentication providers - -Update allowed authentication providers for an organization the authenticated user has access to - -``` -oasisctl update organization authentication providers [flags] -``` - -## Options -``` - --enable-github If set, allow access from user accounts authentication through Github - --enable-google If set, allow access from user accounts authentication through Google - --enable-microsoft If set, allow access from user accounts authentication through Microsoft - --enable-sso If set, allow access from user accounts authentication through single sign on (sso) - --enable-username-password If set, allow access from user accounts authentication through username-password - -h, --help help for providers - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization authentication](update-organization-authentication.md) - Update authentication settings for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-organization-authentication.md b/site/content/3.13/arangograph/oasisctl/update/update-organization-authentication.md deleted file mode 100644 index 328b81b297..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-organization-authentication.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Authentication -menuTitle: Update Organization Authentication -weight: 12 ---- -## oasisctl update organization authentication - -Update authentication settings for an organization - -``` -oasisctl update organization authentication [flags] -``` - -## Options -``` - -h, --help help for authentication -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update organization authentication providers](update-organization-authentication-providers.md) - Update allowed authentication providers for an organization the authenticated user has access to - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md b/site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md deleted file mode 100644 index 6d860fa8d6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Update Organization Email Domain Restrictions -menuTitle: Update Organization Email Domain Restrictions -weight: 16 ---- -## oasisctl update organization email domain restrictions - -Update which domain restrictions are placed on accessing a specific organization - -``` -oasisctl update organization email domain restrictions [flags] -``` - -## Options -``` - -d, --allowed-domain strings Allowed email domains for users of the organization - -h, --help help for restrictions - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization email domain](update-organization-email-domain.md) - Update email domain specific information for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain.md b/site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain.md deleted file mode 100644 index 57f79b6fbb..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-organization-email-domain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Email Domain -menuTitle: Update Organization Email Domain -weight: 15 ---- -## oasisctl update organization email domain - -Update email domain specific information for an organization - -``` -oasisctl update organization email domain [flags] -``` - -## Options -``` - -h, --help help for domain -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization email](update-organization-email.md) - Update email specific information for an organization -* [oasisctl update organization email domain restrictions](update-organization-email-domain-restrictions.md) - Update which domain restrictions are placed on accessing a specific organization - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-organization-email.md b/site/content/3.13/arangograph/oasisctl/update/update-organization-email.md deleted file mode 100644 index 89f05ed737..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-organization-email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Organization Email -menuTitle: Update Organization Email -weight: 14 ---- -## oasisctl update organization email - -Update email specific information for an organization - -``` -oasisctl update organization email [flags] -``` - -## Options -``` - -h, --help help for email -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update organization](update-organization.md) - Update an organization the authenticated user has access to -* [oasisctl update organization email domain](update-organization-email-domain.md) - Update email domain specific information for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-organization.md b/site/content/3.13/arangograph/oasisctl/update/update-organization.md deleted file mode 100644 index 670d291842..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-organization.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Update Organization -menuTitle: Update Organization -weight: 11 ---- -## oasisctl update organization - -Update an organization the authenticated user has access to - -``` -oasisctl update organization [flags] -``` - -## Options -``` - --description string Description of the organization - -h, --help help for organization - --name string Name of the organization - -o, --organization-id string Identifier of the organization -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update organization authentication](update-organization-authentication.md) - Update authentication settings for an organization -* [oasisctl update organization email](update-organization-email.md) - Update email specific information for an organization - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-policy-add-binding.md b/site/content/3.13/arangograph/oasisctl/update/update-policy-add-binding.md deleted file mode 100644 index df89601244..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-policy-add-binding.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Policy Add Binding -menuTitle: Update Policy Add Binding -weight: 19 ---- -## oasisctl update policy add binding - -Add a role binding to a policy - -``` -oasisctl update policy add binding [flags] -``` - -## Options -``` - --group-id strings Identifiers of the groups to add bindings for - -h, --help help for binding - -r, --role-id string Identifier of the role to bind to - -u, --url string URL of the resource to update the policy for - --user-id strings Identifiers of the users to add bindings for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy add](update-policy-add.md) - Add to a policy - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-policy-add.md b/site/content/3.13/arangograph/oasisctl/update/update-policy-add.md deleted file mode 100644 index 42e655fe7c..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-policy-add.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Policy Add -menuTitle: Update Policy Add -weight: 18 ---- -## oasisctl update policy add - -Add to a policy - -``` -oasisctl update policy add [flags] -``` - -## Options -``` - -h, --help help for add -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update policy add binding](update-policy-add-binding.md) - Add a role binding to a policy - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-policy-delete-binding.md b/site/content/3.13/arangograph/oasisctl/update/update-policy-delete-binding.md deleted file mode 100644 index 602bc93e93..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-policy-delete-binding.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Policy Delete Binding -menuTitle: Update Policy Delete Binding -weight: 21 ---- -## oasisctl update policy delete binding - -Delete a role binding from a policy - -``` -oasisctl update policy delete binding [flags] -``` - -## Options -``` - --group-id strings Identifiers of the groups to delete bindings for - -h, --help help for binding - -r, --role-id string Identifier of the role to delete bind for - -u, --url string URL of the resource to update the policy for - --user-id strings Identifiers of the users to delete bindings for -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy delete](update-policy-delete.md) - Delete from a policy - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-policy-delete.md b/site/content/3.13/arangograph/oasisctl/update/update-policy-delete.md deleted file mode 100644 index dec2527590..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-policy-delete.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Policy Delete -menuTitle: Update Policy Delete -weight: 20 ---- -## oasisctl update policy delete - -Delete from a policy - -``` -oasisctl update policy delete [flags] -``` - -## Options -``` - -h, --help help for delete -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update policy](update-policy.md) - Update a policy -* [oasisctl update policy delete binding](update-policy-delete-binding.md) - Delete a role binding from a policy - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-policy.md b/site/content/3.13/arangograph/oasisctl/update/update-policy.md deleted file mode 100644 index 132c0b4123..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-policy.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Oasisctl Update Policy -menuTitle: Update Policy -weight: 17 ---- -## oasisctl update policy - -Update a policy - -``` -oasisctl update policy [flags] -``` - -## Options -``` - -h, --help help for policy -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update policy add](update-policy-add.md) - Add to a policy -* [oasisctl update policy delete](update-policy-delete.md) - Delete from a policy - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-private-endpoint-service.md b/site/content/3.13/arangograph/oasisctl/update/update-private-endpoint-service.md deleted file mode 100644 index 81aa0917f6..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-private-endpoint-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Oasisctl Update Private Endpoint Service -menuTitle: Update Private Endpoint Service -weight: 24 ---- -## oasisctl update private endpoint service - -Update a Private Endpoint Service attached to an existing deployment - -``` -oasisctl update private endpoint service [flags] -``` - -## Options -``` - --alternate-dns-name strings DNS names used for the deployment in the private network - --aws-principal strings List of AWS Principals from which a Private Endpoint can be created (Format: <AccountID>[/Role/<RoleName>|/User/<UserName>]) - --azure-client-subscription-id strings List of Azure subscription IDs from which a Private Endpoint can be created - -d, --deployment-id string Identifier of the deployment that the private endpoint service is connected to - --description string Description of the private endpoint service - --enable-private-dns Enable private DNS (applicable for AWS only) - --gcp-project strings List of GCP projects from which a Private Endpoint can be created - -h, --help help for service - --name string Name of the private endpoint service - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update private endpoint](update-private-endpoint.md) - - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-private-endpoint.md b/site/content/3.13/arangograph/oasisctl/update/update-private-endpoint.md deleted file mode 100644 index a66ead3924..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-private-endpoint.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Private Endpoint -menuTitle: Update Private Endpoint -weight: 23 ---- -## oasisctl update private endpoint - - - -``` -oasisctl update private endpoint [flags] -``` - -## Options -``` - -h, --help help for endpoint -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update private](update-private.md) - Update private resources -* [oasisctl update private endpoint service](update-private-endpoint-service.md) - Update a Private Endpoint Service attached to an existing deployment - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-private.md b/site/content/3.13/arangograph/oasisctl/update/update-private.md deleted file mode 100644 index 8c414612ac..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-private.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Update Private -menuTitle: Update Private -weight: 22 ---- -## oasisctl update private - -Update private resources - -``` -oasisctl update private [flags] -``` - -## Options -``` - -h, --help help for private -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources -* [oasisctl update private endpoint](update-private-endpoint.md) - - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-project.md b/site/content/3.13/arangograph/oasisctl/update/update-project.md deleted file mode 100644 index 0965a3684e..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-project.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Update Project -menuTitle: Update Project -weight: 25 ---- -## oasisctl update project - -Update a project the authenticated user has access to - -``` -oasisctl update project [flags] -``` - -## Options -``` - --description string Description of the project - -h, --help help for project - --name string Name of the project - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/update/update-role.md b/site/content/3.13/arangograph/oasisctl/update/update-role.md deleted file mode 100644 index 58d7f2e8ab..0000000000 --- a/site/content/3.13/arangograph/oasisctl/update/update-role.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Oasisctl Update Role -menuTitle: Update Role -weight: 26 ---- -## oasisctl update role - -Update a role the authenticated user has access to - -``` -oasisctl update role [flags] -``` - -## Options -``` - --add-permission strings Permissions to add to the role - --description string Description of the role - -h, --help help for role - --name string Name of the role - -o, --organization-id string Identifier of the organization - --remove-permission strings Permissions to remove from the role - -r, --role-id string Identifier of the role -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl update](_index.md) - Update resources - diff --git a/site/content/3.13/arangograph/oasisctl/upgrade.md b/site/content/3.13/arangograph/oasisctl/upgrade.md deleted file mode 100644 index 8d77aa3ecf..0000000000 --- a/site/content/3.13/arangograph/oasisctl/upgrade.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Oasisctl Upgrade -menuTitle: Upgrade -weight: 29 ---- -## oasisctl upgrade - -Upgrade Oasisctl tool - -## Synopsis -Check the latest, compatible version and upgrade this tool to that. - -``` -oasisctl upgrade [flags] -``` - -## Options -``` - -d, --dry-run Do an upgrade without applying the version. - -f, --force Force an upgrade even if the versions match. - -h, --help help for upgrade -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/version.md b/site/content/3.13/arangograph/oasisctl/version.md deleted file mode 100644 index e8e5ee7c8b..0000000000 --- a/site/content/3.13/arangograph/oasisctl/version.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Oasisctl Version -menuTitle: Version -weight: 30 ---- -## oasisctl version - -Show the current version of this tool - -``` -oasisctl version [flags] -``` - -## Options -``` - -h, --help help for version -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](options.md) - ArangoGraph Insights Platform - diff --git a/site/content/3.13/arangograph/oasisctl/wait/_index.md b/site/content/3.13/arangograph/oasisctl/wait/_index.md deleted file mode 100644 index 1ccac25259..0000000000 --- a/site/content/3.13/arangograph/oasisctl/wait/_index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Oasisctl Wait -menuTitle: Wait -weight: 31 ---- -## oasisctl wait - -Wait for a status change - -``` -oasisctl wait [flags] -``` - -## Options -``` - -h, --help help for wait -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl](../options.md) - ArangoGraph Insights Platform -* [oasisctl wait deployment](wait-deployment.md) - Wait for a deployment to reach the ready status - diff --git a/site/content/3.13/arangograph/oasisctl/wait/wait-deployment.md b/site/content/3.13/arangograph/oasisctl/wait/wait-deployment.md deleted file mode 100644 index ddc2c82d76..0000000000 --- a/site/content/3.13/arangograph/oasisctl/wait/wait-deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Oasisctl Wait Deployment -menuTitle: Wait Deployment -weight: 1 ---- -## oasisctl wait deployment - -Wait for a deployment to reach the ready status - -``` -oasisctl wait deployment [flags] -``` - -## Options -``` - -d, --deployment-id string Identifier of the deployment - -h, --help help for deployment - -o, --organization-id string Identifier of the organization - -p, --project-id string Identifier of the project - -t, --timeout duration How long to wait for the deployment to reach the ready status (default 20m0s) -``` - -## Options Inherited From Parent Commands -``` - --endpoint string API endpoint of the ArangoDB Oasis (default "api.cloud.arangodb.com") - --format string Output format (table|json) (default "table") - --token string Token used to authenticate at ArangoDB Oasis -``` - -## See also -* [oasisctl wait](_index.md) - Wait for a status change - diff --git a/site/content/3.13/arangograph/organizations/billing.md b/site/content/3.13/arangograph/organizations/billing.md deleted file mode 100644 index 9b892b5500..0000000000 --- a/site/content/3.13/arangograph/organizations/billing.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Billing in ArangoGraph -menuTitle: Billing -weight: 10 -description: >- - How to manage billing details and payment methods in ArangoGraph ---- -## How to add billing details - -1. In the main navigation menu, click the **Organization** icon. -2. Click **Billing** in the **Organization** section. -3. In the **Billing Details** section, click **Edit**. -4. Enter your company name, billing address, and EU VAT identification number (if applicable). -5. Optionally, enter the email address(es) to which invoices should be emailed - to automatically. -6. Click **Save**. - -![ArangoGraph Billing Details](../../../images/arangograph-billing-details.png) - -## How to add a payment method - -1. In the main navigation menu, click the **Organization** icon. -2. Click **Billing** in the **Organization** section. -3. In the **Payment methods** section, click **Add**. -4. Fill out the form with your credit card details. Currently, a credit card is the only available payment method. -5. Click **Save**. - -![ArangoGraph Payment Method](../../../images/arangograph-add-payment-method-credit-card.png) - -{{% comment %}} -TODO: Need screenshot with invoice - -### How to view invoices - - -{{% /comment %}} diff --git a/site/content/3.13/arangograph/organizations/credits-and-usage.md b/site/content/3.13/arangograph/organizations/credits-and-usage.md deleted file mode 100644 index 34dafb8488..0000000000 --- a/site/content/3.13/arangograph/organizations/credits-and-usage.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Credits & Usage in ArangoGraph -menuTitle: Credits & Usage -weight: 15 -description: >- - Credits give you access to a flexible prepaid model, so you can allocate them - across multiple deployments as needed ---- -{{< info >}} -Credits are only available if your organization has signed up for -ArangoGraph's [Committed](../organizations/_index.md#committed) package. -{{< /info >}} - -The ArangoGraph credit model is a versatile prepaid model that allows you to -purchase credits and use them in a flexible way, based on what you have running -in ArangoGraph. - -Instead of purchasing a particular deployment for a year, you can purchase a -number of ArangoGraph credits that expire a year after purchase. These credits -are then consumed over that time period, based on the deployments you run -in ArangoGraph. - -For example, a OneShard (three nodes) A64 deployment consumes more credits per -hour than a smaller deployment such as A8. If you are running multiple deployments, -like pre-production environments or for different use-cases, these would each consume -from the same credit balance. However, if you are not running any deployments -and do not have any backup storage, then none of your credits will be consumed. - -{{< tip >}} -To purchase credits for your organization, you need to get in touch with the -ArangoDB team. [Contact us](https://www.arangodb.com/contact/) for more details. -{{< /tip >}} - -There are a number of benefits that ArangoGraph credits provide: -- **Adaptability**: The pre-paid credit model allows you to adapt your usage to - changing project requirements or fluctuating workloads. By enabling the use of - credits for various instance types and sizes, you can easily adjust your - resource allocation. -- **Efficient handling of resources**: With the ability to purchase credits in - advance, you can better align your needs in terms of resources and costs. - You can purchase credits in bulk and then allocate them as needed. -- **Workload Optimization**: By having a clear view of credit consumption and - remaining balance, you can identify inefficiencies to further optimize your - infrastructure, resulting in cost savings and better performance. - -## How to view the credit usage - -1. In the main navigation, click the **Organization** icon. -2. Click **Credits & Usage** in the **Organization** section. -3. In the **Credits & Usage** page, you can: - - See the remaining credit balance. - - Track your total credit balance. - - See a projection of when you will run out of credits, based on the last 30 days of usage. - - Get a detailed consumption report in PDF format that shows: - - The number of credits you had at the start of the month. - - The number of credits consumed in the month. - - The number of credits remaining. - - The number of credits consumed for each deployment. - -![ArangoGraph Credits and Usage](../../../images/arangograph-credits-and-usage.png) - -## FAQs - -### Are there any configuration constraints for using the credits? - -No. Credits are designed to be used completely flexibly. You can use all of your -credits for multiple small deployments (i.e. A8s) or you can use them for a single -large deployment (i.e. A256), or even multiple large deployments, as long as you -have enough credits remaining. - -### What is the flexibility of moving up or down in configuration size of the infrastructure? - -You can move up sizes in configuration at any point by editing your deployment -within ArangoGraph, once every 6 hours to allow for in-place disk expansion. - -### Is there a limit to how many deployments I can use my credits on? - -There is no specific limit to the number of deployments you can use your credits -on. The credit model is designed to provide you with the flexibility to allocate -credits across multiple deployments as needed. This enables you to effectively -manage and distribute your resources according to your specific requirements and -priorities. However, it is essential to monitor your credit consumption to ensure -that you have sufficient credits to cover your deployments. - -### Do the credits I purchase expire? - -Yes, credits expire 1 year after purchase. You should ensure that you consume -all of these credits within the year. - -### Can I make multiple purchases of credits within a year? - -As an organization’s usage of ArangoGraph grows, particularly in the initial -phases of application development and early production release, it is common -to purchase a smaller credit package that is later supplemented by a larger -credit package part-way through the initial credit expiry term. -In this case, all sets of credits will be available for ArangoGraph consumption -as a single credit balance. The credits with the earlier expiry date are consumed -first to avoid credit expiry where possible. - -### Can I purchase a specific number of credits (i.e. 3361, 4185)? - -ArangoGraph offers a variety of predefined credit packages designed to -accommodate different needs and stages of the application lifecycle. -For any credit purchasing needs, please [contact us](https://www.arangodb.com/contact/) -and we are happy to help find an appropriate package for you. - -### How quickly will the credits I purchase be consumed? - -The rate at which your purchased credits will be consumed depends on several -factors, including the type and size of instances you deploy, the amount of -resources used, and the duration of usage. Each machine size has an hourly credit -consumption rate, and the overall rate of credit consumption will increase for -larger sizes or for more machines/deployments. Credits will also be consumed for -any variable usage charges such as outbound network traffic and backup storage. - -### How can I see how many credits I have remaining? - -All details about credits, including how many credits have been purchased, -how many remain, and how they are being consumed are available in the -**Credits & Usage** page within the ArangoGraph web interface. - -### I have a large sharded deployment, how do I know how many credits it will consume? - -If you are using credits, then you will be able to see how many credits your -configured deployment will consume when [creating](../deployments/_index.md#how-to-create-a-new-deployment) -or [editing a deployment](../deployments/_index.md#how-to-edit-a-deployment). - -You can download a detailed consumption report in the -[**Credits & Usage** section](#how-to-view-the-credit-usage). It shows you the -number of credits consumed by any deployment you are creating or editing. - -All users can see the credit price of each node size in the **Pricing** section. - -### What happens if I run out of credits? - -If you run out of credits, your access to ArangoGraph's services and resources -will be temporarily suspended until you purchase additional credits. - -### Can I buy credits for a short time period (e.g. 2 months)? - -No, you cannot but credits with an expiry of less than 12 months. -If you require credits for a shorter time frame, such as 2 months, you can still -purchase one of the standard credit packages and consume the credits as needed -during that time. You may opt for a smaller credit package that aligns with your -expected usage during the desired period, rather than the full year’s expected usage. -Although the credits will have a longer expiration period, this allows you to have -the flexibility of utilizing the remaining credits for any future needs. \ No newline at end of file diff --git a/site/content/3.13/arangograph/organizations/users-and-groups.md b/site/content/3.13/arangograph/organizations/users-and-groups.md deleted file mode 100644 index abed36697b..0000000000 --- a/site/content/3.13/arangograph/organizations/users-and-groups.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Users and Groups in ArangoGraph -menuTitle: Users & Groups -weight: 5 -description: >- - How to manage individual members and user groups in ArangoGraph ---- -## Users, groups & members - -When you use ArangoGraph, you are logged in as a user. -A user has properties such as name & email address. -Most important of the user is that it serves as an identity of a person. - -A user is member of one or more organizations in ArangoGraph. -You can become a member of an organization in the following ways: - -- Create a new organization. You will become the first member and owner of that - organization. -- Be invited to join an organization. Once accepted (by the invited user), this - user becomes a member of the organization. - -If the number of members of an organization becomes large, it helps to group -users. In ArangoGraph a group is part of an organization and a group contains -a list of users. All users of the group must be member of the owning organization. - -In the **People** section of the dashboard you can manage users, groups and -invites for the organization. - -To edit permissions of members see [Access Control](../security-and-access-control/_index.md). - -## Members - -Members are a list of users that can access an organization. - -![ArangoGraph Member Access Control](../../../images/arangograph-access-control-members.png) - -### How to add a new member to the organization - -1. In the main navigation, click the __Organization__ icon. -2. Click __Members__ in the __People__ section. -3. Optionally, click the __Invites__ entry. -4. Click the __Invite new member__ button. -5. In the form that appears, enter the email address of the person you want to - invite. -6. Click the __Create__ button. -7. An email with an organization invite will now be sent to the specified - email address. -8. After accepting the invite the person will be added to the organization - [members](#members). - -![ArangoGraph Organization Invites](../../../images/arangograph-new-invite.png) - -### How to respond to an organization invite - -See [My Account: How to respond to my invites](../my-account.md#how-to-respond-to-my-invites) - -### How to remove a member from the organization - -1. Click __Members__ in the __People__ section of the main navigation. -2. Delete a member by pressing the __recycle bin__ icon in the __Actions__ column. -3. Confirm the deletion in the dialog that pops up. - -{{< info >}} -You cannot delete members who are organization owners. -{{< /info >}} - -### How to make a member an organization owner - -1. Click __Members__ in the __People__ section of the main navigation. -2. You can convert a member to an organization owner by pressing the __Key__ icon - in the __Actions__ column. -3. You can convert a member back to a normal user by pressing the __User__ icon - in the __Actions__ column. - -## Groups - -A group is a defined set of members. Groups can then be bound to roles. These -bindings contribute to the respective organization, project or deployment policy. - -![ArangoGraph Groups](../../../images/arangograph-groups.png) - -### How to create a new group - -1. Click __Groups__ in the __People__ section of the main navigation. -2. Press the __New group__ button. -3. Enter a name and optionally a description for your new group. -4. Select the members you want to be part of the group. -5. Press the __Create__ button. - -![ArangoGraph New Group](../../../images/arangograph-new-group.png) - -### How to view, edit or remove a group - -1. Click __Groups__ in the __People__ section of the main navigation. -2. Click an icon in the __Actions__ column: - - __Eye__: View group - - __Pencil__: Edit group - - __Recycle bin__: Delete group - -You can also click a group name to view it. There are buttons to __Edit__ and -__Delete__ the currently viewed group. - -![ArangoGraph Group](../../../images/arangograph-group.png) - -{{< info >}} -The groups __Organization members__ and __Organization owners__ are virtual groups -and cannot be changed. They always reflect the current set of organization -members and owners. -{{< /info >}} - -## Invites - -### How to create a new organization invite - -See [How to add a new member to the organization](#how-to-add-a-new-member-to-the-organization) - -### How to view the status of invitations - -1. Click __Invites__ in the __People__ section of the main navigation. -2. The created invites are displayed, grouped by status __Pending__, - __Accepted__ and __Rejected__. -3. You may delete pending invites by clicking the __recycle bin__ icon in the - __Actions__ column. - -![ArangoGraph Organization Invites](../../../images/arangograph-org-invites.png) diff --git a/site/content/3.13/arangograph/projects.md b/site/content/3.13/arangograph/projects.md deleted file mode 100644 index f4efd27833..0000000000 --- a/site/content/3.13/arangograph/projects.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Projects in ArangoGraph -menuTitle: Projects -weight: 15 -description: >- - How to manage projects and IP allowlists in ArangoGraph ---- -ArangoGraph projects can represent organizational units such as teams, -product groups, environments (e.g. staging vs. production). You can have any -number of projects under one organization. - -**Organizations → <u>Projects</u> → Deployments** - -Projects are a container for related deployments, certificates & IP allowlists. -Projects also come with their own policy for access control. You can have any -number of deployment under one project. - -![ArangoGraph Projects Overview](../../images/arangograph-projects-overview.png) - -## How to create a new project - -1. In the main navigation, click the __Dashboard__ icon. -2. Click __Projects__ in the __Dashboard__ section. -3. Click the __New project__ button. -4. Enter a name and optionally a description for your new project. -5. Click the __Create__ button. -6. You will be taken to the project page. -7. To change the name or description, click either at the top of the page. - -![ArangoGraph New Project](../../images/arangograph-new-project.png) - -![ArangoGraph Project Summary](../../images/arangograph-project.png) - -{{< info >}} -Projects contain exactly **one policy**. Within that policy, you can define -role bindings to regulate access control on a project level. -{{< /info >}} - -## How to create a new deployment - -See [Deployments: How to create a new deployment](deployments/_index.md#how-to-create-a-new-deployment) - -## How to delete a project - -{{< danger >}} -Deleting a project will delete contained deployments, certificates & IP allowlists. -This operation is **irreversible**. -{{< /danger >}} - -1. Click __Projects__ in the __Dashboard__ section of the main navigation. -2. Click the __recycle bin__ icon in the __Actions__ column of the project to be deleted. -3. Enter `Delete!` to confirm and click __Yes__. - -{{< tip >}} -If the project has a locked deployment, you need to [unlock](security-and-access-control/_index.md#locked-resources) -it first to be able to delete the project. -{{< /tip >}} - -## How to manage IP allowlists - -IP allowlists let you limit access to your deployment to certain IP ranges. -It is optional, but strongly recommended to do so. - -You can create an allowlist as part of a project. - -1. Click a project name in the __Projects__ section of the main navigation. -2. Click the __Security__ entry. -3. In the __IP allowlists__ section, click: - - The __New IP allowlist__ button to create a new allowlist. - When creating or editing a list, you can add comments - in the __Allowed CIDR ranges (1 per line)__ section. - Everything after `//` or `#` is considered a comment until the end of the line. - - A name or the __eye__ icon in the __Actions__ column to view the allowlist. - - The __pencil__ icon to edit the allowlist. - You can also view the allowlist and click the __Edit__ button. - - The __recycle bin__ icon to delete the allowlist. - -## How to manage role bindings - -See: -- [Access Control: How to view, edit or remove role bindings of a policy](security-and-access-control/_index.md#how-to-view-edit-or-remove-role-bindings-of-a-policy) -- [Access Control: How to add a role binding to a policy](security-and-access-control/_index.md#how-to-add-a-role-binding-to-a-policy) diff --git a/site/content/3.13/arangograph/security-and-access-control/_index.md b/site/content/3.13/arangograph/security-and-access-control/_index.md deleted file mode 100644 index fa37f9af13..0000000000 --- a/site/content/3.13/arangograph/security-and-access-control/_index.md +++ /dev/null @@ -1,699 +0,0 @@ ---- -title: Security and access control in ArangoGraph -menuTitle: Security and Access Control -weight: 45 -description: >- - This guide explains which access control concepts are available in - ArangoGraph and how to use them ---- -The ArangoGraph Insights Platform has a structured set of resources that are subject to security and -access control: - -- Organizations -- Projects -- Deployments - -For each of these resources, you can perform various operations. -For example, you can create a project in an organization and create a deployment -inside a project. - -## Locked resources - -In ArangoGraph, you can lock the resources to prevent accidental deletion. When -a resource is locked, it cannot be deleted and must be unlocked first. - -The hierarchical structure of the resources (organization-project-deployment) -is used in the locking functionality: if a child resource is locked -(for example, a deployment), you cannot delete the parent project without -unlocking that deployment first. - -{{< info >}} -If you lock a backup policy of a deployment or an IP allowlist, CA certificate, -and IAM provider of a project, it is still possible to delete -the corresponding parent resource without unlocking those properties first. -{{< /info >}} - -## Policy - -Various actions in ArangoGraph require different permissions, which can be -granted to users via **roles**. - -The association of a member with a role is called a **role binding**. -All role bindings of a resource comprise a **policy**. - -Roles can be bound on an organization, project, and deployment level (listed in -the high to low level order, with lower levels inheriting permissions from their -parents). This means that there is a unique policy per resource (an organization, -a project, or a deployment). - -For example, an organization has exactly one policy, -which binds roles to members of the organization. These bindings are used to -give the users permissions to perform operations in this organization. -This is useful when, as an organization owner, you need to extend the permissions -for an organization member. - -{{< info >}} -Permissions linked to predefined roles vary between organization owners and -organization members. If you need to extend permissions for an organization -member, you can create a new role binding. The complete list of roles and -their respective permissions for both organization owners and members can be -viewed on the **Policy** page of an organization within the ArangoGraph dashboard. -{{< /info >}} - -### How to view, edit, or remove role bindings of a policy - -Decide whether you want to edit the policy for an organization, a project, -or a deployment: - -- **Organization**: In the main navigation, click the __Organization__ icon and - then click __Policy__. -- **Project**: In the main navigation, click the __Dashboard__ icon, then click - __Projects__, click the name of the desired project, and finally click __Policy__. -- **Deployment**: In the main navigation, click the __Dashboard__ icon, then - click __Deployments__, click the name of the desired deployment, and finally - click __Policy__. - -To delete a role binding, click the **Recycle Bin** icon in the **Actions** column. - -{{< info >}} -Currently, you cannot edit a role binding, you can only delete it. -{{< /info >}} - -![ArangoGraph Project Policy](../../../images/arangograph-policy-page.png) - -### How to add a role binding to a policy - -1. Navigate to the **Policy** tab of an organization, a project or a deployment. -2. Click the **New role binding** button. -3. Select one or more users and/or groups. -4. Select one or more roles you want to assign to the specified members. -5. Click **Create**. - -![ArangoGraph New Role Binding](../../../images/arangograph-new-policy-role-binding.png) - -## Roles - -Operations on resources in ArangoGraph require zero (just an authentication) or -more permissions. Since the -number of permissions is large and very detailed, it is not practical to assign -permissions directly to users. Instead, ArangoGraph uses **roles**. - -A role is a set of permissions. Roles can be bound to groups (preferably) -or individual users. You can create such bindings for the respective organization, -project, or deployment policy. - -There are predefined roles, but you can also create custom ones. - -![ArangoGraph Roles](../../../images/arangograph-access-control-roles.png) - -### Predefined roles - -Predefined roles are created by ArangoGraph and group related permissions together. -An example of a predefined role is `deployment-viewer`. This role -contains all permissions needed to view deployments in a project. - -Predefined roles cannot be deleted. Note that permissions linked to predefined -roles vary between organization owners and organization members. - -{{% comment %}} -Command to generate below list with (Git)Bash: - -export OASIS_TOKEN='<TOKEN>' -./oasisctl list roles --organization-id <ID> --format json | jq -r '.[] | select(.predefined == true) | "**\(.description)** (`\(.id)`):\n\(.permissions | split(", ") | map("- `\(.)`\n") | join(""))"' -{{% /comment %}} - -{{< details summary="List of predefined roles and their permissions" >}} - -{{</* tip */>}} -The roles below are described following this pattern: - -**Role description** (`role ID`): -- `Permission` -{{</* /tip */>}} - -**Audit Log Admin** (`auditlog-admin`): -- `audit.auditlog.create` -- `audit.auditlog.delete` -- `audit.auditlog.get` -- `audit.auditlog.list` -- `audit.auditlog.set-default` -- `audit.auditlog.test-https-post-destination` -- `audit.auditlog.update` - -**Audit Log Archive Admin** (`auditlog-archive-admin`): -- `audit.auditlogarchive.delete` -- `audit.auditlogarchive.get` -- `audit.auditlogarchive.list` - -**Audit Log Archive Viewer** (`auditlog-archive-viewer`): -- `audit.auditlogarchive.get` -- `audit.auditlogarchive.list` - -**Audit Log Attachment Admin** (`auditlog-attachment-admin`): -- `audit.auditlogattachment.create` -- `audit.auditlogattachment.delete` -- `audit.auditlogattachment.get` - -**Audit Log Attachment Viewer** (`auditlog-attachment-viewer`): -- `audit.auditlogattachment.get` - -**Audit Log Event Admin** (`auditlog-event-admin`): -- `audit.auditlogevent.delete` -- `audit.auditlogevents.get` - -**Audit Log Event Viewer** (`auditlog-event-viewer`): -- `audit.auditlogevents.get` - -**Audit Log Viewer** (`auditlog-viewer`): -- `audit.auditlog.get` -- `audit.auditlog.list` - -**Backup Administrator** (`backup-admin`): -- `backup.backup.copy` -- `backup.backup.create` -- `backup.backup.delete` -- `backup.backup.download` -- `backup.backup.get` -- `backup.backup.list` -- `backup.backup.restore` -- `backup.backup.update` -- `backup.feature.get` -- `data.deployment.restore-backup` - -**Backup Viewer** (`backup-viewer`): -- `backup.backup.get` -- `backup.backup.list` -- `backup.feature.get` - -**Backup Policy Administrator** (`backuppolicy-admin`): -- `backup.backuppolicy.create` -- `backup.backuppolicy.delete` -- `backup.backuppolicy.get` -- `backup.backuppolicy.list` -- `backup.backuppolicy.update` -- `backup.feature.get` - -**Backup Policy Viewer** (`backuppolicy-viewer`): -- `backup.backuppolicy.get` -- `backup.backuppolicy.list` -- `backup.feature.get` - -**Billing Administrator** (`billing-admin`): -- `billing.config.get` -- `billing.config.set` -- `billing.invoice.get` -- `billing.invoice.get-preliminary` -- `billing.invoice.get-statistics` -- `billing.invoice.list` -- `billing.organization.get` -- `billing.paymentmethod.create` -- `billing.paymentmethod.delete` -- `billing.paymentmethod.get` -- `billing.paymentmethod.get-default` -- `billing.paymentmethod.list` -- `billing.paymentmethod.set-default` -- `billing.paymentmethod.update` -- `billing.paymentprovider.list` - -**Billing Viewer** (`billing-viewer`): -- `billing.config.get` -- `billing.invoice.get` -- `billing.invoice.get-preliminary` -- `billing.invoice.get-statistics` -- `billing.invoice.list` -- `billing.organization.get` -- `billing.paymentmethod.get` -- `billing.paymentmethod.get-default` -- `billing.paymentmethod.list` -- `billing.paymentprovider.list` - -**CA Certificate Administrator** (`cacertificate-admin`): -- `crypto.cacertificate.create` -- `crypto.cacertificate.delete` -- `crypto.cacertificate.get` -- `crypto.cacertificate.list` -- `crypto.cacertificate.set-default` -- `crypto.cacertificate.update` - -**CA Certificate Viewer** (`cacertificate-viewer`): -- `crypto.cacertificate.get` -- `crypto.cacertificate.list` - -**Dataloader Administrator** (`dataloader-admin`): -- `dataloader.deployment.import` - -**Deployment Administrator** (`deployment-admin`): -- `data.cpusize.list` -- `data.deployment.create` -- `data.deployment.create-test-database` -- `data.deployment.delete` -- `data.deployment.get` -- `data.deployment.list` -- `data.deployment.pause` -- `data.deployment.rebalance-shards` -- `data.deployment.resume` -- `data.deployment.rotate-server` -- `data.deployment.update` -- `data.deployment.update-scheduled-root-password-rotation` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.logs.get` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Content Administrator** (`deployment-content-admin`): -- `data.cpusize.list` -- `data.deployment.create-test-database` -- `data.deployment.get` -- `data.deployment.list` -- `data.deploymentcredentials.get` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.logs.get` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Full Access User** (`deployment-full-access-user`): -- `data.deployment.full-access` - -**Deployment Read Only User** (`deployment-read-only-user`): -- `data.deployment.read-only-access` - -**Deployment Viewer** (`deployment-viewer`): -- `data.cpusize.list` -- `data.deployment.get` -- `data.deployment.list` -- `data.deploymentfeatures.get` -- `data.deploymentmodel.list` -- `data.deploymentprice.calculate` -- `data.diskperformance.list` -- `data.limits.get` -- `data.nodesize.list` -- `data.presets.list` -- `monitoring.metrics.get` -- `notification.deployment-notification.list` -- `notification.deployment-notification.mark-as-read` -- `notification.deployment-notification.mark-as-unread` - -**Deployment Profile Viewer** (`deploymentprofile-viewer`): -- `deploymentprofile.deploymentprofile.list` - -**Example Datasets Viewer** (`exampledataset-viewer`): -- `example.exampledataset.get` -- `example.exampledataset.list` - -**Example Dataset Installation Administrator** (`exampledatasetinstallation-admin`): -- `example.exampledatasetinstallation.create` -- `example.exampledatasetinstallation.delete` -- `example.exampledatasetinstallation.get` -- `example.exampledatasetinstallation.list` -- `example.exampledatasetinstallation.update` - -**Example Dataset Installation Viewer** (`exampledatasetinstallation-viewer`): -- `example.exampledatasetinstallation.get` -- `example.exampledatasetinstallation.list` - -**Group Administrator** (`group-admin`): -- `iam.group.create` -- `iam.group.delete` -- `iam.group.get` -- `iam.group.list` -- `iam.group.update` - -**Group Viewer** (`group-viewer`): -- `iam.group.get` -- `iam.group.list` - -**IAM provider Administrator** (`iamprovider-admin`): -- `security.iamprovider.create` -- `security.iamprovider.delete` -- `security.iamprovider.get` -- `security.iamprovider.list` -- `security.iamprovider.set-default` -- `security.iamprovider.update` - -**IAM provider Viewer** (`iamprovider-viewer`): -- `security.iamprovider.get` -- `security.iamprovider.list` - -**IP allowlist Administrator** (`ipwhitelist-admin`): -- `security.ipallowlist.create` -- `security.ipallowlist.delete` -- `security.ipallowlist.get` -- `security.ipallowlist.list` -- `security.ipallowlist.update` - -**IP allowlist Viewer** (`ipwhitelist-viewer`): -- `security.ipallowlist.get` -- `security.ipallowlist.list` - -**Metrics Administrator** (`metrics-admin`): -- `metrics.endpoint.get` -- `metrics.token.create` -- `metrics.token.delete` -- `metrics.token.get` -- `metrics.token.list` -- `metrics.token.revoke` -- `metrics.token.update` - -**Migration Administrator** (`migration-admin`): -- `replication.deploymentmigration.create` -- `replication.deploymentmigration.delete` -- `replication.deploymentmigration.get` - -**MLServices Admin** (`mlservices-admin`): -- `ml.mlservices.get` - -**Notebook Administrator** (`notebook-admin`): -- `notebook.model.list` -- `notebook.notebook.create` -- `notebook.notebook.delete` -- `notebook.notebook.get` -- `notebook.notebook.list` -- `notebook.notebook.pause` -- `notebook.notebook.resume` -- `notebook.notebook.update` - -**Notebook Executor** (`notebook-executor`): -- `notebook.notebook.execute` - -**Notebook Viewer** (`notebook-viewer`): -- `notebook.model.list` -- `notebook.notebook.get` -- `notebook.notebook.list` - -**Organization Administrator** (`organization-admin`): -- `billing.organization.get` -- `resourcemanager.organization-invite.create` -- `resourcemanager.organization-invite.delete` -- `resourcemanager.organization-invite.get` -- `resourcemanager.organization-invite.list` -- `resourcemanager.organization-invite.update` -- `resourcemanager.organization.delete` -- `resourcemanager.organization.get` -- `resourcemanager.organization.update` - -**Organization Viewer** (`organization-viewer`): -- `billing.organization.get` -- `resourcemanager.organization-invite.get` -- `resourcemanager.organization-invite.list` -- `resourcemanager.organization.get` - -**Policy Administrator** (`policy-admin`): -- `iam.policy.get` -- `iam.policy.update` - -**Policy Viewer** (`policy-viewer`): -- `iam.policy.get` - -**Prepaid Deployment Viewer** (`prepaid-deployment-viewer`): -- `prepaid.prepaiddeployment.get` -- `prepaid.prepaiddeployment.list` - -**Private Endpoint Service Administrator** (`privateendpointservice-admin`): -- `network.privateendpointservice.create` -- `network.privateendpointservice.get` -- `network.privateendpointservice.get-by-deployment-id` -- `network.privateendpointservice.get-feature` -- `network.privateendpointservice.update` - -**Private Endpoint Service Viewer** (`privateendpointservice-viewer`): -- `network.privateendpointservice.get` -- `network.privateendpointservice.get-by-deployment-id` -- `network.privateendpointservice.get-feature` - -**Project Administrator** (`project-admin`): -- `resourcemanager.project.create` -- `resourcemanager.project.delete` -- `resourcemanager.project.get` -- `resourcemanager.project.list` -- `resourcemanager.project.update` - -**Project Viewer** (`project-viewer`): -- `resourcemanager.project.get` -- `resourcemanager.project.list` - -**Replication Administrator** (`replication-admin`): -- `replication.deployment.clone-from-backup` -- `replication.deploymentreplication.get` -- `replication.deploymentreplication.update` -- `replication.migration-forwarder.upgrade-connection` - -**Role Administrator** (`role-admin`): -- `iam.role.create` -- `iam.role.delete` -- `iam.role.get` -- `iam.role.list` -- `iam.role.update` - -**Role Viewer** (`role-viewer`): -- `iam.role.get` -- `iam.role.list` - -**SCIM Administrator** (`scim-admin`): -- `scim.user.add` -- `scim.user.delete` -- `scim.user.get` -- `scim.user.list` -- `scim.user.update` - -**User Administrator** (`user-admin`): -- `iam.user.get-personal-data` -- `iam.user.update` - -{{< /details >}} - -### How to create a custom role - -1. In the main navigation menu, click **Access Control**. -2. On the **Roles** tab, click **New role**. -3. Enter a name and optionally a description for the new role. -4. Select the required permissions. -5. Click **Create**. - -![ArangoGraph New Role](../../../images/arangograph-create-role.png) - -### How to view, edit or remove a custom role - -1. In the main navigation menu, click **Access Control**. -2. On the **Roles** tab, click: - - A role name or the **eye** icon in the **Actions** column to view the role. - - The **pencil** icon in the **Actions** column to edit the role. - You can also view a role and click the **Edit** button in the detail view. - - The **recycle bin** icon to delete the role. - You can also view a role and click the **Delete** button in the detail view. - -## Permissions - -Each operation done on a resource requires zero (just authentication) or more **permissions**. -A permission is a constant string such as `resourcemanager.project.create`, -following this schema: `<api>.<kind>.<verb>`. - -Permissions are solely defined by the ArangoGraph API. - -{{% comment %}} -Retrieved with the below command, with manual adjustments: -oasisctl list permissions - -Note that if the tier is "internal", there is an `internal-dashboard` API that should be excluded in below list! -{{% /comment %}} - -| API | Kind | Verbs -|:--------------------|:-----------------------------|:------------------------------------------- -| `audit` | `auditlogarchive` | `delete`, `get`, `list` -| `audit` | `auditlogattachment` | `create`, `delete`, `get` -| `audit` | `auditlogevents` | `get` -| `audit` | `auditlogevent` | `delete` -| `audit` | `auditlog` | `create`, `delete`, `get`, `list`, `set-default`, `test-https-post-destination`, `update` -| `backup` | `backuppolicy` | `create`, `delete`, `get`, `list`, `update` -| `backup` | `backup` | `copy`, `create`, `delete`, `download`, `get`, `list`, `restore`, `update` -| `backup` | `feature` | `get` -| `billing` | `config` | `get`, `set` -| `billing` | `invoice` | `get`, `get-preliminary`, `get-statistics`, `list` -| `billing` | `organization` | `get` -| `billing` | `paymentmethod` | `create`, `delete`, `get`, `get-default`, `list`, `set-default`, `update` -| `billing` | `paymentprovider` | `list` -| `crypto` | `cacertificate` | `create`, `delete`, `get`, `list`, `set-default`, `update` -| `dataloader` | `deployment` | `import` -| `data` | `cpusize` | `list` -| `data` | `deploymentcredentials` | `get` -| `data` | `deploymentfeatures` | `get` -| `data` | `deploymentmodel` | `list` -| `data` | `deploymentprice` | `calculate` -| `data` | `deployment` | `create`, `create-test-database`, `delete`, `full-access`, `get`, `list`, `pause`, `read-only-access`, `rebalance-shards`, `restore-backup`, `resume`, `rotate-server`, `update`, `update-scheduled-root-password-rotation` -| `data` | `diskperformance` | `list` -| `data` | `limits` | `get` -| `data` | `nodesize` | `list` -| `data` | `presets` | `list` -| `deploymentprofile` | `deploymentprofile` | `list` -| `example` | `exampledatasetinstallation` | `create`, `delete`, `get`, `list`, `update` -| `example` | `exampledataset` | `get`, `list` -| `iam` | `group` | `create`, `delete`, `get`, `list`, `update` -| `iam` | `policy` | `get`, `update` -| `iam` | `role` | `create`, `delete`, `get`, `list`, `update` -| `iam` | `user` | `get-personal-data`, `update` -| `metrics` | `endpoint` | `get` -| `metrics` | `token` | `create`, `delete`, `get`, `list`, `revoke`, `update` -| `ml` | `mlservices` | `get` -| `monitoring` | `logs` | `get` -| `monitoring` | `metrics` | `get` -| `network` | `privateendpointservice` | `create`, `get`, `get-by-deployment-id`, `get-feature`, `update` -| `notebook` | `model` | `list` -| `notebook` | `notebook` | `create`, `delete`, `execute`, `get`, `list`, `pause`, `resume`, `update` -| `notification` | `deployment-notification` | `list`, `mark-as-read`, `mark-as-unread` -| `prepaid` | `prepaiddeployment` | `get`, `list` -| `replication` | `deploymentmigration` | `create`, `delete`, `get` -| `replication` | `deploymentreplication` | `get`, `update` -| `replication` | `deployment` | `clone-from-backup` -| `replication` | `migration-forwarder` | `upgrade-connection` -| `resourcemanager` | `organization-invite` | `create`, `delete`, `get`, `list`, `update` -| `resourcemanager` | `organization` | `delete`, `get`, `update` -| `resourcemanager` | `project` | `create`, `delete`, `get`, `list`, `update` -| `scim` | `user` | `add`, `delete`, `get`, `list`, `update` -| `security` | `iamprovider` | `create`, `delete`, `get`, `list`, `set-default`, `update` -| `security` | `ipallowlist` | `create`, `delete`, `get`, `list`, `update` - -### Permission inheritance - -Each resource (organization, project, deployment) has its own policy, but this does not mean that you have to -repeat role bindings in all these policies. - -Once you assign a role to a user (or group of users) in a policy at one level, -all the permissions of this role are inherited in lower levels - -permissions are inherited downwards from an organization to its projects and -from a project to its deployments. - -For more general permissions, which you want to be propagated to other levels, -add a role for a user/group at the organization level. -For example, if you bind the `deployment-viewer` role to user `John` in the -organization policy, `John` will have the role permissions in all projects of -that organization and all deployments of the projects. - -For more restrictive permissions, which you don't necessarily want to be -propagated to other levels, add a role at the project or even deployment level. -For example, if you bind the `deployment-viewer` role to user `John` -in a project, `John` will have the role permissions in -this project as well as in all the deployments of it, but not -in other projects of the parent organization. - -**Inheritance example** - -- Let's assume you have a group called "Deployers" which includes users who deal with deployments. -- Then you create a role "Deployment Viewer", containing - `data.deployment.get` and `data.deployment.list` permissions. -- You can now add a role binding of the "Deployers" group to the "Deployment Viewer" role. -- If you add the binding to an organization policy, members of this group - will be granted the defined permissions for the organization, all its projects and all its deployments. -- If you add the role binding to a policy of project ABC, members of this group will be granted - the defined permissions for project ABC only and its deployments, but not for - other projects and their deployments. -- If you add the role binding to a policy of deployment X, members of this - group will be granted the defined permissions for deployment X only, and not - any other deployment of the parent project or any other project of the organization. - -The "Deployment Viewer" role is effective for the following entities depending -on which policy the binding is added to: - -Role binding added to →<br>Role effective on ↓ | Organization policy | Project ABC's policy | Deployment X's policy of project ABC | -|:---:|:---:|:---:|:---:| -Organization, its projects and deployments | ✓ | — | — -Project ABC and its deployments | ✓ | ✓ | — -Project DEF and its deployments | ✓ | — | — -Deployment X of project ABC | ✓ | ✓ | ✓ -Deployment Y of project ABC | ✓ | ✓ | — -Deployment Z of project DEF | ✓ | — | — - -## Restricting access to organizations - -To enhance security, you can implement the following restrictions via [Oasisctl](../oasisctl/_index.md): - -1. Limit allowed authentication providers. -2. Specify an allowed domain list. - -{{< info >}} -Note that users who do not meet the restrictions will not be granted permissions for any resource in -the organization. These users can still be members of the organization. -{{< /info >}} - -Using the first option, you can limit which **authentication providers** are -accepted for users trying to access an organization in ArangoGraph. -The following commands are available to configure this option: - -- `oasisctl get organization authentication providers` - allows you to see which - authentication providers are enabled for accessing a specific organization -- `oasisctl update organization authentication providers` - allows you to update - a list of authentication providers for an organization to which the - authenticated user has access - - `--enable-github` - if set, allow access from user accounts authenticated via Github - - `--enable-google` - if set, allow access from user accounts authenticated via Google - - `--enable-microsoft` - if set, allow access from user accounts authenticated via Microsoft - - `--enable-username-password` - if set, allow access from user accounts - authenticated via a username/password - -Using the second option, you can configure a **list of domains**, and only users -with email addresses from the specified domains will be able to access an -organization. The following commands are available to configure this option: - -- `oasisctl get organization email domain restrictions -o <your_organization_id>` - - allows you to see which domains are in the allowed list for a specific organization -- `oasisctl update organization email domain restrictions -o <your_organization_id> --allowed-domain=<domain_name1> --allowed-domain=<domain_name2>` - - allows you to update a list of the allowed domains for a specific organization -- `oasisctl update organization email domain restrictions -o <your_organization_id> --allowed-domain=` - - allows you to reset a list and accept any domains for accessing a specific organization - -## Using an audit log - -{{< info >}} -To enable the audit log feature, get in touch with the ArangoGraph team via **Request Help**, available in the left sidebar menu of the ArangoGraph Dashboard. -{{< /info >}} - -To have a better overview of the events happening in your ArangoGraph organization, -you can set up an audit log, which will track and log auditing information for you. -The audit log is created on the organization level, then you can use the log for -projects belonging to that organization. - -***To create an audit log*** - -1. In the main navigation menu, click **Access Control** in the **Organization** section. -2. Open the **Audit logs** tab and click the **New audit log** button. -3. In the dialog, fill out the following settings: - - - **Name** - enter a name for your audit log. - - **Description** - enter an optional description for your audit log. - - **Destinations** - specify one or several destinations to which you want to - upload the audit log. If you choose **Upload to cloud**, the log will be - available on the **Audit logs** tab of your organization. To send the log - entries to your custom destination, specify a destination URL with - authentication parameters (the **HTTP destination** option). - - {{< info >}} - The **Upload to cloud** option is not available for the free-to-try tier. - {{< /info >}} - - - **Excluded topics** - select topics that will not be included in the log. - Please note, that some are excluded by default (for example, `audit-document`). - - {{< warning >}} - Enabling the audit log for all events will have a negative impact on performance. - {{< /warning >}} - - - **Confirmation** - confirm that logging auditing events increases the price of your deployments. - - ![ArangoGraph audit log](../../../images/arangograph-audit-log.png) - -4. Click **Create** to add the audit log. You can now use it in the projects - belonging to your organization. diff --git a/site/content/3.13/arangograph/security-and-access-control/single-sign-on/_index.md b/site/content/3.13/arangograph/security-and-access-control/single-sign-on/_index.md deleted file mode 100644 index 1004352974..0000000000 --- a/site/content/3.13/arangograph/security-and-access-control/single-sign-on/_index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Single Sign-On (SSO) in ArangoGraph -menuTitle: Single Sign-On -weight: 10 -description: >- - ArangoGraph supports **Single Sign-On** (SSO) authentication using - **Security Assertion Markup language 2.0** (SAML 2.0) ---- -{{< info >}} -To enable the Single Sign-On (SSO) feature, get in touch with the ArangoGraph -team via **Request Help**, available in the left sidebar menu of the -ArangoGraph Dashboard. -{{< /info >}} - -## About SAML 2.0 - -The Security Assertion Markup language 2.0 (SAML 2.0) is an open standard created -to provide cross-domain single sign-on (SSO). It allows you to authenticate in -multiple web applications by using a single set of login credentials. - -SAML SSO works by transferring user authentication data from the identity -provider (IdP) to the service provider (SP) through an exchange of digitally -signed XML documents. - -## IdP-initiated versus SP-initiated SSO - -There are generally two methods for starting Single Sign-On: - -- **Identity Provider Initiated** (IdP-initiated): - You log into the Identity Provider and are then redirected to ArangoGraph. -- **Service Provider Initiated** (SP-initiated): - You access the ArangoGraph site which then redirects you to the - Identity Provider for authentication. - -**ArangoGraph only supports SP-initiated SSO** because IdP-Initiated SSO is -vulnerable to Man-in-the-Middle attacks. In order to initiate the SSO login -process, you must start at ArangoGraph. - -## Configure SAML 2.0 using Okta - -You can enable SSO for your ArangoGraph organization using Okta as an Identity -Provider (IdP). For more information about Okta, please refer to the -[Okta Documentation](https://help.okta.com/en-us/Content/index.htm?cshid=csh-index). - -### Create the SAML app integration in Okta - -1. Sign in to your Okta account and select **Applications** from the left sidebar menu. -2. Click **Create App Integration**. -3. In the **Create a new app integration** dialog, select **SAML 2.0**. - - ![ArangoGraph Create Okta App Integration](../../../../images/arangograph-okta-create-integration.png) -4. In the **General Settings**, specify a name for your integration and click **Next**. - - ![ArangoGraph Okta Integration Name](../../../../images/arangograph-okta-integration-name.png) -5. Configure the SAML settings: - - For **Single sign-on URL**, use `https://auth.arangodb.com/login/callback?connection=ORG_ID` - - For **Audience URI (SP Entity ID)**, use `urn:auth0:arangodb:ORG_ID` - - ![ArangoGraph Okta SAML General Settings](../../../../images/arangograph-okta-saml-general-settings.png) - -6. Replace **ORG_ID** with your organization identifier from the - ArangoGraph Dashboard. To find your organization ID, go to the **User Toolbar** - in the top right corner, which is accessible from every view of the Dashboard, - and click **My organizations**. - - If, for example, your organization ID is 14587062, here are the values you - would use when configuring the SAML settings: - - `https://auth.arangodb.com/login/callback?connection=14587062` - - `urn:auth0:arangodb:14587062` - - ![ArangoGraph Organization ID](../../../../images/arangograph-organization-id.png) -7. In the **Attribute Statements** section, add custom attributes as seen in the image below: - - email: `user.email` - - given_name: `user.firstName` - - family_name: `user.lastName` - - picture: `user.profileUrl` - - This step consists of a mapping between the ArangoGraph attribute names and - Okta attribute names. The values of these attributes are automatically filled - in based on the users list that is defined in Okta. - - ![ArangoGraph Okta SAML Attributes](../../../../images/arangograph-okta-saml-attributes.png) -8. Click **Next**. -9. In the **Configure feedback** section, select **I'm an Okta customer adding an internal app**. -10. Click **Finish**. The SAML app integration is now created. - -### SAML Setup - -After creating the app integration, you must perform the SAML setup to finalize -the SSO configuration. - -1. Go to the **SAML Signing Certificates** section, displayed under the **Sign On** tab. -2. Click **View SAML setup instructions**. - - ![ArangoGraph Okta SAML Setup](../../../../images/arangograph-okta-saml-setup.png) -3. The setup instructions include the following items: - - **Identity Provider Single Sign-On URL** - - **Identity Provider Issuer** - - **X.509 Certificate** -4. Copy the IdP settings, download the certificate using the - **Download X.509 certificate** button, and share them with the ArangoGraph - team via an ArangoGraph Support Ticket in order to complete the SSO - configuration. - diff --git a/site/content/3.13/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md b/site/content/3.13/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md deleted file mode 100644 index 8cf40b8009..0000000000 --- a/site/content/3.13/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: SCIM Provisioning -menuTitle: SCIM Provisioning -weight: 5 -description: >- - How to enable SCIM provisioning with Okta for your ArangoGraph project ---- -ArangoGraph provides support to control and manage members access in -ArangoGraph organizations with the -**System for Cross-domain Identity Management** (SCIM) provisioning. -This enables you to propagate to ArangoGraph any user access changes by using -the dedicated API. - -{{< info >}} -To enable the SCIM feature, get in touch with the ArangoGraph team via -**Request Help**, available in the left sidebar menu of the ArangoGraph Dashboard. -{{< /info >}} - -## About SCIM - -[SCIM](https://www.rfc-editor.org/rfc/rfc7644), or the System -for Cross-domain Identity Management [specification](http://www.simplecloud.info/), -is an open standard designed to manage user identity information. -SCIM provides a defined schema for representing users, and a RESTful -API to run CRUD operations on these user resources. - -The SCIM specification expects the following operations so that the SSO system -can sync the information about user resources in real time: - -- `GET /Users` - List all users. -- `GET /Users/:user_id` - Get details for a given user ID. -- `POST /Users` - Invite a new user to ArangoGraph. -- `PUT /Users/:user_id` - Update a given user ID. -- `DELETE /Users/:user_id` - Delete a specified user ID. - -ArangoGraph organization administrators can generate an API key for a specific organization. -The API token consists of a key and a secret. Using this key and secret as the -Basic Authentication Header (Basic Auth) in SCIM provisioning, you can access the APIs and -manage the user resources. - -To learn how to generate a new API key in the ArangoGraph Dashboard, see the -[API Keys](../../my-account.md#api-keys) section. - -{{< info >}} -When creating an API key, it is required to select an organization from the -list. -{{< /info >}} - -## Enable SCIM provisioning in Okta - -To enable SCIM provisioning, you first need to create an SSO integration that -supports the SCIM provisioning feature. - -1. To enable SCIM provisioning for your integration, go to the **General** tab. -2. In the **App Settings** section, select **Enable SCIM provisioning**. -3. Navigate to the **Provisioning** tab. The SCIM connection settings are - displayed under **Settings > Integration**. -4. Fill in the following fields: - - For **SCIM connector base URL**, use `https://dashboard.arangodb.cloud/api/scim/v1` - - For **Unique identifier field for users**, use `userName` -5. For **Supported provisioning actions**, enable the following: - - **Import New Users and Profile Updates** - - **Push New Users** - - **Push Profile Updates** -6. From the **Authentication Mode** menu, select the **Basic Auth** option. - To authenticate using this mode, you need to provide the username and password - for the account that handles the SCIM actions - in this case ArangoGraph. -7. Go to the ArangoGraph Dashboard and create a new API key ID and Secret. - - ![ArangoGraph Create new API key](../../../../images/arangograph-okta-api-key.png) - - Make sure to select one organization from the list and do not set any - value in the **Time to live** field. For more information, - see [How to create a new API key](../../my-account.md#how-to-create-a-new-api-key). -8. Use these authentication tokens as username and password when using the - **Basic Auth** mode and click **Save**. diff --git a/site/content/3.13/arangograph/security-and-access-control/x-509-certificates.md b/site/content/3.13/arangograph/security-and-access-control/x-509-certificates.md deleted file mode 100644 index d8d694a139..0000000000 --- a/site/content/3.13/arangograph/security-and-access-control/x-509-certificates.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: X.509 Certificates in ArangoGraph -menuTitle: X.509 Certificates -weight: 5 -description: >- - X.509 certificates in ArangoGraph are utilized for encrypted remote administration. - The communication with and between the servers of an ArangoGraph deployment is - encrypted using the TLS protocol ---- -X.509 certificates are digital certificates that are used to verify the -authenticity of a website, user, or organization using a public key infrastructure -(PKI). They are used in various applications, including SSL/TLS encryption, -which is the basis for HTTPS - the primary protocol for securing communication -and data transfer over a network. - -The X.509 certificate format is a standard defined by the -[International Telecommunication Union (ITU)](https://www.itu.int/en/Pages/default.aspx) -and contains information such as the name of the certificate holder, the public -key associated with the certificate, the certificate's issuer, and the -certificate's expiration date. An X.509 certificate can be signed by a -certificate authority (CA) or self-signed. - -ArangoGraph is using: -- **well-known X.509 certificates** created by -[Let's Encrypt](https://letsencrypt.org/) -- **self-signed X.509 certificates** created by ArangoGraph platform - -## Certificate chains - -A certificate chain, also called the chain of trust, is a hierarchical structure -that links together a series of digital certificates. The trust in the chain is -established by verifying the identity of the issuer of each certificate in the -chain. The root of the chain is a trusted third-party, such as a certificate -authority (CA). The CA issues a certificate to an organization, which in turn -can issue certificates to servers and other entities. - -For example, when you visit a website with an SSL/TLS certificate, the browser -checks the chain of trust to verify the authenticity of the digital certificate. -The browser checks to see if the root certificate is trusted, and if it is, it -trusts the chain of certificates that lead to the end-entity certificate. -If any of the certificates in the chain are invalid, expired, or revoked, the -browser does not trust the digital certificate. - -## X.509 certificates in ArangoGraph - -Each ArangoGraph deployment is accessible on different port numbers: -- default port `8529`, `443` -- high port `18529` - -Each ArangoGraph Notebook is accessible on different port numbers: -- default port `8840`, `443` -- high port `18840` - -Metrics are accessible on different port numbers: -- default port `8829`, `443` -- high port `18829` - -The distinction between these port numbers is in the certificate used for the -TLS connection. - -{{< info >}} -The default ports (`8529` and `443`) always serve the well-known certificate. -The [auto login to database UI](../deployments/_index.md#auto-login-to-database-ui) -feature is only available on the `443` port and is enabled by default. -{{< /info >}} - -### Well-known X.509 certificates - -**Well-known X.509 certificates** created by -[Let's Encrypt](https://letsencrypt.org/) are used on the -default ports, `8529` and `443`. - -This type of certificate has a lifetime of 5 years and is rotated automatically. -It is recommended to use well-known certificates, as this eases access of a -deployment in your browser. - -{{< info >}} -The well-known certificate is a wildcard certificate and cannot contain -Subject Alternative Names (SANs). To include a SAN field, please use the -self-signed certificate option. -{{< /info >}} - -### Self-signed X.509 certificates - -**Self-signed X.509 certificates** are used on the high ports, i.e. `18529`. -This type of certificate has a lifetime of 1 year, and it is created by the -ArangoGraph platform. It is also rotated automatically before the expiration -date. - -{{< info >}} -Unless you switch off the **Use well-known certificate** option in the -certificate generation, both the default and high port serve the same -self-signed certificate. -{{< /info >}} - -### Subject Alternative Name (SAN) - -The Subject Alternative Name (SAN) is an extension to the X.509 specification -that allows you to specify additional host names for a single SSL certificate. - -When using [private endpoints](../deployments/private-endpoints.md), -you can specify custom domain names. Note that these are added **only** to -the self-signed certificate as Subject Alternative Name (SAN). - -## How to create a new certificate - -1. Click a project name in the **Projects** section of the main navigation. -2. Click **Security**. -3. In the **Certificates** section, click: - - The **New certificate** button to create a new certificate. - - A name or the **eye** icon in the **Actions** column to view a certificate. - The dialog that opens provides commands for installing and uninstalling - the certificate through a console. - - The **pencil** icon to edit a certificate. - You can also view a certificate and click the **Edit** button. - - The **tag** icon to make the certificate the new default. - - The **recycle bin** icon to delete a certificate. - -![ArangoGraph Create New Certificate](../../../images/arangograph-new-certificate.png) - -## How to install a certificate - -Certificates that have the **Use well-known certificate** option enabled do -not need any installation and are supported by almost all web browsers -automatically. - -When creating a self-signed certificate that has the **Use well-known certificate** -option disabled, the certificate needs to be installed on your local machine as -well. This operation varies between operating systems. To install a self-signed -certificate on your local machine, open the certificate and follow the -installation instructions. - -![ArangoGraph Certificates](../../../images/arangograph-cert-page-with-cert-present.png) - -![ArangoGraph Certificate Install Instructions](../../../images/arangograph-cert-install-instructions.png) - -You can also extract the information from all certificates in the chain using the -`openssl` tool. - -- For **well-known certificates**, run the following command: - ``` - openssl s_client -showcerts -servername <123456abcdef>.arangodb.cloud -connect <123456abcdef>.arangodb.cloud:8529 </dev/null - ``` - -- For **self-signed certificates**, run the following command: - ``` - openssl s_client -showcerts -servername <123456abcdef>.arangodb.cloud -connect <123456abcdef>.arangodb.cloud:18529 </dev/null - ``` - -Note that `<123456abcdef>` is a placeholder that needs to be replaced with the -unique ID that is part of your ArangoGraph deployment endpoint URL. - -## How to connect to your application - -[ArangoDB drivers](../../develop/drivers/_index.md), also called connectors, allow you to -easily connect ArangoGraph deployments to your application. - -1. Navigate to **Deployments** and click the **View** button to show the - deployment page. -2. In the **Quick start** section, click the **Connecting drivers** button. -3. Select your programming language, i.e. Go, Java, Python, etc. -4. Follow the examples to connect a driver to your deployment. They include - code examples on how to use certificates in your application. - -![ArangoGraph Connecting Drivers](../../../images/arangograph-connecting-drivers.png) - -## Certificate Rotation - -Every certificate has a self-signed root certificate that is going to expire. -When certificates that are used in existing deployments are about to expire, -an automatic rotation of the certificates is triggered. This means that the -certificate is cloned (all existing settings are copied over to a new certificate) -and all affected deployments then start using the cloned certificate. - -Based on the type of certificate used, you may also need to install the new -certificate on your local machine. For example, self-signed certificates require -installation. To prevent any downtime, it is recommended to manually create a -new certificate and apply the required changes prior to the expiration date. diff --git a/site/content/3.13/data-science/graphrag/_index.md b/site/content/3.13/data-science/graphrag/_index.md deleted file mode 100644 index a58b76c7e3..0000000000 --- a/site/content/3.13/data-science/graphrag/_index.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: GraphRAG -menuTitle: GraphRAG -weight: 10 -description: >- - ArangoDB's GraphRAG solution combines graph-based retrieval-augmented generation - with Large Language Models (LLMs) for turbocharged GenAI solutions -aliases: - llm-knowledge-graphs ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Introduction - -Large language models (LLMs) and knowledge graphs are two prominent and -contrasting concepts, each possessing unique characteristics and functionalities -that significantly impact the methods we employ to extract valuable insights from -constantly expanding and complex datasets. - -LLMs, such as those powering OpenAI's ChatGPT, represent a class of powerful language -transformers. These models leverage advanced neural networks to exhibit a -remarkable proficiency in understanding, generating, and participating in -contextually-aware conversations. - -On the other hand, knowledge graphs contain carefully structured data and are -designed to capture intricate relationships among discrete and seemingly -unrelated information. - -ArangoDB's unique capabilities and flexible integration of knowledge graphs and -LLMs provide a powerful and efficient solution for anyone seeking to extract -valuable insights from diverse datasets. - -The GraphRAG component of the GenAI Suite brings all the capabilities -together with an easy-to-use interface, so you can make the knowledge accessible -to your organization. - -GraphRAG is particularly valuable for use cases like the following: -- Applications requiring in-depth knowledge retrieval -- Contextual question answering -- Reasoning over interconnected information - -## How GraphRAG works - -ArangoDB's GraphRAG solution democratizes the creation and usage of knowledge -graphs with a unique combination of vector search, graphs, and LLMs (privately or publicly hosted) -in a single product. - -The overall workflow involves the following steps: -1. **Chunking**: - - Breaking down raw documents into text chunks -2. **Entity and relation extraction for Knowledge Graph construction**: - - LLM-assisted description of entities and relations - - Entities get inserted as nodes with embeddings - - Relations get inserted as edges, these include: entity-entity, entity-chunk, chunk-document -3. **Topology-based clustering into mini-topics (called communities)**: - - Each entity points to its community - - Each community points to its higher-level community, if available - (mini-topics point to major topics) -4. **LLM-assisted community summarization**: - - Community summarization is based on all information available about each topic - -### Turn text files into a Knowledge Graph - -The Importer service is the entry point of the GraphRAG pipeline. It takes a -raw text file as input, processes it using an LLM to extract entities and -relationships, and generates a Knowledge Graph. The Knowledge Graph is then -stored in an ArangoDB database for further use. The Knowledge Graph represents -information in a structured graph format, allowing efficient querying and retrieval. - -1. Pre-process the raw text file to identify entities and their relationships. -2. Use LLMs to infer connections and context, enriching the Knowledge Graph. -3. Store the generated Knowledge Graph in the database for retrieval and reasoning. - -For detailed information about the service, see the -[Importer](services/importer.md) service documentation. - -### Extract information from the Knowledge Graph - -The Retriever service enables intelligent search and retrieval of information -from your previously created Knowledge Graph. -You can extract information from Knowledge Graphs using two distinct methods: -- Global retrieval -- Local retrieval - -For detailed information about the service, see the -[Retriever](services/retriever.md) service documentation. - -#### Global retrieval - -Global retrieval focuses on: -- Extracting information from the entire Knowledge Graph, regardless of specific - contexts or constraints. -- Provides a comprehensive overview and answers queries that span across multiple - entities and relationships in the graph. - -**Use cases:** -- Answering broad questions that require a holistic understanding of the Knowledge Graph. -- Aggregating information from diverse parts of the Knowledge Graph for high-level insights. - -**Example query:** - -Global retrieval can answer questions like _**What are the main themes or topics covered in the document**_? - -During import, the entire Knowledge Graph is analyzed to identify and summarize -the dominant entities, their relationships, and associated themes. Global -retrieval uses these community summaries to answer questions from different -perspectives, then the information gets aggregated into the final response. - -#### Local retrieval - -Local retrieval is a more focused approach for: -- Queries that are constrained to specific subgraphs or contextual clusters - within the Knowledge Graph. -- Targeted and precise information extraction, often using localized sections - of the Knowledge Graph. - -**Use cases:** -- Answering detailed questions about a specific entity or a related group of entities. -- Retrieving information relevant to a particular topic or section in the Knowledge Graph. - -**Example query:** - -Local retrieval can answer questions like _**What is the relationship between entity X and entity Y**_? - -Local queries use hybrid search (semantic and lexical) over the Entities -collection, and then it expands that subgraph over related entities, relations -(and its LLM-generated verbal descriptions), text chunks, and communities. - -### Private LLMs - -If you're working in an air-gapped environment or need to keep your data -private, you can use the private LLM mode with -[Triton Inference Server](services/triton-inference-server.md). - -This option allows you to run the service completely within your own -infrastructure. The Triton Inference Server is a crucial component when -running in private LLM mode. It serves as the backbone for running your -language (LLM) and embedding models on your own machines, ensuring your -data never leaves your infrastructure. The server handles all the complex -model operations, from processing text to generating embeddings, and provides -both HTTP and gRPC interfaces for communication. - -### Public LLMs - -Alternatively, if you prefer a simpler setup and don't have specific privacy -requirements, you can use the public LLM mode. This option connects to cloud-based -services like OpenAI's models via the OpenAI API or a large array of models -(Gemini, Anthropic, publicly hosted open-source models, etc.) via the OpenRouter option. - -## Limitations - -The pre-release version of ArangoDB GraphRAG has the following limitations: - -- You can only import a single file. -- The knowledge graph generated from the file is imported into a named graph - with a fixed name of `KnowledgeGraph` and set of collections which also have - fixed names. diff --git a/site/content/3.13/graphs/graph-visualizer.md b/site/content/3.13/graphs/graph-visualizer.md deleted file mode 100644 index 388bbf2a99..0000000000 --- a/site/content/3.13/graphs/graph-visualizer.md +++ /dev/null @@ -1,299 +0,0 @@ ---- -title: Graph Visualizer -menuTitle: Graph Visualizer -weight: 102 -description: >- - Visually explore and interact with your ArangoDB graphs through an intuitive interface ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -The **Graph Visualizer** is a browser-based tool integrated into the web interface -of the ArangoDB Platform. It lets you explore the connections of your named graphs -to visually understand the structure as well as to inspect and edit the attributes -of individual nodes and edges. It also offers query capabilities and you can -create new nodes (vertices) and edges (relations). - -![A screenshot of the Graph Visualizer user interface showing some persons and movies as circles with arrows indicting who acted in or directed a movie](../../images/graph-visualizer.png) - -{{< info >}} -Graph creation is **not** performed within the Graph Visualizer. Graphs must be -created in the **Management** section under **Graphs** of the second-level -navigation in the [web interface](../components/web-interface/graphs.md). Once -created, you can select a graph from the list for exploration and visualization. -{{< /info >}} - -You can use the Graph Visualizer to do the following: - -- Filter and view specific nodes to focus on a subset of your graph. -- Dynamically expand nodes to show more of their neighborhood to see how - entities are connected. -- Inspect the properties of nodes and edges. -- Modify existing or create new nodes and edges. -- Rearrange nodes automatically or manually for better visual clarity. -- Use zoom and pan to explore large graphs more easily. - -## View a graph - -The core function of the Graph Visualizer is to provide an intuitive canvas for -exploring graph structures. You can visualize any type of **named graph** -(General Graphs, SmartGraphs, EnterpriseGraphs, SatelliteGraphs). - -{{< warning >}} -Anonymous graphs using adhoc sets of document and edge collections are not -supported by the Graph Visualizer. -{{< /warning >}} - -### Select and load a graph - -1. In the ArangoDB Platform web interface, select the database your named graph - is stored in. -2. Click **Graphs** in the main navigation. -3. Select a graph from the list. -4. The viewport of the Graph Visualizer opens for exploring the graph. - -The main area of the viewport may initially be empty in the following cases: - -- You opened a graph for the first time and nothing is selected for displaying yet -- You used the **Clear Canvas** option -<!-- TODO: Doesn't it preserve the last state? Can it be lost? -- Reopening the Graph Visualizer after a previous session ---> - -You can [Add nodes to the canvas manually](#add-nodes-to-the-canvas-manually) -as well as [Add nodes and edges using a query](#add-nodes-and-edges-using-a-query). -Afterwards, you can also [Add nodes and edges using a query based on a selection](#add-nodes-and-edges-using-a-query-based-on-a-selection) -as well as [Remove nodes from the canvas](#remove-nodes-from-the-canvas). - -### The viewport - -The Graph Visualizer interface is comprised of the following components: - -- **Canvas**: The main area of the viewport. -- **Search & add nodes to canvas** and **Queries**: - A widget in the top left corner that opens dialogs for selecting nodes and - edges to display (manually or using queries). -- [**Customization**](#visual-customization): - A sidebar on the right-hand side to adjust the styling. -- [**Layout and Navigation**](#layouts-and-navigation-tools): - A minimap and multiple tools for the canvas in the bottom right corner. - -### Add nodes to the canvas manually - -You can add individual nodes to the canvas in addition to what is already -displayed. - -1. Click **Search & add nodes to canvas**. -2. Select a **Node type**. This is the name of the collection that stores the - node you want to select. -3. Enter a value into the **Search** field. This searches common attributes - as indicated by the placeholder text and finds up to 10 nodes that contain - this text in one of these attributes (case-insensitive). -4. Select one or more nodes from the list on the left-hand side. -5. Optional: You can check the attributes of the selected nodes on the - right-hand side. Use the buttons at the bottom to switch between nodes. -6. Click **Add _n_ vertices**. -7. To see the neighbor nodes and the edges that connect them, right-click a node, - click **Expand (_n_)** and then **All (_n_)**. - -![A screenshot of the dialog for adding nodes with two persons selected](../../images/graph-visualizer-add-nodes.png) - -### Add nodes and edges using a query - -You can run an AQL query to add a nodes, edges, or paths of the graph to the canvas. - -1. Click **Queries** of the top-left widget. -2. Click **New query**. -3. Enter an AQL query that returns nodes, edges, or paths - (e.g. a graph traversal query), for example: - ```aql - FOR node IN coll LIMIT 10 RETURN node // [ { "_id": "..." }, ... ] - ``` - ```aql - FOR edge IN edgeColl FILTER edge.value > 10 RETURN edge // [ { "_from": "...", "_to": "...", "_id": "..." }, ... ] - ``` - ```aql - FOR v, e, p IN 1..3 ANY "coll/753" GRAPH "myGraph" RETURN p // [ { "vertices": [...], "edges": [...] }, ... ] - ``` -4. Click **Run query**. Depending on what the query returns, either only nodes - or edges with their nodes appear on the canvas, in addition to what is - already displayed. - -{{< tip >}} -You can save queries for future use: - -1. Click **Queries** of the top-left widget. -2. Click **New query**. -3. Enter or edit the AQL query you want to save. You can optionally use - bind variables to parameterize saved queries. -4. Enter a name and optionally a description, then click **Save**. -5. To run a saved query, click **Queries** of the top-left widget. -6. Select a query from the list. The following actions are available for each query: - - **Bind Variables** to set for the query. - - **Run** the query. - - **Copy** the query string to the clipboard. - - **Delete** a no longer needed query. -{{< /tip >}} - -![A screenshot of the dialog with a query expanded and a bind variable filled in](../../images/graph-visualizer-queries.png) - -### Add nodes and edges using a query based on a selection - -You can select nodes and edges on the canvas and then use a **Canvas Action**. -This runs an AQL query to add nodes, edges, or paths of the graph to the canvas. -The query has access to the current selection via special bind variables. - -1. Create a selection. You have different options: - - Click a node or edge to select only this element. - - Hold the {{< kbd "Shift" >}} or {{< kbd "Ctrl" >}} key and click multiple nodes and edges. - - Hold the {{< kbd "Shift" >}} or {{< kbd "Ctrl" >}} key and drag the mouse to perform a box selection. -2. Right-click the canvas, click **Canvas Action**, and select a saved action. -3. Depending on the query, additional nodes or edges with their nodes are added - to the canvas. -4. To create a custom Canvas Action query, click **Queries** of the top-left widget. -5. Click **Canvas Actions**, then **New action**. -6. Enter an AQL query that makes use of the special bind variable `@nodes`, - `@edges`, or both and returns nodes, edges, or paths. Examples: - ```aql - FOR selectedNode IN @nodes - FOR v, e, p IN 1..3 ANY selectedNode GRAPH "myGraph" - FILTER p.edges[*].value ALL < 7 - LIMIT 20 - RETURN p - ``` -7. Enter a name and optionally a description for the action and click **Save**. - -![A screenshot of the context menu for a node showing the available Canvas Actions](../../images/graph-visualizer-menu-canvas-action.png) - -### Remove nodes from the canvas - -You can dismiss nodes to show less nodes and edges on the canvas to focus on the -relevant parts of the graph at a given time. This only changes what is displayed -on the canvas. It doesn't delete the underlying documents and you can add the -dismissed nodes and their edges back to the canvas later on. - -1. Decide which nodes you want to either dismiss or keep. You can select nodes - in different ways: - - Right-click a single node to select only this node. - - Hold the {{< kbd "Shift" >}} or {{< kbd "Ctrl" >}} key and click multiple nodes or drag the - mouse to perform a box selection, then right-click one of the selected nodes. -2. In the context menu, click **Dismiss _n_ nodes** to hide the selected nodes, - or click **Dismiss other nodes** to only keep the selection. -3. The canvas updates to only display the remaining nodes, with no dangling edges. - -### View node and edge properties - -You can inspect the document attributes of node or edge as follows: - -- Double-click a node or edge to open a dialog with the properties. -- Right-click a node to open the context menu and click **View Node** to open - the dialog with the properties. - -![A screenshot of the properties dialog with the keys and values of a node](../../images/graph-visualizer-node-properties.png) - -### Layouts and navigation tools - -These features allow you to clear, zoom, and pan the canvas, as well as rearrange -the displayed graph data for a better spatial understanding of node clusters, -hierarchies, and relationship flows. - -- **Minimap**: A small overview to easier navigate the canvas. - -- **Zoom Controls**: Zoom in/out or reset the zoom to 100%. - -- **Fit to Screen**: Resize and center the canvas so you can see everything. - -- **Re-run Layout**: Automatically rearrange the nodes using the selected algorithm. - -- **Layout Algorithms**: Choose between different ways of arranging the nodes. - Which algorithm to use depends on the situation and the graph topology. - -## Edit graph data - -While the Graph Visualizer is primarily designed for exploring graph data, you -can also create and modify nodes and edges directly from the canvas. - -You need to have write access for the database and the collections for this. - -### Create new nodes - -You can add nodes to the graph's document collections directly from the -canvas. This allows you to create additional entities to the graph. - -1. In the **Graphs** section of the ArangoDB web interface, select your graph. -2. Right-click on the canvas and choose **Create Node**. -3. A dialog opens with the following options: - - Select the target collection (**Node Type**). - - Optionally specify a unique identifier (**Node ID**). -4. Click **Create** to add the node to the canvas and database. - -### Create New Edges - -You can add edges to the graph's edge collections directly from the canvas. -This allows you to create additional connections between nodes. - -1. In the **Graphs** section of the ArangoDB web interface, select your graph. -2. Right-click on the canvas and choose **Create Edge**. -3. In the dialog: - - Select the target collection (**Edge Type**, which corresponds to an edge collection). - - Set the `_from` and `_to` fields by selecting the source and target nodes. - - Optionally specify a unique identifier (**Edge ID**). -4. Click **Create** to add the edge to the canvas and database. - -{{< info >}} -If you select two nodes before right-clicking to open the edge creation -dialog, the `_from` and `_to` fields are automatically pre-filled. -You may need to swap the IDs as the order is not based on your selection sequence. -{{< /info >}} - -![A screenshot of the dialog for creating an edge with the From and To fields filled in](../../images/graph-visualizer-create-edge.png) - -### Edit node and edge properties - -You can modify the document attributes of nodes and edges from the canvas as follows: - -1. Double-click a node or edge. -2. In the properties dialog that opens, click **Edit**. -3. Change the properties and click **Save**. <!-- TODO: Can't change system attributes, even though _from and _to are generally mutable --> - -### Delete nodes - -You can delete individual nodes which deletes the corresponding document. - -1. Right-click a node to open the context menu. -2. Click **Delete Node**. -3. Any edges connected to this node are deleted by default to ensure graph - consistency. To keep the edges, untick **Delete connected edge(s)**. -4. Confirm the deletion by clicking **Delete**. - -### Delete edges - -1. Right-click an edge to open the context menu. -2. Click **Delete Edge**. -3. Confirm the deletion by clicking **Delete**. - -## Visual customization - -You can adjust how the graph data is displayed, like the color, opacity, and -labels. All styling changes are visual-only and do not affect the underlying data. - -1. Optional: Reset to default styling if desired. -2. Click the _palette_ icon in the top right to open the **Customization** panel - if it's closed. -3. Adjust the styling for nodes or edges: - - Select a **Label Attribute** to display a custom top-level field - (e.g. `name` or `type`) instead of `_id`. - - Assign a specific **Color** to highlight and distinguish elements. - - Adjust how transparent elements are with the **Opacity**. - - Set the **Line Thickness** (edges only). - - Choose different **Arrowhead Styles** (edges only). -4. You can also do the following: - - Clear the styling modifications. - - See the number of nodes respectively edges on the canvas (by collection). - -![A screenshot of the Customization panel with a popover dialog for edge styling open](../../images/graph-visualizer-customization.png) diff --git a/site/content/3.11/arangograph/_index.md b/site/content/amp/_index.md similarity index 79% rename from site/content/3.11/arangograph/_index.md rename to site/content/amp/_index.md index 0e07d4c600..e43ab5ae79 100644 --- a/site/content/3.11/arangograph/_index.md +++ b/site/content/amp/_index.md @@ -1,19 +1,19 @@ --- -title: ArangoGraph Insights Platform -menuTitle: ArangoGraph -weight: 65 +title: Arango Managed Platform (AMP) +menuTitle: Managed Platform +weight: 4 description: >- - The ArangoGraph Insights Platform provides the entire functionality of + The Arango Managed Platform (AMP) provides the entire functionality of ArangoDB as a service, without the need to run or manage databases yourself aliases: - arangograph/changelog --- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +The [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), formerly called Oasis, provides ArangoDB databases as a Service (DBaaS). It enables you to use the entire functionality of an ArangoDB cluster deployment without the need to run or manage the system yourself. -The ArangoGraph Insights Platform... +The Arango Managed Platform (AMP)... - runs your databases in data centers of the cloud provider of your choice: Google Cloud Platform (GCP) or Amazon Web Services (AWS). @@ -35,4 +35,4 @@ For more information see [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) For quick start guide, see -[Use ArangoDB in the Cloud](../get-started/set-up-a-cloud-instance.md). +[Use ArangoDB in the Cloud](../arangodb/3.12/get-started/set-up-a-cloud-instance.md). diff --git a/site/content/3.11/arangograph/api/_index.md b/site/content/amp/api/_index.md similarity index 65% rename from site/content/3.11/arangograph/api/_index.md rename to site/content/amp/api/_index.md index ee4f21371f..dd3aa14ea9 100644 --- a/site/content/3.11/arangograph/api/_index.md +++ b/site/content/amp/api/_index.md @@ -1,18 +1,19 @@ --- -title: The ArangoGraph API -menuTitle: ArangoGraph API +title: The Arango Managed Platform (AMP) API +menuTitle: AMP API weight: 60 description: >- - Interface to control all resources inside ArangoGraph in a scriptable manner + The interface to control all resources inside the Arango Managed Platform in + a scriptable manner aliases: - arangograph-api --- -The [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +The [Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), comes with its own API. This API enables you to control all -resources inside ArangoGraph in a scriptable manner. Typical use cases are spinning -up ArangoGraph deployments during continuous integration and infrastructure as code. +resources inside AMP in a scriptable manner. Typical use cases are spinning +up AMP deployments during continuous integration and infrastructure as code. -The ArangoGraph API… +The AMP API… - is a well-specified API that uses [Protocol Buffers](https://developers.google.com/protocol-buffers/) @@ -29,7 +30,7 @@ The ArangoGraph API… - is also available as a [Terraform plugin](https://github.com/arangodb-managed/terraform-provider-oasis/). - This plugin makes integration of ArangoGraph in infrastructure as code projects + This plugin makes integration of AMP in infrastructure as code projects very simple. To learn more, refer to the [plugin documentation](https://registry.terraform.io/providers/arangodb-managed/oasis/latest/docs). Also see: diff --git a/site/content/3.13/arangograph/api/get-started.md b/site/content/amp/api/get-started.md similarity index 93% rename from site/content/3.13/arangograph/api/get-started.md rename to site/content/amp/api/get-started.md index b4ea00e39d..d228d5020b 100644 --- a/site/content/3.13/arangograph/api/get-started.md +++ b/site/content/amp/api/get-started.md @@ -40,7 +40,7 @@ key you will need to be signed into your account at [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). Once you are signed in, hover over the profile icon in the top right corner. -![Profile Icon](../../../images/arangograph-my-account-hover.png) +![Profile Icon](../../images/arangograph-my-account-hover.png) Click _My API keys_. @@ -49,7 +49,7 @@ create, reject, and delete API keys. Click the _New API key_ button. -![Blank API Screen](../../../images/arangograph-my-api-keys.png) +![Blank API Screen](../../images/arangograph-my-api-keys.png) The pop-up box that follows has a few options for customizing the access level of this API key. @@ -65,7 +65,7 @@ your API key ID and API key secret. It is very important that you capture the API key secret before clicking the close button. There is no way to retrieve the API key secret after closing this pop-up window. -![API Secret Key](../../../images/arangograph-api-key-secret.png) +![API Secret Key](../../images/arangograph-api-key-secret.png) Once you have securely stored your API key ID and secret, click close. @@ -88,7 +88,7 @@ oasisctl login --help You should see an output similar to this: -![login help output](../../../images/oasisctl-login-help.png) +![login help output](../../images/oasisctl-login-help.png) This shows two additional flags are available, aside from the help flag. @@ -107,7 +107,7 @@ oasisctl login \ Upon successful login you should receive an authentication token: -![On Successful Login](../../../images/oasisctl-login-success.png) +![On Successful Login](../../images/oasisctl-login-success.png) Depending on your environment, you could instead store this token for easier access. For example: @@ -166,7 +166,7 @@ oasisctl list --help This should output a screen similar to: -![List help output](../../../images/oasisctl-list-help.png) +![List help output](../../images/oasisctl-list-help.png) As you can see you can get information on anything you would need about your ArangoGraph organizations, deployments, and access control. To start, let’s take a @@ -187,7 +187,7 @@ oasisctl list organizations --format json Once you have your available organizations you can refer to your desired organization using its name or id. -![List organizations output](../../../images/oasisctl-list-org.png) +![List organizations output](../../images/oasisctl-list-org.png) Note: You may also notice the url attribute, this is for internal use only and should not be treated as a publicly accessible path. @@ -209,7 +209,7 @@ oasisctl list projects \ This will return information on all projects that the authenticated user has access to. -![List projects output](../../../images/oasisctl-list-projects.png) +![List projects output](../../images/oasisctl-list-projects.png) ### List Deployments @@ -224,7 +224,7 @@ oasisctl list deployments \ --format json ``` -![List deployments output](../../../images/oasisctl-list-deployments.png) +![List deployments output](../../images/oasisctl-list-deployments.png) This provides some basic details for all of the deployments associated with the project. Namely, it provides a deployment ID which we can use to start making @@ -258,7 +258,7 @@ This returns quite a bit more information about the deployment including more detailed server information, the endpoint URL where you can access the web interface, and optionally the root user password. -![Get deployment details](../../../images/oasisctl-get-deployment.png) +![Get deployment details](../../images/oasisctl-get-deployment.png) ### Node Size ID @@ -282,7 +282,7 @@ oasisctl list nodesizes \ The output you will see will be similar to this: -![List node size id](../../../images/oasisctl-list-node-size-id.png) +![List node size id](../../images/oasisctl-list-node-size-id.png) It is important to note that you can scale up with more disk size but you are unable to scale down your deployment disk size. The only way to revert back to @@ -330,7 +330,7 @@ To see all the possible options you can start with the following command: oasisctl create --help ``` -![Create command help output](../../../images/oasisctl-create-help.png) +![Create command help output](../../images/oasisctl-create-help.png) ### Create a Deployment @@ -341,7 +341,7 @@ best place to start is with our trusty help command. oasisctl create deployment --help ``` -![Create deployment help output](../../../images/oasisctl-create-deployment-help.png) +![Create deployment help output](../../images/oasisctl-create-deployment-help.png) As you can see there are a lot of default options but also a few that require some knowledge of our pre-existing resources. Attempting to create a deployment @@ -367,7 +367,7 @@ oasisctl create deployment \ If everything went according to play you should see similar output: -![Deployment created successfully](../../../images/oasisctl-create-first-deployment-success.png) +![Deployment created successfully](../../images/oasisctl-create-first-deployment-success.png) ### Wait on Deployment Status @@ -390,7 +390,7 @@ oasisctl get deployment \ --deployment-id hmkuedzw9oavvjmjdo0i ``` -![Get deployment bootstrap status](../../../images/oasisctl-get-first-deployment-bootstrapped.png) +![Get deployment bootstrap status](../../images/oasisctl-get-first-deployment-bootstrapped.png) Once the deployment is ready you will get two new pieces of information, the endpoint URL and Bootstrapped-At will indicate the time it became available. @@ -437,7 +437,7 @@ oasisctl update deployment --help You will see the full list of options available that will allow you to scale your deployment as needed. -![Update deployment help output](../../../images/oasisctl-update-deployment-help.png) +![Update deployment help output](../../images/oasisctl-update-deployment-help.png) ## Delete a Deployment diff --git a/site/content/3.10/arangograph/api/set-up-a-connection.md b/site/content/amp/api/set-up-a-connection.md similarity index 100% rename from site/content/3.10/arangograph/api/set-up-a-connection.md rename to site/content/amp/api/set-up-a-connection.md diff --git a/site/content/3.12/arangograph/backups.md b/site/content/amp/backups.md similarity index 83% rename from site/content/3.12/arangograph/backups.md rename to site/content/amp/backups.md index e4adcd0a0e..ef93d724c7 100644 --- a/site/content/3.12/arangograph/backups.md +++ b/site/content/amp/backups.md @@ -11,7 +11,7 @@ description: >- To backup data in ArangoGraph for an ArangoDB installation, navigate to the **Backups** section of your deployment created previously. -![Backup ArangoDB](../../images/arangograph-backup-section.png) +![Backup ArangoDB](../images/arangograph-backup-section.png) There are two ways to create backups. Create periodic backups using a **Backup policy**, or create a backup manually. @@ -23,13 +23,13 @@ as well. Periodic backups are created at a given schedule. To see when the new backup is due, observe the schedule section. -![Backup Policy schedule](../../images/arangograph-backup-policy-schedule.png) +![Backup Policy schedule](../images/arangograph-backup-policy-schedule.png) When a new deployment is created, a default **Backup policy** is created for it as well. This policy creates backups every two hours. To edit this policy (or any policy), highlight it in the row above and hit the pencil icon. -![Edit Backup Policy](../../images/arangograph-edit-backup-policy.png) +![Edit Backup Policy](../images/arangograph-edit-backup-policy.png) These backups are not automatically uploaded. To enable this, use the **Upload backup to storage** option and choose a retention period that @@ -44,9 +44,9 @@ The regions where the default backup is copied are shown in the It's also possible to create a backup on demand. To do this, click **Back up now**. -![Back up Now](../../images/arangograph-back-up-now.png) +![Back up Now](../images/arangograph-back-up-now.png) -![Back up Now Dialog](../../images/arangograph-back-up-now-dialog.png) +![Back up Now Dialog](../images/arangograph-back-up-now-dialog.png) If you want to manually copy a backup to a different region than the default one, first ensure that the **Upload backup to storage** option is enabled. @@ -56,9 +56,9 @@ Then, highlight the backup row and use the The source backup ID from which the copy is created is displayed in the **Copied from Backup** column. -![Copy backup to a different region](../../images/arangograph-copy-backup-different-region.png) +![Copy backup to a different region](../images/arangograph-copy-backup-different-region.png) -![Multiple Backups](../../images/arangograph-multiple-backups.png) +![Multiple Backups](../images/arangograph-multiple-backups.png) ### Uploading backups @@ -110,7 +110,7 @@ regions, significantly improving reliability. Multiple region backup is only available when the **Upload backup to cloud storage** option is enabled. -![Multiple Region Backup](../../images/arangograph-multi-region-backup.png) +![Multiple Region Backup](../images/arangograph-multi-region-backup.png) ## How to restore backups @@ -124,13 +124,13 @@ backup before using the **Restore Backup** feature. During restore, the deployment is temporarily not available. {{< /warning >}} -![Restore From Backup](../../images/arangograph-restore-from-backup.png) +![Restore From Backup](../images/arangograph-restore-from-backup.png) -![Restore From Backup Dialog](../../images/arangograph-restore-from-backup-dialog.png) +![Restore From Backup Dialog](../images/arangograph-restore-from-backup-dialog.png) -![Restore From Backup Status Pending](../../images/arangograph-restore-from-backup-status-pending.png) +![Restore From Backup Status Pending](../images/arangograph-restore-from-backup-status-pending.png) -![Restore From Backup Status Restored](../../images/arangograph-restore-from-backup-status-restored.png) +![Restore From Backup Status Restored](../images/arangograph-restore-from-backup-status-restored.png) ## How to clone deployments using backups @@ -157,16 +157,16 @@ The *root password* for this deployment will be different. 1. Highlight the backup you wish to clone from and hit **Clone backup to new deployment**. - ![ArangoGraph Clone Deployment From Backup](../../images/arangograph-clone-deployment-from-backup.png) + ![ArangoGraph Clone Deployment From Backup](../images/arangograph-clone-deployment-from-backup.png) 2. Choose whether the clone should be created using the current provider and in the same region as the backup or using a different provider, a different region, or both. - ![ArangoGraph Clone Deployment Select Region](../../images/arangograph-clone-deployment-select.png) + ![ArangoGraph Clone Deployment Select Region](../images/arangograph-clone-deployment-select.png) 3. The view should navigate to the new deployment being bootstrapped. - ![ArangoGraph Cloned Deployment](../../images/arangograph-cloned-deployment.png) + ![ArangoGraph Cloned Deployment](../images/arangograph-cloned-deployment.png) This feature is also available through [oasisctl](oasisctl/_index.md). diff --git a/site/content/3.12/arangograph/data-loader/_index.md b/site/content/amp/data-loader/_index.md similarity index 84% rename from site/content/3.12/arangograph/data-loader/_index.md rename to site/content/amp/data-loader/_index.md index 7955fcb47a..a374f18c34 100644 --- a/site/content/3.12/arangograph/data-loader/_index.md +++ b/site/content/amp/data-loader/_index.md @@ -34,7 +34,7 @@ You can get started in a few easy steps. 4. **Import data**: Once you are ready, save and start the import. The resulting graph is an - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) with its + [EnterpriseGraph](../../arangodb/3.12/graphs/enterprisegraphs/_index.md) with its corresponding collections, available in your ArangoDB web interface. Follow this [working example](../data-loader/example.md) to see how easy it is @@ -47,10 +47,10 @@ get the ArangoDB client tools for your operating system from the [download page](https://arangodb.com/download-major/). - To import data to ArangoGraph from an existing ArangoDB instance, see - [arangodump](../../components/tools/arangodump/) and - [arangorestore](../../components/tools/arangorestore/). + [arangodump](../../arangodb/3.12/components/tools/arangodump/) and + [arangorestore](../../arangodb/3.12/components/tools/arangorestore/). - To import pre-existing data in JSON, CSV, or TSV format, see - [arangoimport](../../components/tools/arangoimport/). + [arangoimport](../../arangodb/3.12/components/tools/arangoimport/). ## How to access the Data Loader @@ -59,4 +59,4 @@ get the ArangoDB client tools for your operating system from the 3. In the **Load Data** section, click the **Load your data** button. 4. Select your migration use case. -![ArangoGraph Data Loader Migration Use Cases](../../../images/arangograph-data-loader-migration-use-cases.png) \ No newline at end of file +![ArangoGraph Data Loader Migration Use Cases](../../images/arangograph-data-loader-migration-use-cases.png) \ No newline at end of file diff --git a/site/content/3.11/arangograph/data-loader/add-files.md b/site/content/amp/data-loader/add-files.md similarity index 95% rename from site/content/3.11/arangograph/data-loader/add-files.md rename to site/content/amp/data-loader/add-files.md index 114b588e40..63ffb166de 100644 --- a/site/content/3.11/arangograph/data-loader/add-files.md +++ b/site/content/amp/data-loader/add-files.md @@ -17,7 +17,7 @@ You can upload your CSV files in the following ways: - Drag and drop your files in the designated area. - Click the **Browse files** button and select the files you want to add. -![ArangoGraph Data Loader Upload Files](../../../images/arangograph-data-loader-upload-files.png) +![ArangoGraph Data Loader Upload Files](../../images/arangograph-data-loader-upload-files.png) You have the option to either upload several files collectively as a batch or add them individually. Furthermore, you can supplement additional files later on. diff --git a/site/content/3.12/arangograph/data-loader/design-graph.md b/site/content/amp/data-loader/design-graph.md similarity index 91% rename from site/content/3.12/arangograph/data-loader/design-graph.md rename to site/content/amp/data-loader/design-graph.md index b1c5eaf3af..697b6bf2e9 100644 --- a/site/content/3.12/arangograph/data-loader/design-graph.md +++ b/site/content/amp/data-loader/design-graph.md @@ -9,7 +9,7 @@ description: >- Based on the data you have uploaded, you can start designing your graph. The graph designer allows you to create a schema using nodes and edges. Once this is done, you can save and start the import. The resulting -[EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and the +[EnterpriseGraph](../../arangodb/3.12/graphs/enterprisegraphs/_index.md) and the corresponding collections are created in your ArangoDB database instance. ## How to add a node @@ -26,7 +26,7 @@ objects. reference the nodes when you define relations with edges. - For **File Headers**, select one or more attributes from the list. -![ArangoGraph Data Loader Add Node](../../../images/arangograph-data-loader-add-node.png) +![ArangoGraph Data Loader Add Node](../../images/arangograph-data-loader-add-node.png) ## How to connect nodes @@ -60,7 +60,7 @@ See below the steps to add details to an edge. destination file (`_to`). - For **File Headers**, select one or more attributes from the list. -![ArangoGraph Data Loader Edit Edge](../../../images/arangograph-data-loader-edit-edge.png) +![ArangoGraph Data Loader Edit Edge](../../images/arangograph-data-loader-edit-edge.png) ## How to delete elements diff --git a/site/content/3.10/arangograph/data-loader/example.md b/site/content/amp/data-loader/example.md similarity index 85% rename from site/content/3.10/arangograph/data-loader/example.md rename to site/content/amp/data-loader/example.md index 46fdd1b38e..b6d14f3000 100644 --- a/site/content/3.10/arangograph/data-loader/example.md +++ b/site/content/amp/data-loader/example.md @@ -29,21 +29,21 @@ The whole process can be broken down into these steps: data from the uploaded files to them. This allows creating the corresponding documents and collections for your graph. 4. **Import data**: Import the data and start using your newly created - [EnterpriseGraph](../../graphs/enterprisegraphs/_index.md) and its + [EnterpriseGraph](../../arangodb/3.12/graphs/enterprisegraphs/_index.md) and its corresponding collections. ## Step 1: Create a database and choose the graph name Start by creating a new database and adding a name for your graph. -![Data Loader Example Step 1](../../../images/arangograph-data-loader-example-choose-names.png) +![Data Loader Example Step 1](../../images/arangograph-data-loader-example-choose-names.png) ## Step 2: Add files Upload your CSV files to the Data Loader web interface. You can drag and drop them or upload them via a file browser window. -![Data Loader Example Step 2](../../../images/arangograph-data-loader-example-add-files.png) +![Data Loader Example Step 2](../../images/arangograph-data-loader-example-add-files.png) See also [Add files into Data Loader](../data-loader/add-files.md). @@ -69,7 +69,7 @@ In this example, two node collections have been created (`origin_airport` and attribute for documents in both node collections. The header preview makes it easy to select the headers you want to use. -![Data Loader Example Step 3 Nodes](../../../images/arangograph-data-loader-example-map-nodes.png) +![Data Loader Example Step 3 Nodes](../../images/arangograph-data-loader-example-map-nodes.png) For edges, the **Edge label** is going to be an edge collection name. Then, you need to specify how edges will connect nodes. You can do this by selecting the @@ -77,7 +77,7 @@ need to specify how edges will connect nodes. You can do this by selecting the In this example, the `source airport` header has been selected as a source and the `destination airport` header as a target for the edge. -![Data Loader Example Step 3 Edges](../../../images/arangograph-data-loader-example-map-edges.png) +![Data Loader Example Step 3 Edges](../../images/arangograph-data-loader-example-map-edges.png) Note that the values of the source and target for the edge correspond to the **Primary identifier** (`_key` attribute) of the nodes. In this case, it is the @@ -93,11 +93,11 @@ After all the mapping is done, all you need to do is click processed and the documents created, as well as a link to your new graph. See also [Start import](../data-loader/import.md). -![Data Loader Example Step 4 See your new graph](../../../images/arangograph-data-loader-example-data-import.png) +![Data Loader Example Step 4 See your new graph](../../images/arangograph-data-loader-example-data-import.png) Finally, click **See your new graph** to open the ArangoDB web interface and explore your new collections and graph. -![Data Loader Example Step 4 Resulting graph](../../../images/arangograph-data-loader-example-resulting-graph.png) +![Data Loader Example Step 4 Resulting graph](../../images/arangograph-data-loader-example-resulting-graph.png) Happy graphing! \ No newline at end of file diff --git a/site/content/3.10/arangograph/data-loader/import.md b/site/content/amp/data-loader/import.md similarity index 100% rename from site/content/3.10/arangograph/data-loader/import.md rename to site/content/amp/data-loader/import.md diff --git a/site/content/3.12/arangograph/deployments/_index.md b/site/content/amp/deployments/_index.md similarity index 94% rename from site/content/3.12/arangograph/deployments/_index.md rename to site/content/amp/deployments/_index.md index b3416805a1..b518164516 100644 --- a/site/content/3.12/arangograph/deployments/_index.md +++ b/site/content/amp/deployments/_index.md @@ -13,7 +13,7 @@ You can have any number of deployments under one project. **Organizations → Projects → <u>Deployments</u>** -![ArangoGraph Deployments](../../../images/arangograph-deployments-page.png) +![ArangoGraph Deployments](../../images/arangograph-deployments-page.png) ## How to create a new deployment @@ -38,7 +38,7 @@ role bindings to regulate access control on a deployment level. provider and region anymore. {{< /warning >}} -![ArangoGraph New Deployment General](../../../images/arangograph-new-deployment-general.png) +![ArangoGraph New Deployment General](../../images/arangograph-new-deployment-general.png) ### In the **Sizing** section @@ -60,7 +60,7 @@ role bindings to regulate access control on a deployment level. - Select a __NODE SIZE__ from the list of available options. Each option is a combination of vCPUs, memory, and disk space per node. -![ArangoGraph New Deployment Sizing](../../../images/arangograph-new-deployment-sizing.png) +![ArangoGraph New Deployment Sizing](../../images/arangograph-new-deployment-sizing.png) ### In the **Advanced** section @@ -84,7 +84,7 @@ role bindings to regulate access control on a deployment level. {{< /security >}} - Select a __Deployment Profile__. Profile options are only available on request. -![ArangoGraph New Deployment Advanced](../../../images/arangograph-new-deployment-advanced.png) +![ArangoGraph New Deployment Advanced](../../images/arangograph-new-deployment-advanced.png) ### In the **Summary** panel @@ -150,7 +150,7 @@ a self-signed certificate is recommended. Read more on the Password rotation refers to changing passwords regularly - a security best practice to reduce the vulnerability to password-based attacks and exploits -by limiting for how long passwords are valid. The ArangoGraph Insights Platform +by limiting for how long passwords are valid. The Arango Managed Platform (AMP) can automatically change the `root` user password of an ArangoDB deployment periodically to improve security. @@ -161,7 +161,7 @@ periodically to improve security. 3. In the __Password Settings__ dialog, turn the automatic password rotation on and click the __Save__ button. - ![ArangoGraph Deployment Password Rotation](../../../images/arangograph-deployment-password-rotation.png) + ![ArangoGraph Deployment Password Rotation](../../images/arangograph-deployment-password-rotation.png) 4. You can expand the __Root password__ panel to see when the password was rotated last. The rotation takes place every three months. @@ -263,7 +263,7 @@ attached to your role. Read more about [roles and permissions](../security-and-a ## How to connect a driver to your deployment -[ArangoDB drivers](../../develop/drivers/_index.md) allow you to use your ArangoGraph +[ArangoDB drivers](../../arangodb/3.12/develop/drivers/_index.md) allow you to use your ArangoGraph deployment as a database system for your applications. Drivers act as interfaces between different programming languages and ArangoDB, which enable you to connect to and manipulate ArangoDB deployments from within compiled programs @@ -275,12 +275,12 @@ select your programming language. The code snippets provide examples on how to connect to your instance. {{< tip >}} -Note that ArangoGraph Insights Platform runs deployments in a cluster +Note that Arango Managed Platform (AMP) runs deployments in a cluster configuration. To achieve the best possible availability, your client application has to handle connection failures by retrying operations if needed. {{< /tip >}} -![ArangoGraph Connecting Drivers Example](../../../images/arangograph-connecting-drivers-example.png) +![ArangoGraph Connecting Drivers Example](../../images/arangograph-connecting-drivers-example.png) ## How to pause a deployment diff --git a/site/content/3.12/arangograph/deployments/private-endpoints.md b/site/content/amp/deployments/private-endpoints.md similarity index 91% rename from site/content/3.12/arangograph/deployments/private-endpoints.md rename to site/content/amp/deployments/private-endpoints.md index c3400b9711..dae87f4e93 100644 --- a/site/content/3.12/arangograph/deployments/private-endpoints.md +++ b/site/content/amp/deployments/private-endpoints.md @@ -47,11 +47,11 @@ service attachment that you need during the creation of your private endpoint(s) 2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) icon. 3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment Private Endpoint Menu](../../../images/arangograph-gcp-change.png) + ![ArangoGraph Deployment Private Endpoint Menu](../../images/arangograph-gcp-change.png) 4. In the configuration wizard, click **Next** to enter your configuration details. 5. Enter one or more Google project names. You can also add them later in the summary view. Click **Next**. - ![ArangoGraph Deployment Private Endpoint Setup 2](../../../images/arangograph-gcp-private-endpoint.png) + ![ArangoGraph Deployment Private Endpoint Setup 2](../../images/arangograph-gcp-private-endpoint.png) 6. Configure custom DNS names. This step is optional and disabled by default. Note that, once enabled, this setting is immutable and cannot be reverted. Click **Next** to continue. @@ -62,7 +62,7 @@ service attachment that you need during the creation of your private endpoint(s) If the custom DNS is enabled, you will be responsible for the DNS of your private endpoints. {{< /info >}} - ![ArangoGraph Private Endpoint Custom DNS](../../../images/arangograph-gcp-custom-dns.png) + ![ArangoGraph Private Endpoint Custom DNS](../../images/arangograph-gcp-custom-dns.png) 7. Click **Confirm Settings** to change the deployment. 8. Back in the **Overview** page, scroll down to the **Private Endpoint** section that is now displayed to see the connection status and to change the @@ -100,14 +100,14 @@ it to a public deployment, please contact the support team via **Request help** in the help menu. To configure a private endpoint for AWS, you need to provide the AWS principals related -to your VPC. The ArangoGraph Insights Platform configures a **Private Endpoint Service** +to your VPC. The Arango Managed Platform (AMP) configures a **Private Endpoint Service** that automatically connects to private endpoints that are created in those principals. 1. Open the deployment you want to change. 2. In the **Quick start** section, click the **Edit** button with an ellipsis (`…`) icon. 3. Click **Change to private endpoint** in the menu. - ![ArangoGraph Deployment AWS Change to Private Endpoint](../../../images/arangograph-aws-change-to-private-endpoint.png) + ![ArangoGraph Deployment AWS Change to Private Endpoint](../../images/arangograph-aws-change-to-private-endpoint.png) 4. In the configuration wizard, click **Next** to enter your configuration details. 5. Click **Add Principal** to start configuring the AWS principal(s). You need to enter a valid account, which is your 12 digit AWS account ID. @@ -120,7 +120,7 @@ that automatically connects to private endpoints that are created in those princ To verify your endpoint service in AWS, you must use the same principal as configured in ArangoGraph. Otherwise, the service name cannot be verified. {{< /warning >}} - ![ArangoGraph AWS Private Endpoint Configure Principals](../../../images/arangograph-aws-endpoint-configure-principals.png) + ![ArangoGraph AWS Private Endpoint Configure Principals](../../images/arangograph-aws-endpoint-configure-principals.png) 6. Configure custom DNS names. This step is optional and disabled by default, you can also add or change them later from the summary view. Click **Next** to continue. @@ -130,13 +130,13 @@ that automatically connects to private endpoints that are created in those princ If the custom DNS is enabled, you will be responsible for the DNS of your private endpoints. {{< /info >}} - ![ArangoGraph AWS Private Endpoint Alternate DNS](../../../images/arangograph-aws-private-endpoint-dns.png) + ![ArangoGraph AWS Private Endpoint Alternate DNS](../../images/arangograph-aws-private-endpoint-dns.png) 7. Confirm that you want to use a private endpoint for your deployment by clicking **Confirm Settings**. 8. Back in the **Overview** page, scroll down to the **Private Endpoint** section that is now displayed to see the connection status and change the configuration, if needed. - ![ArangoGraph AWS Private Endpoint Overview](../../../images/arangograph-aws-private-endpoint-overview.png) + ![ArangoGraph AWS Private Endpoint Overview](../../images/arangograph-aws-private-endpoint-overview.png) {{< info >}} Note that [Availability Zones](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones) diff --git a/site/content/3.10/arangograph/deployments/upgrades-and-versioning.md b/site/content/amp/deployments/upgrades-and-versioning.md similarity index 100% rename from site/content/3.10/arangograph/deployments/upgrades-and-versioning.md rename to site/content/amp/deployments/upgrades-and-versioning.md diff --git a/site/content/3.11/arangograph/migrate-to-the-cloud.md b/site/content/amp/migrate-to-the-cloud.md similarity index 98% rename from site/content/3.11/arangograph/migrate-to-the-cloud.md rename to site/content/amp/migrate-to-the-cloud.md index 8a3f4a9802..1ce835620d 100644 --- a/site/content/3.11/arangograph/migrate-to-the-cloud.md +++ b/site/content/amp/migrate-to-the-cloud.md @@ -46,7 +46,7 @@ chmod 755 ./arangosync-migration Before getting started, make sure the following prerequisites are in place: -- Go to the [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home) +- Go to the [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home) and sign in. If you don’t have an account yet, sign-up to create one. - Generate an ArangoGraph API key and API secret. See a detailed guide on @@ -150,7 +150,7 @@ have and how often write operations are executed during the process. You can also track the progress by checking the **Migration status** section of your target deployment in ArangoGraph dashboard. -![ArangoGraph Cloud Migration Progress](../../images/arangograph-migration-agent.png) +![ArangoGraph Cloud Migration Progress](../images/arangograph-migration-agent.png) ### Getting the current status diff --git a/site/content/3.12/arangograph/monitoring-and-metrics.md b/site/content/amp/monitoring-and-metrics.md similarity index 89% rename from site/content/3.12/arangograph/monitoring-and-metrics.md rename to site/content/amp/monitoring-and-metrics.md index 2b9ede4b4a..a4e5652ced 100644 --- a/site/content/3.12/arangograph/monitoring-and-metrics.md +++ b/site/content/amp/monitoring-and-metrics.md @@ -6,7 +6,7 @@ description: >- ArangoGraph provides various built-in tools and integrations to help you monitor your deployment --- -The ArangoGraph Insights Platform provides integrated charts, metrics, and logs +The Arango Managed Platform (AMP) provides integrated charts, metrics, and logs to help you monitor your deployment. This allows you to track your deployment's performance, resource utilization, and its overall status. @@ -21,7 +21,7 @@ The key features include: To get started, select an existing deployment from within a project and click **Monitoring** in the navigation. -![ArangoGraph Monitoring tab](../../images/arangograph-monitoring-tab.png) +![ArangoGraph Monitoring tab](../images/arangograph-monitoring-tab.png) ## Built-in monitoring and metrics @@ -42,7 +42,7 @@ you to apply filters to obtain logs from all server types or select specific one (i.e. only Coordinators or only DB-Servers) within a timeframe. To download the logs, click the **Save** button. -![ArangoGraph Monitoring Servers](../../images/arangograph-monitoring-servers.png) +![ArangoGraph Monitoring Servers](../images/arangograph-monitoring-servers.png) ### In the **Metrics** section @@ -57,18 +57,18 @@ or when needing to quickly find a particular one among many. Similarly, you can repeat the process for Coordinators to see the **CPU** and **Memory** usage. -![Arangograph Monitoring Metrics Chart](../../images/arangograph-monitoring-metrics-chart.png) +![Arangograph Monitoring Metrics Chart](../images/arangograph-monitoring-metrics-chart.png) ## Connect with Prometheus and Grafana -The ArangoGraph Insights Platform provides metrics for each deployment in a +The Arango Managed Platform (AMP) provides metrics for each deployment in a [Prometheus](https://prometheus.io/)-compatible format. You can use these metrics to gather detailed insights into the current and previous states of your deployment. Once metrics are collected by Prometheus, you can inspect them using tools such as [Grafana](https://grafana.com/oss/grafana/). -![ArangoGraph Connect Metrics Section](../../images/arangograph-connect-metrics-section.png) +![ArangoGraph Connect Metrics Section](../images/arangograph-connect-metrics-section.png) ### Metrics tokens @@ -81,7 +81,7 @@ which is required for connecting to Prometheus. 4. Select the **Lifetime** of the metrics token. 5. Click **Create**. -![ArangoGraph Metrics Tokens](../../images/arangograph-metrics-token.png) +![ArangoGraph Metrics Tokens](../images/arangograph-metrics-token.png) ### How to connect Prometheus diff --git a/site/content/3.12/arangograph/my-account.md b/site/content/amp/my-account.md similarity index 85% rename from site/content/3.12/arangograph/my-account.md rename to site/content/amp/my-account.md index 91cd87fb3c..98a9c2cfee 100644 --- a/site/content/3.12/arangograph/my-account.md +++ b/site/content/amp/my-account.md @@ -12,7 +12,7 @@ accessible from every view. There are two elements: - __Question mark icon__: Help - __User icon__: My Account -![ArangoGraph My Account](../../images/arangograph-my-account.png) +![ArangoGraph My Account](../images/arangograph-my-account.png) ## Overview @@ -30,7 +30,7 @@ accessible from every view. There are two elements: 3. Click the __Edit__ button. 4. Change your personal information and __Save__. -![ArangoGraph My Account Info](../../images/arangograph-my-account-info.png) +![ArangoGraph My Account Info](../images/arangograph-my-account-info.png) ## Organizations @@ -72,7 +72,7 @@ If you are no longer a member of any organization, then a new organization is created for you when you log in again. {{< /info >}} -![ArangoGraph New Organization](../../images/arangograph-new-org.png) +![ArangoGraph New Organization](../images/arangograph-new-org.png) ## Invites @@ -89,19 +89,19 @@ See [Users and Groups: How to add a new member to the organization](organization 1. Once invited, you will receive an email asking to join your ArangoGraph organization. - ![ArangoGraph Organization Invite Email](../../images/arangograph-org-invite-email.png) + ![ArangoGraph Organization Invite Email](../images/arangograph-org-invite-email.png) 2. Click the __View my organization invite__ link in the email. You will be asked to log in or to create a new account. 3. To sign up for a new account, click the __Start Free__ button or the __Sign up__ link in the header navigation. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) + ![ArangoGraph Homepage](../images/arangograph-homepage.png) 4. After successfully signing up, you will receive a verification email. 5. Click the __Verify my email address__ link in the email. It takes you back - to the ArangoGraph Insights Platform site. - ![ArangoGraph Organization Invite Email Verify](../../images/arangograph-org-invite-email-verify.png) + to the Arango Managed Platform (AMP) site. + ![ArangoGraph Organization Invite Email Verify](../images/arangograph-org-invite-email-verify.png) 6. After successfully logging in, you can accept or reject the invite to join your organization. - ![ArangoGraph Organization Invite](../../images/arangograph-org-invite.png) + ![ArangoGraph Organization Invite](../images/arangograph-org-invite.png) 7. After accepting the invite, you become a member of your organization and will be granted access to the organization and its related projects and deployments. @@ -113,11 +113,11 @@ See [Users and Groups: How to add a new member to the organization](organization 2. Click the __View my organization invites__ link in the email, or hover over the user icon in the top right corner of the dashboard and click __My organization invites__. - ![ArangoGraph Organization Invite Notification](../../images/arangograph-org-invite-notification.png) + ![ArangoGraph Organization Invite Notification](../images/arangograph-org-invite-notification.png) 3. On the __Invites__ tab of the __My account__ view, you can accept or reject pending invitations, as well as see past invitations that you accepted or rejected. Click the button with a checkmark icon to join the organization. - ![ArangoGraph Organization Invites Accept](../../images/arangograph-org-invites-accept.png) + ![ArangoGraph Organization Invites Accept](../images/arangograph-org-invites-accept.png) ## API Keys @@ -133,7 +133,7 @@ authentication. 2. Click __My API keys__ in the __My account__ section. 3. Information about the API keys are listed in the __My API keys__ section. -![ArangoGraph My API keys](../../images/arangograph-my-api-keys.png) +![ArangoGraph My API keys](../images/arangograph-my-api-keys.png) ### How to create a new API key @@ -152,9 +152,9 @@ The secret is only shown once at creation time. You have to store it in a safe place. {{< /security >}} -![ArangoGraph New API key](../../images/arangograph-new-api-key.png) +![ArangoGraph New API key](../images/arangograph-new-api-key.png) -![ArangoGraph API key Secret](../../images/arangograph-api-key-secret.png) +![ArangoGraph API key Secret](../images/arangograph-api-key-secret.png) ### How to revoke or delete an API key diff --git a/site/content/3.12/arangograph/notebooks.md b/site/content/amp/notebooks.md similarity index 98% rename from site/content/3.12/arangograph/notebooks.md rename to site/content/amp/notebooks.md index 7c8b0afff9..b02393bff4 100644 --- a/site/content/3.12/arangograph/notebooks.md +++ b/site/content/amp/notebooks.md @@ -17,7 +17,7 @@ ArangoML platform services. This makes it much easier to leverage these resources without having to download any data locally or to remember user IDs, passwords, and endpoint URLs. -![ArangoGraph Notebooks Architecture](../../images/arangograph-notebooks-architecture.png) +![ArangoGraph Notebooks Architecture](../images/arangograph-notebooks-architecture.png) The ArangoGraph Notebook has built-in [ArangoGraph Magic Commands](#arangograph-magic-commands) that answer questions like: @@ -58,7 +58,7 @@ Depending on the tier your organization belongs to, different limitations apply: - Free-to-try: you can only create one notebook per deployment. {{< /info >}} -![Notebooks](../../images/arangograph-notebooks.png) +![Notebooks](../images/arangograph-notebooks.png) {{< info >}} Notebooks in beta version have a fixed configuration of 10 GB of disk size. diff --git a/site/content/3.10/arangograph/oasisctl/_index.md b/site/content/amp/oasisctl/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/_index.md rename to site/content/amp/oasisctl/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/accept/_index.md b/site/content/amp/oasisctl/accept/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/accept/_index.md rename to site/content/amp/oasisctl/accept/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/accept/accept-organization-invite.md b/site/content/amp/oasisctl/accept/accept-organization-invite.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/accept/accept-organization-invite.md rename to site/content/amp/oasisctl/accept/accept-organization-invite.md diff --git a/site/content/3.10/arangograph/oasisctl/accept/accept-organization.md b/site/content/amp/oasisctl/accept/accept-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/accept/accept-organization.md rename to site/content/amp/oasisctl/accept/accept-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/add/_index.md b/site/content/amp/oasisctl/add/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/add/_index.md rename to site/content/amp/oasisctl/add/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/add/add-auditlog-destination.md b/site/content/amp/oasisctl/add/add-auditlog-destination.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/add/add-auditlog-destination.md rename to site/content/amp/oasisctl/add/add-auditlog-destination.md diff --git a/site/content/3.10/arangograph/oasisctl/add/add-auditlog.md b/site/content/amp/oasisctl/add/add-auditlog.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/add/add-auditlog.md rename to site/content/amp/oasisctl/add/add-auditlog.md diff --git a/site/content/3.10/arangograph/oasisctl/add/add-group-members.md b/site/content/amp/oasisctl/add/add-group-members.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/add/add-group-members.md rename to site/content/amp/oasisctl/add/add-group-members.md diff --git a/site/content/3.10/arangograph/oasisctl/add/add-group.md b/site/content/amp/oasisctl/add/add-group.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/add/add-group.md rename to site/content/amp/oasisctl/add/add-group.md diff --git a/site/content/3.10/arangograph/oasisctl/auditlog/_index.md b/site/content/amp/oasisctl/auditlog/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/auditlog/_index.md rename to site/content/amp/oasisctl/auditlog/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/auditlog/auditlog-attach.md b/site/content/amp/oasisctl/auditlog/auditlog-attach.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/auditlog/auditlog-attach.md rename to site/content/amp/oasisctl/auditlog/auditlog-attach.md diff --git a/site/content/3.10/arangograph/oasisctl/auditlog/auditlog-detach.md b/site/content/amp/oasisctl/auditlog/auditlog-detach.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/auditlog/auditlog-detach.md rename to site/content/amp/oasisctl/auditlog/auditlog-detach.md diff --git a/site/content/3.10/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md b/site/content/amp/oasisctl/auditlog/auditlog-get-attached-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/auditlog/auditlog-get-attached-project.md rename to site/content/amp/oasisctl/auditlog/auditlog-get-attached-project.md diff --git a/site/content/3.10/arangograph/oasisctl/auditlog/auditlog-get-attached.md b/site/content/amp/oasisctl/auditlog/auditlog-get-attached.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/auditlog/auditlog-get-attached.md rename to site/content/amp/oasisctl/auditlog/auditlog-get-attached.md diff --git a/site/content/3.10/arangograph/oasisctl/auditlog/auditlog-get.md b/site/content/amp/oasisctl/auditlog/auditlog-get.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/auditlog/auditlog-get.md rename to site/content/amp/oasisctl/auditlog/auditlog-get.md diff --git a/site/content/3.10/arangograph/oasisctl/backup/_index.md b/site/content/amp/oasisctl/backup/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/backup/_index.md rename to site/content/amp/oasisctl/backup/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/backup/backup-copy.md b/site/content/amp/oasisctl/backup/backup-copy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/backup/backup-copy.md rename to site/content/amp/oasisctl/backup/backup-copy.md diff --git a/site/content/3.10/arangograph/oasisctl/backup/backup-download.md b/site/content/amp/oasisctl/backup/backup-download.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/backup/backup-download.md rename to site/content/amp/oasisctl/backup/backup-download.md diff --git a/site/content/3.10/arangograph/oasisctl/clone/_index.md b/site/content/amp/oasisctl/clone/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/clone/_index.md rename to site/content/amp/oasisctl/clone/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/clone/clone-deployment-backup.md b/site/content/amp/oasisctl/clone/clone-deployment-backup.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/clone/clone-deployment-backup.md rename to site/content/amp/oasisctl/clone/clone-deployment-backup.md diff --git a/site/content/3.10/arangograph/oasisctl/clone/clone-deployment.md b/site/content/amp/oasisctl/clone/clone-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/clone/clone-deployment.md rename to site/content/amp/oasisctl/clone/clone-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/completion.md b/site/content/amp/oasisctl/completion.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/completion.md rename to site/content/amp/oasisctl/completion.md diff --git a/site/content/3.10/arangograph/oasisctl/create/_index.md b/site/content/amp/oasisctl/create/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/_index.md rename to site/content/amp/oasisctl/create/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-apikey.md b/site/content/amp/oasisctl/create/create-apikey.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-apikey.md rename to site/content/amp/oasisctl/create/create-apikey.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-auditlog.md b/site/content/amp/oasisctl/create/create-auditlog.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-auditlog.md rename to site/content/amp/oasisctl/create/create-auditlog.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-backup-policy.md b/site/content/amp/oasisctl/create/create-backup-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-backup-policy.md rename to site/content/amp/oasisctl/create/create-backup-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-backup.md b/site/content/amp/oasisctl/create/create-backup.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-backup.md rename to site/content/amp/oasisctl/create/create-backup.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-cacertificate.md b/site/content/amp/oasisctl/create/create-cacertificate.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-cacertificate.md rename to site/content/amp/oasisctl/create/create-cacertificate.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-deployment.md b/site/content/amp/oasisctl/create/create-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-deployment.md rename to site/content/amp/oasisctl/create/create-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-example-installation.md b/site/content/amp/oasisctl/create/create-example-installation.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-example-installation.md rename to site/content/amp/oasisctl/create/create-example-installation.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-example.md b/site/content/amp/oasisctl/create/create-example.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-example.md rename to site/content/amp/oasisctl/create/create-example.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-group.md b/site/content/amp/oasisctl/create/create-group.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-group.md rename to site/content/amp/oasisctl/create/create-group.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-ipallowlist.md b/site/content/amp/oasisctl/create/create-ipallowlist.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-ipallowlist.md rename to site/content/amp/oasisctl/create/create-ipallowlist.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-metrics-token.md b/site/content/amp/oasisctl/create/create-metrics-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-metrics-token.md rename to site/content/amp/oasisctl/create/create-metrics-token.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-metrics.md b/site/content/amp/oasisctl/create/create-metrics.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-metrics.md rename to site/content/amp/oasisctl/create/create-metrics.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-notebook.md b/site/content/amp/oasisctl/create/create-notebook.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-notebook.md rename to site/content/amp/oasisctl/create/create-notebook.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-organization-invite.md b/site/content/amp/oasisctl/create/create-organization-invite.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-organization-invite.md rename to site/content/amp/oasisctl/create/create-organization-invite.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-organization.md b/site/content/amp/oasisctl/create/create-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-organization.md rename to site/content/amp/oasisctl/create/create-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-private-endpoint-service.md b/site/content/amp/oasisctl/create/create-private-endpoint-service.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-private-endpoint-service.md rename to site/content/amp/oasisctl/create/create-private-endpoint-service.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-private-endpoint.md b/site/content/amp/oasisctl/create/create-private-endpoint.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-private-endpoint.md rename to site/content/amp/oasisctl/create/create-private-endpoint.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-private.md b/site/content/amp/oasisctl/create/create-private.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-private.md rename to site/content/amp/oasisctl/create/create-private.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-project.md b/site/content/amp/oasisctl/create/create-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-project.md rename to site/content/amp/oasisctl/create/create-project.md diff --git a/site/content/3.10/arangograph/oasisctl/create/create-role.md b/site/content/amp/oasisctl/create/create-role.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/create/create-role.md rename to site/content/amp/oasisctl/create/create-role.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/_index.md b/site/content/amp/oasisctl/delete/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/_index.md rename to site/content/amp/oasisctl/delete/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-apikey.md b/site/content/amp/oasisctl/delete/delete-apikey.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-apikey.md rename to site/content/amp/oasisctl/delete/delete-apikey.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-auditlog-archive-events.md b/site/content/amp/oasisctl/delete/delete-auditlog-archive-events.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-auditlog-archive-events.md rename to site/content/amp/oasisctl/delete/delete-auditlog-archive-events.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-auditlog-archive.md b/site/content/amp/oasisctl/delete/delete-auditlog-archive.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-auditlog-archive.md rename to site/content/amp/oasisctl/delete/delete-auditlog-archive.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-auditlog-destination.md b/site/content/amp/oasisctl/delete/delete-auditlog-destination.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-auditlog-destination.md rename to site/content/amp/oasisctl/delete/delete-auditlog-destination.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-auditlog.md b/site/content/amp/oasisctl/delete/delete-auditlog.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-auditlog.md rename to site/content/amp/oasisctl/delete/delete-auditlog.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-backup-policy.md b/site/content/amp/oasisctl/delete/delete-backup-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-backup-policy.md rename to site/content/amp/oasisctl/delete/delete-backup-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-backup.md b/site/content/amp/oasisctl/delete/delete-backup.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-backup.md rename to site/content/amp/oasisctl/delete/delete-backup.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-cacertificate.md b/site/content/amp/oasisctl/delete/delete-cacertificate.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-cacertificate.md rename to site/content/amp/oasisctl/delete/delete-cacertificate.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-deployment.md b/site/content/amp/oasisctl/delete/delete-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-deployment.md rename to site/content/amp/oasisctl/delete/delete-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-example-installation.md b/site/content/amp/oasisctl/delete/delete-example-installation.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-example-installation.md rename to site/content/amp/oasisctl/delete/delete-example-installation.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-example.md b/site/content/amp/oasisctl/delete/delete-example.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-example.md rename to site/content/amp/oasisctl/delete/delete-example.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-group-members.md b/site/content/amp/oasisctl/delete/delete-group-members.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-group-members.md rename to site/content/amp/oasisctl/delete/delete-group-members.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-group.md b/site/content/amp/oasisctl/delete/delete-group.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-group.md rename to site/content/amp/oasisctl/delete/delete-group.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-ipallowlist.md b/site/content/amp/oasisctl/delete/delete-ipallowlist.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-ipallowlist.md rename to site/content/amp/oasisctl/delete/delete-ipallowlist.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-metrics-token.md b/site/content/amp/oasisctl/delete/delete-metrics-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-metrics-token.md rename to site/content/amp/oasisctl/delete/delete-metrics-token.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-metrics.md b/site/content/amp/oasisctl/delete/delete-metrics.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-metrics.md rename to site/content/amp/oasisctl/delete/delete-metrics.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-notebook.md b/site/content/amp/oasisctl/delete/delete-notebook.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-notebook.md rename to site/content/amp/oasisctl/delete/delete-notebook.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-organization-invite.md b/site/content/amp/oasisctl/delete/delete-organization-invite.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-organization-invite.md rename to site/content/amp/oasisctl/delete/delete-organization-invite.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-organization-members.md b/site/content/amp/oasisctl/delete/delete-organization-members.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-organization-members.md rename to site/content/amp/oasisctl/delete/delete-organization-members.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-organization.md b/site/content/amp/oasisctl/delete/delete-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-organization.md rename to site/content/amp/oasisctl/delete/delete-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-project.md b/site/content/amp/oasisctl/delete/delete-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-project.md rename to site/content/amp/oasisctl/delete/delete-project.md diff --git a/site/content/3.10/arangograph/oasisctl/delete/delete-role.md b/site/content/amp/oasisctl/delete/delete-role.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/delete/delete-role.md rename to site/content/amp/oasisctl/delete/delete-role.md diff --git a/site/content/3.10/arangograph/oasisctl/disable/_index.md b/site/content/amp/oasisctl/disable/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/disable/_index.md rename to site/content/amp/oasisctl/disable/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md b/site/content/amp/oasisctl/disable/disable-scheduled-root-password-rotation.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/disable/disable-scheduled-root-password-rotation.md rename to site/content/amp/oasisctl/disable/disable-scheduled-root-password-rotation.md diff --git a/site/content/3.10/arangograph/oasisctl/enable/_index.md b/site/content/amp/oasisctl/enable/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/enable/_index.md rename to site/content/amp/oasisctl/enable/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md b/site/content/amp/oasisctl/enable/enable-scheduled-root-password-rotation.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/enable/enable-scheduled-root-password-rotation.md rename to site/content/amp/oasisctl/enable/enable-scheduled-root-password-rotation.md diff --git a/site/content/3.10/arangograph/oasisctl/generate-docs.md b/site/content/amp/oasisctl/generate-docs.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/generate-docs.md rename to site/content/amp/oasisctl/generate-docs.md diff --git a/site/content/3.10/arangograph/oasisctl/get/_index.md b/site/content/amp/oasisctl/get/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/_index.md rename to site/content/amp/oasisctl/get/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-auditlog-archive.md b/site/content/amp/oasisctl/get/get-auditlog-archive.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-auditlog-archive.md rename to site/content/amp/oasisctl/get/get-auditlog-archive.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-auditlog-events.md b/site/content/amp/oasisctl/get/get-auditlog-events.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-auditlog-events.md rename to site/content/amp/oasisctl/get/get-auditlog-events.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-auditlog.md b/site/content/amp/oasisctl/get/get-auditlog.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-auditlog.md rename to site/content/amp/oasisctl/get/get-auditlog.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-backup-policy.md b/site/content/amp/oasisctl/get/get-backup-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-backup-policy.md rename to site/content/amp/oasisctl/get/get-backup-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-backup.md b/site/content/amp/oasisctl/get/get-backup.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-backup.md rename to site/content/amp/oasisctl/get/get-backup.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-cacertificate.md b/site/content/amp/oasisctl/get/get-cacertificate.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-cacertificate.md rename to site/content/amp/oasisctl/get/get-cacertificate.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-deployment.md b/site/content/amp/oasisctl/get/get-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-deployment.md rename to site/content/amp/oasisctl/get/get-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-example-installation.md b/site/content/amp/oasisctl/get/get-example-installation.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-example-installation.md rename to site/content/amp/oasisctl/get/get-example-installation.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-example.md b/site/content/amp/oasisctl/get/get-example.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-example.md rename to site/content/amp/oasisctl/get/get-example.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-group.md b/site/content/amp/oasisctl/get/get-group.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-group.md rename to site/content/amp/oasisctl/get/get-group.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-ipallowlist.md b/site/content/amp/oasisctl/get/get-ipallowlist.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-ipallowlist.md rename to site/content/amp/oasisctl/get/get-ipallowlist.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-metrics-token.md b/site/content/amp/oasisctl/get/get-metrics-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-metrics-token.md rename to site/content/amp/oasisctl/get/get-metrics-token.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-metrics.md b/site/content/amp/oasisctl/get/get-metrics.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-metrics.md rename to site/content/amp/oasisctl/get/get-metrics.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-notebook.md b/site/content/amp/oasisctl/get/get-notebook.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-notebook.md rename to site/content/amp/oasisctl/get/get-notebook.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization-authentication-providers.md b/site/content/amp/oasisctl/get/get-organization-authentication-providers.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization-authentication-providers.md rename to site/content/amp/oasisctl/get/get-organization-authentication-providers.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization-authentication.md b/site/content/amp/oasisctl/get/get-organization-authentication.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization-authentication.md rename to site/content/amp/oasisctl/get/get-organization-authentication.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md b/site/content/amp/oasisctl/get/get-organization-email-domain-restrictions.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization-email-domain-restrictions.md rename to site/content/amp/oasisctl/get/get-organization-email-domain-restrictions.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization-email-domain.md b/site/content/amp/oasisctl/get/get-organization-email-domain.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization-email-domain.md rename to site/content/amp/oasisctl/get/get-organization-email-domain.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization-email.md b/site/content/amp/oasisctl/get/get-organization-email.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization-email.md rename to site/content/amp/oasisctl/get/get-organization-email.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization-invite.md b/site/content/amp/oasisctl/get/get-organization-invite.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization-invite.md rename to site/content/amp/oasisctl/get/get-organization-invite.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-organization.md b/site/content/amp/oasisctl/get/get-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-organization.md rename to site/content/amp/oasisctl/get/get-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-policy.md b/site/content/amp/oasisctl/get/get-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-policy.md rename to site/content/amp/oasisctl/get/get-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-private-endpoint-service.md b/site/content/amp/oasisctl/get/get-private-endpoint-service.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-private-endpoint-service.md rename to site/content/amp/oasisctl/get/get-private-endpoint-service.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-private-endpoint.md b/site/content/amp/oasisctl/get/get-private-endpoint.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-private-endpoint.md rename to site/content/amp/oasisctl/get/get-private-endpoint.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-private.md b/site/content/amp/oasisctl/get/get-private.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-private.md rename to site/content/amp/oasisctl/get/get-private.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-project.md b/site/content/amp/oasisctl/get/get-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-project.md rename to site/content/amp/oasisctl/get/get-project.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-provider.md b/site/content/amp/oasisctl/get/get-provider.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-provider.md rename to site/content/amp/oasisctl/get/get-provider.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-region.md b/site/content/amp/oasisctl/get/get-region.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-region.md rename to site/content/amp/oasisctl/get/get-region.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-role.md b/site/content/amp/oasisctl/get/get-role.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-role.md rename to site/content/amp/oasisctl/get/get-role.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-self.md b/site/content/amp/oasisctl/get/get-self.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-self.md rename to site/content/amp/oasisctl/get/get-self.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-server-status.md b/site/content/amp/oasisctl/get/get-server-status.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-server-status.md rename to site/content/amp/oasisctl/get/get-server-status.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-server.md b/site/content/amp/oasisctl/get/get-server.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-server.md rename to site/content/amp/oasisctl/get/get-server.md diff --git a/site/content/3.10/arangograph/oasisctl/get/get-tandc.md b/site/content/amp/oasisctl/get/get-tandc.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/get/get-tandc.md rename to site/content/amp/oasisctl/get/get-tandc.md diff --git a/site/content/3.10/arangograph/oasisctl/import.md b/site/content/amp/oasisctl/import.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/import.md rename to site/content/amp/oasisctl/import.md diff --git a/site/content/3.10/arangograph/oasisctl/list/_index.md b/site/content/amp/oasisctl/list/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/_index.md rename to site/content/amp/oasisctl/list/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-apikeys.md b/site/content/amp/oasisctl/list/list-apikeys.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-apikeys.md rename to site/content/amp/oasisctl/list/list-apikeys.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-arangodb-versions.md b/site/content/amp/oasisctl/list/list-arangodb-versions.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-arangodb-versions.md rename to site/content/amp/oasisctl/list/list-arangodb-versions.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-arangodb.md b/site/content/amp/oasisctl/list/list-arangodb.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-arangodb.md rename to site/content/amp/oasisctl/list/list-arangodb.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-auditlog-archives.md b/site/content/amp/oasisctl/list/list-auditlog-archives.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-auditlog-archives.md rename to site/content/amp/oasisctl/list/list-auditlog-archives.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-auditlog-destinations.md b/site/content/amp/oasisctl/list/list-auditlog-destinations.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-auditlog-destinations.md rename to site/content/amp/oasisctl/list/list-auditlog-destinations.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-auditlog.md b/site/content/amp/oasisctl/list/list-auditlog.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-auditlog.md rename to site/content/amp/oasisctl/list/list-auditlog.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-auditlogs.md b/site/content/amp/oasisctl/list/list-auditlogs.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-auditlogs.md rename to site/content/amp/oasisctl/list/list-auditlogs.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-backup-policies.md b/site/content/amp/oasisctl/list/list-backup-policies.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-backup-policies.md rename to site/content/amp/oasisctl/list/list-backup-policies.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-backup.md b/site/content/amp/oasisctl/list/list-backup.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-backup.md rename to site/content/amp/oasisctl/list/list-backup.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-backups.md b/site/content/amp/oasisctl/list/list-backups.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-backups.md rename to site/content/amp/oasisctl/list/list-backups.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-cacertificates.md b/site/content/amp/oasisctl/list/list-cacertificates.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-cacertificates.md rename to site/content/amp/oasisctl/list/list-cacertificates.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-cpusizes.md b/site/content/amp/oasisctl/list/list-cpusizes.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-cpusizes.md rename to site/content/amp/oasisctl/list/list-cpusizes.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-deployments.md b/site/content/amp/oasisctl/list/list-deployments.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-deployments.md rename to site/content/amp/oasisctl/list/list-deployments.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-diskperformances.md b/site/content/amp/oasisctl/list/list-diskperformances.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-diskperformances.md rename to site/content/amp/oasisctl/list/list-diskperformances.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-effective-permissions.md b/site/content/amp/oasisctl/list/list-effective-permissions.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-effective-permissions.md rename to site/content/amp/oasisctl/list/list-effective-permissions.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-effective.md b/site/content/amp/oasisctl/list/list-effective.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-effective.md rename to site/content/amp/oasisctl/list/list-effective.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-example-installations.md b/site/content/amp/oasisctl/list/list-example-installations.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-example-installations.md rename to site/content/amp/oasisctl/list/list-example-installations.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-example.md b/site/content/amp/oasisctl/list/list-example.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-example.md rename to site/content/amp/oasisctl/list/list-example.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-examples.md b/site/content/amp/oasisctl/list/list-examples.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-examples.md rename to site/content/amp/oasisctl/list/list-examples.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-group-members.md b/site/content/amp/oasisctl/list/list-group-members.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-group-members.md rename to site/content/amp/oasisctl/list/list-group-members.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-group.md b/site/content/amp/oasisctl/list/list-group.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-group.md rename to site/content/amp/oasisctl/list/list-group.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-groups.md b/site/content/amp/oasisctl/list/list-groups.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-groups.md rename to site/content/amp/oasisctl/list/list-groups.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-ipallowlists.md b/site/content/amp/oasisctl/list/list-ipallowlists.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-ipallowlists.md rename to site/content/amp/oasisctl/list/list-ipallowlists.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-metrics-tokens.md b/site/content/amp/oasisctl/list/list-metrics-tokens.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-metrics-tokens.md rename to site/content/amp/oasisctl/list/list-metrics-tokens.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-metrics.md b/site/content/amp/oasisctl/list/list-metrics.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-metrics.md rename to site/content/amp/oasisctl/list/list-metrics.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-nodesizes.md b/site/content/amp/oasisctl/list/list-nodesizes.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-nodesizes.md rename to site/content/amp/oasisctl/list/list-nodesizes.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-notebookmodels.md b/site/content/amp/oasisctl/list/list-notebookmodels.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-notebookmodels.md rename to site/content/amp/oasisctl/list/list-notebookmodels.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-notebooks.md b/site/content/amp/oasisctl/list/list-notebooks.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-notebooks.md rename to site/content/amp/oasisctl/list/list-notebooks.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-organization-invites.md b/site/content/amp/oasisctl/list/list-organization-invites.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-organization-invites.md rename to site/content/amp/oasisctl/list/list-organization-invites.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-organization-members.md b/site/content/amp/oasisctl/list/list-organization-members.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-organization-members.md rename to site/content/amp/oasisctl/list/list-organization-members.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-organization.md b/site/content/amp/oasisctl/list/list-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-organization.md rename to site/content/amp/oasisctl/list/list-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-organizations.md b/site/content/amp/oasisctl/list/list-organizations.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-organizations.md rename to site/content/amp/oasisctl/list/list-organizations.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-permissions.md b/site/content/amp/oasisctl/list/list-permissions.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-permissions.md rename to site/content/amp/oasisctl/list/list-permissions.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-projects.md b/site/content/amp/oasisctl/list/list-projects.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-projects.md rename to site/content/amp/oasisctl/list/list-projects.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-providers.md b/site/content/amp/oasisctl/list/list-providers.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-providers.md rename to site/content/amp/oasisctl/list/list-providers.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-regions.md b/site/content/amp/oasisctl/list/list-regions.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-regions.md rename to site/content/amp/oasisctl/list/list-regions.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-roles.md b/site/content/amp/oasisctl/list/list-roles.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-roles.md rename to site/content/amp/oasisctl/list/list-roles.md diff --git a/site/content/3.10/arangograph/oasisctl/list/list-servers.md b/site/content/amp/oasisctl/list/list-servers.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/list/list-servers.md rename to site/content/amp/oasisctl/list/list-servers.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/_index.md b/site/content/amp/oasisctl/lock/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/_index.md rename to site/content/amp/oasisctl/lock/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/lock-cacertificate.md b/site/content/amp/oasisctl/lock/lock-cacertificate.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/lock-cacertificate.md rename to site/content/amp/oasisctl/lock/lock-cacertificate.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/lock-deployment.md b/site/content/amp/oasisctl/lock/lock-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/lock-deployment.md rename to site/content/amp/oasisctl/lock/lock-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/lock-ipallowlist.md b/site/content/amp/oasisctl/lock/lock-ipallowlist.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/lock-ipallowlist.md rename to site/content/amp/oasisctl/lock/lock-ipallowlist.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/lock-organization.md b/site/content/amp/oasisctl/lock/lock-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/lock-organization.md rename to site/content/amp/oasisctl/lock/lock-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/lock-policy.md b/site/content/amp/oasisctl/lock/lock-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/lock-policy.md rename to site/content/amp/oasisctl/lock/lock-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/lock/lock-project.md b/site/content/amp/oasisctl/lock/lock-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/lock/lock-project.md rename to site/content/amp/oasisctl/lock/lock-project.md diff --git a/site/content/3.10/arangograph/oasisctl/login.md b/site/content/amp/oasisctl/login.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/login.md rename to site/content/amp/oasisctl/login.md diff --git a/site/content/3.10/arangograph/oasisctl/logs.md b/site/content/amp/oasisctl/logs.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/logs.md rename to site/content/amp/oasisctl/logs.md diff --git a/site/content/3.10/arangograph/oasisctl/options.md b/site/content/amp/oasisctl/options.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/options.md rename to site/content/amp/oasisctl/options.md diff --git a/site/content/3.10/arangograph/oasisctl/pause/_index.md b/site/content/amp/oasisctl/pause/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/pause/_index.md rename to site/content/amp/oasisctl/pause/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/pause/pause-notebook.md b/site/content/amp/oasisctl/pause/pause-notebook.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/pause/pause-notebook.md rename to site/content/amp/oasisctl/pause/pause-notebook.md diff --git a/site/content/3.10/arangograph/oasisctl/rebalance/_index.md b/site/content/amp/oasisctl/rebalance/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/rebalance/_index.md rename to site/content/amp/oasisctl/rebalance/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md b/site/content/amp/oasisctl/rebalance/rebalance-deployment-shards.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/rebalance/rebalance-deployment-shards.md rename to site/content/amp/oasisctl/rebalance/rebalance-deployment-shards.md diff --git a/site/content/3.10/arangograph/oasisctl/rebalance/rebalance-deployment.md b/site/content/amp/oasisctl/rebalance/rebalance-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/rebalance/rebalance-deployment.md rename to site/content/amp/oasisctl/rebalance/rebalance-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/reject/_index.md b/site/content/amp/oasisctl/reject/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/reject/_index.md rename to site/content/amp/oasisctl/reject/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/reject/reject-organization-invite.md b/site/content/amp/oasisctl/reject/reject-organization-invite.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/reject/reject-organization-invite.md rename to site/content/amp/oasisctl/reject/reject-organization-invite.md diff --git a/site/content/3.10/arangograph/oasisctl/reject/reject-organization.md b/site/content/amp/oasisctl/reject/reject-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/reject/reject-organization.md rename to site/content/amp/oasisctl/reject/reject-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/renew/_index.md b/site/content/amp/oasisctl/renew/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/renew/_index.md rename to site/content/amp/oasisctl/renew/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/renew/renew-apikey-token.md b/site/content/amp/oasisctl/renew/renew-apikey-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/renew/renew-apikey-token.md rename to site/content/amp/oasisctl/renew/renew-apikey-token.md diff --git a/site/content/3.10/arangograph/oasisctl/renew/renew-apikey.md b/site/content/amp/oasisctl/renew/renew-apikey.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/renew/renew-apikey.md rename to site/content/amp/oasisctl/renew/renew-apikey.md diff --git a/site/content/3.10/arangograph/oasisctl/resume/_index.md b/site/content/amp/oasisctl/resume/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/resume/_index.md rename to site/content/amp/oasisctl/resume/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/resume/resume-deployment.md b/site/content/amp/oasisctl/resume/resume-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/resume/resume-deployment.md rename to site/content/amp/oasisctl/resume/resume-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/resume/resume-notebook.md b/site/content/amp/oasisctl/resume/resume-notebook.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/resume/resume-notebook.md rename to site/content/amp/oasisctl/resume/resume-notebook.md diff --git a/site/content/3.10/arangograph/oasisctl/revoke/_index.md b/site/content/amp/oasisctl/revoke/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/revoke/_index.md rename to site/content/amp/oasisctl/revoke/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/revoke/revoke-apikey-token.md b/site/content/amp/oasisctl/revoke/revoke-apikey-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/revoke/revoke-apikey-token.md rename to site/content/amp/oasisctl/revoke/revoke-apikey-token.md diff --git a/site/content/3.10/arangograph/oasisctl/revoke/revoke-apikey.md b/site/content/amp/oasisctl/revoke/revoke-apikey.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/revoke/revoke-apikey.md rename to site/content/amp/oasisctl/revoke/revoke-apikey.md diff --git a/site/content/3.10/arangograph/oasisctl/revoke/revoke-metrics-token.md b/site/content/amp/oasisctl/revoke/revoke-metrics-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/revoke/revoke-metrics-token.md rename to site/content/amp/oasisctl/revoke/revoke-metrics-token.md diff --git a/site/content/3.10/arangograph/oasisctl/revoke/revoke-metrics.md b/site/content/amp/oasisctl/revoke/revoke-metrics.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/revoke/revoke-metrics.md rename to site/content/amp/oasisctl/revoke/revoke-metrics.md diff --git a/site/content/3.10/arangograph/oasisctl/rotate/_index.md b/site/content/amp/oasisctl/rotate/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/rotate/_index.md rename to site/content/amp/oasisctl/rotate/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/rotate/rotate-deployment-server.md b/site/content/amp/oasisctl/rotate/rotate-deployment-server.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/rotate/rotate-deployment-server.md rename to site/content/amp/oasisctl/rotate/rotate-deployment-server.md diff --git a/site/content/3.10/arangograph/oasisctl/rotate/rotate-deployment.md b/site/content/amp/oasisctl/rotate/rotate-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/rotate/rotate-deployment.md rename to site/content/amp/oasisctl/rotate/rotate-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/top.md b/site/content/amp/oasisctl/top.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/top.md rename to site/content/amp/oasisctl/top.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/_index.md b/site/content/amp/oasisctl/unlock/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/_index.md rename to site/content/amp/oasisctl/unlock/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/unlock-cacertificate.md b/site/content/amp/oasisctl/unlock/unlock-cacertificate.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/unlock-cacertificate.md rename to site/content/amp/oasisctl/unlock/unlock-cacertificate.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/unlock-deployment.md b/site/content/amp/oasisctl/unlock/unlock-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/unlock-deployment.md rename to site/content/amp/oasisctl/unlock/unlock-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/unlock-ipallowlist.md b/site/content/amp/oasisctl/unlock/unlock-ipallowlist.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/unlock-ipallowlist.md rename to site/content/amp/oasisctl/unlock/unlock-ipallowlist.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/unlock-organization.md b/site/content/amp/oasisctl/unlock/unlock-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/unlock-organization.md rename to site/content/amp/oasisctl/unlock/unlock-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/unlock-policy.md b/site/content/amp/oasisctl/unlock/unlock-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/unlock-policy.md rename to site/content/amp/oasisctl/unlock/unlock-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/unlock/unlock-project.md b/site/content/amp/oasisctl/unlock/unlock-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/unlock/unlock-project.md rename to site/content/amp/oasisctl/unlock/unlock-project.md diff --git a/site/content/3.10/arangograph/oasisctl/update/_index.md b/site/content/amp/oasisctl/update/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/_index.md rename to site/content/amp/oasisctl/update/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-auditlog.md b/site/content/amp/oasisctl/update/update-auditlog.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-auditlog.md rename to site/content/amp/oasisctl/update/update-auditlog.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-backup-policy.md b/site/content/amp/oasisctl/update/update-backup-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-backup-policy.md rename to site/content/amp/oasisctl/update/update-backup-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-backup.md b/site/content/amp/oasisctl/update/update-backup.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-backup.md rename to site/content/amp/oasisctl/update/update-backup.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-cacertificate.md b/site/content/amp/oasisctl/update/update-cacertificate.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-cacertificate.md rename to site/content/amp/oasisctl/update/update-cacertificate.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-deployment.md b/site/content/amp/oasisctl/update/update-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-deployment.md rename to site/content/amp/oasisctl/update/update-deployment.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-group.md b/site/content/amp/oasisctl/update/update-group.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-group.md rename to site/content/amp/oasisctl/update/update-group.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-ipallowlist.md b/site/content/amp/oasisctl/update/update-ipallowlist.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-ipallowlist.md rename to site/content/amp/oasisctl/update/update-ipallowlist.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-metrics-token.md b/site/content/amp/oasisctl/update/update-metrics-token.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-metrics-token.md rename to site/content/amp/oasisctl/update/update-metrics-token.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-metrics.md b/site/content/amp/oasisctl/update/update-metrics.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-metrics.md rename to site/content/amp/oasisctl/update/update-metrics.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-notebook.md b/site/content/amp/oasisctl/update/update-notebook.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-notebook.md rename to site/content/amp/oasisctl/update/update-notebook.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-organization-authentication-providers.md b/site/content/amp/oasisctl/update/update-organization-authentication-providers.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-organization-authentication-providers.md rename to site/content/amp/oasisctl/update/update-organization-authentication-providers.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-organization-authentication.md b/site/content/amp/oasisctl/update/update-organization-authentication.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-organization-authentication.md rename to site/content/amp/oasisctl/update/update-organization-authentication.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md b/site/content/amp/oasisctl/update/update-organization-email-domain-restrictions.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-organization-email-domain-restrictions.md rename to site/content/amp/oasisctl/update/update-organization-email-domain-restrictions.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-organization-email-domain.md b/site/content/amp/oasisctl/update/update-organization-email-domain.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-organization-email-domain.md rename to site/content/amp/oasisctl/update/update-organization-email-domain.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-organization-email.md b/site/content/amp/oasisctl/update/update-organization-email.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-organization-email.md rename to site/content/amp/oasisctl/update/update-organization-email.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-organization.md b/site/content/amp/oasisctl/update/update-organization.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-organization.md rename to site/content/amp/oasisctl/update/update-organization.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-policy-add-binding.md b/site/content/amp/oasisctl/update/update-policy-add-binding.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-policy-add-binding.md rename to site/content/amp/oasisctl/update/update-policy-add-binding.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-policy-add.md b/site/content/amp/oasisctl/update/update-policy-add.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-policy-add.md rename to site/content/amp/oasisctl/update/update-policy-add.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-policy-delete-binding.md b/site/content/amp/oasisctl/update/update-policy-delete-binding.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-policy-delete-binding.md rename to site/content/amp/oasisctl/update/update-policy-delete-binding.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-policy-delete.md b/site/content/amp/oasisctl/update/update-policy-delete.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-policy-delete.md rename to site/content/amp/oasisctl/update/update-policy-delete.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-policy.md b/site/content/amp/oasisctl/update/update-policy.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-policy.md rename to site/content/amp/oasisctl/update/update-policy.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-private-endpoint-service.md b/site/content/amp/oasisctl/update/update-private-endpoint-service.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-private-endpoint-service.md rename to site/content/amp/oasisctl/update/update-private-endpoint-service.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-private-endpoint.md b/site/content/amp/oasisctl/update/update-private-endpoint.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-private-endpoint.md rename to site/content/amp/oasisctl/update/update-private-endpoint.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-private.md b/site/content/amp/oasisctl/update/update-private.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-private.md rename to site/content/amp/oasisctl/update/update-private.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-project.md b/site/content/amp/oasisctl/update/update-project.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-project.md rename to site/content/amp/oasisctl/update/update-project.md diff --git a/site/content/3.10/arangograph/oasisctl/update/update-role.md b/site/content/amp/oasisctl/update/update-role.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/update/update-role.md rename to site/content/amp/oasisctl/update/update-role.md diff --git a/site/content/3.10/arangograph/oasisctl/upgrade.md b/site/content/amp/oasisctl/upgrade.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/upgrade.md rename to site/content/amp/oasisctl/upgrade.md diff --git a/site/content/3.10/arangograph/oasisctl/version.md b/site/content/amp/oasisctl/version.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/version.md rename to site/content/amp/oasisctl/version.md diff --git a/site/content/3.10/arangograph/oasisctl/wait/_index.md b/site/content/amp/oasisctl/wait/_index.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/wait/_index.md rename to site/content/amp/oasisctl/wait/_index.md diff --git a/site/content/3.10/arangograph/oasisctl/wait/wait-deployment.md b/site/content/amp/oasisctl/wait/wait-deployment.md similarity index 100% rename from site/content/3.10/arangograph/oasisctl/wait/wait-deployment.md rename to site/content/amp/oasisctl/wait/wait-deployment.md diff --git a/site/content/3.13/arangograph/organizations/_index.md b/site/content/amp/organizations/_index.md similarity index 92% rename from site/content/3.13/arangograph/organizations/_index.md rename to site/content/amp/organizations/_index.md index 083b746dda..0a0a4e0618 100644 --- a/site/content/3.13/arangograph/organizations/_index.md +++ b/site/content/amp/organizations/_index.md @@ -23,13 +23,13 @@ member of one _Free-to-try_ tier organization at a time. 3. The overview will open for the selected organization, showing the number of projects, the tier and when it was created. -![ArangoGraph Organization Switcher](../../../images/arangograph-organization-switcher.png) +![ArangoGraph Organization Switcher](../../images/arangograph-organization-switcher.png) -![ArangoGraph Organization Overview](../../../images/arangograph-organization-overview.png) +![ArangoGraph Organization Overview](../../images/arangograph-organization-overview.png) ## ArangoGraph Packages -With the ArangoGraph Insights Platform, your organization can choose one of the +With the Arango Managed Platform (AMP), your organization can choose one of the following packages. ### Free Trial @@ -77,7 +77,7 @@ deployments will no longer expire and you can create more and larger deployments See [Billing: How to add billing details / payment methods](billing.md) -![ArangoGraph Billing](../../../images/arangograph-billing.png) +![ArangoGraph Billing](../../images/arangograph-billing.png) ## How to create a new organization diff --git a/site/content/3.11/arangograph/organizations/billing.md b/site/content/amp/organizations/billing.md similarity index 85% rename from site/content/3.11/arangograph/organizations/billing.md rename to site/content/amp/organizations/billing.md index 9b892b5500..34e2010384 100644 --- a/site/content/3.11/arangograph/organizations/billing.md +++ b/site/content/amp/organizations/billing.md @@ -15,7 +15,7 @@ description: >- to automatically. 6. Click **Save**. -![ArangoGraph Billing Details](../../../images/arangograph-billing-details.png) +![ArangoGraph Billing Details](../../images/arangograph-billing-details.png) ## How to add a payment method @@ -25,7 +25,7 @@ description: >- 4. Fill out the form with your credit card details. Currently, a credit card is the only available payment method. 5. Click **Save**. -![ArangoGraph Payment Method](../../../images/arangograph-add-payment-method-credit-card.png) +![ArangoGraph Payment Method](../../images/arangograph-add-payment-method-credit-card.png) {{% comment %}} TODO: Need screenshot with invoice diff --git a/site/content/3.10/arangograph/organizations/credits-and-usage.md b/site/content/amp/organizations/credits-and-usage.md similarity index 98% rename from site/content/3.10/arangograph/organizations/credits-and-usage.md rename to site/content/amp/organizations/credits-and-usage.md index 34dafb8488..b0253b6ac7 100644 --- a/site/content/3.10/arangograph/organizations/credits-and-usage.md +++ b/site/content/amp/organizations/credits-and-usage.md @@ -57,7 +57,7 @@ There are a number of benefits that ArangoGraph credits provide: - The number of credits remaining. - The number of credits consumed for each deployment. -![ArangoGraph Credits and Usage](../../../images/arangograph-credits-and-usage.png) +![ArangoGraph Credits and Usage](../../images/arangograph-credits-and-usage.png) ## FAQs diff --git a/site/content/3.10/arangograph/organizations/users-and-groups.md b/site/content/amp/organizations/users-and-groups.md similarity index 90% rename from site/content/3.10/arangograph/organizations/users-and-groups.md rename to site/content/amp/organizations/users-and-groups.md index abed36697b..0835792ad6 100644 --- a/site/content/3.10/arangograph/organizations/users-and-groups.md +++ b/site/content/amp/organizations/users-and-groups.md @@ -32,7 +32,7 @@ To edit permissions of members see [Access Control](../security-and-access-contr Members are a list of users that can access an organization. -![ArangoGraph Member Access Control](../../../images/arangograph-access-control-members.png) +![ArangoGraph Member Access Control](../../images/arangograph-access-control-members.png) ### How to add a new member to the organization @@ -48,7 +48,7 @@ Members are a list of users that can access an organization. 8. After accepting the invite the person will be added to the organization [members](#members). -![ArangoGraph Organization Invites](../../../images/arangograph-new-invite.png) +![ArangoGraph Organization Invites](../../images/arangograph-new-invite.png) ### How to respond to an organization invite @@ -77,7 +77,7 @@ You cannot delete members who are organization owners. A group is a defined set of members. Groups can then be bound to roles. These bindings contribute to the respective organization, project or deployment policy. -![ArangoGraph Groups](../../../images/arangograph-groups.png) +![ArangoGraph Groups](../../images/arangograph-groups.png) ### How to create a new group @@ -87,7 +87,7 @@ bindings contribute to the respective organization, project or deployment policy 4. Select the members you want to be part of the group. 5. Press the __Create__ button. -![ArangoGraph New Group](../../../images/arangograph-new-group.png) +![ArangoGraph New Group](../../images/arangograph-new-group.png) ### How to view, edit or remove a group @@ -100,7 +100,7 @@ bindings contribute to the respective organization, project or deployment policy You can also click a group name to view it. There are buttons to __Edit__ and __Delete__ the currently viewed group. -![ArangoGraph Group](../../../images/arangograph-group.png) +![ArangoGraph Group](../../images/arangograph-group.png) {{< info >}} The groups __Organization members__ and __Organization owners__ are virtual groups @@ -122,4 +122,4 @@ See [How to add a new member to the organization](#how-to-add-a-new-member-to-th 3. You may delete pending invites by clicking the __recycle bin__ icon in the __Actions__ column. -![ArangoGraph Organization Invites](../../../images/arangograph-org-invites.png) +![ArangoGraph Organization Invites](../../images/arangograph-org-invites.png) diff --git a/site/content/3.10/arangograph/projects.md b/site/content/amp/projects.md similarity index 93% rename from site/content/3.10/arangograph/projects.md rename to site/content/amp/projects.md index f4efd27833..0943c30bdb 100644 --- a/site/content/3.10/arangograph/projects.md +++ b/site/content/amp/projects.md @@ -15,7 +15,7 @@ Projects are a container for related deployments, certificates & IP allowlists. Projects also come with their own policy for access control. You can have any number of deployment under one project. -![ArangoGraph Projects Overview](../../images/arangograph-projects-overview.png) +![ArangoGraph Projects Overview](../images/arangograph-projects-overview.png) ## How to create a new project @@ -27,9 +27,9 @@ number of deployment under one project. 6. You will be taken to the project page. 7. To change the name or description, click either at the top of the page. -![ArangoGraph New Project](../../images/arangograph-new-project.png) +![ArangoGraph New Project](../images/arangograph-new-project.png) -![ArangoGraph Project Summary](../../images/arangograph-project.png) +![ArangoGraph Project Summary](../images/arangograph-project.png) {{< info >}} Projects contain exactly **one policy**. Within that policy, you can define diff --git a/site/content/3.12/arangograph/security-and-access-control/_index.md b/site/content/amp/security-and-access-control/_index.md similarity index 98% rename from site/content/3.12/arangograph/security-and-access-control/_index.md rename to site/content/amp/security-and-access-control/_index.md index fa37f9af13..1c91090aab 100644 --- a/site/content/3.12/arangograph/security-and-access-control/_index.md +++ b/site/content/amp/security-and-access-control/_index.md @@ -6,7 +6,7 @@ description: >- This guide explains which access control concepts are available in ArangoGraph and how to use them --- -The ArangoGraph Insights Platform has a structured set of resources that are subject to security and +The Arango Managed Platform (AMP) has a structured set of resources that are subject to security and access control: - Organizations @@ -79,7 +79,7 @@ To delete a role binding, click the **Recycle Bin** icon in the **Actions** colu Currently, you cannot edit a role binding, you can only delete it. {{< /info >}} -![ArangoGraph Project Policy](../../../images/arangograph-policy-page.png) +![ArangoGraph Project Policy](../../images/arangograph-policy-page.png) ### How to add a role binding to a policy @@ -89,7 +89,7 @@ Currently, you cannot edit a role binding, you can only delete it. 4. Select one or more roles you want to assign to the specified members. 5. Click **Create**. -![ArangoGraph New Role Binding](../../../images/arangograph-new-policy-role-binding.png) +![ArangoGraph New Role Binding](../../images/arangograph-new-policy-role-binding.png) ## Roles @@ -104,7 +104,7 @@ project, or deployment policy. There are predefined roles, but you can also create custom ones. -![ArangoGraph Roles](../../../images/arangograph-access-control-roles.png) +![ArangoGraph Roles](../../images/arangograph-access-control-roles.png) ### Predefined roles @@ -485,7 +485,7 @@ The roles below are described following this pattern: 4. Select the required permissions. 5. Click **Create**. -![ArangoGraph New Role](../../../images/arangograph-create-role.png) +![ArangoGraph New Role](../../images/arangograph-create-role.png) ### How to view, edit or remove a custom role @@ -693,7 +693,7 @@ projects belonging to that organization. - **Confirmation** - confirm that logging auditing events increases the price of your deployments. - ![ArangoGraph audit log](../../../images/arangograph-audit-log.png) + ![ArangoGraph audit log](../../images/arangograph-audit-log.png) 4. Click **Create** to add the audit log. You can now use it in the projects belonging to your organization. diff --git a/site/content/3.11/arangograph/security-and-access-control/single-sign-on/_index.md b/site/content/amp/security-and-access-control/single-sign-on/_index.md similarity index 87% rename from site/content/3.11/arangograph/security-and-access-control/single-sign-on/_index.md rename to site/content/amp/security-and-access-control/single-sign-on/_index.md index 1004352974..4d58442907 100644 --- a/site/content/3.11/arangograph/security-and-access-control/single-sign-on/_index.md +++ b/site/content/amp/security-and-access-control/single-sign-on/_index.md @@ -48,15 +48,15 @@ Provider (IdP). For more information about Okta, please refer to the 2. Click **Create App Integration**. 3. In the **Create a new app integration** dialog, select **SAML 2.0**. - ![ArangoGraph Create Okta App Integration](../../../../images/arangograph-okta-create-integration.png) + ![ArangoGraph Create Okta App Integration](../../../images/arangograph-okta-create-integration.png) 4. In the **General Settings**, specify a name for your integration and click **Next**. - ![ArangoGraph Okta Integration Name](../../../../images/arangograph-okta-integration-name.png) + ![ArangoGraph Okta Integration Name](../../../images/arangograph-okta-integration-name.png) 5. Configure the SAML settings: - For **Single sign-on URL**, use `https://auth.arangodb.com/login/callback?connection=ORG_ID` - For **Audience URI (SP Entity ID)**, use `urn:auth0:arangodb:ORG_ID` - ![ArangoGraph Okta SAML General Settings](../../../../images/arangograph-okta-saml-general-settings.png) + ![ArangoGraph Okta SAML General Settings](../../../images/arangograph-okta-saml-general-settings.png) 6. Replace **ORG_ID** with your organization identifier from the ArangoGraph Dashboard. To find your organization ID, go to the **User Toolbar** @@ -68,7 +68,7 @@ Provider (IdP). For more information about Okta, please refer to the - `https://auth.arangodb.com/login/callback?connection=14587062` - `urn:auth0:arangodb:14587062` - ![ArangoGraph Organization ID](../../../../images/arangograph-organization-id.png) + ![ArangoGraph Organization ID](../../../images/arangograph-organization-id.png) 7. In the **Attribute Statements** section, add custom attributes as seen in the image below: - email: `user.email` - given_name: `user.firstName` @@ -79,7 +79,7 @@ Provider (IdP). For more information about Okta, please refer to the Okta attribute names. The values of these attributes are automatically filled in based on the users list that is defined in Okta. - ![ArangoGraph Okta SAML Attributes](../../../../images/arangograph-okta-saml-attributes.png) + ![ArangoGraph Okta SAML Attributes](../../../images/arangograph-okta-saml-attributes.png) 8. Click **Next**. 9. In the **Configure feedback** section, select **I'm an Okta customer adding an internal app**. 10. Click **Finish**. The SAML app integration is now created. @@ -92,7 +92,7 @@ the SSO configuration. 1. Go to the **SAML Signing Certificates** section, displayed under the **Sign On** tab. 2. Click **View SAML setup instructions**. - ![ArangoGraph Okta SAML Setup](../../../../images/arangograph-okta-saml-setup.png) + ![ArangoGraph Okta SAML Setup](../../../images/arangograph-okta-saml-setup.png) 3. The setup instructions include the following items: - **Identity Provider Single Sign-On URL** - **Identity Provider Issuer** diff --git a/site/content/3.12/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md b/site/content/amp/security-and-access-control/single-sign-on/scim-provisioning.md similarity index 97% rename from site/content/3.12/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md rename to site/content/amp/security-and-access-control/single-sign-on/scim-provisioning.md index 8cf40b8009..8fc8f15289 100644 --- a/site/content/3.12/arangograph/security-and-access-control/single-sign-on/scim-provisioning.md +++ b/site/content/amp/security-and-access-control/single-sign-on/scim-provisioning.md @@ -67,7 +67,7 @@ supports the SCIM provisioning feature. for the account that handles the SCIM actions - in this case ArangoGraph. 7. Go to the ArangoGraph Dashboard and create a new API key ID and Secret. - ![ArangoGraph Create new API key](../../../../images/arangograph-okta-api-key.png) + ![ArangoGraph Create new API key](../../../images/arangograph-okta-api-key.png) Make sure to select one organization from the list and do not set any value in the **Time to live** field. For more information, diff --git a/site/content/3.12/arangograph/security-and-access-control/x-509-certificates.md b/site/content/amp/security-and-access-control/x-509-certificates.md similarity index 94% rename from site/content/3.12/arangograph/security-and-access-control/x-509-certificates.md rename to site/content/amp/security-and-access-control/x-509-certificates.md index d8d694a139..d0890e2738 100644 --- a/site/content/3.12/arangograph/security-and-access-control/x-509-certificates.md +++ b/site/content/amp/security-and-access-control/x-509-certificates.md @@ -116,7 +116,7 @@ the self-signed certificate as Subject Alternative Name (SAN). - The **tag** icon to make the certificate the new default. - The **recycle bin** icon to delete a certificate. -![ArangoGraph Create New Certificate](../../../images/arangograph-new-certificate.png) +![ArangoGraph Create New Certificate](../../images/arangograph-new-certificate.png) ## How to install a certificate @@ -130,9 +130,9 @@ well. This operation varies between operating systems. To install a self-signed certificate on your local machine, open the certificate and follow the installation instructions. -![ArangoGraph Certificates](../../../images/arangograph-cert-page-with-cert-present.png) +![ArangoGraph Certificates](../../images/arangograph-cert-page-with-cert-present.png) -![ArangoGraph Certificate Install Instructions](../../../images/arangograph-cert-install-instructions.png) +![ArangoGraph Certificate Install Instructions](../../images/arangograph-cert-install-instructions.png) You can also extract the information from all certificates in the chain using the `openssl` tool. @@ -152,7 +152,7 @@ unique ID that is part of your ArangoGraph deployment endpoint URL. ## How to connect to your application -[ArangoDB drivers](../../develop/drivers/_index.md), also called connectors, allow you to +[ArangoDB drivers](../../arangodb/3.12/develop/drivers/_index.md), also called connectors, allow you to easily connect ArangoGraph deployments to your application. 1. Navigate to **Deployments** and click the **View** button to show the @@ -162,7 +162,7 @@ easily connect ArangoGraph deployments to your application. 4. Follow the examples to connect a driver to your deployment. They include code examples on how to use certificates in your application. -![ArangoGraph Connecting Drivers](../../../images/arangograph-connecting-drivers.png) +![ArangoGraph Connecting Drivers](../../images/arangograph-connecting-drivers.png) ## Certificate Rotation diff --git a/site/content/3.10/_index.md b/site/content/arangodb/3.10/_index.md similarity index 82% rename from site/content/3.10/_index.md rename to site/content/arangodb/3.10/_index.md index dee4818818..5322d252a7 100644 --- a/site/content/3.10/_index.md +++ b/site/content/arangodb/3.10/_index.md @@ -1,14 +1,14 @@ --- title: Recommended Resources menuTitle: '3.10' -weight: 0 +weight: 1 layout: default --- {{< cloudbanner >}} {{< cards >}} -{{% card title="What is ArangoDB?" link="about-arangodb/" %}} +{{% card title="What is ArangoDB?" link="about/" %}} Get to know graphs, ArangoDB's use cases and features. {{% /card %}} @@ -17,8 +17,8 @@ Learn about ArangoDB's core concepts, how to interact with the database system, and get a server instance up and running. {{% /card %}} -{{% card title="ArangoGraph Insights Platform" link="arangograph/" %}} -Try out ArangoDB's fully-managed cloud offering for a faster time to value. +{{% card title="Arango Managed Platform (AMP)" link="amp/" %}} +Try out Arango's fully-managed cloud offering for a faster time to value. {{% /card %}} {{% card title="AQL" link="aql/" %}} diff --git a/site/content/3.11/about-arangodb/_index.md b/site/content/arangodb/3.10/about/_index.md similarity index 82% rename from site/content/3.11/about-arangodb/_index.md rename to site/content/arangodb/3.10/about/_index.md index 9b96a70c37..62ade93bbb 100644 --- a/site/content/3.11/about-arangodb/_index.md +++ b/site/content/arangodb/3.10/about/_index.md @@ -9,7 +9,7 @@ aliases: - introduction - introduction/about-arangodb --- -![ArangoDB Overview Diagram](../../images/arangodb-overview-diagram.png) +![ArangoDB Overview Diagram](../../../images/arangodb-overview-diagram.png) ArangoDB combines the analytical power of native graphs with an integrated search engine, JSON support, and a variety of data access patterns via a single, @@ -17,25 +17,25 @@ composable query language. ArangoDB is available in an open-source and a commercial [edition](features/_index.md). You can use it for on-premises deployments, as well as a fully managed -cloud service, the [ArangoGraph Insights Platform](../arangograph/_index.md). +cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). ## What are Graphs? Graphs are information networks comprised of nodes and relations. -![Node - Relation - Node](../../images/data-model-graph-relation-abstract.png) +![Node - Relation - Node](../../../images/data-model-graph-relation-abstract.png) A social network is a common example of a graph. People are represented by nodes and their friendships by relations. -![Mary - is friend of - John](../../images/data-model-graph-relation-concrete.png) +![Mary - is friend of - John](../../../images/data-model-graph-relation-concrete.png) Nodes are also called vertices (singular: vertex), and relations are edges that connect vertices. A vertex typically represents a specific entity (a person, a book, a sensor reading, etc.) and an edge defines how one entity relates to another. -![Mary - bought - Book, is friend of - John](../../images/data-model-graph-relations.png) +![Mary - bought - Book, is friend of - John](../../../images/data-model-graph-relations.png) This paradigm of storing data feels natural because it closely matches the cognitive model of humans. It is an expressive data model that allows you to @@ -48,7 +48,7 @@ Not everything is a graph use case. ArangoDB lets you equally work with structured, semi-structured, and unstructured data in the form of schema-free JSON objects, without having to connect these objects to form a graph. -![Person Mary, Book ArangoDB](../../images/data-model-document.png) +![Person Mary, Book ArangoDB](../../../images/data-model-document.png) <!-- TODO: Seems too disconnected, what is the relation? diff --git a/site/content/3.10/about-arangodb/features/_index.md b/site/content/arangodb/3.10/about/features/_index.md similarity index 98% rename from site/content/3.10/about-arangodb/features/_index.md rename to site/content/arangodb/3.10/about/features/_index.md index d33b990636..9094c1e174 100644 --- a/site/content/3.10/about-arangodb/features/_index.md +++ b/site/content/arangodb/3.10/about/features/_index.md @@ -13,7 +13,7 @@ aliases: ### Fully managed cloud service The fully managed multi-cloud -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is the easiest and fastest way to get started. It runs the Enterprise Edition of ArangoDB, lets you deploy clusters with just a few clicks, and is operated by a dedicated team of ArangoDB engineers day and night. You can choose from a @@ -27,7 +27,7 @@ variety of support plans to meet your needs. - Highly secure with encryption at transit and at rest - Includes elastic scalability for all deployment models (OneShard and Sharded clusters) -To learn more, go to the [ArangoGraph documentation](../../arangograph/_index.md). +To learn more, go to the [ArangoGraph documentation](../../../../amp/_index.md). ### Self-managed in the cloud diff --git a/site/content/3.10/about-arangodb/features/community-edition.md b/site/content/arangodb/3.10/about/features/community-edition.md similarity index 100% rename from site/content/3.10/about-arangodb/features/community-edition.md rename to site/content/arangodb/3.10/about/features/community-edition.md diff --git a/site/content/3.11/about-arangodb/features/enterprise-edition.md b/site/content/arangodb/3.10/about/features/enterprise-edition.md similarity index 98% rename from site/content/3.11/about-arangodb/features/enterprise-edition.md rename to site/content/arangodb/3.10/about/features/enterprise-edition.md index 8e962a4a34..166de7f4fd 100644 --- a/site/content/3.11/about-arangodb/features/enterprise-edition.md +++ b/site/content/arangodb/3.10/about/features/enterprise-edition.md @@ -73,7 +73,7 @@ features outlined below. For additional information, see ## Querying -- [**Pregel in Cluster**](../../data-science/pregel/_index.md#prerequisites): +- **Pregel in Cluster**](../../data-science/pregel/_index.md#prerequisites): Distributed iterative graph analytics for cluster deployments. - [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): diff --git a/site/content/3.10/about-arangodb/features/highlights-by-version.md b/site/content/arangodb/3.10/about/features/highlights-by-version.md similarity index 100% rename from site/content/3.10/about-arangodb/features/highlights-by-version.md rename to site/content/arangodb/3.10/about/features/highlights-by-version.md diff --git a/site/content/3.13/about-arangodb/use-cases.md b/site/content/arangodb/3.10/about/use-cases.md similarity index 77% rename from site/content/3.13/about-arangodb/use-cases.md rename to site/content/arangodb/3.10/about/use-cases.md index fab9e86a90..0128025595 100644 --- a/site/content/3.13/about-arangodb/use-cases.md +++ b/site/content/arangodb/3.10/about/use-cases.md @@ -19,7 +19,7 @@ more. ### Fraud Detection -{{< image src="../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Uncover illegal activities by discovering difficult-to-detect patterns. ArangoDB lets you look beyond individual data points in disparate data sources, @@ -29,7 +29,7 @@ complex fraudulent behavior such as fraud rings. ### Recommendation Engine -{{< image src="../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Suggest products, services, and information to users based on data relationships. For example, you can use ArangoDB together with PyTorch Geometric to build a @@ -39,7 +39,7 @@ with a graph neural network (GNN). ### Network Management -{{< image src="../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Reduce downtime by connecting and visualizing network, infrastructure, and code. Network devices and how they interconnect can naturally be modeled as a graph. @@ -49,7 +49,7 @@ bandwidth into account when path-finding. ### Customer 360 -{{< image src="../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Gain a complete understanding of your customers by integrating multiple data sources and code. ArangoDB can act as the platform to merge and consolidate @@ -58,7 +58,7 @@ track data origins using graph features. ### Identity and Access Management -{{< image src="../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Increase security and compliance by managing data access based on role and position. You can map out an organization chart as a graph and use ArangoDB to @@ -68,7 +68,7 @@ inheritance. ### Supply Chain -{{< image src="../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Speed shipments by monitoring and optimizing the flow of goods through a supply chain. You can represent your inventory, supplier, and delivery @@ -84,7 +84,7 @@ and scalable data store. ### Content Management -{{< image src="../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Store information of any kind without upfront schema declaration. ArangoDB is schema-free, storing every data record as a self-contained document, allowing @@ -93,7 +93,7 @@ content management system on top of ArangoDB. ### E-Commerce Systems -{{< image src="../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB combines data modeling freedom with strong consistency and resilience features to power online shops and ordering systems. Handle product catalog data @@ -102,7 +102,7 @@ checkouts with the necessary transactional guarantees. ### Internet of Things -{{< image src="../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Collect sensor readings and other IoT data in ArangoDB for a single view of everything. Store all data points in the same system that also lets you run @@ -110,7 +110,7 @@ aggregation queries using sliding windows for efficient data analysis. ## ArangoDB as a Key-Value Database -{{< image src="../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Key-value stores are the simplest kind of database systems. Each record is stored as a block of data under a key that uniquely identifies the record. @@ -134,7 +134,7 @@ For more information about how ArangoDB persists data, see ## ArangoDB as a Search Engine -{{< image src="../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB has a natively integrated search engine for a broad range of information retrieval needs. It is powered by inverted indexes and can index @@ -161,4 +161,4 @@ ArangoDB integrates well into existing data infrastructures and provides connectors for popular machine learning frameworks and data processing ecosystems. -![Machine Learning Architecture of ArangoDB](../../images/machine-learning-architecture.png) +![Machine Learning Architecture of ArangoDB](../../../images/machine-learning-architecture.png) diff --git a/site/content/3.10/aql/_index.md b/site/content/arangodb/3.10/aql/_index.md similarity index 100% rename from site/content/3.10/aql/_index.md rename to site/content/arangodb/3.10/aql/_index.md diff --git a/site/content/3.10/aql/common-errors.md b/site/content/arangodb/3.10/aql/common-errors.md similarity index 100% rename from site/content/3.10/aql/common-errors.md rename to site/content/arangodb/3.10/aql/common-errors.md diff --git a/site/content/3.10/aql/data-queries.md b/site/content/arangodb/3.10/aql/data-queries.md similarity index 100% rename from site/content/3.10/aql/data-queries.md rename to site/content/arangodb/3.10/aql/data-queries.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/_index.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/_index.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/_index.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/_index.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/counting.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/counting.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/counting.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/counting.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/create-test-data.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/create-test-data.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/create-test-data.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/create-test-data.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/diffing-two-documents.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/diffing-two-documents.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/diffing-two-documents.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/diffing-two-documents.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/dynamic-attribute-names.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/dynamic-attribute-names.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/dynamic-attribute-names.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/dynamic-attribute-names.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/grouping.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/grouping.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/grouping.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/grouping.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/joins.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/joins.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/joins.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/joins.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/projections-and-filters.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/projections-and-filters.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/projections-and-filters.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/projections-and-filters.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/queries-without-collections.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/queries-without-collections.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/queries-without-collections.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/queries-without-collections.md diff --git a/site/content/3.10/aql/examples-and-query-patterns/remove-vertex.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/remove-vertex.md similarity index 96% rename from site/content/3.10/aql/examples-and-query-patterns/remove-vertex.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/remove-vertex.md index 60a845ad94..e80cf8f390 100644 --- a/site/content/3.10/aql/examples-and-query-patterns/remove-vertex.md +++ b/site/content/arangodb/3.10/aql/examples-and-query-patterns/remove-vertex.md @@ -15,7 +15,7 @@ However, as shown in this example based on the [Knows Graph](../../graphs/example-graphs.md#knows-graph), a query for this use case can be created. -![Example Graph](../../../images/knows_graph.png) +![Example Graph](../../../../images/knows_graph.png) When deleting vertex **eve** from the graph, we also want the edges `eve -> alice` and `eve -> bob` to be removed. @@ -59,7 +59,7 @@ For example, the [City Graph](../../graphs/example-graphs.md#city-graph) contains several vertex collections - `germanCity` and `frenchCity` and several edge collections - `french / german / international Highway`. -![Example Graph2](../../../images/cities_graph.png) +![Example Graph2](../../../../images/cities_graph.png) To delete city **Berlin** all edge collections `french / german / international Highway` have to be considered. The **REMOVE** operation has to be applied on all edge diff --git a/site/content/3.10/aql/examples-and-query-patterns/traversals.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/traversals.md similarity index 98% rename from site/content/3.10/aql/examples-and-query-patterns/traversals.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/traversals.md index 3b9452edbc..4a484699b1 100644 --- a/site/content/3.10/aql/examples-and-query-patterns/traversals.md +++ b/site/content/arangodb/3.10/aql/examples-and-query-patterns/traversals.md @@ -10,7 +10,7 @@ description: >- Our first example will locate the start vertex for a graph traversal via [a geo index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). We use the [City Graph](../../graphs/example-graphs.md#city-graph) and its geo indexes: -![Cities Example Graph](../../../images/cities_graph.png) +![Cities Example Graph](../../../../images/cities_graph.png) ```js --- diff --git a/site/content/3.10/aql/examples-and-query-patterns/upsert-repsert-guide.md b/site/content/arangodb/3.10/aql/examples-and-query-patterns/upsert-repsert-guide.md similarity index 100% rename from site/content/3.10/aql/examples-and-query-patterns/upsert-repsert-guide.md rename to site/content/arangodb/3.10/aql/examples-and-query-patterns/upsert-repsert-guide.md diff --git a/site/content/3.10/aql/execution-and-performance/_index.md b/site/content/arangodb/3.10/aql/execution-and-performance/_index.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/_index.md rename to site/content/arangodb/3.10/aql/execution-and-performance/_index.md diff --git a/site/content/3.10/aql/execution-and-performance/caching-query-results.md b/site/content/arangodb/3.10/aql/execution-and-performance/caching-query-results.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/caching-query-results.md rename to site/content/arangodb/3.10/aql/execution-and-performance/caching-query-results.md diff --git a/site/content/3.10/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.10/aql/execution-and-performance/explaining-queries.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/explaining-queries.md rename to site/content/arangodb/3.10/aql/execution-and-performance/explaining-queries.md diff --git a/site/content/3.10/aql/execution-and-performance/parsing-queries.md b/site/content/arangodb/3.10/aql/execution-and-performance/parsing-queries.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/parsing-queries.md rename to site/content/arangodb/3.10/aql/execution-and-performance/parsing-queries.md diff --git a/site/content/3.10/aql/execution-and-performance/query-optimization.md b/site/content/arangodb/3.10/aql/execution-and-performance/query-optimization.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/query-optimization.md rename to site/content/arangodb/3.10/aql/execution-and-performance/query-optimization.md diff --git a/site/content/3.10/aql/execution-and-performance/query-profiling.md b/site/content/arangodb/3.10/aql/execution-and-performance/query-profiling.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/query-profiling.md rename to site/content/arangodb/3.10/aql/execution-and-performance/query-profiling.md diff --git a/site/content/3.10/aql/execution-and-performance/query-statistics.md b/site/content/arangodb/3.10/aql/execution-and-performance/query-statistics.md similarity index 100% rename from site/content/3.10/aql/execution-and-performance/query-statistics.md rename to site/content/arangodb/3.10/aql/execution-and-performance/query-statistics.md diff --git a/site/content/3.10/aql/functions/_index.md b/site/content/arangodb/3.10/aql/functions/_index.md similarity index 100% rename from site/content/3.10/aql/functions/_index.md rename to site/content/arangodb/3.10/aql/functions/_index.md diff --git a/site/content/3.10/aql/functions/arangosearch.md b/site/content/arangodb/3.10/aql/functions/arangosearch.md similarity index 100% rename from site/content/3.10/aql/functions/arangosearch.md rename to site/content/arangodb/3.10/aql/functions/arangosearch.md diff --git a/site/content/3.10/aql/functions/array.md b/site/content/arangodb/3.10/aql/functions/array.md similarity index 100% rename from site/content/3.10/aql/functions/array.md rename to site/content/arangodb/3.10/aql/functions/array.md diff --git a/site/content/3.10/aql/functions/bit.md b/site/content/arangodb/3.10/aql/functions/bit.md similarity index 100% rename from site/content/3.10/aql/functions/bit.md rename to site/content/arangodb/3.10/aql/functions/bit.md diff --git a/site/content/3.10/aql/functions/date.md b/site/content/arangodb/3.10/aql/functions/date.md similarity index 100% rename from site/content/3.10/aql/functions/date.md rename to site/content/arangodb/3.10/aql/functions/date.md diff --git a/site/content/3.10/aql/functions/document-object.md b/site/content/arangodb/3.10/aql/functions/document-object.md similarity index 100% rename from site/content/3.10/aql/functions/document-object.md rename to site/content/arangodb/3.10/aql/functions/document-object.md diff --git a/site/content/3.10/aql/functions/fulltext.md b/site/content/arangodb/3.10/aql/functions/fulltext.md similarity index 100% rename from site/content/3.10/aql/functions/fulltext.md rename to site/content/arangodb/3.10/aql/functions/fulltext.md diff --git a/site/content/3.10/aql/functions/geo.md b/site/content/arangodb/3.10/aql/functions/geo.md similarity index 99% rename from site/content/3.10/aql/functions/geo.md rename to site/content/arangodb/3.10/aql/functions/geo.md index b35d8c375b..d07563f6c6 100644 --- a/site/content/3.10/aql/functions/geo.md +++ b/site/content/arangodb/3.10/aql/functions/geo.md @@ -322,7 +322,7 @@ Consider the following polygon (remember that GeoJSON has ]] } ``` -![GeoJSON Polygon Geodesic](../../../images/geojson-polygon-geodesic.webp) +![GeoJSON Polygon Geodesic](../../../../images/geojson-polygon-geodesic.webp) It does not contain the point `[10, 47]` since the shortest path (geodesic) from `[4, 47]` to `[16, 47]` lies North relative to the parallel of latitude at @@ -359,7 +359,7 @@ Pole. ]] } ``` -![GeoJSON Polygon Counter-clockwise](../../../images/geojson-polygon-ccw.webp) +![GeoJSON Polygon Counter-clockwise](../../../../images/geojson-polygon-ccw.webp) On the other hand, the following polygon travels **clockwise** around the point `[10, 50]`, and thus its "interior" does not contain `[10, 50]`, but does @@ -371,7 +371,7 @@ contain the North Pole and the South Pole: ]] } ``` -![GeoJSON Polygon Clockwise](../../../images/geojson-polygon-cw.webp) +![GeoJSON Polygon Clockwise](../../../../images/geojson-polygon-cw.webp) Remember that the "interior" is to the left of the given linear ring, so this second polygon is basically the complement on Earth diff --git a/site/content/3.10/aql/functions/miscellaneous.md b/site/content/arangodb/3.10/aql/functions/miscellaneous.md similarity index 100% rename from site/content/3.10/aql/functions/miscellaneous.md rename to site/content/arangodb/3.10/aql/functions/miscellaneous.md diff --git a/site/content/3.10/aql/functions/numeric.md b/site/content/arangodb/3.10/aql/functions/numeric.md similarity index 100% rename from site/content/3.10/aql/functions/numeric.md rename to site/content/arangodb/3.10/aql/functions/numeric.md diff --git a/site/content/3.10/aql/functions/string.md b/site/content/arangodb/3.10/aql/functions/string.md similarity index 100% rename from site/content/3.10/aql/functions/string.md rename to site/content/arangodb/3.10/aql/functions/string.md diff --git a/site/content/3.10/aql/functions/type-check-and-cast.md b/site/content/arangodb/3.10/aql/functions/type-check-and-cast.md similarity index 100% rename from site/content/3.10/aql/functions/type-check-and-cast.md rename to site/content/arangodb/3.10/aql/functions/type-check-and-cast.md diff --git a/site/content/3.10/aql/fundamentals/_index.md b/site/content/arangodb/3.10/aql/fundamentals/_index.md similarity index 100% rename from site/content/3.10/aql/fundamentals/_index.md rename to site/content/arangodb/3.10/aql/fundamentals/_index.md diff --git a/site/content/3.10/aql/fundamentals/accessing-data-from-collections.md b/site/content/arangodb/3.10/aql/fundamentals/accessing-data-from-collections.md similarity index 100% rename from site/content/3.10/aql/fundamentals/accessing-data-from-collections.md rename to site/content/arangodb/3.10/aql/fundamentals/accessing-data-from-collections.md diff --git a/site/content/3.10/aql/fundamentals/bind-parameters.md b/site/content/arangodb/3.10/aql/fundamentals/bind-parameters.md similarity index 100% rename from site/content/3.10/aql/fundamentals/bind-parameters.md rename to site/content/arangodb/3.10/aql/fundamentals/bind-parameters.md diff --git a/site/content/3.10/aql/fundamentals/data-types.md b/site/content/arangodb/3.10/aql/fundamentals/data-types.md similarity index 100% rename from site/content/3.10/aql/fundamentals/data-types.md rename to site/content/arangodb/3.10/aql/fundamentals/data-types.md diff --git a/site/content/3.10/aql/fundamentals/limitations.md b/site/content/arangodb/3.10/aql/fundamentals/limitations.md similarity index 100% rename from site/content/3.10/aql/fundamentals/limitations.md rename to site/content/arangodb/3.10/aql/fundamentals/limitations.md diff --git a/site/content/3.10/aql/fundamentals/query-errors.md b/site/content/arangodb/3.10/aql/fundamentals/query-errors.md similarity index 100% rename from site/content/3.10/aql/fundamentals/query-errors.md rename to site/content/arangodb/3.10/aql/fundamentals/query-errors.md diff --git a/site/content/3.10/aql/fundamentals/query-results.md b/site/content/arangodb/3.10/aql/fundamentals/query-results.md similarity index 100% rename from site/content/3.10/aql/fundamentals/query-results.md rename to site/content/arangodb/3.10/aql/fundamentals/query-results.md diff --git a/site/content/3.10/aql/fundamentals/subqueries.md b/site/content/arangodb/3.10/aql/fundamentals/subqueries.md similarity index 100% rename from site/content/3.10/aql/fundamentals/subqueries.md rename to site/content/arangodb/3.10/aql/fundamentals/subqueries.md diff --git a/site/content/3.10/aql/fundamentals/syntax.md b/site/content/arangodb/3.10/aql/fundamentals/syntax.md similarity index 100% rename from site/content/3.10/aql/fundamentals/syntax.md rename to site/content/arangodb/3.10/aql/fundamentals/syntax.md diff --git a/site/content/3.10/aql/fundamentals/type-and-value-order.md b/site/content/arangodb/3.10/aql/fundamentals/type-and-value-order.md similarity index 100% rename from site/content/3.10/aql/fundamentals/type-and-value-order.md rename to site/content/arangodb/3.10/aql/fundamentals/type-and-value-order.md diff --git a/site/content/3.10/aql/graphs/_index.md b/site/content/arangodb/3.10/aql/graphs/_index.md similarity index 100% rename from site/content/3.10/aql/graphs/_index.md rename to site/content/arangodb/3.10/aql/graphs/_index.md diff --git a/site/content/3.10/aql/graphs/all-shortest-paths.md b/site/content/arangodb/3.10/aql/graphs/all-shortest-paths.md similarity index 98% rename from site/content/3.10/aql/graphs/all-shortest-paths.md rename to site/content/arangodb/3.10/aql/graphs/all-shortest-paths.md index 1dc67cc001..d904c5eca1 100644 --- a/site/content/3.10/aql/graphs/all-shortest-paths.md +++ b/site/content/arangodb/3.10/aql/graphs/all-shortest-paths.md @@ -19,7 +19,7 @@ Every returned path is a JSON object with two attributes: A visual representation of the example graph: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the vertices of the graph. Arrows represent train connections @@ -105,7 +105,7 @@ direction for each collection in your path search. Load an example graph to get a named graph that reflects some possible train connections in Europe and North America: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.10/aql/graphs/k-paths.md b/site/content/arangodb/3.10/aql/graphs/k-paths.md similarity index 98% rename from site/content/3.10/aql/graphs/k-paths.md rename to site/content/arangodb/3.10/aql/graphs/k-paths.md index d7e6aabe2a..fb12340f1f 100644 --- a/site/content/3.10/aql/graphs/k-paths.md +++ b/site/content/arangodb/3.10/aql/graphs/k-paths.md @@ -22,7 +22,7 @@ Every such path will be returned as a JSON object with two components: Let us take a look at a simple example to explain how it works. This is the graph that we are going to find some paths on: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the vertices of the graph. Arrows represent train connections @@ -181,7 +181,7 @@ direction for each collection in your path search. We load an example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.10/aql/graphs/k-shortest-paths.md b/site/content/arangodb/3.10/aql/graphs/k-shortest-paths.md similarity index 98% rename from site/content/3.10/aql/graphs/k-shortest-paths.md rename to site/content/arangodb/3.10/aql/graphs/k-shortest-paths.md index bb2ba93017..1672e24738 100644 --- a/site/content/3.10/aql/graphs/k-shortest-paths.md +++ b/site/content/arangodb/3.10/aql/graphs/k-shortest-paths.md @@ -27,7 +27,7 @@ If no `weightAttribute` is given, the weight of the path is just its length. Let us take a look at a simple example to explain how it works. This is the graph that we are going to find some shortest path on: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the vertices of the graph. Arrows represent train connections @@ -169,7 +169,7 @@ direction for each collection in your path search. We load an example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.10/aql/graphs/shortest-path.md b/site/content/arangodb/3.10/aql/graphs/shortest-path.md similarity index 98% rename from site/content/3.10/aql/graphs/shortest-path.md rename to site/content/arangodb/3.10/aql/graphs/shortest-path.md index 29d689422b..87df80b3eb 100644 --- a/site/content/3.10/aql/graphs/shortest-path.md +++ b/site/content/arangodb/3.10/aql/graphs/shortest-path.md @@ -20,7 +20,7 @@ path you will get a result in form of a set with two items: Let's take a look at a simple example to explain how it works. This is the graph that you are going to find a shortest path on: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) You can use the following parameters for the query: @@ -132,7 +132,7 @@ collections you expect to be involved. ## Examples Creating a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.10/aql/graphs/traversals-explained.md b/site/content/arangodb/3.10/aql/graphs/traversals-explained.md similarity index 83% rename from site/content/3.10/aql/graphs/traversals-explained.md rename to site/content/arangodb/3.10/aql/graphs/traversals-explained.md index a211ae6087..b4e9741151 100644 --- a/site/content/3.10/aql/graphs/traversals-explained.md +++ b/site/content/arangodb/3.10/aql/graphs/traversals-explained.md @@ -31,7 +31,7 @@ set with three items: Let's take a look at a simple example to explain how it works. This is the graph that we are going to traverse: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) We use the following parameters for our query: @@ -40,39 +40,39 @@ We use the following parameters for our query: 3. We use a *max* depth of 2. 4. We follow only in `OUTBOUND` direction of edges -![traversal graph step 1](../../../images/traversal_graph1.png) +![traversal graph step 1](../../../../images/traversal_graph1.png) Now it walks to one of the direct neighbors of **A**, say **B** (note: ordering is not guaranteed!): -![traversal graph step 2](../../../images/traversal_graph2.png) +![traversal graph step 2](../../../../images/traversal_graph2.png) The query will remember the state (red circle) and will emit the first result **A** → **B** (black box). This will also prevent the traverser to be trapped in cycles. Now again it will visit one of the direct neighbors of **B**, say **E**: -![traversal graph step 3](../../../images/traversal_graph3.png) +![traversal graph step 3](../../../../images/traversal_graph3.png) We have limited the query with a *max* depth of *2*, so it will not pick any neighbor of **E**, as the path from **A** to **E** already requires *2* steps. Instead, we will go back one level to **B** and continue with any other direct neighbor there: -![traversal graph step 4](../../../images/traversal_graph4.png) +![traversal graph step 4](../../../../images/traversal_graph4.png) Again after we produced this result we will step back to **B**. But there is no neighbor of **B** left that we have not yet visited. Hence we go another step back to **A** and continue with any other neighbor there. -![traversal graph step 5](../../../images/traversal_graph5.png) +![traversal graph step 5](../../../../images/traversal_graph5.png) And identical to the iterations before we will visit **H**: -![traversal graph step 6](../../../images/traversal_graph6.png) +![traversal graph step 6](../../../../images/traversal_graph6.png) And **J**: -![traversal graph step 7](../../../images/traversal_graph7.png) +![traversal graph step 7](../../../../images/traversal_graph7.png) After these steps there is no further result left. So all together this query has returned the following paths: diff --git a/site/content/3.10/aql/graphs/traversals.md b/site/content/arangodb/3.10/aql/graphs/traversals.md similarity index 99% rename from site/content/3.10/aql/graphs/traversals.md rename to site/content/arangodb/3.10/aql/graphs/traversals.md index 283703f0b7..08d18ddfa6 100644 --- a/site/content/3.10/aql/graphs/traversals.md +++ b/site/content/arangodb/3.10/aql/graphs/traversals.md @@ -258,7 +258,7 @@ FOR v, e, p IN 0..10 OUTBOUND "places/Toronto" GRAPH "kShortestPathsGraph" The above example shows a graph traversal using a [train station and connections dataset](../../graphs/example-graphs.md#k-shortest-paths-graph): -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) The traversal starts at **Toronto** (bottom left), the traversal depth is limited to 10, and every station is only visited once. The traversal could @@ -606,7 +606,7 @@ you may be interested in documents further down the path. Create a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.10/aql/high-level-operations/_index.md b/site/content/arangodb/3.10/aql/high-level-operations/_index.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/_index.md rename to site/content/arangodb/3.10/aql/high-level-operations/_index.md diff --git a/site/content/3.10/aql/high-level-operations/collect.md b/site/content/arangodb/3.10/aql/high-level-operations/collect.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/collect.md rename to site/content/arangodb/3.10/aql/high-level-operations/collect.md diff --git a/site/content/3.10/aql/high-level-operations/filter.md b/site/content/arangodb/3.10/aql/high-level-operations/filter.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/filter.md rename to site/content/arangodb/3.10/aql/high-level-operations/filter.md diff --git a/site/content/3.10/aql/high-level-operations/for.md b/site/content/arangodb/3.10/aql/high-level-operations/for.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/for.md rename to site/content/arangodb/3.10/aql/high-level-operations/for.md diff --git a/site/content/3.10/aql/high-level-operations/insert.md b/site/content/arangodb/3.10/aql/high-level-operations/insert.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/insert.md rename to site/content/arangodb/3.10/aql/high-level-operations/insert.md diff --git a/site/content/3.10/aql/high-level-operations/let.md b/site/content/arangodb/3.10/aql/high-level-operations/let.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/let.md rename to site/content/arangodb/3.10/aql/high-level-operations/let.md diff --git a/site/content/3.10/aql/high-level-operations/limit.md b/site/content/arangodb/3.10/aql/high-level-operations/limit.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/limit.md rename to site/content/arangodb/3.10/aql/high-level-operations/limit.md diff --git a/site/content/3.10/aql/high-level-operations/remove.md b/site/content/arangodb/3.10/aql/high-level-operations/remove.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/remove.md rename to site/content/arangodb/3.10/aql/high-level-operations/remove.md diff --git a/site/content/3.10/aql/high-level-operations/replace.md b/site/content/arangodb/3.10/aql/high-level-operations/replace.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/replace.md rename to site/content/arangodb/3.10/aql/high-level-operations/replace.md diff --git a/site/content/3.10/aql/high-level-operations/return.md b/site/content/arangodb/3.10/aql/high-level-operations/return.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/return.md rename to site/content/arangodb/3.10/aql/high-level-operations/return.md diff --git a/site/content/3.10/aql/high-level-operations/search.md b/site/content/arangodb/3.10/aql/high-level-operations/search.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/search.md rename to site/content/arangodb/3.10/aql/high-level-operations/search.md diff --git a/site/content/3.10/aql/high-level-operations/sort.md b/site/content/arangodb/3.10/aql/high-level-operations/sort.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/sort.md rename to site/content/arangodb/3.10/aql/high-level-operations/sort.md diff --git a/site/content/3.10/aql/high-level-operations/update.md b/site/content/arangodb/3.10/aql/high-level-operations/update.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/update.md rename to site/content/arangodb/3.10/aql/high-level-operations/update.md diff --git a/site/content/3.10/aql/high-level-operations/upsert.md b/site/content/arangodb/3.10/aql/high-level-operations/upsert.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/upsert.md rename to site/content/arangodb/3.10/aql/high-level-operations/upsert.md diff --git a/site/content/3.10/aql/high-level-operations/window.md b/site/content/arangodb/3.10/aql/high-level-operations/window.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/window.md rename to site/content/arangodb/3.10/aql/high-level-operations/window.md diff --git a/site/content/3.10/aql/high-level-operations/with.md b/site/content/arangodb/3.10/aql/high-level-operations/with.md similarity index 100% rename from site/content/3.10/aql/high-level-operations/with.md rename to site/content/arangodb/3.10/aql/high-level-operations/with.md diff --git a/site/content/3.10/aql/how-to-invoke-aql/_index.md b/site/content/arangodb/3.10/aql/how-to-invoke-aql/_index.md similarity index 100% rename from site/content/3.10/aql/how-to-invoke-aql/_index.md rename to site/content/arangodb/3.10/aql/how-to-invoke-aql/_index.md diff --git a/site/content/3.10/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md similarity index 100% rename from site/content/3.10/aql/how-to-invoke-aql/with-arangosh.md rename to site/content/arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md diff --git a/site/content/3.10/aql/how-to-invoke-aql/with-the-web-interface.md b/site/content/arangodb/3.10/aql/how-to-invoke-aql/with-the-web-interface.md similarity index 100% rename from site/content/3.10/aql/how-to-invoke-aql/with-the-web-interface.md rename to site/content/arangodb/3.10/aql/how-to-invoke-aql/with-the-web-interface.md diff --git a/site/content/3.10/aql/operators.md b/site/content/arangodb/3.10/aql/operators.md similarity index 100% rename from site/content/3.10/aql/operators.md rename to site/content/arangodb/3.10/aql/operators.md diff --git a/site/content/3.10/aql/user-defined-functions.md b/site/content/arangodb/3.10/aql/user-defined-functions.md similarity index 100% rename from site/content/3.10/aql/user-defined-functions.md rename to site/content/arangodb/3.10/aql/user-defined-functions.md diff --git a/site/content/3.10/components/_index.md b/site/content/arangodb/3.10/components/_index.md similarity index 100% rename from site/content/3.10/components/_index.md rename to site/content/arangodb/3.10/components/_index.md diff --git a/site/content/3.10/components/arangodb-server/_index.md b/site/content/arangodb/3.10/components/arangodb-server/_index.md similarity index 88% rename from site/content/3.10/components/arangodb-server/_index.md rename to site/content/arangodb/3.10/components/arangodb-server/_index.md index 82da2f3a5f..44c9d1040c 100644 --- a/site/content/3.10/components/arangodb-server/_index.md +++ b/site/content/arangodb/3.10/components/arangodb-server/_index.md @@ -14,8 +14,8 @@ The server process serves the various client connections to the server via the TCP/HTTP protocol. It also provides a [web interface](../web-interface/_index.md). _arangod_ can run in different modes for a variety of setups like single server -and clusters. It differs between the [Community Edition](../../about-arangodb/features/community-edition.md) -and [Enterprise Edition](../../about-arangodb/features/enterprise-edition.md). +and clusters. It differs between the [Community Edition](../../about/features/community-edition.md) +and [Enterprise Edition](../../about/features/enterprise-edition.md). See [Administration](../../operations/administration/_index.md) for server configuration and [Deploy](../../deploy/_index.md) for operation mode details. diff --git a/site/content/3.10/components/arangodb-server/environment-variables.md b/site/content/arangodb/3.10/components/arangodb-server/environment-variables.md similarity index 100% rename from site/content/3.10/components/arangodb-server/environment-variables.md rename to site/content/arangodb/3.10/components/arangodb-server/environment-variables.md diff --git a/site/content/3.10/components/arangodb-server/ldap.md b/site/content/arangodb/3.10/components/arangodb-server/ldap.md similarity index 100% rename from site/content/3.10/components/arangodb-server/ldap.md rename to site/content/arangodb/3.10/components/arangodb-server/ldap.md diff --git a/site/content/3.10/components/arangodb-server/options.md b/site/content/arangodb/3.10/components/arangodb-server/options.md similarity index 100% rename from site/content/3.10/components/arangodb-server/options.md rename to site/content/arangodb/3.10/components/arangodb-server/options.md diff --git a/site/content/3.10/components/arangodb-server/storage-engine.md b/site/content/arangodb/3.10/components/arangodb-server/storage-engine.md similarity index 100% rename from site/content/3.10/components/arangodb-server/storage-engine.md rename to site/content/arangodb/3.10/components/arangodb-server/storage-engine.md diff --git a/site/content/3.10/components/tools/_index.md b/site/content/arangodb/3.10/components/tools/_index.md similarity index 94% rename from site/content/3.10/components/tools/_index.md rename to site/content/arangodb/3.10/components/tools/_index.md index a0d260bac0..82a6a260f5 100644 --- a/site/content/3.10/components/tools/_index.md +++ b/site/content/arangodb/3.10/components/tools/_index.md @@ -31,4 +31,4 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../arangograph/oasisctl/_index.md) | Command-line tool for managing the ArangoGraph Insights Platform +| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) diff --git a/site/content/3.10/components/tools/arangobackup/_index.md b/site/content/arangodb/3.10/components/tools/arangobackup/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangobackup/_index.md rename to site/content/arangodb/3.10/components/tools/arangobackup/_index.md diff --git a/site/content/3.10/components/tools/arangobackup/examples.md b/site/content/arangodb/3.10/components/tools/arangobackup/examples.md similarity index 100% rename from site/content/3.10/components/tools/arangobackup/examples.md rename to site/content/arangodb/3.10/components/tools/arangobackup/examples.md diff --git a/site/content/3.10/components/tools/arangobackup/options.md b/site/content/arangodb/3.10/components/tools/arangobackup/options.md similarity index 100% rename from site/content/3.10/components/tools/arangobackup/options.md rename to site/content/arangodb/3.10/components/tools/arangobackup/options.md diff --git a/site/content/3.10/components/tools/arangobench/_index.md b/site/content/arangodb/3.10/components/tools/arangobench/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangobench/_index.md rename to site/content/arangodb/3.10/components/tools/arangobench/_index.md diff --git a/site/content/3.10/components/tools/arangobench/options.md b/site/content/arangodb/3.10/components/tools/arangobench/options.md similarity index 100% rename from site/content/3.10/components/tools/arangobench/options.md rename to site/content/arangodb/3.10/components/tools/arangobench/options.md diff --git a/site/content/3.10/components/tools/arangodb-shell/_index.md b/site/content/arangodb/3.10/components/tools/arangodb-shell/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-shell/_index.md rename to site/content/arangodb/3.10/components/tools/arangodb-shell/_index.md diff --git a/site/content/3.10/components/tools/arangodb-shell/details.md b/site/content/arangodb/3.10/components/tools/arangodb-shell/details.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-shell/details.md rename to site/content/arangodb/3.10/components/tools/arangodb-shell/details.md diff --git a/site/content/3.10/components/tools/arangodb-shell/examples.md b/site/content/arangodb/3.10/components/tools/arangodb-shell/examples.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-shell/examples.md rename to site/content/arangodb/3.10/components/tools/arangodb-shell/examples.md diff --git a/site/content/3.10/components/tools/arangodb-shell/options.md b/site/content/arangodb/3.10/components/tools/arangodb-shell/options.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-shell/options.md rename to site/content/arangodb/3.10/components/tools/arangodb-shell/options.md diff --git a/site/content/3.10/components/tools/arangodb-starter/_index.md b/site/content/arangodb/3.10/components/tools/arangodb-starter/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-starter/_index.md rename to site/content/arangodb/3.10/components/tools/arangodb-starter/_index.md diff --git a/site/content/3.10/components/tools/arangodb-starter/architecture.md b/site/content/arangodb/3.10/components/tools/arangodb-starter/architecture.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-starter/architecture.md rename to site/content/arangodb/3.10/components/tools/arangodb-starter/architecture.md diff --git a/site/content/3.10/components/tools/arangodb-starter/options.md b/site/content/arangodb/3.10/components/tools/arangodb-starter/options.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-starter/options.md rename to site/content/arangodb/3.10/components/tools/arangodb-starter/options.md diff --git a/site/content/3.10/components/tools/arangodb-starter/security.md b/site/content/arangodb/3.10/components/tools/arangodb-starter/security.md similarity index 100% rename from site/content/3.10/components/tools/arangodb-starter/security.md rename to site/content/arangodb/3.10/components/tools/arangodb-starter/security.md diff --git a/site/content/3.10/components/tools/arangodump/_index.md b/site/content/arangodb/3.10/components/tools/arangodump/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangodump/_index.md rename to site/content/arangodb/3.10/components/tools/arangodump/_index.md diff --git a/site/content/3.10/components/tools/arangodump/examples.md b/site/content/arangodb/3.10/components/tools/arangodump/examples.md similarity index 100% rename from site/content/3.10/components/tools/arangodump/examples.md rename to site/content/arangodb/3.10/components/tools/arangodump/examples.md diff --git a/site/content/3.10/components/tools/arangodump/limitations.md b/site/content/arangodb/3.10/components/tools/arangodump/limitations.md similarity index 100% rename from site/content/3.10/components/tools/arangodump/limitations.md rename to site/content/arangodb/3.10/components/tools/arangodump/limitations.md diff --git a/site/content/3.10/components/tools/arangodump/maskings.md b/site/content/arangodb/3.10/components/tools/arangodump/maskings.md similarity index 100% rename from site/content/3.10/components/tools/arangodump/maskings.md rename to site/content/arangodb/3.10/components/tools/arangodump/maskings.md diff --git a/site/content/3.10/components/tools/arangodump/options.md b/site/content/arangodb/3.10/components/tools/arangodump/options.md similarity index 100% rename from site/content/3.10/components/tools/arangodump/options.md rename to site/content/arangodb/3.10/components/tools/arangodump/options.md diff --git a/site/content/3.10/components/tools/arangoexport/_index.md b/site/content/arangodb/3.10/components/tools/arangoexport/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangoexport/_index.md rename to site/content/arangodb/3.10/components/tools/arangoexport/_index.md diff --git a/site/content/3.10/components/tools/arangoexport/examples.md b/site/content/arangodb/3.10/components/tools/arangoexport/examples.md similarity index 100% rename from site/content/3.10/components/tools/arangoexport/examples.md rename to site/content/arangodb/3.10/components/tools/arangoexport/examples.md diff --git a/site/content/3.10/components/tools/arangoexport/options.md b/site/content/arangodb/3.10/components/tools/arangoexport/options.md similarity index 100% rename from site/content/3.10/components/tools/arangoexport/options.md rename to site/content/arangodb/3.10/components/tools/arangoexport/options.md diff --git a/site/content/3.10/components/tools/arangoimport/_index.md b/site/content/arangodb/3.10/components/tools/arangoimport/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangoimport/_index.md rename to site/content/arangodb/3.10/components/tools/arangoimport/_index.md diff --git a/site/content/3.10/components/tools/arangoimport/details.md b/site/content/arangodb/3.10/components/tools/arangoimport/details.md similarity index 100% rename from site/content/3.10/components/tools/arangoimport/details.md rename to site/content/arangodb/3.10/components/tools/arangoimport/details.md diff --git a/site/content/3.10/components/tools/arangoimport/examples-csv.md b/site/content/arangodb/3.10/components/tools/arangoimport/examples-csv.md similarity index 100% rename from site/content/3.10/components/tools/arangoimport/examples-csv.md rename to site/content/arangodb/3.10/components/tools/arangoimport/examples-csv.md diff --git a/site/content/3.10/components/tools/arangoimport/examples-json.md b/site/content/arangodb/3.10/components/tools/arangoimport/examples-json.md similarity index 100% rename from site/content/3.10/components/tools/arangoimport/examples-json.md rename to site/content/arangodb/3.10/components/tools/arangoimport/examples-json.md diff --git a/site/content/3.10/components/tools/arangoimport/options.md b/site/content/arangodb/3.10/components/tools/arangoimport/options.md similarity index 100% rename from site/content/3.10/components/tools/arangoimport/options.md rename to site/content/arangodb/3.10/components/tools/arangoimport/options.md diff --git a/site/content/3.10/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.10/components/tools/arangoinspect/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangoinspect/_index.md rename to site/content/arangodb/3.10/components/tools/arangoinspect/_index.md diff --git a/site/content/3.10/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.10/components/tools/arangoinspect/examples.md similarity index 100% rename from site/content/3.10/components/tools/arangoinspect/examples.md rename to site/content/arangodb/3.10/components/tools/arangoinspect/examples.md diff --git a/site/content/3.10/components/tools/arangoinspect/options.md b/site/content/arangodb/3.10/components/tools/arangoinspect/options.md similarity index 100% rename from site/content/3.10/components/tools/arangoinspect/options.md rename to site/content/arangodb/3.10/components/tools/arangoinspect/options.md diff --git a/site/content/3.10/components/tools/arangorestore/_index.md b/site/content/arangodb/3.10/components/tools/arangorestore/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangorestore/_index.md rename to site/content/arangodb/3.10/components/tools/arangorestore/_index.md diff --git a/site/content/3.10/components/tools/arangorestore/examples.md b/site/content/arangodb/3.10/components/tools/arangorestore/examples.md similarity index 100% rename from site/content/3.10/components/tools/arangorestore/examples.md rename to site/content/arangodb/3.10/components/tools/arangorestore/examples.md diff --git a/site/content/3.10/components/tools/arangorestore/fast-cluster-restore.md b/site/content/arangodb/3.10/components/tools/arangorestore/fast-cluster-restore.md similarity index 100% rename from site/content/3.10/components/tools/arangorestore/fast-cluster-restore.md rename to site/content/arangodb/3.10/components/tools/arangorestore/fast-cluster-restore.md diff --git a/site/content/3.10/components/tools/arangorestore/options.md b/site/content/arangodb/3.10/components/tools/arangorestore/options.md similarity index 100% rename from site/content/3.10/components/tools/arangorestore/options.md rename to site/content/arangodb/3.10/components/tools/arangorestore/options.md diff --git a/site/content/3.10/components/tools/arangovpack/_index.md b/site/content/arangodb/3.10/components/tools/arangovpack/_index.md similarity index 100% rename from site/content/3.10/components/tools/arangovpack/_index.md rename to site/content/arangodb/3.10/components/tools/arangovpack/_index.md diff --git a/site/content/3.10/components/tools/arangovpack/options.md b/site/content/arangodb/3.10/components/tools/arangovpack/options.md similarity index 100% rename from site/content/3.10/components/tools/arangovpack/options.md rename to site/content/arangodb/3.10/components/tools/arangovpack/options.md diff --git a/site/content/3.10/components/tools/foxx-cli/_index.md b/site/content/arangodb/3.10/components/tools/foxx-cli/_index.md similarity index 100% rename from site/content/3.10/components/tools/foxx-cli/_index.md rename to site/content/arangodb/3.10/components/tools/foxx-cli/_index.md diff --git a/site/content/3.10/components/tools/foxx-cli/details.md b/site/content/arangodb/3.10/components/tools/foxx-cli/details.md similarity index 100% rename from site/content/3.10/components/tools/foxx-cli/details.md rename to site/content/arangodb/3.10/components/tools/foxx-cli/details.md diff --git a/site/content/3.11/components/web-interface/_index.md b/site/content/arangodb/3.10/components/web-interface/_index.md similarity index 90% rename from site/content/3.11/components/web-interface/_index.md rename to site/content/arangodb/3.10/components/web-interface/_index.md index 12863abcb6..dc6affca41 100644 --- a/site/content/3.11/components/web-interface/_index.md +++ b/site/content/arangodb/3.10/components/web-interface/_index.md @@ -13,4 +13,4 @@ convenient way. Statistics and server status are provided as well. The web interface (also referred to as Web UI, frontend or *Aardvark*) can be accessed with a browser under the URL `http://localhost:8529` with default server settings. -![Standalone Web Interface](../../../images/overview.png) +![Standalone Web Interface](../../../../images/overview.png) diff --git a/site/content/3.10/components/web-interface/cluster.md b/site/content/arangodb/3.10/components/web-interface/cluster.md similarity index 94% rename from site/content/3.10/components/web-interface/cluster.md rename to site/content/arangodb/3.10/components/web-interface/cluster.md index 91ae4bd075..108ed759bb 100644 --- a/site/content/3.10/components/web-interface/cluster.md +++ b/site/content/arangodb/3.10/components/web-interface/cluster.md @@ -14,7 +14,7 @@ You can access the logs of individual Coordinators and DB-Servers via the The cluster section displays statistics about the general cluster performance. -![Cluster](../../../images/clusterView.png) +![Cluster](../../../../images/clusterView.png) Statistics: @@ -32,7 +32,7 @@ Statistics: The overview shows available and missing Coordinators and DB-Servers. -![Nodes](../../../images/nodesView.png) +![Nodes](../../../../images/nodesView.png) Functions: @@ -50,7 +50,7 @@ Information (Coordinator / DB-Servers): The shard section displays all available sharded collections. -![Shards](../../../images/shardsView.png) +![Shards](../../../../images/shardsView.png) Functions: diff --git a/site/content/3.10/components/web-interface/collections.md b/site/content/arangodb/3.10/components/web-interface/collections.md similarity index 91% rename from site/content/3.10/components/web-interface/collections.md rename to site/content/arangodb/3.10/components/web-interface/collections.md index d53138f83e..ad8e937e88 100644 --- a/site/content/3.10/components/web-interface/collections.md +++ b/site/content/arangodb/3.10/components/web-interface/collections.md @@ -8,7 +8,7 @@ The collections section displays all available collections. From here you can create new collections and jump into a collection for details (click on a collection tile). -![Collections](../../../images/collectionsView.png) +![Collections](../../../../images/collectionsView.png) Functions: @@ -26,7 +26,7 @@ Information: ## Collection -![Collection](../../../images/collectionView.png) +![Collection](../../../../images/collectionView.png) There are four view categories: diff --git a/site/content/3.10/components/web-interface/dashboard.md b/site/content/arangodb/3.10/components/web-interface/dashboard.md similarity index 92% rename from site/content/3.10/components/web-interface/dashboard.md rename to site/content/arangodb/3.10/components/web-interface/dashboard.md index aac4f439ae..599127ba12 100644 --- a/site/content/3.10/components/web-interface/dashboard.md +++ b/site/content/arangodb/3.10/components/web-interface/dashboard.md @@ -7,7 +7,7 @@ description: '' The **DASHBOARD** section provides statistics which are polled regularly from the ArangoDB server. -![Nodes](../../../images/dashboardView.png) +![Nodes](../../../../images/dashboardView.png) There is a different interface for [Cluster](cluster.md) deployments. diff --git a/site/content/3.11/components/web-interface/document.md b/site/content/arangodb/3.10/components/web-interface/document.md similarity index 87% rename from site/content/3.11/components/web-interface/document.md rename to site/content/arangodb/3.10/components/web-interface/document.md index 2ff9addb44..85cc5583a9 100644 --- a/site/content/3.11/components/web-interface/document.md +++ b/site/content/arangodb/3.10/components/web-interface/document.md @@ -6,7 +6,7 @@ description: '' --- The document section offers a editor which let you edit documents and edges of a collection. -![Document](../../../images/documentView.png) +![Document](../../../../images/documentView.png) Functions: diff --git a/site/content/3.10/components/web-interface/graphs.md b/site/content/arangodb/3.10/components/web-interface/graphs.md similarity index 95% rename from site/content/3.10/components/web-interface/graphs.md rename to site/content/arangodb/3.10/components/web-interface/graphs.md index 85e3affcc9..e43a66f9e2 100644 --- a/site/content/3.10/components/web-interface/graphs.md +++ b/site/content/arangodb/3.10/components/web-interface/graphs.md @@ -10,7 +10,7 @@ The *Graphs* tab provides a viewer facility for graph data stored in ArangoDB. It allows browsing ArangoDB graphs stored in the *_graphs* system collection or a graph consisting of an arbitrary vertex and [edge collection](../../concepts/data-models.md#graph-model). -![manage graphs](../../../images/graphsView.png) +![manage graphs](../../../../images/graphsView.png) Please note that the graph viewer requires canvas (optional: webgl) support in your browser. Especially Internet Explorer browsers older than version 9 @@ -18,7 +18,7 @@ are likely to not support this. ## Graph Viewer -![display graphs](../../../images/graphViewer.png) +![display graphs](../../../../images/graphViewer.png) Top Toolbar Functions: @@ -49,7 +49,7 @@ Edge Highlighting (right-mouse-click node): - Highlight all edges connected to the node (right-click at the background will remove highlighting) -![graph context menu](../../../images/graphViewerContextMenu.png) +![graph context menu](../../../../images/graphViewerContextMenu.png) ### Graph Viewer Options diff --git a/site/content/3.11/components/web-interface/logs.md b/site/content/arangodb/3.10/components/web-interface/logs.md similarity index 87% rename from site/content/3.11/components/web-interface/logs.md rename to site/content/arangodb/3.10/components/web-interface/logs.md index f9ddcc007b..46c70ffb19 100644 --- a/site/content/3.11/components/web-interface/logs.md +++ b/site/content/arangodb/3.10/components/web-interface/logs.md @@ -7,7 +7,7 @@ description: '' The logs section displays all available log entries. Log entries are filterable by their log level types. -![Logs](../../../images/logsView.png) +![Logs](../../../../images/logsView.png) Functions: diff --git a/site/content/3.10/components/web-interface/queries.md b/site/content/arangodb/3.10/components/web-interface/queries.md similarity index 91% rename from site/content/3.10/components/web-interface/queries.md rename to site/content/arangodb/3.10/components/web-interface/queries.md index c263e2e6b0..bc5d76591b 100644 --- a/site/content/3.10/components/web-interface/queries.md +++ b/site/content/arangodb/3.10/components/web-interface/queries.md @@ -14,7 +14,7 @@ The query view offers you three different subviews: The web interface offers a AQL Query Editor: -![Editor Input](../../../images/queryEditorInput.png) +![Editor Input](../../../../images/queryEditorInput.png) The editor is split into two parts, the query editor pane and the bind parameter pane. @@ -49,7 +49,7 @@ edit the bind parameters in raw JSON format. To save the current query use the *Save* button in the top left corner of the editor or use the shortcut (see below). -![Custom Queries](../../../images/queryCustoms.png) +![Custom Queries](../../../../images/queryCustoms.png) By pressing the *Queries* button in the top left corner of the editor you activate the custom queries view. Here you can select a previously stored custom @@ -70,7 +70,7 @@ right-hand side. ### Result -![Editor Output](../../../images/queryEditorOutput.png) +![Editor Output](../../../../images/queryEditorOutput.png) Each query you execute or explain opens up a new result box, so you are able to fire up multiple queries and view their results at the same time. Every query @@ -81,7 +81,7 @@ switches back and forth between the *Result* and *AQL* query with bind parameter ### Spotlight -![Spotlight](../../../images/querySpotlight.png) +![Spotlight](../../../../images/querySpotlight.png) The spotlight feature opens up a modal view. There you can find all AQL keywords, AQL functions and collections (filtered by their type) to help you to be more @@ -105,13 +105,13 @@ in the toolbar or via shortcut (see below). ## Running Queries -![Running Queries](../../../images/runningQueries.png) +![Running Queries](../../../../images/runningQueries.png) The *Running Queries* tab gives you a compact overview of all running queries. By clicking the red minus button, you can abort the execution of a running query. ## Slow Query History -![Slow Queries](../../../images/slowQueries.png) +![Slow Queries](../../../../images/slowQueries.png) The *Slow Query History* tab gives you a compact overview of all past slow queries. diff --git a/site/content/3.10/components/web-interface/services.md b/site/content/arangodb/3.10/components/web-interface/services.md similarity index 87% rename from site/content/3.10/components/web-interface/services.md rename to site/content/arangodb/3.10/components/web-interface/services.md index 3bae62eb84..478bfd2b29 100644 --- a/site/content/3.10/components/web-interface/services.md +++ b/site/content/arangodb/3.10/components/web-interface/services.md @@ -7,7 +7,7 @@ description: '' The services section displays all installed Foxx applications. You can create new services or go into a detailed view of a chosen service. -![Services](../../../images/servicesView.png) +![Services](../../../../images/servicesView.png) ## Create Service @@ -18,13 +18,13 @@ There are four different possibilities to create a new service: 3. Create service via official ArangoDB store 4. Create a blank service from scratch -![Create Service](../../../images/installService.png) +![Create Service](../../../../images/installService.png) ## Service View This section offers several information about a specific service. -![Create Service](../../../images/serviceView.png) +![Create Service](../../../../images/serviceView.png) There are four view categories: diff --git a/site/content/3.11/components/web-interface/users.md b/site/content/arangodb/3.10/components/web-interface/users.md similarity index 90% rename from site/content/3.11/components/web-interface/users.md rename to site/content/arangodb/3.10/components/web-interface/users.md index 3ecc4fc927..49b3511339 100644 --- a/site/content/3.11/components/web-interface/users.md +++ b/site/content/arangodb/3.10/components/web-interface/users.md @@ -7,21 +7,21 @@ description: '' ArangoDB users are globally stored in the `_system` database and can only be managed while logged on to this database. There you can find the *Users* section: -![Users](../../../images/users.png) +![Users](../../../../images/users.png) ## General Select a user to bring up the *General* tab with the username, name and active status, as well as options to delete the user or change the password. -![User General](../../../images/userGeneral.png) +![User General](../../../../images/userGeneral.png) ## Permissions Select a user and go to the *Permissions* tab. You will see a list of databases and their corresponding database access level for that user. -![User Permissions](../../../images/userPermissions.png) +![User Permissions](../../../../images/userPermissions.png) Please note that server access level follows from the access level on the `_system` database. Furthermore, the default database access level diff --git a/site/content/3.10/concepts/_index.md b/site/content/arangodb/3.10/concepts/_index.md similarity index 100% rename from site/content/3.10/concepts/_index.md rename to site/content/arangodb/3.10/concepts/_index.md diff --git a/site/content/3.10/concepts/data-models.md b/site/content/arangodb/3.10/concepts/data-models.md similarity index 100% rename from site/content/3.10/concepts/data-models.md rename to site/content/arangodb/3.10/concepts/data-models.md diff --git a/site/content/3.10/concepts/data-retrieval.md b/site/content/arangodb/3.10/concepts/data-retrieval.md similarity index 100% rename from site/content/3.10/concepts/data-retrieval.md rename to site/content/arangodb/3.10/concepts/data-retrieval.md diff --git a/site/content/3.10/concepts/data-structure/_index.md b/site/content/arangodb/3.10/concepts/data-structure/_index.md similarity index 100% rename from site/content/3.10/concepts/data-structure/_index.md rename to site/content/arangodb/3.10/concepts/data-structure/_index.md diff --git a/site/content/3.10/concepts/data-structure/collections.md b/site/content/arangodb/3.10/concepts/data-structure/collections.md similarity index 100% rename from site/content/3.10/concepts/data-structure/collections.md rename to site/content/arangodb/3.10/concepts/data-structure/collections.md diff --git a/site/content/3.10/concepts/data-structure/databases.md b/site/content/arangodb/3.10/concepts/data-structure/databases.md similarity index 100% rename from site/content/3.10/concepts/data-structure/databases.md rename to site/content/arangodb/3.10/concepts/data-structure/databases.md diff --git a/site/content/3.10/concepts/data-structure/documents/_index.md b/site/content/arangodb/3.10/concepts/data-structure/documents/_index.md similarity index 100% rename from site/content/3.10/concepts/data-structure/documents/_index.md rename to site/content/arangodb/3.10/concepts/data-structure/documents/_index.md diff --git a/site/content/3.10/concepts/data-structure/documents/computed-values.md b/site/content/arangodb/3.10/concepts/data-structure/documents/computed-values.md similarity index 100% rename from site/content/3.10/concepts/data-structure/documents/computed-values.md rename to site/content/arangodb/3.10/concepts/data-structure/documents/computed-values.md diff --git a/site/content/3.10/concepts/data-structure/documents/schema-validation.md b/site/content/arangodb/3.10/concepts/data-structure/documents/schema-validation.md similarity index 100% rename from site/content/3.10/concepts/data-structure/documents/schema-validation.md rename to site/content/arangodb/3.10/concepts/data-structure/documents/schema-validation.md diff --git a/site/content/3.10/concepts/data-structure/views.md b/site/content/arangodb/3.10/concepts/data-structure/views.md similarity index 100% rename from site/content/3.10/concepts/data-structure/views.md rename to site/content/arangodb/3.10/concepts/data-structure/views.md diff --git a/site/content/3.10/data-science/_index.md b/site/content/arangodb/3.10/data-science/_index.md similarity index 95% rename from site/content/3.10/data-science/_index.md rename to site/content/arangodb/3.10/data-science/_index.md index c6182c0cc9..52030ffef6 100644 --- a/site/content/3.10/data-science/_index.md +++ b/site/content/arangodb/3.10/data-science/_index.md @@ -21,7 +21,7 @@ ArangoDB, as the foundation for GraphML, comes with the following key features: - **Open Source**: extensibility and community. - **NLP Support**: built-in text processing, search, and similarity ranking. -![ArangoDB Machine Learning Architecture](../../images/machine-learning-architecture.png) +![ArangoDB Machine Learning Architecture](../../../images/machine-learning-architecture.png) ## Graph Analytics vs. GraphML @@ -37,7 +37,7 @@ and then the edge indicates what the next connected vertex will be. Graph queries can answer questions like _**Who can introduce me to person X**_? -![Graph Query](../../images/graph-query.png) +![Graph Query](../../../images/graph-query.png) ### Graph Analytics @@ -46,7 +46,7 @@ know aggregate information about your graph, while analyzing the entire graph. Graph analytics can answer questions like _**Who are the most connected persons**_? -![Graph Analytics](../../images/graph-analytics.png) +![Graph Analytics](../../../images/graph-analytics.png) ### GraphML @@ -58,7 +58,7 @@ GraphML can answer questions like: - _**Will a customer churn?**_ - _**Is this particular transaction Anomalous?**_ -![Graph ML](../../images/graph-ml.png) +![Graph ML](../../../images/graph-ml.png) ## Use Cases @@ -134,7 +134,7 @@ The ArangoFlix demo uses five different recommendation methods: - Matrix Factorization - Graph Neural Networks -![ArangoFlix demo](../../images/data-science-arangoflix.png) +![ArangoFlix demo](../../../images/data-science-arangoflix.png) The ArangoFlix website not only offers an example of how the user recommendations might look like in real life, but it also provides information on a recommendation method, diff --git a/site/content/3.10/data-science/adapters/_index.md b/site/content/arangodb/3.10/data-science/adapters/_index.md similarity index 100% rename from site/content/3.10/data-science/adapters/_index.md rename to site/content/arangodb/3.10/data-science/adapters/_index.md diff --git a/site/content/3.10/data-science/adapters/arangodb-cugraph-adapter.md b/site/content/arangodb/3.10/data-science/adapters/arangodb-cugraph-adapter.md similarity index 100% rename from site/content/3.10/data-science/adapters/arangodb-cugraph-adapter.md rename to site/content/arangodb/3.10/data-science/adapters/arangodb-cugraph-adapter.md diff --git a/site/content/3.10/data-science/adapters/arangodb-dgl-adapter.md b/site/content/arangodb/3.10/data-science/adapters/arangodb-dgl-adapter.md similarity index 100% rename from site/content/3.10/data-science/adapters/arangodb-dgl-adapter.md rename to site/content/arangodb/3.10/data-science/adapters/arangodb-dgl-adapter.md diff --git a/site/content/3.10/data-science/adapters/arangodb-networkx-adapter.md b/site/content/arangodb/3.10/data-science/adapters/arangodb-networkx-adapter.md similarity index 100% rename from site/content/3.10/data-science/adapters/arangodb-networkx-adapter.md rename to site/content/arangodb/3.10/data-science/adapters/arangodb-networkx-adapter.md diff --git a/site/content/3.10/data-science/adapters/arangodb-pyg-adapter.md b/site/content/arangodb/3.10/data-science/adapters/arangodb-pyg-adapter.md similarity index 100% rename from site/content/3.10/data-science/adapters/arangodb-pyg-adapter.md rename to site/content/arangodb/3.10/data-science/adapters/arangodb-pyg-adapter.md diff --git a/site/content/3.10/data-science/adapters/arangodb-rdf-adapter.md b/site/content/arangodb/3.10/data-science/adapters/arangodb-rdf-adapter.md similarity index 100% rename from site/content/3.10/data-science/adapters/arangodb-rdf-adapter.md rename to site/content/arangodb/3.10/data-science/adapters/arangodb-rdf-adapter.md diff --git a/site/content/arangodb/3.10/data-science/arangograph-notebooks.md b/site/content/arangodb/3.10/data-science/arangograph-notebooks.md new file mode 100644 index 0000000000..833a0525f1 --- /dev/null +++ b/site/content/arangodb/3.10/data-science/arangograph-notebooks.md @@ -0,0 +1,22 @@ +--- +title: AMP Notebooks +menuTitle: AMP Notebooks +weight: 130 +description: >- + Colocated Jupyter Notebooks within the Arango Managed Platform +--- +{{< tip >}} +AMP Notebooks don't include the ArangoGraphML services. +To enable the ArangoGraphML services, +[get in touch](https://www.arangodb.com/contact/) +with the ArangoDB team. +{{< /tip >}} + +The AMP Notebook is a JupyterLab notebook embedded in the +[Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +The notebook integrates seamlessly with the platform, +automatically connecting to AMP services and ArangoDB. +This makes it much easier to leverage these resources without having +to download any data locally or to remember user IDs, passwords, and endpoint URLs. + +For more information, see the [Notebooks](../../../amp/notebooks.md) documentation. diff --git a/site/content/3.10/data-science/arangographml/_index.md b/site/content/arangodb/3.10/data-science/arangographml/_index.md similarity index 97% rename from site/content/3.10/data-science/arangographml/_index.md rename to site/content/arangodb/3.10/data-science/arangographml/_index.md index baa200deaa..0d1238abdd 100644 --- a/site/content/3.10/data-science/arangographml/_index.md +++ b/site/content/arangodb/3.10/data-science/arangographml/_index.md @@ -22,7 +22,7 @@ and facilitating their resolution. The process involves incorporating a graph's topology (node and edge structure) and the node and edge characteristics and features to create a numerical representation known as an embedding. -![GraphML Embeddings](../../../images/GraphML-Embeddings.webp) +![GraphML Embeddings](../../../../images/GraphML-Embeddings.webp) Graph Neural Networks (GNNs) are explicitly designed to learn meaningful numerical representations, or embeddings, for nodes and edges in a graph. @@ -34,7 +34,7 @@ for various tasks, such as node classification, link prediction, and graph-level classification, where the model can make predictions based on the learned patterns and relationships within the graph. -![GraphML Workflow](../../../images/GraphML-How-it-works.webp) +![GraphML Workflow](../../../../images/GraphML-How-it-works.webp) It is no longer necessary to understand the complexities involved with graph machine learning, thanks to the accessibility of the ArangoML package. diff --git a/site/content/3.10/data-science/arangographml/deploy.md b/site/content/arangodb/3.10/data-science/arangographml/deploy.md similarity index 79% rename from site/content/3.10/data-science/arangographml/deploy.md rename to site/content/arangodb/3.10/data-science/arangographml/deploy.md index 0d62cb12f6..b3f8c26068 100644 --- a/site/content/3.10/data-science/arangographml/deploy.md +++ b/site/content/arangodb/3.10/data-science/arangographml/deploy.md @@ -11,14 +11,14 @@ description: >- ArangoDB offers two deployment options, tailored to suit diverse requirements and infrastructure preferences: -- Managed cloud service via the [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +- Managed cloud service via the [Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) - Self-managed solution via the [ArangoDB Kubernetes Operator](https://github.com/arangodb/kube-arangodb) ### ArangoGraphML ArangoGraphML provides enterprise-ready Graph Machine Learning as a Cloud Service via Jupyter Notebooks that run on the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). {{< tip >}} To get access to ArangoGraphML services and packages, @@ -36,20 +36,20 @@ with the ArangoDB team. - Metadata capture - Model management -![ArangoGraphML Pipeline](../../../images/ArangoGraphML_Pipeline.png) +![ArangoGraphML Pipeline](../../../../images/ArangoGraphML_Pipeline.png) #### Setup The ArangoGraphML managed-service runs on the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). It offers a pre-configured environment where everything, including necessary components and configurations, comes preloaded. You don't need to set up or configure the infrastructure, and can immediately start using the GraphML functionalities. To summarize, all you need to do is: -1. Sign up for an [ArangoGraph account](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -2. Create a new [deployment in ArangoGraph](../../arangograph/deployments/_index.md#how-to-create-a-new-deployment). +1. Sign up for an [AMP account](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +2. Create a new [deployment in AMP](../../../../amp/deployments/_index.md#how-to-create-a-new-deployment). 3. Start using the ArangoGraphML functionalities. ### Self-managed ArangoGraphML diff --git a/site/content/3.10/data-science/arangographml/getting-started.md b/site/content/arangodb/3.10/data-science/arangographml/getting-started.md similarity index 99% rename from site/content/3.10/data-science/arangographml/getting-started.md rename to site/content/arangodb/3.10/data-science/arangographml/getting-started.md index 8742ec3aa0..e1309785dc 100644 --- a/site/content/3.10/data-science/arangographml/getting-started.md +++ b/site/content/arangodb/3.10/data-science/arangographml/getting-started.md @@ -175,12 +175,12 @@ Knowledge Graph constructed from the [GDELT Project](https://www.gdeltproject.or The events used range from peaceful protests to significant battles in Angola. The image below depicts the connections around an example event: -![Example Event](../../../images/ArangoML_open_intelligence_sample.png) +![Example Event](../../../../images/ArangoML_open_intelligence_sample.png) You can also see a larger portion of this graph, showing how the events, actors, news sources, and locations are interconnected into a large graph. -![Example Event](../../../images/ArangoML_open_intelligence_visualization.png) +![Example Event](../../../../images/ArangoML_open_intelligence_visualization.png) Let's get started! diff --git a/site/content/3.10/data-science/llm-knowledge-graphs.md b/site/content/arangodb/3.10/data-science/llm-knowledge-graphs.md similarity index 97% rename from site/content/3.10/data-science/llm-knowledge-graphs.md rename to site/content/arangodb/3.10/data-science/llm-knowledge-graphs.md index 80d8be9666..de8da64e7a 100644 --- a/site/content/3.10/data-science/llm-knowledge-graphs.md +++ b/site/content/arangodb/3.10/data-science/llm-knowledge-graphs.md @@ -46,7 +46,7 @@ the following tasks: - End-to-end knowledge graph construction - (Text) Embeddings -![ArangoDB Knowledge Graphs and LLMs](../../images/ArangoDB-knowledge-graphs-meets-llms.png) +![ArangoDB Knowledge Graphs and LLMs](../../../images/ArangoDB-knowledge-graphs-meets-llms.png) ## ArangoDB and LangChain diff --git a/site/content/3.10/data-science/pregel/_index.md b/site/content/arangodb/3.10/data-science/pregel/_index.md similarity index 100% rename from site/content/3.10/data-science/pregel/_index.md rename to site/content/arangodb/3.10/data-science/pregel/_index.md diff --git a/site/content/3.10/data-science/pregel/algorithms.md b/site/content/arangodb/3.10/data-science/pregel/algorithms.md similarity index 98% rename from site/content/3.10/data-science/pregel/algorithms.md rename to site/content/arangodb/3.10/data-science/pregel/algorithms.md index b596d7669b..3b17aecc8b 100644 --- a/site/content/3.10/data-science/pregel/algorithms.md +++ b/site/content/arangodb/3.10/data-science/pregel/algorithms.md @@ -215,7 +215,7 @@ It is probably impossible to discover an efficient algorithm which computes them in a distributed way. Fortunately there are scalable substitutions available, which should be equally usable for most use cases. -![Illustration of an execution of different centrality measures (Freeman 1977)](../../../images/centrality_visual.png) +![Illustration of an execution of different centrality measures (Freeman 1977)](../../../../images/centrality_visual.png) #### Effective Closeness @@ -224,7 +224,7 @@ A common definitions of centrality is the **closeness centrality** length of the shortest path between the vertex and all other vertices. For vertices *x*, *y* and shortest distance `d(y, x)` it is defined as: -![Vertex Closeness Formula](../../../images/closeness.png) +![Vertex Closeness Formula](../../../../images/closeness.png) Effective Closeness approximates the closeness measure. The algorithm works by iteratively estimating the number of shortest paths passing through each vertex. @@ -252,7 +252,7 @@ Another common measure is the [*betweenness* centrality](https://en.wikipedia.or It measures the number of times a vertex is part of shortest paths between any pairs of vertices. For a vertex *v* betweenness is defined as: -![Vertex Betweenness Formula](../../../images/betweenness.png) +![Vertex Betweenness Formula](../../../../images/betweenness.png) Where the σ represents the number of shortest paths between *x* and *y*, and σ(v) represents the number of paths also passing through a vertex *v*. diff --git a/site/content/3.10/deploy/_index.md b/site/content/arangodb/3.10/deploy/_index.md similarity index 98% rename from site/content/3.10/deploy/_index.md rename to site/content/arangodb/3.10/deploy/_index.md index 2b049622fb..e073069b53 100644 --- a/site/content/3.10/deploy/_index.md +++ b/site/content/arangodb/3.10/deploy/_index.md @@ -136,7 +136,7 @@ If you want a specific version, download the precompiled executable via the ### Run in the cloud - [AWS and Azure](in-the-cloud.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS, Azure & GCP ### Run in Kubernetes diff --git a/site/content/3.10/deploy/active-failover/_index.md b/site/content/arangodb/3.10/deploy/active-failover/_index.md similarity index 98% rename from site/content/3.10/deploy/active-failover/_index.md rename to site/content/arangodb/3.10/deploy/active-failover/_index.md index 1bbfdf8f2a..8672afa5e4 100644 --- a/site/content/3.10/deploy/active-failover/_index.md +++ b/site/content/arangodb/3.10/deploy/active-failover/_index.md @@ -17,7 +17,7 @@ An _Active Failover_ is defined as: An _Active Failover_ behaves differently from an [ArangoDB Cluster](../cluster/_index.md), please see the [limitations section](#limitations) for more details. -![ArangoDB Active Failover](../../../images/leader-follower.png) +![ArangoDB Active Failover](../../../../images/leader-follower.png) The advantage of the _Active Failover_ setup is that there is an active third party, the _Agency_, which observes and supervises all involved server processes. diff --git a/site/content/3.10/deploy/active-failover/administration.md b/site/content/arangodb/3.10/deploy/active-failover/administration.md similarity index 100% rename from site/content/3.10/deploy/active-failover/administration.md rename to site/content/arangodb/3.10/deploy/active-failover/administration.md diff --git a/site/content/3.10/deploy/active-failover/manual-start.md b/site/content/arangodb/3.10/deploy/active-failover/manual-start.md similarity index 100% rename from site/content/3.10/deploy/active-failover/manual-start.md rename to site/content/arangodb/3.10/deploy/active-failover/manual-start.md diff --git a/site/content/3.10/deploy/active-failover/using-the-arangodb-starter.md b/site/content/arangodb/3.10/deploy/active-failover/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.10/deploy/active-failover/using-the-arangodb-starter.md rename to site/content/arangodb/3.10/deploy/active-failover/using-the-arangodb-starter.md diff --git a/site/content/3.10/deploy/arangosync/_index.md b/site/content/arangodb/3.10/deploy/arangosync/_index.md similarity index 99% rename from site/content/3.10/deploy/arangosync/_index.md rename to site/content/arangodb/3.10/deploy/arangosync/_index.md index b660c58918..84e98d03fd 100644 --- a/site/content/3.10/deploy/arangosync/_index.md +++ b/site/content/arangodb/3.10/deploy/arangosync/_index.md @@ -27,7 +27,7 @@ in one place to a Cluster in another place. Typically it is used from one datace to another. It is possible to replicate to multiple other datacenters as well. It is not a solution for replicating single server instances. -![ArangoDB DC2DC](../../../images/dc2dc_topology.png) +![ArangoDB DC2DC](../../../../images/dc2dc_topology.png) The replication done by _ArangoSync_ is **asynchronous**. That means that when a client is writing data into the source datacenter, it will consider the diff --git a/site/content/3.10/deploy/arangosync/administration.md b/site/content/arangodb/3.10/deploy/arangosync/administration.md similarity index 100% rename from site/content/3.10/deploy/arangosync/administration.md rename to site/content/arangodb/3.10/deploy/arangosync/administration.md diff --git a/site/content/3.10/deploy/arangosync/deployment/_index.md b/site/content/arangodb/3.10/deploy/arangosync/deployment/_index.md similarity index 100% rename from site/content/3.10/deploy/arangosync/deployment/_index.md rename to site/content/arangodb/3.10/deploy/arangosync/deployment/_index.md diff --git a/site/content/3.10/deploy/arangosync/deployment/arangodb-cluster.md b/site/content/arangodb/3.10/deploy/arangosync/deployment/arangodb-cluster.md similarity index 100% rename from site/content/3.10/deploy/arangosync/deployment/arangodb-cluster.md rename to site/content/arangodb/3.10/deploy/arangosync/deployment/arangodb-cluster.md diff --git a/site/content/3.10/deploy/arangosync/deployment/arangosync-master.md b/site/content/arangodb/3.10/deploy/arangosync/deployment/arangosync-master.md similarity index 100% rename from site/content/3.10/deploy/arangosync/deployment/arangosync-master.md rename to site/content/arangodb/3.10/deploy/arangosync/deployment/arangosync-master.md diff --git a/site/content/3.10/deploy/arangosync/deployment/arangosync-workers.md b/site/content/arangodb/3.10/deploy/arangosync/deployment/arangosync-workers.md similarity index 100% rename from site/content/3.10/deploy/arangosync/deployment/arangosync-workers.md rename to site/content/arangodb/3.10/deploy/arangosync/deployment/arangosync-workers.md diff --git a/site/content/3.10/deploy/arangosync/deployment/prometheus-and-grafana.md b/site/content/arangodb/3.10/deploy/arangosync/deployment/prometheus-and-grafana.md similarity index 100% rename from site/content/3.10/deploy/arangosync/deployment/prometheus-and-grafana.md rename to site/content/arangodb/3.10/deploy/arangosync/deployment/prometheus-and-grafana.md diff --git a/site/content/3.10/deploy/arangosync/monitoring.md b/site/content/arangodb/3.10/deploy/arangosync/monitoring.md similarity index 100% rename from site/content/3.10/deploy/arangosync/monitoring.md rename to site/content/arangodb/3.10/deploy/arangosync/monitoring.md diff --git a/site/content/3.10/deploy/arangosync/operations-and-maintenance.md b/site/content/arangodb/3.10/deploy/arangosync/operations-and-maintenance.md similarity index 100% rename from site/content/3.10/deploy/arangosync/operations-and-maintenance.md rename to site/content/arangodb/3.10/deploy/arangosync/operations-and-maintenance.md diff --git a/site/content/3.10/deploy/arangosync/security.md b/site/content/arangodb/3.10/deploy/arangosync/security.md similarity index 100% rename from site/content/3.10/deploy/arangosync/security.md rename to site/content/arangodb/3.10/deploy/arangosync/security.md diff --git a/site/content/3.10/deploy/arangosync/troubleshooting.md b/site/content/arangodb/3.10/deploy/arangosync/troubleshooting.md similarity index 100% rename from site/content/3.10/deploy/arangosync/troubleshooting.md rename to site/content/arangodb/3.10/deploy/arangosync/troubleshooting.md diff --git a/site/content/3.10/deploy/architecture/_index.md b/site/content/arangodb/3.10/deploy/architecture/_index.md similarity index 100% rename from site/content/3.10/deploy/architecture/_index.md rename to site/content/arangodb/3.10/deploy/architecture/_index.md diff --git a/site/content/3.10/deploy/architecture/data-sharding.md b/site/content/arangodb/3.10/deploy/architecture/data-sharding.md similarity index 98% rename from site/content/3.10/deploy/architecture/data-sharding.md rename to site/content/arangodb/3.10/deploy/architecture/data-sharding.md index d495f38981..6139b13938 100644 --- a/site/content/3.10/deploy/architecture/data-sharding.md +++ b/site/content/arangodb/3.10/deploy/architecture/data-sharding.md @@ -44,7 +44,7 @@ cost-effective than pre-provisioning a single large machine. Increased complexity in infrastructure can be managed using modern containerization and cluster orchestrations tools like [Kubernetes](../kubernetes.md). -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) To achieve this ArangoDB splits your dataset into so called _shards_. The number of shards is something you may choose according to your needs. Proper sharding @@ -84,7 +84,7 @@ a given document is to be stored. Choosing the right shard key can have significant impact on your performance can reduce network traffic and increase performance. -![Hash Sharding](../../../images/cluster_sharding_hash.jpg) +![Hash Sharding](../../../../images/cluster_sharding_hash.jpg) ArangoDB uses consistent hashing to compute the target shard from the given values (as specified via by the `shardKeys` collection property). The ideal set diff --git a/site/content/3.10/deploy/architecture/replication.md b/site/content/arangodb/3.10/deploy/architecture/replication.md similarity index 100% rename from site/content/3.10/deploy/architecture/replication.md rename to site/content/arangodb/3.10/deploy/architecture/replication.md diff --git a/site/content/3.10/deploy/architecture/scalability.md b/site/content/arangodb/3.10/deploy/architecture/scalability.md similarity index 100% rename from site/content/3.10/deploy/architecture/scalability.md rename to site/content/arangodb/3.10/deploy/architecture/scalability.md diff --git a/site/content/3.10/deploy/cluster/_index.md b/site/content/arangodb/3.10/deploy/cluster/_index.md similarity index 98% rename from site/content/3.10/deploy/cluster/_index.md rename to site/content/arangodb/3.10/deploy/cluster/_index.md index 4d10cec023..60b256783a 100644 --- a/site/content/3.10/deploy/cluster/_index.md +++ b/site/content/arangodb/3.10/deploy/cluster/_index.md @@ -39,7 +39,7 @@ roles: - _Coordinators_ - _DB-Servers_. -![ArangoDB Cluster](../../../images/cluster-topology.png) +![ArangoDB Cluster](../../../../images/cluster-topology.png) ### Agents @@ -142,7 +142,7 @@ automatically to the different servers. In many situations one can also reap a benefit in data throughput, again because the load can be distributed to multiple machines. -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) From the outside this process is fully transparent: An application may talk to any _Coordinator_ and @@ -385,7 +385,7 @@ See the [Cluster Deployment](deployment/_index.md) chapter for instructions. ArangoDB is also available as a cloud service, the -[**ArangoGraph Insights Platform**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[**Arango Managed Platform (AMP)**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). ## Cluster ID diff --git a/site/content/3.10/deploy/cluster/administration.md b/site/content/arangodb/3.10/deploy/cluster/administration.md similarity index 100% rename from site/content/3.10/deploy/cluster/administration.md rename to site/content/arangodb/3.10/deploy/cluster/administration.md diff --git a/site/content/3.10/deploy/cluster/deployment/_index.md b/site/content/arangodb/3.10/deploy/cluster/deployment/_index.md similarity index 97% rename from site/content/3.10/deploy/cluster/deployment/_index.md rename to site/content/arangodb/3.10/deploy/cluster/deployment/_index.md index 4bd6b1550d..55d16885b4 100644 --- a/site/content/3.10/deploy/cluster/deployment/_index.md +++ b/site/content/arangodb/3.10/deploy/cluster/deployment/_index.md @@ -9,7 +9,7 @@ You can deploy an ArangoDB cluster in different ways: - [Using the ArangoDB Starter](using-the-arangodb-starter.md) - [Manual Start](manual-start.md) - [Kubernetes](../../kubernetes.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS, Azure & GCP ## Preliminary Information For Debian/Ubuntu Systems diff --git a/site/content/3.10/deploy/cluster/deployment/manual-start.md b/site/content/arangodb/3.10/deploy/cluster/deployment/manual-start.md similarity index 100% rename from site/content/3.10/deploy/cluster/deployment/manual-start.md rename to site/content/arangodb/3.10/deploy/cluster/deployment/manual-start.md diff --git a/site/content/3.10/deploy/cluster/deployment/using-the-arangodb-starter.md b/site/content/arangodb/3.10/deploy/cluster/deployment/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.10/deploy/cluster/deployment/using-the-arangodb-starter.md rename to site/content/arangodb/3.10/deploy/cluster/deployment/using-the-arangodb-starter.md diff --git a/site/content/3.10/deploy/cluster/limitations.md b/site/content/arangodb/3.10/deploy/cluster/limitations.md similarity index 100% rename from site/content/3.10/deploy/cluster/limitations.md rename to site/content/arangodb/3.10/deploy/cluster/limitations.md diff --git a/site/content/3.10/deploy/in-the-cloud.md b/site/content/arangodb/3.10/deploy/in-the-cloud.md similarity index 100% rename from site/content/3.10/deploy/in-the-cloud.md rename to site/content/arangodb/3.10/deploy/in-the-cloud.md diff --git a/site/content/3.10/deploy/kubernetes.md b/site/content/arangodb/3.10/deploy/kubernetes.md similarity index 100% rename from site/content/3.10/deploy/kubernetes.md rename to site/content/arangodb/3.10/deploy/kubernetes.md diff --git a/site/content/3.11/deploy/oneshard.md b/site/content/arangodb/3.10/deploy/oneshard.md similarity index 99% rename from site/content/3.11/deploy/oneshard.md rename to site/content/arangodb/3.10/deploy/oneshard.md index cd4eed572b..048508fdfd 100644 --- a/site/content/3.11/deploy/oneshard.md +++ b/site/content/arangodb/3.10/deploy/oneshard.md @@ -49,7 +49,7 @@ because they need to send and receive data on several connections, build up results for collection accesses from the received parts followed by further processing. -![OneShard vs. Sharded Cluster Setup](../../images/cluster-sharded-oneshard.png) +![OneShard vs. Sharded Cluster Setup](../../../images/cluster-sharded-oneshard.png) If the database involved in a query is a OneShard database, then the OneShard optimization can be applied to run the query on the diff --git a/site/content/3.10/deploy/production-checklist.md b/site/content/arangodb/3.10/deploy/production-checklist.md similarity index 100% rename from site/content/3.10/deploy/production-checklist.md rename to site/content/arangodb/3.10/deploy/production-checklist.md diff --git a/site/content/3.10/deploy/single-instance-vs-cluster.md b/site/content/arangodb/3.10/deploy/single-instance-vs-cluster.md similarity index 100% rename from site/content/3.10/deploy/single-instance-vs-cluster.md rename to site/content/arangodb/3.10/deploy/single-instance-vs-cluster.md diff --git a/site/content/3.10/deploy/single-instance/_index.md b/site/content/arangodb/3.10/deploy/single-instance/_index.md similarity index 100% rename from site/content/3.10/deploy/single-instance/_index.md rename to site/content/arangodb/3.10/deploy/single-instance/_index.md diff --git a/site/content/3.10/deploy/single-instance/manual-start.md b/site/content/arangodb/3.10/deploy/single-instance/manual-start.md similarity index 100% rename from site/content/3.10/deploy/single-instance/manual-start.md rename to site/content/arangodb/3.10/deploy/single-instance/manual-start.md diff --git a/site/content/3.10/deploy/single-instance/using-the-arangodb-starter.md b/site/content/arangodb/3.10/deploy/single-instance/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.10/deploy/single-instance/using-the-arangodb-starter.md rename to site/content/arangodb/3.10/deploy/single-instance/using-the-arangodb-starter.md diff --git a/site/content/3.10/develop/_index.md b/site/content/arangodb/3.10/develop/_index.md similarity index 100% rename from site/content/3.10/develop/_index.md rename to site/content/arangodb/3.10/develop/_index.md diff --git a/site/content/3.10/develop/drivers/_index.md b/site/content/arangodb/3.10/develop/drivers/_index.md similarity index 100% rename from site/content/3.10/develop/drivers/_index.md rename to site/content/arangodb/3.10/develop/drivers/_index.md diff --git a/site/content/3.10/develop/drivers/csharp-dotnet.md b/site/content/arangodb/3.10/develop/drivers/csharp-dotnet.md similarity index 100% rename from site/content/3.10/develop/drivers/csharp-dotnet.md rename to site/content/arangodb/3.10/develop/drivers/csharp-dotnet.md diff --git a/site/content/3.10/develop/drivers/go.md b/site/content/arangodb/3.10/develop/drivers/go.md similarity index 100% rename from site/content/3.10/develop/drivers/go.md rename to site/content/arangodb/3.10/develop/drivers/go.md diff --git a/site/content/3.10/develop/drivers/java/_index.md b/site/content/arangodb/3.10/develop/drivers/java/_index.md similarity index 100% rename from site/content/3.10/develop/drivers/java/_index.md rename to site/content/arangodb/3.10/develop/drivers/java/_index.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-6/_index.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-6/_index.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-6/_index.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-6/_index.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-6/driver-setup.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-6/driver-setup.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-6/driver-setup.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-6/driver-setup.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-6/serialization.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-6/serialization.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-6/serialization.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-6/serialization.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-7/_index.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-7/_index.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-7/_index.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-7/_index.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-7/changes-in-version-7.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-7/changes-in-version-7.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-7/changes-in-version-7.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-7/changes-in-version-7.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-7/driver-setup.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-7/driver-setup.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-7/driver-setup.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-7/driver-setup.md diff --git a/site/content/3.10/develop/drivers/java/reference-version-7/serialization.md b/site/content/arangodb/3.10/develop/drivers/java/reference-version-7/serialization.md similarity index 100% rename from site/content/3.10/develop/drivers/java/reference-version-7/serialization.md rename to site/content/arangodb/3.10/develop/drivers/java/reference-version-7/serialization.md diff --git a/site/content/3.10/develop/drivers/nodejs.md b/site/content/arangodb/3.10/develop/drivers/nodejs.md similarity index 100% rename from site/content/3.10/develop/drivers/nodejs.md rename to site/content/arangodb/3.10/develop/drivers/nodejs.md diff --git a/site/content/3.10/develop/drivers/python.md b/site/content/arangodb/3.10/develop/drivers/python.md similarity index 100% rename from site/content/3.10/develop/drivers/python.md rename to site/content/arangodb/3.10/develop/drivers/python.md diff --git a/site/content/3.10/develop/error-codes-and-meanings.md b/site/content/arangodb/3.10/develop/error-codes-and-meanings.md similarity index 100% rename from site/content/3.10/develop/error-codes-and-meanings.md rename to site/content/arangodb/3.10/develop/error-codes-and-meanings.md diff --git a/site/content/3.10/develop/foxx-microservices/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/deployment.md b/site/content/arangodb/3.10/develop/foxx-microservices/deployment.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/deployment.md rename to site/content/arangodb/3.10/develop/foxx-microservices/deployment.md diff --git a/site/content/3.10/develop/foxx-microservices/getting-started.md b/site/content/arangodb/3.10/develop/foxx-microservices/getting-started.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/getting-started.md rename to site/content/arangodb/3.10/develop/foxx-microservices/getting-started.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/access-from-the-browser.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/access-from-the-browser.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/access-from-the-browser.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/access-from-the-browser.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/development-mode.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/development-mode.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/development-mode.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/development-mode.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/foxx-in-a-cluster.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/foxx-in-a-cluster.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/foxx-in-a-cluster.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/foxx-in-a-cluster.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/linking-services-together.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/linking-services-together.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/linking-services-together.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/linking-services-together.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/making-requests.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/making-requests.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/making-requests.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/making-requests.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/scripts-and-scheduling.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/scripts-and-scheduling.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/scripts-and-scheduling.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/scripts-and-scheduling.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/testing-foxx-services.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/testing-foxx-services.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/testing-foxx-services.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/testing-foxx-services.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/using-node-modules.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/using-node-modules.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/using-node-modules.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/using-node-modules.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/using-webpack-with-foxx.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/using-webpack-with-foxx.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/using-webpack-with-foxx.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/using-webpack-with-foxx.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/working-with-collections.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/working-with-collections.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/working-with-collections.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/working-with-collections.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/working-with-files.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/working-with-files.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/working-with-files.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/working-with-files.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/working-with-routers.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/working-with-routers.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/working-with-routers.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/working-with-routers.md diff --git a/site/content/3.10/develop/foxx-microservices/guides/writing-queries.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/writing-queries.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/guides/writing-queries.md rename to site/content/arangodb/3.10/develop/foxx-microservices/guides/writing-queries.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/configuration.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/configuration.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/configuration.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/configuration.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/related-modules/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/related-modules/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/related-modules/authentication.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/authentication.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/related-modules/authentication.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/authentication.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/related-modules/graphql.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/graphql.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/related-modules/graphql.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/graphql.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/related-modules/oauth-2-0.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/oauth-2-0.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/related-modules/oauth-2-0.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/oauth-2-0.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/related-modules/queues.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/queues.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/related-modules/queues.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/related-modules/queues.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/routers/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/routers/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/routers/endpoints.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/endpoints.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/routers/endpoints.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/endpoints.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/routers/middleware.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/middleware.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/routers/middleware.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/middleware.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/routers/request.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/request.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/routers/request.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/request.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/routers/response.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/response.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/routers/response.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/routers/response.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/service-context.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/service-context.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/service-context.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/service-context.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/service-manifest.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/service-manifest.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/service-manifest.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/service-manifest.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md diff --git a/site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md b/site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md similarity index 100% rename from site/content/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md rename to site/content/arangodb/3.10/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md diff --git a/site/content/3.10/develop/http-api/_index.md b/site/content/arangodb/3.10/develop/http-api/_index.md similarity index 98% rename from site/content/3.10/develop/http-api/_index.md rename to site/content/arangodb/3.10/develop/http-api/_index.md index 3068e60f26..4e14d398c3 100644 --- a/site/content/3.10/develop/http-api/_index.md +++ b/site/content/arangodb/3.10/develop/http-api/_index.md @@ -105,7 +105,7 @@ You can explore the API with the interactive **Swagger UI** using the 2. Click the **Rest API** tab. 3. Click a section and endpoint to view the description and parameters. -![The web interface with the navigation on the left and the tabs at the top](../../../images/swagger_serverapi_overview.png) +![The web interface with the navigation on the left and the tabs at the top](../../../../images/swagger_serverapi_overview.png) Also see this blog post: [Using the ArangoDB Swagger.io Interactive API Documentation](https://www.arangodb.com/2018/03/using-arangodb-swaggerio-interactive-api-documentation/). diff --git a/site/content/3.10/develop/http-api/administration.md b/site/content/arangodb/3.10/develop/http-api/administration.md similarity index 100% rename from site/content/3.10/develop/http-api/administration.md rename to site/content/arangodb/3.10/develop/http-api/administration.md diff --git a/site/content/3.10/develop/http-api/analyzers.md b/site/content/arangodb/3.10/develop/http-api/analyzers.md similarity index 100% rename from site/content/3.10/develop/http-api/analyzers.md rename to site/content/arangodb/3.10/develop/http-api/analyzers.md diff --git a/site/content/3.10/develop/http-api/authentication.md b/site/content/arangodb/3.10/develop/http-api/authentication.md similarity index 100% rename from site/content/3.10/develop/http-api/authentication.md rename to site/content/arangodb/3.10/develop/http-api/authentication.md diff --git a/site/content/3.10/develop/http-api/batch-requests.md b/site/content/arangodb/3.10/develop/http-api/batch-requests.md similarity index 100% rename from site/content/3.10/develop/http-api/batch-requests.md rename to site/content/arangodb/3.10/develop/http-api/batch-requests.md diff --git a/site/content/3.10/develop/http-api/cluster.md b/site/content/arangodb/3.10/develop/http-api/cluster.md similarity index 100% rename from site/content/3.10/develop/http-api/cluster.md rename to site/content/arangodb/3.10/develop/http-api/cluster.md diff --git a/site/content/3.10/develop/http-api/collections.md b/site/content/arangodb/3.10/develop/http-api/collections.md similarity index 100% rename from site/content/3.10/develop/http-api/collections.md rename to site/content/arangodb/3.10/develop/http-api/collections.md diff --git a/site/content/3.10/develop/http-api/databases.md b/site/content/arangodb/3.10/develop/http-api/databases.md similarity index 100% rename from site/content/3.10/develop/http-api/databases.md rename to site/content/arangodb/3.10/develop/http-api/databases.md diff --git a/site/content/3.10/develop/http-api/documents.md b/site/content/arangodb/3.10/develop/http-api/documents.md similarity index 100% rename from site/content/3.10/develop/http-api/documents.md rename to site/content/arangodb/3.10/develop/http-api/documents.md diff --git a/site/content/3.10/develop/http-api/foxx.md b/site/content/arangodb/3.10/develop/http-api/foxx.md similarity index 100% rename from site/content/3.10/develop/http-api/foxx.md rename to site/content/arangodb/3.10/develop/http-api/foxx.md diff --git a/site/content/3.10/develop/http-api/general-request-handling.md b/site/content/arangodb/3.10/develop/http-api/general-request-handling.md similarity index 100% rename from site/content/3.10/develop/http-api/general-request-handling.md rename to site/content/arangodb/3.10/develop/http-api/general-request-handling.md diff --git a/site/content/3.10/develop/http-api/graphs/_index.md b/site/content/arangodb/3.10/develop/http-api/graphs/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/graphs/_index.md rename to site/content/arangodb/3.10/develop/http-api/graphs/_index.md diff --git a/site/content/3.10/develop/http-api/graphs/edges.md b/site/content/arangodb/3.10/develop/http-api/graphs/edges.md similarity index 100% rename from site/content/3.10/develop/http-api/graphs/edges.md rename to site/content/arangodb/3.10/develop/http-api/graphs/edges.md diff --git a/site/content/3.10/develop/http-api/graphs/named-graphs.md b/site/content/arangodb/3.10/develop/http-api/graphs/named-graphs.md similarity index 99% rename from site/content/3.10/develop/http-api/graphs/named-graphs.md rename to site/content/arangodb/3.10/develop/http-api/graphs/named-graphs.md index e3bdcb3b8e..430cf36b6a 100644 --- a/site/content/3.10/develop/http-api/graphs/named-graphs.md +++ b/site/content/arangodb/3.10/develop/http-api/graphs/named-graphs.md @@ -18,11 +18,11 @@ The examples use the following example graphs: [_Social Graph_](../../../graphs/example-graphs.md#social-graph): -![Social Example Graph](../../../../images/social_graph.png) +![Social Example Graph](../../../../../images/social_graph.png) [_Knows Graph_](../../../graphs/example-graphs.md#knows-graph): -![Social Example Graph](../../../../images/knows_graph.png) +![Social Example Graph](../../../../../images/knows_graph.png) ## Management diff --git a/site/content/3.10/develop/http-api/hot-backups.md b/site/content/arangodb/3.10/develop/http-api/hot-backups.md similarity index 100% rename from site/content/3.10/develop/http-api/hot-backups.md rename to site/content/arangodb/3.10/develop/http-api/hot-backups.md diff --git a/site/content/3.10/develop/http-api/import.md b/site/content/arangodb/3.10/develop/http-api/import.md similarity index 100% rename from site/content/3.10/develop/http-api/import.md rename to site/content/arangodb/3.10/develop/http-api/import.md diff --git a/site/content/3.10/develop/http-api/indexes/_index.md b/site/content/arangodb/3.10/develop/http-api/indexes/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/_index.md rename to site/content/arangodb/3.10/develop/http-api/indexes/_index.md diff --git a/site/content/3.10/develop/http-api/indexes/fulltext.md b/site/content/arangodb/3.10/develop/http-api/indexes/fulltext.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/fulltext.md rename to site/content/arangodb/3.10/develop/http-api/indexes/fulltext.md diff --git a/site/content/3.10/develop/http-api/indexes/geo-spatial.md b/site/content/arangodb/3.10/develop/http-api/indexes/geo-spatial.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/geo-spatial.md rename to site/content/arangodb/3.10/develop/http-api/indexes/geo-spatial.md diff --git a/site/content/3.10/develop/http-api/indexes/inverted.md b/site/content/arangodb/3.10/develop/http-api/indexes/inverted.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/inverted.md rename to site/content/arangodb/3.10/develop/http-api/indexes/inverted.md diff --git a/site/content/3.10/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/3.10/develop/http-api/indexes/multi-dimensional.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/multi-dimensional.md rename to site/content/arangodb/3.10/develop/http-api/indexes/multi-dimensional.md diff --git a/site/content/3.10/develop/http-api/indexes/persistent.md b/site/content/arangodb/3.10/develop/http-api/indexes/persistent.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/persistent.md rename to site/content/arangodb/3.10/develop/http-api/indexes/persistent.md diff --git a/site/content/3.10/develop/http-api/indexes/ttl.md b/site/content/arangodb/3.10/develop/http-api/indexes/ttl.md similarity index 100% rename from site/content/3.10/develop/http-api/indexes/ttl.md rename to site/content/arangodb/3.10/develop/http-api/indexes/ttl.md diff --git a/site/content/3.10/develop/http-api/jobs.md b/site/content/arangodb/3.10/develop/http-api/jobs.md similarity index 100% rename from site/content/3.10/develop/http-api/jobs.md rename to site/content/arangodb/3.10/develop/http-api/jobs.md diff --git a/site/content/3.10/develop/http-api/monitoring/_index.md b/site/content/arangodb/3.10/develop/http-api/monitoring/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/monitoring/_index.md rename to site/content/arangodb/3.10/develop/http-api/monitoring/_index.md diff --git a/site/content/3.10/develop/http-api/monitoring/logs.md b/site/content/arangodb/3.10/develop/http-api/monitoring/logs.md similarity index 100% rename from site/content/3.10/develop/http-api/monitoring/logs.md rename to site/content/arangodb/3.10/develop/http-api/monitoring/logs.md diff --git a/site/content/3.10/develop/http-api/monitoring/metrics.md b/site/content/arangodb/3.10/develop/http-api/monitoring/metrics.md similarity index 100% rename from site/content/3.10/develop/http-api/monitoring/metrics.md rename to site/content/arangodb/3.10/develop/http-api/monitoring/metrics.md diff --git a/site/content/3.10/develop/http-api/monitoring/statistics.md b/site/content/arangodb/3.10/develop/http-api/monitoring/statistics.md similarity index 100% rename from site/content/3.10/develop/http-api/monitoring/statistics.md rename to site/content/arangodb/3.10/develop/http-api/monitoring/statistics.md diff --git a/site/content/3.10/develop/http-api/pregel.md b/site/content/arangodb/3.10/develop/http-api/pregel.md similarity index 100% rename from site/content/3.10/develop/http-api/pregel.md rename to site/content/arangodb/3.10/develop/http-api/pregel.md diff --git a/site/content/3.10/develop/http-api/queries/_index.md b/site/content/arangodb/3.10/develop/http-api/queries/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/queries/_index.md rename to site/content/arangodb/3.10/develop/http-api/queries/_index.md diff --git a/site/content/3.10/develop/http-api/queries/aql-queries.md b/site/content/arangodb/3.10/develop/http-api/queries/aql-queries.md similarity index 100% rename from site/content/3.10/develop/http-api/queries/aql-queries.md rename to site/content/arangodb/3.10/develop/http-api/queries/aql-queries.md diff --git a/site/content/3.10/develop/http-api/queries/aql-query-results-cache.md b/site/content/arangodb/3.10/develop/http-api/queries/aql-query-results-cache.md similarity index 100% rename from site/content/3.10/develop/http-api/queries/aql-query-results-cache.md rename to site/content/arangodb/3.10/develop/http-api/queries/aql-query-results-cache.md diff --git a/site/content/3.10/develop/http-api/queries/user-defined-aql-functions.md b/site/content/arangodb/3.10/develop/http-api/queries/user-defined-aql-functions.md similarity index 100% rename from site/content/3.10/develop/http-api/queries/user-defined-aql-functions.md rename to site/content/arangodb/3.10/develop/http-api/queries/user-defined-aql-functions.md diff --git a/site/content/3.10/develop/http-api/replication/_index.md b/site/content/arangodb/3.10/develop/http-api/replication/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/replication/_index.md rename to site/content/arangodb/3.10/develop/http-api/replication/_index.md diff --git a/site/content/3.10/develop/http-api/replication/other-replication-commands.md b/site/content/arangodb/3.10/develop/http-api/replication/other-replication-commands.md similarity index 100% rename from site/content/3.10/develop/http-api/replication/other-replication-commands.md rename to site/content/arangodb/3.10/develop/http-api/replication/other-replication-commands.md diff --git a/site/content/3.10/develop/http-api/replication/replication-applier.md b/site/content/arangodb/3.10/develop/http-api/replication/replication-applier.md similarity index 100% rename from site/content/3.10/develop/http-api/replication/replication-applier.md rename to site/content/arangodb/3.10/develop/http-api/replication/replication-applier.md diff --git a/site/content/3.10/develop/http-api/replication/replication-dump.md b/site/content/arangodb/3.10/develop/http-api/replication/replication-dump.md similarity index 100% rename from site/content/3.10/develop/http-api/replication/replication-dump.md rename to site/content/arangodb/3.10/develop/http-api/replication/replication-dump.md diff --git a/site/content/3.10/develop/http-api/replication/replication-logger.md b/site/content/arangodb/3.10/develop/http-api/replication/replication-logger.md similarity index 100% rename from site/content/3.10/develop/http-api/replication/replication-logger.md rename to site/content/arangodb/3.10/develop/http-api/replication/replication-logger.md diff --git a/site/content/3.10/develop/http-api/replication/write-ahead-log.md b/site/content/arangodb/3.10/develop/http-api/replication/write-ahead-log.md similarity index 100% rename from site/content/3.10/develop/http-api/replication/write-ahead-log.md rename to site/content/arangodb/3.10/develop/http-api/replication/write-ahead-log.md diff --git a/site/content/3.10/develop/http-api/security.md b/site/content/arangodb/3.10/develop/http-api/security.md similarity index 100% rename from site/content/3.10/develop/http-api/security.md rename to site/content/arangodb/3.10/develop/http-api/security.md diff --git a/site/content/3.10/develop/http-api/tasks.md b/site/content/arangodb/3.10/develop/http-api/tasks.md similarity index 100% rename from site/content/3.10/develop/http-api/tasks.md rename to site/content/arangodb/3.10/develop/http-api/tasks.md diff --git a/site/content/3.10/develop/http-api/transactions/_index.md b/site/content/arangodb/3.10/develop/http-api/transactions/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/transactions/_index.md rename to site/content/arangodb/3.10/develop/http-api/transactions/_index.md diff --git a/site/content/3.10/develop/http-api/transactions/javascript-transactions.md b/site/content/arangodb/3.10/develop/http-api/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.10/develop/http-api/transactions/javascript-transactions.md rename to site/content/arangodb/3.10/develop/http-api/transactions/javascript-transactions.md diff --git a/site/content/3.10/develop/http-api/transactions/stream-transactions.md b/site/content/arangodb/3.10/develop/http-api/transactions/stream-transactions.md similarity index 100% rename from site/content/3.10/develop/http-api/transactions/stream-transactions.md rename to site/content/arangodb/3.10/develop/http-api/transactions/stream-transactions.md diff --git a/site/content/3.10/develop/http-api/users.md b/site/content/arangodb/3.10/develop/http-api/users.md similarity index 100% rename from site/content/3.10/develop/http-api/users.md rename to site/content/arangodb/3.10/develop/http-api/users.md diff --git a/site/content/3.10/develop/http-api/views/_index.md b/site/content/arangodb/3.10/develop/http-api/views/_index.md similarity index 100% rename from site/content/3.10/develop/http-api/views/_index.md rename to site/content/arangodb/3.10/develop/http-api/views/_index.md diff --git a/site/content/3.10/develop/http-api/views/arangosearch-views.md b/site/content/arangodb/3.10/develop/http-api/views/arangosearch-views.md similarity index 100% rename from site/content/3.10/develop/http-api/views/arangosearch-views.md rename to site/content/arangodb/3.10/develop/http-api/views/arangosearch-views.md diff --git a/site/content/3.10/develop/http-api/views/search-alias-views.md b/site/content/arangodb/3.10/develop/http-api/views/search-alias-views.md similarity index 100% rename from site/content/3.10/develop/http-api/views/search-alias-views.md rename to site/content/arangodb/3.10/develop/http-api/views/search-alias-views.md diff --git a/site/content/3.10/develop/integrations/_index.md b/site/content/arangodb/3.10/develop/integrations/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/_index.md rename to site/content/arangodb/3.10/develop/integrations/_index.md diff --git a/site/content/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md b/site/content/arangodb/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md similarity index 99% rename from site/content/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md rename to site/content/arangodb/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md index 6cb6217cb0..031f1b8c06 100644 --- a/site/content/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md +++ b/site/content/arangodb/3.10/develop/integrations/arangodb-datasource-for-apache-spark.md @@ -324,7 +324,7 @@ The following Spark SQL data types (subtypes of `org.apache.spark.sql.types.Filt - `MapType` (only with key type `StringType`) - `StructType` -## Connect to the ArangoGraph Insights Platform +## Connect to the Arango Managed Platform (AMP) To connect to SSL secured deployments using X.509 Base64 encoded CA certificate (ArangoGraph): diff --git a/site/content/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md b/site/content/arangodb/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md rename to site/content/arangodb/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md diff --git a/site/content/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md b/site/content/arangodb/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md similarity index 100% rename from site/content/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md rename to site/content/arangodb/3.10/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md diff --git a/site/content/3.10/develop/integrations/spring-boot-arangodb.md b/site/content/arangodb/3.10/develop/integrations/spring-boot-arangodb.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-boot-arangodb.md rename to site/content/arangodb/3.10/develop/integrations/spring-boot-arangodb.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/migration.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/migration.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/migration.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/migration.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/template.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/template.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-3/template.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-3/template.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md diff --git a/site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/template.md b/site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/template.md similarity index 100% rename from site/content/3.10/develop/integrations/spring-data-arangodb/reference-version-4/template.md rename to site/content/arangodb/3.10/develop/integrations/spring-data-arangodb/reference-version-4/template.md diff --git a/site/content/3.10/develop/javascript-api/@arangodb/_index.md b/site/content/arangodb/3.10/develop/javascript-api/@arangodb/_index.md similarity index 100% rename from site/content/3.10/develop/javascript-api/@arangodb/_index.md rename to site/content/arangodb/3.10/develop/javascript-api/@arangodb/_index.md diff --git a/site/content/3.10/develop/javascript-api/@arangodb/collection-object.md b/site/content/arangodb/3.10/develop/javascript-api/@arangodb/collection-object.md similarity index 100% rename from site/content/3.10/develop/javascript-api/@arangodb/collection-object.md rename to site/content/arangodb/3.10/develop/javascript-api/@arangodb/collection-object.md diff --git a/site/content/3.10/develop/javascript-api/@arangodb/cursor-object.md b/site/content/arangodb/3.10/develop/javascript-api/@arangodb/cursor-object.md similarity index 100% rename from site/content/3.10/develop/javascript-api/@arangodb/cursor-object.md rename to site/content/arangodb/3.10/develop/javascript-api/@arangodb/cursor-object.md diff --git a/site/content/3.10/develop/javascript-api/@arangodb/db-object.md b/site/content/arangodb/3.10/develop/javascript-api/@arangodb/db-object.md similarity index 100% rename from site/content/3.10/develop/javascript-api/@arangodb/db-object.md rename to site/content/arangodb/3.10/develop/javascript-api/@arangodb/db-object.md diff --git a/site/content/3.10/develop/javascript-api/@arangodb/view-object.md b/site/content/arangodb/3.10/develop/javascript-api/@arangodb/view-object.md similarity index 100% rename from site/content/3.10/develop/javascript-api/@arangodb/view-object.md rename to site/content/arangodb/3.10/develop/javascript-api/@arangodb/view-object.md diff --git a/site/content/3.10/develop/javascript-api/_index.md b/site/content/arangodb/3.10/develop/javascript-api/_index.md similarity index 100% rename from site/content/3.10/develop/javascript-api/_index.md rename to site/content/arangodb/3.10/develop/javascript-api/_index.md diff --git a/site/content/3.10/develop/javascript-api/actions.md b/site/content/arangodb/3.10/develop/javascript-api/actions.md similarity index 100% rename from site/content/3.10/develop/javascript-api/actions.md rename to site/content/arangodb/3.10/develop/javascript-api/actions.md diff --git a/site/content/3.10/develop/javascript-api/analyzers.md b/site/content/arangodb/3.10/develop/javascript-api/analyzers.md similarity index 100% rename from site/content/3.10/develop/javascript-api/analyzers.md rename to site/content/arangodb/3.10/develop/javascript-api/analyzers.md diff --git a/site/content/3.10/develop/javascript-api/aql-queries.md b/site/content/arangodb/3.10/develop/javascript-api/aql-queries.md similarity index 100% rename from site/content/3.10/develop/javascript-api/aql-queries.md rename to site/content/arangodb/3.10/develop/javascript-api/aql-queries.md diff --git a/site/content/3.10/develop/javascript-api/console.md b/site/content/arangodb/3.10/develop/javascript-api/console.md similarity index 100% rename from site/content/3.10/develop/javascript-api/console.md rename to site/content/arangodb/3.10/develop/javascript-api/console.md diff --git a/site/content/3.10/develop/javascript-api/crypto.md b/site/content/arangodb/3.10/develop/javascript-api/crypto.md similarity index 100% rename from site/content/3.10/develop/javascript-api/crypto.md rename to site/content/arangodb/3.10/develop/javascript-api/crypto.md diff --git a/site/content/3.10/develop/javascript-api/fs.md b/site/content/arangodb/3.10/develop/javascript-api/fs.md similarity index 100% rename from site/content/3.10/develop/javascript-api/fs.md rename to site/content/arangodb/3.10/develop/javascript-api/fs.md diff --git a/site/content/3.10/develop/javascript-api/request.md b/site/content/arangodb/3.10/develop/javascript-api/request.md similarity index 100% rename from site/content/3.10/develop/javascript-api/request.md rename to site/content/arangodb/3.10/develop/javascript-api/request.md diff --git a/site/content/3.10/develop/javascript-api/tasks.md b/site/content/arangodb/3.10/develop/javascript-api/tasks.md similarity index 100% rename from site/content/3.10/develop/javascript-api/tasks.md rename to site/content/arangodb/3.10/develop/javascript-api/tasks.md diff --git a/site/content/3.10/develop/operational-factors.md b/site/content/arangodb/3.10/develop/operational-factors.md similarity index 100% rename from site/content/3.10/develop/operational-factors.md rename to site/content/arangodb/3.10/develop/operational-factors.md diff --git a/site/content/3.10/develop/satellitecollections.md b/site/content/arangodb/3.10/develop/satellitecollections.md similarity index 100% rename from site/content/3.10/develop/satellitecollections.md rename to site/content/arangodb/3.10/develop/satellitecollections.md diff --git a/site/content/3.10/develop/smartjoins.md b/site/content/arangodb/3.10/develop/smartjoins.md similarity index 100% rename from site/content/3.10/develop/smartjoins.md rename to site/content/arangodb/3.10/develop/smartjoins.md diff --git a/site/content/3.10/develop/transactions/_index.md b/site/content/arangodb/3.10/develop/transactions/_index.md similarity index 100% rename from site/content/3.10/develop/transactions/_index.md rename to site/content/arangodb/3.10/develop/transactions/_index.md diff --git a/site/content/3.10/develop/transactions/durability.md b/site/content/arangodb/3.10/develop/transactions/durability.md similarity index 100% rename from site/content/3.10/develop/transactions/durability.md rename to site/content/arangodb/3.10/develop/transactions/durability.md diff --git a/site/content/3.10/develop/transactions/javascript-transactions.md b/site/content/arangodb/3.10/develop/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.10/develop/transactions/javascript-transactions.md rename to site/content/arangodb/3.10/develop/transactions/javascript-transactions.md diff --git a/site/content/3.10/develop/transactions/limitations.md b/site/content/arangodb/3.10/develop/transactions/limitations.md similarity index 100% rename from site/content/3.10/develop/transactions/limitations.md rename to site/content/arangodb/3.10/develop/transactions/limitations.md diff --git a/site/content/3.10/develop/transactions/locking-and-isolation.md b/site/content/arangodb/3.10/develop/transactions/locking-and-isolation.md similarity index 100% rename from site/content/3.10/develop/transactions/locking-and-isolation.md rename to site/content/arangodb/3.10/develop/transactions/locking-and-isolation.md diff --git a/site/content/3.10/develop/transactions/stream-transactions.md b/site/content/arangodb/3.10/develop/transactions/stream-transactions.md similarity index 100% rename from site/content/3.10/develop/transactions/stream-transactions.md rename to site/content/arangodb/3.10/develop/transactions/stream-transactions.md diff --git a/site/content/3.10/get-started/_index.md b/site/content/arangodb/3.10/get-started/_index.md similarity index 100% rename from site/content/3.10/get-started/_index.md rename to site/content/arangodb/3.10/get-started/_index.md diff --git a/site/content/3.10/get-started/how-to-interact-with-arangodb.md b/site/content/arangodb/3.10/get-started/how-to-interact-with-arangodb.md similarity index 100% rename from site/content/3.10/get-started/how-to-interact-with-arangodb.md rename to site/content/arangodb/3.10/get-started/how-to-interact-with-arangodb.md diff --git a/site/content/3.10/get-started/on-premises-installation.md b/site/content/arangodb/3.10/get-started/on-premises-installation.md similarity index 94% rename from site/content/3.10/get-started/on-premises-installation.md rename to site/content/arangodb/3.10/get-started/on-premises-installation.md index 5dda1d48f9..df93e81006 100644 --- a/site/content/3.10/get-started/on-premises-installation.md +++ b/site/content/arangodb/3.10/get-started/on-premises-installation.md @@ -33,16 +33,16 @@ Depending on the installation method used, the installation process either prompted for the root password or the default root password is empty (see [Securing the installation](.#securing-the-installation)). -![Web Interface Login Form](../../images/loginView.png) +![Web Interface Login Form](../../../../images/loginView.png) Next you will be asked which database to use. Every server instance comes with a `_system` database. Select this database to continue. -![select database](../../images/selectDBView.png) +![select database](../../../../images/selectDBView.png) You should then be presented the dashboard with server statistics like this: -![Web Interface Dashboard Request Statistics](../../images/dashboardView.png) +![Web Interface Dashboard Request Statistics](../../../../images/dashboardView.png) For a more detailed description of the interface, see [Web Interface](../components/web-interface/_index.md). --> diff --git a/site/content/3.10/get-started/set-up-a-cloud-instance.md b/site/content/arangodb/3.10/get-started/set-up-a-cloud-instance.md similarity index 70% rename from site/content/3.10/get-started/set-up-a-cloud-instance.md rename to site/content/arangodb/3.10/get-started/set-up-a-cloud-instance.md index 1973721015..2fbc242b94 100644 --- a/site/content/3.10/get-started/set-up-a-cloud-instance.md +++ b/site/content/arangodb/3.10/get-started/set-up-a-cloud-instance.md @@ -6,10 +6,10 @@ description: >- This quick start guide covers the basics from creating an ArangoGraph account to setting up and accessing your first ArangoGraph deployment --- -For general information about the ArangoGraph Insights Platform, see +For general information about the Arango Managed Platform (AMP), see [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -For guides and reference documentation, see the [ArangoGraph](../arangograph/_index.md) documentation. +For guides and reference documentation, see the [ArangoGraph](../../../amp/_index.md) documentation. ## Prerequisites @@ -33,7 +33,7 @@ used for multiple accounts. 2. Click the __Start Free__ button or click the __Sign Up__ link in the top right corner. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) + ![ArangoGraph Homepage](../../../images/arangograph-homepage.png) 3. Review the terms & conditions and privacy policy and click __I accept__. 4. Select the type of sign up you would like to use (GitHub, Google, or @@ -42,11 +42,11 @@ used for multiple accounts. - For the email address option, type your desired email address in the email field and type a strong password in the password field. - {{< image src="../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} Click the __Sign up__ button. You will receive a verification email. In that mail, click the __Verify my email address__ link or button. - It opens a page in the ArangoGraph Insights Platform that says __Welcome back!__ + It opens a page in the Arango Managed Platform (AMP) that says __Welcome back!__ 5. Click the __Log in__ button to continue and login. 6. If you signed up with an email address of a public email service provider (e.g. Hotmail), a form appears asking for your mobile phone number. Enter the country code @@ -67,25 +67,25 @@ used for multiple accounts. provider and region. Pick one and click __Create deployment__. You can also select your intended use-case. - ![ArangoGraph Dashboard](../../images/arangograph-dashboard-free-tier.png) + ![ArangoGraph Dashboard](../../../images/arangograph-dashboard-free-tier.png) - You can also [create a deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) + You can also [create a deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) manually, if you want fine-grained configuration options. 2. The new deployment is displayed in the list of deployments for the respective project (here: _Avocado_). - ![ArangoGraph Deployments Bootstrapping](../../images/arangograph-deployments-bootstrapping.png) + ![ArangoGraph Deployments Bootstrapping](../../../images/arangograph-deployments-bootstrapping.png) It takes a couple of minutes before the deployment can be used. The status is changed from __Bootstrapping__ to __OK__ eventually and you also receive an email when it is ready. - {{< image src="../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} 3. Click the name of the deployment (or the __Open deployment details__ link in the email) to view the deployment details. - ![ArangoGraph Deployment Ready](../../images/arangograph-deployment-ready.png) + ![ArangoGraph Deployment Ready](../../../images/arangograph-deployment-ready.png) 4. Click the __Open database UI__ button to open the ArangoDB web interface. @@ -96,23 +96,23 @@ used for multiple accounts. Click __Guide__ for instructions on how to access and run queries against this data. - ![ArangoGraph Deployment Examples](../../images/arangograph-deployment-examples.png) + ![ArangoGraph Deployment Examples](../../../images/arangograph-deployment-examples.png) - ![ArangoGraph Deployment Examples IMDB Guide](../../images/arangograph-deployment-examples-imdb-guide.png) + ![ArangoGraph Deployment Examples IMDB Guide](../../../images/arangograph-deployment-examples-imdb-guide.png) ## General Hierarchy -The ArangoGraph Insights Platform supports multi-tenant setups via organizations. +The Arango Managed Platform (AMP) supports multi-tenant setups via organizations. You can create your own organization(s) and invite collaborators or join existing ones via invites. Your organization contains projects. Your projects hold your deployments. -- [**Organizations**](../arangograph/organizations/_index.md) +- [**Organizations**](../../../amp/organizations/_index.md) represent (commercial) entities such as companies. You can be part of multiple organizations with a single user account. - - [**Projects**](../arangograph/projects.md) + - [**Projects**](../../../amp/projects.md) represent organizational units such as teams or applications. - - [**Deployments**](../arangograph/deployments/_index.md) + - [**Deployments**](../../../amp/deployments/_index.md) are the actual instances of ArangoDB clusters. When you sign up for ArangoGraph, an organization and a default project are @@ -125,32 +125,32 @@ question mark to bring up the help menu and choose __Start tour__. This guided tour walks you through the creation of a deployment and shows you how to load example datasets and manage projects and deployments. -![Start tour in menu](../../images/arangograph-tour-start.png) +![Start tour in menu](../../../images/arangograph-tour-start.png) Alternatively, follow the steps of the linked guides: -- [Create a new project](../arangograph/projects.md#how-to-create-a-new-project) (optional) -- [Create a new deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) -- [Install a new certificate](../arangograph/security-and-access-control/x-509-certificates.md) (optional) -- [Access your deployment](../arangograph/deployments/_index.md#how-to-access-your-deployment) -- [Delete your deployment](../arangograph/deployments/_index.md#how-to-delete-a-deployment) +- [Create a new project](../../../amp/projects.md#how-to-create-a-new-project) (optional) +- [Create a new deployment](../../../../../amp/deployments/_index.md#how-to-create-a-new-deployment) +- [Install a new certificate](../../../amp/security-and-access-control/x-509-certificates.md) (optional) +- [Access your deployment](../../../amp/deployments/_index.md#how-to-access-your-deployment) +- [Delete your deployment](../../../amp/deployments/_index.md#how-to-delete-a-deployment) ## Free-to-Try vs. Paid -The ArangoGraph Insights Platform comes with a free-to-try tier that lets you test +The Arango Managed Platform (AMP) comes with a free-to-try tier that lets you test the ArangoDB Cloud for free for 14 days. It includes one project and one small deployment of 4GB, local backups, and one notebook for learning and data science. After the trial period, your deployment is automatically deleted. You can unlock all features in ArangoGraph at any time by adding your billing details and at least one payment method. See: -- [ArangoGraph Packages](../arangograph/organizations/_index.md#arangograph-packages) -- [How to add billing details to organizations](../arangograph/organizations/billing.md#how-to-add-billing-details) -- [How to add a payment method to an organization](../arangograph/organizations/billing.md#how-to-add-a-payment-method) +- [ArangoGraph Packages](../../../amp/organizations/_index.md#arangograph-packages) +- [How to add billing details to organizations](../../../amp/organizations/billing.md#how-to-add-billing-details) +- [How to add a payment method to an organization](../../../amp/organizations/billing.md#how-to-add-a-payment-method) ## Managed Cloud Service vs. On-premises Comparison: Key Differences -The ArangoGraph Insights Platform aims to make all features of the ArangoDB -[Enterprise Edition](../about-arangodb/features/enterprise-edition.md) available to you, but +The Arango Managed Platform (AMP) aims to make all features of the ArangoDB +[Enterprise Edition](../about/features/enterprise-edition.md) available to you, but there are a few key differences: - Encryption (both at rest & network traffic) is always on and cannot be diff --git a/site/content/3.10/get-started/start-using-aql.md b/site/content/arangodb/3.10/get-started/start-using-aql.md similarity index 100% rename from site/content/3.10/get-started/start-using-aql.md rename to site/content/arangodb/3.10/get-started/start-using-aql.md diff --git a/site/content/3.10/graphs/_index.md b/site/content/arangodb/3.10/graphs/_index.md similarity index 97% rename from site/content/3.10/graphs/_index.md rename to site/content/arangodb/3.10/graphs/_index.md index b22e55f098..e0f8c3da89 100644 --- a/site/content/3.10/graphs/_index.md +++ b/site/content/arangodb/3.10/graphs/_index.md @@ -17,12 +17,12 @@ relationships, flows of information, energy, and material, interactions and transactions, dependency and hierarchy, as well as similarity and relatedness of any kind. -![Node - Relation - Node](../../images/data-model-graph-relation-abstract.png) +![Node - Relation - Node](../../../images/data-model-graph-relation-abstract.png) For example, you can represent people by nodes and their friendships by relations. This lets you form a graph that is a social network in this case. -![Mary - is friend of - John](../../images/data-model-graph-relation-concrete.png) +![Mary - is friend of - John](../../../images/data-model-graph-relation-concrete.png) The specific terms to refer to nodes and relations in a graph vary depending on the field or context, but they are conceptually the same. In computer science @@ -37,7 +37,7 @@ relate to one another is a very expressive data model. It lets you represent a wide variety of information in a compact and intuitive way. It lets you model complex relationships and interactions of basically everything. -![Mary - bought - Book, is friend of - John](../../images/data-model-graph-relations.png) +![Mary - bought - Book, is friend of - John](../../../images/data-model-graph-relations.png) Graphs are commonly directed (_digraphs_), which means that each edge goes from one vertex to another vertex in a specific direction. This lets you model @@ -223,7 +223,7 @@ suboptimal query performance due to random data distribution. General graphs are the easiest way to get started, no special configuration required. {{< /tip >}} -![General Graph Random Distribution](../../images/general-graph-distribution.png) +![General Graph Random Distribution](../../../images/general-graph-distribution.png) #### When to use SmartGraphs @@ -238,7 +238,7 @@ scenarios, use SmartGraphs. Organize your data efficiently using the `smartGraphAttribute`. {{< /tip >}} -![SmartGraph Distribution](../../images/smartgraph-distribution.png) +![SmartGraph Distribution](../../../images/smartgraph-distribution.png) #### When to use EnterpriseGraphs @@ -252,7 +252,7 @@ If you need improved query execution without manual data distribution, consider using EnterpriseGraphs. {{< /tip >}} -![EnterpriseGraph Distribution](../../images/enterprisegraph-distribution.png) +![EnterpriseGraph Distribution](../../../images/enterprisegraph-distribution.png) #### When to use SatelliteGraphs @@ -339,7 +339,7 @@ with `_from` pointing to `Users/John` and `_to` pointing to attributes to qualify the relation further, like the permissions of **John** in this group, the date when John joined the group, and so on. -![User in group example](../../images/graph_user_in_group.png) +![User in group example](../../../images/graph_user_in_group.png) As a rule of thumb, if you use documents and their attributes in a sentence, nouns would typically be vertices, and the verbs the edges. diff --git a/site/content/3.10/graphs/enterprisegraphs/_index.md b/site/content/arangodb/3.10/graphs/enterprisegraphs/_index.md similarity index 100% rename from site/content/3.10/graphs/enterprisegraphs/_index.md rename to site/content/arangodb/3.10/graphs/enterprisegraphs/_index.md diff --git a/site/content/3.10/graphs/enterprisegraphs/getting-started.md b/site/content/arangodb/3.10/graphs/enterprisegraphs/getting-started.md similarity index 99% rename from site/content/3.10/graphs/enterprisegraphs/getting-started.md rename to site/content/arangodb/3.10/graphs/enterprisegraphs/getting-started.md index 1997e74ea5..3a622bbb27 100644 --- a/site/content/3.10/graphs/enterprisegraphs/getting-started.md +++ b/site/content/arangodb/3.10/graphs/enterprisegraphs/getting-started.md @@ -211,7 +211,7 @@ EnterpriseGraphs. To get started, follow the steps outlined below. 6. Click the card of the newly created graph use the functions of the Graph Viewer to visually interact with the graph and manage the graph data. -![Create EnterpriseGraph](../../../images/graphs-create-enterprise-graph-dialog.png) +![Create EnterpriseGraph](../../../../images/graphs-create-enterprise-graph-dialog.png) ## Create an EnterpriseGraph using *arangosh* diff --git a/site/content/3.10/graphs/enterprisegraphs/management.md b/site/content/arangodb/3.10/graphs/enterprisegraphs/management.md similarity index 100% rename from site/content/3.10/graphs/enterprisegraphs/management.md rename to site/content/arangodb/3.10/graphs/enterprisegraphs/management.md diff --git a/site/content/3.11/graphs/example-graphs.md b/site/content/arangodb/3.10/graphs/example-graphs.md similarity index 94% rename from site/content/3.11/graphs/example-graphs.md rename to site/content/arangodb/3.10/graphs/example-graphs.md index 300154d268..58b269cbf0 100644 --- a/site/content/3.11/graphs/example-graphs.md +++ b/site/content/arangodb/3.10/graphs/example-graphs.md @@ -26,7 +26,7 @@ for reference about how to manage graphs programmatically. The `knows` graph is a set of persons knowing each other: -![Persons relation Example Graph](../../images/knows_graph.png) +![Persons relation Example Graph](../../../images/knows_graph.png) The graph consists of a `persons` vertex collection connected via a `knows` edge collection. @@ -63,7 +63,7 @@ The `traversalGraph` has been designed to demonstrate filters in traversals. It has some labels to filter on it. The graph's vertices are in a collection called `circles`, and it has an edge collection `edges` to connect them. -![Traversal Graph](../../images/traversal_graph.png) +![Traversal Graph](../../../images/traversal_graph.png) Circles have unique numeric labels. Edges have two boolean attributes (`theFalse` always being `false`, `theTruth` always being `true`) and a label @@ -93,7 +93,7 @@ The vertices in the `kShortestPathsGraph` graph are train stations of cities in Europe and North America. The edges represent train connections between them, with the travel time for both directions as edge weight. -![Train Connection Map](../../images/train_map.png) +![Train Connection Map](../../../images/train_map.png) See the [k Shortest Paths page](../aql/graphs/k-shortest-paths.md) for query examples. @@ -118,7 +118,7 @@ The example graph consists of vertices in the `mps_verts` collection and edges in the `mps_edges` collection. It is a simple traversal graph with start node *A* and end node *C*. -![Mps Graph](../../images/mps_graph.png) +![Mps Graph](../../../images/mps_graph.png) With the [Shortest Path](../aql/graphs/shortest-path.md) algorithm, you either get the shortest path *A* - *B* - *C* or *A* - *D* - *C*. With the @@ -146,7 +146,7 @@ The `worldCountry` graph has as node structure as follows: world → continent → country → capital -![World Graph](../../images/world_graph.png) +![World Graph](../../../images/world_graph.png) In some cases, edge directions aren't forward. Therefore, it may get displayed disjunct in the graph viewer. @@ -175,7 +175,7 @@ The `social` graph is a set of persons and their relations. The graph has `female` and `male` persons as vertices in two vertex collections. The edges are their connections and stored in the `relation` edge collection. -![Social Example Graph](../../images/social_graph.png) +![Social Example Graph](../../../images/social_graph.png) Example of how to create the graph, inspect its vertices and edges, and delete it again: @@ -201,7 +201,7 @@ multiple vertex collections (`germanCity` and `frenchCity`). The edges are their interconnections in several edge collections (`frenchHighway`, `germanHighway`, `internationalHighway`). -![Cities Example Graph](../../images/cities_graph.png) +![Cities Example Graph](../../../images/cities_graph.png) Example of how to create the graph, inspect its edges and vertices, and delete it again: @@ -231,7 +231,7 @@ Also see: - [Distributed Iterative Graph Processing (Pregel)](../data-science/pregel/_index.md) - [Pregel HTTP API](../develop/http-api/pregel.md) -![Three disjoint subgraphs with 36 nodes and edges in total](../../images/connected_components.png) +![Three disjoint subgraphs with 36 nodes and edges in total](../../../images/connected_components.png) ```js --- diff --git a/site/content/3.10/graphs/general-graphs/_index.md b/site/content/arangodb/3.10/graphs/general-graphs/_index.md similarity index 98% rename from site/content/3.10/graphs/general-graphs/_index.md rename to site/content/arangodb/3.10/graphs/general-graphs/_index.md index d7c072c47e..6025339a08 100644 --- a/site/content/3.10/graphs/general-graphs/_index.md +++ b/site/content/arangodb/3.10/graphs/general-graphs/_index.md @@ -57,7 +57,7 @@ General Graphs. To get started, follow the steps outlined below. 8. Click the card of the newly created graph and use the functions of the Graph Viewer to visually interact with the graph and manage the graph data. -![Create General Graph](../../../images/Create-GeneralGraph.png) +![Create General Graph](../../../../images/Create-GeneralGraph.png) ### Create a General Graph using *arangosh* diff --git a/site/content/3.11/graphs/general-graphs/functions.md b/site/content/arangodb/3.10/graphs/general-graphs/functions.md similarity index 99% rename from site/content/3.11/graphs/general-graphs/functions.md rename to site/content/arangodb/3.10/graphs/general-graphs/functions.md index 87fb731922..c05189027d 100644 --- a/site/content/3.11/graphs/general-graphs/functions.md +++ b/site/content/arangodb/3.10/graphs/general-graphs/functions.md @@ -10,7 +10,7 @@ A lot of these accept a vertex (or edge) example as parameter as defined in the Examples explain the API using the [City Graph](../example-graphs.md#city-graph): -![Social Example Graph](../../../images/cities_graph.png) +![Social Example Graph](../../../../images/cities_graph.png) ## Definition of examples diff --git a/site/content/3.10/graphs/general-graphs/management.md b/site/content/arangodb/3.10/graphs/general-graphs/management.md similarity index 100% rename from site/content/3.10/graphs/general-graphs/management.md rename to site/content/arangodb/3.10/graphs/general-graphs/management.md diff --git a/site/content/3.10/graphs/satellitegraphs/_index.md b/site/content/arangodb/3.10/graphs/satellitegraphs/_index.md similarity index 98% rename from site/content/3.10/graphs/satellitegraphs/_index.md rename to site/content/arangodb/3.10/graphs/satellitegraphs/_index.md index 3d2c9b9a7b..9f22526ee7 100644 --- a/site/content/3.10/graphs/satellitegraphs/_index.md +++ b/site/content/arangodb/3.10/graphs/satellitegraphs/_index.md @@ -21,7 +21,7 @@ the performance of such queries. They are the natural extension of the [SatelliteCollections](../../develop/satellitecollections.md) concept to graphs. The same benefits and caveats apply. -![ArangoDB SatelliteGraphs](../../../images/SatelliteGraphs.webp) +![ArangoDB SatelliteGraphs](../../../../images/SatelliteGraphs.webp) ## Why use a SatelliteGraph? diff --git a/site/content/3.10/graphs/satellitegraphs/details.md b/site/content/arangodb/3.10/graphs/satellitegraphs/details.md similarity index 100% rename from site/content/3.10/graphs/satellitegraphs/details.md rename to site/content/arangodb/3.10/graphs/satellitegraphs/details.md diff --git a/site/content/3.10/graphs/satellitegraphs/management.md b/site/content/arangodb/3.10/graphs/satellitegraphs/management.md similarity index 100% rename from site/content/3.10/graphs/satellitegraphs/management.md rename to site/content/arangodb/3.10/graphs/satellitegraphs/management.md diff --git a/site/content/3.10/graphs/smartgraphs/_index.md b/site/content/arangodb/3.10/graphs/smartgraphs/_index.md similarity index 94% rename from site/content/3.10/graphs/smartgraphs/_index.md rename to site/content/arangodb/3.10/graphs/smartgraphs/_index.md index 3d15be6c58..a9a166b0fe 100644 --- a/site/content/3.10/graphs/smartgraphs/_index.md +++ b/site/content/arangodb/3.10/graphs/smartgraphs/_index.md @@ -62,7 +62,7 @@ cluster for both scenarios. Let's take a closer look at it. The natural distribution of data for graphs that handle large datasets involves a series of highly interconnected nodes with many edges running between them. -![Random data distribution](../../../images/SmartGraphs_random_distribution.png) +![Random data distribution](../../../../images/SmartGraphs_random_distribution.png) _The orange line indicates an example graph traversal. Notice how it touches nodes on every server._ @@ -88,7 +88,7 @@ connecting vertices with identical `smartGraphAttribute` values are stored on this machine as well. Sharding with this attribute means that the relevant data is now co-located on servers, whenever possible. -![SmartGraphs data distribution](../../../images/SmartGraphs_distribution.png) +![SmartGraphs data distribution](../../../../images/SmartGraphs_distribution.png) _The outcome of moving the data like this is that you retain the scalability as well as the performance of graph traversals in ArangoDB._ @@ -103,7 +103,7 @@ and (k-)shortest path(s) query can partially be executed locally on each DB-Serv This means a larger part of the query can be executed fully local whenever data from the SatelliteCollections is required. -![SmartGraphs with SatelliteCollections](../../../images/SmartGraphs-using-SatelliteCollections.png) +![SmartGraphs with SatelliteCollections](../../../../images/SmartGraphs-using-SatelliteCollections.png) ## Disjoint SmartGraphs @@ -112,7 +112,7 @@ large forest of graphs, when you have clearly separated subgraphs in your graph dataset. Disjoint SmartGraphs enable the automatic sharding of these subgraphs and prohibit edges connecting them. -![Disjoint SmartGraphs](../../../images/SmartGraphs-Disjoint.png) +![Disjoint SmartGraphs](../../../../images/SmartGraphs-Disjoint.png) _This ensures that graph traversals, shortest path, and k-shortest-paths queries can be executed locally on a DB-Server, achieving improved performance for diff --git a/site/content/3.10/graphs/smartgraphs/getting-started.md b/site/content/arangodb/3.10/graphs/smartgraphs/getting-started.md similarity index 99% rename from site/content/3.10/graphs/smartgraphs/getting-started.md rename to site/content/arangodb/3.10/graphs/smartgraphs/getting-started.md index 7a41c973bf..cae518afd9 100644 --- a/site/content/3.10/graphs/smartgraphs/getting-started.md +++ b/site/content/arangodb/3.10/graphs/smartgraphs/getting-started.md @@ -63,7 +63,7 @@ SmartGraphs. To get started, follow the steps outlined below. 7. Click the card of the newly created graph and use the functions of the Graph Viewer to visually interact with the graph and manage the graph data. -![Create SmartGraph](../../../images/Create-SmartGraph.png) +![Create SmartGraph](../../../../images/Create-SmartGraph.png) ## Create a SmartGraph using *arangosh* diff --git a/site/content/3.10/graphs/smartgraphs/management.md b/site/content/arangodb/3.10/graphs/smartgraphs/management.md similarity index 100% rename from site/content/3.10/graphs/smartgraphs/management.md rename to site/content/arangodb/3.10/graphs/smartgraphs/management.md diff --git a/site/content/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md similarity index 100% rename from site/content/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md rename to site/content/arangodb/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md diff --git a/site/content/3.10/graphs/working-with-edges.md b/site/content/arangodb/3.10/graphs/working-with-edges.md similarity index 100% rename from site/content/3.10/graphs/working-with-edges.md rename to site/content/arangodb/3.10/graphs/working-with-edges.md diff --git a/site/content/3.10/index-and-search/_index.md b/site/content/arangodb/3.10/index-and-search/_index.md similarity index 100% rename from site/content/3.10/index-and-search/_index.md rename to site/content/arangodb/3.10/index-and-search/_index.md diff --git a/site/content/3.10/index-and-search/analyzers.md b/site/content/arangodb/3.10/index-and-search/analyzers.md similarity index 100% rename from site/content/3.10/index-and-search/analyzers.md rename to site/content/arangodb/3.10/index-and-search/analyzers.md diff --git a/site/content/3.10/index-and-search/arangosearch/_index.md b/site/content/arangodb/3.10/index-and-search/arangosearch/_index.md similarity index 99% rename from site/content/3.10/index-and-search/arangosearch/_index.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/_index.md index 795de06af3..c6c092b8a0 100644 --- a/site/content/3.10/index-and-search/arangosearch/_index.md +++ b/site/content/arangodb/3.10/index-and-search/arangosearch/_index.md @@ -65,7 +65,7 @@ Search results can be sorted by their similarity ranking to return the best matches first using popular scoring algorithms (Okapi BM25, TF-IDF), user-defined relevance boosting and dynamic score calculation. -![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../images/arangosearch.png) +![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../../images/arangosearch.png) Views can be managed in the web interface, via an [HTTP API](../../develop/http-api/views/_index.md) and through a [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views). diff --git a/site/content/3.10/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/3.10/index-and-search/arangosearch/arangosearch-views-reference.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/arangosearch-views-reference.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/arangosearch-views-reference.md diff --git a/site/content/3.10/index-and-search/arangosearch/case-sensitivity-and-diacritics.md b/site/content/arangodb/3.10/index-and-search/arangosearch/case-sensitivity-and-diacritics.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/case-sensitivity-and-diacritics.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/case-sensitivity-and-diacritics.md diff --git a/site/content/3.10/index-and-search/arangosearch/exact-value-matching.md b/site/content/arangodb/3.10/index-and-search/arangosearch/exact-value-matching.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/exact-value-matching.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/exact-value-matching.md diff --git a/site/content/3.10/index-and-search/arangosearch/example-datasets.md b/site/content/arangodb/3.10/index-and-search/arangosearch/example-datasets.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/example-datasets.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/example-datasets.md diff --git a/site/content/3.10/index-and-search/arangosearch/faceted-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/faceted-search.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/faceted-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/faceted-search.md diff --git a/site/content/3.10/index-and-search/arangosearch/full-text-token-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/full-text-token-search.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/full-text-token-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/full-text-token-search.md diff --git a/site/content/3.10/index-and-search/arangosearch/fuzzy-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/fuzzy-search.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/fuzzy-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/fuzzy-search.md diff --git a/site/content/3.10/index-and-search/arangosearch/geospatial-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/geospatial-search.md similarity index 99% rename from site/content/3.10/index-and-search/arangosearch/geospatial-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/geospatial-search.md index 996e1f9eb0..d8df3fc973 100644 --- a/site/content/3.10/index-and-search/arangosearch/geospatial-search.md +++ b/site/content/arangodb/3.10/index-and-search/arangosearch/geospatial-search.md @@ -297,7 +297,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for points in a polygon](../../../images/arangosearch-geo-points-in-polygon.png) +![ArangoSearch geospatial query for points in a polygon](../../../../images/arangosearch-geo-points-in-polygon.png) You do not have to look up the polygon, you can also provide one inline. It is also not necessary to return the polygon, you can return the matches only: @@ -559,7 +559,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geosptial query for polygons in a polygon](../../../images/arangosearch-geo-polygons-in-polygon.png) +![ArangoSearch geosptial query for polygons in a polygon](../../../../images/arangosearch-geo-polygons-in-polygon.png) Searching for geo features in a rectangle is something you can use together with an interactive map that the user can select the area of interest with. @@ -629,4 +629,4 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for polygons intersecting a polygon](../../../images/arangosearch-geo-polygons-intersecting-polygon.png) +![ArangoSearch geospatial query for polygons intersecting a polygon](../../../../images/arangosearch-geo-polygons-intersecting-polygon.png) diff --git a/site/content/3.10/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/nested-search.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/nested-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/nested-search.md diff --git a/site/content/3.10/index-and-search/arangosearch/performance.md b/site/content/arangodb/3.10/index-and-search/arangosearch/performance.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/performance.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/performance.md diff --git a/site/content/3.10/index-and-search/arangosearch/phrase-and-proximity-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/phrase-and-proximity-search.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/phrase-and-proximity-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/phrase-and-proximity-search.md diff --git a/site/content/3.10/index-and-search/arangosearch/prefix-matching.md b/site/content/arangodb/3.10/index-and-search/arangosearch/prefix-matching.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/prefix-matching.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/prefix-matching.md diff --git a/site/content/3.10/index-and-search/arangosearch/range-queries.md b/site/content/arangodb/3.10/index-and-search/arangosearch/range-queries.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/range-queries.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/range-queries.md diff --git a/site/content/3.10/index-and-search/arangosearch/ranking.md b/site/content/arangodb/3.10/index-and-search/arangosearch/ranking.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/ranking.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/ranking.md diff --git a/site/content/3.10/index-and-search/arangosearch/search-alias-views-reference.md b/site/content/arangodb/3.10/index-and-search/arangosearch/search-alias-views-reference.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/search-alias-views-reference.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/search-alias-views-reference.md diff --git a/site/content/3.10/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/3.10/index-and-search/arangosearch/search-highlighting.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/search-highlighting.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/search-highlighting.md diff --git a/site/content/3.10/index-and-search/arangosearch/wildcard-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/wildcard-search.md similarity index 100% rename from site/content/3.10/index-and-search/arangosearch/wildcard-search.md rename to site/content/arangodb/3.10/index-and-search/arangosearch/wildcard-search.md diff --git a/site/content/3.10/index-and-search/indexing/_index.md b/site/content/arangodb/3.10/index-and-search/indexing/_index.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/_index.md rename to site/content/arangodb/3.10/index-and-search/indexing/_index.md diff --git a/site/content/3.10/index-and-search/indexing/basics.md b/site/content/arangodb/3.10/index-and-search/indexing/basics.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/basics.md rename to site/content/arangodb/3.10/index-and-search/indexing/basics.md diff --git a/site/content/3.10/index-and-search/indexing/index-utilization.md b/site/content/arangodb/3.10/index-and-search/indexing/index-utilization.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/index-utilization.md rename to site/content/arangodb/3.10/index-and-search/indexing/index-utilization.md diff --git a/site/content/3.10/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/3.10/index-and-search/indexing/which-index-to-use-when.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/which-index-to-use-when.md rename to site/content/arangodb/3.10/index-and-search/indexing/which-index-to-use-when.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/_index.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/_index.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/_index.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/_index.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/fulltext-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/fulltext-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/fulltext-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/fulltext-indexes.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/inverted-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/inverted-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/inverted-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/inverted-indexes.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/persistent-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/persistent-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/persistent-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/persistent-indexes.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/ttl-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/ttl-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/ttl-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/ttl-indexes.md diff --git a/site/content/3.10/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md b/site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md similarity index 100% rename from site/content/3.10/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md rename to site/content/arangodb/3.10/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md diff --git a/site/content/3.10/operations/_index.md b/site/content/arangodb/3.10/operations/_index.md similarity index 100% rename from site/content/3.10/operations/_index.md rename to site/content/arangodb/3.10/operations/_index.md diff --git a/site/content/3.10/operations/administration/_index.md b/site/content/arangodb/3.10/operations/administration/_index.md similarity index 100% rename from site/content/3.10/operations/administration/_index.md rename to site/content/arangodb/3.10/operations/administration/_index.md diff --git a/site/content/3.10/operations/administration/arangodb-starter/_index.md b/site/content/arangodb/3.10/operations/administration/arangodb-starter/_index.md similarity index 100% rename from site/content/3.10/operations/administration/arangodb-starter/_index.md rename to site/content/arangodb/3.10/operations/administration/arangodb-starter/_index.md diff --git a/site/content/3.10/operations/administration/arangodb-starter/recovery-procedure.md b/site/content/arangodb/3.10/operations/administration/arangodb-starter/recovery-procedure.md similarity index 100% rename from site/content/3.10/operations/administration/arangodb-starter/recovery-procedure.md rename to site/content/arangodb/3.10/operations/administration/arangodb-starter/recovery-procedure.md diff --git a/site/content/3.10/operations/administration/arangodb-starter/removal-procedure.md b/site/content/arangodb/3.10/operations/administration/arangodb-starter/removal-procedure.md similarity index 100% rename from site/content/3.10/operations/administration/arangodb-starter/removal-procedure.md rename to site/content/arangodb/3.10/operations/administration/arangodb-starter/removal-procedure.md diff --git a/site/content/3.10/operations/administration/configuration.md b/site/content/arangodb/3.10/operations/administration/configuration.md similarity index 100% rename from site/content/3.10/operations/administration/configuration.md rename to site/content/arangodb/3.10/operations/administration/configuration.md diff --git a/site/content/3.10/operations/administration/import-and-export.md b/site/content/arangodb/3.10/operations/administration/import-and-export.md similarity index 100% rename from site/content/3.10/operations/administration/import-and-export.md rename to site/content/arangodb/3.10/operations/administration/import-and-export.md diff --git a/site/content/3.10/operations/administration/license-management.md b/site/content/arangodb/3.10/operations/administration/license-management.md similarity index 100% rename from site/content/3.10/operations/administration/license-management.md rename to site/content/arangodb/3.10/operations/administration/license-management.md diff --git a/site/content/3.10/operations/administration/log-levels.md b/site/content/arangodb/3.10/operations/administration/log-levels.md similarity index 100% rename from site/content/3.10/operations/administration/log-levels.md rename to site/content/arangodb/3.10/operations/administration/log-levels.md diff --git a/site/content/3.10/operations/administration/reduce-memory-footprint.md b/site/content/arangodb/3.10/operations/administration/reduce-memory-footprint.md similarity index 99% rename from site/content/3.10/operations/administration/reduce-memory-footprint.md rename to site/content/arangodb/3.10/operations/administration/reduce-memory-footprint.md index d38c42a797..a43aea092f 100644 --- a/site/content/3.10/operations/administration/reduce-memory-footprint.md +++ b/site/content/arangodb/3.10/operations/administration/reduce-memory-footprint.md @@ -674,7 +674,7 @@ otherwise. ## Testing the Effects of Reduced I/O Buffers -![Performance Graph](../../../images/performance_graph.png) +![Performance Graph](../../../../images/performance_graph.png) - 15:50 – Start bigger import - 16:00 – Start writing documents of ~60 KB size one at a time diff --git a/site/content/3.10/operations/administration/user-management/_index.md b/site/content/arangodb/3.10/operations/administration/user-management/_index.md similarity index 100% rename from site/content/3.10/operations/administration/user-management/_index.md rename to site/content/arangodb/3.10/operations/administration/user-management/_index.md diff --git a/site/content/3.10/operations/administration/user-management/in-arangosh.md b/site/content/arangodb/3.10/operations/administration/user-management/in-arangosh.md similarity index 100% rename from site/content/3.10/operations/administration/user-management/in-arangosh.md rename to site/content/arangodb/3.10/operations/administration/user-management/in-arangosh.md diff --git a/site/content/3.10/operations/backup-and-restore.md b/site/content/arangodb/3.10/operations/backup-and-restore.md similarity index 100% rename from site/content/3.10/operations/backup-and-restore.md rename to site/content/arangodb/3.10/operations/backup-and-restore.md diff --git a/site/content/3.10/operations/installation/_index.md b/site/content/arangodb/3.10/operations/installation/_index.md similarity index 97% rename from site/content/3.10/operations/installation/_index.md rename to site/content/arangodb/3.10/operations/installation/_index.md index 0678048be7..b3d809b5f8 100644 --- a/site/content/3.10/operations/installation/_index.md +++ b/site/content/arangodb/3.10/operations/installation/_index.md @@ -39,7 +39,7 @@ ArangoDB requires systems with Little Endian byte order. {{< /info >}} {{< tip >}} -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is a fully-managed service and requires no installation. It's the easiest way to run ArangoDB in the cloud. {{< /tip >}} diff --git a/site/content/3.10/operations/installation/compiling/_index.md b/site/content/arangodb/3.10/operations/installation/compiling/_index.md similarity index 100% rename from site/content/3.10/operations/installation/compiling/_index.md rename to site/content/arangodb/3.10/operations/installation/compiling/_index.md diff --git a/site/content/3.10/operations/installation/compiling/compile-on-debian.md b/site/content/arangodb/3.10/operations/installation/compiling/compile-on-debian.md similarity index 100% rename from site/content/3.10/operations/installation/compiling/compile-on-debian.md rename to site/content/arangodb/3.10/operations/installation/compiling/compile-on-debian.md diff --git a/site/content/3.10/operations/installation/compiling/compile-on-windows.md b/site/content/arangodb/3.10/operations/installation/compiling/compile-on-windows.md similarity index 99% rename from site/content/3.10/operations/installation/compiling/compile-on-windows.md rename to site/content/arangodb/3.10/operations/installation/compiling/compile-on-windows.md index c89c5d3347..dcdac2e1a1 100644 --- a/site/content/3.10/operations/installation/compiling/compile-on-windows.md +++ b/site/content/arangodb/3.10/operations/installation/compiling/compile-on-windows.md @@ -116,7 +116,7 @@ right click on `This PC` in the tree on the left, choose `Properties` in the ope in the Popup `Environment Variables`, another popup opens, in the `System Variables` part you click `New`, And variable name: `ICU_DATA` to the value: `c:\\Windows` -![HowtoSetEnv](../../../../images/SetEnvironmentVar.png) +![HowtoSetEnv](../../../../../images/SetEnvironmentVar.png) ## Unit tests (Optional) diff --git a/site/content/3.10/operations/installation/compiling/recompiling-jemalloc.md b/site/content/arangodb/3.10/operations/installation/compiling/recompiling-jemalloc.md similarity index 100% rename from site/content/3.10/operations/installation/compiling/recompiling-jemalloc.md rename to site/content/arangodb/3.10/operations/installation/compiling/recompiling-jemalloc.md diff --git a/site/content/3.10/operations/installation/compiling/running-custom-build.md b/site/content/arangodb/3.10/operations/installation/compiling/running-custom-build.md similarity index 100% rename from site/content/3.10/operations/installation/compiling/running-custom-build.md rename to site/content/arangodb/3.10/operations/installation/compiling/running-custom-build.md diff --git a/site/content/3.10/operations/installation/docker.md b/site/content/arangodb/3.10/operations/installation/docker.md similarity index 100% rename from site/content/3.10/operations/installation/docker.md rename to site/content/arangodb/3.10/operations/installation/docker.md diff --git a/site/content/3.10/operations/installation/linux/_index.md b/site/content/arangodb/3.10/operations/installation/linux/_index.md similarity index 100% rename from site/content/3.10/operations/installation/linux/_index.md rename to site/content/arangodb/3.10/operations/installation/linux/_index.md diff --git a/site/content/3.10/operations/installation/linux/linux-os-tuning-script-examples.md b/site/content/arangodb/3.10/operations/installation/linux/linux-os-tuning-script-examples.md similarity index 100% rename from site/content/3.10/operations/installation/linux/linux-os-tuning-script-examples.md rename to site/content/arangodb/3.10/operations/installation/linux/linux-os-tuning-script-examples.md diff --git a/site/content/3.10/operations/installation/linux/operating-system-configuration.md b/site/content/arangodb/3.10/operations/installation/linux/operating-system-configuration.md similarity index 100% rename from site/content/3.10/operations/installation/linux/operating-system-configuration.md rename to site/content/arangodb/3.10/operations/installation/linux/operating-system-configuration.md diff --git a/site/content/3.10/operations/installation/macos.md b/site/content/arangodb/3.10/operations/installation/macos.md similarity index 100% rename from site/content/3.10/operations/installation/macos.md rename to site/content/arangodb/3.10/operations/installation/macos.md diff --git a/site/content/3.10/operations/installation/uninstallation.md b/site/content/arangodb/3.10/operations/installation/uninstallation.md similarity index 100% rename from site/content/3.10/operations/installation/uninstallation.md rename to site/content/arangodb/3.10/operations/installation/uninstallation.md diff --git a/site/content/3.10/operations/installation/windows.md b/site/content/arangodb/3.10/operations/installation/windows.md similarity index 100% rename from site/content/3.10/operations/installation/windows.md rename to site/content/arangodb/3.10/operations/installation/windows.md diff --git a/site/content/3.10/operations/security/_index.md b/site/content/arangodb/3.10/operations/security/_index.md similarity index 100% rename from site/content/3.10/operations/security/_index.md rename to site/content/arangodb/3.10/operations/security/_index.md diff --git a/site/content/3.10/operations/security/audit-logging.md b/site/content/arangodb/3.10/operations/security/audit-logging.md similarity index 98% rename from site/content/3.10/operations/security/audit-logging.md rename to site/content/arangodb/3.10/operations/security/audit-logging.md index 651d1917da..b4e3164010 100644 --- a/site/content/3.10/operations/security/audit-logging.md +++ b/site/content/arangodb/3.10/operations/security/audit-logging.md @@ -13,7 +13,7 @@ pageToc: {{< tip >}} A similar feature is also available in the -[ArangoGraph Insights Platform](../../arangograph/security-and-access-control/_index.md#using-an-audit-log). +[Arango Managed Platform (AMP)](../../../../amp/security-and-access-control/_index.md#using-an-audit-log). {{< /tip >}} ## Configuration diff --git a/site/content/3.10/operations/security/change-root-password.md b/site/content/arangodb/3.10/operations/security/change-root-password.md similarity index 100% rename from site/content/3.10/operations/security/change-root-password.md rename to site/content/arangodb/3.10/operations/security/change-root-password.md diff --git a/site/content/3.10/operations/security/encryption-at-rest.md b/site/content/arangodb/3.10/operations/security/encryption-at-rest.md similarity index 97% rename from site/content/3.10/operations/security/encryption-at-rest.md rename to site/content/arangodb/3.10/operations/security/encryption-at-rest.md index 9821486e56..8a958d9be1 100644 --- a/site/content/3.10/operations/security/encryption-at-rest.md +++ b/site/content/arangodb/3.10/operations/security/encryption-at-rest.md @@ -30,9 +30,9 @@ performance and resistance to side-channel attacks. The encryption feature is supported by all ArangoDB deployment modes. {{< info >}} -The ArangoGraph Insights Platform has encryption at rest as well as in transit +The Arango Managed Platform (AMP) has encryption at rest as well as in transit set on by default and cannot be disabled. For more information, see the -[ArangoGraph documentation](../../arangograph/_index.md). +[ArangoGraph documentation](../../../../amp/_index.md). {{< /info >}} ## Limitations diff --git a/site/content/3.10/operations/security/securing-starter-deployments.md b/site/content/arangodb/3.10/operations/security/securing-starter-deployments.md similarity index 100% rename from site/content/3.10/operations/security/securing-starter-deployments.md rename to site/content/arangodb/3.10/operations/security/securing-starter-deployments.md diff --git a/site/content/3.10/operations/security/security-options.md b/site/content/arangodb/3.10/operations/security/security-options.md similarity index 100% rename from site/content/3.10/operations/security/security-options.md rename to site/content/arangodb/3.10/operations/security/security-options.md diff --git a/site/content/3.10/operations/troubleshooting/_index.md b/site/content/arangodb/3.10/operations/troubleshooting/_index.md similarity index 100% rename from site/content/3.10/operations/troubleshooting/_index.md rename to site/content/arangodb/3.10/operations/troubleshooting/_index.md diff --git a/site/content/3.10/operations/troubleshooting/arangod.md b/site/content/arangodb/3.10/operations/troubleshooting/arangod.md similarity index 100% rename from site/content/3.10/operations/troubleshooting/arangod.md rename to site/content/arangodb/3.10/operations/troubleshooting/arangod.md diff --git a/site/content/3.10/operations/troubleshooting/cluster/_index.md b/site/content/arangodb/3.10/operations/troubleshooting/cluster/_index.md similarity index 100% rename from site/content/3.10/operations/troubleshooting/cluster/_index.md rename to site/content/arangodb/3.10/operations/troubleshooting/cluster/_index.md diff --git a/site/content/3.10/operations/troubleshooting/cluster/agency-dump.md b/site/content/arangodb/3.10/operations/troubleshooting/cluster/agency-dump.md similarity index 100% rename from site/content/3.10/operations/troubleshooting/cluster/agency-dump.md rename to site/content/arangodb/3.10/operations/troubleshooting/cluster/agency-dump.md diff --git a/site/content/3.10/operations/troubleshooting/emergency-console.md b/site/content/arangodb/3.10/operations/troubleshooting/emergency-console.md similarity index 100% rename from site/content/3.10/operations/troubleshooting/emergency-console.md rename to site/content/arangodb/3.10/operations/troubleshooting/emergency-console.md diff --git a/site/content/3.10/operations/troubleshooting/query-debug-packages.md b/site/content/arangodb/3.10/operations/troubleshooting/query-debug-packages.md similarity index 100% rename from site/content/3.10/operations/troubleshooting/query-debug-packages.md rename to site/content/arangodb/3.10/operations/troubleshooting/query-debug-packages.md diff --git a/site/content/3.10/operations/upgrading/_index.md b/site/content/arangodb/3.10/operations/upgrading/_index.md similarity index 100% rename from site/content/3.10/operations/upgrading/_index.md rename to site/content/arangodb/3.10/operations/upgrading/_index.md diff --git a/site/content/3.10/operations/upgrading/community-to-enterprise-upgrade.md b/site/content/arangodb/3.10/operations/upgrading/community-to-enterprise-upgrade.md similarity index 100% rename from site/content/3.10/operations/upgrading/community-to-enterprise-upgrade.md rename to site/content/arangodb/3.10/operations/upgrading/community-to-enterprise-upgrade.md diff --git a/site/content/3.10/operations/upgrading/downgrading.md b/site/content/arangodb/3.10/operations/upgrading/downgrading.md similarity index 100% rename from site/content/3.10/operations/upgrading/downgrading.md rename to site/content/arangodb/3.10/operations/upgrading/downgrading.md diff --git a/site/content/3.10/operations/upgrading/manual-deployments/_index.md b/site/content/arangodb/3.10/operations/upgrading/manual-deployments/_index.md similarity index 100% rename from site/content/3.10/operations/upgrading/manual-deployments/_index.md rename to site/content/arangodb/3.10/operations/upgrading/manual-deployments/_index.md diff --git a/site/content/3.10/operations/upgrading/manual-deployments/active-failover.md b/site/content/arangodb/3.10/operations/upgrading/manual-deployments/active-failover.md similarity index 100% rename from site/content/3.10/operations/upgrading/manual-deployments/active-failover.md rename to site/content/arangodb/3.10/operations/upgrading/manual-deployments/active-failover.md diff --git a/site/content/3.10/operations/upgrading/manual-deployments/cluster.md b/site/content/arangodb/3.10/operations/upgrading/manual-deployments/cluster.md similarity index 100% rename from site/content/3.10/operations/upgrading/manual-deployments/cluster.md rename to site/content/arangodb/3.10/operations/upgrading/manual-deployments/cluster.md diff --git a/site/content/3.10/operations/upgrading/os-specific-information/_index.md b/site/content/arangodb/3.10/operations/upgrading/os-specific-information/_index.md similarity index 100% rename from site/content/3.10/operations/upgrading/os-specific-information/_index.md rename to site/content/arangodb/3.10/operations/upgrading/os-specific-information/_index.md diff --git a/site/content/3.10/operations/upgrading/os-specific-information/linux.md b/site/content/arangodb/3.10/operations/upgrading/os-specific-information/linux.md similarity index 100% rename from site/content/3.10/operations/upgrading/os-specific-information/linux.md rename to site/content/arangodb/3.10/operations/upgrading/os-specific-information/linux.md diff --git a/site/content/3.10/operations/upgrading/os-specific-information/macos.md b/site/content/arangodb/3.10/operations/upgrading/os-specific-information/macos.md similarity index 95% rename from site/content/3.10/operations/upgrading/os-specific-information/macos.md rename to site/content/arangodb/3.10/operations/upgrading/os-specific-information/macos.md index 3e010631cc..9e5ec267db 100644 --- a/site/content/3.10/operations/upgrading/os-specific-information/macos.md +++ b/site/content/arangodb/3.10/operations/upgrading/os-specific-information/macos.md @@ -23,7 +23,7 @@ Drag and drop the `ArangoDB3-CLI` (Community Edition) or the `ArangoDB3e-CLI` (Enterprise Edition) file onto the shown `Applications` folder. You are asked if you want to replace the old file with the newer one. -![MacOSUpgrade](../../../../images/MacOSUpgrade.png) +![MacOSUpgrade](../../../../../images/MacOSUpgrade.png) Select `Replace` to install the new ArangoDB version. diff --git a/site/content/3.10/operations/upgrading/os-specific-information/windows.md b/site/content/arangodb/3.10/operations/upgrading/os-specific-information/windows.md similarity index 96% rename from site/content/3.10/operations/upgrading/os-specific-information/windows.md rename to site/content/arangodb/3.10/operations/upgrading/os-specific-information/windows.md index b43686c6e1..dcb9b5d831 100644 --- a/site/content/3.10/operations/upgrading/os-specific-information/windows.md +++ b/site/content/arangodb/3.10/operations/upgrading/os-specific-information/windows.md @@ -34,7 +34,7 @@ If you have installed via the _Installer_, to upgrade: the option "_Automatically update existing ArangoDB database_" so that the database files will be upgraded. -![Update Option](../../../../images/installer_upgrade.png) +![Update Option](../../../../../images/installer_upgrade.png) {{< info >}} Upgrading via the Installer, when the old data is kept, will keep your @@ -45,14 +45,14 @@ password and choice of storage engine as it is. - You can uninstall the old one manually (make a copy of your old configuration file first). -![Uninstall old version](../../../../images/both_installations.png) +![Uninstall old version](../../../../../images/both_installations.png) {{< danger >}} When uninstalling the old package, please make sure the option "_Delete databases with uninstallation_" is **not** checked. {{< /danger >}} -![Delete Option](../../../../images/installer_delete.png) +![Delete Option](../../../../../images/installer_delete.png) {{< danger >}} When upgrading, the Windows Installer does not use the old configuration file diff --git a/site/content/3.10/operations/upgrading/starter-deployments.md b/site/content/arangodb/3.10/operations/upgrading/starter-deployments.md similarity index 100% rename from site/content/3.10/operations/upgrading/starter-deployments.md rename to site/content/arangodb/3.10/operations/upgrading/starter-deployments.md diff --git a/site/content/3.10/release-notes/_index.md b/site/content/arangodb/3.10/release-notes/_index.md similarity index 100% rename from site/content/3.10/release-notes/_index.md rename to site/content/arangodb/3.10/release-notes/_index.md diff --git a/site/content/3.10/release-notes/deprecated-and-removed-features.md b/site/content/arangodb/3.10/release-notes/deprecated-and-removed-features.md similarity index 100% rename from site/content/3.10/release-notes/deprecated-and-removed-features.md rename to site/content/arangodb/3.10/release-notes/deprecated-and-removed-features.md diff --git a/site/content/3.10/release-notes/version-3.0/_index.md b/site/content/arangodb/3.10/release-notes/version-3.0/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.0/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.0/_index.md diff --git a/site/content/3.10/release-notes/version-3.0/incompatible-changes-in-3-0.md b/site/content/arangodb/3.10/release-notes/version-3.0/incompatible-changes-in-3-0.md similarity index 100% rename from site/content/3.10/release-notes/version-3.0/incompatible-changes-in-3-0.md rename to site/content/arangodb/3.10/release-notes/version-3.0/incompatible-changes-in-3-0.md diff --git a/site/content/3.10/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.10/release-notes/version-3.0/whats-new-in-3-0.md similarity index 100% rename from site/content/3.10/release-notes/version-3.0/whats-new-in-3-0.md rename to site/content/arangodb/3.10/release-notes/version-3.0/whats-new-in-3-0.md diff --git a/site/content/3.10/release-notes/version-3.1/_index.md b/site/content/arangodb/3.10/release-notes/version-3.1/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.1/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.1/_index.md diff --git a/site/content/3.10/release-notes/version-3.1/incompatible-changes-in-3-1.md b/site/content/arangodb/3.10/release-notes/version-3.1/incompatible-changes-in-3-1.md similarity index 100% rename from site/content/3.10/release-notes/version-3.1/incompatible-changes-in-3-1.md rename to site/content/arangodb/3.10/release-notes/version-3.1/incompatible-changes-in-3-1.md diff --git a/site/content/3.10/release-notes/version-3.1/whats-new-in-3-1.md b/site/content/arangodb/3.10/release-notes/version-3.1/whats-new-in-3-1.md similarity index 100% rename from site/content/3.10/release-notes/version-3.1/whats-new-in-3-1.md rename to site/content/arangodb/3.10/release-notes/version-3.1/whats-new-in-3-1.md diff --git a/site/content/3.10/release-notes/version-3.10/_index.md b/site/content/arangodb/3.10/release-notes/version-3.10/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.10/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.10/_index.md diff --git a/site/content/3.10/release-notes/version-3.10/api-changes-in-3-10.md b/site/content/arangodb/3.10/release-notes/version-3.10/api-changes-in-3-10.md similarity index 100% rename from site/content/3.10/release-notes/version-3.10/api-changes-in-3-10.md rename to site/content/arangodb/3.10/release-notes/version-3.10/api-changes-in-3-10.md diff --git a/site/content/3.10/release-notes/version-3.10/incompatible-changes-in-3-10.md b/site/content/arangodb/3.10/release-notes/version-3.10/incompatible-changes-in-3-10.md similarity index 100% rename from site/content/3.10/release-notes/version-3.10/incompatible-changes-in-3-10.md rename to site/content/arangodb/3.10/release-notes/version-3.10/incompatible-changes-in-3-10.md diff --git a/site/content/3.10/release-notes/version-3.10/known-issues-in-3-10.md b/site/content/arangodb/3.10/release-notes/version-3.10/known-issues-in-3-10.md similarity index 100% rename from site/content/3.10/release-notes/version-3.10/known-issues-in-3-10.md rename to site/content/arangodb/3.10/release-notes/version-3.10/known-issues-in-3-10.md diff --git a/site/content/3.10/release-notes/version-3.10/whats-new-in-3-10.md b/site/content/arangodb/3.10/release-notes/version-3.10/whats-new-in-3-10.md similarity index 100% rename from site/content/3.10/release-notes/version-3.10/whats-new-in-3-10.md rename to site/content/arangodb/3.10/release-notes/version-3.10/whats-new-in-3-10.md diff --git a/site/content/3.10/release-notes/version-3.2/_index.md b/site/content/arangodb/3.10/release-notes/version-3.2/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.2/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.2/_index.md diff --git a/site/content/3.10/release-notes/version-3.2/incompatible-changes-in-3-2.md b/site/content/arangodb/3.10/release-notes/version-3.2/incompatible-changes-in-3-2.md similarity index 100% rename from site/content/3.10/release-notes/version-3.2/incompatible-changes-in-3-2.md rename to site/content/arangodb/3.10/release-notes/version-3.2/incompatible-changes-in-3-2.md diff --git a/site/content/3.10/release-notes/version-3.2/known-issues-in-3-2.md b/site/content/arangodb/3.10/release-notes/version-3.2/known-issues-in-3-2.md similarity index 100% rename from site/content/3.10/release-notes/version-3.2/known-issues-in-3-2.md rename to site/content/arangodb/3.10/release-notes/version-3.2/known-issues-in-3-2.md diff --git a/site/content/3.10/release-notes/version-3.2/whats-new-in-3-2.md b/site/content/arangodb/3.10/release-notes/version-3.2/whats-new-in-3-2.md similarity index 100% rename from site/content/3.10/release-notes/version-3.2/whats-new-in-3-2.md rename to site/content/arangodb/3.10/release-notes/version-3.2/whats-new-in-3-2.md diff --git a/site/content/3.10/release-notes/version-3.3/_index.md b/site/content/arangodb/3.10/release-notes/version-3.3/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.3/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.3/_index.md diff --git a/site/content/3.10/release-notes/version-3.3/incompatible-changes-in-3-3.md b/site/content/arangodb/3.10/release-notes/version-3.3/incompatible-changes-in-3-3.md similarity index 100% rename from site/content/3.10/release-notes/version-3.3/incompatible-changes-in-3-3.md rename to site/content/arangodb/3.10/release-notes/version-3.3/incompatible-changes-in-3-3.md diff --git a/site/content/3.10/release-notes/version-3.3/known-issues-in-3-3.md b/site/content/arangodb/3.10/release-notes/version-3.3/known-issues-in-3-3.md similarity index 100% rename from site/content/3.10/release-notes/version-3.3/known-issues-in-3-3.md rename to site/content/arangodb/3.10/release-notes/version-3.3/known-issues-in-3-3.md diff --git a/site/content/3.10/release-notes/version-3.3/whats-new-in-3-3.md b/site/content/arangodb/3.10/release-notes/version-3.3/whats-new-in-3-3.md similarity index 100% rename from site/content/3.10/release-notes/version-3.3/whats-new-in-3-3.md rename to site/content/arangodb/3.10/release-notes/version-3.3/whats-new-in-3-3.md diff --git a/site/content/3.10/release-notes/version-3.4/_index.md b/site/content/arangodb/3.10/release-notes/version-3.4/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.4/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.4/_index.md diff --git a/site/content/3.10/release-notes/version-3.4/incompatible-changes-in-3-4.md b/site/content/arangodb/3.10/release-notes/version-3.4/incompatible-changes-in-3-4.md similarity index 100% rename from site/content/3.10/release-notes/version-3.4/incompatible-changes-in-3-4.md rename to site/content/arangodb/3.10/release-notes/version-3.4/incompatible-changes-in-3-4.md diff --git a/site/content/3.10/release-notes/version-3.4/known-issues-in-3-4.md b/site/content/arangodb/3.10/release-notes/version-3.4/known-issues-in-3-4.md similarity index 100% rename from site/content/3.10/release-notes/version-3.4/known-issues-in-3-4.md rename to site/content/arangodb/3.10/release-notes/version-3.4/known-issues-in-3-4.md diff --git a/site/content/3.10/release-notes/version-3.4/whats-new-in-3-4.md b/site/content/arangodb/3.10/release-notes/version-3.4/whats-new-in-3-4.md similarity index 100% rename from site/content/3.10/release-notes/version-3.4/whats-new-in-3-4.md rename to site/content/arangodb/3.10/release-notes/version-3.4/whats-new-in-3-4.md diff --git a/site/content/3.10/release-notes/version-3.5/_index.md b/site/content/arangodb/3.10/release-notes/version-3.5/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.5/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.5/_index.md diff --git a/site/content/3.10/release-notes/version-3.5/incompatible-changes-in-3-5.md b/site/content/arangodb/3.10/release-notes/version-3.5/incompatible-changes-in-3-5.md similarity index 100% rename from site/content/3.10/release-notes/version-3.5/incompatible-changes-in-3-5.md rename to site/content/arangodb/3.10/release-notes/version-3.5/incompatible-changes-in-3-5.md diff --git a/site/content/3.10/release-notes/version-3.5/known-issues-in-3-5.md b/site/content/arangodb/3.10/release-notes/version-3.5/known-issues-in-3-5.md similarity index 100% rename from site/content/3.10/release-notes/version-3.5/known-issues-in-3-5.md rename to site/content/arangodb/3.10/release-notes/version-3.5/known-issues-in-3-5.md diff --git a/site/content/3.10/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.10/release-notes/version-3.5/whats-new-in-3-5.md similarity index 100% rename from site/content/3.10/release-notes/version-3.5/whats-new-in-3-5.md rename to site/content/arangodb/3.10/release-notes/version-3.5/whats-new-in-3-5.md diff --git a/site/content/3.10/release-notes/version-3.6/_index.md b/site/content/arangodb/3.10/release-notes/version-3.6/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.6/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.6/_index.md diff --git a/site/content/3.10/release-notes/version-3.6/incompatible-changes-in-3-6.md b/site/content/arangodb/3.10/release-notes/version-3.6/incompatible-changes-in-3-6.md similarity index 100% rename from site/content/3.10/release-notes/version-3.6/incompatible-changes-in-3-6.md rename to site/content/arangodb/3.10/release-notes/version-3.6/incompatible-changes-in-3-6.md diff --git a/site/content/3.10/release-notes/version-3.6/known-issues-in-3-6.md b/site/content/arangodb/3.10/release-notes/version-3.6/known-issues-in-3-6.md similarity index 100% rename from site/content/3.10/release-notes/version-3.6/known-issues-in-3-6.md rename to site/content/arangodb/3.10/release-notes/version-3.6/known-issues-in-3-6.md diff --git a/site/content/3.10/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.10/release-notes/version-3.6/whats-new-in-3-6.md similarity index 100% rename from site/content/3.10/release-notes/version-3.6/whats-new-in-3-6.md rename to site/content/arangodb/3.10/release-notes/version-3.6/whats-new-in-3-6.md diff --git a/site/content/3.10/release-notes/version-3.7/_index.md b/site/content/arangodb/3.10/release-notes/version-3.7/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.7/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.7/_index.md diff --git a/site/content/3.10/release-notes/version-3.7/api-changes-in-3-7.md b/site/content/arangodb/3.10/release-notes/version-3.7/api-changes-in-3-7.md similarity index 100% rename from site/content/3.10/release-notes/version-3.7/api-changes-in-3-7.md rename to site/content/arangodb/3.10/release-notes/version-3.7/api-changes-in-3-7.md diff --git a/site/content/3.10/release-notes/version-3.7/incompatible-changes-in-3-7.md b/site/content/arangodb/3.10/release-notes/version-3.7/incompatible-changes-in-3-7.md similarity index 100% rename from site/content/3.10/release-notes/version-3.7/incompatible-changes-in-3-7.md rename to site/content/arangodb/3.10/release-notes/version-3.7/incompatible-changes-in-3-7.md diff --git a/site/content/3.10/release-notes/version-3.7/known-issues-in-3-7.md b/site/content/arangodb/3.10/release-notes/version-3.7/known-issues-in-3-7.md similarity index 100% rename from site/content/3.10/release-notes/version-3.7/known-issues-in-3-7.md rename to site/content/arangodb/3.10/release-notes/version-3.7/known-issues-in-3-7.md diff --git a/site/content/3.10/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.10/release-notes/version-3.7/whats-new-in-3-7.md similarity index 100% rename from site/content/3.10/release-notes/version-3.7/whats-new-in-3-7.md rename to site/content/arangodb/3.10/release-notes/version-3.7/whats-new-in-3-7.md diff --git a/site/content/3.10/release-notes/version-3.8/_index.md b/site/content/arangodb/3.10/release-notes/version-3.8/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.8/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.8/_index.md diff --git a/site/content/3.10/release-notes/version-3.8/api-changes-in-3-8.md b/site/content/arangodb/3.10/release-notes/version-3.8/api-changes-in-3-8.md similarity index 100% rename from site/content/3.10/release-notes/version-3.8/api-changes-in-3-8.md rename to site/content/arangodb/3.10/release-notes/version-3.8/api-changes-in-3-8.md diff --git a/site/content/3.10/release-notes/version-3.8/incompatible-changes-in-3-8.md b/site/content/arangodb/3.10/release-notes/version-3.8/incompatible-changes-in-3-8.md similarity index 100% rename from site/content/3.10/release-notes/version-3.8/incompatible-changes-in-3-8.md rename to site/content/arangodb/3.10/release-notes/version-3.8/incompatible-changes-in-3-8.md diff --git a/site/content/3.10/release-notes/version-3.8/known-issues-in-3-8.md b/site/content/arangodb/3.10/release-notes/version-3.8/known-issues-in-3-8.md similarity index 100% rename from site/content/3.10/release-notes/version-3.8/known-issues-in-3-8.md rename to site/content/arangodb/3.10/release-notes/version-3.8/known-issues-in-3-8.md diff --git a/site/content/3.10/release-notes/version-3.8/whats-new-in-3-8.md b/site/content/arangodb/3.10/release-notes/version-3.8/whats-new-in-3-8.md similarity index 100% rename from site/content/3.10/release-notes/version-3.8/whats-new-in-3-8.md rename to site/content/arangodb/3.10/release-notes/version-3.8/whats-new-in-3-8.md diff --git a/site/content/3.10/release-notes/version-3.9/_index.md b/site/content/arangodb/3.10/release-notes/version-3.9/_index.md similarity index 100% rename from site/content/3.10/release-notes/version-3.9/_index.md rename to site/content/arangodb/3.10/release-notes/version-3.9/_index.md diff --git a/site/content/3.10/release-notes/version-3.9/api-changes-in-3-9.md b/site/content/arangodb/3.10/release-notes/version-3.9/api-changes-in-3-9.md similarity index 100% rename from site/content/3.10/release-notes/version-3.9/api-changes-in-3-9.md rename to site/content/arangodb/3.10/release-notes/version-3.9/api-changes-in-3-9.md diff --git a/site/content/3.10/release-notes/version-3.9/incompatible-changes-in-3-9.md b/site/content/arangodb/3.10/release-notes/version-3.9/incompatible-changes-in-3-9.md similarity index 100% rename from site/content/3.10/release-notes/version-3.9/incompatible-changes-in-3-9.md rename to site/content/arangodb/3.10/release-notes/version-3.9/incompatible-changes-in-3-9.md diff --git a/site/content/3.10/release-notes/version-3.9/known-issues-in-3-9.md b/site/content/arangodb/3.10/release-notes/version-3.9/known-issues-in-3-9.md similarity index 100% rename from site/content/3.10/release-notes/version-3.9/known-issues-in-3-9.md rename to site/content/arangodb/3.10/release-notes/version-3.9/known-issues-in-3-9.md diff --git a/site/content/3.10/release-notes/version-3.9/whats-new-in-3-9.md b/site/content/arangodb/3.10/release-notes/version-3.9/whats-new-in-3-9.md similarity index 100% rename from site/content/3.10/release-notes/version-3.9/whats-new-in-3-9.md rename to site/content/arangodb/3.10/release-notes/version-3.9/whats-new-in-3-9.md diff --git a/site/content/3.11/_index.md b/site/content/arangodb/3.11/_index.md similarity index 88% rename from site/content/3.11/_index.md rename to site/content/arangodb/3.11/_index.md index a50a8ab193..26db7a1f0d 100644 --- a/site/content/3.11/_index.md +++ b/site/content/arangodb/3.11/_index.md @@ -1,14 +1,14 @@ --- title: Recommended Resources menuTitle: '3.11' -weight: 0 +weight: 1 layout: default --- {{< cloudbanner >}} {{< cards >}} -{{% card title="What is ArangoDB?" link="about-arangodb/" %}} +{{% card title="What is ArangoDB?" link="about/" %}} Get to know graphs, ArangoDB's use cases and features. {{% /card %}} @@ -17,7 +17,7 @@ Learn about ArangoDB's core concepts, how to interact with the database system, and get a server instance up and running. {{% /card %}} -{{% card title="ArangoGraph Insights Platform" link="arangograph/" %}} +{{% card title="Arango Managed Platform (AMP)" link="amp/" %}} Try out ArangoDB's fully-managed cloud offering for a faster time to value. {{% /card %}} diff --git a/site/content/3.10/about-arangodb/_index.md b/site/content/arangodb/3.11/about/_index.md similarity index 82% rename from site/content/3.10/about-arangodb/_index.md rename to site/content/arangodb/3.11/about/_index.md index 9b96a70c37..62ade93bbb 100644 --- a/site/content/3.10/about-arangodb/_index.md +++ b/site/content/arangodb/3.11/about/_index.md @@ -9,7 +9,7 @@ aliases: - introduction - introduction/about-arangodb --- -![ArangoDB Overview Diagram](../../images/arangodb-overview-diagram.png) +![ArangoDB Overview Diagram](../../../images/arangodb-overview-diagram.png) ArangoDB combines the analytical power of native graphs with an integrated search engine, JSON support, and a variety of data access patterns via a single, @@ -17,25 +17,25 @@ composable query language. ArangoDB is available in an open-source and a commercial [edition](features/_index.md). You can use it for on-premises deployments, as well as a fully managed -cloud service, the [ArangoGraph Insights Platform](../arangograph/_index.md). +cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). ## What are Graphs? Graphs are information networks comprised of nodes and relations. -![Node - Relation - Node](../../images/data-model-graph-relation-abstract.png) +![Node - Relation - Node](../../../images/data-model-graph-relation-abstract.png) A social network is a common example of a graph. People are represented by nodes and their friendships by relations. -![Mary - is friend of - John](../../images/data-model-graph-relation-concrete.png) +![Mary - is friend of - John](../../../images/data-model-graph-relation-concrete.png) Nodes are also called vertices (singular: vertex), and relations are edges that connect vertices. A vertex typically represents a specific entity (a person, a book, a sensor reading, etc.) and an edge defines how one entity relates to another. -![Mary - bought - Book, is friend of - John](../../images/data-model-graph-relations.png) +![Mary - bought - Book, is friend of - John](../../../images/data-model-graph-relations.png) This paradigm of storing data feels natural because it closely matches the cognitive model of humans. It is an expressive data model that allows you to @@ -48,7 +48,7 @@ Not everything is a graph use case. ArangoDB lets you equally work with structured, semi-structured, and unstructured data in the form of schema-free JSON objects, without having to connect these objects to form a graph. -![Person Mary, Book ArangoDB](../../images/data-model-document.png) +![Person Mary, Book ArangoDB](../../../images/data-model-document.png) <!-- TODO: Seems too disconnected, what is the relation? diff --git a/site/content/3.11/about-arangodb/features/_index.md b/site/content/arangodb/3.11/about/features/_index.md similarity index 98% rename from site/content/3.11/about-arangodb/features/_index.md rename to site/content/arangodb/3.11/about/features/_index.md index 0d303e5ba6..caebf5177a 100644 --- a/site/content/3.11/about-arangodb/features/_index.md +++ b/site/content/arangodb/3.11/about/features/_index.md @@ -13,7 +13,7 @@ aliases: ### Fully managed cloud service The fully managed multi-cloud -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is the easiest and fastest way to get started. It runs the Enterprise Edition of ArangoDB, lets you deploy clusters with just a few clicks, and is operated by a dedicated team of ArangoDB engineers day and night. You can choose from a @@ -26,7 +26,7 @@ variety of support plans to meet your needs. - Highly secure with encryption at transit and at rest - Includes elastic scalability for all deployment models (OneShard and Sharded clusters) -To learn more, go to the [ArangoGraph documentation](../../arangograph/_index.md). +To learn more, go to the [ArangoGraph documentation](../../../../amp/_index.md). ### Self-managed in the cloud diff --git a/site/content/3.11/about-arangodb/features/community-edition.md b/site/content/arangodb/3.11/about/features/community-edition.md similarity index 100% rename from site/content/3.11/about-arangodb/features/community-edition.md rename to site/content/arangodb/3.11/about/features/community-edition.md diff --git a/site/content/3.10/about-arangodb/features/enterprise-edition.md b/site/content/arangodb/3.11/about/features/enterprise-edition.md similarity index 100% rename from site/content/3.10/about-arangodb/features/enterprise-edition.md rename to site/content/arangodb/3.11/about/features/enterprise-edition.md diff --git a/site/content/3.11/about-arangodb/features/highlights-by-version.md b/site/content/arangodb/3.11/about/features/highlights-by-version.md similarity index 100% rename from site/content/3.11/about-arangodb/features/highlights-by-version.md rename to site/content/arangodb/3.11/about/features/highlights-by-version.md diff --git a/site/content/3.10/about-arangodb/use-cases.md b/site/content/arangodb/3.11/about/use-cases.md similarity index 77% rename from site/content/3.10/about-arangodb/use-cases.md rename to site/content/arangodb/3.11/about/use-cases.md index fab9e86a90..01f0bcbac2 100644 --- a/site/content/3.10/about-arangodb/use-cases.md +++ b/site/content/arangodb/3.11/about/use-cases.md @@ -19,7 +19,7 @@ more. ### Fraud Detection -{{< image src="../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Uncover illegal activities by discovering difficult-to-detect patterns. ArangoDB lets you look beyond individual data points in disparate data sources, @@ -29,7 +29,7 @@ complex fraudulent behavior such as fraud rings. ### Recommendation Engine -{{< image src="../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Suggest products, services, and information to users based on data relationships. For example, you can use ArangoDB together with PyTorch Geometric to build a @@ -39,7 +39,7 @@ with a graph neural network (GNN). ### Network Management -{{< image src="../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Reduce downtime by connecting and visualizing network, infrastructure, and code. Network devices and how they interconnect can naturally be modeled as a graph. @@ -49,7 +49,7 @@ bandwidth into account when path-finding. ### Customer 360 -{{< image src="../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Gain a complete understanding of your customers by integrating multiple data sources and code. ArangoDB can act as the platform to merge and consolidate @@ -58,7 +58,7 @@ track data origins using graph features. ### Identity and Access Management -{{< image src="../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Increase security and compliance by managing data access based on role and position. You can map out an organization chart as a graph and use ArangoDB to @@ -68,7 +68,7 @@ inheritance. ### Supply Chain -{{< image src="../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Speed shipments by monitoring and optimizing the flow of goods through a supply chain. You can represent your inventory, supplier, and delivery @@ -84,7 +84,7 @@ and scalable data store. ### Content Management -{{< image src="../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Store information of any kind without upfront schema declaration. ArangoDB is schema-free, storing every data record as a self-contained document, allowing @@ -93,7 +93,7 @@ content management system on top of ArangoDB. ### E-Commerce Systems -{{< image src="../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB combines data modeling freedom with strong consistency and resilience features to power online shops and ordering systems. Handle product catalog data @@ -102,7 +102,7 @@ checkouts with the necessary transactional guarantees. ### Internet of Things -{{< image src="../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Collect sensor readings and other IoT data in ArangoDB for a single view of everything. Store all data points in the same system that also lets you run @@ -110,7 +110,7 @@ aggregation queries using sliding windows for efficient data analysis. ## ArangoDB as a Key-Value Database -{{< image src="../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Key-value stores are the simplest kind of database systems. Each record is stored as a block of data under a key that uniquely identifies the record. @@ -134,7 +134,7 @@ For more information about how ArangoDB persists data, see ## ArangoDB as a Search Engine -{{< image src="../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB has a natively integrated search engine for a broad range of information retrieval needs. It is powered by inverted indexes and can index @@ -161,4 +161,4 @@ ArangoDB integrates well into existing data infrastructures and provides connectors for popular machine learning frameworks and data processing ecosystems. -![Machine Learning Architecture of ArangoDB](../../images/machine-learning-architecture.png) +![Machine Learning Architecture of ArangoDB](../../../../images/machine-learning-architecture.png) diff --git a/site/content/3.11/aql/_index.md b/site/content/arangodb/3.11/aql/_index.md similarity index 100% rename from site/content/3.11/aql/_index.md rename to site/content/arangodb/3.11/aql/_index.md diff --git a/site/content/3.11/aql/common-errors.md b/site/content/arangodb/3.11/aql/common-errors.md similarity index 100% rename from site/content/3.11/aql/common-errors.md rename to site/content/arangodb/3.11/aql/common-errors.md diff --git a/site/content/3.11/aql/data-queries.md b/site/content/arangodb/3.11/aql/data-queries.md similarity index 100% rename from site/content/3.11/aql/data-queries.md rename to site/content/arangodb/3.11/aql/data-queries.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/_index.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/_index.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/_index.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/_index.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/counting.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/counting.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/counting.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/counting.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/create-test-data.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/create-test-data.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/create-test-data.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/create-test-data.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/diffing-two-documents.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/diffing-two-documents.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/diffing-two-documents.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/diffing-two-documents.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/dynamic-attribute-names.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/dynamic-attribute-names.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/dynamic-attribute-names.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/dynamic-attribute-names.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/grouping.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/grouping.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/grouping.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/grouping.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/joins.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/joins.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/joins.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/joins.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/projections-and-filters.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/projections-and-filters.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/projections-and-filters.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/projections-and-filters.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/queries-without-collections.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/queries-without-collections.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/queries-without-collections.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/queries-without-collections.md diff --git a/site/content/3.11/aql/examples-and-query-patterns/remove-vertex.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/remove-vertex.md similarity index 96% rename from site/content/3.11/aql/examples-and-query-patterns/remove-vertex.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/remove-vertex.md index 60a845ad94..e80cf8f390 100644 --- a/site/content/3.11/aql/examples-and-query-patterns/remove-vertex.md +++ b/site/content/arangodb/3.11/aql/examples-and-query-patterns/remove-vertex.md @@ -15,7 +15,7 @@ However, as shown in this example based on the [Knows Graph](../../graphs/example-graphs.md#knows-graph), a query for this use case can be created. -![Example Graph](../../../images/knows_graph.png) +![Example Graph](../../../../images/knows_graph.png) When deleting vertex **eve** from the graph, we also want the edges `eve -> alice` and `eve -> bob` to be removed. @@ -59,7 +59,7 @@ For example, the [City Graph](../../graphs/example-graphs.md#city-graph) contains several vertex collections - `germanCity` and `frenchCity` and several edge collections - `french / german / international Highway`. -![Example Graph2](../../../images/cities_graph.png) +![Example Graph2](../../../../images/cities_graph.png) To delete city **Berlin** all edge collections `french / german / international Highway` have to be considered. The **REMOVE** operation has to be applied on all edge diff --git a/site/content/3.11/aql/examples-and-query-patterns/traversals.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/traversals.md similarity index 98% rename from site/content/3.11/aql/examples-and-query-patterns/traversals.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/traversals.md index b2521d48c2..08296c64e4 100644 --- a/site/content/3.11/aql/examples-and-query-patterns/traversals.md +++ b/site/content/arangodb/3.11/aql/examples-and-query-patterns/traversals.md @@ -10,7 +10,7 @@ description: >- Our first example will locate the start vertex for a graph traversal via [a geo index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). We use the [City Graph](../../graphs/example-graphs.md#city-graph) and its geo indexes: -![Cities Example Graph](../../../images/cities_graph.png) +![Cities Example Graph](../../../../images/cities_graph.png) ```js --- diff --git a/site/content/3.11/aql/examples-and-query-patterns/upsert-repsert-guide.md b/site/content/arangodb/3.11/aql/examples-and-query-patterns/upsert-repsert-guide.md similarity index 100% rename from site/content/3.11/aql/examples-and-query-patterns/upsert-repsert-guide.md rename to site/content/arangodb/3.11/aql/examples-and-query-patterns/upsert-repsert-guide.md diff --git a/site/content/3.11/aql/execution-and-performance/_index.md b/site/content/arangodb/3.11/aql/execution-and-performance/_index.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/_index.md rename to site/content/arangodb/3.11/aql/execution-and-performance/_index.md diff --git a/site/content/3.11/aql/execution-and-performance/caching-query-results.md b/site/content/arangodb/3.11/aql/execution-and-performance/caching-query-results.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/caching-query-results.md rename to site/content/arangodb/3.11/aql/execution-and-performance/caching-query-results.md diff --git a/site/content/3.11/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.11/aql/execution-and-performance/explaining-queries.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/explaining-queries.md rename to site/content/arangodb/3.11/aql/execution-and-performance/explaining-queries.md diff --git a/site/content/3.11/aql/execution-and-performance/parsing-queries.md b/site/content/arangodb/3.11/aql/execution-and-performance/parsing-queries.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/parsing-queries.md rename to site/content/arangodb/3.11/aql/execution-and-performance/parsing-queries.md diff --git a/site/content/3.11/aql/execution-and-performance/query-optimization.md b/site/content/arangodb/3.11/aql/execution-and-performance/query-optimization.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/query-optimization.md rename to site/content/arangodb/3.11/aql/execution-and-performance/query-optimization.md diff --git a/site/content/3.11/aql/execution-and-performance/query-profiling.md b/site/content/arangodb/3.11/aql/execution-and-performance/query-profiling.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/query-profiling.md rename to site/content/arangodb/3.11/aql/execution-and-performance/query-profiling.md diff --git a/site/content/3.11/aql/execution-and-performance/query-statistics.md b/site/content/arangodb/3.11/aql/execution-and-performance/query-statistics.md similarity index 100% rename from site/content/3.11/aql/execution-and-performance/query-statistics.md rename to site/content/arangodb/3.11/aql/execution-and-performance/query-statistics.md diff --git a/site/content/3.11/aql/functions/_index.md b/site/content/arangodb/3.11/aql/functions/_index.md similarity index 100% rename from site/content/3.11/aql/functions/_index.md rename to site/content/arangodb/3.11/aql/functions/_index.md diff --git a/site/content/3.11/aql/functions/arangosearch.md b/site/content/arangodb/3.11/aql/functions/arangosearch.md similarity index 100% rename from site/content/3.11/aql/functions/arangosearch.md rename to site/content/arangodb/3.11/aql/functions/arangosearch.md diff --git a/site/content/3.11/aql/functions/array.md b/site/content/arangodb/3.11/aql/functions/array.md similarity index 100% rename from site/content/3.11/aql/functions/array.md rename to site/content/arangodb/3.11/aql/functions/array.md diff --git a/site/content/3.11/aql/functions/bit.md b/site/content/arangodb/3.11/aql/functions/bit.md similarity index 100% rename from site/content/3.11/aql/functions/bit.md rename to site/content/arangodb/3.11/aql/functions/bit.md diff --git a/site/content/3.11/aql/functions/date.md b/site/content/arangodb/3.11/aql/functions/date.md similarity index 100% rename from site/content/3.11/aql/functions/date.md rename to site/content/arangodb/3.11/aql/functions/date.md diff --git a/site/content/3.11/aql/functions/document-object.md b/site/content/arangodb/3.11/aql/functions/document-object.md similarity index 100% rename from site/content/3.11/aql/functions/document-object.md rename to site/content/arangodb/3.11/aql/functions/document-object.md diff --git a/site/content/3.11/aql/functions/fulltext.md b/site/content/arangodb/3.11/aql/functions/fulltext.md similarity index 100% rename from site/content/3.11/aql/functions/fulltext.md rename to site/content/arangodb/3.11/aql/functions/fulltext.md diff --git a/site/content/3.12/aql/functions/geo.md b/site/content/arangodb/3.11/aql/functions/geo.md similarity index 99% rename from site/content/3.12/aql/functions/geo.md rename to site/content/arangodb/3.11/aql/functions/geo.md index bc4558ee74..cf5b3f8a2d 100644 --- a/site/content/3.12/aql/functions/geo.md +++ b/site/content/arangodb/3.11/aql/functions/geo.md @@ -322,7 +322,7 @@ Consider the following polygon (remember that GeoJSON has ]] } ``` -![GeoJSON Polygon Geodesic](../../../images/geojson-polygon-geodesic.webp) +![GeoJSON Polygon Geodesic](../../../../images/geojson-polygon-geodesic.webp) It does not contain the point `[10, 47]` since the shortest path (geodesic) from `[4, 47]` to `[16, 47]` lies North relative to the parallel of latitude at @@ -359,7 +359,7 @@ Pole. ]] } ``` -![GeoJSON Polygon Counter-clockwise](../../../images/geojson-polygon-ccw.webp) +![GeoJSON Polygon Counter-clockwise](../../../../images/geojson-polygon-ccw.webp) On the other hand, the following polygon travels **clockwise** around the point `[10, 50]`, and thus its "interior" does not contain `[10, 50]`, but does @@ -371,7 +371,7 @@ contain the North Pole and the South Pole: ]] } ``` -![GeoJSON Polygon Clockwise](../../../images/geojson-polygon-cw.webp) +![GeoJSON Polygon Clockwise](../../../../images/geojson-polygon-cw.webp) Remember that the "interior" is to the left of the given linear ring, so this second polygon is basically the complement on Earth diff --git a/site/content/3.11/aql/functions/miscellaneous.md b/site/content/arangodb/3.11/aql/functions/miscellaneous.md similarity index 100% rename from site/content/3.11/aql/functions/miscellaneous.md rename to site/content/arangodb/3.11/aql/functions/miscellaneous.md diff --git a/site/content/3.11/aql/functions/numeric.md b/site/content/arangodb/3.11/aql/functions/numeric.md similarity index 100% rename from site/content/3.11/aql/functions/numeric.md rename to site/content/arangodb/3.11/aql/functions/numeric.md diff --git a/site/content/3.11/aql/functions/string.md b/site/content/arangodb/3.11/aql/functions/string.md similarity index 100% rename from site/content/3.11/aql/functions/string.md rename to site/content/arangodb/3.11/aql/functions/string.md diff --git a/site/content/3.11/aql/functions/type-check-and-cast.md b/site/content/arangodb/3.11/aql/functions/type-check-and-cast.md similarity index 100% rename from site/content/3.11/aql/functions/type-check-and-cast.md rename to site/content/arangodb/3.11/aql/functions/type-check-and-cast.md diff --git a/site/content/3.11/aql/fundamentals/_index.md b/site/content/arangodb/3.11/aql/fundamentals/_index.md similarity index 100% rename from site/content/3.11/aql/fundamentals/_index.md rename to site/content/arangodb/3.11/aql/fundamentals/_index.md diff --git a/site/content/3.11/aql/fundamentals/accessing-data-from-collections.md b/site/content/arangodb/3.11/aql/fundamentals/accessing-data-from-collections.md similarity index 100% rename from site/content/3.11/aql/fundamentals/accessing-data-from-collections.md rename to site/content/arangodb/3.11/aql/fundamentals/accessing-data-from-collections.md diff --git a/site/content/3.11/aql/fundamentals/bind-parameters.md b/site/content/arangodb/3.11/aql/fundamentals/bind-parameters.md similarity index 100% rename from site/content/3.11/aql/fundamentals/bind-parameters.md rename to site/content/arangodb/3.11/aql/fundamentals/bind-parameters.md diff --git a/site/content/3.11/aql/fundamentals/data-types.md b/site/content/arangodb/3.11/aql/fundamentals/data-types.md similarity index 100% rename from site/content/3.11/aql/fundamentals/data-types.md rename to site/content/arangodb/3.11/aql/fundamentals/data-types.md diff --git a/site/content/3.11/aql/fundamentals/limitations.md b/site/content/arangodb/3.11/aql/fundamentals/limitations.md similarity index 100% rename from site/content/3.11/aql/fundamentals/limitations.md rename to site/content/arangodb/3.11/aql/fundamentals/limitations.md diff --git a/site/content/3.11/aql/fundamentals/query-errors.md b/site/content/arangodb/3.11/aql/fundamentals/query-errors.md similarity index 100% rename from site/content/3.11/aql/fundamentals/query-errors.md rename to site/content/arangodb/3.11/aql/fundamentals/query-errors.md diff --git a/site/content/3.11/aql/fundamentals/query-results.md b/site/content/arangodb/3.11/aql/fundamentals/query-results.md similarity index 100% rename from site/content/3.11/aql/fundamentals/query-results.md rename to site/content/arangodb/3.11/aql/fundamentals/query-results.md diff --git a/site/content/3.11/aql/fundamentals/subqueries.md b/site/content/arangodb/3.11/aql/fundamentals/subqueries.md similarity index 100% rename from site/content/3.11/aql/fundamentals/subqueries.md rename to site/content/arangodb/3.11/aql/fundamentals/subqueries.md diff --git a/site/content/3.11/aql/fundamentals/syntax.md b/site/content/arangodb/3.11/aql/fundamentals/syntax.md similarity index 100% rename from site/content/3.11/aql/fundamentals/syntax.md rename to site/content/arangodb/3.11/aql/fundamentals/syntax.md diff --git a/site/content/3.11/aql/fundamentals/type-and-value-order.md b/site/content/arangodb/3.11/aql/fundamentals/type-and-value-order.md similarity index 100% rename from site/content/3.11/aql/fundamentals/type-and-value-order.md rename to site/content/arangodb/3.11/aql/fundamentals/type-and-value-order.md diff --git a/site/content/3.11/aql/graphs/_index.md b/site/content/arangodb/3.11/aql/graphs/_index.md similarity index 100% rename from site/content/3.11/aql/graphs/_index.md rename to site/content/arangodb/3.11/aql/graphs/_index.md diff --git a/site/content/3.11/aql/graphs/all-shortest-paths.md b/site/content/arangodb/3.11/aql/graphs/all-shortest-paths.md similarity index 98% rename from site/content/3.11/aql/graphs/all-shortest-paths.md rename to site/content/arangodb/3.11/aql/graphs/all-shortest-paths.md index a60da2eab8..571a6857d3 100644 --- a/site/content/3.11/aql/graphs/all-shortest-paths.md +++ b/site/content/arangodb/3.11/aql/graphs/all-shortest-paths.md @@ -19,7 +19,7 @@ Every returned path is a JSON object with two attributes: A visual representation of the example graph: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the vertices of the graph. Arrows represent train connections @@ -105,7 +105,7 @@ direction for each collection in your path search. Load an example graph to get a named graph that reflects some possible train connections in Europe and North America: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.11/aql/graphs/k-paths.md b/site/content/arangodb/3.11/aql/graphs/k-paths.md similarity index 98% rename from site/content/3.11/aql/graphs/k-paths.md rename to site/content/arangodb/3.11/aql/graphs/k-paths.md index 582232dc9a..e4da13c5e3 100644 --- a/site/content/3.11/aql/graphs/k-paths.md +++ b/site/content/arangodb/3.11/aql/graphs/k-paths.md @@ -20,7 +20,7 @@ Every such path is returned as a JSON object with two components: Here is an example graph to explain how the k Paths algorithm works: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the vertices of the graph. Arrows represent train connections @@ -176,7 +176,7 @@ direction for each collection in your path search. You can load the `kShortestPathsGraph` example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.11/aql/graphs/k-shortest-paths.md b/site/content/arangodb/3.11/aql/graphs/k-shortest-paths.md similarity index 98% rename from site/content/3.11/aql/graphs/k-shortest-paths.md rename to site/content/arangodb/3.11/aql/graphs/k-shortest-paths.md index 3a339ea9c9..917dba2516 100644 --- a/site/content/3.11/aql/graphs/k-shortest-paths.md +++ b/site/content/arangodb/3.11/aql/graphs/k-shortest-paths.md @@ -25,7 +25,7 @@ If no `weightAttribute` is specified, the weight of the path is just its length. Here is an example graph to explain how the k Shortest Paths algorithm works: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the vertices of the graph. Arrows represent train connections @@ -182,7 +182,7 @@ direction for each collection in your path search. You can load the `kShortestPathsGraph` example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.11/aql/graphs/shortest-path.md b/site/content/arangodb/3.11/aql/graphs/shortest-path.md similarity index 98% rename from site/content/3.11/aql/graphs/shortest-path.md rename to site/content/arangodb/3.11/aql/graphs/shortest-path.md index bfc7e0fa5c..ed8540e777 100644 --- a/site/content/3.11/aql/graphs/shortest-path.md +++ b/site/content/arangodb/3.11/aql/graphs/shortest-path.md @@ -23,7 +23,7 @@ the path: Let's take a look at a simple example to explain how it works. This is the graph that you are going to find a shortest path on: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) You can use the following parameters for the query: @@ -151,7 +151,7 @@ collections you expect to be involved. Creating a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.11/aql/graphs/traversals-explained.md b/site/content/arangodb/3.11/aql/graphs/traversals-explained.md similarity index 83% rename from site/content/3.11/aql/graphs/traversals-explained.md rename to site/content/arangodb/3.11/aql/graphs/traversals-explained.md index a211ae6087..b4e9741151 100644 --- a/site/content/3.11/aql/graphs/traversals-explained.md +++ b/site/content/arangodb/3.11/aql/graphs/traversals-explained.md @@ -31,7 +31,7 @@ set with three items: Let's take a look at a simple example to explain how it works. This is the graph that we are going to traverse: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) We use the following parameters for our query: @@ -40,39 +40,39 @@ We use the following parameters for our query: 3. We use a *max* depth of 2. 4. We follow only in `OUTBOUND` direction of edges -![traversal graph step 1](../../../images/traversal_graph1.png) +![traversal graph step 1](../../../../images/traversal_graph1.png) Now it walks to one of the direct neighbors of **A**, say **B** (note: ordering is not guaranteed!): -![traversal graph step 2](../../../images/traversal_graph2.png) +![traversal graph step 2](../../../../images/traversal_graph2.png) The query will remember the state (red circle) and will emit the first result **A** → **B** (black box). This will also prevent the traverser to be trapped in cycles. Now again it will visit one of the direct neighbors of **B**, say **E**: -![traversal graph step 3](../../../images/traversal_graph3.png) +![traversal graph step 3](../../../../images/traversal_graph3.png) We have limited the query with a *max* depth of *2*, so it will not pick any neighbor of **E**, as the path from **A** to **E** already requires *2* steps. Instead, we will go back one level to **B** and continue with any other direct neighbor there: -![traversal graph step 4](../../../images/traversal_graph4.png) +![traversal graph step 4](../../../../images/traversal_graph4.png) Again after we produced this result we will step back to **B**. But there is no neighbor of **B** left that we have not yet visited. Hence we go another step back to **A** and continue with any other neighbor there. -![traversal graph step 5](../../../images/traversal_graph5.png) +![traversal graph step 5](../../../../images/traversal_graph5.png) And identical to the iterations before we will visit **H**: -![traversal graph step 6](../../../images/traversal_graph6.png) +![traversal graph step 6](../../../../images/traversal_graph6.png) And **J**: -![traversal graph step 7](../../../images/traversal_graph7.png) +![traversal graph step 7](../../../../images/traversal_graph7.png) After these steps there is no further result left. So all together this query has returned the following paths: diff --git a/site/content/3.11/aql/graphs/traversals.md b/site/content/arangodb/3.11/aql/graphs/traversals.md similarity index 99% rename from site/content/3.11/aql/graphs/traversals.md rename to site/content/arangodb/3.11/aql/graphs/traversals.md index 0048d9c38f..f9268387a1 100644 --- a/site/content/3.11/aql/graphs/traversals.md +++ b/site/content/arangodb/3.11/aql/graphs/traversals.md @@ -301,7 +301,7 @@ FOR v, e, p IN 0..10 OUTBOUND "places/Toronto" GRAPH "kShortestPathsGraph" The above example shows a graph traversal using a [train station and connections dataset](../../graphs/example-graphs.md#k-shortest-paths-graph): -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) The traversal starts at **Toronto** (bottom left), the traversal depth is limited to 10, and every station is only visited once. The traversal could @@ -649,7 +649,7 @@ you may be interested in documents further down the path. Create a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.11/aql/high-level-operations/_index.md b/site/content/arangodb/3.11/aql/high-level-operations/_index.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/_index.md rename to site/content/arangodb/3.11/aql/high-level-operations/_index.md diff --git a/site/content/3.11/aql/high-level-operations/collect.md b/site/content/arangodb/3.11/aql/high-level-operations/collect.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/collect.md rename to site/content/arangodb/3.11/aql/high-level-operations/collect.md diff --git a/site/content/3.11/aql/high-level-operations/filter.md b/site/content/arangodb/3.11/aql/high-level-operations/filter.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/filter.md rename to site/content/arangodb/3.11/aql/high-level-operations/filter.md diff --git a/site/content/3.11/aql/high-level-operations/for.md b/site/content/arangodb/3.11/aql/high-level-operations/for.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/for.md rename to site/content/arangodb/3.11/aql/high-level-operations/for.md diff --git a/site/content/3.11/aql/high-level-operations/insert.md b/site/content/arangodb/3.11/aql/high-level-operations/insert.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/insert.md rename to site/content/arangodb/3.11/aql/high-level-operations/insert.md diff --git a/site/content/3.11/aql/high-level-operations/let.md b/site/content/arangodb/3.11/aql/high-level-operations/let.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/let.md rename to site/content/arangodb/3.11/aql/high-level-operations/let.md diff --git a/site/content/3.11/aql/high-level-operations/limit.md b/site/content/arangodb/3.11/aql/high-level-operations/limit.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/limit.md rename to site/content/arangodb/3.11/aql/high-level-operations/limit.md diff --git a/site/content/3.11/aql/high-level-operations/remove.md b/site/content/arangodb/3.11/aql/high-level-operations/remove.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/remove.md rename to site/content/arangodb/3.11/aql/high-level-operations/remove.md diff --git a/site/content/3.11/aql/high-level-operations/replace.md b/site/content/arangodb/3.11/aql/high-level-operations/replace.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/replace.md rename to site/content/arangodb/3.11/aql/high-level-operations/replace.md diff --git a/site/content/3.11/aql/high-level-operations/return.md b/site/content/arangodb/3.11/aql/high-level-operations/return.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/return.md rename to site/content/arangodb/3.11/aql/high-level-operations/return.md diff --git a/site/content/3.11/aql/high-level-operations/search.md b/site/content/arangodb/3.11/aql/high-level-operations/search.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/search.md rename to site/content/arangodb/3.11/aql/high-level-operations/search.md diff --git a/site/content/3.11/aql/high-level-operations/sort.md b/site/content/arangodb/3.11/aql/high-level-operations/sort.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/sort.md rename to site/content/arangodb/3.11/aql/high-level-operations/sort.md diff --git a/site/content/3.11/aql/high-level-operations/update.md b/site/content/arangodb/3.11/aql/high-level-operations/update.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/update.md rename to site/content/arangodb/3.11/aql/high-level-operations/update.md diff --git a/site/content/3.11/aql/high-level-operations/upsert.md b/site/content/arangodb/3.11/aql/high-level-operations/upsert.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/upsert.md rename to site/content/arangodb/3.11/aql/high-level-operations/upsert.md diff --git a/site/content/3.11/aql/high-level-operations/window.md b/site/content/arangodb/3.11/aql/high-level-operations/window.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/window.md rename to site/content/arangodb/3.11/aql/high-level-operations/window.md diff --git a/site/content/3.11/aql/high-level-operations/with.md b/site/content/arangodb/3.11/aql/high-level-operations/with.md similarity index 100% rename from site/content/3.11/aql/high-level-operations/with.md rename to site/content/arangodb/3.11/aql/high-level-operations/with.md diff --git a/site/content/3.11/aql/how-to-invoke-aql/_index.md b/site/content/arangodb/3.11/aql/how-to-invoke-aql/_index.md similarity index 100% rename from site/content/3.11/aql/how-to-invoke-aql/_index.md rename to site/content/arangodb/3.11/aql/how-to-invoke-aql/_index.md diff --git a/site/content/3.11/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md similarity index 100% rename from site/content/3.11/aql/how-to-invoke-aql/with-arangosh.md rename to site/content/arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md diff --git a/site/content/3.11/aql/how-to-invoke-aql/with-the-web-interface.md b/site/content/arangodb/3.11/aql/how-to-invoke-aql/with-the-web-interface.md similarity index 100% rename from site/content/3.11/aql/how-to-invoke-aql/with-the-web-interface.md rename to site/content/arangodb/3.11/aql/how-to-invoke-aql/with-the-web-interface.md diff --git a/site/content/3.11/aql/operators.md b/site/content/arangodb/3.11/aql/operators.md similarity index 100% rename from site/content/3.11/aql/operators.md rename to site/content/arangodb/3.11/aql/operators.md diff --git a/site/content/3.11/aql/user-defined-functions.md b/site/content/arangodb/3.11/aql/user-defined-functions.md similarity index 100% rename from site/content/3.11/aql/user-defined-functions.md rename to site/content/arangodb/3.11/aql/user-defined-functions.md diff --git a/site/content/3.11/components/_index.md b/site/content/arangodb/3.11/components/_index.md similarity index 100% rename from site/content/3.11/components/_index.md rename to site/content/arangodb/3.11/components/_index.md diff --git a/site/content/3.11/components/arangodb-server/_index.md b/site/content/arangodb/3.11/components/arangodb-server/_index.md similarity index 88% rename from site/content/3.11/components/arangodb-server/_index.md rename to site/content/arangodb/3.11/components/arangodb-server/_index.md index 82da2f3a5f..44c9d1040c 100644 --- a/site/content/3.11/components/arangodb-server/_index.md +++ b/site/content/arangodb/3.11/components/arangodb-server/_index.md @@ -14,8 +14,8 @@ The server process serves the various client connections to the server via the TCP/HTTP protocol. It also provides a [web interface](../web-interface/_index.md). _arangod_ can run in different modes for a variety of setups like single server -and clusters. It differs between the [Community Edition](../../about-arangodb/features/community-edition.md) -and [Enterprise Edition](../../about-arangodb/features/enterprise-edition.md). +and clusters. It differs between the [Community Edition](../../about/features/community-edition.md) +and [Enterprise Edition](../../about/features/enterprise-edition.md). See [Administration](../../operations/administration/_index.md) for server configuration and [Deploy](../../deploy/_index.md) for operation mode details. diff --git a/site/content/3.11/components/arangodb-server/environment-variables.md b/site/content/arangodb/3.11/components/arangodb-server/environment-variables.md similarity index 100% rename from site/content/3.11/components/arangodb-server/environment-variables.md rename to site/content/arangodb/3.11/components/arangodb-server/environment-variables.md diff --git a/site/content/3.11/components/arangodb-server/ldap.md b/site/content/arangodb/3.11/components/arangodb-server/ldap.md similarity index 100% rename from site/content/3.11/components/arangodb-server/ldap.md rename to site/content/arangodb/3.11/components/arangodb-server/ldap.md diff --git a/site/content/3.11/components/arangodb-server/options.md b/site/content/arangodb/3.11/components/arangodb-server/options.md similarity index 100% rename from site/content/3.11/components/arangodb-server/options.md rename to site/content/arangodb/3.11/components/arangodb-server/options.md diff --git a/site/content/3.11/components/arangodb-server/storage-engine.md b/site/content/arangodb/3.11/components/arangodb-server/storage-engine.md similarity index 100% rename from site/content/3.11/components/arangodb-server/storage-engine.md rename to site/content/arangodb/3.11/components/arangodb-server/storage-engine.md diff --git a/site/content/3.12/components/tools/_index.md b/site/content/arangodb/3.11/components/tools/_index.md similarity index 94% rename from site/content/3.12/components/tools/_index.md rename to site/content/arangodb/3.11/components/tools/_index.md index 72bf4118a4..9909dbe302 100644 --- a/site/content/3.12/components/tools/_index.md +++ b/site/content/arangodb/3.11/components/tools/_index.md @@ -31,5 +31,5 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../arangograph/oasisctl/_index.md) | Command-line tool for managing the ArangoGraph Insights Platform +| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) | [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/3.11/components/tools/arango-datasets.md b/site/content/arangodb/3.11/components/tools/arango-datasets.md similarity index 100% rename from site/content/3.11/components/tools/arango-datasets.md rename to site/content/arangodb/3.11/components/tools/arango-datasets.md diff --git a/site/content/3.11/components/tools/arangobackup/_index.md b/site/content/arangodb/3.11/components/tools/arangobackup/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangobackup/_index.md rename to site/content/arangodb/3.11/components/tools/arangobackup/_index.md diff --git a/site/content/3.11/components/tools/arangobackup/examples.md b/site/content/arangodb/3.11/components/tools/arangobackup/examples.md similarity index 100% rename from site/content/3.11/components/tools/arangobackup/examples.md rename to site/content/arangodb/3.11/components/tools/arangobackup/examples.md diff --git a/site/content/3.11/components/tools/arangobackup/options.md b/site/content/arangodb/3.11/components/tools/arangobackup/options.md similarity index 100% rename from site/content/3.11/components/tools/arangobackup/options.md rename to site/content/arangodb/3.11/components/tools/arangobackup/options.md diff --git a/site/content/3.11/components/tools/arangobench/_index.md b/site/content/arangodb/3.11/components/tools/arangobench/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangobench/_index.md rename to site/content/arangodb/3.11/components/tools/arangobench/_index.md diff --git a/site/content/3.11/components/tools/arangobench/options.md b/site/content/arangodb/3.11/components/tools/arangobench/options.md similarity index 100% rename from site/content/3.11/components/tools/arangobench/options.md rename to site/content/arangodb/3.11/components/tools/arangobench/options.md diff --git a/site/content/3.11/components/tools/arangodb-shell/_index.md b/site/content/arangodb/3.11/components/tools/arangodb-shell/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-shell/_index.md rename to site/content/arangodb/3.11/components/tools/arangodb-shell/_index.md diff --git a/site/content/3.11/components/tools/arangodb-shell/details.md b/site/content/arangodb/3.11/components/tools/arangodb-shell/details.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-shell/details.md rename to site/content/arangodb/3.11/components/tools/arangodb-shell/details.md diff --git a/site/content/3.11/components/tools/arangodb-shell/examples.md b/site/content/arangodb/3.11/components/tools/arangodb-shell/examples.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-shell/examples.md rename to site/content/arangodb/3.11/components/tools/arangodb-shell/examples.md diff --git a/site/content/3.11/components/tools/arangodb-shell/options.md b/site/content/arangodb/3.11/components/tools/arangodb-shell/options.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-shell/options.md rename to site/content/arangodb/3.11/components/tools/arangodb-shell/options.md diff --git a/site/content/3.11/components/tools/arangodb-starter/_index.md b/site/content/arangodb/3.11/components/tools/arangodb-starter/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-starter/_index.md rename to site/content/arangodb/3.11/components/tools/arangodb-starter/_index.md diff --git a/site/content/3.11/components/tools/arangodb-starter/architecture.md b/site/content/arangodb/3.11/components/tools/arangodb-starter/architecture.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-starter/architecture.md rename to site/content/arangodb/3.11/components/tools/arangodb-starter/architecture.md diff --git a/site/content/3.11/components/tools/arangodb-starter/options.md b/site/content/arangodb/3.11/components/tools/arangodb-starter/options.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-starter/options.md rename to site/content/arangodb/3.11/components/tools/arangodb-starter/options.md diff --git a/site/content/3.11/components/tools/arangodb-starter/security.md b/site/content/arangodb/3.11/components/tools/arangodb-starter/security.md similarity index 100% rename from site/content/3.11/components/tools/arangodb-starter/security.md rename to site/content/arangodb/3.11/components/tools/arangodb-starter/security.md diff --git a/site/content/3.11/components/tools/arangodump/_index.md b/site/content/arangodb/3.11/components/tools/arangodump/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangodump/_index.md rename to site/content/arangodb/3.11/components/tools/arangodump/_index.md diff --git a/site/content/3.11/components/tools/arangodump/examples.md b/site/content/arangodb/3.11/components/tools/arangodump/examples.md similarity index 100% rename from site/content/3.11/components/tools/arangodump/examples.md rename to site/content/arangodb/3.11/components/tools/arangodump/examples.md diff --git a/site/content/3.11/components/tools/arangodump/limitations.md b/site/content/arangodb/3.11/components/tools/arangodump/limitations.md similarity index 100% rename from site/content/3.11/components/tools/arangodump/limitations.md rename to site/content/arangodb/3.11/components/tools/arangodump/limitations.md diff --git a/site/content/3.11/components/tools/arangodump/maskings.md b/site/content/arangodb/3.11/components/tools/arangodump/maskings.md similarity index 100% rename from site/content/3.11/components/tools/arangodump/maskings.md rename to site/content/arangodb/3.11/components/tools/arangodump/maskings.md diff --git a/site/content/3.11/components/tools/arangodump/options.md b/site/content/arangodb/3.11/components/tools/arangodump/options.md similarity index 100% rename from site/content/3.11/components/tools/arangodump/options.md rename to site/content/arangodb/3.11/components/tools/arangodump/options.md diff --git a/site/content/3.11/components/tools/arangoexport/_index.md b/site/content/arangodb/3.11/components/tools/arangoexport/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangoexport/_index.md rename to site/content/arangodb/3.11/components/tools/arangoexport/_index.md diff --git a/site/content/3.11/components/tools/arangoexport/examples.md b/site/content/arangodb/3.11/components/tools/arangoexport/examples.md similarity index 100% rename from site/content/3.11/components/tools/arangoexport/examples.md rename to site/content/arangodb/3.11/components/tools/arangoexport/examples.md diff --git a/site/content/3.11/components/tools/arangoexport/options.md b/site/content/arangodb/3.11/components/tools/arangoexport/options.md similarity index 100% rename from site/content/3.11/components/tools/arangoexport/options.md rename to site/content/arangodb/3.11/components/tools/arangoexport/options.md diff --git a/site/content/3.11/components/tools/arangoimport/_index.md b/site/content/arangodb/3.11/components/tools/arangoimport/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangoimport/_index.md rename to site/content/arangodb/3.11/components/tools/arangoimport/_index.md diff --git a/site/content/3.11/components/tools/arangoimport/details.md b/site/content/arangodb/3.11/components/tools/arangoimport/details.md similarity index 100% rename from site/content/3.11/components/tools/arangoimport/details.md rename to site/content/arangodb/3.11/components/tools/arangoimport/details.md diff --git a/site/content/3.11/components/tools/arangoimport/examples-csv.md b/site/content/arangodb/3.11/components/tools/arangoimport/examples-csv.md similarity index 100% rename from site/content/3.11/components/tools/arangoimport/examples-csv.md rename to site/content/arangodb/3.11/components/tools/arangoimport/examples-csv.md diff --git a/site/content/3.11/components/tools/arangoimport/examples-json.md b/site/content/arangodb/3.11/components/tools/arangoimport/examples-json.md similarity index 100% rename from site/content/3.11/components/tools/arangoimport/examples-json.md rename to site/content/arangodb/3.11/components/tools/arangoimport/examples-json.md diff --git a/site/content/3.11/components/tools/arangoimport/options.md b/site/content/arangodb/3.11/components/tools/arangoimport/options.md similarity index 100% rename from site/content/3.11/components/tools/arangoimport/options.md rename to site/content/arangodb/3.11/components/tools/arangoimport/options.md diff --git a/site/content/3.11/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.11/components/tools/arangoinspect/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangoinspect/_index.md rename to site/content/arangodb/3.11/components/tools/arangoinspect/_index.md diff --git a/site/content/3.11/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.11/components/tools/arangoinspect/examples.md similarity index 100% rename from site/content/3.11/components/tools/arangoinspect/examples.md rename to site/content/arangodb/3.11/components/tools/arangoinspect/examples.md diff --git a/site/content/3.11/components/tools/arangoinspect/options.md b/site/content/arangodb/3.11/components/tools/arangoinspect/options.md similarity index 100% rename from site/content/3.11/components/tools/arangoinspect/options.md rename to site/content/arangodb/3.11/components/tools/arangoinspect/options.md diff --git a/site/content/3.11/components/tools/arangorestore/_index.md b/site/content/arangodb/3.11/components/tools/arangorestore/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangorestore/_index.md rename to site/content/arangodb/3.11/components/tools/arangorestore/_index.md diff --git a/site/content/3.11/components/tools/arangorestore/examples.md b/site/content/arangodb/3.11/components/tools/arangorestore/examples.md similarity index 100% rename from site/content/3.11/components/tools/arangorestore/examples.md rename to site/content/arangodb/3.11/components/tools/arangorestore/examples.md diff --git a/site/content/3.11/components/tools/arangorestore/options.md b/site/content/arangodb/3.11/components/tools/arangorestore/options.md similarity index 100% rename from site/content/3.11/components/tools/arangorestore/options.md rename to site/content/arangodb/3.11/components/tools/arangorestore/options.md diff --git a/site/content/3.11/components/tools/arangovpack/_index.md b/site/content/arangodb/3.11/components/tools/arangovpack/_index.md similarity index 100% rename from site/content/3.11/components/tools/arangovpack/_index.md rename to site/content/arangodb/3.11/components/tools/arangovpack/_index.md diff --git a/site/content/3.11/components/tools/arangovpack/options.md b/site/content/arangodb/3.11/components/tools/arangovpack/options.md similarity index 100% rename from site/content/3.11/components/tools/arangovpack/options.md rename to site/content/arangodb/3.11/components/tools/arangovpack/options.md diff --git a/site/content/3.11/components/tools/foxx-cli/_index.md b/site/content/arangodb/3.11/components/tools/foxx-cli/_index.md similarity index 100% rename from site/content/3.11/components/tools/foxx-cli/_index.md rename to site/content/arangodb/3.11/components/tools/foxx-cli/_index.md diff --git a/site/content/3.11/components/tools/foxx-cli/details.md b/site/content/arangodb/3.11/components/tools/foxx-cli/details.md similarity index 100% rename from site/content/3.11/components/tools/foxx-cli/details.md rename to site/content/arangodb/3.11/components/tools/foxx-cli/details.md diff --git a/site/content/3.10/components/web-interface/_index.md b/site/content/arangodb/3.11/components/web-interface/_index.md similarity index 90% rename from site/content/3.10/components/web-interface/_index.md rename to site/content/arangodb/3.11/components/web-interface/_index.md index 12863abcb6..dc6affca41 100644 --- a/site/content/3.10/components/web-interface/_index.md +++ b/site/content/arangodb/3.11/components/web-interface/_index.md @@ -13,4 +13,4 @@ convenient way. Statistics and server status are provided as well. The web interface (also referred to as Web UI, frontend or *Aardvark*) can be accessed with a browser under the URL `http://localhost:8529` with default server settings. -![Standalone Web Interface](../../../images/overview.png) +![Standalone Web Interface](../../../../images/overview.png) diff --git a/site/content/3.11/components/web-interface/cluster.md b/site/content/arangodb/3.11/components/web-interface/cluster.md similarity index 94% rename from site/content/3.11/components/web-interface/cluster.md rename to site/content/arangodb/3.11/components/web-interface/cluster.md index 91ae4bd075..108ed759bb 100644 --- a/site/content/3.11/components/web-interface/cluster.md +++ b/site/content/arangodb/3.11/components/web-interface/cluster.md @@ -14,7 +14,7 @@ You can access the logs of individual Coordinators and DB-Servers via the The cluster section displays statistics about the general cluster performance. -![Cluster](../../../images/clusterView.png) +![Cluster](../../../../images/clusterView.png) Statistics: @@ -32,7 +32,7 @@ Statistics: The overview shows available and missing Coordinators and DB-Servers. -![Nodes](../../../images/nodesView.png) +![Nodes](../../../../images/nodesView.png) Functions: @@ -50,7 +50,7 @@ Information (Coordinator / DB-Servers): The shard section displays all available sharded collections. -![Shards](../../../images/shardsView.png) +![Shards](../../../../images/shardsView.png) Functions: diff --git a/site/content/3.11/components/web-interface/collections.md b/site/content/arangodb/3.11/components/web-interface/collections.md similarity index 91% rename from site/content/3.11/components/web-interface/collections.md rename to site/content/arangodb/3.11/components/web-interface/collections.md index d53138f83e..ad8e937e88 100644 --- a/site/content/3.11/components/web-interface/collections.md +++ b/site/content/arangodb/3.11/components/web-interface/collections.md @@ -8,7 +8,7 @@ The collections section displays all available collections. From here you can create new collections and jump into a collection for details (click on a collection tile). -![Collections](../../../images/collectionsView.png) +![Collections](../../../../images/collectionsView.png) Functions: @@ -26,7 +26,7 @@ Information: ## Collection -![Collection](../../../images/collectionView.png) +![Collection](../../../../images/collectionView.png) There are four view categories: diff --git a/site/content/3.11/components/web-interface/dashboard.md b/site/content/arangodb/3.11/components/web-interface/dashboard.md similarity index 92% rename from site/content/3.11/components/web-interface/dashboard.md rename to site/content/arangodb/3.11/components/web-interface/dashboard.md index aac4f439ae..599127ba12 100644 --- a/site/content/3.11/components/web-interface/dashboard.md +++ b/site/content/arangodb/3.11/components/web-interface/dashboard.md @@ -7,7 +7,7 @@ description: '' The **DASHBOARD** section provides statistics which are polled regularly from the ArangoDB server. -![Nodes](../../../images/dashboardView.png) +![Nodes](../../../../images/dashboardView.png) There is a different interface for [Cluster](cluster.md) deployments. diff --git a/site/content/3.10/components/web-interface/document.md b/site/content/arangodb/3.11/components/web-interface/document.md similarity index 87% rename from site/content/3.10/components/web-interface/document.md rename to site/content/arangodb/3.11/components/web-interface/document.md index 2ff9addb44..85cc5583a9 100644 --- a/site/content/3.10/components/web-interface/document.md +++ b/site/content/arangodb/3.11/components/web-interface/document.md @@ -6,7 +6,7 @@ description: '' --- The document section offers a editor which let you edit documents and edges of a collection. -![Document](../../../images/documentView.png) +![Document](../../../../images/documentView.png) Functions: diff --git a/site/content/3.11/components/web-interface/graphs.md b/site/content/arangodb/3.11/components/web-interface/graphs.md similarity index 98% rename from site/content/3.11/components/web-interface/graphs.md rename to site/content/arangodb/3.11/components/web-interface/graphs.md index dafa51f9f8..3388a97ae5 100644 --- a/site/content/3.11/components/web-interface/graphs.md +++ b/site/content/arangodb/3.11/components/web-interface/graphs.md @@ -12,7 +12,7 @@ lets you create new named graphs as well as view and edit the settings of existing named graphs. It also provides a viewer facility for visualizing subsets of a graph or an entire graph. -![manage graphs](../../../images/graphsView.png) +![manage graphs](../../../../images/graphsView.png) ## Create a named graph @@ -59,7 +59,7 @@ their direct neighbors are selected. You can select one or more start nodes and change the depth and the limit in the settings panel. You can also load the entire graph via the toolbar, but only use this with small graphs. -![The graph viewer with the settings panel open](../../../images/graphViewer.png) +![The graph viewer with the settings panel open](../../../../images/graphViewer.png) ### Viewport diff --git a/site/content/3.10/components/web-interface/logs.md b/site/content/arangodb/3.11/components/web-interface/logs.md similarity index 87% rename from site/content/3.10/components/web-interface/logs.md rename to site/content/arangodb/3.11/components/web-interface/logs.md index f9ddcc007b..46c70ffb19 100644 --- a/site/content/3.10/components/web-interface/logs.md +++ b/site/content/arangodb/3.11/components/web-interface/logs.md @@ -7,7 +7,7 @@ description: '' The logs section displays all available log entries. Log entries are filterable by their log level types. -![Logs](../../../images/logsView.png) +![Logs](../../../../images/logsView.png) Functions: diff --git a/site/content/3.11/components/web-interface/queries.md b/site/content/arangodb/3.11/components/web-interface/queries.md similarity index 91% rename from site/content/3.11/components/web-interface/queries.md rename to site/content/arangodb/3.11/components/web-interface/queries.md index c263e2e6b0..bc5d76591b 100644 --- a/site/content/3.11/components/web-interface/queries.md +++ b/site/content/arangodb/3.11/components/web-interface/queries.md @@ -14,7 +14,7 @@ The query view offers you three different subviews: The web interface offers a AQL Query Editor: -![Editor Input](../../../images/queryEditorInput.png) +![Editor Input](../../../../images/queryEditorInput.png) The editor is split into two parts, the query editor pane and the bind parameter pane. @@ -49,7 +49,7 @@ edit the bind parameters in raw JSON format. To save the current query use the *Save* button in the top left corner of the editor or use the shortcut (see below). -![Custom Queries](../../../images/queryCustoms.png) +![Custom Queries](../../../../images/queryCustoms.png) By pressing the *Queries* button in the top left corner of the editor you activate the custom queries view. Here you can select a previously stored custom @@ -70,7 +70,7 @@ right-hand side. ### Result -![Editor Output](../../../images/queryEditorOutput.png) +![Editor Output](../../../../images/queryEditorOutput.png) Each query you execute or explain opens up a new result box, so you are able to fire up multiple queries and view their results at the same time. Every query @@ -81,7 +81,7 @@ switches back and forth between the *Result* and *AQL* query with bind parameter ### Spotlight -![Spotlight](../../../images/querySpotlight.png) +![Spotlight](../../../../images/querySpotlight.png) The spotlight feature opens up a modal view. There you can find all AQL keywords, AQL functions and collections (filtered by their type) to help you to be more @@ -105,13 +105,13 @@ in the toolbar or via shortcut (see below). ## Running Queries -![Running Queries](../../../images/runningQueries.png) +![Running Queries](../../../../images/runningQueries.png) The *Running Queries* tab gives you a compact overview of all running queries. By clicking the red minus button, you can abort the execution of a running query. ## Slow Query History -![Slow Queries](../../../images/slowQueries.png) +![Slow Queries](../../../../images/slowQueries.png) The *Slow Query History* tab gives you a compact overview of all past slow queries. diff --git a/site/content/3.11/components/web-interface/services.md b/site/content/arangodb/3.11/components/web-interface/services.md similarity index 87% rename from site/content/3.11/components/web-interface/services.md rename to site/content/arangodb/3.11/components/web-interface/services.md index 3bae62eb84..478bfd2b29 100644 --- a/site/content/3.11/components/web-interface/services.md +++ b/site/content/arangodb/3.11/components/web-interface/services.md @@ -7,7 +7,7 @@ description: '' The services section displays all installed Foxx applications. You can create new services or go into a detailed view of a chosen service. -![Services](../../../images/servicesView.png) +![Services](../../../../images/servicesView.png) ## Create Service @@ -18,13 +18,13 @@ There are four different possibilities to create a new service: 3. Create service via official ArangoDB store 4. Create a blank service from scratch -![Create Service](../../../images/installService.png) +![Create Service](../../../../images/installService.png) ## Service View This section offers several information about a specific service. -![Create Service](../../../images/serviceView.png) +![Create Service](../../../../images/serviceView.png) There are four view categories: diff --git a/site/content/3.10/components/web-interface/users.md b/site/content/arangodb/3.11/components/web-interface/users.md similarity index 90% rename from site/content/3.10/components/web-interface/users.md rename to site/content/arangodb/3.11/components/web-interface/users.md index 3ecc4fc927..49b3511339 100644 --- a/site/content/3.10/components/web-interface/users.md +++ b/site/content/arangodb/3.11/components/web-interface/users.md @@ -7,21 +7,21 @@ description: '' ArangoDB users are globally stored in the `_system` database and can only be managed while logged on to this database. There you can find the *Users* section: -![Users](../../../images/users.png) +![Users](../../../../images/users.png) ## General Select a user to bring up the *General* tab with the username, name and active status, as well as options to delete the user or change the password. -![User General](../../../images/userGeneral.png) +![User General](../../../../images/userGeneral.png) ## Permissions Select a user and go to the *Permissions* tab. You will see a list of databases and their corresponding database access level for that user. -![User Permissions](../../../images/userPermissions.png) +![User Permissions](../../../../images/userPermissions.png) Please note that server access level follows from the access level on the `_system` database. Furthermore, the default database access level diff --git a/site/content/3.11/concepts/_index.md b/site/content/arangodb/3.11/concepts/_index.md similarity index 100% rename from site/content/3.11/concepts/_index.md rename to site/content/arangodb/3.11/concepts/_index.md diff --git a/site/content/3.11/concepts/data-models.md b/site/content/arangodb/3.11/concepts/data-models.md similarity index 100% rename from site/content/3.11/concepts/data-models.md rename to site/content/arangodb/3.11/concepts/data-models.md diff --git a/site/content/3.11/concepts/data-retrieval.md b/site/content/arangodb/3.11/concepts/data-retrieval.md similarity index 100% rename from site/content/3.11/concepts/data-retrieval.md rename to site/content/arangodb/3.11/concepts/data-retrieval.md diff --git a/site/content/3.11/concepts/data-structure/_index.md b/site/content/arangodb/3.11/concepts/data-structure/_index.md similarity index 100% rename from site/content/3.11/concepts/data-structure/_index.md rename to site/content/arangodb/3.11/concepts/data-structure/_index.md diff --git a/site/content/3.11/concepts/data-structure/collections.md b/site/content/arangodb/3.11/concepts/data-structure/collections.md similarity index 100% rename from site/content/3.11/concepts/data-structure/collections.md rename to site/content/arangodb/3.11/concepts/data-structure/collections.md diff --git a/site/content/3.11/concepts/data-structure/databases.md b/site/content/arangodb/3.11/concepts/data-structure/databases.md similarity index 100% rename from site/content/3.11/concepts/data-structure/databases.md rename to site/content/arangodb/3.11/concepts/data-structure/databases.md diff --git a/site/content/3.11/concepts/data-structure/documents/_index.md b/site/content/arangodb/3.11/concepts/data-structure/documents/_index.md similarity index 100% rename from site/content/3.11/concepts/data-structure/documents/_index.md rename to site/content/arangodb/3.11/concepts/data-structure/documents/_index.md diff --git a/site/content/3.11/concepts/data-structure/documents/computed-values.md b/site/content/arangodb/3.11/concepts/data-structure/documents/computed-values.md similarity index 100% rename from site/content/3.11/concepts/data-structure/documents/computed-values.md rename to site/content/arangodb/3.11/concepts/data-structure/documents/computed-values.md diff --git a/site/content/3.11/concepts/data-structure/documents/schema-validation.md b/site/content/arangodb/3.11/concepts/data-structure/documents/schema-validation.md similarity index 100% rename from site/content/3.11/concepts/data-structure/documents/schema-validation.md rename to site/content/arangodb/3.11/concepts/data-structure/documents/schema-validation.md diff --git a/site/content/3.11/concepts/data-structure/views.md b/site/content/arangodb/3.11/concepts/data-structure/views.md similarity index 100% rename from site/content/3.11/concepts/data-structure/views.md rename to site/content/arangodb/3.11/concepts/data-structure/views.md diff --git a/site/content/3.11/data-science/_index.md b/site/content/arangodb/3.11/data-science/_index.md similarity index 94% rename from site/content/3.11/data-science/_index.md rename to site/content/arangodb/3.11/data-science/_index.md index 32d6450b82..7f8eee4780 100644 --- a/site/content/3.11/data-science/_index.md +++ b/site/content/arangodb/3.11/data-science/_index.md @@ -21,7 +21,7 @@ ArangoDB, as the foundation for GraphML, comes with the following key features: - **Open Source**: extensibility and community. - **NLP Support**: built-in text processing, search, and similarity ranking. -![ArangoDB Machine Learning Architecture](../../images/machine-learning-architecture.png) +![ArangoDB Machine Learning Architecture](../../../images/machine-learning-architecture.png) ## Graph Analytics vs. GraphML @@ -38,7 +38,7 @@ Graph queries can also determine the shortest paths between vertices. Graph queries can answer questions like _**Who can introduce me to person X**_? -![Graph Query](../../images/graph-query.png) +![Graph Query](../../../images/graph-query.png) See [Graphs in AQL](../aql/graphs/_index.md) for the supported graph queries. @@ -49,7 +49,7 @@ know aggregate information about your graph, while analyzing the entire graph. Graph analytics can answer questions like _**Who are the most connected persons**_? -![Graph Analytics](../../images/graph-analytics.png) +![Graph Analytics](../../../images/graph-analytics.png) ArangoDB offers _Graph Analytics Engines_ to run algorithms such as connected components, label propagation, and PageRank on your data. This feature @@ -66,7 +66,7 @@ GraphML can answer questions like: - _**Will a customer churn?**_ - _**Is this particular transaction Anomalous?**_ -![Graph ML](../../images/graph-ml.png) +![Graph ML](../../../images/graph-ml.png) For ArangoDB's enterprise-ready, graph-powered machine learning offering, see [ArangoGraphML](arangographml/_index.md). @@ -120,7 +120,7 @@ The ArangoFlix demo uses five different recommendation methods: - Matrix Factorization - Graph Neural Networks -![ArangoFlix demo](../../images/data-science-arangoflix.png) +![ArangoFlix demo](../../../images/data-science-arangoflix.png) The ArangoFlix website not only offers an example of how the user recommendations might look like in real life, but it also provides information on a recommendation method, diff --git a/site/content/3.11/data-science/adapters/_index.md b/site/content/arangodb/3.11/data-science/adapters/_index.md similarity index 100% rename from site/content/3.11/data-science/adapters/_index.md rename to site/content/arangodb/3.11/data-science/adapters/_index.md diff --git a/site/content/3.11/data-science/adapters/arangodb-cugraph-adapter.md b/site/content/arangodb/3.11/data-science/adapters/arangodb-cugraph-adapter.md similarity index 100% rename from site/content/3.11/data-science/adapters/arangodb-cugraph-adapter.md rename to site/content/arangodb/3.11/data-science/adapters/arangodb-cugraph-adapter.md diff --git a/site/content/3.11/data-science/adapters/arangodb-dgl-adapter.md b/site/content/arangodb/3.11/data-science/adapters/arangodb-dgl-adapter.md similarity index 100% rename from site/content/3.11/data-science/adapters/arangodb-dgl-adapter.md rename to site/content/arangodb/3.11/data-science/adapters/arangodb-dgl-adapter.md diff --git a/site/content/3.11/data-science/adapters/arangodb-networkx-adapter.md b/site/content/arangodb/3.11/data-science/adapters/arangodb-networkx-adapter.md similarity index 100% rename from site/content/3.11/data-science/adapters/arangodb-networkx-adapter.md rename to site/content/arangodb/3.11/data-science/adapters/arangodb-networkx-adapter.md diff --git a/site/content/3.11/data-science/adapters/arangodb-pyg-adapter.md b/site/content/arangodb/3.11/data-science/adapters/arangodb-pyg-adapter.md similarity index 100% rename from site/content/3.11/data-science/adapters/arangodb-pyg-adapter.md rename to site/content/arangodb/3.11/data-science/adapters/arangodb-pyg-adapter.md diff --git a/site/content/3.11/data-science/adapters/arangodb-rdf-adapter.md b/site/content/arangodb/3.11/data-science/adapters/arangodb-rdf-adapter.md similarity index 100% rename from site/content/3.11/data-science/adapters/arangodb-rdf-adapter.md rename to site/content/arangodb/3.11/data-science/adapters/arangodb-rdf-adapter.md diff --git a/site/content/arangodb/3.11/data-science/arangograph-notebooks.md b/site/content/arangodb/3.11/data-science/arangograph-notebooks.md new file mode 100644 index 0000000000..833a0525f1 --- /dev/null +++ b/site/content/arangodb/3.11/data-science/arangograph-notebooks.md @@ -0,0 +1,22 @@ +--- +title: AMP Notebooks +menuTitle: AMP Notebooks +weight: 130 +description: >- + Colocated Jupyter Notebooks within the Arango Managed Platform +--- +{{< tip >}} +AMP Notebooks don't include the ArangoGraphML services. +To enable the ArangoGraphML services, +[get in touch](https://www.arangodb.com/contact/) +with the ArangoDB team. +{{< /tip >}} + +The AMP Notebook is a JupyterLab notebook embedded in the +[Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +The notebook integrates seamlessly with the platform, +automatically connecting to AMP services and ArangoDB. +This makes it much easier to leverage these resources without having +to download any data locally or to remember user IDs, passwords, and endpoint URLs. + +For more information, see the [Notebooks](../../../amp/notebooks.md) documentation. diff --git a/site/content/3.11/data-science/arangographml/_index.md b/site/content/arangodb/3.11/data-science/arangographml/_index.md similarity index 98% rename from site/content/3.11/data-science/arangographml/_index.md rename to site/content/arangodb/3.11/data-science/arangographml/_index.md index e8d6ea4137..4a570b9f68 100644 --- a/site/content/3.11/data-science/arangographml/_index.md +++ b/site/content/arangodb/3.11/data-science/arangographml/_index.md @@ -36,9 +36,9 @@ ArangoGraphML streamlines these steps, providing an intuitive and scalable framework to integrate GraphML into various applications, from fraud detection to recommendation systems. -![GraphML Embeddings](../../../images/GraphML-Embeddings.webp) +![GraphML Embeddings](../../../../images/GraphML-Embeddings.webp) -![GraphML Workflow](../../../images/GraphML-How-it-works.webp) +![GraphML Workflow](../../../../images/GraphML-How-it-works.webp) It is no longer necessary to understand the complexities involved with graph machine learning, thanks to the accessibility of the ArangoML package. diff --git a/site/content/3.11/data-science/arangographml/deploy.md b/site/content/arangodb/3.11/data-science/arangographml/deploy.md similarity index 94% rename from site/content/3.11/data-science/arangographml/deploy.md rename to site/content/arangodb/3.11/data-science/arangographml/deploy.md index 0d62cb12f6..ceb4b92662 100644 --- a/site/content/3.11/data-science/arangographml/deploy.md +++ b/site/content/arangodb/3.11/data-science/arangographml/deploy.md @@ -36,7 +36,7 @@ with the ArangoDB team. - Metadata capture - Model management -![ArangoGraphML Pipeline](../../../images/ArangoGraphML_Pipeline.png) +![ArangoGraphML Pipeline](../../../../images/ArangoGraphML_Pipeline.png) #### Setup @@ -49,7 +49,7 @@ GraphML functionalities. To summarize, all you need to do is: 1. Sign up for an [ArangoGraph account](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -2. Create a new [deployment in ArangoGraph](../../arangograph/deployments/_index.md#how-to-create-a-new-deployment). +2. Create a new [deployment in ArangoGraph](../../../../amp/deployments/_index.md#how-to-create-a-new-deployment). 3. Start using the ArangoGraphML functionalities. ### Self-managed ArangoGraphML diff --git a/site/content/3.11/data-science/arangographml/getting-started.md b/site/content/arangodb/3.11/data-science/arangographml/getting-started.md similarity index 99% rename from site/content/3.11/data-science/arangographml/getting-started.md rename to site/content/arangodb/3.11/data-science/arangographml/getting-started.md index 6bd614167e..e6c6221fdc 100644 --- a/site/content/3.11/data-science/arangographml/getting-started.md +++ b/site/content/arangodb/3.11/data-science/arangographml/getting-started.md @@ -173,12 +173,12 @@ Knowledge Graph constructed from the [GDELT Project](https://www.gdeltproject.or The events used range from peaceful protests to significant battles in Angola. The image below depicts the connections around an example event: -![Example Event](../../../images/ArangoML_open_intelligence_sample.png) +![Example Event](../../../../images/ArangoML_open_intelligence_sample.png) You can also see a larger portion of this graph, showing how the events, actors, news sources, and locations are interconnected into a large graph. -![Example Event](../../../images/ArangoML_open_intelligence_visualization.png) +![Example Event](../../../../images/ArangoML_open_intelligence_visualization.png) Let's get started! diff --git a/site/content/3.11/data-science/graph-analytics.md b/site/content/arangodb/3.11/data-science/graph-analytics.md similarity index 98% rename from site/content/3.11/data-science/graph-analytics.md rename to site/content/arangodb/3.11/data-science/graph-analytics.md index 18df401e84..dca26ae758 100644 --- a/site/content/3.11/data-science/graph-analytics.md +++ b/site/content/arangodb/3.11/data-science/graph-analytics.md @@ -62,15 +62,15 @@ Single server deployments using ArangoDB version 3.11 are not supported. The [Management API](#management-api) for deploying and deleting engines requires an ArangoGraph **API key**. See -[Generating an API Key](../arangograph/api/get-started.md#generating-an-api-key) +[Generating an API Key](../../../amp/api/get-started.md#generating-an-api-key) on how to create one. You then need to generate an **access token** using the API key. See -[Authenticating with Oasisctl](../arangograph/api/get-started.md#authenticating-with-oasisctl) +[Authenticating with Oasisctl](../../../amp/api/get-started.md#authenticating-with-oasisctl) on how to do so using `oasisctl login`. The [Engine API](#engine-api) uses one of two authentication methods, depending -on the [__auto login to database UI__](../arangograph/deployments/_index.md#auto-login-to-database-ui) +on the [__auto login to database UI__](../../../amp/deployments/_index.md#auto-login-to-database-ui) setting in ArangoGraph: - **Enabled**: You can use an ArangoGraph access token created with an API key (see above), allowing you to use one token for both the Management API and @@ -382,7 +382,7 @@ It is probably impossible to discover an efficient algorithm which computes them in a distributed way. Fortunately there are scalable substitutions available, which should be equally usable for most use cases. -![Illustration of an execution of different centrality measures (Freeman 1977)](../../images/centrality_visual.png) +![Illustration of an execution of different centrality measures (Freeman 1977)](../../../images/centrality_visual.png) ##### Betweenness Centrality @@ -416,7 +416,7 @@ A common definitions of centrality is the **closeness centrality** length of the shortest path between the vertex and all other vertices. For vertices *x*, *y* and shortest distance `d(y, x)` it is defined as: -![Vertex Closeness Formula](../../images/closeness.png) +![Vertex Closeness Formula](../../../images/closeness.png) Effective Closeness approximates the closeness measure. The algorithm works by iteratively estimating the number of shortest paths passing through each vertex. @@ -452,7 +452,7 @@ Another common measure is the [*betweenness* centrality](https://en.wikipedia.or It measures the number of times a vertex is part of shortest paths between any pairs of vertices. For a vertex *v* betweenness is defined as: -![Vertex Betweenness Formula](../../images/betweenness.png) +![Vertex Betweenness Formula](../../../images/betweenness.png) Where the σ represents the number of shortest paths between *x* and *y*, and σ(v) represents the number of paths also passing through a vertex *v*. diff --git a/site/content/3.11/data-science/llm-knowledge-graphs.md b/site/content/arangodb/3.11/data-science/llm-knowledge-graphs.md similarity index 97% rename from site/content/3.11/data-science/llm-knowledge-graphs.md rename to site/content/arangodb/3.11/data-science/llm-knowledge-graphs.md index aa5c11bc84..7cd2e3a447 100644 --- a/site/content/3.11/data-science/llm-knowledge-graphs.md +++ b/site/content/arangodb/3.11/data-science/llm-knowledge-graphs.md @@ -46,7 +46,7 @@ the following tasks: - End-to-end knowledge graph construction - (Text) Embeddings -![ArangoDB Knowledge Graphs and LLMs](../../images/ArangoDB-knowledge-graphs-meets-llms.png) +![ArangoDB Knowledge Graphs and LLMs](../../../images/ArangoDB-knowledge-graphs-meets-llms.png) ## ArangoDB and LangChain diff --git a/site/content/3.11/data-science/pregel/_index.md b/site/content/arangodb/3.11/data-science/pregel/_index.md similarity index 100% rename from site/content/3.11/data-science/pregel/_index.md rename to site/content/arangodb/3.11/data-science/pregel/_index.md diff --git a/site/content/3.11/data-science/pregel/algorithms.md b/site/content/arangodb/3.11/data-science/pregel/algorithms.md similarity index 98% rename from site/content/3.11/data-science/pregel/algorithms.md rename to site/content/arangodb/3.11/data-science/pregel/algorithms.md index b596d7669b..3b17aecc8b 100644 --- a/site/content/3.11/data-science/pregel/algorithms.md +++ b/site/content/arangodb/3.11/data-science/pregel/algorithms.md @@ -215,7 +215,7 @@ It is probably impossible to discover an efficient algorithm which computes them in a distributed way. Fortunately there are scalable substitutions available, which should be equally usable for most use cases. -![Illustration of an execution of different centrality measures (Freeman 1977)](../../../images/centrality_visual.png) +![Illustration of an execution of different centrality measures (Freeman 1977)](../../../../images/centrality_visual.png) #### Effective Closeness @@ -224,7 +224,7 @@ A common definitions of centrality is the **closeness centrality** length of the shortest path between the vertex and all other vertices. For vertices *x*, *y* and shortest distance `d(y, x)` it is defined as: -![Vertex Closeness Formula](../../../images/closeness.png) +![Vertex Closeness Formula](../../../../images/closeness.png) Effective Closeness approximates the closeness measure. The algorithm works by iteratively estimating the number of shortest paths passing through each vertex. @@ -252,7 +252,7 @@ Another common measure is the [*betweenness* centrality](https://en.wikipedia.or It measures the number of times a vertex is part of shortest paths between any pairs of vertices. For a vertex *v* betweenness is defined as: -![Vertex Betweenness Formula](../../../images/betweenness.png) +![Vertex Betweenness Formula](../../../../images/betweenness.png) Where the σ represents the number of shortest paths between *x* and *y*, and σ(v) represents the number of paths also passing through a vertex *v*. diff --git a/site/content/3.11/deploy/_index.md b/site/content/arangodb/3.11/deploy/_index.md similarity index 97% rename from site/content/3.11/deploy/_index.md rename to site/content/arangodb/3.11/deploy/_index.md index be8b6e30f4..d23d40ddf1 100644 --- a/site/content/3.11/deploy/_index.md +++ b/site/content/arangodb/3.11/deploy/_index.md @@ -78,7 +78,7 @@ There are different ways to set up and operate ArangoDB. ArangoDB Kubernetes Operator (`kube-arangodb`). The fastest way to get ArangoDB up and running is to run it in the cloud - the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) offers a fully managed cloud service, available on AWS and GCP. ### Manual Deployment @@ -136,7 +136,7 @@ If you want a specific version, download the precompiled executable via the ### Run in the cloud - [AWS and Azure](in-the-cloud.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS and GCP ### Run in Kubernetes diff --git a/site/content/3.11/deploy/active-failover/_index.md b/site/content/arangodb/3.11/deploy/active-failover/_index.md similarity index 99% rename from site/content/3.11/deploy/active-failover/_index.md rename to site/content/arangodb/3.11/deploy/active-failover/_index.md index 21bd1e1bba..223002c10f 100644 --- a/site/content/3.11/deploy/active-failover/_index.md +++ b/site/content/arangodb/3.11/deploy/active-failover/_index.md @@ -22,7 +22,7 @@ The Active Failover deployment mode is deprecated and will no longer be supported in the next minor version of ArangoDB, from v3.12 onward. {{< /warning >}} -![ArangoDB Active Failover](../../../images/leader-follower.png) +![ArangoDB Active Failover](../../../../images/leader-follower.png) The advantage of the _Active Failover_ setup is that there is an active third party, the _Agency_, which observes and supervises all involved server processes. diff --git a/site/content/3.11/deploy/active-failover/administration.md b/site/content/arangodb/3.11/deploy/active-failover/administration.md similarity index 100% rename from site/content/3.11/deploy/active-failover/administration.md rename to site/content/arangodb/3.11/deploy/active-failover/administration.md diff --git a/site/content/3.11/deploy/active-failover/manual-start.md b/site/content/arangodb/3.11/deploy/active-failover/manual-start.md similarity index 100% rename from site/content/3.11/deploy/active-failover/manual-start.md rename to site/content/arangodb/3.11/deploy/active-failover/manual-start.md diff --git a/site/content/3.11/deploy/active-failover/using-the-arangodb-starter.md b/site/content/arangodb/3.11/deploy/active-failover/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.11/deploy/active-failover/using-the-arangodb-starter.md rename to site/content/arangodb/3.11/deploy/active-failover/using-the-arangodb-starter.md diff --git a/site/content/3.11/deploy/arangosync/_index.md b/site/content/arangodb/3.11/deploy/arangosync/_index.md similarity index 99% rename from site/content/3.11/deploy/arangosync/_index.md rename to site/content/arangodb/3.11/deploy/arangosync/_index.md index b660c58918..84e98d03fd 100644 --- a/site/content/3.11/deploy/arangosync/_index.md +++ b/site/content/arangodb/3.11/deploy/arangosync/_index.md @@ -27,7 +27,7 @@ in one place to a Cluster in another place. Typically it is used from one datace to another. It is possible to replicate to multiple other datacenters as well. It is not a solution for replicating single server instances. -![ArangoDB DC2DC](../../../images/dc2dc_topology.png) +![ArangoDB DC2DC](../../../../images/dc2dc_topology.png) The replication done by _ArangoSync_ is **asynchronous**. That means that when a client is writing data into the source datacenter, it will consider the diff --git a/site/content/3.11/deploy/arangosync/administration.md b/site/content/arangodb/3.11/deploy/arangosync/administration.md similarity index 100% rename from site/content/3.11/deploy/arangosync/administration.md rename to site/content/arangodb/3.11/deploy/arangosync/administration.md diff --git a/site/content/3.11/deploy/arangosync/deployment/_index.md b/site/content/arangodb/3.11/deploy/arangosync/deployment/_index.md similarity index 100% rename from site/content/3.11/deploy/arangosync/deployment/_index.md rename to site/content/arangodb/3.11/deploy/arangosync/deployment/_index.md diff --git a/site/content/3.11/deploy/arangosync/deployment/arangodb-cluster.md b/site/content/arangodb/3.11/deploy/arangosync/deployment/arangodb-cluster.md similarity index 100% rename from site/content/3.11/deploy/arangosync/deployment/arangodb-cluster.md rename to site/content/arangodb/3.11/deploy/arangosync/deployment/arangodb-cluster.md diff --git a/site/content/3.11/deploy/arangosync/deployment/arangosync-master.md b/site/content/arangodb/3.11/deploy/arangosync/deployment/arangosync-master.md similarity index 100% rename from site/content/3.11/deploy/arangosync/deployment/arangosync-master.md rename to site/content/arangodb/3.11/deploy/arangosync/deployment/arangosync-master.md diff --git a/site/content/3.11/deploy/arangosync/deployment/arangosync-workers.md b/site/content/arangodb/3.11/deploy/arangosync/deployment/arangosync-workers.md similarity index 100% rename from site/content/3.11/deploy/arangosync/deployment/arangosync-workers.md rename to site/content/arangodb/3.11/deploy/arangosync/deployment/arangosync-workers.md diff --git a/site/content/3.11/deploy/arangosync/deployment/prometheus-and-grafana.md b/site/content/arangodb/3.11/deploy/arangosync/deployment/prometheus-and-grafana.md similarity index 100% rename from site/content/3.11/deploy/arangosync/deployment/prometheus-and-grafana.md rename to site/content/arangodb/3.11/deploy/arangosync/deployment/prometheus-and-grafana.md diff --git a/site/content/3.11/deploy/arangosync/monitoring.md b/site/content/arangodb/3.11/deploy/arangosync/monitoring.md similarity index 100% rename from site/content/3.11/deploy/arangosync/monitoring.md rename to site/content/arangodb/3.11/deploy/arangosync/monitoring.md diff --git a/site/content/3.11/deploy/arangosync/operations-and-maintenance.md b/site/content/arangodb/3.11/deploy/arangosync/operations-and-maintenance.md similarity index 100% rename from site/content/3.11/deploy/arangosync/operations-and-maintenance.md rename to site/content/arangodb/3.11/deploy/arangosync/operations-and-maintenance.md diff --git a/site/content/3.11/deploy/arangosync/security.md b/site/content/arangodb/3.11/deploy/arangosync/security.md similarity index 100% rename from site/content/3.11/deploy/arangosync/security.md rename to site/content/arangodb/3.11/deploy/arangosync/security.md diff --git a/site/content/3.11/deploy/arangosync/troubleshooting.md b/site/content/arangodb/3.11/deploy/arangosync/troubleshooting.md similarity index 100% rename from site/content/3.11/deploy/arangosync/troubleshooting.md rename to site/content/arangodb/3.11/deploy/arangosync/troubleshooting.md diff --git a/site/content/3.11/deploy/architecture/_index.md b/site/content/arangodb/3.11/deploy/architecture/_index.md similarity index 100% rename from site/content/3.11/deploy/architecture/_index.md rename to site/content/arangodb/3.11/deploy/architecture/_index.md diff --git a/site/content/3.11/deploy/architecture/data-sharding.md b/site/content/arangodb/3.11/deploy/architecture/data-sharding.md similarity index 98% rename from site/content/3.11/deploy/architecture/data-sharding.md rename to site/content/arangodb/3.11/deploy/architecture/data-sharding.md index d495f38981..6139b13938 100644 --- a/site/content/3.11/deploy/architecture/data-sharding.md +++ b/site/content/arangodb/3.11/deploy/architecture/data-sharding.md @@ -44,7 +44,7 @@ cost-effective than pre-provisioning a single large machine. Increased complexity in infrastructure can be managed using modern containerization and cluster orchestrations tools like [Kubernetes](../kubernetes.md). -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) To achieve this ArangoDB splits your dataset into so called _shards_. The number of shards is something you may choose according to your needs. Proper sharding @@ -84,7 +84,7 @@ a given document is to be stored. Choosing the right shard key can have significant impact on your performance can reduce network traffic and increase performance. -![Hash Sharding](../../../images/cluster_sharding_hash.jpg) +![Hash Sharding](../../../../images/cluster_sharding_hash.jpg) ArangoDB uses consistent hashing to compute the target shard from the given values (as specified via by the `shardKeys` collection property). The ideal set diff --git a/site/content/3.11/deploy/architecture/replication.md b/site/content/arangodb/3.11/deploy/architecture/replication.md similarity index 100% rename from site/content/3.11/deploy/architecture/replication.md rename to site/content/arangodb/3.11/deploy/architecture/replication.md diff --git a/site/content/3.11/deploy/architecture/scalability.md b/site/content/arangodb/3.11/deploy/architecture/scalability.md similarity index 100% rename from site/content/3.11/deploy/architecture/scalability.md rename to site/content/arangodb/3.11/deploy/architecture/scalability.md diff --git a/site/content/3.11/deploy/cluster/_index.md b/site/content/arangodb/3.11/deploy/cluster/_index.md similarity index 98% rename from site/content/3.11/deploy/cluster/_index.md rename to site/content/arangodb/3.11/deploy/cluster/_index.md index 4d10cec023..60b256783a 100644 --- a/site/content/3.11/deploy/cluster/_index.md +++ b/site/content/arangodb/3.11/deploy/cluster/_index.md @@ -39,7 +39,7 @@ roles: - _Coordinators_ - _DB-Servers_. -![ArangoDB Cluster](../../../images/cluster-topology.png) +![ArangoDB Cluster](../../../../images/cluster-topology.png) ### Agents @@ -142,7 +142,7 @@ automatically to the different servers. In many situations one can also reap a benefit in data throughput, again because the load can be distributed to multiple machines. -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) From the outside this process is fully transparent: An application may talk to any _Coordinator_ and @@ -385,7 +385,7 @@ See the [Cluster Deployment](deployment/_index.md) chapter for instructions. ArangoDB is also available as a cloud service, the -[**ArangoGraph Insights Platform**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[**Arango Managed Platform (AMP)**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). ## Cluster ID diff --git a/site/content/3.11/deploy/cluster/administration.md b/site/content/arangodb/3.11/deploy/cluster/administration.md similarity index 100% rename from site/content/3.11/deploy/cluster/administration.md rename to site/content/arangodb/3.11/deploy/cluster/administration.md diff --git a/site/content/3.11/deploy/cluster/deployment/_index.md b/site/content/arangodb/3.11/deploy/cluster/deployment/_index.md similarity index 97% rename from site/content/3.11/deploy/cluster/deployment/_index.md rename to site/content/arangodb/3.11/deploy/cluster/deployment/_index.md index 102d40bed3..5d6d6232f2 100644 --- a/site/content/3.11/deploy/cluster/deployment/_index.md +++ b/site/content/arangodb/3.11/deploy/cluster/deployment/_index.md @@ -9,7 +9,7 @@ You can deploy an ArangoDB cluster in different ways: - [Using the ArangoDB Starter](using-the-arangodb-starter.md) - [Manual Start](manual-start.md) - [Kubernetes](../../kubernetes.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS and GCP ## Preliminary Information For Debian/Ubuntu Systems diff --git a/site/content/3.11/deploy/cluster/deployment/manual-start.md b/site/content/arangodb/3.11/deploy/cluster/deployment/manual-start.md similarity index 100% rename from site/content/3.11/deploy/cluster/deployment/manual-start.md rename to site/content/arangodb/3.11/deploy/cluster/deployment/manual-start.md diff --git a/site/content/3.11/deploy/cluster/deployment/using-the-arangodb-starter.md b/site/content/arangodb/3.11/deploy/cluster/deployment/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.11/deploy/cluster/deployment/using-the-arangodb-starter.md rename to site/content/arangodb/3.11/deploy/cluster/deployment/using-the-arangodb-starter.md diff --git a/site/content/3.11/deploy/cluster/limitations.md b/site/content/arangodb/3.11/deploy/cluster/limitations.md similarity index 100% rename from site/content/3.11/deploy/cluster/limitations.md rename to site/content/arangodb/3.11/deploy/cluster/limitations.md diff --git a/site/content/3.11/deploy/in-the-cloud.md b/site/content/arangodb/3.11/deploy/in-the-cloud.md similarity index 100% rename from site/content/3.11/deploy/in-the-cloud.md rename to site/content/arangodb/3.11/deploy/in-the-cloud.md diff --git a/site/content/3.11/deploy/kubernetes.md b/site/content/arangodb/3.11/deploy/kubernetes.md similarity index 100% rename from site/content/3.11/deploy/kubernetes.md rename to site/content/arangodb/3.11/deploy/kubernetes.md diff --git a/site/content/3.10/deploy/oneshard.md b/site/content/arangodb/3.11/deploy/oneshard.md similarity index 99% rename from site/content/3.10/deploy/oneshard.md rename to site/content/arangodb/3.11/deploy/oneshard.md index cd4eed572b..8a35123968 100644 --- a/site/content/3.10/deploy/oneshard.md +++ b/site/content/arangodb/3.11/deploy/oneshard.md @@ -49,7 +49,7 @@ because they need to send and receive data on several connections, build up results for collection accesses from the received parts followed by further processing. -![OneShard vs. Sharded Cluster Setup](../../images/cluster-sharded-oneshard.png) +![OneShard vs. Sharded Cluster Setup](../../../../images/cluster-sharded-oneshard.png) If the database involved in a query is a OneShard database, then the OneShard optimization can be applied to run the query on the diff --git a/site/content/3.11/deploy/production-checklist.md b/site/content/arangodb/3.11/deploy/production-checklist.md similarity index 100% rename from site/content/3.11/deploy/production-checklist.md rename to site/content/arangodb/3.11/deploy/production-checklist.md diff --git a/site/content/3.11/deploy/single-instance-vs-cluster.md b/site/content/arangodb/3.11/deploy/single-instance-vs-cluster.md similarity index 100% rename from site/content/3.11/deploy/single-instance-vs-cluster.md rename to site/content/arangodb/3.11/deploy/single-instance-vs-cluster.md diff --git a/site/content/3.11/deploy/single-instance/_index.md b/site/content/arangodb/3.11/deploy/single-instance/_index.md similarity index 100% rename from site/content/3.11/deploy/single-instance/_index.md rename to site/content/arangodb/3.11/deploy/single-instance/_index.md diff --git a/site/content/3.11/deploy/single-instance/manual-start.md b/site/content/arangodb/3.11/deploy/single-instance/manual-start.md similarity index 100% rename from site/content/3.11/deploy/single-instance/manual-start.md rename to site/content/arangodb/3.11/deploy/single-instance/manual-start.md diff --git a/site/content/3.11/deploy/single-instance/using-the-arangodb-starter.md b/site/content/arangodb/3.11/deploy/single-instance/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.11/deploy/single-instance/using-the-arangodb-starter.md rename to site/content/arangodb/3.11/deploy/single-instance/using-the-arangodb-starter.md diff --git a/site/content/3.11/develop/_index.md b/site/content/arangodb/3.11/develop/_index.md similarity index 100% rename from site/content/3.11/develop/_index.md rename to site/content/arangodb/3.11/develop/_index.md diff --git a/site/content/3.11/develop/drivers/_index.md b/site/content/arangodb/3.11/develop/drivers/_index.md similarity index 100% rename from site/content/3.11/develop/drivers/_index.md rename to site/content/arangodb/3.11/develop/drivers/_index.md diff --git a/site/content/3.11/develop/drivers/go.md b/site/content/arangodb/3.11/develop/drivers/go.md similarity index 100% rename from site/content/3.11/develop/drivers/go.md rename to site/content/arangodb/3.11/develop/drivers/go.md diff --git a/site/content/3.11/develop/drivers/java/_index.md b/site/content/arangodb/3.11/develop/drivers/java/_index.md similarity index 100% rename from site/content/3.11/develop/drivers/java/_index.md rename to site/content/arangodb/3.11/develop/drivers/java/_index.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-6/_index.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-6/_index.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-6/_index.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-6/_index.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-6/driver-setup.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-6/driver-setup.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-6/driver-setup.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-6/driver-setup.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-6/serialization.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-6/serialization.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-6/serialization.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-6/serialization.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-7/_index.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-7/_index.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-7/_index.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-7/_index.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-7/changes-in-version-7.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-7/changes-in-version-7.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-7/changes-in-version-7.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-7/changes-in-version-7.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-7/driver-setup.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-7/driver-setup.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-7/driver-setup.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-7/driver-setup.md diff --git a/site/content/3.11/develop/drivers/java/reference-version-7/serialization.md b/site/content/arangodb/3.11/develop/drivers/java/reference-version-7/serialization.md similarity index 100% rename from site/content/3.11/develop/drivers/java/reference-version-7/serialization.md rename to site/content/arangodb/3.11/develop/drivers/java/reference-version-7/serialization.md diff --git a/site/content/3.11/develop/drivers/javascript.md b/site/content/arangodb/3.11/develop/drivers/javascript.md similarity index 100% rename from site/content/3.11/develop/drivers/javascript.md rename to site/content/arangodb/3.11/develop/drivers/javascript.md diff --git a/site/content/3.11/develop/drivers/python.md b/site/content/arangodb/3.11/develop/drivers/python.md similarity index 100% rename from site/content/3.11/develop/drivers/python.md rename to site/content/arangodb/3.11/develop/drivers/python.md diff --git a/site/content/3.11/develop/error-codes.md b/site/content/arangodb/3.11/develop/error-codes.md similarity index 100% rename from site/content/3.11/develop/error-codes.md rename to site/content/arangodb/3.11/develop/error-codes.md diff --git a/site/content/3.11/develop/exit-codes.md b/site/content/arangodb/3.11/develop/exit-codes.md similarity index 100% rename from site/content/3.11/develop/exit-codes.md rename to site/content/arangodb/3.11/develop/exit-codes.md diff --git a/site/content/3.11/develop/foxx-microservices/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/deployment.md b/site/content/arangodb/3.11/develop/foxx-microservices/deployment.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/deployment.md rename to site/content/arangodb/3.11/develop/foxx-microservices/deployment.md diff --git a/site/content/3.11/develop/foxx-microservices/getting-started.md b/site/content/arangodb/3.11/develop/foxx-microservices/getting-started.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/getting-started.md rename to site/content/arangodb/3.11/develop/foxx-microservices/getting-started.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/access-from-the-browser.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/access-from-the-browser.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/access-from-the-browser.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/access-from-the-browser.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/development-mode.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/development-mode.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/development-mode.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/development-mode.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/foxx-in-a-cluster.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/foxx-in-a-cluster.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/foxx-in-a-cluster.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/foxx-in-a-cluster.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/linking-services-together.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/linking-services-together.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/linking-services-together.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/linking-services-together.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/making-requests.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/making-requests.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/making-requests.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/making-requests.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/scripts-and-scheduling.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/scripts-and-scheduling.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/scripts-and-scheduling.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/scripts-and-scheduling.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/testing-foxx-services.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/testing-foxx-services.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/testing-foxx-services.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/testing-foxx-services.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/using-node-modules.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/using-node-modules.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/using-node-modules.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/using-node-modules.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/using-webpack-with-foxx.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/using-webpack-with-foxx.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/using-webpack-with-foxx.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/using-webpack-with-foxx.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/working-with-collections.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/working-with-collections.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/working-with-collections.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/working-with-collections.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/working-with-files.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/working-with-files.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/working-with-files.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/working-with-files.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/working-with-routers.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/working-with-routers.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/working-with-routers.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/working-with-routers.md diff --git a/site/content/3.11/develop/foxx-microservices/guides/writing-queries.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/writing-queries.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/guides/writing-queries.md rename to site/content/arangodb/3.11/develop/foxx-microservices/guides/writing-queries.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/configuration.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/configuration.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/configuration.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/configuration.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/related-modules/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/related-modules/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/related-modules/authentication.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/authentication.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/related-modules/authentication.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/authentication.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/related-modules/graphql.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/graphql.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/related-modules/graphql.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/graphql.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/related-modules/oauth-2-0.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/oauth-2-0.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/related-modules/oauth-2-0.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/oauth-2-0.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/related-modules/queues.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/queues.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/related-modules/queues.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/related-modules/queues.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/routers/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/routers/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/routers/endpoints.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/endpoints.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/routers/endpoints.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/endpoints.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/routers/middleware.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/middleware.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/routers/middleware.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/middleware.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/routers/request.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/request.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/routers/request.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/request.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/routers/response.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/response.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/routers/response.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/routers/response.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/service-context.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/service-context.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/service-context.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/service-context.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/service-manifest.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/service-manifest.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/service-manifest.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/service-manifest.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md diff --git a/site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md b/site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md similarity index 100% rename from site/content/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md rename to site/content/arangodb/3.11/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md diff --git a/site/content/3.11/develop/http-api/_index.md b/site/content/arangodb/3.11/develop/http-api/_index.md similarity index 98% rename from site/content/3.11/develop/http-api/_index.md rename to site/content/arangodb/3.11/develop/http-api/_index.md index 3068e60f26..4e14d398c3 100644 --- a/site/content/3.11/develop/http-api/_index.md +++ b/site/content/arangodb/3.11/develop/http-api/_index.md @@ -105,7 +105,7 @@ You can explore the API with the interactive **Swagger UI** using the 2. Click the **Rest API** tab. 3. Click a section and endpoint to view the description and parameters. -![The web interface with the navigation on the left and the tabs at the top](../../../images/swagger_serverapi_overview.png) +![The web interface with the navigation on the left and the tabs at the top](../../../../images/swagger_serverapi_overview.png) Also see this blog post: [Using the ArangoDB Swagger.io Interactive API Documentation](https://www.arangodb.com/2018/03/using-arangodb-swaggerio-interactive-api-documentation/). diff --git a/site/content/3.11/develop/http-api/administration.md b/site/content/arangodb/3.11/develop/http-api/administration.md similarity index 100% rename from site/content/3.11/develop/http-api/administration.md rename to site/content/arangodb/3.11/develop/http-api/administration.md diff --git a/site/content/3.11/develop/http-api/analyzers.md b/site/content/arangodb/3.11/develop/http-api/analyzers.md similarity index 100% rename from site/content/3.11/develop/http-api/analyzers.md rename to site/content/arangodb/3.11/develop/http-api/analyzers.md diff --git a/site/content/3.11/develop/http-api/authentication.md b/site/content/arangodb/3.11/develop/http-api/authentication.md similarity index 100% rename from site/content/3.11/develop/http-api/authentication.md rename to site/content/arangodb/3.11/develop/http-api/authentication.md diff --git a/site/content/3.11/develop/http-api/batch-requests.md b/site/content/arangodb/3.11/develop/http-api/batch-requests.md similarity index 100% rename from site/content/3.11/develop/http-api/batch-requests.md rename to site/content/arangodb/3.11/develop/http-api/batch-requests.md diff --git a/site/content/3.11/develop/http-api/cluster.md b/site/content/arangodb/3.11/develop/http-api/cluster.md similarity index 100% rename from site/content/3.11/develop/http-api/cluster.md rename to site/content/arangodb/3.11/develop/http-api/cluster.md diff --git a/site/content/3.11/develop/http-api/collections.md b/site/content/arangodb/3.11/develop/http-api/collections.md similarity index 100% rename from site/content/3.11/develop/http-api/collections.md rename to site/content/arangodb/3.11/develop/http-api/collections.md diff --git a/site/content/3.11/develop/http-api/databases.md b/site/content/arangodb/3.11/develop/http-api/databases.md similarity index 100% rename from site/content/3.11/develop/http-api/databases.md rename to site/content/arangodb/3.11/develop/http-api/databases.md diff --git a/site/content/3.11/develop/http-api/documents.md b/site/content/arangodb/3.11/develop/http-api/documents.md similarity index 100% rename from site/content/3.11/develop/http-api/documents.md rename to site/content/arangodb/3.11/develop/http-api/documents.md diff --git a/site/content/3.11/develop/http-api/foxx.md b/site/content/arangodb/3.11/develop/http-api/foxx.md similarity index 100% rename from site/content/3.11/develop/http-api/foxx.md rename to site/content/arangodb/3.11/develop/http-api/foxx.md diff --git a/site/content/3.11/develop/http-api/general-request-handling.md b/site/content/arangodb/3.11/develop/http-api/general-request-handling.md similarity index 100% rename from site/content/3.11/develop/http-api/general-request-handling.md rename to site/content/arangodb/3.11/develop/http-api/general-request-handling.md diff --git a/site/content/3.11/develop/http-api/graphs/_index.md b/site/content/arangodb/3.11/develop/http-api/graphs/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/graphs/_index.md rename to site/content/arangodb/3.11/develop/http-api/graphs/_index.md diff --git a/site/content/3.11/develop/http-api/graphs/edges.md b/site/content/arangodb/3.11/develop/http-api/graphs/edges.md similarity index 100% rename from site/content/3.11/develop/http-api/graphs/edges.md rename to site/content/arangodb/3.11/develop/http-api/graphs/edges.md diff --git a/site/content/3.11/develop/http-api/graphs/named-graphs.md b/site/content/arangodb/3.11/develop/http-api/graphs/named-graphs.md similarity index 99% rename from site/content/3.11/develop/http-api/graphs/named-graphs.md rename to site/content/arangodb/3.11/develop/http-api/graphs/named-graphs.md index 39a8fc252c..36e9043faa 100644 --- a/site/content/3.11/develop/http-api/graphs/named-graphs.md +++ b/site/content/arangodb/3.11/develop/http-api/graphs/named-graphs.md @@ -18,11 +18,11 @@ The examples use the following example graphs: [_Social Graph_](../../../graphs/example-graphs.md#social-graph): -![Social Example Graph](../../../../images/social_graph.png) +![Social Example Graph](../../../../../images/social_graph.png) [_Knows Graph_](../../../graphs/example-graphs.md#knows-graph): -![Social Example Graph](../../../../images/knows_graph.png) +![Social Example Graph](../../../../../images/knows_graph.png) ## Management diff --git a/site/content/3.11/develop/http-api/hot-backups.md b/site/content/arangodb/3.11/develop/http-api/hot-backups.md similarity index 100% rename from site/content/3.11/develop/http-api/hot-backups.md rename to site/content/arangodb/3.11/develop/http-api/hot-backups.md diff --git a/site/content/3.11/develop/http-api/import.md b/site/content/arangodb/3.11/develop/http-api/import.md similarity index 100% rename from site/content/3.11/develop/http-api/import.md rename to site/content/arangodb/3.11/develop/http-api/import.md diff --git a/site/content/3.11/develop/http-api/indexes/_index.md b/site/content/arangodb/3.11/develop/http-api/indexes/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/_index.md rename to site/content/arangodb/3.11/develop/http-api/indexes/_index.md diff --git a/site/content/3.11/develop/http-api/indexes/fulltext.md b/site/content/arangodb/3.11/develop/http-api/indexes/fulltext.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/fulltext.md rename to site/content/arangodb/3.11/develop/http-api/indexes/fulltext.md diff --git a/site/content/3.11/develop/http-api/indexes/geo-spatial.md b/site/content/arangodb/3.11/develop/http-api/indexes/geo-spatial.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/geo-spatial.md rename to site/content/arangodb/3.11/develop/http-api/indexes/geo-spatial.md diff --git a/site/content/3.11/develop/http-api/indexes/inverted.md b/site/content/arangodb/3.11/develop/http-api/indexes/inverted.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/inverted.md rename to site/content/arangodb/3.11/develop/http-api/indexes/inverted.md diff --git a/site/content/3.11/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/3.11/develop/http-api/indexes/multi-dimensional.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/multi-dimensional.md rename to site/content/arangodb/3.11/develop/http-api/indexes/multi-dimensional.md diff --git a/site/content/3.11/develop/http-api/indexes/persistent.md b/site/content/arangodb/3.11/develop/http-api/indexes/persistent.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/persistent.md rename to site/content/arangodb/3.11/develop/http-api/indexes/persistent.md diff --git a/site/content/3.11/develop/http-api/indexes/ttl.md b/site/content/arangodb/3.11/develop/http-api/indexes/ttl.md similarity index 100% rename from site/content/3.11/develop/http-api/indexes/ttl.md rename to site/content/arangodb/3.11/develop/http-api/indexes/ttl.md diff --git a/site/content/3.11/develop/http-api/jobs.md b/site/content/arangodb/3.11/develop/http-api/jobs.md similarity index 100% rename from site/content/3.11/develop/http-api/jobs.md rename to site/content/arangodb/3.11/develop/http-api/jobs.md diff --git a/site/content/3.11/develop/http-api/monitoring/_index.md b/site/content/arangodb/3.11/develop/http-api/monitoring/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/monitoring/_index.md rename to site/content/arangodb/3.11/develop/http-api/monitoring/_index.md diff --git a/site/content/3.11/develop/http-api/monitoring/logs.md b/site/content/arangodb/3.11/develop/http-api/monitoring/logs.md similarity index 100% rename from site/content/3.11/develop/http-api/monitoring/logs.md rename to site/content/arangodb/3.11/develop/http-api/monitoring/logs.md diff --git a/site/content/3.11/develop/http-api/monitoring/metrics.md b/site/content/arangodb/3.11/develop/http-api/monitoring/metrics.md similarity index 100% rename from site/content/3.11/develop/http-api/monitoring/metrics.md rename to site/content/arangodb/3.11/develop/http-api/monitoring/metrics.md diff --git a/site/content/3.11/develop/http-api/monitoring/statistics.md b/site/content/arangodb/3.11/develop/http-api/monitoring/statistics.md similarity index 100% rename from site/content/3.11/develop/http-api/monitoring/statistics.md rename to site/content/arangodb/3.11/develop/http-api/monitoring/statistics.md diff --git a/site/content/3.11/develop/http-api/pregel.md b/site/content/arangodb/3.11/develop/http-api/pregel.md similarity index 100% rename from site/content/3.11/develop/http-api/pregel.md rename to site/content/arangodb/3.11/develop/http-api/pregel.md diff --git a/site/content/3.11/develop/http-api/queries/_index.md b/site/content/arangodb/3.11/develop/http-api/queries/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/queries/_index.md rename to site/content/arangodb/3.11/develop/http-api/queries/_index.md diff --git a/site/content/3.11/develop/http-api/queries/aql-queries.md b/site/content/arangodb/3.11/develop/http-api/queries/aql-queries.md similarity index 100% rename from site/content/3.11/develop/http-api/queries/aql-queries.md rename to site/content/arangodb/3.11/develop/http-api/queries/aql-queries.md diff --git a/site/content/3.11/develop/http-api/queries/aql-query-results-cache.md b/site/content/arangodb/3.11/develop/http-api/queries/aql-query-results-cache.md similarity index 100% rename from site/content/3.11/develop/http-api/queries/aql-query-results-cache.md rename to site/content/arangodb/3.11/develop/http-api/queries/aql-query-results-cache.md diff --git a/site/content/3.11/develop/http-api/queries/user-defined-aql-functions.md b/site/content/arangodb/3.11/develop/http-api/queries/user-defined-aql-functions.md similarity index 100% rename from site/content/3.11/develop/http-api/queries/user-defined-aql-functions.md rename to site/content/arangodb/3.11/develop/http-api/queries/user-defined-aql-functions.md diff --git a/site/content/3.11/develop/http-api/replication/_index.md b/site/content/arangodb/3.11/develop/http-api/replication/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/replication/_index.md rename to site/content/arangodb/3.11/develop/http-api/replication/_index.md diff --git a/site/content/3.11/develop/http-api/replication/other-replication-commands.md b/site/content/arangodb/3.11/develop/http-api/replication/other-replication-commands.md similarity index 100% rename from site/content/3.11/develop/http-api/replication/other-replication-commands.md rename to site/content/arangodb/3.11/develop/http-api/replication/other-replication-commands.md diff --git a/site/content/3.11/develop/http-api/replication/replication-applier.md b/site/content/arangodb/3.11/develop/http-api/replication/replication-applier.md similarity index 100% rename from site/content/3.11/develop/http-api/replication/replication-applier.md rename to site/content/arangodb/3.11/develop/http-api/replication/replication-applier.md diff --git a/site/content/3.11/develop/http-api/replication/replication-dump.md b/site/content/arangodb/3.11/develop/http-api/replication/replication-dump.md similarity index 100% rename from site/content/3.11/develop/http-api/replication/replication-dump.md rename to site/content/arangodb/3.11/develop/http-api/replication/replication-dump.md diff --git a/site/content/3.11/develop/http-api/replication/replication-logger.md b/site/content/arangodb/3.11/develop/http-api/replication/replication-logger.md similarity index 100% rename from site/content/3.11/develop/http-api/replication/replication-logger.md rename to site/content/arangodb/3.11/develop/http-api/replication/replication-logger.md diff --git a/site/content/3.11/develop/http-api/replication/write-ahead-log.md b/site/content/arangodb/3.11/develop/http-api/replication/write-ahead-log.md similarity index 100% rename from site/content/3.11/develop/http-api/replication/write-ahead-log.md rename to site/content/arangodb/3.11/develop/http-api/replication/write-ahead-log.md diff --git a/site/content/3.11/develop/http-api/security.md b/site/content/arangodb/3.11/develop/http-api/security.md similarity index 100% rename from site/content/3.11/develop/http-api/security.md rename to site/content/arangodb/3.11/develop/http-api/security.md diff --git a/site/content/3.11/develop/http-api/tasks.md b/site/content/arangodb/3.11/develop/http-api/tasks.md similarity index 100% rename from site/content/3.11/develop/http-api/tasks.md rename to site/content/arangodb/3.11/develop/http-api/tasks.md diff --git a/site/content/3.11/develop/http-api/transactions/_index.md b/site/content/arangodb/3.11/develop/http-api/transactions/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/transactions/_index.md rename to site/content/arangodb/3.11/develop/http-api/transactions/_index.md diff --git a/site/content/3.11/develop/http-api/transactions/javascript-transactions.md b/site/content/arangodb/3.11/develop/http-api/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.11/develop/http-api/transactions/javascript-transactions.md rename to site/content/arangodb/3.11/develop/http-api/transactions/javascript-transactions.md diff --git a/site/content/3.11/develop/http-api/transactions/stream-transactions.md b/site/content/arangodb/3.11/develop/http-api/transactions/stream-transactions.md similarity index 100% rename from site/content/3.11/develop/http-api/transactions/stream-transactions.md rename to site/content/arangodb/3.11/develop/http-api/transactions/stream-transactions.md diff --git a/site/content/3.11/develop/http-api/users.md b/site/content/arangodb/3.11/develop/http-api/users.md similarity index 100% rename from site/content/3.11/develop/http-api/users.md rename to site/content/arangodb/3.11/develop/http-api/users.md diff --git a/site/content/3.11/develop/http-api/views/_index.md b/site/content/arangodb/3.11/develop/http-api/views/_index.md similarity index 100% rename from site/content/3.11/develop/http-api/views/_index.md rename to site/content/arangodb/3.11/develop/http-api/views/_index.md diff --git a/site/content/3.11/develop/http-api/views/arangosearch-views.md b/site/content/arangodb/3.11/develop/http-api/views/arangosearch-views.md similarity index 100% rename from site/content/3.11/develop/http-api/views/arangosearch-views.md rename to site/content/arangodb/3.11/develop/http-api/views/arangosearch-views.md diff --git a/site/content/3.11/develop/http-api/views/search-alias-views.md b/site/content/arangodb/3.11/develop/http-api/views/search-alias-views.md similarity index 100% rename from site/content/3.11/develop/http-api/views/search-alias-views.md rename to site/content/arangodb/3.11/develop/http-api/views/search-alias-views.md diff --git a/site/content/3.11/develop/integrations/_index.md b/site/content/arangodb/3.11/develop/integrations/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/_index.md rename to site/content/arangodb/3.11/develop/integrations/_index.md diff --git a/site/content/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md b/site/content/arangodb/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md similarity index 99% rename from site/content/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md rename to site/content/arangodb/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md index 5428ba08b8..a9f8e991f1 100644 --- a/site/content/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md +++ b/site/content/arangodb/3.11/develop/integrations/arangodb-datasource-for-apache-spark.md @@ -374,7 +374,7 @@ The following Spark SQL data types (subtypes of `org.apache.spark.sql.types.Filt - `MapType` (only with key type `StringType`) - `StructType` -## Connect to the ArangoGraph Insights Platform +## Connect to the Arango Managed Platform (AMP) To connect to SSL secured deployments using X.509 Base64 encoded CA certificate (ArangoGraph): diff --git a/site/content/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md b/site/content/arangodb/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md rename to site/content/arangodb/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md diff --git a/site/content/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md b/site/content/arangodb/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md similarity index 100% rename from site/content/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md rename to site/content/arangodb/3.11/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md diff --git a/site/content/3.11/develop/integrations/spring-boot-arangodb.md b/site/content/arangodb/3.11/develop/integrations/spring-boot-arangodb.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-boot-arangodb.md rename to site/content/arangodb/3.11/develop/integrations/spring-boot-arangodb.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/migration.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/migration.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/migration.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/migration.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/template.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/template.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-3/template.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-3/template.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md diff --git a/site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/template.md b/site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/template.md similarity index 100% rename from site/content/3.11/develop/integrations/spring-data-arangodb/reference-version-4/template.md rename to site/content/arangodb/3.11/develop/integrations/spring-data-arangodb/reference-version-4/template.md diff --git a/site/content/3.11/develop/javascript-api/@arangodb/_index.md b/site/content/arangodb/3.11/develop/javascript-api/@arangodb/_index.md similarity index 100% rename from site/content/3.11/develop/javascript-api/@arangodb/_index.md rename to site/content/arangodb/3.11/develop/javascript-api/@arangodb/_index.md diff --git a/site/content/3.11/develop/javascript-api/@arangodb/collection-object.md b/site/content/arangodb/3.11/develop/javascript-api/@arangodb/collection-object.md similarity index 100% rename from site/content/3.11/develop/javascript-api/@arangodb/collection-object.md rename to site/content/arangodb/3.11/develop/javascript-api/@arangodb/collection-object.md diff --git a/site/content/3.11/develop/javascript-api/@arangodb/cursor-object.md b/site/content/arangodb/3.11/develop/javascript-api/@arangodb/cursor-object.md similarity index 100% rename from site/content/3.11/develop/javascript-api/@arangodb/cursor-object.md rename to site/content/arangodb/3.11/develop/javascript-api/@arangodb/cursor-object.md diff --git a/site/content/3.11/develop/javascript-api/@arangodb/db-object.md b/site/content/arangodb/3.11/develop/javascript-api/@arangodb/db-object.md similarity index 100% rename from site/content/3.11/develop/javascript-api/@arangodb/db-object.md rename to site/content/arangodb/3.11/develop/javascript-api/@arangodb/db-object.md diff --git a/site/content/3.11/develop/javascript-api/@arangodb/view-object.md b/site/content/arangodb/3.11/develop/javascript-api/@arangodb/view-object.md similarity index 100% rename from site/content/3.11/develop/javascript-api/@arangodb/view-object.md rename to site/content/arangodb/3.11/develop/javascript-api/@arangodb/view-object.md diff --git a/site/content/3.11/develop/javascript-api/_index.md b/site/content/arangodb/3.11/develop/javascript-api/_index.md similarity index 100% rename from site/content/3.11/develop/javascript-api/_index.md rename to site/content/arangodb/3.11/develop/javascript-api/_index.md diff --git a/site/content/3.11/develop/javascript-api/actions.md b/site/content/arangodb/3.11/develop/javascript-api/actions.md similarity index 100% rename from site/content/3.11/develop/javascript-api/actions.md rename to site/content/arangodb/3.11/develop/javascript-api/actions.md diff --git a/site/content/3.11/develop/javascript-api/analyzers.md b/site/content/arangodb/3.11/develop/javascript-api/analyzers.md similarity index 100% rename from site/content/3.11/develop/javascript-api/analyzers.md rename to site/content/arangodb/3.11/develop/javascript-api/analyzers.md diff --git a/site/content/3.11/develop/javascript-api/aql-queries.md b/site/content/arangodb/3.11/develop/javascript-api/aql-queries.md similarity index 100% rename from site/content/3.11/develop/javascript-api/aql-queries.md rename to site/content/arangodb/3.11/develop/javascript-api/aql-queries.md diff --git a/site/content/3.11/develop/javascript-api/console.md b/site/content/arangodb/3.11/develop/javascript-api/console.md similarity index 100% rename from site/content/3.11/develop/javascript-api/console.md rename to site/content/arangodb/3.11/develop/javascript-api/console.md diff --git a/site/content/3.11/develop/javascript-api/crypto.md b/site/content/arangodb/3.11/develop/javascript-api/crypto.md similarity index 100% rename from site/content/3.11/develop/javascript-api/crypto.md rename to site/content/arangodb/3.11/develop/javascript-api/crypto.md diff --git a/site/content/3.11/develop/javascript-api/fs.md b/site/content/arangodb/3.11/develop/javascript-api/fs.md similarity index 100% rename from site/content/3.11/develop/javascript-api/fs.md rename to site/content/arangodb/3.11/develop/javascript-api/fs.md diff --git a/site/content/3.11/develop/javascript-api/request.md b/site/content/arangodb/3.11/develop/javascript-api/request.md similarity index 100% rename from site/content/3.11/develop/javascript-api/request.md rename to site/content/arangodb/3.11/develop/javascript-api/request.md diff --git a/site/content/3.11/develop/javascript-api/tasks.md b/site/content/arangodb/3.11/develop/javascript-api/tasks.md similarity index 100% rename from site/content/3.11/develop/javascript-api/tasks.md rename to site/content/arangodb/3.11/develop/javascript-api/tasks.md diff --git a/site/content/3.11/develop/operational-factors.md b/site/content/arangodb/3.11/develop/operational-factors.md similarity index 100% rename from site/content/3.11/develop/operational-factors.md rename to site/content/arangodb/3.11/develop/operational-factors.md diff --git a/site/content/3.11/develop/satellitecollections.md b/site/content/arangodb/3.11/develop/satellitecollections.md similarity index 100% rename from site/content/3.11/develop/satellitecollections.md rename to site/content/arangodb/3.11/develop/satellitecollections.md diff --git a/site/content/3.11/develop/smartjoins.md b/site/content/arangodb/3.11/develop/smartjoins.md similarity index 100% rename from site/content/3.11/develop/smartjoins.md rename to site/content/arangodb/3.11/develop/smartjoins.md diff --git a/site/content/3.11/develop/transactions/_index.md b/site/content/arangodb/3.11/develop/transactions/_index.md similarity index 100% rename from site/content/3.11/develop/transactions/_index.md rename to site/content/arangodb/3.11/develop/transactions/_index.md diff --git a/site/content/3.11/develop/transactions/durability.md b/site/content/arangodb/3.11/develop/transactions/durability.md similarity index 100% rename from site/content/3.11/develop/transactions/durability.md rename to site/content/arangodb/3.11/develop/transactions/durability.md diff --git a/site/content/3.11/develop/transactions/javascript-transactions.md b/site/content/arangodb/3.11/develop/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.11/develop/transactions/javascript-transactions.md rename to site/content/arangodb/3.11/develop/transactions/javascript-transactions.md diff --git a/site/content/3.11/develop/transactions/limitations.md b/site/content/arangodb/3.11/develop/transactions/limitations.md similarity index 100% rename from site/content/3.11/develop/transactions/limitations.md rename to site/content/arangodb/3.11/develop/transactions/limitations.md diff --git a/site/content/3.11/develop/transactions/locking-and-isolation.md b/site/content/arangodb/3.11/develop/transactions/locking-and-isolation.md similarity index 100% rename from site/content/3.11/develop/transactions/locking-and-isolation.md rename to site/content/arangodb/3.11/develop/transactions/locking-and-isolation.md diff --git a/site/content/3.11/develop/transactions/stream-transactions.md b/site/content/arangodb/3.11/develop/transactions/stream-transactions.md similarity index 100% rename from site/content/3.11/develop/transactions/stream-transactions.md rename to site/content/arangodb/3.11/develop/transactions/stream-transactions.md diff --git a/site/content/3.11/get-started/_index.md b/site/content/arangodb/3.11/get-started/_index.md similarity index 100% rename from site/content/3.11/get-started/_index.md rename to site/content/arangodb/3.11/get-started/_index.md diff --git a/site/content/3.11/get-started/how-to-interact-with-arangodb.md b/site/content/arangodb/3.11/get-started/how-to-interact-with-arangodb.md similarity index 100% rename from site/content/3.11/get-started/how-to-interact-with-arangodb.md rename to site/content/arangodb/3.11/get-started/how-to-interact-with-arangodb.md diff --git a/site/content/3.11/get-started/on-premises-installation.md b/site/content/arangodb/3.11/get-started/on-premises-installation.md similarity index 94% rename from site/content/3.11/get-started/on-premises-installation.md rename to site/content/arangodb/3.11/get-started/on-premises-installation.md index 5dda1d48f9..df93e81006 100644 --- a/site/content/3.11/get-started/on-premises-installation.md +++ b/site/content/arangodb/3.11/get-started/on-premises-installation.md @@ -33,16 +33,16 @@ Depending on the installation method used, the installation process either prompted for the root password or the default root password is empty (see [Securing the installation](.#securing-the-installation)). -![Web Interface Login Form](../../images/loginView.png) +![Web Interface Login Form](../../../../images/loginView.png) Next you will be asked which database to use. Every server instance comes with a `_system` database. Select this database to continue. -![select database](../../images/selectDBView.png) +![select database](../../../../images/selectDBView.png) You should then be presented the dashboard with server statistics like this: -![Web Interface Dashboard Request Statistics](../../images/dashboardView.png) +![Web Interface Dashboard Request Statistics](../../../../images/dashboardView.png) For a more detailed description of the interface, see [Web Interface](../components/web-interface/_index.md). --> diff --git a/site/content/3.11/get-started/set-up-a-cloud-instance.md b/site/content/arangodb/3.11/get-started/set-up-a-cloud-instance.md similarity index 71% rename from site/content/3.11/get-started/set-up-a-cloud-instance.md rename to site/content/arangodb/3.11/get-started/set-up-a-cloud-instance.md index 31e2ad4494..c0541b0403 100644 --- a/site/content/3.11/get-started/set-up-a-cloud-instance.md +++ b/site/content/arangodb/3.11/get-started/set-up-a-cloud-instance.md @@ -6,10 +6,10 @@ description: >- This quick start guide covers the basics from creating an ArangoGraph account to setting up and accessing your first ArangoGraph deployment --- -For general information about the ArangoGraph Insights Platform, see +For general information about the Arango Managed Platform (AMP), see [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -For guides and reference documentation, see the [ArangoGraph](../arangograph/_index.md) documentation. +For guides and reference documentation, see the [ArangoGraph](../../../amp/_index.md) documentation. ## Prerequisites @@ -33,7 +33,7 @@ used for multiple accounts. 2. Click the __Start Free__ button or click the __Sign Up__ link in the top right corner. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) + ![ArangoGraph Homepage](../../../images/arangograph-homepage.png) 3. Review the terms & conditions and privacy policy and click __I accept__. 4. Select the type of sign up you would like to use (GitHub, Google, or @@ -42,11 +42,11 @@ used for multiple accounts. - For the email address option, type your desired email address in the email field and type a strong password in the password field. - {{< image src="../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} Click the __Sign up__ button. You will receive a verification email. In that mail, click the __Verify my email address__ link or button. - It opens a page in the ArangoGraph Insights Platform that says __Welcome back!__ + It opens a page in the Arango Managed Platform (AMP) that says __Welcome back!__ 5. Click the __Log in__ button to continue and login. 6. If you signed up with an email address of a public email service provider (e.g. Hotmail), a form appears asking for your mobile phone number. Enter the country code @@ -67,25 +67,25 @@ used for multiple accounts. provider and region. Pick one and click __Create deployment__. You can also select your intended use-case. - ![ArangoGraph Dashboard](../../images/arangograph-dashboard-free-tier.png) + ![ArangoGraph Dashboard](../../../images/arangograph-dashboard-free-tier.png) - You can also [create a deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) + You can also [create a deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) manually, if you want fine-grained configuration options. 2. The new deployment is displayed in the list of deployments for the respective project (here: _Avocado_). - ![ArangoGraph Deployments Bootstrapping](../../images/arangograph-deployments-bootstrapping.png) + ![ArangoGraph Deployments Bootstrapping](../../../images/arangograph-deployments-bootstrapping.png) It takes a couple of minutes before the deployment can be used. The status is changed from __Bootstrapping__ to __OK__ eventually and you also receive an email when it is ready. - {{< image src="../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} 3. Click the name of the deployment (or the __Open deployment details__ link in the email) to view the deployment details. - ![ArangoGraph Deployment Ready](../../images/arangograph-deployment-ready.png) + ![ArangoGraph Deployment Ready](../../../images/arangograph-deployment-ready.png) 4. Click the __Open database UI__ button to open the ArangoDB web interface. @@ -96,23 +96,23 @@ used for multiple accounts. Click __Guide__ for instructions on how to access and run queries against this data. - ![ArangoGraph Deployment Examples](../../images/arangograph-deployment-examples.png) + ![ArangoGraph Deployment Examples](../../../images/arangograph-deployment-examples.png) - ![ArangoGraph Deployment Examples IMDB Guide](../../images/arangograph-deployment-examples-imdb-guide.png) + ![ArangoGraph Deployment Examples IMDB Guide](../../../images/arangograph-deployment-examples-imdb-guide.png) ## General Hierarchy -The ArangoGraph Insights Platform supports multi-tenant setups via organizations. +The Arango Managed Platform (AMP) supports multi-tenant setups via organizations. You can create your own organization(s) and invite collaborators or join existing ones via invites. Your organization contains projects. Your projects hold your deployments. -- [**Organizations**](../arangograph/organizations/_index.md) +- [**Organizations**](../../../amp/organizations/_index.md) represent (commercial) entities such as companies. You can be part of multiple organizations with a single user account. - - [**Projects**](../arangograph/projects.md) + - [**Projects**](../../../amp/projects.md) represent organizational units such as teams or applications. - - [**Deployments**](../arangograph/deployments/_index.md) + - [**Deployments**](../../../amp/deployments/_index.md) are the actual instances of ArangoDB clusters. When you sign up for ArangoGraph, an organization and a default project are @@ -125,32 +125,32 @@ question mark to bring up the help menu and choose __Start tour__. This guided tour walks you through the creation of a deployment and shows you how to load example datasets and manage projects and deployments. -![Start tour in menu](../../images/arangograph-tour-start.png) +![Start tour in menu](../../../images/arangograph-tour-start.png) Alternatively, follow the steps of the linked guides: -- [Create a new project](../arangograph/projects.md#how-to-create-a-new-project) (optional) -- [Create a new deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) -- [Install a new certificate](../arangograph/security-and-access-control/x-509-certificates.md) (optional) -- [Access your deployment](../arangograph/deployments/_index.md#how-to-access-your-deployment) -- [Delete your deployment](../arangograph/deployments/_index.md#how-to-delete-a-deployment) +- [Create a new project](../../../amp/projects.md#how-to-create-a-new-project) (optional) +- [Create a new deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) +- [Install a new certificate](../../../amp/security-and-access-control/x-509-certificates.md) (optional) +- [Access your deployment](../../../amp/deployments/_index.md#how-to-access-your-deployment) +- [Delete your deployment](../../../amp/deployments/_index.md#how-to-delete-a-deployment) ## Free-to-Try vs. Paid -The ArangoGraph Insights Platform comes with a free-to-try tier that lets you test +The Arango Managed Platform (AMP) comes with a free-to-try tier that lets you test the ArangoDB Cloud for free for 14 days. It includes one project and one small deployment of 4GB, local backups, and one notebook for learning and data science. After the trial period, your deployment is automatically deleted. You can unlock all features in ArangoGraph at any time by adding your billing details and at least one payment method. See: -- [ArangoGraph Packages](../arangograph/organizations/_index.md#arangograph-packages) -- [How to add billing details to organizations](../arangograph/organizations/billing.md#how-to-add-billing-details) -- [How to add a payment method to an organization](../arangograph/organizations/billing.md#how-to-add-a-payment-method) +- [ArangoGraph Packages](../../../amp/organizations/_index.md#arangograph-packages) +- [How to add billing details to organizations](../../../amp/organizations/billing.md#how-to-add-billing-details) +- [How to add a payment method to an organization](../../../amp/organizations/billing.md#how-to-add-a-payment-method) ## Managed Cloud Service vs. On-premises Comparison: Key Differences -The ArangoGraph Insights Platform aims to make all features of the ArangoDB -[Enterprise Edition](../about-arangodb/features/enterprise-edition.md) available to you, but +The Arango Managed Platform (AMP) aims to make all features of the ArangoDB +[Enterprise Edition](../about/features/enterprise-edition.md) available to you, but there are a few key differences: - Encryption (both at rest & network traffic) is always on and cannot be diff --git a/site/content/3.11/get-started/start-using-aql/_index.md b/site/content/arangodb/3.11/get-started/start-using-aql/_index.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/_index.md rename to site/content/arangodb/3.11/get-started/start-using-aql/_index.md diff --git a/site/content/3.11/get-started/start-using-aql/crud.md b/site/content/arangodb/3.11/get-started/start-using-aql/crud.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/crud.md rename to site/content/arangodb/3.11/get-started/start-using-aql/crud.md diff --git a/site/content/3.11/get-started/start-using-aql/dataset.md b/site/content/arangodb/3.11/get-started/start-using-aql/dataset.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/dataset.md rename to site/content/arangodb/3.11/get-started/start-using-aql/dataset.md diff --git a/site/content/3.11/get-started/start-using-aql/filter.md b/site/content/arangodb/3.11/get-started/start-using-aql/filter.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/filter.md rename to site/content/arangodb/3.11/get-started/start-using-aql/filter.md diff --git a/site/content/3.11/get-started/start-using-aql/geo.md b/site/content/arangodb/3.11/get-started/start-using-aql/geo.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/geo.md rename to site/content/arangodb/3.11/get-started/start-using-aql/geo.md diff --git a/site/content/3.11/get-started/start-using-aql/graphs.md b/site/content/arangodb/3.11/get-started/start-using-aql/graphs.md similarity index 98% rename from site/content/3.11/get-started/start-using-aql/graphs.md rename to site/content/arangodb/3.11/get-started/start-using-aql/graphs.md index 704679a4dc..2bc5ff07b2 100644 --- a/site/content/3.11/get-started/start-using-aql/graphs.md +++ b/site/content/arangodb/3.11/get-started/start-using-aql/graphs.md @@ -36,7 +36,7 @@ Our characters have the following relations between parents and children Visualized as a graph: -![ChildOf graph visualization](../../../images/ChildOf_Graph.png) +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) ## Creating the edges @@ -252,7 +252,7 @@ It might be a bit unexpected, that Joffrey is returned twice. However, if you look at the graph visualization, you can see that multiple paths lead from Joffrey (bottom right) to Tywin: -![ChildOf graph visualization](../../../images/ChildOf_Graph.png) +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) ``` Tywin <- Jaime <- Joffrey diff --git a/site/content/3.11/get-started/start-using-aql/joins.md b/site/content/arangodb/3.11/get-started/start-using-aql/joins.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/joins.md rename to site/content/arangodb/3.11/get-started/start-using-aql/joins.md diff --git a/site/content/3.11/get-started/start-using-aql/sort-limit.md b/site/content/arangodb/3.11/get-started/start-using-aql/sort-limit.md similarity index 100% rename from site/content/3.11/get-started/start-using-aql/sort-limit.md rename to site/content/arangodb/3.11/get-started/start-using-aql/sort-limit.md diff --git a/site/content/3.11/graphs/_index.md b/site/content/arangodb/3.11/graphs/_index.md similarity index 97% rename from site/content/3.11/graphs/_index.md rename to site/content/arangodb/3.11/graphs/_index.md index b22e55f098..8468fcc125 100644 --- a/site/content/3.11/graphs/_index.md +++ b/site/content/arangodb/3.11/graphs/_index.md @@ -17,12 +17,12 @@ relationships, flows of information, energy, and material, interactions and transactions, dependency and hierarchy, as well as similarity and relatedness of any kind. -![Node - Relation - Node](../../images/data-model-graph-relation-abstract.png) +![Node - Relation - Node](../../../../images/data-model-graph-relation-abstract.png) For example, you can represent people by nodes and their friendships by relations. This lets you form a graph that is a social network in this case. -![Mary - is friend of - John](../../images/data-model-graph-relation-concrete.png) +![Mary - is friend of - John](../../../../images/data-model-graph-relation-concrete.png) The specific terms to refer to nodes and relations in a graph vary depending on the field or context, but they are conceptually the same. In computer science @@ -37,7 +37,7 @@ relate to one another is a very expressive data model. It lets you represent a wide variety of information in a compact and intuitive way. It lets you model complex relationships and interactions of basically everything. -![Mary - bought - Book, is friend of - John](../../images/data-model-graph-relations.png) +![Mary - bought - Book, is friend of - John](../../../../images/data-model-graph-relations.png) Graphs are commonly directed (_digraphs_), which means that each edge goes from one vertex to another vertex in a specific direction. This lets you model @@ -223,7 +223,7 @@ suboptimal query performance due to random data distribution. General graphs are the easiest way to get started, no special configuration required. {{< /tip >}} -![General Graph Random Distribution](../../images/general-graph-distribution.png) +![General Graph Random Distribution](../../../../images/general-graph-distribution.png) #### When to use SmartGraphs @@ -238,7 +238,7 @@ scenarios, use SmartGraphs. Organize your data efficiently using the `smartGraphAttribute`. {{< /tip >}} -![SmartGraph Distribution](../../images/smartgraph-distribution.png) +![SmartGraph Distribution](../../../../images/smartgraph-distribution.png) #### When to use EnterpriseGraphs @@ -252,7 +252,7 @@ If you need improved query execution without manual data distribution, consider using EnterpriseGraphs. {{< /tip >}} -![EnterpriseGraph Distribution](../../images/enterprisegraph-distribution.png) +![EnterpriseGraph Distribution](../../../../images/enterprisegraph-distribution.png) #### When to use SatelliteGraphs @@ -339,7 +339,7 @@ with `_from` pointing to `Users/John` and `_to` pointing to attributes to qualify the relation further, like the permissions of **John** in this group, the date when John joined the group, and so on. -![User in group example](../../images/graph_user_in_group.png) +![User in group example](../../../../images/graph_user_in_group.png) As a rule of thumb, if you use documents and their attributes in a sentence, nouns would typically be vertices, and the verbs the edges. diff --git a/site/content/3.11/graphs/enterprisegraphs/_index.md b/site/content/arangodb/3.11/graphs/enterprisegraphs/_index.md similarity index 100% rename from site/content/3.11/graphs/enterprisegraphs/_index.md rename to site/content/arangodb/3.11/graphs/enterprisegraphs/_index.md diff --git a/site/content/3.11/graphs/enterprisegraphs/getting-started.md b/site/content/arangodb/3.11/graphs/enterprisegraphs/getting-started.md similarity index 99% rename from site/content/3.11/graphs/enterprisegraphs/getting-started.md rename to site/content/arangodb/3.11/graphs/enterprisegraphs/getting-started.md index 1997e74ea5..3a622bbb27 100644 --- a/site/content/3.11/graphs/enterprisegraphs/getting-started.md +++ b/site/content/arangodb/3.11/graphs/enterprisegraphs/getting-started.md @@ -211,7 +211,7 @@ EnterpriseGraphs. To get started, follow the steps outlined below. 6. Click the card of the newly created graph use the functions of the Graph Viewer to visually interact with the graph and manage the graph data. -![Create EnterpriseGraph](../../../images/graphs-create-enterprise-graph-dialog.png) +![Create EnterpriseGraph](../../../../images/graphs-create-enterprise-graph-dialog.png) ## Create an EnterpriseGraph using *arangosh* diff --git a/site/content/3.11/graphs/enterprisegraphs/management.md b/site/content/arangodb/3.11/graphs/enterprisegraphs/management.md similarity index 100% rename from site/content/3.11/graphs/enterprisegraphs/management.md rename to site/content/arangodb/3.11/graphs/enterprisegraphs/management.md diff --git a/site/content/3.10/graphs/example-graphs.md b/site/content/arangodb/3.11/graphs/example-graphs.md similarity index 94% rename from site/content/3.10/graphs/example-graphs.md rename to site/content/arangodb/3.11/graphs/example-graphs.md index 300154d268..58b269cbf0 100644 --- a/site/content/3.10/graphs/example-graphs.md +++ b/site/content/arangodb/3.11/graphs/example-graphs.md @@ -26,7 +26,7 @@ for reference about how to manage graphs programmatically. The `knows` graph is a set of persons knowing each other: -![Persons relation Example Graph](../../images/knows_graph.png) +![Persons relation Example Graph](../../../images/knows_graph.png) The graph consists of a `persons` vertex collection connected via a `knows` edge collection. @@ -63,7 +63,7 @@ The `traversalGraph` has been designed to demonstrate filters in traversals. It has some labels to filter on it. The graph's vertices are in a collection called `circles`, and it has an edge collection `edges` to connect them. -![Traversal Graph](../../images/traversal_graph.png) +![Traversal Graph](../../../images/traversal_graph.png) Circles have unique numeric labels. Edges have two boolean attributes (`theFalse` always being `false`, `theTruth` always being `true`) and a label @@ -93,7 +93,7 @@ The vertices in the `kShortestPathsGraph` graph are train stations of cities in Europe and North America. The edges represent train connections between them, with the travel time for both directions as edge weight. -![Train Connection Map](../../images/train_map.png) +![Train Connection Map](../../../images/train_map.png) See the [k Shortest Paths page](../aql/graphs/k-shortest-paths.md) for query examples. @@ -118,7 +118,7 @@ The example graph consists of vertices in the `mps_verts` collection and edges in the `mps_edges` collection. It is a simple traversal graph with start node *A* and end node *C*. -![Mps Graph](../../images/mps_graph.png) +![Mps Graph](../../../images/mps_graph.png) With the [Shortest Path](../aql/graphs/shortest-path.md) algorithm, you either get the shortest path *A* - *B* - *C* or *A* - *D* - *C*. With the @@ -146,7 +146,7 @@ The `worldCountry` graph has as node structure as follows: world → continent → country → capital -![World Graph](../../images/world_graph.png) +![World Graph](../../../images/world_graph.png) In some cases, edge directions aren't forward. Therefore, it may get displayed disjunct in the graph viewer. @@ -175,7 +175,7 @@ The `social` graph is a set of persons and their relations. The graph has `female` and `male` persons as vertices in two vertex collections. The edges are their connections and stored in the `relation` edge collection. -![Social Example Graph](../../images/social_graph.png) +![Social Example Graph](../../../images/social_graph.png) Example of how to create the graph, inspect its vertices and edges, and delete it again: @@ -201,7 +201,7 @@ multiple vertex collections (`germanCity` and `frenchCity`). The edges are their interconnections in several edge collections (`frenchHighway`, `germanHighway`, `internationalHighway`). -![Cities Example Graph](../../images/cities_graph.png) +![Cities Example Graph](../../../images/cities_graph.png) Example of how to create the graph, inspect its edges and vertices, and delete it again: @@ -231,7 +231,7 @@ Also see: - [Distributed Iterative Graph Processing (Pregel)](../data-science/pregel/_index.md) - [Pregel HTTP API](../develop/http-api/pregel.md) -![Three disjoint subgraphs with 36 nodes and edges in total](../../images/connected_components.png) +![Three disjoint subgraphs with 36 nodes and edges in total](../../../images/connected_components.png) ```js --- diff --git a/site/content/3.11/graphs/general-graphs/_index.md b/site/content/arangodb/3.11/graphs/general-graphs/_index.md similarity index 98% rename from site/content/3.11/graphs/general-graphs/_index.md rename to site/content/arangodb/3.11/graphs/general-graphs/_index.md index d7c072c47e..6025339a08 100644 --- a/site/content/3.11/graphs/general-graphs/_index.md +++ b/site/content/arangodb/3.11/graphs/general-graphs/_index.md @@ -57,7 +57,7 @@ General Graphs. To get started, follow the steps outlined below. 8. Click the card of the newly created graph and use the functions of the Graph Viewer to visually interact with the graph and manage the graph data. -![Create General Graph](../../../images/Create-GeneralGraph.png) +![Create General Graph](../../../../images/Create-GeneralGraph.png) ### Create a General Graph using *arangosh* diff --git a/site/content/3.10/graphs/general-graphs/functions.md b/site/content/arangodb/3.11/graphs/general-graphs/functions.md similarity index 99% rename from site/content/3.10/graphs/general-graphs/functions.md rename to site/content/arangodb/3.11/graphs/general-graphs/functions.md index 87fb731922..c05189027d 100644 --- a/site/content/3.10/graphs/general-graphs/functions.md +++ b/site/content/arangodb/3.11/graphs/general-graphs/functions.md @@ -10,7 +10,7 @@ A lot of these accept a vertex (or edge) example as parameter as defined in the Examples explain the API using the [City Graph](../example-graphs.md#city-graph): -![Social Example Graph](../../../images/cities_graph.png) +![Social Example Graph](../../../../images/cities_graph.png) ## Definition of examples diff --git a/site/content/3.11/graphs/general-graphs/management.md b/site/content/arangodb/3.11/graphs/general-graphs/management.md similarity index 100% rename from site/content/3.11/graphs/general-graphs/management.md rename to site/content/arangodb/3.11/graphs/general-graphs/management.md diff --git a/site/content/3.11/graphs/satellitegraphs/_index.md b/site/content/arangodb/3.11/graphs/satellitegraphs/_index.md similarity index 98% rename from site/content/3.11/graphs/satellitegraphs/_index.md rename to site/content/arangodb/3.11/graphs/satellitegraphs/_index.md index dae85bc5a3..05019c8b3a 100644 --- a/site/content/3.11/graphs/satellitegraphs/_index.md +++ b/site/content/arangodb/3.11/graphs/satellitegraphs/_index.md @@ -19,7 +19,7 @@ the performance of such queries. They are the natural extension of the [SatelliteCollections](../../develop/satellitecollections.md) concept to graphs. The same benefits and caveats apply. -![ArangoDB SatelliteGraphs](../../../images/SatelliteGraphs.webp) +![ArangoDB SatelliteGraphs](../../../../images/SatelliteGraphs.webp) ## Why use a SatelliteGraph? diff --git a/site/content/3.11/graphs/satellitegraphs/details.md b/site/content/arangodb/3.11/graphs/satellitegraphs/details.md similarity index 100% rename from site/content/3.11/graphs/satellitegraphs/details.md rename to site/content/arangodb/3.11/graphs/satellitegraphs/details.md diff --git a/site/content/3.11/graphs/satellitegraphs/management.md b/site/content/arangodb/3.11/graphs/satellitegraphs/management.md similarity index 100% rename from site/content/3.11/graphs/satellitegraphs/management.md rename to site/content/arangodb/3.11/graphs/satellitegraphs/management.md diff --git a/site/content/3.11/graphs/smartgraphs/_index.md b/site/content/arangodb/3.11/graphs/smartgraphs/_index.md similarity index 94% rename from site/content/3.11/graphs/smartgraphs/_index.md rename to site/content/arangodb/3.11/graphs/smartgraphs/_index.md index 3d15be6c58..a9a166b0fe 100644 --- a/site/content/3.11/graphs/smartgraphs/_index.md +++ b/site/content/arangodb/3.11/graphs/smartgraphs/_index.md @@ -62,7 +62,7 @@ cluster for both scenarios. Let's take a closer look at it. The natural distribution of data for graphs that handle large datasets involves a series of highly interconnected nodes with many edges running between them. -![Random data distribution](../../../images/SmartGraphs_random_distribution.png) +![Random data distribution](../../../../images/SmartGraphs_random_distribution.png) _The orange line indicates an example graph traversal. Notice how it touches nodes on every server._ @@ -88,7 +88,7 @@ connecting vertices with identical `smartGraphAttribute` values are stored on this machine as well. Sharding with this attribute means that the relevant data is now co-located on servers, whenever possible. -![SmartGraphs data distribution](../../../images/SmartGraphs_distribution.png) +![SmartGraphs data distribution](../../../../images/SmartGraphs_distribution.png) _The outcome of moving the data like this is that you retain the scalability as well as the performance of graph traversals in ArangoDB._ @@ -103,7 +103,7 @@ and (k-)shortest path(s) query can partially be executed locally on each DB-Serv This means a larger part of the query can be executed fully local whenever data from the SatelliteCollections is required. -![SmartGraphs with SatelliteCollections](../../../images/SmartGraphs-using-SatelliteCollections.png) +![SmartGraphs with SatelliteCollections](../../../../images/SmartGraphs-using-SatelliteCollections.png) ## Disjoint SmartGraphs @@ -112,7 +112,7 @@ large forest of graphs, when you have clearly separated subgraphs in your graph dataset. Disjoint SmartGraphs enable the automatic sharding of these subgraphs and prohibit edges connecting them. -![Disjoint SmartGraphs](../../../images/SmartGraphs-Disjoint.png) +![Disjoint SmartGraphs](../../../../images/SmartGraphs-Disjoint.png) _This ensures that graph traversals, shortest path, and k-shortest-paths queries can be executed locally on a DB-Server, achieving improved performance for diff --git a/site/content/3.11/graphs/smartgraphs/getting-started.md b/site/content/arangodb/3.11/graphs/smartgraphs/getting-started.md similarity index 99% rename from site/content/3.11/graphs/smartgraphs/getting-started.md rename to site/content/arangodb/3.11/graphs/smartgraphs/getting-started.md index 7a41c973bf..cae518afd9 100644 --- a/site/content/3.11/graphs/smartgraphs/getting-started.md +++ b/site/content/arangodb/3.11/graphs/smartgraphs/getting-started.md @@ -63,7 +63,7 @@ SmartGraphs. To get started, follow the steps outlined below. 7. Click the card of the newly created graph and use the functions of the Graph Viewer to visually interact with the graph and manage the graph data. -![Create SmartGraph](../../../images/Create-SmartGraph.png) +![Create SmartGraph](../../../../images/Create-SmartGraph.png) ## Create a SmartGraph using *arangosh* diff --git a/site/content/3.11/graphs/smartgraphs/management.md b/site/content/arangodb/3.11/graphs/smartgraphs/management.md similarity index 100% rename from site/content/3.11/graphs/smartgraphs/management.md rename to site/content/arangodb/3.11/graphs/smartgraphs/management.md diff --git a/site/content/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md similarity index 100% rename from site/content/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md rename to site/content/arangodb/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md diff --git a/site/content/3.11/graphs/working-with-edges.md b/site/content/arangodb/3.11/graphs/working-with-edges.md similarity index 100% rename from site/content/3.11/graphs/working-with-edges.md rename to site/content/arangodb/3.11/graphs/working-with-edges.md diff --git a/site/content/3.11/index-and-search/_index.md b/site/content/arangodb/3.11/index-and-search/_index.md similarity index 100% rename from site/content/3.11/index-and-search/_index.md rename to site/content/arangodb/3.11/index-and-search/_index.md diff --git a/site/content/3.11/index-and-search/analyzers.md b/site/content/arangodb/3.11/index-and-search/analyzers.md similarity index 100% rename from site/content/3.11/index-and-search/analyzers.md rename to site/content/arangodb/3.11/index-and-search/analyzers.md diff --git a/site/content/3.11/index-and-search/arangosearch/_index.md b/site/content/arangodb/3.11/index-and-search/arangosearch/_index.md similarity index 99% rename from site/content/3.11/index-and-search/arangosearch/_index.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/_index.md index c6d6e5d952..ea2dcc46cb 100644 --- a/site/content/3.11/index-and-search/arangosearch/_index.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/_index.md @@ -65,7 +65,7 @@ Search results can be sorted by their similarity ranking to return the best matches first using popular scoring algorithms (Okapi BM25, TF-IDF), user-defined relevance boosting and dynamic score calculation. -![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../images/arangosearch.png) +![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../../images/arangosearch.png) Views can be managed in the web interface, via an [HTTP API](../../develop/http-api/views/_index.md) and through a [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views). diff --git a/site/content/3.11/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md similarity index 99% rename from site/content/3.11/index-and-search/arangosearch/arangosearch-views-reference.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md index 9d53f53c56..ca4e877a28 100644 --- a/site/content/3.11/index-and-search/arangosearch/arangosearch-views-reference.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md @@ -58,7 +58,7 @@ To get started, follow the steps outlined below. turn off this limit for any writer. 8. Click **Create**. -![Create new arangosearch View](../../../images/arangosearch-create-new-view.png) +![Create new arangosearch View](../../../../images/arangosearch-create-new-view.png) ## Create `arangosearch` Views using the JavaScript API diff --git a/site/content/3.11/index-and-search/arangosearch/case-sensitivity-and-diacritics.md b/site/content/arangodb/3.11/index-and-search/arangosearch/case-sensitivity-and-diacritics.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/case-sensitivity-and-diacritics.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/case-sensitivity-and-diacritics.md diff --git a/site/content/3.11/index-and-search/arangosearch/exact-value-matching.md b/site/content/arangodb/3.11/index-and-search/arangosearch/exact-value-matching.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/exact-value-matching.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/exact-value-matching.md diff --git a/site/content/3.11/index-and-search/arangosearch/example-datasets.md b/site/content/arangodb/3.11/index-and-search/arangosearch/example-datasets.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/example-datasets.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/example-datasets.md diff --git a/site/content/3.11/index-and-search/arangosearch/faceted-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/faceted-search.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/faceted-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/faceted-search.md diff --git a/site/content/3.11/index-and-search/arangosearch/full-text-token-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/full-text-token-search.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/full-text-token-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/full-text-token-search.md diff --git a/site/content/3.11/index-and-search/arangosearch/fuzzy-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/fuzzy-search.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/fuzzy-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/fuzzy-search.md diff --git a/site/content/3.11/index-and-search/arangosearch/geospatial-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/geospatial-search.md similarity index 99% rename from site/content/3.11/index-and-search/arangosearch/geospatial-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/geospatial-search.md index 996e1f9eb0..d8df3fc973 100644 --- a/site/content/3.11/index-and-search/arangosearch/geospatial-search.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/geospatial-search.md @@ -297,7 +297,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for points in a polygon](../../../images/arangosearch-geo-points-in-polygon.png) +![ArangoSearch geospatial query for points in a polygon](../../../../images/arangosearch-geo-points-in-polygon.png) You do not have to look up the polygon, you can also provide one inline. It is also not necessary to return the polygon, you can return the matches only: @@ -559,7 +559,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geosptial query for polygons in a polygon](../../../images/arangosearch-geo-polygons-in-polygon.png) +![ArangoSearch geosptial query for polygons in a polygon](../../../../images/arangosearch-geo-polygons-in-polygon.png) Searching for geo features in a rectangle is something you can use together with an interactive map that the user can select the area of interest with. @@ -629,4 +629,4 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for polygons intersecting a polygon](../../../images/arangosearch-geo-polygons-intersecting-polygon.png) +![ArangoSearch geospatial query for polygons intersecting a polygon](../../../../images/arangosearch-geo-polygons-intersecting-polygon.png) diff --git a/site/content/3.11/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/nested-search.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/nested-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/nested-search.md diff --git a/site/content/3.11/index-and-search/arangosearch/performance.md b/site/content/arangodb/3.11/index-and-search/arangosearch/performance.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/performance.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/performance.md diff --git a/site/content/3.11/index-and-search/arangosearch/phrase-and-proximity-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/phrase-and-proximity-search.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/phrase-and-proximity-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/phrase-and-proximity-search.md diff --git a/site/content/3.11/index-and-search/arangosearch/prefix-matching.md b/site/content/arangodb/3.11/index-and-search/arangosearch/prefix-matching.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/prefix-matching.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/prefix-matching.md diff --git a/site/content/3.11/index-and-search/arangosearch/range-queries.md b/site/content/arangodb/3.11/index-and-search/arangosearch/range-queries.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/range-queries.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/range-queries.md diff --git a/site/content/3.11/index-and-search/arangosearch/ranking.md b/site/content/arangodb/3.11/index-and-search/arangosearch/ranking.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/ranking.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/ranking.md diff --git a/site/content/3.11/index-and-search/arangosearch/search-alias-views-reference.md b/site/content/arangodb/3.11/index-and-search/arangosearch/search-alias-views-reference.md similarity index 97% rename from site/content/3.11/index-and-search/arangosearch/search-alias-views-reference.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/search-alias-views-reference.md index 89f964a838..df4c778732 100644 --- a/site/content/3.11/index-and-search/arangosearch/search-alias-views-reference.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/search-alias-views-reference.md @@ -61,7 +61,7 @@ To get started, follow the steps outlined below. 6. To define multiple indexes, click the **Add index** button. 7. Click **Create**. -![Create new search-alias View](../../../images/arangosearch-create-search-alias-view.png) +![Create new search-alias View](../../../../images/arangosearch-create-search-alias-view.png) ## Create `search-alias` Views using the JavaScript API diff --git a/site/content/3.11/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/3.11/index-and-search/arangosearch/search-highlighting.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/search-highlighting.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/search-highlighting.md diff --git a/site/content/3.11/index-and-search/arangosearch/wildcard-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/wildcard-search.md similarity index 100% rename from site/content/3.11/index-and-search/arangosearch/wildcard-search.md rename to site/content/arangodb/3.11/index-and-search/arangosearch/wildcard-search.md diff --git a/site/content/3.11/index-and-search/indexing/_index.md b/site/content/arangodb/3.11/index-and-search/indexing/_index.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/_index.md rename to site/content/arangodb/3.11/index-and-search/indexing/_index.md diff --git a/site/content/3.11/index-and-search/indexing/basics.md b/site/content/arangodb/3.11/index-and-search/indexing/basics.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/basics.md rename to site/content/arangodb/3.11/index-and-search/indexing/basics.md diff --git a/site/content/3.11/index-and-search/indexing/index-utilization.md b/site/content/arangodb/3.11/index-and-search/indexing/index-utilization.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/index-utilization.md rename to site/content/arangodb/3.11/index-and-search/indexing/index-utilization.md diff --git a/site/content/3.11/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/3.11/index-and-search/indexing/which-index-to-use-when.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/which-index-to-use-when.md rename to site/content/arangodb/3.11/index-and-search/indexing/which-index-to-use-when.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/_index.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/_index.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/_index.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/_index.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/fulltext-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/fulltext-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/fulltext-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/fulltext-indexes.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/inverted-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/inverted-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/inverted-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/inverted-indexes.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/persistent-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/persistent-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/persistent-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/persistent-indexes.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/ttl-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/ttl-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/ttl-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/ttl-indexes.md diff --git a/site/content/3.11/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md b/site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md similarity index 100% rename from site/content/3.11/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md rename to site/content/arangodb/3.11/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md diff --git a/site/content/3.11/operations/_index.md b/site/content/arangodb/3.11/operations/_index.md similarity index 100% rename from site/content/3.11/operations/_index.md rename to site/content/arangodb/3.11/operations/_index.md diff --git a/site/content/3.11/operations/administration/_index.md b/site/content/arangodb/3.11/operations/administration/_index.md similarity index 100% rename from site/content/3.11/operations/administration/_index.md rename to site/content/arangodb/3.11/operations/administration/_index.md diff --git a/site/content/3.11/operations/administration/arangodb-starter/_index.md b/site/content/arangodb/3.11/operations/administration/arangodb-starter/_index.md similarity index 100% rename from site/content/3.11/operations/administration/arangodb-starter/_index.md rename to site/content/arangodb/3.11/operations/administration/arangodb-starter/_index.md diff --git a/site/content/3.11/operations/administration/arangodb-starter/recovery-procedure.md b/site/content/arangodb/3.11/operations/administration/arangodb-starter/recovery-procedure.md similarity index 100% rename from site/content/3.11/operations/administration/arangodb-starter/recovery-procedure.md rename to site/content/arangodb/3.11/operations/administration/arangodb-starter/recovery-procedure.md diff --git a/site/content/3.11/operations/administration/arangodb-starter/removal-procedure.md b/site/content/arangodb/3.11/operations/administration/arangodb-starter/removal-procedure.md similarity index 100% rename from site/content/3.11/operations/administration/arangodb-starter/removal-procedure.md rename to site/content/arangodb/3.11/operations/administration/arangodb-starter/removal-procedure.md diff --git a/site/content/3.11/operations/administration/configuration.md b/site/content/arangodb/3.11/operations/administration/configuration.md similarity index 100% rename from site/content/3.11/operations/administration/configuration.md rename to site/content/arangodb/3.11/operations/administration/configuration.md diff --git a/site/content/3.11/operations/administration/import-and-export.md b/site/content/arangodb/3.11/operations/administration/import-and-export.md similarity index 100% rename from site/content/3.11/operations/administration/import-and-export.md rename to site/content/arangodb/3.11/operations/administration/import-and-export.md diff --git a/site/content/3.11/operations/administration/license-management.md b/site/content/arangodb/3.11/operations/administration/license-management.md similarity index 100% rename from site/content/3.11/operations/administration/license-management.md rename to site/content/arangodb/3.11/operations/administration/license-management.md diff --git a/site/content/3.11/operations/administration/log-levels.md b/site/content/arangodb/3.11/operations/administration/log-levels.md similarity index 100% rename from site/content/3.11/operations/administration/log-levels.md rename to site/content/arangodb/3.11/operations/administration/log-levels.md diff --git a/site/content/3.11/operations/administration/reduce-memory-footprint.md b/site/content/arangodb/3.11/operations/administration/reduce-memory-footprint.md similarity index 99% rename from site/content/3.11/operations/administration/reduce-memory-footprint.md rename to site/content/arangodb/3.11/operations/administration/reduce-memory-footprint.md index 070f1ae311..5039fe7dcd 100644 --- a/site/content/3.11/operations/administration/reduce-memory-footprint.md +++ b/site/content/arangodb/3.11/operations/administration/reduce-memory-footprint.md @@ -701,7 +701,7 @@ otherwise. ## Testing the Effects of Reduced I/O Buffers -![Performance Graph](../../../images/performance_graph.png) +![Performance Graph](../../../../images/performance_graph.png) - 15:50 – Start bigger import - 16:00 – Start writing documents of ~60 KB size one at a time diff --git a/site/content/3.11/operations/administration/telemetrics.md b/site/content/arangodb/3.11/operations/administration/telemetrics.md similarity index 100% rename from site/content/3.11/operations/administration/telemetrics.md rename to site/content/arangodb/3.11/operations/administration/telemetrics.md diff --git a/site/content/3.11/operations/administration/user-management/_index.md b/site/content/arangodb/3.11/operations/administration/user-management/_index.md similarity index 100% rename from site/content/3.11/operations/administration/user-management/_index.md rename to site/content/arangodb/3.11/operations/administration/user-management/_index.md diff --git a/site/content/3.11/operations/administration/user-management/in-arangosh.md b/site/content/arangodb/3.11/operations/administration/user-management/in-arangosh.md similarity index 100% rename from site/content/3.11/operations/administration/user-management/in-arangosh.md rename to site/content/arangodb/3.11/operations/administration/user-management/in-arangosh.md diff --git a/site/content/3.11/operations/backup-and-restore.md b/site/content/arangodb/3.11/operations/backup-and-restore.md similarity index 100% rename from site/content/3.11/operations/backup-and-restore.md rename to site/content/arangodb/3.11/operations/backup-and-restore.md diff --git a/site/content/3.11/operations/installation/_index.md b/site/content/arangodb/3.11/operations/installation/_index.md similarity index 97% rename from site/content/3.11/operations/installation/_index.md rename to site/content/arangodb/3.11/operations/installation/_index.md index e64692e4f5..9f247d359a 100644 --- a/site/content/3.11/operations/installation/_index.md +++ b/site/content/arangodb/3.11/operations/installation/_index.md @@ -39,7 +39,7 @@ ArangoDB requires systems with Little Endian byte order. {{< /info >}} {{< tip >}} -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is a fully-managed service and requires no installation. It's the easiest way to run ArangoDB in the cloud. {{< /tip >}} diff --git a/site/content/3.11/operations/installation/compiling/_index.md b/site/content/arangodb/3.11/operations/installation/compiling/_index.md similarity index 100% rename from site/content/3.11/operations/installation/compiling/_index.md rename to site/content/arangodb/3.11/operations/installation/compiling/_index.md diff --git a/site/content/3.11/operations/installation/compiling/compile-on-debian.md b/site/content/arangodb/3.11/operations/installation/compiling/compile-on-debian.md similarity index 100% rename from site/content/3.11/operations/installation/compiling/compile-on-debian.md rename to site/content/arangodb/3.11/operations/installation/compiling/compile-on-debian.md diff --git a/site/content/3.11/operations/installation/compiling/compile-on-windows.md b/site/content/arangodb/3.11/operations/installation/compiling/compile-on-windows.md similarity index 99% rename from site/content/3.11/operations/installation/compiling/compile-on-windows.md rename to site/content/arangodb/3.11/operations/installation/compiling/compile-on-windows.md index c89c5d3347..dcdac2e1a1 100644 --- a/site/content/3.11/operations/installation/compiling/compile-on-windows.md +++ b/site/content/arangodb/3.11/operations/installation/compiling/compile-on-windows.md @@ -116,7 +116,7 @@ right click on `This PC` in the tree on the left, choose `Properties` in the ope in the Popup `Environment Variables`, another popup opens, in the `System Variables` part you click `New`, And variable name: `ICU_DATA` to the value: `c:\\Windows` -![HowtoSetEnv](../../../../images/SetEnvironmentVar.png) +![HowtoSetEnv](../../../../../images/SetEnvironmentVar.png) ## Unit tests (Optional) diff --git a/site/content/3.11/operations/installation/compiling/recompiling-jemalloc.md b/site/content/arangodb/3.11/operations/installation/compiling/recompiling-jemalloc.md similarity index 100% rename from site/content/3.11/operations/installation/compiling/recompiling-jemalloc.md rename to site/content/arangodb/3.11/operations/installation/compiling/recompiling-jemalloc.md diff --git a/site/content/3.11/operations/installation/compiling/running-custom-build.md b/site/content/arangodb/3.11/operations/installation/compiling/running-custom-build.md similarity index 100% rename from site/content/3.11/operations/installation/compiling/running-custom-build.md rename to site/content/arangodb/3.11/operations/installation/compiling/running-custom-build.md diff --git a/site/content/3.11/operations/installation/docker.md b/site/content/arangodb/3.11/operations/installation/docker.md similarity index 100% rename from site/content/3.11/operations/installation/docker.md rename to site/content/arangodb/3.11/operations/installation/docker.md diff --git a/site/content/3.11/operations/installation/linux/_index.md b/site/content/arangodb/3.11/operations/installation/linux/_index.md similarity index 100% rename from site/content/3.11/operations/installation/linux/_index.md rename to site/content/arangodb/3.11/operations/installation/linux/_index.md diff --git a/site/content/3.11/operations/installation/linux/linux-os-tuning-script-examples.md b/site/content/arangodb/3.11/operations/installation/linux/linux-os-tuning-script-examples.md similarity index 100% rename from site/content/3.11/operations/installation/linux/linux-os-tuning-script-examples.md rename to site/content/arangodb/3.11/operations/installation/linux/linux-os-tuning-script-examples.md diff --git a/site/content/3.11/operations/installation/linux/operating-system-configuration.md b/site/content/arangodb/3.11/operations/installation/linux/operating-system-configuration.md similarity index 100% rename from site/content/3.11/operations/installation/linux/operating-system-configuration.md rename to site/content/arangodb/3.11/operations/installation/linux/operating-system-configuration.md diff --git a/site/content/3.11/operations/installation/macos.md b/site/content/arangodb/3.11/operations/installation/macos.md similarity index 100% rename from site/content/3.11/operations/installation/macos.md rename to site/content/arangodb/3.11/operations/installation/macos.md diff --git a/site/content/3.11/operations/installation/uninstallation.md b/site/content/arangodb/3.11/operations/installation/uninstallation.md similarity index 100% rename from site/content/3.11/operations/installation/uninstallation.md rename to site/content/arangodb/3.11/operations/installation/uninstallation.md diff --git a/site/content/3.11/operations/installation/windows.md b/site/content/arangodb/3.11/operations/installation/windows.md similarity index 100% rename from site/content/3.11/operations/installation/windows.md rename to site/content/arangodb/3.11/operations/installation/windows.md diff --git a/site/content/3.11/operations/security/_index.md b/site/content/arangodb/3.11/operations/security/_index.md similarity index 100% rename from site/content/3.11/operations/security/_index.md rename to site/content/arangodb/3.11/operations/security/_index.md diff --git a/site/content/3.11/operations/security/audit-logging.md b/site/content/arangodb/3.11/operations/security/audit-logging.md similarity index 98% rename from site/content/3.11/operations/security/audit-logging.md rename to site/content/arangodb/3.11/operations/security/audit-logging.md index 792762bb2e..60dd5d212c 100644 --- a/site/content/3.11/operations/security/audit-logging.md +++ b/site/content/arangodb/3.11/operations/security/audit-logging.md @@ -13,7 +13,7 @@ pageToc: {{< tip >}} A similar feature is also available in the -[ArangoGraph Insights Platform](../../arangograph/security-and-access-control/_index.md#using-an-audit-log). +[Arango Managed Platform (AMP)](../../../../amp/security-and-access-control/_index.md#using-an-audit-log). {{< /tip >}} ## Configuration diff --git a/site/content/3.11/operations/security/change-root-password.md b/site/content/arangodb/3.11/operations/security/change-root-password.md similarity index 100% rename from site/content/3.11/operations/security/change-root-password.md rename to site/content/arangodb/3.11/operations/security/change-root-password.md diff --git a/site/content/3.11/operations/security/encryption-at-rest.md b/site/content/arangodb/3.11/operations/security/encryption-at-rest.md similarity index 97% rename from site/content/3.11/operations/security/encryption-at-rest.md rename to site/content/arangodb/3.11/operations/security/encryption-at-rest.md index 9821486e56..8a958d9be1 100644 --- a/site/content/3.11/operations/security/encryption-at-rest.md +++ b/site/content/arangodb/3.11/operations/security/encryption-at-rest.md @@ -30,9 +30,9 @@ performance and resistance to side-channel attacks. The encryption feature is supported by all ArangoDB deployment modes. {{< info >}} -The ArangoGraph Insights Platform has encryption at rest as well as in transit +The Arango Managed Platform (AMP) has encryption at rest as well as in transit set on by default and cannot be disabled. For more information, see the -[ArangoGraph documentation](../../arangograph/_index.md). +[ArangoGraph documentation](../../../../amp/_index.md). {{< /info >}} ## Limitations diff --git a/site/content/3.11/operations/security/securing-starter-deployments.md b/site/content/arangodb/3.11/operations/security/securing-starter-deployments.md similarity index 100% rename from site/content/3.11/operations/security/securing-starter-deployments.md rename to site/content/arangodb/3.11/operations/security/securing-starter-deployments.md diff --git a/site/content/3.11/operations/security/security-options.md b/site/content/arangodb/3.11/operations/security/security-options.md similarity index 100% rename from site/content/3.11/operations/security/security-options.md rename to site/content/arangodb/3.11/operations/security/security-options.md diff --git a/site/content/3.11/operations/troubleshooting/_index.md b/site/content/arangodb/3.11/operations/troubleshooting/_index.md similarity index 100% rename from site/content/3.11/operations/troubleshooting/_index.md rename to site/content/arangodb/3.11/operations/troubleshooting/_index.md diff --git a/site/content/3.11/operations/troubleshooting/arangod.md b/site/content/arangodb/3.11/operations/troubleshooting/arangod.md similarity index 100% rename from site/content/3.11/operations/troubleshooting/arangod.md rename to site/content/arangodb/3.11/operations/troubleshooting/arangod.md diff --git a/site/content/3.11/operations/troubleshooting/cluster/_index.md b/site/content/arangodb/3.11/operations/troubleshooting/cluster/_index.md similarity index 100% rename from site/content/3.11/operations/troubleshooting/cluster/_index.md rename to site/content/arangodb/3.11/operations/troubleshooting/cluster/_index.md diff --git a/site/content/3.11/operations/troubleshooting/cluster/agency-dump.md b/site/content/arangodb/3.11/operations/troubleshooting/cluster/agency-dump.md similarity index 100% rename from site/content/3.11/operations/troubleshooting/cluster/agency-dump.md rename to site/content/arangodb/3.11/operations/troubleshooting/cluster/agency-dump.md diff --git a/site/content/3.11/operations/troubleshooting/emergency-console.md b/site/content/arangodb/3.11/operations/troubleshooting/emergency-console.md similarity index 100% rename from site/content/3.11/operations/troubleshooting/emergency-console.md rename to site/content/arangodb/3.11/operations/troubleshooting/emergency-console.md diff --git a/site/content/3.11/operations/troubleshooting/query-debug-packages.md b/site/content/arangodb/3.11/operations/troubleshooting/query-debug-packages.md similarity index 100% rename from site/content/3.11/operations/troubleshooting/query-debug-packages.md rename to site/content/arangodb/3.11/operations/troubleshooting/query-debug-packages.md diff --git a/site/content/3.11/operations/upgrading/_index.md b/site/content/arangodb/3.11/operations/upgrading/_index.md similarity index 100% rename from site/content/3.11/operations/upgrading/_index.md rename to site/content/arangodb/3.11/operations/upgrading/_index.md diff --git a/site/content/3.11/operations/upgrading/community-to-enterprise-upgrade.md b/site/content/arangodb/3.11/operations/upgrading/community-to-enterprise-upgrade.md similarity index 100% rename from site/content/3.11/operations/upgrading/community-to-enterprise-upgrade.md rename to site/content/arangodb/3.11/operations/upgrading/community-to-enterprise-upgrade.md diff --git a/site/content/3.11/operations/upgrading/downgrading.md b/site/content/arangodb/3.11/operations/upgrading/downgrading.md similarity index 100% rename from site/content/3.11/operations/upgrading/downgrading.md rename to site/content/arangodb/3.11/operations/upgrading/downgrading.md diff --git a/site/content/3.11/operations/upgrading/manual-deployments/_index.md b/site/content/arangodb/3.11/operations/upgrading/manual-deployments/_index.md similarity index 100% rename from site/content/3.11/operations/upgrading/manual-deployments/_index.md rename to site/content/arangodb/3.11/operations/upgrading/manual-deployments/_index.md diff --git a/site/content/3.11/operations/upgrading/manual-deployments/active-failover.md b/site/content/arangodb/3.11/operations/upgrading/manual-deployments/active-failover.md similarity index 100% rename from site/content/3.11/operations/upgrading/manual-deployments/active-failover.md rename to site/content/arangodb/3.11/operations/upgrading/manual-deployments/active-failover.md diff --git a/site/content/3.11/operations/upgrading/manual-deployments/cluster.md b/site/content/arangodb/3.11/operations/upgrading/manual-deployments/cluster.md similarity index 100% rename from site/content/3.11/operations/upgrading/manual-deployments/cluster.md rename to site/content/arangodb/3.11/operations/upgrading/manual-deployments/cluster.md diff --git a/site/content/3.11/operations/upgrading/os-specific-information/_index.md b/site/content/arangodb/3.11/operations/upgrading/os-specific-information/_index.md similarity index 100% rename from site/content/3.11/operations/upgrading/os-specific-information/_index.md rename to site/content/arangodb/3.11/operations/upgrading/os-specific-information/_index.md diff --git a/site/content/3.11/operations/upgrading/os-specific-information/linux.md b/site/content/arangodb/3.11/operations/upgrading/os-specific-information/linux.md similarity index 100% rename from site/content/3.11/operations/upgrading/os-specific-information/linux.md rename to site/content/arangodb/3.11/operations/upgrading/os-specific-information/linux.md diff --git a/site/content/3.11/operations/upgrading/os-specific-information/macos.md b/site/content/arangodb/3.11/operations/upgrading/os-specific-information/macos.md similarity index 95% rename from site/content/3.11/operations/upgrading/os-specific-information/macos.md rename to site/content/arangodb/3.11/operations/upgrading/os-specific-information/macos.md index 3e010631cc..9e5ec267db 100644 --- a/site/content/3.11/operations/upgrading/os-specific-information/macos.md +++ b/site/content/arangodb/3.11/operations/upgrading/os-specific-information/macos.md @@ -23,7 +23,7 @@ Drag and drop the `ArangoDB3-CLI` (Community Edition) or the `ArangoDB3e-CLI` (Enterprise Edition) file onto the shown `Applications` folder. You are asked if you want to replace the old file with the newer one. -![MacOSUpgrade](../../../../images/MacOSUpgrade.png) +![MacOSUpgrade](../../../../../images/MacOSUpgrade.png) Select `Replace` to install the new ArangoDB version. diff --git a/site/content/3.11/operations/upgrading/os-specific-information/windows.md b/site/content/arangodb/3.11/operations/upgrading/os-specific-information/windows.md similarity index 96% rename from site/content/3.11/operations/upgrading/os-specific-information/windows.md rename to site/content/arangodb/3.11/operations/upgrading/os-specific-information/windows.md index b43686c6e1..dcb9b5d831 100644 --- a/site/content/3.11/operations/upgrading/os-specific-information/windows.md +++ b/site/content/arangodb/3.11/operations/upgrading/os-specific-information/windows.md @@ -34,7 +34,7 @@ If you have installed via the _Installer_, to upgrade: the option "_Automatically update existing ArangoDB database_" so that the database files will be upgraded. -![Update Option](../../../../images/installer_upgrade.png) +![Update Option](../../../../../images/installer_upgrade.png) {{< info >}} Upgrading via the Installer, when the old data is kept, will keep your @@ -45,14 +45,14 @@ password and choice of storage engine as it is. - You can uninstall the old one manually (make a copy of your old configuration file first). -![Uninstall old version](../../../../images/both_installations.png) +![Uninstall old version](../../../../../images/both_installations.png) {{< danger >}} When uninstalling the old package, please make sure the option "_Delete databases with uninstallation_" is **not** checked. {{< /danger >}} -![Delete Option](../../../../images/installer_delete.png) +![Delete Option](../../../../../images/installer_delete.png) {{< danger >}} When upgrading, the Windows Installer does not use the old configuration file diff --git a/site/content/3.11/operations/upgrading/starter-deployments.md b/site/content/arangodb/3.11/operations/upgrading/starter-deployments.md similarity index 100% rename from site/content/3.11/operations/upgrading/starter-deployments.md rename to site/content/arangodb/3.11/operations/upgrading/starter-deployments.md diff --git a/site/content/3.11/release-notes/_index.md b/site/content/arangodb/3.11/release-notes/_index.md similarity index 100% rename from site/content/3.11/release-notes/_index.md rename to site/content/arangodb/3.11/release-notes/_index.md diff --git a/site/content/3.11/release-notes/deprecated-and-removed-features.md b/site/content/arangodb/3.11/release-notes/deprecated-and-removed-features.md similarity index 100% rename from site/content/3.11/release-notes/deprecated-and-removed-features.md rename to site/content/arangodb/3.11/release-notes/deprecated-and-removed-features.md diff --git a/site/content/3.11/release-notes/version-3.0/_index.md b/site/content/arangodb/3.11/release-notes/version-3.0/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.0/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.0/_index.md diff --git a/site/content/3.11/release-notes/version-3.0/incompatible-changes-in-3-0.md b/site/content/arangodb/3.11/release-notes/version-3.0/incompatible-changes-in-3-0.md similarity index 100% rename from site/content/3.11/release-notes/version-3.0/incompatible-changes-in-3-0.md rename to site/content/arangodb/3.11/release-notes/version-3.0/incompatible-changes-in-3-0.md diff --git a/site/content/3.11/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.11/release-notes/version-3.0/whats-new-in-3-0.md similarity index 100% rename from site/content/3.11/release-notes/version-3.0/whats-new-in-3-0.md rename to site/content/arangodb/3.11/release-notes/version-3.0/whats-new-in-3-0.md diff --git a/site/content/3.11/release-notes/version-3.1/_index.md b/site/content/arangodb/3.11/release-notes/version-3.1/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.1/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.1/_index.md diff --git a/site/content/3.11/release-notes/version-3.1/incompatible-changes-in-3-1.md b/site/content/arangodb/3.11/release-notes/version-3.1/incompatible-changes-in-3-1.md similarity index 100% rename from site/content/3.11/release-notes/version-3.1/incompatible-changes-in-3-1.md rename to site/content/arangodb/3.11/release-notes/version-3.1/incompatible-changes-in-3-1.md diff --git a/site/content/3.11/release-notes/version-3.1/whats-new-in-3-1.md b/site/content/arangodb/3.11/release-notes/version-3.1/whats-new-in-3-1.md similarity index 100% rename from site/content/3.11/release-notes/version-3.1/whats-new-in-3-1.md rename to site/content/arangodb/3.11/release-notes/version-3.1/whats-new-in-3-1.md diff --git a/site/content/3.11/release-notes/version-3.10/_index.md b/site/content/arangodb/3.11/release-notes/version-3.10/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.10/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.10/_index.md diff --git a/site/content/3.11/release-notes/version-3.10/api-changes-in-3-10.md b/site/content/arangodb/3.11/release-notes/version-3.10/api-changes-in-3-10.md similarity index 100% rename from site/content/3.11/release-notes/version-3.10/api-changes-in-3-10.md rename to site/content/arangodb/3.11/release-notes/version-3.10/api-changes-in-3-10.md diff --git a/site/content/3.11/release-notes/version-3.10/incompatible-changes-in-3-10.md b/site/content/arangodb/3.11/release-notes/version-3.10/incompatible-changes-in-3-10.md similarity index 100% rename from site/content/3.11/release-notes/version-3.10/incompatible-changes-in-3-10.md rename to site/content/arangodb/3.11/release-notes/version-3.10/incompatible-changes-in-3-10.md diff --git a/site/content/3.11/release-notes/version-3.10/known-issues-in-3-10.md b/site/content/arangodb/3.11/release-notes/version-3.10/known-issues-in-3-10.md similarity index 100% rename from site/content/3.11/release-notes/version-3.10/known-issues-in-3-10.md rename to site/content/arangodb/3.11/release-notes/version-3.10/known-issues-in-3-10.md diff --git a/site/content/3.11/release-notes/version-3.10/whats-new-in-3-10.md b/site/content/arangodb/3.11/release-notes/version-3.10/whats-new-in-3-10.md similarity index 100% rename from site/content/3.11/release-notes/version-3.10/whats-new-in-3-10.md rename to site/content/arangodb/3.11/release-notes/version-3.10/whats-new-in-3-10.md diff --git a/site/content/3.11/release-notes/version-3.11/_index.md b/site/content/arangodb/3.11/release-notes/version-3.11/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.11/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.11/_index.md diff --git a/site/content/3.11/release-notes/version-3.11/api-changes-in-3-11.md b/site/content/arangodb/3.11/release-notes/version-3.11/api-changes-in-3-11.md similarity index 100% rename from site/content/3.11/release-notes/version-3.11/api-changes-in-3-11.md rename to site/content/arangodb/3.11/release-notes/version-3.11/api-changes-in-3-11.md diff --git a/site/content/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md similarity index 100% rename from site/content/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md rename to site/content/arangodb/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md diff --git a/site/content/3.11/release-notes/version-3.11/known-issues-in-3-11.md b/site/content/arangodb/3.11/release-notes/version-3.11/known-issues-in-3-11.md similarity index 100% rename from site/content/3.11/release-notes/version-3.11/known-issues-in-3-11.md rename to site/content/arangodb/3.11/release-notes/version-3.11/known-issues-in-3-11.md diff --git a/site/content/3.11/release-notes/version-3.11/whats-new-in-3-11.md b/site/content/arangodb/3.11/release-notes/version-3.11/whats-new-in-3-11.md similarity index 99% rename from site/content/3.11/release-notes/version-3.11/whats-new-in-3-11.md rename to site/content/arangodb/3.11/release-notes/version-3.11/whats-new-in-3-11.md index d3141442d0..698caac625 100644 --- a/site/content/3.11/release-notes/version-3.11/whats-new-in-3-11.md +++ b/site/content/arangodb/3.11/release-notes/version-3.11/whats-new-in-3-11.md @@ -127,7 +127,7 @@ vertex. Another quality-of-life improvement is the **Start node** setting listin the graph's vertex collections and the available document keys, that you can also search by. -![New graph viewer](../../../images/graphViewer.png) +![New graph viewer](../../../../images/graphViewer.png) You can still switch to the old graph viewer if desired. diff --git a/site/content/3.11/release-notes/version-3.2/_index.md b/site/content/arangodb/3.11/release-notes/version-3.2/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.2/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.2/_index.md diff --git a/site/content/3.11/release-notes/version-3.2/incompatible-changes-in-3-2.md b/site/content/arangodb/3.11/release-notes/version-3.2/incompatible-changes-in-3-2.md similarity index 100% rename from site/content/3.11/release-notes/version-3.2/incompatible-changes-in-3-2.md rename to site/content/arangodb/3.11/release-notes/version-3.2/incompatible-changes-in-3-2.md diff --git a/site/content/3.11/release-notes/version-3.2/known-issues-in-3-2.md b/site/content/arangodb/3.11/release-notes/version-3.2/known-issues-in-3-2.md similarity index 100% rename from site/content/3.11/release-notes/version-3.2/known-issues-in-3-2.md rename to site/content/arangodb/3.11/release-notes/version-3.2/known-issues-in-3-2.md diff --git a/site/content/3.11/release-notes/version-3.2/whats-new-in-3-2.md b/site/content/arangodb/3.11/release-notes/version-3.2/whats-new-in-3-2.md similarity index 100% rename from site/content/3.11/release-notes/version-3.2/whats-new-in-3-2.md rename to site/content/arangodb/3.11/release-notes/version-3.2/whats-new-in-3-2.md diff --git a/site/content/3.11/release-notes/version-3.3/_index.md b/site/content/arangodb/3.11/release-notes/version-3.3/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.3/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.3/_index.md diff --git a/site/content/3.11/release-notes/version-3.3/incompatible-changes-in-3-3.md b/site/content/arangodb/3.11/release-notes/version-3.3/incompatible-changes-in-3-3.md similarity index 100% rename from site/content/3.11/release-notes/version-3.3/incompatible-changes-in-3-3.md rename to site/content/arangodb/3.11/release-notes/version-3.3/incompatible-changes-in-3-3.md diff --git a/site/content/3.11/release-notes/version-3.3/known-issues-in-3-3.md b/site/content/arangodb/3.11/release-notes/version-3.3/known-issues-in-3-3.md similarity index 100% rename from site/content/3.11/release-notes/version-3.3/known-issues-in-3-3.md rename to site/content/arangodb/3.11/release-notes/version-3.3/known-issues-in-3-3.md diff --git a/site/content/3.11/release-notes/version-3.3/whats-new-in-3-3.md b/site/content/arangodb/3.11/release-notes/version-3.3/whats-new-in-3-3.md similarity index 100% rename from site/content/3.11/release-notes/version-3.3/whats-new-in-3-3.md rename to site/content/arangodb/3.11/release-notes/version-3.3/whats-new-in-3-3.md diff --git a/site/content/3.11/release-notes/version-3.4/_index.md b/site/content/arangodb/3.11/release-notes/version-3.4/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.4/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.4/_index.md diff --git a/site/content/3.11/release-notes/version-3.4/incompatible-changes-in-3-4.md b/site/content/arangodb/3.11/release-notes/version-3.4/incompatible-changes-in-3-4.md similarity index 100% rename from site/content/3.11/release-notes/version-3.4/incompatible-changes-in-3-4.md rename to site/content/arangodb/3.11/release-notes/version-3.4/incompatible-changes-in-3-4.md diff --git a/site/content/3.11/release-notes/version-3.4/known-issues-in-3-4.md b/site/content/arangodb/3.11/release-notes/version-3.4/known-issues-in-3-4.md similarity index 100% rename from site/content/3.11/release-notes/version-3.4/known-issues-in-3-4.md rename to site/content/arangodb/3.11/release-notes/version-3.4/known-issues-in-3-4.md diff --git a/site/content/3.11/release-notes/version-3.4/whats-new-in-3-4.md b/site/content/arangodb/3.11/release-notes/version-3.4/whats-new-in-3-4.md similarity index 100% rename from site/content/3.11/release-notes/version-3.4/whats-new-in-3-4.md rename to site/content/arangodb/3.11/release-notes/version-3.4/whats-new-in-3-4.md diff --git a/site/content/3.11/release-notes/version-3.5/_index.md b/site/content/arangodb/3.11/release-notes/version-3.5/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.5/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.5/_index.md diff --git a/site/content/3.11/release-notes/version-3.5/incompatible-changes-in-3-5.md b/site/content/arangodb/3.11/release-notes/version-3.5/incompatible-changes-in-3-5.md similarity index 100% rename from site/content/3.11/release-notes/version-3.5/incompatible-changes-in-3-5.md rename to site/content/arangodb/3.11/release-notes/version-3.5/incompatible-changes-in-3-5.md diff --git a/site/content/3.11/release-notes/version-3.5/known-issues-in-3-5.md b/site/content/arangodb/3.11/release-notes/version-3.5/known-issues-in-3-5.md similarity index 100% rename from site/content/3.11/release-notes/version-3.5/known-issues-in-3-5.md rename to site/content/arangodb/3.11/release-notes/version-3.5/known-issues-in-3-5.md diff --git a/site/content/3.11/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.11/release-notes/version-3.5/whats-new-in-3-5.md similarity index 100% rename from site/content/3.11/release-notes/version-3.5/whats-new-in-3-5.md rename to site/content/arangodb/3.11/release-notes/version-3.5/whats-new-in-3-5.md diff --git a/site/content/3.11/release-notes/version-3.6/_index.md b/site/content/arangodb/3.11/release-notes/version-3.6/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.6/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.6/_index.md diff --git a/site/content/3.11/release-notes/version-3.6/incompatible-changes-in-3-6.md b/site/content/arangodb/3.11/release-notes/version-3.6/incompatible-changes-in-3-6.md similarity index 100% rename from site/content/3.11/release-notes/version-3.6/incompatible-changes-in-3-6.md rename to site/content/arangodb/3.11/release-notes/version-3.6/incompatible-changes-in-3-6.md diff --git a/site/content/3.11/release-notes/version-3.6/known-issues-in-3-6.md b/site/content/arangodb/3.11/release-notes/version-3.6/known-issues-in-3-6.md similarity index 100% rename from site/content/3.11/release-notes/version-3.6/known-issues-in-3-6.md rename to site/content/arangodb/3.11/release-notes/version-3.6/known-issues-in-3-6.md diff --git a/site/content/3.11/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.11/release-notes/version-3.6/whats-new-in-3-6.md similarity index 100% rename from site/content/3.11/release-notes/version-3.6/whats-new-in-3-6.md rename to site/content/arangodb/3.11/release-notes/version-3.6/whats-new-in-3-6.md diff --git a/site/content/3.11/release-notes/version-3.7/_index.md b/site/content/arangodb/3.11/release-notes/version-3.7/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.7/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.7/_index.md diff --git a/site/content/3.11/release-notes/version-3.7/api-changes-in-3-7.md b/site/content/arangodb/3.11/release-notes/version-3.7/api-changes-in-3-7.md similarity index 100% rename from site/content/3.11/release-notes/version-3.7/api-changes-in-3-7.md rename to site/content/arangodb/3.11/release-notes/version-3.7/api-changes-in-3-7.md diff --git a/site/content/3.11/release-notes/version-3.7/incompatible-changes-in-3-7.md b/site/content/arangodb/3.11/release-notes/version-3.7/incompatible-changes-in-3-7.md similarity index 100% rename from site/content/3.11/release-notes/version-3.7/incompatible-changes-in-3-7.md rename to site/content/arangodb/3.11/release-notes/version-3.7/incompatible-changes-in-3-7.md diff --git a/site/content/3.11/release-notes/version-3.7/known-issues-in-3-7.md b/site/content/arangodb/3.11/release-notes/version-3.7/known-issues-in-3-7.md similarity index 100% rename from site/content/3.11/release-notes/version-3.7/known-issues-in-3-7.md rename to site/content/arangodb/3.11/release-notes/version-3.7/known-issues-in-3-7.md diff --git a/site/content/3.11/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.11/release-notes/version-3.7/whats-new-in-3-7.md similarity index 100% rename from site/content/3.11/release-notes/version-3.7/whats-new-in-3-7.md rename to site/content/arangodb/3.11/release-notes/version-3.7/whats-new-in-3-7.md diff --git a/site/content/3.11/release-notes/version-3.8/_index.md b/site/content/arangodb/3.11/release-notes/version-3.8/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.8/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.8/_index.md diff --git a/site/content/3.11/release-notes/version-3.8/api-changes-in-3-8.md b/site/content/arangodb/3.11/release-notes/version-3.8/api-changes-in-3-8.md similarity index 100% rename from site/content/3.11/release-notes/version-3.8/api-changes-in-3-8.md rename to site/content/arangodb/3.11/release-notes/version-3.8/api-changes-in-3-8.md diff --git a/site/content/3.11/release-notes/version-3.8/incompatible-changes-in-3-8.md b/site/content/arangodb/3.11/release-notes/version-3.8/incompatible-changes-in-3-8.md similarity index 100% rename from site/content/3.11/release-notes/version-3.8/incompatible-changes-in-3-8.md rename to site/content/arangodb/3.11/release-notes/version-3.8/incompatible-changes-in-3-8.md diff --git a/site/content/3.11/release-notes/version-3.8/known-issues-in-3-8.md b/site/content/arangodb/3.11/release-notes/version-3.8/known-issues-in-3-8.md similarity index 100% rename from site/content/3.11/release-notes/version-3.8/known-issues-in-3-8.md rename to site/content/arangodb/3.11/release-notes/version-3.8/known-issues-in-3-8.md diff --git a/site/content/3.11/release-notes/version-3.8/whats-new-in-3-8.md b/site/content/arangodb/3.11/release-notes/version-3.8/whats-new-in-3-8.md similarity index 100% rename from site/content/3.11/release-notes/version-3.8/whats-new-in-3-8.md rename to site/content/arangodb/3.11/release-notes/version-3.8/whats-new-in-3-8.md diff --git a/site/content/3.11/release-notes/version-3.9/_index.md b/site/content/arangodb/3.11/release-notes/version-3.9/_index.md similarity index 100% rename from site/content/3.11/release-notes/version-3.9/_index.md rename to site/content/arangodb/3.11/release-notes/version-3.9/_index.md diff --git a/site/content/3.11/release-notes/version-3.9/api-changes-in-3-9.md b/site/content/arangodb/3.11/release-notes/version-3.9/api-changes-in-3-9.md similarity index 100% rename from site/content/3.11/release-notes/version-3.9/api-changes-in-3-9.md rename to site/content/arangodb/3.11/release-notes/version-3.9/api-changes-in-3-9.md diff --git a/site/content/3.11/release-notes/version-3.9/incompatible-changes-in-3-9.md b/site/content/arangodb/3.11/release-notes/version-3.9/incompatible-changes-in-3-9.md similarity index 100% rename from site/content/3.11/release-notes/version-3.9/incompatible-changes-in-3-9.md rename to site/content/arangodb/3.11/release-notes/version-3.9/incompatible-changes-in-3-9.md diff --git a/site/content/3.11/release-notes/version-3.9/known-issues-in-3-9.md b/site/content/arangodb/3.11/release-notes/version-3.9/known-issues-in-3-9.md similarity index 100% rename from site/content/3.11/release-notes/version-3.9/known-issues-in-3-9.md rename to site/content/arangodb/3.11/release-notes/version-3.9/known-issues-in-3-9.md diff --git a/site/content/3.11/release-notes/version-3.9/whats-new-in-3-9.md b/site/content/arangodb/3.11/release-notes/version-3.9/whats-new-in-3-9.md similarity index 100% rename from site/content/3.11/release-notes/version-3.9/whats-new-in-3-9.md rename to site/content/arangodb/3.11/release-notes/version-3.9/whats-new-in-3-9.md diff --git a/site/content/3.12/_index.md b/site/content/arangodb/3.12/_index.md similarity index 58% rename from site/content/3.12/_index.md rename to site/content/arangodb/3.12/_index.md index cc569bfae0..9fe6125694 100644 --- a/site/content/3.12/_index.md +++ b/site/content/arangodb/3.12/_index.md @@ -1,14 +1,14 @@ --- title: Recommended Resources menuTitle: '3.12' -weight: 0 +weight: 1 layout: default --- {{< cloudbanner >}} {{< cards >}} -{{% card title="What is ArangoDB?" link="about-arangodb/" %}} +{{% card title="What is ArangoDB?" link="about/" %}} Get to know graphs, ArangoDB's use cases and features. {{% /card %}} @@ -17,24 +17,11 @@ Learn about ArangoDB's core concepts, how to interact with the database system, and get a server instance up and running. {{% /card %}} -{{% card title="ArangoGraph Insights Platform" link="arangograph/" %}} -Try out ArangoDB's fully-managed cloud offering for a faster time to value. -{{% /card %}} - {{% card title="AQL" link="aql/" %}} ArangoDB's Query Language AQL lets you use graphs, JSON documents, and search via a single, composable query language. {{% /card %}} -{{% card title="GenAI & Data Science" link="../platform/data-science/" %}} -Discover the graph-powered machine learning and GraphRAG features of ArangoDB. -{{% /card %}} - -{{% card title="ArangoDB Platform" link="../platform/" %}} -The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering -of products, including GraphML and GraphRAG. -{{% /card %}} - {{% card title="Deploy" link="deploy/" %}} Find the right deployment mode and set up your ArangoDB instance. {{% /card %}} diff --git a/site/content/3.12/about-arangodb/_index.md b/site/content/arangodb/3.12/about/_index.md similarity index 83% rename from site/content/3.12/about-arangodb/_index.md rename to site/content/arangodb/3.12/about/_index.md index ea7094cbb1..b998bac24e 100644 --- a/site/content/3.12/about-arangodb/_index.md +++ b/site/content/arangodb/3.12/about/_index.md @@ -9,7 +9,7 @@ aliases: - introduction - introduction/about-arangodb --- -![ArangoDB Overview Diagram](../../images/arangodb-overview-diagram.png) +![ArangoDB Overview Diagram](../../../images/arangodb-overview-diagram.png) ArangoDB combines the analytical power of native graphs with an integrated search engine, JSON support, and a variety of data access patterns via a single, @@ -17,25 +17,25 @@ composable query language. ArangoDB is available in a community and a commercial [edition](features/_index.md). You can use it for on-premises deployments, as well as a fully managed -cloud service, the [ArangoGraph Insights Platform](../arangograph/_index.md). +cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). ## What are Graphs? Graphs are information networks composed of nodes and edges. -![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../images/data-model-graph-relation-abstract-edge.png) +![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../../images/data-model-graph-relation-abstract-edge.png) A social network is a common example of a graph. People are represented by nodes and their friendships by relations. -![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../images/data-model-graph-relation-concrete.png) +![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../../images/data-model-graph-relation-concrete.png) Nodes are also called vertices (singular: vertex), and edges are relations that connect nodes. A node typically represents a specific entity (a person, a book, a sensor reading, etc.) and an edge defines how one entity relates to another. -![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../images/data-model-graph-relations.png) +![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../../images/data-model-graph-relations.png) This paradigm of storing data feels natural because it closely matches the cognitive model of humans. It is an expressive data model that allows you to @@ -48,7 +48,7 @@ Not everything is a graph use case. ArangoDB lets you equally work with structured, semi-structured, and unstructured data in the form of schema-free JSON objects, without having to connect these objects to form a graph. -![Person Mary, Book ArangoDB](../../images/data-model-document.png) +![Person Mary, Book ArangoDB](../../../images/data-model-document.png) Depending on your needs, you may mix graphs and unconnected data. ArangoDB is designed from the ground up to support multiple data models with a diff --git a/site/content/3.13/about-arangodb/features/_index.md b/site/content/arangodb/3.12/about/features/_index.md similarity index 94% rename from site/content/3.13/about-arangodb/features/_index.md rename to site/content/arangodb/3.12/about/features/_index.md index b1b00f00c5..674e603252 100644 --- a/site/content/3.13/about-arangodb/features/_index.md +++ b/site/content/arangodb/3.12/about/features/_index.md @@ -19,18 +19,18 @@ aliases: - Enhanced data security with on-disk and backup encryption, key rotation, audit logging, and incremental backups without downtime -See the full [Feature list of the ArangoDB core database system](core.md). +See the full [Feature list of the ArangoDB database system](list.md). For a scalable architecture based on Kubernetes that supports the full offering of ArangoDB including graph-powered machine learning and GenAI features, see -the [Feature list of the ArangoDB Platform](platform.md). +the [Feature list of the ArangoDB Platform](../../../../data-platform/about/features.md). ## On-premises versus Cloud ### Fully managed cloud service The fully managed multi-cloud -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is the easiest and fastest way to get started. It lets you deploy clusters with just a few clicks, and is operated by a dedicated team of ArangoDB engineers day and night. You can choose from a @@ -43,7 +43,7 @@ variety of support plans to meet your needs. - Highly secure with encryption at transit and at rest - Includes elastic scalability for all deployment models (OneShard and Sharded clusters) -To learn more, go to the [ArangoGraph documentation](../../arangograph/_index.md). +To learn more, go to the [ArangoGraph documentation](../../../../amp/_index.md). ### Self-managed in the cloud diff --git a/site/content/3.12/about-arangodb/features/highlights-by-version.md b/site/content/arangodb/3.12/about/features/highlights-by-version.md similarity index 100% rename from site/content/3.12/about-arangodb/features/highlights-by-version.md rename to site/content/arangodb/3.12/about/features/highlights-by-version.md diff --git a/site/content/3.12/about-arangodb/features/core.md b/site/content/arangodb/3.12/about/features/list.md similarity index 100% rename from site/content/3.12/about-arangodb/features/core.md rename to site/content/arangodb/3.12/about/features/list.md diff --git a/site/content/3.11/about-arangodb/use-cases.md b/site/content/arangodb/3.12/about/use-cases.md similarity index 77% rename from site/content/3.11/about-arangodb/use-cases.md rename to site/content/arangodb/3.12/about/use-cases.md index fab9e86a90..0128025595 100644 --- a/site/content/3.11/about-arangodb/use-cases.md +++ b/site/content/arangodb/3.12/about/use-cases.md @@ -19,7 +19,7 @@ more. ### Fraud Detection -{{< image src="../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Uncover illegal activities by discovering difficult-to-detect patterns. ArangoDB lets you look beyond individual data points in disparate data sources, @@ -29,7 +29,7 @@ complex fraudulent behavior such as fraud rings. ### Recommendation Engine -{{< image src="../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Suggest products, services, and information to users based on data relationships. For example, you can use ArangoDB together with PyTorch Geometric to build a @@ -39,7 +39,7 @@ with a graph neural network (GNN). ### Network Management -{{< image src="../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Reduce downtime by connecting and visualizing network, infrastructure, and code. Network devices and how they interconnect can naturally be modeled as a graph. @@ -49,7 +49,7 @@ bandwidth into account when path-finding. ### Customer 360 -{{< image src="../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Gain a complete understanding of your customers by integrating multiple data sources and code. ArangoDB can act as the platform to merge and consolidate @@ -58,7 +58,7 @@ track data origins using graph features. ### Identity and Access Management -{{< image src="../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Increase security and compliance by managing data access based on role and position. You can map out an organization chart as a graph and use ArangoDB to @@ -68,7 +68,7 @@ inheritance. ### Supply Chain -{{< image src="../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Speed shipments by monitoring and optimizing the flow of goods through a supply chain. You can represent your inventory, supplier, and delivery @@ -84,7 +84,7 @@ and scalable data store. ### Content Management -{{< image src="../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Store information of any kind without upfront schema declaration. ArangoDB is schema-free, storing every data record as a self-contained document, allowing @@ -93,7 +93,7 @@ content management system on top of ArangoDB. ### E-Commerce Systems -{{< image src="../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB combines data modeling freedom with strong consistency and resilience features to power online shops and ordering systems. Handle product catalog data @@ -102,7 +102,7 @@ checkouts with the necessary transactional guarantees. ### Internet of Things -{{< image src="../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Collect sensor readings and other IoT data in ArangoDB for a single view of everything. Store all data points in the same system that also lets you run @@ -110,7 +110,7 @@ aggregation queries using sliding windows for efficient data analysis. ## ArangoDB as a Key-Value Database -{{< image src="../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Key-value stores are the simplest kind of database systems. Each record is stored as a block of data under a key that uniquely identifies the record. @@ -134,7 +134,7 @@ For more information about how ArangoDB persists data, see ## ArangoDB as a Search Engine -{{< image src="../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB has a natively integrated search engine for a broad range of information retrieval needs. It is powered by inverted indexes and can index @@ -161,4 +161,4 @@ ArangoDB integrates well into existing data infrastructures and provides connectors for popular machine learning frameworks and data processing ecosystems. -![Machine Learning Architecture of ArangoDB](../../images/machine-learning-architecture.png) +![Machine Learning Architecture of ArangoDB](../../../images/machine-learning-architecture.png) diff --git a/site/content/3.12/aql/_index.md b/site/content/arangodb/3.12/aql/_index.md similarity index 96% rename from site/content/3.12/aql/_index.md rename to site/content/arangodb/3.12/aql/_index.md index befe676097..ef7dd67757 100644 --- a/site/content/3.12/aql/_index.md +++ b/site/content/arangodb/3.12/aql/_index.md @@ -6,7 +6,7 @@ description: >- The ArangoDB Query Language (AQL) lets you store, retrieve, and modify data in various ways in ArangoDB --- -- [Link to Platform](../../platform/data-science/_index.md) +- [Link to Platform](../../../data-platform/_index.md) AQL is mainly a declarative language, meaning that a query expresses what result should be achieved but not how it should be achieved. AQL aims to be diff --git a/site/content/3.12/aql/common-errors.md b/site/content/arangodb/3.12/aql/common-errors.md similarity index 100% rename from site/content/3.12/aql/common-errors.md rename to site/content/arangodb/3.12/aql/common-errors.md diff --git a/site/content/3.12/aql/data-queries.md b/site/content/arangodb/3.12/aql/data-queries.md similarity index 100% rename from site/content/3.12/aql/data-queries.md rename to site/content/arangodb/3.12/aql/data-queries.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/_index.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/_index.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/_index.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/_index.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/counting.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/counting.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/counting.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/counting.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/create-test-data.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/create-test-data.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/create-test-data.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/create-test-data.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/diffing-two-documents.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/diffing-two-documents.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/diffing-two-documents.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/diffing-two-documents.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/dynamic-attribute-names.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/dynamic-attribute-names.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/dynamic-attribute-names.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/dynamic-attribute-names.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/grouping.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/grouping.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/grouping.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/grouping.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/joins.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/joins.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/joins.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/joins.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/projections-and-filters.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/projections-and-filters.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/projections-and-filters.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/projections-and-filters.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/queries-without-collections.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/queries-without-collections.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/queries-without-collections.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/queries-without-collections.md diff --git a/site/content/3.12/aql/examples-and-query-patterns/remove-nodes.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/remove-nodes.md similarity index 96% rename from site/content/3.12/aql/examples-and-query-patterns/remove-nodes.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/remove-nodes.md index 8e9b0a9f61..a0843817e6 100644 --- a/site/content/3.12/aql/examples-and-query-patterns/remove-nodes.md +++ b/site/content/arangodb/3.12/aql/examples-and-query-patterns/remove-nodes.md @@ -17,7 +17,7 @@ However, as shown in this example based on the [Knows Graph](../../graphs/example-graphs.md#knows-graph), a query for this use case can be created. -![Example Graph](../../../images/knows_graph.png) +![Example Graph](../../../../images/knows_graph.png) When deleting node **eve** from the graph, we also want the edges `eve -> alice` and `eve -> bob` to be removed. @@ -61,7 +61,7 @@ For example, the [City Graph](../../graphs/example-graphs.md#city-graph) contains several node collections - `germanCity` and `frenchCity` and several edge collections - `french / german / international Highway`. -![Example Graph2](../../../images/cities_graph.png) +![Example Graph2](../../../../images/cities_graph.png) To delete city **Berlin** all edge collections `french / german / international Highway` have to be considered. The **REMOVE** operation has to be applied on all edge diff --git a/site/content/3.12/aql/examples-and-query-patterns/traversals.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/traversals.md similarity index 97% rename from site/content/3.12/aql/examples-and-query-patterns/traversals.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/traversals.md index 725885961c..f495de1e4b 100644 --- a/site/content/3.12/aql/examples-and-query-patterns/traversals.md +++ b/site/content/arangodb/3.12/aql/examples-and-query-patterns/traversals.md @@ -10,7 +10,7 @@ description: >- Our first example will locate the start node for a graph traversal via [a geo index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). We use the [City Graph](../../graphs/example-graphs.md#city-graph) and its geo indexes: -![Cities Example Graph](../../../images/cities_graph.png) +![Cities Example Graph](../../../../images/cities_graph.png) ```js --- diff --git a/site/content/3.12/aql/examples-and-query-patterns/upsert-repsert-guide.md b/site/content/arangodb/3.12/aql/examples-and-query-patterns/upsert-repsert-guide.md similarity index 100% rename from site/content/3.12/aql/examples-and-query-patterns/upsert-repsert-guide.md rename to site/content/arangodb/3.12/aql/examples-and-query-patterns/upsert-repsert-guide.md diff --git a/site/content/3.12/aql/execution-and-performance/_index.md b/site/content/arangodb/3.12/aql/execution-and-performance/_index.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/_index.md rename to site/content/arangodb/3.12/aql/execution-and-performance/_index.md diff --git a/site/content/3.12/aql/execution-and-performance/caching-query-plans.md b/site/content/arangodb/3.12/aql/execution-and-performance/caching-query-plans.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/caching-query-plans.md rename to site/content/arangodb/3.12/aql/execution-and-performance/caching-query-plans.md diff --git a/site/content/3.12/aql/execution-and-performance/caching-query-results.md b/site/content/arangodb/3.12/aql/execution-and-performance/caching-query-results.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/caching-query-results.md rename to site/content/arangodb/3.12/aql/execution-and-performance/caching-query-results.md diff --git a/site/content/3.12/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.12/aql/execution-and-performance/explaining-queries.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/explaining-queries.md rename to site/content/arangodb/3.12/aql/execution-and-performance/explaining-queries.md diff --git a/site/content/3.12/aql/execution-and-performance/parsing-queries.md b/site/content/arangodb/3.12/aql/execution-and-performance/parsing-queries.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/parsing-queries.md rename to site/content/arangodb/3.12/aql/execution-and-performance/parsing-queries.md diff --git a/site/content/3.12/aql/execution-and-performance/query-logging.md b/site/content/arangodb/3.12/aql/execution-and-performance/query-logging.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/query-logging.md rename to site/content/arangodb/3.12/aql/execution-and-performance/query-logging.md diff --git a/site/content/3.12/aql/execution-and-performance/query-optimization.md b/site/content/arangodb/3.12/aql/execution-and-performance/query-optimization.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/query-optimization.md rename to site/content/arangodb/3.12/aql/execution-and-performance/query-optimization.md diff --git a/site/content/3.12/aql/execution-and-performance/query-profiling.md b/site/content/arangodb/3.12/aql/execution-and-performance/query-profiling.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/query-profiling.md rename to site/content/arangodb/3.12/aql/execution-and-performance/query-profiling.md diff --git a/site/content/3.12/aql/execution-and-performance/query-statistics.md b/site/content/arangodb/3.12/aql/execution-and-performance/query-statistics.md similarity index 100% rename from site/content/3.12/aql/execution-and-performance/query-statistics.md rename to site/content/arangodb/3.12/aql/execution-and-performance/query-statistics.md diff --git a/site/content/3.12/aql/functions/_index.md b/site/content/arangodb/3.12/aql/functions/_index.md similarity index 100% rename from site/content/3.12/aql/functions/_index.md rename to site/content/arangodb/3.12/aql/functions/_index.md diff --git a/site/content/3.12/aql/functions/arangosearch.md b/site/content/arangodb/3.12/aql/functions/arangosearch.md similarity index 100% rename from site/content/3.12/aql/functions/arangosearch.md rename to site/content/arangodb/3.12/aql/functions/arangosearch.md diff --git a/site/content/3.12/aql/functions/array.md b/site/content/arangodb/3.12/aql/functions/array.md similarity index 100% rename from site/content/3.12/aql/functions/array.md rename to site/content/arangodb/3.12/aql/functions/array.md diff --git a/site/content/3.12/aql/functions/bit.md b/site/content/arangodb/3.12/aql/functions/bit.md similarity index 100% rename from site/content/3.12/aql/functions/bit.md rename to site/content/arangodb/3.12/aql/functions/bit.md diff --git a/site/content/3.12/aql/functions/date.md b/site/content/arangodb/3.12/aql/functions/date.md similarity index 100% rename from site/content/3.12/aql/functions/date.md rename to site/content/arangodb/3.12/aql/functions/date.md diff --git a/site/content/3.12/aql/functions/document-object.md b/site/content/arangodb/3.12/aql/functions/document-object.md similarity index 100% rename from site/content/3.12/aql/functions/document-object.md rename to site/content/arangodb/3.12/aql/functions/document-object.md diff --git a/site/content/3.12/aql/functions/fulltext.md b/site/content/arangodb/3.12/aql/functions/fulltext.md similarity index 100% rename from site/content/3.12/aql/functions/fulltext.md rename to site/content/arangodb/3.12/aql/functions/fulltext.md diff --git a/site/content/3.13/aql/functions/geo.md b/site/content/arangodb/3.12/aql/functions/geo.md similarity index 99% rename from site/content/3.13/aql/functions/geo.md rename to site/content/arangodb/3.12/aql/functions/geo.md index bc4558ee74..cf5b3f8a2d 100644 --- a/site/content/3.13/aql/functions/geo.md +++ b/site/content/arangodb/3.12/aql/functions/geo.md @@ -322,7 +322,7 @@ Consider the following polygon (remember that GeoJSON has ]] } ``` -![GeoJSON Polygon Geodesic](../../../images/geojson-polygon-geodesic.webp) +![GeoJSON Polygon Geodesic](../../../../images/geojson-polygon-geodesic.webp) It does not contain the point `[10, 47]` since the shortest path (geodesic) from `[4, 47]` to `[16, 47]` lies North relative to the parallel of latitude at @@ -359,7 +359,7 @@ Pole. ]] } ``` -![GeoJSON Polygon Counter-clockwise](../../../images/geojson-polygon-ccw.webp) +![GeoJSON Polygon Counter-clockwise](../../../../images/geojson-polygon-ccw.webp) On the other hand, the following polygon travels **clockwise** around the point `[10, 50]`, and thus its "interior" does not contain `[10, 50]`, but does @@ -371,7 +371,7 @@ contain the North Pole and the South Pole: ]] } ``` -![GeoJSON Polygon Clockwise](../../../images/geojson-polygon-cw.webp) +![GeoJSON Polygon Clockwise](../../../../images/geojson-polygon-cw.webp) Remember that the "interior" is to the left of the given linear ring, so this second polygon is basically the complement on Earth diff --git a/site/content/3.12/aql/functions/miscellaneous.md b/site/content/arangodb/3.12/aql/functions/miscellaneous.md similarity index 100% rename from site/content/3.12/aql/functions/miscellaneous.md rename to site/content/arangodb/3.12/aql/functions/miscellaneous.md diff --git a/site/content/3.12/aql/functions/numeric.md b/site/content/arangodb/3.12/aql/functions/numeric.md similarity index 100% rename from site/content/3.12/aql/functions/numeric.md rename to site/content/arangodb/3.12/aql/functions/numeric.md diff --git a/site/content/3.12/aql/functions/string.md b/site/content/arangodb/3.12/aql/functions/string.md similarity index 100% rename from site/content/3.12/aql/functions/string.md rename to site/content/arangodb/3.12/aql/functions/string.md diff --git a/site/content/3.12/aql/functions/type-check-and-cast.md b/site/content/arangodb/3.12/aql/functions/type-check-and-cast.md similarity index 100% rename from site/content/3.12/aql/functions/type-check-and-cast.md rename to site/content/arangodb/3.12/aql/functions/type-check-and-cast.md diff --git a/site/content/3.13/aql/functions/vector.md b/site/content/arangodb/3.12/aql/functions/vector.md similarity index 99% rename from site/content/3.13/aql/functions/vector.md rename to site/content/arangodb/3.12/aql/functions/vector.md index 45341b8ea8..a20c562137 100644 --- a/site/content/3.13/aql/functions/vector.md +++ b/site/content/arangodb/3.12/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../data-science/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../../gen-ai/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. {{< warning >}} diff --git a/site/content/3.12/aql/fundamentals/_index.md b/site/content/arangodb/3.12/aql/fundamentals/_index.md similarity index 100% rename from site/content/3.12/aql/fundamentals/_index.md rename to site/content/arangodb/3.12/aql/fundamentals/_index.md diff --git a/site/content/3.12/aql/fundamentals/accessing-data-from-collections.md b/site/content/arangodb/3.12/aql/fundamentals/accessing-data-from-collections.md similarity index 100% rename from site/content/3.12/aql/fundamentals/accessing-data-from-collections.md rename to site/content/arangodb/3.12/aql/fundamentals/accessing-data-from-collections.md diff --git a/site/content/3.12/aql/fundamentals/bind-parameters.md b/site/content/arangodb/3.12/aql/fundamentals/bind-parameters.md similarity index 100% rename from site/content/3.12/aql/fundamentals/bind-parameters.md rename to site/content/arangodb/3.12/aql/fundamentals/bind-parameters.md diff --git a/site/content/3.12/aql/fundamentals/data-types.md b/site/content/arangodb/3.12/aql/fundamentals/data-types.md similarity index 100% rename from site/content/3.12/aql/fundamentals/data-types.md rename to site/content/arangodb/3.12/aql/fundamentals/data-types.md diff --git a/site/content/3.12/aql/fundamentals/limitations.md b/site/content/arangodb/3.12/aql/fundamentals/limitations.md similarity index 100% rename from site/content/3.12/aql/fundamentals/limitations.md rename to site/content/arangodb/3.12/aql/fundamentals/limitations.md diff --git a/site/content/3.12/aql/fundamentals/query-errors.md b/site/content/arangodb/3.12/aql/fundamentals/query-errors.md similarity index 100% rename from site/content/3.12/aql/fundamentals/query-errors.md rename to site/content/arangodb/3.12/aql/fundamentals/query-errors.md diff --git a/site/content/3.12/aql/fundamentals/query-results.md b/site/content/arangodb/3.12/aql/fundamentals/query-results.md similarity index 100% rename from site/content/3.12/aql/fundamentals/query-results.md rename to site/content/arangodb/3.12/aql/fundamentals/query-results.md diff --git a/site/content/3.12/aql/fundamentals/subqueries.md b/site/content/arangodb/3.12/aql/fundamentals/subqueries.md similarity index 100% rename from site/content/3.12/aql/fundamentals/subqueries.md rename to site/content/arangodb/3.12/aql/fundamentals/subqueries.md diff --git a/site/content/3.12/aql/fundamentals/syntax.md b/site/content/arangodb/3.12/aql/fundamentals/syntax.md similarity index 100% rename from site/content/3.12/aql/fundamentals/syntax.md rename to site/content/arangodb/3.12/aql/fundamentals/syntax.md diff --git a/site/content/3.12/aql/fundamentals/type-and-value-order.md b/site/content/arangodb/3.12/aql/fundamentals/type-and-value-order.md similarity index 100% rename from site/content/3.12/aql/fundamentals/type-and-value-order.md rename to site/content/arangodb/3.12/aql/fundamentals/type-and-value-order.md diff --git a/site/content/3.12/aql/graphs/_index.md b/site/content/arangodb/3.12/aql/graphs/_index.md similarity index 100% rename from site/content/3.12/aql/graphs/_index.md rename to site/content/arangodb/3.12/aql/graphs/_index.md diff --git a/site/content/3.12/aql/graphs/all-shortest-paths.md b/site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md similarity index 98% rename from site/content/3.12/aql/graphs/all-shortest-paths.md rename to site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md index 69c770af05..bef591606d 100644 --- a/site/content/3.12/aql/graphs/all-shortest-paths.md +++ b/site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md @@ -19,7 +19,7 @@ Every returned path is a JSON object with two attributes: A visual representation of the example graph: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the nodes of the graph. Arrows represent train connections @@ -122,7 +122,7 @@ direction for each collection in your path search. Load an example graph to get a named graph that reflects some possible train connections in Europe and North America: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.12/aql/graphs/k-paths.md b/site/content/arangodb/3.12/aql/graphs/k-paths.md similarity index 98% rename from site/content/3.12/aql/graphs/k-paths.md rename to site/content/arangodb/3.12/aql/graphs/k-paths.md index 89b63f6f41..0c490ce041 100644 --- a/site/content/3.12/aql/graphs/k-paths.md +++ b/site/content/arangodb/3.12/aql/graphs/k-paths.md @@ -20,7 +20,7 @@ Every such path is returned as a JSON object with two components: Here is an example graph to explain how the k Paths algorithm works: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the nodes of the graph. Arrows represent train connections @@ -193,7 +193,7 @@ direction for each collection in your path search. You can load the `kShortestPathsGraph` example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.13/aql/graphs/k-shortest-paths.md b/site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md similarity index 98% rename from site/content/3.13/aql/graphs/k-shortest-paths.md rename to site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md index cad5ee1771..9c638740d7 100644 --- a/site/content/3.13/aql/graphs/k-shortest-paths.md +++ b/site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md @@ -25,7 +25,7 @@ If no `weightAttribute` is specified, the weight of the path is just its length. Here is an example graph to explain how the k Shortest Paths algorithm works: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the nodes of the graph. Arrows represent train connections @@ -191,7 +191,7 @@ direction for each collection in your path search. You can load the `kShortestPathsGraph` example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.13/aql/graphs/shortest-path.md b/site/content/arangodb/3.12/aql/graphs/shortest-path.md similarity index 98% rename from site/content/3.13/aql/graphs/shortest-path.md rename to site/content/arangodb/3.12/aql/graphs/shortest-path.md index 7f0b6421fa..e3cab31823 100644 --- a/site/content/3.13/aql/graphs/shortest-path.md +++ b/site/content/arangodb/3.12/aql/graphs/shortest-path.md @@ -23,7 +23,7 @@ the path: Let's take a look at a simple example to explain how it works. This is the graph that you are going to find a shortest path on: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) You can use the following parameters for the query: @@ -160,7 +160,7 @@ collections you expect to be involved. Creating a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.13/aql/graphs/traversals-explained.md b/site/content/arangodb/3.12/aql/graphs/traversals-explained.md similarity index 83% rename from site/content/3.13/aql/graphs/traversals-explained.md rename to site/content/arangodb/3.12/aql/graphs/traversals-explained.md index e090af2a1e..6d4300e161 100644 --- a/site/content/3.13/aql/graphs/traversals-explained.md +++ b/site/content/arangodb/3.12/aql/graphs/traversals-explained.md @@ -31,7 +31,7 @@ set with three items: Let's take a look at a simple example to explain how it works. This is the graph that we are going to traverse: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) We use the following parameters for our query: @@ -40,39 +40,39 @@ We use the following parameters for our query: 3. We use a *max* depth of 2. 4. We follow only in `OUTBOUND` direction of edges -![traversal graph step 1](../../../images/traversal_graph1.png) +![traversal graph step 1](../../../../images/traversal_graph1.png) Now it walks to one of the direct neighbors of **A**, say **B** (note: ordering is not guaranteed!): -![traversal graph step 2](../../../images/traversal_graph2.png) +![traversal graph step 2](../../../../images/traversal_graph2.png) The query will remember the state (red circle) and will emit the first result **A** → **B** (black box). This will also prevent the traverser to be trapped in cycles. Now again it will visit one of the direct neighbors of **B**, say **E**: -![traversal graph step 3](../../../images/traversal_graph3.png) +![traversal graph step 3](../../../../images/traversal_graph3.png) We have limited the query with a *max* depth of *2*, so it will not pick any neighbor of **E**, as the path from **A** to **E** already requires *2* steps. Instead, we will go back one level to **B** and continue with any other direct neighbor there: -![traversal graph step 4](../../../images/traversal_graph4.png) +![traversal graph step 4](../../../../images/traversal_graph4.png) Again after we produced this result we will step back to **B**. But there is no neighbor of **B** left that we have not yet visited. Hence we go another step back to **A** and continue with any other neighbor there. -![traversal graph step 5](../../../images/traversal_graph5.png) +![traversal graph step 5](../../../../images/traversal_graph5.png) And identical to the iterations before we will visit **H**: -![traversal graph step 6](../../../images/traversal_graph6.png) +![traversal graph step 6](../../../../images/traversal_graph6.png) And **J**: -![traversal graph step 7](../../../images/traversal_graph7.png) +![traversal graph step 7](../../../../images/traversal_graph7.png) After these steps there is no further result left. So all together this query has returned the following paths: diff --git a/site/content/3.12/aql/graphs/traversals.md b/site/content/arangodb/3.12/aql/graphs/traversals.md similarity index 99% rename from site/content/3.12/aql/graphs/traversals.md rename to site/content/arangodb/3.12/aql/graphs/traversals.md index d6ae7e2eeb..ef4870dfef 100644 --- a/site/content/3.12/aql/graphs/traversals.md +++ b/site/content/arangodb/3.12/aql/graphs/traversals.md @@ -378,7 +378,7 @@ FOR v, e, p IN 0..10 OUTBOUND "places/Toronto" GRAPH "kShortestPathsGraph" The above example shows a graph traversal using a [train station and connections dataset](../../graphs/example-graphs.md#k-shortest-paths-graph): -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) The traversal starts at **Toronto** (bottom left), the traversal depth is limited to 10, and every station is only visited once. The traversal could @@ -726,7 +726,7 @@ you may be interested in documents further down the path. Create a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.12/aql/high-level-operations/_index.md b/site/content/arangodb/3.12/aql/high-level-operations/_index.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/_index.md rename to site/content/arangodb/3.12/aql/high-level-operations/_index.md diff --git a/site/content/3.12/aql/high-level-operations/collect.md b/site/content/arangodb/3.12/aql/high-level-operations/collect.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/collect.md rename to site/content/arangodb/3.12/aql/high-level-operations/collect.md diff --git a/site/content/3.12/aql/high-level-operations/filter.md b/site/content/arangodb/3.12/aql/high-level-operations/filter.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/filter.md rename to site/content/arangodb/3.12/aql/high-level-operations/filter.md diff --git a/site/content/3.12/aql/high-level-operations/for.md b/site/content/arangodb/3.12/aql/high-level-operations/for.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/for.md rename to site/content/arangodb/3.12/aql/high-level-operations/for.md diff --git a/site/content/3.12/aql/high-level-operations/insert.md b/site/content/arangodb/3.12/aql/high-level-operations/insert.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/insert.md rename to site/content/arangodb/3.12/aql/high-level-operations/insert.md diff --git a/site/content/3.12/aql/high-level-operations/let.md b/site/content/arangodb/3.12/aql/high-level-operations/let.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/let.md rename to site/content/arangodb/3.12/aql/high-level-operations/let.md diff --git a/site/content/3.12/aql/high-level-operations/limit.md b/site/content/arangodb/3.12/aql/high-level-operations/limit.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/limit.md rename to site/content/arangodb/3.12/aql/high-level-operations/limit.md diff --git a/site/content/3.12/aql/high-level-operations/remove.md b/site/content/arangodb/3.12/aql/high-level-operations/remove.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/remove.md rename to site/content/arangodb/3.12/aql/high-level-operations/remove.md diff --git a/site/content/3.12/aql/high-level-operations/replace.md b/site/content/arangodb/3.12/aql/high-level-operations/replace.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/replace.md rename to site/content/arangodb/3.12/aql/high-level-operations/replace.md diff --git a/site/content/3.12/aql/high-level-operations/return.md b/site/content/arangodb/3.12/aql/high-level-operations/return.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/return.md rename to site/content/arangodb/3.12/aql/high-level-operations/return.md diff --git a/site/content/3.12/aql/high-level-operations/search.md b/site/content/arangodb/3.12/aql/high-level-operations/search.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/search.md rename to site/content/arangodb/3.12/aql/high-level-operations/search.md diff --git a/site/content/3.12/aql/high-level-operations/sort.md b/site/content/arangodb/3.12/aql/high-level-operations/sort.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/sort.md rename to site/content/arangodb/3.12/aql/high-level-operations/sort.md diff --git a/site/content/3.12/aql/high-level-operations/update.md b/site/content/arangodb/3.12/aql/high-level-operations/update.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/update.md rename to site/content/arangodb/3.12/aql/high-level-operations/update.md diff --git a/site/content/3.12/aql/high-level-operations/upsert.md b/site/content/arangodb/3.12/aql/high-level-operations/upsert.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/upsert.md rename to site/content/arangodb/3.12/aql/high-level-operations/upsert.md diff --git a/site/content/3.12/aql/high-level-operations/window.md b/site/content/arangodb/3.12/aql/high-level-operations/window.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/window.md rename to site/content/arangodb/3.12/aql/high-level-operations/window.md diff --git a/site/content/3.12/aql/high-level-operations/with.md b/site/content/arangodb/3.12/aql/high-level-operations/with.md similarity index 100% rename from site/content/3.12/aql/high-level-operations/with.md rename to site/content/arangodb/3.12/aql/high-level-operations/with.md diff --git a/site/content/3.12/aql/how-to-invoke-aql/_index.md b/site/content/arangodb/3.12/aql/how-to-invoke-aql/_index.md similarity index 100% rename from site/content/3.12/aql/how-to-invoke-aql/_index.md rename to site/content/arangodb/3.12/aql/how-to-invoke-aql/_index.md diff --git a/site/content/3.12/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/3.12/aql/how-to-invoke-aql/with-arangosh.md similarity index 100% rename from site/content/3.12/aql/how-to-invoke-aql/with-arangosh.md rename to site/content/arangodb/3.12/aql/how-to-invoke-aql/with-arangosh.md diff --git a/site/content/3.12/aql/how-to-invoke-aql/with-the-web-interface.md b/site/content/arangodb/3.12/aql/how-to-invoke-aql/with-the-web-interface.md similarity index 100% rename from site/content/3.12/aql/how-to-invoke-aql/with-the-web-interface.md rename to site/content/arangodb/3.12/aql/how-to-invoke-aql/with-the-web-interface.md diff --git a/site/content/3.12/aql/operators.md b/site/content/arangodb/3.12/aql/operators.md similarity index 100% rename from site/content/3.12/aql/operators.md rename to site/content/arangodb/3.12/aql/operators.md diff --git a/site/content/3.12/aql/user-defined-functions.md b/site/content/arangodb/3.12/aql/user-defined-functions.md similarity index 100% rename from site/content/3.12/aql/user-defined-functions.md rename to site/content/arangodb/3.12/aql/user-defined-functions.md diff --git a/site/content/3.12/components/_index.md b/site/content/arangodb/3.12/components/_index.md similarity index 100% rename from site/content/3.12/components/_index.md rename to site/content/arangodb/3.12/components/_index.md diff --git a/site/content/3.12/components/arangodb-server/_index.md b/site/content/arangodb/3.12/components/arangodb-server/_index.md similarity index 100% rename from site/content/3.12/components/arangodb-server/_index.md rename to site/content/arangodb/3.12/components/arangodb-server/_index.md diff --git a/site/content/3.12/components/arangodb-server/environment-variables.md b/site/content/arangodb/3.12/components/arangodb-server/environment-variables.md similarity index 100% rename from site/content/3.12/components/arangodb-server/environment-variables.md rename to site/content/arangodb/3.12/components/arangodb-server/environment-variables.md diff --git a/site/content/3.12/components/arangodb-server/options.md b/site/content/arangodb/3.12/components/arangodb-server/options.md similarity index 100% rename from site/content/3.12/components/arangodb-server/options.md rename to site/content/arangodb/3.12/components/arangodb-server/options.md diff --git a/site/content/3.12/components/arangodb-server/storage-engine.md b/site/content/arangodb/3.12/components/arangodb-server/storage-engine.md similarity index 100% rename from site/content/3.12/components/arangodb-server/storage-engine.md rename to site/content/arangodb/3.12/components/arangodb-server/storage-engine.md diff --git a/site/content/3.11/components/tools/_index.md b/site/content/arangodb/3.12/components/tools/_index.md similarity index 94% rename from site/content/3.11/components/tools/_index.md rename to site/content/arangodb/3.12/components/tools/_index.md index 72bf4118a4..9909dbe302 100644 --- a/site/content/3.11/components/tools/_index.md +++ b/site/content/arangodb/3.12/components/tools/_index.md @@ -31,5 +31,5 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../arangograph/oasisctl/_index.md) | Command-line tool for managing the ArangoGraph Insights Platform +| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) | [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/3.12/components/tools/arango-datasets.md b/site/content/arangodb/3.12/components/tools/arango-datasets.md similarity index 100% rename from site/content/3.12/components/tools/arango-datasets.md rename to site/content/arangodb/3.12/components/tools/arango-datasets.md diff --git a/site/content/3.13/components/tools/arangobackup/_index.md b/site/content/arangodb/3.12/components/tools/arangobackup/_index.md similarity index 92% rename from site/content/3.13/components/tools/arangobackup/_index.md rename to site/content/arangodb/3.12/components/tools/arangobackup/_index.md index 342c24c29a..fc71fd4547 100644 --- a/site/content/3.13/components/tools/arangobackup/_index.md +++ b/site/content/arangodb/3.12/components/tools/arangobackup/_index.md @@ -7,8 +7,8 @@ description: >- ArangoDB deployments --- {{< tip >}} -In the ArangoGraph Insights Platform, use managed -[Backups](../../../arangograph/backups.md) instead. +In the Arango Managed Platform (AMP), use managed +[Backups](../../../../../amp/backups.md) instead. {{< /tip >}} _arangobackup_ creates instantaneous and consistent diff --git a/site/content/3.12/components/tools/arangobackup/examples.md b/site/content/arangodb/3.12/components/tools/arangobackup/examples.md similarity index 100% rename from site/content/3.12/components/tools/arangobackup/examples.md rename to site/content/arangodb/3.12/components/tools/arangobackup/examples.md diff --git a/site/content/3.12/components/tools/arangobackup/options.md b/site/content/arangodb/3.12/components/tools/arangobackup/options.md similarity index 100% rename from site/content/3.12/components/tools/arangobackup/options.md rename to site/content/arangodb/3.12/components/tools/arangobackup/options.md diff --git a/site/content/3.12/components/tools/arangobench/_index.md b/site/content/arangodb/3.12/components/tools/arangobench/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangobench/_index.md rename to site/content/arangodb/3.12/components/tools/arangobench/_index.md diff --git a/site/content/3.12/components/tools/arangobench/options.md b/site/content/arangodb/3.12/components/tools/arangobench/options.md similarity index 100% rename from site/content/3.12/components/tools/arangobench/options.md rename to site/content/arangodb/3.12/components/tools/arangobench/options.md diff --git a/site/content/3.12/components/tools/arangodb-shell/_index.md b/site/content/arangodb/3.12/components/tools/arangodb-shell/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-shell/_index.md rename to site/content/arangodb/3.12/components/tools/arangodb-shell/_index.md diff --git a/site/content/3.12/components/tools/arangodb-shell/details.md b/site/content/arangodb/3.12/components/tools/arangodb-shell/details.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-shell/details.md rename to site/content/arangodb/3.12/components/tools/arangodb-shell/details.md diff --git a/site/content/3.12/components/tools/arangodb-shell/examples.md b/site/content/arangodb/3.12/components/tools/arangodb-shell/examples.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-shell/examples.md rename to site/content/arangodb/3.12/components/tools/arangodb-shell/examples.md diff --git a/site/content/3.12/components/tools/arangodb-shell/options.md b/site/content/arangodb/3.12/components/tools/arangodb-shell/options.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-shell/options.md rename to site/content/arangodb/3.12/components/tools/arangodb-shell/options.md diff --git a/site/content/3.12/components/tools/arangodb-starter/_index.md b/site/content/arangodb/3.12/components/tools/arangodb-starter/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-starter/_index.md rename to site/content/arangodb/3.12/components/tools/arangodb-starter/_index.md diff --git a/site/content/3.12/components/tools/arangodb-starter/architecture.md b/site/content/arangodb/3.12/components/tools/arangodb-starter/architecture.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-starter/architecture.md rename to site/content/arangodb/3.12/components/tools/arangodb-starter/architecture.md diff --git a/site/content/3.12/components/tools/arangodb-starter/options.md b/site/content/arangodb/3.12/components/tools/arangodb-starter/options.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-starter/options.md rename to site/content/arangodb/3.12/components/tools/arangodb-starter/options.md diff --git a/site/content/3.12/components/tools/arangodb-starter/security.md b/site/content/arangodb/3.12/components/tools/arangodb-starter/security.md similarity index 100% rename from site/content/3.12/components/tools/arangodb-starter/security.md rename to site/content/arangodb/3.12/components/tools/arangodb-starter/security.md diff --git a/site/content/3.12/components/tools/arangodump/_index.md b/site/content/arangodb/3.12/components/tools/arangodump/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangodump/_index.md rename to site/content/arangodb/3.12/components/tools/arangodump/_index.md diff --git a/site/content/3.12/components/tools/arangodump/examples.md b/site/content/arangodb/3.12/components/tools/arangodump/examples.md similarity index 100% rename from site/content/3.12/components/tools/arangodump/examples.md rename to site/content/arangodb/3.12/components/tools/arangodump/examples.md diff --git a/site/content/3.12/components/tools/arangodump/limitations.md b/site/content/arangodb/3.12/components/tools/arangodump/limitations.md similarity index 100% rename from site/content/3.12/components/tools/arangodump/limitations.md rename to site/content/arangodb/3.12/components/tools/arangodump/limitations.md diff --git a/site/content/3.12/components/tools/arangodump/maskings.md b/site/content/arangodb/3.12/components/tools/arangodump/maskings.md similarity index 100% rename from site/content/3.12/components/tools/arangodump/maskings.md rename to site/content/arangodb/3.12/components/tools/arangodump/maskings.md diff --git a/site/content/3.12/components/tools/arangodump/options.md b/site/content/arangodb/3.12/components/tools/arangodump/options.md similarity index 100% rename from site/content/3.12/components/tools/arangodump/options.md rename to site/content/arangodb/3.12/components/tools/arangodump/options.md diff --git a/site/content/3.12/components/tools/arangoexport/_index.md b/site/content/arangodb/3.12/components/tools/arangoexport/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangoexport/_index.md rename to site/content/arangodb/3.12/components/tools/arangoexport/_index.md diff --git a/site/content/3.12/components/tools/arangoexport/examples.md b/site/content/arangodb/3.12/components/tools/arangoexport/examples.md similarity index 100% rename from site/content/3.12/components/tools/arangoexport/examples.md rename to site/content/arangodb/3.12/components/tools/arangoexport/examples.md diff --git a/site/content/3.12/components/tools/arangoexport/options.md b/site/content/arangodb/3.12/components/tools/arangoexport/options.md similarity index 100% rename from site/content/3.12/components/tools/arangoexport/options.md rename to site/content/arangodb/3.12/components/tools/arangoexport/options.md diff --git a/site/content/3.12/components/tools/arangoimport/_index.md b/site/content/arangodb/3.12/components/tools/arangoimport/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangoimport/_index.md rename to site/content/arangodb/3.12/components/tools/arangoimport/_index.md diff --git a/site/content/3.12/components/tools/arangoimport/details.md b/site/content/arangodb/3.12/components/tools/arangoimport/details.md similarity index 100% rename from site/content/3.12/components/tools/arangoimport/details.md rename to site/content/arangodb/3.12/components/tools/arangoimport/details.md diff --git a/site/content/3.12/components/tools/arangoimport/examples-csv.md b/site/content/arangodb/3.12/components/tools/arangoimport/examples-csv.md similarity index 100% rename from site/content/3.12/components/tools/arangoimport/examples-csv.md rename to site/content/arangodb/3.12/components/tools/arangoimport/examples-csv.md diff --git a/site/content/3.12/components/tools/arangoimport/examples-json.md b/site/content/arangodb/3.12/components/tools/arangoimport/examples-json.md similarity index 100% rename from site/content/3.12/components/tools/arangoimport/examples-json.md rename to site/content/arangodb/3.12/components/tools/arangoimport/examples-json.md diff --git a/site/content/3.12/components/tools/arangoimport/options.md b/site/content/arangodb/3.12/components/tools/arangoimport/options.md similarity index 100% rename from site/content/3.12/components/tools/arangoimport/options.md rename to site/content/arangodb/3.12/components/tools/arangoimport/options.md diff --git a/site/content/3.12/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.12/components/tools/arangoinspect/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangoinspect/_index.md rename to site/content/arangodb/3.12/components/tools/arangoinspect/_index.md diff --git a/site/content/3.12/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.12/components/tools/arangoinspect/examples.md similarity index 100% rename from site/content/3.12/components/tools/arangoinspect/examples.md rename to site/content/arangodb/3.12/components/tools/arangoinspect/examples.md diff --git a/site/content/3.12/components/tools/arangoinspect/options.md b/site/content/arangodb/3.12/components/tools/arangoinspect/options.md similarity index 100% rename from site/content/3.12/components/tools/arangoinspect/options.md rename to site/content/arangodb/3.12/components/tools/arangoinspect/options.md diff --git a/site/content/3.12/components/tools/arangorestore/_index.md b/site/content/arangodb/3.12/components/tools/arangorestore/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangorestore/_index.md rename to site/content/arangodb/3.12/components/tools/arangorestore/_index.md diff --git a/site/content/3.12/components/tools/arangorestore/examples.md b/site/content/arangodb/3.12/components/tools/arangorestore/examples.md similarity index 100% rename from site/content/3.12/components/tools/arangorestore/examples.md rename to site/content/arangodb/3.12/components/tools/arangorestore/examples.md diff --git a/site/content/3.12/components/tools/arangorestore/options.md b/site/content/arangodb/3.12/components/tools/arangorestore/options.md similarity index 100% rename from site/content/3.12/components/tools/arangorestore/options.md rename to site/content/arangodb/3.12/components/tools/arangorestore/options.md diff --git a/site/content/3.12/components/tools/arangovpack/_index.md b/site/content/arangodb/3.12/components/tools/arangovpack/_index.md similarity index 100% rename from site/content/3.12/components/tools/arangovpack/_index.md rename to site/content/arangodb/3.12/components/tools/arangovpack/_index.md diff --git a/site/content/3.12/components/tools/arangovpack/options.md b/site/content/arangodb/3.12/components/tools/arangovpack/options.md similarity index 100% rename from site/content/3.12/components/tools/arangovpack/options.md rename to site/content/arangodb/3.12/components/tools/arangovpack/options.md diff --git a/site/content/3.12/components/tools/foxx-cli/_index.md b/site/content/arangodb/3.12/components/tools/foxx-cli/_index.md similarity index 100% rename from site/content/3.12/components/tools/foxx-cli/_index.md rename to site/content/arangodb/3.12/components/tools/foxx-cli/_index.md diff --git a/site/content/3.12/components/tools/foxx-cli/details.md b/site/content/arangodb/3.12/components/tools/foxx-cli/details.md similarity index 100% rename from site/content/3.12/components/tools/foxx-cli/details.md rename to site/content/arangodb/3.12/components/tools/foxx-cli/details.md diff --git a/site/content/3.12/components/web-interface/_index.md b/site/content/arangodb/3.12/components/web-interface/_index.md similarity index 89% rename from site/content/3.12/components/web-interface/_index.md rename to site/content/arangodb/3.12/components/web-interface/_index.md index 42934ab4f6..5d3412cdac 100644 --- a/site/content/3.12/components/web-interface/_index.md +++ b/site/content/arangodb/3.12/components/web-interface/_index.md @@ -13,4 +13,4 @@ convenient way. Statistics and server status are provided as well. The web interface (also referred to as Web UI, frontend or *Aardvark*) can be accessed with a browser under the URL `http://localhost:8529` with default server settings. -![Single-server Web Interface](../../../images/ui-dashboard312.webp) +![Single-server Web Interface](../../../../images/ui-dashboard312.webp) diff --git a/site/content/3.12/components/web-interface/cluster.md b/site/content/arangodb/3.12/components/web-interface/cluster.md similarity index 97% rename from site/content/3.12/components/web-interface/cluster.md rename to site/content/arangodb/3.12/components/web-interface/cluster.md index 9662f6c93c..75807b2a42 100644 --- a/site/content/3.12/components/web-interface/cluster.md +++ b/site/content/arangodb/3.12/components/web-interface/cluster.md @@ -16,7 +16,7 @@ You can access the logs of individual Coordinators and DB-Servers via the The **Cluster** section displays statistics about the general cluster performance. -![Web Interface Cluster Dashboard](../../../images/ui-cluster-dashboard312.webp) +![Web Interface Cluster Dashboard](../../../../images/ui-cluster-dashboard312.webp) Statistics: diff --git a/site/content/3.12/components/web-interface/collections.md b/site/content/arangodb/3.12/components/web-interface/collections.md similarity index 100% rename from site/content/3.12/components/web-interface/collections.md rename to site/content/arangodb/3.12/components/web-interface/collections.md diff --git a/site/content/3.12/components/web-interface/dashboard.md b/site/content/arangodb/3.12/components/web-interface/dashboard.md similarity index 90% rename from site/content/3.12/components/web-interface/dashboard.md rename to site/content/arangodb/3.12/components/web-interface/dashboard.md index 9a6bcf5feb..b1018e2f80 100644 --- a/site/content/3.12/components/web-interface/dashboard.md +++ b/site/content/arangodb/3.12/components/web-interface/dashboard.md @@ -7,7 +7,7 @@ description: '' The **Dashboard** section provides statistics which are polled regularly from the ArangoDB server. -![Web Interface Dashboard](../../../images/ui-dashboard312.webp) +![Web Interface Dashboard](../../../../images/ui-dashboard312.webp) There is a different interface for [Cluster](cluster.md) deployments. diff --git a/site/content/3.12/components/web-interface/document.md b/site/content/arangodb/3.12/components/web-interface/document.md similarity index 100% rename from site/content/3.12/components/web-interface/document.md rename to site/content/arangodb/3.12/components/web-interface/document.md diff --git a/site/content/3.13/components/web-interface/graphs.md b/site/content/arangodb/3.12/components/web-interface/graphs.md similarity index 98% rename from site/content/3.13/components/web-interface/graphs.md rename to site/content/arangodb/3.12/components/web-interface/graphs.md index 9b298a16ec..d601939a70 100644 --- a/site/content/3.13/components/web-interface/graphs.md +++ b/site/content/arangodb/3.12/components/web-interface/graphs.md @@ -57,7 +57,7 @@ their direct neighbors are selected. You can select one or more start nodes and change the depth and the limit in the settings panel. You can also load the entire graph via the toolbar, but only use this with small graphs. -![The graph viewer with the settings panel open](../../../images/graphViewer312.png) +![The graph viewer with the settings panel open](../../../../images/graphViewer312.png) ### Viewport diff --git a/site/content/3.12/components/web-interface/logs.md b/site/content/arangodb/3.12/components/web-interface/logs.md similarity index 100% rename from site/content/3.12/components/web-interface/logs.md rename to site/content/arangodb/3.12/components/web-interface/logs.md diff --git a/site/content/3.12/components/web-interface/queries.md b/site/content/arangodb/3.12/components/web-interface/queries.md similarity index 98% rename from site/content/3.12/components/web-interface/queries.md rename to site/content/arangodb/3.12/components/web-interface/queries.md index 7c65ffc809..4da1b6f706 100644 --- a/site/content/3.12/components/web-interface/queries.md +++ b/site/content/arangodb/3.12/components/web-interface/queries.md @@ -14,7 +14,7 @@ The query view offers you three different subviews: The web interface offers a AQL Query Editor: -![Editor Input](../../../images/queryEditorInput312.png) +![Editor Input](../../../../images/queryEditorInput312.png) The editor is split into two parts, the query editor pane and the pane for bind variables and query options. diff --git a/site/content/3.12/components/web-interface/services.md b/site/content/arangodb/3.12/components/web-interface/services.md similarity index 100% rename from site/content/3.12/components/web-interface/services.md rename to site/content/arangodb/3.12/components/web-interface/services.md diff --git a/site/content/3.12/components/web-interface/users.md b/site/content/arangodb/3.12/components/web-interface/users.md similarity index 100% rename from site/content/3.12/components/web-interface/users.md rename to site/content/arangodb/3.12/components/web-interface/users.md diff --git a/site/content/3.12/concepts/_index.md b/site/content/arangodb/3.12/concepts/_index.md similarity index 100% rename from site/content/3.12/concepts/_index.md rename to site/content/arangodb/3.12/concepts/_index.md diff --git a/site/content/3.12/concepts/data-models.md b/site/content/arangodb/3.12/concepts/data-models.md similarity index 100% rename from site/content/3.12/concepts/data-models.md rename to site/content/arangodb/3.12/concepts/data-models.md diff --git a/site/content/3.12/concepts/data-retrieval.md b/site/content/arangodb/3.12/concepts/data-retrieval.md similarity index 100% rename from site/content/3.12/concepts/data-retrieval.md rename to site/content/arangodb/3.12/concepts/data-retrieval.md diff --git a/site/content/3.12/concepts/data-structure/_index.md b/site/content/arangodb/3.12/concepts/data-structure/_index.md similarity index 100% rename from site/content/3.12/concepts/data-structure/_index.md rename to site/content/arangodb/3.12/concepts/data-structure/_index.md diff --git a/site/content/3.12/concepts/data-structure/collections.md b/site/content/arangodb/3.12/concepts/data-structure/collections.md similarity index 100% rename from site/content/3.12/concepts/data-structure/collections.md rename to site/content/arangodb/3.12/concepts/data-structure/collections.md diff --git a/site/content/3.12/concepts/data-structure/databases.md b/site/content/arangodb/3.12/concepts/data-structure/databases.md similarity index 100% rename from site/content/3.12/concepts/data-structure/databases.md rename to site/content/arangodb/3.12/concepts/data-structure/databases.md diff --git a/site/content/3.12/concepts/data-structure/documents/_index.md b/site/content/arangodb/3.12/concepts/data-structure/documents/_index.md similarity index 100% rename from site/content/3.12/concepts/data-structure/documents/_index.md rename to site/content/arangodb/3.12/concepts/data-structure/documents/_index.md diff --git a/site/content/3.12/concepts/data-structure/documents/computed-values.md b/site/content/arangodb/3.12/concepts/data-structure/documents/computed-values.md similarity index 100% rename from site/content/3.12/concepts/data-structure/documents/computed-values.md rename to site/content/arangodb/3.12/concepts/data-structure/documents/computed-values.md diff --git a/site/content/3.12/concepts/data-structure/documents/schema-validation.md b/site/content/arangodb/3.12/concepts/data-structure/documents/schema-validation.md similarity index 100% rename from site/content/3.12/concepts/data-structure/documents/schema-validation.md rename to site/content/arangodb/3.12/concepts/data-structure/documents/schema-validation.md diff --git a/site/content/3.12/concepts/data-structure/views.md b/site/content/arangodb/3.12/concepts/data-structure/views.md similarity index 100% rename from site/content/3.12/concepts/data-structure/views.md rename to site/content/arangodb/3.12/concepts/data-structure/views.md diff --git a/site/content/3.12/deploy/_index.md b/site/content/arangodb/3.12/deploy/_index.md similarity index 94% rename from site/content/3.12/deploy/_index.md rename to site/content/arangodb/3.12/deploy/_index.md index e99d1d56e5..499c517066 100644 --- a/site/content/3.12/deploy/_index.md +++ b/site/content/arangodb/3.12/deploy/_index.md @@ -48,9 +48,9 @@ for multi-tenant use cases. The ArangoDB Platform is the umbrella for deploying and operating the entire ArangoDB product offering with a unified interface in a Kubernetes cluster. It is offered for self-hosting on-prem or in the cloud and as a managed service, -superseding the ArangoGraph Insights Platform. +superseding the Arango Managed Platform (AMP). -See [The ArangoDB Platform](../../platform/about-the-platform/_index.md) for details. +See [The ArangoDB Platform](../../../data-platform/about/_index.md) for details. ## How to deploy @@ -68,7 +68,7 @@ There are different ways to set up and operate ArangoDB. ArangoDB Kubernetes Operator (`kube-arangodb`). The fastest way to get ArangoDB up and running is to run it in the cloud - the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) offers a fully managed cloud service, available on AWS and GCP. ### Manual Deployment @@ -115,7 +115,7 @@ If you want a specific version, download the precompiled executable via the ### Run in the cloud - [AWS and Azure](in-the-cloud.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS and GCP ### Run in Kubernetes diff --git a/site/content/3.12/deploy/architecture/_index.md b/site/content/arangodb/3.12/deploy/architecture/_index.md similarity index 100% rename from site/content/3.12/deploy/architecture/_index.md rename to site/content/arangodb/3.12/deploy/architecture/_index.md diff --git a/site/content/3.12/deploy/architecture/data-sharding.md b/site/content/arangodb/3.12/deploy/architecture/data-sharding.md similarity index 98% rename from site/content/3.12/deploy/architecture/data-sharding.md rename to site/content/arangodb/3.12/deploy/architecture/data-sharding.md index a677edbfd6..61e67cb5d9 100644 --- a/site/content/3.12/deploy/architecture/data-sharding.md +++ b/site/content/arangodb/3.12/deploy/architecture/data-sharding.md @@ -44,7 +44,7 @@ cost-effective than pre-provisioning a single large machine. Increased complexity in infrastructure can be managed using modern containerization and cluster orchestrations tools like [Kubernetes](../kubernetes.md). -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) To achieve this ArangoDB splits your dataset into so called _shards_. The number of shards is something you may choose according to your needs. Proper sharding @@ -84,7 +84,7 @@ a given document is to be stored. Choosing the right shard key can have significant impact on your performance can reduce network traffic and increase performance. -![Hash Sharding](../../../images/cluster_sharding_hash.jpg) +![Hash Sharding](../../../../images/cluster_sharding_hash.jpg) ArangoDB uses consistent hashing to compute the target shard from the given values (as specified via by the `shardKeys` collection property). The ideal set diff --git a/site/content/3.12/deploy/architecture/replication.md b/site/content/arangodb/3.12/deploy/architecture/replication.md similarity index 100% rename from site/content/3.12/deploy/architecture/replication.md rename to site/content/arangodb/3.12/deploy/architecture/replication.md diff --git a/site/content/3.12/deploy/architecture/scalability.md b/site/content/arangodb/3.12/deploy/architecture/scalability.md similarity index 100% rename from site/content/3.12/deploy/architecture/scalability.md rename to site/content/arangodb/3.12/deploy/architecture/scalability.md diff --git a/site/content/3.12/deploy/cluster/_index.md b/site/content/arangodb/3.12/deploy/cluster/_index.md similarity index 98% rename from site/content/3.12/deploy/cluster/_index.md rename to site/content/arangodb/3.12/deploy/cluster/_index.md index 7a285ae5cd..fe840ace5d 100644 --- a/site/content/3.12/deploy/cluster/_index.md +++ b/site/content/arangodb/3.12/deploy/cluster/_index.md @@ -39,7 +39,7 @@ roles: - _Coordinators_ - _DB-Servers_. -![ArangoDB Cluster](../../../images/cluster-topology.png) +![ArangoDB Cluster](../../../../images/cluster-topology.png) ### Agents @@ -137,7 +137,7 @@ automatically to the different servers. In many situations one can also reap a benefit in data throughput, again because the load can be distributed to multiple machines. -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) From the outside this process is fully transparent: An application may talk to any _Coordinator_ and @@ -380,7 +380,7 @@ See the [Cluster Deployment](deployment/_index.md) chapter for instructions. ArangoDB is also available as a cloud service, the -[**ArangoGraph Insights Platform**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[**Arango Managed Platform (AMP)**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). ## Cluster ID diff --git a/site/content/3.12/deploy/cluster/administration.md b/site/content/arangodb/3.12/deploy/cluster/administration.md similarity index 100% rename from site/content/3.12/deploy/cluster/administration.md rename to site/content/arangodb/3.12/deploy/cluster/administration.md diff --git a/site/content/3.12/deploy/cluster/deployment/_index.md b/site/content/arangodb/3.12/deploy/cluster/deployment/_index.md similarity index 97% rename from site/content/3.12/deploy/cluster/deployment/_index.md rename to site/content/arangodb/3.12/deploy/cluster/deployment/_index.md index 102d40bed3..5d6d6232f2 100644 --- a/site/content/3.12/deploy/cluster/deployment/_index.md +++ b/site/content/arangodb/3.12/deploy/cluster/deployment/_index.md @@ -9,7 +9,7 @@ You can deploy an ArangoDB cluster in different ways: - [Using the ArangoDB Starter](using-the-arangodb-starter.md) - [Manual Start](manual-start.md) - [Kubernetes](../../kubernetes.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS and GCP ## Preliminary Information For Debian/Ubuntu Systems diff --git a/site/content/3.12/deploy/cluster/deployment/manual-start.md b/site/content/arangodb/3.12/deploy/cluster/deployment/manual-start.md similarity index 100% rename from site/content/3.12/deploy/cluster/deployment/manual-start.md rename to site/content/arangodb/3.12/deploy/cluster/deployment/manual-start.md diff --git a/site/content/3.12/deploy/cluster/deployment/using-the-arangodb-starter.md b/site/content/arangodb/3.12/deploy/cluster/deployment/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.12/deploy/cluster/deployment/using-the-arangodb-starter.md rename to site/content/arangodb/3.12/deploy/cluster/deployment/using-the-arangodb-starter.md diff --git a/site/content/3.12/deploy/cluster/limitations.md b/site/content/arangodb/3.12/deploy/cluster/limitations.md similarity index 100% rename from site/content/3.12/deploy/cluster/limitations.md rename to site/content/arangodb/3.12/deploy/cluster/limitations.md diff --git a/site/content/3.12/deploy/in-the-cloud.md b/site/content/arangodb/3.12/deploy/in-the-cloud.md similarity index 100% rename from site/content/3.12/deploy/in-the-cloud.md rename to site/content/arangodb/3.12/deploy/in-the-cloud.md diff --git a/site/content/3.12/deploy/kubernetes.md b/site/content/arangodb/3.12/deploy/kubernetes.md similarity index 100% rename from site/content/3.12/deploy/kubernetes.md rename to site/content/arangodb/3.12/deploy/kubernetes.md diff --git a/site/content/3.12/deploy/oneshard.md b/site/content/arangodb/3.12/deploy/oneshard.md similarity index 99% rename from site/content/3.12/deploy/oneshard.md rename to site/content/arangodb/3.12/deploy/oneshard.md index cb7ed57fe7..eeaffdd7ad 100644 --- a/site/content/3.12/deploy/oneshard.md +++ b/site/content/arangodb/3.12/deploy/oneshard.md @@ -48,7 +48,7 @@ because they need to send and receive data on several connections, build up results for collection accesses from the received parts followed by further processing. -![OneShard vs. Sharded Cluster Setup](../../images/cluster-sharded-oneshard.png) +![OneShard vs. Sharded Cluster Setup](../../../images/cluster-sharded-oneshard.png) If the database involved in a query is a OneShard database, then the OneShard optimization can be applied to run the query on the diff --git a/site/content/3.12/deploy/production-checklist.md b/site/content/arangodb/3.12/deploy/production-checklist.md similarity index 100% rename from site/content/3.12/deploy/production-checklist.md rename to site/content/arangodb/3.12/deploy/production-checklist.md diff --git a/site/content/3.12/deploy/single-instance-vs-cluster.md b/site/content/arangodb/3.12/deploy/single-instance-vs-cluster.md similarity index 100% rename from site/content/3.12/deploy/single-instance-vs-cluster.md rename to site/content/arangodb/3.12/deploy/single-instance-vs-cluster.md diff --git a/site/content/3.12/deploy/single-instance/_index.md b/site/content/arangodb/3.12/deploy/single-instance/_index.md similarity index 100% rename from site/content/3.12/deploy/single-instance/_index.md rename to site/content/arangodb/3.12/deploy/single-instance/_index.md diff --git a/site/content/3.12/deploy/single-instance/manual-start.md b/site/content/arangodb/3.12/deploy/single-instance/manual-start.md similarity index 100% rename from site/content/3.12/deploy/single-instance/manual-start.md rename to site/content/arangodb/3.12/deploy/single-instance/manual-start.md diff --git a/site/content/3.12/deploy/single-instance/using-the-arangodb-starter.md b/site/content/arangodb/3.12/deploy/single-instance/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.12/deploy/single-instance/using-the-arangodb-starter.md rename to site/content/arangodb/3.12/deploy/single-instance/using-the-arangodb-starter.md diff --git a/site/content/3.12/develop/_index.md b/site/content/arangodb/3.12/develop/_index.md similarity index 100% rename from site/content/3.12/develop/_index.md rename to site/content/arangodb/3.12/develop/_index.md diff --git a/site/content/3.12/develop/drivers/_index.md b/site/content/arangodb/3.12/develop/drivers/_index.md similarity index 100% rename from site/content/3.12/develop/drivers/_index.md rename to site/content/arangodb/3.12/develop/drivers/_index.md diff --git a/site/content/3.12/develop/drivers/go.md b/site/content/arangodb/3.12/develop/drivers/go.md similarity index 100% rename from site/content/3.12/develop/drivers/go.md rename to site/content/arangodb/3.12/develop/drivers/go.md diff --git a/site/content/3.12/develop/drivers/java/_index.md b/site/content/arangodb/3.12/develop/drivers/java/_index.md similarity index 100% rename from site/content/3.12/develop/drivers/java/_index.md rename to site/content/arangodb/3.12/develop/drivers/java/_index.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-6/_index.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-6/_index.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-6/_index.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-6/_index.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-6/driver-setup.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-6/driver-setup.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-6/driver-setup.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-6/driver-setup.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-6/serialization.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-6/serialization.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-6/serialization.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-6/serialization.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-7/_index.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-7/_index.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-7/_index.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-7/_index.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-7/changes-in-version-7.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-7/changes-in-version-7.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-7/changes-in-version-7.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-7/changes-in-version-7.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-7/driver-setup.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-7/driver-setup.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-7/driver-setup.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-7/driver-setup.md diff --git a/site/content/3.12/develop/drivers/java/reference-version-7/serialization.md b/site/content/arangodb/3.12/develop/drivers/java/reference-version-7/serialization.md similarity index 100% rename from site/content/3.12/develop/drivers/java/reference-version-7/serialization.md rename to site/content/arangodb/3.12/develop/drivers/java/reference-version-7/serialization.md diff --git a/site/content/3.12/develop/drivers/javascript.md b/site/content/arangodb/3.12/develop/drivers/javascript.md similarity index 100% rename from site/content/3.12/develop/drivers/javascript.md rename to site/content/arangodb/3.12/develop/drivers/javascript.md diff --git a/site/content/3.12/develop/drivers/python.md b/site/content/arangodb/3.12/develop/drivers/python.md similarity index 100% rename from site/content/3.12/develop/drivers/python.md rename to site/content/arangodb/3.12/develop/drivers/python.md diff --git a/site/content/3.12/develop/error-codes.md b/site/content/arangodb/3.12/develop/error-codes.md similarity index 100% rename from site/content/3.12/develop/error-codes.md rename to site/content/arangodb/3.12/develop/error-codes.md diff --git a/site/content/3.12/develop/exit-codes.md b/site/content/arangodb/3.12/develop/exit-codes.md similarity index 100% rename from site/content/3.12/develop/exit-codes.md rename to site/content/arangodb/3.12/develop/exit-codes.md diff --git a/site/content/3.12/develop/foxx-microservices/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/deployment.md b/site/content/arangodb/3.12/develop/foxx-microservices/deployment.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/deployment.md rename to site/content/arangodb/3.12/develop/foxx-microservices/deployment.md diff --git a/site/content/3.12/develop/foxx-microservices/getting-started.md b/site/content/arangodb/3.12/develop/foxx-microservices/getting-started.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/getting-started.md rename to site/content/arangodb/3.12/develop/foxx-microservices/getting-started.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/access-from-the-browser.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/access-from-the-browser.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/access-from-the-browser.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/access-from-the-browser.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/authentication-and-sessions.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/authentication-and-sessions.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/authentication-and-sessions.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/development-mode.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/development-mode.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/development-mode.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/development-mode.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/foxx-in-a-cluster.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/foxx-in-a-cluster.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/foxx-in-a-cluster.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/foxx-in-a-cluster.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/linking-services-together.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/linking-services-together.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/linking-services-together.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/linking-services-together.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/making-requests.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/making-requests.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/making-requests.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/making-requests.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/scripts-and-scheduling.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/scripts-and-scheduling.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/scripts-and-scheduling.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/scripts-and-scheduling.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/testing-foxx-services.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/testing-foxx-services.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/testing-foxx-services.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/testing-foxx-services.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/using-node-modules.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/using-node-modules.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/using-node-modules.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/using-node-modules.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/using-webpack-with-foxx.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/using-webpack-with-foxx.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/using-webpack-with-foxx.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/using-webpack-with-foxx.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/working-with-collections.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/working-with-collections.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/working-with-collections.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/working-with-collections.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/working-with-files.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/working-with-files.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/working-with-files.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/working-with-files.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/working-with-routers.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/working-with-routers.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/working-with-routers.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/working-with-routers.md diff --git a/site/content/3.12/develop/foxx-microservices/guides/writing-queries.md b/site/content/arangodb/3.12/develop/foxx-microservices/guides/writing-queries.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/guides/writing-queries.md rename to site/content/arangodb/3.12/develop/foxx-microservices/guides/writing-queries.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/configuration.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/configuration.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/configuration.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/configuration.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/related-modules/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/related-modules/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/related-modules/authentication.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/authentication.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/related-modules/authentication.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/authentication.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/related-modules/graphql.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/graphql.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/related-modules/graphql.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/graphql.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/related-modules/oauth-2-0.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/oauth-2-0.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/related-modules/oauth-2-0.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/oauth-2-0.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/related-modules/queues.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/queues.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/related-modules/queues.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/related-modules/queues.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/routers/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/routers/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/routers/endpoints.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/endpoints.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/routers/endpoints.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/endpoints.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/routers/middleware.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/middleware.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/routers/middleware.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/middleware.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/routers/request.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/request.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/routers/request.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/request.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/routers/response.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/response.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/routers/response.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/routers/response.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/service-context.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/service-context.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/service-context.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/service-context.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/service-manifest.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/service-manifest.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/service-manifest.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/service-manifest.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md diff --git a/site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md b/site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md similarity index 100% rename from site/content/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md rename to site/content/arangodb/3.12/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md diff --git a/site/content/3.12/develop/http-api/_index.md b/site/content/arangodb/3.12/develop/http-api/_index.md similarity index 98% rename from site/content/3.12/develop/http-api/_index.md rename to site/content/arangodb/3.12/develop/http-api/_index.md index 2a6b57b51e..e42c7b49f3 100644 --- a/site/content/3.12/develop/http-api/_index.md +++ b/site/content/arangodb/3.12/develop/http-api/_index.md @@ -105,7 +105,7 @@ You can explore the API with the interactive **Swagger UI** using the 2. Click the **Rest API** tab. 3. Click a section and endpoint to view the description and parameters. -![The web interface with the navigation on the left and the tabs at the top](../../../images/swagger_serverapi_overview312.png) +![The web interface with the navigation on the left and the tabs at the top](../../../../images/swagger_serverapi_overview312.png) Also see this blog post: [Using the ArangoDB Swagger.io Interactive API Documentation](https://www.arangodb.com/2018/03/using-arangodb-swaggerio-interactive-api-documentation/). diff --git a/site/content/3.12/develop/http-api/administration.md b/site/content/arangodb/3.12/develop/http-api/administration.md similarity index 100% rename from site/content/3.12/develop/http-api/administration.md rename to site/content/arangodb/3.12/develop/http-api/administration.md diff --git a/site/content/3.12/develop/http-api/analyzers.md b/site/content/arangodb/3.12/develop/http-api/analyzers.md similarity index 100% rename from site/content/3.12/develop/http-api/analyzers.md rename to site/content/arangodb/3.12/develop/http-api/analyzers.md diff --git a/site/content/3.12/develop/http-api/authentication.md b/site/content/arangodb/3.12/develop/http-api/authentication.md similarity index 99% rename from site/content/3.12/develop/http-api/authentication.md rename to site/content/arangodb/3.12/develop/http-api/authentication.md index dcae69cdcb..7c004950b4 100644 --- a/site/content/3.12/develop/http-api/authentication.md +++ b/site/content/arangodb/3.12/develop/http-api/authentication.md @@ -938,7 +938,7 @@ assert(response.tokens?.length === 0); ## Hot-reload JWT secrets {{< tip >}} -In the ArangoGraph Insights Platform, authentication secrets are managed and +In the Arango Managed Platform (AMP), authentication secrets are managed and therefore this feature isn't available. {{< /tip >}} diff --git a/site/content/3.12/develop/http-api/batch-requests.md b/site/content/arangodb/3.12/develop/http-api/batch-requests.md similarity index 100% rename from site/content/3.12/develop/http-api/batch-requests.md rename to site/content/arangodb/3.12/develop/http-api/batch-requests.md diff --git a/site/content/3.12/develop/http-api/cluster.md b/site/content/arangodb/3.12/develop/http-api/cluster.md similarity index 100% rename from site/content/3.12/develop/http-api/cluster.md rename to site/content/arangodb/3.12/develop/http-api/cluster.md diff --git a/site/content/3.12/develop/http-api/collections.md b/site/content/arangodb/3.12/develop/http-api/collections.md similarity index 100% rename from site/content/3.12/develop/http-api/collections.md rename to site/content/arangodb/3.12/develop/http-api/collections.md diff --git a/site/content/3.12/develop/http-api/databases.md b/site/content/arangodb/3.12/develop/http-api/databases.md similarity index 100% rename from site/content/3.12/develop/http-api/databases.md rename to site/content/arangodb/3.12/develop/http-api/databases.md diff --git a/site/content/3.12/develop/http-api/documents.md b/site/content/arangodb/3.12/develop/http-api/documents.md similarity index 100% rename from site/content/3.12/develop/http-api/documents.md rename to site/content/arangodb/3.12/develop/http-api/documents.md diff --git a/site/content/3.12/develop/http-api/foxx.md b/site/content/arangodb/3.12/develop/http-api/foxx.md similarity index 100% rename from site/content/3.12/develop/http-api/foxx.md rename to site/content/arangodb/3.12/develop/http-api/foxx.md diff --git a/site/content/3.12/develop/http-api/general-request-handling.md b/site/content/arangodb/3.12/develop/http-api/general-request-handling.md similarity index 100% rename from site/content/3.12/develop/http-api/general-request-handling.md rename to site/content/arangodb/3.12/develop/http-api/general-request-handling.md diff --git a/site/content/3.12/develop/http-api/graphs/_index.md b/site/content/arangodb/3.12/develop/http-api/graphs/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/graphs/_index.md rename to site/content/arangodb/3.12/develop/http-api/graphs/_index.md diff --git a/site/content/3.12/develop/http-api/graphs/edges.md b/site/content/arangodb/3.12/develop/http-api/graphs/edges.md similarity index 100% rename from site/content/3.12/develop/http-api/graphs/edges.md rename to site/content/arangodb/3.12/develop/http-api/graphs/edges.md diff --git a/site/content/3.12/develop/http-api/graphs/named-graphs.md b/site/content/arangodb/3.12/develop/http-api/graphs/named-graphs.md similarity index 99% rename from site/content/3.12/develop/http-api/graphs/named-graphs.md rename to site/content/arangodb/3.12/develop/http-api/graphs/named-graphs.md index 5f5123ad4b..88602a529a 100644 --- a/site/content/3.12/develop/http-api/graphs/named-graphs.md +++ b/site/content/arangodb/3.12/develop/http-api/graphs/named-graphs.md @@ -18,11 +18,11 @@ The examples use the following example graphs: [_Social Graph_](../../../graphs/example-graphs.md#social-graph): -![Social Example Graph](../../../../images/social_graph.png) +![Social Example Graph](../../../../../images/social_graph.png) [_Knows Graph_](../../../graphs/example-graphs.md#knows-graph): -![Social Example Graph](../../../../images/knows_graph.png) +![Social Example Graph](../../../../../images/knows_graph.png) ## Management diff --git a/site/content/3.12/develop/http-api/hot-backups.md b/site/content/arangodb/3.12/develop/http-api/hot-backups.md similarity index 99% rename from site/content/3.12/develop/http-api/hot-backups.md rename to site/content/arangodb/3.12/develop/http-api/hot-backups.md index a585b2244c..d1962db6f9 100644 --- a/site/content/3.12/develop/http-api/hot-backups.md +++ b/site/content/arangodb/3.12/develop/http-api/hot-backups.md @@ -7,8 +7,8 @@ description: >- backups --- {{< tip >}} -In the ArangoGraph Insights Platform, use managed -[Backups](../../arangograph/backups.md) instead. +In the Arango Managed Platform (AMP), use managed +[Backups](../../../../amp/backups.md) instead. {{< /tip >}} Hot Backups are near instantaneous consistent snapshots of an diff --git a/site/content/3.12/develop/http-api/import.md b/site/content/arangodb/3.12/develop/http-api/import.md similarity index 100% rename from site/content/3.12/develop/http-api/import.md rename to site/content/arangodb/3.12/develop/http-api/import.md diff --git a/site/content/3.12/develop/http-api/indexes/_index.md b/site/content/arangodb/3.12/develop/http-api/indexes/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/_index.md rename to site/content/arangodb/3.12/develop/http-api/indexes/_index.md diff --git a/site/content/3.12/develop/http-api/indexes/fulltext.md b/site/content/arangodb/3.12/develop/http-api/indexes/fulltext.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/fulltext.md rename to site/content/arangodb/3.12/develop/http-api/indexes/fulltext.md diff --git a/site/content/3.12/develop/http-api/indexes/geo-spatial.md b/site/content/arangodb/3.12/develop/http-api/indexes/geo-spatial.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/geo-spatial.md rename to site/content/arangodb/3.12/develop/http-api/indexes/geo-spatial.md diff --git a/site/content/3.12/develop/http-api/indexes/inverted.md b/site/content/arangodb/3.12/develop/http-api/indexes/inverted.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/inverted.md rename to site/content/arangodb/3.12/develop/http-api/indexes/inverted.md diff --git a/site/content/3.12/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/3.12/develop/http-api/indexes/multi-dimensional.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/multi-dimensional.md rename to site/content/arangodb/3.12/develop/http-api/indexes/multi-dimensional.md diff --git a/site/content/3.12/develop/http-api/indexes/persistent.md b/site/content/arangodb/3.12/develop/http-api/indexes/persistent.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/persistent.md rename to site/content/arangodb/3.12/develop/http-api/indexes/persistent.md diff --git a/site/content/3.12/develop/http-api/indexes/ttl.md b/site/content/arangodb/3.12/develop/http-api/indexes/ttl.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/ttl.md rename to site/content/arangodb/3.12/develop/http-api/indexes/ttl.md diff --git a/site/content/3.12/develop/http-api/indexes/vector.md b/site/content/arangodb/3.12/develop/http-api/indexes/vector.md similarity index 100% rename from site/content/3.12/develop/http-api/indexes/vector.md rename to site/content/arangodb/3.12/develop/http-api/indexes/vector.md diff --git a/site/content/3.12/develop/http-api/jobs.md b/site/content/arangodb/3.12/develop/http-api/jobs.md similarity index 100% rename from site/content/3.12/develop/http-api/jobs.md rename to site/content/arangodb/3.12/develop/http-api/jobs.md diff --git a/site/content/3.12/develop/http-api/monitoring/_index.md b/site/content/arangodb/3.12/develop/http-api/monitoring/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/monitoring/_index.md rename to site/content/arangodb/3.12/develop/http-api/monitoring/_index.md diff --git a/site/content/3.12/develop/http-api/monitoring/logs.md b/site/content/arangodb/3.12/develop/http-api/monitoring/logs.md similarity index 100% rename from site/content/3.12/develop/http-api/monitoring/logs.md rename to site/content/arangodb/3.12/develop/http-api/monitoring/logs.md diff --git a/site/content/3.12/develop/http-api/monitoring/metrics.md b/site/content/arangodb/3.12/develop/http-api/monitoring/metrics.md similarity index 100% rename from site/content/3.12/develop/http-api/monitoring/metrics.md rename to site/content/arangodb/3.12/develop/http-api/monitoring/metrics.md diff --git a/site/content/3.12/develop/http-api/monitoring/statistics.md b/site/content/arangodb/3.12/develop/http-api/monitoring/statistics.md similarity index 100% rename from site/content/3.12/develop/http-api/monitoring/statistics.md rename to site/content/arangodb/3.12/develop/http-api/monitoring/statistics.md diff --git a/site/content/3.12/develop/http-api/queries/_index.md b/site/content/arangodb/3.12/develop/http-api/queries/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/queries/_index.md rename to site/content/arangodb/3.12/develop/http-api/queries/_index.md diff --git a/site/content/3.12/develop/http-api/queries/aql-queries.md b/site/content/arangodb/3.12/develop/http-api/queries/aql-queries.md similarity index 100% rename from site/content/3.12/develop/http-api/queries/aql-queries.md rename to site/content/arangodb/3.12/develop/http-api/queries/aql-queries.md diff --git a/site/content/3.12/develop/http-api/queries/aql-query-plan-cache.md b/site/content/arangodb/3.12/develop/http-api/queries/aql-query-plan-cache.md similarity index 100% rename from site/content/3.12/develop/http-api/queries/aql-query-plan-cache.md rename to site/content/arangodb/3.12/develop/http-api/queries/aql-query-plan-cache.md diff --git a/site/content/3.12/develop/http-api/queries/aql-query-results-cache.md b/site/content/arangodb/3.12/develop/http-api/queries/aql-query-results-cache.md similarity index 100% rename from site/content/3.12/develop/http-api/queries/aql-query-results-cache.md rename to site/content/arangodb/3.12/develop/http-api/queries/aql-query-results-cache.md diff --git a/site/content/3.12/develop/http-api/queries/user-defined-aql-functions.md b/site/content/arangodb/3.12/develop/http-api/queries/user-defined-aql-functions.md similarity index 100% rename from site/content/3.12/develop/http-api/queries/user-defined-aql-functions.md rename to site/content/arangodb/3.12/develop/http-api/queries/user-defined-aql-functions.md diff --git a/site/content/3.12/develop/http-api/replication/_index.md b/site/content/arangodb/3.12/develop/http-api/replication/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/replication/_index.md rename to site/content/arangodb/3.12/develop/http-api/replication/_index.md diff --git a/site/content/3.12/develop/http-api/replication/other-replication-commands.md b/site/content/arangodb/3.12/develop/http-api/replication/other-replication-commands.md similarity index 100% rename from site/content/3.12/develop/http-api/replication/other-replication-commands.md rename to site/content/arangodb/3.12/develop/http-api/replication/other-replication-commands.md diff --git a/site/content/3.12/develop/http-api/replication/replication-applier.md b/site/content/arangodb/3.12/develop/http-api/replication/replication-applier.md similarity index 100% rename from site/content/3.12/develop/http-api/replication/replication-applier.md rename to site/content/arangodb/3.12/develop/http-api/replication/replication-applier.md diff --git a/site/content/3.12/develop/http-api/replication/replication-dump.md b/site/content/arangodb/3.12/develop/http-api/replication/replication-dump.md similarity index 100% rename from site/content/3.12/develop/http-api/replication/replication-dump.md rename to site/content/arangodb/3.12/develop/http-api/replication/replication-dump.md diff --git a/site/content/3.12/develop/http-api/replication/replication-logger.md b/site/content/arangodb/3.12/develop/http-api/replication/replication-logger.md similarity index 100% rename from site/content/3.12/develop/http-api/replication/replication-logger.md rename to site/content/arangodb/3.12/develop/http-api/replication/replication-logger.md diff --git a/site/content/3.12/develop/http-api/replication/write-ahead-log.md b/site/content/arangodb/3.12/develop/http-api/replication/write-ahead-log.md similarity index 100% rename from site/content/3.12/develop/http-api/replication/write-ahead-log.md rename to site/content/arangodb/3.12/develop/http-api/replication/write-ahead-log.md diff --git a/site/content/3.12/develop/http-api/security.md b/site/content/arangodb/3.12/develop/http-api/security.md similarity index 100% rename from site/content/3.12/develop/http-api/security.md rename to site/content/arangodb/3.12/develop/http-api/security.md diff --git a/site/content/3.12/develop/http-api/tasks.md b/site/content/arangodb/3.12/develop/http-api/tasks.md similarity index 100% rename from site/content/3.12/develop/http-api/tasks.md rename to site/content/arangodb/3.12/develop/http-api/tasks.md diff --git a/site/content/3.12/develop/http-api/transactions/_index.md b/site/content/arangodb/3.12/develop/http-api/transactions/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/transactions/_index.md rename to site/content/arangodb/3.12/develop/http-api/transactions/_index.md diff --git a/site/content/3.12/develop/http-api/transactions/javascript-transactions.md b/site/content/arangodb/3.12/develop/http-api/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.12/develop/http-api/transactions/javascript-transactions.md rename to site/content/arangodb/3.12/develop/http-api/transactions/javascript-transactions.md diff --git a/site/content/3.12/develop/http-api/transactions/stream-transactions.md b/site/content/arangodb/3.12/develop/http-api/transactions/stream-transactions.md similarity index 100% rename from site/content/3.12/develop/http-api/transactions/stream-transactions.md rename to site/content/arangodb/3.12/develop/http-api/transactions/stream-transactions.md diff --git a/site/content/3.12/develop/http-api/users.md b/site/content/arangodb/3.12/develop/http-api/users.md similarity index 100% rename from site/content/3.12/develop/http-api/users.md rename to site/content/arangodb/3.12/develop/http-api/users.md diff --git a/site/content/3.12/develop/http-api/views/_index.md b/site/content/arangodb/3.12/develop/http-api/views/_index.md similarity index 100% rename from site/content/3.12/develop/http-api/views/_index.md rename to site/content/arangodb/3.12/develop/http-api/views/_index.md diff --git a/site/content/3.12/develop/http-api/views/arangosearch-views.md b/site/content/arangodb/3.12/develop/http-api/views/arangosearch-views.md similarity index 100% rename from site/content/3.12/develop/http-api/views/arangosearch-views.md rename to site/content/arangodb/3.12/develop/http-api/views/arangosearch-views.md diff --git a/site/content/3.12/develop/http-api/views/search-alias-views.md b/site/content/arangodb/3.12/develop/http-api/views/search-alias-views.md similarity index 100% rename from site/content/3.12/develop/http-api/views/search-alias-views.md rename to site/content/arangodb/3.12/develop/http-api/views/search-alias-views.md diff --git a/site/content/3.12/develop/integrations/_index.md b/site/content/arangodb/3.12/develop/integrations/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/_index.md rename to site/content/arangodb/3.12/develop/integrations/_index.md diff --git a/site/content/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md b/site/content/arangodb/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md similarity index 99% rename from site/content/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md rename to site/content/arangodb/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md index b05d1acfb1..1124193864 100644 --- a/site/content/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md +++ b/site/content/arangodb/3.12/develop/integrations/arangodb-datasource-for-apache-spark.md @@ -374,7 +374,7 @@ The following Spark SQL data types (subtypes of `org.apache.spark.sql.types.Filt - `MapType` (only with key type `StringType`) - `StructType` -## Connect to the ArangoGraph Insights Platform +## Connect to the Arango Managed Platform (AMP) To connect to SSL secured deployments using X.509 Base64 encoded CA certificate (ArangoGraph): diff --git a/site/content/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md b/site/content/arangodb/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md rename to site/content/arangodb/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md diff --git a/site/content/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md b/site/content/arangodb/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md similarity index 100% rename from site/content/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md rename to site/content/arangodb/3.12/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md diff --git a/site/content/3.12/develop/integrations/spring-boot-arangodb.md b/site/content/arangodb/3.12/develop/integrations/spring-boot-arangodb.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-boot-arangodb.md rename to site/content/arangodb/3.12/develop/integrations/spring-boot-arangodb.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/migration.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/migration.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/migration.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/migration.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/template.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/template.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-3/template.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-3/template.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md diff --git a/site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/template.md b/site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/template.md similarity index 100% rename from site/content/3.12/develop/integrations/spring-data-arangodb/reference-version-4/template.md rename to site/content/arangodb/3.12/develop/integrations/spring-data-arangodb/reference-version-4/template.md diff --git a/site/content/3.12/develop/javascript-api/@arangodb/_index.md b/site/content/arangodb/3.12/develop/javascript-api/@arangodb/_index.md similarity index 100% rename from site/content/3.12/develop/javascript-api/@arangodb/_index.md rename to site/content/arangodb/3.12/develop/javascript-api/@arangodb/_index.md diff --git a/site/content/3.12/develop/javascript-api/@arangodb/collection-object.md b/site/content/arangodb/3.12/develop/javascript-api/@arangodb/collection-object.md similarity index 100% rename from site/content/3.12/develop/javascript-api/@arangodb/collection-object.md rename to site/content/arangodb/3.12/develop/javascript-api/@arangodb/collection-object.md diff --git a/site/content/3.12/develop/javascript-api/@arangodb/cursor-object.md b/site/content/arangodb/3.12/develop/javascript-api/@arangodb/cursor-object.md similarity index 100% rename from site/content/3.12/develop/javascript-api/@arangodb/cursor-object.md rename to site/content/arangodb/3.12/develop/javascript-api/@arangodb/cursor-object.md diff --git a/site/content/3.12/develop/javascript-api/@arangodb/db-object.md b/site/content/arangodb/3.12/develop/javascript-api/@arangodb/db-object.md similarity index 100% rename from site/content/3.12/develop/javascript-api/@arangodb/db-object.md rename to site/content/arangodb/3.12/develop/javascript-api/@arangodb/db-object.md diff --git a/site/content/3.12/develop/javascript-api/@arangodb/view-object.md b/site/content/arangodb/3.12/develop/javascript-api/@arangodb/view-object.md similarity index 100% rename from site/content/3.12/develop/javascript-api/@arangodb/view-object.md rename to site/content/arangodb/3.12/develop/javascript-api/@arangodb/view-object.md diff --git a/site/content/3.12/develop/javascript-api/_index.md b/site/content/arangodb/3.12/develop/javascript-api/_index.md similarity index 100% rename from site/content/3.12/develop/javascript-api/_index.md rename to site/content/arangodb/3.12/develop/javascript-api/_index.md diff --git a/site/content/3.12/develop/javascript-api/actions.md b/site/content/arangodb/3.12/develop/javascript-api/actions.md similarity index 100% rename from site/content/3.12/develop/javascript-api/actions.md rename to site/content/arangodb/3.12/develop/javascript-api/actions.md diff --git a/site/content/3.12/develop/javascript-api/analyzers.md b/site/content/arangodb/3.12/develop/javascript-api/analyzers.md similarity index 100% rename from site/content/3.12/develop/javascript-api/analyzers.md rename to site/content/arangodb/3.12/develop/javascript-api/analyzers.md diff --git a/site/content/3.12/develop/javascript-api/aql-queries.md b/site/content/arangodb/3.12/develop/javascript-api/aql-queries.md similarity index 100% rename from site/content/3.12/develop/javascript-api/aql-queries.md rename to site/content/arangodb/3.12/develop/javascript-api/aql-queries.md diff --git a/site/content/3.12/develop/javascript-api/console.md b/site/content/arangodb/3.12/develop/javascript-api/console.md similarity index 100% rename from site/content/3.12/develop/javascript-api/console.md rename to site/content/arangodb/3.12/develop/javascript-api/console.md diff --git a/site/content/3.12/develop/javascript-api/crypto.md b/site/content/arangodb/3.12/develop/javascript-api/crypto.md similarity index 100% rename from site/content/3.12/develop/javascript-api/crypto.md rename to site/content/arangodb/3.12/develop/javascript-api/crypto.md diff --git a/site/content/3.12/develop/javascript-api/fs.md b/site/content/arangodb/3.12/develop/javascript-api/fs.md similarity index 100% rename from site/content/3.12/develop/javascript-api/fs.md rename to site/content/arangodb/3.12/develop/javascript-api/fs.md diff --git a/site/content/3.12/develop/javascript-api/request.md b/site/content/arangodb/3.12/develop/javascript-api/request.md similarity index 100% rename from site/content/3.12/develop/javascript-api/request.md rename to site/content/arangodb/3.12/develop/javascript-api/request.md diff --git a/site/content/3.12/develop/javascript-api/tasks.md b/site/content/arangodb/3.12/develop/javascript-api/tasks.md similarity index 100% rename from site/content/3.12/develop/javascript-api/tasks.md rename to site/content/arangodb/3.12/develop/javascript-api/tasks.md diff --git a/site/content/3.12/develop/operational-factors.md b/site/content/arangodb/3.12/develop/operational-factors.md similarity index 100% rename from site/content/3.12/develop/operational-factors.md rename to site/content/arangodb/3.12/develop/operational-factors.md diff --git a/site/content/3.12/develop/satellitecollections.md b/site/content/arangodb/3.12/develop/satellitecollections.md similarity index 100% rename from site/content/3.12/develop/satellitecollections.md rename to site/content/arangodb/3.12/develop/satellitecollections.md diff --git a/site/content/3.12/develop/smartjoins.md b/site/content/arangodb/3.12/develop/smartjoins.md similarity index 100% rename from site/content/3.12/develop/smartjoins.md rename to site/content/arangodb/3.12/develop/smartjoins.md diff --git a/site/content/3.12/develop/transactions/_index.md b/site/content/arangodb/3.12/develop/transactions/_index.md similarity index 100% rename from site/content/3.12/develop/transactions/_index.md rename to site/content/arangodb/3.12/develop/transactions/_index.md diff --git a/site/content/3.12/develop/transactions/durability.md b/site/content/arangodb/3.12/develop/transactions/durability.md similarity index 100% rename from site/content/3.12/develop/transactions/durability.md rename to site/content/arangodb/3.12/develop/transactions/durability.md diff --git a/site/content/3.12/develop/transactions/javascript-transactions.md b/site/content/arangodb/3.12/develop/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.12/develop/transactions/javascript-transactions.md rename to site/content/arangodb/3.12/develop/transactions/javascript-transactions.md diff --git a/site/content/3.12/develop/transactions/limitations.md b/site/content/arangodb/3.12/develop/transactions/limitations.md similarity index 100% rename from site/content/3.12/develop/transactions/limitations.md rename to site/content/arangodb/3.12/develop/transactions/limitations.md diff --git a/site/content/3.12/develop/transactions/locking-and-isolation.md b/site/content/arangodb/3.12/develop/transactions/locking-and-isolation.md similarity index 100% rename from site/content/3.12/develop/transactions/locking-and-isolation.md rename to site/content/arangodb/3.12/develop/transactions/locking-and-isolation.md diff --git a/site/content/3.12/develop/transactions/stream-transactions.md b/site/content/arangodb/3.12/develop/transactions/stream-transactions.md similarity index 100% rename from site/content/3.12/develop/transactions/stream-transactions.md rename to site/content/arangodb/3.12/develop/transactions/stream-transactions.md diff --git a/site/content/3.12/get-started/_index.md b/site/content/arangodb/3.12/get-started/_index.md similarity index 100% rename from site/content/3.12/get-started/_index.md rename to site/content/arangodb/3.12/get-started/_index.md diff --git a/site/content/3.12/get-started/how-to-interact-with-arangodb.md b/site/content/arangodb/3.12/get-started/how-to-interact-with-arangodb.md similarity index 100% rename from site/content/3.12/get-started/how-to-interact-with-arangodb.md rename to site/content/arangodb/3.12/get-started/how-to-interact-with-arangodb.md diff --git a/site/content/3.12/get-started/on-premises-installation.md b/site/content/arangodb/3.12/get-started/on-premises-installation.md similarity index 93% rename from site/content/3.12/get-started/on-premises-installation.md rename to site/content/arangodb/3.12/get-started/on-premises-installation.md index 1e4aea9cbf..a2e549904f 100644 --- a/site/content/3.12/get-started/on-premises-installation.md +++ b/site/content/arangodb/3.12/get-started/on-premises-installation.md @@ -28,16 +28,16 @@ Depending on the installation method used, the installation process either prompted for the root password or the default root password is empty (see [Securing the installation](.#securing-the-installation)). -![Web Interface Login Form](../../images/loginView.png) +![Web Interface Login Form](../../../../images/loginView.png) Next you will be asked which database to use. Every server instance comes with a `_system` database. Select this database to continue. -![select database](../../images/selectDBView.png) +![select database](../../../../images/selectDBView.png) You should then be presented the dashboard with server statistics like this: -![Web Interface Dashboard Request Statistics](../../images/ui-dashboard.webp) +![Web Interface Dashboard Request Statistics](../../../../images/ui-dashboard.webp) For a more detailed description of the interface, see [Web Interface](../components/web-interface/_index.md). --> diff --git a/site/content/3.12/get-started/set-up-a-cloud-instance.md b/site/content/arangodb/3.12/get-started/set-up-a-cloud-instance.md similarity index 71% rename from site/content/3.12/get-started/set-up-a-cloud-instance.md rename to site/content/arangodb/3.12/get-started/set-up-a-cloud-instance.md index 2383f20980..7fd3bfa149 100644 --- a/site/content/3.12/get-started/set-up-a-cloud-instance.md +++ b/site/content/arangodb/3.12/get-started/set-up-a-cloud-instance.md @@ -6,10 +6,10 @@ description: >- This quick start guide covers the basics from creating an ArangoGraph account to setting up and accessing your first ArangoGraph deployment --- -For general information about the ArangoGraph Insights Platform, see +For general information about the Arango Managed Platform (AMP), see [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -For guides and reference documentation, see the [ArangoGraph](../arangograph/_index.md) documentation. +For guides and reference documentation, see the [ArangoGraph](../../../amp/_index.md) documentation. ## Prerequisites @@ -33,7 +33,7 @@ used for multiple accounts. 2. Click the __Start Free__ button or click the __Sign Up__ link in the top right corner. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) + ![ArangoGraph Homepage](../../../images/arangograph-homepage.png) 3. Review the terms & conditions and privacy policy and click __I accept__. 4. Select the type of sign up you would like to use (GitHub, Google, or @@ -42,11 +42,11 @@ used for multiple accounts. - For the email address option, type your desired email address in the email field and type a strong password in the password field. - {{< image src="../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} Click the __Sign up__ button. You will receive a verification email. In that mail, click the __Verify my email address__ link or button. - It opens a page in the ArangoGraph Insights Platform that says __Welcome back!__ + It opens a page in the Arango Managed Platform (AMP) that says __Welcome back!__ 5. Click the __Log in__ button to continue and login. 6. If you signed up with an email address of a public email service provider (e.g. Hotmail), a form appears asking for your mobile phone number. Enter the country code @@ -67,25 +67,25 @@ used for multiple accounts. provider and region. Pick one and click __Create deployment__. You can also select your intended use-case. - ![ArangoGraph Dashboard](../../images/arangograph-dashboard-free-tier.png) + ![ArangoGraph Dashboard](../../../images/arangograph-dashboard-free-tier.png) - You can also [create a deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) + You can also [create a deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) manually, if you want fine-grained configuration options. 2. The new deployment is displayed in the list of deployments for the respective project (here: _Avocado_). - ![ArangoGraph Deployments Bootstrapping](../../images/arangograph-deployments-bootstrapping.png) + ![ArangoGraph Deployments Bootstrapping](../../../images/arangograph-deployments-bootstrapping.png) It takes a couple of minutes before the deployment can be used. The status is changed from __Bootstrapping__ to __OK__ eventually and you also receive an email when it is ready. - {{< image src="../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} 3. Click the name of the deployment (or the __Open deployment details__ link in the email) to view the deployment details. - ![ArangoGraph Deployment Ready](../../images/arangograph-deployment-ready.png) + ![ArangoGraph Deployment Ready](../../../images/arangograph-deployment-ready.png) 4. Click the __Open database UI__ button to open the ArangoDB web interface. @@ -96,23 +96,23 @@ used for multiple accounts. Click __Guide__ for instructions on how to access and run queries against this data. - ![ArangoGraph Deployment Examples](../../images/arangograph-deployment-examples.png) + ![ArangoGraph Deployment Examples](../../../images/arangograph-deployment-examples.png) - ![ArangoGraph Deployment Examples IMDB Guide](../../images/arangograph-deployment-examples-imdb-guide.png) + ![ArangoGraph Deployment Examples IMDB Guide](../../../images/arangograph-deployment-examples-imdb-guide.png) ## General Hierarchy -The ArangoGraph Insights Platform supports multi-tenant setups via organizations. +The Arango Managed Platform (AMP) supports multi-tenant setups via organizations. You can create your own organization(s) and invite collaborators or join existing ones via invites. Your organization contains projects. Your projects hold your deployments. -- [**Organizations**](../arangograph/organizations/_index.md) +- [**Organizations**](../../../amp/organizations/_index.md) represent (commercial) entities such as companies. You can be part of multiple organizations with a single user account. - - [**Projects**](../arangograph/projects.md) + - [**Projects**](../../../amp/projects.md) represent organizational units such as teams or applications. - - [**Deployments**](../arangograph/deployments/_index.md) + - [**Deployments**](../../../amp/deployments/_index.md) are the actual instances of ArangoDB clusters. When you sign up for ArangoGraph, an organization and a default project are @@ -125,31 +125,31 @@ question mark to bring up the help menu and choose __Start tour__. This guided tour walks you through the creation of a deployment and shows you how to load example datasets and manage projects and deployments. -![Start tour in menu](../../images/arangograph-tour-start.png) +![Start tour in menu](../../../images/arangograph-tour-start.png) Alternatively, follow the steps of the linked guides: -- [Create a new project](../arangograph/projects.md#how-to-create-a-new-project) (optional) -- [Create a new deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) -- [Install a new certificate](../arangograph/security-and-access-control/x-509-certificates.md) (optional) -- [Access your deployment](../arangograph/deployments/_index.md#how-to-access-your-deployment) -- [Delete your deployment](../arangograph/deployments/_index.md#how-to-delete-a-deployment) +- [Create a new project](../../../amp/projects.md#how-to-create-a-new-project) (optional) +- [Create a new deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) +- [Install a new certificate](../../../amp/security-and-access-control/x-509-certificates.md) (optional) +- [Access your deployment](../../../amp/deployments/_index.md#how-to-access-your-deployment) +- [Delete your deployment](../../../amp/deployments/_index.md#how-to-delete-a-deployment) ## Free-to-Try vs. Paid -The ArangoGraph Insights Platform comes with a free-to-try tier that lets you test +The Arango Managed Platform (AMP) comes with a free-to-try tier that lets you test the ArangoDB Cloud for free for 14 days. It includes one project and one small deployment of 4GB, local backups, and one notebook for learning and data science. After the trial period, your deployment is automatically deleted. You can unlock all features in ArangoGraph at any time by adding your billing details and at least one payment method. See: -- [ArangoGraph Packages](../arangograph/organizations/_index.md#arangograph-packages) -- [How to add billing details to organizations](../arangograph/organizations/billing.md#how-to-add-billing-details) -- [How to add a payment method to an organization](../arangograph/organizations/billing.md#how-to-add-a-payment-method) +- [ArangoGraph Packages](../../../amp/organizations/_index.md#arangograph-packages) +- [How to add billing details to organizations](../../../amp/organizations/billing.md#how-to-add-billing-details) +- [How to add a payment method to an organization](../../../amp/organizations/billing.md#how-to-add-a-payment-method) ## Managed Cloud Service vs. On-premises Comparison: Key Differences -The ArangoGraph Insights Platform aims to make all features of ArangoDB +The Arango Managed Platform (AMP) aims to make all features of ArangoDB available to you, but there are a few key differences: - Encryption (both at rest & network traffic) is always on and cannot be diff --git a/site/content/3.12/get-started/start-using-aql/_index.md b/site/content/arangodb/3.12/get-started/start-using-aql/_index.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/_index.md rename to site/content/arangodb/3.12/get-started/start-using-aql/_index.md diff --git a/site/content/3.12/get-started/start-using-aql/crud.md b/site/content/arangodb/3.12/get-started/start-using-aql/crud.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/crud.md rename to site/content/arangodb/3.12/get-started/start-using-aql/crud.md diff --git a/site/content/3.12/get-started/start-using-aql/dataset.md b/site/content/arangodb/3.12/get-started/start-using-aql/dataset.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/dataset.md rename to site/content/arangodb/3.12/get-started/start-using-aql/dataset.md diff --git a/site/content/3.12/get-started/start-using-aql/filter.md b/site/content/arangodb/3.12/get-started/start-using-aql/filter.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/filter.md rename to site/content/arangodb/3.12/get-started/start-using-aql/filter.md diff --git a/site/content/3.12/get-started/start-using-aql/geo.md b/site/content/arangodb/3.12/get-started/start-using-aql/geo.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/geo.md rename to site/content/arangodb/3.12/get-started/start-using-aql/geo.md diff --git a/site/content/3.12/get-started/start-using-aql/graphs.md b/site/content/arangodb/3.12/get-started/start-using-aql/graphs.md similarity index 98% rename from site/content/3.12/get-started/start-using-aql/graphs.md rename to site/content/arangodb/3.12/get-started/start-using-aql/graphs.md index d5c9502ae3..044f1cc4a3 100644 --- a/site/content/3.12/get-started/start-using-aql/graphs.md +++ b/site/content/arangodb/3.12/get-started/start-using-aql/graphs.md @@ -36,7 +36,7 @@ Our characters have the following relations between parents and children Visualized as a graph: -![ChildOf graph visualization](../../../images/ChildOf_Graph.png) +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) ## Creating the edges @@ -252,7 +252,7 @@ It might be a bit unexpected, that Joffrey is returned twice. However, if you look at the graph visualization, you can see that multiple paths lead from Joffrey (bottom right) to Tywin: -![ChildOf graph visualization](../../../images/ChildOf_Graph.png) +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) ``` Tywin <- Jaime <- Joffrey diff --git a/site/content/3.12/get-started/start-using-aql/joins.md b/site/content/arangodb/3.12/get-started/start-using-aql/joins.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/joins.md rename to site/content/arangodb/3.12/get-started/start-using-aql/joins.md diff --git a/site/content/3.12/get-started/start-using-aql/sort-limit.md b/site/content/arangodb/3.12/get-started/start-using-aql/sort-limit.md similarity index 100% rename from site/content/3.12/get-started/start-using-aql/sort-limit.md rename to site/content/arangodb/3.12/get-started/start-using-aql/sort-limit.md diff --git a/site/content/3.12/graphs/_index.md b/site/content/arangodb/3.12/graphs/_index.md similarity index 97% rename from site/content/3.12/graphs/_index.md rename to site/content/arangodb/3.12/graphs/_index.md index 56f3e5e89b..76d5771e20 100644 --- a/site/content/3.12/graphs/_index.md +++ b/site/content/arangodb/3.12/graphs/_index.md @@ -17,12 +17,12 @@ causal relationships, flows of information, energy, and material, interactions a transactions, dependency and hierarchy, as well as similarity and relatedness of any kind. -![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../images/data-model-graph-relation-abstract-edge.png) +![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../../images/data-model-graph-relation-abstract-edge.png) For example, you can represent people by nodes and their friendships by edges. This lets you form a graph that is a social network in this case. -![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../images/data-model-graph-relation-concrete.png) +![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../../images/data-model-graph-relation-concrete.png) The specific terms to refer to nodes and edges in a graph vary depending on the field or context, but they are conceptually the same. In computer science @@ -42,7 +42,7 @@ relate to one another is a very expressive data model. It lets you represent a wide variety of information in a compact and intuitive way. It lets you model complex relationships and interactions of basically everything. -![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../images/data-model-graph-relations.png) +![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../../images/data-model-graph-relations.png) Graphs are commonly directed (_digraphs_), which means that each edge goes from one node to another node in a specific direction. This lets you model @@ -215,7 +215,7 @@ suboptimal query performance due to random data distribution. General graphs are the easiest way to get started, no special configuration required. {{< /tip >}} -![General Graph Random Distribution](../../images/general-graph-distribution.png) +![General Graph Random Distribution](../../../images/general-graph-distribution.png) #### When to use SmartGraphs @@ -230,7 +230,7 @@ scenarios, use SmartGraphs. Organize your data efficiently using the `smartGraphAttribute`. {{< /tip >}} -![SmartGraph Distribution](../../images/smartgraph-distribution.png) +![SmartGraph Distribution](../../../images/smartgraph-distribution.png) #### When to use EnterpriseGraphs @@ -244,7 +244,7 @@ If you need improved query execution without manual data distribution, consider using EnterpriseGraphs. {{< /tip >}} -![EnterpriseGraph Distribution](../../images/enterprisegraph-distribution.png) +![EnterpriseGraph Distribution](../../../images/enterprisegraph-distribution.png) #### When to use SatelliteGraphs @@ -331,7 +331,7 @@ with `_from` pointing to `Users/John` and `_to` pointing to attributes to qualify the relation further, like the permissions of **John** in this group, the date when John joined the group, and so on. -![User in group example](../../images/graph_user_in_group.png) +![User in group example](../../../images/graph_user_in_group.png) As a rule of thumb, if you use documents and their attributes in a sentence, nouns would typically be nodes, and the verbs the edges. diff --git a/site/content/3.12/graphs/enterprisegraphs/_index.md b/site/content/arangodb/3.12/graphs/enterprisegraphs/_index.md similarity index 100% rename from site/content/3.12/graphs/enterprisegraphs/_index.md rename to site/content/arangodb/3.12/graphs/enterprisegraphs/_index.md diff --git a/site/content/3.12/graphs/enterprisegraphs/getting-started.md b/site/content/arangodb/3.12/graphs/enterprisegraphs/getting-started.md similarity index 99% rename from site/content/3.12/graphs/enterprisegraphs/getting-started.md rename to site/content/arangodb/3.12/graphs/enterprisegraphs/getting-started.md index 35f92abd86..95e376f612 100644 --- a/site/content/3.12/graphs/enterprisegraphs/getting-started.md +++ b/site/content/arangodb/3.12/graphs/enterprisegraphs/getting-started.md @@ -211,7 +211,7 @@ EnterpriseGraphs. To get started, follow the steps outlined below. 6. Click the name or row of the newly created graph to open the Graph Viewer if you want to visually interact with the graph and manage the graph data. -![Create EnterpriseGraph](../../../images/graphs-create-enterprise-graph-dialog312.png) +![Create EnterpriseGraph](../../../../images/graphs-create-enterprise-graph-dialog312.png) ## Create an EnterpriseGraph using *arangosh* diff --git a/site/content/3.12/graphs/enterprisegraphs/management.md b/site/content/arangodb/3.12/graphs/enterprisegraphs/management.md similarity index 100% rename from site/content/3.12/graphs/enterprisegraphs/management.md rename to site/content/arangodb/3.12/graphs/enterprisegraphs/management.md diff --git a/site/content/3.13/graphs/example-graphs.md b/site/content/arangodb/3.12/graphs/example-graphs.md similarity index 94% rename from site/content/3.13/graphs/example-graphs.md rename to site/content/arangodb/3.12/graphs/example-graphs.md index 03434a4bfd..cfc699abad 100644 --- a/site/content/3.13/graphs/example-graphs.md +++ b/site/content/arangodb/3.12/graphs/example-graphs.md @@ -26,7 +26,7 @@ for reference about how to manage graphs programmatically. The `knows` graph is a set of persons knowing each other: -![Persons relation Example Graph](../../images/knows_graph.png) +![Persons relation Example Graph](../../../images/knows_graph.png) The graph consists of a `persons` node collection connected via a `knows` edge collection. @@ -63,7 +63,7 @@ The `traversalGraph` has been designed to demonstrate filters in traversals. It has some labels to filter on it. The graph's nodes are in a collection called `circles`, and it has an edge collection `edges` to connect them. -![Traversal Graph](../../images/traversal_graph.png) +![Traversal Graph](../../../images/traversal_graph.png) Circles have unique numeric labels. Edges have two boolean attributes (`theFalse` always being `false`, `theTruth` always being `true`) and a label @@ -93,7 +93,7 @@ The nodes in the `kShortestPathsGraph` graph are train stations of cities in Europe and North America. The edges represent train connections between them, with the travel time for both directions as edge weight. -![Train Connection Map](../../images/train_map.png) +![Train Connection Map](../../../images/train_map.png) See the [k Shortest Paths page](../aql/graphs/k-shortest-paths.md) for query examples. @@ -118,7 +118,7 @@ The example graph consists of nodes in the `mps_verts` collection and edges in the `mps_edges` collection. It is a simple traversal graph with start node *A* and end node *C*. -![Mps Graph](../../images/mps_graph.png) +![Mps Graph](../../../images/mps_graph.png) With the [Shortest Path](../aql/graphs/shortest-path.md) algorithm, you either get the shortest path *A* - *B* - *C* or *A* - *D* - *C*. With the @@ -146,7 +146,7 @@ The `worldCountry` graph has as node structure as follows: world → continent → country → capital -![World Graph](../../images/world_graph.png) +![World Graph](../../../images/world_graph.png) In some cases, edge directions aren't forward. Therefore, it may get displayed disjunct in the graph viewer. @@ -175,7 +175,7 @@ The `social` graph is a set of persons and their relations. The graph has `female` and `male` persons as nodes in two node collections. The edges are their connections and stored in the `relation` edge collection. -![Social Example Graph](../../images/social_graph.png) +![Social Example Graph](../../../images/social_graph.png) Example of how to create the graph, inspect its nodes and edges, and delete it again: @@ -201,7 +201,7 @@ multiple node collections (`germanCity` and `frenchCity`). The edges are their interconnections in several edge collections (`frenchHighway`, `germanHighway`, `internationalHighway`). -![Cities Example Graph](../../images/cities_graph.png) +![Cities Example Graph](../../../images/cities_graph.png) Example of how to create the graph, inspect its edges and nodes, and delete it again: @@ -227,7 +227,7 @@ A small example graph comprised of `components` (nodes) and `connections` (edges). Good for trying out graph algorithms such as Weakly Connected Components (WCC). -![Three disjoint subgraphs with 36 nodes and edges in total](../../images/connected_components.png) +![Three disjoint subgraphs with 36 nodes and edges in total](../../../images/connected_components.png) ```js --- diff --git a/site/content/3.12/graphs/general-graphs/_index.md b/site/content/arangodb/3.12/graphs/general-graphs/_index.md similarity index 98% rename from site/content/3.12/graphs/general-graphs/_index.md rename to site/content/arangodb/3.12/graphs/general-graphs/_index.md index db1c8ffaf8..26e4c9a7e3 100644 --- a/site/content/3.12/graphs/general-graphs/_index.md +++ b/site/content/arangodb/3.12/graphs/general-graphs/_index.md @@ -57,7 +57,7 @@ General Graphs. To get started, follow the steps outlined below. 8. Click the name or row of the newly created graph to open the Graph Viewer if you want to visually interact with the graph and manage the graph data. -![Create General Graph](../../../images/Create-GeneralGraph312.png) +![Create General Graph](../../../../images/Create-GeneralGraph312.png) ### Create a General Graph using *arangosh* diff --git a/site/content/3.13/graphs/general-graphs/functions.md b/site/content/arangodb/3.12/graphs/general-graphs/functions.md similarity index 99% rename from site/content/3.13/graphs/general-graphs/functions.md rename to site/content/arangodb/3.12/graphs/general-graphs/functions.md index 447a98a765..b7407a5cbc 100644 --- a/site/content/3.13/graphs/general-graphs/functions.md +++ b/site/content/arangodb/3.12/graphs/general-graphs/functions.md @@ -10,7 +10,7 @@ A lot of these accept a node (or edge) example as parameter as defined in the ne Examples explain the API using the [City Graph](../example-graphs.md#city-graph): -![Social Example Graph](../../../images/cities_graph.png) +![Social Example Graph](../../../../images/cities_graph.png) ## Definition of examples diff --git a/site/content/3.12/graphs/general-graphs/management.md b/site/content/arangodb/3.12/graphs/general-graphs/management.md similarity index 100% rename from site/content/3.12/graphs/general-graphs/management.md rename to site/content/arangodb/3.12/graphs/general-graphs/management.md diff --git a/site/content/3.12/graphs/satellitegraphs/_index.md b/site/content/arangodb/3.12/graphs/satellitegraphs/_index.md similarity index 98% rename from site/content/3.12/graphs/satellitegraphs/_index.md rename to site/content/arangodb/3.12/graphs/satellitegraphs/_index.md index bda0c8326e..9c716f43ed 100644 --- a/site/content/3.12/graphs/satellitegraphs/_index.md +++ b/site/content/arangodb/3.12/graphs/satellitegraphs/_index.md @@ -17,7 +17,7 @@ the performance of such queries. They are the natural extension of the [SatelliteCollections](../../develop/satellitecollections.md) concept to graphs. The same benefits and caveats apply. -![ArangoDB SatelliteGraphs](../../../images/SatelliteGraphs.webp) +![ArangoDB SatelliteGraphs](../../../../images/SatelliteGraphs.webp) ## Why use a SatelliteGraph? diff --git a/site/content/3.12/graphs/satellitegraphs/details.md b/site/content/arangodb/3.12/graphs/satellitegraphs/details.md similarity index 100% rename from site/content/3.12/graphs/satellitegraphs/details.md rename to site/content/arangodb/3.12/graphs/satellitegraphs/details.md diff --git a/site/content/3.12/graphs/satellitegraphs/management.md b/site/content/arangodb/3.12/graphs/satellitegraphs/management.md similarity index 100% rename from site/content/3.12/graphs/satellitegraphs/management.md rename to site/content/arangodb/3.12/graphs/satellitegraphs/management.md diff --git a/site/content/3.13/graphs/smartgraphs/_index.md b/site/content/arangodb/3.12/graphs/smartgraphs/_index.md similarity index 94% rename from site/content/3.13/graphs/smartgraphs/_index.md rename to site/content/arangodb/3.12/graphs/smartgraphs/_index.md index 3da62055e6..9122893c10 100644 --- a/site/content/3.13/graphs/smartgraphs/_index.md +++ b/site/content/arangodb/3.12/graphs/smartgraphs/_index.md @@ -59,7 +59,7 @@ cluster for both scenarios. Let's take a closer look at it. The natural distribution of data for graphs that handle large datasets involves a series of highly interconnected nodes with many edges running between them. -![Random data distribution](../../../images/SmartGraphs_random_distribution.png) +![Random data distribution](../../../../images/SmartGraphs_random_distribution.png) _The orange line indicates an example graph traversal. Notice how it touches nodes on every server._ @@ -85,7 +85,7 @@ connecting nodes with identical `smartGraphAttribute` values are stored on this machine as well. Sharding with this attribute means that the relevant data is now co-located on servers, whenever possible. -![SmartGraphs data distribution](../../../images/SmartGraphs_distribution.png) +![SmartGraphs data distribution](../../../../images/SmartGraphs_distribution.png) _The outcome of moving the data like this is that you retain the scalability as well as the performance of graph traversals in ArangoDB._ @@ -102,7 +102,7 @@ and path search queries can partially be executed locally on each DB-Server. This means a larger part of the query can be executed fully local whenever data from the SatelliteCollections is required. -![SmartGraphs with SatelliteCollections](../../../images/SmartGraphs-using-SatelliteCollections.png) +![SmartGraphs with SatelliteCollections](../../../../images/SmartGraphs-using-SatelliteCollections.png) ## Disjoint SmartGraphs @@ -111,7 +111,7 @@ large forest of graphs, when you have clearly separated subgraphs in your graph dataset. Disjoint SmartGraphs enable the automatic sharding of these subgraphs and prohibit edges connecting them. -![Disjoint SmartGraphs](../../../images/SmartGraphs-Disjoint.png) +![Disjoint SmartGraphs](../../../../images/SmartGraphs-Disjoint.png) _This ensures that graph traversals, shortest path, and k-shortest-paths queries can be executed locally on a DB-Server, achieving improved performance for diff --git a/site/content/3.13/graphs/smartgraphs/getting-started.md b/site/content/arangodb/3.12/graphs/smartgraphs/getting-started.md similarity index 99% rename from site/content/3.13/graphs/smartgraphs/getting-started.md rename to site/content/arangodb/3.12/graphs/smartgraphs/getting-started.md index 6a52edf103..ecf3605146 100644 --- a/site/content/3.13/graphs/smartgraphs/getting-started.md +++ b/site/content/arangodb/3.12/graphs/smartgraphs/getting-started.md @@ -63,7 +63,7 @@ SmartGraphs. To get started, follow the steps outlined below. 7. Click the name or row of the newly created graph to open the Graph Viewer if you want to visually interact with the graph and manage the graph data. -![Create SmartGraph](../../../images/Create-SmartGraph312.png) +![Create SmartGraph](../../../../images/Create-SmartGraph312.png) ## Create a SmartGraph using *arangosh* diff --git a/site/content/3.12/graphs/smartgraphs/management.md b/site/content/arangodb/3.12/graphs/smartgraphs/management.md similarity index 100% rename from site/content/3.12/graphs/smartgraphs/management.md rename to site/content/arangodb/3.12/graphs/smartgraphs/management.md diff --git a/site/content/3.12/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/3.12/graphs/smartgraphs/testing-graphs-on-single-server.md similarity index 100% rename from site/content/3.12/graphs/smartgraphs/testing-graphs-on-single-server.md rename to site/content/arangodb/3.12/graphs/smartgraphs/testing-graphs-on-single-server.md diff --git a/site/content/3.12/graphs/working-with-edges.md b/site/content/arangodb/3.12/graphs/working-with-edges.md similarity index 100% rename from site/content/3.12/graphs/working-with-edges.md rename to site/content/arangodb/3.12/graphs/working-with-edges.md diff --git a/site/content/3.12/index-and-search/_index.md b/site/content/arangodb/3.12/index-and-search/_index.md similarity index 100% rename from site/content/3.12/index-and-search/_index.md rename to site/content/arangodb/3.12/index-and-search/_index.md diff --git a/site/content/3.12/index-and-search/analyzers.md b/site/content/arangodb/3.12/index-and-search/analyzers.md similarity index 100% rename from site/content/3.12/index-and-search/analyzers.md rename to site/content/arangodb/3.12/index-and-search/analyzers.md diff --git a/site/content/3.12/index-and-search/arangosearch/_index.md b/site/content/arangodb/3.12/index-and-search/arangosearch/_index.md similarity index 99% rename from site/content/3.12/index-and-search/arangosearch/_index.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/_index.md index 1ed9427ec8..cafe475c19 100644 --- a/site/content/3.12/index-and-search/arangosearch/_index.md +++ b/site/content/arangodb/3.12/index-and-search/arangosearch/_index.md @@ -65,7 +65,7 @@ Search results can be sorted by their similarity ranking to return the best matches first using popular scoring algorithms (Okapi BM25, TF-IDF), user-defined relevance boosting and dynamic score calculation. -![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../images/arangosearch.png) +![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../../images/arangosearch.png) Views can be managed in the web interface, via an [HTTP API](../../develop/http-api/views/_index.md) and through a [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views). diff --git a/site/content/3.13/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/3.12/index-and-search/arangosearch/arangosearch-views-reference.md similarity index 99% rename from site/content/3.13/index-and-search/arangosearch/arangosearch-views-reference.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/arangosearch-views-reference.md index cf7c21cdba..758d758003 100644 --- a/site/content/3.13/index-and-search/arangosearch/arangosearch-views-reference.md +++ b/site/content/arangodb/3.12/index-and-search/arangosearch/arangosearch-views-reference.md @@ -58,7 +58,7 @@ To get started, follow the steps outlined below. turn off this limit for any writer. 8. Click **Create**. -![Create new arangosearch View](../../../images/arangosearch-create-new-view.png) +![Create new arangosearch View](../../../../images/arangosearch-create-new-view.png) ## Create `arangosearch` Views using the JavaScript API diff --git a/site/content/3.12/index-and-search/arangosearch/case-sensitivity-and-diacritics.md b/site/content/arangodb/3.12/index-and-search/arangosearch/case-sensitivity-and-diacritics.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/case-sensitivity-and-diacritics.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/case-sensitivity-and-diacritics.md diff --git a/site/content/3.12/index-and-search/arangosearch/exact-value-matching.md b/site/content/arangodb/3.12/index-and-search/arangosearch/exact-value-matching.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/exact-value-matching.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/exact-value-matching.md diff --git a/site/content/3.12/index-and-search/arangosearch/example-datasets.md b/site/content/arangodb/3.12/index-and-search/arangosearch/example-datasets.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/example-datasets.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/example-datasets.md diff --git a/site/content/3.12/index-and-search/arangosearch/faceted-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/faceted-search.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/faceted-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/faceted-search.md diff --git a/site/content/3.12/index-and-search/arangosearch/full-text-token-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/full-text-token-search.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/full-text-token-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/full-text-token-search.md diff --git a/site/content/3.12/index-and-search/arangosearch/fuzzy-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/fuzzy-search.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/fuzzy-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/fuzzy-search.md diff --git a/site/content/3.13/index-and-search/arangosearch/geospatial-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/geospatial-search.md similarity index 99% rename from site/content/3.13/index-and-search/arangosearch/geospatial-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/geospatial-search.md index 37bfad4fc3..7f33e7c73c 100644 --- a/site/content/3.13/index-and-search/arangosearch/geospatial-search.md +++ b/site/content/arangodb/3.12/index-and-search/arangosearch/geospatial-search.md @@ -297,7 +297,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for points in a polygon](../../../images/arangosearch-geo-points-in-polygon.png) +![ArangoSearch geospatial query for points in a polygon](../../../../images/arangosearch-geo-points-in-polygon.png) You do not have to look up the polygon, you can also provide one inline. It is also not necessary to return the polygon, you can return the matches only: @@ -559,7 +559,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geosptial query for polygons in a polygon](../../../images/arangosearch-geo-polygons-in-polygon.png) +![ArangoSearch geosptial query for polygons in a polygon](../../../../images/arangosearch-geo-polygons-in-polygon.png) Searching for geo features in a rectangle is something you can use together with an interactive map that the user can select the area of interest with. @@ -629,4 +629,4 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for polygons intersecting a polygon](../../../images/arangosearch-geo-polygons-intersecting-polygon.png) +![ArangoSearch geospatial query for polygons intersecting a polygon](../../../../images/arangosearch-geo-polygons-intersecting-polygon.png) diff --git a/site/content/3.12/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/nested-search.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/nested-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/nested-search.md diff --git a/site/content/3.12/index-and-search/arangosearch/performance.md b/site/content/arangodb/3.12/index-and-search/arangosearch/performance.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/performance.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/performance.md diff --git a/site/content/3.12/index-and-search/arangosearch/phrase-and-proximity-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/phrase-and-proximity-search.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/phrase-and-proximity-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/phrase-and-proximity-search.md diff --git a/site/content/3.12/index-and-search/arangosearch/prefix-matching.md b/site/content/arangodb/3.12/index-and-search/arangosearch/prefix-matching.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/prefix-matching.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/prefix-matching.md diff --git a/site/content/3.12/index-and-search/arangosearch/range-queries.md b/site/content/arangodb/3.12/index-and-search/arangosearch/range-queries.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/range-queries.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/range-queries.md diff --git a/site/content/3.12/index-and-search/arangosearch/ranking.md b/site/content/arangodb/3.12/index-and-search/arangosearch/ranking.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/ranking.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/ranking.md diff --git a/site/content/3.12/index-and-search/arangosearch/search-alias-views-reference.md b/site/content/arangodb/3.12/index-and-search/arangosearch/search-alias-views-reference.md similarity index 97% rename from site/content/3.12/index-and-search/arangosearch/search-alias-views-reference.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/search-alias-views-reference.md index 3b95bd0c65..96a7a7ac19 100644 --- a/site/content/3.12/index-and-search/arangosearch/search-alias-views-reference.md +++ b/site/content/arangodb/3.12/index-and-search/arangosearch/search-alias-views-reference.md @@ -61,7 +61,7 @@ To get started, follow the steps outlined below. 6. To define multiple indexes, click the **Add index** button. 7. Click **Create**. -![Create new search-alias View](../../../images/arangosearch-create-search-alias-view.png) +![Create new search-alias View](../../../../images/arangosearch-create-search-alias-view.png) ## Create `search-alias` Views using the JavaScript API diff --git a/site/content/3.12/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/3.12/index-and-search/arangosearch/search-highlighting.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/search-highlighting.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/search-highlighting.md diff --git a/site/content/3.12/index-and-search/arangosearch/wildcard-search.md b/site/content/arangodb/3.12/index-and-search/arangosearch/wildcard-search.md similarity index 100% rename from site/content/3.12/index-and-search/arangosearch/wildcard-search.md rename to site/content/arangodb/3.12/index-and-search/arangosearch/wildcard-search.md diff --git a/site/content/3.12/index-and-search/indexing/_index.md b/site/content/arangodb/3.12/index-and-search/indexing/_index.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/_index.md rename to site/content/arangodb/3.12/index-and-search/indexing/_index.md diff --git a/site/content/3.12/index-and-search/indexing/basics.md b/site/content/arangodb/3.12/index-and-search/indexing/basics.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/basics.md rename to site/content/arangodb/3.12/index-and-search/indexing/basics.md diff --git a/site/content/3.12/index-and-search/indexing/index-utilization.md b/site/content/arangodb/3.12/index-and-search/indexing/index-utilization.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/index-utilization.md rename to site/content/arangodb/3.12/index-and-search/indexing/index-utilization.md diff --git a/site/content/3.12/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/3.12/index-and-search/indexing/which-index-to-use-when.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/which-index-to-use-when.md rename to site/content/arangodb/3.12/index-and-search/indexing/which-index-to-use-when.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/_index.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/_index.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/_index.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/_index.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/fulltext-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/fulltext-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/fulltext-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/fulltext-indexes.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/inverted-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/inverted-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/inverted-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/inverted-indexes.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/persistent-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/persistent-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/persistent-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/persistent-indexes.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/ttl-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/ttl-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/ttl-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/ttl-indexes.md diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md similarity index 99% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md index 54a2b416a7..a3e1fbf1bb 100644 --- a/site/content/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -33,7 +33,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the experimental vector index feature. -2. Calculate vector embeddings using [ArangoDB's GraphML](../../../../platform/data-science/graphml/_index.md) +2. Calculate vector embeddings using [ArangoDB's GraphML](../../../../../gen-ai/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/3.12/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md similarity index 100% rename from site/content/3.12/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md rename to site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md diff --git a/site/content/3.12/operations/_index.md b/site/content/arangodb/3.12/operations/_index.md similarity index 100% rename from site/content/3.12/operations/_index.md rename to site/content/arangodb/3.12/operations/_index.md diff --git a/site/content/3.12/operations/administration/_index.md b/site/content/arangodb/3.12/operations/administration/_index.md similarity index 100% rename from site/content/3.12/operations/administration/_index.md rename to site/content/arangodb/3.12/operations/administration/_index.md diff --git a/site/content/3.12/operations/administration/arangodb-starter/_index.md b/site/content/arangodb/3.12/operations/administration/arangodb-starter/_index.md similarity index 100% rename from site/content/3.12/operations/administration/arangodb-starter/_index.md rename to site/content/arangodb/3.12/operations/administration/arangodb-starter/_index.md diff --git a/site/content/3.12/operations/administration/arangodb-starter/recovery-procedure.md b/site/content/arangodb/3.12/operations/administration/arangodb-starter/recovery-procedure.md similarity index 100% rename from site/content/3.12/operations/administration/arangodb-starter/recovery-procedure.md rename to site/content/arangodb/3.12/operations/administration/arangodb-starter/recovery-procedure.md diff --git a/site/content/3.12/operations/administration/arangodb-starter/removal-procedure.md b/site/content/arangodb/3.12/operations/administration/arangodb-starter/removal-procedure.md similarity index 100% rename from site/content/3.12/operations/administration/arangodb-starter/removal-procedure.md rename to site/content/arangodb/3.12/operations/administration/arangodb-starter/removal-procedure.md diff --git a/site/content/3.12/operations/administration/configuration.md b/site/content/arangodb/3.12/operations/administration/configuration.md similarity index 100% rename from site/content/3.12/operations/administration/configuration.md rename to site/content/arangodb/3.12/operations/administration/configuration.md diff --git a/site/content/3.12/operations/administration/import-and-export.md b/site/content/arangodb/3.12/operations/administration/import-and-export.md similarity index 100% rename from site/content/3.12/operations/administration/import-and-export.md rename to site/content/arangodb/3.12/operations/administration/import-and-export.md diff --git a/site/content/3.12/operations/administration/license-management.md b/site/content/arangodb/3.12/operations/administration/license-management.md similarity index 99% rename from site/content/3.12/operations/administration/license-management.md rename to site/content/arangodb/3.12/operations/administration/license-management.md index c7b8ab61d5..30fc66adf2 100644 --- a/site/content/3.12/operations/administration/license-management.md +++ b/site/content/arangodb/3.12/operations/administration/license-management.md @@ -7,7 +7,7 @@ description: >- --- The Enterprise Edition of ArangoDB requires a license so that you can use ArangoDB for commercial purposes and have a dataset size over 100 GiB. See -[ArangoDB Editions](../../about-arangodb/features/_index.md#arangodb-editions) +[ArangoDB Editions](../../about/features/_index.md#arangodb-editions) for details. How to set a license key and to retrieve information about the current license diff --git a/site/content/3.12/operations/administration/log-levels.md b/site/content/arangodb/3.12/operations/administration/log-levels.md similarity index 100% rename from site/content/3.12/operations/administration/log-levels.md rename to site/content/arangodb/3.12/operations/administration/log-levels.md diff --git a/site/content/3.13/operations/administration/reduce-memory-footprint.md b/site/content/arangodb/3.12/operations/administration/reduce-memory-footprint.md similarity index 99% rename from site/content/3.13/operations/administration/reduce-memory-footprint.md rename to site/content/arangodb/3.12/operations/administration/reduce-memory-footprint.md index 4bd19f5572..d0d29b77a7 100644 --- a/site/content/3.13/operations/administration/reduce-memory-footprint.md +++ b/site/content/arangodb/3.12/operations/administration/reduce-memory-footprint.md @@ -701,7 +701,7 @@ otherwise. ## Testing the Effects of Reduced I/O Buffers -![Performance Graph](../../../images/performance_graph.png) +![Performance Graph](../../../../images/performance_graph.png) - 15:50 – Start bigger import - 16:00 – Start writing documents of ~60 KB size one at a time diff --git a/site/content/3.12/operations/administration/telemetrics.md b/site/content/arangodb/3.12/operations/administration/telemetrics.md similarity index 100% rename from site/content/3.12/operations/administration/telemetrics.md rename to site/content/arangodb/3.12/operations/administration/telemetrics.md diff --git a/site/content/3.12/operations/administration/user-management/_index.md b/site/content/arangodb/3.12/operations/administration/user-management/_index.md similarity index 100% rename from site/content/3.12/operations/administration/user-management/_index.md rename to site/content/arangodb/3.12/operations/administration/user-management/_index.md diff --git a/site/content/3.12/operations/administration/user-management/in-arangosh.md b/site/content/arangodb/3.12/operations/administration/user-management/in-arangosh.md similarity index 100% rename from site/content/3.12/operations/administration/user-management/in-arangosh.md rename to site/content/arangodb/3.12/operations/administration/user-management/in-arangosh.md diff --git a/site/content/3.12/operations/backup-and-restore.md b/site/content/arangodb/3.12/operations/backup-and-restore.md similarity index 100% rename from site/content/3.12/operations/backup-and-restore.md rename to site/content/arangodb/3.12/operations/backup-and-restore.md diff --git a/site/content/3.12/operations/installation/_index.md b/site/content/arangodb/3.12/operations/installation/_index.md similarity index 97% rename from site/content/3.12/operations/installation/_index.md rename to site/content/arangodb/3.12/operations/installation/_index.md index 3d225b8ada..eeaf51934f 100644 --- a/site/content/3.12/operations/installation/_index.md +++ b/site/content/arangodb/3.12/operations/installation/_index.md @@ -56,7 +56,7 @@ The official Linux release executables of ArangoDB require the operating system to use a page size of **4096 bytes** or less. {{< tip >}} -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is a fully-managed service and requires no installation. It's the easiest way to run ArangoDB in the cloud. {{< /tip >}} diff --git a/site/content/3.12/operations/installation/docker.md b/site/content/arangodb/3.12/operations/installation/docker.md similarity index 100% rename from site/content/3.12/operations/installation/docker.md rename to site/content/arangodb/3.12/operations/installation/docker.md diff --git a/site/content/3.12/operations/installation/linux/_index.md b/site/content/arangodb/3.12/operations/installation/linux/_index.md similarity index 100% rename from site/content/3.12/operations/installation/linux/_index.md rename to site/content/arangodb/3.12/operations/installation/linux/_index.md diff --git a/site/content/3.12/operations/installation/linux/linux-os-tuning-script-examples.md b/site/content/arangodb/3.12/operations/installation/linux/linux-os-tuning-script-examples.md similarity index 100% rename from site/content/3.12/operations/installation/linux/linux-os-tuning-script-examples.md rename to site/content/arangodb/3.12/operations/installation/linux/linux-os-tuning-script-examples.md diff --git a/site/content/3.12/operations/installation/linux/operating-system-configuration.md b/site/content/arangodb/3.12/operations/installation/linux/operating-system-configuration.md similarity index 100% rename from site/content/3.12/operations/installation/linux/operating-system-configuration.md rename to site/content/arangodb/3.12/operations/installation/linux/operating-system-configuration.md diff --git a/site/content/3.12/operations/installation/uninstallation.md b/site/content/arangodb/3.12/operations/installation/uninstallation.md similarity index 100% rename from site/content/3.12/operations/installation/uninstallation.md rename to site/content/arangodb/3.12/operations/installation/uninstallation.md diff --git a/site/content/3.12/operations/security/_index.md b/site/content/arangodb/3.12/operations/security/_index.md similarity index 100% rename from site/content/3.12/operations/security/_index.md rename to site/content/arangodb/3.12/operations/security/_index.md diff --git a/site/content/3.12/operations/security/audit-logging.md b/site/content/arangodb/3.12/operations/security/audit-logging.md similarity index 98% rename from site/content/3.12/operations/security/audit-logging.md rename to site/content/arangodb/3.12/operations/security/audit-logging.md index cf18c9abf3..99732fa739 100644 --- a/site/content/3.12/operations/security/audit-logging.md +++ b/site/content/arangodb/3.12/operations/security/audit-logging.md @@ -11,7 +11,7 @@ pageToc: --- {{< tip >}} A similar feature is also available in the -[ArangoGraph Insights Platform](../../arangograph/security-and-access-control/_index.md#using-an-audit-log). +[Arango Managed Platform (AMP)](../../../../amp/security-and-access-control/_index.md#using-an-audit-log). {{< /tip >}} ## Configuration diff --git a/site/content/3.12/operations/security/change-root-password.md b/site/content/arangodb/3.12/operations/security/change-root-password.md similarity index 100% rename from site/content/3.12/operations/security/change-root-password.md rename to site/content/arangodb/3.12/operations/security/change-root-password.md diff --git a/site/content/3.13/operations/security/encryption-at-rest.md b/site/content/arangodb/3.12/operations/security/encryption-at-rest.md similarity index 97% rename from site/content/3.13/operations/security/encryption-at-rest.md rename to site/content/arangodb/3.12/operations/security/encryption-at-rest.md index d292695e48..e7af703377 100644 --- a/site/content/3.13/operations/security/encryption-at-rest.md +++ b/site/content/arangodb/3.12/operations/security/encryption-at-rest.md @@ -28,9 +28,9 @@ performance and resistance to side-channel attacks. The encryption feature is supported by all ArangoDB deployment modes. {{< info >}} -The ArangoGraph Insights Platform has encryption at rest as well as in transit +The Arango Managed Platform (AMP) has encryption at rest as well as in transit set on by default and cannot be disabled. For more information, see the -[ArangoGraph documentation](../../arangograph/_index.md). +[ArangoGraph documentation](../../../../amp/_index.md). {{< /info >}} ## Limitations diff --git a/site/content/3.12/operations/security/securing-starter-deployments.md b/site/content/arangodb/3.12/operations/security/securing-starter-deployments.md similarity index 100% rename from site/content/3.12/operations/security/securing-starter-deployments.md rename to site/content/arangodb/3.12/operations/security/securing-starter-deployments.md diff --git a/site/content/3.12/operations/security/security-options.md b/site/content/arangodb/3.12/operations/security/security-options.md similarity index 100% rename from site/content/3.12/operations/security/security-options.md rename to site/content/arangodb/3.12/operations/security/security-options.md diff --git a/site/content/3.12/operations/troubleshooting/_index.md b/site/content/arangodb/3.12/operations/troubleshooting/_index.md similarity index 100% rename from site/content/3.12/operations/troubleshooting/_index.md rename to site/content/arangodb/3.12/operations/troubleshooting/_index.md diff --git a/site/content/3.12/operations/troubleshooting/arangod.md b/site/content/arangodb/3.12/operations/troubleshooting/arangod.md similarity index 100% rename from site/content/3.12/operations/troubleshooting/arangod.md rename to site/content/arangodb/3.12/operations/troubleshooting/arangod.md diff --git a/site/content/3.12/operations/troubleshooting/cluster/_index.md b/site/content/arangodb/3.12/operations/troubleshooting/cluster/_index.md similarity index 100% rename from site/content/3.12/operations/troubleshooting/cluster/_index.md rename to site/content/arangodb/3.12/operations/troubleshooting/cluster/_index.md diff --git a/site/content/3.12/operations/troubleshooting/cluster/agency-dump.md b/site/content/arangodb/3.12/operations/troubleshooting/cluster/agency-dump.md similarity index 100% rename from site/content/3.12/operations/troubleshooting/cluster/agency-dump.md rename to site/content/arangodb/3.12/operations/troubleshooting/cluster/agency-dump.md diff --git a/site/content/3.12/operations/troubleshooting/emergency-console.md b/site/content/arangodb/3.12/operations/troubleshooting/emergency-console.md similarity index 100% rename from site/content/3.12/operations/troubleshooting/emergency-console.md rename to site/content/arangodb/3.12/operations/troubleshooting/emergency-console.md diff --git a/site/content/3.12/operations/troubleshooting/query-debug-packages.md b/site/content/arangodb/3.12/operations/troubleshooting/query-debug-packages.md similarity index 100% rename from site/content/3.12/operations/troubleshooting/query-debug-packages.md rename to site/content/arangodb/3.12/operations/troubleshooting/query-debug-packages.md diff --git a/site/content/3.12/operations/upgrading/_index.md b/site/content/arangodb/3.12/operations/upgrading/_index.md similarity index 100% rename from site/content/3.12/operations/upgrading/_index.md rename to site/content/arangodb/3.12/operations/upgrading/_index.md diff --git a/site/content/3.12/operations/upgrading/community-to-enterprise-upgrade.md b/site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md similarity index 97% rename from site/content/3.12/operations/upgrading/community-to-enterprise-upgrade.md rename to site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md index 919e38c63e..bce4a011da 100644 --- a/site/content/3.12/operations/upgrading/community-to-enterprise-upgrade.md +++ b/site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md @@ -7,7 +7,7 @@ description: '' {{< info >}} From version 3.12.5 onward, the prepackaged binaries and official Docker images of the Community Edition include all features of the Enterprise Edition. -See [ArangoDB Editions](../../about-arangodb/features/_index.md#arangodb-editions) +See [ArangoDB Editions](../../about/features/_index.md#arangodb-editions) for details. To upgrade a deployment created with v3.12.5 or later from the Community Edition diff --git a/site/content/3.12/operations/upgrading/downgrading.md b/site/content/arangodb/3.12/operations/upgrading/downgrading.md similarity index 100% rename from site/content/3.12/operations/upgrading/downgrading.md rename to site/content/arangodb/3.12/operations/upgrading/downgrading.md diff --git a/site/content/3.12/operations/upgrading/manual-deployments/_index.md b/site/content/arangodb/3.12/operations/upgrading/manual-deployments/_index.md similarity index 100% rename from site/content/3.12/operations/upgrading/manual-deployments/_index.md rename to site/content/arangodb/3.12/operations/upgrading/manual-deployments/_index.md diff --git a/site/content/3.12/operations/upgrading/manual-deployments/cluster.md b/site/content/arangodb/3.12/operations/upgrading/manual-deployments/cluster.md similarity index 100% rename from site/content/3.12/operations/upgrading/manual-deployments/cluster.md rename to site/content/arangodb/3.12/operations/upgrading/manual-deployments/cluster.md diff --git a/site/content/3.12/operations/upgrading/manual-deployments/single-server.md b/site/content/arangodb/3.12/operations/upgrading/manual-deployments/single-server.md similarity index 100% rename from site/content/3.12/operations/upgrading/manual-deployments/single-server.md rename to site/content/arangodb/3.12/operations/upgrading/manual-deployments/single-server.md diff --git a/site/content/3.12/operations/upgrading/starter-deployments.md b/site/content/arangodb/3.12/operations/upgrading/starter-deployments.md similarity index 100% rename from site/content/3.12/operations/upgrading/starter-deployments.md rename to site/content/arangodb/3.12/operations/upgrading/starter-deployments.md diff --git a/site/content/3.12/release-notes/_index.md b/site/content/arangodb/3.12/release-notes/_index.md similarity index 100% rename from site/content/3.12/release-notes/_index.md rename to site/content/arangodb/3.12/release-notes/_index.md diff --git a/site/content/3.12/release-notes/deprecated-and-removed-features.md b/site/content/arangodb/3.12/release-notes/deprecated-and-removed-features.md similarity index 100% rename from site/content/3.12/release-notes/deprecated-and-removed-features.md rename to site/content/arangodb/3.12/release-notes/deprecated-and-removed-features.md diff --git a/site/content/3.12/release-notes/version-3.0/_index.md b/site/content/arangodb/3.12/release-notes/version-3.0/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.0/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.0/_index.md diff --git a/site/content/3.12/release-notes/version-3.0/incompatible-changes-in-3-0.md b/site/content/arangodb/3.12/release-notes/version-3.0/incompatible-changes-in-3-0.md similarity index 100% rename from site/content/3.12/release-notes/version-3.0/incompatible-changes-in-3-0.md rename to site/content/arangodb/3.12/release-notes/version-3.0/incompatible-changes-in-3-0.md diff --git a/site/content/3.12/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.12/release-notes/version-3.0/whats-new-in-3-0.md similarity index 100% rename from site/content/3.12/release-notes/version-3.0/whats-new-in-3-0.md rename to site/content/arangodb/3.12/release-notes/version-3.0/whats-new-in-3-0.md diff --git a/site/content/3.12/release-notes/version-3.1/_index.md b/site/content/arangodb/3.12/release-notes/version-3.1/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.1/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.1/_index.md diff --git a/site/content/3.12/release-notes/version-3.1/incompatible-changes-in-3-1.md b/site/content/arangodb/3.12/release-notes/version-3.1/incompatible-changes-in-3-1.md similarity index 100% rename from site/content/3.12/release-notes/version-3.1/incompatible-changes-in-3-1.md rename to site/content/arangodb/3.12/release-notes/version-3.1/incompatible-changes-in-3-1.md diff --git a/site/content/3.12/release-notes/version-3.1/whats-new-in-3-1.md b/site/content/arangodb/3.12/release-notes/version-3.1/whats-new-in-3-1.md similarity index 100% rename from site/content/3.12/release-notes/version-3.1/whats-new-in-3-1.md rename to site/content/arangodb/3.12/release-notes/version-3.1/whats-new-in-3-1.md diff --git a/site/content/3.12/release-notes/version-3.10/_index.md b/site/content/arangodb/3.12/release-notes/version-3.10/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.10/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.10/_index.md diff --git a/site/content/3.12/release-notes/version-3.10/api-changes-in-3-10.md b/site/content/arangodb/3.12/release-notes/version-3.10/api-changes-in-3-10.md similarity index 100% rename from site/content/3.12/release-notes/version-3.10/api-changes-in-3-10.md rename to site/content/arangodb/3.12/release-notes/version-3.10/api-changes-in-3-10.md diff --git a/site/content/3.12/release-notes/version-3.10/incompatible-changes-in-3-10.md b/site/content/arangodb/3.12/release-notes/version-3.10/incompatible-changes-in-3-10.md similarity index 100% rename from site/content/3.12/release-notes/version-3.10/incompatible-changes-in-3-10.md rename to site/content/arangodb/3.12/release-notes/version-3.10/incompatible-changes-in-3-10.md diff --git a/site/content/3.12/release-notes/version-3.10/known-issues-in-3-10.md b/site/content/arangodb/3.12/release-notes/version-3.10/known-issues-in-3-10.md similarity index 100% rename from site/content/3.12/release-notes/version-3.10/known-issues-in-3-10.md rename to site/content/arangodb/3.12/release-notes/version-3.10/known-issues-in-3-10.md diff --git a/site/content/3.12/release-notes/version-3.10/whats-new-in-3-10.md b/site/content/arangodb/3.12/release-notes/version-3.10/whats-new-in-3-10.md similarity index 100% rename from site/content/3.12/release-notes/version-3.10/whats-new-in-3-10.md rename to site/content/arangodb/3.12/release-notes/version-3.10/whats-new-in-3-10.md diff --git a/site/content/3.12/release-notes/version-3.11/_index.md b/site/content/arangodb/3.12/release-notes/version-3.11/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.11/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.11/_index.md diff --git a/site/content/3.12/release-notes/version-3.11/api-changes-in-3-11.md b/site/content/arangodb/3.12/release-notes/version-3.11/api-changes-in-3-11.md similarity index 100% rename from site/content/3.12/release-notes/version-3.11/api-changes-in-3-11.md rename to site/content/arangodb/3.12/release-notes/version-3.11/api-changes-in-3-11.md diff --git a/site/content/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md similarity index 100% rename from site/content/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md rename to site/content/arangodb/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md diff --git a/site/content/3.12/release-notes/version-3.11/known-issues-in-3-11.md b/site/content/arangodb/3.12/release-notes/version-3.11/known-issues-in-3-11.md similarity index 100% rename from site/content/3.12/release-notes/version-3.11/known-issues-in-3-11.md rename to site/content/arangodb/3.12/release-notes/version-3.11/known-issues-in-3-11.md diff --git a/site/content/3.12/release-notes/version-3.11/whats-new-in-3-11.md b/site/content/arangodb/3.12/release-notes/version-3.11/whats-new-in-3-11.md similarity index 99% rename from site/content/3.12/release-notes/version-3.11/whats-new-in-3-11.md rename to site/content/arangodb/3.12/release-notes/version-3.11/whats-new-in-3-11.md index 44ee2b0339..e58d83ff2e 100644 --- a/site/content/3.12/release-notes/version-3.11/whats-new-in-3-11.md +++ b/site/content/arangodb/3.12/release-notes/version-3.11/whats-new-in-3-11.md @@ -127,7 +127,7 @@ vertex. Another quality-of-life improvement is the **Start node** setting listin the graph's vertex collections and the available document keys, that you can also search by. -![New graph viewer](../../../images/graphViewer.png) +![New graph viewer](../../../../images/graphViewer.png) You can still switch to the old graph viewer if desired. diff --git a/site/content/3.12/release-notes/version-3.12/_index.md b/site/content/arangodb/3.12/release-notes/version-3.12/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.12/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.12/_index.md diff --git a/site/content/3.12/release-notes/version-3.12/api-changes-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/api-changes-in-3-12.md similarity index 100% rename from site/content/3.12/release-notes/version-3.12/api-changes-in-3-12.md rename to site/content/arangodb/3.12/release-notes/version-3.12/api-changes-in-3-12.md diff --git a/site/content/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md similarity index 100% rename from site/content/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md rename to site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md diff --git a/site/content/3.12/release-notes/version-3.12/known-issues-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/known-issues-in-3-12.md similarity index 100% rename from site/content/3.12/release-notes/version-3.12/known-issues-in-3-12.md rename to site/content/arangodb/3.12/release-notes/version-3.12/known-issues-in-3-12.md diff --git a/site/content/3.12/release-notes/version-3.12/whats-new-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/whats-new-in-3-12.md similarity index 100% rename from site/content/3.12/release-notes/version-3.12/whats-new-in-3-12.md rename to site/content/arangodb/3.12/release-notes/version-3.12/whats-new-in-3-12.md diff --git a/site/content/3.12/release-notes/version-3.2/_index.md b/site/content/arangodb/3.12/release-notes/version-3.2/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.2/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.2/_index.md diff --git a/site/content/3.12/release-notes/version-3.2/incompatible-changes-in-3-2.md b/site/content/arangodb/3.12/release-notes/version-3.2/incompatible-changes-in-3-2.md similarity index 100% rename from site/content/3.12/release-notes/version-3.2/incompatible-changes-in-3-2.md rename to site/content/arangodb/3.12/release-notes/version-3.2/incompatible-changes-in-3-2.md diff --git a/site/content/3.12/release-notes/version-3.2/known-issues-in-3-2.md b/site/content/arangodb/3.12/release-notes/version-3.2/known-issues-in-3-2.md similarity index 100% rename from site/content/3.12/release-notes/version-3.2/known-issues-in-3-2.md rename to site/content/arangodb/3.12/release-notes/version-3.2/known-issues-in-3-2.md diff --git a/site/content/3.12/release-notes/version-3.2/whats-new-in-3-2.md b/site/content/arangodb/3.12/release-notes/version-3.2/whats-new-in-3-2.md similarity index 100% rename from site/content/3.12/release-notes/version-3.2/whats-new-in-3-2.md rename to site/content/arangodb/3.12/release-notes/version-3.2/whats-new-in-3-2.md diff --git a/site/content/3.12/release-notes/version-3.3/_index.md b/site/content/arangodb/3.12/release-notes/version-3.3/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.3/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.3/_index.md diff --git a/site/content/3.12/release-notes/version-3.3/incompatible-changes-in-3-3.md b/site/content/arangodb/3.12/release-notes/version-3.3/incompatible-changes-in-3-3.md similarity index 100% rename from site/content/3.12/release-notes/version-3.3/incompatible-changes-in-3-3.md rename to site/content/arangodb/3.12/release-notes/version-3.3/incompatible-changes-in-3-3.md diff --git a/site/content/3.12/release-notes/version-3.3/known-issues-in-3-3.md b/site/content/arangodb/3.12/release-notes/version-3.3/known-issues-in-3-3.md similarity index 100% rename from site/content/3.12/release-notes/version-3.3/known-issues-in-3-3.md rename to site/content/arangodb/3.12/release-notes/version-3.3/known-issues-in-3-3.md diff --git a/site/content/3.12/release-notes/version-3.3/whats-new-in-3-3.md b/site/content/arangodb/3.12/release-notes/version-3.3/whats-new-in-3-3.md similarity index 100% rename from site/content/3.12/release-notes/version-3.3/whats-new-in-3-3.md rename to site/content/arangodb/3.12/release-notes/version-3.3/whats-new-in-3-3.md diff --git a/site/content/3.12/release-notes/version-3.4/_index.md b/site/content/arangodb/3.12/release-notes/version-3.4/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.4/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.4/_index.md diff --git a/site/content/3.12/release-notes/version-3.4/incompatible-changes-in-3-4.md b/site/content/arangodb/3.12/release-notes/version-3.4/incompatible-changes-in-3-4.md similarity index 100% rename from site/content/3.12/release-notes/version-3.4/incompatible-changes-in-3-4.md rename to site/content/arangodb/3.12/release-notes/version-3.4/incompatible-changes-in-3-4.md diff --git a/site/content/3.12/release-notes/version-3.4/known-issues-in-3-4.md b/site/content/arangodb/3.12/release-notes/version-3.4/known-issues-in-3-4.md similarity index 100% rename from site/content/3.12/release-notes/version-3.4/known-issues-in-3-4.md rename to site/content/arangodb/3.12/release-notes/version-3.4/known-issues-in-3-4.md diff --git a/site/content/3.12/release-notes/version-3.4/whats-new-in-3-4.md b/site/content/arangodb/3.12/release-notes/version-3.4/whats-new-in-3-4.md similarity index 100% rename from site/content/3.12/release-notes/version-3.4/whats-new-in-3-4.md rename to site/content/arangodb/3.12/release-notes/version-3.4/whats-new-in-3-4.md diff --git a/site/content/3.12/release-notes/version-3.5/_index.md b/site/content/arangodb/3.12/release-notes/version-3.5/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.5/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.5/_index.md diff --git a/site/content/3.12/release-notes/version-3.5/incompatible-changes-in-3-5.md b/site/content/arangodb/3.12/release-notes/version-3.5/incompatible-changes-in-3-5.md similarity index 100% rename from site/content/3.12/release-notes/version-3.5/incompatible-changes-in-3-5.md rename to site/content/arangodb/3.12/release-notes/version-3.5/incompatible-changes-in-3-5.md diff --git a/site/content/3.12/release-notes/version-3.5/known-issues-in-3-5.md b/site/content/arangodb/3.12/release-notes/version-3.5/known-issues-in-3-5.md similarity index 100% rename from site/content/3.12/release-notes/version-3.5/known-issues-in-3-5.md rename to site/content/arangodb/3.12/release-notes/version-3.5/known-issues-in-3-5.md diff --git a/site/content/3.12/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.12/release-notes/version-3.5/whats-new-in-3-5.md similarity index 100% rename from site/content/3.12/release-notes/version-3.5/whats-new-in-3-5.md rename to site/content/arangodb/3.12/release-notes/version-3.5/whats-new-in-3-5.md diff --git a/site/content/3.12/release-notes/version-3.6/_index.md b/site/content/arangodb/3.12/release-notes/version-3.6/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.6/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.6/_index.md diff --git a/site/content/3.12/release-notes/version-3.6/incompatible-changes-in-3-6.md b/site/content/arangodb/3.12/release-notes/version-3.6/incompatible-changes-in-3-6.md similarity index 100% rename from site/content/3.12/release-notes/version-3.6/incompatible-changes-in-3-6.md rename to site/content/arangodb/3.12/release-notes/version-3.6/incompatible-changes-in-3-6.md diff --git a/site/content/3.12/release-notes/version-3.6/known-issues-in-3-6.md b/site/content/arangodb/3.12/release-notes/version-3.6/known-issues-in-3-6.md similarity index 100% rename from site/content/3.12/release-notes/version-3.6/known-issues-in-3-6.md rename to site/content/arangodb/3.12/release-notes/version-3.6/known-issues-in-3-6.md diff --git a/site/content/3.12/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.12/release-notes/version-3.6/whats-new-in-3-6.md similarity index 100% rename from site/content/3.12/release-notes/version-3.6/whats-new-in-3-6.md rename to site/content/arangodb/3.12/release-notes/version-3.6/whats-new-in-3-6.md diff --git a/site/content/3.12/release-notes/version-3.7/_index.md b/site/content/arangodb/3.12/release-notes/version-3.7/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.7/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.7/_index.md diff --git a/site/content/3.12/release-notes/version-3.7/api-changes-in-3-7.md b/site/content/arangodb/3.12/release-notes/version-3.7/api-changes-in-3-7.md similarity index 100% rename from site/content/3.12/release-notes/version-3.7/api-changes-in-3-7.md rename to site/content/arangodb/3.12/release-notes/version-3.7/api-changes-in-3-7.md diff --git a/site/content/3.12/release-notes/version-3.7/incompatible-changes-in-3-7.md b/site/content/arangodb/3.12/release-notes/version-3.7/incompatible-changes-in-3-7.md similarity index 100% rename from site/content/3.12/release-notes/version-3.7/incompatible-changes-in-3-7.md rename to site/content/arangodb/3.12/release-notes/version-3.7/incompatible-changes-in-3-7.md diff --git a/site/content/3.12/release-notes/version-3.7/known-issues-in-3-7.md b/site/content/arangodb/3.12/release-notes/version-3.7/known-issues-in-3-7.md similarity index 100% rename from site/content/3.12/release-notes/version-3.7/known-issues-in-3-7.md rename to site/content/arangodb/3.12/release-notes/version-3.7/known-issues-in-3-7.md diff --git a/site/content/3.12/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.12/release-notes/version-3.7/whats-new-in-3-7.md similarity index 100% rename from site/content/3.12/release-notes/version-3.7/whats-new-in-3-7.md rename to site/content/arangodb/3.12/release-notes/version-3.7/whats-new-in-3-7.md diff --git a/site/content/3.12/release-notes/version-3.8/_index.md b/site/content/arangodb/3.12/release-notes/version-3.8/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.8/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.8/_index.md diff --git a/site/content/3.12/release-notes/version-3.8/api-changes-in-3-8.md b/site/content/arangodb/3.12/release-notes/version-3.8/api-changes-in-3-8.md similarity index 100% rename from site/content/3.12/release-notes/version-3.8/api-changes-in-3-8.md rename to site/content/arangodb/3.12/release-notes/version-3.8/api-changes-in-3-8.md diff --git a/site/content/3.12/release-notes/version-3.8/incompatible-changes-in-3-8.md b/site/content/arangodb/3.12/release-notes/version-3.8/incompatible-changes-in-3-8.md similarity index 100% rename from site/content/3.12/release-notes/version-3.8/incompatible-changes-in-3-8.md rename to site/content/arangodb/3.12/release-notes/version-3.8/incompatible-changes-in-3-8.md diff --git a/site/content/3.12/release-notes/version-3.8/known-issues-in-3-8.md b/site/content/arangodb/3.12/release-notes/version-3.8/known-issues-in-3-8.md similarity index 100% rename from site/content/3.12/release-notes/version-3.8/known-issues-in-3-8.md rename to site/content/arangodb/3.12/release-notes/version-3.8/known-issues-in-3-8.md diff --git a/site/content/3.12/release-notes/version-3.8/whats-new-in-3-8.md b/site/content/arangodb/3.12/release-notes/version-3.8/whats-new-in-3-8.md similarity index 100% rename from site/content/3.12/release-notes/version-3.8/whats-new-in-3-8.md rename to site/content/arangodb/3.12/release-notes/version-3.8/whats-new-in-3-8.md diff --git a/site/content/3.12/release-notes/version-3.9/_index.md b/site/content/arangodb/3.12/release-notes/version-3.9/_index.md similarity index 100% rename from site/content/3.12/release-notes/version-3.9/_index.md rename to site/content/arangodb/3.12/release-notes/version-3.9/_index.md diff --git a/site/content/3.12/release-notes/version-3.9/api-changes-in-3-9.md b/site/content/arangodb/3.12/release-notes/version-3.9/api-changes-in-3-9.md similarity index 100% rename from site/content/3.12/release-notes/version-3.9/api-changes-in-3-9.md rename to site/content/arangodb/3.12/release-notes/version-3.9/api-changes-in-3-9.md diff --git a/site/content/3.12/release-notes/version-3.9/incompatible-changes-in-3-9.md b/site/content/arangodb/3.12/release-notes/version-3.9/incompatible-changes-in-3-9.md similarity index 100% rename from site/content/3.12/release-notes/version-3.9/incompatible-changes-in-3-9.md rename to site/content/arangodb/3.12/release-notes/version-3.9/incompatible-changes-in-3-9.md diff --git a/site/content/3.12/release-notes/version-3.9/known-issues-in-3-9.md b/site/content/arangodb/3.12/release-notes/version-3.9/known-issues-in-3-9.md similarity index 100% rename from site/content/3.12/release-notes/version-3.9/known-issues-in-3-9.md rename to site/content/arangodb/3.12/release-notes/version-3.9/known-issues-in-3-9.md diff --git a/site/content/3.12/release-notes/version-3.9/whats-new-in-3-9.md b/site/content/arangodb/3.12/release-notes/version-3.9/whats-new-in-3-9.md similarity index 100% rename from site/content/3.12/release-notes/version-3.9/whats-new-in-3-9.md rename to site/content/arangodb/3.12/release-notes/version-3.9/whats-new-in-3-9.md diff --git a/site/content/3.13/_index.md b/site/content/arangodb/3.13/_index.md similarity index 59% rename from site/content/3.13/_index.md rename to site/content/arangodb/3.13/_index.md index dbc8bb3ea2..43a6197b31 100644 --- a/site/content/3.13/_index.md +++ b/site/content/arangodb/3.13/_index.md @@ -8,7 +8,7 @@ layout: default {{< cards >}} -{{% card title="What is ArangoDB?" link="about-arangodb/" %}} +{{% card title="What is ArangoDB?" link="about/" %}} Get to know graphs, ArangoDB's use cases and features. {{% /card %}} @@ -17,24 +17,11 @@ Learn about ArangoDB's core concepts, how to interact with the database system, and get a server instance up and running. {{% /card %}} -{{% card title="ArangoGraph Insights Platform" link="arangograph/" %}} -Try out ArangoDB's fully-managed cloud offering for a faster time to value. -{{% /card %}} - {{% card title="AQL" link="aql/" %}} ArangoDB's Query Language AQL lets you use graphs, JSON documents, and search via a single, composable query language. {{% /card %}} -{{% card title="GenAI & Data Science" link="data-science/" %}} -Discover the graph-powered machine learning and GraphRAG features of ArangoDB. -{{% /card %}} - -{{% card title="ArangoDB Platform" link="components/platform/" %}} -The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering -of products, including GraphML and GraphRAG. -{{% /card %}} - {{% card title="Deploy" link="deploy/" %}} Find the right deployment mode and set up your ArangoDB instance. {{% /card %}} diff --git a/site/content/3.13/about-arangodb/_index.md b/site/content/arangodb/3.13/about/_index.md similarity index 82% rename from site/content/3.13/about-arangodb/_index.md rename to site/content/arangodb/3.13/about/_index.md index ea7094cbb1..b47cbeb22f 100644 --- a/site/content/3.13/about-arangodb/_index.md +++ b/site/content/arangodb/3.13/about/_index.md @@ -9,7 +9,7 @@ aliases: - introduction - introduction/about-arangodb --- -![ArangoDB Overview Diagram](../../images/arangodb-overview-diagram.png) +![ArangoDB Overview Diagram](../../../../images/arangodb-overview-diagram.png) ArangoDB combines the analytical power of native graphs with an integrated search engine, JSON support, and a variety of data access patterns via a single, @@ -17,25 +17,25 @@ composable query language. ArangoDB is available in a community and a commercial [edition](features/_index.md). You can use it for on-premises deployments, as well as a fully managed -cloud service, the [ArangoGraph Insights Platform](../arangograph/_index.md). +cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). ## What are Graphs? Graphs are information networks composed of nodes and edges. -![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../images/data-model-graph-relation-abstract-edge.png) +![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../../../images/data-model-graph-relation-abstract-edge.png) A social network is a common example of a graph. People are represented by nodes and their friendships by relations. -![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../images/data-model-graph-relation-concrete.png) +![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../../../images/data-model-graph-relation-concrete.png) Nodes are also called vertices (singular: vertex), and edges are relations that connect nodes. A node typically represents a specific entity (a person, a book, a sensor reading, etc.) and an edge defines how one entity relates to another. -![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../images/data-model-graph-relations.png) +![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../../../images/data-model-graph-relations.png) This paradigm of storing data feels natural because it closely matches the cognitive model of humans. It is an expressive data model that allows you to @@ -48,7 +48,7 @@ Not everything is a graph use case. ArangoDB lets you equally work with structured, semi-structured, and unstructured data in the form of schema-free JSON objects, without having to connect these objects to form a graph. -![Person Mary, Book ArangoDB](../../images/data-model-document.png) +![Person Mary, Book ArangoDB](../../../../images/data-model-document.png) Depending on your needs, you may mix graphs and unconnected data. ArangoDB is designed from the ground up to support multiple data models with a diff --git a/site/content/3.12/about-arangodb/features/_index.md b/site/content/arangodb/3.13/about/features/_index.md similarity index 94% rename from site/content/3.12/about-arangodb/features/_index.md rename to site/content/arangodb/3.13/about/features/_index.md index b1b00f00c5..674e603252 100644 --- a/site/content/3.12/about-arangodb/features/_index.md +++ b/site/content/arangodb/3.13/about/features/_index.md @@ -19,18 +19,18 @@ aliases: - Enhanced data security with on-disk and backup encryption, key rotation, audit logging, and incremental backups without downtime -See the full [Feature list of the ArangoDB core database system](core.md). +See the full [Feature list of the ArangoDB database system](list.md). For a scalable architecture based on Kubernetes that supports the full offering of ArangoDB including graph-powered machine learning and GenAI features, see -the [Feature list of the ArangoDB Platform](platform.md). +the [Feature list of the ArangoDB Platform](../../../../data-platform/about/features.md). ## On-premises versus Cloud ### Fully managed cloud service The fully managed multi-cloud -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is the easiest and fastest way to get started. It lets you deploy clusters with just a few clicks, and is operated by a dedicated team of ArangoDB engineers day and night. You can choose from a @@ -43,7 +43,7 @@ variety of support plans to meet your needs. - Highly secure with encryption at transit and at rest - Includes elastic scalability for all deployment models (OneShard and Sharded clusters) -To learn more, go to the [ArangoGraph documentation](../../arangograph/_index.md). +To learn more, go to the [ArangoGraph documentation](../../../../amp/_index.md). ### Self-managed in the cloud diff --git a/site/content/3.13/about-arangodb/features/highlights-by-version.md b/site/content/arangodb/3.13/about/features/highlights-by-version.md similarity index 100% rename from site/content/3.13/about-arangodb/features/highlights-by-version.md rename to site/content/arangodb/3.13/about/features/highlights-by-version.md diff --git a/site/content/3.13/about-arangodb/features/core.md b/site/content/arangodb/3.13/about/features/list.md similarity index 100% rename from site/content/3.13/about-arangodb/features/core.md rename to site/content/arangodb/3.13/about/features/list.md diff --git a/site/content/3.12/about-arangodb/use-cases.md b/site/content/arangodb/3.13/about/use-cases.md similarity index 77% rename from site/content/3.12/about-arangodb/use-cases.md rename to site/content/arangodb/3.13/about/use-cases.md index fab9e86a90..0128025595 100644 --- a/site/content/3.12/about-arangodb/use-cases.md +++ b/site/content/arangodb/3.13/about/use-cases.md @@ -19,7 +19,7 @@ more. ### Fraud Detection -{{< image src="../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Uncover illegal activities by discovering difficult-to-detect patterns. ArangoDB lets you look beyond individual data points in disparate data sources, @@ -29,7 +29,7 @@ complex fraudulent behavior such as fraud rings. ### Recommendation Engine -{{< image src="../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Suggest products, services, and information to users based on data relationships. For example, you can use ArangoDB together with PyTorch Geometric to build a @@ -39,7 +39,7 @@ with a graph neural network (GNN). ### Network Management -{{< image src="../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Reduce downtime by connecting and visualizing network, infrastructure, and code. Network devices and how they interconnect can naturally be modeled as a graph. @@ -49,7 +49,7 @@ bandwidth into account when path-finding. ### Customer 360 -{{< image src="../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Gain a complete understanding of your customers by integrating multiple data sources and code. ArangoDB can act as the platform to merge and consolidate @@ -58,7 +58,7 @@ track data origins using graph features. ### Identity and Access Management -{{< image src="../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Increase security and compliance by managing data access based on role and position. You can map out an organization chart as a graph and use ArangoDB to @@ -68,7 +68,7 @@ inheritance. ### Supply Chain -{{< image src="../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Speed shipments by monitoring and optimizing the flow of goods through a supply chain. You can represent your inventory, supplier, and delivery @@ -84,7 +84,7 @@ and scalable data store. ### Content Management -{{< image src="../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Store information of any kind without upfront schema declaration. ArangoDB is schema-free, storing every data record as a self-contained document, allowing @@ -93,7 +93,7 @@ content management system on top of ArangoDB. ### E-Commerce Systems -{{< image src="../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB combines data modeling freedom with strong consistency and resilience features to power online shops and ordering systems. Handle product catalog data @@ -102,7 +102,7 @@ checkouts with the necessary transactional guarantees. ### Internet of Things -{{< image src="../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Collect sensor readings and other IoT data in ArangoDB for a single view of everything. Store all data points in the same system that also lets you run @@ -110,7 +110,7 @@ aggregation queries using sliding windows for efficient data analysis. ## ArangoDB as a Key-Value Database -{{< image src="../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Key-value stores are the simplest kind of database systems. Each record is stored as a block of data under a key that uniquely identifies the record. @@ -134,7 +134,7 @@ For more information about how ArangoDB persists data, see ## ArangoDB as a Search Engine -{{< image src="../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB has a natively integrated search engine for a broad range of information retrieval needs. It is powered by inverted indexes and can index @@ -161,4 +161,4 @@ ArangoDB integrates well into existing data infrastructures and provides connectors for popular machine learning frameworks and data processing ecosystems. -![Machine Learning Architecture of ArangoDB](../../images/machine-learning-architecture.png) +![Machine Learning Architecture of ArangoDB](../../../images/machine-learning-architecture.png) diff --git a/site/content/3.13/aql/_index.md b/site/content/arangodb/3.13/aql/_index.md similarity index 96% rename from site/content/3.13/aql/_index.md rename to site/content/arangodb/3.13/aql/_index.md index befe676097..ef7dd67757 100644 --- a/site/content/3.13/aql/_index.md +++ b/site/content/arangodb/3.13/aql/_index.md @@ -6,7 +6,7 @@ description: >- The ArangoDB Query Language (AQL) lets you store, retrieve, and modify data in various ways in ArangoDB --- -- [Link to Platform](../../platform/data-science/_index.md) +- [Link to Platform](../../../data-platform/_index.md) AQL is mainly a declarative language, meaning that a query expresses what result should be achieved but not how it should be achieved. AQL aims to be diff --git a/site/content/3.13/aql/common-errors.md b/site/content/arangodb/3.13/aql/common-errors.md similarity index 100% rename from site/content/3.13/aql/common-errors.md rename to site/content/arangodb/3.13/aql/common-errors.md diff --git a/site/content/3.13/aql/data-queries.md b/site/content/arangodb/3.13/aql/data-queries.md similarity index 100% rename from site/content/3.13/aql/data-queries.md rename to site/content/arangodb/3.13/aql/data-queries.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/_index.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/_index.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/_index.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/_index.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/counting.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/counting.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/counting.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/counting.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/create-test-data.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/create-test-data.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/create-test-data.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/create-test-data.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/diffing-two-documents.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/diffing-two-documents.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/diffing-two-documents.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/diffing-two-documents.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/dynamic-attribute-names.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/dynamic-attribute-names.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/dynamic-attribute-names.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/dynamic-attribute-names.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/grouping.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/grouping.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/grouping.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/grouping.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/joins.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/joins.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/joins.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/joins.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/projections-and-filters.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/projections-and-filters.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/projections-and-filters.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/projections-and-filters.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/queries-without-collections.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/queries-without-collections.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/queries-without-collections.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/queries-without-collections.md diff --git a/site/content/3.13/aql/examples-and-query-patterns/remove-nodes.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/remove-nodes.md similarity index 96% rename from site/content/3.13/aql/examples-and-query-patterns/remove-nodes.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/remove-nodes.md index 8e9b0a9f61..a0843817e6 100644 --- a/site/content/3.13/aql/examples-and-query-patterns/remove-nodes.md +++ b/site/content/arangodb/3.13/aql/examples-and-query-patterns/remove-nodes.md @@ -17,7 +17,7 @@ However, as shown in this example based on the [Knows Graph](../../graphs/example-graphs.md#knows-graph), a query for this use case can be created. -![Example Graph](../../../images/knows_graph.png) +![Example Graph](../../../../images/knows_graph.png) When deleting node **eve** from the graph, we also want the edges `eve -> alice` and `eve -> bob` to be removed. @@ -61,7 +61,7 @@ For example, the [City Graph](../../graphs/example-graphs.md#city-graph) contains several node collections - `germanCity` and `frenchCity` and several edge collections - `french / german / international Highway`. -![Example Graph2](../../../images/cities_graph.png) +![Example Graph2](../../../../images/cities_graph.png) To delete city **Berlin** all edge collections `french / german / international Highway` have to be considered. The **REMOVE** operation has to be applied on all edge diff --git a/site/content/3.13/aql/examples-and-query-patterns/traversals.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/traversals.md similarity index 97% rename from site/content/3.13/aql/examples-and-query-patterns/traversals.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/traversals.md index 725885961c..f495de1e4b 100644 --- a/site/content/3.13/aql/examples-and-query-patterns/traversals.md +++ b/site/content/arangodb/3.13/aql/examples-and-query-patterns/traversals.md @@ -10,7 +10,7 @@ description: >- Our first example will locate the start node for a graph traversal via [a geo index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). We use the [City Graph](../../graphs/example-graphs.md#city-graph) and its geo indexes: -![Cities Example Graph](../../../images/cities_graph.png) +![Cities Example Graph](../../../../images/cities_graph.png) ```js --- diff --git a/site/content/3.13/aql/examples-and-query-patterns/upsert-repsert-guide.md b/site/content/arangodb/3.13/aql/examples-and-query-patterns/upsert-repsert-guide.md similarity index 100% rename from site/content/3.13/aql/examples-and-query-patterns/upsert-repsert-guide.md rename to site/content/arangodb/3.13/aql/examples-and-query-patterns/upsert-repsert-guide.md diff --git a/site/content/3.13/aql/execution-and-performance/_index.md b/site/content/arangodb/3.13/aql/execution-and-performance/_index.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/_index.md rename to site/content/arangodb/3.13/aql/execution-and-performance/_index.md diff --git a/site/content/3.13/aql/execution-and-performance/caching-query-plans.md b/site/content/arangodb/3.13/aql/execution-and-performance/caching-query-plans.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/caching-query-plans.md rename to site/content/arangodb/3.13/aql/execution-and-performance/caching-query-plans.md diff --git a/site/content/3.13/aql/execution-and-performance/caching-query-results.md b/site/content/arangodb/3.13/aql/execution-and-performance/caching-query-results.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/caching-query-results.md rename to site/content/arangodb/3.13/aql/execution-and-performance/caching-query-results.md diff --git a/site/content/3.13/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.13/aql/execution-and-performance/explaining-queries.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/explaining-queries.md rename to site/content/arangodb/3.13/aql/execution-and-performance/explaining-queries.md diff --git a/site/content/3.13/aql/execution-and-performance/parsing-queries.md b/site/content/arangodb/3.13/aql/execution-and-performance/parsing-queries.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/parsing-queries.md rename to site/content/arangodb/3.13/aql/execution-and-performance/parsing-queries.md diff --git a/site/content/3.13/aql/execution-and-performance/query-logging.md b/site/content/arangodb/3.13/aql/execution-and-performance/query-logging.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/query-logging.md rename to site/content/arangodb/3.13/aql/execution-and-performance/query-logging.md diff --git a/site/content/3.13/aql/execution-and-performance/query-optimization.md b/site/content/arangodb/3.13/aql/execution-and-performance/query-optimization.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/query-optimization.md rename to site/content/arangodb/3.13/aql/execution-and-performance/query-optimization.md diff --git a/site/content/3.13/aql/execution-and-performance/query-profiling.md b/site/content/arangodb/3.13/aql/execution-and-performance/query-profiling.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/query-profiling.md rename to site/content/arangodb/3.13/aql/execution-and-performance/query-profiling.md diff --git a/site/content/3.13/aql/execution-and-performance/query-statistics.md b/site/content/arangodb/3.13/aql/execution-and-performance/query-statistics.md similarity index 100% rename from site/content/3.13/aql/execution-and-performance/query-statistics.md rename to site/content/arangodb/3.13/aql/execution-and-performance/query-statistics.md diff --git a/site/content/3.13/aql/functions/_index.md b/site/content/arangodb/3.13/aql/functions/_index.md similarity index 100% rename from site/content/3.13/aql/functions/_index.md rename to site/content/arangodb/3.13/aql/functions/_index.md diff --git a/site/content/3.13/aql/functions/arangosearch.md b/site/content/arangodb/3.13/aql/functions/arangosearch.md similarity index 100% rename from site/content/3.13/aql/functions/arangosearch.md rename to site/content/arangodb/3.13/aql/functions/arangosearch.md diff --git a/site/content/3.13/aql/functions/array.md b/site/content/arangodb/3.13/aql/functions/array.md similarity index 100% rename from site/content/3.13/aql/functions/array.md rename to site/content/arangodb/3.13/aql/functions/array.md diff --git a/site/content/3.13/aql/functions/bit.md b/site/content/arangodb/3.13/aql/functions/bit.md similarity index 100% rename from site/content/3.13/aql/functions/bit.md rename to site/content/arangodb/3.13/aql/functions/bit.md diff --git a/site/content/3.13/aql/functions/date.md b/site/content/arangodb/3.13/aql/functions/date.md similarity index 100% rename from site/content/3.13/aql/functions/date.md rename to site/content/arangodb/3.13/aql/functions/date.md diff --git a/site/content/3.13/aql/functions/document-object.md b/site/content/arangodb/3.13/aql/functions/document-object.md similarity index 100% rename from site/content/3.13/aql/functions/document-object.md rename to site/content/arangodb/3.13/aql/functions/document-object.md diff --git a/site/content/3.13/aql/functions/fulltext.md b/site/content/arangodb/3.13/aql/functions/fulltext.md similarity index 100% rename from site/content/3.13/aql/functions/fulltext.md rename to site/content/arangodb/3.13/aql/functions/fulltext.md diff --git a/site/content/3.11/aql/functions/geo.md b/site/content/arangodb/3.13/aql/functions/geo.md similarity index 99% rename from site/content/3.11/aql/functions/geo.md rename to site/content/arangodb/3.13/aql/functions/geo.md index bc4558ee74..cf5b3f8a2d 100644 --- a/site/content/3.11/aql/functions/geo.md +++ b/site/content/arangodb/3.13/aql/functions/geo.md @@ -322,7 +322,7 @@ Consider the following polygon (remember that GeoJSON has ]] } ``` -![GeoJSON Polygon Geodesic](../../../images/geojson-polygon-geodesic.webp) +![GeoJSON Polygon Geodesic](../../../../images/geojson-polygon-geodesic.webp) It does not contain the point `[10, 47]` since the shortest path (geodesic) from `[4, 47]` to `[16, 47]` lies North relative to the parallel of latitude at @@ -359,7 +359,7 @@ Pole. ]] } ``` -![GeoJSON Polygon Counter-clockwise](../../../images/geojson-polygon-ccw.webp) +![GeoJSON Polygon Counter-clockwise](../../../../images/geojson-polygon-ccw.webp) On the other hand, the following polygon travels **clockwise** around the point `[10, 50]`, and thus its "interior" does not contain `[10, 50]`, but does @@ -371,7 +371,7 @@ contain the North Pole and the South Pole: ]] } ``` -![GeoJSON Polygon Clockwise](../../../images/geojson-polygon-cw.webp) +![GeoJSON Polygon Clockwise](../../../../images/geojson-polygon-cw.webp) Remember that the "interior" is to the left of the given linear ring, so this second polygon is basically the complement on Earth diff --git a/site/content/3.13/aql/functions/miscellaneous.md b/site/content/arangodb/3.13/aql/functions/miscellaneous.md similarity index 100% rename from site/content/3.13/aql/functions/miscellaneous.md rename to site/content/arangodb/3.13/aql/functions/miscellaneous.md diff --git a/site/content/3.13/aql/functions/numeric.md b/site/content/arangodb/3.13/aql/functions/numeric.md similarity index 100% rename from site/content/3.13/aql/functions/numeric.md rename to site/content/arangodb/3.13/aql/functions/numeric.md diff --git a/site/content/3.13/aql/functions/string.md b/site/content/arangodb/3.13/aql/functions/string.md similarity index 100% rename from site/content/3.13/aql/functions/string.md rename to site/content/arangodb/3.13/aql/functions/string.md diff --git a/site/content/3.13/aql/functions/type-check-and-cast.md b/site/content/arangodb/3.13/aql/functions/type-check-and-cast.md similarity index 100% rename from site/content/3.13/aql/functions/type-check-and-cast.md rename to site/content/arangodb/3.13/aql/functions/type-check-and-cast.md diff --git a/site/content/3.12/aql/functions/vector.md b/site/content/arangodb/3.13/aql/functions/vector.md similarity index 99% rename from site/content/3.12/aql/functions/vector.md rename to site/content/arangodb/3.13/aql/functions/vector.md index 987de8e45e..a20c562137 100644 --- a/site/content/3.12/aql/functions/vector.md +++ b/site/content/arangodb/3.13/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../../platform/data-science/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../../gen-ai/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. {{< warning >}} diff --git a/site/content/3.13/aql/fundamentals/_index.md b/site/content/arangodb/3.13/aql/fundamentals/_index.md similarity index 100% rename from site/content/3.13/aql/fundamentals/_index.md rename to site/content/arangodb/3.13/aql/fundamentals/_index.md diff --git a/site/content/3.13/aql/fundamentals/accessing-data-from-collections.md b/site/content/arangodb/3.13/aql/fundamentals/accessing-data-from-collections.md similarity index 100% rename from site/content/3.13/aql/fundamentals/accessing-data-from-collections.md rename to site/content/arangodb/3.13/aql/fundamentals/accessing-data-from-collections.md diff --git a/site/content/3.13/aql/fundamentals/bind-parameters.md b/site/content/arangodb/3.13/aql/fundamentals/bind-parameters.md similarity index 100% rename from site/content/3.13/aql/fundamentals/bind-parameters.md rename to site/content/arangodb/3.13/aql/fundamentals/bind-parameters.md diff --git a/site/content/3.13/aql/fundamentals/data-types.md b/site/content/arangodb/3.13/aql/fundamentals/data-types.md similarity index 100% rename from site/content/3.13/aql/fundamentals/data-types.md rename to site/content/arangodb/3.13/aql/fundamentals/data-types.md diff --git a/site/content/3.13/aql/fundamentals/limitations.md b/site/content/arangodb/3.13/aql/fundamentals/limitations.md similarity index 100% rename from site/content/3.13/aql/fundamentals/limitations.md rename to site/content/arangodb/3.13/aql/fundamentals/limitations.md diff --git a/site/content/3.13/aql/fundamentals/query-errors.md b/site/content/arangodb/3.13/aql/fundamentals/query-errors.md similarity index 100% rename from site/content/3.13/aql/fundamentals/query-errors.md rename to site/content/arangodb/3.13/aql/fundamentals/query-errors.md diff --git a/site/content/3.13/aql/fundamentals/query-results.md b/site/content/arangodb/3.13/aql/fundamentals/query-results.md similarity index 100% rename from site/content/3.13/aql/fundamentals/query-results.md rename to site/content/arangodb/3.13/aql/fundamentals/query-results.md diff --git a/site/content/3.13/aql/fundamentals/subqueries.md b/site/content/arangodb/3.13/aql/fundamentals/subqueries.md similarity index 100% rename from site/content/3.13/aql/fundamentals/subqueries.md rename to site/content/arangodb/3.13/aql/fundamentals/subqueries.md diff --git a/site/content/3.13/aql/fundamentals/syntax.md b/site/content/arangodb/3.13/aql/fundamentals/syntax.md similarity index 100% rename from site/content/3.13/aql/fundamentals/syntax.md rename to site/content/arangodb/3.13/aql/fundamentals/syntax.md diff --git a/site/content/3.13/aql/fundamentals/type-and-value-order.md b/site/content/arangodb/3.13/aql/fundamentals/type-and-value-order.md similarity index 100% rename from site/content/3.13/aql/fundamentals/type-and-value-order.md rename to site/content/arangodb/3.13/aql/fundamentals/type-and-value-order.md diff --git a/site/content/3.13/aql/graphs/_index.md b/site/content/arangodb/3.13/aql/graphs/_index.md similarity index 100% rename from site/content/3.13/aql/graphs/_index.md rename to site/content/arangodb/3.13/aql/graphs/_index.md diff --git a/site/content/3.13/aql/graphs/all-shortest-paths.md b/site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md similarity index 98% rename from site/content/3.13/aql/graphs/all-shortest-paths.md rename to site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md index 69c770af05..bef591606d 100644 --- a/site/content/3.13/aql/graphs/all-shortest-paths.md +++ b/site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md @@ -19,7 +19,7 @@ Every returned path is a JSON object with two attributes: A visual representation of the example graph: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the nodes of the graph. Arrows represent train connections @@ -122,7 +122,7 @@ direction for each collection in your path search. Load an example graph to get a named graph that reflects some possible train connections in Europe and North America: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.13/aql/graphs/k-paths.md b/site/content/arangodb/3.13/aql/graphs/k-paths.md similarity index 98% rename from site/content/3.13/aql/graphs/k-paths.md rename to site/content/arangodb/3.13/aql/graphs/k-paths.md index 89b63f6f41..0c490ce041 100644 --- a/site/content/3.13/aql/graphs/k-paths.md +++ b/site/content/arangodb/3.13/aql/graphs/k-paths.md @@ -20,7 +20,7 @@ Every such path is returned as a JSON object with two components: Here is an example graph to explain how the k Paths algorithm works: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the nodes of the graph. Arrows represent train connections @@ -193,7 +193,7 @@ direction for each collection in your path search. You can load the `kShortestPathsGraph` example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.12/aql/graphs/k-shortest-paths.md b/site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md similarity index 98% rename from site/content/3.12/aql/graphs/k-shortest-paths.md rename to site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md index cad5ee1771..9c638740d7 100644 --- a/site/content/3.12/aql/graphs/k-shortest-paths.md +++ b/site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md @@ -25,7 +25,7 @@ If no `weightAttribute` is specified, the weight of the path is just its length. Here is an example graph to explain how the k Shortest Paths algorithm works: -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) Each ellipse stands for a train station with the name of the city written inside of it. They are the nodes of the graph. Arrows represent train connections @@ -191,7 +191,7 @@ direction for each collection in your path search. You can load the `kShortestPathsGraph` example graph to get a named graph that reflects some possible train connections in Europe and North America. -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) ```js --- diff --git a/site/content/3.12/aql/graphs/shortest-path.md b/site/content/arangodb/3.13/aql/graphs/shortest-path.md similarity index 98% rename from site/content/3.12/aql/graphs/shortest-path.md rename to site/content/arangodb/3.13/aql/graphs/shortest-path.md index 7f0b6421fa..e3cab31823 100644 --- a/site/content/3.12/aql/graphs/shortest-path.md +++ b/site/content/arangodb/3.13/aql/graphs/shortest-path.md @@ -23,7 +23,7 @@ the path: Let's take a look at a simple example to explain how it works. This is the graph that you are going to find a shortest path on: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) You can use the following parameters for the query: @@ -160,7 +160,7 @@ collections you expect to be involved. Creating a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.12/aql/graphs/traversals-explained.md b/site/content/arangodb/3.13/aql/graphs/traversals-explained.md similarity index 83% rename from site/content/3.12/aql/graphs/traversals-explained.md rename to site/content/arangodb/3.13/aql/graphs/traversals-explained.md index e090af2a1e..6d4300e161 100644 --- a/site/content/3.12/aql/graphs/traversals-explained.md +++ b/site/content/arangodb/3.13/aql/graphs/traversals-explained.md @@ -31,7 +31,7 @@ set with three items: Let's take a look at a simple example to explain how it works. This is the graph that we are going to traverse: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) We use the following parameters for our query: @@ -40,39 +40,39 @@ We use the following parameters for our query: 3. We use a *max* depth of 2. 4. We follow only in `OUTBOUND` direction of edges -![traversal graph step 1](../../../images/traversal_graph1.png) +![traversal graph step 1](../../../../images/traversal_graph1.png) Now it walks to one of the direct neighbors of **A**, say **B** (note: ordering is not guaranteed!): -![traversal graph step 2](../../../images/traversal_graph2.png) +![traversal graph step 2](../../../../images/traversal_graph2.png) The query will remember the state (red circle) and will emit the first result **A** → **B** (black box). This will also prevent the traverser to be trapped in cycles. Now again it will visit one of the direct neighbors of **B**, say **E**: -![traversal graph step 3](../../../images/traversal_graph3.png) +![traversal graph step 3](../../../../images/traversal_graph3.png) We have limited the query with a *max* depth of *2*, so it will not pick any neighbor of **E**, as the path from **A** to **E** already requires *2* steps. Instead, we will go back one level to **B** and continue with any other direct neighbor there: -![traversal graph step 4](../../../images/traversal_graph4.png) +![traversal graph step 4](../../../../images/traversal_graph4.png) Again after we produced this result we will step back to **B**. But there is no neighbor of **B** left that we have not yet visited. Hence we go another step back to **A** and continue with any other neighbor there. -![traversal graph step 5](../../../images/traversal_graph5.png) +![traversal graph step 5](../../../../images/traversal_graph5.png) And identical to the iterations before we will visit **H**: -![traversal graph step 6](../../../images/traversal_graph6.png) +![traversal graph step 6](../../../../images/traversal_graph6.png) And **J**: -![traversal graph step 7](../../../images/traversal_graph7.png) +![traversal graph step 7](../../../../images/traversal_graph7.png) After these steps there is no further result left. So all together this query has returned the following paths: diff --git a/site/content/3.13/aql/graphs/traversals.md b/site/content/arangodb/3.13/aql/graphs/traversals.md similarity index 99% rename from site/content/3.13/aql/graphs/traversals.md rename to site/content/arangodb/3.13/aql/graphs/traversals.md index d6ae7e2eeb..ef4870dfef 100644 --- a/site/content/3.13/aql/graphs/traversals.md +++ b/site/content/arangodb/3.13/aql/graphs/traversals.md @@ -378,7 +378,7 @@ FOR v, e, p IN 0..10 OUTBOUND "places/Toronto" GRAPH "kShortestPathsGraph" The above example shows a graph traversal using a [train station and connections dataset](../../graphs/example-graphs.md#k-shortest-paths-graph): -![Train Connection Map](../../../images/train_map.png) +![Train Connection Map](../../../../images/train_map.png) The traversal starts at **Toronto** (bottom left), the traversal depth is limited to 10, and every station is only visited once. The traversal could @@ -726,7 +726,7 @@ you may be interested in documents further down the path. Create a simple symmetric traversal demonstration graph: -![traversal graph](../../../images/traversal_graph.png) +![traversal graph](../../../../images/traversal_graph.png) ```js --- diff --git a/site/content/3.13/aql/high-level-operations/_index.md b/site/content/arangodb/3.13/aql/high-level-operations/_index.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/_index.md rename to site/content/arangodb/3.13/aql/high-level-operations/_index.md diff --git a/site/content/3.13/aql/high-level-operations/collect.md b/site/content/arangodb/3.13/aql/high-level-operations/collect.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/collect.md rename to site/content/arangodb/3.13/aql/high-level-operations/collect.md diff --git a/site/content/3.13/aql/high-level-operations/filter.md b/site/content/arangodb/3.13/aql/high-level-operations/filter.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/filter.md rename to site/content/arangodb/3.13/aql/high-level-operations/filter.md diff --git a/site/content/3.13/aql/high-level-operations/for.md b/site/content/arangodb/3.13/aql/high-level-operations/for.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/for.md rename to site/content/arangodb/3.13/aql/high-level-operations/for.md diff --git a/site/content/3.13/aql/high-level-operations/insert.md b/site/content/arangodb/3.13/aql/high-level-operations/insert.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/insert.md rename to site/content/arangodb/3.13/aql/high-level-operations/insert.md diff --git a/site/content/3.13/aql/high-level-operations/let.md b/site/content/arangodb/3.13/aql/high-level-operations/let.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/let.md rename to site/content/arangodb/3.13/aql/high-level-operations/let.md diff --git a/site/content/3.13/aql/high-level-operations/limit.md b/site/content/arangodb/3.13/aql/high-level-operations/limit.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/limit.md rename to site/content/arangodb/3.13/aql/high-level-operations/limit.md diff --git a/site/content/3.13/aql/high-level-operations/remove.md b/site/content/arangodb/3.13/aql/high-level-operations/remove.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/remove.md rename to site/content/arangodb/3.13/aql/high-level-operations/remove.md diff --git a/site/content/3.13/aql/high-level-operations/replace.md b/site/content/arangodb/3.13/aql/high-level-operations/replace.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/replace.md rename to site/content/arangodb/3.13/aql/high-level-operations/replace.md diff --git a/site/content/3.13/aql/high-level-operations/return.md b/site/content/arangodb/3.13/aql/high-level-operations/return.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/return.md rename to site/content/arangodb/3.13/aql/high-level-operations/return.md diff --git a/site/content/3.13/aql/high-level-operations/search.md b/site/content/arangodb/3.13/aql/high-level-operations/search.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/search.md rename to site/content/arangodb/3.13/aql/high-level-operations/search.md diff --git a/site/content/3.13/aql/high-level-operations/sort.md b/site/content/arangodb/3.13/aql/high-level-operations/sort.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/sort.md rename to site/content/arangodb/3.13/aql/high-level-operations/sort.md diff --git a/site/content/3.13/aql/high-level-operations/update.md b/site/content/arangodb/3.13/aql/high-level-operations/update.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/update.md rename to site/content/arangodb/3.13/aql/high-level-operations/update.md diff --git a/site/content/3.13/aql/high-level-operations/upsert.md b/site/content/arangodb/3.13/aql/high-level-operations/upsert.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/upsert.md rename to site/content/arangodb/3.13/aql/high-level-operations/upsert.md diff --git a/site/content/3.13/aql/high-level-operations/window.md b/site/content/arangodb/3.13/aql/high-level-operations/window.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/window.md rename to site/content/arangodb/3.13/aql/high-level-operations/window.md diff --git a/site/content/3.13/aql/high-level-operations/with.md b/site/content/arangodb/3.13/aql/high-level-operations/with.md similarity index 100% rename from site/content/3.13/aql/high-level-operations/with.md rename to site/content/arangodb/3.13/aql/high-level-operations/with.md diff --git a/site/content/3.13/aql/how-to-invoke-aql/_index.md b/site/content/arangodb/3.13/aql/how-to-invoke-aql/_index.md similarity index 100% rename from site/content/3.13/aql/how-to-invoke-aql/_index.md rename to site/content/arangodb/3.13/aql/how-to-invoke-aql/_index.md diff --git a/site/content/3.13/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/3.13/aql/how-to-invoke-aql/with-arangosh.md similarity index 100% rename from site/content/3.13/aql/how-to-invoke-aql/with-arangosh.md rename to site/content/arangodb/3.13/aql/how-to-invoke-aql/with-arangosh.md diff --git a/site/content/3.13/aql/how-to-invoke-aql/with-the-web-interface.md b/site/content/arangodb/3.13/aql/how-to-invoke-aql/with-the-web-interface.md similarity index 100% rename from site/content/3.13/aql/how-to-invoke-aql/with-the-web-interface.md rename to site/content/arangodb/3.13/aql/how-to-invoke-aql/with-the-web-interface.md diff --git a/site/content/3.13/aql/operators.md b/site/content/arangodb/3.13/aql/operators.md similarity index 100% rename from site/content/3.13/aql/operators.md rename to site/content/arangodb/3.13/aql/operators.md diff --git a/site/content/3.13/aql/user-defined-functions.md b/site/content/arangodb/3.13/aql/user-defined-functions.md similarity index 100% rename from site/content/3.13/aql/user-defined-functions.md rename to site/content/arangodb/3.13/aql/user-defined-functions.md diff --git a/site/content/3.13/components/_index.md b/site/content/arangodb/3.13/components/_index.md similarity index 100% rename from site/content/3.13/components/_index.md rename to site/content/arangodb/3.13/components/_index.md diff --git a/site/content/3.13/components/arangodb-server/_index.md b/site/content/arangodb/3.13/components/arangodb-server/_index.md similarity index 100% rename from site/content/3.13/components/arangodb-server/_index.md rename to site/content/arangodb/3.13/components/arangodb-server/_index.md diff --git a/site/content/3.13/components/arangodb-server/environment-variables.md b/site/content/arangodb/3.13/components/arangodb-server/environment-variables.md similarity index 100% rename from site/content/3.13/components/arangodb-server/environment-variables.md rename to site/content/arangodb/3.13/components/arangodb-server/environment-variables.md diff --git a/site/content/3.13/components/arangodb-server/options.md b/site/content/arangodb/3.13/components/arangodb-server/options.md similarity index 100% rename from site/content/3.13/components/arangodb-server/options.md rename to site/content/arangodb/3.13/components/arangodb-server/options.md diff --git a/site/content/3.13/components/arangodb-server/storage-engine.md b/site/content/arangodb/3.13/components/arangodb-server/storage-engine.md similarity index 100% rename from site/content/3.13/components/arangodb-server/storage-engine.md rename to site/content/arangodb/3.13/components/arangodb-server/storage-engine.md diff --git a/site/content/3.13/components/platform.md b/site/content/arangodb/3.13/components/platform.md similarity index 98% rename from site/content/3.13/components/platform.md rename to site/content/arangodb/3.13/components/platform.md index eee8a62dcc..6e9764fd15 100644 --- a/site/content/3.13/components/platform.md +++ b/site/content/arangodb/3.13/components/platform.md @@ -48,7 +48,7 @@ of the platform features. - **GraphRAG Retriever**: Perform semantic similarity searches or aggregate insights from graph communities with global and local queries. - **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../data-science/graphrag/services/triton-inference-server.md). + or private LLMs with [Triton Inference Server](../../../gen-ai/services/triton-inference-server.md). - **MLflow integration**: Use the popular MLflow as a model registry for private LLMs or to run machine learning experiments as part of the ArangoDB Platform. - **Jupyter notebooks**: Run a Jupyter kernel in the platform for hosting @@ -65,7 +65,7 @@ of the platform features. ### Use the ArangoDB Platform as a managed service The ArangoDB Platform is not available as a managed service yet, but it will -become available for the [ArangoGraph Insights Platform](../arangograph/_index.md) +become available for the [Arango Managed Platform (AMP)](../../../amp/_index.md) in the future. Until then, you can request early access to the self-hosted ArangoDB Platform for testing. diff --git a/site/content/3.13/components/tools/_index.md b/site/content/arangodb/3.13/components/tools/_index.md similarity index 94% rename from site/content/3.13/components/tools/_index.md rename to site/content/arangodb/3.13/components/tools/_index.md index 72bf4118a4..9909dbe302 100644 --- a/site/content/3.13/components/tools/_index.md +++ b/site/content/arangodb/3.13/components/tools/_index.md @@ -31,5 +31,5 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../arangograph/oasisctl/_index.md) | Command-line tool for managing the ArangoGraph Insights Platform +| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) | [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/3.13/components/tools/arango-datasets.md b/site/content/arangodb/3.13/components/tools/arango-datasets.md similarity index 100% rename from site/content/3.13/components/tools/arango-datasets.md rename to site/content/arangodb/3.13/components/tools/arango-datasets.md diff --git a/site/content/3.12/components/tools/arangobackup/_index.md b/site/content/arangodb/3.13/components/tools/arangobackup/_index.md similarity index 92% rename from site/content/3.12/components/tools/arangobackup/_index.md rename to site/content/arangodb/3.13/components/tools/arangobackup/_index.md index 342c24c29a..fc71fd4547 100644 --- a/site/content/3.12/components/tools/arangobackup/_index.md +++ b/site/content/arangodb/3.13/components/tools/arangobackup/_index.md @@ -7,8 +7,8 @@ description: >- ArangoDB deployments --- {{< tip >}} -In the ArangoGraph Insights Platform, use managed -[Backups](../../../arangograph/backups.md) instead. +In the Arango Managed Platform (AMP), use managed +[Backups](../../../../../amp/backups.md) instead. {{< /tip >}} _arangobackup_ creates instantaneous and consistent diff --git a/site/content/3.13/components/tools/arangobackup/examples.md b/site/content/arangodb/3.13/components/tools/arangobackup/examples.md similarity index 100% rename from site/content/3.13/components/tools/arangobackup/examples.md rename to site/content/arangodb/3.13/components/tools/arangobackup/examples.md diff --git a/site/content/3.13/components/tools/arangobackup/options.md b/site/content/arangodb/3.13/components/tools/arangobackup/options.md similarity index 100% rename from site/content/3.13/components/tools/arangobackup/options.md rename to site/content/arangodb/3.13/components/tools/arangobackup/options.md diff --git a/site/content/3.13/components/tools/arangobench/_index.md b/site/content/arangodb/3.13/components/tools/arangobench/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangobench/_index.md rename to site/content/arangodb/3.13/components/tools/arangobench/_index.md diff --git a/site/content/3.13/components/tools/arangobench/options.md b/site/content/arangodb/3.13/components/tools/arangobench/options.md similarity index 100% rename from site/content/3.13/components/tools/arangobench/options.md rename to site/content/arangodb/3.13/components/tools/arangobench/options.md diff --git a/site/content/3.13/components/tools/arangodb-shell/_index.md b/site/content/arangodb/3.13/components/tools/arangodb-shell/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-shell/_index.md rename to site/content/arangodb/3.13/components/tools/arangodb-shell/_index.md diff --git a/site/content/3.13/components/tools/arangodb-shell/details.md b/site/content/arangodb/3.13/components/tools/arangodb-shell/details.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-shell/details.md rename to site/content/arangodb/3.13/components/tools/arangodb-shell/details.md diff --git a/site/content/3.13/components/tools/arangodb-shell/examples.md b/site/content/arangodb/3.13/components/tools/arangodb-shell/examples.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-shell/examples.md rename to site/content/arangodb/3.13/components/tools/arangodb-shell/examples.md diff --git a/site/content/3.13/components/tools/arangodb-shell/options.md b/site/content/arangodb/3.13/components/tools/arangodb-shell/options.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-shell/options.md rename to site/content/arangodb/3.13/components/tools/arangodb-shell/options.md diff --git a/site/content/3.13/components/tools/arangodb-starter/_index.md b/site/content/arangodb/3.13/components/tools/arangodb-starter/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-starter/_index.md rename to site/content/arangodb/3.13/components/tools/arangodb-starter/_index.md diff --git a/site/content/3.13/components/tools/arangodb-starter/architecture.md b/site/content/arangodb/3.13/components/tools/arangodb-starter/architecture.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-starter/architecture.md rename to site/content/arangodb/3.13/components/tools/arangodb-starter/architecture.md diff --git a/site/content/3.13/components/tools/arangodb-starter/options.md b/site/content/arangodb/3.13/components/tools/arangodb-starter/options.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-starter/options.md rename to site/content/arangodb/3.13/components/tools/arangodb-starter/options.md diff --git a/site/content/3.13/components/tools/arangodb-starter/security.md b/site/content/arangodb/3.13/components/tools/arangodb-starter/security.md similarity index 100% rename from site/content/3.13/components/tools/arangodb-starter/security.md rename to site/content/arangodb/3.13/components/tools/arangodb-starter/security.md diff --git a/site/content/3.13/components/tools/arangodump/_index.md b/site/content/arangodb/3.13/components/tools/arangodump/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangodump/_index.md rename to site/content/arangodb/3.13/components/tools/arangodump/_index.md diff --git a/site/content/3.13/components/tools/arangodump/examples.md b/site/content/arangodb/3.13/components/tools/arangodump/examples.md similarity index 100% rename from site/content/3.13/components/tools/arangodump/examples.md rename to site/content/arangodb/3.13/components/tools/arangodump/examples.md diff --git a/site/content/3.13/components/tools/arangodump/limitations.md b/site/content/arangodb/3.13/components/tools/arangodump/limitations.md similarity index 100% rename from site/content/3.13/components/tools/arangodump/limitations.md rename to site/content/arangodb/3.13/components/tools/arangodump/limitations.md diff --git a/site/content/3.13/components/tools/arangodump/maskings.md b/site/content/arangodb/3.13/components/tools/arangodump/maskings.md similarity index 100% rename from site/content/3.13/components/tools/arangodump/maskings.md rename to site/content/arangodb/3.13/components/tools/arangodump/maskings.md diff --git a/site/content/3.13/components/tools/arangodump/options.md b/site/content/arangodb/3.13/components/tools/arangodump/options.md similarity index 100% rename from site/content/3.13/components/tools/arangodump/options.md rename to site/content/arangodb/3.13/components/tools/arangodump/options.md diff --git a/site/content/3.13/components/tools/arangoexport/_index.md b/site/content/arangodb/3.13/components/tools/arangoexport/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangoexport/_index.md rename to site/content/arangodb/3.13/components/tools/arangoexport/_index.md diff --git a/site/content/3.13/components/tools/arangoexport/examples.md b/site/content/arangodb/3.13/components/tools/arangoexport/examples.md similarity index 100% rename from site/content/3.13/components/tools/arangoexport/examples.md rename to site/content/arangodb/3.13/components/tools/arangoexport/examples.md diff --git a/site/content/3.13/components/tools/arangoexport/options.md b/site/content/arangodb/3.13/components/tools/arangoexport/options.md similarity index 100% rename from site/content/3.13/components/tools/arangoexport/options.md rename to site/content/arangodb/3.13/components/tools/arangoexport/options.md diff --git a/site/content/3.13/components/tools/arangoimport/_index.md b/site/content/arangodb/3.13/components/tools/arangoimport/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangoimport/_index.md rename to site/content/arangodb/3.13/components/tools/arangoimport/_index.md diff --git a/site/content/3.13/components/tools/arangoimport/details.md b/site/content/arangodb/3.13/components/tools/arangoimport/details.md similarity index 100% rename from site/content/3.13/components/tools/arangoimport/details.md rename to site/content/arangodb/3.13/components/tools/arangoimport/details.md diff --git a/site/content/3.13/components/tools/arangoimport/examples-csv.md b/site/content/arangodb/3.13/components/tools/arangoimport/examples-csv.md similarity index 100% rename from site/content/3.13/components/tools/arangoimport/examples-csv.md rename to site/content/arangodb/3.13/components/tools/arangoimport/examples-csv.md diff --git a/site/content/3.13/components/tools/arangoimport/examples-json.md b/site/content/arangodb/3.13/components/tools/arangoimport/examples-json.md similarity index 100% rename from site/content/3.13/components/tools/arangoimport/examples-json.md rename to site/content/arangodb/3.13/components/tools/arangoimport/examples-json.md diff --git a/site/content/3.13/components/tools/arangoimport/options.md b/site/content/arangodb/3.13/components/tools/arangoimport/options.md similarity index 100% rename from site/content/3.13/components/tools/arangoimport/options.md rename to site/content/arangodb/3.13/components/tools/arangoimport/options.md diff --git a/site/content/3.13/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.13/components/tools/arangoinspect/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangoinspect/_index.md rename to site/content/arangodb/3.13/components/tools/arangoinspect/_index.md diff --git a/site/content/3.13/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.13/components/tools/arangoinspect/examples.md similarity index 100% rename from site/content/3.13/components/tools/arangoinspect/examples.md rename to site/content/arangodb/3.13/components/tools/arangoinspect/examples.md diff --git a/site/content/3.13/components/tools/arangoinspect/options.md b/site/content/arangodb/3.13/components/tools/arangoinspect/options.md similarity index 100% rename from site/content/3.13/components/tools/arangoinspect/options.md rename to site/content/arangodb/3.13/components/tools/arangoinspect/options.md diff --git a/site/content/3.13/components/tools/arangorestore/_index.md b/site/content/arangodb/3.13/components/tools/arangorestore/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangorestore/_index.md rename to site/content/arangodb/3.13/components/tools/arangorestore/_index.md diff --git a/site/content/3.13/components/tools/arangorestore/examples.md b/site/content/arangodb/3.13/components/tools/arangorestore/examples.md similarity index 100% rename from site/content/3.13/components/tools/arangorestore/examples.md rename to site/content/arangodb/3.13/components/tools/arangorestore/examples.md diff --git a/site/content/3.13/components/tools/arangorestore/options.md b/site/content/arangodb/3.13/components/tools/arangorestore/options.md similarity index 100% rename from site/content/3.13/components/tools/arangorestore/options.md rename to site/content/arangodb/3.13/components/tools/arangorestore/options.md diff --git a/site/content/3.13/components/tools/arangovpack/_index.md b/site/content/arangodb/3.13/components/tools/arangovpack/_index.md similarity index 100% rename from site/content/3.13/components/tools/arangovpack/_index.md rename to site/content/arangodb/3.13/components/tools/arangovpack/_index.md diff --git a/site/content/3.13/components/tools/arangovpack/options.md b/site/content/arangodb/3.13/components/tools/arangovpack/options.md similarity index 100% rename from site/content/3.13/components/tools/arangovpack/options.md rename to site/content/arangodb/3.13/components/tools/arangovpack/options.md diff --git a/site/content/3.13/components/tools/foxx-cli/_index.md b/site/content/arangodb/3.13/components/tools/foxx-cli/_index.md similarity index 100% rename from site/content/3.13/components/tools/foxx-cli/_index.md rename to site/content/arangodb/3.13/components/tools/foxx-cli/_index.md diff --git a/site/content/3.13/components/tools/foxx-cli/details.md b/site/content/arangodb/3.13/components/tools/foxx-cli/details.md similarity index 100% rename from site/content/3.13/components/tools/foxx-cli/details.md rename to site/content/arangodb/3.13/components/tools/foxx-cli/details.md diff --git a/site/content/3.13/components/web-interface/_index.md b/site/content/arangodb/3.13/components/web-interface/_index.md similarity index 89% rename from site/content/3.13/components/web-interface/_index.md rename to site/content/arangodb/3.13/components/web-interface/_index.md index 42934ab4f6..5d3412cdac 100644 --- a/site/content/3.13/components/web-interface/_index.md +++ b/site/content/arangodb/3.13/components/web-interface/_index.md @@ -13,4 +13,4 @@ convenient way. Statistics and server status are provided as well. The web interface (also referred to as Web UI, frontend or *Aardvark*) can be accessed with a browser under the URL `http://localhost:8529` with default server settings. -![Single-server Web Interface](../../../images/ui-dashboard312.webp) +![Single-server Web Interface](../../../../images/ui-dashboard312.webp) diff --git a/site/content/3.13/components/web-interface/cluster.md b/site/content/arangodb/3.13/components/web-interface/cluster.md similarity index 97% rename from site/content/3.13/components/web-interface/cluster.md rename to site/content/arangodb/3.13/components/web-interface/cluster.md index 9662f6c93c..75807b2a42 100644 --- a/site/content/3.13/components/web-interface/cluster.md +++ b/site/content/arangodb/3.13/components/web-interface/cluster.md @@ -16,7 +16,7 @@ You can access the logs of individual Coordinators and DB-Servers via the The **Cluster** section displays statistics about the general cluster performance. -![Web Interface Cluster Dashboard](../../../images/ui-cluster-dashboard312.webp) +![Web Interface Cluster Dashboard](../../../../images/ui-cluster-dashboard312.webp) Statistics: diff --git a/site/content/3.13/components/web-interface/collections.md b/site/content/arangodb/3.13/components/web-interface/collections.md similarity index 100% rename from site/content/3.13/components/web-interface/collections.md rename to site/content/arangodb/3.13/components/web-interface/collections.md diff --git a/site/content/3.13/components/web-interface/dashboard.md b/site/content/arangodb/3.13/components/web-interface/dashboard.md similarity index 90% rename from site/content/3.13/components/web-interface/dashboard.md rename to site/content/arangodb/3.13/components/web-interface/dashboard.md index 9a6bcf5feb..b1018e2f80 100644 --- a/site/content/3.13/components/web-interface/dashboard.md +++ b/site/content/arangodb/3.13/components/web-interface/dashboard.md @@ -7,7 +7,7 @@ description: '' The **Dashboard** section provides statistics which are polled regularly from the ArangoDB server. -![Web Interface Dashboard](../../../images/ui-dashboard312.webp) +![Web Interface Dashboard](../../../../images/ui-dashboard312.webp) There is a different interface for [Cluster](cluster.md) deployments. diff --git a/site/content/3.13/components/web-interface/document.md b/site/content/arangodb/3.13/components/web-interface/document.md similarity index 100% rename from site/content/3.13/components/web-interface/document.md rename to site/content/arangodb/3.13/components/web-interface/document.md diff --git a/site/content/3.12/components/web-interface/graphs.md b/site/content/arangodb/3.13/components/web-interface/graphs.md similarity index 98% rename from site/content/3.12/components/web-interface/graphs.md rename to site/content/arangodb/3.13/components/web-interface/graphs.md index 9b298a16ec..d601939a70 100644 --- a/site/content/3.12/components/web-interface/graphs.md +++ b/site/content/arangodb/3.13/components/web-interface/graphs.md @@ -57,7 +57,7 @@ their direct neighbors are selected. You can select one or more start nodes and change the depth and the limit in the settings panel. You can also load the entire graph via the toolbar, but only use this with small graphs. -![The graph viewer with the settings panel open](../../../images/graphViewer312.png) +![The graph viewer with the settings panel open](../../../../images/graphViewer312.png) ### Viewport diff --git a/site/content/3.13/components/web-interface/logs.md b/site/content/arangodb/3.13/components/web-interface/logs.md similarity index 100% rename from site/content/3.13/components/web-interface/logs.md rename to site/content/arangodb/3.13/components/web-interface/logs.md diff --git a/site/content/3.13/components/web-interface/queries.md b/site/content/arangodb/3.13/components/web-interface/queries.md similarity index 98% rename from site/content/3.13/components/web-interface/queries.md rename to site/content/arangodb/3.13/components/web-interface/queries.md index 7c65ffc809..4da1b6f706 100644 --- a/site/content/3.13/components/web-interface/queries.md +++ b/site/content/arangodb/3.13/components/web-interface/queries.md @@ -14,7 +14,7 @@ The query view offers you three different subviews: The web interface offers a AQL Query Editor: -![Editor Input](../../../images/queryEditorInput312.png) +![Editor Input](../../../../images/queryEditorInput312.png) The editor is split into two parts, the query editor pane and the pane for bind variables and query options. diff --git a/site/content/3.13/components/web-interface/services.md b/site/content/arangodb/3.13/components/web-interface/services.md similarity index 100% rename from site/content/3.13/components/web-interface/services.md rename to site/content/arangodb/3.13/components/web-interface/services.md diff --git a/site/content/3.13/components/web-interface/users.md b/site/content/arangodb/3.13/components/web-interface/users.md similarity index 100% rename from site/content/3.13/components/web-interface/users.md rename to site/content/arangodb/3.13/components/web-interface/users.md diff --git a/site/content/3.13/concepts/_index.md b/site/content/arangodb/3.13/concepts/_index.md similarity index 100% rename from site/content/3.13/concepts/_index.md rename to site/content/arangodb/3.13/concepts/_index.md diff --git a/site/content/3.13/concepts/data-models.md b/site/content/arangodb/3.13/concepts/data-models.md similarity index 100% rename from site/content/3.13/concepts/data-models.md rename to site/content/arangodb/3.13/concepts/data-models.md diff --git a/site/content/3.13/concepts/data-retrieval.md b/site/content/arangodb/3.13/concepts/data-retrieval.md similarity index 100% rename from site/content/3.13/concepts/data-retrieval.md rename to site/content/arangodb/3.13/concepts/data-retrieval.md diff --git a/site/content/3.13/concepts/data-structure/_index.md b/site/content/arangodb/3.13/concepts/data-structure/_index.md similarity index 100% rename from site/content/3.13/concepts/data-structure/_index.md rename to site/content/arangodb/3.13/concepts/data-structure/_index.md diff --git a/site/content/3.13/concepts/data-structure/collections.md b/site/content/arangodb/3.13/concepts/data-structure/collections.md similarity index 100% rename from site/content/3.13/concepts/data-structure/collections.md rename to site/content/arangodb/3.13/concepts/data-structure/collections.md diff --git a/site/content/3.13/concepts/data-structure/databases.md b/site/content/arangodb/3.13/concepts/data-structure/databases.md similarity index 100% rename from site/content/3.13/concepts/data-structure/databases.md rename to site/content/arangodb/3.13/concepts/data-structure/databases.md diff --git a/site/content/3.13/concepts/data-structure/documents/_index.md b/site/content/arangodb/3.13/concepts/data-structure/documents/_index.md similarity index 100% rename from site/content/3.13/concepts/data-structure/documents/_index.md rename to site/content/arangodb/3.13/concepts/data-structure/documents/_index.md diff --git a/site/content/3.13/concepts/data-structure/documents/computed-values.md b/site/content/arangodb/3.13/concepts/data-structure/documents/computed-values.md similarity index 100% rename from site/content/3.13/concepts/data-structure/documents/computed-values.md rename to site/content/arangodb/3.13/concepts/data-structure/documents/computed-values.md diff --git a/site/content/3.13/concepts/data-structure/documents/schema-validation.md b/site/content/arangodb/3.13/concepts/data-structure/documents/schema-validation.md similarity index 100% rename from site/content/3.13/concepts/data-structure/documents/schema-validation.md rename to site/content/arangodb/3.13/concepts/data-structure/documents/schema-validation.md diff --git a/site/content/3.13/concepts/data-structure/views.md b/site/content/arangodb/3.13/concepts/data-structure/views.md similarity index 100% rename from site/content/3.13/concepts/data-structure/views.md rename to site/content/arangodb/3.13/concepts/data-structure/views.md diff --git a/site/content/3.13/deploy/_index.md b/site/content/arangodb/3.13/deploy/_index.md similarity index 96% rename from site/content/3.13/deploy/_index.md rename to site/content/arangodb/3.13/deploy/_index.md index e0d36ebcd0..2d9787b64c 100644 --- a/site/content/3.13/deploy/_index.md +++ b/site/content/arangodb/3.13/deploy/_index.md @@ -48,7 +48,7 @@ for multi-tenant use cases. The ArangoDB Platform is the umbrella for deploying and operating the entire ArangoDB product offering with a unified interface in a Kubernetes cluster. It is offered for self-hosting on-prem or in the cloud and as a managed service, -superseding the ArangoGraph Insights Platform. +superseding the Arango Managed Platform (AMP). See [The ArangoDB Platform](../components/platform.md) for details. @@ -68,7 +68,7 @@ There are different ways to set up and operate ArangoDB. ArangoDB Kubernetes Operator (`kube-arangodb`). The fastest way to get ArangoDB up and running is to run it in the cloud - the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) offers a fully managed cloud service, available on AWS and GCP. ### Manual Deployment @@ -115,7 +115,7 @@ If you want a specific version, download the precompiled executable via the ### Run in the cloud - [AWS and Azure](in-the-cloud.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS and GCP ### Run in Kubernetes diff --git a/site/content/3.13/deploy/architecture/_index.md b/site/content/arangodb/3.13/deploy/architecture/_index.md similarity index 100% rename from site/content/3.13/deploy/architecture/_index.md rename to site/content/arangodb/3.13/deploy/architecture/_index.md diff --git a/site/content/3.13/deploy/architecture/data-sharding.md b/site/content/arangodb/3.13/deploy/architecture/data-sharding.md similarity index 98% rename from site/content/3.13/deploy/architecture/data-sharding.md rename to site/content/arangodb/3.13/deploy/architecture/data-sharding.md index a677edbfd6..61e67cb5d9 100644 --- a/site/content/3.13/deploy/architecture/data-sharding.md +++ b/site/content/arangodb/3.13/deploy/architecture/data-sharding.md @@ -44,7 +44,7 @@ cost-effective than pre-provisioning a single large machine. Increased complexity in infrastructure can be managed using modern containerization and cluster orchestrations tools like [Kubernetes](../kubernetes.md). -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) To achieve this ArangoDB splits your dataset into so called _shards_. The number of shards is something you may choose according to your needs. Proper sharding @@ -84,7 +84,7 @@ a given document is to be stored. Choosing the right shard key can have significant impact on your performance can reduce network traffic and increase performance. -![Hash Sharding](../../../images/cluster_sharding_hash.jpg) +![Hash Sharding](../../../../images/cluster_sharding_hash.jpg) ArangoDB uses consistent hashing to compute the target shard from the given values (as specified via by the `shardKeys` collection property). The ideal set diff --git a/site/content/3.13/deploy/architecture/replication.md b/site/content/arangodb/3.13/deploy/architecture/replication.md similarity index 100% rename from site/content/3.13/deploy/architecture/replication.md rename to site/content/arangodb/3.13/deploy/architecture/replication.md diff --git a/site/content/3.13/deploy/architecture/scalability.md b/site/content/arangodb/3.13/deploy/architecture/scalability.md similarity index 100% rename from site/content/3.13/deploy/architecture/scalability.md rename to site/content/arangodb/3.13/deploy/architecture/scalability.md diff --git a/site/content/3.13/deploy/cluster/_index.md b/site/content/arangodb/3.13/deploy/cluster/_index.md similarity index 98% rename from site/content/3.13/deploy/cluster/_index.md rename to site/content/arangodb/3.13/deploy/cluster/_index.md index 7a285ae5cd..fe840ace5d 100644 --- a/site/content/3.13/deploy/cluster/_index.md +++ b/site/content/arangodb/3.13/deploy/cluster/_index.md @@ -39,7 +39,7 @@ roles: - _Coordinators_ - _DB-Servers_. -![ArangoDB Cluster](../../../images/cluster-topology.png) +![ArangoDB Cluster](../../../../images/cluster-topology.png) ### Agents @@ -137,7 +137,7 @@ automatically to the different servers. In many situations one can also reap a benefit in data throughput, again because the load can be distributed to multiple machines. -![Cluster Sharding](../../../images/cluster_sharding.jpg) +![Cluster Sharding](../../../../images/cluster_sharding.jpg) From the outside this process is fully transparent: An application may talk to any _Coordinator_ and @@ -380,7 +380,7 @@ See the [Cluster Deployment](deployment/_index.md) chapter for instructions. ArangoDB is also available as a cloud service, the -[**ArangoGraph Insights Platform**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[**Arango Managed Platform (AMP)**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). ## Cluster ID diff --git a/site/content/3.13/deploy/cluster/administration.md b/site/content/arangodb/3.13/deploy/cluster/administration.md similarity index 100% rename from site/content/3.13/deploy/cluster/administration.md rename to site/content/arangodb/3.13/deploy/cluster/administration.md diff --git a/site/content/3.13/deploy/cluster/deployment/_index.md b/site/content/arangodb/3.13/deploy/cluster/deployment/_index.md similarity index 97% rename from site/content/3.13/deploy/cluster/deployment/_index.md rename to site/content/arangodb/3.13/deploy/cluster/deployment/_index.md index 102d40bed3..5d6d6232f2 100644 --- a/site/content/3.13/deploy/cluster/deployment/_index.md +++ b/site/content/arangodb/3.13/deploy/cluster/deployment/_index.md @@ -9,7 +9,7 @@ You can deploy an ArangoDB cluster in different ways: - [Using the ArangoDB Starter](using-the-arangodb-starter.md) - [Manual Start](manual-start.md) - [Kubernetes](../../kubernetes.md) -- [ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), fully managed, available on AWS and GCP ## Preliminary Information For Debian/Ubuntu Systems diff --git a/site/content/3.13/deploy/cluster/deployment/manual-start.md b/site/content/arangodb/3.13/deploy/cluster/deployment/manual-start.md similarity index 100% rename from site/content/3.13/deploy/cluster/deployment/manual-start.md rename to site/content/arangodb/3.13/deploy/cluster/deployment/manual-start.md diff --git a/site/content/3.13/deploy/cluster/deployment/using-the-arangodb-starter.md b/site/content/arangodb/3.13/deploy/cluster/deployment/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.13/deploy/cluster/deployment/using-the-arangodb-starter.md rename to site/content/arangodb/3.13/deploy/cluster/deployment/using-the-arangodb-starter.md diff --git a/site/content/3.13/deploy/cluster/limitations.md b/site/content/arangodb/3.13/deploy/cluster/limitations.md similarity index 100% rename from site/content/3.13/deploy/cluster/limitations.md rename to site/content/arangodb/3.13/deploy/cluster/limitations.md diff --git a/site/content/3.13/deploy/in-the-cloud.md b/site/content/arangodb/3.13/deploy/in-the-cloud.md similarity index 100% rename from site/content/3.13/deploy/in-the-cloud.md rename to site/content/arangodb/3.13/deploy/in-the-cloud.md diff --git a/site/content/3.13/deploy/kubernetes.md b/site/content/arangodb/3.13/deploy/kubernetes.md similarity index 100% rename from site/content/3.13/deploy/kubernetes.md rename to site/content/arangodb/3.13/deploy/kubernetes.md diff --git a/site/content/3.13/deploy/oneshard.md b/site/content/arangodb/3.13/deploy/oneshard.md similarity index 99% rename from site/content/3.13/deploy/oneshard.md rename to site/content/arangodb/3.13/deploy/oneshard.md index cb7ed57fe7..eeaffdd7ad 100644 --- a/site/content/3.13/deploy/oneshard.md +++ b/site/content/arangodb/3.13/deploy/oneshard.md @@ -48,7 +48,7 @@ because they need to send and receive data on several connections, build up results for collection accesses from the received parts followed by further processing. -![OneShard vs. Sharded Cluster Setup](../../images/cluster-sharded-oneshard.png) +![OneShard vs. Sharded Cluster Setup](../../../images/cluster-sharded-oneshard.png) If the database involved in a query is a OneShard database, then the OneShard optimization can be applied to run the query on the diff --git a/site/content/3.13/deploy/production-checklist.md b/site/content/arangodb/3.13/deploy/production-checklist.md similarity index 100% rename from site/content/3.13/deploy/production-checklist.md rename to site/content/arangodb/3.13/deploy/production-checklist.md diff --git a/site/content/3.13/deploy/single-instance-vs-cluster.md b/site/content/arangodb/3.13/deploy/single-instance-vs-cluster.md similarity index 100% rename from site/content/3.13/deploy/single-instance-vs-cluster.md rename to site/content/arangodb/3.13/deploy/single-instance-vs-cluster.md diff --git a/site/content/3.13/deploy/single-instance/_index.md b/site/content/arangodb/3.13/deploy/single-instance/_index.md similarity index 100% rename from site/content/3.13/deploy/single-instance/_index.md rename to site/content/arangodb/3.13/deploy/single-instance/_index.md diff --git a/site/content/3.13/deploy/single-instance/manual-start.md b/site/content/arangodb/3.13/deploy/single-instance/manual-start.md similarity index 100% rename from site/content/3.13/deploy/single-instance/manual-start.md rename to site/content/arangodb/3.13/deploy/single-instance/manual-start.md diff --git a/site/content/3.13/deploy/single-instance/using-the-arangodb-starter.md b/site/content/arangodb/3.13/deploy/single-instance/using-the-arangodb-starter.md similarity index 100% rename from site/content/3.13/deploy/single-instance/using-the-arangodb-starter.md rename to site/content/arangodb/3.13/deploy/single-instance/using-the-arangodb-starter.md diff --git a/site/content/3.13/develop/_index.md b/site/content/arangodb/3.13/develop/_index.md similarity index 100% rename from site/content/3.13/develop/_index.md rename to site/content/arangodb/3.13/develop/_index.md diff --git a/site/content/3.13/develop/drivers/_index.md b/site/content/arangodb/3.13/develop/drivers/_index.md similarity index 100% rename from site/content/3.13/develop/drivers/_index.md rename to site/content/arangodb/3.13/develop/drivers/_index.md diff --git a/site/content/3.13/develop/drivers/go.md b/site/content/arangodb/3.13/develop/drivers/go.md similarity index 100% rename from site/content/3.13/develop/drivers/go.md rename to site/content/arangodb/3.13/develop/drivers/go.md diff --git a/site/content/3.13/develop/drivers/java/_index.md b/site/content/arangodb/3.13/develop/drivers/java/_index.md similarity index 100% rename from site/content/3.13/develop/drivers/java/_index.md rename to site/content/arangodb/3.13/develop/drivers/java/_index.md diff --git a/site/content/3.13/develop/drivers/java/reference-version-7/_index.md b/site/content/arangodb/3.13/develop/drivers/java/reference-version-7/_index.md similarity index 100% rename from site/content/3.13/develop/drivers/java/reference-version-7/_index.md rename to site/content/arangodb/3.13/develop/drivers/java/reference-version-7/_index.md diff --git a/site/content/3.13/develop/drivers/java/reference-version-7/changes-in-version-7.md b/site/content/arangodb/3.13/develop/drivers/java/reference-version-7/changes-in-version-7.md similarity index 100% rename from site/content/3.13/develop/drivers/java/reference-version-7/changes-in-version-7.md rename to site/content/arangodb/3.13/develop/drivers/java/reference-version-7/changes-in-version-7.md diff --git a/site/content/3.13/develop/drivers/java/reference-version-7/driver-setup.md b/site/content/arangodb/3.13/develop/drivers/java/reference-version-7/driver-setup.md similarity index 100% rename from site/content/3.13/develop/drivers/java/reference-version-7/driver-setup.md rename to site/content/arangodb/3.13/develop/drivers/java/reference-version-7/driver-setup.md diff --git a/site/content/3.13/develop/drivers/java/reference-version-7/serialization.md b/site/content/arangodb/3.13/develop/drivers/java/reference-version-7/serialization.md similarity index 100% rename from site/content/3.13/develop/drivers/java/reference-version-7/serialization.md rename to site/content/arangodb/3.13/develop/drivers/java/reference-version-7/serialization.md diff --git a/site/content/3.13/develop/drivers/javascript.md b/site/content/arangodb/3.13/develop/drivers/javascript.md similarity index 100% rename from site/content/3.13/develop/drivers/javascript.md rename to site/content/arangodb/3.13/develop/drivers/javascript.md diff --git a/site/content/3.13/develop/drivers/python.md b/site/content/arangodb/3.13/develop/drivers/python.md similarity index 100% rename from site/content/3.13/develop/drivers/python.md rename to site/content/arangodb/3.13/develop/drivers/python.md diff --git a/site/content/3.13/develop/error-codes.md b/site/content/arangodb/3.13/develop/error-codes.md similarity index 100% rename from site/content/3.13/develop/error-codes.md rename to site/content/arangodb/3.13/develop/error-codes.md diff --git a/site/content/3.13/develop/exit-codes.md b/site/content/arangodb/3.13/develop/exit-codes.md similarity index 100% rename from site/content/3.13/develop/exit-codes.md rename to site/content/arangodb/3.13/develop/exit-codes.md diff --git a/site/content/3.13/develop/foxx-microservices/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/deployment.md b/site/content/arangodb/3.13/develop/foxx-microservices/deployment.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/deployment.md rename to site/content/arangodb/3.13/develop/foxx-microservices/deployment.md diff --git a/site/content/3.13/develop/foxx-microservices/getting-started.md b/site/content/arangodb/3.13/develop/foxx-microservices/getting-started.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/getting-started.md rename to site/content/arangodb/3.13/develop/foxx-microservices/getting-started.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/access-from-the-browser.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/access-from-the-browser.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/access-from-the-browser.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/access-from-the-browser.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/authentication-and-sessions.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/authentication-and-sessions.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/authentication-and-sessions.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/development-mode.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/development-mode.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/development-mode.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/development-mode.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/foxx-in-a-cluster.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/foxx-in-a-cluster.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/foxx-in-a-cluster.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/foxx-in-a-cluster.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/linking-services-together.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/linking-services-together.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/linking-services-together.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/linking-services-together.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/making-requests.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/making-requests.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/making-requests.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/making-requests.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/scripts-and-scheduling.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/scripts-and-scheduling.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/scripts-and-scheduling.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/scripts-and-scheduling.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/testing-foxx-services.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/testing-foxx-services.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/testing-foxx-services.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/testing-foxx-services.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/using-node-modules.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/using-node-modules.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/using-node-modules.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/using-node-modules.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/using-webpack-with-foxx.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/using-webpack-with-foxx.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/using-webpack-with-foxx.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/using-webpack-with-foxx.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/working-with-collections.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/working-with-collections.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/working-with-collections.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/working-with-collections.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/working-with-files.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/working-with-files.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/working-with-files.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/working-with-files.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/working-with-routers.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/working-with-routers.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/working-with-routers.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/working-with-routers.md diff --git a/site/content/3.13/develop/foxx-microservices/guides/writing-queries.md b/site/content/arangodb/3.13/develop/foxx-microservices/guides/writing-queries.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/guides/writing-queries.md rename to site/content/arangodb/3.13/develop/foxx-microservices/guides/writing-queries.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/configuration.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/configuration.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/configuration.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/configuration.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/related-modules/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/related-modules/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/related-modules/authentication.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/authentication.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/related-modules/authentication.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/authentication.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/related-modules/graphql.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/graphql.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/related-modules/graphql.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/graphql.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/related-modules/oauth-2-0.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/oauth-2-0.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/related-modules/oauth-2-0.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/oauth-2-0.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/related-modules/queues.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/queues.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/related-modules/queues.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/related-modules/queues.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/routers/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/routers/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/routers/endpoints.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/endpoints.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/routers/endpoints.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/endpoints.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/routers/middleware.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/middleware.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/routers/middleware.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/middleware.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/routers/request.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/request.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/routers/request.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/request.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/routers/response.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/response.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/routers/response.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/routers/response.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/service-context.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/service-context.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/service-context.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/service-context.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/service-manifest.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/service-manifest.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/service-manifest.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/service-manifest.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md diff --git a/site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md b/site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md similarity index 100% rename from site/content/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md rename to site/content/arangodb/3.13/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md diff --git a/site/content/3.13/develop/http-api/_index.md b/site/content/arangodb/3.13/develop/http-api/_index.md similarity index 98% rename from site/content/3.13/develop/http-api/_index.md rename to site/content/arangodb/3.13/develop/http-api/_index.md index 2a6b57b51e..e42c7b49f3 100644 --- a/site/content/3.13/develop/http-api/_index.md +++ b/site/content/arangodb/3.13/develop/http-api/_index.md @@ -105,7 +105,7 @@ You can explore the API with the interactive **Swagger UI** using the 2. Click the **Rest API** tab. 3. Click a section and endpoint to view the description and parameters. -![The web interface with the navigation on the left and the tabs at the top](../../../images/swagger_serverapi_overview312.png) +![The web interface with the navigation on the left and the tabs at the top](../../../../images/swagger_serverapi_overview312.png) Also see this blog post: [Using the ArangoDB Swagger.io Interactive API Documentation](https://www.arangodb.com/2018/03/using-arangodb-swaggerio-interactive-api-documentation/). diff --git a/site/content/3.13/develop/http-api/administration.md b/site/content/arangodb/3.13/develop/http-api/administration.md similarity index 100% rename from site/content/3.13/develop/http-api/administration.md rename to site/content/arangodb/3.13/develop/http-api/administration.md diff --git a/site/content/3.13/develop/http-api/analyzers.md b/site/content/arangodb/3.13/develop/http-api/analyzers.md similarity index 100% rename from site/content/3.13/develop/http-api/analyzers.md rename to site/content/arangodb/3.13/develop/http-api/analyzers.md diff --git a/site/content/3.13/develop/http-api/authentication.md b/site/content/arangodb/3.13/develop/http-api/authentication.md similarity index 99% rename from site/content/3.13/develop/http-api/authentication.md rename to site/content/arangodb/3.13/develop/http-api/authentication.md index dcae69cdcb..7c004950b4 100644 --- a/site/content/3.13/develop/http-api/authentication.md +++ b/site/content/arangodb/3.13/develop/http-api/authentication.md @@ -938,7 +938,7 @@ assert(response.tokens?.length === 0); ## Hot-reload JWT secrets {{< tip >}} -In the ArangoGraph Insights Platform, authentication secrets are managed and +In the Arango Managed Platform (AMP), authentication secrets are managed and therefore this feature isn't available. {{< /tip >}} diff --git a/site/content/3.13/develop/http-api/cluster.md b/site/content/arangodb/3.13/develop/http-api/cluster.md similarity index 100% rename from site/content/3.13/develop/http-api/cluster.md rename to site/content/arangodb/3.13/develop/http-api/cluster.md diff --git a/site/content/3.13/develop/http-api/collections.md b/site/content/arangodb/3.13/develop/http-api/collections.md similarity index 100% rename from site/content/3.13/develop/http-api/collections.md rename to site/content/arangodb/3.13/develop/http-api/collections.md diff --git a/site/content/3.13/develop/http-api/databases.md b/site/content/arangodb/3.13/develop/http-api/databases.md similarity index 100% rename from site/content/3.13/develop/http-api/databases.md rename to site/content/arangodb/3.13/develop/http-api/databases.md diff --git a/site/content/3.13/develop/http-api/documents.md b/site/content/arangodb/3.13/develop/http-api/documents.md similarity index 100% rename from site/content/3.13/develop/http-api/documents.md rename to site/content/arangodb/3.13/develop/http-api/documents.md diff --git a/site/content/3.13/develop/http-api/foxx.md b/site/content/arangodb/3.13/develop/http-api/foxx.md similarity index 100% rename from site/content/3.13/develop/http-api/foxx.md rename to site/content/arangodb/3.13/develop/http-api/foxx.md diff --git a/site/content/3.13/develop/http-api/general-request-handling.md b/site/content/arangodb/3.13/develop/http-api/general-request-handling.md similarity index 100% rename from site/content/3.13/develop/http-api/general-request-handling.md rename to site/content/arangodb/3.13/develop/http-api/general-request-handling.md diff --git a/site/content/3.13/develop/http-api/graphs/_index.md b/site/content/arangodb/3.13/develop/http-api/graphs/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/graphs/_index.md rename to site/content/arangodb/3.13/develop/http-api/graphs/_index.md diff --git a/site/content/3.13/develop/http-api/graphs/edges.md b/site/content/arangodb/3.13/develop/http-api/graphs/edges.md similarity index 100% rename from site/content/3.13/develop/http-api/graphs/edges.md rename to site/content/arangodb/3.13/develop/http-api/graphs/edges.md diff --git a/site/content/3.13/develop/http-api/graphs/named-graphs.md b/site/content/arangodb/3.13/develop/http-api/graphs/named-graphs.md similarity index 99% rename from site/content/3.13/develop/http-api/graphs/named-graphs.md rename to site/content/arangodb/3.13/develop/http-api/graphs/named-graphs.md index 5f5123ad4b..88602a529a 100644 --- a/site/content/3.13/develop/http-api/graphs/named-graphs.md +++ b/site/content/arangodb/3.13/develop/http-api/graphs/named-graphs.md @@ -18,11 +18,11 @@ The examples use the following example graphs: [_Social Graph_](../../../graphs/example-graphs.md#social-graph): -![Social Example Graph](../../../../images/social_graph.png) +![Social Example Graph](../../../../../images/social_graph.png) [_Knows Graph_](../../../graphs/example-graphs.md#knows-graph): -![Social Example Graph](../../../../images/knows_graph.png) +![Social Example Graph](../../../../../images/knows_graph.png) ## Management diff --git a/site/content/3.13/develop/http-api/hot-backups.md b/site/content/arangodb/3.13/develop/http-api/hot-backups.md similarity index 99% rename from site/content/3.13/develop/http-api/hot-backups.md rename to site/content/arangodb/3.13/develop/http-api/hot-backups.md index a585b2244c..d1962db6f9 100644 --- a/site/content/3.13/develop/http-api/hot-backups.md +++ b/site/content/arangodb/3.13/develop/http-api/hot-backups.md @@ -7,8 +7,8 @@ description: >- backups --- {{< tip >}} -In the ArangoGraph Insights Platform, use managed -[Backups](../../arangograph/backups.md) instead. +In the Arango Managed Platform (AMP), use managed +[Backups](../../../../amp/backups.md) instead. {{< /tip >}} Hot Backups are near instantaneous consistent snapshots of an diff --git a/site/content/3.13/develop/http-api/import.md b/site/content/arangodb/3.13/develop/http-api/import.md similarity index 100% rename from site/content/3.13/develop/http-api/import.md rename to site/content/arangodb/3.13/develop/http-api/import.md diff --git a/site/content/3.13/develop/http-api/indexes/_index.md b/site/content/arangodb/3.13/develop/http-api/indexes/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/_index.md rename to site/content/arangodb/3.13/develop/http-api/indexes/_index.md diff --git a/site/content/3.13/develop/http-api/indexes/fulltext.md b/site/content/arangodb/3.13/develop/http-api/indexes/fulltext.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/fulltext.md rename to site/content/arangodb/3.13/develop/http-api/indexes/fulltext.md diff --git a/site/content/3.13/develop/http-api/indexes/geo-spatial.md b/site/content/arangodb/3.13/develop/http-api/indexes/geo-spatial.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/geo-spatial.md rename to site/content/arangodb/3.13/develop/http-api/indexes/geo-spatial.md diff --git a/site/content/3.13/develop/http-api/indexes/inverted.md b/site/content/arangodb/3.13/develop/http-api/indexes/inverted.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/inverted.md rename to site/content/arangodb/3.13/develop/http-api/indexes/inverted.md diff --git a/site/content/3.13/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/3.13/develop/http-api/indexes/multi-dimensional.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/multi-dimensional.md rename to site/content/arangodb/3.13/develop/http-api/indexes/multi-dimensional.md diff --git a/site/content/3.13/develop/http-api/indexes/persistent.md b/site/content/arangodb/3.13/develop/http-api/indexes/persistent.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/persistent.md rename to site/content/arangodb/3.13/develop/http-api/indexes/persistent.md diff --git a/site/content/3.13/develop/http-api/indexes/ttl.md b/site/content/arangodb/3.13/develop/http-api/indexes/ttl.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/ttl.md rename to site/content/arangodb/3.13/develop/http-api/indexes/ttl.md diff --git a/site/content/3.13/develop/http-api/indexes/vector.md b/site/content/arangodb/3.13/develop/http-api/indexes/vector.md similarity index 100% rename from site/content/3.13/develop/http-api/indexes/vector.md rename to site/content/arangodb/3.13/develop/http-api/indexes/vector.md diff --git a/site/content/3.13/develop/http-api/jobs.md b/site/content/arangodb/3.13/develop/http-api/jobs.md similarity index 100% rename from site/content/3.13/develop/http-api/jobs.md rename to site/content/arangodb/3.13/develop/http-api/jobs.md diff --git a/site/content/3.13/develop/http-api/monitoring/_index.md b/site/content/arangodb/3.13/develop/http-api/monitoring/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/monitoring/_index.md rename to site/content/arangodb/3.13/develop/http-api/monitoring/_index.md diff --git a/site/content/3.13/develop/http-api/monitoring/logs.md b/site/content/arangodb/3.13/develop/http-api/monitoring/logs.md similarity index 100% rename from site/content/3.13/develop/http-api/monitoring/logs.md rename to site/content/arangodb/3.13/develop/http-api/monitoring/logs.md diff --git a/site/content/3.13/develop/http-api/monitoring/metrics.md b/site/content/arangodb/3.13/develop/http-api/monitoring/metrics.md similarity index 100% rename from site/content/3.13/develop/http-api/monitoring/metrics.md rename to site/content/arangodb/3.13/develop/http-api/monitoring/metrics.md diff --git a/site/content/3.13/develop/http-api/monitoring/statistics.md b/site/content/arangodb/3.13/develop/http-api/monitoring/statistics.md similarity index 100% rename from site/content/3.13/develop/http-api/monitoring/statistics.md rename to site/content/arangodb/3.13/develop/http-api/monitoring/statistics.md diff --git a/site/content/3.13/develop/http-api/queries/_index.md b/site/content/arangodb/3.13/develop/http-api/queries/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/queries/_index.md rename to site/content/arangodb/3.13/develop/http-api/queries/_index.md diff --git a/site/content/3.13/develop/http-api/queries/aql-queries.md b/site/content/arangodb/3.13/develop/http-api/queries/aql-queries.md similarity index 100% rename from site/content/3.13/develop/http-api/queries/aql-queries.md rename to site/content/arangodb/3.13/develop/http-api/queries/aql-queries.md diff --git a/site/content/3.13/develop/http-api/queries/aql-query-plan-cache.md b/site/content/arangodb/3.13/develop/http-api/queries/aql-query-plan-cache.md similarity index 100% rename from site/content/3.13/develop/http-api/queries/aql-query-plan-cache.md rename to site/content/arangodb/3.13/develop/http-api/queries/aql-query-plan-cache.md diff --git a/site/content/3.13/develop/http-api/queries/aql-query-results-cache.md b/site/content/arangodb/3.13/develop/http-api/queries/aql-query-results-cache.md similarity index 100% rename from site/content/3.13/develop/http-api/queries/aql-query-results-cache.md rename to site/content/arangodb/3.13/develop/http-api/queries/aql-query-results-cache.md diff --git a/site/content/3.13/develop/http-api/queries/user-defined-aql-functions.md b/site/content/arangodb/3.13/develop/http-api/queries/user-defined-aql-functions.md similarity index 100% rename from site/content/3.13/develop/http-api/queries/user-defined-aql-functions.md rename to site/content/arangodb/3.13/develop/http-api/queries/user-defined-aql-functions.md diff --git a/site/content/3.13/develop/http-api/replication/_index.md b/site/content/arangodb/3.13/develop/http-api/replication/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/replication/_index.md rename to site/content/arangodb/3.13/develop/http-api/replication/_index.md diff --git a/site/content/3.13/develop/http-api/replication/other-replication-commands.md b/site/content/arangodb/3.13/develop/http-api/replication/other-replication-commands.md similarity index 100% rename from site/content/3.13/develop/http-api/replication/other-replication-commands.md rename to site/content/arangodb/3.13/develop/http-api/replication/other-replication-commands.md diff --git a/site/content/3.13/develop/http-api/replication/replication-applier.md b/site/content/arangodb/3.13/develop/http-api/replication/replication-applier.md similarity index 100% rename from site/content/3.13/develop/http-api/replication/replication-applier.md rename to site/content/arangodb/3.13/develop/http-api/replication/replication-applier.md diff --git a/site/content/3.13/develop/http-api/replication/replication-dump.md b/site/content/arangodb/3.13/develop/http-api/replication/replication-dump.md similarity index 100% rename from site/content/3.13/develop/http-api/replication/replication-dump.md rename to site/content/arangodb/3.13/develop/http-api/replication/replication-dump.md diff --git a/site/content/3.13/develop/http-api/replication/replication-logger.md b/site/content/arangodb/3.13/develop/http-api/replication/replication-logger.md similarity index 100% rename from site/content/3.13/develop/http-api/replication/replication-logger.md rename to site/content/arangodb/3.13/develop/http-api/replication/replication-logger.md diff --git a/site/content/3.13/develop/http-api/replication/write-ahead-log.md b/site/content/arangodb/3.13/develop/http-api/replication/write-ahead-log.md similarity index 100% rename from site/content/3.13/develop/http-api/replication/write-ahead-log.md rename to site/content/arangodb/3.13/develop/http-api/replication/write-ahead-log.md diff --git a/site/content/3.13/develop/http-api/security.md b/site/content/arangodb/3.13/develop/http-api/security.md similarity index 100% rename from site/content/3.13/develop/http-api/security.md rename to site/content/arangodb/3.13/develop/http-api/security.md diff --git a/site/content/3.13/develop/http-api/tasks.md b/site/content/arangodb/3.13/develop/http-api/tasks.md similarity index 100% rename from site/content/3.13/develop/http-api/tasks.md rename to site/content/arangodb/3.13/develop/http-api/tasks.md diff --git a/site/content/3.13/develop/http-api/transactions/_index.md b/site/content/arangodb/3.13/develop/http-api/transactions/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/transactions/_index.md rename to site/content/arangodb/3.13/develop/http-api/transactions/_index.md diff --git a/site/content/3.13/develop/http-api/transactions/javascript-transactions.md b/site/content/arangodb/3.13/develop/http-api/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.13/develop/http-api/transactions/javascript-transactions.md rename to site/content/arangodb/3.13/develop/http-api/transactions/javascript-transactions.md diff --git a/site/content/3.13/develop/http-api/transactions/stream-transactions.md b/site/content/arangodb/3.13/develop/http-api/transactions/stream-transactions.md similarity index 100% rename from site/content/3.13/develop/http-api/transactions/stream-transactions.md rename to site/content/arangodb/3.13/develop/http-api/transactions/stream-transactions.md diff --git a/site/content/3.13/develop/http-api/users.md b/site/content/arangodb/3.13/develop/http-api/users.md similarity index 100% rename from site/content/3.13/develop/http-api/users.md rename to site/content/arangodb/3.13/develop/http-api/users.md diff --git a/site/content/3.13/develop/http-api/views/_index.md b/site/content/arangodb/3.13/develop/http-api/views/_index.md similarity index 100% rename from site/content/3.13/develop/http-api/views/_index.md rename to site/content/arangodb/3.13/develop/http-api/views/_index.md diff --git a/site/content/3.13/develop/http-api/views/arangosearch-views.md b/site/content/arangodb/3.13/develop/http-api/views/arangosearch-views.md similarity index 100% rename from site/content/3.13/develop/http-api/views/arangosearch-views.md rename to site/content/arangodb/3.13/develop/http-api/views/arangosearch-views.md diff --git a/site/content/3.13/develop/http-api/views/search-alias-views.md b/site/content/arangodb/3.13/develop/http-api/views/search-alias-views.md similarity index 100% rename from site/content/3.13/develop/http-api/views/search-alias-views.md rename to site/content/arangodb/3.13/develop/http-api/views/search-alias-views.md diff --git a/site/content/3.13/develop/integrations/_index.md b/site/content/arangodb/3.13/develop/integrations/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/_index.md rename to site/content/arangodb/3.13/develop/integrations/_index.md diff --git a/site/content/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md b/site/content/arangodb/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md similarity index 99% rename from site/content/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md rename to site/content/arangodb/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md index b05d1acfb1..1124193864 100644 --- a/site/content/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md +++ b/site/content/arangodb/3.13/develop/integrations/arangodb-datasource-for-apache-spark.md @@ -374,7 +374,7 @@ The following Spark SQL data types (subtypes of `org.apache.spark.sql.types.Filt - `MapType` (only with key type `StringType`) - `StructType` -## Connect to the ArangoGraph Insights Platform +## Connect to the Arango Managed Platform (AMP) To connect to SSL secured deployments using X.509 Base64 encoded CA certificate (ArangoGraph): diff --git a/site/content/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md b/site/content/arangodb/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md rename to site/content/arangodb/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md diff --git a/site/content/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md b/site/content/arangodb/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md similarity index 100% rename from site/content/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md rename to site/content/arangodb/3.13/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md diff --git a/site/content/3.13/develop/integrations/spring-boot-arangodb.md b/site/content/arangodb/3.13/develop/integrations/spring-boot-arangodb.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-boot-arangodb.md rename to site/content/arangodb/3.13/develop/integrations/spring-boot-arangodb.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/_index.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/_index.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/_index.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/migration.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/migration.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/migration.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/migration.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/_index.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/_index.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/_index.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md diff --git a/site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/template.md b/site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/template.md similarity index 100% rename from site/content/3.13/develop/integrations/spring-data-arangodb/reference-version-4/template.md rename to site/content/arangodb/3.13/develop/integrations/spring-data-arangodb/reference-version-4/template.md diff --git a/site/content/3.13/develop/javascript-api/@arangodb/_index.md b/site/content/arangodb/3.13/develop/javascript-api/@arangodb/_index.md similarity index 100% rename from site/content/3.13/develop/javascript-api/@arangodb/_index.md rename to site/content/arangodb/3.13/develop/javascript-api/@arangodb/_index.md diff --git a/site/content/3.13/develop/javascript-api/@arangodb/collection-object.md b/site/content/arangodb/3.13/develop/javascript-api/@arangodb/collection-object.md similarity index 100% rename from site/content/3.13/develop/javascript-api/@arangodb/collection-object.md rename to site/content/arangodb/3.13/develop/javascript-api/@arangodb/collection-object.md diff --git a/site/content/3.13/develop/javascript-api/@arangodb/cursor-object.md b/site/content/arangodb/3.13/develop/javascript-api/@arangodb/cursor-object.md similarity index 100% rename from site/content/3.13/develop/javascript-api/@arangodb/cursor-object.md rename to site/content/arangodb/3.13/develop/javascript-api/@arangodb/cursor-object.md diff --git a/site/content/3.13/develop/javascript-api/@arangodb/db-object.md b/site/content/arangodb/3.13/develop/javascript-api/@arangodb/db-object.md similarity index 100% rename from site/content/3.13/develop/javascript-api/@arangodb/db-object.md rename to site/content/arangodb/3.13/develop/javascript-api/@arangodb/db-object.md diff --git a/site/content/3.13/develop/javascript-api/@arangodb/view-object.md b/site/content/arangodb/3.13/develop/javascript-api/@arangodb/view-object.md similarity index 100% rename from site/content/3.13/develop/javascript-api/@arangodb/view-object.md rename to site/content/arangodb/3.13/develop/javascript-api/@arangodb/view-object.md diff --git a/site/content/3.13/develop/javascript-api/_index.md b/site/content/arangodb/3.13/develop/javascript-api/_index.md similarity index 100% rename from site/content/3.13/develop/javascript-api/_index.md rename to site/content/arangodb/3.13/develop/javascript-api/_index.md diff --git a/site/content/3.13/develop/javascript-api/actions.md b/site/content/arangodb/3.13/develop/javascript-api/actions.md similarity index 100% rename from site/content/3.13/develop/javascript-api/actions.md rename to site/content/arangodb/3.13/develop/javascript-api/actions.md diff --git a/site/content/3.13/develop/javascript-api/analyzers.md b/site/content/arangodb/3.13/develop/javascript-api/analyzers.md similarity index 100% rename from site/content/3.13/develop/javascript-api/analyzers.md rename to site/content/arangodb/3.13/develop/javascript-api/analyzers.md diff --git a/site/content/3.13/develop/javascript-api/aql-queries.md b/site/content/arangodb/3.13/develop/javascript-api/aql-queries.md similarity index 100% rename from site/content/3.13/develop/javascript-api/aql-queries.md rename to site/content/arangodb/3.13/develop/javascript-api/aql-queries.md diff --git a/site/content/3.13/develop/javascript-api/console.md b/site/content/arangodb/3.13/develop/javascript-api/console.md similarity index 100% rename from site/content/3.13/develop/javascript-api/console.md rename to site/content/arangodb/3.13/develop/javascript-api/console.md diff --git a/site/content/3.13/develop/javascript-api/crypto.md b/site/content/arangodb/3.13/develop/javascript-api/crypto.md similarity index 100% rename from site/content/3.13/develop/javascript-api/crypto.md rename to site/content/arangodb/3.13/develop/javascript-api/crypto.md diff --git a/site/content/3.13/develop/javascript-api/fs.md b/site/content/arangodb/3.13/develop/javascript-api/fs.md similarity index 100% rename from site/content/3.13/develop/javascript-api/fs.md rename to site/content/arangodb/3.13/develop/javascript-api/fs.md diff --git a/site/content/3.13/develop/javascript-api/request.md b/site/content/arangodb/3.13/develop/javascript-api/request.md similarity index 100% rename from site/content/3.13/develop/javascript-api/request.md rename to site/content/arangodb/3.13/develop/javascript-api/request.md diff --git a/site/content/3.13/develop/javascript-api/tasks.md b/site/content/arangodb/3.13/develop/javascript-api/tasks.md similarity index 100% rename from site/content/3.13/develop/javascript-api/tasks.md rename to site/content/arangodb/3.13/develop/javascript-api/tasks.md diff --git a/site/content/3.13/develop/operational-factors.md b/site/content/arangodb/3.13/develop/operational-factors.md similarity index 100% rename from site/content/3.13/develop/operational-factors.md rename to site/content/arangodb/3.13/develop/operational-factors.md diff --git a/site/content/3.13/develop/satellitecollections.md b/site/content/arangodb/3.13/develop/satellitecollections.md similarity index 100% rename from site/content/3.13/develop/satellitecollections.md rename to site/content/arangodb/3.13/develop/satellitecollections.md diff --git a/site/content/3.13/develop/smartjoins.md b/site/content/arangodb/3.13/develop/smartjoins.md similarity index 100% rename from site/content/3.13/develop/smartjoins.md rename to site/content/arangodb/3.13/develop/smartjoins.md diff --git a/site/content/3.13/develop/transactions/_index.md b/site/content/arangodb/3.13/develop/transactions/_index.md similarity index 100% rename from site/content/3.13/develop/transactions/_index.md rename to site/content/arangodb/3.13/develop/transactions/_index.md diff --git a/site/content/3.13/develop/transactions/durability.md b/site/content/arangodb/3.13/develop/transactions/durability.md similarity index 100% rename from site/content/3.13/develop/transactions/durability.md rename to site/content/arangodb/3.13/develop/transactions/durability.md diff --git a/site/content/3.13/develop/transactions/javascript-transactions.md b/site/content/arangodb/3.13/develop/transactions/javascript-transactions.md similarity index 100% rename from site/content/3.13/develop/transactions/javascript-transactions.md rename to site/content/arangodb/3.13/develop/transactions/javascript-transactions.md diff --git a/site/content/3.13/develop/transactions/limitations.md b/site/content/arangodb/3.13/develop/transactions/limitations.md similarity index 100% rename from site/content/3.13/develop/transactions/limitations.md rename to site/content/arangodb/3.13/develop/transactions/limitations.md diff --git a/site/content/3.13/develop/transactions/locking-and-isolation.md b/site/content/arangodb/3.13/develop/transactions/locking-and-isolation.md similarity index 100% rename from site/content/3.13/develop/transactions/locking-and-isolation.md rename to site/content/arangodb/3.13/develop/transactions/locking-and-isolation.md diff --git a/site/content/3.13/develop/transactions/stream-transactions.md b/site/content/arangodb/3.13/develop/transactions/stream-transactions.md similarity index 100% rename from site/content/3.13/develop/transactions/stream-transactions.md rename to site/content/arangodb/3.13/develop/transactions/stream-transactions.md diff --git a/site/content/3.13/get-started/_index.md b/site/content/arangodb/3.13/get-started/_index.md similarity index 100% rename from site/content/3.13/get-started/_index.md rename to site/content/arangodb/3.13/get-started/_index.md diff --git a/site/content/3.13/get-started/how-to-interact-with-arangodb.md b/site/content/arangodb/3.13/get-started/how-to-interact-with-arangodb.md similarity index 100% rename from site/content/3.13/get-started/how-to-interact-with-arangodb.md rename to site/content/arangodb/3.13/get-started/how-to-interact-with-arangodb.md diff --git a/site/content/3.13/get-started/on-premises-installation.md b/site/content/arangodb/3.13/get-started/on-premises-installation.md similarity index 93% rename from site/content/3.13/get-started/on-premises-installation.md rename to site/content/arangodb/3.13/get-started/on-premises-installation.md index 1e4aea9cbf..a2e549904f 100644 --- a/site/content/3.13/get-started/on-premises-installation.md +++ b/site/content/arangodb/3.13/get-started/on-premises-installation.md @@ -28,16 +28,16 @@ Depending on the installation method used, the installation process either prompted for the root password or the default root password is empty (see [Securing the installation](.#securing-the-installation)). -![Web Interface Login Form](../../images/loginView.png) +![Web Interface Login Form](../../../../images/loginView.png) Next you will be asked which database to use. Every server instance comes with a `_system` database. Select this database to continue. -![select database](../../images/selectDBView.png) +![select database](../../../../images/selectDBView.png) You should then be presented the dashboard with server statistics like this: -![Web Interface Dashboard Request Statistics](../../images/ui-dashboard.webp) +![Web Interface Dashboard Request Statistics](../../../../images/ui-dashboard.webp) For a more detailed description of the interface, see [Web Interface](../components/web-interface/_index.md). --> diff --git a/site/content/3.13/get-started/set-up-a-cloud-instance.md b/site/content/arangodb/3.13/get-started/set-up-a-cloud-instance.md similarity index 71% rename from site/content/3.13/get-started/set-up-a-cloud-instance.md rename to site/content/arangodb/3.13/get-started/set-up-a-cloud-instance.md index 2383f20980..7fd3bfa149 100644 --- a/site/content/3.13/get-started/set-up-a-cloud-instance.md +++ b/site/content/arangodb/3.13/get-started/set-up-a-cloud-instance.md @@ -6,10 +6,10 @@ description: >- This quick start guide covers the basics from creating an ArangoGraph account to setting up and accessing your first ArangoGraph deployment --- -For general information about the ArangoGraph Insights Platform, see +For general information about the Arango Managed Platform (AMP), see [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -For guides and reference documentation, see the [ArangoGraph](../arangograph/_index.md) documentation. +For guides and reference documentation, see the [ArangoGraph](../../../amp/_index.md) documentation. ## Prerequisites @@ -33,7 +33,7 @@ used for multiple accounts. 2. Click the __Start Free__ button or click the __Sign Up__ link in the top right corner. - ![ArangoGraph Homepage](../../images/arangograph-homepage.png) + ![ArangoGraph Homepage](../../../images/arangograph-homepage.png) 3. Review the terms & conditions and privacy policy and click __I accept__. 4. Select the type of sign up you would like to use (GitHub, Google, or @@ -42,11 +42,11 @@ used for multiple accounts. - For the email address option, type your desired email address in the email field and type a strong password in the password field. - {{< image src="../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} Click the __Sign up__ button. You will receive a verification email. In that mail, click the __Verify my email address__ link or button. - It opens a page in the ArangoGraph Insights Platform that says __Welcome back!__ + It opens a page in the Arango Managed Platform (AMP) that says __Welcome back!__ 5. Click the __Log in__ button to continue and login. 6. If you signed up with an email address of a public email service provider (e.g. Hotmail), a form appears asking for your mobile phone number. Enter the country code @@ -67,25 +67,25 @@ used for multiple accounts. provider and region. Pick one and click __Create deployment__. You can also select your intended use-case. - ![ArangoGraph Dashboard](../../images/arangograph-dashboard-free-tier.png) + ![ArangoGraph Dashboard](../../../images/arangograph-dashboard-free-tier.png) - You can also [create a deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) + You can also [create a deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) manually, if you want fine-grained configuration options. 2. The new deployment is displayed in the list of deployments for the respective project (here: _Avocado_). - ![ArangoGraph Deployments Bootstrapping](../../images/arangograph-deployments-bootstrapping.png) + ![ArangoGraph Deployments Bootstrapping](../../../images/arangograph-deployments-bootstrapping.png) It takes a couple of minutes before the deployment can be used. The status is changed from __Bootstrapping__ to __OK__ eventually and you also receive an email when it is ready. - {{< image src="../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} + {{< image src="../../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} 3. Click the name of the deployment (or the __Open deployment details__ link in the email) to view the deployment details. - ![ArangoGraph Deployment Ready](../../images/arangograph-deployment-ready.png) + ![ArangoGraph Deployment Ready](../../../images/arangograph-deployment-ready.png) 4. Click the __Open database UI__ button to open the ArangoDB web interface. @@ -96,23 +96,23 @@ used for multiple accounts. Click __Guide__ for instructions on how to access and run queries against this data. - ![ArangoGraph Deployment Examples](../../images/arangograph-deployment-examples.png) + ![ArangoGraph Deployment Examples](../../../images/arangograph-deployment-examples.png) - ![ArangoGraph Deployment Examples IMDB Guide](../../images/arangograph-deployment-examples-imdb-guide.png) + ![ArangoGraph Deployment Examples IMDB Guide](../../../images/arangograph-deployment-examples-imdb-guide.png) ## General Hierarchy -The ArangoGraph Insights Platform supports multi-tenant setups via organizations. +The Arango Managed Platform (AMP) supports multi-tenant setups via organizations. You can create your own organization(s) and invite collaborators or join existing ones via invites. Your organization contains projects. Your projects hold your deployments. -- [**Organizations**](../arangograph/organizations/_index.md) +- [**Organizations**](../../../amp/organizations/_index.md) represent (commercial) entities such as companies. You can be part of multiple organizations with a single user account. - - [**Projects**](../arangograph/projects.md) + - [**Projects**](../../../amp/projects.md) represent organizational units such as teams or applications. - - [**Deployments**](../arangograph/deployments/_index.md) + - [**Deployments**](../../../amp/deployments/_index.md) are the actual instances of ArangoDB clusters. When you sign up for ArangoGraph, an organization and a default project are @@ -125,31 +125,31 @@ question mark to bring up the help menu and choose __Start tour__. This guided tour walks you through the creation of a deployment and shows you how to load example datasets and manage projects and deployments. -![Start tour in menu](../../images/arangograph-tour-start.png) +![Start tour in menu](../../../images/arangograph-tour-start.png) Alternatively, follow the steps of the linked guides: -- [Create a new project](../arangograph/projects.md#how-to-create-a-new-project) (optional) -- [Create a new deployment](../arangograph/deployments/_index.md#how-to-create-a-new-deployment) -- [Install a new certificate](../arangograph/security-and-access-control/x-509-certificates.md) (optional) -- [Access your deployment](../arangograph/deployments/_index.md#how-to-access-your-deployment) -- [Delete your deployment](../arangograph/deployments/_index.md#how-to-delete-a-deployment) +- [Create a new project](../../../amp/projects.md#how-to-create-a-new-project) (optional) +- [Create a new deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) +- [Install a new certificate](../../../amp/security-and-access-control/x-509-certificates.md) (optional) +- [Access your deployment](../../../amp/deployments/_index.md#how-to-access-your-deployment) +- [Delete your deployment](../../../amp/deployments/_index.md#how-to-delete-a-deployment) ## Free-to-Try vs. Paid -The ArangoGraph Insights Platform comes with a free-to-try tier that lets you test +The Arango Managed Platform (AMP) comes with a free-to-try tier that lets you test the ArangoDB Cloud for free for 14 days. It includes one project and one small deployment of 4GB, local backups, and one notebook for learning and data science. After the trial period, your deployment is automatically deleted. You can unlock all features in ArangoGraph at any time by adding your billing details and at least one payment method. See: -- [ArangoGraph Packages](../arangograph/organizations/_index.md#arangograph-packages) -- [How to add billing details to organizations](../arangograph/organizations/billing.md#how-to-add-billing-details) -- [How to add a payment method to an organization](../arangograph/organizations/billing.md#how-to-add-a-payment-method) +- [ArangoGraph Packages](../../../amp/organizations/_index.md#arangograph-packages) +- [How to add billing details to organizations](../../../amp/organizations/billing.md#how-to-add-billing-details) +- [How to add a payment method to an organization](../../../amp/organizations/billing.md#how-to-add-a-payment-method) ## Managed Cloud Service vs. On-premises Comparison: Key Differences -The ArangoGraph Insights Platform aims to make all features of ArangoDB +The Arango Managed Platform (AMP) aims to make all features of ArangoDB available to you, but there are a few key differences: - Encryption (both at rest & network traffic) is always on and cannot be diff --git a/site/content/3.13/get-started/start-using-aql/_index.md b/site/content/arangodb/3.13/get-started/start-using-aql/_index.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/_index.md rename to site/content/arangodb/3.13/get-started/start-using-aql/_index.md diff --git a/site/content/3.13/get-started/start-using-aql/crud.md b/site/content/arangodb/3.13/get-started/start-using-aql/crud.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/crud.md rename to site/content/arangodb/3.13/get-started/start-using-aql/crud.md diff --git a/site/content/3.13/get-started/start-using-aql/dataset.md b/site/content/arangodb/3.13/get-started/start-using-aql/dataset.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/dataset.md rename to site/content/arangodb/3.13/get-started/start-using-aql/dataset.md diff --git a/site/content/3.13/get-started/start-using-aql/filter.md b/site/content/arangodb/3.13/get-started/start-using-aql/filter.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/filter.md rename to site/content/arangodb/3.13/get-started/start-using-aql/filter.md diff --git a/site/content/3.13/get-started/start-using-aql/geo.md b/site/content/arangodb/3.13/get-started/start-using-aql/geo.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/geo.md rename to site/content/arangodb/3.13/get-started/start-using-aql/geo.md diff --git a/site/content/3.13/get-started/start-using-aql/graphs.md b/site/content/arangodb/3.13/get-started/start-using-aql/graphs.md similarity index 98% rename from site/content/3.13/get-started/start-using-aql/graphs.md rename to site/content/arangodb/3.13/get-started/start-using-aql/graphs.md index d5c9502ae3..044f1cc4a3 100644 --- a/site/content/3.13/get-started/start-using-aql/graphs.md +++ b/site/content/arangodb/3.13/get-started/start-using-aql/graphs.md @@ -36,7 +36,7 @@ Our characters have the following relations between parents and children Visualized as a graph: -![ChildOf graph visualization](../../../images/ChildOf_Graph.png) +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) ## Creating the edges @@ -252,7 +252,7 @@ It might be a bit unexpected, that Joffrey is returned twice. However, if you look at the graph visualization, you can see that multiple paths lead from Joffrey (bottom right) to Tywin: -![ChildOf graph visualization](../../../images/ChildOf_Graph.png) +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) ``` Tywin <- Jaime <- Joffrey diff --git a/site/content/3.13/get-started/start-using-aql/joins.md b/site/content/arangodb/3.13/get-started/start-using-aql/joins.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/joins.md rename to site/content/arangodb/3.13/get-started/start-using-aql/joins.md diff --git a/site/content/3.13/get-started/start-using-aql/sort-limit.md b/site/content/arangodb/3.13/get-started/start-using-aql/sort-limit.md similarity index 100% rename from site/content/3.13/get-started/start-using-aql/sort-limit.md rename to site/content/arangodb/3.13/get-started/start-using-aql/sort-limit.md diff --git a/site/content/3.13/graphs/_index.md b/site/content/arangodb/3.13/graphs/_index.md similarity index 97% rename from site/content/3.13/graphs/_index.md rename to site/content/arangodb/3.13/graphs/_index.md index 56f3e5e89b..76d5771e20 100644 --- a/site/content/3.13/graphs/_index.md +++ b/site/content/arangodb/3.13/graphs/_index.md @@ -17,12 +17,12 @@ causal relationships, flows of information, energy, and material, interactions a transactions, dependency and hierarchy, as well as similarity and relatedness of any kind. -![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../images/data-model-graph-relation-abstract-edge.png) +![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../../images/data-model-graph-relation-abstract-edge.png) For example, you can represent people by nodes and their friendships by edges. This lets you form a graph that is a social network in this case. -![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../images/data-model-graph-relation-concrete.png) +![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../../images/data-model-graph-relation-concrete.png) The specific terms to refer to nodes and edges in a graph vary depending on the field or context, but they are conceptually the same. In computer science @@ -42,7 +42,7 @@ relate to one another is a very expressive data model. It lets you represent a wide variety of information in a compact and intuitive way. It lets you model complex relationships and interactions of basically everything. -![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../images/data-model-graph-relations.png) +![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../../images/data-model-graph-relations.png) Graphs are commonly directed (_digraphs_), which means that each edge goes from one node to another node in a specific direction. This lets you model @@ -215,7 +215,7 @@ suboptimal query performance due to random data distribution. General graphs are the easiest way to get started, no special configuration required. {{< /tip >}} -![General Graph Random Distribution](../../images/general-graph-distribution.png) +![General Graph Random Distribution](../../../images/general-graph-distribution.png) #### When to use SmartGraphs @@ -230,7 +230,7 @@ scenarios, use SmartGraphs. Organize your data efficiently using the `smartGraphAttribute`. {{< /tip >}} -![SmartGraph Distribution](../../images/smartgraph-distribution.png) +![SmartGraph Distribution](../../../images/smartgraph-distribution.png) #### When to use EnterpriseGraphs @@ -244,7 +244,7 @@ If you need improved query execution without manual data distribution, consider using EnterpriseGraphs. {{< /tip >}} -![EnterpriseGraph Distribution](../../images/enterprisegraph-distribution.png) +![EnterpriseGraph Distribution](../../../images/enterprisegraph-distribution.png) #### When to use SatelliteGraphs @@ -331,7 +331,7 @@ with `_from` pointing to `Users/John` and `_to` pointing to attributes to qualify the relation further, like the permissions of **John** in this group, the date when John joined the group, and so on. -![User in group example](../../images/graph_user_in_group.png) +![User in group example](../../../images/graph_user_in_group.png) As a rule of thumb, if you use documents and their attributes in a sentence, nouns would typically be nodes, and the verbs the edges. diff --git a/site/content/3.13/graphs/enterprisegraphs/_index.md b/site/content/arangodb/3.13/graphs/enterprisegraphs/_index.md similarity index 100% rename from site/content/3.13/graphs/enterprisegraphs/_index.md rename to site/content/arangodb/3.13/graphs/enterprisegraphs/_index.md diff --git a/site/content/3.13/graphs/enterprisegraphs/getting-started.md b/site/content/arangodb/3.13/graphs/enterprisegraphs/getting-started.md similarity index 99% rename from site/content/3.13/graphs/enterprisegraphs/getting-started.md rename to site/content/arangodb/3.13/graphs/enterprisegraphs/getting-started.md index 35f92abd86..95e376f612 100644 --- a/site/content/3.13/graphs/enterprisegraphs/getting-started.md +++ b/site/content/arangodb/3.13/graphs/enterprisegraphs/getting-started.md @@ -211,7 +211,7 @@ EnterpriseGraphs. To get started, follow the steps outlined below. 6. Click the name or row of the newly created graph to open the Graph Viewer if you want to visually interact with the graph and manage the graph data. -![Create EnterpriseGraph](../../../images/graphs-create-enterprise-graph-dialog312.png) +![Create EnterpriseGraph](../../../../images/graphs-create-enterprise-graph-dialog312.png) ## Create an EnterpriseGraph using *arangosh* diff --git a/site/content/3.13/graphs/enterprisegraphs/management.md b/site/content/arangodb/3.13/graphs/enterprisegraphs/management.md similarity index 100% rename from site/content/3.13/graphs/enterprisegraphs/management.md rename to site/content/arangodb/3.13/graphs/enterprisegraphs/management.md diff --git a/site/content/3.12/graphs/example-graphs.md b/site/content/arangodb/3.13/graphs/example-graphs.md similarity index 94% rename from site/content/3.12/graphs/example-graphs.md rename to site/content/arangodb/3.13/graphs/example-graphs.md index 03434a4bfd..cfc699abad 100644 --- a/site/content/3.12/graphs/example-graphs.md +++ b/site/content/arangodb/3.13/graphs/example-graphs.md @@ -26,7 +26,7 @@ for reference about how to manage graphs programmatically. The `knows` graph is a set of persons knowing each other: -![Persons relation Example Graph](../../images/knows_graph.png) +![Persons relation Example Graph](../../../images/knows_graph.png) The graph consists of a `persons` node collection connected via a `knows` edge collection. @@ -63,7 +63,7 @@ The `traversalGraph` has been designed to demonstrate filters in traversals. It has some labels to filter on it. The graph's nodes are in a collection called `circles`, and it has an edge collection `edges` to connect them. -![Traversal Graph](../../images/traversal_graph.png) +![Traversal Graph](../../../images/traversal_graph.png) Circles have unique numeric labels. Edges have two boolean attributes (`theFalse` always being `false`, `theTruth` always being `true`) and a label @@ -93,7 +93,7 @@ The nodes in the `kShortestPathsGraph` graph are train stations of cities in Europe and North America. The edges represent train connections between them, with the travel time for both directions as edge weight. -![Train Connection Map](../../images/train_map.png) +![Train Connection Map](../../../images/train_map.png) See the [k Shortest Paths page](../aql/graphs/k-shortest-paths.md) for query examples. @@ -118,7 +118,7 @@ The example graph consists of nodes in the `mps_verts` collection and edges in the `mps_edges` collection. It is a simple traversal graph with start node *A* and end node *C*. -![Mps Graph](../../images/mps_graph.png) +![Mps Graph](../../../images/mps_graph.png) With the [Shortest Path](../aql/graphs/shortest-path.md) algorithm, you either get the shortest path *A* - *B* - *C* or *A* - *D* - *C*. With the @@ -146,7 +146,7 @@ The `worldCountry` graph has as node structure as follows: world → continent → country → capital -![World Graph](../../images/world_graph.png) +![World Graph](../../../images/world_graph.png) In some cases, edge directions aren't forward. Therefore, it may get displayed disjunct in the graph viewer. @@ -175,7 +175,7 @@ The `social` graph is a set of persons and their relations. The graph has `female` and `male` persons as nodes in two node collections. The edges are their connections and stored in the `relation` edge collection. -![Social Example Graph](../../images/social_graph.png) +![Social Example Graph](../../../images/social_graph.png) Example of how to create the graph, inspect its nodes and edges, and delete it again: @@ -201,7 +201,7 @@ multiple node collections (`germanCity` and `frenchCity`). The edges are their interconnections in several edge collections (`frenchHighway`, `germanHighway`, `internationalHighway`). -![Cities Example Graph](../../images/cities_graph.png) +![Cities Example Graph](../../../images/cities_graph.png) Example of how to create the graph, inspect its edges and nodes, and delete it again: @@ -227,7 +227,7 @@ A small example graph comprised of `components` (nodes) and `connections` (edges). Good for trying out graph algorithms such as Weakly Connected Components (WCC). -![Three disjoint subgraphs with 36 nodes and edges in total](../../images/connected_components.png) +![Three disjoint subgraphs with 36 nodes and edges in total](../../../images/connected_components.png) ```js --- diff --git a/site/content/3.13/graphs/general-graphs/_index.md b/site/content/arangodb/3.13/graphs/general-graphs/_index.md similarity index 98% rename from site/content/3.13/graphs/general-graphs/_index.md rename to site/content/arangodb/3.13/graphs/general-graphs/_index.md index db1c8ffaf8..26e4c9a7e3 100644 --- a/site/content/3.13/graphs/general-graphs/_index.md +++ b/site/content/arangodb/3.13/graphs/general-graphs/_index.md @@ -57,7 +57,7 @@ General Graphs. To get started, follow the steps outlined below. 8. Click the name or row of the newly created graph to open the Graph Viewer if you want to visually interact with the graph and manage the graph data. -![Create General Graph](../../../images/Create-GeneralGraph312.png) +![Create General Graph](../../../../images/Create-GeneralGraph312.png) ### Create a General Graph using *arangosh* diff --git a/site/content/3.12/graphs/general-graphs/functions.md b/site/content/arangodb/3.13/graphs/general-graphs/functions.md similarity index 99% rename from site/content/3.12/graphs/general-graphs/functions.md rename to site/content/arangodb/3.13/graphs/general-graphs/functions.md index 447a98a765..b7407a5cbc 100644 --- a/site/content/3.12/graphs/general-graphs/functions.md +++ b/site/content/arangodb/3.13/graphs/general-graphs/functions.md @@ -10,7 +10,7 @@ A lot of these accept a node (or edge) example as parameter as defined in the ne Examples explain the API using the [City Graph](../example-graphs.md#city-graph): -![Social Example Graph](../../../images/cities_graph.png) +![Social Example Graph](../../../../images/cities_graph.png) ## Definition of examples diff --git a/site/content/3.13/graphs/general-graphs/management.md b/site/content/arangodb/3.13/graphs/general-graphs/management.md similarity index 100% rename from site/content/3.13/graphs/general-graphs/management.md rename to site/content/arangodb/3.13/graphs/general-graphs/management.md diff --git a/site/content/3.13/graphs/satellitegraphs/_index.md b/site/content/arangodb/3.13/graphs/satellitegraphs/_index.md similarity index 98% rename from site/content/3.13/graphs/satellitegraphs/_index.md rename to site/content/arangodb/3.13/graphs/satellitegraphs/_index.md index bda0c8326e..9c716f43ed 100644 --- a/site/content/3.13/graphs/satellitegraphs/_index.md +++ b/site/content/arangodb/3.13/graphs/satellitegraphs/_index.md @@ -17,7 +17,7 @@ the performance of such queries. They are the natural extension of the [SatelliteCollections](../../develop/satellitecollections.md) concept to graphs. The same benefits and caveats apply. -![ArangoDB SatelliteGraphs](../../../images/SatelliteGraphs.webp) +![ArangoDB SatelliteGraphs](../../../../images/SatelliteGraphs.webp) ## Why use a SatelliteGraph? diff --git a/site/content/3.13/graphs/satellitegraphs/details.md b/site/content/arangodb/3.13/graphs/satellitegraphs/details.md similarity index 100% rename from site/content/3.13/graphs/satellitegraphs/details.md rename to site/content/arangodb/3.13/graphs/satellitegraphs/details.md diff --git a/site/content/3.13/graphs/satellitegraphs/management.md b/site/content/arangodb/3.13/graphs/satellitegraphs/management.md similarity index 100% rename from site/content/3.13/graphs/satellitegraphs/management.md rename to site/content/arangodb/3.13/graphs/satellitegraphs/management.md diff --git a/site/content/3.12/graphs/smartgraphs/_index.md b/site/content/arangodb/3.13/graphs/smartgraphs/_index.md similarity index 94% rename from site/content/3.12/graphs/smartgraphs/_index.md rename to site/content/arangodb/3.13/graphs/smartgraphs/_index.md index 3da62055e6..9122893c10 100644 --- a/site/content/3.12/graphs/smartgraphs/_index.md +++ b/site/content/arangodb/3.13/graphs/smartgraphs/_index.md @@ -59,7 +59,7 @@ cluster for both scenarios. Let's take a closer look at it. The natural distribution of data for graphs that handle large datasets involves a series of highly interconnected nodes with many edges running between them. -![Random data distribution](../../../images/SmartGraphs_random_distribution.png) +![Random data distribution](../../../../images/SmartGraphs_random_distribution.png) _The orange line indicates an example graph traversal. Notice how it touches nodes on every server._ @@ -85,7 +85,7 @@ connecting nodes with identical `smartGraphAttribute` values are stored on this machine as well. Sharding with this attribute means that the relevant data is now co-located on servers, whenever possible. -![SmartGraphs data distribution](../../../images/SmartGraphs_distribution.png) +![SmartGraphs data distribution](../../../../images/SmartGraphs_distribution.png) _The outcome of moving the data like this is that you retain the scalability as well as the performance of graph traversals in ArangoDB._ @@ -102,7 +102,7 @@ and path search queries can partially be executed locally on each DB-Server. This means a larger part of the query can be executed fully local whenever data from the SatelliteCollections is required. -![SmartGraphs with SatelliteCollections](../../../images/SmartGraphs-using-SatelliteCollections.png) +![SmartGraphs with SatelliteCollections](../../../../images/SmartGraphs-using-SatelliteCollections.png) ## Disjoint SmartGraphs @@ -111,7 +111,7 @@ large forest of graphs, when you have clearly separated subgraphs in your graph dataset. Disjoint SmartGraphs enable the automatic sharding of these subgraphs and prohibit edges connecting them. -![Disjoint SmartGraphs](../../../images/SmartGraphs-Disjoint.png) +![Disjoint SmartGraphs](../../../../images/SmartGraphs-Disjoint.png) _This ensures that graph traversals, shortest path, and k-shortest-paths queries can be executed locally on a DB-Server, achieving improved performance for diff --git a/site/content/3.12/graphs/smartgraphs/getting-started.md b/site/content/arangodb/3.13/graphs/smartgraphs/getting-started.md similarity index 99% rename from site/content/3.12/graphs/smartgraphs/getting-started.md rename to site/content/arangodb/3.13/graphs/smartgraphs/getting-started.md index 6a52edf103..ecf3605146 100644 --- a/site/content/3.12/graphs/smartgraphs/getting-started.md +++ b/site/content/arangodb/3.13/graphs/smartgraphs/getting-started.md @@ -63,7 +63,7 @@ SmartGraphs. To get started, follow the steps outlined below. 7. Click the name or row of the newly created graph to open the Graph Viewer if you want to visually interact with the graph and manage the graph data. -![Create SmartGraph](../../../images/Create-SmartGraph312.png) +![Create SmartGraph](../../../../images/Create-SmartGraph312.png) ## Create a SmartGraph using *arangosh* diff --git a/site/content/3.13/graphs/smartgraphs/management.md b/site/content/arangodb/3.13/graphs/smartgraphs/management.md similarity index 100% rename from site/content/3.13/graphs/smartgraphs/management.md rename to site/content/arangodb/3.13/graphs/smartgraphs/management.md diff --git a/site/content/3.13/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/3.13/graphs/smartgraphs/testing-graphs-on-single-server.md similarity index 100% rename from site/content/3.13/graphs/smartgraphs/testing-graphs-on-single-server.md rename to site/content/arangodb/3.13/graphs/smartgraphs/testing-graphs-on-single-server.md diff --git a/site/content/3.13/graphs/working-with-edges.md b/site/content/arangodb/3.13/graphs/working-with-edges.md similarity index 100% rename from site/content/3.13/graphs/working-with-edges.md rename to site/content/arangodb/3.13/graphs/working-with-edges.md diff --git a/site/content/3.13/index-and-search/_index.md b/site/content/arangodb/3.13/index-and-search/_index.md similarity index 100% rename from site/content/3.13/index-and-search/_index.md rename to site/content/arangodb/3.13/index-and-search/_index.md diff --git a/site/content/3.13/index-and-search/analyzers.md b/site/content/arangodb/3.13/index-and-search/analyzers.md similarity index 100% rename from site/content/3.13/index-and-search/analyzers.md rename to site/content/arangodb/3.13/index-and-search/analyzers.md diff --git a/site/content/3.13/index-and-search/arangosearch/_index.md b/site/content/arangodb/3.13/index-and-search/arangosearch/_index.md similarity index 99% rename from site/content/3.13/index-and-search/arangosearch/_index.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/_index.md index 1ed9427ec8..cafe475c19 100644 --- a/site/content/3.13/index-and-search/arangosearch/_index.md +++ b/site/content/arangodb/3.13/index-and-search/arangosearch/_index.md @@ -65,7 +65,7 @@ Search results can be sorted by their similarity ranking to return the best matches first using popular scoring algorithms (Okapi BM25, TF-IDF), user-defined relevance boosting and dynamic score calculation. -![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../images/arangosearch.png) +![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../../images/arangosearch.png) Views can be managed in the web interface, via an [HTTP API](../../develop/http-api/views/_index.md) and through a [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views). diff --git a/site/content/3.12/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/3.13/index-and-search/arangosearch/arangosearch-views-reference.md similarity index 99% rename from site/content/3.12/index-and-search/arangosearch/arangosearch-views-reference.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/arangosearch-views-reference.md index cf7c21cdba..758d758003 100644 --- a/site/content/3.12/index-and-search/arangosearch/arangosearch-views-reference.md +++ b/site/content/arangodb/3.13/index-and-search/arangosearch/arangosearch-views-reference.md @@ -58,7 +58,7 @@ To get started, follow the steps outlined below. turn off this limit for any writer. 8. Click **Create**. -![Create new arangosearch View](../../../images/arangosearch-create-new-view.png) +![Create new arangosearch View](../../../../images/arangosearch-create-new-view.png) ## Create `arangosearch` Views using the JavaScript API diff --git a/site/content/3.13/index-and-search/arangosearch/case-sensitivity-and-diacritics.md b/site/content/arangodb/3.13/index-and-search/arangosearch/case-sensitivity-and-diacritics.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/case-sensitivity-and-diacritics.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/case-sensitivity-and-diacritics.md diff --git a/site/content/3.13/index-and-search/arangosearch/exact-value-matching.md b/site/content/arangodb/3.13/index-and-search/arangosearch/exact-value-matching.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/exact-value-matching.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/exact-value-matching.md diff --git a/site/content/3.13/index-and-search/arangosearch/example-datasets.md b/site/content/arangodb/3.13/index-and-search/arangosearch/example-datasets.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/example-datasets.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/example-datasets.md diff --git a/site/content/3.13/index-and-search/arangosearch/faceted-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/faceted-search.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/faceted-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/faceted-search.md diff --git a/site/content/3.13/index-and-search/arangosearch/full-text-token-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/full-text-token-search.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/full-text-token-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/full-text-token-search.md diff --git a/site/content/3.13/index-and-search/arangosearch/fuzzy-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/fuzzy-search.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/fuzzy-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/fuzzy-search.md diff --git a/site/content/3.12/index-and-search/arangosearch/geospatial-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/geospatial-search.md similarity index 99% rename from site/content/3.12/index-and-search/arangosearch/geospatial-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/geospatial-search.md index 37bfad4fc3..7f33e7c73c 100644 --- a/site/content/3.12/index-and-search/arangosearch/geospatial-search.md +++ b/site/content/arangodb/3.13/index-and-search/arangosearch/geospatial-search.md @@ -297,7 +297,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for points in a polygon](../../../images/arangosearch-geo-points-in-polygon.png) +![ArangoSearch geospatial query for points in a polygon](../../../../images/arangosearch-geo-points-in-polygon.png) You do not have to look up the polygon, you can also provide one inline. It is also not necessary to return the polygon, you can return the matches only: @@ -559,7 +559,7 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geosptial query for polygons in a polygon](../../../images/arangosearch-geo-polygons-in-polygon.png) +![ArangoSearch geosptial query for polygons in a polygon](../../../../images/arangosearch-geo-polygons-in-polygon.png) Searching for geo features in a rectangle is something you can use together with an interactive map that the user can select the area of interest with. @@ -629,4 +629,4 @@ FOR result IN PUSH( {{< /tabs >}} -![ArangoSearch geospatial query for polygons intersecting a polygon](../../../images/arangosearch-geo-polygons-intersecting-polygon.png) +![ArangoSearch geospatial query for polygons intersecting a polygon](../../../../images/arangosearch-geo-polygons-intersecting-polygon.png) diff --git a/site/content/3.13/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/nested-search.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/nested-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/nested-search.md diff --git a/site/content/3.13/index-and-search/arangosearch/performance.md b/site/content/arangodb/3.13/index-and-search/arangosearch/performance.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/performance.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/performance.md diff --git a/site/content/3.13/index-and-search/arangosearch/phrase-and-proximity-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/phrase-and-proximity-search.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/phrase-and-proximity-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/phrase-and-proximity-search.md diff --git a/site/content/3.13/index-and-search/arangosearch/prefix-matching.md b/site/content/arangodb/3.13/index-and-search/arangosearch/prefix-matching.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/prefix-matching.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/prefix-matching.md diff --git a/site/content/3.13/index-and-search/arangosearch/range-queries.md b/site/content/arangodb/3.13/index-and-search/arangosearch/range-queries.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/range-queries.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/range-queries.md diff --git a/site/content/3.13/index-and-search/arangosearch/ranking.md b/site/content/arangodb/3.13/index-and-search/arangosearch/ranking.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/ranking.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/ranking.md diff --git a/site/content/3.13/index-and-search/arangosearch/search-alias-views-reference.md b/site/content/arangodb/3.13/index-and-search/arangosearch/search-alias-views-reference.md similarity index 97% rename from site/content/3.13/index-and-search/arangosearch/search-alias-views-reference.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/search-alias-views-reference.md index 3b95bd0c65..96a7a7ac19 100644 --- a/site/content/3.13/index-and-search/arangosearch/search-alias-views-reference.md +++ b/site/content/arangodb/3.13/index-and-search/arangosearch/search-alias-views-reference.md @@ -61,7 +61,7 @@ To get started, follow the steps outlined below. 6. To define multiple indexes, click the **Add index** button. 7. Click **Create**. -![Create new search-alias View](../../../images/arangosearch-create-search-alias-view.png) +![Create new search-alias View](../../../../images/arangosearch-create-search-alias-view.png) ## Create `search-alias` Views using the JavaScript API diff --git a/site/content/3.13/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/3.13/index-and-search/arangosearch/search-highlighting.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/search-highlighting.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/search-highlighting.md diff --git a/site/content/3.13/index-and-search/arangosearch/wildcard-search.md b/site/content/arangodb/3.13/index-and-search/arangosearch/wildcard-search.md similarity index 100% rename from site/content/3.13/index-and-search/arangosearch/wildcard-search.md rename to site/content/arangodb/3.13/index-and-search/arangosearch/wildcard-search.md diff --git a/site/content/3.13/index-and-search/indexing/_index.md b/site/content/arangodb/3.13/index-and-search/indexing/_index.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/_index.md rename to site/content/arangodb/3.13/index-and-search/indexing/_index.md diff --git a/site/content/3.13/index-and-search/indexing/basics.md b/site/content/arangodb/3.13/index-and-search/indexing/basics.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/basics.md rename to site/content/arangodb/3.13/index-and-search/indexing/basics.md diff --git a/site/content/3.13/index-and-search/indexing/index-utilization.md b/site/content/arangodb/3.13/index-and-search/indexing/index-utilization.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/index-utilization.md rename to site/content/arangodb/3.13/index-and-search/indexing/index-utilization.md diff --git a/site/content/3.13/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/3.13/index-and-search/indexing/which-index-to-use-when.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/which-index-to-use-when.md rename to site/content/arangodb/3.13/index-and-search/indexing/which-index-to-use-when.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/_index.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/_index.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/_index.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/_index.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/fulltext-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/fulltext-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/fulltext-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/fulltext-indexes.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/inverted-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/inverted-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/inverted-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/inverted-indexes.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/persistent-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/persistent-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/persistent-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/persistent-indexes.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/ttl-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/ttl-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/ttl-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/ttl-indexes.md diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md similarity index 99% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md index 94aa2cdc95..3ebbb3f8c9 100644 --- a/site/content/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -33,7 +33,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the experimental vector index feature. -2. Calculate vector embeddings using [ArangoDB's GraphML](../../../data-science/graphml/_index.md) +2. Calculate vector embeddings using [ArangoDB's GraphML](../../../../../gen-ai/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/3.13/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md similarity index 100% rename from site/content/3.13/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md rename to site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md diff --git a/site/content/3.13/operations/_index.md b/site/content/arangodb/3.13/operations/_index.md similarity index 100% rename from site/content/3.13/operations/_index.md rename to site/content/arangodb/3.13/operations/_index.md diff --git a/site/content/3.13/operations/administration/_index.md b/site/content/arangodb/3.13/operations/administration/_index.md similarity index 100% rename from site/content/3.13/operations/administration/_index.md rename to site/content/arangodb/3.13/operations/administration/_index.md diff --git a/site/content/3.13/operations/administration/arangodb-starter/_index.md b/site/content/arangodb/3.13/operations/administration/arangodb-starter/_index.md similarity index 100% rename from site/content/3.13/operations/administration/arangodb-starter/_index.md rename to site/content/arangodb/3.13/operations/administration/arangodb-starter/_index.md diff --git a/site/content/3.13/operations/administration/arangodb-starter/recovery-procedure.md b/site/content/arangodb/3.13/operations/administration/arangodb-starter/recovery-procedure.md similarity index 100% rename from site/content/3.13/operations/administration/arangodb-starter/recovery-procedure.md rename to site/content/arangodb/3.13/operations/administration/arangodb-starter/recovery-procedure.md diff --git a/site/content/3.13/operations/administration/arangodb-starter/removal-procedure.md b/site/content/arangodb/3.13/operations/administration/arangodb-starter/removal-procedure.md similarity index 100% rename from site/content/3.13/operations/administration/arangodb-starter/removal-procedure.md rename to site/content/arangodb/3.13/operations/administration/arangodb-starter/removal-procedure.md diff --git a/site/content/3.13/operations/administration/configuration.md b/site/content/arangodb/3.13/operations/administration/configuration.md similarity index 100% rename from site/content/3.13/operations/administration/configuration.md rename to site/content/arangodb/3.13/operations/administration/configuration.md diff --git a/site/content/3.13/operations/administration/import-and-export.md b/site/content/arangodb/3.13/operations/administration/import-and-export.md similarity index 100% rename from site/content/3.13/operations/administration/import-and-export.md rename to site/content/arangodb/3.13/operations/administration/import-and-export.md diff --git a/site/content/3.13/operations/administration/license-management.md b/site/content/arangodb/3.13/operations/administration/license-management.md similarity index 99% rename from site/content/3.13/operations/administration/license-management.md rename to site/content/arangodb/3.13/operations/administration/license-management.md index 365f990b5c..f51a1aeedf 100644 --- a/site/content/3.13/operations/administration/license-management.md +++ b/site/content/arangodb/3.13/operations/administration/license-management.md @@ -9,7 +9,7 @@ aliases: --- The Enterprise Edition of ArangoDB requires a license so that you can use ArangoDB for commercial purposes and have a dataset size over 100 GiB. See -[ArangoDB Editions](../../about-arangodb/features/_index.md#arangodb-editions) +[ArangoDB Editions](../../about/features/_index.md#arangodb-editions) for details. How to set a license key and to retrieve information about the current license diff --git a/site/content/3.13/operations/administration/log-levels.md b/site/content/arangodb/3.13/operations/administration/log-levels.md similarity index 100% rename from site/content/3.13/operations/administration/log-levels.md rename to site/content/arangodb/3.13/operations/administration/log-levels.md diff --git a/site/content/3.12/operations/administration/reduce-memory-footprint.md b/site/content/arangodb/3.13/operations/administration/reduce-memory-footprint.md similarity index 99% rename from site/content/3.12/operations/administration/reduce-memory-footprint.md rename to site/content/arangodb/3.13/operations/administration/reduce-memory-footprint.md index 4bd19f5572..d0d29b77a7 100644 --- a/site/content/3.12/operations/administration/reduce-memory-footprint.md +++ b/site/content/arangodb/3.13/operations/administration/reduce-memory-footprint.md @@ -701,7 +701,7 @@ otherwise. ## Testing the Effects of Reduced I/O Buffers -![Performance Graph](../../../images/performance_graph.png) +![Performance Graph](../../../../images/performance_graph.png) - 15:50 – Start bigger import - 16:00 – Start writing documents of ~60 KB size one at a time diff --git a/site/content/3.13/operations/administration/telemetrics.md b/site/content/arangodb/3.13/operations/administration/telemetrics.md similarity index 100% rename from site/content/3.13/operations/administration/telemetrics.md rename to site/content/arangodb/3.13/operations/administration/telemetrics.md diff --git a/site/content/3.13/operations/administration/user-management/_index.md b/site/content/arangodb/3.13/operations/administration/user-management/_index.md similarity index 100% rename from site/content/3.13/operations/administration/user-management/_index.md rename to site/content/arangodb/3.13/operations/administration/user-management/_index.md diff --git a/site/content/3.13/operations/administration/user-management/in-arangosh.md b/site/content/arangodb/3.13/operations/administration/user-management/in-arangosh.md similarity index 100% rename from site/content/3.13/operations/administration/user-management/in-arangosh.md rename to site/content/arangodb/3.13/operations/administration/user-management/in-arangosh.md diff --git a/site/content/3.13/operations/backup-and-restore.md b/site/content/arangodb/3.13/operations/backup-and-restore.md similarity index 100% rename from site/content/3.13/operations/backup-and-restore.md rename to site/content/arangodb/3.13/operations/backup-and-restore.md diff --git a/site/content/3.13/operations/installation/_index.md b/site/content/arangodb/3.13/operations/installation/_index.md similarity index 97% rename from site/content/3.13/operations/installation/_index.md rename to site/content/arangodb/3.13/operations/installation/_index.md index 3d225b8ada..eeaf51934f 100644 --- a/site/content/3.13/operations/installation/_index.md +++ b/site/content/arangodb/3.13/operations/installation/_index.md @@ -56,7 +56,7 @@ The official Linux release executables of ArangoDB require the operating system to use a page size of **4096 bytes** or less. {{< tip >}} -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) is a fully-managed service and requires no installation. It's the easiest way to run ArangoDB in the cloud. {{< /tip >}} diff --git a/site/content/3.13/operations/installation/docker.md b/site/content/arangodb/3.13/operations/installation/docker.md similarity index 100% rename from site/content/3.13/operations/installation/docker.md rename to site/content/arangodb/3.13/operations/installation/docker.md diff --git a/site/content/3.13/operations/installation/linux/_index.md b/site/content/arangodb/3.13/operations/installation/linux/_index.md similarity index 100% rename from site/content/3.13/operations/installation/linux/_index.md rename to site/content/arangodb/3.13/operations/installation/linux/_index.md diff --git a/site/content/3.13/operations/installation/linux/linux-os-tuning-script-examples.md b/site/content/arangodb/3.13/operations/installation/linux/linux-os-tuning-script-examples.md similarity index 100% rename from site/content/3.13/operations/installation/linux/linux-os-tuning-script-examples.md rename to site/content/arangodb/3.13/operations/installation/linux/linux-os-tuning-script-examples.md diff --git a/site/content/3.13/operations/installation/linux/operating-system-configuration.md b/site/content/arangodb/3.13/operations/installation/linux/operating-system-configuration.md similarity index 100% rename from site/content/3.13/operations/installation/linux/operating-system-configuration.md rename to site/content/arangodb/3.13/operations/installation/linux/operating-system-configuration.md diff --git a/site/content/3.13/operations/installation/uninstallation.md b/site/content/arangodb/3.13/operations/installation/uninstallation.md similarity index 100% rename from site/content/3.13/operations/installation/uninstallation.md rename to site/content/arangodb/3.13/operations/installation/uninstallation.md diff --git a/site/content/3.13/operations/security/_index.md b/site/content/arangodb/3.13/operations/security/_index.md similarity index 100% rename from site/content/3.13/operations/security/_index.md rename to site/content/arangodb/3.13/operations/security/_index.md diff --git a/site/content/3.13/operations/security/audit-logging.md b/site/content/arangodb/3.13/operations/security/audit-logging.md similarity index 98% rename from site/content/3.13/operations/security/audit-logging.md rename to site/content/arangodb/3.13/operations/security/audit-logging.md index cf18c9abf3..99732fa739 100644 --- a/site/content/3.13/operations/security/audit-logging.md +++ b/site/content/arangodb/3.13/operations/security/audit-logging.md @@ -11,7 +11,7 @@ pageToc: --- {{< tip >}} A similar feature is also available in the -[ArangoGraph Insights Platform](../../arangograph/security-and-access-control/_index.md#using-an-audit-log). +[Arango Managed Platform (AMP)](../../../../amp/security-and-access-control/_index.md#using-an-audit-log). {{< /tip >}} ## Configuration diff --git a/site/content/3.13/operations/security/change-root-password.md b/site/content/arangodb/3.13/operations/security/change-root-password.md similarity index 100% rename from site/content/3.13/operations/security/change-root-password.md rename to site/content/arangodb/3.13/operations/security/change-root-password.md diff --git a/site/content/3.12/operations/security/encryption-at-rest.md b/site/content/arangodb/3.13/operations/security/encryption-at-rest.md similarity index 97% rename from site/content/3.12/operations/security/encryption-at-rest.md rename to site/content/arangodb/3.13/operations/security/encryption-at-rest.md index d292695e48..e7af703377 100644 --- a/site/content/3.12/operations/security/encryption-at-rest.md +++ b/site/content/arangodb/3.13/operations/security/encryption-at-rest.md @@ -28,9 +28,9 @@ performance and resistance to side-channel attacks. The encryption feature is supported by all ArangoDB deployment modes. {{< info >}} -The ArangoGraph Insights Platform has encryption at rest as well as in transit +The Arango Managed Platform (AMP) has encryption at rest as well as in transit set on by default and cannot be disabled. For more information, see the -[ArangoGraph documentation](../../arangograph/_index.md). +[ArangoGraph documentation](../../../../amp/_index.md). {{< /info >}} ## Limitations diff --git a/site/content/3.13/operations/security/securing-starter-deployments.md b/site/content/arangodb/3.13/operations/security/securing-starter-deployments.md similarity index 100% rename from site/content/3.13/operations/security/securing-starter-deployments.md rename to site/content/arangodb/3.13/operations/security/securing-starter-deployments.md diff --git a/site/content/3.13/operations/security/security-options.md b/site/content/arangodb/3.13/operations/security/security-options.md similarity index 100% rename from site/content/3.13/operations/security/security-options.md rename to site/content/arangodb/3.13/operations/security/security-options.md diff --git a/site/content/3.13/operations/troubleshooting/_index.md b/site/content/arangodb/3.13/operations/troubleshooting/_index.md similarity index 100% rename from site/content/3.13/operations/troubleshooting/_index.md rename to site/content/arangodb/3.13/operations/troubleshooting/_index.md diff --git a/site/content/3.13/operations/troubleshooting/arangod.md b/site/content/arangodb/3.13/operations/troubleshooting/arangod.md similarity index 100% rename from site/content/3.13/operations/troubleshooting/arangod.md rename to site/content/arangodb/3.13/operations/troubleshooting/arangod.md diff --git a/site/content/3.13/operations/troubleshooting/cluster/_index.md b/site/content/arangodb/3.13/operations/troubleshooting/cluster/_index.md similarity index 100% rename from site/content/3.13/operations/troubleshooting/cluster/_index.md rename to site/content/arangodb/3.13/operations/troubleshooting/cluster/_index.md diff --git a/site/content/3.13/operations/troubleshooting/cluster/agency-dump.md b/site/content/arangodb/3.13/operations/troubleshooting/cluster/agency-dump.md similarity index 100% rename from site/content/3.13/operations/troubleshooting/cluster/agency-dump.md rename to site/content/arangodb/3.13/operations/troubleshooting/cluster/agency-dump.md diff --git a/site/content/3.13/operations/troubleshooting/emergency-console.md b/site/content/arangodb/3.13/operations/troubleshooting/emergency-console.md similarity index 100% rename from site/content/3.13/operations/troubleshooting/emergency-console.md rename to site/content/arangodb/3.13/operations/troubleshooting/emergency-console.md diff --git a/site/content/3.13/operations/troubleshooting/query-debug-packages.md b/site/content/arangodb/3.13/operations/troubleshooting/query-debug-packages.md similarity index 100% rename from site/content/3.13/operations/troubleshooting/query-debug-packages.md rename to site/content/arangodb/3.13/operations/troubleshooting/query-debug-packages.md diff --git a/site/content/3.13/operations/upgrading/_index.md b/site/content/arangodb/3.13/operations/upgrading/_index.md similarity index 100% rename from site/content/3.13/operations/upgrading/_index.md rename to site/content/arangodb/3.13/operations/upgrading/_index.md diff --git a/site/content/3.13/operations/upgrading/downgrading.md b/site/content/arangodb/3.13/operations/upgrading/downgrading.md similarity index 100% rename from site/content/3.13/operations/upgrading/downgrading.md rename to site/content/arangodb/3.13/operations/upgrading/downgrading.md diff --git a/site/content/3.13/operations/upgrading/manual-deployments/_index.md b/site/content/arangodb/3.13/operations/upgrading/manual-deployments/_index.md similarity index 100% rename from site/content/3.13/operations/upgrading/manual-deployments/_index.md rename to site/content/arangodb/3.13/operations/upgrading/manual-deployments/_index.md diff --git a/site/content/3.13/operations/upgrading/manual-deployments/cluster.md b/site/content/arangodb/3.13/operations/upgrading/manual-deployments/cluster.md similarity index 100% rename from site/content/3.13/operations/upgrading/manual-deployments/cluster.md rename to site/content/arangodb/3.13/operations/upgrading/manual-deployments/cluster.md diff --git a/site/content/3.13/operations/upgrading/manual-deployments/single-server.md b/site/content/arangodb/3.13/operations/upgrading/manual-deployments/single-server.md similarity index 100% rename from site/content/3.13/operations/upgrading/manual-deployments/single-server.md rename to site/content/arangodb/3.13/operations/upgrading/manual-deployments/single-server.md diff --git a/site/content/3.13/operations/upgrading/starter-deployments.md b/site/content/arangodb/3.13/operations/upgrading/starter-deployments.md similarity index 100% rename from site/content/3.13/operations/upgrading/starter-deployments.md rename to site/content/arangodb/3.13/operations/upgrading/starter-deployments.md diff --git a/site/content/3.13/release-notes/_index.md b/site/content/arangodb/3.13/release-notes/_index.md similarity index 100% rename from site/content/3.13/release-notes/_index.md rename to site/content/arangodb/3.13/release-notes/_index.md diff --git a/site/content/3.13/release-notes/deprecated-and-removed-features.md b/site/content/arangodb/3.13/release-notes/deprecated-and-removed-features.md similarity index 100% rename from site/content/3.13/release-notes/deprecated-and-removed-features.md rename to site/content/arangodb/3.13/release-notes/deprecated-and-removed-features.md diff --git a/site/content/3.13/release-notes/platform.md b/site/content/arangodb/3.13/release-notes/platform.md similarity index 94% rename from site/content/3.13/release-notes/platform.md rename to site/content/arangodb/3.13/release-notes/platform.md index 84ecec3536..850dc4df8b 100644 --- a/site/content/3.13/release-notes/platform.md +++ b/site/content/arangodb/3.13/release-notes/platform.md @@ -35,5 +35,5 @@ user-friendly interface seamlessly integrated into the ArangoDB Platform web int - MLflow integration - Graph Visualizer -To learn more, see the [GenAI Suite](../data-science/_index.md#genai-suite) +To learn more, see the [GenAI Suite](../../../gen-ai/_index.md) documentation. diff --git a/site/content/3.13/release-notes/version-3.0/_index.md b/site/content/arangodb/3.13/release-notes/version-3.0/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.0/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.0/_index.md diff --git a/site/content/3.13/release-notes/version-3.0/incompatible-changes-in-3-0.md b/site/content/arangodb/3.13/release-notes/version-3.0/incompatible-changes-in-3-0.md similarity index 100% rename from site/content/3.13/release-notes/version-3.0/incompatible-changes-in-3-0.md rename to site/content/arangodb/3.13/release-notes/version-3.0/incompatible-changes-in-3-0.md diff --git a/site/content/3.13/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.13/release-notes/version-3.0/whats-new-in-3-0.md similarity index 100% rename from site/content/3.13/release-notes/version-3.0/whats-new-in-3-0.md rename to site/content/arangodb/3.13/release-notes/version-3.0/whats-new-in-3-0.md diff --git a/site/content/3.13/release-notes/version-3.1/_index.md b/site/content/arangodb/3.13/release-notes/version-3.1/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.1/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.1/_index.md diff --git a/site/content/3.13/release-notes/version-3.1/incompatible-changes-in-3-1.md b/site/content/arangodb/3.13/release-notes/version-3.1/incompatible-changes-in-3-1.md similarity index 100% rename from site/content/3.13/release-notes/version-3.1/incompatible-changes-in-3-1.md rename to site/content/arangodb/3.13/release-notes/version-3.1/incompatible-changes-in-3-1.md diff --git a/site/content/3.13/release-notes/version-3.1/whats-new-in-3-1.md b/site/content/arangodb/3.13/release-notes/version-3.1/whats-new-in-3-1.md similarity index 100% rename from site/content/3.13/release-notes/version-3.1/whats-new-in-3-1.md rename to site/content/arangodb/3.13/release-notes/version-3.1/whats-new-in-3-1.md diff --git a/site/content/3.13/release-notes/version-3.10/_index.md b/site/content/arangodb/3.13/release-notes/version-3.10/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.10/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.10/_index.md diff --git a/site/content/3.13/release-notes/version-3.10/api-changes-in-3-10.md b/site/content/arangodb/3.13/release-notes/version-3.10/api-changes-in-3-10.md similarity index 100% rename from site/content/3.13/release-notes/version-3.10/api-changes-in-3-10.md rename to site/content/arangodb/3.13/release-notes/version-3.10/api-changes-in-3-10.md diff --git a/site/content/3.13/release-notes/version-3.10/incompatible-changes-in-3-10.md b/site/content/arangodb/3.13/release-notes/version-3.10/incompatible-changes-in-3-10.md similarity index 100% rename from site/content/3.13/release-notes/version-3.10/incompatible-changes-in-3-10.md rename to site/content/arangodb/3.13/release-notes/version-3.10/incompatible-changes-in-3-10.md diff --git a/site/content/3.13/release-notes/version-3.10/known-issues-in-3-10.md b/site/content/arangodb/3.13/release-notes/version-3.10/known-issues-in-3-10.md similarity index 100% rename from site/content/3.13/release-notes/version-3.10/known-issues-in-3-10.md rename to site/content/arangodb/3.13/release-notes/version-3.10/known-issues-in-3-10.md diff --git a/site/content/3.13/release-notes/version-3.10/whats-new-in-3-10.md b/site/content/arangodb/3.13/release-notes/version-3.10/whats-new-in-3-10.md similarity index 100% rename from site/content/3.13/release-notes/version-3.10/whats-new-in-3-10.md rename to site/content/arangodb/3.13/release-notes/version-3.10/whats-new-in-3-10.md diff --git a/site/content/3.13/release-notes/version-3.11/_index.md b/site/content/arangodb/3.13/release-notes/version-3.11/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.11/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.11/_index.md diff --git a/site/content/3.13/release-notes/version-3.11/api-changes-in-3-11.md b/site/content/arangodb/3.13/release-notes/version-3.11/api-changes-in-3-11.md similarity index 100% rename from site/content/3.13/release-notes/version-3.11/api-changes-in-3-11.md rename to site/content/arangodb/3.13/release-notes/version-3.11/api-changes-in-3-11.md diff --git a/site/content/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md similarity index 100% rename from site/content/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md rename to site/content/arangodb/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md diff --git a/site/content/3.13/release-notes/version-3.11/known-issues-in-3-11.md b/site/content/arangodb/3.13/release-notes/version-3.11/known-issues-in-3-11.md similarity index 100% rename from site/content/3.13/release-notes/version-3.11/known-issues-in-3-11.md rename to site/content/arangodb/3.13/release-notes/version-3.11/known-issues-in-3-11.md diff --git a/site/content/3.13/release-notes/version-3.11/whats-new-in-3-11.md b/site/content/arangodb/3.13/release-notes/version-3.11/whats-new-in-3-11.md similarity index 99% rename from site/content/3.13/release-notes/version-3.11/whats-new-in-3-11.md rename to site/content/arangodb/3.13/release-notes/version-3.11/whats-new-in-3-11.md index 44ee2b0339..e58d83ff2e 100644 --- a/site/content/3.13/release-notes/version-3.11/whats-new-in-3-11.md +++ b/site/content/arangodb/3.13/release-notes/version-3.11/whats-new-in-3-11.md @@ -127,7 +127,7 @@ vertex. Another quality-of-life improvement is the **Start node** setting listin the graph's vertex collections and the available document keys, that you can also search by. -![New graph viewer](../../../images/graphViewer.png) +![New graph viewer](../../../../images/graphViewer.png) You can still switch to the old graph viewer if desired. diff --git a/site/content/3.13/release-notes/version-3.12/_index.md b/site/content/arangodb/3.13/release-notes/version-3.12/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.12/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.12/_index.md diff --git a/site/content/3.13/release-notes/version-3.12/api-changes-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/api-changes-in-3-12.md similarity index 100% rename from site/content/3.13/release-notes/version-3.12/api-changes-in-3-12.md rename to site/content/arangodb/3.13/release-notes/version-3.12/api-changes-in-3-12.md diff --git a/site/content/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md similarity index 100% rename from site/content/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md rename to site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md diff --git a/site/content/3.13/release-notes/version-3.12/known-issues-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/known-issues-in-3-12.md similarity index 100% rename from site/content/3.13/release-notes/version-3.12/known-issues-in-3-12.md rename to site/content/arangodb/3.13/release-notes/version-3.12/known-issues-in-3-12.md diff --git a/site/content/3.13/release-notes/version-3.12/whats-new-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/whats-new-in-3-12.md similarity index 100% rename from site/content/3.13/release-notes/version-3.12/whats-new-in-3-12.md rename to site/content/arangodb/3.13/release-notes/version-3.12/whats-new-in-3-12.md diff --git a/site/content/3.13/release-notes/version-3.13/_index.md b/site/content/arangodb/3.13/release-notes/version-3.13/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.13/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.13/_index.md diff --git a/site/content/3.13/release-notes/version-3.13/api-changes-in-3-13.md b/site/content/arangodb/3.13/release-notes/version-3.13/api-changes-in-3-13.md similarity index 100% rename from site/content/3.13/release-notes/version-3.13/api-changes-in-3-13.md rename to site/content/arangodb/3.13/release-notes/version-3.13/api-changes-in-3-13.md diff --git a/site/content/3.13/release-notes/version-3.13/incompatible-changes-in-3-13.md b/site/content/arangodb/3.13/release-notes/version-3.13/incompatible-changes-in-3-13.md similarity index 100% rename from site/content/3.13/release-notes/version-3.13/incompatible-changes-in-3-13.md rename to site/content/arangodb/3.13/release-notes/version-3.13/incompatible-changes-in-3-13.md diff --git a/site/content/3.13/release-notes/version-3.13/known-issues-in-3-13.md b/site/content/arangodb/3.13/release-notes/version-3.13/known-issues-in-3-13.md similarity index 100% rename from site/content/3.13/release-notes/version-3.13/known-issues-in-3-13.md rename to site/content/arangodb/3.13/release-notes/version-3.13/known-issues-in-3-13.md diff --git a/site/content/3.13/release-notes/version-3.13/whats-new-in-3-13.md b/site/content/arangodb/3.13/release-notes/version-3.13/whats-new-in-3-13.md similarity index 100% rename from site/content/3.13/release-notes/version-3.13/whats-new-in-3-13.md rename to site/content/arangodb/3.13/release-notes/version-3.13/whats-new-in-3-13.md diff --git a/site/content/3.13/release-notes/version-3.2/_index.md b/site/content/arangodb/3.13/release-notes/version-3.2/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.2/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.2/_index.md diff --git a/site/content/3.13/release-notes/version-3.2/incompatible-changes-in-3-2.md b/site/content/arangodb/3.13/release-notes/version-3.2/incompatible-changes-in-3-2.md similarity index 100% rename from site/content/3.13/release-notes/version-3.2/incompatible-changes-in-3-2.md rename to site/content/arangodb/3.13/release-notes/version-3.2/incompatible-changes-in-3-2.md diff --git a/site/content/3.13/release-notes/version-3.2/known-issues-in-3-2.md b/site/content/arangodb/3.13/release-notes/version-3.2/known-issues-in-3-2.md similarity index 100% rename from site/content/3.13/release-notes/version-3.2/known-issues-in-3-2.md rename to site/content/arangodb/3.13/release-notes/version-3.2/known-issues-in-3-2.md diff --git a/site/content/3.13/release-notes/version-3.2/whats-new-in-3-2.md b/site/content/arangodb/3.13/release-notes/version-3.2/whats-new-in-3-2.md similarity index 100% rename from site/content/3.13/release-notes/version-3.2/whats-new-in-3-2.md rename to site/content/arangodb/3.13/release-notes/version-3.2/whats-new-in-3-2.md diff --git a/site/content/3.13/release-notes/version-3.3/_index.md b/site/content/arangodb/3.13/release-notes/version-3.3/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.3/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.3/_index.md diff --git a/site/content/3.13/release-notes/version-3.3/incompatible-changes-in-3-3.md b/site/content/arangodb/3.13/release-notes/version-3.3/incompatible-changes-in-3-3.md similarity index 100% rename from site/content/3.13/release-notes/version-3.3/incompatible-changes-in-3-3.md rename to site/content/arangodb/3.13/release-notes/version-3.3/incompatible-changes-in-3-3.md diff --git a/site/content/3.13/release-notes/version-3.3/known-issues-in-3-3.md b/site/content/arangodb/3.13/release-notes/version-3.3/known-issues-in-3-3.md similarity index 100% rename from site/content/3.13/release-notes/version-3.3/known-issues-in-3-3.md rename to site/content/arangodb/3.13/release-notes/version-3.3/known-issues-in-3-3.md diff --git a/site/content/3.13/release-notes/version-3.3/whats-new-in-3-3.md b/site/content/arangodb/3.13/release-notes/version-3.3/whats-new-in-3-3.md similarity index 100% rename from site/content/3.13/release-notes/version-3.3/whats-new-in-3-3.md rename to site/content/arangodb/3.13/release-notes/version-3.3/whats-new-in-3-3.md diff --git a/site/content/3.13/release-notes/version-3.4/_index.md b/site/content/arangodb/3.13/release-notes/version-3.4/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.4/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.4/_index.md diff --git a/site/content/3.13/release-notes/version-3.4/incompatible-changes-in-3-4.md b/site/content/arangodb/3.13/release-notes/version-3.4/incompatible-changes-in-3-4.md similarity index 100% rename from site/content/3.13/release-notes/version-3.4/incompatible-changes-in-3-4.md rename to site/content/arangodb/3.13/release-notes/version-3.4/incompatible-changes-in-3-4.md diff --git a/site/content/3.13/release-notes/version-3.4/known-issues-in-3-4.md b/site/content/arangodb/3.13/release-notes/version-3.4/known-issues-in-3-4.md similarity index 100% rename from site/content/3.13/release-notes/version-3.4/known-issues-in-3-4.md rename to site/content/arangodb/3.13/release-notes/version-3.4/known-issues-in-3-4.md diff --git a/site/content/3.13/release-notes/version-3.4/whats-new-in-3-4.md b/site/content/arangodb/3.13/release-notes/version-3.4/whats-new-in-3-4.md similarity index 100% rename from site/content/3.13/release-notes/version-3.4/whats-new-in-3-4.md rename to site/content/arangodb/3.13/release-notes/version-3.4/whats-new-in-3-4.md diff --git a/site/content/3.13/release-notes/version-3.5/_index.md b/site/content/arangodb/3.13/release-notes/version-3.5/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.5/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.5/_index.md diff --git a/site/content/3.13/release-notes/version-3.5/incompatible-changes-in-3-5.md b/site/content/arangodb/3.13/release-notes/version-3.5/incompatible-changes-in-3-5.md similarity index 100% rename from site/content/3.13/release-notes/version-3.5/incompatible-changes-in-3-5.md rename to site/content/arangodb/3.13/release-notes/version-3.5/incompatible-changes-in-3-5.md diff --git a/site/content/3.13/release-notes/version-3.5/known-issues-in-3-5.md b/site/content/arangodb/3.13/release-notes/version-3.5/known-issues-in-3-5.md similarity index 100% rename from site/content/3.13/release-notes/version-3.5/known-issues-in-3-5.md rename to site/content/arangodb/3.13/release-notes/version-3.5/known-issues-in-3-5.md diff --git a/site/content/3.13/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.13/release-notes/version-3.5/whats-new-in-3-5.md similarity index 100% rename from site/content/3.13/release-notes/version-3.5/whats-new-in-3-5.md rename to site/content/arangodb/3.13/release-notes/version-3.5/whats-new-in-3-5.md diff --git a/site/content/3.13/release-notes/version-3.6/_index.md b/site/content/arangodb/3.13/release-notes/version-3.6/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.6/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.6/_index.md diff --git a/site/content/3.13/release-notes/version-3.6/incompatible-changes-in-3-6.md b/site/content/arangodb/3.13/release-notes/version-3.6/incompatible-changes-in-3-6.md similarity index 100% rename from site/content/3.13/release-notes/version-3.6/incompatible-changes-in-3-6.md rename to site/content/arangodb/3.13/release-notes/version-3.6/incompatible-changes-in-3-6.md diff --git a/site/content/3.13/release-notes/version-3.6/known-issues-in-3-6.md b/site/content/arangodb/3.13/release-notes/version-3.6/known-issues-in-3-6.md similarity index 100% rename from site/content/3.13/release-notes/version-3.6/known-issues-in-3-6.md rename to site/content/arangodb/3.13/release-notes/version-3.6/known-issues-in-3-6.md diff --git a/site/content/3.13/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.13/release-notes/version-3.6/whats-new-in-3-6.md similarity index 100% rename from site/content/3.13/release-notes/version-3.6/whats-new-in-3-6.md rename to site/content/arangodb/3.13/release-notes/version-3.6/whats-new-in-3-6.md diff --git a/site/content/3.13/release-notes/version-3.7/_index.md b/site/content/arangodb/3.13/release-notes/version-3.7/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.7/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.7/_index.md diff --git a/site/content/3.13/release-notes/version-3.7/api-changes-in-3-7.md b/site/content/arangodb/3.13/release-notes/version-3.7/api-changes-in-3-7.md similarity index 100% rename from site/content/3.13/release-notes/version-3.7/api-changes-in-3-7.md rename to site/content/arangodb/3.13/release-notes/version-3.7/api-changes-in-3-7.md diff --git a/site/content/3.13/release-notes/version-3.7/incompatible-changes-in-3-7.md b/site/content/arangodb/3.13/release-notes/version-3.7/incompatible-changes-in-3-7.md similarity index 100% rename from site/content/3.13/release-notes/version-3.7/incompatible-changes-in-3-7.md rename to site/content/arangodb/3.13/release-notes/version-3.7/incompatible-changes-in-3-7.md diff --git a/site/content/3.13/release-notes/version-3.7/known-issues-in-3-7.md b/site/content/arangodb/3.13/release-notes/version-3.7/known-issues-in-3-7.md similarity index 100% rename from site/content/3.13/release-notes/version-3.7/known-issues-in-3-7.md rename to site/content/arangodb/3.13/release-notes/version-3.7/known-issues-in-3-7.md diff --git a/site/content/3.13/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.13/release-notes/version-3.7/whats-new-in-3-7.md similarity index 100% rename from site/content/3.13/release-notes/version-3.7/whats-new-in-3-7.md rename to site/content/arangodb/3.13/release-notes/version-3.7/whats-new-in-3-7.md diff --git a/site/content/3.13/release-notes/version-3.8/_index.md b/site/content/arangodb/3.13/release-notes/version-3.8/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.8/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.8/_index.md diff --git a/site/content/3.13/release-notes/version-3.8/api-changes-in-3-8.md b/site/content/arangodb/3.13/release-notes/version-3.8/api-changes-in-3-8.md similarity index 100% rename from site/content/3.13/release-notes/version-3.8/api-changes-in-3-8.md rename to site/content/arangodb/3.13/release-notes/version-3.8/api-changes-in-3-8.md diff --git a/site/content/3.13/release-notes/version-3.8/incompatible-changes-in-3-8.md b/site/content/arangodb/3.13/release-notes/version-3.8/incompatible-changes-in-3-8.md similarity index 100% rename from site/content/3.13/release-notes/version-3.8/incompatible-changes-in-3-8.md rename to site/content/arangodb/3.13/release-notes/version-3.8/incompatible-changes-in-3-8.md diff --git a/site/content/3.13/release-notes/version-3.8/known-issues-in-3-8.md b/site/content/arangodb/3.13/release-notes/version-3.8/known-issues-in-3-8.md similarity index 100% rename from site/content/3.13/release-notes/version-3.8/known-issues-in-3-8.md rename to site/content/arangodb/3.13/release-notes/version-3.8/known-issues-in-3-8.md diff --git a/site/content/3.13/release-notes/version-3.8/whats-new-in-3-8.md b/site/content/arangodb/3.13/release-notes/version-3.8/whats-new-in-3-8.md similarity index 100% rename from site/content/3.13/release-notes/version-3.8/whats-new-in-3-8.md rename to site/content/arangodb/3.13/release-notes/version-3.8/whats-new-in-3-8.md diff --git a/site/content/3.13/release-notes/version-3.9/_index.md b/site/content/arangodb/3.13/release-notes/version-3.9/_index.md similarity index 100% rename from site/content/3.13/release-notes/version-3.9/_index.md rename to site/content/arangodb/3.13/release-notes/version-3.9/_index.md diff --git a/site/content/3.13/release-notes/version-3.9/api-changes-in-3-9.md b/site/content/arangodb/3.13/release-notes/version-3.9/api-changes-in-3-9.md similarity index 100% rename from site/content/3.13/release-notes/version-3.9/api-changes-in-3-9.md rename to site/content/arangodb/3.13/release-notes/version-3.9/api-changes-in-3-9.md diff --git a/site/content/3.13/release-notes/version-3.9/incompatible-changes-in-3-9.md b/site/content/arangodb/3.13/release-notes/version-3.9/incompatible-changes-in-3-9.md similarity index 100% rename from site/content/3.13/release-notes/version-3.9/incompatible-changes-in-3-9.md rename to site/content/arangodb/3.13/release-notes/version-3.9/incompatible-changes-in-3-9.md diff --git a/site/content/3.13/release-notes/version-3.9/known-issues-in-3-9.md b/site/content/arangodb/3.13/release-notes/version-3.9/known-issues-in-3-9.md similarity index 100% rename from site/content/3.13/release-notes/version-3.9/known-issues-in-3-9.md rename to site/content/arangodb/3.13/release-notes/version-3.9/known-issues-in-3-9.md diff --git a/site/content/3.13/release-notes/version-3.9/whats-new-in-3-9.md b/site/content/arangodb/3.13/release-notes/version-3.9/whats-new-in-3-9.md similarity index 100% rename from site/content/3.13/release-notes/version-3.9/whats-new-in-3-9.md rename to site/content/arangodb/3.13/release-notes/version-3.9/whats-new-in-3-9.md diff --git a/site/content/arangodb/_index.md b/site/content/arangodb/_index.md new file mode 100644 index 0000000000..a2f621e4e3 --- /dev/null +++ b/site/content/arangodb/_index.md @@ -0,0 +1,7 @@ +--- +title: Recommended Resources +menuTitle: ArangoDB +weight: 3 +layout: default +# Remove this file because this isn't an actual page? +--- \ No newline at end of file diff --git a/site/content/data-platform/_index.md b/site/content/data-platform/_index.md new file mode 100644 index 0000000000..84f9764a1f --- /dev/null +++ b/site/content/data-platform/_index.md @@ -0,0 +1,20 @@ +--- +title: Recommended Resources +menuTitle: Data Platform +weight: 1 +layout: default +--- +{{< cloudbanner >}} + +{{< cards >}} + +{{% card title="What is the ArangoDB Platform?" link="about/" %}} +The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering +of products, including GraphML and GraphRAG. +{{% /card %}} + +{{% card title="Graph Visualizer" link="graph-visualizer/" %}} +Explore your graph data with an intuitive web interface. +{{% /card %}} + +{{< /cards >}} diff --git a/site/content/platform/about-the-platform/_index.md b/site/content/data-platform/about/_index.md similarity index 97% rename from site/content/platform/about-the-platform/_index.md rename to site/content/data-platform/about/_index.md index e99e148176..a7e7925af8 100644 --- a/site/content/platform/about-the-platform/_index.md +++ b/site/content/data-platform/about/_index.md @@ -48,7 +48,7 @@ of the platform features. - **GraphRAG Retriever**: Perform semantic similarity searches or aggregate insights from graph communities with global and local queries. - **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../data-science/graphrag/services/triton-inference-server.md). + or private LLMs with [Triton Inference Server](../../gen-ai/services/triton-inference-server.md). - **MLflow integration**: Use the popular MLflow as a model registry for private LLMs or to run machine learning experiments as part of the ArangoDB Platform. - **Jupyter notebooks**: Run a Jupyter kernel in the platform for hosting @@ -65,7 +65,7 @@ of the platform features. ### Use the ArangoDB Platform as a managed service The ArangoDB Platform is not available as a managed service yet, but it will -become available for the [ArangoGraph Insights Platform](../../3.12/arangograph/_index.md) +become available for the [Arango Managed Platform (AMP)](../../amp/_index.md) in the future. Until then, you can request early access to the self-hosted ArangoDB Platform for testing. diff --git a/site/content/3.13/about-arangodb/features/platform.md b/site/content/data-platform/about/features.md similarity index 78% rename from site/content/3.13/about-arangodb/features/platform.md rename to site/content/data-platform/about/features.md index 2b833379d4..65f61afc50 100644 --- a/site/content/3.13/about-arangodb/features/platform.md +++ b/site/content/data-platform/about/features.md @@ -7,9 +7,6 @@ description: >- of ArangoDB including graph-powered machine learning and GenAI as a single solution with a unified interface --- -For in-depth information about the ArangoDB Platform as a whole and how to -deploy and use it, see [The ArangoDB Platform](../../components/platform.md). - ## Architecture - **Core Database**: The ArangoDB database system forms the solid core @@ -31,27 +28,27 @@ deploy and use it, see [The ArangoDB Platform](../../components/platform.md). ## Features -- [**ArangoDB Core**](core.md): The ArangoDB database system with support for +- [**ArangoDB Core**](../../arangodb/3.12/_index.md): The ArangoDB database system with support for graphs, documents, key-value, full-text search, and vector search. -- [**Graph Visualizer**](../../graphs/graph-visualizer.md): +- [**Graph Visualizer**](../graph-visualizer.md): A web-based tool for exploring your graph data with an intuitive interface and sophisticated querying capabilities. -- [**Graph Analytics**](../../graphs/graph-analytics.md): +- [**Graph Analytics**](../../gen-ai/graph-analytics.md): A service that can efficiently load graph data from the core database system and run graph algorithms such as PageRank and many more. -- [**GenAI Suite**](../../data-science/_index.md): +- [**GenAI Suite**](../../gen-ai/_index.md): ArangoDB's graph-powered machine learning (GraphML) as well as GraphRAG for automatically building knowledge graphs from text and taking advantage of both excerpts and higher-level summaries as context for turbocharging GenAI applications. -- [**Notebook servers**](../../data-science/notebook-servers.md): +- [**Notebook servers**](../../gen-ai/notebook-servers.md): Run Jupyter kernels in the Platform for hosting interactive, Python-based notebooks to experiment and develop applications. -- [**MLflow integration**](../../data-science/graphrag/services/mlflow.md): +- [**MLflow integration**](../../gen-ai/services/mlflow.md): Use the popular MLflow for machine learning practitioners as part of the ArangoDB Platform. diff --git a/site/content/platform/graph-intelligence/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md similarity index 95% rename from site/content/platform/graph-intelligence/graph-visualizer.md rename to site/content/data-platform/graph-visualizer.md index d7d5201e61..e3ae2c0a2d 100644 --- a/site/content/platform/graph-intelligence/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -19,12 +19,12 @@ to visually understand the structure as well as to inspect and edit the attribut of individual nodes and edges. It also offers query capabilities and you can create new nodes (vertices) and edges (relations). -![A screenshot of the Graph Visualizer user interface showing some persons and movies as circles with arrows indicting who acted in or directed a movie](../../images/graph-visualizer.png) +![A screenshot of the Graph Visualizer user interface showing some persons and movies as circles with arrows indicting who acted in or directed a movie](../images/graph-visualizer.png) {{< info >}} Graph creation is **not** performed within the Graph Visualizer. Graphs must be created in the **Management** section under **Graphs** of the second-level -navigation in the [web interface](../../3.12/components/web-interface/graphs.md). Once +navigation in the [web interface](../arangodb/3.12/components/web-interface/graphs.md). Once created, you can select a graph from the list for exploration and visualization. {{< /info >}} @@ -101,7 +101,7 @@ displayed. 7. To see the neighbor nodes and the edges that connect them, right-click a node, click **Expand (_n_)** and then **All (_n_)**. -![A screenshot of the dialog for adding nodes with two persons selected](../../images/graph-visualizer-add-nodes.png) +![A screenshot of the dialog for adding nodes with two persons selected](../images/graph-visualizer-add-nodes.png) ### Add nodes and edges using a query @@ -140,7 +140,7 @@ You can save queries for future use: - **Delete** a no longer needed query. {{< /tip >}} -![A screenshot of the dialog with a query expanded and a bind variable filled in](../../images/graph-visualizer-queries.png) +![A screenshot of the dialog with a query expanded and a bind variable filled in](../images/graph-visualizer-queries.png) ### Add nodes and edges using a query based on a selection @@ -168,7 +168,7 @@ The query has access to the current selection via special bind variables. ``` 7. Enter a name and optionally a description for the action and click **Save**. -![A screenshot of the context menu for a node showing the available Canvas Actions](../../images/graph-visualizer-menu-canvas-action.png) +![A screenshot of the context menu for a node showing the available Canvas Actions](../images/graph-visualizer-menu-canvas-action.png) ### Remove nodes from the canvas @@ -194,7 +194,7 @@ You can inspect the document attributes of node or edge as follows: - Right-click a node to open the context menu and click **View Node** to open the dialog with the properties. -![A screenshot of the properties dialog with the keys and values of a node](../../images/graph-visualizer-node-properties.png) +![A screenshot of the properties dialog with the keys and values of a node](../images/graph-visualizer-node-properties.png) ### Layouts and navigation tools @@ -251,7 +251,7 @@ dialog, the `_from` and `_to` fields are automatically pre-filled. You may need to swap the IDs as the order is not based on your selection sequence. {{< /info >}} -![A screenshot of the dialog for creating an edge with the From and To fields filled in](../../images/graph-visualizer-create-edge.png) +![A screenshot of the dialog for creating an edge with the From and To fields filled in](../images/graph-visualizer-create-edge.png) ### Edit node and edge properties @@ -296,4 +296,4 @@ labels. All styling changes are visual-only and do not affect the underlying dat - Clear the styling modifications. - See the number of nodes respectively edges on the canvas (by collection). -![A screenshot of the Customization panel with a popover dialog for edge styling open](../../images/graph-visualizer-customization.png) +![A screenshot of the Customization panel with a popover dialog for edge styling open](../images/graph-visualizer-customization.png) diff --git a/site/content/platform/release-notes.md b/site/content/data-platform/release-notes.md similarity index 85% rename from site/content/platform/release-notes.md rename to site/content/data-platform/release-notes.md index 22e37bf1ee..d5d4db5fa9 100644 --- a/site/content/platform/release-notes.md +++ b/site/content/data-platform/release-notes.md @@ -20,7 +20,7 @@ of the core ArangoDB database system along with graph-powered machine learning and GenAI capabilities as a single solution with a unified interface. Deploy the Platform on-premise or in the cloud on top of Kubernetes. -To get started, see [Self-host the ArangoDB Platform](about-the-platform/_index.md#self-host-the-arangodb-platform). +To get started, see [Self-host the ArangoDB Platform](about/_index.md#self-host-the-arangodb-platform). ### GenAI Suite @@ -35,5 +35,5 @@ user-friendly interface seamlessly integrated into the ArangoDB Platform web int - MLflow integration - Graph Visualizer -To learn more, see the [GenAI Suite](data-science/_index.md#genai-suite) +To learn more, see the [GenAI Suite](../gen-ai/_index.md) documentation. diff --git a/site/content/ecosystem/_index.md b/site/content/ecosystem/_index.md new file mode 100644 index 0000000000..578a53e1c4 --- /dev/null +++ b/site/content/ecosystem/_index.md @@ -0,0 +1,6 @@ +--- +title: Recommended Resources +menuTitle: Ecosystem +weight: 5 +layout: default +--- \ No newline at end of file diff --git a/site/content/3.13/data-science/integrations/_index.md b/site/content/ecosystem/adapters/_index.md similarity index 100% rename from site/content/3.13/data-science/integrations/_index.md rename to site/content/ecosystem/adapters/_index.md diff --git a/site/content/3.13/data-science/integrations/arangodb-cugraph-adapter.md b/site/content/ecosystem/adapters/arangodb-cugraph-adapter.md similarity index 100% rename from site/content/3.13/data-science/integrations/arangodb-cugraph-adapter.md rename to site/content/ecosystem/adapters/arangodb-cugraph-adapter.md diff --git a/site/content/3.13/data-science/integrations/arangodb-dgl-adapter.md b/site/content/ecosystem/adapters/arangodb-dgl-adapter.md similarity index 100% rename from site/content/3.13/data-science/integrations/arangodb-dgl-adapter.md rename to site/content/ecosystem/adapters/arangodb-dgl-adapter.md diff --git a/site/content/3.13/data-science/integrations/arangodb-networkx-adapter.md b/site/content/ecosystem/adapters/arangodb-networkx-adapter.md similarity index 100% rename from site/content/3.13/data-science/integrations/arangodb-networkx-adapter.md rename to site/content/ecosystem/adapters/arangodb-networkx-adapter.md diff --git a/site/content/3.13/data-science/integrations/arangodb-pyg-adapter.md b/site/content/ecosystem/adapters/arangodb-pyg-adapter.md similarity index 100% rename from site/content/3.13/data-science/integrations/arangodb-pyg-adapter.md rename to site/content/ecosystem/adapters/arangodb-pyg-adapter.md diff --git a/site/content/3.13/data-science/integrations/arangodb-rdf-adapter.md b/site/content/ecosystem/adapters/arangodb-rdf-adapter.md similarity index 100% rename from site/content/3.13/data-science/integrations/arangodb-rdf-adapter.md rename to site/content/ecosystem/adapters/arangodb-rdf-adapter.md diff --git a/site/content/3.13/data-science/integrations/langchain.md b/site/content/ecosystem/adapters/langchain.md similarity index 100% rename from site/content/3.13/data-science/integrations/langchain.md rename to site/content/ecosystem/adapters/langchain.md diff --git a/site/content/gen-ai/_index.md b/site/content/gen-ai/_index.md new file mode 100644 index 0000000000..caa176ae72 --- /dev/null +++ b/site/content/gen-ai/_index.md @@ -0,0 +1,24 @@ +--- +title: Recommended Resources +menuTitle: 'GenAI Data Platform' +weight: 2 +layout: default +--- +{{< cloudbanner >}} + +{{< cards >}} + +{{% card title="GraphRAG" link="graphrag/" %}} +Arango's GenAI solution for generating knowledge graphs from documents +and chatting with your data. +{{% /card %}} + +{{% card title="GraphML" link="graphml/" %}} +Discover Arango's graph-powered machine learning features. +{{% /card %}} + +{{% card title="Graph Analytics" link="graph-analytics/" %}} +Run algorithms such as PageRank on your graph data. +{{% /card %}} + +{{< /cards >}} diff --git a/site/content/3.13/graphs/graph-analytics.md b/site/content/gen-ai/graph-analytics.md similarity index 96% rename from site/content/3.13/graphs/graph-analytics.md rename to site/content/gen-ai/graph-analytics.md index a3aa6b5f6d..3edcca4dd5 100644 --- a/site/content/3.13/graphs/graph-analytics.md +++ b/site/content/gen-ai/graph-analytics.md @@ -1,7 +1,7 @@ --- title: Graph Analytics menuTitle: Graph Analytics -weight: 115 +weight: 15 description: | ArangoGraph offers Graph Analytics Engines to run graph algorithms on your data separately from your ArangoDB deployments @@ -18,8 +18,8 @@ and network flow analysis. ArangoDB offers a feature for running algorithms on your graph data, called Graph Analytics Engines (GAEs). It is available on request for the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) -and included in the [ArangoDB Platform](../components/platform.md). +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +and included in the [ArangoDB Platform](../data-platform/about/_index.md). Key features: @@ -59,7 +59,7 @@ How to perform the steps is detailed in the subsequent sections. 6. [Stop the engine service](#stop-a-graphanalytics-service) once you are done. {{< /tab >}} -{{< tab "ArangoGraph Insights Platform" >}} +{{< tab "Arango Managed Platform (AMP)" >}} {{< info >}} Before you can use Graph Analytics Engines, you need to request the feature via __Request help__ in the ArangoGraph dashboard for a deployment. @@ -103,25 +103,25 @@ well as to authenticate requests to the [Engine API](#engine-api). --> {{< /tab >}} -{{< tab "ArangoGraph Insights Platform" >}} +{{< tab "Arango Managed Platform (AMP)" >}} The [Management API](#management-api) for deploying and deleting engines requires an ArangoGraph **API key**. See -[Generating an API Key](../arangograph/api/get-started.md#generating-an-api-key) +[Generating an API Key](../amp/api/get-started.md#generating-an-api-key) on how to create one. You then need to generate an **access token** using the API key. See -[Authenticating with Oasisctl](../arangograph/api/get-started.md#authenticating-with-oasisctl) +[Authenticating with Oasisctl](../amp/api/get-started.md#authenticating-with-oasisctl) on how to do so using `oasisctl login`. The [Engine API](#engine-api) uses one of two authentication methods, depending -on the [__auto login to database UI__](../arangograph/deployments/_index.md#auto-login-to-database-ui) +on the [__auto login to database UI__](../amp/deployments/_index.md#auto-login-to-database-ui) setting in ArangoGraph: - **Enabled**: You can use an ArangoGraph access token created with an API key (see above), allowing you to use one token for both the Management API and the Engine API. - **Disabled**: You need use a JWT user token created from ArangoDB credentials. These session tokens need to be renewed every hour by default. See - [HTTP API Authentication](../develop/http-api/authentication.md#jwt-user-tokens) + [HTTP API Authentication](../arangodb/3.12/develop/http-api/authentication.md#jwt-user-tokens) for details. {{< /tab >}} @@ -138,7 +138,7 @@ The interface for managing the engines depends on the environment you use: {{< tag "ArangoDB Platform" >}} -GAEs are deployed and deleted via the [GenAI service](../data-science/graphrag/services/gen-ai.md) +GAEs are deployed and deleted via the [GenAI service](services/gen-ai.md) in the ArangoDB Platform. If you use cURL, you need to use the `-k` / `--insecure` option for requests @@ -188,7 +188,7 @@ curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X DELETE https://127.0.0.1:8529 {{< tag "ArangoGraph" >}} GAEs are deployed and deleted with the Management API for graph analytics on the -ArangoGraph Insights Platform. You can also list the available engine sizes and +Arango Managed Platform (AMP). You can also list the available engine sizes and get information about deployed engines. To determine the base URL of the management API, use the ArangoGraph dashboard @@ -350,7 +350,7 @@ curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs" ``` {{< /tab >}} -{{< tab "ArangoGraph Insights Platform" >}} +{{< tab "Arango Managed Platform (AMP)" >}} To determine the base URL of the engine API, use the ArangoGraph dashboard and copy the __APPLICATION ENDPOINT__ of the deployment that holds the graph data you want to analyze. Replace the port with `8829` and append @@ -405,7 +405,7 @@ Request and response payloads are JSON-encoded in the engine API. Import graph data from a database of the ArangoDB deployment. You can import named graphs as well as sets of node and edge collections (see -[Managed and unmanaged graphs](../graphs/_index.md#managed-and-unmanaged-graphs)). +[Managed and unmanaged graphs](../arangodb/3.12/graphs/_index.md#managed-and-unmanaged-graphs)). ```bash curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d '{"database":"_system","graph_name":"connectedComponentsGraph"}' "$ENGINE_URL/v1/loaddata" @@ -543,7 +543,7 @@ It is probably impossible to discover an efficient algorithm which computes them in a distributed way. Fortunately there are scalable substitutions available, which should be equally usable for most use cases. -![Illustration of an execution of different centrality measures (Freeman 1977)](../../images/centrality_visual.png) +![Illustration of an execution of different centrality measures (Freeman 1977)](../images/centrality_visual.png) ##### Betweenness Centrality @@ -577,7 +577,7 @@ A common definitions of centrality is the **closeness centrality** length of the shortest path between the node and all other nodes. For nodes *x*, *y* and shortest distance `d(y, x)` it is defined as: -![Vertex Closeness Formula](../../images/closeness.png) +![Vertex Closeness Formula](../images/closeness.png) Effective Closeness approximates the closeness measure. The algorithm works by iteratively estimating the number of shortest paths passing through each node. @@ -613,7 +613,7 @@ Another common measure is the [*betweenness* centrality](https://en.wikipedia.or It measures the number of times a node is part of shortest paths between any pairs of nodes. For a node *v* betweenness is defined as: -![Vertex Betweenness Formula](../../images/betweenness.png) +![Vertex Betweenness Formula](../images/betweenness.png) Where the σ represents the number of shortest paths between *x* and *y*, and σ(v) represents the number of paths also passing through a node *v*. diff --git a/site/content/3.13/data-science/_index.md b/site/content/gen-ai/graph-to-ai.md similarity index 86% rename from site/content/3.13/data-science/_index.md rename to site/content/gen-ai/graph-to-ai.md index 94ba664523..b262997bb2 100644 --- a/site/content/3.13/data-science/_index.md +++ b/site/content/gen-ai/graph-to-ai.md @@ -1,13 +1,15 @@ --- title: Generative Artificial Intelligence (GenAI) and Data Science menuTitle: GenAI & Data Science -weight: 115 +weight: 25 description: >- ArangoDB's set of tools and technologies enables analytics, machine learning, and GenAI applications powered by graph data aliases: - data-science/overview --- +- [Link to 3.12](../arangodb/3.12/aql/_index.md) + {{< tag "ArangoDB Platform" >}} {{< tip >}} @@ -48,16 +50,16 @@ ArangoDB Platform web interface, guiding you through the process. Alongside these components, you also get the following additional features: -- [**Graph Visualizer**](../graphs/graph-visualizer.md): A web-based tool for exploring your graph data with an +- [**Graph Visualizer**](../data-platform/graph-visualizer.md): A web-based tool for exploring your graph data with an intuitive interface and sophisticated querying capabilities. - [**Jupyter notebooks**](notebook-servers.md): Run a Jupyter kernel in the platform for hosting interactive notebooks for experimentation and development of applications that use ArangoDB as their backend. - **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../data-science/graphrag/services/triton-inference-server.md). -- [**MLflow integration**](graphrag/services/mlflow.md): Use the popular MLflow as a model registry for private LLMs + or private LLMs with [Triton Inference Server](services/triton-inference-server.md). +- [**MLflow integration**](services/mlflow.md): Use the popular MLflow as a model registry for private LLMs or to run machine learning experiments as part of the ArangoDB Platform. -- [**Integrations**](integrations/_index.md): Use ArangoDB together with cuGraph, NetworkX, +- [**Adapters**](../ecosystem/adapters/_index.md): Use ArangoDB together with cuGraph, NetworkX, and other data science tools. - **Application Programming Interfaces**: Use the underlying APIs of the GenAI Suite services and build your own integrations. See the @@ -69,7 +71,7 @@ Alongside these components, you also get the following additional features: The ArangoDB Platform includes the following features independent of the GenAI Suite: -- [**Graph Analytics**](../graphs/graph-analytics.md): Run graph algorithms such as PageRank +- [**Graph Analytics**](graph-analytics.md): Run graph algorithms such as PageRank on dedicated compute resources. ## From graph to AI @@ -90,9 +92,9 @@ Graph queries can also determine the shortest paths between nodes. Graph queries can answer questions like _**Who can introduce me to person X**_? -![Graph Query](../../images/graph-query.png) +![Graph Query](../images/graph-query.png) -See [Graphs in AQL](../aql/graphs/_index.md) for the supported graph queries. +See [Graphs in AQL](../arangodb/3.12/aql/graphs/_index.md) for the supported graph queries. ### Graph Analytics @@ -101,12 +103,12 @@ know aggregate information about your graph, while analyzing the entire graph. Graph analytics can answer questions like _**Who are the most connected persons**_? -![Graph Analytics](../../images/graph-analytics.png) +![Graph Analytics](../images/graph-analytics.png) ArangoDB offers _Graph Analytics Engines_ to run algorithms such as connected components, label propagation, and PageRank on your data. This feature -is available for the ArangoGraph Insights Platform. See -[Graph Analytics](../graphs/graph-analytics.md) for details. +is available for the Arango Managed Platform (AMP). See +[Graph Analytics](graph-analytics.md) for details. ### GraphML @@ -118,7 +120,7 @@ GraphML can answer questions like: - _**Will a customer churn?**_ - _**Is this particular transaction Anomalous?**_ -![Graph ML](../../images/graph-ml.png) +![Graph ML](../images/graph-ml.png) For ArangoDB's enterprise-ready, graph-powered machine learning offering, see [ArangoGraphML](graphml/_index.md). @@ -168,5 +170,5 @@ the following tasks: ## Sample datasets If you want to try out ArangoDB's data science features, you may use the -[`arango-datasets` Python package](../components/tools/arango-datasets.md) +[`arango-datasets` Python package](../arangodb/3.12/components/tools/arango-datasets.md) to load sample datasets into a deployment. diff --git a/site/content/3.13/data-science/graphml/_index.md b/site/content/gen-ai/graphml/_index.md similarity index 98% rename from site/content/3.13/data-science/graphml/_index.md rename to site/content/gen-ai/graphml/_index.md index 553f7d81cf..241db624b9 100644 --- a/site/content/3.13/data-science/graphml/_index.md +++ b/site/content/gen-ai/graphml/_index.md @@ -1,7 +1,7 @@ --- title: ArangoDB GraphML menuTitle: GraphML -weight: 15 +weight: 10 description: >- Boost your machine learning models with graph data using ArangoDB's advanced GraphML capabilities aliases: @@ -60,9 +60,9 @@ ArangoDB streamlines these steps, providing an intuitive and scalable framework to integrate GraphML into various applications, from fraud detection to recommendation systems. -![GraphML Embeddings](../../../images/GraphML-Embeddings.webp) +![GraphML Embeddings](../../images/GraphML-Embeddings.webp) -![GraphML Workflow](../../../images/GraphML-How-it-works.webp) +![GraphML Workflow](../../images/GraphML-How-it-works.webp) You no longer need to understand the complexities of graph machine learning to benefit from it. Solutions with ArangoDB's GraphML only require input from a user about diff --git a/site/content/3.13/data-science/graphml/notebooks-api.md b/site/content/gen-ai/graphml/notebooks-api.md similarity index 99% rename from site/content/3.13/data-science/graphml/notebooks-api.md rename to site/content/gen-ai/graphml/notebooks-api.md index 8c97e2448b..008d079d97 100644 --- a/site/content/3.13/data-science/graphml/notebooks-api.md +++ b/site/content/gen-ai/graphml/notebooks-api.md @@ -75,14 +75,14 @@ Knowledge Graph constructed from the [GDELT Project](https://www.gdeltproject.or The events used range from peaceful protests to significant battles in Angola. The image below depicts the connections around an example event: -![Example Event](../../../images/ArangoML_open_intelligence_sample.png) +![Example Event](../../images/ArangoML_open_intelligence_sample.png) You can also see a larger portion of this graph, showing how the events, actors, news sources, and locations are interconnected into a large graph. -![Example Event](../../../images/ArangoML_open_intelligence_visualization.png) +![Example Event](../../images/ArangoML_open_intelligence_visualization.png) -The [`arango-datasets`](../../components/tools/arango-datasets.md) Python package +The [`arango-datasets`](../../arangodb/3.12/components/tools/arango-datasets.md) Python package allows you to load pre-defined datasets into ArangoDB Platform. It comes pre-installed in the GraphML notebook environment. diff --git a/site/content/3.13/data-science/graphml/quickstart.md b/site/content/gen-ai/graphml/quickstart.md similarity index 88% rename from site/content/3.13/data-science/graphml/quickstart.md rename to site/content/gen-ai/graphml/quickstart.md index 6b06acf25a..4473aafe0f 100644 --- a/site/content/3.13/data-science/graphml/quickstart.md +++ b/site/content/gen-ai/graphml/quickstart.md @@ -29,7 +29,7 @@ run a full machine learning workflow for GraphML. To get started, see the {{< tab "Notebooks" >}} The ArangoDB Notebooks service runs on the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). It offers a pre-configured environment where everything, including necessary components and configurations, comes preloaded. You don't need to set up or configure the infrastructure, and can immediately start using the @@ -37,7 +37,7 @@ GraphML functionalities in a scriptable manner. To get started, see the [GraphML Notebooks & API](notebooks-api.md) reference documentation. {{< tip >}} -To get access to GraphML services and packages in ArangoGraph Insights Platform, +To get access to GraphML services and packages in Arango Managed Platform (AMP), [get in touch](https://www.arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -52,7 +52,7 @@ with the ArangoDB team. - Metadata capture - Model management -![ArangoGraphML Pipeline](../../../images/ArangoGraphML_Pipeline.png) +![ArangoGraphML Pipeline](../../images/ArangoGraphML_Pipeline.png) {{< /tab >}} {{< /tabs >}} \ No newline at end of file diff --git a/site/content/3.13/data-science/graphml/ui.md b/site/content/gen-ai/graphml/ui.md similarity index 96% rename from site/content/3.13/data-science/graphml/ui.md rename to site/content/gen-ai/graphml/ui.md index f83ccffee1..83e736120c 100644 --- a/site/content/3.13/data-science/graphml/ui.md +++ b/site/content/gen-ai/graphml/ui.md @@ -25,7 +25,7 @@ To create a new GraphML project using the ArangoDB Platform web interface, follo 1. From the left-hand sidebar, select the database where you want to create the project. 2. In the left-hand sidebar, click **GenAI Suite** to open the GraphML project management interface, then click **Run GraphML**. - ![Create GraphML Project](../../../images/create-graphml-project-ui.png) + ![Create GraphML Project](../../images/create-graphml-project-ui.png) 3. In the **GraphML projects** view, click **Add new project**. 4. The **Create ML project** modal opens. Enter a **Name** for your machine learning project. 5. Click the **Create project** button to finalize the creation. @@ -88,7 +88,7 @@ Once you’ve set your strategies, click **Begin featurization** to start the no embedding-compatible featurization job. When the job status updates to **Ready for training**, proceed to the **Training** step. -![Navigate to Featurization](../../../images/graph-ml-ui-featurization.png) +![Navigate to Featurization](../../images/graph-ml-ui-featurization.png) ## Training phase @@ -117,7 +117,7 @@ features and structural connections within the graph. After setting these values, click the **Begin training** button to start the job. -![Node Classification](../../../images/ml-nodeclassification.png) +![Node Classification](../../images/ml-nodeclassification.png) #### Node embeddings @@ -137,7 +137,7 @@ The target collection is where the model's predictions are stored when running a Once the configuration is complete, click **Begin training** to start the embedding job. -![Node Embeddings](../../../images/ml-node-embedding.png) +![Node Embeddings](../../images/ml-node-embedding.png) ## Model selection phase @@ -149,12 +149,12 @@ A list of trained models is displayed, along with performance metrics (**Accuracy**, **Precision**, **Recall**, **F1 score**, **Loss**). Review the results of different model runs and configurations. -![GraphML Model Selection](../../../images/graph-ml-model.png) +![GraphML Model Selection](../../images/graph-ml-model.png) Select the best performing model suitable for your prediction task. You can also open the **Confusion Matrix** to compare predicted values versus actual values. -![GraphML Confusion Matrix](../../../images/graphml-ui-confusion-matrix.png) +![GraphML Confusion Matrix](../../images/graphml-ui-confusion-matrix.png) ## Prediction phase @@ -189,7 +189,7 @@ predictions relevant without repeating the entire ML workflow. the prediction workload (e.g. `10`). - **Prediction field**: The field in the documents where the predicted values are stored. -![GraphML prediction phase](../../../images/graph-prediction.png) +![GraphML prediction phase](../../images/graph-prediction.png) ### Configuration options diff --git a/site/content/platform/data-science/graphrag/_index.md b/site/content/gen-ai/graphrag/_index.md similarity index 97% rename from site/content/platform/data-science/graphrag/_index.md rename to site/content/gen-ai/graphrag/_index.md index a58b76c7e3..9bde91a90d 100644 --- a/site/content/platform/data-science/graphrag/_index.md +++ b/site/content/gen-ai/graphrag/_index.md @@ -1,7 +1,7 @@ --- title: GraphRAG menuTitle: GraphRAG -weight: 10 +weight: 5 description: >- ArangoDB's GraphRAG solution combines graph-based retrieval-augmented generation with Large Language Models (LLMs) for turbocharged GenAI solutions @@ -78,7 +78,7 @@ information in a structured graph format, allowing efficient querying and retrie 3. Store the generated Knowledge Graph in the database for retrieval and reasoning. For detailed information about the service, see the -[Importer](services/importer.md) service documentation. +[Importer](../services/importer.md) service documentation. ### Extract information from the Knowledge Graph @@ -89,7 +89,7 @@ You can extract information from Knowledge Graphs using two distinct methods: - Local retrieval For detailed information about the service, see the -[Retriever](services/retriever.md) service documentation. +[Retriever](../services/retriever.md) service documentation. #### Global retrieval @@ -136,7 +136,7 @@ collection, and then it expands that subgraph over related entities, relations If you're working in an air-gapped environment or need to keep your data private, you can use the private LLM mode with -[Triton Inference Server](services/triton-inference-server.md). +[Triton Inference Server](../services/triton-inference-server.md). This option allows you to run the service completely within your own infrastructure. The Triton Inference Server is a crucial component when diff --git a/site/content/3.13/data-science/graphrag/tutorial-notebook.md b/site/content/gen-ai/graphrag/tutorial-notebook.md similarity index 99% rename from site/content/3.13/data-science/graphrag/tutorial-notebook.md rename to site/content/gen-ai/graphrag/tutorial-notebook.md index ee3b6183e0..45a743d761 100644 --- a/site/content/3.13/data-science/graphrag/tutorial-notebook.md +++ b/site/content/gen-ai/graphrag/tutorial-notebook.md @@ -200,7 +200,7 @@ pprint(importerResponse) ### Visualize and interact with the Knowledge Graph Once the importer service has processed the document, you can visualize and -interact with the generated Knowledge Graph using the [Graph Visualizer](../../graphs/graph-visualizer.md) +interact with the generated Knowledge Graph using the [Graph Visualizer](../../data-platform/graph-visualizer.md) directly from the ArangoDB Platform web interface. 1. In the ArangoDB Platform web interface, select the database you have previously used. diff --git a/site/content/3.13/data-science/graphrag/web-interface.md b/site/content/gen-ai/graphrag/web-interface.md similarity index 80% rename from site/content/3.13/data-science/graphrag/web-interface.md rename to site/content/gen-ai/graphrag/web-interface.md index 195659839a..b7559e0149 100644 --- a/site/content/3.13/data-science/graphrag/web-interface.md +++ b/site/content/gen-ai/graphrag/web-interface.md @@ -52,7 +52,7 @@ configure and start a new importer service job. Follow the steps below. 3. Enter your **OpenAI API Key**. 4. Click the **Start importer service** button. -![Configure Importer service using OpenAI](../../../images/graphrag-ui-configure-importer-openai.png) +![Configure Importer service using OpenAI](../../images/graphrag-ui-configure-importer-openai.png) {{< /tab >}} {{< tab "OpenRouter" >}} @@ -68,7 +68,7 @@ When using the OpenRouter option, the LLM responses are served via OpenRouter while OpenAI is used for the embedding model. {{< /info >}} -![Configure Importer service using OpenRouter](../../../images/graphrag-ui-configure-importer-openrouter.png) +![Configure Importer service using OpenRouter](../../images/graphrag-ui-configure-importer-openrouter.png) {{< /tab >}} {{< tab "Triton LLM Host" >}} @@ -77,16 +77,16 @@ while OpenAI is used for the embedding model. 3. Click the **Start importer service** button. {{< info >}} -Note that you must first register your model in MLflow. The [Triton LLM Host](services/triton-inference-server.md) +Note that you must first register your model in MLflow. The [Triton LLM Host](../services/triton-inference-server.md) service automatically downloads and loads models from the MLflow registry. {{< /info >}} -![Configure Importer service using Triton](../../../images/graphrag-ui-configure-importer-triton.png) +![Configure Importer service using Triton](../../images/graphrag-ui-configure-importer-triton.png) {{< /tab >}} {{< /tabs >}} -See also the [GraphRAG Importer](services/importer.md) service documentation. +See also the [GraphRAG Importer](../services/importer.md) service documentation. ## Upload your file @@ -100,14 +100,14 @@ See also the [GraphRAG Importer](services/importer.md) service documentation. You can only import a single file, either in `.md` or `.txt` format. {{< /info >}} -![Upload file in GraphRAG web interface](../../../images/graphrag-ui-upload-file.png) +![Upload file in GraphRAG web interface](../../images/graphrag-ui-upload-file.png) ## Explore the Knowledge Graph You can open and explore the Knowledge Graph that has been generated by clicking on the **Explore in visualizer** button. -For more information, see the [Graph Visualizer](../../graphs/graph-visualizer.md) documentation. +For more information, see the [Graph Visualizer](../../data-platform/graph-visualizer.md) documentation. ## Configure the Retriever service @@ -123,7 +123,7 @@ the generated Knowledge Graph. Follow the steps below to configure the service. 3. Enter your **OpenAI API Key**. 4. Click the **Start retriever service** button. -![Configure Retriever Service using OpenAI](../../../images/graphrag-ui-configure-retriever-openai.png) +![Configure Retriever Service using OpenAI](../../images/graphrag-ui-configure-retriever-openai.png) {{< /tab >}} {{< tab "OpenRouter" >}} @@ -138,7 +138,7 @@ When using the OpenRouter option, the LLM responses are served via OpenRouter while OpenAI is used for the embedding model. {{< /info >}} -![Configure Retriever Service using OpenRouter](../../../images/graphrag-ui-configure-retriever-openrouter.png) +![Configure Retriever Service using OpenRouter](../../images/graphrag-ui-configure-retriever-openrouter.png) {{< /tab >}} {{< tab "Triton LLM Host" >}} @@ -147,26 +147,26 @@ while OpenAI is used for the embedding model. 3. Click the **Start retriever service** button. {{< info >}} -Note that you must first register your model in MLflow. The [Triton LLM Host](services/triton-inference-server.md) +Note that you must first register your model in MLflow. The [Triton LLM Host](../services/triton-inference-server.md) service automatically downloads and loads models from the MLflow registry. {{< /info >}} -![Configure Retriever Service using Triton](../../../images/graphrag-ui-configure-retriever-triton.png) +![Configure Retriever Service using Triton](../../images/graphrag-ui-configure-retriever-triton.png) {{< /tab >}} {{< /tabs >}} -See also the [GraphRAG Retriever](services/retriever.md) documentation. +See also the [GraphRAG Retriever](../services/retriever.md) documentation. ## Chat with your Knowledge Graph The Retriever service provides two search methods: -- [Local search](services/retriever.md#local-search): Local queries let you +- [Local search](../services/retriever.md#local-search): Local queries let you explore specific nodes and their direct connections. -- [Global search](services/retriever.md#global-search): Global queries uncover +- [Global search](../services/retriever.md#global-search): Global queries uncover broader patters and relationships across the entire Knowledge Graph. -![Chat with your Knowledge Graph](../../../images/graphrag-ui-chat.png) +![Chat with your Knowledge Graph](../../images/graphrag-ui-chat.png) In addition to querying the Knowledge Graph, the chat service allows you to do the following: - Switch the search method from **Local Query** to **Global Query** and vice-versa diff --git a/site/content/3.13/data-science/notebook-servers.md b/site/content/gen-ai/notebook-servers.md similarity index 93% rename from site/content/3.13/data-science/notebook-servers.md rename to site/content/gen-ai/notebook-servers.md index e84a9ebbb7..bddbee6cb7 100644 --- a/site/content/3.13/data-science/notebook-servers.md +++ b/site/content/gen-ai/notebook-servers.md @@ -1,7 +1,7 @@ --- title: Notebook Servers menuTitle: Notebook Servers -weight: 130 +weight: 20 description: >- Colocated Jupyter Notebooks within the ArangoDB Platform aliases: @@ -30,12 +30,12 @@ The notebooks are primarily focused on the following solutions: natural language interface. - [GraphML](graphml/_index.md): Apply machine learning to graphs for link prediction, classification, and similar tasks. -- [Integrations](integrations/_index.md): Use ArangoDB together with cuGraph, +- [Adapters](../ecosystem/adapters/_index.md): Use ArangoDB together with cuGraph, NetworkX, and other data science tools. The ArangoDB Notebooks include the following: - Automatically connect to ArangoDB databases and GenAI platform services -- [Magic commands](../arangograph/notebooks.md#arangograph-magic-commands) +- [Magic commands](../amp/notebooks.md#arangograph-magic-commands) that simplify database interactions - Example notebooks for learning diff --git a/site/content/3.13/data-science/graphrag/services/_index.md b/site/content/gen-ai/services/_index.md similarity index 64% rename from site/content/3.13/data-science/graphrag/services/_index.md rename to site/content/gen-ai/services/_index.md index 38393bc8aa..8df04c2c84 100644 --- a/site/content/3.13/data-science/graphrag/services/_index.md +++ b/site/content/gen-ai/services/_index.md @@ -1,5 +1,5 @@ --- -title: GraphRAG services +title: GenAI services menuTitle: Services description: '' --- diff --git a/site/content/3.13/data-science/graphrag/services/gen-ai.md b/site/content/gen-ai/services/gen-ai.md similarity index 98% rename from site/content/3.13/data-science/graphrag/services/gen-ai.md rename to site/content/gen-ai/services/gen-ai.md index 280dfd2511..03504ec499 100644 --- a/site/content/3.13/data-science/graphrag/services/gen-ai.md +++ b/site/content/gen-ai/services/gen-ai.md @@ -98,7 +98,7 @@ curl -X POST https://<ExternalEndpoint>:8529/_open/auth \ This returns a JWT token that you can use as your Bearer token. For more details about ArangoDB authentication and JWT tokens, see -the [ArangoDB Authentication](../../../develop/http-api/authentication/#jwt-user-tokens) +the [ArangoDB Authentication](../../arangodb/3.12/develop/http-api/authentication.md#jwt-user-tokens) documentation. ## Complete Service lifecycle example diff --git a/site/content/3.13/data-science/graphrag/services/importer.md b/site/content/gen-ai/services/importer.md similarity index 99% rename from site/content/3.13/data-science/graphrag/services/importer.md rename to site/content/gen-ai/services/importer.md index 6a9558767e..afb60fe036 100644 --- a/site/content/3.13/data-science/graphrag/services/importer.md +++ b/site/content/gen-ai/services/importer.md @@ -27,7 +27,7 @@ ArangoDB database, where you can query and analyze the relationships between different concepts in your document with the Retriever service. {{< tip >}} -You can also use the GraphRAG Importer service via the ArangoDB [web interface](../web-interface.md). +You can also use the GraphRAG Importer service via the [Data Platform web interface](../graphrag/web-interface.md). {{< /tip >}} ## Creating a new project diff --git a/site/content/3.13/data-science/graphrag/services/mlflow.md b/site/content/gen-ai/services/mlflow.md similarity index 98% rename from site/content/3.13/data-science/graphrag/services/mlflow.md rename to site/content/gen-ai/services/mlflow.md index 827c5170c2..e3efccc32a 100644 --- a/site/content/3.13/data-science/graphrag/services/mlflow.md +++ b/site/content/gen-ai/services/mlflow.md @@ -93,7 +93,7 @@ curl -X POST https://<ExternalEndpoint>:8529/_open/auth \ This returns a JWT token that you can use as your Bearer token. For more details about ArangoDB authentication and JWT tokens, see the -[ArangoDB Authentication](../../../develop/http-api/authentication.md#jwt-user-tokens) +[ArangoDB Authentication](../../arangodb/3.12/develop/http-api/authentication.md#jwt-user-tokens) documentation. ## Installation diff --git a/site/content/3.13/data-science/graphrag/services/natural-language-to-aql.md b/site/content/gen-ai/services/natural-language-to-aql.md similarity index 100% rename from site/content/3.13/data-science/graphrag/services/natural-language-to-aql.md rename to site/content/gen-ai/services/natural-language-to-aql.md diff --git a/site/content/3.13/data-science/graphrag/services/retriever.md b/site/content/gen-ai/services/retriever.md similarity index 99% rename from site/content/3.13/data-science/graphrag/services/retriever.md rename to site/content/gen-ai/services/retriever.md index 0683d5beaa..447def28df 100644 --- a/site/content/3.13/data-science/graphrag/services/retriever.md +++ b/site/content/gen-ai/services/retriever.md @@ -36,7 +36,7 @@ graph and get contextually relevant responses. - Configurable community hierarchy levels {{< tip >}} -You can also use the GraphRAG Retriever service via the ArangoDB [web interface](../web-interface.md). +You can also use the GraphRAG Retriever service via the ArangoDB [web interface](../graphrag/web-interface.md). {{< /tip >}} ## Search methods diff --git a/site/content/3.13/data-science/graphrag/services/triton-inference-server.md b/site/content/gen-ai/services/triton-inference-server.md similarity index 100% rename from site/content/3.13/data-science/graphrag/services/triton-inference-server.md rename to site/content/gen-ai/services/triton-inference-server.md diff --git a/site/content/platform/_index.md b/site/content/platform/_index.md deleted file mode 100644 index a70a2b36e7..0000000000 --- a/site/content/platform/_index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Recommended Resources -menuTitle: 'Platform' -weight: 0 -layout: default ---- -{{< cloudbanner >}} - -{{< cards >}} - -{{% card title="What is the ArangoDB Platform?" link="about-the-platform/" %}} -The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering -of products, including GraphML and GraphRAG. -{{% /card %}} - -{{% card title="Graph Intelligence" link="graph-intelligence/" %}} -Analyze and visualize your data with the Graph Analytics and Graph Visualizer features. -{{% /card %}} - -{{% card title="GenAI & Data Science" link="data-science/" %}} -Discover the graph-powered machine learning and GraphRAG features of ArangoDB. -{{% /card %}} - -{{< /cards >}} diff --git a/site/content/platform/data-science/_index.md b/site/content/platform/data-science/_index.md deleted file mode 100644 index 485687e4d7..0000000000 --- a/site/content/platform/data-science/_index.md +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: Generative Artificial Intelligence (GenAI) and Data Science -menuTitle: GenAI & Data Science -weight: 15 -description: >- - ArangoDB's set of tools and technologies enables analytics, machine learning, - and GenAI applications powered by graph data -aliases: - - data-science/overview ---- -- [Link to 3.12](../../3.12/aql/_index.md) - -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -ArangoDB provides a wide range of functionality that can be utilized for -data science applications. The core database system includes multi-model storage -of information with scalable graph and information retrieval capabilities that -you can directly use for your research and product development. - -ArangoDB also offers a dedicated GenAI Suite, using the database core -as the foundation for higher-level features. Whether you want to turbocharge -generative AI applications with a GraphRAG solution or apply analytics and -machine learning to graph data at scale, ArangoDB covers these needs. - -<!-- -ArangoDB's Graph Analytics and GraphML capabilities provide various solutions -in data science and data analytics. Multiple data science personas within the -engineering space can make use of ArangoDB's set of tools and technologies that -enable analytics and machine learning on graph data. ---> - -## GenAI Suite - -The GenAI Suite is comprised of two major components: - -- [**GraphRAG**](#graphrag): A complete solution for extracting entities - from text files to create a knowledge graph that you can then query with a - natural language interface. -- [**GraphML**](#graphml): Apply machine learning to graphs for link prediction, - classification, and similar tasks. - -Each component has an intuitive graphical user interface integrated into the -ArangoDB Platform web interface, guiding you through the process. - -Alongside these components, you also get the following additional features: - -- [**Graph Visualizer**](../graph-intelligence/graph-visualizer.md): A web-based tool for exploring your graph data with an - intuitive interface and sophisticated querying capabilities. -- [**Jupyter notebooks**](notebook-servers.md): Run a Jupyter kernel in the platform for hosting - interactive notebooks for experimentation and development of applications - that use ArangoDB as their backend. -- **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](graphrag/services/triton-inference-server.md). -- [**MLflow integration**](graphrag/services/mlflow.md): Use the popular MLflow as a model registry for private LLMs - or to run machine learning experiments as part of the ArangoDB Platform. -- [**Integrations**](integrations/_index.md): Use ArangoDB together with cuGraph, NetworkX, - and other data science tools. -- **Application Programming Interfaces**: Use the underlying APIs of the - GenAI Suite services and build your own integrations. See the - [API reference](https://arangoml.github.io/platform-dss-api/GenAI-Service/proto/index.html) documentation - for more details. - -## Other tools and features - -The ArangoDB Platform includes the following features independent of the -GenAI Suite: - -- [**Graph Analytics**](../graph-intelligence/graph-analytics.md): Run graph algorithms such as PageRank - on dedicated compute resources. - -## From graph to AI - -This section classifies the complexity of the queries you can answer with -ArangoDB and gives you an overview of the respective feature. - -It starts with running a simple query that shows what is the path that goes from -one node to another, continues with more complex tasks like graph classification, -link prediction, and node classification, and ends with generative AI solutions -powered by graph relationships and vector embeddings. - -### Graph Queries - -When you run an AQL query on a graph, a traversal query can go from a node to -multiple edges, and then the edges indicate what the next connected nodes are. -Graph queries can also determine the shortest paths between nodes. - -Graph queries can answer questions like _**Who can introduce me to person X**_? - -![Graph Query](../../images/graph-query.png) - -See [Graphs in AQL](../../3.12/aql/graphs/_index.md) for the supported graph queries. - -### Graph Analytics - -Graph analytics or graph algorithms is what you run on a graph if you want to -know aggregate information about your graph, while analyzing the entire graph. - -Graph analytics can answer questions like _**Who are the most connected persons**_? - -![Graph Analytics](../../images/graph-analytics.png) - -ArangoDB offers _Graph Analytics Engines_ to run algorithms such as -connected components, label propagation, and PageRank on your data. This feature -is available for the ArangoGraph Insights Platform. See -[Graph Analytics](../graph-intelligence/graph-analytics.md) for details. - -### GraphML - -When applying machine learning on a graph, you can predict connections, get -better product recommendations, and also classify nodes, edges, and graphs. - -GraphML can answer questions like: -- _**Is there a connection between person X and person Y?**_ -- _**Will a customer churn?**_ -- _**Is this particular transaction Anomalous?**_ - -![Graph ML](../../images/graph-ml.png) - -For ArangoDB's enterprise-ready, graph-powered machine learning offering, -see [ArangoGraphML](graphml/_index.md). - -### GraphRAG - -GraphRAG is ArangoDB's turn-key solution to transform your organization's data into -a knowledge graph and let everyone utilize the knowledge by asking questions in -natural language. - -The overall process of GraphRAG involves the following: -- **Creating a Knowledge Graph** from raw text data. -- **Identifying and extract entities and relationships** within the data. -- **Storing the structured information** in ArangoDB. -- **Clustering each closely connected set of entities into semantic contexts** - via topology-based algorithms and summarization. -- **Using such semantically augmented structured representation** as the - foundation for efficient and accurate information retrieval via lexical and - semantic search. -- **Integrating retrieval methods with LLMs (privately or publicly hosted)** - to augment responses using both structured and unstructured data, providing - accurate responses with the desired format and degree of detail for each query. - -To learn more, see the [GraphRAG](graphrag/_index.md) documentation. - -## Knowledge Graphs - -A knowledge graph can be thought of as a dynamic and interconnected network of -real-world entities and the intricate relationships that exist between them. - -Key aspects of knowledge graphs: -- **Domain-specific knowledge**: You can tailor knowledge graphs to specific - domains and industries. -- **Structured information**: Makes it easy to query, analyze, and extract - meaningful insights from your data. -- **Accessibility**: You can build a Semantic Web knowledge graph or using - custom data. - -LLMs can help distill knowledge graphs from natural language by performing -the following tasks: -- Entity discovery -- Relation extraction -- Coreference resolution -- End-to-end knowledge graph construction -- (Text) Embeddings - -## Sample datasets - -If you want to try out ArangoDB's data science features, you may use the -[`arango-datasets` Python package](../../3.12/components/tools/arango-datasets.md) -to load sample datasets into a deployment. diff --git a/site/content/platform/data-science/graphml/_index.md b/site/content/platform/data-science/graphml/_index.md deleted file mode 100644 index 553f7d81cf..0000000000 --- a/site/content/platform/data-science/graphml/_index.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -title: ArangoDB GraphML -menuTitle: GraphML -weight: 15 -description: >- - Boost your machine learning models with graph data using ArangoDB's advanced GraphML capabilities -aliases: - - arangographml ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -Traditional Machine Learning (ML) overlooks the connections and relationships -between data points, which is where graph machine learning excels. However, -accessibility to GraphML has been limited to sizable enterprises equipped with -specialized teams of data scientists. ArangoDB simplifies the utilization of Graph Machine Learning, -enabling a broader range of personas to extract profound insights from their data. - -With ArangoDB, you can solve high-computational graph problems using Graph Machine -Learning. Apply it on a selected graph to predict connections, get better product -recommendations, classify nodes, and perform node embeddings. You can configure and run -the whole machine learning flow entirely through the web interface or programmatically. - -## How GraphML works - -Graph machine learning leverages the inherent structure of graph data, where -entities (nodes) and their relationships (edges) form a network. Unlike -traditional ML, which primarily operates on tabular data, GraphML applies -specialized algorithms like Graph Neural Networks (GNNs), node embeddings, and -link prediction to uncover complex patterns and insights. - -The underlying framework for ArangoDB's GraphML is **[GraphSAGE](https://snap.stanford.edu/graphsage/)**. -GraphSAGE (Graph Sample and AggreGatE) is a powerful Graph Neural Network (GNN) -**framework** designed for inductive representation learning on large graphs. -It is used to generate low-dimensional vector representations for nodes and is -especially useful for graphs that have rich node attribute information. -The overall process involves the following steps: - -1. **Graph Construction**: - - Raw data is transformed into a graph structure, defining nodes and edges based - on real-world relationships. -2. **Featurization**: Your raw graph data is transformed into numerical representations that the model can understand. - - The system iterates over your selected nodes and converts their attributes: booleans become `0` or `1`, numbers are normalized, and text attributes are converted into numerical vectors using sentence transformers. - - All of these numerical features are then combined (concatenated). - - Finally, **Incremental PCA** (Incremental Principal Component Analysis a dimensionality reduction technique) is used to reduce the size of the combined features, which helps remove noise and keep only the most important information. -3. **Training**: The model learns from the graph's structure by sampling and aggregating information from each node's local neighborhood. - - For each node, GraphSAGE looks at connections up to **2 hops away**. - - Specifically, it uniformly samples up to **25 direct neighbors** (depth 1) and for each of those, it samples up to **10 of their neighbors** (depth 2). - - By aggregating feature information from this sampled neighborhood, the model creates a rich "embedding" for each node that captures both its own features and its role in the graph. -4. **Inference & Insights**: - - The trained model is used to classify nodes, detect anomalies, recommend items, - or predict future connections. - -ArangoDB streamlines these steps, providing an intuitive and scalable -framework to integrate GraphML into various applications, from fraud detection -to recommendation systems. - -![GraphML Embeddings](../../../images/GraphML-Embeddings.webp) - -![GraphML Workflow](../../../images/GraphML-How-it-works.webp) - -You no longer need to understand the complexities of graph machine learning to -benefit from it. Solutions with ArangoDB's GraphML only require input from a user about -their data, and the GraphML managed service handles the rest. - -The platform comes preloaded with all the tools needed to prepare your graph -for machine learning, high-accuracy training, and persisting predictions back -to the database for application use. - -## What you can do with GraphML - -GraphML directly supports two primary machine learning tasks: -**Node Classification** and **Node Embeddings**. - -### Node Classification - -Node classification is a **supervised learning** task where the goal is to -predict the label of a node based on both its own features and its relationships -within the graph. It requires a set of labeled nodes to train a model, which then -classifies unlabeled nodes based on learned patterns. - -**How it works in ArangoDB** - -- A portion of the nodes in a graph is labeled for training. -- The model learns patterns from both **node features** and - **structural relationships** (neighboring nodes and connections). -- It predicts labels for unlabeled nodes based on these learned patterns. - -**Example Use Cases** - -- **Fraud Detection in Financial Networks** - - **Problem:** Fraudsters often create multiple accounts or interact within - suspicious clusters to evade detection. - - **Solution:** A transaction graph is built where nodes represent users and - edges represent transactions. The model learns patterns from labeled - fraudulent and legitimate users, detecting hidden fraud rings based on - **both user attributes and transaction relationships**. - -- **Customer Segmentation in E-Commerce & Social Media** - - **Problem:** Businesses need to categorize customers based on purchasing - behavior and engagement. - - **Solution:** A graph is built where nodes represent customers and edges - represent interactions (purchases, reviews, social connections). The model - predicts the category of each user based on how similar they are to other users - **not just by their personal data, but also by how they are connected to others**. - -- **Disease Classification in Biomedical Networks** - - **Problem:** Identifying proteins or genes associated with a disease. - - **Solution:** A protein interaction graph is built where nodes are proteins - and edges represent biochemical interactions. The model classifies unknown - proteins based on their interactions with known disease-related proteins, - rather than just their individual properties. - -### Node Embedding Generation - -Node embedding is an **unsupervised learning** technique that converts nodes -into numerical vector representations, preserving their **structural relationships** -within the graph. Unlike simple feature aggregation, node embeddings -**capture the influence of neighboring nodes and graph topology**, making -them powerful for downstream tasks like clustering, anomaly detection, -and link prediction. This combination provides valuable insights. -Consider using [ArangoDB's Vector Search](https://arangodb.com/2024/11/vector-search-in-arangodb-practical-insights-and-hands-on-examples/) -capabilities to find similar nodes based on their embeddings. - -**Feature Embeddings versus Node Embeddings** - -**Feature Embeddings** are vector representations derived from the attributes or -features associated with nodes. These embeddings aim to capture the inherent -characteristics of the data. For example, in a social network, a -feature embedding might encode user attributes like age, location, and -interests. Techniques like **Word2Vec**, **TF-IDF**, or **autoencoders** are -commonly used to generate such embeddings. - -In the context of graphs, **Node Embeddings** are a -**combination of a node's feature embedding and the structural information from its connected edges**. -Essentially, they aggregate both the node's attributes and the connectivity patterns -within the graph. This fusion helps capture not only the individual properties of -a node but also its position and role within the network. - -**How it works in ArangoDB** - -- The model learns an embedding (a vector representation) for each node based on its - **position within the graph and its connections**. -- It **does not rely on labeled data** – instead, it captures structural patterns - through graph traversal and aggregation of neighbor information. -- These embeddings can be used for similarity searches, clustering, and predictive tasks. - -**Example Use Cases** - -- **Recommendation Systems (E-commerce & Streaming Platforms)** - - **Problem:** Platforms like Amazon, Netflix, and Spotify need to recommend products, - movies, or songs. - - **Solution:** A user-item interaction graph is built where nodes are users - and products, and edges represent interactions (purchases, ratings, listens). - **Embeddings encode relationships**, allowing the system to recommend similar - items based on user behavior and network influence rather than just individual - preferences. - -- **Anomaly Detection in Cybersecurity & Finance** - - **Problem:** Detecting unusual activity (e.g., cyber attacks, money laundering) - in complex networks. - - **Solution:** A network of IP addresses, users, and transactions is represented as - a graph. Nodes with embeddings that significantly deviate from normal patterns - are flagged as potential threats. The key advantage here is that anomalies are - detected based on **network structure, not just individual activity logs**. - -- **Link Prediction (Social & Knowledge Graphs)** - - **Problem:** Predicting new relationships, such as suggesting friends on - social media or forecasting research paper citations. - - **Solution:** A social network graph is created where nodes are users, and - edges represent friendships. **Embeddings capture the likelihood of - connections forming based on shared neighborhoods and structural - similarities, even if users have never interacted before**. - -### Key Differences - -| Feature | Node Classification | Node Embedding Generation | -|-----------------------|---------------------|----------------------------| -| **Learning Type** | Supervised | Unsupervised | -| **Input Data** | Labeled nodes | Graph structure & features | -| **Output** | Predicted labels | Node embeddings (vectors) | -| **Key Advantage** | Learns labels based on node connections and attributes | Learns structural patterns and node relationships | -| **Use Cases** | Fraud detection, customer segmentation, disease classification | Recommendations, anomaly detection, link prediction | - -GraphML provides the infrastructure to efficiently train and apply these -models, helping users extract meaningful insights from complex graph data. - -## Metrics and Compliance - -GraphML supports tracking your ML pipeline by storing all relevant metadata -and metrics in a Graph called ArangoPipe. This is only available to you and is never -viewable by ArangoDB. This metadata graph links all experiments -to the source data, feature generation activities, training runs, and prediction -jobs, allowing you to track the entire ML pipeline without having to leave ArangoDB. - -## Security - -Each deployment that uses GraphML has an `arangopipe` database created, -which houses all ML Metadata information. Since this data lives within the deployment, -it benefits from the ArangoGraph security features and SOC 2 compliance. -All GraphML services live alongside the ArangoGraph deployment and are only -accessible within that organization. diff --git a/site/content/platform/data-science/graphml/notebooks-api.md b/site/content/platform/data-science/graphml/notebooks-api.md deleted file mode 100644 index 426dafb893..0000000000 --- a/site/content/platform/data-science/graphml/notebooks-api.md +++ /dev/null @@ -1,860 +0,0 @@ ---- -title: How to use GraphML in a scriptable manner -menuTitle: Notebooks & API -weight: 15 -description: >- - Control all resources inside GraphML via Jupyter Notebooks or Python API -aliases: - - getting-started-with-arangographml - - ../arangographml/getting-started - - ../arangographml-getting-started-with-arangographml ---- - -{{< tag "ArangoDB Platform" >}} - -The ArangoDB Platform provides an easy-to-use & scalable interface to run -Graph Machine Learning on ArangoDB data. Since all the orchestration and Machine Learning logic is -managed by ArangoDB, all that is typically required are JSON specifications outlining -individual processes to solve a Machine Learning task. - -The `arangoml` Python package allows you to manage all the necessary -GraphML components, including: -- **Project Management**: Projects are a metadata-tracking entity that sit at - the top level of ArangoDB GraphML. All activities must link to a project. -- **Featurization**: The step of converting human-understandable data to - machine-understandable data (e.g. features), such that it can be used to - train Graph Neural Networks (GNNs). -- **Training**: Train a set of models based on the name of the generated/existing - features, and a definition of the ML task you want to solve (e.g. Node Classification, Embedding Generation). -- **Model Selection**: Select the best model based on the metrics generated during training. -- **Predictions**: Generate predictions based on the selected model, and persist - the results to the source graph (either in the source document, or in a new collection). - -GraphML's suite of services and packages is driven by **"specifications"**. -These specifications are standard Python dictionaries that describe the task -being performed, and the data being used. The GraphML services work closely -together, with the previous task being used as the input for the next. - -Let's take a look at using the `arangoml` package to: - -1. Manage projects -2. Featurize data -3. Submit Training Jobs -4. Evaluate Model Metrics -5. Generate Predictions - -## Initialize ArangoML - -**API Documentation: [arangoml.ArangoMLMagics.enable_arangoml](https://arangoml.github.io/arangoml/magics.html#arangoml.magic.ArangoMLMagics.enable_arangoml)** - -The `arangoml` package comes pre-loaded with every GraphML notebook environment. -To start using it, simply import it, and enable it via a Jupyter Magic Command. - -```py -arangoml = %enable_arangoml -``` - -{{< tip >}} -GraphML comes with other ArangoDB Magic Commands! See the full list [here](https://arangoml.github.io/arangoml/magics.html). -{{< /tip >}} - -## Load the database - -This example is using GraphML to predict the **class** of `Events` in a -Knowledge Graph constructed from the [GDELT Project](https://www.gdeltproject.org/). - -> GDELT monitors the world's news media from nearly every corner of every - country in print, broadcast, and web formats, in over 100 languages, every - moment of every day. [...] Put simply, the GDELT Project is a realtime open - data global graph over human society as seen through the eyes of the world's - news media, reaching deeply into local events, reaction, discourse, and - emotions of the most remote corners of the world in near-realtime and making - all of this available as an open data firehose to enable research over human - society. - -The events used range from peaceful protests to significant battles in Angola. -The image below depicts the connections around an example event: - -![Example Event](../../../images/ArangoML_open_intelligence_sample.png) - -You can also see a larger portion of this graph, showing how the events, actors, -news sources, and locations are interconnected into a large graph. - -![Example Event](../../../images/ArangoML_open_intelligence_visualization.png) - -The [`arango-datasets`](../../../3.12/components/tools/arango-datasets.md) Python package -allows you to load pre-defined datasets into ArangoDB Platform. It comes pre-installed in the -GraphML notebook environment. - -```py -DATASET_NAME = "OPEN_INTELLIGENCE_ANGOLA" - -%delete_database {DATASET_NAME} -%create_database {DATASET_NAME} -%use_database {DATASET_NAME} -%load_dataset {DATASET_NAME} -``` - -## Projects - -**API Documentation: [ArangoML.projects](https://arangoml.github.io/arangoml/api.html#projects)** - -Projects are an important reference used throughout the entire GraphML -lifecycle. All activities link back to a project. The creation of the project -is very simple. - -### Get/Create a project -```py -project = arangoml.get_or_create_project(DATASET_NAME) -``` - -### List projects - -```py -arangoml.projects.list_projects() -``` - -## Featurization - -**API Documentation: [ArangoML.jobs.featurize](https://arangoml.github.io/arangoml/api.html#agml_api.jobs.v1.api.jobs_api.JobsApi.featurize)** - -The Featurization Service depends on a **Featurization Specification**: - -{{< tip >}} -The descriptions of the specifications on this page indicate the Python data types, -but you can substitute them as follows for a schema description in terms of JSON: - -| Python | JSON | -|:--------|:-------| -| `dict` | object | -| `list` | array | -| `int` | number | -| `float` | number | -| `str` | string | -{{< /tip >}} - -- `databaseName` (str): The database name the source data is in. - -- `featurizationName` (str): A name for the featurization task. - -- `projectName` (str): The associated project name. You can use `project.name` here - if it was created or retrieved as described above. - -- `graphName` (str): The associated graph name that exists within the database. - -- `featureSetID` (str, _optional_): The ID of an existing Feature Set to re-use. If provided, the `metagraph` dictionary can be omitted. Defaults to `None`. - -- `featurizationConfiguration` (dict, _optional_): The optional default configuration to be applied - across all features. Individual collection feature settings override this option. - - - `featurePrefix` (str): The prefix to be applied to all individual features generated. Default is `feat_`. - - - `outputName` (str): Adjust the default feature name. This can be any valid ArangoDB attribute name. Defaults to `x`. - - - `dimensionalityReduction` (dict): Object configuring dimensionality reduction. - - `disabled` (bool): Whether to disable dimensionality reduction. Default is `false`, - therefore dimensionality reduction is applied after Featurization by default. - - `size` (int): The number of dimensions to reduce the feature length to. Default is `512`. - - - `defaultsPerFeatureType` (dict): A dictionary mapping each feature type to how missing or mismatched values should be handled. The keys of this dictionary are the feature types, and the values are sub-dictionaries: - - `text` / `numeric` / `category` / `label`: - - `missing` (dict): A sub-dictionary detailing how missing values should be handled. - - `strategy` (str): The strategy to use for missing values. Options include `REPLACE` or `RAISE`. - - `replacement` (int/float for `numeric`, otherwise str): The value to replace missing values with. Only needed if `strategy` is `REPLACE`. - - `mismatch` (dict): A sub-dictionary detailing how mismatched values should be handled. - - `strategy` (str): The strategy to use for mismatched values. Options include `REPLACE`, `RAISE`, `COERCE_REPLACE`, or `COERCE_RAISE`. - - `replacement` (int/float for `numeric`, otherwise str): The value to replace mismatched values with. Only needed if `strategy` is `REPLACE`, or `COERCE_REPLACE`. - -- `jobConfiguration` (dict, _optional): A set of configurations that are applied to the job. - - `batchSize` (int): The number of documents to process in a single batch. Default is `32`. - - `runAnalysisChecks` (bool): Whether to run analysis checks, used to perform a high-level analysis of the data quality before proceeding. Default is `true`. - - `skipLabels` (bool): Skips the featurization process for attributes marked as `label`. Default is `false`. - - `useFeatureStore` (bool): Enables the use of the Feature Store database, which allows you to store features separately from your Source Database. Default is `false`, therefore features are written to the source graph. - - `overwriteFSGraph` (bool): Whether to overwrite the Feature Store Graph if features were previously generated. Default is `false`, therefore features are written to an existing Feature Store Graph. - - `writeToSourceGraph` (bool): Whether to store the generated features on the Source Graph. Default is `true`. - -- `metagraph` (dict): Metadata to represent the node & edge collections of the graph. - - `vertexCollections` (dict): A dictionary mapping the node collection names to a configuration dictionary: - - _collection name_ (dict): - - `features` (dict): A dictionary mapping document properties to the following values: - - `featureType` (str): The type of feature. Options include `text`, `category`, `numeric`, or `label`. - - `config` (dict): Collection-level configuration settings. - - `featurePrefix` (str): Identical to global `featurePrefix` but for this collection. - - `dimensionalityReduction` (dict): Identical to global `dimensionalityReduction` but for this collection. - - `outputName` (str): Identical to global `outputName`, but specifically for this collection. - - `defaultsPerFeatureType` (dict): Identical to global `defaultsPerFeatureType`, but specifically for this collection. - - `edgeCollections` (dict): A dictionary mapping the edge collection names to an empty dictionary, as edge attributes are not currently supported. - - _collection name_ (dict): An empty dictionary. - -The Featurization Specification example is used for the GDELT dataset: -- It featurizes the `name` attribute of the `Actor`, `Class`, `Country`, - `Source`, `Location`, and `Region` collections as a `text` features. -- It featurizes the `description` attribute of the `Event` collection as a - `text` feature. -- It featurizes the `label` attribute of the `Event` collection as a `label` - feature (this is the attribute you want to predict). -- It featurizes the `sourceScale` attribute of the `Source` collection as a - `category` feature. -- It featurizes the `name` attribute of the `Region` collection as a - `category` feature. - -```py -# 1. Define the Featurization Specification - -featurization_spec = { - "databaseName": dataset_db.name, - "projectName": project.name, - "graphName": graph.name, - "featurizationName": f"{DATASET_NAME}_Featurization", - "featurizationConfiguration": { - "featurePrefix": "feat_", - "dimensionalityReduction": { "size": 256 }, - "outputName": "x" - }, - "jobConfiguration": { - "batchSize": 512, - "useFeatureStore": False, - "runAnalysisChecks": False, - }, - "metagraph": { - "vertexCollections": { - "Actor": { - "features": { - "name": { - "featureType": "text", - }, - } - }, - "Country": { - "features": { - "name": { - "featureType": "text", - } - } - }, - "Event": { - "features": { - "description": { - "featureType": "text", - }, - "label": { - "featureType": "label", - }, - } - }, - "Source": { - "features": { - "name": { - "featureType": "text", - }, - "sourceScale": { - "featureType": "category", - }, - } - }, - "Location": { - "features": { - "name": { - "featureType": "text", - } - } - }, - "Region": { - "features": { - "name": { - "featureType": "category", - }, - } - } - }, - "edgeCollections": { - "eventActor": {}, - "hasSource": {}, - "hasLocation": {}, - "inCountry": {}, - "inRegion": {}, - } - } -} -``` - -Once the specification has been defined, a Featurization Job can be triggered using the `arangoml.jobs.featurize` method: - -```py -# 2. Submit a Featurization Job - -featurization_job = arangoml.jobs.featurize(featurization_spec) -``` - -Once a Featurization Job has been submitted, you can wait for it to complete using the `arangoml.wait_for_featurization` method: - -```py -# 3. Wait for the Featurization Job to complete - -featurization_job_result = arangoml.wait_for_featurization(featurization_job.job_id) -``` - -**Example Output:** -```py -{ - "job_id": "16349541", - "output_db_name": "OPEN_INTELLIGENCE_ANGOLA", - "graph": "OPEN_INTELLIGENCE_ANGOLA", - "feature_set_id": "16349537", - "feature_set_ids": [ - "16349537" - ], - "vertexCollections": { - "Actor": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Class": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Country": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Event": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x", - "y": "OPEN_INTELLIGENCE_ANGOLA_y" - }, - "Source": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Location": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Region": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - } - }, - "edgeCollections": { - "eventActor": {}, - "hasSource": {}, - "hasLocation": {}, - "inCountry": {}, - "inRegion": {}, - "subClass": {}, - "type": {} - }, - "label_field": "OPEN_INTELLIGENCE_ANGOLA_y", - "input_field": "OPEN_INTELLIGENCE_ANGOLA_x", - "feature_set_id_to_results": { - "16349537": { - "feature_set_id": "16349537", - "output_db_name": "OPEN_INTELLIGENCE_ANGOLA", - "graph": "OPEN_INTELLIGENCE_ANGOLA", - "vertexCollections": { - "Actor": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Class": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Country": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Event": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x", - "y": "OPEN_INTELLIGENCE_ANGOLA_y" - }, - "Source": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Location": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Region": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - } - }, - "edgeCollections": { - "eventActor": {}, - "hasSource": {}, - "hasLocation": {}, - "inCountry": {}, - "inRegion": {}, - "subClass": {}, - "type": {} - }, - "label_field": "OPEN_INTELLIGENCE_ANGOLA_y", - "input_field": "OPEN_INTELLIGENCE_ANGOLA_x", - "is_feature_store": false, - "target_collection": "Event" - } - }, - "is_feature_store": false, - "target_collection": "Event" -} -``` - -You can also cancel a Featurization Job using the `arangoml.jobs.cancel_job` method: - -```py -arangoml.jobs.cancel_job(prediction_job.job_id) -``` - -## Training - -**API Documentation: [ArangoML.jobs.train](https://arangoml.github.io/arangoml/api.html#agml_api.jobs.v1.api.jobs_api.JobsApi.train)** - -Training Graph Machine Learning Models with GraphML requires two steps: -1. Describe which data points should be included in the Training Job. -2. Pass the Training Specification to the Training Service. - -The Training Service depends on a **Training Specification**: - -- `featureSetID` (str): The feature set ID that was generated during the Featurization Job (if any). It replaces the need to provide the `metagraph`, `databaseName`, and `projectName` fields. - -- `databaseName` (str): The database name the source data is in. Can be omitted if `featureSetID` is provided. - -- `projectName` (str): The top-level project to which all the experiments will link back. Can be omitted if `featureSetID` is provided. - -- `useFeatureStore` (bool): Boolean for enabling or disabling the use of the feature store. Default is `false`. - -- `mlSpec` (dict): Describes the desired machine learning task, input features, and - the attribute label to be predicted. - - `classification` (dict): Dictionary to describe the Node Classification Task Specification. - - `targetCollection` (str): The ArangoDB collection name that contains the prediction label. - - `inputFeatures` (str): The name of the feature to be used as input. - - `labelField` (str): The name of the attribute to be predicted. - - `batchSize` (int): The number of documents to process in a single training batch. Default is `64`. - - `graphEmbeddings` (dict): Dictionary to describe the Graph Embedding Task Specification. - - `targetCollection` (str): The ArangoDB collection used to generate the embeddings. - - `embeddingSize` (int): The size of the embedding vector. Default is `128`. - - `batchSize` (int): The number of documents to process in a single training batch. Default is `64`. - - `generateEmbeddings` (bool): Whether to generate embeddings on the training dataset. Default is `false`. - -- `metagraph` (dict): Metadata to represent the node & edge collections of the graph. If `featureSetID` is provided, this can be omitted. - - `graph` (str): The ArangoDB graph name. - - `vertexCollections` (dict): A dictionary mapping the collection names to a configuration dictionary: - - _collection name_ (dict): - - `x` (str): The name of the feature to be used as input. - - `y` (str): The name of the attribute to be predicted. Can only be specified for one collection. - - `edgeCollections` (dict): A dictionary mapping the edge collection names to an empty dictionary, as edge features are not currently supported. - - _collection name_ (dict): An empty dictionary. - -A Training Specification allows for concisely defining your training task in a -single object and then passing that object to the training service using the -Python API client, as shown below. - -The GraphML Training Service is responsible for training a series of -Graph Machine Learning Models using the data provided in the Training -Specification. It assumes that the data has been featurized and is ready to be -used for training. - -Given that we have run a Featurization Job, we can create the Training Specification -using the `featurization_job_result` object returned from the Featurization Job: - -```py -# 1. Define the Training Specification - -# Node Classification example - -training_spec = { - "featureSetID": featurization_job_result.result.feature_set_id, - "mlSpec": { - "classification": { - "targetCollection": "Event", - "inputFeatures": "OPEN_INTELLIGENCE_ANGOLA_x", - "labelField": "OPEN_INTELLIGENCE_ANGOLA_y", - } - }, -} - -# Node Embedding example -# NOTE: Full Graph Embeddings support is coming soon - -training_spec = { - "featureSetID": featurization_job_result.result.feature_set_id, - "mlSpec": { - "graphEmbeddings": { - "targetCollection": "Event", - "embeddingSize": 128, - "generateEmbeddings": True, - } - }, -} -``` - -Once the specification has been defined, a Training Job can be triggered using the `arangoml.jobs.train` method: - -```py -# 2. Submit a Training Job - -training_job = arangoml.jobs.train(training_spec) -``` - -Once a Training Job has been submitted, you can wait for it to complete using the `arangoml.wait_for_training` method: - -```py -# 3. Wait for the Training Job to complete - -training_job_result = arangoml.wait_for_training(training_job.job_id) -``` - -**Example Output (Node Classification):** -```py -{ - "job_id": "691ceb2f-1931-492a-b4eb-0536925a4697", - "job_status": "COMPLETED", - "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Classification", - "project_id": "16832427", - "database_name": "OPEN_INTELLIGENCE_ANGOLA", - "metagraph": { - "mlSpec": { - "classification": { - "targetCollection": "Event", - "inputFeatures": "OPEN_INTELLIGENCE_ANGOLA_x", - "labelField": "OPEN_INTELLIGENCE_ANGOLA_y", - "metrics": None - } - }, - "graph": "OPEN_INTELLIGENCE_ANGOLA", - "vertexCollections": { - "Actor": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Class": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Country": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Event": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x", - "y": "OPEN_INTELLIGENCE_ANGOLA_y" - }, - "Source": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Location": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Region": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - } - }, - "edgeCollections": { - "eventActor": {}, - "hasSource": {}, - "hasLocation": {}, - "inCountry": {}, - "inRegion": {}, - "subClass": {}, - "type": {} - }, - "batch_size": 64 - }, - "time_submitted": "2024-01-12T02:19:19.686286", - "time_started": "2024-01-12T02:19:29.403742", - "time_ended": "2024-01-12T02:30:59.313038", - "job_state": None, - "job_conditions": None -} -``` - -**Example Output (Node Embeddings):** -```py -{ - "job_id": "6047e53a-f1dd-4725-83e8-74ac44629c11", - "job_status": "COMPLETED", - "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Embeddings", - "project_id": "647025872", - "database_name": "OPEN_INTELLIGENCE_ANGOLA", - "ml_spec": { - "graphEmbeddings": { - "targetCollection": "Event", - "embeddingLevel": "NODE_EMBEDDINGS", - "embeddingSize": 128, - "embeddingTrainingType": "UNSUPERVISED", - "batchSize": 64, - "generateEmbeddings": true, - "bestModelSelection": "BEST_LOSS", - "persistModels": "ALL_MODELS", - "modelConfigurations": {} - } - }, - "metagraph": { - "graph": "OPEN_INTELLIGENCE_ANGOLA", - "vertexCollections": { - "Actor": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Country": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Event": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x", - "y": "OPEN_INTELLIGENCE_ANGOLA_y" - }, - "Source": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Location": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - }, - "Region": { - "x": "OPEN_INTELLIGENCE_ANGOLA_x" - } - }, - "edgeCollections": { - "eventActor": {}, - "hasSource": {}, - "hasLocation": {}, - "inCountry": {}, - "inRegion": {} - } - }, - "time_submitted": "2025-03-27T02:55:15.099680", - "time_started": "2025-03-27T02:57:25.143948", - "time_ended": "2025-03-27T03:01:24.619737", - "training_type": "Training" -} -``` - -You can also cancel a Training Job using the `arangoml.jobs.cancel_job` method: - -```py -arangoml.jobs.cancel_job(training_job.job_id) -``` - -## Model Selection - -Model Statistics can be observed upon completion of a Training Job. -To select a Model, the GraphML Projects Service can be used to gather -all relevant models and choose the preferred model for a Prediction Job. - -First, let's list all the trained models using -[ArangoML.list_models](https://arangoml.github.io/arangoml/client.html#arangoml.main.ArangoML.list_models): - -```py -# 1. List all trained Models - -models = arangoml.list_models( - project_name=project.name, - training_job_id=training_job.job_id -) - -print(len(models)) -``` - -The cell below selects the model with the highest **test accuracy** using -[ArangoML.get_best_model](https://arangoml.github.io/arangoml/client.html#arangoml.main.ArangoML.get_best_model), -but there may be other factors that motivate you to choose another model. See -the `model_statistics` in the output field below for more information on the -full list of available metrics. - -```py - -# 2. Select the best Model - -# Get best Node Classification Model -# Sort by highest test accuracy - -best_model = arangoml.get_best_model( - project.name, - training_job.job_id, - sort_parent_key="test", - sort_child_key="accuracy", -) - -# Get best Graph Embedding Model -# Sort by lowest loss - -best_model = arangoml.get_best_model( - project.name, - training_job.job_id, - sort_parent_key="loss", - sort_child_key=None, - reverse=False -) - -print(best_model) -``` - -**Example Output (Node Classification):** -```py -{ - "job_id": "691ceb2f-1931-492a-b4eb-0536925a4697", - "model_id": "02297435-3394-4e7e-aaac-82e1d224f85c", - "model_statistics": { - "_id": "devperf/123", - "_key": "123", - "_rev": "_gkUc8By--_", - "run_id": "123", - "test": { - "accuracy": 0.8891242216547955, - "confusion_matrix": [[13271, 2092], [1276, 5684]], - "f1": 0.9, - "loss": 0.1, - "precision": 0.9, - "recall": 0.8, - "roc_auc": 0.8, - }, - "validation": { - "accuracy": 0.9, - "confusion_matrix": [[13271, 2092], [1276, 5684]], - "f1": 0.85, - "loss": 0.1, - "precision": 0.86, - "recall": 0.85, - "roc_auc": 0.85, - }, - }, - "target_collection": "Event", - "target_field": "label", -} -``` - -**Example Output (Node Embeddings):** -```py -{ - "job_id": "6047e53a-f1dd-4725-83e8-74ac44629c11", - "model_id": "55ae93c2-3497-4405-9c63-0fa0e4a5b5bd", - "model_display_name": "graphsageencdec Model", - "model_name": "graphsageencdec Model 55ae93c2-3497-4405-9c63-0fa0e4a5b5bd", - "model_statistics": { - "loss": 0.13700408464796796, - "val_acc": 0.5795393939393939, - "test_acc": 0.5809545454545455 - }, - "model_tasks": [ "GRAPH_EMBEDDINGS" ] -} -``` - -## Prediction - -**API Documentation: [ArangoML.jobs.predict](https://arangoml.github.io/arangoml/api.html#agml_api.jobs.v1.api.jobs_api.JobsApi.predict)** - -After selecting a model, a Prediction Job can be created. The Prediction Job -will generate predictions and persist them to the source graph in a new -collection, or within the source documents. - -The Prediction Service depends on a **Prediction Specification**: - -- `projectName` (str): The top-level project to which all the experiments will link back. -- `databaseName` (str): The database name the source data is in. -- `modelID` (str): The model ID to use for generating predictions. -- `featurizeNewDocuments` (bool): Boolean for enabling or disabling the featurization of new documents. Useful if you don't want to re-train the model upon new data. Default is `false`. -- `featurizeOutdatedDocuments` (bool): Boolean for enabling or disabling the featurization of outdated documents. Outdated documents are those whose features have changed since the last featurization. Default is `false`. -- `schedule` (str): A cron expression to schedule the prediction job. The cron syntax is a set of - five fields in a line, indicating when the job should be executed. The format must follow - the following order: `minute` `hour` `day-of-month` `month` `day-of-week` - (e.g. `0 0 * * *` for daily predictions at 00:00). Default is `None`. -- `embeddingsField` (str): The name of the field to store the generated embeddings. This is only used for Graph Embedding tasks. Default is `None`. - -```py -# 1. Define the Prediction Specification - -# Node Classification Example -prediction_spec = { - "projectName": project.name, - "databaseName": dataset_db.name, - "modelID": best_model.model_id, -} - -# Node Embedding Example -prediction_spec = { - "projectName": project.name, - "databaseName": dataset_db.name, - "modelID": best_model.model_id, - "embeddingsField": "embeddings" -} -``` - -This job updates all documents with the predictions derived from the trained model. -Once the specification has been defined, a Prediction Job can be triggered using the `arangoml.jobs.predict` method: - -```py -# 2. Submit a Prediction Job - -# For Node Classification -prediction_job = arangoml.jobs.predict(prediction_spec) - -# For Graph Embeddings -prediction_job = arangoml.jobs.generate(prediction_spec) -``` - -Similar to the Training Service, we can wait for a Prediction Job to complete with the `arangoml.wait_for_prediction` method: - -```py -# 3. Wait for the Prediction Job to complete - -prediction_job_result = arangoml.wait_for_prediction(prediction_job.job_id) -``` - -**Example Output (Node Classification):** -```py -{ - "job_id": "b2a422bb-5650-4fbc-ba6b-0578af0049d9", - "job_status": "COMPLETED", - "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Classification", - "project_id": "16832427", - "database_name": "OPEN_INTELLIGENCE_ANGOLA", - "model_id": "1a365657-f5ed-4da9-948b-1ff60bc6e7de", - "job_state_information": { - "outputGraphName": "OPEN_INTELLIGENCE_ANGOLA", - "outputCollectionName": "Event", - "outputAttribute": "OPEN_INTELLIGENCE_ANGOLA_y_predicted", - "numberOfPredictedDocuments": 3302, - "outputEdgeCollectionName": None - }, - "time_submitted": "2024-01-12T02:31:18.382625", - "time_started": "2024-01-12T02:31:23.550469", - "time_ended": "2024-01-12T02:31:40.021035" -} -``` - -**Example Output (Node Embeddings):** -```py -{ - "job_id": "25260362-9764-47d0-abb4-247cbdce6c7b", - "job_status": "COMPLETED", - "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Embeddings", - "project_id": "647025872", - "database_name": "OPEN_INTELLIGENCE_ANGOLA", - "model_id": "55ae93c2-3497-4405-9c63-0fa0e4a5b5bd", - "job_state_information": { - "outputGraphName": "OPEN_INTELLIGENCE_ANGOLA", - "outputCollectionName": "Event", - "outputAttribute": "embeddings", - "numberOfPredictedDocuments": 0, # 0 All documents already have up-to-date embeddings - }, - "time_submitted": "2025-03-27T14:02:33.094191", - "time_started": "2025-03-27T14:09:34.206659", - "time_ended": "2025-03-27T14:09:35.791630", - "prediction_type": "Prediction" -} -``` - -You can also cancel a Prediction Job using the `arangoml.jobs.cancel_job` method: - -```py -arangoml.jobs.cancel_job(prediction_job.job_id) -``` - -### Viewing Inference Results - -We can now access our results via AQL: - -```py -import json - -collection_name = prediction_job_result.job_state_information['outputCollectionName'] - -query = f""" - FOR doc IN `{collection_name}` - SORT RAND() - LIMIT 3 - RETURN doc -""" - -docs = list(dataset_db.aql.execute(query)) - -print(json.dumps(docs, indent=2)) -``` - -## What's next - -With the generated Feature (and optionally Node) Embeddings, you can now use them for downstream tasks like clustering, anomaly detection, and link prediction. Consider using [ArangoDB's Vector Search](https://arangodb.com/2024/11/vector-search-in-arangodb-practical-insights-and-hands-on-examples/) capabilities to find similar nodes based on their embeddings. diff --git a/site/content/platform/data-science/graphml/quickstart.md b/site/content/platform/data-science/graphml/quickstart.md deleted file mode 100644 index 6b06acf25a..0000000000 --- a/site/content/platform/data-science/graphml/quickstart.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: How to get started with GraphML -menuTitle: Quickstart -weight: 5 -description: >- - You can use GraphML straight within the ArangoDB Platform, via the web interface - or via Notebooks -aliases: - - ../arangographml/deploy ---- -{{< tag "ArangoDB Platform" >}} - -## Web interface versus Jupyter Notebooks - -The ArangoDB Platform provides enterprise-ready Graph Machine Learning in two options, -tailored to suit diverse requirements and preferences: -- Using the web interface -- In a scriptable manner, using the integrated Jupyter Notebooks and the HTTP API for GraphML - -## Setup - -{{< tabs "graphml-setup" >}} - -{{< tab "Web Interface" >}} -The web interface of the ArangoDB Platform allows you to create, configure, and -run a full machine learning workflow for GraphML. To get started, see the -[Web interface for GraphML](ui.md) page. -{{< /tab >}} - -{{< tab "Notebooks" >}} -The ArangoDB Notebooks service runs on the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). -It offers a pre-configured environment where everything, -including necessary components and configurations, comes preloaded. You don't -need to set up or configure the infrastructure, and can immediately start using the -GraphML functionalities in a scriptable manner. To get started, see the -[GraphML Notebooks & API](notebooks-api.md) reference documentation. - -{{< tip >}} -To get access to GraphML services and packages in ArangoGraph Insights Platform, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. -{{< /tip >}} - -- **Accessible at all levels** - - Low code UI - - Notebooks - - APIs -- **Full usability** - - MLOps lifecycle - - Metrics - - Metadata capture - - Model management - -![ArangoGraphML Pipeline](../../../images/ArangoGraphML_Pipeline.png) -{{< /tab >}} - -{{< /tabs >}} \ No newline at end of file diff --git a/site/content/platform/data-science/graphml/ui.md b/site/content/platform/data-science/graphml/ui.md deleted file mode 100644 index f83ccffee1..0000000000 --- a/site/content/platform/data-science/graphml/ui.md +++ /dev/null @@ -1,236 +0,0 @@ ---- -title: How to use GraphML in the ArangoDB Platform web interface -menuTitle: Web Interface -weight: 10 -description: >- - Learn how to create, configure, and run a full machine learning workflow for - GraphML in four steps using the features in the ArangoDB web interface ---- -{{< tag "ArangoDB Platform" >}} - -## The GraphML workflow in the web interface - -The entire process is organized into sequential steps within a **Project**, -giving you a clear path from data to prediction: - -1. **Featurization**: Select your data and convert it into numerical representations. -2. **Training**: Train a GraphSAGE model on the features and graph structure. -3. **Model Selection**: Evaluate the trained models and choose the best one. -4. **Prediction**: Use the selected model to generate predictions on your data. - You can also automate the prediction process to run at regular intervals. - -## Create a GraphML project - -To create a new GraphML project using the ArangoDB Platform web interface, follow these steps: - -1. From the left-hand sidebar, select the database where you want to create the project. -2. In the left-hand sidebar, click **GenAI Suite** to open the GraphML project management interface, then click **Run GraphML**. - ![Create GraphML Project](../../../images/create-graphml-project-ui.png) -3. In the **GraphML projects** view, click **Add new project**. -4. The **Create ML project** modal opens. Enter a **Name** for your machine learning project. -5. Click the **Create project** button to finalize the creation. -6. After creation, the new project appears in the list under **GraphML projects**. - Click the project name to begin with a Featurization job. - -## Featurization phase - -After clicking on a project name, you are taken to a screen where you can -configure and start a new Featurization job. Follow these steps: -1. **Select a Graph**: In the **Features** section, choose your target graph from the **Select a graph** dropdown menu. -2. **Select Vertex Collection(s)**: Pick the node collection(s) that you want to include for feature extraction. -3. **Select Attributes**: Choose the attributes from your node collection to - convert into machine-understandable features. Attributes cannot be used if their values are lists or arrays. - -{{< info >}} -A metagraph is basically just the configured subset of a graph (the node and -edge collections and the specified attributes). This is what you see represented -in the metagraph object in the JSON specification on the right. -{{< /info >}} - -### Configuration options - -The featurization process has several configurable options, grouped into -**Configuration** and **Advanced** settings. These are also shown in a JSON -format on the right side of the screen for transparency. - -In the **Configuration** tab, you can control the overall featurization job and -how features are stored. -- **Batch size**: The number of documents to process in a single batch. -- **Run analysis checks**: Whether to run analysis checks to perform a high-level - analysis of the data quality before proceeding. The default value is `true`. -- **Skip labels**: Skip the featurization process for attributes marked as labels. - The default value is `false`. -- **Overwrite FS graph**: Whether to overwrite the Feature Store graph if features - were previously generated. The default value is `false`, therefore features are - written to an existing Feature Store graph. -- **Write to source graph**: Whether to store the generated features on the Source - Graph. The default value is `true`. -- **Use feature store**: Enable the use of the Feature Store database, which - allows you to store features separately from your Source Database. The default - value is `false`, therefore features are written to the source graph. - -### Handling imperfect data - -Real-world datasets often contain missing values or mismatched data types. Use -the strategies below to control how each feature type (**Text**, **Numeric**, -**Category**, **Label**) handles these issues during featurization. - -| **Strategy type** | **Option** | **Description** | **When to use** | -|-------------------|-----------------------|-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------| -| Missing | **Raise** | Stops the job and reports an error when a value is missing. | When missing data indicates a critical issue. | -| | **Replace** | Substitutes missing values with a default you provide (e.g., `0` for numbers, `"unknown"` for text). | When missing values are expected. | -| Mismatch | **Raise** | The strictest option. Stops the job on any data type mismatch. | When any data type mismatch indicates a critical error. | -| | **Replace** | Replaces mismatched values with a default you provide, without trying to convert it first. | When mismatched values are unreliable, and you prefer to substitute it directly. | -| | **Coerce and Raise** | Attempts to convert (coerce) the value to the correct type (e.g. string "123" to number `123`). If the conversion is successful, it uses the new value. If it fails, the job stops. | A balanced approach, often the best default strategy. | -| | **Coerce and Replace**| The most forgiving option. The system first tries to convert the value. If it fails, it replaces the value with the specified default and continues the job. | For very dirty datasets where completing the job is the highest priority. | - -Once you’ve set your strategies, click **Begin featurization** to start the node -embedding-compatible featurization job. When the job status updates to -**Ready for training**, proceed to the **Training** step. - -![Navigate to Featurization](../../../images/graph-ml-ui-featurization.png) - -## Training phase - -The training is the second step in the ML workflow after featurization. -In the training phase, you configure and launch a machine learning training -job on your graph data. - -From the **Select a type of training job** dropdown menu, choose the type of -model you want to train (**Node Classification** or **Node Embeddings**). - -#### Node classification - -Node Classification is used to categorize the nodes in your graph based on their -features and structural connections within the graph. - -**Use cases include:** -- Entity categorization (e.g. movies into genres, users into segments) -- Fraud detection in transaction networks - -**Configuration parameters:** -- **Type of Training Job**: Node classification -- **Target Vertex Collection**: Choose the collection to classify (e.g. `movie`) -- **Batch Size**: The number of documents processed in a single training iteration. (e.g. `256`) -- **Data Load Batch Size**: The number of documents loaded from ArangoDB into memory in a single batch during the data loading phase (e.g. `50000`). -- **Data Load Parallelism**: The number of parallel processes used when loading data from ArangoDB into memory for training (e.g. `10`). - -After setting these values, click the **Begin training** button to start the job. - -![Node Classification](../../../images/ml-nodeclassification.png) - -#### Node embeddings - -Node Embeddings are used to generate vector embeddings (dense numerical representations) -of graph nodes that capture structural and feature-based information. - -**Use cases include:** -- Similarity search (e.g. finding similar products, users, or documents) -- Link prediction (e.g. suggesting new connections) - -**Configuration parameters:** -- **Type of Training Job:** Node embeddings -- **Target Vertex Collection:** Select the collection to generate embeddings for (e.g. `movie` or `person`) -- No label is required for training in this mode - -The target collection is where the model's predictions are stored when running a prediction job. - -Once the configuration is complete, click **Begin training** to start the embedding job. - -![Node Embeddings](../../../images/ml-node-embedding.png) - -## Model selection phase - -Once the training is finished, the job status updates to **READY FOR MODEL SELECTION**. -This means the model has been trained using the provided node and edge data -and is now ready for evaluation. - -A list of trained models is displayed, along with performance metrics -(**Accuracy**, **Precision**, **Recall**, **F1 score**, **Loss**). Review the results of different -model runs and configurations. - -![GraphML Model Selection](../../../images/graph-ml-model.png) - -Select the best performing model suitable for your prediction task. You can also -open the **Confusion Matrix** to compare predicted values versus actual values. - -![GraphML Confusion Matrix](../../../images/graphml-ui-confusion-matrix.png) - -## Prediction phase - -After selecting a model, you can create a Prediction Job. The Prediction Job -generates predictions and persists them to the source graph, either in a new -collection or within the source documents. - -The Prediction interface allows inference to be run using the selected model. -It enables configuration of how predictions are executed, which collections are -involved, and whether new or outdated documents should be automatically featurized -before prediction. - -You have two important options: - -- **Featurize new documents:** Enable this option to generate features for - documents that have been added since the model was trained. This is useful - for getting predictions on new data without having to retrain the model. -- **Featurize outdated documents:** Enable this option to re-generate features - for documents that have been modified. Outdated documents are those whose - attributes (used during featurization) have changed since the last feature - computation. This ensures your predictions reflect the latest changes to your data. - -In addition to these settings, you can also define the target data, where to store -results, and whether to run the job on a recurring schedule. - -These options provide flexibility in handling dynamic graph data and keeping -predictions relevant without repeating the entire ML workflow. - -- **Data load batch size**: Specifies the number of documents to load in a - single batch (e.g. `500000`). -- **Data load parallelism**: The number of parallel threads used to process - the prediction workload (e.g. `10`). -- **Prediction field**: The field in the documents where the predicted values are stored. - -![GraphML prediction phase](../../../images/graph-prediction.png) - -### Configuration options - -The Prediction screen displays the following configuration options: -- **Select Model**: Displays the model selected during the Model Selection phase. This model will be used to perform inference. -- **Target Vertex Collection**: This is the node collection on which predictions are applied. -- **Prediction Type**: Depending on the training job (for example, classification or embedding), the prediction outputs class labels or updated embeddings. - -### Enable scheduling - -You can configure automatic predictions using the **Enable scheduling** checkbox. -When scheduling is enabled, predictions run automatically based on a set CRON -expression. This helps keep prediction results up-to-date as new data is added to the system. - -You can define a cron expression that sets when the prediction job should run. -The cron syntax is a set of five fields in a line, indicating when the job should -be executed. The format must follow the following order: `minute` `hour` `day-of-month` `month` `day-of-week` -(e.g. `0 0 * * *` for daily predictions at 00:00, or `0 0 1 1 *` to execute the prediction -on January 1st at 00:00). - -When a field is set to an asterisk `*`, it means that any value is allowed for that field, -whenever the other field conditions are met. - -Below the CRON field, a user-friendly scheduling interface helps translate it: -- **Period**: Options include **Hourly**, **Daily**, **Weekly**, **Monthly**, or **Yearly**. -- **Month**: Indicates the month. For example, `1` for January. -- **Day of Month**: Indicates the day of the month. For example, `1` for - the first day of the month. -- **Day of Week** (optional): Indicates the day of the week. For example, - Monday is `1` and Tuesday is `2`. -- **Hours and Minutes**: Set the exact time for execution. For example, - if the hour is set to `8` and the minute to `0`, then the job runs at 8:00 AM. - -### Execute prediction - -After reviewing the configuration, click the **Run Prediction** button. -Once prediction is complete, you can analyze the results directly in -the Web Interface or export them for downstream use. - -## Limitations - -- **Edge Attributes**: The current version of GraphML does not support the use of edge attributes as features. -- **Dangling Edges**: Edges that point to non-existent nodes ("dangling edges") are not caught during the featurization analysis. They may cause errors later, during the Training phase. -- **Memory Usage**: Both featurization and training can be memory-intensive. Out-of-memory errors can occur on large graphs with insufficient system resources. diff --git a/site/content/platform/data-science/graphrag/services/_index.md b/site/content/platform/data-science/graphrag/services/_index.md deleted file mode 100644 index 38393bc8aa..0000000000 --- a/site/content/platform/data-science/graphrag/services/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: GraphRAG services -menuTitle: Services -description: '' ---- - diff --git a/site/content/platform/data-science/graphrag/services/gen-ai.md b/site/content/platform/data-science/graphrag/services/gen-ai.md deleted file mode 100644 index a87c3c44df..0000000000 --- a/site/content/platform/data-science/graphrag/services/gen-ai.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -title: GenAI Orchestration Service -menuTitle: GenAI -description: >- - The GenAI orchestrator service installs, manages, and runs AI-based services - for GraphRAG in your Kubernetes cluster -weight: 5 ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Overview - -The basic operations that the GenAI orchestration service carries out are the following: -- Install a service -- Uninstall a service -- Get the status of a service -- List all installed and deployed services - -Each unique service has its own API endpoint for the deployment. - -**Endpoint LLM Host:** -`https://<ExternalEndpoint>:8529/gen-ai/v1/llmhost` - -While services have their own unique endpoint, they share the same creation -request body and the same response body structure. The `env` field is used -to define the service specific parameters, like the model name to use for a -`llmhost` service, and the labels can be used to filter and identify the services -in the platform. All services support the `profiles` field, which you can use -to define the profile to use for the service. For example, you can define a -GPU profile that enables the service to run an LLM on GPU resources. - -## LLM Host Service Creation Request Body - -```json -{ - "env": { - "model_name": "<registered_model_name>" - } -} -``` - -## Using Labels in Creation Request Body - -```json -{ - "env": { - "model_name": "<registered_model_name>" - }, - "labels": { - "key1": "value1", - "key2": "value2" - } -} -``` - -{{< info >}} -Labels are optional. Labels can be used to filter and identify services in -the Platform. If you want to use labels, define them as a key-value pair in `labels` -within the `env` field. -{{< /info >}} - -## Using Profiles in Creation Request Body - -```json -{ - "env": { - "model_name": "<registered_model_name>", - "profiles": "gpu,internal" - } -} -``` - -{{< info >}} -The `profiles` field is optional. If it is not set, the service is created with -the default profile. Profiles must be present and created in the Platform before -they can be used. If you want to use profiles, define them as a comma-separated -string in `profiles` within the `env` field. -{{< /info >}} - -The parameters required for the deployment of each service are defined in the -corresponding service documentation. - -## Obtaining a Bearer Token - -Before you can authenticate with the GenAI service, you need to obtain a -Bearer token. You can generate this token using the ArangoDB authentication API: - -```bash -curl -X POST https://<ExternalEndpoint>:8529/_open/auth \ - -d '{"username": "your-username", "password": "your-password"}' -``` - -This returns a JWT token that you can use as your Bearer token. For more -details about ArangoDB authentication and JWT tokens, see -the [ArangoDB Authentication](../../../../3.12/develop/http-api/authentication/#jwt-user-tokens) -documentation. - -## Complete Service lifecycle example - -The example below shows how to install, monitor, and uninstall the Importer service. - -### Step 1: Installing the service - -```bash -curl -X POST https://<ExternalEndpoint>:8529/gen-ai/v1/graphragimporter \ - -H "Authorization: Bearer <your-bearer-token>" \ - -H "Content-Type: application/json" \ - -d '{ - "env": { - "username": "<your-username>", - "db_name": "<your-database-name>", - "api_provider": "<your-api-provider>", - "triton_url": "<your-arangodb-llm-host-url>", - "triton_model": "<your-triton-model>" - } - }' -``` - -**Response:** - -```json -{ - "serviceInfo": { - "serviceId": "arangodb-graphrag-importer-of1ml", - "description": "Install complete", - "status": "DEPLOYED", - "namespace": "arangodb-platform-dev" - } -} -``` - -### Step 2: Checking the service status - -```bash -curl -X GET https://<ExternalEndpoint>:8529/gen-ai/v1/service/arangodb-graphrag-importer-of1ml \ - -H "Authorization: Bearer <your-bearer-token>" -``` - -**Response:** -```json -{ - "serviceInfo": { - "serviceId": "arangodb-graphrag-importer-of1ml", - "description": "Install complete", - "status": "DEPLOYED", - "namespace": "arangodb-platform-dev" - } -} -``` - -### Step 3: Uninstalling the service - -```bash -curl -X DELETE https://<ExternalEndpoint>:8529/gen-ai/v1/service/arangodb-graphrag-importer-of1ml \ - -H "Authorization: Bearer <your-bearer-token>" -``` - -**Response:** -```json -{ - "serviceInfo": { - "serviceId": "arangodb-graphrag-importer-of1ml", - "description": "Uninstall complete", - "status": "UNINSTALLED", - "namespace": "arangodb-platform-dev" - } -} -``` - -{{< info >}} -- **Service ID**: The `serviceId` from Step 1's response (`arangodb-graphrag-importer-of1ml`) is used in Steps 2 and 3 -- **Authentication**: All requests use the same Bearer token in the `Authorization` header -{{< /info >}} - -### Customizing the example - -Replace the following values with your actual configuration: -- `<your-username>` - Your database username. -- `<your-database-name>` - Target database name. -- `<your-api-provider>` - Your API provider (e.g., `triton`) -- `<your-arangodb-llm-host-url>` - Your LLM host service URL. -- `<your-triton-model>` - Your Triton model name (e.g., `mistral-nemo-instruct`). -- `<your-bearer-token>` - Your authentication token. - -## Service configuration - -The GenAI orchestrator service is **started by default**. - -It will be available at the following URL: -`https://<ExternalEndpoint>:8529/gen-ai/v1/service` - -## Health check - -To test whether the service is running, you can use the following snippet: - -```bash -curl -X GET https://<ExternalEndpoint>:8529/gen-ai/v1/health -``` - -Expected output on success: `{"status":"OK"}` - -{{< info >}} -Keep in mind that this request requires a valid Bearer token. Without a valid -Bearer token, the request fails. -{{< /info >}} - -## API Reference - -For detailed API documentation, see the -[GenAI-Service API Reference](https://arangoml.github.io/platform-dss-api/GenAI-Service/proto/index.html). diff --git a/site/content/platform/data-science/graphrag/services/importer.md b/site/content/platform/data-science/graphrag/services/importer.md deleted file mode 100644 index 6a9558767e..0000000000 --- a/site/content/platform/data-science/graphrag/services/importer.md +++ /dev/null @@ -1,350 +0,0 @@ ---- -title: Importer Service -menuTitle: Importer -description: >- - The Importer service helps you transform your text document into a knowledge graph, - making it easier to analyze and understand complex information -weight: 10 ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Overview - -The Importer service lets you turn text files into a knowledge graph. -It supports the following text formats with UTF-8 encoding: -- `.txt` (Plain text) -- `.md` (Markdown) - -The Importer takes your text, analyzes it using the configured language model, and -creates a structured knowledge graph. This graph is then imported into your -ArangoDB database, where you can query and analyze the relationships between -different concepts in your document with the Retriever service. - -{{< tip >}} -You can also use the GraphRAG Importer service via the ArangoDB [web interface](../web-interface.md). -{{< /tip >}} - -## Creating a new project - -To create a new GraphRAG project, use the `CreateProject` method by sending a -`POST` request to the `genai/v1/project` endpoint. You must provide a unique -`project_name` and a `project_type` in the request body. Optionally, you can -provide a `project_description`. - -```curl -curl -X POST "https://<ExternalEndpoint>:8529/gen-ai/v1/project" \ --H "Content-Type: application/json" \ --d '{ - "project_name": "docs", - "project_type": "graphrag", - "project_description": "A documentation project for GraphRAG." -}' -``` -All the relevant ArangoDB collections (such as documents, chunks, entities, -relationships, and communities) created during the import process will -have the project name as a prefix. For example, the Documents collection will -become `<project_name>_Documents`. The Knowledge Graph will also use the project -name as a prefix. If no project name is specified, then all collections -are prefixed with `default_project`, e.g., `default_project_Documents`. - -### Project metadata - -Additional project metadata is accessible via the following endpoint, replacing -`<your_project>` with the actual name of your project: - -``` -GET /gen-ai/v1/project_by_name/<your_project> -``` - -The endpoint provides comprehensive metadata about your project's components, -including its importer and retriever services and their status. - -## Deployment options - -You can choose between two deployment options based on your needs. - -### Private LLM - -If you're working in an air-gapped environment or need to keep your data -private, you can use the private LLM mode with Triton Inference Server. -This option allows you to run the service completely within your own -infrastructure. The Triton Inference Server is a crucial component when -running in private LLM mode. It serves as the backbone for running your -language (LLM) and embedding models on your own machines, ensuring your -data never leaves your infrastructure. The server handles all the complex -model operations, from processing text to generating embeddings, and provides -both HTTP and gRPC interfaces for communication. - -### Public LLM - -Alternatively, if you prefer a simpler setup and don't have specific privacy -requirements, you can use the public LLM mode. This option connects to cloud-based -services like OpenAI's models via the OpenAI API or a large array of models -(Gemini, Anthropic, publicly hosted open-source models, etc.) via the OpenRouter option. - - -## Installation and configuration - -The Importer service can be configured to use either: -- Triton Inference Server (for private LLM deployments) -- OpenAI (for public LLM deployments) -- OpenRouter (for public LLM deployments) - -To start the service, use the GenAI service endpoint `/v1/graphragimporter`. -Please refer to the documentation of [GenAI service](gen-ai.md) for more -information on how to use it. - -### Using Triton Inference Server (Private LLM) - -The first step is to install the LLM Host service with the LLM and -embedding models of your choice. The setup will the use the -Triton Inference Server and MLflow at the backend. -For more details, please refer to the [Triton Inference Server](triton-inference-server.md) -and [Mlflow](mlflow.md) documentation. - -Once the `llmhost` service is up-and-running, then you can start the Importer -service using the below configuration: - -```json -{ - "env": { - "username": "your_username", - "db_name": "your_database_name", - "api_provider": "triton", - "triton_url": "your-arangodb-llm-host-url", - "triton_model": "mistral-nemo-instruct" - }, -} -``` - -Where: -- `username`: ArangoDB database user with permissions to create and modify collections. -- `db_name`: Name of the ArangoDB database where the knowledge graph will be stored. -- `api_provider`: Specifies which LLM provider to use. -- `triton_url`: URL of your Triton Inference Server instance. This should be the URL where your `llmhost` service is running. -- `triton_model`: Name of the LLM model to use for text processing. - -### Using OpenAI (Public LLM) - -```json -{ - "env": { - "openai_api_key": "your_openai_api_key", - "username": "your_username", - "db_name": "your_database_name", - "api_provider": "openai" - }, -} -``` - -Where: -- `username`: ArangoDB database user with permissions to create and modify collections -- `db_name`: Name of the ArangoDB database where the knowledge graph will be stored -- `api_provider`: Specifies which LLM provider to use -- `openai_api_key`: Your OpenAI API key - -{{< info >}} -By default, for OpenAI API, the service is using -`gpt-4o-mini` and `text-embedding-3-small` models as LLM and -embedding model respectively. -{{< /info >}} - -### Using OpenRouter (Gemini, Anthropic, etc.) - -OpenRouter makes it possible to connect to a huge array of LLM API -providers, including non-OpenAI LLMs like Gemini Flash, Anthropic Claude -and publicly hosted open-source models. - -When using the OpenRouter option, the LLM responses are served via OpenRouter -while OpenAI is used for the embedding model. - -```json - { - "env": { - "db_name": "your_database_name", - "username": "your_username", - "api_provider": "openrouter", - "openai_api_key": "your_openai_api_key", - "openrouter_api_key": "your_openrouter_api_key", - "openrouter_model": "mistralai/mistral-nemo" // Specify a model here - }, - } -``` - -Where: -- `username`: ArangoDB database user with permissions to access collections -- `db_name`: Name of the ArangoDB database where the knowledge graph is stored -- `api_provider`: Specifies which LLM provider to use -- `openai_api_key`: Your OpenAI API key (for the embedding model) -- `openrouter_api_key`: Your OpenRouter API key (for the LLM) -- `openrouter_model`: Desired LLM (optional; default is `mistral-nemo`) - -{{< info >}} -When using OpenRouter, the service defaults to `mistral-nemo` for generation -(via OpenRouter) and `text-embedding-3-small` for embeddings (via OpenAI). -{{< /info >}} - -## Building Knowledge Graphs - -Once the service is installed successfully, you can follow these steps -to send an input file to the Importer service: - -1. Prepare your text document for processing (text format with UTF-8 encoding or markdown files). -2. Send the document to the Importer service using HTTP: - ```bash - # Base64 encode your document - base64_content=$(base64 -i your_document.txt) - - # Send to the Loader service - curl -X POST /v1/import \ - -H "Content-Type: application/json" \ - -d '{ - "file_content": "'$base64_content'", - "file_name": "your_document.txt" - }' - ``` - - Replace the following placeholders: - - `<your-arangodb-platform-url>`: Your ArangoDB Platform URL. - - `<url-postfix>`: The URL postfix configured in your deployment. - - - The service will: - - Process the document using the configured LLM model. - - Generate embeddings using the embedding model. - - Build a knowledge graph. - - Import the graph into your ArangoDB database. - -## Verifying the import - -You can verify the state of the import process via the following endpoint: - -``` -GET /gen-ai/v1/project_by_name/<your_project> -``` - -For example, the `status` object found within `importerServices` may contain the following -properties: - -```json -"status": { - "status": "service_completed", - "progress": 100, - "message": "" -} -``` - -Alternatively, you can also see if the import was successful by checking your ArangoDB database: - -1. Connect to your ArangoDB instance. -2. Navigate to the specified database. -3. Verify that the following collections exist: - - `knowledge_graph_vertices`: Contains the nodes of the knowledge graph i.e. documents, chunks, communities, and entities. - - `knowledge_graph_edges`: Contains the relationships between nodes i.e. relations. - - -## What ArangoDB Collections look like after import - -The Importer creates several collections in ArangoDB to store different -aspects of your knowledge graph. See below a detailed explanation of each -collection. All collections are using the name of your project as a prefix. - -### Documents collection - -- **Purpose**: Stores the original text document that were processed. -- **Key Fields**: - - `_key`: Unique identifier for the document. - - `content`: The full text content of the document. -- **Usage**: Acts as the root level container for all document-related data. - -### Chunks Collection - -- **Purpose**: Stores text chunks extracted from documents for better processing and analysis. -- **Key Fields**: - - `_key`: Unique identifier for the chunk. - - `content`: The text content of the chunk. - - `tokens`: Number of tokens in the chunk. - - `chunk_order_index`: Position of the chunk in the original document. -- **Usage**: Enables granular analysis of document content and maintains document structure. - -### Entities Collection - -- **Purpose**: Stores entities extracted from the text, such as persons, organizations, concepts, etc. -- **Key Fields**: - - `_key`: Unique identifier for the entity. - - `entity_name`: Name of the entity. - - `entity_type`: Type of entity (e.g., person, organization). - - `description`: Description of the entity. - - `embedding`: Vector representation of the entity for similarity search. - - `clusters`: Community clusters the entity belongs to. -- **Usage**: Enables entity-based querying and semantic search. - -### Communities Collection - -- **Purpose**: Stores thematic clusters of related entities that form meaningful - communities within your documents. Each community represents a cohesive group - of concepts, characters, or themes that are closely related and interact with - each other. These communities help identify and analyze the main narrative - threads, character relationships, and thematic elements in your documents. -- **Key Fields**: - - `_key`: Unique identifier for the community. - - `title`: Cluster ID to which this community belongs to. - - `report_string`: A detailed markdown-formatted analysis that explains the - community's theme, key relationships, and significance. This includes - sections on main characters, their roles, relationships, and the impact of key events or locations. - - `report_json`: Structured data containing: - - `title`: The main theme or focus of the community. - - `summary`: A concise overview of the community's central narrative. - - `rating`: A numerical score indicating the community's significance (the higher, the better). - - `rating_explanation`: Justification for the rating. - - `findings`: An array of detailed analyses, each containing a summary and explanation of key aspects. - - `level`: The hierarchical level of the community (e.g., `1` for top-level communities). - - `occurrence`: A normalized score (ranging from `0` to `1`) showing the relative frequency with which this community is mentioned or identified throughout your documents. A value close to 1 means this community is very common in your data and a value near `0` means it is rare. - - `sub_communities`: References to more specific sub-communities that are part of this larger community. -- **Usage**: Enables you to: - - Identify and analyze major narrative threads and themes. - - Understand complex relationships between characters and concepts. - - Track the significance and impact of different story elements. - - Navigate through hierarchical relationships between themes. - - Discover patterns and recurring elements in your documents. - -### Relations Collection - -- **Purpose**: Stores relationships between different nodes in the graph. -- **Key Fields**: - - `_from`: Source node reference. - - `_to`: Target node reference. - - `type`: Type of relationship (e.g., **PART_OF**, **MENTIONED_IN**, **RELATED_TO**, **IN_COMMUNITY**). - - Additional metadata depending on relationship type (Entity to Entity): - - `weight`: Relationship strength (the higher, the better). - - `description`: Description of the relationship. - - `source_id`: Source of the relationship. - - `order`: Order of the relationship. -- **Usage**: Enables traversal and analysis of relationships between different elements. - -### Relationship Types - -The system creates several types of relationships between nodes: - -1. **PART_OF**: Links chunks to their parent documents. -2. **MENTIONED_IN**: Connects entities to the chunks where they are mentioned. -3. **RELATED_TO**: Shows relationships between different entities. -4. **IN_COMMUNITY**: Associates entities with their community groups. - -### Vector Search Capabilities - -The system automatically creates vector indexes on the `embedding` field in the Entities collection, enabling: -- Semantic similarity search -- Nearest neighbor queries -- Efficient vector-based retrieval - -## API Reference - -For detailed API documentation, see the -[GraphRAG Importer API Reference](https://arangoml.github.io/platform-dss-api/graphrag_importer/proto/index.html). diff --git a/site/content/platform/data-science/graphrag/services/mlflow.md b/site/content/platform/data-science/graphrag/services/mlflow.md deleted file mode 100644 index 8c13b18421..0000000000 --- a/site/content/platform/data-science/graphrag/services/mlflow.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: ArangoDB MLflow Service -menuTitle: MLflow -description: >- - The ArangoDB MLflow Service integrates the MLflow platform for managing the - full machine learning lifecycle into the ArangoDB Platform -weight: 25 ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Overview - -The ArangoDB MLflow service is a service that hosts the official MLflow -application in your Kubernetes cluster and connects automatically to the -ArangoDB environment, e.g. for registering the LLM to be self-hosted and -used by services requiring LLMs (such as the Importer and Retriever services). - -MLflow is an open-source platform, purpose-built to assist machine learning -practitioners and teams in handling the complexities of the machine learning -process. It focuses on the full lifecycle for machine learning projects, ensuring -that each phase is manageable, traceable, and reproducible. - -The main purpose of the ArangoDB's MLflow integration is to provide a seamless -experience to manage your machine learning models and experiments within the -ArangoDB environment. For example, any spawned LLM host service is automatically -linked to the MLflow service and is able to fetch any registered model from the -MLflow model registry. - -{{< tip >}} -ArangoDB's MLflow integration is only required when working with private LLMs. -For more information, see the [Triton LLM host](triton-inference-server.md) -documentation. -{{< /tip >}} - -{{< info >}} -You can find detailed instructions about how to organize the format of a model for a -dedicated LLM host service in the official [MLflow](https://mlflow.org/docs/latest/index.html) -documentation. -{{< /info >}} - -## Core components - -MLflow consists of the following core components: - -- **Model Registry**: A centralized model store, set of APIs, and UI to - collaboratively manage the full lifecycle of an MLflow Model, including - model lineage, versioning, stage transitions, and annotations. -- **Experiment Tracking**: Provides an API and UI for logging parameters, - code versions, metrics, and artifacts during the ML process, allowing - for comparison of multiple runs across different users. -- **Model Packaging**: Offers a standard format for packaging models from any framework. -- **Serving**: Facilitates the deployment of models to various platforms. - Within the ArangoDB environment, this enables the integration with services that utilize self-hosted LLMs. -- **Evaluation**: Provides tools for in-depth model analysis, facilitating objective model comparison. -- **Observability**: Ensures that the ML lifecycle is traceable and reproducible through various metrics and logs. - -## Quickstart - -The ArangoDB MLflow service is **started by default**. - -It is automatically spawned and available at the following URL: - -``` -https://<ExternalEndpoint>:8529/mlflow/ -``` - -You can interact with the ArangoDB MLflow service in two ways: -- **Programmatically**: Using the official MLflow client -- **Web Interface**: Directly through your browser at the URL above - -To use the programmatic API, please use the **official MLflow client**. - -{{< info >}} -The ArangoDB MLflow service requires authentication. You need a valid -Bearer token to access the service. -{{< /info >}} - -### Obtaining a Bearer Token - -Before you can authenticate with the MLflow service, you need to obtain a -Bearer token. You can generate this token using the ArangoDB authentication API: - -```bash -curl -X POST https://<ExternalEndpoint>:8529/_open/auth \ - -d '{"username": "your-username", "password": "your-password"}' -``` - -This returns a JWT token that you can use as your Bearer token. -For more details about ArangoDB authentication and JWT tokens, see the -[ArangoDB Authentication](../../../../3.12/develop/http-api/authentication.md/#jwt-user-tokens) -documentation. - -## Installation - -First, install the MLflow client: - -```bash -pip install mlflow=2.22.1 -``` -{{< warning >}} -MLflow version 3 introduces a breaking change that affects this workflow, so it is -important to use MLflow version 2. -{{< /warning >}} - -There are two approaches for programmatic access to your ArangoDB MLflow service: -- Configuration in Python -- Using environment variables - -### Configuration in Python - -```python -import mlflow -import os - -# Set authentication and tracking URI -os.environ['MLFLOW_TRACKING_TOKEN'] = 'your-bearer-token-here' -mlflow.set_tracking_uri("https://<ExternalEndpoint>:8529/mlflow/") - -# Start logging your experiments -with mlflow.start_run(): - mlflow.log_artifact("local_file.txt") -``` - -### Using environment variables - -Set the environment variables in your shell: - -```bash -export MLFLOW_TRACKING_URI="https://<ExternalEndpoint>:8529/mlflow/" -export MLFLOW_TRACKING_TOKEN="your-bearer-token-here" -``` - -Then use MLflow normally in your Python code: - -```python -import mlflow - -# MLflow automatically uses the environment variables -with mlflow.start_run(): - mlflow.log_artifact("local_file.txt") -``` - -## Health check - -To test whether the service is running, you can use the following snippet: - -```bash -curl -H "Authorization: Bearer your-bearer-token-here" https://<ExternalEndpoint>:8529/mlflow/health -``` - -Expected output on success: HTTP `200` status with response body `OK`. - -## API Reference - -For detailed API documentation, refer to the official -[MLflow REST API Reference](https://mlflow.org/docs/latest/api_reference/rest-api.html). diff --git a/site/content/platform/data-science/graphrag/services/natural-language-to-aql.md b/site/content/platform/data-science/graphrag/services/natural-language-to-aql.md deleted file mode 100644 index 6d2610dfe0..0000000000 --- a/site/content/platform/data-science/graphrag/services/natural-language-to-aql.md +++ /dev/null @@ -1,241 +0,0 @@ ---- -title: Natural Language to AQL Translation Service (txt2aql) -menuTitle: txt2aql -description: >- - The Natural Language to AQL Translation Service is a powerful tool that allows - you to interact with your ArangoDB database using natural language queries -weight: 20 -draft: true # Not available in pre-release ---- -## Overview - -This service translates your questions and commands into AQL (ArangoDB Query Language), -executes the queries, and provides responses in natural language. - -## Features - -- Natural language to AQL query translation -- Support for multiple LLM providers (via OpenAI API or a self-hosted Triton Inference Server) -- RESTful and gRPC interfaces -- Health monitoring endpoints -- Flexible output formats (Natural Language, AQL, JSON) - -## Getting Started - -### Prerequisites - -- ArangoDB instance -- OpenAI API key (if using OpenAI as provider) -- Triton URL and model name (if using Triton as provider) - - -### Configuration - -The following environment variables are set at installation time and used at runtime: - -```bash -# Required Database Configuration -ARANGODB_NAME=<your_database_name> -ARANGODB_USER=<your_username> - -# LLM Provider Configuration -API_PROVIDER=<provider> # "openai" or "triton" - -# If using OpenAI -OPENAI_API_KEY=<your_api_key> -OPENAI_MODEL=<model_name> # Optional, defaults to GPT-4 -OPENAI_TEMPERATURE=<temperature> # Optional -OPENAI_MAX_RETRIES=<retries> # Optional - -# If using Triton -TRITON_URL=<triton_server_url> -TRITON_MODEL=<model_name> -TRITON_TIMEOUT=<timeout_seconds> # Optional -``` - -### Starting the Service - -To start the service, use GenAI service endpoint `CreateGraphRag`. Please refer to the documentation of GenAI service for more information on how to use it. - -### Required Parameters - -These parameters must be provided in the install request sent to GenAI service. - -- `username`: Database username for authentication -- `db_name`: Name of the ArangoDB database -- `api_provider`: LLM provider selection (`openai`, `triton`) - -### Provider-Specific Required Parameters - -#### OpenAI Provider - -- `openai_api_key`: API key for OpenAI authentication -- `openai_model`: Model name (defaults to "gpt-3.5-turbo" if not specified) - -#### Triton Provider - -- `triton_url`: URL of the Triton inference server -- `triton_model`: Model name to use with Triton - -## API Reference - -### REST Endpoints - -1. **Process Text** - Ask general questions to the LLM and get a natural language response. This endpoint does not query the database. - ```bash - POST /v1/process_text - Content-Type: application/json - - { - "input_text": "What are the advantages of graph databases?" - } - ``` - -2. **Translate Query** - Convert natural language to AQL and query the database - ```bash - POST /v1/translate_query - Content-Type: application/json - - { - "input_text": "Find all users who are friends with John", - "options": { - "output_formats": ["NL", "AQL", "JSON"] - } - } - ``` - -3. **Health Check** - Monitor service health - ```bash - GET /v1/health - ``` - -### gRPC Endpoints - -The service also provides gRPC endpoints for more efficient communication: - -1. **Process Text** - ```bash - grpcurl -plaintext -d '{"input_text": "Hello world"}' \ - localhost:9090 txt2aql.Txt2AqlService/ProcessText - ``` - -2. **Translate Query** - ```bash - grpcurl -plaintext -d '{ - "input_text": "Find all characters from House Stark", - "options": { - "output_formats": ["NL","AQL","JSON"] - } - }' localhost:9090 txt2aql.Txt2AqlService/TranslateQuery - ``` - -3. **Health Check** - ```bash - grpcurl -plaintext localhost:9090 txt2aql.Txt2AqlService/HealthCheck - ``` - -## Output Formats - -The `translate_query` endpoint of the txt2aql service supports multiple output formats that can be specified in the `output_formats` field of your request. Each format serves a different purpose and can be used individually or in combination: - -### Natural Language (NL) - -- **Format identifier**: `"NL"` -- **Returns**: A human-readable explanation of the query results -- **Helpful for**: Understanding what the query found in plain English -- **Example**: - - **Input**: `Find all users who are friends with John` - - **Output**: `I found 3 users who are friends with John, including Alice, Bob, and Carol` - -### AQL Query (AQL) - -- **Format identifier**: `"AQL"` -- **Returns**: The generated ArangoDB Query Language (AQL) query -- **Useful for**: - - Debugging query translation - - Learning AQL syntax - - Modifying queries for reuse -- **Shows**: Exactly how your natural language was translated into database operations -- **Example**: - - **Input**: `Find all users who are friends with John` - - **Output**: `FOR u IN users FILTER u.friends ANY == 'John' RETURN u` - -### JSON Results (JSON) - -- **Format identifier**: `"JSON"` -- **Returns**: The raw query results in JSON format -- **Provides**: Direct access to the complete dataset -- **Ideal for**: - - Programmatic processing - - Data integration - - Custom formatting needs -- **Example**: - - **Input**: `Find all users who are friends with John` - - **Output**: `[{"name":"Alice","age":30},{"name":"Bob","age":25},{"name":"Carol","age":35}]` - -### Example Response - -```json -{ - "original_query": "Find all users who are friends with John", - "nl_response": "I found 3 users who are friends with John: Alice, Bob, and Carol", - "aql_query": "FOR u IN users FILTER u.friends ANY == 'John' RETURN u", - "aql_result": "[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25},{\"name\":\"Carol\",\"age\":35}]" -} -``` - -### Usage Tips - -1. Request only the formats you need to minimize response size and processing time -2. Use `NL` for user interfaces, human consumption or when wrapped as an LLM-callable function (e.g. in LLM agent frameworks) -3. Use `AQL` for debugging and learning purposes -4. Use `JSON` for programmatic data processing such as API calls. - -### Default Behavior - -- If no output formats are specified, the service defaults to `NL` format only -- Multiple formats can be requested simultaneously -- Formats are processed efficiently, with results cached where possible - -## Error Handling - -The service provides clear error messages for common issues: - -- Invalid or missing environment variables -- Database connection failures -- Authentication errors -- Invalid query formats -- LLM provider errors - -Error responses include appropriate HTTP status codes and descriptive messages. - -## Best Practices - -1. Be specific in your queries to get more accurate translations -2. Use appropriate output formats based on your needs -3. Monitor the health endpoint for service status -4. Implement proper error handling in your client applications -5. Use connection pooling for better performance -6. Consider rate limiting for production deployments - -## Troubleshooting - -Common issues and solutions: - -1. **Connection Issues** - - Verify ARANGODB_ENDPOINT is accessible - - Check network/firewall settings - - Ensure proper authentication credentials - -2. **Query Translation Issues** - - Make queries more specific - - Check LLM provider configuration - - Verify database schema matches query context - - The quality of the generated AQL may vary depending on the LLM model used. - Therefore we recommend using an AQL-capable coding model (e.g. a frontier AQL-capable - LLM or a fine-tuned AQL-capable coding model) for better results. - -## API Reference - -For detailed API documentation, see the -[Natural Language Service API Reference](https://arangoml.github.io/platform-dss-api/natural-language-service/proto/index.html). diff --git a/site/content/platform/data-science/graphrag/services/retriever.md b/site/content/platform/data-science/graphrag/services/retriever.md deleted file mode 100644 index 0683d5beaa..0000000000 --- a/site/content/platform/data-science/graphrag/services/retriever.md +++ /dev/null @@ -1,269 +0,0 @@ ---- -title: Retriever Service -menuTitle: Retriever -description: >- - The Retriever is a powerful service that enables intelligent search and - retrieval from knowledge graphs created by the Importer service -weight: 15 ---- - -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Overview - -The Retriever service offers two distinct search methods: -- **Global search**: Analyzes entire document to identify themes and patterns, - perfect for high-level insights and comprehensive summaries. -- **Local search**: Focuses on specific entities and their relationships, ideal - for detailed queries about particular concepts. - -The service supports both private (Triton Inference Server) and public (OpenAI) -LLM deployments, making it flexible for various security and infrastructure -requirements. With simple HTTP endpoints, you can easily query your knowledge -graph and get contextually relevant responses. - -**Key features:** -- Dual search methods for different query types -- Support for both private and public LLM deployments -- Simple REST API interface -- Integration with ArangoDB knowledge graphs -- Configurable community hierarchy levels - -{{< tip >}} -You can also use the GraphRAG Retriever service via the ArangoDB [web interface](../web-interface.md). -{{< /tip >}} - -## Search methods - -The Retriever service enables intelligent search and retrieval of information -from your knowledge graph. It provides two powerful search methods, global Search -and local Search, that leverage the structured knowledge graph created by the Importer -to deliver accurate and contextually relevant responses to your natural language queries. - -### Global search - -Global search is designed for queries that require understanding and aggregation -of information across your entire document. It's particularly effective for questions -about overall themes, patterns, or high-level insights in your data. - -- **Community-Based Analysis**: Uses pre-generated community reports from your - knowledge graph to understand the overall structure and themes of your data, -- **Map-Reduce Processing**: - - **Map Stage**: Processes community reports in parallel, generating intermediate responses with rated points. - - **Reduce Stage**: Aggregates the most important points to create a comprehensive final response. - -**Best use cases**: -- "What are the main themes in the dataset?" -- "Summarize the key findings across all documents" -- "What are the most important concepts discussed?" - -### Local search - -Local search focuses on specific entities and their relationships within your -knowledge graph. It is ideal for detailed queries about particular concepts, -entities, or relationships. - -- **Entity Identification**: Identifies relevant entities from the knowledge graph based on the query. -- **Context Gathering**: Collects: - - Related text chunks from original documents. - - Connected entities and their strongest relationships. - - Entity descriptions and attributes. - - Context from the community each entity belongs to. -- **Prioritized Response**: Generates a response using the most relevant gathered information. - -**Best use cases**: -- "What are the properties of [specific entity]?" -- "How is [entity A] related to [entity B]?" -- "What are the key details about [specific concept]?" - -## Installation - -The Retriever service can be configured to use either the Triton Inference Server -(for private LLM deployments) or OpenAI/OpenRouter (for public LLM deployments). - -To start the service, use the GenAI service endpoint `/v1/graphragretriever`. -Please refer to the documentation of [GenAI service](gen-ai.md) for more -information on how to use it. - -### Using Triton Inference Server (Private LLM) - -The first step is to install the LLM Host service with the LLM and -embedding models of your choice. The setup will the use the -Triton Inference Server and MLflow at the backend. -For more details, please refer to the [Triton Inference Server](triton-inference-server.md) -and [Mlflow](mlflow.md) documentation. - -Once the `llmhost` service is up-and-running, then you can start the Importer -service using the below configuration: - -```json -{ - "env": { - "username": "your_username", - "db_name": "your_database_name", - "api_provider": "triton", - "triton_url": "your-arangodb-llm-host-url", - "triton_model": "mistral-nemo-instruct" - }, -} -``` - -Where: -- `username`: ArangoDB database user with permissions to access collections. -- `db_name`: Name of the ArangoDB database where the knowledge graph is stored. -- `api_provider`: Specifies which LLM provider to use. -- `triton_url`: URL of your Triton Inference Server instance. This should be the URL where your `llmhost` service is running. -- `triton_model`: Name of the LLM model to use for text processing. - -### Using OpenAI (Public LLM) - -```json -{ - "env": { - "openai_api_key": "your_openai_api_key", - "username": "your_username", - "db_name": "your_database_name", - "api_provider": "openai" - }, -} -``` - -Where: -- `username`: ArangoDB database user with permissions to access collections. -- `db_name`: Name of the ArangoDB database where the knowledge graph is stored. -- `api_provider`: Specifies which LLM provider to use. -- `openai_api_key`: Your OpenAI API key. - -{{< info >}} -By default, for OpenAI API, the service is using -`gpt-4o-mini` and `text-embedding-3-small` models as LLM and -embedding model respectively. -{{< /info >}} - -### Using OpenRouter (Gemini, Anthropic, etc.) - -OpenRouter makes it possible to connect to a huge array of LLM API providers, -including non-OpenAI LLMs like Gemini Flash, Anthropic Claude and publicly hosted -open-source models. - -When using the OpenRouter option, the LLM responses are served via OpenRouter while -OpenAI is used for the embedding model. - -```json - { - "env": { - "db_name": "your_database_name", - "username": "your_username", - "api_provider": "openrouter", - "openai_api_key": "your_openai_api_key", - "openrouter_api_key": "your_openrouter_api_key", - "openrouter_model": "mistralai/mistral-nemo" // Specify a model here - }, - } -``` - -Where: -- `username`: ArangoDB database user with permissions to access collections. -- `db_name`: Name of the ArangoDB database where the knowledge graph is stored. -- `api_provider`: Specifies which LLM provider to use. -- `openai_api_key`: Your OpenAI API key (for the embedding model). -- `openrouter_api_key`: Your OpenRouter API key (for the LLM). -- `openrouter_model`: Desired LLM (optional; default is `mistral-nemo`). - -{{< info >}} -When using OpenRouter, the service defaults to `mistral-nemo` for generation -(via OpenRouter) and `text-embedding-3-small` for embeddings (via OpenAI). -{{< /info >}} - -## Executing queries - -After the Retriever service is installed successfully, you can interact with -it using the following HTTP endpoints, based on the selected search method. - -{{< tabs "executing-queries" >}} - -{{< tab "Local search" >}} -```bash -curl -X POST /v1/graphrag-query \ - -H "Content-Type: application/json" \ - -d '{ - "query": "What is the AR3 Drone?", - "query_type": 2, - "provider": 0 - }' -``` -{{< /tab >}} - -{{< tab "Global search" >}} - -```bash -curl -X POST /v1/graphrag-query \ - -H "Content-Type: application/json" \ - -d '{ - "query": "What is the AR3 Drone?", - "level": 1, - "query_type": 1, - "provider": 0 - }' -``` -{{< /tab >}} - -{{< /tabs >}} - -The request parameters are the following: -- `query`: Your search query text. -- `level`: The community hierarchy level to use for the search (`1` for top-level communities). -- `query_type`: The type of search to perform. - - `1`: Global search. - - `2`: Local search. -- `provider`: The LLM provider to use - - `0`: OpenAI (or OpenRouter) - - `1`: Triton - -## Health check - -You can also monitor the service health: - -```bash -GET /v1/health -``` - -## Verify status - -You can verify the state of the retriever process via the following endpoint: - -``` -GET /gen-ai/v1/project_by_name/<your_project> -``` - -For example, the `status` object found within `retrieverServices` may contain the following -properties: - -```json -"status": { - "status": "service_started", - "progress": 100, -} -``` - -## Best Practices - -- **Choose the right search method**: - - Use global search for broad, thematic queries. - - Use local search for specific entity or relationship queries. - - -- **Performance considerations**: - - Global search may take longer due to its map-reduce process. - - Local search is typically faster for concrete queries. - -## API Reference - -For detailed API documentation, see the -[GraphRAG Retrievers API Reference](https://arangoml.github.io/platform-dss-api/graphrag_retrievers/proto/index.html). diff --git a/site/content/platform/data-science/graphrag/services/triton-inference-server.md b/site/content/platform/data-science/graphrag/services/triton-inference-server.md deleted file mode 100644 index 23f1c2894c..0000000000 --- a/site/content/platform/data-science/graphrag/services/triton-inference-server.md +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: Triton LLM Host -menuTitle: Triton LLM Host -description: >- - Enable your GraphRAG pipeline to use private LLMs via Triton Inference Server -weight: 30 ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Overview - -The **Triton LLM Host** service provides scalable deployment of Large Language -Models (LLMs) using the NVIDIA Triton Inference Server. It efficiently serves -machine learning models with support for HTTP and gRPC APIs, customizable routing, -and seamless Kubernetes integration. - -## Workflow - -The Triton LLM Host enables your GraphRAG pipeline to use privately hosted -LLMs directly from the ArangoDB Platform environment. The process involves the -following steps: - -1. Install the Triton LLM Host service. -2. Register your LLM model to MLflow by uploading the required files. -3. Configure the [Importer](importer.md#using-triton-inference-server-private-llm) service to use your LLM model. -4. Configure the [Retriever](retriever.md#using-triton-inference-server-private-llm) service to use your LLM model. - -{{< tip >}} -Check out the dedicated [ArangoDB MLflow](mlflow.md) documentation page to learn -more about the service and how to interact with it. -{{< /tip >}} - -## Deployment - -The Triton LLM Host service is deployed as a **Kubernetes application** using Helm charts in -the ArangoDB Platform ecosystem. It integrates with the: -- MLFlow model registry for model management. -- Storage sidecar for artifact storage. - -## Installation via GenAI Service API - -To install the Triton LLM Host service, send an API request to the -**GenAI service** using the following parameters: - -### Required parameters - -```json -{ - "models": "model_name", -} -``` -You can also specify multiple models: -- Without versions: `"model_name_1, model_name_2"` -- With versions: `"model_name_1@version1, model_name_2@version2"` -- Mixed: `"model_name_1, model_name_2@version4"` - -### Optional parameters - -```json -{ - "log_level": "INFO", - "profiles": "profile1,profile2" - "resources_requests_memory": "", // Minimum memory required for the container - "resources_requests_cpu": "", // Minimum CPU required for the container - "resources_limits_memory": "", // Maximum memory the container can use - "resources_limits_cpu": "", // Maximum CPU the container can use - "resources_requests_ephemeral_storage": "", // Minimum ephemeral storage required for the container - "resources_limits_ephemeral_storage": "" // Maximum ephemeral storage the container can use -} -``` - -### Parameter descriptions - -| Parameter | Required | Description | Example | -|-----------|----------|-------------|---------| -| `models` | ✅ | Comma-separated list of model_name@version pairs | `"mistral@1,t5@3"` | -| `resources_requests_memory` | ❌ | Minimum memory required | `"8Gi"` | -| `resources_requests_cpu` | ❌ | Minimum CPU cores required | `"2"` | -| `resources_limits_memory` | ❌ | Maximum memory allowed | `"16Gi"` | -| `resources_limits_cpu` | ❌ | Maximum CPU cores allowed | `"4"` | -| `log_level` | ❌ | Logging level | `"INFO"` (default) | -| `profiles` | ❌ | Platform profiles to apply | `"gpu,performance"` | - -## Model requirements - -### Python Backend - -All models **must use the Python backend** to ensure compatibility with the -Triton service. Each model requires the following two files: - -1. **`model.py`** - Implements the Python backend model. Triton uses this file to load and - execute your model for inference. - ```python - class TritonPythonModel: - def initialize(self, args): - # Load your model here - pass - - def execute(self, requests): - # Process inference requests - pass - - def finalize(self): - # Cleanup resources - pass - ``` - -2. **`config.pbtxt`** - This is the Triton model configuration file that defines essential parameters - such as the model name, backend, and input/output tensors. - ``` - name: "your_model_name" - backend: "python" - max_batch_size: 1 - input: [...] - output: [...] - ``` - -## Model management with MLflow - -{{< info >}} -To prepare your Python backend model for the Triton LLM Host, you must first -register it in MLflow. The Triton LLM Host service automatically downloads -and load models from the MLflow registry. -{{< /info >}} - -### How to register a model in MLflow - -Registering a Python backend model in MLflow involves packaging your -`model.py` and `config.pbtxt` files and passing them as an artifact. The Triton -service will look for a directory named after your model (e.g., `my-private-llm-model`) -within the MLflow registry store and expects to find the `model.py` and `config.pbtxt` -files inside it. - -```py -try: - mlflow.set_tracking_uri(MLFLOW_SERVICE_URI) - with mlflow.start_run() as run: - run_id = run.info.run_id - model_uri = f"runs:/{run_id}/model" - mlflow.register_model(model_uri=model_uri, name=model_name) - # Log the entire model directory as an artifact, preserving the Triton structure - mlflow.log_artifact(local_path=str(local_model_dir)) -``` - -## Service endpoints - -Once deployed, the service exposes two endpoints: - -| Port | Protocol | Purpose | -|------|----------|---------| -| 8000 | HTTP/REST | Model inference, management, status | -| 8001 | gRPC | High-performance binary communication | - - -{{< info >}} -The Triton Inference Server is not intended to be used in a standalone mode. -Instead, other services consume these endpoints to send inference -requests for example. Refer to the specific service with which you are using -Triton Inference Server for more details. -{{< /info >}} - -- **Internal access (within ArangoDB Platform)**: - `https://{SERVICE_ID}.{KUBERNETES_NAMESPACE}.svc:8000` - - `KUBERNETES_NAMESPACE` is available as an environment variable. - - `SERVICE_ID` is returned by the GenAI service API. - - **Example**: - To check server health: - `GET https://{SERVICE_ID}.{KUBERNETES_NAMESPACE}.svc:8000/v2/health/ready` - -- **External access (outside ArangoDB Platform)**: - `https://{BASE_URL}:8529/llm/{SERVICE_POSTFIX}/` - - `BASE_URL`: Your ArangoDB Platform base URL. - - `SERVICE_POSTFIX`: Last 5 characters of the service ID. - - **Example**: - To check server health: - `GET https://{BASE_URL}:8529/llm/{SERVICE_POSTFIX}/v2/health/ready` - -{{< info >}} -Only HTTP protocol is supported for external access (outside the ArangoDB -Platform). For gRPC, use internal endpoints. This limitation applies to model -inference, model management, model status, and health check endpoints. -{{< /info >}} - -## Triton Inference Server API - -For complete documentation on available endpoints and their usage, -refer to the [Triton Inference Server HTTP API](https://docs.nvidia.com/deeplearning/triton-inference-server/archives/triton_inference_server_1120/triton-inference-server-guide/docs/http_grpc_api.htm) documentation. \ No newline at end of file diff --git a/site/content/platform/data-science/graphrag/tutorial-notebook.md b/site/content/platform/data-science/graphrag/tutorial-notebook.md deleted file mode 100644 index db6b278b9f..0000000000 --- a/site/content/platform/data-science/graphrag/tutorial-notebook.md +++ /dev/null @@ -1,412 +0,0 @@ ---- -title: GraphRAG Notebook Tutorial -menuTitle: Notebook Tutorial -description: >- - Building a GraphRAG pipeline using ArangoDB's integrated notebook servers -weight: 10 ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## Tutorial overview - -This tutorial guides you through the process of building a -Graph-based Retrieval Augmented Generation (GraphRAG) pipeline using -ArangoDB's integrated Notebook servers. GraphRAG is an advanced framework that -combines the power of knowledge graphs (KGs) and large language models (LLMs) -to provide precise and contextually relevant responses from unstructured text data. - -You will learn how to: -- Prepare your raw text data (PDFs in this case) into a structured format - suitable for Knowledge Graph extraction using Docling. -- Utilize the ArangoDB Importer service to automatically extract - entities and relationships from your prepared text and store them as a - Knowledge Graph in ArangoDB. -- Query your newly created Knowledge Graph using the ArangoDB Retriever - service for both broad (global) and targeted (local) information retrieval. -- Set up a simple Gradio interface to interact with your GraphRAG pipeline. - -## Prerequisites - -Before you begin, ensure you have the following: -- **ArangoDB deployment:** Access to an ArangoDB deployment where you can - create and manage databases. You need the endpoint, your username, and - write access to your chosen database. -- **Python environment:** A Python 3.x environment with `pip` installed. -- **Jupyter Notebook:** This tutorial is designed to be run in ArangoDB's integrated - Notebook servers. -- **OpenAI API key (optional):** If you plan to use OpenAI's models for LLM - processing, you need an OpenAI API key. - -## Environment setup - -This section covers installing necessary libraries, importing Python modules, -and setting up the network functions for interacting with ArangoDB services. - -### Install required libraries - -First, install all the Python libraries necessary for PDF parsing, Markdown -conversion, and interacting with the ArangoDB GraphRAG services. - -```py -! pip install fitz -! pip install PyMuPDF -! pip install PyPDF2 -! pip install markdownify -! pip install docling==2.26.0 -! pip install gradio -``` - -### Import required Python libraries - -Next, import the specific modules and functions used throughout the tutorial. - -```py -import fitz -import requests -import base64 -import os -import re -from PyPDF2 import PdfReader -from docling.document_converter import DocumentConverter -from markdownify import markdownify as md -from typing import Dict, Optional -from pprint import pprint -import time -``` - -## Step 1: Prepare your document - -{{< warning >}} -GraphRAG currently supports `.txt` and `.md` formats only. If your document is -in `.pdf` format, you must convert it into a structured Markdown format using Docling. - -You can only import one file using the pre-release version of ArangoDB GraphRAG. -Importing another file overwrites the knowledge graph. -{{< /warning >}} - -[Docling](https://docling-project.github.io/docling/) from IBM is an AI-based PDF -parsing tool designed to convert complex PDFs into Markdown. This conversion is -crucial for efficient extraction of entities and relationships in the next stage. - -The following process creates a Markdown file for you (e.g., `AliceInWonderland_docling.md`) -from your PDF. The file is automatically added in the file browser of the Jupyter -notebook interface. - -```py -# --- Configuration for your document and database --- -DB_NAME = "documentation" # Set the name of the ArangoDB database you will use for your knowledge graph. Ensure this database already exists in your ArangoDB Deployment. -FILE_NAME = "AliceInWonderland" # Specify the base name of your input file (e.g., 'AliceInWonderland' for 'AliceInWonderland.pdf'). -PDF_NAME=f"./{FILE_NAME}.pdf" # Update the file path and extension if your input document is not a PDF or has a different name. -# ---------------------------------------------------- - -%%time - -def pdf_to_markdown_docling(pdf_file): - """Converts a PDF file to Markdown using Docling.""" - converter = DocumentConverter() - result = converter.convert(pdf_file) - output_md_file = pdf_file.replace(".pdf", "_docling.md") - with open(output_md_file, "w", encoding="utf-8") as md_file: - md_file.write(result.document.export_to_markdown()) - print(f"Successfully converted {pdf_file} to {output_md_file}") - -try: - pdf_to_markdown_docling(PDF_NAME) -except Exception as e: - print(f"An error occurred during PDF to Markdown conversion: {e}") -``` - -The next step is to encode the content of the Markdown file into Base64, -which is required for the Importer service. - -```py -%%time - -def encode_file_content(file_path: str) -> Optional[str]: - """Encodes the file content to Base64.""" - try: - with open(file_path, "rb") as file: - encoded_content = base64.b64encode(file.read()).decode("utf-8") - print(f"Successfully encoded file: {file_path}") - return encoded_content - except FileNotFoundError: - print(f"File not found: {file_path}") - except Exception as e: - print(f"Error reading file {file_path}: {e}") - return None - -file_content = encode_file_content(f"./{FILE_NAME}_docling.md") -``` - -## Step 2: Import your document to generate the Knowledge Graph - -Once your document is prepared, you can start the Importer service. This -service takes your processed Markdown content, extracts entities and relationships, -and then stores this structured information as a Knowledge Graph within -your specified ArangoDB database. - -### Start the Importer service - -Start the Importer service providing the necessary configuration -parameters. - -```py -%%time - -# Start the GraphRAG Importer service -importer_config = { - "db_name": DB_NAME, - "username": os.environ["USERNAME"], - "api_provider": "openai", # Switch the provider if needed - "openai_api_key": os.environ["OPENAI_API_KEY"], # Required if api_provider is 'openai' -} - -response = start_service("arangodb-graphrag-importer", importer_config) -pprint(response) - -# Extract the service ID for future reference -importer_service_id = response["serviceInfo"]["serviceId"].split("-")[-1] -print(f"Importer Service ID: {importer_service_id}") -``` - -### Submit your document - -With the importer service running, submit your Base64 encoded Markdown file. -The service will process it in the background to build the Knowledge Graph. - -{{< info >}} -This process can take some time depending on the document's size and complexity. -{{< /info >}} - -```py -%%time - -# Submit the prepared file to generate the Knowledge Graph -importer_payload = { - "file_name": FILE_NAME, - "file_content": file_content, -} - -importerResponse = send_request(f"/graphrag/importer/{importer_service_id}/v1/import", importer_payload, "POST") -pprint(importerResponse) -``` - -### Visualize and interact with the Knowledge Graph - -Once the importer service has processed the document, you can visualize and -interact with the generated Knowledge Graph using the [Graph Visualizer](../../graph-intelligence/graph-visualizer.md) -directly from the ArangoDB Platform web interface. - -1. In the ArangoDB Platform web interface, select the database you have previously used. -2. Click **Graphs** in the main navigation. -3. Select the graph named **Knowledge Graph** from the list. -4. The viewport of the Graph Visualizer opens for exploring the graph. -5. In the AQL editor, use the following query to explore communities and - entities: - ```aql - FOR c IN Communities - FILTER c._key == "0" - FOR v,e,p IN 1 INBOUND c GRAPH "KnowledgeGraph" - RETURN p - ``` - -You can also configure the display options: -- Set all **Nodes** collections (e.g., Communities, Entities) to a different color. -- Set the **Communities** label to `title`. -- Set the **Entities** label to `entity_name`. -- For **Edges** (relations), set the label to `type`. - -## Step 3: Query the Knowledge Graph with the Retriever service - -To retrieve information from the Knowledge Graph, you need to deploy the -Retriever service. This service interacts with your Knowledge Graph -and uses an LLM to formulate answers to your queries. - -### Startup parameters - -- `api_provider`: Defines to which LLM provider you want to connect (e.g., `openai`). -- `openai_api_key`: An API key for usage with ChatGPT. This is only required when - `openai` is selected as the provider. -- `db_name`: The name of the database where your Knowledge Graph was created. -- `username`: The ArangoDB username. This user needs to have write access to the specified database. - -### Start the Retriever service - -```py -%%time - -# Start the GraphRAG Retriever service -retriever_config = { - "db_name": DB_NAME, - "username": os.environ["USERNAME"], - "api_provider": "openai", # Change this provider if needed - "openai_api_key": os.environ["OPENAI_API_KEY"], -} - -response = start_service("arangodb-graphrag-retriever", retriever_config) -pprint(response) - -# Extract the service ID for future reference -retriever_service_id = response["serviceInfo"]["serviceId"].split("-")[-1] -print(f"Retriever Service ID: {retriever_service_id}") -``` - -The Retriever service is available at the following endpoint, which allows you -to send queries to the Knowledge Graph: -``` -/graphrag/retriever/{service_id}/v1/graphrag-query -``` - -### Query parameters - -The `POST /v1/graphrag-query` API expects the following parameters: - -- `query`: The question you want to ask. -- `query_type`: Can be `1` for a global search (information from the entire KG) - or `2` for a local search (focused on specific subgraphs). -- `level`: Recommended value is `1`. This parameter is relevant for global searches - and defines the hierarchy level of community grouping to start from. -- `provider`: Must be `0` for public LLMs like OpenAI. Use `1` for private LLMs. - -### Example: Global search - -Global retrieval focuses on extracting information from the entire Knowledge Graph. -It is designed to provide a comprehensive overview and answer queries that span -across multiple entities and relationships in the graph. - -For example, you can ask a broad question about the main themes of the document: - -```py -%%time - -# Example for a Global Query -global_query_body = { - "query": "What are the main themes or topics covered in the document?", - "query_type": 1, # 1 = Global search - "level": 1, - "provider": 0, # 0 = OPENAI (based on our setup) - "response_type": "use_query_decomp=True use_llm_planner=True Detailed summary" -} - -print("Executing Global Query...") -retrieverResponse = send_request( - f"/graphrag/retriever/{retriever_service_id}/v1/graphrag-query", - global_query_body, - "POST" -) - -pprint(retrieverResponse["result"]) -``` - -### Example: Local search - -Local retrieval is a focused approach where the query is constrained to -specific subgraphs within the Knowledge Graphs. It is designed for targeted -and precise information extraction. - -For example, you can ask a detailed question about entities within the -Knowledge Graph: - -```py -%%time - -# Example for a Local Query -local_query_body = { - "query": "Who are Alice's relatives?", - "query_type": 2, # 2 = Local search - "level": 1, - "provider": 0, # 0 = OPENAI (based on our setup) - "response_type": "use_query_decomp=True use_llm_planner=True Concise list" -} - -print("Executing Local Query...") -retrieverResponse = send_request( - f"/graphrag/retriever/{retriever_service_id}/v1/graphrag-query", - local_query_body, - "POST" -) - -pprint(retrieverResponse["result"]) -``` - -## Step 4: Create a chat interface via Gradio - -To make querying your Knowledge Graph more interactive, you can use Gradio to -create a simple chat interface. This allows you to submit queries and see real-time -responses from the Retriever. - -First, define the functions that handle the queries through the Gradio interface: - -```py -import time - -def global_query(query, messages): - yield from query_graph(query, 1) - -def local_query(query, messages): - yield from query_graph(query, 2) - -def query_graph(query, query_type): - body = { - "query": query, - "query_type": query_type, - "level": 1, - "provider": 0 - } - - retrieverResponse = send_request(f"/graphrag/retriever/{retriever_service_id}/v1/graphrag-query", body, "POST") - result = retrieverResponse["result"] - - response = "" - i = 0 - - while i < len(result): - current_char = result[i] - - # Handle escaped characters - if current_char == '\\': - if i + 1 < len(result): - next_char = result[i + 1] - if next_char == 'n': - response += '\n' - i += 2 - continue - - response += current_char - i += 1 - - yield response - - time.sleep(0.005) -``` -Then, you can launch the global retriever and the local retriever interfaces: - -```py -import gradio as gr - -gr.ChatInterface( - title="ArangoDB GraphRAG Global Retriever", - fn=global_query, - chatbot=gr.Chatbot(height=1000, type="messages"), - type="messages", - theme='JohnSmith9982/small_and_pretty' -).launch(share=True) -``` - -```py -import gradio as gr - -gr.ChatInterface( - title="ArangoDB GraphRAG Local Retriever", - fn=local_query, - chatbot=gr.Chatbot(height=1000, type="messages"), - type="messages", - theme='JohnSmith9982/small_and_pretty' -).launch(share=True) -``` \ No newline at end of file diff --git a/site/content/platform/data-science/graphrag/web-interface.md b/site/content/platform/data-science/graphrag/web-interface.md deleted file mode 100644 index f0146eb1f9..0000000000 --- a/site/content/platform/data-science/graphrag/web-interface.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -title: How to use GraphRAG in the ArangoDB Platform web interface -menuTitle: Web Interface -weight: 5 -description: >- - Learn how to create, configure, and run a full GraphRAG workflow in four steps - using the Platform web interface ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -## The GraphRAG workflow in the web interface - -The entire process is organized into sequential steps within a **Project**: - -1. Creating the importer service -2. Uploading your file and exploring the generated Knowledge Graph -3. Creating the retriever service -4. Chatting with your Knowledge Graph - -## Create a GraphRAG project - -To create a new GraphRAG project using the ArangoDB Platform web interface, follow these steps: - -1. From the left-hand sidebar, select the database where you want to create the project. -2. In the left-hand sidebar, click **GenAI Suite** to open the GraphRAG project management - interface, then click **Run GraphRAG**. -3. In the **GraphRAG projects** view, click **Add new project**. -4. The **Create GraphRAG project** modal opens. Enter a **Name** and optionally - a description for your project. -5. Click the **Create project** button to finalize the creation. - -## Configure the Importer service - -Configure a service to import, parse, and retrieve all the needed data from a -file. This service uses the LLM API provider and model of your choice. - -After clicking on a project name, you are taken to a screen where you can -configure and start a new importer service job. Follow the steps below. - -{{< tabs "importer-service" >}} - -{{< tab "OpenAI" >}} -1. Select **OpenAI** from the **LLM API Provider** dropdown menu. -2. Select the model you want to use from the **Model** dropdown menu. By default, - the service is using **O4 Mini**. -3. Enter your **OpenAI API Key**. -4. Click the **Start importer service** button. - -![Configure Importer service using OpenAI](../../../images/graphrag-ui-configure-importer-openai.png) -{{< /tab >}} - -{{< tab "OpenRouter" >}} -1. Select **OpenRouter** from the **LLM API Provider** dropdown menu. -2. Select the model you want to use from the **Model** dropdown menu. By default, - the service is using **Mistral AI - Mistral Nemo**. -1. Enter your **OpenAI API Key**. -2. Enter your **OpenRouter API Key**. -3. Click the **Start importer service** button. - -{{< info >}} -When using the OpenRouter option, the LLM responses are served via OpenRouter -while OpenAI is used for the embedding model. -{{< /info >}} - -![Configure Importer service using OpenRouter](../../../images/graphrag-ui-configure-importer-openrouter.png) -{{< /tab >}} - -{{< tab "Triton LLM Host" >}} -1. Select **Triton** from the **LLM API Provider** dropdown menu. -2. Select the Triton model you want to use from the **Model** dropdown menu. -3. Click the **Start importer service** button. - -{{< info >}} -Note that you must first register your model in MLflow. The [Triton LLM Host](services/triton-inference-server.md) -service automatically downloads and loads models from the MLflow registry. -{{< /info >}} - -![Configure Importer service using Triton](../../../images/graphrag-ui-configure-importer-triton.png) -{{< /tab >}} - -{{< /tabs >}} - -See also the [GraphRAG Importer](services/importer.md) service documentation. - -## Upload your file - -1. Upload a file by dragging and dropping it in the designated upload area. - The importer service you previously launched parses and creates the - Knowledge Graph automatically. -2. Enter a file name. -3. Click the **Start import** button. - -{{< info >}} -You can only import a single file, either in `.md` or `.txt` format. -{{< /info >}} - -![Upload file in GraphRAG web interface](../../../images/graphrag-ui-upload-file.png) - -## Explore the Knowledge Graph - -You can open and explore the Knowledge Graph that has been generated by clicking -on the **Explore in visualizer** button. - -For more information, see the [Graph Visualizer](../../graph-intelligence/graph-visualizer.md) documentation. - -## Configure the Retriever service - -Creating the retriever service allows you to extract information from -the generated Knowledge Graph. Follow the steps below to configure the service. - -{{< tabs "retriever-service" >}} - -{{< tab "OpenAI" >}} -1. Select **OpenAI** from the **LLM API Provider** dropdown menu. -2. Select the model you want to use from the **Model** dropdown menu. By default, - the service uses **O4 Mini**. -3. Enter your **OpenAI API Key**. -4. Click the **Start retriever service** button. - -![Configure Retriever Service using OpenAI](../../../images/graphrag-ui-configure-retriever-openai.png) -{{< /tab >}} - -{{< tab "OpenRouter" >}} -1. Select **OpenRouter** from the **LLM API Provider** dropdown menu. -2. Select the model you want to use from the **Model** dropdown menu. By default, - the service uses **Mistral AI - Mistral Nemo**. -3. Enter your **OpenRouter API Key**. -4. Click the **Start retriever service** button. - -{{< info >}} -When using the OpenRouter option, the LLM responses are served via OpenRouter -while OpenAI is used for the embedding model. -{{< /info >}} - -![Configure Retriever Service using OpenRouter](../../../images/graphrag-ui-configure-retriever-openrouter.png) -{{< /tab >}} - -{{< tab "Triton LLM Host" >}} -1. Select **Triton** from the **LLM API Provider** dropdown menu. -2. Select the Triton model you want to use from the **Model** dropdown menu. -3. Click the **Start retriever service** button. - -{{< info >}} -Note that you must first register your model in MLflow. The [Triton LLM Host](services/triton-inference-server.md) -service automatically downloads and loads models from the MLflow registry. -{{< /info >}} - -![Configure Retriever Service using Triton](../../../images/graphrag-ui-configure-retriever-triton.png) -{{< /tab >}} - -{{< /tabs >}} - -See also the [GraphRAG Retriever](services/retriever.md) documentation. - -## Chat with your Knowledge Graph - -The Retriever service provides two search methods: -- [Local search](services/retriever.md#local-search): Local queries let you - explore specific nodes and their direct connections. -- [Global search](services/retriever.md#global-search): Global queries uncover - broader patters and relationships across the entire Knowledge Graph. - -![Chat with your Knowledge Graph](../../../images/graphrag-ui-chat.png) - -In addition to querying the Knowledge Graph, the chat service allows you to do the following: -- Switch the search method from **Local Query** to **Global Query** and vice-versa - directly in the chat -- Change the retriever service -- Clear the chat -- Integrate the Knowledge Graph chat service into your own applications diff --git a/site/content/platform/data-science/integrations/_index.md b/site/content/platform/data-science/integrations/_index.md deleted file mode 100644 index 267bcebac3..0000000000 --- a/site/content/platform/data-science/integrations/_index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: ArangoDB integrations for data science -menuTitle: Integrations -weight: 50 -description: >- - ArangoDB offers multiple adapters that enable seamless integration with - data science tools -aliases: - - adapters ---- -ArangoDB Adapters provide a convenient way to integrate ArangoDB with popular -data science tools. By enabling you to use your preferred programming -languages and libraries, these adapters simplify the data analysis -process and make it easier to leverage the power of ArangoDB in data science. - -Read more about the adapters available in ArangoDB: - -- [NetworkX](arangodb-networkx-adapter.md) -- [cuGraph](arangodb-cugraph-adapter.md) -- [PyTorch Geometric (PyG)](arangodb-pyg-adapter.md) -- [Deep Graph Library (DGL)](arangodb-dgl-adapter.md) -- [Resource Description Framework (RDF)](arangodb-rdf-adapter.md) diff --git a/site/content/platform/data-science/integrations/arangodb-cugraph-adapter.md b/site/content/platform/data-science/integrations/arangodb-cugraph-adapter.md deleted file mode 100644 index e65cb501b6..0000000000 --- a/site/content/platform/data-science/integrations/arangodb-cugraph-adapter.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: cuGraph Adapter -menuTitle: cuGraph -weight: 10 -description: >- - The cuGraph Adapter exports graphs from ArangoDB into RAPIDS cuGraph, a library of collective GPU-accelerated graph algorithms, and vice-versa -aliases: - - ../adapters/arangodb-cugraph-adapter ---- -{{< tip >}} -ArangoDB now has a closer integration with NetworkX allowing -NetworkX users to persist their graphs in ArangoDB & leverage -GPU-accelerated graph analytics via cuGraph. [Learn more here](https://arangodb.com/introducing-the-arangodb-networkx-persistence-layer/). -{{< /tip >}} - -While offering a similar API and set of graph algorithms to NetworkX, -[RAPIDS cuGraph](https://docs.rapids.ai/api/cugraph/stable/) -library is GPU-based. Especially for large graphs, this -results in a significant performance improvement of cuGraph compared to NetworkX. -Please note that storing node attributes is currently not supported by cuGraph. -In order to run cuGraph, an Nvidia-CUDA-enabled GPU is required. - -## Resources - -The [cuGraph Adapter repository](https://github.com/arangoml/cugraph-adapter) -is available on Github. Check it out! - -## Installation - -To install the latest release of the cuGraph Adapter, -run the following command: - -```bash -pip install --extra-index-url=https://pypi.nvidia.com cudf-cu11 cugraph-cu11 -pip install adbcug-adapter -``` - -## Quickstart - -The following examples show how to get started with the cuGraph Adapter. -Check also the -[interactive tutorial](https://colab.research.google.com/github/arangoml/cugraph-adapter/blob/master/examples/ArangoDB_cuGraph_Adapter.ipynb). - -```py -import cudf -import cugraph - -from arango import ArangoClient -from adbcug_adapter import ADBCUG_Adapter, ADBCUG_Controller - -# Connect to ArangoDB -db = ArangoClient().db() - -# Instantiate the adapter -adbcug_adapter = ADBCUG_Adapter(db) -``` - -### ArangoDB to cuGraph -```py -####################### -# 1.1: via Graph name # -####################### - -cug_g = adbcug_adapter.arangodb_graph_to_cugraph("fraud-detection") - -############################# -# 1.2: via Collection names # -############################# - -cug_g = adbcug_adapter.arangodb_collections_to_cugraph( - "fraud-detection", - {"account", "bank", "branch", "Class", "customer"}, # Node collections - {"accountHolder", "Relationship", "transaction"}, # Edge collections -) -``` - -### cuGraph to ArangoDB -```py -################################# -# 2.1: with a Homogeneous Graph # -################################# - -edges = [("Person/A", "Person/B", 1), ("Person/B", "Person/C", -1)] -cug_g = cugraph.MultiGraph(directed=True) -cug_g.from_cudf_edgelist(cudf.DataFrame(edges, columns=["src", "dst", "weight"]), source="src", destination="dst", edge_attr="weight") - -edge_definitions = [ - { - "edge_collection": "knows", - "from_vertex_collections": ["Person"], - "to_vertex_collections": ["Person"], - } -] - -adb_g = adbcug_adapter.cugraph_to_arangodb("Knows", cug_g, edge_definitions, edge_attr="weight") - -############################################################## -# 2.2: with a Homogeneous Graph & a custom ADBCUG Controller # -############################################################## - -class Custom_ADBCUG_Controller(ADBCUG_Controller): - """ArangoDB-cuGraph controller. - - Responsible for controlling how nodes & edges are handled when - transitioning from ArangoDB to cuGraph & vice-versa. - """ - - def _prepare_cugraph_node(self, cug_node: dict, col: str) -> None: - """Prepare a cuGraph node before it gets inserted into the ArangoDB - collection **col**. - - :param cug_node: The cuGraph node object to (optionally) modify. - :param col: The ArangoDB collection the node belongs to. - """ - cug_node["foo"] = "bar" - - def _prepare_cugraph_edge(self, cug_edge: dict, col: str) -> None: - """Prepare a cuGraph edge before it gets inserted into the ArangoDB - collection **col**. - - :param cug_edge: The cuGraph edge object to (optionally) modify. - :param col: The ArangoDB collection the edge belongs to. - """ - cug_edge["bar"] = "foo" - -adb_g = ADBCUG_Adapter(db, Custom_ADBCUG_Controller()).cugraph_to_arangodb("Knows", cug_g, edge_definitions) - -################################### -# 2.3: with a Heterogeneous Graph # -################################### - -edges = [ - ('student:101', 'lecture:101'), - ('student:102', 'lecture:102'), - ('student:103', 'lecture:103'), - ('student:103', 'student:101'), - ('student:103', 'student:102'), - ('teacher:101', 'lecture:101'), - ('teacher:102', 'lecture:102'), - ('teacher:103', 'lecture:103'), - ('teacher:101', 'teacher:102'), - ('teacher:102', 'teacher:103') -] -cug_g = cugraph.MultiGraph(directed=True) -cug_g.from_cudf_edgelist(cudf.DataFrame(edges, columns=["src", "dst"]), source='src', destination='dst') - -# ... - -# Learn how this example is handled in Colab: -# https://colab.research.google.com/github/arangoml/cugraph-adapter/blob/master/examples/ArangoDB_cuGraph_Adapter.ipynb#scrollTo=nuVoCZQv6oyi -``` diff --git a/site/content/platform/data-science/integrations/arangodb-dgl-adapter.md b/site/content/platform/data-science/integrations/arangodb-dgl-adapter.md deleted file mode 100644 index efb246db4f..0000000000 --- a/site/content/platform/data-science/integrations/arangodb-dgl-adapter.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -title: DGL Adapter -menuTitle: DGL -weight: 20 -description: >- - The DGL Adapter exports graphs from ArangoDB into Deep Graph Library (DGL), a Python package for graph neural networks, and vice-versa -aliases: - - ../adapters/arangodb-dgl-adapter ---- -The [Deep Graph Library (DGL)](https://www.dgl.ai/) is an -easy-to-use, high performance and scalable -Python package for deep learning on graphs. DGL is framework agnostic, meaning -that, if a deep graph model is a component of an end-to-end application, the -rest of the logics can be implemented in any major frameworks, such as PyTorch, -Apache MXNet or TensorFlow. - -## Resources - -Watch this -[lunch & learn session](https://www.arangodb.com/resources/lunch-sessions/graph-beyond-lunch-break-2-8-dgl-adapter/) -to get an introduction and see how to use the DGL adapter. - -The [DGL Adapter repository](https://github.com/arangoml/dgl-adapter) -is available on Github. Check it out! - -## Installation - -To install the latest release of the DGL Adapter, -run the following command: - -```bash -pip install adbdgl-adapter -``` - -## Quickstart - -The following examples show how to get started with the DGL Adapter. -Check also the -[interactive tutorial](https://colab.research.google.com/github/arangoml/dgl-adapter/blob/master/examples/ArangoDB_DGL_Adapter.ipynb). - -```py -import dgl -import torch -import pandas - -from arango import ArangoClient -from adbdgl_adapter import ADBDGL_Adapter, ADBDGL_Controller -from adbdgl_adapter.encoders import IdentityEncoder, CategoricalEncoder - -# Connect to ArangoDB -db = ArangoClient().db() - -# Instantiate the adapter -adbdgl_adapter = ADBDGL_Adapter(db) - -# Create a DGL Heterogeneous Graph -fake_hetero = dgl.heterograph({ - ("user", "follows", "user"): (torch.tensor([0, 1]), torch.tensor([1, 2])), - ("user", "follows", "topic"): (torch.tensor([1, 1]), torch.tensor([1, 2])), - ("user", "plays", "game"): (torch.tensor([0, 3]), torch.tensor([3, 4])), -}) -fake_hetero.nodes["user"].data["features"] = torch.tensor([21, 44, 16, 25]) -fake_hetero.nodes["user"].data["label"] = torch.tensor([1, 2, 0, 1]) -fake_hetero.nodes["game"].data["features"] = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1], [1, 1]]) -fake_hetero.edges[("user", "plays", "game")].data["features"] = torch.tensor([[6, 1], [1000, 0]]) -``` - -### DGL to ArangoDB -```py -############################ -# 1.1: without a Metagraph # -############################ - -adb_g = adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero) - -######################### -# 1.2: with a Metagraph # -######################### - -# Specifying a Metagraph provides customized adapter behavior -metagraph = { - "nodeTypes": { - "user": { - "features": "user_age", # 1) you can specify a string value for attribute renaming - "label": label_tensor_to_2_column_dataframe, # 2) you can specify a function for user-defined handling, as long as the function returns a Pandas DataFrame - }, - # 3) You can specify set of strings if you want to preserve the same DGL attribute names for the node/edge type - "game": {"features"} # this is equivalent to {"features": "features"} - }, - "edgeTypes": { - ("user", "plays", "game"): { - # 4) you can specify a list of strings for tensor dissasembly (if you know the number of node/edge features in advance) - "features": ["hours_played", "is_satisfied_with_game"] - }, - }, -} - -def label_tensor_to_2_column_dataframe(dgl_tensor: torch.Tensor, adb_df: pandas.DataFrame) -> pandas.DataFrame: - """A user-defined function to create two - ArangoDB attributes out of the 'user' label tensor - - :param dgl_tensor: The DGL Tensor containing the data - :type dgl_tensor: torch.Tensor - :param adb_df: The ArangoDB DataFrame to populate, whose - size is preset to the length of **dgl_tensor**. - :type adb_df: pandas.DataFrame - :return: The populated ArangoDB DataFrame - :rtype: pandas.DataFrame - """ - label_map = {0: "Class A", 1: "Class B", 2: "Class C"} - - adb_df["label_num"] = dgl_tensor.tolist() - adb_df["label_str"] = adb_df["label_num"].map(label_map) - - return adb_df - - -adb_g = adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero, metagraph, explicit_metagraph=False) - -####################################################### -# 1.3: with a Metagraph and `explicit_metagraph=True` # -####################################################### - -# With `explicit_metagraph=True`, the node & edge types omitted from the metagraph will NOT be converted to ArangoDB. -adb_g = adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero, metagraph, explicit_metagraph=True) - -######################################## -# 1.4: with a custom ADBDGL Controller # -######################################## - -class Custom_ADBDGL_Controller(ADBDGL_Controller): - def _prepare_dgl_node(self, dgl_node: dict, node_type: str) -> dict: - """Optionally modify a DGL node object before it gets inserted into its designated ArangoDB collection. - - :param dgl_node: The DGL node object to (optionally) modify. - :param node_type: The DGL Node Type of the node. - :return: The DGL Node object - """ - dgl_node["foo"] = "bar" - return dgl_node - - def _prepare_dgl_edge(self, dgl_edge: dict, edge_type: tuple) -> dict: - """Optionally modify a DGL edge object before it gets inserted into its designated ArangoDB collection. - - :param dgl_edge: The DGL edge object to (optionally) modify. - :param edge_type: The Edge Type of the DGL edge. Formatted - as (from_collection, edge_collection, to_collection) - :return: The DGL Edge object - """ - dgl_edge["bar"] = "foo" - return dgl_edge - - -adb_g = ADBDGL_Adapter(db, Custom_ADBDGL_Controller()).dgl_to_arangodb("FakeHetero", fake_hetero) -``` - -### ArangoDB to DGL -```py -# Start from scratch! -db.delete_graph("FakeHetero", drop_collections=True, ignore_missing=True) -adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero) - -####################### -# 2.1: via Graph name # -####################### - -# Due to risk of ambiguity, this method does not transfer attributes -dgl_g = adbdgl_adapter.arangodb_graph_to_dgl("FakeHetero") - -############################# -# 2.2: via Collection names # -############################# - -# Due to risk of ambiguity, this method does not transfer attributes -dgl_g = adbdgl_adapter.arangodb_collections_to_dgl("FakeHetero", v_cols={"user", "game"}, e_cols={"plays"}) - -###################### -# 2.3: via Metagraph # -###################### - -# Transfers attributes "as is", meaning they are already formatted to DGL data standards. -# Learn more about the DGL Data Standards here: https://docs.dgl.ai/guide/graph.html#guide-graph -metagraph_v1 = { - "vertexCollections": { - # Move the "features" & "label" ArangoDB attributes to DGL as "features" & "label" Tensors - "user": {"features", "label"}, # equivalent to {"features": "features", "label": "label"} - "game": {"dgl_game_features": "features"}, - "topic": {}, - }, - "edgeCollections": { - "plays": {"dgl_plays_features": "features"}, - "follows": {} - }, -} - -dgl_g = adbdgl_adapter.arangodb_to_dgl("FakeHetero", metagraph_v1) - -################################################# -# 2.4: via Metagraph with user-defined encoders # -################################################# - -# Transforms attributes via user-defined encoders -metagraph_v2 = { - "vertexCollections": { - "Movies": { - "features": { # Build a feature matrix from the "Action" & "Drama" document attributes - "Action": IdentityEncoder(dtype=torch.long), - "Drama": IdentityEncoder(dtype=torch.long), - }, - "label": "Comedy", - }, - "Users": { - "features": { - "Gender": CategoricalEncoder(), # CategoricalEncoder(mapping={"M": 0, "F": 1}), - "Age": IdentityEncoder(dtype=torch.long), - } - }, - }, - "edgeCollections": {"Ratings": {"weight": "Rating"}}, -} - -dgl_g = adbdgl_adapter.arangodb_to_dgl("imdb", metagraph_v2) - -################################################## -# 2.5: via Metagraph with user-defined functions # -################################################## - -# Transforms attributes via user-defined functions -metagraph_v3 = { - "vertexCollections": { - "user": { - "features": udf_user_features, # supports named functions - "label": lambda df: torch.tensor(df["label"].to_list()), # also supports lambda functions - }, - "game": {"features": udf_game_features}, - }, - "edgeCollections": { - "plays": {"features": (lambda df: torch.tensor(df["features"].to_list()))}, - }, -} - -def udf_user_features(user_df: pandas.DataFrame) -> torch.Tensor: - # user_df["features"] = ... - return torch.tensor(user_df["features"].to_list()) - - -def udf_game_features(game_df: pandas.DataFrame) -> torch.Tensor: - # game_df["features"] = ... - return torch.tensor(game_df["features"].to_list()) - - -dgl_g = adbdgl_adapter.arangodb_to_dgl("FakeHetero", metagraph_v3) -``` \ No newline at end of file diff --git a/site/content/platform/data-science/integrations/arangodb-networkx-adapter.md b/site/content/platform/data-science/integrations/arangodb-networkx-adapter.md deleted file mode 100644 index 3b347a9151..0000000000 --- a/site/content/platform/data-science/integrations/arangodb-networkx-adapter.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: NetworkX Adapter -menuTitle: NetworkX -weight: 5 -description: >- - The NetworkX Adapter allows you to export graphs from ArangoDB into NetworkX for graph analysis with Python and vice-versa -aliases: - - ../adapters/arangodb-networkx-adapter ---- -{{< tip >}} -ArangoDB now has a closer integration with NetworkX allowing -NetworkX users to persist their graphs in ArangoDB & leverage -GPU-accelerated graph analytics via cuGraph. [Learn more here](https://arangodb.com/introducing-the-arangodb-networkx-persistence-layer/). -{{< /tip >}} - -[NetworkX](https://networkx.org/) is a commonly used tool for -analysis of network-data. If your -analytics use cases require the use of all your graph data, for example, -to summarize graph structure, or answer global path traversal queries, -then using the ArangoDB Pregel API is recommended. If your analysis pertains -to a subgraph, then you may be interested in getting the NetworkX -representation of the subgraph for one of the following reasons: - -- An algorithm for your use case is available in NetworkX -- A library that you want to use for your use case works with NetworkX Graphs as input - -## Resources - -Watch this -[lunch & learn session](https://www.arangodb.com/resources/lunch-sessions/graph-beyond-lunch-break-2-9-introducing-the-arangodb-networkx-adapter/) -to see how using this adapter gives you the best of both -graph worlds - the speed and flexibility of ArangoDB combined with the -ubiquity of NetworkX. - -The [NetworkX Adapter repository](https://github.com/arangoml/networkx-adapter) -is available on Github. Check it out! - -## Installation - -To install the latest release of the NetworkX Adapter, -run the following command: - -```bash -pip install adbnx-adapter -``` - -## Quickstart - -The following examples show how to get started with the NetworkX Adapter. -Check also the -[interactive tutorial](https://colab.research.google.com/github/arangoml/networkx-adapter/blob/master/examples/ArangoDB_NetworkX_Adapter.ipynb). - -```py -import networkx as nx - -from arango import ArangoClient -from adbnx_adapter import ADBNX_Adapter, ADBNX_Controller - -# Connect to ArangoDB -db = ArangoClient().db() - -# Instantiate the adapter -adbnx_adapter = ADBNX_Adapter(db) -``` - -### ArangoDB to NetworkX -```py -####################### -# 1.1: via Graph name # -####################### - -nx_g = adbnx_adapter.arangodb_graph_to_networkx("fraud-detection") - -############################# -# 1.2: via Collection names # -############################# - -nx_g = adbnx_adapter.arangodb_collections_to_networkx( - "fraud-detection", - {"account", "bank", "branch", "Class", "customer"}, # Node collections - {"accountHolder", "Relationship", "transaction"} # Edge collections -) - -###################### -# 1.3: via Metagraph # -###################### - -metagraph = { - "vertexCollections": { - "account": {"Balance", "account_type", "customer_id", "rank"}, - "customer": {"Name", "rank"}, - }, - "edgeCollections": { - "transaction": {"transaction_amt", "sender_bank_id", "receiver_bank_id"}, - "accountHolder": {}, - }, -} - -nx_g = adbnx_adapter.arangodb_to_networkx("fraud-detection", metagraph) - -####################################### -# 1.4: with a custom ADBNX Controller # -####################################### - -class Custom_ADBNX_Controller(ADBNX_Controller): - """ArangoDB-NetworkX controller. - - Responsible for controlling how nodes & edges are handled when - transitioning from ArangoDB to NetworkX, and vice-versa. - """ - - def _prepare_arangodb_vertex(self, adb_vertex: dict, col: str) -> None: - """Prepare an ArangoDB node before it gets inserted into the NetworkX - graph. - - :param adb_vertex: The ArangoDB node object to (optionally) modify. - :param col: The ArangoDB collection the node belongs to. - """ - adb_vertex["foo"] = "bar" - - def _prepare_arangodb_edge(self, adb_edge: dict, col: str) -> None: - """Prepare an ArangoDB edge before it gets inserted into the NetworkX - graph. - - :param adb_edge: The ArangoDB edge object to (optionally) modify. - :param col: The ArangoDB collection the edge belongs to. - """ - adb_edge["bar"] = "foo" - -nx_g = ADBNX_Adapter(db, Custom_ADBNX_Controller()).arangodb_graph_to_networkx("fraud-detection") -``` - -### NetworkX to ArangoDB -```py -################################# -# 2.1: with a Homogeneous Graph # -################################# - -nx_g = nx.grid_2d_graph(5, 5) -edge_definitions = [ - { - "edge_collection": "to", - "from_vertex_collections": ["Grid_Node"], - "to_vertex_collections": ["Grid_Node"], - } -] - -adb_g = adbnx_adapter.networkx_to_arangodb("Grid", nx_g, edge_definitions) - -############################################################# -# 2.2: with a Homogeneous Graph & a custom ADBNX Controller # -############################################################# - -class Custom_ADBNX_Controller(ADBNX_Controller): - """ArangoDB-NetworkX controller. - - Responsible for controlling how nodes & edges are handled when - transitioning from ArangoDB to NetworkX, and vice-versa. - """ - - def _prepare_networkx_node(self, nx_node: dict, col: str) -> None: - """Prepare a NetworkX node before it gets inserted into the ArangoDB - collection **col**. - - :param nx_node: The NetworkX node object to (optionally) modify. - :param col: The ArangoDB collection the node belongs to. - """ - nx_node["foo"] = "bar" - - def _prepare_networkx_edge(self, nx_edge: dict, col: str) -> None: - """Prepare a NetworkX edge before it gets inserted into the ArangoDB - collection **col**. - - :param nx_edge: The NetworkX edge object to (optionally) modify. - :param col: The ArangoDB collection the edge belongs to. - """ - nx_edge["bar"] = "foo" - -adb_g = ADBNX_Adapter(db, Custom_ADBNX_Controller()).networkx_to_arangodb("Grid", nx_g, edge_definitions) - -################################### -# 2.3: with a Heterogeneous Graph # -################################### - -edges = [ - ('student:101', 'lecture:101'), - ('student:102', 'lecture:102'), - ('student:103', 'lecture:103'), - ('student:103', 'student:101'), - ('student:103', 'student:102'), - ('teacher:101', 'lecture:101'), - ('teacher:102', 'lecture:102'), - ('teacher:103', 'lecture:103'), - ('teacher:101', 'teacher:102'), - ('teacher:102', 'teacher:103') -] -nx_g = nx.MultiDiGraph() -nx_g.add_edges_from(edges) - -# ... - -# Learn how this example is handled in Colab: -# https://colab.research.google.com/github/arangoml/networkx-adapter/blob/master/examples/ArangoDB_NetworkX_Adapter.ipynb#scrollTo=OuU0J7p1E9OM -``` diff --git a/site/content/platform/data-science/integrations/arangodb-pyg-adapter.md b/site/content/platform/data-science/integrations/arangodb-pyg-adapter.md deleted file mode 100644 index f24a681c3d..0000000000 --- a/site/content/platform/data-science/integrations/arangodb-pyg-adapter.md +++ /dev/null @@ -1,261 +0,0 @@ ---- -title: PyTorch Geometric (PyG) Adapter -menuTitle: PyG -weight: 15 -description: >- - The PyG Adapter exports Graphs from ArangoDB into PyTorch Geometric (PyG), a PyTorch-based Graph Neural Network library, and vice-versa -aliases: - - ../adapters/arangodb-pyg-adapter ---- -PyTorch Geometric (PyG) is a library built upon [PyTorch](https://pytorch.org/) -to easily write and train Graph Neural Networks (GNNs) for a wide range of -applications related to structured data. - -It consists of various methods for deep learning on graphs and other irregular structures, -also known as [geometric deep learning](https://geometricdeeplearning.com/), -from a variety of published papers. In addition, it consists of easy-to-use -mini-batch loaders for operating on many small and single giant graphs, -[multi GPU-support](https://github.com/pyg-team/pytorch_geometric/tree/master/examples/multi_gpu), -[`DataPipe` support](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/datapipe.py), -distributed graph learning via [Quiver](https://github.com/pyg-team/pytorch_geometric/tree/master/examples/quiver), -a large number of common benchmark datasets (based on simple interfaces to create your own), -the [GraphGym](https://pytorch-geometric.readthedocs.io/en/latest/notes/graphgym.html) -experiment manager, and helpful transforms, both for learning on arbitrary -graphs as well as on 3D meshes or point clouds. - -## Resources - -The [PyG Adapter repository](https://github.com/arangoml/pyg-adapter) -is available on Github. Check it out! - -## Installation - -To install the latest release of the PyG Adapter, -run the following command: - -```bash -pip install torch -pip install adbpyg-adapter -``` - -## Quickstart - -The following examples show how to get started with the PyG Adapter. -Check also the -[interactive tutorial](https://colab.research.google.com/github/arangoml/pyg-adapter/blob/master/examples/ArangoDB_PyG_Adapter.ipynb). - - -```py -import torch -import pandas -from torch_geometric.datasets import FakeHeteroDataset - -from arango import ArangoClient -from adbpyg_adapter import ADBPyG_Adapter, ADBPyG_Controller -from adbpyg_adapter.encoders import IdentityEncoder, CategoricalEncoder - -# Connect to ArangoDB -db = ArangoClient().db() - -# Instantiate the adapter -adbpyg_adapter = ADBPyG_Adapter(db) - -# Create a PyG Heterogeneous Graph -data = FakeHeteroDataset( - num_node_types=2, - num_edge_types=3, - avg_num_nodes=20, - avg_num_channels=3, # avg number of features per node - edge_dim=2, # number of features per edge - num_classes=3, # number of unique label values -)[0] -``` - -### PyG to ArangoDB - -Note: If the PyG graph contains `_key`, `_v_key`, or `_e_key` properties for any node / edge types, the adapter will assume to persist those values as [ArangoDB document keys](https://www.arangodb.com/docs/stable/data-modeling-naming-conventions-document-keys.html). See the `Full Cycle (ArangoDB -> PyG -> ArangoDB)` section below for an example. - -```py -############################# -# 1.1: without a Metagraph # -############################# - -adb_g = adbpyg_adapter.pyg_to_arangodb("FakeData", data) - -######################### -# 1.2: with a Metagraph # -######################### - -# Specifying a Metagraph provides customized adapter behavior -metagraph = { - "nodeTypes": { - "v0": { - "x": "features", # 1) You can specify a string value if you want to rename your PyG data when stored in ArangoDB - "y": y_tensor_to_2_column_dataframe, # 2) you can specify a function for user-defined handling, as long as the function returns a Pandas DataFrame - }, - # 3) You can specify set of strings if you want to preserve the same PyG attribute names for the node/edge type - "v1": {"x"} # this is equivalent to {"x": "x"} - }, - "edgeTypes": { - ("v0", "e0", "v0"): { - # 4) You can specify a list of strings for tensor dissasembly (if you know the number of node/edge features in advance) - "edge_attr": [ "a", "b"] - }, - }, -} - -def y_tensor_to_2_column_dataframe(pyg_tensor: torch.Tensor, adb_df: pandas.DataFrame) -> pandas.DataFrame: - """A user-defined function to create two - ArangoDB attributes out of the 'user' label tensor - - :param pyg_tensor: The PyG Tensor containing the data - :type pyg_tensor: torch.Tensor - :param adb_df: The ArangoDB DataFrame to populate, whose - size is preset to the length of **pyg_tensor**. - :type adb_df: pandas.DataFrame - :return: The populated ArangoDB DataFrame - :rtype: pandas.DataFrame - """ - label_map = {0: "Kiwi", 1: "Blueberry", 2: "Avocado"} - - adb_df["label_num"] = pyg_tensor.tolist() - adb_df["label_str"] = adb_df["label_num"].map(label_map) - - return adb_df - - -adb_g = adbpyg_adapter.pyg_to_arangodb("FakeData", data, metagraph, explicit_metagraph=False) - -####################################################### -# 1.3: with a Metagraph and `explicit_metagraph=True` # -####################################################### - -# With `explicit_metagraph=True`, the node & edge types omitted from the metagraph will NOT be converted to ArangoDB. -adb_g = adbpyg_adapter.pyg_to_arangodb("FakeData", data, metagraph, explicit_metagraph=True) - -######################################## -# 1.4: with a custom ADBPyG Controller # -######################################## - -class Custom_ADBPyG_Controller(ADBPyG_Controller): - def _prepare_pyg_node(self, pyg_node: dict, node_type: str) -> dict: - """Optionally modify a PyG node object before it gets inserted into its designated ArangoDB collection. - - :param pyg_node: The PyG node object to (optionally) modify. - :param node_type: The PyG Node Type of the node. - :return: The PyG Node object - """ - pyg_node["foo"] = "bar" - return pyg_node - - def _prepare_pyg_edge(self, pyg_edge: dict, edge_type: tuple) -> dict: - """Optionally modify a PyG edge object before it gets inserted into its designated ArangoDB collection. - - :param pyg_edge: The PyG edge object to (optionally) modify. - :param edge_type: The Edge Type of the PyG edge. Formatted - as (from_collection, edge_collection, to_collection) - :return: The PyG Edge object - """ - pyg_edge["bar"] = "foo" - return pyg_edge - - -adb_g = ADBPyG_Adapter(db, Custom_ADBPyG_Controller()).pyg_to_arangodb("FakeData", data) -``` - -### ArangoDB to PyG -```py -# Start from scratch! -db.delete_graph("FakeData", drop_collections=True, ignore_missing=True) -adbpyg_adapter.pyg_to_arangodb("FakeData", data) - -####################### -# 2.1: via Graph name # -####################### - -# Due to risk of ambiguity, this method does not transfer attributes -pyg_g = adbpyg_adapter.arangodb_graph_to_pyg("FakeData") - -############################# -# 2.2: via Collection names # -############################# - -# Due to risk of ambiguity, this method does not transfer attributes -pyg_g = adbpyg_adapter.arangodb_collections_to_pyg("FakeData", v_cols={"v0", "v1"}, e_cols={"e0"}) - -###################### -# 2.3: via Metagraph # -###################### - -# Transfers attributes "as is", meaning they are already formatted to PyG data standards. -metagraph_v1 = { - "vertexCollections": { - # Move the "x" & "y" ArangoDB attributes to PyG as "x" & "y" Tensors - "v0": {"x", "y"}, # equivalent to {"x": "x", "y": "y"} - "v1": {"v1_x": "x"}, # store the 'x' feature matrix as 'v1_x' in PyG - }, - "edgeCollections": { - "e0": {"edge_attr"}, - }, -} - -pyg_g = adbpyg_adapter.arangodb_to_pyg("FakeData", metagraph_v1) - -################################################# -# 2.4: via Metagraph with user-defined encoders # -################################################# - -# Transforms attributes via user-defined encoders -# For more info on user-defined encoders in PyG, see https://pytorch-geometric.readthedocs.io/en/latest/notes/load_csv.html -metagraph_v2 = { - "vertexCollections": { - "Movies": { - "x": { # Build a feature matrix from the "Action" & "Drama" document attributes - "Action": IdentityEncoder(dtype=torch.long), - "Drama": IdentityEncoder(dtype=torch.long), - }, - "y": "Comedy", - }, - "Users": { - "x": { - "Gender": CategoricalEncoder(mapping={"M": 0, "F": 1}), - "Age": IdentityEncoder(dtype=torch.long), - } - }, - }, - "edgeCollections": { - "Ratings": { "edge_weight": "Rating" } # Use the 'Rating' attribute for the PyG 'edge_weight' property - }, -} - -pyg_g = adbpyg_adapter.arangodb_to_pyg("imdb", metagraph_v2) - -################################################## -# 2.5: via Metagraph with user-defined functions # -################################################## - -# Transforms attributes via user-defined functions -metagraph_v3 = { - "vertexCollections": { - "v0": { - "x": udf_v0_x, # supports named functions - "y": lambda df: torch.tensor(df["y"].to_list()), # also supports lambda functions - }, - "v1": {"x": udf_v1_x}, - }, - "edgeCollections": { - "e0": {"edge_attr": (lambda df: torch.tensor(df["edge_attr"].to_list()))}, - }, -} - -def udf_v0_x(v0_df: pandas.DataFrame) -> torch.Tensor: - # v0_df["x"] = ... - return torch.tensor(v0_df["x"].to_list()) - - -def udf_v1_x(v1_df: pandas.DataFrame) -> torch.Tensor: - # v1_df["x"] = ... - return torch.tensor(v1_df["x"].to_list()) - -pyg_g = adbpyg_adapter.arangodb_to_pyg("FakeData", metagraph_v3) -``` \ No newline at end of file diff --git a/site/content/platform/data-science/integrations/arangodb-rdf-adapter.md b/site/content/platform/data-science/integrations/arangodb-rdf-adapter.md deleted file mode 100644 index 902968fbcb..0000000000 --- a/site/content/platform/data-science/integrations/arangodb-rdf-adapter.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: RDF Adapter -menuTitle: RDF -weight: 25 -description: >- - ArangoRDF allows you to export graphs from ArangoDB into RDF and vice-versa -aliases: - - ../adapters/arangodb-rdf-adapter ---- -RDF is a standard model for data interchange on the Web. RDF has features that -facilitate data merging even if the underlying schemas differ, and it -specifically supports the evolution of schemas over time without requiring all -the data consumers to be changed. - -RDF extends the linking structure of the Web to use URIs to name the relationship -between things as well as the two ends of the link (this is usually referred to -as a "triple"). Using this simple model, it allows structured and semi-structured -data to be mixed, exposed, and shared across different applications. - -This linking structure forms a directed, labeled graph, where the edges represent -the named link between two resources, represented by the graph nodes. This graph -view is the easiest possible mental model for RDF and is often used in -easy-to-understand visual explanations. - -## Resources - -- [ArangoRDF repository](https://github.com/ArangoDB-Community/ArangoRDF), - available on GitHub -- [ArangoRDF documentation](https://arangordf.readthedocs.io/en/latest/), - available on Read the Docs -- [RDF Primer](https://www.w3.org/TR/rdf11-concepts/) -- [RDFLib (Python)](https://pypi.org/project/rdflib/) - - -## Installation - -To install the latest release of ArangoRDF, -run the following command: - -```bash -pip install arango-rdf -``` - -## Quickstart - -The following examples show how to get started with ArangoRDF. -Check also the -[interactive tutorial](https://colab.research.google.com/github/ArangoDB-Community/ArangoRDF/blob/main/examples/ArangoRDF.ipynb). - -```py -from rdflib import Graph -from arango import ArangoClient -from arango_rdf import ArangoRDF - -db = ArangoClient().db() - -adbrdf = ArangoRDF(db) - -def beatles(): - g = Graph() - g.parse("https://raw.githubusercontent.com/ArangoDB-Community/ArangoRDF/main/tests/data/rdf/beatles.ttl", format="ttl") - return g -``` - -### RDF to ArangoDB - -**Note**: RDF-to-ArangoDB functionality has been implemented using concepts described in the paper -*[Transforming RDF-star to Property Graphs: A Preliminary Analysis of Transformation Approaches](https://arxiv.org/abs/2210.05781)*. So we offer two transformation approaches: - -1. [RDF-Topology Preserving Transformation (RPT)](https://arangordf.readthedocs.io/en/latest/rdf_to_arangodb_rpt.html) -2. [Property Graph Transformation (PGT)](https://arangordf.readthedocs.io/en/latest/rdf_to_arangodb_pgt.html) - -```py -# 1. RDF-Topology Preserving Transformation (RPT) -adbrdf.rdf_to_arangodb_by_rpt(name="BeatlesRPT", rdf_graph=beatles(), overwrite_graph=True) - -# 2. Property Graph Transformation (PGT) -adbrdf.rdf_to_arangodb_by_pgt(name="BeatlesPGT", rdf_graph=beatles(), overwrite_graph=True) -``` - -### ArangoDB to RDF - -```py -# pip install arango-datasets -from arango_datasets import Datasets - -name = "OPEN_INTELLIGENCE_ANGOLA" -Datasets(db).load(name) - -# 1. Graph to RDF -rdf_graph = adbrdf.arangodb_graph_to_rdf(name, rdf_graph=Graph()) - -# 2. Collections to RDF -rdf_graph_2 = adbrdf.arangodb_collections_to_rdf( - name, - rdf_graph=Graph(), - v_cols={"Event", "Actor", "Source"}, - e_cols={"eventActor", "hasSource"}, -) - -# 3. Metagraph to RDF -rdf_graph_3 = adbrdf.arangodb_to_rdf( - name=name, - rdf_graph=Graph(), - metagraph={ - "vertexCollections": { - "Event": {"date", "description", "fatalities"}, - "Actor": {"name"} - }, - "edgeCollections": { - "eventActor": {} - }, - }, -) -``` - -## Terminology - -### Literals - -In RDF, even literal values are referenced by edges. Literals cannot have -outgoing edges (i.e., cannot be the subject of a statement). RDF uses the XSD -type system for literals, so the string "Fred" is represented as `"Fred"^^xsd:String` -or fully expanded as `"Fred" ^^http://…"`. Literals can also contain language -and locale tags, for example, `"cat@en" ^^xsd:String` and `"chat@fr"^^xsd:String`. -These language tags can be useful and would ideally be preserved. - -Literals could be added as a property instead of creating a separate node; this -takes better advantage of using a property graph. If you are coming from a triple -store or downloading your data using a [SPARQL](https://www.w3.org/TR/rdf-sparql-query/) query you could handle these properties when -exporting. - -### Uniform Resource Identifiers (URIs) - -#### Prefixes - -In RDF, it is common to use [namespace prefixes](https://www.w3.org/TR/rdf-concepts/#section-URIspaces) with references for ease of parsing. This -can be easily handled with a property graph in a few ways. The easiest approach -is to add the statement prefixes to the document. This keeps the prefixes close -to the data but results in a lot of duplicated fields. Another approach would be -to append the prefix and form the full URI as a property. - -#### Identifiers - -URIs (e.g `http://dbpedia.org/resource/`) are used as universal identifiers in -RDF but contain special characters, namely `:` and `/`, which make them not -suitable for use as an ArangoDB `_key` attribute. Consequently, a hashing algorithm -is used within ArangoRDF to store the URI as an ArangoDB graph node. - -### Blank Nodes - -Blank nodes are identifiers that have local scope and cannot (must not) be -referenced externally. Blank nodes are usually used in structures like lists and -other situations where it is inconvenient to create URIs. They will cause problems -when reconciling differences between graphs. Hashing these values as well is a way -to work around them but as they are considered temporary identifiers in the RDF -world they could pose consistency issues in your RDF graph. - -### Serializations - -There are numerous RDF serializations, including XML and JSON based -serializations and gzipped serializations. Third party libraries will likely handle -all of the serializations but it is a step that may effect how data is imported. - -### Ontology, Taxonomy, Class Inheritance, and RDFS - -The final consideration is something that for many is the core of RDF and -semantic data: [Ontologies](https://www.w3.org/standards/semanticweb/ontology). -Not just ontologies but also class inheritance, and schema validation. One method -would be to add the ontology in a similar way to what has been suggested for the -RDF graphs as ontologies are usually structured in the same way (or can be). \ No newline at end of file diff --git a/site/content/platform/data-science/integrations/langchain.md b/site/content/platform/data-science/integrations/langchain.md deleted file mode 100644 index 48da4bd49b..0000000000 --- a/site/content/platform/data-science/integrations/langchain.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: ArangoDB integration with LangChain -menuTitle: LangChain -weight: 30 -description: >- - A LangChain integration for using LLMs to provide a natural language interface - for the data stored in ArangoDB ---- -[LangChain](https://www.langchain.com/) is a framework for developing applications -powered by language models. - -LangChain enables applications that are: -- Data-aware (connect a language model to other sources of data) -- Agentic (allow a language model to interact with its environment) - -The ArangoDB integration with LangChain provides you the ability to analyze -data seamlessly via natural language, eliminating the need for query language -design. By using LLM chat models such as OpenAI's ChatGPT, you can "speak" to -your data instead of querying it. - -## Get started with ArangoDB QA chain - -The [ArangoDB QA chain notebook](https://langchain-langchain.vercel.app/docs/integrations/graphs/arangodb/) -shows how to use LLMs to provide a natural language interface to an ArangoDB -instance. - -Run the notebook directly in [Google Colab](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/Langchain.ipynb). - -See also other [machine learning interactive tutorials](https://github.com/arangodb/interactive_tutorials#machine-learning). diff --git a/site/content/platform/data-science/notebook-servers.md b/site/content/platform/data-science/notebook-servers.md deleted file mode 100644 index c9b8f67a05..0000000000 --- a/site/content/platform/data-science/notebook-servers.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Notebook Servers -menuTitle: Notebook Servers -weight: 130 -description: >- - Colocated Jupyter Notebooks within the ArangoDB Platform -aliases: - - arangograph-notebooks ---- -{{< tag "ArangoDB Platform" >}} - -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -ArangoDB Notebooks provide a Python-based, Jupyter-compatible interface for building -and experimenting with graph-powered data, GenAI, and graph machine learning -workflows directly connected to ArangoDB databases. The notebook servers are -embedded in the ArangoDB Platform ecosystem and offer a -pre-configured environment where everything, including all the necessary services -and configurations, comes preloaded. You don't need to set up or configure the -infrastructure, and can immediately start using the GraphML and GenAI -functionalities. - -The notebooks are primarily focused on the following solutions: -- [GraphRAG](graphrag/_index.md): A complete solution for extracting entities - from text files to create a knowledge graph that you can then query with a - natural language interface. -- [GraphML](graphml/_index.md): Apply machine learning to graphs for link prediction, - classification, and similar tasks. -- [Integrations](integrations/_index.md): Use ArangoDB together with cuGraph, - NetworkX, and other data science tools. - -The ArangoDB Notebooks include the following: -- Automatically connect to ArangoDB databases and GenAI platform services -- [Magic commands](../../3.12/arangograph/notebooks.md#arangograph-magic-commands) - that simplify database interactions -- Example notebooks for learning - -## Quickstart - -1. In the ArangoDB Platform web interface, expand **GenAI Tools** in the - main navigation and click **Notebook servers**. -2. The page displays an overview of the notebook services. - Click **New notebook server** to create a new one. -3. After your notebook service has been deployed, you can click the ID to start - interacting with the Jupyter interface. - -## Examples - -- To get a better understanding of how to interact with ArangoDB using notebooks, - open the `GettingStarted.ipynb` notebook from the file browser to learn the basics. -- To get started with GraphRAG using ArangoDB's integrated notebook servers, see - the [GraphRAG Notebook Tutorial](graphrag/tutorial-notebook.md). -- To get started with GraphML using ArangoDB's integrated notebook servers, see - the [GraphML Notebooks and API](graphml/notebooks-api.md) documentation. diff --git a/site/content/platform/graph-intelligence/_index.md b/site/content/platform/graph-intelligence/_index.md deleted file mode 100644 index 9d5ac11917..0000000000 --- a/site/content/platform/graph-intelligence/_index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Graph intelligence -menuTitle: Graph intelligence -weight: 10 ---- diff --git a/site/content/platform/graph-intelligence/graph-analytics.md b/site/content/platform/graph-intelligence/graph-analytics.md deleted file mode 100644 index 7aa269b360..0000000000 --- a/site/content/platform/graph-intelligence/graph-analytics.md +++ /dev/null @@ -1,877 +0,0 @@ ---- -title: Graph Analytics -menuTitle: Graph Analytics -weight: 5 -description: | - ArangoGraph offers Graph Analytics Engines to run graph algorithms on your - data separately from your ArangoDB deployments -aliases: - - ../data-science/graph-analytics ---- -{{< tag "ArangoDB Platform" "ArangoGraph" >}} - -Graph analytics is a branch of data science that deals with analyzing information -networks known as graphs, and extracting information from the data relationships. -It ranges from basic measures that characterize graphs, over PageRank, to complex -algorithms. Common use cases include fraud detection, recommender systems, -and network flow analysis. - -ArangoDB offers a feature for running algorithms on your graph data, -called Graph Analytics Engines (GAEs). It is available on request for the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) -and included in the [ArangoDB Platform](../about-the-platform/_index.md). - -Key features: - -- **Separation of storage and compute**: GAEs are a solution that lets you run - graph analytics independent of your ArangoDB Core, including on dedicated machines - optimized for compute tasks. This separation of OLAP and OLTP workloads avoids - affecting the performance of the transaction-oriented database systems. - -- **Fast data loading**: You can easily and efficiently import graph data from - ArangoDB and export results back to ArangoDB. - -- **In-memory processing**: All imported data is held and processed in the - main memory of the compute machines for very fast execution of graph algorithms - such as connected components, label propagation, and PageRank. - -## Workflow - -The following lists outlines how you can use Graph Analytics Engines (GAEs). -How to perform the steps is detailed in the subsequent sections. - -{{< tabs "platforms" >}} - -{{< tab "ArangoDB Platform" >}} -1. Determine the approximate size of the data that you will load into the GAE - and ensure the machine to run the engine on has sufficient memory. The data as well as the - temporarily needed space for computations and results needs to fit in memory. -2. [Start a `graphanalytics` service](#start-a-graphanalytics-service) via the GenAI service - that manages various Platform components for graph intelligence and machine learning. - It only takes a few seconds until the engine service can be used. The engine - runs adjacent to the pods of the ArangoDB Core. -3. [Load graph data](#load-data) from the ArangoDB Core into the engine. You can load - named graphs or sets of node and edge collections. This loads the edge - information and a configurable subset of the node attributes. -4. [Run graph algorithms](#run-algorithms) on the data. You only need to load the data once per - engine and can then run various algorithms with different settings. -5. [Write the computation results back](#store-job-results) to the ArangoDB Core. -6. [Stop the engine service](#stop-a-graphanalytics-service) once you are done. -{{< /tab >}} - -{{< tab "ArangoGraph Insights Platform" >}} -{{< info >}} -Before you can use Graph Analytics Engines, you need to request the feature -via __Request help__ in the ArangoGraph dashboard for a deployment. - -The deployment needs to use **AWS** as the cloud provider. - -Single server deployments using ArangoDB version 3.11 are not supported. -{{< /info >}} - -1. Determine the approximate size of the data that you will load into the GAE - to select an engine size with sufficient memory. The data as well as the - temporarily needed space for computations and results needs to fit in memory. -2. Deploy an engine of the desired size and of type `gral`. It only takes a few - seconds until the engine can be used. The engine runs adjacent to a particular - ArangoGraph deployment. -3. Load graph data from ArangoDB into the engine. You can load named graphs or - sets of node and edge collections. This loads the edge information and a - configurable subset of the node attributes. -4. Run graph algorithms on the data. You only need to load the data once per - engine and can then run various algorithms with different settings. -5. Write the computation results back to ArangoDB. -6. Delete the engine once you are done. -{{< /tab >}} - -{{< /tabs >}} - -## Authentication - -{{< tabs "platforms" >}} - -{{< tab "ArangoDB Platform" >}} -You can use any of the available authentication methods the ArangoDB Platform -supports to start and stop `graphanalytics` services via the GenAI service as -well as to authenticate requests to the [Engine API](#engine-api). - -- HTTP Basic Authentication -- Access tokens -- JWT session tokens -<!-- TODO -- Single Sign-On (SSO) ---> -{{< /tab >}} - -{{< tab "ArangoGraph Insights Platform" >}} -The [Management API](#management-api) for deploying and deleting engines requires -an ArangoGraph **API key**. See -[Generating an API Key](../../3.12/arangograph/api/get-started.md#generating-an-api-key) -on how to create one. - -You then need to generate an **access token** using the API key. See -[Authenticating with Oasisctl](../../3.12/arangograph/api/get-started.md#authenticating-with-oasisctl) -on how to do so using `oasisctl login`. - -The [Engine API](#engine-api) uses one of two authentication methods, depending -on the [__auto login to database UI__](../../3.12/arangograph/deployments/_index.md#auto-login-to-database-ui) -setting in ArangoGraph: -- **Enabled**: You can use an ArangoGraph access token created with an API key - (see above), allowing you to use one token for both the Management API and - the Engine API. -- **Disabled**: You need use a JWT user token created from ArangoDB credentials. - These session tokens need to be renewed every hour by default. See - [HTTP API Authentication](../../3.12/develop/http-api/authentication.md#jwt-user-tokens) - for details. -{{< /tab >}} - -{{< /tabs >}} - -## Start and stop Graph Analytics Engines - -The interface for managing the engines depends on the environment you use: - -- **ArangoDB Platform**: [GenAI service](#genai-service) -- **ArangoGraph**: [Management API](#management-api) - -### GenAI service - -{{< tag "ArangoDB Platform" >}} - -GAEs are deployed and deleted via the [GenAI service](../data-science/graphrag/services/gen-ai.md) -in the ArangoDB Platform. - -If you use cURL, you need to use the `-k` / `--insecure` option for requests -if the Platform deployment uses a self-signed certificate (default). - -#### Start a `graphanalytics` service - -`POST <ENGINE_URL>/gen-ai/v1/graphanalytics` - -Start a GAE via the GenAI service with an empty request body: - -```sh -# Example with a JWT session token -ADB_TOKEN=$(curl -sSk -d '{"username":"root", "password": ""}' -X POST https://127.0.0.1:8529/_open/auth | jq -r .jwt) - -Service=$(curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/gen-ai/v1/graphanalytics) -ServiceID=$(echo "$Service" | jq -r ".serviceInfo.serviceId") -if [[ "$ServiceID" == "null" ]]; then - echo "Error starting gral engine" -else - echo "Engine started successfully" -fi -echo "$Service" | jq -``` - -#### List the services - -`POST <ENGINE_URL>/gen-ai/v1/list_services` - -You can list all running services managed by the GenAI service, including the -`graphanalytics` services: - -```sh -curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/gen-ai/v1/list_services | jq -``` - -#### Stop a `graphanalytics` service - -Delete the desired engine via the GenAI service using the service ID: - -```sh -curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X DELETE https://127.0.0.1:8529/gen-ai/v1/service/$ServiceID | jq -``` - -### Management API - -{{< tag "ArangoGraph" >}} - -GAEs are deployed and deleted with the Management API for graph analytics on the -ArangoGraph Insights Platform. You can also list the available engine sizes and -get information about deployed engines. - -To determine the base URL of the management API, use the ArangoGraph dashboard -and copy the __APPLICATION ENDPOINT__ of the deployment that holds the graph data -you want to analyze. Replace the port with `8829` and append -`/graph-analytics/api/graphanalytics/v1`, e.g. -`https://123456abcdef.arangodb.cloud:8829/graph-analytics/api/graphanalytics/v1`. - -Store the base URL in a variable called `BASE_URL`: - -```bash -BASE_URL='https://...' -``` - -To authenticate requests, you need to use the following HTTP header: - -``` -Authorization: bearer <ARANGO_GRAPH_TOKEN> -``` - -You can create an ArangoGraph access token with `oasisctl login`. Save it in a -variable to ease scripting. Note that this should be the token string only and -not include quote marks. The following examples assume Bash as the shell and -that the `curl` and `jq` commands are available. - -```bash -ARANGO_GRAPH_TOKEN="$(oasisctl login --key-id "<AG_KEY_ID>" --key-secret "<AG_KEY_SECRET>")" -``` - -Example with cURL that uses the token variable: - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/api-version" -``` - -Request and response payloads are JSON-encoded in the management API. - -#### Get the API version - -`GET <BASE_URL>/api-version` - -Retrieve the version information of the management API. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/api-version" -``` - -#### List engine sizes - -`GET <BASE_URL>/enginesizes` - -List the available engine sizes, which is a combination of the number of cores -and the size of the RAM, starting at 1 CPU and 4 GiB of memory (`e4`). - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/enginesizes" -``` - -#### List engine types - -`GET <BASE_URL>/enginetypes` - -List the available engine types. The only type supported for GAE workloads is -called `gral`. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/enginetypes" -``` - -#### Deploy an engine - -`POST <BASE_URL>/engines` - -Set up a GAE adjacent to the ArangoGraph deployment, for example, using an -engine size of `e4`. - -The engine ID is returned in the `id` attribute. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" -X POST -d '{"type_id":"gral","size_id":"e4"}' "$BASE_URL/engines" -``` - -#### List all engines - -`GET <BASE_URL>/engines` - -List all deployed GAEs of a ArangoGraph deployment. - -The engine IDs are in the `id` attributes. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/engines" -``` - -#### Get an engine - -`GET <BASE_URL>/engines/<ENGINE_ID>` - -List the detailed information about a specific GAE. - -```bash -ENGINE_ID="zYxWvU9876" -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/engines/$ENGINE_ID" -``` - -#### Delete an engine - -`DELETE <BASE_URL>/engines/<ENGINE_ID>` - -Delete a no longer needed GAE, freeing any data it holds in memory. - -```bash -ENGINE_ID="zYxWvU9876" -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" -X DELETE "$BASE_URL/engines/$ENGINE_ID" -``` - -## Engine API - -### Determine the engine URL - -{{< tabs "platforms" >}} - -{{< tab "ArangoDB Platform" >}} -To determine the base URL of the engine API, use the base URL of the Platform -deployment and append `/gral/<SERVICE_ID>`, e.g. -`https://127.0.0.1:8529/gral/arangodb-gral-tqcge`. - -The service ID is returned by the call to the GenAI service for -[starting the `graphanalytics` service](#start-a-graphanalytics-service). -You can also list the service IDs like so: - -```sh -kubectl -n arangodb get svc arangodb-gral -o jsonpath="{.spec.selector.release}" -``` - -Store the base URL in a variable called `ENGINE_URL`: - -```bash -ENGINE_URL='https://...' -``` - -To authenticate requests, you need to use a bearer token in HTTP header: -``` -Authorization: bearer <TOKEN> -``` - -You can save the token in a variable to ease scripting. Note that this should be -the token string only and not include quote marks. The following examples assume -Bash as the shell and that the `curl` and `jq` commands are available. - -An example of authenticating a request using cURL and a session token: - -```bash -PLATFORM_BASEURL="https://127.0.0.1:8529" - -ADB_TOKEN=$(curl -X POST -d "{\"username\":\"<ADB_USER>\",\"password\":\"<ADB_PASS>\"}" "$PLATFORM_BASEURL/_open/auth" | jq -r '.jwt') - -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs" -``` -{{< /tab >}} - -{{< tab "ArangoGraph Insights Platform" >}} -To determine the base URL of the engine API, use the ArangoGraph dashboard -and copy the __APPLICATION ENDPOINT__ of the deployment that holds the graph data -you want to analyze. Replace the port with `8829` and append -`/graph-analytics/engines/<ENGINE_ID>`, e.g. -`https://<123456abcdef>.arangodb.cloud:8829/graph-analytics/engines/zYxWvU9876`. -If you can't remember the engine ID, you can [List all engines](#list-all-engines). - -Store the base URL in a variable called `ENGINE_URL`: - -```bash -ENGINE_URL='https://...' -``` - -To authenticate requests, you need to use a bearer token in HTTP header: -``` -Authorization: bearer <TOKEN> -``` - -- If __Auto login to database UI__ is enabled for the ArangoGraph deployment, - this can be the same access token as used for the management API. -- If it is disabled, use an ArangoDB session token (JWT user token) instead. - -You can save the token in a variable to ease scripting. Note that this should be -the token string only and not include quote marks. The following examples assume -Bash as the shell and that the `curl` and `jq` commands are available. - -An example of authenticating a request using cURL and a session token: - -```bash -APPLICATION_ENDPOINT="https://123456abcdef.arangodb.cloud:8529" - -ADB_TOKEN=$(curl -X POST -d "{\"username\":\"<ADB_USER>\",\"password\":\"<ADB_PASS>\"}" "$APPLICATION_ENDPOINT/_open/auth" | jq -r '.jwt') - -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs" -``` -{{< /tab >}} - -{{< /tabs >}} - -All requests to the engine API start jobs, each representing an operation. -You can check the progress of operations and check if errors occurred. -You can submit jobs concurrently and they also run concurrently. - -You can find the API reference documentation with detailed descriptions of the -request and response data structures at <https://arangodb.github.io/graph-analytics>. - -Request and response payloads are JSON-encoded in the engine API. - -### Load data - -`POST <ENGINE_URL>/v1/loaddata` - -Import graph data from a database of the ArangoDB deployment. You can import -named graphs as well as sets of node and edge collections (see -[Managed and unmanaged graphs](../../3.12/graphs/_index.md#managed-and-unmanaged-graphs)). - -```bash -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d '{"database":"_system","graph_name":"connectedComponentsGraph"}' "$ENGINE_URL/v1/loaddata" -``` - -### Run algorithms - -#### PageRank - -`POST <ENGINE_URL>/v1/pagerank` - -PageRank is a well known algorithm to rank nodes in a graph: the more -important a node, the higher rank it gets. It goes back to L. Page and S. Brin's -[paper](http://infolab.stanford.edu/pub/papers/google.pdf) and -is used to rank pages in search engines (hence the name). The algorithm runs -until the execution converges. To run for a fixed number of iterations, use the -`maximum_supersteps` parameter. - -The rank of a node is a positive real number. The algorithm starts with every -node having the same rank (one divided by the number of nodes) and sends its -rank to its out-neighbors. The computation proceeds in iterations. In each iteration, -the new rank is computed according to the formula -`( (1 - damping_factor) / total number of nodes) + (damping_factor * the sum of all incoming ranks)`. -The value sent to each of the out-neighbors is the new rank divided by the number -of those neighbors, thus every out-neighbor gets the same part of the new rank. - -The algorithm stops when at least one of the two conditions is satisfied: -- The maximum number of iterations is reached. This is the same `maximum_supersteps` - parameter as for the other algorithms. -- Every node changes its rank in the last iteration by less than a certain - threshold. The threshold is hardcoded to `0.0000001`. - -It is possible to specify an initial distribution for the node documents in -your graph. To define these seed ranks / centralities, you can specify a -`seeding_attribute` in the properties for this algorithm. If the specified field is -set on a document _and_ the value is numeric, then it is used instead of -the default initial rank of `1 / numNodes`. - -Parameters: -- `graph_id` -- `damping_factor` -- `maximum_supersteps` -- `seeding_attribute` (optional, for seeded PageRank) - -Result: the rank of each node - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"damping_factor\":0.85,\"maximum_supersteps\":500,\"seeding_attribute\":\"seed_attr\"}" "$ENGINE_URL/v1/pagerank" -``` - -{{< comment >}} Not merged yet -#### Single-Source Shortest Path (SSSP) - -`POST <ENGINE_URL>/v1/single_source_shortest_path` - -The algorithm computes the shortest path from a given source node to all other -nodes and returns the length of this path (distance). The algorithm returns a -distance of `-1` for a node that cannot be reached from the source, and `0` -for the source node itself. - -Parameters: -- `graph_id` -- `source_vertex`: The document ID of the source node. -- `undirected`: Determines whether the algorithm respects the direction of edges. - -Result: the distance of each node to the `source_vertex` - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"source_vertex\":\"node/345\",\"undirected\":false}" "$ENGINE_URL/v1/single_source_shortest_path" -``` -{{< /comment >}} - -#### Weakly Connected Components (WCC) - -`POST <ENGINE_URL>/v1/wcc` - -The weakly connected component algorithm partitions a graph into maximal groups -of nodes, so that within a group, all nodes are reachable from each node -by following the edges, ignoring their direction. - -In other words, each weakly connected component is a maximal subgraph such that -there is a path between each pair of nodes where one can also follow edges -against their direction in a directed graph. - -Parameters: -- `graph_id` - -Result: a component ID for each node. All nodes from the same component -obtain the same component ID, every two nodes from different components -obtain different IDs. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID}" "$ENGINE_URL/v1/wcc" -``` - -#### Strongly Connected Components (SCC) - -`POST <ENGINE_URL>/v1/scc` - -The strongly connected components algorithm partitions a graph into maximal -groups of nodes, so that within a group, all nodes are reachable from each -node by following the edges in their direction. - -In other words, a strongly connected component is a maximal subgraph, where for -every two nodes, there is a path from one of them to the other, forming a -cycle. In contrast to a weakly connected component, one cannot follow edges -against their direction. - -Parameters: - -- `graph_id` - -Result: a component ID for each node. All nodes from the same component -obtain the same component ID, every two nodes from different components -obtain different IDs. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID}" "$ENGINE_URL/v1/scc" -``` - -#### Vertex Centrality - -Centrality measures help identify the most important nodes in a graph. -They can be used in a wide range of applications: -to identify influencers in social networks, or middlemen in terrorist -networks. - -There are various definitions for centrality, the simplest one being the -node degree. These definitions were not designed with scalability in mind. -It is probably impossible to discover an efficient algorithm which computes -them in a distributed way. Fortunately there are scalable substitutions -available, which should be equally usable for most use cases. - -![Illustration of an execution of different centrality measures (Freeman 1977)](../../images/centrality_visual.png) - -##### Betweenness Centrality - -`POST <ENGINE_URL>/v1/betweennesscentrality` - -A relatively expensive algorithm with complexity `O(V*E)` where `V` is the -number of nodes and `E` is the number of edges in the graph. - -Betweenness-centrality can be approximated by cheaper algorithms like -Line Rank but this algorithm strives to compute accurate centrality measures. - -Parameters: -- `graph_id` -- `k` (number of start nodes, 0 = all) -- `undirected` -- `normalized` -- `parallelism` - -Result: a centrality measure for each node - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"k\":0,\"undirected\":false,\"normalized\":true}" "$ENGINE_URL/v1/betweennesscentrality" -``` - -{{< comment >}} Not merged yet -##### Effective Closeness - -A common definitions of centrality is the **closeness centrality** -(or closeness). The closeness of a node in a graph is the inverse average -length of the shortest path between the node and all other nodes. -For nodes *x*, *y* and shortest distance `d(y, x)` it is defined as: - -![Vertex Closeness Formula](../../images/closeness.png) - -Effective Closeness approximates the closeness measure. The algorithm works by -iteratively estimating the number of shortest paths passing through each node. -The score approximates the real closeness score, since it is not possible -to actually count all shortest paths due to the horrendous `O(n^2 * d)` memory -requirements. The algorithm is from the paper -*Centralities in Large Networks: Algorithms and Observations (U Kang et.al. 2011)*. - -ArangoDBs implementation approximates the number of shortest paths in each -iteration by using a HyperLogLog counter with 64 buckets. This should work well -on large graphs and on smaller ones as well. The memory requirements should be -**O(n * d)** where *n* is the number of nodes and *d* the diameter of your -graph. Each node stores a counter for each iteration of the algorithm. - -Parameters: -- `graph_id` -- `undirected`: Whether to ignore the direction of edges -- `maximum_supersteps` - -Result: a closeness measure for each node - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"undirected\":false,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/effectivecloseness" -``` -{{< /comment >}} - -##### LineRank - -`POST <ENGINE_URL>/v1/linerank` - -Another common measure is the [*betweenness* centrality](https://en.wikipedia.org/wiki/Betweenness_centrality): -It measures the number of times a node is part of shortest paths between any -pairs of nodes. For a node *v* betweenness is defined as: - -![Vertex Betweenness Formula](../../images/betweenness.png) - -Where the σ represents the number of shortest paths between *x* and *y*, -and σ(v) represents the number of paths also passing through a node *v*. -By intuition a node with higher betweenness centrality has more -information passing through it. - -**LineRank** approximates the random walk betweenness of every node in a -graph. This is the probability that someone, starting on an arbitrary node, -visits this node when they randomly choose edges to visit. - -The algorithm essentially builds a line graph out of your graph -(switches the nodes and edges), and then computes a score similar to PageRank. -This can be considered a scalable equivalent to vertex betweenness, which can -be executed distributedly in ArangoDB. The algorithm is from the paper -*Centralities in Large Networks: Algorithms and Observations (U Kang et.al. 2011)*. - -Parameters: -- `graph_id` -- `damping_factor` -- `maximum_supersteps` - -Result: the line rank of each node - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"damping_factor\":0.0000001,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/linerank" -``` - -#### Community Detection - -Graphs based on real world networks often have a community structure. -This means it is possible to find groups of nodes such that each node -group is internally more densely connected than outside the group. -This has many applications when you want to analyze your networks, for example -Social networks include community groups (the origin of the term, in fact) -based on common location, interests, occupation, etc. - -##### Label Propagation - -`POST <ENGINE_URL>/v1/labelpropagation` - -[*Label Propagation*](https://arxiv.org/pdf/0709.2938) can be used to implement -community detection on large graphs. - -The algorithm assigns an initial community identifier to every node in the -graph using a user-defined attribute. The idea is that each node should be in -the community that most of its neighbors are in at the end of the computation. - -In each iteration of the computation, a node sends its current community ID to -all its neighbor nodes, inbound and outbound (ignoring edge directions). -After that, each node adopts the community ID it received most frequently in -the last step. - -It can happen that a node receives multiple most frequent community IDs. -In this case, one is chosen either randomly or using a deterministic choice -depending on a setting for the algorithm. The rules for a deterministic tiebreak -are as follows: -- If a node obtains only one community ID and the ID of the node from the - previous step, its old ID, is less than the obtained ID, the old ID is kept. -- If a node obtains more than one ID, its new ID is the lowest ID among the - most frequently obtained IDs. For example, if the initial IDs are numbers and - the obtained IDs are 1, 2, 2, 3, 3, then 2 is the new ID. -- If, however, no ID arrives more than once, the new ID is the minimum of the - lowest obtained IDs and the old ID. For example, if the old ID is 5 and the - obtained IDs are 3, 4, 6, then the new ID is 3. If the old ID is 2, it is kept. - -The algorithm runs until it converges or reaches the maximum iteration bound. -It may not converge on large graphs if the synchronous variant is used. -- **Synchronous**: The new community ID of a node is based on the - community IDs of its neighbors from the previous iteration. With (nearly) - [bipartite](https://en.wikipedia.org/wiki/Bipartite_graph) subgraphs, this may - lead to the community IDs changing back and forth in each iteration within the - two halves of the subgraph. -- **Asynchronous**: A node determines the new community ID using the most - up-to-date community IDs of its neighbors, whether those updates occurred in - the current iteration or the previous one. The order in which nodes are - updated in each iteration is chosen randomly. This leads to more stable - community IDs. - -Parameters: -- `graph_id` -- `start_label_attribute` -- `synchronous` -- `random_tiebreak` -- `maximum_supersteps` - -Result: a community ID for each node - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"start_label_attribute\":\"start_attr\",\"synchronous\":false,\"random_tiebreak\":false,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/labelpropagation" -``` - -##### Attribute Propagation - -`POST <ENGINE_URL>/v1/attributepropagation` - -The attribute propagation algorithm can be used to implement community detection. -It works similar to the label propagation algorithm, but every node additionally -accumulates a memory of observed labels instead of forgetting all but one label. - -The algorithm assigns an initial value to every node in the graph using a -user-defined attribute. The attribute value can be a list of strings to -initialize the set of labels with multiple labels. - -In each iteration of the computation, the following steps are executed: - -1. Each node propagates its set of labels along the edges to all direct - neighbor nodes. Whether inbound or outbound edges are followed depends on - an algorithm setting. -2. Each node adds the labels it receives to its own set of labels. - - After a specified maximal number of iterations or if no label set changes any - more, the algorithm stops. - - {{< warning >}} - If there are many labels and the graph is well-connected, the result set can - be very large. - {{< /warning >}} - -Parameters: -- `graph_id` -- `start_label_attribute`: The attribute to initialize labels with. - Use `"@id"` to use the document IDs of the nodes. -- `synchronous`: Whether synchronous or asynchronous label propagation is used. -- `backwards`: Whether labels are propagated in edge direction (`false`) or the - opposite direction (`true`). -- `maximum_supersteps`: Maximum number of iterations. - -Result: The set of accumulated labels of each node. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"start_label_attribute\":\"start_attr\",\"synchronous\":false,\"backwards\":false,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/attributepropagation" -``` - -{{< comment >}} Work in progress -#### Custom Python code - -`POST <ENGINE_URL>/v1/python` - -You can run Python code to implement custom graph analytics algorithms as well -as execute any of the graph algorithms available in the supported Python -libraries. - -The NetworkX library is available by default using the variable `nx`: - -```py -def worker(graph): - return nx.pagerank(graph, 0.85) -``` - -Parameters: -- `graph_id` -- `function`: A string with Python code. It must define a function `def worker(graph):` - that returns a dataframe or dictionary with the results. The key inside that - dict must represent the node ID. The value can be of any type. -- `use_cugraph`: Use cugraph (or regular pandas/pyarrow). - -Result: Depends on the algorithm. If multiple values are returned for a single -node, a JSON object with multiple keys is stored. <!-- TODO: verify --> - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"function\":\"def worker(graph):\n return nx.pagerank(graph, 0.85)\",\"use_cugraph\":false}" "$ENGINE_URL/v1/python" -``` -{{< /comment >}} - -### Store job results - -`POST <ENGINE_URL>/v1/storeresults` - -You need to specify to which ArangoDB `database` and `target_collection` to save -the results to. They need to exist already. - -You also need to specify a list of `job_ids` with one or more jobs that have run -graph algorithms. - -Each algorithm outputs one value for each node, and you can define the target -attribute to store the information in with `attribute_names`. It has to be a -list with one attribute name for every job in the `job_ids` list. - -You can optionally set the degree of `parallelism` and the `batch_size` for -saving the data. - -Parameters: -- `database` -- `target_collection` -- `job_ids` -- `attribute_names` -- `parallelism` -- `batch_size` - -```bash -JOB_ID="123" -curl -H "Authorization: bearer $ADB_TOKEN" -X POST -d "{\"database\":\"_system\",\"target_collection\":\"coll\",\"job_ids\":[$JOB_ID],\"attribute_names\":[\"attr\"]}" "$ENGINE_URL/v1/storeresults" -``` - -### List all jobs - -`GET <ENGINE_URL>/v1/jobs` - -List all active and finished jobs. - -```bash -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs" -``` - -### Get a job - -`GET <ENGINE_URL>/v1/jobs/<JOB_ID>` - -Get detailed information about a specific job. - -```bash -JOB_ID="123" -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs/$JOB_ID" -``` - -### Delete a job - -`DELETE <ENGINE_URL>/v1/jobs/<JOB_ID>` - -Delete a specific job. - -```bash -JOB_ID="123" -curl -H "Authorization: bearer $ADB_TOKEN" -X DELETE "$ENGINE_URL/v1/jobs/$JOB_ID" -``` - -### List all graphs - -`GET <ENGINE_URL>/v1/graphs` - -List all loaded sets of graph data that reside in the memory of the engine node. - -```bash -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/graphs" -``` - -### Get a graph - -`GET <ENGINE_URL>/v1/graphs/<GRAPH_ID>` - -Get detailed information about a specific set of graph data. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/graphs/$GRAPH_ID" -``` - -### Delete a graph - -`DELETE <ENGINE_URL>/v1/graphs/<GRAPH_ID>` - -Delete a specific set of graph data, removing it from the memory of the engine node. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -X DELETE "$ENGINE_URL/v1/graphs/$GRAPH_ID" -``` diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html index 520c9ff8bd..9aa55544af 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html @@ -1,7 +1,8 @@ {{ $tooltips := dict - "ArangoGraph" "This feature is available in the ArangoGraph Insights Platform" - "ArangoDB Platform" "This feature is available in the unified ArangoDB Platform" - "arangosh" "This feature is available in the ArangoDB Shell" + "AMP" "This feature is available in the Arango Managed Platform (AMP)" + "Data Platform" "This feature is available in the Arango Data Platform and GenAI Data Platform" + "GenAI Data Platform" "This feature is available in the Arango GenAI Data Platform but not the Data Platform" + "arangosh" "This feature is available in the ArangoDB Shell" -}} <p class="labels"> {{ range $.Params }} From a228b4d0609b19c4236fe2a925bead88b8bd59a1 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 14:41:55 +0200 Subject: [PATCH 11/44] Make core root folder not show cards for now --- site/content/arangodb/_index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/site/content/arangodb/_index.md b/site/content/arangodb/_index.md index a2f621e4e3..d411197bc9 100644 --- a/site/content/arangodb/_index.md +++ b/site/content/arangodb/_index.md @@ -4,4 +4,6 @@ menuTitle: ArangoDB weight: 3 layout: default # Remove this file because this isn't an actual page? ---- \ No newline at end of file +# With no content below, it shows cards for the version folders... +--- +## ArangoDB database system \ No newline at end of file From 2e21560fd6f4aceeae45d198d67c27071e504bc4 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 14:43:16 +0200 Subject: [PATCH 12/44] CircleCI: Increase time between config fetching attempts --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e8886cd9b5..23bd8011e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -87,7 +87,7 @@ jobs: command: | mkdir -p .circleci && cd .circleci fetched=false - for i in $(seq 1 6); do + for i in $(seq 1 5); do echo "" res=$(curl -fsS https://api.github.com/repos/arangodb/docs-hugo/contents/.circleci?ref=$CIRCLE_SHA1) || curlStatus=$? if [[ -z "${curlStatus:-}" ]]; then @@ -103,7 +103,7 @@ jobs: fi unset curlStatus unset jqStatus - sleep 10 + sleep 60 done if [[ "$fetched" = false ]]; then echo "Failed to fetch download URLs" From ccb00501e2d526090ae036daa1d7dd9b2832728e Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 14:44:19 +0200 Subject: [PATCH 13/44] WIP: New navigation scheme with inline version selector --- .../arangodb-docs-theme/layouts/404.html | 2 +- .../layouts/_default/baseof.html | 2 +- .../layouts/_default/home.navigation.html | 18 +++-- .../layouts/partials/header.html | 2 +- .../layouts/partials/version-selector.html | 2 +- .../arangodb-docs-theme/static/css/theme.css | 18 +++-- .../arangodb-docs-theme/static/js/theme.js | 78 +++++++++++++------ 7 files changed, 83 insertions(+), 39 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/404.html b/site/themes/arangodb-docs-theme/layouts/404.html index ebf498aa8a..6963741534 100644 --- a/site/themes/arangodb-docs-theme/layouts/404.html +++ b/site/themes/arangodb-docs-theme/layouts/404.html @@ -11,7 +11,7 @@ <body> <noscript>You need to enable JavaScript to use the ArangoDB documentation.</noscript> - <div class="page-wrapper page_content_splash" style="height: auto;opacity: 0;"> + <div class="page-wrapper page_content_splash" style="height: auto;opacity: 1;"> <section class="page-main"> <section class="page-container"> {{ partialCached "header.html" . }} diff --git a/site/themes/arangodb-docs-theme/layouts/_default/baseof.html b/site/themes/arangodb-docs-theme/layouts/_default/baseof.html index 8063318922..150c1d0578 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/baseof.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/baseof.html @@ -7,7 +7,7 @@ <body> {{ if $isProduction }}{{ partialCached "tracking/body-start.html" . }}{{ end -}} <noscript>You need to enable JavaScript to use the ArangoDB documentation.</noscript> - <div class="page-wrapper page_content_splash" style="height: auto; opacity: 0;"> + <div class="page-wrapper page_content_splash" style="height: auto; opacity: 1;"> <section class="page-main"> <section class="page-container"> {{ partialCached "header.html" . -}} diff --git a/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html b/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html index 55ad423ade..954366a9d3 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/home.navigation.html @@ -3,11 +3,7 @@ <div class="sidenav-navigation"> <div class="content-wrapper highlightable"> <ul class="topics{{ if .Site.Params.collapsibleMenu }} collapsible-menu{{ end }}"> - {{- range .Site.Sections.ByWeight }} - <ul class="version-menu version-{{ replace .Type "." "_" }}">{{/* TODO: hide non-stable versions by default? */}} - {{- template "section-tree-nav" . }} - </ul> - {{- end }} + {{- template "section-tree-nav" dict "Pages" .Site.Sections }} </ul> <div class="footermargin footerLangSwitch footerVariantSwitch footerVisitedLinks footerFooter"></div> </div> @@ -26,9 +22,21 @@ <a href="{{ .RelPermalink }}" class="toggle sect menu-link"> <div class="menu-title">{{ .Params.menuTitle | markdownify }}</div> </a> + {{ $isVersioned := eq $page.Path "/arangodb" }} + {{ if $isVersioned }} + {{ partial "version-selector.html" . }} + {{ range $versionPage := $page.Pages }} + <div class="version-menu version-{{ replace (index (split $versionPage.Path "/") 2) "." "_" }}"> + <ul class="submenu"> + {{- template "section-tree-nav" $versionPage }} + </ul> + </div> + {{ end }} + {{ else }} <ul class="submenu"> {{- template "section-tree-nav" $page }} </ul> + {{ end }} </li> {{- else }} {{- /* page (or section without children) */}} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/header.html b/site/themes/arangodb-docs-theme/layouts/partials/header.html index 6d73d06742..ac6fbd90af 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/header.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/header.html @@ -27,7 +27,7 @@ <div class="docsearch"> </div> {{ partialCached "inkeep-widget.html" . -}} - {{ partialCached "version-selector.html" . }} + {{/* partialCached "version-selector.html" . */}} </div> </header> \ No newline at end of file diff --git a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html index 059dc6eec9..68c1b53c0c 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html @@ -6,7 +6,7 @@ {{ if ne $version.name $version.alias }} <option value="{{ $version.alias }}">{{ $version.alias }}</option> {{ end }} - <option value="{{ $version.name }}">{{ $version.name }}</option> + <option value="{{ $version.name }}"{{ if eq $version.name "3.12" }} selected{{ end }}>{{ $version.name }}</option> {{ end }} </select> </div> \ No newline at end of file diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index 09be3245c1..cbdefd6aed 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -774,25 +774,29 @@ header .logo { .version-selector { border: none; margin-left: 1rem; - color: var(--gray-950); } +.arangodb-version { + border: none; + padding: 0 .75rem; + color: var(--gray-50); + background: black; +} + +/* @media screen and (max-width: 768px) { .version-selector { border: none; } } -.arangodb-version { - border: none; - background: none; -} - @media screen and (max-width: 768px) { .arangodb-version { width: 4rem; } } +*/ + /* end Header */ /* Menu */ @@ -928,7 +932,7 @@ header .logo { .sidebar ul.topics > li a { - font-size: 13px; + /*font-size: 13px;*/ line-height: 1.3rem; } diff --git a/site/themes/arangodb-docs-theme/static/js/theme.js b/site/themes/arangodb-docs-theme/static/js/theme.js index 5efc2c16a2..d22f26cc61 100644 --- a/site/themes/arangodb-docs-theme/static/js/theme.js +++ b/site/themes/arangodb-docs-theme/static/js/theme.js @@ -10,6 +10,11 @@ function toggleMenuItem(event) { listItem.querySelector("label").classList.toggle("open"); slideToggle(listItem.querySelector(".submenu")); + + const versionSelector = listItem.querySelector(".version-selector") + if (versionSelector) { + versionSelector.style.display = listItem.classList.contains("open") ? "block" : "none"; + } } // Vanilla JS slideToggle implementation @@ -28,23 +33,31 @@ function menuToggleClick(event) { } function renderVersion() { - var version = getVersionFromURL(); + var urlVersion = getVersionFromURL(); + /* var versionSelector = document.querySelector(".arangodb-version"); if (!version || version === "platform") { versionSelector.style.display = "none"; } else { versionSelector.style.display = "block"; } + */ - version = "version-" + version.replace('.', '_'); - var menuEntry = document.getElementsByClassName('version-menu'); - for ( let entry of menuEntry ) { - if (entry.classList.contains(version)) { - entry.style.display = 'block'; - } else { - entry.style.display = 'none'; - } + if (urlVersion) { + var versionSelector = document.querySelector(".version-selector"); + if (versionSelector) { + versionSelector.style.display = "block"; + } + var version = "version-" + urlVersion.replace('.', '_'); + var menuEntry = document.querySelectorAll('.version-menu .submenu'); + for ( let entry of menuEntry ) { + if (entry.classList.contains(version)) { + entry.style.display = 'block'; + } else { + entry.style.display = 'none'; + } + } } } @@ -52,18 +65,25 @@ function closeAllEntries() { document.querySelectorAll(".dd-item.active").forEach(el => el.classList.remove("active")); document.querySelectorAll(".dd-item > label.open").forEach(el => el.classList.remove("open")); document.querySelectorAll(".submenu").forEach(el => el.style.display = "none"); + document.querySelectorAll(".version-selector").forEach(el => el.style.display = "none"); document.querySelectorAll(".dd-item.parent").forEach(el => el.classList.remove("parent")); } function loadMenu(url) { closeAllEntries(); var version = getVersionFromURL() + if (version) { - document.querySelectorAll('.version-menu.version-' + version.replace('.', '_') + ' a').forEach(function(link) { - const oldHref = link.getAttribute('href'); - const newHref = oldHref.replace(oldHref.split("/")[1], version); - link.setAttribute('href', newHref); - }); + document.querySelector(".version-selector").style.display = "block"; + + /* + document.querySelectorAll('.version-menu.version-' + version.replace('.', '_') + ' a').forEach(function(link) { + const oldHref = link.getAttribute('href'); + const newHref = oldHref.replace(oldHref.split("/")[1], version); + link.setAttribute('href', newHref); + }); + */ + } // Try to find the menu item - first try exact match, then try without hash console.log('loadMenu: Looking for URL:', url); @@ -99,6 +119,10 @@ function loadMenu(url) { label.classList.add("open"); console.log('loadMenu: Added open class to label'); } + const versionSelector = current.querySelector(".version-selector"); + if (versionSelector) { + versionSelector.style.display = "block"; + } const submenu = current.querySelector(".submenu"); if (submenu) { submenu.style.display = "block"; @@ -196,17 +220,22 @@ function loadNotFoundPage() { function loadPage(target) { var href = target; + /* var versionUrl = getVersionFromURL(); if (versionUrl !== "platform" && getVersionInfo(versionUrl) == undefined) { loadNotFoundPage(); return; } - + */ + /* getCurrentVersion(href); renderVersion(); loadMenu(new URL(href).pathname); var version = getVersionInfo(getVersionFromURL()).name; - href = href.replace(getVersionFromURL(), version); + href = href.replace(getVersionFromURL(), version);*/ + var menuPathName = new URL(href).pathname; + console.log(menuPathName); + loadMenu(menuPathName); fetch(href) .then(response => { if (response.url && href.replace(/#.*/, "") !== response.url) { @@ -414,7 +443,9 @@ function getVersionInfo(version) { } function getVersionFromURL() { - return window.location.pathname.split("/")[1] + // TODO: Make this data-driven + var splitUrl = window.location.pathname.split("/"); + if (splitUrl[1] == "arangodb") return splitUrl[2]; } function isUsingAlias() { @@ -452,11 +483,12 @@ function setVersionSelector(version) { } function getCurrentVersion(href) { + if (!stableVersion) return; // Only defined for /arangodb var newVersion = stableVersion.name if (window.location.pathname.split("/").length > 0) { newVersion = getVersionFromURL(); - if (newVersion === "platform") { + if (newVersion !== "arangodb") { return; } if ((href === "" || href === "/") && getVersionInfo(newVersion) == undefined) { @@ -485,7 +517,7 @@ function changeVersion() { var currentVersion = getVersionFromURL(); //var newVersionAlias = getVersionInfo(newVersion).alias; - if (currentVersion == "platform" || newVersion == "platform") { + if (!currentVersion) { var newUrl = window.location.pathname = "/" + newVersion + "/"; } else { var newUrl = window.location.pathname.replace(currentVersion, newVersion) + window.location.hash; @@ -555,7 +587,7 @@ const goToTop = (event) => { function goToHomepage(event){ event.preventDefault(); - var homepage = "/" + getVersionFromURL() + "/"; + var homepage = "/"; // + getVersionFromURL() + "/"; updateHistory(homepage); } @@ -585,7 +617,7 @@ function toggleExpandShortcode(event) { function linkToVersionedContent() { const currentVersion = getVersionFromURL(); - if (currentVersion !== "platform") return; + if (!currentVersion) return; document.querySelectorAll("a.link:not([target])").forEach(el => { const matches = el.getAttribute("href").match(/^\/(\d\.\d{1,2})(\/.*)/); const previousVersion = localStorage.getItem('docs-version') || "stable"; @@ -736,6 +768,6 @@ window.onload = () => { document.querySelectorAll('.sidebar.mobile').forEach(el => el.classList.remove("active")); } - const pageWrapper = document.querySelector('.page-wrapper'); - if (pageWrapper) pageWrapper.style.opacity = "1"; + //const pageWrapper = document.querySelector('.page-wrapper'); + //if (pageWrapper) pageWrapper.style.opacity = "1"; } \ No newline at end of file From 8241b8e648cd31fa6afafb8a4667e3b61c47799e Mon Sep 17 00:00:00 2001 From: Palash Karia <2976363+palashkaria@users.noreply.github.com> Date: Thu, 2 Oct 2025 16:02:43 +0530 Subject: [PATCH 14/44] chore: update logo, tweak colors --- .../images/ArangoAMP_logo.svg | 23 ++++++++++++++++++ .../images/ArangoDB_Logo_White_small.png | Bin 2200 -> 0 bytes .../images/ArangoGraph_Logo.svg | 19 --------------- .../arangodb-docs-theme/images/favicon.png | Bin 1208 -> 2530 bytes .../arangodb-docs-theme/images/logo_main.png | Bin 29935 -> 9660 bytes .../arangodb-docs-theme/images/logo_small.png | Bin 0 -> 4205 bytes .../layouts/partials/header.html | 2 +- .../layouts/shortcodes/cloudbanner.html | 2 +- .../arangodb-docs-theme/static/css/theme.css | 8 +++--- toolchain/arangoproxy/cmd/configs/local.yaml | 2 +- 10 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 site/themes/arangodb-docs-theme/images/ArangoAMP_logo.svg delete mode 100644 site/themes/arangodb-docs-theme/images/ArangoDB_Logo_White_small.png delete mode 100644 site/themes/arangodb-docs-theme/images/ArangoGraph_Logo.svg create mode 100644 site/themes/arangodb-docs-theme/images/logo_small.png diff --git a/site/themes/arangodb-docs-theme/images/ArangoAMP_logo.svg b/site/themes/arangodb-docs-theme/images/ArangoAMP_logo.svg new file mode 100644 index 0000000000..7df15e9aa5 --- /dev/null +++ b/site/themes/arangodb-docs-theme/images/ArangoAMP_logo.svg @@ -0,0 +1,23 @@ +<svg width="353" height="79" viewBox="0 0 353 79" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_53_91)"> +<mask id="mask0_53_91" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="353" height="74"> +<path d="M0.5 0.5H352.5V73.5H0.5V0.5Z" fill="white"/> +</mask> +<g mask="url(#mask0_53_91)"> +<path d="M148.301 37.1599H146.763L146.691 37.1399C145.642 36.8603 144.117 36.6905 142.813 36.6905C138.279 36.6905 134.646 37.9606 132.15 40.3734C129.656 42.7818 128.221 46.4021 128.221 51.2613V60.9753H119.056V28.9666H127.989V34.9396C130.983 30.7984 136.202 28.0279 143.224 28.0279C144.843 28.0279 146.703 28.2648 147.866 28.5754L148.301 28.6919V37.1626V37.1599ZM222.725 28.032C227.782 28.032 231.678 29.3448 234.303 32.0011C236.929 34.6576 238.195 38.5599 238.195 43.5398V60.9797H229.088V44.3581C229.088 41.5161 228.409 39.546 227.112 38.2735C225.813 36.9969 223.783 36.3125 220.852 36.2813C217.15 36.2542 213.967 37.3857 211.712 39.5416C209.461 41.6951 208.077 44.9241 208.077 49.2108V60.973H198.97L199.024 28.9622H207.898V34.2753C210.903 30.6662 216.119 28.0276 222.725 28.0276V28.032ZM262.72 28.032C268.893 28.032 273.729 30.0913 276.437 32.6787V28.9669H285.486V56.0625C285.486 61.5655 283.838 65.9708 280.141 68.9809C276.466 71.9706 270.865 73.5001 263.131 73.5001C256.638 73.5001 250.184 72.1428 245.415 69.75L245.674 69.229H245.091V61.5611H246.703L246.837 61.635C251.407 64.1573 257.031 65.5393 263.073 65.5393C268 65.5393 271.329 64.7657 273.421 63.2115C275.47 61.6909 276.437 59.3408 276.437 55.8856V55.5907C273.606 58.7055 268.75 60.5706 262.606 60.5706C256.63 60.5706 251.798 58.8398 248.454 55.9351C245.105 53.0257 243.283 48.9715 243.283 44.4187C243.283 39.8657 245.149 35.7491 248.532 32.7838C251.91 29.8208 256.768 28.0299 262.72 28.0299V28.032ZM264.357 36.0488C260.644 36.0488 257.728 36.9074 255.757 38.3562C253.803 39.7921 252.743 41.8269 252.743 44.3001C252.743 46.7733 253.781 48.8149 255.689 50.2484C257.616 51.6928 260.472 52.5515 264.124 52.5515C267.768 52.5515 270.871 51.6237 273.044 50.123C275.212 48.6271 276.437 46.5831 276.437 44.3001C276.437 42.0171 275.285 39.9596 273.196 38.4728C271.099 36.9789 268.058 36.0508 264.354 36.0508L264.357 36.0488ZM310.465 28.032C323.07 28.032 332.357 35.1878 332.357 44.9442C332.357 54.6961 323.14 61.9749 310.465 61.9749C297.793 61.9749 288.636 54.7565 288.636 44.9442C288.636 35.1318 297.858 28.032 310.465 28.032ZM310.465 35.9905C306.441 35.9905 303.337 36.9789 301.258 38.5755C299.187 40.1633 298.092 42.3771 298.092 44.9442C298.092 47.5112 299.216 49.7519 301.304 51.3708C303.402 52.9989 306.505 54.0118 310.465 54.0118C314.431 54.0118 317.549 53.0233 319.661 51.4111C321.765 49.8078 322.9 47.5648 322.9 44.9442C322.9 42.3232 321.791 40.1653 319.708 38.5779C317.611 36.9789 314.493 35.9928 310.465 35.9905ZM192.04 29.0808H182.991V32.1041C180.053 29.8164 175.469 28.1459 169.859 28.1459C163.791 28.1459 158.788 29.975 155.285 33.0455C151.777 36.1223 149.837 40.3934 149.837 45.1208C149.837 49.8481 151.728 54.0589 155.211 57.0798C158.683 60.0943 163.657 61.8563 169.745 61.8563C175.362 61.8563 180.006 60.3224 183.049 57.6323L183.244 61.1587L184.411 61.0939H193.21V29.0808H192.04ZM171.261 53.8372C163.786 53.8372 159.294 50.3264 159.294 44.9998C159.294 39.6731 163.905 36.1624 171.493 36.1624C179.082 36.1624 184.161 39.966 184.161 44.9998C184.161 50.0333 178.736 53.8372 171.263 53.8372H171.261Z" fill="white"/> +<path d="M352.5 56.0803C352.495 56.0618 352.483 56.0458 352.467 56.0352C352.451 56.0245 352.431 56.02 352.412 56.0223C347.502 56.5098 342.841 54.2624 340.154 50.3916C339.415 49.3318 338.837 48.1674 338.441 46.9368C338.435 46.9182 338.423 46.9022 338.407 46.8915C338.391 46.8808 338.372 46.8762 338.353 46.8785C338.309 46.8829 338.288 46.9256 338.294 46.9636C338.423 48.274 338.35 49.5709 338.097 50.8164C337.168 55.4342 333.782 59.3585 329.089 60.8568C329.07 60.8626 329.053 60.8749 329.042 60.8916C329.031 60.9084 329.026 60.9285 329.027 60.9486C329.033 60.991 329.074 61.0111 329.121 61.0066C334.029 60.5192 338.69 62.7666 341.377 66.6373C342.115 67.6978 342.692 68.862 343.09 70.0922C343.102 70.1302 343.137 70.1549 343.178 70.1505C343.216 70.1393 343.242 70.1034 343.24 70.0654C343.108 68.7549 343.184 67.458 343.433 66.2126C344.363 61.5948 347.748 57.6725 352.441 56.1722C352.48 56.161 352.506 56.1251 352.503 56.0803H352.5Z" fill="#58DF20"/> +<path d="M89.1504 18.5908C92.7561 18.6488 96.2256 20.8359 98.083 24.8724C99.8535 28.7228 103.885 37.4887 107.473 45.2953C109.266 49.1973 110.949 52.8602 112.184 55.5459C112.8 56.8876 113.307 57.9876 113.658 58.7502C113.834 59.1326 113.97 59.4299 114.064 59.6312C114.111 59.7319 114.147 59.8102 114.171 59.8617C114.182 59.8885 114.193 59.9065 114.198 59.9197C114.2 59.9265 114.203 59.9309 114.205 59.9353V59.94L114.258 60.0584V61.5834H105.218L105.064 61.237L100.834 51.7152H76.7817L72.4973 61.2414L72.3409 61.5858H63.5735V60.0675L63.6228 59.9556V59.9512C63.6228 59.9489 63.6272 59.9444 63.6292 59.9377C63.6339 59.9241 63.6427 59.9065 63.6539 59.8794C63.6762 59.8302 63.7096 59.7566 63.7521 59.658C63.8369 59.4635 63.9622 59.1773 64.125 58.8106C64.4488 58.075 64.9175 57.0171 65.4913 55.7181C66.9671 52.3848 68.4525 49.0558 69.9476 45.7312C73.3949 38.0745 77.4179 29.293 79.7062 24.8585C81.8989 20.608 85.5356 18.5349 89.1437 18.5929L89.1504 18.5908ZM88.9718 26.5717C88.8377 26.5628 88.5922 26.6276 88.2015 27.0544C87.8198 27.4753 87.3798 28.1571 86.873 29.1567C86.029 31.0285 84.2588 34.9684 82.6959 38.4412C81.9121 40.1832 81.182 41.8113 80.6464 43.0008C80.4498 43.437 80.2803 43.8147 80.1418 44.119H97.4825C97.3485 43.8126 97.1789 43.4303 96.9845 42.9896C96.46 41.7957 95.741 40.1676 94.9707 38.4233C93.4281 34.9328 91.6798 30.9837 90.8403 29.1431C90.4273 28.233 90.0545 27.5689 89.7107 27.1327C89.3581 26.6856 89.1123 26.5805 88.9694 26.5717H88.9718Z" fill="white"/> +<path d="M51.2874 7.10134C50.4323 5.2834 49.2311 3.76041 47.8091 2.69838C47.2063 2.25331 46.5812 1.86859 45.9382 1.55775C45.3016 1.26046 44.632 1.01909 43.8884 0.822162C42.1762 0.379452 40.2381 0.395053 38.2845 0.869258C35.6659 1.50418 33.1518 2.91502 31.3883 4.74002C28.8609 7.34065 26.0164 9.77143 23.2659 12.1239C22.1609 13.0676 21.0198 14.0446 19.9148 15.0174C15.7709 18.6692 11.4868 22.444 7.93685 26.8961C0.261194 36.538 -1.63257 48.6295 3.00034 58.4551C3.63323 59.7923 4.39285 61.0654 5.26869 62.2567C7.56402 65.3762 10.8928 67.3752 13.8443 68.9206C16.8583 70.4992 20.3501 71.3802 23.5384 71.3802C23.7795 71.3802 24.0183 71.3758 24.257 71.3646C25.7642 71.2954 27.2399 71.0873 28.6377 70.7453C39.1845 68.1938 47.4004 59.1306 50.0795 47.0909L50.2314 46.4113H50.2179C51.312 41.1538 51.5576 35.722 51.7943 30.4605L51.8007 30.3018C51.8679 28.808 51.9125 27.2829 51.955 25.807C52.0597 22.2112 52.1671 18.4923 52.6045 14.9079C52.9128 12.3609 52.4326 9.51417 51.2851 7.10134H51.2874ZM41.7385 49.1929C39.8407 57.8066 33.9444 65.4678 24.9962 67.5765C23.8761 67.8429 22.7328 67.9995 21.5824 68.044C17.5638 68.1982 13.6566 66.5545 10.3947 64.361C9.00399 63.4217 7.74706 62.279 6.74445 60.9282C6.06362 60.0025 5.45847 59.0076 4.96509 57.97C0.995701 49.6624 3.24821 40.2616 8.76082 33.3743C11.5358 29.9059 14.9003 26.9609 18.2449 24.0291C21.3032 21.3481 24.565 18.7855 27.4074 15.8831C28.7626 14.4967 30.6825 13.4323 32.6986 12.9513C34.123 12.6181 35.5988 12.5758 36.9607 12.9313C37.4969 13.0758 38.0203 13.2642 38.5256 13.4947C39.023 13.7421 39.4975 14.0333 39.9436 14.3648C41.0688 15.2079 41.9662 16.3841 42.6003 17.7078C43.4912 19.5817 43.8661 21.7531 43.6361 23.6762C43.1562 27.7147 43.2119 31.8651 43.0444 35.9393C42.8638 40.3826 42.6763 44.8594 41.723 49.1976H41.7362L41.7385 49.1932V49.1929Z" fill="#007339"/> +<path d="M43.6361 23.6714C43.8661 21.7504 43.4912 19.5769 42.6004 17.703C41.9685 16.379 41.0709 15.2028 39.9436 14.3598C39.4975 14.0284 39.023 13.7373 38.5257 13.4899C38.0204 13.2591 37.497 13.0706 36.9607 12.9266C35.5988 12.571 34.123 12.6134 32.6986 12.9466C30.6825 13.4272 28.7627 14.4919 27.4074 15.8783C24.563 18.783 21.3032 21.3457 18.2449 24.0246C14.9003 26.9564 11.5358 29.9014 8.76054 33.3695C3.24852 40.2571 0.995718 49.6579 4.9651 57.9652C5.45849 59.0028 6.06364 59.998 6.74446 60.9238C7.74473 62.2746 9.00401 63.4172 10.395 64.3562C13.6545 66.5501 17.5641 68.1937 21.5827 68.0392C22.7331 67.9961 23.8764 67.8396 24.9963 67.5721C33.9444 65.4609 39.8386 57.8021 41.7385 49.1884H41.725C42.6784 44.8502 42.8661 40.3734 43.0468 35.9301C43.2143 31.8556 43.1586 27.7055 43.6385 23.667L43.6361 23.6714Z" fill="#B9FF38"/> +<path d="M29.5507 34.0136C27.1081 32.4306 23.824 32.3411 20.3031 33.7611C17.0101 35.0892 14.0363 37.5356 12.1408 40.4718C8.28493 46.4492 9.33887 54.023 14.4895 57.3571C15.7123 58.148 17.0948 58.6567 18.5372 58.8466C20.0262 59.0456 21.5938 58.9158 23.1631 58.453C26.2372 57.5449 28.9567 55.4541 30.8188 52.5695C33.1763 48.9224 34.1408 43.9534 33.2746 39.9128C32.7076 37.263 31.4169 35.2258 29.5484 34.016L29.5507 34.0136Z" fill="black"/> +</g> +</g> +<path d="M324.351 78.5V67.7H331.416C334.948 67.7 336.75 68.99 336.75 71.315C336.75 73.685 334.948 74.93 331.416 74.93H327.912V78.5H324.351ZM327.912 72.35H331.387C332.488 72.35 333.032 72.005 333.032 71.36C333.032 70.67 332.488 70.355 331.387 70.355H327.912V72.35Z" fill="#58DF20"/> +<path d="M305.595 78.5V67.7H310.429L313.732 72.695H314.333L317.565 67.7H322.356V78.5H318.881L318.967 71.66H318.666L315.377 76.4H312.503L309.142 71.66H308.813L308.899 78.5H305.595Z" fill="#58DF20"/> +<path d="M289.72 78.5V78.2L294.253 67.7H299.974L304.621 78.2V78.5H300.775L299.916 76.325H294.125L293.252 78.5H289.72ZM295.183 73.73H298.887L297.571 70.415H296.513L295.183 73.73Z" fill="#58DF20"/> +<defs> +<clipPath id="clip0_53_91"> +<rect width="352" height="73" fill="white" transform="translate(0.5 0.5)"/> +</clipPath> +</defs> +</svg> diff --git a/site/themes/arangodb-docs-theme/images/ArangoDB_Logo_White_small.png b/site/themes/arangodb-docs-theme/images/ArangoDB_Logo_White_small.png deleted file mode 100644 index 18fd04a10c1d4a1e36796064f40f27799155af08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 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 a?wcb=Nq2EyJJWi#Oj)fr4*ow34*&o@w=x0% diff --git a/site/themes/arangodb-docs-theme/images/ArangoGraph_Logo.svg b/site/themes/arangodb-docs-theme/images/ArangoGraph_Logo.svg deleted file mode 100644 index 7854ba284b..0000000000 --- a/site/themes/arangodb-docs-theme/images/ArangoGraph_Logo.svg +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg id="artwork" - xmlns="http://www.w3.org/2000/svg" viewBox="0 0 740 215"> - <defs - xmlns="http://www.w3.org/2000/svg"> - <style> - .cls-1{fill:#fff;} - path{fill:#fff;} - </style> - </defs> - <path d="M191,113.99h7.53v9.02c-1.01,1.45-2.43,2.66-4.25,3.64-1.82,.94-3.84,1.41-6.06,1.41s-3.79-.52-5-1.57c-1.18-1.04-1.77-2.49-1.77-4.34,0-2.05,.81-4.49,2.43-5.94,1.62-1.48,3.99-2.22,7.13-2.22m121.35-20.26c2.19,0,4.06,.45,5.61,1.36,1.58,.91,2.85,2.19,3.79,3.84v23.73c-.94,1.58-2.21,2.79-3.79,3.64-1.55,.81-3.45,1.21-5.71,1.21-3.64,0-6.27-1.36-7.88-4.09-1.62-2.76-2.43-6.53-2.43-11.31v-1.06c0-5.15,.83-9.33,2.48-12.52,1.68-3.2,4.33-4.8,7.93-4.8m58.45-.1c3.84,0,6.65,1.53,8.44,4.59,1.79,3.06,2.68,7.02,2.68,11.87v1.06c0,4.95-.89,8.94-2.68,11.97-1.75,3.03-4.53,4.54-8.34,4.54s-6.74-1.5-8.49-4.49c-1.75-3.03-2.63-7.04-2.63-12.02v-1.06c0-4.85,.88-8.81,2.63-11.87,1.75-3.06,4.55-4.59,8.39-4.59m0-11.36c-8.05,0-14.37,2.61-18.95,7.83-4.55,5.18-6.82,11.85-6.82,19.99v1.06c0,8.21,2.27,14.91,6.82,20.1,4.58,5.15,10.93,7.72,19.05,7.72s14.3-2.58,18.85-7.72c4.58-5.18,6.87-11.88,6.87-20.1v-1.06c0-8.18-2.29-14.86-6.87-20.04-4.55-5.18-10.87-7.78-18.95-7.78m-111.47,0c-3.3,0-6.29,.78-8.94,2.32-2.66,1.55-4.9,3.72-6.72,6.51l-.66-7.83h-21.58v8.89l7.83,1.52v33.88l-7.07,1.52v8.84h27.79v-8.84l-5.96-1.52v-29.29c1.04-1.45,2.34-2.56,3.89-3.33,1.55-.81,3.3-1.21,5.26-1.21,3,0,5.24,.77,6.72,2.32,1.48,1.51,2.22,4.11,2.22,7.78v23.73l-6.32,1.52v8.84h28.2v-8.84l-7.07-1.52v-23.78c0-7.4-1.55-12.84-4.65-16.31-3.1-3.47-7.41-5.2-12.94-5.2m-68.83,0c-3.57,0-6.91,.5-10.02,1.44-1.48,.39-3.03,.89-4.54,1.56-5.8,2.57-7.84,4.72-7.84,4.72l6.99,9.23s2.23-2.4,8.55-5.1c1.85-.78,4.14-1.1,5.89-1.1,2.97,0,5.21,.72,6.72,2.17,1.52,1.45,2.27,3.48,2.27,6.11v4.66h-7.53c-7.95,0-13.98,2.09-18.09,4.88-4.11,2.79-6.17,6.75-6.17,11.86s1.57,8.99,4.7,11.91c3.17,2.9,7.43,4.34,12.79,4.34,3.23,0,6.1-.62,8.59-1.87,2.53-1.25,4.66-2.88,6.42-4.9,.17,.98,.41,1.95,.71,2.93,.3,.94,.66,1.87,1.06,2.78h17.03v-8.84l-4.5-.61c-.1-.67-.17-1.38-.2-2.12v-24.94c0-6.13-2.12-10.84-6.37-14.14-4.21-3.33-9.7-5-16.47-5m-30.36,0c-2.66,0-5,.79-7.02,2.37-2.02,1.58-3.67,3.79-4.95,6.61l-.66-7.98h-21.58v8.89l7.83,1.52v33.88l-7.07,1.52v8.84h28.91v-8.84l-7.07-1.52v-26.56c.74-1.55,1.82-2.75,3.23-3.59,1.41-.84,3.2-1.26,5.36-1.26l6.06,.15,1.57-13.43c-.57-.17-1.3-.3-2.17-.4-.84-.13-1.65-.2-2.43-.2m163.73-.18l-1.23,8.06c-1.65-2.52-3.64-4.46-5.96-5.81-2.32-1.38-5.02-2.07-8.08-2.07-6.77,0-12.04,2.64-15.82,7.93-3.74,5.29-5.61,12.24-5.61,20.85v1.06c0,8.05,1.87,14.54,5.61,19.49,3.77,4.92,9.01,7.37,15.72,7.37,2.83,0,5.34-.54,7.53-1.62,2.19-1.08,4.09-2.64,5.71-4.7v3.58c0,3.91-.89,6.95-2.68,9.14-1.79,2.19-4.48,3.28-8.09,3.28-2.63,0-5.12-.3-7.48-.91-2.36-.57-4.72-1.36-7.07-2.37l-2.73,10.35c2.63,1.31,5.49,2.34,8.59,3.08,3.1,.77,6.03,1.16,8.79,1.16,7.92,0,14.14-2.15,18.65-6.46,4.55-4.27,6.82-10.01,6.82-17.22v-9.4s.01-34.4,.01-34.4l7.84-1.52v-8.89h-20.52Zm-234.77-.78h.3l6.74,21.08h-13.8l6.75-21.08h0Zm-7.33-16.91l-22.39,63.91-5.26,.76v8.84h25.07v-8.84l-5.1-.91,4.78-14.92h20.67l4.88,14.92-5.1,.91v8.84h25.07v-8.84l-5.26-.76-22.24-63.91h-15.11Z"/> - <g> - <path d="M437.23,138.94c-7.31,0-13.54-1.52-18.7-4.55-5.15-3.03-9.1-7.24-11.85-12.63s-4.12-11.64-4.12-18.75v-2.53c0-7.34,1.37-13.81,4.09-19.41,2.73-5.59,6.6-9.96,11.6-13.11s10.92-4.73,17.76-4.73c5.29,0,10.26,.72,14.91,2.17,4.65,1.45,8.69,3.62,12.13,6.52v16.32h-10.92l-2.07-9.85c-1.31-1.14-3.08-2.06-5.31-2.75s-4.77-1.04-7.63-1.04c-4.11,0-7.66,1.09-10.64,3.26-2.98,2.17-5.26,5.19-6.85,9.05-1.58,3.86-2.38,8.35-2.38,13.47v2.63c0,4.99,.78,9.32,2.35,13.01s3.87,6.54,6.9,8.57,6.75,3.03,11.17,3.03c2.59,0,4.98-.24,7.15-.73,2.17-.49,3.97-1.09,5.38-1.79v-12.48l-10.51-.81v-10.36h25.32v29.77c-3.27,2.32-7.2,4.19-11.8,5.61s-9.93,2.12-16,2.12Z"/> - <path d="M564.08,158.9v-8.89l7.13-1.52v-54.88l-7.88-1.52v-8.89h21.43l.71,6.37c1.62-2.36,3.57-4.18,5.86-5.46s5.02-1.92,8.19-1.92c4.41,0,8.19,1.21,11.32,3.61,3.13,2.41,5.53,5.77,7.2,10.08,1.67,4.31,2.5,9.35,2.5,15.11v1.06c0,5.39-.83,10.1-2.5,14.12-1.67,4.03-4.08,7.16-7.23,9.4-3.15,2.24-6.95,3.36-11.4,3.36-2.93,0-5.52-.53-7.76-1.59-2.24-1.06-4.15-2.62-5.74-4.67v15.82l7.13,1.52v8.89h-28.96Zm30.93-31.28c3.77,0,6.51-1.4,8.21-4.2,1.7-2.8,2.55-6.59,2.55-11.37v-1.06c0-3.47-.39-6.49-1.16-9.07-.78-2.58-1.96-4.6-3.56-6.06-1.6-1.47-3.65-2.2-6.14-2.2-2.02,0-3.8,.45-5.33,1.36-1.53,.91-2.75,2.21-3.66,3.89v23.95c.91,1.55,2.13,2.73,3.66,3.54s3.34,1.21,5.43,1.21Z"/> - <path d="M624.02,137.87v-8.84l7.13-1.52v-58.07l-7.88-1.52v-8.89h22.59v31.13c1.72-2.53,3.85-4.49,6.39-5.89,2.54-1.4,5.43-2.1,8.67-2.1,5.49,0,9.85,1.83,13.06,5.48,3.22,3.66,4.83,9.31,4.83,16.96v22.89l7.08,1.52v8.84h-28.2v-8.84l6.37-1.52v-22.99c0-3.94-.74-6.74-2.22-8.39-1.48-1.65-3.66-2.48-6.52-2.48-1.99,0-3.8,.41-5.43,1.24-1.63,.83-2.97,2.03-4.02,3.61v29.01l6.37,1.52v8.84h-28.2Z"/> - </g> - <path d="M558.18,128.46c-.1-.67-.17-1.38-.2-2.12v-24.94c0-6.13-2.12-10.84-6.37-14.14-4.21-3.33-9.7-5-16.47-5h0c-3.57,0-6.91,.51-10.02,1.45-1.48,.39-3.03,.89-4.54,1.56-5.8,2.57-7.84,4.72-7.84,4.72l6.99,9.23s2.23-2.4,8.55-5.1c1.85-.78,4.14-1.1,5.89-1.1,2.97,0,5.21,.72,6.72,2.17,1.52,1.45,2.27,3.48,2.27,6.11v4.66h-7.53c-7.95,0-13.98,2.09-18.09,4.88-4.11,2.79-6.17,6.75-6.17,11.86s1.57,8.99,4.7,11.91c3.17,2.9,7.43,4.34,12.79,4.34,3.23,0,6.1-.62,8.59-1.87,2.53-1.25,4.66-2.88,6.42-4.9,.17,.98,.41,1.95,.71,2.93,.3,.94,.66,1.87,1.06,2.78h17.03v-8.84l-4.5-.61Zm-15.01-5.45c-1.01,1.45-2.43,2.66-4.25,3.64-1.82,.94-3.84,1.41-6.06,1.41s-3.79-.52-5-1.57c-1.18-1.04-1.77-2.49-1.77-4.34,0-2.05,.81-4.49,2.43-5.94,1.62-1.48,3.99-2.22,7.13-2.22h0s7.53,0,7.53,0v9.02Z"/> - <path d="M504.77,82.25c-2.66,0-5,.79-7.02,2.37-2.02,1.58-3.67,3.79-4.95,6.61l-.66-7.98h-21.58v8.89l7.83,1.52v33.88l-7.07,1.52v8.84h28.91v-8.84l-7.07-1.52v-26.56c.74-1.55,1.82-2.75,3.23-3.59,1.41-.84,3.2-1.26,5.36-1.26l6.06,.15,1.57-13.43c-.57-.17-1.3-.3-2.17-.4-.84-.13-1.65-.2-2.43-.2"/> -</svg> \ No newline at end of file diff --git a/site/themes/arangodb-docs-theme/images/favicon.png b/site/themes/arangodb-docs-theme/images/favicon.png index 4f9ff89cc9863478652febb7d9f87296f33559d7..41ad92213c12476a131f98a979f85bb27ce23a93 100644 GIT binary patch literal 2530 zcmV<82_5!{P)<h;3K|Lk000e1NJLTq003kF003kN1^@s6aN?Cz00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP<VFdsH33o|EK~#7F?VVpt zTh|@OzsF6}Y{@3KQkAM})k{20)3gGa773cQHIu^j2HDGKl?-@m`VtZxY1#|sW!jp5 z<YmcQoF>}RJq+?#@_@TafTl<g)=iz(go}iduuZAgz*-3L+4)`L)=>MNdymgG$Mk$8 z2miSyaK8TiJ%0c!7K_DVu~;k?i^XEGSS%KcMFEC-C-tKwz&pe(3C<nyOx$~(v1xG7 z?LC|s&!A4IUqOzy^oT(p5ciw_SG(YBupWe|KS56HYX*P(qOgW$goR-UrzVcUVCqYd z{{7uReh5Xkq(&B}C)!{rkD*>Dh>;QZcAz>O?0-Iv@%eXQAoXD({jEpEzeCUo<83%K znT27*U^=OnC~)f)gWz65U>s%(LSk^9Ml>XmYDvN{%oXH#>)8m!D3FgOVHn$B8tG&l z50-~PpWvv8Q9+3`48kl6`DKfP#g#GCLJWc<d@U0(<_JOs-$OR0RPa?pU($g=nBlVe zTRV}*MfenaJ4N-e|3#p256AAO#N)34OP>O_?f?@XFx<QaH6CB7rpVOJ<_jXJF-VA? zy~1(u<$?$sX-q)8#xWxVIdzp`;bYV_o9nV9HAdoD;QVopL+$0oD20Uiow%0X6N;VN zT^PjXRO((PwQ^QO)t*Y1(7>KN!lgoNWKp=WH_wEyl+zPNbt`IbAtZ*ENmUl3DWN6? zu}i!s)y0Ee?!qu?D+r~v50<C=GN}VU<akR_j3VT|NYnthFpSy>LSj%_>ocK5!8z3h zEwp|gbxCamDb^T1VjODcc%uW_AWM_N@n0B5^l2}Nk>5sQl+E`ktv%Ao#Q;Jp6iaqL z3IE{Em~lyRw1P;)paC1`5vl685D6qoz11br3GzkEs3-<yQdD(E#V%Q5z%U2Hh(-{J z7?c5#WmJ<%1>xR()E)W-kz`YpN$CvUe$-<dMXw-*xr~ZpP$qS_9W{X}_IgCGAfGG` z2*2!<d+CjiLW8hYECmsSnO7L<6Qt0!?JM^ZwK8<4wK5hyuFpl8dJ02|8x^{?n;}L$ zqeqZJ5dRX!i;?F!7)JGi(4yxuLA)+3gKafI$W^f~FF2!YYO}>ysKXkBs4l3l#=1p^ z&MAE=Y-+odTg9#E|6%;veJr>uSQL+mMDy42QpZzhOnwuQ!D7Z)h`JzN0l0pWiDvnN zim~7>WBA-%jAs7hiL#NI>?ar=x`*A)6F52cJ@2b_9&X=4E^EbGJLMD~78`{!Xz(u_ zo5L>}rn~_!Cq^kG+?#v<itCsD4ei9Sg#_6UI}ZOu-YBF`{Sh&^!$Wrw26AH;`sO@w zf)c20lFn`sLA-r^>#ai;#D~w_!-=-PhZ@vUNR(5(s*A76Vw@O+njk#iUHVYAsNl-r zy!eE>s1~v?x@lqy2|_zw*PsOjjXnzsCPwb#a(W)RplmD%0n%O<1`=M7LYu@XK5XAt z**eHQoj;~`4(Mj~0kmM?d^!<ckcaH^B|Ng&aap)3)tFI<e+B%0(xA?m3j<McS;^uZ zzqL=~>#t|@r>Yd(WvOx?7<XYH;RRu6D&9Td<E}=ds2kQ;%srA`Bb~nGTP22oeLhcK zX<;)BSQOS#WLI3in|tvy$px{k;<5_oiD1vOl~<(Cyr(TSEz8chf5(TWZ>2MaC&#B@ zASyA$vyf+es`A^@ONfd+%{!&n+`c23Eo3lK3_`heLK#*ibZ1tjd|PyZWk?q|aJKaX z*%k4cs!BAzDsRWn$T}=^WRsz&2(qayhamGKx9><U$mg>#lt=`T1zlCzd!7z7FY=L} zAQV4_CS4ecO4{rBUq3&cXp;MR6%GwNC%tCo7L#RImk^S!Stp4ap&$tNno~<Yd46lB z{uR_gtz-NH$px!?1R)VQTW9C2Q<Lq};RT6t&q8i~RQVDr+?q7bg_96Ltb>pUl2vh6 zq94(;BVT?Ipl%eJi{h6;p?T-$8iEdB5RROEA&_;DyYg)+au(WM5yC>^EQX`PbvcNb z@PZURVRZ97J%O^J!x}_MT}%XafmcR-Uv^av!R!&PN?1rUFBHUMQM)d+I)oKIX%m0* zuZRz&pTmLfr=bF6YU$zc;6P8X_y2RA<$RCVpi@Z|5TUZO<RRH<q@t(^vbx<{$4mZN z)-y_F5}_@H;?Mc17egfnXaDGPFeaVhtA0f6y6I~15p3Q8Ohx6s)C3vI=EP5yrPTLN z@5@)2lcl^pyVuK<DnS-OLeLtlw?eMNx_*OshtO1HHGdEatPOgy%uDqAtayDuw=n8! z_UU*$&c>*P^7gNSZ%-?(R4naxQN!>VXS-5CNpt5X&ie#&&IfU3G7Sa9V9!E+P_qko ziOwbA-lj(y+^RYm)or3kwT_9LFxmOC$b>oqA7`PJo?o-v-TM{Ym5b984N#zK&KW>n z>9jdl4C=HPjcek5_G*LchIw<9YkPSw9%EA@?<3xvsQu{)7p^h*it&gm9hm(3oO3j< zCI$t8?5BAgQ?-=p4pN?+&!P4CWnpJOz3~r*ecuJ1{03^ml~IOw#(XY#wAzNDzkG<0 zkY(^ZeuIz*tH|Yn*WPj5-+p*5C!4SI`#u`zZ^?*n)lG9G>0a*5CPoPzRCfJ_&jnmq z?wQF9La-K`=~TNU!sCitTUhs04t*Q()<mJZwC$O;KkJ49_+UnoQH2zP8i(R1?GWi^ z4_7=>Uc7hj?;Bh#lU{mvM)tQ-eL|Z*z157VpX)oRVOXTsm*4emYKl~x9}IhZ_=dFA zp*ll+eU+~-2rHAv;MIhih9>lHRZX>|OONrUg>;A8)rFz{)a6m>EMOskYn<m;6RJnt z{Ej4dg_}~!;wll%-r>F$M`T~?4iI>y5xF1#0P)6zyk;R0s0}jwXa6?;8t3rniL_U& zMgR#T25Fe1>>0nkLXZqJ676R03V#KM+!?LuDxH_7s-KEGYU?ir$x#>;W1{G*(O)=t zZPpp$Ywmar?bbm=zq_8SWt%X4?ge}Y)ly?2O6j`oWW@hp=xxQ2x%z_J3(eH-xP!iA z9I?+j5fj4j(5a;>e$;DV`H{{1n;+DQ7Y&~=a$jQL4*sFR4L$oPqjrLnQiw6aC$pr; zjGDaVshpRloFau}bBN`qy$Lac7A3qs>oki3a0-RGBMZysL$1rL_WM^Ih72rbQL9xb s7K_DVu~;k?i^XEGSS%Kc#S)1B1A75UmjQlHkN^Mx07*qoM6N<$g07vpbN~PV literal 1208 zcmV;p1V{T)Nk&Gn1ONb6MM6+kP&iDa1ONapC%_31RY~gqf6<guoZS87kbu+r%>Qwo zb$54ncXxMp-_7!$=g+gZJ<b<9k%R>F*$zaQMB9M^dfyr(+cc!126u8yWjfG=0Oa9H ziOoO;w>}$Vau7y)QGjF=faFM$BB^GUnR!o4Pv1{rM`Up|^9Z_aZHcnE|KBu>t%%*- z!TTbPUw2-LR6zg;(6MdXw$Waijby8P`vBWsb~2NrZQHsD5SLZ$nMJAO+NS!);T&<e znwLJUc}`z4d$kK8xQycwPV(@-9c9JaO!(UoKQrR4=ZvzyPlziFh~-P72KI0n-f)(s zIM+~|QjMk5)d>A9*Vl3%n<^<gmU!#QKc2YV{(F~TJ{54DPWFG3yj5Q*!#%e!5sMQc zI6o4dweUd2(|v=)YICXNGTlMeic-#S$AEQgVA4Ysp?{<KhZ6H>B~<CT|5=#wCI$xV zHxhgUN4%}cpAyZ&0Z%0Rn!%0(Fgr5Cy)w`neVz2bu2i~P;U55Ogt{I(hGX_B2{MB| zi(O87B{f>bWnE5kQe#6>XiAMvcB;xsRdK!{(zPW8t2h~zg*G)%0MJnj9%hC}SaLD; z=31na(<EOv+v{8{U)ro4*zD~Y_Lma2+9qZW0OluZJtI_nlPd~iZX^IGRfVDD;h&nm zkA?WVEEls~9`5=#Q$kJZP;>4!v*q(2eemU7%6=E<@qvl=jx4v<5&%q(R7$Woz@76d z3pJsYyHpRe-V`4izkX~~Z&vJj`?6`$^<s@eek#d|C2~p9rUwcDR@}`TfuAJgD2D+t zuJx|AP$mZkgG$@?`eBnXXSaz;k2M*gOqP3Ffl>-m5y{|^fX-r5inqU8D@g&2S6iE` z#~+^om>L;>Gn5zeWcee7{!Va|^?#jz$fm+w|6on2DZrcEuV0w9zW-2wmRh?YTe2*V zbd12;Fxy3dQ>aAWc)bpwbD6WrY;g~O$({<dL!M?zmTOA|!a1peW7tfk1ov~KX8=sC zxD$_0SWZ7Y7*+~qMk+m6cJLB{Q<57El`=b0CThwQ2RKe8dUs<50N%tM_8ohACA9nP zi}%^W^oqmeK>g)$=5E#$Fg8~T0o<hm+<5Ox3Yed%(rwG{Y|iO&<B{*#T>fsu%*;UP zZiG<Vv&O^gX;WbRp(4DdR3?s34OJ@wriXhjCsr7_VGAG?6%LpybAyM!LV3$Ww4R6e zS+S(Q<rtKqo-0a4Hzi5(G&7GCmhqn1;D{?IkpLF(JPWZs<wef5)jLmbtqyctQ>`V2 z1{b{~Ns`28c*c(K%+1VYr;5%-dS>Ejd2SeG`^)|xN(3y`SGXO+b!p8gTh{~3P_XR_ zv;()FaPTCW0~|Q5lHmC7UBoLp;{Df&p{~AC9xjXo@T{j5@?(L6UjJ7!&KHGw8#8Pf zZb<9|xH0Ri87zvTy-GsVf)hC4<+X6vkrt~8Qo;8)-{7UE2>c5oI7T$Bj#)gP;dUG1 zKL%UiHzHw{Xi{TuB|PI?o?$N`UgUwNIO0aNgb{y4W-YP`K7%zJ;IV)$;WG!^rO~lS WTylG6d0K}47et4_Iuje7i_5OM6GRRG diff --git a/site/themes/arangodb-docs-theme/images/logo_main.png b/site/themes/arangodb-docs-theme/images/logo_main.png index 1d5cf2a8aa54d44a3c558f0d509b9a6216ca7335..6b5bfc4032ea328f2dce69dcf9b75f0a1c01bf3a 100644 GIT binary patch literal 9660 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 Y+$^iVL#NO0i><IURJB!Vm29H_1N7Sv`~Uy| literal 29935 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 SOw>QJpixae>j5ne9WF^RH9a|8_!r~AU z)COmFj%b;iDPtE}@(%hAvKvq1g4yM?%rV-K5w)O4o{xWa><Wq%$u{}_!IiCZ?0nl$ zHfRV48v{iQ9Vqg3?&}ghF3hyDBAgtY1C7Z1bQwL5-p6ewy9t0W0r#ko$PFj;7(o97 zgC*O>+v8tv4TVvGFUM-^M}<pLu=rem2d(`a?_MO=kCtdd(CJ;eL847p%V3CclJw@; zUu_H_8xjg0(7?B;#LGErK%DBL<>sjb<k{nbt^*wtp_Y5UWw>U^`HH?;F+w`#(zSBe zWbe350>AYEU)xXY6rH_kK|l8hxtZ?A*xFGNZ##^WMI%_98g=)0K?mIvJ-A9`P?pL_ z)J;M(-cVBvOYsm#cBmLJFg*9b0;gYn4HORZzPq?8#ts-_Oz;aR@_Ill5FmpU!_TI^ zd=xTys|x}>{H?}&&q&eKOQ%7;0@yVZA&?@FB^&t?ALX>sEHd1AK>W5Qi;m@f13Db| zObkr@6&Zg|z+<vyic>M$;XIn1HkBu;<^BK~{Kqm-XQS!-N~j}EI=;f5U|T`VA|i=o zU?^~8cj`1juk{CYjJc*LYaXgo92y&o%17BxG$Wzaq4b!9q9PpzhCyxFiC*WJKv)Dv zQPx?ZZ8dj~eS#mmw?*x}wXS}UpQH5A8iU|3HpkP^JwE$Wee*}^8_~AJDW!I_B=&*@ zY(D-3hSnaimPfbUmVI$xJFOTW)Po}X_V=-{Zp`qn#=jaT@h_vDm`yA0rNv>LKvK>Y zV544}iP?XM3DnfSrql53$QBk(#_%w@>UO1prgK!C_B})?+xRz*Sql}}@-_T!hq657 z3wf0q@wI|HqCK0boFSVBJ6$X$cZ}8uIe8z}d0|Bucn_m-gLo0%^n5G19U7%)IE_NW z_D?W~Psx^8<s`hl5ZVIEP-M%r?)NE)I|qqdUOiO_&B?;7{iqm8e&u7+IarW*A4i-P z=$2n>fWvQ6y^Cb@1^4b0z46j)7{%&{$pjz=t!7HeXEgRS%N684=$sb>mYHB&gf7jA zbnDwL2d%pe<VA<k>F4vvw>8w_AXvy6Alp^v6^r*D3~FF{(PWpHqas6&#XnJU%{hW? zSsbI$e{qxub1^%fF3@Gu$Q1TOvB7%j0yK`(K2L#i5wSZ+uc^-m&a;Nnn()kpV=$uR z6cHiBYf66-D!9R)JfY+XCGz&}W>y|XCo=IsY~<)&^+vwZu^grm9<s5+{k{~em-P01 zp5%-2h_i-69Uw)J*aVhTUaQKKQLD5#V`c<_XX-DPI+}v!?zFL^5j;JX2d0B?V!EHh zb6h@it!<$cWj`t@mAk&%M!cq>kj*bFPJK|s=57IvedczXq+_1vD9qf>^M-)CM(%Vi zmSwW4kJC-G2bm`YJdAAf62<sUm3z^iiPf$r85fCu3-iCVV+xY|d!NC21AU7S^nWvn z$W`rRqn}Qalu$-!7<4<v3NQEx_m16HrmEJ=Mid&pBp1pRbxD)mpAxQ6%Q+zM;PMiw zymCRO7RHnnoooMQ|1~M)iXxTCh(UZV;Gvo^a4XLCYL;(stC5h?0Fs_1I32JWdt}aA zv(mK-(7m`5r~hcI0ldzEkoHm)&ItJUTW67YE(K7J&ru)|r<}a$aaM<s0+{B6&4`f{ zJxn4J2L6Pi?F`DyZtD?gK(Pbmonw5$i3PNCkEGQQCw2-(`Avn|qY-vPw9u|*kd9_K zrHUCM#t;Qd1VBSo$PjLv?&ECD+|iF`axR@)0Zg66nX%jbt<?Xtl?Y`NJu}GAXm59~ z5Q|(81zCAeU28O(_fRK-65sY!+BV>Lc5)vorfvw;i0Az^&tsO4mx48^pC_2ve=P%1 z?#LR6cIiE{2W3XUK<PnSKKxnFq`;xMuN&~=g$CkJiDsprfj2Io)Hkev^}YM$j#<=? zxEpaBA}IC;%23m;CIjm`)@MB9JU0^i&DBsK`6Lo(NR%FQ$WqGyySq;8n@f9QWH<LO zq154fQE_CfPdbL7O3YuDJ$iRLOKiY6Kruf=^{ydm?4++FAH(93b1FXn=C3<<#kID> ziRzIMBVYpmf)SGV#(7N`IP-AHOT`)6LnQ@sg~`PefXD`Aup$a&p=#B^HBb8yp*a&? z1k^dA{#KX34Lywso%u=E`~9YNplrZk2zoJkXB@3$DtK1R`$B5vlG$w~->Gb~VQCm8 zfk~-4)I!@ez(n~1c-JH%MkRz$v>tY)->tj-_q{m&aWUQfy|q&WL_6H4TznMHJ@OAO zRvE17M*4HLeXv_)?mHQd#f7?pLNAzVP%`kvUNwvuf=#J|*}Cq_>bTU|x_b~&E}(2Z zEZ_EsZ2bQUIPKrPzk5D@Y2%7p)<5~=Kg%LCk?ORliF?`{+kSj3NMO~3mv4LOCGuZ| z{D`OVfk1<NQI-rs)B+`gOn3AarY_ESbw1OH?EnM_Omqh;z--y%|4kjH40>B+oJr-* zom5ND(_HjQ#6-BGarnTEHrO}RjTpuPoY9AN!P)(G^j~Qh0{lqa@xu<~a*9LPQg0(p zZ^;JAsZ~`X4>z{Ghp_%#Z0Q;l8~Wc@@Baau05wZ@gXB(1{bU;?c$Far1F6N#+ROZX zR?~jzueLKWlGkl(2T&1c;0!%%8rS%#!2fQ90Rc{^&c?aonNbKU0UJPyi$pxw26o~^ z%cx~G>n!YX=U8WoLpzKRcODCRCwm7#*S)Ljn9T58CL3bdpj;Wu6JGl&TA4|^J4O-x QJ9SiCSVpKyKri6`0p0-$djJ3c diff --git a/site/themes/arangodb-docs-theme/images/logo_small.png b/site/themes/arangodb-docs-theme/images/logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..da5ab37a9661a5f9bce49fa21419ce0a6275210a GIT binary patch literal 4205 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 WS21y<Pit`~v1;{F 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 D{=CdG literal 0 HcmV?d00001 diff --git a/site/themes/arangodb-docs-theme/layouts/partials/header.html b/site/themes/arangodb-docs-theme/layouts/partials/header.html index 6d73d06742..ac4f189fd6 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/header.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/header.html @@ -14,7 +14,7 @@ <!-- END LOGO--> <div class="arangodb-logo-small"> <a href="https://arangodb.com/"> - <img alt="ArangoDB Logo" src="/images/ArangoDB_Logo_White_small.png"> + <img alt="ArangoDB Logo" src="/images/logo_small.png"> </a> </div> diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html index 3f85cda1a0..0030027cdd 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html @@ -1,5 +1,5 @@ <div class="ag-banner"> - <img src="/images/ArangoGraph_Logo.svg" alt="ArangoGraph" class="logo" /> + <img src="/images/ArangoAMP_logo.svg" alt="ArangoGraph" class="logo" /> <div> <div class="ag-info"> Experience the shortest time to value for a hosted graph DB.</div> diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index a90a85fe9a..1a229b5ba2 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -209,7 +209,7 @@ ul ul, ul ol, ol ul, ol ol { .link { text-decoration: none; - border-bottom: 2px solid var(--green-600); + border-bottom: 2px solid var(--green-400); } .link:hover{ @@ -699,7 +699,7 @@ body .page-container { position: relative; height: 64px; align-items: center; - padding: 6px 10px 0 10px; + padding-left: 10px; } header .logo { @@ -1008,7 +1008,7 @@ header .logo { .sidebar ul.topics li.active > a > .menu-title, .sidebar ul.topics li.alwaysopen > a > .menu-title { font-weight: 400; - color: var(--green-500); + color: var(--green-300); } .sidebar ul li li { @@ -2130,6 +2130,6 @@ nav.pagination .next { color: white; } .ag-banner .logo { - height: 50px !important; + height: 36px !important; width: 200px !important; } diff --git a/toolchain/arangoproxy/cmd/configs/local.yaml b/toolchain/arangoproxy/cmd/configs/local.yaml index d4b28fe6aa..eed35bb7a7 100644 --- a/toolchain/arangoproxy/cmd/configs/local.yaml +++ b/toolchain/arangoproxy/cmd/configs/local.yaml @@ -1,4 +1,4 @@ datasetsFile: '../internal/utils/datasets.json' cache: '/home/site/data/' debug: false -repositories: [] \ No newline at end of file +repositories: [] From 48f41a55671d1b8b4341f5ae4366acb782e2e0e8 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 2 Oct 2025 10:17:21 +0200 Subject: [PATCH 15/44] Theme: Add Urbanist font --- .../arangodb-docs-theme/static/css/fonts.css | 9 +++++++++ .../static/fonts/Urbanist[ital,wght].woff2 | Bin 0 -> 58204 bytes 2 files changed, 9 insertions(+) create mode 100644 site/themes/arangodb-docs-theme/static/fonts/Urbanist[ital,wght].woff2 diff --git a/site/themes/arangodb-docs-theme/static/css/fonts.css b/site/themes/arangodb-docs-theme/static/css/fonts.css index a17db019f0..aec2e520e7 100644 --- a/site/themes/arangodb-docs-theme/static/css/fonts.css +++ b/site/themes/arangodb-docs-theme/static/css/fonts.css @@ -34,3 +34,12 @@ src: url("../fonts/inter-v12-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ } + +/* Urbanist variable font */ +@font-face { + font-display: swap; + font-family: "Urbanist"; + font-style: normal; + font-weight: 100 900; + src: url("../fonts/Urbanist[ital,wght].woff2") format("woff2"); +} diff --git a/site/themes/arangodb-docs-theme/static/fonts/Urbanist[ital,wght].woff2 b/site/themes/arangodb-docs-theme/static/fonts/Urbanist[ital,wght].woff2 new file mode 100644 index 0000000000000000000000000000000000000000..684be8714f6f2346724069c8cf9e8ec51c56f699 GIT binary patch literal 58204 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 literal 0 HcmV?d00001 From edd5d81700a0d4d55f8fe291944c3990978660af Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 15:12:29 +0200 Subject: [PATCH 16/44] Re-enable all core versions --- site/config/_default/config.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/site/config/_default/config.yaml b/site/config/_default/config.yaml index 0a7d2c1541..25e4930333 100644 --- a/site/config/_default/config.yaml +++ b/site/config/_default/config.yaml @@ -19,21 +19,21 @@ module: - source: "static" target: "static" -# - source: content/arangodb/3.12 -# target: content/arangodb/stable - -# - source: content/arangodb/3.13 -# target: content/arangodb/devel - # Version folders can be ignored temporarily for faster local builds # of a single version (here: 3.12) - source: content target: content excludeFiles: - - arangodb/3.10/* - - arangodb/3.11/* +# - arangodb/3.10/* +# - arangodb/3.11/* # - arangodb/3.13/* + - source: content/arangodb/3.12 + target: content/arangodb/stable + + - source: content/arangodb/3.13 + target: content/arangodb/devel + markup: highlight: noClasses: false From 538a871e8caa5b883c6ad8aa676fc64446f5578e Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 15:12:49 +0200 Subject: [PATCH 17/44] Try Urbanist as font for headlines --- site/themes/arangodb-docs-theme/static/css/theme.css | 1 + 1 file changed, 1 insertion(+) diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index ec79d63573..a37a9a1eaf 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -1332,6 +1332,7 @@ article.notfound { hgroup > h1, article > h2, article > h3, article > h4, article > h5, article > h6 { color: var(--HEADERS-COLOR); + font-family: "Urbanist"; font-weight: var(--TYPOGRAPHY-BOLD-TEXT); overflow-wrap: break-word; } From 62ea1037c7a4f41fea87133322bf215364635dcd Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 15:33:31 +0200 Subject: [PATCH 18/44] CircleCI: Account for versions.yaml change when loading versions --- .circleci/generate_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/generate_config.py b/.circleci/generate_config.py index 4d12e8194d..8548703ae6 100644 --- a/.circleci/generate_config.py +++ b/.circleci/generate_config.py @@ -18,7 +18,7 @@ ## Load versions versions = yaml.safe_load(open("versions.yaml", "r")) -versions = sorted(versions, key=lambda d: d['name']) +versions = sorted(versions["/arangodb/"], key=lambda d: d['name']) print(f"Loaded versions {versions}") From 440b218b172a380777447535c4804c1b46991d4f Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 15:33:56 +0200 Subject: [PATCH 19/44] Add optgroup to version selector with label "Version" --- .../layouts/partials/version-selector.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html index 68c1b53c0c..88ec7b6540 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html @@ -1,12 +1,14 @@ <div class="version-selector"> - <select class="arangodb-version" onchange="changeVersion();"> - {{ $versions := index site.Data.versions "/arangodb/" }} - {{ range $i, $version := $versions }} + <select class="arangodb-version" onchange="changeVersion();"> + <optgroup label="Version"> + {{ $versions := index site.Data.versions "/arangodb/" }} + {{ range $i, $version := $versions }} {{/* if eq $version.name "platform" }}{{ continue }}{{ end */}} {{ if ne $version.name $version.alias }} - <option value="{{ $version.alias }}">{{ $version.alias }}</option> + <option value="{{ $version.alias }}">{{ $version.alias }}</option> {{ end }} <option value="{{ $version.name }}"{{ if eq $version.name "3.12" }} selected{{ end }}>{{ $version.name }}</option> - {{ end }} - </select> + {{ end }} + </optgroup> + </select> </div> \ No newline at end of file From 7ad86718906e177e883fffc82d0f9335883e2c4a Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Mon, 13 Oct 2025 15:43:18 +0200 Subject: [PATCH 20/44] Set sans-serif as fallback font for headlines Less jarring change while the Urbanist font loads --- site/themes/arangodb-docs-theme/static/css/theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index a37a9a1eaf..58f5604d3a 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -1332,7 +1332,7 @@ article.notfound { hgroup > h1, article > h2, article > h3, article > h4, article > h5, article > h6 { color: var(--HEADERS-COLOR); - font-family: "Urbanist"; + font-family: "Urbanist", sans-serif; font-weight: var(--TYPOGRAPHY-BOLD-TEXT); overflow-wrap: break-word; } From 46b461709f88e98e8d57bd7c01d39f0bd24e6b3b Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 13:51:13 +0200 Subject: [PATCH 21/44] Change tags due to renaming --- README.md | 2 +- site/content/arangodb/3.10/aql/functions/arangosearch.md | 2 +- site/content/arangodb/3.10/aql/graphs/traversals.md | 4 ++-- .../arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md | 6 +++--- .../arangodb/3.10/components/arangodb-server/ldap.md | 2 +- .../arangodb/3.10/components/tools/arangodump/examples.md | 2 +- .../arangodb/3.10/components/tools/arangodump/maskings.md | 2 +- site/content/arangodb/3.10/deploy/_index.md | 2 +- site/content/arangodb/3.10/deploy/oneshard.md | 2 +- site/content/arangodb/3.10/develop/http-api/documents.md | 2 +- .../content/arangodb/3.10/develop/satellitecollections.md | 2 +- site/content/arangodb/3.10/develop/smartjoins.md | 2 +- .../arangodb/3.10/graphs/enterprisegraphs/_index.md | 2 +- .../arangodb/3.10/graphs/satellitegraphs/_index.md | 2 +- site/content/arangodb/3.10/graphs/smartgraphs/_index.md | 2 +- .../graphs/smartgraphs/testing-graphs-on-single-server.md | 2 +- site/content/arangodb/3.10/index-and-search/analyzers.md | 8 ++++---- .../arangosearch/arangosearch-views-reference.md | 6 +++--- .../3.10/index-and-search/arangosearch/nested-search.md | 2 +- .../3.10/index-and-search/arangosearch/performance.md | 2 +- .../index-and-search/arangosearch/search-highlighting.md | 2 +- .../operations/administration/user-management/_index.md | 2 +- .../arangodb/3.10/operations/backup-and-restore.md | 2 +- .../3.10/operations/security/encryption-at-rest.md | 2 +- .../3.10/release-notes/version-3.6/whats-new-in-3-6.md | 2 +- site/content/arangodb/3.11/aql/functions/arangosearch.md | 2 +- site/content/arangodb/3.11/aql/graphs/traversals.md | 4 ++-- .../arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md | 6 +++--- .../arangodb/3.11/components/arangodb-server/ldap.md | 2 +- .../arangodb/3.11/components/tools/arangodump/examples.md | 2 +- .../arangodb/3.11/components/tools/arangodump/maskings.md | 2 +- site/content/arangodb/3.11/deploy/_index.md | 2 +- site/content/arangodb/3.11/deploy/oneshard.md | 2 +- site/content/arangodb/3.11/develop/http-api/documents.md | 2 +- .../content/arangodb/3.11/develop/satellitecollections.md | 2 +- site/content/arangodb/3.11/develop/smartjoins.md | 2 +- .../arangodb/3.11/graphs/enterprisegraphs/_index.md | 2 +- .../arangodb/3.11/graphs/satellitegraphs/_index.md | 2 +- site/content/arangodb/3.11/graphs/smartgraphs/_index.md | 2 +- .../graphs/smartgraphs/testing-graphs-on-single-server.md | 2 +- site/content/arangodb/3.11/index-and-search/analyzers.md | 8 ++++---- .../arangosearch/arangosearch-views-reference.md | 6 +++--- .../3.11/index-and-search/arangosearch/nested-search.md | 2 +- .../3.11/index-and-search/arangosearch/performance.md | 4 ++-- .../index-and-search/arangosearch/search-highlighting.md | 2 +- .../operations/administration/user-management/_index.md | 2 +- .../arangodb/3.11/operations/backup-and-restore.md | 2 +- .../3.11/operations/security/encryption-at-rest.md | 2 +- .../3.11/release-notes/version-3.6/whats-new-in-3-6.md | 2 +- .../3.12/release-notes/version-3.6/whats-new-in-3-6.md | 2 +- .../3.13/release-notes/version-3.6/whats-new-in-3-6.md | 2 +- site/content/data-platform/graph-visualizer.md | 2 +- site/content/gen-ai/graph-analytics.md | 6 +++--- site/content/gen-ai/graph-to-ai.md | 2 +- site/content/gen-ai/graphml/_index.md | 2 +- site/content/gen-ai/graphml/notebooks-api.md | 2 +- site/content/gen-ai/graphml/quickstart.md | 2 +- site/content/gen-ai/graphml/ui.md | 2 +- site/content/gen-ai/graphrag/_index.md | 2 +- site/content/gen-ai/graphrag/tutorial-notebook.md | 2 +- site/content/gen-ai/graphrag/web-interface.md | 2 +- site/content/gen-ai/notebook-servers.md | 2 +- site/content/gen-ai/services/gen-ai.md | 2 +- site/content/gen-ai/services/importer.md | 2 +- site/content/gen-ai/services/mlflow.md | 2 +- site/content/gen-ai/services/retriever.md | 2 +- site/content/gen-ai/services/triton-inference-server.md | 2 +- 67 files changed, 86 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index 56f14f3459..e1e35f9adf 100644 --- a/README.md +++ b/README.md @@ -720,7 +720,7 @@ Enterprise Edition features should indicate that the Enterprise Edition is required using a tag. Use the following include in the general case: ```markdown -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ``` ### Add lead paragraphs diff --git a/site/content/arangodb/3.10/aql/functions/arangosearch.md b/site/content/arangodb/3.10/aql/functions/arangosearch.md index 0b0107c595..4bfe55e35c 100644 --- a/site/content/arangodb/3.10/aql/functions/arangosearch.md +++ b/site/content/arangodb/3.10/aql/functions/arangosearch.md @@ -1281,7 +1281,7 @@ FOR doc IN viewName ## Search Highlighting Functions -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ### OFFSET_INFO() diff --git a/site/content/arangodb/3.10/aql/graphs/traversals.md b/site/content/arangodb/3.10/aql/graphs/traversals.md index 08d18ddfa6..c3d3bb2442 100644 --- a/site/content/arangodb/3.10/aql/graphs/traversals.md +++ b/site/content/arangodb/3.10/aql/graphs/traversals.md @@ -126,7 +126,7 @@ FOR vertex[, edge[, path]] of the collections specified by a restriction. - **parallelism** (number, *optional*): - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} Optionally parallelize traversal execution. If omitted or set to a value of `1`, traversal execution is not parallelized. If set to a value greater than `1`, @@ -141,7 +141,7 @@ FOR vertex[, edge[, path]] execution. - **maxProjections** (number, *optional*): - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} Specifies the number of document attributes per `FOR` loop to be used as projections. The default value is `5`. diff --git a/site/content/arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md index a2a7a53b53..0700890dd7 100644 --- a/site/content/arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md +++ b/site/content/arangodb/3.10/aql/how-to-invoke-aql/with-arangosh.md @@ -422,7 +422,7 @@ the entire query result in RAM, use a streaming query (see the #### `allowDirtyReads` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -433,7 +433,7 @@ for details. #### `skipInaccessibleCollections` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Let AQL queries (especially graph traversals) treat collection to which a user has **no access** rights for as if these collections are empty. @@ -444,7 +444,7 @@ accessible results by changing the access rights of users on collections. #### `satelliteSyncWait` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Configure how long a DB-Server has time to bring the SatelliteCollections involved in the query into sync. The default value is `60.0` seconds. diff --git a/site/content/arangodb/3.10/components/arangodb-server/ldap.md b/site/content/arangodb/3.10/components/arangodb-server/ldap.md index b773edf61e..2fde26e69f 100644 --- a/site/content/arangodb/3.10/components/arangodb-server/ldap.md +++ b/site/content/arangodb/3.10/components/arangodb-server/ldap.md @@ -5,7 +5,7 @@ weight: 10 description: >- LDAP authentication options in the ArangoDB server --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## Basics Concepts diff --git a/site/content/arangodb/3.10/components/tools/arangodump/examples.md b/site/content/arangodb/3.10/components/tools/arangodump/examples.md index 1c3b95c6f4..54000c4e5e 100644 --- a/site/content/arangodb/3.10/components/tools/arangodump/examples.md +++ b/site/content/arangodb/3.10/components/tools/arangodump/examples.md @@ -156,7 +156,7 @@ INFO [66c0e] {dump} Processed 2 collection(s) from 1 database(s) in 0.132990 s t ## Encryption -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} You can encrypt dumps using an encryption keyfile, which must contain exactly 32 bytes of data (required by the AES block cipher). diff --git a/site/content/arangodb/3.10/components/tools/arangodump/maskings.md b/site/content/arangodb/3.10/components/tools/arangodump/maskings.md index 032ea149b4..5760a360ee 100644 --- a/site/content/arangodb/3.10/components/tools/arangodump/maskings.md +++ b/site/content/arangodb/3.10/components/tools/arangodump/maskings.md @@ -470,7 +470,7 @@ processed by a single masking function, ignoring any other rules below it. ## Masking Functions -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} - [Xify Front](#xify-front) - [Zip](#zip) diff --git a/site/content/arangodb/3.10/deploy/_index.md b/site/content/arangodb/3.10/deploy/_index.md index e073069b53..80a2c14e05 100644 --- a/site/content/arangodb/3.10/deploy/_index.md +++ b/site/content/arangodb/3.10/deploy/_index.md @@ -44,7 +44,7 @@ You can deploy systems that dynamically scale up and down according to demand. ### OneShard -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} [OneShard deployments](oneshard.md) are cluster deployments but with the data of each database restricted to a single shard. This allows queries to run locally diff --git a/site/content/arangodb/3.10/deploy/oneshard.md b/site/content/arangodb/3.10/deploy/oneshard.md index 048508fdfd..743836841b 100644 --- a/site/content/arangodb/3.10/deploy/oneshard.md +++ b/site/content/arangodb/3.10/deploy/oneshard.md @@ -6,7 +6,7 @@ description: >- The OneShard feature offers a practicable solution that enables significantly improved performance and transactional guarantees for cluster deployments --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} The OneShard option for ArangoDB clusters restricts all collections of a database to a single shard so that every collection has `numberOfShards` set to `1`, diff --git a/site/content/arangodb/3.10/develop/http-api/documents.md b/site/content/arangodb/3.10/develop/http-api/documents.md index ec68f4fb1e..95921d836f 100644 --- a/site/content/arangodb/3.10/develop/http-api/documents.md +++ b/site/content/arangodb/3.10/develop/http-api/documents.md @@ -2537,7 +2537,7 @@ db._drop(cn); ### Read from followers -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> diff --git a/site/content/arangodb/3.10/develop/satellitecollections.md b/site/content/arangodb/3.10/develop/satellitecollections.md index d470d6bb2b..2e95897664 100644 --- a/site/content/arangodb/3.10/develop/satellitecollections.md +++ b/site/content/arangodb/3.10/develop/satellitecollections.md @@ -5,7 +5,7 @@ weight: 250 description: >- Collections synchronously replicated to all servers, available in the Enterprise Edition --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} When doing joins in an ArangoDB cluster data has to be exchanged between different servers. diff --git a/site/content/arangodb/3.10/develop/smartjoins.md b/site/content/arangodb/3.10/develop/smartjoins.md index fd44d18d56..498f62f6ff 100644 --- a/site/content/arangodb/3.10/develop/smartjoins.md +++ b/site/content/arangodb/3.10/develop/smartjoins.md @@ -6,7 +6,7 @@ description: >- SmartJoins allow to execute co-located join operations among identically sharded collections --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## Cluster joins without being smart diff --git a/site/content/arangodb/3.10/graphs/enterprisegraphs/_index.md b/site/content/arangodb/3.10/graphs/enterprisegraphs/_index.md index 27db0dfcee..f0614e1e83 100644 --- a/site/content/arangodb/3.10/graphs/enterprisegraphs/_index.md +++ b/site/content/arangodb/3.10/graphs/enterprisegraphs/_index.md @@ -6,7 +6,7 @@ description: >- EnterpriseGraphs enable you to manage graphs at scale with automated sharding key selection --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} This chapter describes the `enterprise-graph` module, a specialized version of [SmartGraphs](../smartgraphs/_index.md). diff --git a/site/content/arangodb/3.10/graphs/satellitegraphs/_index.md b/site/content/arangodb/3.10/graphs/satellitegraphs/_index.md index 9f22526ee7..ad984dae22 100644 --- a/site/content/arangodb/3.10/graphs/satellitegraphs/_index.md +++ b/site/content/arangodb/3.10/graphs/satellitegraphs/_index.md @@ -7,7 +7,7 @@ description: >- --- <small>Introduced in: v3.7.0</small> -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## What is a SatelliteGraph? diff --git a/site/content/arangodb/3.10/graphs/smartgraphs/_index.md b/site/content/arangodb/3.10/graphs/smartgraphs/_index.md index a9a166b0fe..e3faa431ba 100644 --- a/site/content/arangodb/3.10/graphs/smartgraphs/_index.md +++ b/site/content/arangodb/3.10/graphs/smartgraphs/_index.md @@ -5,7 +5,7 @@ weight: 95 description: >- SmartGraphs enable you to manage graphs at scale using value-based sharding --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} SmartGraphs are specifically targeted at graphs that need scalability and high performance. The way SmartGraphs use the ArangoDB cluster sharding makes it diff --git a/site/content/arangodb/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md index 5a952b26a6..cb838d8f4e 100644 --- a/site/content/arangodb/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md +++ b/site/content/arangodb/3.10/graphs/smartgraphs/testing-graphs-on-single-server.md @@ -6,7 +6,7 @@ description: >- Simulate SmartGraphs and SatelliteGraphs on a single server to make it easier to port them to an ArangoDB cluster later --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## General idea diff --git a/site/content/arangodb/3.10/index-and-search/analyzers.md b/site/content/arangodb/3.10/index-and-search/analyzers.md index 8d2e041062..d010f0f77b 100644 --- a/site/content/arangodb/3.10/index-and-search/analyzers.md +++ b/site/content/arangodb/3.10/index-and-search/analyzers.md @@ -1049,7 +1049,7 @@ db._query(`LET str = 'Test\twith An_EMAIL-address+123@example.org\n蝴蝶。\u20 ### `minhash` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -1092,7 +1092,7 @@ db._query(` ### `classification` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -1152,7 +1152,7 @@ db._query(`LET str = "Which baking dish is best to bake a banana bread ?" ### `nearest_neighbors` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -1332,7 +1332,7 @@ db._query(`LET point = GEO_POINT(6.93, 50.94) ### `geo_s2` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.5</small> diff --git a/site/content/arangodb/3.10/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/3.10/index-and-search/arangosearch/arangosearch-views-reference.md index 83b80d0f85..82dad0ee4e 100644 --- a/site/content/arangodb/3.10/index-and-search/arangosearch/arangosearch-views-reference.md +++ b/site/content/arangodb/3.10/index-and-search/arangosearch/arangosearch-views-reference.md @@ -177,7 +177,7 @@ During view modification the following directives apply: - **cache** (_optional_; type: `boolean`; default: `false`) - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.5, v3.10.2</small> @@ -229,7 +229,7 @@ cache-related options and thus recreate inverted indexes and Views. See - **primarySortCache** (_optional_; type: `boolean`; default: `false`; _immutable_) - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.6, v3.10.2</small> @@ -248,7 +248,7 @@ cache-related options and thus recreate inverted indexes and Views. See - **primaryKeyCache** (_optional_; type: `boolean`; default: `false`; _immutable_) - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.6, v3.10.2</small> diff --git a/site/content/arangodb/3.10/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/3.10/index-and-search/arangosearch/nested-search.md index f126935cf6..563adf1d58 100644 --- a/site/content/arangodb/3.10/index-and-search/arangosearch/nested-search.md +++ b/site/content/arangodb/3.10/index-and-search/arangosearch/nested-search.md @@ -7,7 +7,7 @@ description: >- each, and define how often these conditions should be fulfilled for the entire array --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} By default, `arangosearch` Views index arrays as if the parent attribute had multiple values at once. This is also supported for `search-alias` Views by enabling diff --git a/site/content/arangodb/3.10/index-and-search/arangosearch/performance.md b/site/content/arangodb/3.10/index-and-search/arangosearch/performance.md index b7296c94ba..81279d55e3 100644 --- a/site/content/arangodb/3.10/index-and-search/arangosearch/performance.md +++ b/site/content/arangodb/3.10/index-and-search/arangosearch/performance.md @@ -536,7 +536,7 @@ Also see [Faceted Search with ArangoSearch](faceted-search.md). ## Field normalization value caching and caching of Geo Analyzer auxiliary data -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.5, v3.10.2</small> diff --git a/site/content/arangodb/3.10/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/3.10/index-and-search/arangosearch/search-highlighting.md index 63e8ea7176..aaa11fb3c4 100644 --- a/site/content/arangodb/3.10/index-and-search/arangosearch/search-highlighting.md +++ b/site/content/arangodb/3.10/index-and-search/arangosearch/search-highlighting.md @@ -6,7 +6,7 @@ description: >- You can retrieve the positions of matches within strings when querying Views with ArangoSearch, to highlight what was found in search results --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ArangoSearch lets you search for terms and phrases in full-text, and more. It only returns matching documents, however. With search highlighting, you can diff --git a/site/content/arangodb/3.10/operations/administration/user-management/_index.md b/site/content/arangodb/3.10/operations/administration/user-management/_index.md index 481b95ec5a..32dd9ffd61 100644 --- a/site/content/arangodb/3.10/operations/administration/user-management/_index.md +++ b/site/content/arangodb/3.10/operations/administration/user-management/_index.md @@ -408,7 +408,7 @@ or the web interface. ### LDAP Users -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ArangoDB supports LDAP as an external authentication system. For detailed information please have look into the diff --git a/site/content/arangodb/3.10/operations/backup-and-restore.md b/site/content/arangodb/3.10/operations/backup-and-restore.md index 942a1fbdbe..a6acb7f7bb 100644 --- a/site/content/arangodb/3.10/operations/backup-and-restore.md +++ b/site/content/arangodb/3.10/operations/backup-and-restore.md @@ -69,7 +69,7 @@ procedure is recommended. ## Hot Backups -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Hot backup and restore associated operations can be performed with the [_arangobackup_](../components/tools/arangobackup/_index.md) client tool and the diff --git a/site/content/arangodb/3.10/operations/security/encryption-at-rest.md b/site/content/arangodb/3.10/operations/security/encryption-at-rest.md index 8a958d9be1..34a2b37ab2 100644 --- a/site/content/arangodb/3.10/operations/security/encryption-at-rest.md +++ b/site/content/arangodb/3.10/operations/security/encryption-at-rest.md @@ -6,7 +6,7 @@ description: >- You can secure the physical storage media of an ArangoDB deployment by letting it encrypt the database directories --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} When you store sensitive data in your ArangoDB database, you want to protect that data under all circumstances. At runtime you will protect it with SSL diff --git a/site/content/arangodb/3.10/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.10/release-notes/version-3.6/whats-new-in-3-6.md index 02b89c84bb..b25cb21b69 100644 --- a/site/content/arangodb/3.10/release-notes/version-3.6/whats-new-in-3-6.md +++ b/site/content/arangodb/3.10/release-notes/version-3.6/whats-new-in-3-6.md @@ -562,7 +562,7 @@ operand can be a collection or another View. ## OneShard -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Not all use cases require horizontal scalability. In such cases, a OneShard deployment offers a practicable solution that enables significant performance diff --git a/site/content/arangodb/3.11/aql/functions/arangosearch.md b/site/content/arangodb/3.11/aql/functions/arangosearch.md index 303eb0419f..2672ed25dd 100644 --- a/site/content/arangodb/3.11/aql/functions/arangosearch.md +++ b/site/content/arangodb/3.11/aql/functions/arangosearch.md @@ -1271,7 +1271,7 @@ FOR doc IN viewName ## Search Highlighting Functions -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ### OFFSET_INFO() diff --git a/site/content/arangodb/3.11/aql/graphs/traversals.md b/site/content/arangodb/3.11/aql/graphs/traversals.md index f9268387a1..657fbf0917 100644 --- a/site/content/arangodb/3.11/aql/graphs/traversals.md +++ b/site/content/arangodb/3.11/aql/graphs/traversals.md @@ -189,7 +189,7 @@ If omitted or an empty array is specified, then there are no restrictions. #### `parallelism` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Parallelize traversal execution (number). @@ -206,7 +206,7 @@ execution. #### `maxProjections` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Specifies the number of document attributes per `FOR` loop to be used as projections (number). The default value is `5`. diff --git a/site/content/arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md index 20c0a0b70f..c430c0efce 100644 --- a/site/content/arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md +++ b/site/content/arangodb/3.11/aql/how-to-invoke-aql/with-arangosh.md @@ -482,7 +482,7 @@ the entire query result in RAM, use a streaming query (see the #### `allowDirtyReads` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -493,7 +493,7 @@ for details. #### `skipInaccessibleCollections` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Let AQL queries (especially graph traversals) treat collection to which a user has **no access** rights for as if these collections are empty. @@ -504,7 +504,7 @@ accessible results by changing the access rights of users on collections. #### `satelliteSyncWait` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Configure how long a DB-Server has time to bring the SatelliteCollections involved in the query into sync. The default value is `60.0` seconds. diff --git a/site/content/arangodb/3.11/components/arangodb-server/ldap.md b/site/content/arangodb/3.11/components/arangodb-server/ldap.md index b773edf61e..2fde26e69f 100644 --- a/site/content/arangodb/3.11/components/arangodb-server/ldap.md +++ b/site/content/arangodb/3.11/components/arangodb-server/ldap.md @@ -5,7 +5,7 @@ weight: 10 description: >- LDAP authentication options in the ArangoDB server --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## Basics Concepts diff --git a/site/content/arangodb/3.11/components/tools/arangodump/examples.md b/site/content/arangodb/3.11/components/tools/arangodump/examples.md index 473f550e1c..bde4958905 100644 --- a/site/content/arangodb/3.11/components/tools/arangodump/examples.md +++ b/site/content/arangodb/3.11/components/tools/arangodump/examples.md @@ -156,7 +156,7 @@ INFO [66c0e] {dump} Processed 2 collection(s) from 1 database(s) in 0.132990 s t ## Encryption -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} You can encrypt dumps using an encryption keyfile, which must contain exactly 32 bytes of data (required by the AES block cipher). diff --git a/site/content/arangodb/3.11/components/tools/arangodump/maskings.md b/site/content/arangodb/3.11/components/tools/arangodump/maskings.md index 415262ccd5..0bec342887 100644 --- a/site/content/arangodb/3.11/components/tools/arangodump/maskings.md +++ b/site/content/arangodb/3.11/components/tools/arangodump/maskings.md @@ -470,7 +470,7 @@ processed by a single masking function, ignoring any other rules below it. ## Masking Functions -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} - [Xify Front](#xify-front) - [Zip](#zip) diff --git a/site/content/arangodb/3.11/deploy/_index.md b/site/content/arangodb/3.11/deploy/_index.md index d23d40ddf1..98e7932147 100644 --- a/site/content/arangodb/3.11/deploy/_index.md +++ b/site/content/arangodb/3.11/deploy/_index.md @@ -44,7 +44,7 @@ You can deploy systems that dynamically scale up and down according to demand. ### OneShard -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} [OneShard deployments](oneshard.md) are cluster deployments but with the data of each database restricted to a single shard. This allows queries to run locally diff --git a/site/content/arangodb/3.11/deploy/oneshard.md b/site/content/arangodb/3.11/deploy/oneshard.md index 8a35123968..1852df41d7 100644 --- a/site/content/arangodb/3.11/deploy/oneshard.md +++ b/site/content/arangodb/3.11/deploy/oneshard.md @@ -6,7 +6,7 @@ description: >- The OneShard feature offers a practicable solution that enables significantly improved performance and transactional guarantees for cluster deployments --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} The OneShard option for ArangoDB clusters restricts all collections of a database to a single shard so that every collection has `numberOfShards` set to `1`, diff --git a/site/content/arangodb/3.11/develop/http-api/documents.md b/site/content/arangodb/3.11/develop/http-api/documents.md index 6487f83c29..a101e250d1 100644 --- a/site/content/arangodb/3.11/develop/http-api/documents.md +++ b/site/content/arangodb/3.11/develop/http-api/documents.md @@ -2989,7 +2989,7 @@ db._drop(cn); ## Read from followers -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> diff --git a/site/content/arangodb/3.11/develop/satellitecollections.md b/site/content/arangodb/3.11/develop/satellitecollections.md index fee6ab3321..9348ebf3f5 100644 --- a/site/content/arangodb/3.11/develop/satellitecollections.md +++ b/site/content/arangodb/3.11/develop/satellitecollections.md @@ -5,7 +5,7 @@ weight: 250 description: >- Collections synchronously replicated to all servers to enable local joins --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} When doing joins in an ArangoDB cluster data has to be exchanged between different servers. diff --git a/site/content/arangodb/3.11/develop/smartjoins.md b/site/content/arangodb/3.11/develop/smartjoins.md index fd44d18d56..498f62f6ff 100644 --- a/site/content/arangodb/3.11/develop/smartjoins.md +++ b/site/content/arangodb/3.11/develop/smartjoins.md @@ -6,7 +6,7 @@ description: >- SmartJoins allow to execute co-located join operations among identically sharded collections --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## Cluster joins without being smart diff --git a/site/content/arangodb/3.11/graphs/enterprisegraphs/_index.md b/site/content/arangodb/3.11/graphs/enterprisegraphs/_index.md index 27db0dfcee..f0614e1e83 100644 --- a/site/content/arangodb/3.11/graphs/enterprisegraphs/_index.md +++ b/site/content/arangodb/3.11/graphs/enterprisegraphs/_index.md @@ -6,7 +6,7 @@ description: >- EnterpriseGraphs enable you to manage graphs at scale with automated sharding key selection --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} This chapter describes the `enterprise-graph` module, a specialized version of [SmartGraphs](../smartgraphs/_index.md). diff --git a/site/content/arangodb/3.11/graphs/satellitegraphs/_index.md b/site/content/arangodb/3.11/graphs/satellitegraphs/_index.md index 05019c8b3a..c4b5f0f647 100644 --- a/site/content/arangodb/3.11/graphs/satellitegraphs/_index.md +++ b/site/content/arangodb/3.11/graphs/satellitegraphs/_index.md @@ -5,7 +5,7 @@ weight: 90 description: >- Graphs synchronously replicated to all servers, available in the Enterprise Edition --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## What is a SatelliteGraph? diff --git a/site/content/arangodb/3.11/graphs/smartgraphs/_index.md b/site/content/arangodb/3.11/graphs/smartgraphs/_index.md index a9a166b0fe..e3faa431ba 100644 --- a/site/content/arangodb/3.11/graphs/smartgraphs/_index.md +++ b/site/content/arangodb/3.11/graphs/smartgraphs/_index.md @@ -5,7 +5,7 @@ weight: 95 description: >- SmartGraphs enable you to manage graphs at scale using value-based sharding --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} SmartGraphs are specifically targeted at graphs that need scalability and high performance. The way SmartGraphs use the ArangoDB cluster sharding makes it diff --git a/site/content/arangodb/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md index 5a952b26a6..cb838d8f4e 100644 --- a/site/content/arangodb/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md +++ b/site/content/arangodb/3.11/graphs/smartgraphs/testing-graphs-on-single-server.md @@ -6,7 +6,7 @@ description: >- Simulate SmartGraphs and SatelliteGraphs on a single server to make it easier to port them to an ArangoDB cluster later --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ## General idea diff --git a/site/content/arangodb/3.11/index-and-search/analyzers.md b/site/content/arangodb/3.11/index-and-search/analyzers.md index 480260c4ed..28191e7016 100644 --- a/site/content/arangodb/3.11/index-and-search/analyzers.md +++ b/site/content/arangodb/3.11/index-and-search/analyzers.md @@ -1074,7 +1074,7 @@ db._query(`LET str = 'Test\twith An_EMAIL-address+123@example.org\n蝴蝶。\u20 ### `minhash` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -1117,7 +1117,7 @@ db._query(` ### `classification` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -1177,7 +1177,7 @@ db._query(`LET str = "Which baking dish is best to bake a banana bread ?" ### `nearest_neighbors` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.0</small> @@ -1357,7 +1357,7 @@ db._query(`LET point = GEO_POINT(6.93, 50.94) ### `geo_s2` -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.10.5</small> diff --git a/site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md index ca4e877a28..588bb9e4df 100644 --- a/site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/arangosearch-views-reference.md @@ -214,7 +214,7 @@ During view modification the following directives apply: - **cache** (_optional_; type: `boolean`; default: `false`) - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.5, v3.10.2</small> @@ -257,7 +257,7 @@ During view modification the following directives apply: - **primarySortCache** (_optional_; type: `boolean`; default: `false`; _immutable_) - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.6, v3.10.2</small> @@ -276,7 +276,7 @@ During view modification the following directives apply: - **primaryKeyCache** (_optional_; type: `boolean`; default: `false`; _immutable_) - {{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.6, v3.10.2</small> diff --git a/site/content/arangodb/3.11/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/3.11/index-and-search/arangosearch/nested-search.md index f126935cf6..563adf1d58 100644 --- a/site/content/arangodb/3.11/index-and-search/arangosearch/nested-search.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/nested-search.md @@ -7,7 +7,7 @@ description: >- each, and define how often these conditions should be fulfilled for the entire array --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} By default, `arangosearch` Views index arrays as if the parent attribute had multiple values at once. This is also supported for `search-alias` Views by enabling diff --git a/site/content/arangodb/3.11/index-and-search/arangosearch/performance.md b/site/content/arangodb/3.11/index-and-search/arangosearch/performance.md index 8c22182149..f40d4834c7 100644 --- a/site/content/arangodb/3.11/index-and-search/arangosearch/performance.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/performance.md @@ -536,7 +536,7 @@ Also see [Faceted Search with ArangoSearch](faceted-search.md). ## Field normalization value caching and caching of Geo Analyzer auxiliary data -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.5, v3.10.2</small> @@ -622,7 +622,7 @@ use normalization for a good scoring behavior. ## Primary key caching -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} <small>Introduced in: v3.9.6, v3.10.2</small> diff --git a/site/content/arangodb/3.11/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/3.11/index-and-search/arangosearch/search-highlighting.md index 63e8ea7176..aaa11fb3c4 100644 --- a/site/content/arangodb/3.11/index-and-search/arangosearch/search-highlighting.md +++ b/site/content/arangodb/3.11/index-and-search/arangosearch/search-highlighting.md @@ -6,7 +6,7 @@ description: >- You can retrieve the positions of matches within strings when querying Views with ArangoSearch, to highlight what was found in search results --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ArangoSearch lets you search for terms and phrases in full-text, and more. It only returns matching documents, however. With search highlighting, you can diff --git a/site/content/arangodb/3.11/operations/administration/user-management/_index.md b/site/content/arangodb/3.11/operations/administration/user-management/_index.md index 7e9cb977a4..a07198e053 100644 --- a/site/content/arangodb/3.11/operations/administration/user-management/_index.md +++ b/site/content/arangodb/3.11/operations/administration/user-management/_index.md @@ -408,7 +408,7 @@ or the web interface. ### LDAP Users -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} ArangoDB supports LDAP as an external authentication system. For detailed information please have look into the diff --git a/site/content/arangodb/3.11/operations/backup-and-restore.md b/site/content/arangodb/3.11/operations/backup-and-restore.md index 30bcb6c940..483260b65e 100644 --- a/site/content/arangodb/3.11/operations/backup-and-restore.md +++ b/site/content/arangodb/3.11/operations/backup-and-restore.md @@ -63,7 +63,7 @@ Logical backups can be created and restored with the tools ## Hot Backups -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Hot backup and restore associated operations can be performed with the [_arangobackup_](../components/tools/arangobackup/_index.md) client tool and the diff --git a/site/content/arangodb/3.11/operations/security/encryption-at-rest.md b/site/content/arangodb/3.11/operations/security/encryption-at-rest.md index 8a958d9be1..34a2b37ab2 100644 --- a/site/content/arangodb/3.11/operations/security/encryption-at-rest.md +++ b/site/content/arangodb/3.11/operations/security/encryption-at-rest.md @@ -6,7 +6,7 @@ description: >- You can secure the physical storage media of an ArangoDB deployment by letting it encrypt the database directories --- -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} When you store sensitive data in your ArangoDB database, you want to protect that data under all circumstances. At runtime you will protect it with SSL diff --git a/site/content/arangodb/3.11/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.11/release-notes/version-3.6/whats-new-in-3-6.md index 02b89c84bb..b25cb21b69 100644 --- a/site/content/arangodb/3.11/release-notes/version-3.6/whats-new-in-3-6.md +++ b/site/content/arangodb/3.11/release-notes/version-3.6/whats-new-in-3-6.md @@ -562,7 +562,7 @@ operand can be a collection or another View. ## OneShard -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Not all use cases require horizontal scalability. In such cases, a OneShard deployment offers a practicable solution that enables significant performance diff --git a/site/content/arangodb/3.12/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.12/release-notes/version-3.6/whats-new-in-3-6.md index b099ff228c..0723591910 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.6/whats-new-in-3-6.md +++ b/site/content/arangodb/3.12/release-notes/version-3.6/whats-new-in-3-6.md @@ -562,7 +562,7 @@ operand can be a collection or another View. ## OneShard -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Not all use cases require horizontal scalability. In such cases, a OneShard deployment offers a practicable solution that enables significant performance diff --git a/site/content/arangodb/3.13/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/3.13/release-notes/version-3.6/whats-new-in-3-6.md index b099ff228c..0723591910 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.6/whats-new-in-3-6.md +++ b/site/content/arangodb/3.13/release-notes/version-3.6/whats-new-in-3-6.md @@ -562,7 +562,7 @@ operand can be a collection or another View. ## OneShard -{{< tag "ArangoDB Enterprise Edition" "ArangoGraph" >}} +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} Not all use cases require horizontal scalability. In such cases, a OneShard deployment offers a practicable solution that enables significant performance diff --git a/site/content/data-platform/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md index e3ae2c0a2d..c20aad4fa6 100644 --- a/site/content/data-platform/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -5,7 +5,7 @@ weight: 10 description: >- Visually explore and interact with your ArangoDB graphs through an intuitive interface --- -{{< tag "ArangoDB Platform" >}} +{{< tag "Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/graph-analytics.md b/site/content/gen-ai/graph-analytics.md index 3edcca4dd5..6692559834 100644 --- a/site/content/gen-ai/graph-analytics.md +++ b/site/content/gen-ai/graph-analytics.md @@ -8,7 +8,7 @@ description: | aliases: - ../data-science/graph-analytics --- -{{< tag "ArangoDB Platform" "ArangoGraph" >}} +{{< tag "GenAI Data Platform" "AMP" >}} Graph analytics is a branch of data science that deals with analyzing information networks known as graphs, and extracting information from the data relationships. @@ -136,7 +136,7 @@ The interface for managing the engines depends on the environment you use: ### GenAI service -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} GAEs are deployed and deleted via the [GenAI service](services/gen-ai.md) in the ArangoDB Platform. @@ -185,7 +185,7 @@ curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X DELETE https://127.0.0.1:8529 ### Management API -{{< tag "ArangoGraph" >}} +{{< tag "AMP" >}} GAEs are deployed and deleted with the Management API for graph analytics on the Arango Managed Platform (AMP). You can also list the available engine sizes and diff --git a/site/content/gen-ai/graph-to-ai.md b/site/content/gen-ai/graph-to-ai.md index b262997bb2..70ada16d46 100644 --- a/site/content/gen-ai/graph-to-ai.md +++ b/site/content/gen-ai/graph-to-ai.md @@ -10,7 +10,7 @@ aliases: --- - [Link to 3.12](../arangodb/3.12/aql/_index.md) -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/graphml/_index.md b/site/content/gen-ai/graphml/_index.md index 241db624b9..4182ba71ba 100644 --- a/site/content/gen-ai/graphml/_index.md +++ b/site/content/gen-ai/graphml/_index.md @@ -7,7 +7,7 @@ description: >- aliases: - arangographml --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/graphml/notebooks-api.md b/site/content/gen-ai/graphml/notebooks-api.md index 008d079d97..ad0f9ad2ea 100644 --- a/site/content/gen-ai/graphml/notebooks-api.md +++ b/site/content/gen-ai/graphml/notebooks-api.md @@ -10,7 +10,7 @@ aliases: - ../arangographml-getting-started-with-arangographml --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} The ArangoDB Platform provides an easy-to-use & scalable interface to run Graph Machine Learning on ArangoDB data. Since all the orchestration and Machine Learning logic is diff --git a/site/content/gen-ai/graphml/quickstart.md b/site/content/gen-ai/graphml/quickstart.md index 4473aafe0f..32df857ecf 100644 --- a/site/content/gen-ai/graphml/quickstart.md +++ b/site/content/gen-ai/graphml/quickstart.md @@ -8,7 +8,7 @@ description: >- aliases: - ../arangographml/deploy --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} ## Web interface versus Jupyter Notebooks diff --git a/site/content/gen-ai/graphml/ui.md b/site/content/gen-ai/graphml/ui.md index 83e736120c..7712acf7e7 100644 --- a/site/content/gen-ai/graphml/ui.md +++ b/site/content/gen-ai/graphml/ui.md @@ -6,7 +6,7 @@ description: >- Learn how to create, configure, and run a full machine learning workflow for GraphML in four steps using the features in the ArangoDB web interface --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} ## The GraphML workflow in the web interface diff --git a/site/content/gen-ai/graphrag/_index.md b/site/content/gen-ai/graphrag/_index.md index 9bde91a90d..f41f853153 100644 --- a/site/content/gen-ai/graphrag/_index.md +++ b/site/content/gen-ai/graphrag/_index.md @@ -8,7 +8,7 @@ description: >- aliases: llm-knowledge-graphs --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/graphrag/tutorial-notebook.md b/site/content/gen-ai/graphrag/tutorial-notebook.md index 45a743d761..b8c8e5fbcb 100644 --- a/site/content/gen-ai/graphrag/tutorial-notebook.md +++ b/site/content/gen-ai/graphrag/tutorial-notebook.md @@ -5,7 +5,7 @@ description: >- Building a GraphRAG pipeline using ArangoDB's integrated notebook servers weight: 10 --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/graphrag/web-interface.md b/site/content/gen-ai/graphrag/web-interface.md index b7559e0149..9a19485f1d 100644 --- a/site/content/gen-ai/graphrag/web-interface.md +++ b/site/content/gen-ai/graphrag/web-interface.md @@ -6,7 +6,7 @@ description: >- Learn how to create, configure, and run a full GraphRAG workflow in four steps using the Platform web interface --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/notebook-servers.md b/site/content/gen-ai/notebook-servers.md index bddbee6cb7..1efb5543e5 100644 --- a/site/content/gen-ai/notebook-servers.md +++ b/site/content/gen-ai/notebook-servers.md @@ -7,7 +7,7 @@ description: >- aliases: - arangograph-notebooks --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/services/gen-ai.md b/site/content/gen-ai/services/gen-ai.md index 03504ec499..85892df2a4 100644 --- a/site/content/gen-ai/services/gen-ai.md +++ b/site/content/gen-ai/services/gen-ai.md @@ -6,7 +6,7 @@ description: >- for GraphRAG in your Kubernetes cluster weight: 5 --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/services/importer.md b/site/content/gen-ai/services/importer.md index afb60fe036..8e7130d1c7 100644 --- a/site/content/gen-ai/services/importer.md +++ b/site/content/gen-ai/services/importer.md @@ -6,7 +6,7 @@ description: >- making it easier to analyze and understand complex information weight: 10 --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/services/mlflow.md b/site/content/gen-ai/services/mlflow.md index e3efccc32a..a675358d5e 100644 --- a/site/content/gen-ai/services/mlflow.md +++ b/site/content/gen-ai/services/mlflow.md @@ -6,7 +6,7 @@ description: >- full machine learning lifecycle into the ArangoDB Platform weight: 25 --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/services/retriever.md b/site/content/gen-ai/services/retriever.md index 447def28df..319ff792bb 100644 --- a/site/content/gen-ai/services/retriever.md +++ b/site/content/gen-ai/services/retriever.md @@ -7,7 +7,7 @@ description: >- weight: 15 --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get diff --git a/site/content/gen-ai/services/triton-inference-server.md b/site/content/gen-ai/services/triton-inference-server.md index 23f1c2894c..53947edd68 100644 --- a/site/content/gen-ai/services/triton-inference-server.md +++ b/site/content/gen-ai/services/triton-inference-server.md @@ -5,7 +5,7 @@ description: >- Enable your GraphRAG pipeline to use private LLMs via Triton Inference Server weight: 30 --- -{{< tag "ArangoDB Platform" >}} +{{< tag "GenAI Data Platform" >}} {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get From f43d57354817ee5c0052b91d8ff3f0cf5353a9b8 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 13:52:16 +0200 Subject: [PATCH 22/44] Add EE tag tooltip for legacy content --- site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html | 1 + 1 file changed, 1 insertion(+) diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html index 9aa55544af..9244cbf9dc 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html @@ -3,6 +3,7 @@ "Data Platform" "This feature is available in the Arango Data Platform and GenAI Data Platform" "GenAI Data Platform" "This feature is available in the Arango GenAI Data Platform but not the Data Platform" "arangosh" "This feature is available in the ArangoDB Shell" + "ArangoDB Enterprise Edition" "This feature is available in the Enterprise Edition but not the Community Edition of ArangoDB" -}} <p class="labels"> {{ range $.Params }} From 8c1ed3429e5dbb75c2307aab933e401df2991d43 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 14:05:24 +0200 Subject: [PATCH 23/44] Remove unnecessary tags --- README.md | 14 ++++++-------- site/content/data-platform/graph-visualizer.md | 2 -- site/content/gen-ai/graph-analytics.md | 2 -- site/content/gen-ai/graph-to-ai.md | 2 -- site/content/gen-ai/graphml/_index.md | 2 -- site/content/gen-ai/graphml/notebooks-api.md | 3 --- site/content/gen-ai/graphml/quickstart.md | 2 -- site/content/gen-ai/graphml/ui.md | 2 -- site/content/gen-ai/graphrag/_index.md | 2 -- site/content/gen-ai/graphrag/tutorial-notebook.md | 2 -- site/content/gen-ai/graphrag/web-interface.md | 2 -- site/content/gen-ai/notebook-servers.md | 2 -- site/content/gen-ai/services/gen-ai.md | 2 -- site/content/gen-ai/services/importer.md | 2 -- site/content/gen-ai/services/mlflow.md | 2 -- site/content/gen-ai/services/retriever.md | 3 --- .../gen-ai/services/triton-inference-server.md | 2 -- 17 files changed, 6 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index e1e35f9adf..530c4c1c7e 100644 --- a/README.md +++ b/README.md @@ -674,15 +674,13 @@ deprecated features in the same manner with `Deprecated in: ...`. ### Environment remarks Pages and sections about features that are only available in certain environments -such as the GenAI Suite, the Data Platform, the Arango Managed Platform (AMP), or the -ArangoDB Shell should indicate where they are available using the `tag` shortcode. +such as in ArangoDB Shell should indicate where they are available using the +`tag` shortcode. -In the Data Platform (and therefore also in the GenAI Data Suite) and -Arango Managed Platform but not in ArangoDB: - -```markdown -{{< tag "Data Platform" "AMP" >}} -``` +Features exclusive to the Data Platform, GenAI Data Platform, +Arango Managed Platform (AMP), and ArangoDB generally don't need to be tagged +because they are in dedicated parts of the documentation. However, if there are +subsections with different procedures, each can be tagged accordingly. In the GenAI Data Platform only: diff --git a/site/content/data-platform/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md index c20aad4fa6..e429e687fc 100644 --- a/site/content/data-platform/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -5,8 +5,6 @@ weight: 10 description: >- Visually explore and interact with your ArangoDB graphs through an intuitive interface --- -{{< tag "Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/graph-analytics.md b/site/content/gen-ai/graph-analytics.md index 6692559834..3108fb1fbc 100644 --- a/site/content/gen-ai/graph-analytics.md +++ b/site/content/gen-ai/graph-analytics.md @@ -8,8 +8,6 @@ description: | aliases: - ../data-science/graph-analytics --- -{{< tag "GenAI Data Platform" "AMP" >}} - Graph analytics is a branch of data science that deals with analyzing information networks known as graphs, and extracting information from the data relationships. It ranges from basic measures that characterize graphs, over PageRank, to complex diff --git a/site/content/gen-ai/graph-to-ai.md b/site/content/gen-ai/graph-to-ai.md index 70ada16d46..b8bee3415d 100644 --- a/site/content/gen-ai/graph-to-ai.md +++ b/site/content/gen-ai/graph-to-ai.md @@ -10,8 +10,6 @@ aliases: --- - [Link to 3.12](../arangodb/3.12/aql/_index.md) -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/graphml/_index.md b/site/content/gen-ai/graphml/_index.md index 4182ba71ba..c1262bbdcc 100644 --- a/site/content/gen-ai/graphml/_index.md +++ b/site/content/gen-ai/graphml/_index.md @@ -7,8 +7,6 @@ description: >- aliases: - arangographml --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/graphml/notebooks-api.md b/site/content/gen-ai/graphml/notebooks-api.md index ad0f9ad2ea..f34d9121b6 100644 --- a/site/content/gen-ai/graphml/notebooks-api.md +++ b/site/content/gen-ai/graphml/notebooks-api.md @@ -9,9 +9,6 @@ aliases: - ../arangographml/getting-started - ../arangographml-getting-started-with-arangographml --- - -{{< tag "GenAI Data Platform" >}} - The ArangoDB Platform provides an easy-to-use & scalable interface to run Graph Machine Learning on ArangoDB data. Since all the orchestration and Machine Learning logic is managed by ArangoDB, all that is typically required are JSON specifications outlining diff --git a/site/content/gen-ai/graphml/quickstart.md b/site/content/gen-ai/graphml/quickstart.md index 32df857ecf..db81915e98 100644 --- a/site/content/gen-ai/graphml/quickstart.md +++ b/site/content/gen-ai/graphml/quickstart.md @@ -8,8 +8,6 @@ description: >- aliases: - ../arangographml/deploy --- -{{< tag "GenAI Data Platform" >}} - ## Web interface versus Jupyter Notebooks The ArangoDB Platform provides enterprise-ready Graph Machine Learning in two options, diff --git a/site/content/gen-ai/graphml/ui.md b/site/content/gen-ai/graphml/ui.md index 7712acf7e7..8c4e43024e 100644 --- a/site/content/gen-ai/graphml/ui.md +++ b/site/content/gen-ai/graphml/ui.md @@ -6,8 +6,6 @@ description: >- Learn how to create, configure, and run a full machine learning workflow for GraphML in four steps using the features in the ArangoDB web interface --- -{{< tag "GenAI Data Platform" >}} - ## The GraphML workflow in the web interface The entire process is organized into sequential steps within a **Project**, diff --git a/site/content/gen-ai/graphrag/_index.md b/site/content/gen-ai/graphrag/_index.md index f41f853153..8588300420 100644 --- a/site/content/gen-ai/graphrag/_index.md +++ b/site/content/gen-ai/graphrag/_index.md @@ -8,8 +8,6 @@ description: >- aliases: llm-knowledge-graphs --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/graphrag/tutorial-notebook.md b/site/content/gen-ai/graphrag/tutorial-notebook.md index b8c8e5fbcb..1bbcfebf8d 100644 --- a/site/content/gen-ai/graphrag/tutorial-notebook.md +++ b/site/content/gen-ai/graphrag/tutorial-notebook.md @@ -5,8 +5,6 @@ description: >- Building a GraphRAG pipeline using ArangoDB's integrated notebook servers weight: 10 --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/graphrag/web-interface.md b/site/content/gen-ai/graphrag/web-interface.md index 9a19485f1d..47e76c67b4 100644 --- a/site/content/gen-ai/graphrag/web-interface.md +++ b/site/content/gen-ai/graphrag/web-interface.md @@ -6,8 +6,6 @@ description: >- Learn how to create, configure, and run a full GraphRAG workflow in four steps using the Platform web interface --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/notebook-servers.md b/site/content/gen-ai/notebook-servers.md index 1efb5543e5..27a7896fba 100644 --- a/site/content/gen-ai/notebook-servers.md +++ b/site/content/gen-ai/notebook-servers.md @@ -7,8 +7,6 @@ description: >- aliases: - arangograph-notebooks --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/services/gen-ai.md b/site/content/gen-ai/services/gen-ai.md index 85892df2a4..e6bd266480 100644 --- a/site/content/gen-ai/services/gen-ai.md +++ b/site/content/gen-ai/services/gen-ai.md @@ -6,8 +6,6 @@ description: >- for GraphRAG in your Kubernetes cluster weight: 5 --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/services/importer.md b/site/content/gen-ai/services/importer.md index 8e7130d1c7..955f1a68d2 100644 --- a/site/content/gen-ai/services/importer.md +++ b/site/content/gen-ai/services/importer.md @@ -6,8 +6,6 @@ description: >- making it easier to analyze and understand complex information weight: 10 --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/services/mlflow.md b/site/content/gen-ai/services/mlflow.md index a675358d5e..84d43a6e70 100644 --- a/site/content/gen-ai/services/mlflow.md +++ b/site/content/gen-ai/services/mlflow.md @@ -6,8 +6,6 @@ description: >- full machine learning lifecycle into the ArangoDB Platform weight: 25 --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/services/retriever.md b/site/content/gen-ai/services/retriever.md index 319ff792bb..9c1f03c0cd 100644 --- a/site/content/gen-ai/services/retriever.md +++ b/site/content/gen-ai/services/retriever.md @@ -6,9 +6,6 @@ description: >- retrieval from knowledge graphs created by the Importer service weight: 15 --- - -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with diff --git a/site/content/gen-ai/services/triton-inference-server.md b/site/content/gen-ai/services/triton-inference-server.md index 53947edd68..e1a7ca4112 100644 --- a/site/content/gen-ai/services/triton-inference-server.md +++ b/site/content/gen-ai/services/triton-inference-server.md @@ -5,8 +5,6 @@ description: >- Enable your GraphRAG pipeline to use private LLMs via Triton Inference Server weight: 30 --- -{{< tag "GenAI Data Platform" >}} - {{< tip >}} The ArangoDB Platform & GenAI Suite is available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with From 24b8aa76abb6614a3e90fa811009e904f0bceaee Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 16:05:43 +0200 Subject: [PATCH 24/44] Move About ArangoDB out of versioned folder to ArangoDB top-level and move Features and Use cases under it --- site/content/arangodb/3.10/_index.md | 2 +- site/content/arangodb/3.11/_index.md | 2 +- site/content/arangodb/3.12/_index.md | 2 +- site/content/arangodb/3.12/about/_index.md | 70 ------ .../3.12/{about => }/features/_index.md | 18 +- .../features/highlights-by-version.md | 234 +++++++++--------- .../3.12/{about => }/features/list.md | 156 ++++++------ .../administration/license-management.md | 2 +- .../community-to-enterprise-upgrade.md | 2 +- .../arangodb/3.12/{about => }/use-cases.md | 28 +-- site/content/arangodb/3.13/_index.md | 2 +- site/content/arangodb/3.13/about/_index.md | 70 ------ .../3.13/{about => }/features/_index.md | 18 +- .../features/highlights-by-version.md | 234 +++++++++--------- .../3.13/{about => }/features/list.md | 156 ++++++------ .../administration/license-management.md | 2 +- .../arangodb/3.13/{about => }/use-cases.md | 28 +-- site/content/arangodb/_index.md | 73 +++++- 18 files changed, 510 insertions(+), 589 deletions(-) delete mode 100644 site/content/arangodb/3.12/about/_index.md rename site/content/arangodb/3.12/{about => }/features/_index.md (89%) rename site/content/arangodb/{3.13/about => 3.12}/features/highlights-by-version.md (55%) rename site/content/arangodb/3.12/{about => }/features/list.md (65%) rename site/content/arangodb/3.12/{about => }/use-cases.md (76%) delete mode 100644 site/content/arangodb/3.13/about/_index.md rename site/content/arangodb/3.13/{about => }/features/_index.md (89%) rename site/content/arangodb/{3.12/about => 3.13}/features/highlights-by-version.md (55%) rename site/content/arangodb/3.13/{about => }/features/list.md (65%) rename site/content/arangodb/3.13/{about => }/use-cases.md (76%) diff --git a/site/content/arangodb/3.10/_index.md b/site/content/arangodb/3.10/_index.md index 5322d252a7..0f0adc5234 100644 --- a/site/content/arangodb/3.10/_index.md +++ b/site/content/arangodb/3.10/_index.md @@ -1,7 +1,7 @@ --- title: Recommended Resources menuTitle: '3.10' -weight: 1 +weight: 99 layout: default --- {{< cloudbanner >}} diff --git a/site/content/arangodb/3.11/_index.md b/site/content/arangodb/3.11/_index.md index 26db7a1f0d..aacc1445b3 100644 --- a/site/content/arangodb/3.11/_index.md +++ b/site/content/arangodb/3.11/_index.md @@ -1,7 +1,7 @@ --- title: Recommended Resources menuTitle: '3.11' -weight: 1 +weight: 98 layout: default --- {{< cloudbanner >}} diff --git a/site/content/arangodb/3.12/_index.md b/site/content/arangodb/3.12/_index.md index 9fe6125694..2eab52e422 100644 --- a/site/content/arangodb/3.12/_index.md +++ b/site/content/arangodb/3.12/_index.md @@ -1,7 +1,7 @@ --- title: Recommended Resources menuTitle: '3.12' -weight: 1 +weight: 97 layout: default --- {{< cloudbanner >}} diff --git a/site/content/arangodb/3.12/about/_index.md b/site/content/arangodb/3.12/about/_index.md deleted file mode 100644 index b998bac24e..0000000000 --- a/site/content/arangodb/3.12/about/_index.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: What is ArangoDB? -menuTitle: About ArangoDB -weight: 5 -description: >- - ArangoDB is a scalable graph database system to drive value from connected - data, faster -aliases: - - introduction - - introduction/about-arangodb ---- -![ArangoDB Overview Diagram](../../../images/arangodb-overview-diagram.png) - -ArangoDB combines the analytical power of native graphs with an integrated -search engine, JSON support, and a variety of data access patterns via a single, -composable query language. - -ArangoDB is available in a community and a commercial [edition](features/_index.md). -You can use it for on-premises deployments, as well as a fully managed -cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). - -## What are Graphs? - -Graphs are information networks composed of nodes and edges. - -![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../../images/data-model-graph-relation-abstract-edge.png) - -A social network is a common example of a graph. People are represented by nodes -and their friendships by relations. - -![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../../images/data-model-graph-relation-concrete.png) - -Nodes are also called vertices (singular: vertex), and edges are relations that -connect nodes. -A node typically represents a specific entity (a person, a book, a sensor -reading, etc.) and an edge defines how one entity relates to another. - -![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../../images/data-model-graph-relations.png) - -This paradigm of storing data feels natural because it closely matches the -cognitive model of humans. It is an expressive data model that allows you to -represent many problem domains and solve them with semantic queries and graph -analytics. - -## Beyond Graphs - -Not everything is a graph use case. ArangoDB lets you equally work with -structured, semi-structured, and unstructured data in the form of schema-free -JSON objects, without having to connect these objects to form a graph. - -![Person Mary, Book ArangoDB](../../../images/data-model-document.png) - -Depending on your needs, you may mix graphs and unconnected data. -ArangoDB is designed from the ground up to support multiple data models with a -single, composable query language. - -```aql -FOR book IN Books - FILTER book.title == "Arango" - FOR person IN 2..2 INBOUND book transferred, OUTBOUND knows - RETURN person.name -``` - -ArangoDB also comes with an integrated search engine for information retrieval, -such as full-text search with relevance ranking. - -ArangoDB is written in C++ for high performance and built to work at scale, in -the cloud or on-premises. - -<!-- deployment options, move from features page, on-prem vs cloud? --> diff --git a/site/content/arangodb/3.12/about/features/_index.md b/site/content/arangodb/3.12/features/_index.md similarity index 89% rename from site/content/arangodb/3.12/about/features/_index.md rename to site/content/arangodb/3.12/features/_index.md index 674e603252..85b1f4bdde 100644 --- a/site/content/arangodb/3.12/about/features/_index.md +++ b/site/content/arangodb/3.12/features/_index.md @@ -1,7 +1,7 @@ --- title: Features and Capabilities menuTitle: Features -weight: 20 +weight: 10 description: >- ArangoDB is a graph database with a powerful set of features for data management and analytics, supported by a rich ecosystem of integrations and drivers @@ -23,7 +23,7 @@ See the full [Feature list of the ArangoDB database system](list.md). For a scalable architecture based on Kubernetes that supports the full offering of ArangoDB including graph-powered machine learning and GenAI features, see -the [Feature list of the ArangoDB Platform](../../../../data-platform/about/features.md). +the [Feature list of the ArangoDB Platform](../../../data-platform/about/features.md). ## On-premises versus Cloud @@ -43,7 +43,7 @@ variety of support plans to meet your needs. - Highly secure with encryption at transit and at rest - Includes elastic scalability for all deployment models (OneShard and Sharded clusters) -To learn more, go to the [ArangoGraph documentation](../../../../amp/_index.md). +To learn more, go to the [ArangoGraph documentation](../../../amp/_index.md). ### Self-managed in the cloud @@ -51,10 +51,10 @@ ArangoDB can be self-deployed on AWS or other cloud platforms, too. However, whe using a self-managed deployment, you take full control of managing the resources needed to run it in the cloud. This involves tasks such as configuring, provisioning, and monitoring the system. For more details, see -[self-deploying ArangoDB in the cloud](../../deploy/in-the-cloud.md). +[self-deploying ArangoDB in the cloud](../deploy/in-the-cloud.md). ArangoDB supports Kubernetes through its official -[Kubernetes Operator](../../deploy/kubernetes.md) that allows you to easily +[Kubernetes Operator](../deploy/kubernetes.md) that allows you to easily deploy and manage clusters within a Kubernetes environment. ### On-premises @@ -66,16 +66,16 @@ services. You can install ArangoDB locally by downloading and running the [official packages](https://arangodb.com/download/) or run it using -[Docker images](../../operations/installation/docker.md). +[Docker images](../operations/installation/docker.md). You can deploy it on-premises as a -[single server](../../deploy/single-instance/_index.md) -or as a [cluster](../../deploy/cluster/_index.md) +[single server](../deploy/single-instance/_index.md) +or as a [cluster](../deploy/cluster/_index.md) comprised of multiple nodes with synchronous replication and automatic failover for high availability and resilience. ArangoDB also integrates with Kubernetes, offering a -[Kubernetes Operator](../../deploy/kubernetes.md) that lets you deploy in your +[Kubernetes Operator](../deploy/kubernetes.md) that lets you deploy in your Kubernetes cluster. ## ArangoDB Editions diff --git a/site/content/arangodb/3.13/about/features/highlights-by-version.md b/site/content/arangodb/3.12/features/highlights-by-version.md similarity index 55% rename from site/content/arangodb/3.13/about/features/highlights-by-version.md rename to site/content/arangodb/3.12/features/highlights-by-version.md index c69f40df1e..bb3db66447 100644 --- a/site/content/arangodb/3.13/about/features/highlights-by-version.md +++ b/site/content/arangodb/3.12/features/highlights-by-version.md @@ -5,14 +5,8 @@ weight: 15 description: >- The most notable features of the ArangoDB core database system, grouped by version aliases: - - ../../introduction/features/highlights-by-version + - ../introduction/features/highlights-by-version --- -## Version 3.13 - -- - -Also see [What's New in 3.13](../../release-notes/version-3.13/whats-new-in-3-13.md). - ## Version 3.12 {{< info >}} @@ -23,240 +17,240 @@ See [ArangoDB Editions](_index.md#arangodb-editions) for details. **All Editions** -- [**Improved memory accounting**](../../release-notes/version-3.12/whats-new-in-3-12.md#improved-memory-accounting-and-usage): +- [**Improved memory accounting**](../release-notes/version-3.12/whats-new-in-3-12.md#improved-memory-accounting-and-usage): Better tracking and observability of memory consumption for ArangoDB deployments and reduced memory usage. -- [**`wildcard` Analyzer**](../../index-and-search/analyzers.md#wildcard): +- [**`wildcard` Analyzer**](../index-and-search/analyzers.md#wildcard): Accelerate `LIKE` searches with `_` and `%` wildcards against Views and inverted indexes with _n_-grams to quickly find candidate matches. -- [**Multi-dimensional indexes**](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): +- [**Multi-dimensional indexes**](../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): An index type to efficiently intersect multiple range queries, like finding all appointments that intersect a time range. Optionally with prefix fields, with support for using it as vertex-centric index in graph traversals. -- [**External versioning**](../../release-notes/version-3.12/whats-new-in-3-12.md#external-versioning-support): +- [**External versioning**](../release-notes/version-3.12/whats-new-in-3-12.md#external-versioning-support): Specify any top-level attribute to compare whether the version number is higher than the currently stored one when updating or replacing documents. -- [**Improved dump performance**](../../release-notes/version-3.12/whats-new-in-3-12.md#improved-dump-performance-and-size) +- [**Improved dump performance**](../release-notes/version-3.12/whats-new-in-3-12.md#improved-dump-performance-and-size) Create logical backups faster with arangodump thanks to parallel dumping at the shard level, as well as transfer compression and file splitting. -- [**Request and response compression**](../../release-notes/version-3.12/whats-new-in-3-12.md#transparent-compression-of-requests-and-responses-between-arangodb-servers-and-client-tools) +- [**Request and response compression**](../release-notes/version-3.12/whats-new-in-3-12.md#transparent-compression-of-requests-and-responses-between-arangodb-servers-and-client-tools) Speed up data transfers and reduce traffic with transparent compression of requests and responses between ArangoDB servers and client tools. {{% comment %}} Experimental feature in v3.12.4 -- [**Query plan caching**](../../aql/execution-and-performance/caching-query-plans.md) +- [**Query plan caching**](../aql/execution-and-performance/caching-query-plans.md) Reduce the total time for processing queries by avoiding to parse, plan, and optimize the same queries over and over again with an AQL execution plan cache. {{% /comment %}} **Enterprise Edition** -- [**ArangoSearch WAND optimization**](../../index-and-search/arangosearch/performance.md#wand-optimization): +- [**ArangoSearch WAND optimization**](../index-and-search/arangosearch/performance.md#wand-optimization): Retrieve search results for the highest-ranking matches from Views faster by defining a list of sort expressions to optimize. -Also see [What's New in 3.12](../../release-notes/version-3.12/whats-new-in-3-12.md). +Also see [What's New in 3.12](../release-notes/version-3.12/whats-new-in-3-12.md). ## Version 3.11 **All Editions** -- [**Parallel gather**](../../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): +- [**Parallel gather**](../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): Faster, more memory-efficient processing of cluster queries by combining results on Coordinators in parallel. -- [**Index cache refilling**](../../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): +- [**Index cache refilling**](../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): Automatically repopulate in-memory index caches after writes that affect an edge index or cache-enabled persistent indexes to maximize cache hits and thus query performance. **Enterprise Edition** -- [**ArangoSearch column cache**](../../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): +- [**ArangoSearch column cache**](../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): Always cache field normalization values, Geo Analyzer auxiliary data, stored values, primary sort columns, and primary key columns in memory to improve the performance of Views and inverted indexes. -- [**`geo_s2` Analyzer**](../../index-and-search/analyzers.md#geo_s2): +- [**`geo_s2` Analyzer**](../index-and-search/analyzers.md#geo_s2): Efficiently index geo-spatial data using different binary formats, tuning the size on disk, the precision, and query performance. -Also see [What's New in 3.11](../../release-notes/version-3.11/whats-new-in-3-11.md). +Also see [What's New in 3.11](../release-notes/version-3.11/whats-new-in-3-11.md). ## Version 3.10 **All Editions** -- [**Native ARM Support**](../../release-notes/version-3.10/whats-new-in-3-10.md#native-arm-support): +- [**Native ARM Support**](../release-notes/version-3.10/whats-new-in-3-10.md#native-arm-support): Packages for the ARM architecture are now available, including native support for Apple silicon. -- [**Computed Values**](../../concepts/data-structure/documents/computed-values.md): +- [**Computed Values**](../concepts/data-structure/documents/computed-values.md): Persistent document attributes that are generated when documents are created or modified, using an AQL expression. -- [**Inverted indexes**](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md): +- [**Inverted indexes**](../index-and-search/indexing/working-with-indexes/inverted-indexes.md): A new, eventually consistent index type that can accelerate a broad range of queries, providing similar search capabilities as `arangosearch` Views, but defined per collection and simpler to use. -- [**`search-alias` Views**](../../release-notes/version-3.10/whats-new-in-3-10.md#search-alias-views): +- [**`search-alias` Views**](../release-notes/version-3.10/whats-new-in-3-10.md#search-alias-views): Add inverted indexes to `search-alias` Views for searching multiple collections at once, with ranking and search highlighting capabilities, as a lightweight alternative to `arangosearch` Views. - **Persistent indexes**: - An optional [**In-memory Cache**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values) - for faster lookups and [**Stored Values**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#storing-additional-values-in-indexes) + An optional [**In-memory Cache**](../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values) + for faster lookups and [**Stored Values**](../index-and-search/indexing/working-with-indexes/persistent-indexes.md#storing-additional-values-in-indexes) to let persistent indexes cover additional attributes of projections. - **AQL Graph Traversals**: - [All Shortest Paths](../../aql/graphs/all-shortest-paths.md) allows you to query + [All Shortest Paths](../aql/graphs/all-shortest-paths.md) allows you to query for all paths of shortest length between two documents. **Enterprise Edition** -- [**EnterpriseGraphs**](../../graphs/enterprisegraphs/_index.md): A new specialized version of +- [**EnterpriseGraphs**](../graphs/enterprisegraphs/_index.md): A new specialized version of SmartGraphs, with an automatic sharding key selection. -- [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): +- [**Search highlighting**](../index-and-search/arangosearch/search-highlighting.md): Get the substring positions of matched terms, phrases, or _n_-grams. -- [**Nested search**](../../index-and-search/arangosearch/nested-search.md): +- [**Nested search**](../index-and-search/arangosearch/nested-search.md): Match arrays of objects with all the conditions met by a single sub-object, and define for how many of the elements this must be true. - **ArangoSearch**: - New [`minhash` Analyzer](../../index-and-search/analyzers.md#minhash) for locality-sensitive hashing + New [`minhash` Analyzer](../index-and-search/analyzers.md#minhash) for locality-sensitive hashing to approximate the Jaccard similarity, with inverted index and `arangosearch` View support that allows you to implement entity resolution. -- [**Parallelism for sharded graphs**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): +- [**Parallelism for sharded graphs**](../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): Parallel execution of AQL traversal queries with many start nodes for all types of sharded graphs, leading to faster results. -- [**Traversal Projections**](../../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): +- [**Traversal Projections**](../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): Optimized data loading for AQL traversal queries if only a few document attributes are accessed. -- [**Read from followers in clusters**](../../develop/http-api/documents.md#read-from-followers): +- [**Read from followers in clusters**](../develop/http-api/documents.md#read-from-followers): Allow dirty reads so that Coordinators can read from any shard replica and not only from the leader, for scaling reads. -Also see [What's New in 3.10](../../release-notes/version-3.10/whats-new-in-3-10.md). +Also see [What's New in 3.10](../release-notes/version-3.10/whats-new-in-3-10.md). ## Version 3.9 **All Editions** - **ArangoSearch**: - New [**Segmentation Analyzer**](../../index-and-search/analyzers.md#segmentation) + New [**Segmentation Analyzer**](../index-and-search/analyzers.md#segmentation) for language-agnostic tokenization of text. - A [**Collation Analyzer**](../../index-and-search/analyzers.md#collation) + A [**Collation Analyzer**](../index-and-search/analyzers.md#collation) to honor the alphabetical order of the specified language in range queries. **Enterprise Edition** -- [**(Disjoint) SmartGraphs using SatelliteCollections**](../../graphs/smartgraphs/_index.md): +- [**(Disjoint) SmartGraphs using SatelliteCollections**](../graphs/smartgraphs/_index.md): SatelliteCollections can be used in (Disjoint) SmartGraphs to enable more local execution of graph queries. -Also see [What's New in 3.9](../../release-notes/version-3.9/whats-new-in-3-9.md). +Also see [What's New in 3.9](../release-notes/version-3.9/whats-new-in-3-9.md). ## Version 3.8 **All Editions** -- [**Weighted traversals**](../../release-notes/version-3.8/whats-new-in-3-8.md#weighted-traversals) - and [**k Paths**](../../release-notes/version-3.8/whats-new-in-3-8.md#k-paths): +- [**Weighted traversals**](../release-notes/version-3.8/whats-new-in-3-8.md#weighted-traversals) + and [**k Paths**](../release-notes/version-3.8/whats-new-in-3-8.md#k-paths): Two new AQL graph traversal methods to emit paths in order of increasing weights and to enumerate all paths between a start and a end node that match a given length. - **ArangoSearch**: - New [**Pipeline Analyzer**](../../index-and-search/analyzers.md#pipeline) + New [**Pipeline Analyzer**](../index-and-search/analyzers.md#pipeline) that allows you to combine multiple Analyzers, enabling case-insensitive _n_-gram-based fuzzy search and more. New - [**AQL Analyzer**](../../index-and-search/analyzers.md#aql) + [**AQL Analyzer**](../index-and-search/analyzers.md#aql) so that you can use an AQL query to pre-process and filter your data for indexing. Support for **geo-spatial queries** through new - [Geo](../../index-and-search/analyzers.md#geojson) - [Analyzers](../../index-and-search/analyzers.md#geopoint) and - [ArangoSearch Geo functions](../../aql/functions/arangosearch.md#geo-functions). - A new [**Stop words Analyzer**](../../index-and-search/analyzers.md#stopwords) that + [Geo](../index-and-search/analyzers.md#geojson) + [Analyzers](../index-and-search/analyzers.md#geopoint) and + [ArangoSearch Geo functions](../aql/functions/arangosearch.md#geo-functions). + A new [**Stop words Analyzer**](../index-and-search/analyzers.md#stopwords) that can be used standalone or in an Analyzer pipeline. -- A [**`WINDOW` operation**](../../aql/high-level-operations/window.md) for aggregations over +- A [**`WINDOW` operation**](../aql/high-level-operations/window.md) for aggregations over adjacent rows, value ranges or time windows. **Enterprise Edition** - **Encryption at Rest** utilizes - [hardware acceleration](../../release-notes/version-3.8/whats-new-in-3-8.md#encryption-at-rest) + [hardware acceleration](../release-notes/version-3.8/whats-new-in-3-8.md#encryption-at-rest) capabilities of modern CPUs. -Also see [What's New in 3.8](../../release-notes/version-3.8/whats-new-in-3-8.md). +Also see [What's New in 3.8](../release-notes/version-3.8/whats-new-in-3-8.md). ## Version 3.7 **All Editions** - **ArangoSearch**: - [Wildcard](../../aql/functions/arangosearch.md#like) and fuzzy search - ([Levenshtein distance](../../aql/functions/arangosearch.md#levenshtein_match) and - [_n_-gram based](../../aql/functions/arangosearch.md#ngram_match)), - enhanced [phrase and proximity search](../../aql/functions/arangosearch.md#phrase), + [Wildcard](../aql/functions/arangosearch.md#like) and fuzzy search + ([Levenshtein distance](../aql/functions/arangosearch.md#levenshtein_match) and + [_n_-gram based](../aql/functions/arangosearch.md#ngram_match)), + enhanced [phrase and proximity search](../aql/functions/arangosearch.md#phrase), improved late document materialization and - [Views covering queries](../../release-notes/version-3.7/whats-new-in-3-7.md#covering-indexes) + [Views covering queries](../release-notes/version-3.7/whats-new-in-3-7.md#covering-indexes) using their indexes without touching the storage engine, as well as a new SIMD-based index format for faster processing and - [stemming support](../../release-notes/version-3.7/whats-new-in-3-7.md#stemming-support-for-more-languages) + [stemming support](../release-notes/version-3.7/whats-new-in-3-7.md#stemming-support-for-more-languages) for 15 additional languages. -- [**Schema Validation**](../../concepts/data-structure/documents/schema-validation.md): +- [**Schema Validation**](../concepts/data-structure/documents/schema-validation.md): Enforce a JSON Schema for documents on collection level. Invalid documents can be rejected automatically by the database system, making it easy to maintain data quality. -- [**Insert-Update** and **Insert-Ignore**](../../release-notes/version-3.7/whats-new-in-3-7.md#insert-update-and-insert-ignore): +- [**Insert-Update** and **Insert-Ignore**](../release-notes/version-3.7/whats-new-in-3-7.md#insert-update-and-insert-ignore): New document API operations to upsert documents and to efficiently insert documents while skipping the creation if the document exists already. - **AQL**: - Improved [subquery](../../release-notes/version-3.7/whats-new-in-3-7.md#subquery-optimizations) and - [graph traversal performance](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-optimizations), + Improved [subquery](../release-notes/version-3.7/whats-new-in-3-7.md#subquery-optimizations) and + [graph traversal performance](../release-notes/version-3.7/whats-new-in-3-7.md#traversal-optimizations), among many optimizations and enhancements. -- [**HTTP/2 support**](../../release-notes/version-3.7/whats-new-in-3-7.md#http2-support): +- [**HTTP/2 support**](../release-notes/version-3.7/whats-new-in-3-7.md#http2-support): Better load-balancer and Kubernetes compatibility, improved request throughput. **Enterprise Edition** -- [**SatelliteGraphs**](../../release-notes/version-3.7/whats-new-in-3-7.md#satellitegraphs): +- [**SatelliteGraphs**](../release-notes/version-3.7/whats-new-in-3-7.md#satellitegraphs): Synchronously replicated graphs with local traversal execution. -- [**Disjoint SmartGraphs**](../../release-notes/version-3.7/whats-new-in-3-7.md#disjoint-smartgraphs): +- [**Disjoint SmartGraphs**](../release-notes/version-3.7/whats-new-in-3-7.md#disjoint-smartgraphs): Improve traversal execution times for SmartGraphs without edges between nodes with different SmartGraph attribute values. -- [**Traversal parallelization**](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition): +- [**Traversal parallelization**](../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition): Optional parallel execution of nested traversals for single servers and OneShard clusters. - **Security**: Added support for multiple - [JWT Secrets](../../release-notes/version-3.7/whats-new-in-3-7.md#jwt-secret-rotation-enterprise-edition) + [JWT Secrets](../release-notes/version-3.7/whats-new-in-3-7.md#jwt-secret-rotation-enterprise-edition) and the ability to hot-reload them from disk, - [TLS key and certificate rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation), - [Encryption at rest key rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#encryption-at-rest-key-rotation-enterprise-edition) - and [Server Name Indication (SNI)](../../release-notes/version-3.7/whats-new-in-3-7.md#server-name-indication-enterprise-edition). + [TLS key and certificate rotation](../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation), + [Encryption at rest key rotation](../release-notes/version-3.7/whats-new-in-3-7.md#encryption-at-rest-key-rotation-enterprise-edition) + and [Server Name Indication (SNI)](../release-notes/version-3.7/whats-new-in-3-7.md#server-name-indication-enterprise-edition). -Also see [What's New in 3.7](../../release-notes/version-3.7/whats-new-in-3-7.md). +Also see [What's New in 3.7](../release-notes/version-3.7/whats-new-in-3-7.md). ## Version 3.6 @@ -264,32 +258,32 @@ Also see [What's New in 3.7](../../release-notes/version-3.7/whats-new-in-3-7.md - **AQL**: Improved query performance thanks to - [early pruning](../../release-notes/version-3.6/whats-new-in-3-6.md#early-pruning-of-non-matching-documents), - [subquery splicing](../../release-notes/version-3.6/whats-new-in-3-6.md#subquery-splicing-optimization), - [late document materialization](../../release-notes/version-3.6/whats-new-in-3-6.md#late-document-materialization-rocksdb), - [parallelization](../../release-notes/version-3.6/whats-new-in-3-6.md#parallelization-of-cluster-aql-queries) for certain cluster queries - and more. New server-side [`maxRuntime`](../../aql/how-to-invoke-aql/with-arangosh.md#maxruntime) + [early pruning](../release-notes/version-3.6/whats-new-in-3-6.md#early-pruning-of-non-matching-documents), + [subquery splicing](../release-notes/version-3.6/whats-new-in-3-6.md#subquery-splicing-optimization), + [late document materialization](../release-notes/version-3.6/whats-new-in-3-6.md#late-document-materialization-rocksdb), + [parallelization](../release-notes/version-3.6/whats-new-in-3-6.md#parallelization-of-cluster-aql-queries) for certain cluster queries + and more. New server-side [`maxRuntime`](../aql/how-to-invoke-aql/with-arangosh.md#maxruntime) option for queries. - **ArangoSearch**: - New [Analyzer options](../../release-notes/version-3.6/whats-new-in-3-6.md#analyzers) for + New [Analyzer options](../release-notes/version-3.6/whats-new-in-3-6.md#analyzers) for edge _n_-grams (`text` Analyzer), UTF-8 encoded _n_-gram input and optional start/end markers (`ngram` Analyzer). Support for - [dynamic expressions](../../release-notes/version-3.6/whats-new-in-3-6.md#dynamic-search-expressions-with-arrays) + [dynamic expressions](../release-notes/version-3.6/whats-new-in-3-6.md#dynamic-search-expressions-with-arrays) using arrays (array comparison operators in `SEARCH` queries and the `TOKENS()` / `PHRASE()` functions accept arrays). Views can benefit from the SmartJoins optimization. **Enterprise Edition** -- [**OneShard**](../../deploy/oneshard.md) +- [**OneShard**](../deploy/oneshard.md) deployments offer a practicable solution that enables significant performance improvements by massively reducing cluster-internal communication. A database created with OneShard enabled is limited to a single DB-Server node but still replicated synchronously to ensure resilience. This configuration allows running transactions with ACID guarantees on shard leaders. -Also see [What's New in 3.6](../../release-notes/version-3.6/whats-new-in-3-6.md). +Also see [What's New in 3.6](../release-notes/version-3.6/whats-new-in-3-6.md). ## Version 3.5 @@ -297,62 +291,62 @@ Also see [What's New in 3.6](../../release-notes/version-3.6/whats-new-in-3-6.md - **ArangoSearch**: The search and ranking engine received an upgrade and now features - [Configurable Analyzers](../../index-and-search/analyzers.md), - [Sorted Views](../../index-and-search/arangosearch/performance.md#primary-sort-order) + [Configurable Analyzers](../index-and-search/analyzers.md), + [Sorted Views](../index-and-search/arangosearch/performance.md#primary-sort-order) and several improvements to the - [AQL integration](../../release-notes/version-3.5/whats-new-in-3-5.md#arangosearch). + [AQL integration](../release-notes/version-3.5/whats-new-in-3-5.md#arangosearch). - **AQL Graph Traversals**: - [k Shortest Paths](../../aql/graphs/k-shortest-paths.md) allows you to query not + [k Shortest Paths](../aql/graphs/k-shortest-paths.md) allows you to query not just for one shortest path between two documents but multiple, sorted by - length or weight. With [PRUNE](../../aql/graphs/traversals.md#pruning) you can + length or weight. With [PRUNE](../aql/graphs/traversals.md#pruning) you can stop walking down certain paths early in a graph traversal to improve its efficiency. -- [**Stream Transaction API**](../../develop/http-api/transactions/stream-transactions.md): +- [**Stream Transaction API**](../develop/http-api/transactions/stream-transactions.md): Perform multi-document transactions with individual begin and commit / abort commands using the new HTTP endpoints or via a supported driver. -- [**Time-to-Live**](../../index-and-search/indexing/basics.md#ttl-time-to-live-index) - [**Indexes**](../../index-and-search/indexing/working-with-indexes/ttl-indexes.md): +- [**Time-to-Live**](../index-and-search/indexing/basics.md#ttl-time-to-live-index) + [**Indexes**](../index-and-search/indexing/working-with-indexes/ttl-indexes.md): TTL indexes can be used to automatically remove documents in collections for use cases like expiring sessions or automatic purging of statistics or logs. -- [**Index Hints**](../../aql/high-level-operations/for.md#indexhint) & +- [**Index Hints**](../aql/high-level-operations/for.md#indexhint) & [**Named Indexes**](https://www.arangodb.com/learn/development/index-hints-named-indices/): Indexes can be given names and an optional AQL inline query option `indexHint` was added to override the internal optimizer decision on which index to utilize. -- [**Data Masking**](../../components/tools/arangodump/maskings.md): +- [**Data Masking**](../components/tools/arangodump/maskings.md): arangodump provides a convenient way to extract production data but mask critical information that should not be visible. **Enterprise Edition** -- [**Hot Backups**](../../operations/backup-and-restore.md#hot-backups): +- [**Hot Backups**](../operations/backup-and-restore.md#hot-backups): Create automatic, consistent backups of your cluster without noticeable impact on your production systems. In contrast to _arangodump_, hot backups are taken on the level of the underlying storage engine and hence both backup and restore are considerably faster. -- [**SmartJoins**](../../develop/smartjoins.md): +- [**SmartJoins**](../develop/smartjoins.md): Run joins between identically sharded collections with performance close to that of a local join operation. - **Advanced Data Masking**: There are additional - [data masking functions](../../components/tools/arangodump/maskings.md#masking-functions) + [data masking functions](../components/tools/arangodump/maskings.md#masking-functions) available in the Enterprise Edition, such as for substituting email addresses and phone numbers with similar looking pseudo-data. -Also see [What's New in 3.5](../../release-notes/version-3.5/whats-new-in-3-5.md). +Also see [What's New in 3.5](../release-notes/version-3.5/whats-new-in-3-5.md). ## Version 3.4 **All Editions** -- [**ArangoSearch**](../../index-and-search/arangosearch/_index.md): +- [**ArangoSearch**](../index-and-search/arangosearch/_index.md): Search and similarity ranking engine integrated natively into ArangoDB and AQL. ArangoSearch combines Boolean retrieval capabilities with generalized ranking algorithms (BM25, TFDIF). Support of e.g. relevance-based searching, @@ -361,32 +355,32 @@ Also see [What's New in 3.5](../../release-notes/version-3.5/whats-new-in-3-5.md query. Many specialized language Analyzers are already included for e.g. English, German, French, Chinese, Spanish and many other language. -- [**GeoJSON Support**](../../aql/functions/geo.md) and - [**S2 Geo Index**](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): ArangoDB now supports all geo primitives. +- [**GeoJSON Support**](../aql/functions/geo.md) and + [**S2 Geo Index**](../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): ArangoDB now supports all geo primitives. (Multi-)Point, (Multi-)LineStrings, (Multi-)Polygons or intersections can be defined and queried for. The Google S2 geo index is optimized for RocksDB and enables efficient querying. Geo query results are automatically visualized with an OpenStreetMap integration within the Query Editor of the web interface. -- [**Query Profiler**](../../aql/execution-and-performance/query-profiling.md): +- [**Query Profiler**](../aql/execution-and-performance/query-profiling.md): Enables the analysis of queries and adds additional information for the user to identify optimization potentials more easily. The profiler can be accessed via _arangosh_ with `db._profileQuery(...)` or via the *Profile* button in the Query Editor of the web interface. -- [**Streaming Cursors**](../../aql/how-to-invoke-aql/with-arangosh.md#stream): +- [**Streaming Cursors**](../aql/how-to-invoke-aql/with-arangosh.md#stream): Cursors requested with the stream option on make queries calculate results on the fly and make them available for the client in a streaming fashion, as soon as possible. - **RocksDB as Default Storage Engine**: With ArangoDB 3.4 the default - [storage engine](../../components/arangodb-server/storage-engine.md) for fresh installations will + [storage engine](../components/arangodb-server/storage-engine.md) for fresh installations will switch from MMFiles to RocksDB. Many optimizations have been made to RocksDB since the first release in 3.2. For 3.4 we optimized the binary storage format for improved insertion, implemented "optional caching", reduced the replication catch-up time and much more. -Also see [What's New in 3.4](../../release-notes/version-3.4/whats-new-in-3-4.md). +Also see [What's New in 3.4](../release-notes/version-3.4/whats-new-in-3-4.md). ## Version 3.3 @@ -398,30 +392,30 @@ Also see [What's New in 3.4](../../release-notes/version-3.4/whats-new-in-3-4.md Multi-datacenter support means you can fallback to a replica of your cluster in case of a disaster in one datacenter. -- [**Encrypted Backups**](../../components/tools/arangodump/examples.md#encryption): +- [**Encrypted Backups**](../components/tools/arangodump/examples.md#encryption): _arangodump_ can create backups encrypted with a secret key using AES256 block cipher. **All Editions** -- [**Server-level Replication**](../../release-notes/version-3.3/whats-new-in-3-3.md#server-level-replication): +- [**Server-level Replication**](../release-notes/version-3.3/whats-new-in-3-3.md#server-level-replication): In addition to per-database replication, there is now an additional `globalApplier`. Start the global replication on the Follower once and all current and future databases will be replicated from the Leader to the Follower automatically. -- [**Asynchronous Failover**](../../release-notes/version-3.3/whats-new-in-3-3.md#asynchronous-failover): +- [**Asynchronous Failover**](../release-notes/version-3.3/whats-new-in-3-3.md#asynchronous-failover): Make a single server instance resilient with a second server instance, one as Leader and the other as asynchronously replicating Follower, with automatic failover to the Follower if the Leader goes down. -Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md). +Also see [What's New in 3.3](../release-notes/version-3.3/whats-new-in-3-3.md). ## Version 3.2 **All Editions** -- [**RocksDB Storage Engine**](../../components/arangodb-server/storage-engine.md): You can now use +- [**RocksDB Storage Engine**](../components/arangodb-server/storage-engine.md): You can now use as much data in ArangoDB as you can fit on your disk. Plus, you can enjoy performance boosts on writes by having only document-level locks. @@ -430,7 +424,7 @@ Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md patterns, identify communities and perform in-depth analytics of large graph data sets. -- [**Fault-Tolerant Foxx**](../../develop/http-api/foxx.md): The Foxx management +- [**Fault-Tolerant Foxx**](../develop/http-api/foxx.md): The Foxx management internals have been rewritten from the ground up to make sure multi-coordinator cluster setups always keep their services in sync and new Coordinators are fully initialized even when all existing Coordinators @@ -442,22 +436,22 @@ Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md can be managed from outside ArangoDB with an LDAP server in different authentication configurations. -- [**Encryption at Rest**](../../operations/security/encryption-at-rest.md): Let the server +- [**Encryption at Rest**](../operations/security/encryption-at-rest.md): Let the server persist your sensitive data strongly encrypted to protect it even if the physical storage medium gets stolen. -- [**SatelliteCollections**](../../develop/satellitecollections.md): Faster join operations when +- [**SatelliteCollections**](../develop/satellitecollections.md): Faster join operations when working with sharded datasets by synchronously replicating selected collections to all DB-Servers in a cluster, so that joins can be executed locally. -Also see [What's New in 3.2](../../release-notes/version-3.2/whats-new-in-3-2.md). +Also see [What's New in 3.2](../release-notes/version-3.2/whats-new-in-3-2.md). ## Version 3.1 **All Editions** -- [**Vertex-centric indexes**](../../index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md): +- [**Vertex-centric indexes**](../index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md): AQL traversal queries can utilize secondary edge collection indexes for better performance against graphs with supernodes. @@ -467,35 +461,35 @@ Also see [What's New in 3.2](../../release-notes/version-3.2/whats-new-in-3-2.md **Enterprise Edition** -- [**SmartGraphs**](../../graphs/smartgraphs/_index.md): Scale with graphs to a +- [**SmartGraphs**](../graphs/smartgraphs/_index.md): Scale with graphs to a cluster and stay performant. With SmartGraphs you can use the "smartness" of your application layer to shard your graph efficiently to your machines and let traversals run locally. -- **Encryption Control**: Choose your level of [SSL encryption](../../components/arangodb-server/options.md#ssl) +- **Encryption Control**: Choose your level of [SSL encryption](../components/arangodb-server/options.md#ssl) -- [**Auditing**](../../operations/security/audit-logging.md): Keep a detailed log +- [**Auditing**](../operations/security/audit-logging.md): Keep a detailed log of all the important things that happened in ArangoDB. -Also see [What's New in 3.1](../../release-notes/version-3.1/whats-new-in-3-1.md). +Also see [What's New in 3.1](../release-notes/version-3.1/whats-new-in-3-1.md). ## Version 3.0 -- [**self-organizing cluster**](../../deploy/cluster/_index.md) with +- [**self-organizing cluster**](../deploy/cluster/_index.md) with synchronous replication, master/master setup, shared nothing architecture, cluster management Agency. -- Deeply integrated, native [**AQL graph traversal**](../../aql/graphs/_index.md) +- Deeply integrated, native [**AQL graph traversal**](../aql/graphs/_index.md) - [**VelocyPack**](https://github.com/arangodb/velocypack) as new internal binary storage format as well as for intermediate AQL values. -- [**Persistent indexes**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md) via RocksDB suitable +- [**Persistent indexes**](../index-and-search/indexing/working-with-indexes/persistent-indexes.md) via RocksDB suitable for sorting and range queries. -- [**Foxx 3.0**](../../develop/foxx-microservices/_index.md): overhauled JS framework for data-centric +- [**Foxx 3.0**](../develop/foxx-microservices/_index.md): overhauled JS framework for data-centric microservices -- Significantly improved [**Web Interface**](../../components/web-interface/_index.md) +- Significantly improved [**Web Interface**](../components/web-interface/_index.md) -Also see [What's New in 3.0](../../release-notes/version-3.0/whats-new-in-3-0.md). +Also see [What's New in 3.0](../release-notes/version-3.0/whats-new-in-3-0.md). diff --git a/site/content/arangodb/3.12/about/features/list.md b/site/content/arangodb/3.12/features/list.md similarity index 65% rename from site/content/arangodb/3.12/about/features/list.md rename to site/content/arangodb/3.12/features/list.md index f40468f1cc..3641e428b8 100644 --- a/site/content/arangodb/3.12/about/features/list.md +++ b/site/content/arangodb/3.12/features/list.md @@ -6,8 +6,8 @@ description: >- All features of the ArangoDB database system, available in both the Community Edition and Enterprise Edition aliases: - - ../../introduction/features/community-edition - - ../../introduction/features/enterprise-edition + - ../introduction/features/community-edition + - ../introduction/features/enterprise-edition - community-edition - enterprise-edition --- @@ -18,13 +18,13 @@ available from v3.12.5 onward. ## General -- [**Graph Database**](../../concepts/data-models.md#graph-model): +- [**Graph Database**](../concepts/data-models.md#graph-model): Native support for storing and querying graphs comprised of nodes and edges. You can model complex domains because both nodes and edges are fully-fledged documents, without restrictions in complexity. Edges can connect node documents to express m:n relations with any depth. -- [**Document Database**](../../concepts/data-models.md#document-model): +- [**Document Database**](../concepts/data-models.md#document-model): A modern document database system that allows you to model data intuitively and evolve the data model easily. Documents can be organized in collections, and collections in databases for multi-tenancy. @@ -37,7 +37,7 @@ available from v3.12.5 onward. top and mix it with graph traversals, geo queries, aggregations, or any other supported access pattern. -- [**Data Format**](../../concepts/data-structure/_index.md#documents): +- [**Data Format**](../concepts/data-structure/_index.md#documents): JSON, internally stored in a binary format invented by ArangoDB called VelocyPack. @@ -47,12 +47,12 @@ available from v3.12.5 onward. documents, or graphs - perfect for social relations. Optional document validation using JSON Schema (draft-4, without remote schema support). -- [**Data Storage**](../../components/arangodb-server/storage-engine.md): +- [**Data Storage**](../components/arangodb-server/storage-engine.md): RocksDB storage engine to persist data and indexes on disk, with a hot set in memory. It uses journaling (write-ahead logging) and can take advantage of modern storage hardware, like SSDs and large caches. -- [**Computed Values**](../../concepts/data-structure/documents/computed-values.md): +- [**Computed Values**](../concepts/data-structure/documents/computed-values.md): Persistent document attributes that are generated when documents are created or modified, using an AQL expression. @@ -60,7 +60,7 @@ available from v3.12.5 onward. Use ArangoDB as a [fully managed service](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), self-managed in the cloud, or on-premises. -- [**Multiple Environments**](../../operations/installation/_index.md#supported-platforms-and-architectures): +- [**Multiple Environments**](../operations/installation/_index.md#supported-platforms-and-architectures): Run ArangoDB on Linux using the production-ready packages for the x86-64 architecture, on bare metal or in containers. Develop and test with ArangoDB on Windows, macOS, and Linux using the official @@ -68,17 +68,17 @@ available from v3.12.5 onward. ## Scalability & High Availability -- [**Hash-based sharding**](../../deploy/architecture/data-sharding.md): +- [**Hash-based sharding**](../deploy/architecture/data-sharding.md): Spread bigger datasets across multiple servers using consistent hashing on the default or custom shard keys. -- [**Synchronous Replication**](../../deploy/cluster/_index.md#synchronous-replication): +- [**Synchronous Replication**](../deploy/cluster/_index.md#synchronous-replication): Data changes are propagated to other cluster nodes immediately as part of an operation, and are only considered successful when the configured number of writes is reached. Synchronous replication works on a per-shard basis. For each collection, you can configure how many copies of each shard are kept in the cluster. -- [**Automatic Failover Cluster**](../../deploy/cluster/_index.md#automatic-failover): +- [**Automatic Failover Cluster**](../deploy/cluster/_index.md#automatic-failover): If a cluster node goes down, another node takes over to avoid downtime. - **Load-Balancer Support**: @@ -89,7 +89,7 @@ available from v3.12.5 onward. ## Querying -- [**Declarative Query Language for All Data Models**](../../aql/_index.md): +- [**Declarative Query Language for All Data Models**](../aql/_index.md): Powerful query language (AQL) to retrieve and modify data. Graph traversals, full-text searches, geo-spatial queries, and aggregations can be composed in a single query. @@ -97,40 +97,40 @@ available from v3.12.5 onward. ranges and time intervals. Cluster-distributed aggregation queries. -- [**Query Optimizer**](../../aql/execution-and-performance/query-optimization.md): +- [**Query Optimizer**](../aql/execution-and-performance/query-optimization.md): Cost-based query optimizer that takes index selectivity estimates into account. <!-- TODO: Explain, batching?, lazy evaluation (stream)? --> -- [**Query Profiling**](../../aql/execution-and-performance/query-profiling.md): +- [**Query Profiling**](../aql/execution-and-performance/query-profiling.md): Show detailed runtime information for AQL queries. -- [**Query Logging**](../../aql/execution-and-performance/query-logging.md): +- [**Query Logging**](../aql/execution-and-performance/query-logging.md): Store query metadata and analyze it directly in the database system to debug issues and understand usage patterns. -- [**Upsert Operations**](../../aql/examples-and-query-patterns/upsert-repsert-guide.md): +- [**Upsert Operations**](../aql/examples-and-query-patterns/upsert-repsert-guide.md): Support for insert-or-update (upsert), insert-or-replace (repsert), and insert-or-ignore requests, that result in one or the other operation depending on whether the target document exists already. -- [**Relational Joins**](../../aql/examples-and-query-patterns/joins.md): +- [**Relational Joins**](../aql/examples-and-query-patterns/joins.md): Joins similar to those in relational database systems can be leveraged to match up documents from different collections, allowing normalized data models. - **Advanced Path-Finding with Multiple Algorithms**: - Graphs can be [traversed](../../aql/graphs/traversals-explained.md) with AQL + Graphs can be [traversed](../aql/graphs/traversals-explained.md) with AQL in outbound, inbound, or both directions to retrieve direct and indirect neighbor nodes using a fixed or variable depth. - The [traversal order](../../aql/graphs/traversals.md) can be + The [traversal order](../aql/graphs/traversals.md) can be depth-first, breadth-first, or in order of increasing edge weights ("Weighted Traversals"). Stop conditions for pruning paths are supported. - Traversal algorithms to get a [shortest path](../../aql/graphs/shortest-path.md), - [all shortest paths](../../aql/graphs/all-shortest-paths.md), paths in order of - increasing length ("[k Shortest Paths](../../aql/graphs/k-shortest-paths.md)"), + Traversal algorithms to get a [shortest path](../aql/graphs/shortest-path.md), + [all shortest paths](../aql/graphs/all-shortest-paths.md), paths in order of + increasing length ("[k Shortest Paths](../aql/graphs/k-shortest-paths.md)"), and to enumerate all paths between two nodes - ("[k Paths](../../aql/graphs/k-paths.md)") are available, too. + ("[k Paths](../aql/graphs/k-paths.md)") are available, too. -- [**ArangoSearch for Text Search and Ranking**](../../index-and-search/arangosearch/_index.md): +- [**ArangoSearch for Text Search and Ranking**](../index-and-search/arangosearch/_index.md): A built-in search engine for full-text, complex data structures, and more. Exact value matching, range queries, prefix matching, case-insensitive and accent-insensitive search. Token, phrase, wildcard, and fuzzy search support @@ -139,51 +139,51 @@ available from v3.12.5 onward. Flexible data field pre-processing with custom queries and the ability to chain built-in and custom Analyzers. Language-agnostic tokenization of text. -- [**GeoJSON Support**](../../aql/functions/geo.md#geojson): +- [**GeoJSON Support**](../aql/functions/geo.md#geojson): Geographic data encoded in the popular GeoJSON format can be stored and used for geo-spatial queries. {{% comment %}} Experimental feature -- [**Query result spillover**](../../aql/how-to-invoke-aql/with-arangosh.md#spilloverthresholdmemoryusage): +- [**Query result spillover**](../aql/how-to-invoke-aql/with-arangosh.md#spilloverthresholdmemoryusage): AQL queries can store intermediate and final results temporarily on disk (also known as external result sets) to decrease memory usage when a specified threshold is reached. {{% /comment %}} {{% comment %}} Experimental feature -- [**Vector search**](../../index-and-search/indexing/working-with-indexes/vector-indexes.md): +- [**Vector search**](../index-and-search/indexing/working-with-indexes/vector-indexes.md): Find items with similar properties by comparing vector embeddings generated by machine learning models. {{% /comment %}} -- [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): +- [**Search highlighting**](../index-and-search/arangosearch/search-highlighting.md): Get the substring positions of matched terms, phrases, or _n_-grams. -- [**Nested search**](../../index-and-search/arangosearch/nested-search.md): +- [**Nested search**](../index-and-search/arangosearch/nested-search.md): Match arrays of objects with all the conditions met by a single sub-object, and define for how many of the elements this must be true. {{% comment %}} Experimental feature -- **[`classification`](../../index-and-search/analyzers.md#classification) and [`nearest_neighbors` Analyzers](../../index-and-search/analyzers.md#nearest_neighbors)**: +- **[`classification`](../index-and-search/analyzers.md#classification) and [`nearest_neighbors` Analyzers](../index-and-search/analyzers.md#nearest_neighbors)**: Classification of text tokens and finding similar tokens using supervised fastText word embedding models. {{% /comment %}} -- [**Skip inaccessible collections**](../../aql/how-to-invoke-aql/with-arangosh.md#skipinaccessiblecollections): +- [**Skip inaccessible collections**](../aql/how-to-invoke-aql/with-arangosh.md#skipinaccessiblecollections): Let AQL queries like graph traversals pretend that collections are empty if the user has no access to them instead of failing the query. ## Transactions -- [**AQL Queries**](../../aql/data-queries.md#transactional-execution): +- [**AQL Queries**](../aql/data-queries.md#transactional-execution): AQL queries are executed transactionally (with exceptions), either committing or rolling back data modifications automatically. -- [**Stream Transactions**](../../develop/http-api/transactions/stream-transactions.md): +- [**Stream Transactions**](../develop/http-api/transactions/stream-transactions.md): Transactions with individual begin and commit / abort commands that can span multiple AQL queries and API calls of supported APIs. -- [**JavaScript Transactions**](../../develop/http-api/transactions/javascript-transactions.md): +- [**JavaScript Transactions**](../develop/http-api/transactions/javascript-transactions.md): Single-request transactions written in JavaScript that leverage ArangoDB's JavaScript API. @@ -205,148 +205,148 @@ available from v3.12.5 onward. ## Performance -- [**SmartGraphs**](../../graphs/smartgraphs/_index.md): +- [**SmartGraphs**](../graphs/smartgraphs/_index.md): Value-based sharding of large graph datasets for better data locality when traversing graphs. -- [**EnterpriseGraphs**](../../graphs/enterprisegraphs/_index.md): +- [**EnterpriseGraphs**](../graphs/enterprisegraphs/_index.md): A specialized version of SmartGraphs, with an automatic sharding key selection. -- [**SmartGraphs using SatelliteCollections**](../../graphs/smartgraphs/_index.md): +- [**SmartGraphs using SatelliteCollections**](../graphs/smartgraphs/_index.md): Collections replicated on all cluster nodes can be combined with graphs sharded by document attributes to enable more local execution of graph queries. -- [**SatelliteGraphs**](../../graphs/satellitegraphs/_index.md): +- [**SatelliteGraphs**](../graphs/satellitegraphs/_index.md): Graphs replicated on all cluster nodes to execute graph traversals locally. -- [**SatelliteCollections**](../../develop/satellitecollections.md): +- [**SatelliteCollections**](../develop/satellitecollections.md): Collections replicated on all cluster nodes to execute joins with sharded data locally. -- [**SmartJoins**](../../develop/smartjoins.md): +- [**SmartJoins**](../develop/smartjoins.md): Co-located joins in a cluster using identically sharded collections. -- [**OneShard**](../../deploy/oneshard.md): +- [**OneShard**](../deploy/oneshard.md): Option to store all collections of a database on a single cluster node, to combine the performance of a single server and ACID semantics with a fault-tolerant cluster setup. -- [**Traversal**](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition) - [**Parallelization**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): +- [**Traversal**](../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition) + [**Parallelization**](../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): Parallel execution of traversal queries with many start nodes, leading to faster results. -- [**Traversal Projections**](../../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): +- [**Traversal Projections**](../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): Optimized data loading for AQL traversal queries if only a few document attributes are accessed. -- [**Parallel index creation**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallel-index-creation-enterprise-edition): +- [**Parallel index creation**](../release-notes/version-3.10/whats-new-in-3-10.md#parallel-index-creation-enterprise-edition): Non-unique indexes can be created with multiple threads in parallel. -- [**`minhash` Analyzer**](../../index-and-search/analyzers.md#minhash): +- [**`minhash` Analyzer**](../index-and-search/analyzers.md#minhash): Jaccard similarity approximation for entity resolution, such as for finding duplicate records, based on how many elements they have in common -- [**`geo_s2` Analyzer**](../../index-and-search/analyzers.md#geo_s2): +- [**`geo_s2` Analyzer**](../index-and-search/analyzers.md#geo_s2): Efficiently index geo-spatial data using different binary formats, tuning the size on disk, the precision, and query performance. -- [**ArangoSearch column cache**](../../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): +- [**ArangoSearch column cache**](../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): Always cache field normalization values, Geo Analyzer auxiliary data, stored values, primary sort columns, and primary key columns in memory to improve the performance of Views and inverted indexes. -- [**ArangoSearch WAND optimization**](../../index-and-search/arangosearch/performance.md#wand-optimization): +- [**ArangoSearch WAND optimization**](../index-and-search/arangosearch/performance.md#wand-optimization): Retrieve search results for the highest-ranking matches from Views faster by defining a list of sort expressions to optimize. -- [**Read from followers in clusters**](../../develop/http-api/documents.md#read-from-followers): +- [**Read from followers in clusters**](../develop/http-api/documents.md#read-from-followers): Allow dirty reads so that Coordinators can read from any shard replica and not only from the leader, for scaling reads. -- [**Persistent Indexes**](../../index-and-search/indexing/basics.md#persistent-index): +- [**Persistent Indexes**](../index-and-search/indexing/basics.md#persistent-index): Indexes are stored on disk to enable fast server restarts. You can create secondary indexes over one or multiple fields, optionally with a uniqueness constraint. A "sparse" option to only index non-null values is also available. The elements of an array can be indexed individually. -- [**Inverted indexes**](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md): +- [**Inverted indexes**](../index-and-search/indexing/working-with-indexes/inverted-indexes.md): An eventually consistent index type that can accelerate a broad range of queries from simple to complex, including full-text search. -- [**Vertex-centric Indexes**](../../index-and-search/indexing/basics.md#vertex-centric-indexes): +- [**Vertex-centric Indexes**](../index-and-search/indexing/basics.md#vertex-centric-indexes): Secondary indexes for more efficient graph traversals with filter conditions. -- [**Time-to-Live (TTL) Indexes**](../../index-and-search/indexing/basics.md#ttl-time-to-live-index): +- [**Time-to-Live (TTL) Indexes**](../index-and-search/indexing/basics.md#ttl-time-to-live-index): Time-based removal of expired documents. -- [**Geo-spatial Indexes**](../../index-and-search/indexing/basics.md#geo-index): +- [**Geo-spatial Indexes**](../index-and-search/indexing/basics.md#geo-index): Accelerated geo-spatial queries for locations and GeoJSON objects, based on the S2 library. <!-- TODO: list supported queries? Centroid-limitations? --> Support for composable, distance-based geo-queries ("geo cursors"). -- [**Multi-dimensional indexes**](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): +- [**Multi-dimensional indexes**](../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): An index type to efficiently intersect multiple range queries, like finding all appointments that intersect a time range. -- [**Background Indexing**](../../index-and-search/indexing/basics.md#creating-indexes-in-background): +- [**Background Indexing**](../index-and-search/indexing/basics.md#creating-indexes-in-background): Indexes can be created in the background to not block queries in the meantime. -- [**Index cache refilling**](../../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): +- [**Index cache refilling**](../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): In-memory index caches are automatically repopulated after writes that affect an edge index or cache-enabled persistent indexes to maximize cache hits and thus query performance. -- [**Extensive Query Optimization**](../../aql/execution-and-performance/query-optimization.md): +- [**Extensive Query Optimization**](../aql/execution-and-performance/query-optimization.md): Late document materialization to only fetch the relevant documents from SORT/LIMIT queries. Early pruning of non-matching documents in full collection scans. Inlining of certain subqueries to improve execution time. <!-- TODO, move to Querying? --> {{% comment %}} Experimental feature in v3.12.4 -- [**Query plan caching**](../../aql/execution-and-performance/caching-query-plans.md) +- [**Query plan caching**](../aql/execution-and-performance/caching-query-plans.md) Reduce the total time for processing queries by avoiding to parse, plan, and optimize the same queries over and over again with an AQL execution plan cache. {{% /comment %}} -- [**Parallel gather**](../../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): +- [**Parallel gather**](../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): Fast, memory-efficient processing of cluster queries by combining results in parallel. ## Extensibility -- [**Microservice Support with ArangoDB Foxx**](../../develop/foxx-microservices/_index.md): +- [**Microservice Support with ArangoDB Foxx**](../develop/foxx-microservices/_index.md): Use ArangoDB as an application server and fuse your application and database together for maximal throughput. With fault-tolerant cluster support. -- [**Server-Side Functions**](../../aql/user-defined-functions.md): +- [**Server-Side Functions**](../aql/user-defined-functions.md): You can extend AQL with user-defined functions written in JavaScript. ## Security -- [**Auditing**](../../operations/security/audit-logging.md): +- [**Auditing**](../operations/security/audit-logging.md): Audit logs of all server interactions. -- [**Encryption at Rest**](../../operations/security/encryption-at-rest.md): +- [**Encryption at Rest**](../operations/security/encryption-at-rest.md): Hardware-accelerated on-disk encryption for your data. -- [**Encrypted Backups**](../../components/tools/arangodump/examples.md#encryption): +- [**Encrypted Backups**](../components/tools/arangodump/examples.md#encryption): Data dumps can be encrypted using a strong 256-bit AES block cipher. -- [**Hot Backups**](../../operations/backup-and-restore.md#hot-backups): +- [**Hot Backups**](../operations/backup-and-restore.md#hot-backups): Consistent, incremental data backups without downtime for single servers and clusters. -- [**Enhanced Data Masking**](../../components/tools/arangodump/maskings.md#masking-functions): +- [**Enhanced Data Masking**](../components/tools/arangodump/maskings.md#masking-functions): Extended data masking capabilities for attributes containing sensitive data / PII when creating backups. - **Advanced Encryption and Security Configuration**: - Key rotation for [JWT secrets](../../develop/http-api/authentication.md#hot-reload-jwt-secrets) - and [on-disk encryption](../../develop/http-api/security.md#encryption-at-rest), - as well as [Server Name Indication (SNI)](../../components/arangodb-server/options.md#--sslserver-name-indication). + Key rotation for [JWT secrets](../develop/http-api/authentication.md#hot-reload-jwt-secrets) + and [on-disk encryption](../develop/http-api/security.md#encryption-at-rest), + as well as [Server Name Indication (SNI)](../components/arangodb-server/options.md#--sslserver-name-indication). -- [**Authentication**](../../operations/administration/user-management/_index.md): +- [**Authentication**](../operations/administration/user-management/_index.md): Built-in user management with password- and token-based authentication. - **Role-based Access Control**: @@ -354,15 +354,15 @@ available from v3.12.5 onward. microservice framework users can achieve very high security standards fitting individual needs. -- [**TLS Encryption**](../../components/arangodb-server/options.md#ssl): +- [**TLS Encryption**](../components/arangodb-server/options.md#ssl): Internal and external communication over encrypted network connections with TLS (formerly SSL). - [TLS key and certificate rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation) + [TLS key and certificate rotation](../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation) is supported. ## Administration -- [**Web-based User Interface**](../../components/web-interface/_index.md): +- [**Web-based User Interface**](../components/web-interface/_index.md): Graphical UI for your browser to work with ArangoDB. It allows you to view, create, and modify databases, collections, documents, graphs, etc. You can also run, explain, and profile AQL queries. Includes a graph viewer @@ -372,16 +372,16 @@ available from v3.12.5 onward. View the status of your cluster and its individual nodes, and move and rebalance shards via the web interface. -- **[Backup](../../components/tools/arangodump/_index.md) and [Restore](../../components/tools/arangorestore/_index.md) Tools**: +- **[Backup](../components/tools/arangodump/_index.md) and [Restore](../components/tools/arangorestore/_index.md) Tools**: Multi-threaded dumping and restoring of collection settings and data in JSON format. Data masking capabilities for attributes containing sensitive data / PII when creating backups. -- **[Import](../../components/tools/arangoimport/_index.md) and [Export](../../components/tools/arangoexport/_index.md) Tools**: +- **[Import](../components/tools/arangoimport/_index.md) and [Export](../components/tools/arangoexport/_index.md) Tools**: CLI utilities to load and export data in multiple text-based formats. You can import from JSON, JSONL, CSV, and TSV files, and export to JSON, JSONL, CSV, TSV, XML, and XGMML files. -- [**Metrics**](../../develop/http-api/monitoring/metrics.md): +- [**Metrics**](../develop/http-api/monitoring/metrics.md): Monitor the healthiness and performance of ArangoDB servers using the metrics exported in the Prometheus format. diff --git a/site/content/arangodb/3.12/operations/administration/license-management.md b/site/content/arangodb/3.12/operations/administration/license-management.md index 30fc66adf2..72e42435a1 100644 --- a/site/content/arangodb/3.12/operations/administration/license-management.md +++ b/site/content/arangodb/3.12/operations/administration/license-management.md @@ -7,7 +7,7 @@ description: >- --- The Enterprise Edition of ArangoDB requires a license so that you can use ArangoDB for commercial purposes and have a dataset size over 100 GiB. See -[ArangoDB Editions](../../about/features/_index.md#arangodb-editions) +[ArangoDB Editions](../../features/_index.md#arangodb-editions) for details. How to set a license key and to retrieve information about the current license diff --git a/site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md b/site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md index bce4a011da..b02985e85f 100644 --- a/site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md +++ b/site/content/arangodb/3.12/operations/upgrading/community-to-enterprise-upgrade.md @@ -7,7 +7,7 @@ description: '' {{< info >}} From version 3.12.5 onward, the prepackaged binaries and official Docker images of the Community Edition include all features of the Enterprise Edition. -See [ArangoDB Editions](../../about/features/_index.md#arangodb-editions) +See [ArangoDB Editions](../../features/_index.md#arangodb-editions) for details. To upgrade a deployment created with v3.12.5 or later from the Community Edition diff --git a/site/content/arangodb/3.12/about/use-cases.md b/site/content/arangodb/3.12/use-cases.md similarity index 76% rename from site/content/arangodb/3.12/about/use-cases.md rename to site/content/arangodb/3.12/use-cases.md index 0128025595..4bc8b2517e 100644 --- a/site/content/arangodb/3.12/about/use-cases.md +++ b/site/content/arangodb/3.12/use-cases.md @@ -19,7 +19,7 @@ more. ### Fraud Detection -{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Uncover illegal activities by discovering difficult-to-detect patterns. ArangoDB lets you look beyond individual data points in disparate data sources, @@ -29,7 +29,7 @@ complex fraudulent behavior such as fraud rings. ### Recommendation Engine -{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Suggest products, services, and information to users based on data relationships. For example, you can use ArangoDB together with PyTorch Geometric to build a @@ -39,7 +39,7 @@ with a graph neural network (GNN). ### Network Management -{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Reduce downtime by connecting and visualizing network, infrastructure, and code. Network devices and how they interconnect can naturally be modeled as a graph. @@ -49,7 +49,7 @@ bandwidth into account when path-finding. ### Customer 360 -{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Gain a complete understanding of your customers by integrating multiple data sources and code. ArangoDB can act as the platform to merge and consolidate @@ -58,7 +58,7 @@ track data origins using graph features. ### Identity and Access Management -{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Increase security and compliance by managing data access based on role and position. You can map out an organization chart as a graph and use ArangoDB to @@ -68,7 +68,7 @@ inheritance. ### Supply Chain -{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Speed shipments by monitoring and optimizing the flow of goods through a supply chain. You can represent your inventory, supplier, and delivery @@ -84,7 +84,7 @@ and scalable data store. ### Content Management -{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Store information of any kind without upfront schema declaration. ArangoDB is schema-free, storing every data record as a self-contained document, allowing @@ -93,7 +93,7 @@ content management system on top of ArangoDB. ### E-Commerce Systems -{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB combines data modeling freedom with strong consistency and resilience features to power online shops and ordering systems. Handle product catalog data @@ -102,7 +102,7 @@ checkouts with the necessary transactional guarantees. ### Internet of Things -{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Collect sensor readings and other IoT data in ArangoDB for a single view of everything. Store all data points in the same system that also lets you run @@ -110,7 +110,7 @@ aggregation queries using sliding windows for efficient data analysis. ## ArangoDB as a Key-Value Database -{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Key-value stores are the simplest kind of database systems. Each record is stored as a block of data under a key that uniquely identifies the record. @@ -130,11 +130,11 @@ binary large objects (BLOBs) and works best with small to medium-sized JSON objects. For more information about how ArangoDB persists data, see -[Storage Engine](../components/arangodb-server/storage-engine.md). +[Storage Engine](components/arangodb-server/storage-engine.md). ## ArangoDB as a Search Engine -{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB has a natively integrated search engine for a broad range of information retrieval needs. It is powered by inverted indexes and can index @@ -148,7 +148,7 @@ It also features natural language processing (NLP) capabilities. and can classify or find similar terms using word embedding models. {{% /comment %}} -For more information about the search engine, see [ArangoSearch](../index-and-search/arangosearch/_index.md). +For more information about the search engine, see [ArangoSearch](index-and-search/arangosearch/_index.md). ## ArangoDB for Machine Learning @@ -161,4 +161,4 @@ ArangoDB integrates well into existing data infrastructures and provides connectors for popular machine learning frameworks and data processing ecosystems. -![Machine Learning Architecture of ArangoDB](../../../images/machine-learning-architecture.png) +![Machine Learning Architecture of ArangoDB](../../images/machine-learning-architecture.png) diff --git a/site/content/arangodb/3.13/_index.md b/site/content/arangodb/3.13/_index.md index 43a6197b31..327eb25661 100644 --- a/site/content/arangodb/3.13/_index.md +++ b/site/content/arangodb/3.13/_index.md @@ -1,7 +1,7 @@ --- title: Recommended Resources menuTitle: '3.13' -weight: 0 +weight: 96 layout: default --- {{< cloudbanner >}} diff --git a/site/content/arangodb/3.13/about/_index.md b/site/content/arangodb/3.13/about/_index.md deleted file mode 100644 index b47cbeb22f..0000000000 --- a/site/content/arangodb/3.13/about/_index.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: What is ArangoDB? -menuTitle: About ArangoDB -weight: 5 -description: >- - ArangoDB is a scalable graph database system to drive value from connected - data, faster -aliases: - - introduction - - introduction/about-arangodb ---- -![ArangoDB Overview Diagram](../../../../images/arangodb-overview-diagram.png) - -ArangoDB combines the analytical power of native graphs with an integrated -search engine, JSON support, and a variety of data access patterns via a single, -composable query language. - -ArangoDB is available in a community and a commercial [edition](features/_index.md). -You can use it for on-premises deployments, as well as a fully managed -cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). - -## What are Graphs? - -Graphs are information networks composed of nodes and edges. - -![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../../../../images/data-model-graph-relation-abstract-edge.png) - -A social network is a common example of a graph. People are represented by nodes -and their friendships by relations. - -![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../../../../images/data-model-graph-relation-concrete.png) - -Nodes are also called vertices (singular: vertex), and edges are relations that -connect nodes. -A node typically represents a specific entity (a person, a book, a sensor -reading, etc.) and an edge defines how one entity relates to another. - -![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../../../../images/data-model-graph-relations.png) - -This paradigm of storing data feels natural because it closely matches the -cognitive model of humans. It is an expressive data model that allows you to -represent many problem domains and solve them with semantic queries and graph -analytics. - -## Beyond Graphs - -Not everything is a graph use case. ArangoDB lets you equally work with -structured, semi-structured, and unstructured data in the form of schema-free -JSON objects, without having to connect these objects to form a graph. - -![Person Mary, Book ArangoDB](../../../../images/data-model-document.png) - -Depending on your needs, you may mix graphs and unconnected data. -ArangoDB is designed from the ground up to support multiple data models with a -single, composable query language. - -```aql -FOR book IN Books - FILTER book.title == "Arango" - FOR person IN 2..2 INBOUND book transferred, OUTBOUND knows - RETURN person.name -``` - -ArangoDB also comes with an integrated search engine for information retrieval, -such as full-text search with relevance ranking. - -ArangoDB is written in C++ for high performance and built to work at scale, in -the cloud or on-premises. - -<!-- deployment options, move from features page, on-prem vs cloud? --> diff --git a/site/content/arangodb/3.13/about/features/_index.md b/site/content/arangodb/3.13/features/_index.md similarity index 89% rename from site/content/arangodb/3.13/about/features/_index.md rename to site/content/arangodb/3.13/features/_index.md index 674e603252..85b1f4bdde 100644 --- a/site/content/arangodb/3.13/about/features/_index.md +++ b/site/content/arangodb/3.13/features/_index.md @@ -1,7 +1,7 @@ --- title: Features and Capabilities menuTitle: Features -weight: 20 +weight: 10 description: >- ArangoDB is a graph database with a powerful set of features for data management and analytics, supported by a rich ecosystem of integrations and drivers @@ -23,7 +23,7 @@ See the full [Feature list of the ArangoDB database system](list.md). For a scalable architecture based on Kubernetes that supports the full offering of ArangoDB including graph-powered machine learning and GenAI features, see -the [Feature list of the ArangoDB Platform](../../../../data-platform/about/features.md). +the [Feature list of the ArangoDB Platform](../../../data-platform/about/features.md). ## On-premises versus Cloud @@ -43,7 +43,7 @@ variety of support plans to meet your needs. - Highly secure with encryption at transit and at rest - Includes elastic scalability for all deployment models (OneShard and Sharded clusters) -To learn more, go to the [ArangoGraph documentation](../../../../amp/_index.md). +To learn more, go to the [ArangoGraph documentation](../../../amp/_index.md). ### Self-managed in the cloud @@ -51,10 +51,10 @@ ArangoDB can be self-deployed on AWS or other cloud platforms, too. However, whe using a self-managed deployment, you take full control of managing the resources needed to run it in the cloud. This involves tasks such as configuring, provisioning, and monitoring the system. For more details, see -[self-deploying ArangoDB in the cloud](../../deploy/in-the-cloud.md). +[self-deploying ArangoDB in the cloud](../deploy/in-the-cloud.md). ArangoDB supports Kubernetes through its official -[Kubernetes Operator](../../deploy/kubernetes.md) that allows you to easily +[Kubernetes Operator](../deploy/kubernetes.md) that allows you to easily deploy and manage clusters within a Kubernetes environment. ### On-premises @@ -66,16 +66,16 @@ services. You can install ArangoDB locally by downloading and running the [official packages](https://arangodb.com/download/) or run it using -[Docker images](../../operations/installation/docker.md). +[Docker images](../operations/installation/docker.md). You can deploy it on-premises as a -[single server](../../deploy/single-instance/_index.md) -or as a [cluster](../../deploy/cluster/_index.md) +[single server](../deploy/single-instance/_index.md) +or as a [cluster](../deploy/cluster/_index.md) comprised of multiple nodes with synchronous replication and automatic failover for high availability and resilience. ArangoDB also integrates with Kubernetes, offering a -[Kubernetes Operator](../../deploy/kubernetes.md) that lets you deploy in your +[Kubernetes Operator](../deploy/kubernetes.md) that lets you deploy in your Kubernetes cluster. ## ArangoDB Editions diff --git a/site/content/arangodb/3.12/about/features/highlights-by-version.md b/site/content/arangodb/3.13/features/highlights-by-version.md similarity index 55% rename from site/content/arangodb/3.12/about/features/highlights-by-version.md rename to site/content/arangodb/3.13/features/highlights-by-version.md index df9c03fbf8..d8c369f251 100644 --- a/site/content/arangodb/3.12/about/features/highlights-by-version.md +++ b/site/content/arangodb/3.13/features/highlights-by-version.md @@ -5,8 +5,14 @@ weight: 15 description: >- The most notable features of the ArangoDB core database system, grouped by version aliases: - - ../../introduction/features/highlights-by-version + - ../introduction/features/highlights-by-version --- +## Version 3.13 + +- + +Also see [What's New in 3.13](../release-notes/version-3.13/whats-new-in-3-13.md). + ## Version 3.12 {{< info >}} @@ -17,240 +23,240 @@ See [ArangoDB Editions](_index.md#arangodb-editions) for details. **All Editions** -- [**Improved memory accounting**](../../release-notes/version-3.12/whats-new-in-3-12.md#improved-memory-accounting-and-usage): +- [**Improved memory accounting**](../release-notes/version-3.12/whats-new-in-3-12.md#improved-memory-accounting-and-usage): Better tracking and observability of memory consumption for ArangoDB deployments and reduced memory usage. -- [**`wildcard` Analyzer**](../../index-and-search/analyzers.md#wildcard): +- [**`wildcard` Analyzer**](../index-and-search/analyzers.md#wildcard): Accelerate `LIKE` searches with `_` and `%` wildcards against Views and inverted indexes with _n_-grams to quickly find candidate matches. -- [**Multi-dimensional indexes**](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): +- [**Multi-dimensional indexes**](../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): An index type to efficiently intersect multiple range queries, like finding all appointments that intersect a time range. Optionally with prefix fields, with support for using it as vertex-centric index in graph traversals. -- [**External versioning**](../../release-notes/version-3.12/whats-new-in-3-12.md#external-versioning-support): +- [**External versioning**](../release-notes/version-3.12/whats-new-in-3-12.md#external-versioning-support): Specify any top-level attribute to compare whether the version number is higher than the currently stored one when updating or replacing documents. -- [**Improved dump performance**](../../release-notes/version-3.12/whats-new-in-3-12.md#improved-dump-performance-and-size) +- [**Improved dump performance**](../release-notes/version-3.12/whats-new-in-3-12.md#improved-dump-performance-and-size) Create logical backups faster with arangodump thanks to parallel dumping at the shard level, as well as transfer compression and file splitting. -- [**Request and response compression**](../../release-notes/version-3.12/whats-new-in-3-12.md#transparent-compression-of-requests-and-responses-between-arangodb-servers-and-client-tools) +- [**Request and response compression**](../release-notes/version-3.12/whats-new-in-3-12.md#transparent-compression-of-requests-and-responses-between-arangodb-servers-and-client-tools) Speed up data transfers and reduce traffic with transparent compression of requests and responses between ArangoDB servers and client tools. {{% comment %}} Experimental feature in v3.12.4 -- [**Query plan caching**](../../aql/execution-and-performance/caching-query-plans.md) +- [**Query plan caching**](../aql/execution-and-performance/caching-query-plans.md) Reduce the total time for processing queries by avoiding to parse, plan, and optimize the same queries over and over again with an AQL execution plan cache. {{% /comment %}} **Enterprise Edition** -- [**ArangoSearch WAND optimization**](../../index-and-search/arangosearch/performance.md#wand-optimization): +- [**ArangoSearch WAND optimization**](../index-and-search/arangosearch/performance.md#wand-optimization): Retrieve search results for the highest-ranking matches from Views faster by defining a list of sort expressions to optimize. -Also see [What's New in 3.12](../../release-notes/version-3.12/whats-new-in-3-12.md). +Also see [What's New in 3.12](../release-notes/version-3.12/whats-new-in-3-12.md). ## Version 3.11 **All Editions** -- [**Parallel gather**](../../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): +- [**Parallel gather**](../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): Faster, more memory-efficient processing of cluster queries by combining results on Coordinators in parallel. -- [**Index cache refilling**](../../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): +- [**Index cache refilling**](../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): Automatically repopulate in-memory index caches after writes that affect an edge index or cache-enabled persistent indexes to maximize cache hits and thus query performance. **Enterprise Edition** -- [**ArangoSearch column cache**](../../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): +- [**ArangoSearch column cache**](../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): Always cache field normalization values, Geo Analyzer auxiliary data, stored values, primary sort columns, and primary key columns in memory to improve the performance of Views and inverted indexes. -- [**`geo_s2` Analyzer**](../../index-and-search/analyzers.md#geo_s2): +- [**`geo_s2` Analyzer**](../index-and-search/analyzers.md#geo_s2): Efficiently index geo-spatial data using different binary formats, tuning the size on disk, the precision, and query performance. -Also see [What's New in 3.11](../../release-notes/version-3.11/whats-new-in-3-11.md). +Also see [What's New in 3.11](../release-notes/version-3.11/whats-new-in-3-11.md). ## Version 3.10 **All Editions** -- [**Native ARM Support**](../../release-notes/version-3.10/whats-new-in-3-10.md#native-arm-support): +- [**Native ARM Support**](../release-notes/version-3.10/whats-new-in-3-10.md#native-arm-support): Packages for the ARM architecture are now available, including native support for Apple silicon. -- [**Computed Values**](../../concepts/data-structure/documents/computed-values.md): +- [**Computed Values**](../concepts/data-structure/documents/computed-values.md): Persistent document attributes that are generated when documents are created or modified, using an AQL expression. -- [**Inverted indexes**](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md): +- [**Inverted indexes**](../index-and-search/indexing/working-with-indexes/inverted-indexes.md): A new, eventually consistent index type that can accelerate a broad range of queries, providing similar search capabilities as `arangosearch` Views, but defined per collection and simpler to use. -- [**`search-alias` Views**](../../release-notes/version-3.10/whats-new-in-3-10.md#search-alias-views): +- [**`search-alias` Views**](../release-notes/version-3.10/whats-new-in-3-10.md#search-alias-views): Add inverted indexes to `search-alias` Views for searching multiple collections at once, with ranking and search highlighting capabilities, as a lightweight alternative to `arangosearch` Views. - **Persistent indexes**: - An optional [**In-memory Cache**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values) - for faster lookups and [**Stored Values**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#storing-additional-values-in-indexes) + An optional [**In-memory Cache**](../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values) + for faster lookups and [**Stored Values**](../index-and-search/indexing/working-with-indexes/persistent-indexes.md#storing-additional-values-in-indexes) to let persistent indexes cover additional attributes of projections. - **AQL Graph Traversals**: - [All Shortest Paths](../../aql/graphs/all-shortest-paths.md) allows you to query + [All Shortest Paths](../aql/graphs/all-shortest-paths.md) allows you to query for all paths of shortest length between two documents. **Enterprise Edition** -- [**EnterpriseGraphs**](../../graphs/enterprisegraphs/_index.md): A new specialized version of +- [**EnterpriseGraphs**](../graphs/enterprisegraphs/_index.md): A new specialized version of SmartGraphs, with an automatic sharding key selection. -- [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): +- [**Search highlighting**](../index-and-search/arangosearch/search-highlighting.md): Get the substring positions of matched terms, phrases, or _n_-grams. -- [**Nested search**](../../index-and-search/arangosearch/nested-search.md): +- [**Nested search**](../index-and-search/arangosearch/nested-search.md): Match arrays of objects with all the conditions met by a single sub-object, and define for how many of the elements this must be true. - **ArangoSearch**: - New [`minhash` Analyzer](../../index-and-search/analyzers.md#minhash) for locality-sensitive hashing + New [`minhash` Analyzer](../index-and-search/analyzers.md#minhash) for locality-sensitive hashing to approximate the Jaccard similarity, with inverted index and `arangosearch` View support that allows you to implement entity resolution. -- [**Parallelism for sharded graphs**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): +- [**Parallelism for sharded graphs**](../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): Parallel execution of AQL traversal queries with many start nodes for all types of sharded graphs, leading to faster results. -- [**Traversal Projections**](../../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): +- [**Traversal Projections**](../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): Optimized data loading for AQL traversal queries if only a few document attributes are accessed. -- [**Read from followers in clusters**](../../develop/http-api/documents.md#read-from-followers): +- [**Read from followers in clusters**](../develop/http-api/documents.md#read-from-followers): Allow dirty reads so that Coordinators can read from any shard replica and not only from the leader, for scaling reads. -Also see [What's New in 3.10](../../release-notes/version-3.10/whats-new-in-3-10.md). +Also see [What's New in 3.10](../release-notes/version-3.10/whats-new-in-3-10.md). ## Version 3.9 **All Editions** - **ArangoSearch**: - New [**Segmentation Analyzer**](../../index-and-search/analyzers.md#segmentation) + New [**Segmentation Analyzer**](../index-and-search/analyzers.md#segmentation) for language-agnostic tokenization of text. - A [**Collation Analyzer**](../../index-and-search/analyzers.md#collation) + A [**Collation Analyzer**](../index-and-search/analyzers.md#collation) to honor the alphabetical order of the specified language in range queries. **Enterprise Edition** -- [**(Disjoint) SmartGraphs using SatelliteCollections**](../../graphs/smartgraphs/_index.md): +- [**(Disjoint) SmartGraphs using SatelliteCollections**](../graphs/smartgraphs/_index.md): SatelliteCollections can be used in (Disjoint) SmartGraphs to enable more local execution of graph queries. -Also see [What's New in 3.9](../../release-notes/version-3.9/whats-new-in-3-9.md). +Also see [What's New in 3.9](../release-notes/version-3.9/whats-new-in-3-9.md). ## Version 3.8 **All Editions** -- [**Weighted traversals**](../../release-notes/version-3.8/whats-new-in-3-8.md#weighted-traversals) - and [**k Paths**](../../release-notes/version-3.8/whats-new-in-3-8.md#k-paths): +- [**Weighted traversals**](../release-notes/version-3.8/whats-new-in-3-8.md#weighted-traversals) + and [**k Paths**](../release-notes/version-3.8/whats-new-in-3-8.md#k-paths): Two new AQL graph traversal methods to emit paths in order of increasing weights and to enumerate all paths between a start and a end node that match a given length. - **ArangoSearch**: - New [**Pipeline Analyzer**](../../index-and-search/analyzers.md#pipeline) + New [**Pipeline Analyzer**](../index-and-search/analyzers.md#pipeline) that allows you to combine multiple Analyzers, enabling case-insensitive _n_-gram-based fuzzy search and more. New - [**AQL Analyzer**](../../index-and-search/analyzers.md#aql) + [**AQL Analyzer**](../index-and-search/analyzers.md#aql) so that you can use an AQL query to pre-process and filter your data for indexing. Support for **geo-spatial queries** through new - [Geo](../../index-and-search/analyzers.md#geojson) - [Analyzers](../../index-and-search/analyzers.md#geopoint) and - [ArangoSearch Geo functions](../../aql/functions/arangosearch.md#geo-functions). - A new [**Stop words Analyzer**](../../index-and-search/analyzers.md#stopwords) that + [Geo](../index-and-search/analyzers.md#geojson) + [Analyzers](../index-and-search/analyzers.md#geopoint) and + [ArangoSearch Geo functions](../aql/functions/arangosearch.md#geo-functions). + A new [**Stop words Analyzer**](../index-and-search/analyzers.md#stopwords) that can be used standalone or in an Analyzer pipeline. -- A [**`WINDOW` operation**](../../aql/high-level-operations/window.md) for aggregations over +- A [**`WINDOW` operation**](../aql/high-level-operations/window.md) for aggregations over adjacent rows, value ranges or time windows. **Enterprise Edition** - **Encryption at Rest** utilizes - [hardware acceleration](../../release-notes/version-3.8/whats-new-in-3-8.md#encryption-at-rest) + [hardware acceleration](../release-notes/version-3.8/whats-new-in-3-8.md#encryption-at-rest) capabilities of modern CPUs. -Also see [What's New in 3.8](../../release-notes/version-3.8/whats-new-in-3-8.md). +Also see [What's New in 3.8](../release-notes/version-3.8/whats-new-in-3-8.md). ## Version 3.7 **All Editions** - **ArangoSearch**: - [Wildcard](../../aql/functions/arangosearch.md#like) and fuzzy search - ([Levenshtein distance](../../aql/functions/arangosearch.md#levenshtein_match) and - [_n_-gram based](../../aql/functions/arangosearch.md#ngram_match)), - enhanced [phrase and proximity search](../../aql/functions/arangosearch.md#phrase), + [Wildcard](../aql/functions/arangosearch.md#like) and fuzzy search + ([Levenshtein distance](../aql/functions/arangosearch.md#levenshtein_match) and + [_n_-gram based](../aql/functions/arangosearch.md#ngram_match)), + enhanced [phrase and proximity search](../aql/functions/arangosearch.md#phrase), improved late document materialization and - [Views covering queries](../../release-notes/version-3.7/whats-new-in-3-7.md#covering-indexes) + [Views covering queries](../release-notes/version-3.7/whats-new-in-3-7.md#covering-indexes) using their indexes without touching the storage engine, as well as a new SIMD-based index format for faster processing and - [stemming support](../../release-notes/version-3.7/whats-new-in-3-7.md#stemming-support-for-more-languages) + [stemming support](../release-notes/version-3.7/whats-new-in-3-7.md#stemming-support-for-more-languages) for 15 additional languages. -- [**Schema Validation**](../../concepts/data-structure/documents/schema-validation.md): +- [**Schema Validation**](../concepts/data-structure/documents/schema-validation.md): Enforce a JSON Schema for documents on collection level. Invalid documents can be rejected automatically by the database system, making it easy to maintain data quality. -- [**Insert-Update** and **Insert-Ignore**](../../release-notes/version-3.7/whats-new-in-3-7.md#insert-update-and-insert-ignore): +- [**Insert-Update** and **Insert-Ignore**](../release-notes/version-3.7/whats-new-in-3-7.md#insert-update-and-insert-ignore): New document API operations to upsert documents and to efficiently insert documents while skipping the creation if the document exists already. - **AQL**: - Improved [subquery](../../release-notes/version-3.7/whats-new-in-3-7.md#subquery-optimizations) and - [graph traversal performance](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-optimizations), + Improved [subquery](../release-notes/version-3.7/whats-new-in-3-7.md#subquery-optimizations) and + [graph traversal performance](../release-notes/version-3.7/whats-new-in-3-7.md#traversal-optimizations), among many optimizations and enhancements. -- [**HTTP/2 support**](../../release-notes/version-3.7/whats-new-in-3-7.md#http2-support): +- [**HTTP/2 support**](../release-notes/version-3.7/whats-new-in-3-7.md#http2-support): Better load-balancer and Kubernetes compatibility, improved request throughput. **Enterprise Edition** -- [**SatelliteGraphs**](../../release-notes/version-3.7/whats-new-in-3-7.md#satellitegraphs): +- [**SatelliteGraphs**](../release-notes/version-3.7/whats-new-in-3-7.md#satellitegraphs): Synchronously replicated graphs with local traversal execution. -- [**Disjoint SmartGraphs**](../../release-notes/version-3.7/whats-new-in-3-7.md#disjoint-smartgraphs): +- [**Disjoint SmartGraphs**](../release-notes/version-3.7/whats-new-in-3-7.md#disjoint-smartgraphs): Improve traversal execution times for SmartGraphs without edges between nodes with different SmartGraph attribute values. -- [**Traversal parallelization**](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition): +- [**Traversal parallelization**](../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition): Optional parallel execution of nested traversals for single servers and OneShard clusters. - **Security**: Added support for multiple - [JWT Secrets](../../release-notes/version-3.7/whats-new-in-3-7.md#jwt-secret-rotation-enterprise-edition) + [JWT Secrets](../release-notes/version-3.7/whats-new-in-3-7.md#jwt-secret-rotation-enterprise-edition) and the ability to hot-reload them from disk, - [TLS key and certificate rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation), - [Encryption at rest key rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#encryption-at-rest-key-rotation-enterprise-edition) - and [Server Name Indication (SNI)](../../release-notes/version-3.7/whats-new-in-3-7.md#server-name-indication-enterprise-edition). + [TLS key and certificate rotation](../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation), + [Encryption at rest key rotation](../release-notes/version-3.7/whats-new-in-3-7.md#encryption-at-rest-key-rotation-enterprise-edition) + and [Server Name Indication (SNI)](../release-notes/version-3.7/whats-new-in-3-7.md#server-name-indication-enterprise-edition). -Also see [What's New in 3.7](../../release-notes/version-3.7/whats-new-in-3-7.md). +Also see [What's New in 3.7](../release-notes/version-3.7/whats-new-in-3-7.md). ## Version 3.6 @@ -258,32 +264,32 @@ Also see [What's New in 3.7](../../release-notes/version-3.7/whats-new-in-3-7.md - **AQL**: Improved query performance thanks to - [early pruning](../../release-notes/version-3.6/whats-new-in-3-6.md#early-pruning-of-non-matching-documents), - [subquery splicing](../../release-notes/version-3.6/whats-new-in-3-6.md#subquery-splicing-optimization), - [late document materialization](../../release-notes/version-3.6/whats-new-in-3-6.md#late-document-materialization-rocksdb), - [parallelization](../../release-notes/version-3.6/whats-new-in-3-6.md#parallelization-of-cluster-aql-queries) for certain cluster queries - and more. New server-side [`maxRuntime`](../../aql/how-to-invoke-aql/with-arangosh.md#maxruntime) + [early pruning](../release-notes/version-3.6/whats-new-in-3-6.md#early-pruning-of-non-matching-documents), + [subquery splicing](../release-notes/version-3.6/whats-new-in-3-6.md#subquery-splicing-optimization), + [late document materialization](../release-notes/version-3.6/whats-new-in-3-6.md#late-document-materialization-rocksdb), + [parallelization](../release-notes/version-3.6/whats-new-in-3-6.md#parallelization-of-cluster-aql-queries) for certain cluster queries + and more. New server-side [`maxRuntime`](../aql/how-to-invoke-aql/with-arangosh.md#maxruntime) option for queries. - **ArangoSearch**: - New [Analyzer options](../../release-notes/version-3.6/whats-new-in-3-6.md#analyzers) for + New [Analyzer options](../release-notes/version-3.6/whats-new-in-3-6.md#analyzers) for edge _n_-grams (`text` Analyzer), UTF-8 encoded _n_-gram input and optional start/end markers (`ngram` Analyzer). Support for - [dynamic expressions](../../release-notes/version-3.6/whats-new-in-3-6.md#dynamic-search-expressions-with-arrays) + [dynamic expressions](../release-notes/version-3.6/whats-new-in-3-6.md#dynamic-search-expressions-with-arrays) using arrays (array comparison operators in `SEARCH` queries and the `TOKENS()` / `PHRASE()` functions accept arrays). Views can benefit from the SmartJoins optimization. **Enterprise Edition** -- [**OneShard**](../../deploy/oneshard.md) +- [**OneShard**](../deploy/oneshard.md) deployments offer a practicable solution that enables significant performance improvements by massively reducing cluster-internal communication. A database created with OneShard enabled is limited to a single DB-Server node but still replicated synchronously to ensure resilience. This configuration allows running transactions with ACID guarantees on shard leaders. -Also see [What's New in 3.6](../../release-notes/version-3.6/whats-new-in-3-6.md). +Also see [What's New in 3.6](../release-notes/version-3.6/whats-new-in-3-6.md). ## Version 3.5 @@ -291,62 +297,62 @@ Also see [What's New in 3.6](../../release-notes/version-3.6/whats-new-in-3-6.md - **ArangoSearch**: The search and ranking engine received an upgrade and now features - [Configurable Analyzers](../../index-and-search/analyzers.md), - [Sorted Views](../../index-and-search/arangosearch/performance.md#primary-sort-order) + [Configurable Analyzers](../index-and-search/analyzers.md), + [Sorted Views](../index-and-search/arangosearch/performance.md#primary-sort-order) and several improvements to the - [AQL integration](../../release-notes/version-3.5/whats-new-in-3-5.md#arangosearch). + [AQL integration](../release-notes/version-3.5/whats-new-in-3-5.md#arangosearch). - **AQL Graph Traversals**: - [k Shortest Paths](../../aql/graphs/k-shortest-paths.md) allows you to query not + [k Shortest Paths](../aql/graphs/k-shortest-paths.md) allows you to query not just for one shortest path between two documents but multiple, sorted by - length or weight. With [PRUNE](../../aql/graphs/traversals.md#pruning) you can + length or weight. With [PRUNE](../aql/graphs/traversals.md#pruning) you can stop walking down certain paths early in a graph traversal to improve its efficiency. -- [**Stream Transaction API**](../../develop/http-api/transactions/stream-transactions.md): +- [**Stream Transaction API**](../develop/http-api/transactions/stream-transactions.md): Perform multi-document transactions with individual begin and commit / abort commands using the new HTTP endpoints or via a supported driver. -- [**Time-to-Live**](../../index-and-search/indexing/basics.md#ttl-time-to-live-index) - [**Indexes**](../../index-and-search/indexing/working-with-indexes/ttl-indexes.md): +- [**Time-to-Live**](../index-and-search/indexing/basics.md#ttl-time-to-live-index) + [**Indexes**](../index-and-search/indexing/working-with-indexes/ttl-indexes.md): TTL indexes can be used to automatically remove documents in collections for use cases like expiring sessions or automatic purging of statistics or logs. -- [**Index Hints**](../../aql/high-level-operations/for.md#indexhint) & +- [**Index Hints**](../aql/high-level-operations/for.md#indexhint) & [**Named Indexes**](https://www.arangodb.com/learn/development/index-hints-named-indices/): Indexes can be given names and an optional AQL inline query option `indexHint` was added to override the internal optimizer decision on which index to utilize. -- [**Data Masking**](../../components/tools/arangodump/maskings.md): +- [**Data Masking**](../components/tools/arangodump/maskings.md): arangodump provides a convenient way to extract production data but mask critical information that should not be visible. **Enterprise Edition** -- [**Hot Backups**](../../operations/backup-and-restore.md#hot-backups): +- [**Hot Backups**](../operations/backup-and-restore.md#hot-backups): Create automatic, consistent backups of your cluster without noticeable impact on your production systems. In contrast to _arangodump_, hot backups are taken on the level of the underlying storage engine and hence both backup and restore are considerably faster. -- [**SmartJoins**](../../develop/smartjoins.md): +- [**SmartJoins**](../develop/smartjoins.md): Run joins between identically sharded collections with performance close to that of a local join operation. - **Advanced Data Masking**: There are additional - [data masking functions](../../components/tools/arangodump/maskings.md#masking-functions) + [data masking functions](../components/tools/arangodump/maskings.md#masking-functions) available in the Enterprise Edition, such as for substituting email addresses and phone numbers with similar looking pseudo-data. -Also see [What's New in 3.5](../../release-notes/version-3.5/whats-new-in-3-5.md). +Also see [What's New in 3.5](../release-notes/version-3.5/whats-new-in-3-5.md). ## Version 3.4 **All Editions** -- [**ArangoSearch**](../../index-and-search/arangosearch/_index.md): +- [**ArangoSearch**](../index-and-search/arangosearch/_index.md): Search and similarity ranking engine integrated natively into ArangoDB and AQL. ArangoSearch combines Boolean retrieval capabilities with generalized ranking algorithms (BM25, TFDIF). Support of e.g. relevance-based searching, @@ -355,32 +361,32 @@ Also see [What's New in 3.5](../../release-notes/version-3.5/whats-new-in-3-5.md query. Many specialized language Analyzers are already included for e.g. English, German, French, Chinese, Spanish and many other language. -- [**GeoJSON Support**](../../aql/functions/geo.md) and - [**S2 Geo Index**](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): ArangoDB now supports all geo primitives. +- [**GeoJSON Support**](../aql/functions/geo.md) and + [**S2 Geo Index**](../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): ArangoDB now supports all geo primitives. (Multi-)Point, (Multi-)LineStrings, (Multi-)Polygons or intersections can be defined and queried for. The Google S2 geo index is optimized for RocksDB and enables efficient querying. Geo query results are automatically visualized with an OpenStreetMap integration within the Query Editor of the web interface. -- [**Query Profiler**](../../aql/execution-and-performance/query-profiling.md): +- [**Query Profiler**](../aql/execution-and-performance/query-profiling.md): Enables the analysis of queries and adds additional information for the user to identify optimization potentials more easily. The profiler can be accessed via _arangosh_ with `db._profileQuery(...)` or via the *Profile* button in the Query Editor of the web interface. -- [**Streaming Cursors**](../../aql/how-to-invoke-aql/with-arangosh.md#stream): +- [**Streaming Cursors**](../aql/how-to-invoke-aql/with-arangosh.md#stream): Cursors requested with the stream option on make queries calculate results on the fly and make them available for the client in a streaming fashion, as soon as possible. - **RocksDB as Default Storage Engine**: With ArangoDB 3.4 the default - [storage engine](../../components/arangodb-server/storage-engine.md) for fresh installations will + [storage engine](../components/arangodb-server/storage-engine.md) for fresh installations will switch from MMFiles to RocksDB. Many optimizations have been made to RocksDB since the first release in 3.2. For 3.4 we optimized the binary storage format for improved insertion, implemented "optional caching", reduced the replication catch-up time and much more. -Also see [What's New in 3.4](../../release-notes/version-3.4/whats-new-in-3-4.md). +Also see [What's New in 3.4](../release-notes/version-3.4/whats-new-in-3-4.md). ## Version 3.3 @@ -392,30 +398,30 @@ Also see [What's New in 3.4](../../release-notes/version-3.4/whats-new-in-3-4.md Multi-datacenter support means you can fallback to a replica of your cluster in case of a disaster in one datacenter. -- [**Encrypted Backups**](../../components/tools/arangodump/examples.md#encryption): +- [**Encrypted Backups**](../components/tools/arangodump/examples.md#encryption): _arangodump_ can create backups encrypted with a secret key using AES256 block cipher. **All Editions** -- [**Server-level Replication**](../../release-notes/version-3.3/whats-new-in-3-3.md#server-level-replication): +- [**Server-level Replication**](../release-notes/version-3.3/whats-new-in-3-3.md#server-level-replication): In addition to per-database replication, there is now an additional `globalApplier`. Start the global replication on the Follower once and all current and future databases will be replicated from the Leader to the Follower automatically. -- [**Asynchronous Failover**](../../release-notes/version-3.3/whats-new-in-3-3.md#asynchronous-failover): +- [**Asynchronous Failover**](../release-notes/version-3.3/whats-new-in-3-3.md#asynchronous-failover): Make a single server instance resilient with a second server instance, one as Leader and the other as asynchronously replicating Follower, with automatic failover to the Follower if the Leader goes down. -Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md). +Also see [What's New in 3.3](../release-notes/version-3.3/whats-new-in-3-3.md). ## Version 3.2 **All Editions** -- [**RocksDB Storage Engine**](../../components/arangodb-server/storage-engine.md): You can now use +- [**RocksDB Storage Engine**](../components/arangodb-server/storage-engine.md): You can now use as much data in ArangoDB as you can fit on your disk. Plus, you can enjoy performance boosts on writes by having only document-level locks. @@ -424,7 +430,7 @@ Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md patterns, identify communities and perform in-depth analytics of large graph data sets. -- [**Fault-Tolerant Foxx**](../../develop/http-api/foxx.md): The Foxx management +- [**Fault-Tolerant Foxx**](../develop/http-api/foxx.md): The Foxx management internals have been rewritten from the ground up to make sure multi-coordinator cluster setups always keep their services in sync and new Coordinators are fully initialized even when all existing Coordinators @@ -436,22 +442,22 @@ Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md can be managed from outside ArangoDB with an LDAP server in different authentication configurations. -- [**Encryption at Rest**](../../operations/security/encryption-at-rest.md): Let the server +- [**Encryption at Rest**](../operations/security/encryption-at-rest.md): Let the server persist your sensitive data strongly encrypted to protect it even if the physical storage medium gets stolen. -- [**SatelliteCollections**](../../develop/satellitecollections.md): Faster join operations when +- [**SatelliteCollections**](../develop/satellitecollections.md): Faster join operations when working with sharded datasets by synchronously replicating selected collections to all DB-Servers in a cluster, so that joins can be executed locally. -Also see [What's New in 3.2](../../release-notes/version-3.2/whats-new-in-3-2.md). +Also see [What's New in 3.2](../release-notes/version-3.2/whats-new-in-3-2.md). ## Version 3.1 **All Editions** -- [**Vertex-centric indexes**](../../index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md): +- [**Vertex-centric indexes**](../index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md): AQL traversal queries can utilize secondary edge collection indexes for better performance against graphs with supernodes. @@ -461,35 +467,35 @@ Also see [What's New in 3.2](../../release-notes/version-3.2/whats-new-in-3-2.md **Enterprise Edition** -- [**SmartGraphs**](../../graphs/smartgraphs/_index.md): Scale with graphs to a +- [**SmartGraphs**](../graphs/smartgraphs/_index.md): Scale with graphs to a cluster and stay performant. With SmartGraphs you can use the "smartness" of your application layer to shard your graph efficiently to your machines and let traversals run locally. -- **Encryption Control**: Choose your level of [SSL encryption](../../components/arangodb-server/options.md#ssl) +- **Encryption Control**: Choose your level of [SSL encryption](../components/arangodb-server/options.md#ssl) -- [**Auditing**](../../operations/security/audit-logging.md): Keep a detailed log +- [**Auditing**](../operations/security/audit-logging.md): Keep a detailed log of all the important things that happened in ArangoDB. -Also see [What's New in 3.1](../../release-notes/version-3.1/whats-new-in-3-1.md). +Also see [What's New in 3.1](../release-notes/version-3.1/whats-new-in-3-1.md). ## Version 3.0 -- [**self-organizing cluster**](../../deploy/cluster/_index.md) with +- [**self-organizing cluster**](../deploy/cluster/_index.md) with synchronous replication, master/master setup, shared nothing architecture, cluster management Agency. -- Deeply integrated, native [**AQL graph traversal**](../../aql/graphs/_index.md) +- Deeply integrated, native [**AQL graph traversal**](../aql/graphs/_index.md) - [**VelocyPack**](https://github.com/arangodb/velocypack) as new internal binary storage format as well as for intermediate AQL values. -- [**Persistent indexes**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md) via RocksDB suitable +- [**Persistent indexes**](../index-and-search/indexing/working-with-indexes/persistent-indexes.md) via RocksDB suitable for sorting and range queries. -- [**Foxx 3.0**](../../develop/foxx-microservices/_index.md): overhauled JS framework for data-centric +- [**Foxx 3.0**](../develop/foxx-microservices/_index.md): overhauled JS framework for data-centric microservices -- Significantly improved [**Web Interface**](../../components/web-interface/_index.md) +- Significantly improved [**Web Interface**](../components/web-interface/_index.md) -Also see [What's New in 3.0](../../release-notes/version-3.0/whats-new-in-3-0.md). +Also see [What's New in 3.0](../release-notes/version-3.0/whats-new-in-3-0.md). diff --git a/site/content/arangodb/3.13/about/features/list.md b/site/content/arangodb/3.13/features/list.md similarity index 65% rename from site/content/arangodb/3.13/about/features/list.md rename to site/content/arangodb/3.13/features/list.md index eaadc86a3f..ee4006160b 100644 --- a/site/content/arangodb/3.13/about/features/list.md +++ b/site/content/arangodb/3.13/features/list.md @@ -6,20 +6,20 @@ description: >- All features of the ArangoDB database system, available in both the Community Edition and Enterprise Edition aliases: - - ../../introduction/features/community-edition - - ../../introduction/features/enterprise-edition + - ../introduction/features/community-edition + - ../introduction/features/enterprise-edition - community-edition - enterprise-edition --- ## General -- [**Graph Database**](../../concepts/data-models.md#graph-model): +- [**Graph Database**](../concepts/data-models.md#graph-model): Native support for storing and querying graphs comprised of nodes and edges. You can model complex domains because both nodes and edges are fully-fledged documents, without restrictions in complexity. Edges can connect node documents to express m:n relations with any depth. -- [**Document Database**](../../concepts/data-models.md#document-model): +- [**Document Database**](../concepts/data-models.md#document-model): A modern document database system that allows you to model data intuitively and evolve the data model easily. Documents can be organized in collections, and collections in databases for multi-tenancy. @@ -32,7 +32,7 @@ aliases: top and mix it with graph traversals, geo queries, aggregations, or any other supported access pattern. -- [**Data Format**](../../concepts/data-structure/_index.md#documents): +- [**Data Format**](../concepts/data-structure/_index.md#documents): JSON, internally stored in a binary format invented by ArangoDB called VelocyPack. @@ -42,12 +42,12 @@ aliases: documents, or graphs - perfect for social relations. Optional document validation using JSON Schema (draft-4, without remote schema support). -- [**Data Storage**](../../components/arangodb-server/storage-engine.md): +- [**Data Storage**](../components/arangodb-server/storage-engine.md): RocksDB storage engine to persist data and indexes on disk, with a hot set in memory. It uses journaling (write-ahead logging) and can take advantage of modern storage hardware, like SSDs and large caches. -- [**Computed Values**](../../concepts/data-structure/documents/computed-values.md): +- [**Computed Values**](../concepts/data-structure/documents/computed-values.md): Persistent document attributes that are generated when documents are created or modified, using an AQL expression. @@ -55,7 +55,7 @@ aliases: Use ArangoDB as a [fully managed service](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), self-managed in the cloud, or on-premises. -- [**Multiple Environments**](../../operations/installation/_index.md#supported-platforms-and-architectures): +- [**Multiple Environments**](../operations/installation/_index.md#supported-platforms-and-architectures): Run ArangoDB on Linux using the production-ready packages for the x86-64 architecture, on bare metal or in containers. Develop and test with ArangoDB on Windows, macOS, and Linux using the official @@ -63,17 +63,17 @@ aliases: ## Scalability & High Availability -- [**Hash-based sharding**](../../deploy/architecture/data-sharding.md): +- [**Hash-based sharding**](../deploy/architecture/data-sharding.md): Spread bigger datasets across multiple servers using consistent hashing on the default or custom shard keys. -- [**Synchronous Replication**](../../deploy/cluster/_index.md#synchronous-replication): +- [**Synchronous Replication**](../deploy/cluster/_index.md#synchronous-replication): Data changes are propagated to other cluster nodes immediately as part of an operation, and are only considered successful when the configured number of writes is reached. Synchronous replication works on a per-shard basis. For each collection, you can configure how many copies of each shard are kept in the cluster. -- [**Automatic Failover Cluster**](../../deploy/cluster/_index.md#automatic-failover): +- [**Automatic Failover Cluster**](../deploy/cluster/_index.md#automatic-failover): If a cluster node goes down, another node takes over to avoid downtime. - **Load-Balancer Support**: @@ -84,7 +84,7 @@ aliases: ## Querying -- [**Declarative Query Language for All Data Models**](../../aql/_index.md): +- [**Declarative Query Language for All Data Models**](../aql/_index.md): Powerful query language (AQL) to retrieve and modify data. Graph traversals, full-text searches, geo-spatial queries, and aggregations can be composed in a single query. @@ -92,40 +92,40 @@ aliases: ranges and time intervals. Cluster-distributed aggregation queries. -- [**Query Optimizer**](../../aql/execution-and-performance/query-optimization.md): +- [**Query Optimizer**](../aql/execution-and-performance/query-optimization.md): Cost-based query optimizer that takes index selectivity estimates into account. <!-- TODO: Explain, batching?, lazy evaluation (stream)? --> -- [**Query Profiling**](../../aql/execution-and-performance/query-profiling.md): +- [**Query Profiling**](../aql/execution-and-performance/query-profiling.md): Show detailed runtime information for AQL queries. -- [**Query Logging**](../../aql/execution-and-performance/query-logging.md): +- [**Query Logging**](../aql/execution-and-performance/query-logging.md): Store query metadata and analyze it directly in the database system to debug issues and understand usage patterns. -- [**Upsert Operations**](../../aql/examples-and-query-patterns/upsert-repsert-guide.md): +- [**Upsert Operations**](../aql/examples-and-query-patterns/upsert-repsert-guide.md): Support for insert-or-update (upsert), insert-or-replace (repsert), and insert-or-ignore requests, that result in one or the other operation depending on whether the target document exists already. -- [**Relational Joins**](../../aql/examples-and-query-patterns/joins.md): +- [**Relational Joins**](../aql/examples-and-query-patterns/joins.md): Joins similar to those in relational database systems can be leveraged to match up documents from different collections, allowing normalized data models. - **Advanced Path-Finding with Multiple Algorithms**: - Graphs can be [traversed](../../aql/graphs/traversals-explained.md) with AQL + Graphs can be [traversed](../aql/graphs/traversals-explained.md) with AQL in outbound, inbound, or both directions to retrieve direct and indirect neighbor nodes using a fixed or variable depth. - The [traversal order](../../aql/graphs/traversals.md) can be + The [traversal order](../aql/graphs/traversals.md) can be depth-first, breadth-first, or in order of increasing edge weights ("Weighted Traversals"). Stop conditions for pruning paths are supported. - Traversal algorithms to get a [shortest path](../../aql/graphs/shortest-path.md), - [all shortest paths](../../aql/graphs/all-shortest-paths.md), paths in order of - increasing length ("[k Shortest Paths](../../aql/graphs/k-shortest-paths.md)"), + Traversal algorithms to get a [shortest path](../aql/graphs/shortest-path.md), + [all shortest paths](../aql/graphs/all-shortest-paths.md), paths in order of + increasing length ("[k Shortest Paths](../aql/graphs/k-shortest-paths.md)"), and to enumerate all paths between two nodes - ("[k Paths](../../aql/graphs/k-paths.md)") are available, too. + ("[k Paths](../aql/graphs/k-paths.md)") are available, too. -- [**ArangoSearch for Text Search and Ranking**](../../index-and-search/arangosearch/_index.md): +- [**ArangoSearch for Text Search and Ranking**](../index-and-search/arangosearch/_index.md): A built-in search engine for full-text, complex data structures, and more. Exact value matching, range queries, prefix matching, case-insensitive and accent-insensitive search. Token, phrase, wildcard, and fuzzy search support @@ -134,51 +134,51 @@ aliases: Flexible data field pre-processing with custom queries and the ability to chain built-in and custom Analyzers. Language-agnostic tokenization of text. -- [**GeoJSON Support**](../../aql/functions/geo.md#geojson): +- [**GeoJSON Support**](../aql/functions/geo.md#geojson): Geographic data encoded in the popular GeoJSON format can be stored and used for geo-spatial queries. {{% comment %}} Experimental feature -- [**Query result spillover**](../../aql/how-to-invoke-aql/with-arangosh.md#spilloverthresholdmemoryusage): +- [**Query result spillover**](../aql/how-to-invoke-aql/with-arangosh.md#spilloverthresholdmemoryusage): AQL queries can store intermediate and final results temporarily on disk (also known as external result sets) to decrease memory usage when a specified threshold is reached. {{% /comment %}} {{% comment %}} Experimental feature -- [**Vector search**](../../index-and-search/indexing/working-with-indexes/vector-indexes.md): +- [**Vector search**](../index-and-search/indexing/working-with-indexes/vector-indexes.md): Find items with similar properties by comparing vector embeddings generated by machine learning models. {{% /comment %}} -- [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): +- [**Search highlighting**](../index-and-search/arangosearch/search-highlighting.md): Get the substring positions of matched terms, phrases, or _n_-grams. -- [**Nested search**](../../index-and-search/arangosearch/nested-search.md): +- [**Nested search**](../index-and-search/arangosearch/nested-search.md): Match arrays of objects with all the conditions met by a single sub-object, and define for how many of the elements this must be true. {{% comment %}} Experimental feature -- **[`classification`](../../index-and-search/analyzers.md#classification) and [`nearest_neighbors` Analyzers](../../index-and-search/analyzers.md#nearest_neighbors)**: +- **[`classification`](../index-and-search/analyzers.md#classification) and [`nearest_neighbors` Analyzers](../index-and-search/analyzers.md#nearest_neighbors)**: Classification of text tokens and finding similar tokens using supervised fastText word embedding models. {{% /comment %}} -- [**Skip inaccessible collections**](../../aql/how-to-invoke-aql/with-arangosh.md#skipinaccessiblecollections): +- [**Skip inaccessible collections**](../aql/how-to-invoke-aql/with-arangosh.md#skipinaccessiblecollections): Let AQL queries like graph traversals pretend that collections are empty if the user has no access to them instead of failing the query. ## Transactions -- [**AQL Queries**](../../aql/data-queries.md#transactional-execution): +- [**AQL Queries**](../aql/data-queries.md#transactional-execution): AQL queries are executed transactionally (with exceptions), either committing or rolling back data modifications automatically. -- [**Stream Transactions**](../../develop/http-api/transactions/stream-transactions.md): +- [**Stream Transactions**](../develop/http-api/transactions/stream-transactions.md): Transactions with individual begin and commit / abort commands that can span multiple AQL queries and API calls of supported APIs. -- [**JavaScript Transactions**](../../develop/http-api/transactions/javascript-transactions.md): +- [**JavaScript Transactions**](../develop/http-api/transactions/javascript-transactions.md): Single-request transactions written in JavaScript that leverage ArangoDB's JavaScript API. @@ -200,148 +200,148 @@ aliases: ## Performance -- [**SmartGraphs**](../../graphs/smartgraphs/_index.md): +- [**SmartGraphs**](../graphs/smartgraphs/_index.md): Value-based sharding of large graph datasets for better data locality when traversing graphs. -- [**EnterpriseGraphs**](../../graphs/enterprisegraphs/_index.md): +- [**EnterpriseGraphs**](../graphs/enterprisegraphs/_index.md): A specialized version of SmartGraphs, with an automatic sharding key selection. -- [**SmartGraphs using SatelliteCollections**](../../graphs/smartgraphs/_index.md): +- [**SmartGraphs using SatelliteCollections**](../graphs/smartgraphs/_index.md): Collections replicated on all cluster nodes can be combined with graphs sharded by document attributes to enable more local execution of graph queries. -- [**SatelliteGraphs**](../../graphs/satellitegraphs/_index.md): +- [**SatelliteGraphs**](../graphs/satellitegraphs/_index.md): Graphs replicated on all cluster nodes to execute graph traversals locally. -- [**SatelliteCollections**](../../develop/satellitecollections.md): +- [**SatelliteCollections**](../develop/satellitecollections.md): Collections replicated on all cluster nodes to execute joins with sharded data locally. -- [**SmartJoins**](../../develop/smartjoins.md): +- [**SmartJoins**](../develop/smartjoins.md): Co-located joins in a cluster using identically sharded collections. -- [**OneShard**](../../deploy/oneshard.md): +- [**OneShard**](../deploy/oneshard.md): Option to store all collections of a database on a single cluster node, to combine the performance of a single server and ACID semantics with a fault-tolerant cluster setup. -- [**Traversal**](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition) - [**Parallelization**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): +- [**Traversal**](../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition) + [**Parallelization**](../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): Parallel execution of traversal queries with many start nodes, leading to faster results. -- [**Traversal Projections**](../../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): +- [**Traversal Projections**](../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): Optimized data loading for AQL traversal queries if only a few document attributes are accessed. -- [**Parallel index creation**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallel-index-creation-enterprise-edition): +- [**Parallel index creation**](../release-notes/version-3.10/whats-new-in-3-10.md#parallel-index-creation-enterprise-edition): Non-unique indexes can be created with multiple threads in parallel. -- [**`minhash` Analyzer**](../../index-and-search/analyzers.md#minhash): +- [**`minhash` Analyzer**](../index-and-search/analyzers.md#minhash): Jaccard similarity approximation for entity resolution, such as for finding duplicate records, based on how many elements they have in common -- [**`geo_s2` Analyzer**](../../index-and-search/analyzers.md#geo_s2): +- [**`geo_s2` Analyzer**](../index-and-search/analyzers.md#geo_s2): Efficiently index geo-spatial data using different binary formats, tuning the size on disk, the precision, and query performance. -- [**ArangoSearch column cache**](../../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): +- [**ArangoSearch column cache**](../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): Always cache field normalization values, Geo Analyzer auxiliary data, stored values, primary sort columns, and primary key columns in memory to improve the performance of Views and inverted indexes. -- [**ArangoSearch WAND optimization**](../../index-and-search/arangosearch/performance.md#wand-optimization): +- [**ArangoSearch WAND optimization**](../index-and-search/arangosearch/performance.md#wand-optimization): Retrieve search results for the highest-ranking matches from Views faster by defining a list of sort expressions to optimize. -- [**Read from followers in clusters**](../../develop/http-api/documents.md#read-from-followers): +- [**Read from followers in clusters**](../develop/http-api/documents.md#read-from-followers): Allow dirty reads so that Coordinators can read from any shard replica and not only from the leader, for scaling reads. -- [**Persistent Indexes**](../../index-and-search/indexing/basics.md#persistent-index): +- [**Persistent Indexes**](../index-and-search/indexing/basics.md#persistent-index): Indexes are stored on disk to enable fast server restarts. You can create secondary indexes over one or multiple fields, optionally with a uniqueness constraint. A "sparse" option to only index non-null values is also available. The elements of an array can be indexed individually. -- [**Inverted indexes**](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md): +- [**Inverted indexes**](../index-and-search/indexing/working-with-indexes/inverted-indexes.md): An eventually consistent index type that can accelerate a broad range of queries from simple to complex, including full-text search. -- [**Vertex-centric Indexes**](../../index-and-search/indexing/basics.md#vertex-centric-indexes): +- [**Vertex-centric Indexes**](../index-and-search/indexing/basics.md#vertex-centric-indexes): Secondary indexes for more efficient graph traversals with filter conditions. -- [**Time-to-Live (TTL) Indexes**](../../index-and-search/indexing/basics.md#ttl-time-to-live-index): +- [**Time-to-Live (TTL) Indexes**](../index-and-search/indexing/basics.md#ttl-time-to-live-index): Time-based removal of expired documents. -- [**Geo-spatial Indexes**](../../index-and-search/indexing/basics.md#geo-index): +- [**Geo-spatial Indexes**](../index-and-search/indexing/basics.md#geo-index): Accelerated geo-spatial queries for locations and GeoJSON objects, based on the S2 library. <!-- TODO: list supported queries? Centroid-limitations? --> Support for composable, distance-based geo-queries ("geo cursors"). -- [**Multi-dimensional indexes**](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): +- [**Multi-dimensional indexes**](../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): An index type to efficiently intersect multiple range queries, like finding all appointments that intersect a time range. -- [**Background Indexing**](../../index-and-search/indexing/basics.md#creating-indexes-in-background): +- [**Background Indexing**](../index-and-search/indexing/basics.md#creating-indexes-in-background): Indexes can be created in the background to not block queries in the meantime. -- [**Index cache refilling**](../../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): +- [**Index cache refilling**](../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): In-memory index caches are automatically repopulated after writes that affect an edge index or cache-enabled persistent indexes to maximize cache hits and thus query performance. -- [**Extensive Query Optimization**](../../aql/execution-and-performance/query-optimization.md): +- [**Extensive Query Optimization**](../aql/execution-and-performance/query-optimization.md): Late document materialization to only fetch the relevant documents from SORT/LIMIT queries. Early pruning of non-matching documents in full collection scans. Inlining of certain subqueries to improve execution time. <!-- TODO, move to Querying? --> {{% comment %}} Experimental feature in v3.12.4 -- [**Query plan caching**](../../aql/execution-and-performance/caching-query-plans.md) +- [**Query plan caching**](../aql/execution-and-performance/caching-query-plans.md) Reduce the total time for processing queries by avoiding to parse, plan, and optimize the same queries over and over again with an AQL execution plan cache. {{% /comment %}} -- [**Parallel gather**](../../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): +- [**Parallel gather**](../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): Fast, memory-efficient processing of cluster queries by combining results in parallel. ## Extensibility -- [**Microservice Support with ArangoDB Foxx**](../../develop/foxx-microservices/_index.md): +- [**Microservice Support with ArangoDB Foxx**](../develop/foxx-microservices/_index.md): Use ArangoDB as an application server and fuse your application and database together for maximal throughput. With fault-tolerant cluster support. -- [**Server-Side Functions**](../../aql/user-defined-functions.md): +- [**Server-Side Functions**](../aql/user-defined-functions.md): You can extend AQL with user-defined functions written in JavaScript. ## Security -- [**Auditing**](../../operations/security/audit-logging.md): +- [**Auditing**](../operations/security/audit-logging.md): Audit logs of all server interactions. -- [**Encryption at Rest**](../../operations/security/encryption-at-rest.md): +- [**Encryption at Rest**](../operations/security/encryption-at-rest.md): Hardware-accelerated on-disk encryption for your data. -- [**Encrypted Backups**](../../components/tools/arangodump/examples.md#encryption): +- [**Encrypted Backups**](../components/tools/arangodump/examples.md#encryption): Data dumps can be encrypted using a strong 256-bit AES block cipher. -- [**Hot Backups**](../../operations/backup-and-restore.md#hot-backups): +- [**Hot Backups**](../operations/backup-and-restore.md#hot-backups): Consistent, incremental data backups without downtime for single servers and clusters. -- [**Enhanced Data Masking**](../../components/tools/arangodump/maskings.md#masking-functions): +- [**Enhanced Data Masking**](../components/tools/arangodump/maskings.md#masking-functions): Extended data masking capabilities for attributes containing sensitive data / PII when creating backups. - **Advanced Encryption and Security Configuration**: - Key rotation for [JWT secrets](../../develop/http-api/authentication.md#hot-reload-jwt-secrets) - and [on-disk encryption](../../develop/http-api/security.md#encryption-at-rest), - as well as [Server Name Indication (SNI)](../../components/arangodb-server/options.md#--sslserver-name-indication). + Key rotation for [JWT secrets](../develop/http-api/authentication.md#hot-reload-jwt-secrets) + and [on-disk encryption](../develop/http-api/security.md#encryption-at-rest), + as well as [Server Name Indication (SNI)](../components/arangodb-server/options.md#--sslserver-name-indication). -- [**Authentication**](../../operations/administration/user-management/_index.md): +- [**Authentication**](../operations/administration/user-management/_index.md): Built-in user management with password- and token-based authentication. - **Role-based Access Control**: @@ -349,15 +349,15 @@ aliases: microservice framework users can achieve very high security standards fitting individual needs. -- [**TLS Encryption**](../../components/arangodb-server/options.md#ssl): +- [**TLS Encryption**](../components/arangodb-server/options.md#ssl): Internal and external communication over encrypted network connections with TLS (formerly SSL). - [TLS key and certificate rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation) + [TLS key and certificate rotation](../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation) is supported. ## Administration -- [**Web-based User Interface**](../../components/web-interface/_index.md): +- [**Web-based User Interface**](../components/web-interface/_index.md): Graphical UI for your browser to work with ArangoDB. It allows you to view, create, and modify databases, collections, documents, graphs, etc. You can also run, explain, and profile AQL queries. Includes a graph viewer @@ -367,16 +367,16 @@ aliases: View the status of your cluster and its individual nodes, and move and rebalance shards via the web interface. -- **[Backup](../../components/tools/arangodump/_index.md) and [Restore](../../components/tools/arangorestore/_index.md) Tools**: +- **[Backup](../components/tools/arangodump/_index.md) and [Restore](../components/tools/arangorestore/_index.md) Tools**: Multi-threaded dumping and restoring of collection settings and data in JSON format. Data masking capabilities for attributes containing sensitive data / PII when creating backups. -- **[Import](../../components/tools/arangoimport/_index.md) and [Export](../../components/tools/arangoexport/_index.md) Tools**: +- **[Import](../components/tools/arangoimport/_index.md) and [Export](../components/tools/arangoexport/_index.md) Tools**: CLI utilities to load and export data in multiple text-based formats. You can import from JSON, JSONL, CSV, and TSV files, and export to JSON, JSONL, CSV, TSV, XML, and XGMML files. -- [**Metrics**](../../develop/http-api/monitoring/metrics.md): +- [**Metrics**](../develop/http-api/monitoring/metrics.md): Monitor the healthiness and performance of ArangoDB servers using the metrics exported in the Prometheus format. diff --git a/site/content/arangodb/3.13/operations/administration/license-management.md b/site/content/arangodb/3.13/operations/administration/license-management.md index f51a1aeedf..951c08ce85 100644 --- a/site/content/arangodb/3.13/operations/administration/license-management.md +++ b/site/content/arangodb/3.13/operations/administration/license-management.md @@ -9,7 +9,7 @@ aliases: --- The Enterprise Edition of ArangoDB requires a license so that you can use ArangoDB for commercial purposes and have a dataset size over 100 GiB. See -[ArangoDB Editions](../../about/features/_index.md#arangodb-editions) +[ArangoDB Editions](../../features/_index.md#arangodb-editions) for details. How to set a license key and to retrieve information about the current license diff --git a/site/content/arangodb/3.13/about/use-cases.md b/site/content/arangodb/3.13/use-cases.md similarity index 76% rename from site/content/arangodb/3.13/about/use-cases.md rename to site/content/arangodb/3.13/use-cases.md index 0128025595..4bc8b2517e 100644 --- a/site/content/arangodb/3.13/about/use-cases.md +++ b/site/content/arangodb/3.13/use-cases.md @@ -19,7 +19,7 @@ more. ### Fraud Detection -{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Uncover illegal activities by discovering difficult-to-detect patterns. ArangoDB lets you look beyond individual data points in disparate data sources, @@ -29,7 +29,7 @@ complex fraudulent behavior such as fraud rings. ### Recommendation Engine -{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Suggest products, services, and information to users based on data relationships. For example, you can use ArangoDB together with PyTorch Geometric to build a @@ -39,7 +39,7 @@ with a graph neural network (GNN). ### Network Management -{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Reduce downtime by connecting and visualizing network, infrastructure, and code. Network devices and how they interconnect can naturally be modeled as a graph. @@ -49,7 +49,7 @@ bandwidth into account when path-finding. ### Customer 360 -{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Gain a complete understanding of your customers by integrating multiple data sources and code. ArangoDB can act as the platform to merge and consolidate @@ -58,7 +58,7 @@ track data origins using graph features. ### Identity and Access Management -{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Increase security and compliance by managing data access based on role and position. You can map out an organization chart as a graph and use ArangoDB to @@ -68,7 +68,7 @@ inheritance. ### Supply Chain -{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Speed shipments by monitoring and optimizing the flow of goods through a supply chain. You can represent your inventory, supplier, and delivery @@ -84,7 +84,7 @@ and scalable data store. ### Content Management -{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Store information of any kind without upfront schema declaration. ArangoDB is schema-free, storing every data record as a self-contained document, allowing @@ -93,7 +93,7 @@ content management system on top of ArangoDB. ### E-Commerce Systems -{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB combines data modeling freedom with strong consistency and resilience features to power online shops and ordering systems. Handle product catalog data @@ -102,7 +102,7 @@ checkouts with the necessary transactional guarantees. ### Internet of Things -{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Collect sensor readings and other IoT data in ArangoDB for a single view of everything. Store all data points in the same system that also lets you run @@ -110,7 +110,7 @@ aggregation queries using sliding windows for efficient data analysis. ## ArangoDB as a Key-Value Database -{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} Key-value stores are the simplest kind of database systems. Each record is stored as a block of data under a key that uniquely identifies the record. @@ -130,11 +130,11 @@ binary large objects (BLOBs) and works best with small to medium-sized JSON objects. For more information about how ArangoDB persists data, see -[Storage Engine](../components/arangodb-server/storage-engine.md). +[Storage Engine](components/arangodb-server/storage-engine.md). ## ArangoDB as a Search Engine -{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} +{{< image src="../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} ArangoDB has a natively integrated search engine for a broad range of information retrieval needs. It is powered by inverted indexes and can index @@ -148,7 +148,7 @@ It also features natural language processing (NLP) capabilities. and can classify or find similar terms using word embedding models. {{% /comment %}} -For more information about the search engine, see [ArangoSearch](../index-and-search/arangosearch/_index.md). +For more information about the search engine, see [ArangoSearch](index-and-search/arangosearch/_index.md). ## ArangoDB for Machine Learning @@ -161,4 +161,4 @@ ArangoDB integrates well into existing data infrastructures and provides connectors for popular machine learning frameworks and data processing ecosystems. -![Machine Learning Architecture of ArangoDB](../../../images/machine-learning-architecture.png) +![Machine Learning Architecture of ArangoDB](../../images/machine-learning-architecture.png) diff --git a/site/content/arangodb/_index.md b/site/content/arangodb/_index.md index d411197bc9..56103ad6a4 100644 --- a/site/content/arangodb/_index.md +++ b/site/content/arangodb/_index.md @@ -1,9 +1,70 @@ --- -title: Recommended Resources +title: About ArangoDB menuTitle: ArangoDB -weight: 3 -layout: default -# Remove this file because this isn't an actual page? -# With no content below, it shows cards for the version folders... +weight: 5 +description: >- + ArangoDB is a scalable graph database system to drive value from connected + data, faster +aliases: + - introduction + - introduction/about-arangodb --- -## ArangoDB database system \ No newline at end of file +![ArangoDB Overview Diagram](../images/arangodb-overview-diagram.png) + +ArangoDB combines the analytical power of native graphs with an integrated +search engine, JSON support, and a variety of data access patterns via a single, +composable query language. + +ArangoDB is available in a community and a commercial [edition](3.12/features/_index.md). +You can use it for on-premises deployments, as well as a fully managed +cloud service, the [Arango Managed Platform (AMP)](../amp/_index.md). + +## What are Graphs? + +Graphs are information networks composed of nodes and edges. + +![An arrow labeled as "Edge" pointing from one circle to another, both labeled "Node"](../images/data-model-graph-relation-abstract-edge.png) + +A social network is a common example of a graph. People are represented by nodes +and their friendships by relations. + +![Two circles labeled "Mary" and "John", with an arrow labeled "isFriendOf" pointing from "Mary" to "John"](../images/data-model-graph-relation-concrete.png) + +Nodes are also called vertices (singular: vertex), and edges are relations that +connect nodes. +A node typically represents a specific entity (a person, a book, a sensor +reading, etc.) and an edge defines how one entity relates to another. + +![Three circles labeled "Mary", "Book", and "John", with an arrow labeled "bought" from "Mary" to "Book" and an arrow labeled "isFriendOf" from "Mary" to "John"](../images/data-model-graph-relations.png) + +This paradigm of storing data feels natural because it closely matches the +cognitive model of humans. It is an expressive data model that allows you to +represent many problem domains and solve them with semantic queries and graph +analytics. + +## Beyond Graphs + +Not everything is a graph use case. ArangoDB lets you equally work with +structured, semi-structured, and unstructured data in the form of schema-free +JSON objects, without having to connect these objects to form a graph. + +![Person Mary, Book ArangoDB](../images/data-model-document.png) + +Depending on your needs, you may mix graphs and unconnected data. +ArangoDB is designed from the ground up to support multiple data models with a +single, composable query language. + +```aql +FOR book IN Books + FILTER book.title == "Arango" + FOR person IN 2..2 INBOUND book transferred, OUTBOUND knows + RETURN person.name +``` + +ArangoDB also comes with an integrated search engine for information retrieval, +such as full-text search with relevance ranking. + +ArangoDB is written in C++ for high performance and built to work at scale, in +the cloud or on-premises. + +<!-- deployment options, move from features page, on-prem vs cloud? --> From f703f6764c5e2388c2d1e4b46d69490e6bc3fa02 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 16:06:02 +0200 Subject: [PATCH 25/44] Add brand colors as CSS variables --- .../arangodb-docs-theme/static/css/theme.css | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index 58f5604d3a..0f9ee51d9c 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -1,4 +1,45 @@ :root { + + --color-avocado: #044926; + --color-blue-tide: #02245f; + --color-electric-lime: #b9ff38; + --color-night: #151d25; + --color-seaglass: #016f73; + --color-plum: #470878; + --color-leaf-green: #58df20; + --color-meadow: #befe99; + --color-sunbeam: #fffc4e; + --color-mist: #f4f4f4; + --color-slate-blue: #4f6d8b; + --color-evergreen: #007339; + + --neutral-black: #000000; + --neutral-gray-darkest: #323b40; + --neutral-gray-darker: #435057; + --neutral-gray-dark: #576770; + --neutral-gray: #71808a; + --neutral-gray-light: #c2cbd5; + --neutral-gray-lighter: #e9f0f9; + --neutral-gray-lightest: #f7faff; + --neutral-white: #ffffff; + + --state-info: #76e7e7; + --state-info-dark: #006585; + --state-success: #85da66; + --state-success-dark: #3b7044; + --state-warning: #ffec44; + --state-warning-dark: #dc6409; + --state-danger: #dc084b; + --state-danger-dark: #8f001d; + + --font-headlines: "Urbanist", sans-serif; + --font-content: "Inter", sans-serif; + + /* + Rounding? + Icon set? + */ + --green-50: #e3f2e0; --green-100: #dcebd9; --green-200: #98D78C; From d6ee8be68afccbafe9324ced1a0676acf1a01667 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 16:07:44 +0200 Subject: [PATCH 26/44] Use Urbanist font for lead paragraph and card titles --- .../arangodb-docs-theme/static/css/theme.css | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index 0f9ee51d9c..f734513645 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -491,11 +491,11 @@ a.section-link { } .card-title { + font-family: var(--font-headlines); font-weight: 600; text-overflow: ellipsis; overflow: hidden; - font-size: 20px; - line-height: 28px; + font-size: 1.3rem; color: var(--gray-950); } @@ -1373,7 +1373,7 @@ article.notfound { hgroup > h1, article > h2, article > h3, article > h4, article > h5, article > h6 { color: var(--HEADERS-COLOR); - font-family: "Urbanist", sans-serif; + font-family: var(--font-headlines); font-weight: var(--TYPOGRAPHY-BOLD-TEXT); overflow-wrap: break-word; } @@ -1478,8 +1478,9 @@ article ul li { } .lead { - font-size: 1.3em; - margin-bottom: 24px; + font-size: 1.3rem; + font-family: var(--font-headlines); + margin-bottom: 1.5rem; font-weight: 600; color: var(--gray-800); } @@ -1561,14 +1562,14 @@ li > code { .copy-to-clipboard-button::after{ content: 'Copy'; - font-family: 'Inter', sans-serif; + font-family: var(--font-content); padding: 0 5px; font-weight: bold; color: var(--green-700); } .copy-to-clipboard-button.tooltipped::after{ content: 'Copied'; - font-family: 'Inter', sans-serif; + font-family: var(--font-content) padding: 0 5px; font-weight: bold; color: var(--green-700); @@ -1600,7 +1601,7 @@ pre > code { pre > .code-show-more { font-size: 1rem; background: var(--gray-200); - font-family: "Inter", sans-serif; + font-family: var(--font-content); padding: 5px 5px; font-weight: 500; opacity: 0.7; From f26daae5c9cc13afc288048d997874a1f9814a4b Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Tue, 14 Oct 2025 16:08:30 +0200 Subject: [PATCH 27/44] Try electric lime as color for active nav items --- site/themes/arangodb-docs-theme/static/css/theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index f734513645..3650762cd6 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -1053,7 +1053,7 @@ header .logo { .sidebar ul.topics li.active > a > .menu-title, .sidebar ul.topics li.alwaysopen > a > .menu-title { font-weight: 400; - color: var(--green-300); + color: var(--color-electric-lime); } .sidebar ul li li { From 4974ac7418ad3a701f7e6cc9752ba67aa3e96ab6 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 14:46:55 +0200 Subject: [PATCH 28/44] Squashed commit of the following: commit e043896ef9564a0b8a8cb5cd5c29cc4c662ad851 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 23 12:53:43 2025 +0200 Move image, add View node option commit 49fbafa9687703267c3d238480746513f4c32b45 Merge: d6f3359c cdd39d59 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 23 10:13:04 2025 +0200 Merge branch 'main' of https://github.com/arangodb/docs-hugo into DOC-799 commit d6f3359cc5b4e20d3bdf627701a33a2148ec2057 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 23 10:12:58 2025 +0200 Review feedback, mention that nodes, edges, and theming is remembered commit cdd39d59b88f6db48f9d82b905238b88bb2375c4 Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 15:29:13 2025 +0200 Toolchain: Set go version for arangoproxy to 1.24.0 The trailing .0 unbreaks builds for Vadim commit 976bf21f08dd69ccab4b703e0cae9b66b4b1c8d8 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 15:25:16 2025 +0200 Vector index no longer experimental (#803) * Vector index no longer experimental * Rename startup option * Mention previous startup option name in release notes commit 311dee37a09ccaa5adb49c9a38bc491cfeb167c5 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 15:15:34 2025 +0200 DOC-816 | Deduced vertex collections from named graphs (#799) * Release notes * Fix typo * Remove mention of vertexCollections and add section about graph queries in cluster for path searches * Modify release notes example * Fix/unify examples commit c2609c781cacee599951b1f90a34d79e745c6efb Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 15:07:29 2025 +0200 Vector indexes support filtering (#791) commit 4b7ab179c7ad28c7c5529015cf15634f5e97be5c Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 15:02:22 2025 +0200 Unexpected Content-Length headers or invalid URLs report errors instead of closing connections (#795) commit 57056a09307d3de8daf6b0feb55f1b618ec00761 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:54:05 2025 +0200 DOC-805 | Extended memory accounting: COLLECT and MERGE() (#808) * Release notes for improved memory accounting: MERGE(), RETURN DISTINCT, and certain COLLECT operations * Mention already merged tracking features of internal buffers * Mention execution block tracking commit 7efadc390d97185e36c1770575687f132dec08a0 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:22:40 2025 +0200 Release notes for @PID@ and @TEMP_BASE_DIR@ startup option placeholders (#790) commit 3a78aec5d26f58c1058a322d1d5d2c5c723fec9c Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:21:53 2025 +0200 RocksDB upgrade to 9.5.0 release notes (#710) * WIP: RocksDB upgrade to 9.5.0 release notes * Throttling wasn't changed * Apply to 3.13 * Clarify units * Some RocksDB startup option defaults have been reverted * Fix merge error * Fix merge mistake --------- Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> commit d596f51d616abbd909c7632f960467e150628442 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:13:31 2025 +0200 Sparse vector indexes (#770) * Vector index type now supports sparse option * Use same wording for sparse HTTP API docs, replace hash with persistent index, fix statements about estimates --------- Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> commit 3de2dbfa4e3564de24d8868d8b368e0f71b9003f Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:10:36 2025 +0200 Release notes about deprecation of --rocksdb.transaction-lock-timeout startup option (#762) Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> commit 73428ea3272893839a4112a6cf30d93221efb9c2 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:09:39 2025 +0200 DOC-776 | AQL query recording (#735) * AQL query recording API * Fix text about startup option, add more status codes * Rework release notes, adjust attribute names * Fix copy-paste mistake * Per Coordinator recording in clusters * fix merge error --------- Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> Co-authored-by: Paula <paula.mihu@arangodb.com> commit 85de2a392eec3ade8b5c59a36820ab91c2eb19ff Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:08:47 2025 +0200 DOC-772 | `GEO_POINT()` accepts elevation but z coordinate is ignored in geo functions / validation of points in `GEO_MULTIPOINT()` and `GEO_(MULTI_)LINESTRING` (#733) * GEO_POINT() accepts elevation but z coordinate is ignored in geo functions * Add more details * Add introduced in 3.11 * Add release notes about point validation in AQL GeoJSON functions * Fix order --------- Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> commit 9cc6d8159bde3138987f4635d3d4485e6f37c767 Author: Simran <Simran-B@users.noreply.github.com> Date: Wed Oct 22 14:05:25 2025 +0200 DOC-765 | Cosine similarity fix for vector indexes (#719) * Initial reference docs about the vector index * HTTP API docs and refinements * Version remark, OpenAPI minItems/maxItems and fix a type * inBackground and parallelism are supported * Review feedback, address cosine metric issue, reword inBackground, add parallelism * Remove leftover line * Add internal links to release notes * Cosine similarity value out of range has been fixed * Add innerProduct metric --------- Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> commit 4f7090eb4862c9fc3de1b48be95e4f1d45258926 Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 14:04:12 2025 +0200 Toolchain: Set lower 1.24 Go version as minimum for arangoproxy Go 1.25 is only available in alpine:edge at the moment commit 6594ebc7c129b027e9bb247232e4ebb92f83d649 Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 13:25:11 2025 +0200 Fix path for icon shortcode commit c12be470dbcf952e6a3ba0b07af11e5c5304fd1a Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 13:17:25 2025 +0200 Review feedback commit 14003ceb9b0373feb61a6a173c66ac873bc5ba09 Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 13:14:53 2025 +0200 Change icon shortcode image path commit 1fc696fc00c87daae08ed3488923908407416cec Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 21 23:23:28 2025 +0200 Icons: Move settings icon to the canvas center commit 9b3b338beb176efc81badfe73db89f9d9dfa7879 Author: Michele Rastelli <michele@arangodb.com> Date: Tue Oct 14 16:49:33 2025 +0200 updated ArangoDB Tinkerpop Provider limitations (#806) commit cc2db4dd5912a01901e8a6db6741bc0458a86d82 Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 16:13:52 2025 +0200 Fix edge styling options commit 4492cf61d4da567d594de9c26e5326c3767f83ec Author: Michele Rastelli <michele@arangodb.com> Date: Tue Oct 14 15:53:54 2025 +0200 [DE-1040] ArangoDB Tinkerpop Provider: initial documentation (#750) * ArangoDB Tinkerpop Provider: initial documentation * fixed links * review * updated GraphFeatures * doc: gremlin console (DE-1062) * doc: gremlin server (DE-1061) * updated tinkerpop version to 3.7.4 * doc: fix complex id format * removed collection name prefix restriction * configurable label field name (DE-1070) * query optimizations * review; add content to all versions * keep vertex instead of node to align with tinkerpop concepts and terminology --------- Co-authored-by: Paula Mihu <97217318+nerpaula@users.noreply.github.com> Co-authored-by: Paula <paula.mihu@arangodb.com> commit c38b58e7ac4aabe9151be286d37c43c0f51319c0 Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 15:49:27 2025 +0200 Minor fixes commit f1600ef528a8d038037e8cdcd93c6166f23db9d2 Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 15:36:28 2025 +0200 Update visual customization part commit 144f44d80a89ff6436ee50a598b7b6695d61470d Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 15:36:02 2025 +0200 Extend README for icon shortcode commit 22d82c8ed21b251a07839bd6237ed2f9ed1d6e6f Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 11:37:39 2025 +0200 Rename icon files and mention icon shortcode to README commit 62860ef73a08efc9e97072d5549236485905295e Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 11:00:24 2025 +0200 DOC-813 | Implement icon shortcode and add Graph Visualizer icons commit 0f718a1512c149ccbe5a02709b23308fa3c9db7a Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 10:59:15 2025 +0200 Update descriptions commit 5ee3e0dfd451fb9da480703db571d4b59c2b6aac Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 10:22:55 2025 +0200 Update customization screenshot commit 4d61a71ef25a0d971f4434838e17edef0d000ba1 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 9 12:39:09 2025 +0200 Icon shortcode prototype commit c595f250cb05fcf2b0070b0700f67e7a2f122d01 Merge: 155a71a0 8a3c37dd Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 9 10:27:01 2025 +0200 Merge branch 'main' of https://github.com/arangodb/docs-hugo into DOC-799 commit 155a71a053be48a63b83271f92304055e9b715ed Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 9 10:26:51 2025 +0200 Update Visualizer screenshots commit 8a3c37dd3e84311bac536d064aca6ac7c66f564e Author: Paula Mihu <97217318+nerpaula@users.noreply.github.com> Date: Tue Oct 7 16:06:14 2025 +0200 OAS-11485 | Add warning regarding single server upgrade to cluster in ArangoGraph (#798) * add warning regarding single server upgrade to cluster * apply to 3.11 as well commit a570281d2c91207580ceae8e6a7b491964ee82ba Author: Paula Mihu <97217318+nerpaula@users.noreply.github.com> Date: Tue Oct 7 16:03:49 2025 +0200 move gae content into genai chapter (#796) commit 1f925ce359ae4fc9596b117e6048363f14b2d47c Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 2 09:55:57 2025 +0200 WIP --- README.md | 19 + site/content/amp/deployments/_index.md | 21 +- .../guides/authentication-and-sessions.md | 4 +- .../indexing/index-utilization.md | 5 +- .../3.11/data-science/graph-analytics.md | 716 --------------- .../guides/authentication-and-sessions.md | 4 +- .../3.11/develop/http-api/indexes/_index.md | 4 +- .../3.11/develop/integrations/_index.md | 9 + .../indexing/index-utilization.md | 5 +- .../arangodb/3.12/aql/functions/geo.md | 213 +++-- .../arangodb/3.12/aql/functions/vector.md | 118 ++- .../3.12/aql/graphs/all-shortest-paths.md | 50 ++ .../arangodb/3.12/aql/graphs/k-paths.md | 51 ++ .../3.12/aql/graphs/k-shortest-paths.md | 51 ++ .../arangodb/3.12/aql/graphs/shortest-path.md | 48 + .../arangodb/3.12/aql/graphs/traversals.md | 47 +- .../3.12/develop/http-api/indexes/_index.md | 4 +- .../http-api/indexes/multi-dimensional.md | 5 +- .../develop/http-api/indexes/persistent.md | 5 +- .../3.12/develop/http-api/indexes/vector.md | 20 +- .../3.12/develop/http-api/monitoring/logs.md | 246 ++++- .../3.12/develop/integrations/_index.md | 9 + .../arangodb-tinkerpop-provider.md | 841 ++++++++++++++++++ site/content/arangodb/3.12/features/list.md | 2 - .../indexing/which-index-to-use-when.md | 26 +- .../working-with-indexes/vector-indexes.md | 41 +- .../version-3.12/api-changes-in-3-12.md | 15 +- .../incompatible-changes-in-3-12.md | 89 ++ .../version-3.12/whats-new-in-3-12.md | 211 ++++- .../arangodb/3.13/aql/functions/geo.md | 213 +++-- .../arangodb/3.13/aql/functions/vector.md | 118 ++- .../3.13/aql/graphs/all-shortest-paths.md | 52 ++ .../arangodb/3.13/aql/graphs/k-paths.md | 53 ++ .../3.13/aql/graphs/k-shortest-paths.md | 53 ++ .../arangodb/3.13/aql/graphs/shortest-path.md | 50 ++ .../arangodb/3.13/aql/graphs/traversals.md | 55 +- .../arangodb/3.13/components/platform.md | 247 ----- site/content/arangodb/3.13/deploy/_index.md | 2 +- .../http-api/indexes/multi-dimensional.md | 5 +- .../develop/http-api/indexes/persistent.md | 5 +- .../3.13/develop/http-api/indexes/vector.md | 20 +- .../3.13/develop/http-api/monitoring/logs.md | 246 ++++- .../arangodb-tinkerpop-provider.md | 841 ++++++++++++++++++ site/content/arangodb/3.13/features/list.md | 2 - .../indexing/which-index-to-use-when.md | 26 +- .../working-with-indexes/vector-indexes.md | 38 +- .../version-3.12/api-changes-in-3-12.md | 15 +- .../incompatible-changes-in-3-12.md | 89 ++ .../version-3.12/whats-new-in-3-12.md | 211 ++++- .../content/data-platform/graph-visualizer.md | 308 +++++-- site/content/gen-ai/graph-analytics.md | 40 +- site/content/gen-ai/graph-to-ai.md | 12 +- .../images/graph-visualizer-add-nodes.png | Bin 26034 -> 28310 bytes .../images/graph-visualizer-create-edge.png | Bin 8632 -> 10029 bytes .../images/graph-visualizer-customization.png | Bin 17314 -> 17394 bytes .../graph-visualizer-menu-canvas-action.png | Bin 11317 -> 15060 bytes .../graph-visualizer-node-properties.png | Bin 19492 -> 20966 bytes .../images/graph-visualizer-queries.png | Bin 17781 -> 16054 bytes site/content/images/graph-visualizer.png | Bin 151576 -> 158120 bytes site/content/images/icons/caret-left.svg | 1 + site/content/images/icons/caret-right.svg | 1 + site/content/images/icons/clear.svg | 1 + site/content/images/icons/delete.svg | 1 + site/content/images/icons/download.svg | 1 + site/content/images/icons/duplicate.svg | 1 + site/content/images/icons/edit-square.svg | 1 + site/content/images/icons/edit.svg | 1 + site/content/images/icons/fit.svg | 1 + site/content/images/icons/rerun.svg | 1 + site/content/images/icons/reset-all.svg | 1 + site/content/images/icons/reset.svg | 1 + site/content/images/icons/run.svg | 1 + site/content/images/icons/save.svg | 1 + site/content/images/icons/select-all.svg | 1 + site/content/images/icons/settings.svg | 3 + site/content/images/icons/sort-by.svg | 1 + site/content/images/icons/swap.svg | 1 + site/content/images/icons/zoom-in.svg | 1 + site/content/images/icons/zoom-out.svg | 1 + .../layouts/shortcodes/icon.html | 10 + .../arangodb-docs-theme/static/css/theme.css | 13 + toolchain/arangoproxy/go.mod | 2 +- 82 files changed, 4200 insertions(+), 1427 deletions(-) delete mode 100644 site/content/arangodb/3.11/data-science/graph-analytics.md create mode 100644 site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md delete mode 100644 site/content/arangodb/3.13/components/platform.md create mode 100644 site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md create mode 100644 site/content/images/icons/caret-left.svg create mode 100644 site/content/images/icons/caret-right.svg create mode 100644 site/content/images/icons/clear.svg create mode 100644 site/content/images/icons/delete.svg create mode 100644 site/content/images/icons/download.svg create mode 100644 site/content/images/icons/duplicate.svg create mode 100644 site/content/images/icons/edit-square.svg create mode 100644 site/content/images/icons/edit.svg create mode 100644 site/content/images/icons/fit.svg create mode 100644 site/content/images/icons/rerun.svg create mode 100644 site/content/images/icons/reset-all.svg create mode 100644 site/content/images/icons/reset.svg create mode 100644 site/content/images/icons/run.svg create mode 100644 site/content/images/icons/save.svg create mode 100644 site/content/images/icons/select-all.svg create mode 100644 site/content/images/icons/settings.svg create mode 100644 site/content/images/icons/sort-by.svg create mode 100644 site/content/images/icons/swap.svg create mode 100644 site/content/images/icons/zoom-in.svg create mode 100644 site/content/images/icons/zoom-out.svg create mode 100644 site/themes/arangodb-docs-theme/layouts/shortcodes/icon.html diff --git a/README.md b/README.md index 530c4c1c7e..1df0c38a87 100644 --- a/README.md +++ b/README.md @@ -429,6 +429,25 @@ Available attributes: - `class`: CSS classes to apply - `style`: CSS inline styles to apply +#### Icons + +If a web interface uses icons, especially as buttons without labels, use +the `icon` shortcode to inline an SVG file for a visual reference as +demonstrated below: + +```markdown +Select all nodes ({{< icon "select-all" >}}), then right-click. +``` + +Icons are supposed to supplement the text, i.e. not be embedded in sentences. +They are hidden from screen readers. + +To add new icons to the toolchain, save them to `site/content/images/icons/`. +They are referenced by file name (without extension) in the shortcode. + +SVG icon files should not define the attributes `width`, `height`, `aria-hidden`, +and `focusable` on the `<svg>` tag. + #### Keyboard shortcuts To document hotkeys and key combinations to press in a terminal or graphical diff --git a/site/content/amp/deployments/_index.md b/site/content/amp/deployments/_index.md index b518164516..3c9f76d3b1 100644 --- a/site/content/amp/deployments/_index.md +++ b/site/content/amp/deployments/_index.md @@ -237,6 +237,11 @@ attached to your role. Read more about [roles and permissions](../security-and-a - Change the deployment name - Change the deployment description 4. In the **Sizing** section, you can do the following: + + {{< tip >}} + Before changing deployment models, especially from **Single Server** to clustered configurations, + consider creating a backup of your data. + {{< /tip >}} - Change **OneShard** deployments into **Sharded** deployments. To do so, select **Sharded** in the **Model** dropdown list. You can select the number of nodes for your deployment. This can also be modified later on. @@ -245,7 +250,12 @@ attached to your role. Read more about [roles and permissions](../security-and-a {{< /warning >}} - Change **Single Server** deployments into **OneShard** or **Sharded** deployments. {{< warning >}} - You cannot switch from **Sharded** or **OneShard** back to **Single Server**. + **Important considerations for Single Server upgrades:** + - You cannot switch from **Sharded** or **OneShard** back to **Single Server**. + - Changing **Single Server** deployments into **OneShard** or **Sharded** deployments + will cause downtime and may take a considerable amount of time to complete. Plan this switch + during a maintenance window when your application can tolerate service interruption. + Your data remains safe throughout the process. {{< /warning >}} - Scale up or down the node size. {{< warning >}} @@ -284,6 +294,15 @@ application has to handle connection failures by retrying operations if needed. ## How to pause a deployment +1. In the __Deployments__ page, click the deployment you wish to pause. +2. Click the __Delete/Lock__ entry in the navigation. +3. Click the __Pause deployment...__ button. +4. To resume the deployment, go to the __Overview__ tab and click __Resume deployment__. The + deployment being paused displays the __Hibernated__ status until it has been + successfully resumed. + +## How to pause a deployment + 1. In the __Deployments__ page, click the deployment you wish to pause. 2. Click the __Delete/Lock__ entry in the navigation. 3. Click the __Pause deployment...__ button. diff --git a/site/content/arangodb/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md index 2307728d20..9b77d01f3e 100644 --- a/site/content/arangodb/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md +++ b/site/content/arangodb/3.10/develop/foxx-microservices/guides/authentication-and-sessions.md @@ -23,7 +23,7 @@ authentication. In this example we'll use two collections: a `users` collection to store the user objects with names and credentials, and a `sessions` collection to store the session data. We'll also make sure usernames are unique -by adding a hash index: +by adding a `persistent` index: ```js "use strict"; @@ -37,7 +37,7 @@ if (!db._collection(sessions)) { db._createDocumentCollection(sessions); } module.context.collection("users").ensureIndex({ - type: "hash", + type: "persistent", unique: true, fields: ["username"] }); diff --git a/site/content/arangodb/3.10/index-and-search/indexing/index-utilization.md b/site/content/arangodb/3.10/index-and-search/indexing/index-utilization.md index c6d239b7ef..46a4592bb0 100644 --- a/site/content/arangodb/3.10/index-and-search/indexing/index-utilization.md +++ b/site/content/arangodb/3.10/index-and-search/indexing/index-utilization.md @@ -19,8 +19,9 @@ It is often beneficial to create an index on more than just one attribute. By ad to an index, an index can become more selective and thus reduce the number of documents that queries need to process. -ArangoDB's primary indexes, edges indexes and hash indexes will automatically provide selectivity -estimates. Index selectivity estimates are provided in the web interface, the `indexes()` return +ArangoDB's `primary` and `edge` indexes automatically provide selectivity estimates. +The `persistent`, `mdi`, and `mdi-prefixed` indexes do too, by default. +Index selectivity estimates are provided in the web interface, the `indexes()` return value and in the `explain()` output for a given query. The more selective an index is, the more documents it will filter on average. The index selectivity diff --git a/site/content/arangodb/3.11/data-science/graph-analytics.md b/site/content/arangodb/3.11/data-science/graph-analytics.md deleted file mode 100644 index dca26ae758..0000000000 --- a/site/content/arangodb/3.11/data-science/graph-analytics.md +++ /dev/null @@ -1,716 +0,0 @@ ---- -title: Graph Analytics -menuTitle: Graph Analytics -weight: 123 -description: | - ArangoGraph offers Graph Analytics Engines to run graph algorithms on your - data separately from your ArangoDB deployments ---- -Graph analytics is a branch of data science that deals with analyzing information -networks known as graphs, and extracting information from the data relationships. -It ranges from basic measures that characterize graphs, over PageRank, to complex -algorithms. Common use cases include fraud detection, recommender systems, -and network flow analysis. - -ArangoDB offers a feature for running algorithms on your graph data, -called Graph Analytics Engines (GAEs). It is available on request for the -[ArangoGraph Insights Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). - -Key features: - -- **Separation of storage and compute**: GAEs are a solution that lets you run - graph analytics independent of your ArangoDB deployments on dedicated machines - optimized for compute tasks. This separation of OLAP and OLTP workloads avoids - affecting the performance of the transaction-oriented database systems. - -- **Fast data loading**: You can easily and efficiently import graph data from - ArangoDB and export results back to ArangoDB. - -- **In-memory processing**: All imported data is held and processed in the - main memory of the compute machines for very fast execution of graph algorithms - such as connected components, label propagation, and PageRank. - -## Workflow - -The following lists outlines how you can use Graph Analytics Engines (GAEs). -How to perform the steps is detailed in the subsequent sections. - -{{< info >}} -Before you can use Graph Analytics Engines, you need to request the feature -via __Request help__ in the ArangoGraph dashboard for a deployment. - -The deployment needs to use **AWS** as the cloud provider. - -Single server deployments using ArangoDB version 3.11 are not supported. -{{< /info >}} - -1. Determine the approximate size of the data that you will load into the GAE - to select an engine size with sufficient memory. The data as well as the - temporarily needed space for computations and results needs to fit in memory. -2. Deploy an engine of the desired size and of type `gral`. It only takes a few - seconds until the engine can be used. The engine runs adjacent to a particular - ArangoGraph deployment. -3. Load graph data from ArangoDB into the engine. You can load named graphs or - sets of vertex and edge collections. This loads the edge information and a - configurable subset of the vertex attributes. -4. Run graph algorithms on the data. You only need to load the data once per - engine and can then run various algorithms with different settings. -5. Write the computation results back to ArangoDB. -6. Delete the engine once you are done. - -## Authentication - -The [Management API](#management-api) for deploying and deleting engines requires -an ArangoGraph **API key**. See -[Generating an API Key](../../../amp/api/get-started.md#generating-an-api-key) -on how to create one. - -You then need to generate an **access token** using the API key. See -[Authenticating with Oasisctl](../../../amp/api/get-started.md#authenticating-with-oasisctl) -on how to do so using `oasisctl login`. - -The [Engine API](#engine-api) uses one of two authentication methods, depending -on the [__auto login to database UI__](../../../amp/deployments/_index.md#auto-login-to-database-ui) -setting in ArangoGraph: -- **Enabled**: You can use an ArangoGraph access token created with an API key - (see above), allowing you to use one token for both the Management API and - the Engine API. -- **Disabled**: You need use a JWT user token created from ArangoDB credentials. - These session tokens need to be renewed every hour by default. See - [HTTP API Authentication](../develop/http-api/authentication.md#jwt-user-tokens) - for details. - -## Management API - -You can save an ArangoGraph access token created with `oasisctl login` in a -variable to ease scripting. Note that this should be the token string only and -not include quote marks. The following examples assume Bash as the shell and -that the `curl` and `jq` commands are available. - -```bash -ARANGO_GRAPH_TOKEN="$(oasisctl login --key-id "<AG_KEY_ID>" --key-secret "<AG_KEY_SECRET>")" -``` - -To determine the base URL of the management API, use the ArangoGraph dashboard -and copy the __APPLICATION ENDPOINT__ of the deployment that holds the graph data -you want to analyze. Replace the port with `8829` and append -`/graph-analytics/api/graphanalytics/v1`, e.g. -`https://123456abcdef.arangodb.cloud:8829/graph-analytics/api/graphanalytics/v1`. - -Store the base URL in a variable called `BASE_URL`: - -```bash -BASE_URL='https://...' -``` - -To authenticate requests, you need to use the following HTTP header: - -``` -Authorization: bearer <ARANGO_GRAPH_TOKEN> -``` - -For example, with cURL and using the token variable: - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/api-version" -``` - -Request and response payloads are JSON-encoded in the management API. - -### Get the API version - -`GET <BASE_URL>/api-version` - -Retrieve the version information of the management API. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/api-version" -``` - -### List engine sizes - -`GET <BASE_URL>/enginesizes` - -List the available engine sizes, which is a combination of the number of cores -and the size of the RAM, starting at 1 CPU and 4 GiB of memory (`e4`). - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/enginesizes" -``` - -### List engine types - -`GET <BASE_URL>/enginetypes` - -List the available engine types. The only type supported for GAE workloads is -called `gral`. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/enginetypes" -``` - -### Deploy an engine - -`POST <BASE_URL>/engines` - -Set up a GAE adjacent to the ArangoGraph deployment, for example, using an -engine size of `e4`. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" -X POST -d '{"type_id":"gral","size_id":"e4"}' "$BASE_URL/engines" -``` - -### List all engines - -`GET <BASE_URL>/engines` - -List all deployed GAEs of a ArangoGraph deployment. - -```bash -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/engines" -``` - -### Get an engine - -`GET <BASE_URL>/engines/<ENGINE_ID>` - -List the detailed information about a specific GAE. - -```bash -ENGINE_ID="zYxWvU9876" -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" "$BASE_URL/engines/$ENGINE_ID" -``` - -### Delete an engine - -`DELETE <BASE_URL>/engines/<ENGINE_ID>` - -Delete a no longer needed GAE, freeing any data it holds in memory. - -```bash -ENGINE_ID="zYxWvU9876" -curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" -X DELETE "$BASE_URL/engines/$ENGINE_ID" -``` - -## Engine API - -To determine the base URL of the engine API, use the ArangoGraph dashboard -and copy the __APPLICATION ENDPOINT__ of the deployment that holds the graph data -you want to analyze. Replace the port with `8829` and append -`/graph-analytics/engines/<ENGINE_ID>`, e.g. -`https://<123456abcdef>.arangodb.cloud:8829/graph-analytics/engines/zYxWvU9876`. - -Store the base URL in a variable called `ENGINE_URL`: - -```bash -ENGINE_URL='https://...' -``` - -To authenticate requests, you need to use a bearer token in HTTP header: -``` -Authorization: bearer <TOKEN> -``` - -- If __Auto login to database UI__ is enabled for the ArangoGraph deployment, - this can be the same access token as used for the management API. -- If it is disabled, use an ArangoDB session token (JWT user token) instead. - -You can save the token in a variable to ease scripting. Note that this should be -the token string only and not include quote marks. The following examples assume -Bash as the shell and that the `curl` and `jq` commands are available. - -An example of authenticating a request using cURL and a session token: - -```bash -APPLICATION_ENDPOINT="https://123456abcdef.arangodb.cloud:8529" - -ADB_TOKEN=$(curl -X POST -d "{\"username\":\"<ADB_USER>\",\"password\":\"<ADB_PASS>\"}" "$APPLICATION_ENDPOINT/_open/auth" | jq -r '.jwt') - -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs" -``` - -All requests to the engine API start jobs, each representing an operation. -You can check the progress of operations and check if errors occurred. -You can submit jobs concurrently and they also run concurrently. - -You can find the API reference documentation with detailed descriptions of the -request and response data structures at <https://arangodb.github.io/graph-analytics>. - -Request and response payloads are JSON-encoded in the engine API. - -### Load data - -`POST <ENGINE_URL>/v1/loaddata` - -Import graph data from a database of the ArangoDB deployment. You can import -named graphs as well as sets of vertex and edge collections (see -[Managed and unmanaged graphs](../graphs/_index.md#managed-and-unmanaged-graphs)). - -```bash -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d '{"database":"_system","graph_name":"connectedComponentsGraph"}' "$ENGINE_URL/v1/loaddata" -``` - -### Run algorithms - -#### PageRank - -`POST <ENGINE_URL>/v1/pagerank` - -PageRank is a well known algorithm to rank vertices in a graph: the more -important a vertex, the higher rank it gets. It goes back to L. Page and S. Brin's -[paper](http://infolab.stanford.edu/pub/papers/google.pdf) and -is used to rank pages in in search engines (hence the name). The algorithm runs -until the execution converges. To run for a fixed number of iterations, use the -`maximum_supersteps` parameter. - -The rank of a vertex is a positive real number. The algorithm starts with every -vertex having the same rank (one divided by the number of vertices) and sends its -rank to its out-neighbors. The computation proceeds in iterations. In each iteration, -the new rank is computed according to the formula -`( (1 - damping_factor) / total number of vertices) + (damping_factor * the sum of all incoming ranks)`. -The value sent to each of the out-neighbors is the new rank divided by the number -of those neighbors, thus every out-neighbor gets the same part of the new rank. - -The algorithm stops when at least one of the two conditions is satisfied: -- The maximum number of iterations is reached. This is the same `maximum_supersteps` - parameter as for the other algorithms. -- Every vertex changes its rank in the last iteration by less than a certain - threshold. The threshold is hardcoded to `0.0000001`. - -It is possible to specify an initial distribution for the vertex documents in -your graph. To define these seed ranks / centralities, you can specify a -`seeding_attribute` in the properties for this algorithm. If the specified field is -set on a document _and_ the value is numeric, then it is used instead of -the default initial rank of `1 / numVertices`. - -Parameters: -- `graph_id` -- `damping_factor` -- `maximum_supersteps` -- `seeding_attribute` (optional, for seeded PageRank) - -Result: the rank of each vertex - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"damping_factor\":0.85,\"maximum_supersteps\":500,\"seeding_attribute\":\"seed_attr\"}" "$ENGINE_URL/v1/pagerank" -``` - -{{< comment >}} Not merged yet -#### Single-Source Shortest Path (SSSP) - -`POST <ENGINE_URL>/v1/single_source_shortest_path` - -The algorithm computes the shortest path from a given source vertex to all other -vertices and returns the length of this path (distance). The algorithm returns a -distance of `-1` for a vertex that cannot be reached from the source, and `0` -for the source vertex itself. - -Parameters: -- `graph_id` -- `source_vertex`: The document ID of the source vertex. -- `undirected`: Determines whether the algorithm respects the direction of edges. - -Result: the distance of each vertex to the `source_vertex` - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"source_vertex\":\"vertex/345\",\"undirected\":false}" "$ENGINE_URL/v1/single_source_shortest_path" -``` -{{< /comment >}} - -#### Weakly Connected Components (WCC) - -`POST <ENGINE_URL>/v1/wcc` - -The weakly connected component algorithm partitions a graph into maximal groups -of vertices, so that within a group, all vertices are reachable from each vertex -by following the edges, ignoring their direction. - -In other words, each weakly connected component is a maximal subgraph such that -there is a path between each pair of vertices where one can also follow edges -against their direction in a directed graph. - -Parameters: -- `graph_id` - -Result: a component ID for each vertex. All vertices from the same component -obtain the same component ID, every two vertices from different components -obtain different IDs. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID}" "$ENGINE_URL/v1/wcc" -``` - -#### Strongly Connected Components (SCC) - -`POST <ENGINE_URL>/v1/scc` - -The strongly connected components algorithm partitions a graph into maximal -groups of vertices, so that within a group, all vertices are reachable from each -vertex by following the edges in their direction. - -In other words, a strongly connected component is a maximal subgraph, where for -every two vertices, there is a path from one of them to the other, forming a -cycle. In contrast to a weakly connected component, one cannot follow edges -against their direction. - -Parameters: - -- `graph_id` - -Result: a component ID for each vertex. All vertices from the same component -obtain the same component ID, every two vertices from different components -obtain different IDs. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID}" "$ENGINE_URL/v1/scc" -``` - -#### Vertex Centrality - -Centrality measures help identify the most important vertices in a graph. -They can be used in a wide range of applications: -to identify influencers in social networks, or middlemen in terrorist -networks. - -There are various definitions for centrality, the simplest one being the -vertex degree. These definitions were not designed with scalability in mind. -It is probably impossible to discover an efficient algorithm which computes -them in a distributed way. Fortunately there are scalable substitutions -available, which should be equally usable for most use cases. - -![Illustration of an execution of different centrality measures (Freeman 1977)](../../../images/centrality_visual.png) - -##### Betweenness Centrality - -`POST <ENGINE_URL>/v1/betweennesscentrality` - -A relatively expensive algorithm with complexity `O(V*E)` where `V` is the -number of vertices and `E` is the number of edges in the graph. - -Betweenness-centrality can be approximated by cheaper algorithms like -Line Rank but this algorithm strives to compute accurate centrality measures. - -Parameters: -- `graph_id` -- `k` (number of start vertices, 0 = all) -- `undirected` -- `normalized` -- `parallelism` - -Result: a centrality measure for each vertex - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"k\":0,\"undirected\":false,\"normalized\":true}" "$ENGINE_URL/v1/betweennesscentrality" -``` - -{{< comment >}} Not merged yet -##### Effective Closeness - -A common definitions of centrality is the **closeness centrality** -(or closeness). The closeness of a vertex in a graph is the inverse average -length of the shortest path between the vertex and all other vertices. -For vertices *x*, *y* and shortest distance `d(y, x)` it is defined as: - -![Vertex Closeness Formula](../../../images/closeness.png) - -Effective Closeness approximates the closeness measure. The algorithm works by -iteratively estimating the number of shortest paths passing through each vertex. -The score approximates the real closeness score, since it is not possible -to actually count all shortest paths due to the horrendous `O(n^2 * d)` memory -requirements. The algorithm is from the paper -*Centralities in Large Networks: Algorithms and Observations (U Kang et.al. 2011)*. - -ArangoDBs implementation approximates the number of shortest paths in each -iteration by using a HyperLogLog counter with 64 buckets. This should work well -on large graphs and on smaller ones as well. The memory requirements should be -**O(n * d)** where *n* is the number of vertices and *d* the diameter of your -graph. Each vertex stores a counter for each iteration of the algorithm. - -Parameters: -- `graph_id` -- `undirected`: Whether to ignore the direction of edges -- `maximum_supersteps` - -Result: a closeness measure for each vertex - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"undirected\":false,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/effectivecloseness" -``` -{{< /comment >}} - -##### LineRank - -`POST <ENGINE_URL>/v1/linerank` - -Another common measure is the [*betweenness* centrality](https://en.wikipedia.org/wiki/Betweenness_centrality): -It measures the number of times a vertex is part of shortest paths between any -pairs of vertices. For a vertex *v* betweenness is defined as: - -![Vertex Betweenness Formula](../../../images/betweenness.png) - -Where the σ represents the number of shortest paths between *x* and *y*, -and σ(v) represents the number of paths also passing through a vertex *v*. -By intuition a vertex with higher betweenness centrality has more -information passing through it. - -**LineRank** approximates the random walk betweenness of every vertex in a -graph. This is the probability that someone, starting on an arbitrary vertex, -visits this node when they randomly choose edges to visit. - -The algorithm essentially builds a line graph out of your graph -(switches the vertices and edges), and then computes a score similar to PageRank. -This can be considered a scalable equivalent to vertex betweenness, which can -be executed distributedly in ArangoDB. The algorithm is from the paper -*Centralities in Large Networks: Algorithms and Observations (U Kang et.al. 2011)*. - -Parameters: -- `graph_id` -- `damping_factor` -- `maximum_supersteps` - -Result: the line rank of each vertex - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"damping_factor\":0.0000001,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/linerank" -``` - -#### Community Detection - -Graphs based on real world networks often have a community structure. -This means it is possible to find groups of vertices such that each vertex -group is internally more densely connected than outside the group. -This has many applications when you want to analyze your networks, for example -Social networks include community groups (the origin of the term, in fact) -based on common location, interests, occupation, etc. - -##### Label Propagation - -`POST <ENGINE_URL>/v1/labelpropagation` - -[*Label Propagation*](https://arxiv.org/pdf/0709.2938) can be used to implement -community detection on large graphs. - -The algorithm assigns an initial community identifier to every vertex in the -graph using a user-defined attribute. The idea is that each vertex should be in -the community that most of its neighbors are in at the end of the computation. - -In each iteration of the computation, a vertex sends its current community ID to -all its neighbor vertices, inbound and outbound (ignoring edge directions). -After that, each vertex adopts the community ID it received most frequently in -the last step. - -It can happen that a vertex receives multiple most frequent community IDs. -In this case, one is chosen either randomly or using a deterministic choice -depending on a setting for the algorithm. The rules for a deterministic tiebreak -are as follows: -- If a vertex obtains only one community ID and the ID of the vertex from the - previous step, its old ID, is less than the obtained ID, the old ID is kept. -- If a vertex obtains more than one ID, its new ID is the lowest ID among the - most frequently obtained IDs. For example, if the initial IDs are numbers and - the obtained IDs are 1, 2, 2, 3, 3, then 2 is the new ID. -- If, however, no ID arrives more than once, the new ID is the minimum of the - lowest obtained IDs and the old ID. For example, if the old ID is 5 and the - obtained IDs are 3, 4, 6, then the new ID is 3. If the old ID is 2, it is kept. - -The algorithm runs until it converges or reaches the maximum iteration bound. -It may not converge on large graphs if the synchronous variant is used. -- **Synchronous**: The new community ID of a vertex is based on the - community IDs of its neighbors from the previous iteration. With (nearly) - [bipartite](https://en.wikipedia.org/wiki/Bipartite_graph) subgraphs, this may - lead to the community IDs changing back and forth in each iteration within the - two halves of the subgraph. -- **Asynchronous**: A vertex determines the new community ID using the most - up-to-date community IDs of its neighbors, whether those updates occurred in - the current iteration or the previous one. The order in which vertices are - updated in each iteration is chosen randomly. This leads to more stable - community IDs. - -Parameters: -- `graph_id` -- `start_label_attribute` -- `synchronous` -- `random_tiebreak` -- `maximum_supersteps` - -Result: a community ID for each vertex - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"start_label_attribute\":\"start_attr\",\"synchronous\":false,\"random_tiebreak\":false,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/labelpropagation" -``` - -##### Attribute Propagation - -`POST <ENGINE_URL>/v1/attributepropagation` - -The attribute propagation algorithm can be used to implement community detection. -It works similar to the label propagation algorithm, but every node additionally -accumulates a memory of observed labels instead of forgetting all but one label. - -The algorithm assigns an initial value to every vertex in the graph using a -user-defined attribute. The attribute value can be a list of strings to -initialize the set of labels with multiple labels. - -In each iteration of the computation, the following steps are executed: - -1. Each vertex propagates its set of labels along the edges to all direct - neighbor vertices. Whether inbound or outbound edges are followed depends on - an algorithm setting. -2. Each vertex adds the labels it receives to its own set of labels. - - After a specified maximal number of iterations or if no label set changes any - more, the algorithm stops. - - {{< warning >}} - If there are many labels and the graph is well-connected, the result set can - be very large. - {{< /warning >}} - -Parameters: -- `graph_id` -- `start_label_attribute`: The attribute to initialize labels with. - Use `"@id"` to use the document IDs of the vertices. -- `synchronous`: Whether synchronous or asynchronous label propagation is used. -- `backwards`: Whether labels are propagated in edge direction (`false`) or the - opposite direction (`true`). -- `maximum_supersteps`: Maximum number of iterations. - -Result: The set of accumulated labels of each vertex. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"start_label_attribute\":\"start_attr\",\"synchronous\":false,\"backwards\":false,\"maximum_supersteps\":500}" "$ENGINE_URL/v1/attributepropagation" -``` - -{{< comment >}} Work in progress -#### Custom Python code - -`POST <ENGINE_URL>/v1/python` - -You can run Python code to implement custom graph analytics algorithms as well -as execute any of the graph algorithms available in the supported Python -libraries. - -The NetworkX library is available by default using the variable `nx`: - -```py -def worker(graph): - return nx.pagerank(graph, 0.85) -``` - -Parameters: -- `graph_id` -- `function`: A string with Python code. It must define a function `def worker(graph):` - that returns a dataframe or dictionary with the results. The key inside that - dict must represent the vertex ID. The value can be of any type. -- `use_cugraph`: Use cugraph (or regular pandas/pyarrow). - -Result: Depends on the algorithm. If multiple values are returned for a single -vertex, a JSON object with multiple keys is stored. <!-- TODO: verify --> - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -XPOST -d "{\"graph_id\":$GRAPH_ID,\"function\":\"def worker(graph):\n return nx.pagerank(graph, 0.85)\",\"use_cugraph\":false}" "$ENGINE_URL/v1/python" -``` -{{< /comment >}} - -### Store job results - -`POST <ENGINE_URL>/v1/storeresults` - -You need to specify to which ArangoDB `database` and `target_collection` to save -the results to. They need to exist already. - -You also need to specify a list of `job_ids` with one or more jobs that have run -graph algorithms. - -Each algorithm outputs one value for each vertex, and you can define the target -attribute to store the information in with `attribute_names`. It has to be a -list with one attribute name for every job in the `job_ids` list. - -You can optionally set the degree of `parallelism` and the `batch_size` for -saving the data. - -Parameters: -- `database` -- `target_collection` -- `job_ids` -- `attribute_names` -- `parallelism` -- `batch_size` - -```bash -JOB_ID="123" -curl -H "Authorization: bearer $ADB_TOKEN" -X POST -d "{\"database\":\"_system\",\"target_collection\":\"coll\",\"job_ids\":[$JOB_ID],\"attribute_names\":[\"attr\"]}" "$ENGINE_URL/v1/storeresults" -``` - -### List all jobs - -`GET <ENGINE_URL>/v1/jobs` - -List all active and finished jobs. - -```bash -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs" -``` - -### Get a job - -`GET <ENGINE_URL>/v1/jobs/<JOB_ID>` - -Get detailed information about a specific job. - -```bash -JOB_ID="123" -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/jobs/$JOB_ID" -``` - -### Delete a job - -`DELETE <ENGINE_URL>/v1/jobs/<JOB_ID>` - -Delete a specific job. - -```bash -JOB_ID="123" -curl -H "Authorization: bearer $ADB_TOKEN" -X DELETE "$ENGINE_URL/v1/jobs/$JOB_ID" -``` - -### List all graphs - -`GET <ENGINE_URL>/v1/graphs` - -List all loaded sets of graph data that reside in the memory of the engine node. - -```bash -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/graphs" -``` - -### Get a graph - -`GET <ENGINE_URL>/v1/graphs/<GRAPH_ID>` - -Get detailed information about a specific set of graph data. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" "$ENGINE_URL/v1/graphs/$GRAPH_ID" -``` - -### Delete a graph - -`DELETE <ENGINE_URL>/v1/graphs/<GRAPH_ID>` - -Delete a specific set of graph data, removing it from the memory of the engine node. - -```bash -GRAPH_ID="234" -curl -H "Authorization: bearer $ADB_TOKEN" -X DELETE "$ENGINE_URL/v1/graphs/$GRAPH_ID" -``` diff --git a/site/content/arangodb/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md index 2307728d20..9b77d01f3e 100644 --- a/site/content/arangodb/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md +++ b/site/content/arangodb/3.11/develop/foxx-microservices/guides/authentication-and-sessions.md @@ -23,7 +23,7 @@ authentication. In this example we'll use two collections: a `users` collection to store the user objects with names and credentials, and a `sessions` collection to store the session data. We'll also make sure usernames are unique -by adding a hash index: +by adding a `persistent` index: ```js "use strict"; @@ -37,7 +37,7 @@ if (!db._collection(sessions)) { db._createDocumentCollection(sessions); } module.context.collection("users").ensureIndex({ - type: "hash", + type: "persistent", unique: true, fields: ["username"] }); diff --git a/site/content/arangodb/3.11/develop/http-api/indexes/_index.md b/site/content/arangodb/3.11/develop/http-api/indexes/_index.md index f759f7e174..a35384f3d0 100644 --- a/site/content/arangodb/3.11/develop/http-api/indexes/_index.md +++ b/site/content/arangodb/3.11/develop/http-api/indexes/_index.md @@ -221,8 +221,8 @@ paths: insert a value into the index that already exists in the index always fails, regardless of the value of this attribute. - The optional **estimates** attribute is supported by persistent indexes. - This attribute controls whether index selectivity estimates are + The optional **estimates** attribute is supported by `persistent`, `mdi`, and + `mdi-prefixed` indexes. This attribute controls whether index selectivity estimates are maintained for the index. Not maintaining index selectivity estimates can have a slightly positive impact on write performance. The downside of turning off index selectivity estimates will be that diff --git a/site/content/arangodb/3.11/develop/integrations/_index.md b/site/content/arangodb/3.11/develop/integrations/_index.md index 635983cc4d..3469808d73 100644 --- a/site/content/arangodb/3.11/develop/integrations/_index.md +++ b/site/content/arangodb/3.11/develop/integrations/_index.md @@ -47,3 +47,12 @@ allows you to export data from Apache Kafka to ArangoDB. - Repository: [github.com/arangodb/kafka-connect-arangodb/](https://github.com/arangodb/kafka-connect-arangodb/) - [Demo](https://github.com/arangodb/kafka-connect-arangodb/tree/main/demo) - [Changelog](https://github.com/arangodb/kafka-connect-arangodb/blob/main/ChangeLog.md) + +## TinkerPop Provider + +The [**ArangoDB TinkerPop Provider**](arangodb-tinkerpop-provider.md) is an implementation of +the [Apache TinkerPop OLTP Provider](https://tinkerpop.apache.org/docs/3.7.3/dev/provider) API +for ArangoDB. + +- Repository: [github.com/arangodb/arangodb-tinkerpop-provider](https://github.com/arangodb/arangodb-tinkerpop-provider) +- [Changelog](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/CHANGELOG.md) diff --git a/site/content/arangodb/3.11/index-and-search/indexing/index-utilization.md b/site/content/arangodb/3.11/index-and-search/indexing/index-utilization.md index c6d239b7ef..46a4592bb0 100644 --- a/site/content/arangodb/3.11/index-and-search/indexing/index-utilization.md +++ b/site/content/arangodb/3.11/index-and-search/indexing/index-utilization.md @@ -19,8 +19,9 @@ It is often beneficial to create an index on more than just one attribute. By ad to an index, an index can become more selective and thus reduce the number of documents that queries need to process. -ArangoDB's primary indexes, edges indexes and hash indexes will automatically provide selectivity -estimates. Index selectivity estimates are provided in the web interface, the `indexes()` return +ArangoDB's `primary` and `edge` indexes automatically provide selectivity estimates. +The `persistent`, `mdi`, and `mdi-prefixed` indexes do too, by default. +Index selectivity estimates are provided in the web interface, the `indexes()` return value and in the `explain()` output for a given query. The more selective an index is, the more documents it will filter on average. The index selectivity diff --git a/site/content/arangodb/3.12/aql/functions/geo.md b/site/content/arangodb/3.12/aql/functions/geo.md index cf5b3f8a2d..71820df92a 100644 --- a/site/content/arangodb/3.12/aql/functions/geo.md +++ b/site/content/arangodb/3.12/aql/functions/geo.md @@ -71,9 +71,9 @@ called `location` (with coordinates in `[longitude, latitude]` order): GeoJSON uses a geographic coordinate reference system, World Geodetic System 1984 (WGS 84), and units of decimal degrees. -Internally ArangoDB maps all coordinate pairs onto a unit sphere. Distances are -projected onto a sphere with the Earth's *Volumetric mean radius* of *6371 -km*. ArangoDB implements a useful subset of the GeoJSON format +Internally, ArangoDB maps all coordinate pairs onto a unit sphere. Distances are +projected onto a sphere with the Earth's *Volumetric mean radius* of +*6371 km*. ArangoDB implements a useful subset of the GeoJSON format [(RFC 7946)](https://tools.ietf.org/html/rfc7946). Feature Objects and the GeometryCollection type are not supported. Supported geometry object types are: @@ -98,6 +98,18 @@ a longitude and a latitude: } ``` +GeoJSON Points can optionally have a third coordinate for the elevation, but +ArangoDB doesn't use it in calculations: + +```json +{ + "location": { + "type": "Point", + "coordinates": [ 100.0, 0.0, 43.0 ] + } +} +``` + #### MultiPoint A [GeoJSON MultiPoint](https://tools.ietf.org/html/rfc7946#section-3.1.7) is @@ -425,11 +437,11 @@ fully contains `geoJsonB` (every point in B is also in A). The object `geoJsonA` has to be of type _Polygon_ or _MultiPolygon_. For other types containment is not well-defined because of numerical stability problems. -- **geoJsonA** (object): first GeoJSON object -- **geoJsonB** (object): second GeoJSON object, or a coordinate array in - `[longitude, latitude]` order +- **geoJsonA** (object): First GeoJSON object. +- **geoJsonB** (object): Second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. - returns **bool** (bool): `true` if every point in B is also contained in A, - otherwise `false` + otherwise `false`. {{< info >}} ArangoDB follows and exposes the same behavior as the underlying @@ -468,14 +480,14 @@ Return the distance between two GeoJSON objects in meters, measured from the **centroid** of each shape. For a list of supported types see the [geo index page](#geojson). -- **geoJsonA** (object): first GeoJSON object, or a coordinate array in - `[longitude, latitude]` order -- **geoJsonB** (object): second GeoJSON object, or a coordinate array in - `[longitude, latitude]` order -- **ellipsoid** (string, *optional*): reference ellipsoid to use. +- **geoJsonA** (object): First GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. +- **geoJsonB** (object): Second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. +- **ellipsoid** (string, *optional*): Reference ellipsoid to use. Supported are `"sphere"` (default) and `"wgs84"`. -- returns **distance** (number): the distance between the centroid points of - the two objects on the reference ellipsoid in **meters** +- returns **distance** (number): The distance between the centroid points of + the two objects on the reference ellipsoid in **meters**. ```aql LET polygon = { @@ -522,10 +534,10 @@ functions. Return the area for a [Polygon](#polygon) or [MultiPolygon](#multipolygon) on a sphere with the average Earth radius, or an ellipsoid. -- **geoJson** (object): a GeoJSON object -- **ellipsoid** (string, *optional*): reference ellipsoid to use. +- **geoJson** (object): A GeoJSON object. +- **ellipsoid** (string, *optional*): Reference ellipsoid to use. Supported are `"sphere"` (default) and `"wgs84"`. -- returns **area** (number): the area of the polygon in **square meters** +- returns **area** (number): The area of the polygon in **square meters**. ```aql LET polygon = { @@ -541,8 +553,8 @@ RETURN GEO_AREA(polygon, "wgs84") Checks whether two [GeoJSON objects](#geojson) are equal or not. -- **geoJsonA** (object): first GeoJSON object. -- **geoJsonB** (object): second GeoJSON object. +- **geoJsonA** (object): First GeoJSON object. +- **geoJsonB** (object): Second GeoJSON object. - returns **bool** (bool): `true` if they are equal, otherwise `false`. ```aql @@ -572,10 +584,10 @@ RETURN GEO_EQUALS(polygonA, polygonB) // false Checks whether the [GeoJSON object](#geojson) `geoJsonA` intersects with `geoJsonB` (i.e. at least one point in B is also in A or vice-versa). -- **geoJsonA** (object): first GeoJSON object -- **geoJsonB** (object): second GeoJSON object, or a coordinate array in - `[longitude, latitude]` order -- returns **bool** (bool): true if B intersects A, false otherwise +- **geoJsonA** (object): First GeoJSON object. +- **geoJsonB** (object): Second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. +- returns **bool** (bool): `true` if B intersects A, `false` otherwise. You can optimize queries that contain a `FILTER` expression of the following form with an S2-based [geospatial index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): @@ -604,19 +616,19 @@ Checks whether the distance between two [GeoJSON objects](#geojson) lies within a given interval. The distance is measured from the **centroid** of each shape. -- **geoJsonA** (object\|array): first GeoJSON object, or a coordinate array - in `[longitude, latitude]` order -- **geoJsonB** (object\|array): second GeoJSON object, or a coordinate array - in `[longitude, latitude]` order -- **low** (number): minimum value of the desired range -- **high** (number): maximum value of the desired range -- **includeLow** (bool, optional): whether the minimum value shall be included +- **geoJsonA** (object\|array): First GeoJSON object, or a coordinate array + in `[longitude, latitude]` order. +- **geoJsonB** (object\|array): Second GeoJSON object, or a coordinate array + in `[longitude, latitude]` order. +- **low** (number): Minimum value of the desired range. +- **high** (number): Maximum value of the desired range. +- **includeLow** (bool, optional): Whether the minimum value shall be included in the range (left-closed interval) or not (left-open interval). The default - value is `true` -- **includeHigh** (bool): whether the maximum value shall be included in the + value is `true`. +- **includeHigh** (bool): Whether the maximum value shall be included in the range (right-closed interval) or not (right-open interval). The default value - is `true` -- returns **bool** (bool): whether the evaluated distance lies within the range + is `true`. +- returns **bool** (bool): Whether the evaluated distance lies within the range. ### IS_IN_POLYGON() @@ -630,10 +642,10 @@ favor of the new [`GEO_CONTAINS()` AQL function](#geo_contains), which works wit `IS_IN_POLYGON(polygon, latitude, longitude) → bool` -- **polygon** (array): an array of arrays with 2 elements each, representing the - points of the polygon in the format `[latitude, longitude]` -- **latitude** (number): the latitude of the point to search -- **longitude** (number): the longitude of the point to search +- **polygon** (array): An array of arrays with two elements each, representing the + points of the polygon in the format `[latitude, longitude]`. +- **latitude** (number): The latitude of the point to search for. +- **longitude** (number): The longitude of the point to search for. - returns **bool** (bool): `true` if the point (`[latitude, longitude]`) is inside the `polygon` or `false` if it's not. The result is undefined (can be `true` or `false`) if the specified point is exactly on a boundary of the @@ -648,17 +660,17 @@ IS_IN_POLYGON( [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ] ], 4, 7 ) `IS_IN_POLYGON(polygon, coord, useLonLat) → bool` -The 2nd parameter can alternatively be specified as an array with two values. +The second parameter can alternatively be specified as an array with two values. By default, each array element in `polygon` is expected to be in the format -`[latitude, longitude]`. This can be changed by setting the 3rd parameter to `true` to +`[latitude, longitude]`. This can be changed by setting the third parameter to `true` to interpret the points as `[longitude, latitude]`. `coord` is then also interpreted in the same way. -- **polygon** (array): an array of arrays with 2 elements each, representing the - points of the polygon -- **coord** (array): the point to search as a numeric array with two elements -- **useLonLat** (bool, *optional*): if set to `true`, the coordinates in +- **polygon** (array): An array of arrays with 2 elements each, representing the + points of the polygon. +- **coord** (array): The point to search as a numeric array with two elements. +- **useLonLat** (bool, *optional*): If set to `true`, the coordinates in `polygon` and the coordinate pair `coord` are interpreted as `[longitude, latitude]` (like in GeoJSON). The default is `false` and the format `[latitude, longitude]` is expected. @@ -687,8 +699,9 @@ will help you to make all your AQL queries shorter and easier to read. Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs. -- **points** (array): an array of `[longitude, latitude]` pairs -- returns **geoJson** (object): a valid GeoJSON LineString +- **points** (array): An array of `[longitude, latitude]` pairs, or optionally + `[longitude, latitude, elevation]`. +- returns **geoJson** (object): A valid GeoJSON LineString. ```aql --- @@ -707,8 +720,9 @@ RETURN GEO_LINESTRING([ Construct a GeoJSON MultiLineString. Needs at least two elements consisting valid LineStrings coordinate arrays. -- **points** (array): array of LineStrings -- returns **geoJson** (object): a valid GeoJSON MultiLineString +- **points** (array): An array of arrays of `[longitude, latitude]` pairs, + or optionally `[longitude, latitude, elevation]`. +- returns **geoJson** (object): A valid GeoJSON MultiLineString. ```aql --- @@ -727,8 +741,9 @@ RETURN GEO_MULTILINESTRING([ Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs. -- **points** (array): an array of `[longitude, latitude]` pairs -- returns **geoJson** (object): a valid GeoJSON Point +- **points** (array): An array of `[longitude, latitude]` pairs, or optionally + `[longitude, latitude, elevation]`. +- returns **geoJson** (object): A valid GeoJSON Point. ```aql --- @@ -742,13 +757,15 @@ RETURN GEO_MULTIPOINT([ ### GEO_POINT() -`GEO_POINT(longitude, latitude) → geoJson` +`GEO_POINT(longitude, latitude, elevation) → geoJson` Construct a valid GeoJSON Point. -- **longitude** (number): the longitude portion of the point -- **latitude** (number): the latitude portion of the point -- returns **geoJson** (object): a GeoJSON Point +- **longitude** (number): The longitude portion of the point. +- **latitude** (number): The latitude portion of the point. +- **elevation** (number, *optional*): The elevation portion of the point + (introduced in v3.11.14-2 and v3.12.6). +- returns **geoJson** (object): A valid GeoJSON Point. ```aql --- @@ -769,8 +786,9 @@ any subsequent linear ring will be interpreted as holes. For details about the rules, see [GeoJSON polygons](#polygon). -- **points** (array): an array of (arrays of) `[longitude, latitude]` pairs -- returns **geoJson** (object\|null): a valid GeoJSON Polygon +- **points** (array): An array of (arrays of) `[longitude, latitude]` pairs, + or optionally `[longitude, latitude, elevation]`. +- returns **geoJson** (object\|null): A valid GeoJSON Polygon. A validation step is performed using the S2 geometry library. If the validation is not successful, an AQL warning is issued and `null` is @@ -809,8 +827,9 @@ Construct a GeoJSON MultiPolygon. Needs at least two Polygons inside. See [`GEO_POLYGON()`](#geo_polygon) and [GeoJSON MultiPolygon](#multipolygon) for the rules of Polygon and MultiPolygon construction. -- **polygons** (array): an array of arrays of arrays of `[longitude, latitude]` pairs -- returns **geoJson** (object\|null): a valid GeoJSON MultiPolygon +- **polygons** (array): An array of arrays of arrays of `[longitude, latitude]` + pairs, or optionally `[longitude, latitude, elevation]`. +- returns **geoJson** (object\|null): A valid GeoJSON MultiPolygon. A validation step is performed using the S2 geometry library, if the validation is not successful, an AQL warning is issued and `null` is @@ -860,31 +879,31 @@ FOR doc IN coll RETURN doc ``` Assuming there exists a geo-type index on `latitude` and `longitude`, the -optimizer will recognize it and accelerate the query. +optimizer recognizes it and accelerates the query. {{< /warning >}} `NEAR(coll, latitude, longitude, limit, distanceName) → docArray` -Return at most *limit* documents from collection *coll* that are near -*latitude* and *longitude*. The result contains at most *limit* documents, +Return at most `limit` documents from collection `coll` that are near +`latitude` and `longitude`. The result contains at most `limit` documents, returned sorted by distance, with closest distances being returned first. Optionally, the distances in meters between the specified coordinate pair -(*latitude* and *longitude*) and the stored coordinate pairs can be returned as +(`latitude` and `longitude`) and the stored coordinate pairs can be returned as well. To make use of that, the desired attribute name for the distance result -has to be specified in the *distanceName* argument. The result documents will -contain the distance value in an attribute of that name. - -- **coll** (collection): a collection -- **latitude** (number): the latitude of the point to search -- **longitude** (number): the longitude of the point to search -- **limit** (number, *optional*): cap the result to at most this number of - documents. The default is 100. If more documents than *limit* are found, - it is undefined which ones will be returned. -- **distanceName** (string, *optional*): include the distance (in meters) +has to be specified in the `distanceName` argument. The result documents +contains the distance value in an attribute of that name. + +- **coll** (collection): A collection. +- **latitude** (number): The latitude of the point to search for. +- **longitude** (number): The longitude of the point to search for. +- **limit** (number, *optional*): Cap the result to at most this number of + documents. The default is `100`. If more documents than `limit` are found, + it is undefined which ones are returned. +- **distanceName** (string, *optional*): Include the distance (in meters) between the reference point and the stored point in the result, using the - attribute name *distanceName* -- returns **docArray** (array): an array of documents, sorted by distance - (shortest distance first) + attribute name `distanceName`. +- returns **docArray** (array): An array of documents, sorted by distance + (shortest distance first). ### WITHIN() @@ -901,29 +920,29 @@ FOR doc IN coll ``` Assuming there exists a geo-type index on `latitude` and `longitude`, the -optimizer will recognize it and accelerate the query. +optimizer recognizes it and accelerates the query. {{< /warning >}} `WITHIN(coll, latitude, longitude, radius, distanceName) → docArray` -Return all documents from collection *coll* that are within a radius of *radius* -around the specified coordinate pair (*latitude* and *longitude*). The documents +Return all documents from collection `coll` that are within a radius of `radius` +around the specified coordinate pair (`latitude` and `longitude`). The documents returned are sorted by distance to the reference point, with the closest distances being returned first. Optionally, the distance (in meters) between the reference point and the stored point can be returned as well. To make use of that, an attribute name for the distance result has to be specified in -the *distanceName* argument. The result documents will contain the distance +the `distanceName` argument. The result documents contains the distance value in an attribute of that name. -- **coll** (collection): a collection -- **latitude** (number): the latitude of the point to search -- **longitude** (number): the longitude of the point to search -- **radius** (number): radius in meters -- **distanceName** (string, *optional*): include the distance (in meters) +- **coll** (collection): A collection. +- **latitude** (number): The latitude of the point to search for. +- **longitude** (number): The longitude of the point to search for. +- **radius** (number): Radius in meters. +- **distanceName** (string, *optional*): Include the distance (in meters) between the reference point and stored point in the result, using the - attribute name *distanceName* -- returns **docArray** (array): an array of documents, sorted by distance - (shortest distance first) + attribute name `distanceName`. +- returns **docArray** (array): An array of documents, sorted by distance + (shortest distance first). ### WITHIN_RECTANGLE() @@ -947,18 +966,18 @@ FOR doc IN coll ``` Assuming there exists a geo-type index on `latitude` and `longitude`, the -optimizer will recognize it and accelerate the query. +optimizer recognizes it and accelerates the query. {{< /warning >}} `WITHIN_RECTANGLE(coll, latitude1, longitude1, latitude2, longitude2) → docArray` -Return all documents from collection *coll* that are positioned inside the -bounding rectangle with the points (*latitude1*, *longitude1*) and (*latitude2*, -*longitude2*). There is no guaranteed order in which the documents are returned. +Return all documents from collection `coll` that are positioned inside the +bounding rectangle with the points (`latitude1`, `longitude1`) and (`latitude2`, +`longitude2`). There is no guaranteed order in which the documents are returned. -- **coll** (collection): a collection -- **latitude1** (number): the latitude of the bottom-left point to search -- **longitude1** (number): the longitude of the bottom-left point to search -- **latitude2** (number): the latitude of the top-right point to search -- **longitude2** (number): the longitude of the top-right point to search -- returns **docArray** (array): an array of documents, in random order +- **coll** (collection): A collection. +- **latitude1** (number): The latitude of the bottom-left point to search for. +- **longitude1** (number): The longitude of the bottom-left point to search for. +- **latitude2** (number): The latitude of the top-right point to search for. +- **longitude2** (number): The longitude of the top-right point to search for. +- returns **docArray** (array): An array of documents, in random order. diff --git a/site/content/arangodb/3.12/aql/functions/vector.md b/site/content/arangodb/3.12/aql/functions/vector.md index a20c562137..8b6bcb377d 100644 --- a/site/content/arangodb/3.12/aql/functions/vector.md +++ b/site/content/arangodb/3.12/aql/functions/vector.md @@ -16,13 +16,13 @@ You can calculate vector embeddings using [ArangoDB's GraphML](../../../../gen-a capabilities (available in ArangoGraph) or using external tools. {{< warning >}} -The vector index is an experimental feature that you need to enable for the -ArangoDB server with the `--experimental-vector-index` startup option. +You need to enable the vector index feature for the +ArangoDB server with the `--vector-index` startup option. Once enabled for a deployment, it cannot be disabled anymore because it permanently changes how the data is managed by the RocksDB storage engine (it adds an additional column family). -To restore a dump that contains vector indexes, the `--experimental-vector-index` +To restore a dump that contains vector indexes, the `--vector-index` startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} @@ -56,21 +56,37 @@ be found depends on the data as well as the search effort (see the `nProbe` opti {{< info >}} - If there is more than one suitable vector index over the same attribute, it is undefined which one is selected. -- You cannot have any `FILTER` operation between `FOR` and `LIMIT` for - pre-filtering. + +- In v3.12.4 and v3.12.5, you cannot have any `FILTER` operation between `FOR` + and `LIMIT` for pre-filtering. From v3.12.6 onward, you can add `FILTER` + operations between `FOR` and `SORT` that are then applied during the lookup in + the vector index. Example: + + ```aql + FOR doc IN coll + FILTER doc.val > 3 + SORT APPROX_NEAR_COSINE(doc.vector, @q) DESC + LIMIT 5 + RETURN doc + ``` + + Note that e.g. `LIMIT 5` does not ensure that you get 5 results by searching + as many neighboring Voronoi cells as necessary, but it rather considers only as + many as configured via the `nProbes` parameter. {{< /info >}} ### APPROX_NEAR_COSINE() `APPROX_NEAR_COSINE(vector1, vector2, options) → similarity` -Retrieve the approximate angular similarity using the cosine metric, accelerated -by a matching vector index. -The higher the cosine similarity value is, the more similar the two vectors -are. The closer it is to 0, the more different they are. The value can also -be negative, indicating that the vectors are not similar and point in opposite -directions. You need to sort in descending order so that the most similar +Retrieve the approximate cosine of the angle between two vectors, accelerated +by a matching vector index with the `cosine` metric. + +The closer the similarity value is to 1, the more similar the two vectors +are. The closer it is to 0, the more different they are. The value can also be +negative up to -1, indicating that the vectors are not similar and point in opposite +directions. You need to **sort in descending order** so that the most similar documents come first, which is what a vector index using the `cosine` metric can provide. @@ -83,8 +99,8 @@ can provide. closest Voronoi cells to consider for the search results. The larger the number, the slower the search but the better the search results. If not specified, the `defaultNProbe` value of the vector index is used. -- returns **similarity** (number): The approximate angular similarity between - both vectors. +- returns **similarity** (number): The approximate cosine similarity of + both normalized vectors. The value range is `[-1, 1]`. **Examples** @@ -126,15 +142,83 @@ FOR docOuter IN coll RETURN { key: docOuter._key, neighbors } ``` +### APPROX_NEAR_INNER_PRODUCT() + +<small>Introduced in: v3.12.6</small> + +`APPROX_NEAR_INNER_PRODUCT(vector1, vector2, options) → similarity` + +Retrieve the approximate dot product of two vectors, accelerated by a matching +vector index with the `innerProduct` metric. + +The higher the similarity value is, the more similar the two vectors +are. The closer it is to 0, the more different they are. The value can also +be negative, indicating that the vectors are not similar and point in opposite +directions. You need to **sort in descending order** so that the most similar +documents come first, which is what a vector index using the `innerProduct` +metric can provide. + +- **vector1** (array of numbers): The first vector. Either this parameter or + `vector2` needs to reference a stored attribute holding the vector embedding. +- **vector2** (array of numbers): The second vector. Either this parameter or + `vector1` needs to reference a stored attribute holding the vector embedding. +- **options** (object, _optional_): + - **nProbe** (number, _optional_): How many neighboring centroids respectively + closest Voronoi cells to consider for the search results. The larger the number, + the slower the search but the better the search results. If not specified, the + `defaultNProbe` value of the vector index is used. +- returns **similarity** (number): The approximate dot product + of both vectors without normalization. The value range is unbounded. + +**Examples** + +Return up to `10` similar documents based on their closeness to the vector +`@q` according to the inner product metric: + +```aql +FOR doc IN coll + SORT APPROX_NEAR_INNER_PRODUCT(doc.vector, @q) DESC + LIMIT 10 + RETURN doc +``` + +Return up to `5` similar documents as well as the similarity value, +considering `20` neighboring centroids respectively closest Voronoi cells: + +```aql +FOR doc IN coll + LET similarity = APPROX_NEAR_INNER_PRODUCT(doc.vector, @q, { nProbe: 20 }) + SORT similarity DESC + LIMIT 5 + RETURN MERGE( { similarity }, doc) +``` + +Return the similarity value and the document keys of up to `3` similar documents +for multiple input vectors using a subquery. In this example, the input vectors +are taken from ten random documents of the same collection: + +```aql +FOR docOuter IN coll + LIMIT 10 + LET neighbors = ( + FOR docInner IN coll + LET similarity = APPROX_NEAR_INNER_PRODUCT(docInner.vector, docOuter.vector) + SORT similarity DESC + LIMIT 3 + RETURN { key: docInner._key, similarity } + ) + RETURN { key: docOuter._key, neighbors } +``` + ### APPROX_NEAR_L2() -`APPROX_NEAR_L2(vector1, vector2, options) → similarity` +`APPROX_NEAR_L2(vector1, vector2, options) → distance` Retrieve the approximate distance using the L2 (Euclidean) metric, accelerated -by a matching vector index. +by a matching vector index with the `l2` metric. The closer the distance is to 0, the more similar the two vectors are. The higher -the value, the more different the they are. You need to sort in ascending order +the value, the more different the they are. You need to **sort in ascending order** so that the most similar documents come first, which is what a vector index using the `l2` metric can provide. @@ -147,7 +231,7 @@ the `l2` metric can provide. for the search results. The larger the number, the slower the search but the better the search results. If not specified, the `defaultNProbe` value of the vector index is used. -- returns **similarity** (number): The approximate L2 (Euclidean) distance between +- returns **distance** (number): The approximate L2 (Euclidean) distance between both vectors. **Examples** diff --git a/site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md b/site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md index bef591606d..69ee924ec3 100644 --- a/site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md +++ b/site/content/arangodb/3.12/aql/graphs/all-shortest-paths.md @@ -117,6 +117,56 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows using a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a +traversal. Which collections need to be loaded by the graph engine can only be +determined at run time. + +Use the [`WITH` operation](../high-level-operations/with.md) to specify the +node collections you expect to be involved. This is required for traversals +using collection sets in cluster deployments. Declare the collection of the +start node as well if it's not declared already (like by a `FOR` loop). + +{{< tip >}} +From v3.12.6 onward, node collections are automatically deduced for graph +queries using collection sets / anonymous graphs if there is a named graph with +a matching edge collection in its edge definitions. + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR p IN ANY ALL_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + RETURN p.vertices[*].label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR p IN ANY ALL_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + RETURN p.vertices[*].label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +// Chris Rock --> The Longest Yard <-- Rob Schneider --> Big Stan <-- Jennifer Morrison +// Chris Rock --> Down to Earth <-- John Cho --> Star Trek <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. +{{< /tip >}} + ## Examples Load an example graph to get a named graph that reflects some possible diff --git a/site/content/arangodb/3.12/aql/graphs/k-paths.md b/site/content/arangodb/3.12/aql/graphs/k-paths.md index 0c490ce041..fce8f76a05 100644 --- a/site/content/arangodb/3.12/aql/graphs/k-paths.md +++ b/site/content/arangodb/3.12/aql/graphs/k-paths.md @@ -188,6 +188,57 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows to use a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a +traversal. Which collections need to be loaded by the graph engine can only be +determined at run time. + +Use the [`WITH` operation](../high-level-operations/with.md) to specify the +node collections you expect to be involved. This is required for traversals +using collection sets in cluster deployments. Declare the collection of the +start node as well if it's not declared already (like by a `FOR` loop). + +{{< tip >}} +From v3.12.6 onward, node collections are automatically deduced for graph +queries using collection sets / anonymous graphs if there is a named graph with +a matching edge collection in its edge definitions. + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR p IN 4 ANY K_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR p IN 4 ANY K_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +// Chris Rock --> The Longest Yard <-- Rob Schneider --> Big Stan <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. +{{< /tip >}} + ## Examples You can load the `kShortestPathsGraph` example graph to get a named graph that diff --git a/site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md b/site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md index 9c638740d7..e4f5d646f8 100644 --- a/site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md +++ b/site/content/arangodb/3.12/aql/graphs/k-shortest-paths.md @@ -186,6 +186,57 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows to use a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a +traversal. Which collections need to be loaded by the graph engine can only be +determined at run time. + +Use the [`WITH` operation](../high-level-operations/with.md) to specify the +node collections you expect to be involved. This is required for traversals +using collection sets in cluster deployments. Declare the collection of the +start node as well if it's not declared already (like by a `FOR` loop). + +{{< tip >}} +From v3.12.6 onward, node collections are automatically deduced for graph +queries using collection sets / anonymous graphs if there is a named graph with +a matching edge collection in its edge definitions. + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR p IN ANY K_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR p IN ANY K_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +// Chris Rock --> The Longest Yard <-- Rob Schneider --> Big Stan <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. +{{< /tip >}} + ## Examples You can load the `kShortestPathsGraph` example graph to get a named graph that diff --git a/site/content/arangodb/3.12/aql/graphs/shortest-path.md b/site/content/arangodb/3.12/aql/graphs/shortest-path.md index e3cab31823..788c10d61b 100644 --- a/site/content/arangodb/3.12/aql/graphs/shortest-path.md +++ b/site/content/arangodb/3.12/aql/graphs/shortest-path.md @@ -145,6 +145,54 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows you to use a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a +traversal. Which collections need to be loaded by the graph engine can only be +determined at run time. + +Use the [`WITH` operation](../high-level-operations/with.md) to specify the +node collections you expect to be involved. This is required for traversals +using collection sets in cluster deployments. Declare the collection of the +start node as well if it's not declared already (like by a `FOR` loop). + +{{< tip >}} +From v3.12.6 onward, node collections are automatically deduced for graph +queries using collection sets / anonymous graphs if there is a named graph with +a matching edge collection in its edge definitions. + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR v IN ANY SHORTEST_PATH "person/1544" TO "person/52560" acts_in + RETURN v.label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR v IN ANY SHORTEST_PATH "person/1544" TO "person/52560" acts_in + RETURN v.label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. +{{< /tip >}} + ## Conditional shortest path The `SHORTEST_PATH` computation only finds an unconditioned shortest path. diff --git a/site/content/arangodb/3.12/aql/graphs/traversals.md b/site/content/arangodb/3.12/aql/graphs/traversals.md index ef4870dfef..ed04514a58 100644 --- a/site/content/arangodb/3.12/aql/graphs/traversals.md +++ b/site/content/arangodb/3.12/aql/graphs/traversals.md @@ -342,9 +342,50 @@ collections and it is not possible to predict which are visited in a traversal. Which collections need to be loaded by the graph engine can only be determined at run time. -Use the [`WITH` statement](../high-level-operations/with.md) to specify the collections you -expect to be involved. This is required for traversals using collection sets -in cluster deployments. +Use the [`WITH` operation](../high-level-operations/with.md) to specify the +node collections you expect to be involved. This is required for traversals +using collection sets in cluster deployments. Declare the collection of the +start node as well if it's not declared already (like by a `FOR` loop). + +{{< tip >}} +From v3.12.6 onward, node collections are automatically deduced for graph +queries using collection sets / anonymous graphs if there is a named graph with +a matching edge collection in its edge definitions. + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a traversal +query that starts at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR v, IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR v, IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label + +// Chris Rock +// A.I. Artificial Intelligence +// Lethal Weapon 4 +// Madagascar +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. +{{< /tip >}} ## Pruning diff --git a/site/content/arangodb/3.12/develop/http-api/indexes/_index.md b/site/content/arangodb/3.12/develop/http-api/indexes/_index.md index f759f7e174..a35384f3d0 100644 --- a/site/content/arangodb/3.12/develop/http-api/indexes/_index.md +++ b/site/content/arangodb/3.12/develop/http-api/indexes/_index.md @@ -221,8 +221,8 @@ paths: insert a value into the index that already exists in the index always fails, regardless of the value of this attribute. - The optional **estimates** attribute is supported by persistent indexes. - This attribute controls whether index selectivity estimates are + The optional **estimates** attribute is supported by `persistent`, `mdi`, and + `mdi-prefixed` indexes. This attribute controls whether index selectivity estimates are maintained for the index. Not maintaining index selectivity estimates can have a slightly positive impact on write performance. The downside of turning off index selectivity estimates will be that diff --git a/site/content/arangodb/3.12/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/3.12/develop/http-api/indexes/multi-dimensional.md index e38f031495..5627af291b 100644 --- a/site/content/arangodb/3.12/develop/http-api/indexes/multi-dimensional.md +++ b/site/content/arangodb/3.12/develop/http-api/indexes/multi-dimensional.md @@ -111,7 +111,10 @@ paths: default: false sparse: description: | - If `true`, then create a sparse index. + Whether to create a sparse index that excludes documents with + at least one of the attributes for indexing missing or set to + `null`. These attributes are defined by `fields` and (for + `mdi-prefixed` indexes) by `prefixFields`. type: boolean default: false estimates: diff --git a/site/content/arangodb/3.12/develop/http-api/indexes/persistent.md b/site/content/arangodb/3.12/develop/http-api/indexes/persistent.md index 7017836a3b..cb916d7aed 100644 --- a/site/content/arangodb/3.12/develop/http-api/indexes/persistent.md +++ b/site/content/arangodb/3.12/develop/http-api/indexes/persistent.md @@ -113,8 +113,9 @@ paths: default: false sparse: description: | - Whether create a sparse index that excludes documents with at least - one of the `fields` missing or set to `null`. + Whether to create a sparse index that excludes documents with + at least one of the attributes for indexing missing or set to + `null`. These attributes are defined by `fields`. type: boolean default: false deduplicate: diff --git a/site/content/arangodb/3.12/develop/http-api/indexes/vector.md b/site/content/arangodb/3.12/develop/http-api/indexes/vector.md index 1581ed1e94..0bbd14d4de 100644 --- a/site/content/arangodb/3.12/develop/http-api/indexes/vector.md +++ b/site/content/arangodb/3.12/develop/http-api/indexes/vector.md @@ -57,7 +57,7 @@ paths: A list with exactly one attribute path to specify where the vector embedding is stored in each document. The vector data needs to be populated before creating the index. - + If you want to index another vector embedding attribute, you need to create a separate vector index. type: array @@ -65,6 +65,13 @@ paths: maxItems: 1 items: type: string + sparse: + description: | + Whether to create a sparse index that excludes documents with + the attribute for indexing missing or set to `null`. This + attribute is defined by `fields`. + type: boolean + default: false parallelism: description: | The number of threads to use for indexing. @@ -88,9 +95,14 @@ paths: properties: metric: description: | - Whether to use `cosine` or `l2` (Euclidean) distance calculation. - type: string - enum: ["cosine", "l2"] + The measure for calculating the vector similarity: + - `"cosine"`: Angular similarity. Vectors are automatically + normalized before insertion and search. + - `"innerProduct"` (introduced in v3.12.6): + Similarity in terms of angle and magnitude. + Vectors are not normalized, making it faster than `cosine`. + - `"l2":` Euclidean distance. + enum: ["cosine", "innerProduct", "l2"] dimension: description: | The vector dimension. The attribute to index needs to diff --git a/site/content/arangodb/3.12/develop/http-api/monitoring/logs.md b/site/content/arangodb/3.12/develop/http-api/monitoring/logs.md index d68f1b6eeb..7808927511 100644 --- a/site/content/arangodb/3.12/develop/http-api/monitoring/logs.md +++ b/site/content/arangodb/3.12/develop/http-api/monitoring/logs.md @@ -568,7 +568,7 @@ paths: Logs various information related to ArangoDB's use of the RocksDB storage engine, like the initialization and file operations. - + RocksDB's internal log messages are passed through using the `rocksdb` log topic. type: string @@ -856,12 +856,14 @@ paths: operationId: getRecentApiCalls description: | Get a list of the most recent requests with a timestamp and the endpoint. + In cluster deployments, the list contains only those requests that were + submitted to the Coordinator you call this endpoint on. This feature is for debugging purposes. You can control how much memory is used to record API calls with the `--server.api-recording-memory-limit` startup option. - You can disable this endpoint + You can disable this and the `/_admin/server/aql-queries` endpoint with the `--log.recording-api-enabled` startup option. Whether API calls are recorded is independently controlled by the @@ -875,7 +877,9 @@ paths: description: | The name of a database. Which database you use doesn't matter as long as the user account you authenticate with has at least read access - to this database. + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. schema: type: string responses: @@ -1075,3 +1079,239 @@ Content-Length: 257 } ``` {{< /details >}} + +## Get recent AQL queries + +```openapi +paths: + /_db/{database-name}/_admin/server/aql-queries: + get: + operationId: getRecentAqlQueries + description: | + Get a list of the most recent AQL queries with a timestamp and + information about the submitted query. In cluster deployments, the list + contains only those queries that were submitted to the Coordinator you + call this endpoint on. This feature is for debugging purposes. + + You can control how much memory is used to record AQL queries with the + `--server.aql-recording-memory-limit` startup option. + + You can disable this and the `/_admin/server/api-calls` endpoint + with the `--log.recording-api-enabled` startup option. + + Whether AQL queries are recorded is independently controlled by the + `--server.aql-query-recording` startup option. + The endpoint returns an empty list of queries if turned off. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. + schema: + type: string + responses: + '200': + description: | + Returns the recorded AQL queries. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The request result. + type: object + required: + - queries + properties: + queries: + description: | + A list of the recent AQL queries. + Empty if AQL query recording is disabled. + type: array + items: + type: object + properties: + timeStamp: + description: | + The date and time of the request in ISO 8601 format. + type: string + format: date-time + query: + description: | + The AQL query. + type: string + bindVars: + description: | + Key/value pairs representing the bind variables. + type: object + database: + description: | + The database name. + type: string + '401': + description: | + The user account has insufficient permissions for the selected database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 401 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + The recording API has been disabled. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + The method has not been called on a Coordinator or single server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Monitoring +``` + +{{< comment >}} +Example not generated because it changes on every run and there can be many internal queries. +{{< /comment >}} + +```bash +curl --header 'accept: application/json' --dump - http://localhost:8529/_admin/server/aql-queries +``` + +{{< details summary="Show output" >}} +```bash +HTTP/1.1 200 OK +X-Arango-Queue-Time-Seconds: 0.000000 +Strict-Transport-Security: max-age=31536000 ; includeSubDomains +Expires: 0 +Pragma: no-cache +Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0 +Content-Security-Policy: frame-ancestors 'self'; form-action 'self'; +X-Content-Type-Options: nosniff +Server: ArangoDB +Connection: Keep-Alive +Content-Type: application/json; charset=utf-8 +Content-Length: 353 + +{ + "error": false, + "code": 200, + "result": { + "queries": [ + { + "timeStamp": "2025-07-02T16:33:32Z", + "query": "FOR s in @@collection FILTER s.time < @start RETURN s._key", + "database": "_system", + "bindVars": { + "@collection": "_statistics", + "start": 1751470412.3836362 + } + }, + { + "timeStamp": "2025-07-02T16:26:01Z", + "query": "FOR doc IN coll RETURN doc", + "database": "_system", + "bindVars": {} + } + ] + } +} +``` +{{< /details >}} \ No newline at end of file diff --git a/site/content/arangodb/3.12/develop/integrations/_index.md b/site/content/arangodb/3.12/develop/integrations/_index.md index 635983cc4d..3469808d73 100644 --- a/site/content/arangodb/3.12/develop/integrations/_index.md +++ b/site/content/arangodb/3.12/develop/integrations/_index.md @@ -47,3 +47,12 @@ allows you to export data from Apache Kafka to ArangoDB. - Repository: [github.com/arangodb/kafka-connect-arangodb/](https://github.com/arangodb/kafka-connect-arangodb/) - [Demo](https://github.com/arangodb/kafka-connect-arangodb/tree/main/demo) - [Changelog](https://github.com/arangodb/kafka-connect-arangodb/blob/main/ChangeLog.md) + +## TinkerPop Provider + +The [**ArangoDB TinkerPop Provider**](arangodb-tinkerpop-provider.md) is an implementation of +the [Apache TinkerPop OLTP Provider](https://tinkerpop.apache.org/docs/3.7.3/dev/provider) API +for ArangoDB. + +- Repository: [github.com/arangodb/arangodb-tinkerpop-provider](https://github.com/arangodb/arangodb-tinkerpop-provider) +- [Changelog](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/CHANGELOG.md) diff --git a/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md b/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md new file mode 100644 index 0000000000..04012366f9 --- /dev/null +++ b/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md @@ -0,0 +1,841 @@ +--- +title: ArangoDB TinkerPop Provider +menuTitle: TinkerPop Provider +weight: 10 +description: >- + Build graph applications using TinkerPop API with ArangoDB's high-performance backend, combining Gremlin traversals and native AQL queries +--- +ArangoDB TinkerPop Provider is an implementation of the [Apache TinkerPop OLTP Provider](https://tinkerpop.apache.org/docs/3.7.4/dev/provider) API for +ArangoDB. + +It allows using the standard TinkerPop API with ArangoDB as the backend storage. It supports creating, +querying, and manipulating graph data using the Gremlin traversal language, while offering the possibility to use native +AQL (ArangoDB Query Language) for complex queries. + +- Repository: <https://github.com/arangodb/arangodb-tinkerpop-provider> +- [Code examples](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/src/test/java/example) +- [Demo](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/demo) +- [JavaDoc](https://www.javadoc.io/doc/com.arangodb/arangodb-tinkerpop-provider/latest/index.html) (generated reference documentation) +- [ChangeLog](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/CHANGELOG.md) + +## Compatibility + +This Provider is compatible with: + +- Apache TinkerPop 3.7 +- ArangoDB 3.12+ +- ArangoDB Java Driver 7.22+ +- Java 8+ + +## Installation + +### Maven + +1. Check the [latest version](https://search.maven.org/artifact/com.arangodb/arangodb-tinkerpop-provider) available. +2. Add the following dependency to your `pom.xml` file: + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-tinkerpop-provider</artifactId> + <version>x.y.z</version> + </dependency> +</dependencies> +``` + +### Gradle + +1. Add the following dependency to your `build.gradle`: + +```groovy +implementation 'com.arangodb:arangodb-tinkerpop-provider:x.y.z' +``` + +### Gremlin Console + +1. Install the TinkerPop Provider in the Gremlin Console: + +```text +:install com.arangodb arangodb-tinkerpop-provider x.y.z +``` + +2. Restart the console to load the provider. + +3. Create a configuration for your ArangoDB connection. + +```text +gremlin> conf = [ +......1> "gremlin.graph":"com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph", +......2> "gremlin.arangodb.conf.graph.enableDataDefinition":"true", +......3> "gremlin.arangodb.conf.driver.hosts":"172.28.0.1:8529", +......4> "gremlin.arangodb.conf.driver.password":"test", +......5> ] +==>gremlin.graph=com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph +==>gremlin.arangodb.conf.graph.enableDataDefinition=true +==>gremlin.arangodb.conf.driver.hosts=172.28.0.1:8529 +==>gremlin.arangodb.conf.driver.password=test +``` +4. Open the graph using the configuration. + +```text +gremlin> graph = GraphFactory.open(conf) +==>arangodbgraph[ArangoDBGraphConfig{...}] +``` + +5. Create a traversal source and start using it: + +```text +gremlin> g = graph.traversal() +==>graphtraversalsource[arangodbgraph[...], standard] + +gremlin> g.addV("person").property("name", "marko") +==>v[4586117] + +gremlin> g.V().hasLabel("person").values("name") +==>marko +``` + +### Server Plugin + +Follow the steps below to set up the provider as a Gremlin Server plugin. + +1. Install the provider in the Gremlin Server: + + ```bash + ./bin/gremlin-server.sh install com.arangodb arangodb-tinkerpop-provider x.y.z + ``` + +2. Create a graph configuration file (e.g., `conf/arangodb.yaml`): + + ```yaml + gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + enableDataDefinition: true + driver: + hosts: + - "172.28.0.1:8529" + password: test + ``` + +3. Create a server configuration file to load the plugin and graph configuration (e.g., `conf/gremlin-server-arangodb.yaml`): + +```yaml +host: 0.0.0.0 +port: 8182 +graphs: { + graph: conf/arangodb.yaml} +scriptEngines: { + gremlin-groovy: { + plugins: { org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {}, + org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {}, + com.arangodb.tinkerpop.gremlin.jsr223.ArangoDBGremlinPlugin: {}, + org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]}, + org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/empty-sample.groovy]}}}} +serializers: + - { className: org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] }} # application/json + - { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1 } # application/vnd.graphbinary-v1.0 + - { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }} # application/vnd.graphbinary-v1.0-stringd +processors: + - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }} + - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor} +``` + +4. Start the Gremlin Server with your configuration: + + ```bash + ./bin/gremlin-server.sh conf/gremlin-server-arangodb.yaml + ``` + +5. Connect to the server using the Gremlin Console: + + ```text + gremlin> :remote connect tinkerpop.server conf/remote.yaml + + gremlin> :remote console + ==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:8182] - type ':remote console' to return to local mode + ``` + +6. Start using the graph: + + ```text + gremlin> g.addV("person").property("name", "marko") + ==>v[4587713] + + gremlin> g.V().hasLabel("person").values("name") + ==>marko + ``` + +You can find the reference documentation [here](https://tinkerpop.apache.org/docs/3.7.4/reference/#_configuring_2). + + +## Quick Start + +Follow the steps below to get started with creating vertices, edges, and querying the graph. + +### Step 1: Configure and Create the Graph + +[//]: <> (@formatter:off) +```java +// Create a configuration +Configuration conf = new ArangoDBConfigurationBuilder() + .hosts("localhost:8529") + .user("root") + .password("test") + .db("myDatabase") + .name("myGraph") + .enableDataDefinition(true) // Allow creating database and graph if they don't exist + .build(); + +// Create a graph +ArangoDBGraph graph = (ArangoDBGraph) GraphFactory.open(conf); + +// Get a traversal source +GraphTraversalSource g = graph.traversal(); +``` +### Step 2: Add Vertices and Edges + +```java +// Add vertices with properties +Vertex person = g.addV("person") + .property("name", "Alice") + .property("age", 30) + .property("country", "Germany") + .next(); + +Vertex software = g.addV("software") + .property("name", "JArango") + .property("lang", "Java") + .next(); + +// Create relationships between vertices +Edge created = g.addE("created") + .from(person) + .to(software) + .property("year", 2025) + .next(); +``` + +### Step 3: Query the Graph + +```java +// Query the graph +List<String> creators = g.V() + .hasLabel("software") + .has("name", "JArango") + .in("created") + .<String>values("name") + .toList(); + +System.out.println("Creators: " + creators); + +// Query: Find all software created by Alice +List<String> aliceSoftware = g.V() + .hasLabel("person") + .has("name", "Alice") + .out("created") + .<String>values("name") + .toList(); + +System.out.println("aliceSoftware: " + aliceSoftware); + +``` + +### Step 4: Update Data + +```java +// Update a property +g.V() + .hasLabel("person") + .has("name", "Alice") + .property("age", 31) + .iterate(); + +// Remove a property +g.V() + .hasLabel("person") + .has("name", "Alice") + .properties("country") + .drop() + .iterate(); + +// Check the updated vertex +Map<?, ?> alice = g.V() + .hasLabel("person") + .has("name", "Alice") + .valueMap() + .next(); + +System.out.println("alice: " + alice); +``` + +### Step 5: Delete Data and Clean Up + +```java +// Remove an edge +g.E() + .hasLabel("created") + .where(__.outV() + .has("name", "Alice")) + .where(__.inV() + .has("name", "JArango")) + .drop() + .iterate(); + +// Remove a vertex (and its incident edges) +g.V() + .hasLabel("person") + .has("name", "Alice") + .drop() + .iterate(); + +// Close the graph when done +graph.close(); +``` +[//]: <> (@formatter:on) + +## Configuration + +The graph can be created using the methods from `org.apache.tinkerpop.gremlin.structure.util.GraphFactory.open(...)` +(see [javadoc](https://tinkerpop.apache.org/javadocs/3.7.4/full/org/apache/tinkerpop/gremlin/structure/util/GraphFactory.html)). +These methods accept a configuration file (e.g., YAML or properties file), a Java Map, or an Apache Commons Configuration object. + +The property `gremlin.graph` must be set to: `com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph`. + +Configuration examples can be found [here](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/src/test/java/example). + +### Graph Configuration Properties + +Graph configuration properties are prefixed with `gremlin.arangodb.conf.graph`: + +| Property | Description | Default | +|----------------------------------------------------|---------------------------------------|-------------| +| `gremlin.arangodb.conf.graph.db` | ArangoDB database name | `_system` | +| `gremlin.arangodb.conf.graph.name` | ArangoDB graph name | `tinkerpop` | +| `gremlin.arangodb.conf.graph.enableDataDefinition` | Flag to allow data definition changes | `false` | +| `gremlin.arangodb.conf.graph.type` | Graph type: `SIMPLE` or `COMPLEX` | `SIMPLE` | +| `gremlin.arangodb.conf.graph.labelField` | Label field name | `_label` | +| `gremlin.arangodb.conf.graph.orphanCollections` | List of orphan collections names | - | +| `gremlin.arangodb.conf.graph.edgeDefinitions` | List of edge definitions | - | + +### Driver Configuration Properties + +Driver configuration properties are prefixed with `gremlin.arangodb.conf.driver`. All properties from +`com.arangodb.config.ArangoConfigProperties` are supported. See +the [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) +for details. + +### YAML Configuration + +```yaml +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + db: "testDb" + name: "myFirstGraph" + enableDataDefinition: true + type: COMPLEX + orphanCollections: [ "x", "y", "z" ] + edgeDefinitions: + - "e1:[a]->[b]" + - "e2:[a,b]->[c,d]" + driver: + user: "root" + password: "test" + hosts: + - "172.28.0.1:8529" + - "172.28.0.1:8539" + - "172.28.0.1:8549" +``` + +Loading from a YAML file: + +[//]: <> (@formatter:off) +```java +ArangoDBGraph graph = (ArangoDBGraph) GraphFactory.open("<path_to_yaml_file>"); +``` +[//]: <> (@formatter:on) + +### Programmatic Configuration + +1. Build the configuration using the configuration builder: + + [//]: <> (@formatter:off) + ```java + Configuration conf = new ArangoDBConfigurationBuilder() + .hosts("172.28.0.1:8529") + .user("root") + .password("test") + .database("testDb") + .name("myGraph") + .graphType(GraphType.SIMPLE) + .enableDataDefinition(true) + .build(); + ``` + [//]: <> (@formatter:on) + +2. Create the graph using the configuration: + + [//]: <> (@formatter:off) + ```java + ArangoDBGraph graph = (ArangoDBGraph) GraphFactory.open(conf); + ``` + [//]: <> (@formatter:on) + +### SSL Configuration + +To use TLS-secured connections to ArangoDB, follow these steps: + +1. Enable SSL by setting `gremlin.arangodb.conf.driver.useSsl` to `true` in your configuration. + +2. Configure SSL properties as needed (see [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) for all available options): + + ```yaml + gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + driver: + hosts: + - "172.28.0.1:8529" + useSsl: true + verifyHost: false + sslCertValue: "MIIDezCCAmOgAwIBAgIEeDCzXzANBgkqhkiG9w0BAQsFADBuMRAwDgYDVQQGEwdVbmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYDVQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMjAxMTAxMTg1MTE5WhcNMzAxMDMwMTg1MTE5WjBuMRAwDgYDVQQGEwdVbmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYDVQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1WiDnd4+uCmMG539ZNZB8NwI0RZF3sUSQGPx3lkqaFTZVEzMZL76HYvdc9Qg7difyKyQ09RLSpMALX9euSseD7bZGnfQH52BnKcT09eQ3wh7aVQ5sN2omygdHLC7X9usntxAfv7NzmvdogNXoJQyY/hSZff7RIqWH8NnAUKkjqOe6Bf5LDbxHKESmrFBxOCOnhcpvZWetwpiRdJVPwUn5P82CAZzfiBfmBZnB7D0l+/6Cv4jMuH26uAIcixnVekBQzl1RgwczuiZf2MGO64vDMMJJWE9ClZF1uQuQrwXF6qwhuP1Hnkii6wNbTtPWlGSkqeutr004+Hzbf8KnRY4PAgMBAAGjITAfMB0GA1UdDgQWBBTBrv9Awynt3C5IbaCNyOW5v4DNkTANBgkqhkiG9w0BAQsFAAOCAQEAIm9rPvDkYpmzpSIhR3VXG9Y71gxRDrqkEeLsMoEyqGnw/zx1bDCNeGg2PncLlW6zTIipEBooixIE9U7KxHgZxBy0Et6EEWvIUmnr6F4F+dbTD050GHlcZ7eOeqYTPYeQC502G1Fo4tdNi4lDP9L9XZpf7Q1QimRH2qaLS03ZFZa2tY7ah/RQqZL8Dkxx8/zc25sgTHVpxoK853glBVBs/ENMiyGJWmAXQayewY3EPt/9wGwV4KmU3dPDleQeXSUGPUISeQxFjy+jCw21pYviWVJTNBA9l5ny3GhEmcnOT/gQHCvVRLyGLMbaMZ4JrPwb+aAtBgrgeiK4xeSMMvrbhw==" + ``` + +3. Alternatively, use system properties for truststore configuration. If no `sslCertValue` is provided, the default SSL context is used. In such cases, you can specify the truststore using system properties: + - `javax.net.ssl.trustStore` + - `javax.net.ssl.trustStorePassword` + +### Data Definition Management + +The provider follows this process when instantiating a graph: + +1. **Validation**: The provider compares existing data definitions in ArangoDB with the structure expected by your configuration. It checks whether: + - The database exists + - The graph exists + - The graph structure has the same edge definitions and orphan collections + +2. **Error handling**: If there's a mismatch, an error is thrown and the graph is not instantiated. + +3. **Automatic creation** (optional): To automatically create missing data definitions, set `gremlin.arangodb.conf.graph.enableDataDefinition` to `true`. This allows: + - Creating a new database if it doesn't exist + - Creating a new graph if it doesn't exist (along with vertex and edge collections) + +{{< info >}} +Existing graphs are never modified automatically for safety reasons. +{{< /info >}} + +## Graph Types + +The ArangoDB TinkerPop Provider supports two graph types, which can be configured with the property +`gremlin.arangodb.conf.graph.type`: `SIMPLE` and `COMPLEX`. + +### SIMPLE Graph Type + +From an application perspective, this is the most flexible graph type that is backed by an ArangoDB graph composed of only one vertex collection and one edge definition. + +The `label` of each element is stored in a database document field. The label field name is configurable by setting the configuration property `graph.labelField`, `_label` by default. + +The `SIMPLE` graph type is the default graph type. + +It has the following advantages: + +- It closely matches the TinkerPop property graph +- It is simpler to get started and run examples +- It imposes no restrictions about element IDs +- It supports arbitrary labels, i.e., labels not known at graph construction time + +It has the following disadvantages: + +- All vertex types will be stored in the same vertex collection +- All edge types will be stored in the same edge collection +- It could not leverage the full potential of ArangoDB graph traversal +- It could require an index on the label field to improve performance + +Example configuration: + +```yaml +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + db: "db" + name: "myGraph" + type: SIMPLE + edgeDefinitions: + - "e:[v]->[v]" +``` + +If `edgeDefinitions` are not configured, the default names are used: + +- `vertex` will be used for the vertex collection +- `edge` will be used for the edge collection + +Using a `SIMPLE` graph configured as in the example above and creating a new element like: + +[//]: <> (@formatter:off) +```java +graph.addVertex(T.label, "person", T.id, "foo"); +``` +[//]: <> (@formatter:on) + +would result in creating a document in the vertex collection `v` with `_key` equals to `foo` (and `_id` equals +to `v/foo`). + +### COMPLEX Graph Type + +The `COMPLEX` graph type is backed by an ArangoDB graph composed potentially of multiple vertex collections and multiple +edge definitions. + +The `label` of each element is used as name for the related database collection. + +It has the following advantages: + +- It closely matches the ArangoDB graph structure +- It allows multiple vertex collections and multiple edge collections +- It partitions the data in a finer way +- It allows indexing and sharding collections independently +- It is more flexible to match pre-existing database graph structures + +But on the other side has the following constraints: + +- Element IDs must have the format: `<label>/<key>`, where: + - `<label>` is the element label + - `<key>` is the database document key +- Only labels corresponding to graph collections can be used + +Example configuration: + +```yaml +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + db: "db" + name: "myGraph" + type: COMPLEX + edgeDefinitions: + - "knows:[person]->[person]" + - "created:[person]->[game,software]" +``` + +Using a `COMPLEX` graph configured as in the example above and creating a new element like: + +[//]: <> (@formatter:off) +```java +graph.addVertex(T.label, "person", T.id, "person/foo"); +``` +[//]: <> (@formatter:on) + +would result in creating a document in the vertex collection `person` with `_key` equals to `foo` (and `_id` +equals to `person/foo`). + +## Naming Constraints + +When using the ArangoDB TinkerPop Provider, be aware that Element IDs must be strings. + +## Persistent Structure + +The ArangoDB TinkerPop Provider maps TinkerPop data structures to ArangoDB data as follows: + +### Vertices + +Vertices are stored as documents in vertex collections. In a `SIMPLE` graph, all vertices are stored in a single +collection, by default named `vertex`. In a `COMPLEX` graph, vertices are stored in collections named +`<label>`. + +Each vertex document contains: + +- Standard ArangoDB fields (`_id`, `_key`, `_rev`) +- Vertex properties as document fields +- Meta-properties nested in the nested map `_meta` + +Additionally, in a `SIMPLE` graph: +- The label field (`_label` by default) + +For example, the following Java code: + +[//]: <> (@formatter:off) +```java +graph + .addVertex("person") + .property("name", "Freddie Mercury") + .property("since", 1970); +``` +[//]: <> (@formatter:on) + +creates a document like this: + +```json +{ + "_key": "4856", + "_id": "vertex/4856", + "_rev": "_kFqmbXK---", + "_label": "person", + "name": "Freddie Mercury", + "_meta": { + "name": { + "since": 1970 + } + } +} +``` + +### Edges + +Edges are stored as documents in edge collections. In a `SIMPLE` graph, all edges are stored in a single collection, by +default named `edge`. In a `COMPLEX` graph, edges are stored in collections named `<label>`. + +Each edge document contains: + +- Standard ArangoDB edge fields (`_id`, `_key`, `_rev`, `_from`, `_to`) +- Edge properties as document fields + +Additionally, in a `SIMPLE` graph: +- The label field (`_label` by default) + +For example, the following Java code: + +[//]: <> (@formatter:off) +```java +Vertex v = graph.addVertex("person"); +v.addEdge("knows", v) + .property("since", 1970); +``` +[//]: <> (@formatter:on) + +creates a document like this: + +```json +{ + "_key": "5338", + "_id": "edge/5338", + "_from": "vertex/5335", + "_to": "vertex/5335", + "_rev": "_kFq20-u---", + "_label": "knows", + "since": 1970 +} +``` + +## Element IDs + +Given a Gremlin element, you can get the corresponding ArangoDB document ID (`_id` field) using the +`ArangoDBGraph.elementId(Element)` method: + +[//]: <> (@formatter:off) +```java +Vertex v = graph.addVertex("name", "marko"); +String id = graph.elementId(v); +``` +[//]: <> (@formatter:on) + +This is useful when you need to reference the element directly in AQL queries. + + +## Query Optimization + +ArangoDB TinkerPop Provider includes an optimization strategy that can push certain Gremlin traversal steps down to +the database layer for improved performance. +This is applied by `com.arangodb.tinkerpop.gremlin.process.traversal.strategy.optimization.ArangoStepStrategy`. + +### HasStep Pushdown + +The optimizer analyzes the traversal steps and attempts to convert filter steps of type +`org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep` into AQL queries that execute directly on the +database. This reduces the amount of data transferred and processed in the client application. + +All Gremlin predefined predicate values from `org.apache.tinkerpop.gremlin.process.traversal.P` are supported: +- **comparison predicates**: `eq`, `neq`, `lt`, `gt`, etc. +- **collection predicates**: `within`, `without` +- **text predicates**: `containing`, `startingWith`, `endingWith`, `regex` +- **logical combinations**: `and`, `or`, `not` + +For example, the following traversal is optimized to execute the filtering logic in ArangoDB using AQL and transferring to the client only the matching +vertices, rather than retrieving all vertices and filtering them in the client. + +[//]: <> (@formatter:off) +```groovy +g.V().has("value", "foo") +``` +[//]: <> (@formatter:on) + +### Disabling Optimization + +If you need to disable the optimization strategy: + +1. **Create a traversal source** without the optimization strategy: + + [//]: <> (@formatter:off) + ```java + GraphTraversalSource g = graph.traversal().withoutStrategies(ArangoStepStrategy.class); + ``` + [//]: <> (@formatter:on) + +2. **Use the traversal source** as normal. All traversals will execute without AQL optimization. + +## AQL Queries + +For complex queries or performance-critical operations, you can use ArangoDB's native query language (AQL) directly: + +[//]: <> (@formatter:off) +```java +List<Vertex> alice = graph + .<Vertex>aql("FOR v IN vertex FILTER v.name == @name RETURN v", Map.of("name", "Alice")) + .toList(); + +// Query using document ID +Vertex v = graph.addVertex("name", "marko"); +String id = graph.elementId(v); +List<Vertex> result = graph + .<Vertex>aql("RETURN DOCUMENT(@id)", Map.of("id", id)) + .toList(); +``` +[//]: <> (@formatter:on) + +## Supported Features + +This library supports the following features: + +```text +> GraphFeatures +>-- Computer: false +>-- Persistence: true +>-- ConcurrentAccess: true +>-- Transactions: false +>-- ThreadedTransactions: false +>-- IoRead: true +>-- IoWrite: true +>-- OrderabilitySemantics: false +>-- ServiceCall: false +> VariableFeatures +>-- Variables: true +>-- LongArrayValues: true +>-- StringArrayValues: true +>-- BooleanValues: true +>-- ByteValues: false +>-- DoubleValues: true +>-- FloatValues: false +>-- IntegerValues: true +>-- LongValues: true +>-- MapValues: true +>-- MixedListValues: true +>-- SerializableValues: false +>-- StringValues: true +>-- UniformListValues: true +>-- BooleanArrayValues: true +>-- ByteArrayValues: false +>-- DoubleArrayValues: true +>-- FloatArrayValues: false +>-- IntegerArrayValues: true +> VertexFeatures +>-- DuplicateMultiProperties: false +>-- AddVertices: true +>-- RemoveVertices: true +>-- MultiProperties: false +>-- MetaProperties: true +>-- Upsert: false +>-- NullPropertyValues: true +>-- AddProperty: true +>-- RemoveProperty: true +>-- UserSuppliedIds: true +>-- NumericIds: false +>-- StringIds: true +>-- UuidIds: false +>-- CustomIds: false +>-- AnyIds: false +> VertexPropertyFeatures +>-- NullPropertyValues: true +>-- RemoveProperty: true +>-- UserSuppliedIds: false +>-- NumericIds: true +>-- StringIds: true +>-- UuidIds: true +>-- CustomIds: true +>-- AnyIds: false +>-- Properties: true +>-- LongArrayValues: true +>-- StringArrayValues: true +>-- BooleanValues: true +>-- ByteValues: false +>-- DoubleValues: true +>-- FloatValues: false +>-- IntegerValues: true +>-- LongValues: true +>-- MapValues: true +>-- MixedListValues: true +>-- SerializableValues: false +>-- StringValues: true +>-- UniformListValues: true +>-- BooleanArrayValues: true +>-- ByteArrayValues: false +>-- DoubleArrayValues: true +>-- FloatArrayValues: false +>-- IntegerArrayValues: true +> EdgeFeatures +>-- Upsert: false +>-- AddEdges: true +>-- RemoveEdges: true +>-- NullPropertyValues: true +>-- AddProperty: true +>-- RemoveProperty: true +>-- UserSuppliedIds: true +>-- NumericIds: false +>-- StringIds: true +>-- UuidIds: false +>-- CustomIds: false +>-- AnyIds: false +> EdgePropertyFeatures +>-- Properties: true +>-- LongArrayValues: true +>-- StringArrayValues: true +>-- BooleanValues: true +>-- ByteValues: false +>-- DoubleValues: true +>-- FloatValues: false +>-- IntegerValues: true +>-- LongValues: true +>-- MapValues: true +>-- MixedListValues: true +>-- SerializableValues: false +>-- StringValues: true +>-- UniformListValues: true +>-- BooleanArrayValues: true +>-- ByteArrayValues: false +>-- DoubleArrayValues: true +>-- FloatArrayValues: false +>-- IntegerArrayValues: true +``` + +## Current Limitations + +- This library implements the Online Transactional Processing Graph Systems (OLTP) API only. The Online Analytics Processing Graph Systems (OLAP) API is currently not implemented. +- Some generated queries might not be optimized, since the Process API is only partially implemented (see [Query Optimization](#query-optimization)). For optimal query performance is recommended to use [AQL queries](#aql-queries). + +## Logging + +The library uses the `slf4j` API for logging. To log requests and responses to and from the database, enable the `DEBUG` log level for the logger `com.arangodb.internal.net.Communication`. + +## Examples and Demo + +The [demo](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/demo) project contains comprehensive usage examples of this library. + +For additional examples, check +the [Gremlin tutorial](https://tinkerpop.apache.org/docs/3.7.4/tutorials/getting-started/). + +## Acknowledgments + +This repository is based on and extends the original work of +the [arangodb-community/arangodb-tinkerpop-provider](https://github.com/arangodb-community/arangodb-tinkerpop-provider) +project. + +We gratefully acknowledge the efforts of [Horacio Hoyos Rodriguez](https://github.com/arcanefoam) and other contributors +of the community repository, see [AUTHORS.md](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/AUTHORS.md). diff --git a/site/content/arangodb/3.12/features/list.md b/site/content/arangodb/3.12/features/list.md index 3641e428b8..ca558677d2 100644 --- a/site/content/arangodb/3.12/features/list.md +++ b/site/content/arangodb/3.12/features/list.md @@ -150,11 +150,9 @@ available from v3.12.5 onward. threshold is reached. {{% /comment %}} -{{% comment %}} Experimental feature - [**Vector search**](../index-and-search/indexing/working-with-indexes/vector-indexes.md): Find items with similar properties by comparing vector embeddings generated by machine learning models. -{{% /comment %}} - [**Search highlighting**](../index-and-search/arangosearch/search-highlighting.md): Get the substring positions of matched terms, phrases, or _n_-grams. diff --git a/site/content/arangodb/3.12/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/3.12/index-and-search/indexing/which-index-to-use-when.md index ec36b3d532..fcedb87747 100644 --- a/site/content/arangodb/3.12/index-and-search/indexing/which-index-to-use-when.md +++ b/site/content/arangodb/3.12/index-and-search/indexing/which-index-to-use-when.md @@ -175,11 +175,11 @@ db.collection.ensureIndex({ type: "persistent", fields: [ "attributeName1", "att When not explicitly set, the `sparse` attribute defaults to `false` for new indexes. Indexes other than persistent do not support the `sparse` option. -As sparse indexes may exclude some documents from the collection, they cannot be used for -all types of queries. Sparse hash indexes cannot be used to find documents for which at -least one of the indexed attributes has a value of `null`. For example, the following AQL -query cannot use a sparse index, even if one was created on attribute `attr`: -<!-- TODO Remove above statement? --> +As sparse indexes may exclude some documents from the collection, they cannot +be used for all types of queries. For example, sparse persistent indexes cannot +be used to find documents for which at least one of the indexed attributes +is missing or has a value of `null`. For example, the following AQL +query cannot use a sparse index over the attribute `attr`: ```aql FOR doc In collection @@ -189,15 +189,25 @@ FOR doc In collection If the lookup value is non-constant, a sparse index may or may not be used, depending on the other types of conditions in the query. If the optimizer can safely determine that -the lookup value cannot be `null`, a sparse index may be used. When uncertain, the optimizer -does not make use of a sparse index in a query in order to produce correct results. +the lookup value cannot be `null`, a sparse index may be used. + +```aql +FOR doc In collection + LET random = RAND() * 5 + FILTER doc.attr < random // Includes numbers < random but also true, false, and null! + FILTER doc.attr != null // Explicitly exclude null to make a sparse index eligible + RETURN doc +``` + +When uncertain, the optimizer does not make use of a sparse index in a query in +order to produce correct results. For example, the following queries cannot use a sparse index on `attr` because the optimizer does not know beforehand whether the values which are compared to `doc.attr` include `null`: ```aql FOR doc In collection - FILTER doc.attr == SOME_FUNCTION(...) + FILTER doc.attr == SOME_FUNCTION(...) RETURN doc ``` diff --git a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md index a3e1fbf1bb..77fc3151ba 100644 --- a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -14,27 +14,24 @@ data numerically and can be generated with machine learning models. You can then quickly find a given number of semantically similar documents by searching for close neighbors in a high-dimensional vector space. -The vector index implementation uses the [Faiss library](https://github.com/facebookresearch/faiss/) -to support L2 and cosine metrics. The index used is IndexIVFFlat, the quantizer -for L2 is IndexFlatL2, and the cosine uses IndexFlatIP, where vectors are -normalized before insertion and search. +The vector index implementation uses the [Faiss library](https://github.com/facebookresearch/faiss/). ## How to use vector indexes {{< warning >}} -The vector index is an experimental feature that you need to enable for the -ArangoDB server with the `--experimental-vector-index` startup option. +You need to enable the vector index feature for the +ArangoDB server with the `--vector-index` startup option. Once enabled for a deployment, it cannot be disabled anymore because it permanently changes how the data is managed by the RocksDB storage engine (it adds an additional column family). -To restore a dump that contains vector indexes, the `--experimental-vector-index` +To restore a dump that contains vector indexes, the `--vector-index` startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} -1. Enable the experimental vector index feature. -2. Calculate vector embeddings using [ArangoDB's GraphML](../../../../../gen-ai/graphml/_index.md) - capabilities (available in ArangoGraph) or using external tools. +1. Enable the vector index feature. +2. Calculate vector embeddings using [Arango's GraphML](../../../../../gen-ai/graphml/_index.md) + capabilities (available in the AI Services Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which similarity metric you want to use later for querying. See @@ -65,17 +62,26 @@ centroids and the quality of vector search thus degrades. - **fields** (array of strings): A list with a single attribute path to specify where the vector embedding is stored in each document. The vector data needs to be populated before creating the index. - + If you want to index another vector embedding attribute, you need to create a separate vector index. +- **sparse** (boolean): Whether to create a sparse index that excludes documents + with the attribute for indexing missing or set to `null`. This attribute is + defined by `fields`. Default: `false`. - **parallelism** (number): - The number of threads to use for indexing. The default is `2`. + The number of threads to use for indexing. Default: `2`. - **inBackground** (boolean): Set this option to `true` to keep the collection/shards available for write operations by not using an exclusive write lock for the duration - of the index creation. The default is `false`. + of the index creation. Default: `false`. - **params**: The parameters as used by the Faiss library. - - **metric** (string): Whether to use `cosine` or `l2` (Euclidean) distance calculation. + - **metric** (string): The measure for calculating the vector similarity: + - `"cosine"`: Angular similarity. Vectors are automatically + normalized before insertion and search. + - `"innerProduct"` (introduced in v3.12.6): + Similarity in terms of angle and magnitude. + Vectors are not normalized, making it faster than `cosine`. + - `"l2":` Euclidean distance. - **dimension** (number): The vector dimension. The attribute to index needs to have this many elements in the array that stores the vector embedding. - **nLists** (number): The number of Voronoi cells to partition the vector space @@ -89,11 +95,11 @@ centroids and the quality of vector search thus degrades. number of documents. - **defaultNProbe** (number, _optional_): How many neighboring centroids to consider for the search results by default. The larger the number, the slower - the search but the better the search results. The default is `1`. You should + the search but the better the search results. Default: `1`. You should generally use a higher value here or per query via the `nProbe` option of the vector similarity functions. - **trainingIterations** (number, _optional_): The number of iterations in the - training process. The default is `25`. Smaller values lead to a faster index + training process. Default: `25`. Smaller values lead to a faster index creation but may yield worse search results. - **factory** (string, _optional_): You can specify an index factory string that is forwarded to the underlying Faiss library, allowing you to combine different @@ -115,7 +121,6 @@ centroids and the quality of vector search thus degrades. {{< tabs "interfaces" >}} {{< tab "Web interface" >}} -{{< comment >}}TODO: Only in v3.12.6+ 1. In the **Collections** section, click the name or row of the desired collection. 2. Go to the **Indexes** tab. 3. Click **Add index**. @@ -125,8 +130,6 @@ centroids and the quality of vector search thus degrades. under `param`. 7. Optionally give the index a user-defined name. 8. Click **Create**. -{{< /comment >}} -The web interface does not support vector indexes yet. {{< /tab >}} {{< tab "arangosh" >}} diff --git a/site/content/arangodb/3.12/release-notes/version-3.12/api-changes-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/api-changes-in-3-12.md index 67e72e191d..989fc09923 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.12/api-changes-in-3-12.md +++ b/site/content/arangodb/3.12/release-notes/version-3.12/api-changes-in-3-12.md @@ -309,6 +309,17 @@ is for debugging purposes. See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +#### AQL query recording + +<small>Introduced in: v3.12.6</small> + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted queries. This feature is for debugging purposes. + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + #### Access tokens <small>Introduced in: v3.12.5</small> @@ -452,11 +463,11 @@ add the `withHidden=true` query parameter to the call of the endpoint. curl "http://localhost:8529/_api/index?collection=myCollection&withHidden=true" ``` -#### Vector indexes (experimental) +#### Vector indexes <small>Introduced in: v3.12.4</small> -A new `vector` index type has been added as an experimental feature. +A new `vector` index type has been added. See [HTTP interface for vector indexes](../../develop/http-api/indexes/vector.md) for details. diff --git a/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md index 696a7d8fc2..c04a497483 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md +++ b/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md @@ -320,6 +320,15 @@ per-query limit with the [`memoryLimit` query option](../../aql/how-to-invoke-aq or its default using the `--query.memory-limit` startup option. You can adjust the global limit with the `--query.global-memory-limit` startup option. +--- + +<small>Introduced in: v3.12.6</small> + +The memory accounting for AQL queries has been extended to track the memory usage +of the `MERGE()` function, `RETURN DISTINCT`, and certain uses of the `COLLECT` +operation. More queries compared to previous 3.12 versions may get killed due to +exceeding the memory limit as a result of the improved tracking. + ## Adjustable Stream Transaction size [Stream Transactions](../../develop/transactions/stream-transactions.md) may @@ -900,6 +909,76 @@ the following steps. 4. Restore the dump to the new deployment. You can directly move from any 3.11 or 3.12 version to 3.12.4 (or later) this way. +## RocksDB upgrade + +<small>Introduced in: v3.12.6</small> + +The RocksDB library has been upgraded from version 7.2.0 to 9.5.0. + +As part of this storage engine upgrade, the default values of the following +RocksDB-related startup options have been changed: + +- `--rocksdb.pending-compactions-slowdown-trigger` has been changed from 128 KiB to 1 GiB. +- `--rocksdb.pending-compactions-stop-trigger` has been changed from 16 GiB to 32 GiB. +- `--rocksdb.partition-files-for-documents` has been changed from false to true. +- `--rocksdb.throttle-slow-down-writes-trigger` has been obsoleted. + +## Optional elevation for GeoJSON Points + +<small>Introduced in: v3.11.14-2, v3.12.6</small> + +GeoJSON Point may now have three coordinates: `[longitude, latitude, elevation]`. +However, ArangoDB does not take any elevation into account in geo-spatial +calculations. + +Points with an elevation do no longer fail the validation in the `GEO_POLYGON()` +and `GEO_MULTIPOLYGON()` functions. Moreover, GeoJSON with three coordinates is +now indexed by geo indexes and thus also matched by geo-spatial queries, which +means you may find more results than before. + +Also see [Geo-spatial functions in AQL](../../aql/functions/geo.md). + +## Additional validation by AQL GeoJSON functions + +<small>Introduced in: v3.12.6</small> + +The following AQL functions to construct GeoJSON objects now validate that the +provided input uses either two or three coordinates for every point +(`[longitude, latitude]` or `[longitude, latitude, elevation]`): + +- `GEO_MULTIPOINT()` +- `GEO_LINESTRING()` +- `GEO_MULTILINESTRING()` + +For example, the following function calls now fail to validate and raise a +warning because of invalid points in the data: + +```aql +GEO_MULTIPOINT([[1], [2,3]]) +GEO_LINESTRING([[1,2], []]) +GEO_MULTILINESTRING([[[1,2,3,4],[5,6]],[[7,8],[9,0]]]) +``` + +## Cosine similarity fix for vector indexes + +<small>Introduced in: v3.12.6</small> + +A normalization issue has been addressed for the experimental vector index type. +It was possible for the cosine similarity value returned by `APPROX_NEAR_COSINE()` +to be outside the expected range of `[-1, 1]`. + +It is recommended to recreate all vector indexes that use the `cosine` metric +after upgrading to v3.12.6 or later. + +## Added error reporting for invalid requests + +<small>Introduced in: v3.12.6</small> + +When _arangod_ parses HTTP requests and encounters an unexpected `Content-Length` +header or an invalid URL, it now sends a response with an error object instead +of closing the connection, e.g. that the URL is corrupt with an HTTP status code +of 400. + ## HTTP RESTful API ### JavaScript-based traversal using `/_api/traversal` removed @@ -1075,6 +1154,16 @@ background compactions. The changed default ensures this cleanup to happen more frequently. Compactions can potentially lead to spikes in CPU, memory, and I/O usage. You may now observe this daily instead of monthly. +### RocksDB transaction lock timeout controlled internally + +<small>Deprecated in: v3.12.6</small> + +The `--rocksdb.transaction-lock-timeout` startup option has been deprecated. +It was supposed to let you configure the wait timeout in milliseconds for +locking a document in a transaction. However, the lock timeout is actually set +to differnet values internally, depending on what is a meaningful timeout for +a given case. + ## Client tools ### arangodump diff --git a/site/content/arangodb/3.12/release-notes/version-3.12/whats-new-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/whats-new-in-3-12.md index 9dc4aee978..b5fdc5616f 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.12/whats-new-in-3-12.md +++ b/site/content/arangodb/3.12/release-notes/version-3.12/whats-new-in-3-12.md @@ -180,6 +180,24 @@ The following new metrics have been added for memory observability: | `arangodb_transactions_internal_memory_usage` | Total memory usage of internal transactions. | | `arangodb_transactions_rest_memory_usage` | Total memory usage of user transactions (excluding top-level AQL queries). | +--- + +<small>Introduced in: v3.12.6</small> + +The memory accounting for AQL queries has been extended to track the memory usage +of the following: + +- Grouping with the `COLLECT` operation if the `sorted` method is used. +- Aggregating with `COLLECT ... AGGREGATE`. +- Deduplicating results with `RETURN DISTINCT`. +- Using the `MERGE()` function to combine objects. +- Internal buffers for execution blocks, late materialization, building results, + and distributing AQL queries in cluster deployments. +- Internal buffers for decay, distance, and replace functions. +- Internal buffers used by the query parser and optimizer. + +It is expected that the reported memory consumption is now higher. + ## Web interface ### Shard rebalancing @@ -1293,6 +1311,68 @@ Indexes used: 10 idx_1836452431376941056 persistent coll ``` +### Deduction of node collection for graph queries + +<small>Introduced in: v3.12.6</small> + +AQL graph traversals and path searches using anonymous graphs / collection sets +require that you declare all involved node collections upfront for cluster +deployments. That is, you need to use the `WITH` operation to list the collections +edges may point to, as well as the collection of the start node if not declared +otherwise. This also applies to single servers if the `--query.require-with` +startup option is enabled for parity between both deployment modes. + +For example, assume you have two node collections, `person` and `movie`, and +edges pointing from one to the other stored in an `acts_in` edge collection. +If you want to run a traversal query starting from a person that you specify +with its document ID, you need to declare both node collections at the +beginning of the query: + +```aql +WITH person, movie +FOR v IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label +``` + +From v3.12.6 onward, the node collections can be automatically inferred if there +is a named graph using the same edge collection(s). + +For example, assume there is a named graph that includes an edge definition for +the `acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection. If you now specify `acts_in` as an edge collection in +an anonymous graph query, all named graphs are checked for this edge collection, +and if there is a matching edge definition, its node collections are automatically +added as data sources to the query. You no longer have to manually declare the +`person` and `movie` collections: + +```aql +FOR v IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. + +### Optional elevation for GeoJSON Points + +<small>Introduced in: v3.11.14-2, v3.12.6</small> + +The `GEO_POINT()` function now accepts an optional third argument to create a +GeoJSON Point with three coordinates: `[longitude, latitude, elevation]`. + +GeoJSON Points may now have three coordinates in general. +However, ArangoDB does not take any elevation into account in geo-spatial +calculations. + +Points with an elevation do no longer fail the validation in the `GEO_POLYGON()` +and `GEO_MULTIPOLYGON()` functions. Moreover, GeoJSON with three coordinates is +now indexed by geo indexes and thus also matched by geo-spatial queries, which +means you may find more results than before. + +Also see [Geo-spatial functions in AQL](../../aql/functions/geo.md). + ## Indexing ### Multi-dimensional indexes @@ -1405,18 +1485,18 @@ Note that it is still forbidden to use `_id` as a top-level attribute or sub-attribute in `fields` of persistent indexes. On the other hand, inverted indexes have been allowing to index and store the `_id` system attribute. -### Vector indexes (experimental) +### Vector indexes <small>Introduced in: v3.12.4</small> -A new `vector` index type has been added as an experimental feature that enables +A new `vector` index type has been added that enables you to find items with similar properties by comparing vector embeddings, which are numerical representations generated by machine learning models. -To try out this feature, start an ArangoDB server (`arangod`) with the -`--experimental-vector-index` startup option. You need to generate -vector embeddings before creating a vector index. For more information about -the vector index type including the available settings, see the +To use this feature, start an ArangoDB server (`arangod`) with the `--vector-index` +startup option (or `--experimental-vector-index` in v3.12.4 and v3.12.5). +You need to generate vector embeddings before creating a vector index. For more +information about the vector index type including the available settings, see the [Vector indexes](../../index-and-search/indexing/working-with-indexes/vector-indexes.md) documentation. @@ -1443,6 +1523,34 @@ utilizing vector indexes in queries. Furthermore, a new error code `ERROR_QUERY_VECTOR_SEARCH_NOT_APPLIED` (1554) has been added. +--- + +<small>Introduced in: v3.12.6</small> + +Vector indexes now support filtering. You can add `FILTER` operations between +`FOR` and `SORT` that are then applied during the lookup in the vector index. +Note that e.g. `LIMIT 5` does not ensure that you get 5 results by searching +as many neighboring Voronoi cells as necessary, but it rather considers only as +many as configured via the `nProbes` parameter. Example: + +```aql +FOR doc IN coll + FILTER doc.val > 3 + SORT APPROX_NEAR_COSINE(doc.vector, @q) DESC + LIMIT 5 + RETURN doc +``` + +Vector indexes can now be sparse to exclude documents with the embedding attribute +for indexing missing or set to `null`. + +Another metric has been added. The `innerProduct` is a vector similarity measure +calculated using the dot product of two vectors without normalizing them. +Therefore, it compares not only the angle but also the magnitudes. +The accompanying AQL function is the following: + +- `APPROX_NEAR_INNER_PRODUCT()` + ## Server options ### Effective and available startup options @@ -2211,6 +2319,40 @@ DB-Servers in a cluster has been added: |:------|:------------| | `arangodb_vocbase_transactions_lost_subordinates_total` | Counts the number of lost subordinate transactions on database servers. | +### RocksDB upgrade + +<small>Introduced in: v3.12.6</small> + +The RocksDB library has been upgraded from version 7.2.0 to 9.5.0. + +As a result, you may see performance improvements while using slightly less +resources especially for mixed workloads. + +The following new RocksDB functionality is exposed in ArangoDB: + +- Different types of block caches, LRU and HyperClockCache (HCC), selectable via + the new `--rocksdb.block-cache-type` startup option +- A `--rocksdb.block-cache-estimated-entry-charge` startup option to configure the HCC. +- RocksDB table format version 6 (not downwards-compatible to older versions of RocksDB). +- RocksDB blob caching (if blobs are enabled for the documents column family), + which you can enable via `--rocksdb.enable-blob-cache`. +- Using blob files only from a certain level onwards (if blobs are enabled for + the documents column family), which you can enable via + `--rocksdb.blob-file-starting-level`. +- Blob cache prepopulation, which you can enable via `--rocksdb.prepopulate-blob-cache`. +- An option to generate Bloom/Ribbon filters that minimize memory internal + fragmentation, which you can enable with `--rocksdb.optimize-filters-for-memory`. + +The following RocksDB metrics have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_block_cache_charge_per_entry` | Average size of entries in RocksDB block cache. +| `rocksdb_block_cache_entries` | Number of entries in the RocksDB block cache. +| `rocksdb_live_blob_file_garbage_size` | Size of garbage in live RocksDB .blob files. +| `rocksdb_live_blob_file_size` | Size of live RocksDB .blob files. +| `rocksdb_num_blob_files` | Number of live RocksDB .blob files. + ### API call recording <small>Introduced in: v3.12.5</small> @@ -2222,9 +2364,9 @@ is for debugging purposes. You can configure the memory limit for this feature with the following startup option: - `--server.api-recording-memory-limit`: - Size limit for the list of API call records (default: `25600000`). + Size limit for the list of API call records (default: `26214400`). -This means that 25 MB of memory is reserved by default. +This means that 25 MiB of memory is reserved by default. API call recording is enabled by default but you can disable it via the new `--server.api-call-recording` startup option. @@ -2243,6 +2385,41 @@ impact of this feature: See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +### AQL query recording + +<small>Introduced in: v3.12.6</small> + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted query. This feature is for debugging purposes. + +You can configure the memory limit for this feature with the following startup option: + +- `--server.aql-recording-memory-limit`: + Size limit for the list of AQL query records (default: `26214400` bytes) + +This means that 25 MiB of memory is reserved by default. + +AQL query recording is enabled by default but you can disable it via the new +`--server.aql-query-recording` startup option. + +This and the `/_admin/server/api-calls` endpoint are referred to as the +recording API, which exposes the recorded API calls and AQL queries. It is +enabled by default. Users with administrative access to the `_system` database +can call the endpoints. You can further restrict the access to only the +superuser by setting `--log.recording-api-enabled` to `jwt`, or disable the +endpoints altogether by setting the option to `false`. + +A metric has been added for the time spent on AQL query recording to track the +impact of this feature: + +| Label | Description | +|:------|:------------| +| `arangodb_aql_recording_call_time` | Execution time histogram for AQL recording calls in nanoseconds. | + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + ### Access tokens <small>Introduced in: v3.12.5</small> @@ -2257,6 +2434,24 @@ dates, and individually revoke tokens. See the [HTTP API](../../develop/http-api/authentication.md#access-tokens) documentation. +### `@PID@` and `@TEMP_BASE_DIR@` placeholders for startup options + +<small>Introduced in: v3.12.6</small> + +You can use special placeholders in startup options like `--log.output` that get +substituted as follows: + +- `@PID@`: Replaced at runtime with the actual process ID. This has already + been supported using a literal occurrence of `$PID`. +- `@TEMP_BASE_DIR@`: Replaced at runtime with the current temporary directory, + e.g. `/tmp/arangodb_i37Xxh` (automatically created on startup with a randomly + generated suffix). + +Keep in mind that `@NAME@` is also the syntax for using the value of an +environment variable `NAME`. If there is an environment variable called `PID` or +`TEMP_BASE_DIR`, then `@PID@` or `@TEMP_BASE_DIR@` is substituted with the +value of the respective environment variable. + ## Client tools ### Protocol aliases for endpoints diff --git a/site/content/arangodb/3.13/aql/functions/geo.md b/site/content/arangodb/3.13/aql/functions/geo.md index cf5b3f8a2d..71820df92a 100644 --- a/site/content/arangodb/3.13/aql/functions/geo.md +++ b/site/content/arangodb/3.13/aql/functions/geo.md @@ -71,9 +71,9 @@ called `location` (with coordinates in `[longitude, latitude]` order): GeoJSON uses a geographic coordinate reference system, World Geodetic System 1984 (WGS 84), and units of decimal degrees. -Internally ArangoDB maps all coordinate pairs onto a unit sphere. Distances are -projected onto a sphere with the Earth's *Volumetric mean radius* of *6371 -km*. ArangoDB implements a useful subset of the GeoJSON format +Internally, ArangoDB maps all coordinate pairs onto a unit sphere. Distances are +projected onto a sphere with the Earth's *Volumetric mean radius* of +*6371 km*. ArangoDB implements a useful subset of the GeoJSON format [(RFC 7946)](https://tools.ietf.org/html/rfc7946). Feature Objects and the GeometryCollection type are not supported. Supported geometry object types are: @@ -98,6 +98,18 @@ a longitude and a latitude: } ``` +GeoJSON Points can optionally have a third coordinate for the elevation, but +ArangoDB doesn't use it in calculations: + +```json +{ + "location": { + "type": "Point", + "coordinates": [ 100.0, 0.0, 43.0 ] + } +} +``` + #### MultiPoint A [GeoJSON MultiPoint](https://tools.ietf.org/html/rfc7946#section-3.1.7) is @@ -425,11 +437,11 @@ fully contains `geoJsonB` (every point in B is also in A). The object `geoJsonA` has to be of type _Polygon_ or _MultiPolygon_. For other types containment is not well-defined because of numerical stability problems. -- **geoJsonA** (object): first GeoJSON object -- **geoJsonB** (object): second GeoJSON object, or a coordinate array in - `[longitude, latitude]` order +- **geoJsonA** (object): First GeoJSON object. +- **geoJsonB** (object): Second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. - returns **bool** (bool): `true` if every point in B is also contained in A, - otherwise `false` + otherwise `false`. {{< info >}} ArangoDB follows and exposes the same behavior as the underlying @@ -468,14 +480,14 @@ Return the distance between two GeoJSON objects in meters, measured from the **centroid** of each shape. For a list of supported types see the [geo index page](#geojson). -- **geoJsonA** (object): first GeoJSON object, or a coordinate array in - `[longitude, latitude]` order -- **geoJsonB** (object): second GeoJSON object, or a coordinate array in - `[longitude, latitude]` order -- **ellipsoid** (string, *optional*): reference ellipsoid to use. +- **geoJsonA** (object): First GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. +- **geoJsonB** (object): Second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. +- **ellipsoid** (string, *optional*): Reference ellipsoid to use. Supported are `"sphere"` (default) and `"wgs84"`. -- returns **distance** (number): the distance between the centroid points of - the two objects on the reference ellipsoid in **meters** +- returns **distance** (number): The distance between the centroid points of + the two objects on the reference ellipsoid in **meters**. ```aql LET polygon = { @@ -522,10 +534,10 @@ functions. Return the area for a [Polygon](#polygon) or [MultiPolygon](#multipolygon) on a sphere with the average Earth radius, or an ellipsoid. -- **geoJson** (object): a GeoJSON object -- **ellipsoid** (string, *optional*): reference ellipsoid to use. +- **geoJson** (object): A GeoJSON object. +- **ellipsoid** (string, *optional*): Reference ellipsoid to use. Supported are `"sphere"` (default) and `"wgs84"`. -- returns **area** (number): the area of the polygon in **square meters** +- returns **area** (number): The area of the polygon in **square meters**. ```aql LET polygon = { @@ -541,8 +553,8 @@ RETURN GEO_AREA(polygon, "wgs84") Checks whether two [GeoJSON objects](#geojson) are equal or not. -- **geoJsonA** (object): first GeoJSON object. -- **geoJsonB** (object): second GeoJSON object. +- **geoJsonA** (object): First GeoJSON object. +- **geoJsonB** (object): Second GeoJSON object. - returns **bool** (bool): `true` if they are equal, otherwise `false`. ```aql @@ -572,10 +584,10 @@ RETURN GEO_EQUALS(polygonA, polygonB) // false Checks whether the [GeoJSON object](#geojson) `geoJsonA` intersects with `geoJsonB` (i.e. at least one point in B is also in A or vice-versa). -- **geoJsonA** (object): first GeoJSON object -- **geoJsonB** (object): second GeoJSON object, or a coordinate array in - `[longitude, latitude]` order -- returns **bool** (bool): true if B intersects A, false otherwise +- **geoJsonA** (object): First GeoJSON object. +- **geoJsonB** (object): Second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order. +- returns **bool** (bool): `true` if B intersects A, `false` otherwise. You can optimize queries that contain a `FILTER` expression of the following form with an S2-based [geospatial index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): @@ -604,19 +616,19 @@ Checks whether the distance between two [GeoJSON objects](#geojson) lies within a given interval. The distance is measured from the **centroid** of each shape. -- **geoJsonA** (object\|array): first GeoJSON object, or a coordinate array - in `[longitude, latitude]` order -- **geoJsonB** (object\|array): second GeoJSON object, or a coordinate array - in `[longitude, latitude]` order -- **low** (number): minimum value of the desired range -- **high** (number): maximum value of the desired range -- **includeLow** (bool, optional): whether the minimum value shall be included +- **geoJsonA** (object\|array): First GeoJSON object, or a coordinate array + in `[longitude, latitude]` order. +- **geoJsonB** (object\|array): Second GeoJSON object, or a coordinate array + in `[longitude, latitude]` order. +- **low** (number): Minimum value of the desired range. +- **high** (number): Maximum value of the desired range. +- **includeLow** (bool, optional): Whether the minimum value shall be included in the range (left-closed interval) or not (left-open interval). The default - value is `true` -- **includeHigh** (bool): whether the maximum value shall be included in the + value is `true`. +- **includeHigh** (bool): Whether the maximum value shall be included in the range (right-closed interval) or not (right-open interval). The default value - is `true` -- returns **bool** (bool): whether the evaluated distance lies within the range + is `true`. +- returns **bool** (bool): Whether the evaluated distance lies within the range. ### IS_IN_POLYGON() @@ -630,10 +642,10 @@ favor of the new [`GEO_CONTAINS()` AQL function](#geo_contains), which works wit `IS_IN_POLYGON(polygon, latitude, longitude) → bool` -- **polygon** (array): an array of arrays with 2 elements each, representing the - points of the polygon in the format `[latitude, longitude]` -- **latitude** (number): the latitude of the point to search -- **longitude** (number): the longitude of the point to search +- **polygon** (array): An array of arrays with two elements each, representing the + points of the polygon in the format `[latitude, longitude]`. +- **latitude** (number): The latitude of the point to search for. +- **longitude** (number): The longitude of the point to search for. - returns **bool** (bool): `true` if the point (`[latitude, longitude]`) is inside the `polygon` or `false` if it's not. The result is undefined (can be `true` or `false`) if the specified point is exactly on a boundary of the @@ -648,17 +660,17 @@ IS_IN_POLYGON( [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ] ], 4, 7 ) `IS_IN_POLYGON(polygon, coord, useLonLat) → bool` -The 2nd parameter can alternatively be specified as an array with two values. +The second parameter can alternatively be specified as an array with two values. By default, each array element in `polygon` is expected to be in the format -`[latitude, longitude]`. This can be changed by setting the 3rd parameter to `true` to +`[latitude, longitude]`. This can be changed by setting the third parameter to `true` to interpret the points as `[longitude, latitude]`. `coord` is then also interpreted in the same way. -- **polygon** (array): an array of arrays with 2 elements each, representing the - points of the polygon -- **coord** (array): the point to search as a numeric array with two elements -- **useLonLat** (bool, *optional*): if set to `true`, the coordinates in +- **polygon** (array): An array of arrays with 2 elements each, representing the + points of the polygon. +- **coord** (array): The point to search as a numeric array with two elements. +- **useLonLat** (bool, *optional*): If set to `true`, the coordinates in `polygon` and the coordinate pair `coord` are interpreted as `[longitude, latitude]` (like in GeoJSON). The default is `false` and the format `[latitude, longitude]` is expected. @@ -687,8 +699,9 @@ will help you to make all your AQL queries shorter and easier to read. Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs. -- **points** (array): an array of `[longitude, latitude]` pairs -- returns **geoJson** (object): a valid GeoJSON LineString +- **points** (array): An array of `[longitude, latitude]` pairs, or optionally + `[longitude, latitude, elevation]`. +- returns **geoJson** (object): A valid GeoJSON LineString. ```aql --- @@ -707,8 +720,9 @@ RETURN GEO_LINESTRING([ Construct a GeoJSON MultiLineString. Needs at least two elements consisting valid LineStrings coordinate arrays. -- **points** (array): array of LineStrings -- returns **geoJson** (object): a valid GeoJSON MultiLineString +- **points** (array): An array of arrays of `[longitude, latitude]` pairs, + or optionally `[longitude, latitude, elevation]`. +- returns **geoJson** (object): A valid GeoJSON MultiLineString. ```aql --- @@ -727,8 +741,9 @@ RETURN GEO_MULTILINESTRING([ Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs. -- **points** (array): an array of `[longitude, latitude]` pairs -- returns **geoJson** (object): a valid GeoJSON Point +- **points** (array): An array of `[longitude, latitude]` pairs, or optionally + `[longitude, latitude, elevation]`. +- returns **geoJson** (object): A valid GeoJSON Point. ```aql --- @@ -742,13 +757,15 @@ RETURN GEO_MULTIPOINT([ ### GEO_POINT() -`GEO_POINT(longitude, latitude) → geoJson` +`GEO_POINT(longitude, latitude, elevation) → geoJson` Construct a valid GeoJSON Point. -- **longitude** (number): the longitude portion of the point -- **latitude** (number): the latitude portion of the point -- returns **geoJson** (object): a GeoJSON Point +- **longitude** (number): The longitude portion of the point. +- **latitude** (number): The latitude portion of the point. +- **elevation** (number, *optional*): The elevation portion of the point + (introduced in v3.11.14-2 and v3.12.6). +- returns **geoJson** (object): A valid GeoJSON Point. ```aql --- @@ -769,8 +786,9 @@ any subsequent linear ring will be interpreted as holes. For details about the rules, see [GeoJSON polygons](#polygon). -- **points** (array): an array of (arrays of) `[longitude, latitude]` pairs -- returns **geoJson** (object\|null): a valid GeoJSON Polygon +- **points** (array): An array of (arrays of) `[longitude, latitude]` pairs, + or optionally `[longitude, latitude, elevation]`. +- returns **geoJson** (object\|null): A valid GeoJSON Polygon. A validation step is performed using the S2 geometry library. If the validation is not successful, an AQL warning is issued and `null` is @@ -809,8 +827,9 @@ Construct a GeoJSON MultiPolygon. Needs at least two Polygons inside. See [`GEO_POLYGON()`](#geo_polygon) and [GeoJSON MultiPolygon](#multipolygon) for the rules of Polygon and MultiPolygon construction. -- **polygons** (array): an array of arrays of arrays of `[longitude, latitude]` pairs -- returns **geoJson** (object\|null): a valid GeoJSON MultiPolygon +- **polygons** (array): An array of arrays of arrays of `[longitude, latitude]` + pairs, or optionally `[longitude, latitude, elevation]`. +- returns **geoJson** (object\|null): A valid GeoJSON MultiPolygon. A validation step is performed using the S2 geometry library, if the validation is not successful, an AQL warning is issued and `null` is @@ -860,31 +879,31 @@ FOR doc IN coll RETURN doc ``` Assuming there exists a geo-type index on `latitude` and `longitude`, the -optimizer will recognize it and accelerate the query. +optimizer recognizes it and accelerates the query. {{< /warning >}} `NEAR(coll, latitude, longitude, limit, distanceName) → docArray` -Return at most *limit* documents from collection *coll* that are near -*latitude* and *longitude*. The result contains at most *limit* documents, +Return at most `limit` documents from collection `coll` that are near +`latitude` and `longitude`. The result contains at most `limit` documents, returned sorted by distance, with closest distances being returned first. Optionally, the distances in meters between the specified coordinate pair -(*latitude* and *longitude*) and the stored coordinate pairs can be returned as +(`latitude` and `longitude`) and the stored coordinate pairs can be returned as well. To make use of that, the desired attribute name for the distance result -has to be specified in the *distanceName* argument. The result documents will -contain the distance value in an attribute of that name. - -- **coll** (collection): a collection -- **latitude** (number): the latitude of the point to search -- **longitude** (number): the longitude of the point to search -- **limit** (number, *optional*): cap the result to at most this number of - documents. The default is 100. If more documents than *limit* are found, - it is undefined which ones will be returned. -- **distanceName** (string, *optional*): include the distance (in meters) +has to be specified in the `distanceName` argument. The result documents +contains the distance value in an attribute of that name. + +- **coll** (collection): A collection. +- **latitude** (number): The latitude of the point to search for. +- **longitude** (number): The longitude of the point to search for. +- **limit** (number, *optional*): Cap the result to at most this number of + documents. The default is `100`. If more documents than `limit` are found, + it is undefined which ones are returned. +- **distanceName** (string, *optional*): Include the distance (in meters) between the reference point and the stored point in the result, using the - attribute name *distanceName* -- returns **docArray** (array): an array of documents, sorted by distance - (shortest distance first) + attribute name `distanceName`. +- returns **docArray** (array): An array of documents, sorted by distance + (shortest distance first). ### WITHIN() @@ -901,29 +920,29 @@ FOR doc IN coll ``` Assuming there exists a geo-type index on `latitude` and `longitude`, the -optimizer will recognize it and accelerate the query. +optimizer recognizes it and accelerates the query. {{< /warning >}} `WITHIN(coll, latitude, longitude, radius, distanceName) → docArray` -Return all documents from collection *coll* that are within a radius of *radius* -around the specified coordinate pair (*latitude* and *longitude*). The documents +Return all documents from collection `coll` that are within a radius of `radius` +around the specified coordinate pair (`latitude` and `longitude`). The documents returned are sorted by distance to the reference point, with the closest distances being returned first. Optionally, the distance (in meters) between the reference point and the stored point can be returned as well. To make use of that, an attribute name for the distance result has to be specified in -the *distanceName* argument. The result documents will contain the distance +the `distanceName` argument. The result documents contains the distance value in an attribute of that name. -- **coll** (collection): a collection -- **latitude** (number): the latitude of the point to search -- **longitude** (number): the longitude of the point to search -- **radius** (number): radius in meters -- **distanceName** (string, *optional*): include the distance (in meters) +- **coll** (collection): A collection. +- **latitude** (number): The latitude of the point to search for. +- **longitude** (number): The longitude of the point to search for. +- **radius** (number): Radius in meters. +- **distanceName** (string, *optional*): Include the distance (in meters) between the reference point and stored point in the result, using the - attribute name *distanceName* -- returns **docArray** (array): an array of documents, sorted by distance - (shortest distance first) + attribute name `distanceName`. +- returns **docArray** (array): An array of documents, sorted by distance + (shortest distance first). ### WITHIN_RECTANGLE() @@ -947,18 +966,18 @@ FOR doc IN coll ``` Assuming there exists a geo-type index on `latitude` and `longitude`, the -optimizer will recognize it and accelerate the query. +optimizer recognizes it and accelerates the query. {{< /warning >}} `WITHIN_RECTANGLE(coll, latitude1, longitude1, latitude2, longitude2) → docArray` -Return all documents from collection *coll* that are positioned inside the -bounding rectangle with the points (*latitude1*, *longitude1*) and (*latitude2*, -*longitude2*). There is no guaranteed order in which the documents are returned. +Return all documents from collection `coll` that are positioned inside the +bounding rectangle with the points (`latitude1`, `longitude1`) and (`latitude2`, +`longitude2`). There is no guaranteed order in which the documents are returned. -- **coll** (collection): a collection -- **latitude1** (number): the latitude of the bottom-left point to search -- **longitude1** (number): the longitude of the bottom-left point to search -- **latitude2** (number): the latitude of the top-right point to search -- **longitude2** (number): the longitude of the top-right point to search -- returns **docArray** (array): an array of documents, in random order +- **coll** (collection): A collection. +- **latitude1** (number): The latitude of the bottom-left point to search for. +- **longitude1** (number): The longitude of the bottom-left point to search for. +- **latitude2** (number): The latitude of the top-right point to search for. +- **longitude2** (number): The longitude of the top-right point to search for. +- returns **docArray** (array): An array of documents, in random order. diff --git a/site/content/arangodb/3.13/aql/functions/vector.md b/site/content/arangodb/3.13/aql/functions/vector.md index a20c562137..8b6bcb377d 100644 --- a/site/content/arangodb/3.13/aql/functions/vector.md +++ b/site/content/arangodb/3.13/aql/functions/vector.md @@ -16,13 +16,13 @@ You can calculate vector embeddings using [ArangoDB's GraphML](../../../../gen-a capabilities (available in ArangoGraph) or using external tools. {{< warning >}} -The vector index is an experimental feature that you need to enable for the -ArangoDB server with the `--experimental-vector-index` startup option. +You need to enable the vector index feature for the +ArangoDB server with the `--vector-index` startup option. Once enabled for a deployment, it cannot be disabled anymore because it permanently changes how the data is managed by the RocksDB storage engine (it adds an additional column family). -To restore a dump that contains vector indexes, the `--experimental-vector-index` +To restore a dump that contains vector indexes, the `--vector-index` startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} @@ -56,21 +56,37 @@ be found depends on the data as well as the search effort (see the `nProbe` opti {{< info >}} - If there is more than one suitable vector index over the same attribute, it is undefined which one is selected. -- You cannot have any `FILTER` operation between `FOR` and `LIMIT` for - pre-filtering. + +- In v3.12.4 and v3.12.5, you cannot have any `FILTER` operation between `FOR` + and `LIMIT` for pre-filtering. From v3.12.6 onward, you can add `FILTER` + operations between `FOR` and `SORT` that are then applied during the lookup in + the vector index. Example: + + ```aql + FOR doc IN coll + FILTER doc.val > 3 + SORT APPROX_NEAR_COSINE(doc.vector, @q) DESC + LIMIT 5 + RETURN doc + ``` + + Note that e.g. `LIMIT 5` does not ensure that you get 5 results by searching + as many neighboring Voronoi cells as necessary, but it rather considers only as + many as configured via the `nProbes` parameter. {{< /info >}} ### APPROX_NEAR_COSINE() `APPROX_NEAR_COSINE(vector1, vector2, options) → similarity` -Retrieve the approximate angular similarity using the cosine metric, accelerated -by a matching vector index. -The higher the cosine similarity value is, the more similar the two vectors -are. The closer it is to 0, the more different they are. The value can also -be negative, indicating that the vectors are not similar and point in opposite -directions. You need to sort in descending order so that the most similar +Retrieve the approximate cosine of the angle between two vectors, accelerated +by a matching vector index with the `cosine` metric. + +The closer the similarity value is to 1, the more similar the two vectors +are. The closer it is to 0, the more different they are. The value can also be +negative up to -1, indicating that the vectors are not similar and point in opposite +directions. You need to **sort in descending order** so that the most similar documents come first, which is what a vector index using the `cosine` metric can provide. @@ -83,8 +99,8 @@ can provide. closest Voronoi cells to consider for the search results. The larger the number, the slower the search but the better the search results. If not specified, the `defaultNProbe` value of the vector index is used. -- returns **similarity** (number): The approximate angular similarity between - both vectors. +- returns **similarity** (number): The approximate cosine similarity of + both normalized vectors. The value range is `[-1, 1]`. **Examples** @@ -126,15 +142,83 @@ FOR docOuter IN coll RETURN { key: docOuter._key, neighbors } ``` +### APPROX_NEAR_INNER_PRODUCT() + +<small>Introduced in: v3.12.6</small> + +`APPROX_NEAR_INNER_PRODUCT(vector1, vector2, options) → similarity` + +Retrieve the approximate dot product of two vectors, accelerated by a matching +vector index with the `innerProduct` metric. + +The higher the similarity value is, the more similar the two vectors +are. The closer it is to 0, the more different they are. The value can also +be negative, indicating that the vectors are not similar and point in opposite +directions. You need to **sort in descending order** so that the most similar +documents come first, which is what a vector index using the `innerProduct` +metric can provide. + +- **vector1** (array of numbers): The first vector. Either this parameter or + `vector2` needs to reference a stored attribute holding the vector embedding. +- **vector2** (array of numbers): The second vector. Either this parameter or + `vector1` needs to reference a stored attribute holding the vector embedding. +- **options** (object, _optional_): + - **nProbe** (number, _optional_): How many neighboring centroids respectively + closest Voronoi cells to consider for the search results. The larger the number, + the slower the search but the better the search results. If not specified, the + `defaultNProbe` value of the vector index is used. +- returns **similarity** (number): The approximate dot product + of both vectors without normalization. The value range is unbounded. + +**Examples** + +Return up to `10` similar documents based on their closeness to the vector +`@q` according to the inner product metric: + +```aql +FOR doc IN coll + SORT APPROX_NEAR_INNER_PRODUCT(doc.vector, @q) DESC + LIMIT 10 + RETURN doc +``` + +Return up to `5` similar documents as well as the similarity value, +considering `20` neighboring centroids respectively closest Voronoi cells: + +```aql +FOR doc IN coll + LET similarity = APPROX_NEAR_INNER_PRODUCT(doc.vector, @q, { nProbe: 20 }) + SORT similarity DESC + LIMIT 5 + RETURN MERGE( { similarity }, doc) +``` + +Return the similarity value and the document keys of up to `3` similar documents +for multiple input vectors using a subquery. In this example, the input vectors +are taken from ten random documents of the same collection: + +```aql +FOR docOuter IN coll + LIMIT 10 + LET neighbors = ( + FOR docInner IN coll + LET similarity = APPROX_NEAR_INNER_PRODUCT(docInner.vector, docOuter.vector) + SORT similarity DESC + LIMIT 3 + RETURN { key: docInner._key, similarity } + ) + RETURN { key: docOuter._key, neighbors } +``` + ### APPROX_NEAR_L2() -`APPROX_NEAR_L2(vector1, vector2, options) → similarity` +`APPROX_NEAR_L2(vector1, vector2, options) → distance` Retrieve the approximate distance using the L2 (Euclidean) metric, accelerated -by a matching vector index. +by a matching vector index with the `l2` metric. The closer the distance is to 0, the more similar the two vectors are. The higher -the value, the more different the they are. You need to sort in ascending order +the value, the more different the they are. You need to **sort in ascending order** so that the most similar documents come first, which is what a vector index using the `l2` metric can provide. @@ -147,7 +231,7 @@ the `l2` metric can provide. for the search results. The larger the number, the slower the search but the better the search results. If not specified, the `defaultNProbe` value of the vector index is used. -- returns **similarity** (number): The approximate L2 (Euclidean) distance between +- returns **distance** (number): The approximate L2 (Euclidean) distance between both vectors. **Examples** diff --git a/site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md b/site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md index bef591606d..7697a7950f 100644 --- a/site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md +++ b/site/content/arangodb/3.13/aql/graphs/all-shortest-paths.md @@ -117,6 +117,58 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows using a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a path +search - unless you use named graphs that define all node and edge collections +that belong to them and the graph data is consistent. + +If you use anonymous graphs / collection sets for graph queries, which node +collections need to be loaded by the graph engine can deduced automatically if +there is a named graph with a matching edge collection in its edge definitions +(introduced in v3.12.6). Edge collections are always declared explicitly in +queries, directly or via referencing a named graph. + +Without a named graph, the involved node collections can only be determined at +run time. Use the [`WITH` operation](../high-level-operations/with.md) to +declare the node collections upfront. This is required for path searches +using collection sets in cluster deployments (if there is no named graph to +deduce the node collections from). Declare the collection of the start node as +well if it's not declared already (like by a `FOR` loop). + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR p IN ANY ALL_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + RETURN p.vertices[*].label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR p IN ANY ALL_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + RETURN p.vertices[*].label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +// Chris Rock --> The Longest Yard <-- Rob Schneider --> Big Stan <-- Jennifer Morrison +// Chris Rock --> Down to Earth <-- John Cho --> Star Trek <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. + ## Examples Load an example graph to get a named graph that reflects some possible diff --git a/site/content/arangodb/3.13/aql/graphs/k-paths.md b/site/content/arangodb/3.13/aql/graphs/k-paths.md index 0c490ce041..2ab9d95e92 100644 --- a/site/content/arangodb/3.13/aql/graphs/k-paths.md +++ b/site/content/arangodb/3.13/aql/graphs/k-paths.md @@ -188,6 +188,59 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows to use a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a path +search - unless you use named graphs that define all node and edge collections +that belong to them and the graph data is consistent. + +If you use anonymous graphs / collection sets for graph queries, which node +collections need to be loaded by the graph engine can deduced automatically if +there is a named graph with a matching edge collection in its edge definitions +(introduced in v3.12.6). Edge collections are always declared explicitly in +queries, directly or via referencing a named graph. + +Without a named graph, the involved node collections can only be determined at +run time. Use the [`WITH` operation](../high-level-operations/with.md) to +declare the node collections upfront. This is required for path searches +using collection sets in cluster deployments (if there is no named graph to +deduce the node collections from). Declare the collection of the start node as +well if it's not declared already (like by a `FOR` loop). + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR p IN 4 ANY K_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR p IN 4 ANY K_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +// Chris Rock --> The Longest Yard <-- Rob Schneider --> Big Stan <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. + ## Examples You can load the `kShortestPathsGraph` example graph to get a named graph that diff --git a/site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md b/site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md index 9c638740d7..0603d9582d 100644 --- a/site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md +++ b/site/content/arangodb/3.13/aql/graphs/k-shortest-paths.md @@ -186,6 +186,59 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows to use a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a path +search - unless you use named graphs that define all node and edge collections +that belong to them and the graph data is consistent. + +If you use anonymous graphs / collection sets for graph queries, which node +collections need to be loaded by the graph engine can deduced automatically if +there is a named graph with a matching edge collection in its edge definitions +(introduced in v3.12.6). Edge collections are always declared explicitly in +queries, directly or via referencing a named graph. + +Without a named graph, the involved node collections can only be determined at +run time. Use the [`WITH` operation](../high-level-operations/with.md) to +declare the node collections upfront. This is required for path searches +using collection sets in cluster deployments (if there is no named graph to +deduce the node collections from). Declare the collection of the start node as +well if it's not declared already (like by a `FOR` loop). + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR p IN ANY K_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR p IN ANY K_SHORTEST_PATHS "person/1544" TO "person/52560" acts_in + LIMIT 2 + RETURN p.vertices[*].label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +// Chris Rock --> The Longest Yard <-- Rob Schneider --> Big Stan <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. + ## Examples You can load the `kShortestPathsGraph` example graph to get a named graph that diff --git a/site/content/arangodb/3.13/aql/graphs/shortest-path.md b/site/content/arangodb/3.13/aql/graphs/shortest-path.md index e3cab31823..3f6187da64 100644 --- a/site/content/arangodb/3.13/aql/graphs/shortest-path.md +++ b/site/content/arangodb/3.13/aql/graphs/shortest-path.md @@ -145,6 +145,56 @@ All collections in the list that do not specify their own direction use the direction defined after `IN` (here: `OUTBOUND`). This allows you to use a different direction for each collection in your path search. +### Graph path searches in a cluster + +Due to the nature of graphs, edges may reference nodes from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a path +search - unless you use named graphs that define all node and edge collections +that belong to them and the graph data is consistent. + +If you use anonymous graphs / collection sets for graph queries, which node +collections need to be loaded by the graph engine can deduced automatically if +there is a named graph with a matching edge collection in its edge definitions +(introduced in v3.12.6). Edge collections are always declared explicitly in +queries, directly or via referencing a named graph. + +Without a named graph, the involved node collections can only be determined at +run time. Use the [`WITH` operation](../high-level-operations/with.md) to +declare the node collections upfront. This is required for path searches +using collection sets in cluster deployments (if there is no named graph to +deduce the node collections from). Declare the collection of the start node as +well if it's not declared already (like by a `FOR` loop). + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a path search +query that starts (and ends) at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR v IN ANY SHORTEST_PATH "person/1544" TO "person/52560" acts_in + RETURN v.label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR v IN ANY SHORTEST_PATH "person/1544" TO "person/52560" acts_in + RETURN v.label + +// Chris Rock --> Dogma <-- Ben Affleck --> Surviving Christmas <-- Jennifer Morrison +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. + ## Conditional shortest path The `SHORTEST_PATH` computation only finds an unconditioned shortest path. diff --git a/site/content/arangodb/3.13/aql/graphs/traversals.md b/site/content/arangodb/3.13/aql/graphs/traversals.md index ef4870dfef..2fae9b37b5 100644 --- a/site/content/arangodb/3.13/aql/graphs/traversals.md +++ b/site/content/arangodb/3.13/aql/graphs/traversals.md @@ -338,13 +338,56 @@ collection in your traversal. Due to the nature of graphs, edges may reference nodes from arbitrary collections. Following the paths can thus involve documents from various -collections and it is not possible to predict which are visited in a -traversal. Which collections need to be loaded by the graph engine can only be -determined at run time. +collections and it is not possible to predict which are visited in a path +search - unless you use named graphs that define all node and edge collections +that belong to them and the graph data is consistent. -Use the [`WITH` statement](../high-level-operations/with.md) to specify the collections you -expect to be involved. This is required for traversals using collection sets -in cluster deployments. +If you use anonymous graphs / collection sets for graph queries, which node +collections need to be loaded by the graph engine can deduced automatically if +there is a named graph with a matching edge collection in its edge definitions +(introduced in v3.12.6). Edge collections are always declared explicitly in +queries, directly or via referencing a named graph. + +Without a named graph, the involved node collections can only be determined at +run time. Use the [`WITH` operation](../high-level-operations/with.md) to +declare the node collections upfront. This is required for traversals +using collection sets in cluster deployments (if there is no named graph to +deduce the node collections from). Declare the collection of the start node as +well if it's not declared already (like by a `FOR` loop). + +For example, suppose you have two node collections, `person` and `movie`, and +an `acts_in` edge collection that connects them. If you want to run a traversal +query that starts at a person that you specify with its document ID, +you need to declare both node collections at the beginning of the query: + +```aql +WITH person, movie +FOR v, IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label +``` + +However, if there is a named graph that includes an edge definition for the +`acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection, you can omit `WITH person, movie`. That is, if you +specify `acts_in` as an edge collection in an anonymous graph query, all +named graphs are checked for this edge collection, and if there is a matching +edge definition, its node collections are automatically added as data sources to +the query. + +```aql +FOR v, IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label + +// Chris Rock +// A.I. Artificial Intelligence +// Lethal Weapon 4 +// Madagascar +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. ## Pruning diff --git a/site/content/arangodb/3.13/components/platform.md b/site/content/arangodb/3.13/components/platform.md deleted file mode 100644 index 6e9764fd15..0000000000 --- a/site/content/arangodb/3.13/components/platform.md +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: The ArangoDB Platform -menuTitle: Platform -weight: 169 -description: >- - The ArangoDB Platform brings everything ArangoDB offers together to a single - solution that you can deploy on-prem or use as a managed service ---- -{{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. -{{< /tip >}} - -The ArangoDB Platform is a technical infrastructure that acts as the umbrella -for hosting the entire ArangoDB offering of products. The Platform makes it easy -to deploy and operate the core ArangoDB database system along with any additional -ArangoDB products for machine learning, data explorations, and more. You can -run it on-premises or in the cloud yourself on top of Kubernetes to access all -of the platform features. - -## Features of the ArangoDB Platform - -- **Core database system**: The ArangoDB graph database system for storing - interconnected data.{{< comment >}} You can use the free Community Edition or the commercial - Enterprise Edition.{{< /comment >}} -- **Graph Visualizer**: A web-based tool for exploring your graph data with an - intuitive interface and sophisticated querying capabilities. -- **Graph Analytics**: A suite of graph algorithms including PageRank, - community detection, and centrality measures with support for GPU - acceleration thanks to Nvidia cuGraph. -- **GenAI Suite**: A set of machine learning services, APIs, and - user interfaces that are available as a package as well as individual products. - - **GraphML**: A turnkey solution for graph machine learning for prediction - use cases such as fraud detection, supply chain, healthcare, retail, and - cyber security. - - **GraphRAG**: Leverage ArangoDB's graph, document, key-value, - full-text search, and vector search features to streamline knowledge - extraction and retrieval. - {{< comment >}}TODO: Not available in prerelease version - - **Txt2AQL**: Unlock natural language querying with a service that converts - user input into ArangoDB Query Language (AQL), powered by fine-tuned - private or public LLMs. - {{< /comment >}} - - **GraphRAG Importer**: Extract entities and relationships from large - text-based files, converting unstructured data into a knowledge graph - stored in ArangoDB. - - **GraphRAG Retriever**: Perform semantic similarity searches or aggregate - insights from graph communities with global and local queries. - - **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../../../gen-ai/services/triton-inference-server.md). - - **MLflow integration**: Use the popular MLflow as a model registry for private LLMs - or to run machine learning experiments as part of the ArangoDB Platform. -- **Jupyter notebooks**: Run a Jupyter kernel in the platform for hosting - interactive notebooks for experimentation and development of applications - that use ArangoDB as their backend. -{{< comment >}}TODO: Mostly unrelated to Platform, vector index in core, -- **Vector embeddings**: You can train machine learning models for later use - in vector search in conjunction with the core database system's `vector` - index type. It allows you to find similar items in your dataset. -{{< /comment >}} - -## Get started with the ArangoDB Platform - -### Use the ArangoDB Platform as a managed service - -The ArangoDB Platform is not available as a managed service yet, but it will -become available for the [Arango Managed Platform (AMP)](../../../amp/_index.md) -in the future. Until then, you can request early access to the self-hosted -ArangoDB Platform for testing. - -### Self-host the ArangoDB Platform - -You can set up and run the ArangoDB Platform on-premises or in the cloud and -manage this deployment yourself. - -#### Requirements for self-hosting - -- **Early access to the ArangoDB Platform**: - [Get in touch](https://arangodb.com/contact/) with the ArangoDB team to get - exclusive early access to the pre-release of the ArangoDB Platform & GenAI Suite. - -- **Kubernetes**: Orchestrates the selected services that comprise the - ArangoDB Platform, running them in containers for safety and scalability. - - Set up a [Kubernetes](https://kubernetes.io/) cluster if you don't have one - available yet. - -- **kubectl**: A command line tool for communicating with a Kubernetes cluster's - control plane. - - Install [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) for applying - specifications such as for creating the ArangoDB Core deployment, as well as - for checking pods, logs, etc. - -- **Helm**: A package manager for Kubernetes. - - You need to have [helm](https://helm.sh/docs/intro/install/) installed in order - to install the required certificate manager and the ArangoDB Kubernetes Operator - as part of the Platform setup. - -- **Container registry**: A repository for storing and accessing container images. - - You need to have a container registry for installing the images of the Platform - services. It can be a local registry. - -{{< comment >}} -- **Licenses**: If you want to use any paid features, you need to purchase the - respective packages. -{{< /comment >}} - -#### Setup - -1. Obtain a zip package of the ArangoDB Platform for the offline installation. - It includes helm charts, manifests, and blobs of the container image layers. - You also receive a package configuration file from the ArangoDB team. - -2. Create a Kubernetes namespace for ArangoDB and a secret with your - Enterprise Edition license key. Substitute `<license-string>` with the actual - license string: - - ```sh - kubectl create namespace arangodb - - kubectl create secret generic arango-license-key \ - --namespace arangodb \ - --from-literal=token-v2="<license-string>" - ``` - -3. Install the certificate manager. You can check <https://github.com/cert-manager/cert-manager> - for the available releases. - - ```sh - VERSION_CERT='1.18.2' # Use a newer version if available - helm repo add jetstack https://charts.jetstack.io - helm repo update - - helm upgrade --install cert-manager \ - --namespace cert-manager --create-namespace \ - --version "v${VERSION_CERT}" \ - jetstack/cert-manager \ - --set crds.enabled=true - ``` - -4. Install the ArangoDB operator for Kubernetes `kube-arangodb` with helm, - with options to enable webhooks, certificates, and the gateway feature. - - ```sh - VERSION_OPERATOR='1.3.0' # Use a newer version if available - - helm upgrade --install operator \ - --namespace arangodb \ - "https://github.com/arangodb/kube-arangodb/releases/download/${VERSION_OPERATOR}/kube-arangodb-enterprise-${VERSION_OPERATOR}.tgz" \ - --set "webhooks.enabled=true" \ - --set "certificate.enabled=true" \ - --set "operator.args[0]=--deployment.feature.gateway=true" \ - --set "operator.features.platform=true" \ - --set "operator.features.ml=true" \ - --set "operator.architectures={amd64}" # or {arm64} for ARM-based CPUs - ``` - -5. Create an `ArangoDeployment` specification for the ArangoDB Core. See the - [ArangoDeployment Custom Resource Overview](https://arangodb.github.io/kube-arangodb/docs/deployment-resource-reference.html) - and the linked reference. - - You need to enable the gateway feature by setting `spec.gateway.enabled` and - `spec.gateway.dynamic` to `true` in the specification. You also need to set - `spec.license` to the secret created earlier. Example for an ArangoDB cluster - deployment using version 3.12.5 with three DB-Servers and two Coordinators: - - ```yaml - apiVersion: "database.arangodb.com/v1" - kind: "ArangoDeployment" - metadata: - name: "platform-example" - spec: - mode: Cluster - image: "arangodb/enterprise:3.12.5" - gateway: - enabled: true - dynamic: true - gateways: - count: 1 - dbservers: - count: 3 - coordinators: - count: 2 - license: - secretName: arango-license-key - # ... - ``` - -6. Download the ArangoDB Platform CLI tool `arangodb_operator_platform` from - <https://github.com/arangodb/kube-arangodb/releases>. - It is available for Linux and macOS, for the x86-64 as well as 64-bit ARM - architecture (e.g. `arangodb_operator_platform_linux_amd64`). - - It is recommended to rename the downloaded executable to - `arangodb_operator_platform` and add it to the `PATH` environment variable - to make it available as a command in the system. - - The Platform CLI tool simplifies the further setup and later management of - the Platform's Kubernetes services. - -7. Import the zip package of the ArangoDB Platform into the container registry. - Replace `platform.zip` with the file path of the offline installation package. - Replace `gcr.io/my-reg` with the address of your registry. - - ```sh - arangodb_operator_platform package import \ - --registry-docker-credentials \ - gcr.io/my-reg \ - ./platform.zip \ - platform.imported.yaml - ``` - -8. Install the package using the package configuration you received from the - ArangoDB team (`platform.yaml`) and the configuration generated by the - previous command (`platform.imported.yaml`). These configurations are merged, - allowing for targeted upgrades and user-defined overrides. - - The package installation creates and enables various services, including - the unified web interface of the Platform. - - ```sh - arangodb_operator_platform --context arangodb package install \ - --platform.name platform-example \ - ./platform.yaml \ - ./platform.imported.yaml - ``` - -## Interfaces - -The ArangoDB Platform uses a gateway to make all its services available via a -single port at the external address of the deployment. For a local deployment, -the base URL is `https://127.0.0.1:8529`. - -### Unified web interface - -You can access the ArangoDB Platform web interface with a browser by appending -`/ui/` to the base URL, e.g. `https://127.0.0.1:8529/ui/`. - -### ArangoDB Core - -The HTTP API of the ArangoDB Core database system is available at the base URL. -For example, the URL of the Cursor API for submitting AQL queries (against the `_system` database) is -`https://127.0.0.1:8529/_db/_system/_api/cursor`. diff --git a/site/content/arangodb/3.13/deploy/_index.md b/site/content/arangodb/3.13/deploy/_index.md index 2d9787b64c..499c517066 100644 --- a/site/content/arangodb/3.13/deploy/_index.md +++ b/site/content/arangodb/3.13/deploy/_index.md @@ -50,7 +50,7 @@ ArangoDB product offering with a unified interface in a Kubernetes cluster. It is offered for self-hosting on-prem or in the cloud and as a managed service, superseding the Arango Managed Platform (AMP). -See [The ArangoDB Platform](../components/platform.md) for details. +See [The ArangoDB Platform](../../../data-platform/about/_index.md) for details. ## How to deploy diff --git a/site/content/arangodb/3.13/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/3.13/develop/http-api/indexes/multi-dimensional.md index e38f031495..5627af291b 100644 --- a/site/content/arangodb/3.13/develop/http-api/indexes/multi-dimensional.md +++ b/site/content/arangodb/3.13/develop/http-api/indexes/multi-dimensional.md @@ -111,7 +111,10 @@ paths: default: false sparse: description: | - If `true`, then create a sparse index. + Whether to create a sparse index that excludes documents with + at least one of the attributes for indexing missing or set to + `null`. These attributes are defined by `fields` and (for + `mdi-prefixed` indexes) by `prefixFields`. type: boolean default: false estimates: diff --git a/site/content/arangodb/3.13/develop/http-api/indexes/persistent.md b/site/content/arangodb/3.13/develop/http-api/indexes/persistent.md index 7017836a3b..cb916d7aed 100644 --- a/site/content/arangodb/3.13/develop/http-api/indexes/persistent.md +++ b/site/content/arangodb/3.13/develop/http-api/indexes/persistent.md @@ -113,8 +113,9 @@ paths: default: false sparse: description: | - Whether create a sparse index that excludes documents with at least - one of the `fields` missing or set to `null`. + Whether to create a sparse index that excludes documents with + at least one of the attributes for indexing missing or set to + `null`. These attributes are defined by `fields`. type: boolean default: false deduplicate: diff --git a/site/content/arangodb/3.13/develop/http-api/indexes/vector.md b/site/content/arangodb/3.13/develop/http-api/indexes/vector.md index 1581ed1e94..0bbd14d4de 100644 --- a/site/content/arangodb/3.13/develop/http-api/indexes/vector.md +++ b/site/content/arangodb/3.13/develop/http-api/indexes/vector.md @@ -57,7 +57,7 @@ paths: A list with exactly one attribute path to specify where the vector embedding is stored in each document. The vector data needs to be populated before creating the index. - + If you want to index another vector embedding attribute, you need to create a separate vector index. type: array @@ -65,6 +65,13 @@ paths: maxItems: 1 items: type: string + sparse: + description: | + Whether to create a sparse index that excludes documents with + the attribute for indexing missing or set to `null`. This + attribute is defined by `fields`. + type: boolean + default: false parallelism: description: | The number of threads to use for indexing. @@ -88,9 +95,14 @@ paths: properties: metric: description: | - Whether to use `cosine` or `l2` (Euclidean) distance calculation. - type: string - enum: ["cosine", "l2"] + The measure for calculating the vector similarity: + - `"cosine"`: Angular similarity. Vectors are automatically + normalized before insertion and search. + - `"innerProduct"` (introduced in v3.12.6): + Similarity in terms of angle and magnitude. + Vectors are not normalized, making it faster than `cosine`. + - `"l2":` Euclidean distance. + enum: ["cosine", "innerProduct", "l2"] dimension: description: | The vector dimension. The attribute to index needs to diff --git a/site/content/arangodb/3.13/develop/http-api/monitoring/logs.md b/site/content/arangodb/3.13/develop/http-api/monitoring/logs.md index d68f1b6eeb..7808927511 100644 --- a/site/content/arangodb/3.13/develop/http-api/monitoring/logs.md +++ b/site/content/arangodb/3.13/develop/http-api/monitoring/logs.md @@ -568,7 +568,7 @@ paths: Logs various information related to ArangoDB's use of the RocksDB storage engine, like the initialization and file operations. - + RocksDB's internal log messages are passed through using the `rocksdb` log topic. type: string @@ -856,12 +856,14 @@ paths: operationId: getRecentApiCalls description: | Get a list of the most recent requests with a timestamp and the endpoint. + In cluster deployments, the list contains only those requests that were + submitted to the Coordinator you call this endpoint on. This feature is for debugging purposes. You can control how much memory is used to record API calls with the `--server.api-recording-memory-limit` startup option. - You can disable this endpoint + You can disable this and the `/_admin/server/aql-queries` endpoint with the `--log.recording-api-enabled` startup option. Whether API calls are recorded is independently controlled by the @@ -875,7 +877,9 @@ paths: description: | The name of a database. Which database you use doesn't matter as long as the user account you authenticate with has at least read access - to this database. + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. schema: type: string responses: @@ -1075,3 +1079,239 @@ Content-Length: 257 } ``` {{< /details >}} + +## Get recent AQL queries + +```openapi +paths: + /_db/{database-name}/_admin/server/aql-queries: + get: + operationId: getRecentAqlQueries + description: | + Get a list of the most recent AQL queries with a timestamp and + information about the submitted query. In cluster deployments, the list + contains only those queries that were submitted to the Coordinator you + call this endpoint on. This feature is for debugging purposes. + + You can control how much memory is used to record AQL queries with the + `--server.aql-recording-memory-limit` startup option. + + You can disable this and the `/_admin/server/api-calls` endpoint + with the `--log.recording-api-enabled` startup option. + + Whether AQL queries are recorded is independently controlled by the + `--server.aql-query-recording` startup option. + The endpoint returns an empty list of queries if turned off. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. + schema: + type: string + responses: + '200': + description: | + Returns the recorded AQL queries. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The request result. + type: object + required: + - queries + properties: + queries: + description: | + A list of the recent AQL queries. + Empty if AQL query recording is disabled. + type: array + items: + type: object + properties: + timeStamp: + description: | + The date and time of the request in ISO 8601 format. + type: string + format: date-time + query: + description: | + The AQL query. + type: string + bindVars: + description: | + Key/value pairs representing the bind variables. + type: object + database: + description: | + The database name. + type: string + '401': + description: | + The user account has insufficient permissions for the selected database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 401 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + The recording API has been disabled. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + The method has not been called on a Coordinator or single server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Monitoring +``` + +{{< comment >}} +Example not generated because it changes on every run and there can be many internal queries. +{{< /comment >}} + +```bash +curl --header 'accept: application/json' --dump - http://localhost:8529/_admin/server/aql-queries +``` + +{{< details summary="Show output" >}} +```bash +HTTP/1.1 200 OK +X-Arango-Queue-Time-Seconds: 0.000000 +Strict-Transport-Security: max-age=31536000 ; includeSubDomains +Expires: 0 +Pragma: no-cache +Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0 +Content-Security-Policy: frame-ancestors 'self'; form-action 'self'; +X-Content-Type-Options: nosniff +Server: ArangoDB +Connection: Keep-Alive +Content-Type: application/json; charset=utf-8 +Content-Length: 353 + +{ + "error": false, + "code": 200, + "result": { + "queries": [ + { + "timeStamp": "2025-07-02T16:33:32Z", + "query": "FOR s in @@collection FILTER s.time < @start RETURN s._key", + "database": "_system", + "bindVars": { + "@collection": "_statistics", + "start": 1751470412.3836362 + } + }, + { + "timeStamp": "2025-07-02T16:26:01Z", + "query": "FOR doc IN coll RETURN doc", + "database": "_system", + "bindVars": {} + } + ] + } +} +``` +{{< /details >}} \ No newline at end of file diff --git a/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md b/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md new file mode 100644 index 0000000000..04012366f9 --- /dev/null +++ b/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md @@ -0,0 +1,841 @@ +--- +title: ArangoDB TinkerPop Provider +menuTitle: TinkerPop Provider +weight: 10 +description: >- + Build graph applications using TinkerPop API with ArangoDB's high-performance backend, combining Gremlin traversals and native AQL queries +--- +ArangoDB TinkerPop Provider is an implementation of the [Apache TinkerPop OLTP Provider](https://tinkerpop.apache.org/docs/3.7.4/dev/provider) API for +ArangoDB. + +It allows using the standard TinkerPop API with ArangoDB as the backend storage. It supports creating, +querying, and manipulating graph data using the Gremlin traversal language, while offering the possibility to use native +AQL (ArangoDB Query Language) for complex queries. + +- Repository: <https://github.com/arangodb/arangodb-tinkerpop-provider> +- [Code examples](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/src/test/java/example) +- [Demo](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/demo) +- [JavaDoc](https://www.javadoc.io/doc/com.arangodb/arangodb-tinkerpop-provider/latest/index.html) (generated reference documentation) +- [ChangeLog](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/CHANGELOG.md) + +## Compatibility + +This Provider is compatible with: + +- Apache TinkerPop 3.7 +- ArangoDB 3.12+ +- ArangoDB Java Driver 7.22+ +- Java 8+ + +## Installation + +### Maven + +1. Check the [latest version](https://search.maven.org/artifact/com.arangodb/arangodb-tinkerpop-provider) available. +2. Add the following dependency to your `pom.xml` file: + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-tinkerpop-provider</artifactId> + <version>x.y.z</version> + </dependency> +</dependencies> +``` + +### Gradle + +1. Add the following dependency to your `build.gradle`: + +```groovy +implementation 'com.arangodb:arangodb-tinkerpop-provider:x.y.z' +``` + +### Gremlin Console + +1. Install the TinkerPop Provider in the Gremlin Console: + +```text +:install com.arangodb arangodb-tinkerpop-provider x.y.z +``` + +2. Restart the console to load the provider. + +3. Create a configuration for your ArangoDB connection. + +```text +gremlin> conf = [ +......1> "gremlin.graph":"com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph", +......2> "gremlin.arangodb.conf.graph.enableDataDefinition":"true", +......3> "gremlin.arangodb.conf.driver.hosts":"172.28.0.1:8529", +......4> "gremlin.arangodb.conf.driver.password":"test", +......5> ] +==>gremlin.graph=com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph +==>gremlin.arangodb.conf.graph.enableDataDefinition=true +==>gremlin.arangodb.conf.driver.hosts=172.28.0.1:8529 +==>gremlin.arangodb.conf.driver.password=test +``` +4. Open the graph using the configuration. + +```text +gremlin> graph = GraphFactory.open(conf) +==>arangodbgraph[ArangoDBGraphConfig{...}] +``` + +5. Create a traversal source and start using it: + +```text +gremlin> g = graph.traversal() +==>graphtraversalsource[arangodbgraph[...], standard] + +gremlin> g.addV("person").property("name", "marko") +==>v[4586117] + +gremlin> g.V().hasLabel("person").values("name") +==>marko +``` + +### Server Plugin + +Follow the steps below to set up the provider as a Gremlin Server plugin. + +1. Install the provider in the Gremlin Server: + + ```bash + ./bin/gremlin-server.sh install com.arangodb arangodb-tinkerpop-provider x.y.z + ``` + +2. Create a graph configuration file (e.g., `conf/arangodb.yaml`): + + ```yaml + gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + enableDataDefinition: true + driver: + hosts: + - "172.28.0.1:8529" + password: test + ``` + +3. Create a server configuration file to load the plugin and graph configuration (e.g., `conf/gremlin-server-arangodb.yaml`): + +```yaml +host: 0.0.0.0 +port: 8182 +graphs: { + graph: conf/arangodb.yaml} +scriptEngines: { + gremlin-groovy: { + plugins: { org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {}, + org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {}, + com.arangodb.tinkerpop.gremlin.jsr223.ArangoDBGremlinPlugin: {}, + org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]}, + org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/empty-sample.groovy]}}}} +serializers: + - { className: org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] }} # application/json + - { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1 } # application/vnd.graphbinary-v1.0 + - { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }} # application/vnd.graphbinary-v1.0-stringd +processors: + - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }} + - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor} +``` + +4. Start the Gremlin Server with your configuration: + + ```bash + ./bin/gremlin-server.sh conf/gremlin-server-arangodb.yaml + ``` + +5. Connect to the server using the Gremlin Console: + + ```text + gremlin> :remote connect tinkerpop.server conf/remote.yaml + + gremlin> :remote console + ==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:8182] - type ':remote console' to return to local mode + ``` + +6. Start using the graph: + + ```text + gremlin> g.addV("person").property("name", "marko") + ==>v[4587713] + + gremlin> g.V().hasLabel("person").values("name") + ==>marko + ``` + +You can find the reference documentation [here](https://tinkerpop.apache.org/docs/3.7.4/reference/#_configuring_2). + + +## Quick Start + +Follow the steps below to get started with creating vertices, edges, and querying the graph. + +### Step 1: Configure and Create the Graph + +[//]: <> (@formatter:off) +```java +// Create a configuration +Configuration conf = new ArangoDBConfigurationBuilder() + .hosts("localhost:8529") + .user("root") + .password("test") + .db("myDatabase") + .name("myGraph") + .enableDataDefinition(true) // Allow creating database and graph if they don't exist + .build(); + +// Create a graph +ArangoDBGraph graph = (ArangoDBGraph) GraphFactory.open(conf); + +// Get a traversal source +GraphTraversalSource g = graph.traversal(); +``` +### Step 2: Add Vertices and Edges + +```java +// Add vertices with properties +Vertex person = g.addV("person") + .property("name", "Alice") + .property("age", 30) + .property("country", "Germany") + .next(); + +Vertex software = g.addV("software") + .property("name", "JArango") + .property("lang", "Java") + .next(); + +// Create relationships between vertices +Edge created = g.addE("created") + .from(person) + .to(software) + .property("year", 2025) + .next(); +``` + +### Step 3: Query the Graph + +```java +// Query the graph +List<String> creators = g.V() + .hasLabel("software") + .has("name", "JArango") + .in("created") + .<String>values("name") + .toList(); + +System.out.println("Creators: " + creators); + +// Query: Find all software created by Alice +List<String> aliceSoftware = g.V() + .hasLabel("person") + .has("name", "Alice") + .out("created") + .<String>values("name") + .toList(); + +System.out.println("aliceSoftware: " + aliceSoftware); + +``` + +### Step 4: Update Data + +```java +// Update a property +g.V() + .hasLabel("person") + .has("name", "Alice") + .property("age", 31) + .iterate(); + +// Remove a property +g.V() + .hasLabel("person") + .has("name", "Alice") + .properties("country") + .drop() + .iterate(); + +// Check the updated vertex +Map<?, ?> alice = g.V() + .hasLabel("person") + .has("name", "Alice") + .valueMap() + .next(); + +System.out.println("alice: " + alice); +``` + +### Step 5: Delete Data and Clean Up + +```java +// Remove an edge +g.E() + .hasLabel("created") + .where(__.outV() + .has("name", "Alice")) + .where(__.inV() + .has("name", "JArango")) + .drop() + .iterate(); + +// Remove a vertex (and its incident edges) +g.V() + .hasLabel("person") + .has("name", "Alice") + .drop() + .iterate(); + +// Close the graph when done +graph.close(); +``` +[//]: <> (@formatter:on) + +## Configuration + +The graph can be created using the methods from `org.apache.tinkerpop.gremlin.structure.util.GraphFactory.open(...)` +(see [javadoc](https://tinkerpop.apache.org/javadocs/3.7.4/full/org/apache/tinkerpop/gremlin/structure/util/GraphFactory.html)). +These methods accept a configuration file (e.g., YAML or properties file), a Java Map, or an Apache Commons Configuration object. + +The property `gremlin.graph` must be set to: `com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph`. + +Configuration examples can be found [here](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/src/test/java/example). + +### Graph Configuration Properties + +Graph configuration properties are prefixed with `gremlin.arangodb.conf.graph`: + +| Property | Description | Default | +|----------------------------------------------------|---------------------------------------|-------------| +| `gremlin.arangodb.conf.graph.db` | ArangoDB database name | `_system` | +| `gremlin.arangodb.conf.graph.name` | ArangoDB graph name | `tinkerpop` | +| `gremlin.arangodb.conf.graph.enableDataDefinition` | Flag to allow data definition changes | `false` | +| `gremlin.arangodb.conf.graph.type` | Graph type: `SIMPLE` or `COMPLEX` | `SIMPLE` | +| `gremlin.arangodb.conf.graph.labelField` | Label field name | `_label` | +| `gremlin.arangodb.conf.graph.orphanCollections` | List of orphan collections names | - | +| `gremlin.arangodb.conf.graph.edgeDefinitions` | List of edge definitions | - | + +### Driver Configuration Properties + +Driver configuration properties are prefixed with `gremlin.arangodb.conf.driver`. All properties from +`com.arangodb.config.ArangoConfigProperties` are supported. See +the [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) +for details. + +### YAML Configuration + +```yaml +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + db: "testDb" + name: "myFirstGraph" + enableDataDefinition: true + type: COMPLEX + orphanCollections: [ "x", "y", "z" ] + edgeDefinitions: + - "e1:[a]->[b]" + - "e2:[a,b]->[c,d]" + driver: + user: "root" + password: "test" + hosts: + - "172.28.0.1:8529" + - "172.28.0.1:8539" + - "172.28.0.1:8549" +``` + +Loading from a YAML file: + +[//]: <> (@formatter:off) +```java +ArangoDBGraph graph = (ArangoDBGraph) GraphFactory.open("<path_to_yaml_file>"); +``` +[//]: <> (@formatter:on) + +### Programmatic Configuration + +1. Build the configuration using the configuration builder: + + [//]: <> (@formatter:off) + ```java + Configuration conf = new ArangoDBConfigurationBuilder() + .hosts("172.28.0.1:8529") + .user("root") + .password("test") + .database("testDb") + .name("myGraph") + .graphType(GraphType.SIMPLE) + .enableDataDefinition(true) + .build(); + ``` + [//]: <> (@formatter:on) + +2. Create the graph using the configuration: + + [//]: <> (@formatter:off) + ```java + ArangoDBGraph graph = (ArangoDBGraph) GraphFactory.open(conf); + ``` + [//]: <> (@formatter:on) + +### SSL Configuration + +To use TLS-secured connections to ArangoDB, follow these steps: + +1. Enable SSL by setting `gremlin.arangodb.conf.driver.useSsl` to `true` in your configuration. + +2. Configure SSL properties as needed (see [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) for all available options): + + ```yaml + gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + driver: + hosts: + - "172.28.0.1:8529" + useSsl: true + verifyHost: false + sslCertValue: "MIIDezCCAmOgAwIBAgIEeDCzXzANBgkqhkiG9w0BAQsFADBuMRAwDgYDVQQGEwdVbmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYDVQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMjAxMTAxMTg1MTE5WhcNMzAxMDMwMTg1MTE5WjBuMRAwDgYDVQQGEwdVbmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYDVQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1WiDnd4+uCmMG539ZNZB8NwI0RZF3sUSQGPx3lkqaFTZVEzMZL76HYvdc9Qg7difyKyQ09RLSpMALX9euSseD7bZGnfQH52BnKcT09eQ3wh7aVQ5sN2omygdHLC7X9usntxAfv7NzmvdogNXoJQyY/hSZff7RIqWH8NnAUKkjqOe6Bf5LDbxHKESmrFBxOCOnhcpvZWetwpiRdJVPwUn5P82CAZzfiBfmBZnB7D0l+/6Cv4jMuH26uAIcixnVekBQzl1RgwczuiZf2MGO64vDMMJJWE9ClZF1uQuQrwXF6qwhuP1Hnkii6wNbTtPWlGSkqeutr004+Hzbf8KnRY4PAgMBAAGjITAfMB0GA1UdDgQWBBTBrv9Awynt3C5IbaCNyOW5v4DNkTANBgkqhkiG9w0BAQsFAAOCAQEAIm9rPvDkYpmzpSIhR3VXG9Y71gxRDrqkEeLsMoEyqGnw/zx1bDCNeGg2PncLlW6zTIipEBooixIE9U7KxHgZxBy0Et6EEWvIUmnr6F4F+dbTD050GHlcZ7eOeqYTPYeQC502G1Fo4tdNi4lDP9L9XZpf7Q1QimRH2qaLS03ZFZa2tY7ah/RQqZL8Dkxx8/zc25sgTHVpxoK853glBVBs/ENMiyGJWmAXQayewY3EPt/9wGwV4KmU3dPDleQeXSUGPUISeQxFjy+jCw21pYviWVJTNBA9l5ny3GhEmcnOT/gQHCvVRLyGLMbaMZ4JrPwb+aAtBgrgeiK4xeSMMvrbhw==" + ``` + +3. Alternatively, use system properties for truststore configuration. If no `sslCertValue` is provided, the default SSL context is used. In such cases, you can specify the truststore using system properties: + - `javax.net.ssl.trustStore` + - `javax.net.ssl.trustStorePassword` + +### Data Definition Management + +The provider follows this process when instantiating a graph: + +1. **Validation**: The provider compares existing data definitions in ArangoDB with the structure expected by your configuration. It checks whether: + - The database exists + - The graph exists + - The graph structure has the same edge definitions and orphan collections + +2. **Error handling**: If there's a mismatch, an error is thrown and the graph is not instantiated. + +3. **Automatic creation** (optional): To automatically create missing data definitions, set `gremlin.arangodb.conf.graph.enableDataDefinition` to `true`. This allows: + - Creating a new database if it doesn't exist + - Creating a new graph if it doesn't exist (along with vertex and edge collections) + +{{< info >}} +Existing graphs are never modified automatically for safety reasons. +{{< /info >}} + +## Graph Types + +The ArangoDB TinkerPop Provider supports two graph types, which can be configured with the property +`gremlin.arangodb.conf.graph.type`: `SIMPLE` and `COMPLEX`. + +### SIMPLE Graph Type + +From an application perspective, this is the most flexible graph type that is backed by an ArangoDB graph composed of only one vertex collection and one edge definition. + +The `label` of each element is stored in a database document field. The label field name is configurable by setting the configuration property `graph.labelField`, `_label` by default. + +The `SIMPLE` graph type is the default graph type. + +It has the following advantages: + +- It closely matches the TinkerPop property graph +- It is simpler to get started and run examples +- It imposes no restrictions about element IDs +- It supports arbitrary labels, i.e., labels not known at graph construction time + +It has the following disadvantages: + +- All vertex types will be stored in the same vertex collection +- All edge types will be stored in the same edge collection +- It could not leverage the full potential of ArangoDB graph traversal +- It could require an index on the label field to improve performance + +Example configuration: + +```yaml +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + db: "db" + name: "myGraph" + type: SIMPLE + edgeDefinitions: + - "e:[v]->[v]" +``` + +If `edgeDefinitions` are not configured, the default names are used: + +- `vertex` will be used for the vertex collection +- `edge` will be used for the edge collection + +Using a `SIMPLE` graph configured as in the example above and creating a new element like: + +[//]: <> (@formatter:off) +```java +graph.addVertex(T.label, "person", T.id, "foo"); +``` +[//]: <> (@formatter:on) + +would result in creating a document in the vertex collection `v` with `_key` equals to `foo` (and `_id` equals +to `v/foo`). + +### COMPLEX Graph Type + +The `COMPLEX` graph type is backed by an ArangoDB graph composed potentially of multiple vertex collections and multiple +edge definitions. + +The `label` of each element is used as name for the related database collection. + +It has the following advantages: + +- It closely matches the ArangoDB graph structure +- It allows multiple vertex collections and multiple edge collections +- It partitions the data in a finer way +- It allows indexing and sharding collections independently +- It is more flexible to match pre-existing database graph structures + +But on the other side has the following constraints: + +- Element IDs must have the format: `<label>/<key>`, where: + - `<label>` is the element label + - `<key>` is the database document key +- Only labels corresponding to graph collections can be used + +Example configuration: + +```yaml +gremlin: + graph: "com.arangodb.tinkerpop.gremlin.structure.ArangoDBGraph" + arangodb: + conf: + graph: + db: "db" + name: "myGraph" + type: COMPLEX + edgeDefinitions: + - "knows:[person]->[person]" + - "created:[person]->[game,software]" +``` + +Using a `COMPLEX` graph configured as in the example above and creating a new element like: + +[//]: <> (@formatter:off) +```java +graph.addVertex(T.label, "person", T.id, "person/foo"); +``` +[//]: <> (@formatter:on) + +would result in creating a document in the vertex collection `person` with `_key` equals to `foo` (and `_id` +equals to `person/foo`). + +## Naming Constraints + +When using the ArangoDB TinkerPop Provider, be aware that Element IDs must be strings. + +## Persistent Structure + +The ArangoDB TinkerPop Provider maps TinkerPop data structures to ArangoDB data as follows: + +### Vertices + +Vertices are stored as documents in vertex collections. In a `SIMPLE` graph, all vertices are stored in a single +collection, by default named `vertex`. In a `COMPLEX` graph, vertices are stored in collections named +`<label>`. + +Each vertex document contains: + +- Standard ArangoDB fields (`_id`, `_key`, `_rev`) +- Vertex properties as document fields +- Meta-properties nested in the nested map `_meta` + +Additionally, in a `SIMPLE` graph: +- The label field (`_label` by default) + +For example, the following Java code: + +[//]: <> (@formatter:off) +```java +graph + .addVertex("person") + .property("name", "Freddie Mercury") + .property("since", 1970); +``` +[//]: <> (@formatter:on) + +creates a document like this: + +```json +{ + "_key": "4856", + "_id": "vertex/4856", + "_rev": "_kFqmbXK---", + "_label": "person", + "name": "Freddie Mercury", + "_meta": { + "name": { + "since": 1970 + } + } +} +``` + +### Edges + +Edges are stored as documents in edge collections. In a `SIMPLE` graph, all edges are stored in a single collection, by +default named `edge`. In a `COMPLEX` graph, edges are stored in collections named `<label>`. + +Each edge document contains: + +- Standard ArangoDB edge fields (`_id`, `_key`, `_rev`, `_from`, `_to`) +- Edge properties as document fields + +Additionally, in a `SIMPLE` graph: +- The label field (`_label` by default) + +For example, the following Java code: + +[//]: <> (@formatter:off) +```java +Vertex v = graph.addVertex("person"); +v.addEdge("knows", v) + .property("since", 1970); +``` +[//]: <> (@formatter:on) + +creates a document like this: + +```json +{ + "_key": "5338", + "_id": "edge/5338", + "_from": "vertex/5335", + "_to": "vertex/5335", + "_rev": "_kFq20-u---", + "_label": "knows", + "since": 1970 +} +``` + +## Element IDs + +Given a Gremlin element, you can get the corresponding ArangoDB document ID (`_id` field) using the +`ArangoDBGraph.elementId(Element)` method: + +[//]: <> (@formatter:off) +```java +Vertex v = graph.addVertex("name", "marko"); +String id = graph.elementId(v); +``` +[//]: <> (@formatter:on) + +This is useful when you need to reference the element directly in AQL queries. + + +## Query Optimization + +ArangoDB TinkerPop Provider includes an optimization strategy that can push certain Gremlin traversal steps down to +the database layer for improved performance. +This is applied by `com.arangodb.tinkerpop.gremlin.process.traversal.strategy.optimization.ArangoStepStrategy`. + +### HasStep Pushdown + +The optimizer analyzes the traversal steps and attempts to convert filter steps of type +`org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep` into AQL queries that execute directly on the +database. This reduces the amount of data transferred and processed in the client application. + +All Gremlin predefined predicate values from `org.apache.tinkerpop.gremlin.process.traversal.P` are supported: +- **comparison predicates**: `eq`, `neq`, `lt`, `gt`, etc. +- **collection predicates**: `within`, `without` +- **text predicates**: `containing`, `startingWith`, `endingWith`, `regex` +- **logical combinations**: `and`, `or`, `not` + +For example, the following traversal is optimized to execute the filtering logic in ArangoDB using AQL and transferring to the client only the matching +vertices, rather than retrieving all vertices and filtering them in the client. + +[//]: <> (@formatter:off) +```groovy +g.V().has("value", "foo") +``` +[//]: <> (@formatter:on) + +### Disabling Optimization + +If you need to disable the optimization strategy: + +1. **Create a traversal source** without the optimization strategy: + + [//]: <> (@formatter:off) + ```java + GraphTraversalSource g = graph.traversal().withoutStrategies(ArangoStepStrategy.class); + ``` + [//]: <> (@formatter:on) + +2. **Use the traversal source** as normal. All traversals will execute without AQL optimization. + +## AQL Queries + +For complex queries or performance-critical operations, you can use ArangoDB's native query language (AQL) directly: + +[//]: <> (@formatter:off) +```java +List<Vertex> alice = graph + .<Vertex>aql("FOR v IN vertex FILTER v.name == @name RETURN v", Map.of("name", "Alice")) + .toList(); + +// Query using document ID +Vertex v = graph.addVertex("name", "marko"); +String id = graph.elementId(v); +List<Vertex> result = graph + .<Vertex>aql("RETURN DOCUMENT(@id)", Map.of("id", id)) + .toList(); +``` +[//]: <> (@formatter:on) + +## Supported Features + +This library supports the following features: + +```text +> GraphFeatures +>-- Computer: false +>-- Persistence: true +>-- ConcurrentAccess: true +>-- Transactions: false +>-- ThreadedTransactions: false +>-- IoRead: true +>-- IoWrite: true +>-- OrderabilitySemantics: false +>-- ServiceCall: false +> VariableFeatures +>-- Variables: true +>-- LongArrayValues: true +>-- StringArrayValues: true +>-- BooleanValues: true +>-- ByteValues: false +>-- DoubleValues: true +>-- FloatValues: false +>-- IntegerValues: true +>-- LongValues: true +>-- MapValues: true +>-- MixedListValues: true +>-- SerializableValues: false +>-- StringValues: true +>-- UniformListValues: true +>-- BooleanArrayValues: true +>-- ByteArrayValues: false +>-- DoubleArrayValues: true +>-- FloatArrayValues: false +>-- IntegerArrayValues: true +> VertexFeatures +>-- DuplicateMultiProperties: false +>-- AddVertices: true +>-- RemoveVertices: true +>-- MultiProperties: false +>-- MetaProperties: true +>-- Upsert: false +>-- NullPropertyValues: true +>-- AddProperty: true +>-- RemoveProperty: true +>-- UserSuppliedIds: true +>-- NumericIds: false +>-- StringIds: true +>-- UuidIds: false +>-- CustomIds: false +>-- AnyIds: false +> VertexPropertyFeatures +>-- NullPropertyValues: true +>-- RemoveProperty: true +>-- UserSuppliedIds: false +>-- NumericIds: true +>-- StringIds: true +>-- UuidIds: true +>-- CustomIds: true +>-- AnyIds: false +>-- Properties: true +>-- LongArrayValues: true +>-- StringArrayValues: true +>-- BooleanValues: true +>-- ByteValues: false +>-- DoubleValues: true +>-- FloatValues: false +>-- IntegerValues: true +>-- LongValues: true +>-- MapValues: true +>-- MixedListValues: true +>-- SerializableValues: false +>-- StringValues: true +>-- UniformListValues: true +>-- BooleanArrayValues: true +>-- ByteArrayValues: false +>-- DoubleArrayValues: true +>-- FloatArrayValues: false +>-- IntegerArrayValues: true +> EdgeFeatures +>-- Upsert: false +>-- AddEdges: true +>-- RemoveEdges: true +>-- NullPropertyValues: true +>-- AddProperty: true +>-- RemoveProperty: true +>-- UserSuppliedIds: true +>-- NumericIds: false +>-- StringIds: true +>-- UuidIds: false +>-- CustomIds: false +>-- AnyIds: false +> EdgePropertyFeatures +>-- Properties: true +>-- LongArrayValues: true +>-- StringArrayValues: true +>-- BooleanValues: true +>-- ByteValues: false +>-- DoubleValues: true +>-- FloatValues: false +>-- IntegerValues: true +>-- LongValues: true +>-- MapValues: true +>-- MixedListValues: true +>-- SerializableValues: false +>-- StringValues: true +>-- UniformListValues: true +>-- BooleanArrayValues: true +>-- ByteArrayValues: false +>-- DoubleArrayValues: true +>-- FloatArrayValues: false +>-- IntegerArrayValues: true +``` + +## Current Limitations + +- This library implements the Online Transactional Processing Graph Systems (OLTP) API only. The Online Analytics Processing Graph Systems (OLAP) API is currently not implemented. +- Some generated queries might not be optimized, since the Process API is only partially implemented (see [Query Optimization](#query-optimization)). For optimal query performance is recommended to use [AQL queries](#aql-queries). + +## Logging + +The library uses the `slf4j` API for logging. To log requests and responses to and from the database, enable the `DEBUG` log level for the logger `com.arangodb.internal.net.Communication`. + +## Examples and Demo + +The [demo](https://github.com/arangodb/arangodb-tinkerpop-provider/tree/main/demo) project contains comprehensive usage examples of this library. + +For additional examples, check +the [Gremlin tutorial](https://tinkerpop.apache.org/docs/3.7.4/tutorials/getting-started/). + +## Acknowledgments + +This repository is based on and extends the original work of +the [arangodb-community/arangodb-tinkerpop-provider](https://github.com/arangodb-community/arangodb-tinkerpop-provider) +project. + +We gratefully acknowledge the efforts of [Horacio Hoyos Rodriguez](https://github.com/arcanefoam) and other contributors +of the community repository, see [AUTHORS.md](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/AUTHORS.md). diff --git a/site/content/arangodb/3.13/features/list.md b/site/content/arangodb/3.13/features/list.md index ee4006160b..93f6002d42 100644 --- a/site/content/arangodb/3.13/features/list.md +++ b/site/content/arangodb/3.13/features/list.md @@ -145,11 +145,9 @@ aliases: threshold is reached. {{% /comment %}} -{{% comment %}} Experimental feature - [**Vector search**](../index-and-search/indexing/working-with-indexes/vector-indexes.md): Find items with similar properties by comparing vector embeddings generated by machine learning models. -{{% /comment %}} - [**Search highlighting**](../index-and-search/arangosearch/search-highlighting.md): Get the substring positions of matched terms, phrases, or _n_-grams. diff --git a/site/content/arangodb/3.13/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/3.13/index-and-search/indexing/which-index-to-use-when.md index ec36b3d532..fcedb87747 100644 --- a/site/content/arangodb/3.13/index-and-search/indexing/which-index-to-use-when.md +++ b/site/content/arangodb/3.13/index-and-search/indexing/which-index-to-use-when.md @@ -175,11 +175,11 @@ db.collection.ensureIndex({ type: "persistent", fields: [ "attributeName1", "att When not explicitly set, the `sparse` attribute defaults to `false` for new indexes. Indexes other than persistent do not support the `sparse` option. -As sparse indexes may exclude some documents from the collection, they cannot be used for -all types of queries. Sparse hash indexes cannot be used to find documents for which at -least one of the indexed attributes has a value of `null`. For example, the following AQL -query cannot use a sparse index, even if one was created on attribute `attr`: -<!-- TODO Remove above statement? --> +As sparse indexes may exclude some documents from the collection, they cannot +be used for all types of queries. For example, sparse persistent indexes cannot +be used to find documents for which at least one of the indexed attributes +is missing or has a value of `null`. For example, the following AQL +query cannot use a sparse index over the attribute `attr`: ```aql FOR doc In collection @@ -189,15 +189,25 @@ FOR doc In collection If the lookup value is non-constant, a sparse index may or may not be used, depending on the other types of conditions in the query. If the optimizer can safely determine that -the lookup value cannot be `null`, a sparse index may be used. When uncertain, the optimizer -does not make use of a sparse index in a query in order to produce correct results. +the lookup value cannot be `null`, a sparse index may be used. + +```aql +FOR doc In collection + LET random = RAND() * 5 + FILTER doc.attr < random // Includes numbers < random but also true, false, and null! + FILTER doc.attr != null // Explicitly exclude null to make a sparse index eligible + RETURN doc +``` + +When uncertain, the optimizer does not make use of a sparse index in a query in +order to produce correct results. For example, the following queries cannot use a sparse index on `attr` because the optimizer does not know beforehand whether the values which are compared to `doc.attr` include `null`: ```aql FOR doc In collection - FILTER doc.attr == SOME_FUNCTION(...) + FILTER doc.attr == SOME_FUNCTION(...) RETURN doc ``` diff --git a/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md index 3ebbb3f8c9..174e095f16 100644 --- a/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -14,27 +14,24 @@ data numerically and can be generated with machine learning models. You can then quickly find a given number of semantically similar documents by searching for close neighbors in a high-dimensional vector space. -The vector index implementation uses the [Faiss library](https://github.com/facebookresearch/faiss/) -to support L2 and cosine metrics. The index used is IndexIVFFlat, the quantizer -for L2 is IndexFlatL2, and the cosine uses IndexFlatIP, where vectors are -normalized before insertion and search. +The vector index implementation uses the [Faiss library](https://github.com/facebookresearch/faiss/). ## How to use vector indexes {{< warning >}} -The vector index is an experimental feature that you need to enable for the -ArangoDB server with the `--experimental-vector-index` startup option. +You need to enable the vector index feature for the +ArangoDB server with the `--vector-index` startup option. Once enabled for a deployment, it cannot be disabled anymore because it permanently changes how the data is managed by the RocksDB storage engine (it adds an additional column family). -To restore a dump that contains vector indexes, the `--experimental-vector-index` +To restore a dump that contains vector indexes, the `--vector-index` startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} -1. Enable the experimental vector index feature. -2. Calculate vector embeddings using [ArangoDB's GraphML](../../../../../gen-ai/graphml/_index.md) - capabilities (available in ArangoGraph) or using external tools. +1. Enable the vector index feature. +2. Calculate vector embeddings using [Arango's GraphML](../../../../../gen-ai/graphml/_index.md) + capabilities (available in the AI Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which similarity metric you want to use later for querying. See @@ -65,17 +62,26 @@ centroids and the quality of vector search thus degrades. - **fields** (array of strings): A list with a single attribute path to specify where the vector embedding is stored in each document. The vector data needs to be populated before creating the index. - + If you want to index another vector embedding attribute, you need to create a separate vector index. +- **sparse** (boolean): Whether to create a sparse index that excludes documents + with the attribute for indexing missing or set to `null`. This attribute is + defined by `fields`. Default: `false`. - **parallelism** (number): - The number of threads to use for indexing. The default is `2`. + The number of threads to use for indexing. Default: `2`. - **inBackground** (boolean): Set this option to `true` to keep the collection/shards available for write operations by not using an exclusive write lock for the duration - of the index creation. The default is `false`. + of the index creation. Default: `false`. - **params**: The parameters as used by the Faiss library. - - **metric** (string): Whether to use `cosine` or `l2` (Euclidean) distance calculation. + - **metric** (string): The measure for calculating the vector similarity: + - `"cosine"`: Angular similarity. Vectors are automatically + normalized before insertion and search. + - `"innerProduct"` (introduced in v3.12.6): + Similarity in terms of angle and magnitude. + Vectors are not normalized, making it faster than `cosine`. + - `"l2":` Euclidean distance. - **dimension** (number): The vector dimension. The attribute to index needs to have this many elements in the array that stores the vector embedding. - **nLists** (number): The number of Voronoi cells to partition the vector space @@ -89,11 +95,11 @@ centroids and the quality of vector search thus degrades. number of documents. - **defaultNProbe** (number, _optional_): How many neighboring centroids to consider for the search results by default. The larger the number, the slower - the search but the better the search results. The default is `1`. You should + the search but the better the search results. Default: `1`. You should generally use a higher value here or per query via the `nProbe` option of the vector similarity functions. - **trainingIterations** (number, _optional_): The number of iterations in the - training process. The default is `25`. Smaller values lead to a faster index + training process. Default: `25`. Smaller values lead to a faster index creation but may yield worse search results. - **factory** (string, _optional_): You can specify an index factory string that is forwarded to the underlying Faiss library, allowing you to combine different diff --git a/site/content/arangodb/3.13/release-notes/version-3.12/api-changes-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/api-changes-in-3-12.md index 67e72e191d..989fc09923 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.12/api-changes-in-3-12.md +++ b/site/content/arangodb/3.13/release-notes/version-3.12/api-changes-in-3-12.md @@ -309,6 +309,17 @@ is for debugging purposes. See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +#### AQL query recording + +<small>Introduced in: v3.12.6</small> + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted queries. This feature is for debugging purposes. + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + #### Access tokens <small>Introduced in: v3.12.5</small> @@ -452,11 +463,11 @@ add the `withHidden=true` query parameter to the call of the endpoint. curl "http://localhost:8529/_api/index?collection=myCollection&withHidden=true" ``` -#### Vector indexes (experimental) +#### Vector indexes <small>Introduced in: v3.12.4</small> -A new `vector` index type has been added as an experimental feature. +A new `vector` index type has been added. See [HTTP interface for vector indexes](../../develop/http-api/indexes/vector.md) for details. diff --git a/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md index 696a7d8fc2..c04a497483 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md +++ b/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md @@ -320,6 +320,15 @@ per-query limit with the [`memoryLimit` query option](../../aql/how-to-invoke-aq or its default using the `--query.memory-limit` startup option. You can adjust the global limit with the `--query.global-memory-limit` startup option. +--- + +<small>Introduced in: v3.12.6</small> + +The memory accounting for AQL queries has been extended to track the memory usage +of the `MERGE()` function, `RETURN DISTINCT`, and certain uses of the `COLLECT` +operation. More queries compared to previous 3.12 versions may get killed due to +exceeding the memory limit as a result of the improved tracking. + ## Adjustable Stream Transaction size [Stream Transactions](../../develop/transactions/stream-transactions.md) may @@ -900,6 +909,76 @@ the following steps. 4. Restore the dump to the new deployment. You can directly move from any 3.11 or 3.12 version to 3.12.4 (or later) this way. +## RocksDB upgrade + +<small>Introduced in: v3.12.6</small> + +The RocksDB library has been upgraded from version 7.2.0 to 9.5.0. + +As part of this storage engine upgrade, the default values of the following +RocksDB-related startup options have been changed: + +- `--rocksdb.pending-compactions-slowdown-trigger` has been changed from 128 KiB to 1 GiB. +- `--rocksdb.pending-compactions-stop-trigger` has been changed from 16 GiB to 32 GiB. +- `--rocksdb.partition-files-for-documents` has been changed from false to true. +- `--rocksdb.throttle-slow-down-writes-trigger` has been obsoleted. + +## Optional elevation for GeoJSON Points + +<small>Introduced in: v3.11.14-2, v3.12.6</small> + +GeoJSON Point may now have three coordinates: `[longitude, latitude, elevation]`. +However, ArangoDB does not take any elevation into account in geo-spatial +calculations. + +Points with an elevation do no longer fail the validation in the `GEO_POLYGON()` +and `GEO_MULTIPOLYGON()` functions. Moreover, GeoJSON with three coordinates is +now indexed by geo indexes and thus also matched by geo-spatial queries, which +means you may find more results than before. + +Also see [Geo-spatial functions in AQL](../../aql/functions/geo.md). + +## Additional validation by AQL GeoJSON functions + +<small>Introduced in: v3.12.6</small> + +The following AQL functions to construct GeoJSON objects now validate that the +provided input uses either two or three coordinates for every point +(`[longitude, latitude]` or `[longitude, latitude, elevation]`): + +- `GEO_MULTIPOINT()` +- `GEO_LINESTRING()` +- `GEO_MULTILINESTRING()` + +For example, the following function calls now fail to validate and raise a +warning because of invalid points in the data: + +```aql +GEO_MULTIPOINT([[1], [2,3]]) +GEO_LINESTRING([[1,2], []]) +GEO_MULTILINESTRING([[[1,2,3,4],[5,6]],[[7,8],[9,0]]]) +``` + +## Cosine similarity fix for vector indexes + +<small>Introduced in: v3.12.6</small> + +A normalization issue has been addressed for the experimental vector index type. +It was possible for the cosine similarity value returned by `APPROX_NEAR_COSINE()` +to be outside the expected range of `[-1, 1]`. + +It is recommended to recreate all vector indexes that use the `cosine` metric +after upgrading to v3.12.6 or later. + +## Added error reporting for invalid requests + +<small>Introduced in: v3.12.6</small> + +When _arangod_ parses HTTP requests and encounters an unexpected `Content-Length` +header or an invalid URL, it now sends a response with an error object instead +of closing the connection, e.g. that the URL is corrupt with an HTTP status code +of 400. + ## HTTP RESTful API ### JavaScript-based traversal using `/_api/traversal` removed @@ -1075,6 +1154,16 @@ background compactions. The changed default ensures this cleanup to happen more frequently. Compactions can potentially lead to spikes in CPU, memory, and I/O usage. You may now observe this daily instead of monthly. +### RocksDB transaction lock timeout controlled internally + +<small>Deprecated in: v3.12.6</small> + +The `--rocksdb.transaction-lock-timeout` startup option has been deprecated. +It was supposed to let you configure the wait timeout in milliseconds for +locking a document in a transaction. However, the lock timeout is actually set +to differnet values internally, depending on what is a meaningful timeout for +a given case. + ## Client tools ### arangodump diff --git a/site/content/arangodb/3.13/release-notes/version-3.12/whats-new-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/whats-new-in-3-12.md index 9dc4aee978..b5fdc5616f 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.12/whats-new-in-3-12.md +++ b/site/content/arangodb/3.13/release-notes/version-3.12/whats-new-in-3-12.md @@ -180,6 +180,24 @@ The following new metrics have been added for memory observability: | `arangodb_transactions_internal_memory_usage` | Total memory usage of internal transactions. | | `arangodb_transactions_rest_memory_usage` | Total memory usage of user transactions (excluding top-level AQL queries). | +--- + +<small>Introduced in: v3.12.6</small> + +The memory accounting for AQL queries has been extended to track the memory usage +of the following: + +- Grouping with the `COLLECT` operation if the `sorted` method is used. +- Aggregating with `COLLECT ... AGGREGATE`. +- Deduplicating results with `RETURN DISTINCT`. +- Using the `MERGE()` function to combine objects. +- Internal buffers for execution blocks, late materialization, building results, + and distributing AQL queries in cluster deployments. +- Internal buffers for decay, distance, and replace functions. +- Internal buffers used by the query parser and optimizer. + +It is expected that the reported memory consumption is now higher. + ## Web interface ### Shard rebalancing @@ -1293,6 +1311,68 @@ Indexes used: 10 idx_1836452431376941056 persistent coll ``` +### Deduction of node collection for graph queries + +<small>Introduced in: v3.12.6</small> + +AQL graph traversals and path searches using anonymous graphs / collection sets +require that you declare all involved node collections upfront for cluster +deployments. That is, you need to use the `WITH` operation to list the collections +edges may point to, as well as the collection of the start node if not declared +otherwise. This also applies to single servers if the `--query.require-with` +startup option is enabled for parity between both deployment modes. + +For example, assume you have two node collections, `person` and `movie`, and +edges pointing from one to the other stored in an `acts_in` edge collection. +If you want to run a traversal query starting from a person that you specify +with its document ID, you need to declare both node collections at the +beginning of the query: + +```aql +WITH person, movie +FOR v IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label +``` + +From v3.12.6 onward, the node collections can be automatically inferred if there +is a named graph using the same edge collection(s). + +For example, assume there is a named graph that includes an edge definition for +the `acts_in` edge collection, with `person` as the _from_ collection and `movie` +as the _to_ collection. If you now specify `acts_in` as an edge collection in +an anonymous graph query, all named graphs are checked for this edge collection, +and if there is a matching edge definition, its node collections are automatically +added as data sources to the query. You no longer have to manually declare the +`person` and `movie` collections: + +```aql +FOR v IN 0..1 OUTBOUND "person/1544" acts_in + LIMIT 4 + RETURN v.label +``` + +You can still declare collections manually, in which case they are added as +data sources in addition to automatically deduced collections. + +### Optional elevation for GeoJSON Points + +<small>Introduced in: v3.11.14-2, v3.12.6</small> + +The `GEO_POINT()` function now accepts an optional third argument to create a +GeoJSON Point with three coordinates: `[longitude, latitude, elevation]`. + +GeoJSON Points may now have three coordinates in general. +However, ArangoDB does not take any elevation into account in geo-spatial +calculations. + +Points with an elevation do no longer fail the validation in the `GEO_POLYGON()` +and `GEO_MULTIPOLYGON()` functions. Moreover, GeoJSON with three coordinates is +now indexed by geo indexes and thus also matched by geo-spatial queries, which +means you may find more results than before. + +Also see [Geo-spatial functions in AQL](../../aql/functions/geo.md). + ## Indexing ### Multi-dimensional indexes @@ -1405,18 +1485,18 @@ Note that it is still forbidden to use `_id` as a top-level attribute or sub-attribute in `fields` of persistent indexes. On the other hand, inverted indexes have been allowing to index and store the `_id` system attribute. -### Vector indexes (experimental) +### Vector indexes <small>Introduced in: v3.12.4</small> -A new `vector` index type has been added as an experimental feature that enables +A new `vector` index type has been added that enables you to find items with similar properties by comparing vector embeddings, which are numerical representations generated by machine learning models. -To try out this feature, start an ArangoDB server (`arangod`) with the -`--experimental-vector-index` startup option. You need to generate -vector embeddings before creating a vector index. For more information about -the vector index type including the available settings, see the +To use this feature, start an ArangoDB server (`arangod`) with the `--vector-index` +startup option (or `--experimental-vector-index` in v3.12.4 and v3.12.5). +You need to generate vector embeddings before creating a vector index. For more +information about the vector index type including the available settings, see the [Vector indexes](../../index-and-search/indexing/working-with-indexes/vector-indexes.md) documentation. @@ -1443,6 +1523,34 @@ utilizing vector indexes in queries. Furthermore, a new error code `ERROR_QUERY_VECTOR_SEARCH_NOT_APPLIED` (1554) has been added. +--- + +<small>Introduced in: v3.12.6</small> + +Vector indexes now support filtering. You can add `FILTER` operations between +`FOR` and `SORT` that are then applied during the lookup in the vector index. +Note that e.g. `LIMIT 5` does not ensure that you get 5 results by searching +as many neighboring Voronoi cells as necessary, but it rather considers only as +many as configured via the `nProbes` parameter. Example: + +```aql +FOR doc IN coll + FILTER doc.val > 3 + SORT APPROX_NEAR_COSINE(doc.vector, @q) DESC + LIMIT 5 + RETURN doc +``` + +Vector indexes can now be sparse to exclude documents with the embedding attribute +for indexing missing or set to `null`. + +Another metric has been added. The `innerProduct` is a vector similarity measure +calculated using the dot product of two vectors without normalizing them. +Therefore, it compares not only the angle but also the magnitudes. +The accompanying AQL function is the following: + +- `APPROX_NEAR_INNER_PRODUCT()` + ## Server options ### Effective and available startup options @@ -2211,6 +2319,40 @@ DB-Servers in a cluster has been added: |:------|:------------| | `arangodb_vocbase_transactions_lost_subordinates_total` | Counts the number of lost subordinate transactions on database servers. | +### RocksDB upgrade + +<small>Introduced in: v3.12.6</small> + +The RocksDB library has been upgraded from version 7.2.0 to 9.5.0. + +As a result, you may see performance improvements while using slightly less +resources especially for mixed workloads. + +The following new RocksDB functionality is exposed in ArangoDB: + +- Different types of block caches, LRU and HyperClockCache (HCC), selectable via + the new `--rocksdb.block-cache-type` startup option +- A `--rocksdb.block-cache-estimated-entry-charge` startup option to configure the HCC. +- RocksDB table format version 6 (not downwards-compatible to older versions of RocksDB). +- RocksDB blob caching (if blobs are enabled for the documents column family), + which you can enable via `--rocksdb.enable-blob-cache`. +- Using blob files only from a certain level onwards (if blobs are enabled for + the documents column family), which you can enable via + `--rocksdb.blob-file-starting-level`. +- Blob cache prepopulation, which you can enable via `--rocksdb.prepopulate-blob-cache`. +- An option to generate Bloom/Ribbon filters that minimize memory internal + fragmentation, which you can enable with `--rocksdb.optimize-filters-for-memory`. + +The following RocksDB metrics have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_block_cache_charge_per_entry` | Average size of entries in RocksDB block cache. +| `rocksdb_block_cache_entries` | Number of entries in the RocksDB block cache. +| `rocksdb_live_blob_file_garbage_size` | Size of garbage in live RocksDB .blob files. +| `rocksdb_live_blob_file_size` | Size of live RocksDB .blob files. +| `rocksdb_num_blob_files` | Number of live RocksDB .blob files. + ### API call recording <small>Introduced in: v3.12.5</small> @@ -2222,9 +2364,9 @@ is for debugging purposes. You can configure the memory limit for this feature with the following startup option: - `--server.api-recording-memory-limit`: - Size limit for the list of API call records (default: `25600000`). + Size limit for the list of API call records (default: `26214400`). -This means that 25 MB of memory is reserved by default. +This means that 25 MiB of memory is reserved by default. API call recording is enabled by default but you can disable it via the new `--server.api-call-recording` startup option. @@ -2243,6 +2385,41 @@ impact of this feature: See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +### AQL query recording + +<small>Introduced in: v3.12.6</small> + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted query. This feature is for debugging purposes. + +You can configure the memory limit for this feature with the following startup option: + +- `--server.aql-recording-memory-limit`: + Size limit for the list of AQL query records (default: `26214400` bytes) + +This means that 25 MiB of memory is reserved by default. + +AQL query recording is enabled by default but you can disable it via the new +`--server.aql-query-recording` startup option. + +This and the `/_admin/server/api-calls` endpoint are referred to as the +recording API, which exposes the recorded API calls and AQL queries. It is +enabled by default. Users with administrative access to the `_system` database +can call the endpoints. You can further restrict the access to only the +superuser by setting `--log.recording-api-enabled` to `jwt`, or disable the +endpoints altogether by setting the option to `false`. + +A metric has been added for the time spent on AQL query recording to track the +impact of this feature: + +| Label | Description | +|:------|:------------| +| `arangodb_aql_recording_call_time` | Execution time histogram for AQL recording calls in nanoseconds. | + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + ### Access tokens <small>Introduced in: v3.12.5</small> @@ -2257,6 +2434,24 @@ dates, and individually revoke tokens. See the [HTTP API](../../develop/http-api/authentication.md#access-tokens) documentation. +### `@PID@` and `@TEMP_BASE_DIR@` placeholders for startup options + +<small>Introduced in: v3.12.6</small> + +You can use special placeholders in startup options like `--log.output` that get +substituted as follows: + +- `@PID@`: Replaced at runtime with the actual process ID. This has already + been supported using a literal occurrence of `$PID`. +- `@TEMP_BASE_DIR@`: Replaced at runtime with the current temporary directory, + e.g. `/tmp/arangodb_i37Xxh` (automatically created on startup with a randomly + generated suffix). + +Keep in mind that `@NAME@` is also the syntax for using the value of an +environment variable `NAME`. If there is an environment variable called `PID` or +`TEMP_BASE_DIR`, then `@PID@` or `@TEMP_BASE_DIR@` is substituted with the +value of the respective environment variable. + ## Client tools ### Protocol aliases for endpoints diff --git a/site/content/data-platform/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md index e429e687fc..5e8b7e605a 100644 --- a/site/content/data-platform/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -6,35 +6,36 @@ description: >- Visually explore and interact with your ArangoDB graphs through an intuitive interface --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} The **Graph Visualizer** is a browser-based tool integrated into the web interface -of the ArangoDB Platform. It lets you explore the connections of your named graphs +of the Arango Data Platform. It lets you explore the connections of your named graphs to visually understand the structure as well as to inspect and edit the attributes of individual nodes and edges. It also offers query capabilities and you can create new nodes (vertices) and edges (relations). ![A screenshot of the Graph Visualizer user interface showing some persons and movies as circles with arrows indicting who acted in or directed a movie](../images/graph-visualizer.png) -{{< info >}} -Graph creation is **not** performed within the Graph Visualizer. Graphs must be -created in the **Management** section under **Graphs** of the second-level -navigation in the [web interface](../arangodb/3.12/components/web-interface/graphs.md). Once -created, you can select a graph from the list for exploration and visualization. -{{< /info >}} - You can use the Graph Visualizer to do the following: -- Filter and view specific nodes to focus on a subset of your graph. +- Select and view specific nodes including with custom queries to focus on a + subset of your graph. - Dynamically expand nodes to show more of their neighborhood to see how entities are connected. - Inspect the properties of nodes and edges. - Modify existing or create new nodes and edges. -- Rearrange nodes automatically or manually for better visual clarity. -- Use zoom and pan to explore large graphs more easily. +- Rearrange nodes automatically or manually as well as assign colors and icons + for better visual clarity. + +{{< info >}} +Graph creation is **not** performed within the Graph Visualizer. Graphs must be +created in the **Management** section under **Graphs** of the second-level +navigation in the [web interface](../arangodb/3.12/components/web-interface/graphs.md). Once +created, you can select a graph from the list for exploration and visualization. +{{< /info >}} ## View a graph @@ -49,35 +50,41 @@ supported by the Graph Visualizer. ### Select and load a graph -1. In the ArangoDB Platform web interface, select the database your named graph - is stored in. +1. In the Arango Data Platform web interface, select the database your + named graph is stored in. 2. Click **Graphs** in the main navigation. 3. Select a graph from the list. 4. The viewport of the Graph Visualizer opens for exploring the graph. -The main area of the viewport may initially be empty in the following cases: - -- You opened a graph for the first time and nothing is selected for displaying yet -- You used the **Clear Canvas** option -<!-- TODO: Doesn't it preserve the last state? Can it be lost? -- Reopening the Graph Visualizer after a previous session ---> +When you open a graph for the first time or previously used the **Clear graph** +option, the Graph Visualizer automatically populates the canvas with an initial +neighborhood. You can right-click the canvas and choose **Clear Canvas** to start +with an empty canvas. You can [Add nodes to the canvas manually](#add-nodes-to-the-canvas-manually) as well as [Add nodes and edges using a query](#add-nodes-and-edges-using-a-query). -Afterwards, you can also [Add nodes and edges using a query based on a selection](#add-nodes-and-edges-using-a-query-based-on-a-selection) +Afterwards, you can also [Add nodes and edges using a query based on a selection](#add-nodes-and-edges-using-a-query-based-on-a-selection-canvas-actions) as well as [Remove nodes from the canvas](#remove-nodes-from-the-canvas). +For each graph, the Graph Visualizer remembers the nodes and edges that are on +the canvas across sessions using the local browser storage. It also remembers +the theme settings including unsaved visual customizations, but not the specific +spatial arrangement of the nodes. + ### The viewport The Graph Visualizer interface is comprised of the following components: +- **Top bar**: The name and type of the graph, as well as a button to get + back to the list of named graphs. - **Canvas**: The main area of the viewport. - **Search & add nodes to canvas** and **Queries**: A widget in the top left corner that opens dialogs for selecting nodes and edges to display (manually or using queries). -- [**Customization**](#visual-customization): - A sidebar on the right-hand side to adjust the styling. +- [**Legend**](#legend-and-visual-customization): + A panel on the right-hand side that shows you what colors and icons are used + for nodes and edges, as well as to adjust the styling, and to select all + items of a type. - [**Layout and Navigation**](#layouts-and-navigation-tools): A minimap and multiple tools for the canvas in the bottom right corner. @@ -88,25 +95,28 @@ displayed. 1. Click **Search & add nodes to canvas**. 2. Select a **Node type**. This is the name of the collection that stores the - node you want to select. -3. Enter a value into the **Search** field. This searches common attributes - as indicated by the placeholder text and finds up to 10 nodes that contain - this text in one of these attributes (case-insensitive). + nodes you want to select. +3. Enter a value into the **Search** field. This searches for document IDs +<!-- TODO: Will this come back? +This searches common attributes as indicated by the placeholder text and finds +up to 10 nodes that contain this text in one of these attributes +-->and finds up to 10 nodes that contain this text (case-insensitive). 4. Select one or more nodes from the list on the left-hand side. -5. Optional: You can check the attributes of the selected nodes on the - right-hand side. Use the buttons at the bottom to switch between nodes. -6. Click **Add _n_ vertices**. +5. Optional: You can inspect the attributes of the selected nodes on the + right-hand side. Use the buttons at the bottom + ({{< icon "caret-left" >}}, {{< icon "caret-right" >}}) to switch between nodes. +6. Click **Add # nodes**. 7. To see the neighbor nodes and the edges that connect them, right-click a node, - click **Expand (_n_)** and then **All (_n_)**. + click **Expand (#)** and then **All (#)**. ![A screenshot of the dialog for adding nodes with two persons selected](../images/graph-visualizer-add-nodes.png) ### Add nodes and edges using a query -You can run an AQL query to add a nodes, edges, or paths of the graph to the canvas. +You can run an AQL query to add nodes, edges, or paths of the graph to the canvas. 1. Click **Queries** of the top-left widget. -2. Click **New query**. +2. On the **Queries** tab, click **New query**. 3. Enter an AQL query that returns nodes, edges, or paths (e.g. a graph traversal query), for example: ```aql @@ -126,25 +136,40 @@ You can run an AQL query to add a nodes, edges, or paths of the graph to the can You can save queries for future use: 1. Click **Queries** of the top-left widget. -2. Click **New query**. +2. On the **Queries** tab, click **New query**. 3. Enter or edit the AQL query you want to save. You can optionally use - bind variables to parameterize saved queries. + bind variables (like `@var`, `@@coll`) to parameterize saved queries. 4. Enter a name and optionally a description, then click **Save**. 5. To run a saved query, click **Queries** of the top-left widget. 6. Select a query from the list. The following actions are available for each query: + - Copy ({{< icon "duplicate" >}}) the query string to the clipboard. - **Bind Variables** to set for the query. - - **Run** the query. - - **Copy** the query string to the clipboard. - - **Delete** a no longer needed query. + - Edit ({{< icon "edit-square" >}}) the query. + - Delete ({{< icon "delete" >}}) a no longer needed query. + - Run ({{< icon "run" >}}) the query. {{< /tip >}} ![A screenshot of the dialog with a query expanded and a bind variable filled in](../images/graph-visualizer-queries.png) -### Add nodes and edges using a query based on a selection +### Add nodes and edges using a query based on a selection (Canvas Actions) -You can select nodes and edges on the canvas and then use a **Canvas Action**. +**Canvas Actions** are stored AQL queries that work with your current selection +of nodes and edges on the canvas. Think of them as tools that let you discover +related data for what you have selected. Unlike regular queries that work on the +entire graph, Canvas Actions use special bind variables (`@nodes` and `@edges`) +in their AQL query to reference your selected items, making them context-aware +and interactive. + +You can select nodes, edges, or both on the canvas and then use a **Canvas Action**. This runs an AQL query to add nodes, edges, or paths of the graph to the canvas. -The query has access to the current selection via special bind variables. +For example, you could select a movie and use a Canvas Action that adds all +other movies with the same runtime as the one you selected. Or you could select +two persons and use a Canvas Action to add all movies and persons that are on +the shortest paths between the selected persons. + +The query of a Canvas Action has access to the current selection via the +`@nodes` and `@edges` bind variables. Both are arrays with the document IDs of +the currently selected nodes respectively edges. 1. Create a selection. You have different options: - Click a node or edge to select only this element. @@ -154,9 +179,12 @@ The query has access to the current selection via special bind variables. 3. Depending on the query, additional nodes or edges with their nodes are added to the canvas. 4. To create a custom Canvas Action query, click **Queries** of the top-left widget. -5. Click **Canvas Actions**, then **New action**. +5. Go to the **Canvas actions** tab and click **New action**. 6. Enter an AQL query that makes use of the special bind variable `@nodes`, - `@edges`, or both and returns nodes, edges, or paths. Examples: + `@edges`, or both and returns nodes, edges, or paths. For example, iterate + over the document IDs of the selected nodes, perform a graph traversal for + each node, filter and limit the results, and add all of the items on the path + to the canvas: ```aql FOR selectedNode IN @nodes FOR v, e, p IN 1..3 ANY selectedNode GRAPH "myGraph" @@ -168,6 +196,25 @@ The query has access to the current selection via special bind variables. ![A screenshot of the context menu for a node showing the available Canvas Actions](../images/graph-visualizer-menu-canvas-action.png) +### Explore connections + +You can explore the connections between entities of your graph in the following +ways: + +- **Expand a node**: Right-click a node, then click **Expand (#)** and **All (#)**. + This adds the direct neighbor nodes as well as the connecting edges to the canvas. + +- **Shortest Path**: Select exactly two nodes, right-click one of them, and click + **Shortest Path**. If there is a path between both nodes, the nodes and edges + of one shortest path between them are added to the canvas. + +- [**Queries**](#add-nodes-and-edges-using-a-query) and + [**Canvas Actions**](#add-nodes-and-edges-using-a-query-based-on-a-selection-canvas-actions): + You can run AQL graph queries (also based on the selection) to add connected + nodes to the canvas. For example, you can use traversals to expand multiple + levels of a node at once, or use path searches like `ALL_SHORTEST_PATHS`. + This can be selective if you use `FILTER` operations. + ### Remove nodes from the canvas You can dismiss nodes to show less nodes and edges on the canvas to focus on the @@ -180,37 +227,52 @@ dismissed nodes and their edges back to the canvas later on. - Right-click a single node to select only this node. - Hold the {{< kbd "Shift" >}} or {{< kbd "Ctrl" >}} key and click multiple nodes or drag the mouse to perform a box selection, then right-click one of the selected nodes. -2. In the context menu, click **Dismiss _n_ nodes** to hide the selected nodes, +2. In the context menu, click **Dismiss # nodes** to hide the selected nodes, or click **Dismiss other nodes** to only keep the selection. 3. The canvas updates to only display the remaining nodes, with no dangling edges. ### View node and edge properties -You can inspect the document attributes of node or edge as follows: +You can inspect (and edit) the document attributes of a node or edge via a +properties dialog that you can open as follows: -- Double-click a node or edge to open a dialog with the properties. -- Right-click a node to open the context menu and click **View Node** to open - the dialog with the properties. +- Double-click a node or edge. +- Right-click a node to open the context menu and click **View node**. +- Right-click an edge to open the context menu and click **View edge**. ![A screenshot of the properties dialog with the keys and values of a node](../images/graph-visualizer-node-properties.png) ### Layouts and navigation tools -These features allow you to clear, zoom, and pan the canvas, as well as rearrange -the displayed graph data for a better spatial understanding of node clusters, -hierarchies, and relationship flows. +These features located in the bottom right of the viewport allow you to clear, +zoom, and pan the canvas, as well as rearrange the displayed graph data for a +better spatial understanding of node clusters, hierarchies, and relationship +flows. You can also download an image of what is displayed. -- **Minimap**: A small overview to easier navigate the canvas. +- **Minimap**: A small overview for easier canvas navigation. + You can optionally hide it ({{< icon "caret-right" >}}). -- **Zoom Controls**: Zoom in/out or reset the zoom to 100%. +- **Clear graph**: Remove all nodes and edges from the canvas ({{< icon "clear" >}}). + This only affects what is displayed and does not delete the underlying documents. -- **Fit to Screen**: Resize and center the canvas so you can see everything. +- **Fit to Screen**: Resize and center the canvas so you can see everything + ({{< icon "fit" >}}). -- **Re-run Layout**: Automatically rearrange the nodes using the selected algorithm. +- **Zoom Controls**: Zoom in ({{< icon "zoom-in" >}}), zoom out + ({{< icon "zoom-out" >}}), or reset the zoom to 100%. + +- **Download screenshot**: Save a PNG image of what is currently displayed on + the canvas ({{< icon "download" >}}). + +- **Re-run Layout**: Automatically rearrange the nodes using the selected + algorithm ({{< icon "rerun" >}}). - **Layout Algorithms**: Choose between different ways of arranging the nodes. Which algorithm to use depends on the situation and the graph topology. + You can also move nodes around manually by clicking and dragging them on the + canvas. + ## Edit graph data While the Graph Visualizer is primarily designed for exploring graph data, you @@ -223,31 +285,38 @@ You need to have write access for the database and the collections for this. You can add nodes to the graph's document collections directly from the canvas. This allows you to create additional entities to the graph. -1. In the **Graphs** section of the ArangoDB web interface, select your graph. -2. Right-click on the canvas and choose **Create Node**. +1. In the **Graphs** section of the Arango Data Platform web interface, + select your graph. +2. Right-click the canvas, **Create node**, and choose a node collection to + store the new node in. 3. A dialog opens with the following options: - - Select the target collection (**Node Type**). + - Select the vertex collection (**Node Type**). - Optionally specify a unique identifier (**Node ID**). + - Optionally provide a JSON body to use as the document content. 4. Click **Create** to add the node to the canvas and database. -### Create New Edges +### Create new edges You can add edges to the graph's edge collections directly from the canvas. This allows you to create additional connections between nodes. -1. In the **Graphs** section of the ArangoDB web interface, select your graph. -2. Right-click on the canvas and choose **Create Edge**. -3. In the dialog: - - Select the target collection (**Edge Type**, which corresponds to an edge collection). - - Set the `_from` and `_to` fields by selecting the source and target nodes. +1. In the **Graphs** section of the Arango Data Platform web interface, + select your graph. +2. Right-click the canvas, **Create edge**, and choose an edge collection to + store the new edge in. +3. A dialog opens with the following options: + - Select the edge collection (**Edge Type**). + - Set the **From** and **To** fields by selecting the source and target nodes. - Optionally specify a unique identifier (**Edge ID**). + - Optionally provide a JSON body to use as the document content. 4. Click **Create** to add the edge to the canvas and database. -{{< info >}} -If you select two nodes before right-clicking to open the edge creation -dialog, the `_from` and `_to` fields are automatically pre-filled. -You may need to swap the IDs as the order is not based on your selection sequence. -{{< /info >}} +{{< tip >}} +If you select two nodes before right-clicking the canvas and opening the edge +creation dialog, the **From** and **To** fields are automatically pre-filled. +You may need to swap the IDs ({{< icon "swap" >}}) as the order is not based on +your selection sequence. +{{< /tip >}} ![A screenshot of the dialog for creating an edge with the From and To fields filled in](../images/graph-visualizer-create-edge.png) @@ -257,7 +326,11 @@ You can modify the document attributes of nodes and edges from the canvas as fol 1. Double-click a node or edge. 2. In the properties dialog that opens, click **Edit**. -3. Change the properties and click **Save**. <!-- TODO: Can't change system attributes, even though _from and _to are generally mutable --> +3. You can switch between a **Form** and **JSON** editing mode. +4. Change or delete ({{< icon "delete" >}}) existing properties. +5. In the **Form** mode, you can add new properties by scrolling to the bottom + and clicking **Add Property**. +6. Click **Save** to store the changes, or **Cancel** to abort. <!-- TODO: Can't change system attributes, even though _from and _to are generally mutable --> ### Delete nodes @@ -275,23 +348,82 @@ You can delete individual nodes which deletes the corresponding document. 2. Click **Delete Edge**. 3. Confirm the deletion by clicking **Delete**. -## Visual customization +## Legend and visual customization -You can adjust how the graph data is displayed, like the color, opacity, and -labels. All styling changes are visual-only and do not affect the underlying data. +The legend panel lists the collections of the nodes and edges that are currently +on the canvas, how many there are of each type, and you can select all elements +of a type. -1. Optional: Reset to default styling if desired. -2. Click the _palette_ icon in the top right to open the **Customization** panel +It also lets you adjust how the graph data is displayed, like the colors and +labels. You can create and select different themes for these visual +customizations. All styling changes are visual-only and do not affect the +underlying data. + +### Customize the appearance of nodes + +1. Click the **Legend** button in the top right to open the **Legend** panel + if it's closed. +2. Select the **Nodes (#)** tab and click one of the node collections. + You can filter by name if there are many. +3. You have the following theming options for nodes: + - **Color**: Select a fill color for the circles that depict nodes. + This lets you distinguish between different types of nodes at a glance. + - **Icon**: Select a pictogram to be drawn inside the circles that resembles + the kind of entity you store in a node collection. This allows you to + quickly tell what type of node you look at. + - **Display**: Select what attribute to use for the **Label** that is shown + below a node, and what information to show in the tooltip when hovering + over a node (**Hover info**). These options let you view a part of the + node properties more quickly without opening the full + [properties dialog](#view-node-and-edge-properties). + +![A screenshot of the Legend panel and a node styling dialog](../../images/graph-visualizer-customization.png) + +### Customize the appearance of edges + +1. Click the **Legend** button in the top right to open the **Legend** panel + if it's closed. +2. Select the **Edges (#)** tab and click one of the edge collections. + You can filter by name if there are many. +3. You have the following theming options for edges: + - **Color**: Select a stroke color for the lines that depict edges. + This lets you distinguish between different types of edges at a glance. + - **Line Style**: Adjust the stroke **Thickness** and the arrowheads of lines + (**Source arrow** and **Target arrow**). These options let you customize + how prominent edges are drawn and let you better tell different types of + edges apart, especially when the label is not visible. + - **Label**: What attribute to use for the **Label** that is shown along an + edge, and what information to show in the tooltip when hovering an edge + (**Hover info**). These options let you view a part of the edge properties + more quickly without opening the full [properties dialog](#view-node-and-edge-properties). + +### Save and manage themes + +Themes are stored settings for the node and edge appearance. They are stored +per graph. You can switch between multiple themes to highlight different +aspects of the graph data. + +1. If the **Legend** panel is closed, click the **Legend** button in the + top right corner. +2. Open the drop-down menu at the top of the **Legend** panel. +3. To save visual customizations as a new theme, click **Add new theme**. +4. Enter a **Name** and optionally a **Description**. +5. Leave **Start with** set to **Current theme** to use the current settings. +6. Click **Save**. After additional customizations, you can save the changes to + the theme you created via the drop-down menu ({{< icon "save" >}}). +7. You can revert unsaved customizations of a specific collection via the + collection list or customization panel ({{< icon "reset" >}}), or revert all + unsaved changes via the theme drop-down menu ({{< icon "reset-all" >}}). +8. To switch to a different theme, click its name in the theme drop-down menu. + +### Select all nodes or edges of a type + +1. Click the **Legend** button in the top right to open the **Legend** panel if it's closed. -3. Adjust the styling for nodes or edges: - - Select a **Label Attribute** to display a custom top-level field - (e.g. `name` or `type`) instead of `_id`. - - Assign a specific **Color** to highlight and distinguish elements. - - Adjust how transparent elements are with the **Opacity**. - - Set the **Line Thickness** (edges only). - - Choose different **Arrowhead Styles** (edges only). -4. You can also do the following: - - Clear the styling modifications. - - See the number of nodes respectively edges on the canvas (by collection). - -![A screenshot of the Customization panel with a popover dialog for edge styling open](../images/graph-visualizer-customization.png) +2. Select the **Nodes (#)** or **Edges (#)** tab. +3. You can see the number of nodes and edges (per collection) that are on the canvas. +4. You can sort the collection list by the number instead of name by clicking the icon + in the filter input field ({{< icon "sort-by" >}}) and selecting **Count**. +5. Click the icon ({{< icon "select-all" >}}) next to the number to select all + nodes or edges that belong to the respective collection. This clears any + previous selection. diff --git a/site/content/gen-ai/graph-analytics.md b/site/content/gen-ai/graph-analytics.md index 3108fb1fbc..442a7838fb 100644 --- a/site/content/gen-ai/graph-analytics.md +++ b/site/content/gen-ai/graph-analytics.md @@ -3,10 +3,10 @@ title: Graph Analytics menuTitle: Graph Analytics weight: 15 description: | - ArangoGraph offers Graph Analytics Engines to run graph algorithms on your - data separately from your ArangoDB deployments + Graph analytics analyzes information networks to extract insights from data + relationships using algorithms like PageRank for fraud detection, recommendations, and network analysis aliases: - - ../data-science/graph-analytics + - ../graphs/graph-analytics --- Graph analytics is a branch of data science that deals with analyzing information networks known as graphs, and extracting information from the data relationships. @@ -17,7 +17,7 @@ and network flow analysis. ArangoDB offers a feature for running algorithms on your graph data, called Graph Analytics Engines (GAEs). It is available on request for the [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) -and included in the [ArangoDB Platform](../data-platform/about/_index.md). +and included in the [AI Data Platform](../data-platform/about/_index.md). Key features: @@ -40,11 +40,11 @@ How to perform the steps is detailed in the subsequent sections. {{< tabs "platforms" >}} -{{< tab "ArangoDB Platform" >}} +{{< tab "Arango Data Platform" >}} 1. Determine the approximate size of the data that you will load into the GAE and ensure the machine to run the engine on has sufficient memory. The data as well as the temporarily needed space for computations and results needs to fit in memory. -2. [Start a `graphanalytics` service](#start-a-graphanalytics-service) via the GenAI service +2. [Start a `graphanalytics` service](#start-a-graphanalytics-service) via the AI service that manages various Platform components for graph intelligence and machine learning. It only takes a few seconds until the engine service can be used. The engine runs adjacent to the pods of the ArangoDB Core. @@ -88,9 +88,9 @@ Single server deployments using ArangoDB version 3.11 are not supported. {{< tabs "platforms" >}} -{{< tab "ArangoDB Platform" >}} -You can use any of the available authentication methods the ArangoDB Platform -supports to start and stop `graphanalytics` services via the GenAI service as +{{< tab "AI Data Platform" >}} +You can use any of the available authentication methods the AI Data Platform +supports to start and stop `graphanalytics` services via the AI service as well as to authenticate requests to the [Engine API](#engine-api). - HTTP Basic Authentication @@ -129,15 +129,15 @@ setting in ArangoGraph: The interface for managing the engines depends on the environment you use: -- **ArangoDB Platform**: [GenAI service](#genai-service) -- **ArangoGraph**: [Management API](#management-api) +- **Arango AI Data Platform**: [AI service](#ai-service) +- **Arango Managed Platform (AMP)**: [Management API](#management-api) -### GenAI service +### AI service -{{< tag "GenAI Data Platform" >}} +{{< tag "AI Data Platform" >}} -GAEs are deployed and deleted via the [GenAI service](services/gen-ai.md) -in the ArangoDB Platform. +GAEs are deployed and deleted via the [AI service](services/gen-ai.md) +in the AI Data Platform. If you use cURL, you need to use the `-k` / `--insecure` option for requests if the Platform deployment uses a self-signed certificate (default). @@ -146,7 +146,7 @@ if the Platform deployment uses a self-signed certificate (default). `POST <ENGINE_URL>/gen-ai/v1/graphanalytics` -Start a GAE via the GenAI service with an empty request body: +Start a GAE via the AI service with an empty request body: ```sh # Example with a JWT session token @@ -166,7 +166,7 @@ echo "$Service" | jq `POST <ENGINE_URL>/gen-ai/v1/list_services` -You can list all running services managed by the GenAI service, including the +You can list all running services managed by the AI service, including the `graphanalytics` services: ```sh @@ -175,7 +175,7 @@ curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/g #### Stop a `graphanalytics` service -Delete the desired engine via the GenAI service using the service ID: +Delete the desired engine via the AI service using the service ID: ```sh curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X DELETE https://127.0.0.1:8529/gen-ai/v1/service/$ServiceID | jq @@ -309,12 +309,12 @@ curl -H "Authorization: bearer $ARANGO_GRAPH_TOKEN" -X DELETE "$BASE_URL/engines {{< tabs "platforms" >}} -{{< tab "ArangoDB Platform" >}} +{{< tab "AI Data Platform" >}} To determine the base URL of the engine API, use the base URL of the Platform deployment and append `/gral/<SERVICE_ID>`, e.g. `https://127.0.0.1:8529/gral/arangodb-gral-tqcge`. -The service ID is returned by the call to the GenAI service for +The service ID is returned by the call to the AI service for [starting the `graphanalytics` service](#start-a-graphanalytics-service). You can also list the service IDs like so: diff --git a/site/content/gen-ai/graph-to-ai.md b/site/content/gen-ai/graph-to-ai.md index b8bee3415d..bccae43b5c 100644 --- a/site/content/gen-ai/graph-to-ai.md +++ b/site/content/gen-ai/graph-to-ai.md @@ -50,6 +50,8 @@ Alongside these components, you also get the following additional features: - [**Graph Visualizer**](../data-platform/graph-visualizer.md): A web-based tool for exploring your graph data with an intuitive interface and sophisticated querying capabilities. +- [**Graph Analytics**](graph-analytics.md): Run graph algorithms such as PageRank + on dedicated compute resources. - [**Jupyter notebooks**](notebook-servers.md): Run a Jupyter kernel in the platform for hosting interactive notebooks for experimentation and development of applications that use ArangoDB as their backend. @@ -64,14 +66,6 @@ Alongside these components, you also get the following additional features: [API reference](https://arangoml.github.io/platform-dss-api/GenAI-Service/proto/index.html) documentation for more details. -## Other tools and features - -The ArangoDB Platform includes the following features independent of the -GenAI Suite: - -- [**Graph Analytics**](graph-analytics.md): Run graph algorithms such as PageRank - on dedicated compute resources. - ## From graph to AI This section classifies the complexity of the queries you can answer with @@ -105,7 +99,7 @@ Graph analytics can answer questions like _**Who are the most connected persons* ArangoDB offers _Graph Analytics Engines_ to run algorithms such as connected components, label propagation, and PageRank on your data. This feature -is available for the Arango Managed Platform (AMP). See +is available for the Arango Managed Platform (AMP). See [Graph Analytics](graph-analytics.md) for details. ### GraphML diff --git a/site/content/images/graph-visualizer-add-nodes.png b/site/content/images/graph-visualizer-add-nodes.png index c0a23ed6774cddf4b385b58bdb83e1fbfb200546..2644a3cba4a2935341d4af46ab4efa84bc0ae3d1 100644 GIT binary patch literal 28310 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 VUOnZ$H~&aY3Hnm5OvW_me*lyUY03Zq literal 26034 zcmaHRby!qE8!sUtic0O$2qJ<mi*$p;(w$4g(%p@;3LH|9?nb&B6j{2v(FH+Ty5X+h z_uc2Yf8Br1d1lVMIrF~r&hJdPijp)T0VM$j1_q(5jHDU{1~!0!fwhj0jqZsfSFu6A zj8zmgU{_aH_xJZVH#cWzXGcdzTPKsdyF0&s|Ngl>ytueHz1lT7IXO5u_<gvdv$M0I zq5f+{{+CLJjEwZp@v#5^c&Ew)1qFF}dKiCVvbD1@GBQ+ERgsjG<mKgIWo2b%W+wig z?T&$APADrWrs1`)yF6~Q{q9-dujQc{iE2rr@V8MZ=K+J*?3wk!8jGlR#{tbwu*%RZ zb}IIVXbmv}@$m6_pFX*f3&AjCU4BNyqKVn2RSugVOW}mDV0)ElRM?W1)LZpqV3FR^ z<%LDa;XV_GvPXnz6*4@N+Acuma$|>0uogwC@##De|MGfpCaNZc;K8<A3ZTgu`0n** zwbym{OEBPDDuh)__W?tFb8#L10~^;kP>`<`5uBtW56cJv#d_1F|DdB=|G^zDm8ftI z?0MLwS3QsJgJ3IQeCZ;ZK+>8$m1+}smjKFZuJ*+KPxHF?-CJ%?-U@4sUsKD?9r)dx zo^;kkVHOTHA`=YH2A4*t_|TH9Su#!YVb3My4~bu}ViD;^aQ;3orkCqnc2M(I(|!{` zecMP~UVbVAu)X@RzVE-_e#zo4WY3|s83ZbrsVLuX|D?CJBp0I0^EglW`i4(ezZ_3@ z_x*yQ)>_8;nZswt^0x8wt*OoQ)?2REtSC?26V=Xn#6iP?V40yvybYb>@tOl)TanP@ z^4pW+(zHFjdBWSv(;Q`az?_#F-^GB|c048=l;wDsw}BL*U0&XVOqv+R+|RMM(&&gi z$9D`FS73ZM_HMms=XUj|Y<OsYXhYwtTnoX-Wh{O{&`L=3vJ3~m(ktTwOdI3x*FQ7v zZecKs3r|pe)c8|IwPVT*5J<G$sHdEH<jF#dY!4;x<l1!{|LCPf)Lp`dyyl1A%H9rx zKS+OZ`ZX4L$9ss|0-Wn9dDX;pZyI;?F{xVIX=o7DxDLl`fGZBhlZdd7gcuEEI-R}& zv&`6wWjvCXaC3P~*^kpYEfHn)=~ZEs`q&E_EwW^?EuS7M4=~Mo{&@Css-!oh?Wa}Q z5gi99#BE1Fpa+!@`w0xhL?Gzm=1JbatV3Qb#GbaE2dn_=@RlXohsEw$!5sbbZ#;A< zeFbs~=P>HB!y%R?6ZE%|Zy>7MJmy(AnI=<QS`EH}4CCcHf5?F~4Zb#bWLLpww>~Zp zMlXxo{o8;eq(4qE;UiTH!7cIUM>R7e+Y~$H5mThEpLH^4Pa7=P)#<pJyMcbZ`E{o! zO~?x*O^AW|ozn`Y4X%;eqT*decUk9)Szb$)T*rD7@Ywp1_vJb1jS-bXyb_qo{Zib4 zwhnX<rWT#HhP!IdPwnMjjWK$?L*L;`Mo~s~VXxlntpvCD@H#eR`leP~-590Imb^-t zS1v7GR%X?@w1Ou-&JEJ@Q=*BqZZnczKDZXuDa#wpJkFL^ufJ{N=vIj+`53P$+i$Y0 z!diFPY8WpP%@N<K2Vr~GhpN9WfyIiPmLjt|;C3Lu)`(S(&Yru_<Mv^zo`UUWZQtfp z<%t?LPlaC8j|QCSm0Z{qGQYGR1-q_>RgoJQPV6|V4wYawibD6#Z?hocS?L7DjYXgi zLzw{7;Mx1G7OZEc1OkI@ZFY5-3eMW@&X#e?)*$m2dNp3-{tngDXTeL*VY7Ii5Vaj; z;?=$DPTjgct?*(G7PHUO$vt27hx@THH|2*|Oz_!}Wy8i@&fV*pE4q9FbX_Belq^4m z=r|;B76@Z6s+p4FGUswuq36$}8`$u;zFTe~aPf;KPy2GxhnbrENm26ArTmyv%SGT; zVq@&2s{%_j0meG1I)TRuWPbxsX%o=i!vu`qvYFdD)3W1W!|0XhTkM=W4~!=1bJ&I! z>S}f;b{k*3YfkzuNN0*yq#)OSz;h7tL(q_KxzTHjwi@5yu}do(+X$r#VPU9Z1}oYh zdhRmS(AVtza7Z*$J}J%Uiy0F+7Os;K`R(mJh=_l?zn+Ct)xqj#tcLSWdl2Sb{oRLy z(%j+~z-W1tAyx*C>Xa?33omjGODDe=tT&a6`qsw)YhPek%%F4e?lEFgo4St>!HdrI ze}*3L1_ol;Zbc6;V5yN&UH#XRi-Sd6LD4Pk2#5%4PH{Ywp`|K?{QG#-EEc(zr@Q%@ z;%$8loT)4IXZHG3Pp(N-h3qwFjtGE{h8=gz*2Z-9^(5yEz)@(H<Z*f(0|4HFfe72* z-I^@LB7qYH0M*Hwd5*1c?~@2I%(v7{FpGnzx#<fjnjO9#cRp;C22~Q%fCGHdP2uTW zM!+oYiV*ZthY=v90V_{>f>I`=-dw%kyOstSeZJKLrRe0IlXe6s*Y)+ICRyc7BempG z^d5Hr@=vBJ_ewxGI(`)}lSm>bz&z@&fxEz#(RV@V(SL*ESuFxR6F);b+|3Sc9Zgj! zUl^CG^~53@_Z#5}_3Ni&X#{dZPb7wCAI|d=VtjSYXi?_HayVSjupr;&6(qV61bvy0 z()s9}V3lrrVG}n!GF?`-#5^w;pR{mVJ)momUP~4>b4noB;wilRtHI+Tz|BLll4?e4 z9n%=hN@DP?EQm09XYPH=h{i3PY2&;l+R7wpj<rS_vfYl{o<mF{TF4Zt`4qf=YEqog z7qpqIosnm4-tmOBKV*4nSL2jqX{sDxc_Rn<k^k;79|y*7i65_bLPkjVWO}lZK_O07 zo|8O!-EEmaFjrVw!RFkpY<JZ#J`s~LQw#VSghTX%(u>YA6L0)C;UZE;Y`Ui!OJuD~ z>{A%4sr^uC-MI5J)3P8ROJJ8CF#NLY^cI6A(HoG+bb>t9?>o)~dA9`VF)2{zv+c-= zc1}CC?ybZwzqPR)HU*u##l!$LtfS6W9G%$%&u6^f)(ENC`$sB^Spc{gsa#qZ)1j2c z5Zk`1@`nAiGf5y))U4WwsS2B2nHnRpl6xkWs;WGjaRX_<jY~KYqsb$5*?4t*1KO_+ zb}nG16*S@!bldsaWK#X-xn<s92=0D05(U{$@{;08v6rXwtlu$Ut-*shtZO(uZ}%+t z`MWpt33<BtZ}LCcQ#rTfP3QISx0F4gh#0t8Pw^VK?AmQdh>44?@7>3gRb1|b*OO7S zlZd#08Y^*vk&gK<)x3KtApU?UL{Q@VWx<vMkr~~yYRl{&pO9CiAaJBWNa!a>@N4o$ z7$#l`|H~5xeF%>cYiexP+o4{N*pp;6>OTv^Gh~p4*uk-Zoe|*)R>RS`;1iM%eYzoj z2q^Nm{-GE!M4s2(;>6rcX_}Qawig4uR+zR>9jgAVvyy`(u6%D7v>?!lL>d8mx9gP) zdS;KN!<P%EkJQ(H%c40@(l+2Lr0M<6GL7sSMR@L6@Dn*A@X}ypJt%vD27GgzD3W%C zc26JR`v!NrHicOd#lp|82<KK~by_T|G4?(qTs{C+oN!lr&9%M}OM_T<oqvl92C7*W ziBCVlD3}brXmt}-l7^#SsGN^DI6szH_Sqd!qAV(;eM>$E(Gng}T*j%}aa$WJJ%;Q1 zEFpd|<17jE%)wT<-v0$)VExGtbKgH92as*-66k8^{ne*-!39NXTrB48@bd6yn!#2$ zudPw{_k%C(RBAuitFUyPEgdI<429a6Km3eTKDhKdEX~!k<5{ccDv!Kr5EUr1*eu>Z z$=g4XykDT()3kD~XaSj?@^sHR7Ttr>8boRBzm9@l?)KtwU6-;($A__d%v92euutXk zP0KMUO%Hayo_>4nK69`uoDaJkwcfU4sjNu9_h8R>O?MKIHv}T|RshrvZ|@?<5!)cW zbXPmScs5-Hn(J>madH6k;Ql_^ipabUU$-tAq%I9;jUl$J#tF~^SarpKl04WO+C_%* zold=<{<m5}B{1`(PO5SnT`rU?E5WSIvec|NASF}^YczCDZRx9=$pn>qi321CoyOmh z^Af{_cF3=2dbYJr$O8mKgA9w+0%lA48lM&GcP`BMAuCqm7(-Pk2vZ(iw~7OSFYE9j zIk0cUx)0F(|31rqwi$QLaShfGUK{xIwX+jeL^=0HNEliy(DMbb)}LLT%iV-R`U&bS z^)K=3J4<2OuGklDmka%`dcN=(wfgF=-=)ev8ffAmK8Xgs*YZ5!kwJ3`yUJ=L_sURA z)9(2~R4M9My}{aC*Q`52u6?z1I+3VnmNojg%D`L8s@k|NnM@Z#&T8=i^hgTO$w3B> zBmUbRy)B^26%2Be0J33%R^vRnZG^1BpuKF^qSYbKKX2x(gFLH^!o&0$?Mc?VcXVDd z_-w!m@jATtCkyQ(?swX(4iEEGC=ALxtv00VKOh??5r0tM0WP{jt2u9eo3(WbSQoug z1B06VmDiMGM&ykHdDfZXh4vNg3d)bvp00?y9q!mkWg&e^AKmf=uI2>ni0n%)(BGYk z^fYBO7SkPr8Yi(o8N94jYOOKK0PFe<F$>(btT=#+@_30#T8|SHkZ>m;jgKqWfck8k z_lMW>Bg!?pvk_Ro>X(P#cvMspL2w(B@Uh!F$IGW-<K06eyD7t+^P!HTDPGnO$!>y^ zWMY_d`2&yYk|haMe8t~*Wnuf~j`6;KPWkhTcN5^N9`?bCI2&8l^V+*nW{zFt`3Hge z&yHR@;gB|>(G7%YB&sKxuxzTGX7ROF9k=e(8Z$;ygY_?vF?Z)ef*69K67hnKV^}52 zP~7#VA=5Z-RCx0pS9N|BCPqkI+sTjpS75ps((w+JP34QT<NXQ!2~BLze&sQl{Q}XO zSDwxc9LK+JloVv>E^rapAE2>G*%BftbJ)R#ynFf!Tzgb5;lpYD&>H@hJ{(3}#zzWT z&#FtyvROK$uc58q`;ooeA5KV9Z)8{fR%8V;u_S6+XrrDuPT*UDcV0P<tLGYxGK}Fd zR8Axn#O!JHcE%UYDNQF}tI+Yl;uUx3)!k(}KElIz2R*{ykr09&8r(HBTy85_Wxq<z zhY_41JwL_+F}4v?WO9Yrmse-Upy;Z~i$K){1)B$6FXp5KBPFg$p}Cms1yZvz0M^V4 zouARnZgQF*5xx&U$&+9Q<2r<=ho#{TQ)cN^y|QDoPyG=8h+eH*3xj4{fP@kwY753{ zJwrVId$@A>=CH8%<5Col)3tX<Dtoiw!#OJn{bQ-BNXi~(>M4?@<kZS1q4r!|-+ZEA zPSR7q+0?Q|B|dZ5x>=zLu^E3*<Nf6H_I7e!&`)3V5EsWDqyNyc@3-&{BFU#rZw!4T zvHJMeG#g#IzMrxB-;v3)daq;ekeczyHD?(Td|$6u@Ity5x13FLzx4>1-rrw6jctqM zq?}m}!f&@H|4aTQ@6^LviiAJ2%K|ri!OfxmX`no=%J1dJjLK1&XCHee@p6v6EeZB~ z_If%`XnN32vx&%Oyj)pl>na@;9LeTfuA%$%=N(_$Y?GTEEauHs9Q5nPlkN3fTp7j1 zUeS~>eGd#PkemWSujgPFgH;Vr5PNSHvmtp%E8<TEl^IFjpnTI2n}52S%b~NPNo<?$ zQ+1H@t#@s>)mN=}>9FK;bt3qKZ4-TpZM^1WO*_Xs!Tw}DRj6d@sN_{oa_CgvtK8^O zy%TRda;<P1(^Na7Vlj%z8rF~XJ;mkg<a1p<`rMpvkx0=M(nPD^J-+p;<3#^G%^ah~ zz$dGF7^fk7`0jZD>40iG)dT|{N4ZfduBk8Kjy2wFp?MNbwrt}@>D1Ye1vg5TsaZh` z&l2iC$CW}K_q0A}@34RUP<OrlK5s><<ii*vp6cc`;OG~5C7sq)SlEYS7_j1^b1lJB zzzV;QevJhrJNF8WA#vx1MXg4lpE=*l*nd`9)f6Tg_FKlR(NvuF634E8m2R^Z4ryJ% z+<phbKs>mtb|sfkOS>K!lF2dX^t1P=ERmZf?&3o7jtDA|N5XPvS6(SWMJiahh=-%N z=o6ifz4aKV6KZ7UFsWku7Q1bYkRq+{80o1z{YZnK;b*(KKlVhhPh=7-&mQ4ED(Ay2 z8^i>HcWAzq-RcrMJPl$}!7?>7KPW#Uqz;G?Xg?!F&-PQ>h<5y=)4ferYV*RWI19s@ z2fv~LA0Y(oJX<E(k~5}ftb1R#iIFMOhm0^?#@x3@@LTS01WogpOa$DF+x#D|qYqq@ z<tqgOnxZQvzRHRPpVQl)p&mX|hTa*fD|Akimh1f(%{uq!{6U55xQ7sq6qL9PaIbD( zW6)6hhT9oWl_JX$K!M@Hug_d=_S!K^@Zx2@P+1F9ZXiiS^X4NE;}}5@t=D-0UIkZ$ zecfs4zkhS~7QE<q2K;qR{fipa7V1GxkOq)6sL|ZrU*Dnv3jBKS#?W1>zi=`qFIFy5 zrAAFRtcKr_U7Rg*{&_~EzxCWU@Anbb5u;w*;DdAEz^!0c^k`Ic*2oJA)^R@cWPx^& z1zeNYTLVCrn!ewg0rqWQb^RM!BvRb@@I7;H@qwcAp>JC%P+)YU7y&pUS39B?Kw#0L zrVFhq1^bWAZ%<8QROLG_d`ZEp1PzEDvf~H6#hXUgS=i)e`F?wwj{xA{M<ME?cQIh8 z)LZN#m1}Gqu;A8`xz2-Y6*e_Ul^^^X+VODr?EBqSoT+j>@BN6Wvh!wCS<x6)V9$!* zn7*PG$X9c;*fe}_LXJfLa^B4O5XYEK!(xd&z*C`z=hVxk8e{CbjYD}OP~^3sAm-cr z0$e?2Qt-Vue0{t5PP*BP&O-oPhBD$6(@+#=Qr_1}9ShX|$fxtA_hAH3i2+1PXVTvz zNCYsF^*JM1L*Bc1s>XlpY0RxHOor?GJ<J?KF3i1sh_U}n;`yseCT>cZ7wI-*Imh4g z*gRoq2H!|p=15pSVrsO=OWf*sq?3-={>0A3jmojiP6R9CXzKfsWFC=!IUjEsdba(; zj5cA?Q!J#AbQ%}?0}3TNs@{Sxjmh0G8(+q5KYfL(t3WJg^wAtWFBqd6xv>x(aO&Pw zadReVO+@@HgV-gsUDmm}>4HEg4Un*!D4?i(cUck<4+tqW<jCI<V%WJb*y!xDfxt#V zmaeL-IqG|%??2mpO`~Wn?H~9kMv<j%46(N#@6gHY=tLnj{m*?j>J37DdeXHpzlwCr zHf64Z9%i(xd%e?hcq`(s(9>i3RP;IcoJ?P9(V9T?(<7>}nuPGR>-zbDD_S*<rY>XO ziaF~vQ@e=xBOLwEQqm`CnM|e_qIFJNq`b6zTFy#pSJ*D8Yixfcu;Z0k%eS<6MdGu# z1NEI!C@%<oCRP(>E~&z|$FkmdENqZdtu?vckm*CrGW(GWrcVRrVZSYDjr8hbz1x7L z;Tv1<`5X%ID`b=Q$NeUh$0T?%Rk{^FPur-qsTTx(6yqFcEy!d2h237@lcTgC7o_*R z0W3~6yms}GsuUB>Iah7K$wA2~X^B_g+!s~P3cOLs*o`Rg|CRe^mwYvLht>e162paT zEUPb;E}ijtTrFfx8Rk@8>I)?>E$@%6vZ%`llq@LcMjXo#HfTGEnO@fezIM*lf1iOr zu@qU1SS#ink~$MSw`4doc+R$V)lYnyO$`gi{TUss6Nc}b7{Lj(q}>m*$iylRF>2{+ ziCs|%J}Fr$lzr3|D)Kl;9D6!UGL!_b8R8-sCfu3~9F5QF5091it~U4dmy&+)txurq z@NkY{g@R~Nh<6cl!?54sV{57S`Y&Ku7U1{KxAP3?mAuI`C6tM{N}9|wwz8kFXgkLn z?#Fw2hsYDQ^`>M+tNK1}FMj>US?jsoiQ_v$I=J0IQ!%?uaR>=Um&s_34x&vrxFq>3 zC(6)dPRs1VZ)}?rJX&4pq?}iE_yCINZHh892itGwOo?-004~!iYzYR8voiBOZdl#o zQ({LoIKNR1vi8G>i=j&ev*+$HyGc-j#y-2*dD!+-ZMO?*8><i;jAlOPUfBH01AD7n zl<+&K^SfH5Q6VjFc<VsQ!F%`H|9KSy9M3X9vNa9cddSWADLssn=~RCnX{E^2GK1~O zZ!fA=Z0aoWSQ+6VNm6CD&Sqd2&$)HFi%1~&whkSN4cE<o;(LLtPh;o$W>NY4#ZeF| zz~Kts9#klV9sf^4_D=D9@j8N}uQ&PPb=td}d5f9T%ha%AnR%EU{d}Z7)IoI4ApdB6 zy3$~3-Oj9MixcddZr_b8Fd&`$c+~;8^RkxAEbR#wov1(Q@;Lu0{r(}mu+m`36aYTl z#{);R(1;X~cSF!Z{H^eldccm!PA@<Fb^#e3Y(ydII-Wb~hT)zJ7qJp<E~Zw6?<PoD zI`cEy*WfufhN&wHu%iCA-Z7z1FfNzaSTrnebs5>z9g{3Qz<9YZ`Q#eF4CA@I#~uTD zzW?*7znYy^&yT%3=elrsybH#^(SYYeL*Tr?z@EW;;eM=^SN#aJ+@ARVH68;DemI8P z<)JClH2q4Rt0<);*d{jw@MD^|zC=U>X7-g*fxo<J>_%E9?4f}0U+z`UOtM<%5RIP# z#W-o??8{d4Ndb~1TV5W<=_Ut?tXVH2?)4|9Jg(I5w=}9HEvG5p#8i)NBQC4|xc>0p zV_+?ODyd}lK_Gvu1oI(bH--Lga4XQv`CBt44d6;4Le~n;af+7~{S?3R@TNoU6MVi{ z;9qfqf1_-}4m)IBfvlg|Qlu)7oRzCCrtaZ|I_k$y4r9u5;a2oo{FPNsVi3;Oa=38c zo}5D(^qa>O@pU>h;wXFA^#yuqxCM#4YiD6(lFKfCKKhe18cM0~C}|j$v;oH9g$DO% z{1x^&dEYoj{ezOOjQvT*#Sm<aKC)1cnF8nR>(s!+#A&A8YY%pdzw%3wIwu*`O~ro% z1xyRw7g!y(W>RQ&rWKLv#DK;lr5@a=t?q_-MAjtC@Z)TN1LJ)G(Ed=eW0?%~K6@{Y z$GFG4DD4fnl>AwXzw7v8nLjps&BcBK4@BYzzsbIn9421||1AN=Ad;lGncGt+2IEhQ zO_zOZUx~uSvv>v%erZI6zj6BPJkh-Hn@o^$F)e}}sD4r}!BDBb45~+p6agw6qe9%` zU0~MX^>Vf&i~entQhfoF9CZ75&Hq~N5!I&WZ=+3t1)^)yPxj<W=9<2;H~YRCy=2cF z&UJr(nv}XxGlS-~bc>V#UtT}G5@FNVd<E_#q!K=RJQpk2LNbqRm6@jh0J;<6;rd(j z%VDFF1np)l?E*_btx%L`^KLo&{Rt`IO$8vV+R}6NiO8oLzMUl{b0%1=yp7nsgEgmK z`Msq#KdseMVNzivzc2t_rjNGXz5UpC+j>4uyM_2DujwW7;Qny$=hr>ES&hFGN0amp z7cX4qHjaA&5=Bv{&TCB#X3^mb5E9vi-aZG_^&zC-&cY^mlZw8dcLad$n<WK50!ILB z%Ffj)`ZuZQ9Rpp;{APiIA^;=waD8TIhtPk@8(Z}7M+a-DUqL@a{~oLDojkQUd>>km zx-@`v5(Y@+ucMWwQK6H9UsKrSHeZRcb|_L+z4rhQa;lHYx}T?%SfWp0<lnNKiEQ-l zvq7sx+t&pC@4OQ)%84RGbAT@I&FMx1KR?!vQP);@&zzS<)7Q*VBnU5r=9@i_WCfLj zo#z*+>KXAT&Z+e*)uxiCEJkY|IkxM#as_PNzdRypr<rQkT_=`w^u-*D^o|$){i3R& zyl(HZ_f3dIOP{>3E76i4<kKjNsd78NxJVYjQ)f+jw`dnOG0HjahUWa#x~IgOikaAF zh@X}-^~BqHWL^f)eRSx2d>5~4wGC!Cs*hS6!ulC|MAYO;@_B8EzoQ7ysG8*j$Jt&` zm@D*nN*|$%2&mFJW`0F2y<Cj^j|)voByGD1f+76@7fVoXj}8`Hm0*jP;X<DJH-U6` z`V#}B+uze$U8^JEP3#`U1PN>>h08t~9|LC@=!RPy_Q>q%lyzTUPu|B-W>d0GL4A=l z0QZ{JcF~<ja;qJSuTXUfcVBCVQervLAjH<&?XXS5{WUbX{lTAE-mSi+$`4F~7@?2s zmAw7F9L2So*||7VU1cE$Xm(1hzdi?FJT!lN?^&c)bw~}ZVVSaK^v86{AXL42_$0C) znch2aD9k?Xlm>%u7Fd4$g8-4~?jFpF$In;3;5KPdy!`XP4%+Z)UJdP6{(|ZE=tR=E zIj=ut5UuD>T}!_Y-QbEiH_&+WK^CwDkIDyezlU@W>dVxXbs9ZVyy`)k4)m@YdpNu9 zH)J;B$96QqFD&(UnN2aH=b!O{&;QXr7{3-;S=&c>Td$eY=Lt4@RUqg8k=cS<r<+TC z&?U@$KH&Ex{?_=&@Vh%tciRiPN#;xgg})w5zD{UQ@a>|QCi{`<=)WKUtC_<!@(Dxl z|ETPf;SHnT{zG$MO?uD@|DJlOxDU-tdM#Q$lA$j&i`qqH9v#jg1svg2-X)gksztda z+2d|HGR44BVo30aJqk6COrO(0zH9}G3i!d*-{XNz-E;$?LccbT>eR9IgJ^kS^u87_ z4r^w#KDrGy<>`Jez49OZeB2Aqwa?K$NkPt&@7(qyU0Fw<wCW;;t@u&Wwk<f<?V0Fk z?fjD~^(ZB}1x?uYVl`h?s1=^VEyhS~AjC$d4v|!T1s<*EYxPpN^x8v=^pOkTs+6BX zHqjC%kR+RSVZ7F)qi<P$C&{~N_0l;hEmwnwL@NK;anN!hf<Aksp-|_{|6=?=!uhbB z1?nGzLXB3D+Wd405tFns)qNu9Oomsyj?<B`+xgvf42g79)4zF$pzr;z(j$-Y6SU^` z=S|<Argzv}K|ELRV~RCY68emTKJth@UogkK$^*U>kWqV@95lgCgNmErb1cxi&}bFx z$C7#BR!_zlOnNT@No{0K5(-EbBn6bGkOlB7WLFTcTQ&RakCXooE`?ehqdv(`smws{ zY)S_)6V~}Kab@|n|D>irC`q%Kpir;75;fY+Pl5#KvQi8$0&+_G?4-qd^Nh%Uow(i9 z)h!MHtfPxG7r)_$ZZKy!Nz%NtBxi$yJXWS)%HjUP?GkihZE_1<3~W0Wo=1{O@3?<s zOnp)u|Axn^mSuNr(XVZrYcr?q_pNvfk7j}~dLm_tRSGR1+i{zL@|pUP@(Wf1c#K&* zRgU^s4pJELlO!hG2ZT#Z?5}dOb=JZQPZgdmPT?@10i(s=<AWqC^{*;x+&(!}qjU0a zMT7L*m-MM-;R+DsB*R5vIQ`LO!du)qZUHXmNfY5$Zq$LJ>%X^AOARE%g}HXwPlKbN zS|lb(1%hq>dd-CMx>pa<B*+@%++*|)?n-gQqmdr?5pvy%aMH(8MH;L=H}qNKGp0uA zTGT7ILcK81mm$|1v=3BA&}qNBw7ED{us9wNNE`bH-|RYYJ$lJh&AR5PZx<)fXD6@2 zRinF1BgPskB}eulak@Yc0=?5b3C__WDVBYBPeV`PH&8h^qqLe9@DiLCu{Rv>ilSD< zg?_?MNg#bW*5^cW>d+eyY2_<RlKaBWx|k@}d6qZU+sri9L-_{O^&|oaAc^AB8^^Uf zo@~DV(m!a>7N3-rlrh<zv1v4bEM6hB9xn#~jJM>c<TIS_DijBy4qQD`7@8AK@b*cW zoDPq;R*ffhGKS^7#XS6ih05o<s2Nre`2IDv4TkZ1qg#G(^YM|VewqDy%R8jLUEuOf z$i^-M|Kuk|4K!S)sVvF4x)gSIS!g4a6SP30RDUR$XwVABtBGw@SWTf|sl!Ob$18vk zdpxg0-%Y8XYeAw=M&<;BW_O9exi>4=6zr8N-1_J5g!*ZdyIw1mO%B<sKzDv)Rj0jN z`nH=IrXc4Gr-YOX*_Nq)S~1l-&!yqQ7i-q#)4x()i=xrrK~=IxKXMy-tRCiB^9}6X zuDTE`5m~7<x_)g{thv`I&BeDW-#W01=kOcZ)T-?s1eMu$D0}`Y^C&kq0N}gDQ;{Bw z$qRwVzA>#xQ=HNF+$l^?&Ia$gbR<wDE3Cl#5!7%CpQ?R1HIGKY4=Za^9!dx5%%lN> zyP2Tbbub8d*KOTMZc8|%&Hh_Pqi!gBae$%bf|pYV{7ZE{V5moz^L#+JlqE=VhUX8q zPyJpsgcB3E&R0j+V1vGo%{=QG_A(IXp6s^2-m?)C1!w%tfm1tF$wU;6%-|1zi3bEj zxh60lvV3-A&{95Z@4hx8+E*n3oi4;F@w4fDAJQd}scL8zsll71+)AJwbkTU-Dy^t! z|9y<7**RpR>VbYm`0@3rO<{!FgbH!iUqc;g5gl;n=CvB<ccBMBMUbv)up<Gn&f@Dz z(-5-o<`ASwVl{c%!nZLdDl7u3xecE_E@$)=2PX&Olyo%pjhn$u<9F0~Af&?G$-F5~ zHX;hv%$8&{Xx|#wS(Ti!@OAlU!zhJ9EGX3)wdB8rk6SP8*CmZOv@qy4^G1M56Oc;_ z8`ptS7DnS<{qP|L`#gi@LBxY5BIzF-is`GX+`v1I^uPXSHC4g35G&PKB(Kiyw}r$S za<@DNQ+CdJ_R^eRs9*NsV+Q{$i#pl-t9^tI>CgnTJL2dJ=?s<ITN~(q{bn?Tu(25& zE|?nAVl}S_4{2de>n#CZ)?EC44)6mh^{i5++B^-f|8aCrmB1d7A#5)|^V5H7{Pf@; z3%N^6Mj3}}41sJwEM^)=2{)45nVWDxKQ=Q`O3HP4IxO~fp3kb)H*z^=BE>4Xo!R71 z@gWF<8=F{UB-+BnT-8d80=F-Ru8#3v+B!{acD`&RR9KXo(Bu0{kl<av<o&F=?;f%B zu)ro3HgsG=US`h%IK4Y%V8}=HD5aDTCVB@JHBf6<;6oC{NH))9`|Bo0-5JftsW$gx zU~SU3HkmQV^W*Az!Y2tj>J$q0myC3SYuUeW-P<z{X~~Y4Ahe8m6#LQ0BPI{*nhT{^ z<eH`0-g33f73K~K90H*gdAWJP{~A}vuk1z#bo`hfD2a(Ojzw<vWf}O|^xY+~Jpj*S zZROW%?U#*c?e;dhJJ>jA`T3CP_{CD&EB4qJw3B{48<l;m$oBH&PrYR|9!&yse|DV| zC=MyzziL?8#Ar>)P10A4cRxlH@+l}uGuAelRwhrfl>z8O<*i%od~CE~c=q+W*hKBU zadliSqo(K3@3#HdeW=Z&NXS{L8r;5ga)^Zgf`(hOG;9FnoHWx~`W(m_<gDS-HBA_w zN)ms;JnQ<4uENOHm<SzlVGt2`bPq!M)91RyV2O~0%#jb<<Zv?|zQ3PqJ;}@tUA?71 zCg~{u_id>fwK<`6pX0wFUU-K?7=V~W(;9fWye4aD5+l@B(`8-?!m&)}&2rXCP;=2N z^a4oxT55=lUMWkJ(&>9(PNX9VqJv7CI!_4Ss8;Km?N#fS+T=rB3YN7%Ps^E`OPAgN z+1f(7J??(gAiWZ+!8$v9iYV$dXKpt<<!8)j^J{CFH6)_JD%>-Qhxm}s4%{<g7U0Fc zp!|Pw^_JbW#Xy~$**2st0r;SYC8;*6-5-EBq#$DacMiOJ*INKYwV*{>_bH!hXTMAD zFVh+0<eLtUze$RMe_!m&b-S#mYb}0nNbw$!g8i~m;rJLWHh^#WNLyVw4U5<=>Xa{G z1-=?@v-@TsB`vh>d0gmt|3NSWvHt-%K5_b0k}*EBe)?9ko_SlN@{hpDVz%}93!4qy ztKk~{i;&s~#nfL`(!rmrpU}KuF|84{F1#r@@8YGLZV^fREX4}ccd=3M>Vh%zCRcHE zx|f~;KBv)=s?Rtmgr{M@^0~%9J7nsh?=f@oYwcXApbGWPCzLCsFw}-dh^bErz5?sx zr~l>4k7LGfGi^Y_x0FgGNgc&e!}eyBAv-nt<Nw%BtUe$Re#W7rLR(Sq$Z49Zt)TNj z6jAx%xF#xYPJ@&etV-QNTzK~AUZPij0DsY}hBN53Oq*9;V(EIeyIlfX96Qh%o%#2c zVWR_{9zsl{l9wn(6>}QF0+|2(EFkmRt6a>Oq-b)d{tY2sjw!@kp+PK4{mMR|!BCyv zwsH$&T7Li`pnKl;k3L__0Q=tm7ZRM8jaFmnCM;HpWuGAdi(T>aXR6v7o=gE_QhAEC zy>`b+8k3>Np<B`0nL{m|{RkmSw2SD0wU6rE470*@<(m2bF@u3rq`aZ*8zR+3f4Cu* zcoZI45ZUiBfGFB@aZdWN?OyI!LmndqV)yK02sw8Xnu2le)^q$Jt3_ux6>t)V7({t~ zM2hFFyDqqPQA=hhSJ0qnV>Sudc|D|~ApHVJ7Bo{$&~ryzcdmXPdj2MZxIH&-YK?Od zJ<nQeDq4@6bXF{?A-`UHdB5#nmSY;r(X&Van9als{wlNJT(V$~ydwsVUz$mQvRFQu zj=z|eo8G_orz*KN$V&c0CcXA`J$tY2ny4hjps1O#B0Px~eaU0Gv<p*R9<FY^tP`0Z zd3aU{c_LLh(@s9055d~#S1>Y;GZbg8xlrIYG?-elep*zV7^yotmbgtuW&H(S=LAVy zVwP%-E6@8@_EWBnfrq?fHS@KwdW%5xdCAradmP8dy#!dmcEJf-uo)y;D*SN6%BJXC z2ht)hb6ySsJ#bwo{bcHFwxFvhYfRJ@KG0a;gH&qiSajt@uHS~;c@|p`4(fku48p*S ztof+z;QLoSCdZV~T%l1N^sw>HCzL{VfI&Z^iJx-+t7Fkgj;hX$5@;vYI6D0+KQ)l8 zte}pUf=xZ@A2byMmt3TJAR%B7r%aQTBh%2C-t}}q`q8w1H$x64^1!TG;O~!<<XNui zL--9VQ4M_nf0f6OAVge1z{q0Z%jzJ5b=6y1es_t?5Tp;;I)?SMq=-dzAl>Q^VjKm2 z7L)dsH8T|HLDP>pF?eSRqF)_hDA6s8lvZ5UT9<){TqpGgZ~}LVZc$l<v}`zj{?&N* z4^Fj@({w^L6ajw2?TBY)hqd0%K<wwlH}{9b&w*s&KGY99o$luV9s0Q|2BH(`W5Ct9 z;p=0tcv^GuR}947hw4Q?ePfZIp4No%KL<3`1K;gEU2i3I;odxbRbp#nM&wEdQEI^p zT99Vx_*MFDHGhDjj-sz<f;kACR6fB_4{YcPXHm=$(4@vQGooX${W#?85*Yx+vn0wQ z6g5jV6`|Vqvy<4;v9rETj3~z_(&JaKC@_7m+2Nf#V8SdVqRFT<$Vc~xZy|^Vs@f-J z?7~N#?j-gatc<s;(>|<kShUojt1@TMJNkCk2vKddK$rZYP#EP|C~%;;#tHca(y%js zRxHL=Dy>%T@FQfW@$sVFbk|%roN$3}{wl9_QB_!$%q8}%H!AdzTC<zLgxso7;7i|D z6+WH?*_Ok$z{9FrPk32u_u7Wn>Pv@w6P&FA0*J-yhVCug^Wtp3o&22Whj~4yq=KTE z#Dt-+&l;tP!X*~G>bbGU590+}f=Qr>0|k?;sfqdOHJG4E@ay(T)lssoFBG?$!(Y;X zyO*Fxl81f#OO#YY!Og5y$)$6Beq^1B-%u5Pw!BPBe;CU>=QV&M=}-2piexU&lG|qG zzwrGE)_|rw3B`PGWCxk4s<||q_dm=_dC20k(ICi*j?m$!LqU@~pAgQxjhgbt?Aq1d zhg1*X5b!dl?2rBQ0W~{_LtgW~`iJxwTO0f#e5EEQ>q|EW=D-7;P*|MU;2$>Hix9VM z-r6wFV$akD0b(F1m;aw?KaE_B*&m;rcrp3Q&MS-Cl>SsA7Wt}3>LOxt)c?3b*#*s} zA}dZ^8w&``Vq5=-Gq+jRGngBBI}AbSw9Rr!BiNG{3%?;M5Ib%I2qC9B^&ST1tNOMw zbn(c%?k7HJ*84LwgmZneIRgnVl`@W-Cz{h#9AKE7DR#fpb0-=^jZe~sBaIzMf{+SG zTvX#XhR1$I(3w(`3fX)J6G5|?3-fS1#f1D|(Xn-kRz?;@nfr5Cv<`LMc1933I^SXg z+OB%6*g$hcd2pk{=^Qq2{cS=ly>_lk5%swy`SrSA*ZRK7dMHrfa_E*1!I#;-8Oi`< zW{N%fTqRR^KobWW60YJ)olY}W_~%xl?Ryz*rH{lDTLp~Sey(itWVOj4K^rv?+O<y= z_G4nZAA<AIoC0n6)11?qpMAXA;Wq7JARP+ULr2b2bZV26`k>1IawXHNhs&1CHE7rB z+Z6f5XM49!XkEz~>(;6ae38>pK(A0AXT`4mHR4zLu>&tBrzf0N-=|SP6J!U01f-VF zbb41ySo0&0tULS6w(|g7LBo!Wceco6KudS|#~RdPuWtlFhRt+S$6(H`+E<Wd9BPZ6 zbdA^G!sA(-Ws?mLcf6utMo4h81I@o(Q3TGI-^8jT|G=hXwY;L132Wib&M8x$J&9m# zyRcs=)%w@h^P*5Lldq6I)MU}iS)rx#E8pQh1N2qTeWAC2#`$_hFhs<YHW?|qlu}FZ z-(F9!*<o`C#2@-E$@pbH2S#bob(t9GUN3Z-t&;6k&)ne3MHjhXXSJtD){mL3Ud{(P zH~O*2`-J$qovq&RH2aj#QNrd1iLPz0Oq6x;DqlEP&(zS3qSM+xF6xGLWEFhk8|D32 z{w9tu{xU}5fGkbpU<$-$hoa^+ANf~?++02=Wdx*a+0Gt^Z$%9u*|#EIytR$AboS8e zV_+KLthwl#djkpX{C4LJO21+qnA;k<>~F^;)qCOgY}d{958`w_=%qf}@3(@sr3PYc z@Yc2lS=%MZP>b(863RvZPhfjf6Bd3P34zWimA;R1^2-42<Sq%X+nkmexSLW^O5hC} z7oSM*$}BI!@QM#!30uSh2d-E@nUps^U{#4SovnpJ5TAuufPpK0e>>i2Iimx%s8t_l zQLufv(B;0Ctu5gr3CujO>86T<F!EVp&U4BpX?I`WLqEcru*;Xq1Gy#@OP2&zOUgz) zLbN_2S-%pG7^8fgX-;e%e|>Y4;C8i|M-Fr8)oOPgZ_k~XbQC)LRlL&GjDwjSE~CW` zYV|&LH;=QA?2G?ldWP|RuLN*PxLUbF68>I1JY9D>qQ=&(V6C#6vBxSbTZ|{w@xup| z77jFsukbMPC|>?15yk^1&+bMzj0mP}^}Ux4`QG%#5VK)YtS%B}2-{`0)}E>S5R`s1 zI!n_7TJ!PweEQ*G<0lAh8gf(zBrRyJN8d;oUWM^(w!*mX#pTA03F!WOH0p-UG!FA| z?KS2&8)gjH{C(o&2r9K!CMrXXlwL)5R7LT2QR=-E=;<(`63JVI|FN5`7GL}CI|wc* zCpig-?b}oNurN=hNI}|H%4G)`wS6?&ffcrasecxJKJjYM%FG_)Fgv7xyNQ8}jz_6v zb(U<%IiEaoU_Jj+ofL?7^Q9}^(>Yn}AQU!hkQvx|(VqLs-lg(xbN>7tDCP%3k++uN z@~b(!C42p=u4E2!5>wD(iZUyGfA$!szE~GR`I=*zAJ@}V!nbjC+`-q{gJMm%+De<p zH_-34C4E%hPjvf2ovmYmJ!ag+;;ughozKX$NrxHqlPj}y6@X@s>LX-KqF0R1W006( zvCom_AYuej^-3$KrJkUtI}BE6vf!oihoa)SMO<n<ZicBxf4=73M5uur9D~1){NNMJ z+U~}Td6zM3`2v00;rsW5sy?jdXP&V(b6S6;oPnNBHri0+cyVT|YUODXEBa_`ti1m5 z6$IB5wPM3nOg1T&W9c75z}zFyJGIR0wh5uusy7tSl;Y@-sJS=>0mu26po{dLvQ6@s z<1<oT(GO3$>|a5kfz#C0$&sfa+H2BThmMqZCe<c1m~@MsRgh?{F;=i(kjF5|H1fYv zHp`1yH9441hIAf~nr4`8JLD%`eYsiwHO|P<^P<Mf!QTSnW0A}DG;`#gTskLL$Fi8f zbNb6Uw}TYdp-~5D%RO%*a(v$zqE`GaGvXWKEz^FvgKn}2Eve52L~T!*ZiiakGcU<O z!A7N4a4t@!$Lk$vG&J3@`a*a$2_^d0vk%c5I;C}f-&4c4&^#}`w|>CWJZMuChBQ_f z5|PdrB7aIC><R+6AEw!qB0Np&`wDdvZFEX?TSQ7C5BVTi5yPUL;mFBaKeqeta64_= z`gQShqXx*v0k~Q98K{;#GW;2{eYXDN5b@D;Sl;6)q{1dX36aG|Eyd6+hcQlmT0k_Q zka@*|XzeHzlGrtLYG~GBhDI_X_rh5KZBs-su;;%+g;s(S#74%eZU_!(9gj+u7LGMk z=iU4TzoE1C?_s_&7HiFTWmcWIbGNZmnuttCet(NnEBvpArLYE&ZYqCL0zA|!KNdom z_NC5U$tJ>!yBX3#s_`-I9y6owTcvr6gL3|!>YiuSL$vJt0HoB_gf{+k?|)f{mG{Mq z$tpJme`B!zvQGjc@yuhZ%`|dY+DB{9{2iZ}0XW!rsKXc^moOr?eOH?Zvv3bcgE=a< z1ro4VkyDVIYc<Pl=q{M4OpsJOzt!usQwNpKEz97VmISb`{enM!>q8ocMl>QJiH4ng ziY@nL=GC(`??YfJwA=je_nF8^By1alb=hf1eY(gPA)ovIzBXZZ=jBnWPYY}lehy&d zNfYVZJRj{tKsayG&ErUMykEIbCNwI4b}w@z{5tXG;`vX9wj|3RG?7ox$u3Xm6`-6h zI?SNa6A+7h8Uhi~xq|>0rpM^A*EtsXYLL!?C=*{ABuZp<*necH6N-i&9@bo#p)271 z{<IrG@}gJw;yCCM8GQm^bKw=u0K?lzhd6y&&XOB>T2aR?=)!v4%2qk!i_sZE@0UjH zvG<|T0hxtJ)(4Zya&TUhY254be_7YrrH-58Rm=)dSXo7}@r!gH&+~&yM@{e0Nv`E= zUAndzk&a(FwS74%JWB|uz{+g=4NWJO8+GvYHb3yY`=uk){L+c>ANZjVy=7$9N=op} zmF(Hq7hL=b)ldfDX@W$JmlnqSBNCr^f`W9Yjc_j-q(b8tucgfn>w>@Zu<Z?>#b^+U zn*8hJ!81E#JdvMEiJB8JaQCdh+Cc-ERcMo!s?4-IzZI44<Lsb9YWd{ye2)qe6cz6j z2cjpc={sNSA%-L;xQ3Ujy_$2q1P-#+hPK<p`l_HJJU|}%qkCfAzk5rSmUFvl^70~a zEi4@_unC!QJbd{J+T)CBzLZOX-�e_YP3^qZy>MC6QLnB{oFOw0lg=+Du*~`a-Rm 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 U6Jam>_ZKHxYWk`*$~IB|2h}Nm)c^nh diff --git a/site/content/images/graph-visualizer-create-edge.png b/site/content/images/graph-visualizer-create-edge.png index cb3e497b8efb4a2b3fb5aa6d1a861f12490751bd..a7dcfc7313e46709a406efdccdac26a545a10e60 100644 GIT binary patch literal 10029 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 E7rX>E8vp<R literal 8632 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 QuNZi0Dw@g_iWb5D3v;9XP5=M^ diff --git a/site/content/images/graph-visualizer-customization.png b/site/content/images/graph-visualizer-customization.png index 0c808278ae95d6137ce4bd65df77a0feae0dde27..5605b8360a24bcf390c96100706e1dbd8e6659be 100644 GIT binary patch literal 17394 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ⅇ?Sx7Vm*#|wa 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 literal 17314 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 diff --git a/site/content/images/graph-visualizer-menu-canvas-action.png b/site/content/images/graph-visualizer-menu-canvas-action.png index bea7643755215e8efc10f17cfc098be424002c3b..831b1d387fd5a7d9120fa80f9f1df1d5d0ecc16d 100644 GIT binary patch literal 15060 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 Y;=X9{p4+|s^Pfy*MU9tL@*h6_A5c&`KL7v# literal 11317 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 diff --git a/site/content/images/graph-visualizer-node-properties.png b/site/content/images/graph-visualizer-node-properties.png index 83a8f731a04839a053604c4b56ff2d2e19354af2..e4bea6dd20eb3a8bb659a71021b80c542b918b3a 100644 GIT binary patch literal 20966 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 literal 19492 zcmbrlbx<5n6fTMcNbsOpJS4aTvdH322o@}mg+TDZVQ~u*T!ZW4fdmg(+$}hZySoR6 z;BWK0_g39k^={RB_5Rp8Tc`V+IWyf~f8TWVgsG{%A;6`=MMFa)c&i|*frf?wpnma> zF;O0C`%j!GW2mOAC3kgo_3-d;dwY9xb8~TVadLWcbab@0x3{sev9Pc(K0ZE(9O(T0 zyQ!%WQHl8R<2xJ<7pYke%KH!*85s}|fSy0+;o)Hv%3^0{XJ}}ssi`R|D=R1{$i>CQ z%F2p`h4oxgPXrB3$@i_Sl$QJK{!DLl9uHa2O44jIow4%sFNysQOAovv!K%;II3l>I z3l+Cc85xm3ugtpFDO;I*Obo~A9uus^#ey+gyTXoNU{8W;yC`Tp17^K8Sn~PN$+D}i z0T&Qsz?U-*l{r=nR>h1-uqpQYAE)S&Y&L0XaP4j;6*f*l&EGR9cmv<+mBr0dv<#_y zq@zU-J~zI~$~~u6?)fChCqwEW9_`-l%WkDS;9v<%3*^u_V<)>7BrwaMkw0_BrgSM7 z2Hi?z5>jsC7d<nxj|dt8X{|sD#K8OMY9f3TU5DTwv{ZO&G-y>aCPr|<99Ij*$Q!Cp zq?<|0T(20HuJ2Q+<8w6He_^i~M@HYD@CpR~8dGkz;1o;c6aM1%LAD?_BgpPqF!!*W z_$GB??#->yW^-uIXnGY>(sv;Z*OZF4nbkb$R{_fe6c?PDb;yr`Ho|Xo9L74-*n($B z&f5hk<$HHNASn+T`DD96@#`!4@JWzJbkefE`J7R<7GO6mR4>^e%ii_wGq;=bnWu%> zLSo0jCg0kr<`vhTOd4j}+(7j(uFE7rLo}guB(l?)sPg!8y<l*tGHKrVWdqYM-VGLs zPcgY-&F2H6%<p7tENs&~-%(FB8+hqS%xt}STj+A*ER!1MFReH-Tm&_?+m({_o#qYD z@0NNNUS`FhMiM6e2>s?k!l}#kEpw{igu<)-c{xqvbd~5b0<?TDo?Fbm5nhZ~3gQlH z!j$d?m`|6DpX(D~W$ztr1*@zR6Qj#xz0irqvw~)4D?($I$=%C9x+-Vrn;ogL_Z&{| zZAd6NDc2t+-ZDHtM~hFm+@kZ*)9n4FCjANjU_2az#wOQD#MK>YahQ?=)SiRDSfvK7 zGi^v@a8ejmSe&w8U@2);m{5oOIDE@xN46MCGbKW`lR~q46hufxfiQeUSkR{@(>W2K z(nG-Yl-WA6aG=<}c&_7iiNA!jR{GUBGdC{?m^r~Rw9>>N%{MXK4g*zwUepnPP%Hdt z$)4<R;W9om<Y1movL(%oPoi#)d`!7DpsYnO9nR$-?TZ^-yfI1_WiN{r9iBiIU^QXM z?D~vlvy=3i@ffCi)aIu@S1FWW{mVf`*>X3|2CsUSN3T~g{As?7Y(DiiViCvxVHmS{ zEFW%Wj@#<i&hpCqO0-f}@9p>W)E_}Dzq|~QBs_f1_i5@Jq=(F)rx>_Y*UG|K4OJd$ zSiB4_*=<=KM9?3-SYeMN1hhZm|E)3+me;EOwXg`kQ`5PbVZ<aD8L&9N&{G&ZX8cl* z{ZxQ%<!a#;86ALdUsu*=>&pv?DplY|;3kRvWGL&!OV!8;Aa}wpVT321M@`zazAO=T z@4cn)5`J@L_o8iZ2CLpdoI^R1B*7*>=Z_$gfsce-WU<$Y!E@6_Vv8#Pk!hH-sP*a` z9Hq6sS)7Dpl12~T*h~?Ha@KDgDTr)|rYjtisSo_B6Kasu$rMDS#hHY>rq-oaVyFBx zFl$qkyCHr(Bc8P*wi_^KVT!A@3&_~*EMR{3J_K@<zFG9XIP;#}qIru67W+DX?O)a) z!6EB8pGU{QCM3}H(}}|P3{C!r;y{A=4H3MTWonIqV~z9{*=^@+82tXqVBm+SgMcGK z+&RXJ9|{R3>7yGl__*J7^V#<z;&a1+3hko~h@BHBQB@H0GwJ-{!w0Uft&Kw?zfEVk zo!svXY9T+pPTv()>KTpQpbK<Cc3{YgGbem`S8n<4LNICGp~s=gFy{fRR`u!`S4)H4 zs3*Vt(uS*Q+;QQ$;g?(&r^f}i=)Y@~THZ-uyH?pb>inU#oLwF(JoWY_<uf^Wc)_PN z?RSIDVdLx@j|84)4vN_(Z3^lvVg7nM99S9TdFd@r{n6YNftr9%Xg3Y3GEY8UH-kz> zx#6ZD?Q1fw7V)gN_OJSD1^fPr`p>yjb@N@h$_6dlIPN?6I^}a^O<8DidPa{Bae_3o zER)YZ0i~7C^WDh!a`ufE_Bbz#`ZmURhjSXj#IHu6b9KL-OLd&~fLtaEkipp>n7dM$ zdF-SkS9<K<=#omTi)gqTnCu}l&Bs=|^Rt_TpEI>IKG#r88V>xjxv<;Fm26}wFgTd? zvIZxwP$%+mIw;}G(`$w(Z)34c39l%m#qk{BhI&#r|8{Ej7LBMXQ02zll!Mfc{UWBc zY;&QpS75XxsW3?;dVk(;JC&NPlzspU`_AN3ll&k-_5(v0(;2%;67WN2Q*7f8gT^s3 z(1inZv%!*p8lE%uHolcV5=9kU!=P;N53K)NXP;aI_A>SVo1Xt$TK7WaeP|?qG4Iv~ z%)^cT4B8|{LJnNghEwYnP8pQPA8Gzspft=>mvCz;gSP>Du^%%-MP>ArPfG#VU5Uu8 z`c!FZ|9#8USjr+H(lQDAV)vDo`52h(@uL+savTX>kcnjF-or!xLQ>*B^C8{9eB_W3 zNg4@vqLrbibA%f<j$BLN+vI-ZJprGOUmc(Ine4G~e)bPAf1(r+GUwO}2ql!1#OiJb z_C0P@{Hq4a&Wq}MWO}T?)Y|#O0RBU^*!)~;^Lxf(QolIIR0lBMFq-|eUWfOwmxW5# z>IN%;+8ZSH0TTT?<Z^Hw+}#wETBmI#WUm&o<>~N=`=(?~yCa-WIA!M~bx@HCg1iQ= z2$rhCjZL#`vCpgNy*vnYb=thVGezwBv9d}hXE$Z)^WM<W+n=a{x+%1)uUY%d``+86 z5qpI{3?ee=S)1xdo!E~Y0PdEok>@v@A{ORZIJ;b=Ai_ZX%)cx{@?F^__?EU3TJE)6 zI!i<KQ=hP{K@LYNDOQTaHx!D-_P$6&*!T85&&-#}TXYV3WlMsIaG>JLub=&xr2Ipb zArxx&$$%;rmg+#QQ+tQXRUhzPndR1#)QjfwbY=+=q=6=}1y#zzl04t)`0lcpSniG8 zo!w-YJ4Ka@;f^J2Xs9;CN3tgaKiVG>E!MtZd-A67QswdhbmXAfe3}{-iNsROt5V5z zimkv_9Qy3&)C^~)VTxoM8jfAjdNmJE&uW>nA8-?wsft;*(kvy7TillAjr|r0ElHq1 zq4WZB=YN#RsnauuNlCxYJwtoD^&oKyjf;|ToD+NbNExZPVEt1exxtfs)^M7031?iu zhL;zO)p<UJPvlirGxE6IqoOvs;wQ<I{)z6=87vA#<g2d|L8_yfsqeh1TVq$rr81wk z_=&zy?U?dN0xN!av~VbUE4U7V(e;48h`vB#c*w^9olu6M$0v~xymb(&JK!(+q6fUn z83R1>kcVTPL{4`g9%xBb8wLI~#{z)=3FtWA^nu{N(0)_|DjmiDIo)%wVbmoiGdD^n z>t76o+KR0SxAuUIm4;3XaL7F5ZFZpFNoi4b3tD<Oz7DEL1r(RmANHZW)9P6q-GOA} z^UKn%zdhG0MrqH>k9Ip9n9mZW-gLHjniGG$${vvRl09Sp%E4Sxd!PJ*B$VKT`C!ns zO{OIc_2hs7x}>>-UFy%~2cFmNnh4}IVW_Prsc`It<*I2WOhl(&X|LdQ=})&8RZ3s6 zt6qpP-(Xz;9xP^V=&YTFo`h&o30xlw*KS0HA(-fER%izzkIxL6sh|E>R^){WZ_oH~ zwx&_Lj2#VafHy|?(K0$X47P?n;7}?$L!w$*gdD>f)#JxBlP}zgJPNiR*-9q)9mP|K zZ=@b=V@a+NXPk#pO-D9kE(<j7ONqNbi8&Xy5dTYoK{9A%nsbUt{HEF9h5Kaf4=8Vr z4rrW0pFrj(*PluD>7Y?}5vT+i8bf1mhaPG4jOWX?(o%m&Ezp&#!%M<cNS2Eqtb(;| zI46EI@*<ZWN;a^E@pros8ue(DM~vy_Z>D}~c#6;P90#Gg6n|cE#1nnIhE`x|ON~_` z5k^q{!D!I)WgNBdfF`(nNXKi_?98SO%|aF`0#}+2TD&AyJI<4Ojx&}VrAaT(0QTwe zhcp6q@|84pnj0CDIk7hxAHii%q&?^3SK`sE_6i7{BjpMZY`|YH5>}t|1w8?bB(2AG zHL55)$Ih<7C|l3l*o*xJ`rL3ul_|9~av1~atTP%l5{=4EUarP@y`vdvfH7{jc`SD4 z^GG(-veVif8#A|5W>z&tl-7sw;wR}wpth3j7@)pb<P)w~`X=x+kJp?B6KC}(^F4S~ zOIpZXw(@gQbH9``|Nd{ey1!7|+PHJVk@Ve;(01xF^i}JtN?>4>px;oX>x0K98sf`4 z*LvfPxy1fC@-)ts8_|C2!m6b6DUWKk@%EhW{q;TqQ0eW!zam57s)|p2GCzj0i!y3- z-mjSUV^uvl-nhiUmjd@qO2FM}a`5Z#t%kTGM-l}jGHXTRul>K>WT56>|7a%X-S=Lw zvB(g~e}F6R*Bin{!E72KwbYC9uX#9S-+`pABHf{j?gA(nZh%)4bG+rzQ1+#o_zTu7 z6h==#=&zE76zltwrbV;N0%~X&yY1xe-xPTaWV*6{(q*%LtoHpR_$m@Aiyn(v6M8Qa zwU_0>9^l|^W-OV}m%fQmzDdoRMlAC0ZLWJy6wV8CJfpwWLd9Hc4I%fS0?3Ibq14a& zTG(r|T0-OM-%qNqN)qEjrtF@jVS02iy;{#s$7l2q#Q#-Gz+;xi5GYXZ1O8axg`Hla zGFRYkp6Sf~im3*}YgcQLFN>Tsx0Zb7%1AU4z}PrbP>uS{Q5}IPEZ^sSREY2ZxibE# z?1DJpVU{Kj2`3^(x(>!w#Isd5qE4VEob<fQ3;v=`q#;&ECUml}*F(bAdpyfHNuRPW zWzh4F7fhzB+7N%euyG!<>R_6-pbB15c`BL#lKr9Sk>{NxYEA2zxYbAB1MWAma<hf+ zQD8nQ&=n)?hUx?xJ<&;vDgTi0^usJ0`I?sKfmZNho#llS!BbS#>{(1hWL>!Hj^Z%@ zRh%Afk<cuOff6w*1J7S^y?4$t+g65_(T$Nwa+Z9kK<)&*7fyKSs5nR#NY?4c+MpbZ z9RZKENq1^R5*KEaoQQMsvtE4J1p8!iQZdqIuh~L4LB)O%qRd}GKBKRt7hpN(bk`IC zNXI(BhO_x=ezOZ=GRH`;?bVp-#%z>anxhJ~j^lq%li=Byq5xeFg3b>6Tb%=!VeYp1 zQpgJ4qe|<^O!6^zkJ&;_wFPsfem~(v!6AUe1k2HuXgxK|?tHq#3=Vqqt0q&f#!AqD zyC$A=!{%xhG0WyYS=i{VJ(z?V<%_FGJ=wWS3RJ{iQeMkqF{k@#FsDa#;KL*c4Rk4; zdWKmd7T+8MWc2m7nH{R2il5s8tI?HDUrA<0*~K)Sv->DWoI5&{dF&7IAvM^y8u&Q# zkCR$X2Od#oIkSh51M4n>CtlxA46*-v%IFFq7IQMRIA?Zs?yI@9j7S1e(S{#?wbO$? z3)@y)l%#c>jH#M!o8w!<g%eviv&0U+4@Qp{Cp*{kB(+6(yO_=2m7WZqU@eY$Ug2c) zVVQu4sn-!9K=)l2#Qg&5Im>&HhQez2*$YB1_jB^h#L7J3?Q_7lv)^5Q_%6L=t$o|L zBO~WVFznFp&(h200Q%UW(1oj~SCM~d6NW+&l2?&veL&~iY;SoK^pF@EU<?%gSWx&w z0ThClF!UJJ0)N!^A4)lIzj<rFcVGcxaVctJzQ}wt6l(npdyc~jasjD{-_ZW%BX`Jy zJ*(i7-34J5HYwL(+p#v1E`pusNH-8IXEt#foz!DvMOlw1<J|^l5yFduOhFf#Z!^`! zZ@h-^9|_xQl%@vy9f6fHOW9ba&^%lty(blVQ>h@5i<Wu2f<#1xfn*{L_3qlZ>Rg%m zU*1IFlFaru08kFA+MLEOM49}vXJ$-4sL#?*Q>FH~>NmA@54uUFBMmxLY2ja2phc%2 zMb})}v(vajWW`<%X%m=NlwULf8_)V{^YbRV?2!QWNO0po$3v+MjngyY5I(-v=9fcp z<`F>Z$>$RBe#7UUNql-kY1Tv7eB@eP8Y0_nTi}3g{;dr^3)~;fXSB|ATPPrL9x9!1 zT2Y80Hp5-mi8!bhJt+A9i?R|-RBwwHyV$@wnX&!;+lF0(GF154rmjVvZ9|;sniOKf zgFqjxQnl%l)2cd?e=75B0`azbe%@$;Y<lfDxmsAQ?22u?cfqJcPK^#tF8c6_3VFg@ zhVd^j;mq8cirtrYmK**jd08{NA5H@RD@)?{XuGgru9^P09>A+>;{M9!U?!u`Z*uK} z%C_!whOzWkqq}>ORfWj%VdiE2aCcYNc}d-c%?GMja>?UO>Hr074|kyju)^24AuVNY z`~KlRP^kkX`KQQl)ATOreHUW<lQ&48AZ)V8Q2UdLK?yKe1@t??A07O1?E!F?DSFXr zBX?x;vf5k!d|MkFSGzq@Huf!+AY9Ko9EJCkT2CT2XAwy2#}+3x-@UPMM_fy)wr{3Q zqC(4p7v5(2%g0NInjow@LZ{@czSBmmgDR0H6Q}|s2Vr%v^%>PG{JtlonyDJ<_*ORv z`1kky9#J!18Tl;RwIh*)K(p!XUx$oIA(H`OABf+viLM=5pqnB)uq}EZer3a!?<(9o z@xqwM3*nAEUw`5AbCo4Fzv3+RJvwT%kJ(B0_V|y2(a?;ZHre$eN>67HbnCl38FLi& zqL<IlEgopeIkKM*-ScN<6x-`96^M<sVaEUuNkgjBHBFM4cWF9(fCR}&<R7BHgpR@+ z?=EqOeS1buK~gA;-IJm4CWJ!O|Kd9|6yUb}P=trVWBfln{zDul3UR2;s{a7FJaGaw zz>u<u8S1OKyb#Q?vt$P~v{HQhfPVM`dn*Lr@9X`cxa;xvEZ*V|7xYtd2BU{S$@R~3 ztMrNTiv4D-c3|f_cC~4Mw>dHSyn0r%<`@I+^p~%9kA8=`lA+mLoKClX%2vD0iHSFR zfMwJuv<&TQc~5&b4N7n6pIV6Cz1)bT`WIe(Qc`WuR_xwo|1eNWkG8y=36i}t%ar;q zWYdd%WwQZYHWRgm*L|f~1lw(Sa3_Dg`{K=w;+faH+t_71Y;*V;M8E7_hdPk&elfYC zN&dz5Z3pd_JoSQpdvz(<`x)vx-%X_L4m1g;1FLEkH^tw`^eOUz=RqRu^||GZo%ezK zj5>uhW3v02^XSfc$<*R2jUG8`_VkJ=dzh=B4YWl!)U#npPzQ5X!1l7&Lk=6kyB4f! zG<JRwj%c_rAZ6SCT6gME<5?aOPh%GFKFhJ7*!5>7ymy1fecY-NeNc<}Z<+oili$ zwXHHX(X3o3r`*|L-9pK66XTDmV;g?Ux1o81hpY>!(5UknI7fkkD%FoFb4@F{3ZL&- zYI0WU+R=&ynx*6=-~RAT1Q|TrkD}5#Ej=F~`(;CB!i>2I!W$OQ`&ej3k%7s_Z0Nqu z_e<d9-5zw0oit+q9q%KI%SK+IaohnMI4mkHLW13mXscDvrEc<or=B^;_Jw)t;1!?D zhh;s_CnVGAg3H3}R;qr7wWM_GA!ktk@ZK!AN}YC3t6lj==<+gWvMyJy<`L(+(5F1f z*@X?Apce(wuwZjh?=S?xD5oc$*TdOjrP{v3USN=ZSi_s@Xr|7N>n{ib2a?G+>}Z0q z2q7bx#E3uZX<s3-zZZY5Udi2LBDVMv8DjZ2OV;IF3tk3Q2hca9|0GU~!Tv(_nbWd8 z!<SbdKpWIEqL({t{Rjasd+|Q{Fn6^4LlSS-v`gvY-t7$ZY$ik(Aq+XKDu}gkk~aP= z3)(E{@}Nn^hY?=};*s;#JSIQZZFfza_HHqXDuD1b+!6vZiY70%UIE@}sdlzsb1sus zpN1p^Q^KP>?O?S0)65w(+h9@p>&;Nom%Erq8b>Q+bgbb3Ri&7-X_fjLoX{T5AM&`* zM+l6J+GbrE9VkNQU}7126l1(&oipvUMW03hW&ie#bRlY|p!dY|u+~Tl2q_L=>3#cC zjSFUu#pP`#eEFVAq@C_djL7H(Es|o@KY9pGzAE40%9?vnJIGP%yN~%XHE4d$nW4|^ zxqC3Iz5slR4&1ssoOxiU(1*^^lTRIVLTRRpDJllFx-s=3r-tjrRbWzJXE8IE{@SOj zk_T{Fai4Ri0memv;60+>sjsy*@he_x7zx#{1%F8R!*1fXv|>}t`-r}saD^7QcnqVc z7-w*9RxTGxS60}jduJQKLK9_Z<Oo6dw1Pf+tZWz9xLPkj;t_HtDTw<%&>Oe8U_9X4 z3q;Gl!}Y`g$clLWiQp~z=Zj3l@e-V%1mZ80NAYr?h68Xc|5>6Ia7zLdBn|X7tqsVC z#~JB=iwR~ye&A1DhcO-&^0z7J=2deVZek+6#o}^Ab~1(1!BlIj*2qpn_17UQ?Wxc7 zJ?3!~G}+g;PZAMJBfz$xC0Cb;@UZUj`?tkpVsT&Lb-H7olq<`Tb`<)qE0K%UlkcZH zrzXLlH<!wR2#dGDB?7~%SioyP>c6kM3fmA%vv^fI)HwaVTQ<t6Cf136e}1m}?kpih zP4bL}zi~Zs)OM!0#i5JigH=O7{yH@Gy$;gnO;-NXDA~-%U!U`G&{c_=OS9Cg(L)*z zLMfhh!4GKPRK53wXx4R|typV%j9H|G1K*dNs=rvO5IfV-1!r}5I=a4tS>Sdh2LZOR zH5qe6Y#j6LrCcv`>!H$G{K!b1>0JWgnmAOS6)!DAzKbz59-N4Yw<ri-cs6yxH?19B zMD(>pp>DZ-hG++oR>@UWu+rKg$z|@S=8>%RJm?V-{FrgtjY1X4V1ZMGeH8)*{SD}4 zdAm`9l$^aoO4j~rTC-91Fn%kh$-Qw@`-t)5r7Vd=1*El~f|G?oci)a6GxJ;C>aGmh z=OjW`q04$al`G>L32>l$MgFpbEJF^-aL!(GEr9_n_^*oX*c_zeJO*aV(fmBcS3B#s zw3W5U@v{rvIZ6rCrMAHYS}CeX#*Nqz4!}6z`dC5++B5mB{_>lN;;^tZjRCA{MguOe z^Ve{hKA7cCJa1}GO-yCA(2CipjKHjnHbjoNim=-wyw{<CsQ_%a6NtI4{sX_^0xKjf z6T|&oW1H#j8$J;nfuAsDv3=be_@{D!suX-RbP3iO@gKd_EQFMraJLi<m2g*WR;|Du zkt20S(e(OYO@A<jZPX%duLq=qAYm*>t+K3pFc}fHznA(`$Y~Oo_j?EflH+6Wp_qZH zO9tji&VX&C0^h<<j0^Q)XO&ovGRrpJ(a1bZVc{I8N1oDspSmVBJ)Jf$WrMjuE{r+Y zugk{%EOlIzezhGmq+!(_OZ&CoeiuCA^Y(lQ($hI}eyK&9!2`VVp_^pCdzcnk+LZNR z4fm2E_9uRg*^&MB?>+r#>PrVEKXIjsy~)L;h(DV|y)L4&CQ7O+tTsNH)ZH2MapoWy zr+G9IO2Y3yIsdf5RG+m@jJn8O8X&uVA=ikPuKY43I2)H66Q4dy?wUtjd|mXtkoYOD z_uEgb7EIt$-7Dm#T^=YnI{K-|CqQCO#o>cI_2JURt};QuL*+F$^1aE;qfo)Why?{O zBr=dzxZ~;E_alLCEn9)^Arf=%G$w8JUlQR#y3Jo)(AaB${tWs3eR3bkuzkzSdwhy| z3s-B#USaT+_kO%S^cd{~=maG1BmdcufA(Jkc1uTA1*eiBj^$jz&w!X53di3NyDI8N z_bHyF?6~({IO{{v@zi>4go-9g(^5TZPIbm1f25*bsV3)oHdoU)H(Najtq&RaQC-kt zm{~1(Nm=R*kb9*fg*Ep_K=$in7fwA{O@3zuylkuKV-w9#K;q(J@zctX;+%qBKtM$M z@2U;7)HITQ9x{RgGCu7jPO8VLcDt{GqhT}rSjq$7@kWYU;ndxiILzJ@pf81%KGAv- zI74r%OAXzgo1IuCa;~y>t;h!Qe}HDR#rD(G9+`N5T&m%{!OtbAdG70)FqtrxGp~G^ zG1OXwzv*SfN~O$Zao<Qp_>pH~pvYnPSb&Zif8g~vZc6ib*C)@6p-7Ffc^cYD_+-t2 zJ}|MoowPyzA%eo4qVJ8pX??@j4dPkN*ScBq)OJ$$`wY*aMf`HZsXMP2A}78ace&co zg$J`)NCAnziGTJFPCohQ{ZVt{-2(Y+`0vZXI%G)_=fUmMX6ZF(8Y{m_UFd7(NXnp3 zEwwunmxHyUn)9TS&UDe0Au=0MIx{NCc6XT}0$p|IZyQ&rPJlPD+D4691x@OjGGKG9 z0htjVtic@{MGnJ1SK?1V(N63vMdIim9rOUB45ex1)h7e2{9NN`E{{E^NyoK?Bl^Ku zT@O#@>SrAvk65Vcq?|B1ZqBKO7D|}e$yNTB|E+MmNuz9m2>#J=FB^<C?KReJNhN`7 zHu5F5y6E^!ihm&BYC<K^owSyglHGNak4)My5{|tQJf{q)O*!guq&(ezY@6V2IcL$K z(vwAtcB-MvQSD3-lq)A(9L#=ksAG%6k5@Ha4pvs_5PBX(K{}q6kDS~v)4hpS-NS#) zQa@j*DOOT-q5bKnc*`4w4U<!X8U|n2NY7`MHUBe>I?$%7w;;HgjpX6ynglWbDEyaU z!+f{aTs4L1#|%g4d!0Q-a%nHe{G7Ng;TOKH_&)s4#g+H^FK$vFz4VbNHj)nh`*rnS zyloCxS#2*#ST8wwClg&G&Ajp1o{@)%eX70J6Jy5-&5T$H5d}+O?C7pOt_&mASq<RI z-N?XfSb4`H#F-+$K<=Fv(8tp}K2zVQ>D&Lan@uZa(}2i?SoDkiS_rx2gpJGzP>!|1 z&vb~WLguPfDgbZoi-~>R(9MD#4yAm93oVs0p6p@$*jENhYYz5Ktcp{7?<(;>a#(=J zNu}%J7s<+K10xFUtTT@59rOCmlU3yJ_xIquO2^LpSGvIIzl?UR_1}1l8($}s*k3Q- zfC>tJ3sc8Wn0~)WMY0!*RItB#Su*j9-^j`?n4{a%(UwXO<m;n-)&6<mIQX-|s_Q3_ z<h#V3oEN?qE`hedTVv}Cxg3iMq%>#h@$r_pQwb%`9V#c63-&xwXa!NgTz%<@YE<g# z7~BvZ)#-V1RE+y)F2$;VNmjTcIpu*j)bZDPQ)zG3=NBn-7ox@iO^o|5R8{m?ic9NB zIPHa!J1{lik+i^v*PqiMSA{-YN$on%edR^7dH5UgQ7aNAyJl-YYDE&2Jf|_hz5*Mg zR-Vu-!YeR_-!14E6eIECpM8$9Xgyg^v(QluC`*s=f9lX?eFu%hkn#?YP}*W)#I>Ec zcoG5T6f)XcS`SPw&|D~qc^&eU+tdXeM^z~~nfVlNx&wP%gTe*@EBm&5R1Dc2sy9-b z4t<yv5C6&2EK<;3=le9LTcz$-^B)vfP%^!F&w&5^I67R*NFA5&@FC?p+Cg~T0Mf?X z+==AAboNpH(>1~Aw7&?6&}!M>6o-3=jw{gA{Fs(=W|21UYmj-=#Oz-C+uX~=s3TQR z9tjc0NoYbcM^-38F|UI^&VIPSrv}?>ZijE_KGe?Y>P!D(g|t`sE9ne!6_F6(?roEt zk1#vEpn_&jKiQ7-k$SpC1)@!$6SU(Y#G#|rn-?x37+tu8%XBsTz6-`K8&wNY$uYGj zUkjEwGn2~ZUVSV<i)Y&0y>PAi9f@-SmJW+@a-6jd+6Fm1pOr`2ij^%|w~+!FjB_ih zmg;}t6ULL8c&*o5H7gad^lF7dd|_aHnbi`30{_8%GdF+*lhPs*1Q*B4e={xfm-qUE zVZ<JTv{{jif5~BrPcixd^$ECYU$r4N<EO>1Mc5zjm}s~PFUwAE>XdRAqW6l6X_g|P z_>%NC^qI}ipR{Dl=y{!U(FQ+Et){U{wfv>uwnvzp<wz!C8i!y&-^nd5zFCUN5}McF z4+ZbNf*^L9EYW0({unPj71NDa<k*H2h4^<TXOXnUWiwVvHbg7Kb**b+EzL#5DB+3d zsWN93l13yUGXB`I%XYz+BZBJyq~i6@2@F_pk!}C!?Z94r%r?xguQQ@b+|hNEP)>Ge zd}BBM#m`UAyz_*4gMH6wkzKTe&48-1=iHxQEjLK~5ANKrSSLPlKB8njjC|F%;+_x* zr4N;pH%~(mSF6GdbhWeY62a1E=Nc7uqkfA5{yYRWPbxou|3>6^%M7g25XRJ2t0`{T zkU~iuLJ&`<b{VffY!3|!Q?MhF><4B7E{FQ~8%cnZa0K)CTh6X_ZOUEC3S@|x|9j0E z0iLT2_VgdCNOyq@nD)T4E!c2QNQQp62pk6J)rN{w)TTcvm3gik*vt!r-0ojOsP$=V zcsNZWx_u<eLAM${@^o9KCCEf=ebFlNh=b)gaC;=?M_GD2vVxxyWN}Zt)V|{W_rTc{ zwmNq-;RGqzoKJVFC-Zhy^|1U6*uTEGr2{hbp6S2*V-=4mMo4Y%YtTvSrB$wrUaMta z^r0=}#OzDf>@Y6AA=(0V7=IB#r@lk*EW(abL+UYu{kSCXinU2uZ^e*(6RtlS#9hs! zzl9FBwJ~2QA$8ZV9}A;OF}0yV?W$17Yq3qb9Eo2C-wsee&$uk8U$wbd#PwN^v^>lp z!3(Z8A_zhL{g5-fbKg@Aldsv`n>Zh7bq(|riLw<$rcWqh{z1*n?FC)*1ghUTl9{tP z0s;RGzjghDa637GiES4RM}If5=B^E*H`T;?HsVF&6N{K;1HX;9IaAcN*n-Tja8A|; zBj51Q=DxzSk>_ApbAdtqcx}w2=Gv)uM4Fe#xRIl7gP`<}9~{>?2|uZJ)gL!~sv{sD zU3jYbzz(P(*IgP@v8f3!g{(`Kz7dV+1TjV)|LEJp!0+<<xP*&1^bq&sKTn?2Qh}}E z7=(3#eDvhTc-RwE&LvR@h=0)Z*Wy1sqZJmNIz@jknB!agDtSra-I=#vB#?*k%Rp`D z^mfzooG$s+ug!WlEOUu7omumusBg&L{I2%oG#%QKvtJ%der9k5oy6nV0-$I@68)Y8 z8@HTzjy_4}jD1&73Q6S9F9R8r{|h|JtSJ=b$BH>cluW6i{0yj&SGm+z(2F^wXW8vO zddq>#->*g4Q8EiWe*^nYLr+|zFv^^FgSOuhk8}U>lh_{D3JGbyFWKeH6>1}xIL~Os z*rxReCL(X8&pPq^@?Qp%zeC|;PA#UeOPs1MSFe&f&~w_Bb||wF6;%F|cn&L0v9^3< z?xHVjyDYj11gj%gFRP&*jiz5>x}nkXI=K3Sew}~24{JGKSso~#NQPkgD?OcoIs^{E zv@Pt-rruI#O&2AEzU(Cu!h7G+4q`1wbKMKXfkZT~4jSGL2monWUYW<~TSN?EF93tj zQ3%I1Yy8H~(cmy^g4S$Z*q7`fhu~FfI6w8LQ4V)MgcWsp@q(iK^6I#Krr=iA<(zrb zvpuWPB9X0<j5AKuW>>&yI5>3oo3_mHGoU{l6GkD(GnD(t&wL$5og4AW1e46f%FkSc zu5{e;A)COf;HnF>*Ik=AFdHCj&CZHLxRKpRAya4jsLu#OD>OFgx&@!moVVX4rmPtB zDPah0J+u+^eO-1oF1fGZO9gn$LW;X8?n4n>cF2-|&2$rL!2+L)+kI=FxsBZno)LlA z12{RZW;3zh>g3q^^9d525BJ1Cn#h<Pd<1(RZMXol<gQ)7?U(**XQkXnyYm`y0$O|u zD)6`8zNcXk=>O)c8U8?^GOJ8_yVzU4+nP!P;|fCzdV1R$C!4r6;aU$7v+_mnNcg!D zOu!V^Qsi5b!oZGv^+TX41@Q}#5MXGid9y~pjE?jzt1EJSvp$N^qb|E+Sc9*qo!F`& z1QNhT5(}{|CB>pHIf&yI81Ho|t-{O8o}DgJ3XxeIl@{xcH9dm}{$_J<ZRJeeie&_x z7quYY*gKd2p1hYxc|ID&Fr_+=2v^<($hCN|I6*C0EHe~CkhMKJhc=u90|=b?j5NGZ z!jnu>do-CTCUKLt<XYDSE7iZOC)u44qRWU)CLLHzrx4!b^^kCFeR+Mwi`0<Lf@ng9 zj~E+6NtJ5R4Lf(>7~@JM)3a5%ma1I|^*Bhv6#wc2eWa)0cca4kbxx+UFhpNUu!9!5 z-pXoL8|+)`kI|WrhKdlI+c_8Sp`phJB1kcXtWx1yGaKpy<t)+v%5eM@)Ecv=5v8IT zYFE<zoUA0HT^BtDKaPHdbK_kYLikEQWQtuVP;pKVi>Kj_``tF+Dv%-j6%4BTS3t#Y z0XHF~5C=&t9XPt1bs}VsRPdPp?)%{KBY09PeW9+HV%jNVR8oVEx4Z2VL<1b___xPl z0mk;B;mK<6DdN>%1{S1)!jWOil!ck&f<b?$sTyu5bH%e&)b-7VV-a1<S)#VKq=d$w zb(0*S{ZSGcls(^+`VT4<;VWMXgy?!3;BA3xOkI`Qxr*>8pQt-sHOz5yp$YS{sAyl@ zEh-)!Ig7S!Io1T~5$Ez%ao}x<CUTE4wmvmY+|B303`z4fgfW3t;*@Sk^ePmgA1%=X z&4Go(U63>1s-8SPD^297D|5qDNZ`W~hp44OPAz(8Lmhuo!__kvf{&=-?>Pu7c6tx* zG>nR?4;CIH3bDee8)P~hEjA;;hx7E^U=7;x4(he|kC*dTGgG(Ky%QrI-I`I09)eYJ zk<k(Hg-RZ}(i7dXI0gJ=@78A8kvc^q=dBqr(@V>dqj`K~!~kT%`HQfDa%SZYH-w|o zwj1xG1(#beOW^M-MY7i~8_TAuo2o?k2>g%MuH3uo^3dYCR>Hx%?S9PH*=4L*A`&lJ z4&FIclc9}z%@t6^UwRG=vBw*49_5mBZm@b@FaXD=eAVcEZXf#mb!cs;lPAV&AbE|7 z*`n)!<i(%DjHcm+Dp3atliyg}A&6Znfr+}*dh(&sJ;yJT><GBsALRb^2YnG$c+eD| zPQQA5)=<2E*!2d}U^*o*=CymfKjt&n39`x=_8Qb!;59J55RiYjt$vQ%6yeW0XZM6M zm&ggbuiH+U724<15z$`jDGx`Le;v)TfDm)UzPsw-&5g>2MaVp!479)((C(l`hBN(f ztNXTAI-fFn+v-xspepDZBHC!=pyaWRKb{CRvL3b2ePw_(3qK%%mPvFdnLLbN&3wPB z4nvU31lm5Iuq`Ee{Vccm_Zy?WI5sgaIKpb7-hc0<`PSb_xu>5T8V5m<$hW-E1cx?I z&uOfQG@ovIr`&2um0j%jGn^32m)?JwfZ+mAMV*UosEf7J$#gemxBVeu`pA9*Y`r8L zXq}x7{vsbDuj2Vopu@;5Z4tswVCVeD7xgTZeCBq1!|0~$@IoL7E3a#b3G$uMrP~Co zcYhWIg+TJ$j`Jkg-jvO*I8>fBjqn4e?Y3ASVO@NR^5_fU;(y3t6c-%)BH4vI>E%jD z!yDb~D1vR_s!e4T1mV(rhOwii*BfLtEd2UiMjm}U+Ru^eGtl>)*B0ZpnF10wMN6)$ z`@1aQ^PG=aa*3u|cc0nQP6v7a#<TAZg$V1rRjJO+aGUQiuK#FR(2;L|$;=n_Bl+<a zCMXBM56MF~FOiGNH-k_AF#lzWg0u?m_+ELp-oUiK;wBsS$3t%8zS*v%pS5`VoZdl5 zkGoma9obggIyXVhN)JO@f_nu*Z6bv>X>Mt}oDwamE;{AOC|b||)gn*P%CQMR4}YL& zUg{s`%c3|RqX(r7tXWYs|Bv%2)lq)5f69RBpE6j#<=m4?I7M*!JxKXzH&1=-{dKS6 z!#o0GhxZ))t<&No2$*j9Mv^<Lj=xc%3-jh<-UFS0PbNZhw{|mC=WQ}+M_Jx7WC;sm zy!GfV92R-?d=Gkp=!M?T!xKp|l;DG`zgfGs`(~cO8_X-qSZEeNz{D;X81j7BXA>H$ ztt__X*6%A=c=T>;*oFXxO_Dq?L%IQc3|*hdu4K)MLwMjn=3lQsSf<UbnQW2bs=!@b zL15rrd=_m~<ltE(oHrEyRP*Jpp}Ai6Fobc1{$}JE-zm=HGpRp9<(RHW;TqPhQciy@ zD;j?q?NG2k$!lOJ4s~25G0bQEF5YP}&uvd}EDvoe!ikg^+6g@pN5W$>yRwoR)^opQ zrXw7;L6Z4*%E?@d;f!%+li?5(#9EAySM#mS*`mOZXH%V%yj7&Fk!DRcw}6}Ms*NO8 zDuRA!$RGpkc=!ZYAiQ@L4k?bZL|rr`iy-B8z4IXeya9<ZJ-e5oULT%C|K?V)obf*9 zT=oiTEf&rrASwvN(@O7D&Qk2U*!n^A_CY{=RVw29z);G?B3s3>lhY*2p^kqV`T#3P zNbOTy=GN(^=Ay(J5=ZRHonp&4Lwlaaazr7AHabQK@0xxcK+8B@>;+l~A#dN5^$lB` z(G8-dBC=VAh6tUSBw9uvU1;@4@Xnp@UqQ9CeZ(2|;ytf#IXO5`lj@uer6B+3)c7YF zga3)ff6DUdKV|t(G?wT5f171z7CzeiDp$uOB*i;Mc}r6}!-dlzY@FCvZk{?)lWse6 znM;i=feDRuZ~nfaBFYffwTr=iUAUzxGx-%(u$T@$XzGLC@d2j|PLsMO%85cZuAkFe zuq8!ypnNwZ0?6=^;(U}o^IcYU&vBR*GPx6tcuht%BB1fcny=#3URQmrZbECY#~<jb zmep^N>7BBVyw4on`=`l2m=cn3(TbSLDsHb(uiA5tg7$DOaF<W_2Q!l?maR*((ckS< z!27nk#}TWUyEgepPFJb2Ung_lJWYn2Nr7d%*(;G=b7EpZ#u(?%B#2Wr@OxdE+8AaR zP8#`)m>OP)_ENWv{Xl)Hb?qBFCO1I>E=$jK&TWZ7#@YzBhfoj`q(Z~XUhf$XaTiLd z><DQ-3+5yXL-?t(sy^4I+_~*Fs-aD+XqvPWPts&~C7U4AJoVS<3aSAwVB~~8lcZMV z&tYJoP`+D-zaL4ecEXE*mojxmzhZgzbwN88+-<oTG5&Y`y|~%^*&RZgd-5s+TsLG& zc^_e3zHNKD4nK!rwpzmU*OfJ^z{vWy)LZsWlT?REyi1FBE4Kq)&NYy^jlc0u0yip} zsPp(v6plWC`R8=-k8kI6F3bnrCy0OS`@7buAXlXRa?JAB=hk;#!a8!oa}q%aC{qnt zne1kO3)Hbf*Hw_Ys&}ivznix?G055i3jAB?F0x6S|52ws#CmHd5}fv<tbScN`%AWT zgSdk^)pUW%yil=9+E1XlV}@;&s&(Kx^&j{uhvzcD_JPie>A1D0|ENzV_rVWb|B{n} z2915@P$#@ePZdpUkgW^DK>bBgE2xiea9R?cXl?qnAswC=agghKnO2U?eI9j+^9VE# z(bH#LO|dhO7rHM;rjwMyBR?tn&CFrzMnt6Oqy2E=>vOT&%Hu6S|5G_({MvxB6QsZ= ztzd2Eh>daZk~#e_>+YiuMab)q*flWbpwmS{V!mftqGb={fE?e<q{}ioCdESd;v8?Z z8e~)qv})3YUK=kn&GH@tmehRiFqUx}8I*CMEjf9)1$?V#BN`Oo-)B$vwfy~=XNDW< zIpfvc_bw<_wQ^fk5;<tcCP5$LGCqb{<)K-d%J6)E(JAR%2JWI5TR#AuB!X#2CS*KG z66(Kxj{NXkE6y+#Q9@5VHy$Pl?S2hFC3>OioeyBtpB@mKQ&J+T-xB+O)|1=}`3u#f zJa+)9y~(-vK0&Cz4{p{Jj`AJ$fr?j@<$PLiusX}mLy1oAbO*x*f)6Fi)I+RF-`<NZ zd|7m~Qy2fWlh*>{53LAN*<k3Ra-HxZnnTe>4)OrUZuitPgZMLS-W0tu99+w)hG&0L zxfK9kaC^d3@S#Y~2Mwd?Q$G=0?#-bs<}mcI$(Cv2zP;e<Dzm_2HTJW)4#yiO2Rq{@ zl2LPGtyF8qkja^e2HQLq(BAK77TWZ<m@x@%w>A^A29!U7+=ho7yYz+Ig&AcyKMz0= z^1iYgO=G|IIThUl5gNHpVThUX&mGC8uA;fLX^Yv9gW7VV;N-LE%^)t-ZsGJIm!%*7 zZNQ0h{|>5&m%)f?K)pZyuCpaiyH<l#A7NjMA#W=Q9{aBD*KdSCP#o5)oaZ#ckSBnC z)d$IJ{7UVI&Xo)s`&<%FLBD6?%w_P$6?Z+JS&dT9|D&-nYiXQMJtyk^jS^bR&i#m9 z3(@bf`2>?RrFRL#%-MhW>h_l|ivD>cKTs3_&o9X*FTT`0D<Nl`#itAy{S}bCEjA$0 zKO_2QQ}QEG;ZQV71A-w4!%&UsCDQf9`jg)ks#-uYudUYKFdL!i)%r@dsSY|?!8mOu ztzwy#lAxMr!_$d$r&7#YCJA!w{UVu*%fu3EozS8;S5InqMIDl`+eU7*V9He<ksVBg z0?dsW$wRO%Zj~R?#(HRBFJhVusLZ;e+OkK6x`m~F8#lCqCX_1GPDkH~MCXfx<rNxf zaksb{176@XjOK~=IJFuP91_7xk=99##f(C~e+j)@d#skOHMX$Axw<2LkpDPVYFoS; z^wE*o!F-1&9?VJ%fG-N;rlwpTDJsC#BjyJkaF?;!UXeye+gI=r`FF0ULF`v(X~s}D zaVAx!LR0&wJ~d+ta6B&y=yT_IA%y8EC|S66rS*st%DN990SUnb-gKOK64+jH<0l1m zwk(%u%oa$g;|N%EK1a%r%k^DSx<bEKS<Aso0aD!_G2qmyI~EczS(-&Djd#e$gxxS{ zBHm+Up+PQ73rTOx!q5lLh$DFgFQe%j<LzOSAMEF})EJrs`5&3KAfcpPa__t20jCIr zmE3#j2FQ4_%k)0PBQT9Dk=2q*70V%Bc}y3fEdtzubVH<Vo;zLm5&c4GT$iF(kciB= zSrhu+Cu}X#c4Uz`G4f%k-M+06U21`x4qTP=`)dzG95+v~zT4nT=B<Z_?q?_<i8{5N zS{N25=Ec|EduQd>g-9J1CNsuMMc{bHC<Tf4M7=@1CbMP;lEVa;E5*B^8mywN(9yu% z7%yH1<Y;1fCi|atxs2JA%}B&S!famnk*aQlW9!rGuYCHO0Pc;<%5?i)g#L~?y{TVr zIt4yU%?sdjpqb)2JW2MgNhAF`JP($o%@U=ExJ~Ccv;HLq`4>H8A!D`)j7WtS(UdOV z+$<Gbv`5aROQhpQsz_{OWUNEb09vn~(-;2@W69NY6>2UnHY2EcVqnW9AIEAi)_gqm zHN~caz7)!=5CT=l$EM@BBmSX?zmh;pUuq>LF)+{ddvnnpIb+&=Kq&8}4*a@^L_B?O zHRFQTcQgoZz$MOrVb3j8Ai2K(ull9v*C#!--scaevzuN)zM7Sg3!R<HtF}IJ5!5~8 z4_LHa>~(`+?lhrR15fzs#Fq@_y_UWiKWkb=DmjKHV|TuqPk~tUvACOy9OMW?vp{sW zXIfBjGKt??GRe_s%+D>v0v@b1y6z!tfBu`7C~(oB_c6V+(k~(}s`FvNDfsY;1lQ(5 zYI1(9MEA1>M2$pqqudd-lLh3IyjvoHehhSt#)QdN_i_Xu(CpC&1&j!BQB>MmO)HP^ zU4?@M@)BVaISw`}1f6APKZssaW4c&e^94Qjq;WMjw=asKaa73Uc+DZ;-P8?A$ob;N z{z$qK`lrQ*R;^QNxOZCNL`Hxn8eS1*6JNeZ4Cr0L9(IBp&qQKg0BQ=lF8|hI{~0bM z-K7-w(Eb-CPo;VXh5P-1OBYRgo1_QD_mSTYbZP{huYV903eN%Z4bt@$;ke`NBHkhQ zB`x0vJ;nad#DO9o9raC44irVPqsRo+(LfI6LlIRm>;E(BoN>c5(ntu4sQ-sBOkP-T zd1v1_v&|I4%_*pWDNKlFZ?cMDbGqn<TOPjO<aD~|fLBdEJ5^<lXt+lm#CkrvoHz)2 zG-0f&JvWTo29@BT8*DShQ$LWUn8Ojn0^0F{OxZfGJt)j(6RTs>x)<h>T}&1fxcav5 z77&$A8XWh81)L};ad4O5{Tdf7g{IE<>*6c0=hwKo_4+r}^LBm#nSqEgE4@FPQHW^| zdymNXBg1?L2D;4poFxZ}B3b)pXAKb0tuQc&lY{n5aL%@z5tx)K8uiq~oN-)o8F=^( zcTq(wn8k_!UfRmY%I6eY1(3E-^or;8T5l`AycZU3cG$bNP@Rx0Jfi(L`|t#?Gc@WM zbr|IyW*$x#b_gcj%eYLUB=zjhaf;>fr##IOeFCuSLUN}ed+5?I+=^a>qNk#b1JNuI zwrOLsf7xOv8T(cqviil@0IM3uz;C7-5a#k<rgRh2t*Oc`#S`>mEtvtRoi1iiuGeV< zK)R6O*_wZM4@gC(LQvcz@m;D!*UU(MNoMZB1rqA9u6$#99G>G)z_J|4EGEQN76G>` za_xc&TCUyNqBi#zUT@Adw6xBoki2f}pW&ui&IVB5%cU3eq}Fe8uHPaDt_1+Kw|io{ z%Cqkr<tHl_!Wu;2gU5GOnO_iHAH?>c)-_3dnQ{^P83^e-T;kqzxLn5d@0Jcu;fEvy zx**<x2s{iTMoQLUkIbDzj>RG@?a;G@9jZm>$8KTsskQZPRIW&?cxCG?5qJh;8Tvp8 z{RSt#DUGnxD+%k;cc<{{C1DEZw;wnmXj;FP%E@lFOBefT|9&Z8p;5;|sxe#t@rQ6s z_0YKq3UN@*p-Tcw#=?WXeNZ#+7#BB4z(_3l<>6cAuY38AQe?XSpY$Q4t_dl?F!K0$ zX<aYqab<jpO|$RC8vJ+8K>7UQ8t05o-pWygaU6c-n~(jaqyj3}GM(=-|E8>w1v~ys z=NEu=k$D~#h+IL_lopyh)|nsfz0QgXmz#USZ`^)cq%+M4tJ_=uZ+dX?_L2&EiPCDG zwEur$Xb_2DlqkGwz9vA{V>NBe=RW$8rX;gEX7bKn4N`0`@zOCjKP$0ST#T}j2V%jO z?r$q6f_}gl@yfOK(P*XX5ovDo66Jv!{}8#PzHd>R=K~*zGFQY?ff6-xNY6uCj<o>S z>-HNzPQ!a`GJ~?kuQlx7^54)O?B)^4r3-s#syGb$)o$ZvCu}oG?bu#U5#mSXW9+n( z-tOf#`*P0aEE*AQ)F=7c{TxjZA3S@U|LF<7+TyWqf9lDiCDfII>DC0<BPip0l*7k7 zk;=ViQ;<8q45G^?A%c9yFY<3-B#J4Ixc2!}DWlx?1#<JVtu0q2%iMZl+?8r7TzvYS z!=%IF!NaWm=Dy$L!xseI3n3e!TCf_io83$8d+Fo~i8j#rU2}962JAvT08^KH?7L8d zIA?~sn$94-(B636Y|E*XYH-MxWN9L_;oiZc+Nb|Rx#glhXA{EiFvZxYwsquXEp@MG z$^r;^*|Lv@9JRwe=$=WAD1H3>p~hH_&D|MX##~yjXCh_GS4SO!yFk(D@)@Zpbo7^= zdP}V|*0bn27CTq^&ot3EH)J?0GsGC7x#*^v;I*2kL7Ks1M=~zB`vgntSbvF9^aJnM zR?>B*XV=7}-HV=nkI^Ck5b3<mWI~SWo;d!|ny2H36p@esr4yW!DS}95vg@z#sNIii zI-iMTe_?RPU&0<0>c*`cKTDD;-Ehy$BIxCTl2fw^+Q!$NuZzs5)y8fx-fF^Co=?7d z|AS<9v+y02q_B~UOnsy;Jnr7v@&gB%9TMq?XWY$OSRs5{v#q8Q$?ckgv0%YZE=?(2 z628D=ds3TATO||7b`JYu8<iReLQjfvgc0`}MrWlF87^F4yuVxC&mS40=TdqE~(P z{XmMiiB$}`4V(aC@NHSCumzIo;=2{F&*VYhZ+uMGAwpyC)Rl3`O~p(KOjY-mK4GF< zN{%3s{=Wio36A!65&kL8tg4|iD6Y?&5}mH0T|z^(@j9g*GXzQ3#TrWswZ<7J=q6`w zX<=|^2UaT73}C{wg;F`x)XI!Y5n`R`pj5b)8)vO`qF{ry9YD3BEP)#w4(H87Pbk3k zp;Bm$TXa)VOlT_Vdt;p)SRtJ4&b^!shf<=cX@`h2ptVa0FomI`(l}6qK%7a(`xSBJ z`&rd-_%mlTpv`eO`zmKBpbEIPk*Sq8&4AtwP-^c@b+mekg@6P~2A%b;BhIdDlZ8cH zgi1I-?>x$)ka!vX8P1j>IhozyEX7vQWxH1$0R63=mawX|Yn9TE_G8X$8=F(RH(z7o zl0th;trVNfmF+gWn8ewBeK7=t1WL*y&p12wMD1qH5fH~?k2H%1yraH1HtmT(MPANT z>J~^pU2_&KdZ}wV)@+7~8U*4@JB3yo#860`{tRbK2F9W!`!Z)b+ByXqM(<6N7S3s* z<F`2DE;*n{?*(yoWt*JTn1GK=$X4bu{4<;hAZwp1&IANaXOSu$iO#Atbp?<<;!M*) zNO%mWAi<-PA2(Uxj((;><g7Mpx%>FB#kM!D1CBkZ0?3f43V>A9qtHd_dt*(#w;Qrl z+Gwn?oUS?R6XfZ2#)&}?HF(BZI-l}51VbA(@F~tZwX6F&XHy&z&W?E*3u)nagR}4! zt+nwSOPpQXSQW!;Ec(#MhVym!XE+=0bLKdGuyk;jQw+m_D*Od!<Y{YlY9$pG7GtSH zVNGML*0a{y+9pwR%^9^pn+%e4<Lkg#>N{0q3-yP(RjsDJ=4|w9?8$;U=74q{PCy^V zfwQHcp)y{4evUIXsHA~?owIQ}$P$P%T6m8$lD^AXO8q_JfwNoT>CjXUaK;^R(^`2p ztj&MR+2luB9b2J3j9wf$>zuPmYZJ$|YtD{6>71s6e$5&6op98|S?Cruea+eA_nxQ_ zuUxziNDUr1o40-F!X|n*!)G~TQU%Gs_1UY#*=>jAw9vxaoFyaMq`RCk?fueM30CF( z67!GC@KA6a(5d^2oNW;UN~(?n4Qo{4%bZb-ut932wK~Sq;FiX-@P^Pb^$pGrJqZCP zn#tgbv($I0b{t<vKLMRfZ;WRG4k`zOQ)=+Q*>pBqmn+&Jht>{%<g8Ia&0la9bEOfz z<8%&F;gt}$=B%|T7w*K^+~uq`-tj#@6BrBJU4^$c&8bwzOOdZ~<`r2uZko6BERJxL zX7RE55@+N?D!opvP`*6+wWLDe?6jB$f*75Hpd5O3#@Vqar<la0r2d*S>U(4NU7@)) z;@m>y?|j8s=Vs~%z=?uGg9pyIo2gUfV!yyy(bHM;tDN~&NOulPyhhaB7zkjuIAeiM z-U#Qhzsp&*dYo7}W8f^%=9b0zt8kb-ty1tYXEfaj%pnp$CSbWUH9#jDpzn+6yL89X zjEPsA#eln<u{nB<4i+`F(wOZIL#S1+u1lQ3gpxr#|1jv?TJ4F?&QmYTV^0L?B37E= znltKqW4&VWDpvq`(=QmixZrSuvvNt4D>ufg<^&`)c(#kFnbta5@u%}9sp1v;E6!F- zcRztRV-xx))50yzLh6;Ii@ThG^85X?ako%5>t%S#%aWGrkDQe&E~)|;(du|xVR2GO zhvRntjJ|-@rcTk$DKXhl;mBDExXT$dt9RDnWOZsqhE`;Zo$b6AWIE5`I*Hji4uMZQ zi5a*1Bu4Yyt(kg~0))_^(luw)_r@Bt3bEo^(We01x;gnfUvn1M>ODevBZPD~P=mCK zp&~9qIh1hV>}P$Dh4bF@gi_FuZr@jMn=`1=tb-GS`<%t0%njR>Mmt-p>g#X-Cae!7 z!QhXaL1)sXtaR!7fL@{ZcKfnU9=>!+>P={SgiFp+z<ti36vnQ7o7V8yirD%SJ}@`2 zoijKo=fe;Ukb35E4VcAGKqj~5V^2<@*SIurgEQ)TV>P$iH#Ni=v|(6qvVd#O(%RiL zx|Fd~J){PYoI$%FedNEz+09w&%a4DL1pl>nH@a!VPymH<ojBJaGazr8_tWkDA9KY4 zi<AOYxwIlX9};Sd3P?G+I3h}%s+TJoRd@Pw_1|YN*2x=rFFUQa(`N3pmq|DO(rMzv zYcH?s<f^)F=(T@&uvYD?{GmRXJNmg%C*r!(chaghmyZJ|@jKP#l`Z3>y0G0^RbQX* zM5FyjpV$5VR==Kp57WXgikZ5ZtA2J&&@IBItyjIce8hyQ`rb=trcZckd7X7X|L!j# z`_tdEvvxm9yt-T8@SpENn)TDAZ8U7lHDir=b+(;(b^l9eqPz9LVNGJ+nZ5qU^=ou* z>%+zjIx}F{Sv}tW{=)j}*QjEu)ApWk_}g}DFTZ>v_v6&dn><2i0G;7FI>U0%8R!fP zM`xfjECro`&af1820Fu1&>83qOF?I#Gb{z2fzI$z#+33cQX1(DR}3k|;N<;Wh$#(p zhD*jA<#sWTbcXYWJc@-?9_S2br6@LHqBEQ`Cb5!6I)n8%I~5b1;fxf-N}w~Glbu*` zna*%V7CUqXI>Q-shQ**W&>5D3&hSZ{ISqU2<e=aE5>npK8EiTWxl%buIR}Y3CoiHw z=?u4arnw69&ia(2h)+3rI>YVr?6jkF7;bb1qj@&(tc@v+uFNxy>rqzgobx&=oxyOP zg_NJAGS9}GlWcP_(i!aLnNL$?&%)GMoc=P<8I1NfH&S*ndy#cM%rn+!u-@O?mi2$! zkF`K&FrH_rh$5x0XNh@+`>oGvXUsF0&$D@FE9M#QJ<m2dZ%TX2GuW@s)<x`Om2-}6 zNb~*8{6*;umfvq~b8)mjlT;p}GZ-GP;Wqi%m!tKWbcyc+V1AsVQ*|=esONJN98Zh4 zqcbc9oq^7<6m$kU!&1;0q~g3(cx;?!4@Wp}C>|Q;L54ikK;yjb_<-wFj9jMzTz3a= z#dXB+;J7X#mVnMcXIKh4!)J8n1Tg1bcGd}Cu6fy6FMzpz-kDcz1Tfa<)Y+u-zE}1H zU{1B~{b8I<odrUJF%8=Lsk6F3)4;v}EOi>{$7bzp7g|u?3Sgl18g`kz=**YS!Vm_) zLI|ZZzwfLLv>F<%;U*=a5N6}7c2+{uaAe?)yZ77;q0o|9>8$F?L@T8M21;c$v*XT6 nXhq=0?VUFbx>GZ2rq2EW|DG|=QfBJ#00000NkvXXu0mjfCp3G5 diff --git a/site/content/images/graph-visualizer-queries.png b/site/content/images/graph-visualizer-queries.png index dbee79d2ecd8da731eb12663b45dbdfef149f57f..7e4057d5da05eaef98fa9efb6314c6bf07de96be 100644 GIT binary patch literal 16054 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 literal 17781 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 LNkvXXu0mjf0AvV@ diff --git a/site/content/images/graph-visualizer.png b/site/content/images/graph-visualizer.png index 52e3e30eaf611cd2e1ea915894df9463ef3ffae7..4bdee4f799614ba5853deba888091321c2b1d40e 100644 GIT binary patch literal 158120 zcmZtt1yoeu_Xdn3f+B)aLnxv&4Bg#5^vr;iNQWRLDM(0n&Cm@4T)HF_q@;!}5fJGT z1nGwV;OF~$*MF_|9oCvP_nfo$ea>_CId^aF-r-srN`&}N@UgJ42vwBjp;%aW02UT5 zfOi+u68o3_1`F$szm^(Y0dskCbF+7SbB_63{ysZ9J2^c$K0ZFge9p%9_V<5W-u(Uh zcVlmN`Lcd%YkPL*dVYKJ$5rC$>gvkM%HrbE{Oa)J+H&)so6A{L|Fy%<xnC12b$tsz z+ix_de$0$ces8)F?pcW+8XoyF^`m`qxcX3Fq;sZW)x2&P-QC@rI)1v{;!(89U)<Z> z^0h6er?#zfFte?_?o)m0IA>XTW%TFf=w?(+MrT1`@l>wBhnhO8+V!wb)~xJY@0z66 z1oM>CbW~K69Z>cL2#<+N^e$mE$jvv%`H<{U6&xA?NlE+a{_um}$G6EZASuoSIp1~t zD#c?H-nn^&nHK8$dy2<dafU_O+Bs(Hi*be<8u(Jv1_T+KTDz;Hfn1uN2WXMM_ti5n z($LBxaPuO5uK=+mSJgJW>*T7Tp+V>%VaXkh^-e@eQA<HVUQCMw%bJf^1tB3J!7Zw& z^YkMxFJIh)J1jy3FKO_xq+clGdonXKQ`1m9c%+Pl8%RX-u>WP2Bo?;yvWmP6+;e98 zN44rxZLFR>@k$P!uOtt3$wWm3K8|!g(v=l$#G(GCa6j4ba}Y_qbSK+sWkY+=6HpUF zGD+`x=bmtk;d7s}NxiRFSOZFmEFdf`Fa-C%F9bg37a{_B2MhJ__A3vL_3uj>$bn-? z1OLYUe+uZ!=(iA;P83_;xfKUwbz>*T!B{LH6f~HfGZcOYBZ~~S<bi;&6fyn!GDnT< zM_5>V$><NQCof;WV=squ4tLxfInWPqMUEC@xBW(-tAuLSfc-BU^#|@>yan`R0i!}! zYIL9b!KIBDf-HTIy?KFQ?o$WbFTwQay|euSGx!}7O9*N{o$~v4o%oxBmg2!ewc^W5 zYP9D#RYCl0i%aY4*vOT$6W1rk&M9MmzMuM35NFSvH6BRn<}E_8xnaQ1$KEY&nn)SR zatXsyI3;+>cDv$}GGGxJ_~rX0iX?mECz*ot!JkeeOBX$|^3yQY2W|9>6v*(!Cy&8B z`POEIaDW}&p#s_LNp9w&EC(MXq2+Z@HPfs#MgvF;$^Hrulo0B*q1;@kTIvw8)W8cF zjJ~c!a0+&F713_5pB-BjeW8#&2E2XU<AR9<WA_8Ayxp(e?4V%3A409kLAfk34YciJ zdL+Rgx#+W9pD>Ug-enq#v=5N4k_dA`g)%5T30$~$wUxO$M_sR_>T}>jv-51d=fky= z_}UB&q<EvOq$?*;_S1KfqtY>#VLPapsaEAz6ELD_<Yj6EebBr(AdWveXTcS$9&Ab( zGW`?&)j0fqf6bHS%uFEcJJ-xjdWpRPyv<E?xk@5dtqZxo7HEXChRx(gm<<z4AThNB zt0T91{!A1&?S*fHYQ_`T!nLzRsl)vf(;`TL(ByQ;G(|qioMMi{_;FWTsoBJmho;2h zYZ`Li(HhNQkfv5eFCQqxl+ucEOTqGIm2?@{@k?|5Smd#!+-Mr<&J~hS!SafxOm$F; zgg%Ea%7lU&dE&Z7&Pg(KVlW~(!B@zexPW_KHjb2ARgLijTO~)_9A6WMzq$QnS`1d8 z=)fu~5%#ni*&Fj=KW;M^W{Re|)yMOF!@3=FF+*_CR9Z+0IFlm<UtZzYly444m$I7W zJkEWzkVUJ_@8c*koEVZx=kAV##;}ZU)wEV%ZL30Al#<9%gab}-JC(<BO?)m}!u)oI zOyrC-nLpoqo0oNTWFD430!Pw0a@krMXH8gJ@K}3|YY;NZo4Kf75|!Mo%hRtyeYLfu z&*thp<4&Hbt+l9C_%@#~#S-@MS!0)O8Q(l2!^vRCj4fid2`5#r__cJ!c-|lOZ-Mrz zU&F(MP7Ku)l%PS?k2I238yRwy_g4Ue*5XD_wXPrcDeogi+IYw-dI{9Tlv9iXOSlu4 z+N}u}Q}C@!dpZ@)2>xWn0VdtecFBOh0}FR_03?98Y)wK>hTx0L`X9l9OqSy?gK~!{ zn?b^K{7!CyW%Jl#AFAtB!%27@cScQ#JikUMYaWlkFOtgd2d_qwt0qaAf|bgMO` zJS>19^Ov(4?p`{6Q@DV(>aV3zAP&e0!*UhdH8s%5mljrqqYFE@2|Bmixxm?>zOV-h zGCm!QATw1dmP%`IMM<+*-NpE~8O6Oj(^Dd;5PkJK`#*V*p^@~dXhP#Y75K;EF%^UH zx7y;<1i2~yC;{xiPnuV*Mha)H!f|s0Ng1bkkt7nIuIMjIYJ6B91#AcIkOw;=?j0QI z^oQN|Qo2e*zbOUSpL|h6Ic8tU5O0z>mli^!AGK+V{=B+1kl*PM^x(F~Q}8;hf~3Ds zadqm3Y6c9fL|>FVzQ;*)AnwC&<q8(T7mNzm=YRo~;K5q65#-k**+Q4&hasweu~i|d zfs#wr0RKhuh1x3aA0}AeURPDxZbtEknAP~wgApH1lz_l59(B?$g=6md!C9_F_F#fe zZZ&mS6SMYS3WOa?J(+|ffFL1PI*(4TtRRY484HYuz~N@ZrCav@VV^{c!$^dCY{#7& zBU<>etUN@^O^cB{OEKm2b%_}h+{Nt+zd6_fya5vN>~U2utT`9{YA83rgM7ewS@<#B zC+5rM_VDi~FH1)Q=8L=H$xsVl%_reAAB04e#|{Ox|HC2yJB!X+`b#>3Ou#onUEOaX zYlDX7y~t~Irc1yM>(9xQZRN2Td*tvd&)k%D^7--5k56x3;4go+;gOX=Fa_ti|22vT ziPIRAVX?qtsf{2eBb+n%D9cTI|7@yM>`<S}<5MQN3eEo2i?|c^hg{uKU%fpd))wpo z1p}MIGH?;HaGwd!60^5Bp{O=Ex0&}ztq|xUcGl~10Pd89=7c#1qdo$cHM$nB;|o4s z>opVtt<<winFmRZj?h$q!MK4m<ueRfn^q``M{6NuIOSWBlr;IK#rOft>#tvWIhPGp zNnJ&$f4w3pHf$6UxBT_a6ElWUzEu3i<_5xi1vU}{5t2wCucY~Ar(k6(o}_ST3Gqd< z-u2hsC=)od7$+5d^;Hd3YV?F}0Pt}-(l!AnFbrzU7rYP?5z$DjNdJ*cuJXezqq!@6 zJnA2YhqH9Z=lwAcm%)4~Xc&K0e5CHRVncui8BzRCAyAy^iOne4)RywkLh06w&7Tbi z*SpY{gloE0=kzQMzH|Z+CH}(wB&((kcUd1c(+`?~5@>*{g%)EDm9b6bQxroGQOy+G zVQyxa5RzQt69NQL$;N0Yq(QXn9nL?IMG6#hV#8QxD;y8Iy;mk8SS99Jqnp(wdgT9* z4|Rsm)LdqV8x*6Pp4?4A*RhXn>apC?mJKwL&U4b42o{nMu5`Xv=OBsECCC(RKFvQ= zL$wZ(ebAQEKbKU)rRbj}8(rZaA$d{yCa6V93rQ?*DG3W7-wXrMVsQ1qvwk8XY!;fN z8f@A$3O-TVg6k>Y0AvO!5l*q6EBQayROTC4v2dsRB(0Nv?B6N@O6(By8JB|CeChal z+)#`T7iCye*Gw!olFb&Zx3@VOs8sjsvsyGs-55L~=g-d8F85f<%rh2Ke$qfZR6r8t z_zS&o<FGU&yO=JFl<%JgX_!}4q?A<=Knc>qgH4-~DW*Z5)m@bp%%hAJDzfejx@P#2 zs;DiewLZ22hcXuy6UpM;2^B&f)tDdIC)ViFDy9TyBMBxh)D=EuZEk3J64jLDKWML5 z>B))Al&TzpOE)X`Sj%W*(C+6=J|BiV{PmaJ1koy(fE#%!+-TLi<QKH--|?)OjkY&N zwimrFx5m>cX?^?Pv)`ve?3XHIJSrQkK}53Gj4<MRRdr!q&rjuf;yT3)<Qb*)HKK_? zwqTh;vx(=&J9=GjDIc|+&Le(3L};X4V##!>KV#T%qI$Hln)H#FOim1uFA(AshJX3{ zlS}d5bV~ts^c?-X;{&FcUZTIDafp?c$OIv-$J?flwP=`Le>W7VwMqi>1ViZkqO++m z9{;g8k~tkw+N{PX&Zo_r21!kh;3Bd7Kp|EXxg-yS-E_)0>+W-N5-$H)R5LWMzrqI0 z()W%QbTMus)^{)nmXvNlGikZ+#ey_v?paqsssJnLwWKKC*4L{zX^+SMv;sV{=ebfh zx!~h*PDs?3HBs9jjO%Gq4t+4oTLdXXcOuZ+FRspHr@a9Amul4dMG2ldmxb@z2ST)2 z;WPvJ^~vwfZ7Z`+8%Z&~tN#&X)iBi_Y>sXj^g%`>T8IL?Y)FRR+OK~szXPkd8vJqm z{_0n>xH`?M#Ymcx%n-ZavWBhvKd@||2RdHdbEotgc5f{^Hf0bS_cGNy9X~+@TSl8? ze4h;hE5mLz6z0s~H22ljIt!ee8D4L_3D@eYcCo80Z+YuZhrk3;{c+ZH%kb#}txZd+ z;F?T}QSxwcHh4F@hW!@aCsmZA9gOMhx!*bC^DVUKyxXs)X4m7enM;g=jn$X}?UOZh zR5vIcE7a0IsIFK|(K@<SO7Rjr*6`;l`GVoFhFV9BMT8R%g^kswfP|3C&W5~*j4-C4 zNB2FDxNXEmqR*E+{5(7k7T3BjSc<g4SQzL2R(%fqcAnCJ*1s0YW=w#`C8x-~K!}Cq zNyU5X@cTn^G2^gMvX}@^8u0&rT5{mh|5|P({~PnKrOj`h!<ZHl487z3un)mzbY-^d z>-98rQ8=nUBEjIhCU0*9z5`TWS(=R71uCt=kRO*oZ%Kcb8MHe1I@5jJ-EJhU)mM_^ z2YO5L%6%}2C59ELvd4)fw~UM5=msGJax8RSy-YP|WZ5s51=PYM?+ju`jkAK;p-mc$ zZ#F;c=E9jeA>qWtY%ky)+D++@a(W#WBycEM%6>EOG}cN56!a7vj<2?sQTiple`2Xi z64Nb$gk&)2k|o(E1w!l-gWxhLxi#7W8en5olH>9)H^lPEhv5>$)VZbV()1iBR1!<p zf9VAV@f70Zi^12eFB}j{k`HH^KouaKQi*hxD|s=XqM-DKJzkLa{--bcN`Snm3JWs) zFesuB{sSKJ1I`b8e8G&2rrE{SvC4CKo)1CkN;_T_V<xnCtpTut1TpT+2VjF?aSM&- z1RZ@t9Y3JBBWdvl_i|GKP|Ih&Aw+c)?r+SlW<6=ig%d3mm|;HzRl3-v!6*J4=E0eq zq;77Nm<odO1)kr$XydxJ(as;?rJp@AIvXUtSrkC=hG$(;K!VjR!_*Zhb%@etQ=j}S zSX!Mb-K-3hYGDCEaP8(XrV+$UQwy&fh%<f(d_$nAA&j}03EcY$KRtfTf^4TurIiCr zQlQlc{B$%?dISniWCSoQBO?Y93_`asPzO-(I`Z4Q#Hn}T`#~dfd@_LFeCFl4Qq13( zu25zkned%6H}MAK;j{xQ(y`1&9T>=io83x`s4Fz);j@4y>)xV#)oyHOn_J;E?`FN& zR@3L~F5V9mD7_a&eRa)B(gtg;S|jjL*n-IC_Fx1)3vv|FWw8#^PvRPEdJ8>6uUIp; z41B@}*G55YTRrpP*sLHq%vuqA0w^K4i^zynE12!KS(;gcYgpa=&4w~4>uh1O=qF=A zJ<Nb$X!~y=3>^q`CN#Vzu+)85YU;@NPh{T3tMyObDwDw+5iRc}8)ezJSbv&&upw=3 zsORS4Pd4pe-|Tet|6V)!E~Pc`r<#5HDEC~S(>`m~Z#%6za+aH{+iL^QmfJH<?jaSl zH;J5|l902@iHu`W+}8O%*G%)Nw1U=Y<Mp3%8i$;?doK5z9yW9JCrYv&#AXjz{}xDu z*c##28_#0{KfIpAnQ!KuMm&!z*@{DtH-s$HaDAS*CW8_~iHqno6zIG-pwltEdu()L zw6SwP(|e;~^7sBe!cxqvRBL{o0)HfZ@w%v^`f_hO=|)VTsc*b4wPB%uI{z|U(>qJx zrLCW80ZEn&m^_zm-)T}ud3EZ3+QH5RaINGi?zXujqpYB;kP#sa3SU7gqn-o^Gq$lA z9QLY&U%bkA+EYM6iY2KVw9M1#DBU8u4v+Y-%@@H?6gihNuy>^NSa?JBr0OOPZCNSR z-PE~f?Jx`oD<U6Me0~J5jPpl-s8s$SGU|sKmIcd#m*C$3Wd_FxxM+@{7S9W+8B2NX z-!#&yk+fVk5_ArISWf*NcM}VrD1S0=Hz^vUOFhuA<imZXSLgMsEB8_ry!w^ZtH0GB zjvr~hO(=}yD|P`vQ*)O$N#`W+06ZWJh9N7y*$c|b{7s;m-`VwX5NH&<;``JqUdWDj zp^J&`L%}0^?UHbn;3U<&cN)PesBOPm58ukSZ2Hv0^3`R<*tiyRvpM%4)K$R=@pK8w z(3TrjDY&&C-Mc=XFA$zuPCcH|qM!&AO82|^OsW9S^6X_v5dMxG(UXC1Shl<;`| zY*7X4&$)GDb-tiz1{@C0t#r(ehyXLwfhLx{UBn#I9_NqBGlE9Nd=ZH+j0`Ey-T2e` z7iMRO)@-4pV_6Z$@VdIJXn3Cf+r)`9PIAV><bG%WM5>rD6C2v80Xn^1Q}3*+_=2VA zLdG||s=5VBmVs}04XG8tBsv?Vvqg04M|)L#5>$Z6L3F_2#nWQnqdj6_T-<)y*YjxO zjKhA*XTN-HO>pi;tz6pSIX$_zt_BWS$NjqN%75QRQ^6Z-U@)u*mhIfR2PlIK3p#Y5 z(|>>hxBlnDOwrxd3?N-8AJN~Mu?(Ped@ZlcEJzb2Z3SYu{=73Hvw-f9<|<J$c?BHd z;53V#&wGmZJL=-IP?RrI9CqThj~6I7+5bhOlYE6K`sgH*iO-AqW2NJ7TdkGO>4XT1 zZtbfgT^n1Hk^eY|VFDQqr}nn{)|Q#Wxw8g{G_>%6lu2xLEbqFaqOsQ_X_DO%tCFCB z6b73nY8CKC$;gz)anUn)3^Pbkx%xifL)S1Ov$J+&Fv3+u&hXNY=9erU<-4nA@1nja zNt122v^Jl6jt+cNVBm3OE|lR(aZf53dk_bGqW9ovDGsv=MR_PUaiC2kOJ5CduV#RG z8avSQ-m>o?x32_=6;K+7k2Tm!>(46<RwUawh9_(aJ7t(XaZG?b@}%{cSdvWowebR4 z&HCZf381Xy#R)Zyd$lbGZX<o%b%{MkgtsDz4D}mK-uxSZMMn|!l{~@KqWvaj^mTyv zO44I%6|nA4qKK^{S$kXZ|MBsN38{VO$)QQ-HiKK@gUblF9)S|XD#7qIWtSOG%uoBz zDUA5Qi@qpc!B^XE*$~0ZQL6{N<$m&sxeW|Rf?a**eq4s6Na{ZnD&W1k66TEd58%_s z(1c|bg^y@g7A;F=;Af@S^VeJ;XuP*R4uJR9lPi?xME9J%fAO))2DJ+6t}BTv9{P^% zo&drB3?(!HAHS-TCgOO6i6K+Q?x(%{Ubk5RHyQL!NPFGh;~iKk!cruS!%F0vLp3Ge zjFLTZ0ZEMY-L%KdVf@qfJm4PlO<<xjaxv#bi5WDOT&a{8frE^ED2<fR^?M=~e6_jG zN&B>5Kf3jyeW0|c8WeA3F`NH04<1gHX4h%BFL8m(vs{OvMEFPH7$YjTW>Fs!oha_X zns1DueO`H0i58p2t`<1)M;48acm4n=h30me3aVQt%pkKGs=9NgD9<hnUZ-!r;{^QU zSp~u%;BWq{`8JKsnvAo1uh5ABT%te7I@HRpP4KHmSW*#0BdngnC<YMolhz2aH>77R zQlu*2qMKjOL2#UsZ934mM_#TyP9RN%j76RdRU}+;5wW&0jErpmy-noF1#LJupa(I> zm?f71Cx_>nZNlK%UfKvxMFX;TM1K;VqYDNcA9`%XQPry(R~WDpa;c1u%uHeD>QJT5 zz(&X38$)fAmqq_v=n+hPQb~{c<U5<-=9}|kL!{)g?e#<P`<7y|Ex*|Gt~URia;}ai zLIQF=7W4j82S2VVyj$c}Ar<om9d`jw<9AUAeHUNh3HCJDaOak>Cq_!P2G+_|eK}rM zwz>55Eg<Q3&T)19O_N>6x{`4(CY`%2!kQiwyZ3GHUDnqZP-n__#_>fYWS|Ix3lVUj z=;SuW6jZlx3ToiOSur1EeVWJqV2N-+S3GoMD<U&6=iim%<PQa~XV7}25jIpAx0{<} z^S2~Y$us_5<jCEOXCD{&zUF_A$p1kXk-@A6;#*fqj5|o7&Z$DeNwTPda5B<Xlzu}- zv^wWRO+v2nR4m7bl}k{KwaGdOI+n!}Add3H1c(P-VH=K6xeZjLNy9T;GL6+E7F&JA z%K{I{!ESbBP1P}-9oldd*|<Xf)jD-()kj<%=lr7Q>?}TlxmteOY}Qsl%EhoFc%$}N zq%u_u$#gxf%eH`KmrIp53g@iH`e^|jpXFPa0o|Ko4O>64Ke*ES93@$how_93Km6OD zOfE?4*ZQn!c7Y&E9Ub<;Hoe>n(HDic=eP#OsLIKU(Tt(J?#4Ox>fqUe{UfgAmG_)6 zU^$<=QW!&N#dR;8*xZ*y-UzMx{36Apk$RnA=ugqxMlT&pV!Jb+vCO(^+z-_x>LH&_ z8g}_Kt4z6`(S>c{V$Aj!ClM!#?{!~*u}~<Bb^|c-h=(@|Xbd{=oayRSqwTdvUna$| zbjjU$n(8Swi@TD;{2bNH8tP0WfaHbN)P@E;yyGjo!jWuNjnc=7s6x>1Pgv8mYNBQ< zOFD$q$Cq?;?pZNI#@qPCjMKWwU3;R&+sam%+%!A*NcrA~JXqEr#xYIr(tPW-_kHHy zbm7oxn8WwoB2E#tqyubATWGxO#)kVBmti*71<Sgj)%^th&hz{Jp~Uh5&Tivz=%d$D zJH;&&4Kwdo$Sb4hCBj}17s?5+_+rfPTYMN>FW#O7X#;Q+SYN9ne-HUiP}Djdy35 zDnGRW-AAy266vqWU~}94T!!2;@+wd<HSYE|GZ_uxD^Ac}a|~wD&u}J}-dJn)g3H%i z^~#Vh^%MsdWU*AYL-=%KnL`W|AsV4WG=csuiv+8snj1W85v@h?eXuOAx}v3I9i&-5 z+X#H|Z-kxf-TTidv|4Q+?UyX^=2M}|b-v&Y2v&FS1vf{$!I-})BNEo@WSm2w4#o#^ zGP3<ebc=i(ZU`^n-&C^1>NMZHN_NBrd|u!D${u$7UGIGV0=|-rWhzk?Vtx?$jsdCn z4U#QqfN;txXY7%t*gyq^@c;oLWT`>c&py(wokoS0{z9z3vdrf&&p482u=6JD3R2hR zrW!4r#t-fY2@%yl2<*tud2}FXwO}$suqN0nv`0?+<A=6gv87fGU%)0&%IWFPj$xHA zOQhH_FXEe`ydYWo1NkQagO1L7rh0vKhNlH%Y`+&tw7RgN0pt`^+N>ci;{-W#m9HcI zWOC}^YvE#74#led0c>nD)8Jt!4rF2?di4C*i(CJp-!lophKb{z5u1ycm7beJHVb0n zXvKpgaTceLf~6j9X+g4%-<s)W-6Hw%;W9$j#^aIpCa0N`yQg?mSnsfT_};!>t=tg^ z*sVE}-piK4ooYAMRUzV^&{8JvnZL%v$&>ypKyR`!@d8q&!64FoED8D)rPY=;q>&^y zne|CjXC+c|ZAIFc2m18-ip2}f7kdncGLVo37s`UMxPA)G$>=cJRFYM%3sAYwDSat? z4Y%}HuootS2fcl&S1b)8m1YzWyFFn=MF7efsE7z)(}D-JmD>dt+$H)bvw=#OV!D z+?TI@U7&&l(}Jvx@NWc1I58?7KMOw=(3N^dojuKk8s(7;$>Fv=K@(6$B@e0NFSLI= zu9Zs1&<{f*g$h2}E|Ja<_G{CW-U6H}qWg=pNjpsksw{)FK5#jNV=D&{gyA>j#*rzb zqCO{x3EsHklz4)OG?i}Mu_DX^%SLOoz@@NYEWCk$>_+H#$hgamGOUBroRKmRzmkoD zq!^YjTdZZCVwN6UKDKg|y<)WzzD=Nl7xc6~Wn4JoC=q@p{I1)1r_`(XJA;2&WH|B5 z(c$-wat2s}&|J1~#Y=#Rl9uPe+xyRazKB`x^KfBheUDe*tEQdL*p9=i2jsre$wnwV zSbEaXXZmLM@Ve@)@}bpaJI-YR8^G}CB81rIPE*#Px%Jm|z{FNjY9CIZ>!!8NM+T)r z(n0su-?N$izzvO*Ap5&O2WO3eP(>Eek$lL2ryZXbL8RW&7toy(0Q`JHItJGIYQc8O z8w#Gq9njFBRh_SUaB<ITanKIn+53dz!YZV9CgR2NMcqS=6}hh>Gqm#f{24#+kvU-2 zUsiCT+|4g<e*mt`qbC&wHG`=<MBB9cUfTmFF5n8+%P2`7R%x2W0+&fmKStz^HzN|P zm3bur+ds|%WQ%J=!An4xd<I;y2YmIHd4j$O6HiFWf^nF}VXljL=aIp}ap(0^ycS{; z8R-732*|?s-tr?N_sg0fZDQnzC^&OFgv$%u-}X}8iJeHWF=%3c0H)tq1eNl0|J-8K zR3xjNCD=Z&R?Rnm2<LadM1+O+aK4}ep(_V)m|4~U;pSF8g}T>7c1s^%3bZANKV2~5 za7v(ez7QV>yXFG;XPTasxYpLj?$?bj1w%^(ilF9nh~f_kFw-o2OU<GgEQ|UCqL$;z zb$CgUOCl_lJPVeaZX_Cr>7Ea%du=@H@hIFIe7M)c`22^s`&zmP2pRtZk~nN||Kr%k zyGun9nJ8xnP)Wq32qsm~TU$_i-+^DDB2VK{3pRGUrRFw(%Zp9GuMVeb@Pqo2!S-<I zCnliJ2;X`)Q-!G?7r0ooNS#Q4W-{xG+|r(WeEs`sF$;b0>-js}<mtMNw^6Q$IS<yY z&=#qC?k!Rwp6XmbVfuY6<w$11*vzw}qA^<w1nH%*L~IZ$i}#Ys$!R}dEOR(M9!<<? zV&3f}o79(VyJj<jXxakGikFZinhFdgxAF0ZG<cf3>myUktUa?=9QS!Pab=YT(GK3a z5fPN30(Oa2Lr;Of>wuHys+A(eF)A+UwCnEa+o9%5^W7*fYJnx;5<>lj#&{+YEqTu7 z1Xw0rlQd@-9UJFQJs0O14VQ?w&0Xl|FQwGBt?$J<%S>-R4%XOF`}jV#ptQoG`1Pge zd1n+cp?29;5#2r6c<WOKaip+N9yg~!;dt_#kCNk4O~$O5G$-D~)CfC+iAeXQtmpmk zkFHJb0|Q%P6~YaLdF1sb$FYSZda!ENC`<CBi-(g4;M9r{b_erL1SA{_DC;ymr5ae* zN;P6E&we-^b12Hut@mzu*a~KM=emIM<EL$HL#-HXHa?KZlRtH$W?PvODZ?(_>`oNJ z1L1jk$v~L1MHf}Y*atRPZ*1^b_9G5)XR64?`sCCrd(lD5!lkjIb!!VG23h$YqjtT4 zp{~a;jIFZUA!^3P%x+)#7`FF8;M2N=qT`bOsM?u&YQ(EvI2JcZ4R^=_Jf?F`A%i#S zRW~%dWQ9*o^8MaN4RYjey+t)Qa{YmW__U_N(BDMXSI^4*EHs~z4{Q9alUVM}V2N<M zf`4n4+9!Cq`E@cntMP#s*faFFi6mJhZ?1hG?PWBpxvDsOs!~UKVy~|Lb8$=WexFN= zTA2XLt9U$^b$z{)A-~6J8(ie^10%kd`VDaamI*ioKVu5Mk|S%%Xs+_afY42kRSDVd zcPU&B|CGuvTxOShZ-x{`+i%8Kp?*4pOE(H7I&;iWogTkCD*a+6oUN{?o-}+957aY5 zW`Xa*W=8Z<yF>{Up@xeEYlm|qf2BrzLxC^fdqd2BE(W3Ko;tkjezBTc6F))G^uOC5 zcEgQII))pvPd}FUoE8nigV6s6tP`%R<2$0(waW=>TAh22rG^U&_>~f&szWAa!i!wz z!{!D3Ys*TBfPrK|yqLfL8}kju)B2hhbpF37&cca^c#+4c5a~i}f4~In4@h(If!4uM zMgMpCoEI6QyqfeMa4c8=jTJab`{Dn_R`P<Ha4f)BDd@>`^tI)l?Ga=2VmUz#VWDi{ zm_p&w3<fcO3jWQVSE9Ru$lZLOmSCY;eal2<wO}<=tuHtLV1V6u0i%U^t=ZPKNgD7D z@_=}eFl#W>@ISLanecRp8}R)y!@Qk*WdW8sQ~3`kuE$B3k{vnhR!_bfW1|}dM$xT} zcS?D9DtYg;n%oMsT$tMj`(ohX7rO8xiGPh|T@YiCx$LWTfgzK||Fb;Ig5<nBxK0t^ zM$7)E9Wx%gr60Zx-7NjT7PQ!pTb0iaVLUQuXTtvzrNt0$0Y;VKxYPc3|9?x-a`Emd zwa_gu_=O)atd8WXbs0e1v_QYEZb2gLgph+NzW<sf&UldSa)sD`(*V!V{15c_64!g* z;G*0}PF^Gth8Wv;Kv={%7h(zY!)4WQxk1aUCD{w$6f|yX#FB^C=xKCn#0Am5_IH(G z7LOI@>PE>=6?)zx(EwJV*<ZMyj1D()+<86#Xlw;voZer!%i#RXK%pB>1Zs4F?IC1! zxG{Vy3f{a0%b0>yM6raaY@sO-f1qtL9a4O*7KStdxA>gXt9JpAgu)GcAH<<_0(m@! zo|K4iI37m%pDE}1>1#jn%cUz{pwPwVGG9F?o58las-|A=&st-Oi<!JaX_y1Xuu_zR zwQyn6*JtBJtqrgC8};npVB)&j`OEj!S8)4cGaZGVL)`#at{W}*4(9!qBRKxI5V3*F zBbe9aOf?`b>2uw*cJFa^i`1j^xlYII>(2$g;Qe9rW4Yza8Ip8??`36`6=qxRuSW9_ z_?;u`i;s<3fa0A#_gSt%CXz~bw(_(l5$5GN_a8=LKel;!ksf3AU<%BU5&{;~2}g`! zG0OtIOkjBo(qg8ic4;<MUP_kmVz20S_f~kwqD4aLaUS>e*I}tQ;4H}{q;ouLo$T|k zC37m>(|XVA^SI}C$1v~kk`B5)n}JKud~|eu(}$C1?|n@r9VE?Y@~)zPczlTLg>OGw zw=)IrhwNit34uz%@eyQg55h8vZ+Bj^8TjDJx8mAz%Ex%(UY_t!zaG5<B#1#lB~mu% z<2@HV8hZsgRn7nrcH^2*qov%HC7Hj6*JneOZ?{K2hv7#KB)1I+Ij)Hji~D#+jgX(@ z8cP_C20kKw+CkEU9vM{+SNCKD8ol8&4XqCSg9<YXrUT;>Q%yNkez9Ho@#q6AEM;~T z1^o?+np2mhkQb?Dxb%xlO+WN*>ShSPu*P#S23f#N%-RRqW)G)+l8kQ;&kmI`BptUk zj$-e4XrjLVL>1&|DY)t&&Y>}00|)b=s)I8sY}Z1+d8S|81uKTYhZ51w?suUNo|YN) z?AawXNYQ=&YL!9eyhp3t^|opo`;hJ1-J8!Pl~gpFQsh7x`{~Mka``BD!5^G~1U08l zQX(lztZz3jK+lcpiM|?Uw$Z<M!Zb<rqkkAH-@rfQ{v!`|uam*Me?L}MnnicU5c%*P zanvtH(jkwfNrVjATHb>#5s32qfmcqN3QC~a9V)6hW%uEF!eUA)sE8`~ikdim;XPD^ zc*<Tcl05p0f{{&kDs`1hB@?pbei|ne634kOgmEcEI+?C8EdWvO$pW30XjeWIVR+Qc zZTOC@*IZ~pVbv8%%w78wJL;RHc1Hg%bS-Xm7*lFc_H*VFxGuijJ)dYgGJ!0b6x%x| zbVxTc#<TRke0{|0pD^uWI?Jb2bFv9gf?GUZl|>!$nqC&ozs7=@OC2D#`!5-Fs(AVu zT&e0r$YR3@sA^5!zsd5&7%rN+z@W6Xd0}C6Ad*#nTGO=mZ7UqMJoGQf99UjuP-`vl zBm{LPYxvfBbT_}Hmm%v;i>Kc3G?Cdfk;5hA2EFyi&Ap2tC8#x_mk!PiiGEs0RBu|1 zReE;Nz(<`n28J$0x;i7gc;z2ki+n-uEjqi;NiX8Od6RR<84f4MW5IcJ*#F_Vq&=f! zNcM?xa9p9W5iM*XumOi&^VMX;3%tPSXP@Va_QiM6jRhT~`}7(CeDP>-OyVOQmxo~I zGb^Ymd@m%kVo!-dv}9|y{}B!x;~n-$faK!Z#YxEgd8t~*stuB7Q$?%8od}DWw$MR3 zs(gv8qpJ2J>Qs)nx~duLK?Nkb^7<S=l#K!xu5<|^`EJSA+WZPH05E&iT4%$D?=uNi z*}*|qN?%aOfz>D(%n->>aS$;A!hJ5v!Ag>^Y5laG`EDHTP#o$D_hd!z)yjc=Vv9WR zGs-nBRf;=~AsGnAKQL25145O%XT9rEJ{zT947>sZ{3Dc=R}Hfu6*5X{V9Ip2X(D(K z7bRR>E|of`J1X23ew32_iy`&9R`7>OB^zGmHnssxW$<%bH?GFd(q3%--4#Pbz>n0! zH*@}}VB}qRZBxMeB{I{&T$MQ!y^pCzM1Z~MWpOH@IKJ07FVo|Ae5J@&&@*n@;17xH z>px($Z?9FD{NBIGhBvYVV|euhbC#?eKS_3!(hL?L3fEx21B#DBdw7ENXWB$<R2WMD zJI36sgtA=YANrlCZqoPq(2q;q5uDQu)%rgE3bCQyGWWDDxdDCw+Y0!M)`gv70SVPe zF4Q@&fVW=t8Cam)H2e|7GE(VtRFkqEOpb$1u$RN3Dr9ZPMY&6XwD5tu0=HKboLUpN z)p+%TyG)>+hoRrSd<p1c+k;^Z@Mmdx{h^GPQa$3J08qS1gz}+=IFcY;&58pUm_DiU zAi0#~V<?+ZORT4ocmx@+XR|fAdh&D9goIfb1XQ`a5mM<hkb$<lk(#{#EGEJ}(wD@) zoH5Os8OwZC@|%CugpRpU96HK;40nh$)6Yp-rPZ{|op@afGJfn0PJibOt|<LTr{zTo z;MIl&Y0Bqi?*ONygl_T$H7gSR@0tgnRZCj8P3RKd)4w|c@Bb<zC@2AZ>t)h#;)U{T zfxxRwKOA;7hivx33ZQ?XgjP_4H#|C-g@w#WfP?bOokaBROi@SEMPL^Gs76txH~541 z_L5CD8uV`b>;mpN9D5h6q^xiq6DChLDz*>rC1C{|-3JR2cmTCjICp1WdhHXf)gPNM zQ$dvv^AA$s8sCdLf|e2>F$H5>ASH_@T3hk3plJqeG^UT!Wq0`b7jHj@pDj|~9)hC9 zSAavCy$s3CN>8xnp9;FqUp7w_M7;gZSG*)Z9{05}l0s=np~T_xc_&+d)))3vM%>or zzHs=DN35)JGL_t~p7>|vSKpH;{P>_YoRpg^69HGNQvk=AX)Op8sa3|Rn4XhDFY!x~ z4Ct&#nHPj06h2w#Wcqc09r3>S@E}@r0T}U6r5Dn(9ERCSP@y*m=U=*d1TF>~z^|2{ zqpJim3gV!6Wrp)3ageA6xfjEn<OPGH3PTCc_%oh#c~YsA?mdTh5Ur2ltaBIuM5h^X za2mr?$|+?~BiZny5oIu|wBldlbM(VJn+B0Cwsy5xfBfNhA5;pU2f20g;`vG3vR-$O z7RPBdgNYPy6aT(>&cBgY@rRl}uzYj*)zb6W`9opStW3Dk15E5mH_EjMM3Kl9@K#hc z3F=`x9EKC748%gvYW&Yo2~;eBK*)KFATH?9o=NH?0rH;MomoyPHSqhS+_BsUf|QA; z$^HerC0J--g<p_S0l*wZa(9(`B!{_9uK0&+2H7I+%j8@VM<FeqnCq+S-Qm0U5h9Hz zJ#P;BmTxwf{qLC*JgRqynEdlGyYb|6wCqrj^#%+Rd14kP@&K+C+e;txgyESsiREGI z_MB8?zBHx(-m{>LUjN{9^b+=_Jv4~S7Ms-`hfTjq#hlch9jCOR_oWn{J_RXfLdIEs z&w-sF?>&ps&?%nlGB`4&y;oNrZ9aSHAaO~W-lRf*F!XqU>hXu&;p0PAzWcS%H(vH& z3*#)#%8Yc*_&l<{mhYWX@lAFUKc?63zhTq)>-SZ)Y4nV9m8*8FzE$|=Za%l#0o_gH z5*uVdW%NyY{a4biXS+~`X0yT$Ne~w0q8e&#M=f^4i-}H$S7KF_5z3zMJ;H+Tl_3(U zs$R_hdiZJx`T&JbV*vhs?&&6D_6YHGO=0`P?#n&R<lm(;H3)+xpql~t^A8y0&78`& z1Epf!xyEFhxZIsOc{TU<ij6J1XP6@rqWgJp)cVp0+F%VB)fi1dtpx|=#7L(yiyeo$ zY-Jc#C)>+ln3w-pCc>z(>~v+x$*H#m8CzR$DUB4z@^el1{^13~Y72u`M{Gz}S)lpu z1ss#K;zh&f)HHM=b#wr+Oo&)<HVXTe^!q!3(dU<}$aV8<d`ymv6t#qX%<n$+t}q%> zDg?fV9~M?6JIL^Hdinc<BvVRZh&JY~m=v3QHjwJ$bd)qER~mCg&x+h5(6KKGf_hOO z16XZ%s$FIUvVeaoJ{Cbe9HCJBFZsr#3YEuh_&8A=bBTej1@6&xJ{%Et#Yf$8dz(#j zE1(6Ylm!MhVlMt*W3q)<K;mEEQPVMh8x89)c{%>jc2x-D3=xfo;mSW1o+<$K8u6-g z(cpO?CRGQ5tH}k*PpgD2ExYU27(K%z`*_*`Hjn9ZE|Mdhl|QoH45pv;Z!crU`g<fr zd{<-XmfrH?1RY|secHTLyXdjI+w*Tzg#MxVr|{o&Z_|cub9^v2_<vvjZ}@Fu&~5qz zCLt}m%bA{_&C{5vKA5ODj_?5|yOz)(Str@uMMgQNWV?OhdX;1{+ehwPXTPhh*lDS~ zPXv?M`_ImvWw`EN+CK08{OaG-|Iu`tYjm5Rf}!Fci<pe0f4NDwZ5RrCBv59*3yT%f z7NV42_4(yiu*3{I*U=gNhj#Tnu+0ye>5Z#HDz=2BSaH0j<9er~17lW=Rf=DZzfE=W zhc;=0bB7<XO*fiCq9pat=#HYH(>QN?6Z@fF;?VzAYD%@MzatNRoy~_7K)IB|X=4A; zfIvS))rf9G%*q~dp6wwNzENlFPBlrK7drd0DNMaY9#v!}IsX!b)-7Mb!IKMf8dh^e zZX06LCzD>O?na)In)!v#cK`ph9iYaFx%>p)`@U1C=b8U=z!N!+c+XlkBi_3f&NFz@ zy-M{#zkvY%Q^xdxv^NcPU7{qRDUHCc=WA4l_kTdSk|5>ROS9R6zfD$hW};&gDx*^q z<<>O?X{SHA@(`W{j-Y2Yy;6Vl%@kIB_S8g8UKWp=6lgv%0DShXn&>giVwO=F7;u~r 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®bPm)fxk8L6i2#>P#l*nCX5nQt< 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 literal 151576 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 xip% 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 diff --git a/site/content/images/icons/caret-left.svg b/site/content/images/icons/caret-left.svg new file mode 100644 index 0000000000..04c267bdc2 --- /dev/null +++ b/site/content/images/icons/caret-left.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0V0z"></path><path d="M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/caret-right.svg b/site/content/images/icons/caret-right.svg new file mode 100644 index 0000000000..5fef8a8723 --- /dev/null +++ b/site/content/images/icons/caret-right.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0V0z"></path><path d="M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/clear.svg b/site/content/images/icons/clear.svg new file mode 100644 index 0000000000..a64d8dee58 --- /dev/null +++ b/site/content/images/icons/clear.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><path d="m2 2 20 20"></path><path d="M8.35 2.69A10 10 0 0 1 21.3 15.65"></path><path d="M19.08 19.08A10 10 0 1 1 4.92 4.92"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/delete.svg b/site/content/images/icons/delete.svg new file mode 100644 index 0000000000..c9a6b955ba --- /dev/null +++ b/site/content/images/icons/delete.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="currentColor"><path d="M19.452 7.5H4.547a.5.5 0 00-.5.545l1.287 14.136A2 2 0 007.326 24h9.347a2 2 0 001.992-1.819L19.95 8.045a.5.5 0 00-.129-.382.5.5 0 00-.369-.163zm-9.2 13a.75.75 0 01-1.5 0v-9a.75.75 0 011.5 0zm5 0a.75.75 0 01-1.5 0v-9a.75.75 0 011.5 0zM22 4h-4.75a.25.25 0 01-.25-.25V2.5A2.5 2.5 0 0014.5 0h-5A2.5 2.5 0 007 2.5v1.25a.25.25 0 01-.25.25H2a1 1 0 000 2h20a1 1 0 000-2zM9 3.75V2.5a.5.5 0 01.5-.5h5a.5.5 0 01.5.5v1.25a.25.25 0 01-.25.25h-5.5A.25.25 0 019 3.75z"></path></g></svg> \ No newline at end of file diff --git a/site/content/images/icons/download.svg b/site/content/images/icons/download.svg new file mode 100644 index 0000000000..a2f286d021 --- /dev/null +++ b/site/content/images/icons/download.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/duplicate.svg b/site/content/images/icons/duplicate.svg new file mode 100644 index 0000000000..0e8aa6490f --- /dev/null +++ b/site/content/images/icons/duplicate.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/edit-square.svg b/site/content/images/icons/edit-square.svg new file mode 100644 index 0000000000..1bc7f0eaad --- /dev/null +++ b/site/content/images/icons/edit-square.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></g></svg> \ No newline at end of file diff --git a/site/content/images/icons/edit.svg b/site/content/images/icons/edit.svg new file mode 100644 index 0000000000..860bab7fcb --- /dev/null +++ b/site/content/images/icons/edit.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a.996.996 0 0 0 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/fit.svg b/site/content/images/icons/fit.svg new file mode 100644 index 0000000000..96c8d4a592 --- /dev/null +++ b/site/content/images/icons/fit.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" class="chakra-icon css-13otjrl" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M17 4h3c1.1 0 2 .9 2 2v2h-2V6h-3V4zM4 8V6h3V4H4c-1.1 0-2 .9-2 2v2h2zm16 8v2h-3v2h3c1.1 0 2-.9 2-2v-2h-2zM7 18H4v-2H2v2c0 1.1.9 2 2 2h3v-2zM18 8H6v8h12V8z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/rerun.svg b/site/content/images/icons/rerun.svg new file mode 100644 index 0000000000..105e191dca --- /dev/null +++ b/site/content/images/icons/rerun.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="currentColor"><path d="M10.319,4.936a7.239,7.239,0,0,1,7.1,2.252,1.25,1.25,0,1,0,1.872-1.657A9.737,9.737,0,0,0,9.743,2.5,10.269,10.269,0,0,0,2.378,9.61a.249.249,0,0,1-.271.178l-1.033-.13A.491.491,0,0,0,.6,9.877a.5.5,0,0,0-.019.526l2.476,4.342a.5.5,0,0,0,.373.248.43.43,0,0,0,.062,0,.5.5,0,0,0,.359-.152l3.477-3.593a.5.5,0,0,0-.3-.844L5.15,10.172a.25.25,0,0,1-.2-.333A7.7,7.7,0,0,1,10.319,4.936Z"></path><path d="M23.406,14.1a.5.5,0,0,0,.015-.526l-2.5-4.329A.5.5,0,0,0,20.546,9a.489.489,0,0,0-.421.151l-3.456,3.614a.5.5,0,0,0,.3.842l1.848.221a.249.249,0,0,1,.183.117.253.253,0,0,1,.023.216,7.688,7.688,0,0,1-5.369,4.9,7.243,7.243,0,0,1-7.1-2.253,1.25,1.25,0,1,0-1.872,1.656,9.74,9.74,0,0,0,9.549,3.03,10.261,10.261,0,0,0,7.369-7.12.251.251,0,0,1,.27-.179l1.058.127a.422.422,0,0,0,.06,0A.5.5,0,0,0,23.406,14.1Z"></path></g></svg> \ No newline at end of file diff --git a/site/content/images/icons/reset-all.svg b/site/content/images/icons/reset-all.svg new file mode 100644 index 0000000000..2ce6116179 --- /dev/null +++ b/site/content/images/icons/reset-all.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M13 3a9 9 0 0 0-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42A8.954 8.954 0 0 0 13 21a9 9 0 0 0 0-18zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/reset.svg b/site/content/images/icons/reset.svg new file mode 100644 index 0000000000..c7280681c6 --- /dev/null +++ b/site/content/images/icons/reset.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="none" stroke-width="0" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.85355 2.14645C5.04882 2.34171 5.04882 2.65829 4.85355 2.85355L3.70711 4H9C11.4853 4 13.5 6.01472 13.5 8.5C13.5 10.9853 11.4853 13 9 13H5C4.72386 13 4.5 12.7761 4.5 12.5C4.5 12.2239 4.72386 12 5 12H9C10.933 12 12.5 10.433 12.5 8.5C12.5 6.567 10.933 5 9 5H3.70711L4.85355 6.14645C5.04882 6.34171 5.04882 6.65829 4.85355 6.85355C4.65829 7.04882 4.34171 7.04882 4.14645 6.85355L2.14645 4.85355C1.95118 4.65829 1.95118 4.34171 2.14645 4.14645L4.14645 2.14645C4.34171 1.95118 4.65829 1.95118 4.85355 2.14645Z" fill="currentColor"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/run.svg b/site/content/images/icons/run.svg new file mode 100644 index 0000000000..fdb9a8f624 --- /dev/null +++ b/site/content/images/icons/run.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M8 5v14l11-7z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/save.svg b/site/content/images/icons/save.svg new file mode 100644 index 0000000000..bd2f015bdd --- /dev/null +++ b/site/content/images/icons/save.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M17 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/select-all.svg b/site/content/images/icons/select-all.svg new file mode 100644 index 0000000000..63faa72aa5 --- /dev/null +++ b/site/content/images/icons/select-all.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10zm2-8h6v6H9V9z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/settings.svg b/site/content/images/icons/settings.svg new file mode 100644 index 0000000000..2ead9c7514 --- /dev/null +++ b/site/content/images/icons/settings.svg @@ -0,0 +1,3 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <path fill="currentColor" d="M 15,8.77 V 7.17 L 13.06,6.53 12.61,5.44 13.49,3.6 12.36,2.47 10.55,3.38 9.46,2.93 8.77,1.01 H 7.17 L 6.54,2.95 5.43,3.4 3.59,2.52 2.46,3.65 3.37,5.46 2.92,6.55 1,7.23 v 1.59 l 1.94,0.64 0.45,1.09 -0.88,1.84 1.13,1.13 1.81,-0.91 1.09,0.45 0.69,1.92 h 1.59 l 0.63,-1.94 1.11,-0.45 1.84,0.88 1.13,-1.13 L 12.61,10.53 13.08,9.44 15,8.75 Z M 8,11 C 6.34,11 5,9.66 5,8 5,6.34 6.34,5 8,5 c 1.66,0 3,1.34 3,3 0,1.66 -1.34,3 -3,3 z"></path> +</svg> diff --git a/site/content/images/icons/sort-by.svg b/site/content/images/icons/sort-by.svg new file mode 100644 index 0000000000..03e32dac5d --- /dev/null +++ b/site/content/images/icons/sort-by.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M8 16H4l6 6V2H8zm6-11v17h2V8h4l-6-6z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/swap.svg b/site/content/images/icons/swap.svg new file mode 100644 index 0000000000..1fdf5372b1 --- /dev/null +++ b/site/content/images/icons/swap.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0z"></path><path d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3 5 6.99h3V14h2V6.99h3L9 3z"></path></svg> \ No newline at end of file diff --git a/site/content/images/icons/zoom-in.svg b/site/content/images/icons/zoom-in.svg new file mode 100644 index 0000000000..4ec4fb63c8 --- /dev/null +++ b/site/content/images/icons/zoom-in.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><circle cx="11" cy="11" r="8"></circle><line x1="21" x2="16.65" y1="21" y2="16.65"></line><line x1="11" x2="11" y1="8" y2="14"></line><line x1="8" x2="14" y1="11" y2="11"></line></svg> \ No newline at end of file diff --git a/site/content/images/icons/zoom-out.svg b/site/content/images/icons/zoom-out.svg new file mode 100644 index 0000000000..e8dc090236 --- /dev/null +++ b/site/content/images/icons/zoom-out.svg @@ -0,0 +1 @@ +<svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><circle cx="11" cy="11" r="8"></circle><line x1="21" x2="16.65" y1="21" y2="16.65"></line><line x1="8" x2="14" y1="11" y2="11"></line></svg> \ No newline at end of file diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/icon.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/icon.html new file mode 100644 index 0000000000..d45f7c345c --- /dev/null +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/icon.html @@ -0,0 +1,10 @@ +<span class="inline-icon" aria-hidden="true"> + {{- $iconName := .Get 0 }} + {{- $iconPath := printf "content/images/icons/%s.svg" $iconName }} + {{- $iconSvg := readFile $iconPath }} + {{- if $iconSvg }} + {{- $iconSvg | safeHTML }} + {{- else }} + {{- errorf "Icon '%v' not found for '%v'" $iconName .Page.File.Path }} + {{- end -}} +</span> \ No newline at end of file diff --git a/site/themes/arangodb-docs-theme/static/css/theme.css b/site/themes/arangodb-docs-theme/static/css/theme.css index 3650762cd6..d228b4c548 100644 --- a/site/themes/arangodb-docs-theme/static/css/theme.css +++ b/site/themes/arangodb-docs-theme/static/css/theme.css @@ -356,6 +356,19 @@ img { margin-bottom: 20px; } +.inline-icon { + display: inline-block; + width: var(--TYPOGRAPHY-BODY-TEXT); + height: var(--TYPOGRAPHY-BODY-TEXT); + margin: 0 .1rem; + position: relative; + top: .2rem; +} + +.inline-icon svg { + margin: 0; +} + /* end Images */ /* Tables */ diff --git a/toolchain/arangoproxy/go.mod b/toolchain/arangoproxy/go.mod index 174ca5a215..e08f29a0b8 100644 --- a/toolchain/arangoproxy/go.mod +++ b/toolchain/arangoproxy/go.mod @@ -1,6 +1,6 @@ module github.com/arangodb/docs/migration-tools/arangoproxy -go 1.25 +go 1.24.0 require ( github.com/dlclark/regexp2 v1.11.5 From 79bb7f9ba41666b64c370c22a27cf3ea19ef7352 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 14:47:19 +0200 Subject: [PATCH 29/44] Unrelated consistency changes --- site/content/arangodb/3.12/develop/drivers/_index.md | 2 +- .../indexing/working-with-indexes/vector-indexes.md | 2 +- site/content/arangodb/3.13/develop/drivers/_index.md | 2 +- .../arangodb/3.13/develop/http-api/indexes/_index.md | 4 ++-- .../content/arangodb/3.13/develop/integrations/_index.md | 9 +++++++++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/site/content/arangodb/3.12/develop/drivers/_index.md b/site/content/arangodb/3.12/develop/drivers/_index.md index cba7ac5de0..6fc7ee3507 100644 --- a/site/content/arangodb/3.12/develop/drivers/_index.md +++ b/site/content/arangodb/3.12/develop/drivers/_index.md @@ -37,7 +37,7 @@ language. - [Tutorial](go.md#tutorial) - Repository: [github.com/arangodb/go-driver](https://github.com/arangodb/go-driver/tree/master/v2) -## Node.js driver +## JavaScript driver The [**ArangoJS driver**](javascript.md) lets you work with ArangoDB in Node.js, using the JavaScript scripting language. You can also use it in web browsers. diff --git a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md index 77fc3151ba..174e095f16 100644 --- a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -31,7 +31,7 @@ startup option needs to be enabled on the deployment you want to restore to. 1. Enable the vector index feature. 2. Calculate vector embeddings using [Arango's GraphML](../../../../../gen-ai/graphml/_index.md) - capabilities (available in the AI Services Data Platform) or using external tools. + capabilities (available in the AI Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which similarity metric you want to use later for querying. See diff --git a/site/content/arangodb/3.13/develop/drivers/_index.md b/site/content/arangodb/3.13/develop/drivers/_index.md index cba7ac5de0..6fc7ee3507 100644 --- a/site/content/arangodb/3.13/develop/drivers/_index.md +++ b/site/content/arangodb/3.13/develop/drivers/_index.md @@ -37,7 +37,7 @@ language. - [Tutorial](go.md#tutorial) - Repository: [github.com/arangodb/go-driver](https://github.com/arangodb/go-driver/tree/master/v2) -## Node.js driver +## JavaScript driver The [**ArangoJS driver**](javascript.md) lets you work with ArangoDB in Node.js, using the JavaScript scripting language. You can also use it in web browsers. diff --git a/site/content/arangodb/3.13/develop/http-api/indexes/_index.md b/site/content/arangodb/3.13/develop/http-api/indexes/_index.md index f759f7e174..a35384f3d0 100644 --- a/site/content/arangodb/3.13/develop/http-api/indexes/_index.md +++ b/site/content/arangodb/3.13/develop/http-api/indexes/_index.md @@ -221,8 +221,8 @@ paths: insert a value into the index that already exists in the index always fails, regardless of the value of this attribute. - The optional **estimates** attribute is supported by persistent indexes. - This attribute controls whether index selectivity estimates are + The optional **estimates** attribute is supported by `persistent`, `mdi`, and + `mdi-prefixed` indexes. This attribute controls whether index selectivity estimates are maintained for the index. Not maintaining index selectivity estimates can have a slightly positive impact on write performance. The downside of turning off index selectivity estimates will be that diff --git a/site/content/arangodb/3.13/develop/integrations/_index.md b/site/content/arangodb/3.13/develop/integrations/_index.md index 635983cc4d..3469808d73 100644 --- a/site/content/arangodb/3.13/develop/integrations/_index.md +++ b/site/content/arangodb/3.13/develop/integrations/_index.md @@ -47,3 +47,12 @@ allows you to export data from Apache Kafka to ArangoDB. - Repository: [github.com/arangodb/kafka-connect-arangodb/](https://github.com/arangodb/kafka-connect-arangodb/) - [Demo](https://github.com/arangodb/kafka-connect-arangodb/tree/main/demo) - [Changelog](https://github.com/arangodb/kafka-connect-arangodb/blob/main/ChangeLog.md) + +## TinkerPop Provider + +The [**ArangoDB TinkerPop Provider**](arangodb-tinkerpop-provider.md) is an implementation of +the [Apache TinkerPop OLTP Provider](https://tinkerpop.apache.org/docs/3.7.3/dev/provider) API +for ArangoDB. + +- Repository: [github.com/arangodb/arangodb-tinkerpop-provider](https://github.com/arangodb/arangodb-tinkerpop-provider) +- [Changelog](https://github.com/arangodb/arangodb-tinkerpop-provider/blob/main/CHANGELOG.md) From 8076e73029f6728df20495199c2a60976439127a Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 14:56:39 +0200 Subject: [PATCH 30/44] Squashed commit of the following: commit f005cb32f318469b1c7eab5d1dde0f4e61309bed Author: Paula <paula.mihu@arangodb.com> Date: Thu Oct 23 13:22:52 2025 +0200 fix broken links commit cb0629b8b52e752fc962991c6261df49baaeba9e Author: Paula <paula.mihu@arangodb.com> Date: Thu Oct 23 13:13:55 2025 +0200 remove tag for now commit 2474431a7c96da5d3da7c1a2a878b1ee9a7a78ca Author: Paula <paula.mihu@arangodb.com> Date: Wed Oct 22 19:29:42 2025 +0200 Renamed GenAI Suite to AI Services across all files, including endpoints; renamed Services folder to Reference; fix all broken links commit 80fb22975c84366d746bf5a1020b1f67d11355e4 Author: Paula <paula.mihu@arangodb.com> Date: Thu Oct 16 10:27:08 2025 +0200 fix some broken links commit 52b1f2a67b56e83dfe9a2b4ddf60011897d3d0a8 Author: Paula <paula.mihu@arangodb.com> Date: Wed Oct 15 18:11:59 2025 +0200 reorganize genai suite overview pages commit f54dce1e93483c8d17ddef1b75bda564e801fb7c Author: Paula <paula.mihu@arangodb.com> Date: Thu Oct 9 16:55:42 2025 +0200 added graphrag uses cases, reorganize content commit 50ea4766087ff352382f40dc15c37cc14a1b89a1 Author: Paula <paula.mihu@arangodb.com> Date: Wed Oct 15 17:10:38 2025 +0200 rework data platform content, make kubernetes more prominent commit 4249c4e08f09554c99832c415945ddf27a7a8ee8 Author: Paula <paula.mihu@arangodb.com> Date: Tue Oct 14 16:55:41 2025 +0200 rename ArangoDB Platform to Arango Data Platform commit abc5079bf85cca0fa0a293680fe2eda6661b0b40 Author: Paula <paula.mihu@arangodb.com> Date: Tue Oct 14 16:50:32 2025 +0200 change menu titles --- README.md | 8 +- site/content/ai-services/_index.md | 36 +++++++ .../graph-analytics.md | 16 ++-- .../{gen-ai => ai-services}/graph-to-ai.md | 44 +-------- .../{gen-ai => ai-services}/graphml/_index.md | 2 +- .../graphml/notebooks-api.md | 4 +- .../graphml/quickstart.md | 6 +- .../{gen-ai => ai-services}/graphml/ui.md | 6 +- site/content/ai-services/graphrag/_index.md | 60 ++++++++++++ .../graphrag/technical-overview.md} | 23 +++-- .../graphrag/tutorial-notebook.md | 8 +- .../content/ai-services/graphrag/use-cases.md | 87 +++++++++++++++++ .../graphrag/web-interface.md | 22 ++--- .../notebook-servers.md | 14 +-- site/content/ai-services/reference/_index.md | 6 ++ .../reference}/gen-ai.md | 26 +++--- .../reference}/importer.md | 14 +-- .../reference}/mlflow.md | 4 +- .../reference}/natural-language-to-aql.md | 4 +- .../reference}/retriever.md | 8 +- .../reference}/triton-inference-server.md | 18 ++-- site/content/amp/_index.md | 4 +- .../arangodb/3.12/aql/functions/vector.md | 2 +- site/content/arangodb/3.12/deploy/_index.md | 6 +- site/content/arangodb/3.12/features/_index.md | 4 +- .../working-with-indexes/vector-indexes.md | 2 +- .../arangodb/3.13/aql/functions/vector.md | 2 +- site/content/arangodb/3.13/deploy/_index.md | 6 +- site/content/arangodb/3.13/features/_index.md | 4 +- .../working-with-indexes/vector-indexes.md | 2 +- .../arangodb/3.13/release-notes/platform.md | 12 +-- site/content/data-platform/_index.md | 47 ++++++++-- site/content/data-platform/about/features.md | 54 ----------- site/content/data-platform/features.md | 81 ++++++++++++++++ .../{about/_index.md => get-started.md} | 93 ++++++------------- site/content/data-platform/release-notes.md | 24 ++--- site/content/gen-ai/_index.md | 24 ----- site/content/gen-ai/services/_index.md | 6 -- .../layouts/shortcodes/tag.html | 4 +- 39 files changed, 470 insertions(+), 323 deletions(-) create mode 100644 site/content/ai-services/_index.md rename site/content/{gen-ai => ai-services}/graph-analytics.md (98%) rename site/content/{gen-ai => ai-services}/graph-to-ai.md (70%) rename site/content/{gen-ai => ai-services}/graphml/_index.md (99%) rename site/content/{gen-ai => ai-services}/graphml/notebooks-api.md (99%) rename site/content/{gen-ai => ai-services}/graphml/quickstart.md (85%) rename site/content/{gen-ai => ai-services}/graphml/ui.md (98%) create mode 100644 site/content/ai-services/graphrag/_index.md rename site/content/{gen-ai/graphrag/_index.md => ai-services/graphrag/technical-overview.md} (92%) rename site/content/{gen-ai => ai-services}/graphrag/tutorial-notebook.md (98%) create mode 100644 site/content/ai-services/graphrag/use-cases.md rename site/content/{gen-ai => ai-services}/graphrag/web-interface.md (88%) rename site/content/{gen-ai => ai-services}/notebook-servers.md (83%) create mode 100644 site/content/ai-services/reference/_index.md rename site/content/{gen-ai/services => ai-services/reference}/gen-ai.md (85%) rename site/content/{gen-ai/services => ai-services/reference}/importer.md (96%) rename site/content/{gen-ai/services => ai-services/reference}/mlflow.md (97%) rename site/content/{gen-ai/services => ai-services/reference}/natural-language-to-aql.md (97%) rename site/content/{gen-ai/services => ai-services/reference}/retriever.md (96%) rename site/content/{gen-ai/services => ai-services/reference}/triton-inference-server.md (92%) delete mode 100644 site/content/data-platform/about/features.md create mode 100644 site/content/data-platform/features.md rename site/content/data-platform/{about/_index.md => get-started.md} (62%) delete mode 100644 site/content/gen-ai/_index.md delete mode 100644 site/content/gen-ai/services/_index.md diff --git a/README.md b/README.md index 1df0c38a87..e7fbf1834f 100644 --- a/README.md +++ b/README.md @@ -367,7 +367,7 @@ Inner shortcode Tags let you display badges, usually below a headline. This is mainly used for pointing out if a feature is only available in the -GenAI Suite, the Data Platform, the Arango Managed Platform (AMP), or multiple +AI Services, the Data Platform, the Arango Managed Platform (AMP), or multiple of them. See [Environment remarks](#environment-remarks) for details. It is also used for [Edition remarks](#edition-remarks) in content before @@ -696,15 +696,15 @@ Pages and sections about features that are only available in certain environment such as in ArangoDB Shell should indicate where they are available using the `tag` shortcode. -Features exclusive to the Data Platform, GenAI Data Platform, +Features exclusive to the Data Platform, AI Services Data Platform, Arango Managed Platform (AMP), and ArangoDB generally don't need to be tagged because they are in dedicated parts of the documentation. However, if there are subsections with different procedures, each can be tagged accordingly. -In the GenAI Data Platform only: +In the AI Services Data Platform only: ```markdown -{{< tag "GenAI Data Platform" >}} +{{< tag "AI Services Data Platform" >}} ``` In the Arango Managed Platform only: diff --git a/site/content/ai-services/_index.md b/site/content/ai-services/_index.md new file mode 100644 index 0000000000..0b5897e9f8 --- /dev/null +++ b/site/content/ai-services/_index.md @@ -0,0 +1,36 @@ +--- +title: AI Services +menuTitle: AI Services +weight: 2 +description: >- + A comprehensive AI solution that transforms your data into intelligent knowledge graphs with GraphRAG capabilities, applies advanced machine learning with GraphML, and provides enterprise-grade tools for analytics, natural language querying, and AI-powered insights, all through an intuitive web interface +--- + +## What's included + +AI Services are comprised of two major components: + +- [**GraphRAG**](./graphrag/_index.md): A complete solution for extracting entities + from text files to create a knowledge graph that you can then query with a + natural language interface. +- [**GraphML**](./graphml/_index.md): Apply machine learning to graphs for link prediction, + classification, and similar tasks. + +Each component has an intuitive graphical user interface integrated into the +Arango Data Platform web interface, guiding you through the process. + +Alongside these components, you also get the following additional features: + +- [**Graph Analytics**](graph-analytics.md): Run graph algorithms such as PageRank + on dedicated compute resources. +- [**Jupyter notebooks**](notebook-servers.md): Run a Jupyter kernel in the platform for hosting + interactive notebooks for experimentation and development of applications + that use ArangoDB as their backend. +- **Public and private LLM support**: Use public LLMs such as OpenAI + or private LLMs with [Triton Inference Server](reference/triton-inference-server.md). +- [**MLflow integration**](reference/mlflow.md): Use the popular MLflow as a model registry for private LLMs + or to run machine learning experiments as part of the Arango Data Platform. +- **Application Programming Interfaces**: Use the underlying APIs of the + AI Services and build your own integrations. See the + [API reference](https://arangoml.github.io/platform-dss-api/GenAI-Service/proto/index.html) documentation + for more details. diff --git a/site/content/gen-ai/graph-analytics.md b/site/content/ai-services/graph-analytics.md similarity index 98% rename from site/content/gen-ai/graph-analytics.md rename to site/content/ai-services/graph-analytics.md index 442a7838fb..e19db7de88 100644 --- a/site/content/gen-ai/graph-analytics.md +++ b/site/content/ai-services/graph-analytics.md @@ -17,7 +17,7 @@ and network flow analysis. ArangoDB offers a feature for running algorithms on your graph data, called Graph Analytics Engines (GAEs). It is available on request for the [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) -and included in the [AI Data Platform](../data-platform/about/_index.md). +and included in the [AI Data Platform](../data-platform/_index.md). Key features: @@ -89,7 +89,7 @@ Single server deployments using ArangoDB version 3.11 are not supported. {{< tabs "platforms" >}} {{< tab "AI Data Platform" >}} -You can use any of the available authentication methods the AI Data Platform +You can use any of the available authentication methods the Data Platform supports to start and stop `graphanalytics` services via the AI service as well as to authenticate requests to the [Engine API](#engine-api). @@ -136,7 +136,7 @@ The interface for managing the engines depends on the environment you use: {{< tag "AI Data Platform" >}} -GAEs are deployed and deleted via the [AI service](services/gen-ai.md) +GAEs are deployed and deleted via the [AI service](reference/gen-ai.md) in the AI Data Platform. If you use cURL, you need to use the `-k` / `--insecure` option for requests @@ -144,7 +144,7 @@ if the Platform deployment uses a self-signed certificate (default). #### Start a `graphanalytics` service -`POST <ENGINE_URL>/gen-ai/v1/graphanalytics` +`POST <ENGINE_URL>/ai/v1/graphanalytics` Start a GAE via the AI service with an empty request body: @@ -152,7 +152,7 @@ Start a GAE via the AI service with an empty request body: # Example with a JWT session token ADB_TOKEN=$(curl -sSk -d '{"username":"root", "password": ""}' -X POST https://127.0.0.1:8529/_open/auth | jq -r .jwt) -Service=$(curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/gen-ai/v1/graphanalytics) +Service=$(curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/ai/v1/graphanalytics) ServiceID=$(echo "$Service" | jq -r ".serviceInfo.serviceId") if [[ "$ServiceID" == "null" ]]; then echo "Error starting gral engine" @@ -164,13 +164,13 @@ echo "$Service" | jq #### List the services -`POST <ENGINE_URL>/gen-ai/v1/list_services` +`POST <ENGINE_URL>/ai/v1/list_services` You can list all running services managed by the AI service, including the `graphanalytics` services: ```sh -curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/gen-ai/v1/list_services | jq +curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/ai/v1/list_services | jq ``` #### Stop a `graphanalytics` service @@ -178,7 +178,7 @@ curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X POST https://127.0.0.1:8529/g Delete the desired engine via the AI service using the service ID: ```sh -curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X DELETE https://127.0.0.1:8529/gen-ai/v1/service/$ServiceID | jq +curl -sSk -H "Authorization: bearer $ADB_TOKEN" -X DELETE https://127.0.0.1:8529/ai/v1/service/$ServiceID | jq ``` ### Management API diff --git a/site/content/gen-ai/graph-to-ai.md b/site/content/ai-services/graph-to-ai.md similarity index 70% rename from site/content/gen-ai/graph-to-ai.md rename to site/content/ai-services/graph-to-ai.md index bccae43b5c..061068ae26 100644 --- a/site/content/gen-ai/graph-to-ai.md +++ b/site/content/ai-services/graph-to-ai.md @@ -1,17 +1,16 @@ --- -title: Generative Artificial Intelligence (GenAI) and Data Science -menuTitle: GenAI & Data Science +title: From Graph to AI +menuTitle: From Graph to AI weight: 25 description: >- ArangoDB's set of tools and technologies enables analytics, machine learning, - and GenAI applications powered by graph data + and AI applications powered by graph data aliases: - data-science/overview --- -- [Link to 3.12](../arangodb/3.12/aql/_index.md) {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -21,7 +20,7 @@ data science applications. The core database system includes multi-model storage of information with scalable graph and information retrieval capabilities that you can directly use for your research and product development. -ArangoDB also offers a dedicated GenAI Suite, using the database core +ArangoDB also offers dedicated AI Services, using the database core as the foundation for higher-level features. Whether you want to turbocharge generative AI applications with a GraphRAG solution or apply analytics and machine learning to graph data at scale, ArangoDB covers these needs. @@ -33,39 +32,6 @@ engineering space can make use of ArangoDB's set of tools and technologies that enable analytics and machine learning on graph data. --> -## GenAI Suite - -The GenAI Suite is comprised of two major components: - -- [**GraphRAG**](#graphrag): A complete solution for extracting entities - from text files to create a knowledge graph that you can then query with a - natural language interface. -- [**GraphML**](#graphml): Apply machine learning to graphs for link prediction, - classification, and similar tasks. - -Each component has an intuitive graphical user interface integrated into the -ArangoDB Platform web interface, guiding you through the process. - -Alongside these components, you also get the following additional features: - -- [**Graph Visualizer**](../data-platform/graph-visualizer.md): A web-based tool for exploring your graph data with an - intuitive interface and sophisticated querying capabilities. -- [**Graph Analytics**](graph-analytics.md): Run graph algorithms such as PageRank - on dedicated compute resources. -- [**Jupyter notebooks**](notebook-servers.md): Run a Jupyter kernel in the platform for hosting - interactive notebooks for experimentation and development of applications - that use ArangoDB as their backend. -- **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](services/triton-inference-server.md). -- [**MLflow integration**](services/mlflow.md): Use the popular MLflow as a model registry for private LLMs - or to run machine learning experiments as part of the ArangoDB Platform. -- [**Adapters**](../ecosystem/adapters/_index.md): Use ArangoDB together with cuGraph, NetworkX, - and other data science tools. -- **Application Programming Interfaces**: Use the underlying APIs of the - GenAI Suite services and build your own integrations. See the - [API reference](https://arangoml.github.io/platform-dss-api/GenAI-Service/proto/index.html) documentation - for more details. - ## From graph to AI This section classifies the complexity of the queries you can answer with diff --git a/site/content/gen-ai/graphml/_index.md b/site/content/ai-services/graphml/_index.md similarity index 99% rename from site/content/gen-ai/graphml/_index.md rename to site/content/ai-services/graphml/_index.md index c1262bbdcc..a636fe9901 100644 --- a/site/content/gen-ai/graphml/_index.md +++ b/site/content/ai-services/graphml/_index.md @@ -8,7 +8,7 @@ aliases: - arangographml --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/gen-ai/graphml/notebooks-api.md b/site/content/ai-services/graphml/notebooks-api.md similarity index 99% rename from site/content/gen-ai/graphml/notebooks-api.md rename to site/content/ai-services/graphml/notebooks-api.md index f34d9121b6..1c30cd27f3 100644 --- a/site/content/gen-ai/graphml/notebooks-api.md +++ b/site/content/ai-services/graphml/notebooks-api.md @@ -9,7 +9,7 @@ aliases: - ../arangographml/getting-started - ../arangographml-getting-started-with-arangographml --- -The ArangoDB Platform provides an easy-to-use & scalable interface to run +The Arango Data Platform provides an easy-to-use & scalable interface to run Graph Machine Learning on ArangoDB data. Since all the orchestration and Machine Learning logic is managed by ArangoDB, all that is typically required are JSON specifications outlining individual processes to solve a Machine Learning task. @@ -80,7 +80,7 @@ news sources, and locations are interconnected into a large graph. ![Example Event](../../images/ArangoML_open_intelligence_visualization.png) The [`arango-datasets`](../../arangodb/3.12/components/tools/arango-datasets.md) Python package -allows you to load pre-defined datasets into ArangoDB Platform. It comes pre-installed in the +allows you to load pre-defined datasets into Arango Data Platform. It comes pre-installed in the GraphML notebook environment. ```py diff --git a/site/content/gen-ai/graphml/quickstart.md b/site/content/ai-services/graphml/quickstart.md similarity index 85% rename from site/content/gen-ai/graphml/quickstart.md rename to site/content/ai-services/graphml/quickstart.md index db81915e98..e9d0cd164f 100644 --- a/site/content/gen-ai/graphml/quickstart.md +++ b/site/content/ai-services/graphml/quickstart.md @@ -3,14 +3,14 @@ title: How to get started with GraphML menuTitle: Quickstart weight: 5 description: >- - You can use GraphML straight within the ArangoDB Platform, via the web interface + You can use GraphML straight within the Arango Data Platform, via the web interface or via Notebooks aliases: - ../arangographml/deploy --- ## Web interface versus Jupyter Notebooks -The ArangoDB Platform provides enterprise-ready Graph Machine Learning in two options, +The Arango Data Platform provides enterprise-ready Graph Machine Learning in two options, tailored to suit diverse requirements and preferences: - Using the web interface - In a scriptable manner, using the integrated Jupyter Notebooks and the HTTP API for GraphML @@ -20,7 +20,7 @@ tailored to suit diverse requirements and preferences: {{< tabs "graphml-setup" >}} {{< tab "Web Interface" >}} -The web interface of the ArangoDB Platform allows you to create, configure, and +The web interface of the Arango Data Platform allows you to create, configure, and run a full machine learning workflow for GraphML. To get started, see the [Web interface for GraphML](ui.md) page. {{< /tab >}} diff --git a/site/content/gen-ai/graphml/ui.md b/site/content/ai-services/graphml/ui.md similarity index 98% rename from site/content/gen-ai/graphml/ui.md rename to site/content/ai-services/graphml/ui.md index 8c4e43024e..042e7e9936 100644 --- a/site/content/gen-ai/graphml/ui.md +++ b/site/content/ai-services/graphml/ui.md @@ -1,5 +1,5 @@ --- -title: How to use GraphML in the ArangoDB Platform web interface +title: How to use GraphML in the Arango Data Platform web interface menuTitle: Web Interface weight: 10 description: >- @@ -19,10 +19,10 @@ giving you a clear path from data to prediction: ## Create a GraphML project -To create a new GraphML project using the ArangoDB Platform web interface, follow these steps: +To create a new GraphML project using the Arango Data Platform web interface, follow these steps: 1. From the left-hand sidebar, select the database where you want to create the project. -2. In the left-hand sidebar, click **GenAI Suite** to open the GraphML project management interface, then click **Run GraphML**. +2. In the left-hand sidebar, click **AI Services** to open the GraphML project management interface, then click **Run GraphML**. ![Create GraphML Project](../../images/create-graphml-project-ui.png) 3. In the **GraphML projects** view, click **Add new project**. 4. The **Create ML project** modal opens. Enter a **Name** for your machine learning project. diff --git a/site/content/ai-services/graphrag/_index.md b/site/content/ai-services/graphrag/_index.md new file mode 100644 index 0000000000..5fea31289b --- /dev/null +++ b/site/content/ai-services/graphrag/_index.md @@ -0,0 +1,60 @@ +--- +title: GraphRAG +menuTitle: GraphRAG +weight: 5 +description: >- + ArangoDB's GraphRAG solution combines graph-based retrieval-augmented generation + with Large Language Models (LLMs) for turbocharged AI solutions +aliases: + llm-knowledge-graphs +--- +{{< tip >}} +The Arango Data Platform & AI Services are available as a pre-release. To get +exclusive early access, [get in touch](https://arangodb.com/contact/) with +the ArangoDB team. +{{< /tip >}} + +## Transform unstructured documents into intelligent knowledge graphs + +ArangoDB's GraphRAG solution enables organizations to extract meaningful insights +from their document collections by creating knowledge graphs that capture not just +individual facts, but the intricate relationships between concepts across documents. +This approach goes beyond traditional RAG systems by understanding document +interconnections and providing both granular detail-level responses and high-level +conceptual understanding. + +- **Intelligent document understanding**: Automatically extracts and connects knowledge across multiple document sources +- **Contextual intelligence**: Maintains relationships between concepts, enabling more accurate and comprehensive responses +- **Multi-level insights**: Provides both detailed technical answers and strategic high-level understanding +- **Seamless knowledge access**: Natural language interface for querying complex document relationships + +## Key benefits for enterprise applications + +- **Cross-document relationship intelligence**: +Unlike traditional RAG systems that treat documents in isolation, ArangoDB's GraphRAG +pipeline detects and leverages references between documents and chunks. This enables +more accurate responses by understanding how concepts relate across your entire knowledge base. + +- **Multi-level understanding architecture**: +The system provides both detailed technical responses and high-level strategic insights +from the same knowledge base, adapting response depth based on query complexity and user intent. + +- **Reference-aware knowledge graph**: +GraphRAG automatically detects and maps relationships between document chunks while +maintaining context of how information connects across different sources. + +- **Dynamic knowledge evolution**: +The system learns and improves understanding as more documents are added, with +relationships and connections becoming more sophisticated over time. + + +## What's next + +- **[GraphRAG Enterprise Use Cases](use-cases.md)**: Understand the business value through real-world scenarios. +- **[GraphRAG Technical Overview](technical-overview.md)**: Dive into the architecture, services, and implementation details. +- **[GraphRAG Web Interface](web-interface.md)**: Try GraphRAG using the interactive web interface. +- **[GraphRAG Tutorial using integrated Notebook servers](tutorial-notebook.md)**: Follow hands-on examples and implementation guidance via Jupyter Notebooks. + +For deeper implementation details, explore the individual services: +- **[Importer Service](../reference/importer.md)**: Transform documents into knowledge graphs. +- **[Retriever Service](../reference/retriever.md)**: Query and extract insights from your knowledge graphs. diff --git a/site/content/gen-ai/graphrag/_index.md b/site/content/ai-services/graphrag/technical-overview.md similarity index 92% rename from site/content/gen-ai/graphrag/_index.md rename to site/content/ai-services/graphrag/technical-overview.md index 8588300420..846ef4f164 100644 --- a/site/content/gen-ai/graphrag/_index.md +++ b/site/content/ai-services/graphrag/technical-overview.md @@ -1,15 +1,14 @@ --- -title: GraphRAG -menuTitle: GraphRAG -weight: 5 +title: GraphRAG Technical Overview +menuTitle: Technical Overview +weight: 15 description: >- - ArangoDB's GraphRAG solution combines graph-based retrieval-augmented generation - with Large Language Models (LLMs) for turbocharged GenAI solutions -aliases: - llm-knowledge-graphs + Technical overview of ArangoDB's GraphRAG solution, including + architecture, services, and deployment options --- + {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The ArangoDB Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -34,7 +33,7 @@ ArangoDB's unique capabilities and flexible integration of knowledge graphs and LLMs provide a powerful and efficient solution for anyone seeking to extract valuable insights from diverse datasets. -The GraphRAG component of the GenAI Suite brings all the capabilities +The GraphRAG component of AI Services brings all the capabilities together with an easy-to-use interface, so you can make the knowledge accessible to your organization. @@ -76,7 +75,7 @@ information in a structured graph format, allowing efficient querying and retrie 3. Store the generated Knowledge Graph in the database for retrieval and reasoning. For detailed information about the service, see the -[Importer](../services/importer.md) service documentation. +[Importer](../reference/importer.md) service documentation. ### Extract information from the Knowledge Graph @@ -87,7 +86,7 @@ You can extract information from Knowledge Graphs using two distinct methods: - Local retrieval For detailed information about the service, see the -[Retriever](../services/retriever.md) service documentation. +[Retriever](../reference/retriever.md) service documentation. #### Global retrieval @@ -134,7 +133,7 @@ collection, and then it expands that subgraph over related entities, relations If you're working in an air-gapped environment or need to keep your data private, you can use the private LLM mode with -[Triton Inference Server](../services/triton-inference-server.md). +[Triton Inference Server](../reference/triton-inference-server.md). This option allows you to run the service completely within your own infrastructure. The Triton Inference Server is a crucial component when diff --git a/site/content/gen-ai/graphrag/tutorial-notebook.md b/site/content/ai-services/graphrag/tutorial-notebook.md similarity index 98% rename from site/content/gen-ai/graphrag/tutorial-notebook.md rename to site/content/ai-services/graphrag/tutorial-notebook.md index 1bbcfebf8d..ffadbad182 100644 --- a/site/content/gen-ai/graphrag/tutorial-notebook.md +++ b/site/content/ai-services/graphrag/tutorial-notebook.md @@ -3,10 +3,10 @@ title: GraphRAG Notebook Tutorial menuTitle: Notebook Tutorial description: >- Building a GraphRAG pipeline using ArangoDB's integrated notebook servers -weight: 10 +weight: 25 --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -199,9 +199,9 @@ pprint(importerResponse) Once the importer service has processed the document, you can visualize and interact with the generated Knowledge Graph using the [Graph Visualizer](../../data-platform/graph-visualizer.md) -directly from the ArangoDB Platform web interface. +directly from the Arango Data Platform web interface. -1. In the ArangoDB Platform web interface, select the database you have previously used. +1. In the Arango Data Platform web interface, select the database you have previously used. 2. Click **Graphs** in the main navigation. 3. Select the graph named **Knowledge Graph** from the list. 4. The viewport of the Graph Visualizer opens for exploring the graph. diff --git a/site/content/ai-services/graphrag/use-cases.md b/site/content/ai-services/graphrag/use-cases.md new file mode 100644 index 0000000000..9b08fe169d --- /dev/null +++ b/site/content/ai-services/graphrag/use-cases.md @@ -0,0 +1,87 @@ +--- +title: GraphRAG Use Cases +menuTitle: Use Cases +weight: 10 +description: >- + Real-world enterprise use cases for ArangoDB's GraphRAG solution and + comparison with traditional RAG approaches, including business benefits + and practical applications +--- + +## GraphRAG Enterprise Use Cases + +Whether you are evaluating GraphRAG for your organization or looking to understand +its business applications, these real-world scenarios demonstrate how GraphRAG can transform the way you extract insights from your data. + +### Enterprise knowledge management + +**Scenario**: A consulting firm has accumulated thousands of PDF reports, research papers, +and client documents over years. Team members struggle to find relevant information +quickly and often miss connections between different projects. + +**GraphRAG solution**: The pipeline processes all documents, creating a knowledge graph +that understands how concepts relate across different projects and time periods. Team +members can now ask questions like "What approaches have we used for supply chain +optimization across different industries?" and get comprehensive answers that reference +multiple documents and projects. + +**Business value**: +- Reduces research time by 70% +- Improves proposal quality by leveraging past insights +- Enables knowledge sharing across teams + +### Research and development + +**Scenario**: A pharmaceutical company's R&D team needs to analyze research papers, +clinical trial data, and regulatory documents to identify potential drug interactions +and development pathways. + +**GraphRAG solution**: The system processes all research documents, clinical data, and +regulatory information, creating connections between different studies and findings. +Researchers can query complex relationships like "What are the common side effects +mentioned across all Phase II trials for similar compounds?" + +**Business value**: +- Accelerates research insights +- Reduces risk of missing critical connections +- Improves decision-making speed + +### Legal document analysis + +**Scenario**: A law firm needs to analyze case law, legal precedents, and client +documents to build comprehensive legal strategies. + +**GraphRAG solution**: The pipeline processes legal documents, creating a knowledge +graph that understands legal precedents, case relationships, and argument patterns. +Lawyers can ask complex questions like "How have similar contract disputes been +resolved in different jurisdictions?" + +**Business value**: +- Improves case preparation quality +- Reduces research time +- Enables more comprehensive legal strategies + +## GraphRAG versus Traditional RAG (VectorRAG) + +Traditional RAG systems find text chunks that are semantically similar to your query. +However, they don't understand the inherent relationships between these chunks. + +For example, when asked, "What is the fix for Issue A?", a VectorRAG system might +retrieve two separate, unstructured chunks: one describing "Issue A" and another +mentioning a "Fix 1" for a related system. Because the connection isn't explicit, +the LLM cannot confidently link them and will often default to a safe, unhelpful answer: + +**VectorRAG Response**: _"The context does not provide a specific fix for Issue A."_ + +GraphRAG overcomes this limitation by retrieving a subgraph of interconnected data. +Instead of just text, it provides the LLM with a clear map of how information is related. + +For the same question, GraphRAG fetches structured triplets (node-relationship-node), +such as `(Issue A) -> [HAS_FIX] -> (Fix 1)`. This context is unambiguous, it explicitly +states the relationship between the problem and the solution, allowing the LLM to +provide a direct and correct answer: + +**GraphRAG Response**: _"The fix for Issue A is Fix 1."_ + +The key difference is that VectorRAG gives the LLM a pile of ingredients, while GraphRAG +provides the actual recipe. \ No newline at end of file diff --git a/site/content/gen-ai/graphrag/web-interface.md b/site/content/ai-services/graphrag/web-interface.md similarity index 88% rename from site/content/gen-ai/graphrag/web-interface.md rename to site/content/ai-services/graphrag/web-interface.md index 47e76c67b4..f9297b6d23 100644 --- a/site/content/gen-ai/graphrag/web-interface.md +++ b/site/content/ai-services/graphrag/web-interface.md @@ -1,13 +1,13 @@ --- -title: How to use GraphRAG in the ArangoDB Platform web interface +title: How to use GraphRAG in the Arango Data Platform web interface menuTitle: Web Interface -weight: 5 +weight: 20 description: >- Learn how to create, configure, and run a full GraphRAG workflow in four steps using the Platform web interface --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -23,10 +23,10 @@ The entire process is organized into sequential steps within a **Project**: ## Create a GraphRAG project -To create a new GraphRAG project using the ArangoDB Platform web interface, follow these steps: +To create a new GraphRAG project using the Arango Data Platform web interface, follow these steps: 1. From the left-hand sidebar, select the database where you want to create the project. -2. In the left-hand sidebar, click **GenAI Suite** to open the GraphRAG project management +2. In the left-hand sidebar, click **AI Services** to open the GraphRAG project management interface, then click **Run GraphRAG**. 3. In the **GraphRAG projects** view, click **Add new project**. 4. The **Create GraphRAG project** modal opens. Enter a **Name** and optionally @@ -75,7 +75,7 @@ while OpenAI is used for the embedding model. 3. Click the **Start importer service** button. {{< info >}} -Note that you must first register your model in MLflow. The [Triton LLM Host](../services/triton-inference-server.md) +Note that you must first register your model in MLflow. The [Triton LLM Host](../reference/triton-inference-server.md) service automatically downloads and loads models from the MLflow registry. {{< /info >}} @@ -84,7 +84,7 @@ service automatically downloads and loads models from the MLflow registry. {{< /tabs >}} -See also the [GraphRAG Importer](../services/importer.md) service documentation. +See also the [GraphRAG Importer](../reference/importer.md) service documentation. ## Upload your file @@ -145,7 +145,7 @@ while OpenAI is used for the embedding model. 3. Click the **Start retriever service** button. {{< info >}} -Note that you must first register your model in MLflow. The [Triton LLM Host](../services/triton-inference-server.md) +Note that you must first register your model in MLflow. The [Triton LLM Host](../reference/triton-inference-server.md) service automatically downloads and loads models from the MLflow registry. {{< /info >}} @@ -154,14 +154,14 @@ service automatically downloads and loads models from the MLflow registry. {{< /tabs >}} -See also the [GraphRAG Retriever](../services/retriever.md) documentation. +See also the [GraphRAG Retriever](../reference/retriever.md) documentation. ## Chat with your Knowledge Graph The Retriever service provides two search methods: -- [Local search](../services/retriever.md#local-search): Local queries let you +- [Local search](../reference/retriever.md#local-search): Local queries let you explore specific nodes and their direct connections. -- [Global search](../services/retriever.md#global-search): Global queries uncover +- [Global search](../reference/retriever.md#global-search): Global queries uncover broader patters and relationships across the entire Knowledge Graph. ![Chat with your Knowledge Graph](../../images/graphrag-ui-chat.png) diff --git a/site/content/gen-ai/notebook-servers.md b/site/content/ai-services/notebook-servers.md similarity index 83% rename from site/content/gen-ai/notebook-servers.md rename to site/content/ai-services/notebook-servers.md index 27a7896fba..fc3c9a0c28 100644 --- a/site/content/gen-ai/notebook-servers.md +++ b/site/content/ai-services/notebook-servers.md @@ -3,23 +3,23 @@ title: Notebook Servers menuTitle: Notebook Servers weight: 20 description: >- - Colocated Jupyter Notebooks within the ArangoDB Platform + Colocated Jupyter Notebooks within the Arango Data Platform aliases: - arangograph-notebooks --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} ArangoDB Notebooks provide a Python-based, Jupyter-compatible interface for building -and experimenting with graph-powered data, GenAI, and graph machine learning +and experimenting with graph-powered data, AI, and graph machine learning workflows directly connected to ArangoDB databases. The notebook servers are -embedded in the ArangoDB Platform ecosystem and offer a +embedded in the Arango Data Platform ecosystem and offer a pre-configured environment where everything, including all the necessary services and configurations, comes preloaded. You don't need to set up or configure the -infrastructure, and can immediately start using the GraphML and GenAI +infrastructure, and can immediately start using the GraphML and AI functionalities. The notebooks are primarily focused on the following solutions: @@ -32,14 +32,14 @@ The notebooks are primarily focused on the following solutions: NetworkX, and other data science tools. The ArangoDB Notebooks include the following: -- Automatically connect to ArangoDB databases and GenAI platform services +- Automatically connect to ArangoDB databases and AI platform services - [Magic commands](../amp/notebooks.md#arangograph-magic-commands) that simplify database interactions - Example notebooks for learning ## Quickstart -1. In the ArangoDB Platform web interface, expand **GenAI Tools** in the +1. In the Arango Data Platform web interface, expand **AI Tools** in the main navigation and click **Notebook servers**. 2. The page displays an overview of the notebook services. Click **New notebook server** to create a new one. diff --git a/site/content/ai-services/reference/_index.md b/site/content/ai-services/reference/_index.md new file mode 100644 index 0000000000..e23683c4ba --- /dev/null +++ b/site/content/ai-services/reference/_index.md @@ -0,0 +1,6 @@ +--- +title: Reference +menuTitle: Reference +description: '' +--- + diff --git a/site/content/gen-ai/services/gen-ai.md b/site/content/ai-services/reference/gen-ai.md similarity index 85% rename from site/content/gen-ai/services/gen-ai.md rename to site/content/ai-services/reference/gen-ai.md index e6bd266480..f0b1ee9bc8 100644 --- a/site/content/gen-ai/services/gen-ai.md +++ b/site/content/ai-services/reference/gen-ai.md @@ -1,20 +1,20 @@ --- -title: GenAI Orchestration Service -menuTitle: GenAI +title: AI Orchestration Service +menuTitle: AI Orchestrator description: >- - The GenAI orchestrator service installs, manages, and runs AI-based services + The AI orchestrator service installs, manages, and runs AI-based services for GraphRAG in your Kubernetes cluster weight: 5 --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} ## Overview -The basic operations that the GenAI orchestration service carries out are the following: +The basic operations that the AI orchestration service carries out are the following: - Install a service - Uninstall a service - Get the status of a service @@ -23,7 +23,7 @@ The basic operations that the GenAI orchestration service carries out are the fo Each unique service has its own API endpoint for the deployment. **Endpoint LLM Host:** -`https://<ExternalEndpoint>:8529/gen-ai/v1/llmhost` +`https://<ExternalEndpoint>:8529/ai/v1/llmhost` While services have their own unique endpoint, they share the same creation request body and the same response body structure. The `env` field is used @@ -86,7 +86,7 @@ corresponding service documentation. ## Obtaining a Bearer Token -Before you can authenticate with the GenAI service, you need to obtain a +Before you can authenticate with the AI service, you need to obtain a Bearer token. You can generate this token using the ArangoDB authentication API: ```bash @@ -106,7 +106,7 @@ The example below shows how to install, monitor, and uninstall the Importer serv ### Step 1: Installing the service ```bash -curl -X POST https://<ExternalEndpoint>:8529/gen-ai/v1/graphragimporter \ +curl -X POST https://<ExternalEndpoint>:8529/ai/v1/graphragimporter \ -H "Authorization: Bearer <your-bearer-token>" \ -H "Content-Type: application/json" \ -d '{ @@ -136,7 +136,7 @@ curl -X POST https://<ExternalEndpoint>:8529/gen-ai/v1/graphragimporter \ ### Step 2: Checking the service status ```bash -curl -X GET https://<ExternalEndpoint>:8529/gen-ai/v1/service/arangodb-graphrag-importer-of1ml \ +curl -X GET https://<ExternalEndpoint>:8529/ai/v1/service/arangodb-graphrag-importer-of1ml \ -H "Authorization: Bearer <your-bearer-token>" ``` @@ -155,7 +155,7 @@ curl -X GET https://<ExternalEndpoint>:8529/gen-ai/v1/service/arangodb-graphrag- ### Step 3: Uninstalling the service ```bash -curl -X DELETE https://<ExternalEndpoint>:8529/gen-ai/v1/service/arangodb-graphrag-importer-of1ml \ +curl -X DELETE https://<ExternalEndpoint>:8529/ai/v1/service/arangodb-graphrag-importer-of1ml \ -H "Authorization: Bearer <your-bearer-token>" ``` @@ -188,17 +188,17 @@ Replace the following values with your actual configuration: ## Service configuration -The GenAI orchestrator service is **started by default**. +The AI orchestrator service is **started by default**. It will be available at the following URL: -`https://<ExternalEndpoint>:8529/gen-ai/v1/service` +`https://<ExternalEndpoint>:8529/ai/v1/service` ## Health check To test whether the service is running, you can use the following snippet: ```bash -curl -X GET https://<ExternalEndpoint>:8529/gen-ai/v1/health +curl -X GET https://<ExternalEndpoint>:8529/ai/v1/health ``` Expected output on success: `{"status":"OK"}` diff --git a/site/content/gen-ai/services/importer.md b/site/content/ai-services/reference/importer.md similarity index 96% rename from site/content/gen-ai/services/importer.md rename to site/content/ai-services/reference/importer.md index 955f1a68d2..9c118e6d7e 100644 --- a/site/content/gen-ai/services/importer.md +++ b/site/content/ai-services/reference/importer.md @@ -7,7 +7,7 @@ description: >- weight: 10 --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -36,7 +36,7 @@ To create a new GraphRAG project, use the `CreateProject` method by sending a provide a `project_description`. ```curl -curl -X POST "https://<ExternalEndpoint>:8529/gen-ai/v1/project" \ +curl -X POST "https://<ExternalEndpoint>:8529/ai/v1/project" \ -H "Content-Type: application/json" \ -d '{ "project_name": "docs", @@ -57,7 +57,7 @@ Additional project metadata is accessible via the following endpoint, replacing `<your_project>` with the actual name of your project: ``` -GET /gen-ai/v1/project_by_name/<your_project> +GET /ai/v1/project_by_name/<your_project> ``` The endpoint provides comprehensive metadata about your project's components, @@ -94,8 +94,8 @@ The Importer service can be configured to use either: - OpenAI (for public LLM deployments) - OpenRouter (for public LLM deployments) -To start the service, use the GenAI service endpoint `/v1/graphragimporter`. -Please refer to the documentation of [GenAI service](gen-ai.md) for more +To start the service, use the AI service endpoint `/v1/graphragimporter`. +Please refer to the documentation of [AI service](gen-ai.md) for more information on how to use it. ### Using Triton Inference Server (Private LLM) @@ -209,7 +209,7 @@ to send an input file to the Importer service: ``` Replace the following placeholders: - - `<your-arangodb-platform-url>`: Your ArangoDB Platform URL. + - `<your-arangodb-platform-url>`: Your Arango Data Platform URL. - `<url-postfix>`: The URL postfix configured in your deployment. @@ -224,7 +224,7 @@ to send an input file to the Importer service: You can verify the state of the import process via the following endpoint: ``` -GET /gen-ai/v1/project_by_name/<your_project> +GET /ai/v1/project_by_name/<your_project> ``` For example, the `status` object found within `importerServices` may contain the following diff --git a/site/content/gen-ai/services/mlflow.md b/site/content/ai-services/reference/mlflow.md similarity index 97% rename from site/content/gen-ai/services/mlflow.md rename to site/content/ai-services/reference/mlflow.md index 84d43a6e70..39146ba48b 100644 --- a/site/content/gen-ai/services/mlflow.md +++ b/site/content/ai-services/reference/mlflow.md @@ -3,11 +3,11 @@ title: ArangoDB MLflow Service menuTitle: MLflow description: >- The ArangoDB MLflow Service integrates the MLflow platform for managing the - full machine learning lifecycle into the ArangoDB Platform + full machine learning lifecycle into the Arango Data Platform weight: 25 --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/gen-ai/services/natural-language-to-aql.md b/site/content/ai-services/reference/natural-language-to-aql.md similarity index 97% rename from site/content/gen-ai/services/natural-language-to-aql.md rename to site/content/ai-services/reference/natural-language-to-aql.md index 6d2610dfe0..e73234d162 100644 --- a/site/content/gen-ai/services/natural-language-to-aql.md +++ b/site/content/ai-services/reference/natural-language-to-aql.md @@ -55,11 +55,11 @@ TRITON_TIMEOUT=<timeout_seconds> # Optional ### Starting the Service -To start the service, use GenAI service endpoint `CreateGraphRag`. Please refer to the documentation of GenAI service for more information on how to use it. +To start the service, use AI service endpoint `CreateGraphRag`. Please refer to the documentation of AI service for more information on how to use it. ### Required Parameters -These parameters must be provided in the install request sent to GenAI service. +These parameters must be provided in the install request sent to AI service. - `username`: Database username for authentication - `db_name`: Name of the ArangoDB database diff --git a/site/content/gen-ai/services/retriever.md b/site/content/ai-services/reference/retriever.md similarity index 96% rename from site/content/gen-ai/services/retriever.md rename to site/content/ai-services/reference/retriever.md index 9c1f03c0cd..5aba44eacc 100644 --- a/site/content/gen-ai/services/retriever.md +++ b/site/content/ai-services/reference/retriever.md @@ -7,7 +7,7 @@ description: >- weight: 15 --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -84,8 +84,8 @@ entities, or relationships. The Retriever service can be configured to use either the Triton Inference Server (for private LLM deployments) or OpenAI/OpenRouter (for public LLM deployments). -To start the service, use the GenAI service endpoint `/v1/graphragretriever`. -Please refer to the documentation of [GenAI service](gen-ai.md) for more +To start the service, use the AI service endpoint `/v1/graphragretriever`. +Please refer to the documentation of [AI service](gen-ai.md) for more information on how to use it. ### Using Triton Inference Server (Private LLM) @@ -236,7 +236,7 @@ GET /v1/health You can verify the state of the retriever process via the following endpoint: ``` -GET /gen-ai/v1/project_by_name/<your_project> +GET /ai/v1/project_by_name/<your_project> ``` For example, the `status` object found within `retrieverServices` may contain the following diff --git a/site/content/gen-ai/services/triton-inference-server.md b/site/content/ai-services/reference/triton-inference-server.md similarity index 92% rename from site/content/gen-ai/services/triton-inference-server.md rename to site/content/ai-services/reference/triton-inference-server.md index e1a7ca4112..43b96d4bc4 100644 --- a/site/content/gen-ai/services/triton-inference-server.md +++ b/site/content/ai-services/reference/triton-inference-server.md @@ -6,7 +6,7 @@ description: >- weight: 30 --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -21,7 +21,7 @@ and seamless Kubernetes integration. ## Workflow The Triton LLM Host enables your GraphRAG pipeline to use privately hosted -LLMs directly from the ArangoDB Platform environment. The process involves the +LLMs directly from the Arango Data Platform environment. The process involves the following steps: 1. Install the Triton LLM Host service. @@ -37,14 +37,14 @@ more about the service and how to interact with it. ## Deployment The Triton LLM Host service is deployed as a **Kubernetes application** using Helm charts in -the ArangoDB Platform ecosystem. It integrates with the: +the Arango Data Platform ecosystem. It integrates with the: - MLFlow model registry for model management. - Storage sidecar for artifact storage. -## Installation via GenAI Service API +## Installation via AI Service API To install the Triton LLM Host service, send an API request to the -**GenAI service** using the following parameters: +**AI service** using the following parameters: ### Required parameters @@ -165,18 +165,18 @@ requests for example. Refer to the specific service with which you are using Triton Inference Server for more details. {{< /info >}} -- **Internal access (within ArangoDB Platform)**: +- **Internal access (within Arango Data Platform)**: `https://{SERVICE_ID}.{KUBERNETES_NAMESPACE}.svc:8000` - `KUBERNETES_NAMESPACE` is available as an environment variable. - - `SERVICE_ID` is returned by the GenAI service API. + - `SERVICE_ID` is returned by the AI service API. **Example**: To check server health: `GET https://{SERVICE_ID}.{KUBERNETES_NAMESPACE}.svc:8000/v2/health/ready` -- **External access (outside ArangoDB Platform)**: +- **External access (outside Arango Data Platform)**: `https://{BASE_URL}:8529/llm/{SERVICE_POSTFIX}/` - - `BASE_URL`: Your ArangoDB Platform base URL. + - `BASE_URL`: Your Arango Data Platform base URL. - `SERVICE_POSTFIX`: Last 5 characters of the service ID. **Example**: diff --git a/site/content/amp/_index.md b/site/content/amp/_index.md index e43ab5ae79..991f8e0dd1 100644 --- a/site/content/amp/_index.md +++ b/site/content/amp/_index.md @@ -1,6 +1,6 @@ --- title: Arango Managed Platform (AMP) -menuTitle: Managed Platform +menuTitle: Arango Managed Platform weight: 4 description: >- The Arango Managed Platform (AMP) provides the entire functionality of @@ -8,6 +8,8 @@ description: >- aliases: - arangograph/changelog --- +{{< cloudbanner>}} + The [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), formerly called Oasis, provides ArangoDB databases as a Service (DBaaS). It enables you to use the entire functionality of an ArangoDB cluster diff --git a/site/content/arangodb/3.12/aql/functions/vector.md b/site/content/arangodb/3.12/aql/functions/vector.md index 8b6bcb377d..62ebe4352d 100644 --- a/site/content/arangodb/3.12/aql/functions/vector.md +++ b/site/content/arangodb/3.12/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../../../gen-ai/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../../ai-services/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. {{< warning >}} diff --git a/site/content/arangodb/3.12/deploy/_index.md b/site/content/arangodb/3.12/deploy/_index.md index 499c517066..cacd720b1a 100644 --- a/site/content/arangodb/3.12/deploy/_index.md +++ b/site/content/arangodb/3.12/deploy/_index.md @@ -43,14 +43,14 @@ on a single DB-Server node for better performance and with transactional guarantees similar to a single server deployment. OneShard is primarily intended for multi-tenant use cases. -### ArangoDB Platform +### Arango Data Platform -The ArangoDB Platform is the umbrella for deploying and operating the entire +The Arango Data Platform is the umbrella for deploying and operating the entire ArangoDB product offering with a unified interface in a Kubernetes cluster. It is offered for self-hosting on-prem or in the cloud and as a managed service, superseding the Arango Managed Platform (AMP). -See [The ArangoDB Platform](../../../data-platform/about/_index.md) for details. +See [The ArangoDB Platform](../../../data-platform/_index.md) for details. ## How to deploy diff --git a/site/content/arangodb/3.12/features/_index.md b/site/content/arangodb/3.12/features/_index.md index 85b1f4bdde..768a1e24f5 100644 --- a/site/content/arangodb/3.12/features/_index.md +++ b/site/content/arangodb/3.12/features/_index.md @@ -22,8 +22,8 @@ aliases: See the full [Feature list of the ArangoDB database system](list.md). For a scalable architecture based on Kubernetes that supports the full offering -of ArangoDB including graph-powered machine learning and GenAI features, see -the [Feature list of the ArangoDB Platform](../../../data-platform/about/features.md). +of ArangoDB including graph-powered machine learning and AI features, see +the [Feature list of the Arango Data Platform](../../../data-platform/features.md). ## On-premises versus Cloud diff --git a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md index 174e095f16..8e81c3f2ca 100644 --- a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -30,7 +30,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the vector index feature. -2. Calculate vector embeddings using [Arango's GraphML](../../../../../gen-ai/graphml/_index.md) +2. Calculate vector embeddings using [Arango's GraphML](../../../../../ai-services/graphml/_index.md) capabilities (available in the AI Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/arangodb/3.13/aql/functions/vector.md b/site/content/arangodb/3.13/aql/functions/vector.md index 8b6bcb377d..62ebe4352d 100644 --- a/site/content/arangodb/3.13/aql/functions/vector.md +++ b/site/content/arangodb/3.13/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../../../gen-ai/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../../ai-services/graphml/_index.md) capabilities (available in ArangoGraph) or using external tools. {{< warning >}} diff --git a/site/content/arangodb/3.13/deploy/_index.md b/site/content/arangodb/3.13/deploy/_index.md index 499c517066..26defb9066 100644 --- a/site/content/arangodb/3.13/deploy/_index.md +++ b/site/content/arangodb/3.13/deploy/_index.md @@ -43,14 +43,14 @@ on a single DB-Server node for better performance and with transactional guarantees similar to a single server deployment. OneShard is primarily intended for multi-tenant use cases. -### ArangoDB Platform +### Arango Data Platform -The ArangoDB Platform is the umbrella for deploying and operating the entire +The Arango Data Platform is the umbrella for deploying and operating the entire ArangoDB product offering with a unified interface in a Kubernetes cluster. It is offered for self-hosting on-prem or in the cloud and as a managed service, superseding the Arango Managed Platform (AMP). -See [The ArangoDB Platform](../../../data-platform/about/_index.md) for details. +See the [Arango Data Platform](../../../data-platform/_index.md) for details. ## How to deploy diff --git a/site/content/arangodb/3.13/features/_index.md b/site/content/arangodb/3.13/features/_index.md index 85b1f4bdde..768a1e24f5 100644 --- a/site/content/arangodb/3.13/features/_index.md +++ b/site/content/arangodb/3.13/features/_index.md @@ -22,8 +22,8 @@ aliases: See the full [Feature list of the ArangoDB database system](list.md). For a scalable architecture based on Kubernetes that supports the full offering -of ArangoDB including graph-powered machine learning and GenAI features, see -the [Feature list of the ArangoDB Platform](../../../data-platform/about/features.md). +of ArangoDB including graph-powered machine learning and AI features, see +the [Feature list of the Arango Data Platform](../../../data-platform/features.md). ## On-premises versus Cloud diff --git a/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md index 174e095f16..8e81c3f2ca 100644 --- a/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -30,7 +30,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the vector index feature. -2. Calculate vector embeddings using [Arango's GraphML](../../../../../gen-ai/graphml/_index.md) +2. Calculate vector embeddings using [Arango's GraphML](../../../../../ai-services/graphml/_index.md) capabilities (available in the AI Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/arangodb/3.13/release-notes/platform.md b/site/content/arangodb/3.13/release-notes/platform.md index 850dc4df8b..1eb76ad190 100644 --- a/site/content/arangodb/3.13/release-notes/platform.md +++ b/site/content/arangodb/3.13/release-notes/platform.md @@ -6,7 +6,7 @@ description: >- Features and improvements in the ArangoDB Platform --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The ArangoDB Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -17,17 +17,17 @@ the ArangoDB team. The ArangoDB Platform is a scalable architecture that offers you all features of the core ArangoDB database system along with graph-powered machine learning -and GenAI capabilities as a single solution with a unified interface. Deploy the +and AI capabilities as a single solution with a unified interface. Deploy the Platform on-premise or in the cloud on top of Kubernetes. To get started, see [Self-host the ArangoDB Platform](../components/platform.md#self-host-the-arangodb-platform). -### GenAI Suite +### AI Services -The ArangoDB Platform features a dedicated GenAI and data science suite, built upon +The ArangoDB Platform features dedicated AI and data science services, built upon the powerful ArangoDB database core. -The GenAI suite consists of the following components, each featuring an intuitive, +AI Services consists of the following components, each featuring an intuitive, user-friendly interface seamlessly integrated into the ArangoDB Platform web interface: - GraphRAG - GraphML @@ -35,5 +35,5 @@ user-friendly interface seamlessly integrated into the ArangoDB Platform web int - MLflow integration - Graph Visualizer -To learn more, see the [GenAI Suite](../../../gen-ai/_index.md) +To learn more, see [AI Services](../../../ai-services/_index.md) documentation. diff --git a/site/content/data-platform/_index.md b/site/content/data-platform/_index.md index 84f9764a1f..82380cfb08 100644 --- a/site/content/data-platform/_index.md +++ b/site/content/data-platform/_index.md @@ -1,20 +1,51 @@ --- -title: Recommended Resources -menuTitle: Data Platform +title: Arango Data Platform +menuTitle: Arango Data Platform weight: 1 -layout: default +description: >- + The Arango Data Platform brings everything ArangoDB offers together to a single + solution that you can deploy on-prem or use as a managed service --- -{{< cloudbanner >}} + +{{< tip >}} +The Arango Data Platform & AI Services are available as a pre-release. To get +exclusive early access, [get in touch](https://arangodb.com/contact/) with +the ArangoDB team. +{{< /tip >}} + +The Arango Data Platform is a **Kubernetes-native** technical infrastructure that acts as the umbrella +for hosting the entire ArangoDB offering of products. Built from the ground up for +cloud-native orchestration, the platform leverages the power of Kubernetes to make it easy +to deploy, scale, and operate the core ArangoDB database system along with any additional +AI solutions for GraphRAG, graph machine learning, data explorations, and more. You can +run it on-premises or in the cloud yourself on top of Kubernetes to access all +of the platform features with enterprise-grade automation and reliability. {{< cards >}} -{{% card title="What is the ArangoDB Platform?" link="about/" %}} -The ArangoDB Platform is the umbrella for hosting the entire ArangoDB offering -of products, including GraphML and GraphRAG. +{{% card title="Get started with the Arango Data Platform" link="get-started/" %}} +Deploy the core ArangoDB database system with Kubernetes orchestration. +Optionally add AI Services to turn data into an AI-powered knowledge engine. +{{% /card %}} + +{{% card title="Features and Architecture" link="features/" %}} +Explore the Kubernetes-native architecture, unified interface, and enterprise-grade capabilities of the Arango Data Platform. +{{% /card %}} + +{{% card title="ArangoDB Kubernetes Operator" link="../../arangodb/3.12/deploy/kubernetes/" %}} +Learn about the official ArangoDB Kubernetes Operator that powers the Arango Data Platform. {{% /card %}} {{% card title="Graph Visualizer" link="graph-visualizer/" %}} -Explore your graph data with an intuitive web interface. +Explore your graph data with an intuitive web interface and sophisticated querying capabilities. +{{% /card %}} + +{{% card title="AI Services" link="../../ai-services/" %}} +Supercharge your platform with GraphRAG, GraphML, and advanced analytics for AI-powered data insights. +{{% /card %}} + +{{% card title="ArangoDB Core Database" link="../../arangodb/3.12/" %}} +Discover the multi-model database at the heart of the platform supporting graphs, documents, key-value, and vector search. {{% /card %}} {{< /cards >}} diff --git a/site/content/data-platform/about/features.md b/site/content/data-platform/about/features.md deleted file mode 100644 index 65f61afc50..0000000000 --- a/site/content/data-platform/about/features.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Feature list of the ArangoDB Platform -menuTitle: ArangoDB Platform -weight: 10 -description: >- - The ArangoDB Platform is a scalable architecture that gets you all features - of ArangoDB including graph-powered machine learning and GenAI as a single - solution with a unified interface ---- -## Architecture - -- **Core Database**: The ArangoDB database system forms the solid core - of the ArangoDB Platform. - -- **Kubernetes**: An open-source container orchestration system for automating - software deployment, scaling, and management designed by Google. It is the - autopilot for operating ArangoDB clusters and the additional Platform services. - -- **Helm**: A package manager for Kubernetes that enables consistent, repeatable - installations and version control. - -- **Envoy**: A high-performance service proxy that acts as the gateway for the - ArangoDB Platform for centralizing authentication and routing. - -- **Web interface**: The Platform includes a unified, browser-based UI that lets - you access its features in an intuitive way. Optional products like the - GenAI Suite seamlessly integrate into the UI if installed. - -## Features - -- [**ArangoDB Core**](../../arangodb/3.12/_index.md): The ArangoDB database system with support for - graphs, documents, key-value, full-text search, and vector search. - -- [**Graph Visualizer**](../graph-visualizer.md): - A web-based tool for exploring your graph data with an intuitive interface and - sophisticated querying capabilities. - -- [**Graph Analytics**](../../gen-ai/graph-analytics.md): - A service that can efficiently load graph data from the core database system - and run graph algorithms such as PageRank and many more. - -- [**GenAI Suite**](../../gen-ai/_index.md): - ArangoDB's graph-powered machine learning (GraphML) as well as GraphRAG for - automatically building knowledge graphs from text and taking advantage of both - excerpts and higher-level summaries as context for turbocharging GenAI - applications. - -- [**Notebook servers**](../../gen-ai/notebook-servers.md): - Run Jupyter kernels in the Platform for hosting interactive, Python-based - notebooks to experiment and develop applications. - -- [**MLflow integration**](../../gen-ai/services/mlflow.md): - Use the popular MLflow for machine learning practitioners as part of the - ArangoDB Platform. diff --git a/site/content/data-platform/features.md b/site/content/data-platform/features.md new file mode 100644 index 0000000000..1979d9f5bf --- /dev/null +++ b/site/content/data-platform/features.md @@ -0,0 +1,81 @@ +--- +title: Feature list of the Arango Data Platform +menuTitle: Features +weight: 5 +description: >- + The Arango Data Platform is a scalable Kubernetes-native architecture that gets you all features + of ArangoDB as a single solution with a unified interface +--- +## Architecture + +The Arango Data Platform is built on a modern, cloud-native foundation designed for enterprise scalability and reliability. + +{{< tip >}} +**Kubernetes-Native Architecture**: Built as a cloud-native platform that leverages +[Kubernetes](https://kubernetes.io/) for container orchestration, automated deployment, +scaling, and management. Powered by the official +[ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/) for +enterprise-grade database management and high availability. +{{< /tip >}} + +- **Core Database**: The ArangoDB database system forms the solid core + of the Arango Data Platform. + +- **Helm**: A package manager for Kubernetes that enables consistent, repeatable + installations and version control. + +- **Envoy**: A high-performance service proxy that acts as the gateway for the + Arango Data Platform for centralizing authentication and routing. + +- **Web interface**: The Platform includes a unified, browser-based UI that lets + you access its features in an intuitive way. Optional products like the + AI Services seamlessly integrate into the UI if installed. + +## Kubernetes Integration + +At its core, the Arango Data Platform is purpose-built for Kubernetes environments, leveraging the +[official ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/) +(`kube-arangodb`) to deliver enterprise-grade automation, scalability, and operational excellence. + +## Features + +The Arango Data Platform provides these core capabilities out of the box: + +- [**ArangoDB Core**](../arangodb/3.12/_index.md): The ArangoDB database system with support for + graphs, documents, key-value, full-text search, and vector search. + +- [**Graph Visualizer**](graph-visualizer.md): + A web-based tool for exploring your graph data with an intuitive interface and + sophisticated querying capabilities. + +## Extend the Arango Data Platform with AI capabilities + +Take your Arango Data Platform to the next level with [**AI Services**](../ai-services/_index.md) that offers advanced AI and machine learning capabilities that integrate seamlessly into the platform's unified web interface. + +What you get with AI Services: + +- [GraphRAG](../ai-services/graphrag/): Generate knowledge graphs from documents and enable + conversational querying of your data. +- [GraphML](../ai-services/graphml/): Apply machine learning algorithms that leverage graph + structure for better predictions. +- [Graph Analytics](../ai-services/graph-analytics/): Run advanced algorithms like PageRank + to discover influential nodes and patterns. +- [Jupyter notebooks](../ai-services/notebook-servers.md): Run Jupyter Notebooks to build and + experiment with graph-powered data, AI, and machine learning workflows directly connected + to ArangoDB databases. +- Public and private LLM support: Use public LLMs such as OpenAI + or private LLMs with [Triton Inference Server](../ai-services/reference/triton-inference-server.md). +- [MLflow integration](../ai-services/reference/mlflow.md): Use the popular MLflow as a model registry + for private LLMs or to run machine learning experiments as part of the Arango Data Platform. + +{{< tip >}} +AI Services integrate directly into the existing platform interface, no need for +separate systems to manage or learn. A separate license is required. +{{< /tip >}} + + + + + + + diff --git a/site/content/data-platform/about/_index.md b/site/content/data-platform/get-started.md similarity index 62% rename from site/content/data-platform/about/_index.md rename to site/content/data-platform/get-started.md index a7e7925af8..a47c4aa5ea 100644 --- a/site/content/data-platform/about/_index.md +++ b/site/content/data-platform/get-started.md @@ -1,87 +1,50 @@ --- -title: The ArangoDB Platform -menuTitle: Platform -weight: 5 +title: Get Started with the Arango Data Platform +menuTitle: Get Started +weight: 10 description: >- - The ArangoDB Platform brings everything ArangoDB offers together to a single + The Arango Data Platform brings everything ArangoDB offers together to a single solution that you can deploy on-prem or use as a managed service --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} -The ArangoDB Platform is a technical infrastructure that acts as the umbrella +The Arango Data Platform is a technical infrastructure that acts as the umbrella for hosting the entire ArangoDB offering of products. The Platform makes it easy to deploy and operate the core ArangoDB database system along with any additional ArangoDB products for machine learning, data explorations, and more. You can run it on-premises or in the cloud yourself on top of Kubernetes to access all of the platform features. -## Features of the ArangoDB Platform - -- **Core database system**: The ArangoDB graph database system for storing - interconnected data.{{< comment >}} You can use the free Community Edition or the commercial - Enterprise Edition.{{< /comment >}} -- **Graph Visualizer**: A web-based tool for exploring your graph data with an - intuitive interface and sophisticated querying capabilities. -- **Graph Analytics**: A suite of graph algorithms including PageRank, - community detection, and centrality measures with support for GPU - acceleration thanks to Nvidia cuGraph. -- **GenAI Suite**: A set of machine learning services, APIs, and - user interfaces that are available as a package as well as individual products. - - **GraphML**: A turnkey solution for graph machine learning for prediction - use cases such as fraud detection, supply chain, healthcare, retail, and - cyber security. - - **GraphRAG**: Leverage ArangoDB's graph, document, key-value, - full-text search, and vector search features to streamline knowledge - extraction and retrieval. - {{< comment >}}TODO: Not available in prerelease version - - **Txt2AQL**: Unlock natural language querying with a service that converts - user input into ArangoDB Query Language (AQL), powered by fine-tuned - private or public LLMs. - {{< /comment >}} - - **GraphRAG Importer**: Extract entities and relationships from large - text-based files, converting unstructured data into a knowledge graph - stored in ArangoDB. - - **GraphRAG Retriever**: Perform semantic similarity searches or aggregate - insights from graph communities with global and local queries. - - **Public and private LLM support**: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../../gen-ai/services/triton-inference-server.md). - - **MLflow integration**: Use the popular MLflow as a model registry for private LLMs - or to run machine learning experiments as part of the ArangoDB Platform. -- **Jupyter notebooks**: Run a Jupyter kernel in the platform for hosting - interactive notebooks for experimentation and development of applications - that use ArangoDB as their backend. -{{< comment >}}TODO: Mostly unrelated to Platform, vector index in core, -- **Vector embeddings**: You can train machine learning models for later use - in vector search in conjunction with the core database system's `vector` - index type. It allows you to find similar items in your dataset. -{{< /comment >}} - -## Get started with the ArangoDB Platform +## Use the Arango Data Platform as a managed service -### Use the ArangoDB Platform as a managed service - -The ArangoDB Platform is not available as a managed service yet, but it will +The Arango Data Platform is not available as a managed service yet, but it will become available for the [Arango Managed Platform (AMP)](../../amp/_index.md) in the future. Until then, you can request early access to the self-hosted -ArangoDB Platform for testing. +Arango Data Platform for testing. -### Self-host the ArangoDB Platform +## Self-host the Arango Data Platform -You can set up and run the ArangoDB Platform on-premises or in the cloud and +You can set up and run the Arango Data Platform on-premises or in the cloud and manage this deployment yourself. -#### Requirements for self-hosting +{{< info >}} +**Kubernetes-Native**: The Arango Data Platform is built specifically for Kubernetes +environments and relies on the official [ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/) +to provide automated deployment, scaling, and management capabilities. +{{< /info >}} + +### Requirements for self-hosting -- **Early access to the ArangoDB Platform**: +- **Early access to the Arango Data Platform**: [Get in touch](https://arangodb.com/contact/) with the ArangoDB team to get - exclusive early access to the pre-release of the ArangoDB Platform & GenAI Suite. + exclusive early access to the pre-release of the Arango Data Platform & AI Services. - **Kubernetes**: Orchestrates the selected services that comprise the - ArangoDB Platform, running them in containers for safety and scalability. + Arango Data Platform, running them in containers for safety and scalability. Set up a [Kubernetes](https://kubernetes.io/) cluster if you don't have one available yet. @@ -109,9 +72,9 @@ manage this deployment yourself. respective packages. {{< /comment >}} -#### Setup +### Setup -1. Obtain a zip package of the ArangoDB Platform for the offline installation. +1. Obtain a zip package of the Arango Data Platform for the offline installation. It includes helm charts, manifests, and blobs of the container image layers. You also receive a package configuration file from the ArangoDB team. @@ -142,7 +105,7 @@ manage this deployment yourself. --set crds.enabled=true ``` -4. Install the ArangoDB operator for Kubernetes `kube-arangodb` with helm, +4. Install the [ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/) `kube-arangodb` with helm, with options to enable webhooks, certificates, and the gateway feature. ```sh @@ -190,7 +153,7 @@ manage this deployment yourself. # ... ``` -6. Download the ArangoDB Platform CLI tool `arangodb_operator_platform` from +6. Download the Arango Data Platform CLI tool `arangodb_operator_platform` from <https://github.com/arangodb/kube-arangodb/releases>. It is available for Linux and macOS, for the x86-64 as well as 64-bit ARM architecture (e.g. `arangodb_operator_platform_linux_amd64`). @@ -202,7 +165,7 @@ manage this deployment yourself. The Platform CLI tool simplifies the further setup and later management of the Platform's Kubernetes services. -7. Import the zip package of the ArangoDB Platform into the container registry. +7. Import the zip package of the Arango Data Platform into the container registry. Replace `platform.zip` with the file path of the offline installation package. Replace `gcr.io/my-reg` with the address of your registry. @@ -231,13 +194,13 @@ manage this deployment yourself. ## Interfaces -The ArangoDB Platform uses a gateway to make all its services available via a +The Arango Data Platform uses a gateway to make all its services available via a single port at the external address of the deployment. For a local deployment, the base URL is `https://127.0.0.1:8529`. ### Unified web interface -You can access the ArangoDB Platform web interface with a browser by appending +You can access the Arango Data Platform web interface with a browser by appending `/ui/` to the base URL, e.g. `https://127.0.0.1:8529/ui/`. ### ArangoDB Core diff --git a/site/content/data-platform/release-notes.md b/site/content/data-platform/release-notes.md index d5d4db5fa9..6800b2ac31 100644 --- a/site/content/data-platform/release-notes.md +++ b/site/content/data-platform/release-notes.md @@ -1,39 +1,39 @@ --- -title: What's new in the ArangoDB Platform +title: What's new in the Arango Data Platform menuTitle: Release notes weight: 50 description: >- - Features and improvements in the ArangoDB Platform + Features and improvements in the Arango Data Platform --- {{< tip >}} -The ArangoDB Platform & GenAI Suite is available as a pre-release. To get +The Arango Data Platform & AI Services are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} -## ArangoDB Platform +## Arango Data Platform <small>Introduced in: v3.12.5</small> -The ArangoDB Platform is a scalable architecture that offers you all features +The Arango Data Platform is a scalable architecture that offers you all features of the core ArangoDB database system along with graph-powered machine learning -and GenAI capabilities as a single solution with a unified interface. Deploy the +and AI capabilities as a single solution with a unified interface. Deploy the Platform on-premise or in the cloud on top of Kubernetes. -To get started, see [Self-host the ArangoDB Platform](about/_index.md#self-host-the-arangodb-platform). +To get started, see [Self-host the Arango Data Platform](./get-started.md#self-host-the-arango-data-platform). -### GenAI Suite +### AI Services -The ArangoDB Platform features a dedicated GenAI and data science suite, built upon +The Arango Data Platform features dedicated AI and data science services, built upon the powerful ArangoDB database core. -The GenAI suite consists of the following components, each featuring an intuitive, -user-friendly interface seamlessly integrated into the ArangoDB Platform web interface: +AI Services consists of the following components, each featuring an intuitive, +user-friendly interface seamlessly integrated into the Arango Data Platform web interface: - GraphRAG - GraphML - Jupyter Notebooks - MLflow integration - Graph Visualizer -To learn more, see the [GenAI Suite](../gen-ai/_index.md) +To learn more, see [AI Services](../ai-services/_index.md) documentation. diff --git a/site/content/gen-ai/_index.md b/site/content/gen-ai/_index.md deleted file mode 100644 index caa176ae72..0000000000 --- a/site/content/gen-ai/_index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Recommended Resources -menuTitle: 'GenAI Data Platform' -weight: 2 -layout: default ---- -{{< cloudbanner >}} - -{{< cards >}} - -{{% card title="GraphRAG" link="graphrag/" %}} -Arango's GenAI solution for generating knowledge graphs from documents -and chatting with your data. -{{% /card %}} - -{{% card title="GraphML" link="graphml/" %}} -Discover Arango's graph-powered machine learning features. -{{% /card %}} - -{{% card title="Graph Analytics" link="graph-analytics/" %}} -Run algorithms such as PageRank on your graph data. -{{% /card %}} - -{{< /cards >}} diff --git a/site/content/gen-ai/services/_index.md b/site/content/gen-ai/services/_index.md deleted file mode 100644 index 8df04c2c84..0000000000 --- a/site/content/gen-ai/services/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: GenAI services -menuTitle: Services -description: '' ---- - diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html index 9244cbf9dc..189c6e9b99 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html @@ -1,7 +1,7 @@ {{ $tooltips := dict "AMP" "This feature is available in the Arango Managed Platform (AMP)" - "Data Platform" "This feature is available in the Arango Data Platform and GenAI Data Platform" - "GenAI Data Platform" "This feature is available in the Arango GenAI Data Platform but not the Data Platform" + "Data Platform" "This feature is available in the Arango Data Platform and AI Services Data Platform" + "AI Services Data Platform" "This feature is available in the Arango AI Services Data Platform but not the Data Platform" "arangosh" "This feature is available in the ArangoDB Shell" "ArangoDB Enterprise Edition" "This feature is available in the Enterprise Edition but not the Community Edition of ArangoDB" -}} From 25eac9f7ee7a16f84c0b0df5709700b37ddf7c53 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 18:44:18 +0200 Subject: [PATCH 31/44] Update tag tooltips --- .../arangodb-docs-theme/layouts/shortcodes/tag.html | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html index 189c6e9b99..f90c12ee44 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html @@ -1,12 +1,14 @@ {{ $tooltips := dict - "AMP" "This feature is available in the Arango Managed Platform (AMP)" - "Data Platform" "This feature is available in the Arango Data Platform and AI Services Data Platform" - "AI Services Data Platform" "This feature is available in the Arango AI Services Data Platform but not the Data Platform" - "arangosh" "This feature is available in the ArangoDB Shell" + "Experimental" "This feature is available for testing but may still change or get removed" + "AMP" "This feature is available in the Arango Managed Platform (AMP)" + "Data Platform" "This feature is available in the Arango Data Platform and Arango AI Data Platform" + "AI Data Platform" "This feature is available in the Arango AI Data Platform but not the Arango Data Platform without the AI Services" + "arangosh" "This feature is available in the ArangoDB Shell" "ArangoDB Enterprise Edition" "This feature is available in the Enterprise Edition but not the Community Edition of ArangoDB" -}} + <p class="labels"> {{ range $.Params }} <span class="label"{{ with index $tooltips . }} title="{{ . }}"{{ end }}>{{ . }}</span> {{ end }} -</p> +</p> \ No newline at end of file From 3737b481719968c9eea1e95e73956c8ebf7d62c4 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 18:44:31 +0200 Subject: [PATCH 32/44] Fix tab name in Graph Analytics --- site/content/ai-services/graph-analytics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/content/ai-services/graph-analytics.md b/site/content/ai-services/graph-analytics.md index cef7730962..9dd39d3c85 100644 --- a/site/content/ai-services/graph-analytics.md +++ b/site/content/ai-services/graph-analytics.md @@ -40,7 +40,7 @@ How to perform the steps is detailed in the subsequent sections. {{< tabs "platforms" >}} -{{< tab "Arango Data Platform" >}} +{{< tab "AI Data Platform" >}} 1. Determine the approximate size of the data that you will load into the GAE and ensure the machine to run the engine on has sufficient memory. The data as well as the temporarily needed space for computations and results needs to fit in memory. From 73909a4c2df435af6da88fc953e29bb4c86f6874 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 18:44:44 +0200 Subject: [PATCH 33/44] Graph Intelligence -> Graphs also in menu --- site/content/arangodb/3.12/graphs/_index.md | 2 +- site/content/arangodb/3.13/graphs/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/content/arangodb/3.12/graphs/_index.md b/site/content/arangodb/3.12/graphs/_index.md index 76d5771e20..29eb32cbe5 100644 --- a/site/content/arangodb/3.12/graphs/_index.md +++ b/site/content/arangodb/3.12/graphs/_index.md @@ -1,6 +1,6 @@ --- title: Graphs -menuTitle: Graph Intelligence +menuTitle: Graphs weight: 75 description: >- Graphs let you represent things and the relationships between them using diff --git a/site/content/arangodb/3.13/graphs/_index.md b/site/content/arangodb/3.13/graphs/_index.md index 76d5771e20..29eb32cbe5 100644 --- a/site/content/arangodb/3.13/graphs/_index.md +++ b/site/content/arangodb/3.13/graphs/_index.md @@ -1,6 +1,6 @@ --- title: Graphs -menuTitle: Graph Intelligence +menuTitle: Graphs weight: 75 description: >- Graphs let you represent things and the relationships between them using From f5621c496b1b43fc633fec063a7ee21ebc2ccc20 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 18:45:47 +0200 Subject: [PATCH 34/44] ArangoGraph -> AMP in oasisctl generator --- toolchain/scripts/generators/oasisctl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toolchain/scripts/generators/oasisctl.py b/toolchain/scripts/generators/oasisctl.py index 50f4aa4fda..418c2c8e44 100644 --- a/toolchain/scripts/generators/oasisctl.py +++ b/toolchain/scripts/generators/oasisctl.py @@ -129,7 +129,7 @@ def rewrite_content(data, section, filename, weight): if flags["inFrontMatter"] and not flags["endFrontMatter"]: if line.startswith("description: "): if filename.endswith("/options.md"): - content = content + "description: Command-line client tool for managing ArangoGraph\n" + content = content + "description: Command-line client tool for managing the Arango Managed Platform (AMP)\n" continue if line.startswith("layout: "): @@ -137,7 +137,7 @@ def rewrite_content(data, section, filename, weight): if line.startswith("title: "): if filename.endswith("/options.md"): - content = content + f"title: ArangoGraph Shell oasisctl\nmenuTitle: Options\nweight: {weight}\n" + content = content + f"title: Arango Managed Platform (AMP) Shell oasisctl\nmenuTitle: Options\nweight: {weight}\n" continue menuTitle = "" From 298e66ad335836cb85afe327708f76c6271e7364 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 18:46:19 +0200 Subject: [PATCH 35/44] Change cloud banner alt text --- .../layouts/shortcodes/cloudbanner.html | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html index 0030027cdd..3523400d92 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/cloudbanner.html @@ -1,10 +1,7 @@ <div class="ag-banner"> - <img src="/images/ArangoAMP_logo.svg" alt="ArangoGraph" class="logo" /> - <div> - <div class="ag-info"> - Experience the shortest time to value for a hosted graph DB.</div> - <a class="link" href="https://dashboard.arangodb.cloud/home" target="_agCloud"> - Get Started Today! - </a> - </div> -</div> + <img src="/images/ArangoAMP_logo.svg" alt="Arango Managed Platform (AMP)" class="logo" /> + <div> + <div class="ag-info">Experience the shortest time to value for a hosted graph DB.</div> + <a class="link" href="https://dashboard.arangodb.cloud/home" target="_blank">Get Started Today!</a> + </div> +</div> \ No newline at end of file From 11b874db53361ba1117a0a5841ed64643d60aede Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Fri, 24 Oct 2025 19:02:12 +0200 Subject: [PATCH 36/44] Rename AI Services back to AI Suite Also fix oasisctl page and name capitalization --- README.md | 4 ++- .../{ai-services => ai-suite}/_index.md | 15 ++++++----- .../graph-analytics.md | 2 +- .../{ai-services => ai-suite}/graph-to-ai.md | 4 +-- .../graphml/_index.md | 2 +- .../graphml/notebooks-api.md | 0 .../graphml/quickstart.md | 0 .../{ai-services => ai-suite}/graphml/ui.md | 2 +- .../graphrag/_index.md | 2 +- .../graphrag/technical-overview.md | 4 +-- .../graphrag/tutorial-notebook.md | 2 +- .../graphrag/use-cases.md | 0 .../graphrag/web-interface.md | 4 +-- .../notebook-servers.md | 2 +- .../reference/_index.md | 0 .../reference/gen-ai.md | 2 +- .../reference/importer.md | 2 +- .../reference/mlflow.md | 2 +- .../reference/natural-language-to-aql.md | 0 .../reference/retriever.md | 2 +- .../reference/triton-inference-server.md | 2 +- site/content/amp/oasisctl/_index.md | 16 +++++------ .../amp/security-and-access-control/_index.md | 2 +- .../arangodb/3.10/components/tools/_index.md | 2 +- .../arangodb/3.10/data-science/_index.md | 2 +- .../arangodb/3.11/components/tools/_index.md | 2 +- .../arangodb/3.11/data-science/_index.md | 2 +- .../arangodb/3.12/aql/functions/vector.md | 2 +- .../arangodb/3.12/components/tools/_index.md | 2 +- .../working-with-indexes/vector-indexes.md | 2 +- .../arangodb/3.13/aql/functions/vector.md | 2 +- .../arangodb/3.13/components/tools/_index.md | 2 +- .../working-with-indexes/vector-indexes.md | 2 +- site/content/data-platform/_index.md | 6 ++--- site/content/data-platform/features.md | 27 +++++++------------ site/content/data-platform/get-started.md | 4 +-- .../content/data-platform/graph-visualizer.md | 2 +- site/content/data-platform/release-notes.md | 10 +++---- .../layouts/shortcodes/tag.html | 2 +- 39 files changed, 70 insertions(+), 72 deletions(-) rename site/content/{ai-services => ai-suite}/_index.md (79%) rename site/content/{ai-services => ai-suite}/graph-analytics.md (99%) rename site/content/{ai-services => ai-suite}/graph-to-ai.md (97%) rename site/content/{ai-services => ai-suite}/graphml/_index.md (99%) rename site/content/{ai-services => ai-suite}/graphml/notebooks-api.md (100%) rename site/content/{ai-services => ai-suite}/graphml/quickstart.md (100%) rename site/content/{ai-services => ai-suite}/graphml/ui.md (99%) rename site/content/{ai-services => ai-suite}/graphrag/_index.md (97%) rename site/content/{ai-services => ai-suite}/graphrag/technical-overview.md (97%) rename site/content/{ai-services => ai-suite}/graphrag/tutorial-notebook.md (99%) rename site/content/{ai-services => ai-suite}/graphrag/use-cases.md (100%) rename site/content/{ai-services => ai-suite}/graphrag/web-interface.md (97%) rename site/content/{ai-services => ai-suite}/notebook-servers.md (96%) rename site/content/{ai-services => ai-suite}/reference/_index.md (100%) rename site/content/{ai-services => ai-suite}/reference/gen-ai.md (98%) rename site/content/{ai-services => ai-suite}/reference/importer.md (99%) rename site/content/{ai-services => ai-suite}/reference/mlflow.md (98%) rename site/content/{ai-services => ai-suite}/reference/natural-language-to-aql.md (100%) rename site/content/{ai-services => ai-suite}/reference/retriever.md (99%) rename site/content/{ai-services => ai-suite}/reference/triton-inference-server.md (98%) diff --git a/README.md b/README.md index a6377bb0c3..7f8a38db53 100644 --- a/README.md +++ b/README.md @@ -367,7 +367,7 @@ Inner shortcode Tags let you display badges, usually below a headline. This is mainly used for pointing out if a feature is only available in the -AI Services, the Data Platform, the Arango Managed Platform (AMP), or multiple +AI Suite, the Data Platform, the Arango Managed Platform (AMP), or multiple of them. See [Environment remarks](#environment-remarks) for details. It is also used for [Edition remarks](#edition-remarks) in content before @@ -591,6 +591,8 @@ The following shortcodes also exist but are rarely used: - _Agent_, _Agency_ (uppercase A) - _Arango Managed Platform (AMP)_ and _AMP_ for short, but not ~~Oasis~~, ~~ArangoDB Oasis~~, ~~ArangoDB Cloud~~, ~~ArangoGraph Insights Platform~~, or ~~ArangoGraph~~ + - _Arango Data Platform_, _Arango AI Data Platform_, and _AI Suite_, but not + ~~Arango AI Services Data Platform~~, ~~Arango AI Suite Data Platform~~, ~~AI Services~~, or ~~GenAI Suite~~ - _Deployment mode_ (single server, cluster, etc.), not ~~deployment type~~ - Never capitalize the names of executables or code values, e.g. write diff --git a/site/content/ai-services/_index.md b/site/content/ai-suite/_index.md similarity index 79% rename from site/content/ai-services/_index.md rename to site/content/ai-suite/_index.md index 77bdb3f00a..c149b1fea4 100644 --- a/site/content/ai-services/_index.md +++ b/site/content/ai-suite/_index.md @@ -1,14 +1,17 @@ --- -title: AI Services -menuTitle: AI Services +title: AI Suite +menuTitle: AI Suite weight: 2 description: >- - A comprehensive AI solution that transforms your data into intelligent knowledge graphs with GraphRAG capabilities, applies advanced machine learning with GraphML, and provides enterprise-grade tools for analytics, natural language querying, and AI-powered insights, all through an intuitive web interface + A comprehensive AI solution that transforms your data into intelligent + knowledge graphs with GraphRAG capabilities, applies advanced machine learning + with GraphML, and provides enterprise-grade tools for analytics, + natural language querying, and AI-powered insights, all through an intuitive + web interface --- - ## What's included -AI Services are comprised of two major components: +AI Suite are comprised of two major components: - [**GraphRAG**](./graphrag/_index.md): A complete solution for extracting entities from text files to create a knowledge graph that you can then query with a @@ -31,6 +34,6 @@ Alongside these components, you also get the following additional features: - [**MLflow integration**](reference/mlflow.md): Use the popular MLflow as a model registry for private LLMs or to run machine learning experiments as part of the Arango Data Platform. - **Application Programming Interfaces**: Use the underlying APIs of the - AI Services and build your own integrations. See the + AI Suite and build your own integrations. See the [Protocol Documentation](https://arangoml.github.io/platform-dss-api/GenAI-Service/proto/index.html) for more details. diff --git a/site/content/ai-services/graph-analytics.md b/site/content/ai-suite/graph-analytics.md similarity index 99% rename from site/content/ai-services/graph-analytics.md rename to site/content/ai-suite/graph-analytics.md index 9dd39d3c85..190c6ac1f2 100644 --- a/site/content/ai-services/graph-analytics.md +++ b/site/content/ai-suite/graph-analytics.md @@ -108,7 +108,7 @@ an AMP **API key**. See on how to create one. You then need to generate an **access token** using the API key. See -[Authenticating with Oasisctl](../amp/api/get-started.md#authenticating-with-oasisctl) +[Authenticating with oasisctl](../amp/api/get-started.md#authenticating-with-oasisctl) on how to do so using `oasisctl login`. The [Engine API](#engine-api) uses one of two authentication methods, depending diff --git a/site/content/ai-services/graph-to-ai.md b/site/content/ai-suite/graph-to-ai.md similarity index 97% rename from site/content/ai-services/graph-to-ai.md rename to site/content/ai-suite/graph-to-ai.md index 35bfb04a22..f98f654237 100644 --- a/site/content/ai-services/graph-to-ai.md +++ b/site/content/ai-suite/graph-to-ai.md @@ -10,7 +10,7 @@ aliases: --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -20,7 +20,7 @@ data science applications. The core database system includes multi-model storage of information with scalable graph and information retrieval capabilities that you can directly use for your research and product development. -ArangoDB also offers dedicated AI Services, using the database core +ArangoDB also offers dedicated AI Suite, using the database core as the foundation for higher-level features. Whether you want to turbocharge generative AI applications with a GraphRAG solution or apply analytics and machine learning to graph data at scale, ArangoDB covers these needs. diff --git a/site/content/ai-services/graphml/_index.md b/site/content/ai-suite/graphml/_index.md similarity index 99% rename from site/content/ai-services/graphml/_index.md rename to site/content/ai-suite/graphml/_index.md index e5069ada36..af839ece48 100644 --- a/site/content/ai-services/graphml/_index.md +++ b/site/content/ai-suite/graphml/_index.md @@ -8,7 +8,7 @@ aliases: - arangographml --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/graphml/notebooks-api.md b/site/content/ai-suite/graphml/notebooks-api.md similarity index 100% rename from site/content/ai-services/graphml/notebooks-api.md rename to site/content/ai-suite/graphml/notebooks-api.md diff --git a/site/content/ai-services/graphml/quickstart.md b/site/content/ai-suite/graphml/quickstart.md similarity index 100% rename from site/content/ai-services/graphml/quickstart.md rename to site/content/ai-suite/graphml/quickstart.md diff --git a/site/content/ai-services/graphml/ui.md b/site/content/ai-suite/graphml/ui.md similarity index 99% rename from site/content/ai-services/graphml/ui.md rename to site/content/ai-suite/graphml/ui.md index 042e7e9936..a83f8b5582 100644 --- a/site/content/ai-services/graphml/ui.md +++ b/site/content/ai-suite/graphml/ui.md @@ -22,7 +22,7 @@ giving you a clear path from data to prediction: To create a new GraphML project using the Arango Data Platform web interface, follow these steps: 1. From the left-hand sidebar, select the database where you want to create the project. -2. In the left-hand sidebar, click **AI Services** to open the GraphML project management interface, then click **Run GraphML**. +2. In the left-hand sidebar, click **AI Suite** to open the GraphML project management interface, then click **Run GraphML**. ![Create GraphML Project](../../images/create-graphml-project-ui.png) 3. In the **GraphML projects** view, click **Add new project**. 4. The **Create ML project** modal opens. Enter a **Name** for your machine learning project. diff --git a/site/content/ai-services/graphrag/_index.md b/site/content/ai-suite/graphrag/_index.md similarity index 97% rename from site/content/ai-services/graphrag/_index.md rename to site/content/ai-suite/graphrag/_index.md index 5fea31289b..1174402e92 100644 --- a/site/content/ai-services/graphrag/_index.md +++ b/site/content/ai-suite/graphrag/_index.md @@ -9,7 +9,7 @@ aliases: llm-knowledge-graphs --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/graphrag/technical-overview.md b/site/content/ai-suite/graphrag/technical-overview.md similarity index 97% rename from site/content/ai-services/graphrag/technical-overview.md rename to site/content/ai-suite/graphrag/technical-overview.md index 7a2163a99c..df38361cf6 100644 --- a/site/content/ai-services/graphrag/technical-overview.md +++ b/site/content/ai-suite/graphrag/technical-overview.md @@ -8,7 +8,7 @@ description: >- --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -33,7 +33,7 @@ ArangoDB's unique capabilities and flexible integration of knowledge graphs and LLMs provide a powerful and efficient solution for anyone seeking to extract valuable insights from diverse datasets. -The GraphRAG component of AI Services brings all the capabilities +The GraphRAG component of AI Suite brings all the capabilities together with an easy-to-use interface, so you can make the knowledge accessible to your organization. diff --git a/site/content/ai-services/graphrag/tutorial-notebook.md b/site/content/ai-suite/graphrag/tutorial-notebook.md similarity index 99% rename from site/content/ai-services/graphrag/tutorial-notebook.md rename to site/content/ai-suite/graphrag/tutorial-notebook.md index ffadbad182..fe587e4dc9 100644 --- a/site/content/ai-services/graphrag/tutorial-notebook.md +++ b/site/content/ai-suite/graphrag/tutorial-notebook.md @@ -6,7 +6,7 @@ description: >- weight: 25 --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/graphrag/use-cases.md b/site/content/ai-suite/graphrag/use-cases.md similarity index 100% rename from site/content/ai-services/graphrag/use-cases.md rename to site/content/ai-suite/graphrag/use-cases.md diff --git a/site/content/ai-services/graphrag/web-interface.md b/site/content/ai-suite/graphrag/web-interface.md similarity index 97% rename from site/content/ai-services/graphrag/web-interface.md rename to site/content/ai-suite/graphrag/web-interface.md index f9297b6d23..80c1a4ae07 100644 --- a/site/content/ai-services/graphrag/web-interface.md +++ b/site/content/ai-suite/graphrag/web-interface.md @@ -7,7 +7,7 @@ description: >- using the Platform web interface --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -26,7 +26,7 @@ The entire process is organized into sequential steps within a **Project**: To create a new GraphRAG project using the Arango Data Platform web interface, follow these steps: 1. From the left-hand sidebar, select the database where you want to create the project. -2. In the left-hand sidebar, click **AI Services** to open the GraphRAG project management +2. In the left-hand sidebar, click **AI Suite** to open the GraphRAG project management interface, then click **Run GraphRAG**. 3. In the **GraphRAG projects** view, click **Add new project**. 4. The **Create GraphRAG project** modal opens. Enter a **Name** and optionally diff --git a/site/content/ai-services/notebook-servers.md b/site/content/ai-suite/notebook-servers.md similarity index 96% rename from site/content/ai-services/notebook-servers.md rename to site/content/ai-suite/notebook-servers.md index cfc2f134ba..8606108f1e 100644 --- a/site/content/ai-services/notebook-servers.md +++ b/site/content/ai-suite/notebook-servers.md @@ -8,7 +8,7 @@ aliases: - arangograph-notebooks --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/reference/_index.md b/site/content/ai-suite/reference/_index.md similarity index 100% rename from site/content/ai-services/reference/_index.md rename to site/content/ai-suite/reference/_index.md diff --git a/site/content/ai-services/reference/gen-ai.md b/site/content/ai-suite/reference/gen-ai.md similarity index 98% rename from site/content/ai-services/reference/gen-ai.md rename to site/content/ai-suite/reference/gen-ai.md index e484775fa3..4f59d38bdf 100644 --- a/site/content/ai-services/reference/gen-ai.md +++ b/site/content/ai-suite/reference/gen-ai.md @@ -7,7 +7,7 @@ description: >- weight: 5 --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/reference/importer.md b/site/content/ai-suite/reference/importer.md similarity index 99% rename from site/content/ai-services/reference/importer.md rename to site/content/ai-suite/reference/importer.md index 22142c0ee2..263a3c77aa 100644 --- a/site/content/ai-services/reference/importer.md +++ b/site/content/ai-suite/reference/importer.md @@ -7,7 +7,7 @@ description: >- weight: 10 --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/reference/mlflow.md b/site/content/ai-suite/reference/mlflow.md similarity index 98% rename from site/content/ai-services/reference/mlflow.md rename to site/content/ai-suite/reference/mlflow.md index 39146ba48b..0ec14ccd2a 100644 --- a/site/content/ai-services/reference/mlflow.md +++ b/site/content/ai-suite/reference/mlflow.md @@ -7,7 +7,7 @@ description: >- weight: 25 --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/reference/natural-language-to-aql.md b/site/content/ai-suite/reference/natural-language-to-aql.md similarity index 100% rename from site/content/ai-services/reference/natural-language-to-aql.md rename to site/content/ai-suite/reference/natural-language-to-aql.md diff --git a/site/content/ai-services/reference/retriever.md b/site/content/ai-suite/reference/retriever.md similarity index 99% rename from site/content/ai-services/reference/retriever.md rename to site/content/ai-suite/reference/retriever.md index 5aba44eacc..0d9ac3bc11 100644 --- a/site/content/ai-services/reference/retriever.md +++ b/site/content/ai-suite/reference/retriever.md @@ -7,7 +7,7 @@ description: >- weight: 15 --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/ai-services/reference/triton-inference-server.md b/site/content/ai-suite/reference/triton-inference-server.md similarity index 98% rename from site/content/ai-services/reference/triton-inference-server.md rename to site/content/ai-suite/reference/triton-inference-server.md index 43b96d4bc4..64c6d1fc79 100644 --- a/site/content/ai-services/reference/triton-inference-server.md +++ b/site/content/ai-suite/reference/triton-inference-server.md @@ -6,7 +6,7 @@ description: >- weight: 30 --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/amp/oasisctl/_index.md b/site/content/amp/oasisctl/_index.md index 9d22a68e31..f7a840444f 100644 --- a/site/content/amp/oasisctl/_index.md +++ b/site/content/amp/oasisctl/_index.md @@ -1,18 +1,18 @@ --- -title: Oasisctl -menuTitle: Oasisctl +title: The `oasisctl` tool for the Arango Managed Platform (AMP) +menuTitle: oasisctl weight: 65 description: >- - Command-line client tool for managing the ArangoGraph Insights Platform + A command-line client tool for managing AMP --- -Oasisctl is a command-line tool for using the [ArangoGraph API](../api/_index.md). -This tool makes integration of ArangoGraph in all kinds of (bash) scripts easy. +_oasisctl_ is a command-line tool for using the [Arango Management Platform (AMP) API](../api/_index.md). +This tool makes integration of AMP in all kinds of (bash) scripts easy. It is also a good example on how to use the API. -See [Getting started with Oasisctl](../api/get-started.md) for a +See [Getting started with oasisctl](../api/get-started.md) for a tutorial. -Oasisctl is available for Linux, macOS and Windows. -Download and source code: +_oasisctl_ is available for Linux, macOS and Windows. +Downloads and source code: [github.com/arangodb-managed/oasisctl](https://github.com/arangodb-managed/oasisctl/) diff --git a/site/content/amp/security-and-access-control/_index.md b/site/content/amp/security-and-access-control/_index.md index 81903b4630..45520fa70e 100644 --- a/site/content/amp/security-and-access-control/_index.md +++ b/site/content/amp/security-and-access-control/_index.md @@ -619,7 +619,7 @@ Deployment Z of project DEF | ✓ | — | — ## Restricting access to organizations -To enhance security, you can implement the following restrictions via [Oasisctl](../oasisctl/_index.md): +To enhance security, you can implement the following restrictions via [oasisctl](../oasisctl/_index.md): 1. Limit allowed authentication providers. 2. Specify an allowed domain list. diff --git a/site/content/arangodb/3.10/components/tools/_index.md b/site/content/arangodb/3.10/components/tools/_index.md index 82a6a260f5..6919e13c84 100644 --- a/site/content/arangodb/3.10/components/tools/_index.md +++ b/site/content/arangodb/3.10/components/tools/_index.md @@ -31,4 +31,4 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) +| [oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) diff --git a/site/content/arangodb/3.10/data-science/_index.md b/site/content/arangodb/3.10/data-science/_index.md index c99bf2f601..46d771acf0 100644 --- a/site/content/arangodb/3.10/data-science/_index.md +++ b/site/content/arangodb/3.10/data-science/_index.md @@ -54,7 +54,7 @@ Graph analytics can answer questions like _**Who are the most connected persons* ArangoDB offers _Graph Analytics Engines_ to run algorithms such as connected components, label propagation, and PageRank on your data. This feature is available for the Arango Managed Platform (AMP). See -[Graph Analytics](../../../ai-services/graph-analytics.md) for details. +[Graph Analytics](../../../ai-suite/graph-analytics.md) for details. ### GraphML diff --git a/site/content/arangodb/3.11/components/tools/_index.md b/site/content/arangodb/3.11/components/tools/_index.md index 9909dbe302..318e0379eb 100644 --- a/site/content/arangodb/3.11/components/tools/_index.md +++ b/site/content/arangodb/3.11/components/tools/_index.md @@ -31,5 +31,5 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) +| [oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) | [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/arangodb/3.11/data-science/_index.md b/site/content/arangodb/3.11/data-science/_index.md index 1497af8288..45a4bfd813 100644 --- a/site/content/arangodb/3.11/data-science/_index.md +++ b/site/content/arangodb/3.11/data-science/_index.md @@ -54,7 +54,7 @@ Graph analytics can answer questions like _**Who are the most connected persons* ArangoDB offers _Graph Analytics Engines_ to run algorithms such as connected components, label propagation, and PageRank on your data. This feature is available for the Arango Managed Platform (AMP). See -[Graph Analytics](../../../ai-services/graph-analytics.md) for details. +[Graph Analytics](../../../ai-suite/graph-analytics.md) for details. ### GraphML diff --git a/site/content/arangodb/3.12/aql/functions/vector.md b/site/content/arangodb/3.12/aql/functions/vector.md index 3fc7804750..18c79bc7b8 100644 --- a/site/content/arangodb/3.12/aql/functions/vector.md +++ b/site/content/arangodb/3.12/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../../../ai-services/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../../ai-suite/graphml/_index.md) capabilities (available in the Arango Managed Platform (AMP)) or using external tools. {{< warning >}} diff --git a/site/content/arangodb/3.12/components/tools/_index.md b/site/content/arangodb/3.12/components/tools/_index.md index 9909dbe302..318e0379eb 100644 --- a/site/content/arangodb/3.12/components/tools/_index.md +++ b/site/content/arangodb/3.12/components/tools/_index.md @@ -31,5 +31,5 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) +| [oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) | [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md index 8e81c3f2ca..5162c982cd 100644 --- a/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.12/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -30,7 +30,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the vector index feature. -2. Calculate vector embeddings using [Arango's GraphML](../../../../../ai-services/graphml/_index.md) +2. Calculate vector embeddings using [Arango's GraphML](../../../../../ai-suite/graphml/_index.md) capabilities (available in the AI Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/arangodb/3.13/aql/functions/vector.md b/site/content/arangodb/3.13/aql/functions/vector.md index 3fc7804750..18c79bc7b8 100644 --- a/site/content/arangodb/3.13/aql/functions/vector.md +++ b/site/content/arangodb/3.13/aql/functions/vector.md @@ -12,7 +12,7 @@ To use vector search, you need to have vector embeddings stored in documents and the attribute that stores them needs to be indexed by a [vector index](../../index-and-search/indexing/working-with-indexes/vector-indexes.md). -You can calculate vector embeddings using [ArangoDB's GraphML](../../../../ai-services/graphml/_index.md) +You can calculate vector embeddings using [ArangoDB's GraphML](../../../../ai-suite/graphml/_index.md) capabilities (available in the Arango Managed Platform (AMP)) or using external tools. {{< warning >}} diff --git a/site/content/arangodb/3.13/components/tools/_index.md b/site/content/arangodb/3.13/components/tools/_index.md index 9909dbe302..318e0379eb 100644 --- a/site/content/arangodb/3.13/components/tools/_index.md +++ b/site/content/arangodb/3.13/components/tools/_index.md @@ -31,5 +31,5 @@ Additional tools which are available separately: |-----------------|-------------------| | [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services | [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments -| [Oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) +| [oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) | [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md index 8e81c3f2ca..5162c982cd 100644 --- a/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md +++ b/site/content/arangodb/3.13/index-and-search/indexing/working-with-indexes/vector-indexes.md @@ -30,7 +30,7 @@ startup option needs to be enabled on the deployment you want to restore to. {{< /warning >}} 1. Enable the vector index feature. -2. Calculate vector embeddings using [Arango's GraphML](../../../../../ai-services/graphml/_index.md) +2. Calculate vector embeddings using [Arango's GraphML](../../../../../ai-suite/graphml/_index.md) capabilities (available in the AI Data Platform) or using external tools. Store each vector as an attribute in the respective document. 3. Create a vector index over this attribute. You need to choose which diff --git a/site/content/data-platform/_index.md b/site/content/data-platform/_index.md index 08edf03abb..57bb0980c1 100644 --- a/site/content/data-platform/_index.md +++ b/site/content/data-platform/_index.md @@ -8,7 +8,7 @@ description: >- --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -25,7 +25,7 @@ of the platform features with enterprise-grade automation and reliability. {{% card title="Get started with the Arango Data Platform" link="get-started/" %}} Deploy the core ArangoDB database system with Kubernetes orchestration. -Optionally add AI Services to turn data into an AI-powered knowledge engine. +Optionally add AI Suite to turn data into an AI-powered knowledge engine. {{% /card %}} {{% card title="Features and Architecture" link="features/" %}} @@ -40,7 +40,7 @@ Learn about the official ArangoDB Kubernetes Operator that powers the Arango Dat Explore your graph data with an intuitive web interface and sophisticated querying capabilities. {{% /card %}} -{{% card title="AI Services" link="../../ai-services/" %}} +{{% card title="AI Suite" link="../../ai-suite/" %}} Supercharge your platform with GraphRAG, GraphML, and advanced analytics for AI-powered data insights. {{% /card %}} diff --git a/site/content/data-platform/features.md b/site/content/data-platform/features.md index 1979d9f5bf..dacda654fa 100644 --- a/site/content/data-platform/features.md +++ b/site/content/data-platform/features.md @@ -29,7 +29,7 @@ enterprise-grade database management and high availability. - **Web interface**: The Platform includes a unified, browser-based UI that lets you access its features in an intuitive way. Optional products like the - AI Services seamlessly integrate into the UI if installed. + AI Suite seamlessly integrate into the UI if installed. ## Kubernetes Integration @@ -50,32 +50,25 @@ The Arango Data Platform provides these core capabilities out of the box: ## Extend the Arango Data Platform with AI capabilities -Take your Arango Data Platform to the next level with [**AI Services**](../ai-services/_index.md) that offers advanced AI and machine learning capabilities that integrate seamlessly into the platform's unified web interface. +Take your Arango Data Platform to the next level with the [**AI Suite**](../ai-suite/_index.md) that offers advanced AI and machine learning capabilities that integrate seamlessly into the platform's unified web interface. -What you get with AI Services: +What you get with the AI Suite: -- [GraphRAG](../ai-services/graphrag/): Generate knowledge graphs from documents and enable +- [GraphRAG](../ai-suite/graphrag/): Generate knowledge graphs from documents and enable conversational querying of your data. -- [GraphML](../ai-services/graphml/): Apply machine learning algorithms that leverage graph +- [GraphML](../ai-suite/graphml/): Apply machine learning algorithms that leverage graph structure for better predictions. -- [Graph Analytics](../ai-services/graph-analytics/): Run advanced algorithms like PageRank +- [Graph Analytics](../ai-suite/graph-analytics/): Run advanced algorithms like PageRank to discover influential nodes and patterns. -- [Jupyter notebooks](../ai-services/notebook-servers.md): Run Jupyter Notebooks to build and +- [Jupyter notebooks](../ai-suite/notebook-servers.md): Run Jupyter Notebooks to build and experiment with graph-powered data, AI, and machine learning workflows directly connected to ArangoDB databases. - Public and private LLM support: Use public LLMs such as OpenAI - or private LLMs with [Triton Inference Server](../ai-services/reference/triton-inference-server.md). -- [MLflow integration](../ai-services/reference/mlflow.md): Use the popular MLflow as a model registry + or private LLMs with [Triton Inference Server](../ai-suite/reference/triton-inference-server.md). +- [MLflow integration](../ai-suite/reference/mlflow.md): Use the popular MLflow as a model registry for private LLMs or to run machine learning experiments as part of the Arango Data Platform. {{< tip >}} -AI Services integrate directly into the existing platform interface, no need for +The AI Suite integrate directly into the existing platform interface, no need for separate systems to manage or learn. A separate license is required. {{< /tip >}} - - - - - - - diff --git a/site/content/data-platform/get-started.md b/site/content/data-platform/get-started.md index a47c4aa5ea..de721b874e 100644 --- a/site/content/data-platform/get-started.md +++ b/site/content/data-platform/get-started.md @@ -7,7 +7,7 @@ description: >- solution that you can deploy on-prem or use as a managed service --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -41,7 +41,7 @@ to provide automated deployment, scaling, and management capabilities. - **Early access to the Arango Data Platform**: [Get in touch](https://arangodb.com/contact/) with the ArangoDB team to get - exclusive early access to the pre-release of the Arango Data Platform & AI Services. + exclusive early access to the pre-release of the Arango Data Platform & AI Suite. - **Kubernetes**: Orchestrates the selected services that comprise the Arango Data Platform, running them in containers for safety and scalability. diff --git a/site/content/data-platform/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md index 93d61018bc..081512c2e5 100644 --- a/site/content/data-platform/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -6,7 +6,7 @@ description: >- Visually explore and interact with your ArangoDB graphs through an intuitive interface --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} diff --git a/site/content/data-platform/release-notes.md b/site/content/data-platform/release-notes.md index 6800b2ac31..006c949cdb 100644 --- a/site/content/data-platform/release-notes.md +++ b/site/content/data-platform/release-notes.md @@ -6,7 +6,7 @@ description: >- Features and improvements in the Arango Data Platform --- {{< tip >}} -The Arango Data Platform & AI Services are available as a pre-release. To get +The Arango Data Platform & AI Suite are available as a pre-release. To get exclusive early access, [get in touch](https://arangodb.com/contact/) with the ArangoDB team. {{< /tip >}} @@ -22,12 +22,12 @@ Platform on-premise or in the cloud on top of Kubernetes. To get started, see [Self-host the Arango Data Platform](./get-started.md#self-host-the-arango-data-platform). -### AI Services +### AI Suite -The Arango Data Platform features dedicated AI and data science services, built upon +The Arango AI Data Platform features dedicated AI and data science services, built upon the powerful ArangoDB database core. -AI Services consists of the following components, each featuring an intuitive, +The AI Suite consists of the following components, each featuring an intuitive, user-friendly interface seamlessly integrated into the Arango Data Platform web interface: - GraphRAG - GraphML @@ -35,5 +35,5 @@ user-friendly interface seamlessly integrated into the Arango Data Platform web - MLflow integration - Graph Visualizer -To learn more, see [AI Services](../ai-services/_index.md) +To learn more, see [AI Suite](../ai-suite/_index.md) documentation. diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html index f90c12ee44..8d051207f0 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/tag.html @@ -2,7 +2,7 @@ "Experimental" "This feature is available for testing but may still change or get removed" "AMP" "This feature is available in the Arango Managed Platform (AMP)" "Data Platform" "This feature is available in the Arango Data Platform and Arango AI Data Platform" - "AI Data Platform" "This feature is available in the Arango AI Data Platform but not the Arango Data Platform without the AI Services" + "AI Data Platform" "This feature is available in the Arango AI Data Platform but not the Arango Data Platform without the AI Suite" "arangosh" "This feature is available in the ArangoDB Shell" "ArangoDB Enterprise Edition" "This feature is available in the Enterprise Edition but not the Community Edition of ArangoDB" -}} From 620e441c4e4cd377078f3cb918f6c565aa46dd19 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Sat, 25 Oct 2025 23:40:57 +0200 Subject: [PATCH 37/44] Squashed commit of the following: commit f15a5922af45e27f6607fc34ee4de80e9d434fa5 Merge: e043896e 4480ca8a Author: Simran <Simran-B@users.noreply.github.com> Date: Sat Oct 25 23:30:53 2025 +0200 Merge branch 'main' into DOC-799 commit e043896ef9564a0b8a8cb5cd5c29cc4c662ad851 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 23 12:53:43 2025 +0200 Move image, add View node option commit 49fbafa9687703267c3d238480746513f4c32b45 Merge: d6f3359c cdd39d59 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 23 10:13:04 2025 +0200 Merge branch 'main' of https://github.com/arangodb/docs-hugo into DOC-799 commit d6f3359cc5b4e20d3bdf627701a33a2148ec2057 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 23 10:12:58 2025 +0200 Review feedback, mention that nodes, edges, and theming is remembered commit 6594ebc7c129b027e9bb247232e4ebb92f83d649 Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 13:25:11 2025 +0200 Fix path for icon shortcode commit c12be470dbcf952e6a3ba0b07af11e5c5304fd1a Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 13:17:25 2025 +0200 Review feedback commit 14003ceb9b0373feb61a6a173c66ac873bc5ba09 Author: Simran Spiller <simran@arangodb.com> Date: Wed Oct 22 13:14:53 2025 +0200 Change icon shortcode image path commit 1fc696fc00c87daae08ed3488923908407416cec Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 21 23:23:28 2025 +0200 Icons: Move settings icon to the canvas center commit cc2db4dd5912a01901e8a6db6741bc0458a86d82 Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 16:13:52 2025 +0200 Fix edge styling options commit c38b58e7ac4aabe9151be286d37c43c0f51319c0 Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 15:49:27 2025 +0200 Minor fixes commit f1600ef528a8d038037e8cdcd93c6166f23db9d2 Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 15:36:28 2025 +0200 Update visual customization part commit 144f44d80a89ff6436ee50a598b7b6695d61470d Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 15:36:02 2025 +0200 Extend README for icon shortcode commit 22d82c8ed21b251a07839bd6237ed2f9ed1d6e6f Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 11:37:39 2025 +0200 Rename icon files and mention icon shortcode to README commit 62860ef73a08efc9e97072d5549236485905295e Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 11:00:24 2025 +0200 DOC-813 | Implement icon shortcode and add Graph Visualizer icons commit 0f718a1512c149ccbe5a02709b23308fa3c9db7a Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 10:59:15 2025 +0200 Update descriptions commit 5ee3e0dfd451fb9da480703db571d4b59c2b6aac Author: Simran Spiller <simran@arangodb.com> Date: Tue Oct 14 10:22:55 2025 +0200 Update customization screenshot commit 4d61a71ef25a0d971f4434838e17edef0d000ba1 Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 9 12:39:09 2025 +0200 Icon shortcode prototype commit c595f250cb05fcf2b0070b0700f67e7a2f122d01 Merge: 155a71a0 8a3c37dd Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 9 10:27:01 2025 +0200 Merge branch 'main' of https://github.com/arangodb/docs-hugo into DOC-799 commit 155a71a053be48a63b83271f92304055e9b715ed Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 9 10:26:51 2025 +0200 Update Visualizer screenshots commit 1f925ce359ae4fc9596b117e6048363f14b2d47c Author: Simran Spiller <simran@arangodb.com> Date: Thu Oct 2 09:55:57 2025 +0200 WIP --- site/content/data-platform/graph-visualizer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/content/data-platform/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md index 081512c2e5..971b3ad818 100644 --- a/site/content/data-platform/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -1,7 +1,7 @@ --- title: Graph Visualizer menuTitle: Graph Visualizer -weight: 10 +weight: 20 description: >- Visually explore and interact with your ArangoDB graphs through an intuitive interface --- @@ -330,7 +330,7 @@ You can modify the document attributes of nodes and edges from the canvas as fol 4. Change or delete ({{< icon "delete" >}}) existing properties. 5. In the **Form** mode, you can add new properties by scrolling to the bottom and clicking **Add Property**. -6. Click **Save** to store the changes, or **Cancel** to abort. <!-- TODO: Can't change system attributes, even though _from and _to are generally mutable --> +6. Click **Save** to store the changes, or **Cancel** to abort. ### Delete nodes From ae5de8c4ee75e66afe359668d1bcdd99dc4b06b8 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Sun, 26 Oct 2025 00:37:47 +0200 Subject: [PATCH 38/44] New domain, Arango team/support --- .circleci/base_config.yml | 2 +- .circleci/generate_config.py | 2 +- CIRCLECI.md | 4 ++-- README.md | 17 +++++++++-------- site/config/_default/config.yaml | 2 +- site/content/ai-suite/graph-to-ai.md | 4 ++-- site/content/ai-suite/graphml/_index.md | 4 ++-- site/content/ai-suite/graphml/quickstart.md | 4 ++-- site/content/ai-suite/graphrag/_index.md | 4 ++-- .../ai-suite/graphrag/technical-overview.md | 4 ++-- .../ai-suite/graphrag/tutorial-notebook.md | 4 ++-- site/content/ai-suite/graphrag/web-interface.md | 4 ++-- site/content/ai-suite/notebook-servers.md | 4 ++-- site/content/ai-suite/reference/gen-ai.md | 4 ++-- site/content/ai-suite/reference/importer.md | 4 ++-- site/content/ai-suite/reference/mlflow.md | 4 ++-- site/content/ai-suite/reference/retriever.md | 4 ++-- .../reference/triton-inference-server.md | 4 ++-- .../amp/organizations/credits-and-usage.md | 2 +- .../explaining-queries.md | 4 ++-- .../components/tools/arangoinspect/_index.md | 2 +- .../components/tools/arangoinspect/examples.md | 2 +- .../3.10/data-science/arangograph-notebooks.md | 4 ++-- .../3.10/data-science/arangographml/deploy.md | 4 ++-- .../arangographml/getting-started.md | 4 ++-- .../3.10/operations/troubleshooting/arangod.md | 2 +- .../version-3.0/whats-new-in-3-0.md | 2 +- .../version-3.5/whats-new-in-3-5.md | 2 +- .../version-3.7/whats-new-in-3-7.md | 2 +- .../explaining-queries.md | 2 +- .../components/tools/arangoinspect/_index.md | 2 +- .../components/tools/arangoinspect/examples.md | 2 +- .../3.11/data-science/arangograph-notebooks.md | 4 ++-- .../3.11/data-science/arangographml/deploy.md | 4 ++-- .../arangographml/getting-started.md | 4 ++-- .../3.11/operations/troubleshooting/arangod.md | 2 +- .../version-3.0/whats-new-in-3-0.md | 2 +- .../incompatible-changes-in-3-11.md | 4 ++-- .../version-3.5/whats-new-in-3-5.md | 2 +- .../version-3.7/whats-new-in-3-7.md | 2 +- .../explaining-queries.md | 2 +- .../components/tools/arangoinspect/_index.md | 2 +- .../components/tools/arangoinspect/examples.md | 2 +- .../integrations/arangodb-tinkerpop-provider.md | 4 ++-- .../3.12/operations/troubleshooting/arangod.md | 2 +- .../version-3.0/whats-new-in-3-0.md | 2 +- .../incompatible-changes-in-3-11.md | 4 ++-- .../incompatible-changes-in-3-12.md | 8 ++++---- .../version-3.5/whats-new-in-3-5.md | 2 +- .../version-3.7/whats-new-in-3-7.md | 2 +- .../explaining-queries.md | 2 +- .../components/tools/arangoinspect/_index.md | 2 +- .../components/tools/arangoinspect/examples.md | 2 +- .../integrations/arangodb-tinkerpop-provider.md | 4 ++-- .../3.13/operations/troubleshooting/arangod.md | 2 +- .../version-3.0/whats-new-in-3-0.md | 2 +- .../incompatible-changes-in-3-11.md | 4 ++-- .../incompatible-changes-in-3-12.md | 8 ++++---- .../version-3.5/whats-new-in-3-5.md | 2 +- .../version-3.7/whats-new-in-3-7.md | 2 +- site/content/data-platform/_index.md | 4 ++-- site/content/data-platform/get-started.md | 10 +++++----- site/content/data-platform/graph-visualizer.md | 4 ++-- site/content/data-platform/release-notes.md | 4 ++-- .../_markup/render-codeblock-openapi.html | 2 +- .../layouts/_default/_markup/render-link.html | 2 +- .../layouts/_default/baseof.html | 2 +- .../layouts/partials/head.html | 2 +- .../layouts/partials/inkeep-widget.html | 2 +- .../arangoproxy/internal/service/service.go | 2 +- 70 files changed, 117 insertions(+), 116 deletions(-) diff --git a/.circleci/base_config.yml b/.circleci/base_config.yml index 945901550a..c6b002c3a1 100644 --- a/.circleci/base_config.yml +++ b/.circleci/base_config.yml @@ -602,7 +602,7 @@ workflows: when: { equal: [ release, << pipeline.parameters.workflow >> ] } jobs: - plain-build: - url: https://docs.arangodb.com + url: https://docs.arango.ai - deploy: deploy-args: "--prod" requires: diff --git a/.circleci/generate_config.py b/.circleci/generate_config.py index 8548703ae6..c687e1546e 100644 --- a/.circleci/generate_config.py +++ b/.circleci/generate_config.py @@ -389,7 +389,7 @@ def workflow_commit_generated_download_data(config): def workflow_release_launch_command(config): shell = "\ export ENV=\"circleci\"\n \ -export HUGO_URL=https://docs.arangodb.com\n \ +export HUGO_URL=https://docs.arango.ai\n \ export HUGO_ENV=release\n \ export GENERATORS=''\n" diff --git a/CIRCLECI.md b/CIRCLECI.md index 9dcb087e32..fe30a414ff 100644 --- a/CIRCLECI.md +++ b/CIRCLECI.md @@ -48,7 +48,7 @@ improvements before the next ArangoDB release, follow the steps below. (The `release-type` is `docs` by default) The docs-only release workflow runs a **plain build** of the documentation and -deploys to production at <https://docs.arangodb.com> without approval step. +deploys to production at <https://docs.arango.ai> without approval step. ## Example generation @@ -181,7 +181,7 @@ The ArangoDB release workflow includes the following jobs: - a release branch and pull request is created with the generated content, which needs to be reviewed and merged on GitHub - once merged, the workflow in CircleCI needs to be approved to start - deploying to production at <https://docs.arangodb.com> + deploying to production at <https://docs.arango.ai> If any of the examples or generated content fails, the workflow fails as well. The build report can be found in the `generate-summary` check on GitHub. diff --git a/README.md b/README.md index 7f8a38db53..df7a7fc3a9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ArangoDB Documentation This repository contains the source files of the ArangoDB documentation as -published on [docs.arangodb.com](https://docs.arangodb.com/). +published on [docs.arango.ai](https://docs.arango.ai/). The ArangoDB documentation is licensed under Apache-2.0. See [LICENSE](LICENSE) for details. @@ -545,8 +545,8 @@ The following shortcodes also exist but are rarely used: - Avoid overly long link labels, such as entire sentences. - Use relative links for cross-references to other documentation pages, e.g. - `../drivers/js/_index.md` instead of `/3.12/drivers/js/_index.md` or - `https://docs.arangodb.com/3.12/drivers/js/`. + `../../data-platform/_index.md` instead of `/data-platform/_index.md` or + `https://docs.arango.ai/data-platform/`. - Avoid **bold** and *italic* markup in headlines. If you have to use it, then prefer `**bold**` and `*italic*` over `__bold__` and `_italic_` because the @@ -786,8 +786,8 @@ Start off by finding a file name. It should be: Note that the file name is independent of what will show in the navigation or what will be used as headline for that page. The file name will be used as -part of the final URL, however. For example, `3.12/aql/examples.md` will become -`http://docs.arangodb.com/3.12/aql/examples/`. +part of the final URL, however. For example, `arangodb/3.12/aql/examples.md` +will become `http://docs.arango.ai/arangodb/3.12/aql/examples/`. Create a new file with the file name and a `.md` file extension. Open the file in a text editor (Visual Studio Code is recommended). Add the following @@ -822,8 +822,9 @@ Otherwise, the following steps are necessary for moving content: The URL of a page is derived from the file name and the parent folders, with special handling for sections (folders with a `_index.md` file). -For example, `3.12/aql/operators.md` becomes the URL path `/3.12/aql/operators/`, -and `3.12/aql/functions/_index.md` becomes `/3.12/aql/functions/`. +For example, `arangodb/3.12/aql/operators.md` becomes the URL path +`/arangodb/3.12/aql/operators/`, and `arangodb/3.12/aql/functions/_index.md` +becomes `/arangodb/3.12/aql/functions/`. If you rename a file, from `section/old-name.md` to `section/new-name.md` for instance, make sure to add a redirect for the old URL by adding the following to @@ -1262,7 +1263,7 @@ db._document("collection/does_not_exist"); // xpError(ERROR_ARANGO_DOCUMENT_NOT_ ``` This will make the example generation continue despite the error. See -[Error codes and meanings](https://docs.arangodb.com/stable/develop/error-codes-and-meanings/) +[Error codes and meanings](https://docs.arango.ai/arangodb/stable/develop/error-codes/) for a list of all error codes and their names. If a unexpected error is raised, then the example generation will abort with an error. diff --git a/site/config/_default/config.yaml b/site/config/_default/config.yaml index 25e4930333..30157c7a3d 100644 --- a/site/config/_default/config.yaml +++ b/site/config/_default/config.yaml @@ -1,4 +1,4 @@ -baseURL: "https://docs.arangodb.com" +baseURL: "https://docs.arango.ai" languageCode: "en-us" title: "ArangoDB Documentation" theme: "arangodb-docs-theme" diff --git a/site/content/ai-suite/graph-to-ai.md b/site/content/ai-suite/graph-to-ai.md index f98f654237..f5a4730563 100644 --- a/site/content/ai-suite/graph-to-ai.md +++ b/site/content/ai-suite/graph-to-ai.md @@ -11,8 +11,8 @@ aliases: {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ArangoDB provides a wide range of functionality that can be utilized for diff --git a/site/content/ai-suite/graphml/_index.md b/site/content/ai-suite/graphml/_index.md index af839ece48..e8ec422dd7 100644 --- a/site/content/ai-suite/graphml/_index.md +++ b/site/content/ai-suite/graphml/_index.md @@ -9,8 +9,8 @@ aliases: --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} Traditional Machine Learning (ML) overlooks the connections and relationships diff --git a/site/content/ai-suite/graphml/quickstart.md b/site/content/ai-suite/graphml/quickstart.md index e9d0cd164f..214e3ab5a8 100644 --- a/site/content/ai-suite/graphml/quickstart.md +++ b/site/content/ai-suite/graphml/quickstart.md @@ -36,8 +36,8 @@ GraphML functionalities in a scriptable manner. To get started, see the {{< tip >}} To get access to GraphML services and packages in Arango Managed Platform (AMP), -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. +[get in touch](https://arangodb.ai/contact-us/) +with the Arango team. {{< /tip >}} - **Accessible at all levels** diff --git a/site/content/ai-suite/graphrag/_index.md b/site/content/ai-suite/graphrag/_index.md index 1174402e92..b284f820e1 100644 --- a/site/content/ai-suite/graphrag/_index.md +++ b/site/content/ai-suite/graphrag/_index.md @@ -10,8 +10,8 @@ aliases: --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Transform unstructured documents into intelligent knowledge graphs diff --git a/site/content/ai-suite/graphrag/technical-overview.md b/site/content/ai-suite/graphrag/technical-overview.md index df38361cf6..56415fb211 100644 --- a/site/content/ai-suite/graphrag/technical-overview.md +++ b/site/content/ai-suite/graphrag/technical-overview.md @@ -9,8 +9,8 @@ description: >- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Introduction diff --git a/site/content/ai-suite/graphrag/tutorial-notebook.md b/site/content/ai-suite/graphrag/tutorial-notebook.md index fe587e4dc9..66d05f766b 100644 --- a/site/content/ai-suite/graphrag/tutorial-notebook.md +++ b/site/content/ai-suite/graphrag/tutorial-notebook.md @@ -7,8 +7,8 @@ weight: 25 --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Tutorial overview diff --git a/site/content/ai-suite/graphrag/web-interface.md b/site/content/ai-suite/graphrag/web-interface.md index 80c1a4ae07..7438127d6f 100644 --- a/site/content/ai-suite/graphrag/web-interface.md +++ b/site/content/ai-suite/graphrag/web-interface.md @@ -8,8 +8,8 @@ description: >- --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## The GraphRAG workflow in the web interface diff --git a/site/content/ai-suite/notebook-servers.md b/site/content/ai-suite/notebook-servers.md index 8606108f1e..8f17158b9f 100644 --- a/site/content/ai-suite/notebook-servers.md +++ b/site/content/ai-suite/notebook-servers.md @@ -9,8 +9,8 @@ aliases: --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ArangoDB Notebooks provide a Python-based, Jupyter-compatible interface for building diff --git a/site/content/ai-suite/reference/gen-ai.md b/site/content/ai-suite/reference/gen-ai.md index 4f59d38bdf..f545a7e255 100644 --- a/site/content/ai-suite/reference/gen-ai.md +++ b/site/content/ai-suite/reference/gen-ai.md @@ -8,8 +8,8 @@ weight: 5 --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Overview diff --git a/site/content/ai-suite/reference/importer.md b/site/content/ai-suite/reference/importer.md index 263a3c77aa..e4cce5d200 100644 --- a/site/content/ai-suite/reference/importer.md +++ b/site/content/ai-suite/reference/importer.md @@ -8,8 +8,8 @@ weight: 10 --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Overview diff --git a/site/content/ai-suite/reference/mlflow.md b/site/content/ai-suite/reference/mlflow.md index 0ec14ccd2a..f2b3d05031 100644 --- a/site/content/ai-suite/reference/mlflow.md +++ b/site/content/ai-suite/reference/mlflow.md @@ -8,8 +8,8 @@ weight: 25 --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Overview diff --git a/site/content/ai-suite/reference/retriever.md b/site/content/ai-suite/reference/retriever.md index 0d9ac3bc11..5949d8a369 100644 --- a/site/content/ai-suite/reference/retriever.md +++ b/site/content/ai-suite/reference/retriever.md @@ -8,8 +8,8 @@ weight: 15 --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Overview diff --git a/site/content/ai-suite/reference/triton-inference-server.md b/site/content/ai-suite/reference/triton-inference-server.md index 64c6d1fc79..458226743e 100644 --- a/site/content/ai-suite/reference/triton-inference-server.md +++ b/site/content/ai-suite/reference/triton-inference-server.md @@ -7,8 +7,8 @@ weight: 30 --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Overview diff --git a/site/content/amp/organizations/credits-and-usage.md b/site/content/amp/organizations/credits-and-usage.md index dbee01504f..18891f6438 100644 --- a/site/content/amp/organizations/credits-and-usage.md +++ b/site/content/amp/organizations/credits-and-usage.md @@ -28,7 +28,7 @@ and do not have any backup storage, then none of your credits will be consumed. {{< tip >}} To purchase credits for your organization, you need to get in touch with the -ArangoDB team. [Contact us](https://www.arangodb.com/contact/) for more details. +Arango team. [Contact us](https://arango.ai/contact-us/) for more details. {{< /tip >}} There are a number of benefits that AMP credits provide: diff --git a/site/content/arangodb/3.10/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.10/aql/execution-and-performance/explaining-queries.md index 04c326256c..75e02e928c 100644 --- a/site/content/arangodb/3.10/aql/execution-and-performance/explaining-queries.md +++ b/site/content/arangodb/3.10/aql/execution-and-performance/explaining-queries.md @@ -193,7 +193,7 @@ directly, focusing on the most important information. ## Gathering debug information about a query If an explain provides no suitable insight into why a query does not perform as -expected, it may be reported to the ArangoDB support. In order to make this as easy +expected, it may be reported to the Arango support. In order to make this as easy as possible, there is a built-in command in ArangoShell for packaging the query, its bind parameters, and all data required to execute the query elsewhere. @@ -222,7 +222,7 @@ var query = "FOR doc IN mycollection FILTER doc.value > 42 RETURN doc"; require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query); ``` -Entitled users can send the generated file to the ArangoDB support to facilitate +Entitled users can send the generated file to the Arango support to facilitate reproduction and debugging. {{< tip >}} diff --git a/site/content/arangodb/3.10/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.10/components/tools/arangoinspect/_index.md index 0860c93093..87ae1c2722 100644 --- a/site/content/arangodb/3.10/components/tools/arangoinspect/_index.md +++ b/site/content/arangodb/3.10/components/tools/arangoinspect/_index.md @@ -4,5 +4,5 @@ menuTitle: arangoinspect weight: 50 description: >- `arangoinspect` is a command-line client tool that collects information of any - ArangoDB server setup to facilitate troubleshooting for the ArangoDB support + ArangoDB server setup to facilitate troubleshooting for the Arango support --- diff --git a/site/content/arangodb/3.10/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.10/components/tools/arangoinspect/examples.md index 5d47b6b260..bf5a5ec9a7 100644 --- a/site/content/arangodb/3.10/components/tools/arangoinspect/examples.md +++ b/site/content/arangodb/3.10/components/tools/arangoinspect/examples.md @@ -5,7 +5,7 @@ weight: 5 description: >- How to use the `arangoinspect` tool to collection information for troubleshooting --- -If you are asked by ArangoDB support to provide an inspector output, run +If you are asked by Arango support to provide an inspector output, run the _arangoinspect_ binary to generate a file in the current working folder. The resulting JSON file is a collection of meta data acquired from all diff --git a/site/content/arangodb/3.10/data-science/arangograph-notebooks.md b/site/content/arangodb/3.10/data-science/arangograph-notebooks.md index 833a0525f1..e8c778b63e 100644 --- a/site/content/arangodb/3.10/data-science/arangograph-notebooks.md +++ b/site/content/arangodb/3.10/data-science/arangograph-notebooks.md @@ -8,8 +8,8 @@ description: >- {{< tip >}} AMP Notebooks don't include the ArangoGraphML services. To enable the ArangoGraphML services, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. +[get in touch](https://arango.ai/contact/) +with the Arango team. {{< /tip >}} The AMP Notebook is a JupyterLab notebook embedded in the diff --git a/site/content/arangodb/3.10/data-science/arangographml/deploy.md b/site/content/arangodb/3.10/data-science/arangographml/deploy.md index b3b5a6c13d..4ecd3f8d5b 100644 --- a/site/content/arangodb/3.10/data-science/arangographml/deploy.md +++ b/site/content/arangodb/3.10/data-science/arangographml/deploy.md @@ -22,8 +22,8 @@ Cloud Service via Jupyter Notebooks that run on the {{< tip >}} To get access to ArangoGraphML services and packages, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. +[get in touch](https://arango.ai/contact-us/) +with the Arango team. {{< /tip >}} - **Accessible at all levels** diff --git a/site/content/arangodb/3.10/data-science/arangographml/getting-started.md b/site/content/arangodb/3.10/data-science/arangographml/getting-started.md index 1b0bcf83cc..886faec62c 100644 --- a/site/content/arangodb/3.10/data-science/arangographml/getting-started.md +++ b/site/content/arangodb/3.10/data-science/arangographml/getting-started.md @@ -18,8 +18,8 @@ The `arangoml` is a Python Package allowing you to manage all of the necessary {{< tip >}} To enable the ArangoGraphML services in the Arango Managed Platform (AMP), -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. Regular notebooks in AMP don't include the +[get in touch](https://arango.ai/contact-us/) +with the Arango team. Regular notebooks in AMP don't include the `arangoml` package. {{< /tip >}} diff --git a/site/content/arangodb/3.10/operations/troubleshooting/arangod.md b/site/content/arangodb/3.10/operations/troubleshooting/arangod.md index 18088fb80e..f14ec875a9 100644 --- a/site/content/arangodb/3.10/operations/troubleshooting/arangod.md +++ b/site/content/arangodb/3.10/operations/troubleshooting/arangod.md @@ -99,7 +99,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.10/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.10/release-notes/version-3.0/whats-new-in-3-0.md index f9e16dea5f..3fb7c66594 100644 --- a/site/content/arangodb/3.10/release-notes/version-3.0/whats-new-in-3-0.md +++ b/site/content/arangodb/3.10/release-notes/version-3.0/whats-new-in-3-0.md @@ -395,7 +395,7 @@ longer-running operations are ongoing. It also keeps more state about user's cho windows sizes, whether the tree or the code view was last used in the document editor). Cluster statistics are now integrated into the web interface as well. Additionally, a -menu item "Help us" has been added to easily provide the ArangoDB team feedback about +menu item "Help us" has been added to easily provide the Arango team feedback about the product. {{< comment >}} NOTE: This feature doesn't work properly anymore! diff --git a/site/content/arangodb/3.10/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.10/release-notes/version-3.5/whats-new-in-3-5.md index 2a61e8a724..9875c19b12 100644 --- a/site/content/arangodb/3.10/release-notes/version-3.5/whats-new-in-3-5.md +++ b/site/content/arangodb/3.10/release-notes/version-3.5/whats-new-in-3-5.md @@ -712,7 +712,7 @@ In this message, the `cf3f4` is the message's unique ID value. ArangoDB users ca use this ID to build custom monitoring or alerting based on specific log ID values. Existing log ID values are supposed to stay constant in future releases of arangod. -Additionally the unique log ID values can be used by the ArangoDB support to find +Additionally the unique log ID values can be used by the Arango support to find out which component of the product exactly generated a log message. The IDs also make disambiguation of identical log messages easier. diff --git a/site/content/arangodb/3.10/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.10/release-notes/version-3.7/whats-new-in-3-7.md index 8925836baa..f366ab69c1 100644 --- a/site/content/arangodb/3.10/release-notes/version-3.7/whats-new-in-3-7.md +++ b/site/content/arangodb/3.10/release-notes/version-3.7/whats-new-in-3-7.md @@ -960,7 +960,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.11/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.11/aql/execution-and-performance/explaining-queries.md index d8b3ce32fb..b51e33989d 100644 --- a/site/content/arangodb/3.11/aql/execution-and-performance/explaining-queries.md +++ b/site/content/arangodb/3.11/aql/execution-and-performance/explaining-queries.md @@ -225,7 +225,7 @@ var query = "FOR doc IN mycollection FILTER doc.value > 42 RETURN doc"; require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query); ``` -Entitled users can send the generated file to the ArangoDB support to facilitate +Entitled users can send the generated file to the Arango support to facilitate reproduction and debugging. {{< tip >}} diff --git a/site/content/arangodb/3.11/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.11/components/tools/arangoinspect/_index.md index 0860c93093..87ae1c2722 100644 --- a/site/content/arangodb/3.11/components/tools/arangoinspect/_index.md +++ b/site/content/arangodb/3.11/components/tools/arangoinspect/_index.md @@ -4,5 +4,5 @@ menuTitle: arangoinspect weight: 50 description: >- `arangoinspect` is a command-line client tool that collects information of any - ArangoDB server setup to facilitate troubleshooting for the ArangoDB support + ArangoDB server setup to facilitate troubleshooting for the Arango support --- diff --git a/site/content/arangodb/3.11/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.11/components/tools/arangoinspect/examples.md index 78c23e59ca..bdfe955d5f 100644 --- a/site/content/arangodb/3.11/components/tools/arangoinspect/examples.md +++ b/site/content/arangodb/3.11/components/tools/arangoinspect/examples.md @@ -5,7 +5,7 @@ weight: 5 description: >- How to use the `arangoinspect` tool to collection information for troubleshooting --- -If you are asked by ArangoDB support to provide an inspector output, run +If you are asked by Arango support to provide an inspector output, run the _arangoinspect_ binary to generate a file in the current working folder. The resulting JSON file is a collection of meta data acquired from all diff --git a/site/content/arangodb/3.11/data-science/arangograph-notebooks.md b/site/content/arangodb/3.11/data-science/arangograph-notebooks.md index 833a0525f1..74a64a5c78 100644 --- a/site/content/arangodb/3.11/data-science/arangograph-notebooks.md +++ b/site/content/arangodb/3.11/data-science/arangograph-notebooks.md @@ -8,8 +8,8 @@ description: >- {{< tip >}} AMP Notebooks don't include the ArangoGraphML services. To enable the ArangoGraphML services, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. +[get in touch](https://arango.ai/contact-us/) +with the Arango team. {{< /tip >}} The AMP Notebook is a JupyterLab notebook embedded in the diff --git a/site/content/arangodb/3.11/data-science/arangographml/deploy.md b/site/content/arangodb/3.11/data-science/arangographml/deploy.md index b3b5a6c13d..4ecd3f8d5b 100644 --- a/site/content/arangodb/3.11/data-science/arangographml/deploy.md +++ b/site/content/arangodb/3.11/data-science/arangographml/deploy.md @@ -22,8 +22,8 @@ Cloud Service via Jupyter Notebooks that run on the {{< tip >}} To get access to ArangoGraphML services and packages, -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. +[get in touch](https://arango.ai/contact-us/) +with the Arango team. {{< /tip >}} - **Accessible at all levels** diff --git a/site/content/arangodb/3.11/data-science/arangographml/getting-started.md b/site/content/arangodb/3.11/data-science/arangographml/getting-started.md index c4bea56b50..de9d2ae042 100644 --- a/site/content/arangodb/3.11/data-science/arangographml/getting-started.md +++ b/site/content/arangodb/3.11/data-science/arangographml/getting-started.md @@ -18,8 +18,8 @@ The `arangoml` is a Python Package allowing you to manage all of the necessary {{< tip >}} To enable the ArangoGraphML services in the Arango Managed Platform (AMP), -[get in touch](https://www.arangodb.com/contact/) -with the ArangoDB team. Regular notebooks in AMP don't include the +[get in touch](https://arango.ai/contact-us/) +with the Arango team. Regular notebooks in AMP don't include the `arangoml` package. {{< /tip >}} diff --git a/site/content/arangodb/3.11/operations/troubleshooting/arangod.md b/site/content/arangodb/3.11/operations/troubleshooting/arangod.md index 2d44949255..8f11ecba42 100644 --- a/site/content/arangodb/3.11/operations/troubleshooting/arangod.md +++ b/site/content/arangodb/3.11/operations/troubleshooting/arangod.md @@ -98,7 +98,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.11/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.11/release-notes/version-3.0/whats-new-in-3-0.md index f9e16dea5f..3fb7c66594 100644 --- a/site/content/arangodb/3.11/release-notes/version-3.0/whats-new-in-3-0.md +++ b/site/content/arangodb/3.11/release-notes/version-3.0/whats-new-in-3-0.md @@ -395,7 +395,7 @@ longer-running operations are ongoing. It also keeps more state about user's cho windows sizes, whether the tree or the code view was last used in the document editor). Cluster statistics are now integrated into the web interface as well. Additionally, a -menu item "Help us" has been added to easily provide the ArangoDB team feedback about +menu item "Help us" has been added to easily provide the Arango team feedback about the product. {{< comment >}} NOTE: This feature doesn't work properly anymore! diff --git a/site/content/arangodb/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md index 6a9949712f..a99cec9295 100644 --- a/site/content/arangodb/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md +++ b/site/content/arangodb/3.11/release-notes/version-3.11/incompatible-changes-in-3-11.md @@ -15,7 +15,7 @@ read-only in rare cases. {{< warning >}} If you are a paying customer with a self-hosted deployment, contact the -ArangoDB support for direct assistance. +Arango support for direct assistance. Arango Managed Platform (AMP) customers do not need to take any action. {{< /warning >}} @@ -541,7 +541,7 @@ created with v3.11.11, v3.12.2, or any later version. ### If the deployment is affected {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} diff --git a/site/content/arangodb/3.11/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.11/release-notes/version-3.5/whats-new-in-3-5.md index 2a61e8a724..9875c19b12 100644 --- a/site/content/arangodb/3.11/release-notes/version-3.5/whats-new-in-3-5.md +++ b/site/content/arangodb/3.11/release-notes/version-3.5/whats-new-in-3-5.md @@ -712,7 +712,7 @@ In this message, the `cf3f4` is the message's unique ID value. ArangoDB users ca use this ID to build custom monitoring or alerting based on specific log ID values. Existing log ID values are supposed to stay constant in future releases of arangod. -Additionally the unique log ID values can be used by the ArangoDB support to find +Additionally the unique log ID values can be used by the Arango support to find out which component of the product exactly generated a log message. The IDs also make disambiguation of identical log messages easier. diff --git a/site/content/arangodb/3.11/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.11/release-notes/version-3.7/whats-new-in-3-7.md index 8925836baa..f366ab69c1 100644 --- a/site/content/arangodb/3.11/release-notes/version-3.7/whats-new-in-3-7.md +++ b/site/content/arangodb/3.11/release-notes/version-3.7/whats-new-in-3-7.md @@ -960,7 +960,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.12/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.12/aql/execution-and-performance/explaining-queries.md index d8b3ce32fb..b51e33989d 100644 --- a/site/content/arangodb/3.12/aql/execution-and-performance/explaining-queries.md +++ b/site/content/arangodb/3.12/aql/execution-and-performance/explaining-queries.md @@ -225,7 +225,7 @@ var query = "FOR doc IN mycollection FILTER doc.value > 42 RETURN doc"; require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query); ``` -Entitled users can send the generated file to the ArangoDB support to facilitate +Entitled users can send the generated file to the Arango support to facilitate reproduction and debugging. {{< tip >}} diff --git a/site/content/arangodb/3.12/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.12/components/tools/arangoinspect/_index.md index 0860c93093..87ae1c2722 100644 --- a/site/content/arangodb/3.12/components/tools/arangoinspect/_index.md +++ b/site/content/arangodb/3.12/components/tools/arangoinspect/_index.md @@ -4,5 +4,5 @@ menuTitle: arangoinspect weight: 50 description: >- `arangoinspect` is a command-line client tool that collects information of any - ArangoDB server setup to facilitate troubleshooting for the ArangoDB support + ArangoDB server setup to facilitate troubleshooting for the Arango support --- diff --git a/site/content/arangodb/3.12/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.12/components/tools/arangoinspect/examples.md index eb1fa6ae27..6788389f6f 100644 --- a/site/content/arangodb/3.12/components/tools/arangoinspect/examples.md +++ b/site/content/arangodb/3.12/components/tools/arangoinspect/examples.md @@ -5,7 +5,7 @@ weight: 5 description: >- How to use the `arangoinspect` tool to collection information for troubleshooting --- -If you are asked by ArangoDB support to provide an inspector output, run +If you are asked by Arango support to provide an inspector output, run the _arangoinspect_ binary to generate a file in the current working folder. The resulting JSON file is a collection of meta data acquired from all diff --git a/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md b/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md index 04012366f9..a1a68550bf 100644 --- a/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md +++ b/site/content/arangodb/3.12/develop/integrations/arangodb-tinkerpop-provider.md @@ -325,7 +325,7 @@ Graph configuration properties are prefixed with `gremlin.arangodb.conf.graph`: Driver configuration properties are prefixed with `gremlin.arangodb.conf.driver`. All properties from `com.arangodb.config.ArangoConfigProperties` are supported. See -the [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) +the [ArangoDB Java Driver documentation](../drivers/java/reference-version-7/driver-setup.md#config-file-properties) for details. ### YAML Configuration @@ -393,7 +393,7 @@ To use TLS-secured connections to ArangoDB, follow these steps: 1. Enable SSL by setting `gremlin.arangodb.conf.driver.useSsl` to `true` in your configuration. -2. Configure SSL properties as needed (see [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) for all available options): +2. Configure SSL properties as needed (see [ArangoDB Java Driver documentation](../drivers/java/reference-version-7/driver-setup.md#config-file-properties) for all available options): ```yaml gremlin: diff --git a/site/content/arangodb/3.12/operations/troubleshooting/arangod.md b/site/content/arangodb/3.12/operations/troubleshooting/arangod.md index 2d44949255..8f11ecba42 100644 --- a/site/content/arangodb/3.12/operations/troubleshooting/arangod.md +++ b/site/content/arangodb/3.12/operations/troubleshooting/arangod.md @@ -98,7 +98,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.12/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.12/release-notes/version-3.0/whats-new-in-3-0.md index f4e2392774..20472c4c35 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.0/whats-new-in-3-0.md +++ b/site/content/arangodb/3.12/release-notes/version-3.0/whats-new-in-3-0.md @@ -395,7 +395,7 @@ longer-running operations are ongoing. It also keeps more state about user's cho windows sizes, whether the tree or the code view was last used in the document editor). Cluster statistics are now integrated into the web interface as well. Additionally, a -menu item "Help us" has been added to easily provide the ArangoDB team feedback about +menu item "Help us" has been added to easily provide the Arango team feedback about the product. {{< comment >}} NOTE: This feature doesn't work properly anymore! diff --git a/site/content/arangodb/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md index ba3354a686..52f1d26e71 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md +++ b/site/content/arangodb/3.12/release-notes/version-3.11/incompatible-changes-in-3-11.md @@ -15,7 +15,7 @@ read-only in rare cases. {{< warning >}} If you are a paying customer with a self-hosted deployment, contact the -ArangoDB support for direct assistance. +Arango support for direct assistance. Arango Managed Platform (AMP) customers do not need to take any action. {{< /warning >}} @@ -541,7 +541,7 @@ created with v3.11.11, v3.12.2, or any later version. ### If the deployment is affected {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} diff --git a/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md b/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md index 9777ac3151..a84a141025 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md +++ b/site/content/arangodb/3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md @@ -38,7 +38,7 @@ become read-only in rare cases. {{< warning >}} If you are a paying customer with a self-hosted deployment, contact the -ArangoDB support for direct assistance. +Arango support for direct assistance. Arango Managed Platform (AMP) customers do not need to take any action. {{< /warning >}} @@ -604,7 +604,7 @@ created with v3.11.11, v3.12.2, or any later version. ### If the deployment is affected {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} @@ -819,7 +819,7 @@ created with v3.12.4 or any later version. 1. Create a Hot Backup if you haven't done so already. -2. If the check result shows affected indexes, contact the ArangoDB support +2. If the check result shows affected indexes, contact the Arango support immediately. Do not continue and refrain from upgrading. 3. If no affected indexes are reported, restore the Hot Backup to a new @@ -892,7 +892,7 @@ created with v3.12.4 or any later version. ### If the deployment is in read-only mode {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} diff --git a/site/content/arangodb/3.12/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.12/release-notes/version-3.5/whats-new-in-3-5.md index 2a61e8a724..9875c19b12 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.5/whats-new-in-3-5.md +++ b/site/content/arangodb/3.12/release-notes/version-3.5/whats-new-in-3-5.md @@ -712,7 +712,7 @@ In this message, the `cf3f4` is the message's unique ID value. ArangoDB users ca use this ID to build custom monitoring or alerting based on specific log ID values. Existing log ID values are supposed to stay constant in future releases of arangod. -Additionally the unique log ID values can be used by the ArangoDB support to find +Additionally the unique log ID values can be used by the Arango support to find out which component of the product exactly generated a log message. The IDs also make disambiguation of identical log messages easier. diff --git a/site/content/arangodb/3.12/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.12/release-notes/version-3.7/whats-new-in-3-7.md index 4fbbd3e698..29bd20c8f4 100644 --- a/site/content/arangodb/3.12/release-notes/version-3.7/whats-new-in-3-7.md +++ b/site/content/arangodb/3.12/release-notes/version-3.7/whats-new-in-3-7.md @@ -958,7 +958,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.13/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/3.13/aql/execution-and-performance/explaining-queries.md index d8b3ce32fb..b51e33989d 100644 --- a/site/content/arangodb/3.13/aql/execution-and-performance/explaining-queries.md +++ b/site/content/arangodb/3.13/aql/execution-and-performance/explaining-queries.md @@ -225,7 +225,7 @@ var query = "FOR doc IN mycollection FILTER doc.value > 42 RETURN doc"; require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query); ``` -Entitled users can send the generated file to the ArangoDB support to facilitate +Entitled users can send the generated file to the Arango support to facilitate reproduction and debugging. {{< tip >}} diff --git a/site/content/arangodb/3.13/components/tools/arangoinspect/_index.md b/site/content/arangodb/3.13/components/tools/arangoinspect/_index.md index 0860c93093..87ae1c2722 100644 --- a/site/content/arangodb/3.13/components/tools/arangoinspect/_index.md +++ b/site/content/arangodb/3.13/components/tools/arangoinspect/_index.md @@ -4,5 +4,5 @@ menuTitle: arangoinspect weight: 50 description: >- `arangoinspect` is a command-line client tool that collects information of any - ArangoDB server setup to facilitate troubleshooting for the ArangoDB support + ArangoDB server setup to facilitate troubleshooting for the Arango support --- diff --git a/site/content/arangodb/3.13/components/tools/arangoinspect/examples.md b/site/content/arangodb/3.13/components/tools/arangoinspect/examples.md index eb1fa6ae27..6788389f6f 100644 --- a/site/content/arangodb/3.13/components/tools/arangoinspect/examples.md +++ b/site/content/arangodb/3.13/components/tools/arangoinspect/examples.md @@ -5,7 +5,7 @@ weight: 5 description: >- How to use the `arangoinspect` tool to collection information for troubleshooting --- -If you are asked by ArangoDB support to provide an inspector output, run +If you are asked by Arango support to provide an inspector output, run the _arangoinspect_ binary to generate a file in the current working folder. The resulting JSON file is a collection of meta data acquired from all diff --git a/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md b/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md index 04012366f9..a1a68550bf 100644 --- a/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md +++ b/site/content/arangodb/3.13/develop/integrations/arangodb-tinkerpop-provider.md @@ -325,7 +325,7 @@ Graph configuration properties are prefixed with `gremlin.arangodb.conf.graph`: Driver configuration properties are prefixed with `gremlin.arangodb.conf.driver`. All properties from `com.arangodb.config.ArangoConfigProperties` are supported. See -the [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) +the [ArangoDB Java Driver documentation](../drivers/java/reference-version-7/driver-setup.md#config-file-properties) for details. ### YAML Configuration @@ -393,7 +393,7 @@ To use TLS-secured connections to ArangoDB, follow these steps: 1. Enable SSL by setting `gremlin.arangodb.conf.driver.useSsl` to `true` in your configuration. -2. Configure SSL properties as needed (see [ArangoDB Java Driver documentation](https://docs.arangodb.com/stable/develop/drivers/java/reference-version-7/driver-setup/#config-file-properties) for all available options): +2. Configure SSL properties as needed (see [ArangoDB Java Driver documentation](../drivers/java/reference-version-7/driver-setup.md#config-file-properties) for all available options): ```yaml gremlin: diff --git a/site/content/arangodb/3.13/operations/troubleshooting/arangod.md b/site/content/arangodb/3.13/operations/troubleshooting/arangod.md index 2d44949255..8f11ecba42 100644 --- a/site/content/arangodb/3.13/operations/troubleshooting/arangod.md +++ b/site/content/arangodb/3.13/operations/troubleshooting/arangod.md @@ -98,7 +98,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/arangodb/3.13/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/3.13/release-notes/version-3.0/whats-new-in-3-0.md index f4e2392774..20472c4c35 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.0/whats-new-in-3-0.md +++ b/site/content/arangodb/3.13/release-notes/version-3.0/whats-new-in-3-0.md @@ -395,7 +395,7 @@ longer-running operations are ongoing. It also keeps more state about user's cho windows sizes, whether the tree or the code view was last used in the document editor). Cluster statistics are now integrated into the web interface as well. Additionally, a -menu item "Help us" has been added to easily provide the ArangoDB team feedback about +menu item "Help us" has been added to easily provide the Arango team feedback about the product. {{< comment >}} NOTE: This feature doesn't work properly anymore! diff --git a/site/content/arangodb/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md index ba3354a686..52f1d26e71 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md +++ b/site/content/arangodb/3.13/release-notes/version-3.11/incompatible-changes-in-3-11.md @@ -15,7 +15,7 @@ read-only in rare cases. {{< warning >}} If you are a paying customer with a self-hosted deployment, contact the -ArangoDB support for direct assistance. +Arango support for direct assistance. Arango Managed Platform (AMP) customers do not need to take any action. {{< /warning >}} @@ -541,7 +541,7 @@ created with v3.11.11, v3.12.2, or any later version. ### If the deployment is affected {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} diff --git a/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md b/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md index 9777ac3151..a84a141025 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md +++ b/site/content/arangodb/3.13/release-notes/version-3.12/incompatible-changes-in-3-12.md @@ -38,7 +38,7 @@ become read-only in rare cases. {{< warning >}} If you are a paying customer with a self-hosted deployment, contact the -ArangoDB support for direct assistance. +Arango support for direct assistance. Arango Managed Platform (AMP) customers do not need to take any action. {{< /warning >}} @@ -604,7 +604,7 @@ created with v3.11.11, v3.12.2, or any later version. ### If the deployment is affected {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} @@ -819,7 +819,7 @@ created with v3.12.4 or any later version. 1. Create a Hot Backup if you haven't done so already. -2. If the check result shows affected indexes, contact the ArangoDB support +2. If the check result shows affected indexes, contact the Arango support immediately. Do not continue and refrain from upgrading. 3. If no affected indexes are reported, restore the Hot Backup to a new @@ -892,7 +892,7 @@ created with v3.12.4 or any later version. ### If the deployment is in read-only mode {{< info >}} -If you are a customer, please contact the ArangoDB support to assist you with +If you are a customer, please contact the Arango support to assist you with the following steps. {{< /info >}} diff --git a/site/content/arangodb/3.13/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/3.13/release-notes/version-3.5/whats-new-in-3-5.md index 2a61e8a724..9875c19b12 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.5/whats-new-in-3-5.md +++ b/site/content/arangodb/3.13/release-notes/version-3.5/whats-new-in-3-5.md @@ -712,7 +712,7 @@ In this message, the `cf3f4` is the message's unique ID value. ArangoDB users ca use this ID to build custom monitoring or alerting based on specific log ID values. Existing log ID values are supposed to stay constant in future releases of arangod. -Additionally the unique log ID values can be used by the ArangoDB support to find +Additionally the unique log ID values can be used by the Arango support to find out which component of the product exactly generated a log message. The IDs also make disambiguation of identical log messages easier. diff --git a/site/content/arangodb/3.13/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/3.13/release-notes/version-3.7/whats-new-in-3-7.md index 4fbbd3e698..29bd20c8f4 100644 --- a/site/content/arangodb/3.13/release-notes/version-3.7/whats-new-in-3-7.md +++ b/site/content/arangodb/3.13/release-notes/version-3.7/whats-new-in-3-7.md @@ -958,7 +958,7 @@ thus cannot be intercepted by the crash handler. In case the crash handler receives one of the mentioned interceptable signals, it will write basic crash information to the logfile and a backtrace of the -call site. The backtrace can be provided to the ArangoDB support for further +call site. The backtrace can be provided to the Arango support for further inspection. Note that backtaces are only usable if debug symbols for ArangoDB have been installed as well. diff --git a/site/content/data-platform/_index.md b/site/content/data-platform/_index.md index 57bb0980c1..5b68886243 100644 --- a/site/content/data-platform/_index.md +++ b/site/content/data-platform/_index.md @@ -9,8 +9,8 @@ description: >- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} The Arango Data Platform is a **Kubernetes-native** technical infrastructure that acts as the umbrella diff --git a/site/content/data-platform/get-started.md b/site/content/data-platform/get-started.md index de721b874e..f59466e2db 100644 --- a/site/content/data-platform/get-started.md +++ b/site/content/data-platform/get-started.md @@ -8,8 +8,8 @@ description: >- --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} The Arango Data Platform is a technical infrastructure that acts as the umbrella @@ -40,7 +40,7 @@ to provide automated deployment, scaling, and management capabilities. ### Requirements for self-hosting - **Early access to the Arango Data Platform**: - [Get in touch](https://arangodb.com/contact/) with the ArangoDB team to get + [Get in touch](https://arango.ai/contact-us/) with the Arango team to get exclusive early access to the pre-release of the Arango Data Platform & AI Suite. - **Kubernetes**: Orchestrates the selected services that comprise the @@ -76,7 +76,7 @@ to provide automated deployment, scaling, and management capabilities. 1. Obtain a zip package of the Arango Data Platform for the offline installation. It includes helm charts, manifests, and blobs of the container image layers. - You also receive a package configuration file from the ArangoDB team. + You also receive a package configuration file from the Arango team. 2. Create a Kubernetes namespace for ArangoDB and a secret with your Enterprise Edition license key. Substitute `<license-string>` with the actual @@ -178,7 +178,7 @@ to provide automated deployment, scaling, and management capabilities. ``` 8. Install the package using the package configuration you received from the - ArangoDB team (`platform.yaml`) and the configuration generated by the + Arango team (`platform.yaml`) and the configuration generated by the previous command (`platform.imported.yaml`). These configurations are merged, allowing for targeted upgrades and user-defined overrides. diff --git a/site/content/data-platform/graph-visualizer.md b/site/content/data-platform/graph-visualizer.md index 971b3ad818..fd06fd3258 100644 --- a/site/content/data-platform/graph-visualizer.md +++ b/site/content/data-platform/graph-visualizer.md @@ -7,8 +7,8 @@ description: >- --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} The **Graph Visualizer** is a browser-based tool integrated into the web interface diff --git a/site/content/data-platform/release-notes.md b/site/content/data-platform/release-notes.md index 006c949cdb..cc3c53b7a2 100644 --- a/site/content/data-platform/release-notes.md +++ b/site/content/data-platform/release-notes.md @@ -7,8 +7,8 @@ description: >- --- {{< tip >}} The Arango Data Platform & AI Suite are available as a pre-release. To get -exclusive early access, [get in touch](https://arangodb.com/contact/) with -the ArangoDB team. +exclusive early access, [get in touch](https://arango.ai/contact-us/) with +the Arango team. {{< /tip >}} ## Arango Data Platform diff --git a/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-codeblock-openapi.html b/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-codeblock-openapi.html index 43a210e7d4..24624c3e13 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-codeblock-openapi.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-codeblock-openapi.html @@ -8,7 +8,7 @@ {{- $url := index $match 2 }} {{- $isRemote := ne (urls.Parse $url).Scheme "" }} {{- if not $isRemote }} - {{- $absUrl := printf "https://docs.arangodb.com%s" (urls.RelRef $page $url) }} + {{- $absUrl := printf "https://docs.arango.ai%s" (urls.RelRef $page $url) }} {{- $newLink := printf "[%s](%s)" (index $match 1) $absUrl }} {{- $linkMap = merge $linkMap (dict (index $match 0) $newLink) }} {{- end }} diff --git a/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html b/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html index 70df3678d4..a9b871f509 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/_markup/render-link.html @@ -11,7 +11,7 @@ {{- $isRemote := ne $url.Scheme "" }} {{- if $isRemote }} - {{- $isProduction := eq site.BaseURL "https://docs.arangodb.com" }} + {{- $isProduction := eq site.BaseURL "https://docs.arango.ai" }} {{- if and (not $isProduction) (eq .Destination "https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic") }} {{- $permalink = "https://dashboard.arangodb.cloud/home" }} {{- else }} diff --git a/site/themes/arangodb-docs-theme/layouts/_default/baseof.html b/site/themes/arangodb-docs-theme/layouts/_default/baseof.html index 150c1d0578..bdfb2d3954 100644 --- a/site/themes/arangodb-docs-theme/layouts/_default/baseof.html +++ b/site/themes/arangodb-docs-theme/layouts/_default/baseof.html @@ -1,5 +1,5 @@ {{ partial "shortcodes/version.html" (dict "page" .Page) -}} -{{ $isProduction := eq site.BaseURL "https://docs.arangodb.com" -}} +{{ $isProduction := eq site.BaseURL "https://docs.arango.ai" -}} <!DOCTYPE html> <html lang="{{ .Page.Language | default "en" }}"> diff --git a/site/themes/arangodb-docs-theme/layouts/partials/head.html b/site/themes/arangodb-docs-theme/layouts/partials/head.html index 4b61964b1e..b197f74205 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/head.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/head.html @@ -6,7 +6,7 @@ <link href="{{ "/images/favicon.png" | relURL }}" rel="icon" type="image/png"> {{ partialCached "javascript.html" . -}} - {{ $isProduction := eq site.BaseURL "https://docs.arangodb.com" -}} + {{ $isProduction := eq site.BaseURL "https://docs.arango.ai" -}} {{ if $isProduction -}} {{- partialCached "tracking/gtag.html" . -}} {{- partialCached "tracking/twitter.html" . -}} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/inkeep-widget.html b/site/themes/arangodb-docs-theme/layouts/partials/inkeep-widget.html index 829d0bd7da..e3a07f1705 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/inkeep-widget.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/inkeep-widget.html @@ -50,7 +50,7 @@ filters: { UrlMatch: { ruleType: "PartialUrl", - partialUrl: "docs.arangodb.com", + partialUrl: "docs.arango.ai", }, }, searchTabLabel: "Official Docs", diff --git a/toolchain/arangoproxy/internal/service/service.go b/toolchain/arangoproxy/internal/service/service.go index fbda00d06b..ebe52214b3 100644 --- a/toolchain/arangoproxy/internal/service/service.go +++ b/toolchain/arangoproxy/internal/service/service.go @@ -182,7 +182,7 @@ func init() { "tags": tags, "externalDocs": map[string]interface{}{ "description": "ArangoDB Documentation", - "url": "https://docs.arangodb.com", + "url": "https://docs.arango.ai", }, } } From b0e7cb0019ebb8ad0e206e84bca703b0f0766f4a Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Wed, 29 Oct 2025 10:30:49 +0100 Subject: [PATCH 39/44] WIP: OEM LTS version Breadcrumbs broken, versions need a display label (oem vs OEM), future branch and image names? --- .circleci/base_config.yml | 4 +- .circleci/config.yml | 2 +- .circleci/generate_config.py | 9 +- CIRCLECI.md | 5 + site/content/arangodb/oem/_index.md | 42 + site/content/arangodb/oem/about/_index.md | 75 + .../arangodb/oem/about/features/_index.md | 126 + .../oem/about/features/community-edition.md | 283 + .../oem/about/features/enterprise-edition.md | 123 + .../about/features/highlights-by-version.md | 448 + site/content/arangodb/oem/about/use-cases.md | 164 + site/content/arangodb/oem/aql/_index.md | 36 + .../content/arangodb/oem/aql/common-errors.md | 420 + site/content/arangodb/oem/aql/data-queries.md | 554 + .../aql/examples-and-query-patterns/_index.md | 115 + .../actors-and-movies-dataset-queries.md | 859 + .../examples-and-query-patterns/counting.md | 28 + .../create-test-data.md | 95 + .../diffing-two-documents.md | 128 + .../dynamic-attribute-names.md | 202 + .../examples-and-query-patterns/grouping.md | 359 + .../aql/examples-and-query-patterns/joins.md | 892 + .../projections-and-filters.md | 136 + .../queries-without-collections.md | 50 + .../remove-vertex.md | 81 + .../examples-and-query-patterns/traversals.md | 118 + .../upsert-repsert-guide.md | 335 + .../aql/execution-and-performance/_index.md | 7 + .../caching-query-results.md | 228 + .../explaining-queries.md | 278 + .../parsing-queries.md | 32 + .../query-optimization.md | 626 + .../query-profiling.md | 229 + .../query-statistics.md | 98 + .../arangodb/oem/aql/functions/_index.md | 37 + .../oem/aql/functions/arangosearch.md | 1361 ++ .../arangodb/oem/aql/functions/array.md | 1041 ++ .../content/arangodb/oem/aql/functions/bit.md | 321 + .../arangodb/oem/aql/functions/date.md | 1335 ++ .../oem/aql/functions/document-object.md | 1023 ++ .../arangodb/oem/aql/functions/fulltext.md | 94 + .../content/arangodb/oem/aql/functions/geo.md | 964 ++ .../oem/aql/functions/miscellaneous.md | 803 + .../arangodb/oem/aql/functions/numeric.md | 770 + .../arangodb/oem/aql/functions/string.md | 2070 +++ .../oem/aql/functions/type-check-and-cast.md | 279 + .../arangodb/oem/aql/fundamentals/_index.md | 8 + .../accessing-data-from-collections.md | 78 + .../oem/aql/fundamentals/bind-parameters.md | 169 + .../oem/aql/fundamentals/data-types.md | 290 + .../oem/aql/fundamentals/limitations.md | 104 + .../oem/aql/fundamentals/query-errors.md | 41 + .../oem/aql/fundamentals/query-results.md | 114 + .../oem/aql/fundamentals/subqueries.md | 188 + .../arangodb/oem/aql/fundamentals/syntax.md | 347 + .../aql/fundamentals/type-and-value-order.md | 137 + .../content/arangodb/oem/aql/graphs/_index.md | 47 + .../oem/aql/graphs/all-shortest-paths.md | 197 + .../arangodb/oem/aql/graphs/k-paths.md | 232 + .../oem/aql/graphs/k-shortest-paths.md | 308 + .../arangodb/oem/aql/graphs/shortest-path.md | 228 + .../oem/aql/graphs/traversals-explained.md | 85 + .../arangodb/oem/aql/graphs/traversals.md | 890 + .../oem/aql/high-level-operations/_index.md | 9 + .../oem/aql/high-level-operations/collect.md | 375 + .../oem/aql/high-level-operations/filter.md | 125 + .../oem/aql/high-level-operations/for.md | 251 + .../oem/aql/high-level-operations/insert.md | 215 + .../oem/aql/high-level-operations/let.md | 69 + .../oem/aql/high-level-operations/limit.md | 96 + .../oem/aql/high-level-operations/remove.md | 185 + .../oem/aql/high-level-operations/replace.md | 306 + .../oem/aql/high-level-operations/return.md | 212 + .../oem/aql/high-level-operations/search.md | 337 + .../oem/aql/high-level-operations/sort.md | 109 + .../oem/aql/high-level-operations/update.md | 429 + .../oem/aql/high-level-operations/upsert.md | 276 + .../oem/aql/high-level-operations/window.md | 282 + .../oem/aql/high-level-operations/with.md | 71 + .../oem/aql/how-to-invoke-aql/_index.md | 30 + .../aql/how-to-invoke-aql/with-arangosh.md | 786 + .../with-the-web-interface.md | 50 + site/content/arangodb/oem/aql/operators.md | 816 + .../oem/aql/user-defined-functions.md | 405 + .../content/arangodb/oem/components/_index.md | 6 + .../oem/components/arangodb-server/_index.md | 21 + .../arangodb-server/environment-variables.md | 108 + .../oem/components/arangodb-server/ldap.md | 563 + .../oem/components/arangodb-server/options.md | 56 + .../arangodb-server/storage-engine.md | 200 + .../arangodb/oem/components/tools/_index.md | 35 + .../oem/components/tools/arango-datasets.md | 62 + .../components/tools/arangobackup/_index.md | 41 + .../components/tools/arangobackup/examples.md | 340 + .../components/tools/arangobackup/options.md | 15 + .../components/tools/arangobench/_index.md | 204 + .../components/tools/arangobench/options.md | 40 + .../components/tools/arangodb-shell/_index.md | 20 + .../tools/arangodb-shell/details.md | 207 + .../tools/arangodb-shell/examples.md | 88 + .../tools/arangodb-shell/options.md | 12 + .../tools/arangodb-starter/_index.md | 8 + .../tools/arangodb-starter/architecture.md | 229 + .../tools/arangodb-starter/options.md | 465 + .../tools/arangodb-starter/security.md | 132 + .../oem/components/tools/arangodump/_index.md | 20 + .../components/tools/arangodump/examples.md | 317 + .../tools/arangodump/limitations.md | 16 + .../components/tools/arangodump/maskings.md | 1050 ++ .../components/tools/arangodump/options.md | 14 + .../components/tools/arangoexport/_index.md | 13 + .../components/tools/arangoexport/examples.md | 233 + .../components/tools/arangoexport/options.md | 12 + .../components/tools/arangoimport/_index.md | 13 + .../components/tools/arangoimport/details.md | 197 + .../tools/arangoimport/examples-csv.md | 335 + .../tools/arangoimport/examples-json.md | 272 + .../components/tools/arangoimport/options.md | 12 + .../components/tools/arangoinspect/_index.md | 8 + .../tools/arangoinspect/examples.md | 122 + .../components/tools/arangoinspect/options.md | 12 + .../components/tools/arangorestore/_index.md | 17 + .../tools/arangorestore/examples.md | 366 + .../components/tools/arangorestore/options.md | 12 + .../components/tools/arangovpack/_index.md | 12 + .../components/tools/arangovpack/options.md | 12 + .../oem/components/tools/foxx-cli/_index.md | 17 + .../oem/components/tools/foxx-cli/details.md | 178 + .../oem/components/web-interface/_index.md | 16 + .../oem/components/web-interface/cluster.md | 78 + .../components/web-interface/collections.md | 72 + .../oem/components/web-interface/dashboard.md | 37 + .../oem/components/web-interface/document.md | 21 + .../oem/components/web-interface/graphs.md | 194 + .../oem/components/web-interface/logs.md | 20 + .../oem/components/web-interface/queries.md | 117 + .../oem/components/web-interface/services.md | 50 + .../oem/components/web-interface/users.md | 40 + site/content/arangodb/oem/concepts/_index.md | 6 + .../arangodb/oem/concepts/data-models.md | 86 + .../arangodb/oem/concepts/data-retrieval.md | 24 + .../oem/concepts/data-structure/_index.md | 67 + .../concepts/data-structure/collections.md | 751 + .../oem/concepts/data-structure/databases.md | 604 + .../data-structure/documents/_index.md | 1135 ++ .../documents/computed-values.md | 435 + .../documents/schema-validation.md | 404 + .../oem/concepts/data-structure/views.md | 766 + .../arangodb/oem/data-science/_index.md | 133 + .../oem/data-science/adapters/_index.md | 20 + .../adapters/arangodb-cugraph-adapter.md | 152 + .../adapters/arangodb-dgl-adapter.md | 251 + .../adapters/arangodb-networkx-adapter.md | 202 + .../adapters/arangodb-pyg-adapter.md | 259 + .../adapters/arangodb-rdf-adapter.md | 169 + .../oem/data-science/arangograph-notebooks.md | 22 + .../oem/data-science/arangographml/_index.md | 181 + .../oem/data-science/arangographml/deploy.md | 78 + .../arangographml/getting-started.md | 967 ++ .../oem/data-science/llm-knowledge-graphs.md | 73 + .../oem/data-science/pregel/_index.md | 331 + .../oem/data-science/pregel/algorithms.md | 369 + site/content/arangodb/oem/deploy/_index.md | 144 + .../oem/deploy/active-failover/_index.md | 127 + .../deploy/active-failover/administration.md | 79 + .../deploy/active-failover/manual-start.md | 276 + .../using-the-arangodb-starter.md | 158 + .../arangodb/oem/deploy/arangosync/_index.md | 129 + .../oem/deploy/arangosync/administration.md | 147 + .../deploy/arangosync/deployment/_index.md | 110 + .../arangosync/deployment/arangodb-cluster.md | 108 + .../deployment/arangosync-master.md | 78 + .../deployment/arangosync-workers.md | 54 + .../deployment/prometheus-and-grafana.md | 103 + .../oem/deploy/arangosync/monitoring.md | 90 + .../arangosync/operations-and-maintenance.md | 70 + .../oem/deploy/arangosync/security.md | 182 + .../oem/deploy/arangosync/troubleshooting.md | 156 + .../oem/deploy/architecture/_index.md | 7 + .../oem/deploy/architecture/data-sharding.md | 192 + .../oem/deploy/architecture/replication.md | 119 + .../oem/deploy/architecture/scalability.md | 83 + .../arangodb/oem/deploy/cluster/_index.md | 395 + .../oem/deploy/cluster/administration.md | 336 + .../oem/deploy/cluster/deployment/_index.md | 96 + .../deploy/cluster/deployment/manual-start.md | 385 + .../deployment/using-the-arangodb-starter.md | 251 + .../oem/deploy/cluster/limitations.md | 25 + .../arangodb/oem/deploy/in-the-cloud.md | 47 + .../content/arangodb/oem/deploy/kubernetes.md | 25 + site/content/arangodb/oem/deploy/oneshard.md | 320 + .../oem/deploy/production-checklist.md | 100 + .../oem/deploy/single-instance-vs-cluster.md | 168 + .../oem/deploy/single-instance/_index.md | 32 + .../deploy/single-instance/manual-start.md | 73 + .../using-the-arangodb-starter.md | 108 + site/content/arangodb/oem/develop/_index.md | 6 + .../arangodb/oem/develop/drivers/_index.md | 53 + .../arangodb/oem/develop/drivers/go.md | 735 + .../oem/develop/drivers/java/_index.md | 480 + .../java/reference-version-6/_index.md | 71 + .../java/reference-version-6/driver-setup.md | 276 + .../java/reference-version-6/serialization.md | 236 + .../java/reference-version-7/_index.md | 7 + .../changes-in-version-7.md | 459 + .../java/reference-version-7/driver-setup.md | 326 + .../java/reference-version-7/serialization.md | 247 + .../oem/develop/drivers/javascript.md | 224 + .../arangodb/oem/develop/drivers/python.md | 329 + .../arangodb/oem/develop/error-codes.md | 75 + .../arangodb/oem/develop/exit-codes.md | 43 + .../oem/develop/foxx-microservices/_index.md | 74 + .../develop/foxx-microservices/deployment.md | 20 + .../foxx-microservices/getting-started.md | 457 + .../foxx-microservices/guides/_index.md | 30 + .../guides/access-from-the-browser.md | 151 + .../guides/authentication-and-sessions.md | 242 + .../guides/development-mode.md | 86 + .../guides/foxx-in-a-cluster.md | 69 + .../guides/linking-services-together.md | 223 + .../guides/making-requests.md | 44 + .../guides/scripts-and-scheduling.md | 157 + .../guides/testing-foxx-services.md | 259 + .../guides/using-node-modules.md | 52 + .../guides/using-webpack-with-foxx.md | 100 + .../guides/working-with-collections.md | 70 + .../guides/working-with-files.md | 111 + .../guides/working-with-routers.md | 126 + .../guides/writing-queries.md | 232 + .../foxx-microservices/reference/_index.md | 19 + .../reference/configuration.md | 78 + .../reference/related-modules/_index.md | 62 + .../related-modules/authentication.md | 109 + .../reference/related-modules/graphql.md | 160 + .../reference/related-modules/oauth-1-0a.md | 430 + .../reference/related-modules/oauth-2-0.md | 290 + .../reference/related-modules/queues.md | 462 + .../reference/routers/_index.md | 217 + .../reference/routers/endpoints.md | 615 + .../reference/routers/middleware.md | 86 + .../reference/routers/request.md | 408 + .../reference/routers/response.md | 465 + .../reference/service-context.md | 297 + .../reference/service-manifest.md | 307 + .../reference/sessions-middleware/_index.md | 86 + .../session-storages/_index.md | 100 + .../session-storages/collection-storage.md | 88 + .../session-storages/jwt-storage.md | 74 + .../session-transports/_index.md | 84 + .../session-transports/cookie-transport.md | 79 + .../session-transports/header-transport.md | 39 + .../arangodb/oem/develop/http-api/_index.md | 111 + .../oem/develop/http-api/administration.md | 1654 ++ .../oem/develop/http-api/analyzers.md | 337 + .../oem/develop/http-api/authentication.md | 451 + .../oem/develop/http-api/batch-requests.md | 385 + .../arangodb/oem/develop/http-api/cluster.md | 1563 ++ .../oem/develop/http-api/collections.md | 5949 +++++++ .../oem/develop/http-api/databases.md | 461 + .../oem/develop/http-api/documents.md | 3068 ++++ .../arangodb/oem/develop/http-api/foxx.md | 1075 ++ .../http-api/general-request-handling.md | 562 + .../oem/develop/http-api/graphs/_index.md | 8 + .../oem/develop/http-api/graphs/edges.md | 181 + .../develop/http-api/graphs/named-graphs.md | 7664 ++++++++ .../oem/develop/http-api/hot-backups.md | 695 + .../arangodb/oem/develop/http-api/import.md | 606 + .../oem/develop/http-api/indexes/_index.md | 353 + .../oem/develop/http-api/indexes/fulltext.md | 120 + .../develop/http-api/indexes/geo-spatial.md | 173 + .../oem/develop/http-api/indexes/inverted.md | 644 + .../http-api/indexes/multi-dimensional.md | 121 + .../develop/http-api/indexes/persistent.md | 242 + .../oem/develop/http-api/indexes/ttl.md | 118 + .../arangodb/oem/develop/http-api/jobs.md | 831 + .../oem/develop/http-api/monitoring/_index.md | 8 + .../oem/develop/http-api/monitoring/logs.md | 741 + .../develop/http-api/monitoring/metrics.md | 214 + .../develop/http-api/monitoring/statistics.md | 689 + .../arangodb/oem/develop/http-api/pregel.md | 1375 ++ .../oem/develop/http-api/queries/_index.md | 8 + .../develop/http-api/queries/aql-queries.md | 3482 ++++ .../queries/aql-query-results-cache.md | 396 + .../queries/user-defined-aql-functions.md | 481 + .../develop/http-api/replication/_index.md | 22 + .../replication/other-replication-commands.md | 55 + .../replication/replication-applier.md | 1014 ++ .../http-api/replication/replication-dump.md | 992 ++ .../replication/replication-logger.md | 478 + .../http-api/replication/write-ahead-log.md | 776 + .../arangodb/oem/develop/http-api/security.md | 161 + .../arangodb/oem/develop/http-api/tasks.md | 623 + .../develop/http-api/transactions/_index.md | 17 + .../transactions/javascript-transactions.md | 310 + .../transactions/stream-transactions.md | 557 + .../arangodb/oem/develop/http-api/users.md | 1106 ++ .../oem/develop/http-api/views/_index.md | 30 + .../http-api/views/arangosearch-views.md | 2741 +++ .../http-api/views/search-alias-views.md | 1332 ++ .../oem/develop/integrations/_index.md | 49 + .../arangodb-datasource-for-apache-spark.md | 422 + .../_index.md | 283 + .../configuration.md | 244 + .../integrations/spring-boot-arangodb.md | 1507 ++ .../spring-data-arangodb/_index.md | 341 + .../spring-data-arangodb/migration.md | 109 + .../reference-version-3/_index.md | 6 + .../reference-version-3/mapping/_index.md | 187 + .../reference-version-3/mapping/auditing.md | 148 + .../reference-version-3/mapping/converter.md | 55 + .../reference-version-3/mapping/document.md | 97 + .../reference-version-3/mapping/edge.md | 95 + .../reference-version-3/mapping/events.md | 42 + .../reference-version-3/mapping/indexes.md | 121 + .../reference-version-3/mapping/reference.md | 65 + .../reference-version-3/mapping/relations.md | 34 + .../repositories/_index.md | 47 + .../repositories/queries/_index.md | 125 + .../repositories/queries/derived-queries.md | 218 + .../repositories/queries/named-queries.md | 34 + .../repositories/queries/query-methods.md | 132 + .../reference-version-3/template.md | 15 + .../reference-version-4/_index.md | 6 + .../reference-version-4/mapping/_index.md | 280 + .../reference-version-4/mapping/auditing.md | 148 + .../mapping/computed-values.md | 58 + .../reference-version-4/mapping/converter.md | 53 + .../reference-version-4/mapping/document.md | 97 + .../reference-version-4/mapping/edge.md | 95 + .../reference-version-4/mapping/events.md | 42 + .../reference-version-4/mapping/indexes.md | 121 + .../reference-version-4/mapping/reference.md | 65 + .../reference-version-4/mapping/relations.md | 34 + .../repositories/_index.md | 47 + .../repositories/queries/_index.md | 125 + .../repositories/queries/derived-queries.md | 218 + .../repositories/queries/named-queries.md | 34 + .../repositories/queries/query-methods.md | 132 + .../reference-version-4/template.md | 15 + .../javascript-api/@arangodb/_index.md | 248 + .../@arangodb/collection-object.md | 1773 ++ .../javascript-api/@arangodb/cursor-object.md | 106 + .../javascript-api/@arangodb/db-object.md | 1284 ++ .../javascript-api/@arangodb/view-object.md | 187 + .../oem/develop/javascript-api/_index.md | 290 + .../oem/develop/javascript-api/actions.md | 161 + .../oem/develop/javascript-api/analyzers.md | 183 + .../oem/develop/javascript-api/aql-queries.md | 98 + .../oem/develop/javascript-api/console.md | 172 + .../oem/develop/javascript-api/crypto.md | 352 + .../arangodb/oem/develop/javascript-api/fs.md | 296 + .../oem/develop/javascript-api/request.md | 184 + .../oem/develop/javascript-api/tasks.md | 177 + .../oem/develop/operational-factors.md | 361 + .../oem/develop/satellitecollections.md | 139 + .../arangodb/oem/develop/smartjoins.md | 308 + .../oem/develop/transactions/_index.md | 69 + .../oem/develop/transactions/durability.md | 66 + .../transactions/javascript-transactions.md | 466 + .../oem/develop/transactions/limitations.md | 156 + .../transactions/locking-and-isolation.md | 237 + .../transactions/stream-transactions.md | 212 + .../arangodb/oem/get-started/_index.md | 102 + .../how-to-interact-with-arangodb.md | 140 + .../get-started/on-premises-installation.md | 99 + .../get-started/set-up-a-cloud-instance.md | 166 + .../oem/get-started/start-using-aql/_index.md | 157 + .../oem/get-started/start-using-aql/crud.md | 371 + .../get-started/start-using-aql/dataset.md | 99 + .../oem/get-started/start-using-aql/filter.md | 137 + .../oem/get-started/start-using-aql/geo.md | 144 + .../oem/get-started/start-using-aql/graphs.md | 303 + .../oem/get-started/start-using-aql/joins.md | 323 + .../get-started/start-using-aql/sort-limit.md | 183 + site/content/arangodb/oem/graphs/_index.md | 431 + .../oem/graphs/enterprisegraphs/_index.md | 56 + .../enterprisegraphs/getting-started.md | 314 + .../oem/graphs/enterprisegraphs/management.md | 336 + .../arangodb/oem/graphs/example-graphs.md | 263 + .../oem/graphs/general-graphs/_index.md | 107 + .../oem/graphs/general-graphs/functions.md | 938 + .../oem/graphs/general-graphs/management.md | 833 + .../oem/graphs/satellitegraphs/_index.md | 83 + .../oem/graphs/satellitegraphs/details.md | 254 + .../oem/graphs/satellitegraphs/management.md | 320 + .../arangodb/oem/graphs/smartgraphs/_index.md | 125 + .../oem/graphs/smartgraphs/getting-started.md | 207 + .../oem/graphs/smartgraphs/management.md | 354 + .../testing-graphs-on-single-server.md | 44 + .../arangodb/oem/graphs/working-with-edges.md | 36 + .../arangodb/oem/index-and-search/_index.md | 6 + .../oem/index-and-search/analyzers.md | 1693 ++ .../index-and-search/arangosearch/_index.md | 1004 ++ .../arangosearch-views-reference.md | 492 + .../case-sensitivity-and-diacritics.md | 125 + .../arangosearch/exact-value-matching.md | 236 + .../arangosearch/example-datasets.md | 38 + .../arangosearch/faceted-search.md | 137 + .../arangosearch/full-text-token-search.md | 182 + .../arangosearch/fuzzy-search.md | 388 + .../arangosearch/geospatial-search.md | 632 + .../arangosearch/nested-search.md | 321 + .../arangosearch/performance.md | 673 + .../phrase-and-proximity-search.md | 165 + .../arangosearch/prefix-matching.md | 453 + .../arangosearch/range-queries.md | 303 + .../index-and-search/arangosearch/ranking.md | 602 + .../search-alias-views-reference.md | 108 + .../arangosearch/search-highlighting.md | 215 + .../arangosearch/wildcard-search.md | 203 + .../oem/index-and-search/indexing/_index.md | 8 + .../oem/index-and-search/indexing/basics.md | 657 + .../indexing/index-utilization.md | 149 + .../indexing/which-index-to-use-when.md | 204 + .../indexing/working-with-indexes/_index.md | 376 + .../working-with-indexes/fulltext-indexes.md | 106 + .../geo-spatial-indexes.md | 434 + .../working-with-indexes/inverted-indexes.md | 630 + .../multi-dimensional-indexes.md | 172 + .../persistent-indexes.md | 309 + .../working-with-indexes/ttl-indexes.md | 202 + .../vertex-centric-indexes.md | 93 + .../content/arangodb/oem/operations/_index.md | 6 + .../oem/operations/administration/_index.md | 49 + .../administration/arangodb-starter/_index.md | 10 + .../arangodb-starter/recovery-procedure.md | 46 + .../arangodb-starter/removal-procedure.md | 71 + .../administration/configuration.md | 343 + .../administration/import-and-export.md | 11 + .../administration/license-management.md | 94 + .../operations/administration/log-levels.md | 154 + .../administration/reduce-memory-footprint.md | 725 + .../operations/administration/telemetrics.md | 129 + .../administration/user-management/_index.md | 433 + .../user-management/in-arangosh.md | 364 + .../oem/operations/backup-and-restore.md | 345 + .../oem/operations/installation/_index.md | 82 + .../installation/compiling/_index.md | 26 + .../compiling/compile-on-debian.md | 273 + .../compiling/compile-on-windows.md | 190 + .../compiling/recompiling-jemalloc.md | 54 + .../compiling/running-custom-build.md | 54 + .../oem/operations/installation/docker.md | 263 + .../operations/installation/linux/_index.md | 90 + .../linux/linux-os-tuning-script-examples.md | 132 + .../linux/operating-system-configuration.md | 192 + .../oem/operations/installation/macos.md | 43 + .../operations/installation/uninstallation.md | 35 + .../oem/operations/installation/windows.md | 254 + .../oem/operations/security/_index.md | 7 + .../oem/operations/security/audit-logging.md | 291 + .../security/change-root-password.md | 37 + .../operations/security/encryption-at-rest.md | 145 + .../security/securing-starter-deployments.md | 39 + .../operations/security/security-options.md | 372 + .../oem/operations/troubleshooting/_index.md | 7 + .../oem/operations/troubleshooting/arangod.md | 136 + .../troubleshooting/cluster/_index.md | 32 + .../troubleshooting/cluster/agency-dump.md | 40 + .../troubleshooting/emergency-console.md | 47 + .../troubleshooting/query-debug-packages.md | 75 + .../oem/operations/upgrading/_index.md | 88 + .../community-to-enterprise-upgrade.md | 61 + .../oem/operations/upgrading/downgrading.md | 85 + .../upgrading/manual-deployments/_index.md | 10 + .../manual-deployments/active-failover.md | 215 + .../upgrading/manual-deployments/cluster.md | 240 + .../os-specific-information/_index.md | 6 + .../os-specific-information/linux.md | 72 + .../os-specific-information/macos.md | 35 + .../os-specific-information/windows.md | 124 + .../upgrading/starter-deployments.md | 297 + .../arangodb/oem/release-notes/_index.md | 96 + .../deprecated-and-removed-features.md | 283 + .../oem/release-notes/version-3.0/_index.md | 6 + .../incompatible-changes-in-3-0.md | 1093 ++ .../version-3.0/whats-new-in-3-0.md | 536 + .../oem/release-notes/version-3.1/_index.md | 6 + .../incompatible-changes-in-3-1.md | 137 + .../version-3.1/whats-new-in-3-1.md | 222 + .../oem/release-notes/version-3.10/_index.md | 6 + .../version-3.10/api-changes-in-3-10.md | 1006 ++ .../incompatible-changes-in-3-10.md | 395 + .../version-3.10/known-issues-in-3-10.md | 63 + .../version-3.10/whats-new-in-3-10.md | 1822 ++ .../oem/release-notes/version-3.11/_index.md | 6 + .../version-3.11/api-changes-in-3-11.md | 881 + .../incompatible-changes-in-3-11.md | 695 + .../version-3.11/known-issues-in-3-11.md | 61 + .../version-3.11/whats-new-in-3-11.md | 1458 ++ .../oem/release-notes/version-3.2/_index.md | 6 + .../incompatible-changes-in-3-2.md | 139 + .../version-3.2/known-issues-in-3-2.md | 105 + .../version-3.2/whats-new-in-3-2.md | 388 + .../oem/release-notes/version-3.3/_index.md | 6 + .../incompatible-changes-in-3-3.md | 62 + .../version-3.3/known-issues-in-3-3.md | 18 + .../version-3.3/whats-new-in-3-3.md | 308 + .../oem/release-notes/version-3.4/_index.md | 6 + .../incompatible-changes-in-3-4.md | 842 + .../version-3.4/known-issues-in-3-4.md | 58 + .../version-3.4/whats-new-in-3-4.md | 1146 ++ .../oem/release-notes/version-3.5/_index.md | 6 + .../incompatible-changes-in-3-5.md | 163 + .../version-3.5/known-issues-in-3-5.md | 98 + .../version-3.5/whats-new-in-3-5.md | 742 + .../oem/release-notes/version-3.6/_index.md | 6 + .../incompatible-changes-in-3-6.md | 60 + .../version-3.6/known-issues-in-3-6.md | 95 + .../version-3.6/whats-new-in-3-6.md | 872 + .../oem/release-notes/version-3.7/_index.md | 6 + .../version-3.7/api-changes-in-3-7.md | 240 + .../incompatible-changes-in-3-7.md | 241 + .../version-3.7/known-issues-in-3-7.md | 81 + .../version-3.7/whats-new-in-3-7.md | 1004 ++ .../oem/release-notes/version-3.8/_index.md | 6 + .../version-3.8/api-changes-in-3-8.md | 374 + .../incompatible-changes-in-3-8.md | 568 + .../version-3.8/known-issues-in-3-8.md | 68 + .../version-3.8/whats-new-in-3-8.md | 1147 ++ .../oem/release-notes/version-3.9/_index.md | 6 + .../version-3.9/api-changes-in-3-9.md | 504 + .../incompatible-changes-in-3-9.md | 304 + .../version-3.9/known-issues-in-3-9.md | 69 + .../version-3.9/whats-new-in-3-9.md | 1266 ++ site/data/oem/allMetrics.yaml | 7073 ++++++++ site/data/oem/arangobackup.json | 1349 ++ site/data/oem/arangobench.json | 1738 ++ site/data/oem/arangod.json | 14457 ++++++++++++++++ site/data/oem/arangodump.json | 1779 ++ site/data/oem/arangoexport.json | 1510 ++ site/data/oem/arangoimport.json | 1763 ++ site/data/oem/arangoinspect.json | 2033 +++ site/data/oem/arangorestore.json | 1750 ++ site/data/oem/arangosh.json | 2057 +++ site/data/oem/arangovpack.json | 1002 ++ site/data/oem/cache.json | 4158 +++++ site/data/oem/errors.yaml | 1465 ++ site/data/oem/exitcodes.yaml | 87 + site/data/oem/optimizer-rules.json | 794 + site/data/versions.yaml | 5 + .../layouts/partials/breadcrumbs.html | 3 +- .../layouts/partials/shortcodes/version.html | 2 +- .../layouts/shortcodes/full-version.html | 2 + .../layouts/shortcodes/program-options.md | 4 +- .../arangoproxy/internal/service/service.go | 3 +- toolchain/docker/amd64/docker-compose.yml | 3 + toolchain/docker/arm64/docker-compose.yml | 3 + toolchain/docker/docker-compose.local.yml | 3 + toolchain/scripts/toolchain.sh | 5 + 550 files changed, 202261 insertions(+), 12 deletions(-) create mode 100644 site/content/arangodb/oem/_index.md create mode 100644 site/content/arangodb/oem/about/_index.md create mode 100644 site/content/arangodb/oem/about/features/_index.md create mode 100644 site/content/arangodb/oem/about/features/community-edition.md create mode 100644 site/content/arangodb/oem/about/features/enterprise-edition.md create mode 100644 site/content/arangodb/oem/about/features/highlights-by-version.md create mode 100644 site/content/arangodb/oem/about/use-cases.md create mode 100644 site/content/arangodb/oem/aql/_index.md create mode 100644 site/content/arangodb/oem/aql/common-errors.md create mode 100644 site/content/arangodb/oem/aql/data-queries.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/_index.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/counting.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/create-test-data.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/diffing-two-documents.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/dynamic-attribute-names.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/grouping.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/joins.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/projections-and-filters.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/queries-without-collections.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/remove-vertex.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/traversals.md create mode 100644 site/content/arangodb/oem/aql/examples-and-query-patterns/upsert-repsert-guide.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/_index.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/caching-query-results.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/explaining-queries.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/parsing-queries.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/query-optimization.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/query-profiling.md create mode 100644 site/content/arangodb/oem/aql/execution-and-performance/query-statistics.md create mode 100644 site/content/arangodb/oem/aql/functions/_index.md create mode 100644 site/content/arangodb/oem/aql/functions/arangosearch.md create mode 100644 site/content/arangodb/oem/aql/functions/array.md create mode 100644 site/content/arangodb/oem/aql/functions/bit.md create mode 100644 site/content/arangodb/oem/aql/functions/date.md create mode 100644 site/content/arangodb/oem/aql/functions/document-object.md create mode 100644 site/content/arangodb/oem/aql/functions/fulltext.md create mode 100644 site/content/arangodb/oem/aql/functions/geo.md create mode 100644 site/content/arangodb/oem/aql/functions/miscellaneous.md create mode 100644 site/content/arangodb/oem/aql/functions/numeric.md create mode 100644 site/content/arangodb/oem/aql/functions/string.md create mode 100644 site/content/arangodb/oem/aql/functions/type-check-and-cast.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/_index.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/accessing-data-from-collections.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/bind-parameters.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/data-types.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/limitations.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/query-errors.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/query-results.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/subqueries.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/syntax.md create mode 100644 site/content/arangodb/oem/aql/fundamentals/type-and-value-order.md create mode 100644 site/content/arangodb/oem/aql/graphs/_index.md create mode 100644 site/content/arangodb/oem/aql/graphs/all-shortest-paths.md create mode 100644 site/content/arangodb/oem/aql/graphs/k-paths.md create mode 100644 site/content/arangodb/oem/aql/graphs/k-shortest-paths.md create mode 100644 site/content/arangodb/oem/aql/graphs/shortest-path.md create mode 100644 site/content/arangodb/oem/aql/graphs/traversals-explained.md create mode 100644 site/content/arangodb/oem/aql/graphs/traversals.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/_index.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/collect.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/filter.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/for.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/insert.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/let.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/limit.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/remove.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/replace.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/return.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/search.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/sort.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/update.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/upsert.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/window.md create mode 100644 site/content/arangodb/oem/aql/high-level-operations/with.md create mode 100644 site/content/arangodb/oem/aql/how-to-invoke-aql/_index.md create mode 100644 site/content/arangodb/oem/aql/how-to-invoke-aql/with-arangosh.md create mode 100644 site/content/arangodb/oem/aql/how-to-invoke-aql/with-the-web-interface.md create mode 100644 site/content/arangodb/oem/aql/operators.md create mode 100644 site/content/arangodb/oem/aql/user-defined-functions.md create mode 100644 site/content/arangodb/oem/components/_index.md create mode 100644 site/content/arangodb/oem/components/arangodb-server/_index.md create mode 100644 site/content/arangodb/oem/components/arangodb-server/environment-variables.md create mode 100644 site/content/arangodb/oem/components/arangodb-server/ldap.md create mode 100644 site/content/arangodb/oem/components/arangodb-server/options.md create mode 100644 site/content/arangodb/oem/components/arangodb-server/storage-engine.md create mode 100644 site/content/arangodb/oem/components/tools/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arango-datasets.md create mode 100644 site/content/arangodb/oem/components/tools/arangobackup/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangobackup/examples.md create mode 100644 site/content/arangodb/oem/components/tools/arangobackup/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangobench/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangobench/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-shell/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-shell/details.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-shell/examples.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-shell/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-starter/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-starter/architecture.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-starter/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangodb-starter/security.md create mode 100644 site/content/arangodb/oem/components/tools/arangodump/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangodump/examples.md create mode 100644 site/content/arangodb/oem/components/tools/arangodump/limitations.md create mode 100644 site/content/arangodb/oem/components/tools/arangodump/maskings.md create mode 100644 site/content/arangodb/oem/components/tools/arangodump/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangoexport/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangoexport/examples.md create mode 100644 site/content/arangodb/oem/components/tools/arangoexport/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangoimport/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangoimport/details.md create mode 100644 site/content/arangodb/oem/components/tools/arangoimport/examples-csv.md create mode 100644 site/content/arangodb/oem/components/tools/arangoimport/examples-json.md create mode 100644 site/content/arangodb/oem/components/tools/arangoimport/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangoinspect/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangoinspect/examples.md create mode 100644 site/content/arangodb/oem/components/tools/arangoinspect/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangorestore/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangorestore/examples.md create mode 100644 site/content/arangodb/oem/components/tools/arangorestore/options.md create mode 100644 site/content/arangodb/oem/components/tools/arangovpack/_index.md create mode 100644 site/content/arangodb/oem/components/tools/arangovpack/options.md create mode 100644 site/content/arangodb/oem/components/tools/foxx-cli/_index.md create mode 100644 site/content/arangodb/oem/components/tools/foxx-cli/details.md create mode 100644 site/content/arangodb/oem/components/web-interface/_index.md create mode 100644 site/content/arangodb/oem/components/web-interface/cluster.md create mode 100644 site/content/arangodb/oem/components/web-interface/collections.md create mode 100644 site/content/arangodb/oem/components/web-interface/dashboard.md create mode 100644 site/content/arangodb/oem/components/web-interface/document.md create mode 100644 site/content/arangodb/oem/components/web-interface/graphs.md create mode 100644 site/content/arangodb/oem/components/web-interface/logs.md create mode 100644 site/content/arangodb/oem/components/web-interface/queries.md create mode 100644 site/content/arangodb/oem/components/web-interface/services.md create mode 100644 site/content/arangodb/oem/components/web-interface/users.md create mode 100644 site/content/arangodb/oem/concepts/_index.md create mode 100644 site/content/arangodb/oem/concepts/data-models.md create mode 100644 site/content/arangodb/oem/concepts/data-retrieval.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/_index.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/collections.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/databases.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/documents/_index.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/documents/computed-values.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/documents/schema-validation.md create mode 100644 site/content/arangodb/oem/concepts/data-structure/views.md create mode 100644 site/content/arangodb/oem/data-science/_index.md create mode 100644 site/content/arangodb/oem/data-science/adapters/_index.md create mode 100644 site/content/arangodb/oem/data-science/adapters/arangodb-cugraph-adapter.md create mode 100644 site/content/arangodb/oem/data-science/adapters/arangodb-dgl-adapter.md create mode 100644 site/content/arangodb/oem/data-science/adapters/arangodb-networkx-adapter.md create mode 100644 site/content/arangodb/oem/data-science/adapters/arangodb-pyg-adapter.md create mode 100644 site/content/arangodb/oem/data-science/adapters/arangodb-rdf-adapter.md create mode 100644 site/content/arangodb/oem/data-science/arangograph-notebooks.md create mode 100644 site/content/arangodb/oem/data-science/arangographml/_index.md create mode 100644 site/content/arangodb/oem/data-science/arangographml/deploy.md create mode 100644 site/content/arangodb/oem/data-science/arangographml/getting-started.md create mode 100644 site/content/arangodb/oem/data-science/llm-knowledge-graphs.md create mode 100644 site/content/arangodb/oem/data-science/pregel/_index.md create mode 100644 site/content/arangodb/oem/data-science/pregel/algorithms.md create mode 100644 site/content/arangodb/oem/deploy/_index.md create mode 100644 site/content/arangodb/oem/deploy/active-failover/_index.md create mode 100644 site/content/arangodb/oem/deploy/active-failover/administration.md create mode 100644 site/content/arangodb/oem/deploy/active-failover/manual-start.md create mode 100644 site/content/arangodb/oem/deploy/active-failover/using-the-arangodb-starter.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/_index.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/administration.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/deployment/_index.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/deployment/arangodb-cluster.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-master.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-workers.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/deployment/prometheus-and-grafana.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/monitoring.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/operations-and-maintenance.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/security.md create mode 100644 site/content/arangodb/oem/deploy/arangosync/troubleshooting.md create mode 100644 site/content/arangodb/oem/deploy/architecture/_index.md create mode 100644 site/content/arangodb/oem/deploy/architecture/data-sharding.md create mode 100644 site/content/arangodb/oem/deploy/architecture/replication.md create mode 100644 site/content/arangodb/oem/deploy/architecture/scalability.md create mode 100644 site/content/arangodb/oem/deploy/cluster/_index.md create mode 100644 site/content/arangodb/oem/deploy/cluster/administration.md create mode 100644 site/content/arangodb/oem/deploy/cluster/deployment/_index.md create mode 100644 site/content/arangodb/oem/deploy/cluster/deployment/manual-start.md create mode 100644 site/content/arangodb/oem/deploy/cluster/deployment/using-the-arangodb-starter.md create mode 100644 site/content/arangodb/oem/deploy/cluster/limitations.md create mode 100644 site/content/arangodb/oem/deploy/in-the-cloud.md create mode 100644 site/content/arangodb/oem/deploy/kubernetes.md create mode 100644 site/content/arangodb/oem/deploy/oneshard.md create mode 100644 site/content/arangodb/oem/deploy/production-checklist.md create mode 100644 site/content/arangodb/oem/deploy/single-instance-vs-cluster.md create mode 100644 site/content/arangodb/oem/deploy/single-instance/_index.md create mode 100644 site/content/arangodb/oem/deploy/single-instance/manual-start.md create mode 100644 site/content/arangodb/oem/deploy/single-instance/using-the-arangodb-starter.md create mode 100644 site/content/arangodb/oem/develop/_index.md create mode 100644 site/content/arangodb/oem/develop/drivers/_index.md create mode 100644 site/content/arangodb/oem/develop/drivers/go.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/_index.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-6/_index.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-6/driver-setup.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-6/serialization.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-7/_index.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-7/changes-in-version-7.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-7/driver-setup.md create mode 100644 site/content/arangodb/oem/develop/drivers/java/reference-version-7/serialization.md create mode 100644 site/content/arangodb/oem/develop/drivers/javascript.md create mode 100644 site/content/arangodb/oem/develop/drivers/python.md create mode 100644 site/content/arangodb/oem/develop/error-codes.md create mode 100644 site/content/arangodb/oem/develop/exit-codes.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/deployment.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/getting-started.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/access-from-the-browser.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/authentication-and-sessions.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/development-mode.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/foxx-in-a-cluster.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/linking-services-together.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/making-requests.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/scripts-and-scheduling.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/testing-foxx-services.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/using-node-modules.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/using-webpack-with-foxx.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-collections.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-files.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-routers.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/guides/writing-queries.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/configuration.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/authentication.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/graphql.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-2-0.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/queues.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/routers/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/routers/endpoints.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/routers/middleware.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/routers/request.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/routers/response.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/service-context.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/service-manifest.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md create mode 100644 site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md create mode 100644 site/content/arangodb/oem/develop/http-api/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/administration.md create mode 100644 site/content/arangodb/oem/develop/http-api/analyzers.md create mode 100644 site/content/arangodb/oem/develop/http-api/authentication.md create mode 100644 site/content/arangodb/oem/develop/http-api/batch-requests.md create mode 100644 site/content/arangodb/oem/develop/http-api/cluster.md create mode 100644 site/content/arangodb/oem/develop/http-api/collections.md create mode 100644 site/content/arangodb/oem/develop/http-api/databases.md create mode 100644 site/content/arangodb/oem/develop/http-api/documents.md create mode 100644 site/content/arangodb/oem/develop/http-api/foxx.md create mode 100644 site/content/arangodb/oem/develop/http-api/general-request-handling.md create mode 100644 site/content/arangodb/oem/develop/http-api/graphs/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/graphs/edges.md create mode 100644 site/content/arangodb/oem/develop/http-api/graphs/named-graphs.md create mode 100644 site/content/arangodb/oem/develop/http-api/hot-backups.md create mode 100644 site/content/arangodb/oem/develop/http-api/import.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/fulltext.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/geo-spatial.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/inverted.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/multi-dimensional.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/persistent.md create mode 100644 site/content/arangodb/oem/develop/http-api/indexes/ttl.md create mode 100644 site/content/arangodb/oem/develop/http-api/jobs.md create mode 100644 site/content/arangodb/oem/develop/http-api/monitoring/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/monitoring/logs.md create mode 100644 site/content/arangodb/oem/develop/http-api/monitoring/metrics.md create mode 100644 site/content/arangodb/oem/develop/http-api/monitoring/statistics.md create mode 100644 site/content/arangodb/oem/develop/http-api/pregel.md create mode 100644 site/content/arangodb/oem/develop/http-api/queries/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/queries/aql-queries.md create mode 100644 site/content/arangodb/oem/develop/http-api/queries/aql-query-results-cache.md create mode 100644 site/content/arangodb/oem/develop/http-api/queries/user-defined-aql-functions.md create mode 100644 site/content/arangodb/oem/develop/http-api/replication/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/replication/other-replication-commands.md create mode 100644 site/content/arangodb/oem/develop/http-api/replication/replication-applier.md create mode 100644 site/content/arangodb/oem/develop/http-api/replication/replication-dump.md create mode 100644 site/content/arangodb/oem/develop/http-api/replication/replication-logger.md create mode 100644 site/content/arangodb/oem/develop/http-api/replication/write-ahead-log.md create mode 100644 site/content/arangodb/oem/develop/http-api/security.md create mode 100644 site/content/arangodb/oem/develop/http-api/tasks.md create mode 100644 site/content/arangodb/oem/develop/http-api/transactions/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/transactions/javascript-transactions.md create mode 100644 site/content/arangodb/oem/develop/http-api/transactions/stream-transactions.md create mode 100644 site/content/arangodb/oem/develop/http-api/users.md create mode 100644 site/content/arangodb/oem/develop/http-api/views/_index.md create mode 100644 site/content/arangodb/oem/develop/http-api/views/arangosearch-views.md create mode 100644 site/content/arangodb/oem/develop/http-api/views/search-alias-views.md create mode 100644 site/content/arangodb/oem/develop/integrations/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/arangodb-datasource-for-apache-spark.md create mode 100644 site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-boot-arangodb.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/migration.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/template.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md create mode 100644 site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/template.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/@arangodb/_index.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/@arangodb/collection-object.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/@arangodb/cursor-object.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/@arangodb/db-object.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/@arangodb/view-object.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/_index.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/actions.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/analyzers.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/aql-queries.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/console.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/crypto.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/fs.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/request.md create mode 100644 site/content/arangodb/oem/develop/javascript-api/tasks.md create mode 100644 site/content/arangodb/oem/develop/operational-factors.md create mode 100644 site/content/arangodb/oem/develop/satellitecollections.md create mode 100644 site/content/arangodb/oem/develop/smartjoins.md create mode 100644 site/content/arangodb/oem/develop/transactions/_index.md create mode 100644 site/content/arangodb/oem/develop/transactions/durability.md create mode 100644 site/content/arangodb/oem/develop/transactions/javascript-transactions.md create mode 100644 site/content/arangodb/oem/develop/transactions/limitations.md create mode 100644 site/content/arangodb/oem/develop/transactions/locking-and-isolation.md create mode 100644 site/content/arangodb/oem/develop/transactions/stream-transactions.md create mode 100644 site/content/arangodb/oem/get-started/_index.md create mode 100644 site/content/arangodb/oem/get-started/how-to-interact-with-arangodb.md create mode 100644 site/content/arangodb/oem/get-started/on-premises-installation.md create mode 100644 site/content/arangodb/oem/get-started/set-up-a-cloud-instance.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/_index.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/crud.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/dataset.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/filter.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/geo.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/graphs.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/joins.md create mode 100644 site/content/arangodb/oem/get-started/start-using-aql/sort-limit.md create mode 100644 site/content/arangodb/oem/graphs/_index.md create mode 100644 site/content/arangodb/oem/graphs/enterprisegraphs/_index.md create mode 100644 site/content/arangodb/oem/graphs/enterprisegraphs/getting-started.md create mode 100644 site/content/arangodb/oem/graphs/enterprisegraphs/management.md create mode 100644 site/content/arangodb/oem/graphs/example-graphs.md create mode 100644 site/content/arangodb/oem/graphs/general-graphs/_index.md create mode 100644 site/content/arangodb/oem/graphs/general-graphs/functions.md create mode 100644 site/content/arangodb/oem/graphs/general-graphs/management.md create mode 100644 site/content/arangodb/oem/graphs/satellitegraphs/_index.md create mode 100644 site/content/arangodb/oem/graphs/satellitegraphs/details.md create mode 100644 site/content/arangodb/oem/graphs/satellitegraphs/management.md create mode 100644 site/content/arangodb/oem/graphs/smartgraphs/_index.md create mode 100644 site/content/arangodb/oem/graphs/smartgraphs/getting-started.md create mode 100644 site/content/arangodb/oem/graphs/smartgraphs/management.md create mode 100644 site/content/arangodb/oem/graphs/smartgraphs/testing-graphs-on-single-server.md create mode 100644 site/content/arangodb/oem/graphs/working-with-edges.md create mode 100644 site/content/arangodb/oem/index-and-search/_index.md create mode 100644 site/content/arangodb/oem/index-and-search/analyzers.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/_index.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/arangosearch-views-reference.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/case-sensitivity-and-diacritics.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/exact-value-matching.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/example-datasets.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/faceted-search.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/full-text-token-search.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/fuzzy-search.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/geospatial-search.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/nested-search.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/performance.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/phrase-and-proximity-search.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/prefix-matching.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/range-queries.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/ranking.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/search-alias-views-reference.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/search-highlighting.md create mode 100644 site/content/arangodb/oem/index-and-search/arangosearch/wildcard-search.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/_index.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/basics.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/index-utilization.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/which-index-to-use-when.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/_index.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/fulltext-indexes.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/inverted-indexes.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/persistent-indexes.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/ttl-indexes.md create mode 100644 site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md create mode 100644 site/content/arangodb/oem/operations/_index.md create mode 100644 site/content/arangodb/oem/operations/administration/_index.md create mode 100644 site/content/arangodb/oem/operations/administration/arangodb-starter/_index.md create mode 100644 site/content/arangodb/oem/operations/administration/arangodb-starter/recovery-procedure.md create mode 100644 site/content/arangodb/oem/operations/administration/arangodb-starter/removal-procedure.md create mode 100644 site/content/arangodb/oem/operations/administration/configuration.md create mode 100644 site/content/arangodb/oem/operations/administration/import-and-export.md create mode 100644 site/content/arangodb/oem/operations/administration/license-management.md create mode 100644 site/content/arangodb/oem/operations/administration/log-levels.md create mode 100644 site/content/arangodb/oem/operations/administration/reduce-memory-footprint.md create mode 100644 site/content/arangodb/oem/operations/administration/telemetrics.md create mode 100644 site/content/arangodb/oem/operations/administration/user-management/_index.md create mode 100644 site/content/arangodb/oem/operations/administration/user-management/in-arangosh.md create mode 100644 site/content/arangodb/oem/operations/backup-and-restore.md create mode 100644 site/content/arangodb/oem/operations/installation/_index.md create mode 100644 site/content/arangodb/oem/operations/installation/compiling/_index.md create mode 100644 site/content/arangodb/oem/operations/installation/compiling/compile-on-debian.md create mode 100644 site/content/arangodb/oem/operations/installation/compiling/compile-on-windows.md create mode 100644 site/content/arangodb/oem/operations/installation/compiling/recompiling-jemalloc.md create mode 100644 site/content/arangodb/oem/operations/installation/compiling/running-custom-build.md create mode 100644 site/content/arangodb/oem/operations/installation/docker.md create mode 100644 site/content/arangodb/oem/operations/installation/linux/_index.md create mode 100644 site/content/arangodb/oem/operations/installation/linux/linux-os-tuning-script-examples.md create mode 100644 site/content/arangodb/oem/operations/installation/linux/operating-system-configuration.md create mode 100644 site/content/arangodb/oem/operations/installation/macos.md create mode 100644 site/content/arangodb/oem/operations/installation/uninstallation.md create mode 100644 site/content/arangodb/oem/operations/installation/windows.md create mode 100644 site/content/arangodb/oem/operations/security/_index.md create mode 100644 site/content/arangodb/oem/operations/security/audit-logging.md create mode 100644 site/content/arangodb/oem/operations/security/change-root-password.md create mode 100644 site/content/arangodb/oem/operations/security/encryption-at-rest.md create mode 100644 site/content/arangodb/oem/operations/security/securing-starter-deployments.md create mode 100644 site/content/arangodb/oem/operations/security/security-options.md create mode 100644 site/content/arangodb/oem/operations/troubleshooting/_index.md create mode 100644 site/content/arangodb/oem/operations/troubleshooting/arangod.md create mode 100644 site/content/arangodb/oem/operations/troubleshooting/cluster/_index.md create mode 100644 site/content/arangodb/oem/operations/troubleshooting/cluster/agency-dump.md create mode 100644 site/content/arangodb/oem/operations/troubleshooting/emergency-console.md create mode 100644 site/content/arangodb/oem/operations/troubleshooting/query-debug-packages.md create mode 100644 site/content/arangodb/oem/operations/upgrading/_index.md create mode 100644 site/content/arangodb/oem/operations/upgrading/community-to-enterprise-upgrade.md create mode 100644 site/content/arangodb/oem/operations/upgrading/downgrading.md create mode 100644 site/content/arangodb/oem/operations/upgrading/manual-deployments/_index.md create mode 100644 site/content/arangodb/oem/operations/upgrading/manual-deployments/active-failover.md create mode 100644 site/content/arangodb/oem/operations/upgrading/manual-deployments/cluster.md create mode 100644 site/content/arangodb/oem/operations/upgrading/os-specific-information/_index.md create mode 100644 site/content/arangodb/oem/operations/upgrading/os-specific-information/linux.md create mode 100644 site/content/arangodb/oem/operations/upgrading/os-specific-information/macos.md create mode 100644 site/content/arangodb/oem/operations/upgrading/os-specific-information/windows.md create mode 100644 site/content/arangodb/oem/operations/upgrading/starter-deployments.md create mode 100644 site/content/arangodb/oem/release-notes/_index.md create mode 100644 site/content/arangodb/oem/release-notes/deprecated-and-removed-features.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.0/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.0/incompatible-changes-in-3-0.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.0/whats-new-in-3-0.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.1/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.1/incompatible-changes-in-3-1.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.1/whats-new-in-3-1.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.10/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.10/api-changes-in-3-10.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.10/incompatible-changes-in-3-10.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.10/known-issues-in-3-10.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.10/whats-new-in-3-10.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.11/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.11/api-changes-in-3-11.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.11/incompatible-changes-in-3-11.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.11/known-issues-in-3-11.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.11/whats-new-in-3-11.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.2/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.2/incompatible-changes-in-3-2.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.2/known-issues-in-3-2.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.2/whats-new-in-3-2.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.3/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.3/incompatible-changes-in-3-3.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.3/known-issues-in-3-3.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.3/whats-new-in-3-3.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.4/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.4/incompatible-changes-in-3-4.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.4/known-issues-in-3-4.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.4/whats-new-in-3-4.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.5/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.5/incompatible-changes-in-3-5.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.5/known-issues-in-3-5.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.5/whats-new-in-3-5.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.6/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.6/incompatible-changes-in-3-6.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.6/known-issues-in-3-6.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.6/whats-new-in-3-6.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.7/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.7/api-changes-in-3-7.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.7/incompatible-changes-in-3-7.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.7/known-issues-in-3-7.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.7/whats-new-in-3-7.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.8/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.8/api-changes-in-3-8.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.8/incompatible-changes-in-3-8.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.8/known-issues-in-3-8.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.8/whats-new-in-3-8.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.9/_index.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.9/api-changes-in-3-9.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.9/incompatible-changes-in-3-9.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.9/known-issues-in-3-9.md create mode 100644 site/content/arangodb/oem/release-notes/version-3.9/whats-new-in-3-9.md create mode 100644 site/data/oem/allMetrics.yaml create mode 100644 site/data/oem/arangobackup.json create mode 100644 site/data/oem/arangobench.json create mode 100644 site/data/oem/arangod.json create mode 100644 site/data/oem/arangodump.json create mode 100644 site/data/oem/arangoexport.json create mode 100644 site/data/oem/arangoimport.json create mode 100644 site/data/oem/arangoinspect.json create mode 100644 site/data/oem/arangorestore.json create mode 100644 site/data/oem/arangosh.json create mode 100644 site/data/oem/arangovpack.json create mode 100644 site/data/oem/cache.json create mode 100644 site/data/oem/errors.yaml create mode 100644 site/data/oem/exitcodes.yaml create mode 100644 site/data/oem/optimizer-rules.json diff --git a/.circleci/base_config.yml b/.circleci/base_config.yml index c6b002c3a1..8ed62fa185 100644 --- a/.circleci/base_config.yml +++ b/.circleci/base_config.yml @@ -28,7 +28,7 @@ commands: git clone --depth 1 --branch $branch_name --recurse-submodules --shallow-submodules --jobs 8 https://github.com/arangodb/arangodb.git /root/project - if [ "<< parameters.version >>" = "3.10" ] || [ "<< parameters.version >>" = "3.11" ]; then + if [ "<< parameters.version >>" = "3.10" ] || [ "<< parameters.version >>" = "3.11" || [ "<< parameters.version >>" = "oem" ]; then ENTERPRISE_BRANCH="<< parameters.version >>" else ENTERPRISE_BRANCH="devel" @@ -131,7 +131,7 @@ commands: set +e if [ "<< parameters.version >>" = "3.10" ]; then cmake --preset enterprise-pr -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" -DCMAKE_LIBRARY_PATH=$OPENSSL_ROOT_DIR/lib -DUSE_MAINTAINER_MODE=Off -DUSE_GOOGLE_TESTS=Off -DUSE_FAILURE_TESTS=Off - elif [ "<< parameters.version >>" = "3.11" ]; then + elif [ "<< parameters.version >>" = "3.11" ] || [ "<< parameters.version >>" = "oem" ]; then # The OpenSSL dir that CMake discovers needs to be adjacent to where ldap.h is located, here: /opt cmake --preset enterprise-pr -DCMAKE_C_COMPILER=/tools/clang -DCMAKE_CXX_COMPILER=/tools/clang++ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" -DCMAKE_LIBRARY_PATH=$OPENSSL_ROOT_DIR/lib -DOPENSSL_ROOT_DIR=/opt -DUSE_MAINTAINER_MODE=Off -DUSE_GOOGLE_TESTS=Off -DUSE_FAILURE_TESTS=Off else diff --git a/.circleci/config.yml b/.circleci/config.yml index 23bd8011e4..954ff6a2ec 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,7 +116,7 @@ jobs: python3 generate_config.py \ --workflow << pipeline.parameters.workflow >> \ - --arangodb-branches << pipeline.parameters.arangodb-3_10 >> << pipeline.parameters.arangodb-3_11 >> << pipeline.parameters.arangodb-3_12 >> << pipeline.parameters.arangodb-3_13 >> \ + --arangodb-branches << pipeline.parameters.arangodb-oem >> << pipeline.parameters.arangodb-3_10 >> << pipeline.parameters.arangodb-3_11 >> << pipeline.parameters.arangodb-3_12 >> << pipeline.parameters.arangodb-3_13 >> \ --arangodb-branch << pipeline.parameters.arangodb-branch >> \ --release-type << pipeline.parameters.release-type >> \ --docs-version << pipeline.parameters.docs-version >> \ diff --git a/.circleci/generate_config.py b/.circleci/generate_config.py index c687e1546e..6d0aa759a1 100644 --- a/.circleci/generate_config.py +++ b/.circleci/generate_config.py @@ -135,7 +135,7 @@ def workflow_generate(config): } }) - if version in ["3.10", "3.11"]: + if version in ["3.10", "3.11", "oem"]: if openssl.startswith("3.0"): compileJob["compile-linux"]["build-image"] = "arangodb/build-alpine-x86_64:3.16-gcc11.2-openssl3.0.10" elif openssl.startswith("3.1"): @@ -191,7 +191,7 @@ def workflow_generate_scheduled(config): "compile-linux": { "context": ["sccache-aws-bucket"], "name": f"compile-{version}", - "arangodb-branch": f"arangodb/enterprise-preview:{version}-nightly" if version in ["3.10", "3.11"] else "arangodb/enterprise-preview:devel-nightly", # TODO: Any other 3.12.x image we could use? + "arangodb-branch": f"arangodb/enterprise-preview:{version}-nightly" if version in ["3.10", "3.11", "oem"] else "arangodb/enterprise-preview:devel-nightly", # TODO: Any other 3.12.x image we could use? "version": version } } @@ -241,7 +241,7 @@ def workflow_release_arangodb(config): } } - if args.docs_version in ["3.10", "3.11"]: + if args.docs_version in ["3.10", "3.11", "oem"]: if openssl.startswith("3.0"): compileJob["compile-linux"]["build-image"] = "arangodb/build-alpine-x86_64:3.16-gcc11.2-openssl3.0.10" elif openssl.startswith("3.1"): @@ -249,6 +249,7 @@ def workflow_release_arangodb(config): elif openssl.startswith("1.1"): compileJob["compile-linux"]["build-image"] = "arangodb/build-alpine-x86_64:3.16-gcc11.2-openssl1.1.1s" else: + # TODO: OEM might need a separate image compileJob["compile-linux"]["build-image"] = "arangodb/ubuntubuildarangodb-devel:9" # 3.11.13 else: # build image for 3.12.4 and devel as of 2024-11-25 compileJob["compile-linux"]["build-image"] = "arangodb/ubuntubuildarangodb-devel:9" @@ -307,7 +308,7 @@ def workflow_generate_launch_command(config): branch = args.arangodb_branches[i] if args.workflow != "generate": #generate scheduled etc. - branch = f"arangodb/enterprise-preview:{version}-nightly" if version in ["3.10", "3.11"] else "arangodb/enterprise-preview:devel-nightly" # TODO: Any other 3.12.x image we could use? + branch = f"arangodb/enterprise-preview:{version}-nightly" if version in ["3.10", "3.11", "oem"] else "arangodb/enterprise-preview:devel-nightly" # TODO: Any other 3.12.x image we could use? if branch == "undefined": continue diff --git a/CIRCLECI.md b/CIRCLECI.md index fe30a414ff..7e4ba092d6 100644 --- a/CIRCLECI.md +++ b/CIRCLECI.md @@ -75,6 +75,7 @@ arguments are invoked: | Parameter type | Name | Value | |:---------------|:-----|:------| | string | `workflow` | `generate` | +| string | `arangodb-oem` | [Upstream reference](#upstream-references) for OEM LTS | | string | `arangodb-3_10` | [Upstream reference](#upstream-references) for 3.10 | | string | `arangodb-3_11` | [Upstream reference](#upstream-references) for 3.11 | | string | `arangodb-3_12` | [Upstream reference](#upstream-references) for 3.12 | @@ -93,6 +94,7 @@ arguments are invoked: | Parameter type | Name | Value | |:---------------|:-----|:------| | string | `workflow` | `generate` | +| string | `arangodb-oem` | [Upstream reference](#upstream-references) for OEM LTS | | string | `arangodb-3_10` | [Upstream reference](#upstream-references) for 3.10 | | string | `arangodb-3_11` | [Upstream reference](#upstream-references) for 3.11 | | string | `arangodb-3_12` | [Upstream reference](#upstream-references) for 3.12 | @@ -121,6 +123,7 @@ or for multiple versions. | Parameter type | Name | Value | |:---------------|:-----|:------| | string | `workflow` | `generate` | +| string | `arangodb-oem` | [Upstream reference](#upstream-references) for OEM LTS | | string | `arangodb-3_10` | [Upstream reference](#upstream-references) for 3.10 | | string | `arangodb-3_11` | [Upstream reference](#upstream-references) for 3.11 | | string | `arangodb-3_12` | [Upstream reference](#upstream-references) for 3.12 | @@ -202,6 +205,7 @@ Invoke Args: | Parameter type | Name | Value | |:---------------|:-----|:------| | string | `workflow` | `generate-scheduled` | +| string | `arangodb-oem` | `arangodb/enterprise-preview:oem-nightly` | | string | `arangodb-3_10` | `arangodb/enterprise-preview:3.10-nightly` | | string | `arangodb-3_11` | `arangodb/enterprise-preview:3.11-nightly` | | string | `arangodb-3_12` | `arangodb/enterprise-preview:devel-nightly` | @@ -219,6 +223,7 @@ Invoke Args: | Parameter type | Name | Value | |:---------------|:-----|:------| | string | `workflow` | `generate-oasisctl` | +| string | `arangodb-oem` | `arangodb/enterprise-preview:oem-nightly` | | string | `arangodb-3_10` | `arangodb/enterprise-preview:3.10-nightly` | | string | `arangodb-3_11` | `arangodb/enterprise-preview:3.11-nightly` | | string | `arangodb-3_12` | `arangodb/enterprise-preview:devel-nightly` | diff --git a/site/content/arangodb/oem/_index.md b/site/content/arangodb/oem/_index.md new file mode 100644 index 0000000000..a5b8d68f16 --- /dev/null +++ b/site/content/arangodb/oem/_index.md @@ -0,0 +1,42 @@ +--- +title: Recommended Resources +menuTitle: '3.11' +weight: 98 +layout: default +--- +{{< cloudbanner >}} + +{{< cards >}} + +{{% card title="What is ArangoDB?" link="about/" %}} +Get to know graphs, ArangoDB's use cases and features. +{{% /card %}} + +{{% card title="Get started" link="get-started/" %}} +Learn about ArangoDB's core concepts, how to interact with the database system, +and get a server instance up and running. +{{% /card %}} + +{{% card title="Arango Managed Platform (AMP)" link="amp/" %}} +Try out Arango's fully-managed cloud offering for a faster time to value. +{{% /card %}} + +{{% card title="AQL" link="aql/" %}} +ArangoDB's Query Language AQL lets you use graphs, JSON documents, and search +via a single, composable query language. +{{% /card %}} + +{{% card title="Data Science" link="data-science/" %}} +Discover the graph analytics and machine learning features of ArangoDB. +{{% /card %}} + +{{% card title="Deploy" link="deploy/" %}} +Find the right deployment mode and set up your ArangoDB instance. +{{% /card %}} + +{{% card title="Develop" link="develop/" %}} +See the in-depth feature and API documentation to start developing applications +with ArangoDB as your backend. +{{% /card %}} + +{{< /cards >}} diff --git a/site/content/arangodb/oem/about/_index.md b/site/content/arangodb/oem/about/_index.md new file mode 100644 index 0000000000..62ade93bbb --- /dev/null +++ b/site/content/arangodb/oem/about/_index.md @@ -0,0 +1,75 @@ +--- +title: What is ArangoDB? +menuTitle: About ArangoDB +weight: 5 +description: >- + ArangoDB is a scalable graph database system to drive value from connected + data, faster +aliases: + - introduction + - introduction/about-arangodb +--- +![ArangoDB Overview Diagram](../../../images/arangodb-overview-diagram.png) + +ArangoDB combines the analytical power of native graphs with an integrated +search engine, JSON support, and a variety of data access patterns via a single, +composable query language. + +ArangoDB is available in an open-source and a commercial [edition](features/_index.md). +You can use it for on-premises deployments, as well as a fully managed +cloud service, the [Arango Managed Platform (AMP)](../../../amp/_index.md). + +## What are Graphs? + +Graphs are information networks comprised of nodes and relations. + +![Node - Relation - Node](../../../images/data-model-graph-relation-abstract.png) + +A social network is a common example of a graph. People are represented by nodes +and their friendships by relations. + +![Mary - is friend of - John](../../../images/data-model-graph-relation-concrete.png) + +Nodes are also called vertices (singular: vertex), and relations are edges that +connect vertices. +A vertex typically represents a specific entity (a person, a book, a sensor +reading, etc.) and an edge defines how one entity relates to another. + +![Mary - bought - Book, is friend of - John](../../../images/data-model-graph-relations.png) + +This paradigm of storing data feels natural because it closely matches the +cognitive model of humans. It is an expressive data model that allows you to +represent many problem domains and solve them with semantic queries and graph +analytics. + +## Beyond Graphs + +Not everything is a graph use case. ArangoDB lets you equally work with +structured, semi-structured, and unstructured data in the form of schema-free +JSON objects, without having to connect these objects to form a graph. + +![Person Mary, Book ArangoDB](../../../images/data-model-document.png) + +<!-- TODO: +Seems too disconnected, what is the relation? +Maybe multiple docs, maybe also include folders (collections)? +--> + +Depending on your needs, you may mix graphs and unconnected data. +ArangoDB is designed from the ground up to support multiple data models with a +single, composable query language. + +```aql +FOR book IN Books + FILTER book.title == "ArangoDB" + FOR person IN 2..2 INBOUND book Sales, OUTBOUND People + RETURN person.name +``` + +ArangoDB also comes with an integrated search engine for information retrieval, +such as full-text search with relevance ranking. + +ArangoDB is written in C++ for high performance and built to work at scale, in +the cloud or on-premises. + +<!-- deployment options, move from features page, on-prem vs cloud? --> diff --git a/site/content/arangodb/oem/about/features/_index.md b/site/content/arangodb/oem/about/features/_index.md new file mode 100644 index 0000000000..4857b274b4 --- /dev/null +++ b/site/content/arangodb/oem/about/features/_index.md @@ -0,0 +1,126 @@ +--- +title: Features and Capabilities +menuTitle: Features +weight: 20 +description: >- + ArangoDB is a graph database with a powerful set of features for data management and analytics, + supported by a rich ecosystem of integrations and drivers +aliases: + - ../introduction/features +--- +## On-premises versus Cloud + +### Fully managed cloud service + +The fully managed multi-cloud +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +is the easiest and fastest way to get started. It runs the Enterprise Edition +of ArangoDB, lets you deploy clusters with just a few clicks, and is operated +by a dedicated team of ArangoDB engineers day and night. You can choose from a +variety of support plans to meet your needs. + +- Supports many of the AWS and GCP cloud deployment regions +- High availability featuring multi-region zone clusters, managed backups, + and zero-downtime upgrades +- Integrated monitoring, alerting, and log management +- Highly secure with encryption at transit and at rest +- Includes elastic scalability for all deployment models (OneShard and Sharded clusters) + +To learn more, go to the [AMP documentation](../../../../amp/_index.md). + +### Self-managed in the cloud + +ArangoDB can be self-deployed on AWS or other cloud platforms, too. However, when +using a self-managed deployment, you take full control of managing the resources +needed to run it in the cloud. This involves tasks such as configuring, +provisioning, and monitoring the system. For more details, see +[self-deploying ArangoDB in the cloud](../../deploy/in-the-cloud.md). + +ArangoDB supports Kubernetes through its official +[Kubernetes Operator](../../deploy/kubernetes.md) that allows you to easily +deploy and manage clusters within a Kubernetes environment. + +### On-premises + +Running ArangoDB on-premises means that ArangoDB is installed locally, on your +organization's computers and servers, and involves managing all the necessary +resources within the organization's environment, rather than using external +services. + +You can install ArangoDB locally by downloading and running the +[official packages](https://arangodb.com/download/) or run it using +[Docker images](../../operations/installation/docker.md). + +You can deploy it on-premises as a +[single server](../../deploy/single-instance/_index.md) +or as a [cluster](../../deploy/cluster/_index.md) +comprised of multiple nodes with synchronous replication and automatic failover +for high availability and resilience. For the highest level of data safety, +you can additionally set up off-site replication for your entire cluster +([Datacenter-to-Datacenter Replication](../../deploy/arangosync/_index.md)). + +ArangoDB also integrates with Kubernetes, offering a +[Kubernetes Operator](../../deploy/kubernetes.md) that lets you deploy in your +Kubernetes cluster. + +## ArangoDB Editions + +### Community Edition + +ArangoDB is freely available in a **Community Edition** under the Apache 2.0 +open-source license. It is a fully-featured version without time or size +restrictions and includes cluster support. + +- Open source under a permissive license +- One database core for all graph, document, key-value, and search needs +- A single composable query language for all data models +- Extensible through microservices with custom REST APIs and user-definable + query functions +- Cluster deployments for high availability and resilience + +See all [Community Edition Features](community-edition.md). + +### Enterprise Edition + +ArangoDB is also available in a commercial version, called the +**Enterprise Edition**. It includes additional features for performance and +security, such as for scaling graphs and managing your data safely. + +- Includes all Community Edition features +- Performance options to smartly shard and replicate graphs and datasets for + optimal data locality +- Multi-tenant deployment option for the transactional guarantees and + performance of a single server +- Enhanced data security with on-disk and backup encryption, key rotation, + audit logging, and LDAP authentication +- Incremental backups without downtime and off-site replication + +See all [Enterprise Edition Features](enterprise-edition.md). + +### Differences between the Editions + +| Community Edition | Enterprise Edition | +|-------------------|--------------------| +| Apache 2.0 License | Commercial License | +| Sharding using consistent hashing on the default or custom shard keys | In addition, **smart sharding** for improved data locality | +| Only hash-based graph sharding | **SmartGraphs** to intelligently shard large graph datasets and **EnterpriseGraphs** with an automatic sharding key selection | +| Only regular collection replication without data locality optimizations | **SatelliteCollections** to replicate collections on all cluster nodes and data locality optimizations for queries | +| No optimizations when querying sharded graphs and replicated collections together | **SmartGraphs using SatelliteCollections** to enable more local execution of graph queries | +| Only regular graph replication without local execution optimizations | **SatelliteGraphs** to execute graph traversals locally on a cluster node | +| Collections can be sharded alike but joins do not utilize co-location | **SmartJoins** for co-located joins in a cluster using identically sharded collections | +| Graph traversals without parallel execution | **Parallel execution of traversal queries** with many start vertices | +| Graph traversals always load full documents | **Traversal projections** optimize the data loading of AQL traversal queries if only a few document attributes are accessed | +| Iterative graph processing (Pregel) for single servers | **Pregel graph processing for clusters** and single servers | +| Inverted indexes and Views without support for search highlighting and nested search | **Search highlighting** for getting the substring positions of matches and **nested search** for matching arrays with all the conditions met by a single object | +| Only standard Jaccard index calculation | **Jaccard similarity approximation** with MinHash for entity resolution, such as for finding duplicate records, based on how many common elements they have |{{% comment %}} Experimental feature +| No fastText model support | Classification of text tokens and finding similar tokens using supervised **fastText word embedding models** | +{{% /comment %}} +| Only regular cluster deployments | **OneShard** deployment option to store all collections of a database on a single cluster node, to combine the performance of a single server and ACID semantics with a fault-tolerant cluster setup | +| ACID transactions for multi-document / multi-collection queries on single servers, for single document operations in clusters, and for multi-document queries in clusters for collections with a single shard | In addition, ACID transactions for multi-collection queries using the OneShard feature | +| Always read from leader shards in clusters | Optionally allow dirty reads to **read from followers** to scale reads | +| TLS key and certificate rotation | In addition, **key rotation for JWT secrets** and **server name indication** (SNI) | +| Built-in user management and authentication | Additional **LDAP authentication** option | +| Only server logs | **Audit log** of server interactions | +| No on-disk encryption | **Encryption at Rest** with hardware-accelerated on-disk encryption and key rotation | +| Only regular backups | **Datacenter-to-Datacenter Replication** for disaster recovery | +| Only unencrypted backups and basic data masking for backups | **Hot Backups**, **encrypted backups**, and **enhanced data masking** for backups | diff --git a/site/content/arangodb/oem/about/features/community-edition.md b/site/content/arangodb/oem/about/features/community-edition.md new file mode 100644 index 0000000000..9953335cf1 --- /dev/null +++ b/site/content/arangodb/oem/about/features/community-edition.md @@ -0,0 +1,283 @@ +--- +title: Community Edition Features +menuTitle: Community Edition +weight: 5 +description: >- + The open-source version of ArangoDB is available under the permissive + Apache 2.0 license and offers an extensive feature set including cluster + support for free +aliases: + - ../../introduction/features/community-edition +--- +The Community Edition features are outlined below. For additional information, +see [arangodb.com/community-server/](https://www.arangodb.com/community-server/). + +## General + +- [**Graph Database**](../../concepts/data-models.md#graph-model): + Native support for storing and querying graphs comprised of vertices and edges. + You can model complex domains because edges are documents without any + restrictions in complexity. + +- [**Document Database**](../../concepts/data-models.md#document-model): + A modern document database system that allows you to model data intuitively + and evolve the data model easily. Documents can be organized in collections, + and collections in databases for multi-tenancy. + +{{% comment %}} + TODO: Add a bullet point for multi-model? (unified query language, lower TCO, ...) +{{% /comment %}} + +- [**Data Format**](../../concepts/data-structure/_index.md#documents): + JSON, internally stored in a binary format invented by ArangoDB called + VelocyPack. + +- **Schema-free**: + Flexible data modeling without having to define a schema upfront. + Model your data as combination of key-value pairs, + documents, or graphs - perfect for social relations. Optional document + validation using JSON Schema (draft-4, without remote schema support). + +- [**Data Storage**](../../components/arangodb-server/storage-engine.md): + RocksDB storage engine to persist data and indexes on disk, with a hot set in + memory. It uses journaling (write-ahead logging) and can take advantage of + modern storage hardware, like SSDs and large caches. + +- [**Computed Values**](../../concepts/data-structure/documents/computed-values.md): + Persistent document attributes that are generated when documents are created + or modified, using an AQL expression. + +- [**In the cloud or on-prem**](../features/_index.md#on-premises-versus-cloud): + Use ArangoDB as a [fully managed service](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), + self-managed in the cloud, or on-premises. + +- [**Multiple Environments**](../../operations/installation/_index.md#supported-platforms-and-architectures): + Develop and test with ArangoDB on Linux, macOS, and Windows, and run it in + production on Linux. ArangoDB is available for 64-bit ARM chips on macOS and + Linux for evaluation, as well as production-ready for the x86-64 architecture. + +## Scalability & High Availability + +- [**Hash-based sharding**](../../deploy/architecture/data-sharding.md): + Spread bigger datasets across multiple servers using consistent hashing on + the default or custom shard keys. + +- [**Synchronous Replication**](../../deploy/cluster/_index.md#synchronous-replication): + Data changes are propagated to other cluster nodes immediately as part of an + operation, and are only considered successful when the configured number of writes + is reached. Synchronous replication works on a per-shard basis. For each + collection, you can configure how many copies of each shard are kept in the cluster. + +- [**Active Failover**](../../deploy/active-failover/_index.md): + Run a single server with asynchronous replication to one or more passive + single servers for automatic failover. + +- [**Automatic Failover Cluster**](../../deploy/cluster/_index.md#automatic-failover): + If a node goes down, another node takes over to avoid any downtime. <!-- TODO: Can we say that? --> + +{{% comment %}} + TODO: - **Master/Master Conflict Resolution**: What does this refer to? How does it work? MVCC? +{{% /comment %}} + +- **Load-Balancer Support**: + Round-robin load-balancer support for cloud environments. + +- **High-performance Request Handling**: + Low-latency request handling using a boost-ASIO server infrastructure. + +## Querying + +- [**Declarative Query Language for All Data Models**](../../aql/_index.md): + Powerful query language (AQL) to retrieve and modify data. + Graph traversals, full-text searches, geo-spatial queries, and aggregations + can be composed in a single query. + Support for sliding window queries to aggregate adjacent documents, value + ranges and time intervals. + Cluster-distributed aggregation queries. + +- [**Query Optimizer**](../../aql/execution-and-performance/query-optimization.md): + Cost-based query optimizer that takes index selectivity estimates into account. + <!-- TODO: Explain, batching?, lazy evaluation (stream)? --> + +- [**Query Profiling**](../../aql/execution-and-performance/query-profiling.md): + Show detailed runtime information for AQL queries. + +- [**Upsert Operations**](../../aql/examples-and-query-patterns/upsert-repsert-guide.md): + Support for insert-or-update (upsert), insert-or-replace (repsert), and + insert-or-ignore requests, that result in one or the other operation depending + on whether the target document exists already. + +- **Graph Relations**: + Edges can connect vertex and even edge documents to express complex m:n + relations with any depth, creating graphs and hyper-graphs. + <!-- TODO: does this refer to the data model, graph traversals, or something else? --> + +- [**Relational Joins**](../../aql/examples-and-query-patterns/joins.md): + Joins similar to those in relational database systems can be leveraged to + match up documents from different collections, allowing normalized data models. + +- **Advanced Path-Finding with Multiple Algorithms**: + Graphs can be [traversed](../../aql/graphs/traversals-explained.md) with AQL to + retrieve direct and indirect neighbor nodes using a fixed or variable depth. + The [traversal order](../../aql/graphs/traversals.md) can be + depth-first, breadth-first, or in order of increasing edge weights + ("Weighted Traversals"). Stop conditions for pruning paths are supported. + Traversal algorithms to get a [shortest path](../../aql/graphs/shortest-path.md), + [all shortest paths](../../aql/graphs/all-shortest-paths.md), paths in order of + increasing length ("[k Shortest Paths](../../aql/graphs/k-shortest-paths.md)"), + and to enumerate all paths between two vertices + ("[k Paths](../../aql/graphs/k-paths.md)") are available, too. + +- [**Pregel**](../../data-science/pregel/_index.md): + Iterative graph processing for single servers with pre-built algorithms like + PageRank, Connected Components, and Label Propagation. Cluster support + requires the Enterprise Edition. + +- [**ArangoSearch for Text Search and Ranking**](../../index-and-search/arangosearch/_index.md): + A built-in search engine for full-text, complex data structures, and more. + Exact value matching, range queries, prefix matching, case-insensitive and + accent-insensitive search. Token, phrase, wildcard, and fuzzy search support + for full-text. Result ranking using Okapi BM25 and TF-IDF. + Geo-spatial search that can be combined with full-text search. + Flexible data field pre-processing with custom queries and the ability to + chain built-in and custom Analyzers. Language-agnostic tokenization of text. + +- [**GeoJSON Support**](../../aql/functions/geo.md#geojson): + Geographic data encoded in the popular GeoJSON format can be stored and used + for geo-spatial queries. + +{{% comment %}} Experimental feature +- [**Query result spillover**](../../aql/how-to-invoke-aql/with-arangosh.md#spilloverthresholdmemoryusage) + AQL queries can store intermediate and final results temporarily on disk + (also known as external result sets) to decrease memory usage when a specified + threshold is reached. +{{% /comment %}} + +## Transactions + +- [**AQL Queries**](../../aql/data-queries.md#transactional-execution): + AQL queries are executed transactionally (with exceptions), either committing + or rolling back data modifications automatically. + +- [**Stream Transactions**](../../develop/http-api/transactions/stream-transactions.md): + Transactions with individual begin and commit / abort commands that can span + multiple AQL queries and API calls of supported APIs. + +- [**JavaScript Transactions**](../../develop/http-api/transactions/javascript-transactions.md): + Single-request transactions written in JavaScript that leverage ArangoDB's + JavaScript API. + +- **Multi-Document Transactions**: + Transactions are not limited to single documents, but can involve many + documents of a collection. + +- **Multi-Collection Transactions** + A single transaction can modify the documents of multiple collections. + There is an automatic deadlock detection for single servers. + +- **ACID Transactions**: + Using single servers, multi-document / multi-collection queries are guaranteed + to be fully ACID (atomic, consistent, isolated, durable). + Using cluster deployments, single-document operations are fully ACID, too. + Multi-document queries in a cluster are not ACID, except for collections with + a single shard. Multi-collection queries require the OneShard + feature of the Enterprise Edition to be ACID. <!-- TODO: can we put it like this? --> + +## Performance + +- [**Persistent Indexes**](../../index-and-search/indexing/basics.md#persistent-index): + Indexes are stored on disk to enable fast server restarts. You can create + secondary indexes over one or multiple fields, optionally with a uniqueness + constraint. A "sparse" option to only index non-null values is also available. + The elements of an array can be indexed individually. + +- [**Inverted indexes**](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md): + An eventually consistent index type that can accelerate a broad range of + queries from simple to complex, including full-text search. + +- [**Vertex-centric Indexes**](../../index-and-search/indexing/basics.md#vertex-centric-indexes): + Secondary indexes for more efficient graph traversals with filter conditions. + +- [**Time-to-Live (TTL) Indexes**](../../index-and-search/indexing/basics.md#ttl-time-to-live-index): + Time-based removal of expired documents. + +- [**Geo-spatial Indexes**](../../index-and-search/indexing/basics.md#geo-index): + Accelerated geo-spatial queries for locations and GeoJSON objects, based on + the S2 library. <!-- TODO: list supported queries? Centroid-limitations? --> + Support for composable, distance-based geo-queries ("geo cursors"). + +{{% comment %}} Experimental feature +- [**Multi-dimensional indexes**](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md): + An index type to efficiently intersect multiple range queries, like finding + all appointments that intersect a time range. +{{% /comment %}} + +- [**Background Indexing**](../../index-and-search/indexing/basics.md#creating-indexes-in-background): + Indexes can be created in the background to not block queries in the meantime. + +- [**Index cache refilling**](../../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): + In-memory index caches are automatically repopulated after writes that affect + an edge index or cache-enabled persistent indexes to maximize cache hits and + thus query performance. + +- [**Extensive Query Optimization**](../../aql/execution-and-performance/query-optimization.md): + Late document materialization to only fetch the relevant documents from + SORT/LIMIT queries. Early pruning of non-matching documents in full + collection scans. Inlining of certain subqueries to improve execution time. + <!-- TODO, move to Querying? --> + +- [**Parallel gather**](../../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): + Fast, memory-efficient processing of cluster queries by combining + results in parallel. + +## Extensibility + +- [**Microservice Support with ArangoDB Foxx**](../../develop/foxx-microservices/_index.md): + Use ArangoDB as an application server and fuse your application and database + together for maximal throughput. + With fault-tolerant cluster support. + +- [**Server-Side Functions**](../../aql/user-defined-functions.md): + You can extend AQL with user-defined functions written in JavaScript. + +## Security + +- [**Authentication**](../../operations/administration/user-management/_index.md): + Built-in user management with password- and token-based authentication. + +- **Role-based Access Control**: + ArangoDB supports all basic security requirements. By using ArangoDB's Foxx + microservice framework users can achieve very high security standards + fitting individual needs. + +- [**TLS Encryption**](../../components/arangodb-server/options.md#ssl): + Internal and external communication over encrypted network connections with + TLS (formerly SSL). + [TLS key and certificate rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation) + is supported. + +## Administration + +- [**Web-based User Interface**](../../components/web-interface/_index.md): + Graphical UI for your browser to work with ArangoDB. It allows you to + view, create, and modify databases, collections, documents, graphs, etc. + You can also run, explain, and profile AQL queries. Includes a graph viewer + with WebGL support. + +- **Cluster-friendly User Interface**: + View the status of your cluster and its individual nodes, and move and + rebalance shards via the web interface. + +- **[Backup](../../components/tools/arangodump/_index.md) and [Restore](../../components/tools/arangorestore/_index.md) Tools**: + Multi-threaded dumping and restoring of collection settings and data + in JSON format. Data masking capabilities for attributes containing sensitive + data / PII when creating backups. + +- **[Import](../../components/tools/arangoimport/_index.md) and [Export](../../components/tools/arangoexport/_index.md) Tools**: + CLI utilities to load and export data in multiple text-based formats. + You can import from JSON, JSONL, CSV, and TSV files, and export to JSON, JSONL, + CSV, TSV, XML, and XGMML files. + +- [**Metrics**](../../develop/http-api/monitoring/metrics.md): + Monitor the healthiness and performance of ArangoDB servers using the metrics + exported in the Prometheus format. diff --git a/site/content/arangodb/oem/about/features/enterprise-edition.md b/site/content/arangodb/oem/about/features/enterprise-edition.md new file mode 100644 index 0000000000..8e962a4a34 --- /dev/null +++ b/site/content/arangodb/oem/about/features/enterprise-edition.md @@ -0,0 +1,123 @@ +--- +title: Enterprise Edition Features +menuTitle: Enterprise Edition +weight: 10 +description: >- + The commercial version of ArangoDB offers performance, compliance, and + security features for larger or more sensitive datasets, as well as additional + query capabilities +aliases: + - ../../introduction/features/enterprise-edition +--- +The Enterprise Edition has all the features of the +[Community Edition](community-edition.md) and, on top of that, the +features outlined below. For additional information, see +[arangodb.com/enterprise-server/](https://www.arangodb.com/enterprise-server/). + +## Performance + +- [**SmartGraphs**](../../graphs/smartgraphs/_index.md): + Value-based sharding of large graph datasets for better data locality when + traversing graphs. + +- [**EnterpriseGraphs**](../../graphs/enterprisegraphs/_index.md): + A specialized version of SmartGraphs, with an automatic sharding key selection. + +- [**SmartGraphs using SatelliteCollections**](../../graphs/smartgraphs/_index.md): + Collections replicated on all cluster nodes can be combined with graphs + sharded by document attributes to enable more local execution of graph queries. + +- [**SatelliteGraphs**](../../graphs/satellitegraphs/_index.md): + Graphs replicated on all cluster nodes to execute graph traversals locally. + +- [**SatelliteCollections**](../../develop/satellitecollections.md): + Collections replicated on all cluster nodes to execute joins with sharded + data locally. + +- [**SmartJoins**](../../develop/smartjoins.md): + Co-located joins in a cluster using identically sharded collections. + +- [**OneShard**](../../deploy/oneshard.md): + Option to store all collections of a database on a single cluster node, to + combine the performance of a single server and ACID semantics with a + fault-tolerant cluster setup. + +- [**Traversal**](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition) + [**Parallelization**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): + Parallel execution of traversal queries with many start vertices, leading to + faster results. + +- [**Traversal Projections**](../../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): + Optimized data loading for AQL traversal queries if only a few document + attributes are accessed. + +- [**Parallel index creation**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallel-index-creation-enterprise-edition): + Non-unique indexes can be created with multiple threads in parallel. + +- [**`minhash` Analyzer**](../../index-and-search/analyzers.md#minhash): + Jaccard similarity approximation for entity resolution, such as for finding + duplicate records, based on how many elements they have in common + +- [**`geo_s2` Analyzer**](../../index-and-search/analyzers.md#geo_s2): + Efficiently index geo-spatial data using different binary formats, tuning the + size on disk, the precision, and query performance. + +- [**ArangoSearch column cache**](../../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): + Always cache field normalization values, Geo Analyzer auxiliary data, + stored values, primary sort columns, and primary key columns in memory to + improve the performance of Views and inverted indexes. + +- [**Read from followers in clusters**](../../develop/http-api/documents.md#read-from-followers): + Allow dirty reads so that Coordinators can read from any shard replica and not + only from the leader, for scaling reads. + +## Querying + +- [**Pregel in Cluster**](../../data-science/pregel/_index.md#prerequisites): + Distributed iterative graph analytics for cluster deployments. + +- [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): + Get the substring positions of matched terms, phrases, or _n_-grams. + +- [**Nested search**](../../index-and-search/arangosearch/nested-search.md): + Match arrays of objects with all the conditions met by a single sub-object, + and define for how many of the elements this must be true. + +{{% comment %}} Experimental feature +- **[`classification`](../../index-and-search/analyzers.md#classification) and [`nearest_neighbors` Analyzers](../../index-and-search/analyzers.md#nearest_neighbors)**: + Classification of text tokens and finding similar tokens using supervised + fastText word embedding models. +{{% /comment %}} + +- [**Skip inaccessible collections**](../../aql/how-to-invoke-aql/with-arangosh.md#skipinaccessiblecollections): + Let AQL queries like graph traversals pretend that collections are empty if + the user has no access to them instead of failing the query. + +## Security + +- [**DC2DC**](../../deploy/arangosync/_index.md): + Datacenter-to-Datacenter Replication for disaster recovery. + +- [**Auditing**](../../operations/security/audit-logging.md): + Audit logs of all server interactions. + +- [**LDAP Authentication**](../../components/arangodb-server/ldap.md): + ArangoDB user authentication with an LDAP server. + +- [**Encryption at Rest**](../../operations/security/encryption-at-rest.md): + Hardware-accelerated on-disk encryption for your data. + +- [**Encrypted Backups**](../../components/tools/arangodump/examples.md#encryption): + Data dumps can be encrypted using a strong 256-bit AES block cipher. + +- [**Hot Backups**](../../operations/backup-and-restore.md#hot-backups): + Consistent, incremental data backups without downtime for single servers and clusters. + +- [**Enhanced Data Masking**](../../components/tools/arangodump/maskings.md#masking-functions): + Extended data masking capabilities for attributes containing sensitive data + / PII when creating backups. + +- **Advanced Encryption and Security Configuration**: + Key rotation for [JWT secrets](../../develop/http-api/authentication.md#hot-reload-jwt-secrets) + and [on-disk encryption](../../develop/http-api/security.md#encryption-at-rest), + as well as [Server Name Indication (SNI)](../../components/arangodb-server/options.md#--sslserver-name-indication). diff --git a/site/content/arangodb/oem/about/features/highlights-by-version.md b/site/content/arangodb/oem/about/features/highlights-by-version.md new file mode 100644 index 0000000000..db66538908 --- /dev/null +++ b/site/content/arangodb/oem/about/features/highlights-by-version.md @@ -0,0 +1,448 @@ +--- +title: Highlights by Version +menuTitle: Highlights by Version +weight: 15 +description: >- + The most notable features in the Community and Enterprise Edition of ArangoDB, + grouped by version +aliases: + - ../../introduction/features/highlights-by-version +--- +## Version 3.11 + +**All Editions** + +- [**Parallel gather**](../../release-notes/version-3.11/whats-new-in-3-11.md#parallel-gather): + Faster, more memory-efficient processing of cluster queries by combining + results on Coordinators in parallel. + +- [**Index cache refilling**](../../release-notes/version-3.11/whats-new-in-3-11.md#index-cache-refilling): + Automatically repopulate in-memory index caches after writes that affect an + edge index or cache-enabled persistent indexes to maximize cache hits and thus + query performance. + +**Enterprise Edition** + +- [**ArangoSearch column cache**](../../release-notes/version-3.10/whats-new-in-3-10.md#arangosearch-column-cache-enterprise-edition): + Always cache field normalization values, Geo Analyzer auxiliary data, + stored values, primary sort columns, and primary key columns in memory to + improve the performance of Views and inverted indexes. + +- [**`geo_s2` Analyzer**](../../index-and-search/analyzers.md#geo_s2): + Efficiently index geo-spatial data using different binary formats, tuning the + size on disk, the precision, and query performance. + +Also see [What's New in 3.11](../../release-notes/version-3.11/whats-new-in-3-11.md). + +## Version 3.10 + +**All Editions** + +- [**Native ARM Support**](../../release-notes/version-3.10/whats-new-in-3-10.md#native-arm-support): + Packages for the ARM architecture are now available, including native support + for Apple silicon. + +- [**Computed Values**](../../concepts/data-structure/documents/computed-values.md): + Persistent document attributes that are generated when documents are created + or modified, using an AQL expression. + +- [**Inverted indexes**](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md): + A new, eventually consistent index type that can accelerate a broad range of + queries, providing similar search capabilities as `arangosearch` Views, but + defined per collection and simpler to use. + +- [**`search-alias` Views**](../../release-notes/version-3.10/whats-new-in-3-10.md#search-alias-views): + Add inverted indexes to `search-alias` Views for searching multiple collections + at once, with ranking and search highlighting capabilities, as a lightweight + alternative to `arangosearch` Views. + +- **Persistent indexes**: + An optional [**In-memory Cache**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values) + for faster lookups and [**Stored Values**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#storing-additional-values-in-indexes) + to let persistent indexes cover additional attributes of projections. + +- **AQL Graph Traversals**: + [All Shortest Paths](../../aql/graphs/all-shortest-paths.md) allows you to query + for all paths of shortest length between two documents. + +**Enterprise Edition** + +- [**EnterpriseGraphs**](../../graphs/enterprisegraphs/_index.md): A new specialized version of + SmartGraphs, with an automatic sharding key selection. + +- [**Search highlighting**](../../index-and-search/arangosearch/search-highlighting.md): + Get the substring positions of matched terms, phrases, or _n_-grams. + +- [**Nested search**](../../index-and-search/arangosearch/nested-search.md): + Match arrays of objects with all the conditions met by a single sub-object, + and define for how many of the elements this must be true. + +- **ArangoSearch**: + New [`minhash` Analyzer](../../index-and-search/analyzers.md#minhash) for locality-sensitive hashing + to approximate the Jaccard similarity, with inverted index and + `arangosearch` View support that allows you to implement entity resolution. + +- [**Parallelism for sharded graphs**](../../release-notes/version-3.10/whats-new-in-3-10.md#parallelism-for-sharded-graphs-enterprise-edition): + Parallel execution of AQL traversal queries with many start vertices for all + types of sharded graphs, leading to faster results. + +- [**Traversal Projections**](../../release-notes/version-3.10/whats-new-in-3-10.md#traversal-projections-enterprise-edition): + Optimized data loading for AQL traversal queries if only a few document + attributes are accessed. + +- [**Read from followers in clusters**](../../develop/http-api/documents.md#read-from-followers): + Allow dirty reads so that Coordinators can read from any shard replica and not + only from the leader, for scaling reads. + +Also see [What's New in 3.10](../../release-notes/version-3.10/whats-new-in-3-10.md). + +## Version 3.9 + +**All Editions** + +- **ArangoSearch**: + New [**Segmentation Analyzer**](../../index-and-search/analyzers.md#segmentation) + for language-agnostic tokenization of text. + A [**Collation Analyzer**](../../index-and-search/analyzers.md#collation) + to honor the alphabetical order of the specified language in range queries. + +**Enterprise Edition** + +- [**(Disjoint) SmartGraphs using SatelliteCollections**](../../graphs/smartgraphs/_index.md): + SatelliteCollections can be used in (Disjoint) SmartGraphs to enable more + local execution of graph queries. + +Also see [What's New in 3.9](../../release-notes/version-3.9/whats-new-in-3-9.md). + +## Version 3.8 + +**All Editions** + +- [**Weighted traversals**](../../release-notes/version-3.8/whats-new-in-3-8.md#weighted-traversals) + and [**k Paths**](../../release-notes/version-3.8/whats-new-in-3-8.md#k-paths): + Two new AQL graph traversal methods to emit paths in order of increasing + weights and to enumerate all paths between a source and a target vertex that + match a given length. + +- **ArangoSearch**: + New [**Pipeline Analyzer**](../../index-and-search/analyzers.md#pipeline) + that allows you to combine multiple Analyzers, enabling case-insensitive + _n_-gram-based fuzzy search and more. New + [**AQL Analyzer**](../../index-and-search/analyzers.md#aql) + so that you can use an AQL query to pre-process and filter your data for + indexing. Support for **geo-spatial queries** through new + [Geo](../../index-and-search/analyzers.md#geojson) + [Analyzers](../../index-and-search/analyzers.md#geopoint) and + [ArangoSearch Geo functions](../../aql/functions/arangosearch.md#geo-functions). + A new [**Stop words Analyzer**](../../index-and-search/analyzers.md#stopwords) that + can be used standalone or in an Analyzer pipeline. + +- A [**`WINDOW` operation**](../../aql/high-level-operations/window.md) for aggregations over + adjacent rows, value ranges or time windows. + +**Enterprise Edition** + +- **Encryption at Rest** utilizes + [hardware acceleration](../../release-notes/version-3.8/whats-new-in-3-8.md#encryption-at-rest) + capabilities of modern CPUs. + +Also see [What's New in 3.8](../../release-notes/version-3.8/whats-new-in-3-8.md). + +## Version 3.7 + +**All Editions** + +- **ArangoSearch**: + [Wildcard](../../aql/functions/arangosearch.md#like) and fuzzy search + ([Levenshtein distance](../../aql/functions/arangosearch.md#levenshtein_match) and + [_n_-gram based](../../aql/functions/arangosearch.md#ngram_match)), + enhanced [phrase and proximity search](../../aql/functions/arangosearch.md#phrase), + improved late document materialization and + [Views covering queries](../../release-notes/version-3.7/whats-new-in-3-7.md#covering-indexes) + using their indexes without touching the storage engine, as well as a new + SIMD-based index format for faster processing and + [stemming support](../../release-notes/version-3.7/whats-new-in-3-7.md#stemming-support-for-more-languages) + for 15 additional languages. + +- [**Schema Validation**](../../concepts/data-structure/documents/schema-validation.md): + Enforce a JSON Schema for documents on collection level. Invalid documents + can be rejected automatically by the database system, making it easy to + maintain data quality. + +- [**Insert-Update** and **Insert-Ignore**](../../release-notes/version-3.7/whats-new-in-3-7.md#insert-update-and-insert-ignore): + New document API operations to upsert documents and to efficiently insert + documents while skipping the creation if the document exists already. + +- **AQL**: + Improved [subquery](../../release-notes/version-3.7/whats-new-in-3-7.md#subquery-optimizations) and + [graph traversal performance](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-optimizations), + among many optimizations and enhancements. + +- [**HTTP/2 support**](../../release-notes/version-3.7/whats-new-in-3-7.md#http2-support): + Better load-balancer and Kubernetes compatibility, improved request throughput. + +**Enterprise Edition** + +- [**SatelliteGraphs**](../../release-notes/version-3.7/whats-new-in-3-7.md#satellitegraphs): + Synchronously replicated graphs with local traversal execution. + +- [**Disjoint SmartGraphs**](../../release-notes/version-3.7/whats-new-in-3-7.md#disjoint-smartgraphs): + Improve traversal execution times for SmartGraphs without edges between + vertices with different SmartGraph attributes. + +- [**Traversal parallelization**](../../release-notes/version-3.7/whats-new-in-3-7.md#traversal-parallelization-enterprise-edition): + Optional parallel execution of nested traversals for single servers and + OneShard clusters. + +- **Security**: + Added support for multiple + [JWT Secrets](../../release-notes/version-3.7/whats-new-in-3-7.md#jwt-secret-rotation-enterprise-edition) + and the ability to hot-reload them from disk, + [TLS key and certificate rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#tls-key-and-certificate-rotation), + [Encryption at rest key rotation](../../release-notes/version-3.7/whats-new-in-3-7.md#encryption-at-rest-key-rotation-enterprise-edition) + and [Server Name Indication (SNI)](../../release-notes/version-3.7/whats-new-in-3-7.md#server-name-indication-enterprise-edition). + +Also see [What's New in 3.7](../../release-notes/version-3.7/whats-new-in-3-7.md). + +## Version 3.6 + +**All Editions** + +- **AQL**: + Improved query performance thanks to + [early pruning](../../release-notes/version-3.6/whats-new-in-3-6.md#early-pruning-of-non-matching-documents), + [subquery splicing](../../release-notes/version-3.6/whats-new-in-3-6.md#subquery-splicing-optimization), + [late document materialization](../../release-notes/version-3.6/whats-new-in-3-6.md#late-document-materialization-rocksdb), + [parallelization](../../release-notes/version-3.6/whats-new-in-3-6.md#parallelization-of-cluster-aql-queries) for certain cluster queries + and more. New server-side [`maxRuntime`](../../aql/how-to-invoke-aql/with-arangosh.md#maxruntime) + option for queries. + +- **ArangoSearch**: + New [Analyzer options](../../release-notes/version-3.6/whats-new-in-3-6.md#analyzers) for + edge _n_-grams (`text` Analyzer), UTF-8 encoded _n_-gram input and optional + start/end markers (`ngram` Analyzer). Support for + [dynamic expressions](../../release-notes/version-3.6/whats-new-in-3-6.md#dynamic-search-expressions-with-arrays) + using arrays (array comparison operators in `SEARCH` queries and the + `TOKENS()` / `PHRASE()` functions accept arrays). Views can benefit from the + SmartJoins optimization. + +**Enterprise Edition** + +- [**OneShard**](../../deploy/oneshard.md) + deployments offer a practicable solution that enables significant performance + improvements by massively reducing cluster-internal communication. A database + created with OneShard enabled is limited to a single DB-Server node but still + replicated synchronously to ensure resilience. This configuration allows + running transactions with ACID guarantees on shard leaders. + +Also see [What's New in 3.6](../../release-notes/version-3.6/whats-new-in-3-6.md). + +## Version 3.5 + +**All Editions** + +- **ArangoSearch**: + The search and ranking engine received an upgrade and now features + [Configurable Analyzers](../../index-and-search/analyzers.md), + [Sorted Views](../../index-and-search/arangosearch/performance.md#primary-sort-order) + and several improvements to the + [AQL integration](../../release-notes/version-3.5/whats-new-in-3-5.md#arangosearch). + +- **AQL Graph Traversals**: + [k Shortest Paths](../../aql/graphs/k-shortest-paths.md) allows you to query not + just for one shortest path between two documents but multiple, sorted by + length or weight. With [PRUNE](../../aql/graphs/traversals.md#pruning) you can + stop walking down certain paths early in a graph traversal to improve its + efficiency. + +- [**Stream Transaction API**](../../develop/http-api/transactions/stream-transactions.md): + Perform multi-document transactions with individual begin and commit / abort + commands using the new HTTP endpoints or via a supported driver. + +- [**Time-to-Live**](../../index-and-search/indexing/basics.md#ttl-time-to-live-index) + [**Indexes**](../../index-and-search/indexing/working-with-indexes/ttl-indexes.md): + TTL indexes can be used to automatically remove documents in collections for + use cases like expiring sessions or automatic purging of statistics or logs. + +- [**Index Hints**](../../aql/high-level-operations/for.md#indexhint) & + [**Named Indexes**](https://www.arangodb.com/learn/development/index-hints-named-indices/): + Indexes can be given names and an optional AQL inline query option + `indexHint` was added to override the internal optimizer decision on which + index to utilize. + +- [**Data Masking**](../../components/tools/arangodump/maskings.md): + arangodump provides a convenient way to extract production data but mask + critical information that should not be visible. + +**Enterprise Edition** + +- [**Hot Backups**](../../operations/backup-and-restore.md#hot-backups): + Create automatic, consistent backups of your cluster without noticeable + impact on your production systems. In contrast to _arangodump_, hot backups + are taken on the level of the underlying storage engine and hence both backup + and restore are considerably faster. + +- [**SmartJoins**](../../develop/smartjoins.md): + Run joins between identically sharded collections with performance close to + that of a local join operation. + +- **Advanced Data Masking**: + There are additional + [data masking functions](../../components/tools/arangodump/maskings.md#masking-functions) + available in the Enterprise Edition, such as for substituting email addresses + and phone numbers with similar looking pseudo-data. + +Also see [What's New in 3.5](../../release-notes/version-3.5/whats-new-in-3-5.md). + +## Version 3.4 + +**All Editions** + +- [**ArangoSearch**](../../index-and-search/arangosearch/_index.md): + Search and similarity ranking engine integrated natively into ArangoDB and + AQL. ArangoSearch combines Boolean retrieval capabilities with generalized + ranking algorithms (BM25, TFDIF). Support of e.g. relevance-based searching, + phrase and prefix-matching, complex boolean searches and query time relevance + tuning. Search can be combined with all supported data models in a single + query. Many specialized language Analyzers are already included for e.g. + English, German, French, Chinese, Spanish and many other language. + +- [**GeoJSON Support**](../../aql/functions/geo.md) and + [**S2 Geo Index**](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): ArangoDB now supports all geo primitives. + (Multi-)Point, (Multi-)LineStrings, (Multi-)Polygons or intersections can be + defined and queried for. The Google S2 geo index is optimized for RocksDB and + enables efficient querying. Geo query results are automatically visualized + with an OpenStreetMap integration within the Query Editor of the web interface. + +- [**Query Profiler**](../../aql/execution-and-performance/query-profiling.md): + Enables the analysis of queries and adds additional information for the user + to identify optimization potentials more easily. The profiler can be accessed + via _arangosh_ with `db._profileQuery(...)` or via the *Profile* button in the + Query Editor of the web interface. + +- [**Streaming Cursors**](../../aql/how-to-invoke-aql/with-arangosh.md#stream): + Cursors requested with the stream option on make queries calculate results + on the fly and make them available for the client in a streaming fashion, + as soon as possible. + +- **RocksDB as Default Storage Engine**: With ArangoDB 3.4 the default + [storage engine](../../components/arangodb-server/storage-engine.md) for fresh installations will + switch from MMFiles to RocksDB. Many optimizations have been made to RocksDB + since the first release in 3.2. For 3.4 we optimized the binary storage + format for improved insertion, implemented "optional caching", reduced the + replication catch-up time and much more. + +Also see [What's New in 3.4](../../release-notes/version-3.4/whats-new-in-3-4.md). + +## Version 3.3 + +**Enterprise Edition** + +- [**Datacenter-to-Datacenter Replication**](../../deploy/arangosync/deployment/_index.md): + Replicate the entire structure and content of an ArangoDB cluster + asynchronously to another cluster in a different datacenter with ArangoSync. + Multi-datacenter support means you can fallback to a replica of your cluster + in case of a disaster in one datacenter. + +- [**Encrypted Backups**](../../components/tools/arangodump/examples.md#encryption): + _arangodump_ can create backups encrypted with a secret key using AES256 + block cipher. + +**All Editions** + +- [**Server-level Replication**](../../release-notes/version-3.3/whats-new-in-3-3.md#server-level-replication): + In addition to per-database replication, there is now an additional + `globalApplier`. Start the global replication on the Follower once and all + current and future databases will be replicated from the Leader to the + Follower automatically. + +- [**Asynchronous Failover**](../../release-notes/version-3.3/whats-new-in-3-3.md#asynchronous-failover): + Make a single server instance resilient with a second server instance, one + as Leader and the other as asynchronously replicating Follower, with automatic + failover to the Follower if the Leader goes down. + +Also see [What's New in 3.3](../../release-notes/version-3.3/whats-new-in-3-3.md). + +## Version 3.2 + +**All Editions** + +- [**RocksDB Storage Engine**](../../components/arangodb-server/storage-engine.md): You can now use + as much data in ArangoDB as you can fit on your disk. Plus, you can enjoy + performance boosts on writes by having only document-level locks. + +- [**Pregel**](../../data-science/pregel/_index.md): + We implemented distributed graph processing with Pregel to discover hidden + patterns, identify communities and perform in-depth analytics of large graph + data sets. + +- [**Fault-Tolerant Foxx**](../../develop/http-api/foxx.md): The Foxx management + internals have been rewritten from the ground up to make sure + multi-coordinator cluster setups always keep their services in sync and + new Coordinators are fully initialized even when all existing Coordinators + are unavailable. + +**Enterprise Edition** + +- [**LDAP integration**](../../components/arangodb-server/ldap.md): Users and permissions + can be managed from outside ArangoDB with an LDAP server in different + authentication configurations. + +- [**Encryption at Rest**](../../operations/security/encryption-at-rest.md): Let the server + persist your sensitive data strongly encrypted to protect it even if the + physical storage medium gets stolen. + +- [**SatelliteCollections**](../../develop/satellitecollections.md): Faster join operations when + working with sharded datasets by synchronously replicating selected + collections to all DB-Servers in a cluster, so that joins can be + executed locally. + +Also see [What's New in 3.2](../../release-notes/version-3.2/whats-new-in-3-2.md). + +## Version 3.1 + +**All Editions** + +- [**Vertex-centric indexes**](../../index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md): + AQL traversal queries can utilize secondary edge collection + indexes for better performance against graphs with supernodes. + +- [**VelocyPack over HTTP**](https://www.arangodb.com/2016/10/updated-java-drivers-with-arangodb-3-1/): + In addition to JSON, the binary storage format VelocyPack can now also be + used in transport over the HTTP protocol, as well as streamed using the new + bi-directional asynchronous binary protocol **VelocyStream**. + +**Enterprise Edition** + +- [**SmartGraphs**](../../graphs/smartgraphs/_index.md): Scale with graphs to a + cluster and stay performant. With SmartGraphs you can use the "smartness" + of your application layer to shard your graph efficiently to your machines + and let traversals run locally. + +- **Encryption Control**: Choose your level of [SSL encryption](../../components/arangodb-server/options.md#ssl) + +- [**Auditing**](../../operations/security/audit-logging.md): Keep a detailed log + of all the important things that happened in ArangoDB. + +Also see [What's New in 3.1](../../release-notes/version-3.1/whats-new-in-3-1.md). + +## Version 3.0 + +- [**self-organizing cluster**](../../deploy/cluster/_index.md) with + synchronous replication, master/master setup, shared nothing + architecture, cluster management Agency. + +- Deeply integrated, native [**AQL graph traversal**](../../aql/graphs/_index.md) + +- [**VelocyPack**](https://github.com/arangodb/velocypack) as new internal + binary storage format as well as for intermediate AQL values. + +- [**Persistent indexes**](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md) via RocksDB suitable + for sorting and range queries. + +- [**Foxx 3.0**](../../develop/foxx-microservices/_index.md): overhauled JS framework for data-centric + microservices + +- Significantly improved [**Web Interface**](../../components/web-interface/_index.md) + +Also see [What's New in 3.0](../../release-notes/version-3.0/whats-new-in-3-0.md). diff --git a/site/content/arangodb/oem/about/use-cases.md b/site/content/arangodb/oem/about/use-cases.md new file mode 100644 index 0000000000..0128025595 --- /dev/null +++ b/site/content/arangodb/oem/about/use-cases.md @@ -0,0 +1,164 @@ +--- +title: ArangoDB Use Cases +menuTitle: Use Cases +weight: 15 +description: >- + ArangoDB is a database system with a large solution space because it combines + graphs, documents, key-value, search engine, and machine learning all in one +pageToc: + maxHeadlineLevel: 2 +aliases: + - ../introduction/use-cases +--- +## ArangoDB as a Graph Database + +ArangoDB as a graph database is a great fit for use cases like fraud detection, +knowledge graphs, recommendation engines, identity and access management, +network and IT operations, social media management, traffic management, and many +more. + +### Fraud Detection + +{{< image src="../../../images/icon-fraud-detection.png" alt="Fraud Detection icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Uncover illegal activities by discovering difficult-to-detect patterns. +ArangoDB lets you look beyond individual data points in disparate data sources, +allowing you to integrate and harmonize data to analyze activities and +relationships all together, for a broader view of connection patterns, to detect +complex fraudulent behavior such as fraud rings. + +### Recommendation Engine + +{{< image src="../../../images/icon-recommendation-engine.png" alt="Recommendation Engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Suggest products, services, and information to users based on data relationships. +For example, you can use ArangoDB together with PyTorch Geometric to build a +[movie recommendation system](https://www.arangodb.com/2022/04/integrate-arangodb-with-pytorch-geometric-to-build-recommendation-systems/), +by analyzing the movies users watched and then predicting links between the two +with a graph neural network (GNN). + +### Network Management + +{{< image src="../../../images/icon-network-management.png" alt="Network Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Reduce downtime by connecting and visualizing network, infrastructure, and code. +Network devices and how they interconnect can naturally be modeled as a graph. +Traversal algorithms let you explore the routes between different nodes, with the +option to stop at subnet boundaries or to take things like the connection +bandwidth into account when path-finding. + +### Customer 360 + +{{< image src="../../../images/icon-customer-360.png" alt="Customer 360 icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Gain a complete understanding of your customers by integrating multiple data +sources and code. ArangoDB can act as the platform to merge and consolidate +information in any shape, with the added ability to link related records and to +track data origins using graph features. + +### Identity and Access Management + +{{< image src="../../../images/icon-identity-management.png" alt="Identity Management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Increase security and compliance by managing data access based on role and +position. You can map out an organization chart as a graph and use ArangoDB to +determine who is authorized to see which information. Put ArangoDB's graph +capabilities to work to implement access control lists and permission +inheritance. + +### Supply Chain + +{{< image src="../../../images/icon-supply-chain.png" alt="Supply Chain icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Speed shipments by monitoring and optimizing the flow of goods through a +supply chain. You can represent your inventory, supplier, and delivery +information as a graph to understand what the possible sources of delays and +disruptions are. + +## ArangoDB as a Document Database + +ArangoDB can be used as the backend for heterogeneous content management, +e-commerce systems, Internet of Things applications, and more generally as a +persistence layer for a broad range of services that benefit from an agile +and scalable data store. + +### Content Management + +{{< image src="../../../images/icon-content-management.png" alt="Content management icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Store information of any kind without upfront schema declaration. ArangoDB is +schema-free, storing every data record as a self-contained document, allowing +you to manage heterogeneous content with ease. Build the next (headless) +content management system on top of ArangoDB. + +### E-Commerce Systems + +{{< image src="../../../images/icon-e-commerce.png" alt="E-commerce icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +ArangoDB combines data modeling freedom with strong consistency and resilience +features to power online shops and ordering systems. Handle product catalog data +with ease using any combination of free text and structured data, and process +checkouts with the necessary transactional guarantees. + +### Internet of Things + +{{< image src="../../../images/icon-internet-of-things.png" alt="Internet of things icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Collect sensor readings and other IoT data in ArangoDB for a single view of +everything. Store all data points in the same system that also lets you run +aggregation queries using sliding windows for efficient data analysis. + +## ArangoDB as a Key-Value Database + +{{< image src="../../../images/icon-key-value.png" alt="Key value icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +Key-value stores are the simplest kind of database systems. Each record is +stored as a block of data under a key that uniquely identifies the record. +The data is opaque, which means the system doesn't know anything about the +contained information, it simply stores it and can retrieve it for you via +the identifiers. + +This paradigm is used at the heart of ArangoDB and allows it to scale well, +but without the limitations of a pure key-value store. Every document has a +`_key` attribute, which is either user-provided or automatically generated. +You can create additional indexes and work with subsets of attributes as +needed, requiring the system to be aware of the stored data structures - unlike +pure key-value stores. + +While ArangoDB can store binary data, it is not designed for +binary large objects (BLOBs) and works best with small to medium-sized +JSON objects. + +For more information about how ArangoDB persists data, see +[Storage Engine](../components/arangodb-server/storage-engine.md). + +## ArangoDB as a Search Engine + +{{< image src="../../../images/icon-search-engine.png" alt="Search engine icon" style="float: right; padding: 0 20px; margin-bottom: 20px;">}} + +ArangoDB has a natively integrated search engine for a broad range of +information retrieval needs. It is powered by inverted indexes and can index +full-text, GeoJSON, as well as arbitrary JSON data. It supports various +kinds of search patterns (tokens, phrases, wildcard, fuzzy, geo-spatial, etc.) +and it can rank results by relevance and similarity using popular +scoring algorithms. + +It also features natural language processing (NLP) capabilities. +{{% comment %}} Experimental feature +and can classify or find similar terms using word embedding models. +{{% /comment %}} + +For more information about the search engine, see [ArangoSearch](../index-and-search/arangosearch/_index.md). + +## ArangoDB for Machine Learning + +You can use ArangoDB as the foundation for machine learning based on graphs +at enterprise scale. You can use it as a metadata store for model training +parameters, run analytical algorithms in the database, or serve operative +queries using data that you computed. + +ArangoDB integrates well into existing data infrastructures and provides +connectors for popular machine learning frameworks and data processing +ecosystems. + +![Machine Learning Architecture of ArangoDB](../../../images/machine-learning-architecture.png) diff --git a/site/content/arangodb/oem/aql/_index.md b/site/content/arangodb/oem/aql/_index.md new file mode 100644 index 0000000000..688215f3dc --- /dev/null +++ b/site/content/arangodb/oem/aql/_index.md @@ -0,0 +1,36 @@ +--- +title: AQL Documentation +menuTitle: AQL +weight: 70 +description: >- + The ArangoDB Query Language (AQL) lets you store, retrieve, and modify data + in various ways in ArangoDB +--- +AQL is mainly a declarative language, meaning that a query expresses what result +should be achieved but not how it should be achieved. AQL aims to be +human-readable and therefore uses keywords from the English language. Another +design goal of AQL was client independence, meaning that the language and syntax +are the same for all clients, no matter what programming language the clients +may use. Further design goals of AQL were the support of complex query patterns +and the different data models ArangoDB offers. + +In its purpose, AQL is similar to the Structured Query Language (SQL). AQL supports +reading and modifying collection data, but it doesn't support data-definition +operations such as creating and dropping databases, collections and indexes. +It is a pure data manipulation language (DML), not a data definition language +(DDL) or a data control language (DCL). + +The syntax of AQL queries is different to SQL, even if some keywords overlap. +Nevertheless, AQL should be easy to understand for anyone with an SQL background. + +The general workflow when executing a query is as follows: + +1. A client application ships an AQL query to the ArangoDB server. The query text + contains everything ArangoDB needs to compute the result set. +2. ArangoDB parses the query, executes it, and compiles the results. If the + query is invalid or cannot be executed, the server returns an error that + the client can process and react to. If the query can be executed + successfully, the server returns the query results (if any) to the client. + +For example queries, see the [Data Queries](data-queries.md) and +[Examples & Query Patterns](examples-and-query-patterns/_index.md) chapters. diff --git a/site/content/arangodb/oem/aql/common-errors.md b/site/content/arangodb/oem/aql/common-errors.md new file mode 100644 index 0000000000..352c3ae8e2 --- /dev/null +++ b/site/content/arangodb/oem/aql/common-errors.md @@ -0,0 +1,420 @@ +--- +title: Common Errors in AQL +menuTitle: Common Errors +weight: 55 +description: >- + Avoid injection vulnerabilities and avoid pitfalls like incorrect operator + usage performance issues when using ArangoDB's query language +--- +## Trailing semicolons in query strings + +Many SQL databases allow sending multiple queries at once. In this case, multiple +queries are separated using the semicolon character. Often it is also supported to +execute a single query that has a semicolon at its end. + +AQL does not support this, and it is a parse error to use a semicolon at the end +of an AQL query string. + +## String concatenation + +In AQL, strings must be concatenated using the [`CONCAT()`](functions/string.md#concat) +function. Joining them together with the `+` operator is not supported. Especially +as JavaScript programmer it is easy to walk into this trap: + +```aql +RETURN "foo" + "bar" // [ 0 ] +RETURN "foo" + 123 // [ 123 ] +RETURN "123" + 200 // [ 323 ] +``` + +The arithmetic plus operator expects numbers as operands, and will try to implicitly +cast them to numbers if they are of different type. `"foo"` and `"bar"` are casted +to `0` and then added to together (still zero). If an actual number is added, that +number will be returned (adding zero doesn't change the result). If the string is a +valid string representation of a number, then it is casted to a number. Thus, adding +`"123"` and `200` results in two numbers being added up to `323`. + +To concatenate elements (with implicit casting to string for non-string values), do: + +```aql +RETURN CONCAT("foo", "bar") // [ "foobar" ] +RETURN CONCAT("foo", 123) // [ "foo123" ] +RETURN CONCAT("123", 200) // [ "123200" ] +``` + +## Parameter injection vulnerability + +Parameter injection means that potentially malicious content is inserted into a +query which may change its meaning. It is a security issue that may allow an +attacker to execute arbitrary queries on the database data. + +It often occurs if applications trustfully insert user-provided inputs into a +query string, and do not fully or incorrectly filter them. It also occurs often +when applications build queries naively, without using security mechanisms often +provided by database software or querying mechanisms. + +AQL is not vulnerable to parameter injection in itself, but queries might be +constructed on the client-side, on an application server or in a Foxx service. +Assembling query strings with simple **string concatenation** looks trivial, +but is potentially **unsafe**. You should use +[bind parameters](fundamentals/bind-parameters.md) instead whenever possible, +use query building functionality if provided by a driver (see +[arangojs AQL Helpers](https://arangodb.github.io/arangojs/latest/functions/aql.aql.html) +for example) or at least sanitize user input with great care. + +### Parameter injection examples + +Below you find a simple query using the [JavaScript API](../develop/javascript-api/_index.md) +that is fed with some dynamic input value, pretending it coming from a web form. +This could be the case in a Foxx service. The route happily picks up the input +value, and puts it into a query: + +```js +// evil! +var what = req.params("searchValue"); // user input value from web form +// ... +var query = "FOR doc IN collection FILTER doc.value == " + what + " RETURN doc"; +db._query(query, params).toArray(); +``` + +The above will probably work fine for numeric input values. + +What could an attacker do to this query? Here are a few suggestions to use for +the `searchValue` parameter: + +- for returning all documents in the collection:\ + `1 || true` +- for removing all documents:\ + `1 || true REMOVE doc IN collection //` +- for inserting new documents:\ + `1 || true INSERT { foo: "bar" } IN collection //` + +It should have become obvious that this is extremely unsafe and should be +avoided. A pattern often seen to counteract this is trying to quote and escape +potentially unsafe input values before putting them into query strings. +This may work in some situations, but it is easy to overlook something or get +it subtly wrong: + +```js +// We are sanitizing now, but it is still evil! +var value = req.params("searchValue").replace(/'/g, ''); +// ... +var query = "FOR doc IN collection FILTER doc.value == '" + value + "' RETURN doc"; +db._query(query, params).toArray(); +``` + +The above example uses single quotes for enclosing the potentially unsafe user +input, and also replaces all single quotes in the input value beforehand. +Not only may that change the user input (leading to subtle errors such as +_"why does my search for `O'Brien` not return any results?"_), but it is +also still unsafe. If the user input contains a backslash at the end +(e.g. `foo bar\`), that backslash will escape the closing single quote, +allowing the user input to break out of the string fence again. + +It gets worse if user input is inserted into the query at multiple places. +Let us assume we have a query with two dynamic values: + +```js +query = "FOR doc IN collection FILTER doc.value == '" + value + + "' && doc.type == '" + type + "' RETURN doc"; +``` + +If an attacker inserted `\` for parameter `value` and +` || true REMOVE doc IN collection //` for parameter `type`, then the effective +query would become: + +```aql +FOR doc IN collection + FILTER doc.value == '\' && doc.type == ' || true + REMOVE doc IN collection //' RETURN doc +``` + +… which is highly undesirable. The backslash escapes the closing single quote, +turning the `doc.type` condition into a string, which gets compared to +`doc.value`. Further more, an always true or-condition as well as a remove +operation are injected, changing the query purpose entirely. The original +return operation gets commented out and the query will truncate the collection +instead of returning a few documents. + +### Avoiding parameter injection + +Instead of mixing query string fragments with user inputs naively via string +concatenation, use either **bind parameters** or a **query builder**. Both can +help to avoid the problem of injection, because they allow separating the actual +query operations (like `FOR`, `INSERT`, `REMOVE`) from (user input) values. + +Below, the focus is on bind parameters. This is not to say that query builders +shouldn't be used. They were simply omitted here for the sake of simplicity. + +#### What bind parameters are + +Bind parameters in AQL queries are special tokens that act as placeholders for +actual values. Here's an example: + +```aql +FOR doc IN collection + FILTER doc.value == @what + RETURN doc +``` + +In the above query, `@what` is a bind parameter. In order to execute this query, +a value for bind parameter `@what` must be specified. Otherwise query execution will +fail with error 1551 (*no value specified for declared bind parameter*). If a value +for `@what` gets specified, the query can be executed. However, the query string +and the bind parameter values (i.e. the contents of the `@what` bind parameter) will +be handled separately. What's in the bind parameter will always be treated as a value, +and it can't get out of its sandbox and change the semantic meaning of a query. + +#### How bind parameters are used + +To execute a query with bind parameters, the query string (containing the bind +parameters) and the bind parameter values are specified separately (note that when +the bind parameter value is assigned, the prefix `@` needs to be omitted): + +```js +// query string with bind parameter +var query = "FOR doc IN collection FILTER doc.value == @what RETURN doc"; + +// actual value for bind parameter +var params = { what: 42 }; + +// run query, specifying query string and bind parameter separately +db._query(query, params).toArray(); +``` + +If a malicious user would set `@what` to a value of `1 || true`, this wouldn't do +any harm. AQL would treat the contents of `@what` as a single string token, and +the meaning of the query would remain unchanged. The actually executed query would be: + +```aql +FOR doc IN collection + FILTER doc.value == "1 || true" + RETURN doc +``` + +Thanks to bind parameters it is also impossible to turn a selection (i.e. read-only) +query into a data deletion query. + +#### Using JavaScript variables as bind parameters + +There is also a template string generator function `aql` that can be used to safely +(and conveniently) built AQL queries using JavaScript variables and expressions. It +can be invoked as follows: + +```js +const aql = require('@arangodb').aql; // not needed in arangosh + +var value = "some input value"; +var query = aql`FOR doc IN collection + FILTER doc.value == ${value} + RETURN doc`; +var result = db._query(query).toArray(); +``` + +Note that an ES6 template string is used for populating the `query` variable. +The string is assembled using the `aql` generator function which is bundled +with ArangoDB. The template string can contain references to JavaScript +variables or expressions via `${...}`. In the above example, the query +references a variable named `value`. The `aql` function generates an object +with two separate attributes: the query string, containing references to +bind parameters, and the actual bind parameter values. + +Bind parameter names are automatically generated by the `aql` function: + +```js +var value = "some input value"; +aql`FOR doc IN collection FILTER doc.value == ${value} RETURN doc`; + +{ + "query" : "FOR doc IN collection FILTER doc.value == @value0 RETURN doc", + "bindVars" : { + "value0" : "some input value" + } +} +``` + +#### Using bind parameters in dynamic queries + +Bind parameters are helpful, so it makes sense to use them for handling the +dynamic values. You can even use them for queries that itself are highly +dynamic, for example with conditional `FILTER` and `LIMIT` parts. +Here's how to do this: + +```js +// Note: this example has a slight issue... hang on reading +var query = "FOR doc IN collection"; +var params = { }; + +if (useFilter) { + query += " FILTER doc.value == @what"; + params.what = req.params("searchValue"); +} + +if (useLimit) { + // not quite right, see below + query += " LIMIT @offset, @count"; + params.offset = req.params("offset"); + params.count = req.params("count"); +} + +query += " RETURN doc"; +db._query(query, params).toArray(); +``` + +Note that in this example we're back to string concatenation, but without the +problem of the query being vulnerable to arbitrary modifications. + +#### Input value validation and sanitation + +Still you should prefer to be paranoid, and try to detect invalid input values +as early as possible, at least before executing a query with them. This is +because some input parameters may affect the runtime behavior of queries +negatively or, when modified, may lead to queries throwing runtime errors +instead of returning valid results. This isn't something an attacker +should deserve. + +`LIMIT` is a good example for this: if used with a single argument, the +argument should be numeric. When `LIMIT` is given a string value, executing +the query will fail. You may want to detect this early and don't return an +HTTP 500 (as this would signal attackers that they were successful breaking +your application). + +Another problem with `LIMIT` is that high `LIMIT` values are likely more +expensive than low ones, and you may want to disallow using `LIMIT` values +exceeding a certain threshold. + +Here is what you could do in such cases: + +```js +var query = "FOR doc IN collection LIMIT @count RETURN doc"; + +// some default value for limit +var params = { count: 100 }; + +if (useLimit) { + var count = req.params("count"); + + // abort if value does not look like an integer + if (! preg_match(/^d+$/, count)) { + throw "invalid count value!"; + } + + // actually turn it into an integer + params.count = parseInt(count, 10); // turn into numeric value +} + +if (params.count < 1 || params.count > 1000) { + // value is outside of accepted thresholds + throw "invalid count value!"; +} + +db._query(query, params).toArray(); +``` + +This is a bit more complex, but that is a price you are likely willing to pay +for a bit of extra safety. In reality you may want to use a framework for +validation (such as [joi](https://www.npmjs.com/package/joi) +which comes bundled with ArangoDB) instead of writing your own checks all over +the place. + +#### Bind parameter types + +There are two types of bind parameters in AQL: + +- Bind parameters for **values**:\ + Those are prefixed with a single `@` in AQL queries, and are specified + without the prefix when they get their value assigned. These bind parameters + can contain any valid JSON value. + + Examples: `@what`, `@searchValue` + +- Bind parameters for **collections**:\ + These are prefixed with `@@` in AQL queries, and are replaced with the name + of a collection. When the bind parameter value is assigned, the parameter + itself must be specified with a single `@` prefix. Only string values are + allowed for this type of bind parameters. + + Examples: `@@collection`, `@@edgeColl` + +The latter type of bind parameter is probably not used as often, and it should +not be used together with user input. Otherwise users may freely determine on +which collection your AQL queries will operate on (this might be a valid +use case, but normally it is extremely undesired). + +## Unexpected long running queries + +Slow queries can have various reasons and be legitimate for queries with a high +computational complexity or if they touch a lot of data. Use the *Explain* +feature to inspect execution plans and verify that appropriate indexes are +utilized. Also check for mistakes such as references to the wrong variables. + +A literal collection name, which is not part of constructs like `FOR`, +`UPDATE ... IN` etc., stands for an array of all documents of that collection +and can cause an entire collection to be materialized before further +processing. It should thus be avoided. + +Check the execution plan for `/* all collection documents */` and verify that +it is intended. You should also see a warning if you execute such a query: + +> collection 'coll' used as expression operand + +For example, instead of: + +```aql +RETURN coll[* LIMIT 1] +``` + +... with the execution plan ... + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 CalculationNode 1 - LET #2 = coll /* all collection documents */[* LIMIT 0, 1] /* v8 expression */ + 3 ReturnNode 1 - RETURN #2 +``` + +... you can use the following equivalent query: + +```aql +FOR doc IN coll + LIMIT 1 + RETURN doc +``` + +... with the (better) execution plan: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 44 - FOR doc IN Characters /* full collection scan */ + 3 LimitNode 1 - LIMIT 0, 1 + 4 ReturnNode 1 - RETURN doc +``` + +Similarly, make sure you have not confused any variable names with collection +names by accident: + +```aql +LET names = ["John", "Mary", ...] +// supposed to refer to variable "names", not collection "Names" +FOR name IN Names + ... +``` + +You can set the startup option `--query.allow-collections-in-expressions` to +*false* to disallow collection names in arbitrary places in AQL expressions +to prevent such mistakes. Also see +[ArangoDB Server Query Options](../components/arangodb-server/options.md#--queryallow-collections-in-expressions) + +{{% comment %}} +Rename to Error Sources? + +Quote marks around bind parameter placeholders +https://github.com/arangodb/arangodb/issues/1634#issuecomment-167808660 + +FILTER HAS(doc, "attr") instead of FILTER doc.attr / FILTER doc.attr != null + +collection ... not found error, e.g. access of variable after COLLECT (no longer existing) +{{% /comment %}} diff --git a/site/content/arangodb/oem/aql/data-queries.md b/site/content/arangodb/oem/aql/data-queries.md new file mode 100644 index 0000000000..1b07b4214a --- /dev/null +++ b/site/content/arangodb/oem/aql/data-queries.md @@ -0,0 +1,554 @@ +--- +title: AQL Data Queries +menuTitle: Data Queries +weight: 20 +description: >- + With AQL queries, you can read and write data in the form of documents +--- +There are two fundamental types of AQL queries: +- queries which access data (read documents) +- queries which modify data (create, update, replace, delete documents) + +## Data Access Queries + +Retrieving data from the database with AQL does always include a **RETURN** +operation. It can be used to return a static value, such as a string: + +```aql +RETURN "Hello ArangoDB!" +``` + +The query result is always an array of elements, even if a single element was +returned and contains a single element in that case: `["Hello ArangoDB!"]` + +The function `DOCUMENT()` can be called to retrieve a single document via +its document identifier, for instance: + +```aql +RETURN DOCUMENT("users/phil") +``` + +`RETURN` is usually accompanied by a **FOR** loop to iterate over the +documents of a collection. The following query executes the loop body for all +documents of a collection called `users`. Each document is returned unchanged +in this example: + +```aql +FOR doc IN users + RETURN doc +``` + +Instead of returning the raw `doc`, one can easily create a projection: + +```aql +FOR doc IN users + RETURN { user: doc, newAttribute: true } +``` + +For every user document, an object with two attributes is returned. The value +of the attribute `user` is set to the content of the user document, and +`newAttribute` is a static attribute with the boolean value `true`. + +Operations like **FILTER**, **SORT** and **LIMIT** can be added to the loop body +to narrow and order the result. Instead of above shown call to `DOCUMENT()`, +one can also retrieve the document that describes user `phil` like so: + +```aql +FOR doc IN users + FILTER doc._key == "phil" + RETURN doc +``` + +The document key is used in this example, but any other attribute could equally +be used for filtering. Since the document key is guaranteed to be unique, no +more than a single document can match this filter. For other attributes this +may not be the case. To return a subset of active users (determined by an +attribute called `status`), sorted by name in ascending order, you can do: + +```aql +FOR doc IN users + FILTER doc.status == "active" + SORT doc.name + LIMIT 10 +``` + +Note that operations do not have to occur in a fixed order and that their order +can influence the result significantly. Limiting the number of documents +before a filter is usually not what you want, because it easily misses a lot +of documents that would fulfill the filter criterion, but are ignored because +of a premature `LIMIT` clause. Because of the aforementioned reasons, `LIMIT` +is usually put at the very end, after `FILTER`, `SORT` and other operations. + +See the [High Level Operations](high-level-operations/_index.md) chapter for more details. + +## Data Modification Queries + +AQL supports the following data modification operations: + +- **INSERT**: insert new documents into a collection +- **UPDATE**: partially update existing documents in a collection +- **REPLACE**: completely replace existing documents in a collection +- **REMOVE**: remove existing documents from a collection +- **UPSERT**: conditionally insert or update documents in a collection + +You can use them to modify the data of one or multiple documents with a single +query. This is superior to fetching and updating the documents individually with +multiple queries. However, if only a single document needs to be modified, +ArangoDB's specialized data modification operations for single documents might +execute faster. + +Below you find some simple example queries that use these operations. +The operations are detailed in the chapter [High Level Operations](high-level-operations/_index.md). + +### Modifying a single document + +Let's start with the basics: `INSERT`, `UPDATE` and `REMOVE` operations on single documents. +Here is an example that inserts a document into a collection called `users` with +the [`INSERT` operation](high-level-operations/insert.md): + +```aql +INSERT { + firstName: "Anna", + name: "Pavlova", + profession: "artist" +} INTO users +``` + +The collection needs to exist before executing the query. AQL queries cannot +create collections. + +If you run the above query, the result is an empty array because we did +not specify what to return using a `RETURN` keyword. It is optional in +modification queries, but mandatory in data access queries. Despite the empty +result, the above query still creates a new user document. + +You may provide a key for the new document; if not provided, ArangoDB creates one for you. + +```aql +INSERT { + _key: "GilbertoGil", + firstName: "Gilberto", + name: "Gil", + city: "Fortalezza" +} INTO users +``` + +As ArangoDB is schema-free, attributes of the documents may vary: + +```aql +INSERT { + _key: "PhilCarpenter", + firstName: "Phil", + name: "Carpenter", + middleName: "G.", + status: "inactive" +} INTO users +``` + +```aql +INSERT { + _key: "NatachaDeclerck", + firstName: "Natacha", + name: "Declerck", + location: "Antwerp" +} INTO users +``` + +The [`UPDATE` operation](high-level-operations/update.md) lets you add or change +attributes of existing documents. The following query modifies a previously +created user, changing the `status` attribute and adding a `location` attribute: + +```aql +UPDATE "PhilCarpenter" WITH { + status: "active", + location: "Beijing" +} IN users +``` + +The [`REPLACE` operation](high-level-operations/replace.md) is an alternative to the +`UPDATE` operation that lets you replace all attributes of a document +(except for attributes that cannot be changed, like `_key`): + +```aql +REPLACE { + _key: "NatachaDeclerck", + firstName: "Natacha", + name: "Leclerc", + status: "active", + level: "premium" +} IN users +``` + +You can delete a document with the [`REMOVE` operation](high-level-operations/remove.md), +only requiring the document key to identify it: + +```aql +REMOVE "GilbertoGil" IN users +``` + +### Modifying multiple documents + +Data modification operations are normally combined with `FOR` loops to +iterate over a given list of documents. They can optionally be combined with +`FILTER` statements and the like. + +To create multiple new documents, use the `INSERT` operation together with `FOR`. +You can also use `INSERT` to generate copies of existing documents from other +collections, or to create synthetic documents (e.g. for testing purposes). +The following query creates 1000 test users with some attributes and stores +them in the `users` collection: + +```aql +FOR i IN 1..1000 + INSERT { + id: 100000 + i, + age: 18 + FLOOR(RAND() * 25), + name: CONCAT('test', TO_STRING(i)), + status: i % 2 == 0 ? "active" : "not active", + active: false, + gender: i % 3 == 0 ? "male" : i % 3 == 1 ? "female" : "diverse" + } IN users +``` + +Let's modify existing documents that match some condition: + +```aql +FOR u IN users + FILTER u.status == "not active" + UPDATE u WITH { status: "inactive" } IN users +``` + +You can also update existing attributes based on their previous value: + +```aql +FOR u IN users + FILTER u.active == true + UPDATE u WITH { numberOfLogins: u.numberOfLogins + 1 } IN users +``` + +The above query only works if there is already a `numberOfLogins` attribute +present in the document. If it is unclear whether there is a `numberOfLogins` +attribute in the document, the increase must be made conditional: + +```aql +FOR u IN users + FILTER u.active == true + UPDATE u WITH { + numberOfLogins: HAS(u, "numberOfLogins") ? u.numberOfLogins + 1 : 1 + } IN users +``` + +Updates of multiple attributes can be combined in a single query: + +```aql +FOR u IN users + FILTER u.active == true + UPDATE u WITH { + lastLogin: DATE_NOW(), + numberOfLogins: HAS(u, "numberOfLogins") ? u.numberOfLogins + 1 : 1 + } IN users +``` + +Note than an update query might fail during execution, for example, because a +document to be updated does not exist. In this case, the query aborts at +the first error. In single server mode, all modifications done by the query +are rolled back as if they never happened. + +You can copy documents from one collection to another by reading from one +collection but write to another. +Let's copy the contents of the `users` collection into the `backup` collection: + +```aql +FOR u IN users + INSERT u IN backup +``` + +Note that both collections must already exist when the query is executed. +The query might fail if the `backup` collection already contains documents, +as executing the insert might attempt to insert the same document (identified +by the `_key` attribute) again. This triggers a unique key constraint violation +and aborts the query. In single server mode, all changes made by the query +are also rolled back. +To make such a copy operation work in all cases, the target collection can +be emptied beforehand, using a `REMOVE` query or by truncating it by other means. + +To not just partially update, but completely replace existing documents, use +the `REPLACE` operation. +The following query replaces all documents in the `backup` collection with +the documents found in the `users` collection. Documents common to both +collections are replaced. All other documents remain unchanged. +Documents are compared using their `_key` attributes: + +```aql +FOR u IN users + REPLACE u IN backup +``` + +The above query fails if there are documents in the `users` collection that are +not in the `backup` collection yet. In this case, the query would attempt to replace +documents that do not exist. If such case is detected while executing the query, +the query is aborted. In single server mode, all changes made by the query are +rolled back. + +To make the query succeed regardless of the errors, use the `ignoreErrors` +query option: + +```aql +FOR u IN users + REPLACE u IN backup OPTIONS { ignoreErrors: true } +``` + +This continues the query execution if errors occur during a `REPLACE`, `UPDATE`, +`INSERT`, or `REMOVE` operation. + +Finally, let's find some documents in collection `users` and remove them +from collection `backup`. The link between the documents in both collections is +established via the documents' keys: + +```aql +FOR u IN users + FILTER u.status == "deleted" + REMOVE u IN backup +``` + +The following example removes all documents from both `users` and `backup`: + +```aql +LET r1 = (FOR u IN users REMOVE u IN users) +LET r2 = (FOR u IN backup REMOVE u IN backup) +RETURN true +``` + +### Altering substructures + +To modify lists in documents, for example, to update specific attributes of +objects in an array, you can compute a new array and then update the document +attribute in question. This may involve the use of subqueries and temporary +variables. + +Create a collection named `complexCollection` and run the following query: + +```aql +FOR doc IN [ + { + "topLevelAttribute": "a", + "subList": [ + { + "attributeToAlter": "value to change", + "filterByMe": true + }, + { + "attributeToAlter": "another value to change", + "filterByMe": true + }, + { + "attributeToAlter": "keep this value", + "filterByMe": false + } + ] + }, + { + "topLevelAttribute": "b", + "subList": [ + { + "attributeToAlter": "keep this value", + "filterByMe": false + } + ] + } +] INSERT doc INTO complexCollection +``` + +The following query updates the `subList` top-level attribute of documents. +The `attributeToAlter` values in the nested object are changed if the adjacent +`filterByMe` attribute is `true`: + +```aql +FOR doc in complexCollection + LET alteredList = ( + FOR element IN doc.subList + RETURN element.filterByMe + ? MERGE(element, { attributeToAlter: "new value" }) + : element + ) + UPDATE doc WITH { subList: alteredList } IN complexCollection + RETURN NEW +``` + +```json +[ + { + "_key": "2607", + "_id": "complexCollection/2607", + "_rev": "_fWb_iOO---", + "topLevelAttribute": "a", + "subList": [ + { + "attributeToAlter": "new value", + "filterByMe": true + }, + { + "attributeToAlter": "new value", + "filterByMe": true + }, + { + "attributeToAlter": "keep this value", + "filterByMe": false + } + ] + }, + { + "_key": "2608", + "_id": "complexCollection/2608", + "_rev": "_fWb_iOO--_", + "topLevelAttribute": "b", + "subList": [ + { + "attributeToAlter": "keep this value", + "filterByMe": false + } + ] + } +] +``` + +To improve the query's performance, you can only update documents if there is +a change to the `subList` to be saved. Instead of comparing the current and the +altered list directly, you may compare their hash values using the +[`HASH()` function](functions/miscellaneous.md#hash), which is faster for +larger objects and arrays. You can also replace the subquery with an +[inline expression](operators.md#inline-expressions): + +```aql +FOR doc in complexCollection + LET alteredList = doc.subList[* + RETURN CURRENT.filterByMe + ? MERGE(CURRENT, { attributeToAlter: "new value" }) + : CURRENT + ] + FILTER HASH(doc.subList) != HASH(alteredList) + UPDATE doc WITH { subList: alteredList } IN complexCollection + RETURN NEW +``` + +### Returning documents + +Data modification queries can optionally return documents. In order to reference +the inserted, removed or modified documents in a `RETURN` statement, data modification +statements introduce the `OLD` and/or `NEW` pseudo-values: + +```aql +FOR i IN 1..100 + INSERT { value: i } IN test + RETURN NEW +``` + +```aql +FOR u IN users + FILTER u.status == "deleted" + REMOVE u IN users + RETURN OLD +``` + +```aql +FOR u IN users + FILTER u.status == "not active" + UPDATE u WITH { status: "inactive" } IN users + RETURN NEW +``` + +`NEW` refers to the inserted or modified document revision, and `OLD` refers +to the document revision before update or removal. `INSERT` statements can +only refer to the `NEW` pseudo-value, and `REMOVE` operations only to `OLD`. +`UPDATE`, `REPLACE` and `UPSERT` can refer to either. + +In all cases, the full documents are returned with all their attributes, +including the potentially auto-generated attributes, such as `_id`, `_key`, and `_rev`, +and the attributes not specified in the update expression of a partial update. + +#### Projections of OLD and NEW + +It is possible to return a projection of the documents with `OLD` or `NEW` instead of +returning the entire documents. This can be used to reduce the amount of data returned +by queries. + +For example, the following query returns only the keys of the inserted documents: + +```aql +FOR i IN 1..100 + INSERT { value: i } IN test + RETURN NEW._key +``` + +#### Using OLD and NEW in the same query + +For `UPDATE`, `REPLACE`, and `UPSERT` operations, both `OLD` and `NEW` can be used +to return the previous revision of a document together with the updated revision: + +```aql +FOR u IN users + FILTER u.status == "not active" + UPDATE u WITH { status: "inactive" } IN users + RETURN { old: OLD, new: NEW } +``` + +#### Calculations with OLD or NEW + +It is also possible to run additional calculations with `LET` statements between the +data modification part and the final `RETURN` of an AQL query. For example, the following +query performs an upsert operation and returns whether an existing document was +updated, or a new document was inserted. It does so by checking the `OLD` variable +after the `UPSERT` and using a `LET` statement to store a temporary string for +the operation type: + +```aql +UPSERT { name: "test" } + INSERT { name: "test" } + UPDATE { } IN users +LET opType = IS_NULL(OLD) ? "insert" : "update" +RETURN { _key: NEW._key, type: opType } +``` + +### Restrictions + +The name of the modified collection (`users` and `backup` in the above cases) +must be known to the AQL executor at query-compile time and cannot change at +runtime. Using a bind parameter to specify the +[collection name](../concepts/data-structure/collections.md#collection-names) is allowed. + +It is not possible to use multiple data modification operations for the same +collection in the same query, or follow up a data modification operation for a +specific collection with a read operation for the same collection. Neither is +it possible to follow up any data modification operation with a traversal query +(which may read from arbitrary collections not necessarily known at the start of +the traversal). + +That means you may not place several `REMOVE` or `UPDATE` statements for the same +collection into the same query. It is however possible to modify different collections +by using multiple data modification operations for different collections in the +same query. +In case you have a query with several places that need to remove documents from the +same collection, it is recommended to collect these documents or their keys in an array +and have the documents from that array removed using a single `REMOVE` operation. + +Data modification operations can optionally be followed by `LET` operations to +perform further calculations and a `RETURN` operation to return data. + +### Transactional Execution + +On a single server, data modification operations are executed transactionally. +If a data modification operation fails, any changes made by it are rolled +back automatically as if they never happened. + +A query may execute intermediate transaction commits in case the running +transaction (AQL query) hits the specified size thresholds. In this case, the +query's operations carried out so far are committed and not rolled back in case +of a later abort/rollback. This behavior can be controlled by adjusting the +intermediate commit settings for the RocksDB engine. See +[Known limitations for AQL queries](fundamentals/limitations.md#storage-engine-properties). + +In a cluster, AQL data modification queries are not executed transactionally. +Additionally, AQL queries with `UPDATE`, `REPLACE`, `UPSERT`, or `REMOVE` +operations require the `_key` attribute to be specified for all documents that +should be modified or removed, even if a shard key attribute other than `_key` +is chosen for the collection. diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/_index.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/_index.md new file mode 100644 index 0000000000..bd78af7eee --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/_index.md @@ -0,0 +1,115 @@ +--- +title: AQL Query Patterns and Examples +menuTitle: Examples & Query Patterns +weight: 40 +description: >- + Create test data, count documents, use joins, group attributes, traverse + graphs, and other examples +--- +These pages contain some common query patterns with examples. For better +understandability the query results are also included directly below each query. + +Normally, you would want to run queries on data stored in collections. +This section will provide several examples for that. + +Some of the following example queries are executed on a collection _users_ +with the data provided here below. + +## Things to consider when running queries on collections + +Note that all documents created in any collections will automatically get the +following server-generated attributes: + +- `_id`: A unique id, consisting of [collection name](../../concepts/data-structure/collections.md#collection-names) + and a server-side sequence value +- `_key`: The server sequence value +- `_rev`: The document's revision id + +Whenever you run queries on the documents in collections, don't be surprised if +these additional attributes are returned as well. + +Please also note that with real-world data, you might want to create additional +indexes on the data (left out here for brevity). Adding indexes on attributes that are +used in `FILTER` statements may considerably speed up queries. Furthermore, instead of +using attributes such as `id`, `from` and `to`, you might want to use the built-in +`_id`, `_from` and `_to` attributes. Finally, [edge collections](../../concepts/data-models.md#graph-model) +provide a nice way of establishing references/links between documents. +These features have been left out here for brevity as well. + +## Example data + +Some of the following example queries are executed on a collection *users* +with the following initial data: + +```json +[ + { "id": 100, "name": "John", "age": 37, "active": true, "gender": "m" }, + { "id": 101, "name": "Fred", "age": 36, "active": true, "gender": "m" }, + { "id": 102, "name": "Jacob", "age": 35, "active": false, "gender": "m" }, + { "id": 103, "name": "Ethan", "age": 34, "active": false, "gender": "m" }, + { "id": 104, "name": "Michael", "age": 33, "active": true, "gender": "m" }, + { "id": 105, "name": "Alexander", "age": 32, "active": true, "gender": "m" }, + { "id": 106, "name": "Daniel", "age": 31, "active": true, "gender": "m" }, + { "id": 107, "name": "Anthony", "age": 30, "active": true, "gender": "m" }, + { "id": 108, "name": "Jim", "age": 29, "active": true, "gender": "m" }, + { "id": 109, "name": "Diego", "age": 28, "active": true, "gender": "m" }, + { "id": 200, "name": "Sophia", "age": 37, "active": true, "gender": "f" }, + { "id": 201, "name": "Emma", "age": 36, "active": true, "gender": "f" }, + { "id": 202, "name": "Olivia", "age": 35, "active": false, "gender": "f" }, + { "id": 203, "name": "Madison", "age": 34, "active": true, "gender": "x" }, + { "id": 204, "name": "Chloe", "age": 33, "active": true, "gender": "f" }, + { "id": 205, "name": "Eva", "age": 32, "active": false, "gender": "f" }, + { "id": 206, "name": "Abigail", "age": 31, "active": true, "gender": "f" }, + { "id": 207, "name": "Isabella", "age": 30, "active": true, "gender": "f" }, + { "id": 208, "name": "Mary", "age": 29, "active": true, "gender": "f" }, + { "id": 209, "name": "Mariah", "age": 28, "active": true, "gender": "f" } +] +``` + +For some of the examples, we'll also use a collection *relations* to store +relationships between users. The example data for *relations* are as follows: + +```json +[ + { "from": 209, "to": 205, "type": "friend" }, + { "from": 206, "to": 108, "type": "friend" }, + { "from": 202, "to": 204, "type": "friend" }, + { "from": 200, "to": 100, "type": "friend" }, + { "from": 205, "to": 101, "type": "friend" }, + { "from": 209, "to": 203, "type": "friend" }, + { "from": 200, "to": 203, "type": "friend" }, + { "from": 100, "to": 208, "type": "friend" }, + { "from": 101, "to": 209, "type": "friend" }, + { "from": 206, "to": 102, "type": "friend" }, + { "from": 104, "to": 100, "type": "friend" }, + { "from": 104, "to": 108, "type": "friend" }, + { "from": 108, "to": 209, "type": "friend" }, + { "from": 206, "to": 106, "type": "friend" }, + { "from": 204, "to": 105, "type": "friend" }, + { "from": 208, "to": 207, "type": "friend" }, + { "from": 102, "to": 108, "type": "friend" }, + { "from": 207, "to": 203, "type": "friend" }, + { "from": 203, "to": 106, "type": "friend" }, + { "from": 202, "to": 108, "type": "friend" }, + { "from": 201, "to": 203, "type": "friend" }, + { "from": 105, "to": 100, "type": "friend" }, + { "from": 100, "to": 109, "type": "friend" }, + { "from": 207, "to": 109, "type": "friend" }, + { "from": 103, "to": 203, "type": "friend" }, + { "from": 208, "to": 104, "type": "friend" }, + { "from": 105, "to": 104, "type": "friend" }, + { "from": 103, "to": 208, "type": "friend" }, + { "from": 203, "to": 107, "type": "boyfriend" }, + { "from": 107, "to": 203, "type": "girlfriend" }, + { "from": 208, "to": 109, "type": "boyfriend" }, + { "from": 109, "to": 208, "type": "girlfriend" }, + { "from": 106, "to": 205, "type": "girlfriend" }, + { "from": 205, "to": 106, "type": "boyfriend" }, + { "from": 103, "to": 209, "type": "girlfriend" }, + { "from": 209, "to": 103, "type": "boyfriend" }, + { "from": 201, "to": 102, "type": "boyfriend" }, + { "from": 102, "to": 201, "type": "girlfriend" }, + { "from": 206, "to": 100, "type": "boyfriend" }, + { "from": 100, "to": 206, "type": "girlfriend" } +] +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md new file mode 100644 index 0000000000..ef1c1f17d5 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md @@ -0,0 +1,859 @@ +--- +title: AQL Example Queries on an Actors and Movies Dataset +menuTitle: Actors & Movies Dataset Queries +weight: 35 +description: >- + Example queries showing different AQL query features and combinations of them +--- +Given a graph `[actors] – actsIn → [movies]` with two vertex collections +**actors** and **movies** and an edge collection **actsIn** with edges pointing +from actor to movie, plenty of interesting queries are possible: + +- All actors who acted in "movie1" OR "movie2" +- All actors who acted in both "movie1" AND "movie2" +- All common movies between "actor1" and "actor2" +- All actors who acted in 3 or more movies +- All movies where exactly 6 actors acted in +- The number of actors by movie +- The number of movies by actor +- The number of movies acted in between two years by actor +- The years and number of movies by actor with actor name + +## Dataset + +We will be using _arangosh_ to create and query the data. All AQL queries are +strings and can simply be copied over to the web interface or your favorite +driver as well. + +```js +var actors = db._create("actors"); +var movies = db._create("movies"); +var actsIn = db._createEdgeCollection("actsIn"); + +var TheMatrix = movies.save({ _key: "TheMatrix", title: "The Matrix", released: 1999, tagline: "Welcome to the Real World" })._id; +var Keanu = actors.save({ _key: "Keanu", name: "Keanu Reeves", born: 1964 })._id; +var Carrie = actors.save({ _key: "Carrie", name: "Carrie-Anne Moss", born: 1967 })._id; +var Laurence = actors.save({ _key: "Laurence", name: "Laurence Fishburne", born: 1961 })._id; +var Hugo = actors.save({ _key: "Hugo", name: "Hugo Weaving", born: 1960 })._id; +var Emil = actors.save({ _key: "Emil", name: "Emil Eifrem", born: 1978 }); + +actsIn.save(Keanu, TheMatrix, { roles: ["Neo"], year: 1999 }); +actsIn.save(Carrie, TheMatrix, { roles: ["Trinity"], year: 1999 }); +actsIn.save(Laurence, TheMatrix, { roles: ["Morpheus"], year: 1999 }); +actsIn.save(Hugo, TheMatrix, { roles: ["Agent Smith"], year: 1999 }); +actsIn.save(Emil, TheMatrix, { roles: ["Emil"], year: 1999 }); + +var TheMatrixReloaded = movies.save({ _key: "TheMatrixReloaded", title: "The Matrix Reloaded", released: 2003, tagline: "Free your mind" }); +actsIn.save(Keanu, TheMatrixReloaded, { roles: ["Neo"], year: 2003 }); +actsIn.save(Carrie, TheMatrixReloaded, { roles: ["Trinity"], year: 2003 }); +actsIn.save(Laurence, TheMatrixReloaded, { roles: ["Morpheus"], year: 2003 }); +actsIn.save(Hugo, TheMatrixReloaded, { roles: ["Agent Smith"], year: 2003 }); + +var TheMatrixRevolutions = movies.save({ _key: "TheMatrixRevolutions", title: "The Matrix Revolutions", released: 2003, tagline: "Everything that has a beginning has an end" }); +actsIn.save(Keanu, TheMatrixRevolutions, { roles: ["Neo"], year: 2003 }); +actsIn.save(Carrie, TheMatrixRevolutions, { roles: ["Trinity"], year: 2003 }); +actsIn.save(Laurence, TheMatrixRevolutions, { roles: ["Morpheus"], year: 2003 }); +actsIn.save(Hugo, TheMatrixRevolutions, { roles: ["Agent Smith"], year: 2003 }); + +var TheDevilsAdvocate = movies.save({ _key: "TheDevilsAdvocate", title: "The Devil's Advocate", released: 1997, tagline: "Evil has its winning ways" })._id; +var Charlize = actors.save({ _key: "Charlize", name: "Charlize Theron", born: 1975 })._id; +var Al = actors.save({ _key: "Al", name: "Al Pacino", born: 1940 })._id; +actsIn.save(Keanu, TheDevilsAdvocate, { roles: ["Kevin Lomax"], year: 1997 }); +actsIn.save(Charlize, TheDevilsAdvocate, { roles: ["Mary Ann Lomax"], year: 1997 }); +actsIn.save(Al, TheDevilsAdvocate, { roles: ["John Milton"], year: 1997 }); + +var AFewGoodMen = movies.save({ _key: "AFewGoodMen", title: "A Few Good Men", released: 1992, tagline: "In the heart of the nation's capital, in a courthouse of the U.S. government, one man will stop at nothing to keep his honor, and one will stop at nothing to find the truth." })._id; +var TomC = actors.save({ _key: "TomC", name: "Tom Cruise", born: 1962 })._id; +var JackN = actors.save({ _key: "JackN", name: "Jack Nicholson", born: 1937 })._id; +var DemiM = actors.save({ _key: "DemiM", name: "Demi Moore", born: 1962 })._id; +var KevinB = actors.save({ _key: "KevinB", name: "Kevin Bacon", born: 1958 })._id; +var KieferS = actors.save({ _key: "KieferS", name: "Kiefer Sutherland", born: 1966 })._id; +var NoahW = actors.save({ _key: "NoahW", name: "Noah Wyle", born: 1971 })._id; +var CubaG = actors.save({ _key: "CubaG", name: "Cuba Gooding Jr.", born: 1968 })._id; +var KevinP = actors.save({ _key: "KevinP", name: "Kevin Pollak", born: 1957 })._id; +var JTW = actors.save({ _key: "JTW", name: "J.T. Walsh", born: 1943 })._id; +var JamesM = actors.save({ _key: "JamesM", name: "James Marshall", born: 1967 })._id; +var ChristopherG = actors.save({ _key: "ChristopherG", name: "Christopher Guest", born: 1948 })._id; +actsIn.save(TomC, AFewGoodMen, { roles: ["Lt. Daniel Kaffee"], year: 1992 }); +actsIn.save(JackN, AFewGoodMen, { roles: ["Col. Nathan R. Jessup"], year: 1992 }); +actsIn.save(DemiM, AFewGoodMen, { roles: ["Lt. Cdr. JoAnne Galloway"], year: 1992 }); +actsIn.save(KevinB, AFewGoodMen, { roles: ["Capt. Jack Ross"], year: 1992 }); +actsIn.save(KieferS, AFewGoodMen, { roles: ["Lt. Jonathan Kendrick"], year: 1992 }); +actsIn.save(NoahW, AFewGoodMen, { roles: ["Cpl. Jeffrey Barnes"], year: 1992 }); +actsIn.save(CubaG, AFewGoodMen, { roles: ["Cpl. Carl Hammaker"], year: 1992 }); +actsIn.save(KevinP, AFewGoodMen, { roles: ["Lt. Sam Weinberg"], year: 1992 }); +actsIn.save(JTW, AFewGoodMen, { roles: ["Lt. Col. Matthew Andrew Markinson"], year: 1992 }); +actsIn.save(JamesM, AFewGoodMen, { roles: ["Pfc. Louden Downey"], year: 1992 }); +actsIn.save(ChristopherG, AFewGoodMen, { roles: ["Dr. Stone"], year: 1992 }); + +var TopGun = movies.save({ _key: "TopGun", title: "Top Gun", released: 1986, tagline: "I feel the need, the need for speed." })._id; +var KellyM = actors.save({ _key: "KellyM", name: "Kelly McGillis", born: 1957 })._id; +var ValK = actors.save({ _key: "ValK", name: "Val Kilmer", born: 1959 })._id; +var AnthonyE = actors.save({ _key: "AnthonyE", name: "Anthony Edwards", born: 1962 })._id; +var TomS = actors.save({ _key: "TomS", name: "Tom Skerritt", born: 1933 })._id; +var MegR = actors.save({ _key: "MegR", name: "Meg Ryan", born: 1961 })._id; +actsIn.save(TomC, TopGun, { roles: ["Maverick"], year: 1986 }); +actsIn.save(KellyM, TopGun, { roles: ["Charlie"], year: 1986 }); +actsIn.save(ValK, TopGun, { roles: ["Iceman"], year: 1986 }); +actsIn.save(AnthonyE, TopGun, { roles: ["Goose"], year: 1986 }); +actsIn.save(TomS, TopGun, { roles: ["Viper"], year: 1986 }); +actsIn.save(MegR, TopGun, { roles: ["Carole"], year: 1986 }); + +var JerryMaguire = movies.save({ _key: "JerryMaguire", title: "Jerry Maguire", released: 2000, tagline: "The rest of his life begins now." })._id; +var ReneeZ = actors.save({ _key: "ReneeZ", name: "Renee Zellweger", born: 1969 })._id; +var KellyP = actors.save({ _key: "KellyP", name: "Kelly Preston", born: 1962 })._id; +var JerryO = actors.save({ _key: "JerryO", name: "Jerry O'Connell", born: 1974 })._id; +var JayM = actors.save({ _key: "JayM", name: "Jay Mohr", born: 1970 })._id; +var BonnieH = actors.save({ _key: "BonnieH", name: "Bonnie Hunt", born: 1961 })._id; +var ReginaK = actors.save({ _key: "ReginaK", name: "Regina King", born: 1971 })._id; +var JonathanL = actors.save({ _key: "JonathanL", name: "Jonathan Lipnicki", born: 1996 })._id; +actsIn.save(TomC, JerryMaguire, { roles: ["Jerry Maguire"], year: 2000 }); +actsIn.save(CubaG, JerryMaguire, { roles: ["Rod Tidwell"], year: 2000 }); +actsIn.save(ReneeZ, JerryMaguire, { roles: ["Dorothy Boyd"], year: 2000 }); +actsIn.save(KellyP, JerryMaguire, { roles: ["Avery Bishop"], year: 2000 }); +actsIn.save(JerryO, JerryMaguire, { roles: ["Frank Cushman"], year: 2000 }); +actsIn.save(JayM, JerryMaguire, { roles: ["Bob Sugar"], year: 2000 }); +actsIn.save(BonnieH, JerryMaguire, { roles: ["Laurel Boyd"], year: 2000 }); +actsIn.save(ReginaK, JerryMaguire, { roles: ["Marcee Tidwell"], year: 2000 }); +actsIn.save(JonathanL, JerryMaguire, { roles: ["Ray Boyd"], year: 2000 }); + +var StandByMe = movies.save({ _key: "StandByMe", title: "Stand By Me", released: 1986, tagline: "For some, it's the last real taste of innocence, and the first real taste of life. But for everyone, it's the time that memories are made of." })._id; +var RiverP = actors.save({ _key: "RiverP", name: "River Phoenix", born: 1970 })._id; +var CoreyF = actors.save({ _key: "CoreyF", name: "Corey Feldman", born: 1971 })._id; +var WilW = actors.save({ _key: "WilW", name: "Wil Wheaton", born: 1972 })._id; +var JohnC = actors.save({ _key: "JohnC", name: "John Cusack", born: 1966 })._id; +var MarshallB = actors.save({ _key: "MarshallB", name: "Marshall Bell", born: 1942 })._id; +actsIn.save(WilW, StandByMe, { roles: ["Gordie Lachance"], year: 1986 }); +actsIn.save(RiverP, StandByMe, { roles: ["Chris Chambers"], year: 1986 }); +actsIn.save(JerryO, StandByMe, { roles: ["Vern Tessio"], year: 1986 }); +actsIn.save(CoreyF, StandByMe, { roles: ["Teddy Duchamp"], year: 1986 }); +actsIn.save(JohnC, StandByMe, { roles: ["Denny Lachance"], year: 1986 }); +actsIn.save(KieferS, StandByMe, { roles: ["Ace Merrill"], year: 1986 }); +actsIn.save(MarshallB, StandByMe, { roles: ["Mr. Lachance"], year: 1986 }); + +var AsGoodAsItGets = movies.save({ _key: "AsGoodAsItGets", title: "As Good as It Gets", released: 1997, tagline: "A comedy from the heart that goes for the throat." })._id; +var HelenH = actors.save({ _key: "HelenH", name: "Helen Hunt", born: 1963 })._id; +var GregK = actors.save({ _key: "GregK", name: "Greg Kinnear", born: 1963 })._id; +actsIn.save(JackN, AsGoodAsItGets, { roles: ["Melvin Udall"], year: 1997 }); +actsIn.save(HelenH, AsGoodAsItGets, { roles: ["Carol Connelly"], year: 1997 }); +actsIn.save(GregK, AsGoodAsItGets, { roles: ["Simon Bishop"], year: 1997 }); +actsIn.save(CubaG, AsGoodAsItGets, { roles: ["Frank Sachs"], year: 1997 }); + +var WhatDreamsMayCome = movies.save({ _key: "WhatDreamsMayCome", title: "What Dreams May Come", released: 1998, tagline: "After life there is more. The end is just the beginning." })._id; +var AnnabellaS = actors.save({ _key: "AnnabellaS", name: "Annabella Sciorra", born: 1960 })._id; +var MaxS = actors.save({ _key: "MaxS", name: "Max von Sydow", born: 1929 })._id; +var WernerH = actors.save({ _key: "WernerH", name: "Werner Herzog", born: 1942 })._id; +var Robin = actors.save({ _key: "Robin", name: "Robin Williams", born: 1951 })._id; +actsIn.save(Robin, WhatDreamsMayCome, { roles: ["Chris Nielsen"], year: 1998 }); +actsIn.save(CubaG, WhatDreamsMayCome, { roles: ["Albert Lewis"], year: 1998 }); +actsIn.save(AnnabellaS, WhatDreamsMayCome, { roles: ["Annie Collins-Nielsen"], year: 1998 }); +actsIn.save(MaxS, WhatDreamsMayCome, { roles: ["The Tracker"], year: 1998 }); +actsIn.save(WernerH, WhatDreamsMayCome, { roles: ["The Face"], year: 1998 }); + +var SnowFallingonCedars = movies.save({ _key: "SnowFallingonCedars", title: "Snow Falling on Cedars", released: 1999, tagline: "First loves last. Forever." })._id; +var EthanH = actors.save({ _key: "EthanH", name: "Ethan Hawke", born: 1970 })._id; +var RickY = actors.save({ _key: "RickY", name: "Rick Yune", born: 1971 })._id; +var JamesC = actors.save({ _key: "JamesC", name: "James Cromwell", born: 1940 })._id; +actsIn.save(EthanH, SnowFallingonCedars, { roles: ["Ishmael Chambers"], year: 1999 }); +actsIn.save(RickY, SnowFallingonCedars, { roles: ["Kazuo Miyamoto"], year: 1999 }); +actsIn.save(MaxS, SnowFallingonCedars, { roles: ["Nels Gudmundsson"], year: 1999 }); +actsIn.save(JamesC, SnowFallingonCedars, { roles: ["Judge Fielding"], year: 1999 }); + +var YouveGotMail = movies.save({ _key: "YouveGotMail", title: "You've Got Mail", released: 1998, tagline: "At odds in life... in love on-line." })._id; +var ParkerP = actors.save({ _key: "ParkerP", name: "Parker Posey", born: 1968 })._id; +var DaveC = actors.save({ _key: "DaveC", name: "Dave Chappelle", born: 1973 })._id; +var SteveZ = actors.save({ _key: "SteveZ", name: "Steve Zahn", born: 1967 })._id; +var TomH = actors.save({ _key: "TomH", name: "Tom Hanks", born: 1956 })._id; +actsIn.save(TomH, YouveGotMail, { roles: ["Joe Fox"], year: 1998 }); +actsIn.save(MegR, YouveGotMail, { roles: ["Kathleen Kelly"], year: 1998 }); +actsIn.save(GregK, YouveGotMail, { roles: ["Frank Navasky"], year: 1998 }); +actsIn.save(ParkerP, YouveGotMail, { roles: ["Patricia Eden"], year: 1998 }); +actsIn.save(DaveC, YouveGotMail, { roles: ["Kevin Jackson"], year: 1998 }); +actsIn.save(SteveZ, YouveGotMail, { roles: ["George Pappas"], year: 1998 }); + +var SleeplessInSeattle = movies.save({ _key: "SleeplessInSeattle", title: "Sleepless in Seattle", released: 1993, tagline: "What if someone you never met, someone you never saw, someone you never knew was the only someone for you?" })._id; +var RitaW = actors.save({ _key: "RitaW", name: "Rita Wilson", born: 1956 })._id; +var BillPull = actors.save({ _key: "BillPull", name: "Bill Pullman", born: 1953 })._id; +var VictorG = actors.save({ _key: "VictorG", name: "Victor Garber", born: 1949 })._id; +var RosieO = actors.save({ _key: "RosieO", name: "Rosie O'Donnell", born: 1962 })._id; +actsIn.save(TomH, SleeplessInSeattle, { roles: ["Sam Baldwin"], year: 1993 }); +actsIn.save(MegR, SleeplessInSeattle, { roles: ["Annie Reed"], year: 1993 }); +actsIn.save(RitaW, SleeplessInSeattle, { roles: ["Suzy"], year: 1993 }); +actsIn.save(BillPull, SleeplessInSeattle, { roles: ["Walter"], year: 1993 }); +actsIn.save(VictorG, SleeplessInSeattle, { roles: ["Greg"], year: 1993 }); +actsIn.save(RosieO, SleeplessInSeattle, { roles: ["Becky"], year: 1993 }); + +var JoeVersustheVolcano = movies.save({ _key: "JoeVersustheVolcano", title: "Joe Versus the Volcano", released: 1990, tagline: "A story of love, lava and burning desire." })._id; +var Nathan = actors.save({ _key: "Nathan", name: "Nathan Lane", born: 1956 })._id; +actsIn.save(TomH, JoeVersustheVolcano, { roles: ["Joe Banks"], year: 1990 }); +actsIn.save(MegR, JoeVersustheVolcano, { roles: ["DeDe", "Angelica Graynamore", "Patricia Graynamore"], year: 1990 }); +actsIn.save(Nathan, JoeVersustheVolcano, { roles: ["Baw"], year: 1990 }); + +var WhenHarryMetSally = movies.save({ _key: "WhenHarryMetSally", title: "When Harry Met Sally", released: 1998, tagline: "At odds in life... in love on-line." })._id; +var BillyC = actors.save({ _key: "BillyC", name: "Billy Crystal", born: 1948 })._id; +var CarrieF = actors.save({ _key: "CarrieF", name: "Carrie Fisher", born: 1956 })._id; +var BrunoK = actors.save({ _key: "BrunoK", name: "Bruno Kirby", born: 1949 })._id; +actsIn.save(BillyC, WhenHarryMetSally, { roles: ["Harry Burns"], year: 1998 }); +actsIn.save(MegR, WhenHarryMetSally, { roles: ["Sally Albright"], year: 1998 }); +actsIn.save(CarrieF, WhenHarryMetSally, { roles: ["Marie"], year: 1998 }); +actsIn.save(BrunoK, WhenHarryMetSally, { roles: ["Jess"], year: 1998 }); +``` + +## Example queries + +### All actors who acted in "movie1" OR "movie2" + +Say we want to find all actors who acted in "TheMatrix" OR "TheDevilsAdvocate". +First lets try to get all actors for one movie: + +```js +db._query(` + FOR x IN ANY 'movies/TheMatrix' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN x._id +`).toArray(); +``` + +Result: + +```json +[ + [ + "actors/Keanu", + "actors/Hugo", + "actors/Emil", + "actors/Carrie", + "actors/Laurence" + ] +] +``` + +Now we continue to form a `UNION_DISTINCT` of two neighbor queries which will +be the solution: + +```js +db._query(` + FOR x IN UNION_DISTINCT( + (FOR y IN ANY 'movies/TheMatrix' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN y._id), + (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN y._id) + ) RETURN x +`).toArray(); +``` + +```json +[ + [ + "actors/Emil", + "actors/Hugo", + "actors/Carrie", + "actors/Laurence", + "actors/Keanu", + "actors/Al", + "actors/Charlize" + ] +] +``` + +### All actors who acted in both "movie1" AND "movie2" + +This is almost identical to the question above. +But this time we are not interested in a `UNION` but in an `INTERSECTION`: + +```js +db._query(` + FOR x IN INTERSECTION( + (FOR y IN ANY 'movies/TheMatrix' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN y._id), + (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN y._id) + ) RETURN x +`).toArray(); +``` + +```json +[ + [ + "actors/Keanu" + ] +] +``` + +### All common movies between "actor1" and "actor2" + +This is actually identical to the question about common actors in movie1 and +movie2. We just have to change the starting vertices. As an example let us find +all movies where Hugo Weaving and Keanu Reeves are co-starring: + +```js +db._query(` + FOR x IN INTERSECTION( + (FOR y IN ANY 'actors/Hugo' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN y._id), + (FOR y IN ANY 'actors/Keanu' actsIn + OPTIONS { order: 'bfs', uniqueVertices: 'global' } + RETURN y._id) + ) RETURN x +`).toArray(); +``` + +```json +[ + [ + "movies/TheMatrixRevolutions", + "movies/TheMatrixReloaded", + "movies/TheMatrix" + ] +] +``` + +### All actors who acted in 3 or more movies + +Will make use of the edge index and the `COLLECT` statement of AQL for +grouping. The basic idea is to group all edges by their start vertex +(which in this dataset is always the actor). Then we remove all actors with +less than 3 movies from the result. Below query also returns the computed +number of movies an actor has acted in: + +```js +db._query(` + FOR x IN actsIn + COLLECT actor = x._from WITH COUNT INTO counter + FILTER counter >= 3 + RETURN { actor: actor, movies: counter } +`).toArray(); +``` + +```json +[ + { + "actor" : "actors/Carrie", + "movies" : 3 + }, + { + "actor" : "actors/CubaG", + "movies" : 4 + }, + { + "actor" : "actors/Hugo", + "movies" : 3 + }, + { + "actor" : "actors/Keanu", + "movies" : 4 + }, + { + "actor" : "actors/Laurence", + "movies" : 3 + }, + { + "actor" : "actors/MegR", + "movies" : 5 + }, + { + "actor" : "actors/TomC", + "movies" : 3 + }, + { + "actor" : "actors/TomH", + "movies" : 3 + } +] +``` + +### All movies where exactly 6 actors acted in + +The same idea as in the query before, but with equality filter, however now we +need the movie instead of the actor, so we return the `_to` attribute: + +```js +db._query(` + FOR x IN actsIn + COLLECT movie = x._to WITH COUNT INTO counter + FILTER counter == 6 + RETURN movie +`).toArray(); +``` + +```json +[ + "movies/SleeplessInSeattle", + "movies/TopGun", + "movies/YouveGotMail" +] +``` + +### The number of actors by movie + +We remember in our dataset `_to` on the edge corresponds to the movie, so we +count how often the same `_to` appears. This is the number of actors. The query +is almost identical to the ones before but without the `FILTER` after `COLLECT`: + +```js +db._query(` + FOR x IN actsIn + COLLECT movie = x._to WITH COUNT INTO counter + RETURN { movie: movie, actors: counter } +`).toArray(); +``` + +```json +[ + { + "movie" : "movies/AFewGoodMen", + "actors" : 11 + }, + { + "movie" : "movies/AsGoodAsItGets", + "actors" : 4 + }, + { + "movie" : "movies/JerryMaguire", + "actors" : 9 + }, + { + "movie" : "movies/JoeVersustheVolcano", + "actors" : 3 + }, + { + "movie" : "movies/SleeplessInSeattle", + "actors" : 6 + }, + { + "movie" : "movies/SnowFallingonCedars", + "actors" : 4 + }, + { + "movie" : "movies/StandByMe", + "actors" : 7 + }, + { + "movie" : "movies/TheDevilsAdvocate", + "actors" : 3 + }, + { + "movie" : "movies/TheMatrix", + "actors" : 5 + }, + { + "movie" : "movies/TheMatrixReloaded", + "actors" : 4 + }, + { + "movie" : "movies/TheMatrixRevolutions", + "actors" : 4 + }, + { + "movie" : "movies/TopGun", + "actors" : 6 + }, + { + "movie" : "movies/WhatDreamsMayCome", + "actors" : 5 + }, + { + "movie" : "movies/WhenHarryMetSally", + "actors" : 4 + }, + { + "movie" : "movies/YouveGotMail", + "actors" : 6 + } +] +``` + +### The number of movies by actor + +The `_to` attribute on the edge corresponds to the actor, so we group by it and +count with `COLLECT`. As a bonus, we can add sorting to return the actors with +the most movies first: + +```js +db._query(` + FOR x IN actsIn + COLLECT actor = x._from WITH COUNT INTO counter + SORT counter DESC + RETURN { actor: actor, movies: counter } +`).toArray(); +``` + +```json +[ + { + "actor" : "actors/MegR", + "movies" : 5 + }, + { + "actor" : "actors/Keanu", + "movies" : 4 + }, + { + "actor" : "actors/CubaG", + "movies" : 4 + }, + { + "actor" : "actors/Carrie", + "movies" : 3 + }, + { + "actor" : "actors/Laurence", + "movies" : 3 + }, + { + "actor" : "actors/Hugo", + "movies" : 3 + }, + { + "actor" : "actors/TomC", + "movies" : 3 + }, + { + "actor" : "actors/TomH", + "movies" : 3 + }, + { + "actor" : "actors/JerryO", + "movies" : 2 + }, + { + "actor" : "actors/GregK", + "movies" : 2 + }, + { + "actor" : "actors/MaxS", + "movies" : 2 + }, + { + "actor" : "actors/JackN", + "movies" : 2 + }, + { + "actor" : "actors/KieferS", + "movies" : 2 + }, + { + "actor" : "actors/JamesM", + "movies" : 1 + }, + { + "actor" : "actors/JayM", + "movies" : 1 + }, + { + "actor" : "actors/ReneeZ", + "movies" : 1 + }, + { + "actor" : "actors/JamesC", + "movies" : 1 + }, + { + "actor" : "actors/TomS", + "movies" : 1 + }, + { + "actor" : "actors/AnthonyE", + "movies" : 1 + }, + { + "actor" : "actors/ValK", + "movies" : 1 + }, + { + "actor" : "actors/KellyM", + "movies" : 1 + }, + { + "actor" : "actors/ChristopherG", + "movies" : 1 + }, + { + "actor" : "actors/Al", + "movies" : 1 + }, + { + "actor" : "actors/JTW", + "movies" : 1 + }, + { + "actor" : "actors/KevinP", + "movies" : 1 + }, + { + "actor" : "actors/Emil", + "movies" : 1 + }, + { + "actor" : "actors/NoahW", + "movies" : 1 + }, + { + "actor" : "actors/Charlize", + "movies" : 1 + }, + { + "actor" : "actors/KevinB", + "movies" : 1 + }, + { + "actor" : "actors/DemiM", + "movies" : 1 + }, + { + "actor" : "actors/WernerH", + "movies" : 1 + }, + { + "actor" : "actors/CarrieF", + "movies" : 1 + }, + { + "actor" : "actors/BillyC", + "movies" : 1 + }, + { + "actor" : "actors/Nathan", + "movies" : 1 + }, + { + "actor" : "actors/RosieO", + "movies" : 1 + }, + { + "actor" : "actors/VictorG", + "movies" : 1 + }, + { + "actor" : "actors/BillPull", + "movies" : 1 + }, + { + "actor" : "actors/RitaW", + "movies" : 1 + }, + { + "actor" : "actors/SteveZ", + "movies" : 1 + }, + { + "actor" : "actors/DaveC", + "movies" : 1 + }, + { + "actor" : "actors/ParkerP", + "movies" : 1 + }, + { + "actor" : "actors/RickY", + "movies" : 1 + }, + { + "actor" : "actors/EthanH", + "movies" : 1 + }, + { + "actor" : "actors/KellyP", + "movies" : 1 + }, + { + "actor" : "actors/AnnabellaS", + "movies" : 1 + }, + { + "actor" : "actors/Robin", + "movies" : 1 + }, + { + "actor" : "actors/HelenH", + "movies" : 1 + }, + { + "actor" : "actors/MarshallB", + "movies" : 1 + }, + { + "actor" : "actors/JohnC", + "movies" : 1 + }, + { + "actor" : "actors/CoreyF", + "movies" : 1 + }, + { + "actor" : "actors/RiverP", + "movies" : 1 + }, + { + "actor" : "actors/WilW", + "movies" : 1 + }, + { + "actor" : "actors/JonathanL", + "movies" : 1 + }, + { + "actor" : "actors/ReginaK", + "movies" : 1 + }, + { + "actor" : "actors/BonnieH", + "movies" : 1 + }, + { + "actor" : "actors/BrunoK", + "movies" : 1 + } +] +``` + +### The number of movies acted in between two years by actor + +This query is where a multi-model database actually shines. +First of all we want to use it in production, so we set a persistent index on year. +This allows as to execute fast range queries like between 1990 and 1995. + +```js +db.actsIn.ensureIndex({ type: "persistent", fields: ["year"] }); +``` + +Now we slightly modify our movies by actor query. + +```js +db._query(` + FOR x IN actsIn + FILTER x.year >= 1990 && x.year <= 1995 + COLLECT actor = x._from WITH COUNT INTO counter + RETURN { actor: actor, movies: counter } +`).toArray(); +``` + +```json +[ + { + "actor" : "actors/BillPull", + "movies" : 1 + }, + { + "actor" : "actors/ChristopherG", + "movies" : 1 + }, + { + "actor" : "actors/CubaG", + "movies" : 1 + }, + { + "actor" : "actors/DemiM", + "movies" : 1 + }, + { + "actor" : "actors/JackN", + "movies" : 1 + }, + { + "actor" : "actors/JamesM", + "movies" : 1 + }, + { + "actor" : "actors/JTW", + "movies" : 1 + }, + { + "actor" : "actors/KevinB", + "movies" : 1 + }, + { + "actor" : "actors/KevinP", + "movies" : 1 + }, + { + "actor" : "actors/KieferS", + "movies" : 1 + }, + { + "actor" : "actors/MegR", + "movies" : 2 + }, + { + "actor" : "actors/Nathan", + "movies" : 1 + }, + { + "actor" : "actors/NoahW", + "movies" : 1 + }, + { + "actor" : "actors/RitaW", + "movies" : 1 + }, + { + "actor" : "actors/RosieO", + "movies" : 1 + }, + { + "actor" : "actors/TomC", + "movies" : 1 + }, + { + "actor" : "actors/TomH", + "movies" : 2 + }, + { + "actor" : "actors/VictorG", + "movies" : 1 + } +] +``` + +### The years and number of movies by actor with actor name + +If we want to return a list of years and not just the amount of movies an actor +acted in, then we can't use `COLLECT WITH COUNT INTO` because we can only access +`actor` and `counter` after grouping. Instead, we can use `COLLECT … INTO` to +keep track of the movie years per actor. The amount of years equals the number +of movies. + +The example query is limited to two actors for simplicity. As an added extra, +it looks up the actor `name` using the `DOCUMENT()` function: + +```js +db._query(` + FOR x IN actsIn + FILTER x._from IN [ "actors/TomH", "actors/Keanu" ] + COLLECT actor = x._from INTO years = x.year + RETURN { + name: DOCUMENT(actor).name, + movies: COUNT(years), + years + }` +).toArray(); +``` + +```json +[ + { + "name" : "Keanu Reeves", + "movies" : 4, + "years" : [ + 1999, + 2003, + 2003, + 1997 + ] + }, + { + "name" : "Tom Hanks", + "movies" : 3, + "years" : [ + 1998, + 1993, + 1990 + ] + } +] +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/counting.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/counting.md new file mode 100644 index 0000000000..11079180c2 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/counting.md @@ -0,0 +1,28 @@ +--- +title: Counting in AQL +menuTitle: Counting +weight: 10 +description: >- + You can count the documents of a collection in different ways +--- +## Amount of documents in a collection + +To return the count of documents that currently exist in a collection, +you can call the [`LENGTH()` function](../functions/array.md#length): + +```aql +RETURN LENGTH(collection) +``` + +This type of call is optimized since 2.8 (no unnecessary intermediate result +is built up in memory) and it is therefore the preferred way to determine the count. +Internally, [`COLLECTION_COUNT()`](../functions/miscellaneous.md#collection_count) is called. + +In earlier versions with `COLLECT ... WITH COUNT INTO` available (since 2.4), +you may use the following code instead of `LENGTH()` for better performance: + +```aql +FOR doc IN collection + COLLECT WITH COUNT INTO length + RETURN length +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/create-test-data.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/create-test-data.md new file mode 100644 index 0000000000..90a27a2bd8 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/create-test-data.md @@ -0,0 +1,95 @@ +--- +title: Create Test Data with AQL +menuTitle: Create Test Data +weight: 5 +description: >- + How to fill a collection with dummy documents +--- +We assume that there is already a collection to the hold documents called +`myCollection` in below example queries. + +One of the easiest ways to fill a collection with test data is to use an AQL +query that iterates over a range. + +Run the following AQL query e.g. from the _AQL Editor_ in the web interface +to insert 1,000 documents into the collection: + +```aql +FOR i IN 1..1000 + INSERT { name: CONCAT("test", i) } IN myCollection +``` + +The number of documents to create can be modified easily be adjusting the range +boundary values. + +If you want to inspect the result immediately, add `RETURN NEW` at the end of +the query. + +To create more complex test data, adjust the AQL query. Let us say we also want +a `status` attribute, and fill it with integer values between `1` to `5` +(inclusive), with equal distribution. A good way to achieve this is to use +the modulo operator (`%`): + +```aql +FOR i IN 1..1000 + INSERT { + name: CONCAT("test", i), + status: 1 + (i % 5) + } IN myCollection +``` + +To create pseudo-random values, use the `RAND()` function. It creates +pseudo-random numbers between `0` and `1`. Use some factor to scale the random +numbers, and `FLOOR()` to convert the scaled number back to an integer. + +For example, the following query populates the `value` attribute with numbers +between 100 and 150 (inclusive): + +```aql +FOR i IN 1..1000 + INSERT { + name: CONCAT("test", i), + value: 100 + FLOOR(RAND() * (150 - 100 + 1)) + } IN myCollection +``` + +After the test data has been created, it is often helpful to verify it. The +`RAND()` function is also a good candidate for retrieving a random sample of +the documents in the collection. This query will retrieve 10 random documents: + +```aql +FOR doc IN myCollection + SORT RAND() + LIMIT 10 + RETURN doc +``` + +The `COLLECT` clause is an easy mechanism to run an aggregate analysis on some +attribute. Let us say we wanted to verify the data distribution inside the +`status` attribute. In this case we could run: + +```aql +FOR doc IN myCollection + COLLECT value = doc.value WITH COUNT INTO count + RETURN { + value: value, + count: count + } +``` + +The above query will provide the number of documents per distinct `value`. + +We can make the JSON result a bit more compact by using the value as attribute +key, the count as attribute value and merge everything into a single result +object. Note that attribute keys can only be strings, but for our purposes here +it is acceptable. + +```aql +RETURN MERGE( + FOR doc IN myCollection + COLLECT value = doc.value WITH COUNT INTO count + RETURN { + [value]: count + } +) +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/diffing-two-documents.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/diffing-two-documents.md new file mode 100644 index 0000000000..14dbc7d3d8 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/diffing-two-documents.md @@ -0,0 +1,128 @@ +--- +title: Diffing Two Documents in AQL +menuTitle: Diffing Two Documents +weight: 55 +description: >- + How to determine the differences in attributes of two documents +--- +There is no built-in AQL function to compare the attributes of two documents, +but it is easily possible to build a query that does: + +```aql +// input document 1 +LET doc1 = { + "foo": "bar", + "a": 1, + "b": 2 +} + +// input document 2 +LET doc2 = { + "foo": "baz", + "a": 2, + "c": 3 +} + +// collect attributes present in doc1, but missing in doc2 +LET missing = ( + FOR key IN ATTRIBUTES(doc1) + FILTER ! HAS(doc2, key) + RETURN { + [ key ]: doc1[key] + } +) + +// collect attributes present in both docs, but that have different values +LET changed = ( + FOR key IN ATTRIBUTES(doc1) + FILTER HAS(doc2, key) && doc1[key] != doc2[key] + RETURN { + [ key ] : { + old: doc1[key], + new: doc2[key] + } + } +) + +// collect attributes present in doc2, but missing in doc1 +LET added = ( + FOR key IN ATTRIBUTES(doc2) + FILTER ! HAS(doc1, key) + RETURN { + [ key ]: doc2[key] + } +) + +// return final result +RETURN { + "missing": missing, + "changed": changed, + "added": added +} +``` + +The query may look a bit lengthy, but much of that is due to formatting. +A more terse version can be found below. + +The above query will return a document with three attributes: + +- `missing`: + Contains all attributes only present in first document + (i.e. missing in second document) + +- `changed`: + Contains all attributes present in both documents that have different values + +- `added`: + Contains all attributes only present in second document + (i.e. missing in first document) + +For the two example documents it will return: + +```json +[ + { + "missing" : [ + { + "b" : 2 + } + ], + "changed" : [ + { + "foo" : { + "old" : "bar", + "new" : "baz" + } + }, + { + "a" : { + "old" : 1, + "new" : 2 + } + } + ], + "added" : [ + { + "c" : 3 + } + ] + } +] +``` + +You may adjust the query to produce a different output format. + +Following is a version of the same query that can be invoked from JavaScript +easily. It passes the two documents as bind parameters and calls `db._query`. +The query is now an one-liner (less readable but easier to copy & paste): + +```js +bindVariables = { + doc1 : { "foo" : "bar", "a" : 1, "b" : 2 }, + doc2 : { "foo" : "baz", "a" : 2, "c" : 3 } +}; + +query = "LET doc1 = @doc1, doc2 = @doc2, missing = (FOR key IN ATTRIBUTES(doc1) FILTER ! HAS(doc2, key) RETURN { [ key ]: doc1[key] }), changed = (FOR key IN ATTRIBUTES(doc1) FILTER HAS(doc2, key) && doc1[key] != doc2[key] RETURN { [ key ] : { old: doc1[key], new: doc2[key] } }), added = (FOR key IN ATTRIBUTES(doc2) FILTER ! HAS(doc1, key) RETURN { [ key ] : doc2[key] }) RETURN { missing : missing, changed : changed, added : added }"; + +result = db._query(query, bindVariables).toArray(); +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/dynamic-attribute-names.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/dynamic-attribute-names.md new file mode 100644 index 0000000000..59efe9f163 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/dynamic-attribute-names.md @@ -0,0 +1,202 @@ +--- +title: Dynamic Attribute Names in AQL +menuTitle: Dynamic Attribute Names +weight: 15 +description: >- + You can use expressions as attribute names or use subqueries and `ZIP()` to + create objects with varying attribute names +--- +You might want an AQL query to return results with attribute names assembled +by a function, or with a variable number of attributes. + +This will not work by specifying the result using a regular object literal, +as object literals require the names and numbers of attributes to be fixed at +query compile time. + +There are two solutions to getting dynamic attribute names to work: +- Using expressions as attribute names (fixed amount of attributes) +- Using subqueries and the `ZIP()` function (variable amount of attributes) + +## Using expressions as attribute names + +This solution works in cases where the number of dynamic attributes to return +is known in advance, and only the attribute names need to be calculated using +an expression. + +Using expressions as attribute names instead of fixed attribute names in object +literals requires enclosing the expression in extra `[` and `]` to disambiguate +them from regular, unquoted attribute names. + +Let us create a result that returns the original document data contained in +a dynamically named attribute. We will be using the expression `doc.type` +for the attribute name. We will also return some other attributes from the +original documents, but prefix them with the documents' `_key` attribute values. +For this we also need attribute name expressions. + +Here is a query showing how to do this. The attribute name expressions all +required to be enclosed in `[` and `]` in order to make this work: + +```aql +LET documents = [ + { "_key" : "3231748397810", "gender" : "f", "status" : "active", "type" : "user" }, + { "_key" : "3231754427122", "gender" : "m", "status" : "inactive", "type" : "unknown" } +] + +FOR doc IN documents + RETURN { + [ doc.type ] : { + [ CONCAT(doc._key, "_gender") ] : doc.gender, + [ CONCAT(doc._key, "_status") ] : doc.status + } + } +``` + +This will return: + +```json +[ + { + "user": { + "3231748397810_gender": "f", + "3231748397810_status": "active" + } + }, + { + "unknown": { + "3231754427122_gender": "m", + "3231754427122_status": "inactive" + } + } +] +``` + +Note: +Attribute name expressions and regular, unquoted attribute names can be mixed. + +## Subquery solution + +A generalized solution is to let a subquery or another function produce the +dynamic attribute names, and finally pass them through the `ZIP()` function to +create an object from them. + +Let us assume we want to process the following input documents: + +```json +{ "name": "test", "gender": "f", "status": "active", "type": "user" } +{ "name": "dummy", "gender": "m", "status": "inactive", "type": "unknown", "magicFlag": 23 } +``` + +Let us also assume our goal for each of these documents is to return only the +attribute names that contain the letter `a`, together with their respective +values. + +To extract the attribute names and values from the original documents, we can +use a subquery as follows: + +```aql +LET documents = [ + { "name": "test"," gender": "f", "status": "active", "type": "user" }, + { "name": "dummy", "gender": "m", "status": "inactive", "type": "unknown", "magicFlag": 23 } +] + +FOR doc IN documents + RETURN ( + FOR name IN ATTRIBUTES(doc) + FILTER LIKE(name, '%a%') + RETURN { + name: name, + value: doc[name] + } + ) +``` + +The subquery will only let attribute names pass that contain the letter `a`. +The results of the subquery are then made available to the main query and will +be returned. But the attribute names in the result are still `name` and `value`, +so we're not there yet. + +So let us also employ AQL's [`ZIP()`](../functions/document-object.md#zip) function, +which can create an object from two arrays: + +- the first parameter to `ZIP()` is an array with the attribute names +- the second parameter to `ZIP()` is an array with the attribute values + +Instead of directly returning the subquery result, we first capture it in a +variable, and pass the variable's `name` and `value` components into `ZIP()` +like this: + +```aql +LET documents = [ + { "name" : "test"," gender" : "f", "status" : "active", "type" : "user" }, + { "name" : "dummy", "gender" : "m", "status" : "inactive", "type" : "unknown", "magicFlag" : 23 } +] + +FOR doc IN documents + LET attributes = ( + FOR name IN ATTRIBUTES(doc) + FILTER LIKE(name, '%a%') + RETURN { + name: name, + value: doc[name] + } + ) + RETURN ZIP(attributes[*].name, attributes[*].value) +``` + +Note that we have to use the expansion operator (`[*]`) on `attributes` because +`attributes` itself is an array, and we want either the `name` attribute or the +`value` attribute of each of its members. + +To prove this is working, here is the above query's result: + +```json +[ + { + "name": "test", + "status": "active" + }, + { + "name": "dummy", + "status": "inactive", + "magicFlag": 23 + } +] +``` + +As can be seen, the two results have a different amount of result attributes. +We can also make the result a bit more dynamic by prefixing each attribute +with the value of the `name` attribute: + +```aql +LET documents = [ + { "name": "test"," gender": "f", "status": "active", "type": "user" }, + { "name": "dummy", "gender": "m", "status": "inactive", "type": "unknown", "magicFlag": 23 } +] + +FOR doc IN documents + LET attributes = ( + FOR name IN ATTRIBUTES(doc) + FILTER LIKE(name, '%a%') + RETURN { + name: CONCAT(doc.name, '-', name), + value: doc[name] + } + ) + RETURN ZIP(attributes[*].name, attributes[*].value) +``` + +That will give us document-specific attribute names like this: + +```json +[ + { + "test-name": "test", + "test-status": "active" + }, + { + "dummy-name": "dummy", + "dummy-status": "inactive", + "dummy-magicFlag": 23 + } +] +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/grouping.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/grouping.md new file mode 100644 index 0000000000..cb54fefcf2 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/grouping.md @@ -0,0 +1,359 @@ +--- +title: Grouping and aggregating data in AQL +menuTitle: Grouping +weight: 30 +description: >- + You can group data by arbitrary criteria with AQL's `COLLECT` operation, + with optional aggregation during grouping or using post-aggregation +--- +To group results by arbitrary criteria, AQL provides the `COLLECT` keyword. +`COLLECT` will perform a grouping, but no aggregation. Aggregation can still be +added in the query if required. + +## Ensuring uniqueness + +`COLLECT` can be used to make a result set unique. The following query will return each distinct +`age` attribute value only once: + +```aql +FOR u IN users + COLLECT age = u.age + RETURN age +``` + +This is grouping without tracking the group values, but just the group criterion (*age*) value. + +Grouping can also be done on multiple levels using `COLLECT`: + +```aql +FOR u IN users + COLLECT status = u.status, age = u.age + RETURN { status, age } +``` + +Alternatively `RETURN DISTINCT` can be used to make a result set unique. +`RETURN DISTINCT` supports a single criterion only: + +```aql +FOR u IN users + RETURN DISTINCT u.age +``` + +`RETURN DISTINCT` does not change the order of results. For above query that +means the order is undefined because no particular order is guaranteed when +iterating over a collection without explicit `SORT` operation. + +## Fetching group values + +To group users by age, and return the names of the users with the highest ages, +we'll issue a query like this: + +```aql +FOR u IN users + FILTER u.active == true + COLLECT age = u.age INTO usersByAge + SORT age DESC LIMIT 0, 5 + RETURN { + age, + users: usersByAge[*].u.name + } +``` + +```json +[ + { "age": 37, "users": [ "John", "Sophia" ] }, + { "age": 36, "users": [ "Fred", "Emma" ] }, + { "age": 34, "users": [ "Madison" ] }, + { "age": 33, "users": [ "Chloe", "Michael" ] }, + { "age": 32, "users": [ "Alexander" ] } +] +``` + +The query will put all users together by their *age* attribute. There will be one +result document per distinct *age* value (let aside the `LIMIT`). For each group, +we have access to the matching document via the *usersByAge* variable introduced in +the `COLLECT` statement. + +## Variable Expansion + +The *usersByAge* variable contains the full documents found, and as we're only +interested in user names, we'll use the expansion operator `[*]` to extract just the +*name* attribute of all user documents in each group: + +```aql +usersByAge[*].u.name +``` + +The `[*]` expansion operator is just a handy short-cut. We could also write +a subquery: + +```aql +( FOR temp IN usersByAge RETURN temp.u.name ) +``` + +## Grouping by multiple criteria + +To group by multiple criteria, we'll use multiple arguments in the `COLLECT` clause. +For example, to group users by *ageGroup* (a derived value we need to calculate first) +and then by *gender*, we'll do: + +```aql +FOR u IN users + FILTER u.active == true + COLLECT ageGroup = FLOOR(u.age / 5) * 5, + gender = u.gender INTO group + SORT ageGroup DESC + RETURN { + ageGroup, + gender + } +``` + +```json +[ + { "ageGroup": 35, "gender": "f" }, + { "ageGroup": 35, "gender": "m" }, + { "ageGroup": 30, "gender": "f" }, + { "ageGroup": 30, "gender": "m" }, + { "ageGroup": 25, "gender": "f" }, + { "ageGroup": 25, "gender": "m" } +] +``` + +## Counting group values + +If the goal is to count the number of values in each group, AQL provides the special +*COLLECT WITH COUNT INTO* syntax. This is a simple variant for grouping with an additional +group length calculation: + +```aql +FOR u IN users + FILTER u.active == true + COLLECT ageGroup = FLOOR(u.age / 5) * 5, + gender = u.gender WITH COUNT INTO numUsers + SORT ageGroup DESC + RETURN { + ageGroup, + gender, + numUsers + } +``` + +```json +[ + { "ageGroup": 35, "gender": "f", "numUsers": 2 }, + { "ageGroup": 35, "gender": "m", "numUsers": 2 }, + { "ageGroup": 30, "gender": "f", "numUsers": 4 }, + { "ageGroup": 30, "gender": "m", "numUsers": 4 }, + { "ageGroup": 25, "gender": "f", "numUsers": 2 }, + { "ageGroup": 25, "gender": "m", "numUsers": 2 } +] +``` + +## Aggregation + +Adding further aggregation is also simple in AQL by using an `AGGREGATE` clause +in the `COLLECT`: + +```aql +FOR u IN users + FILTER u.active == true + COLLECT ageGroup = FLOOR(u.age / 5) * 5, + gender = u.gender + AGGREGATE numUsers = LENGTH(1), + minAge = MIN(u.age), + maxAge = MAX(u.age) + SORT ageGroup DESC + RETURN { + ageGroup, + gender, + numUsers, + minAge, + maxAge + } +``` + +```json +[ + { + "ageGroup": 35, + "gender": "f", + "numUsers": 2, + "minAge": 36, + "maxAge": 39, + }, + { + "ageGroup": 35, + "gender": "m", + "numUsers": 2, + "minAge": 35, + "maxAge": 39, + }, + ... +] +``` + +We have used the aggregate functions *LENGTH* here (it returns the length of an array). +This is the equivalent to SQL's `SELECT g, COUNT(*) FROM ... GROUP BY g`. In addition to +`LENGTH`, AQL also provides `MAX`, `MIN`, `SUM` and `AVERAGE`, `VARIANCE_POPULATION`, +`VARIANCE_SAMPLE`, `STDDEV_POPULATION`, `STDDEV_SAMPLE`, `UNIQUE`, `SORTED_UNIQUE` and +`COUNT_UNIQUE` as basic aggregation functions. + +In AQL all aggregation functions can be run on arrays only. If an aggregation function +is run on anything that is not an array, a warning will be produced and the result will +be `null`. + +Using an `AGGREGATE` clause will ensure the aggregation is run while the groups are built +in the collect operation. This is normally more efficient than collecting all group values +for all groups and then doing a post-aggregation. + +## Post-aggregation + +Aggregation can also be performed after a `COLLECT` operation using other AQL constructs, +though performance-wise this is often inferior to using `COLLECT` with `AGGREGATE`. + +The same query as before can be turned into a post-aggregation query as shown below. Note +that this query will build and pass on all group values for all groups inside the variable +*g*, and perform the aggregation at the latest possible stage: + +```aql +FOR u IN users + FILTER u.active == true + COLLECT ageGroup = FLOOR(u.age / 5) * 5, + gender = u.gender INTO g + SORT ageGroup DESC + RETURN { + ageGroup, + gender, + numUsers: LENGTH(g[*]), + minAge: MIN(g[*].u.age), + maxAge: MAX(g[*].u.age) + } +``` + +```json +[ + { + "ageGroup": 35, + "gender": "f", + "numUsers": 2, + "minAge": 36, + "maxAge": 39, + }, + { + "ageGroup": 35, + "gender": "m", + "numUsers": 2, + "minAge": 35, + "maxAge": 39, + }, + ... +] +``` + +This is in contrast to the previous query that used an `AGGREGATE` clause to perform +the aggregation during the collect operation, at the earliest possible stage. + +## Post-filtering aggregated data + +To filter the results of a grouping or aggregation operation (i.e. something +similar to *HAVING* in SQL), simply add another `FILTER` clause after the `COLLECT` +statement. + +For example, to get the 3 *ageGroup*s with the most users in them: + +```aql +FOR u IN users + FILTER u.active == true + COLLECT ageGroup = FLOOR(u.age / 5) * 5 INTO group + LET numUsers = LENGTH(group) + FILTER numUsers > 2 /* group must contain at least 3 users in order to qualify */ + SORT numUsers DESC + LIMIT 0, 3 + RETURN { + "ageGroup": ageGroup, + "numUsers": numUsers, + "users": group[*].u.name + } +``` + +```json +[ + { + "ageGroup": 30, + "numUsers": 8, + "users": [ + "Abigail", + "Madison", + "Anthony", + "Alexander", + "Isabella", + "Chloe", + "Daniel", + "Michael" + ] + }, + { + "ageGroup": 25, + "numUsers": 4, + "users": [ + "Mary", + "Mariah", + "Jim", + "Diego" + ] + }, + { + "ageGroup": 35, + "numUsers": 4, + "users": [ + "Fred", + "John", + "Emma", + "Sophia" + ] + } +] +``` + +To increase readability, the repeated expression *LENGTH(group)* was put into a variable +*numUsers*. The `FILTER` on *numUsers* is the equivalent an SQL *HAVING* clause. + +## Aggregating data in local time + +If you store datetimes in UTC in your collections and need to group data for +each day in your local timezone, you can use `DATE_UTCTOLOCAL()` and +`DATE_TRUNC()` to adjust for that. + +Note: In the timezone `Europe/Berlin` daylight saving activated on 2020-03-29, +thus 2020-01-31T**23**:00:00Z is 2020-02-01 midnight in Germany and +2020-03-31T**22**:00:00Z is 2020-04-01 midnight in Germany. + +```aql +--- +name: aqlDateGroupingLocalTime_1 +description: '' +bindVars: + { + "activities": [ + {"startDate": "2020-01-31T23:00:00Z", "endDate": "2020-02-01T03:00:00Z", "duration": 4, "rate": 250}, + {"startDate": "2020-02-01T09:00:00Z", "endDate": "2020-02-01T17:00:00Z", "duration": 8, "rate": 250}, + {"startDate": "2020-03-31T21:00:00Z", "endDate": "2020-03-31T22:00:00Z", "duration": 1, "rate": 250}, + {"startDate": "2020-03-31T22:00:00Z", "endDate": "2020-04-01T03:00:00Z", "duration": 5, "rate": 250}, + {"startDate": "2020-04-01T13:00:00Z", "endDate": "2020-04-01T16:00:00Z", "duration": 3, "rate": 250} + ] + } +--- +FOR a IN @activities +COLLECT + day = DATE_TRUNC(DATE_UTCTOLOCAL(a.startDate, 'Europe/Berlin'), 'day') +AGGREGATE + hours = SUM(a.duration), + revenue = SUM(a.duration * a.rate) +SORT day ASC +RETURN { + day, + hours, + revenue +} +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/joins.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/joins.md new file mode 100644 index 0000000000..ae2ec7b2b5 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/joins.md @@ -0,0 +1,892 @@ +--- +title: Using Joins in AQL +menuTitle: Joins +weight: 25 +description: >- + Query examples for joining documents with one-to-many and many-to-many relationships +--- +The two common scenarios when you want to join documents of collections are: + +- **One-to-Many**: + You may have a `users` collection and a `cities` collection. A user lives in + a city and you need the city information during a query about the user. + +- **Many-To-Many**: + You may have a `authors` collection and a `books` collection. An author can write many + books and a book can have many authors. You want to return a list of books + with their authors. Therefore you need to join the authors and books. + +Unlike many NoSQL databases, ArangoDB does support joins in AQL queries. This +is similar to the way traditional relational databases handle this. However, +because documents allow for more flexibility, joins are also more flexible. +The following sections provide solutions for common questions. + +So far, we have only dealt with one collection (`users`) at a time. We also have a +collection `relations` that stores relationships between users. We now use +this extra collection to create a result from two collections. + +First of all, we query a few users together with their friends' IDs. For that, +we use all `relations` that have a value of `friend` in their `type` attribute. +Relationships are established by using the `friendOf` and `thisUser` attributes in the +`relations` collection, which point to the `userId` values in the `users` collection. + +## One-To-Many + +You have a collection called `users`. Users live in city and a city is identified +by its primary key. In principle you can embedded the city document into the +users document and be happy with it. + +```json +{ + "_id" : "users/2151975421", + "_key" : "2151975421", + "_rev" : "2151975421", + "name" : { + "first" : "John", + "last" : "Doe" + }, + "city" : { + "name" : "Metropolis" + } +} +``` + +This works well for many use cases. Now assume that you have additional +information about the city, like the number of people living in it. It would be +impractical to change each and every user document if this numbers changes. +Therefore it is good idea to hold the city information in a separate collection. + +```js +arangosh> db.cities.document("cities/2241300989"); +``` + +```json +{ + "population" : 1000, + "name" : "Metropolis", + "_id" : "cities/2241300989", + "_rev" : "2241300989", + "_key" : "2241300989" +} +``` + +Instead of embedding the city directly in the user document, you can use +the key of the city. + +```js +arangosh> db.users.document("users/2290649597"); +``` + +```json +{ + "name" : { + "first" : "John", + "last" : "Doe" + }, + "city" : "cities/2241300989", + "_id" : "users/2290649597", + "_rev" : "2290649597", + "_key" : "2290649597" +} +``` + +We can now join these two collections very easily. + +```js +arangosh> db._query( +........>"FOR u IN users " + +........>" FOR c IN cities " + +........>" FILTER u.city == c._id RETURN { user: u, city: c }" +........>).toArray() +``` + +```json +[ + { + "user" : { + "name" : { + "first" : "John", + "last" : "Doe" + }, + "city" : "cities/2241300989", + "_id" : "users/2290649597", + "_rev" : "2290649597", + "_key" : "2290649597" + }, + "city" : { + "population" : 1000, + "name" : "Metropolis", + "_id" : "cities/2241300989", + "_rev" : "2241300989", + "_key" : "2241300989" + } + } +] +``` + +Unlike in SQL, there is no special `JOIN` keyword. The optimizer ensures that the +primary index is used in the above query. + +However, very often it is much more convenient for the client of the query if a +single document would be returned, where the city information is embedded in the +user document - as in the simple example above. With AQL, you do not need +to forgo this simplification. + +```js +arangosh> db._query( +........>"FOR u IN users " + +........>" FOR c IN cities " + +........>" FILTER u.city == c._id RETURN merge(u, {city: c})" +........>).toArray() +``` + +```json +[ + { + "_id" : "users/2290649597", + "_key" : "2290649597", + "_rev" : "2290649597", + "name" : { + "first" : "John", + "last" : "Doe" + }, + "city" : { + "_id" : "cities/2241300989", + "_key" : "2241300989", + "_rev" : "2241300989", + "population" : 1000, + "name" : "Metropolis" + } + } +] +``` + +You can have both: the convenient representation of the result for your +client and the flexibility of joins for your data model. + +## Many-To-Many + +In the relational world, you need a third table to model the many-to-many +relation. In ArangoDB, you have a choice depending on the information you are +going to store and the type of questions you are going to ask. + +Assume that authors are stored in one collection and books in a second. If all +you need is "who are the authors of a book", then you can easily model this as +a list attribute in users. + +If you want to store more information, for example, which author wrote which +page in a conference proceeding, or if you also want to know "which books were +written by which author", you can use edge collections. This is very similar to +the "join table" from the relational world. + +### Embedded Lists + +If you only want to store the authors of a book, you can embed them as list in +the book document. There is no need for a separate collection. + +```js +arangosh> db.authors.toArray() +``` + +```json +[ + { + "_id" : "authors/2661190141", + "_key" : "2661190141", + "_rev" : "2661190141", + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + } + }, + { + "_id" : "authors/2658437629", + "_key" : "2658437629", + "_rev" : "2658437629", + "name" : { + "first" : "John", + "last" : "Doe" + } + } +] +``` + +You can query books: + +```js +arangosh> db._query("FOR b IN books RETURN b").toArray(); +``` + +```json +[ + { + "_id" : "books/2681506301", + "_key" : "2681506301", + "_rev" : "2681506301", + "title" : "The beauty of JOINS", + "authors" : [ + "authors/2661190141", + "authors/2658437629" + ] + } +] +``` + +And you can join the authors in a very similar manner given in the one-to-many section: + +```js +arangosh> db._query( +........>"FOR b IN books " + +........>" LET a = (FOR x IN b.authors " + +........>" FOR a IN authors FILTER x == a._id RETURN a) " + +........>" RETURN { book: b, authors: a }" +........>).toArray(); +``` + +```json +[ + { + "book" : { + "title" : "The beauty of JOINS", + "authors" : [ + "authors/2661190141", + "authors/2658437629" + ], + "_id" : "books/2681506301", + "_rev" : "2681506301", + "_key" : "2681506301" + }, + "authors" : [ + { + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + }, + "_id" : "authors/2661190141", + "_rev" : "2661190141", + "_key" : "2661190141" + }, + { + "name" : { + "first" : "John", + "last" : "Doe" + }, + "_id" : "authors/2658437629", + "_rev" : "2658437629", + "_key" : "2658437629" + } + ] + } +] +``` + +Or you can embed the authors directly: + +```js +arangosh> db._query( +........>"FOR b IN books LET a = (" + +........>" FOR x IN b.authors " + +........>" FOR a IN authors FILTER x == a._id RETURN a)" + +........>" RETURN merge(b, { authors: a })" +........>).toArray(); +``` + +```json +[ + { + "_id" : "books/2681506301", + "_key" : "2681506301", + "_rev" : "2681506301", + "title" : "The beauty of JOINS", + "authors" : [ + { + "_id" : "authors/2661190141", + "_key" : "2661190141", + "_rev" : "2661190141", + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + } + }, + { + "_id" : "authors/2658437629", + "_key" : "2658437629", + "_rev" : "2658437629", + "name" : { + "first" : "John", + "last" : "Doe" + } + } + ] + } +] +``` + +### Using Edge Collections + +If you also want to query which books are written by a given author, embedding authors +in the book document is possible, but it is more efficient to use a edge collections for +speed. + +Or you are publishing a proceeding, then you want to store the pages the author has written +as well. This information can be stored in the edge document. + +First off, create the users: + +```js +arangosh> db._create("authors"); +``` + +``` +[ArangoCollection 2926807549, "authors" (type document, status loaded)] +``` + +```js +arangosh> db.authors.save({ name: { first: "John", last: "Doe" } }) +``` + +```json +{ + "error" : false, + "_id" : "authors/2935261693", + "_rev" : "2935261693", + "_key" : "2935261693" +} +``` + +```js +arangosh> db.authors.save({ name: { first: "Maxima", last: "Musterfrau" } }) +``` + +```json +{ + "error" : false, + "_id" : "authors/2938210813", + "_rev" : "2938210813", + "_key" : "2938210813" +} +``` + +Now, create the books without any author information: + +```js +arangosh> db._create("books"); +``` + +``` +[ArangoCollection 2928380413, "books" (type document, status loaded)] +``` + +```js +arangosh> db.books.save({ title: "The beauty of JOINS" }); +``` + +```json +{ + "error" : false, + "_id" : "books/2980088317", + "_rev" : "2980088317", + "_key" : "2980088317" +} +``` + +An edge collection is now used to link authors and books: + +```js +arangosh> db._createEdgeCollection("written"); +``` + +``` +[ArangoCollection 2931132925, "written" (type edge, status loaded)] +``` + +```js +arangosh> db.written.save("authors/2935261693", +........>"books/2980088317", +........>{ pages: "1-10" }) +``` + +```json +{ + "error" : false, + "_id" : "written/3006237181", + "_rev" : "3006237181", + "_key" : "3006237181" +} +``` + +```js +arangosh> db.written.save("authors/2938210813", +........>"books/2980088317", +........>{ pages: "11-20" }) +``` + +```json +{ + "error" : false, + "_id" : "written/3012856317", + "_rev" : "3012856317", + "_key" : "3012856317" +} +``` + +In order to get all books with their authors, you can use a +[graph traversal](../graphs/traversals.md#working-with-collection-sets): + +```js +arangosh> db._query( +...> "FOR b IN books " + +...> "LET authorsByBook = ( " + +...> " FOR author, writtenBy IN INBOUND b written " + +...> " RETURN { " + +...> " vertex: author, " + +...> " edge: writtenBy " + +...> " } " + +...> ") " + +...> "RETURN { " + +...> " book: b, " + +...> " authors: authorsByBook " + +...> "} " +...> ).toArray(); +``` + +```json +[ + { + "book" : { + "_key" : "2980088317", + "_id" : "books/2980088317", + "_rev" : "2980088317", + "title" : "The beauty of JOINS" + }, + "authors" : [ + { + "vertex" : { + "_key" : "2935261693", + "_id" : "authors/2935261693", + "_rev" : "2935261693", + "name" : { + "first" : "John", + "last" : "Doe" + } + }, + "edge" : { + "_key" : "2935261693", + "_id" : "written/2935261693", + "_from" : "authors/2935261693", + "_to" : "books/2980088317", + "_rev" : "3006237181", + "pages" : "1-10" + } + }, + { + "vertex" : { + "_key" : "2938210813", + "_id" : "authors/2938210813", + "_rev" : "2938210813", + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + } + }, + "edge" : { + "_key" : "6833274", + "_id" : "written/6833274", + "_from" : "authors/2938210813", + "_to" : "books/2980088317", + "_rev" : "3012856317", + "pages" : "11-20" + } + } + ] + } +] +``` + +Or if you want only the information stored in the vertices, you can use this query: + +```js +arangosh> db._query( +...> "FOR b IN books " + +...> "LET authorsByBook = ( " + +...> " FOR author IN INBOUND b written " + +...> " OPTIONS { " + +...> " order: 'bfs', " + +...> " uniqueVertices: 'global' " + +...> " } " + +...> " RETURN author " + +...> ") " + +...> "RETURN { " + +...> " book: b, " + +...> " authors: authorsByBook " + +...> "} " +...> ).toArray(); +``` + +```json +[ + { + "book" : { + "_key" : "2980088317", + "_id" : "books/2980088317", + "_rev" : "2980088317", + "title" : "The beauty of JOINS" + }, + "authors" : [ + { + "_key" : "2938210813", + "_id" : "authors/2938210813", + "_rev" : "2938210813", + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + } + }, + { + "_key" : "2935261693", + "_id" : "authors/2935261693", + "_rev" : "2935261693", + "name" : { + "first" : "John", + "last" : "Doe" + } + } + ] + } +] +``` + +Or again embed the authors directly into the book document: + +```js +arangosh> db._query( +...> "FOR b IN books " + +...> "LET authors = ( " + +...> " FOR author IN INBOUND b written " + +...> " OPTIONS { " + +...> " order: 'bfs', " + +...> " uniqueVertices: 'global' " + +...> " } " + +...> " RETURN author " + +...> ") " + +...> "RETURN MERGE(b, {authors: authors}) " +...> ).toArray(); +``` + +```json +[ + { + "_id" : "books/2980088317", + "_key" : "2980088317", + "_rev" : "2980088317", + "title" : "The beauty of JOINS", + "authors" : [ + { + "_key" : "2938210813", + "_id" : "authors/2938210813", + "_rev" : "2938210813", + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + } + }, + { + "_key" : "2935261693", + "_id" : "authors/2935261693", + "_rev" : "2935261693", + "name" : { + "first" : "John", + "last" : "Doe" + } + } + ] + } +] +``` + +If you need the authors and their books, simply reverse the direction: + +```js +> db._query( +...> "FOR a IN authors " + +...> "LET booksByAuthor = ( " + +...> " FOR b IN OUTBOUND a written " + +...> " OPTIONS { " + +...> " order: 'bfs', " + +...> " uniqueVertices: 'global' " + +...> " } " + +...> " RETURN b" + +...> ") " + +...> "RETURN MERGE(a, {books: booksByAuthor}) " +...> ).toArray(); +``` + +```json +[ + { + "_id" : "authors/2935261693", + "_key" : "2935261693", + "_rev" : "2935261693", + "name" : { + "first" : "John", + "last" : "Doe" + }, + "books" : [ + { + "_key" : "2980088317", + "_id" : "books/2980088317", + "_rev" : "2980088317", + "title" : "The beauty of JOINS" + } + ] + }, + { + "_id" : "authors/2938210813", + "_key" : "2938210813", + "_rev" : "2938210813", + "name" : { + "first" : "Maxima", + "last" : "Musterfrau" + }, + "books" : [ + { + "_key" : "2980088317", + "_id" : "books/2980088317", + "_rev" : "2980088317", + "title" : "The beauty of JOINS" + } + ] + } +] +``` + +## More examples + +### Join tuples + +We will start with a SQL-ish result set and return each tuple (user name, friends userId) +separately. The AQL query to generate such result is: + +```aql +--- +name: joinTuples +description: '' +dataset: joinSampleDataset +bindVars: + { + "friend": "friend" + } +--- +FOR u IN users + FILTER u.active == true + LIMIT 0, 4 + FOR f IN relations + FILTER f.type == @friend && f.friendOf == u.userId + RETURN { + "user" : u.name, + "friendId" : f.thisUser + } +``` + +We iterate over the collection users. Only the 'active' users will be examined. +For each of these users we will search for up to 4 friends. We locate friends +by comparing the `userId` of our current user with the `friendOf` attribute of the +`relations` document. For each of those relations found we return the users name +and the userId of the friend. + +### Horizontal lists + +Note that in the above result, a user can be returned multiple times. This is the +SQL way of returning data. If this is not desired, the friends' ids of each user +can be returned in a horizontal list. This will return each user at most once. + +The AQL query for doing so is: + +```aql +FOR u IN users + FILTER u.active == true LIMIT 0, 4 + RETURN { + "user" : u.name, + "friendIds" : ( + FOR f IN relations + FILTER f.friendOf == u.userId && f.type == "friend" + RETURN f.thisUser + ) + } +``` + +```json +[ + { + "user" : "Abigail", + "friendIds" : [ + 108, + 102, + 106 + ] + }, + { + "user" : "Fred", + "friendIds" : [ + 209 + ] + }, + { + "user" : "Mary", + "friendIds" : [ + 207, + 104 + ] + }, + { + "user" : "Mariah", + "friendIds" : [ + 203, + 205 + ] + } +] +``` + +In this query we are still iterating over the users in the `users` collection +and for each matching user we are executing a subquery to create the matching +list of related users. + +### Self joins + +To not only return friend ids but also the names of friends, we could "join" the +`users` collection once more (something like a "self join"): + +```aql +FOR u IN users + FILTER u.active == true + LIMIT 0, 4 + RETURN { + "user" : u.name, + "friendIds" : ( + FOR f IN relations + FILTER f.friendOf == u.userId && f.type == "friend" + FOR u2 IN users + FILTER f.thisUser == u2.useId + RETURN u2.name + ) + } +``` + +```json +[ + { + "user" : "Abigail", + "friendIds" : [ + "Jim", + "Jacob", + "Daniel" + ] + }, + { + "user" : "Fred", + "friendIds" : [ + "Mariah" + ] + }, + { + "user" : "Mary", + "friendIds" : [ + "Isabella", + "Michael" + ] + }, + { + "user" : "Mariah", + "friendIds" : [ + "Madison", + "Eva" + ] + } +] +``` + +This query will then again in term fetch the clear text name of the +friend from the users collection. So here we iterate the users collection, +and for each hit the relations collection, and for each hit once more the +users collection. + +### Outer joins + +Lets find the lonely people in our database - those without friends. + +```aql +FOR user IN users + LET friendList = ( + FOR f IN relations + FILTER f.friendOf == u.userId + RETURN 1 + ) + FILTER LENGTH(friendList) == 0 + RETURN { "user" : user.name } +``` + +```json +[ + { + "user" : "Abigail" + }, + { + "user" : "Fred" + } +] +``` + +So, for each user we pick the list of their friends and count them. The ones where +count equals zero are the lonely people. Using `RETURN 1` in the subquery +saves even more precious CPU cycles and gives the optimizer more alternatives. + +### Index usage + +For joins in particular, you should make sure indexes can be utilized to +[speed up your queries](../execution-and-performance/explaining-queries.md). + +Note that sparse indexes don't qualify for joins. Often, You also want to join +documents not containing the property you join with. However, sparse indexes +don't contain references to documents that don't contain the indexed +attributes - thus they would be missing from the join operation. For this reason, +you should provide non-sparse indexes. + +### Pitfalls + +Since we're free of schemata, there is by default no way to tell the format of the +documents. So, if your documents don't contain an attribute, it defaults to +null. We can however check our data for accuracy like this: + +```aql +RETURN LENGTH(FOR u IN users FILTER u.userId == null RETURN 1) +``` + +```json +[ + 10000 +] +``` + +```aql +RETURN LENGTH(FOR f IN relations FILTER f.friendOf == null RETURN 1) +``` + +```json +[ + 10000 +] +``` + +So if the above queries return 10k matches each, the result of the Join tuples +query will become 100,000,000 items larger and use much memory plus computation +time. So it is generally a good idea to revalidate that the criteria for your +join conditions exist. + +Using indexes on the properties can speed up the operation significantly. +You can use the explain helper to revalidate your query actually uses them. + +If you work with joins on edge collections you would typically aggregate over +the internal fields `_id`, `_from` and `_to` (where `_id` equals `userId`, +`_from` `friendOf` and `_to` would be `thisUser` in our examples). ArangoDB +implicitly creates indexes on them. diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/projections-and-filters.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/projections-and-filters.md new file mode 100644 index 0000000000..18284c1362 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/projections-and-filters.md @@ -0,0 +1,136 @@ +--- +title: Projections and Filters in AQL +menuTitle: Projections and filters +weight: 20 +description: >- + Examples of returning documents unaltered and subsets of their attributes, + as well as filtering +--- +## Returning unaltered documents + +To return three complete documents from collection *users*, the following query can be used: + +```aql +FOR u IN users + LIMIT 0, 3 + RETURN u +``` + +```json +[ + { + "_id" : "users/229886047207520", + "_rev" : "229886047207520", + "_key" : "229886047207520", + "active" : true, + "id" : 206, + "age" : 31, + "gender" : "f", + "name" : "Abigail" + }, + { + "_id" : "users/229886045175904", + "_rev" : "229886045175904", + "_key" : "229886045175904", + "active" : true, + "id" : 101, + "age" : 36, + "name" : "Fred", + "gender" : "m" + }, + { + "_id" : "users/229886047469664", + "_rev" : "229886047469664", + "_key" : "229886047469664", + "active" : true, + "id" : 208, + "age" : 29, + "name" : "Mary", + "gender" : "f" + } +] +``` + +Note that there is a `LIMIT` clause but no `SORT` clause. In this case it is not guaranteed +which of the user documents are returned. Effectively the document return order is unspecified +if no `SORT` clause is used, and you should not rely on the order in such queries. + +## Projections + +To return a projection from the collection *users* use a modified `RETURN` instruction: + +```aql +FOR u IN users + LIMIT 0, 3 + RETURN { + "user" : { + "isActive" : u.active ? "yes" : "no", + "name" : u.name + } + } +``` + +```json +[ + { + "user" : { + "isActive" : "yes", + "name" : "John" + } + }, + { + "user" : { + "isActive" : "yes", + "name" : "Anthony" + } + }, + { + "user" : { + "isActive" : "yes", + "name" : "Fred" + } + } +] +``` + +## Filters + +To return a filtered projection from collection *users*, you can use the +`FILTER` keyword. Additionally, a `SORT` clause is used to have the result +returned in a specific order: + +```aql +FOR u IN users + FILTER u.active == true && u.age >= 30 + SORT u.age DESC + LIMIT 0, 5 + RETURN { + "age" : u.age, + "name" : u.name + } +``` + +```json +[ + { + "age" : 37, + "name" : "Sophia" + }, + { + "age" : 37, + "name" : "John" + }, + { + "age" : 36, + "name" : "Emma" + }, + { + "age" : 36, + "name" : "Fred" + }, + { + "age" : 34, + "name" : "Madison" + } +] +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/queries-without-collections.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/queries-without-collections.md new file mode 100644 index 0000000000..3e1dcd8225 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/queries-without-collections.md @@ -0,0 +1,50 @@ +--- +title: AQL queries without collections +menuTitle: Queries without collections +weight: 50 +description: >- + You can use AQL with only expressions and no document access for some + calculation and testing purposes +--- +AQL queries typically access one or more collections to read from documents +or to modify them. Queries don't necessarily have to involve collections +however. Below are a few examples of that. + +Following is a query that returns a string value. The result string is contained in an array +because the result of every valid query is an array: + +```aql +--- +name: aqlWithoutCollections_1 +description: '' +--- +RETURN "this will be returned" +``` + +You may use variables, call functions and return arbitrarily structured results: + +```aql +--- +name: aqlWithoutCollections_2 +description: '' +--- +LET array = [1, 2, 3, 4] +RETURN { array, sum: SUM(array) } +``` + +Language constructs such as the FOR loop can be used too. Below query +creates the Cartesian product of two arrays and concatenates the value pairs: + +```aql +--- +name: aqlWithoutCollections_3 +description: '' +--- +FOR year IN [ 2011, 2012, 2013 ] + FOR quarter IN [ 1, 2, 3, 4 ] + RETURN { + year, + quarter, + formatted: CONCAT(quarter, " / ", year) + } +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/remove-vertex.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/remove-vertex.md new file mode 100644 index 0000000000..e80cf8f390 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/remove-vertex.md @@ -0,0 +1,81 @@ +--- +title: Remove vertices with AQL +menuTitle: Remove vertex +weight: 45 +description: >- + Removing connected edges along with vertex documents directly in AQL is + possible in a limited way +--- +Deleting vertices with associated edges is currently not handled via AQL while +the [graph management interface](../../graphs/general-graphs/management.md#remove-a-vertex) +and the +[REST API for the graph module](../../develop/http-api/graphs/named-graphs.md#remove-a-vertex) +offer a vertex deletion functionality. +However, as shown in this example based on the +[Knows Graph](../../graphs/example-graphs.md#knows-graph), a query for this +use case can be created. + +![Example Graph](../../../../images/knows_graph.png) + +When deleting vertex **eve** from the graph, we also want the edges +`eve -> alice` and `eve -> bob` to be removed. +The involved graph and its only edge collection has to be known. In this case it +is the graph **knows_graph** and the edge collection **knows**. + +This query will delete **eve** with its adjacent edges: + +```aql +--- +name: GRAPHTRAV_removeVertex1 +description: '' +dataset: knows_graph +--- +LET edgeKeys = (FOR v, e IN 1..1 ANY 'persons/eve' GRAPH 'knows_graph' RETURN e._key) +LET r = (FOR key IN edgeKeys REMOVE key IN knows) +REMOVE 'eve' IN persons +``` + +This query executed several actions: +- use a graph traversal of depth 1 to get the `_key` of **eve's** adjacent edges +- remove all of these edges from the `knows` collection +- remove vertex **eve** from the `persons` collection + +The following query shows a different design to achieve the same result: + +```aql +--- +name: GRAPHTRAV_removeVertex2 +description: '' +dataset: knows_graph +--- +LET edgeKeys = (FOR v, e IN 1..1 ANY 'persons/eve' GRAPH 'knows_graph' + REMOVE e._key IN knows) +REMOVE 'eve' IN persons +``` + +**Note**: The query has to be adjusted to match a graph with multiple vertex/edge collections. + +For example, the [City Graph](../../graphs/example-graphs.md#city-graph) +contains several vertex collections - `germanCity` and `frenchCity` and several +edge collections - `french / german / international Highway`. + +![Example Graph2](../../../../images/cities_graph.png) + +To delete city **Berlin** all edge collections `french / german / international Highway` +have to be considered. The **REMOVE** operation has to be applied on all edge +collections with `OPTIONS { ignoreErrors: true }`. Not using this option will stop the query +whenever a non existing key should be removed in a collection. + +```aql +--- +name: GRAPHTRAV_removeVertex3 +description: '' +dataset: routeplanner +--- +LET edgeKeys = (FOR v, e IN 1..1 ANY 'germanCity/Berlin' GRAPH 'routeplanner' RETURN e._key) +LET r = (FOR key IN edgeKeys REMOVE key IN internationalHighway + OPTIONS { ignoreErrors: true } REMOVE key IN germanHighway + OPTIONS { ignoreErrors: true } REMOVE key IN frenchHighway + OPTIONS { ignoreErrors: true }) +REMOVE 'Berlin' IN germanCity +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/traversals.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/traversals.md new file mode 100644 index 0000000000..08296c64e4 --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/traversals.md @@ -0,0 +1,118 @@ +--- +title: Combining AQL Graph Traversals +menuTitle: Traversals +weight: 40 +description: >- + You can combine graph queries with other AQL features like geo-spatial search +--- +## Finding the start vertex via a geo query + +Our first example will locate the start vertex for a graph traversal via [a geo index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). +We use the [City Graph](../../graphs/example-graphs.md#city-graph) and its geo indexes: + +![Cities Example Graph](../../../../images/cities_graph.png) + +```js +--- +name: COMBINING_GRAPH_01_create_graph +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +examples.loadGraph("routeplanner"); +~examples.dropGraph("routeplanner"); +``` + +We search all german cities in a range of 400 km around the ex-capital **Bonn**: **Hamburg** and **Cologne**. +We won't find **Paris** since its in the `frenchCity` collection. + +```aql +--- +name: COMBINING_GRAPH_02_show_geo +description: '' +dataset: routeplanner +bindVars: + { + "bonn": [7.0998, 50.7340], + "radius": 400000 + } +--- +FOR startCity IN germanCity + FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius + RETURN startCity._key +``` + +Let's revalidate that the geo indexes are actually used: + +```aql +--- +name: COMBINING_GRAPH_03_explain_geo +description: '' +dataset: routeplanner +explain: true +bindVars: + { + "bonn": [7.0998, 50.7340], + "radius": 400000 + } +--- +FOR startCity IN germanCity + FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius + RETURN startCity._key +``` + +And now combine this with a graph traversal: + +```aql +--- +name: COMBINING_GRAPH_04_combine +description: '' +dataset: routeplanner +bindVars: + { + "bonn": [7.0998, 50.7340], + "radius": 400000 + } +--- +FOR startCity IN germanCity + FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius + FOR v, e, p IN 1..1 OUTBOUND startCity + GRAPH 'routeplanner' + RETURN {startcity: startCity._key, traversedCity: v._key} +``` + +The geo index query returns us `startCity` (**Cologne** and **Hamburg**) which we then use as starting point for our graph traversal. +For simplicity we only return their direct neighbours. We format the return result so we can see from which `startCity` the traversal came. + +Alternatively we could use a `LET` statement with a subquery to group the traversals by their `startCity` efficiently: + +```aql +--- +name: COMBINING_GRAPH_05_combine_let +description: '' +dataset: routeplanner +bindVars: + { + "bonn": [7.0998, 50.7340], + "radius": 400000 + } +--- +FOR startCity IN germanCity + FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius + LET oneCity = ( + FOR v, e, p IN 1..1 OUTBOUND startCity + GRAPH 'routeplanner' RETURN v._key + ) + RETURN {startCity: startCity._key, connectedCities: oneCity} +``` + +Finally, we clean up again: + +```js +--- +name: COMBINING_GRAPH_06_cleanup +description: '' +--- +~var examples = require("@arangodb/graph-examples/example-graph"); +~var g = examples.loadGraph("routeplanner"); +examples.dropGraph("routeplanner"); +``` diff --git a/site/content/arangodb/oem/aql/examples-and-query-patterns/upsert-repsert-guide.md b/site/content/arangodb/oem/aql/examples-and-query-patterns/upsert-repsert-guide.md new file mode 100644 index 0000000000..7068acebbe --- /dev/null +++ b/site/content/arangodb/oem/aql/examples-and-query-patterns/upsert-repsert-guide.md @@ -0,0 +1,335 @@ +--- +title: Conditionally Inserting and Modifying Documents +menuTitle: Upsert / Repsert Guide +weight: 60 +description: >- + AQL offers an `UPSERT` operation and an `INSERT` operation with different + overwrite modes, and you can alternatively use the Document API, each having + different features and performance characteristics +--- +A common requirement when ingesting data is to ensure that certain documents +exist in a collection. Oftentimes when running a command it is unclear whether +the target documents are already present in the collection or need to be +inserted first. + +Unconditional `INSERT` operations will not work here, because they may run +into errors if the target documents already exist. This will trigger a +"unique constraint violation" error. Unconditional `UPDATE` or `REPLACE` +operations will also fail, because they require that the target documents are +already present. If this is not the case, the operations would run into +"document not found" errors. + +So what needs to be run instead are conditional inserts/updates/replaces, also +called _upserts_ or _repserts_. The behavior of such operations is: + +- Check if a document exists, based on some criteria +- If it does not exist, create the document +- If it exists, update or replace it with a new version + +ArangoDB provides the following options in AQL to achieve this: + +- `UPSERT` AQL operation +- `INSERT` AQL operation with `overwriteMode` +- Insert operation not using AQL, but the Document REST API + +These alternatives have different capabilities and performance characteristics. + +## `UPSERT` AQL Operation + +Let us start with the [`UPSERT` AQL operation](../high-level-operations/upsert.md), +which is very generic and flexible. + +The purpose of the `UPSERT` AQL operation is to ensure that a specific document +exists after the operation has finished. + +`UPSERT` will look for a specific document, based on user-configurable +attributes/values, and create the document if it does not yet exist. +If `UPSERT` finds such document, it can partially adjust it (`UPDATE`) or fully +replace it (`REPLACE`). + +To recap, the syntaxes of AQL `UPSERT` are, depending on whether you want to +update replace a document: + +```aql +UPSERT <search-expression> +INSERT <insert-expression> +UPDATE <update-expression> +IN <collection> OPTIONS <options> +``` + +or + +```aql +UPSERT <search-expression> +INSERT <insert-expression> +REPLACE <replace-expression> +IN <collection> OPTIONS <options> +``` + +The `OPTIONS` part is optional. + +An example `UPSERT` operation looks like this: + +```aql +UPSERT { page: "index.html" } +INSERT { page: "index.html", status: "inserted" } +UPDATE { status: "updated" } +IN pages +``` + +This will look for a document in the `pages` collection with the `page` +attribute having a value of `index.html`. If such document cannot be found, the +`INSERT` part will be executed, which will create a document with the `page` and +`status` attributes. If the operation finds an existing document with `page` +being `index.html`, it will execute the `UPDATE` part, which will set the +document's `status` attribute to `updated`. + +### Tracking Modification Dates + +The `UPSERT` AQL operation is sometimes used in combination with +date/time-keeping. For example, the following query keeps track of when a +document was first created, and when it was last updated: + +```aql +UPSERT { page: "index.html" } +INSERT { page: "index.html", created: DATE_NOW() } +UPDATE { updated: DATE_NOW() } +IN pages +``` + +### `OLD` variable + +The `UPSERT` AQL operation also provides a pseudo-variable named `OLD` to refer +to the existing document and its values in the `UPDATE`/`REPLACE` part. +Following is an example that increments a counter on a document whenever the +`UPSERT` operation is executed: + +```aql +UPSERT { page: "index.html" } +INSERT { page: "index.html", hits: 1 } +UPDATE { hits: OLD.value + 1 } +IN pages +``` + +### `UPSERT` Caveats + +`UPSERT` is a very flexible operation, so some things should be kept in mind to +use it effectively and efficiently. + +#### Repeat the Search Attributes + +First of all, the `INSERT` part of an `UPSERT` operation should contain all +attributes that are used in the search expression. Consider the following +counter-example: + +```aql +UPSERT { page: "index.html" } +INSERT { status: "inserted" } /* page attribute missing here! */ +UPDATE { status: "updated" } +IN pages +``` + +Forgetting to specify the search attributes in the `INSERT` part introduces a +problem: The first time the `UPSERT` is executed and does not find a document +with `page` being `index.html`, it will branch into the `INSERT` part as +expected. However, the `INSERT` part will create a document with only the +`status` attribute set. The `page` attribute is missing here, so when the +`INSERT` completes, there is still no document with `page` being `index.html`. +That means whenever this `UPSERT` statement executes, it will branch into the +`INSERT` part, and the `UPDATE` part will never be reached. This is likely +unintentional. + +The problem can easily be avoided by adding the search attributes to the +`INSERT` part: + +```aql +UPSERT { page: "index.html" } +INSERT { page: "index.html", status: "inserted" } +UPDATE { status: "updated" } +IN pages +``` + +Note that it is not necessary to repeat the search attributes in the `UPDATE` +part, because `UPDATE` is a partial update. It will only set the attributes that +are specified in the `UPDATE` part, and leave all other existing attributes +alone. However, it is necessary to repeat the search attributes in the `REPLACE` +part, because `REPLACE` will completely overwrite the existing document with +what is specified in the `REPLACE` part. + +That means when using the `REPLACE` operation, the query should look like: + +```aql +UPSERT { page: "index.html" } +INSERT { page: "index.html", status: "inserted" } +REPLACE { page: "index.html", status: "updated" } +IN pages +``` + +#### Use Indexes for Search Attributes + +A downside of `UPSERT`'s flexibility is that it can be used on arbitrary +collection attributes, even if those are not indexed. + +When the `UPSERT` looks for an existing document, it _will_ use an index if an +index exists, but will also continue if no index exists. In the latter case, +the `UPSERT` will execute a full collection scan, which can be expensive for +large collections. So it is advised to create an index on the search +attribute(s) used in an `UPSERT`. + +#### `UPSERT` is Non-Atomic + +The overall `UPSERT` operation does not execute atomically for a single document. +It is basically a document lookup followed by either a document insert, update +or replace operation. + +That means if multiple `UPSERT` operations run concurrently with the same search +values, they may all determine that the target document does not exist - and +then all decide to create such document. That will mean one will end up with +multiple instances of the target document afterwards. + +To avoid such concurrency issues, a unique index can be created on the search +attribute(s). Such index will prevent concurrent `UPSERT` operations from +creating identical documents. Instead, only one of the concurrent `UPSERT`s will +succeed, whereas the others will fail with a "unique constraint violated" error. +In that case the client application can either retry the operation (which then +should go into the `UPDATE`/`REPLACE` branch), or ignore the error if the goal +was only to ensure the target document exists. + +Using a unique index on the search attribute(s) will thus improve lookup +performance and avoid duplicates. + +#### Using Shard Key(s) for Lookups + +In a cluster setup, the search expression should contain the shard key(s), as +this allows the lookup to be sent to a single shard only. This will be more +efficient than having to execute the lookup on all the shards of the collection. + +Another benefit of using the shard key(s) in the search expression is that +unique indexes are only supported if they contain the shard key(s). + +## `INSERT` AQL Operation with `overwriteMode` + +While the `UPSERT` AQL operation is very powerful and flexible, it is often not +the ideal choice for high-volume ingestion. + +A much more efficient alternative to the `UPSERT` AQL operation is the +[`INSERT` AQL operation](../high-level-operations/insert.md) with the `overwriteMode` +attribute set. This operation is not a drop-in replacement for `UPSERT`, but +rather a fast alternative in case the document key (`_key` attribute) is known +when the operation is executed, and none of the old values need to be referenced. + +The general syntax of the `INSERT` AQL operation is: + +```aql +INSERT <insert-expression> +IN <collection> OPTIONS <options> +``` + +As we will deal with the `overwriteMode` option here, we are focussing on +`INSERT` operations with this option set, for example: + +```aql +INSERT { _key: "index.html", status: "created" } +IN pages OPTIONS { overwriteMode: "ignore" } +``` + +Regardless of the selected `overwriteMode`, the `INSERT` operation will insert +the document if no document exists in the collection with the specified `_key`. +In this aspect it behaves as a regular `INSERT` operation. + +However, if a document with the specified `_key` already exists in the +collection, the `INSERT` behavior will be as follows, depending on the selected +`overwriteMode`: + +- `conflict` (default): if a document with the specified `_key` exists, return + a "unique constraint violation" +- `ignore`: if a document with the specified `_key` exists, do nothing. + Especially do not report a "unique constraint violation" error. +- `update`: if a document with the specified `_key` exists, (partially) update + the document with the attributes specified. +- `replace`: if a document with the specified `_key` exists, fully replace the + document with the attributes specified. + +If no `overwriteMode` is specified, the behavior of an `INSERT` operation is as +if the `overwriteMode` was set to `conflict`. + +The benefit of using `INSERT` with `overwriteMode` set to `ignore`, `update` or +`replace` is that the `INSERT` operation is going to be very fast, especially in +comparison with the `UPSERT` operation. In addition, `INSERT` will do a lookup +using the `_key` attribute, which is always indexed. So it will always use the +primary index and never do full collection scans. It also does not require +setting up additional indexes, because the primary index is automatically +present for all collections. + +There are also a few caveats when working with `INSERT` AQL operations: + +- They can only be used when the value of the `_key` attribute is known at the + time of insert. That means the client application must be able to provide the + document keys in a deterministic way. + +- The values that can be used for the `_key` attribute have some character and + length restrictions, but alphanumeric keys work well. + +- In a cluster setup, the underlying collection must be sharded by `_key`. This + is the default shard key, however. + +- There is no access to the data of an existing document for arbitrary + calculations when going into the `update` or `replace` mode. + +Please note that even though the `INSERT` AQL operation cannot refer to existing +documents to calculate values for updating/replacing, it can still return the +previous version of the document in case the document is already present. +This can be achieved by appending a `RETURN OLD` to the `INSERT` operation, +e.g. + +```aql +INSERT { _key: "index.html", status: "created" } +IN pages OPTIONS { overwriteMode: "replace" } +RETURN OLD +``` + +It is also possible to return the new version of the document (the inserted +document if no previous document existed, or the updated/replaced version in +case a document already existed) by using `RETURN NEW`: + +```aql +INSERT { _key: "index.html", status: "created" } +IN pages OPTIONS { overwriteMode: "replace" } +RETURN NEW +``` + +## Insert Operation not Using AQL + +There is the option to execute an insert operation with `overwriteMode` outside +of AQL. The [`POST /_api/document/{collection}`](../../develop/http-api/documents.md#create-multiple-documents) +endpoint is a dedicated REST API for insert operations, which can handle one +document, or multiple documents at once. + +Conceptually this API behaves like the `INSERT` AQL operation, but it can be +called with a batch of documents at once. This is the most efficient solution, +and should be preferred if possible. + +Most ArangoDB drivers also provide a means to insert multiple documents at once, +which will internally call this same REST API. + +The REST API provides the `returnOld` and `returnNew` options to make it return +the previous versions of documents or the insert/updated/replaced documents, in +the same way as the `INSERT` AQL operation can do. + +AQL `INSERT` queries with the `optimize-cluster-multiple-document-operations` +optimization applied perform similarly well in cluster deployments, but it +cannot be applied in all cases (see the list of +[optimizer rules](../execution-and-performance/query-optimization.md#optimize-cluster-multiple-document-operations) +for details). + +## Summary + +The `UPSERT` AQL operation is the most flexible way to conditionally insert or +update/replace documents in ArangoDB, but it is also the least efficient variant. + +The `INSERT` AQL operation with the `overwriteMode` set will outperform +`UPSERT`, but it can only be used for some use cases. + +Using the dedicated REST API for document inserts will be even more efficient, +and is thus the preferred option for bulk document inserts, but AQL `INSERT` +queries can be almost as fast. diff --git a/site/content/arangodb/oem/aql/execution-and-performance/_index.md b/site/content/arangodb/oem/aql/execution-and-performance/_index.md new file mode 100644 index 0000000000..305ecfedb8 --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/_index.md @@ -0,0 +1,7 @@ +--- +title: AQL Execution and Performance +menuTitle: Execution and Performance +weight: 50 +description: >- + This chapter describes AQL features related to query execution and query performance +--- diff --git a/site/content/arangodb/oem/aql/execution-and-performance/caching-query-results.md b/site/content/arangodb/oem/aql/execution-and-performance/caching-query-results.md new file mode 100644 index 0000000000..8e76741ee5 --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/caching-query-results.md @@ -0,0 +1,228 @@ +--- +title: The AQL query results cache +menuTitle: Caching query results +weight: 30 +description: >- + AQL provides an optional query results cache in single server deployments +--- +The purpose of the query results cache is to avoid repeated calculation of the same +query results. It is useful if data-reading queries repeat a lot and there are +not many write queries. + +The query results cache is transparent so users do not need to manually invalidate +results in it if underlying collection data are modified. + +{{< info >}} +The AQL query results cache is only available for single servers, i.e. servers that +are not part of a cluster setup. +{{< /info >}} + +## Modes + +The cache can be operated in the following modes: + +- `off`: The cache is disabled. No query results are stored. +- `on`: The cache stores the results of all AQL queries unless the `cache` + query option is set to `false`. +- `demand`: The cache stores the results of AQL queries that have the + `cache` query option set to `true` but ignores all others. + +The mode can be set at server startup as well as at runtime, see +[Global configuration](#global-configuration). + +## Query eligibility + +The query results cache considers two queries identical if they have exactly the +same query string and the same bind variables. Any deviation in terms of whitespace, +capitalization etc. is considered a difference. The query string is hashed +and used as the cache lookup key. If a query uses bind parameters, these are also +hashed and used as part of the cache lookup key. + +Even if the query strings of two queries are identical, the query results cache +treats them as different queries if they have different bind parameter +values. Other components that become part of a query's cache key are the +`count`, `fullCount`, and `optimizer` attributes. + +If the cache is enabled, it is checked whether it has a result ready for a +particular query at the very start of processing the query request. If this is +the case, the query result is served directly from the cache, which is normally +very efficient. If the query cannot be found in the cache, it is executed +as usual. + +If the query is eligible for caching and the cache is enabled, the query +result is stored in the query results cache so it can be used for subsequent +executions of the same query. + +A query is eligible for caching only if all of the following conditions are met: + +- The server the query executes on is a single server (i.e. not part of a cluster). +- The query is a read-only query and does not modify data in any collection. +- No warnings were produced while executing the query. +- The query is deterministic and only uses deterministic functions whose results + are marked as cacheable. +- The size of the query result does not exceed the cache's configured maximal + size for individual cache results or cumulated results. +- The query is not executed using a streaming cursor (`"stream": true` query option). + +The usage of non-deterministic functions leads to a query not being cacheable. +This is intentional to avoid caching of function results which should rather +be calculated on each invocation of the query (e.g. `RAND()` or `DATE_NOW()`). + +The query results cache considers all user-defined AQL functions to be non-deterministic +as it has no insight into these functions. + +## Cache invalidation + +The cached results are fully or partially invalidated automatically if +queries modify the data of collections that were used during the computation of +the cached query results. This is to protect users from getting stale results +from the query results cache. + +This also means that if the cache is turned on, then there is an additional +cache invalidation check for each data-modification operation (e.g. insert, update, +remove, truncate operations as well as AQL data-modification queries). + +**Example** + +If the result of the following query is present in the query results cache, +then either modifying data in the `users` or `organizations` collection +removes the already computed result from the cache: + +```aql +FOR user IN users + FOR organization IN organizations + FILTER user.organization == organization._key + RETURN { user: user, organization: organization } +``` + +Modifying data in other unrelated collections does not lead to this +query result being removed from the cache. + +## Performance considerations + +The query results cache is organized as a hash table, so looking up whether a query result +is present in the cache is fast. Still, the query string and the bind +parameter used in the query need to be hashed. This is a slight overhead that +is not present if the cache is disabled or a query is marked as not cacheable. + +Additionally, storing query results in the cache and fetching results from the +cache requires locking via a read/write lock. While many thread can read in parallel from +the cache, there can only be a single modifying thread at any given time. Modifications +of the query cache contents are required when a query result is stored in the cache +or during cache invalidation after data-modification operations. Cache invalidation +requires time proportional to the number of cached items that need to be invalidated. + +There may be workloads in which enabling the query results cache leads to a performance +degradation. It is not recommended to turn the query results cache on in workloads that only +modify data, or that modify data more often than reading it. Enabling the cache +also provides no benefit if queries are very diverse and do not repeat often. +In read-only or read-mostly workloads, the cache is beneficial if the same +queries are repeated lots of times. + +In general, the query results cache provides the biggest improvements for queries with +small result sets that take long to calculate. If query results are very big and +most of the query time is spent on copying the result from the cache to the client, +then the cache does not provide much benefit. + +## Global configuration + +The query results cache can be configured at server start with the +[`--query.cache-mode`](../../components/arangodb-server/options.md#--querycache-mode) +startup option. + +The cache mode can also be changed at runtime using the JavaScript API as follows: + +```js +require("@arangodb/aql/cache").properties({ mode: "on" }); +``` + +The maximum number of cached results in the cache for each database can be configured +at server start using the following configuration parameters: + +- `--query.cache-entries`: The maximum number of results in the query results cache per database +- `--query.cache-entries-max-size`: The maximum cumulated size of results in the query results cache per database +- `--query.cache-entry-max-size`: The maximum size of an individual result entry in query results cache +- `--query.cache-include-system-collections`: Whether to include system collection queries in the query results cache + +These parameters can be used to put an upper bound on the number and size of query +results in each database's query cache and thus restrict the cache's memory consumption. + +These value can also be adjusted at runtime as follows: + +```js +require("@arangodb/aql/cache").properties({ + maxResults: 200, + maxResultsSize: 8 * 1024 * 1024, + maxEntrySize: 1024 * 1024, + includeSystem: false +}); +``` + +The above settings limit the number of cached results in the query results cache to 200 +results per database, and to 8 MiB cumulated query result size per database. The maximum +size of each query cache entry is restricted to 1 MiB. Queries that involve system +collections are excluded from caching. + +You can also change the configuration at runtime with the +[HTTP API](../../develop/http-api/queries/aql-query-results-cache.md). + +## Per-query configuration + +When a query is sent to the server for execution and the cache is set to `on` or `demand`, +the query executor checks the query's `cache` option. If the query cache mode is +`on`, then not setting this query option or setting it to anything but `false` makes the +query executor consult the query results cache. If the query cache mode is `demand`, then setting +the `cache` option to `true` makes the executor look for the query in the query results cache. +When the query cache mode is `off`, the executor does not look for the query in the cache. + +The `cache` attribute can be set as follows via the `db._createStatement()` function: + +```js +var stmt = db._createStatement({ + query: "FOR doc IN users LIMIT 5 RETURN doc", + options: { + cache: true + } +}); + +stmt.execute(); +``` + +When using the `db._query()` function, the `cache` attribute can be set as follows: + +```js +db._query("FOR doc IN users LIMIT 5 RETURN doc", {}, { cache: true }); +``` + +You can also set the `cache` query option in the +[HTTP API](../../develop/http-api/queries/aql-queries.md#create-a-cursor). + +Each query result returned contain a `cached` attribute. It is set to `true` +if the result was retrieved from the query results cache, and `false` otherwise. Clients can use +this attribute to check if a specific query was served from the cache or not. + +## Query results cache inspection + +The contents of the query results cache can be checked at runtime using the cache's +`toArray()` function: + +```js +require("@arangodb/aql/cache").toArray(); +``` + +This returns a list of all query results stored in the current database's query +results cache. + +The query results cache for the current database can be cleared at runtime using the +cache's `clear` function: + +```js +require("@arangodb/aql/cache").clear(); +``` + +## Restrictions + +Query results that are returned from the query results cache may contain execution statistics +stemming from the initial, uncached query execution. This means for a cached query results, +the `extra.stats` attribute may contain stale data, especially in terms of the `executionTime` +and `profile` attribute values. diff --git a/site/content/arangodb/oem/aql/execution-and-performance/explaining-queries.md b/site/content/arangodb/oem/aql/execution-and-performance/explaining-queries.md new file mode 100644 index 0000000000..b51e33989d --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/explaining-queries.md @@ -0,0 +1,278 @@ +--- +title: Explain AQL Queries +menuTitle: Explaining queries +weight: 15 +description: >- + You can explain and profile AQL queries to inspect the execution plans and to + understand the performance characteristics, as well as create debug packages + for reporting issues +# Undocumented on purpose: +# require("@arangodb/aql/explainer").explainRegisters(data, options, shouldPrint); +# require("@arangodb/aql/explainer").debug(query, bindVars, options); +--- +If it is unclear how a given query will perform, clients can retrieve a query's execution plan +from the AQL query optimizer without actually executing the query. Getting the query execution +plan from the optimizer is called *explaining*. + +An explain throws an error if the given query is syntactically invalid. Otherwise, it +returns the execution plan and some information about what optimizations could be applied to +the query. The query is not executed. + +You can explain a query using the [HTTP REST API](../../develop/http-api/queries/aql-queries.md#explain-an-aql-query) +or via _arangosh_. + +## Inspecting query plans + +The `explain()` method of an `ArangoStatement` (`db._createStatement(...).explain()`) +creates very verbose output. To get a human-readable output of the query plan, +you can use `db._explain()`. You can use it as follows (without disabling syntax +highlighting with `{ colors: false }`): + +```js +--- +name: 01_workWithAQL_databaseExplain +description: '' +--- +db._explain("LET s = SLEEP(0.25) LET t = SLEEP(0.5) RETURN 1", {}, {colors: false}); +``` + +The plan contains all execution nodes that are used during a query. These nodes represent different +stages in a query. Each stage gets the input from the stage directly above (its dependencies). +The plan shows you the estimated number of items (results) for each query stage (under **Est.**). Each +query stage roughly equates to a line in your original query, which you can see under **Comment**. + +## Profiling queries + +Sometimes when you have a complex query it can be unclear on what time is spent +during the execution, even for intermediate ArangoDB users. + +By profiling a query it gets executed with special instrumentation code enabled. +It gives you all the usual information like when explaining a query, but +additionally you get the query profile, [runtime statistics](query-statistics.md) +and per-node statistics. + +To use this in an interactive fashion in the shell, you can call +`db._profileQuery()`, or use the web interface. You can use `db._profileQuery()` +as follows (without disabling syntax highlighting with `{ colors: false }`): + +```js +--- +name: 01_workWithAQL_databaseProfileQuery +description: '' +--- +db._profileQuery("LET s = SLEEP(0.25) LET t = SLEEP(0.5) RETURN 1", {}, {colors: false}); +``` + +For more information, see [Profiling Queries](query-profiling.md). + +## Execution plans in detail + +By default, the query optimizer returns what it considers to be the *optimal plan*. The +optimal plan is returned in the `plan` attribute of the result. If `explain` is +called with the `allPlans` option set to `true`, all plans are returned in the `plans` +attribute. + +The result object also contains a `warnings` attribute, which is an array of +warnings that occurred during optimization or execution plan creation. + +Each plan in the result is an object with the following attributes: +- `nodes`: the array of execution nodes of the plan. See the list of + [execution nodes](query-optimization.md#execution-nodes) +- `estimatedCost`: the total estimated cost for the plan. If there are multiple + plans, the optimizer chooses the plan with the lowest total cost. +- `collections`: an array of collections used in the query +- `rules`: an array of rules the optimizer applied. See the list of + [optimizer rules](query-optimization.md#optimizer-rules) +- `variables`: array of variables used in the query (note: this may contain + internal variables created by the optimizer) + +Here is an example for retrieving the execution plan of a simple query: + +```js +--- +name: 07_workWithAQL_statementsExplain +description: '' +--- +var stmt = db._createStatement("FOR user IN _users RETURN user"); +stmt.explain(); +``` + +As the output of `explain()` is very detailed, it is recommended to use some +scripting to make the output less verbose: + +```js +--- +name: 08_workWithAQL_statementsPlans +description: '' +--- +var formatPlan = function (plan) { + return { estimatedCost: plan.estimatedCost, + nodes: plan.nodes.map(function(node) { + return node.type; }) }; }; +formatPlan(stmt.explain().plan); +``` + +If a query contains bind parameters, they must be added to the statement **before** +`explain()` is called: + +```js +--- +name: 09_workWithAQL_statementsPlansBind +description: '' +--- +var stmt = db._createStatement( + `FOR doc IN @@collection FILTER doc.user == @user RETURN doc` +); +stmt.bind({ "@collection" : "_users", "user" : "root" }); +stmt.explain(); +``` + +In some cases, the AQL optimizer creates multiple plans for a single query. By default +only the plan with the lowest total estimated cost is kept, and the other plans are +discarded. To retrieve all plans the optimizer has generated, `explain` can be called +with the option `allPlans` set to `true`. + +In the following example, the optimizer has created two plans: + +```js +--- +name: 10_workWithAQL_statementsPlansOptimizer0 +description: '' +--- +var stmt = db._createStatement( + "FOR user IN _users FILTER user.user == 'root' RETURN user"); +stmt.explain({ allPlans: true }).plans.length; +``` + +To see a slightly more compact version of the plan, the following +transformation can be applied: + +```js +--- +name: 10_workWithAQL_statementsPlansOptimizer1 +description: '' +--- +~var stmt = db._createStatement("FOR user IN _users FILTER user.user == 'root' RETURN user"); +stmt.explain({ allPlans: true }).plans.map( + function(plan) { return formatPlan(plan); }); +``` + +`explain()` also accepts the following additional options: +- `maxPlans`: limits the maximum number of plans that are created by the AQL query optimizer +- `optimizer`: + - `rules`: an array of to-be-included or to-be-excluded optimizer rules + can be put into this attribute, telling the optimizer to include or exclude + specific rules. To disable a rule, prefix its name with a `-`, to enable a rule, prefix it + with a `+`. There is also a pseudo-rule `all`, which matches all optimizer rules. + +The following example disables all optimizer rules but `remove-redundant-calculations`: + +```js +--- +name: 10_workWithAQL_statementsPlansOptimizer2 +description: '' +--- +~var stmt = db._createStatement("FOR user IN _users FILTER user.user == 'root' RETURN user"); +stmt.explain({ optimizer: { + rules: [ "-all", "+remove-redundant-calculations" ] } }); +``` + +The contents of an execution plan are meant to be machine-readable. To get a human-readable +version of a query's execution plan, the following commands can be used +(without disabling syntax highlighting with `{ colors: false }`): + +```js +--- +name: 10_workWithAQL_statementsPlansOptimizer3 +description: '' +--- +var query = "FOR doc IN mycollection FILTER doc.value > 42 RETURN doc"; +require("@arangodb/aql/explainer").explain(query, {colors:false}); +``` + +The above command prints the query's execution plan in the ArangoShell +directly, focusing on the most important information. + +## Gathering debug information about a query + +If an explain provides no suitable insight into why a query does not perform as +expected, it may be reported to the ArangoDB support. In order to make this as easy +as possible, there is a built-in command in ArangoShell for packaging the query, its +bind parameters, and all data required to execute the query elsewhere. + +`require("@arangodb/aql/explainer").debugDump(filepath, query[, bindVars[, options]])` + +You can specify the following parameters: + +- `filepath` (string): A file path to save the debug package to +- `query` (string): An AQL query +- `bindVars` (object, _optional_): The bind parameters for the query +- `options` (object, _optional_): Options for the query, with two additionally + supported settings compared to `db._query()`: + - `examples` (number, _optional_): How many sample documents of your + collection data to include. Default: `0` + - `anonymize` (boolean, _optional_): Whether all string attribute values of + the sample documents shall be substituted with strings like `XXX`. + +The command stores all data in a file with a configurable filename: + +```js +--- +name: 10_workWithAQL_debugging1 +description: '' +--- +var query = "FOR doc IN mycollection FILTER doc.value > 42 RETURN doc"; +require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query); +``` + +Entitled users can send the generated file to the Arango support to facilitate +reproduction and debugging. + +{{< tip >}} +You can also create debug packages using the web interface, see +[Query debug packages](../../operations/troubleshooting/query-debug-packages.md). +{{< /tip >}} + +If a query contains bind parameters, you need to specify them along with the query +string: + +```js +--- +name: 10_workWithAQL_debugging2 +description: '' +--- +var query = "FOR doc IN @@collection FILTER doc.value > @value RETURN doc"; +var bindVars = { value: 42, "@collection": "mycollection" }; +require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query, bindVars); +``` + +It is also possible to include example documents from the underlying collection in +order to make reproduction even easier. Example documents can be sent as they are, or +in an anonymized form. The number of example documents can be specified in the `examples` +options attribute, and should generally be kept low. The `anonymize` option replaces +the contents of string attributes in the examples with `XXX`. However, it does not +replace any other types of data (e.g. numeric values) or attribute names. Attribute +names in the examples are always preserved because they may be indexed and used in +queries: + +```js +--- +name: 10_workWithAQL_debugging3 +description: '' +--- +var query = "FOR doc IN @@collection FILTER doc.value > @value RETURN doc"; +var bind = { value: 42, "@collection": "mycollection" }; +var options = { examples: 10, anonymize: true }; +require("@arangodb/aql/explainer").debugDump("/tmp/query-debug-info", query, bind, options); +``` + +To get a human-readable output from a debug package JSON file, you can use the +`inspectDump()` method: + +`require("@arangodb/aql/explainer").inspectDump(inFilepath[, outFilepath])` + +You can specify the following parameters: + +- `inFilepath` (string): The path to the debug package JSON file +- `outFilepath` (string, _optional_): A path to store the formatted output in a + file instead of printing to the shell diff --git a/site/content/arangodb/oem/aql/execution-and-performance/parsing-queries.md b/site/content/arangodb/oem/aql/execution-and-performance/parsing-queries.md new file mode 100644 index 0000000000..8c87fab393 --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/parsing-queries.md @@ -0,0 +1,32 @@ +--- +title: Parsing AQL queries +menuTitle: Parsing queries +weight: 10 +description: >- + Clients can check if given AQL queries are syntactically valid using an + HTTP API or JavaScript API +--- +ArangoDB provides an [HTTP REST API](../../develop/http-api/queries/aql-queries.md) +for parsing and thus statically validating queries. + +A query can also be parsed from the ArangoShell using `ArangoStatement`'s `parse` method. The +`parse` method will throw an exception if the query is syntactically invalid. Otherwise, it will +return the some information about the query. + +The return value is an object with the collection names used in the query listed in the +`collections` attribute, and all bind parameters listed in the `bindVars` attribute. +Additionally, the internal representation of the query, the query's abstract syntax tree, will +be returned in the `AST` attribute of the result. Please note that the abstract syntax tree +will be returned without any optimizations applied to it. + +```js +--- +name: 11_workWithAQL_parseQueries +description: '' +--- +var stmt = db._createStatement( + "FOR doc IN @@collection FILTER doc.foo == @bar RETURN doc"); +stmt.parse(); +~removeIgnoreCollection("mycollection") +~db._drop("mycollection") +``` diff --git a/site/content/arangodb/oem/aql/execution-and-performance/query-optimization.md b/site/content/arangodb/oem/aql/execution-and-performance/query-optimization.md new file mode 100644 index 0000000000..919543e71e --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/query-optimization.md @@ -0,0 +1,626 @@ +--- +title: The AQL query optimizer +menuTitle: Query Optimization +weight: 25 +description: >- + AQL queries are sent through an optimizer before execution that creates an + initial execution plan, looks for optimization opportunities, and applies them +pageToc: + maxHeadlineLevel: 3 +--- +AQL queries are parsed and planned. The optimizer might produce multiple execution plans +for a single query. It then calculates the costs for all plans and picks the plan with the +lowest total cost. This resulting plan is considered to be the *optimal plan*, which is +then executed. + +The optimizer is designed to only perform optimizations if they are *safe*, in the +sense that an optimization should not modify the result of a query. A notable exception +to this is that the optimizer is allowed to change the order of results for queries that +do not explicitly specify how results should be sorted. + +## Execution plans + +The `explain` command can be used to query the optimal executed plan or even all plans +the optimizer has generated. Additionally, `explain` can reveal some more information +about the optimizer's view of the query. + +### Inspecting plans using the explain helper + +The `explain` method of `ArangoStatement` as shown in the next chapters creates very verbose output. +You can work on the output programmatically, or use this handsome tool that we created +to generate a more human readable representation. + +You may use it like this: (we disable syntax highlighting here) + +```js +--- +name: AQLEXP_01_axplainer +description: '' +--- +~addIgnoreCollection("test") +~db._drop("test"); +var coll = db._create("test"); +for (i = 0; i < 100; ++i) { db.test.save({ value: i }); } +var idx = db.test.ensureIndex({ type: "persistent", fields: [ "value" ] }); +var explain = require("@arangodb/aql/explainer").explain; +explain("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value", {colors:false}); +``` + +### Execution plans in detail + +Let's have a look at the raw json output of the same execution plan +using the `explain` method of `ArangoStatement`: + +```js +--- +name: AQLEXP_01_explainCreate +description: '' +--- +var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain(); +``` + +As you can see, the result details are very verbose. They are not covered in +detail for brevity in the next sections. Instead, let's take a closer look at +the results step by step. + +#### Execution nodes of a query + +In general, an execution plan can be considered to be a pipeline of processing steps. +Each processing step is carried out by a so-called *execution node* + +The `nodes` attribute of the `explain` result contains these *execution nodes* in +the *execution plan*. The output is still very verbose, so here's a shorted form of it: + +```js +--- +name: AQLEXP_02_explainOverview +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain().plan.nodes.map(function (node) { return node.type; }); +``` + +Note that the list of nodes might slightly change in future versions of ArangoDB if +new execution node types get added or the optimizer create somewhat more +optimized plans. + +When a plan is executed, the query execution engine starts with the node at +the bottom of the list (i.e. the `ReturnNode`). + +The `ReturnNode`'s purpose is to return data to the caller. It does not produce +data itself, but it asks the node above itself, which is the `CalculationNode` +in our example. +`CalculationNode`s are responsible for evaluating arbitrary expressions. In our +example query, the `CalculationNode` evaluates the value of `i.value`, which +is needed by the `ReturnNode`. The calculation is applied for all data the +`CalculationNode` gets from the node above it, in our example the `IndexNode`. + +Finally, all of this needs to be done for documents of collection `test`. This is +where the `IndexNode` enters the game. It uses an index (thus its name) +to find certain documents in the collection and ships it down the pipeline in the +order required by `SORT i.value`. The `IndexNode` itself has a `SingletonNode` +as its input. The sole purpose of a `SingletonNode` node is to provide a single empty +document as input for other processing steps. It is always the end of the pipeline. + +Here is a summary: +- SingletonNode: produces an empty document as input for other processing steps. +- IndexNode: iterates over the index on attribute `value` in collection `test` + in the order required by `SORT i.value`. +- CalculationNode: evaluates the result of the calculation `i.value > 97` to `true` or `false` +- CalculationNode: calculates return value `i.value` +- ReturnNode: returns data to the caller + +#### Optimizer rules used for a query + +Note that in the example, the optimizer has optimized the `SORT` statement away. +It can do it safely because there is a sorted persistent index on `i.value`, which it has +picked in the `IndexNode`. As the index values are iterated over in sorted order +anyway, the extra `SortNode` would have been redundant and was removed. + +Additionally, the optimizer has done more work to generate an execution plan that +avoids as much expensive operations as possible. Here is the list of optimizer rules +that were applied to the plan: + +```js +--- +name: AQLEXP_03_explainRules +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain().plan.rules; +``` + +Here is the meaning of these rules in context of this query: +- `move-calculations-up`: Moves a `CalculationNode` and subqueries, when independent from the outer node, + as far up in the processing pipeline as possible. +- `move-filters-up`: Moves a `FilterNode` as far up in the processing pipeline as + possible. +- `remove-redundant-calculations`: Replaces references to variables with references to + other variables that contain the exact same result. In the example query, `i.value` + is calculated multiple times, but each calculation inside a loop iteration would + produce the same value. Therefore, the expression result is shared by several nodes. +- `remove-unnecessary-calculations`: Removes `CalculationNode`s whose result values are + not used in the query. In the example this happens due to the `remove-redundant-calculations` + rule having made some calculations unnecessary. +- `use-indexes`: Use an index to iterate over a collection instead of performing a + full collection scan. In the example case this makes sense, as the index can be + used for filtering and sorting. +- `remove-filter-covered-by-index`: Remove an unnecessary filter whose functionality + is already covered by an index. In this case the index only returns documents + matching the filter. +- `use-index-for-sort`: Removes a `SORT` operation if it is already satisfied by + traversing over a sorted index. + +Note that some rules may appear multiple times in the list, with number suffixes. +This is due to the same rule being applied multiple times, at different positions +in the optimizer pipeline. + +Also see the full list of [optimizer rules](#optimizer-rules) below. + +#### Collections used in a query + +The list of collections used in a plan (and query) is contained in the `collections` +attribute of a plan: + +```js +--- +name: AQLEXP_04_explainCollections +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain().plan.collections +``` + +The `name` attribute contains the name of the `collection`, and `type` is the +access type, which can be either `read` or `write`. + +#### Variables used in a query + +The optimizer returns a list of variables used in a plan (and query). This +list contains auxiliary variables created by the optimizer itself. You can +ignore this list in most cases. + +#### Cost of a query + +For each plan the optimizer generates, it calculates the total cost. The plan +with the lowest total cost is considered to be the optimal plan. Costs are +estimates only, as the actual execution costs are unknown to the optimizer. +Costs are calculated based on heuristics that are hard-coded into execution nodes. +Cost values do not have any unit. + +### Retrieving all execution plans + +To retrieve not just the optimal plan but a list of all plans the optimizer has +generated, set the option `allPlans` to `true`: + +This returns a list of all plans in the `plans` attribute instead of in the +`plan` attribute: + +```js +--- +name: AQLEXP_05_explainAllPlans +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain({ allPlans: true }); +``` + +### Retrieving the plan as it was generated by the parser / lexer + +To retrieve the plan which closely matches your query, you may turn off most +optimization rules (i.e. cluster rules cannot be disabled if you're running +the explain on a cluster Coordinator) set the option `rules` to `-all`: + +This returns an unoptimized plan in the `plan`: + +```js +--- +name: AQLEXP_06_explainUnoptimizedPlans +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain({ optimizer: { rules: [ "-all" ] } }); +``` + +Note that some optimizations are already done at parse time (i.e. evaluate simple constant +calculation as `1 + 1`) + +## Turning specific optimizer rules off + +Optimizer rules can also be turned on or off individually, using the `rules` attribute. +This can be used to enable or disable one or multiple rules. Rules that shall be enabled +need to be prefixed with a `+`, rules to be disabled should be prefixed with a `-`. The +pseudo-rule `all` matches all rules. + +Rules specified in `rules` are evaluated from left to right, so the following works to +turn on just the one specific rule: + +```js +--- +name: AQLEXP_07_explainSingleRulePlans +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain({ optimizer: { rules: [ "-all", "+use-index-range" ] } }); +``` + +By default, all rules are turned on. To turn off just a few specific rules, use something +like this: + +```js +--- +name: AQLEXP_08_explainDisableSingleRulePlans +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain({ optimizer: { rules: [ "-use-index-range", "-use-index-for-sort" ] } }); +``` + +The maximum number of plans created by the optimizer can also be limited using the +`maxNumberOfPlans` attribute: + +```js +--- +name: AQLEXP_09_explainMaxNumberOfPlans +description: '' +--- +~var stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value"); +stmt.explain({ maxNumberOfPlans: 1 }); +``` + +## Optimizer statistics + +The optimizer provides statistics as a part of an `explain` result. +The following attributes are returned in the `stats` attribute: + +- `plansCreated`: The total number of plans created by the optimizer. +- `rulesExecuted`: The number of rules executed. Note that an executed rule does + not indicate that a plan has actually been modified by a rule. +- `rulesSkipped`: The number of rules skipped by the optimizer. +- `executionTime`: The (wall-clock) time in seconds needed to explain the query. +- `peakMemoryUsage`: The maximum memory usage of the query during explain. + +## Warnings + +For some queries, the optimizer may produce warnings. These are returned in +the `warnings` attribute of the `explain` result: + +```js +--- +name: AQLEXP_10_explainWarn +description: '' +--- +var stmt = db._createStatement("FOR i IN 1..10 RETURN 1 / 0") +stmt.explain().warnings; +~db._drop("test") +~removeIgnoreCollection("test") +``` + +There is an upper bound on the number of warnings a query may produce. If that +bound is reached, no further warnings are returned. + +## Optimization in a cluster + +When you are running AQL in the cluster, the parsing of the query is done on the +Coordinator. The Coordinator then chops the query into snippets, which are either +to remain on the Coordinator or need to be distributed to the shards on the +DB-Servers over the network. The cutting sites are interconnected via `ScatterNode`s, +`GatherNode`s and `RemoteNode`s. These nodes mark the network borders of the snippets. + +The optimizer strives to reduce the amount of data transferred via these network +interfaces by pushing `FILTER`s out to the shards, as it is vital to the query +performance to reduce that data amount to transfer over the network links. + +{{< info >}} +Some hops between Coordinators and DB-Servers are unavoidable. An example are +[user-defined functions](../user-defined-functions.md) (UDFs), which have to be executed on +the Coordinator. If you cannot modify your query to have a lower amount of +back and forth between sites, then try to lower the amount of data that has +to be transferred between them. In case of UDFs, use effective FILTERs before +calling them. +{{< /info >}} + +Using a cluster, there is a **Site** column if you explain a query. +Snippets marked with **DBS** are executed on DB-Servers, **COOR** ones are +executed on the respective Coordinator. + +```aql +Query String (57 chars, cacheable: false): + FOR doc IN test UPDATE doc WITH { updated: true } IN test + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 CalculationNode DBS 1 - LET #3 = { "updated" : true } + 13 IndexNode DBS 1000000 - FOR doc IN test /* primary index scan, index only, projections: `_key`, 5 shard(s) */ + 4 UpdateNode DBS 0 - UPDATE doc WITH #3 IN test + 7 RemoteNode COOR 0 - REMOTE + 8 GatherNode COOR 0 - GATHER +``` + +## Execution nodes + +### List of execution nodes + +The following execution node types appear in the output of `explain`: + +- **CalculationNode**: + Evaluates an expression. The expression result may be used by + other nodes, e.g. `FilterNode`, `EnumerateListNode`, `SortNode` etc. + +- **CollectNode**: + Aggregates its input and produces new output variables. This appears + once per `COLLECT` statement. + +- **EnumerateCollectionNode**: + Enumeration over documents of a collection (given in its *collection* + attribute) without using an index. + +- **EnumerateListNode**: + Enumeration over a list of (non-collection) values. + +- **EnumerateViewNode**: + Enumeration over documents of a View. + +- **FilterNode**: + Only lets values pass that satisfy a filter condition. Appears once + per `FILTER` statement. + +- **IndexNode**: + Enumeration over one or many indexes (given in its *indexes* attribute) + of a collection. The index ranges are specified in the *condition* attribute + of the node. + +- **InsertNode**: + Inserts documents into a collection (given in its *collection* attribute). + Appears exactly once in a query that contains an *INSERT* statement. + +- **KShortestPathsNode**: + Indicates a traversal for k Shortest Paths (`K_SHORTEST_PATHS` in AQL). + +- **KPathsNode**: + Indicates a traversal for k Paths (`K_PATHS` in AQL). + +- **LimitNode**: + Limits the number of results passed to other processing steps. Appears + once per `LIMIT` statement. + +- **MaterializeNode**: + The presence of this node means that the query is not fully covered by + indexes and therefore needs to involve the storage engine. + +- **RemoveNode**: + Removes documents from a collection (given in its *collection* attribute). + Appears exactly once in a query that contains a `REMOVE` statement. + +- **ReplaceNode**: + Replaces documents in a collection (given in its *collection* attribute). + Appears exactly once in a query that contains a `REPLACE` statement. + +- **ReturnNode**: + Returns data to the caller. Appears in each read-only query at + least once. Subqueries also contain `ReturnNode`s. + +- **SingletonNode**: + The purpose of a `SingletonNode` is to produce an empty document that is + used as input for other processing steps. Each execution plan contains + exactly one `SingletonNode` as its top node. + +- **ShortestPathNode**: + Indicates a traversal for a Shortest Path (`SHORTEST_PATH` in AQL). + +- **SortNode**: + Performs a sort of its input values. + +- **SubqueryEndNode**: + End of a spliced (inlined) subquery. + +- **SubqueryNode**: + Executes a subquery. + +- **SubqueryStartNode**: + Beginning of a spliced (inlined) subquery. + +- **TraversalNode**: + Indicates a regular graph traversal, as opposed to a shortest path(s) + traversal. + +- **UpdateNode**: + Updates documents in a collection (given in its *collection* attribute). + Appears exactly once in a query that contains an `UPDATE` statement. + +- **UpsertNode**: + Upserts documents in a collection (given in its *collection* attribute). + Appears exactly once in a query that contains an `UPSERT` statement. + +### List of cluster execution nodes + +For queries in the cluster, the following additional nodes may appear in +execution plans: + +- **DistributeNode**: + Used on a Coordinator to fan-out data to one or multiple shards, + taking into account a collection's shard key. + +- **GatherNode**: + Used on a Coordinator to aggregate results from one or many shards + into a combined stream of results. Parallelizes work for certain types + of queries when there are multiple DB-Servers involved + (shown as `GATHER /* parallel */` in query explain). + +- **RemoteNode**: + A `RemoteNode` performs communication with another ArangoDB instances + in the cluster. For example, the cluster Coordinator needs to communicate + with other servers to fetch the actual data from the shards. It does so + via `RemoteNode`s. The data servers themselves might again pull further data + from the Coordinator, and thus might also employ `RemoteNode`s. So, all of + the above cluster relevant nodes are accompanied by a `RemoteNode`. + +- **ScatterNode**: + Used on a Coordinator to fan-out data to one or multiple shards. + +- **SingleRemoteOperationNode**: + Used on a Coordinator to directly work with a single + document on a DB-Server that is referenced by its `_key`. + +- **MultipleRemoteExecutionNode**: + Used to optimize bulk `INSERT` operations in cluster deployments, reducing the + setup and shutdown overhead and the number of internal network requests. + +## Optimizer rules + +### List of optimizer rules + +The following user-facing optimizer rules exist and are enabled by default +unless noted otherwise. You can +[enable and disable optimizer rules](#turning-specific-optimizer-rules-off) +except for a few required rules. + +Some rules exist multiple times with number suffixes like `-2`, +(e.g. `remove-unnecessary-calculations-2`). This is due to the same rule being +applied multiple times at different optimization stages. + +{{% comment %}} Execute code but exclude its output from rendering + +```js +--- +name: 00_dumpOptimizerRules +description: '' +type: cluster +--- +var url = "/_api/query/rules"; +var rules = internal.arango.GET(url); +assert(Array.isArray(rules)); +assert(rules.some(e => e.flags && e.flags.clusterOnly)); +var outfile = "Documentation/optimizer-rules.json"; +assert(fs.write(outfile, JSON.stringify(rules, undefined, 2))); +``` + +{{% /comment %}} + +{{% optimizer-rules %}} + +### Additional optimizations applied + +#### Scan-Only Optimization + +If a query iterates over a collection (for filtering or counting) but does not need +the actual document values later, the optimizer can apply a "scan-only" optimization +for `EnumerateCollectionNode` and `IndexNode` node types. In this case, it does not build up +a result with the document data at all, which may reduce work significantly. +In case the document data is actually not needed later on, it may be sensible to remove +it from query strings so the optimizer can apply the optimization. + +If the optimization is applied, it shows up as `scan only` in an AQL +query's execution plan for an `EnumerateCollectionNode` or an `IndexNode`. + +#### Index-Only Optimization + +The optimizer can apply an "index-only" optimization for AQL queries that +can satisfy the retrieval of all required document attributes directly from an index. + +This optimization is triggered if an index is used +that covers all required attributes of the document used later on in the query. +If applied, it saves retrieving the actual document data (which would require +an extra lookup by the storage engine), but instead builds the document data solely +from the index values found. It only applies when using up to 5 (or +[`maxProjections`](../high-level-operations/for.md#maxprojections)) attributes +from the document, and only if the rest of the document data is not used later +on in the query. + +The optimization is available for the following index types: `primary`, +`edge`, and `persistent`. + +If the optimization is applied, it shows up as `index only` in an AQL +query's execution plan for an `IndexNode`. + +#### Filter Projections Optimizations + +<small>Introduced: v3.10.0</small> + +If an index is used that does not cover all required attributes for the query, +but if it is followed by filter conditions that only access attributes that are +part of the index, then an optimization is applied, to only fetch matching +documents. "Part of the index" here means, that all attributes referred to in +the post-filter conditions are contained in the `fields` or `storedValues` +attributes of the index definition. + +For example, the optimization is applied in the following case: +- There is a persistent index on the attributes `[ "value1", "value2" ]` + (in this order), or there is a persistent index on just `["value1"]` and + with a `storedValues` definition of `["value2"]`. +- There is a filter condition on `value1` that can use the index, and a filter + condition on `value2` that cannot use the index (post-filter condition). + +Example query: + +```aql +FOR doc IN collection + FILTER doc.value1 == @value1 /* uses the index */ + FILTER ABS(doc.value2) != @value2 /* does not use the index */ + RETURN doc +``` + +This query's execution plan looks as follows: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 8 IndexNode 0 - FOR doc IN collection /* persistent index scan (filter projections: `value2`) */ FILTER (ABS(doc.`value2`) != 2) /* early pruning */ + 7 ReturnNode 0 - RETURN doc + +Indexes used: + By Name Type Collection Unique Sparse Cache Selectivity Fields Ranges + 8 idx_1737498319258648576 persistent collection false false false 99.96 % [ `value1`, `value2` ] (doc.`value1` == 1) +``` + +The first filter condition is transformed to an index lookup, as you can tell +from the `persistent index scan` comment and the `Indexes used` section that +shows the range `` doc.`value` == 1 ``. The post-filter condition +`FILTER ABS(doc.value2) != 2` can be recognized as such by the `early pruning` +comment that follows it. + +The `filter projections` mentioned in the above execution plan is an indicator +of the optimization being triggered. + +Instead of fetching the full documents from the storage engine for all index +entries that matched the index lookup condition, only those that also satisfy +the index lookup post-filter condition are fetched. +If the post-filter condition filters out a lot of documents, this optimization +can significantly speed up queries that produce large result sets from index +lookups but filter many of the documents away with post-filter conditions. + +Note that the optimization can also be combined with regular projections, e.g. +for the following query that returns a specific attribute from the documents +only: + +```aql +FOR doc IN collection + FILTER doc.value1 == @value1 /* uses the index */ + FILTER ABS(doc.value2) != @value2 /* does not use the index */ + RETURN doc.value3 +``` + +That query's execution plan combines projections from the index for the +post-filter condition (`filter projections`) as well as regular projections +(`projections`) for the processing parts of the query that follow the +post-filter condition: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 9 IndexNode 5000 - FOR doc IN collection /* persistent index scan (filter projections: `value2`) (projections: `value3`) */ FILTER (ABS(doc.`value2`) != 2) /* early pruning */ + 7 CalculationNode 5000 - LET #5 = doc.`value3` /* attribute expression */ /* collections used: doc : collection */ + 8 ReturnNode 5000 - RETURN #5 + +Indexes used: + By Name Type Collection Unique Sparse Cache Selectivity Fields Ranges + 9 idx_1737498319258648576 persistent collection false false false 99.96 % [ `value1`, `value2` ] (doc.`value1` == 1) +``` + +The optimization is most effective for queries in which many documents would +be selected by the index lookup condition, but many are filtered out by the +post-filter condition. diff --git a/site/content/arangodb/oem/aql/execution-and-performance/query-profiling.md b/site/content/arangodb/oem/aql/execution-and-performance/query-profiling.md new file mode 100644 index 0000000000..2f28da6760 --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/query-profiling.md @@ -0,0 +1,229 @@ +--- +title: Profiling and Hand-Optimizing AQL queries +menuTitle: Query Profiling +weight: 20 +description: >- + For understanding the performance of specific queries, you can profile them to + identify slow parts of query execution plans +--- +ArangoDB allows to execute your query with special instrumentation code enabled. +It provides you a query plan with detailed execution statistics. + +To use this in an interactive fashion on the shell you can use +`db._profileQuery(..)` in _arangosh_. Alternatively, there is a button +_Profile_ in the Query tab of the web interface. + +The printed execution plan then contains three additional columns: + +- **Call**: The number of times this query stage was executed +- **Items**: The number of temporary result rows (outputs) at this stage +- **Filtered**: The number of rows filtered away by this stage +- **Runtime**: The total time spent in this stage + +Below the execution plan there are additional sections for the overall runtime +statistics and the query profile. + +## Example: Simple AQL query + +Assuming we got a collection named `acollection` and insert 10000 documents +via `for (let i=0; i < 10000;i++) db.acollection.insert({value:i})`. +Then a simple query filtering for `value < 10` will return 10 results: + +```js +--- +name: 01_workWithAQL_profileQuerySimple +description: '' +--- +~db._drop("acollection"); +~db._create('acollection'); +~for (let i=0; i < 10000; i++) { db.acollection.insert({value:i}); } +db._profileQuery(` + FOR doc IN acollection + FILTER doc.value < 10 + RETURN doc`, {}, {colors: false} +); +~db._drop("acollection"); +``` + +An AQL query is essentially executed in a pipeline that chains together different +functional execution blocks. Each block gets the input rows from the parent above +it, does some processing and then outputs a certain number of output rows. + +Without any detailed insight into the query execution it is impossible to tell +how many results each pipeline-block had to work on and how long this took. +By executing the query with the query profiler (`db._profileQuery()` or via +the _Profile_ button in the web interface) you can check exactly how much work +each stage had to do. + +Without any indexes this query should have to perform the following operations: + +1. Perform a full collection scan via a _EnumerateCollectionNode_ and outputting + a row containing the document in `doc`. +2. Calculate the boolean expression `LET #1 = doc.value < 10` from all inputs + via a _CalculationNode_ +3. Filter out all input rows where `#1` is false via the _FilterNode_ +4. Put the `doc` variable of the remaining rows into the result set via + the _ResultNode_ + +The _EnumerateCollectionNode_ processed and returned all 10k rows (documents), +as did the _CalculationNode_. Because the AQL execution engine also uses an +internal batch size of 1000 these blocks were also called 100 times each. +The _FilterNode_ as well as the _ReturnNode_ however only ever returned 10 rows +and only had to be called once, because the result size fits within a single batch. + +Let us add a persistent index on `value` to speed up the query: + +```js +db.acollection.ensureIndex({type:"persistent", fields:["value"]}); +``` + +```js +--- +name: 02_workWithAQL_profileQuerySimpleIndex +description: '' +--- +~db._create('acollection'); +~db.acollection.ensureIndex({type:"persistent", fields:["value"]}); +~for (let i=0; i < 10000; i++) { db.acollection.insert({value:i}); } +db._profileQuery(` + FOR doc IN acollection + FILTER doc.value < 10 + RETURN doc`, {}, {colors: false} +); +~db._drop("acollection"); +``` + +This results in replacing the collection scan and filter block with an +`IndexNode`. The execution pipeline of the AQL query has become much shorter. +Also the number of rows processed by each pipeline block is only 10, because +we no longer need to look at all documents. + +## Example: AQL with Subquery + +Let us consider a query containing a subquery: + +```js +--- +name: 03_workWithAQL_profileQuerySubquery +description: '' +--- +~db._create('acollection'); +~db.acollection.ensureIndex({type:"persistent", fields:["value"]}); +~for (let i=0; i < 10000;i++) { db.acollection.insert({value:i}); } +db._profileQuery(` + LET list = (FOR doc in acollection FILTER doc.value > 90 RETURN doc) + FOR a IN list + FILTER a.value < 91 + RETURN a`, {}, {colors: false, optimizer:{rules:["-all"]}} +); +~db._drop("acollection"); +``` + +The resulting query profile contains a _SubqueryNode_ which has the runtime of +all its children combined. + +Actually, we cheated a little. The optimizer would have completely removed the +subquery if it had not been deactivated (`rules:["-all"]`). The optimized +version would take longer in the "optimizing plan" stage, but should perform +better with a lot of results. + +## Example: AQL with Aggregation + +Let us try a more advanced query, using a [COLLECT](../high-level-operations/collect.md) +statement. Assume we have a user collection with each document having a city, +a username and an age attribute. + +The following query gets us all age groups in buckets (0-9, 10-19, 20-29, ...): + +```js +--- +name: 04_workWithAQL_profileQueryAggregation +description: '' +--- +~db._create('myusers'); +~["berlin", "paris", "cologne", "munich", "london"].forEach((c) => { ["peter", "david", "simon", "lars"].forEach( n => db.myusers.insert({ city : c, name : n, age: Math.floor(Math.random() * 75) }) ) }); +db._profileQuery(` + FOR u IN myusers + COLLECT ageGroup = FLOOR(u.age / 10) * 10 + AGGREGATE minAge = MIN(u.age), maxAge = MAX(u.age), len = LENGTH(u) + RETURN { + ageGroup, + minAge, + maxAge, + len + }`, {}, {colors: false} +); +~db._drop("myusers") +``` + +Without any indexes this query should have to perform the following operations: + +1. Perform a full collection scan via a _EnumerateCollectionNode_ and outputting + a row containing the document in `doc`. +2. Compute the expression `LET #1 = FLOOR(u.age / 10) * 10` for all inputs via + a _CalculationNode_ +3. Perform the aggregations via the _CollectNode_ +4. Sort the resulting aggregated rows via a _SortNode_ +5. Build a result value via another _CalculationNode_ +6. Put the result variable into the result set via the _ResultNode_ + +Like within the example above, you can see that after the _CalculationNode_ +stage, from the originally 20 rows only a handful remained. + +## Typical AQL Performance Mistakes + +With the new query profiler you should be able to spot typical performance +mistakes that we see quite often: + +- Not employing indexes to speed up queries with common filter expressions +- Not using shard keys in filter statements, when it is known + (only a cluster problem) +- Using subqueries to calculate an intermediary result, but only using a + few results + +Bad example: + +```aql +LET vertices = ( + FOR v IN 1..2 ANY @startVertex GRAPH 'my_graph' + // <-- add a LIMIT 1 here + RETURN v +) +FOR doc IN collection + FILTER doc.value == vertices[0].value + RETURN doc +``` + +Adding a `LIMIT 1` into the subquery should result in better performance, +because the traversal can be stopped after the first result instead of +computing all paths. + +Another mistake is to start a graph traversal from the wrong side +(if both ends are known). + +Assume we have two vertex collections _users_ and _products_ as well as an +edge collection _purchased_. The graph model looks like this: +`(users) <--[purchased]--> (products)`, i.e. every user is connected with an +edge in _purchased_ to zero or more _products_. + +If we want to know all users that have purchased the product _playstation_ +as well as products of `type` _legwarmer_ we could use this query: + +```aql +FOR prod IN products + FILTER prod.type == 'legwarmer' + FOR v,e,p IN 2..2 OUTBOUND prod purchased + FILTER v._key == 'playstation' // <-- last vertex of the path + RETURN p.vertices[1] // <-- the user +``` + +This query first finds all legwarmer products and then performs a traversal +for each of them. But we could also inverse the traversal by starting of with +the known _playstation_ product. This way we only need a single traversal +to achieve the same result: + +```aql +FOR v,e,p IN 2..2 OUTBOUND 'product/playstation' purchased + FILTER v.type == 'legwarmer' // <-- last vertex of the path + RETURN p.vertices[1] // <-- the user +``` diff --git a/site/content/arangodb/oem/aql/execution-and-performance/query-statistics.md b/site/content/arangodb/oem/aql/execution-and-performance/query-statistics.md new file mode 100644 index 0000000000..907a29dc30 --- /dev/null +++ b/site/content/arangodb/oem/aql/execution-and-performance/query-statistics.md @@ -0,0 +1,98 @@ +--- +title: AQL query statistics +menuTitle: Query statistics +weight: 5 +description: >- + All queries that have successfully run to completion return statistics about + the execution +--- +Execution statistics can be retrieved by calling `getExtra()` on the cursor. +The statistics are returned in the return value's `stats` attribute: + +```js +--- +name: 06_workWithAQL_statementsExtra +description: '' +--- +db._query(` + FOR i IN 1..@count + INSERT { _key: CONCAT('anothertest', TO_STRING(i)) } INTO mycollection`, + { count: 100 }, + {}, + { fullCount: true } +).getExtra(); + +db._query({ + "query": ` + FOR i IN 200..@count + INSERT { _key: CONCAT('anothertest', TO_STRING(i)) } INTO mycollection`, + "bindVars": { count: 300 }, + "options": { fullCount: true } +}).getExtra(); +``` + +The meaning of the statistics attributes is as follows: + +- **writesExecuted**: The total number of data-modification operations successfully executed. + This is equivalent to the number of documents created, updated, or removed by `INSERT`, + `UPDATE`, `REPLACE`, `REMOVE`, or `UPSERT` operations. +- **writesIgnored**: The total number of data-modification operations that were unsuccessful, + but have been ignored because of the `ignoreErrors` query option. +- **scannedFull**: The total number of documents iterated over when scanning a collection + without an index. Documents scanned by subqueries are included in the result, but + operations triggered by built-in or user-defined AQL functions are not. +- **scannedIndex**: The total number of documents iterated over when scanning a collection using + an index. Documents scanned by subqueries are included in the result, but operations + triggered by built-in or user-defined AQL functions are not. +- **cursorsCreated**: The total number of cursor objects created during query execution. Cursor + objects are created for index lookups. +- **cursorsRearmed**: The total number of times an existing cursor object was repurposed. + Repurposing an existing cursor object is normally more efficient compared to destroying an + existing cursor object and creating a new one from scratch. +- **cacheHits**: The total number of index entries read from in-memory caches for indexes + of type edge or persistent. This value is only non-zero when reading from indexes + that have an in-memory cache enabled, and when the query allows using the in-memory + cache (i.e. using equality lookups on all index attributes). +- **cacheMisses**: The total number of cache read attempts for index entries that could not + be served from in-memory caches for indexes of type edge or persistent. This value + is only non-zero when reading from indexes that have an in-memory cache enabled, the + query allows using the in-memory cache (i.e. using equality lookups on all index attributes) + and the looked up values are not present in the cache. +- **filtered**: The total number of documents removed after executing a filter condition + in a `FilterNode` or another node that post-filters data. Note that nodes of the + `IndexNode` type can also filter documents by selecting only the required index range + from a collection, and the `filtered` value only indicates how much filtering was done by a + post-filter in the `IndexNode` itself or following `FilterNode` nodes. + Nodes of the `EnumerateCollectionNode` and `TraversalNode` types can also apply + filter conditions and can report the number of filtered documents. +- **httpRequests**: The total number of cluster-internal HTTP requests performed. +- **fullCount** (_optional_): The total number of documents that matched the search condition if the query's + final top-level `LIMIT` operation were not present. + This attribute may only be returned if the `fullCount` option was set when starting the + query and only contains a sensible value if the query contains a `LIMIT` operation on + the top level. +- **executionTime**: The query execution time (wall-clock time) in seconds. +- **peakMemoryUsage**: The maximum memory usage of the query while it was running. In a cluster, + the memory accounting is done per shard, and the memory usage reported is the peak + memory usage value from the individual shards. + Note that to keep things light-weight, the per-query memory usage is tracked on a relatively + high level, not including any memory allocator overhead nor any memory used for temporary + results calculations (e.g. memory allocated/deallocated inside AQL expressions and function + calls). +- **intermediateCommits**: + The total number of intermediate commits the query has performed. This number + can only be greater than zero for data-modification queries that perform + modifications beyond the `--rocksdb.intermediate-commit-count` or + `--rocksdb.intermediate-commit-size` thresholds. In a cluster, the + intermediate commits are tracked per DB-Server that participates in the query + and are summed up in the end. +- **nodes** (_optional_): When the query is executed with the option `profile` set to at least `2`, + then this value contains runtime statistics per query execution node. + For a human readable output you can execute `db._profileQuery(<query>, <bind-vars>)` + in the arangosh. + - **id**: The execution node ID to correlate the statistics with the `plan` returned in + the `extra` attribute. + - **calls**: The number of calls to this node. + - **items**: The number of items returned by this node. Items are the temporary results + returned at this stage. + - **runtime**: The execution time of this node in seconds. diff --git a/site/content/arangodb/oem/aql/functions/_index.md b/site/content/arangodb/oem/aql/functions/_index.md new file mode 100644 index 0000000000..b38aa556de --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/_index.md @@ -0,0 +1,37 @@ +--- +title: AQL functions +menuTitle: Functions +weight: 30 +description: >- + AQL offers an extensive set of functions to allow for complex computations + and it supports user-defined functions +--- +Functions can be called at any query position where an expression is allowed. +The general function call syntax is: + +```aql +FUNCTIONNAME(arguments) +``` + +`FUNCTIONNAME` is the name of the function to be called, and `arguments` +is a comma-separated list of function arguments. If a function does not need any +arguments, the argument list can be left empty. However, even if the argument +list is empty, the parentheses around it are still mandatory to make function +calls distinguishable from variable names. + +Some example function calls: + +```aql +HAS(user, "name") +LENGTH(friends) +COLLECTIONS() +``` + +In contrast to collection and variable names, function names are case-insensitive, +i.e. `LENGTH(foo)` and `length(foo)` are equivalent. + +## Extending AQL + +It is possible to extend AQL with user-defined functions. These functions need to +be written in JavaScript, and have to be registered before they can be used in a query. +Please refer to [Extending AQL](../user-defined-functions.md) for more details. diff --git a/site/content/arangodb/oem/aql/functions/arangosearch.md b/site/content/arangodb/oem/aql/functions/arangosearch.md new file mode 100644 index 0000000000..2672ed25dd --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/arangosearch.md @@ -0,0 +1,1361 @@ +--- +title: ArangoSearch functions in AQL +menuTitle: ArangoSearch +weight: 5 +description: >- + ArangoSearch offers various AQL functions for search queries to control the search context, for filtering and scoring +pageToc: + maxHeadlineLevel: 3 +--- +You can form search expressions by composing ArangoSearch function calls, +logical operators and comparison operators. This allows you to filter Views +as well as to utilize inverted indexes to filter collections. + +The AQL [`SEARCH` operation](../high-level-operations/search.md) accepts search expressions, +such as `PHRASE(doc.text, "foo bar", "text_en")`, for querying Views. You can +combine ArangoSearch filter and context functions as well as operators like +`AND` and `OR` to form complex search conditions. Similarly, the +[`FILTER` operation](../high-level-operations/filter.md) accepts such search expressions +when using [inverted indexes](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md). + +Scoring functions allow you to rank matches and to sort results by relevance. +They are limited to Views. + +Search highlighting functions let you retrieve the string positions of matches. +They are limited to Views. + +You can use most functions also without an inverted index or a View and the +`SEARCH` keyword, but then they are not accelerated by an index. + +See [Information Retrieval with ArangoSearch](../../index-and-search/arangosearch/_index.md) for an +introduction. + +## Context Functions + +### ANALYZER() + +`ANALYZER(expr, analyzer) → retVal` + +Sets the Analyzer for the given search expression. + +{{< info >}} +The `ANALYZER()` function is only applicable for queries against `arangosearch` Views. + +In queries against `search-alias` Views and inverted indexes, you don't need to +specify Analyzers because every field can be indexed with a single Analyzer only +and they are inferred from the index definition. +{{< /info >}} + +The default Analyzer is `identity` for any search expression that is used for +filtering `arangosearch` Views. This utility function can be used +to wrap a complex expression to set a particular Analyzer. It also sets it for +all the nested functions which require such an argument to avoid repeating the +Analyzer parameter. If an Analyzer argument is passed to a nested function +regardless, then it takes precedence over the Analyzer set via `ANALYZER()`. + +The `TOKENS()` function is an exception. It requires the Analyzer name to be +passed in in all cases even if wrapped in an `ANALYZER()` call, because it is +not an ArangoSearch function but a regular string function which can be used +outside of `SEARCH` operations. + +- **expr** (expression): any valid search expression +- **analyzer** (string): name of an [Analyzer](../../index-and-search/analyzers.md). +- returns **retVal** (any): the expression result that it wraps + +#### Example: Using a custom Analyzer + +Assuming a View definition with an Analyzer whose name and type is `delimiter`: + +```json +{ + "links": { + "coll": { + "analyzers": [ "delimiter" ], + "includeAllFields": true, + } + }, + ... +} +``` + +… with the Analyzer properties `{ "delimiter": "|" }` and an example document +`{ "text": "foo|bar|baz" }` in the collection `coll`, the following query would +return the document: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(doc.text == "bar", "delimiter") + RETURN doc +``` + +The expression `doc.text == "bar"` has to be wrapped by `ANALYZER()` in order +to set the Analyzer to `delimiter`. Otherwise the expression would be evaluated +with the default `identity` Analyzer. `"foo|bar|baz" == "bar"` would not match, +but the View does not even process the indexed fields with the `identity` +Analyzer. The following query would also return an empty result because of +the Analyzer mismatch: + +```aql +FOR doc IN viewName + SEARCH doc.text == "foo|bar|baz" + //SEARCH ANALYZER(doc.text == "foo|bar|baz", "identity") + RETURN doc +``` + +#### Example: Setting the Analyzer context with and without `ANALYZER()` + +In below query, the search expression is swapped by `ANALYZER()` to set the +`text_en` Analyzer for both `PHRASE()` functions: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(PHRASE(doc.text, "foo") OR PHRASE(doc.text, "bar"), "text_en") + RETURN doc +``` + +Without the usage of `ANALYZER()`: + +```aql +FOR doc IN viewName + SEARCH PHRASE(doc.text, "foo", "text_en") OR PHRASE(doc.text, "bar", "text_en") + RETURN doc +``` + +#### Example: Analyzer precedence and specifics of the `TOKENS()` function + +In the following example `ANALYZER()` is used to set the Analyzer `text_en`, +but in the second call to `PHRASE()` a different Analyzer is set (`identity`) +which overrules `ANALYZER()`. Therefore, the `text_en` Analyzer is used to find +the phrase *foo* and the `identity` Analyzer to find *bar*: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(PHRASE(doc.text, "foo") OR PHRASE(doc.text, "bar", "identity"), "text_en") + RETURN doc +``` + +Despite the wrapping `ANALYZER()` function, the Analyzer name cannot be +omitted in calls to the `TOKENS()` function. Both occurrences of `text_en` +are required, to set the Analyzer for the expression `doc.text IN ...` and +for the `TOKENS()` function itself. This is because the `TOKENS()` function +is a regular string function that does not take the Analyzer context into +account: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(doc.text IN TOKENS("foo", "text_en"), "text_en") + RETURN doc +``` + +### BOOST() + +`BOOST(expr, boost) → retVal` + +Override boost in the context of a search expression with a specified value, +making it available for scorer functions. By default, the context has a boost +value equal to `1.0`. + +- **expr** (expression): any valid search expression +- **boost** (number): numeric boost value +- returns **retVal** (any): the expression result that it wraps + +#### Example: Boosting a search sub-expression + +```aql +FOR doc IN viewName + SEARCH ANALYZER(BOOST(doc.text == "foo", 2.5) OR doc.text == "bar", "text_en") + LET score = BM25(doc) + SORT score DESC + RETURN { text: doc.text, score } +``` + +Assuming a View with the following documents indexed and processed by the +`text_en` Analyzer: + +```js +{ "text": "foo bar" } +{ "text": "foo" } +{ "text": "bar" } +{ "text": "foo baz" } +{ "text": "baz" } +``` + +… the result of above query would be: + +```json +[ + { + "text": "foo bar", + "score": 2.787301540374756 + }, + { + "text": "foo baz", + "score": 1.6895781755447388 + }, + { + "text": "foo", + "score": 1.525835633277893 + }, + { + "text": "bar", + "score": 0.9913395643234253 + } +] +``` + +## Filter Functions + +### EXISTS() + +{{< info >}} +If you use `arangosearch` Views, the `EXISTS()` function only matches values if +you set the **storeValues** link property to `"id"` in the View definition +(the default is `"none"`). +{{< /info >}} + +#### Testing for attribute presence + +`EXISTS(path)` + +Match documents where the attribute at `path` is present. + +- **path** (attribute path expression): the attribute to test in the document +- returns nothing: the function evaluates to a boolean, but this value cannot be + returned. The function can only be called in a search expression. It throws + an error if used outside of a [`SEARCH` operation](../high-level-operations/search.md) or + a `FILTER` operation that uses an inverted index. + +```aql +FOR doc IN viewName + SEARCH EXISTS(doc.text) + RETURN doc +``` + +#### Testing for attribute type + +`EXISTS(path, type)` + +Match documents where the attribute at `path` is present _and_ is of the +specified data type. + +- **path** (attribute path expression): the attribute to test in the document +- **type** (string): data type to test for, can be one of: + - `"null"` + - `"bool"` / `"boolean"` + - `"numeric"` + - `"type"` (matches `null`, `boolean`, and `numeric` values) + - `"string"` + - `"analyzer"` (see below) +- returns nothing: the function evaluates to a boolean, but this value cannot be + returned. The function can only be called in a search expression. It throws + an error if used outside of a [`SEARCH` operation](../high-level-operations/search.md) or + a `FILTER` operation that uses an inverted index. + +```aql +FOR doc IN viewName + SEARCH EXISTS(doc.text, "string") + RETURN doc +``` + +#### Testing for Analyzer index status + +`EXISTS(path, "analyzer", analyzer)` + +Match documents where the attribute at `path` is present _and_ was indexed +by the specified `analyzer`. + +- **path** (attribute path expression): the attribute to test in the document +- **type** (string): string literal `"analyzer"` +- **analyzer** (string, _optional_): name of an [Analyzer](../../index-and-search/analyzers.md). + Uses the Analyzer of a wrapping `ANALYZER()` call if not specified or + defaults to `"identity"` +- returns nothing: the function evaluates to a boolean, but this value cannot be + returned. The function can only be called in a search expression. It throws + an error if used outside of a [`SEARCH` operation](../high-level-operations/search.md) or + a `FILTER` operation that uses an inverted index. + +```aql +FOR doc IN viewName + SEARCH EXISTS(doc.text, "analyzer", "text_en") + RETURN doc +``` + +#### Testing for nested fields + +`EXISTS(path, "nested")` + +Match documents where the attribute at `path` is present _and_ is indexed +as a nested field for [nested search with Views](../../index-and-search/arangosearch/nested-search.md) +or [inverted indexes](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md#nested-search-enterprise-edition). + +- **path** (attribute path expression): the attribute to test in the document +- **type** (string): string literal `"nested"` +- returns nothing: the function evaluates to a boolean, but this value cannot be + returned. The function can only be called in a search expression. It throws + an error if used outside of a [`SEARCH` operation](../high-level-operations/search.md) or + a `FILTER` operation that uses an inverted index. + +**Examples** + +Only return documents from the View `viewName` whose `text` attribute is indexed +as a nested field: + +```aql +FOR doc IN viewName + SEARCH EXISTS(doc.text, "nested") + RETURN doc +``` + +Only return documents whose `attr` attribute and its nested `text` attribute are +indexed as nested fields: + +```aql +FOR doc IN viewName + SEARCH doc.attr[? FILTER EXISTS(CURRENT.text, "nested")] + RETURN doc +``` + +Only return documents from the collection `coll` whose `text` attribute is indexed +as a nested field by an inverted index: + +```aql +FOR doc IN coll OPTIONS { indexHint: "inv-idx", forceIndexHint: true } + FILTER EXISTS(doc.text, "nested") + RETURN doc +``` + +Only return documents whose `attr` attribute and its nested `text` attribute are +indexed as nested fields: + +```aql +FOR doc IN coll OPTIONS { indexHint: "inv-idx", forceIndexHint: true } + FILTER doc.attr[? FILTER EXISTS(CURRENT.text, "nested")] + RETURN doc +``` + +### IN_RANGE() + +`IN_RANGE(path, low, high, includeLow, includeHigh) → included` + +Match documents where the attribute at `path` is greater than (or equal to) +`low` and less than (or equal to) `high`. + +You can use `IN_RANGE()` for searching more efficiently compared to an equivalent +expression that combines two comparisons with a logical conjunction: + +- `IN_RANGE(path, low, high, true, true)` instead of `low <= value AND value <= high` +- `IN_RANGE(path, low, high, true, false)` instead of `low <= value AND value < high` +- `IN_RANGE(path, low, high, false, true)` instead of `low < value AND value <= high` +- `IN_RANGE(path, low, high, false, false)` instead of `low < value AND value < high` + +`low` and `high` can be numbers or strings (technically also `null`, `true` +and `false`), but the data type must be the same for both. + +{{< warning >}} +The alphabetical order of characters is not taken into account by ArangoSearch, +i.e. range queries in SEARCH operations against Views will not follow the +language rules as per the defined Analyzer locale (except for the +[`collation` Analyzer](../../index-and-search/analyzers.md#collation)) nor the server language +(startup option `--default-language`)! +Also see [Known Issues](../../release-notes/version-3.11/known-issues-in-3-11.md#arangosearch). +{{< /warning >}} + +There is a corresponding [`IN_RANGE()` Miscellaneous Function](miscellaneous.md#in_range) +that is used outside of `SEARCH` operations. + +- **path** (attribute path expression): + the path of the attribute to test in the document +- **low** (number\|string): minimum value of the desired range +- **high** (number\|string): maximum value of the desired range +- **includeLow** (bool): whether the minimum value shall be included in + the range (left-closed interval) or not (left-open interval) +- **includeHigh** (bool): whether the maximum value shall be included in + the range (right-closed interval) or not (right-open interval) +- returns **included** (bool): whether `value` is in the range + +If `low` and `high` are the same, but `includeLow` and/or `includeHigh` is set +to `false`, then nothing will match. If `low` is greater than `high` nothing will +match either. + +#### Example: Using numeric ranges + +To match documents with the attribute `value >= 3` and `value <= 5` using the +default `"identity"` Analyzer you would write the following query: + +```aql +FOR doc IN viewName + SEARCH IN_RANGE(doc.value, 3, 5, true, true) + RETURN doc.value +``` + +This will also match documents which have an array of numbers as `value` +attribute where at least one of the numbers is in the specified boundaries. + +#### Example: Using string ranges + +Using string boundaries and a text Analyzer allows to match documents which +have at least one token within the specified character range: + +```aql +FOR doc IN valView + SEARCH ANALYZER(IN_RANGE(doc.value, "a","f", true, false), "text_en") + RETURN doc +``` + +This will match `{ "value": "bar" }` and `{ "value": "foo bar" }` because the +_b_ of _bar_ is in the range (`"a" <= "b" < "f"`), but not `{ "value": "foo" }` +because the _f_ of _foo_ is excluded (`high` is "f" but `includeHigh` is false). + +### MIN_MATCH() + +`MIN_MATCH(expr1, ... exprN, minMatchCount) → fulfilled` + +Match documents where at least `minMatchCount` of the specified +search expressions are satisfied. + +There is a corresponding [`MIN_MATCH()` Miscellaneous function](miscellaneous.md#min_match) +that is used outside of `SEARCH` operations. + +- **expr** (expression, _repeatable_): any valid search expression +- **minMatchCount** (number): minimum number of search expressions that should + be satisfied +- returns **fulfilled** (bool): whether at least `minMatchCount` of the + specified expressions are `true` + +#### Example: Matching a subset of search sub-expressions + +Assuming a View with a text Analyzer, you may use it to match documents where +the attribute contains at least two out of three tokens: + +```aql +LET t = TOKENS("quick brown fox", "text_en") +FOR doc IN viewName + SEARCH ANALYZER(MIN_MATCH(doc.text == t[0], doc.text == t[1], doc.text == t[2], 2), "text_en") + RETURN doc.text +``` + +This will match `{ "text": "the quick brown fox" }` and `{ "text": "some brown fox" }`, +but not `{ "text": "snow fox" }` which only fulfills one of the conditions. + +Note that you can also use the `AT LEAST` [array comparison operator](../high-level-operations/search.md#array-comparison-operators) +in the specific case of matching a subset of tokens against a single attribute: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(TOKENS("quick brown fox", "text_en") AT LEAST (2) == doc.text, "text_en") + RETURN doc.text +``` + +### MINHASH_MATCH() + +`MINHASH_MATCH(path, target, threshold, analyzer) → fulfilled` + +Match documents with an approximate Jaccard similarity of at least the +`threshold`, approximated with the specified `minhash` Analyzer. + +To only compute the MinHash signatures, see the +[`MINHASH()` Miscellaneous function](miscellaneous.md#minhash). + +- **path** (attribute path expression\|string): the path of the attribute in + a document or a string +- **target** (string): the string to hash with the specified Analyzer and to + compare against the stored attribute +- **threshold** (number, _optional_): a value between `0.0` and `1.0`. +- **analyzer** (string): the name of a [`minhash` Analyzer](../../index-and-search/analyzers.md#minhash). +- returns **fulfilled** (bool): `true` if the approximate Jaccard similarity + is greater than or equal to the specified threshold, `false` otherwise + +#### Example: Find documents with a text similar to a target text + +Assuming a View with a `minhash` Analyzer, you can use the stored +MinHash signature to find candidates for the more expensive Jaccard similarity +calculation: + +```aql +LET target = "the quick brown fox jumps over the lazy dog" +LET targetSignature = TOKENS(target, "myMinHash") + +FOR doc IN viewName + SEARCH MINHASH_MATCH(doc.text, target, 0.5, "myMinHash") // approximation + LET jaccard = JACCARD(targetSignature, TOKENS(doc.text, "myMinHash")) + FILTER jaccard > 0.75 + SORT jaccard DESC + RETURN doc.text +``` + +### NGRAM_MATCH() + +`NGRAM_MATCH(path, target, threshold, analyzer) → fulfilled` + +Match documents whose attribute value has an +[_n_-gram similarity](https://webdocs.cs.ualberta.ca/~kondrak/papers/spire05.pdf) +higher than the specified threshold compared to the target value. + +The similarity is calculated by counting how long the longest sequence of +matching _n_-grams is, divided by the target's total _n_-gram count. +Only fully matching _n_-grams are counted. + +The _n_-grams for both attribute and target are produced by the specified +Analyzer. Increasing the _n_-gram length will increase accuracy, but reduce +error tolerance. In most cases a size of 2 or 3 will be a good choice. + +Also see the String Functions +[`NGRAM_POSITIONAL_SIMILARITY()`](string.md#ngram_positional_similarity) +and [`NGRAM_SIMILARITY()`](string.md#ngram_similarity) +for calculating _n_-gram similarity that cannot be accelerated by a View index. + +- **path** (attribute path expression\|string): the path of the attribute in + a document or a string +- **target** (string): the string to compare against the stored attribute +- **threshold** (number, _optional_): a value between `0.0` and `1.0`. Defaults + to `0.7` if none is specified. +- **analyzer** (string): the name of an [Analyzer](../../index-and-search/analyzers.md). +- returns **fulfilled** (bool): `true` if the evaluated _n_-gram similarity value + is greater than or equal to the specified threshold, `false` otherwise + +{{< info >}} +Use an Analyzer of type `ngram` with `preserveOriginal: false` and `min` equal +to `max`. Otherwise, the similarity score calculated internally will be lower +than expected. + +The Analyzer must have the `"position"` and `"frequency"` features enabled or +the `NGRAM_MATCH()` function will not find anything. +{{< /info >}} + +#### Example: Using a custom bigram Analyzer + +Given a View indexing an attribute `text`, a custom _n_-gram Analyzer `"bigram"` +(`min: 2, max: 2, preserveOriginal: false, streamType: "utf8"`) and a document +`{ "text": "quick red fox" }`, the following query would match it (with a +threshold of `1.0`): + +```aql +FOR doc IN viewName + SEARCH NGRAM_MATCH(doc.text, "quick fox", "bigram") + RETURN doc.text +``` + +The following will also match (note the low threshold value): + +```aql +FOR doc IN viewName + SEARCH NGRAM_MATCH(doc.text, "quick blue fox", 0.4, "bigram") + RETURN doc.text +``` + +The following will not match (note the high threshold value): + +```aql +FOR doc IN viewName + SEARCH NGRAM_MATCH(doc.text, "quick blue fox", 0.9, "bigram") + RETURN doc.text +``` + +#### Example: Using constant values + +`NGRAM_MATCH()` can be called with constant arguments, but for such calls the +`analyzer` argument is mandatory (even for calls inside of a `SEARCH` clause): + +```aql +FOR doc IN viewName + SEARCH NGRAM_MATCH("quick fox", "quick blue fox", 0.9, "bigram") + RETURN doc.text +``` + +```aql +RETURN NGRAM_MATCH("quick fox", "quick blue fox", "bigram") +``` + +### PHRASE() + +`PHRASE(path, phrasePart, analyzer)` + +`PHRASE(path, phrasePart1, skipTokens1, ... phrasePartN, skipTokensN, analyzer)` + +`PHRASE(path, [ phrasePart1, skipTokens1, ... phrasePartN, skipTokensN ], analyzer)` + +Search for a phrase in the referenced attribute. It only matches documents in +which the tokens appear in the specified order. To search for tokens in any +order use [`TOKENS()`](string.md#tokens) instead. + +The phrase can be expressed as an arbitrary number of `phraseParts` separated by +*skipTokens* number of tokens (wildcards), either as separate arguments or as +array as second argument. + +- **path** (attribute path expression): the attribute to test in the document +- **phrasePart** (string\|array\|object): text to search for in the tokens. + Can also be an [array](#example-using-phrase-with-an-array-of-tokens) + comprised of string, array and [object tokens](#object-tokens), or tokens + interleaved with numbers of `skipTokens`. The specified `analyzer` is applied + to string and array tokens, but not for object tokens. +- **skipTokens** (number, _optional_): amount of tokens to treat + as wildcards +- **analyzer** (string, _optional_): name of an [Analyzer](../../index-and-search/analyzers.md). + Uses the Analyzer of a wrapping `ANALYZER()` call if not specified or + defaults to `"identity"` +- returns nothing: the function evaluates to a boolean, but this value cannot be + returned. The function can only be called in a search expression. It throws + an error if used outside of a [`SEARCH` operation](../high-level-operations/search.md) or + a `FILTER` operation that uses an inverted index. + +{{< info >}} +The selected Analyzer must have the `"position"` and `"frequency"` features +enabled. The `PHRASE()` function will otherwise not find anything. +{{< /info >}} + +#### Object tokens + +- `{IN_RANGE: [low, high, includeLow, includeHigh]}`: + see [`IN_RANGE()`](#in_range). *low* and *high* can only be strings. +- `{LEVENSHTEIN_MATCH: [token, maxDistance, transpositions, maxTerms, prefix]}`: + - `token` (string): a string to search + - `maxDistance` (number): maximum Levenshtein / Damerau-Levenshtein distance + - `transpositions` (bool, _optional_): if set to `false`, a Levenshtein + distance is computed, otherwise a Damerau-Levenshtein distance (default) + - `maxTerms` (number, _optional_): consider only a specified number of the + most relevant terms. One can pass `0` to consider all matched terms, but it may + impact performance negatively. The default value is `64`. + - `prefix` (string, _optional_): if defined, then a search for the exact + prefix is carried out, using the matches as candidates. The Levenshtein / + Damerau-Levenshtein distance is then computed for each candidate using the + remainders of the strings. This option can improve performance in cases where + there is a known common prefix. The default value is an empty string + (introduced in v3.7.13, v3.8.1). +- `{STARTS_WITH: [prefix]}`: see [`STARTS_WITH()`](#starts_with). + Array brackets are optional +- `{TERM: [token]}`: equal to `token` but without Analyzer tokenization. + Array brackets are optional +- `{TERMS: [token1, ..., tokenN]}`: one of `token1, ..., tokenN` can be found + in specified position. Inside an array the object syntax can be replaced with + the object field value, e.g., `[..., [token1, ..., tokenN], ...]`. +- `{WILDCARD: [token]}`: see [`LIKE()`](#like). + Array brackets are optional + +An array token inside an array can be used in the `TERMS` case only. + +Also see [Example: Using object tokens](#example-using-object-tokens). + +#### Example: Using a text Analyzer for a phrase search + +Given a View indexing an attribute `text` with the `"text_en"` Analyzer and a +document `{ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit" }`, +the following query would match it: + +```aql +FOR doc IN viewName + SEARCH PHRASE(doc.text, "lorem ipsum", "text_en") + RETURN doc.text +``` + +However, this search expression does not because the tokens `"ipsum"` and +`"lorem"` do not appear in this order: + +```aql +PHRASE(doc.text, "ipsum lorem", "text_en") +``` + +#### Example: Skip tokens for a proximity search + +To match `"ipsum"` and `"amet"` with any two tokens in between, you can use the +following search expression: + +```aql +PHRASE(doc.text, "ipsum", 2, "amet", "text_en") +``` + +The `skipTokens` value of `2` defines how many wildcard tokens have to appear +between *ipsum* and *amet*. A `skipTokens` value of `0` means that the tokens +must be adjacent. Negative values are allowed, but not very useful. These three +search expressions are equivalent: + +```aql +PHRASE(doc.text, "lorem ipsum", "text_en") +PHRASE(doc.text, "lorem", 0, "ipsum", "text_en") +PHRASE(doc.text, "ipsum", -1, "lorem", "text_en") +``` + +#### Example: Using `PHRASE()` with an array of tokens + +The `PHRASE()` function also accepts an array as second argument with +`phrasePart` and `skipTokens` parameters as elements. + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, ["quick brown fox"], "text_en") RETURN doc +FOR doc IN myView SEARCH PHRASE(doc.title, ["quick", "brown", "fox"], "text_en") RETURN doc +``` + +This syntax variation enables the usage of computed expressions: + +```aql +LET proximityCondition = [ "foo", ROUND(RAND()*10), "bar" ] +FOR doc IN viewName + SEARCH PHRASE(doc.text, proximityCondition, "text_en") + RETURN doc +``` + +```aql +LET tokens = TOKENS("quick brown fox", "text_en") // ["quick", "brown", "fox"] +FOR doc IN myView SEARCH PHRASE(doc.title, tokens, "text_en") RETURN doc +``` + +Above example is equivalent to the more cumbersome and static form: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, "quick", 0, "brown", 0, "fox", "text_en") RETURN doc +``` + +You can optionally specify the number of skipTokens in the array form before +every string element: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, ["quick", 1, "fox", "jumps"], "text_en") RETURN doc +``` + +It is the same as the following: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, "quick", 1, "fox", 0, "jumps", "text_en") RETURN doc +``` + +#### Example: Handling of arrays with no members + +Empty arrays are skipped: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, "quick", 1, [], 1, "jumps", "text_en") RETURN doc +``` + +The query is equivalent to: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, "quick", 2 "jumps", "text_en") RETURN doc +``` + +Providing only empty arrays is valid, but will yield no results. + +#### Example: Using object tokens + +Using object tokens `STARTS_WITH`, `WILDCARD`, `LEVENSHTEIN_MATCH`, `TERMS` and +`IN_RANGE`: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, + {STARTS_WITH: ["qui"]}, 0, + {WILDCARD: ["b%o_n"]}, 0, + {LEVENSHTEIN_MATCH: ["foks", 2]}, 0, + {TERMS: ["jump", "run"]}, 0, // Analyzer not applied! + {IN_RANGE: ["over", "through", true, false]}, + "text_en") RETURN doc +``` + +Note that the `text_en` Analyzer has stemming enabled, but for object tokens +the Analyzer isn't applied. `{TERMS: ["jumps", "runs"]}` would not match the +indexed (and stemmed!) attribute value. Therefore, the trailing `s` which would +be stemmed away is removed from both words manually in the example. + +Above example is equivalent to: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, +[ + {STARTS_WITH: "qui"}, 0, + {WILDCARD: "b%o_n"}, 0, + {LEVENSHTEIN_MATCH: ["foks", 2]}, 0, + ["jumps", "runs"], 0, // Analyzer is applied using this syntax + {IN_RANGE: ["over", "through", true, false]} +], "text_en") RETURN doc +``` + +### STARTS_WITH() + +`STARTS_WITH(path, prefix) → startsWith` + +Match the value of the attribute that starts with `prefix`. If the attribute +is processed by a tokenizing Analyzer (type `"text"` or `"delimiter"`) or if it +is an array, then a single token/element starting with the prefix is sufficient +to match the document. + +{{< warning >}} +The alphabetical order of characters is not taken into account by ArangoSearch, +i.e. range queries in SEARCH operations against Views will not follow the +language rules as per the defined Analyzer locale (except for the +[`collation` Analyzer](../../index-and-search/analyzers.md#collation)) nor the server language +(startup option `--default-language`)! +Also see [Known Issues](../../release-notes/version-3.11/known-issues-in-3-11.md#arangosearch). +{{< /warning >}} + +There is a corresponding [`STARTS_WITH()` String function](string.md#starts_with) +that is used outside of `SEARCH` operations. + +- **path** (attribute path expression): the path of the attribute to compare + against in the document +- **prefix** (string): a string to search at the start of the text +- returns **startsWith** (bool): whether the specified attribute starts with + the given prefix + +--- + +`STARTS_WITH(path, prefixes, minMatchCount) → startsWith` + +Match the value of the attribute that starts with one of the `prefixes`, or +optionally with at least `minMatchCount` of the prefixes. + +- **path** (attribute path expression): the path of the attribute to compare + against in the document +- **prefixes** (array): an array of strings to search at the start of the text +- **minMatchCount** (number, _optional_): minimum number of search prefixes + that should be satisfied (see + [example](#example-searching-for-one-or-multiple-prefixes)). The default is `1` +- returns **startsWith** (bool): whether the specified attribute starts with at + least `minMatchCount` of the given prefixes + +#### Example: Searching for an exact value prefix + +To match a document `{ "text": "lorem ipsum..." }` using a prefix and the +`"identity"` Analyzer you can use it like this: + +```aql +FOR doc IN viewName + SEARCH STARTS_WITH(doc.text, "lorem ip") + RETURN doc +``` + +#### Example: Searching for a prefix in text + +This query will match `{ "text": "lorem ipsum" }` as well as +`{ "text": [ "lorem", "ipsum" ] }` given a View which indexes the `text` +attribute and processes it with the `"text_en"` Analyzer: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(STARTS_WITH(doc.text, "ips"), "text_en") + RETURN doc.text +``` + +Note that it will not match `{ "text": "IPS (in-plane switching)" }` without +modification to the query. The prefixes were passed to `STARTS_WITH()` as-is, +but the built-in `text_en` Analyzer used for indexing has stemming enabled. +So the indexed values are the following: + +```aql +RETURN TOKENS("IPS (in-plane switching)", "text_en") +``` + +```json +[ + [ + "ip", + "in", + "plane", + "switch" + ] +] +``` + +The *s* is removed from *ips*, which leads to the prefix *ips* not matching +the indexed token *ip*. You may either create a custom text Analyzer with +stemming disabled to avoid this issue, or apply stemming to the prefixes: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(STARTS_WITH(doc.text, TOKENS("ips", "text_en")), "text_en") + RETURN doc.text +``` + +#### Example: Searching for one or multiple prefixes + +The `STARTS_WITH()` function accepts an array of prefix alternatives of which +only one has to match: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(STARTS_WITH(doc.text, ["something", "ips"]), "text_en") + RETURN doc.text +``` + +It will match a document `{ "text": "lorem ipsum" }` but also +`{ "text": "that is something" }`, as at least one of the words start with a +given prefix. + +The same query again, but with an explicit `minMatchCount`: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(STARTS_WITH(doc.text, ["wrong", "ips"], 1), "text_en") + RETURN doc.text +``` + +The number can be increased to require that at least this many prefixes must +be present: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(STARTS_WITH(doc.text, ["lo", "ips", "something"], 2), "text_en") + RETURN doc.text +``` + +This will still match `{ "text": "lorem ipsum" }` because at least two prefixes +(`lo` and `ips`) are found, but not `{ "text": "that is something" }` which only +contains one of the prefixes (`something`). + +### LEVENSHTEIN_MATCH() + +`LEVENSHTEIN_MATCH(path, target, distance, transpositions, maxTerms, prefix) → fulfilled` + +Match documents with a [Damerau-Levenshtein distance](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) +lower than or equal to `distance` between the stored attribute value and +`target`. It can optionally match documents using a pure Levenshtein distance. + +See [`LEVENSHTEIN_DISTANCE()`](string.md#levenshtein_distance) +if you want to calculate the edit distance of two strings. + +- **path** (attribute path expression\|string): the path of the attribute to + compare against in the document or a string +- **target** (string): the string to compare against the stored attribute +- **distance** (number): the maximum edit distance, which can be between + `0` and `4` if `transpositions` is `false`, and between `0` and `3` if + it is `true` +- **transpositions** (bool, _optional_): if set to `false`, a Levenshtein + distance is computed, otherwise a Damerau-Levenshtein distance (default) +- **maxTerms** (number, _optional_): consider only a specified number of the + most relevant terms. One can pass `0` to consider all matched terms, but it may + impact performance negatively. The default value is `64`. +- returns **fulfilled** (bool): `true` if the calculated distance is less than + or equal to *distance*, `false` otherwise +- **prefix** (string, _optional_): if defined, then a search for the exact + prefix is carried out, using the matches as candidates. The Levenshtein / + Damerau-Levenshtein distance is then computed for each candidate using + the `target` value and the remainders of the strings, which means that the + **prefix needs to be removed from `target`** (see + [example](#example-matching-with-prefix-search)). This option can improve + performance in cases where there is a known common prefix. The default value + is an empty string (introduced in v3.7.13, v3.8.1). + +#### Example: Matching with and without transpositions + +The Levenshtein distance between _quick_ and _quikc_ is `2` because it requires +two operations to go from one to the other (remove _k_, insert _k_ at a +different position). + +```aql +FOR doc IN viewName + SEARCH LEVENSHTEIN_MATCH(doc.text, "quikc", 2, false) // matches "quick" + RETURN doc.text +``` + +The Damerau-Levenshtein distance is `1` (move _k_ to the end). + +```aql +FOR doc IN viewName + SEARCH LEVENSHTEIN_MATCH(doc.text, "quikc", 1) // matches "quick" + RETURN doc.text +``` + +#### Example: Matching with prefix search + +Match documents with a Levenshtein distance of 1 with the prefix `qui`. The edit +distance is calculated using the search term `kc` (`quikc` with the prefix `qui` +removed) and the stored value without the prefix (e.g. `ck`). The prefix `qui` +is constant. + +```aql +FOR doc IN viewName + SEARCH LEVENSHTEIN_MATCH(doc.text, "kc", 1, false, 64, "qui") // matches "quick" + RETURN doc.text +``` + +You may compute the prefix and suffix from the input string as follows: + +```aql +LET input = "quikc" +LET prefixSize = 3 +LET prefix = LEFT(input, prefixSize) +LET suffix = SUBSTRING(input, prefixSize) +FOR doc IN viewName + SEARCH LEVENSHTEIN_MATCH(doc.text, suffix, 1, false, 64, prefix) // matches "quick" + RETURN doc.text +``` + +#### Example: Basing the edit distance on string length + +You may want to pick the maximum edit distance based on string length. +If the stored attribute is the string _quick_ and the target string is +_quicksands_, then the Levenshtein distance is 5, with 50% of the +characters mismatching. If the inputs are _q_ and _qu_, then the distance +is only 1, although it is also a 50% mismatch. + +```aql +LET target = "input" +LET targetLength = LENGTH(target) +LET maxDistance = (targetLength > 5 ? 2 : (targetLength >= 3 ? 1 : 0)) +FOR doc IN viewName + SEARCH LEVENSHTEIN_MATCH(doc.text, target, maxDistance, true) + RETURN doc.text +``` + +### LIKE() + +`LIKE(path, search) → bool` + +Check whether the pattern `search` is contained in the attribute denoted by `path`, +using wildcard matching. + +- `_`: A single arbitrary character +- `%`: Zero, one or many arbitrary characters +- `\\_`: A literal underscore +- `\\%`: A literal percent sign + +{{< info >}} +Literal backlashes require different amounts of escaping depending on the +context: +- `\` in bind variables (_Table_ view mode) in the web interface (automatically + escaped to `\\` unless the value is wrapped in double quotes and already + escaped properly) +- `\\` in bind variables (_JSON_ view mode) and queries in the web interface +- `\\` in bind variables in arangosh +- `\\\\` in queries in arangosh +- Double the amount compared to arangosh in shells that use backslashes for +escaping (`\\\\` in bind variables and `\\\\\\\\` in queries) +{{< /info >}} + +Searching with the `LIKE()` function in the context of a `SEARCH` operation +is backed by View indexes. The [String `LIKE()` function](string.md#like) +is used in other contexts such as in `FILTER` operations and cannot be +accelerated by any sort of index on the other hand. Another difference is that +the ArangoSearch variant does not accept a third argument to enable +case-insensitive matching. This can be controlled with Analyzers instead. + +- **path** (attribute path expression): the path of the attribute to compare + against in the document +- **search** (string): a search pattern that can contain the wildcard characters + `%` (meaning any sequence of characters, including none) and `_` (any single + character). Literal `%` and `_` must be escaped with backslashes. +- returns **bool** (bool): `true` if the pattern is contained in `text`, + and `false` otherwise + +#### Example: Searching with wildcards + +```aql +FOR doc IN viewName + SEARCH ANALYZER(LIKE(doc.text, "foo%b_r"), "text_en") + RETURN doc.text +``` + +`LIKE` can also be used in operator form: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(doc.text LIKE "foo%b_r", "text_en") + RETURN doc.text +``` + +## Geo functions + +The following functions can be accelerated by View indexes. There are +corresponding [Geo Functions](geo.md) for the regular geo index +type, but also general purpose functions such as GeoJSON constructors that can +be used in conjunction with ArangoSearch. + +### GEO_CONTAINS() + +<small>Introduced in: v3.8.0</small> + +`GEO_CONTAINS(geoJsonA, geoJsonB) → bool` + +Checks whether the [GeoJSON object](geo.md#geojson) `geoJsonA` +fully contains `geoJsonB` (every point in B is also in A). + +- **geoJsonA** (object\|array): first GeoJSON object or coordinate array + (in longitude, latitude order) +- **geoJsonB** (object\|array): second GeoJSON object or coordinate array + (in longitude, latitude order) +- returns **bool** (bool): `true` when every point in B is also contained in A, + `false` otherwise + +### GEO_DISTANCE() + +<small>Introduced in: v3.8.0</small> + +`GEO_DISTANCE(geoJsonA, geoJsonB) → distance` + +Return the distance between two [GeoJSON objects](geo.md#geojson), +measured from the `centroid` of each shape. + +- **geoJsonA** (object\|array): first GeoJSON object or coordinate array + (in longitude, latitude order) +- **geoJsonB** (object\|array): second GeoJSON object or coordinate array + (in longitude, latitude order) +- returns **distance** (number): the distance between the centroid points of + the two objects on the reference ellipsoid + +### GEO_IN_RANGE() + +<small>Introduced in: v3.8.0</small> + +`GEO_IN_RANGE(geoJsonA, geoJsonB, low, high, includeLow, includeHigh) → bool` + +Checks whether the distance between two [GeoJSON objects](geo.md#geojson) +lies within a given interval. The distance is measured from the `centroid` of +each shape. + +- **geoJsonA** (object\|array): first GeoJSON object or coordinate array + (in longitude, latitude order) +- **geoJsonB** (object\|array): second GeoJSON object or coordinate array + (in longitude, latitude order) +- **low** (number): minimum value of the desired range +- **high** (number): maximum value of the desired range +- **includeLow** (bool, optional): whether the minimum value shall be included + in the range (left-closed interval) or not (left-open interval). The default + value is `true` +- **includeHigh** (bool): whether the maximum value shall be included in the + range (right-closed interval) or not (right-open interval). The default value + is `true` +- returns **bool** (bool): whether the evaluated distance lies within the range + +### GEO_INTERSECTS() + +<small>Introduced in: v3.8.0</small> + +`GEO_INTERSECTS(geoJsonA, geoJsonB) → bool` + +Checks whether the [GeoJSON object](geo.md#geojson) `geoJsonA` +intersects with `geoJsonB` (i.e. at least one point of B is in A or vice versa). + +- **geoJsonA** (object\|array): first GeoJSON object or coordinate array + (in longitude, latitude order) +- **geoJsonB** (object\|array): second GeoJSON object or coordinate array + (in longitude, latitude order) +- returns **bool** (bool): `true` if A and B intersect, `false` otherwise + +## Scoring Functions + +Scoring functions return a ranking value for the documents found by a +[SEARCH operation](../high-level-operations/search.md). The better the documents match +the search expression the higher the returned number. + +The first argument to any scoring function is always the document emitted by +a `FOR` operation over an `arangosearch` View. + +To sort the result set by relevance, with the more relevant documents coming +first, sort in **descending order** by the score (e.g. `SORT BM25(...) DESC`). + +You may calculate custom scores based on a scoring function using document +attributes and numeric functions (e.g. `TFIDF(doc) * LOG(doc.value)`): + +```aql +FOR movie IN imdbView + SEARCH PHRASE(movie.title, "Star Wars", "text_en") + SORT BM25(movie) * LOG(movie.runtime + 1) DESC + RETURN movie +``` + +Sorting by more than one score is allowed. You may also sort by a mix of +scores and attributes from multiple Views as well as collections: + +```aql +FOR a IN viewA + FOR c IN coll + FOR b IN viewB + SORT TFIDF(b), c.name, BM25(a) + ... +``` + +### BM25() + +`BM25(doc, k, b) → score` + +Sorts documents using the +[**Best Matching 25** algorithm](https://en.wikipedia.org/wiki/Okapi_BM25) +(Okapi BM25). + +- **doc** (document): must be emitted by `FOR ... IN viewName` +- **k** (number, _optional_): calibrates the text term frequency scaling. + The value needs to be non-negative (`0.0` or higher), or the returned + score is an undefined value that may cause unpredictable results. + The default is `1.2`. A `k` value of `0` corresponds to a binary model + (no term frequency), and a large value corresponds to using raw term frequency +- **b** (number, _optional_): determines the scaling by the total text length. + The value needs to be between `0.0` and `1.0` (inclusive), or the returned + score is an undefined value that may cause unpredictable results. + The default is `0.75`. At the extreme values of the coefficient `b`, BM25 + turns into the ranking functions known as: + - BM11 for `b` = `1` (corresponds to fully scaling the term weight by the + total text length) + - BM15 for `b` = `0` (corresponds to no length normalization) +- returns **score** (number): computed ranking value + +{{< info >}} +The Analyzers used for indexing document attributes must have the `"frequency"` +feature enabled. The `BM25()` function will otherwise return a score of 0. +The Analyzers should have the `"norm"` feature enabled, too, or normalization +will be disabled, which is not meaningful for BM25 and BM11. BM15 does not need +the `"norm"` feature as it has no length normalization. +{{< /info >}} + +#### Example: Sorting by default `BM25()` score + +Sorting by relevance with BM25 at default settings: + +```aql +FOR doc IN viewName + SEARCH ... + SORT BM25(doc) DESC + RETURN doc +``` + +#### Example: Sorting with tuned `BM25()` ranking + +Sorting by relevance, with double-weighted term frequency and with full text +length normalization: + +```aql +FOR doc IN viewName + SEARCH ... + SORT BM25(doc, 2.4, 1) DESC + RETURN doc +``` + +### TFIDF() + +`TFIDF(doc, normalize) → score` + +Sorts documents using the +[**term frequency–inverse document frequency** algorithm](https://en.wikipedia.org/wiki/TF-IDF) +(TF-IDF). + +- **doc** (document): must be emitted by `FOR ... IN viewName` +- **normalize** (bool, _optional_): specifies whether scores should be + normalized. The default is `false`. +- returns **score** (number): computed ranking value + +{{< info >}} +The Analyzers used for indexing document attributes must have the `"frequency"` +feature enabled. The `TFIDF()` function will otherwise return a score of 0. +The Analyzers need to have the `"norm"` feature enabled, too, if you want to use +`TFIDF()` with the `normalize` parameter set to `true`. +{{< /info >}} + +#### Example: Sorting by default `TFIDF()` score + +Sort by relevance using the TF-IDF score: + +```aql +FOR doc IN viewName + SEARCH ... + SORT TFIDF(doc) DESC + RETURN doc +``` + +#### Example: Sorting by `TFIDF()` score with normalization + +Sort by relevance using a normalized TF-IDF score: + +```aql +FOR doc IN viewName + SEARCH ... + SORT TFIDF(doc, true) DESC + RETURN doc +``` + +#### Example: Sort by value and `TFIDF()` + +Sort by the value of the `text` attribute in ascending order, then by the TFIDF +score in descending order where the attribute values are equivalent: + +```aql +FOR doc IN viewName + SEARCH ... + SORT doc.text, TFIDF(doc) DESC + RETURN doc +``` + +## Search Highlighting Functions + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +### OFFSET_INFO() + +`OFFSET_INFO(doc, paths) → offsetInfo` + +Returns the attribute paths and substring offsets of matched terms, phrases, or +_n_-grams for search highlighting purposes. + +- **doc** (document): must be emitted by `FOR ... IN viewName` +- **paths** (string\|array): a string or an array of strings, each describing an + attribute and array element path you want to get the offsets for. Use `.` to + access nested objects, and `[n]` with `n` being an array index to specify array + elements. The attributes need to be indexed by Analyzers with the `offset` + feature enabled. +- returns **offsetInfo** (array): an array of objects, limited to a default of + 10 offsets per path. Each object has the following attributes: + - **name** (array): the attribute and array element path as an array of + strings and numbers. You can pass this name to the + [`VALUE()` function](document-object.md) to dynamically look up the value. + - **offsets** (array): an array of arrays with the matched positions. Each + inner array has two elements with the start offset and the length of a match. + + {{< warning >}} + The offsets describe the positions in bytes, not characters. You may need + to account for characters encoded using multiple bytes. + {{< /warning >}} + +--- + +`OFFSET_INFO(doc, rules) → offsetInfo` + +- **doc** (document): must be emitted by `FOR ... IN viewName` +- **rules** (array): an array of objects with the following attributes: + - **name** (string): an attribute and array element path + you want to get the offsets for. Use `.` to access nested objects, + and `[n]` with `n` being an array index to specify array elements. The + attributes need to be indexed by Analyzers with the `offset` feature enabled. + - **options** (object): an object with the following attributes: + - **maxOffsets** (number, _optional_): the total number of offsets to + collect per path. Default: `10`. + - **limits** (object, _optional_): an object with the following attributes: + - **term** (number, _optional_): the total number of term offsets to + collect per path. Default: 2<sup>32</sup>. + - **phrase** (number, _optional_): the total number of phrase offsets to + collect per path. Default: 2<sup>32</sup>. + - **ngram** (number, _optional_): the total number of _n_-gram offsets to + collect per path. Default: 2<sup>32</sup>. +- returns **offsetInfo** (array): an array of objects, each with the following + attributes: + - **name** (array): the attribute and array element path as an array of + strings and numbers. You can pass this name to the + [`VALUE()`](document-object.md) to dynamically look up the value. + - **offsets** (array): an array of arrays with the matched positions, capped + to the specified limits. Each inner array has two elements with the start + offset and the length of a match. + + {{< warning >}} + The start offsets and lengths describe the positions in bytes, not characters. + You may need to account for characters encoded using multiple bytes. + {{< /warning >}} + +**Examples** + +Search a View and get the offset information for the matches: + +```js +--- +name: aqlOffsetInfo +description: '' +--- +~db._create("food"); +~db.food.save({ name: "avocado", description: { en: "The avocado is a medium-sized, evergreen tree, native to the Americas." } }); +~db.food.save({ name: "tomato", description: { en: "The tomato is the edible berry of the tomato plant." } }); +~var analyzers = require("@arangodb/analyzers"); +~var analyzer = analyzers.save("text_en_offset", "text", { locale: "en", stopwords: [] }, ["frequency", "norm", "position", "offset"]); +~db._createView("food_view", "arangosearch", { links: { food: { fields: { description: { fields: { en: { analyzers: ["text_en_offset"] } } } } } } }); +~assert(db._query(`FOR d IN food_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 2); +db._query(` + FOR doc IN food_view + SEARCH ANALYZER(TOKENS("avocado tomato", "text_en_offset") ANY == doc.description.en, "text_en_offset") + RETURN OFFSET_INFO(doc, ["description.en"])`); +~db._dropView("food_view"); +~db._drop("food"); +~analyzers.remove(analyzer.name); +``` + +For full examples, see [Search Highlighting](../../index-and-search/arangosearch/search-highlighting.md). diff --git a/site/content/arangodb/oem/aql/functions/array.md b/site/content/arangodb/oem/aql/functions/array.md new file mode 100644 index 0000000000..74cfa4e788 --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/array.md @@ -0,0 +1,1041 @@ +--- +title: Array functions in AQL +menuTitle: Array +weight: 10 +description: >- + AQL provides functions for higher-level array manipulation in addition to + language constructs that can also be used for arrays +--- +You can use the AQL functions listed below to work with lists of items. Also +see the [numeric functions](numeric.md) for functions that work on number arrays. + +If you want to concatenate the elements of an array equivalent to `join()` +in JavaScript, see [`CONCAT()`](string.md#concat) and +[`CONCAT_SEPARATOR()`](string.md#concat_separator) in the string functions chapter. + +Apart from that, AQL also offers several language constructs: + +- simple [array access](../fundamentals/data-types.md#arrays--lists) of individual elements, +- [array operators](../operators.md#array-operators) for array expansion and contraction, + optionally with inline filter, limit and projection, +- [array comparison operators](../operators.md#array-comparison-operators) to compare + each element in an array to a value or the elements of another array, +- loop-based operations on arrays using [FOR](../high-level-operations/for.md), + [SORT](../high-level-operations/sort.md), + [LIMIT](../high-level-operations/limit.md), + as well as [COLLECT](../high-level-operations/collect.md) for grouping, + which also offers efficient aggregation. + +## APPEND() + +`APPEND(anyArray, values, unique) → newArray` + +Add all elements of an array to another array. All values are added at the end of the +array (right side). + +It can also be used to append a single element to an array. It is not necessary to wrap +it in an array (unless it is an array itself). You may also use [`PUSH()`](#push) instead. + +- **anyArray** (array): array with elements of arbitrary type +- **values** (array\|any): array, whose elements shall be added to `anyArray` +- **unique** (bool, *optional*): if set to `true`, all duplicate values are + removed from the resulting array. If `values` is an empty array or if either + `anyArray` or `values` is `null`, then the other input array is returned + unmodified. The default is `false`. +- returns **newArray** (array): the modified array + +**Examples** + +```aql +--- +name: aqlArrayAppend_1 +description: '' +--- +RETURN APPEND([ 1, 2, 3 ], [ 5, 6, 9 ]) +``` + +```aql +--- +name: aqlArrayAppend_2 +description: '' +--- +RETURN APPEND([ 1, 2, 3 ], [ 3, 4, 5, 2, 9 ], true) +``` + +## CONTAINS_ARRAY() + +This is an alias for [`POSITION()`](#position). + +## COUNT() + +This is an alias for [`LENGTH()`](#length). + +## COUNT_DISTINCT() + +`COUNT_DISTINCT(anyArray) → number` + +Get the number of distinct elements in an array. + +- **anyArray** (array): array with elements of arbitrary type +- returns **number**: the number of distinct elements in *anyArray*. + +**Examples** + +```aql +--- +name: aqlArrayCountDistinct_1 +description: '' +--- +RETURN COUNT_DISTINCT([ 1, 2, 3 ]) +``` + +```aql +--- +name: aqlArrayCountDistinct_2 +description: '' +--- +RETURN COUNT_DISTINCT([ "yes", "no", "yes", "sauron", "no", "yes" ]) +``` + +## COUNT_UNIQUE() + +This is an alias for [`COUNT_DISTINCT()`](#count_distinct). + +## FIRST() + +`FIRST(anyArray) → firstElement` + +Get the first element of an array. It is the same as `anyArray[0]`. + +- **anyArray** (array): array with elements of arbitrary type +- returns **firstElement** (any\|null): the first element of *anyArray*, or *null* if + the array is empty. + +**Examples** + +```aql +--- +name: aqlArrayFirst_1 +description: '' +--- +RETURN FIRST([ 1, 2, 3 ]) +``` + +```aql +--- +name: aqlArrayFirst_2 +description: '' +--- +RETURN FIRST([]) +``` + +## FLATTEN() + +`FLATTEN(anyArray, depth) → flatArray` + +Turn an array of arrays into a flat array. All array elements in *array* will be +expanded in the result array. Non-array elements are added as they are. The function +will recurse into sub-arrays up to the specified depth. Duplicates will not be removed. + +Also see [array contraction](../operators.md#array-contraction). + +- **array** (array): array with elements of arbitrary type, including nested arrays +- **depth** (number, *optional*): flatten up to this many levels, the default is 1 +- returns **flatArray** (array): a flattened array + +**Examples** + +```aql +--- +name: aqlArrayFlatten_1 +description: '' +--- +RETURN FLATTEN( [ 1, 2, [ 3, 4 ], 5, [ 6, 7 ], [ 8, [ 9, 10 ] ] ] ) +``` + +To fully flatten the example array, use a *depth* of 2: + +```aql +--- +name: aqlArrayFlatten_2 +description: '' +--- +RETURN FLATTEN( [ 1, 2, [ 3, 4 ], 5, [ 6, 7 ], [ 8, [ 9, 10 ] ] ], 2 ) +``` + +## INTERLEAVE() + +`INTERLEAVE(array1, array2, ... arrayN) → newArray` + +Accepts an arbitrary number of arrays and produces a new array with the elements +interleaved. It iterates over the input arrays in a round robin fashion, picks one element +from each array per iteration, and combines them in that sequence into a result array. +The input arrays can have different amounts of elements. + +- **arrays** (array, *repeatable*): an arbitrary number of arrays as multiple + arguments (at least 2) +- returns **newArray** (array): the interleaved array + +**Examples** + +```aql +--- +name: aqlArrayInterleave_1 +description: '' +--- +RETURN INTERLEAVE( [1, 1, 1], [2, 2, 2], [3, 3, 3] ) +``` + +```aql +--- +name: aqlArrayInterleave_2 +description: '' +--- +RETURN INTERLEAVE( [ 1 ], [2, 2], [3, 3, 3] ) +``` + +```aql +--- +name: aqlArrayInterleave_3 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 1..3 OUTBOUND 'places/Toronto' GRAPH 'kShortestPathsGraph' + RETURN INTERLEAVE(p.vertices[*]._id, p.edges[*]._id) +``` + +## INTERSECTION() + +`INTERSECTION(array1, array2, ... arrayN) → newArray` + +Return the intersection of all arrays specified. The result is an array of values that +occur in all arguments. + +Other set operations are [`UNION()`](#union), [`MINUS()`](#minus) and +[`OUTERSECTION()`](#outersection). + +- **arrays** (array, *repeatable*): an arbitrary number of arrays as multiple arguments + (at least 2) +- returns **newArray** (array): a single array with only the elements, which exist in all + provided arrays. The element order is random. Duplicates are removed. + +**Examples** + +```aql +--- +name: aqlArrayIntersection_1 +description: '' +--- +RETURN INTERSECTION( [1,2,3,4,5], [2,3,4,5,6], [3,4,5,6,7] ) +``` + +```aql +--- +name: aqlArrayIntersection_2 +description: '' +--- +RETURN INTERSECTION( [2,4,6], [8,10,12], [14,16,18] ) +``` + +## JACCARD() + +`JACCARD(array1, array2) → jaccardIndex` + +Calculate the [Jaccard index](https://en.wikipedia.org/wiki/Jaccard_index) +of two arrays. + +This similarity measure is also known as _Intersection over Union_ and could +be computed (less efficient and more verbose) as follows: + +```aql +COUNT(a) == 0 && COUNT(b) == 0 +? 1 // two empty sets have a similarity of 1 by definition +: COUNT(INTERSECTION(array1, array2)) / COUNT(UNION_DISTINCT(array1, array2)) +``` + +- **array1** (array): array with elements of arbitrary type +- **array2** (array): array with elements of arbitrary type +- returns **jaccardIndex** (number): calculated Jaccard index of the input + arrays *array1* and *array2* + +```aql +--- +name: aqlArrayJaccard_1 +description: '' +--- +RETURN JACCARD( [1,2,3,4], [3,4,5,6] ) +``` + +```aql +--- +name: aqlArrayJaccard_2 +description: '' +--- +RETURN JACCARD( [1,1,2,2,2,3], [2,2,3,4] ) +``` + +```aql +--- +name: aqlArrayJaccard_3 +description: '' +--- +RETURN JACCARD( [1,2,3], [] ) +``` + +```aql +--- +name: aqlArrayJaccard_4 +description: '' +--- +RETURN JACCARD( [], [] ) +``` + +## LAST() + +`LAST(anyArray) → lastElement` + +Get the last element of an array. It is the same as `anyArray[-1]`. + +- **anyArray** (array): array with elements of arbitrary type +- returns **lastElement** (any\|null): the last element of *anyArray* or *null* if the + array is empty. + +**Example** + +```aql +--- +name: aqlArrayLast_1 +description: '' +--- +RETURN LAST( [1,2,3,4,5] ) +``` + +## LENGTH() + +`LENGTH(anyArray) → length` + +Determine the number of elements in an array. + +- **anyArray** (array): array with elements of arbitrary type +- returns **length** (number): the number of array elements in *anyArray*. + +`LENGTH()` can also determine the [number of attribute keys](document-object.md#length) +of an object / document, the [amount of documents](miscellaneous.md#length) in a +collection and the [character length](string.md#length) of a string. + +| Input | Length | +|--------|--------| +| String | Number of Unicode characters | +| Number | Number of Unicode characters that represent the number | +| Array | Number of elements | +| Object | Number of first level elements | +| true | 1 | +| false | 0 | +| null | 0 | + +**Examples** + +```aql +--- +name: aqlArrayLength_1 +description: '' +--- +RETURN LENGTH( "🥑" ) +``` + +```aql +--- +name: aqlArrayLength_2 +description: '' +--- +RETURN LENGTH( 1234 ) +``` + +```aql +--- +name: aqlArrayLength_3 +description: '' +--- +RETURN LENGTH( [1,2,3,4,5,6,7] ) +``` + +```aql +--- +name: aqlArrayLength_4 +description: '' +--- +RETURN LENGTH( false ) +``` + +```aql +--- +name: aqlArrayLength_5 +description: '' +--- +RETURN LENGTH( {a:1, b:2, c:3, d:4, e:{f:5,g:6}} ) +``` + +## MINUS() + +`MINUS(array1, array2, ... arrayN) → newArray` + +Return the difference of all arrays specified. + +Other set operations are [`UNION()`](#union), [`INTERSECTION()`](#intersection) +and [`OUTERSECTION()`](#outersection). + +- **arrays** (array, *repeatable*): an arbitrary number of arrays as multiple + arguments (at least 2) +- returns **newArray** (array): an array of values that occur in the first array, + but not in any of the subsequent arrays. The order of the result array is undefined + and should not be relied on. Duplicates will be removed. + +**Example** + +```aql +--- +name: aqlArrayMinus_1 +description: '' +--- +RETURN MINUS( [1,2,3,4], [3,4,5,6], [5,6,7,8] ) +``` + +## NTH() + +`NTH(anyArray, position) → nthElement` + +Get the element of an array at a given position. It is the same as `anyArray[position]` +for positive positions, but does not support negative positions. + +- **anyArray** (array): array with elements of arbitrary type +- **position** (number): position of desired element in array, positions start at 0 +- returns **nthElement** (any\|null): the array element at the given *position*. + If *position* is negative or beyond the upper bound of the array, + then *null* will be returned. + +**Examples** + +```aql +--- +name: aqlArrayNth_1 +description: '' +--- +RETURN NTH( [ "foo", "bar", "baz" ], 2 ) +``` + +```aql +--- +name: aqlArrayNth_2 +description: '' +--- +RETURN NTH( [ "foo", "bar", "baz" ], 3 ) +``` + +```aql +--- +name: aqlArrayNth_3 +description: '' +--- +RETURN NTH( [ "foo", "bar", "baz" ], -1 ) +``` + +## OUTERSECTION() + +`OUTERSECTION(array1, array2, ... arrayN) → newArray` + +Return the values that occur only once across all arrays specified. + +Other set operations are [`UNION()`](#union), [`MINUS()`](#minus) and +[`INTERSECTION()`](#intersection). + +- **arrays** (array, *repeatable*): an arbitrary number of arrays as multiple arguments + (at least 2) +- returns **newArray** (array): a single array with only the elements that exist only once + across all provided arrays. The element order is random. + +**Example** + +```aql +--- +name: aqlArrayOutersection_1 +description: '' +--- +RETURN OUTERSECTION( [ 1, 2, 3 ], [ 2, 3, 4 ], [ 3, 4, 5 ] ) +``` + +## POP() + +`POP(anyArray) → newArray` + +Remove the last element of *array*. + +To append an element (right side), see [`PUSH()`](#push).\ +To remove the first element, see [`SHIFT()`](#shift).\ +To remove an element at an arbitrary position, see [`REMOVE_NTH()`](#remove_nth). + +- **anyArray** (array): an array with elements of arbitrary type +- returns **newArray** (array): *anyArray* without the last element. If it's already + empty or has only a single element left, an empty array is returned. + +**Examples** + +```aql +--- +name: aqlArrayPop_1 +description: '' +--- +RETURN POP( [ 1, 2, 3, 4 ] ) +``` + +```aql +--- +name: aqlArrayPop_2 +description: '' +--- +RETURN POP( [ 1 ] ) +``` + +## POSITION() + +`POSITION(anyArray, search, returnIndex) → position` + +Return whether *search* is contained in *array*. Optionally return the position. + +- **anyArray** (array): the haystack, an array with elements of arbitrary type +- **search** (any): the needle, an element of arbitrary type +- **returnIndex** (bool, *optional*): if set to *true*, the position of the match + is returned instead of a boolean. The default is *false*. +- returns **position** (bool\|number): *true* if *search* is contained in *anyArray*, + *false* otherwise. If *returnIndex* is enabled, the position of the match is + returned (positions start at 0), or *-1* if it's not found. + +If you want to check if a value is in an array, you can alternatively use +the [`IN` operator](../operators.md#comparison-operators), for example, +`3 IN [1, 2, 3]` instead of `POSITION([1, 2, 3], 3)`. + +To determine if or at which position a string occurs in another string, see the +[`CONTAINS()` string function](string.md#contains). + +**Examples** + +Test whether a value is contained in an array: + +```aql +--- +name: aqlArrayPosition_1 +description: '' +--- +RETURN POSITION( [2,4,6,8], 4 ) +``` + +Return the position of the match, i.e. the array index, or `-1` if the value is +not contained in the array: + +```aql +--- +name: aqlArrayPosition_2 +description: '' +--- +RETURN POSITION( [2,4,6,8], 4, true ) +``` + +If you want to search a list of objects, you can use the +[array expansion operator `[*]`](../operators.md#array-expansion). +For example, you can get an attribute from each object using the operator, and +then determine the array index of the first match using the `POSITION()` function: + +```aql +--- +name: aqlArrayPosition_3 +description: '' +--- +LET arr = [ { value: "foo" }, { value: "bar" }, { value: "baz" }, { value: "bay"} ] +RETURN POSITION(arr[*].value, "baz", true) +``` + +If you are not interested in the actual position but only want to check for +existence, you may use the `IN` operator instead of calling `POSITION()`, like +`"baz" IN arr[*].value`. + +## PUSH() + +`PUSH(anyArray, value, unique) → newArray` + +Append *value* to *anyArray* (right side). + +To remove the last element, see [`POP()`](#pop).\ +To prepend a value (left side), see [`UNSHIFT()`](#unshift).\ +To append multiple elements, see [`APPEND()`](#append). + +- **anyArray** (array): array with elements of arbitrary type +- **value** (any): an element of arbitrary type +- **unique** (bool): if set to *true*, then *value* is not added if already + present in the array. The default is *false*. +- returns **newArray** (array): *anyArray* with *value* added at the end + (right side) + +Note: The *unique* flag only controls if *value* is added if it's already present +in *anyArray*. Duplicate elements that already exist in *anyArray* will not be +removed. To make an array unique, use the [`UNIQUE()`](#unique) function. + +**Examples** + +```aql +--- +name: aqlArrayPush_1 +description: '' +--- +RETURN PUSH([ 1, 2, 3 ], 4) +``` + +```aql +--- +name: aqlArrayPush_2 +description: '' +--- +RETURN PUSH([ 1, 2, 2, 3 ], 2, true) +``` + +## REMOVE_NTH() + +`REMOVE_NTH(anyArray, position) → newArray` + +Remove the element at *position* from the *anyArray*. + +To remove the first element, see [`SHIFT()`](#shift).\ +To remove the last element, see [`POP()`](#pop). + +- **anyArray** (array): array with elements of arbitrary type +- **position** (number): the position of the element to remove. Positions start + at 0. Negative positions are supported, with -1 being the last array element. + If *position* is out of bounds, the array is returned unmodified. +- returns **newArray** (array): *anyArray* without the element at *position* + +**Examples** + +```aql +--- +name: aqlArrayRemoveNth_1 +description: '' +--- +RETURN REMOVE_NTH( [ "a", "b", "c", "d", "e" ], 1 ) +``` + +```aql +--- +name: aqlArrayRemoveNth_2 +description: '' +--- +RETURN REMOVE_NTH( [ "a", "b", "c", "d", "e" ], -2 ) +``` + +## REPLACE_NTH() + +`REPLACE_NTH(anyArray, position, replaceValue, defaultPaddingValue) → newArray` + +Replace the element at *position* in *anyArray* with *replaceValue*. + +- **anyArray** (array): array with elements of arbitrary type +- **position** (number): the position of the element to replace. Positions start + at 0. Negative positions are supported, with -1 being the last array element. + If a negative *position* is out of bounds, then it is set to the first element (0) +- **replaceValue** the value to be inserted at *position* +- **defaultPaddingValue** to be used for padding if *position* is two or more + elements beyond the last element in *anyArray* +- returns **newArray** (array): *anyArray* with the element at *position* + replaced by *replaceValue*, or appended to *anyArray* and possibly padded by + *defaultPaddingValue* + +It is allowed to specify a position beyond the upper array boundary: +- *replaceValue* is appended if *position* is equal to the array length +- if it is higher, *defaultPaddingValue* is appended to *anyArray* as many + times as needed to place *replaceValue* at *position* +- if no *defaultPaddingValue* is supplied in above case, then a query error + is raised + +**Examples** + +```aql +--- +name: aqlArrayReplaceNth_1 +description: '' +--- +RETURN REPLACE_NTH( [ "a", "b", "c" ], 1 , "z") +``` + +```aql +--- +name: aqlArrayReplaceNth_2 +description: '' +--- +RETURN REPLACE_NTH( [ "a", "b", "c" ], 3 , "z") +``` + +```aql +--- +name: aqlArrayReplaceNth_4 +description: '' +--- +RETURN REPLACE_NTH( [ "a", "b", "c" ], 6, "z", "y" ) +``` + +```aql +--- +name: aqlArrayReplaceNth_5 +description: '' +--- +RETURN REPLACE_NTH( [ "a", "b", "c" ], -1, "z" ) +``` + +```aql +--- +name: aqlArrayReplaceNth_6 +description: '' +--- +RETURN REPLACE_NTH( [ "a", "b", "c" ], -9, "z" ) +``` + +Trying to access out of bounds, without providing a padding value will result in an error: + +```js +--- +name: aqlArrayReplaceNth_3 +description: '' +--- +db._query('RETURN REPLACE_NTH( [ "a", "b", "c" ], 6 , "z")'); // xpError(ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH) +``` + +## REMOVE_VALUE() + +`REMOVE_VALUE(anyArray, value, limit) → newArray` + +Remove all occurrences of *value* in *anyArray*. Optionally with a *limit* +to the number of removals. + +- **anyArray** (array): array with elements of arbitrary type +- **value** (any): an element of arbitrary type +- **limit** (number, *optional*): cap the number of removals to this value +- returns **newArray** (array): *anyArray* with *value* removed + +**Examples** + +```aql +--- +name: aqlArrayRemoveValue_1 +description: '' +--- +RETURN REMOVE_VALUE( [ "a", "b", "b", "a", "c" ], "a" ) +``` + +```aql +--- +name: aqlArrayRemoveValue_2 +description: '' +--- +RETURN REMOVE_VALUE( [ "a", "b", "b", "a", "c" ], "a", 1 ) +``` + +## REMOVE_VALUES() + +`REMOVE_VALUES(anyArray, values) → newArray` + +Remove all occurrences of any of the *values* from *anyArray*. + +- **anyArray** (array): array with elements of arbitrary type +- **values** (array): an array with elements of arbitrary type, that shall + be removed from *anyArray* +- returns **newArray** (array): *anyArray* with all individual *values* removed + +**Example** + +```aql +--- +name: aqlArrayRemoveValues_1 +description: '' +--- +RETURN REMOVE_VALUES( [ "a", "a", "b", "c", "d", "e", "f" ], [ "a", "f", "d" ] ) +``` + +## REVERSE() + +`REVERSE(anyArray) → reversedArray` + +Return an array with its elements reversed. + +- **anyArray** (array): array with elements of arbitrary type +- returns **reversedArray** (array): a new array with all elements of *anyArray* in + reversed order + +**Example** + +```aql +--- +name: aqlArrayReverse_1 +description: '' +--- +RETURN REVERSE ( [2,4,6,8,10] ) +``` + +## SHIFT() + +`SHIFT(anyArray) → newArray` + +Remove the first element of *anyArray*. + +To prepend an element (left side), see [`UNSHIFT()`](#unshift).\ +To remove the last element, see [`POP()`](#pop).\ +To remove an element at an arbitrary position, see [`REMOVE_NTH()`](#remove_nth). + +- **anyArray** (array): array with elements with arbitrary type +- returns **newArray** (array): *anyArray* without the left-most element. If *anyArray* + is already empty or has only one element left, an empty array is returned. + +**Examples** + +```aql +--- +name: aqlArrayShift_1 +description: '' +--- +RETURN SHIFT( [ 1, 2, 3, 4 ] ) +``` + +```aql +--- +name: aqlArrayShift_2 +description: '' +--- +RETURN SHIFT( [ 1 ] ) +``` + +## SLICE() + +`SLICE(anyArray, start, length) → newArray` + +Extract a slice of *anyArray*. + +- **anyArray** (array): array with elements of arbitrary type +- **start** (number): start extraction at this element. Positions start at 0. + Negative values indicate positions from the end of the array. +- **length** (number, *optional*): extract up to *length* elements, or all + elements from *start* up to *length* if negative (exclusive) +- returns **newArray** (array): the specified slice of *anyArray*. If *length* + is not specified, all array elements starting at *start* will be returned. + +**Examples** + +```aql +--- +name: aqlArraySlice_1 +description: '' +--- +RETURN SLICE( [ 1, 2, 3, 4, 5 ], 0, 1 ) +``` + +```aql +--- +name: aqlArraySlice_2 +description: '' +--- +RETURN SLICE( [ 1, 2, 3, 4, 5 ], 1, 2 ) +``` + +```aql +--- +name: aqlArraySlice_3 +description: '' +--- +RETURN SLICE( [ 1, 2, 3, 4, 5 ], 3 ) +``` + +```aql +--- +name: aqlArraySlice_4 +description: '' +--- +RETURN SLICE( [ 1, 2, 3, 4, 5 ], 1, -1 ) +``` + +```aql +--- +name: aqlArraySlice_5 +description: '' +--- +RETURN SLICE( [ 1, 2, 3, 4, 5 ], 0, -2 ) +``` + +```aql +--- +name: aqlArraySlice_6 +description: '' +--- +RETURN SLICE( [ 1, 2, 3, 4, 5 ], -3, 2 ) +``` + +## SORTED() + +`SORTED(anyArray) → newArray` + +Sort all elements in *anyArray*. The function will use the default comparison +order for AQL value types. + +- **anyArray** (array): array with elements of arbitrary type +- returns **newArray** (array): *anyArray*, with elements sorted + +**Example** + +```aql +--- +name: aqlArraySorted_1 +description: '' +--- +RETURN SORTED( [ 8,4,2,10,6 ] ) +``` + +## SORTED_UNIQUE() + +`SORTED_UNIQUE(anyArray) → newArray` + +Sort all elements in *anyArray*. The function will use the default comparison +order for AQL value types. Additionally, the values in the result array will +be made unique. + +- **anyArray** (array): array with elements of arbitrary type +- returns **newArray** (array): *anyArray*, with elements sorted and duplicates + removed + +**Example** + +```aql +--- +name: aqlArraySortedUnique_1 +description: '' +--- +RETURN SORTED_UNIQUE( [ 8,4,2,10,6,2,8,6,4 ] ) +``` + +## UNION() + +`UNION(array1, array2, ... arrayN) → newArray` + +Return the union of all arrays specified. + +Other set operations are [`MINUS()`](#minus), [`INTERSECTION()`](#intersection) +and [`OUTERSECTION()`](#outersection). + +- **arrays** (array, *repeatable*): an arbitrary number of arrays as multiple + arguments (at least 2) +- returns **newArray** (array): all array elements combined in a single array, + in any order + +**Examples** + +```aql +--- +name: aqlArrayUnion_1 +description: '' +--- +RETURN UNION( + [ 1, 2, 3 ], + [ 1, 2 ] +) +``` + +Note: No duplicates will be removed. In order to remove duplicates, please use +either [`UNION_DISTINCT()`](#union_distinct) or apply [`UNIQUE()`](#unique) on the +result of `UNION()`: + +```aql +--- +name: aqlArrayUnion_2 +description: '' +--- +RETURN UNIQUE( + UNION( + [ 1, 2, 3 ], + [ 1, 2 ] + ) +) +``` + +## UNION_DISTINCT() + +`UNION_DISTINCT(array1, array2, ... arrayN) → newArray` + +Return the union of distinct values of all arrays specified. + +- **arrays** (array, *repeatable*): an arbitrary number of arrays as multiple + arguments (at least 2) +- returns **newArray** (array): the elements of all given arrays in a single + array, without duplicates, in any order + +**Example** + +```aql +--- +name: aqlArrayUnionDistinct_1 +description: '' +--- +RETURN UNION_DISTINCT( + [ 1, 2, 3 ], + [ 1, 2 ] +) +``` + +## UNIQUE() + +`UNIQUE(anyArray) → newArray` + +Return all unique elements in *anyArray*. To determine uniqueness, the +function will use the comparison order. + +- **anyArray** (array): array with elements of arbitrary type +- returns **newArray** (array): *anyArray* without duplicates, in any order + +**Example** + +```aql +--- +name: aqlArrayUnique_1 +description: '' +--- +RETURN UNIQUE( [ 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5 ] ) +``` + +## UNSHIFT() + +`UNSHIFT(anyArray, value, unique) → newArray` + +Prepend *value* to *anyArray* (left side). + +To remove the first element, see [`SHIFT()`](#shift).\ +To append a value (right side), see [`PUSH()`](#push). + +- **anyArray** (array): array with elements of arbitrary type +- **value** (any): an element of arbitrary type +- **unique** (bool): if set to *true*, then *value* is not added if already + present in the array. The default is *false*. +- returns **newArray** (array): *anyArray* with *value* added at the start + (left side) + +Note: The *unique* flag only controls if *value* is added if it's already present +in *anyArray*. Duplicate elements that already exist in *anyArray* will not be +removed. To make an array unique, use the [`UNIQUE()`](#unique) function. + +**Examples** + +```aql +--- +name: aqlArrayUnshift_1 +description: '' +--- +RETURN UNSHIFT( [ 1, 2, 3 ], 4 ) +``` + +```aql +--- +name: aqlArrayUnshift_2 +description: '' +--- +RETURN UNSHIFT( [ 1, 2, 3 ], 2, true ) +``` diff --git a/site/content/arangodb/oem/aql/functions/bit.md b/site/content/arangodb/oem/aql/functions/bit.md new file mode 100644 index 0000000000..bca40a82f6 --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/bit.md @@ -0,0 +1,321 @@ +--- +title: Bit functions in AQL +menuTitle: Bit +weight: 15 +description: >- + AQL offers a set of bit manipulation and interpretation functions for bitwise + arithmetic +--- +Bit functions can operate on numeric integer values in the range between 0 +and 4294967295 (2<sup>32</sup> - 1), both included. This allows treating numbers as +bitsets of up to 32 members. Using any of the bit functions on numbers outside +the supported range will make the function return `null` and register a warning. + +The value range for the bit functions is conservatively small, so that no +precision loss or rounding errors should occur when the input/output values of +bit functions are passed around or sent over the wire to client applications +with unknown precision number types. + +## BIT_AND() + +`BIT_AND(numbersArray) → result` + +And-combines the numeric values in *numbersArray* into a single numeric result +value. + +- **numbersArray** (array): array with numeric input values +- returns **result** (number\|null): and-combined result + +The function expects an array with numeric values as its input. The values in +the array must be numbers, which must not be negative. The maximum supported +input number value is 2<sup>32</sup> - 1. Input number values outside the allowed +range will make the function return `null` and produce a warning. Any `null` +values in the input array are ignored. + +--- + +`BIT_AND(value1, value2) → result` + +If two numbers are passed as individual function parameters to `BIT_AND()`, it +will return the bitwise and value of its two operands. Only numbers in the +range 0 to 2<sup>32</sup> - 1 are allowed as input values. + +- **value1** (number): first operand +- **value2** (number): second operand +- returns **result** (number\|null): and-combined result + +```aql +BIT_AND([1, 4, 8, 16]) // 0 +BIT_AND([3, 7, 63]) // 3 +BIT_AND([255, 127, null, 63]) // 63 +BIT_AND(127, 255) // 127 +BIT_AND("foo") // null +``` + +## BIT_CONSTRUCT() + +`BIT_CONSTRUCT(positionsArray) → result` + +Construct a number value with its bits set at the positions given in the array. + +- **positionArray** (array): array with bit positions to set (zero-based) +- returns **result** (number\|null): the generated number + +The function expects an array with numeric values as its input. The values in +the array must be numbers, which must not be negative. The maximum supported +input number value is 31. Input number values outside the allowed range will +make the function return `null` and produce a warning. + +```aql +BIT_CONSTRUCT([1, 2, 3]) // 14 +BIT_CONSTRUCT([0, 4, 8]) // 273 +BIT_CONSTRUCT([0, 1, 10, 31]) // 2147484675 +``` + +## BIT_DECONSTRUCT() + +`BIT_DECONSTRUCT(number) → positionsArray` + +Deconstruct a number value into an array with the positions of its set bits. + +- **number** (number): the input value to deconstruct +- returns **positionArray** (array\|null): array with bit positions set (zero-based) + +The function turns a numeric value into an array with the positions of all its +set bits. The positions in the output array are zero-based. +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The function will return `null` for any other inputs and produce a warning. + +```aql +BIT_DECONSTRUCT(14) // [1, 2, 3] +BIT_DECONSTRUCT(273) // [0, 4, 8] +BIT_DECONSTRUCT(2147484675) // [0, 1, 10, 31] +``` + +## BIT_FROM_STRING() + +`BIT_FROM_STRING(bitstring) → number` + +Converts a bitstring (consisting of digits `0` and `1`) into a number. + +To convert a number into a bitstring, see [`BIT_TO_STRING()`](#bit_to_string). + +- **bitstring** (string): string sequence consisting of `0` and `1` characters +- returns **number** (number\|null): the parsed number + +The input value must be a bitstring, consisting only of `0` and `1` characters. +The bitstring can contain up to 32 significant bits, including any leading zeros. +Note that the bitstring must not start with `0b`. +If the bitstring has an invalid format, this function returns `null` and produces +a warning. + +```aql +BIT_FROM_STRING("0111") // 7 +BIT_FROM_STRING("000000000000010") // 2 +BIT_FROM_STRING("11010111011101") // 13789 +BIT_FROM_STRING("100000000000000000000") // 1048756 +``` + +## BIT_NEGATE() + +`BIT_NEGATE(number, bits) → result` + +Bitwise-negates the bits in **number**, and keeps up to **bits** bits in the +result. + +- **number** (number): the number to negate +- **bits** (number): number of bits to keep in the result (0 to 32) +- returns **result** (number\|null): the resulting number, with up to **bits** + significant bits + +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The number of bits must be between 0 and 32. The function will return `null` for +any other inputs and produce a warning. + +```aql +BIT_NEGATE(0, 8) // 255 +BIT_NEGATE(0, 10) // 1023 +BIT_NEGATE(3, 4) // 12 +BIT_NEGATE(446359921, 32) // 3848607374 +``` + +## BIT_OR() + +`BIT_OR(numbersArray) → result` + +Or-combines the numeric values in *numbersArray* into a single numeric result +value. + +- **numbersArray** (array): array with numeric input values +- returns **result** (number\|null): or-combined result + +The function expects an array with numeric values as its input. The values in +the array must be numbers, which must not be negative. The maximum supported +input number value is 2<sup>32</sup> - 1. Input number values outside the +allowed range will make the function return `null` and produce a warning. +Any `null` values in the input array are ignored. + +--- + +`BIT_OR(value1, value2) → result` + +If two numbers are passed as individual function parameters to `BIT_OR()`, it +will return the bitwise or value of its two operands. Only numbers in the range +0 to 2<sup>32</sup> - 1 are allowed as input values. + +- **value1** (number): first operand +- **value2** (number): second operand +- returns **result** (number\|null): or-combined result + +```aql +BIT_OR([1, 4, 8, 16]) // 29 +BIT_OR([3, 7, 63]) // 63 +BIT_OR([255, 127, null, 63]) // 255 +BIT_OR(255, 127) // 255 +BIT_OR("foo") // null +``` + +## BIT_POPCOUNT() + +`BIT_POPCOUNT(number) → result` + +Counts the number of bits set in the input value. + +- **number** (number): array with numeric input values +- returns **result** (number\|null): number of bits set in the input value + +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The function will return `null` for any other inputs and produce a warning. + +```aql +BIT_POPCOUNT(0) // 0 +BIT_POPCOUNT(255) // 8 +BIT_POPCOUNT(69399252) // 12 +BIT_POPCOUNT("foo") // null +``` + +## BIT_SHIFT_LEFT() + +`BIT_SHIFT_LEFT(number, shift, bits) → result` + +Bitwise-shifts the bits in **number** to the left, and keeps up to **bits** +bits in the result. When bits overflow due to the shift, they are discarded. + +- **number** (number): the number to shift +- **shift** (number): number of bits to shift (0 to 32) +- **bits** (number): number of bits to keep in the result (0 to 32) +- returns **result** (number\|null): the resulting number, with up to **bits** + significant bits + +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The number of bits must be between 0 and 32. The function will return `null` for +any other inputs and produce a warning. + +```aql +BIT_SHIFT_LEFT(0, 1, 8) // 0 +BIT_SHIFT_LEFT(7, 1, 16) // 14 +BIT_SHIFT_LEFT(2, 10, 16) // 2048 +BIT_SHIFT_LEFT(878836, 16, 32) // 1760821248 +``` + +## BIT_SHIFT_RIGHT() + +`BIT_SHIFT_RIGHT(number, shift, bits) → result` + +Bitwise-shifts the bits in **number** to the right, and keeps up to **bits** +bits in the result. When bits overflow due to the shift, they are discarded. + +- **number** (number): the number to shift +- **shift** (number): number of bits to shift (0 to 32) +- **bits** (number): number of bits to keep in the result (0 to 32) +- returns **result** (number\|null): the resulting number, with up to **bits** + significant bits + +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The number of bits must be between 0 and 32. The function will return `null` for +any other inputs and produce a warning. + +```aql +BIT_SHIFT_RIGHT(0, 1, 8) // 0 +BIT_SHIFT_RIGHT(33, 1, 16) // 16 +BIT_SHIFT_RIGHT(65536, 13, 16) // 8 +BIT_SHIFT_RIGHT(878836, 4, 32) // 54927 +``` + +## BIT_TEST() + +`BIT_TEST(number, index) → result` + +Tests if the at position *index* is set in **number**. + +- **number** (number): the number to test +- **index** (number): index of the bit to test (0 to 31) +- returns **result** (boolean\|null): whether or not the bit was set + +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The **index** must be between 0 and 31. The function will return `null` for any +other inputs and produce a warning. + +```aql +BIT_TEST(0, 3) // false +BIT_TEST(255, 0) // true +BIT_TEST(7, 2) // true +BIT_TEST(255, 8) // false +``` + +## BIT_TO_STRING() + +`BIT_TO_STRING(number) → bitstring` + +Converts a numeric input value into a bitstring, consisting of `0` and `1`. + +To convert a bitstring into a number, see [`BIT_FROM_STRING()`](#bit_from_string). + +- **number** (number): the number to stringify +- returns **bitstring** (string\|null): bitstring generated from the input value + +The input value must be a number between 0 and 2<sup>32</sup> - 1 (including). +The function will return `null` for any other inputs and produce a warning. + +```aql +BIT_TO_STRING(7, 4) // "0111" +BIT_TO_STRING(255, 8) // "11111111" +BIT_TO_STRING(60, 8) // "00011110" +BIT_TO_STRING(1048576, 32) // "00000000000100000000000000000000" +``` + +## BIT_XOR() + +`BIT_XOR(numbersArray) → result` + +Exclusive-or-combines the numeric values in *numbersArray* into a single +numeric result value. + +- **numbersArray** (array): array with numeric input values +- returns **result** (number\|null): xor-combined result + +The function expects an array with numeric values as its input. The values in +the array must be numbers, which must not be negative. The maximum supported +input number value is 2<sup>32</sup> - 1. Input number values outside the +allowed range will make the function return `null` and produce a warning. +Any `null` values in the input array are ignored. + +--- + +`BIT_XOR(value1, value2) → result` + +If two numbers are passed as individual function parameters to `BIT_XOR()`, it +will return the bitwise exclusive or value of its two operands. Only numbers in +the range 0 to 2<sup>32</sup> - 1 are allowed as input values. + +- **value1** (number): first operand +- **value2** (number): second operand +- returns **result** (number\|null): xor-combined result + +```aql +BIT_XOR([1, 4, 8, 16]) // 29 +BIT_XOR([3, 7, 63]) // 59 +BIT_XOR([255, 127, null, 63]) // 191 +BIT_XOR(255, 257) // 510 +BIT_XOR("foo") // null +``` diff --git a/site/content/arangodb/oem/aql/functions/date.md b/site/content/arangodb/oem/aql/functions/date.md new file mode 100644 index 0000000000..272e384e0b --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/date.md @@ -0,0 +1,1335 @@ +--- +title: Date functions in AQL +menuTitle: Date +weight: 20 +description: >- + AQL includes functions to work with dates as numeric timestamps and as + ISO 8601 date time strings +--- +## Date and time representations + +AQL offers functionality to work with dates, but it does not have a special data type +for dates (neither does JSON, which is usually used as format to ship data into and +out of ArangoDB). Instead, dates in AQL are represented by either numbers or strings. + +All date function operations are done in the *Unix time* system. Unix time counts +all non leap seconds beginning with January 1st 1970 00:00:00.000 UTC, also know as +the Unix epoch. A point in time is called timestamp. A timestamp has the same value +at every point on earth. The date functions use millisecond precision for timestamps. + +Time unit definitions: + +- **millisecond**: 1/1000 of a second +- **second**: one [SI second](https://www.bipm.org/en/si-base-units/second) +- **minute**: one minute is defined as 60 seconds +- **hour**: one hour is defined as 60 minutes +- **day**: one day is defined as 24 hours +- **week**: one week is defined as 7 days +- **month**: one month is defined as 1/12 of a year +- **year**: one year is defined as 365.2425 days + +All functions that require dates as arguments accept the following input values: + +- **numeric timestamps**, millisecond precision. + + An example timestamp value is `1399472349522`, which translates to + `2014-05-07T14:19:09.522Z`. + + Valid range: `-62167219200000` .. `253402300799999` (inclusive) + +- **date time strings** in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: + - `YYYY-MM-DDTHH:MM:SS.MMM` + - `YYYY-MM-DD HH:MM:SS.MMM` + - `YYYY-MM-DD` + + Milliseconds (`.MMM`) are always optional. Two digits for the hours (`HH`), + minutes (`MM`) and seconds (`SS`) are mandatory, i.e. zero-padding is required + for the values 0 through 9 (e.g. `05` instead of `5`). Leading zeroes for the + year (`YYYY`), month (`MM`) and day (`DD`) can be left out, but is discouraged. + + A time offset may optionally be added at the end of the string, with the + hours and minutes that need to be added or subtracted to the date time value. + For example, `2014-05-07T14:19:09+01:00` can be used to specify a one hour offset, + and `2014-05-07T14:19:09+07:30` can be specified for seven and half hours offset. + Negative offsets are also possible. Alternatively to an offset, a `Z` can be used + to indicate UTC / Zulu time. An example value is `2014-05-07T14:19:09.522Z` + meaning May 7th 2014, 14:19:09 and 522 milliseconds, UTC / Zulu time. + Another example value without time component is `2014-05-07Z`. + + Valid range: `"0000-01-01T00:00:00.000Z"` .. `"9999-12-31T23:59:59.999Z"` (inclusive) + +Any date/time values outside the valid range that are passed into an AQL date +function makes the function return `null` and trigger a warning for the query, +which can optionally be escalated to an error and abort the query. This also +applies to operations which produce an invalid value. + +```aql +DATE_HOUR( 2 * 60 * 60 * 1000 ) // 2 +DATE_HOUR("1970-01-01T02:00:00") // 2 +``` + +You are free to store age determinations of specimens, incomplete or fuzzy dates and +the like in different, more appropriate ways of course. AQL's date functions are +most certainly not of any help for such dates, but you can still use language +constructs like [SORT](../high-level-operations/sort.md) (which also supports sorting of arrays) +and [indexes](../../index-and-search/indexing/_index.md). + +## Current date and time + +### DATE_NOW() + +`DATE_NOW() → timestamp` + +Get the current unix time as numeric timestamp. + +- returns **timestamp** (number): the current unix time as a timestamp. + The return value has millisecond precision. To convert the return value to + seconds, divide it by 1000. + +Note that this function is evaluated on every invocation and may return +different values when invoked multiple times in the same query. Assign it +to a variable to use the exact same timestamp multiple times. + +## Conversion + +`DATE_TIMESTAMP()` and `DATE_ISO8601()` can be used to convert ISO 8601 date time +strings to numeric timestamps and numeric timestamps to ISO 8601 date time strings. + +Both also support individual date components as separate function arguments, +in the following order: + +- year +- month +- day +- hour +- minute +- second +- millisecond + +All components following the *day* are optional and can be omitted. Note that no +time offset can be specified when using separate date components, and UTC / +Zulu time is used. + +The following calls to `DATE_TIMESTAMP()` are equivalent and all return +`1399472349522`: + +```aql +DATE_TIMESTAMP("2014-05-07T14:19:09.522") +DATE_TIMESTAMP("2014-05-07T14:19:09.522Z") +DATE_TIMESTAMP("2014-05-07 14:19:09.522") +DATE_TIMESTAMP("2014-05-07 14:19:09.522Z") +DATE_TIMESTAMP(2014, 5, 7, 14, 19, 9, 522) +DATE_TIMESTAMP(1399472349522) +``` + +The same is true for calls to `DATE_ISO8601()` that also accepts variable input +formats: + +```aql +DATE_ISO8601("2014-05-07T14:19:09.522Z") +DATE_ISO8601("2014-05-07 14:19:09.522Z") +DATE_ISO8601(2014, 5, 7, 14, 19, 9, 522) +DATE_ISO8601(1399472349522) +``` + +The above functions are all equivalent and return `"2014-05-07T14:19:09.522Z"`. + +### DATE_ISO8601() + +`DATE_ISO8601(date) → dateString` + +Return an ISO 8601 date time string from `date`. +The date time string always uses UTC / Zulu time, indicated by the `Z` at its end. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **dateString**: date and time expressed according to ISO 8601, in Zulu time + +--- + +`DATE_ISO8601(year, month, day, hour, minute, second, millisecond) → dateString` + +Return a ISO 8601 date time string from `date`, but allows to specify the individual +date components separately. All parameters after `day` are optional. + +- **year** (number): typically in the range 0..9999, e.g. `2017` +- **month** (number): 1..12 for January through December +- **day** (number): 1..31 (upper bound depends on number of days in month) +- **hour** (number, *optional*): 0..23 +- **minute** (number, *optional*): 0..59 +- **second** (number, *optional*): 0..59 +- **milliseconds** (number, *optional*): 0..999 +- returns **dateString**: date and time expressed according to ISO 8601, in Zulu time + +### DATE_TIMESTAMP() + +`DATE_TIMESTAMP(date) → timestamp` + +Create a timestamp value from `date`. The return value has millisecond precision. +To convert the return value to seconds, divide it by 1000. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **timestamp** (number): numeric timestamp + +--- + +`DATE_TIMESTAMP(year, month, day, hour, minute, second, millisecond) → timestamp` + +Create a timestamp value, but allows to specify the individual date components +separately. All parameters after `day` are optional. + +- **year** (number): typically in the range 0..9999, e.g. `2017` +- **month** (number): 1..12 for January through December +- **day** (number): 1..31 (upper bound depends on number of days in month) +- **hour** (number, *optional*): 0..23 +- **minute** (number, *optional*): 0..59 +- **second** (number, *optional*): 0..59 +- **milliseconds** (number, *optional*): 0..999 +- returns **timestamp** (number): numeric timestamp + +Negative values are not allowed, result in `null` and cause a warning. +Values greater than the upper range bound overflow to the larger components +(e.g. an hour of 26 is automatically turned into an additional day and two hours): + +```aql +DATE_TIMESTAMP(2016, 12, -1) // returns null and issues a warning +DATE_TIMESTAMP(2016, 2, 32) // returns 1456963200000, which is March 3rd, 2016 +DATE_TIMESTAMP(1970, 1, 1, 26) // returns 93600000, which is January 2nd, 1970, at 2 a.m. +``` + +### IS_DATESTRING() + +`IS_DATESTRING(value) → bool` + +Check if an arbitrary string is suitable for interpretation as date time string. + +- **value** (string): an arbitrary string +- returns **bool** (bool): `true` if `value` is a string that can be used + in a date function. This includes partial dates such as `2015` or `2015-10` and + strings containing invalid dates such as `2015-02-31`. The function returns + `false` for all non-string values, even if some of them may be usable in date + functions. + +## Processing + +### DATE_DAYOFWEEK() + +`DATE_DAYOFWEEK(date) → weekdayNumber` + +Return the weekday number of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **weekdayNumber** (number): 0..6 as follows: + - `0` – Sunday + - `1` – Monday + - `2` – Tuesday + - `3` – Wednesday + - `4` – Thursday + - `5` – Friday + - `6` – Saturday + +**Examples** + +```aql +--- +name: datedyofwk1 +description: | + The 29th of August in 2020 was a Saturday: +--- +RETURN DATE_DAYOFWEEK("2020-08-29") +``` + +```aql +--- +name: datedyofwk2 +description: | + The Unix epoch began on the 1st of January 1970, which was a Thursday: +--- +RETURN DATE_DAYOFWEEK(0) +``` + +### DATE_YEAR() + +`DATE_YEAR(date) → year` + +Return the year of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **year** (number): the year part of `date` as a number + +**Examples** + +```aql +--- +name: dateyr1 +description: | + Extract the year from a date time string: +--- +RETURN DATE_YEAR("2020-08-29") +``` + +```aql +--- +name: dateyr2 +description: | + Extract the year from a Unix timestamp: +--- +RETURN DATE_YEAR(0) +``` + +### DATE_MONTH() + +`DATE_MONTH(date) → month` + +Return the month of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **month** (number): the month part of `date` as a number + +**Examples** + +```aql +--- +name: datemn1 +description: | + Extract the month from a date time string: +--- +RETURN DATE_MONTH("2020-08-29") +``` + +```aql +--- +name: datemn2 +description: | + Extract the month from a Unix timestamp: +--- +RETURN DATE_MONTH(0) +``` + +### DATE_DAY() + +`DATE_DAY(date) → day` + +Return the day of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **day** (number): the day part of `date` as a number + +**Examples** + +```aql +--- +name: datedy1 +description: | + Extract the day from a date time string: +--- +RETURN DATE_DAY("2020-08-29") +``` + +```aql +--- +name: datedy2 +description: | + Extract the day from a Unix timestamp: +--- +RETURN DATE_DAY(0) +``` + +### DATE_HOUR() + +Return the hour of `date`. + +`DATE_HOUR(date) → hour` + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **hour** (number): the hour part of `date` as a number + +**Examples** + +```aql +--- +name: datehr1 +description: | + Extract the hour of a date time string: +--- +RETURN DATE_HOUR("2020-08-29T16:30:05.123") +``` + +```aql +--- +name: datehr2 +description: | + Extract the hour of a Unix timestamp: +--- +RETURN DATE_HOUR(14400000) +``` + +### DATE_MINUTE() + +`DATE_MINUTE(date) → minute` + +Return the minute of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **minute** (number): the minute part of `date` as a number + +**Examples** + +```aql +--- +name: datemin1 +description: | + Extract the minute of a date time string: +--- +RETURN DATE_MINUTE("2020-08-29T16:30:05.123") +``` + +```aql +--- +name: datemin2 +description: | + Extract the minute of a Unix timestamp: +--- +RETURN DATE_MINUTE(2520000) +``` + +### DATE_SECOND() + +`DATE_SECOND(date) → second` + +Return the second of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **second** (number): the seconds part of `date` as a number + +**Examples** + +```aql +--- +name: datesec1 +description: | + Extract the second of a date time string: +--- +RETURN DATE_SECOND("2020-08-29T16:30:05.123") +``` + +```aql +--- +name: datesec2 +description: | + Extract the second of a Unix timestamp: +--- +RETURN DATE_SECOND(1234567890) +``` + +### DATE_MILLISECOND() + +`DATE_MILLISECOND(date) → millisecond` + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **millisecond** (number): the milliseconds part of `date` as a number + +**Examples** + +```aql +--- +name: datemilsec1 +description: '' +--- +RETURN DATE_MILLISECOND("2020-08-29T16:30:05.123") +``` + +```aql +--- +name: datemilsec2 +description: | + Extract the millisecond of a Unix timestamp: +--- +RETURN DATE_MILLISECOND(1234567890) +``` + +### DATE_DAYOFYEAR() + +`DATE_DAYOFYEAR(date) → dayOfYear` + +Return the day of year of `date`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **dayOfYear** (number): the day of year number of `date`. + The return values range from 1 to 365, or 366 in a leap year respectively. + +**Examples** + +```aql +--- +name: datedyofyr1 +description: | + Extract the day of year from a date time string: +--- +RETURN DATE_DAYOFYEAR("2020-08-29") +``` + +```aql +--- +name: datedyofyr2 +description: | + Extract the day of year from a Unix timestamp: +--- +RETURN DATE_DAYOFYEAR(86400000) +``` + +### DATE_ISOWEEK() + +`DATE_ISOWEEK(date) → weekDate` + +Return the week number in the year of `date` according to ISO 8601. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **weekDate** (number): the ISO week number of `date`. The return values + range from 1 to 53. Monday is considered the first day of the week. There are no + fractional weeks, thus the last days in December may belong to the first week of + the next year, and the first days in January may be part of the previous year's + last week. + +**Examples** + +```aql +--- +name: dateisofwk1 +description: | + Determine the week number from a date time string: +--- +RETURN DATE_ISOWEEK("2020-08-29") +``` + +```aql +--- +name: dateisofwk2 +description: | + Determine the week number from a Unix timestamp: +--- +RETURN DATE_ISOWEEK(1234567890) +``` + +### DATE_ISOWEEKYEAR() + +`DATE_ISOWEEKYEAR(date) → weekAndYear` + +Return the week number of `date` according to ISO 8601 and the year the +week belongs to. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **weekAndYear** (object): an object with two attributes + - **week** (number): the ISO week number of `date`. The values range from 1 to 53. + Monday is considered the first day of the week. There are no fractional weeks, + thus the last days in December may belong to the first week of the next year, + and the first days in January may be part of the previous year's last week. + - **year** (number): the year to which the ISO week number belongs to + +**Examples** + +```aql +--- +name: aqlDateIsoWeekYear1 +description: | + January 1st of 2023 is part of the previous year's last week: +--- +RETURN DATE_ISOWEEKYEAR("2023-01-01") +``` + +```aql +--- +name: aqlDateIsoWeekYear2 +description: | + The last two days of 2019 are part of the next year's first week: +--- +RETURN DATE_ISOWEEKYEAR("2019-12-30") +``` + +### DATE_LEAPYEAR() + +`DATE_LEAPYEAR(date) → leapYear` + +Return whether `date` is in a leap year. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **leapYear** (bool): `true` if `date` is in a leap year, `false` otherwise + +**Examples** + +```aql +--- +name: datelpyr1 +description: | + 2020 was a leap year: +--- +RETURN DATE_LEAPYEAR("2020-01-01") +``` + +```aql +--- +name: datelpyr2 +description: | + 2021 was not a leap year: +--- +RETURN DATE_LEAPYEAR("2021-01-01") +``` + +### DATE_QUARTER() + +`DATE_QUARTER(date) → quarter` + +Return which quarter `date` belongs to. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **quarter** (number): the quarter of the given date (1-based): + - `1` – January, February, March + - `2` – April, May, June + - `3` – July, August, September + - `4` – October, November, December + +**Examples** + +```aql +--- +name: dateqtr1 +description: | + Determine the quarter of a date time string: +--- +RETURN DATE_QUARTER("2020-08-29") +``` + +### DATE_DAYS_IN_MONTH() + +Return the number of days in the month of `date`. + +`DATE_DAYS_IN_MONTH(date) → daysInMonth` + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- returns **daysInMonth** (number): the number of days in `date`'s month (28..31) + +**Examples** + +```aql +--- +name: datedysmn1 +description: | + Determine the number of days in August using a date time string: +--- +RETURN DATE_DAYS_IN_MONTH("2020-08-01") +``` + +```aql +--- +name: datedysmn2 +description: | + Determine the number of days in September using a date time string: +--- +RETURN DATE_DAYS_IN_MONTH("2020-09-01") +``` + +```aql +--- +name: datedysmn3 +description: | + Determine the number of days in February in a leap year using a date time string: +--- +RETURN DATE_DAYS_IN_MONTH("2020-02-01") +``` + +```aql +--- +name: datedysmn4 +description: | + Determine the number of days in February in a a non-leap year using a date time string: +--- +RETURN DATE_DAYS_IN_MONTH("2021-02-01") +``` + +```aql +--- +name: datedysmn5 +description: | + Determine the number of days in the month using a Unix timestamp: +--- +RETURN DATE_DAYS_IN_MONTH(3045600000) +``` + +### DATE_TRUNC() + +`DATE_TRUNC(date, unit) → isoDate` + +Truncates the given date after `unit` and returns the modified date. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **unit** (string): either of the following to specify the time unit (case-insensitive): + - `"y"`, `"year"`, `"years"` + - `"m"`, `"month"`, `"months"` + - `"d"`, `"day"`, `"days"` + - `"h"`, `"hour"`, `"hours"` + - `"i"`, `"minute"`, `"minutes"` + - `"s"`, `"second"`, `"seconds"` + - `"f"`, `"millisecond"`, `"milliseconds"` +- returns **isoDate** (string): the truncated ISO 8601 date time string + +**Examples** + +```aql +DATE_TRUNC('2017-02-03', 'month') // 2017-02-01T00:00:00.000Z +DATE_TRUNC('2017-02-03 04:05:06', 'hours') // 2017-02-03 04:00:00.000Z +DATE_TRUNC('2023-03-25 23:00:00', 'day') // 2023-03-25T00:00:00.000Z +``` + +```aql +--- +name: dateTruncGroup +description: | + Truncate date time strings comprised of a year, month, and day to the year and + group another attribute by it: +bindVars: + { + "data": [ + { "date": "2018-03-05", "value": "Spring" }, + { "date": "2018-07-11", "value": "Summer" }, + { "date": "2018-10-26", "value": "Autumn" }, + { "date": "2019-01-09", "value": "Winter" }, + { "date": "2019-04-02", "value": "Spring" } + ] + } +--- +RETURN MERGE( + FOR doc IN @data + COLLECT q = DATE_TRUNC(doc.date, "year") INTO bucket + RETURN { [DATE_YEAR(q)]: bucket[*].doc.value } +) +``` + +### DATE_ROUND() + +`DATE_ROUND(date, amount, unit) → isoDate` + +Bin a date/time into a set of equal-distance buckets, to be used for +grouping. + +- **date** (string\|number): a date string or timestamp +- **amount** (number): number of `unit`s. Must be a positive integer value. +- **unit** (string): either of the following to specify the time unit (case-insensitive): + - `"d"`, `"day"`, `"days"` + - `"h"`, `"hour"`, `"hours"` + - `"i"`, `"minute"`, `"minutes"` + - `"s"`, `"second"`, `"seconds"` + - `"f"`, `"millisecond"`, `"milliseconds"` +- returns **isoDate** (string): the rounded ISO 8601 date time string + +**Examples** + +```aql +DATE_ROUND('2000-04-28T11:11:11.111Z', 1, 'day') // 2000-04-28T00:00:00.000Z +DATE_ROUND('2000-04-10T11:39:29Z', 15, 'minutes') // 2000-04-10T11:30:00.000Z +DATE_ROUND('2023-03-25T23:55:55.555Z', 1, 'day') // 2023-03-25T00:00:00.000Z +``` + +```aql +--- +name: dateRoundAggregate +description: | + Round full date time strings to 5 minutes and aggregate temperature readings + by these time buckets: + +bindVars: + { + "sensorData": [ + { "timestamp": "2019-12-04T21:17:52.583Z", "temp": 20.6 }, + { "timestamp": "2019-12-04T21:19:53.516Z", "temp": 20.2 }, + { "timestamp": "2019-12-04T21:21:53.610Z", "temp": 19.9 }, + { "timestamp": "2019-12-04T21:23:52.522Z", "temp": 19.8 }, + { "timestamp": "2019-12-04T21:25:52.988Z", "temp": 19.8 }, + { "timestamp": "2019-12-04T21:27:54.005Z", "temp": 19.7 } + ] + } +--- +FOR doc IN @sensorData + COLLECT + date = DATE_ROUND(doc.timestamp, 5, "minutes") + AGGREGATE + count = COUNT(1), + avg = AVG(doc.temp), + min = MIN(doc.temp), + max = MAX(doc.temp) + RETURN { date, count, avg, min, max } +``` + +### DATE_FORMAT() + +`DATE_FORMAT(date, format) → str` + +Format a date according to the given format string. + +- **date** (string\|number): a date string or timestamp +- **format** (string): a format string, see below +- returns **str** (string): a formatted date string + +The `format` parameter supports the following placeholders (case-insensitive): + +- `%t` – timestamp, in milliseconds since midnight 1970-01-01 +- `%z` – ISO date (0000-00-00T00:00:00.000Z) +- `%w` – day of week (0..6) +- `%y` – year (0..9999) +- `%yy` – year (00..99), abbreviated (last two digits) +- `%yyyy` – year (0000..9999), padded to length of 4 +- `%yyyyyy` – year (-009999 .. +009999), with sign prefix and padded to length of 6 +- `%m` – month (1..12) +- `%mm` – month (01..12), padded to length of 2 +- `%d` – day (1..31) +- `%dd` – day (01..31), padded to length of 2 +- `%h` – hour (0..23) +- `%hh` – hour (00..23), padded to length of 2 +- `%i` – minute (0..59) +- `%ii` – minute (00..59), padded to length of 2 +- `%s` – second (0..59) +- `%ss` – second (00..59), padded to length of 2 +- `%f` – millisecond (0..999) +- `%fff` – millisecond (000..999), padded to length of 3 +- `%x` – day of year (1..366) +- `%xxx` – day of year (001..366), padded to length of 3 +- `%k` – ISO week number of year (1..53) +- `%kk` – ISO week number of year (01..53), padded to length of 2 +- `%l` – leap year (0 or 1) +- `%q` – quarter (1..4) +- `%a` – days in month (28..31) +- `%mmm` – abbreviated English name of month (Jan..Dec) +- `%mmmm` – English name of month (January..December) +- `%www` – abbreviated English name of weekday (Sun..Sat) +- `%wwww` – English name of weekday (Sunday..Saturday) +- `%&` – special escape sequence for rare occasions +- `%%` – literal % +- `%` – ignored + +`%yyyy` does not enforce a length of 4 for years before 0 and past 9999. +The same format as for `%yyyyyy` is used instead. `%yy` preserves the +sign for negative years and may thus return 3 characters in total. + +Single `%` characters are ignored. Use `%%` for a literal `%`. To resolve +ambiguities like in `%mmonth` (unpadded month number + the string `month`) +between `%mm` + `onth` and `%m` + `month`, use the escape sequence `%&`: +`%m%&month`. + +Note that `DATE_FORMAT()` is a rather costly operation and may not be suitable for large +datasets (like over 1 million dates). If possible, avoid formatting dates on +server-side and leave it up to the client to do so. This function should only +be used for special date comparisons or to store the formatted dates in the +database. For better performance, use the primitive `DATE_*()` functions +together with `CONCAT()` if possible. + +**Examples** + +```aql +DATE_FORMAT(DATE_NOW(), "%q/%yyyy") // quarter and year (e.g. "3/2015") +DATE_FORMAT(DATE_NOW(), "%dd.%mm.%yyyy %hh:%ii:%ss,%fff") // e.g. "18.09.2015 15:30:49,374" +DATE_FORMAT("1969", "Summer of '%yy") // "Summer of '69" +DATE_FORMAT("2016", "%%l = %l") // "%l = 1" (2016 is a leap year) +DATE_FORMAT("2016-03-01", "%xxx%") // "063", trailing % ignored +``` + +```aql +--- +name: dateFormat +description: | + Example calls of the formatting function and their results: +bindVars: + { + "formats": [ + { "date": "2023-03-25T23:00:00.000Z", "placeholder": "%w", "equalTo": "DATE_DAYOFWEEK" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%yyyy", "equalTo": "DATE_YEAR" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%m", "equalTo": "DATE_MONTH" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%d", "equalTo": "DATE_DAY" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%h", "equalTo": "DATE_HOUR" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%i", "equalTo": "DATE_MINUTE" }, + { "date": "2023-12-31T23:00:23.000Z", "placeholder": "%s", "equalTo": "DATE_SECOND" }, + { "date": "2023-12-31T23:00:00.031Z", "placeholder": "%f", "equalTo": "DATE_MILLISECOND" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%x", "equalTo": "DATE_DAYOFYEAR" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%k", "equalTo": "DATE_ISOWEEK" }, + { "date": "2016-12-31T23:00:00.000Z", "placeholder": "%l", "equalTo": "DATE_LEAPYEAR" }, + { "date": "2023-12-31T23:00:00.000Z", "placeholder": "%q", "equalTo": "DATE_QUARTER" }, + { "date": "2023-11-30T23:00:00.000Z", "placeholder": "%a", "equalTo": "DATE_DAYS_IN_MONTH" }, + { "date": "2023-11-30T23:00:00.000Z", "placeholder": "%t", "equalTo": "DATE_TIMESTAMP" } + ] + } +--- +FOR format IN @formats + RETURN CONCAT( + format.equalTo, + "('", + format.date, + "') = ", + DATE_FORMAT(format.date, format.placeholder) + ) +``` + +## Comparison and calculation + +### DATE_ADD() + +`DATE_ADD(date, amount, unit) → isoDate` + +Add `amount` given in `unit` to `date` and return the calculated date. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **amount** (number\|string): number of `unit`s to add (positive value) or + subtract (negative value). It is recommended to use positive values only, + and use [`DATE_SUBTRACT()`](#date_subtract) for subtractions instead. +- **unit** (string): either of the following to specify the time unit to add or + subtract (case-insensitive): + - `"y"`, `"year"`, `"years"` + - `"m"`, `"month"`, `"months"` + - `"w"`, `"week"`, `"weeks"` + - `"d"`, `"day"`, `"days"` + - `"h"`, `"hour"`, `"hours"` + - `"i"`, `"minute"`, `"minutes"` + - `"s"`, `"second"`, `"seconds"` + - `"f"`, `"millisecond"`, `"milliseconds"` +- returns **isoDate** (string): the calculated ISO 8601 date time string + +```aql +DATE_ADD(DATE_NOW(), -1, "day") // yesterday; also see DATE_SUBTRACT() +DATE_ADD(DATE_NOW(), 3, "months") // in three months +DATE_ADD(DATE_ADD("2015-04-01", 5, "years"), 1, "month") // May 1st 2020 +DATE_ADD("2015-04-01", 12*5 + 1, "months") // also May 1st 2020 +DATE_ADD(DATE_TIMESTAMP(DATE_YEAR(DATE_NOW()), 12, 24), -4, "years") // Christmas four years ago +DATE_ADD(DATE_ADD("2016-02", "month", 1), -1, "day") // last day of February (29th, because 2016 is a leap year!) +``` + +--- + +`DATE_ADD(date, isoDuration) → isoDate` + +You may also pass an ISO duration string as `amount` and leave out `unit`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **isoDuration** (string): an ISO 8601 duration string to add to `date`, see below +- returns **isoDate** (string): the calculated ISO 8601 date time string + +The format is `P_Y_M_W_DT_H_M_._S`, where underscores stand for digits and +letters for time intervals - except for the separators `P` (period) and `T` (time). +The meaning of the other letters are: +- `Y` – years +- `M` – months (if before T) +- `W` – weeks +- `D` – days +- `H` – hours +- `M` – minutes (if after T) +- `S` – seconds (optionally with 3 decimal places for milliseconds) + +The string must be prefixed by a `P`. A separating `T` is only required if +`H`, `M` and/or `S` are specified. You only need to specify the needed pairs +of letters and numbers. + +```aql +DATE_ADD(DATE_NOW(), "P1Y") // add 1 year +DATE_ADD(DATE_NOW(), "P3M2W") // add 3 months and 2 weeks +DATE_ADD(DATE_NOW(), "P5DT26H") // add 5 days and 26 hours (=6 days and 2 hours) +DATE_ADD("2000-01-01", "PT4H") // add 4 hours +DATE_ADD("2000-01-01", "PT30M44.4S") // add 30 minutes, 44 seconds and 400 ms +DATE_ADD("2000-01-01", "P1Y2M3W4DT5H6M7.89S") // add a bit of everything +``` + +### DATE_SUBTRACT() + +`DATE_SUBTRACT(date, amount, unit) → isoDate` + +Subtract `amount` given in `unit` from `date` and return the calculated date. + +It works the same as [`DATE_ADD()`](#date_add), except that it subtracts. It is +equivalent to calling `DATE_ADD()` with a negative amount, except that +`DATE_SUBTRACT()` can also subtract ISO durations. Note that negative ISO +durations are not supported (i.e. starting with `-P`, like `-P1Y`). + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **amount** (number\|string): number of `unit`s to subtract (positive value) or + add (negative value). It is recommended to use positive values only, + and use [`DATE_ADD()`](#date_add) for additions instead. +- **unit** (string): either of the following to specify the time unit to add or + subtract (case-insensitive): + - `"y"`, `"year"`, `"years"` + - `"m"`, `"month"`, `"months"` + - `"w"`, `"week"`, `"weeks"` + - `"d"`, `"day"`, `"days"` + - `"h"`, `"hour"`, `"hours"` + - `"i"`, `"minute"`, `"minutes"` + - `"s"`, `"second"`, `"seconds"` + - `"f"`, `"millisecond"`, `"milliseconds"` +- returns **isoDate** (string): the calculated ISO 8601 date time string + +--- + +`DATE_SUBTRACT(date, isoDuration) → isoDate` + +You may also pass an ISO duration string as `amount` and leave out `unit`. + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **isoDuration** (string): an ISO 8601 duration string to subtract from `date`, + see below +- returns **isoDate** (string): the calculated ISO 8601 date time string + +The format is `P_Y_M_W_DT_H_M_._S`, where underscores stand for digits and +letters for time intervals - except for the separators `P` (period) and `T` (time). +The meaning of the other letters are: +- `Y` – years +- `M` – months (if before T) +- `W` – weeks +- `D` – days +- `H` – hours +- `M` – minutes (if after T) +- `S` – seconds (optionally with 3 decimal places for milliseconds) + +The string must be prefixed by a `P`. A separating `T` is only required if +`H`, `M` and/or `S` are specified. You only need to specify the needed pairs +of letters and numbers. + +```aql +DATE_SUBTRACT(DATE_NOW(), 1, "day") // yesterday +DATE_SUBTRACT(DATE_TIMESTAMP(DATE_YEAR(DATE_NOW()), 12, 24), 4, "years") // Christmas four years ago +DATE_SUBTRACT(DATE_ADD("2016-02", "month", 1), 1, "day") // last day of February (29th, because 2016 is a leap year!) +DATE_SUBTRACT(DATE_NOW(), "P4D") // four days ago +DATE_SUBTRACT(DATE_NOW(), "PT1H3M") // 1 hour and 30 minutes ago +``` + +### DATE_DIFF() + +`DATE_DIFF(date1, date2, unit, asFloat) → diff` + +Calculate the difference between two dates in given time `unit`, optionally +with decimal places. + +- **date1** (number\|string): numeric timestamp or ISO 8601 date time string +- **date2** (number\|string): numeric timestamp or ISO 8601 date time string +- **unit** (string): either of the following to specify the time unit to return the + difference in (case-insensitive): + - `"y"`, `"year"`, `"years"` + - `"m"`, `"month"`, `"months"` + - `"w"`, `"week"`, `"weeks"` + - `"d"`, `"day"`, `"days"` + - `"h"`, `"hour"`, `"hours"` + - `"i"`, `"minute"`, `"minutes"` + - `"s"`, `"second"`, `"seconds"` + - `"f"`, `"millisecond"`, `"milliseconds"` +- **asFloat** (boolean, *optional*): if set to `true`, decimal places are + preserved in the result. The default is `false` and an integer is returned. +- returns **diff** (number): the calculated difference as number in `unit`. + The value is negative if `date2` is before `date1`. + +```aql +--- +name: datediff1 +description: | + Determine how many days it is from New Year's Eve until April Fools' day: +--- +RETURN DATE_DIFF("2023-12-01", "2024-04-01", "days") +``` + +### DATE_COMPARE() + +`DATE_COMPARE(date1, date2, unitRangeStart, unitRangeEnd) → bool` + +Check if two partial dates match. + +- **date1** (number\|string): numeric timestamp or ISO 8601 date time string +- **date2** (number\|string): numeric timestamp or ISO 8601 date time string +- **unitRangeStart** (string): unit to start from, see below +- **unitRangeEnd** (string, *optional*): unit to end with, leave out to only + compare the component as specified by `unitRangeStart`. An error is raised if + `unitRangeEnd` is a unit before `unitRangeStart`. +- returns **bool** (bool): `true` if the dates match, `false` otherwise + +The parts to compare are defined by a range of time units. The full range is: +years, months, days, hours, minutes, seconds, milliseconds (in this order). + +All components of `date1` and `date2` as specified by the range are compared. +You can refer to the units as: + +- `"y"`, `"year"`, `"years"` +- `"m"`, `"month"`, `"months"` +- `"d"`, `"day"`, `"days"` +- `"h"`, `"hour"`, `"hours"` +- `"i"`, `"minute"`, `"minutes"` +- `"s"`, `"second"`, `"seconds"` +- `"f"`, `"millisecond"`, `"milliseconds"` + +**Examples** + +```aql +// Compare months and days, true on birthdays if you're born on 4th of April +DATE_COMPARE("1985-04-04", DATE_NOW(), "months", "days") + +// Only matches on one day if the current year is a leap year! +// You may want to add or subtract one day from date1 to match every year. +DATE_COMPARE("1984-02-29", DATE_NOW(), "months", "days") + +// compare years, months and days (true, because it's the same day) +DATE_COMPARE("2001-01-01T15:30:45.678Z", "2001-01-01T08:08:08.008Z", "years", "days") +``` + +You can directly compare ISO date **strings** if you want to find dates before or +after a certain date, or in between two dates (`>=`, `>`, `<`, `<=`). +No special date function is required. Equality tests (`==` and `!=`) only +match the exact same date and time, however. You may use `SUBSTRING()` to +compare partial date strings, `DATE_COMPARE()` is basically a convenience +function for that. However, neither is really required to limit a search to a +certain day as demonstrated here: + +```aql +FOR doc IN coll + FILTER doc.date >= "2015-05-15" AND doc.date < "2015-05-16" + RETURN doc +``` + +Every ISO date on that day is greater than or equal to `2015-05-15` in a string +comparison (e.g. `2015-05-15T11:30:00.000Z`). Dates before `2015-05-15` are smaller +and therefore filtered out by the first condition. Every date past `2015-05-15` is +greater than this date in a string comparison, and therefore filtered out by the +second condition. The result is that the time components in the dates you compare +with are "ignored". The query returns every document with `date` ranging from +`2015-05-15T00:00:00.000Z` to `2015-05-15T23:99:99.999Z`. It would also include +`2015-05-15T24:00:00.000Z`, but that date is actually `2015-05-16T00:00:00.000Z` +and can only occur if inserted manually (you may want to pass dates through +[`DATE_ISO8601()`](#date_iso8601) to ensure a correct date representation). + +Leap days in leap years (29th of February) must be always handled manually, +if you require so (e.g. birthday checks): + +```aql +LET today = DATE_NOW() +LET noLeapYear = NOT DATE_LEAPYEAR(today) + +FOR user IN users + LET birthday = noLeapYear AND + DATE_MONTH(user.birthday) == 2 AND + DATE_DAY(user.birthday) == 29 + ? DATE_SUBTRACT(user.birthday, 1, "day") /* treat like 28th in non-leap years */ + : user.birthday + FILTER DATE_COMPARE(today, birthday, "month", "day") + /* includes leaplings on the 28th of February in non-leap years, + * but excludes them in leap years which do have a 29th February. + * Replace DATE_SUBTRACT() by DATE_ADD() to include them on the 1st of March + * in non-leap years instead (depends on local jurisdiction). + */ + RETURN user +``` + +### DATE_UTCTOLOCAL() + +<small>Introduced in: v3.8.0</small> + +Converts `date` assumed in Zulu time (UTC) to local `timezone`. + +It takes historic daylight saving times into account. + +`DATE_UTCTOLOCAL(date, timezone, zoneinfo) → date` + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **timezone** (string): + [IANA timezone name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones), + e.g. `"America/New_York"`, `"Europe/Berlin"` or `"UTC"`. + Use `"America/Los_Angeles"` for Pacific time (PST/PDT). + Throws an error if the timezone is not known to ArangoDB. +- **zoneinfo** (boolean, *optional*): if set to `true`, an object with timezone + information is returned. The default is `false` and a date string is returned +- returns **date** (string\|object): an ISO 8601 date time string in + unqualified local time, or an object with the following attributes: + - **local** (string): ISO 8601 date time string in unqualified local time + - **tzdb** (string): version of the timezone database used (e.g. `"2020f"`) + - **zoneInfo**: (object): timezone information + - **name** (string): timezone abbreviation (GMT, PST, CET, ...) + - **begin** (string\|null): begin of the timezone effect as UTC date time string + - **end** (string\|null): end of the timezone effect as UTC date time string + - **dst** (boolean): `true` when daylight saving time (DST) is active, + `false` otherwise + - **offset** (number): offset to UTC in seconds + +```aql +--- +name: aqlDateTimeToLocal_1 +description: | + Convert a date time string to different local timezones: +--- +RETURN [ + DATE_UTCTOLOCAL("2020-03-15T00:00:00.000", "Europe/Berlin"), + DATE_UTCTOLOCAL("2020-03-15T00:00:00.000", "America/New_York"), + DATE_UTCTOLOCAL("2020-03-15T00:00:00.000", "UTC") +] +``` + +```aql +--- +name: aqlDateTimeToLocal_2 +description: | + Convert date time strings with and without UTC indicator (`Z`), with a timezone + offset, and a Unix timestamp to local time: +--- +RETURN [ + DATE_UTCTOLOCAL("2020-03-15T00:00:00.000", "Asia/Shanghai"), + DATE_UTCTOLOCAL("2020-03-15T00:00:00.000Z", "Asia/Shanghai"), + DATE_UTCTOLOCAL("2020-03-15T00:00:00.000-02:00", "Asia/Shanghai"), + DATE_UTCTOLOCAL(1584230400000, "Asia/Shanghai") +] +``` + +```aql +--- +name: aqlDateTimeToLocal_3 +description: | + Convert to local time and include timezone information: +--- +RETURN DATE_UTCTOLOCAL(DATE_NOW(), "Africa/Lagos", true) +``` + +### DATE_LOCALTOUTC() + +<small>Introduced in: v3.8.0</small> + +Converts `date` assumed in local `timezone` to Zulu time (UTC). + +It takes historic daylight saving times into account. + +`DATE_LOCALTOUTC(date, timezone, zoneinfo) → date` + +- **date** (number\|string): numeric timestamp or ISO 8601 date time string +- **timezone** (string): + [IANA timezone name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones), + e.g. `"America/New_York"`, `"Europe/Berlin"` or `"UTC"`. + Use `"America/Los_Angeles"` for Pacific time (PST/PDT). + Throws an error if the timezone is not known to ArangoDB. +- **zoneinfo** (boolean, *optional*): if set to `true`, an object with timezone + information is returned. The default is `false` and a date string is returned +- returns **date** (string\|object): an ISO 8601 date time string in + Zulu time (UTC), or an object with the following attributes: + - **utc** (string): ISO 8601 date time string in Zulu time (UTC) + - **tzdb** (string): version of the timezone database used (e.g. `"2020f"`) + - **zoneInfo**: (object): timezone information + - **name** (string): timezone abbreviation (GMT, PST, CET, ...) + - **begin** (string\|null): begin of the timezone effect as UTC date time string + - **end** (string\|null): end of the timezone effect as UTC date time string + - **dst** (boolean): `true` when daylight saving time (DST) is active, + `false` otherwise + - **offset** (number): offset to UTC in seconds + +```aql +--- +name: aqlDateTimeToUTC_1 +description: | + Convert a date time string from different local timezones to UTC: +--- +RETURN [ + DATE_LOCALTOUTC("2020-03-15T00:00:00.000", "Europe/Berlin"), + DATE_LOCALTOUTC("2020-03-15T00:00:00.000", "America/New_York"), + DATE_LOCALTOUTC("2020-03-15T00:00:00.000", "UTC") +] +``` + +```aql +--- +name: aqlDateTimeToUTC_2 +description: | + Convert date time strings with and without UTC indicator (`Z`), with a timezone + offset, and a Unix timestamp to UTC time: +--- +RETURN [ + DATE_LOCALTOUTC("2020-03-15T00:00:00.000", "Asia/Shanghai"), + DATE_LOCALTOUTC("2020-03-15T00:00:00.000Z", "Asia/Shanghai"), + DATE_LOCALTOUTC("2020-03-15T00:00:00.000-02:00", "Asia/Shanghai"), + DATE_LOCALTOUTC(1584230400000, "Asia/Shanghai") +] +``` + +```aql +--- +name: aqlDateTimeToUTC_3 +description: | + Convert to UTC time and include timezone information: +--- +RETURN DATE_LOCALTOUTC("2021-03-16T12:00:00.000", "Africa/Lagos", true) +``` + +### DATE_TIMEZONE() + +<small>Introduced in: v3.8.0</small> + +Returns system timezone ArangoDB is running on. + +For cloud servers, this is most likely `"Etc/UTC"`. + +`DATE_TIMEZONE() → timezone` + +- returns **timezone** (string): + [IANA timezone name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) + of the server timezone. + +### DATE_TIMEZONES() + +<small>Introduced in: v3.8.0</small> + +Returns all valid timezone names. + +`DATE_TIMEZONES() → timezones` + +- returns **timezones** (array): an array of + [IANA timezone names](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) + +## Working with dates and indexes + +There are two recommended ways to store timestamps in ArangoDB: + - string: UTC timestamp with [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) + - number: [unix timestamp](https://en.wikipedia.org/wiki/Unix_time) with millisecond precision + +The sort order of both is identical due to the sort properties of ISO date strings. +You can't mix both types, numbers and strings, in a single attribute however. + +You can use [persistent indexes](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md) with both date types. +When choosing string representations, you can work with string comparisons (less than, +greater than etc.) to express time ranges in your queries while still utilizing +persistent indexes: + +```js +--- +name: working_with_date_time +description: '' +--- +db._create("exampleTime"); +var timestamps = [ + "2014-05-07T14:19:09.522", + "2014-05-07T21:19:09.522", + "2014-05-08T04:19:09.522", + "2014-05-08T11:19:09.522", + "2014-05-08T18:19:09.522" +]; +for (i = 0; i < 5; i++) { + db.exampleTime.save({value:i, ts: timestamps[i]}); +} +db._query(` + FOR d IN exampleTime + FILTER d.ts > '2014-05-07T14:19:09.522' AND d.ts < '2014-05-08T18:19:09.522' + RETURN d +`).toArray() +~addIgnoreCollection("example") +~db._drop("exampleTime") +``` + +The first and the last timestamp in the array are excluded from the result by the `FILTER`. + +## Limitations + +Note that dates before the year 1583 aren't allowed by the +[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) standard by default, because +they lie before the official introduction of the Gregorian calendar and may thus +be incorrect or invalid. All AQL date functions apply the same rules to every +date according to the Gregorian calendar system, even if inappropriate. That +does not constitute a problem, unless you deal with dates prior to 1583 and +especially years before Christ. The standard allows negative years, but requires +special treatment of positive years too, if negative years are used (e.g. +`+002015-05-15` and `-000753-01-01`). This is rarely used however, and AQL does +not use the 7-character version for years between 0 and 9999 in ISO strings. +Keep in mind that they can't be properly compared to dates outside that range. +Sorting of negative dates does not result in a meaningful order, with years longer +ago last, but months, days and the time components in otherwise correct order. + +Leap seconds are ignored, just as they are in JavaScript as per +[ECMAScript Language Specifications](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1). diff --git a/site/content/arangodb/oem/aql/functions/document-object.md b/site/content/arangodb/oem/aql/functions/document-object.md new file mode 100644 index 0000000000..4394f6fc4c --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/document-object.md @@ -0,0 +1,1023 @@ +--- +title: Document and object functions in AQL +menuTitle: Document / Object +weight: 25 +description: >- + AQL provides functions to operate on objects respectively document values +--- +You can use the below listed functions with the +[object data type](../../concepts/data-structure/documents/_index.md#data-types). +Also see [object access](../fundamentals/data-types.md#objects--documents) for +additional language constructs for objects. + +## ATTRIBUTES() + +`ATTRIBUTES(document, removeSystemAttrs, sort) → strArray` + +Return the top-level attribute keys of the `document` as an array. +Optionally omit system attributes and sort the array. + +To return the attribute values instead, see the [`VALUES()` function](#values). + +- **document** (object): an arbitrary document / object +- **removeSystemAttrs** (bool, *optional*): whether all system attributes + (starting with an underscore, such as `_key` and `_id`) shall be omitted in + the result. The default is `false`. +- **sort** (bool, *optional*): optionally sort the resulting array alphabetically. + The default is `false` and will return the attribute names in any order. +- returns **strArray** (array): the attribute keys of the input `document` as an + array of strings + +**Examples** + +Return the attribute keys of an object: + +```aql +--- +name: aqlAttributes +description: '' +--- +RETURN ATTRIBUTES( { "foo": "bar", "_key": "123", "_custom": "yes" } ) +``` + +Return the attribute keys of an object but omit system attributes: + +```aql +--- +name: aqlAttributesRemoveInternal +description: '' +--- +RETURN ATTRIBUTES( { "foo": "bar", "_key": "123", "_custom": "yes" }, true ) +``` + +Return the attribute keys of an object in alphabetic order: + +```aql +--- +name: aqlAttributesSort +description: '' +--- +RETURN ATTRIBUTES( { "foo": "bar", "_key": "123", "_custom": "yes" }, false, true ) +``` + +Complex example to count how often every top-level attribute key occurs in the +documents of a collection (expensive on large collections): + +```aql +LET attributesPerDocument = ( + FOR doc IN collection RETURN ATTRIBUTES(doc, true) +) +FOR attributeArray IN attributesPerDocument + FOR attribute IN attributeArray + COLLECT attr = attribute WITH COUNT INTO count + SORT count DESC + RETURN {attr, count} +``` + +## COUNT() + +This is an alias for [`LENGTH()`](#length). + +## HAS() + +`HAS(document, attributeName) → isPresent` + +Test whether an attribute is present in the provided document. + +- **document** (object): an arbitrary document / object +- **attributeName** (string): the attribute key to test for +- returns **isPresent** (bool): `true` if `document` has an attribute named + `attributeName`, and `false` otherwise. Also returns `true` if the attribute + has a falsy value (`null`, `0`, `false`, empty string `""`) + +The function checks if the specified attribute exists, regardless of its value. +Other ways of testing for the existence of an attribute may behave differently +if the attribute has a falsy value or is not present (implicitly `null` on +object access): + +```aql +!!{ name: "" }.name // false +HAS( { name: "" }, "name") // true + +{ name: null }.name == null // true +{ }.name == null // true +HAS( { name: null }, "name" ) // true +HAS( { }, "name" ) // false +``` + +Note that `HAS()` cannot utilize indexes. If it is not necessary to distinguish +between explicit and implicit *null* values in your query, you may use an equality +comparison to test for *null* and create a non-sparse index on the attribute you +want to test against: + +```aql +FILTER !HAS(doc, "name") // cannot use indexes +FILTER IS_NULL(doc, "name") // cannot use indexes +FILTER doc.name == null // can utilize non-sparse indexes +``` + +**Examples** + +Check whether the example object has a `name` attribute key: + +```aql +--- +name: aqlHas_1 +description: '' +--- +RETURN HAS( { name: "Jane" }, "name" ) +``` + +Check whether the example object has an `age` attribute key: + +```aql +--- +name: aqlHas_2 +description: '' +--- +RETURN HAS( { name: "Jane" }, "age" ) +``` + +Falsy attribute values like `null` still count as the attribute being present: + +```aql +--- +name: aqlHas_3 +description: '' +--- +RETURN HAS( { name: null }, "name" ) +``` + +## IS_SAME_COLLECTION() + +`IS_SAME_COLLECTION(collectionName, documentIdentifier) → isSame` + +Test whether the `documentIdentifier` has `collectionName` as collection. + +The function does not validate whether the collection actually contains the +specified document. It only compares the name of the specified collection +with the collection name part of the specified document. + +- **collectionName** (string): the name of a collection as string +- **documentIdentifier** (string\|object): a document identifier string + (e.g. `_users/1234`) or an object with an `_id` attribute (e.g. a document + from a collection). +- returns **isSame** (bool): `true` if the collection of `documentIdentifier` is the + same as `collectionName`, or `false` if it is not. If `documentIdentifier` is an + object without an `_id` attribute or anything other than a string or object, + then `null` is returned and a warning is raised. + +**Examples** + +```aql +--- +name: aqlIsSameCollection +description: '' +--- +RETURN [ + IS_SAME_COLLECTION( "_users", "_users/my-user" ), + IS_SAME_COLLECTION( "_users", { _id: "_users/my-user" } ), + IS_SAME_COLLECTION( "_users", "foobar/baz"), + IS_SAME_COLLECTION( "_users", { _id: "something/else" } ) +] +``` + +## KEEP() + +`KEEP(document, attributeName1, attributeName2, ... attributeNameN) → doc` + +Keep only the attributes `attributeName` to `attributeNameN` of `document`. +All other attributes will be removed from the result. + +To do the opposite, see [`UNSET()`](#unset). + +- **document** (object): a document / object +- **attributeNames** (string, *repeatable*): an arbitrary number of attribute + names as multiple arguments +- returns **doc** (object): a document with only the specified attributes at + the top-level + +**Examples** + +Keep the top-level `foo` attribute, preserving its nested object: + +```aql +--- +name: aqlKeep_1 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP(doc, "foo") +``` + +Keep the top-level `bar` attribute, which the example object does not have, +resulting in an empty object: + +```aql +--- +name: aqlKeep_2 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP(doc, "bar") +``` + +Keep the top-level `baz` attribute: + +```aql +--- +name: aqlKeep_3 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP(doc, "baz") +``` + +Keep multiple top-level attributes (`foo` and `baz`): + +```aql +--- +name: aqlKeep_4 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP(doc, "foo", "baz") +``` + +--- + +`KEEP(document, attributeNameArray) → doc` + +- **document** (object): a document / object +- **attributeNameArray** (array): an array of attribute names as strings +- returns **doc** (object): a document with only the specified attributes at + the top-level + +**Examples** + +Keep multiple top-level attributes (`foo` and `baz`), by passing an array of the +attribute keys instead of individual arguments: + +```aql +--- +name: aqlKeep_5 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP(doc, ["foo", "baz"]) +``` + +## KEEP_RECURSIVE() + +`KEEP_RECURSIVE(document, attributeName1, attributeName2, ... attributeNameN) → doc` + +Recursively preserve the attributes `attributeName1` to `attributeNameN` from +`document` and its sub-documents. All other attributes will be removed. + +To do the opposite, use [`UNSET_RECURSIVE()`](#unset_recursive). + +- **document** (object): a document / object +- **attributeNames** (string, *repeatable*): an arbitrary number of attribute + names as multiple arguments (at least 1) +- returns **doc** (object): `document` with only the specified attributes at + all levels (top-level as well as nested objects) + +**Examples** + +Recursively preserve `foo` attributes, but not nested attributes that have +parents with other names: + +```aql +--- +name: aqlKeepRecursive_1 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, "foo") +``` + +Recursively preserve `bar` attributes, but there is none at the top-level, leading +to an empty object: + +```aql +--- +name: aqlKeepRecursive_2 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, "bar") +``` + +Recursively preserve `baz` attributes, but not nested attributes that have +parents with other names: + +```aql +--- +name: aqlKeepRecursive_3 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, "baz") +``` + +Recursively preserve multiple attributes (`foo` and `bar`): + +```aql +--- +name: aqlKeepRecursive_4 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, "foo", "bar") +``` + +Recursively preserve multiple attributes (`foo` and `baz`), but not nested +attributes that have parents with other names: + +```aql +--- +name: aqlKeepRecursive_5 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, "foo", "baz") +``` + +Recursively preserve multiple attributes (`foo`, `bar`, and `baz`), preserving all +attributes of the example object: + +```aql +--- +name: aqlKeepRecursive_6 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, "foo", "bar", "baz") +``` + +--- + +`KEEP_RECURSIVE(document, attributeNameArray) → doc` + +- **document** (object): a document / object +- **attributeNameArray** (array): an array of attribute names as strings +- returns **doc** (object): *document* with only the specified attributes at + all levels (top-level as well as nested objects) + +**Examples** + +Recursively preserve multiple attributes (`foo` and `baz`), by passing an array of the +attribute keys instead of individual arguments: + +```aql +--- +name: aqlKeepRecursive_7 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN KEEP_RECURSIVE(doc, ["foo", "baz"]) +``` + +## KEYS() + +This is an alias for [`ATTRIBUTES()`](#attributes). + +## LENGTH() + +`LENGTH(doc) → attrCount` + +Determine the number of attribute keys of an object / document. + +`LENGTH()` can also determine the [number of elements](array.md#length) in an array, +the [amount of documents](miscellaneous.md#length) in a collection and +the [character length](string.md#length) of a string. + +- **doc** (object): a document / object +- returns **attrCount** (number): the number of attribute keys in `doc`, regardless + of their values + +**Examples** + +```aql +--- +name: aqlLengthObject +description: '' +--- +RETURN LENGTH({ name: "Emma", age: 36, phone: { mobile: "..." } }) +``` + +## MATCHES() + +`MATCHES(document, examples, returnIndex) → match` + +Compare the given `document` against each example document provided. The comparisons +will be started with the first example. All attributes of the example will be compared +against the attributes of `document`. If all attributes match, the comparison stops +and the result is returned. If there is a mismatch, the function will continue the +comparison with the next example until there are no more examples left. + +The `examples` can be an array of 1..n example documents or a single document, +with any number of attributes each. + +An attribute value of `null` will match documents with an explicit attribute value +of `null` as well as documents with this attribute missing (implicitly `null`). +Only [`HAS()`](#has) can differentiate between an attribute being absent and having +a stored `null` value. + +An empty object `{}` will match all documents. Be careful not to ask for all +documents accidentally. For example, the [arangojs](../../develop/drivers/javascript.md) driver +skips attributes with a value of `undefined`, turning `{attr: undefined}` into `{}`. + +{{< info >}} +`MATCHES()` cannot utilize indexes. You may use plain `FILTER` conditions instead +to potentially benefit from existing indexes: + +```aql +FOR doc IN coll + FILTER (cond1 AND cond2 AND cond3) OR (cond4 AND cond5) ... +``` +{{< /info >}} + +- **document** (object): document to determine whether it matches any example +- **examples** (object\|array): a single document, or an array of documents to compare + against. Specifying an empty array is not allowed. +- **returnIndex** (bool): by setting this flag to `true`, the index of the example that + matched will be returned (starting at offset 0), or `-1` if there was no match. + The default is `false` and makes the function return a boolean. +- returns **match** (bool\|number): if `document` matches one of the examples, `true` is + returned, otherwise `false`. A number is returned instead if `returnIndex` is enabled. + +**Examples** + +Check whether all attributes of the example are present in the document: + +```aql +--- +name: aqlMatches_1 +description: '' +--- +LET doc = { + name: "jane", + age: 27, + active: true +} +RETURN MATCHES(doc, { age: 27, active: true } ) +``` + +Check whether one of the examples matches the document and return the index of +the matching example: + +```aql +--- +name: aqlMatches_2 +description: '' +--- +RETURN MATCHES( + { "test": 1 }, + [ + { "test": 1, "foo": "bar" }, + { "foo": 1 }, + { "test": 1 } + ], +true) +``` + +## MERGE() + +`MERGE(document1, document2, ... documentN) → mergedDocument` + +Merge the documents `document1` to `documentN` into a single document. +If document attribute keys are ambiguous, the merged result will contain the values +of the documents contained later in the argument list. + +Note that merging will only be done for top-level attributes. If you wish to +merge sub-attributes, use [`MERGE_RECURSIVE()`](#merge_recursive) instead. + +- **documents** (object, *repeatable*): an arbitrary number of documents as + multiple arguments (at least 2) +- returns **mergedDocument** (object): a combined document + +**Examples** + +Two documents with distinct attribute names can easily be merged into one: + +```aql +--- +name: aqlMerge_1 +description: '' +--- +RETURN MERGE( + { "user1": { "name": "Jane" } }, + { "user2": { "name": "Tom" } } +) +``` + +When merging documents with identical attribute names, the attribute values of the +latter documents will be used in the end result: + +```aql +--- +name: aqlMerge_2 +description: '' +--- +RETURN MERGE( + { "users": { "name": "Jane" } }, + { "users": { "name": "Tom" } } +) +``` + +--- + +`MERGE(docArray) → mergedDocument` + +`MERGE()` also accepts a single array parameter. This variant allows combining the +attributes of multiple objects in an array into a single object. + +- **docArray** (array): an array of documents, as sole argument +- returns **mergedDocument** (object): a combined document + +**Examples** + +```aql +--- +name: aqlMerge_3 +description: '' +--- +RETURN MERGE( + [ + { foo: "bar" }, + { quux: "quetzalcoatl", ruled: true }, + { bar: "baz", foo: "done" } + ] +) +``` + +{{< tip >}} +Consider to use [`ZIP()`](#zip) instead of `MERGE()` if you want to merge a set +of disjoint keys and their associated values into a single object. + +This could be a pattern like the following where objects with dynamic attribute +keys are created and then merged together (here to return a map of distinct +attribute values and how often they occur): + +```aql +RETURN MERGE( + FOR doc IN coll + COLLECT value = doc.attr WITH COUNT INTO count + RETURN { [value]: count } +) +``` + +This creates many temporary objects and can be slow if there are thousands of +objects to merge. The following pattern using `ZIP()` is more efficient: + +```aql +LET counts = ( + FOR doc IN coll + COLLECT value = doc.attr WITH COUNT INTO count + RETURN [value, count] +) +RETURN ZIP(counts[*][0], counts[*][1]) +``` +{{< /tip >}} + +## MERGE_RECURSIVE() + +`MERGE_RECURSIVE(document1, document2, ... documentN) → mergedDocument` + +Recursively merge the documents `document1` to `documentN` into a single document. +If document attribute keys overlap, the merged result contains the values +of the documents contained later in the argument list. + +- **documents** (object, *repeatable*): an arbitrary number of documents as + multiple arguments (at least 1) +- returns **mergedDocument** (object): a combined document + +**Examples** + +Merge two documents with the same top-level attribute, combining the `name`, +`age`, and `livesIn` sub-attributes: + +```aql +--- +name: aqlMergeRecursive_1 +description: '' +--- +RETURN MERGE_RECURSIVE( + { "user-1": { "name": "Jane", "livesIn": { "city": "LA" } } }, + { "user-1": { "age": 42, "livesIn": { "state": "CA" } } } +) +``` + +`MERGE_RECURSIVE(documents) → mergedDocument` + +Recursively merge the list of documents into a single document. +If document attribute keys overlap, the merged result contains the values +of the documents specified later in the list. + +- **documents** (array): an array with an arbitrary number of objects +- returns **mergedDocument** (object): a combined document + +**Examples** + +Merge a list of two documents with the same top-level attribute, combining the +`name` and `age` sub-attributes but overwriting the `city` value in the +`livesIn` sub-attribute: + +```aql +--- +name: aqlMergeRecursive_2 +description: '' +--- +RETURN MERGE_RECURSIVE( + [ + { "user-1": { "name": "Jane", "livesIn": { "city": "LA" } } }, + { "user-1": { "age": 42, "livesIn": { "city": "NY" } } } + ] +) +``` + +## PARSE_IDENTIFIER() + +`PARSE_IDENTIFIER(documentIdentifier) → parts` + +Parse a [document ID](../../concepts/data-structure/documents/_index.md#document-identifiers) +and separately return the collection name and the document key. + +- **documentIdentifier** (string\|object): a document identifier string (e.g. `_users/1234`) + or a regular document from a collection. Passing either a non-string or a non-document + or a document without an `_id` attribute results in an error. +- returns **parts** (object): an object with the attributes `collection` and `key` + +**Examples** + +Parse a document identifier string and extract both the collection name and the +document key: + +```aql +--- +name: aqlParseIdentifier_1 +description: '' +--- +RETURN PARSE_IDENTIFIER("_users/my-user") +``` + +Parse the `_id` attribute of a document to extract both the collection name and +the document key: + +```aql +--- +name: aqlParseIdentifier_2 +description: '' +--- +RETURN PARSE_IDENTIFIER( { "_id": "mycollection/mykey", "value": "some value" } ) +``` + +## TRANSLATE() + +`TRANSLATE(value, lookupDocument, defaultValue) → mappedValue` + +Look up the specified `value` in the `lookupDocument`. If `value` is a key in +`lookupDocument`, then `value` will be replaced with the lookup value found. +If `value` is not present in `lookupDocument`, then `defaultValue` will be returned +if specified. If no `defaultValue` is specified, `value` will be returned unchanged. + +- **value** (string): the value to encode according to the mapping +- **lookupDocument** (object): a key/value mapping as document +- **defaultValue** (any, *optional*): a fallback value in case `value` is not found +- returns **mappedValue** (any): the encoded value, or the unaltered `value` or `defaultValue` + (if supplied) in case it could not be mapped + +**Examples** + +Translate a country code to a country name: + +```aql +--- +name: aqlTranslate_1 +description: '' +--- +RETURN TRANSLATE("FR", { US: "United States", UK: "United Kingdom", FR: "France" } ) +``` + +The unaltered input value is returned if no match is found in the mapping: + +```aql +--- +name: aqlTranslate_2 +description: '' +--- +RETURN TRANSLATE(42, { foo: "bar", bar: "baz" } ) +``` + +If you specify a fallback value and no match is found in the mapping, then the +fallback value returned instead of the input value: + +```aql +--- +name: aqlTranslate_3 +description: '' +--- +RETURN TRANSLATE(42, { foo: "bar", bar: "baz" }, "not found!") +``` + +Note that any non-string input value is implicitly cast to a string before the +lookup: + +```aql +--- +name: aqlTranslate_4 +description: '' +--- +RETURN TRANSLATE(42, { "42": true } ) +``` + +## UNSET() + +`UNSET(document, attributeName1, attributeName2, ... attributeNameN) → doc` + +Remove the attributes `attributeName1` to `attributeNameN` from `document`. +All other attributes will be preserved. + +To do the opposite, see [`KEEP()`](#keep). + +- **document** (object): a document / object +- **attributeNames** (string, *repeatable*): an arbitrary number of attribute + names as multiple arguments (at least 1) +- returns **doc** (object): `document` without the specified attributes at the + top-level + +**Examples** + +Remove the top-level `foo` attribute, including its nested objects: + +```aql +--- +name: aqlUnset_1 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET(doc, "foo") +``` + +Remove the top-level `bar` attribute, which the example object does not have, +resulting in an unchanged object: + +```aql +--- +name: aqlUnset_2 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET(doc, "bar") +``` + +Remove the top-level `baz` attribute: + +```aql +--- +name: aqlUnset_3 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET(doc, "baz") +``` + +Remove multiple top-level attributes (`foo` and `baz`), resulting in an empty +object in this example: + +```aql +--- +name: aqlUnset_4 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET(doc, "foo", "baz") +``` + +--- + +`UNSET(document, attributeNameArray) → doc` + +- **document** (object): a document / object +- **attributeNameArray** (array): an array of attribute names as strings +- returns **doc** (object): *document* without the specified attributes at the + top-level + +**Examples** + +Remove multiple top-level attributes (`foo` and `baz`), by passing an array of the +attribute keys instead of individual arguments: + +```aql +--- +name: aqlUnset_5 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET(doc, ["foo", "bar"]) +``` + +## UNSET_RECURSIVE() + +`UNSET_RECURSIVE(document, attributeName1, attributeName2, ... attributeNameN) → doc` + +Recursively remove the attributes `attributeName1` to `attributeNameN` from +`document` and its sub-documents. All other attributes will be preserved. + +To do the opposite, use [`KEEP_RECURSIVE()`](#keep_recursive). + +- **document** (object): a document / object +- **attributeNames** (string, *repeatable*): an arbitrary number of attribute + names as multiple arguments (at least 1) +- returns **doc** (object): `document` without the specified attributes at + all levels (top-level as well as nested objects) + +**Examples** + +Recursively remove `foo` attributes: + +```aql +--- +name: aqlUnsetRecursive_1 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, "foo") +``` + +Recursively remove `bar` attributes: + +```aql +--- +name: aqlUnsetRecursive_2 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, "bar") +``` + +Recursively remove `baz` attributes: + +```aql +--- +name: aqlUnsetRecursive_3 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, "baz") +``` + +Recursively remove multiple attributes (`foo` and `bar`): + +```aql +--- +name: aqlUnsetRecursive_4 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, "foo", "bar") +``` + +Recursively remove multiple attributes (`foo` and `baz`), removing all +attributes of the example object: + +```aql +--- +name: aqlUnsetRecursive_5 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, "foo", "baz") +``` + +Recursively remove multiple attributes (`foo`, `bar`, and `baz`), removing all +attributes of the example object: + +```aql +--- +name: aqlUnsetRecursive_6 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, "foo", "bar", "baz") +``` + +--- + +`UNSET_RECURSIVE(document, attributeNameArray) → doc` + +- **document** (object): a document / object +- **attributeNameArray** (array): an array of attribute names as strings +- returns **doc** (object): *document* without the specified attributes at + all levels (top-level as well as nested objects) + +**Examples** + +Recursively remove `baz` attributes, by passing an array with the attribute key: + +```aql +--- +name: aqlUnsetRecursive_7 +description: '' +--- +LET doc = { foo: { bar: { foo: 1, baz: 2 }, baz: 3 }, baz: 4 } +RETURN UNSET_RECURSIVE(doc, ["baz"]) +``` + +## VALUE() + +`VALUE(document, path) → value` + +Return the specified attribute value of the `document`. + +- **document** (object): a document / object +- **path** (array): an array of strings and numbers that describes the + attribute path. You can select object keys with strings and array elements + with numbers. +- returns **value** (any): the selected value of `document` + +**Examples** + +Dynamically get the inner string, like `obj.foo.bar` would: + +```aql +--- +name: aqlValue_1 +description: '' +--- +LET obj = { foo: { bar: "baz" } } +RETURN VALUE(obj, ["foo", "bar"]) +``` + +Dynamically get the inner object of the second array element of a top-level +attribute, like `obj.foo[1].bar` would: + +```aql +--- +name: aqlValue_2 +description: '' +--- +LET obj = { foo: [ { bar: "baz" }, { bar: { inner: true } } ] } +RETURN VALUE(obj, ["foo", 1, "bar"]) +``` + +## VALUES() + +`VALUES(document, removeSystemAttrs) → anyArray` + +Return the attribute values of the `document` as an array. Optionally omit +system attributes. + +To return the attribute keys instead, see the [`ATTRIBUTES()` function](#attributes). + +- **document** (object): a document / object +- **removeSystemAttrs** (bool, *optional*): if set to `true`, then all + system attributes (starting with an underscore, such as `_id`, `_key` etc.) + are removed from the result +- returns **anyArray** (array): the values of `document` returned in any order + +**Examples** + +Get the attribute values of an object: + +```aql +--- +name: aqlValues_1 +description: '' +--- +RETURN VALUES( { "_id": "users/jane", "name": "Jane", "age": 35 } ) +``` + +Get the attribute values of an object, omitting system attributes: + +```aql +--- +name: aqlValues_2 +description: '' +--- +RETURN VALUES( { "_id": "users/jane", "name": "Jane", "age": 35 }, true ) +``` + +## ZIP() + +`ZIP(keys, values) → doc` + +Return a document object assembled from the separate parameters `keys` and `values`. + +`keys` and `values` must be arrays and have the same length. + +- **keys** (array): an array of strings, to be used as attribute names in the result +- **values** (array): an array with elements of arbitrary types, to be used as + attribute values +- returns **doc** (object): a document with the keys and values assembled + +**Examples** + +```aql +--- +name: aqlZip +description: '' +--- +RETURN ZIP( [ "name", "active", "hobbies" ], [ "some user", true, [ "swimming", "riding" ] ] ) +``` diff --git a/site/content/arangodb/oem/aql/functions/fulltext.md b/site/content/arangodb/oem/aql/functions/fulltext.md new file mode 100644 index 0000000000..54a0cd35bc --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/fulltext.md @@ -0,0 +1,94 @@ +--- +title: Fulltext functions in AQL +menuTitle: Fulltext +weight: 30 +description: >- + AQL offers functions to filter data using fulltext indexes +--- +See [fulltext indexes](../../index-and-search/indexing/working-with-indexes/fulltext-indexes.md) +for details. + +{{< warning >}} +The fulltext index type is deprecated from version 3.10 onwards. +It is recommended to use [Inverted indexes](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md) or +[ArangoSearch](../../index-and-search/arangosearch/_index.md) for advanced full-text search capabilities. +{{< /warning >}} + +## FULLTEXT() + +`FULLTEXT(coll, attribute, query, limit) → docArray` + +Return all documents from collection *coll*, for which the attribute *attribute* +matches the fulltext search phrase *query*, optionally capped to *limit* results. + +**Note**: the `FULLTEXT()` function requires the collection *coll* to have a +fulltext index on *attribute*. If no fulltext index is available, this function +will fail with an error at runtime. It doesn't fail when explaining the query however. + +- **coll** (collection): a collection +- **attribute** (string): the attribute name of the attribute to search in +- **query** (string): a fulltext search expression as described below +- **limit** (number, *optional*): if set to a non-zero value, it will cap the result + to at most this number of documents +- returns **docArray** (array): an array of documents + +`FULLTEXT()` is not meant to be used as an argument to `FILTER`, +but rather to be used as the expression of a `FOR` statement: + +```aql +FOR oneMail IN FULLTEXT(emails, "body", "banana,-apple") + RETURN oneMail._id +``` + +*query* is a comma-separated list of sought words (or prefixes of sought words). To +distinguish between prefix searches and complete-match searches, each word can optionally be +prefixed with either the `prefix:` or `complete:` qualifier. Different qualifiers can +be mixed in the same query. Not specifying a qualifier for a search word will implicitly +execute a complete-match search for the given word: + +- `FULLTEXT(emails, "body", "banana")`\ + Will look for the word *banana* in the + attribute *body* of the collection *collection*. + +- `FULLTEXT(emails, "body", "banana,orange")`\ + Will look for both words + *banana* and *orange* in the mentioned attribute. Only those documents will be + returned that contain both words. + +- `FULLTEXT(emails, "body", "prefix:head")`\ + Will look for documents that contain any + words starting with the prefix *head*. + +- `FULLTEXT(emails, "body", "prefix:head,complete:aspirin")`\ + Will look for all + documents that contain a word starting with the prefix *head* and that also contain + the (complete) word *aspirin*. Note: specifying `complete:` is optional here. + +- `FULLTEXT(emails, "body", "prefix:cent,prefix:subst")`\ + Will look for all documents + that contain a word starting with the prefix *cent* and that also contain a word + starting with the prefix *subst*. + +If multiple search words (or prefixes) are given, then by default the results will be +AND-combined, meaning only the logical intersection of all searches will be returned. +It is also possible to combine partial results with a logical OR, and with a logical NOT: + +- `FULLTEXT(emails, "body", "+this,+text,+document")`\ + Will return all documents that + contain all the mentioned words. Note: specifying the `+` symbols is optional here. + +- `FULLTEXT(emails, "body", "banana,|apple")`\ + Will return all documents that contain + either (or both) words *banana* or *apple*. + +- `FULLTEXT(emails, "body", "banana,-apple")`\ + Will return all documents that contain + the word *banana*, but do not contain the word *apple*. + +- `FULLTEXT(emails, "body", "banana,pear,-cranberry")`\ + Will return all documents that + contain both the words *banana* and *pear*, but do not contain the word + *cranberry*. + +No precedence of logical operators will be honored in a fulltext query. The query will simply +be evaluated from left to right. diff --git a/site/content/arangodb/oem/aql/functions/geo.md b/site/content/arangodb/oem/aql/functions/geo.md new file mode 100644 index 0000000000..cf5b3f8a2d --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/geo.md @@ -0,0 +1,964 @@ +--- +title: Geo-spatial functions in AQL +menuTitle: Geo +weight: 35 +description: >- + AQL supports functions for geo-spatial queries and a subset of calls can be + accelerated by geo-spatial indexes +--- +## Geo-spatial data representations + +You can model geo-spatial information in different ways using the data types +available in ArangoDB. The recommended way is to use objects with **GeoJSON** +geometry but you can also use **longitude and latitude coordinate pairs** +for points. Both models are supported by +[Geo-Spatial Indexes](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). + +### Coordinate pairs + +Longitude and latitude coordinates are numeric values and can be stored in the +following ways: + +- Coordinates using an array with two numbers in `[longitude, latitude]` order, + for example, in a user-chosen attribute called `location`: + + ```json + { + "location": [ -73.983, 40.764 ] + } + ``` + +- Coordinates using an array with two numbers in `[latitude, longitude]` order, + for example, in a user-chosen attribute called `location`: + + ```json + { + "location": [ 40.764, -73.983 ] + } + ``` + +- Coordinates using two separate numeric attributes, for example, in two + user-chosen attributes called `lat` and `lng` as sub-attributes of a `location` + attribute: + + ```json + { + "location": { + "lat": 40.764, + "lng": -73.983 + } + } + ``` + +### GeoJSON + +GeoJSON is a geospatial data format based on JSON. It defines several different +types of JSON objects and the way in which they can be combined to represent +data about geographic shapes on the Earth surface. + +Example of a document with a GeoJSON Point stored in a user-chosen attribute +called `location` (with coordinates in `[longitude, latitude]` order): + +```json +{ + "location": { + "type": "Point", + "coordinates": [ -73.983, 40.764 ] + } +} +``` + +GeoJSON uses a geographic coordinate reference system, +World Geodetic System 1984 (WGS 84), and units of decimal degrees. + +Internally ArangoDB maps all coordinate pairs onto a unit sphere. Distances are +projected onto a sphere with the Earth's *Volumetric mean radius* of *6371 +km*. ArangoDB implements a useful subset of the GeoJSON format +[(RFC 7946)](https://tools.ietf.org/html/rfc7946). +Feature Objects and the GeometryCollection type are not supported. +Supported geometry object types are: + +- Point +- MultiPoint +- LineString +- MultiLineString +- Polygon +- MultiPolygon + +#### Point + +A [GeoJSON Point](https://tools.ietf.org/html/rfc7946#section-3.1.2) is a +[position](https://tools.ietf.org/html/rfc7946#section-3.1.1) comprised of +a longitude and a latitude: + +```json +{ + "type": "Point", + "coordinates": [100.0, 0.0] +} +``` + +#### MultiPoint + +A [GeoJSON MultiPoint](https://tools.ietf.org/html/rfc7946#section-3.1.7) is +an array of positions: + +```json +{ + "type": "MultiPoint", + "coordinates": [ + [100.0, 0.0], + [101.0, 1.0] + ] +} +``` + +#### LineString + +A [GeoJSON LineString](https://tools.ietf.org/html/rfc7946#section-3.1.4) is +an array of two or more positions: + +```json +{ + "type": "LineString", + "coordinates": [ + [100.0, 0.0], + [101.0, 1.0] + ] +} +``` + +#### MultiLineString + +A [GeoJSON MultiLineString](https://tools.ietf.org/html/rfc7946#section-3.1.5) is +an array of LineString coordinate arrays: + +```json +{ + "type": "MultiLineString", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 1.0] + ], + [ + [102.0, 2.0], + [103.0, 3.0] + ] + ] +} +``` + +#### Polygon + +A [GeoJSON Polygon](https://tools.ietf.org/html/rfc7946#section-3.1.6) consists +of a series of closed `LineString` objects (ring-like). These *Linear Ring* +objects consist of four or more coordinate pairs with the first and last +coordinate pair being equal. Coordinate pairs of a Polygon are an array of +linear ring coordinate arrays. The first element in the array represents +the exterior ring. Any subsequent elements represent interior rings +(holes within the surface). + +The orientation of the first linear ring is crucial: the right-hand-rule +is applied, so that the area to the left of the path of the linear ring +(when walking on the surface of the Earth) is considered to be the +"interior" of the polygon. All other linear rings must be contained +within this interior. According to the GeoJSON standard, the subsequent +linear rings must be oriented following the right-hand-rule, too, +that is, they must run **clockwise** around the hole (viewed from +above). However, ArangoDB is tolerant here (as suggested by the +[GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6)), +all but the first linear ring are inverted if the orientation is wrong. + +In the end, a point is considered to be in the interior of the polygon, +if and only if one has to cross an odd number of linear rings to reach the +exterior of the polygon prescribed by the first linear ring. + +A number of additional rules apply (and are enforced by the GeoJSON +parser): + +- A polygon must contain at least one linear ring, i.e., it must not be + empty. +- A linear ring may not be empty, it needs at least three _distinct_ + coordinate pairs, that is, at least 4 coordinate pairs (since the first and + last must be the same). +- No two edges of linear rings in the polygon must intersect, in + particular, no linear ring may be self-intersecting. +- Within the same linear ring, consecutive coordinate pairs may be the same, + otherwise all coordinate pairs need to be distinct (except the first and last one). +- Linear rings of a polygon must not share edges, but they may share coordinate pairs. +- A linear ring defines two regions on the sphere. ArangoDB always + interprets the region that lies to the left of the boundary ring (in + the direction of its travel on the surface of the Earth) as the + interior of the ring. This is in contrast to earlier versions of + ArangoDB before 3.10, which always took the **smaller** of the two + regions as the interior. Therefore, from 3.10 on one can now have + polygons whose outer ring encloses more than half the Earth's surface. +- The interior rings must be contained in the (interior) of the outer ring. +- Interior rings should follow the above rule for orientation + (counterclockwise external rings, clockwise internal rings, interior + always to the left of the line). + +Here is an example with no holes: + +```json +{ + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ] + ] +} +``` + +Here is an example with a hole: + +```json +{ + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ], + [ + [100.8, 0.8], + [100.8, 0.2], + [100.2, 0.2], + [100.2, 0.8], + [100.8, 0.8] + ] + ] +} +``` + +#### MultiPolygon + +A [GeoJSON MultiPolygon](https://tools.ietf.org/html/rfc7946#section-3.1.6) consists +of multiple polygons. The "coordinates" member is an array of +_Polygon_ coordinate arrays. See [above](#polygon) for the rules and +the meaning of polygons. + +If the polygons in a MultiPolygon are disjoint, then a point is in the +interior of the MultiPolygon if and only if it is +contained in one of the polygons. If some polygon P2 in a MultiPolygon +is contained in another polygon P1, then P2 is treated like a hole +in P1 and containment of points is defined with the even-odd-crossings rule +(see [Polygon](#polygon)). + +Additionally, the following rules apply and are enforced for +MultiPolygons: + +- No two edges in the linear rings of the polygons of a MultiPolygon + may intersect. +- Polygons in the same MultiPolygon may not share edges, but they may share + coordinate pairs. + +Example with two polygons, the second one with a hole: + +```json +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [102.0, 2.0], + [103.0, 2.0], + [103.0, 3.0], + [102.0, 3.0], + [102.0, 2.0] + ] + ], + [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ], + [ + [100.2, 0.2], + [100.2, 0.8], + [100.8, 0.8], + [100.8, 0.2], + [100.2, 0.2] + ] + ] + ] +} +``` + +## GeoJSON interpretation + +Note the following technical detail about GeoJSON: The +[GeoJSON standard, Section 3.1.1 Position](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.1) +prescribes that lines are **cartesian lines in cylindrical coordinates** +(longitude/latitude). However, this definition is inconvenient in practice, +since such lines are not geodesic on the surface of the Earth. +Furthermore, the best available algorithms for geospatial computations on Earth +typically use geodesic lines as the boundaries of polygons on Earth. + +Therefore, ArangoDB uses the **syntax of the GeoJSON** standard, +but then interprets lines (and boundaries of polygons) as +**geodesic lines (pieces of great circles) on Earth**. This is a +violation of the GeoJSON standard, but serving a practical purpose. + +Note in particular that this can sometimes lead to unexpected results. +Consider the following polygon (remember that GeoJSON has +**longitude before latitude** in coordinate pairs): + +```json +{ "type": "Polygon", "coordinates": [[ + [4, 54], [4, 47], [16, 47], [16, 54], [4, 54] +]] } +``` + +![GeoJSON Polygon Geodesic](../../../../images/geojson-polygon-geodesic.webp) + +It does not contain the point `[10, 47]` since the shortest path (geodesic) +from `[4, 47]` to `[16, 47]` lies North relative to the parallel of latitude at +47 degrees. On the contrary, the polygon does contain the point `[10, 54]` as it +lies South of the parallel of latitude at 54 degrees. + +{{< info >}} +ArangoDB version before 3.10 did an inconsistent special detection of "rectangle" +polygons that later versions from 3.10 onward no longer do, see +[Legacy Polygons](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons). +{{< /info >}} + +Furthermore, there is an issue with the interpretation of linear rings +(boundaries of polygons) according to +[GeoJSON standard, Section 3.1.6 Polygon](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6). +This section states explicitly: + +> A linear ring MUST follow the right-hand rule with respect to the +> area it bounds, i.e., exterior rings are counter-clockwise, and +> holes are clockwise. + +This rather misleading phrase means that when a linear ring is used as +the boundary of a polygon, the "interior" of the polygon lies **to the left** +of the boundary when one travels on the surface of the Earth and +along the linear ring. For +example, the polygon below travels **counter-clockwise** around the point +`[10, 50]`, and thus the interior of the polygon contains this point and +its surroundings, but not, for example, the North Pole and the South +Pole. + +```json +{ "type": "Polygon", "coordinates": [[ + [4, 54], [4, 47], [16, 47], [16, 54], [4, 54] +]] } +``` + +![GeoJSON Polygon Counter-clockwise](../../../../images/geojson-polygon-ccw.webp) + +On the other hand, the following polygon travels **clockwise** around the point +`[10, 50]`, and thus its "interior" does not contain `[10, 50]`, but does +contain the North Pole and the South Pole: + +```json +{ "type": "Polygon", "coordinates": [[ + [4, 54], [16, 54], [16, 47], [4, 47], [4, 54] +]] } +``` + +![GeoJSON Polygon Clockwise](../../../../images/geojson-polygon-cw.webp) + +Remember that the "interior" is to the left of the given +linear ring, so this second polygon is basically the complement on Earth +of the previous polygon! + +ArangoDB versions before 3.10 did not follow this rule and always took the +"smaller" connected component of the surface as the "interior" of the polygon. +This made it impossible to specify polygons which covered more than half of the +sphere. From version 3.10 onward, ArangoDB recognizes this correctly. +See [Legacy Polygons](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons) +for how to deal with this issue. + +## Geo utility functions + +The following helper functions **can** use geo indexes, but do not have to in +all cases. You can use all of these functions in combination with each other, +and if you have configured a geo index it may be utilized, +see [Geo Indexing](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). + +### DISTANCE() + +`DISTANCE(latitude1, longitude1, latitude2, longitude2) → distance` + +Calculate the distance between two arbitrary points in meters (as birds +would fly). The value is computed using the haversine formula, which is based +on a spherical Earth model. It's fast to compute and is accurate to around 0.3%, +which is sufficient for most use cases such as location-aware services. + +- **latitude1** (number): the latitude of the first point +- **longitude1** (number): the longitude of the first point +- **latitude2** (number): the latitude of the second point +- **longitude2** (number): the longitude of the second point +- returns **distance** (number): the distance between both points in **meters** + +```aql +// Distance from Brandenburg Gate (Berlin) to ArangoDB headquarters (Cologne) +DISTANCE(52.5163, 13.3777, 50.9322, 6.94) // 476918.89688380965 (~477km) + +// Sort a small number of documents based on distance to Central Park (New York) +FOR doc IN coll // e.g. documents returned by a traversal + SORT DISTANCE(doc.latitude, doc.longitude, 40.78, -73.97) + RETURN doc +``` + +### GEO_CONTAINS() + +`GEO_CONTAINS(geoJsonA, geoJsonB) → bool` + +Checks whether the [GeoJSON object](#geojson) `geoJsonA` +fully contains `geoJsonB` (every point in B is also in A). The object `geoJsonA` +has to be of type _Polygon_ or _MultiPolygon_. For other types containment is +not well-defined because of numerical stability problems. + +- **geoJsonA** (object): first GeoJSON object +- **geoJsonB** (object): second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order +- returns **bool** (bool): `true` if every point in B is also contained in A, + otherwise `false` + +{{< info >}} +ArangoDB follows and exposes the same behavior as the underlying +S2 geometry library. As stated in the S2 documentation: + +> Point containment is defined such that if the sphere is subdivided +> into faces (loops), every point is contained by exactly one face. +> This implies that linear rings do not necessarily contain their vertices. + +As a consequence, a linear ring or polygon does not necessarily contain its +boundary edges! +{{< /info >}} + +You can optimize queries that contain a `FILTER` expression of the following +form with an S2-based [geospatial index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): + +```aql +FOR doc IN coll + FILTER GEO_CONTAINS(geoJson, doc.geo) + ... +``` + +In this example, you would create the index for the collection `coll`, on the +attribute `geo`. You need to set the `geoJson` index option to `true`. +The `geoJson` variable needs to evaluate to a valid GeoJSON object. Also note +the argument order: the stored document attribute `doc.geo` is passed as the +second argument. Passing it as the first argument, like +`FILTER GEO_CONTAINS(doc.geo, geoJson)` to test whether `doc.geo` contains +`geoJson`, cannot utilize the index. + +### GEO_DISTANCE() + +`GEO_DISTANCE(geoJsonA, geoJsonB, ellipsoid) → distance` + +Return the distance between two GeoJSON objects in meters, measured from the +**centroid** of each shape. For a list of supported types see the +[geo index page](#geojson). + +- **geoJsonA** (object): first GeoJSON object, or a coordinate array in + `[longitude, latitude]` order +- **geoJsonB** (object): second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order +- **ellipsoid** (string, *optional*): reference ellipsoid to use. + Supported are `"sphere"` (default) and `"wgs84"`. +- returns **distance** (number): the distance between the centroid points of + the two objects on the reference ellipsoid in **meters** + +```aql +LET polygon = { + type: "Polygon", + coordinates: [[[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]]] +} +FOR doc IN collectionName + LET distance = GEO_DISTANCE(doc.geometry, polygon) // calculates the distance + RETURN distance +``` + +You can optimize queries that contain a `FILTER` expression of the following +form with an S2-based [geospatial index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): + +```aql +FOR doc IN coll + FILTER GEO_DISTANCE(geoJson, doc.geo) <= limit + ... +``` + +In this example, you would create the index for the collection `coll`, on the +attribute `geo`. You need to set the `geoJson` index option to `true`. +`geoJson` needs to evaluate to a valid GeoJSON object. `limit` must be a +distance in meters; it cannot be an expression. An upper bound with `<`, +a lower bound with `>` or `>=`, or both, are equally supported. + +You can also optimize queries that use a `SORT` condition of the following form +with a geospatial index: + +```aql + SORT GEO_DISTANCE(geoJson, doc.geo) +``` + +The index covers returning matches from closest to furthest away, or vice versa. +You may combine such a `SORT` with a `FILTER` expression that utilizes the +geospatial index, too, via the [`GEO_DISTANCE()`](#geo_distance), +[`GEO_CONTAINS()`](#geo_contains), and [`GEO_INTERSECTS()`](#geo_intersects) +functions. + +### GEO_AREA() + +`GEO_AREA(geoJson, ellipsoid) → area` + +Return the area for a [Polygon](#polygon) or [MultiPolygon](#multipolygon) +on a sphere with the average Earth radius, or an ellipsoid. + +- **geoJson** (object): a GeoJSON object +- **ellipsoid** (string, *optional*): reference ellipsoid to use. + Supported are `"sphere"` (default) and `"wgs84"`. +- returns **area** (number): the area of the polygon in **square meters** + +```aql +LET polygon = { + type: "Polygon", + coordinates: [[[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]]] +} +RETURN GEO_AREA(polygon, "wgs84") +``` + +### GEO_EQUALS() + +`GEO_EQUALS(geoJsonA, geoJsonB) → bool` + +Checks whether two [GeoJSON objects](#geojson) are equal or not. + +- **geoJsonA** (object): first GeoJSON object. +- **geoJsonB** (object): second GeoJSON object. +- returns **bool** (bool): `true` if they are equal, otherwise `false`. + +```aql +LET polygonA = GEO_POLYGON([ + [-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5] +]) +LET polygonB = GEO_POLYGON([ + [-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5] +]) +RETURN GEO_EQUALS(polygonA, polygonB) // true +``` + +```aql +LET polygonA = GEO_POLYGON([ + [-11.1, 24.0], [-10.5, 26.1], [-11.2, 27.1], [-11.1, 24.0] +]) +LET polygonB = GEO_POLYGON([ + [-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5] +]) +RETURN GEO_EQUALS(polygonA, polygonB) // false +``` + +### GEO_INTERSECTS() + +`GEO_INTERSECTS(geoJsonA, geoJsonB) → bool` + +Checks whether the [GeoJSON object](#geojson) `geoJsonA` +intersects with `geoJsonB` (i.e. at least one point in B is also in A or vice-versa). + +- **geoJsonA** (object): first GeoJSON object +- **geoJsonB** (object): second GeoJSON object, or a coordinate array in + `[longitude, latitude]` order +- returns **bool** (bool): true if B intersects A, false otherwise + +You can optimize queries that contain a `FILTER` expression of the following +form with an S2-based [geospatial index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md): + +```aql +FOR doc IN coll + FILTER GEO_INTERSECTS(geoJson, doc.geo) + ... +``` + +In this example, you would create the index for the collection `coll`, on the +attribute `geo`. You need to set the `geoJson` index option to `true`. +`geoJson` needs to evaluate to a valid GeoJSON object. Also note +the argument order: the stored document attribute `doc.geo` is passed as the +second argument. Passing it as the first argument, like +`FILTER GEO_INTERSECTS(doc.geo, geoJson)` to test whether `doc.geo` intersects +`geoJson`, cannot utilize the index. + +### GEO_IN_RANGE() + +<small>Introduced in: v3.8.0</small> + +`GEO_IN_RANGE(geoJsonA, geoJsonB, low, high, includeLow, includeHigh) → bool` + +Checks whether the distance between two [GeoJSON objects](#geojson) +lies within a given interval. The distance is measured from the **centroid** of +each shape. + +- **geoJsonA** (object\|array): first GeoJSON object, or a coordinate array + in `[longitude, latitude]` order +- **geoJsonB** (object\|array): second GeoJSON object, or a coordinate array + in `[longitude, latitude]` order +- **low** (number): minimum value of the desired range +- **high** (number): maximum value of the desired range +- **includeLow** (bool, optional): whether the minimum value shall be included + in the range (left-closed interval) or not (left-open interval). The default + value is `true` +- **includeHigh** (bool): whether the maximum value shall be included in the + range (right-closed interval) or not (right-open interval). The default value + is `true` +- returns **bool** (bool): whether the evaluated distance lies within the range + +### IS_IN_POLYGON() + +Determine whether a point is inside a polygon. + +{{< warning >}} +The `IS_IN_POLYGON()` AQL function is **deprecated** as of ArangoDB 3.4.0 in +favor of the new [`GEO_CONTAINS()` AQL function](#geo_contains), which works with +[GeoJSON](https://tools.ietf.org/html/rfc7946) Polygons and MultiPolygons. +{{< /warning >}} + +`IS_IN_POLYGON(polygon, latitude, longitude) → bool` + +- **polygon** (array): an array of arrays with 2 elements each, representing the + points of the polygon in the format `[latitude, longitude]` +- **latitude** (number): the latitude of the point to search +- **longitude** (number): the longitude of the point to search +- returns **bool** (bool): `true` if the point (`[latitude, longitude]`) is + inside the `polygon` or `false` if it's not. The result is undefined (can be + `true` or `false`) if the specified point is exactly on a boundary of the + polygon. + +```aql +// checks if the point (latitude 4, longitude 7) is contained inside the polygon +IS_IN_POLYGON( [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ] ], 4, 7 ) +``` + +--- + +`IS_IN_POLYGON(polygon, coord, useLonLat) → bool` + +The 2nd parameter can alternatively be specified as an array with two values. + +By default, each array element in `polygon` is expected to be in the format +`[latitude, longitude]`. This can be changed by setting the 3rd parameter to `true` to +interpret the points as `[longitude, latitude]`. `coord` is then also interpreted in +the same way. + +- **polygon** (array): an array of arrays with 2 elements each, representing the + points of the polygon +- **coord** (array): the point to search as a numeric array with two elements +- **useLonLat** (bool, *optional*): if set to `true`, the coordinates in + `polygon` and the coordinate pair `coord` are interpreted as + `[longitude, latitude]` (like in GeoJSON). The default is `false` and the + format `[latitude, longitude]` is expected. +- returns **bool** (bool): `true` if the point `coord` is inside the `polygon` + or `false` if it's not. The result is undefined (can be `true` or `false`) if + the specified point is exactly on a boundary of the polygon. + +```aql +// checks if the point (lat 4, lon 7) is contained inside the polygon +IS_IN_POLYGON( [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ] ], [ 4, 7 ] ) + +// checks if the point (lat 4, lon 7) is contained inside the polygon +IS_IN_POLYGON( [ [ 0, 0 ], [ 10, 0 ], [ 10, 10 ], [ 0, 10 ] ], [ 7, 4 ], true ) +``` + +## GeoJSON Constructors + +The following helper functions are available to easily create valid GeoJSON +output. In all cases you can write equivalent JSON yourself, but these functions +will help you to make all your AQL queries shorter and easier to read. + +### GEO_LINESTRING() + +`GEO_LINESTRING(points) → geoJson` + +Construct a GeoJSON LineString. +Needs at least two longitude/latitude pairs. + +- **points** (array): an array of `[longitude, latitude]` pairs +- returns **geoJson** (object): a valid GeoJSON LineString + +```aql +--- +name: aqlGeoLineString_1 +description: '' +--- +RETURN GEO_LINESTRING([ + [35, 10], [45, 45] +]) +``` + +### GEO_MULTILINESTRING() + +`GEO_MULTILINESTRING(points) → geoJson` + +Construct a GeoJSON MultiLineString. +Needs at least two elements consisting valid LineStrings coordinate arrays. + +- **points** (array): array of LineStrings +- returns **geoJson** (object): a valid GeoJSON MultiLineString + +```aql +--- +name: aqlGeoMultiLineString_1 +description: '' +--- +RETURN GEO_MULTILINESTRING([ + [[100.0, 0.0], [101.0, 1.0]], + [[102.0, 2.0], [101.0, 2.3]] +]) +``` + +### GEO_MULTIPOINT() + +`GEO_MULTIPOINT(points) → geoJson` + +Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs. + +- **points** (array): an array of `[longitude, latitude]` pairs +- returns **geoJson** (object): a valid GeoJSON Point + +```aql +--- +name: aqlGeoMultiPoint_1 +description: '' +--- +RETURN GEO_MULTIPOINT([ + [35, 10], [45, 45] +]) +``` + +### GEO_POINT() + +`GEO_POINT(longitude, latitude) → geoJson` + +Construct a valid GeoJSON Point. + +- **longitude** (number): the longitude portion of the point +- **latitude** (number): the latitude portion of the point +- returns **geoJson** (object): a GeoJSON Point + +```aql +--- +name: aqlGeoPoint_1 +description: '' +--- +RETURN GEO_POINT(1.0, 2.0) +``` + +### GEO_POLYGON() + +`GEO_POLYGON(points) → geoJson` + +Construct a GeoJSON Polygon. Needs at least one array representing +a linear ring. Each linear ring consists of an array with at least four +longitude/latitude pairs. The first linear ring must be the outermost, while +any subsequent linear ring will be interpreted as holes. + +For details about the rules, see [GeoJSON polygons](#polygon). + +- **points** (array): an array of (arrays of) `[longitude, latitude]` pairs +- returns **geoJson** (object\|null): a valid GeoJSON Polygon + +A validation step is performed using the S2 geometry library. If the +validation is not successful, an AQL warning is issued and `null` is +returned. + +Simple Polygon: + +```aql +--- +name: aqlGeoPolygon_1 +description: '' +--- +RETURN GEO_POLYGON([ + [0.0, 0.0], [7.5, 2.5], [0.0, 5.0], [0.0, 0.0] +]) +``` + +Advanced Polygon with a hole inside: + +```aql +--- +name: aqlGeoPolygon_2 +description: '' +--- +RETURN GEO_POLYGON([ + [[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]], + [[20, 30], [30, 20], [35, 35], [20, 30]] +]) +``` + +### GEO_MULTIPOLYGON() + +`GEO_MULTIPOLYGON(polygons) → geoJson` + +Construct a GeoJSON MultiPolygon. Needs at least two Polygons inside. +See [`GEO_POLYGON()`](#geo_polygon) and [GeoJSON MultiPolygon](#multipolygon) +for the rules of Polygon and MultiPolygon construction. + +- **polygons** (array): an array of arrays of arrays of `[longitude, latitude]` pairs +- returns **geoJson** (object\|null): a valid GeoJSON MultiPolygon + +A validation step is performed using the S2 geometry library, if the +validation is not successful, an AQL warning is issued and `null` is +returned. + +MultiPolygon comprised of a simple Polygon and a Polygon with hole: + +```aql +--- +name: aqlGeoMultiPolygon_1 +description: '' +--- +RETURN GEO_MULTIPOLYGON([ + [ + [[40, 40], [20, 45], [45, 30], [40, 40]] + ], + [ + [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]], + [[30, 20], [20, 15], [20, 25], [30, 20]] + ] +]) +``` + +## Geo Index Functions + +{{< warning >}} +The AQL functions `NEAR()`, `WITHIN()` and `WITHIN_RECTANGLE()` are +deprecated starting from version 3.4.0. +Please use the [Geo utility functions](#geo-utility-functions) instead. +{{< /warning >}} + +AQL offers the following functions to filter data based on +[geo indexes](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). These functions require the collection +to have at least one geo index. If no geo index can be found, calling this +function will fail with an error at runtime. There is no error when explaining +the query however. + +### NEAR() + +{{< warning >}} +`NEAR()` is a deprecated AQL function from version 3.4.0 on. +Use [`DISTANCE()`](#distance) in a query like this instead: + +```aql +FOR doc IN coll + SORT DISTANCE(doc.latitude, doc.longitude, paramLatitude, paramLongitude) ASC + RETURN doc +``` +Assuming there exists a geo-type index on `latitude` and `longitude`, the +optimizer will recognize it and accelerate the query. +{{< /warning >}} + +`NEAR(coll, latitude, longitude, limit, distanceName) → docArray` + +Return at most *limit* documents from collection *coll* that are near +*latitude* and *longitude*. The result contains at most *limit* documents, +returned sorted by distance, with closest distances being returned first. +Optionally, the distances in meters between the specified coordinate pair +(*latitude* and *longitude*) and the stored coordinate pairs can be returned as +well. To make use of that, the desired attribute name for the distance result +has to be specified in the *distanceName* argument. The result documents will +contain the distance value in an attribute of that name. + +- **coll** (collection): a collection +- **latitude** (number): the latitude of the point to search +- **longitude** (number): the longitude of the point to search +- **limit** (number, *optional*): cap the result to at most this number of + documents. The default is 100. If more documents than *limit* are found, + it is undefined which ones will be returned. +- **distanceName** (string, *optional*): include the distance (in meters) + between the reference point and the stored point in the result, using the + attribute name *distanceName* +- returns **docArray** (array): an array of documents, sorted by distance + (shortest distance first) + +### WITHIN() + +{{< warning >}} +`WITHIN()` is a deprecated AQL function from version 3.4.0 on. +Use [`DISTANCE()`](#distance) in a query like this instead: + +```aql +FOR doc IN coll + LET d = DISTANCE(doc.latitude, doc.longitude, paramLatitude, paramLongitude) + FILTER d <= radius + SORT d ASC + RETURN doc +``` + +Assuming there exists a geo-type index on `latitude` and `longitude`, the +optimizer will recognize it and accelerate the query. +{{< /warning >}} + +`WITHIN(coll, latitude, longitude, radius, distanceName) → docArray` + +Return all documents from collection *coll* that are within a radius of *radius* +around the specified coordinate pair (*latitude* and *longitude*). The documents +returned are sorted by distance to the reference point, with the closest +distances being returned first. Optionally, the distance (in meters) between the +reference point and the stored point can be returned as well. To make +use of that, an attribute name for the distance result has to be specified in +the *distanceName* argument. The result documents will contain the distance +value in an attribute of that name. + +- **coll** (collection): a collection +- **latitude** (number): the latitude of the point to search +- **longitude** (number): the longitude of the point to search +- **radius** (number): radius in meters +- **distanceName** (string, *optional*): include the distance (in meters) + between the reference point and stored point in the result, using the + attribute name *distanceName* +- returns **docArray** (array): an array of documents, sorted by distance + (shortest distance first) + +### WITHIN_RECTANGLE() + +{{< warning >}} +`WITHIN_RECTANGLE()` is a deprecated AQL function from version 3.4.0 on. Use +[`GEO_CONTAINS()`](#geo_contains) and a GeoJSON polygon instead - but note that +this uses geodesic lines from version 3.10.0 onward +(see [GeoJSON interpretation](#geojson-interpretation)): + +```aql +LET rect = GEO_POLYGON([ [ + [longitude1, latitude1], // bottom-left + [longitude2, latitude1], // bottom-right + [longitude2, latitude2], // top-right + [longitude1, latitude2], // top-left + [longitude1, latitude1], // bottom-left +] ]) +FOR doc IN coll + FILTER GEO_CONTAINS(rect, [doc.longitude, doc.latitude]) + RETURN doc +``` + +Assuming there exists a geo-type index on `latitude` and `longitude`, the +optimizer will recognize it and accelerate the query. +{{< /warning >}} + +`WITHIN_RECTANGLE(coll, latitude1, longitude1, latitude2, longitude2) → docArray` + +Return all documents from collection *coll* that are positioned inside the +bounding rectangle with the points (*latitude1*, *longitude1*) and (*latitude2*, +*longitude2*). There is no guaranteed order in which the documents are returned. + +- **coll** (collection): a collection +- **latitude1** (number): the latitude of the bottom-left point to search +- **longitude1** (number): the longitude of the bottom-left point to search +- **latitude2** (number): the latitude of the top-right point to search +- **longitude2** (number): the longitude of the top-right point to search +- returns **docArray** (array): an array of documents, in random order diff --git a/site/content/arangodb/oem/aql/functions/miscellaneous.md b/site/content/arangodb/oem/aql/functions/miscellaneous.md new file mode 100644 index 0000000000..fba18e52bf --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/miscellaneous.md @@ -0,0 +1,803 @@ +--- +title: Miscellaneous functions in AQL +menuTitle: Miscellaneous +weight: 40 +description: >- + AQL functions that do not fall into other categories are listed here +--- +## Control flow functions + +### FIRST_DOCUMENT() + +`FIRST_DOCUMENT(alternative, ...) → doc` + +Return the first alternative that is a document, and *null* if none of the +alternatives is a document. + +- **alternative** (any, *repeatable*): input of arbitrary type +- returns **doc** (object\|null): document / object or null + +### FIRST_LIST() + +`FIRST_LIST(alternative, ...) → list` + +Return the first alternative that is an array, and *null* if none of the +alternatives is an array. + +- **alternative** (any, *repeatable*): input of arbitrary type +- returns **list** (array\|null): array / list or null + +### MIN_MATCH() + +`MIN_MATCH(expr1, ... exprN, minMatchCount) → fulfilled` + +Match documents where at least **minMatchCount** of the specified +AQL expressions are satisfied. + +There is a corresponding [`MIN_MATCH()` ArangoSearch function](arangosearch.md#min_match) +that can utilize View indexes. + +- **expr** (expression, _repeatable_): any valid AQL expression +- **minMatchCount** (number): minimum number of expressions that should + be satisfied +- returns **fulfilled** (bool): whether at least **minMatchCount** of the + specified expressions are `true` + +You can use `MIN_MATCH()` to filter if two out of three conditions evaluate to +`true` for instance: + +```aql +LET members = [ + { name: "Carol", age: 41, active: true }, + { name: "Doug", age: 56, active: true }, +] +FOR doc IN members + FILTER MIN_MATCH(LENGTH(doc.name) == 5, doc.age >= 50, doc.active, 2) + RETURN doc +``` + +An equivalent filter expression without `MIN_MATCH()` would be more cumbersome: + +```aql + FILTER (LENGTH(doc.name) == 5 AND doc.age >= 50) + OR (doc.age >= 50 AND doc.active) + OR (doc.active AND LENGTH(doc.name) == 5) +``` + +### NOT_NULL() + +`NOT_NULL(alternative, ...) → value` + +Return the first element that is not *null*, and *null* if all alternatives +are *null* themselves. It is also known as `COALESCE()` in SQL. + +- **alternative** (any, *repeatable*): input of arbitrary type +- returns **value** (any): first non-null parameter, or *null* if all arguments + are *null* + +### Ternary operator + +For conditional evaluation, check out the +[ternary operator](../operators.md#ternary-operator). + +## Database functions + +### CHECK_DOCUMENT() + +`CHECK_DOCUMENT(document) → checkResult` + +Returns *true* if *document* is a valid document object, i.e. a document +without any duplicate attribute names. Will return *false* for any +non-objects/non-documents or documents with duplicate attribute names. + +{{< warning >}} +This is an internal function for validating database objects and +is not supposed to be useful for anything else. +{{< /warning >}} + +The primary use case for this function is to apply it on all +documents in a given collection as follows: + +```aql +FOR doc IN collection + FILTER !CHECK_DOCUMENT(doc) + RETURN JSON_STRINGIFY(doc) +``` + +This query will return all documents in the given collection with redundant +attribute names and export them. This output can be used for subsequent +cleanup operations. + +{{< info >}} +When using object literals in AQL, there will be an automatic +removal/cleanup of duplicate attribute names, so the function will be effective +only for **already stored** database documents. Therefore, +`RETURN CHECK_DOCUMENT( { a: 1, a: 2 } )` is expected to return `true`. +{{< /info >}} + +- **document** (object): an arbitrary document / object +- returns **checkResult** (bool): *true* for any valid objects/documents without + duplicate attribute names, and *false* for any non-objects/non-documents or + objects/documents with duplicate attribute names + +### COLLECTION_COUNT() + +`COLLECTION_COUNT(coll) → count` + +Determine the amount of documents in a collection. [`LENGTH()`](#length) +is preferred. + +### COLLECTIONS() + +`COLLECTIONS() → docArray` + +Return an array of collections. + +- returns **docArray** (array): each collection as a document with attributes + *name* and *_id* in an array + +### COUNT() + +This is an alias for [`LENGTH()`](#length). + +### CURRENT_DATABASE() + +`CURRENT_DATABASE() → databaseName` + +Returns the name of the current database. + +The current database is the database name that was specified in the URL path of the request (or defaults to _system database). + +- returns **databaseName** (string): the current database name + +### CURRENT_USER() + +`CURRENT_USER() → userName` + +Return the name of the current user. + +The current user is the user account name that was specified in the +*Authorization* HTTP header of the request. It will only be populated if +authentication on the server is turned on, and if the query was executed inside +a request context. Otherwise, the return value of this function will be *null*. + +- returns **userName** (string\|null): the current user name, or *null* if + authentication is disabled + +### DECODE_REV() + +`DECODE_REV(revision) → details` + +Decompose the specified `revision` string into its components. +The resulting object has a `date` and a `count` attribute. +This function is supposed to be called with the `_rev` attribute value +of a database document as argument. + +- **revision** (string): revision ID string +- returns **details** (object\|null): object with two attributes + *date* (string in ISO 8601 format) and *count* (integer number), + or *null* + +If the input revision ID is not a string or cannot be processed, the function +issues a warning and returns *null*. + +Please note that the result structure may change in future versions of +ArangoDB in case the internal format of revision strings is modified. Please +also note that the *date* value in the current result provides the date and +time of when the document record was put together on the server, but not +necessarily the time of insertion into the underlying storage engine. Therefore +in case of concurrent document operations the exact document storage order +cannot be derived unambiguously from the revision value. It should thus be +treated as a rough estimate of when a document was created or last updated. + +```aql +DECODE_REV( "_YU0HOEG---" ) +// { "date" : "2019-03-11T16:15:05.314Z", "count" : 0 } +``` + +### DOCUMENT() + +Dynamically look up one or multiple documents from any collections, either using +a collection name and one or more document keys, or one or more document +identifiers. The collections do not need to be known at query compile time, they +can be computed at runtime. + +{{< info >}} +It is recommended to use subqueries with the [`FOR` operation](../high-level-operations/for.md) +and filters over `DOCUMENT()` whenever the collections are known in advance, +especially for [joins](../examples-and-query-patterns/joins.md), because they perform better, you +can add additional filters, and combine it with sorting to get an array of +documents in a guaranteed order. + +Queries that use the `DOCUMENT()` function cannot be +[**cached**](../execution-and-performance/caching-query-results.md), each lookup is executed as +a single operation, the lookups need to be executed on Coordinators for +sharded collections in cluster deployments, and only primary indexes and no +projections can be utilized. +{{< /info >}} + +`DOCUMENT(collection, id) → doc` + +Return the document identified by `id` (document key or identifier) from the +specified `collection`. + +If the document cannot be found, `null` will be returned. +If there is a mismatch between the `collection` passed and the collection in +the document identifier, then `null` will be returned, too. + +The `id` parameter can also be an array of document keys or identifiers. In this +case, the function will return an array of all documents that could be found. +The results are not guaranteed to be in the requested order. Documents that +could not be found are not indicated in the result (no `null` values) and do +also not raise warnings. + +- **collection** (string): name of a collection +- **id** (string\|array): a document key, a document identifier, or an array of + document keys, identifiers, or both +- returns **doc** (document\|array\|null): the found document (or `null` if it + was not found), or an array of all found documents **in any order** + +**Examples** + +```aql +--- +name: FUNCTION_DOCUMENT_1 +description: '' +dataset: knows_graph +--- +RETURN DOCUMENT( persons, "persons/alice" ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_2 +description: '' +dataset: knows_graph +--- +RETURN DOCUMENT( persons, "alice" ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_3 +description: '' +dataset: knows_graph +--- +RETURN DOCUMENT( persons, [ "persons/alice", "persons/bob" ] ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_4 +description: '' +dataset: knows_graph +--- +RETURN DOCUMENT( persons, [ "alice", "bob" ] ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_5 +description: '' +dataset: knows_graph +bindVars: + { + "@coll": "persons", + "key": "alice" + } +--- +RETURN DOCUMENT( @@coll, @key ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_6 +description: '' +dataset: knows_graph +bindVars: + { + "@coll": "persons", + "keys": ["alice", "bob"] + } +--- +RETURN DOCUMENT( @@coll, @keys ) +``` + +--- + +`DOCUMENT(id) → doc` + +The function can also be used with a single `id` parameter as follows: + +- **id** (string\|array): a document identifier, or an array of identifiers +- returns **doc** (document\|array\|null): the found document (or `null` if it + was not found), or an array of the found documents **in any order** + +**Examples** + +```aql +--- +name: FUNCTION_DOCUMENT_7 +description: '' +dataset: knows_graph +--- +RETURN DOCUMENT("persons/alice") +``` + +```aql +--- +name: FUNCTION_DOCUMENT_8 +description: '' +dataset: knows_graph +--- +RETURN DOCUMENT( [ "persons/alice", "persons/bob" ] ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_9 +description: '' +dataset: knows_graph +bindVars: + { + "key": "persons/alice" + } +--- +RETURN DOCUMENT( @key ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_10 +description: '' +dataset: knows_graph +bindVars: + { + "keys": ["persons/alice", "persons/bob"] + } +--- +RETURN DOCUMENT( @keys ) +``` + +```aql +--- +name: FUNCTION_DOCUMENT_11 +description: '' +dataset: knows_graph +bindVars: + { + "key": "bob" + } +--- +RETURN DOCUMENT( CONCAT("persons/", @key) ) +``` + +### LENGTH() + +`LENGTH(coll) → documentCount` + +Determine the amount of documents in a collection. + +It calls [`COLLECTION_COUNT()`](#collection_count) internally. + +- **coll** (collection): a collection (not string) +- returns **documentCount** (number): the total amount of documents in *coll* + +`LENGTH()` can also determine the [number of elements](array.md#length) in an array, +the [number of attribute keys](document-object.md#length) of an object / document and +the [character length](string.md#length) of a string. + +### SHARD_ID() + +`SHARD_ID(collection, shardKeys) → shardId` + +Return the shard in a collection that contains the specified shard keys. + +- **collection** (string): a collection name +- **shardKeys** (object): a set of shard keys and values. Any missing shard key + is substituted with the `null` value. +- returns **shardId** (string): the responsible shard for the specified + shard keys in the given collection. On deployments other than clusters, + the collection name itself is returned. + +```aql +--- +name: shard_id1 +description: '' +type: cluster +dataset: observationsSampleDataset +--- +RETURN SHARD_ID("observations", { "time": "2021-05-25 07:15:00", "subject": "xh458", "val": 10 }) +``` + +## Hash functions + +### HASH() + +`HASH(value) → hashNumber` + +Calculate a hash value for *value*. + +- **value** (any): an element of arbitrary type +- returns **hashNumber** (number): a hash value of *value* + +*value* is not required to be a string, but can have any data type. The calculated +hash value will take the data type of *value* into account, so for example the +number *1* and the string *"1"* will have different hash values. For arrays the +hash values will be equal if the arrays contain exactly the same values +(including value types) in the same order. For objects the same hash values will +be created if the objects have exactly the same attribute names and values +(including value types). The order in which attributes appear inside objects +is not important for hashing. + +The hash value returned by this function is a number. The hash algorithm is not +guaranteed to remain the same in future versions of ArangoDB. The hash values +should therefore be used only for temporary calculations, e.g. to compare if two +documents are the same, or for grouping values in queries. + +### MINHASH() + +`MINHASH(values, numHashes) → hashes` + +Calculate MinHash signatures for the *values* using locality-sensitive hashing. +The result can be used to approximate the Jaccard similarity of sets. + +- **values** (array): an array with elements of arbitrary type to hash +- **numHashes** (number): the size of the MinHash signature. Must be + greater or equal to `1`. The signature size defines the probabilistic error + (`err = rsqrt(numHashes)`). For an error amount that does not exceed 5% + (`0.05`), use a size of `1 / (0.05 * 0.05) = 400`. +- returns **hashes** (array): an array of strings with the encoded hash values + +**Examples** + +```aql +--- +name: aqlMinHash +description: '' +--- +RETURN MINHASH(["foo", "bar", "baz"], 5) +``` + +### MINHASH_COUNT() + +`MINHASH_COUNT(error) → numHashes` + +Calculate the number of hashes (MinHash signature size) needed to not exceed the +specified error amount. + +- **error** (number): the probabilistic error you can tolerate in the range `[0, 1)` +- returns **numHashes** (number): the required number of hashes to not exceed + the specified error amount + +**Examples** + +```aql +--- +name: aqlMinHashCount +description: '' +--- +RETURN MINHASH_COUNT(0.05) +``` + +### MINHASH_ERROR() + +`MINHASH_ERROR(numHashes) → error` + +Calculate the error amount based on the number of hashes (MinHash signature size). + +- **numHashes** (number): the number of hashes you want to check +- returns **error** (number): the probabilistic error to expect with the specified + number of hashes + +**Examples** + +```aql +--- +name: aqlMinHashError +description: '' +--- +RETURN MINHASH_ERROR(400) +``` + +### String-based hashing + +See the following string functions: + +- [`CRC32()`](string.md#crc32) +- [`FNV64()`](string.md#fnv64) +- [`MD5()`](string.md#md5) +- [`SHA1()`](string.md#sha1) +- [`SHA512()`](string.md#sha512) + +## Function calling + +### APPLY() + +`APPLY(functionName, arguments) → retVal` + +Dynamically call the function *funcName* with the arguments specified. +Arguments are given as array and are passed as separate parameters to +the called function. + +Both built-in and user-defined functions can be called. + +- **funcName** (string): a function name +- **arguments** (array, *optional*): an array with elements of arbitrary type +- returns **retVal** (any): the return value of the called function + +```aql +APPLY( "SUBSTRING", [ "this is a test", 0, 7 ] ) +// "this is" +``` + +### CALL() + +`CALL(funcName, arg1, arg2, ... argN) → retVal` + +Dynamically call the function *funcName* with the arguments specified. +Arguments are given as multiple parameters and passed as separate +parameters to the called function. + +Both built-in and user-defined functions can be called. + +- **funcName** (string): a function name +- **args** (any, *repeatable*): an arbitrary number of elements as + multiple arguments, can be omitted +- returns **retVal** (any): the return value of the called function + +```aql +CALL( "SUBSTRING", "this is a test", 0, 4 ) +// "this" +``` + +## Other functions + +### ASSERT() / WARN() + +`ASSERT(expr, message) → retVal`\ +`WARN(expr, message) → retVal` + +The two functions evaluate an expression. In case the expression evaluates to +*true* both functions will return *true*. If the expression evaluates to +*false* *ASSERT* will throw an error and *WARN* will issue a warning and return +*false*. This behavior allows the use of *ASSERT* and *WARN* in `FILTER` +conditions. + +- **expr** (expression): AQL expression to be evaluated +- **message** (string): message that will be used in exception or warning if expression evaluates to false +- returns **retVal** (bool): returns true if expression evaluates to true + +```aql +FOR i IN 1..3 FILTER ASSERT(i > 0, "i is not greater 0") RETURN i +FOR i IN 1..3 FILTER WARN(i < 2, "i is not smaller 2") RETURN i +``` + +### IN_RANGE() + +`IN_RANGE(value, low, high, includeLow, includeHigh) → included` + +Returns true if *value* is greater than (or equal to) *low* and less than +(or equal to) *high*. The values can be of different types. They are compared +as described in [Type and value order](../fundamentals/type-and-value-order.md) and +is thus identical to the comparison operators `<`, `<=`, `>` and `>=` in +behavior. + +- **value** (any): an element of arbitrary type +- **low** (any): minimum value of the desired range +- **high** (any): maximum value of the desired range +- **includeLow** (bool): whether the minimum value shall be included in + the range (left-closed interval) or not (left-open interval) +- **includeHigh** (bool): whether the maximum value shall be included in + the range (right-closed interval) or not (right-open interval) +- returns **included** (bool): whether *value* is in the range + +If *low* and *high* are the same, but *includeLow* and/or *includeHigh* is set +to `false`, then nothing will match. If *low* is greater than *high* nothing will +match either. + +{{< info >}} +The regular `IN_RANGE()` function cannot utilize indexes, unlike its +ArangoSearch counterpart which can use the View index. +{{< /info >}} + +```aql +--- +name: aqlMiscInRange_1 +description: '' +--- +LET value = 4 +RETURN IN_RANGE(value, 3, 5, true, true) +/* same as: + RETURN value >= 3 AND value <= 5 +*/ +``` + +<!-- separator --> + +```aql +--- +name: aqlMiscInRange_2 +description: '' +--- +FOR value IN 2..6 + RETURN { value, in_range: IN_RANGE(value, 3, 5, false, true) } + /* same as: + RETURN { value, in_range: value > 3 AND value <= 5 } + */ +``` + +<!-- separator --> + +```aql +--- +name: aqlMiscInRange_3 +description: '' +--- +LET coll = [ + { text: "fennel" }, + { text: "fox grape" }, + { text: "forest strawberry" }, + { text: "fungus" } +] +FOR doc IN coll + FILTER IN_RANGE(doc.text,"fo", "fp", true, false) // values with prefix "fo" + /* same as: + FILTER doc.text >= "fo" AND doc.text < "fp" + */ + RETURN doc +``` + +### PREGEL_RESULT() + +`PREGEL_RESULT(jobId, withId) → results` + +Allows to access results of a Pregel job that are only held in memory. +See [Pregel AQL integration](../../data-science/pregel/_index.md#aql-integration). + +- **jobId** (string): the `id` of a Pregel job +- **withId** (bool): if enabled, then the document `_id` is returned in + addition to the `_key` for each vertex +- returns **results** (array): an array of objects, one element per vertex, with + the attributes computed by the Pregel algorithm and the document key (and + optionally identifier) + +## Internal functions + +The following functions are used during development of ArangoDB as a database +system, primarily for unit testing. They are not intended to be used by end +users, especially not in production environments. + +### FAIL() + +`FAIL(reason)` + +Let a query fail on purpose. Can be used in a conditional branch, or to verify +if lazy evaluation / short circuiting is used for instance. + +- **reason** (string): an error message +- returns nothing, because the query is aborted + +```aql +RETURN 1 == 1 ? "okay" : FAIL("error") // "okay" +RETURN 1 == 1 || FAIL("error") ? true : false // true +RETURN 1 == 2 && FAIL("error") ? true : false // false +RETURN 1 == 1 && FAIL("error") ? true : false // aborted with error +``` + +### NOOPT() / NOEVAL() + +`NOOPT(value) → retVal` + +No-operation that prevents certain query compile-time and run-time optimizations. +Constant expressions can be forced to be evaluated at runtime with this. +This function is marked as non-deterministic so its argument withstands +query optimization. + +`NOEVAL(value) → retVal` + +Same as `NOOPT()`, except that it is marked as deterministic. + +There is no need to call these functions explicitly, they are mainly used for +internal testing. + +- **value** (any): a value of arbitrary type +- returns **retVal** (any): *value* + +```aql +// differences in execution plan (explain) +FOR i IN 1..3 RETURN (1 + 1) // const assignment +FOR i IN 1..3 RETURN NOOPT(1 + 1) // simple expression +FOR i IN 1..3 RETURN NOEVAL(1 + 1) // simple expression + +RETURN NOOPT( 123 ) // evaluates 123 at runtime +RETURN NOOPT( CONCAT("a", "b") ) // evaluates concatenation at runtime +``` + +### PASSTHRU() + +`PASSTHRU(value) → retVal` + +Simply returns its call argument unmodified. There is no need to call this function +explicitly, it is mainly used for internal testing. + +- **value** (any): a value of arbitrary type +- returns **retVal** (any): *value* + +### SCHEMA_GET() + +`SCHEMA_GET(collection) → schema` + +Return the schema definition as defined in the properties of the +specified collection. + +- **collection** (string): name of a collection +- returns **schema** (object): schema definition object + +```aql +RETURN SCHEMA_GET("myColl") +``` + +### SCHEMA_VALIDATE() + +`SCHEMA_VALIDATE(doc, schema) → result` + +Test if the given document is valid according to the schema definition. + +- **doc** (doc): document +- **schema** (object): schema definition object +- returns **result** (object): an object with the following attributes: + - **valid** (bool): `true` if the document fulfills the schema's requirements, + otherwise it will be `false` and *errorMessage* will be set + - **errorMessage** (string): details about the validation failure + +If the input document **doc** is not an object, the function will return +a *null* value and register a warning in the query. + +Using an empty **schema** object is equivalent to specifying a **schema** +value of *null*, which will make all input objects successfully pass the +validation. + +### SLEEP() + +`SLEEP(seconds) → null` + +Wait for a certain amount of time before continuing the query. + +- **seconds** (number): amount of time to wait +- returns a *null* value + +```aql +SLEEP(1) // wait 1 second +SLEEP(0.02) // wait 20 milliseconds +``` + +### V8() + +`V8(expression) → retVal` + +No-operation that enforces the usage of the V8 JavaScript engine. There is +no need to call this function explicitly, it is mainly used for internal +testing. + +- **expression** (any): arbitrary expression +- returns **retVal** (any): the return value of the *expression* + +```aql +// differences in execution plan (explain) +FOR i IN 1..3 RETURN (1 + 1) // const assignment +FOR i IN 1..3 RETURN V8(1 + 1) // simple expression +``` + +### VERSION() + +`VERSION() → serverVersion` + +Returns the server version as a string. In a cluster, returns the version +of the Coordinator. + +- returns **serverVersion** (string): the server version string + +```aql +RETURN VERSION() // e.g. "3.10.0" +``` diff --git a/site/content/arangodb/oem/aql/functions/numeric.md b/site/content/arangodb/oem/aql/functions/numeric.md new file mode 100644 index 0000000000..401bae6b71 --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/numeric.md @@ -0,0 +1,770 @@ +--- +title: Numeric functions in AQL +menuTitle: Numeric +weight: 45 +description: >- + AQL offers functions for numeric calculations +--- +## ABS() + +`ABS(value) → unsignedValue` + +Return the absolute part of *value*. + +- **value** (number): any number, positive or negative +- returns **unsignedValue** (number): the number without + or - sign + +```aql +ABS(-5) // 5 +ABS(+5) // 5 +ABS(3.5) // 3.5 +``` + +## ACOS() + +`ACOS(value) → num` + +Return the arccosine of *value*. + +- **value** (number): the input value +- returns **num** (number\|null): the arccosine of *value*, or *null* if *value* is + outside the valid range -1 and 1 (inclusive) + +```aql +ACOS(-1) // 3.141592653589793 +ACOS(0) // 1.5707963267948966 +ACOS(1) // 0 +ACOS(2) // null +``` + +## ASIN() + +`ASIN(value) → num` + +Return the arcsine of *value*. + +- **value** (number): the input value +- returns **num** (number\|null): the arcsine of *value*, or *null* if *value* is + outside the valid range -1 and 1 (inclusive) + +```aql +ASIN(1) // 1.5707963267948966 +ASIN(0) // 0 +ASIN(-1) // -1.5707963267948966 +ASIN(2) // null +``` + +## ATAN() + +`ATAN(value) → num` + +Return the arctangent of *value*. + +- **value** (number): the input value +- returns **num** (number): the arctangent of *value* + +```aql +ATAN(-1) // -0.7853981633974483 +ATAN(0) // 0 +ATAN(10) // 1.4711276743037347 +``` + +## ATAN2() + +`ATAN2(y, x) → num` + +Return the arctangent of the quotient of *y* and *x*. + +```aql +ATAN2(0, 0) // 0 +ATAN2(1, 0) // 1.5707963267948966 +ATAN2(1, 1) // 0.7853981633974483 +ATAN2(-10, 20) // -0.4636476090008061 +``` + +## AVERAGE() + +`AVERAGE(numArray) → mean` + +Return the average (arithmetic mean) of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **mean** (number\|null): the average value of *numArray*. If the array is + empty or contains *null* values only, *null* will be returned. + +```aql +AVERAGE( [5, 2, 9, 2] ) // 4.5 +AVERAGE( [ -3, -5, 2 ] ) // -2 +AVERAGE( [ 999, 80, 4, 4, 4, 3, 3, 3 ] ) // 137.5 +``` + +## AVG() + +This is an alias for [`AVERAGE()`](#average). + +## CEIL() + +`CEIL(value) → roundedValue` + +Return the integer closest but not less than *value*. + +To round downward, see [`FLOOR()`](#floor).\ +To round to the nearest integer value, see [`ROUND()`](#round). + +- **value** (number): any number +- returns **roundedValue** (number): the value rounded to the ceiling + +```aql +CEIL(2.49) // 3 +CEIL(2.50) // 3 +CEIL(-2.50) // -2 +CEIL(-2.51) // -2 +``` + +## COS() + +`COS(value) → num` + +Return the cosine of *value*. + +- **value** (number): the input value +- returns **num** (number): the cosine of *value* + +```aql +COS(1) // 0.5403023058681398 +COS(0) // 1 +COS(-3.141592653589783) // -1 +COS(RADIANS(45)) // 0.7071067811865476 +``` + +## COSINE_SIMILARITY() + +<small>Introduced in: v3.9.0</small> + +`COSINE_SIMILARITY(x, y) → num` + +Return the [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) +between *x* and *y*. + +To calculate the distance, see [`L1_DISTANCE()`](#l1_distance) and +[`L2_DISTANCE()`](#l2_distance). + +- **x** (array): first input array +- **y** (array): second input array +- returns **num** (number\|array): the cosine similarity value. + If one of the inputs is a nested (2D) array, then an array is returned. + The length of each 2D array row should be equal to the length of second input + array in that case. + +In case of invalid input values the function returns **null** and produces a warning. + +```aql +COSINE_SIMILARITY([0,1], [1,0]) // 0 +COSINE_SIMILARITY([[0,1,0,1],[1,0,0,1],[1,1,1,0],[0,0,0,1]], [1,1,1,1]) // [0.707, 0.707, 0.866, 0.5] +COSINE_SIMILARITY([-1,0], [1,0]) // -1 +``` + +## DECAY_GAUSS() + +<small>Introduced in: v3.9.0</small> + +`DECAY_GAUSS(value, origin, scale, offset, decay) → score` + +Calculate the score for one or multiple values with a **Gaussian function** that +decays depending on the distance of a numeric value from a user-given origin. + +- **value** (number\|array): the input value or an array with input values +- **origin** (number): the point of origin used for calculating the distance +- **scale** (number): defines the distance from `origin` + `offset` at which + the computed score will equal the `decay` parameter +- **offset** (number): the decay function will be evaluated for distance values + greater than the defined offset +- **decay** (number): the decay parameter defines how input values are scored + at the distance given by the `scale` parameter +- returns **score** (number\|array): a single score or an array of scores + depending on the type of the input `value` + +```aql +DECAY_GAUSS(41, 40, 5, 5, 0.5) // 1 +DECAY_GAUSS([20, 41], 40, 5, 5, 0.5) // [0.0019531250000000017, 1.0] +DECAY_GAUSS(49.9889, 49.987, 0.001, 0.001, 0.2) // 0.2715403018822964 +``` + +## DECAY_EXP() + +<small>Introduced in: v3.9.0</small> + +`DECAY_EXP(value, origin, scale, offset, decay) → num, array` + +Calculate the score for one or multiple values with an **exponential function** +that decays depending on the distance of a numeric value from a user-given origin. + +- **value** (number\|array): the input value or an array with input values +- **origin** (number): the point of origin used for calculating the distance +- **scale** (number): defines the distance from `origin` + `offset` at which + the computed score will equal the `decay` parameter +- **offset** (number): the decay function will be evaluated for distance values + greater than the defined offset +- **decay** (number): the decay parameter defines how input values are scored + at the distance given by the `scale` parameter +- returns **score** (number\|array): a single score or an array of scores + depending on the type of the input `value` + +```aql +DECAY_EXP(41, 40, 5, 5, 0.7) // 1 +DECAY_EXP(2, 0, 10, 0, 0.2) // 0.7247796636776955 +DECAY_EXP(49.9889, 50, 0.001, 0.001, 0.2) // 8.717720806626885e-08 +``` + +## DECAY_LINEAR() + +<small>Introduced in: v3.9.0</small> + +`DECAY_LINEAR(value, origin, scale, offset, decay) → score` + +Calculate the score for one or multiple values with a **linear function** that +decays depending on the distance of a numeric value from a user-given origin. + +- **value** (number\|array): the input value or an array with input values +- **origin** (number): the point of origin used for calculating the distance +- **scale** (number): defines the distance from `origin` + `offset` at which + the computed score will equal the `decay` parameter +- **offset** (number): the decay function will be evaluated for distance values + greater than the defined offset +- **decay** (number): the decay parameter defines how input values are scored + at the distance given by the `scale` parameter +- returns **score** (number\|array): a single score or an array of scores + depending on the type of the input `value` + +```aql +DECAY_LINEAR(41, 40, 5, 5, 0.5) // 1 +DECAY_LINEAR(9.8, 0, 10, 0, 0.2) // 0.21599999999999994 +DECAY_LINEAR(5..7, 0, 10, 0, 0.2) // [0.6, 0.52, 0.44] +``` + +## DEGREES() + +`DEGREES(rad) → num` + +Return the angle converted from radians to degrees. + +- **rad** (number): the input value +- returns **num** (number): the angle in degrees + +```aql +DEGREES(0.7853981633974483) // 45 +DEGREES(0) // 0 +DEGREES(3.141592653589793) // 180 +``` + +## EXP() + +`EXP(value) → num` + +Return Euler's constant (2.71828...) raised to the power of *value*. + +- **value** (number): the input value +- returns **num** (number): Euler's constant raised to the power of *value* + +```aql +EXP(1) // 2.718281828459045 +EXP(10) // 22026.46579480671 +EXP(0) // 1 +``` + +## EXP2() + +`EXP2(value) → num` + +Return 2 raised to the power of *value*. + +- **value** (number): the input value +- returns **num** (number): 2 raised to the power of *value* + +```aql +EXP2(16) // 65536 +EXP2(1) // 2 +EXP2(0) // 1 +``` + +## FLOOR() + +`FLOOR(value) → roundedValue` + +Return the integer closest but not greater than *value*. + +To round upward, see [`CEIL()`](#ceil).\ +To round to the nearest integer value, see [`ROUND()`](#round). + +- **value** (number): any number +- returns **roundedValue** (number): the value rounded downward + +```aql +FLOOR(2.49) // 2 +FLOOR(2.50) // 2 +FLOOR(-2.50) // -3 +FLOOR(-2.51) // -3 +``` + +## LOG() + +`LOG(value) → num` + +Return the natural logarithm of *value*. The base is Euler's +constant (2.71828...). + +- **value** (number): the input value +- returns **num** (number\|null): the natural logarithm of *value*, or *null* if *value* is + equal or less than 0 + +```aql +LOG(2.718281828459045) // 1 +LOG(10) // 2.302585092994046 +LOG(0) // null +``` + +## LOG2() + +`LOG2(value) → num` + +Return the base 2 logarithm of *value*. + +- **value** (number): the input value +- returns **num** (number\|null): the base 2 logarithm of *value*, or *null* if *value* is + equal or less than 0 + +```aql +LOG2(1024) // 10 +LOG2(8) // 3 +LOG2(0) // null +``` + +## LOG10() + +`LOG10(value) → num` + +Return the base 10 logarithm of *value*. + +- **value** (number): the input value +- returns **num** (number): the base 10 logarithm of *value*, or *null* if *value* is + equal or less than 0 + +```aql +LOG10(10000) // 4 +LOG10(10) // 1 +LOG10(0) // null +``` + +## L1_DISTANCE() + +<small>Introduced in: v3.9.0</small> + +`L1_DISTANCE(x, y) → num` + +Return the [Manhattan distance](https://en.wikipedia.org/wiki/Taxicab_geometry) +between *x* and *y*. + +To calculate the similarity, see [`COSINE_SIMILARITY()`](#cosine_similarity). + +- **x** (array): first input array +- **y** (array): second input array +- returns **num** (number\|array): the L1 distance value. + If one of the inputs is a nested (2D) array, then an array is returned. + The length of each inner array should be equal to the length of second input + array in that case. + +In case of invalid input values the function returns **null** and produces a warning. + +```aql +L1_DISTANCE([-1,-1], [2,2]) // 6 +L1_DISTANCE([[1,2,3],[-1,-2,-3],[3,4,5],[-5,2,1]], [1,1,1]) // [3,9,9,7] +L1_DISTANCE([1.5], [3]) // 1.5 +``` + +## L2_DISTANCE() + +<small>Introduced in: v3.9.0</small> + +`L2_DISTANCE(x,y) → num` + +Return the [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance) +between *x* and *y*. + +To calculate the similarity, see [`COSINE_SIMILARITY()`](#cosine_similarity). + +- **x** (array): first input array +- **y** (array): second input array +- returns **num** (number\|array): the L2 distance value. + If one of the inputs is a nested (2D) array, then an array is returned. + The length of each inner array should be equal to the length of second input + array in that case. + +In case of invalid input values the function returns **null** and produces a warning. + +```aql +L2_DISTANCE([1,1], [5,2]) // 4.1231056256176606 +L2_DISTANCE([[1,2,3], [4,5,6], [7,8,9]], [3,2,1]) // [2.8284271247461903, 5.916079783099616, 10.770329614269007] +L2_DISTANCE([0,1], [1,0]) // 1.4142135623730951 +``` + +## MAX() + +`MAX(anyArray) → max` + +Return the greatest element of *anyArray*. The array is not limited to numbers. +Also see [type and value order](../fundamentals/type-and-value-order.md). + +- **anyArray** (array): an array of numbers, *null* values are ignored +- returns **max** (any\|null): the element with the greatest value. If the array is + empty or contains *null* values only, the function will return *null*. + +```aql +MAX( [5, 9, -2, null, 1] ) // 9 +MAX( [ null, null ] ) // null +``` + +## MEDIAN() + +`MEDIAN(numArray) → median` + +Return the median value of the values in *array*. + +The array is sorted and the element in the middle is returned. If the array has an +even length of elements, the two center-most elements are interpolated by calculating +the average value (arithmetic mean). + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **median** (number\|null): the median of *numArray*. If the array is + empty or contains *null* values only, the function will return *null*. + +```aql +MEDIAN( [ 1, 2, 3] ) // 2 +MEDIAN( [ 1, 2, 3, 4 ] ) // 2.5 +MEDIAN( [ 4, 2, 3, 1 ] ) // 2.5 +MEDIAN( [ 999, 80, 4, 4, 4, 3, 3, 3 ] ) // 4 +``` + +## MIN() + +`MIN(anyArray) → min` + +Return the smallest element of *anyArray*. The array is not limited to numbers. +Also see [type and value order](../fundamentals/type-and-value-order.md). + +- **anyArray** (array): an array of numbers, *null* values are ignored +- returns **min** (any\|null): the element with the smallest value. If the array is + empty or contains *null* values only, the function will return *null*. + +```aql +MIN( [5, 9, -2, null, 1] ) // -2 +MIN( [ null, null ] ) // null +``` + +## PERCENTILE() + +`PERCENTILE(numArray, n, method) → percentile` + +Return the *n*th percentile of the values in *numArray*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- **n** (number): must be between 0 (excluded) and 100 (included) +- **method** (string, *optional*): "rank" (default) or "interpolation" +- returns **percentile** (number\|null): the *n*th percentile, or *null* if the + array is empty or only *null* values are contained in it or the percentile + cannot be calculated + +```aql +PERCENTILE( [1, 2, 3, 4], 50 ) // 2 +PERCENTILE( [1, 2, 3, 4], 50, "rank" ) // 2 +PERCENTILE( [1, 2, 3, 4], 50, "interpolation" ) // 2.5 +``` + +## PI() + +`PI() → pi` + +Return pi. + +- returns **pi** (number): the first few significant digits of pi (3.141592653589793) + +```aql +PI() // 3.141592653589793 +``` + +## POW() + +`POW(base, exp) → num` + +Return the *base* to the exponent *exp*. + +- **base** (number): the base value +- **exp** (number): the exponent value +- returns **num** (number): the exponentiated value + +```aql +POW( 2, 4 ) // 16 +POW( 5, -1 ) // 0.2 +POW( 5, 0 ) // 1 +``` + +## PRODUCT() + +`PRODUCT(numArray) → product` + +Return the product of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **product** (number): the product of all values in *numArray*. If the array + is empty or only *null* values are contained in the array, *1* will be returned. + +```aql +PRODUCT( [1, 2, 3, 4] ) // 24 +PRODUCT( [null, -5, 6] ) // -30 +PRODUCT( [ ] ) // 1 +``` + +## RADIANS() + +`RADIANS(deg) → num` + +Return the angle converted from degrees to radians. + +- **deg** (number): the input value +- returns **num** (number): the angle in radians + +```aql +RADIANS(180) // 3.141592653589793 +RADIANS(90) // 1.5707963267948966 +RADIANS(0) // 0 +``` + +## RAND() + +`RAND() → randomNumber` + +Return a pseudo-random number between 0 and 1. + +- returns **randomNumber** (number): a number greater than 0 and less than 1 + +```aql +RAND() // 0.3503170117504508 +RAND() // 0.6138226173882478 +``` + +Complex example: + +```aql +LET coinFlips = ( + FOR i IN 1..100000 + RETURN RAND() > 0.5 ? "heads" : "tails" +) +RETURN MERGE( + FOR flip IN coinFlips + COLLECT f = flip WITH COUNT INTO count + RETURN { [f]: count } +) +``` + +Result: + +```json +[ + { + "heads": 49902, + "tails": 50098 + } +] +``` + +## RANGE() + +`RANGE(start, stop, step) → numArray` + +Return an array of numbers in the specified range, optionally with increments +other than 1. The *start* and *stop* arguments are truncated to integers +unless a *step* argument is provided. + +Also see the [range operator](../operators.md#range-operator) for ranges +with integer bounds and a step size of 1. + +- **start** (number): the value to start the range at (inclusive) +- **stop** (number): the value to end the range with (inclusive) +- **step** (number, *optional*): how much to increment in every step, + the default is *1.0* +- returns **numArray** (array): all numbers in the range as array + +```aql +RANGE(1, 4) // [ 1, 2, 3, 4 ] +RANGE(1, 4, 2) // [ 1, 3 ] +RANGE(1, 4, 3) // [ 1, 4 ] +RANGE(1.5, 2.5) // [ 1, 2 ] +RANGE(1.5, 2.5, 1) // [ 1.5, 2.5 ] +RANGE(1.5, 2.5, 0.5) // [ 1.5, 2, 2.5 ] +RANGE(-0.75, 1.1, 0.5) // [ -0.75, -0.25, 0.25, 0.75 ] +``` + +## ROUND() + +`ROUND(value) → roundedValue` + +Return the integer closest to *value*. + +- **value** (number): any number +- returns **roundedValue** (number): the value rounded to the closest integer + +```aql +ROUND(2.49) // 2 +ROUND(2.50) // 3 +ROUND(-2.50) // -2 +ROUND(-2.51) // -3 +``` + +Rounding towards zero, also known as `trunc()` in C/C++, can be achieved with +a combination of the [ternary operator](../operators.md#ternary-operator), +[`CEIL()`](#ceil) and [`FLOOR()`](#floor): + +```aql +value >= 0 ? FLOOR(value) : CEIL(value) +``` + +## SIN() + +`SIN(value) → num` + +Return the sine of *value*. + +- **value** (number): the input value +- returns **num** (number): the sine of *value* + +```aql +SIN(3.141592653589783 / 2) // 1 +SIN(0) // 0 +SIN(-3.141592653589783 / 2) // -1 +SIN(RADIANS(270)) // -1 +``` + +## SQRT() + +`SQRT(value) → squareRoot` + +Return the square root of *value*. + +- **value** (number): a number +- returns **squareRoot** (number): the square root of *value* + +```aql +SQRT(9) // 3 +SQRT(2) // 1.4142135623730951 +``` + +Other roots can be calculated with [`POW()`](#pow) like `POW(value, 1/n)`: + +```aql +// 4th root of 8*8*8*8 = 4096 +POW(4096, 1/4) // 8 + +// cube root of 3*3*3 = 27 +POW(27, 1/3) // 3 + +// square root of 3*3 = 9 +POW(9, 1/2) // 3 +``` + +## STDDEV_POPULATION() + +`STDDEV_POPULATION(numArray) → num` + +Return the population standard deviation of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **num** (number\|null): the population standard deviation of *numArray*. + If the array is empty or only *null* values are contained in the array, + *null* will be returned. + +```aql +STDDEV_POPULATION( [ 1, 3, 6, 5, 2 ] ) // 1.854723699099141 +``` + +## STDDEV_SAMPLE() + +`STDDEV_SAMPLE(numArray) → num` + +Return the sample standard deviation of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **num** (number\|null): the sample standard deviation of *numArray*. + If the array is empty or only *null* values are contained in the array, + *null* will be returned. + +```aql +STDDEV_SAMPLE( [ 1, 3, 6, 5, 2 ] ) // 2.0736441353327724 +``` + +## STDDEV() + +This is an alias for [`STDDEV_POPULATION()`](#stddev_population). + +## SUM() + +`SUM(numArray) → sum` + +Return the sum of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **sum** (number): the total of all values in *numArray*. If the array + is empty or only *null* values are contained in the array, *0* will be returned. + +```aql +SUM( [1, 2, 3, 4] ) // 10 +SUM( [null, -5, 6] ) // 1 +SUM( [ ] ) // 0 +``` + +## TAN() + +`TAN(value) → num` + +Return the tangent of *value*. + +- **value** (number): the input value +- returns **num** (number): the tangent of *value* + +```aql +TAN(10) // 0.6483608274590866 +TAN(5) // -3.380515006246586 +TAN(0) // 0 +``` + +## VARIANCE_POPULATION() + +`VARIANCE_POPULATION(numArray) → num` + +Return the population variance of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **num** (number\|null): the population variance of *numArray*. + If the array is empty or only *null* values are contained in the array, + *null* will be returned. + +```aql +VARIANCE_POPULATION( [ 1, 3, 6, 5, 2 ] ) // 3.4400000000000004 +``` + +## VARIANCE_SAMPLE() + +`VARIANCE_SAMPLE(array) → num` + +Return the sample variance of the values in *array*. + +- **numArray** (array): an array of numbers, *null* values are ignored +- returns **num** (number\|null): the sample variance of *numArray*. + If the array is empty or only *null* values are contained in the array, + *null* will be returned. + +```aql +VARIANCE_SAMPLE( [ 1, 3, 6, 5, 2 ] ) // 4.300000000000001 +``` + +## VARIANCE() + +This is an alias for [`VARIANCE_POPULATION()`](#variance_population). diff --git a/site/content/arangodb/oem/aql/functions/string.md b/site/content/arangodb/oem/aql/functions/string.md new file mode 100644 index 0000000000..772f3c663e --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/string.md @@ -0,0 +1,2070 @@ +--- +title: String functions in AQL +menuTitle: String +weight: 50 +description: >- + AQL offers functions for string processing +--- +## CHAR_LENGTH() + +`CHAR_LENGTH(str) → length` + +Return the number of characters in `str` (not byte length). + +| Input | Length | +|--------|--------| +| String | Number of Unicode characters | +| Number | Number of Unicode characters that represent the number | +| Array | Number of Unicode characters from the resulting stringification | +| Object | Number of Unicode characters from the resulting stringification | +| true | 4 | +| false | 5 | +| null | 0 | + +- **str** (string): a string. If a number is passed, it will be casted to string first. +- returns **length** (number): the character length of `str` (not byte length) + +**Examples** + +```aql +--- +name: aqlCharLength_1 +description: '' +--- +RETURN CHAR_LENGTH("foo") +``` + +```aql +--- +name: aqlCharLength_2 +description: '' +--- +LET value = {foo: "bar"} +RETURN { + str: JSON_STRINGIFY(value), + len: CHAR_LENGTH(value) +} +``` + +## CONCAT() + +`CONCAT(value1, value2, ... valueN) → str` + +Concatenate the values passed as `value1` to `valueN`. + +- **values** (any, *repeatable*): elements of arbitrary type (at least 1) +- returns **str** (string): a concatenation of the elements. `null` values + are ignored. Array and object values are JSON-encoded in their entirety. + +**Examples** + +```aql +--- +name: aqlConcatStrings_1 +description: '' +--- +RETURN CONCAT("foo", "bar", "baz") +``` + +```aql +--- +name: aqlConcatNumbers_1 +description: '' +--- +RETURN CONCAT(1, 2, 3) +``` + +```aql +--- +name: aqlConcatPrimitiveTypes_1 +description: '' +--- +RETURN CONCAT(null, false, 0, true, "") +``` + +```aql +--- +name: aqlConcatCompoundTypes_1 +description: '' +--- +RETURN CONCAT([5, 6], {foo: "bar"}) +``` + +--- + +`CONCAT(anyArray) → str` + +If a single array is passed to `CONCAT()`, its members are concatenated. + +- **anyArray** (array): array with elements of arbitrary type +- returns **str** (string): a concatenation of the array elements. `null` values + are ignored. Array and object values are JSON-encoded in their entirety. + +```aql +--- +name: aqlConcatStrings_2 +description: '' +--- +RETURN CONCAT( [ "foo", "bar", "baz" ] ) +``` + +```aql +--- +name: aqlConcatNumbers_2 +description: '' +--- +RETURN CONCAT( [1, 2, 3] ) +``` + +```aql +--- +name: aqlConcatPrimitiveTypes_2 +description: '' +--- +RETURN CONCAT( [null, false, 0, true, ""] ) +``` + +```aql +--- +name: aqlConcatCompoundTypes_2 +description: '' +--- +RETURN CONCAT( [[5, 6], {foo: "bar"}] ) +``` + +## CONCAT_SEPARATOR() + +`CONCAT_SEPARATOR(separator, value1, value2, ... valueN) → joinedString` + +Concatenate the strings passed as arguments `value1` to `valueN` using the +*separator* string. + +- **separator** (string): an arbitrary separator string +- **values** (string\|array, *repeatable*): strings or arrays of strings as multiple + arguments (at least 1) +- returns **joinedString** (string): a concatenated string of the elements, using + `separator` as separator string. `null` values are ignored. Array and object + values are JSON-encoded in their entirety. + +**Examples** + +```aql +--- +name: aqlConcatSeparatorStrings_1 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", "foo", "bar", "baz") +``` + +```aql +--- +name: aqlConcatSeparatorNumbers_1 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", 1, 2, 3) +``` + +```aql +--- +name: aqlConcatSeparatorPrimitiveTypes_1 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", null, false, 0, true, "") +``` + +```aql +--- +name: aqlConcatSeparatorCompoundTypes_1 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", [5, 6], {foo: "bar"}) +``` + +--- + +`CONCAT_SEPARATOR(separator, anyArray) → joinedString` + +If a single array is passed as second argument to `CONCAT_SEPARATOR()`, its +members are concatenated. + +- **separator** (string): an arbitrary separator string +- **anyArray** (array): array with elements of arbitrary type +- returns **joinedString** (string): a concatenated string of the elements, using + `separator` as separator string. `null` values are ignored. Array and object + values are JSON-encoded in their entirety. + +```aql +--- +name: aqlConcatSeparatorStrings_2 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", ["foo", "bar", "baz"]) +``` + +```aql +--- +name: aqlConcatSeparatorNumbers_2 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", [1, 2, 3]) +``` + +```aql +--- +name: aqlConcatSeparatorPrimitiveTypes_2 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", [null, false, 0, true, ""]) +``` + +```aql +--- +name: aqlConcatSeparatorCompoundTypes_2 +description: '' +--- +RETURN CONCAT_SEPARATOR(", ", [[5, 6], {foo: "bar"}]) +``` + +## CONTAINS() + +`CONTAINS(text, search, returnIndex) → match` + +Check whether the string `search` is contained in the string `text`. +The string matching performed by `CONTAINS()` is case-sensitive. + +To determine if or at which position a value is included in an **array**, see the +[`POSITION()` array function](array.md#position). + +- **text** (string): the haystack +- **search** (string): the needle +- **returnIndex** (bool, *optional*): if set to `true`, the character position + of the match is returned instead of a boolean. The default is `false`. +- returns **match** (bool\|number): by default, `true` is returned if `search` + is contained in `text`, and `false` otherwise. With `returnIndex` set to `true`, + the position of the first occurrence of `search` within `text` is returned + (starting at offset 0), or `-1` if it is not contained. + +**Examples** + +```aql +--- +name: aqlContainsMatch +description: '' +--- +RETURN CONTAINS("foobarbaz", "bar") +``` + +```aql +--- +name: aqlContains +description: '' +--- +RETURN CONTAINS("foobarbaz", "horse") +``` + +```aql +--- +name: aqlContainsMatchIndex +description: '' +--- +RETURN CONTAINS("foobarbaz", "bar", true) +``` + +```aql +--- +name: aqlContainsNoMatchIndex +description: '' +--- +RETURN CONTAINS("foobarbaz", "horse", true) +``` + +## COUNT() + +This is an alias for [`LENGTH()`](#length). + +## CRC32() + +`CRC32(text) → hash` + +Calculate the CRC32 checksum for `text` and return it in a hexadecimal +string representation. The polynomial used is `0x1EDC6F41`. The initial +value used is `0xFFFFFFFF`, and the final XOR value is also `0xFFFFFFFF`. + +- **text** (string): a string +- returns **hash** (string): CRC32 checksum as hex string + +**Examples** + +```aql +--- +name: aqlCrc32 +description: '' +--- +RETURN CRC32("foobar") +``` + +## ENCODE_URI_COMPONENT() + +`ENCODE_URI_COMPONENT(value) → encodedString` + +Return the URI component-encoded string of `value`. + +- **value** (string): a string +- returns **encodedString** (string): the URI component-encoded `value` + +**Examples** + +```aql +--- +name: aqlEncodeUriComponent +description: '' +--- +RETURN ENCODE_URI_COMPONENT("fünf %") +``` + +## FIND_FIRST() + +`FIND_FIRST(text, search, start, end) → position` + +Return the position of the first occurrence of the string `search` inside the +string `text`. Positions start at 0. + +- **text** (string): the haystack +- **search** (string): the needle +- **start** (number, *optional*): limit the search to a subset of the text, + beginning at `start` +- **end** (number, *optional*): limit the search to a subset of the text, + ending at `end` +- returns **position** (number): the character position of the match. If `search` + is not contained in `text`, -1 is returned. If `search` is empty, `start` is returned. + +**Examples** + +```aql +--- +name: aqlFindFirst_1 +description: '' +--- +RETURN FIND_FIRST("foobarbaz", "ba") +``` + +```aql +--- +name: aqlFindFirst_2 +description: '' +--- +RETURN FIND_FIRST("foobarbaz", "ba", 4) +``` + +```aql +--- +name: aqlFindFirst_3 +description: '' +--- +RETURN FIND_FIRST("foobarbaz", "ba", 0, 3) +``` + +## FIND_LAST() + +`FIND_LAST(text, search, start, end) → position` + +Return the position of the last occurrence of the string `search` inside the +string `text`. Positions start at 0. + +- **text** (string): the haystack +- **search** (string): the needle +- **start** (number, *optional*): limit the search to a subset of the text, + beginning at *start* +- **end** (number, *optional*): limit the search to a subset of the text, + ending at *end* +- returns **position** (number): the character position of the match. If `search` + is not contained in `text`, -1 is returned. + If `search` is empty, the string length is returned, or `end` + 1. + +**Examples** + +```aql +--- +name: aqlFindLast_1 +description: '' +--- +RETURN FIND_LAST("foobarbaz", "ba") +``` + +```aql +--- +name: aqlFindLast_2 +description: '' +--- +RETURN FIND_LAST("foobarbaz", "ba", 7) +``` + +```aql +--- +name: aqlFindLast_3 +description: '' +--- +RETURN FIND_LAST("foobarbaz", "ba", 0, 4) +``` + +## FNV64() + +`FNV64(text) → hash` + +Calculate the FNV-1A 64 bit hash for `text` and return it in a hexadecimal +string representation. + +- **text** (string): a string +- returns **hash** (string): FNV-1A hash as hex string + +**Examples** + +```aql +--- +name: aqlFnv64 +description: '' +--- +RETURN FNV64("foobar") +``` + +## IPV4_FROM_NUMBER() + +`IPV4_FROM_NUMBER(numericAddress) → stringAddress` + +Converts a numeric IPv4 address value into its string representation. + +- **numericAddress** (number): a numeric representation of an IPv4 address, for + example produced by [`IPV4_TO_NUMBER()`](#ipv4_to_number). The number must be + an unsigned integer between 0 and 4294967295 (both inclusive). +- returns **stringAddress** (string): the string representation of the IPv4 + address. If the input `numberAddress` is not a valid representation of an + IPv4 address, the function returns `null` and produces a warning. + +**Examples** + +```aql +--- +name: aqlIPv4FromNumber_1 +description: '' +--- +RETURN IPV4_FROM_NUMBER(0) +``` + +```aql +--- +name: aqlIPv4FromNumber_2 +description: '' +--- +RETURN IPV4_FROM_NUMBER(134744072) +``` + +```aql +--- +name: aqlIPv4FromNumber_3 +description: '' +--- +RETURN IPV4_FROM_NUMBER(2130706433) +``` + +```aql +--- +name: aqlIPv4FromNumber_4 +description: '' +--- +RETURN IPV4_FROM_NUMBER(3232235521) +``` + +```aql +--- +name: aqlIPv4FromNumber_5 +description: '' +--- +RETURN IPV4_FROM_NUMBER(-23) // invalid, produces a warning +``` + +## IPV4_TO_NUMBER() + +`IPV4_TO_NUMBER(stringAddress) → numericAddress` + +Converts an IPv4 address string into its numeric representation. + +- **stringAddress** (string): a string representing an IPv4 address +- returns **numericAddress** (number): the numeric representation of the IPv4 + address, as an unsigned integer. If the input `stringAddress` is not a valid + representation of an IPv4 address, the function returns `null` and produces + a warning. + +**Examples** + +```aql +--- +name: aqlIPv4ToNumber_1 +description: '' +--- +RETURN IPV4_TO_NUMBER("0.0.0.0") +``` + +```aql +--- +name: aqlIPv4ToNumber_2 +description: '' +--- +RETURN IPV4_TO_NUMBER("8.8.8.8") +``` + +```aql +--- +name: aqlIPv4ToNumber_3 +description: '' +--- +RETURN IPV4_TO_NUMBER("127.0.0.1") +``` + +```aql +--- +name: aqlIPv4ToNumber_4 +description: '' +--- +RETURN IPV4_TO_NUMBER("192.168.0.1") +``` + +```aql +--- +name: aqlIPv4ToNumber_5 +description: '' +--- +RETURN IPV4_TO_NUMBER("milk") // invalid, produces a warning +``` + +## IS_IPV4() + +`IS_IPV4(value) → bool` + +Check if an arbitrary string is suitable for interpretation as an IPv4 address. + +- **value** (string): an arbitrary string +- returns **bool** (bool): `true` if `value` is a string that can be interpreted + as an IPv4 address. To be considered valid, the string must contain of 4 octets + of decimal numbers with 1 to 3 digits length each, allowing the values 0 to 255. + The octets must be separated by periods and must not have padding zeroes. + +**Examples** + +```aql +--- +name: aqlIsIPv4_1 +description: '' +--- +RETURN IS_IPV4("127.0.0.1") +``` + +```aql +--- +name: aqlIsIPv4_2 +description: '' +--- +RETURN IS_IPV4("8.8.8.8") +``` + +```aql +--- +name: aqlIsIPv4_3 +description: '' +--- +RETURN IS_IPV4("008.008.008.008") +``` + +```aql +--- +name: aqlIsIPv4_4 +description: '' +--- +RETURN IS_IPV4("12345.2.3.4") +``` + +```aql +--- +name: aqlIsIPv4_5 +description: '' +--- +RETURN IS_IPV4("12.34") +``` + +```aql +--- +name: aqlIsIPv4_6 +description: '' +--- +RETURN IS_IPV4(8888) +``` + +## JSON_PARSE() + +`JSON_PARSE(text) → value` + +Return an AQL value described by the JSON-encoded input string. + +- **text** (string): the string to parse as JSON +- returns **value** (any): the value corresponding to the given JSON text. + For input values that are no valid JSON strings, the function will return `null`. + +**Examples** + +```aql +--- +name: aqlJsonParse_1 +description: '' +--- +RETURN JSON_PARSE("123") +``` + +```aql +--- +name: aqlJsonParse_2 +description: '' +--- +RETURN JSON_PARSE("[ true, false, null, -0.5 ]") +``` + +```aql +--- +name: aqlJsonParse_3 +description: '' +--- +RETURN JSON_PARSE('{"a": 1}') +``` + +```aql +--- +name: aqlJsonParse_4 +description: '' +--- +RETURN JSON_PARSE('"abc"') +``` + +```aql +--- +name: aqlJsonParse_5 +description: '' +--- +RETURN JSON_PARSE("abc") // invalid JSON +``` + +## JSON_STRINGIFY() + +`JSON_STRINGIFY(value) → text` + +Return a JSON string representation of the input value. + +- **value** (any): the value to convert to a JSON string +- returns **text** (string): the JSON string representing `value`. + For input values that cannot be converted to JSON, the function + will return `null`. + +**Examples** + +```aql +--- +name: aqlJsonStringify_1 +description: '' +--- +RETURN JSON_STRINGIFY(true) +``` + +```aql +--- +name: aqlJsonStringify_2 +description: '' +--- +RETURN JSON_STRINGIFY("abc") +``` + +```aql +--- +name: aqlJsonStringify_3 +description: '' +--- +RETURN JSON_STRINGIFY( [1, {'2': .5}] ) +``` + +## LEFT() + +`LEFT(value, n) → substring` + +Return the `n` leftmost characters of the string `value`. + +To return the rightmost characters, see [`RIGHT()`](#right).\ +To take a part from an arbitrary position off the string, +see [`SUBSTRING()`](#substring). + +- **value** (string): a string +- **n** (number): how many characters to return +- returns **substring** (string): at most `n` characters of `value`, + starting on the left-hand side of the string + +**Examples** + +```aql +--- +name: aqlLeft_1 +description: '' +--- +RETURN LEFT("foobar", 3) +``` + +```aql +--- +name: aqlLeft_2 +description: '' +--- +RETURN LEFT("foobar", 10) +``` + +## LENGTH() + +`LENGTH(str) → length` + +Determine the character length of a string. + +- **str** (string): a string. If a number is passed, it will be casted to string first. +- returns **length** (number): the character length of `str` (not byte length) + +`LENGTH()` can also determine the [number of elements](array.md#length) in an array, +the [number of attribute keys](document-object.md#length) of an object / document and +the [amount of documents](miscellaneous.md#length) in a collection. + +**Examples** + +```aql +--- +name: aqlLengthString_1 +description: '' +--- +RETURN LENGTH("foobar") +``` + +```aql +--- +name: aqlLengthString_2 +description: '' +--- +RETURN LENGTH("电脑坏了") +``` + +## LEVENSHTEIN_DISTANCE() + +`LEVENSHTEIN_DISTANCE(value1, value2) → distance` + +Calculate the [Damerau-Levenshtein distance](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) +between two strings. + +- **value1** (string): a string +- **value2** (string): a string +- returns **distance** (number): calculated Damerau-Levenshtein distance + between the input strings `value1` and `value2` + +**Examples** + +```aql +--- +name: aqlLevenshteinDistance_1 +description: '' +--- +RETURN LEVENSHTEIN_DISTANCE("foobar", "bar") +``` + +```aql +--- +name: aqlLevenshteinDistance_2 +description: '' +--- +RETURN LEVENSHTEIN_DISTANCE(" ", "") +``` + +```aql +--- +name: aqlLevenshteinDistance_3 +description: '' +--- +RETURN LEVENSHTEIN_DISTANCE("The quick brown fox jumps over the lazy dog", "The quick black dog jumps over the brown fox") +``` + +```aql +--- +name: aqlLevenshteinDistance_4 +description: '' +--- +RETURN LEVENSHTEIN_DISTANCE("der mötör trötet", "der trötet") +``` + +## LIKE() + +`LIKE(text, search, caseInsensitive) → bool` + +Check whether the pattern `search` is contained in the string `text`, +using wildcard matching. + +- `_`: A single arbitrary character +- `%`: Zero, one or many arbitrary characters +- `\\_`: A literal underscore +- `\\%`: A literal percent sign + +{{< info >}} +Literal backlashes require different amounts of escaping depending on the +context: +- `\` in bind variables (_Table_ view mode) in the web interface (automatically + escaped to `\\` unless the value is wrapped in double quotes and already + escaped properly) +- `\\` in bind variables (_JSON_ view mode) and queries in the web interface +- `\\` in bind variables in arangosh +- `\\\\` in queries in arangosh +- Double the amount compared to arangosh in shells that use backslashes for +escaping (`\\\\` in bind variables and `\\\\\\\\` in queries) +{{< /info >}} + +The `LIKE()` function cannot be accelerated by any sort of index. However, +the [ArangoSearch `LIKE()` function](arangosearch.md#like) that +is used in the context of a `SEARCH` operation is backed by View indexes. + +- **text** (string): the string to search in +- **search** (string): a search pattern that can contain the wildcard characters + `%` (meaning any sequence of characters, including none) and `_` (any single + character). Literal `%` and `_` must be escaped with backslashes. + *search* cannot be a variable or a document attribute. The actual value must + be present at query parse time already. +- **caseInsensitive** (bool, *optional*): if set to `true`, the matching will be + case-insensitive. The default is `false`. +- returns **bool** (bool): `true` if the pattern is contained in `text`, + and `false` otherwise + +**Examples** + +```aql +--- +name: aqlLikeString_1 +description: '' +--- +RETURN [ + LIKE("cart", "ca_t"), + LIKE("carrot", "ca_t"), + LIKE("carrot", "ca%t") +] +``` + +```aql +--- +name: aqlLikeString_2 +description: '' +--- +RETURN [ + LIKE("foo bar baz", "bar"), + LIKE("foo bar baz", "%bar%"), + LIKE("bar", "%bar%") +] +``` + +```aql +--- +name: aqlLikeString_3 +description: '' +--- +RETURN [ + LIKE("FoO bAr BaZ", "fOo%bAz"), + LIKE("FoO bAr BaZ", "fOo%bAz", true) +] +``` + +## LOWER() + +`LOWER(value) → lowerCaseString` + +Convert upper-case letters in `value` to their lower-case counterparts. +All other characters are returned unchanged. + +- **value** (string): a string +- returns **lowerCaseString** (string): `value` with upper-case characters converted + to lower-case characters + +**Examples** + +```aql +--- +name: aqlLower +description: '' +--- +RETURN LOWER("AVOcado") +``` + +## LTRIM() + +`LTRIM(value, chars) → strippedString` + +Return the string `value` with whitespace stripped from the start only. + +To strip from the end only, see [`RTRIM()`](#rtrim).\ +To strip both sides, see [`TRIM()`](#trim). + +- **value** (string): a string +- **chars** (string, *optional*): override the characters that should + be removed from the string. It defaults to `\r\n \t` (i.e. `0x0d`, `0x0a`, + `0x20` and `0x09`). +- returns **strippedString** (string): `value` without `chars` at the + left-hand side + +```aql +--- +name: aqlLtrim_1 +description: '' +--- +RETURN LTRIM("foo bar") +``` + +```aql +--- +name: aqlLtrim_2 +description: '' +--- +RETURN LTRIM(" foo bar ") +``` + +```aql +--- +name: aqlLtrim_3 +description: '' +--- +RETURN LTRIM("--==[foo-bar]==--", "-=[]") +``` + +## MD5() + +`MD5(text) → hash` + +Calculate the MD5 checksum for `text` and return it in a hexadecimal +string representation. + +- **text** (string): a string +- returns **hash** (string): MD5 checksum as hex string + +**Examples** + +```aql +--- +name: aqlMd5 +description: '' +--- +RETURN MD5("foobar") +``` + +## NGRAM_POSITIONAL_SIMILARITY() + +`NGRAM_POSITIONAL_SIMILARITY(input, target, ngramSize) → similarity` + +Calculates the [_n_-gram similarity](https://webdocs.cs.ualberta.ca/~kondrak/papers/spire05.pdf) +between `input` and `target` using _n_-grams with minimum and maximum length of +`ngramSize`. + +The similarity is calculated by counting how long the longest sequence of +matching _n_-grams is, divided by the **longer argument's** total _n_-gram count. +Partially matching _n_-grams are counted, whereas +[`NGRAM_SIMILARITY()`](#ngram_similarity) counts only fully matching _n_-grams. + +The _n_-grams for both input and target are calculated on the fly, +not involving Analyzers. + +- **input** (string): source text to be tokenized into _n_-grams +- **target** (string): target text to be tokenized into _n_-grams +- **ngramSize** (number): minimum as well as maximum _n_-gram length +- returns **similarity** (number): value between `0.0` and `1.0` + +**Examples** + +```aql +--- +name: aqlNgramPositionalSimilarity +description: '' +--- +RETURN [ + NGRAM_POSITIONAL_SIMILARITY("quick fox", "quick foxx", 2), + NGRAM_POSITIONAL_SIMILARITY("quick fox", "quick foxx", 3), + NGRAM_POSITIONAL_SIMILARITY("quick fox", "quirky fox", 2), + NGRAM_POSITIONAL_SIMILARITY("quick fox", "quirky fox", 3) +] +``` + +## NGRAM_SIMILARITY() + +`NGRAM_SIMILARITY(input, target, ngramSize) → similarity` + +Calculates [_n_-gram similarity](https://webdocs.cs.ualberta.ca/~kondrak/papers/spire05.pdf) +between `input` and `target` using _n_-grams with minimum and maximum length of +`ngramSize`. + +The similarity is calculated by counting how long the longest sequence of +matching _n_-grams is, divided by **target's** total _n_-gram count. +Only fully matching _n_-grams are counted, whereas +[`NGRAM_POSITIONAL_SIMILARITY()`](#ngram_positional_similarity) counts partially +matching _n_-grams too. This behavior matches the similarity measure used in +[`NGRAM_MATCH()`](arangosearch.md#ngram_match). + +The _n_-grams for both input and target are calculated on the fly, not involving +Analyzers. + +- **input** (string): source text to be tokenized into _n_-grams +- **target** (string): target text to be tokenized into _n_-grams +- **ngramSize** (number): minimum as well as maximum _n_-gram length +- returns **similarity** (number): value between `0.0` and `1.0` + +**Examples** + +```aql +--- +name: aqlNgramSimilarity +description: '' +--- +RETURN [ + NGRAM_SIMILARITY("quick fox", "quick foxx", 2), + NGRAM_SIMILARITY("quick fox", "quick foxx", 3), + NGRAM_SIMILARITY("quick fox", "quirky fox", 2), + NGRAM_SIMILARITY("quick fox", "quirky fox", 3) +] +``` + +## RANDOM_TOKEN() + +`RANDOM_TOKEN(length) → randomString` + +Generate a pseudo-random token string with the specified length. +The algorithm for token generation should be treated as opaque. + +- **length** (number): desired string length for the token. It must be greater + or equal to 0 and at most 65536. A `length` of 0 returns an empty string. +- returns **randomString** (string): a generated token consisting of lowercase + letters, uppercase letters and numbers + +**Examples** + +```aql +--- +name: aqlRandomToken +description: '' +--- +RETURN [ + RANDOM_TOKEN(8), + RANDOM_TOKEN(8) +] +``` + +## REGEX_MATCHES() + +`REGEX_MATCHES(text, regex, caseInsensitive) → stringArray` + +Return the matches in the given string `text`, using the `regex`. + +- **text** (string): the string to search in +- **regex** (string): a [regular expression](#regular-expression-syntax) + to use for matching the `text` +- **caseInsensitive** (bool, *optional*): if set to `true`, the matching will be + case-insensitive. The default is `false`. +- returns **stringArray** (array): an array of strings containing the matches, + or `null` and a warning if the expression is invalid + +**Examples** + +```aql +--- +name: aqlRegexMatches_1 +description: '' +--- +RETURN REGEX_MATCHES("My-us3r_n4m3", "^[a-z0-9_-]{3,16}$", true) +``` + +```aql +--- +name: aqlRegexMatches_2 +description: '' +--- +RETURN REGEX_MATCHES("#4d82h4", "^#?([a-f0-9]{6}|[a-f0-9]{3})$", true) +``` + +```aql +--- +name: aqlRegexMatches_3 +description: '' +--- +RETURN REGEX_MATCHES("john@doe.com", "^([a-z0-9_\\\\.-]+)@([\\\\da-z-]+)\\\\.([a-z\\\\.]{2,6})$", false) +``` + +## REGEX_SPLIT() + +`REGEX_SPLIT(text, splitExpression, caseInsensitive, limit) → stringArray` + +Split the given string `text` into a list of strings at positions where +`splitExpression` matches. + +- **text** (string): the string to split +- **splitExpression** (string): a [regular expression](#regular-expression-syntax) + to use for splitting the `text`. You can define a capturing group to keep matches +- **caseInsensitive** (bool, *optional*): if set to `true`, the matching will be + case-insensitive. The default is `false`. +- **limit** (number, *optional*): limit the number of split values in the result. + If no `limit` is given, the number of splits returned is not bounded. +- returns **stringArray** (array): an array of strings, or `null` and a warning + if the expression is invalid + +**Examples** + +```aql +--- +name: aqlRegexSplit_1 +description: '' +--- +RETURN REGEX_SPLIT("This is a line.\\n This is yet another line\\r\\n This again is a line.\\r Mac line ", "\\\\.?\\r\\n|\\r|\\n") +``` + +```aql +--- +name: aqlRegexSplit_2 +description: '' +--- +RETURN REGEX_SPLIT("hypertext language, programming", "[\\\\s, ]+") +``` + +```aql +--- +name: aqlRegexSplit_3 +description: '' +--- +RETURN [ + REGEX_SPLIT("Capture the article", "(the)"), + REGEX_SPLIT("Don't capture the article", "the") +] +``` + +```aql +--- +name: aqlRegexSplit_4 +description: '' +--- +RETURN REGEX_SPLIT("cA,Bc,A,BcA,BcA,Bc", "a,b", true, 3) +``` + +## REGEX_TEST() + +`REGEX_TEST(text, search, caseInsensitive) → bool` + +Check whether the pattern `search` is contained in the string `text`, +using regular expression matching. + +- **text** (string): the string to search in +- **search** (string): a [regular expression](#regular-expression-syntax) + search pattern +- **caseInsensitive** (bool, *optional*): if set to `true`, the matching will be + case-insensitive. The default is `false`. +- returns **bool** (bool): `true` if the pattern is contained in `text`, + and `false` otherwise, or `null` and a warning if the expression is invalid + +**Examples** + +```aql +--- +name: aqlRegexTest_1 +description: '' +--- +RETURN REGEX_TEST("the quick brown fox", "the.*fox") +``` + +```aql +--- +name: aqlRegexTest_2 +description: '' +--- +RETURN REGEX_TEST("the quick brown fox", "^(a|the)\\\\s+(quick|slow).*f.x$") +``` + +```aql +--- +name: aqlRegexTest_3 +description: '' +--- +RETURN REGEX_TEST("the\\nquick\\nbrown\\nfox", "^the(\\n[a-w]+)+\\nfox$") +``` + +## REGEX_REPLACE() + +`REGEX_REPLACE(text, search, replacement, caseInsensitive) → string` + +Replace the pattern `search` with the string `replacement` in the string +`text`, using regular expression matching. + +- **text** (string): the string to search in +- **search** (string): a [regular expression](#regular-expression-syntax) + search pattern +- **replacement** (string): the string to replace the `search` pattern with +- **caseInsensitive** (bool, *optional*): if set to `true`, the matching will be + case-insensitive. The default is `false`. +- returns **string** (string): the string `text` with the `search` regex + pattern replaced with the `replacement` string wherever the pattern exists + in `text`, or `null` and a warning if the expression is invalid + +**Examples** + +```aql +--- +name: aqlRegexReplace_1 +description: '' +--- +RETURN REGEX_REPLACE("the quick brown fox", "the.*fox", "jumped over") +``` + +```aql +--- +name: aqlRegexReplace_2 +description: '' +--- +RETURN REGEX_REPLACE("An Avocado", "a", "_") +``` + +```aql +--- +name: aqlRegexReplace_3 +description: '' +--- +RETURN REGEX_REPLACE("An Avocado", "a", "_", true) +``` + +## REVERSE() + +`REVERSE(value) → reversedString` + +Return the reverse of the string `value`. + +- **value** (string): a string +- returns **reversedString** (string): a new string with the characters in + reverse order + +**Examples** + +```aql +--- +name: aqlReverse_1 +description: '' +--- +RETURN REVERSE("foobar") +``` + +```aql +--- +name: aqlReverse_2 +description: '' +--- +RETURN REVERSE("电脑坏了") +``` + +## RIGHT() + +`RIGHT(value, length) → substring` + +Return the `length` rightmost characters of the string `value`. + +To return the leftmost characters, see [`LEFT()`](#left).\ +To take a part from an arbitrary position off the string, +see [`SUBSTRING()`](#substring). + +- **value** (string): a string +- **length** (number): how many characters to return +- returns **substring** (string): at most `length` characters of `value`, + starting on the right-hand side of the string + +**Examples** + +```aql +--- +name: aqlRight_1 +description: '' +--- +RETURN RIGHT("foobar", 3) +``` + +```aql +--- +name: aqlRight_2 +description: '' +--- +RETURN RIGHT("foobar", 10) +``` + +## RTRIM() + +`RTRIM(value, chars) → strippedString` + +Return the string `value` with whitespace stripped from the end only. + +To strip from the start only, see [`LTRIM()`](#ltrim).\ +To strip both sides, see [`TRIM()`](#trim). + +- **value** (string): a string +- **chars** (string, *optional*): override the characters that should + be removed from the string. It defaults to `\r\n \t` (i.e. `0x0d`, `0x0a`, + `0x20` and `0x09`). +- returns **strippedString** (string): `value` without `chars` at the + right-hand side + +**Examples** + +```aql +--- +name: aqlRtrim_1 +description: '' +--- +RETURN RTRIM("foo bar") +``` + +```aql +--- +name: aqlRtrim_2 +description: '' +--- +RETURN RTRIM(" foo bar ") +``` + +```aql +--- +name: aqlRtrim_3 +description: '' +--- +RETURN RTRIM("--==[foo-bar]==--", "-=[]") +``` + +## SHA1() + +`SHA1(text) → hash` + +Calculate the SHA1 checksum for `text` and returns it in a hexadecimal +string representation. + +- **text** (string): a string +- returns **hash** (string): SHA1 checksum as hex string + +**Examples** + +```aql +--- +name: aqlSha1 +description: '' +--- +RETURN SHA1("foobar") +``` + +## SHA256() + +`SHA256(text) → hash` + +Calculate the SHA256 checksum for `text` and return it in a hexadecimal +string representation. + +- **text** (string): a string +- returns **hash** (string): SHA256 checksum as hex string + +**Examples** + +```aql +--- +name: aqlSha256 +description: '' +--- +RETURN SHA256("foobar") +``` + +## SHA512() + +`SHA512(text) → hash` + +Calculate the SHA512 checksum for `text` and return it in a hexadecimal +string representation. + +- **text** (string): a string +- returns **hash** (string): SHA512 checksum as hex string + +**Examples** + +```aql +--- +name: aqlSha512 +description: '' +--- +RETURN SHA512("foobar") +``` + +## SOUNDEX() + +`SOUNDEX(value) → soundexString` + +Return the [Soundex](https://en.wikipedia.org/wiki/Soundex) +fingerprint of `value`. + +- **value** (string): a string +- returns **soundexString** (string): a Soundex fingerprint of `value` + +**Examples** + +```aql +--- +name: aqlSoundex +description: '' +--- +RETURN [ + SOUNDEX("example"), + SOUNDEX("ekzampul"), + SOUNDEX("soundex"), + SOUNDEX("sounteks") +] +``` + +## SPLIT() + +`SPLIT(value, separator, limit) → strArray` + +Split the given string `value` into a list of strings, using the `separator`. + +To split a document identifier (`_id`) into the collection name and document key +(`_key`), you should use the more optimized +[`PARSE_IDENTIFIER()` function](document-object.md#parse_identifier). + +- **value** (string): a string +- **separator** (string): either a string or a list of strings. If `separator` is + an empty string, `value` will be split into a list of characters. If no `separator` + is specified, `value` will be returned as array. +- **limit** (number, *optional*): limit the number of split values in the result. + If no `limit` is given, the number of splits returned is not bounded. +- returns **strArray** (array): an array of strings + +**Examples** + +```aql +--- +name: aqlSplit_1 +description: '' +--- +RETURN SPLIT( "foo-bar-baz", "-" ) +``` + +```aql +--- +name: aqlSplit_2 +description: '' +--- +RETURN SPLIT( "foo-bar-baz", "-", 1 ) +``` + +```aql +--- +name: aqlSplit_3 +description: '' +--- +RETURN SPLIT( "foo, bar & baz", [ ", ", " & " ] ) +``` + +## STARTS_WITH() + +`STARTS_WITH(text, prefix) → startsWith` + +Check whether the given string starts with `prefix`. + +There is a corresponding [`STARTS_WITH()` ArangoSearch function](arangosearch.md#starts_with) +that can utilize View indexes. + +- **text** (string): a string to compare against +- **prefix** (string): a string to test for at the start of the text +- returns **startsWith** (bool): whether the text starts with the given prefix + +**Examples** + +```aql +--- +name: aqlStartsWith_1 +description: '' +--- +RETURN STARTS_WITH("foobar", "foo") +``` + +```aql +--- +name: aqlStartsWith_2 +description: '' +--- +RETURN STARTS_WITH("foobar", "baz") +``` + +--- + +`STARTS_WITH(text, prefixes, minMatchCount) → startsWith` + +Check if the given string starts with one of the `prefixes`. + +- **text** (string): a string to compare against +- **prefixes** (array): an array of strings to test for at the start of the text +- **minMatchCount** (number, _optional_): minimum number of prefixes that + should be satisfied. The default is `1` and it is the only meaningful value + unless `STARTS_WITH()` is used in the context of a `SEARCH` expression where + an attribute can have multiple values at the same time +- returns **startsWith** (bool): whether the text starts with at least + *minMatchCount* of the given prefixes + +**Examples** + +```aql +--- +name: aqlStartsWith_3 +description: '' +--- +RETURN STARTS_WITH("foobar", ["bar", "foo"]) +``` + +```aql +--- +name: aqlStartsWith_4 +description: '' +--- +RETURN STARTS_WITH("foobar", ["bar", "baz"]) +``` + +## SUBSTITUTE() + +`SUBSTITUTE(value, search, replace, limit) → substitutedString` + +Replace search values in the string `value`. + +- **value** (string): a string +- **search** (string\|array): if `search` is a string, all occurrences of + `search` will be replaced in `value`. If `search` is an array of strings, + each occurrence of a value contained in `search` will be replaced by the + corresponding array element in `replace`. If `replace` has less list items + than `search`, occurrences of unmapped `search` items will be replaced by an + empty string. +- **replace** (string\|array, *optional*): a replacement string, or an array of + strings to replace the corresponding elements of `search` with. Can have less + elements than `search` or be left out to remove matches. If `search` is an array + but `replace` is a string, then all matches will be replaced with `replace`. +- **limit** (number, *optional*): cap the number of replacements to this value +- returns **substitutedString** (string): a new string with matches replaced + (or removed) + +**Examples** + +```aql +--- +name: aqlSubstitute_1 +description: '' +--- +RETURN SUBSTITUTE( "the quick brown foxx", "quick", "lazy" ) +``` + +```aql +--- +name: aqlSubstitute_2 +description: '' +--- +RETURN SUBSTITUTE( "the quick brown foxx", [ "quick", "foxx" ], [ "slow", "dog" ] ) +``` + +```aql +--- +name: aqlSubstitute_3 +description: '' +--- +RETURN SUBSTITUTE( "the quick brown foxx", [ "the", "foxx" ], [ "that", "dog" ], 1 ) +``` + +```aql +--- +name: aqlSubstitute_4 +description: '' +--- +RETURN SUBSTITUTE( "the quick brown foxx", [ "the", "quick", "foxx" ], [ "A", "VOID!" ] ) +``` + +```aql +--- +name: aqlSubstitute_5 +description: '' +--- +RETURN SUBSTITUTE( "the quick brown foxx", [ "quick", "foxx" ], "xx" ) +``` + +--- + +`SUBSTITUTE(value, mapping, limit) → substitutedString` + +Alternatively, `search` and `replace` can be specified in a combined value. + +- **value** (string): a string +- **mapping** (object): a lookup map with search strings as keys and replacement + strings as values. Empty strings and `null` as values remove matches. + Note that there is no defined order in which the mapping is processed. In case + of overlapping searches and substitutions, one time the first entry may win, + another time the second. If you need to ensure a specific order then choose + the array-based variant of this function +- **limit** (number, *optional*): cap the number of replacements to this value +- returns **substitutedString** (string): a new string with matches replaced + (or removed) + +**Examples** + +```aql +--- +name: aqlSubstitute_6 +description: '' +--- +RETURN SUBSTITUTE("the quick brown foxx", { + "quick": "small", + "brown": "slow", + "foxx": "ant" +}) +``` + +```aql +--- +name: aqlSubstitute_7 +description: '' +--- +RETURN SUBSTITUTE("the quick brown foxx", { + "quick": "", + "brown": null, + "foxx": "ant" +}) +``` + +```aql +--- +name: aqlSubstitute_8 +description: '' +--- +RETURN SUBSTITUTE("the quick brown foxx", { + "quick": "small", + "brown": "slow", + "foxx": "ant" +}, 2) +``` + +## SUBSTRING() + +`SUBSTRING(value, offset, length) → substring` + +Return a substring of `value`. + +To return the rightmost characters, see [`RIGHT()`](#right).\ +To return the leftmost characters, see [`LEFT()`](#left). + +- **value** (string): a string +- **offset** (number): start at this character of the string. Offsets start at 0. + Negative offsets start from the end of the string. The last character has an + index of -1 +- **length** (number, *optional*): take this many characters. Omit the parameter + to get the substring from `offset` to the end of the string +- returns **substring** (string): a substring of `value` + +**Examples** + +Get a substring starting at the 6th character and until the end of the string: + +```aql +--- +name: aqlSubstring_1 +description: '' +--- +RETURN SUBSTRING("Holy Guacamole!", 5) +``` + +Get a 4 characters long substring, starting at the 11th character: + +```aql +--- +name: aqlSubstring_2 +description: '' +--- +RETURN SUBSTRING("Holy Guacamole!", 10, 4) +``` + +Get a 4 characters long substring, starting at the 5th from last character: + +```aql +--- +name: aqlSubstring_3 +description: '' +--- +RETURN SUBSTRING("Holy Guacamole!", -5, 4) +``` + +## SUBSTRING_BYTES() + +`SUBSTRING_BYTES(value, offset, length) → substring` + +Return a substring of `value`, using an `offset` and `length` in bytes instead +of in number of characters. + +This function is intended to be used together with the +[`OFFSET_INFO()` function](arangosearch.md#offset_info) for +[search highlighting](../../index-and-search/arangosearch/search-highlighting.md). + +- **value** (string): a string +- **offset** (number): start at this byte of the UTF-8 encoded string. + Offsets start at 0. Negative offsets start from the end of the string. + The last byte has an index of -1. The offset needs to coincide with the + beginning of a character's byte sequence +- **length** (number, *optional*): take this many bytes. Omit the parameter to + get the substring from `offset` to the end of the string. The end byte + (`offset` + `length`) needs to coincide with the end of a character's + byte sequence +- returns **substring** (string\|null): a substring of `value`, or `null` and + produces a warning if the start or end byte is in the middle of a character's + byte sequence + +**Examples** + +Get a substring starting at the 11th byte and until the end of the string. +Note that the heart emoji is comprised of two characters, the Black Heart Symbol +and the Variation Selector-16, each encoded using 3 bytes in UTF-8: + +```aql +--- +name: aqlSubstringBytes_1 +description: '' +--- +RETURN SUBSTRING_BYTES("We ❤️ avocado!", 10) +``` + +Get a 3 bytes long substring starting at the 3rd byte, extracting the +Black Heart Symbol: + +```aql +--- +name: aqlSubstringBytes_2 +description: '' +--- +RETURN SUBSTRING_BYTES("We ❤️ avocado!", 3, 3) +``` + +Get a 6 bytes long substring starting at the 15th byte from last, extracting the +heart emoji: + +```aql +--- +name: aqlSubstringBytes_3 +description: '' +--- +RETURN SUBSTRING_BYTES("We ❤️ avocado!", -15, 6) +``` + +Try to get a 4 bytes long substring starting at the 15th byte from last, +resulting in a `null` value and a warning because the substring contains an +incomplete UTF-8 byte sequence: + +```aql +--- +name: aqlSubstringBytes_4 +description: '' +--- +RETURN SUBSTRING_BYTES("We ❤️ avocado!", -15, 4) +``` + +## TOKENS() + +`TOKENS(input, analyzer) → tokenArray` + +Split the `input` string(s) with the help of the specified `analyzer` into an +array. The resulting array can be used in `FILTER` or `SEARCH` statements with +the `IN` operator, but also be assigned to variables and returned. This can be +used to better understand how a specific Analyzer processes an input value. + +It has a regular return value unlike all other ArangoSearch AQL functions and +is thus not limited to `SEARCH` operations. It is independent of Views. +A wrapping `ANALYZER()` call in a search expression does not affect the +`analyzer` argument nor allow you to omit it. + +- **input** (string\|array): text to tokenize. Accepts recursive arrays of + strings. +- **analyzer** (string): name of an [Analyzer](../../index-and-search/analyzers.md). +- returns **tokenArray** (array): array of strings with zero or more elements, + each element being a token. + +**Examples** + +Example query showcasing the `"text_de"` Analyzer (tokenization with stemming, +case conversion and accent removal for German text): + +```aql +--- +name: aqlTokens_1 +description: '' +--- +RETURN TOKENS("Lörem ipsüm, DOLOR SIT Ämet.", "text_de") +``` + +To search a View for documents where the `text` attribute contains certain +words/tokens in any order, you can use the function like this: + +```aql +FOR doc IN viewName + SEARCH ANALYZER(doc.text IN TOKENS("dolor amet lorem", "text_en"), "text_en") + RETURN doc +``` + +It will match `{ "text": "Lorem ipsum, dolor sit amet." }` for instance. If you +want to search for tokens in a particular order, use +[`PHRASE()`](arangosearch.md#phrase) instead. + +If an array of strings is passed as first argument, then each string is +tokenized individually and an array with the same nesting as the input array +is returned: + +```aql +--- +name: aqlTokens_2 +description: '' +--- +RETURN TOKENS("quick brown fox", "text_en") +``` + +```aql +--- +name: aqlTokens_3 +description: '' +--- +RETURN TOKENS(["quick brown", "fox"], "text_en") +``` + +```aql +--- +name: aqlTokens_4 +description: '' +--- +RETURN TOKENS(["quick brown", ["fox"]], "text_en") +``` + +In most cases you will want to flatten the resulting array for further usage, +because nested arrays are not accepted in `SEARCH` statements such as +`<array> ALL IN doc.<attribute>`: + +```aql +LET tokens = TOKENS(["quick brown", ["fox"]], "text_en") // [ ["quick", "brown"], [["fox"]] ] +LET tokens_flat = FLATTEN(tokens, 2) // [ "quick", "brown", "fox" ] +FOR doc IN myView SEARCH ANALYZER(tokens_flat ALL IN doc.title, "text_en") RETURN doc +``` + +## TO_BASE64() + +`TO_BASE64(value) → encodedString` + +Return the Base64 representation of `value`. + +- **value** (string): a string +- returns **encodedString** (string): a Base64 representation of `value` + +**Examples** + +```aql +--- +name: aqlToBase64 +description: '' +--- +RETURN [ + TO_BASE64("ABC."), + TO_BASE64("123456") +] +``` + +## TO_HEX() + +`TO_HEX(value) → hexString` + +Return the hexadecimal representation of `value`. + +- **value** (string): a string +- returns **hexString** (string): a hexadecimal representation of `value` + +**Examples** + +```aql +--- +name: aqlToHex +description: '' +--- +RETURN [ + TO_HEX("ABC."), + TO_HEX("ü") +] +``` + +## TRIM() + +`TRIM(value, type) → strippedString` + +Return the string `value` with whitespace stripped from the start and/or end. + +The optional `type` parameter specifies from which parts of the string the +whitespace is stripped. [`LTRIM()`](#ltrim) and [`RTRIM()`](#rtrim) are preferred +however. + +- **value** (string): a string +- **type** (number, *optional*): strip whitespace from the + - `0` – start and end of the string (default) + - `1` – start of the string only + - `2` – end of the string only + +--- + +`TRIM(value, chars) → strippedString` + +Return the string `value` with whitespace stripped from the start and end. + +- **value** (string): a string +- **chars** (string, *optional*): override the characters that should + be removed from the string. It defaults to `\r\n \t` (i.e. `0x0d`, `0x0a`, + `0x20` and `0x09`). +- returns **strippedString** (string): `value` without `chars` on both sides + +**Examples** + +```aql +--- +name: aqlTrim_1 +description: '' +--- +RETURN TRIM("foo bar") +``` + +```aql +--- +name: aqlTrim_2 +description: '' +--- +RETURN TRIM(" foo bar ") +``` + +```aql +--- +name: aqlTrim_3 +description: '' +--- +RETURN TRIM("--==[foo-bar]==--", "-=[]") +``` + +```aql +--- +name: aqlTrim_4 +description: '' +--- +RETURN TRIM(" foobar\\t \\r\\n ") +``` + +```aql +--- +name: aqlTrim_5 +description: '' +--- +RETURN TRIM(";foo;bar;baz, ", ",; ") +``` + +## UPPER() + +`UPPER(value) → upperCaseString` + +Convert lower-case letters in `value` to their upper-case counterparts. +All other characters are returned unchanged. + +- **value** (string): a string +- returns **upperCaseString** (string): `value` with lower-case characters converted + to upper-case characters + +**Examples** + +```aql +--- +name: aqlUpper +description: '' +--- +RETURN UPPER("AVOcado") +``` + +## UUID() + +`UUID() → UUIDString` + +Return a universally unique identifier value. + +- returns **UUIDString** (string): a universally unique identifier + +**Examples** + +```aql +--- +name: aqlUuid +description: '' +--- +FOR i IN 1..3 + RETURN UUID() +``` + +## Regular Expression Syntax + +A regular expression may consist of literal characters and the following +characters and sequences: + +- `.` – the dot matches any single character except line terminators. + To include line terminators, use `[\s\S]` instead to simulate `.` with *DOTALL* flag. +- `\d` – matches a single digit, equivalent to `[0-9]` +- `\s` – matches a single whitespace character +- `\S` – matches a single non-whitespace character +- `\b` – matches a word boundary. This match is zero-length +- `\B` – Negation of `\b`. The match is zero-length +- `[xyz]` – set of characters. Matches any of the enclosed characters + (here: *x*, *y*, or *z*) +- `[^xyz]` – negated set of characters. Matches any other character than the + enclosed ones (i.e. anything but *x*, *y*, or *z* in this case) +- `[x-z]` – range of characters. Matches any of the characters in the + specified range, e.g. `[0-9A-F]` to match any character in + *0123456789ABCDEF* +- `[^x-z]` – negated range of characters. Matches any other character than the + ones specified in the range +- `(xyz)` – defines and matches a pattern group. Also defines a capturing group. +- `(?:xyz)` – defines and matches a pattern group without capturing the match +- `(xy|z)` – matches either *xy* or *z* +- `^` – matches the beginning of the string (e.g. `^xyz`) +- `$` – matches the end of the string (e.g. `xyz$`) + +To literally match one of the characters that have a special meaning in regular +expressions (`.`, `*`, `?`, `[`, `]`, `(`, `)`, `{`, `}`, `^`, `$`, and `\`) +you may need to escape the character with a backslash, which typically requires +escaping itself. The backslash of shorthand character classes like `\d`, `\s`, +and `\b` counts as literal backslash. The backslash of JSON escape sequences +like `\t` (tabulation), `\r` (carriage return), and `\n` (line feed) does not, +however. + +{{< info >}} +Literal backlashes require different amounts of escaping depending on the +context: +- `\` in bind variables (_Table_ view mode) in the web interface (automatically + escaped to `\\` unless the value is wrapped in double quotes and already + escaped properly) +- `\\` in bind variables (_JSON_ view mode) and queries in the web interface +- `\\` in bind variables in arangosh +- `\\\\` in queries in arangosh +- Double the amount compared to arangosh in shells that use backslashes for +escaping (`\\\\` in bind variables and `\\\\\\\\` in queries) +{{< /info >}} + +Characters and sequences may optionally be repeated using the following +quantifiers: + +- `x?` – matches one or zero occurrences of *x* +- `x*` – matches zero or more occurrences of *x* (greedy) +- `x+` – matches one or more occurrences of *x* (greedy) +- `x*?` – matches zero or more occurrences of *x* (non-greedy) +- `x+?` – matches one or more occurrences of *x* (non-greedy) +- `x{y}` – matches exactly *y* occurrences of *x* +- `x{y,z}` – matches between *y* and *z* occurrences of *x* +- `x{y,}` – matches at least *y* occurrences of *x* + +Note that `xyz+` matches *xyzzz*, but if you want to match *xyzxyz* instead, +you need to define a pattern group by wrapping the sub-expression in parentheses +and place the quantifier right behind it, like `(xyz)+`. diff --git a/site/content/arangodb/oem/aql/functions/type-check-and-cast.md b/site/content/arangodb/oem/aql/functions/type-check-and-cast.md new file mode 100644 index 0000000000..81b3bb9870 --- /dev/null +++ b/site/content/arangodb/oem/aql/functions/type-check-and-cast.md @@ -0,0 +1,279 @@ +--- +title: Type check and cast functions in AQL +menuTitle: Type check & cast +weight: 55 +description: >- + AQL provides functions for checking data types and converting between + different types +--- +Some operators expect their operands to have a certain data type. For example, +logical operators expect their operands to be boolean values, and the arithmetic +operators expect their operands to be numeric values. If an operation is performed +with operands of other types, an automatic conversion to the expected types is +tried. This is called implicit type casting. It helps to avoid query +aborts. + +Type casts can also be performed upon request by invoking a type cast function. +This is called explicit type casting. AQL offers several functions for this. +Each of the these functions takes an operand of any data type and returns a result +value with the type corresponding to the function name. For example, `TO_NUMBER()` +returns a numeric value. + +## Type casting functions + +### TO_BOOL() + +`TO_BOOL(value) → bool` + +Take an input *value* of any type and convert it into the appropriate +boolean value. + +- **value** (any): input of arbitrary type +- returns **bool** (boolean): + - *null* is converted to *false* + - Numbers are converted to *true*, except for 0, which is converted to *false* + - Strings are converted to *true* if they are non-empty, and to *false* otherwise + - Arrays are always converted to *true* (even if empty) + - Objects / documents are always converted to *true* + +It's also possible to use double negation to cast to boolean: + +```aql +!!1 // true +!!0 // false +!!-0.0 // false +not not 1 // true +!!"non-empty string" // true +!!"" // false +``` + +`TO_BOOL()` is preferred however, because it states the intention clearer. + +### TO_NUMBER() + +`TO_NUMBER(value) → number` + +Take an input *value* of any type and convert it into a numeric value. + +- **value** (any): input of arbitrary type +- returns **number** (number): + - *null* and *false* are converted to the value *0* + - *true* is converted to *1* + - Numbers keep their original value + - Strings are converted to their numeric equivalent if the string contains a + valid representation of a number. Whitespace at the start and end of the string + is allowed. String values that do not contain any valid representation of a number + will be converted to the number *0*. + - An empty array is converted to *0*, an array with one member is converted into the + result of `TO_NUMBER()` for its sole member. An array with two or more members is + converted to the number *0*. + - An object / document is converted to the number *0*. + - A unary plus will also cast to a number, but `TO_NUMBER()` is the preferred way: + ```aql + +'5' // 5 + +[8] // 8 + +[8,9] // 0 + +{} // 0 + ``` + - A unary minus works likewise, except that a numeric value is also negated: + ```aql + -'5' // -5 + -[8] // -8 + -[8,9] // 0 + -{} // 0 + ``` + +### TO_STRING() + +`TO_STRING(value) → str` + +Take an input *value* of any type and convert it into a string value. + +- **value** (any): input of arbitrary type +- returns **str** (string): + - *null* is converted to an empty string `""` + - *false* is converted to the string *"false"*, *true* to the string *"true"* + - Numbers are converted to their string representations. This can also be a + scientific notation (e.g. "2e-7") + - Arrays and objects / documents are converted to string representations, + which means JSON-encoded strings with no additional whitespace + +```aql +TO_STRING(null) // "" +TO_STRING(true) // "true" +TO_STRING(false) // "false" +TO_STRING(123) // "123" +TO_STRING(+1.23) // "1.23" +TO_STRING(-1.23) // "-1.23" +TO_STRING(0.0000002) // "2e-7" +TO_STRING( [1, 2, 3] ) // "[1,2,3]" +TO_STRING( { foo: "bar", baz: null } ) // "{\"foo\":\"bar\",\"baz\":null}" +``` + +### TO_ARRAY() + +`TO_ARRAY(value) → array` + +Take an input *value* of any type and convert it into an array value. + +- **value** (any): input of arbitrary type +- returns **array** (array): + - *null* is converted to an empty array + - Boolean values, numbers and strings are converted to an array containing + the original value as its single element + - Arrays keep their original value + - Objects / documents are converted to an array containing their attribute + **values** as array elements, just like [`VALUES()`](document-object.md#values) + +```aql +TO_ARRAY(null) // [] +TO_ARRAY(false) // [false] +TO_ARRAY(true) // [true] +TO_ARRAY(5) // [5] +TO_ARRAY("foo") // ["foo"] +TO_ARRAY([1, 2, "foo"]) // [1, 2, "foo"] +TO_ARRAY({foo: 1, bar: 2, baz: [3, 4, 5]}) // [1, 2, [3, 4, 5]] +``` + +### TO_LIST() + +`TO_LIST(value) → array` + +This is an alias for [`TO_ARRAY()`](#to_array). + +## Type check functions + +AQL also offers functions to check the data type of a value at runtime. The +following type check functions are available. Each of these functions takes an +argument of any data type and returns true if the value has the type that is +checked for, and false otherwise. + +### IS_NULL() + +`IS_NULL(value) → bool` + +Check whether *value* is *null*. Identical to `value == null`. + +To test if an attribute exists, see [`HAS()`](document-object.md#has) instead. + +- **value** (any): value to test +- returns **bool** (boolean): *true* if *value* is `null`, + *false* otherwise + +### IS_BOOL() + +`IS_BOOL(value) → bool` + +Check whether *value* is a *boolean* value + +- **value** (any): value to test +- returns **bool** (boolean): *true* if *value* is `true` or `false`, + *false* otherwise + +### IS_NUMBER() + +`IS_NUMBER(value) → bool` + +Check whether *value* is a number + +- **value** (any): value to test +- returns **bool** (boolean): *true* if *value* is a number, + *false* otherwise + +### IS_STRING() + +`IS_STRING(value) → bool` + +Check whether *value* is a string + +- **value** (any): value to test +- returns **bool** (boolean): *true* if *value* is a string, + *false* otherwise + +### IS_ARRAY() + +`IS_ARRAY(value) → bool` + +Check whether *value* is an array / list + +- **value** (any): value to test +- returns **bool** (boolean): *true* if *value* is an array / list, + *false* otherwise + +### IS_LIST() + +`IS_LIST(value) → bool` + +This is an alias for [`IS_ARRAY()`](#is_array) + +### IS_OBJECT() + +`IS_OBJECT(value) → bool` + +Check whether *value* is an object / document + +- **value** (any): value to test +- returns **bool** (boolean): *true* if *value* is an object / document, + *false* otherwise + +### IS_DOCUMENT() + +`IS_DOCUMENT(value) → bool` + +This is an alias for [`IS_OBJECT()`](#is_object) + +### IS_DATESTRING() + +`IS_DATESTRING(str) → bool` + +Check whether *value* is a string that can be used in a date function. +This includes partial dates such as *"2015"* or *"2015-10"* and strings +containing properly formatted but invalid dates such as *"2015-02-31"*. + +- **str** (string): date string to test +- returns **bool** (boolean): *true* if *str* is a correctly formatted date string, + *false* otherwise including all non-string values, even if some of them may be usable + in date functions (numeric timestamps) + +### IS_IPV4() + +See [String Functions](string.md#is_ipv4). + +### IS_KEY() + +`IS_KEY(str) → bool` + +Check whether *value* is a string that can be used as a +document key, i.e. as the value of the *_key* attribute. +See [Document keys](../../concepts/data-structure/documents/_index.md#document-keys). + +- **str** (string): document key to test +- returns **bool** (boolean): whether *str* can be used as document key + +### TYPENAME() + +`TYPENAME(value) → typeName` + +Return the data type name of *value*. + +- **value** (any): input of arbitrary type +- returns **typeName** (string): data type name of *value* + (`"null"`, `"bool"`, `"number"`, `"string"`, `"array"` or `"object"`) + +Example Value | Data Type Name +---------------:|--------------- +`null` | `"null"` +`true` | `"bool"` +`false` | `"bool"` +`123` | `"number"` +`-4.56` | `"number"` +`0` | `"number"` +`"foobar"` | `"string"` +`"123"` | `"string"` +`""` | `"string"` +`[ 1, 2, 3 ]` | `"array"` +`["foo",true]` | `"array"` +`[ ]` | `"array"` +`{"foo":"bar"}` | `"object"` +`{"foo": null}` | `"object"` +`{ }` | `"object"` diff --git a/site/content/arangodb/oem/aql/fundamentals/_index.md b/site/content/arangodb/oem/aql/fundamentals/_index.md new file mode 100644 index 0000000000..1d1089e0a4 --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/_index.md @@ -0,0 +1,8 @@ +--- +title: AQL Fundamentals +menuTitle: Fundamentals +weight: 10 +description: >- + Learn about the core aspects of ArangoDB's query language, like the structure + of queries, the available data types, as well as result and error handling +--- diff --git a/site/content/arangodb/oem/aql/fundamentals/accessing-data-from-collections.md b/site/content/arangodb/oem/aql/fundamentals/accessing-data-from-collections.md new file mode 100644 index 0000000000..a757e89208 --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/accessing-data-from-collections.md @@ -0,0 +1,78 @@ +--- +title: Accessing data from collections with AQL +menuTitle: Accessing data from collections +weight: 25 +description: >- + You can access collection data by looping over a collection and reading + document attributes, with non-existing attributes returning a `null` value +--- +A collection can be thought of as an array of documents. To access the documents, +use a [`FOR` operation](../high-level-operations/for.md) to iterate over a +collection using its name, like `FOR doc IN collection ...`. + +Note that when iterating over a collection, the order of documents is undefined. +To establish an explicit and deterministic order for the documents, use a +[`SORT` operation](../high-level-operations/sort.md) in addition. + +Data in collections is stored in documents, which are JSON objects. Each document +potentially has different attributes than other documents. This is true even for +documents of the same collection. + +It is therefore quite normal to encounter documents that do not have some or all +of the attributes that are queried in an AQL query. In this case, the +non-existing attributes in the document are treated as if they would exist +with a value of `null`. This means that comparing a document attribute to +`null` returns `true` if the document has the particular attribute and the +attribute has a value of `null`, or that the document does not have the +particular attribute at all. + +For example, the following query returns all documents from the collection +`users` that have a value of `null` in the attribute `name`, plus all documents +from `users` that do not have the `name` attribute at all: + +```aql +FOR u IN users + FILTER u.name == null + RETURN u +``` + +Furthermore, `null` is less than any other value (excluding `null` itself). That +means documents with non-existing attributes may be included in the result +when comparing attribute values with the less than or less equal operators. + +For example, the following query returns all documents from the collection +`users` that have an attribute `age` with a value less than `39`, but also all +documents from the collection that do not have the attribute `age` at all. + +```aql +FOR u IN users + FILTER u.age < 39 + RETURN u +``` + +This behavior should always be taken into account when writing queries. + +To distinguish between an explicit `null` value and the implicit `null` value +you get if you access a non-existent attribute, you can use the +[`HAS()` function](../functions/document-object.md#has). The following query +only returns documents that have a `name` attribute with a `null` value: + +```aql +FOR u IN users + FILTER u.name == null AND HAS(u, "name") + RETURN u +``` + +To exclude implicit as well as explicit `null` values in a query that uses +`<` or `<=` comparison operators to limit the upper bound, you can add a check +for the lower bound: + +```aql +FOR u IN users + FILTER u.age > null AND u.age < 39 + // or potentially + //FILTER u.age >= 0 AND u.age < 39 + // which can be replaced with + //FILTER RANGE(u.age, 0, 39, true, false) + RETURN u +``` diff --git a/site/content/arangodb/oem/aql/fundamentals/bind-parameters.md b/site/content/arangodb/oem/aql/fundamentals/bind-parameters.md new file mode 100644 index 0000000000..4bb29ea3fb --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/bind-parameters.md @@ -0,0 +1,169 @@ +--- +title: Bind parameters in AQL +menuTitle: Bind Parameters +weight: 15 +description: >- + Bind parameters allow you to separate the query logic from literal values used + in the query and safely use user-provided input for these placeholders +--- +It is good practice to separate the query text from the literal values because +it prevents (malicious) injection of keywords and other collection names into an +existing query. This injection would be dangerous because it may change the +meaning of an existing query. + +Using bind parameters, the meaning of an existing query cannot be changed. +Bind parameters can be used everywhere in a query where literals can be used. +This lets you turn literals into a sort of variables to reuse the same query +with different parameterization. + +## Syntax + +The general syntax for bind parameters is `@name` where `@` signifies that this +is a value bind parameter and *name* is the actual parameter name. It can be +used to substitute values in a query. + +```aql +RETURN @value +``` + +For collections, there is a slightly different syntax `@@coll` where `@@` +signifies that it is a collection bind parameter and *coll* is the parameter +name. + +```aql +FOR doc IN @@coll + RETURN doc +``` + +Keywords and other language constructs cannot be replaced by bind values, such +as `FOR`, `FILTER`, `IN`, `INBOUND` or function calls. + +Bind parameter names must start with any of the letters *a* to *z* (upper or +lower case) or a digit (*0* to *9*), and can be followed by any letter, digit +or the underscore symbol. + +They must not be quoted in the query code: + +```aql +FILTER u.name == "@name" // wrong +FILTER u.name == @name // correct +``` + +```aql +FOR doc IN "@@collection" // wrong +FOR doc IN @@collection // correct +``` + +If you need to do string processing (concatenation, etc.) in the query, you +need to use [string functions](../functions/string.md) to do so: + +```aql +FOR u IN users + FILTER u.id == CONCAT('prefix', @id, 'suffix') && u.name == @name + RETURN u +``` + +## Usage + +### General + +The bind parameter values need to be passed along with the query when it is +executed, but not as part of the query text itself. In the web interface, +there is a pane next to the query editor where the bind parameters can be +entered. For below query, two input fields will show up to enter values for +the parameters `id` and `name`. + +```aql +FOR u IN users + FILTER u.id == @id && u.name == @name + RETURN u +``` + +When using `db._query()` (in arangosh for instance), then an +object of key-value pairs can be passed for the parameters. Such an object +can also be passed to the HTTP API endpoint `_api/cursor`, as attribute +value for the key `bindVars`: + +```json +{ + "query": "FOR u IN users FILTER u.id == @id && u.name == @name RETURN u", + "bindVars": { + "id": 123, + "name": "John Smith" + } +} +``` + +Bind parameters that are declared in the query must also be passed a parameter +value, or the query will fail. Specifying parameters that are not declared in +the query will result in an error too. + +Specific information about parameters binding can also be found in: + +- [AQL with Web Interface](../how-to-invoke-aql/with-the-web-interface.md) +- [AQL with _arangosh_](../how-to-invoke-aql/with-arangosh.md) +- [HTTP interface for AQL queries](../../develop/http-api/queries/aql-queries.md) + +### Nested attributes + +Bind parameters can be used for both, the dot notation as well as the square +bracket notation for sub-attribute access. They can also be chained: + +```aql +LET doc = { foo: { bar: "baz" } } + +RETURN doc.@attr.@subattr +// or +RETURN doc[@attr][@subattr] +``` + +```json +{ + "attr": "foo", + "subattr": "bar" +} +``` + +Both variants in above example return `[ "baz" ]` as query result. + +The whole attribute path, for highly nested data in particular, can also be +specified using the dot notation and a single bind parameter, by passing an +array of strings as parameter value. The elements of the array represent the +attribute keys of the path: + +```aql +LET doc = { a: { b: { c: 1 } } } +RETURN doc.@attr +``` + +```json +{ "attr": [ "a", "b", "c" ] } +``` + +The example query returns `[ 1 ]` as result. Note that `{ "attr": "a.b.c" }` +would return the value of an attribute called `a.b.c`, not the value of +attribute `c` with the parents `a` and `b` as `[ "a", "b", "c" ]` would. + +### Collection bind parameters + +A special type of bind parameter exists for injecting collection names. This +type of bind parameter has a name prefixed with an additional `@` symbol, so +`@@name` in the query. + +```aql +FOR u IN @@collection + FILTER u.active == true + RETURN u +``` + +The second `@` will be part of the bind parameter name, which is important to +remember when specifying the `bindVars` (note the leading `@`): + +```json +{ + "query": "FOR u IN @@collection FILTER u.active == true RETURN u", + "bindVars": { + "@collection": "users" + } +} +``` diff --git a/site/content/arangodb/oem/aql/fundamentals/data-types.md b/site/content/arangodb/oem/aql/fundamentals/data-types.md new file mode 100644 index 0000000000..51719ddb7c --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/data-types.md @@ -0,0 +1,290 @@ +--- +title: Data types in AQL +menuTitle: Data types +weight: 10 +description: >- + AQL supports both _primitive_ data types consisting of exactly one value and + _compound_ data types comprised of multiple values +--- +The following types are available: + +| Data type | Description | +|------------:|-------------| +| **null** | An empty value, also: the absence of a value +| **boolean** | Boolean truth value with possible values *false* and *true* +| **number** | Signed (real) number +| **string** | UTF-8 encoded text value +| **array** / list | Sequence of values, referred to by their positions +| **object** / document | Sequence of values, referred to by their names + +## Primitive types + +### Null value + +A `null` value can be used to represent an empty or absent value. +It is different from a numerical value of zero (`null != 0`) and other +*falsy* values (`false` or a zero-length string `""`). +It is also known as *nil* or *None* in other languages. + +The system may return `null` in the absence of value, for example +if you call a [function](../functions/_index.md) with unsupported values +as arguments or if you try to [access an attribute](accessing-data-from-collections.md) +which does not exist. + +### Boolean data type + +The Boolean data type has two possible values, `true` and `false`. +They represent the two truth values in logic and mathematics. + +### Numeric literals + +Numeric literals can be integers or real values (floating-point numbers). +They can optionally be signed with the `+` or `-` symbols. +A decimal point `.` is used as separator for the optional fractional part. +The scientific notation (*E-notation*) is also supported. + +``` + 1 + +1 + 42 + -1 +-42 + 1.23 +-99.99 + 0.5 + .5 + -4.87e103 + -4.87E103 +``` + +The following notations are invalid and will throw a syntax error: + +``` + 1. +01.23 +00.23 +00 +``` + +All numeric values are treated as 64-bit signed integer or 64-bit +double-precision floating point values internally. The internal floating-point +format used is IEEE 754. + +{{< warning >}} +When exposing any numeric integer values to JavaScript via +[user-defined AQL functions](../user-defined-functions.md), numbers that exceed 32 bit +precision are converted to floating-point values, so large integers can lose +some bits of precision. The same is true when converting AQL numeric results to +JavaScript (e.g. returning them to Foxx). +{{< /warning >}} + +Numeric integer literals can also be expressed as binary +(base 2) or hexadecimal (base 16) number literals. + +- The prefix for binary integer literals is `0b`, e.g. `0b10101110`. +- The prefix for hexadecimal integer literals is `0x`, e.g. `0xabcdef02`. + +Binary and hexadecimal integer literals can only be used for unsigned integers. +The maximum supported value for binary and hexadecimal numeric literals is +2<sup>32</sup> - 1, i.e. `0b11111111111111111111111111111111` (binary) or +`0xffffffff` (hexadecimal). + +### String literals + +String literals must be enclosed in single or double quotes. If the used quote +character is to be used itself within the string literal, it must be escaped +using the backslash symbol. A literal backslash also needs to be escaped with +a backslash. + +```aql +"yikes!" +"don't know" +"this is a \"quoted\" word" +"this is a longer string." +"the path separator on Windows is \\" + +'yikes!' +'don\'t know' +'this is a "quoted" word' +'this is a longer string.' +'the path separator on Windows is \\' +``` + +All string literals must be UTF-8 encoded. It is currently not possible to use +arbitrary binary data if it is not UTF-8 encoded. A workaround to use binary +data is to encode the data using [Base64](https://en.wikipedia.org/wiki/Base64) +or other algorithms on the application +side before storing, and decoding it on application side after retrieval. + +## Compound types + +AQL supports two compound types: + +- **array**: A composition of unnamed values, each accessible + by their positions. Sometimes called *list*. +- **object**: A composition of named values, each accessible + by their names. A *document* is an object at the top level. + +### Arrays / Lists + +The first supported compound type is the array type. Arrays are effectively +sequences of (unnamed / anonymous) values. Individual array elements can be +accessed by their positions. The order of elements in an array is important. + +An *array declaration* starts with a left square bracket `[` and ends with +a right square bracket `]`. The declaration contains zero, one or more +*expression*s, separated from each other with the comma `,` symbol. +Whitespace around elements is ignored in the declaration, thus line breaks, +tab stops and blanks can be used for formatting. + +In the easiest case, an array is empty and thus looks like: + +```json +[ ] +``` + +Array elements can be any legal *expression* values. Nesting of arrays is +supported. + +```json +[ true ] +[ 1, 2, 3 ] +[ -99, "yikes!", [ false, ["no"], [] ], 1 ] +[ [ "fox", "marshal" ] ] +``` + +A trailing comma after the last element is allowed: + +```aql +[ + 1, + 2, + 3, // trailing comma +] +``` + +Individual array values can later be accessed by their positions using the `[]` +accessor: + +```aql +u.friends[0] // access 1st array element +u.friends[-1] // access last array element +``` + +For more details about this array operator, see +[Indexed value access](../operators.md#indexed-value-access). + +### Objects / Documents + +The other supported compound type is the object (or document) type. Objects are a +composition of zero to many attributes. Each attribute is a name/value pair. +Object attributes can be accessed individually by their names. This data type is +also known as dictionary, map, associative array and other names. + +Object declarations start with a left curly bracket `{` and end with a +right curly bracket `}`. An object contains zero to many attribute declarations, +separated from each other with the `,` symbol. Whitespace around elements is ignored +in the declaration, thus line breaks, tab stops and blanks can be used for formatting. + +In the simplest case, an object is empty. Its declaration would then be: + +```json +{ } +``` + +Each attribute in an object is a name/value pair. Name and value of an +attribute are separated using the colon `:` symbol. The name is always a string, +whereas the value can be of any type including sub-objects. + +The attribute name is mandatory - there can't be anonymous values in an object. +It can be specified as a quoted or unquoted string: + +```aql +{ name: … } // unquoted +{ 'name': … } // quoted (apostrophe / "single quote mark") +{ "name": … } // quoted (quotation mark / "double quote mark") +``` + +It must be quoted if it contains whitespace, escape sequences or characters +other than ASCII letters (`a`-`z`, `A`-`Z`), digits (`0`-`9`), +underscores (`_`) and dollar signs (`$`). The first character has to be a +letter, underscore or dollar sign. + +If a [keyword](syntax.md#keywords) is used as an attribute name, +then the attribute name must be quoted: + +```aql +{ return: … } // error, return is a keyword! +{ 'return': … } // quoted string literal (single quote marks) +{ "return": … } // quoted string literal (double quote marks) +{ `return`: … } // quoted name (backticks) +{ ´return´: … } // quoted name (forward ticks) +``` + +A trailing comma after the last element is allowed: + +```aql +{ + "a": 1, + "b": 2, + "c": 3, // trailing comma +} +``` + +Attribute names can be computed using dynamic expressions, too. +To disambiguate regular attribute names from attribute name expressions, +computed attribute names must be enclosed in square brackets `[ … ]`: + +```aql +{ [ CONCAT("test/", "bar") ] : "someValue" } +``` + +There is also shorthand notation for attributes which is handy for +returning existing variables easily: + +```aql +LET name = "Peter" +LET age = 42 +RETURN { name, age } +``` + +The above is the shorthand equivalent for the generic form: + +```aql +LET name = "Peter" +LET age = 42 +RETURN { name: name, age: age } +``` + +Any valid expression can be used as an attribute value. That also means nested +objects can be used as attribute values: + +```aql +{ name : "Peter" } +{ "name" : "Vanessa", "age" : 15 } +{ "name" : "John", likes : [ "Swimming", "Skiing" ], "address" : { "street" : "Cucumber lane", "zip" : "94242" } } +``` + +Individual object attributes can later be accessed by their names using the +dot `.` accessor: + +```aql +u.address.city.name +u.friends[0].name.first +``` + +Attributes can also be accessed using the square bracket `[]` accessor. +In contrast to the dot accessor, the square brackets allow for expressions. +Note that the accessor for array elements also uses square brackets: + +```aql +u["address"]["city"]["name"] +u["friends"][0]["name"]["first"] + +LET attr1 = "friends" +LET attr2 = "name" +u[attr1][0][attr2][ CONCAT("fir", "st") ] +``` + +For more details about these object operators, see +[Attribute access](../operators.md#attribute-access). diff --git a/site/content/arangodb/oem/aql/fundamentals/limitations.md b/site/content/arangodb/oem/aql/fundamentals/limitations.md new file mode 100644 index 0000000000..1eeb785116 --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/limitations.md @@ -0,0 +1,104 @@ +--- +title: Known limitations for AQL queries +menuTitle: Limitations +weight: 45 +description: >- + AQL has restrictions with regards to the complexity of queries and the data + they operate on, as well as design limitations to be aware of +--- +## Complexity limitations + +The following hard-coded limitations exist for AQL queries: + +- An AQL query cannot use more than _1000_ result registers. + One result register is needed for every named query variable and for + internal/anonymous query variables, e.g. for intermediate results. + Subqueries also require result registers. +- An AQL query cannot have more than _4000_ execution nodes in its initial + query execution plan. This number includes all execution nodes of the + initial execution plan, even if some of them could be + optimized away later by the query optimizer during plan optimization. +- An AQL query cannot use more than _2048_ collections/shards. + {{< tip >}} + From version 3.10.7 onward, this limit is configurable via the + `--query.max-collections-per-query` startup option. + {{< /tip >}} +- Expressions in AQL queries cannot have a nesting of more than _500_ levels. + As an example, the expression `1 + 2 + 3 + 4` is 3 levels deep + (because it is interpreted and executed as `1 + (2 + (3 + 4))`). +- When reading any data from JSON or VelocyPack input or when serializing + any data to JSON or VelocyPack, there is a maximum recursion depth for + nested arrays and objects, which is slightly below 200. Arrays or objects + with higher nesting than this cause `Too deep nesting in Array/Object` + exceptions. + +Please note that even queries that are still below these limits may not +yield good performance, especially when they have to put together data from lots +of different collections. Please also consider that large queries (in terms of +intermediate result size or final result size) can use considerable amounts of +memory and may hit the configurable memory limits for AQL queries. + +## Design limitations + +The following design limitations are known for AQL queries: + +- Subqueries that are used inside expressions are pulled out of these + expressions and executed beforehand. That means that subqueries do not + participate in lazy evaluation of operands, for example in the + [ternary operator](../operators.md#ternary-operator). Also see + [evaluation of subqueries](subqueries.md#evaluation-of-subqueries). +- It is not possible to use a collection in a read operation after + it was used for a write operation in the same AQL query. +- In the cluster, all collections that are accessed **dynamically** by + [traversals working with collection sets](../graphs/traversals.md#working-with-collection-sets) + (instead of named graphs) must be stated in the query's initial + [`WITH` statement](../high-level-operations/with.md). To make the `WITH` statement + required in single server as well (e.g. for testing a migration to cluster), + please start the server with the option `--query.require-with`. + +## Storage engine properties + +{{< info >}} +The following restrictions and limitations do not apply to JavaScript Transactions +and Stream Transactions, including AQL queries that run inside such transactions. +Their intended use case is for smaller transactions with full transactional +guarantees. So the following only applies to standalone AQL queries. +{{< /info >}} + +Data of ongoing transactions is stored in RAM. Transactions that get too big +(in terms of number of operations involved or the total size of data created or +modified by the transaction) are committed automatically. Effectively, this +means that big user transactions are split into multiple smaller RocksDB +transactions that are committed individually. The entire user transaction does +not necessarily have ACID properties in this case. + +The following startup options can be used to control the RAM usage and automatic +intermediate commits for the RocksDB engine: + +- `--rocksdb.max-transaction-size` + + Transaction size limit (in bytes). Transactions store all keys and values in + RAM, so large transactions run the risk of causing out-of-memory situations. + This setting allows you to ensure that does not happen by limiting the size of + any individual transaction. Transactions whose operations would consume more + RAM than this threshold value will abort automatically with error 32 ("resource + limit exceeded"). + +- `--rocksdb.intermediate-commit-size` + + If the size of all operations in a transaction reaches this threshold, the transaction + is committed automatically and a new transaction is started. The value is specified in bytes. + +- `--rocksdb.intermediate-commit-count` + + If the number of operations in a transaction reaches this value, the transaction is + committed automatically and a new transaction is started. + +The above values can also be adjusted per query, for example, by setting the +following attributes in the call to `db._query()` in the JavaScript API: + +- `maxTransactionSize`: transaction size limit in bytes +- `intermediateCommitSize`: maximum total size of operations after which an intermediate + commit is performed automatically +- `intermediateCommitCount`: maximum number of operations after which an intermediate + commit is performed automatically diff --git a/site/content/arangodb/oem/aql/fundamentals/query-errors.md b/site/content/arangodb/oem/aql/fundamentals/query-errors.md new file mode 100644 index 0000000000..d1b7f507fa --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/query-errors.md @@ -0,0 +1,41 @@ +--- +title: AQL query errors +menuTitle: Query Errors +weight: 40 +description: >- + Errors can occur for queries at compile time, like for syntax errors and + missing collections, but warnings and errors can also occur during query + execution +--- +Issuing an invalid query to the server results in a parse error if the query +is syntactically invalid. ArangoDB detects such errors during query +inspection and aborts further processing. The error number and an error +message are returned so that you can fix the errors. + +If a query passes the parsing stage, all collections explicitly referenced in +the query are known. If any of these collections doesn't exist, the query execution +is aborted and an appropriate error message is returned. + +Under some circumstances, executing a query may also produce errors or warnings +at runtime. This cannot be predicted from inspecting the query text alone. +This is because query operations can be data-dependent or are only evaluated +during the query execution, like looking up documents dynamically or using +document attributes that not all documents of the collection have. This can +subsequently lead to errors or warnings if these cases are not accounted for. + +Some examples of runtime errors: + +- **Division by zero**: Raised when an attempt is made to use the value + `0` as the divisor in an arithmetic division or modulus operation +- **Invalid operands for arithmetic operations**: Raised when an attempt + is made to use any non-numeric values as operands in arithmetic operations. + This includes unary (unary minus, unary plus) and binary operations (plus, + minus, multiplication, division, and modulus) +- **Array expected in query**: Raised when a non-array operand is used for an + operation that expects an array argument operand. This can happen if you + try to iterate over an attribute with a `FOR` operation, expecting it to be an + array, but if the attribute doesn't exist, then it has a value of `null` which + cannot be looped over. + +See the [Error codes and meanings](../../develop/error-codes.md) +for a complete list of ArangoDB errors. diff --git a/site/content/arangodb/oem/aql/fundamentals/query-results.md b/site/content/arangodb/oem/aql/fundamentals/query-results.md new file mode 100644 index 0000000000..bbee073926 --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/query-results.md @@ -0,0 +1,114 @@ +--- +title: AQL query results +menuTitle: Query Results +weight: 35 +description: >- + The result set of an AQL query is always an array of values, even if it + returns a single element only +--- +AQL queries and also [subqueries](subqueries.md) each produce an array with zero +or more elements. + +An empty array typically means that no (matching) data was found to act upon, or +that a write query didn't specify anything to return. + +```aql +FOR doc IN emptyCollection + RETURN doc // no documents +``` + +``` +FOR u IN users + FILTER age == -1 // no matches + RETURN u +``` + +```aql +UPDATE { id: 2, active: true } IN users +// no RETURN operation +``` + +The result set of the above examples is empty: + +```json +[ ] +``` + +If there is a single result, you get an array with one element back, not the +result value only. + + +```aql +FOR u IN users + LIMIT 1 + RETURN u.name +``` + +```json +[ "John" ] +``` + +If there are multiple results, you get an array with many elements back. + +```aql +FOR u IN users + RETURN u.name +``` + +```json +[ + "John", + "Vanessa", + "Amy" +] +``` + +The individual values in the result array of a query may or may not have a +homogeneous structure, depending on what is actually queried. + +For example, the individual documents of a collection can use different sets of +attribute names. When returning data from a collection with inhomogeneous +documents without modification, the result values have an inhomogeneous structure, +too. Each result value itself is a document: + +```aql +FOR u IN users + RETURN u +``` + +```json +[ + { "id": 1, "name": "John", "active": false }, + { "age": 32, "id": 2, "name": "Vanessa" }, + { "friends": [ "John", "Vanessa" ], "id": 3, "name": "Amy" } +] +``` + +However, if a fixed set of attributes from the collection is queried, then the +query result values have a homogeneous structure. Each result value is +still (a projection of) a document: + +```aql +FOR u IN users + RETURN { "id": u.id, "name": u.name } +``` + +```json +[ + { "id": 1, "name": "John" }, + { "id": 2, "name": "Vanessa" }, + { "id": 3, "name": "Amy" } +] +``` + +It is also possible to query scalar values only. In this case, the result set +is an array of scalars, and each result value is a scalar value: + +```aql +FOR u IN users + RETURN u.id +``` + +```json +[ 1, 2, 3 ] +``` diff --git a/site/content/arangodb/oem/aql/fundamentals/subqueries.md b/site/content/arangodb/oem/aql/fundamentals/subqueries.md new file mode 100644 index 0000000000..2efef66361 --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/subqueries.md @@ -0,0 +1,188 @@ +--- +title: Combining queries with subqueries in AQL +menuTitle: Subqueries +weight: 30 +description: >- + Subqueries let you form complex requests and allow you to process more data in + with a single query +--- +## How to use subqueries + +Wherever an expression is allowed in AQL, a subquery can be placed. A subquery +is a query part that can introduce its own local variables without affecting +variables and values in its outer scope(s). + +It is required that subqueries be put inside parentheses `(` and `)` to +explicitly mark their start and end points: + +```aql +FOR p IN persons + LET recommendations = ( // subquery start + FOR r IN recommendations + FILTER p.id == r.personId + SORT p.rank DESC + LIMIT 10 + RETURN r + ) // subquery end + RETURN { person : p, recommendations : recommendations } +``` + +A subquery's result can be assigned to a variable with +[`LET`](../high-level-operations/let.md) as shown above, so that it can be referenced +multiple times or just to improve the query readability. + +Function calls also use parentheses and AQL allows you to omit an extra pair if +you want to use a subquery as sole argument for a function, e.g. +`MAX(<subquery>)` instead of `MAX((<subquery>))`: + +```aql +FOR p IN persons + COLLECT city = p.city INTO g + RETURN { + city : city, + numPersons : LENGTH(g), + maxRating: MAX( // subquery start + FOR r IN g + RETURN r.p.rating + ) // subquery end + } +``` + +The extra wrapping is required if there is more than one function argument, +however, e.g. `NOT_NULL((RETURN "ok"), "fallback")`. + +Subqueries may also include other subqueries. + +## Subquery results and unwinding + +Subqueries always return a result **array**, even if there is only +a single return value: + +```aql +RETURN ( RETURN 1 ) +``` + +```json +[ [ 1 ] ] +``` + +To avoid such a nested data structure, [`FIRST()`](../functions/array.md#first) +can be used for example: + +```aql +RETURN FIRST( RETURN 1 ) +``` + +```json +[ 1 ] +``` + +To unwind the result array of a subquery so that each element is returned as +top-level element in the overall query result, you can use a `FOR` loop: + +```aql +FOR elem IN (RETURN 1..3) // [1,2,3] + RETURN elem +``` + +```json +[ + 1, + 2, + 3 +] +``` + +Without unwinding, the query would be `RETURN (RETURN 1..3)` and the result +a nested array `[ [ 1, 2, 3 ] ]` with a single top-level element. + +## Evaluation of subqueries + +Subqueries that are used inside expressions are pulled out of these +expressions and executed beforehand. That means that subqueries do not +participate in lazy evaluation of operands, for example in the +[ternary operator](../operators.md#ternary-operator). + +Consider the following query: + +```aql +RETURN RAND() > 0.5 ? (RETURN 1) : 0 +``` + +It get transformed into something more like this, with the calculation of the +subquery happening before the evaluation of the condition: + +```aql +LET temp1 = (RETURN 1) +LET temp2 = RAND() > 0.5 ? temp1 : 0 +RETURN temp2 +``` + +The subquery is executed regardless of the condition. In other words, there is +no short-circuiting that would avoid the subquery from running in the case that +the condition evaluates to `false`. You may need to take this into account to +avoid query errors like + +> Query: AQL: collection or array expected as operand to FOR loop; you provided +> a value of type 'null' (while executing) + +```aql +LET maybe = DOCUMENT("coll/does_not_exist") +LET dependent = maybe ? ( + FOR attr IN ATTRIBUTES(maybe) + RETURN attr +) : "document not found" +RETURN dependent +``` + +The problem is that the subquery is executed under all circumstances, despite +the check whether `DOCUMENT()` found a document or not. It does not take into +account that `maybe` can be `null`, which cannot be iterated over with `FOR`. +A possible solution is to fall back to an empty array in the subquery to +effectively prevent the loop body from being run: + +```aql +LET maybe = DOCUMENT("coll/does_not_exist") +LET dependent = maybe ? ( + FOR attr IN NOT_NULL(ATTRIBUTES(maybe || {}), []) + RETURN attr +) : "document not found" +RETURN dependent +``` + +The additional fallback `maybe || {}` prevents a query warning + +> invalid argument type in call to function 'ATTRIBUTES()' + +that originates from a `null` value getting passed to the `ATTRIBUTES()` +function that expects an object. + +Similarly, when you use subqueries as sub-expressions that are combined with +logical `AND` or `OR`, the subqueries are always executed: + +```aql +RETURN false AND (RETURN ASSERT(false, "executed")) +``` + +```aql +RETURN true OR (RETURN ASSERT(false, "executed")) +``` + +If the first operand of a logical `AND` is `false`, the overall result is +`false` regardless of the second operand. If the first operand of a logical `OR` +is `true`, the overall result is `true` regardless of the second operand. +However, the subqueries are run nonetheless, causing both example queries to fail. + +You can prevent the subqueries from executing by prepending a `FILTER` operation +with the value of the logical operator's first operand and negating it in case +of an `OR`: + +```aql +LET cond = false +RETURN cond AND (FILTER cond RETURN ASSERT(false, "executed")) +``` + +```aql +LET cond = true +RETURN cond OR (FILTER !cond RETURN ASSERT(false, "executed")) +``` diff --git a/site/content/arangodb/oem/aql/fundamentals/syntax.md b/site/content/arangodb/oem/aql/fundamentals/syntax.md new file mode 100644 index 0000000000..dd2177a519 --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/syntax.md @@ -0,0 +1,347 @@ +--- +title: AQL Syntax +menuTitle: Syntax +weight: 5 +description: >- + Query types, whitespace, comments, keywords, and names in the AQL language + explained +--- +## Query types + +An AQL query must either return a result (indicated by usage of the `RETURN` +keyword) or execute a data-modification operation (indicated by usage +of one of the keywords `INSERT`, `UPDATE`, `REPLACE`, `REMOVE` or `UPSERT`). The AQL +parser will return an error if it detects more than one data-modification +operation in the same query or if it cannot figure out if the query is meant +to be a data retrieval or a modification operation. + +AQL only allows **one** query in a single query string; thus semicolons to +indicate the end of one query and separate multiple queries (as seen in SQL) are +not allowed. + +## Whitespace + +Whitespace (blanks, carriage returns, line feeds, and tab stops) can be used +in the query text to increase its readability. Tokens have to be separated by +any number of whitespace. Whitespace within strings or names must be enclosed +in quotes in order to be preserved. + +## Comments + +Comments can be embedded at any position in a query. The text contained in the +comment is ignored by the AQL parser. + +Multi-line comments cannot be nested, which means subsequent comment starts within +comments are ignored, comment ends will end the comment. + +AQL supports two types of comments: + +- Single line comments: These start with a double forward slash and end at + the end of the line, or the end of the query string (whichever is first). +- Multi line comments: These start with a forward slash and asterisk, and + end with an asterisk and a following forward slash. They can span as many + lines as necessary. + +```aql +/* this is a comment */ RETURN 1 +/* these */ RETURN /* are */ 1 /* multiple */ + /* comments */ 1 +/* this is + a multi line + comment */ +// a single line comment +``` + +## Keywords + +On the top level, AQL offers the following +[high-level operations](../high-level-operations/_index.md): + +| Operation | Description +|:----------|:----------- +| `FOR` | Array iteration +| `RETURN` | Results projection +| `FILTER` | Non-View results filtering +| `SEARCH` | View results filtering +| `SORT` | Result sorting +| `LIMIT` | Result slicing +| `LET` | Variable assignment +| `COLLECT` | Result grouping +| `WINDOW` | Aggregations over related rows +| `INSERT` | Insertion of new documents +| `UPDATE` | (Partial) update of existing documents +| `REPLACE` | Replacement of existing documents +| `REMOVE` | Removal of existing documents +| `UPSERT` | Insertion of new or update of existing documents +| `WITH` | Collection declaration + +Each of the above operations can be initiated in a query by using a keyword of +the same name. An AQL query can (and typically does) consist of multiple of the +above operations. + +An example AQL query may look like this: + +```aql +FOR u IN users + FILTER u.type == "newbie" && u.active == true + RETURN u.name +``` + +In this example query, the terms `FOR`, `FILTER`, and `RETURN` initiate the +higher-level operation according to their name. These terms are also keywords, +meaning that they have a special meaning in the language. + +For example, the query parser will use the keywords to find out which high-level +operations to execute. That also means keywords can only be used at certain +locations in a query. This also makes all keywords **reserved words** that must +not be used for other purposes than they are intended for. + +For example, it is not possible to use a keyword as literal unquoted string +(identifier) for a collection or attribute name. If a collection or attribute +needs to have the same name as a keyword, then the collection or attribute name +needs to be quoted in the query (also see [Names](#names)). + +Keywords are case-insensitive, meaning they can be specified in lower, upper, or +mixed case in queries. In this documentation, all keywords are written in upper +case to make them distinguishable from other query parts. + +There are a few more keywords in addition to the higher-level operation keywords. +Additional keywords may be added in future versions of ArangoDB. +The complete list of keywords is currently: + +- `AGGREGATE` +- `ALL` +- `ALL_SHORTEST_PATHS` +- `AND` +- `ANY` +- `ASC` +- `COLLECT` +- `DESC` +- `DISTINCT` +- `FALSE` +- `FILTER` +- `FOR` +- `GRAPH` +- `IN` +- `INBOUND` +- `INSERT` +- `INTO` +- `K_PATHS` +- `K_SHORTEST_PATHS` +- `LET` +- `LIKE` +- `LIMIT` +- `NONE` +- `NOT` +- `NULL` +- `OR` +- `OUTBOUND` +- `REMOVE` +- `REPLACE` +- `RETURN` +- `SHORTEST_PATH` +- `SORT` +- `TRUE` +- `UPDATE` +- `UPSERT` +- `WINDOW` +- `WITH` +{.columns-3} + +On top of that, there are a few words used in language constructs which are not +reserved keywords. You can use them as collection or attribute names +without having to quote them. The query parser can identify them as keyword-like +based on the context: + +- `KEEP` – + [COLLECT](../high-level-operations/collect.md#discarding-obsolete-variables) + operation variant +- `COUNT` – + [COLLECT](../high-level-operations/collect.md#group-length-calculation) + operation variant (`WITH COUNT INTO`) +- `OPTIONS` – + [FOR](../high-level-operations/for.md#options) / + [SEARCH](../high-level-operations/search.md#search-options) / + [COLLECT](../high-level-operations/collect.md#collect-options) / + [INSERT](../high-level-operations/insert.md#query-options) / + [UPDATE](../high-level-operations/update.md#query-options) / + [REPLACE](../high-level-operations/replace.md#query-options) / + [UPSERT](../high-level-operations/upsert.md#query-options) / + [REMOVE](../high-level-operations/remove.md#query-options) operation / + [Graph Traversal](../graphs/traversals.md) / + [Shortest Path](../graphs/shortest-path.md#path-search-options) / + [k Shortest Paths](../graphs/k-shortest-paths.md#path-search-options) / +- `PRUNE` – + [Graph Traversal](../graphs/traversals.md#pruning) (`FOR` operation variant) +- `SEARCH` – + [SEARCH](../high-level-operations/search.md) operation +- `TO` – + [Shortest Path](../graphs/shortest-path.md) / + [All Shortest Paths](../graphs/all-shortest-paths.md) / + [k Shortest Paths](../graphs/k-shortest-paths.md) / + [k Paths](../graphs/k-paths.md) + +Last but not least, there are special variables which are available in certain +contexts. Unlike keywords, they are **case-sensitive**: + +- `CURRENT` – + available in + [array inline expressions](../operators.md#inline-expressions) and the + [question mark operator](../operators.md#question-mark-operator) +- `NEW` – + available after + [INSERT](../high-level-operations/insert.md#returning-the-inserted-documents) / + [UPDATE](../high-level-operations/update.md#returning-the-modified-documents) / + [REPLACE](../high-level-operations/replace.md#returning-the-modified-documents) / + [UPSERT](../high-level-operations/upsert.md#returning-documents) + operation +- `OLD` – + available after + [UPDATE](../high-level-operations/update.md#returning-the-modified-documents) / + [REPLACE](../high-level-operations/replace.md#returning-the-modified-documents) / + [UPSERT](../high-level-operations/upsert.md#returning-documents) / + [REMOVE](../high-level-operations/remove.md#returning-the-removed-documents) + operation + +If you define a variable with the same name in the same scope, then its value +will be and remain at what you set it to. Hence you need to avoid these names +for your own variables if you want to access the special variable values. + +## Names + +In general, names are used to identify the following things in AQL queries: +- collections +- attributes +- variables +- functions + +Names in AQL are always case-sensitive. +The maximum supported length for collection/View names is 256 bytes. +Variable names can be longer, but are discouraged. + +Keywords should not be used as names. If you want to use a reserved keyword as +name anyway, the name must be enclosed in backticks or forward ticks. This is referred to as _quoting_. + +```aql +FOR doc IN `filter` + RETURN doc.`sort` +``` + +Due to the backticks, `filter` and `sort` are interpreted as names and not as +keywords here. + +You can also use forward ticks: + +```aql +FOR f IN ´filter´ + RETURN f.´sort´ +``` + +Instead of ticks, you may use the bracket notation for the attribute access: + +```aql +FOR f IN `filter` + RETURN f["sort"] +``` + +`sort` is a string literal in quote marks in this alternative and does thus not +conflict with the reserved keyword. + +Quoting with ticks is also required if certain characters such as +hyphen minus (`-`) are contained in a name, namely if they are used for +[operators](../operators.md) in AQL: + +```aql +LET `my-var` = 42 +``` + +### Collection names + +You can typically use collection names in queries as they are. If a collection +happens to have the same name as a keyword, the name must be enclosed in +backticks or forward ticks. + +Quoting with ticks is also required if special characters such as +hyphen minus (`-`) are contained in a collection name: + +```aql +FOR doc IN `my-coll` + RETURN doc +``` + +The collection `my-coll` has a dash in its name, but `-` is an arithmetic +operator for subtraction in AQL. The backticks quote the collection name to +refer to the collection correctly. + +If you use extended collection and View names +([`--database.extended-names` startup option](../../components/arangodb-server/options.md#--databaseextended-names)), +they may contain spaces, or non-ASCII characters such as Japanese or Arabic +letters, emojis, letters with accentuation, and other UTF-8 characters. +Quoting is required in these cases, too: + +```aql +FOR doc IN ´🥑~колекція =)´ + RETURN doc +``` + +The collection name contains characters that are allowed using the extended +naming constraints and is quoted with forward ticks. + +Note that quoting the name with `"` or `'` is not possible for collections as +they cannot be string literals in quote marks. + +For information about the naming constraints for collections, see +[Collection names](../../concepts/data-structure/collections.md#collection-names). + +### Attribute names + +When referring to attributes of documents from a collection, the fully qualified +attribute name must be used. This is because multiple collections with ambiguous +attribute names may be used in a query. To avoid any ambiguity, it is not +allowed to refer to an unqualified attribute name. + +Also see the naming restrictions for +[Attribute names](../../concepts/data-structure/documents/_index.md#attribute-names). + +```aql +FOR u IN users + FOR f IN friends + FILTER u.active == true && f.active == true && u.id == f.userId + RETURN u.name +``` + +In the above example, the attribute names `active`, `name`, `id`, and `userId` +are qualified using the collection names they belong to (`u` and `f` +respectively). + +### Variable names + +AQL allows you to assign values to additional variables in a query. +All variables that are assigned a value must have a name that is unique within +the context of the query. + +```aql +FOR u IN users + LET friends = u.friends + RETURN { "name" : u.name, "friends" : friends } +``` + +In the above query, `users` is a collection name, and both `u` and `friends` are +variable names. This is because the `FOR` and `LET` operations need target +variables to store their intermediate results. + +Variable names should be different from the names of any collection name used in +the same query to avoid shadowing, which can render a collection with the same +name inaccessible in the query after the variable assignment: + +```aql +LET users = [] +FOR u IN users // iterates over the "users" variable, not the "users" collection + RETURN u +``` + +Allowed characters in variable names are the letters `a` to `z` (both in lower +and upper case), the numbers `0` to `9`, the underscore (`_`) symbol and the +dollar (`$`) sign. A variable name must not start with a number. If a variable +name starts with one or multiple underscore characters, the underscore(s) must +be followed by least one letter (a-z or A-Z). The dollar sign can only be used +as the very first character in a variable name and must be followed by a letter. diff --git a/site/content/arangodb/oem/aql/fundamentals/type-and-value-order.md b/site/content/arangodb/oem/aql/fundamentals/type-and-value-order.md new file mode 100644 index 0000000000..bfe5a3baee --- /dev/null +++ b/site/content/arangodb/oem/aql/fundamentals/type-and-value-order.md @@ -0,0 +1,137 @@ +--- +title: Type and value order in AQL +menuTitle: Type and value order +weight: 20 +description: >- + AQL uses a set of rules for equality checks and comparisons that takes both + the data types and the actual values into account +--- +When checking for equality or inequality, or when determining the sort order of +values, AQL uses a deterministic algorithm for the comparison. + +The compared operands are first compared by their data types, and only by their +data values if the operands have the same data types. + +The following type order is used when comparing data types: + +``` +null < bool < number < string < array (or list) < object (or document) +``` + +This means `null` is the smallest type in AQL and *object* is the type with +the highest order. If the compared operands have a different type, then the +comparison result is determined and the comparison is finished. + +For example, the boolean `true` value is always less than any numeric or +string value, any array (even an empty array), and any object. Additionally, any +string value (even an empty string) is always greater than any numeric +value and a boolean value (`true` and `false`). + +```aql +null < false +null < true +null < 0 +null < '' +null < ' ' +null < '0' +null < 'abc' +null < [ ] +null < { } + +false < true +false < 0 +false < '' +false < ' ' +false < '0' +false < 'abc' +false < [ ] +false < { } + +true < 0 +true < '' +true < ' ' +true < '0' +true < 'abc' +true < [ ] +true < { } + +0 < '' +0 < ' ' +0 < '0' +0 < 'abc' +0 < [ ] +0 < { } + +'' < ' ' +'' < '0' +'' < 'abc' +'' < [ ] +'' < { } + +[ ] < { } +``` + +If the two compared operands have the same data types, then the operands values +are compared. For the primitive types (null, boolean, number, and string), the +result is defined as follows: + +- **null**: `null` is equal to `null` +- **boolean**: `false` is less than `true` +- **number**: numeric values are ordered by their cardinal value +- **string**: string values are ordered using a localized comparison, using the configured + [server language](../../components/arangodb-server/options.md#--default-language) + for sorting according to the alphabetical order rules of that language + +Note: unlike in SQL, `null` can be compared to any value, including `null` +itself, without the result being converted into `null` automatically. + +For compound types (array and object), the following special rules are applied: + +Two **array** values are compared by comparing their individual elements position by +position, starting at the first element. For each position, the element types +are compared first. If the types are not equal, the comparison result is +determined, and the comparison is finished. If the types are equal, then the +values of the two elements are compared. If one of the arrays is finished and +the other array still has an element at a compared position, then `null` is +used as the element value of the fully traversed array. + +If an array element is itself a compound value (an array or an object), then the +comparison algorithm checks the element's sub-values recursively. The element's +sub-elements are compared recursively. + +```aql +[ ] < [ 0 ] +[ 1 ] < [ 2 ] +[ 1, 2 ] < [ 2 ] +[ 99, 99 ] < [ 100 ] +[ false ] < [ true ] +[ false, 1 ] < [ false, '' ] +``` + +Two **object** operands are compared by checking attribute names and value. The +attribute names are compared first. Before attribute names are compared, a +combined array of all attribute names from both operands is created and sorted +lexicographically. This means that the order in which attributes are declared +in an object is not relevant when comparing two objects. + +The combined and sorted array of attribute names is then traversed, and the +respective attributes from the two compared operands are then looked up. If one +of the objects does not have an attribute with the sought name, its attribute +value is considered to be `null`. Finally, the attribute value of both +objects is compared using the aforementioned data type and value comparison. +The comparisons are performed for all object attributes until there is an +unambiguous comparison result. If an unambiguous comparison result is found, the +comparison is finished. If there is no unambiguous comparison result, the two +compared objects are considered equal. + +```aql +{ } == { "a" : null } + +{ } < { "a" : 1 } +{ "a" : 1 } < { "a" : 2 } +{ "b" : 1 } < { "a" : 0 } +{ "a" : { "c" : true } } < { "a" : { "c" : 0 } } +{ "a" : { "c" : true, "a" : 0 } } < { "a" : { "c" : false, "a" : 1 } } + +{ "a" : 1, "b" : 2 } == { "b" : 2, "a" : 1 } +``` diff --git a/site/content/arangodb/oem/aql/graphs/_index.md b/site/content/arangodb/oem/aql/graphs/_index.md new file mode 100644 index 0000000000..ef7d7d79e1 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/_index.md @@ -0,0 +1,47 @@ +--- +title: Graphs in AQL +menuTitle: Graphs +weight: 35 +description: >- + You can perform graph traversals and path searches on named graphs as well as + collection sets with AQL +--- +There are multiple ways to work with [graphs in ArangoDB](../../graphs/_index.md), +as well as different ways to query your graphs using AQL. + +The two options in managing graphs are to either use + +- named graphs where ArangoDB manages the collections involved in one graph, or +- graph functions on a combination of document and edge collections. + +Named graphs can be defined through the [graph-module](../../graphs/general-graphs/_index.md) +or via the [web interface](../../components/web-interface/_index.md). +The definition contains the name of the graph, and the vertex and edge collections +involved. Since the management functions are layered on top of simple sets of +document and edge collections, you can also use regular AQL functions to work with them. + +Both variants (named graphs and loosely coupled collection sets a.k.a. anonymous graphs) +are supported by the AQL language constructs for graph querying. These constructs +make full use of optimizations and therefore best performance is to be expected: + +- [AQL Traversals](traversals.md) to follow edges connected to a start vertex, + up to a variable depth. It can be combined with AQL filter conditions. + +- [AQL Shortest Path](shortest-path.md) to find one shortest path + between two given documents. + +- [AQL All Shortest Paths](all-shortest-paths.md) to find all shortest + paths between two given documents. + +- [AQL k Shortest Paths](k-shortest-paths.md) to find the first *k* + paths in order of length (or weight) between two given documents. + +- [AQL k Paths](k-paths.md) to find all paths between two given documents. + +These types of queries are only useful if you use edge collections and/or graphs in +your data model. + +{{< info >}} +New to graphs? [Take our free graph course for freshers](https://www.arangodb.com/arangodb-graph-course/) +and get from zero knowledge to advanced query techniques. +{{< /info >}} diff --git a/site/content/arangodb/oem/aql/graphs/all-shortest-paths.md b/site/content/arangodb/oem/aql/graphs/all-shortest-paths.md new file mode 100644 index 0000000000..571a6857d3 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/all-shortest-paths.md @@ -0,0 +1,197 @@ +--- +title: All Shortest Paths in AQL +menuTitle: All Shortest Paths +weight: 20 +description: >- + Find all paths of shortest length between two vertices +--- +## General query idea + +This type of query finds all paths of shortest length between two given +documents (*startVertex* and *targetVertex*) in your graph. + +Every returned path is a JSON object with two attributes: + +- An array containing the `vertices` on the path. +- An array containing the `edges` on the path. + +**Example** + +A visual representation of the example graph: + +![Train Connection Map](../../../../images/train_map.png) + +Each ellipse stands for a train station with the name of the city written inside +of it. They are the vertices of the graph. Arrows represent train connections +between cities and are the edges of the graph. + +Assuming that you want to go from **Carlisle** to **London** by train, the +expected two shortest paths are: + +1. Carlisle – Birmingham – London +2. Carlisle – York – London + +Another path that connects Carlisle and London is +Carlisle – Glasgow – Edinburgh – York – London, but it has two more stops and +is therefore not a path of the shortest length. + +## Syntax + +The syntax for All Shortest Paths queries is similar to the one for +[Shortest Path](shortest-path.md) and there are also two options to +either use a named graph or a set of edge collections. It only emits a path +variable however, whereas `SHORTEST_PATH` emits a vertex and an edge variable. + +### Working with named graphs + +```aql +FOR path + IN OUTBOUND|INBOUND|ANY ALL_SHORTEST_PATHS + startVertex TO targetVertex + GRAPH graphName +``` + +- `FOR`: Emits the variable **path** which contains one shortest path as an + object, with the `vertices` and `edges` of the path. +- `IN` `OUTBOUND|INBOUND|ANY`: Defines in which direction + edges are followed (outgoing, incoming, or both) +- `ALL_SHORTEST_PATHS`: The keyword to compute All Shortest Paths +- **startVertex** `TO` **targetVertex** (both string\|object): The two vertices between + which the paths are computed. This can be specified in the form of + a ID string or in the form of a document with the attribute `_id`. All other + values result in a warning and an empty result. If one of the specified + documents does not exist, the result is empty as well and there is no warning. +- `GRAPH` **graphName** (string): The name identifying the named graph. Its vertex and + edge collections are looked up for the path search. + +{{< info >}} +All Shortest Paths traversals do not support edge weights. +{{< /info >}} + +### Working with collection sets + +```aql +FOR path + IN OUTBOUND|INBOUND|ANY ALL_SHORTEST_PATHS + startVertex TO targetVertex + edgeCollection1, ..., edgeCollectionN +``` + +Instead of `GRAPH graphName` you can specify a list of edge collections. +The involved vertex collections are determined by the edges of the given +edge collections. + +### Traversing in mixed directions + +For All Shortest Paths with a list of edge collections, you can optionally specify the +direction for some of the edge collections. Say, for example, you have three edge +collections *edges1*, *edges2* and *edges3*, where in *edges2* the direction +has no relevance, but in *edges1* and *edges3* the direction should be taken into +account. In this case you can use `OUTBOUND` as a general search direction and `ANY` +specifically for *edges2* as follows: + +```aql +FOR path IN OUTBOUND ALL_SHORTEST_PATHS + startVertex TO targetVertex + edges1, ANY edges2, edges3 +``` + +All collections in the list that do not specify their own direction use the +direction defined after `IN` (here: `OUTBOUND`). This allows using a different +direction for each collection in your path search. + +## Examples + +Load an example graph to get a named graph that reflects some possible +train connections in Europe and North America: + +![Train Connection Map](../../../../images/train_map.png) + +```js +--- +name: GRAPHASP_01_create_graph +description: '' +--- +~addIgnoreCollection("places"); +~addIgnoreCollection("connections"); +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("kShortestPathsGraph"); +db.places.toArray(); +db.connections.toArray(); +``` + +Suppose you want to query a route from **Carlisle** to **London**, and +compare the outputs of `SHORTEST_PATH`, `K_SHORTEST_PATHS` and `ALL_SHORTEST_PATHS`. +Note that `SHORTEST_PATH` returns any of the shortest paths, whereas +`ALL_SHORTEST_PATHS` returns all of them. `K_SHORTEST_PATHS` returns the +shortest paths first but continues with longer paths, until it found all routes +or reaches the defined limit (the number of paths). + +Using `SHORTEST_PATH` to get one shortest path: + +```aql +--- +name: GRAPHASP_01_Carlisle_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e IN OUTBOUND SHORTEST_PATH 'places/Carlisle' TO 'places/London' +GRAPH 'kShortestPathsGraph' + RETURN { place: v.label } +``` + +Using `ALL_SHORTEST_PATHS` to get both shortest paths: + +```aql +--- +name: GRAPHASP_02_Carlisle_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND ALL_SHORTEST_PATHS 'places/Carlisle' TO 'places/London' +GRAPH 'kShortestPathsGraph' + RETURN { places: p.vertices[*].label } +``` + +Using `K_SHORTEST_PATHS` without a limit to get all paths in order of +increasing length: + +```aql +--- +name: GRAPHASP_03_Carlisle_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND K_SHORTEST_PATHS 'places/Carlisle' TO 'places/London' +GRAPH 'kShortestPathsGraph' + RETURN { places: p.vertices[*].label } +``` + +If you ask for routes that don't exist, you get an empty result +(from **Carlisle** to **Toronto**): + +```aql +--- +name: GRAPHASP_04_Carlisle_to_Toronto +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND ALL_SHORTEST_PATHS 'places/Carlisle' TO 'places/Toronto' +GRAPH 'kShortestPathsGraph' + RETURN { + places: p.vertices[*].label + } +``` + +And finally clean up by removing the named graph: + +```js +--- +name: GRAPHASP_99_drop_graph +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +examples.dropGraph("kShortestPathsGraph"); +~removeIgnoreCollection("places"); +~removeIgnoreCollection("connections"); +``` diff --git a/site/content/arangodb/oem/aql/graphs/k-paths.md b/site/content/arangodb/oem/aql/graphs/k-paths.md new file mode 100644 index 0000000000..e4da13c5e3 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/k-paths.md @@ -0,0 +1,232 @@ +--- +title: k Paths in AQL +menuTitle: k Paths +weight: 30 +description: >- + Find all paths between two vertices with a fixed range of path lengths +--- +## General query idea + +This type of query finds all paths between two given documents +(*startVertex* and *targetVertex*) in your graph. The paths are restricted +by a minimum and maximum length that you specify. + +Every such path is returned as a JSON object with two components: + +- an array containing the `vertices` on the path +- an array containing the `edges` on the path + +**Example** + +Here is an example graph to explain how the k Paths algorithm works: + +![Train Connection Map](../../../../images/train_map.png) + +Each ellipse stands for a train station with the name of the city written inside +of it. They are the vertices of the graph. Arrows represent train connections +between cities and are the edges of the graph. The numbers near the arrows +describe how long it takes to get from one station to another. They are used +as edge weights. + +Assume that you want to go from **Aberdeen** to **London** by train. + +You have a couple of alternatives: + +a) Straight way + + 1. Aberdeen + 2. Leuchars + 3. Edinburgh + 4. York + 5. London + +b) Detour at York + + 1. Aberdeen + 2. Leuchars + 3. Edinburgh + 4. York + 5. **Carlisle** + 6. **Birmingham** + 7. London + +c) Detour at Edinburgh + + 1. Aberdeen + 2. Leuchars + 3. Edinburgh + 4. **Glasgow** + 5. **Carlisle** + 6. **Birmingham** + 7. London + +d) Detour at Edinburgh to York + + 1. Aberdeen + 2. Leuchars + 3. Edinburgh + 4. **Glasgow** + 5. **Carlisle** + 6. York + 7. London + +Note that only paths that do not contain the same vertex twice are consider to +be valid. The following alternative would visit Aberdeen twice and is **not** +returned by the k Paths algorithm: + +1. Aberdeen +2. **Inverness** +3. **Aberdeen** +4. Leuchars +5. Edinburgh +6. York +7. London + +## Example Use Cases + +The use-cases for k Paths are about the same as for unweighted k Shortest Paths. +The main difference is that k Shortest Paths enumerates all paths with +**increasing length**. It stops as soon as a given number of paths is reached. +k Paths enumerates all paths within a given **range of path lengths** instead, +and is thereby upper-bounded. + +The k Paths traversal can be used as foundation for several other algorithms: + +- **Transportation** of any kind (e.g. road traffic, network package routing) +- **Flow problems**: You need to transfer items from A to B, which alternatives + do you have? What is their capacity? + +## Syntax + +The syntax for k Paths queries is similar to the one for +[K Shortest Path](k-shortest-paths.md) with the addition to define the +minimum and maximum length of the path. + +{{< warning >}} +It is highly recommended that you use a reasonable maximum path length or a +**LIMIT** statement, as k Paths is a potentially expensive operation. It can +return a large number of paths for large connected graphs. +{{< /warning >}} + +### Working with named graphs + +```aql +FOR path + IN MIN..MAX OUTBOUND|INBOUND|ANY K_PATHS + startVertex TO targetVertex + GRAPH graphName +``` + +- `FOR`: Emits the variable **path** which contains one path as an object + containing `vertices` and `edges` of the path. +- `IN` `MIN..MAX`: The minimal and maximal depth for the traversal: + - **min** (number, *optional*): Paths returned by this query + have at least a length of this many edges. + If not specified, it defaults to `1`. The minimal possible value is `0`. + - **max** (number, *optional*): Paths returned by this query + have at most a length of this many edges. + If omitted, it defaults to the value of `min`. Thus, only the vertices and + edges in the range of `min` are returned. You cannot specify `max` without `min`. +- `OUTBOUND|INBOUND|ANY`: Defines in which direction + edges are followed (outgoing, incoming, or both). +- `K_PATHS`: The keyword to compute all paths with the specified lengths. +- **startVertex** `TO` **targetVertex** (both string\|object): The two vertices + between which the paths are computed. This can be specified in the form of + a document identifier string or in the form of an object with the `_id` + attribute. All other values lead to a warning and an empty result. This is + also the case if one of the specified documents does not exist. +- `GRAPH` **graphName** (string): The name identifying the named graph. + Its vertex and edge collections are looked up for the path search. + +### Working with collection sets + +```aql +FOR path + IN MIN..MAX OUTBOUND|INBOUND|ANY K_PATHS + startVertex TO targetVertex + edgeCollection1, ..., edgeCollectionN + [OPTIONS options] +``` + +Instead of `GRAPH graphName` you can specify a list of edge collections. +The involved vertex collections are determined by the edges of the given +edge collections. + +### Traversing in mixed directions + +For k paths with a list of edge collections you can optionally specify the +direction for some of the edge collections. Say for example you have three edge +collections *edges1*, *edges2* and *edges3*, where in *edges2* the direction +has no relevance, but in *edges1* and *edges3* the direction should be taken +into account. In this case you can use `OUTBOUND` as general search direction +and `ANY` specifically for *edges2* as follows: + +```aql +FOR vertex IN OUTBOUND K_PATHS + startVertex TO targetVertex + edges1, ANY edges2, edges3 +``` + +All collections in the list that do not specify their own direction use the +direction defined after `IN` (here: `OUTBOUND`). This allows to use a different +direction for each collection in your path search. + +## Examples + +You can load the `kShortestPathsGraph` example graph to get a named graph that +reflects some possible train connections in Europe and North America. + +![Train Connection Map](../../../../images/train_map.png) + +```js +--- +name: GRAPHKP_01_create_graph +description: '' +--- +~addIgnoreCollection("places"); +~addIgnoreCollection("connections"); +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("kShortestPathsGraph"); +db.places.toArray(); +db.connections.toArray(); +``` + +Suppose you want to query all routes from **Aberdeen** to **London**. + +```aql +--- +name: GRAPHKP_01_Aberdeen_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN 1..10 OUTBOUND K_PATHS 'places/Aberdeen' TO 'places/London' +GRAPH 'kShortestPathsGraph' + RETURN { places: p.vertices[*].label, travelTimes: p.edges[*].travelTime } +``` + +If you ask for routes that don't exist, you get an empty result +(from **Aberdeen** to **Toronto**): + +```aql +--- +name: GRAPHKP_02_Aberdeen_to_Toronto +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN 1..10 OUTBOUND K_PATHS 'places/Aberdeen' TO 'places/Toronto' +GRAPH 'kShortestPathsGraph' + RETURN { places: p.vertices[*].label, travelTimes: p.edges[*].travelTime } +``` + +And finally clean up by removing the named graph: + +```js +--- +name: GRAPHKP_99_drop_graph +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +examples.dropGraph("kShortestPathsGraph"); +~removeIgnoreCollection("places"); +~removeIgnoreCollection("connections"); +``` diff --git a/site/content/arangodb/oem/aql/graphs/k-shortest-paths.md b/site/content/arangodb/oem/aql/graphs/k-shortest-paths.md new file mode 100644 index 0000000000..917dba2516 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/k-shortest-paths.md @@ -0,0 +1,308 @@ +--- +title: k Shortest Paths in AQL +menuTitle: k Shortest Paths +weight: 25 +description: >- + Find a number of shortest paths in the order of increasing path length or weight +--- +## General query idea + +This type of query finds the first *k* paths in order of length +(or weight) between two given documents (*startVertex* and *targetVertex*) in +your graph. + +Every such path is returned as a JSON object with three components: + +- an array containing the `vertices` on the path +- an array containing the `edges` on the path +- the `weight` of the path, that is the sum of all edge weights + +If no `weightAttribute` is specified, the weight of the path is just its length. + +{{< youtube id="XdITulJFdVo" >}} + +**Example** + +Here is an example graph to explain how the k Shortest Paths algorithm works: + +![Train Connection Map](../../../../images/train_map.png) + +Each ellipse stands for a train station with the name of the city written inside +of it. They are the vertices of the graph. Arrows represent train connections +between cities and are the edges of the graph. The numbers near the arrows +describe how long it takes to get from one station to another. They are used +as edge weights. + +Let us assume that you want to go from **Aberdeen** to **London** by train. + +You expect to see the following vertices on *the* shortest path, in this order: + +1. Aberdeen +2. Leuchars +3. Edinburgh +4. York +5. London + +By the way, the weight of the path is: 1.5 + 1.5 + 3.5 + 1.8 = **8.3**. + +Let us look at alternative paths next, for example because you know that the +direct connection between York and London does not operate currently. +An alternative path, which is slightly longer, goes like this: + +1. Aberdeen +2. Leuchars +3. Edinburgh +4. York +5. **Carlisle** +6. **Birmingham** +7. London + +Its weight is: 1.5 + 1.5 + 3.5 + 2.0 + 1.5 = **10.0**. + +Another route goes via Glasgow. There are seven stations on the path as well, +however, it is quicker if you compare the edge weights: + +1. Aberdeen +2. Leuchars +3. Edinburgh +4. **Glasgow** +5. Carlisle +6. Birmingham +7. London + +The path weight is lower: 1.5 + 1.5 + 1.0 + 1.0 + 2.0 + 1.5 = **8.5**. + +## Syntax + +The syntax for k Shortest Paths queries is similar to the one for +[Shortest Path](shortest-path.md) and there are also two options to +either use a named graph or a set of edge collections. It only emits a path +variable however, whereas `SHORTEST_PATH` emits a vertex and an edge variable. + +{{< warning >}} +It is highly recommended that you use a **LIMIT** statement, as +k Shortest Paths is a potentially expensive operation. On large connected +graphs it can return a large number of paths, or perform an expensive +(but unsuccessful) search for more short paths. +{{< /warning >}} + +### Working with named graphs + +```aql +FOR path + IN OUTBOUND|INBOUND|ANY K_SHORTEST_PATHS + startVertex TO targetVertex + GRAPH graphName + [OPTIONS options] + [LIMIT offset, count] +``` + +- `FOR`: Emits the variable **path** which contains one path as an object containing + `vertices`, `edges`, and the `weight` of the path. +- `IN` `OUTBOUND|INBOUND|ANY`: Defines in which direction + edges are followed (outgoing, incoming, or both). +- `K_SHORTEST_PATHS`: The keyword to compute k Shortest Paths +- **startVertex** `TO` **targetVertex** (both string\|object): The two vertices between + which the paths are computed. This can be specified in the form of + a ID string or in the form of a document with the attribute `_id`. All other + values lead to a warning and an empty result. If one of the specified + documents does not exist, the result is empty as well and there is no warning. +- `GRAPH` **graphName** (string): The name identifying the named graph. Its vertex and + edge collections are looked up by the path search. +- `OPTIONS` **options** (object, *optional*): + See the [path search options](#path-search-options). +- `LIMIT` (see [LIMIT operation](../high-level-operations/limit.md), *optional*): + the maximal number of paths to return. It is highly recommended to use + a `LIMIT` for `K_SHORTEST_PATHS`. + +{{< info >}} +k Shortest Paths traversals do not support negative weights. If a document +attribute (as specified by `weightAttribute`) with a negative value is +encountered during traversal, or if `defaultWeight` is set to a negative +number, then the query is aborted with an error. +{{< /info >}} + +### Working with collection sets + +```aql +FOR path + IN OUTBOUND|INBOUND|ANY K_SHORTEST_PATHS + startVertex TO targetVertex + edgeCollection1, ..., edgeCollectionN + [OPTIONS options] + [LIMIT offset, count] +``` + +Instead of `GRAPH graphName` you can specify a list of edge collections. +The involved vertex collections are determined by the edges of the given +edge collections. + +### Path search options + +You can optionally specify the following options to modify the execution of a +graph path search. If you specify unknown options, query warnings are raised. + +#### `weightAttribute` + +A top-level edge attribute that should be used to read the edge weight (string). + +If the attribute does not exist or is not numeric, the `defaultWeight` is used +instead. + +The attribute value must not be negative. + +#### `defaultWeight` + +This value is used as fallback if there is no `weightAttribute` in the +edge document, or if it's not a number (number). + +The value must not be negative. The default is `1`. + +### Traversing in mixed directions + +For k shortest paths with a list of edge collections you can optionally specify the +direction for some of the edge collections. Say for example you have three edge +collections *edges1*, *edges2* and *edges3*, where in *edges2* the direction +has no relevance, but in *edges1* and *edges3* the direction should be taken into +account. In this case you can use `OUTBOUND` as general search direction and `ANY` +specifically for *edges2* as follows: + +```aql +FOR vertex IN OUTBOUND K_SHORTEST_PATHS + startVertex TO targetVertex + edges1, ANY edges2, edges3 +``` + +All collections in the list that do not specify their own direction use the +direction defined after `IN` (here: `OUTBOUND`). This allows to use a different +direction for each collection in your path search. + +## Examples + +You can load the `kShortestPathsGraph` example graph to get a named graph that +reflects some possible train connections in Europe and North America. + +![Train Connection Map](../../../../images/train_map.png) + +```js +--- +name: GRAPHKSP_01_create_graph +description: '' +--- +~addIgnoreCollection("places"); +~addIgnoreCollection("connections"); +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("kShortestPathsGraph"); +db.places.toArray(); +db.connections.toArray(); +``` + +Suppose you want to query a route from **Aberdeen** to **London**, and +compare the outputs of `SHORTEST_PATH` and `K_SHORTEST_PATHS` with +`LIMIT 1`. Note that while `SHORTEST_PATH` and `K_SHORTEST_PATH` with +`LIMIT 1` should return a path of the same length (or weight), they do +not need to return the same path. + +Using `SHORTEST_PATH`: + +```aql +--- +name: GRAPHKSP_01_Aberdeen_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e IN OUTBOUND SHORTEST_PATH 'places/Aberdeen' TO 'places/London' +GRAPH 'kShortestPathsGraph' + RETURN { place: v.label, travelTime: e.travelTime } +``` + +Using `K_SHORTEST_PATHS`: + +```aql +--- +name: GRAPHKSP_02_Aberdeen_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND K_SHORTEST_PATHS 'places/Aberdeen' TO 'places/London' +GRAPH 'kShortestPathsGraph' + LIMIT 1 + RETURN { places: p.vertices[*].label, travelTimes: p.edges[*].travelTime } +``` + +With `K_SHORTEST_PATHS`, you can ask for more than one option for a route: + +```aql +--- +name: GRAPHKSP_03_Aberdeen_to_London +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND K_SHORTEST_PATHS 'places/Aberdeen' TO 'places/London' +GRAPH 'kShortestPathsGraph' + LIMIT 3 + RETURN { + places: p.vertices[*].label, + travelTimes: p.edges[*].travelTime, + travelTimeTotal: SUM(p.edges[*].travelTime) + } +``` + +If you ask for routes that don't exist, you get an empty result +(from **Aberdeen** to **Toronto**): + +```aql +--- +name: GRAPHKSP_04_Aberdeen_to_Toronto +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND K_SHORTEST_PATHS 'places/Aberdeen' TO 'places/Toronto' +GRAPH 'kShortestPathsGraph' + LIMIT 3 + RETURN { + places: p.vertices[*].label, + travelTimes: p.edges[*].travelTime, + travelTimeTotal: SUM(p.edges[*].travelTime) + } +``` + +You can use the `travelTime` attribute that connections have as edge weights to +take into account which connections are quicker. A high default weight is set, +to be used if an edge has no `travelTime` attribute (not the case with the +example graph). This returns the top three routes with the fewest changes +and favoring the least travel time for the connection **Saint Andrews** +to **Cologne**: + +```aql +--- +name: GRAPHKSP_05_StAndrews_to_Cologne +description: '' +dataset: kShortestPathsGraph +--- +FOR p IN OUTBOUND K_SHORTEST_PATHS 'places/StAndrews' TO 'places/Cologne' +GRAPH 'kShortestPathsGraph' +OPTIONS { + weightAttribute: 'travelTime', + defaultWeight: 15 +} + LIMIT 3 + RETURN { + places: p.vertices[*].label, + travelTimes: p.edges[*].travelTime, + travelTimeTotal: SUM(p.edges[*].travelTime) + } +``` + +And finally clean up by removing the named graph: + +```js +--- +name: GRAPHKSP_99_drop_graph +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +examples.dropGraph("kShortestPathsGraph"); +~removeIgnoreCollection("places"); +~removeIgnoreCollection("connections"); +``` diff --git a/site/content/arangodb/oem/aql/graphs/shortest-path.md b/site/content/arangodb/oem/aql/graphs/shortest-path.md new file mode 100644 index 0000000000..ed8540e777 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/shortest-path.md @@ -0,0 +1,228 @@ +--- +title: Shortest Path in AQL +menuTitle: Shortest Path +weight: 15 +description: >- + Find one path of shortest length between two vertices +--- +## General query idea + +This type of query finds the shortest path between two given documents +(*startVertex* and *targetVertex*) in your graph. If there are multiple +shortest paths, the path with the lowest weight or a random one (in case +of a tie) is returned. + +The shortest path search emits the following two variables for every step of +the path: + +1. The vertex on this path. +2. The edge pointing to it. + +### Example execution + +Let's take a look at a simple example to explain how it works. +This is the graph that you are going to find a shortest path on: + +![traversal graph](../../../../images/traversal_graph.png) + +You can use the following parameters for the query: + +1. You start at the vertex **A**. +2. You finish with the vertex **D**. + +So, obviously, you have the vertices **A**, **B**, **C** and **D** on the +shortest path in exactly this order. Then, the shortest path statement +returns the following pairs: + +| Vertex | Edge | +|--------|-------| +| A | null | +| B | A → B | +| C | B → C | +| D | C → D | + +Note that the first edge is always `null` because there is no edge pointing +to the *startVertex*. + +## Syntax + +The next step is to see how you can write a shortest path query. +You have two options here, you can either use a named graph or a set of edge +collections (anonymous graph). + +### Working with named graphs + +```aql +FOR vertex[, edge] + IN OUTBOUND|INBOUND|ANY SHORTEST_PATH + startVertex TO targetVertex + GRAPH graphName + [OPTIONS options] +``` + +- `FOR`: Emits up to two variables: + - **vertex** (object): The current vertex on the shortest path + - **edge** (object, *optional*): The edge pointing to the vertex +- `IN` `OUTBOUND|INBOUND|ANY`: Defines in which direction edges are followed + (outgoing, incoming, or both) +- **startVertex** `TO` **targetVertex** (both string\|object): The two vertices between + which the shortest path is computed. This can be specified in the form of + an ID string or in the form of a document with the attribute `_id`. All other + values lead to a warning and an empty result. If one of the specified + documents does not exist, the result is empty as well and there is no warning. +- `GRAPH` **graphName** (string): The name identifying the named graph. Its vertex and + edge collections are looked up for the path search. +- `OPTIONS` **options** (object, *optional*): + See the [path search options](#path-search-options). + +{{< info >}} +Shortest Path traversals do not support negative weights. If a document +attribute (as specified by `weightAttribute`) with a negative value is +encountered during traversal, or if `defaultWeight` is set to a negative +number, then the query is aborted with an error. +{{< /info >}} + +### Working with collection sets + +```aql +FOR vertex[, edge] + IN OUTBOUND|INBOUND|ANY SHORTEST_PATH + startVertex TO targetVertex + edgeCollection1, ..., edgeCollectionN + [OPTIONS options] +``` + +Instead of `GRAPH graphName` you may specify a list of edge collections (anonymous +graph). The involved vertex collections are determined by the edges of the given +edge collections. The rest of the behavior is similar to the named version. + +### Path search options + +You can optionally specify the following options to modify the execution of a +graph path search. If you specify unknown options, query warnings are raised. + +#### `weightAttribute` + +A top-level edge attribute that should be used to read the edge weight (string). + +If the attribute does not exist or is not numeric, the `defaultWeight` is used +instead. + +The attribute value must not be negative. + +#### `defaultWeight` + +This value is used as fallback if there is no `weightAttribute` in the +edge document, or if it's not a number (number). + +The value must not be negative. The default is `1`. + +### Traversing in mixed directions + +For shortest path with a list of edge collections you can optionally specify the +direction for some of the edge collections. Say for example you have three edge +collections *edges1*, *edges2* and *edges3*, where in *edges2* the direction +has no relevance, but in *edges1* and *edges3* the direction should be taken into +account. In this case you can use `OUTBOUND` as general search direction and `ANY` +specifically for *edges2* as follows: + +```aql +FOR vertex IN OUTBOUND SHORTEST_PATH + startVertex TO targetVertex + edges1, ANY edges2, edges3 +``` + +All collections in the list that do not specify their own direction use the +direction defined after `IN` (here: `OUTBOUND`). This allows to use a different +direction for each collection in your path search. + +## Conditional shortest path + +The `SHORTEST_PATH` computation only finds an unconditioned shortest path. +With this construct it is not possible to define a condition like: "Find the +shortest path where all edges are of type *X*". If you want to do this, use a +normal [Traversal](traversals.md) instead with the option +`{order: "bfs"}` in combination with `LIMIT 1`. + +Please also consider using [`WITH`](../high-level-operations/with.md) to specify the +collections you expect to be involved. + +## Examples + +Creating a simple symmetric traversal demonstration graph: + +![traversal graph](../../../../images/traversal_graph.png) + +```js +--- +name: GRAPHSP_01_create_graph +description: '' +--- +~addIgnoreCollection("circles"); +~addIgnoreCollection("edges"); +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("traversalGraph"); +db.circles.toArray(); +db.edges.toArray(); +``` + +Start with the shortest path from **A** to **D** as above: + +```js +--- +name: GRAPHSP_02_A_to_D +description: '' +--- +db._query(` + FOR v, e IN OUTBOUND SHORTEST_PATH 'circles/A' TO 'circles/D' GRAPH 'traversalGraph' + RETURN [v._key, e._key] +`); + +db._query(` + FOR v, e IN OUTBOUND SHORTEST_PATH 'circles/A' TO 'circles/D' edges + RETURN [v._key, e._key] +`); +``` + +You can see that expectations are fulfilled. You find the vertices in the +correct ordering and the first edge is `null`, because no edge is pointing +to the start vertex on this path. + +You can also compute shortest paths based on documents found in collections: + +```js +--- +name: GRAPHSP_03_A_to_D +description: '' +--- +db._query(` + FOR a IN circles + FILTER a._key == 'A' + FOR d IN circles + FILTER d._key == 'D' + FOR v, e IN OUTBOUND SHORTEST_PATH a TO d GRAPH 'traversalGraph' + RETURN [v._key, e._key] +`); + +db._query(` + FOR a IN circles + FILTER a._key == 'A' + FOR d IN circles + FILTER d._key == 'D' + FOR v, e IN OUTBOUND SHORTEST_PATH a TO d edges + RETURN [v._key, e._key] +`); +``` + +And finally clean it up again: + +```js +--- +name: GRAPHSP_99_drop_graph +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +examples.dropGraph("traversalGraph"); +~removeIgnoreCollection("circles"); +~removeIgnoreCollection("edges"); +``` diff --git a/site/content/arangodb/oem/aql/graphs/traversals-explained.md b/site/content/arangodb/oem/aql/graphs/traversals-explained.md new file mode 100644 index 0000000000..b4e9741151 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/traversals-explained.md @@ -0,0 +1,85 @@ +--- +title: AQL graph traversals explained +menuTitle: Traversals explained +weight: 5 +description: >- + Traversing a graph means to follow edges connected to a start vertex and + neighboring vertices until a specified depth +--- +## General query idea + +A traversal starts at one specific document (*startVertex*) and follows all +edges connected to this document. For all documents (*vertices*) that are +targeted by these edges it will again follow all edges connected to them and +so on. It is possible to define how many of these follow iterations should be +executed at least (*min* depth) and at most (*max* depth). + +For all vertices that were visited during this process in the range between +*min* depth and *max* depth iterations you will get a result in form of a +set with three items: + +1. The visited vertex. +2. The edge pointing to it. +3. The complete path from startVertex to the visited vertex as object with an + attribute *edges* and an attribute *vertices*, each a list of the corresponding + elements. These lists are sorted, which means the first element in *vertices* + is the *startVertex* and the last is the visited vertex, and the n-th element + in *edges* connects the n-th element with the (n+1)-th element in *vertices*. + +## Example execution + +Let's take a look at a simple example to explain how it works. +This is the graph that we are going to traverse: + +![traversal graph](../../../../images/traversal_graph.png) + +We use the following parameters for our query: + +1. We start at the vertex **A**. +2. We use a *min* depth of 1. +3. We use a *max* depth of 2. +4. We follow only in `OUTBOUND` direction of edges + +![traversal graph step 1](../../../../images/traversal_graph1.png) + +Now it walks to one of the direct neighbors of **A**, say **B** (note: ordering +is not guaranteed!): + +![traversal graph step 2](../../../../images/traversal_graph2.png) + +The query will remember the state (red circle) and will emit the first result +**A** → **B** (black box). This will also prevent the traverser to be trapped +in cycles. Now again it will visit one of the direct neighbors of **B**, say **E**: + +![traversal graph step 3](../../../../images/traversal_graph3.png) + +We have limited the query with a *max* depth of *2*, so it will not pick any +neighbor of **E**, as the path from **A** to **E** already requires *2* steps. +Instead, we will go back one level to **B** and continue with any other direct +neighbor there: + +![traversal graph step 4](../../../../images/traversal_graph4.png) + +Again after we produced this result we will step back to **B**. +But there is no neighbor of **B** left that we have not yet visited. +Hence we go another step back to **A** and continue with any other neighbor there. + +![traversal graph step 5](../../../../images/traversal_graph5.png) + +And identical to the iterations before we will visit **H**: + +![traversal graph step 6](../../../../images/traversal_graph6.png) + +And **J**: + +![traversal graph step 7](../../../../images/traversal_graph7.png) + +After these steps there is no further result left. So all together this query +has returned the following paths: + +1. **A** → **B** +2. **A** → **B** → **E** +3. **A** → **B** → **C** +4. **A** → **G** +5. **A** → **G** → **H** +6. **A** → **G** → **J** diff --git a/site/content/arangodb/oem/aql/graphs/traversals.md b/site/content/arangodb/oem/aql/graphs/traversals.md new file mode 100644 index 0000000000..657fbf0917 --- /dev/null +++ b/site/content/arangodb/oem/aql/graphs/traversals.md @@ -0,0 +1,890 @@ +--- +title: Graph traversals in AQL +menuTitle: Traversals +weight: 10 +description: >- + You can traverse named graphs and anonymous graphs with a native AQL + language construct +--- +## Syntax + +There are two slightly different syntaxes for traversals in AQL, one for +- [named graphs](../../graphs/_index.md#named-graphs) and another to +- specify a [set of edge collections](#working-with-collection-sets) + ([anonymous graph](../../graphs/_index.md#anonymous-graphs)). + +### Working with named graphs + +The syntax for AQL graph traversals using named graphs is as follows +(square brackets denote optional parts and `|` denotes alternatives): + +```aql +FOR vertex[, edge[, path]] + IN [min[..max]] + OUTBOUND|INBOUND|ANY startVertex + GRAPH graphName + [PRUNE [pruneVariable = ]pruneCondition] + [OPTIONS options] +``` + +- `FOR`: emits up to three variables: + - **vertex** (object): the current vertex in a traversal + - **edge** (object, *optional*): the current edge in a traversal + - **path** (object, *optional*): representation of the current path with + two members: + - `vertices`: an array of all vertices on this path + - `edges`: an array of all edges on this path +- `IN` `min..max`: the minimal and maximal depth for the traversal: + - **min** (number, *optional*): edges and vertices returned by this query + start at the traversal depth of *min* (thus edges and vertices below it are + not returned). If not specified, it defaults to 1. The minimal + possible value is 0. + - **max** (number, *optional*): up to *max* length paths are traversed. + If omitted, *max* defaults to *min*. Thus only the vertices and edges in + the range of *min* are returned. *max* cannot be specified without *min*. +- `OUTBOUND|INBOUND|ANY`: follow outgoing, incoming, or edges pointing in either + direction in the traversal. Note that this can't be replaced by a bind parameter. +- **startVertex** (string\|object): a vertex where the traversal originates from. + This can be specified in the form of an ID string or in the form of a document + with the `_id` attribute. All other values lead to a warning and an empty + result. If the specified document does not exist, the result is empty as well + and there is no warning. +- `GRAPH` **graphName** (string): the name identifying the named graph. + Its vertex and edge collections are looked up. Note that the graph name + is like a regular string, hence it must be enclosed by quote marks, like + `GRAPH "graphName"`. +- `PRUNE` **expression** (AQL expression, *optional*): + An expression, like in a `FILTER` statement, which is evaluated in every step of + the traversal, as early as possible. The semantics of this expression are as follows: + - If the expression evaluates to `false`, the traversal continues on the current path. + - If the expression evaluates to `true`, the traversal does not continue on the + current path. However, the paths up to this point are considered as a result + (they might still be post-filtered or ignored due to depth constraints). + For example, a traversal over the graph `(A) -> (B) -> (C)` starting at `A` + and pruning on `B` results in `(A)` and `(A) -> (B)` being valid paths, + whereas `(A) -> (B) -> (C)` is not returned because it gets pruned on `B`. + + You can only use a single `PRUNE` clause per `FOR` traversal operation, but + the prune expression can contain an arbitrary number of conditions using `AND` + and `OR` statements for complex expressions. You can use the variables emitted + by the `FOR` operation in the prune expression, as well as all variables + defined before the traversal. + + You can optionally assign the prune expression to a variable like + `PRUNE var = <expr>` to use the evaluated result elsewhere in the query, + typically in a `FILTER` expression. + + See [Pruning](#pruning) for details. +- `OPTIONS` **options** (object, *optional*): See the [traversal options](#traversal-options). + +### Working with collection sets + +The syntax for AQL graph traversals using collection sets is as follows +(square brackets denote optional parts and `|` denotes alternatives): + +```aql +[WITH vertexCollection1[, vertexCollection2[, vertexCollectionN]]] +FOR vertex[, edge[, path]] + IN [min[..max]] + OUTBOUND|INBOUND|ANY startVertex + edgeCollection1[, edgeCollection2[, edgeCollectionN]] + [PRUNE [pruneVariable = ]pruneCondition] + [OPTIONS options] +``` + +- `WITH`: Declaration of collections. Optional for single server instances, but + required for [graph traversals in a cluster](#graph-traversals-in-a-cluster). + Needs to be placed at the very beginning of the query. + - **collections** (collection, *repeatable*): list of vertex collections that + are involved in the traversal +- **edgeCollections** (collection, *repeatable*): One or more edge collections + to use for the traversal (instead of using a named graph with `GRAPH graphName`). + Vertex collections are determined by the edges in the edge collections. + + You can override the default traversal direction by setting `OUTBOUND`, + `INBOUND`, or `ANY` before any of the edge collections. + + If the same edge collection is specified multiple times, it behaves as if it + were specified only once. Specifying the same edge collection is only allowed + when the collections do not have conflicting traversal directions. + + Views cannot be used as edge collections. +- See the [named graph variant](#working-with-named-graphs) for the remaining + traversal parameters as well as the [traversal options](#traversal-options). + The `edgeCollections` restriction option is redundant in this case. + +### Traversal options + +You can optionally specify the following options to modify the execution of a +graph traversal. If you specify unknown options, query warnings are raised. + +#### `order` + +Specify which traversal algorithm to use (string): +- `"bfs"` – the traversal is executed breadth-first. The results + first contain all vertices at depth 1, then all vertices at depth 2 and so on. +- `"dfs"` (default) – the traversal is executed depth-first. It + first returns all paths from *min* depth to *max* depth for one vertex at + depth 1, then for the next vertex at depth 1 and so on. +- `"weighted"` - the traversal is a weighted traversal + (introduced in v3.8.0). Paths are enumerated with increasing cost. + Also see `weightAttribute` and `defaultWeight`. A returned path has an + additional attribute `weight` containing the cost of the path after every + step. The order of paths having the same cost is non-deterministic. + Negative weights are not supported and abort the query with an error. + +#### `bfs` + +Deprecated, use `order: "bfs"` instead. + +#### `uniqueVertices` + +Ensure vertex uniqueness (string): + +- `"path"` – it is guaranteed that there is no path returned with a duplicate vertex +- `"global"` – it is guaranteed that each vertex is visited at most once during + the traversal, no matter how many paths lead from the start vertex to this one. + If you start with a `min depth > 1` a vertex that was found before *min* depth + might not be returned at all (it still might be part of a path). + It is required to set `order: "bfs"` or `order: "weighted"` because with + depth-first search the results would be unpredictable. **Note:** + Using this configuration the result is not deterministic any more. If there + are multiple paths from *startVertex* to *vertex*, one of those is picked. + In case of a `weighted` traversal, the path with the lowest weight is + picked, but in case of equal weights it is undefined which one is chosen. +- `"none"` (default) – no uniqueness check is applied on vertices + +#### `uniqueEdges` + +Ensure edge uniqueness (string): + +- `"path"` (default) – it is guaranteed that there is no path returned with a + duplicate edge +- `"none"` – no uniqueness check is applied on edges. **Note:** + Using this configuration, the traversal follows edges in cycles. + +#### `edgeCollections` + +Restrict edge collections the traversal may visit (string\|array). + +If omitted or an empty array is specified, then there are no restrictions. + +- A string parameter is treated as the equivalent of an array with a single + element. +- Each element of the array should be a string containing the name of an + edge collection. + +#### `vertexCollections` + +Restrict vertex collections the traversal may visit (string\|array). + +If omitted or an empty array is specified, then there are no restrictions. + +- A string parameter is treated as the equivalent of an array with a single + element. +- Each element of the array should be a string containing the name of a + vertex collection. +- The starting vertex is always allowed, even if it does not belong to one + of the collections specified by a restriction. + +#### `parallelism` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +Parallelize traversal execution (number). + +If omitted or set to a value of `1`, the traversal execution is not parallelized. +If set to a value greater than `1`, then up to that many worker threads can be +used for concurrently executing the traversal. The value is capped by the number +of available cores on the target machine. + +Parallelizing a traversal is normally useful when there are many inputs (start +vertices) that the nested traversal can work on concurrently. This is often the +case when a nested traversal is fed with several tens of thousands of start +vertices, which can then be distributed randomly to worker threads for parallel +execution. + +#### `maxProjections` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +Specifies the number of document attributes per `FOR` loop to be used as +projections (number). The default value is `5`. + +#### `weightAttribute` + +Specifies the name of an attribute that is used to look up the weight of an edge +(string). + +If no attribute is specified or if it is not present in the edge document then +the `defaultWeight` is used. + +The attribute value must not be negative. + +{{< info >}} +Weighted traversals do not support negative weights. If a document +attribute (as specified by `weightAttribute`) with a negative value is +encountered during traversal, the query is aborted with an error. +{{< /info >}} + +#### `defaultWeight` + +Specifies the default weight of an edge (number). The default value is `1`. + +The value must not be negative. + +{{< info >}} +Weighted traversals do not support negative weights. If `defaultWeight` is set +to a negative number, then the query is aborted with an error. +{{< /info >}} + +### Traversing in mixed directions + +For traversals with a list of edge collections you can optionally specify the +direction for some of the edge collections. Say for example you have three edge +collections *edges1*, *edges2* and *edges3*, where in *edges2* the direction has +no relevance but in *edges1* and *edges3* the direction should be taken into account. +In this case you can use `OUTBOUND` as general traversal direction and `ANY` +specifically for *edges2* as follows: + +```aql +FOR vertex IN OUTBOUND + startVertex + edges1, ANY edges2, edges3 +``` + +All collections in the list that do not specify their own direction use the +direction defined after `IN`. This allows to use a different direction for each +collection in your traversal. + +### Graph traversals in a cluster + +Due to the nature of graphs, edges may reference vertices from arbitrary +collections. Following the paths can thus involve documents from various +collections and it is not possible to predict which are visited in a +traversal. Which collections need to be loaded by the graph engine can only be +determined at run time. + +Use the [`WITH` statement](../high-level-operations/with.md) to specify the collections you +expect to be involved. This is required for traversals using collection sets +in cluster deployments. + +## Pruning + +You can define stop conditions for graph traversals to return specific data and +to improve the query performance. This is called _pruning_ and works by checking +conditions during the traversal as opposed to filtering the results afterwards +(post-filtering). This reduces the amount of data to be checked by stopping the +traversal down specific paths early. + +{{< youtube id="4LVeeC0ciCQ" >}} + +You can specify one `PRUNE` expression per graph traversal, but it can contain +an arbitrary number of conditions. You can use the vertex, edge, and path +variables emitted by the traversal in a prune expression, as well as all other +variables defined before the `FOR` operation. Note that `PRUNE` is an optional +clause of the `FOR` operation and that the `OPTIONS` clause needs to be placed +after `PRUNE`. + +```aql +--- +name: GRAPHTRAV_graphPruneExample1 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 0..10 OUTBOUND "places/Toronto" GRAPH "kShortestPathsGraph" + PRUNE v.label == "Edmonton" + OPTIONS { uniqueVertices: "path" } + RETURN CONCAT_SEPARATOR(" -- ", p.vertices[*].label) +``` + +The above example shows a graph traversal using a +[train station and connections dataset](../../graphs/example-graphs.md#k-shortest-paths-graph): + +![Train Connection Map](../../../../images/train_map.png) + +The traversal starts at **Toronto** (bottom left), the traversal depth is +limited to 10, and every station is only visited once. The traversal could +continue up to **Vancouver** (bottom right) at depth 5, but it is stopped early +on this path (the only path in this example) at **Edmonton** because of the +prune expression. + +The traversal along paths is stopped as soon as the prune expression evaluates +to `true` for a given path. The current depth is still included in the result, +however. This can be seen in the query result of the example which includes the +Edmonton vertex at which it stopped. + +The following example starts a traversal at **London** (middle right), with a +depth between 2 and 3, and every station is only visited once. The station names +as well as the travel times are returned: + +```aql +--- +name: GRAPHTRAV_graphPruneExample2 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + OPTIONS { uniqueVertices: "path" } + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +The same example with an added prune expression, with vertex and edge conditions: + +```aql +--- +name: GRAPHTRAV_graphPruneExample3 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + PRUNE v.label == "Carlisle" OR e.travelTime > 3 + OPTIONS { uniqueVertices: "path" } + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +If either the **Carlisle** vertex or an edge with a travel time of over three +hours is encountered, the subsequent paths are pruned. In the example, this +removes the train connections to **Birmingham**, **Glasgow**, and **York**, +which come after **Carlisle**, as well as the connections to and via +**Edinburgh** because of the four hour duration for the section from **York** +to **Edinburgh**. + +If your graph is comprised of multiple vertex or edge collections, you can +also prune as soon as you reach a certain collection, using a condition like +`PRUNE IS_SAME_COLLECTION("stopCollection", v)`. + +If you want to only return the results of the depth at which the traversal +stopped due to the prune expression, you can use a `FILTER` in addition. You can +assign the evaluated result of a prune expression to a variable +(`PRUNE var = <expr>`) and use it for filtering: + +```aql +--- +name: GRAPHTRAV_graphPruneExample4 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + PRUNE cond = v.label == "Carlisle" OR e.travelTime > 3 + OPTIONS { uniqueVertices: "path" } + FILTER cond + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +Only paths that end at **Carlisle** or with the last edge having a travel time +of over three hours are returned. This excludes the connection to **Cologne** +from the results compared to the previous query. + +If you want to exclude the depth at which the prune expression stopped the +traversal, you can assign the expression to a variable and use its negated value +in a `FILTER`: + +```aql +--- +name: GRAPHTRAV_graphPruneExample5 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + PRUNE cond = v.label == "Carlisle" OR e.travelTime > 3 + OPTIONS { uniqueVertices: "path" } + FILTER NOT cond + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +This only returns the connection to **Cologne**, which is the opposite of the +previous example. + +You may combine the prune variable with arbitrary other conditions in a `FILTER` +operation. For example, you can remove results where the last edge has as lower +travel time than the second to last edge of the path: + +```aql +--- +name: GRAPHTRAV_graphPruneExample6 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 2..5 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + PRUNE cond = v.label == "Carlisle" OR e.travelTime > 3 + OPTIONS { uniqueVertices: "path" } + FILTER cond AND p.edges[-1].travelTime >= p.edges[-2].travelTime + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +{{< info >}} +The prune expression is **evaluated at every step of the traversal**. This +includes any traversal depths below the specified minimum depth, despite not +becoming part of the result. It also includes depth 0, which is the start vertex +and a `null` edge. + +If you add prune conditions using the edge variable, make sure to account for +the edge at depth 0 being `null`, as it may accidentally stop the traversal +immediately. This may not be apparent due to the depth constraints. +{{< /info >}} + +The following examples shows a graph traversal starting at **London**, with a +traversal depth between 2 and 3, and every station is only visited once: + +```aql +--- +name: GRAPHTRAV_graphPruneExample7 +description: '' +dataset: kShortestPathsGraph +--- +FOR v, e, p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + OPTIONS { uniqueVertices: "path" } + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +If you add prune conditions to stop the traversal if the station is **Glasgow** +or the travel time less than some number, no results are turned. This is even the +case for a value of `2.5`, for which two paths exist that fulfill the criterion +– to **Cologne** and **Carlisle**: + +```aql +--- +name: GRAPHTRAV_graphPruneExample8 +description: '' +dataset: kShortestPathsGraph +--- +FOR v,e,p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + PRUNE v.label == "Glasgow" OR e.travelTime < 2.5 + OPTIONS { uniqueVertices: "path" } + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +The problem is that `null`, `false`, and `true` are all less than any number (`< 2.5`) +because of AQL's [Type and value order](../fundamentals/type-and-value-order.md), and +because the edge at depth 0 is always `null`. The prune condition is accidentally +fulfilled at the start vertex, stopping the traversal too early. This similarly +happens if you check an edge attribute for inequality (`!=`) and compare it to +string, for instance, which evaluates to `true` for the `null` value. + +The depth at which a traversal is stopped by pruning is considered as a result, +but in the above example, the minimum depth of `2` filters the start vertex out. +If you lower the minimum depth to `0`, you get **London** as the sole result. +This confirms that the traversal stopped at the start vertex. + +To avoid this problem, exclude the `null` value. For example, you can use +`e.travelTime > 0 AND e.travelTime < 2.5`, but more generic solutions are to +exclude depth 0 from the check (`LENGTH(p.edges) > 0`) or to simply ignore the +`null` edge (`e != null`): + +```aql +--- +name: GRAPHTRAV_graphPruneExample9 +description: '' +dataset: kShortestPathsGraph +--- +FOR v,e,p IN 2..3 OUTBOUND "places/London" GRAPH "kShortestPathsGraph" + PRUNE v.label == "Glasgow" OR (e != null AND e.travelTime < 2.5) + OPTIONS { uniqueVertices: "path" } + RETURN CONCAT_SEPARATOR(" -- ", INTERLEAVE(p.vertices[*].label, p.edges[*].travelTime)) +``` + +{{< warning >}} +You can use AQL functions in prune expressions but only those that can be +executed on DB-Servers, regardless of your deployment mode. The following +functions cannot be used in the expression: +- `CALL()` +- `APPLY()` +- `DOCUMENT()` +- `V8()` +- `SCHEMA_GET()` +- `SCHEMA_VALIDATE()` +- `VERSION()` +- `COLLECTIONS()` +- `CURRENT_USER()` +- `CURRENT_DATABASE()` +- `COLLECTION_COUNT()` +- `NEAR()` +- `WITHIN()` +- `WITHIN_RECTANGLE()` +- `FULLTEXT()` +- [User-defined functions (UDFs)](../user-defined-functions.md) +{{< /warning >}} + +## Using filters + +All three variables emitted by the traversals might as well be used in filter +statements. For some of these filter statements the optimizer can detect that it +is possible to prune paths of traversals earlier, hence filtered results are +not emitted to the variables in the first place. This may significantly +improve the performance of your query. Whenever a filter is not fulfilled, +the complete set of `vertex`, `edge` and `path` is skipped. All paths +with a length greater than the `max` depth are never computed. + +Filter conditions that are `AND`-combined can be optimized, but `OR`-combined +conditions cannot. + +### Filtering on paths + +Filtering on paths allows for the second most powerful filtering and may have the +second highest impact on performance. Using the path variable you can filter on +specific iteration depths. You can filter for absolute positions in the path +by specifying a positive number (which then qualifies for the optimizations), +or relative positions to the end of the path by specifying a negative number. + +#### Filtering edges on the path + +This example traversal filters all paths where the start edge (index 0) has the +attribute `theTruth` equal to `true`. The resulting paths are up to 5 items long: + +```aql +--- +name: GRAPHTRAV_graphFilterEdges +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[0].theTruth == true + RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } +``` + +#### Filtering vertices on the path + +Similar to filtering the edges on the path, you can also filter the vertices: + +```aql +--- +name: GRAPHTRAV_graphFilterVertices +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.vertices[1]._key == "G" + RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } +``` + +#### Combining several filters + +You can combine filters in any way you like: + +```aql +--- +name: GRAPHTRAV_graphFilterCombine +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[0].theTruth == true + AND p.edges[1].theFalse == false + FILTER p.vertices[1]._key == "G" + RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } +``` + +The query filters all paths where the first edge has the attribute +`theTruth` equal to `true`, the first vertex is `"G"` and the second edge has +the attribute `theFalse` equal to `false`. The resulting paths are up to +5 items long. + +**Note**: Despite the `min` depth of 1, this only returns results of +depth 2. This is because for all results in depth 1, the second edge does not +exist and hence cannot fulfill the condition here. + +#### Filter on the entire path + +With the help of array comparison operators filters can also be defined +on the entire path, like `ALL` edges should have `theTruth == true`: + +```aql +--- +name: GRAPHTRAV_graphFilterEntirePath +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[*].theTruth ALL == true + RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } +``` + +Or `NONE` of the edges should have `theTruth == true`: + +```aql +--- +name: GRAPHTRAV_graphFilterPathEdges +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[*].theTruth NONE == true + RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } +``` + +Both examples above are recognized by the optimizer and can potentially use other indexes +than the edge index. + +It is also possible to define that at least one edge on the path has to fulfill the condition: + +```aql +--- +name: GRAPHTRAV_graphFilterPathAnyEdge +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[*].theTruth ANY == true + RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } +``` + +It is guaranteed that at least one, but potentially more edges fulfill the condition. +All of the above filters can be defined on vertices in the exact same way. + +### Filtering on the path vs. filtering on vertices or edges + +Filtering on the path influences the Iteration on your graph. If certain conditions +aren't met, the traversal may stop continuing along this path. + +In contrast filters on vertex or edge only express whether you're interested in the actual value of these +documents. Thus, it influences the list of returned documents (if you return v or e) similar +as specifying a non-null `min` value. If you specify a min value of 2, the traversal over the first +two nodes of these paths has to be executed - you just won't see them in your result array. + +Similar are filters on vertices or edges - the traverser has to walk along these nodes, since +you may be interested in documents further down the path. + +### Examples + +Create a simple symmetric traversal demonstration graph: + +![traversal graph](../../../../images/traversal_graph.png) + +```js +--- +name: GRAPHTRAV_01_create_graph +description: '' +--- +~addIgnoreCollection("circles"); +~addIgnoreCollection("edges"); +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("traversalGraph"); +db.circles.toArray(); +db.edges.toArray(); +print("once you don't need them anymore, clean them up:"); +examples.dropGraph("traversalGraph"); +``` + +To get started we select the full graph. For better overview we only return +the vertex IDs: + +```aql +--- +name: GRAPHTRAV_02_traverse_all_a +description: '' +dataset: traversalGraph +--- +FOR v IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_02_traverse_all_b +description: '' +dataset: traversalGraph +--- +FOR v IN 1..3 OUTBOUND 'circles/A' edges RETURN v._key +``` + +We can nicely see that it is heading for the first outer vertex, then goes back to +the branch to descend into the next tree. After that it returns to our start node, +to descend again. As we can see both queries return the same result, the first one +uses the named graph, the second uses the edge collections directly. + +Now we only want the elements of a specific depth (min = max = 2), the ones that +are right behind the fork: + +```aql +--- +name: GRAPHTRAV_03_traverse_3a +description: '' +dataset: traversalGraph +--- +FOR v IN 2..2 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_03_traverse_3b +description: '' +dataset: traversalGraph +--- +FOR v IN 2 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + RETURN v._key +``` + +As you can see, we can express this in two ways: with or without the `max` depth +parameter. + +### Filter examples + +Now let's start to add some filters. We want to cut of the branch on the right +side of the graph, we may filter in two ways: + +- we know the vertex at depth 1 has `_key` == `G` +- we know the `label` attribute of the edge connecting **A** to **G** is `right_foo` + +```aql +--- +name: GRAPHTRAV_04_traverse_4a +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.vertices[1]._key != 'G' + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_04_traverse_4b +description: '' +dataset: traversalGraph +--- +FOR v, e, p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[0].label != 'right_foo' + RETURN v._key +``` + +As we can see, all vertices behind **G** are skipped in both queries. +The first filters on the vertex `_key`, the second on an edge label. +Note again, as soon as a filter is not fulfilled for any of the three elements +`v`, `e` or `p`, the complete set of these is excluded from the result. + +We also may combine several filters, for instance to filter out the right branch +(**G**), and the **E** branch: + +```aql +--- +name: GRAPHTRAV_05_traverse_5a +description: '' +dataset: traversalGraph +--- +FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.vertices[1]._key != 'G' + FILTER p.edges[1].label != 'left_blub' + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_05_traverse_5b +description: '' +dataset: traversalGraph +--- +FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.vertices[1]._key != 'G' AND p.edges[1].label != 'left_blub' + RETURN v._key +``` + +As you can see, combining two `FILTER` statements with an `AND` has the same result. + +## Comparing OUTBOUND / INBOUND / ANY + +All our previous examples traversed the graph in `OUTBOUND` edge direction. +You may however want to also traverse in reverse direction (`INBOUND`) or +both (`ANY`). Since `circles/A` only has outbound edges, we start our queries +from `circles/E`: + +```aql +--- +name: GRAPHTRAV_06_traverse_6a +description: '' +dataset: traversalGraph +--- +FOR v IN 1..3 OUTBOUND 'circles/E' GRAPH 'traversalGraph' + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_06_traverse_6b +description: '' +dataset: traversalGraph +--- +FOR v IN 1..3 INBOUND 'circles/E' GRAPH 'traversalGraph' + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_06_traverse_6c +description: '' +dataset: traversalGraph +--- +FOR v IN 1..3 ANY 'circles/E' GRAPH 'traversalGraph' + RETURN v._key +``` + +The first traversal only walks in the forward (`OUTBOUND`) direction. +Therefore from **E** we only can see **F**. Walking in reverse direction +(`INBOUND`), we see the path to **A**: **B** → **A**. + +Walking in forward and reverse direction (`ANY`) we can see a more diverse result. +First of all, we see the simple paths to **F** and **A**. However, these vertices +have edges in other directions and they are traversed. + +**Note**: The traverser may use identical edges multiple times. For instance, +if it walks from **E** to **F**, it continues to walk from **F** to **E** +using the same edge once again. Due to this, we see duplicate nodes in the result. + +Please note that the direction can't be passed in by a bind parameter. + +## Use the AQL explainer for optimizations + +Now let's have a look what the optimizer does behind the curtain and inspect +traversal queries using [the explainer](../execution-and-performance/query-optimization.md): + +```aql +--- +name: GRAPHTRAV_07_traverse_7 +description: '' +dataset: traversalGraph +explain: true +--- +FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + LET localScopeVar = RAND() > 0.5 + FILTER p.edges[0].theTruth != localScopeVar + RETURN v._key +``` + +```aql +--- +name: GRAPHTRAV_07_traverse_8 +description: '' +dataset: traversalGraph +explain: true +--- +FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' + FILTER p.edges[0].label == 'right_foo' + RETURN v._key +``` + +We now see two queries: In one we add a `localScopeVar` variable, which is outside +the scope of the traversal itself - it is not known inside of the traverser. +Therefore, this filter can only be executed after the traversal, which may be +undesired in large graphs. The second query on the other hand only operates on the +path, and therefore this condition can be used during the execution of the traversal. +Paths that are filtered out by this condition won't be processed at all. + +And finally clean it up again: + +```js +--- +name: GRAPHTRAV_99_drop_graph +description: '' +--- +~examples.loadGraph("traversalGraph"); +var examples = require("@arangodb/graph-examples/example-graph"); +examples.dropGraph("traversalGraph"); +``` + +If this traversal is not powerful enough for your needs, like you cannot describe +your conditions as AQL filter statements, then you might want to have a look at +the [edge collection methods](../../develop/javascript-api/@arangodb/collection-object.md#edge-documents) +in the JavaScript API. + +Also see how to [combine graph traversals](../examples-and-query-patterns/traversals.md). diff --git a/site/content/arangodb/oem/aql/high-level-operations/_index.md b/site/content/arangodb/oem/aql/high-level-operations/_index.md new file mode 100644 index 0000000000..78432ed69f --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/_index.md @@ -0,0 +1,9 @@ +--- +title: High-level AQL operations +menuTitle: High-level Operations +weight: 25 +description: >- + High-level operations are the core language constructs of the query language + to perform actions like finding and returning data, as well as creating and + modifying documents +--- diff --git a/site/content/arangodb/oem/aql/high-level-operations/collect.md b/site/content/arangodb/oem/aql/high-level-operations/collect.md new file mode 100644 index 0000000000..cdcc8dcd5a --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/collect.md @@ -0,0 +1,375 @@ +--- +title: '`COLLECT` operation in AQL' +menuTitle: COLLECT +weight: 40 +description: >- + The `COLLECT` operation can group data by one or multiple grouping criteria, + retrieve all distinct values, count how often values occur, and calculate + statistical properties efficiently +--- +The different variants of `COLLECT` cover most needs for grouping and aggregating +data. For aggregation using a sliding window, see the [`WINDOW` operation](window.md). + +## Syntax + +There are several syntax variants for `COLLECT` operations: + +<pre><code>COLLECT <em>variableName</em> = <em>expression</em> +COLLECT <em>variableName</em> = <em>expression</em> INTO <em>groupsVariable</em> +COLLECT <em>variableName</em> = <em>expression</em> INTO <em>groupsVariable</em> = <em>projectionExpression</em> +COLLECT <em>variableName</em> = <em>expression</em> INTO <em>groupsVariable</em> KEEP <em>keepVariable</em> +COLLECT <em>variableName</em> = <em>expression</em> WITH COUNT INTO <em>countVariable</em> +COLLECT <em>variableName</em> = <em>expression</em> AGGREGATE variableName = <em>aggregateExpression</em> +COLLECT <em>variableName</em> = <em>expression</em> AGGREGATE variableName = <em>aggregateExpression</em> INTO <em>groupsVariable</em> +COLLECT AGGREGATE <em>variableName</em> = <em>aggregateExpression</em> +COLLECT AGGREGATE <em>variableName</em> = <em>aggregateExpression</em> INTO <em>groupsVariable</em> +COLLECT WITH COUNT INTO <em>countVariable</em></code></pre> + +All variants can optionally end with an `OPTIONS { … }` clause. + +{{< info >}} +The `COLLECT` operation eliminates all local variables in the current scope. +After a `COLLECT`, only the variables introduced by `COLLECT` itself are available. +{{< /info >}} + +## Grouping syntaxes + +The first syntax form of `COLLECT` only groups the result by the defined group +criteria specified in *expression*. In order to further process the results +produced by `COLLECT`, a new variable (specified by *variableName*) is introduced. +This variable contains the group value. + +Here's an example query that find the distinct values in `u.city` and makes +them available in variable `city`: + +```aql +FOR u IN users + COLLECT city = u.city + RETURN { + "city" : city + } +``` + +The second form does the same as the first form, but additionally introduces a +variable (specified by *groupsVariable*) that contains all elements that fell into the +group. This works as follows: The *groupsVariable* variable is an array containing +as many elements as there are in the group. Each member of that array is +a JSON object in which the value of every variable that is defined in the +AQL query is bound to the corresponding attribute. Note that this considers +all variables that are defined before the `COLLECT` statement, but not those on +the top level (outside of any `FOR`), unless the `COLLECT` statement is itself +on the top level, in which case all variables are taken. Furthermore note +that it is possible that the optimizer moves `LET` statements out of `FOR` +statements to improve performance. + +```aql +FOR u IN users + COLLECT city = u.city INTO groups + RETURN { + "city" : city, + "usersInCity" : groups + } +``` + +In the above example, the array `users` will be grouped by the attribute +`city`. The result is a new array of documents, with one element per distinct +`u.city` value. The elements from the original array (here: `users`) per city are +made available in the variable `groups`. This is due to the `INTO` clause. + +`COLLECT` also allows specifying multiple group criteria. Individual group +criteria can be separated by commas: + +```aql +FOR u IN users + COLLECT country = u.country, city = u.city INTO groups + RETURN { + "country" : country, + "city" : city, + "usersInCity" : groups + } +``` + +In the above example, the array `users` is grouped by country first and then +by city, and for each distinct combination of country and city, the users +will be returned. + +## Discarding obsolete variables + +The third form of `COLLECT` allows rewriting the contents of the *groupsVariable* +using an arbitrary *projectionExpression*: + +```aql +FOR u IN users + COLLECT country = u.country, city = u.city INTO groups = u.name + RETURN { + "country" : country, + "city" : city, + "userNames" : groups + } +``` + +In the above example, only the *projectionExpression* is `u.name`. Therefore, +only this attribute is copied into the *groupsVariable* for each document. +This is probably much more efficient than copying all variables from the scope into +the *groupsVariable* as it would happen without a *projectionExpression*. + +The expression following `INTO` can also be used for arbitrary computations: + +```aql +FOR u IN users + COLLECT country = u.country, city = u.city INTO groups = { + "name" : u.name, + "isActive" : u.status == "active" + } + RETURN { + "country" : country, + "city" : city, + "usersInCity" : groups + } +``` + +`COLLECT` also provides an optional `KEEP` clause that can be used to control +which variables will be copied into the variable created by `INTO`. If no +`KEEP` clause is specified, all variables from the scope will be copied as +sub-attributes into the *groupsVariable*. +This is safe but can have a negative impact on performance if there +are many variables in scope or the variables contain massive amounts of data. + +The following example limits the variables that are copied into the *groupsVariable* +to just `name`. The variables `u` and `someCalculation` also present in the scope +will not be copied into *groupsVariable* because they are not listed in the `KEEP` clause: + +```aql +FOR u IN users + LET name = u.name + LET someCalculation = u.value1 + u.value2 + COLLECT city = u.city INTO groups KEEP name + RETURN { + "city" : city, + "userNames" : groups[*].name + } +``` + +`KEEP` is only valid in combination with `INTO`. Only valid variable names can +be used in the `KEEP` clause. `KEEP` supports the specification of multiple +variable names. + +## Group length calculation + +`COLLECT` also provides a special `WITH COUNT` clause that can be used to +determine the number of group members efficiently. + +The simplest form just returns the number of items that made it into the +`COLLECT`: + +```aql +FOR u IN users + COLLECT WITH COUNT INTO length + RETURN length +``` + +The above is equivalent to, but less efficient than: + +```aql +RETURN LENGTH(users) +``` + +The `WITH COUNT` clause can also be used to efficiently count the number +of items in each group: + +```aql +FOR u IN users + COLLECT age = u.age WITH COUNT INTO length + RETURN { + "age" : age, + "count" : length + } +``` + +{{< info >}} +The `WITH COUNT` clause can only be used together with an `INTO` clause. +{{< /info >}} + +## Aggregation + +A `COLLECT` statement can be used to perform aggregation of data per group. To +only determine group lengths, the `WITH COUNT INTO` variant of `COLLECT` can be +used as described before. + +For other aggregations, it is possible to run aggregate functions on the `COLLECT` +results: + +```aql +FOR u IN users + COLLECT ageGroup = FLOOR(u.age / 5) * 5 INTO g + RETURN { + "ageGroup" : ageGroup, + "minAge" : MIN(g[*].u.age), + "maxAge" : MAX(g[*].u.age) + } +``` + +The above however requires storing all group values during the collect operation for +all groups, which can be inefficient. + +The special `AGGREGATE` variant of `COLLECT` allows building the aggregate values +incrementally during the collect operation, and is therefore often more efficient. + +With the `AGGREGATE` variant the above query becomes: + +```aql +FOR u IN users + COLLECT ageGroup = FLOOR(u.age / 5) * 5 + AGGREGATE minAge = MIN(u.age), maxAge = MAX(u.age) + RETURN { + ageGroup, + minAge, + maxAge + } +``` + +The `AGGREGATE` keyword can only be used after the `COLLECT` keyword. If used, it +must directly follow the declaration of the grouping keys. If no grouping keys +are used, it must follow the `COLLECT` keyword directly: + +```aql +FOR u IN users + COLLECT AGGREGATE minAge = MIN(u.age), maxAge = MAX(u.age) + RETURN { + minAge, + maxAge + } +``` + +Only specific expressions are allowed on the right-hand side of each `AGGREGATE` +assignment: + +- on the top level, an aggregate expression must be a call to one of the + supported aggregation functions: + - `LENGTH()` / `COUNT()` + - `MIN()` + - `MAX()` + - `SUM()` + - `AVERAGE()` / `AVG()` + - `STDDEV_POPULATION()` / `STDDEV()` + - `STDDEV_SAMPLE()` + - `VARIANCE_POPULATION()` / `VARIANCE()` + - `VARIANCE_SAMPLE()` + - `UNIQUE()` + - `SORTED_UNIQUE()` + - `COUNT_DISTINCT()` / `COUNT_UNIQUE()` + - `BIT_AND()` + - `BIT_OR()` + - `BIT_XOR()` + +- an aggregate expression must not refer to variables introduced by the `COLLECT` itself + +## `COLLECT` vs. `RETURN DISTINCT` + +In order to make a result set unique, one can either use `COLLECT` or +`RETURN DISTINCT`. + +```aql +FOR u IN users + RETURN DISTINCT u.age +``` + +```aql +FOR u IN users + COLLECT age = u.age + RETURN age +``` + +Behind the scenes, both variants create a *CollectNode*. However, they use +different implementations of `COLLECT` that have different properties: + +- `RETURN DISTINCT` **maintains the order of results**, but it is limited to + a single value. + +- `COLLECT` **changes the order of results** (sorted or undefined), but it + supports multiple values and is more flexible than `RETURN DISTINCT`. + +Aside from `COLLECT`s sophisticated grouping and aggregation capabilities, it +allows you to place a `LIMIT` operation before `RETURN` to potentially stop the +`COLLECT` operation early. + +## `COLLECT` options + +### `method` + +There are two variants of `COLLECT` that the optimizer can choose from: +the *sorted* and the *hash* variant. The `method` option can be used in a +`COLLECT` statement to inform the optimizer about the preferred method, +`"sorted"` or `"hash"`. + +```aql +COLLECT ... OPTIONS { method: "sorted" } +``` + +If no method is specified by the user, then the optimizer will create a plan +that uses the *sorted* method, and an additional plan using the *hash* method +if the `COLLECT` statement qualifies for it. + +If the method is explicitly set to *sorted*, then the optimizer will always use +the *sorted* variant of `COLLECT` and not even create a plan using the *hash* +variant. If it is explicitly set to *hash*, then the optimizer will create a +plan using the *hash* method **only if the `COLLECT` statement qualifies**. +Not all `COLLECT` statements can use the *hash* method, in particular ones that +do not perform any grouping. In case the `COLLECT` statement qualifies, +there will only be one plan that uses the *hash* method. Otherwise, the +optimizer will default to the *sorted* method. + +The *sorted* method requires its input to be sorted by the group criteria +specified in the `COLLECT` clause. To ensure correctness of the result, the +optimizer will automatically insert a `SORT` operation into the query in front +of the `COLLECT` statement. The optimizer may be able to optimize away that +`SORT` operation later if a sorted index is present on the group criteria. + +In case a `COLLECT` statement qualifies for using the *hash* variant, the +optimizer will create an extra plan for it at the beginning of the planning +phase. In this plan, no extra `SORT` statement will be added in front of the +`COLLECT`. This is because the *hash* variant of `COLLECT` does not require +sorted input. Instead, a `SORT` statement will be added after the `COLLECT` to +sort its output. This `SORT` statement may be optimized away again in later +stages. + +If the sort order of the `COLLECT` is irrelevant to the user, adding the extra +instruction `SORT null` after the `COLLECT` will allow the optimizer to remove +the sorts altogether: + +```aql +FOR u IN users + COLLECT age = u.age + SORT null /* note: will be optimized away */ + RETURN age +``` + +Which `COLLECT` variant is used by the optimizer if no preferred method is set +explicitly depends on the optimizer's cost estimations. The created plans with +the different `COLLECT` variants will be shipped through the regular +optimization pipeline. In the end, the optimizer will pick the plan with the +lowest estimated total cost as usual. + +In general, the *sorted* variant of `COLLECT` should be preferred in cases when +there is a sorted index present on the group criteria. In this case the +optimizer can eliminate the `SORT` operation in front of the `COLLECT`, so that +no `SORT` will be left. + +If there is no sorted index available on the group criteria, the up-front sort +required by the *sorted* variant can be expensive. In this case it is likely +that the optimizer will prefer the *hash* variant of `COLLECT`, which does not +require its input to be sorted. + +Which variant of `COLLECT` will actually be used can be figured out by looking +at the execution plan of a query, specifically the comment of the *CollectNode*: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 5 - FOR doc IN coll /* full collection scan, projections: `name` */ + 3 CalculationNode 5 - LET #2 = doc.`name` /* attribute expression */ /* collections used: doc : coll */ + 4 CollectNode 5 - COLLECT name = #2 /* hash */ + 6 SortNode 5 - SORT name ASC /* sorting strategy: standard */ + 5 ReturnNode 5 - RETURN name +``` diff --git a/site/content/arangodb/oem/aql/high-level-operations/filter.md b/site/content/arangodb/oem/aql/high-level-operations/filter.md new file mode 100644 index 0000000000..71fdd19cb2 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/filter.md @@ -0,0 +1,125 @@ +--- +title: '`FILTER` operation in AQL' +menuTitle: FILTER +weight: 15 +description: >- + The `FILTER` operation lets you restrict the results to elements that match + arbitrary logical conditions +--- +## Syntax + +<pre><code>FILTER <em>expression</em></code></pre> + +*expression* must be a condition that evaluates to either `false` or `true`. + +## Usage + +If the condition result is false, the current element is skipped, so it will +not be processed further and not be part of the result. If the condition is +true, the current element is not skipped and can be further processed. + +See [Operators](../operators.md) for a list of comparison operators, logical +operators etc. that you can use in conditions. + +```aql +FOR u IN users + FILTER u.active == true && u.age < 39 + RETURN u +``` + +It is allowed to specify multiple `FILTER` statements in a query, even in +the same block. If multiple `FILTER` statements are used, their results will be +combined with a logical `AND`, meaning all filter conditions must be true to +include an element. + +```aql +FOR u IN users + FILTER u.active == true + FILTER u.age < 39 + RETURN u +``` + +In the above example, all array elements of `users` that have an attribute +`active` with value `true` and that have an attribute `age` with a value less +than `39` (including `null` ones) will be included in the result. All other +elements of `users` will be skipped and not be included in the result produced +by `RETURN`. + +{{< info >}} +See [Accessing Data from Collections](../fundamentals/accessing-data-from-collections.md) +for a description of the impact of non-existent or null attributes. +{{< /info >}} + +While `FILTER` typically occurs in combination with `FOR`, it can also be used +at the top level or in subqueries without a surrounding `FOR` loop. + +```aql +FILTER false +RETURN ASSERT(false, "never reached") +``` + +## Order of operations + +Note that the positions of `FILTER` statements can influence the result of a query. +There are 16 active users in the [test data](../examples-and-query-patterns/_index.md#example-data) +for instance: + +```aql +FOR u IN users + FILTER u.active == true + RETURN u +``` + +We can limit the result set to 5 users at most: + +```aql +FOR u IN users + FILTER u.active == true + LIMIT 5 + RETURN u +``` + +This may return the user documents of Jim, Diego, Anthony, Michael and Chloe for +instance. Which ones are returned is undefined, since there is no `SORT` statement +to ensure a particular order. If we add a second `FILTER` statement to only return +women... + +```aql +FOR u IN users + FILTER u.active == true + LIMIT 5 + FILTER u.gender == "f" + RETURN u +``` + +... it might just return the Chloe document, because the `LIMIT` is applied before +the second `FILTER`. No more than 5 documents arrive at the second `FILTER` block, +and not all of them fulfill the gender criterion, even though there are more than +5 active female users in the collection. A more deterministic result can be achieved +by adding a `SORT` block: + +```aql +FOR u IN users + FILTER u.active == true + SORT u.age ASC + LIMIT 5 + FILTER u.gender == "f" + RETURN u +``` + +This will return the users *Mariah*, *Mary*, and *Isabella*. If sorted by age in +`DESC` order, then the *Sophia* and *Emma* documents are returned. A `FILTER` after a +`LIMIT` is not very common however, and you probably want such a query instead: + +```aql +FOR u IN users + FILTER u.active == true AND u.gender == "f" + SORT u.age ASC + LIMIT 5 + RETURN u +``` + +The significance of where `FILTER` blocks are placed allows that this single +keyword can assume the roles of two SQL keywords, `WHERE` as well as `HAVING`. +AQL's `FILTER` thus works with `COLLECT` aggregates the same as with any other +intermediate result, document attribute etc. diff --git a/site/content/arangodb/oem/aql/high-level-operations/for.md b/site/content/arangodb/oem/aql/high-level-operations/for.md new file mode 100644 index 0000000000..6c80f9d921 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/for.md @@ -0,0 +1,251 @@ +--- +title: '`FOR` operation in AQL' +menuTitle: FOR +weight: 5 +description: >- + The versatile `FOR` operation can iterate over a collection or View, the + elements of an array, or traverse a graph +--- +## Syntax + +The general syntax for iterating over collections and arrays is: + +<pre><code>FOR <em>variableName</em> IN <em>expression</em></code></pre> + +There is also a special variant for [graph traversals](../graphs/traversals.md): + +<pre><code>FOR <em>vertexVariableName</em> [, <em>edgeVariableName</em> [, <em>pathVariableName</em> ] ] IN <em>traversalExpression</em></code></pre> + +For Views, there is a special (optional) [`SEARCH` keyword](search.md): + +<pre><code>FOR <em>variableName</em> IN <em>viewName</em> SEARCH <em>searchExpression</em></code></pre> + +{{< info >}} +Views cannot be used as edge collections in traversals: + +```aql +FOR v IN 1..3 ANY startVertex viewName /* invalid! */ +``` +{{< /info >}} + +All variants can optionally end with an `OPTIONS { … }` clause. + +## Usage + +Each array element returned by *expression* is visited exactly once. It is +required that *expression* returns an array in all cases. The empty array is +allowed, too. The current array element is made available for further processing +in the variable specified by *variableName*. + +```aql +FOR u IN users + RETURN u +``` + +This iterates over all elements of the array referred to as `users`. This array +consists of all documents stored in the collection named `users` in this case. +The `FOR` operation makes the current array element available in a variable `u`, +which is not modified in this example but simply returned as a result using the +`RETURN` operation. + +{{< info >}} +When iterating over a collection, the order of documents is undefined unless you +define an explicit sort order with a [`SORT` operation](sort.md). +{{< /info >}} + +The variable introduced by `FOR` is available until the scope the `FOR` is +placed in is closed. + +Another example that uses a statically declared array of values to iterate over: + +```aql +FOR year IN [ 2011, 2012, 2013 ] + RETURN { "year" : year, "isLeapYear" : year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) } +``` + +Nesting of multiple `FOR` statements is allowed, too. When `FOR` statements are +nested, a cross product of the array elements returned by the individual `FOR` +statements will be created. + +```aql +FOR u IN users + FOR l IN locations + RETURN { "user" : u, "location" : l } +``` + +In this example, there are two array iterations: an outer iteration over the array +`users` plus an inner iteration over the array `locations`. The inner array is +traversed as many times as there are elements in the outer array. For each +iteration, the current values of `users` and `locations` are made available for +further processing in the variable `u` and `l`. + +You can also use subqueries, for example, to iterate over a collection +independently and get the results back as an array, that you can then access in +an outer `FOR` loop: + +```aql +FOR u IN users + LET subquery = (FOR l IN locations RETURN l.location) + RETURN { "user": u, "locations": subquery } +``` + +Also see [Combining queries with subqueries](../fundamentals/subqueries.md). + +## Options + +For collections and Views, the `FOR` construct supports an optional `OPTIONS` +clause to modify the behavior. The general syntax is as follows: + +<pre><code>FOR <em>variableName</em> IN <em>expression</em> OPTIONS { <em>option</em>: <em>value</em>, <em>...</em> }</code></pre> + +### `indexHint` + +For collections, index hints can be given to the optimizer with the `indexHint` +option. The value can be a single **index name** or a list of index names in +order of preference: + +```aql +FOR … IN … OPTIONS { indexHint: "byName" } +``` + +```aql +FOR … IN … OPTIONS { indexHint: ["byName", "byColor"] } +``` + +Whenever there is a chance to potentially use an index for this `FOR` loop, +the optimizer will first check if the specified index can be used. In case of +an array of indexes, the optimizer will check the feasibility of each index in +the specified order. It will use the first suitable index, regardless of +whether it would normally use a different index. + +If none of the specified indexes is suitable, then it falls back to its normal +logic to select another index or fails if `forceIndexHint` is enabled. + +### `forceIndexHint` + +Index hints are not enforced by default. If `forceIndexHint` is set to `true`, +then an error is generated if `indexHint` does not contain a usable index, +instead of using a fallback index or not using an index at all. + +```aql +FOR … IN … OPTIONS { indexHint: … , forceIndexHint: true } +``` + +### `disableIndex` + +<small>Introduced in: v3.9.1</small> + +In some rare cases it can be beneficial to not do an index lookup or scan, +but to do a full collection scan. +An index lookup can be more expensive than a full collection scan if +the index lookup produces many (or even all documents) and the query cannot +be satisfied from the index data alone. + +Consider the following query and an index on the `value` attribute being +present: + +```aql +FOR doc IN collection + FILTER doc.value <= 99 + RETURN doc.other +``` + +In this case, the optimizer will likely pick the index on `value`, because +it will cover the query's `FILTER` condition. To return the value for the +`other` attribute, the query must additionally look up the documents for +each index value that passes the `FILTER` condition. If the number of +index entries is large (close or equal to the number of documents in the +collection), then using an index can cause more work than just scanning +over all documents in the collection. + +The optimizer will likely prefer index scans over full collection scans, +even if an index scan turns out to be slower in the end. +You can force the optimizer to not use an index for any given `FOR` +loop by using the `disableIndex` hint and setting it to `true`: + +```aql +FOR doc IN collection OPTIONS { disableIndex: true } + FILTER doc.value <= 99 + RETURN doc.other +``` + +Using `disableIndex: false` has no effect on geo indexes or fulltext indexes. + +Note that setting `disableIndex: true` plus `indexHint` is ambiguous. In +this case the optimizer will always prefer the `disableIndex` hint. + +### `maxProjections` + +<small>Introduced in: v3.9.1</small> + +By default, the query optimizer will consider up to 5 document attributes +per FOR loop to be used as projections. If more than 5 attributes of a +collection are accessed in a `FOR` loop, the optimizer will prefer to +extract the full document and not use projections. + +The threshold value of 5 attributes is arbitrary and can be adjusted +by using the `maxProjections` hint. +The default value for `maxProjections` is `5`, which is compatible with the +previously hard-coded default value. + +For example, using a `maxProjections` hint of 7, the following query will +extract 7 attributes as projections from the original document: + +```aql +FOR doc IN collection OPTIONS { maxProjections: 7 } + RETURN [ doc.val1, doc.val2, doc.val3, doc.val4, doc.val5, doc.val6, doc.val7 ] +``` + +Normally it is not necessary to adjust the value of `maxProjections`, but +there are a few corner cases where it can make sense: + +- It can be beneficial to increase `maxProjections` when extracting many small + attributes from very large documents, and a full copy of the documents should + be avoided. +- It can be beneficial to decrease `maxProjections` to _avoid_ using + projections, if the cost of projections is higher than doing copies of the + full documents. This can be the case for very small documents. + +{{< info >}} +Starting with version 3.10, `maxProjections` can be used in +[Graph Traversals](../graphs/traversals.md#working-with-named-graphs) (Enterprise Edition only). +{{< /info >}} + +### `useCache` + +<small>Introduced in: v3.10.0</small> + +You can disable in-memory caches that you may have enabled for persistent indexes +on a case-by-case basis. This is useful for queries that access indexes with +enabled in-memory caches, but for which it is known that using the cache will +have a negative performance impact. In this case, you can set the `useCache` +hint to `false`: + +```aql +FOR doc IN collection OPTIONS { useCache: false } + FILTER doc.value == @value + ... +``` + +You can set the hint individually per `FOR` loop. +If you do not set the `useCache` hint, it will implicitly default to `true`. + +The hint does not have any effect on `FOR` loops that do not use indexes, or +on `FOR` loops that access indexes that do not have in-memory caches enabled. +It also does not affect queries for which an existing in-memory +cache cannot be used (i.e. because the query's filter condition does not contain +equality lookups for all index attributes). It cannot be used for `FOR` +operations that iterate over Views or perform graph traversals. + +Also see [Caching of index values](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values). + +### `lookahead` + +The multi-dimensional index type `zkd` supports an optional index hint for +tweaking performance: + +```aql +FOR … IN … OPTIONS { lookahead: 32 } +``` + +See [Multi-dimensional indexes](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md#lookahead-index-hint). diff --git a/site/content/arangodb/oem/aql/high-level-operations/insert.md b/site/content/arangodb/oem/aql/high-level-operations/insert.md new file mode 100644 index 0000000000..88acdfdf4f --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/insert.md @@ -0,0 +1,215 @@ +--- +title: '`INSERT` operation in AQL' +menuTitle: INSERT +weight: 65 +description: >- + You can use the `INSERT` operation to create new documents in a collection +--- +Each `INSERT` operation is restricted to a single collection, and the +[collection name](../../concepts/data-structure/collections.md#collection-names) must not be dynamic. +Only a single `INSERT` statement per collection is allowed per AQL query, and +it cannot be followed by read or write operations that access the same +collection, by traversal operations, or AQL functions that can read documents. + +## Syntax + +The syntax for an insert operation is: + +<pre><code>INSERT <em>document</em> INTO <em>collection</em></code></pre> + +It can optionally end with an `OPTIONS { … }` clause. + +{{< tip >}} +The `IN` keyword is allowed in place of `INTO` and has the same meaning. +{{< /tip >}} + +`collection` must contain the name of the collection into which the documents should +be inserted. `document` is the document to be inserted, and it may or may not contain +a `_key` attribute. If no `_key` attribute is provided, ArangoDB will auto-generate +a value for `_key` value. Inserting a document will also auto-generate a document +revision number for the document. + +```aql +FOR i IN 1..100 + INSERT { value: i } INTO numbers +``` + +An insert operation can also be performed without a `FOR` loop to insert a +single document: + +```aql +INSERT { value: 1 } INTO numbers +``` + +When inserting into an [edge collection](../../concepts/data-models.md#graph-model), +it is mandatory to specify the attributes `_from` and `_to` in document: + +```aql +FOR u IN users + FOR p IN products + FILTER u._key == p.recommendedBy + INSERT { _from: u._id, _to: p._id } INTO recommendations +``` + +## Query options + +The `OPTIONS` keyword followed by an object with query options can optionally +be provided in an `INSERT` operation. + +### `ignoreErrors` + +`ignoreErrors` can be used to suppress query errors that may occur when +violating unique key constraints: + +```aql +FOR i IN 1..1000 + INSERT { + _key: CONCAT('test', i), + name: "test", + foobar: true + } INTO users OPTIONS { ignoreErrors: true } +``` + +### `waitForSync` + +To make sure data are durable when an insert query returns, there is the +`waitForSync` query option: + +```aql +FOR i IN 1..1000 + INSERT { + _key: CONCAT('test', i), + name: "test", + foobar: true + } INTO users OPTIONS { waitForSync: true } +``` + +### `overwrite` + +{{< info >}} +The `overwrite` option is deprecated and superseded by +[overwriteMode](#overwritemode). +{{< /info >}} + +If you want to replace existing documents with documents having the same key +there is the `overwrite` query option. This will let you safely replace the +documents instead of raising a "unique constraint violated error": + +```aql +FOR i IN 1..1000 + INSERT { + _key: CONCAT('test', i), + name: "test", + foobar: true + } INTO users OPTIONS { overwrite: true } +``` + +### `overwriteMode` + +To further control the behavior of INSERT on primary index unique constraint +violations, there is the `overwriteMode` option. It offers the following +modes: + +- `"ignore"`: if a document with the specified `_key` value exists already, + nothing will be done and no write operation will be carried out. The + insert operation will return success in this case. This mode does not + support returning the old document version. Using `RETURN OLD` will trigger + a parse error, as there will be no old version to return. `RETURN NEW` + will only return the document in case it was inserted. In case the + document already existed, `RETURN NEW` will return `null`. +- `"replace"`: if a document with the specified `_key` value exists already, + it will be overwritten with the specified document value. This mode will + also be used when no overwrite mode is specified but the `overwrite` + flag is set to `true`. +- `"update"`: if a document with the specified `_key` value exists already, + it will be patched (partially updated) with the specified document value. +- `"conflict"`: if a document with the specified `_key` value exists already, + return a unique constraint violation error so that the insert operation + fails. This is also the default behavior in case the overwrite mode is + not set, and the `overwrite` flag is `false` or not set either. + +The main use case of inserting documents with overwrite mode `ignore` is +to make sure that certain documents exist in the cheapest possible way. +In case the target document already exists, the `ignore` mode is most +efficient, as it will not retrieve the existing document from storage and +not write any updates to it. + +When using the `update` overwrite mode, the `keepNull` and `mergeObjects` +options control how the update is done. +See [UPDATE operation](update.md#query-options). + +```aql +FOR i IN 1..1000 + INSERT { + _key: CONCAT('test', i), + name: "test", + foobar: true + } INTO users OPTIONS { overwriteMode: "update", keepNull: true, mergeObjects: false } +``` + +### `exclusive` + +The RocksDB engine does not require collection-level locks. +Different write operations on the same collection do not block each other, as +long as there are no _write-write conflicts_ on the same documents. From an application +development perspective it can be desired to have exclusive write access on collections, +to simplify the development. Note that writes do not block reads in RocksDB. +Exclusive access can also speed up modification queries, because we avoid conflict checks. + +Use the `exclusive` option to achieve this effect on a per query basis: + +```aql +FOR doc IN collection + INSERT { myval: doc.val + 1 } INTO users + OPTIONS { exclusive: true } +``` + +### `refillIndexCaches` + +Whether to add new entries to in-memory index caches if document insertions +affect the edge index or cache-enabled persistent indexes. + +```aql +INSERT { _from: "vert/A", _to: "vert/B" } INTO coll + OPTIONS { refillIndexCaches: true } +``` + +## Returning the inserted documents + +The inserted documents can also be returned by the query. In this case, the `INSERT` +statement can be a `RETURN` statement (intermediate `LET` statements are allowed, too). +To refer to the inserted documents, the `INSERT` statement introduces a pseudo-value +named `NEW`. + +The documents contained in `NEW` will contain all attributes, even those auto-generated by +the database (e.g. `_id`, `_key`, `_rev`). + +```aql +INSERT document INTO collection RETURN NEW +``` + +Following is an example using a variable named `inserted` to return the inserted +documents. For each inserted document, the document key is returned: + +```aql +FOR i IN 1..100 + INSERT { value: i } + INTO users + LET inserted = NEW + RETURN inserted._key +``` + +## Transactionality + +On a single server, an insert operation is executed transactionally in an +all-or-nothing fashion. + +A query may execute intermediate transaction commits in case the running +transaction (AQL query) hits the specified size thresholds. In this case, the +query's operations carried out so far are committed and not rolled back in case +of a later abort/rollback. This behavior can be controlled by adjusting the +intermediate commit settings for the RocksDB engine. See +[Known limitations for AQL queries](../fundamentals/limitations.md#storage-engine-properties). + +For sharded collections, the entire query and/or insert operation may not be +transactional, especially if it involves different shards and/or DB-Servers. diff --git a/site/content/arangodb/oem/aql/high-level-operations/let.md b/site/content/arangodb/oem/aql/high-level-operations/let.md new file mode 100644 index 0000000000..d8665ac121 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/let.md @@ -0,0 +1,69 @@ +--- +title: '`LET` operation in AQL' +menuTitle: LET +weight: 35 +description: >- + You can use the `LET` operation to assign an arbitrary value to a variable +--- +The variable is introduced in the scope the `LET` statement is placed in. +You cannot change the value once assigned. + +## Syntax + +<pre><code>LET <em>variableName</em> = <em>expression</em></code></pre> + +*expression* can be a simple expression or a subquery. + +For allowed variable names [AQL Syntax](../fundamentals/syntax.md#names). + +## Usage + +Variables are immutable in AQL, which means they cannot be re-assigned: + +```aql +LET a = [1, 2, 3] // initial assignment + +a = PUSH(a, 4) // syntax error, unexpected identifier +LET a = PUSH(a, 4) // parsing error, variable 'a' is assigned multiple times +LET b = PUSH(a, 4) // allowed, result: [1, 2, 3, 4] +``` + +`LET` statements are mostly used to declare complex computations and to avoid +repeated computations of the same value at multiple parts of a query. + +```aql +FOR u IN users + LET numRecommendations = LENGTH(u.recommendations) + RETURN { + "user" : u, + "numRecommendations" : numRecommendations, + "isPowerUser" : numRecommendations >= 10 + } +``` + +In the above example, the computation of the number of recommendations is +factored out using a `LET` statement, thus avoiding computing the value twice in +the `RETURN` statement. + +Another use case for `LET` is to declare a complex computation in a subquery, +making the whole query more readable. + +```aql +FOR u IN users + LET friends = ( + FOR f IN friends + FILTER u.id == f.userId + RETURN f + ) + LET memberships = ( + FOR m IN memberships + FILTER u.id == m.userId + RETURN m + ) + RETURN { + "user" : u, + "friends" : friends, + "numFriends" : LENGTH(friends), + "memberShips" : memberships + } +``` diff --git a/site/content/arangodb/oem/aql/high-level-operations/limit.md b/site/content/arangodb/oem/aql/high-level-operations/limit.md new file mode 100644 index 0000000000..c34ba21d02 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/limit.md @@ -0,0 +1,96 @@ +--- +title: '`LIMIT` operation in AQL' +menuTitle: LIMIT +weight: 30 +description: >- + The `LIMIT` operation allows you to reduce the number of results to at most + the specified number and optionally skip results using an offset for pagination +--- +## Syntax + +Two general forms of `LIMIT` are: + +<pre><code>LIMIT <em>count</em> +LIMIT <em>offset</em>, <em>count</em></code></pre> + +The first form allows specifying only the `count` value whereas the second form +allows specifying both `offset` and `count`. The first form is identical using +the second form with an `offset` value of `0`. + +## Usage + +```aql +FOR u IN users + LIMIT 5 + RETURN u +``` + +Above query returns five documents of the `users` collection. +It could also be written as `LIMIT 0, 5` for the same result. +Which documents it returns is rather arbitrary because collections have no +defined order for the documents they contain. A `LIMIT` operation should usually +be accompanied with a `SORT` operation to explicitly specify a sorting order +unless any five documents are acceptable for you. However, also consider that if +you run a query multiple times with varying `LIMIT` offsets for pagination, +you can miss results or get duplicate results if the sort order is undefined. + +{{< info >}} +In case multiple documents contain the same `SORT` attribute value, the result +set does not contain the tied documents in a fixed order as the order between +them is undefined. Additionally, the `SORT` operation does not guarantee a stable +sort if there is no unique value to sort by. + +If a fixed total order is required, you can use a tiebreaker. Sort by an +additional attribute that can break the ties. If the application has a preferred +attribute that indicates the order of documents with the same value, then use +this attribute. If there is no such attribute, you can still achieve a stable +sort by using the `_id` system attribute as it is unique and present in every +document. + +```aql +FOR u IN users + SORT u.firstName, u._id // break name ties with the document ID + LIMIT 5 + RETURN u +``` +{{< /info >}} + +The `offset` value specifies how many elements from the result shall be +skipped. It must be 0 or greater. The `count` value specifies how many +elements should be at most included in the result. + +```aql +FOR u IN users + SORT u.firstName, u.lastName, u.id DESC + LIMIT 2, 5 + RETURN u +``` + +In above example, the documents of `users` are sorted, the first two results +get skipped, and the query returns the next five user documents. + +{{< info >}} +Variables, expressions, and subqueries cannot be used for `offset` and `count`. +The values for `offset` and `count` must be known at query compile time, +which means that you can only use number literals, bind parameters or +expressions that can be resolved at query compile time. +{{< /info >}} + +Where a `LIMIT` is used in relation to other operations in a query has meaning. +`LIMIT` operations before `FILTER`s in particular can change the result +significantly, because the operations are executed in the order in which they +are written in the query. See [FILTER](filter.md#order-of-operations) +for a detailed example. + +The `LIMIT` operation never applies to write operations (`INSERT`, `UPDATE`, +`REPLACE`, `REMOVE`, `UPSERT`) but only their returned results. In the following +example, five documents are created, regardless of the `LIMIT 2`. The `LIMIT` +operation only constrains the number of documents returned by the query (via +`RETURN`) to the first two: + +```aql +FOR i IN 1..5 + INSERT { value: i } INTO coll + LIMIT 2 + RETURN NEW +``` diff --git a/site/content/arangodb/oem/aql/high-level-operations/remove.md b/site/content/arangodb/oem/aql/high-level-operations/remove.md new file mode 100644 index 0000000000..7963c48b70 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/remove.md @@ -0,0 +1,185 @@ +--- +title: '`REMOVE` operation in AQL' +menuTitle: REMOVE +weight: 50 +description: >- + You can use the `REMOVE` operation to delete documents from a collection +--- +Each `REMOVE` operation is restricted to a single collection, and the +[collection name](../../concepts/data-structure/collections.md#collection-names) must not be dynamic. +Only a single `REMOVE` statement per collection is allowed per AQL query, and +it cannot be followed by read or write operations that access the same collection, by +traversal operations, or AQL functions that can read documents. + +## Syntax + +The syntax for a remove operation is: + +<pre><code>REMOVE <em>keyExpression</em> IN <em>collection</em></code></pre> + +It can optionally end with an `OPTIONS { … }` clause. + +`collection` must contain the name of the collection to remove the documents +from. `keyExpression` must be an expression that contains the document identification. +This can either be a string (which must then contain the +[document key](../../concepts/data-structure/documents/_index.md#document-keys)) or a +document, which must contain a `_key` attribute. + +The following queries are thus equivalent: + +```aql +FOR u IN users + REMOVE { _key: u._key } IN users +``` + +```aql +FOR u IN users + REMOVE u._key IN users +``` + +```aql +FOR u IN users + REMOVE u IN users +``` + +A remove operation can remove arbitrary documents, and the documents +do not need to be identical to the ones produced by a preceding `FOR` statement: + +```aql +FOR i IN 1..1000 + REMOVE { _key: CONCAT('test', i) } IN users +``` + +```aql +FOR u IN users + FILTER u.active == false + REMOVE { _key: u._key } IN backup +``` + +A single document can be removed as well, using a document key string or a +document with `_key` attribute: + +```aql +REMOVE 'john' IN users +``` + +```aql +LET doc = DOCUMENT('users/john') +REMOVE doc IN users +``` + +The restriction of a single remove operation per query and collection +applies. The following query causes an _access after data-modification_ +error because of the third remove operation: + +```aql +REMOVE 'john' IN users +REMOVE 'john' IN backups // OK, different collection +REMOVE 'mary' IN users // Error, users collection again +``` + +## Query options + +### `ignoreErrors` + +`ignoreErrors` can be used to suppress query errors that may occur when trying to +remove non-existing documents. For example, the following query will fail if one +of the to-be-deleted documents does not exist: + +```aql +FOR i IN 1..1000 + REMOVE { _key: CONCAT('test', i) } IN users +``` + +By specifying the `ignoreErrors` query option, these errors can be suppressed so +the query completes: + +```aql +FOR i IN 1..1000 + REMOVE { _key: CONCAT('test', i) } IN users OPTIONS { ignoreErrors: true } +``` + +### `waitForSync` + +To make sure data has been written to disk when a query returns, there is the `waitForSync` +query option: + +```aql +FOR i IN 1..1000 + REMOVE { _key: CONCAT('test', i) } IN users OPTIONS { waitForSync: true } +``` + +### `ignoreRevs` + +In order to not accidentally remove documents that have been updated since you last fetched +them, you can use the option `ignoreRevs` to either let ArangoDB compare the `_rev` values and +only succeed if they still match, or let ArangoDB ignore them (default): + +```aql +FOR i IN 1..1000 + REMOVE { _key: CONCAT('test', i), _rev: "1287623" } IN users OPTIONS { ignoreRevs: false } +``` + +### `exclusive` + +The RocksDB engine does not require collection-level locks. Different write +operations on the same collection do not block each other, as +long as there are no _write-write conflicts_ on the same documents. From an application +development perspective it can be desired to have exclusive write access on collections, +to simplify the development. Note that writes do not block reads in RocksDB. +Exclusive access can also speed up modification queries, because we avoid conflict checks. + +Use the `exclusive` option to achieve this effect on a per query basis: + +```aql +FOR doc IN collection + REPLACE doc._key + WITH { replaced: true } + OPTIONS { exclusive: true } +``` + +### `refillIndexCaches` + +Whether to delete existing entries from in-memory index caches and refill them +if document removals affect the edge index or cache-enabled persistent indexes. + +```aql +REMOVE { _key: "123" } IN edgeColl + OPTIONS { refillIndexCaches: true } +``` + +## Returning the removed documents + +The removed documents can also be returned by the query. In this case, the +`REMOVE` statement must be followed by a `RETURN` statement (intermediate `LET` +statements are allowed, too).`REMOVE` introduces the pseudo-value `OLD` to +refer to the removed documents: + +```aql +REMOVE keyExpression IN collection options RETURN OLD +``` + +Following is an example using a variable named `removed` for capturing the removed +documents. For each removed document, the document key will be returned. + +```aql +FOR u IN users + REMOVE u IN users + LET removed = OLD + RETURN removed._key +``` + +## Transactionality + +On a single server, the document removal is executed transactionally in an +all-or-nothing fashion. + +A query may execute intermediate transaction commits in case the running +transaction (AQL query) hits the specified size thresholds. In this case, the +query's operations carried out so far are committed and not rolled back in case +of a later abort/rollback. This behavior can be controlled by adjusting the +intermediate commit settings for the RocksDB engine. See +[Known limitations for AQL queries](../fundamentals/limitations.md#storage-engine-properties). + +For sharded collections, the entire query and/or remove operation may not be +transactional, especially if it involves different shards and/or DB-Servers. diff --git a/site/content/arangodb/oem/aql/high-level-operations/replace.md b/site/content/arangodb/oem/aql/high-level-operations/replace.md new file mode 100644 index 0000000000..b2aa732641 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/replace.md @@ -0,0 +1,306 @@ +--- +title: '`REPLACE` operation in AQL' +menuTitle: REPLACE +weight: 60 +description: >- + The `REPLACE` operation removes all attributes of a document and sets the + given attributes, excluding immutable system attributes +--- +Each `REPLACE` operation is restricted to a single collection, and the +[collection name](../../concepts/data-structure/collections.md#collection-names) must not be dynamic. +Only a single `REPLACE` statement per collection is allowed per AQL query, and +it cannot be followed by read or write operations that access the same collection, +by traversal operations, or AQL functions that can read documents. + +You cannot replace the `_id`, `_key`, and `_rev` system attributes, but you can +replace the `_from` and `_to` attributes. + +Replacing a document modifies the document's revision number (`_rev` attribute) +with a server-generated value. + +## Syntax + +The two syntaxes for a replace operation are: + +<pre><code>REPLACE <em>document</em> IN <em>collection</em> +REPLACE <em>keyExpression</em> WITH <em>document</em> IN <em>collection</em></code></pre> + +Both variants can optionally end with an `OPTIONS { … }` clause. + +`collection` must contain the name of the collection in which the document +should be replaced. + +`document` must be an object and contain the attributes and values to set. +**All existing attributes** in the stored document **are removed** from it and +**only the provided attributes are set** (excluding the immutable `_id` and +`_key` attributes and the system-managed `_rev` attribute). This distinguishes +the `REPLACE` from the `UPDATE` operation, which only affects the attributes +you specify in the operation and doesn't change other attributes of the stored +document. + +### `REPLACE <document> IN <collection>` + +Using the first syntax, the `document` object must have a `_key` attribute with +the document key. The existing document with this key is replaced with the +attributes provided by the `document` object (except for the `_id`, `_key`, and +`_rev` system attributes). + +The following query replaces the document identified by the key `my_key` in the +`users` collection, only setting a `name` and a `status` attribute. The key is +passed via the `_key` attribute alongside other attributes: + +```aql +REPLACE { _key: "my_key", name: "Jon", status: "active" } IN users +``` + +The following query is invalid because the object does not contain a `_key` +attribute and thus it is not possible to determine the document to +be replaced: + +```aql +REPLACE { name: "Jon" } IN users +``` + +You can combine the `REPLACE` operation with a `FOR` loop to determine the +necessary key attributes, like shown below: + +```aql +FOR u IN users + REPLACE { _key: u._key, name: CONCAT(u.firstName, " ", u.lastName), status: u.status } IN users +``` + +Note that the `REPLACE` and `FOR` operations are independent of each other and +`u` does not automatically define a document for the `REPLACE` statement. +Thus, the following query is invalid: + +```aql +FOR u IN users + REPLACE { name: CONCAT(u.firstName, " ", u.lastName), status: u.status } IN users +``` + +### `REPLACE <keyExpression> WITH <document> IN <collection>` + +Using the second syntax, the document to replace is defined by the +`keyExpression`. It can either be a string with the document key, an object +which contains a `_key` attribute with the document key, or an expression that +evaluates to either of these two. The existing document with this key is +replaced with the attributes provided by the `document` object (except for +the `_id`, `_key`, and `_rev` system attributes). + +The following query replaces the document identified by the key `my_key` in the +`users` collection, only setting a `name` and a `status` attribute. The key is +passed as a string in the `keyExpression`. The attributes to set are passed +separately as the `document` object: + +```aql +REPLACE "my_key" WITH { name: "Jon", status: "active" } IN users +``` + +The `document` object may contain a `_key` attribute, but it is ignored. + +You cannot define the document to replace using an `_id` attribute, nor pass a +document identifier as a string (like `"users/john"`). However, you can use +`PARSE_IDENTIFIER(<id>).key` as `keyExpression` to get the document key as a +string: + +```aql +LET key = PARSE_IDENTIFIER("users/john").key +REPLACE key WITH { ... } IN users +``` + +### Comparison of the syntaxes + +Both syntaxes of the `REPLACE` operation allow you to define the document to +modify and the attributes to set. The document to update is effectively +identified by a document key in combination with the specified collection. + +The `REPLACE` operation supports different ways of specifying the document key. +You can choose the syntax variant that is the most convenient for you. + +The following queries are equivalent: + +```aql +FOR u IN users + REPLACE u WITH { name: CONCAT(u.firstName, " ", u.lastName), status: u.status } IN users +``` + +```aql +FOR u IN users + REPLACE u._key WITH { name: CONCAT(u.firstName, " ", u.lastName), status: u.status } IN users +``` + +```aql +FOR u IN users + REPLACE { _key: u._key } WITH { name: CONCAT(u.firstName, " ", u.lastName), status: u.status } IN users +``` + +```aql +FOR u IN users + REPLACE { _key: u._key, name: CONCAT(u.firstName, " ", u.lastName), status: u.status } IN users +``` + +## Dynamic key expressions + +A `REPLACE` operation may replace arbitrary documents, using either of the two +syntaxes: + +```aql +FOR i IN 1..1000 + REPLACE { _key: CONCAT("test", i), name: "Paula", status: "active" } IN users +``` + +```aql +FOR i IN 1..1000 + REPLACE CONCAT("test", i) WITH { name: "Paula", status: "active" } IN users +``` + +## Target a different collection + +The documents a `REPLACE` operation modifies can be in a different collection +than the ones produced by a preceding `FOR` operation: + +```aql +FOR u IN users + FILTER u.active == false + REPLACE u WITH { status: "inactive", name: u.name } IN backup +``` + +Note how documents are read from the `users` collection but replaced in another +collection called `backup`. Both collections need to use matching document keys +for this to work. + +Although the `u` variable holds a whole document, it is only used to define the +target document. The `_key` attribute of the object is extracted and the target +document is solely defined by the document key string value and the specified +collection of the `REPLACE` operation (`backup`). There is no link to the +original collection (`users`). + +## Query options + +You can optionally set query options for the `REPLACE` operation: + +```aql +REPLACE ... IN users OPTIONS { ... } +``` + +### `ignoreErrors` + +You can use `ignoreErrors` to suppress query errors that may occur when trying to +replace non-existing documents or when violating unique key constraints: + +```aql +FOR i IN 1..1000 + REPLACE CONCAT("test", i) + WITH { foobar: true } IN users + OPTIONS { ignoreErrors: true } +``` + +You cannot modify the `_id`, `_key`, and `_rev` system attributes, but attempts +to change them are ignored and not considered errors. + +### `waitForSync` + +To make sure data are durable when a replace query returns, there is the `waitForSync` +query option: + +```aql +FOR i IN 1..1000 + REPLACE CONCAT("test", i) + WITH { foobar: true } IN users + OPTIONS { waitForSync: true } +``` + +### `ignoreRevs` + +In order to not accidentally overwrite documents that have been modified since you last fetched +them, you can use the option `ignoreRevs` to either let ArangoDB compare the `_rev` value and only +succeed if they still match, or let ArangoDB ignore them (default): + +```aql +FOR i IN 1..1000 + REPLACE { _key: CONCAT("test", i), _rev: "1287623" } + WITH { foobar: true } IN users + OPTIONS { ignoreRevs: false } +``` + +### `exclusive` + +The RocksDB engine does not require collection-level locks. Different write +operations on the same collection do not block each other, as +long as there are no _write-write conflicts_ on the same documents. From an application +development perspective it can be desired to have exclusive write access on collections, +to simplify the development. Note that writes do not block reads in RocksDB. +Exclusive access can also speed up modification queries, because we avoid conflict checks. + +Use the `exclusive` option to achieve this effect on a per query basis: + +```aql +FOR doc IN collection + REPLACE doc + WITH { replaced: true } IN collection + OPTIONS { exclusive: true } +``` + +### `refillIndexCaches` + +Whether to update existing entries in in-memory index caches if documents +replacements affect the edge index or cache-enabled persistent indexes. + +```aql +REPLACE { _key: "123", _from: "vert/C", _to: "vert/D" } IN edgeColl + OPTIONS { refillIndexCaches: true } +``` + +## Returning the modified documents + +You can optionally return the documents modified by the query. In this case, the `REPLACE` +operation needs to be followed by a `RETURN` operation. Intermediate `LET` operations are +allowed, too. These operations can refer to the pseudo-variables `OLD` and `NEW`. +The `OLD` pseudo-variable refers to the document revisions before the replace, and `NEW` +refers to the document revisions after the replace. + +Both `OLD` and `NEW` contain all document attributes, even those not specified +in the replace expression. + +```aql +REPLACE document IN collection options RETURN OLD +REPLACE document IN collection options RETURN NEW +REPLACE keyExpression WITH document IN collection options RETURN OLD +REPLACE keyExpression WITH document IN collection options RETURN NEW +``` + +Following is an example using a variable named `previous` to return the original +documents before modification. For each replaced document, the document key is +returned: + +```aql +FOR u IN users + REPLACE u WITH { value: "test" } IN users + LET previous = OLD + RETURN previous._key +``` + +The following query uses the `NEW` pseudo-value to return the replaced +documents, without some of their system attributes: + +```aql +FOR u IN users + REPLACE u WITH { value: "test" } IN users + LET replaced = NEW + RETURN UNSET(replaced, "_key", "_id", "_rev") +``` + +## Transactionality + +On a single server, replace operations are executed transactionally in an +all-or-nothing fashion. + +A query may execute intermediate transaction commits in case the running +transaction (AQL query) hits the specified size thresholds. In this case, the +query's operations carried out so far are committed and not rolled back in case +of a later abort/rollback. This behavior can be controlled by adjusting the +intermediate commit settings for the RocksDB engine. See +[Known limitations for AQL queries](../fundamentals/limitations.md#storage-engine-properties). + +For sharded collections, the entire query and/or replace operation may not be +transactional, especially if it involves different shards and/or DB-Servers. diff --git a/site/content/arangodb/oem/aql/high-level-operations/return.md b/site/content/arangodb/oem/aql/high-level-operations/return.md new file mode 100644 index 0000000000..c4344e0865 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/return.md @@ -0,0 +1,212 @@ +--- +title: '`RETURN` operation in AQL' +menuTitle: RETURN +weight: 10 +description: >- + You can use the `RETURN` operation to produce the result of a query +--- +A `RETURN` operation is mandatory at the end of each block in a data access query, +otherwise the query result would be undefined. Using `RETURN` at the top level +in data modification queries is optional. + +## Syntax + +The general syntax for `RETURN` is: + +<pre><code>RETURN <em>expression</em></code></pre> + +There is also a variant [`RETURN DISTINCT`](#return-distinct). + +The *expression* returned by `RETURN` is produced for each iteration in the block the +`RETURN` statement is placed in. That means the result of a `RETURN` statement +is **always an array**. This includes an empty array if no documents matched the +query and a single return value returned as array with one element. + +To return all elements from the currently iterated array without modification, +the following simple form can be used: + +<pre><code>FOR <em>variableName</em> IN <em>expression</em> + RETURN <em>variableName</em></code></pre> + +As `RETURN` allows specifying an expression, arbitrary computations can be +performed to calculate the result elements. Any of the variables valid in the +scope the `RETURN` is placed in can be used for the computations. + +## Usage + +To iterate over all documents of a collection called *users* and return the +full documents, you can write: + +```aql +FOR u IN users + RETURN u +``` + +In each iteration of the for-loop, a document of the *users* collection is +assigned to a variable *u* and returned unmodified in this example. To return +only one attribute of each document, you could use a different return expression: + +```aql +FOR u IN users + RETURN u.name +``` + +Or to return multiple attributes, an object can be constructed like this: + +```aql +FOR u IN users + RETURN { name: u.name, age: u.age } +``` + +Note: `RETURN` will close the current scope and eliminate all local variables in it. +This is important to remember when working with [subqueries](../fundamentals/subqueries.md). + +[Dynamic attribute names](../fundamentals/data-types.md#objects--documents) are +supported as well: + +```aql +FOR u IN users + RETURN { [ u._id ]: u.age } +``` + +The document *_id* of every user is used as expression to compute the +attribute key in this example: + +```json +[ + { + "users/9883": 32 + }, + { + "users/9915": 27 + }, + { + "users/10074": 69 + } +] +``` + +The result contains one object per user with a single key/value pair each. +This is usually not desired. For a single object, that maps user IDs to ages, +the individual results need to be merged and returned with another `RETURN`: + +```aql +RETURN MERGE( + FOR u IN users + RETURN { [ u._id ]: u.age } +) +``` + +```json +[ + { + "users/10074": 69, + "users/9883": 32, + "users/9915": 27 + } +] +``` + +Keep in mind that if the key expression evaluates to the same value multiple +times, only one of the key/value pairs with the duplicate name will survive +[`MERGE()`](../functions/document-object.md#merge). To avoid this, you can go without +dynamic attribute names, use static names instead and return all document +properties as attribute values: + +```aql +FOR u IN users + RETURN { name: u.name, age: u.age } +``` + +```json +[ + { + "name": "John Smith", + "age": 32 + }, + { + "name": "James Hendrix", + "age": 69 + }, + { + "name": "Katie Foster", + "age": 27 + } +] +``` + +## `RETURN DISTINCT` + +`RETURN` can optionally be followed by the `DISTINCT` keyword. +The `DISTINCT` keyword will ensure uniqueness of the values returned by the +`RETURN` statement: + +<pre><code>FOR <em>variableName</em> IN <em>expression</em> + RETURN DISTINCT <em>expression</em></code></pre> + +`RETURN DISTINCT` is not allowed on the top-level of a query if there is no `FOR` +loop preceding it. + +Below example returns `["foo", "bar", "baz"]`: + +```aql +FOR value IN ["foo", "bar", "bar", "baz", "foo"] + RETURN DISTINCT value +``` + +{{< tip >}} +`RETURN DISTINCT` will not change the order of the results it is applied on, +unlike [`COLLECT`](collect.md#collect-vs-return-distinct). +{{< /tip >}} + +If the `DISTINCT` is applied on an expression that itself is an array or a subquery, +the `DISTINCT` will not make the values in each array or subquery result unique, but instead +ensure that the result contains only distinct arrays or subquery results. To make +the result of an array or a subquery unique, simply apply the `DISTINCT` for the +array or the subquery. + +For example, the following query will apply `DISTINCT` on its subquery results, +but not inside the subquery: + +```aql +FOR what IN 1..2 + RETURN DISTINCT ( + FOR i IN [ 1, 2, 3, 4, 1, 3 ] + RETURN i + ) +``` + +Here we will have a `FOR` loop with two iterations that each execute a subquery. The +`DISTINCT` here is applied on the two subquery results. Both subqueries return the +same result value (that is `[ 1, 2, 3, 4, 1, 3 ]`), so after `DISTINCT` there will +only be one occurrence of the value `[ 1, 2, 3, 4, 1, 3 ]` left: + +```json +[ + [ 1, 2, 3, 4, 1, 3 ] +] +``` + +If the goal is to apply the `DISTINCT` inside the subquery, it needs to be moved +there: + +```aql +FOR what IN 1..2 + LET sub = ( + FOR i IN [ 1, 2, 3, 4, 1, 3 ] + RETURN DISTINCT i + ) + RETURN sub +``` + +In the above case, the `DISTINCT` will make the subquery results unique, so that +each subquery will return a unique array of values (`[ 1, 2, 3, 4 ]`). As the subquery +is executed twice and there is no `DISTINCT` on the top-level, that array will be +returned twice: + +```json +[ + [ 1, 2, 3, 4 ], + [ 1, 2, 3, 4 ] +] +``` diff --git a/site/content/arangodb/oem/aql/high-level-operations/search.md b/site/content/arangodb/oem/aql/high-level-operations/search.md new file mode 100644 index 0000000000..c0a3084152 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/search.md @@ -0,0 +1,337 @@ +--- +title: '`SEARCH` operation in AQL' +menuTitle: SEARCH +weight: 20 +description: >- + The `SEARCH` operation lets you filter Views, accelerated by the underlying + indexes +--- +The `SEARCH` operation guarantees to use View indexes for an efficient +execution plan. If you use the `FILTER` keyword for Views, no indexes are +utilized and the filtering is performed as a post-processing step. + +Conceptually, a View is just another document data source, +similar to an array or a document/edge collection, over which you can iterate +using a [`FOR` operation](for.md) in AQL: + +```aql +FOR doc IN viewName + RETURN doc +``` + +The optional `SEARCH` operation provides the capabilities to: + +- filter documents based on AQL Boolean expressions and functions +- match documents located in different collections backed by a fast index +- sort the result set based on how closely each document matched the + search conditions + +See [`arangosearch` Views](../../index-and-search/arangosearch/arangosearch-views-reference.md) and +[`search-alias` Views](../../index-and-search/arangosearch/search-alias-views-reference.md) on how to set up Views. + +## Syntax + +The `SEARCH` keyword is followed by an ArangoSearch filter expressions, which +is mostly comprised of calls to ArangoSearch AQL functions. + +<pre><code>FOR <em>doc</em> IN <em>viewName</em> + SEARCH <em>expression</em> + OPTIONS { … } + ...</code></pre> + +## Usage + +The `SEARCH` statement, in contrast to `FILTER`, is treated as a part of the +`FOR` operation, not as an individual statement. It cannot be placed freely +in a query nor multiple times in the body of a `FOR` loop. `FOR ... IN` must be +followed by the name of a View, not a collection. The `SEARCH` operation has to +follow next, other operations before `SEARCH` such as `FILTER`, `COLLECT` etc. +are not allowed in this position. Subsequent operations are possible after +`SEARCH` and the expression however, including `SORT` to order the search +results based on a ranking value computed by the View. + +*expression* must be an ArangoSearch expression. The full power of ArangoSearch +is harnessed and exposed via special [ArangoSearch functions](../functions/arangosearch.md), +during both the search and sort stages. On top of that, common AQL operators +are supported. + +Note that inline expressions and a few other things are not supported by +`SEARCH`. The server will raise a query error in case of an invalid expression. + +The `OPTIONS` keyword and an object can optionally follow the search expression +to set [Search Options](#search-options). + +### Logical operators + +Logical or Boolean operators allow you to combine multiple search conditions. + +- `AND`, `&&` (conjunction) +- `OR`, `||` (disjunction) +- `NOT`, `!` (negation / inversion) + +[Operator precedence](../operators.md#operator-precedence) needs to be taken +into account and can be controlled with parentheses. + +Consider the following contrived expression: + +`doc.value < 0 OR doc.value > 5 AND doc.value IN [-10, 10]` + +`AND` has a higher precedence than `OR`. The expression is equivalent to: + +`doc.value < 0 OR (doc.value > 5 AND doc.value IN [-10, 10])` + +The conditions are thus: +- values less than 0 +- values greater than 5, but only if it is 10 + (or -10, but this can never be fulfilled) + +Parentheses can be used as follows to apply the `AND` condition to both of the +`OR` conditions: + +`(doc.value < 0 OR doc.value > 5) AND doc.value IN [-10, 10]` + +The conditions are now: +- values less than 0, but only if it is -10 +- values greater than 5, but only if it is 10 + +### Comparison operators + +- `==` (equal) +- `<=` (less than or equal) +- `>=` (greater than or equal) +- `<` (less than) +- `>` (greater than) +- `!=` (unequal) +- `IN` (contained in array or range), also `NOT IN` +- `LIKE` (equal with wildcards), also `NOT LIKE` + +Also see the [`IN_RANGE()` function](../functions/arangosearch.md#in_range) for +an alternative to a combination of `<`, `<=`, `>`, `>=` operators for range +searches. + +```aql +FOR doc IN viewName + SEARCH ANALYZER(doc.text == "quick" OR doc.text == "brown", "text_en") + // -- or -- + SEARCH ANALYZER(doc.text IN ["quick", "brown"], "text_en") + RETURN doc +``` + +{{< warning >}} +The alphabetical order of characters is not taken into account by ArangoSearch, +i.e. range queries in SEARCH operations against Views will not follow the +language rules as per the defined Analyzer locale (except for the +[`collation` Analyzer](../../index-and-search/analyzers.md#collation)) nor the server language +(startup option `--default-language`)! +Also see [Known Issues](../../release-notes/version-3.11/known-issues-in-3-11.md#arangosearch). +{{< /warning >}} + +### Array comparison operators + +[Array comparison operators](../operators.md#array-comparison-operators) are +supported: + +```aql +LET tokens = TOKENS("some input", "text_en") // ["some", "input"] +FOR doc IN myView SEARCH tokens ALL IN doc.text RETURN doc // dynamic conjunction +FOR doc IN myView SEARCH tokens ANY IN doc.text RETURN doc // dynamic disjunction +FOR doc IN myView SEARCH tokens NONE IN doc.text RETURN doc // dynamic negation +FOR doc IN myView SEARCH tokens ALL > doc.text RETURN doc // dynamic conjunction with comparison +FOR doc IN myView SEARCH tokens ANY <= doc.text RETURN doc // dynamic disjunction with comparison +FOR doc IN myView SEARCH tokens NONE < doc.text RETURN doc // dynamic negation with comparison +FOR doc IN myView SEARCH tokens AT LEAST (1+1) IN doc.text RETURN doc // dynamically test for a subset of elements +``` + +The following operators are equivalent in `SEARCH` expressions: +- `ALL IN`, `ALL ==`, `NONE !=`, `NONE NOT IN` +- `ANY IN`, `ANY ==` +- `NONE IN`, `NONE ==`, `ALL !=`, `ALL NOT IN` +- `ALL >`, `NONE <=` +- `ALL >=`, `NONE <` +- `ALL <`, `NONE >=` +- `ALL <=`, `NONE >` +- `AT LEAST (...) IN`, `AT LEAST (...) ==` +- `AT LEAST (1) IN`, `ANY IN` + +The stored attribute referenced on the right side of the operator is like a +single, primitive value. In case of multiple tokens, it is like having multiple +such values as opposed to an array of values, even if the actual document +attribute is an array. `IN` and `==` as part of array comparison operators are +treated the same in `SEARCH` expressions for ease of use. The behavior is +different outside of `SEARCH`, where `IN` needs to be followed by an array. + +### Question mark operator + +You can use the [Question mark operator](../operators.md#question-mark-operator) +to perform [Nested searches with ArangoSearch](../../index-and-search/arangosearch/nested-search.md) +(Enterprise Edition only): + +```aql +FOR doc IN myView + SEARCH doc.dimensions[? FILTER CURRENT.type == "height" AND CURRENT.value > 40] + RETURN doc +``` + +It allows you to match nested objects in arrays that satisfy multiple conditions +each, and optionally define how often these conditions should be fulfilled for +the entire array. You need to configure the View specifically for this type of +search using the `nested` property in [`arangosearch` Views](../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) +or in the definition of [Inverted Indexes](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md#nested-search-enterprise-edition) +that you can add to [`search-alias` Views](../../index-and-search/arangosearch/search-alias-views-reference.md). + +## Handling of non-indexed fields + +Document attributes which are not configured to be indexed by a View are +treated by `SEARCH` as non-existent. This affects tests against the documents +emitted from the View only. + +For example, given a collection `myCol` with the following documents: + +```js +{ "someAttr": "One", "anotherAttr": "One" } +{ "someAttr": "Two", "anotherAttr": "Two" } +``` + +… with an `arangosearch` View where `someAttr` is indexed by the following View `myView`: + +```js +{ + "type": "arangosearch", + "links": { + "myCol": { + "fields": { + "someAttr": {} + } + } + } +} +``` + +… a search on `someAttr` yields the following result: + +```aql +FOR doc IN myView + SEARCH doc.someAttr == "One" + RETURN doc +``` + +```json +[ { "someAttr": "One", "anotherAttr": "One" } ] +``` + +A search on `anotherAttr` yields an empty result because only `someAttr` +is indexed by the View: + +```aql +FOR doc IN myView + SEARCH doc.anotherAttr == "One" + RETURN doc +``` + +```json +[] +``` + +You can use the special `includeAllFields` +[`arangosearch` View property](../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) +to index all (sub-)attributes of the source documents if desired. + +## `SEARCH` with `SORT` + +The documents emitted from a View can be sorted by attribute values with the +standard [`SORT()` operation](sort.md), using one or multiple +attributes, in ascending or descending order (or a mix thereof). + +```aql +FOR doc IN viewName + SORT doc.text, doc.value DESC + RETURN doc +``` + +If the (left-most) fields and their sorting directions match up with the +[primary sort order](../../index-and-search/arangosearch/performance.md#primary-sort-order) definition +of the View then the `SORT` operation is optimized away. + +Apart from simple sorting, it is possible to sort the matched View documents by +relevance score (or a combination of score and attribute values if desired). +The document search via the `SEARCH` keyword and the sorting via the +[ArangoSearch Scoring Functions](../functions/arangosearch.md#scoring-functions), +namely `BM25()` and `TFIDF()`, are closely intertwined. +The query given in the `SEARCH` expression is not only used to filter documents, +but also is used with the scoring functions to decide which document matches +the query best. Other documents in the View also affect this decision. + +Therefore the ArangoSearch scoring functions can work _only_ on documents +emitted from a View, as both the corresponding `SEARCH` expression and the View +itself are consulted in order to sort the results. + +```aql +FOR doc IN viewName + SEARCH ... + SORT BM25(doc) DESC + RETURN doc +``` + +The [`BOOST()` function](../functions/arangosearch.md#boost) can be used to +fine-tune the resulting ranking by weighing sub-expressions in `SEARCH` +differently. + +If there is no `SEARCH` operation prior to calls to scoring functions or if +the search expression does not filter out documents (e.g. `SEARCH true`) then +a score of `0` will be returned for all documents. + +## Search Options + +The `SEARCH` operation supports an optional `OPTIONS` clause to modify the +behavior. The general syntax is as follows: + +<pre><code>SEARCH <em>expression</em> OPTIONS { <em>option</em>: <em>value</em>, <em>...</em> }</code></pre> + +### `collections` + +You can specify an array of strings with collection names to restrict the search +to certain source collections. + +Given a View with three linked collections `coll1`, `coll2`, and `coll3`, you +can return documents from the first two collections only and ignore the third +collection by setting the `collections` option to `["coll1", "coll2"]`: + +```aql +FOR doc IN viewName + SEARCH true OPTIONS { collections: ["coll1", "coll2"] } + RETURN doc +``` + +The search expression `true` in the above example matches all View documents. +You can use any valid expression here while limiting the scope to the chosen +source collections. + +### `conditionOptimization` + +You can specify one of the following values for this option to control how +search criteria get optimized: + +- `"auto"` (default): convert conditions to disjunctive normal form (DNF) and + apply optimizations. Removes redundant or overlapping conditions, but can + take quite some time even for a low number of nested conditions. +- `"none"`: search the index without optimizing the conditions. +<!-- Internal only: nodnf, noneg --> + +See [Optimizing View and inverted index query performance](../../index-and-search/arangosearch/performance.md#condition-optimization-options) +for an example. + +### `countApproximate` + +This option controls how the total count of rows is calculated if the `fullCount` +option is enabled for a query or when a `COLLECT WITH COUNT` clause is executed. +You can set it to one of the following values: + +- `"exact"` (default): rows are actually enumerated for a precise count. +- `"cost"`: a cost-based approximation is used. Does not enumerate rows and + returns an approximate result with O(1) complexity. Gives a precise result + if the `SEARCH` condition is empty or if it contains a single term query + only (e.g. `SEARCH doc.field == "value"`), the usual eventual consistency + of Views aside. + +See [Optimizing View and inverted index query performance](../../index-and-search/arangosearch/performance.md#count-approximation) +for an example. diff --git a/site/content/arangodb/oem/aql/high-level-operations/sort.md b/site/content/arangodb/oem/aql/high-level-operations/sort.md new file mode 100644 index 0000000000..2c99b2e8ef --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/sort.md @@ -0,0 +1,109 @@ +--- +title: '`SORT` operation in AQL' +menuTitle: SORT +weight: 25 +description: >- + The `SORT` operation allows you to specify one or multiple sort criteria and + directions to control the order of query results or the elements of arrays +--- +## Syntax + +The general syntax is: + +<pre><code>SORT <em>expression</em> <em>direction</em></code></pre> + +## Usage + +The `SORT` operation sorts the already produced intermediate results of the +current block. For example, the following query sorts by `lastName` +(in ascending order), then `firstName` (in ascending order), then by `id` +(in descending order): + +```aql +FOR u IN users + SORT u.lastName, u.firstName, u.id DESC + RETURN u +``` + +Specifying the *direction* is optional. The default (implicit) direction for a +sort expression is the ascending order. To explicitly specify the sort direction, +the keywords `ASC` (ascending) and `DESC` (descending) can be used. Multiple sort +criteria can be separated using commas. In this case, the direction is specified +for each expression separately. + +The following example first sorts documents by `lastName` in ascending order and +then by `firstName` in ascending order. + +```aql +SORT doc.lastName, doc.firstName +``` + +The following example first sorts documents by `lastName` in descending order +and then by `firstName` in ascending order. + +```aql +SORT doc.lastName DESC, doc.firstName +``` + +The following example first sorts documents by `lastName` in ascending order +and then by `firstName` in descending order. + +```aql +SORT doc.lastName, doc.firstName DESC +``` + +{{< warning >}} +When iterating over a collection, the order of documents is always +**undefined unless an explicit sort order is defined** with a `SORT` operation. + +If the values you sort by are not unique, the order among tied documents is +undefined and you may want to sort by another attribute to break ties. +If the application has a preferred attribute that indicates the order of +documents with the same value, then use this attribute. If there is no such +attribute, you can still achieve a stable sort by using the `_id` system attribute +as it is unique and present in every document. + +```aql +FOR u IN users + SORT u.firstName, u._id // break name ties with the document ID + RETURN u +``` +{{< /warning >}} + +Constant `SORT` expressions can be used to indicate that no particular +sort order is desired. + +```aql +SORT null +``` + +Constant `SORT` expressions are optimized away by the AQL +optimizer during optimization, but specifying them explicitly may enable further +optimizations if the optimizer does not need to take into account any particular +sort order. This is especially the case after a `COLLECT` statement, which is +supposed to produce a sorted result. Specifying an extra `SORT null` after the +`COLLECT` statement allows to AQL optimizer to remove the post-sorting of the +collect results altogether. Also see [`COLLECT` option `method`](collect.md#method). + +In case of a sequence of `SORT` operations, the last one is always the one +that is performed unless a previous `SORT` expression is more accurate. +If the optimization rules `remove-redundant-sorts` and `remove-redundant-sorts-2` +are deactivated in the query's execution, then the last `SORT` is always the one +that wins, despite the accuracy. For example, consider the following query with +multiple consecutive `SORT` operations: + +```aql +FOR friend IN friends + SORT friend.friend.name, friend.id, friend.age + SORT friend.age, friend.id + SORT friend.age + RETURN friend +``` + +If the optimization rules mentioned above are deactivated, then the last `SORT` +becomes operative and the collection is sorted by `friend.age`. If the +optimization rules are active, then the second `SORT` becomes operative because +it covers the same `friend.age` attribute and additionally sorts by another +attribute in case of ties, making it more accurate. However, if the attributes +in the second `SORT` expression are in opposite order, as in +`SORT friend.id, friend.age`, then the last `SORT` is operative. diff --git a/site/content/arangodb/oem/aql/high-level-operations/update.md b/site/content/arangodb/oem/aql/high-level-operations/update.md new file mode 100644 index 0000000000..0a7ede0857 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/update.md @@ -0,0 +1,429 @@ +--- +title: '`UPDATE` operation in AQL' +menuTitle: UPDATE +weight: 55 +description: >- + The `UPDATE` operation partially modifies a document with the given attributes, + by adding new and updating existing attributes +--- +Each `UPDATE` operation is restricted to a single collection, and the +[collection name](../../concepts/data-structure/collections.md#collection-names) must not be dynamic. +Only a single `UPDATE` statement per collection is allowed per AQL query, and +it cannot be followed by read or write operations that access the same collection, +by traversal operations, or AQL functions that can read documents. + +You cannot update the `_id`, `_key`, and `_rev` system attributes, but you can +update the `_from` and `_to` attributes. + +Updating a document modifies the document's revision number (`_rev` attribute) +with a server-generated value. + +## Syntax + +The two syntaxes for an update operation are: + +<pre><code>UPDATE <em>document</em> IN <em>collection</em> +UPDATE <em>keyExpression</em> WITH <em>document</em> IN <em>collection</em></code></pre> + +Both variants can optionally end with an `OPTIONS { … }` clause. + +`collection` must contain the name of the collection in which the document +should be updated. + +`document` must be an object and contain the attributes and values to update. +**Attributes that don't yet exist** in the stored document **are added** to it. +**Existing attributes are set to the provided attribute values** (excluding the +immutable `_id` and `_key` attributes and the system-managed `_rev` attribute). +The operation leaves other existing attributes not specified in `document` untouched. +This distinguishes the `UPDATE` from the `REPLACE` operation, which affects all +attributes of the stored document and not only the attributes you specify in the +operation. + +Sub-attributes are recursively merged by default, but you can let top-level +attributes replace existing ones by disabling the [`mergeObjects` option](#mergeobjects). + +### `UPDATE <document> IN <collection>` + +Using the first syntax, the `document` object must have a `_key` attribute with +the document key. The existing document with this key is updated with the +attributes provided by the `document` object (except for the `_id`, `_key`, and +`_rev` system attributes). + +The following query adds or updates the `name` attribute of the document +identified by the key `my_key` in the `users` collection. The key is passed via +the `_key` attribute alongside other attributes: + +```aql +UPDATE { _key: "my_key", name: "Jon" } IN users +``` + +The following query is invalid because the object does not contain a `_key` +attribute and thus it is not possible to determine the document to +be updated: + +```aql +UPDATE { name: "Jon" } IN users +``` + +You can combine the `UPDATE` operation with a `FOR` loop to determine the +necessary key attributes, like shown below: + +```aql +FOR u IN users + UPDATE { _key: u._key, name: CONCAT(u.firstName, " ", u.lastName) } IN users +``` + +Note that the `UPDATE` and `FOR` operations are independent of each other and +`u` does not automatically define a document for the `UPDATE` statement. +Thus, the following query is invalid: + +```aql +FOR u IN users + UPDATE { name: CONCAT(u.firstName, " ", u.lastName) } IN users +``` + +### `UPDATE <keyExpression> WITH <document> IN <collection>` + +Using the second syntax, the document to update is defined by the +`keyExpression`. It can either be a string with the document key, an object +which contains a `_key` attribute with the document key, or an expression that +evaluates to either of these two. The existing document with this key is +updated with the attributes provided by the `document` object (except for +the `_id`, `_key`, and `_rev` system attributes). + +The following query adds or updates the `name` attribute of the document +identified by the key `my_key` in the `users` collection. The key is passed as +a string in the `keyExpression`. The attributes to add or update are passed +separately as the `document` object: + +```aql +UPDATE "my_key" WITH { name: "Jon" } IN users +``` + +The `document` object may contain a `_key` attribute, but it is ignored. + +You cannot define the document to update using an `_id` attribute, nor pass a +document identifier as a string (like `"users/john"`). However, you can use +`PARSE_IDENTIFIER(<id>).key` as `keyExpression` to get the document key as a +string: + +```aql +LET key = PARSE_IDENTIFIER("users/john").key +UPDATE key WITH { ... } IN users +``` + +### Comparison of the syntaxes + +Both syntaxes of the `UPDATE` operation allow you to define the document to +modify and the attributes to add or update. The document to update is effectively +identified by a document key in combination with the specified collection. + +The `UPDATE` operation supports different ways of specifying the document key. +You can choose the syntax variant that is the most convenient for you. + +The following queries are equivalent: + +```aql +FOR u IN users + UPDATE u WITH { name: CONCAT(u.firstName, " ", u.lastName) } IN users +``` + +```aql +FOR u IN users + UPDATE u._key WITH { name: CONCAT(u.firstName, " ", u.lastName) } IN users +``` + +```aql +FOR u IN users + UPDATE { _key: u._key } WITH { name: CONCAT(u.firstName, " ", u.lastName) } IN users +``` + +```aql +FOR u IN users + UPDATE { _key: u._key, name: CONCAT(u.firstName, " ", u.lastName) } IN users +``` + +## Dynamic key expressions + +An `UPDATE` operation may update arbitrary documents, using either of the two +syntaxes: + +```aql +FOR i IN 1..1000 + UPDATE { _key: CONCAT("test", i), name: "Paula" } IN users +``` + +```aql +FOR i IN 1..1000 + UPDATE CONCAT("test", i) WITH { name: "Paula" } IN users +``` + +## Target a different collection + +The documents an `UPDATE` operation modifies can be in a different collection +than the ones produced by a preceding `FOR` operation: + +```aql +FOR u IN users + FILTER u.active == false + UPDATE u WITH { status: "inactive" } IN backup +``` + +Note how documents are read from the `users` collection but updated in another +collection called `backup`. Both collections need to use matching document keys +for this to work. + +Although the `u` variable holds a whole document, it is only used to define the +target document. The `_key` attribute of the object is extracted and the target +document is solely defined by the document key string value and the specified +collection of the `UPDATE` operation (`backup`). There is no link to the +original collection (`users`). + +## Using the current value of a document attribute + +The pseudo-variable `OLD` is not supported inside of `WITH` clauses (it is +available after `UPDATE`). To access the current attribute value, you can +usually refer to a document via the variable of the `FOR` loop, which is used +to iterate over a collection: + +```aql +FOR doc IN users + UPDATE doc WITH { + fullName: CONCAT(doc.firstName, " ", doc.lastName) + } IN users +``` + +If there is no loop, because a single document is updated only, then there +might not be a variable like above (`doc`), which would let you refer to the +document which is being updated: + +```aql +UPDATE "john" WITH { ... } IN users +``` + +To access the current value in this situation, you need to retrieve the document +first and store it in a variable: + +```aql +LET doc = FIRST(FOR u IN users FILTER u._key == "john" RETURN u) +UPDATE doc WITH { + fullName: CONCAT(doc.firstName, " ", doc.lastName) +} IN users +``` + +You can modify an existing attribute based on its current value this way, +to increment a counter for instance: + +```aql +UPDATE doc WITH { + karma: doc.karma + 1 +} IN users +``` + +If the attribute `karma` doesn't exist yet, `doc.karma` evaluates to `null`. +The expression `null + 1` results in the new attribute `karma` being set to `1`. +If the attribute does exist, then it is increased by `1`. + +Arrays can be mutated, too: + +```aql +UPDATE doc WITH { + hobbies: PUSH(doc.hobbies, "swimming") +} IN users +``` + +If the attribute `hobbies` doesn't exist yet, it is conveniently initialized +as `[ "swimming" ]` and otherwise extended. + +## Query options + +You can optionally set query options for the `UPDATE` operation: + +```aql +UPDATE ... IN users OPTIONS { ... } +``` + +### `ignoreErrors` + +You can use `ignoreErrors` to suppress query errors that may occur when trying to +update non-existing documents or when violating unique key constraints: + +```aql +FOR i IN 1..1000 + UPDATE CONCAT("test", i) + WITH { foobar: true } IN users + OPTIONS { ignoreErrors: true } +``` + +You cannot modify the `_id`, `_key`, and `_rev` system attributes, but attempts +to change them are ignored and not considered errors. + +### `keepNull` + +When updating an attribute to the `null` value, ArangoDB does not remove the +attribute from the document but stores this `null` value. To remove attributes +in an update operation, set them to `null` and set the `keepNull` option to +`false`. This removes the attributes you specify but not any previously stored +attributes with the `null` value: + +```aql +FOR u IN users + UPDATE u WITH { foobar: true, notNeeded: null } IN users + OPTIONS { keepNull: false } +``` + +The above query removes the `notNeeded` attribute from the documents and updates +the `foobar` attribute normally. + +Only top-level attributes and sub-attributes can be removed this way +(e.g. `{ attr: { sub: null } }`) but not attributes of objects that are nested +inside of arrays (e.g. `{ attr: [ { nested: null } ] }`). + +### `mergeObjects` + +The option `mergeObjects` controls whether object contents are +merged if an object attribute is present in both the `UPDATE` query and in the +to-be-updated document. + +The following query sets the updated document's `name` attribute to the exact +same value that is specified in the query. This is due to the `mergeObjects` option +being set to `false`: + +```aql +FOR u IN users + UPDATE u WITH { + name: { first: "foo", middle: "b.", last: "baz" } + } IN users + OPTIONS { mergeObjects: false } +``` + +Contrary, the following query merges the contents of the `name` attribute in the +original document with the value specified in the query: + +```aql +FOR u IN users + UPDATE u WITH { + name: { first: "foo", middle: "b.", last: "baz" } + } IN users + OPTIONS { mergeObjects: true } +``` + +Attributes in `name` that are present in the to-be-updated document but not in the +query are preserved. Attributes that are present in both are overwritten +with the values specified in the query. + +Note: the default value for `mergeObjects` is `true`, so there is no need to specify it +explicitly. + +### `waitForSync` + +To make sure data are durable when an update query returns, there is the `waitForSync` +query option: + +```aql +FOR u IN users + UPDATE u WITH { foobar: true } IN users + OPTIONS { waitForSync: true } +``` + +### `ignoreRevs` + +In order to not accidentally overwrite documents that have been modified since you last fetched +them, you can use the option `ignoreRevs` to either let ArangoDB compare the `_rev` value and +only succeed if they still match, or let ArangoDB ignore them (default): + +```aql +FOR i IN 1..1000 + UPDATE { _key: CONCAT("test", i), _rev: "1287623" } + WITH { foobar: true } IN users + OPTIONS { ignoreRevs: false } +``` + +### `exclusive` + +The RocksDB engine does not require collection-level locks. Different write +operations on the same collection do not block each other, as +long as there are no _write-write conflicts_ on the same documents. From an application +development perspective it can be desired to have exclusive write access on collections, +to simplify the development. Note that writes do not block reads in RocksDB. +Exclusive access can also speed up modification queries, because we avoid conflict checks. + +Use the `exclusive` option to achieve this effect on a per query basis: + +```aql +FOR doc IN collection + UPDATE doc + WITH { updated: true } IN collection + OPTIONS { exclusive: true } +``` + +### `refillIndexCaches` + +Whether to update existing entries in in-memory index caches if document updates +affect the edge index or cache-enabled persistent indexes. + +```aql +UPDATE { _key: "123", _from: "vert/C", _to: "vert/D" } IN edgeColl + OPTIONS { refillIndexCaches: true } +``` + +## Returning the modified documents + +You can optionally return the documents modified by the query. In this case, the `UPDATE` +operation needs to be followed by a `RETURN` operation. Intermediate `LET` operations are +allowed, too. These operations can refer to the pseudo-variables `OLD` and `NEW`. +The `OLD` pseudo-variable refers to the document revisions before the update, and `NEW` +refers to the document revisions after the update. + +Both `OLD` and `NEW` contain all document attributes, even those not specified +in the update expression. + +```aql +UPDATE document IN collection options RETURN OLD +UPDATE document IN collection options RETURN NEW +UPDATE keyExpression WITH document IN collection options RETURN OLD +UPDATE keyExpression WITH document IN collection options RETURN NEW +``` + +Following is an example using a variable named `previous` to capture the original +documents before modification. For each modified document, the document key is returned. + +```aql +FOR u IN users + UPDATE u WITH { value: "test" } IN users + LET previous = OLD + RETURN previous._key +``` + +The following query uses the `NEW` pseudo-value to return the updated documents, +without some of the system attributes: + +```aql +FOR u IN users + UPDATE u WITH { value: "test" } IN users + LET updated = NEW + RETURN UNSET(updated, "_key", "_id", "_rev") +``` + +It is also possible to return both `OLD` and `NEW`: + +```aql +FOR u IN users + UPDATE u WITH { value: "test" } IN users + RETURN { before: OLD, after: NEW } +``` + +## Transactionality + +On a single server, updates are executed transactionally in an all-or-nothing +fashion. + +A query may execute intermediate transaction commits in case the running +transaction (AQL query) hits the specified size thresholds. In this case, the +query's operations carried out so far are committed and not rolled back in case +of a later abort/rollback. This behavior can be controlled by adjusting the +intermediate commit settings for the RocksDB engine. See +[Known limitations for AQL queries](../fundamentals/limitations.md#storage-engine-properties). + +For sharded collections, the entire query and/or update operation may not be +transactional, especially if it involves different shards and/or DB-Servers. diff --git a/site/content/arangodb/oem/aql/high-level-operations/upsert.md b/site/content/arangodb/oem/aql/high-level-operations/upsert.md new file mode 100644 index 0000000000..a4c705a249 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/upsert.md @@ -0,0 +1,276 @@ +--- +title: '`UPSERT` operation in AQL' +menuTitle: UPSERT +weight: 70 +description: >- + An `UPSERT` operation either modifies an existing document, or creates a new + document if it does not exist +--- +`UPSERT` looks up a single document that matches the provided example. +If there is no match, an insert operation is executed to create a +document. If a document is found, you can either update or replace the document. +These subtypes are called **upsert** (update or insert) and **repsert** +(replace or insert). + +Each `UPSERT` operation is restricted to a single collection, and the +[collection name](../../concepts/data-structure/collections.md#collection-names) must not be dynamic. +Only a single `UPSERT` statement per collection is allowed per AQL query, and +it cannot be followed by read or write operations that access the same collection, by +traversal operations, or AQL functions that can read documents. + +## Syntax + +The syntax for an upsert operation: + +<pre><code>UPSERT <em>searchExpression</em> +INSERT <em>insertExpression</em> +UPDATE <em>updateExpression</em> +IN <em>collection</em></code></pre> + +The syntax for a repsert operation: + +<pre><code>UPSERT <em>searchExpression</em> +INSERT <em>insertExpression</em> +REPLACE <em>updateExpression</em> +IN <em>collection</em></code></pre> + +Both variants can optionally end with an `OPTIONS { … }` clause. + +When using the `UPDATE` variant of the `UPSERT` operation, the found document +is partially updated, meaning only the attributes specified in +*updateExpression* are updated or added. When using the `REPLACE` variant +of `UPSERT` (repsert), the found document is replaced with the content of +*updateExpression*. + +Updating a document modifies the document's revision number with a server-generated value. +The system attributes `_id`, `_key`, and `_rev` cannot be updated, but `_from` and `_to` +can be modified. + +The *searchExpression* contains the document to be looked for. It must be an +**object literal** (`UPSERT { <key>: <value>, ... } ...`) without dynamic +attribute names. In case no such document can be found in *collection*, a new +document is inserted into the collection as specified in the *insertExpression*. + +In case at least one document in *collection* matches the *searchExpression*, it is +updated using the *updateExpression*. When more than one document in the collection +matches the *searchExpression*, it is undefined which of the matching documents is +updated. It is therefore often sensible to make sure by other means (such as unique +indexes, application logic etc.) that at most one document matches *searchExpression*. + +The following query looks for a document in the `users` collection with a specific +`name` attribute value. If the document exists, its *logins* attribute is increased +by one. If it does not exist, a new document is inserted, consisting of the +attributes `name`, `logins`, and `dateCreated`: + +```aql +UPSERT { name: 'superuser' } +INSERT { name: 'superuser', logins: 1, dateCreated: DATE_NOW() } +UPDATE { logins: OLD.logins + 1 } IN users +``` + +Note that in the `UPDATE` case it is possible to refer to the previous version of the +document using the `OLD` pseudo-value. + +## Query options + +### `ignoreErrors` + +The `ignoreErrors` option can be used to suppress query errors that may occur +when trying to violate unique key constraints. + +### `keepNull` + +When updating an attribute to the `null` value, ArangoDB does not remove the +attribute from the document but stores this `null` value. To remove attributes +in an update operation, set them to `null` and set the `keepNull` option to +`false`. This removes the attributes you specify but not any previously stored +attributes with the `null` value: + +```aql +UPSERT { _key: "mary" } +INSERT { _key: "mary", name: "Mary", notNeeded: 123 } +UPDATE { foobar: true, notNeeded: null } +IN users OPTIONS { keepNull: false } +``` + +If no document with the key `mary` exists, the above query creates such a user +document with a `notNeeded` attribute. If it exists already, it removes the +`notNeeded` attribute from the document and updates the `foobar` attribute +normally. + +Only top-level attributes and sub-attributes can be removed this way +(e.g. `{ attr: { sub: null } }`) but not attributes of objects that are nested +inside of arrays (e.g. `{ attr: [ { nested: null } ] }`). + +### `mergeObjects` + +The option `mergeObjects` controls whether object contents are +merged if an object attribute is present in both the `UPDATE` query and in the +to-be-updated document. + +{{< tip >}} +The default value for `mergeObjects` is `true`, so there is no need to specify it +explicitly. +{{< /tip >}} + +### `waitForSync` + +To make sure data are durable when an update query returns, there is the `waitForSync` +query option. + +### `ignoreRevs` + +In order to not accidentally update documents that have been written and updated since +you last fetched them you can use the option `ignoreRevs` to either let ArangoDB compare +the `_rev` value and only succeed if they still match, or let ArangoDB ignore them (default): + +```aql +FOR i IN 1..1000 + UPSERT { _key: CONCAT('test', i)} + INSERT {foobar: false} + UPDATE {_rev: "1287623", foobar: true } + IN users OPTIONS { ignoreRevs: false } +``` + +{{< info >}} +You need to add the `_rev` value in the *updateExpression*. It is not used +within the *searchExpression*. Even worse, if you use an outdated `_rev` in the +*searchExpression*, `UPSERT` triggers the `INSERT` path instead of the +`UPDATE` path, because it has not found a document exactly matching the +*searchExpression*. +{{< /info >}} + +### `exclusive` + +The RocksDB engine does not require collection-level locks. Different write +operations on the same collection do not block each other, as +long as there are no _write-write conflicts_ on the same documents. From an application +development perspective it can be desired to have exclusive write access on collections, +to simplify the development. Note that writes do not block reads in RocksDB. +Exclusive access can also speed up modification queries, because we avoid conflict checks. + +Use the `exclusive` option to achieve this effect on a per query basis: + +```aql +FOR i IN 1..1000 + UPSERT { _key: CONCAT('test', i) } + INSERT { foobar: false } + UPDATE { foobar: true } + IN users OPTIONS { exclusive: true } +``` + +### `indexHint` + +The `indexHint` option is used as a hint for the document lookup +performed as part of the `UPSERT` operation, and can help in cases such as +`UPSERT` not picking the best index automatically. + +```aql +UPSERT { a: 1234 } + INSERT { a: 1234, name: "AB" } + UPDATE { name: "ABC" } IN myCollection + OPTIONS { indexHint: "index_name" } +``` + +The index hint is passed through to an internal `FOR` loop that is used for the +lookup. Also see [`indexHint` Option of the `FOR` Operation](for.md#indexhint). + +Inverted indexes cannot be used for `UPSERT` lookups. + +### `forceIndexHint` + +Makes the index or indexes specified in `indexHint` mandatory if enabled. The +default is `false`. Also see +[`forceIndexHint` Option of the `FOR` Operation](for.md#forceindexhint). + +```aql +UPSERT { a: 1234 } + INSERT { a: 1234, name: "AB" } + UPDATE { name: "ABC" } IN myCollection + OPTIONS { indexHint: … , forceIndexHint: true } +``` + +## Returning documents + +`UPSERT` statements can optionally return data. To do so, they need to be followed +by a `RETURN` statement (intermediate `LET` statements are allowed, too). These statements +can optionally perform calculations and refer to the pseudo-values `OLD` and `NEW`. +In case the upsert performed an insert operation, `OLD` has a value of `null`. +In case the upsert performed an update or replace operation, `OLD` contains the +previous version of the document, before update/replace. + +`NEW` is always populated. It contains the inserted document in case the +upsert performed an insert, or the updated/replaced document in case it performed an +update/replace. + +This can also be used to check whether the upsert has performed an insert or an update +internally: + +```aql +UPSERT { name: 'superuser' } +INSERT { name: 'superuser', logins: 1, dateCreated: DATE_NOW() } +UPDATE { logins: OLD.logins + 1 } IN users +RETURN { doc: NEW, type: OLD ? 'update' : 'insert' } +``` + +## Transactionality and Limitations + +- On a single server, upserts are generally executed transactionally in an + all-or-nothing fashion. + + For sharded collections in cluster deployments, the entire query and/or upsert + operation may not be transactional, especially if it involves different shards, + DB-Servers, or both. + +- Queries may execute intermediate transaction commits in case the running + transaction (AQL query) hits the specified size thresholds. This writes the + data that has been modified so far and it is not rolled back in case of a later + abort/rollback of the transaction. + + Such **intermediate commits** can occur for `UPSERT` operations over all + documents of a large collection, for instance. This has the side-effect that + atomicity of this operation cannot be guaranteed anymore and ArangoDB cannot + guarantee that "read your own writes" in upserts work. + + This is only an issue if you write a query where your search condition would + hit the same document multiple times, and only if you have large transactions. + You can adjust the behavior of the RocksDB storage engine by increasing the + `intermediateCommit` thresholds for data size and operation counts. + +- The lookup and the insert/update/replace parts are executed one after + another, so that other operations in other threads can happen in + between. This means if multiple `UPSERT` queries run concurrently, they + may all determine that the target document does not exist and then + create it multiple times! + + Note that due to this gap between the lookup and insert/update/replace, + even with a unique index, duplicate key errors or conflicts can occur. + But if they occur, the application/client code can execute the same query + again. + + To prevent this from happening, you should add a unique index to the lookup + attribute(s). Note that in the cluster a unique index can only be created if + it is equal to the shard key attribute of the collection or at least contains + it as a part. + + An alternative to making an UPSERT statement work atomically is to use the + `exclusive` option to limit write concurrency for this collection to 1, which + helps avoiding conflicts but is bad for throughput! + +- `UPSERT` operations do not observe their own writes correctly in cluster + deployments. They only do for OneShard databases with the `cluster-one-shard` + optimizer rule active. + + If upserts in a query create new documents and would then semantically hit the + same documents again, the operation may incorrectly use the `INSERT` branch to + create more documents instead of the `UPDATE`/`REPLACE` branch to update the + previously created documents. + + If upserts find existing documents for updating/replacing, you can access the + current document via the `OLD` pseudo-variable, but this may hold the initial + version of the document from before the query even if it has been modified + by `UPSERT` in the meantime. + +- The lookup attribute(s) from the search expression should be indexed in order + to improve the `UPSERT` performance. Ideally, the search expression contains the + shard key, as this allows the lookup to be restricted to a single shard. diff --git a/site/content/arangodb/oem/aql/high-level-operations/window.md b/site/content/arangodb/oem/aql/high-level-operations/window.md new file mode 100644 index 0000000000..494345d4d7 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/window.md @@ -0,0 +1,282 @@ +--- +title: '`WINDOW` operation in AQL' +menuTitle: WINDOW +weight: 45 +description: >- + Aggregate adjacent documents or value ranges with a sliding window to + calculate running totals, rolling averages, and other statistical properties +--- +The `WINDOW` operation can be used for aggregations over adjacent documents, or +preceding and / or following rows in other words. It can also aggregate based +on a value or duration range relative to a document attribute. + +The operation performs a `COLLECT AGGREGATE`-like operation on a set +of query rows. However, whereas a `COLLECT` operation groups multiple query +rows into a single result group, a `WINDOW` operation produces a result for +each query row: + +- The row for which function evaluation occurs is called the current row. +- The query rows related to the current row over which function evaluation + occurs, comprise the window frame for the current row. + +Window frames are determined with respect to the current row: + +- By defining a window frame to be all rows from the query start to the current + row, you can compute running totals for each row. +- By defining a frame as extending *N* rows on either side of the current row, + you can compute rolling averages. + +## Syntax + +There are two syntax variants for `WINDOW` operations. + +**Row-based** (adjacent documents): + +<pre><code>WINDOW { preceding: <em>numPrecedingRows</em>, following: <em>numFollowingRows</em> } AGGREGATE <em>variableName</em> = <em>aggregateExpression</em></code></pre> + +**Range-based** (value or duration range): + +<pre><code>WINDOW <em>rangeValue</em> WITH { preceding: <em>offsetPreceding</em>, following: <em>offsetFollowing</em> } AGGREGATE <em>variableName</em> = <em>aggregateExpression</em></code></pre> + +Calls to the following functions are supported in aggregation expressions: +- `LENGTH()` / `COUNT()` +- `MIN()` +- `MAX()` +- `SUM()` +- `AVERAGE()` / `AVG()` +- `STDDEV_POPULATION()` / `STDDEV()` +- `STDDEV_SAMPLE()` +- `VARIANCE_POPULATION()` / `VARIANCE()` +- `VARIANCE_SAMPLE()` +- `UNIQUE()` +- `SORTED_UNIQUE()` +- `COUNT_DISTINCT()` / `COUNT_UNIQUE()` +- `BIT_AND()` +- `BIT_OR()` +- `BIT_XOR()` + +## Row-based Aggregation + +The first syntax form of `WINDOW` allows aggregating over a fixed number of +rows, following or preceding the current row. It is also possible to define +that **all** preceding or following rows should be aggregated (`"unbounded"`). +The number of rows has to be determined at query compile time. + +Below query demonstrates the use of window frames to compute **running totals** +as well as **rolling averages** computed from the current row and the rows that +immediately precede and follow it: + +```aql +--- +name: windowAggregationRow +description: '' +dataset: observationsSampleDataset +--- +FOR t IN observations + SORT t.time + WINDOW { preceding: 1, following: 1 } + AGGREGATE rollingAverage = AVG(t.val), rollingSum = SUM(t.val) + WINDOW { preceding: "unbounded", following: 0} + AGGREGATE cumulativeSum = SUM(t.val) + RETURN { + time: t.time, + subject: t.subject, + val: t.val, + rollingAverage, // average of the window's values + rollingSum, // sum of the window's values + cumulativeSum // running total + } +``` + +The row order is controlled by the `SORT` operation on the `time` attribute. + +The first `WINDOW` operation aggregates the previous, current, and next row +(preceding and following is set to 1) and calculates the average and sum of +these three values. In case of the first row, there is no preceding row but a +following row, hence the values `10` and `0` are added up to calculate the sum, +which is divided by 2 to compute the average. For the second row, the values +`10`, `0` and `9` are summed up and divided by 3, and so on. + +The second `WINDOW` operation aggregates all previous values (unbounded) to +calculate a running sum. For the first row, that is just `10`, for the second +row it is `10` + `0`, for the third `10` + `0` + `9`, and so on. + +| time | subject | val | rollingAverage | rollingSum | cumulativeSum | +|---------------------|---------|----:|---------------:|-----------:|--------------:| +| 2021-05-25 07:00:00 | st113 | 10 | 5 | 10 | 10 | +| 2021-05-25 07:00:00 | xh458 | 0 | 6.333… | 19 | 10 | +| 2021-05-25 07:15:00 | st113 | 9 | 6.333… | 19 | 19 | +| 2021-05-25 07:15:00 | xh458 | 10 | 14.666… | 44 | 29 | +| 2021-05-25 07:30:00 | st113 | 25 | 13.333… | 40 | 54 | +| 2021-05-25 07:30:00 | xh458 | 5 | 16.666… | 50 | 59 | +| 2021-05-25 07:45:00 | st113 | 20 | 18.333… | 55 | 79 | +| 2021-05-25 07:45:00 | xh458 | 30 | 25 | 75 | 109 | +| 2021-05-25 08:00:00 | xh458 | 25 | 27.5 | 55 | 134 | + +The below query demonstrates the use of window frames to compute running totals +within each `subject` group of `time`-ordered query rows, as well as rolling +sums and averages computed from the current row and the rows that immediately +precede and follow it, also per `subject` group and sorted by `time`: + +```aql +--- +name: windowAggregationRowGrouped +description: '' +dataset: observationsSampleDataset +--- +FOR t IN observations + COLLECT subject = t.subject INTO group = t + LET subquery = (FOR t2 IN group + SORT t2.time + WINDOW { preceding: 1, following: 1 } + AGGREGATE rollingAverage = AVG(t2.val), rollingSum = SUM(t2.val) + WINDOW { preceding: "unbounded", following: 0 } + AGGREGATE cumulativeSum = SUM(t2.val) + RETURN { + time: t2.time, + subject: t2.subject, + val: t2.val, + rollingAverage, + rollingSum, + cumulativeSum + } + ) + // flatten subquery result + FOR t2 IN subquery + RETURN t2 +``` + +If you look at the first row with the subject `xh458`, then you can see the +cumulative sum reset and that the rolling average and sum does not take the +previous row into account that belongs to subject `st113`. + +| time | subject | val | rollingAverage | rollingSum | cumulativeSum | +|---------------------|---------|----:|---------------:|-----------:|--------------:| +| 2021-05-25 07:00:00 | st113 | 10 | 9.5 | 19 | 10 | +| 2021-05-25 07:15:00 | st113 | 9 | 14.666… | 44 | 19 | +| 2021-05-25 07:30:00 | st113 | 25 | 18 | 54 | 44 | +| 2021-05-25 07:45:00 | st113 | 20 | 22.5 | 45 | 64 | +| 2021-05-25 07:00:00 | xh458 | 0 | 5 | 10 | 0 | +| 2021-05-25 07:15:00 | xh458 | 10 | 5 | 15 | 10 | +| 2021-05-25 07:30:00 | xh458 | 5 | 15 | 45 | 15 | +| 2021-05-25 07:45:00 | xh458 | 30 | 20 | 60 | 45 | +| 2021-05-25 08:00:00 | xh458 | 25 | 27.5 | 55 | 70 | + +## Range-based Aggregation + +The second syntax form of `WINDOW` allows aggregating over a all documents +within a value range. Offsets are differences in attribute values from the +current document. + +Attribute values have to be numeric. The offset calculations are performed by +adding or subtracting the numeric offsets specified in the `following` and +`preceding` attribute. The offset numbers have to be positive and have to be +determined at query compile time. The default offset is `0`. + +The range based window syntax requires the input rows to be sorted by the row +value. To ensure correctness of the result, the AQL optimizer will +automatically insert a `SORT` statement into the query in front of the `WINDOW` +statement. The optimizer may be able to optimize away that `SORT` statement +later if a sorted index is present on the group criteria. + +The following query demonstrates the use of window frames to compute totals as +well as averages computed from the current document and the documents that have +attribute values in `t.val` in the range of `[-10, +5]` (inclusive), preceding +and following: + +```aql +--- +name: windowAggregationRangeValue +description: '' +dataset: observationsSampleDataset +--- +FOR t IN observations + WINDOW t.val WITH { preceding: 10, following: 5 } + AGGREGATE rollingAverage = AVG(t.val), rollingSum = SUM(t.val) + RETURN { + time: t.time, + subject: t.subject, + val: t.val, + rollingAverage, + rollingSum + } +``` + +The value range of the first row is `[-10, 5]` since `val` is `0`, thus the +values from the first and second row are added up to `5` with the average being +`2.5`. The value range of the last row is `[20, 35]` as `val` is `30`, which +means that the last four rows get aggregated to a sum of `100` and an average +of `25` (the range is inclusive, i.e. `val` falls within the range with a value +of `20`). + +| time | subject | val | rollingAverage | rollingSum | +|---------------------|---------|----:|---------------:|-----------:| +| 2021-05-25 07:00:00 | xh458 | 0 | 2.5 | 5 | +| 2021-05-25 07:30:00 | xh458 | 5 | 6.8 | 34 | +| 2021-05-25 07:15:00 | st113 | 9 | 6.8 | 34 | +| 2021-05-25 07:00:00 | st113 | 10 | 6.8 | 34 | +| 2021-05-25 07:15:00 | xh458 | 10 | 6.8 | 34 | +| 2021-05-25 07:45:00 | st113 | 20 | 18 | 90 | +| 2021-05-25 07:30:00 | st113 | 25 | 25 | 100 | +| 2021-05-25 08:00:00 | xh458 | 25 | 25 | 100 | +| 2021-05-25 07:45:00 | xh458 | 30 | 25 | 100 | + +## Duration-based Aggregation + +Aggregating by time intervals is a subtype of range-based aggregation that +uses the second syntax form of `WINDOW` but with ISO durations. + +To support `WINDOW` frames over time-series data the `WINDOW` operation may +calculate timestamp offsets using positive ISO 8601 duration strings, like +`P1Y6M` (1 year and 6 months) or `PT12H30M` (12 hours and 30 minutes). Also see +[Date functions](../functions/date.md#comparison-and-calculation). +In contrast to the ISO 8601 standard, week components may be freely combined +with other components. For example, `P1WT1H` and `P1M1W` are both valid. +Fractional values are only supported for seconds, and only with up to three +decimals after the separator, i.e., millisecond precision. For example, +`PT0.123S` is a valid duration while `PT0.5H` and `PT0.1234S` are not. + +Durations can be specified separately in `following` and `preceding`. +If such a duration is used, then the attribute value of the current document +must be a number and is treated as numeric **timestamp in milliseconds**. +The range is inclusive. If either bound is not specified, it is treated as an +empty duration (i.e., `P0D`). + +The following query demonstrates the use of window frames to compute rolling +sums and averages over observations in the last 30 minutes (inclusive), based +on the document attribute `time` that is converted from a datetime string to a +numeric timestamp: + +```aql +--- +name: windowAggregationRangeDuration +description: '' +dataset: observationsSampleDataset +--- +FOR t IN observations + WINDOW DATE_TIMESTAMP(t.time) WITH { preceding: "PT30M" } + AGGREGATE rollingAverage = AVG(t.val), rollingSum = SUM(t.val) + RETURN { + time: t.time, + subject: t.subject, + val: t.val, + rollingAverage, + rollingSum + } +``` + +With a time of `07:30:00`, everything from `07:00:00` to `07:30:00` on the same +day falls within the duration range with `preceding: "PT30M"`, thus aggregating +the top six rows to a sum of `59` and an average of `9.8333…`. + +| time | subject | val | rollingAverage | rollingSum | +|---------------------|---------|----:|---------------:|-----------:| +| 2021-05-25 07:00:00 | st113 | 10 | 5 | 10 | +| 2021-05-25 07:00:00 | xh458 | 0 | 5 | 10 | +| 2021-05-25 07:15:00 | st113 | 9 | 7.25 | 29 | +| 2021-05-25 07:15:00 | xh458 | 10 | 7.25 | 29 | +| 2021-05-25 07:30:00 | st113 | 25 | 9.8333… | 59 | +| 2021-05-25 07:30:00 | xh458 | 5 | 9.8333… | 59 | +| 2021-05-25 07:45:00 | st113 | 20 | 16.5 | 99 | +| 2021-05-25 07:45:00 | xh458 | 30 | 16.5 | 99 | +| 2021-05-25 08:00:00 | xh458 | 25 | 21 | 105 | diff --git a/site/content/arangodb/oem/aql/high-level-operations/with.md b/site/content/arangodb/oem/aql/high-level-operations/with.md new file mode 100644 index 0000000000..d14c1e67b0 --- /dev/null +++ b/site/content/arangodb/oem/aql/high-level-operations/with.md @@ -0,0 +1,71 @@ +--- +title: '`WITH` operation in AQL' +menuTitle: WITH +weight: 75 +description: >- + An AQL query can start with a `WITH` operation, listing collections that a + query implicitly reads from +--- +Reading implicitly from a collections means that the collections are not +specified explicitly in language constructs like the following: + +- `FOR ... IN collection` +- `INSERT ... INTO collection` +- `UPDATE ... IN collection` +- `GRAPH "graph-name"` (via the graph definition) + +Instead, the collections are only known at runtime of the query. Such dynamic +collection access is invisible to the AQL query parser at query compile time. +Dynamic access is possible via the `DOCUMENT()` function as well as with +graph traversals (in particular the variant using collection sets), because +edges may point to arbitrary vertex collections. Additionally, if you specify +the start vertex of a traversal using a string, its collection needs to be +declared as well. + +Collections that are explicitly used in a query are automatically detected by +the AQL query parser. Any additional collections that will be involved in the +query but cannot be detected automatically by the query parser can be manually +specified using a `WITH` statement. It is recommended to declare all collections +that the `DOCUMENT()` function or graph traversals using collection sets might +possibly access to avoid occasional query failures. + +## Syntax + +<pre><code>WITH <em>collection1</em> [, <em>collection2</em> [, ... <em>collectionN</em> ] ]</code></pre> + +`WITH` is also a keyword that is used in other contexts, for example in `UPDATE` +statements. To declare additional collections, you must place the `WITH` keyword +at the very start of the query. + +## Usage + +The `WITH` operation is only required if you use a cluster deployment and only +for AQL queries that dynamically read from vertex collections as part of +graph traversals. + +You can enable the `--query.require-with` startup option to make single server +instances require `WITH` declarations like cluster deployments to ease development, +see [Requiring `WITH` statements](../../components/arangodb-server/options.md#--queryrequire-with). + +Dynamic access via the `DOCUMENT()` function does not require you to list the +involved collections. Using named graphs in traversals (`GRAPH "graph-name"`) +does not require it either, assuming that all vertices are in collections that +are part of the graph, as enforced by the [Graph API](../../develop/http-api/graphs/named-graphs.md). +That means, it is only necessary for traversals using anonymous graphs / +[collection sets](../graphs/traversals.md#working-with-collection-sets). + +The following example query specifies an edge collection `usersHaveManagers` +to perform a graph traversal. It is the only explicitly specified collection in +the query. It does not need to be declared using the `WITH` operation. + +However, the involved vertex collections need to be declared. In this example, +the start vertex is specified as a string and it is stored in the `users` +collections. Furthermore, the edges of the edge collection reference vertices of +a collection called `managers`. Both collections are declared at the beginning +of the query using the `WITH` operation: + +```aql +WITH users, managers +FOR v, e, p IN 1..2 OUTBOUND 'users/1' usersHaveManagers + RETURN { v, e, p } +``` diff --git a/site/content/arangodb/oem/aql/how-to-invoke-aql/_index.md b/site/content/arangodb/oem/aql/how-to-invoke-aql/_index.md new file mode 100644 index 0000000000..d8c7d28e57 --- /dev/null +++ b/site/content/arangodb/oem/aql/how-to-invoke-aql/_index.md @@ -0,0 +1,30 @@ +--- +title: How to execute AQL queries +menuTitle: How to invoke AQL +weight: 5 +description: '' +--- +AQL queries can be invoked in the following ways: + +- Via the web interface +- Using the `db` object of the JavaScript API, for example, in arangosh or in a Foxx service +- Via the raw REST HTTP API + +There are always calls to the server's HTTP API under the hood, but the web interface +and the `db` object abstract away the low-level communication details and are +thus easier to use. + +The ArangoDB web interface has a specific section for [**QUERIES**](with-the-web-interface.md). + +You can run [AQL queries from the ArangoDB Shell](with-arangosh.md) +with the [`db._query()`](with-arangosh.md#with-db_query) and +[`db._createStatement()`](with-arangosh.md#with-db_createstatement-arangostatement) +methods of the [`db` object](../../develop/javascript-api/@arangodb/db-object.md). This chapter +also describes how to use bind parameters, statistics, counting, and cursors with +arangosh. + +If you use Foxx microservices, see [how to write database queries](../../develop/foxx-microservices/getting-started.md#writing-database-queries) +for examples including tagged template strings. + +If you want to run AQL queries from your application via the HTTP REST API, +see the full API description at [HTTP interface for AQL queries](../../develop/http-api/queries/aql-queries.md). diff --git a/site/content/arangodb/oem/aql/how-to-invoke-aql/with-arangosh.md b/site/content/arangodb/oem/aql/how-to-invoke-aql/with-arangosh.md new file mode 100644 index 0000000000..c430c0efce --- /dev/null +++ b/site/content/arangodb/oem/aql/how-to-invoke-aql/with-arangosh.md @@ -0,0 +1,786 @@ +--- +title: Executing AQL queries from _arangosh_ +menuTitle: with arangosh +weight: 5 +description: >- + How to run queries, set bind parameters, and obtain the resulting and + additional information using the JavaScript API +# Undocumented on purpose: +# db._query(<query>, <bindVars>, <mainOptions>, { forceOneShardAttributeValue: "..."} ) +--- +In the ArangoDB shell, you can use the `db._query()` and `db._createStatement()` +methods to execute AQL queries. This chapter also describes +how to use bind parameters, counting, statistics and cursors. + +## With `db._query()` + +`db._query(<queryString>) → cursor` + +You can execute queries with the `_query()` method of the `db` object. +This runs the specified query in the context of the currently +selected database and returns the query results in a cursor. +You can print the results of the cursor using its `toArray()` method: + +```js +--- +name: 01_workWithAQL_all +description: '' +--- +~addIgnoreCollection("mycollection") +var coll = db._create("mycollection") +var doc = db.mycollection.save({ _key: "testKey", Hello : "World" }) +db._query('FOR my IN mycollection RETURN my._key').toArray() +``` + +### `db._query()` bind parameters + +`db._query(<queryString>, <bindVars>) → cursor` + +To pass bind parameters into a query, you can specify a second argument when +calling the `_query()` method: + +```js +--- +name: 02_workWithAQL_bindValues +description: '' +--- +db._query('FOR c IN @@collection FILTER c._key == @key RETURN c._key', { + '@collection': 'mycollection', + 'key': 'testKey' +}).toArray(); +``` + +### ES6 template strings + +`` aql`<queryTemplateString>` `` + +It is also possible to use ES6 template strings for generating AQL queries. There is +a template string generator function named `aql`. + +The following example demonstrates what the template string function generates: + +```js +--- +name: 02_workWithAQL_aqlTemplateString +description: '' +--- +var key = 'testKey'; +aql`FOR c IN mycollection FILTER c._key == ${key} RETURN c._key` +``` + +The next example directly uses the generated result to execute a query: + +```js +--- +name: 02_workWithAQL_aqlQuery +description: '' +--- +var key = 'testKey'; +db._query( + aql`FOR c IN mycollection FILTER c._key == ${key} RETURN c._key` +).toArray(); +``` + +Arbitrary JavaScript expressions can be used in queries that are generated with the +`aql` template string generator. Collection objects are handled automatically: + +```js +--- +name: 02_workWithAQL_aqlCollectionQuery +description: '' +--- +var key = 'testKey'; +db._query(aql`FOR doc IN ${ db.mycollection } RETURN doc`).toArray(); +``` + +Note: data-modification AQL queries normally do not return a result unless the +AQL query contains a `RETURN` operation at the top-level. Without a `RETURN` +operation, the `toArray()` method returns an empty array. + +### Statistics and extra Information + +`cursor.getExtra() → queryInfo` + +It is always possible to retrieve statistics for a query with the `getExtra()` method: + +```js +--- +name: 03_workWithAQL_getExtra +description: '' +--- +db._query(` + FOR i IN 1..100 + INSERT { _key: CONCAT('test', TO_STRING(i)) } INTO mycollection +`).getExtra(); +``` + +The meaning of the statistics values is described in +[Query statistics](../execution-and-performance/query-statistics.md). + +Query warnings are also reported here. If you design queries on the shell, +be sure to check for warnings. + +### Main query options + +`db._query(<queryString>, <bindVars>, <mainOptions>, <subOptions>) → cursor` + +You can pass the main options as the third argument to `db._query()` if you +also pass a fourth argument with the sub options (can be an empty object `{}`). + +#### `count` + +Whether the number of documents in the result set should be calculated on the +server side and returned in the `count` attribute of the result. Calculating the +`count` attribute might have a performance impact for some queries so this +option is turned off by default, and only returned when requested. + +If enabled, you can get the count by calling the `count()` method of the cursor. +You can also count the number of results on the client side, for example, using +`cursor.toArray().length`. + +```js +--- +name: 02_workWithAQL_count +description: '' +--- +var cursor = db._query( + 'FOR i IN 1..42 RETURN i', + {}, + { count: true }, + {} +); +cursor.count(); +cursor.toArray().length; +``` + +#### `batchSize` + +The maximum number of result documents to be transferred from the server to the +client in one roundtrip. If this attribute is not set, a server-controlled +default value is used. A `batchSize` value of `0` is disallowed. + +```js +--- +name: 02_workWithAQL_batchSize +description: '' +--- +db._query( + 'FOR i IN 1..3 RETURN i', + {}, + { batchSize: 2 }, + {} +).toArray(); // full result retrieved in two batches +``` + +#### `ttl` + +The time-to-live for the cursor (in seconds). If the result set is small enough +(less than or equal to `batchSize`), then results are returned right away. +Otherwise, they are stored in memory and are accessible via the cursor with +respect to the `ttl`. The cursor is removed on the server automatically after +the specified amount of time. This is useful to ensure garbage collection of +cursors that are not fully fetched by clients. If not set, a server-defined +value is used (default: 30 seconds). + +```js +--- +name: 02_workWithAQL_ttl +description: '' +--- +db._query( + 'FOR i IN 1..20 RETURN i', + {}, + { ttl: 5, batchSize: 10 }, + {} +).toArray(); // Each batch needs to be fetched within 5 seconds +``` + +#### `memoryLimit` + +To set a memory limit for the query, pass `options` to the `_query()` method. +The memory limit specifies the maximum number of bytes that the query is +allowed to use. When a single AQL query reaches the specified limit value, +the query will be aborted with a *resource limit exceeded* exception. In a +cluster, the memory accounting is done per shard, so the limit value is +effectively a memory limit per query per shard. + +```js +--- +name: 02_workWithAQL_memoryLimit +description: '' +--- +db._query( + 'FOR i IN 1..100000 SORT i RETURN i', + {}, + { memoryLimit: 100000 } +).toArray(); // xpError(ERROR_RESOURCE_LIMIT) +``` + +If no memory limit is specified, then the server default value (controlled by +the `--query.memory-limit` startup option) is used for restricting the maximum amount +of memory the query can use. A memory limit value of `0` means that the maximum +amount of memory for the query is not restricted. + +### Query sub options + +`db._query(<queryString>, <bindVars>, <subOptions>) → cursor` + +`db._query(<queryString>, <bindVars>, <mainOptions>, <subOptions>) → cursor` + +You can pass the sub options as the third argument to `db._query()` if you don't +provide main options, or as fourth argument if you do. + +#### `fullCount` + +If you set `fullCount` to `true` and if the query contains a `LIMIT` operation, then the +result has an extra attribute with the sub-attributes `stats` and `fullCount`, like +`{ ... , "extra": { "stats": { "fullCount": 123 } } }`. The `fullCount` attribute +contains 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 disables 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` operation and the `LIMIT` operation +is actually used in the query. + +#### `failOnWarning` +If you set `failOnWarning` to `true`, this makes the query throw an exception and +abort in case a warning occurs. You should use this option in development to catch +errors early. If set to `false`, warnings don't propagate to exceptions and are +returned with the query results. There is also a `--query.fail-on-warning` +startup options for setting the default value for `failOnWarning`, so that you +don't need to set it on a per-query level. + +#### `cache` + +Whether the [AQL query results cache](../execution-and-performance/caching-query-results.md) +shall be used for adding as well as for retrieving results. + +If the query cache mode is set to `demand` and you set the `cache` query option +to `true` for a query, then its query result is cached if it's eligible for +caching. If the query cache mode is set to `on`, query results are automatically +cached if they are eligible for caching unless you set the `cache` option to `false`. + +If you set the `cache` option to `false`, then any query cache lookup is skipped +for the query. If you set it to `true`, the query cache is checked a cached result +**if** the query cache mode is either set to `on` or `demand`. + +```js +--- +name: 02_workWithAQL_cache +description: '' +--- +var resultCache = require("@arangodb/aql/cache"); +resultCache.properties({ mode: "demand" }); +~resultCache.clear(); +db._query("FOR i IN 1..5 RETURN i", {}, { cache: true }); // Adds result to cache +db._query("FOR i IN 1..5 RETURN i", {}, { cache: true }); // Retrieves result from cache +db._query("FOR i IN 1..5 RETURN i", {}, { cache: false }); // Bypasses the cache +``` + +#### `fillBlockCache` + +If you set `fillBlockCache` to `true` or not specify it, this makes the query store +the data it reads via the RocksDB storage engine in the RocksDB block cache. This is +usually the desired behavior. You can set the option to `false` for queries that are +known to either read a lot of data that would thrash the block cache, or for queries +that read data known to be outside of the hot set. By setting the option +to `false`, data read by the query does not make it into the RocksDB block cache if +it is not already in there, thus leaving more room for the actual hot set. + +#### `profile` + +If you set `profile` to `true` or `1`, extra timing information is returned for the query. +The timing information is accessible via the `getExtra()` method of the query +result. If set to `2`, the query includes execution statistics per query plan +execution node in `stats.nodes` sub-attribute of the `extra` return attribute. +Additionally, the query plan is returned in the `extra.plan` sub-attribute. + +#### `maxWarningCount` + +The `maxWarningCount` option limits the number of warnings that are returned by the query if +`failOnWarning` is not set to `true`. The default value is `10`. + +#### `maxNumberOfPlans` + +The `maxNumberOfPlans` option limits the number of query execution plans the optimizer +creates at most. Reducing the number of query execution plans may speed up query plan +creation and optimization for complex queries, but normally there is no need to adjust +this value. + +#### `optimizer` + +Options related to the query optimizer. + +- `rules`: A list of to-be-included or to-be-excluded optimizer rules can be put into + this attribute, telling the optimizer to include or exclude specific rules. To disable + a rule, prefix its name with a `-`, to enable a rule, prefix it with a `+`. There is also + a pseudo-rule `all`, which matches all optimizer rules. `-all` disables all rules. + +#### `allowRetry` + +Set this option to `true` to make it possible to retry fetching the latest batch +from a cursor. + +{{< info >}} +This feature cannot be used on the server-side, like in [Foxx](../../develop/foxx-microservices/_index.md), as +there is no client connection and no batching. +{{< /info >}} + +If retrieving a result batch fails because of a connection issue, you can ask +for that batch again using the `POST /_api/cursor/<cursor-id>/<batch-id>` +endpoint. The first batch has an ID of `1` and the value is incremented by 1 +with every batch. Every result response except the last one also includes a +`nextBatchId` attribute, indicating the ID of the batch after the current. +You can remember and use this batch ID should retrieving the next batch fail. + +You can only request the latest batch again (or the next batch). +Earlier batches are not kept on the server-side. +Requesting a batch again does not advance the cursor. + +You can also call this endpoint with the next batch identifier, i.e. the value +returned in the `nextBatchId` attribute of a previous request. This advances the +cursor and returns the results of the next batch. This is only supported if there +are more results in the cursor (i.e. `hasMore` is `true` in the latest batch). + +From v3.11.1 onward, you may use the `POST /_api/cursor/<cursor-id>/<batch-id>` +endpoint even if the `allowRetry` attribute is `false` to fetch the next batch, +but you cannot request a batch again unless you set it to `true`. + +To allow refetching of the last batch of the query, the server cannot +automatically delete the cursor. After the first attempt of fetching the last +batch, the server would normally delete the cursor to free up resources. As you +might need to reattempt the fetch, it needs to keep the final batch when the +`allowRetry` option is enabled. Once you successfully received the last batch, +you should call the `DELETE /_api/cursor/<cursor-id>` endpoint so that the +server doesn't unnecessarily keep the batch until the cursor times out +(`ttl` query option). + +#### `stream` + +Set `stream` to `true` to execute the query in a **streaming** fashion. +The query result is not stored on the server, but calculated on the fly. + +{{< warning >}} +Long-running queries need to hold the collection locks for as long as the query +cursor exists. It is advisable to **only** use this option on short-running +queries **or** without exclusive locks. +{{< /warning >}} + +If set to `false`, the query is executed right away in its entirety. +In that case, the query results are either returned right away (if the result +set is small enough), or stored on the arangod instance and can be accessed +via the cursor API. + +The default value is `false`. + +{{< info >}} +The query options `cache`, `count` and `fullCount` don't work on streaming +queries. Additionally, query statistics, profiling data, and warnings are only +available after the query has finished and are delivered as part of the last batch. +{{< /info >}} + +#### `maxRuntime` + +The query has to be executed within the given runtime or it is killed. +The value is specified in seconds. The default value is `0.0` (no timeout). + +#### `maxDNFConditionMembers` + +<small>Introduced in: v3.11.0</small> + +A threshold for the maximum number of `OR` sub-nodes in the internal +representation of an AQL `FILTER` condition. + +Yon can use this option to limit the computation time and memory usage when +converting complex AQL `FILTER` conditions into the internal DNF +(disjunctive normal form) format. `FILTER` conditions with a lot of logical +branches (`AND`, `OR`, `NOT`) can take a large amount of processing time and +memory. This query option limits the computation time and memory usage for +such conditions. + +Once the threshold value is reached during the DNF conversion of a `FILTER` +condition, the conversion is aborted, and the query continues with a simplified +internal representation of the condition, which **cannot be used for index lookups**. + +You can also set the threshold globally instead of per query with the +[`--query.max-dnf-condition-members` startup option](../../components/arangodb-server/options.md#--querymax-dnf-condition-members). + +#### `maxNodesPerCallstack` + +The number of execution nodes in the query plan after +that stack splitting is performed to avoid a potential stack overflow. +Defaults to the configured value of the startup option +`--query.max-nodes-per-callstack`. + +This option is only useful for testing and debugging and normally does not need +any adjustment. + +#### `maxTransactionSize` + +The transaction size limit in bytes. + +#### `intermediateCommitSize` + +The maximum total size of operations after which an intermediate +commit is performed automatically. + +#### `intermediateCommitCount` + +The maximum number of operations after which an intermediate +commit is performed automatically. + +#### `spillOverThresholdMemoryUsage` + +<small>Introduced in: v3.10.0</small> + +This option allows queries to store intermediate and final results temporarily +on disk if the amount of memory used (in bytes) exceeds the specified value. +This is used for decreasing the memory usage during the query execution. + +This option only has an effect on queries that use the `SORT` operation but +without a `LIMIT`, and if you enable the spillover feature by setting a path +for the directory to store the temporary data in with the +[`--temp.intermediate-results-path` startup option](../../components/arangodb-server/options.md#--tempintermediate-results-path). + +Default value: 128MB. + +{{< info >}} +Spilling data from RAM onto disk is an experimental feature and is turned off +by default. The query results are still built up entirely in RAM on Coordinators +and single servers for non-streaming queries. To avoid the buildup of +the entire query result in RAM, use a streaming query (see the +[`stream`](#stream) option). +{{< /info >}} + +#### `spillOverThresholdNumRows` + +<small>Introduced in: v3.10.0</small> + +This option allows queries to store intermediate and final results temporarily +on disk if the number of rows produced by the query exceeds the specified value. +This is used for decreasing the memory usage during the query execution. In a +query that iterates over a collection that contains documents, each row is a +document, and in a query that iterates over temporary values +(i.e. `FOR i IN 1..100`), each row is one of such temporary values. + +This option only has an effect on queries that use the `SORT` operation but +without a `LIMIT`, and if you enable the spillover feature by setting a path +for the directory to store the temporary data in with the +[`--temp.intermediate-results-path` startup option](../../components/arangodb-server/options.md#--tempintermediate-results-path). + +Default value: `5000000` rows. + +{{< info >}} +Spilling data from RAM onto disk is an experimental feature and is turned off +by default. The query results are still built up entirely in RAM on Coordinators +and single servers for non-streaming queries. To avoid the buildup of +the entire query result in RAM, use a streaming query (see the +[`stream`](#stream) option). +{{< /info >}} + +#### `allowDirtyReads` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.10.0</small> + +If you set this option to `true` and execute the query against a cluster +deployment, then the Coordinator is allowed to read from any shard replica and +not only from the leader. See [Read from followers](../../develop/http-api/documents.md#read-from-followers) +for details. + +#### `skipInaccessibleCollections` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +Let AQL queries (especially graph traversals) treat collection to which a +user has **no access** rights for as if these collections are empty. +Instead of returning a *forbidden access* error, your queries execute normally. +This is intended to help with certain use-cases: A graph contains several collections +and different users execute AQL queries on that graph. You can naturally limit the +accessible results by changing the access rights of users on collections. + +#### `satelliteSyncWait` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +Configure how long a DB-Server has time to bring the SatelliteCollections +involved in the query into sync. The default value is `60.0` seconds. +When the maximal time is reached, the query is stopped. + +## With `db._createStatement()` (ArangoStatement) + +The `_query()` method is a shorthand for creating an `ArangoStatement` object, +executing it and iterating over the resulting cursor. If more control over the +result set iteration is needed, it is recommended to first create an +`ArangoStatement` object as follows: + +```js +--- +name: 04_workWithAQL_statements1 +description: '' +--- +stmt = db._createStatement( { "query": "FOR i IN [ 1, 2 ] RETURN i * 2" } ); +``` + +To execute the query, use the `execute()` method of the _statement_ object: + +```js +--- +name: 05_workWithAQL_statements2 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ 1, 2 ] RETURN i * 2" } ); +cursor = stmt.execute(); +``` + +You can pass a number to the `execute()` method to specify a batch size value. +The server returns at most this many results in one roundtrip. +The batch size cannot be adjusted after the query is first executed. + +**Note**: There is no need to explicitly call the execute method if another +means of fetching the query results is chosen. The following two approaches +lead to the same result: + +```js +--- +name: executeQueryNoBatchSize +description: '' +--- +~db._create("users"); +~db.users.save({ name: "Gerhard" }); +~db.users.save({ name: "Helmut" }); +~db.users.save({ name: "Angela" }); +var result = db.users.all().toArray(); +print(result); + +var q = db._query("FOR x IN users RETURN x"); +result = [ ]; +while (q.hasNext()) { + result.push(q.next()); +} +print(result); +~db._drop("users") +``` + +The following two alternatives both use a batch size and return the same +result: + +```js +--- +name: executeQueryBatchSize +description: '' +--- +~db._create("users"); +~db.users.save({ name: "Gerhard" }); +~db.users.save({ name: "Helmut" }); +~db.users.save({ name: "Angela" }); +var result = [ ]; +var q = db.users.all(); +q.execute(1); +while(q.hasNext()) { + result.push(q.next()); +} +print(result); + +result = [ ]; +q = db._query("FOR x IN users RETURN x", {}, { batchSize: 1 }); +while (q.hasNext()) { + result.push(q.next()); +} +print(result); +~db._drop("users") +``` + +### Cursors + +Once the query executed the query results are available in a cursor. +The cursor can return all its results at once using the `toArray()` method. +This is a short-cut that you can use if you want to access the full result +set without iterating over it yourself. + +```js +--- +name: 05_workWithAQL_statements3 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ 1, 2 ] RETURN i * 2" } ); +~var cursor = stmt.execute(); +cursor.toArray(); +``` + +Cursors can also be used to iterate over the result set document-by-document. +To do so, use the `hasNext()` and `next()` methods of the cursor: + +```js +--- +name: 05_workWithAQL_statements4 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ 1, 2 ] RETURN i * 2" } ); +~var c = stmt.execute(); +while (c.hasNext()) { + require("@arangodb").print(c.next()); +} +``` + +Please note that you can iterate over the results of a cursor only once, and that +the cursor will be empty when you have fully iterated over it. To iterate over +the results again, the query needs to be re-executed. + +Additionally, the iteration can be done in a forward-only fashion. There is no +backwards iteration or random access to elements in a cursor. + +### ArangoStatement parameters binding + +To execute an AQL query using bind parameters, you need to create a statement first +and then bind the parameters to it before execution: + +```js +--- +name: 05_workWithAQL_statements5 +description: '' +--- +var stmt = db._createStatement( { "query": "FOR i IN [ @one, @two ] RETURN i * 2" } ); +stmt.bind("one", 1); +stmt.bind("two", 2); +cursor = stmt.execute(); +``` + +The cursor results can then be dumped or iterated over as usual, e.g.: + +```js +--- +name: 05_workWithAQL_statements6 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ @one, @two ] RETURN i * 2" } ); +~stmt.bind("one", 1); +~stmt.bind("two", 2); +~var cursor = stmt.execute(); +cursor.toArray(); +``` + +or + +```js +--- +name: 05_workWithAQL_statements7 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ @one, @two ] RETURN i * 2" } ); +~stmt.bind("one", 1); +~stmt.bind("two", 2); +~var cursor = stmt.execute(); +while (cursor.hasNext()) { + require("@arangodb").print(cursor.next()); +} +``` + +Please note that bind parameters can also be passed into the `_createStatement()` +method directly, making it a bit more convenient: + +```js +--- +name: 05_workWithAQL_statements8 +description: '' +--- +stmt = db._createStatement({ + "query": "FOR i IN [ @one, @two ] RETURN i * 2", + "bindVars": { + "one": 1, + "two": 2 + } +}); +``` + +### Counting with a cursor + +Cursors also optionally provide the total number of results. By default, they do not. +To make the server return the total number of results, you may set the `count` attribute to +`true` when creating a statement: + +```js +--- +name: 05_workWithAQL_statements9 +description: '' +--- +stmt = db._createStatement( { + "query": "FOR i IN [ 1, 2, 3, 4 ] RETURN i", + "count": true } ); +``` + +After executing this query, you can use the `count` method of the cursor to get the +number of total results from the result set: + +```js +--- +name: 05_workWithAQL_statements10 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ 1, 2, 3, 4 ] RETURN i", "count": true } ); +var cursor = stmt.execute(); +cursor.count(); +``` + +Please note that the `count` method returns nothing if you did not specify the `count` +attribute when creating the query. + +This is intentional so that the server may apply optimizations when executing the query and +construct the result set incrementally. Incremental creation of the result sets +is no possible +if all of the results need to be shipped to the client anyway. Therefore, the client +has the choice to specify `count` and retrieve the total number of results for a query (and +disable potential incremental result set creation on the server), or to not retrieve the total +number of results and allow the server to apply optimizations. + +Please note that at the moment the server will always create the full result set for each query so +specifying or omitting the `count` attribute currently does not have any impact on query execution. +This may change in the future. Future versions of ArangoDB may create result sets incrementally +on the server-side and may be able to apply optimizations if a result set is not fully fetched by +a client. + +### Using cursors to obtain additional information on internal timings + +Cursors can also optionally provide statistics of the internal execution phases. By default, they do not. +To get to know how long parsing, optimization, instantiation and execution took, +make the server return that by setting the `profile` attribute to +`true` when creating a statement: + +```js +--- +name: 06_workWithAQL_statements11 +description: '' +--- +stmt = db._createStatement({ + query: "FOR i IN [ 1, 2, 3, 4 ] RETURN i", + options: {"profile": true}}); +``` + +After executing this query, you can use the `getExtra()` method of the cursor to get the +produced statistics: + +```js +--- +name: 06_workWithAQL_statements12 +description: '' +--- +~var stmt = db._createStatement( { "query": "FOR i IN [ 1, 2, 3, 4 ] RETURN i", options: {"profile": true}} ); +var cursor = stmt.execute(); +cursor.getExtra(); +``` + +## Query validation with `db._parse()` + +The `_parse()` method of the `db` object can be used to parse and validate a +query syntactically, without actually executing it. + +```js +--- +name: 06_workWithAQL_statements13 +description: '' +--- +db._parse( "FOR i IN [ 1, 2 ] RETURN i" ); +``` diff --git a/site/content/arangodb/oem/aql/how-to-invoke-aql/with-the-web-interface.md b/site/content/arangodb/oem/aql/how-to-invoke-aql/with-the-web-interface.md new file mode 100644 index 0000000000..abb1e651e2 --- /dev/null +++ b/site/content/arangodb/oem/aql/how-to-invoke-aql/with-the-web-interface.md @@ -0,0 +1,50 @@ +--- +title: Executing AQL queries in the ArangoDB web interface +menuTitle: with the Web Interface +weight: 10 +description: >- + You can run ad-hoc AQL queries using the query editor in the web interface +--- +In the **QUERIES** section of the web interface, type in a query in the main box +and execute it by clicking the **Execute** button. The query result is displayed +below the editor. + +The editor provides a few example queries that you can use as templates. +It also provides a feature to explain a query and inspect its execution plan +by clicking the **Explain** button. + +Bind parameters can be defined in the right-hand side pane. The format is the +same as used for bind parameters in the HTTP REST API and in (JavaScript) +application code. + +Here is an example: + +```aql +FOR doc IN @@collection + FILTER CONTAINS(LOWER(doc.author), @search, false) + RETURN { "name": doc.name, "descr": doc.description, "author": doc.author } +``` + +Bind parameters (table view mode): + +| Key | Value | +|-------------|--------| +| @collection | _apps | +| search | arango | + +Bind parameters (JSON view mode): + +```json +{ + "@collection": "_apps", + "search": "arango" +} +``` + +How bind parameters work can be found in [AQL Fundamentals](../fundamentals/bind-parameters.md). + +Queries can also be saved in the AQL editor along with their bind parameter values +for later reuse. This data is stored in the user profile in the current database +(in the `_users` system collection). + +Also see the detailed description of the [Web Interface](../../components/web-interface/_index.md). diff --git a/site/content/arangodb/oem/aql/operators.md b/site/content/arangodb/oem/aql/operators.md new file mode 100644 index 0000000000..f3bef216f7 --- /dev/null +++ b/site/content/arangodb/oem/aql/operators.md @@ -0,0 +1,816 @@ +--- +title: Operators +menuTitle: Operators +weight: 15 +description: >- + AQL supports a number of operators that can be used in expressions, + such as for arithmetic, comparing values, and logically combining conditions +--- +## Comparison operators + +Comparison (or relational) operators compare two operands. They can be used with +any input data types, and return a boolean result value. + +The following comparison operators are supported: + +| Operator | Description +|:-----------|:----------- +| `==` | equality +| `!=` | inequality +| `<` | less than +| `<=` | less or equal +| `>` | greater than +| `>=` | greater or equal +| `IN` | test if a value is contained in an array +| `NOT IN` | test if a value is not contained in an array +| `LIKE` | tests if a string value matches a pattern +| `NOT LIKE` | tests if a string value does not match a pattern +| `=~` | tests if a string value matches a regular expression +| `!~` | tests if a string value does not match a regular expression + +Each of the comparison operators returns a boolean value if the comparison can +be evaluated and returns *true* if the comparison evaluates to true, and *false* +otherwise. + +The comparison operators accept any data types for the first and second +operands. However, `IN` and `NOT IN` only return a meaningful result if +their right-hand operand is an array. `LIKE` and `NOT LIKE` only execute +if both operands are string values. All four operators do not perform +implicit type casts if the compared operands have different types, i.e. +they test for strict equality or inequality (`0` is different to `"0"`, +`[0]`, `false` and `null` for example). + +```aql + 0 == null // false + 1 > 0 // true + true != null // true + 45 <= "yikes!" // true + 65 != "65" // true + 65 == 65 // true + 1.23 > 1.32 // false + 1.5 IN [ 2, 3, 1.5 ] // true + "foo" IN null // false +42 NOT IN [ 17, 40, 50 ] // true + "abc" == "abc" // true + "abc" == "ABC" // false + "foo" LIKE "f%" // true + "foo" NOT LIKE "f%" // false + "foo" =~ "^f[o].$" // true + "foo" !~ "[a-z]+bar$" // true +``` + +The `LIKE` operator checks whether its left operand matches the pattern specified +in its right operand. The pattern can consist of regular characters and wildcards. +The supported wildcards are `_` to match a single arbitrary character, and `%` to +match any number of arbitrary characters. Literal `%` and `_` need to be escaped +with a backslash. Backslashes need to be escaped themselves, which effectively +means that two reverse solidus characters need to precede a literal percent sign +or underscore. In arangosh, additional escaping is required, making it four +backslashes in total preceding the to-be-escaped character. + +```aql + "abc" LIKE "a%" // true + "abc" LIKE "_bc" // true +"a_b_foo" LIKE "a\\_b\\_foo" // true +``` + +The pattern matching performed by the `LIKE` operator is case-sensitive. + +The `NOT LIKE` operator has the same characteristics as the `LIKE` operator +but with the result negated. It is thus identical to `NOT (… LIKE …)`. Note +the parentheses, which are necessary for certain expressions: + +```aql +FOR doc IN coll + RETURN NOT doc.attr LIKE "…" +``` + +The return expression gets transformed into `LIKE(!doc.attr, "…")`, leading +to unexpected results. `NOT(doc.attr LIKE "…")` gets transformed into the +more reasonable `! LIKE(doc.attr, "…")`. + +The regular expression operators `=~` and `!~` expect their left-hand operands to +be strings, and their right-hand operands to be strings containing valid regular +expressions as specified in the documentation for the AQL function +[`REGEX_TEST()`](functions/string.md#regex_test). + +## Array comparison operators + +Most comparison operators also exist as an *array variant*. In the array variant, +a `==`, `!=`, `>`, `>=`, `<`, `<=`, `IN`, or `NOT IN` operator is prefixed with +an `ALL`, `ANY`, or `NONE` keyword. This changes the operator's behavior to +compare the individual array elements of the left-hand argument to the right-hand +argument. Depending on the quantifying keyword, all, any, or none of these +comparisons need to be satisfied to evaluate to `true` overall. + +You can also combine one of the supported comparison operators with the special +`AT LEAST (<expression>)` operator to require an arbitrary number of elements +to satisfy the condition to evaluate to `true`. You can use a static number or +calculate it dynamically using an expression. + +```aql +[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false +[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true +[ 1, 2, 3 ] NONE IN [ 3 ] // false +[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true +[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false +[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true +[ 1, 2, 3 ] ANY == 2 // true +[ 1, 2, 3 ] ANY == 4 // false +[ 1, 2, 3 ] ANY > 0 // true +[ 1, 2, 3 ] ANY <= 1 // true +[ 1, 2, 3 ] NONE < 99 // false +[ 1, 2, 3 ] NONE > 10 // true +[ 1, 2, 3 ] ALL > 2 // false +[ 1, 2, 3 ] ALL > 0 // true +[ 1, 2, 3 ] ALL >= 3 // false +["foo", "bar"] ALL != "moo" // true +["foo", "bar"] NONE == "bar" // false +["foo", "bar"] ANY == "foo" // true + +[ 1, 2, 3 ] AT LEAST (2) IN [ 2, 3, 4 ] // true +["foo", "bar"] AT LEAST (1+1) == "foo" // false +``` + +Note that these operators do not utilize indexes in regular queries. +The operators are also supported in [SEARCH expressions](high-level-operations/search.md), +where ArangoSearch's indexes can be utilized. The semantics differ however, see +[AQL `SEARCH` operation](high-level-operations/search.md#array-comparison-operators). + +## Logical operators + +The following logical operators are supported in AQL: + +- `&&` logical and operator +- `||` logical or operator +- `!` logical not/negation operator + +AQL also supports the following alternative forms for the logical operators: + +- `AND` logical and operator +- `OR` logical or operator +- `NOT` logical not/negation operator + +The alternative forms are aliases and functionally equivalent to the regular +operators. + +The two-operand logical operators in AQL are executed with short-circuit +evaluation (except if one of the operands is or includes a subquery. In this +case the subquery is pulled out an evaluated before the logical operator). + +The result of the logical operators in AQL is defined as follows: + +- `lhs && rhs` returns `lhs` if it is `false` or would be `false` when converted + to a boolean. If `lhs` is `true` or would be `true` when converted to a boolean, + `rhs` is returned. +- `lhs || rhs` returns `lhs` if it is `true` or would be `true` when converted + to a boolean. If `lhs` is `false` or would be `false` when converted to a boolean, + `rhs` is returned. +- `! value` returns the negated value of `value` converted to a boolean + +```aql +u.age > 15 && u.address.city != "" +true || false +NOT u.isInvalid +1 || ! 0 +``` + +Passing non-boolean values to a logical operator is allowed. Any non-boolean operands +are casted to boolean implicitly by the operator, without making the query abort. + +The *conversion to a boolean value* works as follows: +- `null` is converted to `false` +- boolean values remain unchanged +- all numbers unequal to zero are `true`, zero is `false` +- an empty string is `false`, all other strings are `true` +- arrays (`[ ]`) and objects / documents (`{ }`) are `true`, regardless of their contents + +The result of *logical and* and *logical or* operations can now have any data +type and is not necessarily a boolean value. + +For example, the following logical operations return boolean values: + +```aql +25 > 1 && 42 != 7 // true +22 IN [ 23, 42 ] || 23 NOT IN [ 22, 7 ] // true +25 != 25 // false +``` + +… whereas the following logical operations do not return boolean values: + +```aql + 1 || 7 // 1 +null || "foo" // "foo" +null && true // null +true && 23 // 23 +``` + +## Arithmetic operators + +Arithmetic operators perform an arithmetic operation on two numeric +operands. The result of an arithmetic operation is again a numeric value. + +AQL supports the following arithmetic operators: + +- `+` addition +- `-` subtraction +- `*` multiplication +- `/` division +- `%` modulus + +Unary plus and unary minus are supported as well: + +```aql +LET x = -5 +LET y = 1 +RETURN [-x, +y] +// [5, 1] +``` + +For exponentiation, there is a [numeric function](functions/numeric.md#pow) `POW()`. +The syntax `base ** exp` is not supported. + +For string concatenation, you must use the [`CONCAT()` string function](functions/string.md#concat). +Combining two strings with a plus operator (`"foo" + "bar"`) does not work! +Also see [Common Errors](common-errors.md). + +```aql +1 + 1 +33 - 99 +12.4 * 4.5 +13.0 / 0.1 +23 % 7 +-15 ++9.99 +``` + +The arithmetic operators accept operands of any type. Passing non-numeric values to an +arithmetic operator casts the operands to numbers using the type casting rules +applied by the [`TO_NUMBER()`](functions/type-check-and-cast.md#to_number) function: + +- `null` is converted to `0` +- `false` is converted to `0`, `true` is converted to `1` +- a valid numeric value remains unchanged, but NaN and Infinity are converted to `0` +- string values are converted to a number if they contain a valid string representation + of a number. Any whitespace at the start or the end of the string is ignored. Strings + with any other contents are converted to the number `0` +- an empty array is converted to `0`, an array with one member is converted to the numeric + representation of its sole member. Arrays with more members are converted to the number + `0`. +- objects / documents are converted to the number `0`. + +An arithmetic operation that produces an invalid value, such as `1 / 0` +(division by zero), produces a result value of `null`. The query is not +aborted, but you may see a warning. + +```aql + 1 + "a" // 1 + 1 + "99" // 100 + 1 + null // 1 +null + 1 // 1 + 3 + [ ] // 3 + 24 + [ 2 ] // 26 + 24 + [ 2, 4 ] // 24 + 25 - null // 25 + 17 - true // 16 + 23 * { } // 0 + 5 * [ 7 ] // 35 + 24 / "12" // 2 + 1 / 0 // null (with a 'division by zero' warning) +``` + +## Ternary operator + +AQL also supports a ternary operator that can be used for conditional +evaluation. The ternary operator expects a boolean condition as its first +operand, and it returns the result of the second operand if the condition +evaluates to true, and the third operand otherwise. +You may use [subqueries](fundamentals/subqueries.md) as operands. + +In the following example, the expression returns `u.userId` if `u.age` is +greater than 15 or if `u.active` is `true`. Otherwise it returns `null`: + +```aql +u.age > 15 || u.active == true ? u.userId : null +``` + +There is also a shortcut variant of the ternary operator with just two +operands. This variant can be used if the expression for the boolean +condition and the return value should be the same. + +In the following example, the expression evaluates to `u.value` if `u.value` is +truthy. Otherwise, a fixed string is given back: + +```aql +u.value ? : 'value is null, 0 or not present' +``` + +The condition (here just `u.value`) is only evaluated once if the second +operand between `?` and `:` is omitted, whereas it would be evaluated twice +in case of `u.value ? u.value : 'value is null'`. + +{{< info >}} +Subqueries that are used inside expressions are pulled out of these +expressions and executed beforehand. That means that subqueries do not +participate in lazy evaluation of operands, for example, in the +ternary operator. Also see +[evaluation of subqueries](fundamentals/subqueries.md#evaluation-of-subqueries). +{{< /info >}} + +## Range operator + +AQL supports expressing simple numeric ranges with the `..` operator. +This operator can be used to easily iterate over a sequence of numeric +values. + +The `..` operator produces an array of the integer values in the +defined range, with both bounding values included. + +```aql +2010..2013 +``` + +The above example produces the following result: + +```json +[ 2010, 2011, 2012, 2013 ] +``` + +Using the range operator is equivalent to writing an array with the integer +values in the range specified by the bounds of the range. If the bounds of +the range operator are non-integers, they are converted to integer values first. + +There is also a [`RANGE()` function](functions/numeric.md#range). + +## Array operators + +AQL provides different array operators: + +- `[n]` to [access the array element](#indexed-value-access) at index `n` +- `[*]` for [expanding array variables](#array-expansion) +- `[**]`, `[***]` etc. for [flattening arrays](#array-contraction) +- `[* ...]`, `[** ...]` etc. for filtering, limiting, and projecting arrays using + [inline expressions](#inline-expressions) +- `[? ...]` for nested search, known as the [question mark operator](#question-mark-operator) + +### Indexed value access + +You can access individual array elements by their position using the `[]` accessor. +The position is called the *index* and starts at `0`. + +When specifying an index, use a numeric integer value. You can use negative +index values to access array elements starting from the end of the array. +This is convenient if the length of the array is unknown and you want to access +elements at the end of the array. + +You can also use an expression and calculate the index of an element. + +{{< info >}} +If you try to access an array element with an out-of-bounds index (after the last +element or before the first element), the result is a `null` value without +raising an error or warning. +{{< /info >}} + +```aql +LET friends = [ "tina", "helga", "alfred" ] + +friends[0] // access 1st array element (elements start at index 0) +friends[2] // access 3rd array element + +friends[-1] // access last array element +friends[-2] // access second to last array element + +friends[LENGTH(friends) / 2] // access array element in the middle (floored) +``` + +### Array expansion + +In order to access a named attribute from all elements in an array easily, AQL +offers the shortcut operator `[*]` for array variable expansion. + +Using the `[*]` operator with an array variable will iterate over all elements +in the array, thus allowing to access a particular attribute of each element. It is +required that the expanded variable is an array. The result of the `[*]` +operator is again an array. + +To demonstrate the array expansion operator, let's go on with the following three +example *users* documents: + +```json +[ + { + "name": "john", + "age": 35, + "friends": [ + { "name": "tina", "age": 43 }, + { "name": "helga", "age": 52 }, + { "name": "alfred", "age": 34 } + ] + }, + { + "name": "yves", + "age": 24, + "friends": [ + { "name": "sergei", "age": 27 }, + { "name": "tiffany", "age": 25 } + ] + }, + { + "name": "sandra", + "age": 40, + "friends": [ + { "name": "bob", "age": 32 }, + { "name": "elena", "age": 48 } + ] + } +] +``` + +With the `[*]` operator it becomes easy to query just the names of the +friends for each user: + +```aql +FOR u IN users + RETURN { name: u.name, friends: u.friends[*].name } +``` + +This will produce: + +```json +[ + { "name" : "john", "friends" : [ "tina", "helga", "alfred" ] }, + { "name" : "yves", "friends" : [ "sergei", "tiffany" ] }, + { "name" : "sandra", "friends" : [ "bob", "elena" ] } +] +``` + +This is a shortcut for the longer, semantically equivalent query: + +```aql +FOR u IN users + RETURN { name: u.name, friends: (FOR f IN u.friends RETURN f.name) } +``` + +### Array contraction + +In order to collapse (or flatten) results in nested arrays, AQL provides the `[**]` +operator. It works similar to the `[*]` operator, but additionally collapses nested +arrays. + +How many levels are collapsed is determined by the amount of asterisk characters used. +`[**]` collapses one level of nesting - just like `FLATTEN(array)` or `FLATTEN(array, 1)` +would do -, `[***]` collapses two levels - the equivalent to `FLATTEN(array, 2)` - and +so on. + +Let's compare the array expansion operator with an array contraction operator. +For example, the following query produces an array of friend names per user: + +```aql +FOR u IN users + RETURN u.friends[*].name +``` + +As we have multiple users, the overall result is a nested array: + +```json +[ + [ + "tina", + "helga", + "alfred" + ], + [ + "sergei", + "tiffany" + ], + [ + "bob", + "elena" + ] +] +``` + +If the goal is to get rid of the nested array, we can apply the `[**]` operator on the +result. But simply appending `[**]` to the query won't help, because *u.friends* +is not a nested (multi-dimensional) array, but a simple (one-dimensional) array. Still, +the `[**]` can be used if it has access to a multi-dimensional nested result. + +We can extend above query as follows and still create the same nested result: + +```aql +RETURN ( + FOR u IN users RETURN u.friends[*].name +) +``` + +By now appending the `[**]` operator at the end of the query... + +```aql +RETURN ( + FOR u IN users RETURN u.friends[*].name +)[**] +``` + +... the query result becomes: + +```json +[ + [ + "tina", + "helga", + "alfred", + "sergei", + "tiffany", + "bob", + "elena" + ] +] +``` + +Note that the elements are not de-duplicated. For a flat array with only unique +elements, a combination of [`UNIQUE()`](functions/array.md#unique) and +[`FLATTEN()`](functions/array.md#flatten) is advisable. + +### Inline expressions + +It is possible to filter elements while iterating over an array, to limit the amount +of returned elements and to create a projection using the current array element. +Sorting is not supported by this shorthand form. + +These inline expressions can follow array expansion and contraction operators +`[* ...]`, `[** ...]` etc. The keywords `FILTER`, `LIMIT` and `RETURN` +must occur in this order if they are used in combination, and can only occur once: + +<code><em>anyArray</em>[* FILTER <em>conditions</em> LIMIT <em>skip</em>,<em>limit</em> RETURN <em>projection</em>]</code> + +Example with nested numbers and array contraction: + +```aql +LET arr = [ [ 1, 2 ], 3, [ 4, 5 ], 6 ] +RETURN arr[** FILTER CURRENT % 2 == 0] +``` + +All even numbers are returned in a flat array: + +```json +[ + [ 2, 4, 6 ] +] +``` + +Complex example with multiple conditions, limit and projection: + +```aql +FOR u IN users + RETURN { + name: u.name, + friends: u.friends[* FILTER CONTAINS(CURRENT.name, "a") AND CURRENT.age > 40 + LIMIT 2 + RETURN CONCAT(CURRENT.name, " is ", CURRENT.age) + ] + } +``` + +No more than two computed strings based on *friends* with an `a` in their name and +older than 40 years are returned per user: + +```json +[ + { + "name": "john", + "friends": [ + "tina is 43", + "helga is 52" + ] + }, + { + "name": "sandra", + "friends": [ + "elena is 48" + ] + }, + { + "name": "yves", + "friends": [] + } +] +``` + +#### Inline filter + +To return only the names of friends that have an *age* value +higher than the user herself, an inline `FILTER` can be used: + +```aql +FOR u IN users + RETURN { name: u.name, friends: u.friends[* FILTER CURRENT.age > u.age].name } +``` + +The pseudo-variable *CURRENT* can be used to access the current array element. +The `FILTER` condition can refer to *CURRENT* or any variables valid in the +outer scope. + +#### Inline limit + +The number of elements returned can be restricted with `LIMIT`. It works the same +as the [limit operation](high-level-operations/limit.md). `LIMIT` must come after `FILTER` +and before `RETURN`, if they are present. + +```aql +FOR u IN users + RETURN { name: u.name, friends: u.friends[* LIMIT 1].name } +``` + +Above example returns one friend each: + +```json +[ + { "name": "john", "friends": [ "tina" ] }, + { "name": "sandra", "friends": [ "bob" ] }, + { "name": "yves", "friends": [ "sergei" ] } +] +``` + +A number of elements can also be skipped and up to *n* returned: + +```aql +FOR u IN users + RETURN { name: u.name, friends: u.friends[* LIMIT 1,2].name } +``` + +The example query skips the first friend and returns two friends at most +per user: + +```json +[ + { "name": "john", "friends": [ "helga", "alfred" ] }, + { "name": "sandra", "friends": [ "elena" ] }, + { "name": "yves", "friends": [ "tiffany" ] } +] +``` + +#### Inline projection + +To return a projection of the current element, use `RETURN`. If a `FILTER` is +also present, `RETURN` must come later. + +```aql +FOR u IN users + RETURN u.friends[* RETURN CONCAT(CURRENT.name, " is a friend of ", u.name)] +``` + +The above will return: + +```json +[ + [ + "tina is a friend of john", + "helga is a friend of john", + "alfred is a friend of john" + ], + [ + "sergei is a friend of yves", + "tiffany is a friend of yves" + ], + [ + "bob is a friend of sandra", + "elena is a friend of sandra" + ] +] +``` + +### Question mark operator + +You can use the `[? ... ]` operator on arrays to check whether the elements +fulfill certain criteria, and you can specify how often they should be satisfied. +The operator is similar to an inline filter but with an additional length check +and it evaluates to `true` or `false`. + +The following example shows how to check whether two of numbers in the array +are even: + +```aql +LET arr = [ 1, 2, 3, 4 ] +RETURN arr[? 2 FILTER CURRENT % 2 == 0] // true +``` + +The number `2` after the `?` is the quantifier. It is optional and defaults to +`ANY`. The following quantifiers are supported: + +- Integer numbers for exact quantities (e.g. `2`) +- Number ranges for a quantity between the two values (e.g. `2..3`) +- `NONE` (equivalent to `0`) +- `ANY` +- `ALL` +- `AT LEAST` + +The quantifier needs to be followed by a `FILTER` operation if you want to specify +conditions. You can refer to the current array element via the `CURRENT` +pseudo-variable in the filter expression. If you leave out the quantifier and +`FILTER` operation (only `arr[?]`), then `arr` is checked whether it is an array +and if it has at least one element. + +The question mark operator is a shorthand for an inline filter with a +surrounding length check. The following table compares both variants: + +| Question mark operator | Inline filter with length check | +|:-----------------------|:--------------------------------| +| `arr[? <number> FILTER <conditions>]` | `LENGTH(arr[* FILTER <conditions>]) == <number>` +| `arr[? <min>..<max> FILTER <conditions>]` | `IN_RANGE(LENGTH(arr[* FILTER <conditions>]), <min>, <max>, true, true)` +| `arr[? NONE FILTER <conditions>]` | `LENGTH(arr[* FILTER <conditions>]) == 0` +| `arr[? ANY FILTER <conditions>]` | `LENGTH(arr[* FILTER <conditions>]) > 0` +| `arr[? ALL FILTER <conditions>]` | `LENGTH(arr[* FILTER <conditions>]) == LENGTH(arr)` +| `arr[? AT LEAST (<number>) FILTER <conditions>]` | `LENGTH(arr[* FILTER <conditions>]) >= <number>` +| `arr[?]` | `LENGTH(arr[*]) > 0` +{.fixed} + +The question mark operator can be used for nested search (Enterprise Edition only): +- [Nested search with ArangoSearch](../index-and-search/arangosearch/nested-search.md) using Views +- Nested search using [Inverted indexes](../index-and-search/indexing/working-with-indexes/inverted-indexes.md#nested-search-enterprise-edition) + +## Object operators + +- `.` and `[expr]` for [accessing an object attribute](#attribute-access) + +### Attribute access + +You can access individual object attributes by their names using the +dot accessor `.` and the square bracket accessor `[]`. + +The dot accessor lets you specify the attribute name as an unquoted string. +This is only possible if the attribute name would be valid as a +[variable name](fundamentals/syntax.md#variable-names). Otherwise, you need to +quote the name with backticks or forward ticks, or use the square bracket accessor. + +You can also use the dot accessor together with a [bind parameter](fundamentals/bind-parameters.md) +to select an attribute or sub-attribute. + +```aql +LET ob = { name: "sandra", "with space": true } + +LET unquoted = ob.name + +LET quoted_1 = ob.`with space` +LET quoted_2 = ob.´with space´ + +LET bindvar = ob.@attr +``` + +The square bracket accessor lets you specify an expression to select an attribute. +This is usually a quoted string literal but you can also calculate the name +dynamically using an arbitrary expression. + +You can also use the square bracket accessor together with a +[bind parameter](fundamentals/bind-parameters.md) to select an attribute. + +```aql +LET ob = { name: "sandra", "with 2 spaces": true } + +LET literal_1 = ob["name"] +LET literal_2 = ob["with 2 spaces"] + +LET attribute = "name" +LET variable = ob[attribute] + +LET expression = ob[CONCAT_SEPARATOR(" ", "with", 1+1, "spaces")] + +LET bindvar = ob[@attr] +``` + +{{< info >}} +If you try to access a non-existing attribute in one way or another, the result +is a `null` value without raising an error or warning. +{{< /info >}} + +## Operator precedence + +The operator precedence in AQL is similar as in other familiar languages +(highest precedence first): + +| Operator(s) | Description +|:---------------------|:----------- +| `::` | scope (user-defined AQL functions) +| `[*]` | array expansion +| `[]` | indexed value access (arrays), attribute access (objects) +| `.` | attribute access (objects) +| `()` | function call +| `!`, `NOT`, `+`, `-` | unary not (logical negation), unary plus, unary minus +| `*`, `/`, `%` | multiplication, division, modulus +| `+`, `-` | addition, subtraction +| `..` | range operator +| `<`, `<=`, `>=`, `>` | less than, less equal, greater equal, greater than +| `IN`, `NOT IN` | in operator, not in operator +| `==`, `!=`, `LIKE`, `NOT LIKE`, `=~`, `!~` | equality, inequality, wildcard match, wildcard non-match, regex match, regex non-match +| `AT LEAST` | at least modifier (array comparison operator, question mark operator) +| `OUTBOUND`, `INBOUND`, `ANY`, `ALL`, `NONE` | graph traversal directions, array comparison operators, question mark operator +| `&&`, `AND` | logical and +| `\|\|`, `OR` | logical or +| `INTO` | into operator (INSERT / UPDATE / REPLACE / REMOVE / COLLECT operations) +| `WITH` | with operator (WITH / UPDATE / REPLACE / COLLECT operations) +| `=` | variable assignment (LET / COLLECT operations, AGGREGATE / PRUNE clauses) +| `?`, `:` | ternary operator, object literals +| `DISTINCT` | distinct modifier (RETURN operations) +| `,` | comma separator + +The parentheses `(` and `)` can be used to enforce a different operator +evaluation order. diff --git a/site/content/arangodb/oem/aql/user-defined-functions.md b/site/content/arangodb/oem/aql/user-defined-functions.md new file mode 100644 index 0000000000..78376f0d24 --- /dev/null +++ b/site/content/arangodb/oem/aql/user-defined-functions.md @@ -0,0 +1,405 @@ +--- +title: Extending AQL with user-defined functions +menuTitle: User-defined Functions +weight: 45 +description: >- + You can write UDFs in JavaScript to extend AQL or to simplify queries +--- +AQL comes with a [built-in set of functions](functions/_index.md), but it is +not a fully-featured programming language. To add missing functionality or to +simplify queries, you may write your own user-defined functions (**UDFs**) in +JavaScript and make them available in AQL. + +## Known Limitations + +{{< warning >}} +UDFs can have serious effects on the performance of your queries and the resource +usage in ArangoDB. Especially in cluster setups they should not be used against +much data, because this data will need to be sent over the network back and forth +between _DB-Servers_ and _Coordinators_, potentially adding a lot of latency. +This can be mitigated by very selective `FILTER`s before calls to UDFs. +{{< /warning >}} + +Since the optimizer doesn't know anything about the nature of your function, +**the optimizer can't use indexes for UDFs**. So you should never lean on a UDF +as the primary criterion for a `FILTER` statement to reduce your query result set. +Instead, put a another `FILTER` statement in front of it. You should make sure +that this [**`FILTER` statement** is effective](execution-and-performance/query-optimization.md) +to reduce the query result before passing it to your UDF. + +Rule of thumb is, the closer the UDF is to your final `RETURN` statement +(or maybe even inside it), the better. + +When used in clusters, UDFs are always executed on a +[Coordinator](../deploy/cluster/_index.md). +It is not possible to execute UDFs on DB-Servers, as no JavaScript execution +engine is available on DB-Servers. Queries that would push UDF execution to +DB-Servers are aborted with a parse error. This includes using UDFs in traversal +`PRUNE` conditions, as well as `FILTER` conditions that can be moved into the +traversal execution on a DB-Server. These limitations also apply to the +single server deployment mode to keep the differences to cluster deployments minimal. + +As UDFs are written in JavaScript, each query that executes a UDF will acquire +one V8 context to execute the UDFs in it. V8 contexts can be re-used across subsequent +queries, but when UDF-invoking queries run in parallel, they will each require a +dedicated V8 context. + +Because UDFs use the V8 JavaScript engine, the engine's default memory limit of 512 MB is applied. + +Using UDFs in clusters may thus result in a higher resource allocation +in terms of used V8 contexts and server threads. If you run out +of these resources, your query may abort with a +[**cluster backend unavailable**](../develop/error-codes.md) error. + +To overcome these mentioned limitations, you may want to increase the +[number of available V8 contexts](../components/arangodb-server/options.md#--javascriptv8-contexts) +(at the expense of increased memory usage), and the +[number of available server threads](../components/arangodb-server/options.md#--servermaximal-threads). + +In addition, modification of global JavaScript variables from inside UDFs is +unsupported, as is reading or changing the data of any collection or running +queries from inside an AQL user function. + +## Naming + +AQL functions that are implemented with JavaScript are always in a namespace. +To register a user-defined AQL function, you need to give it a name with a +namespace. The `::` symbol is used as the namespace separator, for example, +`MYGROUP::MYFUNC`. You can use one or multiple levels of namespaces to create +meaningful function groups. + +The names of user-defined functions are case-insensitive, like all function +names in AQL. + +To refer to and call user-defined functions in AQL queries, you need to use the +fully qualified name with the namespaces: + +```aql +MYGROUP::MYFUNC() +MYFUNCTIONS::MATH::RANDOM() +``` + +ArangoDB's built-in AQL functions are all implemented in C++ and are not in a +namespace, except for the internal `V8()` function, which resides in the `_aql` +namespace. It is the default namespace, which means that you can use the +unqualified name of the function (without `_aql::`) to refer to it. Note that +you cannot add own functions to this namespace. + +## Variables and side effects + +User functions can take any number of input arguments and should +provide one result via a `return` statement. User functions should be kept +purely functional and thus free of side effects and state, and state modification. + +{{< warning >}} +Modification of global variables is unsupported, as is reading or changing +the data of any collection or running queries from inside an AQL user function. +{{< /warning >}} + +User function code is late-bound, and may thus not rely on any variables +that existed at the time of declaration. If user function code requires +access to any external data, it must take care to set up the data by +itself. + +All AQL user function-specific variables should be introduced with the `var`, +`let`, or `const` keywords in order to not accidentally access already defined +variables from outer scopes. Not using a declaration keyword for own variables +may cause side effects when executing the function. + +Here is an example that may modify outer scope variables `i` and `name`, +making the function **not** side-effect free: + +```js +function (values) { + for (i = 0; i < values.length; ++i) { + name = values[i]; + if (name === "foo") { + return i; + } + } + return null; +} +``` + +The above function can be made free of side effects by using the `var`, `let`, +or `const` keywords, so the variables become function-local variables: + +```js +function (values) { + for (let i = 0; i < values.length; ++i) { + let name = values[i]; + if (name === "foo") { + return i; + } + } + return null; +} +``` + +## Input parameters + +In order to return a result, a user function should use a `return` instruction +rather than modifying its input parameters. + +AQL user functions are allowed to modify their input parameters for input +parameters that are null, boolean, numeric or string values. Modifying these +input parameter types inside a user function should be free of side effects. +However, user functions should not modify input parameters if the parameters are +arrays or objects and as such passed by reference, as that may modify variables +and state outside of the user function itself. + +## Return values + +User functions must only return primitive types (i.e. `null`, boolean +values, numeric values, string values) or aggregate types (arrays or +objects) composed of these types. +Returning any other JavaScript object type (Function, Date, RegExp etc.) from +a user function may lead to undefined behavior and should be avoided. + +## Enforcing strict mode + +By default, any user function code is executed in *sloppy mode*. In order to +make a user function run in strict mode, use `"use strict"` explicitly inside +the user function: + +```js +function (values) { + "use strict" + + for (let i = 0; i < values.length; ++i) { + let name = values[i]; + if (name === "foo") { + return i; + } + } + return null; +} +``` + +Any violation of the strict mode triggers a runtime error. + +## Registering and unregistering user functions + +User-defined functions (UDFs) can be registered in the selected database +using the `@arangodb/aql/functions` module as follows: + +```js +var aqlfunctions = require("@arangodb/aql/functions"); +``` + +To register a function, the fully qualified function name plus the +function code must be specified. This can easily be done in +[arangosh](../components/tools/arangodb-shell/_index.md). The +[HTTP Interface](../develop/http-api/queries/user-defined-aql-functions.md) also offers +User Functions management. + +In a cluster setup, make sure to connect to a Coordinator to manage the UDFs. + +Documents in the `_aqlfunctions` collection (or any other system collection) +should not be accessed directly, but only via the dedicated interfaces. +Otherwise you might see caching issues or accidentally break something. +The interfaces ensure the correct format of the documents and invalidate +the UDF cache. + +### Registering an AQL user function + +For testing, it may be sufficient to directly type the function code in the shell. +To manage more complex code, you may write it in the code editor of your choice +and save it as file. For example: + +```js +/* path/to/file.js */ +'use strict'; + +function greeting(name) { + if (name === undefined) { + name = "World"; + } + return `Hello ${name}!`; +} + +module.exports = greeting; +``` + +Then require it in the shell in order to register a user-defined function: + +```js +arangosh> var func = require("path/to/file.js"); +arangosh> aqlfunctions.register("HUMAN::GREETING", func, true); +``` + +Note that a return value of `false` means that the function `HUMAN::GREETING` +was newly created, and not that it failed to register. `true` is returned +if a function of that name existed before and was just updated. + +`aqlfunctions.register(name, code, isDeterministic)` + +Registers an AQL user function, identified by a fully qualified function +name. The function code in `code` must be specified as a JavaScript +function or a string representation of a JavaScript function. +If the function code in `code` is passed as a string, it is required that +the string evaluates to a JavaScript function definition. + +If a function identified by `name` already exists, the previous function +definition is updated. Please also make sure that the function code +does not violate the conventions for AQL functions, in particular with regards +to the [naming](#naming) and [side-effects](#variables-and-side-effects). + +The `isDeterministic` attribute can be used to specify whether the +function results are fully deterministic (i.e. depend solely on the input +and are the same for repeated calls with the same input values). It is not +used at the moment but may be used for optimizations later. + +The registered function is stored in the selected database's system +collection `_aqlfunctions`. + +The function returns `true` when it updates/replaces an existing AQL +function of the same name, and `false` otherwise. It throws an exception +if it detects syntactically invalid function code. + +**Examples** + +```js +require("@arangodb/aql/functions").register("MYFUNCTIONS::TEMPERATURE::CELSIUSTOFAHRENHEIT", +function (celsius) { + return celsius * 1.8 + 32; +}); +``` + +The function code is not executed in *strict mode* or *strong mode* by +default. In order to make a user function being run in strict mode, use +`use strict` explicitly, e.g.: + +```js +require("@arangodb/aql/functions").register("MYFUNCTIONS::TEMPERATURE::CELSIUSTOFAHRENHEIT", +function (celsius) { + "use strict"; + return celsius * 1.8 + 32; +}); +``` + +You can access the name under which the AQL function is registered by accessing +the `name` property of `this` inside the JavaScript code: + +```js +require("@arangodb/aql/functions").register("MYFUNCTIONS::TEMPERATURE::CELSIUSTOFAHRENHEIT", +function (celsius) { + "use strict"; + if (typeof celsius === "undefined") { + const error = require("@arangodb").errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH; + AQL_WARNING(error.code, require("util").format(error.message, this.name, 1, 1)); + } + return celsius * 1.8 + 32; +}); +``` + +`AQL_WARNING()` is automatically available to the code of user-defined +functions. The error code and message is retrieved via `@arangodb` module. +The *argument number mismatch* message has placeholders, which we can substitute +using [format()](http://nodejs.org/api/util.html): + +``` +invalid number of arguments for function '%s()', expected number of arguments: minimum: %d, maximum: %d +``` + +In the example above, `%s` is replaced by `this.name` (the AQL function name), +and both `%d` placeholders by `1` (number of expected arguments). If you call +the function without an argument, you see this: + +```js +arangosh> db._query("RETURN MYFUNCTIONS::TEMPERATURE::CELSIUSTOFAHRENHEIT()") +[object ArangoQueryCursor, count: 1, hasMore: false, warning: 1541 - invalid +number of arguments for function 'MYFUNCTIONS::TEMPERATURE::CELSIUSTOFAHRENHEIT()', +expected number of arguments: minimum: 1, maximum: 1] + +[ + null +] +``` + +### Deleting an existing AQL user function + +`aqlfunctions.unregister(name)` + +Unregisters an existing AQL user function, identified by the fully qualified +function name. + +Trying to unregister a function that does not exist results in an +exception. + +**Examples** + +```js +require("@arangodb/aql/functions").unregister("MYFUNCTIONS::TEMPERATURE::CELSIUSTOFAHRENHEIT"); +``` + +### Unregister group + +Delete a group of AQL user functions: + +`aqlfunctions.unregisterGroup(prefix)` + +Unregisters a group of AQL user function, identified by a common function +group prefix. + +This returns the number of functions unregistered. + +**Examples** + +```js +require("@arangodb/aql/functions").unregisterGroup("MYFUNCTIONS::TEMPERATURE"); + +require("@arangodb/aql/functions").unregisterGroup("MYFUNCTIONS"); +``` + +### Listing all AQL user functions + +`aqlfunctions.toArray()` + +Returns all previously registered AQL user functions, with their fully +qualified names and function code. + +--- + +`aqlfunctions.toArray(prefix)` + +Returns all previously registered AQL user functions, restricted to a specified +group of functions by specifying a group prefix. + +**Examples** + +To list all available user functions: + +```js +require("@arangodb/aql/functions").toArray(); +``` + +To list all available user functions in the *MYFUNCTIONS* namespace: + +```js +require("@arangodb/aql/functions").toArray("MYFUNCTIONS"); +``` + +To list all available user functions in the *MYFUNCTIONS::TEMPERATURE* namespace: + +```js +require("@arangodb/aql/functions").toArray("MYFUNCTIONS::TEMPERATURE"); +``` + +## Deployment Details + +Internally, UDFs are stored in a system collection named `_aqlfunctions` +of the selected database. When an AQL statement refers to such a UDF, +it is loaded from that collection. The UDFs will be exclusively +available for queries in that particular database. + +Since the Coordinator doesn't have own local collections, the `_aqlfunctions` +collection is sharded across the cluster. Therefore (as usual), it has to be +accessed through a Coordinator - you mustn't talk to the shards directly. +Once it is in the `_aqlfunctions` collection, it is available on all +Coordinators without additional effort. + +Keep in mind that system collections are excluded from dumps created with +[arangodump](../components/tools/arangodump/_index.md) by default. +To include AQL UDF in a dump, the dump needs to be started with +the option *--include-system-collections true*. diff --git a/site/content/arangodb/oem/components/_index.md b/site/content/arangodb/oem/components/_index.md new file mode 100644 index 0000000000..e5da4f23ad --- /dev/null +++ b/site/content/arangodb/oem/components/_index.md @@ -0,0 +1,6 @@ +--- +title: Components +menuTitle: Components +weight: 165 +description: '' +--- diff --git a/site/content/arangodb/oem/components/arangodb-server/_index.md b/site/content/arangodb/oem/components/arangodb-server/_index.md new file mode 100644 index 0000000000..44c9d1040c --- /dev/null +++ b/site/content/arangodb/oem/components/arangodb-server/_index.md @@ -0,0 +1,21 @@ +--- +title: ArangoDB Server +menuTitle: ArangoDB Server +weight: 170 +description: >- + The ArangoDB daemon (arangod) is the central server binary that can run in + different modes for a variety of setups like single server and clusters +--- +The ArangoDB server is the core component of ArangoDB. The executable file to +run it is named `arangod`. The `d` stands for daemon. A daemon is a long-running +background process that answers requests for services. + +The server process serves the various client connections to the server via the +TCP/HTTP protocol. It also provides a [web interface](../web-interface/_index.md). + +_arangod_ can run in different modes for a variety of setups like single server +and clusters. It differs between the [Community Edition](../../about/features/community-edition.md) +and [Enterprise Edition](../../about/features/enterprise-edition.md). + +See [Administration](../../operations/administration/_index.md) for server configuration +and [Deploy](../../deploy/_index.md) for operation mode details. diff --git a/site/content/arangodb/oem/components/arangodb-server/environment-variables.md b/site/content/arangodb/oem/components/arangodb-server/environment-variables.md new file mode 100644 index 0000000000..62f73290c9 --- /dev/null +++ b/site/content/arangodb/oem/components/arangodb-server/environment-variables.md @@ -0,0 +1,108 @@ +--- +title: ArangoDB Server environment variables +menuTitle: Environment variables +weight: 15 +description: >- + Environment variables used by `arangod` +--- +`arangod` inspects the following list of environment variables: + + - `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` + + This variable can be used to override the automatic detection of the total + amount of RAM present on the system. One can specify a decimal number + (in bytes). Furthermore, numbers can have the following suffixes: + + - `TB`, `T`, `tb`, `t`: the number is multiplied by 1,000,000,000,000 (terabytes). + - `GB`, `G`, `gb`, `g`: the number is multiplied by 1,000,000,000 (gigabytes). + - `MB`, `M`, `mb`, `m`: the number is multiplied by 1,000,000 (megabytes). + - `KB`, `K`, `kb`, `k`: the number is multiplied by 1,000 (kilobytes). + - `TIB`, `TiB`, `tib`: the number is multiplied by 1,099,511,627,776 (tebibytes). + - `GIB`, `GiB`, `gib`: the number is multiplied by 1,073,741,824 (gibibytes). + - `MIB`, `MiB`, `mib`: the number is multiplied by 1,048,576 (mebibytes). + - `KIB`, `KiB`, `kib`: the number is multiplied by 1,024 (kibibytes). + - `B`, `b`: bytes + + The total amount of RAM detected is logged as an INFO message at + server start. If the variable is set, the overridden value is shown. + Various default sizes are calculated based on this value (e.g. the + RocksDB buffer cache size). + + Setting this option can in particular be useful in two cases: + + 1. If `arangod` is running in a container and its cgroup has a RAM + limitation, then one should specify this limitation in this + environment variable, since it is currently not automatically + detected. + 2. If `arangod` is running alongside other services on the same + machine and thus sharing the RAM with them, one should limit the + amount of memory using this environment variable. + + Note that setting this environment variable mainly affects the default + values of startup options that have to do with memory usage. + If the values of these startup options are explicitly set anyway, then + setting the environment variable has no effect. + + For example, the default value for the RocksDB block cache size + (`--rocksdb.block-cache-size` startup option) depends on the amount of + available memory. If you set `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=32GB`, + the default value for the block cache size is `(32GB - 2GB) * 0.3 = 9GB`. + However, if you set the `--rocksdb.block-cache-size` startup option explicitly + via a configuration file or via the command-line, then the latter value is + used, and not the option's default value based on the + `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` environment variable. + + - `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` + + This variable can be used to override the automatic detection of the + number of CPU cores present on the system. + + The number of CPU cores detected is logged as an INFO message at + server start. If the variable is set, the overridden value is shown. + Various default values for threading are calculated based on this value. + + Setting this option is useful if `arangod` is running in a container + or alongside other services on the same machine and shall not use + all available CPUs. + + - `ARANGODB_OVERRIDE_CRASH_HANDLER` + + This variable can be used to toggle the built-in crash handler in the + Linux builds of `arangod`. The crash handler is turned on by default + for Linux builds, and it can be turned off by setting this environment + variable to an empty string, the value of `0` or `off`. + +- `CACHE_OBLIVIOUS` _(introduced in v3.9.7, v3.10.3)_ + + If set to the string `true`, jemalloc allocates one additional page + (4096 bytes) for every allocation of 16384 or more bytes to change the + base address if it is not divisible by 4096. This can help the CPU caches if + the beginning of such blocks are accessed a lot. + + On the other hand, it increases the memory usage because of the page alignment. + The RocksDB buffer cache does most of its allocations for 16384 bytes, + increasing the RAM usage by 25%. Setting the option to `false` disables the + optimization but the performance is expected to be the same for ArangoDB. + + The default is `true` in 3.9 and 3.10 up to v3.10.3. From v3.10.4 onwards, + the default is `false`. + + Also see the [jemalloc documentation](http://jemalloc.net/jemalloc.3.html#opt.cache_oblivious). + +- `TZ_DATA` _(introduced in v3.8.0)_ + + This variable can be used to specify the path to the directory containing + the timezone information database for ArangoDB. That directory is normally + named `tzdata` and is shipped with ArangoDB releases. It is normally not + required to set this environment variable, but it may be necessary in + unusual setups with non-conventional directory layouts and paths. + +- `IRESEARCH_TEXT_STOPWORD_PATH` + + Path to a directory with stop word files for + [ArangoSearch Text Analyzers](../../index-and-search/analyzers.md#text). + +<!-- ARANGODB_CONFIG_PATH, ICU_DATA, ... (TRI_GETENV, iresearch::getenv) --> + +For Docker specific environment variables please refer to +[Docker Hub](https://hub.docker.com/_/arangodb) diff --git a/site/content/arangodb/oem/components/arangodb-server/ldap.md b/site/content/arangodb/oem/components/arangodb-server/ldap.md new file mode 100644 index 0000000000..2fde26e69f --- /dev/null +++ b/site/content/arangodb/oem/components/arangodb-server/ldap.md @@ -0,0 +1,563 @@ +--- +title: ArangoDB Server LDAP Options +menuTitle: LDAP +weight: 10 +description: >- + LDAP authentication options in the ArangoDB server +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +## Basics Concepts + +The basic idea is that one can keep the user authentication setup for +an ArangoDB instance (single or cluster) outside of ArangoDB in an LDAP +server. A crucial feature of this is that one can add and withdraw users +and permissions by only changing the LDAP server and in particular +without touching the ArangoDB instance. Changes are effective in +ArangoDB within a few minutes. + +Since there are many different possible LDAP setups, we must support a +variety of possibilities for authentication and authorization. Here is +a short overview: + +To map ArangoDB user names to LDAP users there are two authentication +methods called "simple" and "search". In the "simple" method the LDAP bind +user is derived from the ArangoDB user name by prepending a prefix and +appending a suffix. For example, a user "alice" could be mapped to the +distinguished name `uid=alice,dc=arangodb,dc=com` to perform the LDAP +bind and authentication. +See [Simple authentication method](#simple-authentication-method) +below for details and configuration options. + +In the "search" method there are two phases. In Phase 1 a generic +read-only admin LDAP user account is used to bind to the LDAP server +first and search for an LDAP user matching the ArangoDB user name. In +Phase 2, the actual authentication is then performed against the LDAP +user that was found in phase 1. Both methods are sensible and are +recommended to use in production. +See [Search authentication method](#search-authentication-method) +below for details and configuration options. + +Once the user is authenticated, there are now two methods for +authorization: (a) "roles attribute" and (b) "roles search". + +In method (a) ArangoDB acquires a list of roles the authenticated LDAP +user has from the LDAP server. The actual access rights to databases +and collections for these roles are configured in ArangoDB itself. +Users effectively have the union of all access rights of all roles +they have. This method is probably the most common one for production use +cases. It combines the advantages of managing users and roles outside of +ArangoDB in the LDAP server with the fine grained access control within +ArangoDB for the individual roles. See [Roles attribute](#roles-attribute) +below for details about method (a) and for the associated configuration +options. + +Method (b) is very similar and only differs from (a) in the way the +actual list of roles of a user is derived from the LDAP server. +See [Roles search](#roles-search) below for details about method (b) +and for the associated configuration options. + +## Fundamental options + +The fundamental options for specifying how to access the LDAP server are +the following: + + - `--ldap.enabled` this is a boolean option which must be set to + `true` to activate the LDAP feature + - `--ldap.server` is a string specifying the host name or IP address + of the LDAP server + - `--ldap.port` is an integer specifying the port the LDAP server is + running on, the default is `389` + - `--ldap.basedn` specifies the base distinguished name under which + the search takes place (can alternatively be set via `--ldap.url`) + - `--ldap.binddn` and `--ldap.bindpasswd` are distinguished name and + password for a read-only LDAP user to which ArangoDB can bind to + search the LDAP server. Note that it is necessary to configure these + for both the "simple" and "search" authentication methods, since + even in the "simple" method, ArangoDB occasionally has to refresh + the authorization information from the LDAP server + even if the user session persists and no new authentication is + needed! It is, however, allowed to leave both empty, but then the + LDAP server must be readable with anonymous access. + - `--ldap.refresh-rate` is a floating point value in seconds. The + default is 300, which means that ArangoDB refreshes the + authorization information for authenticated users after at most 5 + minutes. This means that changes in the LDAP server like removed + users or added or removed roles for a user are effective after + at most 5 minutes. + +Note that the `--ldap.server` and `--ldap.port` options can +alternatively be specified in the `--ldap.url` string together with +other configuration options. For details see Section "LDAP URLs" below. + +Here is an example on how to configure the connection to the LDAP server, +with anonymous bind: + +``` +--ldap.enabled=true \ +--ldap.server=ldap.arangodb.com \ +--ldap.basedn=dc=arangodb,dc=com +``` + +With this configuration ArangoDB binds anonymously to the LDAP server +on host `ldap.arangodb.com` on the default port 389 and executes all searches +under the base distinguished name `dc=arangodb,dc=com`. + +If we need a user to read in LDAP here is the example for it: + +``` +--ldap.enabled=true \ +--ldap.server=ldap.arangodb.com \ +--ldap.basedn=dc=arangodb,dc=com \ +--ldap.binddn=uid=arangoadmin,dc=arangodb,dc=com \ +--ldap.bindpasswd=supersecretpassword +``` + +The connection is identical but the searches are executed with the +given distinguished name in `binddn`. + +Note here: +The given user (or the anonymous one) needs at least read access on +all user objects to find them and in the case of Roles search +also read access on the objects storing the roles. + +Up to this point ArangoDB can now connect to a given LDAP server +but it is not yet able to authenticate users properly with it. +For this pick one of the following two authentication methods. + +### LDAP URLs + +As an alternative one can specify the values of multiple LDAP related configuration +options by specifying a single LDAP URL. Here is an example: + +``` +--ldap.url ldap://ldap.arangodb.com:1234/dc=arangodb,dc=com?uid?sub +``` + +This one option has the combined effect of setting the following: + +``` +--ldap.server=ldap.arangodb.com \ +--ldap.port=1234 \ +--ldap.basedn=dc=arangodb,dc=com \ +--ldap.searchAttribute=uid \ +--ldap.searchScope=sub +``` + +That is, the LDAP URL consists of the LDAP `server` and `port`, a `basedn`, a +`searchAttribute`, and a `searchScope` which can be one of `base`, `one`, or +`sub`. There is also the possibility to use the `ldaps` protocol as in: + +``` +--ldap.url ldaps://ldap.arangodb.com:636/dc=arangodb,dc=com?uid?sub +``` + +This does exactly the same as the one above, except that it uses the +LDAP over TLS protocol. This is a non-standard method which does not +involve using the STARTTLS protocol. Note that this does not work in the +Windows version! We suggest to use the `ldap` protocol and STARTTLS +as described in the next section. + +### TLS options + +{{< warning >}} +TLS is not supported in the Windows version of ArangoDB! +{{< /warning >}} + +To configure the usage of encrypted TLS to communicate with the LDAP server +the following options are available: + +- `--ldap.tls`: the main switch to active TLS. can either be + `true` (use TLS) or `false` (do not use TLS). It is switched + off by default. If you switch this on and do not use the `ldaps` + protocol via the [LDAP URL](#ldap-urls), then ArangoDB + uses the `STARTTLS` protocol to initiate TLS. This is the + recommended approach. +- `--ldap.tls-version`: the minimal TLS version that ArangoDB should accept. + Available versions are `1.0`, `1.1` and `1.2`. The default is `1.2`. If + your LDAP server does not support Version 1.2, you have to change + this setting. +- `--ldap.tls-cert-check-strategy`: strategy to validate the LDAP server + certificate. Available strategies are `never`, `hard`, + `demand`, `allow` and `try`. The default is `hard`. +- `--ldap.tls-cacert-file`: a file path to one or more (concatenated) + certificate authority certificates in PEM format. + As default no file path is configured. This certificate + is used to validate the server response. +- `--ldap.tls-cacert-dir`: a directory path to certificate authority certificates in + [c_rehash](https://www.openssl.org/docs/man3.0/man1/c_rehash.html) + format. As default no directory path is configured. + +Assuming you have the TLS CAcert file that is given to the server at +`/path/to/certificate.pem`, here is an example on how to configure TLS: + +``` +--ldap.tls true \ +--ldap.tls-cacert-file /path/to/certificate.pem +``` + +You can use TLS with any of the following authentication mechanisms. + +### Secondary server options (`ldap2`) + +The `ldap.*` options configure the primary LDAP server. It is possible to +configure a secondary server with the `ldap2.*` options to use it as a +fail-over for the case that the primary server is not reachable, but also to +let the primary servers handle some users and the secondary others. + +Instead of `--ldap.<OPTION>` you need to specify `--ldap2.<OPTION>`. +Authentication / authorization first checks the primary LDAP server. +If this server cannot authenticate a user, it tries the secondary one. + +It is possible to specify a file containing all users that the primary +LDAP server is handling by specifying the option `--ldap.responsible-for`. +This file must contain the usernames line-by-line. This is also supported for +the secondary server, which can be used to exclude certain users completely. + +### Esoteric options + +The following options can be used to configure advanced options for LDAP +connectivity: + +- `--ldap.serialized`: whether or not calls into the underlying LDAP library should be serialized. + This option can be used to work around thread-unsafe LDAP library functionality. +- `--ldap.serialize-timeout`: sets the timeout value that is used when waiting to enter the + LDAP library call serialization lock. This is only meaningful when `--ldap.serialized` has been + set to `true`. +- `--ldap.retries`: number of tries to attempt a connection. Setting this to values greater than + one will make ArangoDB retry to contact the LDAP server in case no connection can be made + initially. + +Please note that some of the following options are platform-specific and may not work +with all LDAP servers reliably: + +- `--ldap.restart`: whether or not the LDAP library should implicitly restart connections +- `--ldap.referrals`: whether or not the LDAP library should implicitly chase referrals + +The following options can be used to adjust the LDAP configuration on Linux and macOS +platforms only, but does not work on Windows: + +- `--ldap.debug`: turn on internal OpenLDAP library output (warning: prints to stdout). +- `--ldap.timeout`: timeout value (in seconds) for synchronous LDAP API calls (a value of 0 + means default timeout). +- `--ldap.network-timeout`: timeout value (in seconds) after which network operations + following the initial connection return in case of no activity (a value of 0 means default timeout). +- `--ldap.async-connect`: whether or not the connection to the LDAP library is done + asynchronously. + +## Authentication methods + +In order to authenticate users in LDAP we have two options available. +We need to pick exactly one them. + +### Simple authentication method + +The simple authentication method is used if and only if both the +`--ldap.prefix` and `--ldap.suffix` configuration options are specified +and are non-empty. In all other cases the +["search" authentication method](#search-authentication-method) is used. + +In the "simple" method the LDAP bind user is derived from the ArangoDB +user name by prepending the value of the `--ldap.prefix` configuration +option and by appending the value of the `--ldap.suffix` configuration +option. For example, an ArangoDB user "alice" would be mapped to the +distinguished name `uid=alice,dc=arangodb,dc=com` to perform the LDAP +bind and authentication, if `--ldap.prefix` is set to `uid=` and +`--ldap.suffix` is set to `,dc=arangodb,dc=com`. + +ArangoDB binds to the LDAP server and authenticates with the +distinguished name and the password provided by the client. If +the LDAP server successfully verifies the password then the user is +authenticated. + +If you want to use this method add the following example to your +ArangoDB configuration together with the fundamental configuration: + +``` +--ldap.prefix uid= \ +--ldap.suffix ,dc=arangodb,dc=com +``` + +This method authenticates an LDAP user with the distinguished name +`{PREFIX}{USERNAME}{SUFFIX}`, in this case for the ArangoDB user `alice`. +It searches for: `uid=alice,dc=arangodb,dc=com`. +This distinguished name is used as `{USER}` for the roles later on. + +### Search authentication method + +The search authentication method is used if at least one of the two +options `--ldap.prefix` and `--ldap.suffix` is empty or not specified. +ArangoDB uses the LDAP user credentials given by the `--ldap.binddn` and +`--ldap.bindpasswd` to perform a search for LDAP users. +In this case, the values of the options `--ldap.basedn`, +`--ldap.search-attribute`, `--ldap.search-filter` and `--ldap.search-scope` +are used in the following way: + +- `--ldap.search-scope` is an LDAP search scope with possible values + `base` (just search the base distinguished name), + `sub` (recursive search under the base distinguished name) or + `one` (search the base's immediate children) (default: `sub`) +- `--ldap.search-filter` is an LDAP filter expression which limits the + set of LDAP users being considered (default: `objectClass=*` which + means all objects). The placeholder `{USER}` is replaced by the + supplied username. +- `--ldap.search-attribute` specifies the attribute in the user objects + which is used to match the ArangoDB user name (default: `uid`) + +Here is an example on how to configure the search method. +Assume we have users like the following stored in LDAP: + +``` +dn: uid=alice,dc=arangodb,dc=com +uid: alice +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: top +objectClass: person +``` + +Where `uid` is the username used in ArangoDB, and we only search +for objects of type `person` then we can add the following to our +fundamental LDAP configuration: + +``` +--ldap.search-attribute=uid \ +--ldap.search-filter=objectClass=person +``` + +This uses the `sub` search scope by default and finds +all `person` objects where the `uid` is equal to the given username. +From these, the `dn` is extracted and used as `{USER}` in +the roles later on. + +## Fetching roles for a user + +After authentication, the next step is to derive authorization +information from the authenticated LDAP user. +In order to fetch the roles and thereby the access rights +for a user we again have two possible options and need to pick +one of them. We can combine each authentication method +with each role method. +In any case a user can have no role or more than one. +If a user has no role, the user does not get any access +to ArangoDB at all. +If a user has multiple roles with different rights, +then the rights are combined and the *strongest* +right wins. Example: + +- `alice` has the roles `project-a` and `project-b`. +- `project-a` has no access to collection `BData`. +- `project-b` has `rw` access to collection `BData`, +- hence `alice` has `rw` access on `BData`. + +Note that the actual database and collection access rights +are configured in ArangoDB itself by roles in the users module. +The role name is always prefixed with `:role:`, e.g.: `:role:project-a` +and `:role:project-b` respectively. You can use the normal user +permissions tools in the Web interface or `arangosh` to configure these. + +### Roles attribute + +The most important method for this is to read off the roles an LDAP +user is associated with from an attribute in the LDAP user object. +If the + +``` +--ldap.roles-attribute-name +``` + +configuration option is set, then the value of that +option is the name of the attribute being used. + +Here is the example to add to the overall configuration: + +``` +--ldap.roles-attribute-name=role +``` + +If we have the user stored like the following in LDAP: + +``` +dn: uid=alice,dc=arangodb,dc=com +uid: alice +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: top +objectClass: person +role: project-a +role: project-b +``` + +Then the request grants the roles `project-a` and `project-b` +for the user `alice` after successful authentication, +as they are stored within the `role` on the user object. + +### Roles search + +An alternative method for authorization is to conduct a search in the +LDAP server for LDAP objects representing roles a user has. If the + +``` +--ldap.roles-search=<search-expression> +``` + +configuration option +is given, then the string `{USER}` in `<search-expression>` is replaced +with the distinguished name of the authenticated LDAP user and the +resulting search expression is used to match distinguished names of +LDAP objects representing roles of that user. + +Example: + +``` +--ldap.roles-search '(&(objectClass=groupOfUniqueNames)(uniqueMember={USER}))' +``` + +After a LDAP user is found and authenticated as described in the +authentication section above, the `{USER}` in the search expression +is replaced by its distinguished name, e.g. `uid=alice,dc=arangodb,dc=com`, +and thus with the above search expression the actual search expression +ends up being: + +``` +(&(objectClass=groupOfUniqueNames)(uniqueMember=uid=alice,dc=arangodb,dc=com})) +``` + +This search finds all objects of `groupOfUniqueNames` where +at least one `uniqueMember` has the `dn` of `alice`. +The list of results of that search would be the list of roles given by +the values of the `dn` attributes of the found role objects. + +### Role transformations and filters + +For both of the above authorization methods there are further +configuration options to tune the role lookup. In this section we +describe these further options: + +- `--ldap.roles-include` can be used to specify a regular expression + that is used to filter roles. Only roles that match the regular + expression are used. + +- `--ldap.roles-exclude` can be used to specify a regular expression + that is used to filter roles. Only roles that do not match the regular + expression are used. + +- `--ldap.roles-transformation` can be used to specify a regular + expression and replacement text as `/re/text/`. This regular + expression is applied to the role name found. This is especially + useful in the roles-search variant to extract the real role name + out of the `dn` value. + +- `--ldap.superuser-role` can be used to specify the role associated + with the superuser. Any user belonging to this role gains superuser + status. This role is checked after applying the roles-transformation + expression. + +Example: + +``` +--ldap.roles-include "^arangodb" +``` + +This setting only considers roles that start with `arangodb`. + +``` +--ldap.roles-exclude=disabled +``` + +This setting only considers roles that do contain the word `disabled`. + +``` +--ldap.superuser-role "arangodb-admin" +``` + +Anyone belonging to the group `arangodb-admin` become a superuser. + +The roles-transformation deserves a larger example. Assume we are using +roles search and have stored roles in the following way: + +``` +dn: cn=project-a,dc=arangodb,dc=com +objectClass: top +objectClass: groupOfUniqueNames +uniqueMember: uid=alice,dc=arangodb,dc=com +uniqueMember: uid=bob,dc=arangodb,dc=com +cn: project-a +description: Internal project A + +dn: cn=project-b,dc=arangodb,dc=com +objectClass: top +objectClass: groupOfUniqueNames +uniqueMember: uid=alice,dc=arangodb,dc=com +uniqueMember: uid=charlie,dc=arangodb,dc=com +cn: project-b +description: External project B +``` + +In this case, we find `cn=project-a,dc=arangodb,dc=com` as one +role of `alice`. However, we actually want to configure a role name +`:role:project-a`, which is easier to read and maintain for our +administrators. + +If we now apply the following transformation: + +``` +--ldap.roles-transformation=/^cn=([^,]*),.*$/$1/ +``` + +The regex extracts out `project-a` respectively `project-b` of the +`dn` attribute. + +In combination with the `superuser-role` we could make all +`project-a` members arangodb admins by using: + +``` +--ldap.roles-transformation=/^cn=([^,]*),.*$/$1/ \ +--ldap.superuser-role=project-a +``` + +## Complete configuration examples + +In this section we would like to present complete examples +for a successful LDAP configuration of ArangoDB. +All of the following are just combinations of the details described above. + +**Simple authentication with role-search, using anonymous LDAP user** + +This example connects to the LDAP server with an anonymous read-only +user. We use the simple authentication mode (`prefix` + `suffix`) +to authenticate users and apply a role search for `groupOfUniqueNames` objects +where the user is a `uniqueMember`. Furthermore we extract only the `cn` +out of the distinguished role name. + +``` +--ldap.enabled=true \ +--ldap.server=ldap.arangodb.com \ +--ldap.basedn=dc=arangodb,dc=com \ +--ldap.prefix uid= \ +--ldap.suffix ,dc=arangodb,dc=com \ +--ldap.roles-search '(&(objectClass=groupOfUniqueNames)(uniqueMember={USER}))' \ +--ldap.roles-transformation=/^cn=([^,]*),.*$/$1/ \ +--ldap.superuser-role=project-a +``` + +**Search authentication with roles attribute using LDAP admin user having TLS enabled** + +This example connects to the LDAP server with a given distinguished name of an +admin user + password. +Furthermore we activate TLS and give the certificate file to validate server responses. +We use the search authentication searching for the `uid` attribute of `person` objects. +These `person` objects have `role` attribute(s) containing the role(s) of a user. + +``` +--ldap.enabled=true \ +--ldap.server=ldap.arangodb.com \ +--ldap.basedn=dc=arangodb,dc=com \ +--ldap.binddn=uid=arangoadmin,dc=arangodb,dc=com \ +--ldap.bindpasswd=supersecretpassword \ +--ldap.tls true \ +--ldap.tls-cacert-file /path/to/certificate.pem \ +--ldap.search-attribute=uid \ +--ldap.search-filter=objectClass=person \ +--ldap.roles-attribute-name=role +``` diff --git a/site/content/arangodb/oem/components/arangodb-server/options.md b/site/content/arangodb/oem/components/arangodb-server/options.md new file mode 100644 index 0000000000..161615d39a --- /dev/null +++ b/site/content/arangodb/oem/components/arangodb-server/options.md @@ -0,0 +1,56 @@ +--- +title: ArangoDB Server Options +menuTitle: Options +weight: 5 +description: >- + The startup options of the `arangod` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangod [<options>]` + +To list the commonly used startup options with a description of each option, run +the server executable in a command-line with the `--help` (or `-h`) option: + +``` +arangod --help +``` + +To list **all** available startup options and their descriptions, use: + +``` +arangod --help-all +``` + +You can specify the database directory for the server as a positional (unnamed) +parameter: + +``` +arangod /path/to/datadir +``` + +You can also be explicit by using a named parameter: + +``` +arangod --database.directory /path/to/datadir +``` + +All other startup options need to be passed as named parameters, using two +hyphens (`--`), followed by the option name, an equals sign (`=`) or a space, +and the option value. The value needs to be wrapped in double quote marks (`"`) +if the value contains whitespace characters. Extra whitespace around `=` is +allowed: + +``` +arangod --database.directory = "/path with spaces/to/datadir" +``` + +See [Configuration](../../operations/administration/configuration.md) +if you want to translate startup options set to configuration files +and to learn more about startup options in general. + +See +[Fetch Current Configuration Options](../../operations/administration/configuration.md#fetch-current-configuration-options) +if you want to query the `arangod` server for the current settings at runtime. + +{{% program-options name="arangod" %}} diff --git a/site/content/arangodb/oem/components/arangodb-server/storage-engine.md b/site/content/arangodb/oem/components/arangodb-server/storage-engine.md new file mode 100644 index 0000000000..864211c97c --- /dev/null +++ b/site/content/arangodb/oem/components/arangodb-server/storage-engine.md @@ -0,0 +1,200 @@ +--- +title: Storage Engine +menuTitle: Storage Engine +weight: 20 +description: >- + The storage engine is responsible for persisting data on disk, holding copies + in memory, providing indexes and caches to speed up queries +aliases: + - ../../deploy/architecture/storage-engine +--- +ArangoDB's storage engine is based on Facebook's **RocksDB** and the only +storage engine available in ArangoDB 3.7 and above. It is the bottom layer of +the database system. + +## RocksDB + +RocksDB is an embeddable persistent key-value store. It is a log +structure database and is optimized for fast storage. + +The RocksDB engine is optimized for large data-sets and allows for a +steady insert performance even if the data-set is much larger than the +main memory. Indexes are always stored on disk but caches are used to +speed up performance. RocksDB uses document-level locks allowing for +concurrent writes. Writes do not block reads. Reads do not block writes. + +### Advantages + +RocksDB is a very flexible engine that can be configured for various use cases. + +The main advantages of RocksDB are: + +- document-level locks +- support for large data-sets +- persistent indexes + +### Caveats + +RocksDB allows concurrent writes. However, when touching the same document at +the same time, a write conflict is raised. It is possible to exclusively lock +collections when executing AQL. This avoids write conflicts, but also inhibits +concurrent writes. + +ArangoDB uses RocksDB transactions to implement the transaction handling for +standalone AQL queries (outside of JavaScript Transactions and Stream Transactions). + +RocksDB imposes a limit on the transaction size. It is optimized to handle small +transactions very efficiently, but is effectively limiting the total size of +transactions. If you have an AQL query that modifies a lot of documents, it is +necessary to commit data in-between. Transactions that get too big (in terms of +number of operations involved or the total size of data modified by the transaction) +are committed automatically. Effectively, this means that big user transactions +are split into multiple smaller RocksDB transactions that are committed individually. +The entire user transaction does not necessarily have ACID properties in this case. + +The threshold values for transaction sizes can be configured globally as well as +overridden per transaction. See +[Known limitations for AQL queries](../../aql/fundamentals/limitations.md#storage-engine-properties). + +### Write-ahead log + +Write-ahead logging is used for data recovery after a server crash and for +replication. + +ArangoDB's RocksDB storage engine stores all data-modification operation in a +write-ahead log (WAL). The WAL is sequence of append-only files containing +all the write operations that were executed on the server. +It is used to run data recovery after a server crash, and can also be used in +a replication setup when Followers need to replay the same sequence of operations as +on the Leader. + +The individual RocksDB WAL files are per default about 64 MiB big. +The size is always proportionally sized to the value specified via +`--rocksdb.write-buffer-size`. The value specifies the amount of data to build +up in memory (backed by the unsorted WAL on disk) before converting it to a +sorted on-disk file. + +Larger values can increase performance, especially during bulk loads. +Up to `--rocksdb.max-write-buffer-number` write buffers may be held in memory +at the same time, so you may wish to adjust this parameter to control memory +usage. A larger write buffer results in a longer recovery time the next +time the database is opened. + +The RocksDB WAL only contains committed transactions. This means you never +see partial transactions in the replication log, but it also means transactions +are tracked completely in-memory. In practice this causes RocksDB transaction +sizes to be limited, for more information see the +[RocksDB Configuration](../../components/arangodb-server/options.md#rocksdb) + +### Performance + +RocksDB is based on a log-structured merge tree. A good introduction can be +found in: + +- [www.benstopford.com/2015/02/14/log-structured-merge-trees/](http://www.benstopford.com/2015/02/14/log-structured-merge-trees/) +- [blog.acolyer.org/2014/11/26/the-log-structured-merge-tree-lsm-tree/](https://web.archive.org/web/20241108174258/https://blog.acolyer.org/2014/11/26/the-log-structured-merge-tree-lsm-tree/) + +The basic idea is that data is organized in levels were each level is a factor +larger than the previous. New data resides in smaller levels while old data +is moved down to the larger levels. This allows to support high rate of inserts +over an extended period. In principle it is possible that the different levels +reside on different storage media. The smaller ones on fast SSD, the larger ones +on bigger spinning disks. + +RocksDB itself provides a lot of different knobs to fine tune the storage +engine according to your use-case. ArangoDB supports the most common ones +using the options below. + +Performance reports for the storage engine can be found here: + +- [github.com/facebook/rocksdb/wiki/performance-benchmarks](https://github.com/facebook/rocksdb/wiki/performance-benchmarks) +- [github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide](https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide) + +### Compression + +RocksDB can compress the content it stores to save disk space and improve the +I/O performance at the cost of an increased CPU utilization. It is controlled +by the `--rocksdb.compression-type` startup option of the ArangoDB server. + +ArangoDB has compression enabled by default using the LZ4 algorithm. It is +optimized for compressing and decompressing with a low CPU overhead instead of a +high compression ratio but can still achieve a 1:6 ratio for lexical content. +The Snappy compression algorithm has similar characteristics but is slower at +decompression. + +No compression is used for the lowest levels of the RocksDB LSM tree as this +data gets rewritten into the higher levels quickly. By default, only level 2 +and higher use compression. This is configurable via the +`--rocksdb.num-uncompressed-levels` startup option. + +### ArangoDB options + +ArangoDB has a cache for the persistent indexes in RocksDB. The total size +of this cache is controlled by the option + +``` +--cache.size +``` + +RocksDB also has a cache for the blocks stored on disk. The size of +this cache is controlled by the option + +``` +--rocksdb.block-cache-size +``` + +ArangoDB distributes the available memory equally between the two +caches by default. + +ArangoDB chooses a size for the various levels in RocksDB that is +suitable for general purpose applications. + +RocksDB log structured data levels have increasing size + +``` +MEM: -- +L0: -- +L1: -- -- +L2: -- -- -- -- +... +``` + +New or updated Documents are first stored in memory. If this memtable +reaches the limit given by + +``` +--rocksdb.write-buffer-size +``` + +it is converted to an SST file and inserted at level 0. + +The following option controls the size of each level and the depth: + +``` +--rocksdb.num-levels N +``` + +It limits the number of levels to `N`. By default, it is `7` and there is +seldom a reason to change this. A new level is only opened if there is +too much data in the previous one. + +``` +--rocksdb.max-bytes-for-level-base B +``` + +L0 holds at most `B` bytes. + +``` +--rocksdb.max-bytes-for-level-multiplier M +``` + +Each level is at most `M` times as much bytes as the previous +one. Therefore the maximum number of bytes-for-level `L` can be +calculated as follows: + +``` +max-bytes-for-level-base * (max-bytes-for-level-multiplier ^ (L-1)) +``` + +Also see [Reducing the Memory Footprint of ArangoDB servers](../../operations/administration/reduce-memory-footprint.md) +and [ArangoDB Server Options](options.md#rocksdb) for descriptions of RocksDB options. diff --git a/site/content/arangodb/oem/components/tools/_index.md b/site/content/arangodb/oem/components/tools/_index.md new file mode 100644 index 0000000000..318e0379eb --- /dev/null +++ b/site/content/arangodb/oem/components/tools/_index.md @@ -0,0 +1,35 @@ +--- +title: Tools +menuTitle: Tools +weight: 180 +description: >- + ArangoDB ships with command-line tools like for accessing server instances + programmatically, deploying clusters, creating backups, and importing data +--- +A full ArangoDB installation package contains the [ArangoDB server](../arangodb-server/_index.md) +(`arangod`) as well as the following client tools: + +| Executable name | Brief description | +|-----------------|-------------------| +| `arangosh` | [ArangoDB shell](arangodb-shell/_index.md). A client that implements a read-eval-print loop (REPL) and provides functions to access and administrate the ArangoDB server. +| `arangodb` | [ArangoDB Starter](arangodb-starter/_index.md) for easy deployment of ArangoDB instances. +| `arangodump` | Tool to [create backups](arangodump/_index.md) of an ArangoDB database. +| `arangorestore` | Tool to [load backups](arangorestore/_index.md) back into an ArangoDB database. +| `arangobackup` | Tool to [perform hot backup operations](arangobackup/_index.md) on an ArangoDB installation. +| `arangoimport` | [Bulk importer](arangoimport/_index.md) for the ArangoDB server. It supports JSON and CSV. +| `arangoexport` | [Bulk exporter](arangoexport/_index.md) for the ArangoDB server. It supports JSON, CSV and XML. +| `arangobench` | [Benchmark and test tool](arangobench/_index.md). It can be used for performance and server function testing. +| `arangovpack` | Utility to validate and [convert VelocyPack](arangovpack/_index.md) and JSON data. +| `arangoinspect` | [Inspection tool](arangoinspect/_index.md) that gathers server setup information. + +A client installation package comes without the `arangod` server executable and +the ArangoDB Starter. + +Additional tools which are available separately: + +| Name | Brief description | +|-----------------|-------------------| +| [Foxx CLI](foxx-cli/_index.md) | Command line tool for managing and developing Foxx services +| [kube-arangodb](../../deploy/kubernetes.md) | Operators to manage Kubernetes deployments +| [oasisctl](../../../../amp/oasisctl/_index.md) | Command-line tool for managing the Arango Managed Platform (AMP) +| [ArangoDB Datasets](arango-datasets.md) | A Python package for loading sample datasets into ArangoDB diff --git a/site/content/arangodb/oem/components/tools/arango-datasets.md b/site/content/arangodb/oem/components/tools/arango-datasets.md new file mode 100644 index 0000000000..a24903550f --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arango-datasets.md @@ -0,0 +1,62 @@ +--- +title: ArangoDB Datasets +menuTitle: ArangoDB Datasets +weight: 60 +description: >- + `arango-datasets` is a Python package for loading sample datasets into ArangoDB +--- +You can use the `arango-datasets` package in conjunction with the `python-arango` +driver to load example data into your ArangoDB deployments. The data is hosted +on AWS S3. There are a number of existing datasets already available and you can +view them by calling the `list_datasets()` method as shown below. + +## Install + +To install the Python package, you can use the `pip` command to directly install +it from [PyPi](https://pypi.org/project/arango-datasets/): + +```sh +pip install arango-datasets +``` + +You can find the source code repository of the module on GitHub: +<https://github.com/arangoml/arangodb_datasets> + +## Usage + +Once you have installed the `arango-datasets` package, you can use it to +download and import datasets into your deployment with `arango_datasets.Datasets`. + +The `Datasets` constructor requires a valid [python-arango](../../develop/drivers/python.md) +database object as input. It defines the target deployment, database, and +credentials to load a dataset. + +```py +from arango import ArangoClient +db = ArangoClient(hosts='http://localhost:8529').db("dbName", username="root", password="") +``` + +Pass the database object to the `Datasets` constructor: + +```py +from arango_datasets import Datasets +datasets = Datasets(db) +``` + +List the available datasets: + +```py +print(datasets.list_datasets()) +``` + +List more information about a particular dataset: + +```py +print(datasets.dataset_info("IMDB_X")) +``` + +Import the dataset: + +```py +datasets.load("IMDB_X") +``` diff --git a/site/content/arangodb/oem/components/tools/arangobackup/_index.md b/site/content/arangodb/oem/components/tools/arangobackup/_index.md new file mode 100644 index 0000000000..d5b23e696c --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangobackup/_index.md @@ -0,0 +1,41 @@ +--- +title: _arangobackup_ client tool +menuTitle: arangobackup +weight: 25 +description: >- + `arangobackup` is a command-line client tool to create global hot backups of + ArangoDB deployments +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +{{< tip >}} +In the Community Edition, use [_arangodump_](../arangodump/_index.md) and +[_arangorestore_](../arangorestore/_index.md) for +[logical backups](../../../operations/backup-and-restore.md#logical-backups). +{{< /tip >}} + +_arangobackup_ creates instantaneous and consistent +[hot backups](../../../operations/backup-and-restore.md#hot-backups) of the data +and structures stored in ArangoDB. + +Hot backups rely on hard link magic performed on the database's +persistence layer. + +_arangobackup_ can be used for all ArangoDB deployment modes +(Single Instance, Active Failover, Cluster). It always creates what +is most readily described as a persistence layer consistent snapshot +of the entire instance. Therefore, no such thing as database or +collection level hot backup exists. Consequently, unlike with +_arangodump_/_arangorestore_, one may only restore a hot backup set to +the same layout, for example one can only restore a single server hot backup +to a single server instance and a 3 _DB-Server_ cluster's hot backup to a 3 +_DB-Server_ instance. + +Snapshots can be uploaded to or downloaded from remote repositories. + +{{< info >}} +Please review the +[requirements and limitations](../../../operations/backup-and-restore.md#hot-backup-limitations) +of hot backups, specifically regarding storage engine, deployment, scope +and storage space. +{{< /info >}} diff --git a/site/content/arangodb/oem/components/tools/arangobackup/examples.md b/site/content/arangodb/oem/components/tools/arangobackup/examples.md new file mode 100644 index 0000000000..9ec598a5f3 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangobackup/examples.md @@ -0,0 +1,340 @@ +--- +title: Hot Backup Examples +menuTitle: Examples +weight: 5 +description: >- + How to create a consistent snapshot with the `arangobackup` tool +--- +## Create + +Hot backups are created near instantaneously. The single server as +well as other deployment modes try to obtain a global write transaction lock +to enforce consistency across all servers, databases, collections +etc. Hot backups still require no Data Definition operations (e.g., create +database, create collection) to be active at the time of hot backup, please +review the [requirements and limitations](../../../operations/backup-and-restore.md#hot-backup-limitations) +for more details. + +Once that lock could be acquired the hot backup itself is most +readily described as a consistent snapshot on the local file system. + +```bash +arangobackup create --server.endpoint tcp://myserver:8529 --label my-label +``` + +The above will create a hot backup with a unique identifier consisting +of the UTC time according to the local computer clock output and the +specified label and report the success like below. + +``` +2019-05-15T13:57:11Z [15213] INFO {backup} Server version: 3.5.1 +2019-05-15T14:20:16Z [15397] INFO {backup} Backup succeeded. Generated identifier '2019-05-15T14.20.15Z_my-label' +``` + +{{< tip >}} +If the `label` marker is omitted then a unique identifier string is +generated instead. +{{< /tip >}} + +There are more options for the cluster mode regarding the acquisition of the +global write transaction lock: + +- `--max-wait-for-lock`: configures how long the system tries to get the global + write transaction lock before it reports failure. Its value must be a number + in seconds (default: 120 seconds). +- `--allow-inconsistent`: if set to `false` (default), the operation is + considered to have failed if the maximal waiting time for the lock is + exceeded. If set to `true`, the system will take a potentially non-consistent + hot backup when the timeout is exceeded. +- `--force`: will make arangobackup abort ongoing write transactions in order + to more quickly acquire the global write transaction lock. This option should + be used with caution, as it will potentially abort valid write transactions, + meaning client applications will see errors for otherwise valid operations + and queries. The force option currently only aborts Stream Transactions but + no JavaScript Transactions. + +## Restore + +Once a hot backup is created, one can use the generated backup id, +for example `2019-05-15T14.36.38Z_my-label` to restore the **entire** +instance to that "snapshot". + +{{< warning >}} +Keep in mind that such a restore is a global operation and affects +**all databases** in an installation. The restore will roll back all data +including in the meantime databases, collections, indexes etc. +The DB-Server of a single server instance and all DB-Servers +of a cluster will subsequently be restarted. + +Datacenter-to-Datacenter Replication (DC2DC) needs to be stopped before +restoring a Hot Backup. +{{< /warning >}} + +```bash +arangobackup restore --server.username root --identifier 2019-05-15T14.36.38Z_my-label +``` + +The output will reflect the restore operation's success: + +```log +2019-05-15T15:24:14Z [16201] INFO {backup} Server version: 3.5.1 +2019-05-15T15:24:14Z [16201] INFO {backup} Successfully restored '2019-05-15T14.36.38Z_my-label' +``` + +## Delete + +Hot backups, analogous to virtual machine snapshots, cause additional +disk usage. With every hot backup a consistent state in time is +frozen. Later changes will then have to hold a difference to older +hot backups. Compactions can no longer cover events before the last +hot backup. Naturally, one may want to be able to free disk space, once +hot backups become obsolete. + +```bash +arangobackup delete --server.username root --identifier <identifier> +``` + +The result of the operation is thus delivered: + +``` +2019-05-15T15:34:34Z [16257] INFO {backup} Server version: 3.5.1 +2019-05-15T15:34:34Z [16257] INFO {backup} Successfully deleted '2019-05-15T13.57.03Z' +``` + +## List + +One may hold a multitude of hot backups. Those would all be available +to restore from. In order to get a listing of such hot backups, one +may use the `list` command. + +```bash +arangobackup list +``` + +The output lists all available hot backups: + +```bash +2019-05-15T15:28:17Z [16224] INFO {backup} Server version: 3.5.1 +2019-05-15T15:28:17Z [16224] INFO {backup} The following backups are available: +2019-05-15T15:28:17Z [16224] INFO {backup} - 2019-05-15T13.57.11Z_my-label +2019-05-15T15:28:17Z [16224] INFO {backup} - 2019-05-15T13.57.03Z-other-label +``` + +## Upload + +Hot backups can be uploaded to a remote repository, here is an example which +uses the `S3` protocol: + +```bash +arangobackup upload --server.endpoint tcp://myserver:8529 --rclone-config-file /path/to/remote.json --identifier 2019-05-13T07.15.43Z_some-label --remote-path S3://remote-endpoint/remote-directory +``` + +The output will look like this: + +``` +2019-07-30T08:10:10Z [17184] INFO [06792] {backup} Server version: 3.5.1 +2019-07-30T08:10:10Z [17184] INFO [a9597] {backup} Backup initiated, use +2019-07-30T08:10:10Z [17184] INFO [4c459] {backup} arangobackup upload --status-id=114 +2019-07-30T08:10:10Z [17184] INFO [5cd70] {backup} to query progress. +``` + +This uses a file `remote.json` in the current directory to configure +credentials for the remote site. Here is an example: + +```json +{ + "my-s3": { + "type": "s3", + "provider": "aws", + "env_auth": "false", + "access_key_id": "XXXXXXXXXXXXXXXXXXXX", + "secret_access_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "region": "xx-xxxx-x", + "acl": "private" + } +} +``` + +This process may take as long as it needs to upload the data from the +single server or all of the cluster's DB-Servers to the remote +location. However, the upload will take advantage from previously +uploaded hot backups which might contain identical files. Therefore, the +functionality is incremental, if regular hot backups are taken and uploaded +to the same remote site. + +The status of the process may be acquired at any later time. + +```bash +arangobackup upload --server.endpoint tcp://myserver:8529 --status-id=114 +``` + +where the number given in the `--status-id` option is the one which was +reported in the original upload command. + +The output will look like this: + +``` +2019-07-30T08:11:09Z [17465] INFO [06792] {backup} Server version: 3.5.1 +2019-07-30T08:11:09Z [17465] INFO [24d75] {backup} SNGL Status: COMPLETED +2019-07-30T08:11:09Z [17465] INFO [68cc8] {backup} Last progress update 2019-07-30T08:10:10Z: 5/5 files done +``` + +See [rclone Configuration](#rclone-configuration) for details about the `remote.json` +file to configure the remote site for `rclone` for different protocols than S3. + +## Download + +Hot backups can be downloaded from a remote repository like this: + +```bash +arangobackup download --server.endpoint tcp://myserver:8529 --rclone-config-file /path/to/remote.json --identifier 2019-05-13T07.15.43Z_some-label --remote-path S3://remote-endpoint/remote-directory +``` + +The output will look like this: + +``` +2019-07-30T08:14:43Z [17621] INFO [06792] {backup} Server version: 3.5.1 +2019-07-30T08:14:43Z [17621] INFO [a9597] {backup} Backup initiated, use +2019-07-30T08:14:43Z [17621] INFO [4c459] {backup} arangobackup download --status-id=250 +2019-07-30T08:14:43Z [17621] INFO [5cd70] {backup} to query progress. +``` + +This process may take as long as it needs to download the data to +the single server or all of the cluster's DB-Servers from the remote +endpoint given network limitations. However, the download will take +advantage from other hot backups which might already or still be present +locally that contain identical files. Therefore, the functionality is +incremental, if a hot backup is downloaded and a similar one is already +present. + +The status of the download process may be acquired at any later time. + +```bash +arangobackup download --server.endpoint tcp://myserver:8529 --status-id=250 +``` + +The output will look like this: + +``` +2019-07-30T08:18:07Z [17753] INFO [06792] {backup} Server version: 3.5.1 +2019-07-30T08:18:07Z [17753] INFO [24d75] {backup} SNGL Status: COMPLETED +2019-07-30T08:18:07Z [17753] INFO [68cc8] {backup} Last progress update 2019-07-30T08:14:43Z: 5/5 files done +``` + +## Rclone Configuration + +[Rclone](https://rclone.org/) is a versatile open-source +remote file sync program that can deal with over 30 different remote file +IO protocols. Enterprise Editions of ArangoDB come with a bundled version +of rclone, which is distributed under the MIT license. It is used to +both download and upload hot backup sets to and from local and cloud +operated storage resources. + +{{< info >}} +Hot backup directories, which are subject to an ongoing download cannot +be used for restores until the download has finished. +{{< /info >}} + +To configure rclone, use the `rclone-config-file` startup option to +point arangobackup to a JSON configuration file. The expected format +is an object with user-chosen remote names as attribute keys, and the +actual configuration as attribute value (a nested object). The option +names and values in the [rclone documentation](https://rclone.org/docs/) +directly translate into attribute/value pairs in the JSON file. +Note that `"true"` and `"false"` must be enclosed by double quotes. + +```json +{ + "my-remote": { + "option": "value", + "boolean": "true" + } +} +``` + +The remote path can be specified via the `remote-path` startup option. +The syntax for remote paths is `remote:path`, where `remote` is the +name of a top-level attribute in the configuration file, `path` is a +remote path, and both are separated by a colon (e.g. `my-remote:/a/b/c`). + +{{< info >}} +Some cloud vendors require rclone configuration parameters, which are very +specific. It is helpful to download a standalone version of rclone and try to +upload and download files to verify that one has a working configuration for +the cloud storage in question. The exhaustive documentation parameters of `S3` +for example are found at [rclone.org/s3/](https://rclone.org/s3/). +Every parameter can be executed as an option to the program invocation, say +`--s3-upload-cutoff=0`, as an environment variable like +`export RCLONE_S3_UPLOAD_CUTOFF=0`, or most importantly, for use with ArangoDB, +as a key value pair for the JSON files below, `{ ..., "upload_cutoff": 0, ... }`. +{{< /info >}} + +### S3 + +```bash +… --rclone-config-file ~/my-s3.json --remote-path my-s3://remote-endpoint/remote-directory +``` + +The file `my-s3.json` could look like this: + +```json +{ + "my-s3": { + "type": "s3", + "provider": "aws", + "env_auth": "false", + "access_key_id": "XXXXXXXXXXXXXXXXXXXX", + "secret_access_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "region": "xx-xxxx-x", + "acl": "private" + } +} +``` + +More examples and details for S3 configurations can be found at +[rclone.org/s3/](https://rclone.org/s3/). + +### Locally mounted local or remote volumes + +```bash +… --rclone-config-file ~/my-local.json --remote-path my-local://mnt/backup/arangodb +``` + +The file `my-local.json` could look like this: + +```json +{ + "my-local": { + "type": "local", + "copy-links": "false", + "links": "false", + "one_file_system": "false" + } +} +``` + +More examples and details for local configurations can be found at +[rclone.org/local/](https://rclone.org/local/). + +### WebDAV + +```bash +… --rclone-config-file ~/my-dav.json --remote-path my-dav://remote-endpoint/remote-directory +``` + +This file `my-dav.json` could look like this: + +```json +{ + "my-dav": { + "pass": "A0OeLviBmwqKyCi7S6Rnn6dG576cJeRN1Nh0Dm5h8k0", + "type": "webdav", + "url": "https://dav.myserver.com", + "user": "davuser", + "vendor": "other" + } +} +``` + +More examples and details on WebDAV configurations can be found +[rclone.org/webdav/](https://rclone.org/webdav/). diff --git a/site/content/arangodb/oem/components/tools/arangobackup/options.md b/site/content/arangodb/oem/components/tools/arangobackup/options.md new file mode 100644 index 0000000000..95608c8a9e --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangobackup/options.md @@ -0,0 +1,15 @@ +--- +title: _arangobackup_ Options +menuTitle: Options +weight: 10 +description: >- + The startup options of the `arangobackup` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangobackup <operation> [<options>]` + +The `--operation` option can be passed as positional argument to specify the +desired action. + +{{% program-options name="arangobackup" %}} diff --git a/site/content/arangodb/oem/components/tools/arangobench/_index.md b/site/content/arangodb/oem/components/tools/arangobench/_index.md new file mode 100644 index 0000000000..abe0302de8 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangobench/_index.md @@ -0,0 +1,204 @@ +--- +title: arangobench +menuTitle: arangobench +weight: 40 +description: >- + `arangobench` is a benchmark and test tool that can be used to issue test + requests to the database system for performance and server function testing +--- +_arangobench_ is a client tool which makes network connections to an ArangoDB +server in about the same way as a client application would do via an ArangoDB +client driver. It thus often provides good enough throughput and performance +estimates. It provides different test cases that can be executed, that reflect +a broader set of use cases. It is useful to pick and run the test cases that +most closely resemble typical or expected workloads. It supports parallel +querying and batch requests. + +## General configuration + +_arangobench_ can be run on the same host as the ArangoDB server, or on a +different host. When using it against a cluster, it must be connected to one of +the cluster's Coordinators. It can communicate over normal (unencrypted) TCP +connections and encrypted SSL/TLS connections. + +The most important general _arangobench_ options are: + +- `--server.endpoint`: the server endpoint to connect to. This can be a remote + server or a server running on the same host. The endpoint also specifies + whether encryption at transit (TLS) should be used. Multiple endpoints can be + provided. Example: + + ``` + arangobench \ + --server.endpoint tcp://[::1]::8529 \ + --server.endpoint tcp://[::1]::8530 \ + --server.endpoint tcp://[::1]::8531 \ + ... + ``` + +- `--server.username` and `--server.password`: these can be used to authenticate + with an existing ArangoDB installation. +- `--test-case`: selects the test case to be executed by _arangobench_. A list + of the available test cases can be retrieved by running _arangobench_ with + the `--help` option. For detailed descriptions see [Test Cases](#test-cases). +- `--requests`: total number of requests to be executed by _arangobench_ in the + selected test case. If batching is used, multiple operations will still be + counted individually, even though they may be sent together in a single + request. +- `--runs`: number of test case runs to perform. This option defaults to `1`, + but it can be increased so that result outliers have less influence on the + test results. + +General options that can affect test case performance and throughput: + +- `--threads`: number of parallel threads to use by _arangobench_. + Increasing this value should normally increase throughput, unless some + saturation or congestion is reached in either _arangobench_ itself, the + network layer or the ArangoDB instance. + If increasing `--threads` does not improve throughput or even decreases it, + it should be determined which part of the setup is the bottleneck. +- `--wait-for-sync`: whether or not all write operations performed by test + cases should be executed with the `waitForSync` flag. If this is true, write + operations are blocking and only return once they have been fully + acknowledged by the server's disk subsystem(s). + Setting `--wait-for-sync` to `true` will have a large negative impact on + write performance and is thus not recommended for most use cases. +- `--async`: if set to `true`, it will make _arangobench_ send fire-and-forget + requests. These requests will be responded directly after having been added + to the server's request processing queue. _arangobench_ will not wait for the + operation to be fully executed on the server side. All it checks for is + whether the server was able to queue the operation(s). The _arangobench_ test + case may complete before the queued operations have been fully processed on + the server. In addition, sending more requests than the server can handle for + a prolonged time may lead to the server's scheduler queue filling up. + The server-side scheduler queue has a limited capacity, and once it is full, + any further incoming requests will be rejected by the server with HTTP 503 + "Service unavailable" until there is again some capacity in the queue. +- `--batch-size`: by default, _arangobench_ will send one HTTP request per test + case operation. This is often okay for test cases that execute a certain AQL + query or such, when there is naturally no other request to batch the query + with. However, in some use cases multiple operations can actually be sent + together in a single HTTP request. The prime example for this is + bulk-inserting documents, which are normally sent to the server in batches by + client programs anyway. Any value greater than `1` will make _arangobench_ + send batch requests. Using batching should normally increase the throughput. +- `--complexity`: some test cases can be adjusted via the `--complexity` + parameter, which often controls the number of document attributes that are + inserted in document-centric test cases. +- `--keep-alive`: whether or not _arangobench_ should use HTTP keep-alive + connections. This should always be turned on. + +Important cluster-specific options are: + +- `--number-of-shards`: number of shards for collections created by + _arangobench_. This option is only meaningful for test cases that create + collections. +- `--replication-factor`: number of replicas for each shard in collections + created by _arangobench_. This option is only meaningful for test cases that + write into collections. The larger the replication factor is, the more + expensive write operations will become. + +## Test Cases + +_arangobench_ provides the following predefined test cases. The test case to be +executed can be selected via the `--test-case` startup option. + +Note that these test cases have been added over time, and not all of them may +be fully appropriate for a given workload test. Some test cases are deprecated +and will be removed in a future version. + +In order to benchmark custom AQL queries, the appropriate test case to run is +`custom-query`. + +| Test Case | Description | +|:----------|:------------| +| `aqlinsert` | performs AQL queries that insert one document per query. The `--complexity` parameter controls the number of attributes per document. The attribute values for the inserted documents will be hard-coded, except `_key`. The total number of documents to be inserted is equal to the value of `--requests`. | +| `collection` | creates as many separate (empty) collections as provided in the value of `--requests`. | +| `custom-query` | executes a custom AQL query, that can be specified either via the `--custom-query` option or be read from a file specified via the `--custom-query-file` option. The query will be executed as many times as the value of `--requests`. The `--complexity` parameter is not used. If the query string contains bind variables, they need to be provided separately via the `--custom-query-bindvars` option, which should contain all bind variables as key/value pairs inside a JSON object. | +| `crud` | will perform a mix of insert, update, get and remove operations for documents. 20% of the operations will be single-document inserts, 20% of the operations will be single-document updates, 40% of the operations are single-document read requests, and 20% of the operations will be single-document removals. There will be a total of `--requests` operations. The `--complexity` parameter can be used to control the number of attributes for the inserted and updated documents. | +| `crud-append` | will perform a mix of insert, update and get operations for documents. 25% of the operations will be single-document inserts, 25% of the operations will be single-document updates, and 50% of the operations are single-document read requests. There will be a total of `--requests` operations. The `--complexity` parameter can be used to control the number of attributes for the inserted and updated documents. | +| `crud-write-read` | will perform a 50-50 mix of insert and retrieval operations for documents. 50% of the operations will be single-document inserts, 50% of the operations will be single-document read requests. There will be a total of `--requests` operations. The `--complexity` parameter can be used to control the number of attributes for the inserted documents. | +| `document` | performs single-document insert operations via the specialized insert API (in contrast to performing inserts via generic AQL). The `--complexity` parameter controls the number of attributes per document. The attribute values for the inserted documents will be hard-coded. The total number of documents to be inserted is equal to the value of `--requests`. | +| `edge-crud` | will perform a mix of insert, update and get operations for edges. 25% of the operations will be single-edge inserts, 25% of the operations will be single-edge updates, and 50% of the operations are single-edge read requests. There will be a total of `--requests` operations. The `--complexity` parameter can be used to control the number of attributes for the inserted and updated edges. | +| `persistent-index` | will perform a mix of insert, update and get operations for documents. The collection created by this test does have an extra, non-unique, non-sparse `persistent` index on one attribute. 25% of the operations will be single-document inserts, 25% of the operations will be single-document updates, and 50% of the operations are single-document read requests. There will be a total of `--requests` operations. The `--complexity` parameter can be used to control the number of attributes for the inserted and updated documents. This test case can be used to determine the effects on write throughput caused by adding a secondary index to a collection. It originally tested a `hash` index, but both the in-memory hash and skiplist index types were removed in favor of the RocksDB-based persistent index type. | +| `import-document` | performs multi-document imports using the specialized import API (in contrast to performing inserts via generic AQL). Each inserted document will have two attributes. The `--complexity` parameter controls the number of documents per import request. The total number of documents to be inserted is equal to the value of `--requests` times the value of `--complexity`. | +| `version` | queries the server version and then instantly returns. In a cluster, this means that Coordinators instantly respond to the requests without ever accessing DB-Servers. This test can be used to establish a baseline for single server or Coordinator throughput. The `--complexity` parameter is not used. | + +## Display histogram + +By default, displaying the histogram of a test run is switched off. To enable it, set the `--histogram.generate` flag to true. + +## Troubleshooting + +The test cases provided by _arangobench_ vary significantly in _how_ they +perform operations. For example, inserting documents into ArangoDB can be +achieved by either: + +- **single-document inserts** + (one document per request to `/_api/document`) +- **multi-document inserts** + (multiple documents per request to `/_api/document` or `/_api/import`) +- **single-document AQL insert queries** + (one document per AQL query to `/_api/cursor`) +- **multi-document AQL insert queries** + (multiple documents per AQL query to `/_api/cursor`) + +Especially for insert operations, AQL queries will have higher setup and +teardown costs than plain Document API operations. Thus, +it is likely that higher throughput can be achieved by using the specialized +Document APIs in throughput tests rather than AQL queries. + +Many test cases can benefit from using request batching, that can be turned on +in _arangobench_ via the `--batch-size` option. Batching makes sense in cases +where a client application would also send multiple operations in a single +request, e.g. when inserting documents in bulk. Batching is often the easiest +way to improve the throughput. + +If increasing `--threads` for a given benchmark does not increase +throughput or even decreases it, it is likely that some saturation or congestion +is occurring somewhere in the stack. +On Linux systems, running `top` during the tests on the participating hosts +should reveal details about CPU usage (user, system, iowait) and memory usage. +This can be used as a quick first probe to see if any of the hosts is maxed out +on a particular resource (CPU power, available RAM, I/O throughput). +The ArangoDB servers also provide detailed metrics about CPU usage, I/O wait, +memory usage etc., which can be monitored during the benchmarks. The most +useful way of analyzing metrics is to have them scraped automatically by a +Prometheus instance and to make them available via Grafana. This allows metrics +to be collected over time and to compare them for multiple test runs with +different configurations. If Prometheus/Grafana cannot be used, the ArangoDB +web interface also provides a way to access the current values of all metrics +for privileged accounts. + +A few useful metrics on the ArangoDB server side include: + +- `arangodb_process_statistics_resident_set_size`: resident memory usage for an + _arangod_ process, in bytes. Can be used to determine how much memory was used + during the tests. If the memory usage is close to the capacity limit, this + indicates that adding more memory could speed things up. +- `arangodb_process_statistics_resident_set_size_percent`: resident memory + usage for an _arangod_ process, in percent of available RAM. Can be used to + determine how much memory was used during the tests. If the memory usage is + close to the capacity limit, this indicates that adding more memory could + speed things up. +- `arangodb_scheduler_queue_full_failures_total`: contains the number of + rejected requests because the scheduler's queue capacity was exceeded. + If this contains values other than `0`, it indicates overload (i.e. more + requests coming in than can be handled by the server). +- `arangodb_scheduler_queue_length`: number of requests in scheduler queue at a + given point. This is expected to deviate from `0` if requests are queued, but + the closer it is to the configured maximum queue length (default value: `4096`), + the more close the server is to its processing capacity limit. +- `arangodb_server_statistics_system_percent`: on Linux, provides total %sys + CPU time for a host (most likely used by _arangod_ or _arangobench_). +- `arangodb_server_statistics_user_percent`: on Linux, provides total %user + CPU time for a host (most likely used by _arangod_ or _arangobench_). +- `arangodb_server_statistics_iowait_percent`: on Linux, provides total %iowait + CPU time for a host (most likely used by _arangod_ or _arangobench_). + +Another thing to check is the _arangobench_ location: if _arangobench_ runs on +the same host as the ArangoDB server, _arangobench_ and _arangod_ may compete +for the same resources. This may be appropriate if the production use case will +also use a localhost setup. If this is not the case, _arangobench_ should be +executed on a separate host and send its request over the network, in the same +way as the client applications are expected to do later. diff --git a/site/content/arangodb/oem/components/tools/arangobench/options.md b/site/content/arangodb/oem/components/tools/arangobench/options.md new file mode 100644 index 0000000000..8170e73ac6 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangobench/options.md @@ -0,0 +1,40 @@ +--- +title: _arangobench_ Startup Options +menuTitle: Options +weight: 5 +description: >- + The startup options of the `arangobench` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangobench [<options>]` + +**Examples** + +Run the `version` test case with 1000 requests, without threads: + +``` +arangobench --test-case version --requests 1000 --threads 1 +``` + +Run the `document` test case with 2000 requests, with two concurrent threads: + +``` +arangobench --test-case document --requests 1000 --threads 2 +``` + +Run the `document` test case with 2000 requests, with threads 2, +with async requests: + +``` +arangobench --test-case document --requests 1000 --threads 2 --async true +``` + +Run the `document` test case with 2000 requests, with threads 2, +using batch requests: + +``` +arangobench --test-case document --requests 1000 --threads 2 --batch-size 10 +``` + +{{% program-options name="arangobench" %}} diff --git a/site/content/arangodb/oem/components/tools/arangodb-shell/_index.md b/site/content/arangodb/oem/components/tools/arangodb-shell/_index.md new file mode 100644 index 0000000000..9773cc7767 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-shell/_index.md @@ -0,0 +1,20 @@ +--- +title: _arangosh_ +menuTitle: ArangoDB Shell +weight: 5 +description: >- + The ArangoDB shell lets you access ArangoDB servers over a network connection + using a JavaScript API +--- +The ArangoDB shell (_arangosh_) is a command-line client tool that can be used +for administration of ArangoDB servers. + +It offers a V8 JavaScript shell environment, in which you can use JS interfaces +and modules like the [`db` object](../../../develop/javascript-api/@arangodb/db-object.md) to +manage collections or run ad-hoc queries for instance, access the +[General Graph module](../../../graphs/general-graphs/_index.md) or other features. + +It can be used as interactive shell (REPL) as well as to execute a JavaScript +string or file. It is not a general command line like PowerShell or Bash however. +Commands like `curl` or invocations of [ArangoDB programs and tools](../_index.md) +are not possible inside of this JS shell! diff --git a/site/content/arangodb/oem/components/tools/arangodb-shell/details.md b/site/content/arangodb/oem/components/tools/arangodb-shell/details.md new file mode 100644 index 0000000000..1a8bc2b884 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-shell/details.md @@ -0,0 +1,207 @@ +--- +title: _arangosh_ Details +menuTitle: Details +weight: 10 +description: '' +--- +## Interaction + +You can paste multiple lines into _arangosh_, given the first line ends with an +opening brace: + +```js +--- +name: shellPaste +description: '' +--- +for (var i = 0; i < 10; i ++) { + require("@arangodb").print("Hello world " + i + "!\n"); +} +``` + +To load your own JavaScript code into the current JavaScript interpreter context, +use the load command: + +```js +require("internal").load("/tmp/test.js") // <- Linux / macOS +require("internal").load("c:\\tmp\\test.js") // <- Windows +``` + +You can exit arangosh using the key combination `<CTRL> + D` or by +typing `quit<ENTER>`. + +## Shell Output + +The ArangoDB shell prints the output of the last evaluated expression +by default: + +```js +--- +name: lastExpressionResult +description: '' +--- +42 * 23 +``` + +In order to prevent printing the result of the last evaluated expression, +the expression result can be captured in a variable, e.g. + +```js +--- +name: lastExpressionResultCaptured +description: '' +--- +var calculationResult = 42 * 23 +``` + +There is also the `print` function to explicitly print out values in the +ArangoDB shell: + +```js +--- +name: printFunction +description: '' +--- +print({ a: "123", b: [1,2,3], c: "test" }); +``` + +By default, the ArangoDB shell uses a pretty printer when JSON documents are +printed. This ensures documents are printed in a human-readable way: + +```js +--- +name: usingToArray +description: '' +--- +db._create("five") +for (i = 0; i < 5; i++) { + db.five.save({value:i}); +} +db.five.toArray() +~db._drop("five"); +``` + +While the pretty-printer produces nice looking results, it needs a lot of +screen space for each document. Sometimes a more dense output might be better. +In this case, the pretty printer can be turned off using the command +`stop_pretty_print()`. + +To turn on pretty printing again, use the `start_pretty_print()` command. + +## Escaping + +In AQL, escaping is done traditionally with the backslash character: `\`. +As seen above, this leads to double backslashes when specifying Windows paths. +_arangosh_ requires another level of escaping, also with the backslash character. +It adds up to four backslashes that need to be written in _arangosh_ for a single +literal backslash (`c:\tmp\test.js`): + +```js +db._query('RETURN "c:\\\\tmp\\\\test.js"') +``` + +You can use [bind variables](../../../aql/how-to-invoke-aql/with-arangosh.md) to +mitigate this: + +```js +var somepath = "c:\\tmp\\test.js" +db._query(aql`RETURN ${somepath}`) +``` + +## Database Wrappers + +_arangosh_ provides the `db` object by default, and this object can +be used for switching to a different database and managing collections inside the +current database. + +For a list of available methods for the `db` object, type + +```js +--- +name: shellHelp +description: '' +--- +db._help(); +``` + +The [`db` object](../../../develop/javascript-api/@arangodb/db-object.md) is available in _arangosh_ +as well as on _arangod_ i.e. if you're using [Foxx](../../../develop/foxx-microservices/_index.md). While its +interface is persistent between the _arangosh_ and the _arangod_ implementations, +its underpinning is not. The _arangod_ implementation are JavaScript wrappers +around ArangoDB's native C++ implementation, whereas the _arangosh_ implementation +wraps HTTP accesses to ArangoDB's [RESTful API](../../../develop/http-api/_index.md). + +So while this code may produce similar results when executed in _arangosh_ and +_arangod_, the CPU usage and time required differs since the +_arangosh_ version performs around 100k HTTP requests, and the +_arangod_ version directly writes to the database: + +```js +for (i = 0; i < 100000; i++) { + db.test.save({ name: { first: "Jan" }, count: i}); +} +``` + +## Using `arangosh` via Unix shebang mechanisms +In Unix operating systems, you can start scripts by specifying the interpreter in the first line of the script. +This is commonly called `shebang` or `hash bang`. You can also do that with `arangosh`, i.e. create `~/test.js`: + +```sh +#!/usr/bin/arangosh --javascript.execute +require("internal").print("hello world") +db._query("FOR x IN test RETURN x").toArray() +``` + +Note that the first line has to end with a blank in order to make it work. +Mark it executable to the OS: + +```sh +> chmod a+x ~/test.js +``` + +and finally try it out: + +```sh +> ~/test.js +``` + +## Shell Configuration + +_arangosh_ looks for a user-defined startup script named `.arangosh.rc` in the +user's home directory on startup. The home directory is likely at `/home/<username>/` +on Unix/Linux, and is determined on Windows by peeking into the environment variables +`%HOMEDRIVE%` and `%HOMEPATH%`. + +If the file `.arangosh.rc` is present in the home directory, _arangosh_ executes +the contents of this file inside the global scope. + +You can use this to define your own extra variables and functions that you need often. +For example, you could put the following into the `.arangosh.rc` file in your home +directory: + +```js +// "var" keyword avoided intentionally... +// otherwise "timed" would not survive the scope of this script +global.timed = function (cb) { + console.time("callback"); + cb(); + console.timeEnd("callback"); +}; +``` + +This makes a function named `timed` available in _arangosh_ in the global scope. + +You can now start _arangosh_ and invoke the function like this: + +```js +timed(function () { + for (var i = 0; i < 1000; ++i) { + db.test.save({ value: i }); + } +}); +``` + +Please keep in mind that, if present, the `.arangosh.rc` file needs to contain valid +JavaScript code. If you want any variables in the global scope to survive you need to +omit the `var` keyword for them. Otherwise, the variables are only visible inside +the script itself, but not outside. diff --git a/site/content/arangodb/oem/components/tools/arangodb-shell/examples.md b/site/content/arangodb/oem/components/tools/arangodb-shell/examples.md new file mode 100644 index 0000000000..6dc535eb17 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-shell/examples.md @@ -0,0 +1,88 @@ +--- +title: _arangosh_ Examples +menuTitle: Examples +weight: 5 +description: '' +--- +## Connecting to a server + +By default, _arangosh_ tries to connect to an ArangoDB server running on +server `localhost` on port `8529`. It uses the username `root` and an +empty password by default. Additionally, it connects to the default database +(`_system`). All these defaults can be changed using the following +command-line options: + +- `--server.database <string>`: name of the database to connect to +- `--server.endpoint <string>`: endpoint to connect to +- `--server.username <string>`: database username +- `--server.password <string>`: password to use when connecting +- `--server.authentication <bool>`: whether or not to use authentication + +For example, to connect to an ArangoDB server on IP `192.168.173.13` on port +8530 with the user `foo` and using the database `test`, use: + +``` +arangosh --server.endpoint tcp://192.168.173.13:8530 --server.username foo --server.database test --server.authentication true +``` + +_arangosh_ then displays a password prompt and tries to connect to the +server after the password is entered. + +{{< warning >}} +At signs `@` in startup option arguments need to be escaped as `@@`. +ArangoDB programs and tools support a +[special syntax `@envvar@`](../../../operations/administration/configuration.md#environment-variables-as-parameters) +that substitutes text wrapped in at signs with the value of an equally called +environment variable. This is most likely an issue with passwords and the +`--server.password` option. + +For example, `password@test@123` needs to be passed as +`--server.password password@@test@@123` to work correctly, unless you want +`@test@` to be replaced by whatever the environment variable `test` is set to. +{{< /warning >}} + +The shell prints its own version number, and if successfully connected +to a server, the version number of the ArangoDB server. + +{{< tip >}} +If the server endpoint is configured for SSL then clients such as _arangosh_ +need to connect to it using an SSL socket as well. For example, use `http+ssl://` +as schema in `--server.endpoint` for an SSL-secured HTTP connection. +{{< /tip >}} + +The schema of an endpoint is comprised of a protocol and a socket in the format +`protocol+socket://`. There are alternatives and shorthands for some combinations, +`ssl://` is equivalent to `http+ssl://` and `https://` for instance: + +Protocol | Socket | Schema +-------------|------------------|----------- +HTTP | TCP | `http+tcp`, `http+srv`, `http`, `tcp` +HTTP | TCP with SSL/TLS | `http+ssl`, `https`, `ssl` +HTTP | Unix | `http+unix`, `unix` +VelocyStream | TCP | `vst+tcp`, `vst+srv`, `vst` +VelocyStream | TCP with SSL/TLS | `vst+ssl`, `vsts` +VelocyStream | Unix | `vst+unix` + +## Using *arangosh* + +To change the current database after the connection has been made, you +can use the `db._useDatabase()` command in _arangosh_: + +```js +--- +name: shellUseDB +description: '' +--- +db._createDatabase("myapp"); +db._useDatabase("myapp"); +db._useDatabase("_system"); +db._dropDatabase("myapp"); +``` + +To get a list of available commands, _arangosh_ provides a `help()` function. +Calling it displays helpful information. + +_arangosh_ also provides auto-completion. Additional information on available +commands and methods is thus provided by typing the first few letters of a +variable and then pressing the tab key. It is recommend to try this with entering +`db.` (without pressing return) and then pressing tab. diff --git a/site/content/arangodb/oem/components/tools/arangodb-shell/options.md b/site/content/arangodb/oem/components/tools/arangodb-shell/options.md new file mode 100644 index 0000000000..e4b3de2326 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-shell/options.md @@ -0,0 +1,12 @@ +--- +title: _arangosh_ Options +menuTitle: Options +weight: 15 +description: >- + The startup options of the `arangosh` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangosh [<options>]` + +{{% program-options name="arangosh" %}} diff --git a/site/content/arangodb/oem/components/tools/arangodb-starter/_index.md b/site/content/arangodb/oem/components/tools/arangodb-starter/_index.md new file mode 100644 index 0000000000..0efd502d9c --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-starter/_index.md @@ -0,0 +1,8 @@ +--- +title: ArangoDB Starter +menuTitle: ArangoDB Starter +weight: 10 +description: >- + The Starter (the `arangodb` binary) is a tool that can help you deploy ArangoDB + in an easy way and supports all deployment modes +--- diff --git a/site/content/arangodb/oem/components/tools/arangodb-starter/architecture.md b/site/content/arangodb/oem/components/tools/arangodb-starter/architecture.md new file mode 100644 index 0000000000..00af5d642d --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-starter/architecture.md @@ -0,0 +1,229 @@ +--- +title: ArangoDB Starter Architecture +menuTitle: Architecture +weight: 15 +description: >- + The Starter files and configuration explained, what modes it supports, and how + it runs distributed across multiple machines +--- +## What does the Starter do + +The ArangoDB Starter is a program used to create ArangoDB database deployments +on bare-metal (or virtual machines) with ease. +It enables you to create everything from a simple Single server instance +to a full blown Cluster with Datacenter-to-Datacenter Replication in under 5 minutes. + +The Starter is intended to be used in environments where there is no higher +level orchestration system (e.g. Kubernetes) available. + +## Starter versions + +The Starter is a separate process in a binary called `arangodb` (or `arangodb.exe` on Windows). +This binary has its own version number that is independent of a ArangoDB (database) +version. + +This means that Starter version `a.b.c` can be used to run deployments +of ArangoDB databases with different version. +For example, the Starter with version `0.15.5` can be used to create +ArangoDB deployments with ArangoDB version `3.10.<something>` as well +as deployments with ArangoDB version `3.9.<something>`. + +It also means that you can update the Starter independently from the ArangoDB +database. + +Note that the Starter is also included in all binary ArangoDB packages. + +To find the versions of you Starters & ArangoDB database, run the following commands: + +```bash +# To get the Starter version +arangodb --version +# To get the ArangoDB database version +arangod --version +``` + +## Starter deployment modes + +The Starter supports 3 different modes of ArangoDB deployments: + +1. Single server +1. Active failover +1. Cluster + +Note: Datacenter replication is an option for the `cluster` deployment mode. + +You select one of these modes using the `--starter.mode` command line option. + +Depending on the mode you've selected, the Starter launches one or more +(`arangod` / `arangosync`) server processes. + +No matter which mode you select, the Starter always provides you +a common directory structure for storing the servers data, configuration & log files. + +## Starter operating modes + +The Starter can run as normal processes directly on the host operating system, +or as containers in a docker runtime. + +When running as normal process directly on the host operating system, +the Starter launches the servers as child processes and monitors those. +If one of the server processes terminates, a new one is started automatically. + +When running in a docker container, the Starter launches the servers +as separate docker containers, that share the volume namespace with +the container that runs the Starter. It monitors those containers +and if one terminates, a new container is launched automatically. + +## Starter data-directory + +The Starter uses a single directory with a well known structure to store +all data for its own configuration & logs, as well as the configuration, +data & logs of all servers it starts. + +This data directory is set using the `--starter.data-dir` command line option. +It contains the following files & sub-directories. + +- `setup.json` The configuration of the "cluster of Starters". + For details see below. DO NOT edit this file. +- `arangodb.log` The log file of the Starter +- `single<port>`, `agent<port>`, `coordinator<port>`, `dbserver<port>`: directories for + launched servers. These directories contain among others the following files: + - `apps`: A directory with Foxx applications + - `data`: A directory with database data + - `arangod.conf`: The configuration file for the server. Editing this file is possible, but not recommended. + - `arangod.log`: The log file of the server + - `arangod_command.txt`: File containing the exact command line of the started server (for debugging purposes only) + +## Starter configuration file + +The Starter can be configured using a configuration file. The format of the +configuration file is the same as the `arangod` configuration file format. +For more details, refer to the [configuration file format](../../../operations/administration/configuration.md#configuration-file-format) +and [how to use configuration files](../../../operations/administration/configuration.md#using-configuration-files). + +The default configuration file of the Starter is `arangodb-starter.conf`. +It can be changed using the `--configuration` option. +For more information about other +configuration options, see [ArangoDB Starter options](options.md). + +{{< info >}} +The Starter has a different set of supported command line options than `arangod` binary. +Using the `arangod` configuration file as input for `arangodb` binary is not supported. +{{< /info >}} + +### Passing through `arangod` options + +The configuration file also supports setting pass-through options. Options with +same prefixes can be split into sections. + +```conf +# passthrough-example.conf + +args.all.log.level = startup=trace +args.all.log.level = warning + +[starter] +mode = single + +[args] +all.log.level = queries=debug +all.default-language = de_DE + +[args.all.rocksdb] +enable-statistics = true +``` + +```bash +./arangodb --configuration=passthrough-example.conf +``` + +### Configuration precedence + +When adding a command line option next to a modified configuration +file, the last occurrence of the option becomes the final value. + +Running the Starter with the configuration example above and adding the +`default-language=es_419` command line option results in having the +`default-language` set to `es_419` and not the value from the configuration file: + +```bash +./arangodb --args.all.default-language=es_419 --configuration=passthrough-example.conf +``` + +## Running on multiple machines + +For the `activefailover` and `cluster` mode, it is required to run multiple +Starters, as every Starter only launches a subset of all servers needed +to form the entire deployment. +In the `cluster` mode, for example, a single Starter launches at most one Agent, +one DB-Server, and one Coordinator. + +It is the responsibility of the user to run the Starter on multiple machines such +that enough servers are started to form the entire deployment. +The minimum number of Starters needed is 3. + +The Starters running on those machines need to know about each other's existence. +In order to do so, the Starters form a "cluster" of their own (not to be confused +with the ArangoDB database cluster). +This cluster of Starters is formed from the values given to the `--starter.join` +command line option. You should pass the addresses (`<host>:<port>`) of all Starters. + +For example, a typical command line for a cluster deployment looks like this: + +```bash +arangodb --starter.mode=cluster --starter.join=hostA:8528,hostB:8528,hostC:8528 +# this command is run on hostA, hostB and hostC. +``` + +The state of the cluster (of Starters) is stored in a configuration file called +`setup.json` in the data directory of every Starter and the ArangoDB +The Agency is used to elect a leader (also called _master_) among all Starters. + +The leader Starter is responsible for maintaining the list of all Starters +involved in the cluster and their addresses. The follower Starters (all Starters +except the elected leader) fetch this list from the leader Starter on regular +basis and store it to its own `setup.json` config file. + +{{< warning >}} +The `setup.json` config file must not be edited manually. +{{< /warning >}} + +## Running on multiple machines (under the hood) + +As mentioned above, when the Starter is used to create an `activefailover` +or `cluster` deployment, it first creates a "cluster" of Starters. + +These are the steps taken by the Starters to bootstrap such a deployment +from scratch. + +1. All Starters are started (either manually or by some supervisor) +1. All Starters try to read their config from `setup.json`. + If that file exists and is valid, this bootstrap-from-scratch process + is aborted and all Starters go directly to the `running` phase described below. +1. All Starters create a unique ID +1. The list of `--starter.join` arguments is sorted +1. All Starters request the unique ID from the first server in the sorted `--starter.join` list, + and compares the result with its own unique ID. +1. The Starter that finds its own unique ID, is continuing as _bootstrap leader_ + the other Starters are continuing as _bootstrap followers_. +1. The _bootstrap leader_ waits for at least 2 _bootstrap followers_ to join it. +1. The _bootstrap followers_ contact the _bootstrap leader_ to join its cluster of Starters. +1. Once the _bootstrap leader_ has received enough (at least 2) requests + to join its cluster of Starters, it continues with the `running` phase. +1. The _bootstrap followers_ keep asking the _bootstrap leader_ about its state. + As soon as they receive confirmation to do so, they also continue with the `running` phase. + +In the _running_ phase, all Starters launch the desired servers and keeps monitoring those +servers. Once a functional Agency is detected, all Starters try to be +_running leader_ by trying to write their ID in a well known location in the Agency. +The first Starter to succeed in doing so wins this leader election. + +The _running leader_ keeps writing its ID in the Agency in order to remain +the _running leader_. Since this ID is written with a short time-to-live, +other Starters are able to detect when the current _running leader_ has been stopped +or is no longer responsible. In that case, the remaining Starters perform +another leader election to decide who will be the next _running leader_. + +API requests that involve the state of the cluster of Starters are always answered +by the current _running leader_. All other Starters refer the request to +the current _running leader_. diff --git a/site/content/arangodb/oem/components/tools/arangodb-starter/options.md b/site/content/arangodb/oem/components/tools/arangodb-starter/options.md new file mode 100644 index 0000000000..de87dcceae --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-starter/options.md @@ -0,0 +1,465 @@ +--- +title: ArangoDB Starter Options +menuTitle: Options +weight: 5 +description: >- + The Starter provides options to control various aspects of a cluster or other + deployment you want to run +--- +## Common options + +- `--starter.data-dir=path` + +`path` is the directory in which all data is stored. (default "./") + +In the directory, a `setup.json` file is created, which is used for restarts, +as well as a directory for each instance that runs on this machine. +Different instances of `arangodb` must use different data directories. + +- `--starter.join=address` + +Join a cluster with the leader (_master_) Starter at address `address` (default ""). +You can also point to any other Starter that is connected to the initial Starter. +The address can be a host address or name, optionally followed by a port number +to match another Starter's `--starter.port` if it is not the default `8528`. + +These are valid arguments, for example: + +```bash +--starter.join=localhost +--starter.join=localhost:5678 +--starter.join=192.168.23.1:8528 +--starter.join=192.168.23.1 +``` + +You can also supply multiple addresses. +See [Using multiple join arguments](../../../deploy/cluster/deployment/using-the-arangodb-starter.md#using-multiple-join-arguments) +for details. + +- `--starter.local` + +Start a local (test) cluster. Since all servers are running on a single machine +this is really not intended for production setups. + +- `--starter.mode=cluster|single|activefailover` + +Select what kind of database configuration you want. +This can be a `cluster` configuration (which is the default), +a `single` server configuration or a `activefailover` configuration with +2 single services configured to take over when needed. + +Note that when running a `single` server configuration you lose all +high availability features that a cluster provides you. + +- `--cluster.agency-size=int` + +number of Agents in Agency (default 3). + +This number has to be positive and odd, and anything beyond 5 probably +does not make sense. The default 3 allows for the failure of one Agent. + +- `--starter.address=addr` + +`addr` is the address under which this server is reachable from the +outside. + +Use this option only in the case that `--cluster.agency-size` is set to 1. +In a single Agent setup, the sole starter has to start on its own with +no reliable way to learn its own address. Using this option, the leader (_master_) +Starter knows under which address it can be reached from the outside. If you specify +`localhost` here, then all instances must run on the local machine. + +- `--starter.host=addr` + +`addr` is the address to which this server binds. (default "0.0.0.0") + +Usually there is no need to specify this option. +Only when you want to bind the starter to specific network device, +would you set this. +Note that setting this option to `127.0.0.1` makes this starter +unreachable for other starters, which is only allowed for +`single` server deployments or when using `--starter.local`. + +- `--docker.image=image` + +`image` is the name of a Docker image to run instead of the normal +executable. For each started instance a Docker container is launched. +Usually one would use the Docker image `arangodb/arangodb`. + +- `--docker.container=containerName` + +`containerName` is the name of a Docker container that is used to run the +executable. If you do not provide this argument but run the starter inside +a Docker container, the starter auto-detects its container name. + +## Authentication options + +The arango starter by default creates a cluster that uses no authentication. + +To create a cluster that uses authentication, create a file containing a random +JWT secret (single line) and pass it through the `--auth.jwt-secret` option. + +For example: + +```bash +arangodb create jwt-secret --secret=jwtSecret +arangodb --auth.jwt-secret=./jwtSecret +``` + +All starters used in the cluster must have the same JWT secret. + +To use a JWT secret to access the database, use `arangodb auth header`. +See [Using authentication tokens](security.md#using-authentication-tokens) +for details. + +## SSL options + +The ArangoDB Starter creates a cluster that uses unencrypted connections by +default (no SSL/TLS). + +To create a cluster that uses encrypted connections, you can use an existing +server key file (`.pem` format) or let the starter create one for you. + +To use an existing server key file use the `--ssl.keyfile` option like this: + +```bash +arangodb --ssl.keyfile=myServer.pem +``` + +Use [`arangodb create tls keyfile`](security.md) to create a +server key file. + +To let the starter created a self-signed server key file, use the +`--ssl.auto-key` option like this: + +```bash +arangodb --ssl.auto-key +``` + +All starters used to make a cluster must be using SSL or not. +You cannot have one starter using SSL and another not using SSL. + +If you start a starter using SSL, its own HTTP server (see API) also +uses SSL. + +Note that all starters can use different server key files. + +Additional SSL options: + +- `--ssl.cafile=path` + +Configure the servers to require a client certificate in their communication to +the servers using the CA certificate in a file with given path. + +- `--ssl.auto-server-name=name` + +The name of the server that is used in the self-signed certificate created by +the `--ssl.auto-key` option. + +- `--ssl.auto-organization=name` + +The name of the server that is used in the self-signed certificate created by +the `--ssl.auto-key` option. + +## Passing through other database options + +Options for `arangod` that are not supported by the starter can still be passed to +the DB-Servers using a pass through option. +Every option that start with a pass through prefix is passed through to the +command-line of one or more server instances. + +- `--args.all.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all servers started by this starter. +- `--args.coordinators.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all Coordinators started by this starter. +- `--args.dbservers.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all DB-Servers started by this starter. +- `--args.agents.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all Agents started by this starter. + +Some options are essential to the function of the starter. +Therefore these options cannot be passed through like this. + +Example: + +To activate HTTP request logging at debug level for all Coordinators, use a +command like this: + +```bash +arangodb --args.coordinators.log.level=requests=debug +``` + +## Passing through `arangosync` options + +Options for `arangosync` that are not supported by the starter can still be +passed to the syncmasters & syncworkers using a pass through option. +Every option that start with a pass through prefix is passed through to the +command-line of one or more `arangosync` instances. + +- `--args.sync.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all arangosync instances started by this starter. +- `--args.syncmasters.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all syncmasters started by this starter. +- `--args.syncworkers.<section>.<key>=<value>` is passed as + `--<section>.<key>=<value>` to all syncworkers started by this starter. + +Some options are essential to the function of the starter. +Therefore these options cannot be passed through like this. + +Example: + +To set a custom token TTL for direct message queue, use a command like this. + +```bash +arangodb --args.syncmasters.mq.direct-token-ttl=12h ... +``` + +## Passing environment variables + +Environment variables by default gonna be passed from arangodb process by +default. However, variables can be overridden using arangodb command line option. + +- `--envs.<group>.<env name>=<value>` +- `--envs.all.ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=2G` sets + `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=2G` for all instances started by this starter. +- `--envs.coordinators.ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=4G` sets + `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=4G` for all Coordinators started by this starter. +- `--envs.dbservers.ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=8G` sets + `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=8G` for all DB-Servers started by this starter. + +Example: + +```bash +arangodb --envs.all.ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=2G --envs.coordinators.ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=4G --envs.dbservers.ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY=8G ... +``` + +## Datacenter-to-Datacenter Replication options + +- `--starter.sync=bool` + +If set, the Starter also starts `arangosync` instances. + +- `--sync.start-master=bool` + +Should an ArangoSync master instance be started (only relevant if `--starter.sync` +is enabled, defaults to `true`) + +- `--sync.start-worker=bool` + +Should an ArangoSync worker instance be started (only relevant if `--starter.sync` +is enabled, defaults to `true`) + +- `--sync.monitoring.token=<token>` + +Bearer token used to access ArangoSync monitoring endpoints. + +- `--sync.master.jwt-secret=<secret>` + +Path of file containing JWT secret used to access the Sync Master (from Sync Worker). + +- `--sync.mq.type=<message queue type>` + +Type of message queue used by the Sync Master (defaults to "direct"). + +- `--sync.server.keyfile=<path of keyfile>` + +TLS keyfile of local sync master. + +- `--sync.server.client-cafile=<path of CA certificate>` + +CA Certificate used for client certificate verification. + +## Miscellaneous options + +- `--version` + +Show the version of the starter. + +- `--starter.port=int` + +The network port for the Starter (default 8528). +This is the port used for communication of the `arangodb` instances +amongst each other. + +The Starter uses the subsequent ports for the `arangod` processes it starts. + +- `--starter.disable-ipv6=bool` + +If disabled, the starter configures the `arangod` servers +to bind to address `0.0.0.0` (all IPv4 interfaces) +instead of binding to `[::]` (all IPv4 and all IPv6 interfaces). + +This is useful when IPv6 has actively been disabled on your machine. + +- `--server.arangod=path` + +The path to the `arangod` executable (default varies from platform to +platform, an executable is searched in various places). + +This option only has to be specified if the standard search fails. + +- `--server.js-dir=path` + +The path to JavaScript library directory (default varies from platform to platform, +this is coupled to the search for the executable). + +This option only has to be specified if the standard search fails. + +- `--server.storage-engine=rocksdb` + +Sets the storage engine used by the `arangod` servers. +Defaults to `rocksdb`, which is also the only available option for +ArangoDB v3.7 and above. + +- `--cluster.start-coordinator=bool` + +This indicates whether or not a Coordinator instance should be started +(default true). + +- `--cluster.start-dbserver=bool` + +This indicates whether or not a DB-Server instance should be started +(default true). + +- `--server.rr=path` + +The path to the `rr` executable to use if non-empty (default ""). Expert and +debugging only. + +- `--log.color=bool` + +If set to `true`, console log output is colorized. +The default is `true` when a terminal is attached to stdin, +`false` otherwise or when running on Windows. + +- `--log.console=bool` + +If set to `true`, log output is written to the console (default `true`). + +- `--log.file=bool` + +If set to `true`, log output is written to the file (default `true`). +The log file, called `arangodb.log`, can be found in the directory +specified using `--log.dir` or if that is not set, the directory +specified using `--starter.data-dir`. + +- `--log.verbose=bool` + +show more information (default `false`). + +- `--log.dir=path` + +Set a custom directory to which all log files are written to. +When using the Starter in docker, make sure that this directory is +mounted as a volume for the Starter. + +Note: When using a custom log directory, all DB-Server files are named like +`arangod-<role>-<port>.log`. The log for the starter itself is still called +`arangodb.log`. + +- `--log.rotate-files-to-keep=int` + +Set the number of old log files to keep when rotating log files of server +components (default 5). + +- `--log.rotate-interval=duration` + +Set the interval between rotations of log files of server components (default `24h`). +Use a value of `0` to disable automatic log rotation. + +Note: The starter always performs log rotation when it receives a `HUP` signal. + +- `--starter.unique-port-offsets=bool` + +If set to `true`, all port offsets (of follower Starters) are made globally unique. +By default, the value is `false` and port offsets are unique per follower address only. + +- `--docker.user=user` + +`user` is an expression to be used for `docker run` with the `--user` +option. One can give a user id or a user id and a group id, separated +by a colon. The purpose of this option is to limit the access rights +of the process in the Docker container. + +- `--docker.endpoint=endpoint` + +`endpoint` is the URL used to reach the docker host. This is needed to run +the executable in docker. The default value is "unix:///var/run/docker.sock". + +- `--docker.imagePullPolicy=Always|IfNotPresent|Never` + +`docker.imagePullPolicy` determines if the Docker image is being pulled from +Docker Hub. + +- If set to `Always`, the image is always pulled and an error causes the starter to fail. +- If set to `IfNotPresent`, the image is not pull if it is always available locally. +- If set to `Never`, the image is never pulled (when it is not available locally an error occurs). + +The default value is `Always` is the `docker.image` has the `:latest` tag or `IfNotPresent` otherwise. + +- `--docker.net-mode=mode` + +If `docker.net-mode` is set, all Docker container are started +with the `--net=<mode>` option. + +- `--docker.privileged=bool` + +If `docker.privileged` is set, all Docker containers are started +with the `--privileged` option turned on. + +- `--docker.tty=bool` + +If `docker.tty` is set, all Docker containers are started with a TTY. +If the starter itself is running in a docker container without a TTY +this option is overwritten to `false`. + +- `--starter.debug-cluster=bool` + +If `starter.debug-cluster` is set, the starter records the status codes it receives +upon "server ready" requests to the log. This option is mainly intended for internal testing. + +## Starting and stopping in detached mode + +If you want the starter to detach and run as a background process, use the `start` +command. This is typically used by developers running tests only. + +```bash +arangodb start --starter.local=true [--starter.wait] +``` + +This command makes the Starter run another starter process in the background +(that starts all ArangoDB servers), wait for its HTTP API to be available and +then exit. The Starter that was started in the background keeps running until +you stop it. + +The `--starter.wait` option makes the `start` command wait until all ArangoDB +servers are really up before ending the process of the leader Starter. + +To stop a Starter, use this command: + +```bash +arangodb stop +``` + +Make sure to match the arguments given to start the Starter +(`--starter.port` & `--ssl.*`). + +## Environment variables + +It is possible to replace all command-line arguments for the starter itself with +environment variables (but not any `--args.*` pass-through options for the +ArangoDB server). To do so, set an environment variable named +`ARANGODB_` + `<name of command line option in uppercase>`, where all dashes, +underscores and dots are replaced with underscores. + +For example, + +```bash +ARANGODB_DOCKER_TTY=true arangodb +``` + +is equal to: + +```bash +arangodb --docker.tty=true +``` diff --git a/site/content/arangodb/oem/components/tools/arangodb-starter/security.md b/site/content/arangodb/oem/components/tools/arangodb-starter/security.md new file mode 100644 index 0000000000..50a04a4eb6 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodb-starter/security.md @@ -0,0 +1,132 @@ +--- +title: Security +menuTitle: Security +weight: 10 +description: >- + The Starter provides commands to create certificates and tokens for securing + ArangoDB deployments for encrypting connections and authenticated access control +--- +## Creating certificates + +The starter provides commands to create all certificates needed for an ArangoDB +deployment with optional Datacenter-to-Datacenter Replication. + +### TLS server certificates + +To create a certificate used for TLS servers in the **keyfile** format, +you need the public key of the CA (`--cacert`), the private key of +the CA (`--cakey`) and one or more hostnames (or IP addresses). +Then run: + +```bash +arangodb create tls keyfile \ + --cacert=my-tls-ca.crt --cakey=my-tls-ca.key \ + --host=<hostname> \ + --keyfile=my-tls-cert.keyfile +``` + +Make sure to store the generated keyfile (`my-tls-cert.keyfile`) in a safe place. + +To create a certificate used for TLS servers in the **crt** & **key** format, +you need the public key of the CA (`--cacert`), the private key of +the CA (`--cakey`) and one or more hostnames (or IP addresses). +Then run: + +```bash +arangodb create tls certificate \ + --cacert=my-tls-ca.crt --cakey=my-tls-ca.key \ + --host=<hostname> \ + --cert=my-tls-cert.crt \ + --key=my-tls-cert.key \ +``` + +Make sure to protect and store the generated files (`my-tls-cert.crt` & `my-tls-cert.key`) in a safe place. + +### Client authentication certificates + +To create a certificate used for client authentication in the **keyfile** format, +you need the public key of the CA (`--cacert`), the private key of +the CA (`--cakey`) and one or more hostnames (or IP addresses) or email addresses. +Then run: + +```bash +arangodb create client-auth keyfile \ + --cacert=my-client-auth-ca.crt --cakey=my-client-auth-ca.key \ + [--host=<hostname> | --email=<emailaddress>] \ + --keyfile=my-client-auth-cert.keyfile +``` + +Make sure to protect and store the generated keyfile (`my-client-auth-cert.keyfile`) in a safe place. + +### CA certificates + +To create a CA certificate used to **sign TLS certificates**, run: + +```bash +arangodb create tls ca \ + --cert=my-tls-ca.crt --key=my-tls-ca.key +``` + +Make sure to protect and store both generated files (`my-tls-ca.crt` & `my-tls-ca.key`) in a safe place. + +Note: CA certificates have a much longer lifetime than normal certificates. +Therefore even more care is needed to store them safely. + +To create a CA certificate used to **sign client authentication certificates**, run: + +```bash +arangodb create client-auth ca \ + --cert=my-client-auth-ca.crt --key=my-client-auth-ca.key +``` + +Make sure to protect and store both generated files (`my-client-auth-ca.crt` & `my-client-auth-ca.key`) +in a safe place. + +Note: CA certificates have a much longer lifetime than normal certificates. +Therefore even more care is needed to store them safely. + +## Creating authentication tokens + +JWT tokens are used to authenticate servers (within a cluster) with each other. + +### JWT tokens + +To create a file containing an JWT token, run: + +```bash +arangodb create jwt-secret \ + --secret=my-secret.jwt [--length=32] +``` + +Make sure to protect and store the generated file (`my-secret.jwt`) in a safe place. + +## Using authentication tokens + +ArangoDB deployments that require authentication can be accessed through standard user+password +pairs or using a JWT to get "super-user" access. + +This super-user access is needed to communicate directly with the Agency or with any server +in the deployment. +Note that uses super-user access for normal database access is NOT advised. + +To create a JWT from the JWT secret file specified using the `--auth.jwt-secret` option, +use the following command: + +```bash +arangodb auth token --auth.jwt-secret=<secret-file> +``` + +To create a complete HTTP Authorization header that can be passed directly to tools like `curl`, +use the following command: + +```bash +arangodb auth header --auth.jwt-secret=<secret-file> +``` + +Using `curl` with this command looks like this: + +```bash +curl -v -H "$(arangodb auth header --auth.jwt-secret=<secret-file>)" http://<database-ip>:8529/_api/version +``` + +Note the double quotes around `$(...)`. diff --git a/site/content/arangodb/oem/components/tools/arangodump/_index.md b/site/content/arangodb/oem/components/tools/arangodump/_index.md new file mode 100644 index 0000000000..3811b964de --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodump/_index.md @@ -0,0 +1,20 @@ +--- +title: _arangodump_ +menuTitle: arangodump +weight: 15 +description: >- + `arangodump` is a command-line client tool to create backups of the data and + structures stored in ArangoDB +--- +Dumps are meant to be restored with [_arangorestore_](../arangorestore/_index.md). + +If you want to export for external programs to formats like JSON or CSV, see +[_arangoexport_](../arangoexport/_index.md) instead. For _Hot Backups_ see +[_arangobackup_](../arangobackup/_index.md). + +_arangodump_ can be used for all ArangoDB deployments modes (Single Instance, +Active Failover, Cluster and DC2DC) and it can backup selected collections +or all collections of a database, optionally including _system_ collections. One +can backup the structure, i.e. the collections with their configuration without +any data, only the data stored in them, or both. If you are using the Enterprise +Edition, dumps can optionally be encrypted. diff --git a/site/content/arangodb/oem/components/tools/arangodump/examples.md b/site/content/arangodb/oem/components/tools/arangodump/examples.md new file mode 100644 index 0000000000..bde4958905 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodump/examples.md @@ -0,0 +1,317 @@ +--- +title: _arangodump_ Examples +menuTitle: Examples +weight: 5 +description: '' +--- +_arangodump_ can be invoked in a command line by executing the following command: + +``` +arangodump --output-directory "dump" +``` + +This connects to an ArangoDB server and dump all non-system collections from +the default database (`_system`) into an output directory named `dump`. +Invoking _arangodump_ fails if the output directory already exists. This is +an intentional security measure to prevent you from accidentally overwriting already +dumped data. If you are positive that you want to overwrite data in the output +directory, you can use the parameter `--overwrite true` to confirm this: + +``` +arangodump --output-directory "dump" --overwrite true +``` + +_arangodump_ connects to the `_system` database by default using the default +endpoint. To override the endpoint, or specify a different user, use one of the +following startup options: + +- `--server.endpoint <string>`: endpoint to connect to +- `--server.username <string>`: username +- `--server.password <string>`: password to use (omit this and you'll be prompted for the + password) +- `--server.authentication <bool>`: whether or not to use authentication + +If you want to connect to a different database or dump all databases you can additionally +use the following startup options: + +- `--all-databases true`: must have access to all databases, and not specify a database. +- `--server.database <string>`: name of the database to connect to + +Note that the specified user must have access to the databases. + +Here's an example of dumping data from a non-standard endpoint, using a dedicated +[database name](../../../concepts/data-structure/databases.md#database-names): + +``` +arangodump \ + --server.endpoint tcp://192.168.173.13:8531 \ + --server.username backup \ + --server.database mydb \ + --output-directory "dump" +``` + +In contrast to the above call `--server.database` must not be specified when dumping +all databases using `--all-databases true`: + +``` +arangodump \ + --server.endpoint tcp://192.168.173.13:8531 \ + --server.username backup \ + --all-databases true \ + --output-directory "dump-multiple" +``` + +When finished, _arangodump_ prints out a summary line with some aggregate +statistics about what it did, e.g.: + +``` +Processed 43 collection(s), wrote 408173500 byte(s) into datafiles, sent 88 batch(es) +``` + +Also, more than one endpoint can be provided, such as: + +``` +arangodump \ + --server.endpoint tcp://192.168.173.13:8531 \ + --server.endpoint tcp://192.168.173.13:8532 \ + --server.username backup \ + --all-databases true \ + --output-directory "dump-multiple" +``` + +By default, _arangodump_ dumps both structural information and documents from all +non-system collections. To adjust this, there are the following command-line +arguments: + +- `--dump-data <bool>`: set to `true` to include documents in the dump. Set to `false` + to exclude documents. The default value is `true`. +- `--include-system-collections <bool>`: whether or not to include system collections + in the dump. The default value is `false`. **Set to _true_ if you are using named + graphs that you are interested in restoring.** + +For example, to only dump structural information of all collections (including system +collections), use: + +``` +arangodump --dump-data false --include-system-collections true --output-directory "dump" +``` + +To restrict the dump to just specific collections, use the `--collection` option. +You can specify it multiple times if required: + +``` +arangodump --collection myusers --collection myvalues --output-directory "dump" +``` + +Structural information for a collection is saved in files with name pattern +`<collection-name>.structure.json`. Each structure file contains a JSON object +with these attributes: +- `parameters`: contains the collection properties +- `indexes`: contains the collection indexes + +Document data for a collection is saved in files with name pattern +`<collection-name>.data.json`. Each line in a data file is a document insertion/update or +deletion marker, alongside with some meta data. + +## Cluster Backup + +The _arangodump_ tool supports sharding and can be used to backup data from a Cluster. +Simply point it to one of the _Coordinators_ and it +behaves exactly as described above, working on sharded collections +in the Cluster. + +Please see the [Limitations](limitations.md). + +As above, the output is one structure description file and one data +file per sharded collection. Note that the data in the data file is +sorted first by shards and within each shard by ascending timestamp. The +structural information of the collection contains the number of shards +and the shard keys. + +Note that the version of the arangodump client tool needs to match the +version of the ArangoDB server it connects to. + +### Dumping collections with sharding prototypes + +Collections may be created with the shard distribution identical to an existing +prototypical collection (see [`distributeShardsLike`](../../../develop/javascript-api/@arangodb/db-object.md#db_createcollection-name--properties--type--options)); +i.e. shards are distributed in the very same pattern as in the prototype collection. +Such collections cannot be dumped without the referenced collection or arangodump +yields an error. + +``` +arangodump --collection clonedCollection --output-directory "dump" + +ERROR [f7ff5] {dump} An error occurred: Collection clonedCollection's shard distribution is based on that of collection prototypeCollection, which is not dumped along. +``` + +You need to dump the prototype collection as well: + +``` +arangodump --collection clonedCollection --collection prototypeCollection --output-directory "dump" + +... +INFO [66c0e] {dump} Processed 2 collection(s) from 1 database(s) in 0.132990 s total time. Wrote 0 bytes into datafiles, sent 6 batch(es) in total. +``` + +## Encryption + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +You can encrypt dumps using an encryption keyfile, which must contain exactly 32 +bytes of data (required by the AES block cipher). + +The keyfile can be created by an external program, or, on Linux, by using a command +like the following: + +``` +dd if=/dev/random bs=1 count=32 of=yourSecretKeyFile +``` + +For security reasons, it is best to create these keys offline (away from your +database servers) and directly store them in your secret management +tool. + +In order to create an encrypted backup, add the `--encryption.keyfile` +option when invoking _arangodump_, in addition to any other option you +are already using. The following example assumes that your secret key +is stored in ~/SECRET-KEY: + +``` +arangodump --collection "secret-collection" dump --encryption.keyfile ~/SECRET-KEY +``` + +Note that _arangodump_ does not store the key anywhere. It is the responsibility +of the user to find a safe place for the key. However, _arangodump_ stores +the used encryption method in a file named `ENCRYPTION` in the dump directory. +That way _arangorestore_ can later find out whether it is dealing with an +encrypted dump or not. + +Trying to restore the encrypted dump without specifying the key fails +and _arangorestore_ reports an error: + +``` +arangorestore --collection "secret-collection" dump --create-collection true +... +the dump data seems to be encrypted with aes-256-ctr, but no key information was specified to decrypt the dump +it is recommended to specify either `--encryption.keyfile` or `--encryption.key-generator` when invoking arangorestore with an encrypted dump +``` + +It is required to use the exact same key when restoring the data. Again this is +done by providing the `--encryption.keyfile` parameter: + +``` +arangorestore --collection "secret-collection" dump --create-collection true --encryption.keyfile ~/SECRET-KEY +``` + +Using a different key leads to the backup being non-recoverable. + +Note that encrypted backups can be used together with the already existing +RocksDB encryption-at-rest feature. + +## Compression + +`--compress-output` + +Data can optionally be dumped in a compressed format to save space on disk. +The `--compress-output` option cannot be used together with [Encryption](#encryption). + +If compression is enabled, no `.data.json` files are written. Instead, the +collection data gets compressed using the Gzip algorithm and for each collection +a `.data.json.gz` file is written. Metadata files such as `.structure.json` and +`.view.json` do not get compressed. + +``` +arangodump --output-directory "dump" --compress-output +``` + +Compressed dumps can be restored with _arangorestore_, which automatically +detects whether the data is compressed or not based on the file extension. + +``` +arangorestore --input-directory "dump" +``` + +## Dump output format + +<small>Introduced in: v3.8.0</small> + +Since its inception, _arangodump_ wrapped each dumped document into an extra +JSON envelope, such as follows: + +```json +{"type":2300,"key":"test","data":{"_key":"test","_rev":..., ...}} +``` + +This original dump format was useful when there was the MMFiles storage engine, +which could use different `type` values in its datafiles. +However, the RocksDB storage engine only uses `"type":2300` (document) when +dumping data, so the JSON wrapper provides no further benefit except +compatibility with older versions of ArangoDB. + +In case a dump taken with v3.8.0 or higher is known to never be used in older +ArangoDB versions, the JSON envelopes can be turned off. The startup option +`--envelope` controls this. The option defaults to `true`, meaning dumped +documents are wrapped in envelopes, which makes new dumps compatible with +older versions of ArangoDB. + +If that is not needed, the `--envelope` option can be set to `false`. +In this case, the dump files only contain the raw documents, without any +envelopes around them: + +```json +{"_key":"test","_rev":..., ...} +``` + +Disabling the envelopes can **reduce dump sizes** a lot, especially if documents +are small on average and the relative cost of the envelopes is high. Omitting +the envelopes can also help to **save a bit on memory usage and bandwidth** for +building up the dump results and sending them over the wire. + +As a bonus, turning off the envelopes turns _arangodump_ into a fast, concurrent +JSONL exporter for one or multiple collections: + +``` +arangodump --collection "collection" --threads 8 --envelope false --compress-output false dump +``` + +The JSONL format is also supported by _arangoimport_ natively. + +{{< warning >}} +Dumps created with the `--envelope false` setting cannot be restored into any +ArangoDB versions older than v3.8.0! +{{< /warning >}} + +## Threads + +_arangodump_ can use multiple threads for dumping database data in +parallel. To speed up the dump of a database with multiple collections, it is +often beneficial to increase the number of _arangodump_ threads. +The number of threads can be controlled via the `--threads` option. The default +value is the maximum of `2` and the number of available CPU cores. + +The `--threads` option works dynamically, its value depends on the number of +available CPU cores. If the amount of available CPU cores is less than `3`, a +threads value of `2` is used. Otherwise the value of threads is set to the +number of available CPU cores. + +For example: + +- If a system has 8 cores, then max(2,8) = 8, i.e. 8 threads are used. +- If it has 1 core, then max(2,1) = 2, i.e. 2 threads are used. + +_arangodump_ versions prior to v3.8.0 distribute dump jobs for individual +collections to concurrent worker threads, which is optimal for dumping many +collections of approximately the same size, but does not help for dumping few +large collections or few large collections with many shards. + +Since v3.8.0, _arangodump_ can also dispatch dump jobs for individual shards of +each collection, allowing higher parallelism if there are many shards to dump +but only few collections. Keep in mind that even when concurrently dumping the +data from multiple shards of the same collection in parallel, the individual +shards' results are still written into a single result file for the collection. +With a massive number of concurrent dump threads, some contention on that shared +file should be expected. Also note that when dumping the data of multiple shards +from the same collection, each thread's results are written to the result +file in a non-deterministic order. This should not be a problem when restoring +such dump, as _arangorestore_ does not assume any order of input. diff --git a/site/content/arangodb/oem/components/tools/arangodump/limitations.md b/site/content/arangodb/oem/components/tools/arangodump/limitations.md new file mode 100644 index 0000000000..94e7d17969 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodump/limitations.md @@ -0,0 +1,16 @@ +--- +title: _arangodump_ Limitations +menuTitle: Limitations +weight: 20 +description: '' +--- +_arangodump_ has the following limitations: + +- In a cluster, _arangodump_ does not guarantee to dump a consistent snapshot + if write operations happen while the dump is in progress (see + [Hot Backups](../../../operations/backup-and-restore.md#hot-backups) for an alternative). It is + therefore recommended not to perform any data-modification operations on the + cluster while _arangodump_ is running. This is in contrast to what happens on + a single instance or an active failover setup, where even if + write operations are ongoing, the created dump is consistent, as a snapshot + is taken when the dump starts. diff --git a/site/content/arangodb/oem/components/tools/arangodump/maskings.md b/site/content/arangodb/oem/components/tools/arangodump/maskings.md new file mode 100644 index 0000000000..0bec342887 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodump/maskings.md @@ -0,0 +1,1050 @@ +--- +title: _arangodump_ Data Maskings +menuTitle: Maskings +weight: 15 +description: >- + `arangodump` supports obfuscating and redacting information when dumping, to + allow you sharing dumps without sensitive data with third parties +--- +The masking feature allows you to define how sensitive data shall be dumped. +It is possible to exclude collections entirely, limit the dump to the +structural information of a collection (name, indexes, sharding etc.) +or to obfuscate certain fields for a dump. + +You can make use of the feature by specifying a configuration file using the +`--maskings` startup option when invoking `arangodump`. + +A JSON configuration file is used to define which collections and fields to mask +and how. The general structure of the configuration file looks like this: + +```js +{ + "<collection-name-1>": { + "type": "<masking-type>", + "maskings": [ // if masking-type is "masked" + { "path": "<attr1>", "type": "<masking-function>", ... }, // rule 1 + { "path": "<attr2>", "type": "<masking-function>", ... }, // rule 2 + ... + ] + }, + "<collection-name-2>": { ... }, + "<collection-name-3>": { ... }, + "*": { ... } +} +``` + +At the top level, there is an object with collection names. The masking to be +applied to the respective collection is defined by the `type` sub-attribute. +If the `type` is `"masked"`, then a sibling `maskings` attribute is available +to define rules for obfuscating documents. + +Using `"*"` as collection name defines a default behavior for collections +not listed explicitly. + +## Masking Types + +`type` is a string describing how to mask the given collection. +Possible values are: + +- `"exclude"`: the collection is ignored completely and not even the + structure data is dumped. + +- `"structure"`: only the collection structure is dumped, but no data at all + (the file `<collection-name>.data.json` or `<collection-name>.data.json.gz` + respectively is still created, but will not contain data). + +- `"masked"`: the collection structure and all data is dumped. However, the data + is subject to obfuscation defined in the attribute `maskings`. It is an array + of objects, with one object per masking rule. Each object needs at least a + `path` and a `type` attribute to [define which field to mask](#path) and which + [masking function](#masking-functions) to apply. Depending on the + masking type, there may exist additional attributes to control the masking + function behavior. + +- `"full"`: the collection structure and all data is dumped. No masking is + applied to this collection at all. + +**Example** + +```json +{ + "private": { + "type": "exclude" + }, + + "temperature": { + "type": "full" + }, + + "log": { + "type": "structure" + }, + + "person": { + "type": "masked", + "maskings": [ + { + "path": "name", + "type": "xifyFront", + "unmaskedLength": 2 + }, + { + "path": ".security_id", + "type": "xifyFront", + "unmaskedLength": 2 + } + ] + } +} +``` + +- The collection called _private_ is completely ignored. +- Only the structure of the collection _log_ is dumped, but not the data itself. +- The structure and data of the _temperature_ collection is dumped without any + obfuscation of document attributes. +- The collection _person_ is dumped completely but with maskings applied: + - The _name_ field is masked if it occurs on the top-level. + - It also masks fields with the name _security_id_ anywhere in the document. + - The masking function is of type [_xifyFront_](#xify-front) in both cases. + The additional setting `unmaskedLength` is specific so _xifyFront_. +- All additional collections that might exist in the targeted database is + ignored (like the collection _private_), as there is no attribute key + `"*"` to specify a different default type for the remaining collections. + +### Masking vs. dump-data option + +_arangodump_ also supports a very coarse masking with the option +`--dump-data false`, which leaves out all data for the dump. + +You can either use `--maskings` or `--dump-data false`, but not both. + +### Masking vs. collection option + +_arangodump_ also supports a very coarse masking with the option +`--collection`. This restricts the collections that are +dumped to the ones explicitly listed. + +It is possible to combine `--maskings` and `--collection`. +This takes the intersection of exportable collections. + +## Path + +`path` defines which field to obfuscate. There can only be a single +path per masking, but an unlimited amount of maskings per collection. + +```json +{ + "collection1": { + "type": "masked", + "maskings": [ + { + "path": "attr1", + "type": "random" + }, + { + "path": "attr2", + "type": "randomString" + }, + ... + ] + }, + "collection2": { + "type": "masked", + "maskings": [ + { + "path": "attr3", + "type": "random" + } + ] + }, + ... +} +``` + +Top-level **system attributes** (`_key`, `_id`, `_rev`, `_from`, `_to`) are +never masked. + +To mask a top-level attribute value, the path is simply the attribute +name, for instance `"name"` to mask the value `"foobar"`: + +```json +{ + "_key": "1234", + "name": "foobar" +} +``` + +The path to a nested attribute `name` with a top-level attribute `person` +as its parent is `"person.name"` (here: `"foobar"`): + +```json +{ + "_key": "1234", + "person": { + "name": "foobar" + } +} +``` + +Example masking definition: + +```json +{ + "<collection-name>": { + "type": "masked", + "maskings": [ + { + "path": "person.name", + "type": "<masking-function>" + } + ] + } +} +``` + +If the path starts with a `.` then it matches any path ending in `name`. +For example, `.name` matches the field `name` of all leaf attributes +in the document. Leaf attributes are attributes whose value is `null`, +`true`, `false`, or of data type `string`, `number` or `array`. +That means, it matches `name` at the top level as well as at any nested level +(e.g. `foo.bar.name`), but not nested objects themselves. + +On the other hand, `name` only matches leaf attributes +at top level. `person.name` matches the attribute `name` of a leaf +in the top-level object `person`. If `person` was itself an object, +then the masking settings for this path would be ignored, because it +is not a leaf attribute. + +If the attribute value is an **array** then the masking is applied to +**all array elements individually**. + +The special path `*` matches **all** leaf nodes of a document. + +If you have an attribute key that contains a dot (like `{ "name.with.dots": … }`) +or a top-level attribute with a single asterisk as full name (`{ "*": … }`) +then you need to quote the name in ticks or backticks: + +- `"path": "´name.with.dots´"` +- `` "path": "`name.with.dots`" `` +- `"path": "´*´"` +- `` "path": "`*`" `` + +**Example** + +The following configuration replaces the value of the `name` +attribute with an "xxxx"-masked string: + +```json +{ + "type": "xifyFront", + "path": ".name", + "unmaskedLength": 2 +} +``` + +The document: + +```json +{ + "name": "top-level-name", + "age": 42, + "nicknames" : [ { "name": "hugo" }, "egon" ], + "other": { + "name": [ "emil", { "secret": "superman" } ] + } +} +``` + +… is changed as follows: + +```json +{ + "name": "xxxxxxxxxxxxme", + "age": 42, + "nicknames" : [ { "name": "xxgo" }, "egon" ], + "other": { + "name": [ "xxil", { "secret": "superman" } ] + } +} +``` + +The values `"egon"` and `"superman"` are not replaced, because they +are not contained in an attribute value of which the attribute name is +`name`. + +### Nested objects and arrays + +If you specify a path and the attribute value is an array then the +masking decision is applied to each element of the array as if this +was the value of the attribute. This applies to arrays inside the array too. + +If the attribute value is an object, then it is ignored and the attribute +does not get masked. To mask nested fields, specify the full path for each +leaf attribute. + +{{< tip >}} +If some documents have an attribute `mail` with a string as value, but other +documents store a nested object under the same attribute name, then make sure +to set up proper masking for the latter case, in which sub-attributes are not +masked if there is only a masking configured for the attribute `mail` +but not its nested attributes. + +You can use the special path `"*"` to **match all leaf attributes** in the +document. +{{< /tip >}} + +**Examples** + +Masking `mail` with the _Xify Front_ function: + +```json +{ + "<collection>": { + "type": "masked", + "maskings": [ + { + "path": "mail", + "type": "xifyFront" + } + ] + } +} +``` + +… converts this document: + +```json +{ + "mail" : "mail address" +} +``` + +… into: + +```json +{ + "mail" : "xxil xxxxxxss" +} +``` + +because `mail` is a leaf attribute. The document: + +```json +{ + "mail" : [ + "address one", + "address two", + [ + "address three" + ] + ] +} +``` + +… is converted into: + +```json +{ + "mail" : [ + "xxxxxss xne", + "xxxxxss xwo", + [ + "xxxxxss xxxee" + ] + ] +} +``` + +… because the masking is applied to each array element individually +including the elements of the sub-array. The document: + +```json +{ + "mail" : { + "address" : "mail address" + } +} +``` + +… is not masked because `mail` is not a leaf attribute. +To mask the mail address, you could use the paths `mail.address` +or `.address` in the masking definition: + +```json +{ + "<collection>": { + "type": "masked", + "maskings": [ + { + "path": ".address", + "type": "xifyFront" + } + ] + } +} +``` + +A catch-all `"path": "*"` would apply to the nested `address` attribute too, +but it would mask all other string attributes as well, which may not be what +you want. A syntax `"path": "mail.*` to only match the sub-attributes of the +top-level `mail` attribute is not supported. + +### Rule precedence + +Masking rules may overlap, for instance if you specify the same path multiple +times, or if you define a rule for a specific field but also one which matches +all leaf attributes of the same name. + +The precedence is determined by the order in which the rules are defined in the +masking configuration file in such cases, giving priority to the first matching +rule (i.e. the rule above the other ambiguous ones). + +```json +{ + "<collection>": { + "type": "masked", + "maskings": [ + { + "path": "address", + "type": "xifyFront" + }, + { + "path": ".address", + "type": "random" + } + ] + } +} +``` + +Above masking definition obfuscates the top-level attribute `address` with +the `xifyFront` function, whereas all nested attributes with name `address` +will use the `random` masking function. If the rules are defined in reverse +order however, then all attributes called `address` are obfuscated using +`random`. The second, overlapping rule is effectively ignored: + +```json +{ + "<collection>": { + "type": "masked", + "maskings": [ + { + "path": ".address", + "type": "random" + }, + { + "path": "address", + "type": "xifyFront" + } + ] + } +} +``` + +This behavior also applies to the catch-all path `"*"`, which means it should +generally be placed below all other rules for a collection so that it is used +for all unspecified attribute paths. Otherwise, all document attributes are +processed by a single masking function, ignoring any other rules below it. + +```json +{ + "<collection>": { + "type": "masked", + "maskings": [ + { + "path": "address", + "type": "random" + }, + { + "path": ".address", + "type": "xifyFront" + }, + { + "path": "*", + "type": "email" + } + ] + } +} +``` + +## Masking Functions + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +- [Xify Front](#xify-front) +- [Zip](#zip) +- [Datetime](#datetime) +- [Integer Number](#integer-number) +- [Decimal Number](#decimal-number) +- [Credit Card Number](#credit-card-number) +- [Phone Number](#phone-number) +- [Email Address](#email-address) + +The masking functions: + +- [Random String](#random-string) +- [Random](#random) + +… are available in the Community Edition as well as the Enterprise Edition. + +### Random String + +This masking type replaces all values of attributes whose values are strings +with key `name` with an anonymized string. It is not guaranteed that the +string is of the same length. Attribute whose values are not strings +are not modified. + +A hash of the original string is computed. If the original string is +shorter, then the hash is used. This results in a longer +replacement string. If the string is longer than the hash, then +characters are repeated as many times as needed to reach the full +original string length. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"randomString"` + +**Example** + +```json +{ + "path": ".name", + "type": "randomString" +} +``` + +Above masking setting applies to all leaf attributes with name `.name`. +A document like: + +```json +{ + "_key" : "1234", + "name" : [ + "My Name", + { + "other" : "Hallo Name" + }, + [ + "Name One", + "Name Two" + ], + true, + false, + null, + 1.0, + 1234, + "This is a very long name" + ], + "deeply": { + "nested": { + "name": "John Doe", + "not-a-name": "Pizza" + } + } +} +``` + +… is converted to: + +```json +{ + "_key": "1234", + "name": [ + "+y5OQiYmp/o=", + { + "other": "Hallo Name" + }, + [ + "ihCTrlsKKdk=", + "yo/55hfla0U=" + ], + true, + false, + null, + 1.0, + 1234, + "hwjAfNe5BGw=hwjAfNe5BGw=" + ], + "deeply": { + "nested": { + "name": "55fHctEM/wY=", + "not-a-name": "Pizza" + } + } +} +``` + +### Random + +This masking type substitutes leaf attribute values of all data types with +random values of the same kind: + +- Strings are replaced with [random strings](#random-string). +- Numbers are replaced with random integer or decimal numbers, depending on + the original value (but not keeping sign or scientific notation). + The generated numbers are between -1000 and 1000. +- Booleans are randomly replaced with `true` or `false`. +- `null` values remain `null`. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"random"` + +**Examples** + +```json +{ + "collection": { + "type": "masked", + "maskings": [ + { + "path": "*", + "type": "random" + } + ] + } +} +``` + +Using above masking configuration, all leaf attributes of the documents in +_collection_ would be randomized. A possible input document: + +```json +{ + "_key" : "1121535", + "_id" : "coll/1121535", + "_rev" : "_Z3AKGjW--_", + "nullValue" : null, + "bool" : true, + "int" : 1, + "decimal" : 2.34, + "string" : "hello", + "array" : [ + null, + false, + true, + 0, + -123, + 0.45, + 6e7, + -0.8e-3, + "nine", + "Lorem ipsum sit dolor amet.", + [ + false, + false + ], + { + "obj" : "nested" + } + ] +} +``` + +… could result in an output like this: + +```json +{ + "_key": "1121535", + "_id": "coll/1121535", + "_rev": "_Z3AKGjW--_", + "nullValue": null, + "bool": false, + "int": -900, + "decimal": -4.27, + "string": "etxfOC+K0HM=", + "array": [ + null, + true, + false, + 754, + -692, + 2.64, + 834, + 1.69, + "NGf7NKGrMYw=", + "G0czIlvaGw4=G0czIlvaGw4=G0c", + [ + false, + true + ], + { + "obj": "eCGe36xiRho=" + } + ] +} +``` + +### Xify Front + +This masking type replaces the front characters with `x` and +blanks. Alphanumeric characters, `_` and `-` are replaced by `x`, +everything else is replaced by a blank. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"xifyFront"` +- `unmaskedLength` (number, _default: `2`_): how many characters to + leave as-is on the right-hand side of each word as integer value +- `hash` (bool, _default: `false`_): whether to append a hash value to the + masked string to avoid possible unique constraint violations caused by + the obfuscation +- `seed` (integer, _default: `0`_): used as secret for computing the hash. + A value of `0` means a random seed + +**Examples** + +```json +{ + "<collection>": { + "type": "masked", + "maskings": [ + { + "path": ".name", + "type": "xifyFront", + "unmaskedLength": 2 + } + ] + } +} +``` + +This affects attributes with key `"name"` at any level by masking all +alphanumeric characters of a word except the last two characters. Words of +length 1 and 2 remain unmasked. If the attribute value is not a string but +boolean or numeric, then the result is `"xxxx"` (fixed length). +`null` values remain `null`. + +```json +{ + "name": "This is a test!Do you agree?", + "bool": true, + "number": 1.23, + "null": null +} +``` + +… becomes: + +```json +{ + "name": "xxis is a xxst Do xou xxxee ", + "bool": "xxxx", + "number": "xxxx", + "null": null +} +``` + +There is a catch. If you have an index on the attribute the masking +might distort the index efficiency or even cause errors in case of a +unique index. + +```json +{ + "path": ".name", + "type": "xifyFront", + "unmaskedLength": 2, + "hash": true +} +``` + +This adds a hash at the end of the string. + +``` +"This is a test!Do you agree?" +``` + +… becomes + +``` +"xxis is a xxst Do xou xxxee NAATm8c9hVQ=" +``` + +Note that the hash is based on a random secret that is different for +each run. This avoids dictionary attacks which could be used to guess +values based pre-computations on dictionaries. + +If you need reproducible results, i.e. hashes that do not change between +different runs of _arangodump_, you need to specify a secret as seed, +a number which must not be `0`. + +```json +{ + "path": ".name", + "type": "xifyFront", + "unmaskedLength": 2, + "hash": true, + "seed": 246781478647 +} +``` + +### Zip + +This masking type replaces a zip code with a random one. +It uses the following rules: + +- If a character of the original zip code is a digit, it is replaced + by a random digit. +- If a character of the original zip code is a letter, it + is replaced by a random letter keeping the case. +- If the attribute value is not a string then the default value is used. + +Note that this generates random zip codes. Therefore there is a +chance that the same zip code value is generated multiple times, which can +cause unique constraint violations if a unique index is or will be +used on the zip code attribute. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"zip"` +- `default` (string, _default: `"12345"`_): if the input field is not of + data type `string`, then this value is used + +**Examples** + +```json +{ + "path": ".code", + "type": "zip", +} +``` + +This replaces real zip codes stored in fields called `code` at any level +with random ones. `"12345"` is used as fallback value. + +```json +{ + "path": ".code", + "type": "zip", + "default": "abcdef" +} +``` + +If the original zip code is: + +``` +50674 +``` + +… it is replaced by e.g.: + +``` +98146 +``` + +If the original zip code is: + +``` +SA34-EA +``` + +… it is replaced by e.g.: + +``` +OW91-JI +``` + +If the original zip code is `null`, `true`, `false` or a number, then the +user-defined default value of `"abcdef"` is used. + +### Datetime + +This masking type replaces the value of the attribute with a random +date between two configured dates in a customizable format. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"datetime"` +- `begin` (string, _default: `"1970-01-01T00:00:00.000"`_): + earliest point in time to return. Date time string in ISO 8601 format. +- `end` (string, _default: now_): + latest point in time to return. Date time string in ISO 8601 format. + In case a partial date time string is provided (e.g. `2010-06` without day + and time) the earliest date and time is assumed (`2010-06-01T00:00:00.000`). + The default value is the current system date and time. +- `format` (string, _default: `""`_): the formatting string format is + described in [`DATE_FORMAT()`](../../../aql/functions/date.md#date_format). + If no format is specified, then the result is an empty string. + +**Example** + +```json +{ + "path": "eventDate", + "type": "datetime", + "begin" : "2019-01-01", + "end": "2019-12-31", + "format": "%yyyy-%mm-%dd", +} +``` + +Above example masks the field `eventDate` by returning a random date time +string in the range of January 1st and December 31st in 2019 using a format +like `2019-06-17`. + +### Integer Number + +This masking type replaces the value of the attribute with a random +integer number. It replaces the value even if it is a string, +Boolean, or `null`. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"integer"` +- `lower` (number, _default: `-100`_): smallest integer value to return +- `upper` (number, _default: `100`_): largest integer value to return + +**Example** + +```json +{ + "path": "count", + "type": "integer", + "lower" : -100, + "upper": 100 +} +``` + +This masks the field `count` with a random number between +-100 and 100 (inclusive). + +### Decimal Number + +This masking type replaces the value of the attribute with a random +floating point number. It replaces the value even if it is a string, +Boolean, or `null`. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"decimal"` +- `lower` (number, _default: `-1`_): smallest floating point value to return +- `upper` (number, _default: `1`_): largest floating point value to return +- `scale` (number, _default: `2`_): maximal amount of digits in the + decimal fraction part + +**Examples** + +```json +{ + "path": "rating", + "type": "decimal", + "lower" : -0.3, + "upper": 0.3 +} +``` + +This masks the field `rating` with a random floating point number between +-0.3 and +0.3 (inclusive). By default, the decimal has a scale of 2. +That means, it has at most 2 digits after the dot. + +The configuration: + +```json +{ + "path": "rating", + "type": "decimal", + "lower" : -0.3, + "upper": 0.3, + "scale": 3 +} +``` + +… generates numbers with at most 3 decimal digits. + +### Credit Card Number + +This masking type replaces the value of the attribute with a random +credit card number (as integer number). +See [Luhn algorithm](https://en.wikipedia.org/wiki/Luhn_algorithm) +for details. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"creditCard"` + +**Example** + +```json +{ + "path": "ccNumber", + "type": "creditCard" +} +``` + +This generates a random credit card number to mask field `ccNumber`, +e.g. `4111111414443302`. + +### Phone Number + +This masking type replaces a phone number with a random one. +It uses the following rule: + +- If a character of the original number is a digit + it is replaced by a random digit. +- If it is a letter it is replaced by a random letter. +- All other characters are left unchanged. +- If the attribute value is not a string it is replaced by the + default value. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"phone"` +- `default` (string, _default: `"+1234567890"`_): if the input field + is not of data type `string`, then this value is used + +**Examples** + +```json +{ + "path": "phone.landline", + "type": "phone" +} +``` + +This replaces an existing phone number with a random one, for instance +`"+31 66-77-88-xx"` might get substituted by `"+75 10-79-52-sb"`. + +```json +{ + "path": "phone.landline", + "type": "phone", + "default": "+49 12345 123456789" +} +``` + +This masks a phone number as before, but falls back to a different default +phone number in case the input value is not a string. + +### Email Address + +This masking type takes an email address, computes a hash value and +splits it into three equal parts `AAAA`, `BBBB`, and `CCCC`. The +resulting email address is in the format `AAAA.BBBB@CCCC.invalid`. +The hash is based on a random secret that is different for each run. + +Masking settings: + +- `path` (string): which field to mask +- `type` (string): masking function name `"email"` + +**Example** + +```json +{ + "path": ".email", + "type": "email" +} +``` + +This masks every leaf attribute `email` with a random email address +similar to `"EHwG.3AOg@hGU=.invalid"`. diff --git a/site/content/arangodb/oem/components/tools/arangodump/options.md b/site/content/arangodb/oem/components/tools/arangodump/options.md new file mode 100644 index 0000000000..03451f328d --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangodump/options.md @@ -0,0 +1,14 @@ +--- +title: _arangodump_ Options +menuTitle: Options +weight: 10 +description: >- + The startup options of the `arangodump` executable +pageToc: + maxHeadlineLevel: 2 +--- +_arangodump_ Options + +Usage: `arangodump [<options>]` + +{{% program-options name="arangodump" %}} diff --git a/site/content/arangodb/oem/components/tools/arangoexport/_index.md b/site/content/arangodb/oem/components/tools/arangoexport/_index.md new file mode 100644 index 0000000000..780dcd0b4c --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoexport/_index.md @@ -0,0 +1,13 @@ +--- +title: _arangoexport_ +menuTitle: arangoexport +weight: 35 +description: >- + `arangoexport` is a command-line client tool to export data to formats like + JSON, JSON Lines (JSONL), CSV, and XML for consumption by third-party tools +--- +_arangoexport_ can export data to supported text formats from +[ArangoDB servers](../../arangodb-server/_index.md). + +If you want to create backups, see [_arangodump_](../arangodump/_index.md) +instead. diff --git a/site/content/arangodb/oem/components/tools/arangoexport/examples.md b/site/content/arangodb/oem/components/tools/arangoexport/examples.md new file mode 100644 index 0000000000..eed1adfb70 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoexport/examples.md @@ -0,0 +1,233 @@ +--- +title: _arangoexport_ Examples +menuTitle: Examples +weight: 5 +description: '' +--- +_arangoexport_ can be invoked by executing the following command in a command line: + +``` +arangoexport --collection test --output-directory "dump" +``` + +This exports the `test` collection into the `dump` directory. Every line of the +output is a JSON object that corresponds to one document from the collection, +without a specific order. + +To export more than one collection at a time specify multiple `--collection` options. + +The default output directory is `export`. + +By default, _arangoexport_ connects to the `_system` database using the default +endpoint. If you want to connect to a different database or a different endpoint, +or use authentication, you can use the following command-line options: + +- `--server.database <string>`: the name of the database to connect to +- `--server.endpoint <string>`: the endpoint to connect to +- `--server.username <string>`: the username +- `--server.password <string>`: the password to use (omit this to get prompted + for the password) +- `--server.authentication <bool>`: whether or not to use authentication + +Here is an example of exporting data from a non-standard endpoint, using a dedicated +[database name](../../../concepts/data-structure/databases.md#database-names): + +```bash +arangoexport \ + --server.endpoint tcp://192.168.173.13:8531 \ + --server.username backup \ + --server.database mydb \ + --collection test \ + --output-directory "my-export" +``` + +When _arangoexport_ has finished, it prints out a summary line with some aggregate +statistics about what it did, for example: + +``` +Processed 2 collection(s), wrote 9031763 Byte(s), 78 HTTP request(s) +``` + +## Export JSONL + +``` +arangoexport --type jsonl --collection test +``` + +This exports the `test` collection into the `export` output directory as [JSONL](http://jsonlines.org). +Every line in the export is one document from the `test` collection as a JSON object. + +## Export JSON + +``` +arangoexport --type json --collection test +``` + +This exports the `test` collection into the `export` output directory as one JSON array. +Every array entry is one document from the `test` collection as a JSON object. + +## Export CSV + +``` +arangoexport --type csv --collection test --fields _key,_id,_rev +``` + +This exports the `test` collection into the `export` output directory as CSV. The first +line contains the header with all field names. Each line is one document represented as +CSV and separated with a comma. Objects and arrays are represented as a JSON string. + +Starting with ArangoDB version 3.8.5, string values in the CSV output are enclosed in +double quotes. If any string value starts with one of the following characters: `+`, `=`, `@`, `-`, +it is treated as a potential formula and is prefixed by an extra single quote. +This is done to prevent formula injection attacks in spreadsheet programs such as Microsoft Excel or +LibreOffice Calc. If you don't want to use this functionality, you can turn it off via +the `--escape-csv-formulae` option. + +## Export XML + +``` +arangoexport --type xml --collection test +``` + +This exports the `test` collection into the `export` output directory as generic XML. +The root element of the generated XML file is named `collection`. +Each document in the collection is exported in a `doc` XML attribute. +Each document attribute is exported as a generic `att` element, which has a +`name` attribute with the attribute name, a `type` attribute indicating the +attribute value type, and a `value` attribute containing the attribute's value. + +## Export XGMML + +[XGMML](https://en.wikipedia.org/wiki/XGMML) is an XML application +based on [GML](https://en.wikipedia.org/wiki/Graph_Modelling_Language). +To view the XGMML file you can use for example [Cytoscape](http://cytoscape.org). + +{{< warning >}} +If you export all attributes (`--xgmml-label-only false`), attribute +types have to be the same for all documents. For example, if you have an +attribute named `rank`, which is a string in one document and an integer in another, +it does not work. + +Incorrect: + +```js +{ "rank": 1 } // doc1 +{ "rank": "2" } // doc2 +``` + +Correct: + +```js +{ "rank": 1 } // doc1 +{ "rank": 2 } // doc2 +``` +{{< /warning >}} + +**XGMML-specific options** + +- `--xgmml-label-attribute`: specifies the name of the attribute that becomes the + label in the XGMML file. + +- `--xgmml-label-only`: set to `true`, only export the label without any + attributes in edges or nodes. + +**Export based on collections** + +```bash +arangoexport \ + --type xgmml \ + --graph-name mygraph \ + --collection vertex \ + --collection edge +``` + +This exports an unnamed graph with the vertex collection named `vertex` and the edge collection +named `edge` into the `mygraph.xgmml` XGMML file. + +**Export based on a named graph** + +``` +arangoexport --type xgmml --graph-name mygraph +``` + +This exports the named graph `mygraph` into the `mygraph.xgmml` XGMML file. + +**Export XGMML without attributes** + +``` +arangoexport --type xgmml --graph-name mygraph --xgmml-label-only true +``` + +This exports the named graph mygraph into the `mygraph.xgmml` XGMML file without the `<att>` tag in nodes and edges. + +**Export XGMML with a specific label** + +``` +arangoexport --type xgmml --graph-name mygraph --xgmml-label-attribute name +``` + +This exports the named graph mygraph into the `mygraph.xgmml` XGMML file with a +label from documents attribute `name` instead of the default attribute `label`. + +## Export via AQL query + +Exporting via an AQL query allows you to export the returned data as the type +specified with `--type`. + +The example exports all books as JSONL that are sold more than 100 times: + +```bash +arangoexport \ + --type jsonl \ + --custom-query "FOR book IN books FILTER book.sold > 100 RETURN book" +``` + +For CSV exports, a `--fields` list is required. You can use an AQL query to produce +these fields. For example, you can de-normalize document structures like arrays and +nested objects to a tabular form as demonstrated below: + +```bash +arangoexport \ + --type csv \ + --fields title,category1,category2 \ + --custom-query "FOR book IN books RETURN { title: book.title, category1: book.categories[0], category2: book.categories[1] }" +``` + +The `--custom-query-bindvars` option lets you set bind variables that you can +use in the `--custom-query` option: + +```bash +arangoexport \ + --type jsonl \ + --custom-query 'FOR book IN @@@@collectionName FILTER book.sold > @@sold RETURN book' \ + --custom-query-bindvars '{"@@collectionName": "books", "sold": 100}' +``` + +Note that you need to escape at signs in command-lines by doubling them (see +[Environment variables as parameters](../../../operations/administration/configuration.md#environment-variables-as-parameters)). + +You can save a query to a file and use it as a custom query with the +`--custom-query-file` option. It is mutually exclusive with the `--custom-query` +option: + +```aql +// example.aql +FOR book IN @@collectionName + FILTER book.sold > @sold + RETURN book +``` + +``` +arangoexport --custom-query-file example.aql +``` + +You can optionally limit the query runtime via the `--custom-query-max-runtime` +option. Specify the maximum query runtime in seconds. Set it to `0` for no limit, +to override the default `--query.max-runtime` of the server (if set). + +```bash +arangoexport \ + --type jsonl \ + --custom-query-max-runtime 10 \ + --custom-query "FOR book IN books FILTER book.sold > 100 RETURN book" +``` diff --git a/site/content/arangodb/oem/components/tools/arangoexport/options.md b/site/content/arangodb/oem/components/tools/arangoexport/options.md new file mode 100644 index 0000000000..e351e02357 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoexport/options.md @@ -0,0 +1,12 @@ +--- +title: _arangoexport_ Options +menuTitle: Options +weight: 10 +description: >- + The startup options of the `arangoexport` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangoexport [<options>]` + +{{% program-options name="arangoexport" %}} diff --git a/site/content/arangodb/oem/components/tools/arangoimport/_index.md b/site/content/arangodb/oem/components/tools/arangoimport/_index.md new file mode 100644 index 0000000000..267243a33e --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoimport/_index.md @@ -0,0 +1,13 @@ +--- +title: _arangoimport_ +menuTitle: arangoimport +weight: 30 +description: >- + `arangoimport` is a command-line client tool to import data in JSON, CSV, and + TSV format +--- +_arangoimport_ can import supported text formats to +[ArangoDB servers](../../arangodb-server/_index.md). + +If you want to restore backups, see [_arangorestore_](../arangorestore/_index.md) +instead. diff --git a/site/content/arangodb/oem/components/tools/arangoimport/details.md b/site/content/arangodb/oem/components/tools/arangoimport/details.md new file mode 100644 index 0000000000..0b296eba91 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoimport/details.md @@ -0,0 +1,197 @@ +--- +title: _arangoimport_ Details +menuTitle: Details +weight: 15 +description: >- + The most convenient method to import a lot of data into ArangoDB is to use the arangoimport command-line tool +--- +The most convenient method to import a lot of data into ArangoDB is to use the +_arangoimport_ command-line tool. It allows you to bulk import data records +from a file into a database collection. Multiple files can be imported into +the same or different collections by invoking it multiple times. + +{{< tip >}} +Import files are expected to be UTF-8 encoded **without** +[byte order mark (BOM)](https://en.wikipedia.org/wiki/Byte_order_mark). +Other encodings are not supported, but may not raise warnings or errors. + +In case of CSV/TSV files, BOMs become part of the first column's name +(possibly mangled), so be sure the files have none. +{{< /tip >}} + +## Importing into an Edge Collection + +_arangoimport_ can also be used to import data into an existing edge collection. +The import data must, for each edge to import, contain at least the `_from` and +`_to` attributes. These indicate which other two documents the edge should connect. +It is necessary that these attributes are set for all records, and point to +valid document IDs in existing collections. + +*Example* + +```js +{ "_from" : "users/1234", "_to" : "users/4321", "desc" : "1234 is connected to 4321" } +``` + +**Note**: The edge collection must already exist when the import is started. Using +the `--create-collection` flag does not work because arangoimport always tries to +create a regular document collection if the target collection does not exist. + +## Attribute Naming and Special Attributes + +Attributes whose names start with an underscore are treated in a special way by +ArangoDB: + +- the optional `_key` attribute contains the document's key. If specified, the value + must be formally valid (e.g. must be a string and conform to the naming restrictions + described in [Document keys](../../../concepts/data-structure/documents/_index.md#document-keys)). + Additionally, the key value must be unique within the + collection the import is run for. +- `_from`: when importing into an edge collection, this attribute contains the id + of one of the documents connected by the edge. The value of `_from` must be a + syntactically valid document id and the referred collection must exist. +- `_to`: when importing into an edge collection, this attribute contains the id + of the other document connected by the edge. The value of `_to` must be a + syntactically valid document id and the referred collection must exist. +- `_rev`: this attribute contains the revision number of a document. However, the + revision numbers are managed by ArangoDB and cannot be specified on import. Thus + any value in this attribute is ignored on import. + +If you import values into `_key`, you should make sure they are valid and unique. + +When importing data into an edge collection, you should make sure that all import +documents can `_from` and `_to` and that their values point to existing documents. + +To avoid specifying complete document ids (consisting of collection names and document +keys) for `_from` and `_to` values, there are the options `--from-collection-prefix` and +`--to-collection-prefix`. If specified, these values are automatically prepended +to each value in `_from` (or `_to` resp.). This allows specifying only document keys +inside `_from` and/or `_to`. + +*Example* + +``` +arangoimport --from-collection-prefix users --to-collection-prefix products ... +``` + +Importing the following document creates an edge between `users/1234` and +`products/4321`: + +```js +{ "_from" : "1234", "_to" : "4321", "desc" : "users/1234 is connected to products/4321" } +``` + +## Updating existing documents + +By default, arangoimport tries to insert all documents from the import file into the +specified collection. In case the import file contains documents that are already present +in the target collection (matching is done via the `_key` attributes), then a default +arangoimport run does not import these documents and complain about unique key constraint +violations. + +However, arangoimport can be used to update or replace existing documents in case they +already exist in the target collection. It provides the command-line option `--on-duplicate` +to control the behavior in case a document is already present in the database. + +The default value of `--on-duplicate` is `error`. This means that when the import file +contains a document that is present in the target collection already, then trying to +re-insert a document with the same `_key` value is considered an error, and the document in +the database is not modified. + +Other possible values for `--on-duplicate` are: + +- `update`: each document present in the import file that is also present in the target + collection already is updated by arangoimport. `update` performs a partial update + of the existing document, modifying only the attributes that are present in the import + file and leaving all other attributes untouched. + + The values of system attributes `_id`, `_key`, and `_rev` cannot be + updated or replaced in existing documents. + +- `replace`: each document present in the import file that is already present in the + target collection is replaced by arangoimport. `replace` replaces the existing + document entirely, resulting in a document with only the attributes specified in the import + file. + + The values of system attributes `_id`, `_key`, and `_rev` cannot be + updated or replaced in existing documents. + +- `ignore`: each document present in the import file that is also present in the target + collection already is ignored and not modified in the target collection. + +When `--on-duplicate` is set to either `update` or `replace`, arangoimport returns the +number of documents updated/replaced in the `updated` return value. When set to another +value, the value of `updated` is always zero. When `--on-duplicate` is set to `ignore`, +arangoimport returns the number of ignored documents in the `ignored` return value. +When set to another value, `ignored` is always zero. + +It is possible to perform a combination of inserts and updates/replaces with a single +arangoimport run. When `--on-duplicate` is set to `update` or `replace`, all documents present +in the import file are inserted into the target collection provided they are valid +and do not already exist with the specified `_key`. Documents that are already present +in the target collection (identified by `_key` attribute) are instead updated/replaced. + +## Result output + +An _arangoimport_ import run prints out the final results on the command line. +It shows the + +- number of documents created (`created`) +- number of documents updated/replaced (`updated/replaced`, only non-zero if + `--on-duplicate` was set to `update` or `replace`, see below) +- number of warnings or errors that occurred on the server side (`warnings/errors`) +- number of ignored documents (only non-zero if `--on-duplicate` was set to `ignore`). + +*Example* + +```bash +created: 2 +warnings/errors: 0 +updated/replaced: 0 +ignored: 0 +``` + +For CSV and TSV imports, the total number of input file lines read is also printed +(`lines read`). + +_arangoimport_ also prints out details about warnings and errors that happened on the +server-side (if any). + +## Automatic pacing with busy or low throughput disk subsystems + +_arangoimport_ has an optional automatic pacing algorithm that can limit +how fast data is sent to the ArangoDB servers. This pacing algorithm +exists to prevent the import operation from failing due to slow responses. + +Google Cloud and other VM providers limit the throughput of disk +devices. Similarly, other users' processes on the shared VMs can limit +the available throughput of the disk devices. + +The automatic pacing algorithm adjusts the transmit block size dynamically +based upon the actual throughput of the server over the last few seconds. +Automatic pacing intentionally may not use the full throughput of a +disk device. An unlimited (really fast) disk device might not need +pacing. Raising the number of threads via the `--threads X` command +line to any value of `X` greater than 2 increases the total +throughput used. + +{{< warning >}} +Using parallelism with the `--threads X` parameter +together with the `--on-duplicate` parameter set to `ignore`, `update` or `replace` can +lead to a race condition, when there are duplicates e.g. multiple identical `_key` +values. Even ignoring the duplicates makes the result unpredictable, meaning +it is not possible to predict which versions of the documents are inserted. +{{< /warning >}} + +Automatic pacing frees the user from adjusting the throughput used to +match available resources. It is disabled by default, and can be enabled +by invoking arangoimport with the `--auto-rate-limit true` parameter. + +When enabling the pacing, the initial chunk size is 8MB per second. This +may be too high or too low, depending on the available disk throughput of +the target system. To start off with a different chunk size, one can +adjust the value of the `--batch-size` parameter. + +{{< tip >}} +The pacing algorithm is disabled by default. +{{< /tip >}} diff --git a/site/content/arangodb/oem/components/tools/arangoimport/examples-csv.md b/site/content/arangodb/oem/components/tools/arangoimport/examples-csv.md new file mode 100644 index 0000000000..159fef0605 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoimport/examples-csv.md @@ -0,0 +1,335 @@ +--- +title: _arangoimport_ Examples CSV / TSV +menuTitle: Examples CSV +weight: 10 +description: '' +--- +## Importing CSV Data + +_arangoimport_ offers the possibility to import data from CSV files. This +comes handy when the data at hand is in CSV format already and you don't want to +spend time converting them to JSON for the import. + +To import data from a CSV file, make sure your file contains the attribute names +in the first row. All the following lines in the file are interpreted as +data records and are imported. + +The CSV import requires the data to have a homogeneous structure. All records +must have exactly the same amount of columns as there are headers. By default, +lines with a different number of values are not imported and you get warnings +about them. To still import lines with less values than in the header, +there is the `--ignore-missing` option. If set to `true`, lines that have a +different amount of fields are imported. In this case, only those attributes +are populated for which there are values. Attributes for which there are +no values present are silently discarded. + +Example: + +``` +"first","last","age","active","dob" +"John","Connor",25,true +"Jim","O'Brady" +``` + +With `--ignore-missing` this produces the following documents: + +```js +{ "first" : "John", "last" : "Connor", "active" : true, "age" : 25 } +{ "first" : "Jim", "last" : "O'Brady" } +``` + +The cell values can have different data types though. If a cell does not have +any value, it can be left empty in the file. These values are not imported, +omitting the attributes in the created document. Values enclosed in +quotes are imported as strings, so to import numeric values, boolean values, +or the `null` value, don't enclose the value in quotes in your file. + +We use the following import for the CSV import: + +``` +"first","last","age","active","dob" +"John","Connor",25,true, +"Jim","O'Brady",19,, +"Lisa","Jones",,,"1981-04-09" +Hans,dos Santos,0123,, +Wayne,Brewer,null,false, +``` + +The command line to execute the import is: + +``` +arangoimport --file "data.csv" --type csv --collection "users" +``` + +The above data is imported into 5 documents which look as follows: + +```js +{ "first" : "John", "last" : "Connor", "active" : true, "age" : 25 } +{ "first" : "Jim", "last" : "O'Brady", "age" : 19 } +{ "first" : "Lisa", "last" : "Jones", "dob" : "1981-04-09" } +{ "first" : "Hans", "last" : "dos Santos", "age" : 123 } +{ "first" : "Wayne", "last" : "Brewer", "active" : false } +``` + +As you can see, values left completely empty in the input file are treated +as absent. This is also true for unquoted `null` literals. + +The literals `true` and `false` are treated as booleans if they are not +enclosed in quotes. + +Numeric values not enclosed in quotes are treated as numbers. +Note that leading zeros in numeric values are removed. To import numbers +with leading zeros, please use strings (e.g. `"012"` instead of `012` or +[override the datatype](#overriding-data-types-per-attribute)). + +You can set `--convert` to `false` if you want to treat all unquoted literals +and numbers as strings instead. `--convert` is enabled by default. + +Other values not enclosed in quotes are treated as strings. Any values +enclosed in quotes are treated as strings, too. + +String values containing the quote character or the separator must be enclosed +with quote characters. Within a string, the quote character itself must be +escaped with another quote character (or with a backslash if the +`--backslash-escape` option is used). + +Note that the quote and separator characters can be adjusted via the +`--quote` and `--separator` arguments when invoking _arangoimport_. The quote +character defaults to the double quote mark (`"`). To use a literal quote in a +string, you can use two quote characters (`""`). +To use backslash for escaping quote characters (`\"`), please set the option +`--backslash-escape` to `true`. + +The importer supports Windows (CRLF) and Unix (LF) line breaks. Line breaks might +also occur inside values that are enclosed with the quote character. + +Here is an example for using literal quotes and newlines inside values: + +``` +"name","password" +"Foo","r4ndom""123!" +"Bar","wow! +this is a +multine password!" +"Bartholomew ""Bart"" Simpson","Milhouse" +``` + +Extra whitespace at the end of each line is ignored. Whitespace at the +start of lines or between field values is not ignored, so please make sure +that there is no extra whitespace in front of values or between them. + +## Attribute Name Translation + +For the CSV and TSV input formats, attribute names can be translated automatically. +This is useful in case the import file has different attribute names than those +that should be used in ArangoDB. + +A common use case is to rename an `id` column from the input file into `_key` as +it is expected by ArangoDB. To do this, specify the following translation when +invoking arangoimport: + +``` +arangoimport --file "data.csv" --type csv --translate "id=_key" +``` + +Other common cases are to rename columns in the input file to `_from` and `_to`: + +``` +arangoimport --file "data.csv" --type csv --translate "from=_from" --translate "to=_to" +``` + +The `--translate` option can be specified multiple times. The source attribute name +and the target attribute must be separated with a `=`. + +## Ignoring Attributes + +For the CSV and TSV input formats, certain attribute names can be ignored on +imports. In an ArangoDB cluster there are cases where this can come in handy, +when your documents already contain a `_key` attribute and your collection has +a sharding attribute other than `_key`: In the cluster this configuration is +not supported, because ArangoDB needs to guarantee the uniqueness of the `_key` +attribute in **all** shards of the collection. + +``` +arangoimport --file "data.csv" --type csv --remove-attribute "_key" +``` + +The same thing would apply if your data contains an `_id` attribute: + +``` +arangoimport --file "data.csv" --type csv --remove-attribute "_id" +``` + +## Overriding data types per attribute + +<small>Introduced in: v3.9.0</small> + +The `--datatype` startup option can be used to fix +the datatypes for certain attributes in CSV/TSV imports. For example, in the +following CSV input file, it is unclear if the numeric values should be +imported as numbers or as stringified numbers for the individual attributes: + +``` +key,price,weight,fk +123456,200,5,585852 +864924,120,10,9998242 +9949,70,11.5,499494 +6939926,2130,5,96962612 +``` + +To determine the datatypes for the individual columns, _arangoimport_ can be +invoked with the `--datatype` startup option, once for each attribute: + +``` +--datatype key=string +--datatype price=number +--datatype weight=number +--datatype fk=string +``` + +This turns the numeric-looking values in the `key` attribute into strings +but treats the attributes `price` and `weight` as numbers. Finally, the values in +attribute `fk` are treated as strings again. + +The possible values for `--datatype` are: +- `null`: unconditionally treats all input values as `null`, effectively + ignoring the column (similar to `--remove-attribute`) because `null` values + are dropped +- `boolean`: interprets the input values `false`, `null` and `0` (quoted or + unquoted) as the boolean value `false`, and everything else as the boolean + value `true`. +- `number`: converts input values that look like numbers to numbers, including + numbers wrapped in quote marks (`--quote`), and treats everything else as the + number `0`. +- `string`: treats the input value as a string + +If `--datatype` is used for an attribute, it takes precedence over `--convert` +and the automatic conversions applied by the latter. If you want to import +most fields as strings, then you can use `--convert false` and only override +the datatype for non-string fields with `--datatype`: + +``` +--convert false +--datatype price=number +--datatype weight=number +``` + +## Merging Attributes + +<small>Introduced in: v3.9.0</small> + +_arangoimport_ supports creating additional attributes during the import +process, which are concatenations of other attribute values and hard-coded +string literals/separators. + +Such attributes can be added in CSV/TSV imports by specifying the option +`--merge-attributes` for each new attribute. + +The following example adds a new attribute named `fullName` that consists +of the values of the `firstName` and `lastName` columns, separated by a colon +character `:`: + +``` +arangoimport --merge-attributes fullName=[firstName]:[lastName] +``` + +When referring to existing attribute names from the input data, the referred-to +names need to be enclosed in square brackets (`[` and `]`). Any characters +outside the brackets are interpreted as literals, and are added to the +new attribute as-is. + +If an attribute name that is enclosed in brackets does not exist in the input +data, then the import emits a warning message and continues. Non-existing +attributes are replaced with an empty string in the resulting value. + +The `--merge-attribute` option does not support using the brackets (`[` or `]`) +or the equal sign (`=`) in any of the literals, or inside an attribute reference. +Attribute references with empty attribute names (e.g. `[]`) are disallowed too. + +`--merge-attributes` can be specified multiple times to create independent +additional fields: + +``` +arangoimport \ + --merge-attributes fullName=[firstName]:[lastName] \ + --merge-attributes dateOfBirth=[month]-[day]-[year] \ + ... +``` + +Later merge attributes can build on former merge attributes +(in left-to-right order), e.g. + +``` +arangoimport \ + --merge-attributes ids=[id1]-[id2] \ + --merge-attributes nameAndIds=[name]-[ids] \ + ... +``` + +Note that when the `--translate` option is also used, the referred-to attribute +names for `--merge-attributes` must be the ones before translation, e.g. + +``` +arangoimport --translate _key=id --merge-attributes idAndName=[id]:[lastName] +``` + +`--merge-attributes` is currently supported for CSV/TSV input files only. + +## Importing TSV Data + +You may also import tab-separated values (TSV) from a file. This format is very +simple: every line in the file represents a data record. There is no quoting or +escaping. That also means that the separator character (which defaults to the +tabstop symbol) must not be used anywhere in the actual data. + +As with CSV, the first line in the TSV file must contain the attribute names, +and all lines must have an identical number of values. + +If a different separator character or string should be used, it can be specified +with the `--separator` argument. + +An example command line to execute the TSV import is: + +``` +arangoimport --file "data.tsv" --type tsv --collection "users" +``` + +## Reading compressed input files + +_arangoimport_ can transparently process gzip-compressed input files +if they have a ".gz" file extension, e.g. + +``` +arangoimport --file data.csv.gz --type csv --collection "users" +``` + +For other input formats it is possible to decompress the input file using another +program and piping its output into arangoimport, e.g. + +``` +bzcat users.csv.bz2 | arangoimport --file "-" --type csv --collection "users" +``` + +This example requires that a `bzcat` utility for decompressing bzip2-compressed +files is available, and that the shell supports pipes. + +## Reading headers from a separate file + +For the CSV and TSV input formats it is sometimes required to read raw data +files that do not contain a first line with all attributes names. + +For these cases, _arangoimport_ supports a `--headers-file` option to specify +a separate input file just for the header line with all the attribute names. +The contents of this file are interpreted as CSV/TSV line with attribute +names, and the contents of the regular input file (`--file`) are +interpreted as the data to import, without any attribute names. + +The `--headers-option` can be used as follows: + +``` +arangoimport --file "data.csv" --type csv --headers-file "headers.csv" +``` + +If the option is used, it is necessary that the file specified via +`--headers-file` contains one line with the attribute names in CSV/TSV format +(taking into account `--backslash-escape`, `--quote` and `--separator`). diff --git a/site/content/arangodb/oem/components/tools/arangoimport/examples-json.md b/site/content/arangodb/oem/components/tools/arangoimport/examples-json.md new file mode 100644 index 0000000000..08a2de1a87 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoimport/examples-json.md @@ -0,0 +1,272 @@ +--- +title: _arangoimport_ Examples JSON +menuTitle: Examples JSON +weight: 5 +description: '' +--- +Using JSON as data format, records are represented as JSON objects and called +documents in ArangoDB. They are self-contained. Therefore, there is no need +for all records in a collection to have the same attribute names or types. +Documents can be inhomogeneous while data types can be fully preserved. + +## Input file formats + +_arangoimport_ supports two formats when importing JSON data: + +- [JSON](http://json.org/) – JavaScript Object Notation +- [JSON Lines](http://jsonlines.org/) – + also known as _JSONL_ or new-line delimited JSON + +For any larger input files, it is recommended to use the JSON Lines format. + +Multiple documents can be stored in standard JSON format in a top-level array +with objects as members: + +```js +[ + { "_key": "one", "value": 1 }, + { "_key": "two", "value": 2 }, + { "_key": "foo", "value": "bar" }, + ... +] +``` + +This format allows line breaks for formatting (i.e. pretty printing): + +```js +[ + { + "_key": "one", + "value": 1 + }, + { + "_key": "two", + "value": 2 + }, + { + "_key": "foo", + "value": "bar" + }, + ... +] +``` + +It requires parsers to read the entire input in order to verify that the +array is properly closed at the very end. _arangoimport_ needs to read +the whole input before it can send the first batch to the server. +By default, it allows importing such files up to a size of about 16 MB. +If you want to allow your _arangoimport_ instance to use more memory, increase +the maximum file size by specifying the command-line option `--batch-size`. +For example, to set the batch size to 32 MB, use the following command: + +``` +arangoimport --file "data.json" --type json --collection "users" --batch-size 33554432 +``` + +_JSON Lines_ formatted data allows processing each line individually: + +```js +{ "_key": "one", "value": 1 } +{ "_key": "two", "value": 2 } +{ "_key": "foo", "value": "bar" } +... +``` + +The above format can be imported sequentially by _arangoimport_. It reads +data from the input in chunks and sends it in batches to the server. Each batch +is about as big as specified in the command-line parameter `--batch-size`. + +Please note that you may still need to increase the value of `--batch-size` if a +single document inside the input file is bigger than the value of `--batch-size`. + +_JSON Lines_ does not allow line breaks for pretty printing. There has to be one +complete JSON object on each line. A JSON array or primitive value per line is +not supported by _arangoimport_ in contrast to the JSON Lines specification, +which allows any valid JSON value on a line. + +## Converting JSON to JSON Lines + +An input with JSON objects in an array, optionally pretty printed, can be +easily converted into JSONL with one JSON object per line using the +[**jq** command line tool](http://stedolan.github.io/jq/): + +``` +jq -c ".[]" inputFile.json > outputFile.jsonl +``` + +The `-c` option enables compact JSON (as opposed to pretty printed JSON). +`".[]"` is a filter that unpacks the top-level array and effectively puts each +object in that array on a separate line in combination with the compact option. + +jq needs to create an internal representation of the entire input first however, +making this method unsuitable for large JSON source files. jq v1.5 added +support for a streaming mode that can perform the conversion on the fly with +minimal memory usage: + +``` +jq -cn --stream "fromstream(1|truncate_stream(inputs))" inputFile.json > outputFile.jsonl +``` + +An example `inputFile.json` can look like this: + +```json +[ + { + "isActive": true, + "name": "Evans Wheeler", + "latitude": -0.119406, + "longitude": 146.271888, + "tags": [ + "amet", + "qui", + "velit" + ] + }, + { + "isActive": true, + "name": "Coffey Barron", + "latitude": -37.78772, + "longitude": 131.218935, + "tags": [ + "dolore", + "exercitation", + "irure", + "velit" + ] + } +] +``` + +The conversion produces the following `outputFile.jsonl`: + +```json +{"isActive":true,"name":"Evans Wheeler","latitude":-0.119406,"longitude":146.271888,"tags":["amet","qui","velit"]} +{"isActive":true,"name":"Coffey Barron","latitude":-37.78772,"longitude":131.218935,"tags":["dolore","exercitation","irure","velit"]} +``` + +## Reading compressed input files + +_arangoimport_ can transparently process gzip-compressed input files +if they have a ".gz" file extension, e.g. + +``` +arangoimport --file "users.jsonl.gz" --type jsonl --collection "users" +``` + +For other input formats it is possible to decompress the input file using another +program and piping its output into arangoimport, e.g. + +``` +bzcat data.bz2 | arangoimport --file "-" --type jsonl --collection "users" +``` + +This example requires that a `bzcat` utility for decompressing bzip2-compressed +files is available, and that the shell supports pipes. + +## Import Example and Common Options + +We use these example user records to import: + +```js +{ "name" : { "first" : "John", "last" : "Connor" }, "active" : true, "age" : 25, "likes" : [ "swimming"] } +{ "name" : { "first" : "Jim", "last" : "O'Brady" }, "age" : 19, "likes" : [ "hiking", "singing" ] } +{ "name" : { "first" : "Lisa", "last" : "Jones" }, "dob" : "1981-04-09", "likes" : [ "running" ] } +``` + +To import these records, all you need to do is to put them into a file +(with one line for each record to import), save it as `data.jsonl` and run +the following command: + +``` +arangoimport --file "data.jsonl" --type jsonl --collection users +``` + +This transfers the data to the server, imports the records, and prints a +status summary. + +To show the intermediate progress during the import process, the +option `--progress` can be added. This option shows the percentage of the +input file that has been sent to the server. This is only useful for big +import files. + +``` +arangoimport --file "data.jsonl" --type jsonl --collection users --progress true +``` + +It is also possible to use the output of another command as an input for +_arangoimport_. For example, you can use the following shell command to pipe +data from the `cat` process to arangoimport (in a Bash-like shell): + +``` +cat data.json | arangoimport --file - --type jsonl --collection users +``` + +In a command line or PowerShell on Windows, there is the `type` command: + +``` +type data.json | arangoimport --file - --type jsonl --collection users +``` + +The option `--file -` with a hyphen as the file name is special and makes it +read from the standard input. No progress can be reported for such imports as the +size of the input is unknown to arangoimport. + +By default, the endpoint `tcp://127.0.0.1:8529` is used. If you want to +specify a different endpoint, you can use the `--server.endpoint` option. You +probably want to specify a database user and password as well. You can do so by +using the options `--server.username` and `--server.password`. If you do not +specify a password, you are prompted for one. + +``` +arangoimport --server.endpoint tcp://127.0.0.1:8529 --server.username root ... +``` + +Note that the collection (`users` in this case) must already exist or the import +fails. If you want to create a new collection with the import data, you need +to specify the `--create-collection` option. It creates a document collection +by default and not an edge collection. + +``` +arangoimport --file "data.jsonl" --type jsonl --collection users --create-collection true +``` + +To create an edge collection instead, use the `--create-collection-type` option +and set it to `edge`: + +``` +arangoimport --collection myedges --create-collection true --create-collection-type edge ... +``` + +When importing data into an existing collection it is often convenient to first +remove all data from the collection and then start the import. This can be achieved +by passing the `--overwrite` parameter to _arangoimport_. If it is set to `true`, +any existing data in the collection is removed prior to the import. Note +that any existing index definitions for the collection are preserved even if +`--overwrite` is set to `true`. + +``` +arangoimport --file "data.jsonl" --type jsonl --collection users --overwrite true +``` + +Data gets imported into the specified collection in the default database +(`_system`). To specify a different database, use the `--server.database` +option when invoking _arangoimport_. If you want to import into a nonexistent +database you need to pass `--create-database true` to create it on-the-fly. + +The tool also supports parallel imports, with multiple threads. Using multiple +threads may provide a speedup, especially when using the RocksDB storage engine. +To specify the number of parallel threads use the `--threads` option: + +``` +arangoimport --threads 4 --file "data.jsonl" --type jsonl --collection users +``` + +Using multiple threads may lead to a non-sequential import of the input +data. Data that appears later in the input file may be imported earlier than data +that appears earlier in the input file. This is normally not a problem but may cause +issues when when there are data dependencies or duplicates in the import data. In +this case, the number of threads should be set to 1. Also, using parallelism with +the `--threads X` parameter together with the `--on-duplicate` parameter set to `ignore`, +`update` or `replace` can lead to a race condition, when there are duplicates e.g. multiple +identical `_key` values. Even ignoring the duplicates makes the result unpredictable, meaning +it is not possible to predict which versions of the documents are inserted. diff --git a/site/content/arangodb/oem/components/tools/arangoimport/options.md b/site/content/arangodb/oem/components/tools/arangoimport/options.md new file mode 100644 index 0000000000..3ea912e172 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoimport/options.md @@ -0,0 +1,12 @@ +--- +title: _arangoimport_ Options +menuTitle: Options +weight: 20 +description: >- + The startup options of the `arangoimport` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangoimport [<options>]` + +{{% program-options name="arangoimport" %}} diff --git a/site/content/arangodb/oem/components/tools/arangoinspect/_index.md b/site/content/arangodb/oem/components/tools/arangoinspect/_index.md new file mode 100644 index 0000000000..87ae1c2722 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoinspect/_index.md @@ -0,0 +1,8 @@ +--- +title: _arangoinspect_ +menuTitle: arangoinspect +weight: 50 +description: >- + `arangoinspect` is a command-line client tool that collects information of any + ArangoDB server setup to facilitate troubleshooting for the Arango support +--- diff --git a/site/content/arangodb/oem/components/tools/arangoinspect/examples.md b/site/content/arangodb/oem/components/tools/arangoinspect/examples.md new file mode 100644 index 0000000000..bdfe955d5f --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoinspect/examples.md @@ -0,0 +1,122 @@ +--- +title: _arangoinspect_ Examples +menuTitle: Examples +weight: 5 +description: >- + How to use the `arangoinspect` tool to collection information for troubleshooting +--- +If you are asked by Arango support to provide an inspector output, run +the _arangoinspect_ binary to generate a file in the current working folder. + +The resulting JSON file is a collection of meta data acquired from all +involved instances. The data includes relevant operating system parameters, +ArangoDB process parameters, local database information etc. + +{{< warning >}} +Please open the file locally and check if it contains anything that you are +not allowed/willing to share and obfuscate it before sharing (user names, +files paths etc.). +{{< /warning >}} + +## Invoking *arangoinspect* + +Point the tool to an ArangoDB endpoint. In case of a single server, there +is only one. You can connect to any node in case of a cluster (_DB-Server_, +_Coordinator_, _Agent_). + +``` +arangoinspect --server.endpoint tcp://127.0.0.1:8529 +``` + +This starts the tool with a prompt for the JWT secret and tries to connect +to the specified ArangoDB server. You have to type the secret as is used for +the `arangod` option `--server.jwt-secret`. For non-cluster deployments, +you may authenticate with a user name and password instead: + +``` +arangoinspect --server.ask-jwt-secret false --server.username "root" --server.password "foobar" +``` + +The password can be omitted and entered interactively. + +## Example outputs + +If _arangoinspect_ succeeds to authenticate, it starts to gather information +and writes the result to `arangodb-inspector.json`, then exits: + +``` +arangoinspect --server.endpoint tcp://127.0.0.1:8629 + +Please specify the JWT secret: +Connected to ArangoDB 'http+tcp://127.0.0.1:8629' version: 3.4.devel [server], database: '_system', username: 'root' + + _ ___ _ + / \ _ __ __ _ _ __ __ _ ___ |_ _|_ __ ___ _ __ ___ ___| |_ ___ _ __ + / _ \ | '__/ _` | '_ \ / _` |/ _ \ | || '_ \/ __| '_ \ / _ \/ __| __/ _ \| '__| + / ___ \| | | (_| | | | | (_| | (_) | | || | | \__ \ |_) | __/ (__| || (_) | | +/_/ \_\_| \__,_|_| |_|\__, |\___/ |___|_| |_|___/ .__/ \___|\___|\__\___/|_| + |___/ |_| + +2018-06-05T19:40:10Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:4001', version 3.4.devel [server], database '_system', username: 'root' +2018-06-05T19:40:10Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:4001', version 3.4.devel [server], database '_system', username: 'root' +INFO changing endpoint for AGNT-01e83a4b-8a51-4919-9f50-ff640accb9fa from http+tcp://[::1]:4001 to tcp://[::1]:4001 +INFO changing endpoint for PRMR-9f5b337e-c1de-4b7d-986a-d6ad2eb8f857 from tcp://127.0.0.1:8629 to tcp://[::1]:8629 +INFO Analysing agency dump ... +INFO Plan (version 22) +INFO Databases +INFO _system +INFO Collections +INFO _system +INFO _graphs +INFO _users +INFO _modules +INFO _iresearch_analyzers +INFO _routing +INFO _aqlfunctions +INFO _frontend +INFO _queues +INFO _jobs +INFO _apps +INFO _appbundles +INFO _statisticsRaw +INFO _statistics +INFO _statistics15 +INFO Server health +INFO DB Servers +INFO PRMR-9f5b337e-c1de-4b7d-986a-d6ad2eb8f857(DBServer0001) +INFO PRMR-90ff8c20-b0f3-49c5-a5dd-7b186bb7db33(DBServer0002) +INFO Coordinators +INFO CRDN-0dbf16ec-8a06-4203-9359-447d97757b4e(Coordinator0001) +INFO Supervision activity +INFO Jobs: undefined(To do: 0, Pending: 0, Finished: 0, Failed: 0) +INFO Summary +INFO 1 databases +INFO 14 collections +INFO 14 shards +INFO ... agency analysis finished. +INFO Collecting diagnostics from all servers ... +2018-06-05T19:40:10Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:8629', version 3.4.devel [server], database '_system', username: 'root' +2018-06-05T19:40:11Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:4001', version 3.4.devel [server], database '_system', username: 'root' +2018-06-05T19:40:11Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:8630', version 3.4.devel [server], database '_system', username: 'root' +2018-06-05T19:40:11Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:8530', version 3.4.devel [server], database '_system', username: 'root' +2018-06-05T19:40:11Z [19858] INFO Connected to ArangoDB 'http+tcp://[::1]:4001', version 3.4.devel [server], database '_system', username: 'root' +INFO ... diagnostics collected. +INFO Report written to arango-inspector.json. +``` + +If _arangoinspect_ cannot connect or authentication/authorization fails, then a fatal error +is raised and the tool shuts down: + +``` +Could not connect to endpoint 'http+tcp://127.0.0.1:8529', database: '_system', username: 'root' +Error message: '401: Unauthorized' + + _ ___ _ + / \ _ __ __ _ _ __ __ _ ___ |_ _|_ __ ___ _ __ ___ ___| |_ ___ _ __ + / _ \ | '__/ _` | '_ \ / _` |/ _ \ | || '_ \/ __| '_ \ / _ \/ __| __/ _ \| '__| + / ___ \| | | (_| | | | | (_| | (_) | | || | | \__ \ |_) | __/ (__| || (_) | | +/_/ \_\_| \__,_|_| |_|\__, |\___/ |___|_| |_|___/ .__/ \___|\___|\__\___/|_| + |___/ |_| + +FATAL cannot connect to server 'http+tcp://127.0.0.1:8529': 401: Unauthorized +``` diff --git a/site/content/arangodb/oem/components/tools/arangoinspect/options.md b/site/content/arangodb/oem/components/tools/arangoinspect/options.md new file mode 100644 index 0000000000..b9fa0e6c1a --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangoinspect/options.md @@ -0,0 +1,12 @@ +--- +title: _arangoinspect_ Options +menuTitle: Options +weight: 10 +description: >- + The startup options of the `arangoinspect` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangoinspect [<options>]` + +{{% program-options name="arangoinspect" %}} diff --git a/site/content/arangodb/oem/components/tools/arangorestore/_index.md b/site/content/arangodb/oem/components/tools/arangorestore/_index.md new file mode 100644 index 0000000000..32310ca353 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangorestore/_index.md @@ -0,0 +1,17 @@ +--- +title: _arangorestore_ +menuTitle: arangorestore +weight: 20 +description: >- + `arangorestore` is a command-line client tool to restore backups to ArangoDB servers +--- +_arangorestore_ can restore dumps created by [_arangodump_](../arangodump/_index.md) +and is therefore its counterpart. + +If you want to import data in formats like JSON or CSV, see +[_arangoimport_](../arangoimport/_index.md) instead. + +_arangorestore_ can restore selected collections or all collections of a backup, +optionally including _system_ collections. One can restore the structure, i.e. +the collections with their configuration with or without data. +Views can also be dumped or restored (either all of them or selectively). diff --git a/site/content/arangodb/oem/components/tools/arangorestore/examples.md b/site/content/arangodb/oem/components/tools/arangorestore/examples.md new file mode 100644 index 0000000000..7a84b98ae6 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangorestore/examples.md @@ -0,0 +1,366 @@ +--- +title: _arangorestore_ Examples +menuTitle: Examples +weight: 5 +description: '' +--- +To restore data from a dump previously created with [_arangodump_](../arangodump/_index.md), +ArangoDB provides the _arangorestore_ tool. + +## Invoking *arangorestore* + +_arangorestore_ can be invoked from the command-line as follows: + +``` +arangorestore --input-directory "dump" +``` + +This connects to an ArangoDB server (`tcp://127.0.0.1:8529` by default), then restores the +collection structure and the documents from the files found in the input directory `dump`. +Note that the input directory must have been created by running `arangodump` before. + +_arangorestore_ connects to the `_system` database by default, using the default +endpoint. To override the endpoint, or specify a different user, use one of the +following startup options: + +- `--server.endpoint <string>`: endpoint to connect to +- `--server.username <string>`: username +- `--server.password <string>`: password to use + (omit this and you'll be prompted for the password) +- `--server.authentication <bool>`: whether or not to use authentication + +If you want to connect to a different database or dump all databases you can additionally +use the following startup options: + +- `--server.database <string>`: name of the database to connect to. + Defaults to the `_system` database. +- `--all-databases true`: restore multiple databases from a dump which used the same option. + +Note that the specified user must have access to the database(s). + +The _arangorestore_ tool provides the `--create-database` option. Setting this +option to `true` creates the target database if it does not exist. When creating the +target database, the username and passwords passed to _arangorestore_ (in options +`--server.username` and `--server.password`) are used to create an initial user for the +new database. + +The option `--force-same-database` allows restricting arangorestore operations to a +database with the same name as in the source dump's `dump.json` file. It can thus be used +to prevent restoring data into a "wrong" database by accident. + +For example, if a dump was taken from database ***A***, and the restore is attempted into +database ***B***, then with the `--force-same-database` option set to `true`, arangorestore +aborts instantly. + +The `--force-same-database` option is set to `false` by default to ensure backwards-compatibility. + +Here's an example of reloading data to a non-standard endpoint, using a dedicated +[database name](../../../concepts/data-structure/databases.md#database-names): + +``` +arangorestore \ + --server.endpoint tcp://192.168.173.13:8531 \ + --server.username backup \ + --server.database mydb \ + --input-directory "dump" \ +``` + +Also, more than one endpoint can be provided, such as: + +``` +arangorestore \ + --server.endpoint tcp://192.168.173.13:8531 \ + --server.endpoint tcp://192.168.173.13:8532 \ + --server.username backup \ + --server.database mydb \ + --input-directory "dump" +``` + +To create the target database when restoring, use a command like this: + +``` +arangorestore --server.username backup --server.database newdb --create-database true --input-directory "dump" +``` + +In contrast to the above calls, when working with multiple databases using `--all-databases true` +the parameter `--server.database mydb` must not be specified: + +``` +arangorestore --server.username backup --all-databases true --create-database true --input-directory "dump-multiple" +``` + +_arangorestore_ prints out its progress while running, and ends with a line +showing some aggregate statistics: + +``` +Processed 2 collection(s), read 2256 byte(s) from datafiles, sent 2 batch(es) +``` + +By default, _arangorestore_ re-creates all non-system collections found in the input +directory and loads data into them. If the target database already contains collections +which are also present in the input directory, the existing collections in the database +are dropped and re-created with the properties and data found in the input directory. + +The following parameters are available to adjust this behavior: + +- `--create-collection <bool>`: set to `true` to create collections in the target + database if they don't yet exist. If the target database already contains a + collection with the same name, then it is dropped and recreated with the + same properties as in the dump if the `overwrite` option is also set. + If the `overwrite` option is not set, an existing collection is used as is, + and its properties are not updated nor is its data discarded before restoring. + If `--create-collection` is set to `false`, then _arangorestore_ does not make any + attempts to create the collection or modify its properties. Data is restored + into the existing collections without wiping the collection beforehand. + If set to `false` and _arangorestore_ encounters a collection that is present in the + input directory but not in the target database, it aborts with a + "collection not found" error. + The default value for `--create-collection` is `true`. +- `--overwrite <bool>`: controls whether existing collections are dropped if + `--create-collection true` is used. The default value is `true`. +- `--import-data <bool>`: set to `true` to load document data into the collections in + the target database. Set to `false` to not load any document data. The default value + is `true`. +- `--include-system-collections <bool>`: whether or not to include system collections + when re-creating collections or reloading data. The default value is `false`. + +For example, to (re-)create all non-system collections and load document data into them, use: + +``` +arangorestore --create-collection true --import-data true --input-directory "dump" +``` + +This drops potentially existing collections in the target database that are also present +in the input directory. + +To include system collections too, use `--include-system-collections true`: + +``` +arangorestore --create-collection true --import-data true --include-system-collections true --input-directory "dump" +``` + +To (re-)create all non-system collections without loading document data, use: + +``` +arangorestore --create-collection true --import-data false --input-directory "dump" +``` + +This also drops existing collections in the target database that are also present in the +input directory. + +To just load document data into existing non-system collections, use: + +``` +arangorestore --create-collection false --import-data true --input-directory "dump" +``` + +To restrict reloading to just specific collections, use the `--collection` option. +It can be specified multiple times if required: + +``` +arangorestore --collection myusers --collection myvalues --input-directory "dump" +``` + +Collections are processed in alphabetical order by _arangorestore_, with all document +collections being processed before all [edge collections](../../../concepts/data-models.md#graph-model). +This remains valid also when multiple threads are in use. + +Note however that when restoring an edge collection no internal checks are made in order to validate that +the documents that the edges connect exist. As a consequence, when restoring individual collections +which are part of a graph you are not required to restore in a specific order. + +{{< warning >}} +When restoring only a subset of collections of your database, and graphs are in use, you need +to make sure that you restore all the needed collections (the ones that are part of the graph). +Otherwise, you might end up with edges pointing to non-existing documents. +{{< /warning >}} + +To restrict reloading to specific Views, there is the `--view` option. +Should you specify the `--collection` parameter, Views are not restored _unless_ you explicitly +specify them via the `--view` option. + +``` +arangorestore --collection myusers --view myview --input-directory "dump" +``` + +In the case of an `arangosearch` View, you must make sure that the linked collections are either +also restored or already present on the server. + +## Encryption + +See [_arangodump_](../arangodump/examples.md#encryption) for details. + +## Reloading Data into a different Collection + +_arangorestore_ restores documents and edges with the exact same `_key`, +`_from`, and `_to` values as found in the input directory. + +With some creativity you can also use _arangodump_ and _arangorestore_ to transfer data from one +collection into another (either on the same server or not). For example, to copy data from +a collection `myvalues` in database `mydb` into a collection `mycopyvalues` in database `mycopy`, +you can start with the following command: + +``` +arangodump --collection myvalues --server.database mydb --output-directory "dump" +``` + +This creates two files, `myvalues.structure.json` and `myvalues.data.json`, in the output +directory. To load data from the datafile into an existing collection `mycopyvalues` in database +`mycopy`, rename the files to `mycopyvalues.structure.json` and `mycopyvalues.data.json`. + +After that, run the following command: + +``` +arangorestore --collection mycopyvalues --server.database mycopy --input-directory "dump" +``` + +## Enabling revision trees for older dumps + +<small>Introduced in: v3.8.7, v3.9.2</small> + +Collections in ArangoDB 3.8 and later can use an internal format that is based +on revision trees for replication. Using this format has advantages over the +previous format, because changes to the collection on the leader can quickly be +detected when trying to get follower shards in sync. + +Dumps taken from older versions of ArangoDB, i.e. ArangoDB 3.7 or before, do not +contain any information about revision trees. +The _arangorestore_ behavior for these collections is as follows: + +- In ArangoDB versions before 3.8.7 and 3.9.2, the collections are + restored without revision trees. +- In ArangoDB versions 3.8.7, 3.9.2 or later, the + collections use revision trees by default, but you can opt out of this by + invoking arangorestore with the `--enable-revision-trees false` option. + +If the `--enable-revision-trees` startup option is `true` (which is the default value), +then _arangorestore_ adds the necessary attributes for using revision trees +when restoring the collections. It's only done for the attributes which are not +contained in the dump. If the option is set to `false`, _arangorestore_ does not +add the attributes when restoring collections. + +Regardless of the setting of this option, _arangorestore_ does not add the +attributes, when they are already present in the dump. You may modify the +attributes manually in the dump if you want to change their values. + +## Restoring in a Cluster + +To restore data into a Cluster, simply point _arangorestore_ to one of the +_Coordinators_ in your Cluster. + +If _arangorestore_ is asked to restore a collection, it uses the same +number of shards, replication factor, and shard keys as when the collection +was dumped. The distribution of the shards to the servers are also the +same as at the time of the dump, provided that the number of _DB-Servers_ in +the cluster dumped from is identical to the number of DB-Servers in the +to-be-restored-to cluster. + +To modify the number of _shards_ or the _replication factor_ for all or just +some collections, _arangorestore_ provides the options `--number-of-shards` +and `--replication-factor`. These options +can be specified multiple times as well, in order to override the settings +for dedicated collections, e.g. + +``` +arangorestore --number-of-shards 2 --number-of-shards mycollection=3 --number-of-shards test=4 +``` + +The above command restores all collections except "mycollection" and "test" with +2 shards. "mycollection" has 3 shards when restored, and "test" has 4. +It is possible to omit the default value and only use +collection-specific overrides. In this case, the number of shards for any +collections not overridden is determined by looking into the +`numberOfShards` values contained in the dump. + +The `--replication-factor` options works in the same way, e.g. + +``` +arangorestore --replication-factor 2 --replication-factor mycollection=1 +``` + +sets the replication factor to `2` for all collections but "mycollection", +which gets a replication factor of just `1`. + +{{< info >}} +The options `--number-of-shards` and `replication-factor`, as well as the deprecated +options `--default-number-of-shards` and `--default-replication-factor`, are +**not applicable to system collections**. They are managed by the server. +{{< /info >}} + +If a collection was dumped from a single instance and is then restored into +a cluster, the sharding is done by the `_key` attribute by default. You can +manually edit the structural description for the shard keys in the dump files if +required (`*.structure.json`). + +If you restore a collection that was dumped from a cluster into a single +ArangoDB instance, the number of shards, replication factor and shard keys are +silently ignored. + +### Factors affecting speed of arangorestore in a Cluster + +The following factors affect speed of _arangorestore_ in a Cluster: + +- **Replication Factor**: the higher the _replication factor_, the more + time the restore takes. To speed up the restore you can restore + using a _replication factor_ of `1` and then increase it again + after the restore. This reduces the number of network hops needed + during the restore. +- **Restore Parallelization**: if the collections are not restored in + parallel, the restore speed is highly affected. A parallel restore can + be done by using the `--threads` option of _arangorestore_. + Depending on your specific case, you might be able to achieve additional + parallelization by restoring on multiple _Coordinators_ at the same time. +- **Dump Format**: Since ArangoDB 3.8 arangodump can produce two different + dump formats: an enveloped format, which was the default format up to + including ArangoDB 3.8, and a non-envelop format, which is the default + since ArangoDB 3.9.0. + The enveloped format is downwards-compatible with all previous versions + of ArangoDB, and should only be used for dumps that need to be restored + into versions older than 3.9. The non-envelope format is only understood + since ArangoDB 3.8.0 and not compatible with previous versions. However, it + is smaller and slightly faster to produce. In addition, the non-envelope + format allows arangorestore to parallelize the restore operations not + only across collections but also within collections. The latter is not + possible with the envelope dump format. + In order to use the non-envelope dump format, invoke arangodump with the + option `--envelope false`. arangorestore can automatically parallelize + the restore of such dumps even for individual collections. + +### Restoring collections with sharding prototypes + +_arangorestore_ yields an error when you try to restore a collection whose shard +distribution follows a collection (`distributeShardsLike` property) which does not +exist in the cluster and which was not dumped together with the other collection: + +``` +arangorestore --collection clonedCollection --server.database mydb --input-directory "dump" + +WARNING [c6658] {restore} Error while creating document collection 'clonedCollection': got invalid response from server: HTTP 500: 'Collection not found: prototypeCollection in database _system' while executing restoring collection with this requestPayload: ... + +ERROR [cb69f] {restore} got invalid response from server: HTTP 500: 'Collection not found: prototypeCollection in database _system' while executing restoring collection with this requestPayload: ... + +INFO [a66e1] {restore} Processed 0 collection(s) from 1 database(s) in 0.04 s total time. Read 0 bytes from datafiles, sent 0 data batch(es) of 0 bytes total size. +``` + +You need to dump and restore collections that follow the sharding of a +prototype collection together with the prototype collection: + +``` +arangorestore --collection clonedCollection --collection prototypeCollection --server.database mydb --input-directory "dump" + +... +INFO [a66e1] {restore} Processed 2 collection(s) from 1 database(s) in 1.12 s total time. Read 0 bytes from datafiles, sent 0 data batch(es) of 0 bytes total size. +``` + +## Restore into an authentication-enabled ArangoDB + +Of course you can restore data into a password-protected ArangoDB as well. +However this requires certain user rights for the user used in the restore process. +The rights are described in detail in the [Managing Users](../../../operations/administration/user-management/_index.md) chapter. +For restore this short overview is sufficient: + +- When importing into an existing database, the given user needs `Administrate` + access on this database. +- When creating a new database during restore, the given user needs `Administrate` + access on `_system`. The user is promoted to `Administrate` access on the + newly created database. diff --git a/site/content/arangodb/oem/components/tools/arangorestore/options.md b/site/content/arangodb/oem/components/tools/arangorestore/options.md new file mode 100644 index 0000000000..d13d38a96b --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangorestore/options.md @@ -0,0 +1,12 @@ +--- +title: _arangorestore_ Options +menuTitle: Options +weight: 10 +description: >- + The startup options of the `arangorestore` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangorestore [<options>]` + +{{% program-options name="arangorestore" %}} diff --git a/site/content/arangodb/oem/components/tools/arangovpack/_index.md b/site/content/arangodb/oem/components/tools/arangovpack/_index.md new file mode 100644 index 0000000000..8774125399 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangovpack/_index.md @@ -0,0 +1,12 @@ +--- +title: _arangovpack_ +menuTitle: arangovpack +weight: 45 +description: >- + `arangovpack` is a command-line client tool for verifying and converting + VelocyPack and JSON payloads +--- +_arangovpack_ can check and convert between ArangoDB's own +[VelocyPack](http://github.com/arangodb/velocypack) format and JSON. + +It is primarily used in the development of ArangoDB, such as in testing. diff --git a/site/content/arangodb/oem/components/tools/arangovpack/options.md b/site/content/arangodb/oem/components/tools/arangovpack/options.md new file mode 100644 index 0000000000..13b51774fa --- /dev/null +++ b/site/content/arangodb/oem/components/tools/arangovpack/options.md @@ -0,0 +1,12 @@ +--- +title: _arangovpack_ Options +menuTitle: Options +weight: 5 +description: >- + The startup options of the `arangovpack` executable +pageToc: + maxHeadlineLevel: 2 +--- +Usage: `arangovpack [<options>]` + +{{% program-options name="arangovpack" %}} diff --git a/site/content/arangodb/oem/components/tools/foxx-cli/_index.md b/site/content/arangodb/oem/components/tools/foxx-cli/_index.md new file mode 100644 index 0000000000..a85af22296 --- /dev/null +++ b/site/content/arangodb/oem/components/tools/foxx-cli/_index.md @@ -0,0 +1,17 @@ +--- +title: Foxx CLI +menuTitle: Foxx CLI +weight: 55 +description: >- + `foxx-cli` is command line tool for managing and developing ArangoDB Foxx services +--- +Foxx CLI is an optional tool which requires Node.js and can be installed via the +package managers NPM and Yarn. + +It is the successor of `foxx-manager`, which is deprecated and will be +removed eventually. Also see [Foxx Deployment](../../../develop/foxx-microservices/deployment.md) +for additional deployment options. + +_foxx-cli_ relies on the [Foxx HTTP API](../../../develop/http-api/foxx.md). + +Repository: <https://github.com/arangodb/foxx-cli/> diff --git a/site/content/arangodb/oem/components/tools/foxx-cli/details.md b/site/content/arangodb/oem/components/tools/foxx-cli/details.md new file mode 100644 index 0000000000..75274e8afe --- /dev/null +++ b/site/content/arangodb/oem/components/tools/foxx-cli/details.md @@ -0,0 +1,178 @@ +--- +title: Foxx CLI Details +menuTitle: Details +weight: 5 +description: '' +--- +## Install + +**foxx-cli** runs on [Node.js](https://nodejs.org) and can be installed with +[yarn](https://yarnpkg.com): + +```sh +yarn global add foxx-cli +``` + +Or with [npm](https://www.npmjs.com): + +```sh +npm install --global foxx-cli +``` + +**Note**: using yarn you can also run **foxx-cli** from your project's +`devDependencies`: + +```sh +yarn add --dev foxx-cli +yarn foxx help +``` + +If you're using a recent version of npm you can also use npx: + +```sh +npx -p foxx-cli foxx help +``` + +## Usage + +After you've installed **foxx-cli**, you should be able to use the `foxx` +program. You can learn more about the different commands `foxx` supports by +using the `--help` flag. + +```sh +foxx --help +``` + +You can also use the `--help` flag with commands to learn more about them, e.g.: + +```sh +foxx install --help # Help for the "install" command + +foxx server --help # Help for the "server" command + +foxx server list --help # Subcommands are supported, too +``` + +If you have no prior knowledge of Foxx, you can get started by +[installing ArangoDB locally](https://www.arangodb.com/download) +and then creating a new Foxx service in the current directory using the `init` command: + +```sh +foxx init -i # answer the interactive questions +``` + +If you want an example, you can also let `init` create an example service for you: + +```sh +foxx init -e # create an example service please +``` + +You can also just use `foxx init` to create a minimal service without the example code. + +You can inspect the files created by the program and tweak them as necessary. +Once you're ready, install the service at a _mount path_ using the `install` command: + +```sh +foxx install /hello-foxx # installs the current directory +``` + +You should then be able to view the installed service in your browser at the following URL: + +<http://localhost:8529/_db/_system/hello-foxx> + +If you continue to work on your Foxx service and want to upgrade the installed +version with your local changes use the `upgrade` command to do so. + +```sh +foxx upgrade /hello-foxx # upgrades the server with the current directory +``` + +## Special files + +### manifest.json + +The `manifest.json` or manifest file contains a service's meta-information. +See the [Foxx reference documentation](../../../develop/foxx-microservices/reference/service-manifest.md). + +The directory containing a service's `manifest.json` file is called the _root +directory_ of the service. + +### foxxignore + +If you want to exclude files from the service bundle that will uploaded to +ArangoDB you can create a file called `.foxxignore` in the root directory of +your service. Each line should specify one pattern you wish to ignore: + +- Patterns starting with `!` will be treated as an explicit allowlist. Paths + matching these patterns will not be ignored even if they would match any of + the other patterns. + + **Example**: `!index.js` will override any pattern matching a file called + `index.js`. + +- Patterns starting with `/` will only match paths relative to the service's + root directory. + + **Example**: `/package.json` will not match `node_modules/joi/package.json`. + +- Patterns ending with `/` will match a directory and any files inside of it. + + **Example**: `node_modules/` will exclude all `node_modules` directories and + all of their contents. + +- A single `*` (glob) will match zero or more characters (even dots) in a file + or directory name. + + **Example**: `.*` will match any files and directories with a name starting + with a dot. + +- A double `**` (globstar) will match zero or more levels of nesting. + + **Example**: `hello/**/world` will match `hello/world`, `hello/foo/world`, + `hello/foo/bar/world`, and so on. + +- Patterns starting with `#` are considered comments and will be ignored. + +For more details on the pattern matching behavior, see the documentation of the +[minimatch](https://www.npmjs.com/package/minimatch) module (with the `dot` flag +enabled). + +If no `.foxxignore` file is present in the service's root directory the +following patterns will be ignored automatically: `.git/`, `.svn/`, `.hg/`, +`*.swp`, `.DS_Store`. + +Should you need to include files that match these patterns for some reason, you +can override this list by creating an empty `.foxxignore` file. + +You can also create a `.foxxignore` file in the current directory using the +`ignore` command: + +```sh +foxx ignore # creates a file pre-populated with the defaults + +foxx ignore --force # creates an empty file +``` + +To add individual patterns to the `.foxxignore` file just pass them as +additional arguments: + +```sh +foxx ignore .git/ .svn/ # you can pass multiple patterns at once + +foxx ignore '*.swp' # make sure to escape special characters +``` + +### foxxrc + +If you define servers using the `server` commands, a `.foxxrc` file will be +created in your `$HOME` directory, which is typically one of the following +paths: + +- `/home/$USER` on Linux + +- `/Users/$USER` on macOS + +- `C:\Users\$USER` on Windows + +This file contains sections for each server which may contain server credentials +should you decide to save them. diff --git a/site/content/arangodb/oem/components/web-interface/_index.md b/site/content/arangodb/oem/components/web-interface/_index.md new file mode 100644 index 0000000000..dc6affca41 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/_index.md @@ -0,0 +1,16 @@ +--- +title: Web Interface +menuTitle: Web Interface +weight: 175 +description: >- + ArangoDB has a graphical user interface you can access with your browser +--- +The ArangoDB server (*arangod*) comes with a built-in web interface for +administration. It lets you manage databases, collections, documents, +users, graphs and more. You can also run and explain queries in a +convenient way. Statistics and server status are provided as well. + +The web interface (also referred to as Web UI, frontend or *Aardvark*) can be accessed with a +browser under the URL `http://localhost:8529` with default server settings. + +![Standalone Web Interface](../../../../images/overview.png) diff --git a/site/content/arangodb/oem/components/web-interface/cluster.md b/site/content/arangodb/oem/components/web-interface/cluster.md new file mode 100644 index 0000000000..108ed759bb --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/cluster.md @@ -0,0 +1,78 @@ +--- +title: Cluster +menuTitle: Cluster +weight: 10 +description: '' +--- +The web interface differs for cluster deployments and single-server instances. +Instead of a single [Dashboard](dashboard.md), there +is a **CLUSTER** and a **NODES** section. + +Furthermore, the **REPLICATION** and **LOGS** section are not available. +You can access the logs of individual Coordinators and DB-Servers via the +**NODES** section. + +The cluster section displays statistics about the general cluster performance. + +![Cluster](../../../../images/clusterView.png) + +Statistics: + + - Available and missing Coordinators + - Available and missing DB-Servers + - Memory usage (percent) + - Current connections + - Data (bytes) + - HTTP (bytes) + - Average request time (seconds) + +## Nodes + +### Overview + +The overview shows available and missing Coordinators and DB-Servers. + +![Nodes](../../../../images/nodesView.png) + +Functions: + +- Coordinator Dashboard: Click on a Coordinator will open a statistics dashboard. + +Information (Coordinator / DB-Servers): + +- Name +- Endpoint +- Last Heartbeat +- Status +- Health + +### Shards + +The shard section displays all available sharded collections. + +![Shards](../../../../images/shardsView.png) + +Functions: + +- Move Shard Leader: Click on a leader database of a shard server will open a move shard dialog. Shards can be + transferred to all available DB-Servers, except the leading DB-Server or an available follower. +- Move Shard Follower: Click on a follower database of a shard will open a move shard dialog. Shards can be + transferred to all available DB-Servers, except the leading DB-Server or an available follower. + +Information (collection): + +- Shard +- Leader (green state: sync is complete) +- Followers + +### Rebalance Shards + +The rebalance shards section displays a button for rebalancing shards. +A new DB-Server will not have any shards. With the rebalance functionality, +the cluster will start to rebalance shards including empty DB-Servers. +You can specify the maximum number of shards that can be moved in each +operation by using the `--cluster.max-number-of-move-shards` startup option +of _arangod_ (the default value is `10`). +When the button is clicked, the number of scheduled move shards operations is +shown, or it is displayed that no move operations have been scheduled if they +are not necessary. diff --git a/site/content/arangodb/oem/components/web-interface/collections.md b/site/content/arangodb/oem/components/web-interface/collections.md new file mode 100644 index 0000000000..ad8e937e88 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/collections.md @@ -0,0 +1,72 @@ +--- +title: Collections +menuTitle: Collections +weight: 15 +description: '' +--- +The collections section displays all available collections. From here you can +create new collections and jump into a collection for details (click on a +collection tile). + +![Collections](../../../../images/collectionsView.png) + +Functions: + + - A: Toggle filter properties + - B: Search collection by name + - D: Create collection + - C: Filter properties + - H: Show collection details (click tile) + +Information: + + - E: Collection type + - F: Collection state(unloaded, loaded, ...) + - G: Collection name + +## Collection + +![Collection](../../../../images/collectionView.png) + +There are four view categories: + +1. Content: + - Create a document + - Delete a document + - Filter documents + - Download documents + - Upload documents + +2. indexes: + - Create indexes + - Delete indexes + +3. Info: + - Detailed collection information and statistics + +3. Settings: + - Configure name, journal size, index buckets, wait for sync + - Delete collection + - Truncate collection + - Unload/Load collection + - Save modified properties (name, journal size, index buckets, wait for sync) + +Additional information: + +Upload format: + +I. Line-wise + +```js +{ "_key": "key1", ... } +{ "_key": "key2", ... } +``` + +II. JSON documents in a list + +```js +[ + { "_key": "key1", ... }, + { "_key": "key2", ... } +] +``` diff --git a/site/content/arangodb/oem/components/web-interface/dashboard.md b/site/content/arangodb/oem/components/web-interface/dashboard.md new file mode 100644 index 0000000000..599127ba12 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/dashboard.md @@ -0,0 +1,37 @@ +--- +title: Dashboard +menuTitle: Dashboard +weight: 5 +description: '' +--- +The **DASHBOARD** section provides statistics which are polled regularly from the +ArangoDB server. + +![Nodes](../../../../images/dashboardView.png) + +There is a different interface for [Cluster](cluster.md) deployments. + +Statistics: + + - Requests per second + - Request types + - Number of client connections + - Transfer size + - Transfer size (distribution) + - Average request time + - Average request time (distribution) + +System Resources: + +- Number of threads +- Memory +- Virtual size +- Major page faults +- Used CPU time + +Replication: + +- Replication state +- Totals +- Ticks +- Progress diff --git a/site/content/arangodb/oem/components/web-interface/document.md b/site/content/arangodb/oem/components/web-interface/document.md new file mode 100644 index 0000000000..85cc5583a9 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/document.md @@ -0,0 +1,21 @@ +--- +title: Document +menuTitle: Document +weight: 20 +description: '' +--- +The document section offers a editor which let you edit documents and edges of a collection. + +![Document](../../../../images/documentView.png) + +Functions: + + - Edit document + - Save document + - Delete document + - Switch between Tree/Code - Mode + - Create a new document + +Information: + + - Displays: _id, _rev, _key properties diff --git a/site/content/arangodb/oem/components/web-interface/graphs.md b/site/content/arangodb/oem/components/web-interface/graphs.md new file mode 100644 index 0000000000..3388a97ae5 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/graphs.md @@ -0,0 +1,194 @@ +--- +title: Graphs in the web interface +menuTitle: Graphs +weight: 30 +description: >- + You can create and manage named graphs in the web interface, as well as + visually explore graphs with the graph viewer +--- +The **GRAPHS** section of the web interface lists the _named graphs_ stored in +ArangoDB (EnterpriseGraphs, SmartGraphs, SatelliteGraphs, General Graphs) and +lets you create new named graphs as well as view and edit the settings of +existing named graphs. It also provides a viewer facility for visualizing +subsets of a graph or an entire graph. + +![manage graphs](../../../../images/graphsView.png) + +## Create a named graph + +1. In the **GRAPHS** section, click the first card with the label **Add Graph**. +2. Select a tab depending on which type of named graph you want to create. + The **SatelliteGraph**, **SmartGraph**, and **EnterpriseGraph** tabs are + only available for cluster deployments using the Enterprise Edition. + For non-cluster deployments and in the Community Edition, only the + **Examples** and **GeneralGraph** tabs are available. +3. Fill in the fields of the dialog. Required fields have an asterisk (`*`) + in their label. Hover over the gray circle with a white `i` in it next to + a field to show the tooltip with an explanation. +4. Click the **Create** button to create the named graph. + +For more information about the different types of named graphs and how to +create them, see [Graphs](../../graphs/_index.md). + +## View and edit the settings of a named graph + +1. In the **GRAPHS** section, click the _gear_ icon in the top right corner + of a graph's card. +2. The setting dialog opens. You can only edit certain fields. Fields that + cannot be modified are grayed out. +3. Click the **Cancel** button or outside of the dialog to close it without + saving any changes. Click **Save** to save changes. + +## Delete a named graph + +1. In the **GRAPHS** section, click the _gear_ icon in the top right corner + of a graph's card. +2. Click the **Delete** button. +3. Optional: Tick the **also drop collections?** checkbox if you want to + delete the vertex and edge collections of the graph as well and not the + graph definition only. This deletes the collections with all the documents + they contain and is irreversible! +4. Confirm the deletion by clicking the **Yes** button. + +## Graph viewer + +The graph viewer opens if you click a graph's card in the **GRAPHS** section. +It randomly selects a start node and displays its neighborhood. By default, +up to 250 nodes that are directly connected to the start node as well as +their direct neighbors are selected. You can select one or more start nodes +and change the depth and the limit in the settings panel. You can also load +the entire graph via the toolbar, but only use this with small graphs. + +![The graph viewer with the settings panel open](../../../../images/graphViewer.png) + +### Viewport + +The main area of the graph viewer is used for displaying the graph. You can +interact with it in the followings ways: + +- Left-click a node or edge to select it. The document ID and the names of the + document's top-level attributes are displayed at the bottom of the viewport. + Hover an attribute name to view the attribute value as a tooltip. +- Left-click and drag nodes if you want to re-arrange them. +- Left-click and drag to move the entire graph within the viewport. +- Right-click to access the [Context menus](#context-menus). +- Use the [Toolbar](#toolbar), for example, to access the graph viewer **Settings** +- See the number of the currently displayed nodes and edges, and how long it + took to load the graph. This is displayed at the bottom of the viewport. + +### Toolbar + +The toolbar at the top shows you the name of the graph and offers the following +actions and a toggle for the settings panel: + +- Take a screenshot (_camera_ icon) +- Enter fullscreen (_rectangle corners_ icon) +- Load full graph (_cloud download_ icon) +- Switch to the old graph viewer (_clock with an arrow_ icon) +- Search nodes (_magnifier_ icon) +- Settings (_gear_ icon) + +### Settings + +The settings panel is divided into three collapsible sections and lets you +configure what to show of the graph and how. + +**General** + +- **Start node**: One or more document IDs to start the traversal from for + displaying (a subset of) the graph. If no start node is specified, the + graph viewer picks a random node. +- **Layout**: The graph layout algorithm for finding a sensible arrangement and + visualizing the graph in 2D. + - **forceAtlas2**: Assigns positions to nodes based on the principles of + physical simulation, using repulsive and attractive forces. Works best with + medium-sized graphs. + - **hierarchical**: Arranges the graph uniformly to display a hierarchical + structure (for example, a tree) that avoids edge crossings and overlaps. + Works best with small graphs. +- **Depth**: The traversal depth for displaying the Start node's neighborhood. + The default depth is **2**. +- **Limit**: The maximum number of nodes to display, even if the maximum depth + is not reached. The default is **250** nodes. Set it to **0** for no limit. + +**Nodes** + +- **Node label**: The document attribute to use for node labels. + The default is `_key`. +- **Default node color**: The color for nodes if no color attribute is set or + as a fallback if the document does not have this attribute. +- **Color nodes by collection**: Give nodes stored in the same collection the + same, randomly chosen color. Disables the default node color and the node + color attribute field. +- **Node color attribute**: A document attribute to use for assigning a + node color. Nodes with the same attribute value get the same, randomly + chosen color. +- **Show collection name**: Whether to include the document's collection name + in the node label. +- **Size by connections**: Scale nodes based on the number of inbound and + outbound edges. Disables the sizing attribute field. +- **Sizing attribute**: A document attribute to use for scaling nodes. Attribute values need to be numeric. + +**Edges** + +- **Edge label**: The document attribute to use for edge labels. + The default is none. +- **Default edge color**: The color for edges if no color attribute is set or + as a fallback if the document does not have this attribute. +- **Color edges by collection**: Give edges stored in the same collection the + same, randomly chosen color. Disables the default edge color and the edge + color attribute field. +- **Edge color attribute**: A document attribute to use for assigning an + edge color. Edges with the same attribute value get the same, randomly + chosen color. +- **Show collection name**: Whether to include the document's collection name + in the edge label. +- **Show edge direction**: Whether to display arrow heads on edge ends to show + which way edges are pointing. +- **Type**: The style for edge lines or arcs. + Can be **solid**, **dashed**, or **dotted**. + +**Actions** + +- **Restore defaults**: Reset the settings. +- **Apply**: Traverse and layout the graph according to the settings. + +### Context menus + +You can click the right mouse button to access the context menus. You can take +different actions depending on where you click. + +**Background** + +If you right-click a blank area anywhere in the graph viewer, you get the +options to create a node or edge. + +- **Add node to database**: Opens a dialog that lets you specify a document key, + select a collection to store the node in, and to set any document attributes. +- **Add edge to database**: Enables the _Add edge mode_. Left-click a node and + drag the edge to the end node. A dialog opens that lets you specify a + document key, select a collection to store the edge in, and to set any + document attributes. + +**Node** + +If you right-click a node, the connected edges are highlighted and you get the +followings options: + +- **Delete Node**: Opens a confirmation dialog for removing the document from + the collection it is stored in. + You can optionally **Delete connected edges too**. +- **Edit Node**: Opens a dialog for editing the document attributes. +- **Expand Node**: Follow this node's inbound and outbound edges and display + its direct neighbors in addition to the already shown graph. +- **Set as Start Node**: Change the start node to this node and render the + graph according to the settings. +- **Pin Node**: Locks the position of the node. + +**Edge** + +If you right-click an edge, you get the following options: + +- **Delete edge**: Opens a confirmation dialog for removing the document from + the collection it is stored in. +- **Edit edge**: Opens a dialog for editing the document attributes. diff --git a/site/content/arangodb/oem/components/web-interface/logs.md b/site/content/arangodb/oem/components/web-interface/logs.md new file mode 100644 index 0000000000..46c70ffb19 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/logs.md @@ -0,0 +1,20 @@ +--- +title: Logs +menuTitle: Logs +weight: 45 +description: '' +--- +The logs section displays all available log entries. Log entries are filterable by +their log level types. + +![Logs](../../../../images/logsView.png) + +Functions: + + - Filter log entries by log level (all, info, error, warning, debug) + +Information: + + - Loglevel + - Date + - Message diff --git a/site/content/arangodb/oem/components/web-interface/queries.md b/site/content/arangodb/oem/components/web-interface/queries.md new file mode 100644 index 0000000000..bc5d76591b --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/queries.md @@ -0,0 +1,117 @@ +--- +title: Query View +menuTitle: Queries +weight: 25 +description: '' +--- +The query view offers you three different subviews: + +- Editor +- Running Queries +- Slow Query History + +## AQL Query Editor + +The web interface offers a AQL Query Editor: + +![Editor Input](../../../../images/queryEditorInput.png) + +The editor is split into two parts, the query editor pane and the bind +parameter pane. + +The left pane is your regular query input field, where you can edit and then +execute or explain your queries. By default, the entered bind parameter will +automatically be recognized and shown in the bind parameter table in the right +pane, where you can easily edit them. + +The input fields are equipped with type detection. This means you don't have to +use quote marks around string, just write them as-is. Numbers will be treated +as numbers, *true* and *false* as booleans, *null* as null-type value. Square +brackets can be used to define arrays, and curly braces for objects (keys and +values have to be surrounded by double quotes). This will mostly be what you want. +But if you want to force something to be treated as string, use quotation marks +for the value: + +```js +123 // interpreted as number +"123" // interpreted as string + +["foo", "bar", 123, true] // interpreted as array +['foo', 'bar', 123, true] // interpreted as string +``` + +If you are used to work with JSON, you may want to switch the bind parameter +editor to JSON mode by clicking on the upper right toggle button. You can then +edit the bind parameters in raw JSON format. + +### Custom Queries + +To save the current query use the *Save* button in the top left corner of +the editor or use the shortcut (see below). + +![Custom Queries](../../../../images/queryCustoms.png) + +By pressing the *Queries* button in the top left corner of the editor you +activate the custom queries view. Here you can select a previously stored custom +query or one of our query examples. + +Click on a query title to get a code preview. In addition, there are action +buttons to: + +- Copy to editor +- Explain query +- Run query +- Delete query + +For the built-in example queries, there is only *Copy to editor* available. + +To export or import queries to and from JSON you can use the buttons on the +right-hand side. + +### Result + +![Editor Output](../../../../images/queryEditorOutput.png) + +Each query you execute or explain opens up a new result box, so you are able +to fire up multiple queries and view their results at the same time. Every query +result box gives you detailed query information and of course the query result +itself. The result boxes can be dismissed individually, or altogether using the +*Remove results* button. The toggle button in the top right corner of each box +switches back and forth between the *Result* and *AQL* query with bind parameters. + +### Spotlight + +![Spotlight](../../../../images/querySpotlight.png) + +The spotlight feature opens up a modal view. There you can find all AQL keywords, +AQL functions and collections (filtered by their type) to help you to be more +productive in writing your queries. Spotlight can be opened by the magic wand icon +in the toolbar or via shortcut (see below). + +### AQL Editor Shortcuts + +| Key combination | Action | +|:----------------|:-------| +| `Ctrl`/`Cmd` + `Return` | Execute query +| `Ctrl`/`Cmd` + `Alt` + `Return` | Execute selected query +| `Ctrl`/`Cmd` + `Shift` + `Return` | Explain query +| `Ctrl`/`Cmd` + `Shift` + `S` | Save query +| `Ctrl`/`Cmd` + `Shift` + `C` | Toggle comments +| `Ctrl`/`Cmd` + `Z` | Undo last change +| `Ctrl`/`Cmd` + `Shift` + `Z` | Redo last change +| `Shift` + `Alt` + `Up` | Increase font size +| `Shift` + `Alt` + `Down` | Decrease font size +| `Ctrl` + `Space` | Open up the spotlight search + +## Running Queries + +![Running Queries](../../../../images/runningQueries.png) + +The *Running Queries* tab gives you a compact overview of all running queries. +By clicking the red minus button, you can abort the execution of a running query. + +## Slow Query History + +![Slow Queries](../../../../images/slowQueries.png) + +The *Slow Query History* tab gives you a compact overview of all past slow queries. diff --git a/site/content/arangodb/oem/components/web-interface/services.md b/site/content/arangodb/oem/components/web-interface/services.md new file mode 100644 index 0000000000..478bfd2b29 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/services.md @@ -0,0 +1,50 @@ +--- +title: Services +menuTitle: Services +weight: 35 +description: '' +--- +The services section displays all installed Foxx applications. You can create new services +or go into a detailed view of a chosen service. + +![Services](../../../../images/servicesView.png) + +## Create Service + +There are four different possibilities to create a new service: + +1. Create service via zip file +2. Create service via github repository +3. Create service via official ArangoDB store +4. Create a blank service from scratch + +![Create Service](../../../../images/installService.png) + +## Service View + +This section offers several information about a specific service. + +![Create Service](../../../../images/serviceView.png) + +There are four view categories: + +1. Info: + - Displays name, short description, license, version, mode (production, development) + - Offers a button to go to the services interface (if available) + +2. Api: + - Display API as SwaggerUI + - Display API as RAW JSON + +3. Readme: + - Displays the services manual (if available) + +4. Settings: + - Download service as zip file + - Run service tests (if available) + - Run service scripts (if available) + - Configure dependencies (if available) + - Change service parameters (if available) + - Change mode (production, development) + - Replace the service + - Delete the service diff --git a/site/content/arangodb/oem/components/web-interface/users.md b/site/content/arangodb/oem/components/web-interface/users.md new file mode 100644 index 0000000000..49b3511339 --- /dev/null +++ b/site/content/arangodb/oem/components/web-interface/users.md @@ -0,0 +1,40 @@ +--- +title: Managing Users in the Web Interface +menuTitle: Users +weight: 40 +description: '' +--- +ArangoDB users are globally stored in the `_system` database and can only be +managed while logged on to this database. There you can find the *Users* section: + +![Users](../../../../images/users.png) + +## General + +Select a user to bring up the *General* tab with the username, name and active +status, as well as options to delete the user or change the password. + +![User General](../../../../images/userGeneral.png) + +## Permissions + +Select a user and go to the *Permissions* tab. You will see a list of databases +and their corresponding database access level for that user. + +![User Permissions](../../../../images/userPermissions.png) + +Please note that server access level follows from the access level on +the `_system` database. Furthermore, the default database access level +for this user appear in the artificial row with the database name `*`. + +Below this table is another one for the collection category access +levels. At first, it shows the list of databases, too. If you click on a +database, the list of collections in that database will be open and you +can see the defined collection access levels for each collection of that +database (which can be all unselected which means that nothing is +explicitly set). The default access levels for this user and database +appear in the artificial row with the collection name `*`. + +{{< info >}} +Also see [Managing Users](../../operations/administration/user-management/_index.md) about access levels. +{{< /info >}} diff --git a/site/content/arangodb/oem/concepts/_index.md b/site/content/arangodb/oem/concepts/_index.md new file mode 100644 index 0000000000..a248a743c4 --- /dev/null +++ b/site/content/arangodb/oem/concepts/_index.md @@ -0,0 +1,6 @@ +--- +title: Concepts +menuTitle: Concepts +weight: 55 +description: '' +--- diff --git a/site/content/arangodb/oem/concepts/data-models.md b/site/content/arangodb/oem/concepts/data-models.md new file mode 100644 index 0000000000..5c0d52a30b --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-models.md @@ -0,0 +1,86 @@ +--- +title: Data Models +menuTitle: Data Models +weight: 65 +description: >- + ArangoDB is a native multi-model database with flexible data models + for key-values, documents, and graphs +--- +## Key-Value Model + +The key-value data model is a subset of ArangoDB's document data model. +Every document has a `_key` attribute that identifies a document within a +collection. This **document key** acts as the primary key to retrieve the data. +You can set it when creating a document, or let the system generate one +automatically. It cannot be changed later because the attribute is immutable. +It is always a string. What you can use as a document key is described in +[User-specified keys](data-structure/documents/_index.md#document-keys). + +ArangoDB is ready to store JSON objects and retrieve them via their keys out of +the box. Every collection has an index on the `_key` attribute (the +**primary index**), which makes this a fast operation by default. + +There is an additional virtual attribute `_id`, called the **document identifier**. +It uniquely identifies documents within a database. It is a combination of the +collection name that the document is stored in, a forward slash (`/`), and the +document key, so `<collection>/<key>`. It uses the primary index under the hood +and you can thus use it to look up documents equally fast. + +## Document Model + +You can store data records as JSON objects in ArangoDB, and not only retrieve +them one by one as they are like in the key-value model, but run queries of all +kinds that access documents granularly and involve multiple documents and +collections. + +The stored information is not treated like an opaque block of data but you can +work with documents at the attribute level. You can search by any attributes, +with or without built-in and user-defined (secondary) indexes, return subsets of +attributes or even compute new ones on-the-fly, group records and aggregate +values, and more. + +## Graph Model + +Graphs are comprised of **vertices** and **edges**. Both are documents in +ArangoDB. Edges have two special attributes, `_from` and `_to`, that reference +the source and target vertices by their document identifiers. + +You can store vertices and edges with as many properties as you need, as both +are fully-fledged documents (JSON objects). + +You can organize vertices and edges in sets using collections, with vertices in +**document collections** (also referred to as **vertex collections**) and edges +in **edge collections**. This [graph](../graphs/_index.md) model makes ArangoDB classify +as a **Labeled Property Graph** store. + +The design with edges stored in edge collections enables true graph scalability, +while keeping the promise of performant graph queries regardless of the number +of vertices and edges. + +Edges are always **directed** in ArangoDB, which means they point from one +vertex to another. They cannot point both ways. However, you can create multiple +edges between a pair of vertices in both directions. When you **traverse** a +graph - a basic graph query algorithm that starts at a given vertex and then +walks along the connected edges to discover neighboring vertices - you can +specify whether you want to follow edges in the direction they are defined in +(**outbound**), the opposite direction (**inbound**), or regardless of the +direction (**any**). This means that you do not need to create an opposing edge +for every edge that you want to be able to follow in both directions. + +Aside from basic graph traversal, ArangoDB offers +[graph algorithms](../graphs/_index.md#supported-graph-algorithms) to find one +or multiple shortest paths between two vertices, can return a specified amount +of paths between two vertices in order of increasing length, and supports +distributed graph processing based on the Pregel framework. + +You can perform operations directly on the documents of graphs and run graph +traversals using ad-hoc sets of vertex and edge collections. These are called +**anonymous graphs**. However, no graph consistency is enforced. You can create +**named graphs** and use the interfaces for named graphs, which ensure graph +consistency. For example, removing a vertex removes all connected edges, too. +Low-level operations can still cause dangling edges, nonetheless. + +<!-- +- [Graphs in data modeling - is the emperor naked?](https://medium.com/@neunhoef/graphs-in-data-modeling-is-the-emperor-naked-2e65e2744413#.x0a5z66ji) +- [Index Free Adjacency or Hybrid Indexes for Graph Databases](https://www.arangodb.com/2016/04/index-free-adjacency-hybrid-indexes-graph-databases/) +--> diff --git a/site/content/arangodb/oem/concepts/data-retrieval.md b/site/content/arangodb/oem/concepts/data-retrieval.md new file mode 100644 index 0000000000..76dbbfe4e4 --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-retrieval.md @@ -0,0 +1,24 @@ +--- +title: Data Retrieval +menuTitle: Data Retrieval +weight: 70 +description: >- + You can get information stored in ArangoDB back out using queries, optionally + accelerated by indexes, and possibly in result batches +--- +**Queries** are used to filter documents based on certain criteria, to compute +or store new data, as well as to manipulate or delete existing documents. +Queries can be as simple as returning individual records, or as complex as +traversing graphs or performing [joins](../aql/examples-and-query-patterns/joins.md) using many +collections. Queries are written in the [ArangoDB Query Language](../aql/_index.md), +**AQL** for short. + +**Cursors** are used to iterate over the result of queries, so that you get +easily processable batches instead of one big hunk. + +**Indexes** are used to speed up queries. There are multiple types of indexes, +such as [persistent indexes](../index-and-search/indexing/working-with-indexes/persistent-indexes.md) and +[geo-spatial indexes](../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md). + +**Views** are another type of index, primarily for full-text search. See +[ArangoSearch](../index-and-search/arangosearch/_index.md). diff --git a/site/content/arangodb/oem/concepts/data-structure/_index.md b/site/content/arangodb/oem/concepts/data-structure/_index.md new file mode 100644 index 0000000000..39fd33cfe3 --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/_index.md @@ -0,0 +1,67 @@ +--- +title: Data Structure +menuTitle: Data Structure +weight: 60 +description: >- + ArangoDB stores graphs and documents as JSON objects that can be organized in + collections and databases +--- +## How Data is Structured in ArangoDB + +The hierarchy that data is organized in is **documents** (data records) in +**collections**, and collections in **databases**. + +### Documents + +ArangoDB lets you store documents as JSON objects. + +```json +{ + "name": "ArangoDB", + "tags": ["graph", "database", "NoSQL"], + "scalable": true, + "company": { + "name": "ArangoDB Inc.", + "founded": 2015 + } +} +``` + +Each record that you store is a JSON object at the top-level, also referred to +as a [**document**](documents/_index.md). +Each key-value pair is called an **attribute**, comprised +of the attribute name and the attribute value. Attributes can also be called +*properties* or *fields*. + +You can freely model your data using the available data types. Each document is +self-contained and can thus have a unique structure. You do not need to define a +schema upfront. However, sets of documents typically have some common +attributes. If you want to enforce a specific structure, then you can do so with a +[schema validation](documents/schema-validation.md). + +Documents are internally stored in a binary format called +[VelocyPack](https://github.com/arangodb/velocypack#readme). + +### Collections + +Documents are stored in [**collections**](collections.md), +similar to how files are stored in folders. A collection can hold an arbitrary +number of documents. + +You can group related documents together using collections, such as by +entity type. For example, you can store _book_ documents in a `books` +collections. All book records have some common attributes like a title, +author, and publisher. You can later create indexes for some of the often-used +attributes to speed up queries. This is done at the collection level. + +### Databases + +Each collection is part of a [**database**](databases.md). +Databases allow you to isolate sets of collections from one another, usually for +multi-tenant applications, where each of your clients has their own database to +work with. You cannot run queries across several databases. + +Every server instance has a default database called `_system`. It is special +because it cannot be removed and it holds a couple of system collections that +are used internally by the server. Other than that, you may create your own +collections in this database like in any other. diff --git a/site/content/arangodb/oem/concepts/data-structure/collections.md b/site/content/arangodb/oem/concepts/data-structure/collections.md new file mode 100644 index 0000000000..1d984338e0 --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/collections.md @@ -0,0 +1,751 @@ +--- +title: Collections +menuTitle: Collections +weight: 10 +description: >- + Collections allow you to store documents and you can use them to group records + of similar kinds together +--- +A collection can contain a set of documents, similar to how a folder contains +files. You can store documents with varying data structures in a single +collection, but a collection is typically used to only store one type of +entities. For example, you can use one collection for products, another for +customers, and yet another for orders. + +## Collection types + +- The regular type of collection is a **document collection**. If you use + document collections for a graph, then they are referred to as + **vertex collections**. + +- To store connections between the vertices of a graph, you need to use + **edge collections**. The documents they contain have a `_from` and a `_to` + attribute to reference documents by their ID. + +- Collection that are used internally by ArangoDB are prefixed with an + underscore (like `_users`) and are called **system collections**. They can be + document collections as well as edge collections. + +You need to specify whether you want a document collection or an edge collection +when you create the collection. The type cannot be changed later. + +## Collection names + +You can give each collection a name to identify and access it. The name needs to +be unique within a [database](databases.md), but not globally +for the entire ArangoDB instance. + +The namespace for collections is shared with [Views](views.md). +There cannot exist a collection and a View with the same name in the same database. + +The collection name needs to be a string that adheres to either the **traditional** +or the **extended** naming constraints. Whether the former or the latter is +active depends on the `--database.extended-names` startup option. +The extended naming constraints are used if enabled, allowing many special and +UTF-8 characters in database, collection, View, and index names. If set to +`false` (default), the traditional naming constraints are enforced. + +{{< info >}} +The extended naming constraints are an **experimental** feature but they will +become the norm in a future version. Check if your drivers and client applications +are prepared for this feature before enabling it. +{{< /info >}} + +The restrictions for collection names are as follows: + +- For the **traditional** naming constraints: + - The names must only consist of the letters `A` to `Z` (both in lower + and upper case), the digits `0` to `9`, and underscore (`_`) and dash (`-`) + characters. This also means that any non-ASCII names are not allowed. + - Names of user-defined collections must always start with a letter. + System collection names must start with an underscore. You should not use + system collection names for your own collections. + - The maximum allowed length of a name is 256 bytes. + - Collection names are case-sensitive. + +- For the **extended** naming constraints: + - Names can consist of most UTF-8 characters, such as Japanese or Arabic + letters, emojis, letters with accentuation. Some ASCII characters are + disallowed, but less compared to the _traditional_ naming constraints. + - Names cannot contain the characters `/` or `:` at any position, nor any + control characters (below ASCII code 32), such as `\n`, `\t`, `\r`, and `\0`. + - Spaces are accepted, but only in between characters of the name. Leading + or trailing spaces are not allowed. + - `.` (dot), `_` (underscore) and the numeric digits `0`-`9` are not allowed + as first character, but at later positions. + - Collection names are case-sensitive. + - Collection names containing UTF-8 characters must be + [NFC-normalized](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). + Non-normalized names are rejected by the server. + - The maximum length for a collection name is 256 bytes after normalization. + As a UTF-8 character may consist of multiple bytes, this does not necessarily + equate to 256 characters. + + Example collection names that can be used with the _extended_ naming constraints: + `España`, `😀`, `犬`, `كلب`, `@abc123`, `København`, `München`, `Бишкек`, `abc? <> 123!` + +{{< warning >}} +While it is possible to change the value of the +`--database.extended-names` option from `false` to `true` to enable +extended names, the reverse is not true. Once the extended names have been +enabled, they remain permanently enabled so that existing databases, +collections, Views, and indexes with extended names remain accessible. + +Please be aware that dumps containing extended names cannot be restored +into older versions that only support the traditional naming constraints. In a +cluster setup, it is required to use the same naming constraints for all +Coordinators and DB-Servers of the cluster. Otherwise, the startup is +refused. In DC2DC setups, it is also required to use the same naming constraints +for both datacenters to avoid incompatibilities. +{{< /warning >}} + +You can rename collections (except in cluster deployments). This changes the +collection name, but not the collection identifier. + +## Collection identifiers + +A collection identifier lets you refer to a collection in a database, similar to +the name. It is a string value and is unique within a database. Unlike +collection names, ArangoDB assigns collection IDs automatically and you have no +control over them. + +ArangoDB internally uses collection IDs to look up collections. However, you +should use the collection name to access a collection instead of its identifier. + +ArangoDB uses 64-bit unsigned integer values to maintain collection IDs +internally. When returning collection IDs to clients, ArangoDB returns them as +strings to ensure the identifiers are not clipped or rounded by clients that do +not support big integers. Clients should treat the collection IDs returned by +ArangoDB as opaque strings when they store or use them locally. + +## Key generators + +ArangoDB allows you to use different key generators for each collection. +Key generators have the purpose of auto-generating a value for the `_key` +attribute of a document if none was specified by the user. + +- **traditional** (default): The `traditional` key generator auto-generates + key values that are strings with ever-increasing numbers. The increment values + it uses are non-deterministic (e.g. `"137"`, `"140"`, `"141"`, `"145"`, ...). + +- **autoincrement**: The `autoincrement` key generator auto-generates + deterministic key values. You can define both the start value (`offset`) and + the `increment` value when creating the collection. The default start value is + `0` and the default increment is `1` (`"1"`, `"2"`, `"3"`, `"4"`, `"5"`, ...). + With an `increment` of `5` and `offset` of `2`: `"2"`, `"7"`, `"12"`, `"17"`, `"22"`, ... + + The auto-increment values are increased and handed out on each document insert + attempt. Even if an insert fails, the auto-increment value is never rolled back. + That means there may exist gaps in the sequence of assigned auto-increment values + if inserts fail. + + The `autoincrement` key generator is only supported for collections with a + single shard. + +- **padded**: The `padded` key generator generates keys of a fixed length + (16 bytes) in ascending lexicographical sort order. This is ideal for the + RocksDB storage engine, which slightly benefits keys that are inserted in + lexicographically ascending order. The sequence of generated keys is not + guaranteed to be gap-free (e.g. `"00000000005bb4d9"`, `"00000000005bb4e6"`, ...). + +- **uuid**: The `uuid` key generator generates universally unique 128 bit keys, + which are stored in hexadecimal human-readable format. The keys produced by + this key generator are not lexicographically sorted (e.g. + `"04648089-bdeb-4852-b570-f5280f68cf19"`, `"d0f1069c-e38b-4327-8e1e-6bdf7fd33865"`, ...). + +If you specify keys for some documents but rely on key generation for other +documents targeting the same collection, conflicts may occur. You can set +`allowUserKeys` to `false` to only permit auto-generated keys for a collection. + +## Synchronous replication of collections + +Distributed ArangoDB setups offer synchronous replication, +which means that there is the option to replicate all data +automatically within an ArangoDB cluster. This is configured for sharded +collections on a per-collection basis by specifying a **replication factor**. +A replication factor of `k` means that altogether `k` copies of each shard are +kept in the cluster on `k` different servers, and are kept in sync. That is, +every write operation is automatically replicated on all copies. + +This is organized using a leader/follower model. At all times, one of the +servers holding replicas for a shard is "the leader" and all others +are "followers", this configuration is held in the Agency (see +[Cluster](../../deploy/cluster/_index.md) for details of the ArangoDB +cluster architecture). Every write operation is sent to the leader +by one of the Coordinators, and then replicated to all followers +before the operation is reported to have succeeded. The leader keeps +a record of which followers are currently in sync. In case of network +problems or a failure of a follower, a leader can and will drop a follower +temporarily after 3 seconds, such that service can resume. In due course, +the follower will automatically resynchronize with the leader to restore +resilience. + +If a leader fails, the cluster Agency automatically initiates a failover +routine after around 15 seconds, promoting one of the followers to +leader. The other followers (and the former leader, when it comes back), +automatically resynchronize with the new leader to restore resilience. +Usually, this whole failover procedure can be handled transparently +for the Coordinator, such that the user code does not even see an error +message. + +This fault tolerance comes at a cost of increased latency. +Each write operation needs an additional network roundtrip for the +synchronous replication of the followers (but all replication operations +to all followers happen concurrently). Therefore, the default replication +factor is `1`, which means no replication. + +## Collection interfaces + +The following sections show examples of how you can use the APIs of ArangoDB and +the official drivers, as well as the ArangoDB Shell and the built-in web interface, +to perform common operations related to collections. For less common operations +and other drivers, see the corresponding reference documentation. + +### Create a collection + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **COLLECTIONS** in the main navigation. +2. Click **Add collection**. +3. Set a **Name** and optionally configuration options. +4. Click **Save**. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_create_collection +description: '' +--- +coll = db._create("coll"); +~db._drop("coll"); +``` +See [`db._create()`](../../develop/javascript-api/@arangodb/db-object.md#db_createcollection-name--properties--type--options) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -d '{"name":"coll"}' http://localhost:8529/_db/mydb/_api/collection +``` + +See the [`POST /_db/{database-name}/_api/collection`](../../develop/http-api/collections.md#create-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = await db.createCollection("coll"); +// -- or -- +coll = db.collection("coll"); +const info = await coll.create(); +``` + +See [`Database.createCollection()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#createCollection) +and [`DocumentCollection.create()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#create) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.CreateCollection(ctx, "coll", nil) +if err != nil { + fmt.Println(err) +} else { + _ = coll // Use coll here +} +``` + +See [`DatabaseCollection.CreateCollection()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#DatabaseCollection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +CollectionEntity coll = db.createCollection("coll"); +// -- or -- +CollectionEntity coll = db.collection("coll").create(); +``` + +See [`ArangoDB.createCollection()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDB.html#db%28java.lang.String%29) +and [`ArangoCollection.create()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#create%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.create_collection("coll") +``` + +See [`StandardDatabase.create_collection()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.create_collection) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Get a collection + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_get_collection +description: '' +--- +~db._create("coll"); +coll = db._collection("coll"); +~db._drop("coll"); +``` + +There is a short-cut that you can use: + +```js +let coll = db.coll +// or +let coll = db["coll"] +``` + +See [`db._collection()`](../../develop/javascript-api/@arangodb/db-object.md#db_collectioncollection) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_db/mydb/_api/collection/coll +``` + +See the [`GET /_db/{database-name}/_api/collection/{collection-name}`](../../develop/http-api/collections.md#get-the-collection-information) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const info = await coll.get(); +``` + +See [`Database.collection()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#collection) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +if err != nil { + fmt.Println(err) +} else { + _ = coll // Use coll here +} +``` + +See [`DatabaseCollection.GetCollection()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#DatabaseCollection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); +CollectionEntity info = coll.getInfo(); +``` + +See [`ArangoDB.collection()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDB.html#db%28java.lang.String%29) +and [`ArangoCollection.getInfo()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#getInfo%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") +``` + +See [`StandardDatabase.collection()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.collection) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### List all collections + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that you want to list the collection of. +2. Click **COLLECTIONS** in the main navigation. +3. All collections are listed, given that no settings are applied that hide + collections from the overview, the **Search** field is empty, and you + have at least read access for all collections. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_list_collections +description: '' +--- +~db._createDatabase("mydb"); +~db._useDatabase("mydb"); +~db._create("products"); +~db._create("users"); +db._collections(); +~db._useDatabase("_system"); +~db._dropDatabase("mydb"); +``` + +See [`db._collections()`](../../develop/javascript-api/@arangodb/db-object.md#collections) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_db/mydb/_api/collection +``` + +See the [`GET /_db/{database-name}/_api/collection`](../../develop/http-api/collections.md#list-all-collections) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +const colls = await db.collections(); +colls.forEach(c => console.log(c.name)) +``` + +See [`Database.collections()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#collections) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +colls, err := db.Collections(ctx) +if err != nil { + fmt.Println(err) +} else { + for _, c := range colls { + fmt.Println(c.Name()) + } +} +``` + +See [`DatabaseCollection.Collections()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#DatabaseCollection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +Collection<CollectionEntity> colls = db.getCollections(); +colls.forEach(c -> System.out.println(c.getName())); +``` + +See [`ArangoDatabase.getCollections()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html#getCollections%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +colls = db.collections() +for c in colls: + print(c["name"]) +``` + +See [`StandardDatabase.collections()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.collections) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Get the collection properties + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +4. The properties are listed in the **Info**, **Computed Values**, and + **Schema** tabs. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_get_collection_properties +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); +coll.properties(); +~db._drop("coll"); +``` + +See [`collection.properties()`](../../develop/javascript-api/@arangodb/collection-object.md#collectionpropertiesproperties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_db/mydb/_api/collection/coll/properties +``` + +See the [`GET /_db/{database-name}/_api/collection/{collection-name}/properties`](../../develop/http-api/collections.md#get-the-properties-of-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const props = await coll.properties(); +console.log(props); +``` + +See [`DocumentCollection.properties()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#properties) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +if err != nil { + fmt.Println(err) +} else { + props, err := coll.Properties(ctx) + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%+v", props) + } +} +``` + +See [`Collection.Properties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Collection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); +CollectionPropertiesEntity props = coll.getProperties(); +``` + +See [`ArangoCollection.getProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#getProperties%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") +props = coll.properties() +``` + +See [`Collection.properties()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.Collection.properties) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Set the collection properties + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +4. The properties you can change are listed in the **Settings**, + **Computed Values**, and **Schema** tabs. +5. Make the desired changes and click the **Save** button. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_set_collection_properties +type: cluster +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); +coll.properties({ + waitForSync: true, + replicationFactor: 3 +}); +~db._drop("coll"); +``` + +See [`collection.properties()`](../../develop/javascript-api/@arangodb/collection-object.md#collectionpropertiesproperties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XPUT -d '{"waitForSync":true,"replicationFactor":3}' http://localhost:8529/_db/mydb/_api/collection/coll/properties +``` + +See the [`PUT /_db/{database-name}/_api/collection/{collection-name}/properties`](../../develop/http-api/collections.md#change-the-properties-of-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const props = await coll.properties({ + waitForSync: true, + replicationFactor: 3 +}); +``` + +See [`DocumentCollection.properties()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#properties.properties-2) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +if err != nil { + fmt.Println(err) +} else { + err := coll.SetProperties(ctx, arangodb.SetCollectionPropertiesOptions{ + WaitForSync: utils.NewType(true), + ReplicationFactor: 3, + }) + if err != nil { + fmt.Println(err) + } +} +``` + +See [`Collection.SetProperties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Collection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +CollectionPropertiesOptions options = new CollectionPropertiesOptions() + .waitForSync(true) + .replicationFactor(ReplicationFactor.of(3)); + +ArangoCollection coll = db.collection("coll"); +CollectionPropertiesEntity props = coll.changeProperties(options); +``` + +See [`ArangoCollection.changeProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#changeProperties%28com.arangodb.model.CollectionPropertiesOptions%29) +and [`CollectionPropertiesEntity`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/entity/CollectionPropertiesEntity.html) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") +props = coll.configure( + sync=True, + replication_factor=3 +) +``` + +See [`Collection.configure()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.Collection.configure) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Remove a collection + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +4. Go to the **Settings** tab. +5. Click the **Delete** button and confirm the deletion. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_delete_collection +render: input +description: '' +--- +~db._create("coll"); +db._drop("coll"); +``` + +See [`db._drop()`](../../develop/javascript-api/@arangodb/db-object.md#db_dropcollection--options) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XDELETE http://localhost:8529/_db/mydb/_api/collection/coll +``` + +See the [`DELETE /_db/{database-name}/_api/collection/{collection-name}`](../../develop/http-api/collections.md#drop-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const status = await coll.drop(); +``` + +See [`DocumentCollection.drop()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#drop) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +if err != nil { + fmt.Println(err) +} else { + err = coll.Remove(ctx) + if err != nil { + fmt.Println(err) + } +} +``` + +See [`Collection.Remove()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Collection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); +coll.drop(); +``` + +See [`ArangoCollection.drop()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#drop%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +ok = db.delete_collection("coll") +``` + +See [`StandardDatabase.delete_collection()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.delete_collection) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/concepts/data-structure/databases.md b/site/content/arangodb/oem/concepts/data-structure/databases.md new file mode 100644 index 0000000000..42f4855703 --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/databases.md @@ -0,0 +1,604 @@ +--- +title: Databases +menuTitle: Databases +weight: 5 +description: >- + Databases let you create fully isolated sets of collections for multi-tenancy + applications +--- +ArangoDB can handle multiple databases in the same server instance. Databases +can be used to logically group and separate data. An ArangoDB database consists +of collections and dedicated database-specific worker processes. A database +contains its own collections (which cannot be accessed from other databases), +Foxx applications, and replication loggers and appliers. Each ArangoDB database +contains its own system collections (e.g. `_users`, `_graphs`, ...). + +There is always at least one database in ArangoDB. This is the default +database named `_system`. This database cannot be dropped and provides special +operations for creating, dropping, and enumerating databases. + +You can create additional databases and give them unique names to access them +later. You need to be in the `_system` database for executing database management +operations. They cannot be initiated while in a user-defined database. + +## Database names + +You can give each database you create a name to identify and access it. +The name needs to be unique and conform to the naming constraints for databases. + +There are two naming constraints available for database names: the **traditional** +and the **extended** naming constraints. Whether the former or the latter are +active depends on the `--database.extended-names` startup option. +The extended naming constraints are used if enabled, allowing many special and +UTF-8 characters in database names. If set to `false` (default), the traditional +naming constraints are enforced. + +{{< info >}} +The extended naming constraints are an **experimental** feature +but they will become the norm in a future version. Check if your drivers and +client applications are prepared for this feature before enabling it. +{{< /info >}} + +The restrictions for database names are as follows: + +- For the **traditional** naming constraints: + - Database names must only consist of the letters `a` to `z` (both lower and + upper case allowed), the numbers `0` to `9`, and the underscore (`_`) or + dash (`-`) symbols. + This also means that any non-ASCII database names are not allowed. + - Database names must always start with a letter. Database names starting + with an underscore are considered to be system databases, and users should + not create or delete those. + - The maximum allowed length of a database name is 64 bytes. + - Database names are case-sensitive. + +- For the **extended** naming constraints: + - Names can consist of most UTF-8 characters, such as Japanese or Arabic + letters, emojis, letters with accentuation. Some ASCII characters are + disallowed, but less compared to the _traditional_ naming constraints. + - Names cannot contain the characters `/` or `:` at any position, nor any + control characters (below ASCII code 32), such as `\n`, `\t`, `\r`, and `\0`. + - Spaces are accepted, but only in between characters of the name. Leading + or trailing spaces are not allowed. + - `.` (dot), `_` (underscore) and the numeric digits `0`-`9` are not allowed + as first character, but at later positions. + - Database names are case sensitive. + - Database names containing UTF-8 characters must be + [NFC-normalized](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). + Non-normalized names will be rejected by arangod. + - The maximum length of a database name is 128 bytes after normalization. + As a UTF-8 character may consist of multiple bytes, this does not necessarily + equate to 128 characters. + + Example database names that can be used with the _extended_ naming constraints: + `España`, `😀`, `犬`, `كلب`, `@abc123`, `København`, `München`, `Бишкек`, `abc? <> 123!` + +{{< warning >}} +While it is possible to change the value of the +`--database.extended-names` option from `false` to `true` to enable +extended names, the reverse is not true. Once the extended names have been +enabled, they remain permanently enabled so that existing databases, +collections, Views, and indexes with extended names remain accessible. + +Please be aware that dumps containing extended names cannot be restored +into older versions that only support the traditional naming constraints. In a +cluster setup, it is required to use the same naming constraints for all +Coordinators and DB-Servers of the cluster. Otherwise, the startup is +refused. In DC2DC setups it is also required to use the same naming +constraints for both datacenters to avoid incompatibilities. +{{< /warning >}} + +## Notes + +- Each database contains its own system collections, which ArangoDB has to set + up when a database is created. This makes the creation of a database take a while. +- Replication can be configured globally or on a per-database level. In the + latter case, you need to configure any replication logging or applying for new + databases explicitly after they have been created. +- Foxx applications are only available in the context of the database they have + been installed in. A new database only provides access to the system + applications shipped with ArangoDB (mainly the web interface). You need to + explicitly install other Foxx applications. + +## Database organization on disk + +Data is physically stored in `.sst` files in a sub-directory `engine-rocksdb` +that resides in the instance's data directory. A single file can contain +documents of various collections and databases. + +ArangoSearch stores data in database-specific directories underneath the +`databases` folder. + +Foxx applications are also organized in database-specific directories but inside +the application path. The filesystem layout could look like this: + +``` +apps/ # the instance's application directory + system/ # system applications (can be ignored) + _db/ # sub-directory containing database-specific applications + <database-dir>/ # sub-directory for a single database + <mountpoint>/APP # sub-directory for a single application + <mountpoint>/APP # sub-directory for a single application + <database-dir>/ # sub-directory for another database + <mountpoint>/APP # sub-directory for a single application +``` + +The name of `<database-dir>` will be the database's original name or the +database's ID if its name contains special characters. + +## Database interfaces + +The following sections show examples of how you can use the APIs of ArangoDB and +the official drivers, as well as the ArangoDB Shell and the built-in web interface, +to perform common operations related to databases. For less common operations +and other drivers, see the corresponding reference documentation. + +### Set the database context + +Connections in ArangoDB do not contain any state information. All state +information is contained in the request/response data of the HTTP API that all +clients use under the hood. If the database is changed, client drivers need to +store the current database name on their side to later make requests with the +selected database as the context. + +Note that commands, actions, scripts, or AQL queries should never +access multiple databases, even if they exist. The only intended and +supported way in ArangoDB is to use one database at a time for a command, +an action, a script, or a query. Operations started in one database must +not switch the database later and continue operating in another. + +Foxx applications are only available in the context of the database they have +been installed in. A new database only provides access to the system +applications shipped with ArangoDB (the web interface) and no other Foxx +applications until they are explicitly installed for a particular database. + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If you are logged in, click the name of the current database or the swap icon + in the top-right corner. +2. Select a database from the dropdown list. It only lists databases you have at + least read access to. +3. Click **Select DB**. +{{< /tab >}} + +{{< tab "arangosh" >}} +When you have an established connection to ArangoDB, the current +database can be changed explicitly using the `db._useDatabase()` +method. This switches to the specified database (provided it +exists and the user can connect to it). From this point on, any +following action in the same shell or connection uses the +specified database, unless specified otherwise. + +```js +--- +name: arangosh_use_database +description: '' +--- +~db._createDatabase("mydb"); +db._useDatabase("mydb"); +~db._useDatabase("_system"); +~db._dropDatabase("mydb"); +``` + +See [`db._useDatabase()`](../../develop/javascript-api/@arangodb/db-object.md#db_usedatabasename) +in the _JavaScript API_ for details. + +It is also possible to specify a database name when invoking arangosh. For this +purpose, use the `--server.database` startup option: + +```sh +arangosh --server.database mydb +``` +{{< /tab >}} + +{{< tab "cURL" >}} +Setting the database context is not an operation, you rather specify the database in +the URL like a prefix for the path of an endpoint. Omitting `/_db/{database-name}` +is the same as specifying `/_db/_system`. + +```sh +curl http://localhost:8529/_db/mydb/... +``` + +See [Addresses of databases](../../develop/http-api/databases.md#addresses-of-databases) +in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +// Default host and the _system database +const db = new Database(); + +// New connection pool +const myDb = new Database("http://localhost:8529", "mydb"); + +// Same connection pool +const otherDb = myDb.database("other"); +``` + +See [`new Database()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#constructor) +and [`Database.database()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#database) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +db, err := client.GetDatabase(ctx, "_system", /* options */ nil) +if err != nil { + fmt.Println(err) +} else { + _ = db // Use db here +} +``` + +See [`ClientDatabase.GetDatabase()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ClientDatabase) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoDatabase db = arangoDB.db(); // Default _system database +ArangoDatabase mydb = arangoDB.db("mydb"); +``` + +See [`ArangoDB.db()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDB.html#db%28java.lang.String%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +sys_db = client.db() // Default _system database + +db = client.db("mydb") +``` + +See [`ArangoClient.db()`](https://docs.python-arango.com/en/main/specs.html#arango.client.ArangoClient.db) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Create a database + +Each database contains its own system collections, which need to be set up when +a database is created. The creation of a database can therefore take a moment. + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Switch to the `_system` database. +2. Click **DATABASES** in the main navigation. +3. Click **Add database**. +4. Set a **Name** and optionally configuration options. +5. Click **Create**. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_create_database +description: '' +--- +var ok = db._useDatabase("_system"); // _system database context required +db._createDatabase("mydb"); +~db._dropDatabase("mydb"); +``` + +See [`db._createDatabase()`](../../develop/javascript-api/@arangodb/db-object.md#db_createdatabasename--options--users) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -d '{"name":"mydb"}' http://localhost:8529/_api/database +``` + +See the [`POST /_db/_system/_api/database`](../../develop/http-api/databases.md#create-a-database) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +const myDb = await db.createDatabase("mydb"); +``` + +See [`Database.createDatabase()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#createDatabase) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +mydb, err := client.CreateDatabase(ctx, "mydb", /* options */ nil) +_ = mydb +``` + +See [`ClientDatabase.CreateDatabase()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ClientDatabase) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +Boolean ok = arangoDB.createDatabase("mydb"); +// -- or -- +ArangoDatabase db = arangoDB.db("mydb"); +Boolean ok = db.create(); +``` + +See [`ArangoDB.createDatabase()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDB.html#createDatabase%28java.lang.String%29) +and [`ArangoDatabase.create()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html#create%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +sys_db = client.db("_system") # _system database context required +ok = sys_db.create_database("mydb") +db = client.db("mydb") +``` + +See [`StandardDatabase.create_database()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.create_database) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Get a database + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Switch to the `_system` database. +2. Click **DATABASES** in the main navigation. +3. Click the gear icon in the top-right corner of the database's card. + +To switch to the desired database, see [Set the database context](#set-the-database-context). +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_get_database +description: '' +--- +~db._createDatabase("mydb"); +var ok = db._useDatabase("mydb"); +db._properties(); +~db._useDatabase("_system"); +~db._dropDatabase("mydb"); +``` + +See [`db._properties()`](../../develop/javascript-api/@arangodb/db-object.md#db_properties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_db/mydb/_api/database/current +``` + +See the [`GET /_db/{database-name}/_api/database/current`](../../develop/http-api/databases.md#get-information-about-the-current-database) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +const myDb = db.database("mydb"); +const info = await myDb.get(); +``` + +See [`Database.get()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#get) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +db, err := client.GetDatabase(ctx, "mydb", nil) +if err != nil { + fmt.Println(err) +} else { + info, err := db.Info(ctx) + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%+v", info) + } +} +``` + +See [`Database.GetDatabase()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Database) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoDatabase db = arangoDB.db("mydb"); +DatabaseEntity info = db.getInfo(); +``` + +See [`ArangoDatabase.getInfo()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html#getInfo%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +db = client.db("mydb") +info = db.properties() +``` + +See [`StandardDatabase.properties()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.properties) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### List all databases + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Switch to the `_system` database. +2. Click **DATABASES** in the main navigation. +3. All databases are listed, given that the **Search** field is empty. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_list_databases +description: '' +--- +~db._createDatabase("mydb"); +var ok = db._useDatabase("_system"); // _system database context required +db._databases(); +~db._dropDatabase("mydb"); +``` + +See [`db._databases()`](../../develop/javascript-api/@arangodb/db-object.md#db_databases) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_api/database +``` + +See the [`GET /_db/_system/_api/database`](../../develop/http-api/databases.md#list-all-databases) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +const dbs = await db.databases(); +console.log(dbs.map(d => d.name)) +``` + +See [`Database.databases()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#databases) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +dbs, err := client.Databases(ctx) +if err != nil { + fmt.Println(err) +} else { + for _, d := range dbs { + fmt.Println(d.Name()) + } +} +``` + +See [`ClientDatabase.Databases()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ClientDatabase) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +Collection<String> dbNames = arangoDB.getDatabases(); +``` + +See [`ArangoDB.getDatabases()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDB.html#getDatabases%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +sys_db = client.db("_system") # _system database context required +db_names = sys_db.databases() +``` + +See [`StandardDatabase.databases()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.databases) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Remove a database + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Switch to the `_system` database. +2. Click **DATABASES** in the main navigation. +3. Click the gear icon in the top-right corner of the database's card that you + want to delete. +4. Click the **Delete** button and confirm the deletion. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_delete_database +description: '' +--- +~db._createDatabase("mydb"); +var ok = db._useDatabase("_system"); // _system database context required +db._dropDatabase("mydb"); +``` + +See [`db._dropDatabase()`](../../develop/javascript-api/@arangodb/db-object.md#db_dropdatabasename) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XDELETE http://localhost:8529/_api/database/mydb +``` + +See the [`DELETE /_db/_system/_api/database/{database-name}`](../../develop/http-api/databases.md#drop-a-database) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +const ok = await db.dropDatabase("mydb"); +``` + +See [`Database.dropDatabase()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#dropDatabase) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +db, err := client.GetDatabase(ctx, "mydb", nil) +if err != nil { + fmt.Println(err) +} else { + err = db.Remove(ctx) + if err != nil { + fmt.Println(err) + } +} +``` + +See [`Database.Remove()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Database) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoDatabase db = arangoDB.db("mydb"); +Boolean ok = db.drop(); +``` + +See [`ArangoDatabase.drop()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html#drop%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +sys_db = client.db("_system") # _system database context required +ok = sys_db.delete_database("mydb") +``` + +See [`StandardDatabase.delete_database()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.delete_database) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/concepts/data-structure/documents/_index.md b/site/content/arangodb/oem/concepts/data-structure/documents/_index.md new file mode 100644 index 0000000000..f692f5fe5a --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/documents/_index.md @@ -0,0 +1,1135 @@ +--- +title: Documents +menuTitle: Documents +weight: 15 +description: >- + Documents are self-contained units of information, each typically representing + a single record or instance of an entity +--- +Documents in ArangoDB are JSON objects that contain structured or semi-structured +data. They are stored in [collections](../collections.md). + +Each document has an immutable key that identifies it within a collection, and +an identifier derived from the key that uniquely identifies it within a +[database](../databases.md). + +<!-- TODO: better explain what they are used for and how +Documents can be stored, updated, and retrieved using various database management techniques, such as indexing, querying, and aggregation. They provide a flexible and scalable way to organize and manage data, particularly for applications that deal with unstructured or semi-structured data, such as content management systems, social media platforms, and e-commerce websites. + +Maybe also: You can store unstructured data in the form of text as attribute values. +--> + +## Data types + +Documents can store primitive values, lists of values, and nested objects +(to any depth). JSON and thus ArangoDB supports the following data types: + +- `null` to represent the absence of a value, also known as _nil_ or _none_ type. +- `true` and `false`, the Boolean values, to represent _yes_ and + _no_, _on_ and _off_, etc. +- **numbers** to store integer and floating-point values. +- **strings** to store character sequences for text, encoded as UTF-8. +- **arrays** to store lists that can contain any of the supported data types + as elements, including nested arrays and objects. +- **objects** to map keys to values like a dictionary, also known as + associative arrays or hash maps. The keys are strings and the values can be + any of the supported data types, including arrays and nested objects. + +Example document: + +```json +{ + "_id" : "myusers/3456789", + "_key" : "3456789", + "_rev" : "14253647", + "firstName" : "John", + "lastName" : "Doe", + "address" : { + "street" : "Road To Nowhere 1", + "city" : "Gotham" + }, + "hobbies" : [ + { "name": "swimming", "howFavorite": 10 }, + { "name": "biking", "howFavorite": 6 }, + { "name": "programming", "howFavorite": 4 } + ] +} +``` + +## System attributes + +All documents contain special attributes at the top-level that start with an +underscore, known as **system attributes**: + +- The **document key** is stored as a string in the `_key` attribute. +- The **document identifier** is stored as a string in the `_id` attribute. +- The **document revision** is stored as a string in the `_rev` attribute. + +You can specify a value for the `_key` attribute when creating a document. +The `_id` attribute is automatically set based on the collection and `_key`. +The `_id` and `_key` values are immutable once the document has been created. +The `_rev` value is maintained by ArangoDB automatically. + +Edge documents in edge collections have two additional system attributes: + +- The document identifier of the source vertex stored in the `_from` attribute. +- The document identifier of the target vertex stored in the `_to` attribute. + +More system attributes may get added in the future without notice. Therefore, +you should avoid using own attribute names starting with an underscore. + +### Document keys + +Each document has a unique **document key** (or _primary key_) which identifies +it within its collection. + +To distinguish between documents from multiple collections, see +[Document identifiers](#document-identifiers). + +A document key uniquely identifies a document in the collection it is +stored in. It can and should be used by clients when specific documents +are queried. The document key is stored in the `_key` attribute of +each document. The key values are automatically indexed by ArangoDB in +a collection's primary index. Thus looking up a document by its +key is a fast operation. The `_key` value of a document is +immutable once the document has been created, which means it cannot be changed. + +Keys are case-sensitive, i.e. `myKey` and `MyKEY` are considered to be +different keys. + +By default, ArangoDB generates a document key automatically if no `_key` +attribute is specified. Otherwise, it uses the `_key` you provide. +This behavior can be changed on a per-collection level by creating +collections with the `keyOptions` attribute. Using `keyOptions`, it is possible +to disallow user-specified keys completely, or to force a specific regime for +auto-generating the `_key` values. + +{{< warning >}} +You should not use both user-specified and automatically generated document keys +in the same collection in cluster deployments for collections with more than a +single shard. Mixing the two can lead to conflicts because Coordinators that +auto-generate keys in this case are not aware of all keys which are already used. +{{< /warning >}} + +#### User-specified keys + +If you allow user-specified keys, you can pick the key values as required, +provided that the values conform to the following restrictions: + +- The key must be a string value. Numeric keys are not allowed, but any numeric + value can be put into a string and can then be used as document key. +- The key must be at least 1 byte and at most 254 bytes long. Empty keys are + disallowed when specified (though it may be valid to completely omit the + `_key` attribute from a document). +- It must consist of the letters `A` to `Z` (lower- and uppercase), the digits + `0` to `9`, or any of the following punctuation characters: + `_` `-` `.` `@` `(` `)` `+` `,` `=` `;` `$` `!` `*` `'` `%` `:` + {{< info >}} + Avoid using `:` in document keys as this can conflict with the requirements of + [EnterpriseGraphs](../../../graphs/enterprisegraphs/_index.md), + [SmartGraphs](../../../graphs/smartgraphs/_index.md), and + [SmartJoins](../../../develop/smartjoins.md#smartjoins-using-smartjoinattribute) + which use the colon character as a separator in keys. + {{< /info >}} +- Any other characters, especially multi-byte UTF-8 sequences, whitespace, or + punctuation characters not listed above cannot be used inside key values. +- The key must be unique within the collection it is used in. + +{{< info >}} +When working with named graphs, their names are used as document keys in the +`_graphs` system collection. Therefore, the same document key restrictions apply. +{{< /info >}} + +#### Automatically generated keys + +There are no guarantees about the format and pattern of auto-generated document +keys other than the above restrictions. Clients should therefore treat +auto-generated document keys as opaque values and not rely on their format. + +The default format for generated keys is a string containing numeric digits. +The numeric values reflect chronological time in the sense that `_key` values +generated later contain higher numbers than `_key` values generated earlier. +However, the exact value that is generated by the server is not predictable. +Note that if you sort on the `_key` attribute, string comparison is used, +which means `"100"` is less than `"99"` etc. + +### Document identifiers + +A document identifier (or _document handle_) uniquely identifies a document +across all collections within the same database. It consists of the collection's +name and the document key (the value of the `_key` attribute), separated by a +forward slash (`/`), like `collection-name/document-key`. + +See [Collection names](../collections.md#collection-names) and +[Document keys](#document-keys) for information about the allowed characters. + +When working with documents from multiple collections, you can see what +collections they are from by looking at the `_id` attribute values and tell +documents from different collections but the same keys apart. + +### Document revisions + +Every document in ArangoDB has a revision, stored in the system attribute +`_rev`. It is fully managed by the server and read-only for the user. + +Its value should be treated as opaque, no guarantees regarding its format +and properties are given except that it will be different after a +document update. More specifically, `_rev` values are unique across all +documents and all collections in a single server setup. In a cluster setup, +within one shard it is guaranteed that two different document revisions +have a different `_rev` string, even if they are written in the same +millisecond. + +The `_rev` attribute can be used as a pre-condition for queries, to avoid +_lost update_ situations. That is, if a client fetches a document from the server, +modifies it locally (but with the `_rev` attribute untouched) and sends it back +to the server to update the document, but meanwhile the document has been changed by +another operation, then the revisions do not match anymore and the operation +is cancelled by the server. Without this mechanism, the client would +accidentally overwrite changes made to the document without knowing about it. + +When an existing document is updated or replaced, ArangoDB writes a new +version of this document to the write-ahead logfile (regardless of the +storage engine). When the new version of the document has been written, the +old version(s) is still present, at least on disk. The same is true when +an existing document (version) gets removed: the old version of the document +plus the removal operation are on disk for some time. + +On disk, it is therefore possible that multiple revisions of the same document +(as identified by the same `_key` value) exist at the same time. However, +stale revisions **are not accessible**. Once a document has been updated or removed +successfully, no query or other data retrieval operation done by the user +is able to see it any more. Every transaction only ever sees a single revision +of a document. Furthermore, after some time, old revisions +are removed internally. This is to avoid ever-growing disk usage. + +{{< warning >}} +From a **user perspective**, there is just **one single document revision +present per different `_key`** at every point in time. There is no built-in +system to automatically keep a history of all changes done to a document +and old versions of a document cannot be restored via the `_rev` value. +{{< /warning >}} + +## Attribute names + +You can pick attribute names for document attributes as desired, provided the +following naming constraints are not violated: + +- Attribute names starting with an underscore are considered to be system + attributes for ArangoDB's internal use. You should avoid using own + attribute names starting with an underscore. + +- Theoretically, attribute names can include punctuation and special characters + as desired, provided the name is a valid UTF-8 string. For maximum + portability, special characters should be avoided, however. + + For example, attribute names may contain the dot character (`.`), but it has a + special meaning in JavaScript and also in AQL. When using such attribute names + in one of these languages, the attribute name needs to be quoted. + + Overall, it is recommended to use attribute names which don't require any + quoting or escaping in all languages used. This includes languages used by + clients, such as Ruby and PHP, if the attributes are automatically mapped to + object members. + +- Attribute names starting with an at sign (`@`) need to be enclosed in + backticks or forward ticks when used in AQL queries to tell them apart from + bind variables. Similarly, characters like `+`, `-`, `*`, `/`, and `%` are + operators in AQL and require the use of backticks or forward ticks, too. + This does not apply if you use the bracket notation with the attribute name as + a string. + +- The dot character (`.`) and the character sequence `[*]` are special in + ArangoDB index definitions, preventing you from creating indexes over + attributes that include them in their names. + +- ArangoDB does not enforce a length limit for attribute names. However, long + attribute names may use more memory in result sets etc. Therefore the use + of long attribute names is discouraged. + +- Attributes with empty names (using an empty string `""`) are possible but + discouraged. For example, indexes cannot be created over such attributes and + drivers may not support empty names. + +- Attribute names are case-sensitive. + +## Document interfaces + +The following sections show examples of how you can use the APIs of ArangoDB and +the official drivers, as well as the ArangoDB shell and the built-in web interface, +to perform common operations related to documents. For less common operations +and other drivers, see the corresponding reference documentation. + +### Create documents + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **COLLECTIONS** in the main navigation. +2. Click the card of the desired collection. +3. Go to the **Content** tab. +4. Click the plus icon on the right-hand side. +5. In the **Create Document** dialog, optionally enter a document key (**_key**) + and a **Document body**. +6. Click the **Create** button. + +You can also create documents with AQL queries using the +[`INSERT` operation](../../../aql/high-level-operations/insert.md) +in the **Queries** section. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_create_documents +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); + +// Single document +coll.insert({ + _key: "the-document-key", + name: "ArangoDB", + tags: ["graph", "database", "NoSQL"], + scalable: true, + company: { + name: "ArangoDB Inc.", + founded: 2015 + } +}); + +// Multiple documents +coll.insert([ { _key: "one" }, { _key: "two" }, { _key: "three" } ]); +~db._drop("coll"); +``` +See [`collection.insert()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectioninsertdata--options) +(and the `collection.save()` alias) in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +# Single document +curl -d '{"_key":"the-document-key","name":"ArangoDB","tags":["graph","database","NoSQL"],"scalable":true,"company":{"name":"ArangoDB Inc.","founded":2015}}' http://localhost:8529/_db/mydb/_api/document/coll + +# Multiple documents +curl -d '[{"_key":"one"},{"_key":"two"},{"_key":"three"}]' http://localhost:8529/_db/mydb/_api/document/coll +``` + +See the `POST /_db/{database-name}/_api/document/{collection-name}` endpoint for +[a single document](../../../develop/http-api/documents.md#create-a-document) +and [multiple documents](../../../develop/http-api/documents.md#create-multiple-documents) +in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); + +// Single document +const result = await coll.save({ + _key: "the-document-key", + name: "ArangoDB", + tags: ["graph", "database", "NoSQL"], + scalable: true, + company: { + name: "ArangoDB Inc.", + founded: 2015 + } +}); + +// Multiple documents +const results = await coll.saveAll([ { _key: "one" }, { _key: "two" }, { _key: "three" } ]); +``` + +See [`DocumentCollection.save()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#save) +and [`DocumentCollection.saveAll()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#saveAll) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) + +// Single document +createRes, err := coll.CreateDocument(ctx, map[string]interface{}{ + "_key": "the-document-key", + "name": "ArangoDB", + "tags": []interface{}{"graph", "database", "NoSQL"}, + "scalable": true, + "company": map[string]interface{}{ + "name": "ArangoDB Inc.", + "founded": 2015, + }, +}) + +if err != nil { + fmt.Println(err) +} else { + fmt.Printf("Metadata: %+v\n\n", createRes.DocumentMeta) +} + +// Multiple documents +var createdDoc map[string]interface{} + +createResReader, err := coll.CreateDocumentsWithOptions(ctx, []interface{}{ + map[string]interface{}{"_key": "one"}, + map[string]interface{}{"_key": "two"}, + map[string]interface{}{"_key": "three"}, +}, &arangodb.CollectionDocumentCreateOptions{ + NewObject: &createdDoc, +}) + +for { + createdDoc = nil // Reset to not leak attributes of previous documents + meta, err := createResReader.Read() + if shared.IsNoMoreDocuments(err) { + break + } else if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Metadata: %+v\n", meta.DocumentMeta) + fmt.Printf("Full document: %v\n\n", createdDoc) + } +} +``` + +See the following functions +in the [_go-driver_ v2 documentation](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#CollectionDocumentCreate) +for details: +- `CollectionDocumentCreate.CreateDocument()` +- `CollectionDocumentCreate.CreateDocumentWithOptions()` +- `CollectionDocumentCreate.CreateDocuments()` +- `CollectionDocumentCreate.CreateDocumentsWithOptions()` +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); + +// Single document +BaseDocument doc = new BaseDocument("the-document-key"); +doc.addAttribute("name", "ArangoDB"); +doc.addAttribute("tags", List.of("graph", "database", "NoSQL")); +doc.addAttribute("scalable", true); +doc.addAttribute("company", Map.of( + "name", "ArangoDB Inc.", + "founded", 2015 +)); +doc.addAttribute("name", "ArangoDB"); +coll.insertDocument(doc); + +// Multiple documents +coll.insertDocuments(List.of( + new BaseDocument("one"), + new BaseDocument("two"), + new BaseDocument("three") +)); +``` + +See [`ArangoCollection.insertDocument()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#insertDocument%28java.lang.Object%29) +and [`ArangoCollection.insertDocuments()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#insertDocuments%28java.lang.Iterable%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") + +# Single document +meta = coll.insert({ + "_key": "the-document-key", + "name": "ArangoDB", + "tags": [ "graph", "database", "NoSQL" ], + "scalable": True, + "company": { + "name": "ArangoDB Inc.", + "founded": 2015, + } +}) + +# Multiple documents +meta = coll.insert_many([ + { "_key": "one" }, + { "_key": "two" }, + { "_key": "three" } +]) +``` + +See [`StandardCollection.insert()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.insert) +and [`StandardCollection.insert_many()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.insert_many) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Get documents + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **COLLECTIONS** in the main navigation. +2. Click the card of the desired collection. +3. Go to the **Content** tab. +4. You may click the filter icon to filter and sort by document attributes. +5. Click a row to open the full document. + +You can also retrieve documents with AQL queries using the +[`FOR` operation](../../../aql/high-level-operations/insert.md) +in the **Queries** section. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_get_documents +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); + +~coll.insert({ +~ _key: "the-document-key", +~ name: "ArangoDB", +~ tags: ["graph", "database", "NoSQL"], +~ scalable: true, +~ company: { +~ name: "ArangoDB Inc.", +~ founded: 2015 +~ } +~}); +~coll.insert([ { _key: "one" }, { _key: "two" }, { _key: "three" } ]); + +// Single document +coll.document("the-document-key"); + +// Multiple documents +coll.document([ "one", "two", { _key: "three" } ]); + +~db._drop("coll"); +``` + +See [`collection.document()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectiondocumentobject--options) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +# Single document +curl http://localhost:8529/_db/mydb/_api/document/coll/the-document-key + +# Multiple documents +# Note the PUT method in combination with the onlyget=true query parameter! +curl -XPUT -d '["one","two",{"_key":"three"}]' http://localhost:8529/_db/mydb/_api/document/coll?onlyget=true +``` + +See the following endpoints in the _HTTP API_ for details: +- [`GET /_db/{database-name}/_api/document/{collection-name}/{document-key}`](../../../develop/http-api/documents.md#get-a-document) +- [`PUT /_db/{database-name}/_api/document/{collection-name}?onlyget=true`](../../../develop/http-api/documents.md#get-multiple-documents) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); + +// Single document +const result = await coll.document("the-document-key"); + +// Multiple documents +const results = await coll.documents(["one", "two", { _key: "three" } ]); +``` + +See [`DocumentCollection.document()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#document) +and [`DocumentCollection.documents()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#documents) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) + +// Single document +var doc map[string]interface{} +meta, err := coll.ReadDocument(ctx, "the-document-key", &doc) +if err != nil { + fmt.Println(err) +} else { + fmt.Printf("Metadata: %+v\n", meta) + fmt.Printf("Full document: %v\n\n", doc) +} + +// Multiple documents +readResReader, err := coll.ReadDocuments(ctx, []string{"one", "two", "three"}) +for { + doc = nil // Reset to not leak attributes of previous documents + readRes, err := readResReader.Read(&doc) + if shared.IsNoMoreDocuments(err) { + break + } else if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Read response: %+v\n", readRes.DocumentMeta) + fmt.Printf("Full document: %v\n\n", doc) + } +} +``` + +See the following functions +in the [_go-driver_ v2 documentation](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#CollectionDocumentRead) +for details: +- `CollectionDocumentRead.ReadDocument()` +- `CollectionDocumentRead.ReadDocumentWithOptions()` +- `CollectionDocumentRead.ReadDocuments()` +- `CollectionDocumentRead.ReadDocumentsWithOptions()` +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); + +// Single document +BaseDocument doc = coll.getDocument("the-document-key", BaseDocument.class); +System.out.println(doc); + +// Multiple documents +MultiDocumentEntity<BaseDocument> docs = coll.getDocuments(List.of("one", "two2", "three"), BaseDocument.class); +docs.getDocuments().forEach(d -> System.out.println(d)); +``` + +See [`ArangoCollection.getDocument()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#getDocument%28java.lang.String,java.lang.Class%29) +and [`ArangoCollection.getDocuments()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#getDocuments%28java.lang.Iterable,java.lang.Class%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") + +# Single document +doc = coll.get("the-document-key") + +# Multiple documents +docs = coll.get_many(["one", "two", { "_key": "three" } ]) +``` + +See [`StandardCollection.get()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.get) +and [`StandardCollection.get_many()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.get_many) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Update documents + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **COLLECTIONS** in the main navigation. +2. Click the card of the desired collection. +3. Go to the **Content** tab. +4. You may click the filter icon to filter and sort by document attributes. +5. Click a row to open the full document. +6. Adjust the document in the editor. +7. Click the **Save** button at the bottom. + +You can also partially modify documents with AQL queries using the +[`UPDATE` operation](../../../aql/high-level-operations/update.md) +in the **Queries** section. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_update_documents +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); + +~coll.insert({ +~ _key: "the-document-key", +~ name: "ArangoDB", +~ tags: ["graph", "database", "NoSQL"], +~ scalable: true, +~ company: { +~ name: "ArangoDB Inc.", +~ founded: 2015 +~ } +~}); +~coll.insert([ { _key: "one" }, { _key: "two" }, { _key: "three" } ]); + +coll.update("the-document-key", { logo: "avocado" }, { returnNew: true }); +coll.update([ "one", "two", { _key: "three" } ], [ { val: 1 }, { val: 2 }, { val: 3 } ]); +~db._drop("coll"); +``` + +See [`collection.update()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectionupdatedocument-data--options) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +# Single document +curl -XPATCH -d '{"logo":"avocado"}' http://localhost:8529/_db/mydb/_api/document/coll/the-document-key?returnNew=true + +# Multiple documents +curl -XPATCH -d '[{"_key":"one","val":1},{"_key":"two","val":2},{"_key":"three","val":3}]' http://localhost:8529/_db/mydb/_api/document/coll +``` + +See the following endpoints in the _HTTP API_ for details: +- [`PATCH /_db/{database-name}/_api/document/{collection-name}/{document-key}`](../../../develop/http-api/documents.md#update-a-document) +- [`PATCH /_db/{database-name}/_api/document/{collection-name}`](../../../develop/http-api/documents.md#update-multiple-documents) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); + +// Single document +const result = await coll.update("the-document-key", { logo: "avocado" }, { returnNew: true }); + +// Multiple documents +const results = await coll.updateAll([ { _key: "one", val: 1 }, { _key: "two", val: 2 }, { _key: "three", val: 3 } ]); +``` + +See [`DocumentCollection.update()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#update) +and [`DocumentCollection.updateAll()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#updateAll) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) + +var newDoc map[string]interface{} + +// Single document +newAttributes := map[string]interface{}{ + "logo": "avocado", +} +updateRes, err := coll.UpdateDocumentWithOptions(ctx, "the-document-key", newAttributes, &arangodb.CollectionDocumentUpdateOptions{ + NewObject: &newDoc, +}) +if err != nil { + fmt.Println(err) +} else { + fmt.Printf("Metadata: %+v\n", updateRes.DocumentMetaWithOldRev) + fmt.Printf("Full document: %v\n\n", newDoc) +} + +// Multiple documents +updateDocs := []interface{}{ + map[string]interface{}{"_key": "one", "val": 1}, + map[string]interface{}{"_key": "two", "val": 2}, + map[string]interface{}{"_key": "three", "val": 3}, +} + +updateResReader, err := coll.UpdateDocumentsWithOptions(ctx, updateDocs, &arangodb.CollectionDocumentUpdateOptions{ + NewObject: &newDoc, +}) +for { + newDoc = nil // Reset to not leak attributes of previous documents + updateRes, err := updateResReader.Read() + if shared.IsNoMoreDocuments(err) { + break + } else if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Metadata: %+v\n", updateRes.DocumentMetaWithOldRev) + fmt.Printf("Full document: %v\n\n", newDoc) + } +} +``` + +See the following functions +in the [_go-driver_ v2 documentation](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#CollectionDocumentUpdate) +for details: +- `CollectionDocumentUpdate.UpdateDocument()` +- `CollectionDocumentUpdate.UpdateDocumentWithOptions()` +- `CollectionDocumentUpdate.UpdateDocuments()` +- `CollectionDocumentUpdate.UpdateDocumentsWithOptions()` +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); + +// Single document +BaseDocument doc = new BaseDocument("the-document-key"); +doc.addAttribute("logo", "avocado"); +DocumentUpdateEntity<BaseDocument> result = coll.updateDocument( + "the-document-key", + doc, + new DocumentUpdateOptions().returnNew(true), + BaseDocument.class +); + +// Multiple documents +BaseDocument doc1 = new BaseDocument("one"); +doc1.addAttribute("val", 1); +BaseDocument doc2 = new BaseDocument("two"); +doc2.addAttribute("val", 2); +BaseDocument doc3 = new BaseDocument("three"); +doc3.addAttribute("val", 3); +MultiDocumentEntity<DocumentUpdateEntity<Void>> updatedDocs = + coll.updateDocuments(List.of(doc1, doc2, doc3)); +``` + +See [`ArangoCollection.updateDocument()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#updateDocument%28java.lang.String,java.lang.Object,com.arangodb.model.DocumentUpdateOptions,java.lang.Class%29) +and [`ArangoCollection.updateDocuments()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#updateDocuments%28java.lang.Iterable%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") + +# Single document +res = coll.update({ "_key": "the-document-key", "logo": "avocado" }, return_new=True) + +# Multiple documents +meta = coll.update_many([ + { "_key": "one", "val": 1 }, + { "_key": "two", "val": 2 }, + { "_key": "three", "val": 3 } +]) +``` + +See [`StandardCollection.update()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.update) +and [`StandardCollection.update_many()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.update_many) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Replace documents + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **COLLECTIONS** in the main navigation. +2. Click the card of the desired collection. +3. Go to the **Content** tab. +4. You may click the filter icon to filter and sort by document attributes. +5. Click a row to open the full document. +6. Delete the document content in the editor and set new attributes. +7. Click the **Save** button at the bottom. + +You can also set new content for documents with AQL queries using the +[`REPLACE` operation](../../../aql/high-level-operations/replace.md) +in the **Queries** section. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_replace_documents +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); + +~coll.insert({ +~ _key: "the-document-key", +~ name: "ArangoDB", +~ tags: ["graph", "database", "NoSQL"], +~ scalable: true, +~ company: { +~ name: "ArangoDB Inc.", +~ founded: 2015 +~ } +~}); +~coll.insert([ { _key: "one" }, { _key: "two" }, { _key: "three" } ]); + +coll.replace("the-document-key", { logo: "avocado" }, { returnNew: true }); +coll.replace([ "one", "two", { _key: "three" } ], [ { val: 1 }, { val: 2 }, { val: 3 } ]); +~db._drop("coll"); +``` + +See [`collection.replace()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectionreplacedocument-data--options) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +# Single document +curl -XPUT -d '{"logo":"avocado"}' http://localhost:8529/_db/mydb/_api/document/coll/the-document-key?returnNew=true + +# Multiple documents +curl -XPUT -d '[{"_key":"one","val":1},{"_key":"two","val":2},{"_key":"three","val":3}]' http://localhost:8529/_db/mydb/_api/document/coll +``` + +See the following endpoints in the _HTTP API_ for details: +- [`PUT /_db/{database-name}/_api/document/{collection-name}/{document-key}`](../../../develop/http-api/documents.md#replace-a-document) +- [`PUT /_db/{database-name}/_api/document/{collection-name}`](../../../develop/http-api/documents.md#replace-multiple-documents) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); + +// Single document +const result = await coll.replace("the-document-key", { logo: "avocado" }, { returnNew: true }); + +// Multiple documents +const results = await coll.replaceAll([ { _key: "one", val: 1 }, { _key: "two", val: 2 }, { _key: "three", val: 3 } ]); +``` + +See [`DocumentCollection.replace()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#replace) +and [`DocumentCollection.replaceAll()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#replaceAll) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) + +var newDoc map[string]interface{} + +// Single document +newAttributes := map[string]interface{}{ + "logo": "avocado", +} +replaceRes, err := coll.ReplaceDocumentWithOptions(ctx, "the-document-key", newAttributes, &arangodb.CollectionDocumentReplaceOptions{ + NewObject: &newDoc, +}) +if err != nil { + fmt.Println(err) +} else { + fmt.Printf("Metadata: %+v\n", replaceRes.DocumentMetaWithOldRev) + fmt.Printf("Full document: %v\n\n", newDoc) +} + +// Multiple documents +replaceDocs := []interface{}{ + map[string]interface{}{"_key": "one", "val": 1}, + map[string]interface{}{"_key": "two", "val": 2}, + map[string]interface{}{"_key": "three", "val": 3}, +} + +replaceResReader, err := coll.ReplaceDocumentsWithOptions(ctx, replaceDocs, &arangodb.CollectionDocumentReplaceOptions{ + NewObject: &newDoc, +}) +for { + newDoc = nil // Reset to not leak attributes of previous documents + replaceRes, err := replaceResReader.Read() + if shared.IsNoMoreDocuments(err) { + break + } else if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Metadata: %+v\n", replaceRes.DocumentMetaWithOldRev) + fmt.Printf("Full document: %v\n\n", newDoc) + } +} +``` + +See the following functions +in the [_go-driver_ v2 documentation](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#CollectionDocumentReplace) +for details: +- `CollectionDocumentReplace.ReplaceDocument()` +- `CollectionDocumentReplace.ReplaceDocumentWithOptions()` +- `CollectionDocumentReplace.ReplaceDocuments()` +- `CollectionDocumentReplace.ReplaceDocumentsWithOptions()` +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); + +// Single document +BaseDocument doc = new BaseDocument("the-document-key"); +doc.addAttribute("logo", "avocado"); +DocumentUpdateEntity<BaseDocument> result = coll.replaceDocument( + "the-document-key", + doc, + new DocumentReplaceOptions().returnNew(true), + BaseDocument.class +); + +// Multiple documents +BaseDocument doc1 = new BaseDocument("one"); +doc1.addAttribute("val", 1); +BaseDocument doc2 = new BaseDocument("two"); +doc2.addAttribute("val", 2); +BaseDocument doc3 = new BaseDocument("three"); +doc3.addAttribute("val", 3); +MultiDocumentEntity<DocumentUpdateEntity<Void>> replacedDocs = + coll.replaceDocuments(List.of(doc1, doc2, doc3)); +``` + +See [`ArangoCollection.replaceDocument()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#replaceDocument%28java.lang.String,java.lang.Object,com.arangodb.model.DocumentUpdateOptions,java.lang.Class%29) +and [`ArangoCollection.replaceDocuments()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#replaceDocuments%28java.lang.Iterable%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") + +# Single document +res = coll.replace({ "_key": "the-document-key", "logo": "avocado" }, return_new=True) + +# Multiple documents +meta = coll.replace_many([ + { "_key": "one", "val": 1 }, + { "_key": "two", "val": 2 }, + { "_key": "three", "val": 3 } +]) +``` + +See [`StandardCollection.replace()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.replace) +and [`StandardCollection.replace_many()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.replace_many) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Remove documents + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **COLLECTIONS** in the main navigation. +2. Click the card of the desired collection. +3. Go to the **Content** tab. +4. You may click the filter icon to filter and sort by document attributes. +5. In the row of the document you want to delete, you can click the minus icon + on the right-hand side and confirm the deletion. +6. Alternatively, click a row to open the full document, then click the + **Delete** button at the bottom and confirm the deletion. + +You can also delete documents with AQL queries using the +[`REMOVE` operation](../../../aql/high-level-operations/remove.md) +in the **Queries** section. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_delete_documents +description: '' +--- +~db._create("coll"); +var coll = db._collection("coll"); +~coll.insert({ _key: "the-document-key" }); +~coll.insert([ { _key: "one" }, { _key: "two" }, { _key: "three" } ]); +coll.remove("the-document-key"); +coll.remove([ "one", "two", { _key: "three" } ]); +~db._drop("coll"); +``` + +See [`collection.remove()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectionremoveobject) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +# Single document +curl -XDELETE http://localhost:8529/_db/mydb/_api/document/coll/the-document-key + +# Multiple documents +curl -XDELETE -d '["one","two",{"_key":"three"}]' http://localhost:8529/_db/mydb/_api/document/coll +``` + +See the following endpoints in the _HTTP API_ for details: +- [`DELETE /_db/{database-name}/_api/document/{collection-name}/{document-key}`](../../../develop/http-api/documents.md#remove-a-document) +- [`DELETE /_db/{database-name}/_api/document/{collection-name}`](../../../develop/http-api/documents.md#remove-multiple-documents) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); + +// Single document +const result = await coll.remove("the-document-key"); + +// Multiple documents +const results = await coll.removeAll(["one", "two", { _key: "three" } ]); +``` + +See [`DocumentCollection.remove()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#remove) +and [`DocumentCollection.removeAll()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#removeAll) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) + +// Single document +deleteRes, err := coll.DeleteDocument(ctx, "the-document-key") +if err != nil { + fmt.Println(err) +} else { + fmt.Printf("Metadata: %+v\n\n", deleteRes.DocumentMeta) +} + +// Multiple documents +var deletedDoc map[string]interface{} +var res map[string]interface{} // Full server response +deleteResReader, err := coll.DeleteDocumentsWithOptions(ctx, []string{"one", "two", "three"}, &arangodb.CollectionDocumentDeleteOptions{ + OldObject: &deletedDoc, +}) +for { + deletedDoc = nil // Reset to not leak attributes of previous documents + meta, err := deleteResReader.Read(&res) + if shared.IsNoMoreDocuments(err) { + break + } else if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Metadata: %+v\n", meta.DocumentMeta) + fmt.Printf("Full document: %v\n\n", deletedDoc) + } +} +``` + +See the following functions +in the [_go-driver_ v2 documentation](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#CollectionDocumentDelete) +for details: +- `CollectionDocumentRead.DeleteDocument()` +- `CollectionDocumentRead.DeleteDocumentsWithOptions()` +- `CollectionDocumentRead.DeleteDocument()` +- `CollectionDocumentRead.DeleteDocumentsWithOptions()` +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoCollection coll = db.collection("coll"); + +// Single document +DocumentDeleteEntity<Void> result = coll.deleteDocument("the-document-key"); + +// Multiple documents +MultiDocumentEntity<DocumentDeleteEntity<Void>> multipleResult = + coll.deleteDocuments(List.of("one", "two", "three")); +``` + +See [`ArangoCollection.deleteDocument()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#deleteDocument%28java.lang.String%29) +and [`ArangoCollection.deleteDocuments()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#getDocuments%28java.lang.Iterable,java.lang.Class%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") + +# Single document +meta = coll.delete("the-document-key") + +# Multiple documents +meta = coll.delete_many(["one", "two", { "_key": "three" } ]) +``` + +See [`StandardCollection.delete()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.delete) +and [`StandardCollection.delete_many()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.StandardCollection.delete_many) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/concepts/data-structure/documents/computed-values.md b/site/content/arangodb/oem/concepts/data-structure/documents/computed-values.md new file mode 100644 index 0000000000..fa82b690fc --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/documents/computed-values.md @@ -0,0 +1,435 @@ +--- +title: Computed Values +menuTitle: Computed Values +weight: 10 +description: >- + You can configure collections to generate document attributes when documents + are created or modified, using an AQL expression +--- +<small>Introduced in: v3.10.0</small> + +If you want to add default values to new documents, maintain auxiliary +attributes for search queries, or similar, you can set these attributes manually +in every operation that inserts or modifies documents. However, it is more +convenient and reliable to let the database system take care of it. + +The computed values feature lets you define expressions on the collection level +that run on inserts, modifications, or both. You can access the data of the +current document to compute new values using a subset of AQL. The result of each +expression becomes the value of a top-level attribute. These attributes are +stored like any other attribute, which means that you may use them in indexes, +but also that the schema validation is applied if you use one. + +Possible use cases are to add timestamps of the creation or last modification to +every document, to add default attributes, or to automatically process attributes +for indexing purposes. For example, you can combine multiple attributes into one, +filter out array elements, and convert text to lowercase characters, to then index +the new attribute and use it to perform case-insensitive searches. + +## Using Computed Values + +Computed values are defined per collection using the `computedValues` property, +either when creating the collection or by modifying the collection later on. +If you add or modify computed value definitions at a later point, then they only +affect subsequent write operations. Existing documents remain in their state. + +Computed value definitions are included in dumps, and the attributes they added, +too, but no expressions are executed when restoring dumps. The collections and +documents are restored as they are in the dump and no attributes are recalculated. + +## Interfaces + +The `computedValues` collection property accepts an array of objects. + +Each object represents a computed value and can have the following attributes: + +- `name` (string, _required_): + The name of the target attribute. Can only be a top-level attribute, but you + may return a nested object. Cannot be `_key`, `_id`, `_rev`, `_from`, `_to`, + or a shard key attribute. + +- `expression` (string, _required_): + An AQL `RETURN` operation with an expression that computes the desired value. + See [Computed Value Expressions](#computed-value-expressions) for details. + +- `overwrite` (boolean, _required_): + Whether the computed value shall take precedence over a user-provided or + existing attribute. + +- `computeOn` (array, _optional_): + An array of strings to define on which write operations the value shall be + computed. The possible values are `"insert"`, `"update"`, and `"replace"`. + The default is `["insert", "update", "replace"]`. + +- `keepNull` (boolean, _optional_): + Whether the target attribute shall be set if the expression evaluates to `null`. + You can set the option to `false` to not set (or unset) the target attribute if + the expression returns `null`. The default is `true`. + +- `failOnWarning` (boolean, _optional_): + Whether to let the write operation fail if the expression produces a warning. + The default is `false`. + +The names and data types differ in some of the drivers. + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](../databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +4. Go to the **Computed Values** tab. +5. Edit the configuration in JSON format. Example: + ```json + [ + { + "name": "title", + "expression": "RETURN \"TBA\"", + "overwrite": false, + "computeOn": ["insert", "update", "replace"], + "failOnWarning": false, + "keepNull": true + } + ] + ``` +6. Click the **Save** button. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_set_collection_computed_values +description: '' +--- +var computedValues = [ + { + name: "title", + expression: "RETURN \"TBA\"", + overwrite: false, + computeOn: ["insert", "update", "replace"], + failOnWarning: false, + keepNull: true + } +]; + +/* Create a new collection with computed values */ +var coll = db._create("compValCollection", { computedValues }); + +/* Update the computed values of an existing collection */ +db.compValCollection.properties({ computedValues }); +~addIgnoreCollection(coll.name()); +``` +To remove the computed values configuration from a collection, set the +`computedValues` property to `null` or `[]` (empty array): + +```js +--- +name: arangosh_unset_collection_properties_computed_values +description: '' +--- +~var coll = db._collection("compValCollection"); +/* Remove the computed values of an existing collection */ +db.compValCollection.properties({ computedValues: null }); +~removeIgnoreCollection(coll.name()); +~db._drop(coll.name()); +``` + +See [`db._create()`](../../../develop/javascript-api/@arangodb/db-object.md#db_createcollection-name--properties--type--options) +and [`collection.properties()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectionpropertiesproperties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XPUT -d '{"computedValues":[{"name":"title","expression":"RETURN \"TBA\"","overwrite":false,"computeOn":["insert","update","replace"],"failOnWarning":false,"keepNull":true}]' http://localhost:8529/_db/mydb/_api/collection/coll/properties +``` + +See the [`PUT /_db/{database-name}/_api/collection/{collection-name}/properties`](../../../develop/http-api/collections.md#change-the-properties-of-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const props = await coll.properties({ + computedValues: [ + { + name: "title", + expression: "RETURN \"TBA\"", + overwrite: false, + computeOn: ["insert", "update", "replace"], + failOnWarning: false, + keepNull: true + } + ] +}); +``` + +See [`DocumentCollection.properties()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#properties.properties-2) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +err = coll.SetProperties(ctx, arangodb.SetCollectionPropertiesOptions{ + ComputedValues: []arangodb.ComputedValue { + { + Name: "title", + Expression: "RETURN \"TBA\"", + Overwrite: false, + ComputeOn: []arangodb.ComputeOn { + arangodb.ComputeOnInsert, + arangodb.ComputeOnUpdate, + arangodb.ComputeOnReplace, + }, + FailOnWarning: utils.NewType(false), // pointer to bool + KeepNull: utils.NewType(true), // pointer to bool + }, + }, +}) +``` + +See [`Collection.SetProperties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Collection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +CollectionPropertiesOptions options = new CollectionPropertiesOptions() + .computedValues(new ComputedValue() + .name("title") + .expression("RETURN \"TBA\"") + .overwrite(false) + .computeOn(ComputedValue.ComputeOn.insert, ComputedValue.ComputeOn.update, ComputedValue.ComputeOn.replace) + .failOnWarning(false) + .keepNull(true) + ); + +ArangoCollection coll = db.collection("coll"); +CollectionPropertiesEntity props = coll.changeProperties(options); +``` + +See [`ArangoCollection.changeProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#changeProperties%28com.arangodb.model.CollectionPropertiesOptions%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") +props = coll.configure( + computed_values=[ + { + "name": "title", + "expression": "RETURN \"TBA\"", + "overwrite": False, + "computeOn": ["insert", "update", "replace"], + "failOnWarning": False, + "keepNull": True + } + ] +) +``` + +See [`Collection.configure()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.Collection.configure) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +## Computed Value Expressions + +You can use a subset of AQL for computed values, namely a single +[`RETURN` operation](../../../aql/high-level-operations/return.md) with an expression that +computes the value. + +You can access the document data via the `@doc` bind variable. It contains the +data as it will be stored, including the `_key`, `_id`, and `_rev` +system attributes. On inserts, you get the user-provided values (plus the +system attributes), and on modifications, you get the updated or replaced +document to work with, including the user-provided values. + +Computed value expressions have the following properties: + +- The expression must start with a `RETURN` operation and cannot contain any + other operations. No `FOR` loops, `LET` statements, and subqueries are allowed + in the expression. `FOR` loops can be substituted using the + [array expansion operator `[*]`](../../../aql/operators.md#inline-expressions), + for example, with an inline expressions like the following: + + `RETURN @doc.values[* FILTER CURRENT > 42 RETURN CURRENT * 2]` + +- You cannot access any stored data other than the current document via the + `@doc` bind parameter. AQL functions that read from the database system cannot + be used in the expression (e.g. `DOCUMENT()`, `PREGEL_RESULT()`, + `COLLECTION_COUNT()`). + +- You cannot access the result of another computed value that is generated on + the same `computeOn` event. + + For example, two computed values that are generated on `insert` cannot see + the result of the other. Referencing the attributes results in an implicit + `null` value. Computed values that are generated on `update` or `replace` can + see the results of the previous `insert` computations, however. They cannot + see the new values of other `update` and `replace` computations, regardless of + the order of the computed value definitions in the `computedValues` property. + +- You can use AQL functions in the expression but only those that can be + executed on DB-Servers, regardless of your deployment mode. The following + functions cannot be used in the expression: + - `CALL()` + - `APPLY()` + - `DOCUMENT()` + - `V8()` + - `SCHEMA_GET()` + - `SCHEMA_VALIDATE()` + - `VERSION()` + - `COLLECTIONS()` + - `CURRENT_USER()` + - `CURRENT_DATABASE()` + - `COLLECTION_COUNT()` + - `NEAR()` + - `WITHIN()` + - `WITHIN_RECTANGLE()` + - `FULLTEXT()` + - [User-defined functions (UDFs)](../../../aql/user-defined-functions.md) + +Expressions that do not meet the requirements or that are syntactically invalid +are rejected immediately, when setting or modifying the computed value definitions +of a collection. + +## Examples + +The following examples show a few ways you can use computed values using +_arangosh_. + +Add an attribute with the creation timestamp to new documents: + +```js +--- +name: computedValuesCreatedAt +description: '' +--- +var coll = db._create("users", { + computedValues: [ + { + name: "createdAt", + expression: "RETURN DATE_NOW()", + overwrite: true, + computeOn: ["insert"] + } + ] +}); +var doc = db.users.save({ name: "Paula Plant" }); +db.users.toArray(); +~db._drop("users"); +``` + +Add an attribute with the date and time of the last modification, only taking +update and replace operations into (not inserts), and allowing to manually +set this value instead of using the computed value: + +```js +--- +name: computedValuesModifiedAt +description: '' +--- +var coll = db._create("users", { + computedValues: [ + { + name: "modifiedAt", + expression: "RETURN ZIP(['date', 'time'], SPLIT(DATE_ISO8601(DATE_NOW()), 'T'))", + overwrite: false, + computeOn: ["update", "replace"] + } + ] +}); +var doc = db.users.save({ _key: "123", name: "Paula Plant" }); +doc = db.users.update("123", { email: "gardener@arangodb.com" }); +db.users.toArray(); +doc = db.users.update("123", { email: "greenhouse@arangodb.com", modifiedAt: { date: "2019-01-01", time: "20:30:00.000Z" } }); +db.users.toArray(); +~db._drop("users"); +``` + +Compute an attribute from two arrays, filtering one of the lists, and calculating +new values to implement a case-insensitive search using a persistent array index: + +```js +--- +name: computedValuesCombine +description: '' +--- +var coll = db._create("users", { + computedValues: [ + { + name: "searchTags", + expression: "RETURN APPEND(@doc.is[* FILTER CURRENT.public == true RETURN LOWER(CURRENT.name)], @doc.loves[* RETURN LOWER(CURRENT)])", + overwrite: true + } + ] +}); +var doc = db.users.save({ name: "Paula Plant", is: [ { name: "Gardener", public: true }, { name: "female" } ], loves: ["AVOCADOS", "Databases"] }); +var idx = db.users.ensureIndex({ type: "persistent", fields: ["searchTags[*]"] }); +db._query(`FOR u IN users FILTER "avocados" IN u.searchTags RETURN u`).toArray(); +~db._drop("users"); +``` + +Set `keepNull` to `false` and let an expression return `null` to not set or +unset the target attribute. If you set `overwrite` to `false` at the same time, +then the target attribute is not actively unset: + +```js +--- +name: computedValuesKeepNull +description: '' +--- +var coll = db._create("users", { + computedValues: [ + { + name: "fullName", + expression: "RETURN @doc.firstName != null AND @doc.lastName != null ? CONCAT_SEPARATOR(' ', @doc.firstName, @doc.lastName) : null", + overwrite: false, + keepNull: false + } + ] +}); +var docs = db.users.save([ + { firstName: "Paula", lastName: "Plant" }, + { firstName: "James" }, + { lastName: "Barrett", fullName: "Andy J. Barrett" } +]); +db.users.toArray(); +~db._drop("users"); +``` + +Add a computed value as a sub-attribute to documents. This is not possible +directly because the target attribute needs to be a top-level attribute, but the +AQL expression can merge a nested object with the top-level attribute to achieve +this. The expression checks whether the attributes it wants to calculate a new +value from exist and are strings. If the preconditions are not met, then it +returns the original `name` attribute: + +```js +--- +name: computedValuesSubattribute +description: '' +--- +var coll = db._create("users", { + computedValues: [ + { + name: "name", + expression: "RETURN IS_STRING(@doc.name.first) AND IS_STRING(@doc.name.last) ? MERGE(@doc.name, { 'full': CONCAT_SEPARATOR(' ', @doc.name.first, @doc.name.last) }) : @doc.name", + overwrite: true // must be true to replace the top-level "name" attribute + } + ] +}); +var docs = db.users.save([ + { name: { first: "James" } }, + { name: { first: "Paula", last: "Plant" } } +]); +db.users.toArray(); +~db._drop("users"); +``` diff --git a/site/content/arangodb/oem/concepts/data-structure/documents/schema-validation.md b/site/content/arangodb/oem/concepts/data-structure/documents/schema-validation.md new file mode 100644 index 0000000000..25d499a95e --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/documents/schema-validation.md @@ -0,0 +1,404 @@ +--- +title: Schema Validation +menuTitle: Schema Validation +weight: 5 +description: >- + How to enforce attributes and their data types for documents of individual + collections using JSON Schema +--- +While ArangoDB is schema-less, it allows you to enforce certain document structures +on the collection level. You can describe the desired structure in the popular +[JSON Schema](https://json-schema.org/) format (draft-4, without support for +remote schemas for security reasons). The level of validation and a custom error +message are configurable. The system attributes `_key`, `_id`, `_rev`, `_from` +and `_to` are ignored by the schema validation. + +## Schema validation interfaces + +The following sections show examples of how you can configure the +schema validation for collections using the APIs of ArangoDB and +the official drivers, as well as the ArangoDB Shell and the built-in web interface. + +### Enable schema validation for a collection + +You can define a schema when creating a collection as well as update the +properties of a collection later on to add, modify, or remove a schema. + +The `schema` property of a collection expects an object with the following +attributes: + +- `rule`: Must contain the JSON Schema description. +- `level`: Controls when the validation is applied. +- `message`: Defines the message that is used when validation fails. + +See [Schema validation properties](#schema-validation-properties) for details. + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](../databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +4. Go to the **Schema** tab. +5. Enter the desired JSON Schema. Example: + ```json + { + "rule": { + "type": "object", + "properties": { + "nums": { + "type": "array", + "items": { + "type": "number", + "maximum": 6 + } + } + }, + "additionalProperties": { "type": "string" }, + "required": [ "nums" ] + }, + "level": "moderate", + "message": "The document does not contain an array of numbers in attribute \"nums\", one of the numbers is greater than 6, or another top-level attribute is not a string." + } + ``` +6. Click the **Save** button. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_set_collection_properties_schema +description: '' +--- +var schema = { + rule: { + type: "object", + properties: { + nums: { + type: "array", + items: { + type: "number", + maximum: 6 + } + } + }, + additionalProperties: { type: "string" }, + required: ["nums"] + }, + level: "moderate", + message: "The document does not contain an array of numbers in attribute \"nums\", one of the numbers is greater than 6, or another top-level attribute is not a string." +}; + +/* Create a new collection with schema */ +var coll = db._create("schemaCollection", { "schema": schema }); + +/* Update the schema of an existing collection */ +db.schemaCollection.properties({ "schema": schema }); +~addIgnoreCollection(coll.name()); +``` + +See [`collection.properties()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectionpropertiesproperties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XPUT -d '{"schema":{"rule":{"type":"object","properties":{"nums":{"type":"array","items":{"type":"number","maximum":6}}},"additionalProperties":{"type":"string"},"required":["nums"]},"level":"moderate","message":"The document does not contain an array of numbers in attribute \"nums\", one of the numbers is greater than 6, or another top-level attribute is not a string."}}' http://localhost:8529/_db/mydb/_api/collection/coll/properties +``` + +See the [`PUT /_db/{database-name}/_api/collection/{collection-name}/properties`](../../../develop/http-api/collections.md#change-the-properties-of-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const props = await coll.properties({ + schema: { + rule: { + type: "object", + properties: { + nums: { + type: "array", + items: { + type: "number", + maximum: 6 + } + } + }, + additionalProperties: { type: "string" }, + required: ["nums"] + }, + level: "moderate", + message: "The document does not contain an array of numbers in attribute \"nums\", one of the numbers is greater than 6, or another top-level attribute is not a string." + } +}); +``` + +See [`DocumentCollection.properties()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#properties.properties-2) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +err = coll.SetProperties(ctx, arangodb.SetCollectionPropertiesOptions{ + Schema: &arangodb.CollectionSchemaOptions{ + Rule: map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "nums": map[string]interface{}{ + "type": "array", + "items": map[string]interface{}{ + "type": "number", + "maximum": 6, + }, + }, + }, + "additionalProperties": map[string]interface{}{ + "type": "string", + }, + "required": []string{ + "nums", + }, + }, + Level: "moderate", + Message: `The document does not contain an array of numbers in attribute "nums", one of the numbers is greater than 6, or another top-level attribute is not a string.`, + }, +}) +``` + +See [`Collection.SetProperties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Collection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +String schemaRule = ( + "{" + + " \"type\": \"object\"," + + " \"properties\": {" + + " \"nums\": {" + + " \"type\": \"array\"," + + " \"items\": {" + + " \"type\": \"number\"," + + " \"maximum\": 6" + + " }" + + " }" + + " }," + + " \"additionalProperties\": { \"type\": \"string\" }," + + " \"required\": [\"nums\"]" + + "}"); + +CollectionPropertiesOptions options = new CollectionPropertiesOptions() + .schema(new CollectionSchema() + .setRule(schemaRule) + .setLevel(CollectionSchema.Level.MODERATE) + .setMessage("The document does not contain an array of numbers in attribute \"nums\", one of the numbers is greater than 6, or another top-level attribute is not a string.") + ); + +ArangoCollection coll = db.collection("coll"); +CollectionPropertiesEntity props = coll.changeProperties(options); +``` + +See [`ArangoCollection.changeProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#changeProperties%28com.arangodb.model.CollectionPropertiesOptions%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") +props = coll.configure( + schema={ + "rule": { + "type": "object", + "properties": { + "nums": { + "type": "array", + "items": { + "type": "number", + "maximum": 6 + } + } + }, + "additionalProperties": { "type": "string" }, + "required": [ "nums" ] + }, + "level": "moderate", + "message": "The document does not contain an array of numbers in attribute \"nums\", one of the numbers is greater than 6, or another top-level attribute is not a string." + } +) +``` + +See [`Collection.configure()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.Collection.configure) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Remove schema validation for a collection + +To remove an existing schema from a collection, set a `schema` value of either +`null` or `{}` (empty object). + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](../databases.md#set-the-database-context) + that contains the desired collection. +2. Click **COLLECTIONS** in the main navigation. +3. Click the card of the desired collection. +4. Go to the **Schema** tab. +5. You can temporarily disable the document validation by setting the validation + `level` to `"none"`. To fully remove the schema from the collection, replace + the entire configuration with `null`. +6. Click the **Save** button. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: arangosh_remove_collection_properties_schema +description: '' +--- +~var coll = db._collection("schemaCollection"); +db.schemaCollection.properties({ "schema": null }); +~removeIgnoreCollection(coll.name()); +~db._drop(coll.name()); +``` + +See [`collection.properties()`](../../../develop/javascript-api/@arangodb/collection-object.md#collectionpropertiesproperties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XPUT -d '{"schema":null}' http://localhost:8529/_db/mydb/_api/collection/coll/properties +``` + +See the [`PUT /_db/{database-name}/_api/collection/{collection-name}/properties`](../../../develop/http-api/collections.md#change-the-properties-of-a-collection) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let coll = db.collection("coll"); +const props = await coll.properties({ schema: null }); +``` + +See [`DocumentCollection.properties()`](https://arangodb.github.io/arangojs/latest/interfaces/collections.DocumentCollection.html#properties.properties-2) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +coll, err := db.GetCollection(ctx, "coll", nil) +err = coll.SetProperties(ctx, arangodb.SetCollectionPropertiesOptions{ + Schema: &arangodb.CollectionSchemaOptions{} // empty object +}) +``` + +See [`Collection.SetProperties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#Collection) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +CollectionPropertiesOptions options = new CollectionPropertiesOptions() + .schema(null); + +ArangoCollection coll = db.collection("coll"); +CollectionPropertiesEntity props = coll.changeProperties(options); +``` + +See [`ArangoCollection.changeProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoCollection.html#changeProperties%28com.arangodb.model.CollectionPropertiesOptions%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +coll = db.collection("coll") +props = coll.configure(schema={}) +``` + +See [`Collection.configure()`](https://docs.python-arango.com/en/main/specs.html#arango.collection.Collection.configure) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +## Schema validation properties + +### JSON Schema Rule + +The `rule` must be a valid JSON Schema object as outlined in the +[specification](https://json-schema.org/specification.html). +See [Understanding JSON Schema](https://json-schema.org/understanding-json-schema/reference/object.html) +for a user guide on how to write JSON Schema descriptions. + +System attributes are invisible to the schema validation, i.e. `_key`, `_rev` and `_id` +(in edge collections additionally `_from` and `_to`) do not need to be +specified in the schema. You may set `additionalProperties: false` to only +allow attributes described by the schema. System attributes do not fall under +this restriction. + +Attributes with numeric values always have the type `"number"`, even if they are +whole numbers (and internally use an `integer` type). If you want to restrict an +attribute to integer values, use `"type": "number"` together with `"multipleOf": 1`. +Using `multipleOf` with decimal places is not recommended because it doesn't +work reliably due to floating-point inaccuracy. + +{{< security >}} +Remote schemas are not supported for security reasons. +{{< /security >}} + +### Levels + +The level controls when the validation is triggered: + +- `none`: The rule is inactive and validation thus turned off. +- `new`: Only newly inserted documents are validated. +- `moderate`: New and modified documents must pass validation, except for + modified documents where the OLD value did not pass validation already. + This level is useful if you have documents which do not match your target + structure, but you want to stop the insertion of more invalid documents + and prohibit that valid documents are changed to invalid documents. +- `strict`: All new and modified document must strictly pass validation. + No exceptions are made (default). + +### Error message + +If the schema validation for a document fails, then a generic error is raised. +You may customize the error message via the `message` attribute to provide a +summary of what the expected document structure is or point out common mistakes. + +The schema validation cannot pin-point which part of a rule made it fail because +it is difficult to determine and report for complex schemas. For example, when +using `not` and `anyOf`, this would result in trees of possible errors. You can +use tools like [jsonschemavalidator.net](https://www.jsonschemavalidator.net/) +to examine schema validation issues. + +## Performance + +The schema validation is executed for data-modification operations according +to the levels described above. That means that it can slow down document +write operations, with more complex schemas typically taking more time for the +validation than very simple schemas. + +## Related AQL functions + +The following AQL functions are available to work with schemas: + + - [`SCHEMA_GET()`](../../../aql/functions/miscellaneous.md#schema_get) + - [`SCHEMA_VALIDATE()`](../../../aql/functions/miscellaneous.md#schema_validate) + +## Backup and restore + +Logical backups created with arangodump include the schema configuration, which +is a collection property. + +When using arangorestore to restore to a collection with a defined schema, +no schema validation is executed. diff --git a/site/content/arangodb/oem/concepts/data-structure/views.md b/site/content/arangodb/oem/concepts/data-structure/views.md new file mode 100644 index 0000000000..319904609b --- /dev/null +++ b/site/content/arangodb/oem/concepts/data-structure/views.md @@ -0,0 +1,766 @@ +--- +title: Views +menuTitle: Views +weight: 20 +description: >- + Views can index documents of multiple collections and enable sophisticated + information retrieval possibilities, like full-text search with ranking by + relevance +--- +Views allows you to perform complex searches at high performance. They are +accelerated by inverted indexes that are updated near real-time. + +A View is conceptually a transformation function over documents from zero or +more collections. The transformation depends on the View type and the View +configuration. + +Views are powered by ArangoDB's built-in search engine. +See [ArangoSearch](../../index-and-search/arangosearch/_index.md) for details. + +## View types + +Available View types: + +- The traditional [`arangosearch` Views](../../index-and-search/arangosearch/arangosearch-views-reference.md) to which + you link collections to. +- The modern [`search-alias` Views](../../index-and-search/arangosearch/search-alias-views-reference.md) + that can reference inverted indexes that are defined on the collection-level. + +You need to specify the type when you create the View. +The type cannot be changed later. + +## View names + +You can give each View a name to identify and access it. The name needs to +be unique within a [database](databases.md), but not globally +for the entire ArangoDB instance. + +The namespace for Views is shared with [collections](collections.md). +There cannot exist a View and a collection with the same name in the same database. + +The View name needs to be a string that adheres to either the **traditional** +or the **extended** naming constraints. Whether the former or the latter is +active depends on the `--database.extended-names` startup option. +The extended naming constraints are used if enabled, allowing many special and +UTF-8 characters in database, collection, View, and index names. If set to +`false` (default), the traditional naming constraints are enforced. + +{{< info >}} +The extended naming constraints are an **experimental** feature but they will +become the norm in a future version. Check if your drivers and client applications +are prepared for this feature before enabling it. +{{< /info >}} + +The restrictions for View names are as follows: + +- For the **traditional** naming constraints: + - The names must only consist of the letters `A` to `Z` (both in lower + and upper case), the digits `0` to `9`, and underscore (`_`) and dash (`-`) + characters. This also means that any non-ASCII names are not allowed. + - View names must start with a letter. + - The maximum allowed length of a name is 256 bytes. + - View names are case-sensitive. + +- For the **extended** naming constraints: + - Names can consist of most UTF-8 characters, such as Japanese or Arabic + letters, emojis, letters with accentuation. Some ASCII characters are + disallowed, but less compared to the _traditional_ naming constraints. + - Names cannot contain the characters `/` or `:` at any position, nor any + control characters (below ASCII code 32), such as `\n`, `\t`, `\r`, and `\0`. + - Spaces are accepted, but only in between characters of the name. Leading + or trailing spaces are not allowed. + - `.` (dot), `_` (underscore) and the numeric digits `0`-`9` are not allowed + as first character, but at later positions. + - View names are case-sensitive. + - View names containing UTF-8 characters must be + [NFC-normalized](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). + Non-normalized names are rejected by the server. + - The maximum length for a View name is 256 bytes after normalization. + As a UTF-8 character may consist of multiple bytes, this does not necessarily + equate to 256 characters. + + Example View names that can be used with the _extended_ naming constraints: + `España`, `😀`, `犬`, `كلب`, `@abc123`, `København`, `München`, `Бишкек`, `abc? <> 123!` + +{{< warning >}} +While it is possible to change the value of the +`--database.extended-names` option from `false` to `true` to enable +extended names, the reverse is not true. Once the extended names have been +enabled, they remain permanently enabled so that existing databases, +collections, Views, and indexes with extended names remain accessible. + +Please be aware that dumps containing extended names cannot be restored +into older versions that only support the traditional naming constraints. In a +cluster setup, it is required to use the same naming constraints for all +Coordinators and DB-Servers of the cluster. Otherwise, the startup is +refused. In DC2DC setups, it is also required to use the same naming constraints +for both datacenters to avoid incompatibilities. +{{< /warning >}} + +You can rename Views (except in cluster deployments). This changes the +View name, but not the View identifier. + +## View identifiers + +A View identifier lets you refer to a View in a database, similar to +the name. It is a string value and is unique within a database. Unlike +View names, ArangoDB assigns View IDs automatically and you have no +control over them. + +ArangoDB internally uses View IDs to look up Views. However, you +should use the View name to access a View instead of its identifier. + +ArangoDB uses 64-bit unsigned integer values to maintain View IDs +internally. When returning View IDs to clients, ArangoDB returns them as +strings to ensure the identifiers are not clipped or rounded by clients that do +not support big integers. Clients should treat the View IDs returned by +ArangoDB as opaque strings when they store or use them locally. + +## View interfaces + +The following sections show examples of how you can use the APIs of ArangoDB and +the official drivers, as well as the ArangoDB Shell and the built-in web interface, +to perform common operations related to Views. For less common operations +and other drivers, see the corresponding reference documentation. + +The examples are limited to the basic usage of the View interfaces. +See the following for more details about the different View types and their +configuration: + +- [`arangosearch` Views](../../index-and-search/arangosearch/arangosearch-views-reference.md) +- [`search-alias` Views](../../index-and-search/arangosearch/search-alias-views-reference.md) + +### Create a View + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. Click **VIEWS** in the main navigation. +2. Click the **Add View** button. +3. Enter a **Name** for the View that isn't already used by a collection or View. +4. Select the **Type** for the View. +5. You can optionally specify additional settings: + - For a `search-alias` View, you can add inverted indexes to the View now, + but you can also do so later. + - For an `arangosearch` View, you can configure the immutable settings that + you can only set on View creation and not modify later. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: viewUsage_01 +render: input +description: | + Create a View with default properties: +--- +~db._createView("myView", "search-alias"); +viewSearch = db._createView("myArangoSearchView", "arangosearch"); +viewAlias = db._createView("mySearchAliasView", "search-alias"); +~addIgnoreView("myView"); +~addIgnoreView("myArangoSearchView"); +~addIgnoreView("mySearchAliasView"); +``` + +See [`db._createView()`](../../develop/javascript-api/@arangodb/db-object.md#db_createviewname-type--properties) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -d '{"name":"myView","type":"arangosearch"}' http://localhost:8529/_db/mydb/_api/view +curl -d '{"name":"mySearchAliasView","type":"search-alias"}' http://localhost:8529/_db/mydb/_api/view +``` + +See the `POST /_db/{database-name}/_api/view` endpoint in the _HTTP API_ for details: +- [`arangosearch` View](../../develop/http-api/views/arangosearch-views.md#create-an-arangosearch-view) +- [`search-alias` View](../../develop/http-api/views/search-alias-views.md#create-a-search-alias-view) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let viewSearch = await db.createView("myView", { type: "arangosearch" }); +let viewAlias = await db.createView("mySearchAliasView", { type: "search-alias" }); +``` + +See [`Database.createView()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#createView) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +viewSearch, err := db.CreateArangoSearchView(ctx, "myView", nil) +if err != nil { + fmt.Println(err) +} else { + fmt.Println(viewSearch.Type()) +} + +viewAlias, err := db.CreateArangoSearchAliasView(ctx, "mySearchAliasView", nil) +if err != nil { + fmt.Println(err) +} else { + fmt.Println(viewAlias.Type()) +} +``` + +See `DatabaseView.CreateArangoSearchView()` and `DatabaseView.CreateArangoSearchAliasView()` +in the [_go-driver_ v2 documentation](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#DatabaseView) +for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ViewEntity viewSearch = db.createView("myView1", ViewType.ARANGO_SEARCH); +ViewEntity viewAlias = db.createView("myView2", ViewType.SEARCH_ALIAS); +// -- or -- +ViewEntity viewSearch = db.createArangoSearch("myView", null); +ViewEntity viewAlias = db.createSearchAlias("mySearchAliasView", null); +``` + +See `ArangoDatabase.createView()`, `ArangoDatabase.createArangoSearch()`, and +`ArangoDatabase.createSearchAlias()` in the +[_arangodb-java-driver_ documentation](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html) +for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +info = db.create_view("myView", "arangosearch") +info = db.create_view("mySearchAliasView", "search-alias") +``` + +See [`StandardDatabase.create_view()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.create_view) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Get a View + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired View. +2. Click **VIEWS** in the main navigation. +3. Click the card of the desired View. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: viewUsage_02 +description: | + Get the View called `myView` by its name: +--- +view = db._view("myView"); +``` + +See [`db._view()`](../../develop/javascript-api/@arangodb/db-object.md#db_viewview) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_db/mydb/_api/view/myView +curl http://localhost:8529/_db/mydb/_api/view/mySearchAliasView +``` + +See the [`GET /_db/{database-name}/_api/view/{view-name}`](../../develop/http-api/views/_index.md) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let viewSearch = db.view("myView"); +let info = await viewSearch.get(); + +let viewAlias = db.view("mySearchAliasView"); +info = await viewAlias.get(); +``` + +See [`Database.view()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#view) +in the _arangojs_ documentation +for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +for _, viewName := range []string{"myView", "mySearchAliasView"} { + view, err := db.View(ctx, viewName) + if err != nil { + fmt.Println(err) + } else { + switch view.Type() { + case arangodb.ViewTypeArangoSearch: + { + viewSearch, err := view.ArangoSearchView() + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%s: %s\n", viewSearch.Name(), viewSearch.Type()) + } + } + case arangodb.ViewTypeSearchAlias: + { + viewAlias, err := view.ArangoSearchViewAlias() + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%s: %s\n", viewAlias.Name(), viewAlias.Type()) + } + } + default: + panic("Unsupported View type") + } + } +} +``` + +See [`DatabaseView.View()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#DatabaseView) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoView view = db.view("myView"); +ViewEntity viewInfo = view.getInfo(); + +ArangoSearch viewSearch = db.arangoSearch("myView"); +ViewEntity viewSearchInfo = viewSearch.getInfo(); + +SearchAlias viewAlias = db.searchAlias("mySearchAliasView"); +ViewEntity viewAliasInfo = viewAlias.getInfo(); +``` + +See `ArangoDatabase.view(String name)`, `ArangoDatabase.arangoSearch(String name)`, +and `ArangoDatabase.searchAlias(String name)` in the +[_arangodb-java-driver_ documentation](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html) +for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +info = db.view_info("myView") +info = db.view_info("mySearchAliasView") +``` + +See [`StandardDatabase.view()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.view) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Get the View properties + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired View. +2. Click **VIEWS** in the main navigation. +3. Click the card of the desired View. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: viewUsage_03 +description: '' +--- +var view = db._view("myView"); +view.properties(); +``` + +See [`view.properties()`](../../develop/javascript-api/@arangodb/view-object.md#viewpropertiesnew-properties--partialupdate) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl http://localhost:8529/_db/mydb/_api/view/myView/properties +curl http://localhost:8529/_db/mydb/_api/view/mySearchAliasView/properties +``` + +See the `GET /_db/{database-name}/_api/view/{view-name}/properties` endpoint in +the _HTTP API_ for details: +- [`arangosearch` View](../../develop/http-api/views/arangosearch-views.md#get-the-properties-of-a-view) +- [`search-alias` View](../../develop/http-api/views/search-alias-views.md#get-information-about-a-view) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let viewSearch = db.view("myView"); +let props = await viewSearch.properties(); + +let viewAlias = db.view("mySearchAliasView"); +props = await viewAlias.properties(); +``` + +See [`View.properties()`](https://arangodb.github.io/arangojs/latest/classes/views.View.html#properties) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +for _, viewName := range []string{"myView", "mySearchAliasView"} { + view, err := db.View(ctx, viewName) + if err != nil { + fmt.Println(err) + } else { + switch view.Type() { + case arangodb.ViewTypeArangoSearch: + { + viewSearch, err := view.ArangoSearchView() + if err != nil { + fmt.Println(err) + } else { + props, err := viewSearch.Properties(ctx) + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%+v\n", props) + } + } + } + case arangodb.ViewTypeSearchAlias: + { + viewAlias, err := view.ArangoSearchViewAlias() + if err != nil { + fmt.Println(err) + } else { + props, err := viewAlias.Properties(ctx) + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%+v\n", props) + } + } + } + default: + panic("Unsupported View type") + } + } +} +``` + +See [`ArangoSearchView.Properties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ArangoSearchView) +and [`ArangoSearchViewAlias.Properties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ArangoSearchViewAlias) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoSearch viewSearch = db.arangoSearch("myView"); +ArangoSearchPropertiesEntity viewSearchProps = viewSearch.getProperties(); + +SearchAlias viewAlias = db.searchAlias("mySearchAliasView"); +SearchAliasPropertiesEntity viewAliasProps = viewAlias.getProperties(); +``` + +See [`ArangoSearch.getProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoSearch.html#getProperties%28%29) +and [`SearchAlias.getProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/SearchAlias.html#getProperties%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +props = db.view("myView") +props = db.view("mySearchAliasView") +``` + +See [`StandardDatabase.view()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.view) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Set View properties + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired View. +2. Click **VIEWS** in the main navigation. +3. Click the card of the desired View. +4. Adjust the configuration using the form or the JSON editor. +5. Click the **Save view** button. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: viewUsage_04 +description: '' +--- +~db._create("coll"); +var viewSearch = db._view("myArangoSearchView"); +viewSearch.properties({ + cleanupIntervalStep: 12, + links: { + coll: { + includeAllFields: true + } + } +}, /*partialUpdate*/ true); +~db._dropView("myArangoSearchView"); + +~db.coll.ensureIndex({ type: "inverted", name: "idx", fields: [ "attr" ] }); +var viewAlias = db._view("mySearchAliasView"); +viewAlias.properties({ + indexes: [ + { collection: "coll", index: "idx" }, + ] +}, /*partialUpdate*/ true); +~viewSearch.properties({ links: { coll: null } }); +~viewAlias.properties({ indexes: [] }, false); +~db._drop("coll"); +``` + +See [`view.properties()`](../../develop/javascript-api/@arangodb/view-object.md#viewpropertiesnew-properties--partialupdate) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XPATCH -d '{"cleanupIntervalStep":12,"links":{"coll":{"includeAllFields":true}}}' http://localhost:8529/_db/mydb/_api/view/myView/properties +curl -XPATCH -d '{"indexes":[{"collection":"coll","index":"idx"}]}' http://localhost:8529/_db/mydb/_api/view/mySearchAliasView/properties +``` + +See the `PATCH /_db/{database-name}/_api/view/{view-name}/properties` endpoint +in the _HTTP API_ for details: +- [`arangosearch` View](../../develop/http-api/views/arangosearch-views.md#update-the-properties-of-an-arangosearch-view) +- [`search-alias` View](../../develop/http-api/views/search-alias-views.md#update-the-properties-of-a-search-alias-view) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let viewSearch = db.view("myView"); +let props = await viewSearch.updateProperties({ + cleanupIntervalStep: 12, + links: { + coll: { + includeAllFields: true + } + } +}); + +let viewAlias = db.view("mySearchAliasView"); +props = await viewAlias.updateProperties({ + indexes: [ + { collection: "coll", index: "idx" } + ] +}); +``` + +See [`View.updateProperties()`](https://arangodb.github.io/arangojs/latest/classes/views.View.html#updateProperties) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +view1, err := db.View(ctx, "myView") +if err != nil { + fmt.Println(err) +} else { + viewSearch, err := view1.ArangoSearchView() + if err != nil { + fmt.Println(err) + } else { + err = viewSearch.SetProperties(ctx, arangodb.ArangoSearchViewProperties{ + CleanupIntervalStep: utils.NewType(int64(12)), + Links: arangodb.ArangoSearchLinks{ + "coll": arangodb.ArangoSearchElementProperties{ + IncludeAllFields: utils.NewType(true), + }, + }, + }) + if err != nil { + fmt.Println(err) + } + } +} + +view2, err := db.View(ctx, "mySearchAliasView") +if err != nil { + fmt.Println(err) +} else { + viewAlias, err := view2.ArangoSearchViewAlias() + if err != nil { + fmt.Println(err) + } else { + err := viewAlias.SetProperties(ctx, arangodb.ArangoSearchAliasViewProperties{ + Indexes: []arangodb.ArangoSearchAliasIndex{ + { + Collection: "coll", + Index: "idx", // An inverted index with this name needs to exist + }, + }, + }) + if err != nil { + fmt.Println(err) + } + } +} +``` + +See [`ArangoSearchView.SetProperties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ArangoSearchView) +and [`ArangoSearchViewAlias.SetProperties()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#ArangoSearchViewAlias) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoSearch viewSearch = db.arangoSearch("myView"); +ArangoSearchPropertiesEntity viewSearchProps = viewSearch.updateProperties( + new ArangoSearchPropertiesOptions() + .cleanupIntervalStep(12L) + .link(CollectionLink.on("coll") + .includeAllFields(true) + ) +); + +SearchAlias viewAlias = db.searchAlias("mySearchAliasView"); +SearchAliasPropertiesEntity viewAliasProps = viewAlias.updateProperties( + new SearchAliasPropertiesOptions() + .indexes(new SearchAliasIndex("coll", "idx")) +); +``` + +See [`ArangoSearch.updateProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoSearch.html#updateProperties%28com.arangodb.model.arangosearch.ArangoSearchPropertiesOptions%29) +and [`SearchAlias.updateProperties()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/SearchAlias.html#updateProperties%28com.arangodb.model.arangosearch.SearchAliasPropertiesOptions%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +props = db.update_view("myView", { + "cleanupIntervalStep": 12, + "links": { + "coll": { + "includeAllFields": True + } + } +}) + +props = db.update_view("mySearchAliasView", { + "indexes": [ + { "collection": "coll", "index": "idx"} + ] +}) +``` + +See [`StandardDatabase.update_view()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.update_view) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +### Drop a View + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +1. If necessary, [switch to the database](databases.md#set-the-database-context) + that contains the desired View. +2. Click **VIEWS** in the main navigation. +3. Click the card of the desired View. +4. Click the **Delete** button and confirm the deletion. +{{< /tab >}} + +{{< tab "arangosh" >}} +```js +--- +name: viewUsage_08 +description: '' +--- +~removeIgnoreView("myView"); +~removeIgnoreView("myArangoSearchView"); +~removeIgnoreView("mySearchAliasView"); +db._dropView("myView"); +~db._dropView("myArangoSearchView"); +~db._dropView("mySearchAliasView"); +``` + +See [`db._dropView()`](../../develop/javascript-api/@arangodb/view-object.md#viewdrop) +in the _JavaScript API_ for details. +{{< /tab >}} + +{{< tab "cURL" >}} +```sh +curl -XDELETE http://localhost:8529/_db/mydb/_api/view/myView +curl -XDELETE http://localhost:8529/_db/mydb/_api/view/mySearchAliasView +``` + +See the `DELETE /_db/{database-name/_api/view/{view-name}` endpoint in the +_HTTP API_ for details: +- [`arangosearch` View](../../develop/http-api/views/arangosearch-views.md#drop-a-view) +- [`search-alias` View](../../develop/http-api/views/search-alias-views.md#drop-a-view) +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +let viewSearch = db.view("myView"); +let ok = await viewSearch.drop(); + +let viewAlias = db.view("mySearchAliasView"); +ok = await viewAlias.drop(); +``` + +See [`View.drop()`](https://arangodb.github.io/arangojs/latest/classes/views.View.html#drop) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +for _, viewName := range []string{"myView", "mySearchAliasView"} { + view, err := db.View(ctx, viewName) + if err != nil { + fmt.Println(err) + } else { + err = view.Remove(ctx) + if err != nil { + fmt.Println(err) + } + } +} +``` + +See [`View.Remove()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#View) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +ArangoView view = db.view("myView"); +view.drop(); +// -- or -- +ArangoSearch viewSearch = db.arangoSearch("myView"); +viewSearch.drop(); + +SearchAlias viewAlias = db.searchAlias("mySearchAliasView"); +viewAlias.drop(); +``` + +See [`ArangoView.drop()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoView.html#drop%28%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +ok = db.delete_view("myView") +ok = db.delete_view("mySearchAliasView") +``` + +See [`StandardDatabase.delete_view()`](https://docs.python-arango.com/en/main/specs.html#arango.database.StandardDatabase.delete_view) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/data-science/_index.md b/site/content/arangodb/oem/data-science/_index.md new file mode 100644 index 0000000000..45a4bfd813 --- /dev/null +++ b/site/content/arangodb/oem/data-science/_index.md @@ -0,0 +1,133 @@ +--- +title: Data Science +menuTitle: Data Science +weight: 115 +description: >- + ArangoDB lets you apply analytics and machine learning to graph data at scale +aliases: + - data-science/overview +--- +ArangoDB's Graph Analytics and GraphML capabilities provide various solutions +in data science and data analytics. Multiple data science personas within the +engineering space can make use of ArangoDB's set of tools and technologies that +enable analytics and machine learning on graph data. + +ArangoDB, as the foundation for GraphML, comes with the following key features: + +- **Scalable**: designed to support true scalability with high performance for + enterprise use cases. +- **Simple Ingestion**: easy integration in existing data infrastructure with + connectors to all leading data processing and data ecosystems. +- **Open Source**: extensibility and community. +- **NLP Support**: built-in text processing, search, and similarity ranking. + +![ArangoDB Machine Learning Architecture](../../../images/machine-learning-architecture.png) + +## Graph Analytics vs. GraphML + +This section classifies the complexity of the queries we can answer - +like running a simple query that shows what is the path that goes from one node +to another, or more complex tasks like node classification, +link prediction, and graph classification. + +### Graph Queries + +When you run an AQL query on a graph, a traversal query can go from a vertex to +multiple edges, and then the edges indicate what the next connected vertices are. +Graph queries can also determine the shortest paths between vertices. + +Graph queries can answer questions like _**Who can introduce me to person X**_? + +![Graph Query](../../../images/graph-query.png) + +See [Graphs in AQL](../aql/graphs/_index.md) for the supported graph queries. + +### Graph Analytics + +Graph analytics or graph algorithms is what you run on a graph if you want to +know aggregate information about your graph, while analyzing the entire graph. + +Graph analytics can answer questions like _**Who are the most connected persons**_? + +![Graph Analytics](../../../images/graph-analytics.png) + +ArangoDB offers _Graph Analytics Engines_ to run algorithms such as +connected components, label propagation, and PageRank on your data. This feature +is available for the Arango Managed Platform (AMP). See +[Graph Analytics](../../../ai-suite/graph-analytics.md) for details. + +### GraphML + +When applying machine learning on a graph, you can predict connections, get +better product recommendations, and also classify vertices, edges, and graphs. + +GraphML can answer questions like: +- _**Is there a connection between person X and person Y?**_ +- _**Will a customer churn?**_ +- _**Is this particular transaction Anomalous?**_ + +![Graph ML](../../../images/graph-ml.png) + +For ArangoDB's enterprise-ready, graph-powered machine learning offering, +see [ArangoGraphML](arangographml/_index.md). + +## Use Cases + +This section contains an overview of different use cases where Graph Analytics +and GraphML can be applied. + +### GraphML + +GraphML capabilities of using more data outperform conventional deep learning +methods and **solve high-computational complexity graph problems**, such as: +- Drug discovery, repurposing, and predicting adverse effects. +- Personalized product/service recommendation. +- Supply chain and logistics. + +With GraphML, you can also **predict relationships and structures**, such as: +- Predict molecules for treating diseases (precision medicine). +- Predict fraudulent behavior, credit risk, purchase of product or services. +- Predict relationships among customers, accounts. + +ArangoDB uses well-known GraphML frameworks like +[Deep Graph Library](https://www.dgl.ai) +and [PyTorch Geometric](https://pytorch-geometric.readthedocs.io/en/latest/) +and connects to these external machine learning libraries. When coupled to +ArangoDB, you are essentially integrating them with your graph dataset. + +## Example: ArangoFlix + +ArangoFlix is a complete movie recommendation application that predicts missing +links between a user and the movies they have not watched yet. + +This [interactive tutorial](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/Integrate_ArangoDB_with_PyG.ipynb) +demonstrates how to integrate ArangoDB with PyTorch Geometric to +build recommendation systems using Graph Neural Networks (GNNs). + +The full ArangoFlix demo website is accessible from the Arango Managed Platform (AMP), +the managed cloud for ArangoDB. You can open the demo website that connects to +your running database from the **Examples** tab of your deployment. + +{{< tip >}} +You can try out the Arango Managed Platform (AMP) free of charge for 14 days. +Sign up at [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +{{< /tip >}} + +The ArangoFlix demo uses five different recommendation methods: +- Content-Based using AQL +- Collaborative Filtering using AQL +- Content-Based using ML +- Matrix Factorization +- Graph Neural Networks + +![ArangoFlix demo](../../../images/data-science-arangoflix.png) + +The ArangoFlix website not only offers an example of how the user recommendations might +look like in real life, but it also provides information on a recommendation method, +an AQL query, a custom graph visualization for each movie, and more. + +## Sample datasets + +If you want to try out ArangoDB's data science features, you may use the +[`arango_datasets` Python package](../components/tools/arango-datasets.md) +to load sample datasets into a deployment. diff --git a/site/content/arangodb/oem/data-science/adapters/_index.md b/site/content/arangodb/oem/data-science/adapters/_index.md new file mode 100644 index 0000000000..0aa3efea24 --- /dev/null +++ b/site/content/arangodb/oem/data-science/adapters/_index.md @@ -0,0 +1,20 @@ +--- +title: Adapters +menuTitle: Adapters +weight: 140 +description: >- + ArangoDB offers multiple adapters that enable seamless integration with + data science tools +--- +ArangoDB Adapters provide a convenient way to integrate ArangoDB with popular +data science tools. By enabling you to to use your preferred programming +languages and libraries, these adapters simplify the data analysis +process and make it easier to leverage the power of ArangoDB in data science. + +Read more about the adapters available in ArangoDB: + +- [NetworkX](arangodb-networkx-adapter.md) +- [cuGraph](arangodb-cugraph-adapter.md) +- [PyTorch Geometric (PyG)](arangodb-pyg-adapter.md) +- [Deep Graph Library (DGL)](arangodb-dgl-adapter.md) +- [Resource Description Framework (RDF)](arangodb-rdf-adapter.md) diff --git a/site/content/arangodb/oem/data-science/adapters/arangodb-cugraph-adapter.md b/site/content/arangodb/oem/data-science/adapters/arangodb-cugraph-adapter.md new file mode 100644 index 0000000000..fffdffc4a6 --- /dev/null +++ b/site/content/arangodb/oem/data-science/adapters/arangodb-cugraph-adapter.md @@ -0,0 +1,152 @@ +--- +title: cuGraph Adapter +menuTitle: cuGraph +weight: 10 +description: >- + The cuGraph Adapter exports graphs from ArangoDB into RAPIDS cuGraph, a library of collective GPU-accelerated graph algorithms, and vice-versa +--- + + +{{< tip >}} +ArangoDB now has a closer integration with NetworkX allowing +NetworkX users to persist their graphs in ArangoDB & leverage +GPU-accelerated graph analytics via cuGraph. [Learn more here](https://arangodb.com/introducing-the-arangodb-networkx-persistence-layer/). +{{< /tip >}} + + +While offering a similar API and set of graph algorithms to NetworkX, +[RAPIDS cuGraph](https://docs.rapids.ai/api/cugraph/stable/) +library is GPU-based. Especially for large graphs, this +results in a significant performance improvement of cuGraph compared to NetworkX. +Please note that storing node attributes is currently not supported by cuGraph. +In order to run cuGraph, an Nvidia-CUDA-enabled GPU is required. + +## Resources + +The [cuGraph Adapter repository](https://github.com/arangoml/cugraph-adapter) +is available on Github. Check it out! + +## Installation + +To install the latest release of the cuGraph Adapter, +run the following command: + +```bash +pip install --extra-index-url=https://pypi.nvidia.com cudf-cu11 cugraph-cu11 +pip install adbcug-adapter +``` + +## Quickstart + +The following examples show how to get started with the cuGraph Adapter. +Check also the +[interactive tutorial](https://colab.research.google.com/github/arangoml/cugraph-adapter/blob/master/examples/ArangoDB_cuGraph_Adapter.ipynb). + +```py +import cudf +import cugraph + +from arango import ArangoClient +from adbcug_adapter import ADBCUG_Adapter, ADBCUG_Controller + +# Connect to ArangoDB +db = ArangoClient().db() + +# Instantiate the adapter +adbcug_adapter = ADBCUG_Adapter(db) +``` + +### ArangoDB to cuGraph +```py +####################### +# 1.1: via Graph name # +####################### + +cug_g = adbcug_adapter.arangodb_graph_to_cugraph("fraud-detection") + +############################# +# 1.2: via Collection names # +############################# + +cug_g = adbcug_adapter.arangodb_collections_to_cugraph( + "fraud-detection", + {"account", "bank", "branch", "Class", "customer"}, # Vertex collections + {"accountHolder", "Relationship", "transaction"}, # Edge collections +) +``` + +### cuGraph to ArangoDB +```py +################################# +# 2.1: with a Homogeneous Graph # +################################# + +edges = [("Person/A", "Person/B", 1), ("Person/B", "Person/C", -1)] +cug_g = cugraph.MultiGraph(directed=True) +cug_g.from_cudf_edgelist(cudf.DataFrame(edges, columns=["src", "dst", "weight"]), source="src", destination="dst", edge_attr="weight") + +edge_definitions = [ + { + "edge_collection": "knows", + "from_vertex_collections": ["Person"], + "to_vertex_collections": ["Person"], + } +] + +adb_g = adbcug_adapter.cugraph_to_arangodb("Knows", cug_g, edge_definitions, edge_attr="weight") + +############################################################## +# 2.2: with a Homogeneous Graph & a custom ADBCUG Controller # +############################################################## + +class Custom_ADBCUG_Controller(ADBCUG_Controller): + """ArangoDB-cuGraph controller. + + Responsible for controlling how nodes & edges are handled when + transitioning from ArangoDB to cuGraph & vice-versa. + """ + + def _prepare_cugraph_node(self, cug_node: dict, col: str) -> None: + """Prepare a cuGraph node before it gets inserted into the ArangoDB + collection **col**. + + :param cug_node: The cuGraph node object to (optionally) modify. + :param col: The ArangoDB collection the node belongs to. + """ + cug_node["foo"] = "bar" + + def _prepare_cugraph_edge(self, cug_edge: dict, col: str) -> None: + """Prepare a cuGraph edge before it gets inserted into the ArangoDB + collection **col**. + + :param cug_edge: The cuGraph edge object to (optionally) modify. + :param col: The ArangoDB collection the edge belongs to. + """ + cug_edge["bar"] = "foo" + +adb_g = ADBCUG_Adapter(db, Custom_ADBCUG_Controller()).cugraph_to_arangodb("Knows", cug_g, edge_definitions) + +################################### +# 2.3: with a Heterogeneous Graph # +################################### + +edges = [ + ('student:101', 'lecture:101'), + ('student:102', 'lecture:102'), + ('student:103', 'lecture:103'), + ('student:103', 'student:101'), + ('student:103', 'student:102'), + ('teacher:101', 'lecture:101'), + ('teacher:102', 'lecture:102'), + ('teacher:103', 'lecture:103'), + ('teacher:101', 'teacher:102'), + ('teacher:102', 'teacher:103') +] +cug_g = cugraph.MultiGraph(directed=True) +cug_g.from_cudf_edgelist(cudf.DataFrame(edges, columns=["src", "dst"]), source='src', destination='dst') + +# ... + +# Learn how this example is handled in Colab: +# https://colab.research.google.com/github/arangoml/cugraph-adapter/blob/master/examples/ArangoDB_cuGraph_Adapter.ipynb#scrollTo=nuVoCZQv6oyi +``` diff --git a/site/content/arangodb/oem/data-science/adapters/arangodb-dgl-adapter.md b/site/content/arangodb/oem/data-science/adapters/arangodb-dgl-adapter.md new file mode 100644 index 0000000000..4d654bfd6c --- /dev/null +++ b/site/content/arangodb/oem/data-science/adapters/arangodb-dgl-adapter.md @@ -0,0 +1,251 @@ +--- +title: DGL Adapter +menuTitle: DGL +weight: 20 +description: >- + The DGL Adapter exports graphs from ArangoDB into Deep Graph Library (DGL), a Python package for graph neural networks, and vice-versa +--- +The [Deep Graph Library (DGL)](https://www.dgl.ai/) is an +easy-to-use, high performance and scalable +Python package for deep learning on graphs. DGL is framework agnostic, meaning +that, if a deep graph model is a component of an end-to-end application, the +rest of the logics can be implemented in any major frameworks, such as PyTorch, +Apache MXNet or TensorFlow. + +## Resources + +Watch this +[lunch & learn session](https://www.arangodb.com/resources/lunch-sessions/graph-beyond-lunch-break-2-8-dgl-adapter/) +to get an introduction and see how to use the DGL adapter. + +The [DGL Adapter repository](https://github.com/arangoml/dgl-adapter) +is available on Github. Check it out! + +## Installation + +To install the latest release of the DGL Adapter, +run the following command: + +```bash +pip install adbdgl-adapter +``` + +## Quickstart + +The following examples show how to get started with the DGL Adapter. +Check also the +[interactive tutorial](https://colab.research.google.com/github/arangoml/dgl-adapter/blob/master/examples/ArangoDB_DGL_Adapter.ipynb). + +```py +import dgl +import torch +import pandas + +from arango import ArangoClient +from adbdgl_adapter import ADBDGL_Adapter, ADBDGL_Controller +from adbdgl_adapter.encoders import IdentityEncoder, CategoricalEncoder + +# Connect to ArangoDB +db = ArangoClient().db() + +# Instantiate the adapter +adbdgl_adapter = ADBDGL_Adapter(db) + +# Create a DGL Heterogeneous Graph +fake_hetero = dgl.heterograph({ + ("user", "follows", "user"): (torch.tensor([0, 1]), torch.tensor([1, 2])), + ("user", "follows", "topic"): (torch.tensor([1, 1]), torch.tensor([1, 2])), + ("user", "plays", "game"): (torch.tensor([0, 3]), torch.tensor([3, 4])), +}) +fake_hetero.nodes["user"].data["features"] = torch.tensor([21, 44, 16, 25]) +fake_hetero.nodes["user"].data["label"] = torch.tensor([1, 2, 0, 1]) +fake_hetero.nodes["game"].data["features"] = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1], [1, 1]]) +fake_hetero.edges[("user", "plays", "game")].data["features"] = torch.tensor([[6, 1], [1000, 0]]) +``` + +### DGL to ArangoDB +```py +############################ +# 1.1: without a Metagraph # +############################ + +adb_g = adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero) + +######################### +# 1.2: with a Metagraph # +######################### + +# Specifying a Metagraph provides customized adapter behavior +metagraph = { + "nodeTypes": { + "user": { + "features": "user_age", # 1) you can specify a string value for attribute renaming + "label": label_tensor_to_2_column_dataframe, # 2) you can specify a function for user-defined handling, as long as the function returns a Pandas DataFrame + }, + # 3) You can specify set of strings if you want to preserve the same DGL attribute names for the node/edge type + "game": {"features"} # this is equivalent to {"features": "features"} + }, + "edgeTypes": { + ("user", "plays", "game"): { + # 4) you can specify a list of strings for tensor dissasembly (if you know the number of node/edge features in advance) + "features": ["hours_played", "is_satisfied_with_game"] + }, + }, +} + +def label_tensor_to_2_column_dataframe(dgl_tensor: torch.Tensor, adb_df: pandas.DataFrame) -> pandas.DataFrame: + """A user-defined function to create two + ArangoDB attributes out of the 'user' label tensor + + :param dgl_tensor: The DGL Tensor containing the data + :type dgl_tensor: torch.Tensor + :param adb_df: The ArangoDB DataFrame to populate, whose + size is preset to the length of **dgl_tensor**. + :type adb_df: pandas.DataFrame + :return: The populated ArangoDB DataFrame + :rtype: pandas.DataFrame + """ + label_map = {0: "Class A", 1: "Class B", 2: "Class C"} + + adb_df["label_num"] = dgl_tensor.tolist() + adb_df["label_str"] = adb_df["label_num"].map(label_map) + + return adb_df + + +adb_g = adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero, metagraph, explicit_metagraph=False) + +####################################################### +# 1.3: with a Metagraph and `explicit_metagraph=True` # +####################################################### + +# With `explicit_metagraph=True`, the node & edge types omitted from the metagraph will NOT be converted to ArangoDB. +adb_g = adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero, metagraph, explicit_metagraph=True) + +######################################## +# 1.4: with a custom ADBDGL Controller # +######################################## + +class Custom_ADBDGL_Controller(ADBDGL_Controller): + def _prepare_dgl_node(self, dgl_node: dict, node_type: str) -> dict: + """Optionally modify a DGL node object before it gets inserted into its designated ArangoDB collection. + + :param dgl_node: The DGL node object to (optionally) modify. + :param node_type: The DGL Node Type of the node. + :return: The DGL Node object + """ + dgl_node["foo"] = "bar" + return dgl_node + + def _prepare_dgl_edge(self, dgl_edge: dict, edge_type: tuple) -> dict: + """Optionally modify a DGL edge object before it gets inserted into its designated ArangoDB collection. + + :param dgl_edge: The DGL edge object to (optionally) modify. + :param edge_type: The Edge Type of the DGL edge. Formatted + as (from_collection, edge_collection, to_collection) + :return: The DGL Edge object + """ + dgl_edge["bar"] = "foo" + return dgl_edge + + +adb_g = ADBDGL_Adapter(db, Custom_ADBDGL_Controller()).dgl_to_arangodb("FakeHetero", fake_hetero) +``` + +### ArangoDB to DGL +```py +# Start from scratch! +db.delete_graph("FakeHetero", drop_collections=True, ignore_missing=True) +adbdgl_adapter.dgl_to_arangodb("FakeHetero", fake_hetero) + +####################### +# 2.1: via Graph name # +####################### + +# Due to risk of ambiguity, this method does not transfer attributes +dgl_g = adbdgl_adapter.arangodb_graph_to_dgl("FakeHetero") + +############################# +# 2.2: via Collection names # +############################# + +# Due to risk of ambiguity, this method does not transfer attributes +dgl_g = adbdgl_adapter.arangodb_collections_to_dgl("FakeHetero", v_cols={"user", "game"}, e_cols={"plays"}) + +###################### +# 2.3: via Metagraph # +###################### + +# Transfers attributes "as is", meaning they are already formatted to DGL data standards. +# Learn more about the DGL Data Standards here: https://docs.dgl.ai/guide/graph.html#guide-graph +metagraph_v1 = { + "vertexCollections": { + # Move the "features" & "label" ArangoDB attributes to DGL as "features" & "label" Tensors + "user": {"features", "label"}, # equivalent to {"features": "features", "label": "label"} + "game": {"dgl_game_features": "features"}, + "topic": {}, + }, + "edgeCollections": { + "plays": {"dgl_plays_features": "features"}, + "follows": {} + }, +} + +dgl_g = adbdgl_adapter.arangodb_to_dgl("FakeHetero", metagraph_v1) + +################################################# +# 2.4: via Metagraph with user-defined encoders # +################################################# + +# Transforms attributes via user-defined encoders +metagraph_v2 = { + "vertexCollections": { + "Movies": { + "features": { # Build a feature matrix from the "Action" & "Drama" document attributes + "Action": IdentityEncoder(dtype=torch.long), + "Drama": IdentityEncoder(dtype=torch.long), + }, + "label": "Comedy", + }, + "Users": { + "features": { + "Gender": CategoricalEncoder(), # CategoricalEncoder(mapping={"M": 0, "F": 1}), + "Age": IdentityEncoder(dtype=torch.long), + } + }, + }, + "edgeCollections": {"Ratings": {"weight": "Rating"}}, +} + +dgl_g = adbdgl_adapter.arangodb_to_dgl("imdb", metagraph_v2) + +################################################## +# 2.5: via Metagraph with user-defined functions # +################################################## + +# Transforms attributes via user-defined functions +metagraph_v3 = { + "vertexCollections": { + "user": { + "features": udf_user_features, # supports named functions + "label": lambda df: torch.tensor(df["label"].to_list()), # also supports lambda functions + }, + "game": {"features": udf_game_features}, + }, + "edgeCollections": { + "plays": {"features": (lambda df: torch.tensor(df["features"].to_list()))}, + }, +} + +def udf_user_features(user_df: pandas.DataFrame) -> torch.Tensor: + # user_df["features"] = ... + return torch.tensor(user_df["features"].to_list()) + + +def udf_game_features(game_df: pandas.DataFrame) -> torch.Tensor: + # game_df["features"] = ... + return torch.tensor(game_df["features"].to_list()) + + +dgl_g = adbdgl_adapter.arangodb_to_dgl("FakeHetero", metagraph_v3) +``` \ No newline at end of file diff --git a/site/content/arangodb/oem/data-science/adapters/arangodb-networkx-adapter.md b/site/content/arangodb/oem/data-science/adapters/arangodb-networkx-adapter.md new file mode 100644 index 0000000000..1b3a58943d --- /dev/null +++ b/site/content/arangodb/oem/data-science/adapters/arangodb-networkx-adapter.md @@ -0,0 +1,202 @@ +--- +title: NetworkX Adapter +menuTitle: NetworkX +weight: 5 +description: >- + The NetworkX Adapter allows you to export graphs from ArangoDB into NetworkX for graph analysis with Python and vice-versa +--- +{{< tip >}} +ArangoDB now has a closer integration with NetworkX allowing +NetworkX users to persist their graphs in ArangoDB & leverage +GPU-accelerated graph analytics via cuGraph. [Learn more here](https://arangodb.com/introducing-the-arangodb-networkx-persistence-layer/). +{{< /tip >}} + +[NetworkX](https://networkx.org/) is a commonly used tool for +analysis of network-data. If your +analytics use cases require the use of all your graph data, for example, +to summarize graph structure, or answer global path traversal queries, +then using the ArangoDB Pregel API is recommended. If your analysis pertains +to a subgraph, then you may be interested in getting the NetworkX +representation of the subgraph for one of the following reasons: + +- An algorithm for your use case is available in NetworkX +- A library that you want to use for your use case works with NetworkX Graphs as input + +## Resources + +Watch this +[lunch & learn session](https://www.arangodb.com/resources/lunch-sessions/graph-beyond-lunch-break-2-9-introducing-the-arangodb-networkx-adapter/) +to see how using this adapter gives you the best of both +graph worlds - the speed and flexibility of ArangoDB combined with the +ubiquity of NetworkX. + +The [NetworkX Adapter repository](https://github.com/arangoml/networkx-adapter) +is available on Github. Check it out! + +## Installation + +To install the latest release of the NetworkX Adapter, +run the following command: + +```bash +pip install adbnx-adapter +``` + +## Quickstart + +The following examples show how to get started with the NetworkX Adapter. +Check also the +[interactive tutorial](https://colab.research.google.com/github/arangoml/networkx-adapter/blob/master/examples/ArangoDB_NetworkX_Adapter.ipynb). + +```py +import networkx as nx + +from arango import ArangoClient +from adbnx_adapter import ADBNX_Adapter, ADBNX_Controller + +# Connect to ArangoDB +db = ArangoClient().db() + +# Instantiate the adapter +adbnx_adapter = ADBNX_Adapter(db) +``` + +### ArangoDB to NetworkX +```py +####################### +# 1.1: via Graph name # +####################### + +nx_g = adbnx_adapter.arangodb_graph_to_networkx("fraud-detection") + +############################# +# 1.2: via Collection names # +############################# + +nx_g = adbnx_adapter.arangodb_collections_to_networkx( + "fraud-detection", + {"account", "bank", "branch", "Class", "customer"}, # Vertex collections + {"accountHolder", "Relationship", "transaction"} # Edge collections +) + +###################### +# 1.3: via Metagraph # +###################### + +metagraph = { + "vertexCollections": { + "account": {"Balance", "account_type", "customer_id", "rank"}, + "customer": {"Name", "rank"}, + }, + "edgeCollections": { + "transaction": {"transaction_amt", "sender_bank_id", "receiver_bank_id"}, + "accountHolder": {}, + }, +} + +nx_g = adbnx_adapter.arangodb_to_networkx("fraud-detection", metagraph) + +####################################### +# 1.4: with a custom ADBNX Controller # +####################################### + +class Custom_ADBNX_Controller(ADBNX_Controller): + """ArangoDB-NetworkX controller. + + Responsible for controlling how nodes & edges are handled when + transitioning from ArangoDB to NetworkX, and vice-versa. + """ + + def _prepare_arangodb_vertex(self, adb_vertex: dict, col: str) -> None: + """Prepare an ArangoDB vertex before it gets inserted into the NetworkX + graph. + + :param adb_vertex: The ArangoDB vertex object to (optionally) modify. + :param col: The ArangoDB collection the vertex belongs to. + """ + adb_vertex["foo"] = "bar" + + def _prepare_arangodb_edge(self, adb_edge: dict, col: str) -> None: + """Prepare an ArangoDB edge before it gets inserted into the NetworkX + graph. + + :param adb_edge: The ArangoDB edge object to (optionally) modify. + :param col: The ArangoDB collection the edge belongs to. + """ + adb_edge["bar"] = "foo" + +nx_g = ADBNX_Adapter(db, Custom_ADBNX_Controller()).arangodb_graph_to_networkx("fraud-detection") +``` + +### NetworkX to ArangoDB +```py +################################# +# 2.1: with a Homogeneous Graph # +################################# + +nx_g = nx.grid_2d_graph(5, 5) +edge_definitions = [ + { + "edge_collection": "to", + "from_vertex_collections": ["Grid_Node"], + "to_vertex_collections": ["Grid_Node"], + } +] + +adb_g = adbnx_adapter.networkx_to_arangodb("Grid", nx_g, edge_definitions) + +############################################################# +# 2.2: with a Homogeneous Graph & a custom ADBNX Controller # +############################################################# + +class Custom_ADBNX_Controller(ADBNX_Controller): + """ArangoDB-NetworkX controller. + + Responsible for controlling how nodes & edges are handled when + transitioning from ArangoDB to NetworkX, and vice-versa. + """ + + def _prepare_networkx_node(self, nx_node: dict, col: str) -> None: + """Prepare a NetworkX node before it gets inserted into the ArangoDB + collection **col**. + + :param nx_node: The NetworkX node object to (optionally) modify. + :param col: The ArangoDB collection the node belongs to. + """ + nx_node["foo"] = "bar" + + def _prepare_networkx_edge(self, nx_edge: dict, col: str) -> None: + """Prepare a NetworkX edge before it gets inserted into the ArangoDB + collection **col**. + + :param nx_edge: The NetworkX edge object to (optionally) modify. + :param col: The ArangoDB collection the edge belongs to. + """ + nx_edge["bar"] = "foo" + +adb_g = ADBNX_Adapter(db, Custom_ADBNX_Controller()).networkx_to_arangodb("Grid", nx_g, edge_definitions) + +################################### +# 2.3: with a Heterogeneous Graph # +################################### + +edges = [ + ('student:101', 'lecture:101'), + ('student:102', 'lecture:102'), + ('student:103', 'lecture:103'), + ('student:103', 'student:101'), + ('student:103', 'student:102'), + ('teacher:101', 'lecture:101'), + ('teacher:102', 'lecture:102'), + ('teacher:103', 'lecture:103'), + ('teacher:101', 'teacher:102'), + ('teacher:102', 'teacher:103') +] +nx_g = nx.MultiDiGraph() +nx_g.add_edges_from(edges) + +# ... + +# Learn how this example is handled in Colab: +# https://colab.research.google.com/github/arangoml/networkx-adapter/blob/master/examples/ArangoDB_NetworkX_Adapter.ipynb#scrollTo=OuU0J7p1E9OM +``` diff --git a/site/content/arangodb/oem/data-science/adapters/arangodb-pyg-adapter.md b/site/content/arangodb/oem/data-science/adapters/arangodb-pyg-adapter.md new file mode 100644 index 0000000000..361e602a7c --- /dev/null +++ b/site/content/arangodb/oem/data-science/adapters/arangodb-pyg-adapter.md @@ -0,0 +1,259 @@ +--- +title: PyTorch Geometric (PyG) Adapter +menuTitle: PyG +weight: 15 +description: >- + The PyG Adapter exports Graphs from ArangoDB into PyTorch Geometric (PyG), a PyTorch-based Graph Neural Network library, and vice-versa +--- +PyTorch Geometric (PyG) is a library built upon [PyTorch](https://pytorch.org/) +to easily write and train Graph Neural Networks (GNNs) for a wide range of +applications related to structured data. + +It consists of various methods for deep learning on graphs and other irregular structures, +also known as [geometric deep learning](https://geometricdeeplearning.com/), +from a variety of published papers. In addition, it consists of easy-to-use +mini-batch loaders for operating on many small and single giant graphs, +[multi GPU-support](https://github.com/pyg-team/pytorch_geometric/tree/master/examples/multi_gpu), +[`DataPipe` support](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/datapipe.py), +distributed graph learning via [Quiver](https://github.com/pyg-team/pytorch_geometric/tree/master/examples/quiver), +a large number of common benchmark datasets (based on simple interfaces to create your own), +the [GraphGym](https://pytorch-geometric.readthedocs.io/en/latest/notes/graphgym.html) +experiment manager, and helpful transforms, both for learning on arbitrary +graphs as well as on 3D meshes or point clouds. + +## Resources + +The [PyG Adapter repository](https://github.com/arangoml/pyg-adapter) +is available on Github. Check it out! + +## Installation + +To install the latest release of the PyG Adapter, +run the following command: + +```bash +pip install torch +pip install adbpyg-adapter +``` + +## Quickstart + +The following examples show how to get started with the PyG Adapter. +Check also the +[interactive tutorial](https://colab.research.google.com/github/arangoml/pyg-adapter/blob/master/examples/ArangoDB_PyG_Adapter.ipynb). + + +```py +import torch +import pandas +from torch_geometric.datasets import FakeHeteroDataset + +from arango import ArangoClient +from adbpyg_adapter import ADBPyG_Adapter, ADBPyG_Controller +from adbpyg_adapter.encoders import IdentityEncoder, CategoricalEncoder + +# Connect to ArangoDB +db = ArangoClient().db() + +# Instantiate the adapter +adbpyg_adapter = ADBPyG_Adapter(db) + +# Create a PyG Heterogeneous Graph +data = FakeHeteroDataset( + num_node_types=2, + num_edge_types=3, + avg_num_nodes=20, + avg_num_channels=3, # avg number of features per node + edge_dim=2, # number of features per edge + num_classes=3, # number of unique label values +)[0] +``` + +### PyG to ArangoDB + +Note: If the PyG graph contains `_key`, `_v_key`, or `_e_key` properties for any node / edge types, the adapter will assume to persist those values as [ArangoDB document keys](https://www.arangodb.com/docs/stable/data-modeling-naming-conventions-document-keys.html). See the `Full Cycle (ArangoDB -> PyG -> ArangoDB)` section below for an example. + +```py +############################# +# 1.1: without a Metagraph # +############################# + +adb_g = adbpyg_adapter.pyg_to_arangodb("FakeData", data) + +######################### +# 1.2: with a Metagraph # +######################### + +# Specifying a Metagraph provides customized adapter behavior +metagraph = { + "nodeTypes": { + "v0": { + "x": "features", # 1) You can specify a string value if you want to rename your PyG data when stored in ArangoDB + "y": y_tensor_to_2_column_dataframe, # 2) you can specify a function for user-defined handling, as long as the function returns a Pandas DataFrame + }, + # 3) You can specify set of strings if you want to preserve the same PyG attribute names for the node/edge type + "v1": {"x"} # this is equivalent to {"x": "x"} + }, + "edgeTypes": { + ("v0", "e0", "v0"): { + # 4) You can specify a list of strings for tensor dissasembly (if you know the number of node/edge features in advance) + "edge_attr": [ "a", "b"] + }, + }, +} + +def y_tensor_to_2_column_dataframe(pyg_tensor: torch.Tensor, adb_df: pandas.DataFrame) -> pandas.DataFrame: + """A user-defined function to create two + ArangoDB attributes out of the 'user' label tensor + + :param pyg_tensor: The PyG Tensor containing the data + :type pyg_tensor: torch.Tensor + :param adb_df: The ArangoDB DataFrame to populate, whose + size is preset to the length of **pyg_tensor**. + :type adb_df: pandas.DataFrame + :return: The populated ArangoDB DataFrame + :rtype: pandas.DataFrame + """ + label_map = {0: "Kiwi", 1: "Blueberry", 2: "Avocado"} + + adb_df["label_num"] = pyg_tensor.tolist() + adb_df["label_str"] = adb_df["label_num"].map(label_map) + + return adb_df + + +adb_g = adbpyg_adapter.pyg_to_arangodb("FakeData", data, metagraph, explicit_metagraph=False) + +####################################################### +# 1.3: with a Metagraph and `explicit_metagraph=True` # +####################################################### + +# With `explicit_metagraph=True`, the node & edge types omitted from the metagraph will NOT be converted to ArangoDB. +adb_g = adbpyg_adapter.pyg_to_arangodb("FakeData", data, metagraph, explicit_metagraph=True) + +######################################## +# 1.4: with a custom ADBPyG Controller # +######################################## + +class Custom_ADBPyG_Controller(ADBPyG_Controller): + def _prepare_pyg_node(self, pyg_node: dict, node_type: str) -> dict: + """Optionally modify a PyG node object before it gets inserted into its designated ArangoDB collection. + + :param pyg_node: The PyG node object to (optionally) modify. + :param node_type: The PyG Node Type of the node. + :return: The PyG Node object + """ + pyg_node["foo"] = "bar" + return pyg_node + + def _prepare_pyg_edge(self, pyg_edge: dict, edge_type: tuple) -> dict: + """Optionally modify a PyG edge object before it gets inserted into its designated ArangoDB collection. + + :param pyg_edge: The PyG edge object to (optionally) modify. + :param edge_type: The Edge Type of the PyG edge. Formatted + as (from_collection, edge_collection, to_collection) + :return: The PyG Edge object + """ + pyg_edge["bar"] = "foo" + return pyg_edge + + +adb_g = ADBPyG_Adapter(db, Custom_ADBPyG_Controller()).pyg_to_arangodb("FakeData", data) +``` + +### ArangoDB to PyG +```py +# Start from scratch! +db.delete_graph("FakeData", drop_collections=True, ignore_missing=True) +adbpyg_adapter.pyg_to_arangodb("FakeData", data) + +####################### +# 2.1: via Graph name # +####################### + +# Due to risk of ambiguity, this method does not transfer attributes +pyg_g = adbpyg_adapter.arangodb_graph_to_pyg("FakeData") + +############################# +# 2.2: via Collection names # +############################# + +# Due to risk of ambiguity, this method does not transfer attributes +pyg_g = adbpyg_adapter.arangodb_collections_to_pyg("FakeData", v_cols={"v0", "v1"}, e_cols={"e0"}) + +###################### +# 2.3: via Metagraph # +###################### + +# Transfers attributes "as is", meaning they are already formatted to PyG data standards. +metagraph_v1 = { + "vertexCollections": { + # Move the "x" & "y" ArangoDB attributes to PyG as "x" & "y" Tensors + "v0": {"x", "y"}, # equivalent to {"x": "x", "y": "y"} + "v1": {"v1_x": "x"}, # store the 'x' feature matrix as 'v1_x' in PyG + }, + "edgeCollections": { + "e0": {"edge_attr"}, + }, +} + +pyg_g = adbpyg_adapter.arangodb_to_pyg("FakeData", metagraph_v1) + +################################################# +# 2.4: via Metagraph with user-defined encoders # +################################################# + +# Transforms attributes via user-defined encoders +# For more info on user-defined encoders in PyG, see https://pytorch-geometric.readthedocs.io/en/latest/notes/load_csv.html +metagraph_v2 = { + "vertexCollections": { + "Movies": { + "x": { # Build a feature matrix from the "Action" & "Drama" document attributes + "Action": IdentityEncoder(dtype=torch.long), + "Drama": IdentityEncoder(dtype=torch.long), + }, + "y": "Comedy", + }, + "Users": { + "x": { + "Gender": CategoricalEncoder(mapping={"M": 0, "F": 1}), + "Age": IdentityEncoder(dtype=torch.long), + } + }, + }, + "edgeCollections": { + "Ratings": { "edge_weight": "Rating" } # Use the 'Rating' attribute for the PyG 'edge_weight' property + }, +} + +pyg_g = adbpyg_adapter.arangodb_to_pyg("imdb", metagraph_v2) + +################################################## +# 2.5: via Metagraph with user-defined functions # +################################################## + +# Transforms attributes via user-defined functions +metagraph_v3 = { + "vertexCollections": { + "v0": { + "x": udf_v0_x, # supports named functions + "y": lambda df: torch.tensor(df["y"].to_list()), # also supports lambda functions + }, + "v1": {"x": udf_v1_x}, + }, + "edgeCollections": { + "e0": {"edge_attr": (lambda df: torch.tensor(df["edge_attr"].to_list()))}, + }, +} + +def udf_v0_x(v0_df: pandas.DataFrame) -> torch.Tensor: + # v0_df["x"] = ... + return torch.tensor(v0_df["x"].to_list()) + + +def udf_v1_x(v1_df: pandas.DataFrame) -> torch.Tensor: + # v1_df["x"] = ... + return torch.tensor(v1_df["x"].to_list()) + +pyg_g = adbpyg_adapter.arangodb_to_pyg("FakeData", metagraph_v3) +``` \ No newline at end of file diff --git a/site/content/arangodb/oem/data-science/adapters/arangodb-rdf-adapter.md b/site/content/arangodb/oem/data-science/adapters/arangodb-rdf-adapter.md new file mode 100644 index 0000000000..87c171a7de --- /dev/null +++ b/site/content/arangodb/oem/data-science/adapters/arangodb-rdf-adapter.md @@ -0,0 +1,169 @@ +--- +title: RDF Adapter +menuTitle: RDF +weight: 25 +description: >- + ArangoRDF allows you to export graphs from ArangoDB into RDF and vice-versa +--- +RDF is a standard model for data interchange on the Web. RDF has features that +facilitate data merging even if the underlying schemas differ, and it +specifically supports the evolution of schemas over time without requiring all +the data consumers to be changed. + +RDF extends the linking structure of the Web to use URIs to name the relationship +between things as well as the two ends of the link (this is usually referred to +as a "triple"). Using this simple model, it allows structured and semi-structured +data to be mixed, exposed, and shared across different applications. + +This linking structure forms a directed, labeled graph, where the edges represent +the named link between two resources, represented by the graph nodes. This graph +view is the easiest possible mental model for RDF and is often used in +easy-to-understand visual explanations. + +## Resources + +- [ArangoRDF repository](https://github.com/ArangoDB-Community/ArangoRDF), + available on GitHub +- [ArangoRDF documentation](https://arangordf.readthedocs.io/en/latest/), + available on Read the Docs +- [RDF Primer](https://www.w3.org/TR/rdf11-concepts/) +- [RDFLib (Python)](https://pypi.org/project/rdflib/) + + +## Installation + +To install the latest release of ArangoRDF, +run the following command: + +```bash +pip install arango-rdf +``` + +## Quickstart + +The following examples show how to get started with ArangoRDF. +Check also the +[interactive tutorial](https://colab.research.google.com/github/ArangoDB-Community/ArangoRDF/blob/main/examples/ArangoRDF.ipynb). + +```py +from rdflib import Graph +from arango import ArangoClient +from arango_rdf import ArangoRDF + +db = ArangoClient().db() + +adbrdf = ArangoRDF(db) + +def beatles(): + g = Graph() + g.parse("https://raw.githubusercontent.com/ArangoDB-Community/ArangoRDF/main/tests/data/rdf/beatles.ttl", format="ttl") + return g +``` + +### RDF to ArangoDB + +**Note**: RDF-to-ArangoDB functionality has been implemented using concepts described in the paper +*[Transforming RDF-star to Property Graphs: A Preliminary Analysis of Transformation Approaches](https://arxiv.org/abs/2210.05781)*. So we offer two transformation approaches: + +1. [RDF-Topology Preserving Transformation (RPT)](https://arangordf.readthedocs.io/en/latest/rdf_to_arangodb_rpt.html) +2. [Property Graph Transformation (PGT)](https://arangordf.readthedocs.io/en/latest/rdf_to_arangodb_pgt.html) + +```py +# 1. RDF-Topology Preserving Transformation (RPT) +adbrdf.rdf_to_arangodb_by_rpt(name="BeatlesRPT", rdf_graph=beatles(), overwrite_graph=True) + +# 2. Property Graph Transformation (PGT) +adbrdf.rdf_to_arangodb_by_pgt(name="BeatlesPGT", rdf_graph=beatles(), overwrite_graph=True) +``` + +### ArangoDB to RDF + +```py +# pip install arango-datasets +from arango_datasets import Datasets + +name = "OPEN_INTELLIGENCE_ANGOLA" +Datasets(db).load(name) + +# 1. Graph to RDF +rdf_graph = adbrdf.arangodb_graph_to_rdf(name, rdf_graph=Graph()) + +# 2. Collections to RDF +rdf_graph_2 = adbrdf.arangodb_collections_to_rdf( + name, + rdf_graph=Graph(), + v_cols={"Event", "Actor", "Source"}, + e_cols={"eventActor", "hasSource"}, +) + +# 3. Metagraph to RDF +rdf_graph_3 = adbrdf.arangodb_to_rdf( + name=name, + rdf_graph=Graph(), + metagraph={ + "vertexCollections": { + "Event": {"date", "description", "fatalities"}, + "Actor": {"name"} + }, + "edgeCollections": { + "eventActor": {} + }, + }, +) +``` + +## Terminology + +### Literals + +In RDF, even literal values are referenced by edges. Literals cannot have +outgoing edges (i.e., cannot be the subject of a statement). RDF uses the XSD +type system for literals, so the string "Fred" is represented as `"Fred"^^xsd:String` +or fully expanded as `"Fred" ^^http://…"`. Literals can also contain language +and locale tags, for example, `"cat@en" ^^xsd:String` and `"chat@fr"^^xsd:String`. +These language tags can be useful and would ideally be preserved. + +Literals could be added as a property instead of creating a separate vertex; this +takes better advantage of using a property graph. If you are coming from a triple +store or downloading your data using a [SPARQL](https://www.w3.org/TR/rdf-sparql-query/) query you could handle these properties when +exporting. + +### Uniform Resource Identifiers (URIs) + +#### Prefixes + +In RDF, it is common to use [namespace prefixes](https://www.w3.org/TR/rdf-concepts/#section-URIspaces) with references for ease of parsing. This +can be easily handled with a property graph in a few ways. The easiest approach +is to add the statement prefixes to the document. This keeps the prefixes close +to the data but results in a lot of duplicated fields. Another approach would be +to append the prefix and form the full URI as a property. + +#### Identifiers + +URIs (e.g `http://dbpedia.org/resource/`) are used as universal identifiers in +RDF but contain contain special characters, namely `:` and `/`, which make them not +suitable for use as an ArangoDB `_key` attribute. Consequently, a hashing algorithm +is used within `ArangoRDF` to store the URI as an ArangoDB Vertex. + +### Blank Nodes + +Blank nodes are identifiers that have local scope and cannot (must not) be +referenced externally. Blank nodes are usually used in structures like lists and +other situations where it is inconvenient to create URIs. They will cause problems +when reconciling differences between graphs. Hashing these values as well is a way +to work around them but as they are considered temporary identifiers in the RDF +world they could pose consistency issues in your RDF graph. + +### Serializations + +There are numerous RDF serializations, including XML and JSON based +serializations and gzipped serializations. Third party libraries will likely handle +all of the serializations but it is a step that may effect how data is imported. + +### Ontology, Taxonomy, Class Inheritance, and RDFS + +The final consideration is something that for many is the core of RDF and +semantic data: [Ontologies](https://www.w3.org/standards/semanticweb/ontology). +Not just ontologies but also class inheritance, and schema validation. One method +would be to add the ontology in a similar way to what has been suggested for the +RDF graphs as ontologies are usually structured in the same way (or can be). \ No newline at end of file diff --git a/site/content/arangodb/oem/data-science/arangograph-notebooks.md b/site/content/arangodb/oem/data-science/arangograph-notebooks.md new file mode 100644 index 0000000000..74a64a5c78 --- /dev/null +++ b/site/content/arangodb/oem/data-science/arangograph-notebooks.md @@ -0,0 +1,22 @@ +--- +title: AMP Notebooks +menuTitle: AMP Notebooks +weight: 130 +description: >- + Colocated Jupyter Notebooks within the Arango Managed Platform +--- +{{< tip >}} +AMP Notebooks don't include the ArangoGraphML services. +To enable the ArangoGraphML services, +[get in touch](https://arango.ai/contact-us/) +with the Arango team. +{{< /tip >}} + +The AMP Notebook is a JupyterLab notebook embedded in the +[Arango Managed Platform](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +The notebook integrates seamlessly with the platform, +automatically connecting to AMP services and ArangoDB. +This makes it much easier to leverage these resources without having +to download any data locally or to remember user IDs, passwords, and endpoint URLs. + +For more information, see the [Notebooks](../../../amp/notebooks.md) documentation. diff --git a/site/content/arangodb/oem/data-science/arangographml/_index.md b/site/content/arangodb/oem/data-science/arangographml/_index.md new file mode 100644 index 0000000000..9014060a3a --- /dev/null +++ b/site/content/arangodb/oem/data-science/arangographml/_index.md @@ -0,0 +1,181 @@ +--- +title: ArangoGraphML +menuTitle: ArangoGraphML +weight: 125 +description: >- + Enterprise-ready, graph-powered machine learning as a cloud service or self-managed +aliases: + - graphml +--- +Traditional Machine Learning (ML) overlooks the connections and relationships +between data points, which is where graph machine learning excels. However, +accessibility to GraphML has been limited to sizable enterprises equipped with +specialized teams of data scientists. ArangoGraphML simplifies the utilization of GraphML, +enabling a broader range of personas to extract profound insights from their data. + +## How GraphML works + +Graph machine learning leverages the inherent structure of graph data, where +entities (nodes) and their relationships (edges) form a network. Unlike +traditional ML, which primarily operates on tabular data, GraphML applies +specialized algorithms like Graph Neural Networks (GNNs), node embeddings, and +link prediction to uncover complex patterns and insights. + +1. **Graph Construction**: + Raw data is transformed into a graph structure, defining nodes and edges based + on real-world relationships. +2. **Featurization**: + Nodes and edges are enriched with features that help in training predictive models. +3. **Model Training**: + Machine learning techniques are applied on GNNs to identify patterns and make predictions. +4. **Inference & Insights**: + The trained model is used to classify nodes, detect anomalies, recommend items, + or predict future connections. + +ArangoGraphML streamlines these steps, providing an intuitive and scalable +framework to integrate GraphML into various applications, from fraud detection +to recommendation systems. + +![GraphML Embeddings](../../../../images/GraphML-Embeddings.webp) + +![GraphML Workflow](../../../../images/GraphML-How-it-works.webp) + +It is no longer necessary to understand the complexities involved with graph +machine learning, thanks to the accessibility of the ArangoML package. +Solutions with ArangoGraphML only require input from a user about +their data, and the ArangoGraphML managed service handles the rest. + +The platform comes preloaded with all the tools needed to prepare your graph +for machine learning, high-accuracy training, and persisting predictions back +to the database for application use. + +## Supported Tasks + +### Node Classification + +Node classification is a **supervised learning** task where the goal is to +predict the label of a node based on both its own features and its relationships +within the graph. It requires a set of labeled nodes to train a model, which then +classifies unlabeled nodes based on learned patterns. + +**How it works in ArangoGraphML** + +- A portion of the nodes in a graph is labeled for training. +- The model learns patterns from both **node features** and + **structural relationships** (neighboring nodes and connections). +- It predicts labels for unlabeled nodes based on these learned patterns. + +**Example Use Cases** + +- **Fraud Detection in Financial Networks** + - **Problem:** Fraudsters often create multiple accounts or interact within + suspicious clusters to evade detection. + - **Solution:** A transaction graph is built where nodes represent users and + edges represent transactions. The model learns patterns from labeled + fraudulent and legitimate users, detecting hidden fraud rings based on + **both user attributes and transaction relationships**. + +- **Customer Segmentation in E-Commerce & Social Media** + - **Problem:** Businesses need to categorize customers based on purchasing + behavior and engagement. + - **Solution:** A graph is built where nodes represent customers and edges + represent interactions (purchases, reviews, social connections). The model + predicts the category of each user based on how similar they are to other users + **not just by their personal data, but also by how they are connected to others**. + +- **Disease Classification in Biomedical Networks** + - **Problem:** Identifying proteins or genes associated with a disease. + - **Solution:** A protein interaction graph is built where nodes are proteins + and edges represent biochemical interactions. The model classifies unknown + proteins based on their interactions with known disease-related proteins, + rather than just their individual properties. + +### Node Embedding Generation + +Node embedding is an **unsupervised learning** technique that converts nodes +into numerical vector representations, preserving their **structural relationships** +within the graph. Unlike simple feature aggregation, node embeddings +**capture the influence of neighboring nodes and graph topology**, making +them powerful for downstream tasks like clustering, anomaly detection, +and link prediction. These combinations can provide valuable insights. +Consider using [ArangoDB's Vector Search](https://arangodb.com/2024/11/vector-search-in-arangodb-practical-insights-and-hands-on-examples/) +capabilities to find similar nodes based on their embeddings. + +**Feature Embeddings versus Node Embeddings** + +**Feature Embeddings** are vector representations derived from the attributes or +features associated with nodes. These embeddings aim to capture the inherent +characteristics of the data. For example, in a social network, a +feature embedding might encode user attributes like age, location, and +interests. Techniques like **Word2Vec**, **TF-IDF**, or **autoencoders** are +commonly used to generate such embeddings. + +In the context of graphs, **Node Embeddings** are a +**combination of a node's feature embedding and the structural information from its connected edges**. +Essentially, they aggregate both the node's attributes and the connectivity patterns +within the graph. This fusion helps capture not only the individual properties of +a node but also its position and role within the network. + +**How it works in ArangoGraphML** + +- The model learns an embedding (a vector representation) for each node based on its + **position within the graph and its connections**. +- It **does not rely on labeled data** – instead, it captures structural patterns + through graph traversal and aggregation of neighbor information. +- These embeddings can be used for similarity searches, clustering, and predictive tasks. + +**Example Use Cases** + +- **Recommendation Systems (E-commerce & Streaming Platforms)** + - **Problem:** Platforms like Amazon, Netflix, and Spotify need to recommend products, + movies, or songs. + - **Solution:** A user-item interaction graph is built where nodes are users + and products, and edges represent interactions (purchases, ratings, listens). + **Embeddings encode relationships**, allowing the system to recommend similar + items based on user behavior and network influence rather than just individual + preferences. + +- **Anomaly Detection in Cybersecurity & Finance** + - **Problem:** Detecting unusual activity (e.g., cyber attacks, money laundering) + in complex networks. + - **Solution:** A network of IP addresses, users, and transactions is represented as + a graph. Nodes with embeddings that significantly deviate from normal patterns + are flagged as potential threats. The key advantage here is that anomalies are + detected based on **network structure, not just individual activity logs**. + +- **Link Prediction (Social & Knowledge Graphs)** + - **Problem:** Predicting new relationships, such as suggesting friends on + social media or forecasting research paper citations. + - **Solution:** A social network graph is created where nodes are users, and + edges represent friendships. **Embeddings capture the likelihood of + connections forming based on shared neighborhoods and structural + similarities, even if users have never interacted before**. + +### Key Differences + +| Feature | Node Classification | Node Embedding Generation | +|-----------------------|---------------------|----------------------------| +| **Learning Type** | Supervised | Unsupervised | +| **Input Data** | Labeled nodes | Graph structure & features | +| **Output** | Predicted labels | Node embeddings (vectors) | +| **Key Advantage** | Learns labels based on node connections and attributes | Learns structural patterns and node relationships | +| **Use Cases** | Fraud detection, customer segmentation, disease classification | Recommendations, anomaly detection, link prediction | + +ArangoGraphML provides the infrastructure to efficiently train and apply these +models, helping users extract meaningful insights from complex graph data. + +## Metrics and Compliance + +ArangoGraphML supports tracking your ML pipeline by storing all relevant metadata +and metrics in a Graph called ArangoPipe. This is only available to you and is never +viewable by ArangoDB. This metadata graph links all experiments +to the source data, feature generation activities, training runs, and prediction +jobs, allowing you to track the entire ML pipeline without having to leave ArangoDB. + +### Security + +Each deployment that uses ArangoGraphML has an `arangopipe` database created, +which houses all ML Metadata information. Since this data lives within the deployment, +it benefits from the Arango Managed Platform (AMP) security features and SOC 2 compliance. +All ArangoGraphML services live alongside the AMP deployment and are only +accessible within that organization. diff --git a/site/content/arangodb/oem/data-science/arangographml/deploy.md b/site/content/arangodb/oem/data-science/arangographml/deploy.md new file mode 100644 index 0000000000..4ecd3f8d5b --- /dev/null +++ b/site/content/arangodb/oem/data-science/arangographml/deploy.md @@ -0,0 +1,78 @@ +--- +title: Deploy ArangoGraphML +menuTitle: Deploy +weight: 5 +description: >- + You can deploy ArangoGraphML in your own Kubernetes cluster or use the managed + cloud service that comes with a ready-to-go, pre-configured environment +--- + +## Managed cloud service versus self-managed + +ArangoDB offers two deployment options, tailored to suit diverse requirements +and infrastructure preferences: +- Managed cloud service via the [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +- Self-managed solution via the [ArangoDB Kubernetes Operator](https://github.com/arangodb/kube-arangodb) + +### ArangoGraphML + +ArangoGraphML provides enterprise-ready Graph Machine Learning as a +Cloud Service via Jupyter Notebooks that run on the +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). + +{{< tip >}} +To get access to ArangoGraphML services and packages, +[get in touch](https://arango.ai/contact-us/) +with the Arango team. +{{< /tip >}} + +- **Accessible at all levels** + - Low code UI + - Notebooks + - APIs +- **Full usability** + - MLOps lifecycle + - Metrics + - Metadata capture + - Model management + +![ArangoGraphML Pipeline](../../../../images/ArangoGraphML_Pipeline.png) + +#### Setup + +The ArangoGraphML managed-service runs on +[AMP](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +It offers a pre-configured environment where everything, +including necessary components and configurations, comes preloaded. You don't +need to set up or configure the infrastructure, and can immediately start using the +GraphML functionalities. + +To summarize, all you need to do is: +1. Sign up for an [AMP account](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +2. Create a new [deployment in AMP](../../../../amp/deployments/_index.md#how-to-create-a-new-deployment). +3. Start using the ArangoGraphML functionalities. + +### Self-managed ArangoGraphML + +{{< tag "ArangoDB Enterprise Edition" >}} + +The self-managed solution enables you to deploy and manage ArangoML within your +Kubernetes cluster using the [ArangoDB Kubernetes Operator](https://github.com/arangodb/kube-arangodb). + +The self-managed package includes the same features as in ArangoGraphML. +The primary distinction lies in the environment setup: with the self-managed +solution, you have direct control over configuring your environment. + +#### Setup + +You can run ArangoGraphML in your Kubernetes +cluster provided you already have a running `ArangoDeployment`. If you don't +have one yet, consider checking the installation guide of the +[ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/using-the-operator.html) +and the [ArangoDeployment Custom Resource](https://arangodb.github.io/kube-arangodb/docs/deployment-resource-reference.html) +description. + +To start ArangoGraphML in your Kubernetes cluster, follow the instructions provided +in the [ArangoMLExtension Custom Resource](https://arangodb.github.io/kube-arangodb/docs/mlextension-resource.html) +description. Once the `CustomResource` has been created and the ArangoGraphML extension +is ready, you can start using it. \ No newline at end of file diff --git a/site/content/arangodb/oem/data-science/arangographml/getting-started.md b/site/content/arangodb/oem/data-science/arangographml/getting-started.md new file mode 100644 index 0000000000..de9d2ae042 --- /dev/null +++ b/site/content/arangodb/oem/data-science/arangographml/getting-started.md @@ -0,0 +1,967 @@ +--- +title: Getting Started with ArangoGraphML +menuTitle: Getting Started +weight: 10 +description: >- + How to control all resources inside ArangoGraphML in a scriptable manner +aliases: + - getting-started-with-arangographml +--- +ArangoGraphML provides an easy-to-use & scalable interface to run Graph Machine Learning on ArangoDB Data. Since all of the orchestration and ML logic is managed by the Arango Managed Platform (AMP), all that is typically required are JSON specifications outlining individual processes to solve an ML Task. If you are using the self-managed solution, additional configurations may be required. + +The `arangoml` is a Python Package allowing you to manage all of the necessary ArangoGraphML components, including: +- **Project Management**: Projects are a metadata-tracking entity that sit at the top level of ArangoGraphML. All activities must link to a project. +- **Featurization**: The step of converting human-understandable data to machine-understandable data (i.e features), such that it can be used to train Graph Neural Networks (GNNs). +- **Training**: Train a set of models based on the name of the generated/existing features, and a definition of the ML Task we want to solve (e.g Node Classification, Embedding Generation). +- **Model Selection**: Select the best model based on the metrics generated during training. +- **Predictions**: Generate predictions based on the selected model, and persit the results to the source graph (either in the source document, or in a new collection). + +{{< tip >}} +To enable the ArangoGraphML services in the Arango Managed Platform (AMP), +[get in touch](https://arango.ai/contact-us/) +with the Arango team. Regular notebooks in AMP don't include the +`arangoml` package. +{{< /tip >}} + +ArangoGraphML's suite of services and packages is driven by **"specifications"**. These specifications are standard Python dictionaries that describe the task being performed, & the data being used. The ArangoGraphML services work closely together, with the previous task being used as the input for the next. + +Let's take a look at using the `arangoml` package to: + +1. Manage projects +2. Featurize data +3. Submit Training Jobs +4. Evaluate Model Metrics +5. Generate Predictions + +## Initialize ArangoML + +{{< tabs "arangoml" >}} + +{{< tab "ArangoGraphML" >}} + +**API Documentation: [arangoml.ArangoMLMagics.enable_arangoml](https://arangoml.github.io/arangoml/magics.html#arangoml.magic.ArangoMLMagics.enable_arangoml)** + +The `arangoml` package comes pre-loaded with every ArangoGraphML notebook environment. +To start using it, simply import it, and enable it via a Jupyter Magic Command. + +```py +arangoml = %enable_arangoml +``` + +{{< tip >}} +ArangoGraphML comes with other ArangoDB Magic Commands! See the full list [here](https://arangoml.github.io/arangoml/magics.html). +{{< /tip >}} + +{{< /tab >}} + +{{< tab "Self-managed" >}} + +**API Documentation: [arangoml.ArangoML](https://arangoml.github.io/arangoml/client.html#arangoml.main.ArangoML)** + +The `ArangoML` class is the main entry point for the `arangoml` package. +It has the following parameters: +- `client`: An instance of arango.client.ArangoClient. Defaults to `None`. If not provided, the **hosts** argument must be provided. +- `hosts`: The ArangoDB host(s) to connect to. This can be a single host, or a + list of hosts. +- `username`: The ArangoDB username to use for authentication. +- `password`: The ArangoDB password to use for authentication. +- `user_token`: The ArangoDB user token to use for authentication. + This is an alternative to username/password authentication. +- `ca_cert_file`: The path to the CA certificate file to use for TLS + verification. Defaults to `None`. +- `api_endpoint`: The URL to the ArangoGraphML API Service. +- `settings_files`: A list of secrets files to be loaded as settings. Parameters provided as arguments will override those in the settings files (e.g `settings.toml`). +- `version`: The ArangoML API date version. Defaults to the latest version. + +It is possible to instantiate an ArangoML object in multiple ways: + +1. Via parameters +```py +from arangoml import ArangoML + +arangoml = ArangoML( + hosts="http://localhost:8529" + username="root", + password="password", + # ca_cert_file="/path/to/ca.pem", + # user_token="..." + api_endpoint="http://localhost:8501", +) +``` + +2. Via parameters and a custom `ArangoClient` instance +```py +from arangoml import ArangoML +from arango import ArangoClient + +client = ArangoClient( + hosts="http://localhost:8529", + verify_override="/path/to/ca.pem", + hosts_resolver=..., + ... +) + +arangoml = ArangoML( + client=client, + username="root", + password="password", + # user_token="..." + api_endpoint="http://localhost:8501", +) +``` + +3. Via environment variables +```py +import os +from arangoml import ArangoML + +os.environ["ARANGODB_HOSTS"] = "http://localhost:8529" +os.environ["ARANGODB_CA_CERT_FILE"]="/path/to/ca.pem" +os.environ["ARANGODB_USER"] = "root" +os.environ["ARANGODB_PW"] = "password" +# os.environ["ARANGODB_USER_TOKEN"] = "..." +os.environ["ML_API_SERVICES_ENDPOINT"] = "http://localhost:8501" + +arangoml = ArangoML() +``` + +4. Via configuration files +```py +import os +from arangoml import ArangoML + +arangoml = ArangoML(settings_files=["settings_1.toml", "settings_2.toml"]) +``` + +5. Via a Jupyter Magic Command + +**API Documentation: [arangoml.ArangoMLMagics.enable_arangoml](https://arangoml.github.io/arangoml/magics.html#arangoml.magic.ArangoMLMagics.enable_arangoml)** + +``` +%load_ext arangoml +%enable_arangoml +``` +{{< info >}} +This assumes you are working out of a Jupyter Notebook environment, and +have set the environment variables in the notebook environment with user +authentication that has **_system** access. +{{< /info >}} + +{{< tip >}} +Running `%load_ext arangoml` also provides access to other [ArangoGraphML +Jupyter Magic Commands](https://arangoml.github.io/arangoml/magics.html). +{{< /tip >}} + +{{< /tab >}} + +{{< /tabs >}} + +## Load the database + +This example is using ArangoML to predict the **class** of `Events` in a +Knowledge Graph constructed from the [GDELT Project](https://www.gdeltproject.org/). + +> GDELT monitors the world's news media from nearly every corner of every + country in print, broadcast, and web formats, in over 100 languages, every + moment of every day. [...] Put simply, the GDELT Project is a realtime open + data global graph over human society as seen through the eyes of the world's + news media, reaching deeply into local events, reaction, discourse, and + emotions of the most remote corners of the world in near-realtime and making + all of this available as an open data firehose to enable research over human + society. + +The events used range from peaceful protests to significant battles in Angola. +The image below depicts the connections around an example event: + +![Example Event](../../../../images/ArangoML_open_intelligence_sample.png) + +You can also see a larger portion of this graph, showing how the events, actors, +news sources, and locations are interconnected into a large graph. + +![Example Event](../../../../images/ArangoML_open_intelligence_visualization.png) + +Let's get started! + +{{< tabs "arangoml" >}} + +{{< tab "ArangoGraphML" >}} + +The [`arango-datasets`](../../components/tools/arango-datasets.md) Python package +allows you to load pre-defined datasets into ArangoDB. It comes pre-installed in the +ArangoGraphML notebook environment. + +```py +DATASET_NAME = "OPEN_INTELLIGENCE_ANGOLA" + +%delete_database {DATASET_NAME} +%create_database {DATASET_NAME} +%use_database {DATASET_NAME} +%load_dataset {DATASET_NAME} +``` + +{{< /tab >}} + +{{< tab "Self-managed" >}} + +The [`arango-datasets`](../../components/tools/arango-datasets.md) Python package +allows you to load pre-defined datasets into ArangoDB. It can be installed with the +following command: + +``` +pip install arango-datasets +``` + +```py +from arango_datasets.datasets import Datasets + +DATASET_NAME = "OPEN_INTELLIGENCE_ANGOLA" + +db = arangoml.client.db( + name=DATASET_NAME, + username=arangoml.settings.get("ARANGODB_USER"), + password=arangoml.settings.get("ARANGODB_PW"), + user_token=arangoml.settings.get("ARANGODB_USER_TOKEN"), + verify=True +) + +Datasets(dataset_db).load(DATASET_NAME) +``` +{{< /tab >}} + +{{< /tabs >}} + +## Projects + +**API Documentation: [ArangoML.projects](https://arangoml.github.io/arangoml/api.html#projects)** + +Projects are an important reference used throughout the entire ArangoGraphML +lifecycle. All activities link back to a project. The creation of the project +is very simple. + +### Get/Create a project +```py +project = arangoml.get_or_create_project(DATASET_NAME) +``` + +### List projects + +```py +arangoml.projects.list_projects() +``` + +## Featurization + +**API Documentation: [ArangoML.jobs.featurize](https://arangoml.github.io/arangoml/api.html#agml_api.jobs.v1.api.jobs_api.JobsApi.featurize)** + +**The Featurization Service depends on a `Featurization Specification` that contains**: +- `featurizationName`: A name for the featurization task. + +- `projectName`: The associated project name. You can use `project.name` here + if it was created or retrieved as described above. + +- `graphName`: The associated graph name that exists within the database. + +- `featureSetID` Optional: The ID of an existing Feature Set to re-use. If provided, the `metagraph` dictionary can be ommitted. Defaults to `None`. + +- `featurizationConfiguration` Optional: The optional default configuration to be applied + across all features. Individual collection feature settings override this option. + + - `featurePrefix`: The prefix to be applied to all individual features generated. Default is `feat_`. + + - `outputName`: Adjust the default feature name. This can be any valid ArangoDB attribute name. Defaults to `x`. + + - `dimensionalityReduction`: Object configuring dimensionality reduction. + - `disabled`: Whether to disable dimensionality reduction. Default is `false`, + therefore dimensionality reduction is applied after Featurization by default. + - `size`: The number of dimensions to reduce the feature length to. Default is `512`. + + - `defaultsPerFeatureType`: A dictionary mapping each feature to how missing or mismatched values should be handled. The keys of this dictionary are the features, and the values are sub-dictionaries with the following keys: + - `missing`: A sub-dictionary detailing how missing values should be handled. + - `strategy`: The strategy to use for missing values. Options include `REPLACE` or `RAISE`. + - `replacement`: The value to replace missing values with. Only needed if `strategy` is `REPLACE`. + - `mismatch`: A sub-dictionary detailing how mismatched values should be handled. + - `strategy`: The strategy to use for mismatched values. Options include `REPLACE`, `RAISE`, `COERCE_REPLACE`, or `COERCE_RAISE`. + - `replacement`: The value to replace mismatched values with. Only needed if `strategy` is `REPLACE`, or `COERCE_REPLACE`. + +- `jobConfiguration` Optional: A set of configurations that are applied to the job. + - `batchSize`: The number of documents to process in a single batch. Default is `32`. + - `runAnalysisChecks`: Whether to run analysis checks, used to perform a high-level analysis of the data quality before proceeding. Default is `true`. + - `skipLabels`: Skips the featurization process for attributes marked as `label`. Default is `false`. + - `useFeatureStore`: Enables the use of the Feature Store database, which allows you to store features separately from your Source Database. Default is `false`, therefore features are written to the source graph. + - `overwriteFSGraph`: Whether to overwrite the Feature Store Graph if features were previously generated. Default is `false`, therefore features are written to an existing Feature Store Graph.s + - `writeToSourceGraph`: Whether to store the generated features on the Source Graph. Default is `true`. + +- `metagraph`: Metadata to represent the vertex & edge collections of the graph. + - `vertexCollections`: A dictionary mapping the vertex collection names to the following values: + - `features`: A dictionary mapping document properties to the following values: + - `featureType`: The type of feature. Options include `text`, `category`, `numeric`, or `label`. + - `config`: Collection-level configuration settings. + - `featurePrefix`: Identical to global `featurePrefix` but for this collection. + - `dimensionalityReduction`: Identical to global `dimensionalityReduction` but for this collection. + - `outputName`: Identical to global `outputName`, but specifically for this collection. + - `defaultsPerFeatureType`: Identical to global `defaultsPerFeatureType`, but specifically for this collection. + - `edgeCollections`: A dictionary mapping the edge collection names to an empty dictionary, as edge attributes are not currently supported. + +The Featurization Specification example is used for the GDELT dataset: +- It featurizes the `name` attribute of the `Actor`, `Class`, `Country`, + `Source`, `Location`, and `Region` collections as a `text` features. +- It featurizes the `description` attribute of the `Event` collection as a + `text` feature. +- It featurizes the `label` attribute of the `Event` collection as a `label` + feature (this is the attribute you want to predict). +- It featurizes the `sourceScale` attribute of the `Source` collection as a + `category` feature. +- It featurizes the `name` attribute of the `Region` collection as a + `category` feature. + +```py +# 1. Define the Featurization Specification + +featurization_spec = { + "databaseName": dataset_db.name, + "projectName": project.name, + "graphName": graph.name, + "featurizationName": f"{DATASET_NAME}_Featurization", + "featurizationConfiguration": { + "featurePrefix": "feat_", + "dimensionalityReduction": { "size": 256 }, + "outputName": "x" + }, + "jobConfiguration": { + "batchSize": 512, + "useFeatureStore": False, + "runAnalysisChecks": False, + }, + "metagraph": { + "vertexCollections": { + "Actor": { + "features": { + "name": { + "featureType": "text", + }, + } + }, + "Country": { + "features": { + "name": { + "featureType": "text", + } + } + }, + "Event": { + "features": { + "description": { + "featureType": "text", + }, + "label": { + "featureType": "label", + }, + } + }, + "Source": { + "features": { + "name": { + "featureType": "text", + }, + "sourceScale": { + "featureType": "category", + }, + } + }, + "Location": { + "features": { + "name": { + "featureType": "text", + } + } + }, + "Region": { + "features": { + "name": { + "featureType": "category", + }, + } + } + }, + "edgeCollections": { + "eventActor": {}, + "hasSource": {}, + "hasLocation": {}, + "inCountry": {}, + "inRegion": {}, + } + } +} +``` + +Once the specification has been defined, a Featurization Job can be triggered using the `arangoml.jobs.featurize` method: + +```py +# 2. Submit a Featurization Job + +featurization_job = arangoml.jobs.featurize(featurization_spec) +``` + +Once a Featurization Job has been submitted, you can wait for it to complete using the `arangoml.wait_for_featurization` method: + +```py +# 3. Wait for the Featurization Job to complete + +featurization_job_result = arangoml.wait_for_featurization(featurization_job.job_id) +``` + + +**Example Output:** +```py +{ + "job_id": "16349541", + "output_db_name": "OPEN_INTELLIGENCE_ANGOLA", + "graph": "OPEN_INTELLIGENCE_ANGOLA", + "feature_set_id": "16349537", + "feature_set_ids": [ + "16349537" + ], + "vertexCollections": { + "Actor": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Class": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Country": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Event": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x", + "y": "OPEN_INTELLIGENCE_ANGOLA_y" + }, + "Source": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Location": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Region": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + } + }, + "edgeCollections": { + "eventActor": {}, + "hasSource": {}, + "hasLocation": {}, + "inCountry": {}, + "inRegion": {}, + "subClass": {}, + "type": {} + }, + "label_field": "OPEN_INTELLIGENCE_ANGOLA_y", + "input_field": "OPEN_INTELLIGENCE_ANGOLA_x", + "feature_set_id_to_results": { + "16349537": { + "feature_set_id": "16349537", + "output_db_name": "OPEN_INTELLIGENCE_ANGOLA", + "graph": "OPEN_INTELLIGENCE_ANGOLA", + "vertexCollections": { + "Actor": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Class": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Country": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Event": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x", + "y": "OPEN_INTELLIGENCE_ANGOLA_y" + }, + "Source": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Location": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Region": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + } + }, + "edgeCollections": { + "eventActor": {}, + "hasSource": {}, + "hasLocation": {}, + "inCountry": {}, + "inRegion": {}, + "subClass": {}, + "type": {} + }, + "label_field": "OPEN_INTELLIGENCE_ANGOLA_y", + "input_field": "OPEN_INTELLIGENCE_ANGOLA_x", + "is_feature_store": false, + "target_collection": "Event" + } + }, + "is_feature_store": false, + "target_collection": "Event" +} +``` + +You can also cancel a Featurization Job using the `arangoml.jobs.cancel_job` method: + +```py +arangoml.jobs.cancel_job(prediction_job.job_id) +``` + + +## Training + +**API Documentation: [ArangoML.jobs.train](https://arangoml.github.io/arangoml/api.html#agml_api.jobs.v1.api.jobs_api.JobsApi.train)** + +Training Graph Machine Learning Models with ArangoGraphML requires two steps: +1. Describe which data points should be included in the Training Job. +2. Pass the Training Specification to the Training Service. + +**The Training Service depends on a `Training Specification` that contains**: +- `featureSetID`: The feature set ID that was generated during the Featurization Job (if any). It replaces the need to provide the `metagraph`, `databaseName`, and `projectName` fields. + +- `databaseName`: The database name the source data is in. Can be omitted if `featureSetID` is provided. + +- `projectName`: The top-level project to which all the experiments will link back. Can be omitted if `featureSetID` is provided. + +- `useFeatureStore`: Boolean for enabling or disabling the use of the feature store. Default is `false`. + +- `mlSpec`: Describes the desired machine learning task, input features, and + the attribute label to be predicted. + - `classification`: Dictionary to describe the Node Classification Task Specification. + - `targetCollection`: The ArangoDB collection name that contains the prediction label. + - `inputFeatures`: The name of the feature to be used as input. + - `labelField`: The name of the attribute to be predicted. + - `batchSize`: The number of documents to process in a single training batch. Default is `64`. + - `graphEmbeddings`: Dictionary to describe the Graph Embedding Task Specification. + - `targetCollection`: The ArangoDB collection used to generate the embeddings. + - `embeddingSize`: The size of the embedding vector. Default is `128`. + - `batchSize`: The number of documents to process in a single training batch. Default is `64`. + - `generateEmbeddings`: Whether to generate embeddings on the training dataset. Default is `false`. + +- `metagraph`: Metadata to represent the vertex & edge collections of the graph. If `featureSetID` is provided, this can be omitted. + - `graph`: The ArangoDB graph name. + - `vertexCollections`: A dictionary mapping the collection names to the following values: + - `x`: The name of the feature to be used as input. + - `y`: The name of the attribute to be predicted. Can only be specified for one collection. + - `edgeCollections`: A dictionary mapping the edge collection names to an empty dictionary, as edge features are not currently supported. + +A Training Specification allows for concisely defining your training task in a +single object and then passing that object to the training service using the +Python API client, as shown below. + +The ArangoGraphML Training Service is responsible for training a series of +Graph Machine Learning Models using the data provided in the Training +Specification. It assumes that the data has been featurized and is ready to be +used for training. + +Given that we have run a Featurization Job, we can create the Training Specification using the `featurization_job_result` object returned from the Featurization Job: + +```py +# 1. Define the Training Specification + +# Node Classification example + +training_spec = { + "featureSetID": featurization_job_result.result.feature_set_id, + "mlSpec": { + "classification": { + "targetCollection": "Event", + "inputFeatures": "OPEN_INTELLIGENCE_ANGOLA_x", + "labelField": "OPEN_INTELLIGENCE_ANGOLA_y", + } + }, +} + +# Node Embedding example +# NOTE: Full Graph Embeddings support is coming soon + +training_spec = { + "featureSetID": featurization_job_result.result.feature_set_id, + "mlSpec": { + "graphEmbeddings": { + "targetCollection": "Event", + "embeddingSize": 128, + "generateEmbeddings": True, + } + }, +} +``` + +Once the specification has been defined, a Training Job can be triggered using the `arangoml.jobs.train` method: + +```py +# 2. Submit a Training Job + +training_job = arangoml.jobs.train(training_spec) +``` + +Once a Training Job has been submitted, you can wait for it to complete using the `arangoml.wait_for_training` method: + +```py +# 3. Wait for the Training Job to complete + +training_job_result = arangoml.wait_for_training(training_job.job_id) +``` + +**Example Output (Node Classification):** +```py +{ + "job_id": "691ceb2f-1931-492a-b4eb-0536925a4697", + "job_status": "COMPLETED", + "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Classification", + "project_id": "16832427", + "database_name": "OPEN_INTELLIGENCE_ANGOLA", + "metagraph": { + "mlSpec": { + "classification": { + "targetCollection": "Event", + "inputFeatures": "OPEN_INTELLIGENCE_ANGOLA_x", + "labelField": "OPEN_INTELLIGENCE_ANGOLA_y", + "metrics": None + } + }, + "graph": "OPEN_INTELLIGENCE_ANGOLA", + "vertexCollections": { + "Actor": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Class": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Country": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Event": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x", + "y": "OPEN_INTELLIGENCE_ANGOLA_y" + }, + "Source": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Location": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Region": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + } + }, + "edgeCollections": { + "eventActor": {}, + "hasSource": {}, + "hasLocation": {}, + "inCountry": {}, + "inRegion": {}, + "subClass": {}, + "type": {} + }, + "batch_size": 64 + }, + "time_submitted": "2024-01-12T02:19:19.686286", + "time_started": "2024-01-12T02:19:29.403742", + "time_ended": "2024-01-12T02:30:59.313038", + "job_state": None, + "job_conditions": None +} +``` + +**Example Output (Node Embeddings):** +```py +{ + "job_id": "6047e53a-f1dd-4725-83e8-74ac44629c11", + "job_status": "COMPLETED", + "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Embeddings", + "project_id": "647025872", + "database_name": "OPEN_INTELLIGENCE_ANGOLA", + "ml_spec": { + "graphEmbeddings": { + "targetCollection": "Event", + "embeddingLevel": "NODE_EMBEDDINGS", + "embeddingSize": 128, + "embeddingTrainingType": "UNSUPERVISED", + "batchSize": 64, + "generateEmbeddings": true, + "bestModelSelection": "BEST_LOSS", + "persistModels": "ALL_MODELS", + "modelConfigurations": {} + } + }, + "metagraph": { + "graph": "OPEN_INTELLIGENCE_ANGOLA", + "vertexCollections": { + "Actor": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Country": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Event": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x", + "y": "OPEN_INTELLIGENCE_ANGOLA_y" + }, + "Source": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Location": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + }, + "Region": { + "x": "OPEN_INTELLIGENCE_ANGOLA_x" + } + }, + "edgeCollections": { + "eventActor": {}, + "hasSource": {}, + "hasLocation": {}, + "inCountry": {}, + "inRegion": {} + } + }, + "time_submitted": "2025-03-27T02:55:15.099680", + "time_started": "2025-03-27T02:57:25.143948", + "time_ended": "2025-03-27T03:01:24.619737", + "training_type": "Training" +} +``` + +You can also cancel a Training Job using the `arangoml.jobs.cancel_job` method: + +```py +arangoml.jobs.cancel_job(training_job.job_id) +``` + +## Model Selection + +Model Statistics can be observed upon completion of a Training Job. +To select a Model, the ArangoGraphML Projects Service can be used to gather +all relevant models and choose the preferred model for a Prediction Job. + +First, let's list all the trained models using [ArangoML.list_models](https://arangoml.github.io/arangoml/client.html#arangoml.main.ArangoML.list_models): + +```py +# 1. List all trained Models + +models = arangoml.list_models( + project_name=project.name, + training_job_id=training_job.job_id +) + +print(len(models)) +``` + +The cell below selects the model with the highest **test accuracy** using [ArangoML.get_best_model](https://arangoml.github.io/arangoml/client.html#arangoml.main.ArangoML.get_best_model), but there may be other factors that motivate you to choose another model. See the `model_statistics` in the output field below for more information on the full list of available metrics. + +```py + +# 2. Select the best Model + +# Get best Node Classification Model +# Sort by highest test accuracy + +best_model = arangoml.get_best_model( + project.name, + training_job.job_id, + sort_parent_key="test", + sort_child_key="accuracy", +) + +# Get best Graph Embedding Model +# Sort by lowest loss + +best_model = arangoml.get_best_model( + project.name, + training_job.job_id, + sort_parent_key="loss", + sort_child_key=None, + reverse=False +) + +print(best_model) +``` + +**Example Output (Node Classification):** +```py +{ + "job_id": "691ceb2f-1931-492a-b4eb-0536925a4697", + "model_id": "02297435-3394-4e7e-aaac-82e1d224f85c", + "model_statistics": { + "_id": "devperf/123", + "_key": "123", + "_rev": "_gkUc8By--_", + "run_id": "123", + "test": { + "accuracy": 0.8891242216547955, + "confusion_matrix": [[13271, 2092], [1276, 5684]], + "f1": 0.9, + "loss": 0.1, + "precision": 0.9, + "recall": 0.8, + "roc_auc": 0.8, + }, + "validation": { + "accuracy": 0.9, + "confusion_matrix": [[13271, 2092], [1276, 5684]], + "f1": 0.85, + "loss": 0.1, + "precision": 0.86, + "recall": 0.85, + "roc_auc": 0.85, + }, + }, + "target_collection": "Event", + "target_field": "label", +} +``` + +**Example Output (Node Embeddings):** +```py +{ + "job_id": "6047e53a-f1dd-4725-83e8-74ac44629c11", + "model_id": "55ae93c2-3497-4405-9c63-0fa0e4a5b5bd", + "model_display_name": "graphsageencdec Model", + "model_name": "graphsageencdec Model 55ae93c2-3497-4405-9c63-0fa0e4a5b5bd", + "model_statistics": { + "loss": 0.13700408464796796, + "val_acc": 0.5795393939393939, + "test_acc": 0.5809545454545455 + }, + "model_tasks": [ "GRAPH_EMBEDDINGS" ] +} +``` + +## Prediction + +**API Documentation: [ArangoML.jobs.predict](https://arangoml.github.io/arangoml/api.html#agml_api.jobs.v1.api.jobs_api.JobsApi.predict)** + +Final step! + +After selecting a model, a Prediction Job can be created. The Prediction Job +will generate predictions and persist them to the source graph in a new +collection, or within the source documents. + +**The Prediction Service depends on a `Prediction Specification` that contains**: +- `projectName`: The top-level project to which all the experiments will link back. +- `databaseName`: The database name the source data is in. +- `modelID`: The model ID to use for generating predictions. +- `featurizeNewDocuments`: Boolean for enabling or disabling the featurization of new documents. Useful if you don't want to re-train the model upon new data. Default is `false`. +- `featurizeOutdatedDocuments`: Boolean for enabling or disabling the featurization of outdated documents. Outdated documents are those whose features have changed since the last featurization. Default is `false`. +- `schedule`: A cron expression to schedule the prediction job (e.g `0 0 * * *` for daily predictions). Default is `None`. +- `embeddingsField`: The name of the field to store the generated embeddings. This is only used for Graph Embedding tasks. Default is `None`. + +```py +# 1. Define the Prediction Specification + +# Node Classification Example +prediction_spec = { + "projectName": project.name, + "databaseName": dataset_db.name, + "modelID": best_model.model_id, +} + +# Node Embedding Example +prediction_spec = { + "projectName": project.name, + "databaseName": dataset_db.name, + "modelID": best_model.model_id, + "embeddingsField": "embeddings" +} +``` + +This job updates all documents with the predictions derived from the trained model. +Once the specification has been defined, a Prediction Job can be triggered using the `arangoml.jobs.predict` method: + +```py +# 2. Submit a Prediction Job + +# For Node Classification +prediction_job = arangoml.jobs.predict(prediction_spec) + +# For Graph Embeddings +prediction_job = arangoml.jobs.generate(prediction_spec) +``` + +Similar to the Training Service, we can wait for a Prediction Job to complete with the `arangoml.wait_for_prediction` method: + +```py +# 3. Wait for the Prediction Job to complete + +prediction_job_result = arangoml.wait_for_prediction(prediction_job.job_id) +``` + +**Example Output (Node Classification):** +```py +{ + "job_id": "b2a422bb-5650-4fbc-ba6b-0578af0049d9", + "job_status": "COMPLETED", + "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Classification", + "project_id": "16832427", + "database_name": "OPEN_INTELLIGENCE_ANGOLA", + "model_id": "1a365657-f5ed-4da9-948b-1ff60bc6e7de", + "job_state_information": { + "outputGraphName": "OPEN_INTELLIGENCE_ANGOLA", + "outputCollectionName": "Event", + "outputAttribute": "OPEN_INTELLIGENCE_ANGOLA_y_predicted", + "numberOfPredictedDocuments": 3302, + "outputEdgeCollectionName": None + }, + "time_submitted": "2024-01-12T02:31:18.382625", + "time_started": "2024-01-12T02:31:23.550469", + "time_ended": "2024-01-12T02:31:40.021035" +} +``` + +**Example Output (Node Embeddings):** +```py +{ + "job_id": "25260362-9764-47d0-abb4-247cbdce6c7b", + "job_status": "COMPLETED", + "project_name": "OPEN_INTELLIGENCE_ANGOLA_GraphML_Node_Embeddings", + "project_id": "647025872", + "database_name": "OPEN_INTELLIGENCE_ANGOLA", + "model_id": "55ae93c2-3497-4405-9c63-0fa0e4a5b5bd", + "job_state_information": { + "outputGraphName": "OPEN_INTELLIGENCE_ANGOLA", + "outputCollectionName": "Event", + "outputAttribute": "embeddings", + "numberOfPredictedDocuments": 0, # 0 All documents already have up-to-date embeddings + }, + "time_submitted": "2025-03-27T14:02:33.094191", + "time_started": "2025-03-27T14:09:34.206659", + "time_ended": "2025-03-27T14:09:35.791630", + "prediction_type": "Prediction" +} +``` + +You can also cancel a Prediction Job using the `arangoml.jobs.cancel_job` method: + +```py +arangoml.jobs.cancel_job(prediction_job.job_id) +``` + +### Viewing Inference Results + +We can now access our results via AQL: + +```py +import json + +collection_name = prediction_job_result.job_state_information['outputCollectionName'] + +query = f""" + FOR doc IN `{collection_name}` + SORT RAND() + LIMIT 3 + RETURN doc +""" + +docs = list(dataset_db.aql.execute(query)) + +print(json.dumps(docs, indent=2)) +``` + +## What's next + +With the generated Feature (and optionally Node) Embeddings, you can now use them for downstream tasks like clustering, anomaly detection, and link prediction. Consider using [ArangoDB's Vector Search](https://arangodb.com/2024/11/vector-search-in-arangodb-practical-insights-and-hands-on-examples/) capabilities to find similar nodes based on their embeddings. diff --git a/site/content/arangodb/oem/data-science/llm-knowledge-graphs.md b/site/content/arangodb/oem/data-science/llm-knowledge-graphs.md new file mode 100644 index 0000000000..7cd2e3a447 --- /dev/null +++ b/site/content/arangodb/oem/data-science/llm-knowledge-graphs.md @@ -0,0 +1,73 @@ +--- +title: Large Language Models (LLMs) and Knowledge Graphs +menuTitle: Large Language Models and Knowledge Graphs +weight: 133 +description: >- + Integrate large language models (LLMs) with knowledge graphs using ArangoDB +--- +Large language models (LLMs) and knowledge graphs are two prominent and +contrasting concepts, each possessing unique characteristics and functionalities +that significantly impact the methods we employ to extract valuable insights from +constantly expanding and complex datasets. + +LLMs, exemplified by OpenAI's ChatGPT, represent a class of powerful language +transformers. These models leverage advanced neural networks to exhibit a +remarkable proficiency in understanding, generating, and participating in +contextually-aware conversations. + +On the other hand, knowledge graphs contain carefully structured data and are +designed to capture intricate relationships among discrete and seemingly +unrelated information. With knowledge graphs, you can explore contextual +insights and execute structured queries that reveal hidden connections within +complex datasets. + +ArangoDB's unique capabilities and flexible integration of knowledge graphs and +LLMs provide a powerful and efficient solution for anyone seeking to extract +valuable insights from diverse datasets. + +## Knowledge Graphs + +A knowledge graph can be thought of as a dynamic and interconnected network of +real-world entities and the intricate relationships that exist between them. + +Key aspects of knowledge graphs: +- **Domain specific knowledge**: You can tailor knowledge graphs to specific + domains and industries. +- **Structured information**: Makes it easy to query, analyze, and extract + meaningful insights from your data. +- **Accessibility**: You can build a Semantic Web knowledge graph or using + custom data. + +LLMs can help distill knowledge graphs from natural language by performing +the following tasks: +- Entity discovery +- Relation extraction +- Coreference resolution +- End-to-end knowledge graph construction +- (Text) Embeddings + +![ArangoDB Knowledge Graphs and LLMs](../../../images/ArangoDB-knowledge-graphs-meets-llms.png) + +## ArangoDB and LangChain + +[LangChain](https://www.langchain.com/) is a framework for developing applications +powered by language models. + +LangChain enables applications that are: +- Data-aware (connect a language model to other sources of data) +- Agentic (allow a language model to interact with its environment) + +The ArangoDB integration with LangChain provides you the ability to analyze +data seamlessly via natural language, eliminating the need for query language +design. By using LLM chat models such as OpenAI’s ChatGPT, you can "speak" to +your data instead of querying it. + +### Get started with ArangoDB QA chain + +The [ArangoDB QA chain notebook](https://langchain-langchain.vercel.app/docs/integrations/providers/arangodb/) +shows how to use LLMs to provide a natural language interface to an ArangoDB +instance. + +Run the notebook directly in [Google Colab](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/Langchain.ipynb). + +See also other [machine learning interactive tutorials](https://github.com/arangodb/interactive_tutorials#machine-learning). \ No newline at end of file diff --git a/site/content/arangodb/oem/data-science/pregel/_index.md b/site/content/arangodb/oem/data-science/pregel/_index.md new file mode 100644 index 0000000000..3b73ad40be --- /dev/null +++ b/site/content/arangodb/oem/data-science/pregel/_index.md @@ -0,0 +1,331 @@ +--- +title: Distributed Iterative Graph Processing (Pregel) +menuTitle: Pregel +weight: 135 +description: >- + Pregel enables you to do online analytical processing directly on graphs + stored in ArangoDB +--- +Distributed graph processing enables you to do online analytical processing +directly on graphs stored in ArangoDB. This is intended to help you gain +analytical insights on your data, without having to use external processing +systems. Examples of algorithms to execute are PageRank, Vertex Centrality, +Vertex Closeness, Connected Components, Community Detection. +For more details, see all [available algorithms](algorithms.md) +in ArangoDB. + +Check out the hands-on +[ArangoDB Pregel Tutorial](https://www.arangodb.com/pregel-community-detection/) +to learn more. + +The processing system inside ArangoDB is based on: +[Pregel: A System for Large-Scale Graph Processing](https://15799.courses.cs.cmu.edu/fall2013/static/papers/p135-malewicz.pdf) +– Malewicz et al. (Google), 2010. +This concept enables us to perform distributed graph processing, without the +need for distributed global locking. + +This system is not useful for typical online queries, where you just work on +a small set of vertices. These kind of tasks are better suited for +[AQL traversals](../../aql/graphs/_index.md). + +## Prerequisites + +If you run a single ArangoDB instance in single-server mode, there are no +requirements regarding the modeling of your data. All you need is at least one +vertex collection and one edge collection. + +In cluster deployments, the collections need to be sharded in a specific way to +ensure correct results: The outgoing edges of a vertex need to be on the same +DB-Server as the vertex. This is guaranteed by [SmartGraphs](../../graphs/smartgraphs/_index.md). +Thus, Pregel in cluster deployments is not usable in the Community Edition. + +Note that the performance may be better, if the number of your shards / +collections matches the number of CPU cores. + +## JavaScript API + +### Starting an Algorithm Execution + +The Pregel API is accessible through the `@arangodb/pregel` package. + +To start an execution, you need to specify the **algorithm** name and a +named graph (SmartGraph in cluster). Alternatively, you can specify the vertex +and edge collections. Additionally, you can specify custom parameters which vary +for each algorithm. The `start()` method always returns a unique ID +(a numeric string) which you can use to interact with the algorithm later on. + +The following example shows the `start()` method variant for using a named graph: + +```js +var pregel = require("@arangodb/pregel"); +var params = {}; +var execution = pregel.start("<algorithm>", "<graphname>", params); +``` + +You can also specify the vertex and edge collections directly. In this case, +the second argument must be an object with the keys `vertexCollections` +and `edgeCollections`: + +```js +var execution = pregel.start("<algorithm>", { vertexCollections: ["vertices"], edgeCollections: ["edges"] }, params); +``` + +The `params` argument needs to be an object with the algorithm settings as +described in [Pregel Algorithms](algorithms.md). + +### Status of an Algorithm Execution + +You can call `pregel.status()` and use the ID returned by the `pregel.start(...)` +method to track the status of your algorithm: + +```js +var execution = pregel.start("sssp", "demograph", { source: "vertices/V" }); +var status = pregel.status(execution); +``` + +It tells you the current `state` of the execution, the current +global superstep, the runtime, the global aggregator values as well as the +number of send and received messages. + +The `state` field has one of the following values: + +| State | Description | +|:---------------|:---------------| +| `"none"` | The Pregel run has not started yet. +| `"loading"` | The graph data is being loaded from the database into memory before executing the algorithm. +| `"running"` | The algorithm is executing normally. +| `"storing"` | The algorithm finished, but the results are still being written back into the collections. Only occurs if the `store` parameter is set to `true`. +| `"done"` | The execution is done. This means that storing is also done. This event is announced in the server log (requires at least the `info` log level for the `pregel` log topic). +| `"canceled"` | The execution was permanently canceled, either by the user or by an error. +| `"in error"` | The execution is in an error state. This can be caused by primary DB-Servers being unreachable or unresponsive. The execution might recover later, or switch to `canceled` if it is not able to recover successfully. +| `"recovering"` | The execution is actively recovering and switches back to `running` if the recovery is successful. +| `"fatal error"`| The execution resulted in an non-recoverable error. + +The object returned by the `status()` method looks like this: + +```json +{ + "state" : "running", + "gss" : 12, + "totalRuntime" : 123.23, + "aggregators" : { + "converged" : false, + "max" : true, + "phase" : 2 + }, + "sendCount" : 3240364978, + "receivedCount" : 3240364975 +} +``` + +### Canceling an Execution / Discarding results + +To cancel an execution which is still running and discard any intermediate +results, you can use the `pregel.cancel()` method. This immediately frees all +memory taken up by the execution, and makes you lose all intermediary data. + +```js +// start a single source shortest path job +var execution = pregel.start("sssp", "demograph", { source: "vertices/V" }); +pregel.cancel(execution); +``` + +You might get inconsistent results if you requested to store the results and +then cancel an execution when it is already in its `storing` state. +The data is written multi-threaded into all +collection shards at once. This means there are multiple transactions +simultaneously. A transaction might already be committed when you cancel the +execution job. Therefore, you might see some updated documents, while other +documents have no or stale results from a previous execution. + +### Get persisted execution statistics + +You can call `pregel.history()` and use the ID returned by the `pregel.start(...)` +method to get the execution statistics of your algorithm, for an active as well +as a finished Pregel job: + +```js +const execution = pregel.start("sssp", "demograph", { source: "vertices/V" }); +const historyStatus = pregel.history(execution); +``` + +It tells you the current `state` of the execution, the current +global superstep, the runtime, the global aggregator values, as well as the +number of send and received messages. Additionally, you see which user started +the Pregel job. It also contains details about specific execution timings. + +The execution statistics are persisted to a system collection and kept until you +remove them, whereas the information `pregel.status()` returns is only kept +temporarily in memory. + +The object returned by the `pregel.history()` method looks like this: + +```json +{ + "algorithm" : "pagerank", + "created" : "2023-04-18T11:12:50Z", + "database" : "_system", + "graphLoaded" : true, + "gss" : 15, + "id" : "109645", + "state" : "done", + "ttl" : 600, + "user" : "MarcelJansen", + "detail" : { + "aggregatedStatus" : { + "timeStamp" : "2023-04-18T11:12:50Z", + "graphStoreStatus" : { + }, + "allGssStatus" : { + "items" : [ ... ] + } + }, + "workerStatus" : { ... } + }, + "sendCount" : 540, + "aggregators" : { + "convergence" : 0 + }, + "gssTimes" : [ + 0.000315457, + 0.000484604, + ... + ], + "receivedCount" : 504, + "expires" : "2023-04-18T11:22:50Z", + "vertexCount" : 36, + "storageTime" : 0.002114291, + "totalRuntime" : 0.046748679, + "parallelism" : 8, + "masterContext" : { + }, + "edgeCount" : 36, + "startupTime" : 0.032753187, + "computationTime" : 0.011542727 +} +``` + +--- + +In case you want to read the persisted execution statistics of all currently +active and past Pregel jobs, call the `pregel.history()` method without a +parameter. + +```js +const historyStates = pregel.history(); +``` + +The call without arguments returns a list of execution statistics for +algorithm executions: + +```json +[ + { + "algorithm": "pagerank", + "...": "..." + }, + { + "algorithm": "sssp", + "...": "..." + }, + { + "algorithm": "connectedcomponents", + "...": "..." + } +] +``` + +### Remove persisted execution statistics + +You can call `pregel.removeHistory()` and use the ID returned by the +`pregel.start(...)` method to remove the persisted execution statistics of a +specific Pregel job when you don't need it anymore. + +```js +const execution = pregel.start("sssp", "demograph", { source: "vertices/V" }); +pregel.removeHistory(execution); +``` + +--- + +In case you want to remove the persisted execution statistics of all Pregel jobs +at once, call `pregel.removeHistory()` without a parameter. + +```js +pregel.removeHistory(); +``` + +## AQL integration + +When the graph processing subsystem finishes executing an algorithm, the +results can either be written back into documents (using `store: true` as a parameter) +or kept in memory only (using `store: false`). If the data is persisted, +then you can query the documents normally to get access to the results. + +If you do not want to store results, then they are only held temporarily, +until you call the `cancel()` method, or their time to live (customizable via +the `ttl` parameter) is exceeded. The in-memory results can be accessed via the +`PREGEL_RESULT()` AQL function. If the results are stored in documents, they +are not queryable by `PREGEL_RESULT()`. + +The result field names depend on the algorithm in both cases. + +For example, you might want to query only nodes with the highest rank from the +result set of a PageRank execution: + +```aql +FOR v IN PREGEL_RESULT(<jobId>) + FILTER v.result >= 0.01 + RETURN v._key +``` + +By default, the `PREGEL_RESULT()` AQL function returns the `_key` of each +vertex plus the result of the computation. In case the computation was done for +vertices from different vertex collection, just the `_key` values may not be +sufficient to tell vertices from different collections apart. In this case, +`PREGEL_RESULT()` can be given a second parameter `withId`, which makes it +return the `_id` values of the vertices as well: + +```aql +FOR v IN PREGEL_RESULT(<jobId>, true) + FILTER v.result >= 0.01 + RETURN v._id +``` + +## Algorithm Parameters + +There are a number of general parameters which apply to almost all algorithms: + +- `store` (bool): Defaults to `true`. If enabled, the Pregel engine writes + results back to the database. If the value is `false`, then you can query the + results with `PREGEL_RESULT()` in AQL. See [AQL integration](#aql-integration). +- `maxGSS` (number): Maximum number of global iterations for this algorithm +- `parallelism` (number): Number of parallel threads to use per worker. + Does not influence the number of threads used to load or store data from the + database (this depends on the number of shards). +- `resultField` (string): Most algorithms use this as attribute name for the + result. Some use it as prefix for multiple result attributes. Defaults to + `"result"`. +- `shardKeyAttribute` (string): shard key that edge collections are sharded + after (default: `"vertex"`) +- `ttl` (number): The time to live (TTL) defines for how long (in seconds) the Pregel run + is kept in memory after it finished with states `done`, `error` or + `fatal error`. Defaults to 600. + +## Limits + +Pregel algorithms in ArangoDB store temporary vertex and edge data in +main memory by default. For large datasets, this can cause +problems, as servers may run out of memory while loading the data. + +Parts of the Pregel temporary results (aggregated messages) may also be +stored in the main memory. That means, if algorithms need to store a lot of +result messages temporarily, they may consume a lot of the main memory. + +In general, it is also recommended to set the `store` attribute of Pregel jobs +to `true`, to make jobs write the results back to disk and not just hold them +in the main memory. This way, the results are removed from the main memory once +a Pregel job completes. +If the `store` attribute is explicitly set to `false`, result sets of completed +Pregel runs are not removed from main memory until you explicitly discard +them by calling the `cancel()` method (or shutting down the server). diff --git a/site/content/arangodb/oem/data-science/pregel/algorithms.md b/site/content/arangodb/oem/data-science/pregel/algorithms.md new file mode 100644 index 0000000000..3b17aecc8b --- /dev/null +++ b/site/content/arangodb/oem/data-science/pregel/algorithms.md @@ -0,0 +1,369 @@ +--- +title: Pregel Algorithms +menuTitle: Pregel Algorithms +weight: 5 +description: >- + You can use Pregel algorithms for graph exploration, path finding, analytics + queries, and much more +aliases: + - pregel-algorithms +--- +Pregel algorithms are used in scenarios where you need to do an +analysis of a graph stored in ArangoDB to get insights about its +nature and structure - without having to use external processing systems. + +Pregel can solve numerous graph problems and offers solutions that are +essential building blocks in the cycle of a real world application. +For example, in a network system, detecting the weaknesses of the network +design and determining the times when the network is vulnerable may +significantly reduce any downtime. + +In the section below you can find more details about all available +Pregel algorithms in ArangoDB. + +## Available Algorithms + +### PageRank + +PageRank is a well known algorithm to rank vertices in a graph: the more +important a vertex, the higher rank it gets. It goes back to L. Page and S. Brin's +[paper](http://infolab.stanford.edu/pub/papers/google.pdf) and +is used to rank pages in in search engines (hence the name). The algorithm runs +until the execution converges. To specify a custom threshold, use the `threshold` +parameter; to run for a fixed number of iterations, use the `maxGSS` parameter. + +The rank of a vertex is a positive real number. The algorithm starts with every +vertex having the same rank (one divided by the number of vertices) and sends its +rank to its out-neighbors. The computation proceeds in iterations. In each iteration, +the new rank is computed according to the formula +`(0.15/total number of vertices) + (0.85 * the sum of all incoming ranks)`. +The value sent to each of the out-neighbors is the new rank divided by the number +of those neighbors, thus every out-neighbor gets the same part of the new rank. + +The algorithm stops when at least one of the two conditions is satisfied: +- The maximum number of iterations is reached. This is the same `maxGSS` + parameter as for the other algorithms. +- Every vertex changes its rank in the last iteration by less than a certain + threshold. The default threshold is 0.00001, a custom value can be set with + the `threshold` parameter. + +```js +var pregel = require("@arangodb/pregel"); +pregel.start("pagerank", "graphname", { maxGSS: 100, threshold: 0.00000001, resultField: "rank" }) +``` + +#### Seeded PageRank + +It is possible to specify an initial distribution for the vertex documents in +your graph. To define these seed ranks / centralities, you can specify a +`sourceField` in the properties for this algorithm. If the specified field is +set on a document _and_ the value is numeric, then it is used instead of +the default initial rank of `1 / numVertices`. + +```js +var pregel = require("@arangodb/pregel"); +pregel.start("pagerank", "graphname", { maxGSS: 20, threshold: 0.00000001, sourceField: "seed", resultField: "rank" }) +``` + +### Single-Source Shortest Path + +Calculates the distances, that is, the lengths of shortest paths from the +given source to all other vertices, called _targets_. The result is written +to the specified property of the respective target. +The distance to the source vertex itself is returned as `0` and a length above +`9007199254740991` (max safe integer) means that there is no path from the +source to the vertex in the graph. + +The algorithm runs until all distances are computed. The number of iterations is bounded by the +diameter of your graph (the longest distance between two vertices). + +A call of the algorithm requires the `source` parameter whose value is the +document ID of the source vertex. The result field needs to be +specified in `_resultField` (note the underscore). + +```js +var pregel = require("@arangodb/pregel"); +pregel.start("sssp", "graphname", { source: "vertices/1337", _resultField: "distance" }); +``` + +### Connected Components + +There are three algorithms to find connected components in a graph: + +1. If your graph is effectively undirected (for every edge from vertex A to + vertex B there is also an edge from B to A), + then the simple **connected components** algorithm named + `"connectedcomponents"` is suitable. + + It is a very simple and fast algorithm, but it only works correctly on + undirected graphs. Your results on directed graphs may vary, depending on + how connected your components are. + + In an undirected graph, a _connected component_ is a subgraph: + - where there is a path between every pair of vertices from this component and + - which is maximal with this property: adding any other vertex would destroy it. + In other words, there is no path between any vertex from the component and + any vertex not in the component. + +2. To find **weakly connected components** (WCC) you can use the algorithm named `"wcc"`. + A _weakly connected component_ in a directed graph is a maximal subgraph such + that there is a path between each pair of vertices + where _we can walk also against the direction of edges_. More formally, it is + a connected component (see the definition above) in the + _underlying undirected graph_, i.e., in the undirected graph obtained by + adding an edge from vertex B to vertex A (if it does not already exist), + if there is an edge from vertex A to vertex B. + + This algorithm works on directed graphs but, in general, requires a greater amount of + traffic between DB-Servers. + +3. To find **strongly connected components** (SCC) you can use the algorithm named `"scc"`. + A _strongly connected component_ is a maximal subgraph, + where for every two vertices, there is a path from one of them to the other. + It is thus defined as a weakly connected component, + but one is not allowed to run against the edge directions. + + The algorithm is more complex than the WCC algorithm and, in general, requires more memory. + +All above algorithms assign a component ID to each vertex, a number which is +written into the specified `resultField`. All vertices from the same component +obtain the same component ID, every two vertices from different components +obtain different IDs. + +```js +var pregel = require("@arangodb/pregel"); + +// connected components +pregel.start("connectedcomponents", "graphname", { resultField: "component" }); + +// weakly connected components +pregel.start("wcc", "graphname", { resultField: "component_weak" }); + +// strongly connected components +pregel.start("scc", "graphname", { resultField: "component_strong" }); +``` + +### Hyperlink-Induced Topic Search (HITS) + +HITS is a link analysis algorithm that rates Web pages, developed by +Jon Kleinberg in J. Kleinberg, +[Authoritative sources in a hyperlinked environment](http://www.cs.cornell.edu/home/kleinber/auth.pdf), +Journal of the ACM. 46 (5): 604–632, 1999. The algorithm is also known as _Hubs and Authorities_. + +The idea behind hubs and authorities comes from the typical structure of the early web: +certain websites, known as hubs, serve as large directories that are not actually +authoritative on the information that they point to. These hubs are used as +compilations of a broad catalog of information that leads users to other, +authoritative, webpages. + +The algorithm assigns two scores to each vertex: the authority score and the +hub score. The authority score of a vertex rates the total hub score of vertices +pointing to that vertex; the hub score rates the total authority +score of vertices pointed by it. Also see +[en.wikipedia.org/wiki/HITS_algorithm](https://en.wikipedia.org/wiki/HITS_algorithm). +Note, however, that this version of the algorithm is slightly different from that of the original paper. + +ArangoDB offers two versions of the algorithm: the original Kleinberg's version and our own version +that has some advantages and disadvantages as discussed below. + +Both versions keep two values for each vertex: the hub value and the authority value and update +both of them in iterations until the corresponding sequences converge or until the maximum number of steps +is reached. The hub value of a vertex is updated from the authority values of the vertices pointed by it; +the authority value is updated from the hub values of the vertices pointing to it. + +The differences of the two versions are technical (and we omit the tedious description here) +but have some less technical implications: +- The original version needs twice as many global super-steps as our version. +- The original version is guaranteed to converge, our version may also converge, but there are examples +where it does not (for instance, on undirected stars). +- In the original version, the output values are normed in the sense that the sum of their squared values +is 1, our version does not guarantee that. + +In a call of either version, the `threshold` parameter can be used to set a limit for the convergence +(measured as the maximum absolute difference of the hub and authority scores +between the current and last iteration). + +If the value of the result field is `<resultField>`, then the hub score is stored in +the `<resultField>_hub` field and the authority score in the `<resultField>_auth` field. + +The algorithm can be executed like this: + +```js +var pregel = require("@arangodb/pregel"); +var jobId = pregel.start("hits", "graphname", { threshold:0.00001, resultField: "score" }); +``` + +for ArangoDB's version and + +```js +var pregel = require("@arangodb/pregel"); +var jobId = pregel.start("hitskleinberg", "graphname", { threshold:0.00001, resultField: "score" }); +``` + +for the original version. + +### Vertex Centrality + +Centrality measures help identify the most important vertices in a graph. +They can be used in a wide range of applications: +to identify influencers in social networks, or middlemen in terrorist +networks. + +There are various definitions for centrality, the simplest one being the +vertex degree. These definitions were not designed with scalability in mind. +It is probably impossible to discover an efficient algorithm which computes +them in a distributed way. Fortunately there are scalable substitutions +available, which should be equally usable for most use cases. + +![Illustration of an execution of different centrality measures (Freeman 1977)](../../../../images/centrality_visual.png) + +#### Effective Closeness + +A common definitions of centrality is the **closeness centrality** +(or closeness). The closeness of a vertex in a graph is the inverse average +length of the shortest path between the vertex and all other vertices. +For vertices *x*, *y* and shortest distance `d(y, x)` it is defined as: + +![Vertex Closeness Formula](../../../../images/closeness.png) + +Effective Closeness approximates the closeness measure. The algorithm works by +iteratively estimating the number of shortest paths passing through each vertex. +The score approximates the real closeness score, since it is not possible +to actually count all shortest paths due to the horrendous `O(n^2 * d)` memory +requirements. The algorithm is from the paper +*Centralities in Large Networks: Algorithms and Observations (U Kang et.al. 2011)*. + +ArangoDBs implementation approximates the number of shortest path in each +iteration by using a HyperLogLog counter with 64 buckets. This should work well +on large graphs and on smaller ones as well. The memory requirements should be +**O(n * d)** where *n* is the number of vertices and *d* the diameter of your +graph. Each vertex stores a counter for each iteration of the algorithm. + +The algorithm can be used like this: + +```js +const pregel = require("@arangodb/pregel"); +const jobId = pregel.start("effectivecloseness", "graphname", { resultField: "closeness" }); +``` + +#### LineRank + +Another common measure is the [*betweenness* centrality](https://en.wikipedia.org/wiki/Betweenness_centrality): +It measures the number of times a vertex is part of shortest paths between any +pairs of vertices. For a vertex *v* betweenness is defined as: + +![Vertex Betweenness Formula](../../../../images/betweenness.png) + +Where the σ represents the number of shortest paths between *x* and *y*, +and σ(v) represents the number of paths also passing through a vertex *v*. +By intuition a vertex with higher betweenness centrality has more +information passing through it. + +**LineRank** approximates the random walk betweenness of every vertex in a +graph. This is the probability that someone, starting on an arbitrary vertex, +visits this node when they randomly choose edges to visit. + +The algorithm essentially builds a line graph out of your graph +(switches the vertices and edges), and then computes a score similar to PageRank. +This can be considered a scalable equivalent to vertex betweenness, which can +be executed distributedly in ArangoDB. The algorithm is from the paper +*Centralities in Large Networks: Algorithms and Observations (U Kang et.al. 2011)*. + +```js +const pregel = require("@arangodb/pregel"); +const jobId = pregel.start("linerank", "graphname", { resultField: "linerank" }); +``` + +### Community Detection + +Graphs based on real world networks often have a community structure. +This means it is possible to find groups of vertices such that each vertex +group is internally more densely connected than outside the group. +This has many applications when you want to analyze your networks, for example +Social networks include community groups (the origin of the term, in fact) +based on common location, interests, occupation, etc. + +#### Label Propagation + +*Label Propagation* can be used to implement community detection on large +graphs. The algorithm assigns a community, more precisely, a Community ID +(a natural number), to every vertex in the graph. +The idea is that each vertex should be in the community that most of +its neighbors are in. + +At first, the algorithm assigns unique initial Community IDs to the vertices. +The assignment is deterministic given the graph and the distribution of vertices +on the shards, but there is no guarantee that a vertex obtains +the same initial ID in two different runs of the algorithm, even if the graph does not change +(because the sharding may change). Moreover, there is no guarantee on a particular +distribution of the initial IDs over the vertices. + +Then, in each iteration, a vertex sends its current Community +ID to all its neighbor vertices. After that each vertex adopts the Community ID it +received most frequently in the last step. + +Note that, in a usual implementation of Label Propagation, if there are +multiple most frequently received Community IDs, one is chosen randomly. +An advantage of our implementation is that this choice is deterministic. +This comes for the price that the choice rules are somewhat involved: +If a vertex obtains only one ID and the ID of the vertex from the previous step, +its old ID, is less than the obtained ID, the old ID is kept. +(IDs are numbers and thus comparable to each other.) If a vertex obtains +more than one ID, its new ID is the lowest ID among the most frequently +obtained IDs. (For example, if the obtained IDs are 1, 2, 2, 3, 3, +then 2 is the new ID.) If, however, no ID arrives more than once, the new ID is +the minimum of the lowest obtained IDs and the old ID. (For example, if the +old ID is 5 and the obtained IDs are 3, 4, 6, then the new ID is 3. +If the old ID is 2, it is kept.) + +If a vertex keeps its ID 20 times or more in a row, it does not send its ID. +Vertices that did not obtain any IDs do not update their ID and do not send it. + +The algorithm runs until it converges, which likely never really happens on +large graphs. Therefore you need to specify a maximum iteration bound. +The default bound is 500 iterations, which is too large for +common applications. + +The algorithm should work best on undirected graphs. On directed +graphs, the resulting partition into communities might change, if the number +of performed steps changes. How strong the dependence is +may be influenced by the density of the graph. + +```js +const pregel = require("@arangodb/pregel"); +const jobId = pregel.start("labelpropagation", "graphname", { maxGSS: 100, resultField: "community" }); +``` + +#### Speaker-Listener Label Propagation + +The [Speaker-listener Label Propagation](https://arxiv.org/pdf/1109.5720.pdf) +(SLPA) can be used to implement community detection. It works similar to the +label propagation algorithm, but now every node additionally accumulates a +memory of observed labels (instead of forgetting all but one label). + +Before the algorithm run, every vertex is initialized with an unique ID +(the initial community label). +During the run three steps are executed for each vertex: + +1. Current vertex is the listener, all other vertices are speakers. +2. Each speaker sends out a label from memory, we send out a random label with a + probability proportional to the number of times the vertex observed the label. +3. The listener remembers one of the labels, we always choose the most + frequently observed label. + +```js +const pregel = require("@arangodb/pregel"); +const jobId = pregel.start("slpa", "graphname", { maxGSS:100, resultField: "community" }); +``` + +You can also execute SLPA with the `maxCommunities` parameter to limit the +number of output communities. Internally the algorithm still keeps the +memory of all labels, but the output is reduced to just the `n` most frequently +observed labels. + +```js +const pregel = require("@arangodb/pregel"); +const jobId = pregel.start("slpa", "graphname", { maxGSS: 100, resultField: "community", maxCommunities: 1 }); +// check the status periodically for completion +pregel.status(jobId); +``` diff --git a/site/content/arangodb/oem/deploy/_index.md b/site/content/arangodb/oem/deploy/_index.md new file mode 100644 index 0000000000..704d2c55d8 --- /dev/null +++ b/site/content/arangodb/oem/deploy/_index.md @@ -0,0 +1,144 @@ +--- +title: Deploy ArangoDB +menuTitle: Deploy +weight: 185 +description: >- + ArangoDB supports multiple deployment modes to meet the exact needs of your + project for resilience and performance +--- +For installation instructions, please refer to the +[Installation](../operations/installation/_index.md) chapter. + +For _production_ deployments, please also carefully check the +[ArangoDB Production Checklist](production-checklist.md). + +## Deployment Modes + +ArangoDB can be deployed in different configurations, depending on your needs. + +### Single Instance + +A [Single Instance deployment](single-instance/_index.md) is the most simple way +to get started. Unlike other setups, which require some specific procedures, +deploying a stand-alone instance is straightforward and can be started manually +or by using the ArangoDB Starter tool. + +### Active Failover + +[Active Failover deployments](active-failover/_index.md) use ArangoDB's +multi-node technology to provide high availability for smaller projects with +fast asynchronous replication from the leading node to multiple replicas. +If the leader fails, then a follower takes over seamlessly. + +### Cluster + +[Cluster deployments](cluster/_index.md) are designed for large scale +operations and analytics, allowing you to scale elastically with your +applications and data models. ArangoDB's synchronously-replicating cluster +technology runs on premises, on Kubernetes, and in the cloud on +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) - Arango's fully managed service. + +Clustering ArangoDB not only delivers better performance and capacity improvements, +but it also provides resilience through replication and automatic failover. +You can deploy systems that dynamically scale up and down according to demand. + +### OneShard + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +[OneShard deployments](oneshard.md) are cluster deployments but with the data of +each database restricted to a single shard. This allows queries to run locally +on a single DB-Server node for better performance and with transactional +guarantees similar to a single server deployment. OneShard is primarily intended +for multi-tenant use cases. + +### Datacenter-to-Datacenter + +{{< tag "ArangoDB Enterprise Edition" >}} + +For cluster deployments, ArangoDB supports +[Datacenter-to-Datacenter Replication](arangosync/_index.md) (DC2DC). You can +use it as an additional security feature to replicate your entire cluster +off-site to another datacenter. The leading datacenter asynchronously replicates +the data and configuration to the other datacenter for disaster recovery. + +## How to deploy + +There are different ways to set up and operate ArangoDB. + +- You can start all the needed server processes manually, locally or on different + machines, bare-metal or in Docker containers. This gives you the most control + but you also need to manually deal with upgrades, outages, and so on. + +- You can use the ArangoDB _Starter_ (the _arangodb_ executable) to mostly + automatically create and keep deployments running, either bare-metal or in + Docker containers. + +- If you want to deploy in your Kubernetes cluster, you can use the + ArangoDB Kubernetes Operator (`kube-arangodb`). + +The fastest way to get ArangoDB up and running is to run it in the cloud - the +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +offers a fully managed cloud service, available on AWS and GCP. + +### Manual Deployment + +**Single Instance:** + +- [Manually created processes](single-instance/manual-start.md) +- [Manually created Docker containers](single-instance/manual-start.md#manual-start-in-docker) + +**Active Failover:** + +- [Manually created processes](active-failover/manual-start.md) +- [Manually created Docker containers](active-failover/manual-start.md#manual-start-in-docker) + +**Cluster:** + +- [Manually created processes](cluster/deployment/manual-start.md) +- [Manually created Docker containers](cluster/deployment/manual-start.md#manual-start-in-docker) + +### Deploying using the ArangoDB Starter + +Setting up an ArangoDB cluster, for example, involves starting various nodes +with different roles (Agents, DB-Servers, and Coordinators). The starter +simplifies this process. + +The Starter supports different deployment modes (single server, Active Failover, +cluster) and it can either use Docker containers or processes (using the +`arangod` executable). + +Besides starting and maintaining ArangoDB deployments, the Starter also provides +various commands to create TLS certificates and JWT token secrets to secure your +ArangoDB deployments. + +The ArangoDB Starter is an executable called `arangodb` and comes with all +current distributions of ArangoDB. + +If you want a specific version, download the precompiled executable via the +[GitHub releases page](https://github.com/arangodb-helper/arangodb/releases). + +**Single Instance:** + +- [_Starter_ using processes](single-instance/using-the-arangodb-starter.md) +- [_Starter_ using Docker containers](single-instance/using-the-arangodb-starter.md#using-the-arangodb-starter-in-docker) + +**Active Failover:** + +- [_Starter_ using processes](active-failover/using-the-arangodb-starter.md) +- [_Starter_ using Docker containers](active-failover/using-the-arangodb-starter.md#using-the-arangodb-starter-in-docker) + +**Cluster:** + +- [_Starter_ using processes](cluster/deployment/using-the-arangodb-starter.md) +- [_Starter_ using Docker containers](cluster/deployment/using-the-arangodb-starter.md#using-the-arangodb-starter-in-docker) + +### Run in the cloud + +- [AWS and Azure](in-the-cloud.md) +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), + fully managed, available on AWS and GCP + +### Run in Kubernetes + +- [ArangoDB Kubernetes Operator](kubernetes.md) diff --git a/site/content/arangodb/oem/deploy/active-failover/_index.md b/site/content/arangodb/oem/deploy/active-failover/_index.md new file mode 100644 index 0000000000..223002c10f --- /dev/null +++ b/site/content/arangodb/oem/deploy/active-failover/_index.md @@ -0,0 +1,127 @@ +--- +title: Active Failover deployments +menuTitle: Active Failover +weight: 10 +description: >- + You can set up multiple single server instances to have one leader and multiple + asynchronously replicated followers with automatic failover +--- +An _Active Failover_ is defined as: + +- One ArangoDB Single-Server instance which is read / writable by clients called **Leader** +- One or more ArangoDB Single-Server instances, which are passive and not writable + called **Followers**, which asynchronously replicate data from the Leader +- At least one _Agency_ acting as a "witness" to determine which server becomes the _leader_ + in a _failure_ situation + +An _Active Failover_ behaves differently from an [ArangoDB Cluster](../cluster/_index.md), +please see the [limitations section](#limitations) for more details. + +{{< warning >}} +The Active Failover deployment mode is deprecated and will no longer be +supported in the next minor version of ArangoDB, from v3.12 onward. +{{< /warning >}} + +![ArangoDB Active Failover](../../../../images/leader-follower.png) + +The advantage of the _Active Failover_ setup is that there is an active third party, the _Agency_, +which observes and supervises all involved server processes. +_Follower_ instances can rely on the _Agency_ to determine the correct _Leader_ server. +From an operational point of view, one advantage is that +the failover, in case the _Leader_ goes down, is automatic. An additional operational +advantage is that there is no need to start a _replication applier_ manually. + +The _Active Failover_ setup is made **resilient** by the fact that all the official +ArangoDB drivers can automatically determine the correct _leader_ server and +redirect requests appropriately. Furthermore, Foxx Services do also automatically +perform a failover: should the _leader_ instance fail (which is also the _Foxxmaster_) +the newly elected _leader_ will reinstall all Foxx services and resume executing +queued [Foxx tasks](../../develop/foxx-microservices/guides/scripts-and-scheduling.md). +[Database users](../../operations/administration/user-management/_index.md) +which were created on the _leader_ will also be valid on the newly elected _leader_ +(always depending on the condition that they were synced already). + +Consider the case for two *arangod* instances. The two servers are connected via +server wide (global) asynchronous replication. One of the servers is +elected _Leader_, and the other one is made a _Follower_ automatically. At startup, +the two servers race for the leadership position. This happens through the _Agency +locking mechanism_ (which means that the _Agency_ needs to be available at server start). +You can control which server becomes the _Leader_ by starting it earlier than +other server instances in the beginning. + +The _Follower_ automatically starts replication from the _Leader_ for all +available databases, using the server-level replication introduced in version 3.3. + +When the _Leader_ goes down, this is automatically detected by the _Agency_ +instance, which is also started in this mode. This instance will make the +previous follower stop its replication and make it the new _Leader_. + +{{< info >}} +The different instances participating in an Active Failover setup are supposed +to be run in the same _Data Center_ (DC), with a reliable high-speed network +connection between all the machines participating in the Active Failover setup. + +Multi-datacenter Active Failover setups are currently not supported. + +A multi-datacenter solution currently supported is the _Datacenter-to-Datacenter Replication_ +(DC2DC) among ArangoDB Clusters. See [DC2DC](../arangosync/deployment/_index.md) chapter for details. +{{< /info >}} + +## Operative Behavior + +In contrast to the normal behavior of a single-server instance, the Active-Failover +mode can change the behavior of ArangoDB in some situations. + +The _Follower_ will _always_ deny write requests from client applications. Starting from ArangoDB 3.4, +read requests are _only_ permitted if the requests are marked with the `X-Arango-Allow-Dirty-Read: true` header, +otherwise they are denied too. +Only the replication itself is allowed to access the follower's data until the +follower becomes a new _Leader_ (should a _failover_ happen). + +When sending a request to read or write data on a _Follower_, the _Follower_ +responds with `HTTP 503 (Service unavailable)` and provides the address of +the current _Leader_. Client applications and drivers can use this information to +then make a follow-up request to the proper _Leader_: + +``` +HTTP/1.1 503 Service Unavailable +X-Arango-Endpoint: http://[::1]:8531 +.... +``` + +Client applications can also detect who the current _Leader_ and the _Followers_ +are by calling the `/_api/cluster/endpoints` REST API. This API is accessible +on _Leader_ and _Followers_ alike. + +## Reading from Followers + +Followers in the active-failover setup are in read-only mode. It is possible to read from these +followers by adding a `X-Arango-Allow-Dirty-Read: true` header on each request. Responses will then automatically +contain the `X-Arango-Potential-Dirty-Read: true` header so that clients can reject accidental dirty reads. + +Depending on the driver support for your specific programming language, you should be able +to enable this option. + +## How to deploy + +The tool _ArangoDB Starter_ supports starting two servers with asynchronous +replication and failover [out of the box](using-the-arangodb-starter.md). + +The _arangojs_ driver for JavaScript, the Go driver, the Java driver, ArangoJS and +the PHP driver support active failover in case the currently accessed server endpoint +responds with `HTTP 503`. + +You can also deploy an *Active Failover* environment [manually](manual-start.md). + +## Limitations + +The _Active Failover_ setup in ArangoDB has a few limitations. + +- In contrast to the [ArangoDB Cluster](../cluster/_index.md): + - Active Failover has only asynchronous replication, and hence **no guarantee** on how many database operations may have been lost during a failover. + - Active Failover has no global state, and hence a failover to a bad follower (see the example above) overrides all other followers with that state (including the previous leader, which might have more up-to-date data). In a Cluster setup, a global state is provided by the agency and hence ArangoDB is aware of the latest state. +- Should you add more than one _follower_, be aware that during a _failover_ situation + the failover attempts to pick the most up-to-date follower as the new leader on a **best-effort** basis. +- Should you be using the [ArangoDB Starter](../../components/tools/arangodb-starter/_index.md) + or the [Kubernetes Operator](../kubernetes.md) to manage your Active-Failover + deployment, be aware that upgrading might trigger an unintentional failover between machines. diff --git a/site/content/arangodb/oem/deploy/active-failover/administration.md b/site/content/arangodb/oem/deploy/active-failover/administration.md new file mode 100644 index 0000000000..7ff8e2e7ae --- /dev/null +++ b/site/content/arangodb/oem/deploy/active-failover/administration.md @@ -0,0 +1,79 @@ +--- +title: Administrate an Active Failover deployment +menuTitle: Administration +weight: 15 +description: '' +--- +## Introduction + +The _Active Failover_ setup requires almost no manual administration. + +You may still need to replace, upgrade or remove individual nodes +in an _Active Failover_ setup. + +## Determining the current *Leader* + +It is possible to determine the _leader_ by asking any of the involved single-server +instances. Just send a request to the `/_api/cluster/endpoints` REST API. + +```bash +curl http://server.domain.org:8530/_api/cluster/endpoints +{ + "error": false, + "code": 200, + "endpoints": [ + { + "endpoint": "tcp://[::1]:8530" + }, + { + "endpoint": "tcp://[::1]:8531" + } + ] +} +``` + +This API will return you all available endpoints, the first endpoint is defined to +be the current _Leader_. This endpoint is always available and will not be blocked +with a `HTTP/1.1 503 Service Unavailable` response on a _Follower_ + +## Reading from Follower + +Followers in the active-failover setup are in a read-only mode. It is possible to read from these +followers by adding a `X-Arango-Allow-Dirty-Read: true` header on each request. Responses will then automatically +contain the `X-Arango-Potential-Dirty-Read` header so that clients can reject accidental dirty reads. + +Depending on the driver support for your specific programming language, you should be able to enable this option. + +## Upgrading / Replacing / Removing a *Leader* + +A _Leader_ is the active server which can receive all read and write operations +in an _Active-Failover_ setup. + +Upgrading or removing a _Leader_ can be a little tricky, because as soon as you +stop the leader's process you will trigger a failover situation. This can be intended +here, but you will probably want to halt all writes to the _leader_ for a certain +amount of time to allow the _follower_ to catch up on all operations. + +After you have ensured that the _follower_ is sufficiently caught up, you can +stop the _leader_ process via the shutdown API or by sending a `SIGTERM` signal +to the process (i.e. `kill <process-id>`). This will trigger an orderly shutdown, +and should trigger an immediate switch to the _follower_. If your client drivers +are configured correctly, you should notice almost no interruption in your +applications. + +Once you upgraded the local server via the `--database.auto-upgrade` option, +you can add it again to the _Active Failover_ setup. The server will resync automatically +with the new _Leader_ and become a _Follower_. + +## Upgrading / Replacing / Removing a *Follower* + +A _Follower_ is the passive server which tries to mirror all the data stored in +the _Leader_. + +To upgrade a _follower_ you only need to stop the process and start it +with `--database.auto-upgrade`. The server process will automatically resync +with the Leader after a restart. + +The clean way of removing a _Follower_ is to first start a replacement _Follower_ +(otherwise you will lose resiliency). +After you have your replacement ready you can just kill the process and remove it. diff --git a/site/content/arangodb/oem/deploy/active-failover/manual-start.md b/site/content/arangodb/oem/deploy/active-failover/manual-start.md new file mode 100644 index 0000000000..d04bafbd84 --- /dev/null +++ b/site/content/arangodb/oem/deploy/active-failover/manual-start.md @@ -0,0 +1,276 @@ +--- +title: Start an Active Failover deployment manually +menuTitle: Manual Start +weight: 5 +description: '' +--- +An ArangoDB _Active Failover_ setup consists of several running _tasks_ or _processes_. + +This section describes how to start an _Active Failover_ by manually starting all +the needed processes. + +Before continuing, be sure to read the [Architecture](_index.md) +section to get a basic understanding of the underlying architecture and the involved +roles in an ArangoDB Active Failover setup. + +We will include commands for a local test (all processes running on a single machine) +and for a more real production scenario, which makes use of 3 different machines. + +## Local Tests + +In this paragraph we will include commands to manually start an Active Failover +with 3 _Agents_, and two single server instances. + +We will assume that all processes runs on the same machine (127.0.0.1). Such scenario +should be used for testing only. + +### Local Test Agency + +To start up an _Agency_ you first have to activate it. This is done by providing +the option `--agency.activate true`. + +To start up the _Agency_ in its fault tolerant mode set the `--agency.size` to `3`. +You will then have to start at least 3 _Agents_ before the _Agency_ will start operation. + +During initialization the _Agents_ have to find each other. To do so provide at +least one common `--agency.endpoint`. The _Agents_ will then coordinate startup +themselves. They will announce themselves with their external address which may be +specified using `--agency.my-address`. This is required in bridged docker setups +or NATed environments. + +So in summary these are the commands to start an _Agency_ of size 3: + +``` +arangod --server.endpoint tcp://0.0.0.0:5001 \ + --agency.my-address=tcp://127.0.0.1:5001 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://127.0.0.1:5001 \ + --agency.supervision true \ + --agency.supervision-grace-period 30 \ + --database.directory agent1 & + +arangod --server.endpoint tcp://0.0.0.0:5002 \ + --agency.my-address=tcp://127.0.0.1:5002 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://127.0.0.1:5001 \ + --agency.supervision true \ + --agency.supervision-grace-period 30 \ + --database.directory agent2 & + +arangod --server.endpoint tcp://0.0.0.0:5003 \ + --agency.my-address=tcp://127.0.0.1:5003 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://127.0.0.1:5001 \ + --agency.supervision true \ + --agency.supervision-grace-period 30 \ + --database.directory agent3 & +``` + +Note that to avoid unnecessary failovers, it may make sense to increase the value for +the startup option `--agency.supervision-grace-period` to a value beyond 30 seconds. + +### Single Server Test Instances + +To start the two single server instances, you can use the following commands: + +``` +arangod --server.authentication false \ + --server.endpoint tcp://127.0.0.1:6001 \ + --cluster.my-address tcp://127.0.0.1:6001 \ + --cluster.my-role SINGLE \ + --cluster.agency-endpoint tcp://127.0.0.1:5001 \ + --cluster.agency-endpoint tcp://127.0.0.1:5002 \ + --cluster.agency-endpoint tcp://127.0.0.1:5003 \ + --replication.automatic-failover true \ + --database.directory singleserver6001 & + +arangod --server.authentication false \ + --server.endpoint tcp://127.0.0.1:6002 \ + --cluster.my-address tcp://127.0.0.1:6002 \ + --cluster.my-role SINGLE \ + --cluster.agency-endpoint tcp://127.0.0.1:5001 \ + --cluster.agency-endpoint tcp://127.0.0.1:5002 \ + --cluster.agency-endpoint tcp://127.0.0.1:5003 \ + --replication.automatic-failover true \ + --database.directory singleserver6002 & +``` + +## Multiple Machines + +The method from the previous paragraph can be extended to a more real production scenario, +to start an Active Failover on multiple machines. The only changes are that one +has to replace all local addresses `127.0.0.1` by the actual IP address of the +corresponding server. Obviously, it would no longer be necessary to use different +port numbers on different servers. + +Let's assume that you want to start you Active Failover with 3 _Agents_ and two +single servers on three different machines with IP addresses: + +``` +192.168.1.1 +192.168.1.2 +192.168.1.3 +``` + +Let's also suppose that each of the above machines runs an _Agent_, an the first +and second machine run also the single instance. + +If we use: + +- _8531_ as port of the _Agents_ +- _8529_ as port of the _Coordinators_ + +then the commands you have to use are reported in the following subparagraphs. + +### Agency + +On 192.168.1.1: + +``` +arangod --server.endpoint tcp://0.0.0.0:8531 \ + --agency.my-address tcp://192.168.1.1:8531 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.supervision true \ + --agency.supervision-grace-period 30 \ + --database.directory agent +``` + +On 192.168.1.2: + +``` +arangod --server.endpoint tcp://0.0.0.0:8531 \ + --agency.my-address tcp://192.168.1.2:8531 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.supervision true \ + --agency.supervision-grace-period 30 \ + --database.directory agent +``` + +On 192.168.1.3: + +``` +arangod --server.endpoint tcp://0.0.0.0:8531 \ + --agency.my-address tcp://192.168.1.3:8531 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://192.168.1.1:8531 \ + --agency.endpoint tcp://192.168.1.2:8531 \ + --agency.endpoint tcp://192.168.1.3:8531 \ + --agency.supervision true \ + --agency.supervision-grace-period 30 \ + --database.directory agent +``` + +Note that to avoid unnecessary failovers, it may make sense to increase the value for +the startup option `--agency.supervision-grace-period` to a value beyond 30 seconds. + +### Single Server Instances + +On 192.168.1.1: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8529 \ + --cluster.my-address tcp://192.168.1.1:8529 \ + --cluster.my-role SINGLE \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --replication.automatic-failover true \ + --database.directory singleserver & +``` + +On 192.168.1.2: + +Wait until the previous server is fully started, then start the second single server +instance: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8529 \ + --cluster.my-address tcp://192.168.1.2:8529 \ + --cluster.my-role SINGLE \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --replication.automatic-failover true \ + --database.directory singleserver & +``` + +**Note:** in the above commands, you can use host names, if they can be resolved, +instead of IP addresses. + +## Manual Start in Docker + +Manually starting an _Active Failover_ via Docker is basically the same as described in the +paragraphs above. + +A bit of extra care has to be invested due to the way in which Docker isolates its network. +By default it fully isolates the network and by doing so an endpoint like `--server.endpoint tcp://0.0.0.0:8529` +will only bind to all interfaces inside the Docker container which does not include +any external interface on the host machine. This may be sufficient if you just want +to access it locally but in case you want to expose it to the outside you must +facilitate Dockers port forwarding using the `-p` command line option. Be sure to +check the [official Docker documentation](https://docs.docker.com/engine/reference/run/). + +You can simply use the `-p` flag in Docker to make the individual processes available on the host +machine or you could use Docker's [links](https://docs.docker.com/engine/reference/run/) +to enable process intercommunication. + +An example configuration might look like this: + +``` +docker run -e ARANGO_NO_AUTH=1 -p 192.168.1.1:10000:8529 arangodb/arangodb arangod \ + --server.endpoint tcp://0.0.0.0:8529\ + --cluster.my-address tcp://192.168.1.1:10000 \ + --cluster.my-role SINGLE \ + --cluster.agency-endpoint tcp://192.168.1.1:9001 \ + --cluster.agency-endpoint tcp://192.168.1.2:9001 \ + --cluster.agency-endpoint tcp://192.168.1.3:9001 \ + --replication.automatic-failover true +``` + +This will start a single server within a Docker container with an isolated network. +Within the Docker container it will bind to all interfaces (this will be 127.0.0.1:8529 +and some internal Docker IP on port 8529). By supplying `-p 192.168.1.1:10000:8529` +we are establishing a port forwarding from our local IP (192.168.1.1 port 10000 in +this example) to port 8529 inside the container. Within the command we are telling +_arangod_ how it can be reached from the outside `--cluster.my-address tcp://192.168.1.1:10000`. + +### Authentication + +To start the official Docker container you will have to decide on an authentication +method, otherwise the container will not start. + +Provide one of the arguments to Docker as an environment variable. There are three +options: + +1. ARANGO_NO_AUTH=1 + + Disable authentication completely. Useful for local testing or for operating + in a trusted network (without a public interface). + +2. ARANGO_ROOT_PASSWORD=password + + Start ArangoDB with the given password for root. + +3. ARANGO_RANDOM_ROOT_PASSWORD=1 + + Let ArangoDB generate a random root password. + +For an in depth guide about Docker and ArangoDB please check the official documentation: +[hub.docker.com/r/arangodb/arangodb/](https://hub.docker.com/r/arangodb/arangodb/). +Note that we are using the image `arangodb/arangodb` here which is always the most current one. +There is also the "official" one called `arangodb` whose documentation is here: +[hub.docker.com/\_/arangodb/](https://hub.docker.com/_/arangodb/) diff --git a/site/content/arangodb/oem/deploy/active-failover/using-the-arangodb-starter.md b/site/content/arangodb/oem/deploy/active-failover/using-the-arangodb-starter.md new file mode 100644 index 0000000000..b6b39ae70f --- /dev/null +++ b/site/content/arangodb/oem/deploy/active-failover/using-the-arangodb-starter.md @@ -0,0 +1,158 @@ +--- +title: Create an Active Failover deployment using the ArangoDB Starter +menuTitle: Using the ArangoDB Starter +weight: 10 +description: '' +--- +This section describes how to start an Active Failover setup the tool [_Starter_](../../components/tools/arangodb-starter/_index.md) +(the _arangodb_ binary program). + +As a precondition you should create a _secret_ to activate authentication. The _Starter_ provides a handy +functionality to generate such a file: + +```bash +arangodb create jwt-secret --secret=arangodb.secret +``` + +Set appropriate privilege on the generated _secret_ file, e.g. on Linux: + +```bash +chmod 400 arangodb.secret +``` + +## Local Active Failover test deployment + +If you want to start a local _Active Failover_ setup quickly, use the `--starter.local` +option of the _Starter_. This will start all servers within the context of a single +starter process: + +```bash +arangodb --starter.local --starter.mode=activefailover --starter.data-dir=./localdata --auth.jwt-secret=/etc/arangodb.secret --agents.agency.supervision-grace-period=30 +``` + +Please adapt the path to your _secret_ file accordingly. + +Note that to avoid unnecessary failovers, it may make sense to increase the value +for the startup option `--agents.agency.supervision-grace-period` to a value +beyond 30 seconds. + +**Note:** When you restart the _Starter_, it remembers the original `--starter.local` flag. + +## Multiple Machines + +If you want to start an Active Failover setup using the _Starter_, you need to copy the +_secret_ file to every machine and use the `--starter.mode=activefailover` option of the +_Starter_. A 3 "machine" _Agency_ is started as well as 3 single servers, +that perform asynchronous replication and failover: + +```bash +arangodb --starter.mode=activefailover --starter.data-dir=./data --auth.jwt-secret=/etc/arangodb.secret --agents.agency.supervision-grace-period=30 --starter.join A,B,C +``` + +Please adapt the path to your _secret_ file accordingly. + +Note that to avoid unnecessary failovers, it may make sense to increase the value +for the startup option `--agents.agency.supervision-grace-period` to a value +beyond 30 seconds. + +Run the above command on machine A, B & C. + +Once all the processes started by the _Starter_ are up and running, and joined the +Active Failover setup (this may take a while depending on your system), the _Starter_ will inform +you where to connect the Active Failover from a Browser, shell or your program. + +For a full list of options of the _Starter_ please refer to [this](../../components/tools/arangodb-starter/options.md) +section. + +## Using the ArangoDB Starter in Docker + +The _Starter_ can also be used to launch an Active Failover setup based on _Docker_ +containers. To do this, you can use the normal Docker arguments, combined with +`--starter.mode=activefailover`: + +```bash +export IP=<IP of docker host> +docker volume create arangodb +docker run -it --name=adb --rm -p 8528:8528 \ + -v arangodb:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + arangodb/arangodb-starter \ + --agents.agency.supervision-grace-period=30 \ + --starter.address=$IP \ + --starter.mode=activefailover \ + --starter.join=A,B,C \ + --docker.net-mode=default +``` + +Run the above command on machine A, B & C. + +Note that to avoid unnecessary failovers, it may make sense to increase the value +for the startup option `--agents.agency.supervision-grace-period` to a value +beyond 30 seconds. + +The _Starter_ will decide on which 2 machines to run a single server instance. +To override this decision (only valid while bootstrapping), add a +`--cluster.start-single=false` to the machine where the single server +instance should _not_ be started. + +If you use the Enterprise Edition Docker image, you have to set the license key +in an environment variable by adding this option to the above `docker` command: + +``` + -e ARANGO_LICENSE_KEY=<the-key> +``` + +You can get a free evaluation license key by visiting: + +[www.arangodb.com/download-arangodb-enterprise/](https://www.arangodb.com/download-arangodb-enterprise/) + +Then replace `<the-key>` above with the actual license key. The start +will then hand on the license key to the Docker containers it launches +for ArangoDB. + +### TLS verified Docker services + +Oftentimes, one needs to harden Docker services using client certificate +and TLS verification. The Docker API allows subsequently only certified access. +As the ArangoDB starter starts the ArangoDB cluster instances using this Docker API, +it is mandatory that the ArangoDB starter is deployed with the proper certificates +handed to it, so that the above command is modified as follows: + +```bash +export IP=<IP of docker host> +export DOCKER_TLS_VERIFY=1 +export DOCKER_CERT_PATH=/path/to/certificate +docker volume create arangodb +docker run -it --name=adb --rm -p 8528:8528 \ + -v arangodb:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /path/to/certificate:/path/to/certificate + arangodb/arangodb-starter \ + --agents.agency.supervision-grace-period=30 \ + --starter.address=$IP \ + --starter.mode=activefailover \ + --starter.join=A,B,C \ + --docker.net-mode=default +``` + +Note that the environment variables `DOCKER_TLS_VERIFY` and `DOCKER_CERT_PATH` +as well as the additional mountpoint containing the certificate have been added above. +directory. The assignment of `DOCKER_CERT_PATH` is optional, in which case it +is mandatory that the certificates are stored in `$HOME/.docker`. So +the command would then be as follows + +```bash +export IP=<IP of docker host> +docker volume create arangodb +docker run -it --name=adb --rm -p 8528:8528 \ + -v arangodb:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /path/to/cert:/root/.docker \ + -e DOCKER_TLS_VERIFY=1 \ + arangodb/arangodb-starter \ + --agents.agency.supervision-grace-period=30 \ + --starter.address=$IP \ + --starter.mode=activefailover \ + --starter.join=A,B,C \ + --docker.net-mode=default +``` diff --git a/site/content/arangodb/oem/deploy/arangosync/_index.md b/site/content/arangodb/oem/deploy/arangosync/_index.md new file mode 100644 index 0000000000..84e98d03fd --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/_index.md @@ -0,0 +1,129 @@ +--- +title: Datacenter-to-Datacenter Replication +menuTitle: Datacenter-to-Datacenter Replication +weight: 25 +description: >- + A detailed guide to Datacenter-to-Datacenter Replication (DC2DC) for clusters + and the _arangosync_ tool +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +At some point in the grows of a database, there comes a need for replicating it +across multiple datacenters. + +Reasons for that can be: + +- Fallback in case of a disaster in one datacenter +- Regional availability +- Separation of concerns + +And many more. + +ArangoDB supports _Datacenter-to-Datacenter Replication_, via the _arangosync_ tool. + +ArangoDB's _Datacenter-to-Datacenter Replication_ is a solution that enables you +to asynchronously replicate the entire structure and content in an ArangoDB Cluster +in one place to a Cluster in another place. Typically it is used from one datacenter +to another. It is possible to replicate to multiple other datacenters as well. +It is not a solution for replicating single server instances. + +![ArangoDB DC2DC](../../../../images/dc2dc_topology.png) + +The replication done by _ArangoSync_ is **asynchronous**. That means that when +a client is writing data into the source datacenter, it will consider the +request finished before the data has been replicated to the other datacenter. +The time needed to completely replicate changes to the other datacenter is +typically in the order of seconds, but this can vary significantly depending on +load, network & computer capacity. + +_ArangoSync_ performs replication in a **single direction** only. That means that +you can replicate data from cluster _A_ to cluster _B_ or from cluster _B_ to +cluster _A_, but never at the same time (one leader, one or more follower clusters). +Data modified in the destination cluster **will be lost!** + +Replication is a completely **autonomous** process. Once it is configured it is +designed to run 24/7 without frequent manual intervention. +This does not mean that it requires no maintenance or attention at all. +As with any distributed system some attention is needed to monitor its operation +and keep it secure (e.g. certificate & password rotation). + +In the event of an outage of the leader cluster, user intervention is required +to either bring the leader back up or to decide on making a follower cluster the +new leader. There is no automatic failover as follower clusters lag behind the leader +because of network latency etc. and resuming operation with the state of a follower +cluster can therefore result in the loss of recent writes. How much can be lost +largely depends on the data rate of the leader cluster and the delay between +the leader and the follower clusters. Followers will typically be behind the +leader by a couple of seconds or minutes. + +Once configured, _ArangoSync_ will replicate both **structure and data** of an +**entire cluster**. This means that there is no need to make additional configuration +changes when adding/removing databases or collections. +Also meta data such as users, Foxx application & jobs are automatically replicated. + +A message queue developed by ArangoDB in Go and called **DirectMQ** is used for +replication. It is tailored for DC2DC replication with efficient native +networking routines. + +## When to use it... and when not + +The _Datacenter-to-Datacenter Replication_ is a good solution in all cases where +you want to replicate data from one cluster to another without the requirement +that the data is available immediately in the other cluster. + +The _Datacenter-to-Datacenter Replication_ is not a good solution when one of the +following applies: + +- You want to replicate data from cluster A to cluster B and from cluster B +to cluster A at the same time. +- You need synchronous replication between 2 clusters. +- There is no network connection between cluster A and B. +- You want complete control over which database, collection & documents are replicate and which not. + +## Requirements + +To use _Datacenter-to-Datacenter Replication_ you need the following: + +- Two datacenters, each running an ArangoDB Enterprise Edition cluster. +- 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). +- Optional (but recommended) TLS certificates for ArangoDB clusters (can be self-signed). +- Client certificates CA for _ArangoSync masters_ (typically self-signed). +- Client certificates for _ArangoSync masters_ (typically self-signed). +- At least 2 instances of the _ArangoSync master_ in each datacenter. +- One instances of the _ArangoSync worker_ on every machine in each datacenter. + +{{< info >}} +In several places you will need a (x509) certificate. +The [Certificates](security.md#certificates) section provides more guidance for creating +and renewing these certificates. +{{< /info >}} + +Besides the above list, you probably want to use the following: + +- An orchestrator to keep all components running, e.g. `systemd`. +- A log file collector for centralized collection & access to the logs of all components. +- A metrics collector & viewing solution such as _Prometheus_ + _Grafana_. + +## Limitations + +The _Datacenter-to-Datacenter Replication_ setup in ArangoDB has a few limitations. +Some of these limitations may be removed in later versions of ArangoDB: + +- All the machines where the ArangoDB Server processes run must run the Linux + operating system using the AMD64 (x86-64) or ARM64 (AArch64) architecture. Clients can run from any platform. + +- All the machines where the ArangoSync Server processes run must run the Linux + operating system using the AMD64 (x86-64) or ARM64 (AArch64) architecture. + The ArangoSync command line tool is available for Linux, Windows & macOS. + +- The entire cluster is replicated. It is not possible to exclude specific + databases or collections from replication. + +- In any DC2DC setup, the minor version of the target cluster must be equal to + or greater than the minor version of the source cluster. Replication from a higher to a + lower minor version (i.e., from 3.9.x to 3.8.x) is not supported. + Syncing between different patch versions of the same minor version is possible, however. + For example, you cannot sync from a 3.9.1 cluster to a 3.8.7 cluster, but + you can sync from a 3.9.1 cluster to a 3.9.0 cluster. diff --git a/site/content/arangodb/oem/deploy/arangosync/administration.md b/site/content/arangodb/oem/deploy/arangosync/administration.md new file mode 100644 index 0000000000..687ce00e10 --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/administration.md @@ -0,0 +1,147 @@ +--- +title: Datacenter-to-Datacenter Replication Administration +menuTitle: Administration +weight: 10 +description: >- + How to administrate Datacenter-to-Datacenter Replication +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +This section includes information related to the synchronization process +of the _Datacenter-to-Datacenter Replication_. + +## Starting synchronization + +Once all components of the _ArangoSync_ solution have been deployed and are +running properly, _ArangoSync_ will not automatically replicate database structure +and content. For that, it is is needed to configure synchronization. + +To configure synchronization, you need the following: + +- The endpoint of the sync master in the target datacenter. +- The endpoint of the sync master in the source datacenter. +- A certificate (in keyfile format) used for client authentication of the sync master + (with the sync master in the source datacenter). +- A CA certificate (public key only) for verifying the integrity of the sync masters. +- A username+password pair (or client certificate) for authenticating the configure + require with the sync master (in the target datacenter) + +With that information, run: + +```bash +arangosync configure sync \ + --master.endpoint=<endpoints of sync masters in target datacenter> \ + --master.keyfile=<keyfile of of sync masters in target datacenter> \ + --source.endpoint=<endpoints of sync masters in source datacenter> \ + --source.cacert=<public key of CA certificate used to verify sync master in source datacenter> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> +``` + +The command will finish quickly. Afterwards it will take some time until +the clusters in both datacenters are in sync. + +## Inspect status + +Use the following command to inspect the status of the synchronization of a datacenter: + +```bash +arangosync get status \ + --master.endpoint=<endpoints of sync masters in datacenter of interest> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> \ + -v +``` + +Note that invoking this command on the target datacenter will return different results from +invoking it on the source datacenter. You need insight in both results to get a "complete picture". + +Where the `get status` command gives insight in the status of synchronization, there +are more detailed commands to give insight in tasks & registered workers. + +Use the following command to get a list of all synchronization tasks in a datacenter: + +```bash +arangosync get tasks \ + --master.endpoint=<endpoints of sync masters in datacenter of interest> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> \ + -v +``` + +Use the following command to get a list of all masters in a datacenter and know which master is the current leader: + +```bash +arangosync get masters \ + --master.endpoint=<endpoints of sync masters in datacenter of interest> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> \ + -v +``` + +Use the following command to get a list of all workers in a datacenter: + +```bash +arangosync get workers \ + --master.endpoint=<endpoints of sync masters in datacenter of interest> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> \ + -v +``` + +## Stopping synchronization + +If you no longer want to synchronize data from a source to a target datacenter +you must stop it. To do so, run the following command: + +```bash +arangosync stop sync \ + --master.endpoint=<endpoints of sync masters in target datacenter> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> +``` + +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: + +```bash +arangosync abort sync \ + --master.endpoint=<endpoints of sync masters in target datacenter> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> +``` + +If the source datacenter recovers after an `abort sync` has been executed, it is +needed to "cleanup" ArangoSync in the source datacenter. +To do so, execute the following command: + +```bash +arangosync abort outgoing sync \ + --master.endpoint=<endpoints of sync masters in source datacenter> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> +``` + +## Reversing synchronization direction + +If you want to reverse the direction of synchronization (e.g. after a failure +in datacenter A and you switched to the datacenter B for fallback), you +must first stop (or abort) the original synchronization. + +Once that is finished (and cleanup has been applied in case of abort), +you must now configure the synchronization again, but with swapped +source & target settings. diff --git a/site/content/arangodb/oem/deploy/arangosync/deployment/_index.md b/site/content/arangodb/oem/deploy/arangosync/deployment/_index.md new file mode 100644 index 0000000000..acff04a09a --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/deployment/_index.md @@ -0,0 +1,110 @@ +--- +title: Datacenter-to-Datacenter Replication deployment +menuTitle: Deployment +weight: 5 +description: '' +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +## Deployment steps + +To deploy all the components needed for _Datacenter-to-Datacenter Replication (DC2DC)_, +you need to set up the following components: + +1. An ArangoDB cluster in each data center +2. Multiple ArangoSync Masters +3. Multiple ArangoSync Workers +4. Optional: Prometheus and Grafana for monitoring + +## Cluster + +Datacenter-to-Datacenter Replication requires an ArangoDB cluster in both data centers. + +Since the _Agents_ are so critical to the availability of both the ArangoDB and +the ArangoSync cluster, it is recommended to run _Agents_ on dedicated machines. +They run a real-time system for the elections and bad performance can negatively +affect the availability of the whole cluster. + +_DB-Servers_ are also important and you do not want to lose them, but +depending on your replication factor, the system can tolerate some +loss and bad performance slows things down but not stop things from +working. + +_Coordinators_ can be deployed on other machines, since they do not hold +persistent state. They might have some in-memory state about running +transactions or queries, but losing a Coordinator does not lose any +persisted data. Furthermore, new Coordinators can be added to a cluster +without much effort. + +Please refer to the [Cluster](arangodb-cluster.md) section for +more information. + +## ArangoSync Master + +The Sync Master is responsible for managing all synchronization, creating tasks and assigning +those to workers. + +At least two instances must be deployed in each datacenter. +One instance is the leader cluster, the other is an inactive follower cluster. +When the leader is gone for a short while, one of the other instances takes over. + +With clusters of a significant size, the sync master requires a significant set of resources. +Therefore it is recommended to deploy sync masters on their own servers, equipped with sufficient +CPU power and memory capacity. + +The sync master must be reachable on a TCP port 8629 (default). +This port must be reachable from inside the datacenter (by sync workers and operations) +and from inside of the other datacenter (by sync masters in the other datacenter). + +Since the sync masters can be CPU intensive when running lots of databases & collections, +it is recommended to run them on dedicated machines with a lot of CPU power. + +Consider these machines to be crucial for your DC2DC setup. + +Please refer to the [ArangoSync Master](arangosync-master.md) +section for more information. + +## ArangoSync Workers + +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 DB-Server running. This ensures that tasks +can be executed with minimal network traffic outside of the machine. + +Since sync workers automatically stop once their TLS server certificate expires +(which is set to 2 years by default), +it is recommended to run at least two instances of a worker on every machine in the datacenter. +That way, tasks can still be assigned in the most optimal way, even when a worker in temporarily +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 DB-Server. +The sync worker can be memory intensive when running lots of databases & collections. + +Please refer to the [ArangoSync Workers](arangosync-workers.md) +for more information. + +## Prometheus & Grafana (optional) + +ArangoSync provides metrics in a format supported by [Prometheus](https://prometheus.io). +We also provide a standard set of dashboards for viewing those metrics in [Grafana](https://grafana.org). + +If you want to use these tools, go to their websites for instructions on how to deploy them. + +After deployment, you must configure prometheus using a configuration file that instructs +it about which targets to scrape. For ArangoSync you should configure scrape targets for +all sync masters and all sync workers. + +Prometheus can be a memory & CPU intensive process. It is recommended to keep them +on other machines than used to run the ArangoDB cluster or ArangoSync components. + +Consider these machines to be easily replaceable, unless you configure +alerting on _prometheus_, in which case it is recommended to keep a +close eye on them, such that you do not lose any alerts due to failures +of Prometheus. + +Please refer to the [Prometheus & Grafana](prometheus-and-grafana.md) +section for more information. diff --git a/site/content/arangodb/oem/deploy/arangosync/deployment/arangodb-cluster.md b/site/content/arangodb/oem/deploy/arangosync/deployment/arangodb-cluster.md new file mode 100644 index 0000000000..46226624c7 --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/deployment/arangodb-cluster.md @@ -0,0 +1,108 @@ +--- +title: Set up ArangoDB clusters for Datacenter-to-Datacenter Replication +menuTitle: ArangoDB Cluster +weight: 5 +description: '' +--- +There are several ways to start an ArangoDB cluster. This section focuses +on the recommended way to start ArangoDB: the ArangoDB _Starter_. + +For other possibilities to deploy an ArangoDB cluster see +[Cluster Deployment](../../cluster/deployment/_index.md). + +The _Starter_ simplifies things for the operator and coordinates a distributed +cluster startup across several machines and assign cluster roles automatically. + +When started on several machines and enough machines have joined, the _Starters_ +start _Agents_, _Coordinators_ and _DB-Servers_ on these machines. + +The _Starter_ supervises its child tasks (namely _Coordinators_, +_DB-Servers_ and _Agents_) and restarts them in case of failures. + +Datacenter-to-Datacenter Replication (DC2DC) requires a normal ArangoDB cluster in both datacenters +and one or more (`arangosync`) syncmasters & syncworkers in both datacenters. +The Starter enables you to run these syncmasters & syncworkers in combination with your normal +cluster. + +To run a starter with DC2DC support, you set the following arguments in addition to the +commands to start a cluster with the Starter: + +```bash +--auth.jwt-secret=<path of file containing JWT secret for communication in local cluster> +--starter.address=<publicly visible address of this machine> +--starter.sync +--sync.master.jwt-secret=<path of file containing JWT secret used for communication between local syncmaster & workers> +--sync.server.keyfile=<path of keyfile containing TLS certificate & key for local syncmaster> +--sync.server.client-cafile=<path of file containing CA certificate for syncmaster client authentication> +``` + +See [Securing Datacenter-to-Datacenter Replication](../security.md) +for instructions how to create all certificates and keyfiles. + +To start the cluster using a `systemd` unit file (and start DC2DC replication +later manually), use the following: + +```conf +[Unit] +Description=Run the ArangoDB Starter +After=network.target + +[Service] +Restart=on-failure +EnvironmentFile=/etc/arangodb.env +EnvironmentFile=/etc/arangodb.env.local +Environment=DATADIR=/var/lib/arangodb/cluster +ExecStartPre=/usr/bin/sh -c "mkdir -p ${DATADIR}" +ExecStart=/usr/bin/arangodb \ + --starter.address=${PRIVATEIP} \ + --starter.data-dir=${DATADIR} \ + --starter.join=${STARTERENDPOINTS} \ + --auth.jwt-secret=${CLUSTERSECRETPATH} +TimeoutStopSec=60 +LimitNOFILE=1048576 + +[Install] +WantedBy=multi-user.target +``` + +## Cluster authentication + +The communication between the cluster nodes use a token (JWT) to authenticate. +This must be shared between cluster nodes. + +Sharing secrets is obviously a very delicate topic. The above workflow assumes +that the operator puts a secret in a file named `${CLUSTERSECRETPATH}`. + +We recommend to use a dedicated system for managing secrets like HashiCorp's `Vault`. + +## Required ports + +As soon as enough machines have joined, the _Starter_ begins starting _Agents_, +_Coordinators_ and _DB-Servers_. + +Each of these tasks needs a port to communicate. Please make sure that the following +ports are available on all machines: + +- `8529` for Coordinators +- `8530` for DB-Servers +- `8531` for Agents + +The _Starter_ itself uses port `8528`. + +## Recommended deployment environment + +Since the _Agents_ are so critical to the availability of both the ArangoDB and +the ArangoSync cluster, it is recommended to run _Agents_ on dedicated machines. +They run a real-time system for the elections and bad performance can negatively +affect the availability of the whole cluster. + +_DB-Servers_ are also important and you do not want to lose them, but +depending on your replication factor, the system can tolerate some +loss and bad performance slows things down but not stop things from +working. + +_Coordinators_ can be deployed on other machines, since they do not hold +persistent state. They might have some in-memory state about running +transactions or queries, but losing a Coordinator does not lose any +persisted data. Furthermore, new Coordinators can be added to a cluster +without much effort. diff --git a/site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-master.md b/site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-master.md new file mode 100644 index 0000000000..efb4d140c7 --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-master.md @@ -0,0 +1,78 @@ +--- +title: Set up the ArangoSync Master for Datacenter-to-Datacenter Replication +menuTitle: ArangoSync Master +weight: 10 +description: '' +--- +The _ArangoSync Master_ is responsible for managing all synchronization, creating +tasks and assigning those to the _ArangoSync Workers_. + +At least 2 instances must be deployed in each datacenter. +One instance will be the "leader", the other will be a "follower". When the +leader is gone for a short while, one of the other instances will take over. + +With clusters of a significant size, the _sync master_ will require a +significant set of resources. Therefore it is recommended to deploy the _sync masters_ +on their own servers, equipped with sufficient CPU power and memory capacity. + +To start an _ArangoSync Master_ using a `systemd` service, use a unit like this: + +```conf +[Unit] +Description=Run ArangoSync in master mode +After=network.target + +[Service] +Restart=on-failure +EnvironmentFile=/etc/arangodb.env +EnvironmentFile=/etc/arangodb.env.local +LimitNOFILE=8192 +ExecStart=/usr/sbin/arangosync run master \ + --log.level=debug \ + --cluster.endpoint=${CLUSTERENDPOINTS} \ + --cluster.jwtSecret=${CLUSTERSECRET} \ + --server.keyfile=${CERTIFICATEDIR}/tls.keyfile \ + --server.client-cafile=${CERTIFICATEDIR}/client-auth-ca.crt \ + --server.endpoint=https://${PRIVATEIP}:${MASTERPORT} \ + --server.port=${MASTERPORT} \ + --master.endpoint=${PUBLICMASTERENDPOINTS} \ + --master.jwtSecret=${MASTERSECRET} \ + --mq.type=direct +TimeoutStopSec=60 + +[Install] +WantedBy=multi-user.target +``` + +The _sync master_ needs a TLS server certificate and a +If you want the service to create a TLS certificate & client authentication +certificate, for authenticating with _ArangoSync Masters_ in another datacenter, +for every start, add this to the `Service` section. + +```conf +ExecStartPre=/usr/bin/sh -c "mkdir -p ${CERTIFICATEDIR}" +ExecStartPre=/usr/sbin/arangosync create tls keyfile \ + --cacert=${CERTIFICATEDIR}/tls-ca.crt \ + --cakey=${CERTIFICATEDIR}/tls-ca.key \ + --keyfile=${CERTIFICATEDIR}/tls.keyfile \ + --host=${PUBLICIP} \ + --host=${PRIVATEIP} \ + --host=${HOST} \ + --host=${CLUSTERDNSNAME} +``` + +The _ArangoSync Master_ must be reachable on a TCP port `${MASTERPORT}` (used with `--server.port` option). +This port must be reachable from inside the datacenter (by sync workers and operations) +and from inside of the other datacenter (by sync masters in the other datacenter). + +Note that other sync masters in the same datacenter will contact this sync master +through the endpoint specified in `--server.endpoint`. +Sync masters (and sync workers) from the other datacenter will contact this sync master +through the endpoint specified in `--master.endpoint`. + +## Recommended deployment environment + +Since the _sync masters_ can be CPU intensive when running lots of databases & collections, +it is recommended to run them on dedicated machines with a lot of CPU power. + +Consider these machines crucial for you DC2DC replication setup. diff --git a/site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-workers.md b/site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-workers.md new file mode 100644 index 0000000000..5d4a3053ab --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/deployment/arangosync-workers.md @@ -0,0 +1,54 @@ +--- +title: Set up the ArangoSync Workers for Datacenter-to-Datacenter Replication +menuTitle: ArangoSync Workers +weight: 15 +description: '' +--- +The _ArangoSync 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 _DB-Server_ 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 +(which is set to 2 years by default), it is recommended to run at least 2 instances +of a _worker_ on every machine in the datacenter. That way, tasks can still be +assigned in the most optimal way, even when a _worker_ is temporarily down for a +restart. + +To start an _ArangoSync Worker_ using a `systemd` service, use a unit like this: + +```conf +[Unit] +Description=Run ArangoSync in worker mode +After=network.target + +[Service] +Restart=on-failure +EnvironmentFile=/etc/arangodb.env +EnvironmentFile=/etc/arangodb.env.local +Environment=PORT=8729 +LimitNOFILE=1000000 +ExecStart=/usr/sbin/arangosync run worker \ + --log.level=debug \ + --server.port=${PORT} \ + --server.endpoint=https://${PRIVATEIP}:${PORT} \ + --master.endpoint=${MASTERENDPOINTS} \ + --master.jwtSecret=${MASTERSECRET} +TimeoutStopSec=60 + +[Install] +WantedBy=multi-user.target +``` + +The _ArangoSync Worker_ must be reachable on a TCP port `${PORT}` (used with `--server.port` +option). This port must be reachable from inside the datacenter (by _sync masters_). + +Note the large file descriptor limit. The _sync worker_ requires about 30 file descriptors per +shard. If you use hardware with huge resources, and still run out of file descriptors, +you can decide to run multiple _sync workers_ on each machine in order to spread the tasks across them. + +## Recommended deployment environment + +The _sync workers_ should be run on all machines that also contain an ArangoDB _DB-Server_. +The _sync worker_ can be memory intensive when running lots of databases & collections. diff --git a/site/content/arangodb/oem/deploy/arangosync/deployment/prometheus-and-grafana.md b/site/content/arangodb/oem/deploy/arangosync/deployment/prometheus-and-grafana.md new file mode 100644 index 0000000000..eb78022fdf --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/deployment/prometheus-and-grafana.md @@ -0,0 +1,103 @@ +--- +title: Set up Prometheus & Grafana for Datacenter-to-Datacenter-Replication +menuTitle: Prometheus & Grafana +weight: 20 +description: '' +--- +_ArangoSync_ provides metrics in a format supported by [Prometheus](https://prometheus.io) +that you can optionally use. +ArangoDB also provides a standard set of dashboards for viewing those metrics in [Grafana](https://grafana.org). + +If you want to use these tools, please refer to their websites for instructions +on how to deploy them. + +After deployment, you must configure _Prometheus_ using a configuration file that +instructs it about which targets to scrape. For _ArangoSync_ you should configure +scrape targets for all _sync masters_ and all _sync workers_. To do so, you can +use a configuration such as this: + +```yaml +global: + scrape_interval: 10s # scrape targets every 10 seconds. + +scrape_configs: + # Scrap sync masters + - job_name: 'sync_master' + scheme: 'https' + bearer_token: "${MONITORINGTOKEN}" + tls_config: + insecure_skip_verify: true + static_configs: + - targets: + - "${IPMASTERA1}:8629" + - "${IPMASTERA2}:8629" + - "${IPMASTERB1}:8629" + - "${IPMASTERB2}:8629" + labels: + type: "master" + relabel_configs: + - source_labels: [__address__] + regex: ${IPMASTERA1}\:8629|${IPMASTERA2}\:8629 + target_label: dc + replacement: A + - source_labels: [__address__] + regex: ${IPMASTERB1}\:8629|${IPMASTERB2}\:8629 + target_label: dc + replacement: B + - source_labels: [__address__] + regex: ${IPMASTERA1}\:8629|${IPMASTERB1}\:8629 + target_label: instance + replacement: 1 + - source_labels: [__address__] + regex: ${IPMASTERA2}\:8629|${IPMASTERB2}\:8629 + target_label: instance + replacement: 2 + + # Scrap sync workers + - job_name: 'sync_worker' + scheme: 'https' + bearer_token: "${MONITORINGTOKEN}" + tls_config: + insecure_skip_verify: true + static_configs: + - targets: + - "${IPWORKERA1}:8729" + - "${IPWORKERA2}:8729" + - "${IPWORKERB1}:8729" + - "${IPWORKERB2}:8729" + labels: + type: "worker" + relabel_configs: + - source_labels: [__address__] + regex: ${IPWORKERA1}\:8729|${IPWORKERA2}\:8729 + target_label: dc + replacement: A + - source_labels: [__address__] + regex: ${IPWORKERB1}\:8729|${IPWORKERB2}\:8729 + target_label: dc + replacement: B + - source_labels: [__address__] + regex: ${IPWORKERA1}\:8729|${IPWORKERB1}\:8729 + target_label: instance + replacement: 1 + - source_labels: [__address__] + regex: ${IPWORKERA2}\:8729|${IPWORKERB2}\:8729 + target_label: instance + replacement: 2 +``` + +{{< info >}} +The above example assumes 2 datacenters, with 2 _sync masters_ & 2 _sync workers_ +per datacenter. You have to replace all `${...}` variables in the above configuration +with applicable values from your environment. +{{< /info >}} + +## Recommended deployment environment + +_Prometheus_ can be a memory & CPU intensive process. It is recommended to keep them +on other machines than used to run the ArangoDB cluster or _ArangoSync_ components. + +Consider these machines to be easily replaceable, unless you configure +alerting on _prometheus_, in which case it is recommended to keep a +close eye on them, such that you do not lose any alerts due to failures +of Prometheus. diff --git a/site/content/arangodb/oem/deploy/arangosync/monitoring.md b/site/content/arangodb/oem/deploy/arangosync/monitoring.md new file mode 100644 index 0000000000..4502b46aac --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/monitoring.md @@ -0,0 +1,90 @@ +--- +title: Monitoring Datacenter-to-Datacenter Replication +menuTitle: Monitoring +weight: 25 +description: >- + Datacenter-to-Datacenter Replication monitoring +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +This section includes information related to the monitoring of the +_Datacenter-to-Datacenter Replication_. + +## Metrics + +_ArangoSync_ (_master_ & _worker_) provide metrics that can be used for monitoring +the _Datacenter-to-Datacenter Replication_ solution. These metrics are available +using the following HTTPS endpoints: + +- GET `/metrics`: Provides metrics in a format supported by Prometheus. +- GET `/metrics.json`: Provides the same metrics in JSON format. + +Both endpoints include help information per metrics. + +{{< info >}} +Both endpoints require authentication. Besides the usual authentication methods +these endpoints are also accessible using a special bearer token specified using the `--monitoring.token` +command line option. +{{< /info >}} + +The Prometheus output (`/metrics`) looks like this: + +``` +... +# HELP arangosync_master_worker_registrations Total number of registrations +# TYPE arangosync_master_worker_registrations counter +arangosync_master_worker_registrations 2 +# HELP arangosync_master_worker_storage Number of times worker info is stored, loaded +# TYPE arangosync_master_worker_storage counter +arangosync_master_worker_storage{kind="",op="save",result="success"} 20 +arangosync_master_worker_storage{kind="empty",op="load",result="success"} 1 +... +``` + +The JSON output (`/metrics.json`) looks like this: + +```json +{ + ... + "arangosync_master_worker_registrations": { + "help": "Total number of registrations", + "type": "counter", + "samples": [ + { + "value": 2 + } + ] + }, + "arangosync_master_worker_storage": { + "help": "Number of times worker info is stored, loaded", + "type": "counter", + "samples": [ + { + "value": 8, + "labels": { + "kind": "", + "op": "save", + "result": "success" + } + }, + { + "value": 1, + "labels": { + "kind": "empty", + "op": "load", + "result": "success" + } + } + ] + } + ... +} +``` + +To get a list of a metrics and their help information, run: + +```bash +alias jq='docker run --rm -i realguess/jq jq' +curl -sk -u "<user>:<password>" https://<syncmaster-IP>:8629/metrics.json | \ + jq 'with_entries({key: .key, value:.value.help})' +``` diff --git a/site/content/arangodb/oem/deploy/arangosync/operations-and-maintenance.md b/site/content/arangodb/oem/deploy/arangosync/operations-and-maintenance.md new file mode 100644 index 0000000000..eca67b19dc --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/operations-and-maintenance.md @@ -0,0 +1,70 @@ +--- +title: DC2DC Replication Operations & Maintenance +menuTitle: Operations & Maintenance +weight: 15 +description: '' +--- +## Operations & Maintenance + +{{< tag "ArangoDB Enterprise Edition" >}} + +ArangoSync is a distributed system with a lot different components. +As with any such system, it requires some, but not a lot of operational +support. + +### What means are available to monitor status + +All of the components of ArangoSync provide means to monitor their status. +Below you'll find an overview per component. + +- Sync master & workers: The `arangosync` servers running as either master + or worker, provide: + - A status API, see `arangosync get status`. Make sure that all statuses report `running`. + For even more detail the following commands are also available: + `arangosync get tasks`, `arangosync get masters` & `arangosync get workers`. + - A log on the standard output. Log levels can be configured using `--log.level` settings. + - A metrics API `GET /metrics`. This API is compatible with Prometheus. + Sample Grafana dashboards for inspecting these metrics are available. + +- ArangoDB cluster: The `arangod` servers that make up the ArangoDB cluster + provide: + - A log file. This is configurable with settings with a `log.` prefix. + E.g. `--log.output=file://myLogFile` or `--log.level=info`. + - A statistics API `GET /_admin/statistics` + +### What to look for while monitoring status + +The very first thing to do when monitoring the status of ArangoSync is to +look into the status provided by `arangosync get status ... -v`. +When not everything is in the `running` state (on both datacenters), this is an +indication that something may be wrong. In case that happens, give it some time +(incremental synchronization may take quite some time for large collections) +and look at the status again. If the statuses do not change (or change, but not reach `running`) +it is time to inspects the metrics & log files. + +When the metrics or logs seem to indicate a problem in a sync master or worker, it is +safe to restart it, as long as only 1 instance is restarted at a time. +Give restarted instances some time to "catch up". + +### 'What if ...' + +Please consult the [troubleshooting section](troubleshooting.md) +for detailed descriptions of what to do in case of certain problems, and how and +what information to provide to support so they can assist you best when needed. + +### Metrics + +ArangoSync (master & worker) provide metrics that can be used for monitoring the ArangoSync +solution. These metrics are available using the following HTTPS endpoints: + +- GET `/metrics`: Provides metrics in a format supported by Prometheus. +- GET `/metrics.json`: Provides the same metrics in JSON format. + +Both endpoints include help information per metrics. + +Note: Both endpoints require authentication. Besides the usual authentication methods +these endpoints are also accessible using a special bearer token specified using the `--monitoring.token` +command line option. + +Consult the [monitoring section](monitoring.md#metrics) +for sample output of the metrics endpoints. diff --git a/site/content/arangodb/oem/deploy/arangosync/security.md b/site/content/arangodb/oem/deploy/arangosync/security.md new file mode 100644 index 0000000000..80428908f4 --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/security.md @@ -0,0 +1,182 @@ +--- +title: Securing Datacenter-to-Datacenter Replication +menuTitle: Security +weight: 20 +description: >- + Firewalls must not block specific ports and you can secure DC2DC setups using + certificates for encryption and authentication +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +## Firewall settings + +The components of _ArangoSync_ use (TCP) network connections to communicate with each other. +Below you'll find an overview of these connections and the TCP ports that should be accessible. + +1. The sync masters must be allowed to connect to the following components + within the same datacenter: + + - ArangoDB Agents and Coordinators (default ports: `8531` and `8529`) + - Sync workers (default port `8729`) + + Additionally the sync masters must be allowed to connect to the sync masters in the other datacenter. + + By default the sync masters will operate on port `8629`. + +1. The sync workers must be allowed to connect to the following components within the same datacenter: + + - ArangoDB Coordinators (default port `8529`) + - Sync masters (default port `8629`) + + By default the sync workers will operate on port `8729`. + +## Certificates + +Digital certificates are used in many places in _ArangoSync_ for both encryption +and authentication. + +In ArangoSync all network connections are using Transport Layer Security (TLS), +a set of protocols that ensure that all network traffic is encrypted. +For this TLS certificates are used. The server side of the network connection +offers a TLS certificate. This certificate is (often) verified by the client side of the network +connection, to ensure that the certificate is signed by a trusted Certificate Authority (CA). +This ensures the integrity of the server. + +In several places additional certificates are used for authentication. In those cases +the client side of the connection offers a client certificate (on top of an existing TLS connection). +The server side of the connection uses the client certificate to authenticate +the client and (optionally) decides which rights should be assigned to the client. + +{{< info >}} +ArangoSync does allow the use of certificates signed by a well know CA (eg. verisign) +however it is more convenient (and common) to use your own CA. +{{< /info >}} + +### Formats + +All certificates are x509 certificates with a public key, a private key and +an optional chain of certificates used to sign the certificate. This chain is +typically provided by the Certificate Authority (CA). +Depending on their use, certificates stored in a different format. + +The following formats are used: + +- Public key only (`.crt`): A file that contains only the public key of + a certificate with an optional chain of parent certificates (public keys of certificates + used to signed the certificate). + + Since this format contains only public keys, it is not a problem if its contents + are exposed. It must still be store it in a safe place to avoid losing it. + +- Private key only (`.key`): A file that contains only the private key of a certificate. + + It is vital to protect these files and store them in a safe place. + +- Keyfile with public & private key (`.keyfile`): A file that contains the public key of + a certificate, an optional chain of parent certificates and a private key. + + Since this format also contains a private key, it is vital to protect these files + and store them in a safe place. + +- Java keystore (`.jks`): A file containing a set of public and private keys. + + It is possible to protect access to the content of this file using a keystore password. + + Since this format can contain private keys, it is vital to protect these files + and store them in a safe place (even when its content is protected with a keystore password). + +### Creating certificates + +ArangoSync provides commands to create all certificates needed. + +#### TLS server certificates + +To create a certificate used for TLS servers in the **keyfile** format, +you need the public key of the CA (`--cacert`), the private key of +the CA (`--cakey`) and one or more hostnames (or IP addresses). +Then run: + +```bash +arangosync create tls keyfile \ + --cacert=my-tls-ca.crt --cakey=my-tls-ca.key \ + --host=<hostname> \ + --keyfile=my-tls-cert.keyfile +``` + +Make sure to store the generated keyfile (`my-tls-cert.keyfile`) in a safe place. + +To create a certificate used for TLS servers in the **crt** & **key** format, +you need the public key of the CA (`--cacert`), the private key of +the CA (`--cakey`) and one or more hostnames (or IP addresses). +Then run: + +```bash +arangosync create tls certificate \ + --cacert=my-tls-ca.crt --cakey=my-tls-ca.key \ + --host=<hostname> \ + --cert=my-tls-cert.crt \ + --key=my-tls-cert.key \ +``` + +Make sure to protect and store the generated files (`my-tls-cert.crt` & `my-tls-cert.key`) in a safe place. + +#### Client authentication certificates + +To create a certificate used for client authentication in the **keyfile** format, +you need the public key of the CA (`--cacert`), the private key of +the CA (`--cakey`) and one or more hostnames (or IP addresses) or email addresses. +Then run: + +```bash +arangosync create client-auth keyfile \ + --cacert=my-client-auth-ca.crt --cakey=my-client-auth-ca.key \ + [--host=<hostname> | --email=<emailaddress>] \ + --keyfile=my-client-auth-cert.keyfile +``` + +Make sure to protect and store the generated keyfile (`my-client-auth-cert.keyfile`) in a safe place. + +#### CA certificates + +To create a CA certificate used to **sign TLS certificates**, run: + +```bash +arangosync create tls ca \ + --cert=my-tls-ca.crt --key=my-tls-ca.key +``` + +Make sure to protect and store both generated files (`my-tls-ca.crt` & `my-tls-ca.key`) in a safe place. + +To create a CA certificate used to **sign client authentication certificates**, run: + +```bash +arangosync create client-auth ca \ + --cert=my-client-auth-ca.crt --key=my-client-auth-ca.key +``` + +Make sure to protect and store both generated files (`my-client-auth-ca.crt` & `my-client-auth-ca.key`) +in a safe place. + +{{< info >}} +CA certificates have a much longer lifetime than normal certificates. +Therefore even more care is needed to store them safely. +{{< /info >}} + +### Renewing certificates + +All certificates have meta information in them the limit their use in function, +target & lifetime. + +- A certificate created for client authentication (function) cannot be used as a + TLS server certificate (same is true for the reverse). +- A certificate for host `myserver` (target) cannot be used for host `anotherserver`. +- A certificate that is valid until October 2017 (lifetime) cannot be used after October 2017. + +If anything changes in function, target or lifetime you need a new certificate. + +The procedure for creating a renewed certificate is the same as for creating a "first" certificate. +After creating the renewed certificate the process(es) using them have to be updated. +This mean restarting them. All ArangoSync components are designed to support stopping and starting +single instances, but do not restart more than 1 instance at the same time. +As soon as 1 instance has been restarted, give it some time to "catch up" before restarting +the next instance. diff --git a/site/content/arangodb/oem/deploy/arangosync/troubleshooting.md b/site/content/arangodb/oem/deploy/arangosync/troubleshooting.md new file mode 100644 index 0000000000..b3c7e3f9e0 --- /dev/null +++ b/site/content/arangodb/oem/deploy/arangosync/troubleshooting.md @@ -0,0 +1,156 @@ +--- +title: Troubleshooting Datacenter-to-Datacenter Replication +menuTitle: Troubleshooting +weight: 30 +description: >- + Procedures for investigating and fixing issues with DC2DC setups +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +The _Datacenter-to-Datacenter Replication_ is a distributed system with a lot +different components. As with any such system, it requires some, but not a lot, +of operational support. + +This section includes information on how to troubleshoot the +_Datacenter-to-Datacenter Replication_. + +## What means are available to monitor status + +All of the components of _ArangoSync_ provide means to monitor their status. +Below you'll find an overview per component. + +- Sync master & workers: The `arangosync` servers running as either master + or worker, provide: + - A status API, see `arangosync get status`. Make sure that all statuses report `running`. + For even more detail the following commands are also available: + `arangosync get tasks`, `arangosync get masters` & `arangosync get workers`. + - A log on the standard output. Log levels can be configured using `--log.level` settings. + - A metrics API `GET /metrics`. This API is compatible with Prometheus. + Sample Grafana dashboards for inspecting these metrics are available. + +- ArangoDB cluster: The `arangod` servers that make up the ArangoDB cluster + provide: + - A log file. This is configurable with settings with a `log.` prefix. + E.g. `--log.output=file://myLogFile` or `--log.level=info`. + - A statistics API `GET /_admin/statistics` + +## What to look for while monitoring status + +The very first thing to do when monitoring the status of ArangoSync is to +look into the status provided by `arangosync get status ... -v`. +When not everything is in the `running` state (on both datacenters), this is an +indication that something may be wrong. In case that happens, give it some time +(incremental synchronization may take quite some time for large collections) +and look at the status again. If the statuses do not change (or change, but not reach `running`) +it is time to inspects the metrics and log files. + +When the metrics or logs seem to indicate a problem in a sync master or worker, it is +safe to restart it, as long as only 1 instance is restarted at a time. +Give restarted instances some time to "catch up". + +## What to do when problems remain + +When a problem remains and restarting masters/workers does not solve the problem, +contact support. Make sure to include provide support with the following information: + +- Output of `arangosync get version ...` on both datacenters. +- Output of `arangosync get status ... -v` on both datacenters. +- Output of `arangosync get tasks ... -v` on both datacenters. +- Output of `arangosync get masters ... -v` on both datacenters. +- Output of `arangosync get workers ... -v` on both datacenters. +- Log files of all components +- A complete description of the problem you observed and what you did to resolve it. + +- How to monitor status of ArangoSync +- How to keep it alive +- What to do in case of failures or bugs + +## What to do when a source datacenter is down + +When you use ArangoSync for backup of your cluster from one datacenter +to another and the source datacenter has a complete outage, you may consider +switching your applications to the target (backup) datacenter. + +This is what you must do in that case: + +1. Stop synchronization using: + + ```bash + arangosync stop sync ... + ``` + When the source datacenter is completely unresponsive this will not succeed. + In that case use: + + ```bash + arangosync abort sync ... + ``` + + See [Stopping synchronization](administration.md#stopping-synchronization) + for how to cleanup the source datacenter when it becomes available again. + +2. Verify that synchronization has completely stopped using: + ```bash + arangosync get status ... -v + ``` + +3. Reconfigure your applications to use the target (backup) datacenter. + +When the original source datacenter is restored, you may switch roles and +make it the target datacenter. To do so, use `arangosync configure sync ...` +as described in [Reversing synchronization direction](administration.md#reversing-synchronization-direction). + +## What to do in case of a planned network outage + +All ArangoSync tasks send out heartbeat messages out to the other datacenter +to indicate "it is still alive". The other datacenter assumes the connection is +"out of sync" when it does not receive any messages for a certain period of time. + +If you're planning some sort of maintenance where you know the connectivity +will be lost for some time (e.g. 3 hours), you can prepare ArangoSync for that +such that it will hold off re-synchronization for a given period of time. + +To do so, on both datacenters, run: + +```bash +arangosync set message timeout \ + --master.endpoint=<endpoints of sync masters in the datacenter> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> \ + 3h +``` + +The last argument is the period that ArangoSync should hold-off resynchronization for. +This can be minutes (e.g. `15m`) or hours (e.g. `3h`). + +If maintenance is taking longer than expected, you can use the same command the extend +the hold-off period (e.g. to `4h`). + +After the maintenance, use the same command restore the hold-off period to its +default of `1h`. + +## What to do in case of a document that exceeds the message queue limits + +{{< info >}} +Starting with ArangoSync version 2.0.0, there is no limitation in terms of +document size anymore. +{{< /info >}} + +If you insert/update a document in a collection and the size of that document +is greater than the maximum message size of your message queue, the collection +will no longer be able to synchronize. It will go into a `failed` state. + +To recover from that, first remove the document from the ArangoDB cluster +in the source datacenter. After that, for each failed shard, run: + +```bash +arangosync reset failed shard \ + --master.endpoint=<endpoints of sync masters in the datacenter> \ + --auth.user=<username used for authentication of this command> \ + --auth.password=<password of auth.user> \ + --database=<name of the database> \ + --collection=<name of the collection> \ + --shard=<index of the shard (starting at 0)> +``` + +After this command, a new set of tasks will be started to synchronize the shard. +It can take some time for the shard to reach `running` state. diff --git a/site/content/arangodb/oem/deploy/architecture/_index.md b/site/content/arangodb/oem/deploy/architecture/_index.md new file mode 100644 index 0000000000..b3e66d336b --- /dev/null +++ b/site/content/arangodb/oem/deploy/architecture/_index.md @@ -0,0 +1,7 @@ +--- +title: ArangoDB Architecture +menuTitle: Architecture +weight: 100 +description: >- + Technical insights into ArangoDB's scalability, sharding, and replication +--- diff --git a/site/content/arangodb/oem/deploy/architecture/data-sharding.md b/site/content/arangodb/oem/deploy/architecture/data-sharding.md new file mode 100644 index 0000000000..6139b13938 --- /dev/null +++ b/site/content/arangodb/oem/deploy/architecture/data-sharding.md @@ -0,0 +1,192 @@ +--- +title: Sharding +menuTitle: Data Sharding +weight: 10 +description: >- + ArangoDB can divide collections into multiple shards to distribute the data + across multiple cluster nodes +--- +ArangoDB organizes its collection data in _shards_. Sharding allows to use +multiple machines to run a cluster of ArangoDB instances that together +constitute a single database system. + +Sharding is used to distribute data across physical machines in an ArangoDB +Cluster. It is a method to determine the optimal placement of documents on +individual DB-Servers. + +This enables you to store much more data, since ArangoDB distributes the data +automatically to the different servers. In many situations one can also reap a +benefit in data throughput, again because the load can be distributed to +multiple machines. + +Using sharding allows ArangoDB to support deployments with large amounts of +data, which would not fit on a single machine. A high rate of write / read +operations or AQL queries can also overwhelm a single servers RAM and disk +capacity. + +There are two main ways of scaling a database system: +- Vertical scaling +- Horizontal scaling + +Vertical scaling scaling means to upgrade to better server hardware (faster +CPU, more RAM / disk). This can be a cost effective way of scaling, because +administration is easy and performance characteristics do not change much. +Reasoning about the behavior of a single machine is also a lot easier than +having multiple machines. However at a certain point larger machines are either +not available anymore or the cost becomes prohibitive. + +Horizontal scaling is about increasing the number of servers. Servers typically +being based on commodity hardware, which is readily available from many +different Cloud providers. The capability of each single machine may not be +high, but the combined the computing power of these machines can be arbitrarily +large. Adding more machines on-demand is also typically easier and more +cost-effective than pre-provisioning a single large machine. Increased +complexity in infrastructure can be managed using modern containerization and +cluster orchestrations tools like [Kubernetes](../kubernetes.md). + +![Cluster Sharding](../../../../images/cluster_sharding.jpg) + +To achieve this ArangoDB splits your dataset into so called _shards_. The number +of shards is something you may choose according to your needs. Proper sharding +is essential to achieve optimal performance. From the outside the process of +splitting the data and assembling it again is fully transparent and as such we +achieve the goals of what other systems call "master-master replication". + +An application may talk to any _Coordinator_ and it automatically figures +out where the data is currently stored when reading or is to be stored +when writing. The information about the _shards_ is shared across all +_Coordinators_ using the _Agency_. + +_Shards_ are configured per _collection_ so multiple _shards_ of data form the +_collection_ as a whole. To determine in which _shard_ the data is to be stored +ArangoDB performs a hash across the values. By default this hash is being +created from the `_key` document attribute. + +Every shard is a local collection on any _DB-Server_, that houses such a shard +as depicted above for our example with 5 shards and 3 replicas. Here, every +leading shard _S1_ through _S5_ is followed each by 2 replicas _R1_ through _R5_. +The collection creation mechanism on ArangoDB _Coordinators_ tries to best +distribute the shards of a collection among the _DB-Servers_. This seems to +suggest, that one shards the data in 5 parts, to make best use of all our +machines. We further choose a replication factor of 3 as it is a reasonable +compromise between performance and data safety. This means, that the collection +creation ideally distributes 15 shards, 5 of which are leaders to each 2 +replicas. This in turn implies, that a complete pristine replication would +involve 10 shards which need to catch up with their leaders. + +Not all use cases require horizontal scalability. In such cases, consider the +[OneShard](../oneshard.md) feature as alternative to flexible sharding. + +## Shard Keys + +ArangoDB uses the specified _shard key_ attributes to determine in which shard +a given document is to be stored. Choosing the right shard key can have +significant impact on your performance can reduce network traffic and increase +performance. + +![Hash Sharding](../../../../images/cluster_sharding_hash.jpg) + +ArangoDB uses consistent hashing to compute the target shard from the given +values (as specified via by the `shardKeys` collection property). The ideal set +of shard keys allows ArangoDB to distribute documents evenly across your shards +and your _DB-Servers_. By default ArangoDB uses the `_key` field as a shard key. +For a custom shard key you should consider a few different properties: + +- **Cardinality**: The cardinality of a set is the number of distinct values + that it contains. A shard key with only _N_ distinct values cannot be hashed + onto more than _N_ shards. Consider using multiple shard keys, if one of your + values has a low cardinality. + +- **Frequency**: Consider how often a given shard key value may appear in + your data. Having a lot of documents with identical shard keys leads + to unevenly distributed data. + +This means that a single shard could become a bottleneck in your cluster. +The effectiveness of horizontal scaling is reduced if most documents end up in +a single shard. Shards are not divisible at this time, so paying attention to +the size of shards is important. + +Consider both frequency and cardinality when picking a shard key, if necessary +consider picking multiple shard keys. + +### Configuring Shards + +The number of _shards_ can be configured at collection creation time, e.g. in +the web interface or via _arangosh_: + +```js +db._create("sharded_collection", {"numberOfShards": 4, "shardKeys": ["country"]}); +``` + +The example above, where `country` has been used as _shardKeys_ can be useful +to keep data of every country in one shard, which would result in better +performance for queries working on a per country base. + +It is also possible to specify multiple `shardKeys`. + +Note however that if you change the shard keys from their default `["_key"]`, +then finding a document in the collection by its primary key involves a request +to every single shard. However this can be mitigated: All CRUD APIs and AQL +support using the shard key values as a lookup hints. Just send them as part +of the update / replace or removal operation, or in case of AQL, that +you use a document reference or an object for the UPDATE, REPLACE or REMOVE +operation which includes the shard key attributes: + +```aql +UPDATE { _key: "123", country: "…" } WITH { … } IN sharded_collection +``` + +If custom shard keys are used, one can no longer prescribe the primary key value of +a new document but must use the automatically generated one. This latter +restriction comes from the fact that ensuring uniqueness of the primary key +would be very inefficient if the user could specify the primary key. + +On which DB-Server in a Cluster a particular _shard_ is kept is undefined. +There is no option to configure an affinity based on certain _shard_ keys. + +For more information on shard rebalancing and administration topics please have +a look in the [Cluster Administration](../cluster/administration.md) section. + +### Indexes On Shards + +Unique indexes on sharded collections are only allowed if the fields used to +determine the shard key are also included in the list of attribute paths for the index: + +| shardKeys | indexKeys | | +|----------:|----------:|------------:| +| a | a | allowed | +| a | b | not allowed | +| a | a, b | allowed | +| a, b | a | not allowed | +| a, b | b | not allowed | +| a, b | a, b | allowed | +| a, b | a, b, c | allowed | +| a, b, c | a, b | not allowed | +| a, b, c | a, b, c | allowed | + +## High Availability + +A cluster can still read from a collection if shards become unavailable for +some reason. The data residing on the unavailable shard cannot be accessed, +but reads on other shards can still succeed. + +If you enable data redundancy by setting a replication factor of `2` or higher +for a collection, the collection data remains fully available for reading as +long as at least one replica of every shard is available. +In a production environment, you should always deploy your collections with a +`replicationFactor` greater than `1` to ensure that the shards stay available +even when a machine fails. + +Collection data also remains available for writing as long as a replica of every +shard is available. You can optionally increase the write concern to require a +higher number of in-sync shard replicas for writes. The `writeConcern` can be +as high as the `replicationFactor`. + +## Storage Capacity + +The cluster distributes your data across multiple machines in your cluster. +Every machine only contains a subset of your data. Thus, the cluster has +the combined storage capacity of all your machines. + +Please note that increasing the replication factor also increases the space +required to keep all your data in the cluster. diff --git a/site/content/arangodb/oem/deploy/architecture/replication.md b/site/content/arangodb/oem/deploy/architecture/replication.md new file mode 100644 index 0000000000..903591e5f0 --- /dev/null +++ b/site/content/arangodb/oem/deploy/architecture/replication.md @@ -0,0 +1,119 @@ +--- +title: Replication +menuTitle: Replication +weight: 20 +description: >- + Replication synchronizes state between different machines, like the data of + different cluster nodes +--- +Replication allows you to *replicate* data onto another machine. It +forms the base of all disaster recovery and failover features ArangoDB +offers. + +ArangoDB offers **synchronous** and **asynchronous** replication. + +Synchronous replication is used between the _DB-Servers_ of an ArangoDB +Cluster. + +Asynchronous replication is used: + +- between the _Leader_ and the _Follower_ of an ArangoDB + [_Active Failover_](../active-failover/_index.md) setup +- between multiple ArangoDB [Data Centers](../arangosync/deployment/_index.md) + (inside the same Data Center replication is synchronous) + +## Synchronous replication + +Synchronous replication only works within an ArangoDB Cluster and is typically +used for mission critical data which must be accessible at all +times. Synchronous replication generally stores a copy of a shard's +data on another DB-Server and keeps it in sync. Essentially, when storing +data after enabling synchronous replication, the Cluster waits for +all replicas to write all the data before green-lighting the write +operation to the client. This naturally increases the latency a +bit, since one more network hop is needed for each write. However, it +enables the cluster to immediately fail over to a replica whenever +an outage is detected, without losing any committed data, and +mostly without even signaling an error condition to the client. + +Synchronous replication is organized such that every _shard_ has a +_leader_ and `r - 1` _followers_, where `r` denotes the **replication factor**. +The replication factor is the total number of copies that are kept, that is, the +leader and follower count combined. For example, with a replication factor of +`3`, there is one _leader_ and `3 - 1 = 2` _followers_. You can control the +number of _followers_ using the `replicationFactor` parameter whenever you +create a _collection_, by setting a `replicationFactor` one higher than the +desired number of followers. You can also adjust the value later. + +You cannot set a `replicationFactor` higher than the number of available +DB-Servers by default. You can bypass the check when creating a collection by +setting the `enforceReplicationFactor` option to `false`. You cannot bypass it +when adjusting the replication factor later. Note that the replication factor +is not decreased but remains the same during a DB-Server node outage. + +In addition to the replication factor, there is a **writeConcern** that +specifies the minimum number of in-sync followers required for write operations. +If you specify the `writeConcern` parameter with a value greater than `1`, the +collection's leader shards are locked down for writing as soon as too few +followers are available. + +## Asynchronous replication + +When using asynchronous replication, _Followers_ connect to a _Leader_ and apply +all the events from the Leader log in the same order locally. As a result, the +_Followers_ end up with the same state of data as the _Leader_. + +_Followers_ are only eventually consistent with the _Leader_. + +Transactions are honored in replication, i.e. transactional write operations +become visible on _Followers_ atomically. + +All write operations are logged to the Leader's _write-ahead log_. Therefore, +asynchronous replication in ArangoDB cannot be used for write-scaling. The main +purposes of this type of replication are to provide read-scalability and +hot standby servers for _Active Failover_ deployments. + +It is possible to connect multiple _Follower_ to the same _Leader_. _Followers_ +should be used as read-only instances, and no user-initiated write operations +should be carried out on them. Otherwise, data conflicts may occur that cannot +be solved automatically, and this makes the replication stop. + +In an asynchronous replication scenario, Followers _pull_ changes +from the _Leader_. _Followers_ need to know to which _Leader_ they should +connect to, but a _Leader_ is not aware of the _Followers_ that replicate from it. +When the network connection between the _Leader_ and a _Follower_ goes down, write +operations on the Leader can continue normally. When the network is up again, _Followers_ +can reconnect to the _Leader_ and transfer the remaining changes. This +happens automatically, provided _Followers_ are configured appropriately. + +### Replication lag + +As described above, write operations are applied first in the _Leader_, and then applied +in the _Followers_. + +For example, let's assume a write operation is executed in the _Leader_ +at point in time _t0_. To make a _Follower_ apply the same operation, it must first +fetch the write operation's data from Leader's write-ahead log, then parse it and +apply it locally. This happens at some point in time after _t0_, let's say _t1_. + +The difference between _t1_ and _t0_ is called the _replication lag_, and it is unavoidable +in asynchronous replication. The amount of replication _lag_ depends on many factors, a +few of which are: + +- the network capacity between the _Followers_ and the _Leader_ +- the load of the _Leader_ and the _Followers_ +- the frequency in which _Followers_ poll the _Leader_ for updates + +Between _t0_ and _t1_, the state of data on the _Leader_ is newer than the state of data +on the _Followers_. At point in time _t1_, the state of data on the _Leader_ and _Followers_ +is consistent again (provided no new data modifications happened on the _Leader_ in +between). Thus, the replication leads to an _eventually consistent_ state of data. + +### Replication overhead + +As the _Leader_ servers are logging any write operation in the _write-ahead-log_ +anyway, replication doesn't cause any extra overhead on the _Leader_. However, it +causes some overhead for the _Leader_ to serve incoming read +requests of the _Followers_. However, returning the requested data is a trivial +task for the _Leader_ and should not result in a notable performance +degradation in production. diff --git a/site/content/arangodb/oem/deploy/architecture/scalability.md b/site/content/arangodb/oem/deploy/architecture/scalability.md new file mode 100644 index 0000000000..758ef58ea9 --- /dev/null +++ b/site/content/arangodb/oem/deploy/architecture/scalability.md @@ -0,0 +1,83 @@ +--- +title: The scalability of ArangoDB and its data models +menuTitle: Scalability +weight: 5 +description: >- + ArangoDB supports scaling horizontally and vertically, and each supported + data model has different properties when scaling to large datasets +--- +## Horizontal and vertical scalability + +ArangoDB is a distributed database system supporting multiple data models, +and can thus be scaled horizontally, that is, by using many servers, +typically based on commodity hardware. This approach not only delivers +performance as well as capacity improvements, but also achieves +resilience by means of replication and automatic fail-over. Furthermore, +you can build systems that scale their capacity dynamically up and down +automatically according to demand. + +You can also scale ArangoDB vertically, that is, by using ever larger and more +powerful servers. There is no built-in limitation in ArangoDB, for example, the +server will automatically use more threads if more CPUs are present. +However, scaling vertically has the disadvantage that the costs grow faster than +linear with the size of the server, and none of the resilience and dynamical +capabilities can be achieved in this way. + +## Key/value pairs + +The key/value store data model is the easiest to scale. In ArangoDB, +this is implemented in the sense that a document collection always has +a primary key `_key` attribute and in the absence of further secondary +indexes the document collection behaves like a simple key/value store. + +The only operations that are possible in this context are single key +lookups and key/value pair insertions and updates. If `_key` is the +only sharding attribute then the sharding is done with respect to the +primary key and all these operations scale linearly. If the sharding is +done using different shard keys, then a lookup of a single key involves +asking all shards and thus does not scale linearly. + +## Document store + +For the document store case even in the presence of secondary indexes +essentially the same arguments apply, since an index for a sharded +collection is simply the same as a local index for each shard. Therefore, +single document operations still scale linearly with the size of the +cluster, unless a special sharding configuration makes lookups or +write operations more expensive. + +## Complex queries and joins + +The AQL query language allows complex queries, using multiple +collections, secondary indexes as well as joins. In particular with +the latter, scaling can be a challenge, since if the data to be +joined resides on different machines, a lot of communication +has to happen. The AQL query execution engine organizes a data +pipeline across the cluster to put together the results in the +most efficient way. The query optimizer is aware of the cluster +structure and knows what data is where and how it is indexed. +Therefore, it can arrive at an informed decision about what parts +of the query ought to run where in the cluster. + +Nevertheless, for certain complicated joins, there are limits as +to what can be achieved. + +## Graph database + +Graph databases are particularly good at queries on graphs that involve +paths in the graph of an a priori unknown length. For example, finding +the shortest path between two vertices in a graph, or finding all +paths that match a certain pattern starting at a given vertex are such +examples. + +However, if the vertices and edges along the occurring paths are +distributed across the cluster, then a lot of communication is +necessary between nodes, and performance suffers. To achieve good +performance at scale, it is therefore necessary to get the +distribution of the graph data across the shards in the cluster +right. Most of the time, the application developers and users of +ArangoDB know best, how their graphs are structured. Therefore, +ArangoDB allows users to specify, according to which attributes +the graph data is sharded. A useful first step is usually to make +sure that the edges originating at a vertex reside on the same +cluster node as the vertex. diff --git a/site/content/arangodb/oem/deploy/cluster/_index.md b/site/content/arangodb/oem/deploy/cluster/_index.md new file mode 100644 index 0000000000..60b256783a --- /dev/null +++ b/site/content/arangodb/oem/deploy/cluster/_index.md @@ -0,0 +1,395 @@ +--- +title: Cluster deployments +menuTitle: Cluster +weight: 15 +description: >- + ArangoDB clusters are comprised of DB-Servers, Coordinators, and Agents, with + synchronous data replication between DB-Servers and automatic failover +--- +The Cluster architecture of ArangoDB is a _CP_ master/master model with no +single point of failure. + +With "CP" in terms of the [CAP theorem](https://en.wikipedia.org/wiki/CAP_theorem) +we mean that in the presence of a +network partition, the database prefers internal consistency over +availability. With "master/master" we mean that clients can send their +requests to an arbitrary node, and experience the same view on the +database regardless. "No single point of failure" means that the cluster +can continue to serve requests, even if one machine fails completely. + +In this way, ArangoDB has been designed as a distributed multi-model +database. This section gives a short outline on the Cluster architecture and +how the above features and capabilities are achieved. + +## Structure of an ArangoDB Cluster + +An ArangoDB Cluster consists of a number of ArangoDB instances +which talk to each other over the network. They play different roles, +which are explained in detail below. + +The current configuration +of the Cluster is held in the _Agency_, which is a highly-available +resilient key/value store based on an odd number of ArangoDB instances +running [Raft Consensus Protocol](https://raft.github.io/). + +For the various instances in an ArangoDB Cluster there are three distinct +roles: + +- _Agents_ +- _Coordinators_ +- _DB-Servers_. + +![ArangoDB Cluster](../../../../images/cluster-topology.png) + +### Agents + +One or multiple _Agents_ form the _Agency_ in an ArangoDB Cluster. The +_Agency_ is the central place to store the configuration in a Cluster. It +performs leader elections and provides other synchronization services for +the whole Cluster. Without the _Agency_ none of the other components can +operate. + +While generally invisible to the outside the _Agency_ is the heart of the +Cluster. As such, fault tolerance is of course a must have for the +_Agency_. To achieve that the _Agents_ are using the +[Raft Consensus Algorithm](https://raft.github.io/). +The algorithm formally guarantees +conflict free configuration management within the ArangoDB Cluster. + +At its core the _Agency_ manages a big configuration tree. It supports +transactional read and write operations on this tree, and other servers +can subscribe to HTTP callbacks for all changes to the tree. + +### Coordinators + +_Coordinators_ should be accessible from the outside. These are the ones +the clients talk to. They coordinate cluster tasks like +executing queries and running Foxx services. They know where the +data is stored and optimize where to run user-supplied queries or +parts thereof. _Coordinators_ are stateless and can thus easily be shut down +and restarted as needed. + +### DB-Servers + +_DB-Servers_ are the ones where the data is actually hosted. They +host shards of data and using synchronous replication a _DB-Server_ may +either be _leader_ or _follower_ for a shard. Document operations are first +applied on the _leader_ and then synchronously replicated to +all followers. + +Shards must not be accessed from the outside but indirectly through the +_Coordinators_. They may also execute queries in part or as a whole when +asked by a _Coordinator_. + +See [Sharding](#sharding) below for more information. + +## Many sensible configurations + +This architecture is very flexible and thus allows many configurations, +which are suitable for different usage scenarios: + + 1. The default configuration is to run exactly one _Coordinator_ and + one _DB-Server_ on each machine. This achieves the classical + master/master setup, since there is a perfect symmetry between the + different nodes, clients can equally well talk to any one of the + _Coordinators_ and all expose the same view to the data store. _Agents_ + can run on separate, less powerful machines. + 2. One can deploy more _Coordinators_ than _DB-Servers_. This is a sensible + approach if one needs a lot of CPU power for the Foxx services, + because they run on the _Coordinators_. + 3. One can deploy more _DB-Servers_ than _Coordinators_ if more data capacity + is needed and the query performance is the lesser bottleneck + 4. One can deploy a _Coordinator_ on each machine where an application + server (e.g. a node.js server) runs, and the _Agents_ and _DB-Servers_ + on a separate set of machines elsewhere. This avoids a network hop + between the application server and the database and thus decreases + latency. Essentially, this moves some of the database distribution + logic to the machine where the client runs. + +As you can see, the _Coordinator_ layer can be scaled and deployed independently +from the _DB-Server_ layer. + +{{< warning >}} +It is a best practice and a recommended approach to run _Agent_ instances +on different machines than _DB-Server_ instances. + +When deploying using the tool [_Starter_](../../components/tools/arangodb-starter/_index.md) +this can be achieved by using the options `--cluster.start-dbserver=false` and +`--cluster.start-coordinator=false` on the first three machines where the _Starter_ +is started, if the desired _Agency_ _size_ is 3, or on the first 5 machines +if the desired _Agency_ _size_ is 5. +{{< /warning >}} + +{{< info >}} +The different instances that form a Cluster are supposed to be run in the same +_Data Center_ (DC), with reliable and high-speed network connection between +all the machines participating to the Cluster. + +Multi-datacenter Clusters, where the entire structure and content of a Cluster located +in a specific DC is replicated to others Clusters located in different DCs, are +possible as well. See [Datacenter-to-Datacenter Replication](../arangosync/deployment/_index.md) +(DC2DC) for further details. +{{< /info >}} + +## Sharding + +Using the roles outlined above an ArangoDB Cluster is able to distribute +data in so called _shards_ across multiple _DB-Servers_. Sharding +allows to use multiple machines to run a cluster of ArangoDB +instances that together constitute a single database. This enables +you to store much more data, since ArangoDB distributes the data +automatically to the different servers. In many situations one can +also reap a benefit in data throughput, again because the load can +be distributed to multiple machines. + +![Cluster Sharding](../../../../images/cluster_sharding.jpg) + +From the outside this process is fully transparent: +An application may talk to any _Coordinator_ and +it automatically figures out where the data is currently stored when reading +or is to be stored when writing. The information about the _shards_ +is shared across all _Coordinators_ using the _Agency_. + +_Shards_ are configured per _collection_ so multiple _shards_ of data form +the _collection_ as a whole. To determine in which _shard_ the data is to +be stored ArangoDB performs a hash across the values. By default this +hash is being created from the document __key_. + +For further information, please refer to the +[_Cluster Sharding_](../architecture/data-sharding.md) section. + +## OneShard + +A OneShard deployment offers a practicable solution that enables significant +performance improvements by massively reducing cluster-internal communication +and allows running transactions with ACID guarantees on shard leaders. + +For more information, please refer to the [OneShard](../oneshard.md) +chapter. + +## Synchronous replication + +In an ArangoDB Cluster, the replication among the data stored by the _DB-Servers_ +is synchronous. + +Synchronous replication works on a per-shard basis. Using the `replicationFactor` +option, you can configure for each _collection_ how many copies of each _shard_ +are kept in the Cluster. + +{{< danger >}} +If a collection has a _replication factor_ of `1`, its data is **not** +replicated to other _DB-Servers_. This exposes you to a risk of data loss, if +the machine running the _DB-Server_ with the only copy of the data fails permanently. + +You need to set the _replication factor_ to a value equal or higher than `2` +to achieve minimal data redundancy via the synchronous replication. + +You need to set a _replication factor_ equal to or higher than `2` +**explicitly** when creating a collection, or you can adjust it later if you +forgot to set it at creation time. You can also enforce a +minimum replication factor for all collections by setting the +[`--cluster.min-replication-factor` startup option](../../components/arangodb-server/options.md#--clustermin-replication-factor). + +When using a Cluster, please make sure all the collections that are important +(and should not be lost in any case) have a _replication factor_ equal or higher +than `2`. +{{< /danger >}} + +At any given time, one of the copies is declared to be the _leader_ and +all other replicas are _followers_. Internally, write operations for this _shard_ +are always sent to the _DB-Server_ which happens to hold the _leader_ copy, +which in turn replicates the changes to all _followers_ before the operation +is considered to be done and reported back to the _Coordinator_. +Internally, read operations are all served by the _DB-Server_ holding the _leader_ copy, +this allows to provide snapshot semantics for complex transactions. + +Using synchronous replication alone guarantees consistency and high availability +at the cost of reduced performance: write requests have a higher latency +(due to every write-request having to be executed on the _followers_) and +read requests do not scale out as only the _leader_ is being asked. + +In a Cluster, synchronous replication is managed by the _Coordinators_ for the client. +The data is always stored on the _DB-Servers_. + +The following example gives you an idea of how synchronous operation +has been implemented in ArangoDB Cluster: + +1. Connect to a _Coordinator_ via [_arangosh_](../../components/tools/arangodb-shell/_index.md) +2. Create a collection: `db._create("test", {"replicationFactor": 2});` +3. The _Coordinator_ figures out a *leader* and one *follower* and creates + one *shard* (as this is the default) +4. Insert data: `db.test.insert({"foo": "bar"});` +5. The _Coordinator_ writes the data to the _leader_, which in turn + replicates it to the _follower_. +6. Only when both are successful, the result is reported indicating success: + + ```json + { + "_id" : "test/7987", + "_key" : "7987", + "_rev" : "7987" + } + ``` + +Synchronous replication comes at the cost of an increased latency for +write operations, simply because there is one more network hop within the +Cluster for every request. Therefore the user can set the _replicationFactor_ +to 1, which means that only one copy of each shard is kept, thereby +switching off synchronous replication. This is a suitable setting for +less important or easily recoverable data for which low latency write +operations matter. + +## Automatic failover + +### Failure of a follower + +If a _DB-Server_ that holds a _follower_ copy of a _shard_ fails, then the _leader_ +can no longer synchronize its changes to that _follower_. After a short timeout +(3 seconds), the _leader_ gives up on the _follower_ and declares it to be +out of sync. + +One of the following two cases can happen: + +- **A**: If another _DB-Server_ (that does not hold a _replica_ for this _shard_ already) + is available in the Cluster, a new _follower_ is automatically + created on this other _DB-Server_ (so the _replication factor_ constraint is + satisfied again). + +- **B**: If no other _DB-Server_ (that does not hold a _replica_ for this _shard_ already) + is available, the service continues with one _follower_ less than the number + prescribed by the _replication factor_. + +If the old _DB-Server_ with the _follower_ copy comes back, one of the following +two cases can happen: + +- Following case **A**, the _DB-Server_ recognizes that there is a new + _follower_ that was elected in the meantime, so it is no longer a _follower_ + for that _shard_. + +- Following case **B**, the _DB-Server_ automatically resynchronizes its + data with the _leader_. The _replication factor_ constraint is now satisfied again + and order is restored. + +### Failure of a leader + +If a _DB-Server_ that holds a _leader_ copy of a shard fails, then the _leader_ +can no longer serve any requests. It no longer sends a heartbeat to +the _Agency_. Therefore, a _supervision_ process running in the _Raft_ _leader_ +of the Agency, can take the necessary action (after 15 seconds of missing +heartbeats), namely to promote one of the _DB-Servers_ that hold in-sync +replicas of the _shard_ to _leader_ for that _shard_. This involves a +reconfiguration in the _Agency_ and leads to the fact that _Coordinators_ +now contact a different _DB-Server_ for requests to this _shard_. Service +resumes. The other surviving _replicas_ automatically resynchronize their +data with the new _leader_. + +In addition to the above, one of the following two cases cases can happen: + +- **A**: If another _DB-Server_ (that does not hold a _replica_ for this _shard_ already) + is available in the Cluster, a new _follower_ is automatically + created on this other _DB-Server_ (so the _replication factor_ constraint is + satisfied again). + +- **B**: If no other _DB-Server_ (that does not hold a _replica_ for this _shard_ already) + is available the service continues with one _follower_ less than the number + prescribed by the _replication factor_. + +When the _DB-Server_ with the original _leader_ copy comes back, it recognizes +that a new _leader_ was elected in the meantime, and one of the following +two cases can happen: + +- Following case **A**, since also a new _follower_ was created and + the _replication factor_ constraint is satisfied, the _DB-Server_ is no + longer a _follower_ for that _shard_. + +- Following case **B**, the _DB-Server_ notices that it now holds + a _follower_ _replica_ of that _shard_ and it resynchronizes its data with the + new _leader_. The _replication factor_ constraint is satisfied again, + and order is restored. + +The following example gives you an idea of how _failover_ +has been implemented in ArangoDB Cluster: + +1. The _leader_ of a _shard_ (let's name it _DBServer001_) is going down. +2. A _Coordinator_ is asked to return a document: `db.test.document("100069");` +3. The _Coordinator_ determines which server is responsible for this document + and finds _DBServer001_ +4. The _Coordinator_ tries to contact _DBServer001_ and timeouts because it is + not reachable. +5. After a short while, the _supervision_ (running in parallel on the _Agency_) + sees that _heartbeats_ from _DBServer001_ are not coming in +6. The _supervision_ promotes one of the _followers_ (say _DBServer002_), that + is in sync, to be _leader_ and makes _DBServer001_ a _follower_. +7. As the _Coordinator_ continues trying to fetch the document, it sees that + the _leader_ changed to _DBServer002_ +8. The _Coordinator_ tries to contact the new _leader_ (_DBServer002_) and returns + the result: + ```json + { + "_key" : "100069", + "_id" : "test/100069", + "_rev" : "513", + "foo" : "bar" + } + ``` +9. After a while the _supervision_ declares _DBServer001_ to be completely dead. +10. A new _follower_ is determined from the pool of _DB-Servers_. +11. The new _follower_ syncs its data from the _leader_ and order is restored. + +Please note that there may still be timeouts. Depending on when exactly +the request has been done (in regard to the _supervision_) and depending +on the time needed to reconfigure the Cluster the _Coordinator_ might fail +with a timeout error. + +## Shard movement and resynchronization + +All _shard_ data synchronizations are done in an incremental way, such that +resynchronizations are quick. This technology allows to move shards +(_follower_ and _leader_ ones) between _DB-Servers_ without service interruptions. +Therefore, an ArangoDB Cluster can move all the data on a specific _DB-Server_ +to other _DB-Servers_ and then shut down that server in a controlled way. +This allows to scale down an ArangoDB Cluster without service interruption, +loss of fault tolerance or data loss. Furthermore, one can re-balance the +distribution of the _shards_, either manually or automatically. + +All these operations can be triggered via a REST/JSON API or via the +graphical web interface. All fail-over operations are completely handled within +the ArangoDB Cluster. + +## Microservices and zero administration + +The design and capabilities of ArangoDB are geared towards usage in +modern microservice architectures of applications. With the +[Foxx services](../../develop/foxx-microservices/_index.md) it is very easy to deploy a data +centric microservice within an ArangoDB Cluster. + +In addition, one can deploy multiple instances of ArangoDB within the +same project. One part of the project might need a scalable document +store, another might need a graph database, and yet another might need +the full power of a multi-model database actually mixing the various +data models. There are enormous efficiency benefits to be reaped by +being able to use a single technology for various roles in a project. + +To simplify life of the _devops_ in such a scenario we try as much as +possible to use a _zero administration_ approach for ArangoDB. A running +ArangoDB Cluster is resilient against failures and essentially repairs +itself in case of temporary failures. + +## Deployment + +An ArangoDB Cluster can be deployed in several ways, e.g. by manually +starting all the needed instances, by using the tool +[_Starter_](../../components/tools/arangodb-starter/_index.md), in Docker and in Kubernetes. + +See the [Cluster Deployment](deployment/_index.md) +chapter for instructions. + +ArangoDB is also available as a cloud service, the +[**Arango Managed Platform (AMP)**](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). + +## Cluster ID + +Every ArangoDB instance in a Cluster is assigned a unique +ID during its startup. Using its ID, a node is identifiable +throughout the Cluster. All cluster operations communicate +via this ID. diff --git a/site/content/arangodb/oem/deploy/cluster/administration.md b/site/content/arangodb/oem/deploy/cluster/administration.md new file mode 100644 index 0000000000..0329c973e5 --- /dev/null +++ b/site/content/arangodb/oem/deploy/cluster/administration.md @@ -0,0 +1,336 @@ +--- +title: Administrate ArangoDB cluster deployments +menuTitle: Administration +weight: 10 +description: '' +--- +This section includes information related to the administration of an ArangoDB Cluster. + +For a general introduction to the ArangoDB Cluster, please refer to the +[Cluster](_index.md) chapter. + +There is also a detailed +[Cluster Administration Course](https://www.arangodb.com/learn/operations/cluster-course/) +for download. + +## Enabling synchronous replication + +For an introduction about _Synchronous Replication_ in Cluster, please refer +to the [_Cluster Architecture_](_index.md#synchronous-replication) section. + +You can enable synchronous replication per _collection_. When you create a +_collection_, you may specify the number of _replicas_ using the +`replicationFactor` parameter. You can also adjust it later. The default value +is set to `1`, which effectively *disables* synchronous replication among +_DB-Servers_. + +{{< tip >}} +The number of replicas includes the leader (the master copy) as well as all the +followers (redundancy copies). For example, a replication factor of `3` means +that there is one leader replica and two follower replicas, and that the data +exists three times in total. +{{< /tip >}} + +Whenever you specify a _replication factor_ greater than `1`, synchronous +replication is activated for this collection. The Cluster determines suitable +_leaders_ and _followers_ for every requested _shard_ (`numberOfShards`) within +the Cluster. + +An example of creating a collection in _arangosh_ with a replication factor of +`3`, requiring three replicas to report success for any write operation in this +collection: + +```js +db._create("test", { "replicationFactor": 3 }) +``` + +The `replicationFactor` value can be between the minimum and maximum +replication factor (inclusive) as defined by the following startup options: + +- [`--cluster.min-replication-factor`](../../components/arangodb-server/options.md#--clustermin-replication-factor) +- [`--cluster.max-replication-factor`](../../components/arangodb-server/options.md#--clustermax-replication-factor) + +The default replication factor for regular and for system collections is defined +by the following startup options: + +- [`--cluster.default-replication-factor`](../../components/arangodb-server/options.md#--clusterdefault-replication-factor) +- [`--cluster.system-replication-factor`](../../components/arangodb-server/options.md#--clustersystem-replication-factor) + +## Preparing growth + +You may create a _collection_ with a higher _replication factor_ than +available _DB-Servers_. When additional _DB-Servers_ become available, +the _shards_ are automatically replicated to the newly available _DB-Servers_. + +You need to set the `enforceReplicationFactor` option to `false` when creating +a _collection_ with a higher _replication factor_ than available _DB-Servers_ +(the default value is `true`). For example, in _arangosh_ you can pass +a third argument to the `db._create()` method with this option: + +```js +db._create("test", { replicationFactor: 4 }, { enforceReplicationFactor: false }); +``` + +This option is not available in the web interface. + +{{< info >}} +Multiple _replicas_ of the same _shard_ can never coexist on the same +_DB-Server_ instance. +{{< /info >}} + +## Sharding + +For an introduction about _Sharding_ in Cluster, please refer to the +[_Cluster Sharding_](../architecture/data-sharding.md) section. + +Number of _shards_ can be configured at _collection_ creation time, e.g. the UI, +or the _ArangoDB Shell_: + +```js +db._create("sharded_collection", {"numberOfShards": 4}); +``` + +To configure a custom _hashing_ for another attribute (default is __key_): + +```js +db._create("sharded_collection", {"numberOfShards": 4, "shardKeys": ["country"]}); +``` + +The example above, where 'country' has been used as _shardKeys_ can be useful +to keep data of every country in one shard, which would result in better +performance for queries working on a per country base. + +It is also possible to specify multiple `shardKeys`. + +Note however that if you change the shard keys from their default `["_key"]`, +then finding a document in the collection by its primary key involves a request +to every single shard. However this can be mitigated: All CRUD APIs and AQL +support taking the shard keys as a lookup hint. Just make sure that the shard +key attributes are present in the documents you send, or in case of AQL, that +you use a document reference or an object for the UPDATE, REPLACE or REMOVE +operation which includes the shard key attributes: + +```aql +FOR doc IN sharded_collection + FILTER doc._key == "123" + UPDATE doc WITH { … } IN sharded_collection +``` + +```aql +UPDATE { _key: "123", country: "…" } WITH { … } IN sharded_collection +``` + +Using a string with just the document key as key expression instead is +processed without shard hints and thus perform slower: + +```aql +UPDATE "123" WITH { … } IN sharded_collection +``` + +If custom shard keys are used, you can no longer specify the primary key value +for a new document, but must let the server generate one automatically. This +restriction comes from the fact that ensuring uniqueness of the primary key +would be very inefficient if the user could specify the document key. +If custom shard keys are used, trying to store documents with the primary key value +(`_key` attribute) set results in a runtime error ("must not specify _key +for this collection"). + +Unique indexes on sharded collections are only allowed if the fields used to +determine the shard key are also included in the list of attribute paths for the index: + +| shardKeys | indexKeys | | +|----------:|----------:|------------:| +| a | a | allowed | +| a | b | not allowed | +| a | a, b | allowed | +| a, b | a | not allowed | +| a, b | b | not allowed | +| a, b | a, b | allowed | +| a, b | a, b, c | allowed | +| a, b, c | a, b | not allowed | +| a, b, c | a, b, c | allowed | + +On which DB-Server in a Cluster a particular _shard_ is kept is undefined. +There is no option to configure an affinity based on certain _shard_ keys. + +## Sharding strategy + +Strategy to use for the collection. There are +different sharding strategies to select from when creating a new +collection. The selected `shardingStrategy` value remains +fixed for the collection and cannot be changed afterwards. This is +important to make the collection keep its sharding settings and +always find documents already distributed to shards using the same +initial sharding algorithm. + +The available sharding strategies are: +- `community-compat`: default sharding used by ArangoDB + Community Edition before version 3.4 +- `enterprise-compat`: default sharding used by ArangoDB + Enterprise Edition before version 3.4 +- `enterprise-smart-edge-compat`: default sharding used by smart edge + collections in ArangoDB Enterprise Edition before version 3.4 +- `hash`: default sharding used for new collections starting from version 3.4 + (excluding smart edge collections) +- `enterprise-hash-smart-edge`: default sharding used for new + smart edge collections starting from version 3.4 +- `enterprise-hex-smart-vertex`: sharding used for vertex collections of + EnterpriseGraphs + +If no sharding strategy is specified, the default is `hash` for +all normal collections, `enterprise-hash-smart-edge` for all smart edge +collections, and `enterprise-hex-smart-vertex` for EnterpriseGraph +vertex collections (the latter two require the Enterprise Edition of ArangoDB). +Manually overriding the sharding strategy does not yet provide a +benefit, but it may later in case other sharding strategies are added. + +The [OneShard](../oneshard.md) +feature does not have its own sharding strategy, it uses `hash` instead. + +## Moving/Rebalancing *shards* + +Rebalancing redistributes resources in the cluster to optimize resource +allocation - shards and location of leaders/followers. + +It aims to achieve, for example, a balanced load, fair shard distribution, +and resiliency. + +Rebalancing might occur, amongst other scenarios, when: +- There is a change in the number of nodes in the cluster and more (or fewer) + resources are available to the cluster. +- There is a detectable imbalance in the distribution of shards + (i.e. specific nodes holding high number of shards while others don’t) or in + the distribution of leaders/followers across the nodes, resulting in + computational imbalance on the nodes. +- There are changes in the number or size of data collections. + +A _shard_ can be moved from a _DB-Server_ to another, and the entire shard distribution +can be rebalanced using the corresponding buttons in the web [UI](../../components/web-interface/cluster.md). + +You can also do any of the following by using the API: +- Calculate the current cluster imbalance. +- Compute a set of move shard operations to improve balance. +- Execute the given set of move shard operations. +- Compute a set of move shard operations to improve balance and immediately execute them. + +For more information, see the [Cluster](../../develop/http-api/cluster.md#get-the-current-cluster-imbalance) +section of the HTTP API documentation. + +## Replacing/Removing a *Coordinator* + +_Coordinators_ are effectively stateless and can be replaced, added and +removed without more consideration than meeting the necessities of the +particular installation. + +To take out a _Coordinator_ stop the +_Coordinator_'s instance by issuing `kill -SIGTERM <pid>`. + +About 15 seconds later, the cluster UI on any other _Coordinator_ marks +the _Coordinator_ in question as failed. Almost simultaneously, the recycle bin +icon appears to the right of the name of the _Coordinator_. Clicking +that icon removes the _Coordinator_ from the Coordinator registry. + +Any new _Coordinator_ instance that is informed of where to find any/all +Agent(s), `--cluster.agency-endpoint` `<some agent endpoint>` is +integrated as a new _Coordinator_ into the cluster. You may also just +restart the _Coordinator_ as before and it reintegrates itself into +the cluster. + +## Replacing/Removing a *DB-Server* + +_DB-Servers_ are where the data of an ArangoDB cluster is stored. They +do not publish a web interface and are not meant to be accessed by any other +entity than _Coordinators_ to perform client requests or other _DB-Servers_ +to uphold replication and resilience. + +The clean way of removing a _DB-Server_ is to first relieve it of all +its responsibilities for shards. This applies to _followers_ as well as +_leaders_ of shards. The requirement for this operation is that no +collection in any of the databases has a `replicationFactor` greater than +the current number of _DB-Servers_ minus one. In other words, the highest +replication factor must not exceed the future _DB-Server_ count. To clean +out `DBServer004`, for example, you can issue the following command to +any _Coordinator_ in the cluster: + +`curl <coord-ip:coord-port>/_admin/cluster/cleanOutServer -d '{"server":"DBServer004"}'` + +After the _DB-Server_ has been cleaned out, you find the recycle bin +icon to the right of the name of the _DB-Server_ on any _Coordinators_' +UI. Clicking it removes the _DB-Server_ in question from the +cluster. + +Firing up any _DB-Server_ from a clean data directory, while specifying any +of the available Agency endpoints, integrates the new _DB-Server_ into the +cluster. + +To distribute shards onto the new _DB-Server_, go to the **Rebalance Shards** +tab in the **NODES** page of the web interface and click the +**Rebalance Shards** button. + +The clean out process can be monitored using the following script, +which periodically prints the amount of shards that still need to be moved. +It is basically a countdown to when the process finishes. + +Save the code below to a file named `serverCleanMonitor.js`: + +```js +var dblist = db._databases(); +var internal = require("internal"); +var arango = internal.arango; + +var server = ARGUMENTS[0]; +var sleep = ARGUMENTS[1] | 0; + +if (!server) { + print("\nNo server name specified. Provide it like:\n\narangosh <options> -- DBServerXXXX"); + process.exit(); +} + +if (sleep <= 0) sleep = 10; +console.log("Checking shard distribution every %d seconds...", sleep); + +var count; +do { + count = 0; + for (dbase in dblist) { + var sd = arango.GET("/_db/" + dblist[dbase] + "/_admin/cluster/shardDistribution"); + var collections = sd.results; + for (collection in collections) { + var current = collections[collection].Current; + for (shard in current) { + if (current[shard].leader == server) { + ++count; + } + } + } + } + console.log("Shards to be moved away from node %s: %d", server, count); + if (count == 0) break; + internal.wait(sleep); +} while (count > 0); +``` + +This script has to be executed in [`arangosh`](../../components/tools/arangodb-shell/_index.md) +by issuing the following command: + +```bash +arangosh --server.username <username> --server.password <password> --javascript.execute <path/to/serverCleanMonitor.js> -- DBServer<number> +``` + +The output should be similar to the one below: + +```bash +arangosh --server.username root --server.password pass --javascript.execute ~./serverCleanMonitor.js -- DBServer0002 +[7836] INFO Checking shard distribution every 10 seconds... +[7836] INFO Shards to be moved away from node DBServer0002: 9 +[7836] INFO Shards to be moved away from node DBServer0002: 4 +[7836] INFO Shards to be moved away from node DBServer0002: 1 +[7836] INFO Shards to be moved away from node DBServer0002: 0 +``` + +The current status is logged every 10 seconds. You may adjust the +interval by passing a number after the DB-Server name, e.g. +`arangosh <options> -- DBServer0002 60` for every 60 seconds. + +Once the count is `0`, all shards of the underlying DB-Server have been moved +and the `cleanOutServer` process has finished. diff --git a/site/content/arangodb/oem/deploy/cluster/deployment/_index.md b/site/content/arangodb/oem/deploy/cluster/deployment/_index.md new file mode 100644 index 0000000000..5d6d6232f2 --- /dev/null +++ b/site/content/arangodb/oem/deploy/cluster/deployment/_index.md @@ -0,0 +1,96 @@ +--- +title: Cluster Deployment +menuTitle: Deployment +weight: 5 +description: '' +--- +You can deploy an ArangoDB cluster in different ways: + +- [Using the ArangoDB Starter](using-the-arangodb-starter.md) +- [Manual Start](manual-start.md) +- [Kubernetes](../../kubernetes.md) +- [Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic), + fully managed, available on AWS and GCP + +## Preliminary Information For Debian/Ubuntu Systems + +### Use a different configuration file for the Cluster instance + +The configuration file used for the standalone instance is +`/etc/arangodb3/arangod.conf` (on Linux), and you should use a different one for +the cluster instance(s). If you are using the _Starter_ binary `arangodb`, that is +automatically the case. Otherwise, you might have to copy the configuration +somewhere else and pass it to your `arangod` cluster instance via +`--configuration`. + +### Use a different data directory for the standalone instance + +The data directory is configured in `arangod.conf`: + +```conf +[database] +directory = /var/lib/arangodb3 +``` + +You have to make sure that the Cluster instance uses a different data directory +as the standalone instance. If that is not already the case, change the +`database.directory` entry in `arangod.conf` as seen above to a different +directory + +```conf +# in arangod.conf: +[database] +directory = /var/lib/arangodb3.standalone +``` + +and create it with the correct permissions: + +```bash +$ mkdir -vp /var/lib/arangodb3.standalone +$ chown -c arangodb:arangodb /var/lib/arangodb3.standalone +$ chmod -c 0700 /var/lib/arangodb3.standalone +``` + +### Use a different socket for the standalone instance + +The standalone instance must use a different socket, i.e. it cannot use the +same port on the same network interface than the Cluster. For that, change the +standalone instance's port in `/etc/arangodb3/arangod.conf` + +```conf +[server] +endpoint = tcp://127.0.0.1:8529 +``` + +to something unused, e.g. + +```conf +[server] +endpoint = tcp://127.1.2.3:45678 +``` +. + +### Use a different *init* script for the Cluster instance + +This section applies to SystemV-compatible init systems (e.g. sysvinit, OpenRC, +upstart). The steps are different for systemd. + +The package install scripts use the default _init_ script `/etc/init.d/arangodb3` +(on Linux) to stop and start ArangoDB during the installation. If you are using +an _init_ script for your Cluster instance, make sure it is named differently. +In addition, the installation might overwrite your _init_ script otherwise. + +If you have previously changed the default _init_ script, move it out of the way + +```bash +$ mv -vi /etc/init.d/arangodb3 /etc/init.d/arangodb3.cluster +``` + +and add it to the _autostart_; how this is done depends on your distribution and +_init_ system. On older Debian and Ubuntu systems, you can use `update-rc.d`: + +```bash +$ update-rc.d arangodb3.cluster defaults +``` + +Make sure your _init_ script uses a different `PIDFILE` than the default script! diff --git a/site/content/arangodb/oem/deploy/cluster/deployment/manual-start.md b/site/content/arangodb/oem/deploy/cluster/deployment/manual-start.md new file mode 100644 index 0000000000..aa1cf30b38 --- /dev/null +++ b/site/content/arangodb/oem/deploy/cluster/deployment/manual-start.md @@ -0,0 +1,385 @@ +--- +title: Start an ArangoDB cluster manually +menuTitle: Manual Start +weight: 5 +description: '' +--- +An ArangoDB Cluster consists of several running _tasks_ or _processes_ which +form the Cluster. + +This section describes how to start a Cluster by manually starting all the needed +processes. + +Before continuing, be sure to read the [Architecture](../_index.md) +section to get a basic understanding of the underlying architecture and the involved +roles in an ArangoDB Cluster. + +We will include commands for a local test (all processes running on a single machine) +and for a more real production scenario, which makes use of 3 different machines. + +## Local Tests + +In this paragraph we will include commands to manually start a Cluster with 3 _Agents_, +2 _DB-Servers_ and 2 _Coordinators_. + +We will assume that all processes runs on the same machine (127.0.0.1). Such scenario +should be used for testing only. + +### Local Test Agency + +To start up an _Agency_ you first have to activate it. This is done by providing +the option `--agency.activate true`. + +To start up the _Agency_ in its fault tolerant mode set the `--agency.size` to `3`. +You will then have to start at least 3 _Agents_ before the _Agency_ will start operation. + +During initialization the _Agents_ have to find each other. To do so provide at +least one common `--agency.endpoint`. The _Agents_ will then coordinate startup +themselves. They will announce themselves with their external address which may be +specified using `--agency.my-address`. This is required in bridged docker setups +or NATed environments. + +So in summary these are the commands to start an _Agency_ of size 3: + +``` +arangod --server.endpoint tcp://0.0.0.0:5001 \ + --agency.my-address=tcp://127.0.0.1:5001 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://127.0.0.1:5001 \ + --agency.supervision true \ + --database.directory agent1 & + +arangod --server.endpoint tcp://0.0.0.0:5002 \ + --agency.my-address=tcp://127.0.0.1:5002 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://127.0.0.1:5001 \ + --agency.supervision true \ + --database.directory agent2 & + +arangod --server.endpoint tcp://0.0.0.0:5003 \ + --agency.my-address=tcp://127.0.0.1:5003 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://127.0.0.1:5001 \ + --agency.supervision true \ + --database.directory agent3 & +``` + +### Local Test DB-Servers and Coordinators + +These two roles share a common set of relevant options. First you should specify +the role using `--cluster.my-role`. This can either be `PRIMARY` (a DB-Server) +or `COORDINATOR`. Note that `DBSERVER` is allowed as an alias +for `PRIMARY` as well. Furthermore please provide the external endpoint (IP and port) +of the process via `--cluster.my-address`. + +The following is a full example of what it might look like. + +**DB-Servers:** + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:6001 \ + --cluster.my-address tcp://127.0.0.1:6001 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://127.0.0.1:5001 \ + --cluster.agency-endpoint tcp://127.0.0.1:5002 \ + --cluster.agency-endpoint tcp://127.0.0.1:5003 \ + --database.directory dbserver1 & + +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:6002 \ + --cluster.my-address tcp://127.0.0.1:6002 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://127.0.0.1:5001 \ + --cluster.agency-endpoint tcp://127.0.0.1:5002 \ + --cluster.agency-endpoint tcp://127.0.0.1:5003 \ + --database.directory dbserver2 & +``` + +**Coordinators:** + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:7001 \ + --cluster.my-address tcp://127.0.0.1:7001 \ + --cluster.my-role COORDINATOR \ + --cluster.agency-endpoint tcp://127.0.0.1:5001 \ + --cluster.agency-endpoint tcp://127.0.0.1:5002 \ + --cluster.agency-endpoint tcp://127.0.0.1:5003 \ + --database.directory coordinator1 & +``` + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:7002 \ + --cluster.my-address tcp://127.0.0.1:7002 \ + --cluster.my-role COORDINATOR \ + --cluster.agency-endpoint tcp://127.0.0.1:5001 \ + --cluster.agency-endpoint tcp://127.0.0.1:5002 \ + --cluster.agency-endpoint tcp://127.0.0.1:5003 \ + --database.directory coordinator2 & +``` + +Note in particular that the endpoint descriptions given under `--cluster.my-address` +and `--cluster.agency-endpoint` must not use the IP address `0.0.0.0` because they +must contain an actual address that can be routed to the corresponding server. The +`0.0.0.0` in `--server.endpoint` simply means that the server binds itself to all +available network devices with all available IP addresses. + +Upon registering with the _Agency_ during startup the Cluster will assign an _ID_ +to every server. The generated _ID_ will be printed out to the log or can be accessed +via the HTTP API by calling `http://server-address/_admin/server/id`. + +You have now launched an ArangoDB Cluster and can contact its _Coordinators_ (and +their corresponding web interface) at the endpoint `tcp://127.0.0.1:7001` and `tcp://127.0.0.1:7002`. + +## Multiple Machines + +The method from the previous paragraph can be extended to a more real production scenario, +to start an ArangoDB Cluster on multiple machines. The only changes are that one +has to replace all local addresses `127.0.0.1` by the actual IP address of the +corresponding server. Obviously, it would no longer be necessary to use different port numbers +on different servers. + +Let's assume that you want to start your ArangoDB Cluster with 3 _Agents_, 3 _DB-Servers_ +and 3 _Coordinators_ on three different machines with IP addresses: + +``` +192.168.1.1 +192.168.1.2 +192.168.1.3 +``` + +Let's also suppose that each of the above machines runs an _Agent_, a _DB-Server_ +and a _Coordinator_ + +If we use: + +- _8531_ as port of the _Agents_ +- _8530_ as port of the _DB-Servers_ +- _8529_ as port of the _Coordinators_ + +then the commands you have to use are reported in the following subparagraphs. + +### Agency + +On 192.168.1.1: + +``` +arangod --server.endpoint tcp://0.0.0.0:8531 \ + --agency.my-address tcp://192.168.1.1:8531 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.supervision true \ + --database.directory agent +``` + +On 192.168.1.2: + +``` +arangod --server.endpoint tcp://0.0.0.0:8531 \ + --agency.my-address tcp://192.168.1.2:8531 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.supervision true \ + --database.directory agent +``` + +On 192.168.1.3: + +``` +arangod --server.endpoint tcp://0.0.0.0:8531 \ + --agency.my-address tcp://192.168.1.3:8531 \ + --server.authentication false \ + --agency.activate true \ + --agency.size 3 \ + --agency.endpoint tcp://192.168.1.1:8531 \ + --agency.endpoint tcp://192.168.1.2:8531 \ + --agency.endpoint tcp://192.168.1.3:8531 \ + --agency.supervision true \ + --database.directory agent +``` + +### DB-Servers + +On 192.168.1.1: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8530 \ + --cluster.my-address tcp://192.168.1.1:8530 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory dbserver & +``` + +On 192.168.1.2: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8530 \ + --cluster.my-address tcp://192.168.1.2:8530 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory dbserver & +``` + +On 192.168.1.3: + +``` +sudo arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8530 \ + --cluster.my-address tcp://192.168.1.3:8530 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory dbserver & +``` + +### Coordinators + +On 192.168.1.1: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8529 \ + --cluster.my-address tcp://192.168.1.1:8529 \ + --cluster.my-role COORDINATOR \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory coordinator & +``` + +On 192.168.1.2: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8529 \ + --cluster.my-address tcp://192.168.1.2:8529 \ + --cluster.my-role COORDINATOR \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory coordinator & +``` + +On 192.168.1.3: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8529 \ + --cluster.my-address tcp://192.168.1.3:8529 \ + --cluster.my-role COORDINATOR \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory coordinator & +``` + +**Note:** in the above commands, you can use host names, if they can be resolved, +instead of IP addresses. + +**Note 2:** you can easily extend the Cluster, by adding more machines which run +a _DB-Server_ and a _Coordiantor_. For instance, if you have an additional forth +machine with IP 192.168.1.4, you can execute the following commands + +On 192.168.1.4: + +``` +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8530 \ + --cluster.my-address tcp://192.168.4.1:8530 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory dbserver & + +arangod --server.authentication=false \ + --server.endpoint tcp://0.0.0.0:8529 \ + --cluster.my-address tcp://192.168.1.4:8529 \ + --cluster.my-role COORDINATOR \ + --cluster.agency-endpoint tcp://192.168.1.1:8531 \ + --cluster.agency-endpoint tcp://192.168.1.2:8531 \ + --cluster.agency-endpoint tcp://192.168.1.3:8531 \ + --database.directory coordinator & +``` + +## Manual Start in Docker + +Manually starting a Cluster via Docker is basically the same as described in the +paragraphs above. + +A bit of extra care has to be invested due to the way in which Docker isolates its network. +By default it fully isolates the network and by doing so an endpoint like `--server.endpoint tcp://0.0.0.0:8530` +will only bind to all interfaces inside the Docker container which does not include +any external interface on the host machine. This may be sufficient if you just want +to access it locally but in case you want to expose it to the outside you must +facilitate Dockers port forwarding using the `-p` command line option. Be sure to +check the [official Docker documentation](https://docs.docker.com/engine/reference/run/). + +You can simply use the `-p` flag in Docker to make the individual processes available on the host +machine or you could use Docker's [links](https://docs.docker.com/engine/reference/run/) +to enable process intercommunication. + +An example configuration might look like this: + +``` +docker run -e ARANGO_NO_AUTH=1 -p 192.168.1.1:10000:8530 arangodb/arangodb arangod \ + --server.endpoint tcp://0.0.0.0:8530 \ + --cluster.my-address tcp://192.168.1.1:10000 \ + --cluster.my-role DBSERVER \ + --cluster.agency-endpoint tcp://192.168.1.1:9001 \ + --cluster.agency-endpoint tcp://192.168.1.2:9001 \ + --cluster.agency-endpoint tcp://192.168.1.3:9001 +``` + +This will start a _DB-Server_ within a Docker container with an isolated network. +Within the Docker container it will bind to all interfaces (this will be 127.0.0.1:8530 +and some internal Docker IP on port 8530). By supplying `-p 192.168.1.1:10000:8530` +we are establishing a port forwarding from our local IP (192.168.1.1 port 10000 in +this example) to port 8530 inside the container. Within the command we are telling +_arangod_ how it can be reached from the outside `--cluster.my-address tcp://192.168.1.1:10000`. +This information will be forwarded to the _Agency_ so that the other processes in +your Cluster can see how this particular _DB-Server_ may be reached. + +### Authentication + +To start the official Docker container you will have to decide on an authentication +method, otherwise the container will not start. + +Provide one of the arguments to Docker as an environment variable. There are three +options: + +1. ARANGO_NO_AUTH=1 + + Disable authentication completely. Useful for local testing or for operating + in a trusted network (without a public interface). + +2. ARANGO_ROOT_PASSWORD=password + + Start ArangoDB with the given password for root. + +3. ARANGO_RANDOM_ROOT_PASSWORD=1 + + Let ArangoDB generate a random root password. + +For an in depth guide about Docker and ArangoDB please check the official documentation: +[hub.docker.com/r/arangodb/arangodb/](https://hub.docker.com/r/arangodb/arangodb/). +Note that we are using the image `arangodb/arangodb` here which is always the most current one. +There is also the "official" one called `arangodb` whose documentation is here: +[hub.docker.com/\_/arangodb/](https://hub.docker.com/_/arangodb/) diff --git a/site/content/arangodb/oem/deploy/cluster/deployment/using-the-arangodb-starter.md b/site/content/arangodb/oem/deploy/cluster/deployment/using-the-arangodb-starter.md new file mode 100644 index 0000000000..6439552c82 --- /dev/null +++ b/site/content/arangodb/oem/deploy/cluster/deployment/using-the-arangodb-starter.md @@ -0,0 +1,251 @@ +--- +title: Create an ArangoDB cluster Using the ArangoDB Starter +menuTitle: Using the ArangoDB Starter +weight: 10 +description: '' +--- +This section describes how to start a Cluster using the [_Starter_](../../../components/tools/arangodb-starter/_index.md) +tool (the `arangodb` executable). + +As a precondition you should create a _secret_ to activate authentication. +The _Starter_ provides a handy functionality to generate such a file: + +```bash +arangodb create jwt-secret --secret=arangodb.secret +``` + +Set appropriate privilege on the generated _secret_ file, e.g. on Linux: + +```bash +chmod 400 arangodb.secret +``` + +Also see [Security](../../../components/tools/arangodb-starter/security.md) for instructions of how to +create certificates and tokens needed to secure an ArangoDB deployment. + +## Local test cluster + +If you want to start a local test cluster quickly, you can run a single +_Starter_ with the `--starter.local` argument. It starts a 3 "machine" cluster +on your local computer within the context of a single starter process: + +```bash +arangodb --starter.local --starter.data-dir=./localdata --auth.jwt-secret=/etc/arangodb.secret +``` + +Please adapt the path to your _secret_ file accordingly. + +{{< warning >}} +A local cluster is intended for test purposes only. It does not provide +resilience and high availability! +{{< /warning >}} + +When you restart the Starter, it remembers the original `--starter.local` flag. + +## Multiple machines + +An ArangoDB cluster typically involves three machines. ArangoDB must be +installed on all of them. + +You need to copy the _secret_ file to every machine. +Then run the ArangoDB Starter like this on host A (adapt the path to your +_secret_ file accordingly): + +```bash +arangodb --auth.jwt-secret=/etc/arangodb.secret --starter.data-dir=./data +``` + +This uses port 8528 to wait for other Starters and the nodes they manage. +Three Agent nodes are needed for a resilient Agency, which is the default number, +and the Starters wait for Agent nodes to form the Agency. + +Run the following command on host B and C (replace `A` with the host name or +IP address of the host): + +```bash +arangodb --auth.jwt-secret=/etc/arangodb.secret --starter.data-dir=./data --starter.join A +``` + +The `--server.join` option is for pointing a Starter to an existing Starter. +If you run Starters on ports other than the default (`8528`) using the +`--starter.port` option, then you need to append the port to the address +(e.g. `--starter.join 127.0.0.1:9528`). + +The latter two Starters contact the Starter on host A on port 8528 and register +themselves. From the moment on when three have joined, each fires up an Agent, a +Coordinator, and a DB-Server. + +Once all the processes started by the _Starter_ are up and running, and joined the +cluster (this may take a while depending on your system), the _Starter_ informs +you where to connect to the cluster from a browser, shell, or program. + +Additional servers can be added in the same way. For example, on host D, you run +the above command pointing to the Starter that runs on `A` (or on `B` or `C`, as +long as they are connected to `A`). This adds another DB-Server and Coordinator, +but no fourth Agent, as the default Agency size (`--cluster.agency-size`) of `3` +is already reached. To only add a DB-Server, use `--cluster.start-coordinator false`. +To only add a Coordinator, use `--cluster.start-dbserver false`. + +You can also set both `--cluster.start-dbserver` and `--cluster.start-coordinator` +to `false` for the first three Starters to only create the Agency. This lets you +run the Agents on specific machines. Later, you can add the DB-Servers and +Coordinators to the cluster using other machines. + +The Starter uses the next few ports above the Starter port for the cluster nodes. +That is, if you use port 8528 for the Starter, the Coordinator uses 8529 +(=8528+1), the DB-Server 8530 (=8528+2), and the Agent 8531 (=8528+3). +You can change the default Starter port with the +[`--starter.port` option](../../../components/tools/arangodb-starter/options.md). + +If two or more of the `arangodb` instances run on the same machine, +you have to use the `--starter.data-dir` option to let each use a different +directory. + +The Starter tries to find the ArangoDB executable (`arangod`) and the +other installation files automatically. If this fails, use the +`--server.arangod` and `--server.js-dir` options to manually point it to them. + +For a full list of options of the _Starter_, see the +[Starter options](../../../components/tools/arangodb-starter/options.md). + +## Using multiple join arguments + +It is allowed to use multiple `--starter.join` arguments. +This eases scripting. For example, you can run a command like below on hosts +A, B, and C (replace `A`, `B`, and `C` with the host names): + +```bash +arangodb ... --starter.join A,B,C +``` + +Note: `arangodb --starter.join A,B,C` is equal to +`arangodb --starter.join A --starter.join B --starter.join C`. + +During the bootstrap phase of the cluster, the Starters all choose the leader +Starter ("master") based on the list of the given `--starter.join` arguments. + +The leader Starter is chosen as follows: + +- If there are no `--starter.join` arguments, the Starter becomes the leader. +- If there are multiple `--starter.join` arguments, these arguments are sorted. + If a Starter is the first in this sorted list, it becomes the leader. +- In all other cases, the Starter becomes a follower. + +Note: Once the bootstrap phase is over (all `arangod` processes have started and +are running), the bootstrap phase ends and the Starters use the ArangoDB Agency +to elect a leader for the runtime phase. + +## Using the ArangoDB Starter in Docker + +The _Starter_ can also be used to launch clusters based on ArangoDB +_Docker_ containers. + +If you use `arangodb` in a Docker container, it runs all servers in a Docker +using the `arangodb/arangodb:latest` Docker image by default. If you wish to run +a specific Docker image for the servers, specify it using the `--docker.image` +option. + +If you use Docker, it is important to care about the volume mappings on +the container. Typically, you start the executable in Docker with the following +commands: + +```bash +export IP=<IP of docker host> +docker volume create arangodb1 +docker run -it --name=adb1 --rm -p 8528:8528 \ + -v arangodb1:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + arangodb/arangodb-starter \ + --starter.address=$IP \ + --docker.net-mode=default +``` + +If you are running on Linux, it is also possible to use a host-mapped volume +instead of creating a Docker volume. Make sure to map it to `/data`. + +To run the other instances, adjust the volume and container names and +additionally specify the join address of the first instance (replace `N` with +the respective number and `A` with the host address): + +```bash +export IP=<IP of docker host> +docker volume create arangodbN +docker run -it --name=adbN --rm -p 8528:8528 \ + -v arangodbN:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + arangodb/arangodb-starter \ + --starter.address=$IP \ + --starter.join A \ + --docker.net-mode=default +``` + +If you use the Enterprise Edition Docker image, you have to set the license key +in an environment variable by adding this option to the above `docker` command +(place `<the-key>` with the actual license key): + +``` + -e ARANGO_LICENSE_KEY=<the-key> +``` + +The Starter hands the license key to the Docker containers it launches for ArangoDB. + +You can get a free evaluation license key by visiting: + +[www.arangodb.com/download-arangodb-enterprise/](https://www.arangodb.com/download-arangodb-enterprise/) + +**TLS verified Docker services** + +Oftentimes, one needs to harden Docker services using client certificate +and TLS verification. The Docker API allows subsequently only certified access. +As the ArangoDB starter starts the ArangoDB cluster instances using this Docker API, +it is mandatory that the ArangoDB starter is deployed with the proper certificates +handed to it, so that the above command is modified as follows: + +```bash +export IP=<IP of docker host> +export DOCKER_CERT_PATH=/path/to/certificate +docker volume create arangodbN +docker run -it --name=adbN --rm -p 8528:8528 \ + -v arangodbN:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $DOCKER_CERT_PATH:$DOCKER_CERT_PATH \ + -e DOCKER_TLS_VERIFY=1 \ + -e DOCKER_CERT_PATH=$DOCKER_CERT_PATH \ + arangodb/arangodb-starter \ + --starter.address=$IP \ + --docker.net-mode=default +``` + +Note that the environment variables `DOCKER_TLS_VERIFY` and `DOCKER_CERT_PATH` +as well as the additional mountpoint containing the certificate have been added above. +The assignment of `DOCKER_CERT_PATH` is optional, in which case it +is mandatory that the certificates are stored in `$HOME/.docker`. So +the command would then be as follows: + +```bash +export IP=<IP of docker host> +docker volume create arangodbN +docker run -it --name=adbN --rm -p 8528:8528 \ + -v arangodbN:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /path/to/cert:/root/.docker \ + -e DOCKER_TLS_VERIFY=1 \ + arangodb/arangodb-starter \ + --starter.address=$IP \ + --docker.net-mode=default +``` + +## Under the Hood + +The first `arangodb` you run becomes the _leader_ of your _Starter_ setup +(also called _master_), the other `arangodb` instances become the +_followers_ of your _Starter_ setup. This is not to be confused with the +Leader/Follower replication of ArangoDB. The terms above refer to the _Starter_ setup. + +The _Starter_ _leader_ determines which ArangoDB server processes to launch on which +_Starter_ _follower_, and how they should communicate. + +It then launches the server processes and monitors them. Once it has detected +that the setup is complete, you get the prompt. + +The _Starter_ _leader_ saves the setup for subsequent starts. diff --git a/site/content/arangodb/oem/deploy/cluster/limitations.md b/site/content/arangodb/oem/deploy/cluster/limitations.md new file mode 100644 index 0000000000..5fd0ebb727 --- /dev/null +++ b/site/content/arangodb/oem/deploy/cluster/limitations.md @@ -0,0 +1,25 @@ +--- +title: Limitations of ArangoDB cluster deployments +menuTitle: Limitations +weight: 15 +description: '' +--- +ArangoDB has no built-in limitations to horizontal scalability. The +central resilient _Agency_ will easily sustain hundreds of _DB-Servers_ +and _Coordinators_, and the usual database operations work completely +decentrally and do not require assistance of the _Agency_. + +Likewise, the supervision process in the _Agency_ can easily deal +with lots of servers, since all its activities are not performance +critical. + +Obviously, an ArangoDB Cluster is limited by the available resources +of CPU, memory, disk and network bandwidth and latency. + +Moreover, high numbers of databases, collections, and shards come at a cost. +An ArangoDB Enterprise Edition cluster can sustain up to a few thousand +databases, and a database can sustain up to a thousand collections, but the +total number of shards in the cluster should not go beyond 50,000 or so. +Beyond these limits, certain regular cleanup and maintenance operations can take +too long for a smooth operational experience. The Community Edition comes +without guarantees regarding the database, collection, and shard count. diff --git a/site/content/arangodb/oem/deploy/in-the-cloud.md b/site/content/arangodb/oem/deploy/in-the-cloud.md new file mode 100644 index 0000000000..e9aedb0b1b --- /dev/null +++ b/site/content/arangodb/oem/deploy/in-the-cloud.md @@ -0,0 +1,47 @@ +--- +title: Deploying ArangoDB in the cloud +menuTitle: In the Cloud +weight: 35 +description: '' +--- +## Deploying ArangoDB on AWS + +ArangoDB can be deployed on AWS or other cloud platforms. AWS is the +infrastructure provider choice for some of the largest ArangoDB installations. + +Up to and including ArangoDB 3.2, official ArangoDB AMI were available in the +[AWS marketplace](https://aws.amazon.com/marketplace/search/results/ref=dtl_navgno_search_box?page=1&searchTerms=arangodb). +Such AMIs are not being maintained anymore, though. However, deploying on AWS +is still possible, and again, a quite common scenario. + +After having initialized your preferred AWS instance with one of the ArangoDB supported +operating systems, using the ArangoDB Starter, performing a Manual Deployment, or using +Kubernetes are all valid options to deploy on AWS. + +{{< info >}} +In order to deploy on AWS, general guidelines like using a fast, **direct-attached** +SSD disk for the data directory of the ArangoDB processes apply. + +We recommend [EC2 I3 instances](https://aws.amazon.com/ec2/instance-types/i3/) +and to use **io1** storage rather than **gp2** on AWS, which are specifically +designed with higher IOPS demands of databases in mind. Note that replication by +itself generates a manifold of the incoming write load in the back end. Also see the +[AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html). +{{< /info >}} + +## Deploying ArangoDB on Microsoft Azure + +ArangoDB can be deployed on Azure or other cloud platforms. Deploying on a cloud +provider is common choice and many of the most big ArangoDB installation are running +on the cloud. + +No Azure-specific scripts or tools are needed to deploy on Azure. Deploying on Azure +is still possible, and again, a quite common scenario. + +After having initialized your preferred Azure instance, with one of the ArangoDB supported +operating systems, using the ArangoDB Starter, performing a Manual Deployment,or using +Kubernetes are all valid options to deploy on Azure. + +**Important:** In order to deploy on Azure, general guidelines, like using a fast, +**direct-attached**, SSD disk for the data directory of the ArangoDB processes +apply. diff --git a/site/content/arangodb/oem/deploy/kubernetes.md b/site/content/arangodb/oem/deploy/kubernetes.md new file mode 100644 index 0000000000..3b26b71dcf --- /dev/null +++ b/site/content/arangodb/oem/deploy/kubernetes.md @@ -0,0 +1,25 @@ +--- +title: ArangoDB Kubernetes Operator +menuTitle: Kubernetes +weight: 30 +description: >- + The ArangoDB Kubernetes Operator (`kube-arangodb`) is a set of operators that + you can deploy in your Kubernetes cluster +aliases: + - cluster/deployment/kubernetes +--- +The Kubernetes operator lets you do the following: + +- Manage deployments of the ArangoDB database +- Manage backups +- Provide `PersistentVolumes` on local storage of your nodes for optimal storage performance +- Configure ArangoDB Datacenter-to-Datacenter Replication + +Continue with [Using the ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/using-the-operator) +to learn how to install the ArangoDB Kubernetes operator and create your first +deployment. + +You can find information about troubleshooting, CustomResource references, and +other details in the [kube-arangodb documentation](https://arangodb.github.io/kube-arangodb/docs/). + +Also check the [production readiness state](https://arangodb.github.io/kube-arangodb/#production-readiness-state). diff --git a/site/content/arangodb/oem/deploy/oneshard.md b/site/content/arangodb/oem/deploy/oneshard.md new file mode 100644 index 0000000000..743836841b --- /dev/null +++ b/site/content/arangodb/oem/deploy/oneshard.md @@ -0,0 +1,320 @@ +--- +title: OneShard cluster deployments +menuTitle: OneShard +weight: 20 +description: >- + The OneShard feature offers a practicable solution that enables significantly + improved performance and transactional guarantees for cluster deployments +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +The OneShard option for ArangoDB clusters restricts all collections of a +database to a single shard so that every collection has `numberOfShards` set to `1`, +and all leader shards are placed on one DB-Server node. This way, whole queries +can be pushed to and executed on that server, massively reducing cluster-internal +communication. The Coordinator only gets back the final result. + +Queries are always limited to a single database, and with the data of a whole +database on a single node, the OneShard option allows running transactions with +ACID guarantees on shard leaders. + +Collections can have replicas by setting a `replicationFactor` greater than `1` +as usual. For each replica, the follower shards are all placed on one DB-Server +node when using the OneShard option. This allows for a quick failover in case +the DB-Server with the leader shards fails. + +A OneShard setup is highly recommended for most graph use cases and join-heavy +queries. + +{{< info >}} +For graphs larger than what fits on a single DB-Server node, you can use the +[SmartGraphs](../graphs/smartgraphs/_index.md) feature to efficiently limit the +network hops between Coordinator and DB-Servers. +{{< /info >}} + +Without the OneShard feature query processing works as follows in a cluster: + +- The Coordinator accepts and analyzes the query. +- If collections are accessed then the Coordinator distributes the accesses + to collections to different DB-Servers that hold parts (shards) of the + collections in question. +- This distributed access requires network-traffic from Coordinator to + DB-Servers and back from DB-Servers to Coordinators and is therefore + expensive. + +Another cost factor is the memory and CPU time required on the Coordinator +when it has to process several concurrent complex queries. In such +situations Coordinators may become a bottleneck in query processing, +because they need to send and receive data on several connections, build up +results for collection accesses from the received parts followed by further +processing. + +![OneShard vs. Sharded Cluster Setup](../../../images/cluster-sharded-oneshard.png) + +If the database involved in a query is a OneShard database, +then the OneShard optimization can be applied to run the query on the +responsible DB-Server node like on a single server. However, it still being +a cluster setup means collections can be replicated synchronously to ensure +resilience etc. + +### How to use the OneShard feature + +The OneShard feature is enabled by default if you use the ArangoDB +Enterprise Edition and if the database is sharded as `"single"`. In this case the +optimizer rule `cluster-one-shard` is applied automatically. +There are two ways to achieve this: + +- If you want your entire cluster to be a OneShard deployment, use the + [startup option](../components/arangodb-server/options.md#cluster) + `--cluster.force-one-shard`. It sets the immutable `sharding` database + property to `"single"` for all newly created databases, which in turn + enforces the OneShard conditions for collections that are created in it. + The `_graphs` system collection is used for `distributeShardsLike`. + +- For individual OneShard databases, set the `sharding` database property to `"single"` + to enforce the OneShard condition. The `_graphs` system collection is used for + `distributeShardsLike`. It is not possible to change the `sharding` database + property afterwards or overwrite this setting for individual collections. + For non-OneShard databases the value of the `sharding` database property is + either `""` or `"flexible"`. + +{{< info >}} +The prototype collection does not only control the sharding, but also the +replication factor for all collections which follow its example. If the +`_graphs` system collection is used for `distributeShardsLike`, then the +replication factor can be adjusted by changing the `replicationFactor` +property of the `_graphs` collection (affecting this and all following +collections) or via the startup option `--cluster.system-replication-factor` +(affecting all system collections and all following collections). +{{< /info >}} + +**Example** + +The easiest way to make use of the OneShard feature is to create a database +with the extra option `{ sharding: "single" }`. As done in the following +example: + +```js +arangosh> db._createDatabase("oneShardDB", { sharding: "single" } ) + +arangosh> db._useDatabase("oneShardDB") + +arangosh@oneShardDB> db._properties() +{ + "id" : "6010005", + "name" : "oneShardDB", + "isSystem" : false, + "sharding" : "single", + "replicationFactor" : 1, + "writeConcern" : 1, + "path" : "" +} +``` + +Now you can go ahead and create a collection as usual: + +```js +arangosh@oneShardDB> db._create("example1") + +arangosh@oneShardDB> db.example1.properties() +{ + "isSmart" : false, + "isSystem" : false, + "waitForSync" : false, + "shardKeys" : [ + "_key" + ], + "numberOfShards" : 1, + "keyOptions" : { + "allowUserKeys" : true, + "type" : "traditional" + }, + "replicationFactor" : 2, + "minReplicationFactor" : 1, + "writeConcern" : 1, + "distributeShardsLike" : "_graphs", + "shardingStrategy" : "hash", + "cacheEnabled" : false +} +``` + +As you can see, the `numberOfShards` is set to `1` and `distributeShardsLike` +is set to `_graphs`. These attributes have automatically been set +because the `{ "sharding": "single" }` options object was +specified when creating the database. + +To do this manually for individual collections, use `{ "sharding": "flexible" }` +on the database level and then create a collection in the following way: + +```js +db._create("example2", { "numberOfShards": 1 , "distributeShardsLike": "_graphs" }) +``` + +Here, the `_graphs` collection is used again, but any other existing +collection that has not been created with the `distributeShardsLike` +option itself can be used as well in a flexibly sharded database. + +### Running Queries + +For this arangosh example, first insert a few documents into a collection, +then create a query and explain it to inspect the execution plan. + +```js +arangosh@oneShardDB> for (let i = 0; i < 10000; i++) { db.example.insert({ "value" : i }); } + +arangosh@oneShardDB> q = "FOR doc IN @@collection FILTER doc.value % 2 == 0 SORT doc.value ASC LIMIT 10 RETURN doc"; + +arangosh@oneShardDB> db._explain(q, { "@collection" : "example" }) + +Query String (88 chars, cacheable: true): + FOR doc IN @@collection FILTER doc.value % 2 == 0 SORT doc.value ASC LIMIT 10 RETURN doc + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 2 EnumerateCollectionNode DBS 10000 - FOR doc IN example /* full collection scan, 1 shard(s) */ FILTER ((doc.`value` % 2) == 0) /* early pruning */ + 5 CalculationNode DBS 10000 - LET #3 = doc.`value` /* attribute expression */ /* collections used: doc : example */ + 6 SortNode DBS 10000 - SORT #3 ASC /* sorting strategy: constrained heap */ + 7 LimitNode DBS 10 - LIMIT 0, 10 + 9 RemoteNode COOR 10 - REMOTE + 10 GatherNode COOR 10 - GATHER + 8 ReturnNode COOR 10 - RETURN doc + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 move-calculations-up + 2 move-filters-up + 3 move-calculations-up-2 + 4 move-filters-up-2 + 5 cluster-one-shard + 6 sort-limit + 7 move-filters-into-enumerate + +``` + +As it can be seen in the explain output, almost the complete query is +executed on the DB-Server (`DBS` for nodes 1-7) and only 10 documents are +transferred to the Coordinator. In case you do the same with a collection +that consists of several shards, you get a different result: + +```js +arangosh> db._createDatabase("shardedDB") + +arangosh> db._useDatabase("shardedDB") + +arangosh@shardedDB> db._properties() +{ + "id" : "6010017", + "name" : "shardedDB", + "isSystem" : false, + "sharding" : "flexible", + "replicationFactor" : 1, + "writeConcern" : 1, + "path" : "" +} + +arangosh@shardedDB> db._create("example", { numberOfShards : 5}) + +arangosh@shardedDB> for (let i = 0; i < 10000; i++) { db.example.insert({ "value" : i }); } + +arangosh@shardedDB> db._explain(q, { "@collection" : "example" }) + +Query String (88 chars, cacheable: true): + FOR doc IN @@collection FILTER doc.value % 2 == 0 SORT doc.value ASC LIMIT 10 RETURN doc + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 2 EnumerateCollectionNode DBS 10000 - FOR doc IN example /* full collection scan, 5 shard(s) */ FILTER ((doc.`value` % 2) == 0) /* early pruning */ + 5 CalculationNode DBS 10000 - LET #3 = doc.`value` /* attribute expression */ /* collections used: doc : example */ + 6 SortNode DBS 10000 - SORT #3 ASC /* sorting strategy: constrained heap */ + 11 RemoteNode COOR 10000 - REMOTE + 12 GatherNode COOR 10000 - GATHER #3 ASC /* parallel, sort mode: heap */ + 7 LimitNode COOR 10 - LIMIT 0, 10 + 8 ReturnNode COOR 10 - RETURN doc + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 move-calculations-up + 2 move-filters-up + 3 move-calculations-up-2 + 4 move-filters-up-2 + 5 scatter-in-cluster + 6 distribute-filtercalc-to-cluster + 7 distribute-sort-to-cluster + 8 remove-unnecessary-remote-scatter + 9 sort-limit + 10 move-filters-into-enumerate + 11 parallelize-gather +``` + +{{< tip >}} +It can be checked whether the OneShard feature is active or not by +inspecting the explain output. If the list of rules contains +`cluster-one-shard`, then the feature is active for the given query. +{{< /tip >}} + +Without the OneShard feature all documents potentially have to be sent to +the Coordinator for further processing. With this simple query this is actually +not true, because some other optimizations are performed that reduce the number +of documents. But still, a considerable amount of documents has to be +transferred from DB-Server to Coordinator only to apply a `LIMIT` of 10 +documents there. The estimate for the *RemoteNode* is 10,000 in this example, +whereas it is 10 in the OneShard case. + +### ACID Transactions on Leader Shards + +ArangoDB's transactional guarantees are tunable. For transactions to be ACID +on the leader shards in a cluster, a few things need to be considered: + +- The AQL query or [Stream Transaction](../develop/http-api/transactions/stream-transactions.md) + must be eligible for the OneShard optimization, so that it is executed on a + single DB-Server node. +- To ensure durability, enable `waitForSync` on query level to wait until data + modifications have been written to disk. +- The collection option `writeConcern: 2` makes sure that a transaction is only + successful if at least one follower shard is in sync with the leader shard, + for a total of two shard replicas. +- The RocksDB storage engine uses intermediate commits for larger document + operations carried out by standalone AQL queries + (outside of JavaScript Transactions and Stream Transactions). + This potentially breaks the atomicity of transactions. To prevent + this for individual queries you can increase `intermediateCommitSize` + (default 512 MB) and `intermediateCommitCount` accordingly as query option. + Also see [Known limitations for AQL queries](../aql/fundamentals/limitations.md#storage-engine-properties). + +### Limitations + +The OneShard optimization is used automatically for all eligible AQL queries +and Stream Transactions. + +For AQL queries, any of the following factors currently makes a query +unsuitable for the OneShard optimization: + +- The query accesses collections with more than a single shard, different leader + DB-Servers, or different `distributeShardsLike` prototype collections +- The query writes into a SatelliteCollection +- The query accesses an edge collection of a SmartGraph +- Usage of AQL functions that can only execute on Coordinators. + These functions are: + - `APPLY` + - `CALL` + - `COLLECTION_COUNT` + - `COLLECTIONS` + - `CURRENT_DATABASE` + - `CURRENT_USER` + - `FULLTEXT` + - `NEAR` + - `SCHEMA_GET` + - `SCHEMA_VALIDATE` + - `V8` + - `VERSION` + - `WITHIN` + - `WITHIN_RECTANGLE` + - User-defined AQL functions (UDFs) diff --git a/site/content/arangodb/oem/deploy/production-checklist.md b/site/content/arangodb/oem/deploy/production-checklist.md new file mode 100644 index 0000000000..2e6cb18613 --- /dev/null +++ b/site/content/arangodb/oem/deploy/production-checklist.md @@ -0,0 +1,100 @@ +--- +title: ArangoDB Production Checklist +menuTitle: Production Checklist +weight: 45 +description: >- + Important steps to perform before you go live with ArangoDB deployments +--- +The following checklist can help to understand if important steps +have been performed on your production system before you go live. + +## Operating System + +- Executed the OS optimization scripts if you run ArangoDB on Linux. + See [Installing ArangoDB on Linux](../operations/installation/linux/_index.md) and its sub pages + [Linux Operating System Configuration](../operations/installation/linux/operating-system-configuration.md) and + [Linux OS Tuning Script Examples](../operations/installation/linux/linux-os-tuning-script-examples.md) for details. + +- OS monitoring is in place + (most common metrics, e.g. disk, CPU, RAM utilization). + +- Disk space monitoring is in place. Consider setting up alerting to avoid out-of-disk situations. + +## ArangoDB + +- The user _root_ is not used to run any ArangoDB processes + (if you run ArangoDB on Linux). + +- The _arangod_ (server) process and the _arangodb_ (_Starter_) process + (if in use) have some form of logging enabled and logs can easily be + located and inspected. + +- *Memory considerations* + - If you run multiple processes (e.g. DB-Server and Coordinator) on a single + machine, adjust the [`ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY`](../components/arangodb-server/environment-variables.md) + environment variable accordingly. + - For versions prior to 3.8, make sure to change the + [`--query.memory-limit`](../components/arangodb-server/options.md#--querymemory-limit) + query option according to the node size and workload. + - Disable swap space to avoid slowdown which can result in servers being incorrectly + detected as failed. + +- Ensure ArangoDB will be automatically restarted (e.g. by using a systemd service file). Typically + you would use the Kubernetes operator or use systemd to launch the _Starter_. + +- If you use the _Starter_ to deploy, you stopped - and disabled + automated start of - the ArangoDB _Single Instance_, e.g. on Ubuntu: + + ``` + service arangodb3 stop + update-rc.d -f arangodb3 remove + ``` + + On Windows in a command prompt with elevated rights: + + ``` + sc config arangodb start= disabled + sc stop arangodb + ``` + +- If you have deployed a Cluster, the _replication factor_ and + _minimal_replication_factor_ of your collections + are set to a value equal or higher than 2, otherwise you run the risk of + losing data in case of a node failure. See + [cluster startup options](../components/arangodb-server/options.md#cluster). + +- *Disk Performance considerations* + - Verify that your **storage performance** is at least 100 IOPS for each + volume in production mode. This is the bare minimum and it's recommended to + provide more for performance. It is probably only a concern if you use a + cloud infrastructure. Note that IOPS might be allotted based on a volume size, + so make sure to check your storage provider for details. Furthermore, you should + be careful with burst mode guarantees as ArangoDB requires a sustainable + high IOPS rate. + + - The considerations should be given to an IO bandwidth (especially considering + RocksDB write-amplification which can easily be 10x or more). + +- Whenever possible use **block storage**. Database data is based on append + operations, so filesystem which support this should be used for best + performance. We would not recommend to use NFS for performance reasons, + furthermore we experienced some issues with hard links required for + Hot Backup. + +- Verify your **Backup** and restore procedures are working. + +- Consider enabling [Encryption at Rest](../operations/security/encryption-at-rest.md) + (Enterprise Edition only). Make sure to safely store any secret keys you + create for this. + +- Monitor the ArangoDB provided metrics (e.g. by using Prometheus/Grafana). + +## Kubernetes Operator (kube-arangodb) + +- Check [supported versions](https://github.com/arangodb/kube-arangodb#production-readiness-state) + for Kubernetes, operator and supported Kubernetes distributions. + +- The [**ReclaimPolicy**](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming) + of your persistent volumes should be set to `Retain` to prevent volumes from premature deletion. + +- Use native networking whenever possible to reduce delays. diff --git a/site/content/arangodb/oem/deploy/single-instance-vs-cluster.md b/site/content/arangodb/oem/deploy/single-instance-vs-cluster.md new file mode 100644 index 0000000000..7367bc7f8c --- /dev/null +++ b/site/content/arangodb/oem/deploy/single-instance-vs-cluster.md @@ -0,0 +1,168 @@ +--- +title: Single instance vs. Cluster deployments +menuTitle: Single instance vs. Cluster +weight: 40 +description: >- + Similarities and differences in behavior between single servers and clusters +--- +In general, a single server configuration and a cluster configuration +of ArangoDB behave very similarly. However, there are differences due to +the different nature of these setups. This can lead to a discrepancy in behavior +between these two configurations. A summary of potential differences follows. + +## Migrating from a *Single Instance* to a *Cluster* + +To migrate from a _Single Instance_ to a _Cluster_ you will need +to take a backup from the _Single Instance_ and restore it into +the _Cluster_ with the tools [_arangodump_](../components/tools/arangodump/_index.md) +and [_arangorestore_](../components/tools/arangorestore/_index.md). + +{{< warning >}} +If you have developed your application using a _Single Instance_ +and you would like to use a _Cluster_ now, before upgrading your production +system please test your application with the _Cluster_ first. + +If both your _Single Instance_ and _Cluster_ are running on the same +machine, they should have distinct data directories. It is not possible +to start a _Cluster_ on the data directory of a _Single Instance_. +{{< /warning >}} + +## Locking and dead-lock prevention + +In a single server configuration all data is local and dead-locks can +easily be detected. In a cluster configuration data is distributed to +many servers and some conflicts cannot be detected easily. Therefore +we have to do some things (like locking shards) sequentially and in a +strictly predefined order, to avoid dead-locks in this way by design. + +## Document Keys + +In a cluster the *autoincrement* key generator is supported for single-sharded +collections. It cannot be used for collections with more than one shard. + +## Indexes + +### Unique constraints + +There are restrictions on the allowed unique constraints in a cluster. +Any unique constraint which cannot be checked locally on a per shard +basis is not allowed in a cluster setup. More concretely, unique +constraints in a cluster are only allowed in the following situations: + + - there is always a unique constraint on the primary key `_key`, if + the collection is not sharded by `_key`, then `_key` must be + automatically generated by the database and cannot be prescribed by + the client + - the collection has only one shard, in which case the same unique + constraints are allowed as in the single instance case + - if the collection is sharded by exactly one other attribute than + `_key`, then there can be a unique constraint on that attribute + +These restrictions are imposed, because otherwise checking for a unique +constraint violation would involve checking with all shards, which would have +a considerable performance impact. + +## Renaming + +It is not possible to rename collections or views in a cluster. + +## AQL + +The AQL syntax for single server and cluster is identical. However, +there is one additional requirement (regarding *with*) and possible +performance differences. + +### WITH + +The `WITH` keyword in AQL must be used to declare which collections +are used in the AQL. For most AQL requires the required collections +can be deduced from the query itself. However, with traversals this is +not possible, if edge collections are used directly. See +[AQL WITH operation](../aql/high-level-operations/with.md) +for details. The `WITH` statement is not necessary when using named graphs +for the traversals. + +There is a `--query.require-with` startup option +to make single server installations also require the `WITH` statements +in the same places where are cluster installation would. This option +is false by default, but be set to true to remove this behavior +difference between single servers and clusters. + +### Performance + +Performance of AQL queries can vary between single server and cluster. +If a query can be distributed to many DB-Server and executed in +parallel then cluster performance can be better. For example, if you +do a distributed `COLLECT` aggregation or a distributed `FILTER` +operation. + +On the other hand, if you do a join or a traversal and the data is not +local to one server then the performance can be worse compared to a +single server. This is especially true for traversal if the data is +not sharded with care. Our SmartGraph feature helps with this for +traversals. + +Single document operations can have a higher throughput in cluster but +will also have a higher latency, due to an additional network hop from +Coordinator to DB-Server. + +Any operation that needs to find documents by anything else but the +shard key will have to fan out to all shards, so it will be a lot +slower than when referring to the documents using the shard +key. Optimized lookups by shard key can only be used for equality +lookups, e.g. not for range lookups. + +### Memory usage + +Some query results must be built up in memory on a Coordinator, for +example if a dataset needs to be sorted on the fly. This can relatively +easily overwhelm a Coordinator if the dataset is sharded across multiple +DB-Servers. Use indexes and streaming cursors to circumvent this +problem. + +## Transactions + +Using a single instance of ArangoDB, multi-document / multi-collection +queries are guaranteed to be fully ACID. This is more than many other +NoSQL database systems support. In cluster mode, single-document +operations are also fully ACID. Multi-document / multi-collection +queries in a cluster are not ACID, which is equally the case for +competing database systems. See [Transactions](../develop/transactions/_index.md) +for details. + +Batch operations for multiple documents in the same collection are only +fully transactional in a single instance. + +## SmartGraphs + +In SmartGraphs there are restrictions on the values of the `_key` +attributes. Essentially, the `_key` attribute values for vertices must +be prefixed with the string value of the SmartGraph attribute and a +colon. A similar restriction applies for the edges. + +## Foxx + +Foxx apps run on the Coordinators of a cluster. Since Coordinators are +stateless, one must not use regular file accesses in Foxx apps in a +cluster. + +## Agency + +A cluster deployment needs a central, RAFT-based key/value store called +"the Agency" to keep the current cluster configuration and manage +failover. Being RAFT-based, this is a real-time system. If your servers +running the Agency instances (typically three or five) receive too much +load, the RAFT protocol stops working and the whole stability of the +cluster is endangered. If you foresee this problem, run the Agency +instances on separate nodes. All this is not necessary in a single +server deployment. + +## Dump/Restore + +In a cluster, the `arangodump` utility cannot guarantee a consistent snapshot +across multiple shards or even multiple collections. In a single server, +`arangodump` produces a consistent snapshot. + +In the Enterprise Edition, there is an additional utility +`arangobackup` and an HTTP API for [Hot Backups](../operations/backup-and-restore.md#hot-backups) +to create consistent cluster snapshots. diff --git a/site/content/arangodb/oem/deploy/single-instance/_index.md b/site/content/arangodb/oem/deploy/single-instance/_index.md new file mode 100644 index 0000000000..1e3b5f49d6 --- /dev/null +++ b/site/content/arangodb/oem/deploy/single-instance/_index.md @@ -0,0 +1,32 @@ +--- +title: Single instance deployments +menuTitle: Single instance +weight: 5 +description: >- + Running a single server instance of ArangoDB is the most simple way to get + started +--- +Using a _single server_ or _single instance_ means to run the ArangoDB server +binary `arangod` stand-alone, without replication, without failover opportunity, +and not as a cluster together with other nodes. + +You may run multiple processes of `arangod` side-by-side on the same machine as +single instances, as long as they are configured for different ports and data +folders. The official installers may not support multiple installations +side-by-side, but you can get archive packages and unpack them manually. + +The provided ArangoDB packages run as single instances out of the box. + +Unlike other setups, like *Active Failover*, *Cluster*, or *OneShard*, +which require some specific procedure to be started once the ArangoDB package +has been installed, deploying a single instance is straightforward. + +Depending on your operating system, after the installation, the ArangoDB Server +might be already up and running. *Start*, *stop*, and *restart* operations can +be handled directly by using your *System and Service Manager*. + +The following are two additional ways that can be used to start the stand-alone +instance: + +- Using the [ArangoDB Starter tool](using-the-arangodb-starter.md), or +- [manually](manual-start.md). diff --git a/site/content/arangodb/oem/deploy/single-instance/manual-start.md b/site/content/arangodb/oem/deploy/single-instance/manual-start.md new file mode 100644 index 0000000000..5a67948534 --- /dev/null +++ b/site/content/arangodb/oem/deploy/single-instance/manual-start.md @@ -0,0 +1,73 @@ +--- +title: Starting Manually +menuTitle: Manual Start +weight: 5 +description: >- + How to start an ArangoDB stand-alone instance by manually starting the needed + _arangod_ process +--- +## Local Start + +We will assume that your IP is 127.0.0.1 and that the port 8529 is free: + +```bash +arangod --server.endpoint tcp://0.0.0.0:8529 \ + --database.directory standalone & +``` + +## Manual Start in Docker + +Manually starting a stand-alone instance via Docker is basically the same as described +in the paragraph above. + +A bit of extra care has to be invested due to the way in which Docker isolates its network. +By default it fully isolates the network and by doing so an endpoint like `--server.endpoint tcp://0.0.0.0:8529` +will only bind to all interfaces inside the Docker container which does not include +any external interface on the host machine. This may be sufficient if you just want +to access it locally but in case you want to expose it to the outside you must +facilitate Dockers port forwarding using the `-p` command line option. Be sure to +check the [official Docker documentation](https://docs.docker.com/engine/reference/run/). + +You can simply use the `-p` flag in Docker to make the individual processes available on the host +machine or you could use Docker's [links](https://docs.docker.com/engine/reference/run/) +to enable process intercommunication. + +An example configuration might look like this: + +```bash +docker run -e ARANGO_NO_AUTH=1 -p 192.168.1.1:10000:8529 arangodb/arangodb arangod \ + --server.endpoint tcp://0.0.0.0:8529\ +``` + +This will start a single server within a Docker container with an isolated network. +Within the Docker container it will bind to all interfaces (this will be 127.0.0.1:8529 +and some internal Docker IP on port 8529). By supplying `-p 192.168.1.1:10000:8529` +we are establishing a port forwarding from our local IP (192.168.1.1 port 10000 in +this example) to port 8529 inside the container. + +### Authentication + +To start the official Docker container you will have to decide on an authentication +method, otherwise the container will not start. + +Provide one of the arguments to Docker as an environment variable. There are three +options: + +1. ARANGO_NO_AUTH=1 + + Disable authentication completely. Useful for local testing or for operating + in a trusted network (without a public interface). + +2. ARANGO_ROOT_PASSWORD=password + + Start ArangoDB with the given password for root. + +3. ARANGO_RANDOM_ROOT_PASSWORD=1 + + Let ArangoDB generate a random root password. + +For an in depth guide about Docker and ArangoDB please check the official documentation: +[hub.docker.com/r/arangodb/arangodb/](https://hub.docker.com/r/arangodb/arangodb/). +Note that we are using the image `arangodb/arangodb` here which is always the most current one. +There is also the "official" one called `arangodb` whose documentation is here: +[hub.docker.com/\_/arangodb/](https://hub.docker.com/_/arangodb/) diff --git a/site/content/arangodb/oem/deploy/single-instance/using-the-arangodb-starter.md b/site/content/arangodb/oem/deploy/single-instance/using-the-arangodb-starter.md new file mode 100644 index 0000000000..b4057671af --- /dev/null +++ b/site/content/arangodb/oem/deploy/single-instance/using-the-arangodb-starter.md @@ -0,0 +1,108 @@ +--- +title: Using the ArangoDB Starter +menuTitle: Using the ArangoDB Starter +weight: 10 +description: >- + How to start an ArangoDB stand-alone instance using the ArangoDB Starter +--- +The [_Starter_](../../components/tools/arangodb-starter/_index.md) tool +(the _arangodb_ executable) supports starting a single server. + +As a precondition you should create a _secret_ to activate authentication. +The _Starter_ provides a handy functionality to generate such a file: + +```bash +arangodb create jwt-secret --secret=arangodb.secret +``` + +Set appropriate privilege on the generated _secret_ file, e.g. on Linux: + +```bash +chmod 400 arangodb.secret +``` + +## Local Start + +If you want to start a stand-alone instance of ArangoDB (single server), use the +`--starter.mode=single` option of the _Starter_: + +```bash +arangodb --starter.mode=single --auth.jwt-secret=/etc/arangodb.secret +``` + +Please adapt the path to your _secret_ file accordingly. + +## Using the ArangoDB Starter in Docker + +The _Starter_ can also be used to launch a stand-alone instance based on _Docker_ +containers: + +```bash +export IP=<IP of docker host> +docker volume create arangodb +docker run -it --name=adb --rm -p 8528:8528 \ + -v arangodb:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + arangodb/arangodb-starter \ + --starter.address=$IP \ + --starter.mode=single \ + --docker.net-mode=default +``` + +If you use the Enterprise Edition Docker image, you have to set the license key +in an environment variable by adding this option to the above `docker` command: + +``` + -e ARANGO_LICENSE_KEY=<thekey> +``` + +You can get a free evaluation license key by visiting: + +[www.arangodb.com/download-arangodb-enterprise/](https://www.arangodb.com/download-arangodb-enterprise/) + +Then replace `<thekey>` above with the actual license key. The start +will then hand on the license key to the Docker container it launches +for ArangoDB. + +### TLS verified Docker services + +Oftentimes, one needs to harden Docker services using client certificate +and TLS verification. The Docker API allows subsequently only certified access. +As the ArangoDB starter starts the ArangoDB cluster instances using this Docker API, +it is mandatory that the ArangoDB starter is deployed with the proper certificates +handed to it, so that the above command is modified as follows: + +```bash +export IP=<IP of docker host> +export DOCKER_TLS_VERIFY=1 +export DOCKER_CERT_PATH=/path/to/certificate +docker volume create arangodb +docker run -it --name=adb --rm -p 8528:8528 \ + -v arangodb:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /path/to/certificate:/path/to/certificate + arangodb/arangodb-starter \ + --starter.address=$IP \ + --starter.mode=single \ + --docker.net-mode=default +``` + +Note that the environment variables `DOCKER_TLS_VERIFY` and `DOCKER_CERT_PATH` +as well as the additional mountpoint containing the certificate have been added above. +directory. The assignment of `DOCKER_CERT_PATH` is optional, in which case it +is mandatory that the certificates are stored in `$HOME/.docker`. So +the command would then be as follows + +```bash +export IP=<IP of docker host> +docker volume create arangodb +docker run -it --name=adb --rm -p 8528:8528 \ + -v arangodb:/data \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /path/to/cert:/root/.docker \ + -e DOCKER_TLS_VERIFY=1 \ + arangodb/arangodb-starter \ + --starter.address=$IP \ + --starter.mode=single \ + --docker.net-mode=default +``` diff --git a/site/content/arangodb/oem/develop/_index.md b/site/content/arangodb/oem/develop/_index.md new file mode 100644 index 0000000000..023964a628 --- /dev/null +++ b/site/content/arangodb/oem/develop/_index.md @@ -0,0 +1,6 @@ +--- +title: Develop +menuTitle: Develop +weight: 240 +description: '' +--- diff --git a/site/content/arangodb/oem/develop/drivers/_index.md b/site/content/arangodb/oem/develop/drivers/_index.md new file mode 100644 index 0000000000..cba7ac5de0 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/_index.md @@ -0,0 +1,53 @@ +--- +title: Official ArangoDB drivers +menuTitle: Drivers +weight: 285 +description: >- + ArangoDB drivers allow you to connect ArangoDB to your applications and manage + the database system via a language-specific interface +--- +Database drivers, also called connectors, adapters, or client libraries, let you +access and manage database systems. ArangoDB drivers are interfaces between +programming languages and ArangoDB, which enable software developers to connect +to and manipulate ArangoDB deployments from within compiled programs or using +scripting languages. + +From a language perspective, documents and database structures can be integrated +with data types and their methods. The precise mapping of concepts and methods +depends on the capabilities and practices of each language. + +Programming is a powerful way of automating interactions and control of the +database, as well as to integrate database operations into your own software. +The drivers listed below are officially maintained and supported by ArangoDB. +If your programming language or environment is not listed, + +## Java driver + +The [**ArangoDB Java driver**](java/_index.md) lets you work with ArangoDB in the +Java programming language. + +- [Tutorial](java/_index.md#tutorial) +- Repository: [github.com/arangodb/arangodb-java-driver](https://github.com/arangodb/arangodb-java-driver) + +## Go driver + +The [**Go driver**](go.md) lets you work with ArangoDB in the Go programming +language. + +- [Tutorial](go.md#tutorial) +- Repository: [github.com/arangodb/go-driver](https://github.com/arangodb/go-driver/tree/master/v2) + +## Node.js driver + +The [**ArangoJS driver**](javascript.md) lets you work with ArangoDB in Node.js, using +the JavaScript scripting language. You can also use it in web browsers. + +- Repository: [github.com/arangodb/arangojs](https://github.com/arangodb/arangojs) + +## Python driver + +The [**Python-Arango**](python.md) driver lets you work with ArangoDB in the +Python scripting language. + +- Online course: [Python Driver Tutorial](https://www.arangodb.com/tutorials/tutorial-python/) +- Repository: [github.com/ArangoDB-Community/python-arango](https://github.com/ArangoDB-Community/python-arango) diff --git a/site/content/arangodb/oem/develop/drivers/go.md b/site/content/arangodb/oem/develop/drivers/go.md new file mode 100644 index 0000000000..4ba41471dd --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/go.md @@ -0,0 +1,735 @@ +--- +title: ArangoDB Go driver +menuTitle: Go driver +weight: 15 +description: '' +--- +The official Go driver in version 2 is the recommended client for interacting +with ArangoDB using the Go programming language. + +- Reference: <https://pkg.go.dev/github.com/arangodb/go-driver/v2> +- Repository: <https://github.com/arangodb/go-driver/tree/master/v2> +- [Changelog](https://github.com/arangodb/go-driver/blob/master/v2/CHANGELOG.md) + +## Tutorial + +### Install the driver + +To use the driver, fetch the sources into your `GOPATH` first. + +```sh +go get github.com/arangodb/go-driver/v2 +``` + +Import the driver in your Go program using the `import` statement. +Two packages are necessary: + +```go +import ( + "github.com/arangodb/go-driver/v2/arangodb" + "github.com/arangodb/go-driver/v2/connection" +) +``` + +You may want to additionally import the following packages: + +```go + "github.com/arangodb/go-driver/v2/arangodb/shared" + "github.com/arangodb/go-driver/v2/utils" +``` + +The former provides a `shared.IsNoMoreDocuments` function that makes it easy to +check whether to stop iterating over the results of functions that return a reader, +like multi-document operations and listing graphs. The latter provides a +`utils.NewType` function that lets you conveniently create a pointer to a boolean +value, for instance. + +If you use Go modules, you can also import the driver and run `go mod tidy` +instead of using the `go get` command. + +### Connect to ArangoDB + +Using the driver, you always need to create a `Client`. The following example +shows how to create a `Client` for an ArangoDB single server running on localhost. +You need to set `InsecureSkipVerify` to `true` if the ArangoDB server is not +configured for TLS encryption to establish an unencrypted HTTP/2 connection. +For more options, see [Connection management](#connection-management). + +```go +import ( + "context" + "log" + + "github.com/arangodb/go-driver/v2/arangodb" + "github.com/arangodb/go-driver/v2/arangodb/shared" + "github.com/arangodb/go-driver/v2/connection" + "github.com/arangodb/go-driver/v2/utils" +) + +/*...*/ + +endpoint := connection.NewRoundRobinEndpoints([]string{"http://localhost:8529"}) +conn := connection.NewHttp2Connection(connection.DefaultHTTP2ConfigurationWrapper(endpoint, /*InsecureSkipVerify*/ true)) + +// Add authentication +auth := connection.NewBasicAuth("root", "") +err := conn.SetAuthentication(auth) +if err != nil { + log.Fatalf("Failed to set authentication: %v", err) +} + +// Create a client +client := arangodb.NewClient(conn) +``` + +Once you have a `Client` object, you can use this handle to create and edit +objects, such as databases, collections, documents, and graphs. These database +objects are mapped to types in Go. The methods for these types are used to read +and write data. + +### Asynchronous client + +The driver supports an asynchronous client that can be used to run multiple +operations concurrently. + +```go +import ( + "context" + "log" + + "github.com/arangodb/go-driver/v2/arangodb" + "github.com/arangodb/go-driver/v2/connection" +) + +/*...*/ + +// Create an HTTP connection to the database +endpoint := connection.NewRoundRobinEndpoints([]string{"http://localhost:8529"}) +conn := connection.NewHttp2Connection(connection.DefaultHTTP2ConfigurationWrapper(endpoint, false)) + +auth := connection.NewBasicAuth("root", "password") +err := conn.SetAuthentication(auth) +if err != nil { + log.Fatalf("Failed to set authentication: %v", err) +} + +// Create ASYNC wrapper for the connection +conn = connection.NewConnectionAsyncWrapper(conn) + +// Create a client +client := arangodb.NewClient(conn) + +// Trigger async request +info, errWithJobID := client.Version(connection.WithAsync(context.Background())) +if errWithJobID == nil { + log.Fatalf("Error object should not be nil but be an async job id") +} +if info.Version != "" { + log.Printf("Expected empty version if async request is in progress, got %s", info.Version) +} + +// Fetch an async job id from the error +id, isAsyncId := connection.IsAsyncJobInProgress(errWithJobID) +if !isAsyncId { + log.Fatalf("Expected async job id, got %v", id) +} + +// Wait for an async result +time.Sleep(3 * time.Second) + +// List async jobs - there should be one, till the result is fetched +jobs, err := client.AsyncJobList(context.Background(), arangodb.JobDone, nil) +if err != nil { + log.Fatalf("Failed to list async jobs: %v", err) +} +if len(jobs) != 1 { + log.Fatalf("Expected 1 async job, got %d", len(jobs)) +} + +// Fetch an async job result +info, err = client.Version(connection.WithAsyncID(context.Background(), id)) +if err != nil { + log.Fatalf("Failed to fetch async job result: %v", err) +} +log.Printf("Async job result: %s", info.Version) +``` + +### Important types for Go + +Key types you need to know about to work with ArangoDB using the Go driver: + +- `Database` – to maintain a handle to an open database +- `Collection` – as a handle for a collection of records (vertex, edge, or document) within a database +- `Graph` – as a handle for a graph overlay containing vertices and edges (nodes and links) +- `EdgeDefinition` – a named collection of edges used to help a graph in distributed searching + +These are declared as in the following examples: + +```go +var err error +var client arangodb.Client +var conn connection.Connection +var db arangodb.Database +var col arangodb.Collection +``` + +The following example shows how to open an existing collection in an existing +database and create a new document in that collection. + +```go +// Setup a client connection +endpoint := connection.NewRoundRobinEndpoints([]string{"https://abcdef123456.arangodb.cloud:8529/"}) +conn := connection.NewHttp2Connection(connection.DefaultHTTP2ConfigurationWrapper(endpoint, false)) + +// Add authentication +auth := connection.NewBasicAuth("root", "password") +err := conn.SetAuthentication(auth) +if err != nil { + log.Fatalf("Failed to set authentication: %v", err) +} + +// Create a client +client := arangodb.NewClient(conn) + +// Open the "mydb" database +db, err := client.GetDatabase(nil, "mydb", nil) +if err != nil { + // Handle error +} + +// Open the "coll" collection +col, err := db.GetCollection(nil, "coll", nil) +if err != nil { + // Handle error +} + +// Define a structure for (de)serializing documents +type Book struct { + Title string `json:"title"` + NoPages int `json:"number_pages,omitempty"` +} + +// Create a document +book := Book{ + Title: "ArangoDB Cookbook", + NoPages: 257, +} + +meta, err := col.CreateDocument(nil, book) +if err != nil { + // Handle error +} +log.Printf("Created document in collection '%s' in database '%s'\n", col.Name(), db.Name()) +``` + +### Relationships between Go types and JSON + +A basic principle of the integration between Go and ArangoDB is the mapping from +Go types to JSON documents. Data in the database map to types in Go through JSON. +You need at least two types in a Golang program to work with graphs. + +Go uses a special syntax to map values like struct members like Key, Weight, +Data, etc. to JSON fields. Remember that member names should start with a capital +letter to be accessible outside a packaged scope. You declare types and their +JSON mappings once, as in the examples below. + +```go +// A typical document type +type IntKeyValue struct { + Key string `json:"_key"` // mandatory field (handle) - short name + Value int `json:"value"` +} + +// A typical vertex type must have field matching _key +type MyVertexNode struct { + Key string `json:"_key"` // mandatory field (handle) - short name + // other fields … e.g. + Data string `json: "data"` // Longer description or bulk string data + Weight float64 `json:"weight"` // importance rank +} + +// A typical edge type must have fields matching _from and _to +type MyEdgeLink struct { + Key string `json:"_key"` // mandatory field (handle) + From string `json:"_from"` // mandatory field + To string `json:"_to"` // mandatory field + // other fields … e.g. + Weight float64 `json:"weight"` +} +``` + +When reading data from ArangoDB with, say, `ReadDocument()`, the API asks you to +submit a variable of some type, say `MyDocumentType`, by reference using the +`&` operator: + +```go +var variable MyDocumentType +mycollection.ReadDocument(nil, rawkey, &variable) +``` + +This submitted type is not necessarily a fixed type, but it must be a type whose +members map (at least partially) to the named fields in the database's JSON +document representation. Only matching fields are filled in. This means you could +create several different Go types to read the same documents in the database, as +long as they have some type fields that match JSON fields. In other words, the +mapping need not be unique or one-to-one, so there is great flexibility in making +new types to extract a subset of the fields in a document. + +The document model in ArangoDB does not require all documents in a collection to +have the same fields. You can choose to have ad hoc schemas and extract only a +consistent set of fields in a query, or rigidly check that all documents have +the same schema. This is a user choice. + +### Working with databases + +#### Create a new database + +```go +ctx := context.Background() +options := arangodb.CreateDatabaseOptions{ /*...*/ } +db, err := client.CreateDatabase(ctx, "myDB", &options) +if err != nil { + // handle error +} +``` + +#### Open a database + +```go +ctx := context.Background() +db, err := client.GetDatabase(ctx, "myDB", nil) +if err != nil { + // handle error +} +``` + +### Working with collections + +#### Create a collection + +```go +ctx := context.Background() +options := arangodb.CreateCollectionProperties{ /* ... */ } +col, err := db.CreateCollection(ctx, "myCollection", &options) +if err != nil { + // handle error +} +``` +#### Check if a collection exists + +```go +ctx := context.Background() +found, err := db.CollectionExists(ctx, "myCollection") +if err != nil { + // handle error +} +``` + +#### Open a collection + +```go +ctx := context.Background() +col, err := db.GetCollection(ctx, "myCollection", nil) +if err != nil { + // handle error +} +``` + +### Working with documents + +#### Create a document + +```go +type MyDocument struct { + Name string `json:"name"` + Counter int `json:"counter"` +} + +doc := MyDocument{ + Name: "jan", + Counter: 23, +} +ctx := context.Background() +meta, err := col.CreateDocument(ctx, doc) +if err != nil { + // handle error +} +fmt.Printf("Created document with key '%s', revision '%s'\n", meta.Key, meta.Rev) +``` + +#### Read a document + +```go +var result MyDocument +ctx := context.Background() +meta, err := col.ReadDocument(ctx, "myDocumentKey (meta.Key)", &result) +if err != nil { + // handle error +} +``` + +#### Read a document with an explicit revision + +```go +var doc MyDocument +ctx := context.Background() +options := arangodb.CreateDatabaseOptions{ + IfMatch: "mySpecificRevision (meta.Rev)", +} +meta, err := col.ReadDocumentWithOptions(revCtx, "myDocumentKey (meta.Key)", &doc, &options) +if err != nil { + // handle error +} +``` + +#### Delete a document + +```go +ctx := context.Background() +meta, err := col.DeleteDocument(ctx, myDocumentKey) +if err != nil { + // handle error +} +``` + +#### Delete a document with an explicit revision + +```go +ctx := context.Background() +options := arangodb.CollectionDocumentDeleteOptions{ + IfMatch: "mySpecificRevision (meta.Rev)", +} +meta, err := col.DeleteDocumentWithOptions(ctx, myDocumentKey, &options) +if err != nil { + // handle error +} +``` + +#### Update a document + +```go +ctx := context.Background() +patch := map[string]interface{}{ + "name": "Frank", +} +meta, err := col.UpdateDocument(ctx, myDocumentKey, patch) +if err != nil { + // handle error +} +``` + +### Working with AQL + +#### Query documents, one document at a time + +```go +ctx := context.Background() +query := "FOR d IN myCollection LIMIT 10 RETURN d" +cursor, err := db.Query(ctx, query, nil) +if err != nil { + // handle error +} else { + defer cursor.Close() + for cursor.HasMore() { + var doc MyDocument + meta, err := cursor.ReadDocument(ctx, &doc) + if err != nil { + // handle error + } else { + fmt.Printf("Got doc with key '%s' from query, name = %s\n", meta.Key, doc.Name) + } + } +} +``` + +#### Query documents, fetching the total count + +```go +ctx := context.Background() +options := arangodb.QueryOptions{ + Count: true, +} + +query := "FOR d IN myCollection RETURN d" +cursor, err := db.Query(ctx, query, &options) +if err != nil { + // handle error +} else { + defer cursor.Close() + fmt.Printf("Query yields %d documents\n", cursor.Count()) +} +``` + +#### Query documents, with bind variables + +```go +ctx := context.Background() +options := arangodb.QueryOptions{ + Count: true, + BindVars: map[string]interface{}{ + "myVar": "Some name", + } +} + +query := "FOR d IN myCollection FILTER d.name == @myVar RETURN d" + +cursor, err := db.Query(ctx, query, &options) +if err != nil { + // handle error +} +defer cursor.Close() +fmt.Printf("Query yields %d documents\n", cursor.Count()) +``` + +### Full example + +```go +package main + +import ( + "context" + "flag" + "fmt" + "log" + "strings" + + "github.com/arangodb/go-driver/v2/arangodb" + "github.com/arangodb/go-driver/v2/arangodb/shared" + "github.com/arangodb/go-driver/v2/connection" +) + +type User struct { + Name string `json:"name"` + Age int `json:"age"` +} + +func main() { + // Create an HTTP connection to the database + endpoint := connection.NewRoundRobinEndpoints([]string{"http://localhost:8529"}) + conn := connection.NewHttp2Connection(connection.DefaultHTTP2ConfigurationWrapper(endpoint, true)) + + auth := connection.NewBasicAuth("root", "") + err := conn.SetAuthentication(auth) + if err != nil { + log.Fatalf("Failed to set authentication: %v", err) + } + + // Create a client + client := arangodb.NewClient(conn) + ctx := context.Background() + + flag.Parse() + + var db arangodb.Database + var dbExists, collExists bool + + dbExists, err = client.DatabaseExists(ctx, "example") + + if dbExists { + fmt.Println("That db exists already") + + db, err = client.GetDatabase(ctx, "example", nil) + + if err != nil { + log.Fatalf("Failed to open existing database: %v", err) + } + } else { + db, err = client.CreateDatabase(ctx, "example", nil) + + if err != nil { + log.Fatalf("Failed to create database: %v", err) + } + } + + // Create collection + collExists, err = db.CollectionExists(ctx, "users") + + if collExists { + fmt.Println("That collection exists already") + } else { + var col arangodb.Collection + col, err = db.CreateCollection(ctx, "users", nil) + + if err != nil { + log.Fatalf("Failed to create collection: %v", err) + } + + // Create documents + users := []User{ + { + Name: "John", + Age: 65, + }, + { + Name: "Tina", + Age: 25, + }, + { + Name: "George", + Age: 31, + }, + } + reader, err := col.CreateDocuments(ctx, users) + if err != nil { + log.Fatalf("Failed to create documents: %v", err) + } + + meta1, err := reader.Read() + if err != nil { + log.Fatalf("Failed to read document: %v", err) + } + meta2, err := reader.Read() + if err != nil { + log.Fatalf("Failed to read document: %v", err) + } + meta3, err := reader.Read() + if err != nil { + log.Fatalf("Failed to read document: %v", err) + } + + keys := []string{meta1.Key, meta2.Key, meta3.Key} + + fmt.Printf("Created documents with keys '%s' in collection '%s' in database '%s'\n", strings.Join(keys, ","), col.Name(), db.Name()) + } + PrintCollection(db) +} + +func PrintCollection(db arangodb.Database) { + var err error + var cursor arangodb.Cursor + + querystring := "FOR doc IN users LIMIT 10 RETURN doc" + + cursor, err = db.Query(nil, querystring, nil) + + if err != nil { + log.Fatalf("Query failed: %v", err) + } + + defer cursor.Close() + + for { + var doc User + var meta arangodb.DocumentMeta + + meta, err = cursor.ReadDocument(nil, &doc) + + if shared.IsNoMoreDocuments(err) { + break + } else if err != nil { + log.Fatalf("Reading document failed: %v", err) + } else { + fmt.Printf("Metadata and document:\n%+v\n%v\n", meta, doc) + } + } +} +``` + +## API Design + +### Concurrency + +All functions of the driver are strictly synchronous. They operate and only +return a value (or error) when they are done. + +If you want to run operations concurrently, use a `go` routine. All objects in +the driver are designed to be used from multiple concurrent go routines, +except `Cursor`. + +All database objects (except `Cursor`) are considered static. After their +creation, they don't change. For example, after creating a `Collection` instance, +you can remove the collection, but the (Go) instance will still be there. Calling +functions on such a removed collection will, of course, fail. + +### Structured error handling & wrapping + +All functions of the driver that can fail return an error value. If that value +is not `nil`, the function call is considered to have failed. In that case, all +other return values are set to their zero values. + +All errors are structured using error-checking functions named +`Is<SomeErrorCategory>`. For example, `IsNotFound(error)` returns true if the +given error is of the category "not found". There can be multiple internal error +codes that all map onto the same category. + +All errors returned from any function of the driver (either internal or exposed) +wrap errors using the `WithStack` function. This can be used to provide detailed +stack traces in case of an error. All error-checking functions use the `Cause` +function to get the cause of an error instead of the error wrapper. + +### Context-aware + +All functions of the driver that involve some kind of long-running operation or +support additional options are not given as function arguments have a +`context.Context` argument. This enables you to cancel running requests, pass +timeouts/deadlines, and pass additional options. + +## Connection management + +### Secure connections (TLS) + +The driver supports endpoints that use TLS using the `https` URL scheme. +Supplying endpoints that start with `https://` instead of `http://` is all you +need to do to use an encrypted connection. + +If you want to connect to a server that has a secure endpoint using a +**self-signed certificate**, you need to skip the certificate verification. + +```go +endpoint := connection.NewRoundRobinEndpoints([]string{"https://localhost:8529"}) +conn := connection.NewHttp2Connection(connection.DefaultHTTP2ConfigurationWrapper(endpoint, /*InsecureSkipVerify*/ true)) +``` + +### Endpoints management + +The driver supports multiple endpoints to connect to. +Currently, Maglev and RoundRobin approaches are supported. + +The following example shows how to connect to a cluster of three servers +using RoundRobin: + +```go +endpoint := connection.NewRoundRobinEndpoints([]string{"http://server1:8529", "http://server2:8529", "http://server3:8529"}) +conn := connection.NewHttp2Connection(connection.DefaultHTTP2ConfigurationWrapper(endpoint, false)) +``` + +Note that a valid endpoint is a URL to either a standalone server or a URL to a +Coordinator in a cluster. + +#### Exact behavior + +The driver monitors the request being sent to a specific server (endpoint). +As soon as the request has been completely written, failover will no longer +happen. The reason for that is that several operations cannot be (safely) retried. +For example, when a request to create a document has been sent to a server, and +a timeout occurs, the driver has no way of knowing if the server did or did not +create the document in the database. + +If the driver detects that a request has been completely written but still gets +an error (other than an error response from ArangoDB itself), it wraps the error +in a `ResponseError`. The client can test for such an error using `IsResponseError`. + +If a client receives a `ResponseError`, it can do one of the following: + +- Retry the operation and be prepared for some kind of duplicate record or + unique constraint violation. +- Perform a test operation to see if the "failed" operation did succeed after all. +- Simply consider the operation failed. This is risky since it can still be the + case that the operation did succeed. + +#### Timeouts + +To control the timeout of any function in the driver, you must pass it a context +configured with `context.WithTimeout` (or `context.WithDeadline`). + +In the case of multiple endpoints, the actual timeout used for requests is +shorter than the timeout given in the context. The driver divides the timeout by +the number of endpoints with a maximum of `3`. This ensures that the driver can +try up to 3 different endpoints (in case of failover) without being canceled due +to the timeout given by the client. Examples: + +- With 1 endpoint and a given timeout of 1 minute, the actual request timeout is 1 minute. +- With 3 endpoints and a given timeout of 1 minute, the actual request timeout is 20 seconds. +- With 8 endpoints and a given timeout of 1 minute, the actual request timeout is 20 seconds. + +For most requests, you want an actual request timeout of at least 30 seconds. diff --git a/site/content/arangodb/oem/develop/drivers/java/_index.md b/site/content/arangodb/oem/develop/drivers/java/_index.md new file mode 100644 index 0000000000..dc7d37d9fd --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/_index.md @@ -0,0 +1,480 @@ +--- +title: ArangoDB Java driver +menuTitle: Java driver +weight: 10 +description: '' +--- +The official ArangoDB Java Driver. + +- Repository: <https://github.com/arangodb/arangodb-java-driver> +- [Code examples](https://github.com/arangodb/arangodb-java-driver/tree/main/test-non-functional/src/test/java/example) +- [Reference](reference-version-7/_index.md) (driver setup, serialization, changes in version 7) +- [JavaDoc](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/index.html) (generated reference documentation) +- [ChangeLog](https://github.com/arangodb/arangodb-java-driver/blob/main/ChangeLog.md) + +## Supported versions + +Version 7 is the latest supported and actively developed release. + +The driver is compatible with all supported stable versions of ArangoDB server, see +[Product Support End-of-life Announcements](https://arangodb.com/subscriptions/end-of-life-notice/). + +The driver is compatible with JDK 8 and higher versions. + +{{< warning >}} +Version 6 reached End of Life (EOL) and is not actively developed anymore. +Upgrading to version 7 is recommended. + +The API changes between version 6 and 7 are documented in +[Changes in version 7](reference-version-7/changes-in-version-7.md). +{{< /warning >}} + +## Project configuration + +To use the ArangoDB Java driver, you need to import `arangodb-java-driver` as a +library into your project. This is described below for the popular Java build +automation systems Maven and Gradle. + +### Maven + +To add the driver to your project with Maven, add the following code to your +`pom.xml`: + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-java-driver</artifactId> + <version>7.x.x</version> + </dependency> +</dependencies> +``` + +Substitute `7.x.x` with the latest driver version. + +### Gradle + +To add the driver to your project with Gradle, add the following code to your +`build.gradle` (substitute `7.x.x` with the latest driver version): + +```groovy +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.arangodb:arangodb-java-driver:7.x.x' +} +``` + +## Tutorial + +### Connect to ArangoDB + +Let's configure and open a connection to ArangoDB. The default connection is to +`127.0.0.1:8529`. Change the connection details to point to your specific instance. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .host("localhost", 8529) + .user("root") + .password("") + .build(); +``` + +For more connections options and details, see +[Driver setup](reference-version-7/driver-setup.md). + +### Create a database + +Let's create a new database: + +```java +ArangoDatabase db = arangoDB.db("mydb"); +System.out.println("Creating database..."); +db.create(); +``` + +### Create a collection + +Now let's create our first collection: + +```java +ArangoCollection collection = db.collection("firstCollection"); +System.out.println("Creating collection..."); +collection.create(); +``` + +### Create a document + +Let's create a document in the collection. Any object can be added as a document +to the database and be retrieved from the database as an object. + +This example uses the `BaseDocument` class, provided with the driver. The +attributes of the document are stored in a map as `key<String>`/`value<Object>` pair: + +```java +String key = "myKey"; +BaseDocument doc = new BaseDocument(key); +doc.addAttribute("a", "Foo"); +doc.addAttribute("b", 42); +System.out.println("Inserting document..."); +collection.insertDocument(doc); +``` + +Some details you should know about the code: + +- The document key is passed to the `BaseDocument` constructor +- The `addAttribute()` method puts a new key/value pair into the document +- Each attribute is stored as a single key value pair in the document root + +### Read a document + +Read the created document: + +```java +System.out.println("Reading document..."); +BaseDocument readDocument = collection.getDocument(key, BaseDocument.class); +System.out.println("Key: " + readDocument.getKey()); +System.out.println("Attribute a: " + readDocument.getAttribute("a")); +System.out.println("Attribute b: " + readDocument.getAttribute("b")); +``` + +After executing this program, the console output should be: + +```text +Key: myKey +Attribute a: Foo +Attribute b: 42 +``` + +Some details you should know about the code: + +- The `getDocument()` method reads the stored document data and deserializes it + into the given class (`BaseDocument`) + +### Create a document from Jackson JsonNode + +You can also create a document from a Jackson +[JsonNode](https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/JsonNode.html) +object: + +```java +System.out.println("Creating a document from Jackson JsonNode..."); +String keyJackson = "myJacksonKey"; +JsonNode jsonNode = JsonNodeFactory.instance.objectNode() + .put("_key", keyJackson) + .put("a", "Bar") + .put("b", 53); +System.out.println("Inserting document from Jackson JsonNode..."); +collection.insertDocument(jsonNode); +``` + +### Read a document as Jackson JsonNode + +You can also read a document as a Jackson +[JsonNode](https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/JsonNode.html): + +```java +System.out.println("Reading document as Jackson JsonNode..."); +JsonNode readJsonNode = collection.getDocument(keyJackson, JsonNode.class); +System.out.println("Key: " + readJsonNode.get("_key").textValue()); +System.out.println("Attribute a: " + readJsonNode.get("a").textValue()); +System.out.println("Attribute b: " + readJsonNode.get("b").intValue()); +``` + +After executing this program, the console output should be: + +```text +Key: myKey +Attribute a: Bar +Attribute b: 53 +``` + +Some details you should know about the code: + +- The `getDocument()` method returns the stored document as instance of + `com.fasterxml.jackson.databind.JsonNode`. + +### Create a document from JSON String + +You can also create a document from raw JSON string: + +```java +System.out.println("Creating a document from JSON String..."); +String keyJson = "myJsonKey"; +RawJson json = RawJson.of("{\"_key\":\"" + keyJson + "\",\"a\":\"Baz\",\"b\":64}"); +System.out.println("Inserting document from JSON String..."); +collection.insertDocument(json); +``` + +### Read a document as JSON String + +You can also read a document as raw JSON string: + +```java +System.out.println("Reading document as JSON String..."); +RawJson readJson = collection.getDocument(keyJson, RawJson.class); +System.out.println(readJson.get()); +``` + +After executing this program, the console output should be: + +```text +{"_key":"myJsonKey","_id":"firstCollection/myJsonKey","_rev":"_e0nEe2y---","a":"Baz","b":64} +``` + +### Update a document + +Let's update the document: + +```java +doc.addAttribute("c", "Bar"); +System.out.println("Updating document ..."); +collection.updateDocument(key, doc); +``` + +### Read the document again + +Let's read the document again: + +```java +System.out.println("Reading updated document ..."); +BaseDocument updatedDocument = collection.getDocument(key, BaseDocument.class); +System.out.println("Key: " + updatedDocument.getKey()); +System.out.println("Attribute a: " + updatedDocument.getAttribute("a")); +System.out.println("Attribute b: " + updatedDocument.getAttribute("b")); +System.out.println("Attribute c: " + updatedDocument.getAttribute("c")); +``` + +After executing this program, the console output should look like this: + +```text +Key: myKey +Attribute a: Foo +Attribute b: 42 +Attribute c: Bar +``` + +### Delete a document + +Let's delete a document: + +```java +System.out.println("Deleting document ..."); +collection.deleteDocument(key); +``` + +### Execute AQL queries + +First, you need to create some documents with the name `Homer` in the +collection called `firstCollection`: + +```java +for (int i = 0; i < 10; i++) { + BaseDocument value = new BaseDocument(String.valueOf(i)); + value.addAttribute("name", "Homer"); + collection.insertDocument(value); +} +``` + +Get all documents with the name `Homer` from the collection using an AQL query +and iterate over the results: + +```java +String query = "FOR t IN firstCollection FILTER t.name == @name RETURN t"; +Map<String, Object> bindVars = Collections.singletonMap("name", "Homer"); +System.out.println("Executing read query ..."); +ArangoCursor<BaseDocument> cursor = db.query(query, BaseDocument.class, bindVars); +cursor.forEach(aDocument -> System.out.println("Key: " + aDocument.getKey())); +``` + +After executing this program, the console output should look something like this: + +```text +Key: 1 +Key: 0 +Key: 5 +Key: 3 +Key: 4 +Key: 9 +Key: 2 +Key: 7 +Key: 8 +Key: 6 +``` + +Some details you should know about the code: + +- The AQL query uses the placeholder `@name` that has to be bound to a value +- The `query()` method executes the defined query and returns an `ArangoCursor` + with the given class (here: `BaseDocument`) +- The order of is not guaranteed + +### Delete documents with AQL + +Delete previously created documents: + +```java +String query = "FOR t IN firstCollection FILTER t.name == @name " + + "REMOVE t IN firstCollection LET removed = OLD RETURN removed"; +Map<String, Object> bindVars = Collections.singletonMap("name", "Homer"); +System.out.println("Executing delete query ..."); +ArangoCursor<BaseDocument> cursor = db.query(query, BaseDocument.class, bindVars); +cursor.forEach(aDocument -> System.out.println("Removed document " + aDocument.getKey())); +``` + +After executing this program, the console output should look something like this: + +```text +Removed document: 1 +Removed document: 0 +Removed document: 5 +Removed document: 3 +Removed document: 4 +Removed document: 9 +Removed document: 2 +Removed document: 7 +Removed document: 8 +Removed document: 6 +``` + +### Learn more + +- Have a look at the [AQL documentation](../../../aql/) to lear about the + query language +- See [Serialization](reference-version-7/serialization.md) for details about + user-data serde +- For the full reference documentation, see + [JavaDoc](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/index.html) + +## GraalVM Native Image + +The driver supports GraalVM Native Image compilation. +To compile with `--link-at-build-time` when `http-protocol` module is present in +the classpath, additional substitutions are required for transitive dependencies +`Netty` and `Vert.x`. See this +[example](https://github.com/arangodb/arangodb-java-driver/tree/main/test-functional/src/test-default/java/graal) +for reference. Such substitutions are not required when compiling the shaded driver. + +### Framework compatibility + +The driver can be used in the following frameworks that support +GraalVM Native Image generation: + +- [Quarkus](https://quarkus.io), see [arango-quarkus-native-example](https://github.com/arangodb-helper/arango-quarkus-native-example) +- [Helidon](https://helidon.io), see [arango-helidon-native-example](https://github.com/arangodb-helper/arango-helidon-native-example) +- [Micronaut](https://micronaut.io), see [arango-micronaut-native-example](https://github.com/arangodb-helper/arango-micronaut-native-example) + +## ArangoDB Java Driver Shaded + +A shaded variant of the driver is also published with +Maven coordinates: `com.arangodb:arangodb-java-driver-shaded`. + +It bundles and relocates the following packages: +- `com.fasterxml.jackson` +- `com.arangodb.jackson.dataformat.velocypack` +- `io.vertx` +- `io.netty` + +Note that the **internal serde** internally uses Jackson classes from +`com.fasterxml.jackson` that are relocated to `com.arangodb.shaded.fasterxml.jackson`. +Therefore, the **internal serde** of the shaded driver is not compatible with +Jackson annotations and modules from package`com.fasterxml.jackson`, but only +with their relocated variants. In case the **internal serde** is used as +**user-data serde**, the annotations from package `com.arangodb.serde` can be +used to annotate fields, parameters, getters and setters for mapping values +representing ArangoDB documents metadata (`_id`, `_key`, `_rev`, `_from`, `_to`): +- `@InternalId` +- `@InternalKey` +- `@InternalRev` +- `@InternalFrom` +- `@InternalTo` + +These annotations are compatible with relocated Jackson classes. +Note that the **internal serde** is not part of the public API and could change +in future releases without notice, thus breaking client applications relying on +it to serialize or deserialize user-data. It is therefore recommended also in +this case either: +- using the default user-data serde `JacksonSerde` + (from packages `com.arangodb:jackson-serde-json` or `com.arangodb:jackson-serde-vpack`), or +- providing a custom user-data serde implementation via `ArangoDB.Builder.serde(ArangoSerde)`. + +## Support for extended naming constraints + +The driver supports ArangoDB's **extended** naming constraints/convention, +allowing most UTF-8 characters in the names of: +- Databases +- Collections +- Views +- Indexes + +These names must be NFC-normalized, otherwise the server returns an error. +To normalize a string, use the function +`com.arangodb.util.UnicodeUtils.normalize(String): String`: + +```java +String normalized = UnicodeUtils.normalize("𝔸𝕣𝕒𝕟𝕘𝕠𝔻𝔹"); +``` + +To check if a string is already normalized, use the +function `com.arangodb.util.UnicodeUtils.isNormalized(String): boolean`: + +```java +boolean isNormalized = UnicodeUtils.isNormalized("𝔸𝕣𝕒𝕟𝕘𝕠𝔻𝔹"); +``` + +## Async API + +The asynchronous API is accessible via `ArangoDB#async()`, for example: + +```java +ArangoDB adb = new ArangoDB.Builder() + // ... + .build(); +ArangoDBAsync adbAsync = adb.async(); +CompletableFuture<ArangoDBVersion> version = adbAsync.getVersion(); +// ... +``` + +Under the hood, both synchronous and asynchronous API use the same internal +communication layer, which has been reworked and re-implemented in an +asynchronous way. The synchronous API blocks and waits for the result, while the +asynchronous one returns a `CompletableFuture<>` representing the pending +operation being performed. +Each asynchronous API method is equivalent to the corresponding synchronous +variant, except for the Cursor API. + +### Async Cursor API + +The Cursor API (`ArangoCursor` and `ArangoCursorAsync`) is intrinsically different, +because the synchronous Cursor API is based on Java's `java.util.Iterator`, which +is an interface only suitable for synchronous scenarios. +On the other side, the asynchronous Cursor API provides a method +`com.arangodb.ArangoCursorAsync#nextBatch()`, which returns a +`CompletableFuture<ArangoCursorAsync<T>>` and can be used to consume the next +batch of the cursor, for example: + +```java +CompletableFuture<ArangoCursorAsync<Integer>> future1 = adbAsync.db() + .query("FOR i IN i..10000", Integer.class); +CompletableFuture<ArangoCursorAsync<Integer>> future2 = future1 + .thenCompose(c -> { + List<Integer> batch = c.getResult(); + // ... + // consume batch + // ... + return c.nextBatch(); + }); +// ... +``` + +## Data Definition Classes + +Classes used to exchange data definitions, in particular classes in the packages +`com.arangodb.entity.**` and `com.arangodb.model.**`, are meant to be serialized +and deserialized internally by the driver. + +The behavior to serialize and deserialize these classes is considered an internal +implementation detail, and as such, it might change without prior notice. +The API with regard to the public members of these classes is kept compatible. diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-6/_index.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-6/_index.md new file mode 100644 index 0000000000..e2799a8d80 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-6/_index.md @@ -0,0 +1,71 @@ +--- +title: ArangoDB Java Driver version 6 +menuTitle: Reference version 6 +weight: 10 +description: >- + The official ArangoDB Java Driver version 6 +--- +{{< warning >}} +Version 6 reached End of Life (EOL) and is not actively developed anymore. +Upgrading to version 7 is recommended. +{{< /warning >}} + +- Repository: <https://github.com/arangodb/arangodb-java-driver/tree/v6> +- [Code examples](https://github.com/arangodb/arangodb-java-driver/tree/v6/src/test/java/com/arangodb/example) +- [JavaDoc](https://javadoc.io/doc/com.arangodb/arangodb-java-driver/6.25.0/index.html) (generated reference documentation) +- [ChangeLog](https://github.com/arangodb/arangodb-java-driver/blob/v6/ChangeLog.md) +- [Java VelocyPack](https://github.com/arangodb/java-velocypack) ([JavaDoc](https://www.javadoc.io/doc/com.arangodb/velocypack/latest/index.html)) + +## Supported versions + +Only the latest version of this driver is maintained to support the most recent +ArangoDB server features. +It is compatible with all supported stable versions of ArangoDB server, see +[Product Support End-of-life Announcements](https://arangodb.com/subscriptions/end-of-life-notice/). + +The minimum required Java version is 1.8+ (since driver version 6.x.x). + +## Sync and async usage + +The driver can be used synchronously as well as asynchronously. The formerly separate async +driver with the same API as the synchronous driver, except that it returned a +`CompletableFuture<T>` instead of the result `T` directly, was merged into this +driver in version 6.2.0. See +[async examples](https://github.com/arangodb/arangodb-java-driver/tree/v6/src/test/java/com/arangodb/async/example). + +## Maven + +To add the driver to your project with Maven, add the following code to your +pom.xml (substitute `x.x.x` with the latest driver version): + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-java-driver</artifactId> + <version>x.x.x</version> + </dependency> +</dependencies> +``` + +## Compile the Java Driver + +``` +mvn clean install -DskipTests=true -Dgpg.skip=true -Dmaven.javadoc.skip=true -B +``` + +## GraalVM Native Image + +The driver supports GraalVM Native Image generation since version `6.6.1`. +The related configuration can be found here: + +- [native-image](https://github.com/arangodb/arangodb-java-driver/tree/v6/src/main/resources/META-INF/native-image) + +### Quarkus and Helidon support + +The driver can be used from Quarkus and Helidon applications and does not +require any additional configuration for GraalVM native image generation. +Examples can be found here: + +- [arango-quarkus-native-example](https://github.com/arangodb-helper/arango-quarkus-native-example) +- [arango-helidon-native-example](https://github.com/arangodb-helper/arango-helidon-native-example) diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-6/driver-setup.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-6/driver-setup.md new file mode 100644 index 0000000000..560cf07c80 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-6/driver-setup.md @@ -0,0 +1,276 @@ +--- +title: Driver setup (version 6) +menuTitle: Driver Setup +weight: 5 +description: >- + Driver setup (version 6) +--- +{{< warning >}} +Version 6 reached End of Life (EOL) and is not actively developed anymore. +Upgrading to version 7 is recommended. +{{< /warning >}} + +Setup with default configuration, this automatically loads a properties file +`arangodb.properties` if exists in the classpath: + +```java +// this instance is thread-safe +ArangoDB arangoDB = new ArangoDB.Builder().build(); +``` + +The driver is configured with some default values: + +| property-key | description | default value | +|--------------------------|-----------------------------------------|----------------| +| arangodb.hosts | ArangoDB hosts | 127.0.0.1:8529 | +| arangodb.timeout | connect & request timeout (millisecond) | 0 | +| arangodb.user | Basic Authentication User | root | +| arangodb.password | Basic Authentication Password | | +| arangodb.jwt | Authentication JWT | | +| arangodb.useSsl | use SSL connection | false | +| arangodb.chunksize | VelocyStream Chunk content-size (bytes) | 30000 | +| arangodb.connections.max | max number of connections | 1 VST, 20 HTTP | +| arangodb.protocol | used network protocol | VST | + +To customize the configuration the parameters can be changed in the code... + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .host("192.168.182.50", 8888) + .build(); +``` + +... or with a custom properties file (my.properties) + +```java +InputStream in = MyClass.class.getResourceAsStream("my.properties"); +ArangoDB arangoDB = new ArangoDB.Builder() + .loadProperties(in) + .build(); +``` + +Example for arangodb.properties: + +``` +arangodb.hosts=127.0.0.1:8529,127.0.0.1:8529 +arangodb.user=root +arangodb.password= +``` + +## Network protocol + +The drivers default used network protocol is the binary protocol VelocyStream +which offers the best performance within the driver. To use HTTP, you have to +set the configuration `useProtocol` to `Protocol.HTTP_JSON` for HTTP with JSON +content or `Protocol.HTTP_VPACK` for HTTP with +[VelocyPack](https://github.com/arangodb/velocypack/blob/master/VelocyPack.md) content. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .useProtocol(Protocol.VST) + .build(); +``` + +In addition to set the configuration for HTTP you have to add the +apache httpclient to your classpath. + +```xml +<dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.5.1</version> +</dependency> +``` + +**Note**: If you are using ArangoDB 3.0.x you have to set the protocol to +`Protocol.HTTP_JSON` because it is the only one supported. + +## SSL + +To use SSL, you have to set the configuration `useSsl` to `true` and set a `SSLContext` +(see [example code](https://github.com/arangodb/arangodb-java-driver/blob/v6/src/test/java/com/arangodb/example/ssl/SslExampleTest.java)). + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .useSsl(true) + .sslContext(sc) + .build(); +``` + +No additional configuration is required to use TLSv1.3 (if available on the +server side), but a JVM that supports it is required (OpenJDK 11 or later, or +distributions of Java 8 with TLSv1.3 support). + +## Connection Pooling + +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(); +``` + +The driver does not explicitly release connections. To avoid exhaustion of +resources when no connection is needed, you can clear the connection pool +(close all connections to the server) or use [connection TTL](#connection-time-to-live). + +```java +arangoDB.shutdown(); +``` + +{{< info >}} +Opening and closing connections very frequently can exhaust the amount of +connections allowed by the operating system. TCP connections enter a special +state `WAIT_TIME` after close, and typically remain in this state for two +minutes (maximum segment life * 2). These connections count towards the global +limit, which depends on the operating system but is usually around 28,000. +Connections should thus be reused as much as possible. + +You may run into this problem if you bypass the driver's safe guards by +setting a very high connection limit or by using multiple ArangoDB objects +and thus pools. +{{< /info >}} + +## Thread Safety + +The driver can be used concurrently by multiple threads. +All the following classes are thread safe: +- `com.arangodb.ArangoDB` +- `com.arangodb.ArangoDatabase` +- `com.arangodb.ArangoCollection` +- `com.arangodb.ArangoGraph` +- `com.arangodb.ArangoVertexCollection` +- `com.arangodb.ArangoEdgeCollection` +- `com.arangodb.ArangoView` +- `com.arangodb.ArangoSearch` + +Any other class should not be considered thread safe. In particular classes +representing request options (package `com.arangodb.model`) and response entities +(package `com.arangodb.entity`) are not thread safe. + +## Fallback hosts + +The driver supports configuring multiple hosts. The first host is used to open a +connection to. When this host is not reachable the next host from the list is used. +To use this feature just call the method `host(String, int)` multiple times. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .host("host1", 8529) + .host("host2", 8529) + .build(); +``` + +Since version 4.3 the driver support acquiring a list of known hosts in a +cluster setup or a single server setup with followers. For this the driver has +to be able to successfully open a connection to at least one host to get the +list of hosts. Then it can use this list when fallback is needed. To use this +feature just pass `true` to the method `acquireHostList(boolean)`. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .acquireHostList(true) + .build(); +``` + +## Load Balancing + +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. + +```java +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) + .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`. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .loadBalancingStrategy(LoadBalancingStrategy.ONE_RANDOM) + .acquireHostList(true) + .build(); +``` + +## Active Failover + +In case of an _Active Failover_ deployment the driver should be configured in +the following way: +- the load balancing strategy must be either set to `LoadBalancingStrategy.NONE` + or not set at all, since that would be the default +- `acquireHostList` should be set to `true` + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .loadBalancingStrategy(LoadBalancingStrategy.NONE) + .acquireHostList(true) + .build(); +``` + +## Connection time to live + +Since version 4.4 the driver supports setting a TTL (time to life) in milliseconds +for connections managed by the internal connection pool. + +```java +ArangoDB arango = new ArangoDB.Builder() + .connectionTtl(5 * 60 * 1000) + .build(); +``` + +In this example all connections will be closed/reopened after 5 minutes. + +Connection TTL can be disabled setting it to `null`: + +```java +.connectionTtl(null) +``` + +The default TTL is `null` (no automatic connection closure). + +## VST Keep-Alive + +Since version 6.8 the driver supports setting keep-alive interval (in seconds) +for VST connections. If set, every VST connection will perform a no-op request +at the specified intervals, to avoid to be closed due to inactivity by the +server (or by the external environment, e.g. firewall, intermediate routers, +operating system, ... ). + +This option can be set using the key `arangodb.connections.keepAlive.interval` +in the properties file or programmatically from the driver builder: + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .keepAliveInterval(1800) // 30 minutes + .build(); +``` + +If not set or set to `null` (default), no keep-alive probes will be sent. diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-6/serialization.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-6/serialization.md new file mode 100644 index 0000000000..deca0f27ed --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-6/serialization.md @@ -0,0 +1,236 @@ +--- +title: Serialization (version 6) +menuTitle: Serialization +weight: 10 +description: >- + Serialization (version 6) +--- +{{< warning >}} +Version 6 reached End of Life (EOL) and is not actively developed anymore. +Upgrading to version 7 is recommended. +{{< /warning >}} + +While older versions of the driver used mapping features provided by the +`velocypack` library, nowadays it is recommended to use +[jackson-dataformat-velocypack](https://github.com/arangodb/jackson-dataformat-velocypack), +which is a VelocyPack dataformat backend for [Jackson](https://github.com/FasterXML/jackson), +supporting the Streaming, Data Binding and Tree Model API styles. + +## Import in Maven + +To add it to your Maven project, add the following to `pom.xml`: + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>jackson-dataformat-velocypack</artifactId> + <version>...</version> + </dependency> +</dependencies> +``` + +The package also depends on `jackson-core`, `jackson-databind` and +`jackson-annotations` packages, but when using build tools like Maven or +Gradle, dependencies are automatically included. You may however want to +use [jackson-bom](https://github.com/FasterXML/jackson-bom) +to ensure dependency convergence across the entire project, for example in case +there are in your project other libraries depending on different versions of +the same Jackson packages. + +```xml +<dependencyManagement> + <dependencies> + <dependency> + <groupId>com.fasterxml.jackson</groupId> + <artifactId>jackson-bom</artifactId> + <version>...</version> + <scope>import</scope> + <type>pom</type> + </dependency> + </dependencies> +</dependencyManagement> +``` + +`jackson-dataformat-velocypack` is compatible with Jackson 2.10, 2.11, 2.12, and 2.13. + +## Configure + +Create an instance of `ArangoJack`, optionally configure the underlying +`ObjectMapper` and pass it to the driver through +`ArangoDB.Builder.serializer(ArangoSerialization)`: + +```java +ArangoJack arangoJack = new ArangoJack(); +arangoJack.configure((mapper) -> { + // your configuration here +}); +ArangoDB arango = new ArangoDB.Builder() + .serializer(arangoJack) + // ... + .build(); +``` + +where the lambda argument `mapper` is an instance of `VPackMapper`, subclass +of `ObjectMapper`. See +[Jackson Databind](https://github.com/FasterXML/jackson-databind/wiki/JacksonFeatures) +configurable features. + +## Mapping API + +The library is fully compatible with [Jackson Databind](https://github.com/FasterXML/jackson-databind) +API. To customize the serialization and deserialization behavior using the +Jackson Data Binding API, entities can be annotated with +[Jackson Annotations](https://github.com/FasterXML/jackson-annotations). +For more advanced customizations refer to [Custom serializer](#custom-serializer) section. + +### Renaming Properties + +To use a different serialized name for a field, use the annotation +`@JsonProperty`. + +```java +public class MyObject { + + @JsonProperty("title") + private String name; + + // ... +} +``` + +### Ignoring properties + +To ignore fields use the annotation `@JsonIgnore`. + +```java +public class Value { + @JsonIgnore + public int internalValue; +} +``` + +## Custom serializer + +The serialization and deserialization can be customized using the lower level +Streaming API or the Tree Model API, creating and registering respectively +`JsonSerializer<T>` and `JsonDeserializer<T>`, as specified by the Jackson API +for [CustomSerializers](https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers). + +```java +static class PersonSerializer extends JsonSerializer<Person> { + @Override + public void serialize(Person value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // example using the Streaming API + gen.writeStartObject(); + gen.writeFieldName("name"); + gen.writeString(value.name); + gen.writeEndObject(); + } +} + +static class PersonDeserializer extends JsonDeserializer<Person> { + @Override + public Person deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException { + // example using the Tree Model API + Person person = new Person(); + JsonNode rootNode = parser.getCodec().readTree(parser); + JsonNode nameNode = rootNode.get("name"); + if (nameNode != null && nameNode.isTextual()) { + person.name = nameNode.asText(); + } + return person; + } +} + +// registering using annotation +@JsonSerialize(using = PersonSerializer.class) +public static class Person { + public String name; +} + +// ... + +// registering programmatically +ArangoJack arangoJack = new ArangoJack(); +arangoJack.configure((mapper) -> { + SimpleModule module = new SimpleModule("PersonModule"); + module.addDeserializer(Person.class, new PersonDeserializer()); + mapper.registerModule(module); +}); +ArangoDB arangoDB = new ArangoDB.Builder().serializer(arangoJack).build(); +``` + +## Jackson datatype and language modules + +The `VPackMapper` can be configured +with [Jackson datatype modules](https://github.com/FasterXML/jackson#third-party-datatype-modules) +as well as [Jackson JVM Language modules](https://github.com/FasterXML/jackson#jvm-language-modules). + +### Kotlin + +[Kotlin language module](https://github.com/FasterXML/jackson-module-kotlin) +enables support for Kotlin native types and can be registered in the following way: + +```kotlin +val arangoDB = ArangoDB.Builder() + .serializer(ArangoJack().apply { + configure { it.registerModule(KotlinModule()) } + }) + .build() +``` + +### Scala + +[Scala language module](https://github.com/FasterXML/jackson-module-scala) +enables support for Scala native types and can be registered in the following way: + +```scala +val arangoJack = new ArangoJack() +arangoJack.configure(mapper => mapper.registerModule(DefaultScalaModule)) + +val arangoDB = new ArangoDB.Builder() + .serializer(arangoJack) + .build() +``` + +### Java 8 types + +Support for Java 8 features is offered by +[jackson-modules-java8](https://github.com/FasterXML/jackson-modules-java8). + +### Joda types + +Support for Joda data types, such as DateTime, is offered by +[jackson-datatype-joda](https://github.com/FasterXML/jackson-datatype-joda). + +## Metadata fields + +To map Arango metadata fields (like `_id`, `_key`, `_rev`, `_from`, `_to`) in +your entities, use the annotation `DocumentField`. + +```java +public class MyObject { + + @DocumentField(Type.KEY) + private String key; + + // ... +} +``` + +## Manual serialization + +To de-/serialize from and to VelocyPack before or after a database call, use the +`ArangoUtil` from the method `util()` in `ArangoDB`, `ArangoDatabase`, +`ArangoCollection`, `ArangoGraph`, `ArangoEdgeCollection`or `ArangoVertexCollection`. + +```java +ArangoDB arangoDB=new ArangoDB.Builder(); + VPackSlice vpack=arangoDB.util(CUSTOM).serialize(myObj); +``` + +```java +ArangoDB arangoDB=new ArangoDB.Builder(); + MyObject myObj=arangoDB.util(CUSTOM).deserialize(vpack,MyObject.class); +``` diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-7/_index.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/_index.md new file mode 100644 index 0000000000..52f8726704 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/_index.md @@ -0,0 +1,7 @@ +--- +title: ArangoDB Java Driver version 7 +menuTitle: Reference version 7 +weight: 5 +description: >- + The official ArangoDB Java Driver version 7 +--- diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-7/changes-in-version-7.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/changes-in-version-7.md new file mode 100644 index 0000000000..6025d9b2b6 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/changes-in-version-7.md @@ -0,0 +1,459 @@ +--- +title: Changes in version 7 +menuTitle: Changes in version 7 +weight: 15 +description: >- + Various detailed have changed, like the setup, transport, configuration, + serialization, and some of the APIs +--- +## Maven Setup + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-java-driver</artifactId> + <version>7.x.x</version> + </dependency> +<dependencies> +``` + +Substitute `7.x.x` with the latest available driver version. + +## Gradle Setup + +```groovy +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.arangodb:arangodb-java-driver:7.x.x' +} +``` + +## HTTP client + +The HTTP client has been changed to [Vert.x WebClient](https://vertx.io/docs/vertx-web-client/java/). + +`HTTP/2` is now supported. +`HTTP/2` supports multiplexing and uses `1` connection per host by default. + +Cookies are not supported anymore: cookies received in the response are ignored. + +## Configuration changes + +The default communication protocol is now `HTTP2_JSON` (`HTTP/2` with `JSON` content type). + +The default host configuration to `127.0.0.1:8529` has been removed. + +Configuration properties are not read automatically from properties files anymore. +A new API for loading properties has been introduced: +`ArangoDB.Builder.loadProperties(ArangoConfigProperties)`. +Implementations can supply configuration properties coming from different sources, +like system properties, remote stores, frameworks integrations, etc. +An implementation for loading properties from local files is provided by +`ArangoConfigProperties.fromFile()` and its overloaded variants. + +Example of how to read config properties prefixed with `arangodb` from +`arangodb.properties` file (as in version `6`): + +```java +// ## src/main/resources/arangodb.properties +// arangodb.hosts=172.28.0.1:8529 +// arangodb.password=test +// ... + +ArangoConfigProperties props = ArangoConfigProperties.fromFile(); +``` + +To read config properties from `arangodb-with-prefix.properties` file, where the +config properties are prefixed with `adb`: + +```java +// ## src/main/resources/arangodb-with-prefix.properties +// adb.hosts=172.28.0.1:8529 +// adb.password=test +// ... + +ArangoConfigProperties props = ArangoConfigProperties.fromFile("arangodb-with-prefix.properties", "adb"); +``` + +See the related reference documentation about +[Config File Properties](driver-setup.md#config-file-properties) +for details. + +Examples showing how to provide configuration properties from different sources: +- [Eclipse MicroProfile Config](https://github.com/arangodb-helper/arango-quarkus-native-example/blob/master/src/main/java/com/arangodb/ArangoConfig.java) +- [Micronaut Configuration](https://github.com/arangodb-helper/arango-micronaut-native-example/blob/main/src/main/kotlin/com/example/ArangoConfig.kt) + +## Modules + +Support for different serdes and communication protocols is offered by separate modules. +Default modules are transitively included, but they could be excluded if not needed. + +The main driver artifact `com.arangodb:arangodb-java-driver` has transitive dependencies on default modules: +- `com.arangodb:http-protocol`: `HTTP` communication protocol (HTTP/1.1 and HTTP/2) +- `com.arangodb:jackson-serde-json`: `JSON` user-data serde module based on Jackson Databind + +Alternative modules are respectively: +- `com.arangodb:vst-protocol`: `VST` communication protocol +- `com.arangodb:jackson-serde-vpack`: `VPACK` user-data serde module based on Jackson Databind + +The modules above are discovered and loaded using SPI (Service Provider Interface). + +In case a non-default communication protocol or user serde are used, the related module(s) +must be explicitly included and the corresponding default module(s) can be excluded. + +For example, to use the driver with `VPACK` over `VST`, we must include: +- `com.arangodb:vst-protocol` and +- `com.arangodb:jackson-serde-vpack` + +and can exclude: +- `com.arangodb:http-protocol` and +- `com.arangodb:jackson-serde-json` + +For example in Maven: + +```xml +<dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-java-driver</artifactId> + <exclusions> + <exclusion> + <groupId>com.arangodb</groupId> + <artifactId>http-protocol</artifactId> + </exclusion> + <exclusion> + <groupId>com.arangodb</groupId> + <artifactId>jackson-serde-json</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>vst-protocol</artifactId> + </dependency> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>jackson-serde-vpack</artifactId> + </dependency> +</dependencies> +``` + +## Transitive dependencies + +`com.arangodb:arangodb-java-driver` has transitive dependencies on `jackson-core`, +`jackson-databind`, and `jackson-annotations`, using by default version `2.14`. + +The versions of such libraries can be overridden. +The driver is compatible with Jackson 2 (at least `2.10` or greater). + +To do this, you might need to include [jackson-bom](https://github.com/FasterXML/jackson-bom) +to ensure dependency convergence across the entire project, for example in case +there are in your project other libraries depending on different versions of Jackson: + +```xml +<dependencyManagement> + <dependencies> + <dependency> + <groupId>com.fasterxml.jackson</groupId> + <artifactId>jackson-bom</artifactId> + <version>x.y.z</version> + <scope>import</scope> + <type>pom</type> + </dependency> + </dependencies> +</dependencyManagement> +``` + +Substitute `x.y.z` with the latest stable version. + +The module `http-protocol` has transitive dependency on `io.vertx:vertx-web-client`, +which in turn depends on packages from `io.netty`. + +If these dependency requirements cannot be satisfied, i.e. they cause convergence +conflicts with other versions of same packages in the classpath, you might need +to use the [shaded version](#arangodb-java-driver-shaded) of this driver, which +bundles all modules together with relocated external dependencies. + +The dependency on `com.arangodb:velocypack` has been removed from core module and +is now only used as internal dependency by `com.arangodb:vst-protocol` and +`com.arangodb:jackson-serde-vpack`, thus transitively imported only when using +`VST` protocol or `VPACK` content type. + +## User Data + +Before version 7.0, the driver always parsed raw strings as JSON, but unfortunately +this did not allow to distinguish it from the case when the intent is to use the +raw string as such, without parsing it. From version 7.0 onward, strings are not +interpreted as JSON anymore. To represent user-data as raw JSON, the wrapper +class `com.arangodb.util.RawJson` has been added: + +```java +RawJson rawJsonIn = RawJson.of(""" + {"foo":"bar"} + """); +ArangoCursor<RawJson> res = adb.db().query("RETURN @v", RawJson.class, Map.of("v", rawJsonIn)); +RawJson rawJsonOut = res.next(); +String json = rawJsonOut.get(); // {"foo":"bar"} +``` + +To represent user-data already encoded as byte array, the wrapper class `RawBytes` +has been added. The byte array can either represent a `JSON` string (UTF-8 encoded) +or a `VPACK` value. The format used should match the driver protocol configuration +(`JSON` for `HTTP_JSON` and `HTTP2_JSON`, otherwise `VPACK`). + +The following changes have been applied to `com.arangodb.entity.BaseDocument` +and `com.arangodb.entity.BaseEdgeDocument`: +- new method `removeAttribute(String)` +- `getProperties()` returns an unmodifiable map + +Before version 7.0, when performing write operations, the metadata of the input +data objects was updated in place with the metadata received in the response. +From version 7.0 onward, the input data objects passed as arguments to API methods +are treated as immutable and the related metadata fields are not updated anymore. +The updated metadata can be found in the returned object. + +## Serialization / Deserialization + +Up to version 6, the (de)serialization was always performed to/from `VPACK`. +In case the JSON format was required, the raw `VPACK` was then converted to `JSON`. +From version 7 onward, the serialization module is a dataformat-agnostic API. +Implementations can serialize and deserialize directly to the target dataformat, +without intermediate conversion to `VPACK`. The default implementation uses the +`JSON` format. + +Support for data type `VPackSlice` has been removed in favor of Jackson type +`com.fasterxml.jackson.databind.JsonNode` and its subclasses +(`ArrayNode`, `ObjectNode`, ...), for example: + +```java +JsonNode jsonNodeIn = JsonNodeFactory.instance + .objectNode() + .put("foo", "bar"); + +ArangoCursor<JsonNode> res = adb.db().query("RETURN @v", JsonNode.class, Map.of("v", jsonNodeIn)); +JsonNode jsonNodeOut = res.next(); +String foo = jsonNodeOut.get("foo").textValue(); // bar +``` + +The dependency on `com.arangodb:velocypack` has been removed. Since version 3.0, +`com.arangodb:velocypack` does not include databind functionalities anymore. +It only offers a lower level API to deal with primitive `VPACK` types. +`VPACK` databind functionalities are now offered by +[`jackson-dataformat-velocypack`](https://github.com/arangodb/jackson-dataformat-velocypack), +which is a Jackson backend for `VPACK` dataformat. + +The user-data custom serializer implementation `ArangoJack` has been removed in +favor of `com.arangodb.serde.jackson.JacksonSerde`. This allows using Jackson API +to serialize and deserialize user-data, compatible with both `JSON` and `VPACK`. + +See the detailed documentation about [Serialization](serialization.md) +for more information. + +## ArangoDB Java Driver Shaded + +From version 7 onward, a shaded variant of the driver is also published with +Maven coordinates: `com.arangodb:arangodb-java-driver-shaded`. + +It bundles and relocates the following packages: +- `com.fasterxml.jackson` +- `com.arangodb.jackson.dataformat.velocypack` +- `io.vertx` +- `io.netty` + +Note that the **internal serde** internally uses Jackson classes from +`com.fasterxml.jackson` that are relocated to `com.arangodb.shaded.fasterxml.jackson`. +Therefore, the **internal serde** of the shaded driver is not compatible with +Jackson annotations and modules from package`com.fasterxml.jackson`, but only +with their relocated variants. In case the **internal serde** is used as +**user-data serde**, the annotations from package `com.arangodb.serde` can be +used to annotate fields, parameters, getters and setters for mapping values +representing ArangoDB documents metadata (`_id`, `_key`, `_rev`, `_from`, `_to`): +- `@InternalId` +- `@InternalKey` +- `@InternalRev` +- `@InternalFrom` +- `@InternalTo` + +These annotations are compatible with relocated Jackson classes. +Note that the **internal serde** is not part of the public API and could change +in future releases without notice, thus breaking client applications relying on +it to serialize or deserialize user-data. It is therefore recommended also in +this case either: +- using the default user-data serde `JacksonSerde` (from packages `com.arangodb:jackson-serde-json` or +`com.arangodb:jackson-serde-vpack`), or +- providing a custom user-data serde implementation via `ArangoDB.Builder.serde(ArangoSerde)`. + +## Removed APIs + +The following client APIs have been removed: + +- client APIs already deprecated in Java Driver version `6` +- client API to interact with deprecated server APIs: + - `MMFiles` related APIs + - `ArangoDatabase.executeTraversal()` + - `ArangoDB.getLogs()` + - `minReplicationFactor` in collections and graphs + - `overwrite` flag in `DocumentCreateOptions` + - `hash` and `skipList` indexes + +The user-data custom serializer implementation `ArangoJack` has been removed in +favor of `com.arangodb.serde.jackson.JacksonSerde`. + +Support for interpreting raw strings as JSON has been removed +(in favor of `com.arangodb.util.RawJson`). + +Support of data type `com.arangodb.velocypack.VPackSlice` has been removed in +favor of Jackson type `com.fasterxml.jackson.databind.JsonNode` and its subclasses +(`ArrayNode`, `ObjectNode`, ...). Raw `VPACK` data can now be used with +`com.arangodb.util.RawBytes`. + +Support for custom initialization of cursors +(`ArangoDB._setCursorInitializer(ArangoCursorInitializer cursorInitializer)`) +has been removed. + +## Async API + +From version 7.2 onward, the driver provides a new asynchronous API. +Unlike in version 6, the asynchronous API is based on the same underlying driver +instance and therefore supports all the communication protocols and configurations +of the synchronous API. The asynchronous API is accessible via `ArangoDB#async()`, +for example: + +```java +ArangoDB adb = new ArangoDB.Builder() + // ... + .build(); +ArangoDBAsync adbAsync = adb.async(); +CompletableFuture<ArangoDBVersion> version = adbAsync.getVersion(); +// ... +``` + +Under the hood, both synchronous and asynchronous API use the same internal +communication layer, which has been reworked and re-implemented in an +asynchronous way. The synchronous API blocks and waits for the result, while the +asynchronous one returns a `CompletableFuture<>` representing the pending +operation being performed. +Each asynchronous API method is equivalent to the corresponding synchronous +variant, except for the Cursor API. + +### Async Cursor API + +The Cursor API (`ArangoCursor` and `ArangoCursorAsync`) is intrinsically different, +because the synchronous Cursor API is based on Java's `java.util.Iterator`, which +is an interface only suitable for synchronous scenarios. +On the other side, the asynchronous Cursor API provides a method +`com.arangodb.ArangoCursorAsync#nextBatch()`, which returns a +`CompletableFuture<ArangoCursorAsync<T>>` and can be used to consume the next +batch of the cursor, for example: + +```java +CompletableFuture<ArangoCursorAsync<Integer>> future1 = adbAsync.db() + .query("FOR i IN i..10000", Integer.class); +CompletableFuture<ArangoCursorAsync<Integer>> future2 = future1 + .thenCompose(c -> { + List<Integer> batch = c.getResult(); + // ... + // consume batch + // ... + return c.nextBatch(); + }); +// ... +``` + +## API methods changes + +Before version 7.0, some CRUD API methods inferred the return type from the type +of the data object passed as input. Now, the return type can be explicitly set +for each CRUD API method. This type is used as deserialization target by the +user-data serde. In particular, no automatic type inference is performed anymore in: +- `ArangoCollection.insertDocuments()` +- `ArangoCollection.replaceDocuments()` +- `ArangoCollection.updateDocuments()` +- `ArangoCollection.deleteDocuments()` + +Unless specified explicitly, the target deserialization type is `Void.class`, +thus allowing only `null` values. + +CRUD operations operating with multiple documents have now an overloaded variant +which accepts raw data (`RawBytes` and `RawJson`) containing multiple documents. + +CRUD operations operating with multiple documents with parametric types are now covariant: +- `ArangoCollection.insertDocuments(Collection<? extends T>, DocumentCreateOptions, Class<T>)` +- `ArangoCollection.replaceDocuments(Collection<? extends T>, DocumentReplaceOptions, Class<T>)` + +`com.arangodb.Request` and `com.arangodb.Response` classes have been refactored +to support generic body type. `ArangoDB.execute(Request<T>, Class<U>): Response<U>` +accepts now the target deserialization type for the response body. + +`com.arangodb.ArangoDBException` has been enhanced with the id of the request +causing it. This can be useful to correlate it with the debug level logs. + +Graph API has been updated (#486): +- added `com.arangodb.ArangoEdgeCollection.drop()` and overloads +- added `com.arangodb.ArangoVertexCollection.drop(VertexCollectionDropOptions)` +- updated `com.arangodb.ArangoGraph.replaceEdgeDefinition()` + +`ArangoDatabase.getDocument()` has been removed, in favor of `ArangoCollection.getDocument()`. + +`ArangoDatabase.query()` overloaded variants have now a different order of parameters: +- `query(String query, Class<T> type)` +- `query(String query, Class<T> type, AqlQueryOptions options)` +- `query(String query, Class<T> type, Map<String,Object> bindVars)` +- `query(String query, Class<T> type, Map<String,Object> bindVars, AqlQueryOptions options)` + +The class `com.arangodb.DbName` has been removed. The database names can now be +passed as `String`. Support to UTF-8 characters in data definition names +(databases, collections, Views, indexes) has been added, see +[Support for extended naming constraints](../_index.md#support-for-extended-naming-constraints). + +The name of `ArangoCollection` and `ArangoView` API classes are now final. +The related rename methods: +- `com.arangodb.ArangoCollection.rename(String)` +- `com.arangodb.ArangoView.rename(String)` + +Do not change anymore the collection or view name of the instance of the related +API class on which it is invoked. To interact with the renamed collection, a new +instance of `ArangoCollection` with the new name must be created. + +## API entities + +All entities and options classes (in packages `com.arangodb.model` and +`com.arangodb.entity`) are now `final`. + +The replication factor is now modeled with a new interface +(`com.arangodb.entity.ReplicationFactor`) with implementations: +`NumericReplicationFactor` and `SatelliteReplicationFactor`. + +Cursor statistics are now in `com.arangodb.entity.CursorStats`. + +## GraalVM Native Image + +The driver supports GraalVM Native Image compilation. +To compile with `--link-at-build-time` when `http-protocol` module is present in +the classpath, additional substitutions are be required for its transitive +dependencies (`Netty` and `Vert.x`). See this +[example](https://github.com/arangodb/arangodb-java-driver/tree/main/test-functional/src/test-default/java/graal) +for reference. Such substitutions are not required when compiling the shaded driver. + +### Framework compatibility + +The driver can be used in the following frameworks that support +GraalVM Native Image generation: + +- [Quarkus](https://quarkus.io), see [arango-quarkus-native-example](https://github.com/arangodb-helper/arango-quarkus-native-example) +- [Helidon](https://helidon.io), see [arango-helidon-native-example](https://github.com/arangodb-helper/arango-helidon-native-example) +- [Micronaut](https://micronaut.io), see [arango-micronaut-native-example](https://github.com/arangodb-helper/arango-micronaut-native-example) + +## Migration + +To migrate your existing project to Java Driver version 7.0, it is recommended +first updating to the latest version of branch `6` and make sure that your code +does not use any deprecated API. This can be done by checking the presence of +deprecation warnings in the Java compiler output. + +The deprecation notes in the related JavaDoc contain information about the +reason of the deprecation and suggest migration alternatives to use. diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-7/driver-setup.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/driver-setup.md new file mode 100644 index 0000000000..ae859b46b4 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/driver-setup.md @@ -0,0 +1,326 @@ +--- +title: Driver setup +menuTitle: Driver Setup +weight: 5 +description: >- + How to connect your Java application to an ArangoDB server, as well as + important configuration settings and information about the driver +--- +The driver can be configured and instantiated using `com.arangodb.ArangoDB.Builder`: + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + // ... + .build(); +``` + +To customize the configuration properties can be set programmatically in the builder: + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .host("127.0.0.1",8529) + // ... + .build(); +``` + +or providing an implementation of `com.arangodb.config.ArangoConfigProperties` +to the builder: + +```java +ArangoConfigProperties props = ... +ArangoDB arangoDB = new ArangoDB.Builder() + .loadProperties(props) + // ... + .build(); +``` + +Implementations of `com.arangodb.config.ArangoConfigProperties` could supply +configuration properties coming from different sources, eg. system properties, +remote stores, frameworks integrations, etc. +An implementation for loading properties from local files is provided by +`ArangoConfigProperties.fromFile()` and its overloaded variants. + +To read config properties prefixed with `arangodb` from `arangodb.properties` +file: + +```java +// ## src/main/resources/arangodb.properties +// arangodb.hosts=172.28.0.1:8529 +// arangodb.password=test +// ... + +ArangoConfigProperties props = ArangoConfigProperties.fromFile(); +``` + +To read config properties from `arangodb-with-prefix.properties` file, where the +config properties are prefixed with `adb`: + +```java +// ## src/main/resources/arangodb-with-prefix.properties +// adb.hosts=172.28.0.1:8529 +// adb.password=test +// ... + +ArangoConfigProperties props = ArangoConfigProperties.fromFile("arangodb-with-prefix.properties", "adb"); +``` + +Here are examples to integrate configuration properties from different sources: +- [Eclipse MicroProfile Config](https://github.com/arangodb-helper/arango-quarkus-native-example/blob/master/src/main/java/com/arangodb/ArangoConfig.java) +- [Micronaut Configuration](https://github.com/arangodb-helper/arango-micronaut-native-example/blob/main/src/main/kotlin/com/example/ArangoConfig.kt) + +## Configuration + +`ArangoDB.Builder` has the following configuration methods: + +- `host(String, int)`: Adds a host (hostname and port) to connect to, multiple hosts can be added +- `protocol(Protocol)`: Communication protocol, possible values are: `VST`, `HTTP_JSON`, `HTTP_VPACK`, `HTTP2_JSON`, `HTTP2_VPACK`, (default: `HTTP2_JSON`) +- `timeout(Integer)`: Connection and request timeout (ms), (default `0`, no timeout) +- `user(String)`: Username for authentication, (default: `root`) +- `password(String)`: Password for authentication +- `jwt(String)`: JWT for authentication +- `useSsl(Boolean)`: Use SSL connection, (default: `false`) +- `sslContext(SSLContext)`: SSL context +- `sslCertValue(String)`: SSL certificate value as Base64-encoded String +- `sslAlgorithm(String)`: Name of the SSL Trust manager algorithm (default: `SunX509`) +- `sslProtocol(String)`: Name of the SSLContext protocol (default: `TLS`) +- `verifyHost(Boolean)`: Enable hostname verification, (HTTP only, default: `true`) +- `chunkSize(Integer)`: VST chunk size in bytes, (default: `30000`) +- `maxConnections(Integer)`: Max number of connections per host, (default: 1 VST, 1 HTTP/2, 20 HTTP/1.1) +- `connectionTtl(Long)`: Time to live of an inactive connection (ms), (default: `30_000` for HTTP, no TTL for VST) +- `keepAliveInterval(Integer)`: VST keep-alive interval (s), (default: no keep-alive probes will be sent) +- `acquireHostList(Boolean)`: Acquire the list of available hosts, (default: `false`) +- `acquireHostListInterval(Integer)`: The interval for acquiring the host list (ms), (default: `3_600_000`, 1 hour) +- `loadBalancingStrategy(LoadBalancingStrategy)`: Load balancing strategy, possible values are: `NONE`, `ROUND_ROBIN`, `ONE_RANDOM`, (default: `NONE`) +- `responseQueueTimeSamples(Integer)`: Amount of samples kept for queue time metrics, (default: `10`) +- `serde(ArangoSerde)`: Serde to serialize and deserialize user-data +- `serdeProviderClass(Class<? extends ArangoSerdeProvider>)`: Serde provider to be used to instantiate the user-data serde +- `protocolConfig(ProtocolConfig)`: Configuration specific for the used protocol provider implementation +- `pipelining(Boolean):`: Use HTTP pipelining, (`HTTP/1.1` only, default `false`) + +### HTTP Protocol Provider Configuration + +The `ProtocolConfig` for the default HTTP protocol provider can be created via: + +```java +HttpProtocolConfig.builder() + // ... + .build(); +``` + +and configured using the following builder methods: + +- `vertx(Vertx)`: Vert.x instance to use. If not set, a new instance is created. + +For example, to reuse the existing Vert.x instance: + +```java +HttpProtocolConfig.builder() + .protocolConfig(HttpProtocolConfig.builder() + .vertx(Vertx.currentContext().owner()) + .build() + ) + .build(); +``` + +### Config File Properties + +`ArangoConfigProperties.fromFile()` reads config properties prefixed with `arangodb` +from `arangodb.properties` file. Different prefix and +file name can be specified using its overloaded variants. + +The properties read are: +- `hosts`: comma-separated list of `<hostname>:<port>` entries +- `protocol`: `VST`, `HTTP_JSON`, `HTTP_VPACK`, `HTTP2_JSON` or `HTTP2_VPACK` +- `timeout` +- `user` +- `password` +- `jwt` +- `useSsl` +- `sslCertValue`: SSL certificate as Base64-encoded string +- `sslAlgorithm`: SSL trust manager algorithm (default: `SunX509`) +- `sslProtocol`: SSLContext protocol (default: `TLS`) +- `verifyHost` +- `chunkSize` +- `maxConnections` +- `connectionTtl` +- `keepAliveInterval` +- `acquireHostList` +- `acquireHostListInterval` +- `loadBalancingStrategy`: `NONE`, `ROUND_ROBIN` or `ONE_RANDOM` +- `responseQueueTimeSamples` +- `serdeProviderClass`: fully qualified name of the provider class +- `pipelining` + +## SSL + +To use SSL, you have to set the configuration `useSsl` to `true`. +By default, the driver uses the default `SSLContext`. +To change this, you can provide the `SSLContext` instance to use: + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .useSsl(true) + .sslContext(sc) + .build(); +``` + +Alternatively, the driver can create a new `SSLContext` using the provided +configuration. In this case, it is required to set the configuration `sslCertValue` +with the SSL certificate value as Base64-encoded String: + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .useSsl(true) + .sslCertValue("<certificate>") // SSL certificate as Base64-encoded String + .sslAlgorithm("SunX509") // SSL Trust manager algorithm (optional, default: SunX509) + .sslProtocol("TLS") // SSLContext protocol (optional, default: TLS) + .build(); +``` + +See the [example code](https://github.com/arangodb/arangodb-java-driver/blob/main/test-functional/src/test-ssl/java/com/arangodb/SslExampleTest.java) +for more details on SSL configuration. + +## Connection Pooling + +The driver keeps a pool of connections for each host, the max amount of +connections is configurable. + +Inactive connections are released after the configured connection time-to-live +(`ArangoDB.Builder.connectionTtl(Long)`) or when the driver is shut down: + +```java +arangoDB.shutdown(); +``` + +## Thread Safety + +The driver can be used concurrently by multiple threads. All the following +classes are thread safe: +- `com.arangodb.ArangoDB` +- `com.arangodb.ArangoDatabase` +- `com.arangodb.ArangoCollection` +- `com.arangodb.ArangoGraph` +- `com.arangodb.ArangoVertexCollection` +- `com.arangodb.ArangoEdgeCollection` +- `com.arangodb.ArangoView` +- `com.arangodb.ArangoSearch` + +Any other class should not be considered thread safe. In particular classes +representing request options (package `com.arangodb.model`) and response entities +(package `com.arangodb.entity`) are **not** thread safe. + +## Fallback hosts + +The driver supports configuring multiple hosts. The first host is used to open a +connection to. When this host is not reachable the next host from the list is used. +To use this feature just call the method `host(String, int)` multiple times. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .host("host1", 8529) + .host("host2", 8529) + .build(); +``` + +The driver is also able to acquire a list of known hosts in a cluster. For this the driver has +to be able to successfully open a connection to at least one host to get the +list of hosts. Then it can use this list when fallback is needed. To enable this +feature: + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .acquireHostList(true) + .build(); +``` + +## Load Balancing + +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. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .loadBalancingStrategy(LoadBalancingStrategy.ROUND_ROBIN) + .build(); +``` + +The second load balancing strategy picks a random host from host list +(configured or acquired) and sticks to it as long as the +connection is open. + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .loadBalancingStrategy(LoadBalancingStrategy.ONE_RANDOM) + .build(); +``` + +## Active Failover + +In case of an _Active Failover_ deployment the driver should be configured in +the following way: +- the load balancing strategy must be either set to `LoadBalancingStrategy.NONE` (default) +- `acquireHostList` should be set to `true` + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .loadBalancingStrategy(LoadBalancingStrategy.NONE) + .acquireHostList(true) + .build(); +``` + +## Connection time to live + +The driver supports setting a TTL (time to live) for connections: + +```java +ArangoDB arango = new ArangoDB.Builder() + .connectionTtl(5 * 60 * 1000) // ms + .build(); +``` + +In this example, inactive connections are closed after 5 minutes. + +The default TTL for HTTP connections is 30 seconds, while it is `null` for VST connections. + +If set to `null`, no automatic connection closure is performed. + +## Proxy configuration + +The driver allows configuring the underlying Vert.x WebClient to work +with HTTP proxies. The configuration is specific to the HTTP protocol +and uses the `io.vertx.core.net.ProxyOptions` class of +[Vert.x Core](https://www.javadoc.io/doc/io.vertx/vertx-core/4.5.7/io/vertx/core/net/ProxyOptions.html): + +```java +ArangoDB arango = new ArangoDB.Builder() + // ... + .protocolConfig(HttpProtocolConfig.builder() + .proxyOptions(new ProxyOptions() + .setType(ProxyType.HTTP) + .setHost("172.28.0.1") + .setPort(8888) + .setUsername("user") + .setPassword("password")) + .build()) + .build(); +``` + +## VST Keep-Alive + +The driver supports setting keep-alive interval (in seconds) +for VST connections. If set, every VST connection performs a no-op request +at the specified intervals, to avoid to be closed due to inactivity by the +server (or by the external environment, e.g. firewall, intermediate routers, +operating system, ... ). + +```java +ArangoDB arangoDB = new ArangoDB.Builder() + .keepAliveInterval(1_800) // 30 minutes + .build(); +``` + +If not set or set to `null` (default), no keep-alive probes will be sent. diff --git a/site/content/arangodb/oem/develop/drivers/java/reference-version-7/serialization.md b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/serialization.md new file mode 100644 index 0000000000..93dcf7a69f --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/java/reference-version-7/serialization.md @@ -0,0 +1,247 @@ +--- +title: Serialization +menuTitle: Serialization +weight: 10 +description: >- + The Java driver uses Jackson internally for serialization and deserialization + but you can use a custom implementation for user data +--- +The driver functionalities related to serialization and deserialization (serde) +are implemented by 2 different components: +- `internal serde` +- `user-data serde` + +The **internal serde** is based on [Jackson](https://github.com/FasterXML/jackson) +API and is responsible for serializing/deserializing data definition classes +(in packages `com.arangodb.model` and `com.arangodb.entity`). +This includes all the classes that are not user-data, such as metadata properties +for databases, collections, graphs, etc. + +Furthermore, it is used to serialize and deserialize user-data of the following managed types: +- `com.fasterxml.jackson.databind.JsonNode` and its subclasses (`ArrayNode`, `ObjectNode`, ...) +- `com.arangodb.util.RawJson` +- `com.arangodb.util.RawBytes` +- `com.arangodb.entity.BaseDocument` +- `com.arangodb.entity.BaseEdgeDocument` + +Note that in `arangodb-java-driver-shaded`, due to dependencies relocation, the +fully-qualified class name of first entry above (`JsonNode`) is: +`com.arangodb.shaded.fasterxml.jackson.databind.JsonNode`. +The same relocation rule is also applied to its subclasses (`ArrayNode`, `ObjectNode`, ...). + +The **user-data serde** is used to serialize and deserialize the user-data, +namely the data representing: +- documents +- vertexes +- edges +- AQL bind variables +- transactions parameters +- bodies of custom requests and custom responses (`com.arangodb.Request<T>` and `com.arangodb.Response<T>`). + +A `user-data serde` implements the `com.arangodb.serde.ArangoSerde` interface, +which is an abstract API with no dependencies on specific libraries. +The `user-data serde` can be explicitly registered via `ArangoDB.Builder#serde(ArangoSerde)`. +If no serde is registered, then the driver will use SPI (Service Provider Interface) to automatically +discover and load serde service providers (instances of `com.arangodb.serde.ArangoSerdeProvider`). +In case no `user-data serde` is explicitly registered and no serde service provider can be discovered via SPI, then the +**internal serde** will be used to serialize and deserialize user-data. In this case, please note that the +**internal serde** is not part of the public API and could change in future releases without notice, thus breaking +client applications relying on it to serialize or deserialize user-data. + +Examples of custom `user-data serde` implementations can be found here: +- [JSON_B serde](https://github.com/arangodb/arangodb-java-driver/tree/main/jsonb-serde/src/main/java/com/arangodb/serde/jsonb): + a custom serde implementation based on `JSON-B` (supporting `JSON` format only) +- [Micronaut Serialization serde](https://github.com/arangodb-helper/arango-micronaut-native-example/blob/main/src/main/kotlin/com/example/ArangoService.kt): + a custom serde implementation based on + [Micronaut Serialization](https://micronaut-projects.github.io/micronaut-serialization/latest/guide/index.html) + +## JacksonSerde (default user-data serde) + +The default `user-data serde` is `com.arangodb.serde.jackson.JacksonSerde`. +It is implemented delegating [Jackson](https://github.com/FasterXML/jackson) +`ObjectMapper`, thus compatible with Jackson Streaming, Data Binding and Tree Model API. + +It supports both `JSON` and `VPACK` data formats, while offering the same API to the user. + +The `JSON` implementation is provided by the +[`com.arangodb:jackson-serde-json` module](https://github.com/arangodb/arangodb-java-driver/tree/main/jackson-serde-json) +and transitively imported by `arangodb-java-driver`. This implementation is +used by default. + +The `VPACK` implementation is provided by the optional +[`com.arangodb:jackson-serde-vpack` module](https://github.com/arangodb/arangodb-java-driver/tree/main/jackson-serde-vpack), +which uses the [jackson-dataformat-velocypack](https://github.com/arangodb/jackson-dataformat-velocypack) +implementation internally. + +### Mapping API + +`JacksonSerde` is fully compatible with [Jackson Databind](https://github.com/FasterXML/jackson-databind) +API. To customize the serialization and deserialization behavior using the +Jackson Data Binding API, entities can be annotated with +[Jackson Annotations](https://github.com/FasterXML/jackson-annotations). +For more advanced customizations refer to [Custom serializer](#custom-serializers) section. + +### Document Annotations + +The annotations from package `com.arangodb.serde.jackson` can be used to annotate +fields, parameters, getters and setters for mapping values representing ArangoDB +documents metadata (`_id`, `_key`, `_rev`, `_from`, `_to`): +- `@Id` +- `@Key` +- `@Rev` +- `@From` +- `@To` + +### Renaming Properties + +To use a different serialized name for a field, use the annotation `@JsonProperty`. + +```java +public class MyObject { + @JsonProperty("title") + private String name; +} +``` + +### Ignoring properties + +To ignore fields use the annotation `@JsonIgnore`. + +```java +public class Value { + @JsonIgnore + public int internalValue; +} +``` + +### Custom Configuration + +Create an instance of `JacksonSerde`, configure the underlying `ObjectMapper` +and register it in the driver: + +```java +JacksonSerde serde = JacksonSerde.of(ContentType.JSON); +serde.configure((ObjectMapper mapper) -> { + // ... +}); + +ArangoDB adb = new ArangoDB.Builder() + .serde(serde) + // ... + .build(); +``` + +See also [Jackson Databind](https://github.com/FasterXML/jackson-databind/wiki/JacksonFeatures) +configurable features. + +### Custom serializers + +The serialization and deserialization can be customized using the lower level +Streaming API or the Tree Model API, creating and registering respectively +`JsonSerializer<T>` and `JsonDeserializer<T>`, as specified by the Jackson API +for [CustomSerializers](https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers). + +```java +static class PersonSerializer extends JsonSerializer<Person> { + @Override + public void serialize(Person value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // example using the Streaming API + gen.writeStartObject(); + gen.writeFieldName("name"); + gen.writeString(value.name); + gen.writeEndObject(); + } +} + +static class PersonDeserializer extends JsonDeserializer<Person> { + @Override + public Person deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException { + // example using the Tree Model API + Person person = new Person(); + JsonNode rootNode = parser.getCodec().readTree(parser); + JsonNode nameNode = rootNode.get("name"); + if (nameNode != null && nameNode.isTextual()) { + person.name = nameNode.asText(); + } + return person; + } +} + +// registering using annotation +@JsonSerialize(using = PersonSerializer.class) +public static class Person { + public String name; +} + +// registering programmatically +JacksonSerde serde = JacksonSerde.of(ContentType.JSON); +serde.configure(mapper -> { + SimpleModule module = new SimpleModule("PersonModule"); + module.addDeserializer(Person.class, new PersonDeserializer()); + mapper.registerModule(module); +}); + +ArangoDB adb = new ArangoDB.Builder() + .serde(serde) + // ... + .build(); +``` + +### Jackson datatype and language modules + +The `JacksonSerde` can be configured +with [Jackson datatype modules](https://github.com/FasterXML/jackson#third-party-datatype-modules) +as well as [Jackson JVM Language modules](https://github.com/FasterXML/jackson#jvm-language-modules). + +### Kotlin + +[Kotlin language module](https://github.com/FasterXML/jackson-module-kotlin) +enables support for Kotlin classes and types and can be registered in the following way: + +```kotlin +val arangoDB = ArangoDB.Builder() + .serde(JacksonSerde.of(ContentType.JSON).apply { + configure { it.registerModule(KotlinModule()) } + }) + .build() +``` + +### Scala + +[Scala language module](https://github.com/FasterXML/jackson-module-scala) +enables support for Scala classes and types and can be registered in the following way: + +```scala +val serde = JacksonSerde.of(ContentType.JSON) +serde.configure(mapper => mapper.registerModule(DefaultScalaModule)) + +val arangoDB = new ArangoDB.Builder() + .serde(arangoJack) + .build() +``` + +### Java 8 types + +Support for Java 8 features is offered by +[jackson-modules-java8](https://github.com/FasterXML/jackson-modules-java8). + +### Joda types + +Support for Joda data types, such as DateTime, is offered by +[jackson-datatype-joda](https://github.com/FasterXML/jackson-datatype-joda). + +### Metadata fields + +Metadata fields `_id`, `_key`, `_rev`, `_from`, `_to` can be mapped using +respectively the annotations (from package `com.arangodb.serde.jackson`): +`@Id`, `@Key`, `@Rev`, `@From`, `@To`. + +```java +public class MyObject { + + @Key + private String key; + + // ... +} +``` diff --git a/site/content/arangodb/oem/develop/drivers/javascript.md b/site/content/arangodb/oem/develop/drivers/javascript.md new file mode 100644 index 0000000000..5161b596b2 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/javascript.md @@ -0,0 +1,224 @@ +--- +title: ArangoDB JavaScript driver +menuTitle: JavaScript driver +weight: 25 +description: >- + arangojs is the JavaScript driver to access ArangoDB from outside the + database system, primarily with Node.js +aliases: + - nodejs # 3.12 -> 3.12 +--- +The official ArangoDB low-level JavaScript client. + +- Repository: <https://github.com/arangodb/arangojs> +- Reference: <http://arangodb.github.io/arangojs/> +- [Changelog](https://github.com/arangodb/arangojs/blob/main/CHANGELOG.md) + +{{< info >}} +If you are looking for the ArangoDB JavaScript API in +[Foxx](https://www.arangodb.com/community-server/foxx/) or the `arangosh` +interactive shell, please refer to the documentation about the +[`@arangodb` module](../javascript-api/@arangodb/_index.md) instead. + +The JavaScript driver is **only** meant to be used when accessing ArangoDB from +**outside** the database. +{{< /info >}} + +## Compatibility + +The arangojs driver is compatible with the latest stable version of ArangoDB +available at the time of the driver release and remains compatible with the two +most recent Node.js LTS versions in accordance with the official +[Node.js long-term support schedule](https://github.com/nodejs/LTS). +Versions of ArangoDB that have reached their [end of life](https://arangodb.com/subscriptions/end-of-life-notice/) +by the time of a driver release are explicitly not supported. + +The [_arangoVersion_ option](https://arangodb.github.io/arangojs/latest/types/configuration.ConfigOptions.html) +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`). + +## Versions + +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 + 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 + 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_ + changes that require changes in your code to upgrade. + +If you are getting weird errors or functions seem to be missing, make sure you +are using the latest version of the driver and following documentation written +for a compatible version. If you are following a tutorial written for an older +version of arangojs, you can install that version using the `<name>@<version>` +syntax: + +```sh +# for version 9.x.x +yarn add arangojs@9 +# - or - +npm install --save arangojs@9 +``` + +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). + +## Install + +{{< tabs "js-install" >}} + +{{< tab "Yarn" >}} +```sh +yarn add arangojs +``` +{{< /tab >}} + +{{< tab "NPM" >}} +```sh +npm install --save arangojs +``` +{{< /tab >}} + +{{< tab "From source" >}} +```bash +git clone https://github.com/arangodb/arangojs.git +cd arangojs +npm install +npm run build +``` + +Building natively on Windows is not supported but you can use a virtual Linux +or Linux container. +{{< /tab >}} + +{{< tab "For browsers" >}} +When using modern JavaScript tooling with a bundler and compiler (e.g. Babel), +arangojs can be installed using NPM or Yarn like any other dependency. + +You can also use [jsDelivr CDN](https://www.jsdelivr.com/) during development: + +```js +<script type="importmap"> + { + "imports": { + "arangojs": "https://cdn.jsdelivr.net/npm/arangojs@10.1.0/esm/index.js?+esm" + } + } +</script> +<script type="module"> + import { Database } from "arangojs"; + const db = new Database(); + // ... +</script> +``` +{{< /tab >}} + +{{< /tabs >}} + +## Basic usage example + +Modern JavaScript/TypeScript with async/await and ES Modules: + +```js +import { Database, aql } from "arangojs"; + +const db = new Database(); +const Pokemons = db.collection("my-pokemons"); + +async function main() { + try { + const pokemons = await db.query(aql` + FOR pokemon IN ${Pokemons} + FILTER pokemon.type == "fire" + RETURN pokemon + `); + console.log("My pokemans, let me show you them:"); + for await (const pokemon of pokemons) { + console.log(pokemon.name); + } + } catch (err) { + console.error(err.message); + } +} + +main(); +``` + +Using a different database: + +```js +const db = new Database({ + url: "http://127.0.0.1:8529", + databaseName: "pancakes", + auth: { username: "root", password: "hunter2" }, +}); + +// The credentials can be swapped at any time +db.useBasicAuth("admin", "maplesyrup"); +``` + +Old-school JavaScript with promises and CommonJS: + +```js +var arangojs = require("arangojs"); +var Database = arangojs.Database; + +var db = new Database(); +var pokemons = db.collection("pokemons"); + +db.query({ + query: "FOR p IN @@c FILTER p.type == 'fire' RETURN p", + bindVars: { "@c": "pokemons" }, +}) + .then(function (cursor) { + console.log("My pokemons, let me show you them:"); + return cursor.forEach(function (pokemon) { + console.log(pokemon.name); + }); + }) + .catch(function (err) { + console.error(err.message); + }); +``` + +For AQL, please check out the +[aql template tag](https://arangodb.github.io/arangojs/latest/functions/aql.aql.html) +for writing parametrized AQL queries without making your code vulnerable to +injection attacks. + +## Error responses + +If the server returns an ArangoDB error response, arangojs throws an `ArangoError` +with an `errorNum` property indicating the +[ArangoDB error code](../error-codes.md) and expose the response body +as the response property of the error object. + +For all other errors during the request/response cycle arangojs throws a +`NetworkError` or a more specific subclass thereof and expose the originating +request object as the `request` property of the error object. + +If the server responded with a non-2xx status code, this `NetworkError` is an +`HttpError` with a code property indicating the HTTP status code of the response +and a response property containing the `response` object itself. + +If the error is caused by an exception, the originating exception is available +as the `cause` property of the error object thrown by arangojs. +For network errors, this is often a `TypeError`. + +**Example** + +```js +try { + const info = await db.createDatabase("mydb"); + // database created +} catch (err) { + console.error(err.stack); +} +``` diff --git a/site/content/arangodb/oem/develop/drivers/python.md b/site/content/arangodb/oem/develop/drivers/python.md new file mode 100644 index 0000000000..bea8233d48 --- /dev/null +++ b/site/content/arangodb/oem/develop/drivers/python.md @@ -0,0 +1,329 @@ +--- +title: ArangoDB Python driver +menuTitle: Python driver +weight: 30 +description: >- + Python-Arango is the official ArangoDB driver that provides Python + applications with the complete range of features exposed by the server API +--- +The Python-Arango driver is the recommended driver for using ArangoDB as the +database backend from Python. It is maintained by ArangoDB and the community. + +- Repository: <https://github.com/ArangoDB-Community/python-arango> +- Reference: <https://docs.python-arango.com/> +- [Tutorial](https://university.arangodb.com/courses/python-driver-tutorial/) +- [Releases](https://github.com/ArangoDB-Community/python-arango/releases) + +## Installation + +The `python-arango` library can be used in any Python project that targets +Python version 3.8 or later. + +To install the library using PIP, run the following command in a terminal: + +```sh +pip install python-arango --upgrade +``` + +You can then import the library in your project as follows: + +```python +from arango import ArangoClient +``` + +## Get started + +The following example shows how to use the driver from connecting to ArangoDB, +over creating databases, collections, indexes, and documents, to retrieving +data using queries: + +```python +from arango import ArangoClient + +# Initialize the client for ArangoDB. +client = ArangoClient(hosts="http://localhost:8529") + +# Connect to "_system" database as root user. +sys_db = client.db("_system", username="root", password="passwd") + +# Create a new database named "test". +sys_db.create_database("test") + +# Connect to "test" database as root user. +db = client.db("test", username="root", password="passwd") + +# Create a new collection named "students". +students = db.create_collection("students") + +# Add a persistent index to the collection. +students.add_index({'type': 'persistent', 'fields': ['name'], 'unique': True}) + +# Insert new documents into the collection. +students.insert({"name": "jane", "age": 39}) +students.insert({"name": "josh", "age": 18}) +students.insert({"name": "judy", "age": 21}) + +# Execute an AQL query and iterate through the result cursor. +cursor = db.aql.execute("FOR doc IN students RETURN doc") +student_names = [document["name"] for document in cursor] +``` + +The following example shows how to create a [named graph](../../graphs/_index.md), +populate it with vertices and edges, and query it with a graph traversal: + +```python +from arango import ArangoClient + +# Initialize the client for ArangoDB. +client = ArangoClient(hosts="http://localhost:8529") + +# Connect to "test" database as root user. +db = client.db("test", username="root", password="passwd") + +# Create a new graph named "school". +graph = db.create_graph("school") + +# Create a new EnterpriseGraph [Enterprise Edition] +eegraph = db.create_graph( + name="school", + smart=True) + +# Create vertex collections for the graph. +students = graph.create_vertex_collection("students") +lectures = graph.create_vertex_collection("lectures") + +# Create an edge definition (relation) for the graph. +edges = graph.create_edge_definition( + edge_collection="register", + from_vertex_collections=["students"], + to_vertex_collections=["lectures"] +) + +# Insert vertex documents into "students" (from) vertex collection. +students.insert({"_key": "01", "full_name": "Anna Smith"}) +students.insert({"_key": "02", "full_name": "Jake Clark"}) +students.insert({"_key": "03", "full_name": "Lisa Jones"}) + +# Insert vertex documents into "lectures" (to) vertex collection. +lectures.insert({"_key": "MAT101", "title": "Calculus"}) +lectures.insert({"_key": "STA101", "title": "Statistics"}) +lectures.insert({"_key": "CSC101", "title": "Algorithms"}) + +# Insert edge documents into "register" edge collection. +edges.insert({"_from": "students/01", "_to": "lectures/MAT101"}) +edges.insert({"_from": "students/01", "_to": "lectures/STA101"}) +edges.insert({"_from": "students/01", "_to": "lectures/CSC101"}) +edges.insert({"_from": "students/02", "_to": "lectures/MAT101"}) +edges.insert({"_from": "students/02", "_to": "lectures/STA101"}) +edges.insert({"_from": "students/03", "_to": "lectures/CSC101"}) + +# Traverse the graph in outbound direction, breath-first. +query = """ + FOR v, e, p IN 1..3 OUTBOUND 'students/01' GRAPH 'school' + OPTIONS { bfs: true, uniqueVertices: 'global' } + RETURN {vertex: v, edge: e, path: p} + """ +cursor = db.aql.execute(query) +``` + +## Work with databases + +### Connect to a database + +To connect to a database, create an instance of `ArangoClient` which provides a +connection to the database server. Then call its `db` method and pass the +database name, user name, and password as parameters. + +```python +from arango import ArangoClient + +# Initialize a client +client = ArangoClient(hosts="http://localhost:8529") + +# Connect to the system database +sys_db = client.db("_system", username="root", password="qwerty") +``` + +### Retrieve a list of all databases + +To retrieve a list of all databases on an ArangoDB server, connect to the +`_system` database and call the `databases()` method. + +```python +# Retrieve the names of all databases on the server as list of strings +db_list = sys_db.databases() +``` + +### Create a database + +To create a new database, connect to the `_system` database and call +`create_database()`. + +```python +# Create a new database named "test". +sys_db.create_database("test") + +# Connect to "test" database as root user. +test_db = client.db("test", username="root", password="qwerty") +``` + +### Delete a database + +To delete an existing database, connect to the `_system` database and call +`delete_database()` passing the name of the database to be deleted as a +parameter. The `_system` database cannot be deleted. Make sure to specify +the correct database name when you are deleting databases. + +```python +# Delete the 'test' database +sys_db.delete_database("test") +``` + +## Work with collections + +### Retrieve a list of collections + +To retrieve a list of collections in a database, connect to the database and +call `collections()`. + +```python +# Connect to the database +db = client.db(db_name, username=user_name, password=pass_word) + +# Retrieve the list of collections +collection_list = db.collections() +``` + +### Create a collection + +To create a new collection, connect to the database and call `create_collection()`. + +```python +# Create a new collection for doctors +doctors_col = db.create_collection(name="doctors") + +# Create another new collection for patients +patients_col = db.create_collection(name="patients") +``` + +### Delete a collection + +To delete a collection, connect to the database and call `delete_collection()`, +passing the name of the collection to be deleted as a parameter. Make sure to +specify the correct collection name when you delete collections. + +```python +# Delete the 'doctors' collection +db.delete_collection(name="doctors") +``` + +## Work with documents + +### Create a document + +To create a new document, get a reference to the collection and call its +`insert()` method, passing the object/document to be created in ArangoDB as +a parameter. + +```python +# Get a reference to the 'patients' collection +patients_col = db.collection(name="patients") + +# Insert two new documents into the 'patients' collection +patients_col.insert({"name": "Jane", "age": 39}) +patients_col.insert({"name": "John", "age": 18}) +``` + +John's patient record is: + +```json +{ + "_id": "patients/741603", + "_rev": "_fQ2grGu---", + "_key": "741603", + "name": "John", + "age": 18 +} +``` + +### Update a document + +To patch or partially update a document, call the `update()` method of the +collection and pass the object/document as a parameter. The document must have +a property named `_key` holding the unique key assigned to the document. + +```python +# Patch John's patient record by adding a city property to the document +patients_col.update({ "_key": "741603", "city": "Cleveland" }) +``` + +After the patching operation, John's document is as follows: + +```json +{ + "_id": "patients/741603", + "_rev": "_fQ2h4TK---", + "_key": "741603", + "name": "John", + "age": 18, + "city": "Cleveland" +} +``` + +Notice that the record was patched by adding a `city` property to the document + All other properties remain the same. + +### Replace a document + +To replace or fully update a document, call the `replace()` method of the +collection and pass the object/document that fully replaces thee existing +document as a parameter. The document must have a property named `_key` holding +the unique key assigned to the document. + +```python +# Replace John's document +patients_col.replace({ "_key": "741603", "fullname": "John Doe", "age": 18, "city": "Cleveland" }) +``` + +After the replacement operation, John's document is as follows: + +```json +{ + "_id": "patients/741603", + "_rev": "_fQ2uY3y---", + "_key":"741603", + "fullname": "John Doe", + "age": 18, + "city": "Cleveland" +} +``` + +Notice that the `name` property is now gone from John's document because it was +not specified in the request when the document was fully replaced. + +### Delete a document + +To delete a document, call the `delete()` method of the collection and pass an +document containing at least the `_key` attribute as a parameter. + +```python +# Delete John's document +patients_col.delete({ "_key": "741603" }) +``` + +## Work with AQL + +### Run AQL queries + +To run a query, connect to the desired database and call `aql.execute()`. +This returns a cursor, which lets you fetch the results in batches. You can +iterate over the cursor to automatically fetch the data. + +```python +# Run a query +cursor = db.aql.execute('FOR i IN 1..@value RETURN i', bind_vars={'value': 3}) + +# Print the results +for doc in cursor: + print(doc) +``` diff --git a/site/content/arangodb/oem/develop/error-codes.md b/site/content/arangodb/oem/develop/error-codes.md new file mode 100644 index 0000000000..c79b150b5f --- /dev/null +++ b/site/content/arangodb/oem/develop/error-codes.md @@ -0,0 +1,75 @@ +--- +title: The error codes of the ArangoDB Core and their meanings +menuTitle: Error codes +weight: 280 +description: >- + Error replies from ArangoDB servers contain a code, error number, and message + and you can look up additional information for a specific kind of error here +pageToc: + maxHeadlineLevel: 3 +aliases: + - error-codes-and-meanings +--- +## Numbers, names, and descriptions of errors + +When an error occurs in an operation of an ArangoDB server, the +[HTTP REST API](http-api/_index.md) responds to a request with an +**HTTP status code** like `400 Bad Request`, `401 Unauthorized`, +`503 Service Unavailable`, or similar. This code is typically also included in +the body of the response, specifically the `code` attribute, along with the +`error` attribute set to `true`. + +``` +HTTP/1.1 401 Unauthorized +... + +{"code":401,"error":true,"errorNum":11,"errorMessage":"not authorized to execute this request"} +``` + +The **error code** only indicates the broad category of an error, based on the +status codes defined by the HTTP protocol. + +A more detailed **error number** is provided in the `errorNum` attribute. +Error numbers are specific to ArangoDB. Each ArangoDB error kind has a number, +a unique name, an error message, and a description. + +The **error message** is a brief description of the error and provided in the +`errorMessage` attribute. + +Error names are used in code to refer to an error kind, in the server's own code +as well as in other code like drivers. For instance, the name for the error with +the number `11` is `ERROR_FORBIDDEN`. The **error name** is not visible in the +HTTP API response. + +In the [JavaScript API](javascript-api/_index.md), the `@arangodb` module maps +error names to objects with the error number and message: + +```js +require("@arangodb").errors.ERROR_FORBIDDEN +``` + +```json +{ + "code" : 11, + "message" : "forbidden" +} +``` + +Note that the error message in the HTTP API response deviates from the above +shown message ("not authorized to execute this request" versus "forbidden"). +ArangoDB does not necessarily return the error message as defined internally but +can override it in order to provide more details. You should therefore check +against the error number in your own code and never rely on the error message, +as it can be different in under different circumstances for the same error kind. + +An **error description** is a more detailed description of the error kind than +the error message. It is not visible in the HTTP API response. It is mainly +used to provide context for developers. + +## List of error codes + +In the following, you find the error kinds that exist in ArangoDB, grouped into +categories. Each error has a headline with the format `number - name` and the +error description as the text. + +{{% error-codes %}} diff --git a/site/content/arangodb/oem/develop/exit-codes.md b/site/content/arangodb/oem/develop/exit-codes.md new file mode 100644 index 0000000000..308d73f799 --- /dev/null +++ b/site/content/arangodb/oem/develop/exit-codes.md @@ -0,0 +1,43 @@ +--- +title: The ArangoDB exit codes and their meanings +menuTitle: Exit codes +weight: 281 +description: >- + The ArangoDB server and the client tools set a number called exit code when + they terminate, and you can look up what they mean here +pageToc: + maxHeadlineLevel: 3 +--- +## Exit codes + +Exit codes are numeric values programs return when they finish, indicating +success or failure. + +- An exit code of zero indicates a successful execution, e.g. the termination of + the server process without without any issues. +- Any non-zero exit code indicates that some error occurred, e.g. you tried to + run a program with invalid parameters or it failed to process something. + +Right after running a command in a command-line, you can show the exit code like so: + +- Bash, zsh, and other shells: `echo $?` +- Fish shell: `echo $status` +- PowerShell: `echo $LASTEXITCODE` + +The ArangoDB server and (to some extent) the client tools use exit codes to signal +to other applications or the operating system whether they encountered problems. +You can typically tell from the log messages right before the process termination +what errors were encountered, but in certain cases you might only have the +exit code. The below list of exit codes can help you understand the cause in +such a case. + +## List of exit codes + +The following exit codes are used by the ArangoDB server (_arangod_), the +ArangoDB Shell (_arangosh_), _arangodump_, _arangorestore_, _arangoimport_, +_arangoexport_, _arangobench_, _arangovpack_, and _arangoinspect_. + +They are grouped into a few categories. There is a headline for each exit code +with the format `code - name`, and the exit code description as the text. + +{{% exit-codes %}} diff --git a/site/content/arangodb/oem/develop/foxx-microservices/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/_index.md new file mode 100644 index 0000000000..adcdc21f9e --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/_index.md @@ -0,0 +1,74 @@ +--- +title: Foxx Microservices +menuTitle: Foxx Microservices +weight: 265 +description: >- + The Foxx framework enables you to execute JavaScript inside of ArangoDB and write custom service endpoints +--- +Traditionally, server-side projects have been developed as standalone applications +that guide the communication between the client-side frontend and the database +backend. This has led to applications that were either developed as single +monoliths or that duplicated data access and domain logic across all services +that had to access the database. Additionally, tools to abstract away the +underlying database calls could incur a lot of network overhead when using remote +databases without careful optimization. + +ArangoDB allows application developers to write their data access and domain logic +as microservices running directly within the database with native access to +in-memory data. The **Foxx microservice framework** makes it easy to extend +ArangoDB's own REST API with custom HTTP endpoints using modern JavaScript running +on the same V8 engine you know from Node.js and the Google Chrome web browser. + +Unlike traditional approaches to storing logic in the database (like stored +procedures), these microservices can be written as regular structured JavaScript +applications that can be easily distributed and version controlled. Depending on +your project's needs Foxx can be used to build anything from optimized REST +endpoints performing complex data access to entire standalone applications +running directly inside the database. + +## How it works + +Foxx services consist of JavaScript code running in the V8 JavaScript runtime +embedded inside ArangoDB. Each service is mounted in each available V8 context +(the number of contexts can be adjusted in the server configuration). +Incoming requests are distributed across these contexts automatically. + +If you're coming from another JavaScript environment like Node.js this is +similar to running multiple Node.js processes behind a load balancer: +you should not rely on server-side state (other than the database itself) +between different requests as there is no way of making sure consecutive +requests will be handled in the same context. + +Because the JavaScript code is running inside the database another difference +is that all Foxx and ArangoDB APIs are purely synchronous and should be +considered blocking. This is especially important for transactions, +which in ArangoDB can execute arbitrary code but may have to lock +entire collections (effectively preventing any data to be written) +until the code has completed. + +## Limitations +Because Foxx services use the V8 JavaScript engine, the engine's default memory limit of 512 MB is applied. + +## Compatibility caveats + +Unlike JavaScript in browsers or Node.js, the JavaScript environment +in ArangoDB is synchronous. This means any code that depends on asynchronous +behavior like promises or `setTimeout` will not behave correctly in +ArangoDB or Foxx. Additionally, ArangoDB does not support native extensions +unlike Node.js. All code has to be implemented in pure JavaScript. + +While ArangoDB provides a lot of compatibility code to support code written +for Node.js, some Node.js built-in modules cannot be provided by ArangoDB. +For a closer look at the Node.js modules ArangoDB does or +does not provide, see the +[JavaScript API](../javascript-api/_index.md#node-compatibility-modules). + +When using [bundled node modules](guides/using-node-modules.md) keep in mind +that these restrictions not only apply to the modules themselves but also +the node dependencies of those modules. As a rule of thumb: + +- Modules written to work in Node.js and the browser that do not + rely on async behavior should generally work + +- Modules that rely on network or filesystem I/O or make heavy use + of async behavior most likely will not diff --git a/site/content/arangodb/oem/develop/foxx-microservices/deployment.md b/site/content/arangodb/oem/develop/foxx-microservices/deployment.md new file mode 100644 index 0000000000..c4d8bf13d0 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/deployment.md @@ -0,0 +1,20 @@ +--- +title: Deployment +menuTitle: Deployment +weight: 15 +description: >- + You can deploy Foxx services with Foxx CLI, the ArangoDB HTTP API, or its + web interface +--- +Foxx services can be deployed in multiple ways: + +- [Foxx CLI](../../components/tools/foxx-cli/_index.md), a command line tool which + requires Node.js + +- [HTTP API](../http-api/foxx.md) using HTTP requests, + e.g. with curl + +- [web interface](../../components/web-interface/services.md) under *SERVICES* + +See [the Foxx cluster guide](guides/foxx-in-a-cluster.md#how-arangodb-distributes-services) +for how Foxx services are distributed to Coordinators. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/getting-started.md b/site/content/arangodb/oem/develop/foxx-microservices/getting-started.md new file mode 100644 index 0000000000..60ae36bcc1 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/getting-started.md @@ -0,0 +1,457 @@ +--- +title: Getting Started +menuTitle: Getting started +weight: 5 +description: '' +--- +This practical introduction will take you from an empty folder to a first +Foxx service installed in ArangoDB, with custom endpoints which can handle +user input and query the database. + +A video guide is also available: + +{{< youtube-playlist id="PL0tn-TSss6NV45d1HnLA57VJFH6h1SeH7" >}} + +## Manifest + +We're going to start with an empty folder. This will be the root folder of our +services. You can name it something clever but for the course of this guide +we'll assume it's called the name of your service: `getting-started`. + +First we need to create a manifest. Create a new file called `manifest.json` +and add the following content: + +```json +{ + "engines": { + "arangodb": "^3.0.0" + } +} +``` + +This just tells ArangoDB the service is compatible with versions 3.0.0 and +later (all the way up to but not including 4.0.0), allowing older versions +of ArangoDB to understand that this service likely won't work for them and +newer versions what behavior to emulate should they still support it. + +The little hat to the left of the version number is not a typo, it's called a +"caret" and indicates the version range. Foxx uses semantic versioning (also +called "semver") for most of its version handling. You can find out more about +how semver works at the [official semver website](http://semver.org). + +Next we'll need to specify an entry point to our service. This is the +JavaScript file that will be executed to define our service's HTTP endpoints. +We can do this by adding a "main" field to our manifest: + +```json +{ + "engines": { + "arangodb": "^3.0.0" + }, + "main": "index.js" +} +``` + +That's all we need in our manifest for now. + +## Router + +Let's next create the `index.js` file: + +```js +'use strict'; +const createRouter = require('@arangodb/foxx/router'); +const router = createRouter(); + +module.context.use(router); +``` + +The first line causes our file to be interpreted using +[strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode). +All examples in the ArangoDB documentation assume strict mode, so you might +want to familiarize yourself with it if you haven't encountered it before. + +The second line imports the `@arangodb/foxx/router` module which provides a +function for creating new Foxx routers. We're using this function to create a +new `router` object which we'll be using for our service. + +The `module.context` is the so-called Foxx context or service context. +This variable is available in all files that are part of your Foxx service and +provides access to Foxx APIs specific to the current service, like the `use` +method, which tells Foxx to mount the `router` in this service (and to expose +its routes to HTTP). + +Next let's define a route that prints a generic greeting: + +```js +// continued +router.get('/hello-world', function (req, res) { + res.send('Hello World!'); +}) +.response(['text/plain'], 'A generic greeting.') +.summary('Generic greeting') +.description('Prints a generic greeting.'); +``` + +The `router` provides the methods `get`, `post`, etc corresponding to each +HTTP verb as well as the catch-all `all`. These methods indicate that the given +route should be used to handle incoming requests with the given HTTP verb +(or any method when using `all`). + +These methods take an optional path (if omitted, it defaults to `"/"`) as well +as a request handler, which is a function taking the `req` +([request](reference/routers/request.md)) and `res` +([response](reference/routers/response.md)) objects to handle the incoming +request and generate the outgoing response. If you have used the express +framework in Node.js, you may already be familiar with how this works, +otherwise check out the chapter on [routes](reference/routers/endpoints.md). + +The object returned by the router's methods provides additional methods to +attach metadata and validation to the route. We're using `summary` and +`description` to document what the route does – these aren't strictly +necessary but give us some nice auto-generated documentation. +The `response` method lets us additionally document the response content +type and what the response body will represent. + +## Try it out + +At this point you can upload the service folder as a zip archive from the +web interface using the *Services* tab. + +Click *Add Service* then pick the *Zip* option in the dialog. You will need +to provide a *mount path*, which is the URL prefix at which the service will +be mounted (e.g. `/getting-started`). + +Once you have picked the zip archive using the file picker, the upload should +begin immediately and your service should be installed. Otherwise press the +*Install* button and wait for the dialog to disappear and the service to show +up in the service list. + +Click anywhere on the card with your mount path on the label to open the +service's details. + +In the API documentation you should see the route we defined earlier +(`/hello-world`) with the word `GET` next to it indicating the HTTP method it +supports and the `summary` we provided on the right. By clicking on the +route's path you can open the documentation for the route. + +Note that the `description` we provided appears in the generated documentation +as well as the description we added to the `response` (which should correctly +indicate the content type `text/plain`, i.e. plain text). + +Click the *Try it out!* button to send a request to the route and you should +see an example request with the service's response: "Hello World!". + +Congratulations! You have just created, installed and used your first Foxx service. + +## Parameter validation + +Let's add another route that provides a more personalized greeting: + +```js +// continued +const joi = require('joi'); + +router.get('/hello/:name', function (req, res) { + res.send(`Hello ${req.pathParams.name}`); +}) +.pathParam('name', joi.string().required(), 'Name to greet.') +.response(['text/plain'], 'A personalized greeting.') +.summary('Personalized greeting') +.description('Prints a personalized greeting.'); +``` + +The first line imports the [`joi` module from npm](https://www.npmjs.com/package/joi) +which comes bundled with ArangoDB. Joi is a validation library that is used +throughout Foxx to define schemas and parameter types. + +**Note**: You can bundle your own modules from npm by installing them in your +service folder and making sure the `node_modules` folder is included in your +zip archive. For more information see the chapter on +[bundling node modules](guides/using-node-modules.md). + +The `pathParam` method allows us to specify parameters we are expecting in +the path. The first argument corresponds to the parameter name in the path, +the second argument is a joi schema the parameter is expected to match and +the final argument serves to describe the parameter in the API documentation. + +The path parameters are accessible from the `pathParams` property of the +request object. We're using a template string to generate the server's +response containing the parameter's value. + +Note that routes with path parameters that fail to validate for the request URL +will be skipped as if they wouldn't exist. This allows you to define multiple +routes that are only distinguished by the schemas of their path parameters (e.g. +a route taking only numeric parameters and one taking any string as a fallback). + +Let's take this further and create a route that takes a JSON request body: + +```js +// continued +router.post('/sum', function (req, res) { + const values = req.body.values; + res.send({ + result: values.reduce(function (a, b) { + return a + b; + }, 0) + }); +}) +.body(joi.object({ + values: joi.array().items(joi.number().required()).required() +}).required(), 'Values to add together.') +.response(joi.object({ + result: joi.number().required() +}).required(), 'Sum of the input values.') +.summary('Add up numbers') +.description('Calculates the sum of an array of number values.'); +``` + +Note that we used `post` to define this route instead of `get` (which does not +support request bodies). Trying to send a GET request to this route's URL +(in the absence of a `get` route for the same path) will result in Foxx +responding with an appropriate error response, indicating the supported +HTTP methods. + +As this route not only expects a JSON object as input but also responds with +a JSON object as output we need to define two schemas. We don't strictly need +a response schema but it helps documenting what the route should be expected +to respond with and will show up in the API documentation. + +Because we're passing a schema to the `response` method we don't need to +explicitly tell Foxx we are sending a JSON response. The presence of a schema +in the absence of a content type always implies we want JSON. Though we could +just add `["application/json"]` as an additional argument after the schema if +we wanted to make this more explicit. + +The `body` method works the same way as the `response` method except the schema +will be used to validate the request body. If the request body can't be parsed +as JSON or doesn't match the schema, Foxx will reject the request with an +appropriate error response. + +## Creating collections + +The real power of Foxx comes from interacting with the database itself. +In order to be able to use a collection from within our service, we should +first make sure that the collection actually exists. The right place to create +collections your service is going to use is in +[a *setup* script](guides/scripts-and-scheduling.md), which Foxx will execute for you when +installing or updating the service. + +First create a new folder called "scripts" in the service folder, which will +be where our scripts are going to live. For simplicity's sake, our setup +script will live in a file called `setup.js` inside that folder: + +```js +'use strict'; +const db = require('@arangodb').db; +const collectionName = 'myFoxxCollection'; + +if (!db._collection(collectionName)) { + db._createDocumentCollection(collectionName); +} +``` + +The script uses the [`db` object](../javascript-api/@arangodb/db-object.md) from +the `@arangodb` module, which lets us interact with the database the Foxx +service was installed in and the collections inside that database. Because the +script may be executed multiple times (i.e. whenever we update the service or +when the server is restarted) we need to make sure we don't accidentally try +to create the same collection twice (which would result in an exception); +we do that by first checking whether it already exists before creating it. + +The `_collection` method looks up a collection by name and returns `null` if no +collection with that name was found. The `_createDocumentCollection` method +creates a new document collection by name (`_createEdgeCollection` also exists +and works analogously for edge collections). + +**Note**: Because we have hardcoded the collection name, multiple copies of +the service installed alongside each other in the same database will share +the same collection. +Because this may not always be what you want, the [Foxx context](reference/service-context.md) +also provides the `collectionName` method which applies a mount point specific +prefix to any given collection name to make it unique to the service. It also +provides the `collection` method, which behaves almost exactly like `db._collection` +except it also applies the prefix before looking the collection up. + +Next we need to tell our service about the script by adding it to the manifest file: + +```json +{ + "engines": { + "arangodb": "^3.0.0" + }, + "main": "index.js", + "scripts": { + "setup": "scripts/setup.js" + } +} +``` + +The only thing that has changed is that we added a "scripts" field specifying +the path of the setup script we just wrote. + +Go back to the web interface and update the service with our new code, then +check the *Collections* tab. If everything worked right, you should see a new +collection called "myFoxxCollection". + +## Accessing collections + +Let's expand our service by adding a few more routes to our `index.js`: + +```js +// continued +const db = require('@arangodb').db; +const errors = require('@arangodb').errors; +const foxxColl = db._collection('myFoxxCollection'); +const DOC_NOT_FOUND = errors.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code; + +router.post('/entries', function (req, res) { + const data = req.body; + const meta = foxxColl.save(req.body); + res.send(Object.assign(data, meta)); +}) +.body(joi.object().required(), 'Entry to store in the collection.') +.response(joi.object().required(), 'Entry stored in the collection.') +.summary('Store an entry') +.description('Stores an entry in the "myFoxxCollection" collection.'); + +router.get('/entries/:key', function (req, res) { + try { + const data = foxxColl.document(req.pathParams.key); + res.send(data) + } catch (e) { + if (!e.isArangoError || e.errorNum !== DOC_NOT_FOUND) { + throw e; + } + res.throw(404, 'The entry does not exist', e); + } +}) +.pathParam('key', joi.string().required(), 'Key of the entry.') +.response(joi.object().required(), 'Entry stored in the collection.') +.summary('Retrieve an entry') +.description('Retrieves an entry from the "myFoxxCollection" collection by key.'); +``` + +We're using the `save` and `document` methods of the collection object to store +and retrieve documents in the collection we created in our setup script. +Because we don't care what the documents look like we allow any attributes on +the request body and just accept an object. + +Because the key will be automatically generated by ArangoDB when one wasn't +specified in the request body, we're using `Object.assign` to apply the +attributes of the metadata object returned by the `save` method to the document +before returning it from our first route. + +The `document` method returns a document in a collection by its `_key` or `_id`. +However when no matching document exists it throws an `ArangoError` exception. +Because we want to provide a more descriptive error message than ArangoDB does +out of the box, we need to handle that error explicitly. + +All `ArangoError` exceptions have a truthy attribute `isArangoError` that helps +you recognizing these errors without having to worry about `instanceof` checks. +They also provide an `errorNum` and an `errorMessage`. If you want to check for +specific errors you can just import the `errors` object from the `@arangodb` +module instead of having to memorize numeric error codes. + +Instead of defining our own response logic for the error case we just use +`res.throw`, which makes the response object throw an exception Foxx can +recognize and convert to the appropriate server response. We also pass along +the exception itself so Foxx can provide more diagnostic information when we +want it to. + +We could extend the post route to support arrays of objects as well, each +object following a certain schema: + +```js +// store schema in variable to make it re-usable, see .body() +const docSchema = joi.object().required().keys({ + name: joi.string().required(), + age: joi.number().required() +}).unknown(); // allow additional attributes + +router.post('/entries', function (req, res) { + const multiple = Array.isArray(req.body); + const body = multiple ? req.body : [req.body]; + + let data = []; + for (var doc of body) { + const meta = foxxColl.save(doc); + data.push(Object.assign(doc, meta)); + } + res.send(multiple ? data : data[0]); + +}) +.body(joi.alternatives().try( + docSchema, + joi.array().items(docSchema) +), 'Entry or entries to store in the collection.') +.response(joi.alternatives().try( + joi.object().required(), + joi.array().items(joi.object().required()) +), 'Entry or entries stored in the collection.') +.summary('Store entry or entries') +.description('Store a single entry or multiple entries in the "myFoxxCollection" collection.'); +``` + +## Writing database queries + +Storing and retrieving entries is fine, but right now we have to memorize each +key when we create an entry. Let's add a route that gives us a list of the +keys of all entries so we can use those to look an entry up in detail. + +The naïve approach would be to use the `toArray()` method to convert the entire +collection to an array and just return that. But we're only interested in the +keys and there might potentially be so many entries that first retrieving every +single document might get unwieldy. Let's write a short AQL query to do this instead: + +```js +// continued +const aql = require('@arangodb').aql; + +router.get('/entries', function (req, res) { + const keys = db._query(aql` + FOR entry IN ${foxxColl} + RETURN entry._key + `); + res.send(keys); +}) +.response(joi.array().items( + joi.string().required() +).required(), 'List of entry keys.') +.summary('List entry keys') +.description('Assembles a list of keys of entries in the collection.'); +``` + +Here we're using two new things: + +The `_query` method executes an AQL query in the active database. + +The `aql` template string handler allows us to write multi-line AQL queries and +also handles query parameters and collection names. Instead of hardcoding the +name of the collection we want to use in the query we can simply reference the +`foxxColl` variable we defined earlier – it recognizes the value as an ArangoDB +collection object and knows we are specifying a collection rather than a regular +value even though AQL distinguishes between the two. + +**Note**: If you aren't used to JavaScript template strings and template string +handlers just think of `aql` as a function that receives the multiline string +split at every `${}` expression as well as an array of the values of those +expressions – that's actually all there is to it. + +Alternatively, here's a version without template strings (notice how much +cleaner the `aql` version will be in comparison when you have multiple variables): + +```js +const keys = db._query( + 'FOR entry IN @@coll RETURN entry._key', + {'@coll': foxxColl.name()} +); +``` + +## Next steps + +You now know how to create a Foxx service from scratch, how to handle user +input and how to access the database from within your Foxx service to store, +retrieve and query data you store inside ArangoDB. This should allow you to +build meaningful APIs for your own applications but there are many more things +you can do with Foxx. See the [Guides](guides/_index.md) chapter for more. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/_index.md new file mode 100644 index 0000000000..d967a98921 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/_index.md @@ -0,0 +1,30 @@ +--- +title: Guides +menuTitle: Guides +weight: 10 +description: >- + The following guides provide solutions to common problems when building + applications with Foxx services +--- +## Up and running + +- [Working with routers](working-with-routers.md) +- [Working with collections](working-with-collections.md) +- [Writing queries](writing-queries.md) +- [Development mode](development-mode.md) +- [Testing Foxx services](testing-foxx-services.md) +- [Foxx in a cluster](foxx-in-a-cluster.md) + +## Next steps + +- [Scripts and scheduling](scripts-and-scheduling.md) +- [Using Node modules](using-node-modules.md) +- [Using Webpack with Foxx](using-webpack-with-foxx.md) +- [Authentication and sessions](authentication-and-sessions.md) +- [Linking services together](linking-services-together.md) + +## Advanced topics + +- [Working with files](working-with-files.md) +- [Making requests](making-requests.md) +- [Access from the browser](access-from-the-browser.md) diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/access-from-the-browser.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/access-from-the-browser.md new file mode 100644 index 0000000000..f6fe379015 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/access-from-the-browser.md @@ -0,0 +1,151 @@ +--- +title: Exposing Foxx to the browser +menuTitle: Access from the browser +weight: 70 +description: '' +--- +There are three ways to use Foxx in a web application: + +1. Accessing Foxx from an application server that exposes its own API. + +2. Using a web server like Apache or nginx as a reverse proxy to expose + only the Foxx service. + +3. Exposing ArangoDB directly by running ArangoDB on a public port. + +## Using an application server + +Accessing Foxx from an application server is probably the safest approach as +the application server shields the database from the browser entirely. However +this also adds the most development overhead and may result in unnecessary +duplication of access logic. + +This approach works best if you're using Foxx in an existing application stack +or want to use an [ArangoDB driver](https://www.arangodb.com/arangodb-drivers/) +to access the database API directly alongside your Foxx service. + +As Foxx services provide ordinary HTTP endpoints, you can access them from your +existing application server using any run-of-the-mill HTTP client with JSON +support. Some ArangoDB drivers also let you access arbitrary HTTP endpoints. + +Example (Node with arangojs): + +```js +"use strict"; +const express = require("express"); +const app = express(); +const { Database } = require("arangojs"); +const db = new Database(); +db.useDatabase("mydb"); +const service = db.route("/my-foxx"); +app.get("/", async function(req, res) { + // Passes the response from '/_db/mydb/my-foxx/hello' + const response = await service.get("/hello"); + res.status(response.statusCode); + res.write(response.body); + res.end(); +}); +app.listen(9000); +``` + +## Using a reverse proxy + +For information on setting up the Apache web server as a reverse proxy check +[the official Apache 2.4 documentation](https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html). +For nginx check +[the nginx admin guide](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/). +Similar documentation exists for +[lighttpd](https://redmine.lighttpd.net/projects/1/wiki/Docs_ModProxy) and +[Microsoft IIS](https://blogs.msdn.microsoft.com/friis/2016/08/25/setup-iis-with-url-rewrite-as-a-reverse-proxy-for-real-world-apps/). + +Example (nginx): + +```nginx +location /api/ { + proxy_pass http://127.0.0.1:8529/_db/_system/my-foxx/; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host:$server_port; + proxy_set_header X-Forwarded-Proto $scheme; +} +``` + +Example (Apache): + +```apacheconf +<Location /api> + RequestHeader set X-Forwarded-Proto "https" # or "http" + # Other X-Forwarded-* headers are set automatically + ProxyPass http://127.0.0.1:8529/_db/_system/my-foxx +</Location> +``` + +The advantage of this approach is that it allows you to expose just the service +itself without exposing the entire database API. + +This approach also works well if you're already using a web server to serve +your web application frontend files and want your frontend to talk directly to +the service. + +**Note**: when running Foxx behind a reverse proxy some properties of the +request object will reflect the proxy rather than the original request source +(i.e. the browser). You can tell Foxx to expect to run behind a trusted proxy +by enabling the `trustProxy` property of the service context: + +```js +// in your main entry file, e.g. index.js +module.context.trustProxy = true; +``` + +Foxx will then trust the values of the following request headers: + +- `x-forwarded-proto` for `req.protocol` +- `x-forwarded-host` for `req.hostname` and `req.port` +- `x-forwarded-port` for `req.port` +- `x-forwarded-for` for `req.remoteAddress` and `req.remoteAddresses` + +Note that this property needs to be set in your main entry file. Setting it in +the setup script has no effect. + +## Exposing ArangoDB directly + +This is the most obvious but also most dangerous way to expose your Foxx +service. Running ArangoDB on a public port will expose the entire database API +and allow anyone who can guess your database credentials to do whatever +they want. + +Unless your service is explicitly intended to be used by people who already +have access to the ArangoDB web interface, you should go with one of the other +approaches instead. + +{{< danger >}} +Only use this for internal services intended to help +users who already have full access to the database. +**Don't ever expose your database to the public Internet.** +{{< /danger >}} + +### Cross-Origin Resource Sharing (CORS) + +If you are running ArangoDB on a public port and +want a web app running on a different port or domain to access it, +you will need to enable CORS in ArangoDB. + +First you need to +[configure ArangoDB for CORS](../../http-api/general-request-handling.md#cross-origin-resource-sharing-cors-requests). +As of 3.2, Foxx will then automatically allow all response headers as they are used. + +If you want more control over what is exposed or are using an older version of +ArangoDB, you can set the following response headers in your request handler: + +- `access-control-expose-headers`: a comma-separated list of response headers. + This defaults to a list of all headers the response is actually using + (but not including any `access-control` headers). + +- `access-control-allow-credentials`: can be set to `"false"` to forbid + exposing cookies. The default value depends on whether ArangoDB + trusts the origin. See the + [notes on `http.trusted-origin`](../../http-api/general-request-handling.md#cookies-and-authentication). + +Note that it is not possible to override these headers for the CORS preflight +response. It is therefore not possible to accept credentials or cookies only +for individual routes, services, or databases. The origin needs to be trusted +according to the general ArangoDB configuration (see above). diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/authentication-and-sessions.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/authentication-and-sessions.md new file mode 100644 index 0000000000..9b77d01f3e --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/authentication-and-sessions.md @@ -0,0 +1,242 @@ +--- +title: Authentication in Foxx services +menuTitle: Authentication and sessions +weight: 50 +description: '' +--- +Foxx provides the [auth module](../reference/related-modules/authentication.md) to implement +basic password verification and hashing but is not very secure unless using +the (very slow) PBKDF2 algorithm. Alternatively you can use the +[OAuth 1.0a](../reference/related-modules/oauth-1-0a.md) or +[OAuth 2.0](../reference/related-modules/oauth-2-0.md) modules to offload identity +management to a trusted provider (e.g. Facebook, GitHub, Google or Twitter). + +The [session middleware](../reference/sessions-middleware/_index.md) provides a mechanism +for adding session logic to your service, using e.g. a collection or +JSON Web Tokens to store the sessions between requests. + +With these building blocks you can implement your own session-based +authentication. + +## Implementing session authentication + +In this example we'll use two collections: a `users` collection to store the +user objects with names and credentials, and a `sessions` collection to store +the session data. We'll also make sure usernames are unique +by adding a `persistent` index: + +```js +"use strict"; +const { db } = require("@arangodb"); +const users = module.context.collectionName("users"); +if (!db._collection(users)) { + db._createDocumentCollection(users); +} +const sessions = module.context.collectionName("sessions"); +if (!db._collection(sessions)) { + db._createDocumentCollection(sessions); +} +module.context.collection("users").ensureIndex({ + type: "persistent", + unique: true, + fields: ["username"] +}); +``` + +Next you should create a sessions middleware that uses the `sessions` +collection and the "cookie" transport in a separate file, and add it +to the service router: + +```js +// in util/sessions.js +"use strict"; +const sessionsMiddleware = require("@arangodb/foxx/sessions"); +const sessions = sessionsMiddleware({ + storage: module.context.collection("sessions"), + transport: "cookie" +}); +module.exports = sessions; +``` + +```js +// in your main file +// ... +const sessions = require("./util/sessions"); +module.context.use(sessions); +``` + +You'll want to be able to use the authenticator throughout multiple parts +of your service so it's best to create it in a separate module and export it +so we can import it anywhere we need it: + +```js +"use strict"; +const createAuth = require("@arangodb/foxx/auth"); +const auth = createAuth(); +module.exports = auth; +``` + +If you want, you can now use the authenticator to help create an initial user +in the setup script. Note we're hardcoding the password here but you could +make it configurable via a +[service configuration option](../reference/configuration.md): + +```js +// ... +const auth = require("./util/auth"); +const users = module.context.collection("users"); +if (!users.firstExample({ username: "admin" })) { + users.save({ + username: "admin", + password: auth.create("hunter2") + }); +} +``` + +We can now put the two together to create a login route: + +```js +// ... +const auth = require("./util/auth"); +const users = module.context.collection("users"); +const joi = require("joi"); +const createRouter = require("@arangodb/foxx/router"); +const router = createRouter(); + +router + .post("/login", function(req, res) { + const user = users.firstExample({ + username: req.body.username + }); + const valid = auth.verify( + // Pretend to validate even if no user was found + user ? user.password : {}, + req.body.password + ); + if (!valid) res.throw("unauthorized"); + // Log the user in using the key + // because usernames might change + req.session.uid = user._key; + req.sessionStorage.save(req.session); + res.send({ username: user.username }); + }) + .body( + joi + .object({ + username: joi.string().required(), + password: joi.string().required() + }) + .required() + ); +``` + +To provide information about the authenticated user we can look up +the session user: + +```js +router.get("/me", function(req, res) { + try { + const user = users.document(req.session.uid); + res.send({ username: user.username }); + } catch (e) { + res.throw("not found"); + } +}); +``` + +To log a user out we can remove the user from the session: + +```js +router.post("/logout", function(req, res) { + if (req.session.uid) { + req.session.uid = null; + req.sessionStorage.save(req.session); + } + res.status("no content"); +}); +``` + +Finally when using the collection-based session storage, it's a good idea to +clean up expired sessions in a script which we can periodically call via an +external tool like `cron` or a [Foxx queue](../reference/related-modules/queues.md): + +```js +"use strict"; +const sessions = require("./util/sessions"); +module.exports = sessions.storage.prune(); +``` + +## Using ArangoDB authentication + +When using HTTP Basic authentication, ArangoDB will set the `arangoUser` +attribute of the [request object](../reference/routers/request.md) if the +credentials match a valid ArangoDB user for the database. + +**Note**: Although the presence and value of this attribute can be used to +implement a low-level authentication mechanism this is only useful if your +service is only intended to be used by developers who already have access to +the HTTP API or the administrative web interface. + +Example: + +```js +router.get("/me", function(req, res) { + if (req.arangoUser) { + res.json({ username: req.arangoUser }); + } else { + res.throw("not found"); + } +}); +``` + +## Alternative sessions implementation + +If you need more control than the sessions middleware provides, +you can also create a basic session system with a few lines of code yourself: + +```js +"use strict"; +const sessions = module.context.collection("sessions"); +// This is the secret string used to sign cookies +// you probably don't want to hardcode this. +const secret = "some secret string"; + +module.context.use((req, res, next) => { + // First read the session cookie if present + let sid = req.cookie("sid", { secret }); + if (sid) { + try { + // Try to find a matching session + req.session = sessions.document(sid); + } catch (e) { + // No session found, cookie is invalid + sid = null; + // Clear the cookie so it will be discarded + res.cookie("sid", "", { ttl: -1, secret }); + } + } + try { + // Continue handling the request + next(); + } finally { + // Do this even if the request threw + if (req.session) { + if (sid) { + // Sync the session's changes to the db + sessions.update(sid, req.session); + } else { + // Create a new session with a new key + sid = sessions.save(req.session)._key; + } + // Set or update the session cookie + res.cookie("sid", sid, { ttl: 24 * 60 * 60, secret }); + } else if (sid) { + // The request handler explicitly cleared + // the session, so we need to delete it + sessions.remove(sid); + // And clear the cookie too + res.cookie("sid", "", { ttl: -1, secret }); + } + } +}); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/development-mode.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/development-mode.md new file mode 100644 index 0000000000..7c83e95330 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/development-mode.md @@ -0,0 +1,86 @@ +--- +title: Development mode for Foxx services +menuTitle: Development mode +weight: 20 +description: '' +--- +Development mode allows developers to make changes to deployed services +in-place directly on the database server's file system without downloading +and re-uploading the service bundle. This can help during rapid development +of service prototypes or diagnosing complex problems. + +You can toggle development mode on and off using +the [Foxx CLI](../../../components/tools/foxx-cli/_index.md), +the [HTTP API](../../http-api/foxx.md#miscellaneous) or +in the service settings tab of the web interface. + +{{< info >}} +To find out where a service's active source files are stored, check the +service settings in the web interface or the service details when using +the Foxx CLI or HTTP API. The root folder for all services can also be +set explicitly by overriding the `javascript.app-path` option in the +ArangoDB configuration. +{{< /info >}} + +In development mode the service's source files and manifest will be +re-evaluated, and its setup script (if present) re-executed, +every time a route of the service is accessed, +effectively re-deploying the service on every request. +Additionally, error responses generated by Foxx will include stacktraces and +when viewed in a browser may include relevant sections of the service code +that generated the error. + +{{< warning >}} +To avoid losing your changes, we recommend using a tool like +[lsyncd](https://github.com/axkibe/lsyncd) to synchronize changes from your +local working copy to the service files continuously rather than modifying +those files directly. +Alternatively you can easily re-deploy your local copy of the service using +the [Foxx CLI](../../../components/tools/foxx-cli/_index.md). +{{< /warning >}} + +There are a number of caveats you should be aware of +when using development mode: + +- the additional information provided in error responses can leak + critical information like source code and file system paths + +- parallel requests may result in race conditions as the setup script + may be executed in multiple threads in parallel + (outside development mode the setup would only be executed in one thread) + +- the setup script will likely be executed numerous times, although + [using additional migration scripts](scripts-and-scheduling.md#migrations) + may help avoiding some of the added overhead + +- if you are [serving static files](working-with-files.md#serving-files), + keep in mind that requests to these files will still result in + a re-deployment of the service + +- making HTTP requests to the service via `@arangodb/request` + (e.g. [as part of an integration test](testing-foxx-services.md)) + also results in re-deployment, which can result in inconsistent behavior + +- the service files should be treated as highly volatile as they will + be erased if the service is uninstalled/replaced or the database removed + +For these reasons we strongly advise against using development mode +on production servers. + +## In a cluster + +{{< danger >}} +Using development mode in a production cluster +is extremely unsafe and highly discouraged. +{{< /danger >}} + +Development mode in a cluster applies to each Coordinator individually. +Changes to the service's file system on a single Coordinator will be reflected +as usual but only on that single Coordinator. +When development mode is disabled on one Coordinator, +it will create a new service bundle from the local changes and +distribute it across the cluster to the other Coordinators. + +This can result in problems when service code is modified +on multiple Coordinators. Development mode should therefore only be used +for diagnostic purposes and avoided if possible. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/foxx-in-a-cluster.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/foxx-in-a-cluster.md new file mode 100644 index 0000000000..6776c03c1c --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/foxx-in-a-cluster.md @@ -0,0 +1,69 @@ +--- +title: Foxx in a cluster setup +menuTitle: Foxx in a cluster +weight: 30 +description: '' +--- +When running ArangoDB in a cluster the Foxx services will run on each +Coordinator. Installing, upgrading and uninstalling services on any Coordinator +will automatically distribute the changes to the service to the other Coordinators, +making deployments as easy as in single-server mode. + +The same considerations that apply to writing Foxx services for a +standalone server also apply to writing services for a cluster: + +You should avoid any kind of file system state beyond the deployed service +bundle itself. Don't [write data to the file system](working-with-files.md) or encode +any expectations of the file system state other than the files in the +service folder that were installed as part of the service +(e.g. don't use file uploads or custom log files). + +Additionally, special precautions need to be taken when using the +[development mode in a cluster](development-mode.md#in-a-cluster). + +## How ArangoDB distributes services + +When you install, replace, upgrade or remove a service, these actions first +take place on a single Coordinator and are then distributed to the other +Coordinators. If a Coordinator for some reason fails to be informed, +its periodic self-healing process will pick up the changes eventually +and apply them anyway. + +1. When installing, upgrading or replacing a service, the new service is + extracted to a temporary directory where Foxx validates the manifest file + and parses the referenced scripts and main file. + +2. When replacing, upgrading or removing a service, the old service's teardown + script is executed in a single thread of the Coordinator as desired. + +3. When replacing, upgrading or installing a service, the new service's setup + script is executed in a single thread of the Coordinator as desired. + +4. The validated service bundle is copied to the Coordinator's service bundles + directory, extracted to the Coordinator's service directory and committed + to an internal collection along with a signature. + +5. The service metadata stored in another internal collection is updated, + replaced or created with the new service bundle's signature. An upgrade + retains existing metadata like configuration and dependencies whereas + a replace completely discards any existing metadata. + +6. The existing service is unloaded from the Coordinator's worker threads + and the new service is reloaded. If the new service runs into an error + at this point, the service will be marked as broken and + needs to be replaced manually. + +7. The Coordinator triggers a local self-heal followed by triggering + a self-heal on all other Coordinators. + +8. During the self-heal the Coordinator compares the signature of the + local bundle of each service against the signature stored in that + service's metadata in the database. If necessary, the corresponding + new bundle is downloaded from the database and extracted and the service + is reloaded as in step 6 before. + +Note that this means that any service that passes the initial validation step +will complete the install, upgrade or replace process, even if any of the +consecutive steps fail (e.g. due to a runtime error encountered while executing +the service's main file or a syntax error in a required file not referenced +from the manifest directly). diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/linking-services-together.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/linking-services-together.md new file mode 100644 index 0000000000..387d6f5a0d --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/linking-services-together.md @@ -0,0 +1,223 @@ +--- +title: Linking Foxx services together +menuTitle: Linking services together +weight: 55 +description: '' +--- +When using multiple services (or multiple copies of the same service) in the +same database, sometimes you may want to share collections or methods between +those services. Typical examples are: + +- [collections](working-with-collections.md) or APIs for managing shared data + (e.g. application users or session data) +- common [middleware](../reference/routers/middleware.md) that requires some + [configuration](../reference/configuration.md) that would be identical + for multiple services +- [reusable routers](working-with-routers.md) that provide the same API + for different services + +For scenarios like these, Foxx provides a way to link services together and +allow them to export JS APIs other services can use. +In Foxx these JS APIs are called _dependencies_, +the services implementing them are called _providers_, +the services using them are called _consumers_. + +{{< info >}} +This chapter is about Foxx dependencies as described above. In JavaScript the +term _dependencies_ can also refer to +[bundled node modules](using-node-modules.md), which are an unrelated concept. +{{< /info >}} + +## Declaring dependencies + +Foxx dependencies can be declared in the +[service manifest](../reference/service-manifest.md) +using the `provides` and `dependencies` fields: + +- `provides` lists the dependencies a given service provides, + i.e. which APIs it claims to be compatible with + +- `dependencies` lists the dependencies a given service consumes, + i.e. which APIs its dependencies need to be compatible with + +Explicitly naming your dependencies helps improving tooling support for +managing service dependencies in ArangoDB but is not strictly necessary. +It is possible to omit the `provides` field even if your service provides a +JS API and the `dependencies` field can be used without explicitly specifying +dependency names. + +A dependency name should be an alphanumeric identifier, optionally using a +namespace prefix (i.e. `dependency-name` or `@namespace/dependency-name`). +For example, services maintained by the ArangoDB Foxx team typically use +the `@foxx` namespace whereas the `@arangodb` namespace +is reserved for internal use. + +There is no official registry for dependency names but we recommend ensuring +the dependency names you use are unambiguous and meaningful +to other developers using your services. + +A `provides` definition maps each provided dependency's name +to the provided version: + +```json +"provides": { + "@example/auth": "1.0.0" +} +``` + +A `dependencies` definition maps the _local alias_ of each consumed dependency +against a short definition that includes the name and version range: + +```json +"dependencies": { + "myAuth": { + "name": "@example/auth", + "version": "^1.0.0", + "description": "This description is entirely optional.", + "required": false, + "multiple": false + } +} +``` + +The local alias should be a valid JavaScript identifier +(e.g. a valid variable name). When a dependency has been assigned, +its JS API will be exposed in a corresponding property of the +[service context](../reference/service-context.md), +e.g. `module.context.dependencies.myAuth`. + +## Assigning dependencies + +Like [configuration](../reference/configuration.md), +dependencies can be assigned using +the [web interface](../../../components/web-interface/services.md), +the [Foxx CLI](../../../components/tools/foxx-cli/_index.md) or +the [Foxx HTTP API](../../http-api/foxx.md#configuration). + +The value for each dependency should be the database-relative mount path of +the service (including the leading slash). Both services need to be mounted in +the same database. The same service can be used to provide a dependency +for multiple services. + +Also as with configuration, a service that declares required dependencies which +have not been assigned will not be mounted by Foxx until all required +dependencies have been assigned. Instead any attempt to access the service's +HTTP API will result in an error code. + +## Exporting a JS API + +In order to provide a JS API other services can consume as a dependency, +the service's _main_ file needs to export something other services can use. +You can do this by assigning a value to the `module.exports` or properties +of the `exports` object as with any other module export: + +```js +module.exports = "Hello world"; +``` + +This also includes collections. In the following example, the collection +exported by the provider will use the provider's +[collection prefix](working-with-collections.md) rather than the consumer's, +allowing both services to share the same collection: + +```js +module.exports = module.context.collection("shared_documents"); +``` + +Let's imagine we have a service managing our application's users. +Rather than allowing any consuming service to access the collection directly, +we can provide a number of methods to manipulate it: + +```js +const auth = require("./util/auth"); +const users = module.context.collection("users"); + +exports.login = (username, password) => { + const user = users.firstExample({ username }); + if (!user) throw new Error("Wrong username"); + const valid = auth.verify(user.authData, password); + if (!valid) throw new Error("Wrong password"); + return user; +}; +exports.setPassword = (user, password) => { + const authData = auth.create(password); + users.update(user, { authData }); + return user; +}; +``` + +Or you could even export a factory function to create an API that uses a +custom error type provided by the consumer rather than the producer: + +```js +const auth = require("./util/auth"); +const users = module.context.collection("users"); + +module.exports = (BadCredentialsError = Error) => { + return { + login(username, password) { + const user = users.firstExample({ username }); + if (!user) throw new BadCredentialsError("Wrong username"); + const valid = auth.verify(user.authData, password); + if (!valid) throw new BadCredentialsError("Wrong password"); + return user; + }, + setPassword(user, password) { + const authData = auth.create(password); + users.update(user, { authData }); + return user; + } + }; +}; +``` + +Example usage (the consumer uses the local alias `usersApi`): + +```js +"use strict"; +const createRouter = require("@arangodb/foxx/router"); +const joi = require("joi"); + +// Using the dependency with arguments +const AuthFailureError = require("./errors/auth-failure"); +const createUsersApi = module.context.dependencies.usersApi; +const users = createUsersApi(AuthFailureError); + +const router = createRouter(); +module.context.use(router); + +router.use((req, res, next) => { + try { + next(); + } catch (e) { + if (e instanceof AuthFailureError) { + res.status(401); + res.json({ + error: true, + message: e.message + }); + } else { + console.error(e.stack); + res.status(500); + res.json({ + error: true, + message: "Something went wrong." + }); + } + } +}); + +router + .post("/login", (req, res) => { + const { username, password } = req.body; + const user = users.login(username, password); + // handle login success + res.json({ welcome: username }); + }) + .body( + joi.object().keys({ + username: joi.string().required(), + password: joi.string().required() + }) + ); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/making-requests.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/making-requests.md new file mode 100644 index 0000000000..4fda1929ec --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/making-requests.md @@ -0,0 +1,44 @@ +--- +title: Making requests in Foxx +menuTitle: Making requests +weight: 65 +description: '' +--- +ArangoDB is primarily a database, so Foxx doesn't offer the same level of +network access as more general-purpose JavaScript environments like Node.js. +However ArangoDB does provide the +[`@arangodb/request` module](../../javascript-api/request.md) +for making HTTP (or HTTPS) requests: + +```js +"use strict"; +const request = require("@arangodb/request"); +const response = request.get( + "https://pokeapi.co/api/v2/pokemon/25/" +); +if (response.status < 400) { + const pikachu = response.json; + console.log(pikachu); +} +``` + +{{< warning >}} +Because +[Foxx services are always synchronous](../_index.md#compatibility-caveats) +and network requests can be considerably slower than any other +database operation, you should avoid making requests in your service +if possible or use [queues](scripts-and-scheduling.md#queues) instead. +{{< /warning >}} + +By using an absolute path instead of a full URL, you can also use the +request module to talk to ArangoDB itself, +for example in [integration tests](testing-foxx-services.md#integration-testing): + +```js +const response = request.get("/_db/_system/myfoxx/something"); +``` + +**Note**: Although making local requests doesn't create the network overhead +as making requests to other servers, special care needs to be taken when +talking to services on the same server. If you want to connect services +in the same database [you should use dependencies instead](linking-services-together.md). diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/scripts-and-scheduling.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/scripts-and-scheduling.md new file mode 100644 index 0000000000..848c9730f1 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/scripts-and-scheduling.md @@ -0,0 +1,157 @@ +--- +title: Scripts and scheduling in Foxx services +menuTitle: Scripts and scheduling +weight: 35 +description: >- + You can define scripts that need to be invoked directly and can be used to + implement one-off tasks or scheduled and recurring jobs using queues +--- +In addition to the main entry point which defines your service's +[routes](working-with-routers.md) and +[exports](linking-services-together.md) you can define scripts +that need to be invoked directly and can be used to implement one-off tasks +or scheduled and recurring jobs using queues. + +These scripts can be declared in the `scripts` section of +the [service manifest](../reference/service-manifest.md): + +```json +"scripts": { + "setup": "scripts/setup.js", + "send-mail": "scripts/send-mail.js" +} +``` + +## Invoking scripts + +Scripts can be invoked manually using +the [web interface](../../../components/web-interface/services.md), +the [Foxx CLI](../../../components/tools/foxx-cli/_index.md) or +the [Foxx HTTP API](../../http-api/foxx.md#miscellaneous). + +Additionally the special `setup` and `teardown` lifecycle scripts can +be invoked automatically by Foxx as part of a service's lifecycle (see below). + +## Script arguments and return values + +When invoking a script any arguments will be exposed to the script as the +`argv` array property of the [service context](../reference/service-context.md). + +Any value exported by the script using `module.exports` will be the script's +return value. Please note that this data will be converted to JSON. + +Any errors raised by the script will be handled depending on how +the script was invoked: + +- if the script was invoked manually (e.g. using the Foxx CLI), it will return + an error response using the exception's `statusCode` property or `500`. + +- if the script was invoked from a Foxx job queue, the job's failure counter + will be incremented and the job will be rescheduled or + marked as failed if no attempts remain. + +**Examples** + +The following script will use its argument to generate a personal greeting: + +```js +'use strict'; +const { argv } = module.context; + +module.exports = `Hello ${argv[0]}!`; +``` + +## Lifecycle Scripts + +Scripts named `setup` or `teardown` are considered lifecycle scripts and +will (by default) be invoked automatically by Foxx: + +- when a service is installed, upgraded or replaced, the new service's + `setup` script will be executed before it is mounted + +- when a service is removed or replaced, the old service's `teardown` + script will be executed before it is unmounted + +- when a service is upgraded, the old service's `teardown` script *can* + optionally be executed before it is unmounted + +However it's possible to override this behavior as needed. + +Note that in these cases the scripts will always be invoked without arguments +and their exports will be ignored. + +### Setup Script + +The setup script is typically used to create collections a service needs, +to define indexes or to initialize collections with necessary data +like administrative accounts. + +As the setup script may be executed more than once it should be treated +as reentrant: running the setup script again should not result in any errors +or duplicate data: + +```js +const { db } = require("@arangodb"); +const users = module.context.collectionName("users"); + +if (!db._collection(users)) { + // This won't be run if the collection exists + const collection = db._createDocumentCollection(users); + collection.ensureIndex({ + type: "hash", + unique: true, + fields: ["username"] + }); + collection.save({ + username: "admin", + password: auth.create("hunter2") + }); +} +``` + +### Teardown Script + +The teardown script typically removes the collections and/or +documents created by the service's setup script. + +In practice teardown scripts are rarely used due to the risk of +catastrophic data loss when accidentally running the script +while managing the service. + +## Migrations + +Depending on the amount of data managed by the service and the amount of work +that needs to be done to prepare collections for the service, +running a `setup` script on every upgrade can be very expensive. + +An alternative approach is to perform incremental steps in separate +migration scripts and run them manually after the service is installed. + +A `setup` script should always create all the collections a service uses +but any additional steps like creating indexes, importing data fixtures or +migrating existing data can safely be performed in separate scripts. + +## Queues + +Services can schedule scripts of any service mounted in the same database +using [Foxx queues](../reference/related-modules/queues.md): + +```js +"use strict"; +const queues = require("@arangodb/foxx/queues"); +const queue = queues.get("default"); + +// later +router.post("/signup", (req, res) => { + const user = performSignup(req.body); + // schedule sending welcome e-mail using a script + queue.push( + { + mount: module.context.mount, // i.e. this current service + name: "send-mail" // script name in the service manifest + }, + { to: user.email, body: welcomeEmailText } // arguments + ); +}); +``` + diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/testing-foxx-services.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/testing-foxx-services.md new file mode 100644 index 0000000000..9e9aba8904 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/testing-foxx-services.md @@ -0,0 +1,259 @@ +--- +title: Testing Foxx services +menuTitle: Testing Foxx services +weight: 25 +description: '' +--- +Foxx provides out of the box support for running tests against an +installed service using an API similar to +the [Mocha test runner](https://mochajs.org). + +Test files have full access to the [service context](../reference/service-context.md) +and all ArangoDB APIs but cannot define Foxx routes. + +Test files can be specified in the [service manifest](../reference/service-manifest.md) +using either explicit paths of each individual file or patterns that can +match multiple files (even if multiple patterns match the same file, +it will only be executed once): + +```json +{ + "tests": [ + "some-specific-test-file.js", + "test/**/*.js", + "**/*.spec.js", + "**/__tests__/**/*.js" + ] +} +``` + +To run a service's tests you can use +the [web interface](../../../components/web-interface/services.md), +the [Foxx CLI](../../../components/tools/foxx-cli/_index.md) or +the [Foxx HTTP API](../../http-api/foxx.md#miscellaneous). +Foxx will execute all test cases in the matching files and +generate a report in the desired format. + +{{< danger >}} +Running tests in a production environment is not recommended and +may result in data loss if the tests involve database access. +{{< /danger >}} + +## Writing tests + +ArangoDB bundles the [`chai` library](http://www.chaijs.com), +which can be used to define test assertions: + +```js +"use strict"; +const { expect } = require("chai"); + +// later +expect("test".length).to.equal(4); +``` + +Alternatively ArangoDB also provides an implementation of +[Node's `assert` module](https://nodejs.org/api/assert.html): + +```js +"use strict"; +const assert = require("assert"); + +// later +assert.equal("test".length, 4); +``` + +Test cases can be defined in any of the following ways using helper functions +injected by Foxx when executing the test file: + +### Functional style + +Test cases are defined using the `it` function and can be grouped in +test suites using the `describe` function. Test suites can use the +`before` and `after` functions to prepare and cleanup the suite and +the `beforeEach` and `afterEach` functions to prepare and cleanup +each test case individually. + +The `it` function also has the aliases `test` and `specify`. + +The `describe` function also has the aliases `suite` and `context`. + +The `before` and `after` functions also have +the aliases `suiteSetup` and `suiteTeardown`. + +The `beforeEach` and `afterEach` functions also have +the aliases `setup` and `teardown`. + +**Note**: These functions are automatically injected into the test file and +don't have to be imported explicitly. The aliases can be used interchangeably. + +```js +"use strict"; +const { expect } = require("chai"); + +test("a single test case", () => { + expect("test".length).to.equal(4); +}); + +describe("a test suite", () => { + before(() => { + // This runs before the suite's first test case + }); + after(() => { + // This runs after the suite's last test case + }); + beforeEach(() => { + // This runs before each test case of the suite + }); + afterEach(() => { + // This runs after each test case of the suite + }); + it("is a test case in the suite", () => { + expect(4).to.be.greaterThan(3); + }); + it("is another test case in the suite", () => { + expect(4).to.be.lessThan(5); + }); +}); + +suite("another test suite", () => { + test("another test case", () => { + expect(4).to.be.a("number"); + }); +}); + +context("yet another suite", () => { + specify("yet another case", () => { + expect(4).to.not.equal(5); + }); +}); +``` + +### Exports style + +Test cases are defined as methods of plain objects assigned to test suite +properties on the `exports` object: + +```js +"use strict"; +const { expect } = require("chai"); + +exports["this is a test suite"] = { + "this is a test case": () => { + expect("test".length).to.equal(4); + } +}; +``` + +Methods named `before`, `after`, `beforeEach` and `afterEach` behave similarly +to the corresponding functions in the functional style described above: + +```js +exports["a test suite"] = { + before: () => { + // This runs before the suite's first test case + }, + after: () => { + // This runs after the suite's last test case + }, + beforeEach: () => { + // This runs before each test case of the suite + }, + afterEach: () => { + // This runs after each test case of the suite + }, + "a test case in the suite": () => { + expect(4).to.be.greaterThan(3); + }, + "another test case in the suite": () => { + expect(4).to.be.lessThan(5); + } +}; +``` + +## Unit testing + +The easiest way to make your Foxx service unit-testable is to extract +critical logic into side-effect-free functions and move these functions into +modules your tests (and router) can require: + +```js +// in your router +const lookupUser = require("../util/users/lookup"); +const verifyCredentials = require("../util/users/verify"); +const users = module.context.collection("users"); + +router.post("/login", function (req, res) { + const { username, password } = req.body; + const user = lookupUser(username, users); + verifyCredentials(user, password); + req.session.uid = user._id; + res.json({ success: true }); +}); + +// in your tests +const verifyCredentials = require("../util/users/verify"); +describe("verifyCredentials", () => { + it("should throw when credentials are invalid", () => { + expect(() => verifyCredentials( + { authData: "whatever" }, + "invalid password" + )).to.throw() + }); +}) +``` + +## Integration testing + +{{< warning >}} +You should avoid running integration tests while a service +is mounted in [development mode](development-mode.md) as each request +will cause the service to be reloaded. +{{< /warning >}} + +You can [use the `@arangodb/request` module](making-requests.md) +to let tests talk to routes of the same service. + +When the request module is used with a path instead of a full URL, +the path is resolved as relative to the ArangoDB instance. +Using the `baseUrl` property of the [service context](../reference/service-context.md) +we can use this to make requests to the service itself: + +```js +"use strict"; +const { expect } = require("chai"); +const request = require("@arangodb/request"); +const { baseUrl } = module.context; + +describe("this service", () => { + it("should say 'Hello World!' at the index route", () => { + const response = request.get(baseUrl); + expect(response.status).to.equal(200); + expect(response.body).to.equal("Hello World!"); + }); + it("should greet us with name", () => { + const response = request.get(`${baseUrl}/Steve`); + expect(response.status).to.equal(200); + expect(response.body).to.equal("Hello Steve!"); + }); +}); +``` + +An implementation passing the above tests could look like this: + +```js +"use strict"; +const createRouter = require("@arangodb/foxx/router"); +const router = createRouter(); +module.context.use(router); + +router.get((req, res) => { + res.write("Hello World!"); +}) +.response(["text/plain"]); + +router.get("/:name", (req, res) => { + res.write(`Hello ${req.pathParams.name}!`); +}) +.response(["text/plain"]); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/using-node-modules.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/using-node-modules.md new file mode 100644 index 0000000000..dc085ff556 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/using-node-modules.md @@ -0,0 +1,52 @@ +--- +title: Bundled Node modules for Foxx services +menuTitle: Using Node modules +weight: 40 +description: '' +--- +You can use the `node_modules` folder to bundle Node.js modules with your Foxx +service. Note that many third-party libraries written for Node.js or the +browser rely on async or filesystem logic +[which may not be compatible with Foxx](../_index.md#compatibility-caveats). + +{{< info >}} +Bundled node modules are often referred to as _dependencies_. In ArangoDB this +term can often be ambiguous because Foxx also provides a +[dependency mechanism](linking-services-together.md) for linking services together. +{{< /info >}} + +Use a tool like [yarn](https://yarnpkg.com) or +[npm](https://npmjs.com) to +create a `package.json` file in your service source directory and add node +dependencies as you would for any other Node.js application or library: + +```sh +cd my-foxx-service/ +echo '{"private": true}' > package.json +yarn add lodash # or: +npm install --save lodash +``` + +Make sure to include the actual `node_modules` folder in your Foxx service +bundle as ArangoDB will not automatically install these dependencies for you. +Also keep in mind that bundling extraneous modules like development +dependencies may bloat the file size of your Foxx service bundle. + +If you are using the [Foxx CLI](../../../components/tools/foxx-cli/_index.md) +command-line tool, you can exclude individual modules by ignoring them: + +```sh +npm install --save prettier +foxx ignore '/node_modules/prettier/' +# the 'prettier' folder will now be excluded +# in service bundles generated by foxx-cli +foxx install /my-foxx-service +``` + +Keep in mind that both yarn and npm typically also install dependencies of +your dependencies to the `node_modules` folder which you'll need to ignore as +well if you want to exclude these modules from your service bundle. + +If you are using the npm package manager, you can use +`npm install --global-style` to force these indirect dependencies +to be nested to make them easier to exclude. \ No newline at end of file diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/using-webpack-with-foxx.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/using-webpack-with-foxx.md new file mode 100644 index 0000000000..3fa07d75a3 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/using-webpack-with-foxx.md @@ -0,0 +1,100 @@ +--- +title: Using Webpack with Foxx +menuTitle: Using Webpack with Foxx +weight: 45 +description: '' +--- +You can use [Webpack](https://webpack.js.org/) to compile your Foxx services +the same way you would compile any other JavaScript code. +However there are a few things you will need to keep in mind. + +## Basic configuration + +Because the ArangoDB JavaScript environment is largely compatible with Node.js, +the starting point looks fairly similar: + +```js +"use strict"; +module.exports = { + mode: "production", + target: "node", + output: { + libraryTarget: "commonjs2" + }, + externals: [/^@arangodb(\/|$)/] +}; +``` + +## The service context + +Foxx extends the `module` object with a special `context` property that +reflects the current [service context](../reference/service-context.md). +As Webpack compiles multiple modules into a single file your code will +not be able to access the real `module` object provided by ArangoDB. + +To work around this limitation you can use the `context` provided by the +[`@arangodb/locals` module](../reference/related-modules/_index.md#the-arangodblocals-module): + +```js +const { context } = require("@arangodb/locals"); +``` + +This object is identical to `module.context` and can be used as +a drop-in replacement: + +```js +const { context } = require("@arangodb/locals"); +const createRouter = require("@arangodb/foxx/router"); + +const router = createRouter(); +context.use(router); +``` + +## Externals + +By default Webpack will attempt to include any dependency your code imports. +This makes it easy to use third-party modules without worrying about +[filtering `devDependencies`](using-node-modules.md) +but causes problems when importing modules provided by ArangoDB. + +Most modules that are specific to ArangoDB or Foxx reside in the `@arangodb` +namespace. This makes it fairly straightforward to tell Webpack to ignore +them using the `externals` option: + +```js +module.exports = { + // ... + externals: [/^@arangodb(\/|$)/] +}; +``` + +You can also use this to exclude other modules provided by ArangoDB, +like the `joi` validation library: + +```js +module.exports = { + // ... + externals: [/^@arangodb(\/|$)/, "joi"] +}; +``` + +## Compiling scripts + +As far as Webpack is concerned, scripts are additional entry points: + +```js +const path = require("path"); +module.exports = { + // ... + context: path.resolve(__dirname, "src"), + entry: { + main: "./index.js", + setup: "./scripts/setup.js" + } +}; +``` + +**Note**: If your scripts are sharing a lot of code with each other or +the rest of the service this can result in some overhead as the shared code +will be included in each output file. A possible solution would be to +extract the shared code into a separate bundle. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-collections.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-collections.md new file mode 100644 index 0000000000..83d7d58faf --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-collections.md @@ -0,0 +1,70 @@ +--- +title: Working with collections in Foxx services +menuTitle: Working with collections +weight: 10 +description: '' +--- +Foxx provides the [`module.context.collection`](../reference/service-context.md) method +to provide easy access to ArangoDB collections. These collections are also +called "prefixed collections" because Foxx will automatically prefix the name +based on the mount path of the service. + +The prefixes may initially feel unnecessarily verbose but help avoid conflicts +between different services with similar collection names or even multiple +copies of the same service sharing the same database. Keep in mind that you +can also use collection objects when [writing queries](writing-queries.md), +so you don't need to worry about writing out prefixes by hand. + +As a rule of thumb you should always use `module.context.collection` +to access collections in your service. + +## Low-level collection access + +ArangoDB provides a low-level API for managing collections +via the [`db` object](../../javascript-api/@arangodb/db-object.md#collections). +These APIs are not very useful for most application logic but allow you to +create and destroy collections in your +[lifecycle scripts and migrations](scripts-and-scheduling.md#lifecycle-scripts). + +Using these methods requires you to work with fully qualified collection names. +This means instead of using `module.context.collection` to get a +_collection object_ you need to use `module.context.collectionName` +to get the prefixed _collection name_ ArangoDB understands: + +```js +"use strict"; +const { db } = require("@arangodb"); +const collectionName = module.context.collectionName("users"); + +if (!db._collection(collectionName)) { + db._createDocumentCollection(collectionName); +} +``` + +## Sharing collections + +The most obvious way to share collections between multiple services is to use +an unprefixed collection name and then use the low-level `db._collection` +method to access that collection from each service that needs access to it. + +The downside of this approach is that it results in an implicit dependency of +those services on a single collection as well as creating the potential for +subtle problems if a different service uses the same unprefixed +collection name in the future. + +The cleanest approach is to instead decide on a single service which manages +the collection and set up [explicit dependencies](linking-services-together.md) between +the different services using the collection: + +```js +// in the service's main file: +exports.users = module.context.collection("users"); + +// in a dependent service's code: +const users = module.dependencies.usersService.users; +``` + +This approach not only makes the dependency on an externally managed collection +explicit but also allows having those services still use different collections +if necessary by providing multiple copies of the service that provides the +shared collection. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-files.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-files.md new file mode 100644 index 0000000000..e04148d4cf --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-files.md @@ -0,0 +1,111 @@ +--- +title: File access in Foxx +menuTitle: Working with files +weight: 60 +description: '' +--- +Files within the service folder should always be considered read-only. +You should not expect to be able to write to your service folder or +modify any existing files. + +ArangoDB is primarily a database. In most cases the best place to store data +is therefore inside the database, not on the file system. + +## Serving files + +The most flexible way to serve files in your Foxx service is to simply +pass them through in your router using +the [context object's `fileName` method](../reference/service-context.md#filename) and +the [response object's `sendFile` method](../reference/routers/response.md#sendfile): + +```js +router.get("/some/filename.png", function(req, res) { + const filePath = module.context.fileName("some-local-filename.png"); + res.sendFile(filePath); +}); +``` + +While allowing for greater control of how the file should be sent to +the client and who should be able to access it, +doing this for all your static assets can get tedious. + +Alternatively you can specify file assets that should be served by your +Foxx service directly in the [service manifest](../reference/service-manifest.md) +using the `files` attribute: + +```json +"files": { + "/some/filename.png": { + "path": "some-local-filename.png", + "type": "image/png", + "gzip": false + }, + "/favicon.ico": "bookmark.ico", + "/static": "my-assets-folder" +} +``` + +## Writing files + +It is almost always an extremely bad idea to attempt to modify +the filesystem from within a service: + +- The service folder itself is considered an implementation artefact and + **may be discarded and replaced without warning**. + ArangoDB maintains a canonical copy of each service internally to + detect missing or damaged services and restore them automatically. + +- ArangoDB uses multiple V8 contexts to allow handling multiple + Foxx requests in parallel. Writing to the same file in a request handler + may therefore cause race conditions and **result in corrupted data**. + +- Writing to files outside the service folder introduces external state. In + a cluster, this results in Coordinators no longer being interchangeable. + +- Writing to files during setup is unreliable because the setup script may + be executed several times or not at all. In a cluster, the setup script + is only executed on a single Coordinator. + +Therefore it is almost always a better option to store files using a +specialized, external file storage service +and handle file uploads outside Foxx itself. + +However in some cases it may be feasible to store smaller files directly in +ArangoDB documents by using a separate collection. + +{{< danger >}} +Due to the way ArangoDB stores documents internally, you should not store +file contents alongside other attributes that might be updated independently. +Additionally, large file sizes impact performance for operations +involving the document and may affect overall database performance. +{{< /danger >}} + +{{< warning >}} +In production, you should avoid storing any files in ArangoDB or handling file +uploads in Foxx. The following example works for moderate amounts of small +files but is not recommended for large files or frequent uploads or +modifications. +{{< /warning >}} + +To store files in a document you can simply convert the file contents +as a `Buffer` to a base64-encoded string: + +```js +router.post('/avatars/:filename', (req, res) => { + collection.save({ + filename: req.pathParams.filename, + data: req.body.toString('base64') + }); + res.status('no content'); +}); +router.get('/avatars/:filename', (req, res) => { + const doc = collection.firstExample({ + filename: req.pathParams.filename + }); + if (!doc) res.throw('not found'); + const data = new Buffer(doc.data, 'base64'); + res.set('content-type', 'image/png'); + res.set('content-length', data.length); + res.write(data); +}); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-routers.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-routers.md new file mode 100644 index 0000000000..b32c334105 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/working-with-routers.md @@ -0,0 +1,126 @@ +--- +title: Working with routers in Foxx services +menuTitle: Working with routers +weight: 5 +description: '' +--- +In Foxx [routers](../reference/routers/_index.md) are used to define +the URLs of your API. The easiest way to use a router is to mount it +directly in the service using the [context](../reference/service-context.md): + +```js +const createRouter = require("@arangodb/foxx/router"); +const router = createRouter(); + +module.context.use(router); +``` + +## Nested routers + +Instead of mounting routers where they are defined, routers can also be +exported from one module and imported in another. This allows you to +structure your routes by splitting them across multiple files: + +```js +// in your main file +const usersRouter = require("./api/users"); +module.context.use("/users", usersRouter); + +// in api/users/index.js +const createRouter = require("@arangodb/foxx/router"); +const usersRouter = createRouter(); +module.exports = usersRouter; + +usersRouter.get("/me", (req, res) => { + // this will be exposed as /users/me +}); +``` + +You can also mount routers inside of each other: + +```js +// in api/users/friends.js +const createRouter = require("@arangodb/foxx/router"); +const friendsRouter = createRouter(); +module.exports = friendsRouter; + +// in api/users/index.js +const friendsRouter = require("./friends"); +usersRouter.use("/friends", friendsRouter); +``` + +Note that you can also mount several routers with the same prefix +or even without a prefix: + +```js +adminRouter.use(usersAdminRouter); +adminRouter.use(groupsAdminRouter); +``` + +### Local middleware + +Router-level middleware only applies to the router it is applied to and +is not shared between multiple routers mounted at the same prefix +(or without a prefix). + +This can be especially useful when restricting access to +some routes but not others: + +```js +const createRouter = require("@arangodb/foxx/router"); +const publicRoutes = createRouter(); +const authedRoutes = createRouter(); + +authedRoutes.use((req, res, next) => { + if (req.session.uid) { + next(); + } else { + res.throw("unauthorized"); + } +}); + +module.context.use(publicRoutes); +module.context.use(authedRoutes); +``` + +## Router factories + +Sometimes you may have routers you want to use in multiple projects or +use at multiple points of your API but with slightly different implementations +or using different collections. + +In these cases it can be useful to return the router from a function that +takes these differences as arguments instead of exporting the router directly: + +```js +// in your main file +const createUsersRouter = require("../util/users-router"); +const usersRouter = createUsersRouter( + module.context.collection("users"), + "username" +); +module.context.use(usersRouter); + +// in util/users-router.js +const createRouter = require("@arangodb/foxx/router"); +const { query } = require("@arangodb"); + +module.export = (usersCollection, keyField) => { + const router = createRouter(); + router.use((req, res) => { + if (!req.session || !req.session.uid) { + res.throw("unauthorized"); + } + }); + router.get("/me", (req, res) => { + const user = query` + FOR user IN ${usersCollection} + FILTER user[${keyField}] == ${req.session.uid} + LIMIT 1 + RETURN user + `.next(); + res.json(user); + }); + return router; +}; +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/guides/writing-queries.md b/site/content/arangodb/oem/develop/foxx-microservices/guides/writing-queries.md new file mode 100644 index 0000000000..b69e8a840b --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/guides/writing-queries.md @@ -0,0 +1,232 @@ +--- +title: Writing queries in Foxx services +menuTitle: Writing queries +weight: 15 +description: '' +--- +ArangoDB provides the `query` template string handler +(or [template tag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)) +to make it easy to write and execute [AQL queries](../../../aql/_index.md) +in your Foxx services: + +```js +const { query } = require("@arangodb"); +const max = 13; +const oddNumbers = query` + FOR i IN 1..${max} + FILTER i % 2 == 1 + RETURN i +`.toArray(); +console.log(oddNumbers); // 1,3,5,7,9,11,13 +``` + +Any values passed via interpolation (i.e. using the `${expression}` syntax) +are passed to ArangoDB as +[AQL bind parameters](../../../aql/fundamentals/bind-parameters.md), +so you don't have to worry about escaping them in order to protect against +injection attacks in user-supplied data. + +The result of the executed query is +[an ArangoDB array cursor](../../../aql/how-to-invoke-aql/with-arangosh.md#cursors). +You can extract all query results using the `toArray()` method or +step through the result set using the `next()` method. + +You can also consume a cursor with a for-loop: + +```js +const cursor = query` + FOR i IN 1..5 + RETURN i +`; +for (const item of cursor) { + console.log(item); +} +``` + +It is also possible to pass options to the query helper: + +```js +const cursor = query({ fullCount: true })` + FOR i IN 1..1000 + LIMIT 0, 100 + RETURN i +`; +const { fullCount } = cursor.getExtra().stats; +console.log(`${fullCount} total`); +console.log(cursor.toArray()); +``` + +## Using collections + +When [working with collections in your service](working-with-collections.md) you generally +want to avoid hardcoding exact collection names. But if you pass a +collection name directly to a query it will be treated as a string: + +```js +// THIS DOES NOT WORK +const users = module.context.collectionName("users"); +// e.g. "myfoxx_users" +const admins = query` + FOR user IN ${users} + FILTER user.isAdmin + RETURN user +`.toArray(); // ERROR +``` + +Instead you need to pass an ArangoDB collection object: + +```js +const users = module.context.collection("users"); +// users is now a collection, not a string +const admins = query` + FOR user IN ${users} + FILTER user.isAdmin + RETURN user +`.toArray(); +``` + +Note that you don't need to use any different syntax to use +a collection in a query, but you do need to make sure the collection is +an actual ArangoDB collection object rather than a plain string. + +## Low-level access + +In addition to the `query` template tag, ArangoDB also provides +the `aql` template tag, which only generates a query object +but doesn't execute it: + +```js +const { db, aql } = require("@arangodb"); +const max = 7; +const query = aql` + FOR i IN 1..${max} + RETURN i +`; +const numbers = db._query(query).toArray(); +``` + +You can also use the `db._query` method to execute queries using +plain strings and passing the bind parameters as an object: + +```js +// Note the lack of a tag, this is a normal string +const query = ` + FOR user IN @@users + FILTER user.isAdmin + RETURN user +`; +const admins = db._query(query, { + // We're passing a string instead of a collection + // because this is an explicit collection bind parameter + // using the AQL double-at notation + "@users": module.context.collectionName("users") +}).toArray(); +``` + +Note that when using plain strings as queries ArangoDB provides +no safeguards to prevent accidental AQL injections: + +```js +// Malicious user input where you might expect a number +const evil = "1 FOR u IN myfoxx_users REMOVE u IN myfoxx_users"; +// DO NOT DO THIS +const numbers = db._query(` + FOR i IN 1..${evil} + RETURN i +`).toArray(); +// Actual query executed by the code: +// FOR i IN 1..1 +// FOR u IN myfoxx_users +// REMOVE u IN myfoxx_users +// RETURN i +``` + +If possible, you should always use the `query` or `aql` template tags +rather than passing raw query strings to `db._query` directly. + +## AQL fragments + +If you need to insert AQL snippets dynamically, you can still use +the `query` template tag by using the `aql.literal` helper function to +mark the snippet as a raw AQL fragment: + +```js +const filter = aql.literal( + adminsOnly ? 'FILTER user.isAdmin' : '' +); +const result = query` + FOR user IN ${users} + ${filter} + RETURN user +`.toArray(); +``` + +Both the `query` and `aql` template tags understand fragments marked +with the `aql.literal` helper and inline them directly into the query +instead of converting them to bind parameters. + +Note that because the `aql.literal` helper takes a raw string as argument +the same security implications apply to it as when writing raw AQL queries +using plain strings: + +```js +// Malicious user input where you might expect a condition +const evil = "true REMOVE u IN myfoxx_users"; +// DO NOT DO THIS +const filter = aql.literal(`FILTER ${evil}`); +const result = query` + FOR user IN ${users} + ${filter} + RETURN user +`.toArray(); +// Actual query executed by the code: +// FOR user IN myfoxx_users +// FILTER true +// REMOVE user IN myfoxx_users +// RETURN user +``` + +A typical scenario that might result in an exploit like this is taking +arbitrary strings from a search UI to filter or sort results by a field name. +Make sure to restrict what values you accept. + +## Managing queries in your service + +In many cases it may be initially more convenient to perform queries +right where you use their results: + +```js +router.get("/emails", (req, res) => { + res.json(query` + FOR u IN ${users} + FILTER u.active + RETURN u.email + `.toArray()) +}); +``` + +However to [help testability](testing-foxx-services.md) and make the queries more reusable, +it's often a good idea to move them out of your request handlers +into separate functions, e.g.: + +```js +// in queries/get-user-emails.js +"use strict"; +const { query, aql } = require("@arangodb"); +const users = module.context.collection("users"); +module.exports = (activeOnly = true) => query` + FOR user IN ${users} + ${aql.literal(activeOnly ? "FILTER user.active" : "")} + RETURN user.email +`.toArray(); + +// in your router +const getUserEmails = require("../queries/get-user-emails"); + +router.get("/active-emails", (req, res) => { + res.json(getUserEmails(true)); +}); +router.get("/all-emails", (req, res) => { + res.json(getUserEmails(false)); +}); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/_index.md new file mode 100644 index 0000000000..74031254ea --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/_index.md @@ -0,0 +1,19 @@ +--- +title: Foxx reference +menuTitle: Reference +weight: 20 +description: '' +--- +Each Foxx service is defined by a [JSON manifest](service-manifest.md) +specifying the entry point, any scripts defined by the service, +possible [configuration](configuration.md) options and Foxx dependencies, +as well as other metadata. Within a service, these options are exposed as the +[service context](service-context.md), which is also used to mount +[routers](routers/_index.md) defining the service's API endpoints. + +Foxx also provides a number of [utility modules](related-modules/_index.md) +as well as a flexible [sessions middleware](sessions-middleware/_index.md) +with different transport and storage mechanisms. + +Foxx services can be installed and managed over the Web-UI or through +ArangoDB's [HTTP API](../../http-api/foxx.md#management). diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/configuration.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/configuration.md new file mode 100644 index 0000000000..aaf858a1dd --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/configuration.md @@ -0,0 +1,78 @@ +--- +title: Foxx configuration +menuTitle: Configuration +weight: 15 +description: '' +--- +Foxx services can define configuration parameters +[in the service manifest](service-manifest.md) to make them more re-usable. + +The `configuration` object maps names to configuration parameters: + +- The key is the name under which the parameter will be available on the + [service context's](service-context.md) `configuration` property. + +- The value is a parameter definition. + +The key should be a valid identifier following the case-insensitive format +`/^[_$a-z][-_$a-z0-9]*$/`. + +The parameter definition can have the following properties: + +- **description**: `string` + + Human readable description of the parameter. + +- **type**: `string` (Default: `"string"`) + + Type of the configuration parameter. Supported values are: + + - `"integer"` or `"int"`: + any finite integer number. + + - `"boolean"` or `"bool"`: + the values `true` or `false`. + + - `"number"`: + any finite decimal or integer number. + + - `"string"`: + any string value. + + - `"json"`: + any well-formed JSON value. + + - `"password"`: + like *string* but will be displayed as a masked input field in the web web interface. + +- **default**: `any` + + Default value of the configuration parameter. + +- **required**: (Default: `true`) + + Whether the parameter is required. + +If the configuration has parameters that do not specify a default value, you +need to configure the service before it becomes active. In the meantime a +fallback service will be mounted that responds to all requests with a HTTP 500 +status code indicating a server-side error. + +The configuration parameters of a mounted service can be adjusted from the +web interface by clicking the *Configuration* button in the service details. + +**Examples** + +```json +"configuration": { + "currency": { + "description": "Currency symbol to use for prices in the shop.", + "default": "$", + "type": "string" + }, + "secretKey": { + "description": "Secret key to use for signing session tokens.", + "type": "password" + } +} +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/_index.md new file mode 100644 index 0000000000..eba7eda6e7 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/_index.md @@ -0,0 +1,62 @@ +--- +title: Related modules for Foxx +menuTitle: Related modules +weight: 30 +description: '' +--- +These are some of the modules outside of Foxx you will find useful when +writing Foxx services. + +Additionally there are modules providing some level of compatibility with +Node.js as well as a number of bundled NPM modules (like lodash and joi). +For more information on these modules, see the +[JavaScript API](../../../javascript-api/_index.md#javascript-modules). + +## The `@arangodb` module + +`require('@arangodb')` + +This module provides access to various ArangoDB internals as well as three of +the most important exports necessary to work with the database in Foxx: +`db`, `aql` and `errors`. + +You can find a full description of this module in the +[ArangoDB module appendix](../../../javascript-api/@arangodb/_index.md). + +## The `@arangodb/locals` module + +`require('@arangodb/locals')` + +This module provides a `context` object which is identical to the +[service context](../service-context.md) of whichever module requires it. + +There is no advantage to using this module over the `module.context` variable +directly unless you're [using a tool like Webpack](../../guides/using-webpack-with-foxx.md) +to translate your code and can't use the `module` object Foxx provides directly. + +## The `@arangodb/request` module + +`require('@arangodb/request')` + +This module provides a function for making HTTP requests to external services. +Note that while this allows communicating with third-party services it may +affect database performance by blocking Foxx requests as ArangoDB waits for +the remote service to respond. If you routinely make requests to slow external +services and are not directly interested in the response it is probably a +better idea to delegate the actual request/response cycle to a gateway service +running outside ArangoDB. + +You can find a full description of this module in the +[request module appendix](../../../javascript-api/request.md). + +## The `@arangodb/general-graph` module + +`require('@arangodb/general-graph')` + +This module provides access to ArangoDB graph definitions and various low-level +graph operations in JavaScript. For more complex queries it is probably better +to use AQL but this module can be useful in your setup and teardown scripts to +create and destroy graph definitions. + +For more information see the chapter on the +[general graph module](../../../../graphs/general-graphs/_index.md). diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/authentication.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/authentication.md new file mode 100644 index 0000000000..5991fa341e --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/authentication.md @@ -0,0 +1,109 @@ +--- +title: Foxx Authentication +menuTitle: Authentication +weight: 5 +description: '' +--- +`const createAuth = require('@arangodb/foxx/auth');` + +Authenticators allow implementing basic password mechanism using simple +built-in hashing functions. + +## Creating an authenticator + +`createAuth([options]): Authenticator` + +Creates an authenticator. + +**Arguments** + +- **options**: `Object` (optional) + + An object with the following properties: + + - **method**: `string` (Default: `"sha256"`) + + The hashing algorithm to use to create password hashes. + The authenticator is able to verify passwords against hashes using + any supported hashing algorithm. This only affects new hashes created + by the authenticator. + + Supported values: + + - `"md5"` + - `"sha1"` + - `"sha224"` + - `"sha256"` + - `"sha384"` + - `"sha512"` + - `"pbkdf2"` + + **Note**: PBKDF2 is more secure but also takes considerably more resources + to compute, which impacts ArangoDB performance, especially when + verifying/hashing multiple passwords at a time. If you need a secure + authentication mechanism consider performing authentication outside the database + or using a third-party identity provider that [supports OAuth 1.0a](oauth-1-0a.md) + or [OAuth 2.0](oauth-2-0.md). + + - **saltLength**: `number` (Default: `16`) + + Length of the salts that is generated for password hashes. + + Also used as the key length for PBKDF2. + + - **workFactor**: `number` (Default: `1`) + + Can be used to scale the number of iterations for PBKDF2 hashes, + lower means faster, higher means slower. + + Note that when using PBKDF2, the number of iterations is automatically + scaled based on the number of milliseconds elapsed since 1 January 2000, + the work factor can be used to adjust the result further as needed. + +Returns an authenticator. + +## Creating authentication data objects + +`auth.create(password): AuthData` + +Creates an authentication data object for the given password with the +following properties: + +- **method**: `string` + + The method used to generate the hash. + +- **salt**: `string` + + A random salt used to generate this hash. + +- **hash**: `string` + + The hash string itself. + +**Arguments** + +- **password**: `string` + + A password to hash. + +Returns the authentication data object. + +## Validating passwords against authentication data objects + +`auth.verify([hash, [password]]): boolean` + +Verifies the given password against the given hash using a constant time +string comparison. + +**Arguments** + +- **hash**: `AuthData` (optional) + + A authentication data object generated with the `create()` method. + +- **password**: `string` (optional) + + A password to verify against the hash. + +Returns `true` if the hash matches the given password. Returns `false` otherwise. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/graphql.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/graphql.md new file mode 100644 index 0000000000..40cd51dd08 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/graphql.md @@ -0,0 +1,160 @@ +--- +title: Foxx GraphQL integration +menuTitle: GraphQL +weight: 20 +description: '' +--- +`const createGraphQLRouter = require('@arangodb/foxx/graphql');` + +The `@arangodb/foxx/graphql` module lets you create routers for serving +GraphQL requests, which closely mimics the behavior of the +[`express-graphql` module](https://github.com/graphql/express-graphql). + +For an example of a GraphQL schema in Foxx that resolves fields using the +database see the [GraphQL example service](https://github.com/arangodb-foxx/demo-graphql) +(also available from the Foxx store). + +Starting with `graphql` version 0.12 you can use the +[official graphql library](https://github.com/graphql/graphql-js) +if you include it in the `node_modules` folder of your service bundle and pass +it to the `graphql` option: + +```js +const graphql = require('graphql'); // 0.12 or later +const graphqlSchema = new graphql.Schema({ + //... +}); +module.context.use(createGraphQLRouter({ + schema: graphqlSchema, + graphiql: true, + graphql: graphql +})) +``` + +Foxx also bundles version 0.6 of the +[`graphql-sync` module](https://www.npmjs.com/package/graphql-sync), +which is a synchronous wrapper for the official JavaScript GraphQL reference +implementation. + +{{< warning >}} +`graphql-sync` is a thin wrapper for old versions of `graphql`, allowing it +to run in ArangoDB. This GraphQL server/schema implementation is deprecated +and only shipped for backward compatibility. Version 0.12 and newer of the +official `graphql` package can be used directly. New projects should bundle +their own copy of this module: <https://www.npmjs.com/package/graphql> +{{< /warning >}} + +**Examples** + +```js +const graphql = require('graphql-sync'); +const graphqlSchema = new graphql.GraphQLSchema({ + // ... +}); + +// Mounting a graphql endpoint directly in a service: +module.context.use('/graphql', createGraphQLRouter({ + schema: graphqlSchema, + graphiql: true +})); + +// Or at the service's root URL: +module.context.use(createGraphQLRouter({ + schema: graphqlSchema, + graphiql: true +})); + +// Or inside an existing router: +router.get('/hello', function (req, res) { + res.write('Hello world!'); +}); +router.use('/graphql', createGraphQLRouter({ + schema: graphqlSchema, + graphiql: true +})); +``` + +For more information on `graphql-sync` see the +[`graphql-js` API reference](http://graphql.org/docs/api-reference-graphql/). + +## Creating a router + +`createGraphQLRouter(options): Router` + +This returns a new router object with POST and GET routes for serving GraphQL requests. + +**Arguments** + +- **options**: `object` + + An object with any of the following properties: + + - **schema**: `GraphQLSchema` + + A GraphQL Schema object from `graphql-sync`. + + - **context**: `any` (optional) + + The GraphQL context that is passed to the `graphql()` function from + `graphql-sync` to handle GraphQL queries. + + - **rootValue**: `object` (optional) + + The GraphQL root value that is passed to the `graphql()` function + from `graphql-sync` to handle GraphQL queries. + + - **pretty**: `boolean` (Default: `false`) + + If `true`, JSON responses are pretty-printed. + + - **formatError**: `Function` (optional) + + A function that is used to format errors produced by `graphql-sync`. + If omitted, the `formatError` function from `graphql-sync` is used instead. + + - **validationRules**: `Array<any>` (optional) + + Additional validation rules queries must satisfy in addition to those + defined in the GraphQL spec. + + - **graphiql**: `boolean` (Default: `false`) + + If `true`, the [GraphiQL](https://github.com/graphql/graphiql) explorer + will be served when loaded directly from a browser. + + - **graphql**: `object` (optional) + + If you need to use your own copy of the `graphql-sync` module instead of + the one bundled with ArangoDB, here you can pass it in directly. + +If a GraphQL Schema object is passed instead of an options object, it is +interpreted as the `schema` option. + +## Generated routes + +The router handles GET and POST requests to its root path and accepts the +following parameters, which can be provided either as query parameters or +as the POST request body: + +- **query**: `string` + + A GraphQL query to execute. + +- **variables**: `object | string` (optional) + + An object or a string containing a JSON object with runtime values to use + for any GraphQL query variables. + +- **operationName**: `string` (optional) + + If the provided `query` contains multiple named operations, this specifies + which operation should be executed. + +- **raw**: `boolean` (Default: `false`) + + Forces a JSON response even if `graphiql` is enabled and the request was + made using a browser. + +The POST request body can be provided as JSON or as query string using +`application/x-www-form-urlencoded`. A request body passed as +`application/graphql` is interpreted as the `query` parameter. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md new file mode 100644 index 0000000000..5914c9b7f2 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-1-0a.md @@ -0,0 +1,430 @@ +--- +title: Foxx OAuth 1.0a +menuTitle: OAuth 1.0a +weight: 10 +description: '' +--- +`const createOAuth1Client = require('@arangodb/foxx/oauth1');` + +The OAuth1 module provides abstractions over OAuth 1.0a providers like +Twitter, XING and Tumblr. + +**Examples** + +```js +const router = createRouter(); +const oauth1 = createOAuth1Client({ + // We'll use Twitter for this example + requestTokenEndpoint: 'https://api.twitter.com/oauth/request_token', + authEndpoint: 'https://api.twitter.com/oauth/authorize', + accessTokenEndpoint: 'https://api.twitter.com/oauth/access_token', + activeUserEndpoint: 'https://api.twitter.com/1.1/account/verify_credentials.json', + clientId: 'keyboardcat', + clientSecret: 'keyboardcat' +}); + +module.context.use('/oauth1', router); + +// See the user management example for setting up the +// sessions and users objects used in this example +router.use(sessions); + +router.post('/auth', function (req, res) { + const url = req.reverse('oauth1_callback'); + const oauth_callback = req.makeAbsolute(url); + const requestToken = oauth1.fetchRequestToken(oauth_callback); + if (requestToken.oauth_callback_confirmed !== 'true') { + res.throw(500, 'Could not fetch OAuth request token'); + } + // Set request token cookie for five minutes + res.cookie('oauth1_request_token', requestToken.oauth_token, {ttl: 60 * 5}); + // Redirect to the provider's authorization URL + res.redirect(303, oauth1.getAuthUrl(requestToken.oauth_token)); +}); + +router.get('/auth', function (req, res) { + // Make sure CSRF cookie matches the URL + const expectedToken = req.cookie('oauth1_request_token'); + if (!expectedToken || req.queryParams.oauth_token !== expectedToken) { + res.throw(400, 'CSRF mismatch.'); + } + const authData = oauth1.exchangeRequestToken( + req.queryParams.oauth_token, + req.queryParams.oauth_verifier + ); + const twitterToken = authData.oauth_token; + const twitterSecret = authData.oauth_token_secret; + // Fetch the active user's profile info + const profile = oauth1.fetchActiveUser(twitterToken, twitterSecret); + const twitterId = profile.screen_name; + // Try to find an existing user with the user ID + // (this requires the users collection) + let user = users.firstExample({twitterId}); + if (user) { + // Update the twitterToken if it has changed + if ( + user.twitterToken !== twitterToken || + user.twitterSecret !== twitterSecret + ) { + users.update(user, {twitterToken, twitterSecret}); + } + } else { + // Create a new user document + user = { + username: `twitter:${twitterId}`, + twitterId, + twitterToken + } + const meta = users.save(user); + Object.assign(user, meta); + } + // Log the user in (this requires the session middleware) + req.session.uid = user._key; + req.session.twitterToken = authData.twitterToken; + req.session.twitterSecret = authData.twitterSecret; + req.sessionStorage.save(req.session); + // Redirect to the default route + res.redirect(303, req.makeAbsolute('/')); +}, 'oauth1_callback') +.queryParam('oauth_token', joi.string().optional()) +.queryParam('oauth_verifier', joi.string().optional()); +``` + +## Creating an OAuth1.0a client + +`createOAuth1Client(options): OAuth1Client` + +Creates an OAuth1.0a client. + +**Arguments** + +- **options**: `Object` + + An object with the following properties: + + - **requestTokenEndpoint**: `string` + + The fully-qualified URL of the provider's + [Temporary Credentials Request endpoint](https://tools.ietf.org/html/rfc5849#section-2.1). + This URL is used to fetch the unauthenticated temporary credentials that + will be used to generate the authorization redirect for the user. + + - **authEndpoint**: `string` + + The fully-qualified URL of the provider's + [Resource Owner Authorization endpoint](https://tools.ietf.org/html/rfc5849#section-2.2). + This is the URL the user is redirected to in order to authorize the + OAuth consumer (i.e. your service). + + - **accessTokenEndpoint**: `string` + + The fully-qualified URL of the provider's + [Token Request endpoint](https://tools.ietf.org/html/rfc5849#section-2.3). + This URL is used to exchange the authenticated temporary credentials + received from the authorization redirect for the actual token credentials + that can be used to make requests to the API server. + + - **activeUserEndpoint**: `string` (optional) + + The fully-qualified URL of the provider's endpoint for fetching details + about the current user. + + - **clientId**: `string` + + The application's *Client ID* (or `Consumer Key`) for the provider. + + - **clientSecret**: `string` + + The application's *Client Secret* (or `Consumer Secret`) for the provider. + + - **signatureMethod**: `string` (Default: `"HMAC-SHA1"`) + + The cryptographic method that is used to sign OAuth 1.0a requests. + Only `"HMAC-SHA1-"` and `"PLAINTEXT"` are supported at this time. + + Note that many providers may not implement `"PLAINTEXT"` as it exposes the + `Client Secret` and `oauth_token_secret` instead of generating a signature. + +Returns an OAuth 1.0a client for the given provider. + +### Setting up OAuth 1.0a for Twitter + +If you want to use Twitter as the OAuth 1.0a provider, use the following options: + +- `requestTokenEndpoint`: `https://api.twitter.com/oauth/request_token` +- `authEndpoint`: `https://api.twitter.com/oauth/authorize` +- `accessTokenEndpoint`: `https://api.twitter.com/oauth/access_token` +- `activeUserEndpoint`: `https://api.twitter.com/1.1/account/verify_credentials.json` + +You also need to obtain a client ID and client secret from Twitter: + +1. Create a regular account at [Twitter](https://www.twitter.com) or use an + existing account you own. +2. Visit the [Twitter Application Management](https://apps.twitter.com) + dashboard and sign in with your Twitter account. +3. Click on **Create New App** and follow the instructions provided. + The **Callback URL** should match your `oauth_callback` later. You may be + prompted to add a mobile phone number to your account and verify it. +4. Open the **Keys and Access Tones** tab, then note down the **Consumer Key** + and **Consumer Secret**. +5. Set the option `clientId` to the **Consumer Key** and the option + `clientSecret` to the **Consumer Secret**. + +Note that if you only need read-only access to public information, you can also +[use the `clientId` and `clientSecret` directly](https://dev.twitter.com/oauth/application-only) +without OAuth 1.0a. + +See [Twitter REST API Reference Documentation](https://dev.twitter.com/rest/reference). + +### Setting up OAuth 1.0a for XING + +If you want to use XING as the OAuth 1.0a provider, use the following options: + + `requestTokenEndpoint`: `https://api.xing.com/v1/request_token` + `authEndpoint`: `https://api.xing.com/v1/authorize` + `accessTokenEndpoint`: `https://api.xing.com/v1/access_token` + `activeUserEndpoint`: `https://api.xing.com/v1/users/me` + +You also need to obtain a client ID and client secret from XING: + +1. Create a regular account at [XING](https://xing.com) or use an existing + account you own. +2. Visit the [XING Developer](https://dev.xing.com) page and sign in with + your XING account. +3. Click on **Create app** and note down the **Consumer key** and **Consumer secret**. +4. Set the `clientId` option to the **Consumer key** and the + `clientSecret` option to the **Consumer secret**. + +See [XING Developer Documentation](https://dev.xing.com/docs). + +### Setting up OAuth 1.0a for Tumblr + +If you want to use Tumblr as the OAuth 1.0a provider, use the following options: + +- `requestTokenEndpoint`: `https://www.tumblr.com/oauth/request_token` +- `authEndpoint`: `https://www.tumblr.com/oauth/authorize` +- `accessTokenEndpoint`: `https://www.tumblr.com/oauth/access_token` +- `activeUserEndpoint`: `https://api.tumblr.com/v2/user/info` + +You also need to obtain a client ID and client secret from Tumblr: + +1. Create a regular account at [Tumblr](https://www.tumblr.com) or use an + existing account you own. +2. Visit the [Tumblr Applications](https://www.tumblr.com/oauth/apps) dashboard. +3. Click on **Register application**, then follow the instructions provided. + The **Default callback URL** should match your `oauth_callback` later. +4. Note down the **OAuth Consumer Key** and **Secret Key**. The secret may be + hidden by default. +5. Set the `clientId` option to the **OAuth Consumer Key** and the + `clientSecret` option to the **Secret Key**. + +See [Tumblr API Documentation](https://www.tumblr.com/docs/en/api/v2). + +## Fetch an unauthenticated request token + +`oauth1.fetchRequestToken(oauth_callback, opts)` + +Fetches an `oauth_token` that can be used to create an authorization URL that +redirects to the given `oauth_callback` on confirmation. + +Performs a `POST` response to the `requestTokenEndpoint`. + +Throws an exception if the remote server responds with an empty response body. + +**Arguments** + +- **oauth_callback**: `string` + + The fully-qualified URL of your application's OAuth 1.0a callback. + +- **opts**: `Object` (optional) + + An object with additional query parameters to include in the request. + + See [RFC 5849](https://tools.ietf.org/html/rfc5849). + +Returns the parsed response object. + +## Get the authorization URL + +`oauth1.getAuthUrl(oauth_token, opts): string` + +Generates the authorization URL for the authorization endpoint. + +**Arguments** + +- **oauth_token**: `string` + + The `oauth_token` previously returned by `fetchRequestToken`. + +- **opts**: (optional) + + An object with additional query parameters to add to the URL. + + See [RFC 5849](https://tools.ietf.org/html/rfc5849). + +Returns a fully-qualified URL for the authorization endpoint of the provider +by appending the `oauth_token` and any additional arguments from `opts` to +the `authEndpoint`. + +**Examples** + +```js +const requestToken = oauth1.fetchRequestToken(oauth_callback); +if (requestToken.oauth_callback_confirmed !== 'true') { + throw new Error('Provider could not confirm OAuth 1.0 callback'); +} +const authUrl = oauth1.getAuthUrl(requestToken.oauth_token); +``` + +## Exchange an authenticated request token for an access token + +`oauth1.exchangeRequestToken(oauth_token, oauth_verifier, opts)` + +Takes a pair of authenticated temporary credentials passed to the callback URL +by the provider and exchanges it for an `oauth_token` and `oauth_token_secret` +than can be used to perform authenticated requests to the OAuth 1.0a provider. + +Performs a `POST` response to the `accessTokenEndpoint`. + +Throws an exception if the remote server responds with an empty response body. + +**Arguments** + +- **oauth_token**: `string` + + The `oauth_token` passed to the callback URL by the provider. + +- **oauth_verifier**: `string` + + The `oauth_verifier` passed to the callback URL by the provider. + +- **opts**: `Object` (optional) + + An object with additional query parameters to include in the request. + + See [RFC 5849](https://tools.ietf.org/html/rfc5849). + +Returns the parsed response object. + +## Fetch the active user + +`oauth1.fetchActiveUser(oauth_token, oauth_token_secret, opts): Object` + +Fetches details of the active user. + +Performs a `GET` response to the `activeUserEndpoint`. + +Throws an exception if the remote server responds with an empty response body. + +Returns `null` if the `activeUserEndpoint` is not configured. + +**Arguments** + +- **oauth_token**: `string` + + An OAuth 1.0a access token as returned by `exchangeRequestToken`. + +- **oauth_token_secret**: `string` + + An OAuth 1.0a access token secret as returned by `exchangeRequestToken`. + +- **opts**: `Object` (optional) + + An object with additional query parameters to include in the request. + + See [RFC 5849](https://tools.ietf.org/html/rfc5849). + +Returns the parsed response object. + +**Examples** + +```js +const authData = oauth1.exchangeRequestToken(oauth_token, oauth_verifier); +const userData = oauth1.fetchActiveUser(authData.oauth_token, authData.oauth_token_secret); +``` + +## Create an authenticated request object + +`oauth1.createSignedRequest(method, url, parameters, oauth_token, oauth_token_secret)` + +Creates a request object that can be used to perform a request to the OAuth 1.0a +provider with the provided token credentials. + +**Arguments** + +- **method**: `string` + + HTTP method to use for the request, e.g. `"POST"`. + +- **url**: `string` + + The fully-qualified URL of the provider the request is performed against. + + The URL may optionally contain any number of query parameters. + +- **parameters**: `string | Object | null` + + An additional object or query string containing query parameters or body + parameters to be part of the signed request. + +- **oauth_token**: `string` + + An OAuth 1.0a access token as returned by `exchangeRequestToken`. + +- **oauth_token_secret**: `string` + + An OAuth 1.0a access token secret as returned by `exchangeRequestToken`. + +Returns an object with three properties: + + - **url**: The normalized URL without any query parameters. + + - **qs**: A normalized query string containing all `parameters` and query parameters. + + - **headers**: An object containing the following properties: + + - **accept**: The string `"application/json"`. + + - **authorization**: An OAuth authorization header containing all OAuth + parameters and the request signature. + +**Examples** + +Fetch a list of tweets mentioning `@arangodb`: + +```js +const request = require('@arangodb/request'); +const req = oauth1.createSignedRequest( + 'GET', + 'https://api.twitter.com/1.1/search/tweets.json', + {q: '@arangodb'}, + authData.oauth_token, + authData.oauth_token_secret +); +const res = request(req); +console.log(res.json.statuses); +``` + +Signing a more complex request: + +```js +const url = 'https://api.example.com/v1/timeline?visible=public'; +const params = {hello: 'world', longcat: 'is long'}; +const req = oauth1.createSignedRequest( + 'POST', + url, // URL includes a query parameter that will be signed + params, // Request body needs to be signed too + authData.oauth_token, + authData.oauth_token_secret +); +const res = request.post(url, { + form: params, + headers: { + accept: 'application/x-www-form-urlencoded', + // Authorization header includes the signature + authorization: req.headers.authorization + } +}); +console.log(res.json); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-2-0.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-2-0.md new file mode 100644 index 0000000000..346d79639e --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/oauth-2-0.md @@ -0,0 +1,290 @@ +--- +title: Foxx OAuth 2.0 +menuTitle: OAuth 2.0 +weight: 15 +description: '' +--- +`const createOAuth2Client = require('@arangodb/foxx/oauth2');` + +The OAuth2 module provides abstractions over OAuth 2.0 providers like +Facebook, GitHub and Google. + +**Examples** + +```js +const crypto = require('@arangodb/crypto'); +const router = createRouter(); +const oauth2 = createOAuth2Client({ + // We'll use Facebook for this example + authEndpoint: 'https://www.facebook.com/dialog/oauth', + tokenEndpoint: 'https://graph.facebook.com/oauth/access_token', + activeUserEndpoint: 'https://graph.facebook.com/v2.0/me', + clientId: 'keyboardcat', + clientSecret: 'keyboardcat' +}); + +module.context.use('/oauth2', router); + +// See the user management example for setting up the +// sessions and users objects used in this example +router.use(sessions); + +router.post('/auth', function (req, res) { + const csrfToken = crypto.genRandomAlphaNumbers(32); + const url = req.reverse('oauth2_callback', {csrfToken}); + const redirect_uri = req.makeAbsolute(url); + // Set CSRF cookie for five minutes + res.cookie('oauth2_csrf_token', csrfToken, {ttl: 60 * 5}); + // Redirect to the provider's authorization URL + res.redirect(303, oauth2.getAuthUrl(redirect_uri)); +}); + +router.get('/auth', function (req, res) { + // Some providers pass errors as query parameter + if (req.queryParams.error) { + res.throw(500, `Provider error: ${req.queryParams.error}`) + } + // Make sure CSRF cookie matches the URL + const expectedToken = req.cookie('oauth2_csrf_token'); + if (!expectedToken || req.queryParams.csrfToken !== expectedToken) { + res.throw(400, 'CSRF mismatch.'); + } + // Make sure the URL contains a grant token + if (!req.queryParams.code) { + res.throw(400, 'Provider did not pass grant token.'); + } + // Reconstruct the redirect_uri used for the grant token + const url = req.reverse('oauth2_callback'); + const redirect_uri = req.makeAbsolute(url); + // Fetch an access token from the provider + const authData = oauth2.exchangeGrantToken( + req.queryParams.code, + redirect_uri + ); + const facebookToken = authData.access_token; + // Fetch the active user's profile info + const profile = oauth2.fetchActiveUser(facebookToken); + const facebookId = profile.id; + // Try to find an existing user with the user ID + // (this requires the users collection) + let user = users.firstExample({facebookId}); + if (user) { + // Update the facebookToken if it has changed + if (user.facebookToken !== facebookToken) { + users.update(user, {facebookToken}); + } + } else { + // Create a new user document + user = { + username: `fb:${facebookId}`, + facebookId, + facebookToken + } + const meta = users.save(user); + Object.assign(user, meta); + } + // Log the user in (this requires the session middleware) + req.session.uid = user._key; + req.session.facebookToken = authData.facebookToken; + req.sessionStorage.save(req.session); + // Redirect to the default route + res.redirect(303, req.makeAbsolute('/')); +}, 'oauth2_callback') +.queryParam('error', joi.string().optional()) +.queryParam('csrfToken', joi.string().optional()) +.queryParam('code', joi.string().optional()); +``` + +## Creating an OAuth 2.0 client + +`createOAuth2Client(options): OAuth2Client` + +Creates an OAuth 2.0 client. + +**Arguments** + +- **options**: `Object` + + An object with the following properties: + + - **authEndpoint**: `string` + + The fully-qualified URL of the provider's + [authorization endpoint](http://tools.ietf.org/html/rfc6749#section-3.1). + + - **tokenEndpoint**: `string` + + The fully-qualified URL of the provider's + [token endpoint](http://tools.ietf.org/html/rfc6749#section-3.2). + + - **refreshEndpoint**: `string` (optional) + + The fully-qualified URL of the provider's + [refresh token endpoint](http://tools.ietf.org/html/rfc6749#section-6). + + - **activeUserEndpoint**: `string` (optional) + + The fully-qualified URL of the provider's endpoint for fetching + details about the current user. + + - **clientId**: `string` + + The application's *Client ID* (or *App ID*) for the provider. + + - **clientSecret**: `string` + + The application's *Client Secret* (or *App Secret*) for the provider. + +Returns an OAuth 2.0 client for the given provider. + +### Setting up OAuth 2.0 for Facebook + +If you want to use Facebook as the OAuth 2.0 provider, use the following options: + +- `authEndpoint`: `https://www.facebook.com/dialog/oauth` +- `tokenEndpoint`: `https://graph.facebook.com/oauth/access_token` +- `activeUserEndpoint`: `https://graph.facebook.com/v2.0/me` + +You also need to obtain a client ID and client secret from Facebook: + +1. Create a regular account at [Facebook](https://www.facebook.com) or use an + existing account you own. +2. Visit the [Facebook Developers](https://developers.facebook.com) page. +3. Click on **Apps** in the menu, then select **Register as a Developer** + (the only option) and follow the instructions provided. You may need to + verify your account by phone. +4. Click on **Apps** in the menu, then select **Create a New App** and follow + the instructions provided. +5. Open the app dashboard, then note down the **App ID** and **App Secret**. + The secret may be hidden by default. +6. Click on **Settings**, then **Advanced** and enter one or more + **Valid OAuth redirect URIs**. At least one of them must match your + `redirect_uri` later. Don't forget to save your changes. +7. Set the `clientId` option to the **App ID** and the `clientSecret` option + to the **App Secret**. + +### Setting up OAuth 2.0 for GitHub + +If you want to use GitHub as the OAuth 2.0 provider, use the following options: + +- `authEndpoint`: `https://github.com/login/oauth/authorize?scope=user` +- `tokenEndpoint`: `https://github.com/login/oauth/access_token` +- `activeUserEndpoint`: `https://api.github.com/user` + +You also need to obtain a client ID and client secret from GitHub: + +1. Create a regular account at [GitHub](https://github.com) or use an + existing account you own. +2. Go to [**Account Settings > Applications > Register new application**](https://github.com/settings/applications/new). +3. Provide an **authorization callback URL**. This must match your + *redirect_uri* later. +4. Fill in the other required details and follow the instructions provided. +5. Open the application page, then note down the **Client ID** and **Client Secret**. +6. Set the `clientId` option to the **Client ID** and the option `clientSecret` + to the **Client Secret**. + +### Setting up OAuth 2.0 for Google + +If you want to use Google as the OAuth 2.0 provider, use the following options: + +- `*authEndpoint`: `https://accounts.google.com/o/oauth2/auth?access_type=offline&scope=profile` +- `*tokenEndpoint`: `https://accounts.google.com/o/oauth2/token` +- `*activeUserEndpoint`: `https://www.googleapis.com/plus/v1/people/me` + +You also need to obtain a client ID and client secret from Google: + +1. Create a regular account at [Google](https://www.google.com) or use an + existing account you own. +2. Visit the [Google Developers Console](https://console.developers.google.com). +3. Click on **Create Project**, then follow the instructions provided. +4. When your project is ready, open the project dashboard, then click on + **Enable an API**. +5. Enable the **Google+ API** to allow your app to distinguish between different users. +6. Open the **Credentials** page and click **Create new Client ID**, then follow + the instructions provided. At least one **Authorized Redirect URI** must match + your `redirect_uri` later. At least one **Authorized JavaScript Origin** must + match your app's fully-qualified domain. +7. When the Client ID is ready, note down the **Client ID** and **Client secret**. +8. Set the `clientId` option to the **Client ID** and the `clientSecret` option + to the **Client secret**. + +## Get the authorization URL + +`oauth2.getAuthUrl(redirect_uri, args): string` + +Generates the authorization URL for the authorization endpoint. + +**Arguments** + +- **redirect_uri**: `string` + + The fully-qualified URL of your application's OAuth 2.0 callback. + +- **args**: (optional) + + An object with any of the following properties: + + - **response_type**: `string` (Default: `"code"`) + + See [RFC 6749](http://tools.ietf.org/html/rfc6749). + +Returns a fully-qualified URL for the authorization endpoint of the provider +by appending the client ID and any additional arguments from `args` to the +`authEndpoint`. + +## Exchange a grant code for an access token + +`oauth2.exchangeGrantToken(code, redirect_uri)` + +Exchanges a grant code for an access token. + +Performs a `POST` response to the `tokenEndpoint`. + +Throws an exception if the remote server responds with an empty response body. + +**Arguments** + +- **code**: `string` + + A grant code returned by the provider's authorization endpoint. + +- **redirect_uri**: `string` + + The original callback URL with which the code was requested. + +- **args**: `Object` (optional) + + An object with any of the following properties: + + - **grant_type**: `string` (Default: `"authorization_code"`) + + See [RFC 6749](http://tools.ietf.org/html/rfc6749). + +Returns the parsed response object. + +## Fetch the active user + +`oauth2.fetchActiveUser(access_token): Object` + +Fetches details of the active user. + +Performs a `GET` response to the `activeUserEndpoint`. + +Throws an exception if the remote server responds with an empty response body. + +Returns `null` if the `activeUserEndpoint` is not configured. + +**Arguments** + +- **access_token**: `string` + + An OAuth 2.0 access token as returned by `exchangeGrantToken`. + +Returns the parsed response object. + +**Examples** + +```js +const authData = oauth2.exchangeGrantToken(code, redirect_uri); +const userData = oauth2.fetchActiveUser(authData.access_token); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/queues.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/queues.md new file mode 100644 index 0000000000..6de3dbc175 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/related-modules/queues.md @@ -0,0 +1,462 @@ +--- +title: Foxx queues +menuTitle: Queues +weight: 25 +description: '' +--- +`const queues = require('@arangodb/foxx/queues')` + +Foxx allows defining job queues that let you perform slow or expensive actions +asynchronously. These queues can be used to send e-mails, call external APIs or +perform other actions that you do not want to perform directly or want to retry +on failure. + +Foxx queue jobs can be any [script](../../guides/scripts-and-scheduling.md) named in the +[manifest](../service-manifest.md) of a service in the same database. + +Please note that Foxx queues are database-specific. Queues and jobs are always +relative to the database in which they are created or accessed. + +For disabling the Foxx queues feature or adjusting the polling interval see the +[`foxx.queues` and `foxx.queues-poll-interval` options](../../../../components/arangodb-server/options.md#foxx). + +For the low-level functionality see the chapter on the +[task management module](../../../javascript-api/tasks.md). + +## Managing queues + +### queues.create + +`queues.create(name, [maxWorkers]): Queue` + +Returns the queue for the given name. If the queue does not exist, a new queue +with the given name is created. If a queue with the given name already exists +and `maxWorkers` is set, the queue's maximum number of workers is updated. +The queue is created in the current database. + +**Arguments** + +- **name**: `string` + + Name of the queue to create. + +- **maxWorkers**: `number` (Default: `1`) + + The maximum number of workers. + +**Examples** + +```js +// Create a queue with the default number of workers (i.e. one) +const queue1 = queues.create("my-queue"); +// Create a queue with a given number of workers +const queue2 = queues.create("another-queue", 2); +// Update the number of workers of an existing queue +const queue3 = queues.create("my-queue", 10); +// queue1 and queue3 refer to the same queue +assertEqual(queue1, queue3); +``` + +### queues.get + +`queues.get(name): Queue` + +Returns the queue for the given name. If the queue does not exist an exception +is thrown instead. + +The queue is looked up in the current database. + +**Arguments** + +- **name**: `string` + + Name of the queue to fetch. + +**Examples** + +If the queue does not yet exist an exception is thrown: + +```js +queues.get("some-queue"); +// Error: Queue does not exist: some-queue +// at ... +``` + +Otherwise, the queue is returned: + +```js +const queue1 = queues.create("some-queue"); +const queue2 = queues.get("some-queue"); +assertEqual(queue1, queue2); +``` + +### queues.delete + +`queues.delete(name): boolean` + +Returns `true` if the queue was deleted successfully. +If the queue did not exist, it returns `false` instead. +The queue is looked up and deleted in the current database. + +When a queue is deleted, jobs on that queue are no longer executed. + +Deleting a queue does not delete any jobs on that queue. + +**Arguments** + +- **name**: `string` + + Name of the queue to delete. + +**Examples** + +```js +const queue = queues.create("my-queue"); +queues.delete("my-queue"); // true +queues.delete("my-queue"); // false +``` + +## Queue API + +### queue.push + +`queue.push(script, data, [opts]): string` + +The job is added to the specified queue in the current database. + +Returns the job id. + +**Arguments** + +- **script**: `object` + + A job type definition, consisting of an object with the following properties: + + - **name**: `string` + + Name of the script to invoke. + + - **mount**: `string` + + Mount path of the service that defines the script. + + - **backOff**: `Function | number` (Default: `1000`) + + Either a function that takes the number of times the job has failed before + as input and returns the number of milliseconds to wait before trying the + job again, or the delay to be used to calculate an + [exponential back-off](https://en.wikipedia.org/wiki/Exponential_backoff), + or `0` for no delay. + + - **maxFailures**: `number | Infinity` (Default: `0`): + + Number of times a single run of a job will be re-tried before it is marked + as `"failed"`. A negative value or `Infinity` means that the job is + re-tried on failure indefinitely. + + - **schema**: `Schema` (optional) + + Schema to validate a job's data against before enqueuing the job. + + - **preprocess**: `Function` (optional) + + Function to pre-process a job's (validated) data before serializing it in the queue. + +- **data**: `any` + + Job data of the job; must be serializable to JSON. + +- **opts**: `object` (optional) + + Object with any of the following properties: + + - **success**: `Function` (optional) + + Function to be called after the job has been completed successfully. + + - **failure**: `Function` (optional) + + Function to be called after the job has failed too many times. + + - **delayUntil**: `number | Date` (Default: `Date.now()`) + + Timestamp in milliseconds (or `Date` instance) until which the execution of + the job should be delayed. + + - **backOff**: `Function | number` (Default: `1000`) + + See `script.backOff`. + + - **maxFailures**: `number | Infinity` (Default: `0`): + + See `script.maxFailures`. + + - **repeatTimes**: `number` (Default: `0`) + + If set to a positive number, the job is repeated this many times + (not counting recovery when using `maxFailures`). + If set to a negative number or `Infinity`, the job is repeated + indefinitely. If set to `0`, the job is not repeated. + + - **repeatUntil**: `number | Date` (optional) + + If the job is set to automatically repeat, this can be set to a timestamp + in milliseconds (or `Date` instance) after which the job no longer repeats. + Setting this value to zero, a negative value or `Infinity` has no effect. + + - **repeatDelay**: `number` (Default: `0`) + + If the job is set to automatically repeat, this can be set to a non-negative + value to set the number of milliseconds for which the job is delayed + before it is started again. + +Note that if you pass a function for the `backOff` calculation, `success` +callback, or `failure` callback options, the function is serialized to +the database as a string, and therefore must not rely on any external scope +or external variables. + +When the job is set to automatically repeat, the `failure` callback is only +executed when a run of the job has failed more than `maxFailures` times. +Note that if the job fails and `maxFailures` is set, it is rescheduled +according to the `backOff` until it has either failed too many times or +completed successfully before being scheduled according to the `repeatDelay` +again. Recovery attempts by `maxFailures` do not count towards `repeatTimes`. + +The `success` and `failure` callbacks receive the following arguments: + +- **result**: `any` + + The return value of the script for the current run of the job. + +- **jobData**: `any` + + The data passed to this method. + +- **job**: `object` + + ArangoDB document representing the job's current state. + +**Examples** + +Let's say we have an service mounted at `/mailer` that provides a script called `send-mail`: + +```js +'use strict'; +const queues = require('@arangodb/foxx/queues'); +const queue = queues.create('my-queue'); +queue.push( + {mount: '/mailer', name: 'send-mail'}, + {to: 'hello@example.com', body: 'Hello world'} +); +``` + +This does *not* work, because `log` is defined outside the callback function +(the callback must be serializable to a string): + +```js +// WARNING: THIS DOES NOT WORK! +'use strict'; +const queues = require('@arangodb/foxx/queues'); +const queue = queues.create('my-queue'); +const log = require('console').log; // outside the callback's function scope +queue.push( + {mount: '/mailer', name: 'send-mail'}, + {to: 'hello@example.com', body: 'Hello world'}, + {success: function () { + log('Yay!'); // throws 'log is not defined' + }} +); +``` + +Here's an example of a job that is executed every 5 seconds until tomorrow: + +```js +'use strict'; +const queues = require('@arangodb/foxx').queues; +const queue = queues.create('my-queue'); +queue.push( + {mount: '/mailer', name: 'send-mail'}, + {to: 'hello@example.com', body: 'Hello world'}, + { + repeatTimes: Infinity, + repeatUntil: Date.now() + (24 * 60 * 60 * 1000), + repeatDelay: 5 * 1000 + } +); +``` + +### queue.get + +`queue.get(jobId): Job` + +Creates a proxy object representing a job with the given job id. + +The job is looked up in the specified queue in the current database. + +Returns the job for the given jobId. Properties of the job object are +fetched whenever they are referenced and cannot be modified. + +**Arguments** + +- **jobId**: `string` + + The id of the job to create a proxy object for. + +**Examples** + +```js +const jobId = queue.push({mount: '/logger', name: 'log'}, 'Hello World!'); +const job = queue.get(jobId); +assertEqual(job.id, jobId); +``` + +### queue.delete + +`queue.delete(jobId): boolean` + +Deletes a job with the given job id. +The job is looked up and deleted in the specified queue in the current database. + +**Arguments** + +- **jobId**: `string` + + The id of the job to delete. + +Returns `true` if the job was deleted successfully. If the job did not exist +it returns `false` instead. + +### queue.pending + +`queue.pending([script]): Array<string>` + +Returns an array of job ids of jobs in the given queue with the status +`"pending"`, optionally filtered by the given job type. +The jobs will be looked up in the specified queue in the current database. + +**Arguments** + +- **script**: `object` (optional) + + An object with the following properties: + + - **name**: `string` + + Name of the script. + + - **mount**: `string` + + Mount path of the service defining the script. + +**Examples** + +```js +const logScript = {mount: '/logger', name: 'log'}; +queue.push(logScript, 'Hello World!', {delayUntil: Date.now() + 50}); +assertEqual(queue.pending(logScript).length, 1); +// 50 ms later... +assertEqual(queue.pending(logScript).length, 0); +assertEqual(queue.progress(logScript).length, 1); +// even later... +assertEqual(queue.progress(logScript).length, 0); +assertEqual(queue.complete(logScript).length, 1); +``` + +### queue.progress + +`queue.progress([script])` + +Returns an array of job ids of jobs in the given queue with the status +`"progress"`, optionally filtered by the given job type. +The jobs are looked up in the specified queue in the current database. + +**Arguments** + +- **script**: `object` (optional) + + An object with the following properties: + + - **name**: `string` + + Name of the script. + + - **mount**: `string` + + Mount path of the service defining the script. + +### queue.complete + +`queue.complete([script]): Array<string>` + +Returns an array of job ids of jobs in the given queue with the status +`"complete"`, optionally filtered by the given job type. +The jobs are looked up in the specified queue in the current database. + +**Arguments** + +- **script**: `object` (optional) + + An object with the following properties: + + - **name**: `string` + + Name of the script. + + - **mount**: `string` + + Mount path of the service defining the script. + +### queue.failed + +`queue.failed([script]): Array<string>` + +Returns an array of job ids of jobs in the given queue with the status +`"failed"`, optionally filtered by the given job type. +The jobs are looked up in the specified queue in the current database. + +**Arguments** + +- **script**: `object` (optional) + + An object with the following properties: + + - **name**: `string` + + Name of the script. + + - **mount**: `string` + + Mount path of the service defining the script. + +### queue.all + +`queue.all([script]): Array<string>` + +Returns an array of job ids of all jobs in the given queue, +optionally filtered by the given job type. +The jobs are looked up in the specified queue in the current database. + +**Arguments** + +- **script**: `object` (optional) + + An object with the following properties: + + - **name**: `string` + + Name of the script. + + - **mount**: `string` + + Mount path of the service defining the script. + +## Job API + +### job.abort + +`job.abort(): void` + +Aborts a non-completed job. + +Sets a job's status to `"failed"` if it is not already `"complete"`, +without calling the job's `onFailure` callback. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/_index.md new file mode 100644 index 0000000000..d97928de2c --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/_index.md @@ -0,0 +1,217 @@ +--- +title: Foxx Routers +menuTitle: Routers +weight: 20 +description: '' +--- +`const createRouter = require('@arangodb/foxx/router');` + +Routers let you define routes that extend ArangoDB's HTTP API with custom endpoints. + +Routers need to be mounted using the `use` method of a +[service context](../service-context.md) to expose their HTTP routes at a service's mount path. + +You can pass routers between services mounted in the same database +[as dependencies](../../guides/linking-services-together.md). You can even nest routers +within each other. + +## Creating a router + +`createRouter(): Router` + +This returns a new, clean router object that has not yet been mounted in the +service and can be exported like any other object. + +## Request handlers + +`router.get([path], [...middleware], handler, [name]): Endpoint` + +`router.post([path], [...middleware], handler, [name]): Endpoint` + +`router.put([path], [...middleware], handler, [name]): Endpoint` + +`router.patch([path], [...middleware], handler, [name]): Endpoint` + +`router.delete([path], [...middleware], handler, [name]): Endpoint` + +`router.all([path], [...middleware], handler, [name]): Endpoint` + +These methods let you specify routes on the router. +The `all` method defines a route that matches any supported HTTP verb. The +other methods define routes that only match the HTTP verb with the same name. + +**Arguments** + +- **path**: `string` (Default: `"/"`) + + The path of the request handler relative to the base path the Router is mounted at. + If omitted, the request handler handles requests to the base path of the Router. + For information on defining dynamic routes see the section on + [path parameters in the chapter on router endpoints](endpoints.md#pathparam). + +- **middleware**: `Function` (optional) + + Zero or more middleware functions that take the following arguments: + + - **req**: `Request` + + An incoming server request object. + + - **res**: `Response` + + An outgoing server response object. + + - **next**: `Function` + + A callback that passes control over to the next middleware function + and returns when that function has completed. + + If a truthy argument is passed, that argument is thrown as an error. + + If there is no next middleware function, the `handler` is + invoked instead (see below). + +- **handler**: `Function` + + A function that takes the following arguments: + + - **req**: `Request` + + An incoming server request object. + + - **res**: `Response` + + An outgoing server response. + +- **name**: `string` (optional) + + A name that can be used to generate URLs for the endpoint. + For more information see the `reverse` method of the [request object](request.md). + +Returns an [Endpoint](endpoints.md) for the route. + +**Examples** + +Simple index route: + +```js +router.get(function (req, res) { + res.set('content-type', 'text/plain'); + res.write('Hello World!'); +}); +``` + +Restricting access to authenticated ArangoDB users: + +```js +router.get('/secrets', function (req, res, next) { + if (req.arangoUser) { + next(); + } else { + res.throw(404, 'Secrets? What secrets?'); + } +}, function (req, res) { + res.download('allOurSecrets.zip'); +}); +``` + +Multiple middleware functions: + +```js +function counting (req, res, next) { + if (!req.counter) req.counter = 0; + req.counter++; + next(); + req.counter--; +} +router.get(counting, counting, counting, function (req, res) { + res.json({counter: req.counter}); // {"counter": 3} +}); +``` + +## Mounting child routers and middleware + +`router.use([path], middleware, [name]): Endpoint` + +The `use` method lets you mount a child router or middleware at a given path. + +**Arguments** + +- **path**: `string` (optional) + + The path of the middleware relative to the base path the Router is mounted at. + If omitted, the middleware handles requests to the base path of the Router. + For information on defining dynamic routes see the section on + [path parameters in the chapter on router endpoints](endpoints.md#pathparam). + +- **middleware**: `Router | Middleware` + + An unmounted router object or a [middleware](middleware.md). + +- **name**: `string` (optional) + + A name that can be used to generate URLs for endpoints of this router. + For more information see the `reverse` method of the [request object](request.md). + Has no effect if `handler` is a Middleware. + +Returns an [Endpoint](endpoints.md) for the middleware or child router. + +{{< warning >}} +When mounting child routers at multiple paths, effects of methods +invoked on each endpoint only affect routes of that endpoint. +{{< /warning >}} + +**Examples** + +```js +const child = createRouter(); + +router.use("/a", child); + +router.use("/b", child) +.queryParam("number", joi.number().required(), "Required number parameter."); + +child.get(function (req, res) { + // The query parameter "number" is required if the request was made via "/b" + // but optional if the request was made via "/a", we can't rely on it. + res.json({number: req.queryParams.number}); +}); +``` + +```js +const child = createRouter() +.queryParam("number", joi.number().required(), "Required number parameter."); + +router.use("/a", child); + +router.use("/b", child); + +child.get(function (req, res) { + // The query parameter "number" is always required, regardless if the + // request was made via "/a" or "/b". + res.json({number: req.queryParams.number}); +}); +``` + +## Additional metadata + +In addition to the router-specific methods, all methods available on +[endpoints](endpoints.md) are also available on +router objects and can be used to define shared defaults. + +**Examples** + +```js +router.header( + 'x-common-header', + joi.string().required(), + 'Common header shared by all routes on this router.' +); + +router.get('/', function (req, res) { + // This route requires the header to be set but we don't need to explicitly + // specify that. + const value = req.header('x-common-header'); + // ... +}); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/endpoints.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/endpoints.md new file mode 100644 index 0000000000..8753af1527 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/endpoints.md @@ -0,0 +1,615 @@ +--- +title: Foxx Endpoints +menuTitle: Endpoints +weight: 5 +description: '' +--- +Endpoints are returned by the `use`, `all` +and HTTP verb (e.g. `get`, `post`) methods of [routers](_index.md) +as well as the `use` method of the [service context](../service-context.md). +They can be used to attach metadata to mounted routes, middleware and +child routers that affects how requests and responses are processed or +provides API documentation. + +Endpoints should only be used to invoke the following methods. +Endpoint methods can be chained together (each method returns the endpoint itself). + +## header + +`endpoint.header(name, [schema], [description]): this` + +Defines a request header recognized by the endpoint. +Any additional non-defined headers are treated as optional string values. +The definitions is also shown in the route details in the API documentation. + +If the endpoint is a child router, all routes of that router use this +header definition unless overridden. + +**Arguments** + +- **name**: `string` + + Name of the header. This should be considered case insensitive as all header + names will be converted to lowercase. + +- **schema**: `Schema` (optional) + + A schema describing the format of the header value. This can be a joi schema + or anything that has a compatible `validate` method. + + The value of this header is set to the `value` property of the + validation result. A validation failure results in an automatic 400 + (Bad Request) error response. + +- **description**: `string` (optional) + + A human-readable string that is shown in the API documentation. + +Returns the endpoint. + +**Examples** + +```js +router.get(/* ... */) +.header('arangoVersion', joi.number().min(30000).default(30000)); +``` + +## pathParam + +`endpoint.pathParam(name, [schema], [description]): this` + +Defines a path parameter recognized by the endpoint. +Path parameters are expected to be filled as part of the endpoint's mount path. +Any additional non-defined path parameters are treated as optional +string values. The definitions are also shown in the route details in +the API documentation. + +If the endpoint is a child router, all routes of that router use this +parameter definition unless overridden. + +**Arguments** + +- **name**: `string` + + Name of the parameter. + +- **schema**: `Schema` (optional) + + A schema describing the format of the parameter. This can be a joi schema + or anything that has a compatible `validate` method. + + The value of this parameter is set to the `value` property of the + validation result. A validation failure results in the route failing to + match and being ignored (resulting in a 404 (Not Found) error response if no + other routes match). + +- **description**: `string` (optional) + + A human readable string that is shown in the API documentation. + +Returns the endpoint. + +**Examples** + +```js +router.get('/some/:num/here', /* ... */) +.pathParam('num', joi.number().required()); +``` + +## queryParam + +`endpoint.queryParam(name, [schema], [description]): this` + +Defines a query parameter recognized by the endpoint. +Any additional non-defined query parameters are treated as optional +string values. The definitions are also shown in the route details in +the API documentation. + +If the endpoint is a child router, all routes of that router use this +parameter definition unless overridden. + +**Arguments** + +- **name**: `string` + + Name of the parameter. + +- **schema**: `Schema` (optional) + + A schema describing the format of the parameter. This can be a joi schema or + anything that has a compatible `validate` method. + + The value of this parameter is set to the `value` property of the + validation result. A validation failure results in an automatic 400 + (Bad Request) error response. + +- **description**: `string` (optional) + + A human-readable string that is shown in the API documentation. + +Returns the endpoint. + +**Examples** + +```js +router.get(/* ... */) +.queryParam('num', joi.number().required()); +``` + +## body + +`endpoint.body([model], [mimes], [description]): this` + +Defines the request body recognized by the endpoint. +There can only be one request body definition per endpoint. The definition is +also shown in the route details in the API documentation. + +In the absence of a request body definition, the request object's `body` +property is initialized to the unprocessed `rawBody` buffer. + +If the endpoint is a child router, all routes of that router use this body +definition unless overridden. If the endpoint is a middleware, the request body +is only parsed once (i.e. the MIME types of the route matching the same +request is ignored but the body is still validated again). + +**Arguments** + +- **model**: `Model | Schema | null` (optional) + + A model or joi schema describing the request body. A validation failure + results in an automatic 400 (Bad Request) error response. + + If the value is a model with a `fromClient` method, that method is + applied to the parsed request body. + + If the value is a schema or a model with a schema, the schema is used + to validate the request body, and the `value` property of the validation + result of the parsed request body is used instead of the parsed request + body itself. + + If the value is a model or a schema and the MIME type has been omitted, + the MIME type defaults to JSON instead. + + If the value is explicitly set to `null`, no request body is expected. + + If the value is an array containing exactly one model or schema, the request + body is treated as an array of items matching that model or schema. + +- **mimes**: `Array<string>` (optional) + + An array of MIME types the route supports. + + Common non-mime aliases like "json" or "html" are also supported and are + expanded to the appropriate MIME type (e.g. "application/json" and "text/html"). + + If the MIME type is recognized by Foxx, the request body is parsed into + the appropriate structure before being validated. Only JSON, + `application/x-www-form-urlencoded`, and multipart formats are supported in this way. + + If the MIME type indicated in the request headers does not match any of the + supported MIME types, the first MIME type in the list is used instead. + + Failure to parse the request body results in an automatic 400 + (Bad Request) error response. + +- **description**: `string` (optional) + + A human-readable string that is shown in the API documentation. + +Returns the endpoint. + +**Examples** + +```js +router.post('/expects/some/json', /* ... */) +.body( + joi.object().required(), + 'This implies JSON.' +); + +router.post('/expects/nothing', /* ... */) +.body(null); // No body allowed + +router.post('/expects/some/plaintext', /* ... */) +.body(['text/plain'], 'This body will be a string.'); +``` + +## response + +`endpoint.response([status], [model], [mimes], [description]): this` + +Defines a response body for the endpoint. When using the response object's +`send` method in the request handler of this route, the definition with the +matching status code is used to generate the response body. +The definitions are also shown in the route details in the API documentation. + +If the endpoint is a child router, all routes of that router use this +response definition unless overridden. If the endpoint is a middleware, +this method has no effect. + +**Arguments** + +- **status**: `number | string` (Default: `200` or `204`) + + HTTP status code the response applies to. If a string is provided instead of + a numeric status code, it is used to look up a numeric status code using + the [statuses](https://github.com/jshttp/statuses) module. + +- **model**: `Model | Schema | null` (optional) + + A model or joi schema describing the response body. + + If the value is a model with a `forClient` method, that method is + applied to the data passed to `response.send` within the route if the + response status code matches (but also if no status code has been set). + + If the value is a schema or a model with a schema, the actual schema is + not used to validate the response body and only serves to document the + response in more detail in the API documentation. + + If the value is a model or a schema and the MIME type has been omitted, + the MIME type defaults to JSON instead. + + If the value is explicitly set to `null` and the status code has been omitted, + the status code defaults to `204` ("no content") instead of `200`. + + If the value is an array containing exactly one model or schema, the response + body is an array of items matching that model or schema. + +- **mimes**: `Array<string>` (optional) + + An array of MIME types the route might respond with for this status code. + + Common non-mime aliases like "json" or "html" are also supported and are + expanded to the appropriate MIME type (e.g. "application/json" and "text/html"). + + When using the `response.send()` method, the response body is converted to + the appropriate MIME type if possible. + +- **description**: `string` (optional) + + A human-readable string that briefly describes the response and is shown + in the endpoint's detailed documentation. + +Returns the endpoint. + +**Examples** + +```js +// This example only provides documentation +// and implies a generic JSON response body. +router.get(/* ... */) +.response( + joi.array().items(joi.string()), + 'A list of doodad identifiers.' +); + +// No response body is expected here. +router.delete(/* ... */) +.response(null, 'The doodad no longer exists.'); + +// An endpoint can define multiple response types +// for different status codes -- but never more than +// one for each status code. +router.post(/* ... */) +.response('found', 'The doodad is located elsewhere.') +.response(201, ['text/plain'], 'The doodad was created so here is a haiku.'); + +// Here, the response body is set to +// the querystring-encoded result of +// FormModel.forClient({some: 'data'}) +// because the status code defaults to 200. +router.patch(function (req, res) { + // ... + res.send({some: 'data'}); +}) +.response(FormModel, ['application/x-www-form-urlencoded'], 'OMG.'); + +// In this case, the response body is set to +// SomeModel.forClient({some: 'data'}) because +// the status code has been set to 201 before. +router.put(function (req, res) { + // ... + res.status(201); + res.send({some: 'data'}); +}) +.response(201, SomeModel, 'Something amazing happened.'); +``` + +## error + +`endpoint.error(status, [description]): this` + +Documents an error status for the endpoint. + +If the endpoint is a child router, all routes of that router use this +error description unless overridden. If the endpoint is a middleware, +this method has no effect. + +This method only affects the generated API documentation and has no other +effect within the service itself. + +**Arguments** + +- **status**: `number | string` + + HTTP status code for the error (e.g. `400` for "bad request"). If a string is + provided instead of a numeric status code it is used to look up a numeric + status code using the [statuses](https://github.com/jshttp/statuses) module. + +- **description**: `string` (optional) + + A human-readable string that briefly describes the error condition and is + shown in the endpoint's detailed documentation. + +Returns the endpoint. + +**Examples** + +```js +router.get(function (req, res) { + // ... + res.throw(403, 'Validation error at x.y.z'); +}) +.error(403, 'Indicates that a validation has failed.'); +``` + +## summary + +`endpoint.summary(summary): this` + +Adds a short description to the endpoint's API documentation. + +If the endpoint is a child router, all routes of that router use this +summary unless overridden. If the endpoint is a middleware, this method has no effect. + +This method only affects the generated API documentation and has no other +effect within the service itself. + +**Arguments** + +- **summary**: `string` + + A human-readable string that briefly describes the endpoint and appears + next to the endpoint's path in the documentation. + +Returns the endpoint. + +**Examples** + +```js +router.get(/* ... */) +.summary('List all discombobulated doodads') +``` + +## description + +`endpoint.description(description): this` + +Adds a long description to the endpoint's API documentation. + +If the endpoint is a child router, all routes of that router use +this description unless overridden. If the endpoint is a middleware, +this method has no effect. + +This method only affects the generated API documentation and has not +other effect within the service itself. + +**Arguments** + +- **description**: `string` + + A human-readable string that describes the endpoint in detail and + will be shown in the endpoint's detailed documentation. + +Returns the endpoint. + +**Examples** + +```js +// The "dedent" library helps formatting +// multi-line strings by adjusting indentation +// and removing leading and trailing blank lines +const dd = require('dedent'); +router.post(/* ... */) +.description(dd` + This route discombobulates the doodads by + frobnicating the moxie of the request body. +`) +``` + +## deprecated + +`endpoint.deprecated([deprecated]): this` + +Marks the endpoint as deprecated. + +If the endpoint is a child router, all routes of that router are also +marked as deprecated. If the endpoint is a middleware, this method has no effect. + +This method only affects the generated API documentation and has no other +effect within the service itself. + +**Arguments** + +- **deprecated**: `boolean` (Default: `true`) + + Whether the endpoint should be marked as deprecated. If set to `false`, the + endpoint is explicitly marked as *not* deprecated. + +Returns the endpoint. + +**Examples** + +```js +router.get(/* ... */) +.deprecated(); +``` + +## tag + +`endpoint.tag(...tags): this` + +Marks the endpoint with the given tags that are used to group related +routes in the generated API documentation. + +If the endpoint is a child router, all routes of that router are also +marked with the tags. If the endpoint is a middleware, this method has no effect. + +This method only affects the generated API documentation and has no other +effect within the service itself. + +**Arguments** + +- **tags**: `string` + + One or more strings that are used to group the endpoint's routes. + +Returns the endpoint. + +**Examples** + +```js +router.get(/* ... */) +.tag('auth', 'restricted'); +``` + +## securityScheme + +`endpoint.securityScheme(type, [options], [description])` + +Defines an OpenAPI security scheme for this endpoint. + +This method only affects the generated API documentation and has no other +effect within the service itself. + +**Arguments** + +- **type**: `string` + + Type of the security scheme. + Must be one of `"basic"`, `"apiKey"` or `"oauth2"`. + +- **options**: `object` + + An object with the following property: + + - **id**: `string` (optional) + + Unique identifier that can be used to opt in to or out of this scheme or + to specify OAuth 2 scopes required by this endpoint. + + If **type** is set to `"basic"`, this parameter is optional. + + If **type** is set to `"apiKey"`, the following additional properties are + required: + + - **name**: `string` + + The name of the header or query parameter that contains the API key. + + - **in**: `string` + + The location of the API key. + Must be one of `"header"` or `"query"`. + + If **type** is set to `"oauth2"`, the following additional properties are + required: + + - **flow**: `string` + + The OAuth 2 flow used by this security scheme. + Must be one of `"implicit"`, `"password"`, `"application"` or + `"accessCode"`. + + - **scopes**: `object` + + The available scopes for this OAuth 2 security scheme as a mapping of + scope names to descriptions. + + If **flow** is set to `"implicit"` or `"accessCode"`, the following + additional property is required: + + - **authorizationUrl**: `string` + + The authorization URL to be used for this OAuth 2 flow. + + If **flow** is set to `"password"`, `"application"` or `"accessCode"`, the + following additional property is required: + + - **tokenUrl**: `string` + + The token URL to be used for this OAuth 2 flow. + +- **description**: `string` (optional) + + A human-readable string that describes the security scheme. + +Returns the endpoint. + +**Examples** + +```js +router.get(/* ... */) +.securityScheme('basic', 'Basic authentication with username and password.') +.securityScheme('apiKey', {name: 'x-api-key', in: 'header'}, + 'API key as alternative to password-based authentication.' +); +``` + +## security + +`endpoint.security(id, enabled)` + +Opts this endpoint in to or out of the security scheme with the given ID. + +- **id**: `string` + + Unique identifier of the security scheme. See `endpoint.securityScheme`. + +- **enabled**: `boolean` + + Whether the security scheme should be enabled or disabled for this endpoint. + Security schemes are enabled for all child routes by default. + +**Examples** + +```js +router.securityScheme('basic', {id: 'basic-auth'}, + 'Basic authentication used by most endpoints on this router.' +); + +router.get(/* ... */) +.security('basic-auth', false); // Opt this endpoint out +``` + +## securityScope + +`endpoint.securityScope(id, ...scopes)` + +Defines OAuth 2 scopes required by this endpoint for security scheme with the +given ID. + +- **id**: `string` + + Unique identifier of the security scheme. See `endpoint.securityScheme`. + +- **scopes**: `Array<string>` + + Names of OAuth 2 scopes required by this endpoint. + +**Examples** + +```js +router.get(/* ... */) +.securityScheme('oauth2', { + id: 'thebookface-oauth2', + flow: 'implicit', + authorizationUrl: 'https://thebookface.example/oauth2/authorization', + scopes: { + 'profile:read': 'Read user profile', + 'profile:write': 'Modify user profile' + } +}, 'OAuth 2 authentication for The Bookface.') +.securityScope('thebookface-oauth2', 'profile:read'); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/middleware.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/middleware.md new file mode 100644 index 0000000000..cc7c8ef389 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/middleware.md @@ -0,0 +1,86 @@ +--- +title: Foxx Middleware +menuTitle: Middleware +weight: 10 +description: '' +--- +Middleware in Foxx refers to functions that can be mounted like routes and can +manipulate the request and response objects before and after the route itself +is invoked. They can also be used to control access or to provide common logic +like logging etc. Unlike routes, middleware is mounted with the `use` method +like a router. + +Instead of a function the `use` method can also accept an object with a +`register` function that will take a parameter `endpoint`, the middleware will +be mounted at and returns the actual middleware function. This allows +manipulating the endpoint before creating the middleware (e.g. to document +headers, request bodies, path parameters or query parameters). + +**Examples** + +Restrict access to ArangoDB-authenticated users: + +```js +module.context.use(function (req, res, next) { + if (!req.arangoUser) { + res.throw(401, 'Not authenticated with ArangoDB'); + } + next(); +}); +``` + +Any truthy argument passed to the `next` function will be thrown as an error: + +```js +module.context.use(function (req, res, next) { + let err = null; + if (!req.arangoUser) { + err = new Error('This should never happen'); + } + next(err); // throws if the error was set +}) +``` + +Trivial logging middleware: + +```js +module.context.use(function (req, res, next) { + const start = Date.now(); + try { + next(); + } finally { + console.log(`Handled request in ${Date.now() - start}ms`); + } +}); +``` + +More complex example for header-based sessions: + +```js +const sessions = module.context.collection('sessions'); +module.context.use({ + register (endpoint) { + endpoint.header('x-session-id', joi.string().optional(), 'The session ID.'); + return function (req, res, next) { + const sid = req.get('x-session-id'); + if (sid) { + try { + req.session = sessions.document(sid); + } catch (e) { + delete req.headers['x-session-id']; + } + } + next(); + if (req.session) { + if (req.session._rev) { + sessions.replace(req.session, req.session); + res.set('x-session-id', req.session._key); + } else { + const meta = sessions.save(req.session); + res.set('x-session-id', meta._key); + } + } + }; + } +}); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/request.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/request.md new file mode 100644 index 0000000000..89540a9a13 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/request.md @@ -0,0 +1,408 @@ +--- +title: Foxx request objects +menuTitle: Request +weight: 15 +description: '' +--- +The request object specifies the following properties: + +- **arangoUser**: `string | null` + + The authenticated ArangoDB username used to make the request. + This value is only set if authentication is enabled in ArangoDB and the + request set an `authorization` header ArangoDB was able to verify. + You are strongly encouraged to implement + [your own authentication logic](../../guides/authentication-and-sessions.md) for your own services + but this property can be useful if you need to integrate with ArangoDB's + own authentication mechanisms. + +- **arangoVersion**: `number` + + The numeric value of the `x-arango-version` header or the numeric version + of the ArangoDB server (e.g. `30807` for version 3.8.7) if no valid header + was provided. + +- **auth**: `object | null` + + The credentials supplied in the `authorization` header if any. + + If the request uses basic authentication, the value is an object like + `{basic: {username: string}}` or + `{basic: {username: string, password: string}}` or + `{basic: {}}` (if the credentials were malformed or empty). + + If the request uses bearer authentication, the value is an object like + `{bearer: string}`. + +- **baseUrl**: `string` + + Root-relative base URL of the service, i.e. the prefix `"/_db/"` followed + by the value of `database`. + +- **body**: `any` + + The processed and validated request body for the current route. + If no body has been defined for the current route, the value is + identical to `rawBody`. + + For details on how request bodies can be processed and validated by Foxx + see the [body method of the endpoint object](endpoints.md#body). + +- **context**: `Context` + + The [service context](../service-context.md) in which the router was mounted + (rather than the context in which the route was defined). + +- **database**: `string` + + The name of the database in which the request is being handled, e.g. `"_system"`. + +- **headers**: `object` + + The raw headers object. + + For details on how request headers can be validated by Foxx see the + [header method of the endpoint object](endpoints.md#header). + +- **hostname**: `string` + + The hostname (domain name) indicated in the request headers. + + Defaults to the hostname portion (i.e. excluding the port) of the `Host` + header and falls back to the listening address of the server. + +- **method**: `string` + + The HTTP verb used to make the request, e.g. `"GET"`. + +- **originalUrl**: `string` + + Root-relative URL of the request, i.e. `path` followed by the raw query + parameters, if any. + +- **path**: `string` + + Database-relative path of the request URL (not including the query parameters). + +- **pathParams**: `object` + + An object mapping the names of path parameters of the current route to + their validated values. + + For details on how path parameters can be validated by Foxx see the + [pathParam method of the endpoint object](endpoints.md#pathparam). + +- **port**: `number` + + The port indicated in the request headers. + + Defaults to the port portion (i.e. excluding the hostname) of the `Host` + header and falls back to the listening port or the appropriate default + port (`443` for HTTPS or `80` for HTTP, depending on `secure`) if the + header only indicates a hostname. + + If the request was made using a trusted proxy (see `trustProxy`), + this is set to the port portion of the `X-Forwarded-Host` header + (or appropriate default port) if present. + +- **protocol**: `string` + + The protocol used for the request. + + Defaults to `"https"` or `"http"` depending on whether ArangoDB is + configured to use SSL or not. + + If the request was made using a trusted proxy (see `trustProxy`), + this is set to the value of the `X-Forwarded-Proto` header if present. + +- **queryParams**: `object` + + An object mapping the names of query parameters of the current route to + their validated values. + + For details on how query parameters can be validated by Foxx see the + [queryParam method of the endpoint object](endpoints.md#queryparam). + +- **rawBody**: `Buffer` + + The raw, unparsed, unvalidated request body as a buffer. + +- **remoteAddress**: `string` + + The IP of the client that made the request. + + If the request was made using a trusted proxy (see `trustProxy`), + this is set to the first IP listed in the `X-Forwarded-For` header if present. + +- **remoteAddresses**: `Array<string>` + + A list containing the IP addresses used to make the request. + + Defaults to the value of `remoteAddress` wrapped in an array. + + If the request was made using a trusted proxy (see `trustProxy`), + this is set to the list of IPs specified in the `X-Forwarded-For` header if present. + +- **remotePort**: `number` + + The listening port of the client that made the request. + + If the request was made using a trusted proxy (see `trustProxy`), + this is set to the port specified in the `X-Forwarded-Port` header if present. + +- **secure**: `boolean` + + Whether the request was made over a secure connection (i.e. HTTPS). + + This is set to `false` when `protocol` is `"http"` and `true` when + `protocol` is `"https"`. + +- **suffix**: `string` + + The trailing path relative to the current route if the current route ends + in a wildcard (e.g. `/something/*`). + + **Note**: The value is passed into the service as-is, i.e. + percentage escape sequences like `%2F` are not unescaped. + Also note that the suffix may contain path segments like `..` which may have + special meaning if the suffix is used to build filesystem paths. + +- **trustProxy**: `boolean` + + Indicates whether the request was made using a trusted proxy. + If the origin server's address was specified in the ArangoDB configuration + using `--web interface.trusted-proxy` or the service's `trustProxy` setting is + enabled, this is `true`, otherwise it is `false`. + +- **url**: `string` + + The URL of the request. + +- **xhr**: `boolean` + + Whether the request indicates it was made within a browser using AJAX. + + This is set to `true` if the `X-Requested-With` header is present and is + a case-insensitive match for the value `"xmlhttprequest"`. + + Note that this value does not guarantee whether the request was made from + inside a browser or whether AJAX was used and is merely a convention + established by JavaScript frameworks like jQuery. + +## accepts + +`req.accepts(types): string | false` + +`req.accepts(...types): string | false` + +`req.acceptsCharsets(charsets): string | false` + +`req.acceptsCharsets(...charsets): string | false` + +`req.acceptsEncodings(encodings): string | false` + +`req.acceptsEncodings(...encodings): string | false` + +`req.acceptsLanguages(languages): string | false` + +`req.acceptsLanguages(...languages): string | false` + +These methods wrap the corresponding content negotiation methods of the +[accepts module](https://github.com/jshttp/accepts) for the current request. + +**Examples** + +```js +if (req.accepts(['json', 'html']) === 'html') { + // Client explicitly prefers HTML over JSON + res.write('<h1>Client prefers HTML</h1>'); +} else { + // Otherwise just send JSON + res.json({success: true}); +} +``` + +## cookie + +`req.cookie(name, options): string | null` + +Gets the value of a cookie by name. + +**Arguments** + +- **name**: `string` + + Name of the cookie. + +- **options**: `object` (optional) + + An object with any of the following properties: + + - **secret**: `string` (optional) + + Secret that was used to sign the cookie. + + If a secret is specified, the cookie's signature is expected to be present + in a second cookie with the same name and the suffix `.sig`. + Otherwise, the signature (if present) is ignored. + + - **algorithm**: `string` (Default: `"sha256"`) + + Algorithm that was used to sign the cookie. + +If a string is passed instead of an options object, it is interpreted as +the `secret` option. + +Returns the value of the cookie or `null` if the cookie is not set or its +signature is invalid. + +## get / header + +`req.get(name): string` + +`req.header(name): string` + +Gets the value of a header by name. You can validate request headers using the +[header method of the endpoint](endpoints.md#header). + +**Arguments** + +- **name**: `string` + + Name of the header. + +Returns the header value. + +## is + +`req.is(types): string` + +`req.is(...types): string` + +This method wraps the (request body) content type detection method of the +[type-is module](https://github.com/jshttp/type-is) for the current request. + +**Examples** + +```js +const type = req.is('html', 'application/xml', 'application/*+xml'); +if (type === false) { // no match + handleDefault(req.rawBody); +} else if (type === 'html') { + handleHtml(req.rawBody); +} else { // is XML + handleXml(req.rawBody); +} +``` + +## json + +`req.json(): any` + +Attempts to parse the raw request body as JSON and returns the result. + +It is generally more useful to define a +[request body on the endpoint](endpoints.md#body) and use the `req.body` +property instead. + +Returns `undefined` if the request body is empty. May throw a `SyntaxError` +if the body could not be parsed. + +## makeAbsolute + +`req.makeAbsolute(path, [query]): string` + +Resolves the given path relative to the `req.context.service`'s mount path +to a full URL. + +**Arguments** + +- **path**: `string` + + The path to resolve. + +- **query**: `string | object` + + A string or object with query parameters to add to the URL. + +Returns the formatted absolute URL. + +## params + +`req.param(name): any` + +**Arguments** + +Looks up a parameter by name, preferring `pathParams` over `queryParams`. + +It's probably better style to use the `req.pathParams` or `req.queryParams` +objects directly. + +- **name**: `string` + + Name of the parameter. + +Returns the (validated) value of the parameter. + +## range + +`req.range([size]): Ranges | number` + +This method wraps the range header parsing method of the +[range-parser module](https://github.com/jshttp/range-parser) for the current request. + +**Arguments** + +- **size**: `number` (Default: `Infinity`) + + Length of the satisfiable range (e.g. number of bytes in the full response). + If present, ranges exceeding the size are considered unsatisfiable. + +Returns `undefined` if the `Range` header is absent, `-2` if the header is +present but malformed, `-1` if the range is invalid (e.g. start offset is +greater than end offset) or unsatisfiable for the given size. + +Otherwise returns an array of objects with the properties `start` and `end` +values for each range. The array has an additional property `type` indicating +the request range type. + +**Examples** + +```js +console.log(req.headers.range); // "bytes=40-80" +const ranges = req.range(100); +console.log(ranges); // [{start: 40, end: 80}] +console.log(ranges.type); // "bytes" +``` + +## reverse + +`req.reverse(name, [params]): string` + +Looks up the URL of a named route for the given parameters. + +**Arguments** + +- **name**: `string` + + Name of the route to look up. + +- **params**: `object` (optional) + + An object containing values for the (path or query) parameters of the route. + +Returns the URL of the route for the given parameters. + +**Examples** + +```js +router.get('/items/:id', function (req, res) { + /* ... */ +}, 'getItemById'); + +router.post('/items', function (req, res) { + // ... + const url = req.reverse('getItemById', {id: createdItem._key}); + res.set('location', req.makeAbsolute(url)); +}); +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/response.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/response.md new file mode 100644 index 0000000000..6c9f0178ce --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/routers/response.md @@ -0,0 +1,465 @@ +--- +title: Foxx response objects +menuTitle: Response +weight: 20 +description: '' +--- +The response object specifies the following properties: + +- **body**: `Buffer | string` + + Response body as a string or buffer. Can be set directly or using some + of the response methods. + +- **context**: `Context` + + The [service context](../service-context.md) in which the router is mounted + (rather than the context in which the route is defined). + +- **headers**: `object` + + The raw headers object. + +- **statusCode**: `number` + + Status code of the response. Defaults to `200` (body set and not an empty + string or buffer) or `204` (otherwise) if not changed from `undefined`. + +## attachment + +`res.attachment([filename]): this` + +Sets the `content-disposition` header to indicate the response is a +downloadable file with the given name. + +**Note:** This does not actually modify the response body or access the +file system. To send a file from the file system see the `download` or +`sendFile` methods. + +**Arguments** + +- **filename**: `string` (optional) + + Name of the downloadable file in the response body. + + If present, the extension of the filename is used to set the response + `content-type` if it has not yet been set. + +Returns the response object. + +## cookie + +`res.cookie(name, value, [options]): this` + +Sets a cookie with the given name. + +**Arguments** + +- **name**: `string` + + Name of the cookie. + +- **value**: `string` + + Value of the cookie. + +- **options**: `object` (optional) + + An object with any of the following properties: + + - **ttl**: `number` (optional) + + Time to live of the cookie in seconds. + + - **algorithm**: `string` (Default: `"sha256"`) + + Algorithm that is used to sign the cookie. + + - **secret**: `string` (optional) + + Secret that is used to sign the cookie. + + If a secret is specified, the cookie's signature is stored in a second + cookie with the same options, the same name, and the suffix `.sig`. + Otherwise no signature is added. + + - **path**: `string` (optional) + + Path for which the cookie should be issued. + + - **domain**: `string` (optional) + + Domain for which the cookie should be issued. + + - **secure**: `boolean` (Default: `false`) + + Whether the cookie should be marked as secure (i.e. HTTPS/SSL-only). + + - **httpOnly**: `boolean` (Default: `false`) + + Whether the cookie should be marked as HTTP-only (rather than also exposing + it to client-side code). + +If a string is passed instead of an options object, it is interpreted as +the `secret` option. + +If a number is passed instead of an options object, it is interpreted as +the `ttl` option. + +Returns the response object. + +## download + +`res.download(path, [filename]): this` + +The equivalent of calling `res.attachment(filename).sendFile(path)`. + +**Arguments** + +- **path**: `string` + + Path to the file on the local filesystem to be sent as the response body. + +- **filename**: `string` (optional) + + Filename to indicate in the `content-disposition` header. + + If omitted, the `path` is used instead. + +Returns the response object. + +## getHeader + +`res.getHeader(name): string` + +Gets the value of the header with the given name. + +**Arguments** + +- **name**: `string` + + Name of the header to get. + +Returns the value of the header or `undefined`. + +## json + +`res.json(data): this` + +Sets the response body to the JSON string value of the given data. + +**Arguments** + +- **data**: `any` + + The data to be used as the response body. + +Returns the response object. + +## redirect + +`res.redirect([status], path): this` + +Redirects the response by setting the response `location` header and status code. + +**Arguments** + +- **status**: `number | string` (optional) + + Response status code to set. + + If the status code is the string value `"permanent"`, it is treated as + the value `301`. + + If the status code is a string, it is converted to a numeric status code + using the [statuses module](https://github.com/jshttp/statuses) first. + + If the status code is omitted but the response status has not already been + set, the response status is set to `302`. + +- **path**: `string` + + URL to set the `location` header to. + +Returns the response object. + +## removeHeader + +`res.removeHeader(name): this` + +Removes the header with the given name from the response. + +**Arguments** + +- **name**: `string` + + Name of the header to remove. + +Returns the response object. + +## send + +`res.send(data, [type]): this` + +Sets the response body to the given data with respect to the response +definition for the response's current status code. + +**Arguments** + +- **data**: `any` + + The data to be used as the response body. It is converted according to the + [response definition](endpoints.md#response) for the response's current + status code (or `200`) in the following way: + + If the data is an ArangoDB result set, it is converted to an array first. + + If the response definition specifies a model with a `forClient` method, + that method is applied to the data first. If the data is an array and + the response definition has the `multiple` flag set, the method is + applied to each entry individually instead. + + Finally, the data is processed by the response type handler to convert + the response body to a string or buffer. + +- **type**: `string` (Default: `"auto"`) + + Content-type of the response body. + + If set to `"auto"`, the first MIME type specified in the + [response definition](endpoints.md#response) for the response's current + status code (or `200`) is used instead. + + If set to `"auto"` and no response definition exists, the MIME type is + determined the following way: + + If the data is a buffer, the MIME type is set to binary + (`application/octet-stream`). + + If the data is an object, the MIME type is set to JSON and the data + is converted to a JSON string. + + Otherwise, the MIME type is set to HTML and the data is + converted to a string. + +Returns the response object. + +## sendFile + +`res.sendFile(path, [options]): this` + +Sends a file from the local filesystem as the response body. + +**Arguments** + +- **path**: `string` + + Path to the file on the local filesystem to be sent as the response body. + + If no `content-type` header has been set yet, the extension of the filename + is used to set the value of that header. + +- **options**: `object` (optional) + + An object with any of the following properties: + + - **lastModified**: `boolean` (optional) + + If set to `true` or if no `last-modified` header has been set yet and the + value is not set to `false`, the `last-modified` header is set to the + modification date of the file in milliseconds. + +Returns the response object. + +**Examples** + +```js +// Send the file "favicon.ico" from this service's folder +res.sendFile(module.context.fileName('favicon.ico')); +``` + +## sendStatus + +`res.sendStatus(status): this` + +Sends a plaintext response for the given status code. +The response status is set to the given status code, the response body +is set to the status message corresponding to that status code. + +**Arguments** + +- **status**: `number | string` + + Response status code to set. + + If the status code is a string, it is converted to a numeric status code + using the [statuses module](https://github.com/jshttp/statuses) first. + +Returns the response object. + +## setHeader / set + +`res.setHeader(name, value): this` + +`res.set(name, value): this` + +`res.set(headers): this` + +Sets the value of the header with the given name. + +**Arguments** + +- **name**: `string` + + Name of the header to set. + +- **value**: `string` + + Value to set the header to. + +- **headers**: `object` + + Header object mapping header names to values. + +Returns the response object. + +## status + +`res.status(status): this` + +Sets the response status to the given status code. + +**Arguments** + +- **status**: `number | string` + + Response status code to set. + + If the status code is a string, it is converted to a numeric status + code using the [statuses module](https://github.com/jshttp/statuses) first. + +Returns the response object. + +## throw + +`res.throw(status, [reason], [options]): void` + +Throws an HTTP exception for the given status, which is handled by Foxx +to serve the appropriate JSON error response. + +**Arguments** + +- **status**: `number | string` + + Response status code to set. + + If the status code is a string, it is converted to a numeric status code + using the [statuses module](https://github.com/jshttp/statuses) first. + + If the status code is in the 500-range (500-599), its stacktrace is always + logged as if it were an unhandled exception. + + If development mode is enabled, the error's stacktrace is logged as a + warning if the status code is in the 400-range (400-499) or as a regular + message otherwise. + +- **reason**: `string` (optional) + + Message for the exception. + + If omitted, the status message corresponding to the status code is + used instead. + +- **options**: `object` (optional) + + An object with any of the following properties: + + - **cause**: `Error` (optional) + + Cause of the exception that is logged as part of the error's stacktrace + (recursively, if the exception also has a `cause` property and so on). + + - **extra**: `object` (optional) + + Additional properties that are added to the error response body + generated by Foxx. + + If development mode is enabled, an `exception` property is added to + this value containing the error message and a `stacktrace` property is + added containing an array with each line of the error's stacktrace. + +If an error is passed instead of an options object, it is interpreted as +the `cause` option. If no reason is provided, the error's `message` is +used as the reason instead. + +Returns nothing. + +## type + +`res.type([type]): string` + +Sets the response content-type to the given type if provided or returns the +previously set content-type. + +**Arguments** + +- **type**: `string` (optional) + + Content-type of the response body. + + Unlike `res.set('content-type', type)`, file extensions can be provided as + values and are translated to the corresponding MIME type (e.g. `json` + becomes `application/json`). + +Returns the content-type of the response body. + +## vary + +`res.vary(names): this` + +`res.vary(...names): this` + +This method wraps the `vary` header manipulation method of the +[vary module](https://github.com/jshttp/vary) for the current response. + +The given names is added to the response's `vary` header if not already present. + +Returns the response object. + +**Examples** + +```js +res.vary('user-agent'); +res.vary('cookie'); +res.vary('cookie'); // duplicates are ignored + +// -- or -- + +res.vary('user-agent', 'cookie'); + +// -- or -- + +res.vary(['user-agent', 'cookie']); +``` + +## write + +`res.write(data): this` + +Appends the given data to the response body. + +**Arguments** + +- **data**: `string | Buffer` + + Data to append. + + If the data is a buffer, the response body is converted to a buffer first. + + If the response body is a buffer, the data is not converted. + + If the data is an object, it is converted to a JSON string first. + + If the data is any other non-string value, it is converted to a string first. + +Returns the response object. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/service-context.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/service-context.md new file mode 100644 index 0000000000..9e2379a505 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/service-context.md @@ -0,0 +1,297 @@ +--- +title: Foxx service context +menuTitle: Service context +weight: 10 +description: '' +--- +The service context provides access to methods and attributes that are specific +to a given service. In a Foxx service the context is generally available as the +`module.context` variable. Within a router's request handler the request and +response objects' `context` attribute also provide access to the context of the +service the route was mounted in (which may be different from the one the route +handler was defined in). + +**Examples** + +```js +// in service /my-foxx-1 +const createRouter = require('@arangodb/foxx/router'); +const router = createRouter(); + +// See the chapter on dependencies for more info on +// how exports and dependencies work across services +module.exports = {routes: router}; + +router.get(function (req, res) { + module.context.mount === '/my-foxx-1'; + req.context.mount === '/my-foxx-2'; + res.write('Hello from my-foxx-1'); +}); + +// in service /my-foxx-2 +const createRouter = require('@arangodb/foxx/router'); +const router2 = createRouter(); + +module.context.use(router2); + +router2.post(function (req, res) { + module.context.mount === '/my-foxx-2'; + req.context.mount === '/my-foxx-2'; + res.write('Hello from my-foxx-2'); +}); + +const router1 = module.context.dependencies.myFoxx1.routes; +module.context.use(router1); +``` + +The service context specifies the following properties: + +- **argv**: `any` + + Any arguments passed in if the current file was executed as a + [script or queued job](../guides/scripts-and-scheduling.md). + +- **basePath**: `string` + + The file system path of the service, i.e. the folder in which the service + was installed to by ArangoDB. + +- **baseUrl**: `string` + + The base URL of the service, relative to the ArangoDB server, + e.g. `/_db/_system/my-foxx`. + +- **collectionPrefix**: `string` + + The prefix that is used by `collection` and `collectionName` to derive + the names of service-specific collections. This is derived from the + service's mount point, e.g. `/my-foxx` becomes `my_foxx`. + +- **configuration**: `Object` + + [Configuration options](configuration.md) for the service. + +- **dependencies**: `Object` + + Configured [dependencies](../guides/linking-services-together.md) for the service. + +- **isDevelopment**: `boolean` + + Indicates whether the service is running in [development mode](../_index.md). + +- **isProduction**: `boolean` + + The inverse of `isDevelopment`. + +- **manifest**: `Object` + + The parsed [manifest file](service-manifest.md) of the service. + +- **mount**: `string` + + The mount point of the service, e.g. `/my-foxx`. + +## apiDocumentation + +`module.context.apiDocumentation([options]): Function` + +{{< warning >}} +This method has been deprecated in ArangoDB 3.1 and replaced with +the more straightforward `createDocumentationRouter()` method providing the +same functionality. +{{< /warning >}} + +Creates a request handler that serves the API documentation. + +**Arguments** + +See [`createDocumentationRouter()`](#createdocumentationrouter). + +**Examples** + +```js +// Serve the API docs for the current service +router.get('/docs/*', module.context.apiDocumentation()); + +// Note that the path must end with a wildcard +// and the route must use HTTP GET. +``` + +## createDocumentationRouter + +`module.context.createDocumentationRouter([options]): Router` + +Creates a router that serves the API documentation. + +**Note**: The router can be mounted like any other child router +(see examples below). + +**Arguments** + +- **options**: `Object` (optional) + + An object with any of the following properties: + + - **mount**: `string` (Default: `module.context.mount`) + + The mount path of the service to serve the documentation of. + + - **indexFile**: `string` (Default: `"index.html"`) + + File name of the HTML file serving the API documentation. + + - **swaggerRoot**: `string` (optional) + + Full path of the folder containing the Swagger assets and the `indexFile`. + Defaults to the Swagger assets used by the web interface. + + - **before**: `Function` (optional) + + A function that is executed before a request is handled. + + If the function returns `false`, the request is not processed any further. + + If the function returns an object, its attributes are used to override + the `options` for the current request. + + Any other return value is ignored. + +If `options` is a function, it is used as the `before` option. + +If `options` is a string, it is used as the `swaggerRoot` option. + +Returns a Foxx router. + +**Examples** + +```js +// Serve the API docs for the current service +router.use('/docs', module.context.createDocumentationRouter()); + +// -- or -- + +// Serve the API docs for the service the router is mounted in +router.use('/docs', module.context.createDocumentationRouter(function (req) { + return {mount: req.context.mount}; +})); + +// -- or -- + +// Serve the API docs only for users authenticated with ArangoDB +router.use('/docs', module.context.createDocumentationRouter(function (req, res) { + if (req.suffix === 'swagger.json' && !req.arangoUser) { + res.throw(401, 'Not authenticated'); + } +})); +``` + +## collection + +`module.context.collection(name): ArangoCollection | null` + +Passes the given name to `collectionName`, then looks up the collection with +the prefixed name. + +**Arguments** + +- **name**: `string` + + Unprefixed name of the service-specific collection. + +Returns a collection or `null` if no collection with the prefixed name exists. + +## collectionName + +`module.context.collectionName(name): string` + +Prefixes the given name with the `collectionPrefix` for this service. + +**Arguments** + +- **name**: `string` + + Unprefixed name of the service-specific collection. + +Returns the prefixed name. + +**Examples** + +```js +module.context.mount === '/my-foxx' +module.context.collectionName('doodads') === 'my_foxx_doodads' +``` + +## file + +`module.context.file(name, [encoding]): Buffer | string` + +Passes the given name to `fileName`, then loads the file with the resulting name. + +**Arguments** + +- **name**: `string` + + Name of the file to load, relative to the current service. + +- **encoding**: `string` (optional) + + Encoding of the file, e.g. `utf-8`. If omitted, the file is loaded as a + raw buffer instead of a string. + +Returns the file's contents. + +## fileName + +`module.context.fileName(name): string` + +Resolves the given file name relative to the current service. + +**Arguments** + +- **name**: `string` + + Name of the file, relative to the current service. + +Returns the absolute file path. + +<!-- registerType + +`module.context.registerType(type, def): void` + +TODO + +**Arguments** + +- **type**: `string` + + TODO + +- **def**: `Object` + + TODO + +TODO + +--> + +## use + +`module.context.use([path], router): Endpoint` + +Mounts a given router on the service to expose the router's routes on the +service's mount point. + +**Arguments** + +- **path**: `string` (Default: `"/"`) + + Path to mount the router at, relative to the service's mount point. + +- **router**: `Router | Middleware` + + A router or middleware to mount. + +Returns an [Endpoint](routers/endpoints.md) for the given router or middleware. + +**Note**: Mounting services at run time (e.g. within request handlers or +queued jobs) is not supported. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/service-manifest.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/service-manifest.md new file mode 100644 index 0000000000..bfa6b34871 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/service-manifest.md @@ -0,0 +1,307 @@ +--- +title: Service manifest +menuTitle: Service manifest +weight: 5 +description: '' +--- +Every service comes with a `manifest.json` file providing metadata. Typically, a +manifest should at least specify the version of ArangoDB the service supports and +the `main` JavaScript file which Foxx uses as the entrypoint to your service: + +```json +{ + "engines": { + "arangodb": "^3.4.0" + }, + "main": "index.js" +} +``` + +## Tooling integration + +If you are using an IDE or editor that supports JSON schema for code intelligence +or validation, you can use the public Foxx manifest schema +[available at the third-party JSON Schema Store](http://json.schemastore.org/foxx-manifest) +by adding a `$schema` field to your `manifest.json` file: + +```json +{ + "$schema": "http://json.schemastore.org/foxx-manifest" +} +``` + +### Visual Studio Code + +In [Visual Studio Code](https://code.visualstudio.com) you can also enable the +Foxx manifest schema for all `manifest.json` files by adding the following to your +[user or workspace settings](https://code.visualstudio.com/docs/getstarted/settings): + +```json +{ + "json.schemas": [ + { + "fileMatch": [ + "manifest.json" + ], + "url": "http://json.schemastore.org/foxx-manifest" + } + ] +} +``` + +## Structure + +The following fields are allowed in manifests: + +- **$schema**: `"http://json.schemastore.org/foxx-manifest"` (optional) + + The JSON schema. See above. + +- **configuration**: `Object` (optional) + + An object defining the [configuration options](configuration.md) this service requires. + +- **defaultDocument**: `string` (optional) + + If specified, the `/` (root) route of the service automatically redirects + to the given relative path, e.g.: + + ```json + "defaultDocument": "index.html" + ``` + + This would have the same effect as creating the following route in JavaScript: + + ```js + const createRouter = require("@arangodb/foxx/router"); + const indexRouter = createRouter(); + indexRouter.all("/", function(req, res) { + res.redirect("index.html"); + }); + module.context.use(indexRouter); + ``` + + **Note**: As of 3.0.0 this field can safely be omitted; the value no longer + defaults to `"index.html"`. + +- **dependencies**: `Object` (optional) + + An object mapping local aliases to dependency definitions. + Each entry can be a dependency name and version range in the format + `name:version` or an object with the following properties: + + - **name**: `string` (Default: `"*"`) + + Name of the dependency. + + - **version**: `string` (Default: `"*"`) + + Version range of the dependency. + + - **description**: `string` (optional) + + Human-readable description of the dependency or how the dependency is used. + + - **required**: `boolean` (Default: `true`) + + Whether the service requires the dependency to be assigned in order to function. + If a required dependency is not assigned, the service is marked as + inoperable until a service mount point has been assigned for the dependency. + + - **multiple**: `boolean` (Default: `false`) + + Whether the dependency can be specified multiple times. If a dependency is + marked as `multiple`, the value of the local alias is an array of all + services assigned for the dependency. + + See [the dependencies guide](../guides/linking-services-together.md) for more information. + +- **engines**: `Object` (optional) + + An object indicating the [semantic version ranges](http://semver.org) of + ArangoDB (or compatible environments) the service is compatible with, e.g.: + + ```json + "engines": { + "arangodb": "^3.0.0" + } + ``` + + This should correctly indicate the minimum version of ArangoDB the service + has been tested against. Foxx maintains a strict semantic versioning policy + as of ArangoDB 3.0.0 so it is generally safe to use semver ranges + (e.g. `^3.0.0` to match any version greater or equal to `3.0.0` and below + `4.0.0`) for maximum compatibility. + +- **files**: `Object` (optional) + + An object defining file assets served by this service. + + Each entry can represent either a single file or a directory. + When serving entire directories, the key acts as a prefix and requests to + that prefix are resolved within the given directory: + + - **path**: `string` + + The relative path of the file or folder within the service. + + - **type**: `string` (optional) + + The MIME content type of the file. Defaults to an intelligent guess based + on the filename's extension. + + - **gzip**: `boolean` (Default: `false`) + + If set to `true`, the file is served with gzip-encoding if supported + by the client. This can be useful when serving text files like client-side + JavaScript, CSS or HTML. + + If a string is provided instead of an object, it is interpreted as the `path` option. + + Example serving the `public` folder at `/static` and the `favicon.ico` at `/favicon.ico`: + + ```json + "files": { + "favicon.ico": { + "path": "public/favicon.ico", + "gzip": false + }, + "static": "public" + } + ``` + +- **lib**: `string` (Default: `"."`) + + The relative path to the Foxx JavaScript files in the service, e.g.: + + ```json + "lib": "lib" + ``` + + This would result in the main entry point (see below) and other JavaScript + paths being resolved as relative to the `lib` folder inside the service folder. + +- **main**: `string` (optional) + + The relative path to the main entry point of this service + (relative to _lib_, see above), e.g.: + + ```json + "main": "index.js" + ``` + + This would result in Foxx loading and executing the file `index.js` when + the service is mounted or started. + + **Note**: while it is technically possible to omit this field, you + likely want to provide an entry point to your service as this is the only + way to expose HTTP routes or export a JavaScript API. + +- **provides**: `Object` (optional) + + An object mapping dependency names to version ranges of that dependency + provided by this service. See [the dependencies guide](../guides/linking-services-together.md) + for more information. + +- **scripts**: `Object` (optional) + + An object defining [named scripts](../guides/scripts-and-scheduling.md) provided by this + service, which can either be used directly or as queued jobs by other services. + +- **tests**: `string` or `Array<string>` (optional) + + One or more patterns to match the paths of test files, e.g.: + + ```json + "tests": [ + "**/test_*.js", + "**/*_test.js" + ] + ``` + + These patterns can be either relative file paths or "globstar" patterns where + + - `*` matches zero or more characters in a filename + - `**` matches zero or more nested directories. + +Additionally manifests can provide the following metadata: + +- **author**: `string` (optional) + + The full name of the author of the service (i.e. you). + This is shown in the web interface. + +- **contributors**: `Array<string>` (optional) + + A list of names of people that have contributed to the development of the + service in some way. This is shown in the web interface. + +- **description**: `string` (optional) + + A human-readable description of the service. + This is shown in the web interface. + +- **keywords**: `Array<string>` (optional) + + A list of keywords that help categorize this service. + This is used by the Foxx Store installers to organize services. + +- **license**: `string` (optional) + + A string identifying the license under which the service is published, ideally + in the form of an [SPDX license identifier](https://spdx.org/licenses). + This will be shown in the web interface. + +- **name**: `string` (optional) + + The name of the Foxx service. Allowed characters are A-Z, 0-9, the ASCII + hyphen (`-`) and underscore (`_`) characters. The name must not start with + a number. This is shown in the web interface. + +- **thumbnail**: `string` (optional) + + The filename of a thumbnail that is used alongside the service in the + web interface. This should be a JPEG or PNG image that looks good at sizes + 50x50 and 160x160. + +- **version**: `string` (optional) + + The version number of the Foxx service. The version number must follow the + [semantic versioning format](http://semver.org). + This is shown in the web interface. + +**Examples** + +```json +{ + "name": "example-foxx-service", + "version": "3.0.0-dev", + "license": "MIT", + "description": "An example service with a relatively full-featured manifest.", + "thumbnail": "foxx-icon.png", + "keywords": ["demo", "service"], + "author": "ArangoDB GmbH", + "contributors": [ + "Alan Plum <alan@arangodb.example>" + ], + + "lib": "dist", + "main": "entry.js", + "defaultDocument": "welcome.html", + "engines": { + "arangodb": "^3.0.0" + }, + + "files": { + "welcome.html": "assets/index.html", + "hello.jpg": "assets/hello.jpg", + "world.jpg": { + "path": "assets/world.jpg", + "type": "image/jpeg", + "gzip": false + } + }, + + "tests": "dist/**.spec.js" +} +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/_index.md new file mode 100644 index 0000000000..f418804eba --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/_index.md @@ -0,0 +1,86 @@ +--- +title: Foxx Session Middleware +menuTitle: Sessions middleware +weight: 25 +description: '' +--- +`const sessionMiddleware = require('@arangodb/foxx/sessions');` + +The session middleware adds the `session` and `sessionStorage` properties to +the [request object](../routers/request.md) and deals with serializing and +deserializing the session as well as extracting session identifiers from +incoming requests and injecting them into outgoing responses. + +**Examples** + +```js +// Create a session middleware +const sessions = sessionsMiddleware({ + storage: module.context.collection('sessions'), + transport: ['header', 'cookie'] +}); +// First enable the middleware for this service +module.context.use(sessions); +// Now mount the routers that use the session +const router = createRouter(); +module.context.use(router); + +router.get('/', function (req, res) { + res.send(`Hello ${req.session.uid || 'anonymous'}!`); +}, 'hello'); + +router.post('/login', function (req, res) { + req.session.uid = req.body; + req.sessionStorage.save(req.session); + res.redirect(req.reverse('hello')); +}); +.body(['text/plain'], 'Username'); +``` + +## Creating a session middleware + +`sessionMiddleware(options): Middleware` + +Creates a session middleware. + +**Arguments** + +- **options**: `Object` + + An object with the following properties: + + - **storage**: `Storage` + + Storage that is used to persist the sessions. + + The storage is also exposed as the `sessionStorage` on all request objects + and as the `storage` property of the middleware. + + If a string or collection is passed instead of a Storage, it is used + to create a [Collection Storage](session-storages/collection-storage.md). + + - **transport**: `Transport | Array<Transport>` + + Transport or array of transports that is used to extract the session + identifiers from incoming requests and inject them into outgoing responses. + When attempting to extract a session identifier, the transports are + used in the order specified until a match is found. When injecting + (or clearing) session identifiers, all transports are invoked. + + The transports are also exposed as the `transport` property of the middleware. + + If the string `"cookie"` is passed instead of a Transport, the + [Cookie Transport](session-transports/cookie-transport.md) are used with the default + settings instead. + + If the string `"header"` is passed instead of a Transport, the + [Header Transport](session-transports/header-transport.md) are used with the default + settings instead. + + - **autoCreate**: `boolean` (Default: `true`) + + If enabled the session storage's `new` method is invoked to create an + empty session whenever the transport failed to return a session for the + incoming request. Otherwise, the session is initialized as `null`. + +Returns the session middleware. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md new file mode 100644 index 0000000000..1b35b60b88 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/_index.md @@ -0,0 +1,100 @@ +--- +title: Foxx Session Storages +menuTitle: Session storages +weight: 5 +description: '' +--- +Session storages are used by the sessions middleware to persist sessions across +requests. Session storages must implement the `fromClient` and `forClient` +methods and can optionally implement the `new` method. + +The built-in session storages generally provide the following attributes: + +- **uid**: `string` (Default: `null`) + + A unique identifier indicating the active user. + +- **created**: `number` (Default: `Date.now()`) + + The numeric timestamp of when the session was created. + +- **data**: `any` (Default: `null`) + + Arbitrary data to persisted in the session. + +## new + +`storage.new(): Session` + +Generates a new session object representing an empty session. +The empty session object should not be persisted unless necessary. +The return value will be exposed by the middleware as the `session` property +of the request object if no session identifier was returned by the session +transports and auto-creation is not explicitly disabled in the session middleware. + +**Examples** + +```js +new() { + return { + uid: null, + created: Date.now(), + data: null + }; +} +``` + +## fromClient + +`storage.fromClient(sid): Session | null` + +Resolves or deserializes a session identifier to a session object. + +**Arguments** + +- **sid**: `string` + + Session identifier to resolve or deserialize. + +Returns a session object representing the session with the given session +identifier that will be exposed by the middleware as the `session` property of +the request object. This method will only be called if any of the session transports +returned a session identifier. If the session identifier is invalid or expired, +the method should return a `null` value to indicate no matching session. + +**Examples** + +```js +fromClient(sid) { + return db._collection('sessions').firstExample({_key: sid}); +} +``` + +## forClient + +`storage.forClient(session): string | null` + +Derives a session identifier from the given session object. + +**Arguments** + +- **session**: `Session` + + Session to derive a session identifier from. + +Returns a session identifier for the session represented by the given +session object. This method will be called with the `session` property +of the request object unless that property is empty (e.g. `null`). + +**Examples** + +```js +forClient(session) { + if (!session._key) { + const meta = db._collection('sessions').save(session); + return meta._key; + } + db._collection('sessions').replace(session._key, session); + return session._key; +} +``` diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md new file mode 100644 index 0000000000..1ecb3d3395 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/collection-storage.md @@ -0,0 +1,88 @@ +--- +title: Foxx Collection Session Storage +menuTitle: Collection storage +weight: 5 +description: '' +--- +`const collectionStorage = require('@arangodb/foxx/sessions/storages/collection');` + +The collection session storage persists sessions to a collection in the database. + +## Creating a storage + +`collectionStorage(options): Storage` + +Creates a [Storage](_index.md) that can be used in the sessions middleware. + +**Arguments** + +- **options**: `Object` + + An object with the following properties: + + - **collection**: `ArangoCollection` + + The collection that should be used to persist the sessions. + If a string is passed instead of a collection it is assumed to be the fully + qualified name of a collection in the current database. + + - **ttl**: `number` (Default: `60 * 60`) + + The time in seconds since the last update until a session is + considered expired. + + - **pruneExpired**: `boolean` (Default: `false`) + + Whether expired sessions should be removed from the collection when they + are accessed instead of simply being ignored. + + - **autoUpdate**: `boolean` (Default: `true`) + + Whether sessions should be updated in the collection every time they + are accessed to keep them from expiring. Disabling this option + **will improve performance** but means you have to take care of + keeping your sessions alive yourself. + +If a string or collection is passed instead of an options object, it is +interpreted as the `collection` option. + +## prune + +`storage.prune(): Array<string>` + +Removes all expired sessions from the collection. This method should be called +even if the `pruneExpired` option is enabled to clean up abandoned sessions. + +Returns an array of the keys of all sessions that were removed. + +## save + +`storage.save(session): Session` + +Saves (replaces) the given session object in the collection. This method needs +to be invoked explicitly after making changes to the session or the changes +are not persisted. Assigns a new `_key` to the session if it previously +did not have one. + +**Arguments** + +- **session**: `Session` + + A session object. + +Returns the modified session. + +## clear + +`storage.clear(session): boolean` + +Removes the session from the collection. Has no effect if the session was +already removed or has not yet been saved to the collection (i.e. has no `_key`). + +**Arguments** + +- **session**: `Session` + + A session object. + +Returns `true` if the session was removed or `false` if it had no effect. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md new file mode 100644 index 0000000000..9b29d661fc --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md @@ -0,0 +1,74 @@ +--- +title: Foxx JWT Session Storage +menuTitle: JWT storage +weight: 10 +description: '' +--- +`const jwtStorage = require('@arangodb/foxx/sessions/storages/jwt');` + +The JWT session storage converts sessions to and from +[JSON Web Tokens](https://jwt.io/). + +**Examples** + +```js +// Pass in a secure secret from the Foxx configuration +const secret = module.context.configuration.jwtSecret; +const sessions = sessionsMiddleware({ + storage: jwtStorage(secret), + transport: 'header' +}); +module.context.use(sessions); +``` + +## Creating a storage + +`jwtStorage(options): Storage` + +Creates a [Storage](_index.md) that can be used in the sessions middleware. + +**Note:** while the "none" algorithm (i.e. no signature) is supported this +dummy algorithm provides no security and allows clients to make arbitrary +modifications to the payload and should not be used unless you are certain +you specifically need it. + +**Arguments** + +- **options**: `Object` + + An object with the following properties: + + - **algorithm**: `string` (Default: `"HS512"`) + + The algorithm to use for signing the token. + + Supported values: + + - `"HS256"` (HMAC-SHA256) + - `"HS384"` (HMAC-SHA384) + - `"HS512"` (HMAC-SHA512) + - `"none"` (no signature) + + - **secret**: `string` + + The secret to use for signing the token. + + This field is forbidden when using the "none" algorithm but required otherwise. + + - **ttl**: `number` (Default: `3600`) + + The maximum lifetime of the token in seconds. You may want to keep this + short as a new token is generated on every request allowing clients to + refresh tokens automatically. + + - **verify**: `boolean` (Default: `true`) + + If set to `false`, the signature is not verified but still generated + (unless using the "none" algorithm). + + - **maxExp**: `number` (Default: `Infinity`) + + Largest value that is accepted in an incoming JWT `exp` (expiration) field. + +If a string is passed instead of an options object, it is interpreted +as the `secret` option. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md new file mode 100644 index 0000000000..2a377ac998 --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/_index.md @@ -0,0 +1,84 @@ +--- +title: Foxx Session Transports +menuTitle: Session transports +weight: 10 +description: '' +--- +Session transports are used by the sessions middleware to store and retrieve +session identifiers in requests and responses. Session transports must +implement the `get` and/or `set` methods and can optionally implement the +`clear` method. + +## get + +`transport.get(request): string | null` + +Retrieves a session identifier from a request object. + +If present this method will automatically be invoked for each transport until +a transport returns a session identifier. + +**Arguments** + +- **request**: `Request` + + [Request object](../../routers/request.md) to extract a session identifier from. + +Returns the session identifier or `null` if the transport cannot find a +session identifier in the request. + +**Examples** + +```js +get(req) { + return req.get('x-session-id') || null; +} +``` + +## set + +`transport.set(response, sid): void` + +Attaches a session identifier to a response object. + +If present this method will automatically be invoked at the end of a request +regardless of whether the session was modified or not. + +**Arguments** + +- **response**: `Response` + + [Response object](../../routers/response.md) to attach a session identifier to. + +- **sid**: `string` + + Session identifier to attach to the response. + +Returns nothing. + +**Examples** + +```js +set(res) { + res.set('x-session-id', value); +} +``` + +## clear + +`transport.clear(response): void` + +Attaches a payload indicating that the session has been cleared to the +response object. This can be used to clear a session cookie when the session +has been destroyed (e.g. during logout). + +If present this method will automatically be invoked instead of `set` when the +`req.session` attribute was removed by the route handler. + +**Arguments** + +- **response**: `Response` + + Response object to remove the session identifier from. + +Returns nothing. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md new file mode 100644 index 0000000000..6eb89c04ff --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md @@ -0,0 +1,79 @@ +--- +title: Foxx Cookie Session Transport +menuTitle: Cookie transport +weight: 5 +description: '' +--- +`const cookieTransport = require('@arangodb/foxx/sessions/transports/cookie');` + +The cookie transport stores session identifiers in cookies on the request and +response object. + +**Examples** + +```js +// Pass in a secure secret from the Foxx configuration +const secret = module.context.configuration.cookieSecret; +const sessions = sessionsMiddleware({ + storage: module.context.collection('sessions'), + transport: cookieTransport({ + name: 'FOXXSESSID', + ttl: 60 * 60 * 24 * 7, // one week in seconds + algorithm: 'sha256', + secret: secret + }) +}); +module.context.use(sessions); +``` + +## Creating a transport + +`cookieTransport([options]): Transport` + +Creates a [Transport](_index.md) that can be used in the sessions middleware. + +**Arguments** + +- **options**: `Object` (optional) + + An object with the following properties: + + - **name**: `string` (Default: `"sid"`) + + The name of the cookie. + + - **ttl**: `number` (optional) + + Cookie lifetime in seconds. Note that this does not affect the storage TTL + (i.e. how long the session itself is considered valid), just how long the + cookie should be stored by the client. + + - **algorithm**: `string` (optional) + + The algorithm used to sign and verify the cookie. If no algorithm is + specified, the cookie is not signed or verified. + See the [cookie method on the response object](../../routers/response.md). + + - **secret**: `string` (optional) + + Secret to use for the signed cookie. Ignored if no algorithm is provided. + + - **path**: `string` (optional) + + Path for which the cookie should be issued. + + - **domain**: `string` (optional) + + Domain for which the cookie should be issued. + + - **secure**: `boolean` (Default: `false`) + + Whether the cookie should be marked as secure (i.e. HTTPS/SSL-only). + + - **httpOnly**: `boolean` (Default: `false`) + + Whether the cookie should be marked as HTTP-only (rather than also + exposing it to client-side code). + +If a string is passed instead of an options object, it is interpreted +as the `name` option. diff --git a/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md new file mode 100644 index 0000000000..f9b6cffcae --- /dev/null +++ b/site/content/arangodb/oem/develop/foxx-microservices/reference/sessions-middleware/session-transports/header-transport.md @@ -0,0 +1,39 @@ +--- +title: Foxx Header Session Transport +menuTitle: Header transport +weight: 10 +description: '' +--- +`const headerTransport = require('@arangodb/foxx/sessions/transports/header');` + +The header transport stores session identifiers in headers on the request +and response objects. + +**Examples** + +```js +const sessions = sessionsMiddleware({ + storage: module.context.collection('sessions'), + transport: headerTransport('X-FOXXSESSID') +}); +module.context.use(sessions); +``` + +## Creating a transport + +`headerTransport([options]): Transport` + +Creates a [Transport](_index.md) that can be used in the sessions middleware. + +**Arguments** + +- **options**: `Object` (optional) + + An object with the following properties: + + - **name**: `string` (Default: `X-Session-Id`) + + Name of the header that contains the session identifier (not case sensitive). + +If a string is passed instead of an options object, it is interpreted +as the `name` option. diff --git a/site/content/arangodb/oem/develop/http-api/_index.md b/site/content/arangodb/oem/develop/http-api/_index.md new file mode 100644 index 0000000000..4e14d398c3 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/_index.md @@ -0,0 +1,111 @@ +--- +title: HTTP API Documentation +menuTitle: HTTP API +weight: 275 +description: >- + All functionality of ArangoDB servers is provided via a RESTful API over the + HTTP protocol, and you can call the API endpoints directly, via database + drivers, or other tools +--- +ArangoDB servers expose an application programming interface (API) for managing +the database system. It is based on the HTTP protocol that powers the +world wide web. All interactions with a server are ultimately carried out via +this HTTP API. + +You can use the API by sending HTTP requests to the server directly, but the +more common way of communicating with the server is via a [database driver](../drivers/_index.md). +A driver abstracts the complexity of the API away by providing a simple +interface for your programming language or environment and handling things like +authentication, connection pooling, asynchronous requests, and multi-part replies +in the background. You can also use ArangoDB's [web interface](../../components/web-interface/_index.md), +the [_arangosh_](../../components/tools/arangodb-shell/_index.md) shell, or other tools. + +The API documentation is relevant for you in the following cases: + +- You want to build or extend a driver. +- You want to utilize a feature that isn't exposed by your driver or tool. +- You need to send many requests and avoid any overhead that a driver or tool might add. +- You operate a server instance and need to perform administrative actions via the API. +- You are interested in how the low-level communication works. + +## RESTful API + +The API adheres to the design principles of [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) +(Representational State Transfer). A REST API is a specific type of HTTP API +that uses HTTP methods to represent operations on resources (mainly `GET`, +`POST`, `PATCH`, `PUT`, and `DELETE`), and resources are identified by URIs. +A resource can be a database record, a server log, or any other data entity or +object. The communication between client and server is stateless. + +A request URL can look like this: +`http://localhost:8529/_db/DATABASE/_api/document/COLLECTION/KEY?returnOld=true&keepNull=false` +- `http` is the scheme, which is `https` if you use TLS encryption +- `http:` is the protocol +- `localhost` is the hostname, which can be an IP address or domain name including subdomains +- `8529` is the port +- `/_db/DATABASE/_api/document/COLLECTION/KEY` is the pathname +- `?returnOld=true&keepNull=false` is the search string +- `returnOld=true&keepNull=false` is the query string + +The HTTP API documentation mainly describes the available **endpoints**, like +for updating a document, creating a graph, and so on. Each endpoint description +starts with the HTTP method and the pathname, like `PATCH /_api/document/{collection}/{key}`. +- The `PATCH` method is for updating, `PUT` for replacing, `POST` for creating + (or triggering an action), `DELETE` for removing, `GET` for reading, + `HEAD` for reading metadata only +- `/_api/document/…` is the path of ArangoDB's HTTP API for handling documents + and can be preceded by `/_db/{database}` with `{database}` replaced by a + database name to select another database than the default `_system` database +- `{collection}` and `{key}` are placeholders called **Path Parameters** that + you have to replace with a collection name and document key in this case +- The pathname can be followed by a question mark and the so-called + **Query Parameters**, which is a series of key/value pairs separated by + ampersands to set options, like `/_api/document/COLLECTION/KEY?returnOld=true&keepNull=false` +- Some endpoints allow you to specify **HTTP headers** in the request + (not in the URL), like `If-Match: "REVISION"` +- A **Request Body** is the payload you may need to send, typically JSON data +- **Responses** are the possible HTTP responses in reply to your request in terms + of the HTTP status code and typically a JSON payload with a result or error information + +On the wire, a simplified HTTP request can look like this: + +``` +PATCH /_api/document/coll1/docA?returnOld=true HTTP/1.1 +Host: localhost:8529 +Authorization: Basic cm9vdDo= +If-Match: "_hV2oH9y---" +Content-Type: application/json; charset=utf-8 +Content-Length: 20 + +{"attr":"new value"} +``` + +And a simplified HTTP response can look like this: + +``` +HTTP/1.1 202 Accepted +Etag: "_hV2r5XW---" +Location: /_db/_system/_api/document/coll1/docA +Server: ArangoDB +Connection: Keep-Alive +Content-Type: application/json; charset=utf-8 +Content-Length: 160 + +{"_id":"coll1/docA","_key":"docA","_rev":"_hV2r5XW---","_oldRev":"_hV2oH9y---","old":{"_key":"docA","_id":"coll1/docA","_rev":"_hV2oH9y---","attr":"value"}} +``` + +## Swagger specification + +ArangoDB's RESTful HTTP API is documented using the industry-standard +**OpenAPI Specification**, more specifically [OpenAPI version 3.1](https://swagger.io/specification/). +You can explore the API with the interactive **Swagger UI** using the +[ArangoDB web interface](../../components/web-interface/_index.md). + +1. Click **SUPPORT** in the main navigation of the web interface. +2. Click the **Rest API** tab. +3. Click a section and endpoint to view the description and parameters. + +![The web interface with the navigation on the left and the tabs at the top](../../../../images/swagger_serverapi_overview.png) + +Also see this blog post: +[Using the ArangoDB Swagger.io Interactive API Documentation](https://www.arangodb.com/2018/03/using-arangodb-swaggerio-interactive-api-documentation/). diff --git a/site/content/arangodb/oem/develop/http-api/administration.md b/site/content/arangodb/oem/develop/http-api/administration.md new file mode 100644 index 0000000000..667e06743d --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/administration.md @@ -0,0 +1,1654 @@ +--- +title: HTTP interface for server administration +menuTitle: Administration +weight: 110 +description: >- + You can get information about ArangoDB servers, toggle the maintenance mode, + shut down server nodes, and start actions like compaction +# Undocumented on purpose: +# /_admin/debug (internal) +# /_api/test (internal) +# /_admin/telemetrics (internal) +--- +## Information + +### Get the server version + +```openapi +paths: + /_db/{database-name}/_api/version: + # /_admin/version is an (undocumented) alias + get: + # Technically accepts all of the following methods: HEAD, GET, POST, PATCH, PUT, DELETE + operationId: getVersion + description: | + Returns the server name and version number. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + - name: details + in: query + required: false + description: | + If set to `true` and if the user account you authenticate with has + administrate access to the `_system` database, the response contains + a `details` attribute with additional information about included + components and their versions. The attribute names and internals of + the `details` object may vary depending on platform and ArangoDB version. + schema: + type: boolean + default: false + responses: + '200': + description: | + is returned in all cases. + content: + application/json: + schema: + type: object + required: + - server + - version + properties: + server: + description: | + will always contain `arango` + type: string + version: + description: | + the server version string. The string has the format + `major.minor.sub`. `major` and `minor` will be numeric, and `sub` + may contain a number or a textual version. + type: string + details: + description: | + an optional JSON object with additional details. This is + returned only if the `details` query parameter is set to `true` in the + request. + type: object + properties: + architecture: + description: | + The CPU architecture, i.e. `64bit` + type: string + arm: + description: | + `false` - this is not running on an ARM cpu + type: string + asan: + description: | + has this been compiled with the asan address sanitizer turned on? (should be false) + type: string + assertions: + description: | + do we have assertions compiled in (=> developer version) + type: string + boost-version: + description: | + which boost version do we bind + type: string + build-date: + description: | + the date when this binary was created + type: string + build-repository: + description: | + reference to the git-ID this was compiled from + type: string + compiler: + description: | + which compiler did we use + type: string + cplusplus: + description: | + C++ standards version + type: string + debug: + description: | + `false` for production binaries + type: string + endianness: + description: | + currently only `little` is supported + type: string + failure-tests: + description: | + `false` for production binaries (the facility to invoke fatal errors is disabled) + type: string + fd-client-event-handler: + description: | + which method do we use to handle fd-sets, `poll` should be here on linux. + type: string + fd-setsize: + description: | + if not `poll` the fd setsize is valid for the maximum number of file descriptors + type: string + full-version-string: + description: | + The full version string + type: string + icu-version: + description: | + Which version of ICU do we bundle + type: string + jemalloc: + description: | + `true` if we use jemalloc + type: string + maintainer-mode: + description: | + `false` if this is a production binary + type: string + openssl-version: + description: | + which openssl version do we link? + type: string + platform: + description: | + the host os - `linux`, `windows` or `darwin` + type: string + reactor-type: + description: | + `epoll` + type: string + rocksdb-version: + description: | + the rocksdb version this release bundles + type: string + server-version: + description: | + the ArangoDB release version + type: string + sizeof int: + description: | + number of bytes for integers + type: string + sizeof void*: + description: | + number of bytes for void pointers + type: string + sse42: + description: | + do we have a SSE 4.2 enabled cpu? + type: string + unaligned-access: + description: | + does this system support unaligned memory access? + type: string + v8-version: + description: | + the bundled V8 javascript engine version + type: string + vpack-version: + description: | + the version of the used velocypack implementation + type: string + zlib-version: + description: | + the version of the bundled zlib + type: string + mode: + description: | + The mode arangod runs in. + type: string + enum: [server, console, script] + host: + description: | + the host ID + type: string + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: |- + Return the version information +name: RestVersion +--- +var response = logCurlRequest('GET', '/_api/version'); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Return the version information with details +name: RestVersionDetails +--- +var response = logCurlRequest('GET', '/_api/version?details=true'); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Get the storage engine type + +```openapi +paths: + /_db/{database-name}/_api/engine: + get: + operationId: getEngine + description: | + Returns the storage engine the server is configured to use. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + is returned in all cases. + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + will be `rocksdb` + type: string + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: |- + Return the active storage engine: +name: RestEngine +--- +var response = logCurlRequest('GET', '/_api/engine'); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Get the system time + +```openapi +paths: + /_db/{database-name}/_admin/time: + get: + # Technically accepts all of the following methods: HEAD, GET, POST, PATCH, PUT, DELETE + operationId: getTime + description: | + The call returns an object with the `time` attribute. This contains the + current system time as a Unix timestamp with microsecond precision. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + Time was returned successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - time + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + time: + description: | + The current system time as a Unix timestamp with microsecond precision of the server + type: number + tags: + - Administration +``` + +### Get server status information + +```openapi +paths: + /_db/{database-name}/_admin/status: + get: + # Technically accepts all of the following methods: HEAD, GET, POST, PATCH, PUT, DELETE + operationId: getStatus + description: | + Returns status information about the server. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + responses: + '200': + description: | + Status information was returned successfully. + content: + application/json: + schema: + type: object + required: + - server + - license + - version + - mode + - operationMode + - foxxApi + - host + - pid + - serverInfo + properties: + server: + description: | + Always `"arango"`. + type: string + license: + description: | + ArangoDB Edition, either `"community"` or `"enterprise"`. + type: string + version: + description: | + The server version as a string. + type: string + mode: + description: | + Either `"server"` or `"console"`. **Deprecated**, use `operationMode` instead. + type: string + operationMode: + description: | + Either `"server"` or `"console"`. + type: string + foxxApi: + description: | + Whether the Foxx API is enabled. + type: boolean + host: + description: | + A host identifier defined by the `HOST` or `NODE_NAME` environment variable, + or a fallback value using a machine identifier or the cluster/Agency address. + type: string + hostname: + description: | + A hostname defined by the `HOSTNAME` environment variable. + type: string + pid: + description: | + The process ID of _arangod_. + type: number + serverInfo: + description: | + Information about the server status. + type: object + required: + - progress + - role + - writeOpsEnabled + - readOnly + - maintenance + properties: + progress: + description: | + Startup and recovery information. + + You can check for changes to determine whether progress was made between two + calls, but you should not rely on specific values as they may change between + ArangoDB versions. The values are only expected to change during the startup and + shutdown, i.e. while `maintenance` is `true`. + + You need to start _arangod_ with the `--server.early-connections` startup option + enabled to be able to query the endpoint during the startup process. + If authentication is enabled, then you need to use the super-user JWT for the + request because the user management is not available during the startup. + type: object + required: + - phase + - feature + - recoveryTick + properties: + phase: + description: | + Name of the lifecycle phase the instance is currently in. Normally one of + `"in prepare"`, `"in start"`, `"in wait"`, `"in shutdown"`, `"in stop"`, + or `"in unprepare"`. + type: string + feature: + description: | + Internal name of the feature that is currently being prepared, started, + stopped or unprepared. + type: string + recoveryTick: + description: | + Current recovery sequence number value, if the instance is currently recovering. + If the instance is already past the recovery, this attribute will contain the + last handled recovery sequence number. + type: number + role: + description: | + Either `"SINGLE"`, `"COORDINATOR"`, `"PRIMARY"` (DB-Server), or `"AGENT"`. + type: string + writeOpsEnabled: + description: | + Whether writes are enabled. **Deprecated**, use `readOnly` instead. + type: boolean + readOnly: + description: | + Whether writes are disabled. + type: boolean + maintenance: + description: | + Whether the maintenance mode is enabled. + type: boolean + persistedId: + description: | + The persisted ID, e. g. `"CRDN-e427b441-5087-4a9a-9983-2fb1682f3e2a"`. + *Cluster only* (Agents, Coordinators, and DB-Servers). + type: string + rebootId: + description: | + The reboot ID. Changes on every restart. + *Cluster only* (Agents, Coordinators, and DB-Servers). + type: number + state: + description: | + Either `"STARTUP"`, `"SERVING"`, or `"SHUTDOWN"`. + *Cluster only* (Coordinators and DB-Servers). + type: string + address: + description: | + The address of the server, e.g. `tcp://[::1]:8530`. + *Cluster only* (Coordinators and DB-Servers). + type: string + serverId: + description: | + The server ID, e.g. `"CRDN-e427b441-5087-4a9a-9983-2fb1682f3e2a"`. + *Cluster only* (Coordinators and DB-Servers). + type: string + agency: + description: | + Information about the Agency. + *Cluster only* (Coordinators and DB-Servers). + type: object + properties: + agencyComm: + description: | + Information about the communication with the Agency. + *Cluster only* (Coordinators and DB-Servers). + type: object + properties: + endpoints: + description: | + A list of possible Agency endpoints. + type: array + items: + type: string + coordinator: + description: | + Information about the Coordinators. + *Cluster only* (Coordinators) + type: object + properties: + foxxmaster: + description: | + The server ID of the Coordinator that is the Foxx master. + type: array + items: + type: string + isFoxxmaster: + description: | + Whether the queried Coordinator is the Foxx master. + type: array + items: + type: string + agent: + description: | + Information about the Agents. + *Cluster only* (Agents) + type: object + properties: + id: + description: | + Server ID of the queried Agent. + type: string + leaderId: + description: | + Server ID of the leading Agent. + type: string + leading: + description: | + Whether the queried Agent is the leader. + type: boolean + endpoint: + description: | + The endpoint of the queried Agent. + type: string + term: + description: | + The current term number. + type: number + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminStatus +type: cluster +--- +var url = "/_admin/status"; +var response = logCurlRequest("GET", url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Return whether or not a server is available + +```openapi +paths: + /_admin/server/availability: + # Independent of database + get: + operationId: getServerAvailability + description: | + Return availability information about a server. + + The response is a JSON object with an attribute "mode". The "mode" can either + be "readonly", if the server is in read-only mode, or "default", if it is not. + Please note that the JSON object with "mode" is only returned in case the server + does not respond with HTTP response code 503. + + This is a public API so it does *not* require authentication. It is meant to be + used only in the context of server monitoring. + responses: + '200': + description: | + This API will return HTTP 200 in case the server is up and running and usable for + arbitrary operations, is not set to read-only mode and is currently not a follower + in case of an Active Failover deployment setup. + '503': + description: | + HTTP 503 will be returned in case the server is during startup or during shutdown, + is set to read-only mode or is currently a follower in an Active Failover deployment setup. + + In addition, HTTP 503 will be returned in case the fill grade of the scheduler + queue exceeds the configured high-water mark (adjustable via startup option + `--server.unavailability-queue-fill-grade`), which by default is set to 75 % of + the maximum queue length. + tags: + - Administration +``` + + +### Get the required database version (deprecated) + +```openapi +paths: + /_admin/database/target-version: + get: + operationId: getDatabaseVersion + description: | + {{</* warning */>}} + This endpoint is deprecated and should no longer be used. It will be removed from version 3.12.0 onward. + Use `GET /_api/version` instead. + {{</* /warning */>}} + + Returns the database version that this server requires. + The version is returned in the `version` attribute of the result. + responses: + '200': + description: | + Is returned in all cases. + tags: + - Administration +``` + + +### Get information about the deployment + +```openapi +paths: + /_db/_system/_admin/support-info: + get: + # Technically accepts all of the following methods: HEAD, GET, POST, PATCH, PUT, DELETE + operationId: getSupportInfo + description: | + Retrieves deployment information for support purposes. The endpoint returns data + about the ArangoDB version used, the host (operating system, server ID, CPU and + storage capacity, current utilization, a few metrics) and the other servers in + the deployment (in case of cluster deployments). + + As this API may reveal sensitive data about the deployment, it can only be + accessed from inside the `_system` database. In addition, there is a policy + control startup option `--server.support-info-api` that controls if and to whom + the API is made available. + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - date + - deployment + properties: + date: + description: | + ISO 8601 datetime string of when the information was requested. + type: string + deployment: + description: | + An object with at least a `type` attribute, indicating the deployment mode. + + In case of a `"single"` server, additional information is provided in the + top-level `host` attribute. + + In case of a `"cluster"`, there is a `servers` object that contains a nested + object for each Coordinator and DB-Server, using the server ID as key. Each + object holds information about the ArangoDB instance as well as the host machine. + There are additional attributes for the number of `agents`, `coordinators`, + `dbServers`, and `shards`. + type: object + host: + description: | + An object that holds information about the ArangoDB instance as well as the + host machine. Only set in case of single servers. + type: object + '404': + description: | + The support info API is turned off. + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: |- + Query support information from a single server +name: RestAdminSupportInfo +--- +var url = "/_db/_system/_admin/support-info"; +var response = logCurlRequest("GET", url); +assert(response.code === 200); +assert(response.parsedBody.host !== undefined); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Query support information from a cluster +name: RestAdminSupportInfo +type: cluster +--- +var url = "/_db/_system/_admin/support-info"; +var response = logCurlRequest("GET", url); +assert(response.code === 200); +assert(response.parsedBody.deployment.servers !== undefined); +logJsonResponse(response); +``` + +## Server mode + +### Return whether or not a server is in read-only mode + +```openapi +paths: + /_db/{database-name}/_admin/server/mode: + get: + operationId: getServerMode + description: | + Return mode information about a server. The json response will contain + a field `mode` with the value `readonly` or `default`. In a read-only server + all write operations will fail with an error code of `1004` (_ERROR_READ_ONLY_). + Creating or dropping of databases and collections will also fail with error code `11` (_ERROR_FORBIDDEN_). + + This API requires authentication. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + This API will return HTTP 200 if everything is ok + tags: + - Administration +``` + +### Set the server mode to read-only or default + +```openapi +paths: + /_db/{database-name}/_admin/server/mode: + put: + operationId: setServerMode + description: | + Update mode information about a server. The JSON response will contain + a field `mode` with the value `readonly` or `default`. In a read-only server + all write operations will fail with an error code of `1004` (_ERROR_READ_ONLY_). + Creating or dropping of databases and collections will also fail with error + code `11` (_ERROR_FORBIDDEN_). + + This is a protected API. It requires authentication and administrative + server rights. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - mode + properties: + mode: + description: | + The mode of the server `readonly` or `default`. + type: string + responses: + '200': + description: | + This API will return HTTP 200 if everything is ok + '401': + description: | + if the request was not authenticated as a user with sufficient rights + tags: + - Administration +``` + +## License + +The endpoints for license management allow you to view the current license +status and update the license of your ArangoDB Enterprise Edition deployment. + +### Get information about the current license + +```openapi +paths: + /_db/{database-name}/_admin/license: + get: + operationId: getLicense + description: | + View the license information and status of an Enterprise Edition instance. + Can be called on single servers, Coordinators, and DB-Servers. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + responses: + '200': + description: | + Returns the license information. + content: + application/json: + schema: + type: object + required: + - license + properties: + features: + description: | + The properties of the license. + type: object + required: + - expires + properties: + expires: + description: | + The `expires` key lists the expiry date as Unix timestamp (seconds since + January 1st, 1970 UTC). + type: number + example: 1683173040 + license: + description: | + The encrypted license key in Base64 encoding, or `"none"` + in the Community Edition. + type: string + example: V0h/W...wEDw== + hash: + description: | + The hash value of the license. + type: string + example: 982db5...44f3 + version: + description: | + The license version number. + type: number + example: 1 + status: + description: | + The `status` key allows you to confirm the state of the installed license on a + glance. + + - `good`: The license is valid for more than 2 weeks. + - `expiring`: The license is valid for less than 2 weeks. + - `expired`: The license has expired. In this situation, no new + Enterprise Edition features can be utilized. + - `read-only`: The license is expired over 2 weeks. The instance is now + restricted to read-only mode. + type: string + enum: [good, expiring, expired, read-only] + example: good + upgrading: + description: | + Whether the server is performing a database upgrade. + type: boolean + example: false + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminLicenseGet +type: cluster +--- +var assertTypeOf = require("jsunity").jsUnity.assertions.assertTypeOf; +var url = "/_admin/license"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); +assertTypeOf("string", response.parsedBody.license); + +logJsonResponse(response); +``` + +### Set a new license + +```openapi +paths: + /_db/{database-name}/_admin/license: + put: + operationId: setLicense + description: | + Set a new license for an Enterprise Edition instance. + Can be called on single servers, Coordinators, and DB-Servers. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + - name: force + in: query + required: false + description: | + Whether to change the license even if it expires sooner than the current one. + schema: + type: boolean + default: false + requestBody: + content: + application/json: + schema: + description: | + The request body has to contain the Base64-encoded license string wrapped in double quotes. + type: string + example: eyJncmFudCI6...(Base64-encoded license string)... + responses: + '201': + description: | + License successfully deployed. + content: + application/json: + schema: + type: object + required: + - result + properties: + result: + type: object + required: + - error + - code + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + '400': + description: | + If the license expires earlier than the previously installed one, + or if the supplied license string is invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + If you try to apply a license in the Community Edition. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Administration +``` + +**Examples** + +{{< comment >}} +Example not generated because it would require a valid license to demonstrate the API. +{{< /comment >}} + +```bash +curl --header 'accept: application/json' --dump - --data '"eyJncmFudCI6...(Base64-encoded license string)..."' -X PUT http://localhost:8529/_admin/license +``` + +{{< details summary="Show output" >}} +```bash +HTTP/1.1 201 Created +content-type: application/json +cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0 +connection: Keep-Alive +content-length: 37 +content-security-policy: frame-ancestors 'self'; form-action 'self'; +expires: 0 +pragma: no-cache +server: ArangoDB +strict-transport-security: max-age=31536000 ; includeSubDomains +x-arango-queue-time-seconds: 0.000000 +x-content-type-options: nosniff + +{ + "result": { + "error": false, + "code": 201 + } +} +``` +{{< /details >}} + +## Shutdown + +### Start the shutdown sequence + +```openapi +paths: + /_db/{database-name}/_admin/shutdown: + delete: + operationId: startShutdown + description: | + This call initiates a clean shutdown sequence. Requires administrative privileges. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: soft + in: query + required: false + description: | + <small>Introduced in: v3.7.12, v3.8.1, v3.9.0</small> + + If set to `true`, this initiates a soft shutdown. This is only available + on Coordinators. When issued, the Coordinator tracks a number of ongoing + operations, waits until all have finished, and then shuts itself down + normally. It will still accept new operations. + + This feature can be used to make restart operations of Coordinators less + intrusive for clients. It is designed for setups with a load balancer in front + of Coordinators. Remove the designated Coordinator from the load balancer before + issuing the soft-shutdown. The remaining Coordinators will internally forward + requests that need to be handled by the designated Coordinator. All other + requests will be handled by the remaining Coordinators, reducing the designated + Coordinator's load. + + The following types of operations are tracked: + + - AQL cursors (in particular streaming cursors) + - Transactions (in particular stream transactions) + - Pregel runs (conducted by this Coordinator) + - Ongoing asynchronous requests (using the `x-arango-async: store` HTTP header) + - Finished asynchronous requests, whose result has not yet been + collected + - Queued low priority requests (most normal requests) + - Ongoing low priority requests + schema: + type: boolean + default: false + responses: + '200': + description: | + is returned in all cases, `OK` will be returned in the result buffer on success. + tags: + - Administration +``` + +### Query the soft shutdown progress + +```openapi +paths: + /_db/{database-name}/_admin/shutdown: + get: + operationId: getShutdownProgress + description: | + <small>Introduced in: v3.7.12, v3.8.1, v3.9.0</small> + + This call reports progress about a soft Coordinator shutdown (see + documentation of `DELETE /_admin/shutdown?soft=true`). + In this case, the following types of operations are tracked: + + - AQL cursors (in particular streaming cursors) + - Transactions (in particular stream transactions) + - Pregel runs (conducted by this Coordinator) + - Ongoing asynchronous requests (using the `x-arango-async: store` HTTP header) + - Finished asynchronous requests, whose result has not yet been + collected + - Queued low priority requests (most normal requests) + - Ongoing low priority requests + + This API is only available on Coordinators. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + responses: + '200': + description: | + The response indicates the fact that a soft shutdown is ongoing and the + number of active operations of the various types. Once all numbers have gone + to 0, the flag `allClear` is set and the Coordinator shuts down automatically. + content: + application/json: + schema: + type: object + required: + - softShutdownOngoing + - AQLcursors + - transactions + - pendingJobs + - doneJobs + - pregelConductors + - lowPrioOngoingRequests + - lowPrioQueuedRequests + - allClear + properties: + softShutdownOngoing: + description: | + Whether a soft shutdown of the Coordinator is in progress. + type: boolean + AQLcursors: + description: | + Number of AQL cursors that are still active. + type: number + transactions: + description: | + Number of ongoing transactions. + type: number + pendingJobs: + description: | + Number of ongoing asynchronous requests. + type: number + doneJobs: + description: | + Number of finished asynchronous requests, whose result has not yet been collected. + type: number + pregelConductors: + description: | + Number of ongoing Pregel jobs. + type: number + lowPrioOngoingRequests: + description: | + Number of queued low priority requests. + type: number + lowPrioQueuedRequests: + description: | + Number of ongoing low priority requests. + type: number + allClear: + description: | + Whether all active operations finished. + type: boolean + tags: + - Administration +``` + +## Miscellaneous actions + +### Compact all databases + +```openapi +paths: + /_admin/compact: + # Independent of database (superuser has access to all databases that exist) + put: + operationId: compactAllDatabases + description: | + {{</* warning */>}} + This command can cause a full rewrite of all data in all databases, which may + take very long for large databases. It should thus only be used with care and + only when additional I/O load can be tolerated for a prolonged time. + {{</* /warning */>}} + + This endpoint can be used to reclaim disk space after substantial data + deletions have taken place, by compacting the entire database system data. + + The endpoint requires superuser access. + requestBody: + content: + application/json: + schema: + type: object + properties: + changeLevel: + description: | + whether or not compacted data should be moved to the minimum possible level. + type: boolean + default: false + compactBottomMostLevel: + description: | + Whether or not to compact the bottommost level of data. + type: boolean + default: false + responses: + '200': + description: | + Compaction started successfully + '401': + description: | + if the request was not authenticated as a user with sufficient rights + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminCompact +--- +var response = logCurlRequest('PUT', '/_admin/compact', ''); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Reload the routing table + +```openapi +paths: + /_db/{database-name}/_admin/routing/reload: + post: + # Technically accepts all of the following methods: HEAD, GET, POST, PATCH, PUT, DELETE + operationId: reloadRouting + description: | + Reloads the routing information from the `_routing` system collection if it + exists, and makes Foxx rebuild its local routing table on the next request. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + The routing information has been reloaded successfully. + tags: + - Administration +``` + +### Echo a request + +```openapi +paths: + /_db/{database-name}/_admin/echo: + post: + operationId: echoRequest + description: | + The call returns an object with the servers request information + requestBody: + content: + application/octet-stream: + schema: + description: | + The request body can be of any type and is simply forwarded. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + Echo was returned successfully. + content: + application/json: + schema: + type: object + required: + - authorized + - user + - isAdminUser + - database + - url + - protocol + - portType + - server + - client + - internals + - prefix + - headers + - requestType + - requestBody + - rawRequestBody + - parameters + - cookies + - suffix + - rawSuffix + - path + properties: + authorized: + description: | + Whether the session is authorized + type: boolean + user: + description: | + The name of the current user that sent this request + type: string + isAdminUser: + description: | + Whether the current user is an administrator + type: boolean + database: + description: | + The name of the database this request was executed on + type: string + url: + description: | + The raw request URL + type: string + protocol: + description: | + The transport protocol, one of `"http"`, `"https"`, `"velocystream"` + type: string + portType: + description: | + The type of the socket, one of `"tcp/ip"`, `"unix"`, `"unknown"` + type: string + server: + description: | + Attributes of the server connection + type: object + required: + - address + - port + - endpoint + properties: + address: + description: | + The bind address of the endpoint this request was sent to + type: string + port: + description: | + The port this request was sent to + type: integer + endpoint: + description: | + The endpoint this request was sent to + type: string + client: + description: | + Attributes of the client connection + type: object + required: + - address + - port + - id + properties: + address: + description: | + The IP address of the client + type: integer + port: + description: | + The port of the TCP connection on the client-side + type: integer + id: + description: | + A server generated ID + type: string + internals: + description: | + Contents of the server internals struct + type: object + prefix: + description: | + The prefix of the database + type: object + headers: + description: | + The list of the HTTP headers you sent + type: object + requestType: + description: | + The HTTP method that was used for the request (`"POST"`). The endpoint can be + queried using other verbs, too (`"GET"`, `"PUT"`, `"PATCH"`, `"DELETE"`). + type: string + requestBody: + description: | + Stringified version of the request body you sent + type: string + rawRequestBody: + description: | + The sent payload as a JSON-encoded Buffer object + type: object + parameters: + description: | + An object containing the query parameters + type: object + cookies: + description: | + A list of the cookies you sent + type: object + suffix: + description: | + A list of the decoded URL path suffixes. You can query the endpoint with + arbitrary suffixes, e.g. `/_admin/echo/foo/123` + type: array + items: + type: string + rawSuffix: + description: | + A list of the percent-encoded URL path suffixes + type: array + items: + type: string + path: + description: | + The relative path of this request (decoded, excluding `/_admin/echo`) + type: string + tags: + - Administration +``` + +### Execute a script + +```openapi +paths: + /_db/{database-name}/_admin/execute: + post: + # Technically accepts all of the following methods: HEAD, GET, POST, PATCH, PUT, DELETE + operationId: executeCode + description: | + Executes the JavaScript code in the body on the server as the body + of a function with no arguments. If you have a `return` statement + then the return value you produce will be returned as content type + `application/json`. If the parameter `returnAsJSON` is set to + `true`, the result will be a JSON object describing the return value + directly, otherwise a string produced by JSON.stringify will be + returned. + + Note that this API endpoint is available if the server has been + started with the `--javascript.allow-admin-execute` startup options + enabled. + + The default value of this option is `false`, which disables the execution of + user-defined code and disables this API endpoint entirely. + This is also the recommended setting for production. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + text/javascript: + schema: + description: | + The request body is the JavaScript code to be executed. + responses: + '200': + description: | + is returned when everything went well, or if a timeout occurred. In the + latter case a body of type application/json indicating the timeout + is returned. depending on `returnAsJSON` this is a json object or a plain string. + '403': + description: | + is returned if ArangoDB is not running in cluster mode. + '404': + description: | + is returned if ArangoDB was not compiled for cluster operation. + tags: + - Administration +``` + +## Endpoints + +{{< warning >}} +The `/_api/endpoint` endpoint is deprecated. For cluster deployments, you can +use `/_api/cluster/endpoints` instead to find all current Coordinator endpoints. +See [Cluster](cluster.md#endpoints). +{{< /warning >}} + +An ArangoDB server can listen for incoming requests on multiple _endpoints_. + +The endpoints are normally specified either in the _arangod_ configuration +file or on the command-line, using the `--server.endpoint` startup option. +The default endpoint for ArangoDB is `tcp://127.0.0.1:8529` (IPv4 localhost on +port 8529 over the HTTP protocol). + +Note that all endpoint management operations can only be accessed via +the default `_system` database and none of the other databases. + +### List the endpoints of a single server (deprecated) + +```openapi +paths: + /_db/_system/_api/endpoint: + get: + operationId: listEndpoints + description: | + {{</* warning */>}} + This route should no longer be used. + It is considered as deprecated from version 3.4.0 on. + {{</* /warning */>}} + + Returns an array of all configured endpoints the server is listening on. + + The result is a JSON array of JSON objects, each with `"entrypoint"` as + the only attribute, and with the value being a string describing the + endpoint. + + {{</* info */>}} + Retrieving the array of all endpoints is allowed in the system database + only. Calling this action in any other database will make the server return + an error. + {{</* /info */>}} + responses: + '200': + description: | + is returned when the array of endpoints can be determined successfully. + '400': + description: | + is returned if the action is not carried out in the system database. + '405': + description: | + The server will respond with *HTTP 405* if an unsupported HTTP method is used. + tags: + - Administration +``` + +**Examples** + +```curl +--- +description: '' +name: RestEndpointGet +--- +var url = "/_db/_system/_api/endpoint"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/analyzers.md b/site/content/arangodb/oem/develop/http-api/analyzers.md new file mode 100644 index 0000000000..feb941feda --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/analyzers.md @@ -0,0 +1,337 @@ +--- +title: HTTP interface for Analyzers +menuTitle: Analyzers +weight: 65 +description: >- + The HTTP API for Analyzers lets you create and delete Analyzers, as well as + list all or get specific Analyzers with all their settings +--- +The RESTful API for managing ArangoSearch Analyzers is accessible via the +`/_api/analyzer` endpoint. + +See the description of [Analyzers](../../index-and-search/analyzers.md) for an +introduction and the available types, properties and features. + +## Create an Analyzer + +```openapi +paths: + /_db/{database-name}/_api/analyzer: + post: + operationId: createAnalyzer + description: | + Creates a new Analyzer based on the provided configuration. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + - type + properties: + name: + description: | + The Analyzer name. + type: string + type: + description: | + The Analyzer type. + type: string + properties: + description: | + The properties used to configure the specified Analyzer type. + type: object + features: + description: | + The set of features to set on the Analyzer generated fields. + type: array + default: [] + uniqueItems: true + items: + type: string + enum: [frequency, norm, position, offset] + responses: + '200': + description: | + An Analyzer with a matching name and definition already exists. + '201': + description: | + A new Analyzer definition was successfully created. + '400': + description: | + One or more of the required parameters is missing or one or more of the parameters + is not valid. + '403': + description: | + The user does not have permission to create and Analyzer with this configuration. + tags: + - Analyzers +``` + +**Examples** + +```curl +--- +description: '' +name: RestAnalyzerPost +--- +var analyzers = require("@arangodb/analyzers"); +var db = require("@arangodb").db; +var analyzerName = "testAnalyzer"; + +// creation +var url = "/_api/analyzer"; +var body = { + name: "testAnalyzer", + type: "identity" +}; +var response = logCurlRequest('POST', url, body); +assert(response.code === 201); + +logJsonResponse(response); + +analyzers.remove(analyzerName, true); +``` + +## Get an Analyzer definition + +```openapi +paths: + /_db/{database-name}/_api/analyzer/{analyzer-name}: + get: + operationId: getAnalyzer + description: | + Retrieves the full definition for the specified Analyzer name. + The resulting object contains the following attributes: + - `name`: the Analyzer name + - `type`: the Analyzer type + - `properties`: the properties used to configure the specified type + - `features`: the set of features to set on the Analyzer generated fields + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: analyzer-name + in: path + required: true + description: | + The name of the Analyzer to retrieve. + schema: + type: string + responses: + '200': + description: | + The Analyzer definition was retrieved successfully. + '404': + description: | + Such an Analyzer configuration does not exist. + tags: + - Analyzers +``` + +**Examples** + +```curl +--- +description: |- + Retrieve an Analyzer definition: +name: RestAnalyzerGet +--- +var analyzers = require("@arangodb/analyzers"); +var db = require("@arangodb").db; +var analyzerName = "testAnalyzer"; +analyzers.save(analyzerName, "identity"); + +// retrieval +var url = "/_api/analyzer/" + encodeURIComponent(analyzerName); +var response = logCurlRequest('GET', url); +assert(response.code === 200); + +logJsonResponse(response); + +analyzers.remove(analyzerName, true); +``` + +## List all Analyzers + +```openapi +paths: + /_db/{database-name}/_api/analyzer: + get: + operationId: listAnalyzers + description: | + Retrieves a an array of all Analyzer definitions. + The resulting array contains objects with the following attributes: + - `name`: the Analyzer name + - `type`: the Analyzer type + - `properties`: the properties used to configure the specified type + - `features`: the set of features to set on the Analyzer generated fields + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + The Analyzer definitions was retrieved successfully. + tags: + - Analyzers +``` + +**Examples** + +```curl +--- +description: |- + Retrieve all Analyzer definitions: +name: RestAnalyzersGet +--- +// retrieval +var url = "/_api/analyzer"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Remove an Analyzer + +```openapi +paths: + /_db/{database-name}/_api/analyzer/{analyzer-name}: + delete: + operationId: deleteAnalyzer + description: | + Removes an Analyzer configuration identified by `analyzer-name`. + + If the Analyzer definition was successfully dropped, an object is returned with + the following attributes: + - `error`: `false` + - `name`: The name of the removed Analyzer + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: analyzer-name + in: path + required: true + description: | + The name of the Analyzer to remove. + schema: + type: string + - name: force + in: query + required: false + description: | + The Analyzer configuration should be removed even if it is in-use. + schema: + type: boolean + default: false + responses: + '200': + description: | + The Analyzer configuration was removed successfully. + '400': + description: | + The `analyzer-name` was not supplied or another request parameter was not + valid. + '403': + description: | + The user does not have permission to remove this Analyzer configuration. + '404': + description: | + Such an Analyzer configuration does not exist. + '409': + description: | + The specified Analyzer configuration is still in use and `force` was omitted or + `false` specified. + tags: + - Analyzers +``` + +**Examples** + +```curl +--- +description: |- + Removing without `force`: +name: RestAnalyzerDelete +--- +var analyzers = require("@arangodb/analyzers"); +var db = require("@arangodb").db; +var analyzerName = "testAnalyzer"; +analyzers.save(analyzerName, "identity"); + +// removal +var url = "/_api/analyzer/" + encodeURIComponent(analyzerName); +var response = logCurlRequest('DELETE', url); +console.error(JSON.stringify(response)); +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Removing with `force`: +name: RestAnalyzerDeleteForce +--- +var analyzers = require("@arangodb/analyzers"); +var db = require("@arangodb").db; +var analyzerName = "testAnalyzer"; +analyzers.save(analyzerName, "identity"); + +// create Analyzer reference +var url = "/_api/collection"; +var body = { name: "testCollection" }; +var response = logCurlRequest('POST', url, body); +assert(response.code === 200); +var url = "/_api/view"; +var body = { + name: "testView", + type: "arangosearch", + links: { testCollection: { analyzers: [ analyzerName ] } } +}; +var response = logCurlRequest('POST', url, body); + +// removal (fail) +var url = "/_api/analyzer/" + encodeURIComponent(analyzerName) + "?force=false"; +var response = logCurlRequest('DELETE', url); +assert(response.code === 409); + +// removal +var url = "/_api/analyzer/" + encodeURIComponent(analyzerName) + "?force=true"; +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); + +logJsonResponse(response); + +db._dropView("testView"); +db._drop("testCollection"); +``` diff --git a/site/content/arangodb/oem/develop/http-api/authentication.md b/site/content/arangodb/oem/develop/http-api/authentication.md new file mode 100644 index 0000000000..99300238be --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/authentication.md @@ -0,0 +1,451 @@ +--- +title: HTTP interface for authentication +menuTitle: Authentication +weight: 10 +description: >- + You can gain access to a protected ArangoDB server via HTTP authentication + using a username and password, or a JSON Web Tokens (JWT) generated from the + user credentials or the JWT secret of the deployment +--- +Client authentication can be achieved by using the `Authorization` HTTP header +in client requests. ArangoDB supports authentication via HTTP Basic or JWT. + +Authentication is turned on by default for all internal database APIs but +turned off for custom Foxx apps. To toggle authentication for incoming +requests to the internal database APIs, use the +[`--server.authentication`](../../components/arangodb-server/options.md#--serverauthentication) +startup option. This option is turned on by default so authentication is +required for the database APIs. + +{{< security >}} +Requests using the HTTP `OPTIONS` method are answered by +ArangoDB in any case, even if no authentication data is sent by the client or if +the authentication data is wrong. This is required for handling CORS preflight +requests (see [Cross Origin Resource Sharing requests](general-request-handling.md#cross-origin-resource-sharing-cors-requests)). +The response to an HTTP `OPTIONS` request is generic and doesn't expose any +private data. +{{< /security >}} + +There is an additional option to control authentication for custom Foxx apps. The +[`--server.authentication-system-only`](../../components/arangodb-server/options.md#--serverauthentication-system-only) +startup option controls whether authentication is required only for requests to +the internal database APIs and the admin interface. It is turned on by default, +meaning that other APIs (this includes custom Foxx apps) do not require +authentication. + +The default values allow exposing a public custom Foxx API built with ArangoDB +to the outside world without the need for HTTP authentication, but still +protecting the usage of the internal database APIs (i.e. `/_api/`, `/_admin/`) +with HTTP authentication. + +If the server is started with the `--server.authentication-system-only` +option set to `false`, all incoming requests need HTTP authentication +if the server is configured to require HTTP authentication +(i.e. `--server.authentication true`). Setting the option to `true` +makes the server require authentication only for requests to the internal +database APIs and allows unauthenticated requests to all other URLs. + +Here is a short summary: + +- `--server.authentication true --server.authentication-system-only true`: + This requires authentication for all requests to the internal database + APIs but not custom Foxx apps. This is the default setting. +- `--server.authentication true --server.authentication-system-only false`: + This requires authentication for all requests (including custom Foxx apps). +- `--server.authentication false`: Authentication is disabled for all requests. + +Whenever authentication is required and the client has not yet authenticated, +ArangoDB returns **HTTP 401** (Unauthorized). It also sends the +`Www-Authenticate` response header, indicating that the client should prompt +the user for username and password if supported. If the client is a browser, +then sending back this header normally triggers the display of the +browser-side HTTP authentication dialog. As showing the browser HTTP +authentication dialog is undesired in AJAX requests, ArangoDB can be told to +not send the `Www-Authenticate` header back to the client. Whenever a client +sends the `X-Omit-Www-Authenticate` HTTP header (with an arbitrary value) to +the server, ArangoDB only sends status code 401, but no `Www-Authenticate` +header. This allows clients to implement credentials handling and bypassing +the browser's built-in dialog. + +## HTTP Basic Authentication + +ArangoDB supports basic authentication with a user name and password. The name +and the password of an ArangoDB user account need to be separated by a colon and +the entire string needs to be Base64-encoded. The resulting value can be used +in the `Authorization` header of an HTTP request, indicating that the +authorization scheme is `Basic`. + +For example, if the name is `user` and the password `pass`, the temporary string +that needs to be encoded is `user:pass`. The Base64-encoded value is +`dXNlcjpwYXNz` (e.g. using the `btoa()` JavaScript function in a browser). +The HTTP request header to authenticate is a follows: + +``` +Authorization: Basic dXNlcjpwYXNz +``` + +If you use a tool like cURL, you can manually specify this header as follows: + +``` +curl -H 'Authorization: Basic dXNlcjpwYXNz' ... +``` + +However, cURL can also take care of the authentication and specifically the +encoding of the credentials for you: + +``` +curl -u user:pass ... +``` + +{{< security >}} +Encoding credentials using the Base64 scheme does not encrypt them. +Base64-encoded strings can easily be decoded. Be careful not to expose the +encoded credentials by accident. It is recommended to secure connections with +ArangoDB servers using TLS for encryption in transit. +{{< /security >}} + +## Bearer Token Authentication + +ArangoDB uses a standard JWT-based authentication method. +To authenticate via JWT, you must first obtain a JWT token with a signature +generated via HMAC with SHA-256. The secret may either be set using +`--server.jwt-secret` or it is randomly generated on server startup. + +For more information on JWT please consult RFC7519 and [jwt.io](https://jwt.io). + +### JWT user tokens + +To authenticate with a specific user account, you need to supply a JWT token +containing the `preferred_username` field with the username. +You can either let ArangoDB generate this token for you via an API call +or you can generate it yourself (only if you know the JWT secret). + +ArangoDB offers a RESTful API to generate user tokens for you if you know the +username and password. To do so, send a POST request to this endpoint: + +``` +/_open/auth +``` + +The request body needs to contain the `username` and `password` JSON-encoded like so: + +```json +{ + "username": "root", + "password": "rootPassword" +} +``` + +On success, the endpoint returns a **200 OK** and an answer containing +the JWT in a JSON-encoded object like so: + +```json +{ "jwt": "eyJhbGciOiJIUzI1NiI..x6EfI" } +``` + +This JWT should then be used within the Authorization HTTP header in subsequent +requests: + +``` +Authorization: Bearer eyJhbGciOiJIUzI1NiI..x6EfI +``` + +{{< security >}} +The JWT token expires after **one hour** by default and needs to be updated. +You can configure the token lifetime via the `--server.session-timeout` +startup option. +{{< /security >}} + +You can find the expiration date of the JWT token in the `exp` field, encoded as +Unix timestamp in seconds. +Please note that all JWT tokens must contain the `iss` field with string value +`arangodb`. As an example the decoded JWT body would look like this: + +```json +{ + "exp": 1540381557, + "iat": 1537789.55727901, + "iss": "arangodb", + "preferred_username": "root" +} +``` + +#### Create a JWT session token + +```openapi +paths: + /_open/auth: + # Independent of database + post: + operationId: createSessionToken + description: | + Obtain a JSON Web Token (JWT) from the credentials of an ArangoDB user account. + You can use the JWT in the `Authorization` HTTP header as a `Bearer` token to + authenticate requests. + + The lifetime for the token is controlled by the `--server.session-timeout` + startup option. + requestBody: + content: + application/json: + schema: + type: object + required: + - username + - password + properties: + username: + description: | + The name of an ArangoDB user. + type: string + password: + description: | + The password of the ArangoDB user. + type: string + responses: + '200': + description: | + Successfully created a session token. + content: + application/json: + schema: + type: object + required: + - jwt + properties: + jwt: + description: | + The encoded JWT session token. + type: string + '400': + description: | + An HTTP `400 Bad Request` status code is returned if the request misses required + attributes or if it is otherwise malformed. + '401': + description: | + An HTTP `401 Unauthorized` status code is returned if the user credentials are + incorrect. + '404': + description: | + An HTTP `404 Not Found` status code is returned if the server has authentication + disabled and the endpoint is thus not available. + tags: + - Authentication +``` + +### JWT superuser tokens + +To access specific internal APIs as well as Agency and DB-Server instances a +token generated via `POST /_open/auth` is not good enough. For these special +APIs, you need to generate a special JWT token which grants superuser +access. Note that using superuser access for normal database operations is +**not advised**. + +{{< security >}} +It is only possible to generate this JWT token with the knowledge of the +JWT secret. +{{< /security >}} + +For your convenience it is possible to generate this token via the +[ArangoDB starter CLI](../../components/tools/arangodb-starter/security.md#using-authentication-tokens). + +Should you wish to generate the JWT token yourself with a tool of your choice, +you need to include the correct body. The body must contain the `iss` field +with string value `arangodb` and the `server_id` field with an arbitrary string +identifier: + +```json +{ + "exp": 1537900279, + "iat": 1537800279, + "iss": "arangodb", + "server_id": "myclient" +} +``` + +For example to generate a token via the +[jwtgen tool](https://www.npmjs.com/package/jwtgen) +(note the lifetime of one hour): + +``` +jwtgen -s <my-secret> -e 3600 -v -a "HS256" -c 'iss=arangodb' -c 'server_id=myclient' +curl -v -H "Authorization: bearer $(jwtgen -s <my-secret> -e 3600 -a "HS256" -c 'iss=arangodb' -c 'server_id=myclient')" http://<database-ip>:8529/_api/version +``` + +## Hot-reload JWT secrets + +{{< tag "ArangoDB Enterprise Edition" >}} + +To reload the JWT secrets of a local arangod process without a restart, you +may use the following RESTful API. A `POST` request reloads the secret, a +`GET` request may be used to load information about the currently used secrets. + +### Get information about the loaded JWT secrets + +```openapi +paths: + /_db/{database-name}/_admin/server/jwt: + get: + operationId: getServerJwtSecrets + description: | + Get information about the currently loaded secrets. + + To utilize the API a superuser JWT token is necessary, otherwise the response + will be _HTTP 403 Forbidden_. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + responses: + '200': + description: | + Successfully retrieved the JWT secret information. + content: + application/json: + schema: + description: | + The reply with the JWT secrets information. + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The result object. + type: object + required: + - active + - passive + properties: + active: + description: | + An object with the SHA-256 hash of the active secret. + type: object + passive: + description: | + An array of objects with the SHA-256 hashes of the passive secrets. + + Can be empty. + type: array + items: + type: object + '403': + description: | + if the request was not authenticated as a user with sufficient rights + tags: + - Authentication +``` + +### Hot-reload the JWT secret(s) from disk + +```openapi +paths: + /_admin/server/jwt: + # Independent of database (superuser has access to all databases that exist) + post: + operationId: reloadServerJwtSecrets + description: | + Sending a request without payload to this endpoint reloads the JWT secret(s) + from disk. Only the files specified via the arangod startup option + `--server.jwt-secret-keyfile` or `--server.jwt-secret-folder` are used. + It is not possible to change the locations where files are loaded from + without restarting the process. + + To utilize the API a superuser JWT token is necessary, otherwise the response + will be _HTTP 403 Forbidden_. + responses: + '200': + description: | + Successfully reloaded the JWT secrets. + content: + application/json: + schema: + description: | + The reply with the JWT secrets information. + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The result object. + type: object + required: + - active + - passive + properties: + active: + description: | + An object with the SHA-256 hash of the active secret. + type: object + passive: + description: | + An array of objects with the SHA-256 hashes of the passive secrets. + + Can be empty. + type: array + items: + type: object + '403': + description: | + if the request was not authenticated as a user with sufficient rights + tags: + - Authentication +``` + +Example result: + +```json +{ + "error": false, + "code": 200, + "result": { + "active": { + "sha256": "c6c1021286dfe870b7050f9e704df93c7f1de3c89dbdadc3fb30394bebd81e97" + }, + "passive": [ + { + "sha256": "6d2fe32dc4249ef7e7359c6d874fffbbf335e832e49a2681236e1b686af78794" + }, + { + "sha256": "448a28491967ea4f7599f454af261a685153c27a7d5748456022565947820fb9" + }, + { + "sha256": "6745d49264bdfc2e89d4333fe88f0fce94615fdbdb8990e95b5fda0583336da8" + } + ] + } +} +``` \ No newline at end of file diff --git a/site/content/arangodb/oem/develop/http-api/batch-requests.md b/site/content/arangodb/oem/develop/http-api/batch-requests.md new file mode 100644 index 0000000000..71fbedcc7d --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/batch-requests.md @@ -0,0 +1,385 @@ +--- +title: HTTP interface for batch requests +menuTitle: Batch Requests +weight: 90 +description: >- + The HTTP API for batch requests lets you send multiple operations in a single + HTTP request +--- +{{< warning >}} +The batch request API is deprecated from version 3.8.0 on. +This endpoint should no longer be used. +To send multiple documents at once to an ArangoDB instance, please use the +[HTTP interface for documents](documents.md#multiple-document-operations) +that can insert, update, replace, or remove arrays of documents. +{{< /warning >}} + +Clients normally send individual operations to ArangoDB in individual +HTTP requests. This is straightforward and simple, but has the +disadvantage that the network overhead can be significant if many +small requests are issued in a row. + +To mitigate this problem, ArangoDB offers a batch request API that +clients can use to send multiple operations in one batch to +ArangoDB. This method is especially useful when the client has to send +many HTTP requests with a small body/payload and the individual +request results do not depend on each other. + +Clients can use ArangoDB's batch API by issuing a multipart HTTP POST +request to the URL */_api/batch* handler. The handler will accept the +request if the Content-type is *multipart/form-data* and a boundary +string is specified. ArangoDB will then decompose the batch request +into its individual parts using this boundary. This also means that +the boundary string itself must not be contained in any of the parts. +When ArangoDB has split the multipart request into its individual +parts, it will process all parts sequentially as if it were a +standalone request. When all parts are processed, ArangoDB will +generate a multipart HTTP response that contains one part for each +part operation result. For example, if you send a multipart request +with 5 parts, ArangoDB will send back a multipart response with 5 +parts as well. + +The server expects each part message to start with exactly the +following "header": + +``` +Content-type: application/x-arango-batchpart +``` + +You can optionally specify a *Content-Id* "header" to uniquely +identify each part message. The server will return the *Content-Id* in +its response if it is specified. Otherwise, the server will not send a +Content-Id "header" back. The server will not validate the uniqueness +of the Content-Id. After the mandatory *Content-type* and the +optional *Content-Id* header, two Windows line breaks +(i.e. *\r\n\r\n*) must follow. Any deviation of this structure +might lead to the part being rejected or incorrectly interpreted. The +part request payload, formatted as a regular HTTP request, must follow +the two Windows line breaks literal directly. + +Note that the literal *Content-type: application/x-arango-batchpart* +technically is the header of the MIME part, and the HTTP request +(including its headers) is the body part of the MIME part. + +An actual part request should start with the HTTP method, the called +URL, and the HTTP protocol version as usual, followed by arbitrary +HTTP headers. Its body should follow after the usual *\r\n\r\n* +literal. Part requests are therefore regular HTTP requests, only +embedded inside a multipart message. + +The following example will send a batch with 3 individual document +creation operations. The boundary used in this example is +*XXXsubpartXXX*. + +*Examples* + +```js +> curl -X POST --data-binary @- --header "Content-type: multipart/form-data; boundary=XXXsubpartXXX" http://localhost:8529/_api/batch +--XXXsubpartXXX +Content-type: application/x-arango-batchpart +Content-Id: 1 + +POST /_api/document?collection=xyz HTTP/1.1 + +{"a":1,"b":2,"c":3} +--XXXsubpartXXX +Content-type: application/x-arango-batchpart +Content-Id: 2 + +POST /_api/document?collection=xyz HTTP/1.1 + +{"a":1,"b":2,"c":3,"d":4} +--XXXsubpartXXX +Content-type: application/x-arango-batchpart +Content-Id: 3 + +POST /_api/document?collection=xyz HTTP/1.1 + +{"a":1,"b":2,"c":3,"d":4,"e":5} +--XXXsubpartXXX-- +``` + +The server will then respond with one multipart message, containing +the overall status and the individual results for the part +operations. The overall status should be 200 except there was an error +while inspecting and processing the multipart message. The overall +status therefore does not indicate the success of each part operation, +but only indicates whether the multipart message could be handled +successfully. + +Each part operation will return its own status value. As the part +operation results are regular HTTP responses (just included in one +multipart response), the part operation status is returned as a HTTP +status code. The status codes of the part operations are exactly the +same as if you called the individual operations standalone. Each part +operation might also return arbitrary HTTP headers and a body/payload: + +*Examples* + +```js +HTTP/1.1 200 OK +Connection: Keep-Alive +Content-type: multipart/form-data; boundary=XXXsubpartXXX +Content-length: 1055 + +--XXXsubpartXXX +Content-type: application/x-arango-batchpart +Content-Id: 1 + +HTTP/1.1 202 Accepted +Content-type: application/json; charset=utf-8 +ETag: "9514299" +Content-length: 53 + +{"error":false,"_id":"xyz/9514299","_key":"9514299","_rev":"9514299"} +--XXXsubpartXXX +Content-type: application/x-arango-batchpart +Content-Id: 2 + +HTTP/1.1 202 Accepted +Content-type: application/json; charset=utf-8 +ETag: "9579835" +Content-length: 53 + +{"error":false,"_id":"xyz/9579835","_key":"9579835","_rev":"9579835"} +--XXXsubpartXXX +Content-type: application/x-arango-batchpart +Content-Id: 3 + +HTTP/1.1 202 Accepted +Content-type: application/json; charset=utf-8 +ETag: "9645371" +Content-length: 53 + +{"error":false,"_id":"xyz/9645371","_key":"9645371","_rev":"9645371"} +--XXXsubpartXXX-- +``` + +In the above example, the server returned an overall status code of +200, and each part response contains its own status value (202 in the +example): + +When constructing the multipart HTTP response, the server will use the +same boundary that the client supplied. If any of the part responses +has a status code of 400 or greater, the server will also return an +HTTP header *x-arango-errors* containing the overall number of part +requests that produced errors: + +*Examples* + +```js +> curl -X POST --data-binary @- --header "Content-type: multipart/form-data; boundary=XXXsubpartXXX" http://localhost:8529/_api/batch +--XXXsubpartXXX +Content-type: application/x-arango-batchpart + +POST /_api/document?collection=nonexisting + +{"a":1,"b":2,"c":3} +--XXXsubpartXXX +Content-type: application/x-arango-batchpart + +POST /_api/document?collection=xyz + +{"a":1,"b":2,"c":3,"d":4} +--XXXsubpartXXX-- +``` + +In this example, the overall response code is 200, but as some of the +part request failed (with status code 404), the *x-arango-errors* +header of the overall response is *1*: + +*Examples* + +```js +HTTP/1.1 200 OK +x-arango-errors: 1 +Content-type: multipart/form-data; boundary=XXXsubpartXXX +Content-length: 711 + +--XXXsubpartXXX +Content-type: application/x-arango-batchpart + +HTTP/1.1 404 Not Found +Content-type: application/json; charset=utf-8 +Content-length: 111 + +{"error":true,"code":404,"errorNum":1203,"errorMessage":"collection \/_api\/collection\/nonexisting not found"} +--XXXsubpartXXX +Content-type: application/x-arango-batchpart + +HTTP/1.1 202 Accepted +Content-type: application/json; charset=utf-8 +ETag: "9841979" +Content-length: 53 + +{"error":false,"_id":"xyz/9841979","_key":"9841979","_rev":"9841979"} +--XXXsubpartXXX-- +``` + +Please note that the database used for all part operations of a batch +request is determined by scanning the original URL (the URL that contains +*/_api/batch*). It is not possible to override the +[database name](../../concepts/data-structure/databases.md#database-names) in +part operations of a batch. When doing so, any other database name used +in a batch part will be ignored. + +### Execute a batch request + +```openapi +paths: + /_db/{database-name}/_api/batch: + post: + operationId: executeBatchRequest + description: | + Executes a batch request. A batch request can contain any number of + other requests that can be sent to ArangoDB in isolation. The benefit of + using batch requests is that batching requests requires less client/server + roundtrips than when sending isolated requests. + + All parts of a batch request are executed serially on the server. The + server will return the results of all parts in a single response when all + parts are finished. + + Technically, a batch request is a multipart HTTP request, with + content-type `multipart/form-data`. A batch request consists of an + envelope and the individual batch part actions. Batch part actions + are "regular" HTTP requests, including full header and an optional body. + Multiple batch parts are separated by a boundary identifier. The + boundary identifier is declared in the batch envelope. The MIME content-type + for each individual batch part must be `application/x-arango-batchpart`. + + Please note that when constructing the individual batch parts, you must + use CRLF (`\r\n`) as the line terminator as in regular HTTP messages. + + The response sent by the server will be an `HTTP 200` response, with an + optional error summary header `x-arango-errors`. This header contains the + number of batch part operations that failed with an HTTP error code of at + least 400. This header is only present in the response if the number of + errors is greater than zero. + + The response sent by the server is a multipart response, too. It contains + the individual HTTP responses for all batch parts, including the full HTTP + result header (with status code and other potential headers) and an + optional result body. The individual batch parts in the result are + separated using the same boundary value as specified in the request. + + The order of batch parts in the response will be the same as in the + original client request. Client can additionally use the `Content-Id` + MIME header in a batch part to define an individual id for each batch part. + The server will return this id is the batch part responses, too. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + 'text/plain; charset=utf-8': + schema: + description: | + The multipart batch request, consisting of the envelope and the individual + batch parts. + responses: + '200': + description: | + is returned if the batch was received successfully. HTTP 200 is returned + even if one or multiple batch part actions failed. + '400': + description: | + is returned if the batch envelope is malformed or incorrectly formatted. + This code will also be returned if the content-type of the overall batch + request or the individual MIME parts is not as expected. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Batch Requests +``` + +**Examples** + +```curl +--- +description: |- + Sending a batch request with five batch parts: + + - GET /_api/version + - DELETE /_api/collection/products + - POST /_api/collection/products + - GET /_api/collection/products/figures + - DELETE /_api/collection/products + + The boundary (`SomeBoundaryValue`) is passed to the server in the HTTP + `Content-Type` HTTP header. + + The server response is formatted for readability. The `↩` character denotes + the original line breaks. +name: RestBatchMultipartHeader +--- +var parts = [ + "Content-Type: application/x-arango-batchpart\r\n" + + "Content-Id: myId1\r\n\r\n" + + "GET /_api/version HTTP/1.1\r\n", + + "Content-Type: application/x-arango-batchpart\r\n" + + "Content-Id: myId2\r\n\r\n" + + "DELETE /_api/collection/products HTTP/1.1\r\n", + + "Content-Type: application/x-arango-batchpart\r\n" + + "Content-Id: someId\r\n\r\n" + + "POST /_api/collection/products HTTP/1.1\r\n\r\n" + + "{\"name\": \"products\" }\r\n", + + "Content-Type: application/x-arango-batchpart\r\n" + + "Content-Id: nextId\r\n\r\n" + + "GET /_api/collection/products/figures HTTP/1.1\r\n", + + "Content-Type: application/x-arango-batchpart\r\n" + + "Content-Id: otherId\r\n\r\n" + + "DELETE /_api/collection/products HTTP/1.1\r\n" +]; +var boundary = "SomeBoundaryValue"; +var headers = { "Content-Type" : "multipart/form-data; boundary=" + boundary }; +var body = "--" + boundary + "\r\n" + + parts.join("\r\n" + "--" + boundary + "\r\n") + + "--" + boundary + "--\r\n"; + +var response = logCurlRequest('POST', '/_api/batch', body, headers); + +assert(response.code === 200); + +logPlainResponse(response); +``` + +```curl +--- +description: |- + Sending a batch request, setting the boundary implicitly. The server tries + to find the boundary at the beginning of the request body in this case. + + The server response is formatted for readability. The `↩` character denotes + the original line breaks. +name: RestBatchImplicitBoundary +--- +var parts = [ + "Content-Type: application/x-arango-batchpart\r\n\r\n" + + "DELETE /_api/collection/nonexistent1 HTTP/1.1\r\n", + "Content-Type: application/x-arango-batchpart\r\n\r\n" + + "DELETE _api/collection/nonexistent2 HTTP/1.1\r\n" +]; +var boundary = "SomeBoundaryValue"; +var body = "--" + boundary + "\r\n" + + parts.join("\r\n" + "--" + boundary + "\r\n") + + "--" + boundary + "--\r\n"; + +var response = logCurlRequest('POST', '/_api/batch', body); + +assert(response.code === 200); +assert(response.headers['x-arango-errors'] == 2); + +logPlainResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/cluster.md b/site/content/arangodb/oem/develop/http-api/cluster.md new file mode 100644 index 0000000000..5e1e3f472f --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/cluster.md @@ -0,0 +1,1563 @@ +--- +title: HTTP interface for clusters +menuTitle: Cluster +weight: 115 +description: >- + The cluster-specific endpoints let you get information about individual + cluster nodes and the cluster as a whole, as well as monitor and administrate + cluster deployments +--- +## Monitoring + +The permissions required to use the `/_admin/cluster/*` endpoints depends on the +setting of the [`--cluster.api-jwt-policy` startup option](../../components/arangodb-server/options.md#--clusterapi-jwt-policy). + +### Get the statistics of a DB-Server + +```openapi +paths: + /_admin/cluster/statistics: + get: + operationId: getClusterStatistics + description: | + Queries the statistics of the given DB-Server + parameters: + - name: DBserver + in: query + required: true + description: | + The ID of a DB-Server. + schema: + type: string + responses: + '200': + description: | + is returned when everything went well. + '400': + description: | + The `DBserver` parameter was not specified or is not the ID of a DB-Server. + '403': + description: | + The specified server is not a DB-Server. + tags: + - Cluster +``` + +### Get the cluster health + +```openapi +paths: + /_admin/cluster/health: + get: + operationId: getClusterHealth + description: | + Queries the health of the cluster as assessed by the supervision (Agency) for + monitoring purposes. The response is a JSON object, containing the standard + `code`, `error`, `errorNum`, and `errorMessage` fields as appropriate. + The endpoint-specific fields are as follows: + + - `ClusterId`: A UUID string identifying the cluster + - `Health`: An object containing a descriptive sub-object for each node in the cluster. + - `<nodeID>`: Each entry in `Health` will be keyed by the node ID and contain the following attributes: + - `Endpoint`: A string representing the network endpoint of the server. + - `Role`: The role the server plays. Possible values are `"AGENT"`, `"COORDINATOR"`, and `"DBSERVER"`. + - `CanBeDeleted`: Boolean representing whether the node can safely be removed from the cluster. + - `Version`: Version String of ArangoDB used by that node. + - `Engine`: Storage Engine used by that node. + - `Status`: A string indicating the health of the node as assessed by the supervision (Agency). This should be considered primary source of truth for Coordinator and DB-Servers node health. If the node is responding normally to requests, it is `"GOOD"`. If it has missed one heartbeat, it is `"BAD"`. If it has been declared failed by the supervision, which occurs after missing heartbeats for about 15 seconds, it will be marked `"FAILED"`. + + Additionally it will also have the following attributes for: + + **Coordinators** and **DB-Servers** + - `SyncStatus`: The last sync status reported by the node. This value is primarily used to determine the value of `Status`. Possible values include `"UNKNOWN"`, `"UNDEFINED"`, `"STARTUP"`, `"STOPPING"`, `"STOPPED"`, `"SERVING"`, `"SHUTDOWN"`. + - `LastAckedTime`: ISO 8601 timestamp specifying the last heartbeat received. + - `ShortName`: A string representing the shortname of the server, e.g. `"Coordinator0001"`. + - `Timestamp`: ISO 8601 timestamp specifying the last heartbeat received. (deprecated) + - `Host`: An optional string, specifying the host machine if known. + + **Coordinators** only + - `AdvertisedEndpoint`: A string representing the advertised endpoint, if set. (e.g. external IP address or load balancer, optional) + + **Agents** + - `Leader`: ID of the Agent this node regards as leader. + - `Leading`: Whether this Agent is the leader (true) or not (false). + - `LastAckedTime`: Time since last `acked` in seconds. + responses: + '200': + description: | + is returned when everything went well. + tags: + - Cluster +``` + +## Endpoints + +### List all Coordinator endpoints + +```openapi +paths: + /_api/cluster/endpoints: + get: + operationId: listClusterEndpoints + description: | + Returns an object with an attribute `endpoints`, which contains an + array of objects, which each have the attribute `endpoint`, whose value + is a string with the endpoint description. There is an entry for each + Coordinator in the cluster. This method only works on Coordinators in + cluster mode. In case of an error the `error` attribute is set to + `true`. + responses: + '200': + description: | + is returned when everything went well. + content: + application/json: + schema: + type: object + required: + - error + - code + - endpoints + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 200 + endpoints: + description: | + A list of active cluster endpoints. + type: array + items: + type: object + required: + - endpoint + properties: + endpoint: + description: | + The bind of the Coordinator, like `tcp://[::1]:8530` + type: string + '501': + description: | + server is not a Coordinator or method was not GET. + tags: + - Cluster +``` + +## Cluster node information + +### Get the server ID + +```openapi +paths: + /_admin/server/id: + get: + operationId: getServerId + description: | + Returns the ID of a server in a cluster. The request will fail if the + server is not running in cluster mode. + responses: + '200': + description: | + Is returned when the server is running in cluster mode. + '500': + description: | + Is returned when the server is not running in cluster mode. + tags: + - Cluster +``` + +### Get the server role + +```openapi +paths: + /_admin/server/role: + get: + operationId: getServerRole + description: | + Returns the role of a server in a cluster. + The server role is returned in the `role` attribute of the result. + responses: + '200': + description: | + Is returned in all cases. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - role + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + role: + description: | + The server role. + - `SINGLE`: the server is a standalone server without clustering + - `COORDINATOR`: the server is a Coordinator in a cluster + - `PRIMARY`: the server is a DB-Server in a cluster + - `SECONDARY`: this role is not used anymore + - `AGENT`: the server is an Agency node in a cluster + - `UNDEFINED`: in a cluster, this is returned if the server role cannot be + determined. + type: string + enum: [SINGLE, COORDINATOR, PRIMARY, SECONDARY, AGENT, UNDEFINED] + tags: + - Cluster +``` + +## Maintenance + +### Set the cluster maintenance mode + +```openapi +paths: + /_admin/cluster/maintenance: + put: + operationId: setClusterMaintenance + description: | + Enable or disable the cluster supervision (Agency) maintenance mode. + + This endpoint allows you to temporarily enable the supervision maintenance mode. + Please be aware that no automatic failovers of any kind will take place + while the maintenance mode is enabled. The cluster supervision reactivates + itself automatically at some point after disabling it. + requestBody: + content: + application/json: + schema: + description: | + The mode to set for the cluster supervision. + + Possible values (always lowercase and in double quotes): + - `"on"`: Enable the maintenance mode for 60 minutes, i.e. the + supervision maintenance will reactivate itself after one hour. + - `"off"`: Disable the maintenance mode. + - `"<number>"`: Enable the maintenance mode for a different + duration (in seconds) than the default 60 minutes. For example, + `"7200"` enables the maintenance mode for 7200 seconds (2 hours). + type: string + example: "on" + responses: + '200': + description: | + is returned when everything went well. + '400': + description: | + if the request contained an invalid body + '501': + description: | + if the request was sent to a node other than a Coordinator or single-server + '504': + description: | + if the request timed out while enabling the maintenance mode + tags: + - Cluster +``` + +### Get the maintenance status of a DB-Server + +```openapi +paths: + /_admin/cluster/maintenance/{DB-Server-ID}: + get: + operationId: getDbserverMaintenance + description: | + Check whether the specified DB-Server is in maintenance mode and until when. + parameters: + - name: DB-Server-ID + in: path + required: true + description: | + The ID of a DB-Server. + schema: + type: string + responses: + '200': + description: | + The request was successful. + content: + application/json: + schema: + type: object + required: + - error + - code + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The result object with the status. This attribute is omitted if the DB-Server + is in normal mode. + type: object + required: + - Mode + - Until + properties: + Mode: + description: | + The mode of the DB-Server. The value is `"maintenance"`. + type: string + Until: + description: | + Until what date and time the maintenance mode currently lasts, in the + ISO 8601 date/time format. + type: string + '400': + description: | + if the request contained an invalid body + '412': + description: | + if the request was sent to an Agent node + '504': + description: | + if the request timed out while enabling the maintenance mode + tags: + - Cluster +``` + +### Set the maintenance status of a DB-Server + +```openapi +paths: + /_admin/cluster/maintenance/{DB-Server-ID}: + put: + operationId: setDbserverMaintenance + description: | + Enable or disable the maintenance mode of a DB-Server. + + For rolling upgrades or rolling restarts, DB-Servers can be put into + maintenance mode, so that no attempts are made to re-distribute the data in a + cluster for such planned events. DB-Servers in maintenance mode are not + considered viable failover targets because they are likely restarted soon. + parameters: + - name: DB-Server-ID + in: path + required: true + description: | + The ID of a DB-Server. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - mode + properties: + mode: + description: | + The mode to set for the DB-Server. + type: string + enum: [maintenance, normal] + timeout: + description: | + After how many seconds the maintenance mode shall automatically end. + You can send another request when the DB-Server is already in maintenance mode + to extend the timeout. + type: integer + default: 3600 + responses: + '200': + description: | + The request was successful. + content: + application/json: + schema: + type: object + required: + - error + - code + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The status code. `200` in this case. + type: integer + '400': + description: | + if the request contained an invalid body + '412': + description: | + if the request was sent to an Agency node + '504': + description: | + if the request timed out while enabling the maintenance mode + tags: + - Cluster +``` + +## Rebalance + +As of version 3.10, ArangoDB has built-in capabilities to rebalance the +distribution of shards. This might become necessary since imbalances +can lead to uneven disk usage across the DBServers (data +unbalance) or to uneven load distribution across the DBServers +(leader imbalance). + +If the data is distributed relatively evenly across the DBServers, then +the leader imbalance can usually be adjusted relatively cheaply, since +you only have to transfer leadership for a number of shards to a +different replica, which already has the data. This is not true in all +cases, but as a rule of thumb it is true. + +If, however, data needs to be moved between DBServers, then this is a +costly and potentially lengthy operation. This is inevitable, but it has +been made in this way so that this operation is done in the background and +does not lead to service interruption. + +Nevertheless, data movement requires I/O, CPU, and network resources and +thus it always puts an additional load on the cluster. + +Rebalancing shards is a rather complex optimization problem, in +particular if there are many shards in the system. Fortunately, in most +situations it is relatively easy to find operations to make good +progress towards a better state, but "perfection" is hard, and finding +a "cheap" way to get there is even harder. + +The APIs described here try to help with the following approach: There +is an "imbalance score" which is computed on a given shard distribution, which +basically says how "imbalanced" the cluster is. This score involves +leader imbalance as well as data imbalance. Higher score means more +imbalance, the actual numerical value does not have any meaning. + +The `GET` API call can be used to evaluate this score and give back how +imbalanced the cluster currently is. The `POST` API call does the same +and additionally computes a list of shard movements which the system +suggests to lower the imbalance score. A variant of the `POST` API call +can then take this (or another) suggestion and execute it in the +background. For convenience, you can use the `PUT` API call to do all at +once: compute the score, suggest moves, and execute them right away. +Since the execution can take some time, the `GET` API call also +tells you how many of the moves are still outstanding. + +There are three types of moves: + +1. Switch leadership of one shard from the leader to a follower, which + is currently in sync. This is a fast move. +2. Move the data of a leader to a new DBServer and make it the new leader. + This is a slow move, since it needs to copy the data over the network + and then switch the leadership. +3. Move the data of a follower to a new DBServer and make it a new + follower, then drop the data on the previous follower. This is a slow + move, since it needs to copy the data over the network. + +The suggestion engine behind the `POST` and `PUT` API calls has three +switches to activate/deactivate these three types of moves +independently. If a type of move is activated, the engine considers +all possible such moves, if it is deactivated, no such moves are +considered. The three flags are: + +1. `leaderChanges` (default `true`): consider moves of type 1. +2. `moveLeaders` (default `false`): consider moves of type 2. +3. `moveFollowers` (default `false`): consider moves of type 3. + +The engine then enumerates all possible moves of the various types. +The first choice is the one which improves the imbalance +the most. After that move, it reevaluates the imbalance score and +again look for the move which improves the imbalance score the most. +It altogether suggests up to `maximumNumberOfMoves` moves and +then stops. The default value for this maximum is `1000` and it is capped at +`5000` to avoid overly long optimization computations. +It is conceivable that for large clusters, `1000` or even `5000` might not be +enough to achieve a full balancing. In such cases, you simply have to +repeat the API calls potentially multiple times. + +**Other considerations** + +First, in the case of smart graphs or one shard databases, not all shards can +be moved freely. Rather, some shards are "coupled" and can only move +their place in the cluster or even their leadership together. This +severely limits the possibilities of shard movement and sometimes makes a +good balance impossible. A prominent example here is a single one shard +database in the cluster. In this case, **all** leaders **have to** reside +on the same server, so no good leader distribution is possible at all. + +Secondly, the current implementation does not take actual shard sizes +into account. It essentially works on the number of shards and tries +to distribute the numbers evenly. It computes weights on the grounds of +how many shards are "coupled" together, but it does not take actual data +size into account. This means that it is possible that we get a "good" +data distribution w.r.t. number of shards, but not with respect to their +disk size usage. + +Thirdly, the current implementation does not take compute load on +different collections and shards into account. Therefore, it is possible +that we end up with a shard distribution which distributes the +**leader numbers** evenly across the cluster, even though the actual compute +load is then unevenly distributed, since some collections/shard simply are +hit by more queries than others. + +**How to use the rebalancing API** + +By far, the easiest way to rebalance a cluster is to simply call the +`PUT` variant of the API, which analyzes the situation, comes up with a +plan to balance things out, and directly schedules it. To rebalance +leaders, you can use `curl` like this: + +``` +curl -X PUT https://<endpoint>:<port>/_admin/cluster/rebalance -d '{"version":1}' --user root:<rootpassword> +``` + +You need admin rights, so you should use the user `root` or another user +with write permissions on the `_system` database. Alternatively, you can +use a header with a valid JWT token (for superuser access). + +{{< info >}} +Note that this API call only triggers the rebalancing operation, the API +call returns before the actual rebalancing is finished! +{{< /info >}} + +Since the default value for `leaderChanges` is `true` and for `moveLeaders` +and `moveFollowers` is `false`, this **only** schedules cheap leader +changes. So it can address leader imbalance, but not data imbalance. + +You can monitor progress with this command: + +``` +curl https://<endpoint>:<port>/_admin/cluster/rebalance --user root:<rootpassword> +``` + +The resulting object looks roughly like this: + +```json +{ + "error": false, + "code": 200, + "result": { + "leader": { + "weightUsed": [ + 51, + 54, + 53 + ], + "targetWeight": [ + 52.666666666666664, + 52.666666666666664, + 52.666666666666664 + ], + "numberShards": [ + 31, + 54, + 21 + ], + ... + "imbalance": 1920000004.6666667 + }, + "shards": { + "sizeUsed": [ + 60817408, + 106954752, + 54525952 + ], + "targetSize": [ + 74099370.66666666, + 74099370.66666666, + 74099370.66666666 + ], + "numberShards": [ + 58, + 102, + 52 + ], + ... + "imbalance": 1639005333138090.8 + }, + "pendingMoveShards": 0, + "todoMoveShards": 0 + } +} +``` + +Of particular relevance are the two attributes `pendingMoveShards` and +`todoMoveShards`. These show how many move operations are still to do +(scheduled, but not begun), and how many are pending (scheduled, +started, but not yet finished). Once these two numbers have reached 0, +the rebalancing operation is finished. + +In the `leader` section you see stats about the distribution of the +leader shards, in the `shards` section you see stats about the +distribution of the data (leader shards and follower shards). In both +sections, we see numbers for `numberShards` and for the current +distribution (`weightUsed` for leaders and `sizeUsed` for shards), as +well as for the target distribution. Finally, the `imbalance` number is +the "imbalance score", its absolute value is not meaningful, but the +smaller the score, the better the balance is. + +If you actually want to allow the system to move data to improve the +data distribution, use this command: + +``` +curl -X PUT https://<endpoint>:<port>/_admin/cluster/rebalance -d '{"version":1, "moveLeaders": true, "moveFollowers": true}' --user root:<rootpassword> +``` + +{{< info >}} +Note that this API call only triggers the rebalancing operation, +the API call returns before the actual rebalancing is finished! +{{< /info >}} + +This operation is monitored with the same `GET` request as above, it is +expected that it takes considerably longer to finish. + +There are a few more knobs to turn in this, but these should usually not +be necessary and are intended only for expert use. + +Note that both these API calls only ever schedules up to 1000 move shard jobs. +For large data sets, you might want to repeat the call after completion. + +### Get the current cluster imbalance + +```openapi +paths: + /_admin/cluster/rebalance: + get: + operationId: getClusterImbalance + description: | + Computes the current cluster imbalance and returns the result. + It additionally shows the amount of ongoing and pending move shard operations. + responses: + '200': + description: | + This API returns HTTP 200. + content: + application/json: + schema: + type: object + required: + - code + - error + - result + - pendingMoveShards + - todoMoveShards + properties: + code: + description: | + The HTTP response status code. + type: integer + example: 200 + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + result: + description: | + The result object. + type: object + required: + - leader + - shards + properties: + leader: + description: | + Information about the leader imbalance. + type: object + required: + - weightUsed + - targetWeight + - numberShards + - leaderDupl + - totalWeight + - imbalance + - totalShards + properties: + weightUsed: + description: | + The weight of leader shards per DB-Server. A leader has a weight of 1 by default + but it is higher if collections can only be moved together because of + `distributeShardsLike`. + type: array + items: + type: integer + targetWeight: + description: | + The ideal weight of leader shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader shards per DB-Server. + type: array + items: + type: integer + leaderDupl: + description: | + The measure of the leader shard distribution. The higher the number, the worse + the distribution. + type: array + items: + type: integer + totalWeight: + description: | + The sum of all weights. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + totalShards: + description: | + The sum of shards, counting leader shards only. + type: integer + shards: + description: | + Information about the shard imbalance. + type: object + required: + - sizeUsed + - targetSize + - numberShards + - totalUsed + - totalShards + - totalShardsFromSystemCollections + - imbalance + properties: + sizeUsed: + description: | + The size of shards per DB-Server. + type: array + items: + type: integer + targetSize: + description: | + The ideal size of shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader and follower shards per DB-Server. + type: array + items: + type: integer + totalUsed: + description: | + The sum of the sizes. + type: integer + totalShards: + description: | + The sum of shards, counting leader and follower shards. + type: integer + totalShardsFromSystemCollections: + description: | + The sum of system collection shards, counting leader shards only. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + pendingMoveShards: + description: | + The number of pending move shard operations. + type: number + todoMoveShards: + description: | + The number of planned move shard operations. + type: number + tags: + - Cluster +``` + +### Compute a set of move shard operations to improve balance + +```openapi +paths: + /_admin/cluster/rebalance: + post: + operationId: computeClusterRebalancePlan + description: | + Compute a set of move shard operations to improve balance. + requestBody: + content: + application/json: + schema: + description: | + The options for the rebalance plan. + type: object + required: + - version + properties: + version: + description: | + Must be set to `1`. + type: number + maximumNumberOfMoves: + description: | + Maximum number of moves to be computed. + type: integer + default: 1000 + leaderChanges: + description: | + Allow leader changes without moving data. + type: boolean + default: true + moveLeaders: + description: | + Allow moving leaders. + type: boolean + default: false + moveFollowers: + description: | + Allow moving followers. + type: boolean + default: false + excludeSystemCollections: + description: | + Ignore system collections in the rebalance plan. + type: boolean + default: false + piFactor: + description: | + A weighting factor that should remain untouched. + + If a collection has more shards than there are DB-Servers, there can be a subtle + form of leader imbalance. Some DB-Servers may be responsible for more shards as + leader than others. The `piFactor` adjusts how much weight such imbalances get + in the overall imbalance score. + type: integer + default: 256e6 + databasesExcluded: + description: | + A list of database names to exclude from the analysis. + type: array + default: [] + items: + type: string + responses: + '200': + description: | + This API returns HTTP 200. + content: + application/json: + schema: + description: | + The rebalance plan. + type: object + required: + - code + - error + - result + properties: + code: + description: | + The HTTP response status code. + type: integer + example: 200 + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + result: + description: | + The result object. + type: object + required: + - imbalanceBefore + - imbalanceAfter + - moves + properties: + imbalanceBefore: + description: | + Imbalance before the suggested move shard operations are applied. + type: object + required: + - leader + - shards + properties: + leader: + description: | + Information about the leader imbalance. + type: object + required: + - weightUsed + - targetWeight + - numberShards + - leaderDupl + - totalWeight + - imbalance + - totalShards + properties: + weightUsed: + description: | + The weight of leader shards per DB-Server. A leader has a weight of 1 by default + but it is higher if collections can only be moved together because of + `distributeShardsLike`. + type: array + items: + type: integer + targetWeight: + description: | + The ideal weight of leader shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader shards per DB-Server. + type: array + items: + type: integer + leaderDupl: + description: | + The measure of the leader shard distribution. The higher the number, the worse + the distribution. + type: array + items: + type: integer + totalWeight: + description: | + The sum of all weights. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + totalShards: + description: | + The sum of shards, counting leader shards only. + type: integer + shards: + description: | + Information about the shard imbalance. + type: object + required: + - sizeUsed + - targetSize + - numberShards + - totalUsed + - totalShards + - totalShardsFromSystemCollections + - imbalance + properties: + sizeUsed: + description: | + The size of shards per DB-Server. + type: array + items: + type: integer + targetSize: + description: | + The ideal size of shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader and follower shards per DB-Server. + type: array + items: + type: integer + totalUsed: + description: | + The sum of the sizes. + type: integer + totalShards: + description: | + The sum of shards, counting leader and follower shards. + type: integer + totalShardsFromSystemCollections: + description: | + The sum of system collection shards, counting leader shards only. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + imbalanceAfter: + description: | + Expected imbalance after the suggested move shard operations are applied. + type: object + required: + - leader + - shards + properties: + leader: + description: | + Information about the leader imbalance. + type: object + required: + - weightUsed + - targetWeight + - numberShards + - leaderDupl + - totalWeight + - imbalance + - totalShards + properties: + weightUsed: + description: | + The weight of leader shards per DB-Server. A leader has a weight of 1 by default + but it is higher if collections can only be moved together because of + `distributeShardsLike`. + type: array + items: + type: integer + targetWeight: + description: | + The ideal weight of leader shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader shards per DB-Server. + type: array + items: + type: integer + leaderDupl: + description: | + The measure of the leader shard distribution. The higher the number, the worse + the distribution. + type: array + items: + type: integer + totalWeight: + description: | + The sum of all weights. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + totalShards: + description: | + The sum of shards, counting leader shards only. + type: integer + shards: + description: | + Information about the shard imbalance. + type: object + required: + - sizeUsed + - targetSize + - numberShards + - totalUsed + - totalShards + - totalShardsFromSystemCollections + - imbalance + properties: + sizeUsed: + description: | + The size of shards per DB-Server. + type: array + items: + type: integer + targetSize: + description: | + The ideal size of shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader and follower shards per DB-Server. + type: array + items: + type: integer + totalUsed: + description: | + The sum of the sizes. + type: integer + totalShards: + description: | + The sum of shards, counting leader and follower shards. + type: integer + totalShardsFromSystemCollections: + description: | + The sum of system collection shards, counting leader shards only. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + moves: + description: | + The suggested move shard operations. + type: array + items: + type: object + required: + - from + - to + - shard + - collection + - isLeader + properties: + from: + description: | + The server name from which to move. + type: string + to: + description: | + The ID of the destination server. + type: string + shard: + description: | + Shard ID of the shard to be moved. + type: string + collection: + description: | + Collection ID of the collection the shard belongs to. + type: number + isLeader: + description: | + True if this is a leader move shard operation. + type: boolean + tags: + - Cluster +``` + +### Execute a set of move shard operations + +```openapi +paths: + /_admin/cluster/rebalance/execute: + post: + operationId: executeClusterRebalancePlan + description: | + Execute the given set of move shard operations. You can use the + `POST /_admin/cluster/rebalance` endpoint to calculate these operations to improve + the balance of shards, leader shards, and follower shards. + requestBody: + content: + application/json: + schema: + type: object + required: + - version + - moves + properties: + version: + description: | + Must be set to `1`. + type: number + moves: + description: | + A set of move shard operations to execute. + type: array + items: + type: object + required: + - from + - to + - shard + - collection + - isLeader + properties: + from: + description: | + The server name from which to move. + type: string + to: + description: | + The ID of the destination server. + type: string + shard: + description: | + Shard ID of the shard to be moved. + type: string + collection: + description: | + Collection ID of the collection the shard belongs to. + type: number + isLeader: + description: | + True if this is a leader move shard operation. + type: boolean + responses: + '200': + description: | + This API returns HTTP 200 if no operations are provided. + '202': + description: | + This API returns HTTP 202 if the operations have been accepted and scheduled for execution. + tags: + - Cluster +``` + +### Compute and execute a set of move shard operations to improve balance + +```openapi +paths: + /_admin/cluster/rebalance: + put: + operationId: startClusterRebalance + description: | + Compute a set of move shard operations to improve balance. + These moves are then immediately executed. + requestBody: + content: + application/json: + schema: + description: | + The options for the rebalancing. + type: object + required: + - version + properties: + version: + description: | + Must be set to `1`. + type: number + maximumNumberOfMoves: + description: | + Maximum number of moves to be computed. + type: integer + default: 1000 + leaderChanges: + description: | + Allow leader changes without moving data. + type: boolean + default: true + moveLeaders: + description: | + Allow moving leaders. + type: boolean + default: false + moveFollowers: + description: | + Allow moving followers. + type: boolean + default: false + excludeSystemCollections: + description: | + Ignore system collections in the rebalance plan. + type: boolean + default: false + piFactor: + description: | + A weighting factor that should remain untouched. + + If a collection has more shards than there are DB-Servers, there can be a subtle + form of leader imbalance. Some DB-Servers may be responsible for more shards as + leader than others. The `piFactor` adjusts how much weight such imbalances get + in the overall imbalance score. + type: integer + default: 256e6 + databasesExcluded: + description: | + A list of database names to exclude from the analysis. + type: array + default: [] + items: + type: string + responses: + '200': + description: | + This API returns HTTP 200. + content: + application/json: + schema: + description: | + The executed move shard operations. + type: object + required: + - code + - error + - result + properties: + code: + description: | + The HTTP response status code. + type: integer + example: 200 + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + result: + description: | + The result object. + type: object + required: + - imbalanceBefore + - imbalanceAfter + - moves + properties: + imbalanceBefore: + description: | + Imbalance before the suggested move shard operations are applied. + type: object + required: + - leader + - shards + properties: + leader: + description: | + Information about the leader imbalance. + type: object + required: + - weightUsed + - targetWeight + - numberShards + - leaderDupl + - totalWeight + - imbalance + - totalShards + properties: + weightUsed: + description: | + The weight of leader shards per DB-Server. A leader has a weight of 1 by default + but it is higher if collections can only be moved together because of + `distributeShardsLike`. + type: array + items: + type: integer + targetWeight: + description: | + The ideal weight of leader shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader shards per DB-Server. + type: array + items: + type: integer + leaderDupl: + description: | + The measure of the leader shard distribution. The higher the number, the worse + the distribution. + type: array + items: + type: integer + totalWeight: + description: | + The sum of all weights. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + totalShards: + description: | + The sum of shards, counting leader shards only. + type: integer + shards: + description: | + Information about the shard imbalance. + type: object + required: + - sizeUsed + - targetSize + - numberShards + - totalUsed + - totalShards + - totalShardsFromSystemCollections + - imbalance + properties: + sizeUsed: + description: | + The size of shards per DB-Server. + type: array + items: + type: integer + targetSize: + description: | + The ideal size of shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader and follower shards per DB-Server. + type: array + items: + type: integer + totalUsed: + description: | + The sum of the sizes. + type: integer + totalShards: + description: | + The sum of shards, counting leader and follower shards. + type: integer + totalShardsFromSystemCollections: + description: | + The sum of system collection shards, counting leader shards only. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + imbalanceAfter: + description: | + Expected imbalance after the suggested move shard operations are applied. + type: object + required: + - leader + - shards + properties: + leader: + description: | + Information about the leader imbalance. + type: object + required: + - weightUsed + - targetWeight + - numberShards + - leaderDupl + - totalWeight + - imbalance + - totalShards + properties: + weightUsed: + description: | + The weight of leader shards per DB-Server. A leader has a weight of 1 by default + but it is higher if collections can only be moved together because of + `distributeShardsLike`. + type: array + items: + type: integer + targetWeight: + description: | + The ideal weight of leader shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader shards per DB-Server. + type: array + items: + type: integer + leaderDupl: + description: | + The measure of the leader shard distribution. The higher the number, the worse + the distribution. + type: array + items: + type: integer + totalWeight: + description: | + The sum of all weights. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + totalShards: + description: | + The sum of shards, counting leader shards only. + type: integer + shards: + description: | + Information about the shard imbalance. + type: object + required: + - sizeUsed + - targetSize + - numberShards + - totalUsed + - totalShards + - totalShardsFromSystemCollections + - imbalance + properties: + sizeUsed: + description: | + The size of shards per DB-Server. + type: array + items: + type: integer + targetSize: + description: | + The ideal size of shards per DB-Server. + type: array + items: + type: integer + numberShards: + description: | + The number of leader and follower shards per DB-Server. + type: array + items: + type: integer + totalUsed: + description: | + The sum of the sizes. + type: integer + totalShards: + description: | + The sum of shards, counting leader and follower shards. + type: integer + totalShardsFromSystemCollections: + description: | + The sum of system collection shards, counting leader shards only. + type: integer + imbalance: + description: | + The measure of the total imbalance. A high value indicates a high imbalance. + type: integer + moves: + description: | + The suggested move shard operations. + type: array + items: + type: object + required: + - from + - to + - shard + - collection + - isLeader + properties: + from: + description: | + The server name from which to move. + type: string + to: + description: | + The ID of the destination server. + type: string + shard: + description: | + Shard ID of the shard to be moved. + type: string + collection: + description: | + Collection ID of the collection the shard belongs to. + type: number + isLeader: + description: | + True if this is a leader move shard operation. + type: boolean + tags: + - Cluster +``` diff --git a/site/content/arangodb/oem/develop/http-api/collections.md b/site/content/arangodb/oem/develop/http-api/collections.md new file mode 100644 index 0000000000..5cbb954377 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/collections.md @@ -0,0 +1,5949 @@ +--- +title: HTTP interface for collections +menuTitle: Collections +weight: 25 +description: >- + The HTTP API for collections lets you create and delete collections, get + information about collections, and modify certain properties of existing + collections +--- +## Addresses of collections + +All collections in ArangoDB have a unique identifier and a unique +name. To access a collection, use the collection name to refer to it: + +``` +http://server:port/_api/collection/<collection-name> +``` + +For example, assume that the collection identifier is `7254820` and +the collection name is `demo`, then the URL of that collection is: + +``` +http://localhost:8529/_api/collection/demo +``` + +## Get information about collections + +### List all collections + +```openapi +paths: + /_db/{database-name}/_api/collection: + get: + operationId: listCollections + description: | + Returns basic information for all collections in the current database, + optionally excluding system collections. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: excludeSystem + in: query + required: false + description: | + Whether system collections should be excluded from the result. + schema: + type: boolean + default: false + responses: + '200': + description: | + The list of collections. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + A list with every item holding basic collection metadata. + type: array + items: + type: object + required: + - id + - name + - status + - type + - isSystem + - globallyUniqueId + properties: + id: + description: | + A unique identifier of the collection (deprecated). + type: string + name: + description: | + The name of the collection. + type: string + example: coll + status: + description: | + The status of the collection. + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Return information about all collections: +name: RestCollectionGetAllCollections +--- +var url = "/_api/collection"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Get the collection information + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}: + get: + operationId: getCollection + description: | + Returns the basic information about a specific collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + responses: + '200': + description: | + The basic information about a collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - id + - name + - status + - type + - isSystem + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + id: + description: | + A unique identifier of the collection (deprecated). + type: string + name: + description: | + The name of the collection. + type: string + example: coll + status: + description: | + The status of the collection. + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '404': + description: | + The specified collection is unknown. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + example: 1203 + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +### Get the properties of a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/properties: + get: + operationId: getCollectionProperties + description: | + Returns all properties of the specified collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + responses: + '200': + description: | + All the collection properties. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `name` attribute is missing or has an invalid value. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestCollectionGetCollectionIdentifier +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: true }); +var url = "/_api/collection/"+ coll._id + "/properties"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using a name: +name: RestCollectionGetCollectionName +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); +var url = "/_api/collection/products/properties"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Get the document count of a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/count: + get: + operationId: getCollectionCount + description: | + Get the number of documents in a collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + All properties of the collection but additionally the document `count`. + content: + application/json: + schema: + type: object + required: + - count + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + count: + description: | + The number of documents currently present in the collection. + type: integer + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter is missing. + '404': + description: | + The collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Requesting the number of documents: +name: RestCollectionGetCollectionCount +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: true }); +for(var i=0;i<100;i++) { + coll.save({"count" : i }); +} +var url = "/_api/collection/"+ coll.name() + "/count"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Get the collection statistics + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/figures: + get: + operationId: getCollectionFigures + description: | + Get the number of documents and additional statistical information + about the collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + - name: details + in: query + required: false + description: | + Setting `details` to `true` will return extended storage engine-specific + details to the figures. The details are intended for debugging ArangoDB itself + and their format is subject to change. By default, `details` is set to `false`, + so no details are returned and the behavior is identical to previous versions + of ArangoDB. + Please note that requesting `details` may cause additional load and thus have + an impact on performance. + schema: + type: boolean + default: false + responses: + '200': + description: | + All properties of the collection but additionally the document `count` + and collection `figures`. + content: + application/json: + schema: + type: object + required: + - count + - figures + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + count: + description: | + The number of documents currently present in the collection. + type: integer + figures: + description: | + The metrics of the collection. + type: object + required: + - indexes + properties: + indexes: + description: | + The coarse index metrics. + type: object + required: + - count + - size + properties: + count: + description: | + The total number of indexes defined for the collection, including the pre-defined + indexes (e.g. primary index). + type: integer + size: + description: | + The total memory allocated for indexes in bytes. + type: integer + documentsSize: + description: | + The approximate on-disk size of the documents in bytes. + type: integer + cacheInUse: + description: | + Whether the document cache is enabled for this collection. + type: boolean + cacheSize: + description: | + The total memory usage of the document cache in bytes. + type: integer + cacheUsage: + description: | + The current data memory usage of the document cache in bytes. + type: integer + cacheLifeTimeHitRate: + description: | + The overall cache hit ratio in percent. In cluster deployments, + it is the sum of percentages of all shards. + + The attribute is only present if `cacheInUse` is `true`. + type: number + cacheWindowedHitRate: + description: | + The cache hit ratio of the past several thousand find + operations in percent. In cluster deployments, + it is the sum of percentages of all shards. + + The attribute is only present if `cacheInUse` is `true`. + type: number + engine: + description: | + Extended, storage-engine specific figures. + Only included if the `details` query parameter is set to `true`. + type: object + properties: + documents: + description: | + The number of documents determined by iterating over all + RocksDB keys in range of the column family and counting them. + type: integer + indexes: + description: | + The detailed index metrics with the number of entries per index. + type: array + items: + type: object + properties: + type: + description: | + The index type. + A `persistent` index is reported as `rocksdb-persistent`. + type: string + id: + description: | + The identifier of the index. + type: integer + count: + description: | + The number of index entries. + type: integer + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier and requesting the figures of the collection: +name: RestCollectionGetCollectionFigures +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn); +coll.save({"test":"hello"}); +require("internal").wal.flush(true, true); +var url = "/_api/collection/"+ coll.name() + "/figures"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: '' +name: RestCollectionGetCollectionFiguresDetails +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn); +coll.save({"test":"hello"}); +require("internal").wal.flush(true, true); +var url = "/_api/collection/"+ coll.name() + "/figures?details=true"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Get the responsible shard for a document + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/responsibleShard: + put: + operationId: getResponsibleShard + description: | + Returns the ID of the shard that is responsible for the given document + (if the document exists) or that would be responsible if such document + existed. + + The request must body must contain a JSON document with at least the + collection's shard key attributes set to some values. + + The response is a JSON object with a `shardId` attribute, which will + contain the ID of the responsible shard. + + {{</* info */>}} + This method is only available in cluster deployments on Coordinators. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The request body must be a JSON object with at least the shard key + attributes set to some values, but it may also be a full document. + type: object + responses: + '200': + description: | + Returns the ID of the responsible shard. + content: + application/json: + schema: + type: object + required: + - error + - code + - shardId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + shardId: + description: | + The ID of the responsible shard + type: string + '400': + description: | + The `collection-name` parameter is missing or not all of the + collection's shard key attributes are present in the input document. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + The method has been called on a single server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestGetResponsibleShardExample +type: cluster +--- +var cn = "testCollection"; +db._drop(cn); +db._create(cn, { numberOfShards: 3, shardKeys: ["_key"] }); + +var body = { _key: "testkey", value: 23 }; +var response = logCurlRequest('PUT', "/_api/collection/" + cn + "/responsibleShard", body); + +assert(response.code === 200); +assert(response.parsedBody.hasOwnProperty("shardId")); + +logJsonResponse(response); +db._drop(cn); +``` + +### Get the shard IDs of a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/shards: + get: + operationId: getCollectionShards + description: | + The response contains a list of the collection's shard IDs. + + If the `details` parameter is set to `true`, it returns an object instead + of a list, with the shard IDs as object attribute keys, and an array with + the responsible servers for each shard mapped to them as attribute values. + The first element of each array is the leader shard. + + {{</* info */>}} + This method is only available in cluster deployments on Coordinators. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + schema: + type: string + - name: details + in: query + required: false + description: | + If set to true, the return value also contains the responsible servers for the collections' shards. + schema: + type: boolean + default: false + responses: + '200': + description: | + All collection properties but additionally the `shards` of the collection. + content: + application/json: + schema: + type: object + required: + - shards + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + shards: + description: | + The type and value depend on the setting of the `details` parameter: + - `false`: An array of the collection shard IDs. + - `true`: An object where the keys are shard IDs and the + values are arrays with the responsible DB-Server names + (shard leader first). + # TODO: polymorphic structural description? Complex to render + #type: [array, object] + #items: + # type: string + # pattern: "^s\\d+$" + #patternProperties: + # "^s\\d+$": + # type: array + # items: + # type: string + # --- or --- + #oneOf: + # - type: array + # items: + # type: string + # pattern: "^s\\d+$" + # - type: object + # patternProperties: + # "^s\\d+$": + # type: array + # items: + # type: string + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + The method has been called on a single server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Retrieves the list of shards: +name: RestGetShards +type: cluster +--- +var cn = "testCollection"; +db._drop(cn); +db._create(cn, { numberOfShards: 3 }); + +var response = logCurlRequest('GET', "/_api/collection/" + cn + "/shards"); + +assert(response.code === 200); +assert(response.parsedBody.hasOwnProperty("shards")); +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Retrieves the list of shards with the responsible servers: +name: RestGetShardsWithDetails +type: cluster +--- +var cn = "testCollection"; +db._drop(cn); +db._create(cn, { numberOfShards: 3 }); + +var response = logCurlRequest('GET', "/_api/collection/" + cn + "/shards?details=true"); + +assert(response.code === 200); +assert(response.parsedBody.hasOwnProperty("shards")); +logJsonResponse(response); +db._drop(cn); +``` + +### Get the collection revision ID + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/revision: + get: + operationId: getCollectionRevision + description: | + The response contains the collection's latest used revision ID. + The revision ID is a server-generated string that clients can use to + check whether data in a collection has changed since the last revision check. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + responses: + '200': + description: | + All collection properties but additionally the `revision` of the collection. + content: + application/json: + schema: + type: object + required: + - revision + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + revision: + description: | + The collection revision ID as a string. + type: string + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Retrieving the revision of a collection +name: RestCollectionGetCollectionRevision +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: false }); +var url = "/_api/collection/"+ coll.name() + "/revision"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Get the collection checksum + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/checksum: + get: + operationId: getCollectionChecksum + description: | + Calculates a checksum of the meta-data (keys and optionally revision ids) and + optionally the document data in the collection. + + The checksum can be used to compare if two collections on different ArangoDB + instances contain the same contents. The current revision of the collection is + returned too so one can make sure the checksums are calculated for the same + state of data. + + By default, the checksum is only calculated on the `_key` system attribute + of the documents contained in the collection. For edge collections, the system + attributes `_from` and `_to` are also included in the calculation. + + By setting the optional query parameter `withRevisions` to `true`, then revision + IDs (`_rev` system attributes) are included in the checksumming. + + By providing the optional query parameter `withData` with a value of `true`, + the user-defined document attributes are included in the calculation, too. + + {{</* info */>}} + Including user-defined attributes will make the checksumming slower. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + - name: withRevisions + in: query + required: false + description: | + Whether to include document revision ids in the checksum calculation. + schema: + type: boolean + default: false + - name: withData + in: query + required: false + description: | + Whether to include document body data in the checksum calculation. + schema: + type: boolean + default: false + responses: + '200': + description: | + The basic information about the collection but additionally the + collection `checksum` and `revision`. + content: + application/json: + schema: + type: object + required: + - checksum + - revision + - error + - code + - id + - name + - status + - type + - isSystem + - globallyUniqueId + properties: + checksum: + description: | + The calculated checksum as a number. + revision: + description: | + The collection revision id as a string. + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + id: + description: | + A unique identifier of the collection (deprecated). + type: string + name: + description: | + The name of the collection. + type: string + example: coll + status: + description: | + The status of the collection. + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + If the `collection-name` placeholder is missing, then a *HTTP 400* is + returned. + '404': + description: | + If the collection is unknown, then a *HTTP 404* + is returned. + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Retrieving the checksum of a collection: +name: RestCollectionGetCollectionChecksum +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn); +coll.save({ foo: "bar" }); +var url = "/_api/collection/" + coll.name() + "/checksum"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Retrieving the checksum of a collection including the collection data, + but not the revisions: +name: RestCollectionGetCollectionChecksumNoRev +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn); +coll.save({ foo: "bar" }); +var url = "/_api/collection/" + coll.name() + "/checksum?withRevisions=false&withData=true"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +## Create and delete collections + +### Create a collection + +```openapi +paths: + /_db/{database-name}/_api/collection: + post: + operationId: createCollection + description: | + Creates a new collection with a given name. The request must contain an + object with the following attributes. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: waitForSyncReplication + in: query + required: false + description: | + The default is `true`, which means the server only reports success back to the + client when all replicas have created the collection. Set it to `false` if you want + faster server responses and don't care about full replication. + schema: + type: boolean + default: true + - name: enforceReplicationFactor + in: query + required: false + description: | + The default is `true`, which means the server checks if there are enough replicas + available at creation time and bail out otherwise. Set it to `false` to disable + this extra check. + schema: + type: boolean + default: true + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + The name of the collection. + type: string + waitForSync: + description: | + If set to `true`, then the data is synchronized to disk before returning from a + document create, update, replace or removal operation. + type: boolean + default: false + isSystem: + description: | + If `true`, create a system collection. In this case, the `collection-name` + should start with an underscore. End-users should normally create non-system + collections only. API implementors may be required to create system + collections in very special occasions, but normally a regular collection will do. + type: boolean + default: false + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + computedValues: + description: | + An optional list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. Can only be a top-level attribute, but you + may return a nested object. Cannot be `_key`, `_id`, `_rev`, `_from`, `_to`, + or a shard key attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + See [Computed Value Expressions](../../concepts/data-structure/documents/computed-values.md#computed-value-expressions) for details. + type: string + overwrite: + description: | + Whether the computed value shall take precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings to define on which write operations the value shall be + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + default: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute shall be set if the expression evaluates to `null`. + You can set the option to `false` to not set (or unset) the target attribute if + the expression returns `null`. + type: boolean + default: true + failOnWarning: + description: | + Whether to let the write operation fail if the expression produces a warning. + type: boolean + default: false + keyOptions: + description: | + additional options for key generation. If specified, then `keyOptions` + should be a JSON object containing the following attributes: + type: object + properties: + type: + description: | + specifies the type of the key generator. The currently available generators are + `traditional`, `autoincrement`, `uuid` and `padded`. + + - The `traditional` key generator generates numerical keys in ascending order. + The sequence of keys is not guaranteed to be gap-free. + + - The `autoincrement` key generator generates numerical keys in ascending order, + the initial offset and the spacing can be configured (**note**: `autoincrement` + is only supported for non-sharded collections). + The sequence of generated keys is not guaranteed to be gap-free, because a new key + will be generated on every document insert attempt, not just for successful + inserts. + + - The `padded` key generator generates keys of a fixed length (16 bytes) in + ascending lexicographical sort order. This is ideal for the RocksDB storage engine, + which will slightly benefit keys that are inserted in lexicographically + ascending order. The key generator can be used in a single-server or cluster. + The sequence of generated keys is not guaranteed to be gap-free. + + - The `uuid` key generator generates universally unique 128 bit keys, which + are stored in hexadecimal human-readable format. This key generator can be used + in a single-server or cluster to generate "seemingly random" keys. The keys + produced by this key generator are not lexicographically sorted. + + Please note that keys are only guaranteed to be truly ascending in single + server deployments and for collections that only have a single shard (that includes + collections in a OneShard database). + The reason is that for collections with more than a single shard, document keys + are generated on Coordinator(s). For collections with a single shard, the document + keys are generated on the leader DB-Server, which has full control over the key + sequence. + type: string + default: traditional + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply own key values in the + `_key` attribute of documents. If set to `false`, then the key generator + is solely responsible for generating keys and an error is raised if you + supply own key values in the `_key` attribute of documents. + + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + default: true + increment: + description: | + The increment value for the `autoincrement` key generator. + Not allowed for other key generator types. + type: integer + default: 1 + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not allowed for other key generator types. + type: integer + default: 0 + type: + description: | + The type of the collection to create. + The following values for `type` are valid: + + - `2`: document collection + - `3`: edge collection + type: integer + default: 2 + cacheEnabled: + description: | + Whether the in-memory hash cache for documents should be enabled for this + collection. Can be controlled globally with the `--cache.size` + startup option. The cache can speed up repeated reads of the same documents via + their document keys. If the same documents are not fetched often or are + modified frequently, then you may disable the cache to avoid the maintenance + costs. + type: boolean + default: false + numberOfShards: + description: | + In a cluster, this value determines the + number of shards to create for the collection. + type: integer + default: 1 + shardKeys: + description: | + In a cluster, this attribute determines + which document attributes are used to determine the target shard for documents. + Documents are sent to shards based on the values of their shard key attributes. + The values of all shard key attributes in a document are hashed, + and the hash value is used to determine the target shard. + + {{</* info */>}} + Values of shard key attributes cannot be changed once set. + {{</* /info */>}} + type: string + default: [ "_key" ] + replicationFactor: + description: | + In a cluster, this attribute determines how many copies + of each shard are kept on different DB-Servers. The value 1 means that only one + copy (no synchronous replication) is kept. A value of k means that k-1 replicas + are kept. For SatelliteCollections, it needs to be the string `"satellite"`, + which matches the replication factor to the number of DB-Servers + (Enterprise Edition only). + + Any two copies reside on different DB-Servers. Replication between them is + synchronous, that is, every write operation to the "leader" copy will be replicated + to all "follower" replicas, before the write operation is reported successful. + + If a server fails, this is detected automatically and one of the servers holding + copies take over, usually without an error being reported. + + Default: The `replicationFactor` defined by the database. + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + Default: If `distributeShardsLike` is set, the default `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + This attribute specifies the name of the sharding strategy to use for + the collection. There are different sharding strategies + to select from when creating a new collection. The selected `shardingStrategy` + value remains fixed for the collection and cannot be changed afterwards. + This is important to make the collection keep its sharding settings and + always find documents already distributed to shards using the same + initial sharding algorithm. + + The available sharding strategies are: + - `community-compat`: default sharding used by ArangoDB + Community Edition before version 3.4 + - `enterprise-compat`: default sharding used by ArangoDB + Enterprise Edition before version 3.4 + - `enterprise-smart-edge-compat`: default sharding used by smart edge + collections in ArangoDB Enterprise Edition before version 3.4 + - `hash`: default sharding used for new collections starting from version 3.4 + (excluding smart edge collections) + - `enterprise-hash-smart-edge`: default sharding used for new + smart edge collections starting from version 3.4 + - `enterprise-hex-smart-vertex`: sharding used for vertex collections of + EnterpriseGraphs + + If no sharding strategy is specified, the default is `hash` for + all normal collections, `enterprise-hash-smart-edge` for all smart edge + collections, and `enterprise-hex-smart-vertex` for EnterpriseGraph + vertex collections (the latter two require the *Enterprise Edition* of ArangoDB). + Manually overriding the sharding strategy does not yet provide a + benefit, but it may later in case other sharding strategies are added. + type: string + distributeShardsLike: + description: | + The name of another collection. If this property is set in a cluster, the + collection copies the `replicationFactor`, `numberOfShards`, `shardingStrategy`, and `writeConcern` + properties from the specified collection (referred to as the _prototype collection_) + and distributes the shards of this collection in the same way as the shards of + the other collection. In an Enterprise Edition cluster, this data co-location is + utilized to optimize queries. + + You need to use the same number of `shardKeys` as the prototype collection, but + you can use different attributes. + + {{</* info */>}} + Using this parameter has consequences for the prototype + collection. It can no longer be dropped, before the sharding-imitating + collections are dropped. Equally, backups and restores of imitating + collections alone generate warnings (which can be overridden) + about a missing sharding prototype. + {{</* /info */>}} + type: string + default: "" + isSmart: + description: | + Whether the collection is for a SmartGraph or EnterpriseGraph + (Enterprise Edition only). This is an internal property. + type: boolean + isDisjoint: + description: | + Whether the collection is for a Disjoint SmartGraph + (Enterprise Edition only). This is an internal property. + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices. + + This feature can only be used in the *Enterprise Edition*. + type: string + smartJoinAttribute: + description: | + In an *Enterprise Edition* cluster, this attribute determines an attribute + of the collection that must contain the shard key value of the referred-to + SmartJoin collection. Additionally, the shard key for a document in this + collection must contain the value of this attribute, followed by a colon, + followed by the actual primary key of the document. + + This feature can only be used in the *Enterprise Edition* and requires the + `distributeShardsLike` attribute of the collection to be set to the name + of another collection. It also requires the `shardKeys` attribute of the + collection to be set to a single shard key attribute, with an additional `:` + at the end. + A further restriction is that whenever documents are stored or updated in the + collection, the value stored in the `smartJoinAttribute` must be a string. + type: string + responses: + '200': + description: | + The collection has been created. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value for the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `name` or another required attribute is missing or an attribute + has an invalid value. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionCreateCollection +--- +var url = "/_api/collection"; +var body = { + name: "testCollectionBasics" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +body = { + name: "testCollectionEdges", + type : 3 +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); +logJsonResponse(response); + +db._flushCache(); +db._drop("testCollectionBasics"); +db._drop("testCollectionEdges"); +``` + +```curl +--- +description: '' +name: RestCollectionCreateKeyopt +--- +var url = "/_api/collection"; +var body = { + name: "testCollectionUsers", + keyOptions : { + type : "autoincrement", + increment : 5, + allowUserKeys : true + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); +logJsonResponse(response); + +db._flushCache(); +db._drop("testCollectionUsers"); +``` + +### Drop a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}: + delete: + operationId: deleteCollection + description: | + Delete the collection identified by `collection-name` and all its documents. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection to drop. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + - name: isSystem + in: query + required: false + description: | + Whether the collection to drop is a system collection. This parameter + must be set to `true` in order to drop a system collection. + schema: + type: boolean + default: false + responses: + '200': + description: | + Dropping the collection has been successful. + content: + application/json: + schema: + type: object + required: + - error + - code + - id + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + id: + description: | + The identifier of the dropped collection. + type: string + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestCollectionDeleteCollectionIdentifier +--- +var cn = "products1"; +var coll = db._create(cn, { waitForSync: true }); +var url = "/_api/collection/"+ coll._id; + +var response = logCurlRequest('DELETE', url); +db[cn] = undefined; + +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Using a name: +name: RestCollectionDeleteCollectionName +--- +var cn = "products1"; +db._drop(cn); +db._create(cn); +var url = "/_api/collection/products1"; + +var response = logCurlRequest('DELETE', url); +db[cn] = undefined; + +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Dropping a system collection +name: RestCollectionDeleteCollectionSystem +--- +var cn = "_example"; +db._drop(cn, { isSystem: true }); +db._create(cn, { isSystem: true }); +var url = "/_api/collection/_example?isSystem=true"; + +var response = logCurlRequest('DELETE', url); +db[cn] = undefined; + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Truncate a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/truncate: + put: + operationId: truncateCollection + description: | + Removes all documents from the collection, but leaves the indexes intact. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + If set to `true`, the data is synchronized to disk before returning from the + truncate operation. + schema: + type: boolean + default: false + - name: compact + in: query + required: false + description: | + If set to `true`, the storage engine is told to start a compaction + in order to free up disk space. This can be resource intensive. If the only + intention is to start over with an empty collection, specify `false`. + schema: + type: boolean + default: true + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + Truncating the collection was successful. + Returns the basic information about the collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - id + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + id: + description: | + A unique identifier of the collection (deprecated). + type: string + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + The collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionIdentifierTruncate +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: true }); +var url = "/_api/collection/"+ coll.name() + "/truncate"; + +var response = logCurlRequest('PUT', url, ''); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +## Modify collections + +### Change the properties of a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/properties: + put: + operationId: updateCollectionProperties + description: | + Changes the properties of a collection. Only the provided attributes are + updated. Collection properties **cannot be changed** once a collection is + created except for the listed properties, as well as the collection name via + the rename endpoint (but not in clusters). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + waitForSync: + description: | + If set to `true`, the data is synchronized to disk before returning from a + document create, update, replace or removal operation. + type: boolean + cacheEnabled: + description: | + Whether the in-memory hash cache for documents should be enabled for this + collection. Can be controlled globally with the `--cache.size` + startup option. The cache can speed up repeated reads of the same documents via + their document keys. If the same documents are not fetched often or are + modified frequently, then you may disable the cache to avoid the maintenance + costs. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + computedValues: + description: | + An optional list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. Can only be a top-level attribute, but you + may return a nested object. Cannot be `_key`, `_id`, `_rev`, `_from`, `_to`, + or a shard key attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + See [Computed Value Expressions](../../concepts/data-structure/documents/computed-values.md#computed-value-expressions) for details. + type: string + overwrite: + description: | + Whether the computed value shall take precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings to define on which write operations the value shall be + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute shall be set if the expression evaluates to `null`. + You can set the option to `false` to not set (or unset) the target attribute if + the expression returns `null`. + type: boolean + default: true + failOnWarning: + description: | + Whether to let the write operation fail if the expression produces a warning. + type: boolean + default: false + replicationFactor: + description: | + In a cluster, this attribute determines how many copies + of each shard are kept on different DB-Servers. The value 1 means that only one + copy (no synchronous replication) is kept. A value of k means that k-1 replicas + are kept. For SatelliteCollections, it needs to be the string `"satellite"`, + which matches the replication factor to the number of DB-Servers + (Enterprise Edition only). + + Any two copies reside on different DB-Servers. Replication between them is + synchronous, that is, every write operation to the "leader" copy will be replicated + to all "follower" replicas, before the write operation is reported successful. + + If a server fails, this is detected automatically and one of the servers holding + copies take over, usually without an error being reported. + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + responses: + '200': + description: | + The collection has been updated successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, and `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionIdentifierPropertiesSync +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: true }); +var url = "/_api/collection/"+ coll.name() + "/properties"; + +var response = logCurlRequest('PUT', url, {"waitForSync" : true }); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Load collection indexes into memory + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/loadIndexesIntoMemory: + put: + operationId: loadCollectionIndexes + description: | + You can call this endpoint to try to cache this collection's index entries in + the main memory. Index lookups served from the memory cache can be much faster + than lookups not stored in the cache, resulting in a performance boost. + + The endpoint iterates over suitable indexes of the collection and stores the + indexed values (not the entire document data) in memory. This is implemented for + edge indexes only. + + The endpoint returns as soon as the index warmup has been scheduled. The index + warmup may still be ongoing in the background, even after the return value has + already been sent. As all suitable indexes are scanned, it may cause significant + I/O activity and background load. + + This feature honors memory limits. If the indexes you want to load are smaller + than your memory limit, this feature guarantees that most index values are + cached. If the index is greater than your memory limit, this feature fills + up values up to this limit. You cannot control which indexes of the collection + should have priority over others. + + It is guaranteed that the in-memory cache data is consistent with the stored + index data at all times. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + responses: + '200': + description: | + The index loading has been scheduled for all suitable indexes. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The value `true`. + type: boolean + example: true + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionIdentifierLoadIndexesIntoMemory +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn); +var url = "/_api/collection/"+ coll.name() + "/loadIndexesIntoMemory"; + +var response = logCurlRequest('PUT', url, ''); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Rename a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/rename: + put: + operationId: renameCollection + description: | + Renames a collection. + + {{</* info */>}} + Renaming collections is not supported in cluster deployments. + {{</* /info */>}} + + If renaming the collection succeeds, then the collection is also renamed in + all graph definitions inside the `_graphs` collection in the current database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection to rename. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + The new collection name. + type: string + responses: + '200': + description: | + The collection has been renamed successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - status + - statusString + - isSystem + - id + - globallyUniqueId + - waitForSync + - keyOptions + - schema + - computedValues + - cacheEnabled + - syncByRevision + # Purposefully undocumented: + # internalValidatorType (internal) + # isSmartChild (internal) + # minReplicationFactor (now writeConcern) + # shadowCollections (internal) + # usesRevisionsAsDocumentIds (internal) + # For backward compatibility: + # status (legacy) + # statusString (legacy) + properties: + status: + description: | + The status of the collection (deprecated). + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + statusString: + description: | + The status of the collection as a descriptive string (deprecated). + type: string + enum: [loaded, deleted] + example: loaded + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + waitForSync: + description: | + If `true`, creating, changing, or removing + documents waits until the data has been synchronized to disk. + type: boolean + schema: + description: | + The configuration of the collection-level schema validation for documents. + type: object + required: + - rule + - level + - message + - type + properties: + rule: + description: | + A [JSON Schema](https://json-schema.org/specification-links#draft-4) + object (draft-4, without remote schemas). + + See [Document Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + for details. + type: object + level: + description: | + The level controls when the validation is triggered: + - `"none"`: The rule is inactive and validation thus turned off. + - `"new"`: Only newly inserted documents are validated. + - `"moderate"`: New and modified documents must pass validation, + except for modified documents where the OLD value did not pass + validation already. This level is useful if you have documents + which do not match your target structure, but you want to stop + the insertion of more invalid documents and prohibit that valid + documents are changed to invalid documents. + - `"strict"`: All new and modified document must strictly pass + validation. No exceptions are made. + type: string + enum: [none, new, moderate, strict] + default: strict + message: + description: | + The error message to raise if the schema validation fails + for a document. + type: string + type: + description: | + The schema validation type. Only JSON Schema is supported. + type: string + enum: [json] + computedValues: + description: | + A list of objects, each representing a computed value. + type: array + items: + type: object + required: + - name + - expression + - overwrite + properties: + name: + description: | + The name of the target attribute. + type: string + expression: + description: | + An AQL `RETURN` operation with an expression that computes the desired value. + type: string + overwrite: + description: | + Whether the computed value takes precedence over a user-provided or + existing attribute. + type: boolean + computeOn: + description: | + An array of strings that defines on which write operations the value is + computed. + type: array + uniqueItems: true + items: + type: string + enum: [insert, update, replace] + example: ["insert", "update", "replace"] + keepNull: + description: | + Whether the target attribute is set if the expression evaluates to `null`. + type: boolean + failOnWarning: + description: | + Whether the write operation fails if the expression produces a warning. + type: boolean + keyOptions: + description: | + An object which contains key generation options. + type: object + required: + - type + - allowUserKeys + properties: + type: + description: | + Specifies the type of the key generator. + type: string + enum: [traditional, autoincrement, uuid, padded] + allowUserKeys: + description: | + If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of a document. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{</* warning */>}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{</* /warning */>}} + type: boolean + increment: + description: | + The increment value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + offset: + description: | + The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + type: integer + lastValue: + description: | + The offset value of the `autoincrement` or `padded` key generator. + This is an internal property for restoring dumps properly. + type: integer + cacheEnabled: + description: | + Whether the in-memory hash cache for documents is enabled for this + collection. + type: boolean + numberOfShards: + description: | + The number of shards of the collection. _(cluster only)_ + type: integer + shardKeys: + description: | + Contains the names of document attributes that are used to + determine the target shard for documents. _(cluster only)_ + type: array + items: + type: string + replicationFactor: + description: | + Contains how many copies of each shard are kept on different DB-Servers. + It is an integer number in the range of 1-10 or the string `"satellite"` + for SatelliteCollections (Enterprise Edition only). _(cluster only)_ + type: integer + writeConcern: + description: | + Determines how many copies of each shard are required to be + in-sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the default `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the current database's + default `writeConcern`, which uses the `--cluster.write-concern` + startup option as default, which defaults to `1`. _(cluster only)_ + type: integer + shardingStrategy: + description: | + The sharding strategy selected for the collection. _(cluster only)_ + type: string + enum: + - community-compat + - enterprise-compat + - enterprise-smart-edge-compat + - hash + - enterprise-hash-smart-edge + - enterprise-hex-smart-vertex + distributeShardsLike: + description: | + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards` and `shardingStrategy` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + type: string + isSmart: + description: | + Whether the collection is used in a SmartGraph or EnterpriseGraph (Enterprise Edition only). + This is an internal property. _(cluster only)_ + type: boolean + isDisjoint: + description: | + Whether the SmartGraph or EnterpriseGraph this collection belongs to is disjoint + (Enterprise Edition only). This is an internal property. _(cluster only)_ + type: boolean + smartGraphAttribute: + description: | + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices (Enterprise Edition only). _(cluster only)_ + type: string + smartJoinAttribute: + description: | + Determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection (Enterprise Edition only). _(cluster only)_ + type: string + name: + description: | + The name of this collection. + type: string + example: coll + id: + description: | + A unique identifier of the collection (deprecated). + type: string + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + syncByRevision: + description: | + Whether the newer revision-based replication protocol is + enabled for this collection. This is an internal property. + type: boolean + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter or the `name` attribute is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionIdentifierRename +--- +var cn = "products1"; +var cnn = "newname"; +db._drop(cn); +db._drop(cnn); +var coll = db._create(cn); +var url = "/_api/collection/" + coll.name() + "/rename"; + +var response = logCurlRequest('PUT', url, { name: cnn }); + +assert(response.code === 200); +db._flushCache(); +db._drop(cnn); + +logJsonResponse(response); +``` + +### Recalculate the document count of a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/recalculateCount: + put: + operationId: recalculateCollectionCount + description: | + Recalculates the document count of a collection, if it ever becomes inconsistent. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + schema: + type: string + responses: + '200': + description: | + The document count has been recalculated successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + type: boolean + example: true + count: + description: | + The recalculated document count. + This attribute is not present when using a cluster. + type: integer + '400': + description: | + The `collection-name` parameter is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +### Compact a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/compact: + put: + operationId: compactCollection + description: | + Compacts the data of a collection in order to reclaim disk space. + The operation will compact the document and index data by rewriting the + underlying .sst files and only keeping the relevant entries. + + Under normal circumstances, running a compact operation is not necessary, as + the collection data will eventually get compacted anyway. However, in some + situations, e.g. after running lots of update/replace or remove operations, + the disk data for a collection may contain a lot of outdated data for which the + space shall be reclaimed. In this case the compaction operation can be used. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + Name of the collection to compact + schema: + type: string + responses: + '200': + description: | + The compaction has been started successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - isSystem + - status + - id + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + name: + description: | + The name of the collection. + type: string + example: coll + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + status: + description: | + The status of the collection. + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + id: + description: | + A unique identifier of the collection (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '401': + description: | + If the request was not authenticated as a user with sufficient rights. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 401 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestApiCollectionCompact +--- +var cn = "testCollection"; +db._drop(cn); +db._create(cn); + +var response = logCurlRequest('PUT', '/_api/collection/' + cn + '/compact', ''); + +assert(response.code === 200); + +logJsonResponse(response); + +db._drop(cn); +``` + +### Load a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/load: + put: + operationId: loadCollection + description: | + {{</* warning */>}} + The load function is deprecated from version 3.8.0 onwards and is a no-op + from version 3.9.0 onwards. It should no longer be used, as it may be removed + in a future version of ArangoDB. + {{</* /warning */>}} + + Since ArangoDB version 3.9.0 this API does nothing. Previously, it used to + load a collection into memory. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + responses: + '200': + description: | + Returns the basic collection properties for compatibility reasons. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - isSystem + - status + - id + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + name: + description: | + The name of the collection. + type: string + example: coll + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + status: + description: | + The status of the collection. + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + id: + description: | + A unique identifier of the collection (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + count: + description: | + The number of documents currently present in the collection. + type: integer + '400': + description: | + The `collection-name` parameter or the `name` attribute is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionIdentifierLoad +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: true }); +var url = "/_api/collection/"+ coll.name() + "/load"; + +var response = logCurlRequest('PUT', url, ''); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Unload a collection + +```openapi +paths: + /_db/{database-name}/_api/collection/{collection-name}/unload: + put: + operationId: unloadCollection + description: | + {{</* warning */>}} + The unload function is deprecated from version 3.8.0 onwards and is a no-op + from version 3.9.0 onwards. It should no longer be used, as it may be removed + in a future version of ArangoDB. + {{</* /warning */>}} + + Since ArangoDB version 3.9.0 this API does nothing. Previously it used to + unload a collection from memory, while preserving all documents. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection-name + in: path + required: true + description: | + The name of the collection. + + {{</* warning */>}} + Accessing collections by their numeric ID is deprecated from version 3.4.0 on. + You should reference them via their names instead. + {{</* /warning */>}} + schema: + type: string + responses: + '200': + description: | + Returns the basic collection properties for compatibility reasons. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - isSystem + - status + - id + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + name: + description: | + The name of the collection. + type: string + example: coll + type: + description: | + The type of the collection: + - `0`: "unknown" + - `2`: regular document collection + - `3`: edge collection + type: integer + example: 2 + isSystem: + description: | + Whether the collection is a system collection. Collection names that starts with + an underscore are usually system collections. + type: boolean + example: false + status: + description: | + The status of the collection. + - `3`: loaded + - `5`: deleted + + Every other status indicates a corrupted collection. + type: integer + example: 3 + id: + description: | + A unique identifier of the collection (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the collection. This is an internal property. + type: string + '400': + description: | + The `collection-name` parameter or the `name` attribute is missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A collection called `collection-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Collections +``` + +**Examples** + +```curl +--- +description: '' +name: RestCollectionIdentifierUnload +--- +var cn = "products"; +db._drop(cn); +var coll = db._create(cn, { waitForSync: true }); +var url = "/_api/collection/"+ coll.name() + "/unload"; + +var response = logCurlRequest('PUT', url, ''); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/databases.md b/site/content/arangodb/oem/develop/http-api/databases.md new file mode 100644 index 0000000000..7a29c76c05 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/databases.md @@ -0,0 +1,461 @@ +--- +title: HTTP interface for databases +menuTitle: Databases +weight: 20 +description: >- + The HTTP API for databases lets you create and delete databases, list + available databases, and get information about specific databases +--- +The HTTP interface for databases provides operations to create and drop +individual databases. These are mapped to the standard `POST` and `DELETE` +HTTP methods. There is also the `GET` method to retrieve an array of existing +databases. + +{{< info >}} +All database management operations can only be accessed via the default +`_system` database and none of the other databases. +{{< /info >}} + +## Addresses of databases + +Any operation triggered via ArangoDB's RESTful HTTP API is executed in the +context of exactly one database. The database name is read from the first part +of the request URI path (e.g. `/_db/mydb/...`). If the request URI does not +contain a database name, it defaults to `/_db/_system`. + +To explicitly specify the database in a request, the request URI must contain +the database name at the beginning of the path: + +``` +http://localhost:8529/_db/mydb/... +``` + +The `...` placeholder is the actual path to the accessed resource. In the example, +the resource is accessed in the context of the `mydb` database. Actual URLs in +the context of `mydb` could look like this: + +``` +http://localhost:8529/_db/mydb/_api/version +http://localhost:8529/_db/mydb/_api/document/test/12345 +http://localhost:8529/_db/mydb/myapp/get +``` + +{{< info >}} +Database management operations like listing, creating, and dropping databases +can only be executed with the `_system` database as the context. +{{< /info >}} + +Special characters in database names must be properly URL-encoded, e.g. +`a + b = c` needs to be encoded as `a%20%2B%20b%20%3D%20c`: + +``` +http://localhost:8529/_db/a%20%2B%20b%20%3D%20c/_api/version +``` + +Database names containing Unicode must be properly +[NFC-normalized](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). +Non-NFC-normalized names are rejected by the server. + +## Manage databases + +### Get information about the current database + +```openapi +paths: + /_db/{database-name}/_api/database/current: + get: + operationId: getCurrentDatabase + description: | + Retrieves the properties of the current database + + The response is a JSON object with the following attributes: + + - `name`: the name of the current database + - `id`: the id of the current database + - `path`: the filesystem path of the current database + - `isSystem`: whether or not the current database is the `_system` database + - `sharding`: the default sharding method for collections created in this database + - `replicationFactor`: the default replication factor for collections in this database + - `writeConcern`: the default write concern for collections in this database + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + is returned if the information was retrieved successfully. + '400': + description: | + is returned if the request is invalid. + '404': + description: | + is returned if the database could not be found. + tags: + - Databases +``` + +**Examples** + +```curl +--- +description: '' +name: RestDatabaseGetInfo +--- +var url = "/_api/database/current"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### List the accessible databases + +```openapi +paths: + /_db/{database-name}/_api/database/user: + get: + operationId: listUserAccessibleDatabases + description: | + Retrieves the list of all databases the current user can access without + specifying a different username or password. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + is returned if the list of database was compiled successfully. + '400': + description: | + is returned if the request is invalid. + tags: + - Databases +``` + +**Examples** + +```curl +--- +description: '' +name: RestDatabaseGetUser +--- +var url = "/_api/database/user"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### List all databases + +```openapi +paths: + /_db/_system/_api/database: + get: + operationId: listDatabases + description: | + Retrieves the list of all existing databases + + {{</* info */>}} + Retrieving the list of databases is only possible from within the `_system` database. + {{</* /info */>}} + responses: + '200': + description: | + is returned if the list of database was compiled successfully. + '400': + description: | + is returned if the request is invalid. + '403': + description: | + is returned if the request was not executed in the `_system` database. + tags: + - Databases +``` + +**Examples** + +```curl +--- +description: '' +name: RestDatabaseGet +--- +var url = "/_db/_system/_api/database"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +### Create a database + +```openapi +paths: + /_db/_system/_api/database: + post: + operationId: createDatabase + description: | + Creates a new database. + + The response is a JSON object with the attribute `result` set to `true`. + + {{</* info */>}} + Creating a new database is only possible from within the `_system` database. + {{</* /info */>}} + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + Has to contain a valid database name. The name must conform to the selected + naming convention for databases. If the name contains Unicode characters, the + name must be [NFC-normalized](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). + Non-normalized names are rejected. + type: string + options: + description: | + Optional object which can contain the following attributes: + type: object + properties: + sharding: + description: | + The sharding method to use for new collections in this database. _(cluster only)_ + Valid values are: + - `""` or `"flexible"`: Create a database where collections can + be sharded independently. + - `"single"`: Create a OneShard database where all collections have a + single shard and all leader shards are co-located on the same DB-Server. + type: string + enum: ["", flexible, single] + default: "" + replicationFactor: + description: | + Default replication factor for new collections created in this database. + _(cluster only)_ + + Special values: + - `"satellite"`: Replicate the collection to every DB-Server (Enterprise Edition only) + - `1`: Disable replication + + You can configure the global default with the + `--cluster.default-replication-factor` startup option. + type: integer + writeConcern: + description: | + Default write concern for new collections created in this database. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + + If `distributeShardsLike` is set, the default `writeConcern` + is that of the prototype collection. + For SatelliteCollections, the `writeConcern` is automatically controlled to + equal the number of DB-Servers and has a value of `0`. + Otherwise, the default value is controlled by the `--cluster.write-concern` + startup option, which defaults to `1`. _(cluster only)_ + type: number + users: + description: | + An array of user objects. The users are granted *Administrate* permissions + for the new database. Users that do not exist yet are created. + If `users` is not specified or does not contain any users, the default user + `root` is used to ensure that the new database is accessible after it + is created. The `root` user is created with an empty password should it not + exist. Each user object can contain the following attributes: + type: array + items: + type: object + required: + - username + properties: + username: + description: | + Login name of an existing user or one to be created. + type: string + passwd: + description: | + The user password as a string. If not specified, it defaults to an empty + string. The attribute is ignored for users that already exist. + type: string + active: + description: | + Whether the user account should be able to log in to the database system. + + The attribute is ignored for users that already exist. + type: boolean + default: true + extra: + description: | + A JSON object with extra user information. It is used by the web interface + to store graph viewer settings and saved queries. Should not be set or + modified by end users, as custom attributes are not preserved. + type: object + responses: + '201': + description: | + is returned if the database was created successfully. + '400': + description: | + is returned if the request parameters are invalid, if a database with the + specified name already exists, or if the configured limit to the number + of databases has been reached. + '403': + description: | + is returned if the request was not executed in the `_system` database. + '409': + description: | + is returned if a database with the specified name already exists. + tags: + - Databases +``` + +**Examples** + +```curl +--- +description: |- + Creating a database named `example`. +name: RestDatabaseCreate +--- +var url = "/_db/_system/_api/database"; +var name = "example"; +try { + db._dropDatabase(name); +} +catch (err) { +} + +var data = { + name: name, + options: { + sharding: "flexible", + replicationFactor: 3 + } +}; +var response = logCurlRequest('POST', url, data); + +db._dropDatabase(name); +assert(response.code === 201); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Creating a database named `mydb` with two users, flexible sharding and + default replication factor of 3 for collections that will be part of + the newly created database. +name: RestDatabaseCreateUsers +--- +var url = "/_db/_system/_api/database"; +var name = "mydb"; +try { + db._dropDatabase(name); +} +catch (err) { +} + +var data = { + name: name, + users: [ + { + username: "admin", + passwd: "secret", + active: true + }, + { + username: "tester", + passwd: "test001", + active: false + } + ] +}; +var response = logCurlRequest('POST', url, data); + +db._dropDatabase(name); +assert(response.code === 201); + +logJsonResponse(response); +``` + +### Drop a database + +```openapi +paths: + /_db/_system/_api/database/{database-name}: + delete: + operationId: deleteDatabase + description: | + Drops the database along with all data stored in it. + + {{</* info */>}} + Dropping a database is only possible from within the `_system` database. + The `_system` database itself cannot be dropped. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + description: | + The name of the database + schema: + type: string + responses: + '200': + description: | + is returned if the database was dropped successfully. + '400': + description: | + is returned if the request is malformed. + '403': + description: | + is returned if the request was not executed in the `_system` database. + '404': + description: | + is returned if the database could not be found. + tags: + - Databases +``` + +**Examples** + +```curl +--- +description: '' +name: RestDatabaseDrop +--- +var url = "/_db/_system/_api/database"; +var name = "example"; + +db._createDatabase(name); +var response = logCurlRequest('DELETE', url + '/' + name); + +assert(response.code === 200); + +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/documents.md b/site/content/arangodb/oem/develop/http-api/documents.md new file mode 100644 index 0000000000..a101e250d1 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/documents.md @@ -0,0 +1,3068 @@ +--- +title: HTTP interface for documents +menuTitle: Documents +weight: 30 +description: >- + The HTTP API for documents lets you create, read, update, and delete documents + in collections, either one or multiple at a time +--- +The basic operations for documents are mapped to the standard HTTP methods: + +- Create: `POST` +- Read: `GET` +- Update: `PATCH` (partially modify) +- Replace: `PUT` +- Delete: `DELETE` +- Check: `HEAD` (test for existence and get document metadata) + +## Addresses of documents + +Any document can be retrieved using its unique URI: + +``` +http://server:port/_api/document/<document-identifier> +``` + +For example, assuming that the document identifier is `demo/362549736`, then the URL +of that document is: + +``` +http://localhost:8529/_api/document/demo/362549736 +``` + +The above URL schema does not specify a [database name](../../concepts/data-structure/databases.md#database-names) +explicitly, so the default `_system` database is used. To explicitly specify the +database context, use the following URL schema: + +``` +http://server:port/_db/<database-name>/_api/document/<document-identifier> +``` + +For example, using a database called `mydb`: + +``` +http://localhost:8529/_db/mydb/_api/document/demo/362549736 +``` + +{{< tip >}} +Many examples in the documentation use the short URL format (and thus the +`_system` database) for brevity. +{{< /tip >}} + +## Multiple documents in a single request + +The document API can handle not only single documents but multiple documents in +a single request. This is crucial for performance, in particular in the cluster +situation, in which a single request can involve multiple network hops +within the cluster. Another advantage is that it reduces the overhead of +the HTTP protocol and individual network round trips between the client +and the server. The general idea to perform multiple document operations +in a single request is to use a JSON array of objects in the place of a +single document. As a consequence, document keys, identifiers and revisions +for preconditions have to be supplied embedded in the individual documents +given. Multiple document operations are restricted to a single collection +(document collection or edge collection). + +<!-- TODO: The spec has been changed long ago and payloads are allowed, but there is still a lot of incompatible software --> +Note that the `GET`, `HEAD` and `DELETE` HTTP operations generally do +not allow to pass a message body. Thus, they cannot be used to perform +multiple document operations in one request. However, there are alternative +endpoints to request and delete multiple documents in one request. + +## Single document operations + +### Get a document + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}/{key}: + get: + operationId: getDocument + description: | + Returns the document identified by the collection name and document key. + The returned document contains three special attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the document revision. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the collection from which the document is to be read. + schema: + type: string + - name: key + in: path + required: true + description: | + The document key. + schema: + type: string + - name: If-None-Match + in: header + required: false + description: | + If the `If-None-Match` header is given, then it must contain exactly one + ETag. The document is returned, if it has a different revision than the + given ETag. Otherwise an *HTTP 304* is returned. + schema: + type: string + - name: If-Match + in: header + required: false + description: | + If the `If-Match` header is given, then it must contain exactly one + ETag. The document is returned, if it has the same revision as the + given ETag. Otherwise a *HTTP 412* is returned. + schema: + type: string + - name: x-arango-allow-dirty-read + in: header + required: false + description: | + Set this header to `true` to allow the Coordinator to ask any shard replica for + the data, not only the shard leader. This may result in "dirty reads". + + The header is ignored if this operation is part of a Stream Transaction + (`x-arango-trx-id` header). The header set when creating the transaction decides + about dirty reads for the entire transaction, not the individual read operations. + schema: + type: boolean + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + The document has been found. + '304': + description: | + The `If-None-Match` header is specified and the document + has the same revision. + '404': + description: | + The document or collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '412': + description: | + An `If-Match` header is specified and the found + document has a different revision. The response includes the found + document's current revision in the `_rev` attribute. Additionally, the + `_id` and `_key` attributes are returned. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Use a document identifier: +name: RestDocumentHandlerReadDocument +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +var url = "/_api/document/" + document._id; + +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._drop(cn); +``` + +```curl +--- +description: |- + Use a document identifier and an ETag: +name: RestDocumentHandlerReadDocumentIfNoneMatch +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +var url = "/_api/document/" + document._id; +var headers = {"If-None-Match": "\"" + document._rev + "\""}; + +var response = logCurlRequest('GET', url, "", headers); +assert(response.code === 304); +logRawResponse(response); + +db._drop(cn); +``` + +```curl +--- +description: |- + Unknown document identifier: +name: RestDocumentHandlerReadDocumentUnknownHandle +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/document/" + cn + "/unknown-identifier"; + +var response = logCurlRequest('GET', url); +assert(response.code === 404); +logJsonResponse(response); + +db._drop(cn); +``` + +### Get a document header + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}/{key}: + head: + operationId: getDocumentHeader + description: | + Like `GET`, but only returns the header fields and not the body. You + can use this call to get the current revision of a document or check if + the document was deleted. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` from which the document is to be read. + schema: + type: string + - name: key + in: path + required: true + description: | + The document key. + schema: + type: string + - name: If-None-Match + in: header + required: false + description: | + If the `If-None-Match` header is given, then it must contain exactly one + ETag. If the current document revision is not equal to the specified ETag, + an *HTTP 200* response is returned. If the current document revision is + identical to the specified ETag, then an *HTTP 304* is returned. + schema: + type: string + - name: If-Match + in: header + required: false + description: | + If the `If-Match` header is given, then it must contain exactly one + ETag. The document is returned, if it has the same revision as the + given ETag. Otherwise a *HTTP 412* is returned. + schema: + type: string + - name: x-arango-allow-dirty-read + in: header + required: false + description: | + Set this header to `true` to allow the Coordinator to ask any shard replica for + the data, not only the shard leader. This may result in "dirty reads". + + The header is ignored if this operation is part of a Stream Transaction + (`x-arango-trx-id` header). The header set when creating the transaction decides + about dirty reads for the entire transaction, not the individual read operations. + schema: + type: boolean + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + The document has been found. + '304': + description: | + An `If-None-Match` header is specified and the document has + the same version. + '404': + description: | + The document or collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '412': + description: | + An `If-Match` header is given and the found + document has a different version. The response includes the found + document's current revision in the `ETag` header. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: '' +name: RestDocumentHandlerReadDocumentHead +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +var url = "/_api/document/" + document._id; + +var response = logCurlRequest('HEAD', url); +assert(response.code === 200); +logRawResponse(response); + +db._drop(cn); +``` + +### Create a document + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}: + post: + operationId: createDocument + description: | + Creates a new document from the document given in the body, unless there + is already a document with the `_key` given. If no `_key` is given, a + new unique `_key` is generated automatically. The `_id` is automatically + set in both cases, derived from the collection name and `_key`. + + {{</* info */>}} + An `_id` or `_rev` attribute specified in the body is ignored. + {{</* /info */>}} + + If the document was created successfully, then the `Location` header + contains the path to the newly created document. The `ETag` header field + contains the revision of the document. Both are only set in the single + document case. + + Unless `silent` is set to `true`, the body of the response contains a + JSON object with the following attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the document revision. + + If the collection parameter `waitForSync` is `false`, then the call + returns as soon as the document has been accepted. It does not wait + until the documents have been synced to disk. + + Optionally, the query parameter `waitForSync` can be used to force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag had been disabled for the entire + collection. Thus, the `waitForSync` query parameter can be used to + force synchronization of just this specific operations. To use this, + set the `waitForSync` parameter to `true`. If the `waitForSync` + parameter is not specified or set to `false`, then the collection's + default `waitForSync` behavior is applied. The `waitForSync` query + parameter cannot be used to disable synchronization for collections + that have a default `waitForSync` value of `true`. + + If the query parameter `returnNew` is `true`, then, for each + generated document, the complete new document is returned under + the `new` attribute in the result. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` in which the document is to be created. + schema: + type: string + - name: collection + in: query + required: false + description: | + The name of the collection. This query parameter is only for backward compatibility. + In ArangoDB versions < 3.0, the URL path was `/_api/document` and + this query parameter was required. This combination still works, but + the recommended way is to specify the collection in the URL path. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Wait until document has been synced to disk. + schema: + type: boolean + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. Only available if the `overwriteMode` + parameter is to `"update"` or `"replace"`, or if `overwrite` is set to `true`. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if the document operation + succeeds. No meta-data is returned for the created document. If the + operation raises an error, an error object is returned. + + You can use this option to save network traffic. + schema: + type: boolean + default: false + - name: overwrite + in: query + required: false + description: | + If set to `true`, the insert becomes a replace-insert. If a document with the + same `_key` already exists, the new document is not rejected with unique + constraint violation error but replaces the old document. Note that operations + with `overwrite` parameter require a `_key` attribute in the request payload, + therefore they can only be performed on collections sharded by `_key`. + schema: + type: boolean + default: false + - name: overwriteMode + in: query + required: false + description: | + This option supersedes `overwrite` and offers the following modes: + - `"ignore"`: if a document with the specified `_key` value exists already, + nothing is done and no write operation is carried out. The + insert operation returns success in this case. This mode does not + support returning the old document version using `RETURN OLD`. When using + `RETURN NEW`, `null` is returned in case the document already existed. + - `"replace"`: if a document with the specified `_key` value exists already, + it is overwritten with the specified document value. This mode is + also used when no overwrite mode is specified but the `overwrite` + flag is set to `true`. + - `"update"`: if a document with the specified `_key` value exists already, + it is patched (partially updated) with the specified document value. + The overwrite mode can be further controlled via the `keepNull` and + `mergeObjects` parameters. + - `"conflict"`: if a document with the specified `_key` value exists already, + return a unique constraint violation error so that the insert operation + fails. This is also the default behavior in case the overwrite mode is + not set, and the `overwrite` flag is `false` or not set either. + schema: + type: string + enum: [ignore, replace, update, conflict] + default: conflict + - name: keepNull + in: query + required: false + description: | + If the intention is to delete existing attributes with the update-insert + command, set the `keepNull` query parameter to `false`. This modifies the + behavior of the patch command to remove top-level attributes and sub-attributes + from the existing document that are contained in the patch document with an + attribute value of `null` (but not attributes of objects that are nested inside + of arrays). This option controls the update-insert behavior only. + schema: + type: boolean + default: true + - name: mergeObjects + in: query + required: false + description: | + Controls whether objects (not arrays) are merged if present in both, the + existing and the update-insert document. If set to `false`, the value in the + patch document overwrites the existing document's value. If set to `true`, + objects are merged. + This option controls the update-insert behavior only. + schema: + type: boolean + default: true + - name: refillIndexCaches + in: query + required: false + description: | + Whether to add new entries to in-memory index caches if document insertions + affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + A JSON representation of a single document. + type: object + responses: + '201': + description: | + The document has been created successfully and + `waitForSync` was `true`. + '202': + description: | + The document has been created successfully and + `waitForSync` was `false`. + '400': + description: | + The request body does not contain a valid JSON representation + of a document. The response body contains + an error document in this case. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The collection cannot be found. + The response body contains an error document in this case. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '409': + description: | + There are two possible reasons for this error in the single document case: + + - A document with the same qualifiers in an indexed attribute conflicts with an + already existing document and thus violates the unique constraint. + The response body contains an error document with the `errorNum` set to + `1210` (`ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED`) in this case. + - Locking the document key or some unique index entry failed to due to another + concurrent operation that operates on the same document. This is also referred + to as a _write-write conflict_. The response body contains an error document + with the `errorNum` set to `1200` (`ERROR_ARANGO_CONFLICT`) in this case. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Create a document in a collection named `products`. Note that the + revision identifier might or might not by equal to the auto-generated + key. +name: RestDocumentHandlerPostCreate1 +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); + +var url = "/_api/document/" + cn; +var body = '{ "Hello": "World" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Create a document in a collection named `products` with a collection-level + `waitForSync` value of `false`. +name: RestDocumentHandlerPostAccept1 +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: false }); + +var url = "/_api/document/" + cn; +var body = '{ "Hello": "World" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Create a document in a collection with a collection-level `waitForSync` + value of `false`, but using the `waitForSync` query parameter. +name: RestDocumentHandlerPostWait1 +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: false }); + +var url = "/_api/document/" + cn + "?waitForSync=true"; +var body = '{ "Hello": "World" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Unknown collection name +name: RestDocumentHandlerPostUnknownCollection1 +--- +var cn = "products"; + +var url = "/_api/document/" + cn; +var body = '{ "Hello": "World" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Illegal document +name: RestDocumentHandlerPostBadJson1 +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/document/" + cn; +var body = '{ 1: "World" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 400); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Use of returnNew: +name: RestDocumentHandlerPostReturnNew +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/document/" + cn + "?returnNew=true"; +var body = '{"Hello":"World"}'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: '' +name: RestDocumentHandlerPostOverwrite +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); + +var url = "/_api/document/" + cn; +var body = '{ "Hello": "World", "_key" : "lock" }'; +var response = logCurlRequest('POST', url, body); +// insert +assert(response.code === 201); +logJsonResponse(response); + +body = '{ "Hello": "Universe", "_key" : "lock" }'; +url = "/_api/document/" + cn + "?overwrite=true"; +response = logCurlRequest('POST', url, body); +// insert same key +assert(response.code === 201); +logJsonResponse(response); + +db._drop(cn); +``` + +### Replace a document + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}/{key}: + put: + operationId: replaceDocument + description: | + Replaces the specified document with the one in the body, provided there is + such a document and no precondition is violated. + + The values of the `_key`, `_id`, and `_rev` system attributes as well as + attributes used as sharding keys cannot be changed. + + If the `If-Match` header is specified and the revision of the + document in the database is unequal to the given revision, the + precondition is violated. + + If `If-Match` is not given and `ignoreRevs` is `false` and there + is a `_rev` attribute in the body and its value does not match + the revision of the document in the database, the precondition is + violated. + + If a precondition is violated, an *HTTP 412* is returned. + + If the document exists and can be updated, then an *HTTP 201* or + an *HTTP 202* is returned (depending on `waitForSync`, see below), + the `ETag` header field contains the new revision of the document + and the `Location` header contains a complete URL under which the + document can be queried. + + Cluster only: The replace documents _may_ contain + values for the collection's pre-defined shard keys. Values for the shard keys + are treated as hints to improve performance. Should the shard keys + values be incorrect ArangoDB may answer with a *not found* error. + + Optionally, the query parameter `waitForSync` can be used to force + synchronization of the document replacement operation to disk even in case + that the `waitForSync` flag had been disabled for the entire collection. + Thus, the `waitForSync` query parameter can be used to force synchronization + of just specific operations. To use this, set the `waitForSync` parameter + to `true`. If the `waitForSync` parameter is not specified or set to + `false`, then the collection's default `waitForSync` behavior is + applied. The `waitForSync` query parameter cannot be used to disable + synchronization for collections that have a default `waitForSync` value + of `true`. + + Unless `silent` is set to `true`, the body of the response contains a + JSON object with the following attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the new document revision. + + If the query parameter `returnOld` is `true`, then + the complete previous revision of the document + is returned under the `old` attribute in the result. + + If the query parameter `returnNew` is `true`, then + the complete new document is returned under + the `new` attribute in the result. + + If the document does not exist, then a *HTTP 404* is returned and the + body of the response contains an error document. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` in which the document is to be replaced. + schema: + type: string + - name: key + in: path + required: true + description: | + The document key. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Wait until document has been synced to disk. + schema: + type: boolean + - name: ignoreRevs + in: query + required: false + description: | + If set to `true`, the `_rev` attributes in + the given document is ignored. If this is set to `false`, then + the `_rev` attribute given in the body document is taken as a + precondition. The document is only replaced if the current revision + is the one specified. + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if the document operation + succeeds. No meta-data is returned for the replaced document. If the + operation raises an error, an error object is returned. + + You can use this option to save network traffic. + schema: + type: boolean + default: false + - name: refillIndexCaches + in: query + required: false + description: | + Whether to update existing entries in in-memory index caches if documents + replacements affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + You can conditionally replace a document based on a target revision id by + using the `If-Match` HTTP header. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + A JSON representation of a single document. + type: object + responses: + '201': + description: | + The document has been replaced successfully and + `waitForSync` was `true`. + '202': + description: | + The document has been replaced successfully and + `waitForSync` was `false`. + '400': + description: | + The request body does not contain a valid JSON representation + of a document. The response body contains + an error document in this case. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The collection or the document was not found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '409': + description: | + There are two possible reasons for this error: + + - The replace operation causes a unique constraint violation in a secondary + index. The response body contains an error document with the `errorNum` set to + `1210` (`ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED`) in this case. + - Locking the document key or some unique index entry failed due to another + concurrent operation that operates on the same document. This is also referred + to as a _write-write conflict_. The response body contains an error document + with the `errorNum` set to `1200` (`ERROR_ARANGO_CONFLICT`) in this case. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '412': + description: | + The precondition is violated. The response includes + the found documents' current revisions in the `_rev` attributes. + Additionally, the attributes `_id` and `_key` are returned. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Using a document identifier +name: RestDocumentHandlerUpdateDocument +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +var url = "/_api/document/" + document._id; + +var response = logCurlRequest('PUT', url, '{"Hello": "you"}'); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Unknown document identifier +name: RestDocumentHandlerUpdateDocumentUnknownHandle +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +db.products.remove(document._id); +var url = "/_api/document/" + document._id; + +var response = logCurlRequest('PUT', url, "{}"); + +assert(response.code === 404); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Produce a revision conflict +name: RestDocumentHandlerUpdateDocumentIfMatchOther +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +var document2 = db.products.save({"hello2":"world"}); +var url = "/_api/document/" + document._id; +var headers = {"If-Match": "\"" + document2._rev + "\""}; + +var response = logCurlRequest('PUT', url, '{"other":"content"}', headers); + +assert(response.code === 412); + +logJsonResponse(response); +db._drop(cn); +``` + +### Update a document + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}/{key}: + patch: + operationId: updateDocument + description: | + Partially updates the document identified by the *document ID*. + The body of the request must contain a JSON document with the + attributes to patch (the patch document). All attributes from the + patch document are added to the existing document if they do not + yet exist, and overwritten in the existing document if they do exist + there. + + The values of the `_key`, `_id`, and `_rev` system attributes as well as + attributes used as sharding keys cannot be changed. + + Setting an attribute value to `null` in the patch document causes a + value of `null` to be saved for the attribute by default. + + If the `If-Match` header is specified and the revision of the + document in the database is unequal to the given revision, the + precondition is violated. + + If `If-Match` is not given and `ignoreRevs` is `false` and there + is a `_rev` attribute in the body and its value does not match + the revision of the document in the database, the precondition is + violated. + + If a precondition is violated, an *HTTP 412* is returned. + + If the document exists and can be updated, then an *HTTP 201* or + an *HTTP 202* is returned (depending on `waitForSync`, see below), + the `ETag` header field contains the new revision of the document + (in double quotes) and the `Location` header contains a complete URL + under which the document can be queried. + + Cluster only: The patch document _may_ contain + values for the collection's pre-defined shard keys. Values for the shard keys + are treated as hints to improve performance. Should the shard keys + values be incorrect ArangoDB may answer with a `not found` error + + Optionally, the query parameter `waitForSync` can be used to force + synchronization of the updated document operation to disk even in case + that the `waitForSync` flag had been disabled for the entire collection. + Thus, the `waitForSync` query parameter can be used to force synchronization + of just specific operations. To use this, set the `waitForSync` parameter + to `true`. If the `waitForSync` parameter is not specified or set to + `false`, then the collection's default `waitForSync` behavior is + applied. The `waitForSync` query parameter cannot be used to disable + synchronization for collections that have a default `waitForSync` value + of `true`. + + Unless `silent` is set to `true`, the body of the response contains a + JSON object with the following attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the new document revision. + + If the query parameter `returnOld` is `true`, then + the complete previous revision of the document + is returned under the `old` attribute in the result. + + If the query parameter `returnNew` is `true`, then + the complete new document is returned under + the `new` attribute in the result. + + If the document does not exist, then a *HTTP 404* is returned and the + body of the response contains an error document. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` in which the document is to be updated. + schema: + type: string + - name: key + in: path + required: true + description: | + The document key. + schema: + type: string + - name: keepNull + in: query + required: false + description: | + If the intention is to delete existing attributes with the patch + command, set the `keepNull` query parameter to `false`. This modifies the + behavior of the patch command to remove top-level attributes and sub-attributes + from the existing document that are contained in the patch document with an + attribute value of `null` (but not attributes of objects that are nested inside + of arrays). + schema: + type: boolean + default: true + - name: mergeObjects + in: query + required: false + description: | + Controls whether objects (not arrays) are merged if present in + both the existing and the patch document. If set to `false`, the + value in the patch document overwrites the existing document's + value. If set to `true`, objects are merged. + schema: + type: boolean + default: true + - name: waitForSync + in: query + required: false + description: | + Wait until document has been synced to disk. + schema: + type: boolean + - name: ignoreRevs + in: query + required: false + description: | + If set to `true`, the `_rev` attributes in + the given document is ignored. If this is set to `false`, then + the `_rev` attribute given in the body document is taken as a + precondition. The document is only updated if the current revision + is the one specified. + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if the document operation + succeeds. No meta-data is returned for the updated document. If the + operation raises an error, an error object is returned. + + You can use this option to save network traffic. + schema: + type: boolean + default: false + - name: refillIndexCaches + in: query + required: false + description: | + Whether to update existing entries in in-memory index caches if document updates + affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + You can conditionally update a document based on a target revision id by + using the `If-Match` HTTP header. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + A JSON representation of a (partial) document. + type: object + responses: + '201': + description: | + The document has been updated successfully and + `waitForSync` was `true`. + '202': + description: | + The document has been updated successfully and + `waitForSync` was `false`. + '400': + description: | + The request body does not contain a valid JSON representation + of a document. The response body contains + an error document in this case. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The document or collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '409': + description: | + There are two possible reasons for this error: + + - The update causes a unique constraint violation in a secondary index. + The response body contains an error document with the `errorNum` set to + `1210` (`ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED`) in this case. + - Locking the document key or some unique index entry failed due to another + concurrent operation that operates on the same document. This is also referred + to as a _write-write conflict_. The response body contains an error document + with the `errorNum` set to `1200` (`ERROR_ARANGO_CONFLICT`) in this case. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '412': + description: | + The precondition was violated. The response also contains + the found documents' current revisions in the `_rev` attributes. + Additionally, the attributes `_id` and `_key` are returned. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Patches an existing document with new content. +name: RestDocumentHandlerPatchDocument +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"one":"world"}); +var url = "/_api/document/" + document._id; + +var response = logCurlRequest("PATCH", url, { "hello": "world" }); + +assert(response.code === 202); + +logJsonResponse(response); +var response2 = logCurlRequest("PATCH", url, { "numbers": { "one": 1, "two": 2, "three": 3, "empty": null } }); +assert(response2.code === 202); +logJsonResponse(response2); +var response3 = logCurlRequest("GET", url); +assert(response3.code === 200); +logJsonResponse(response3); +var response4 = logCurlRequest("PATCH", url + "?keepNull=false", { "hello": null, "numbers": { "four": 4 } }); +assert(response4.code === 202); +logJsonResponse(response4); +var response5 = logCurlRequest("GET", url); +assert(response5.code === 200); +logJsonResponse(response5); +db._drop(cn); +``` + +```curl +--- +description: |- + Merging attributes of an object using `mergeObjects`: +name: RestDocumentHandlerPatchDocumentMerge +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"inhabitants":{"china":1366980000,"india":1263590000,"usa":319220000}}); +var url = "/_api/document/" + document._id; + +var response = logCurlRequest("GET", url); +assert(response.code === 200); +logJsonResponse(response); + +var response = logCurlRequest("PATCH", url + "?mergeObjects=true", { "inhabitants": {"indonesia":252164800,"brazil":203553000 }}); +assert(response.code === 202); + +var response2 = logCurlRequest("GET", url); +assert(response2.code === 200); +logJsonResponse(response2); + +var response3 = logCurlRequest("PATCH", url + "?mergeObjects=false", { "inhabitants": { "pakistan":188346000 }}); +assert(response3.code === 202); +logJsonResponse(response3); + +var response4 = logCurlRequest("GET", url); +assert(response4.code === 200); +logJsonResponse(response4); +db._drop(cn); +``` + +### Remove a document + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}/{key}: + delete: + operationId: deleteDocument + description: | + Unless `silent` is set to `true`, the body of the response contains a + JSON object with the following attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the document revision. + + If the `waitForSync` parameter is not specified or set to `false`, + then the collection's default `waitForSync` behavior is applied. + The `waitForSync` query parameter cannot be used to disable + synchronization for collections that have a default `waitForSync` + value of `true`. + + If the query parameter `returnOld` is `true`, then + the complete previous revision of the document + is returned under the `old` attribute in the result. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` in which the document is to be deleted. + schema: + type: string + - name: key + in: path + required: true + description: | + The document key. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Wait until deletion operation has been synced to disk. + schema: + type: boolean + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if the document operation + succeeds. No meta-data is returned for the deleted document. If the + operation raises an error, an error object is returned. + + You can use this option to save network traffic. + schema: + type: boolean + default: false + - name: refillIndexCaches + in: query + required: false + description: | + Whether to delete existing entries from in-memory index caches and refill them + if document removals affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + You can conditionally remove a document based on a target revision id by + using the `If-Match` HTTP header. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + The document has been removed successfully and + `waitForSync` was `true`. + '202': + description: | + The document has been removed successfully and + `waitForSync` was `false`. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The document or collection cannot be found. + The response body contains an error document in this case. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '409': + description: | + Locking the document key failed due to another + concurrent operation that operates on the same document. + This is also referred to as a _write-write conflict_. + The response body contains an error document with the + `errorNum` set to `1200` (`ERROR_ARANGO_CONFLICT`) in this case. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '412': + description: | + An `If-Match` header is specified and the found + document has a different version. The response includes the found + document's current revision in the `_rev` attribute. Additionally, the + attributes `_id` and `_key` are returned. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Using document identifier: +name: RestDocumentHandlerDeleteDocument +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); +var document = db.products.save({"hello":"world"}); + +var url = "/_api/document/" + document._id; + +var response = logCurlRequest('DELETE', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Unknown document identifier: +name: RestDocumentHandlerDeleteDocumentUnknownHandle +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); +var document = db.products.save({"hello":"world"}); +db.products.remove(document._id); + +var url = "/_api/document/" + document._id; + +var response = logCurlRequest('DELETE', url); + +assert(response.code === 404); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Revision conflict: +name: RestDocumentHandlerDeleteDocumentIfMatchOther +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var document = db.products.save({"hello":"world"}); +var document2 = db.products.save({"hello2":"world"}); +var url = "/_api/document/" + document._id; +var headers = {"If-Match": "\"" + document2._rev + "\""}; + +var response = logCurlRequest('DELETE', url, "", headers); + +assert(response.code === 412); + +logJsonResponse(response); +db._drop(cn); +``` + +### Document ETags + +ArangoDB tries to adhere to the existing HTTP standard as far as +possible. To this end, results of single document queries have the `ETag` +HTTP header set to the [document revision](../../concepts/data-structure/documents/_index.md#document-revisions) +(the value of `_rev` document attribute) enclosed in double quotes. + +You can check the revision of a document using the `HEAD` HTTP method. + +If you want to query, replace, update, replace, or delete a document, then you +can use the `If-Match` header to detect conflicts. If the document has changed, +the operation is aborted and an HTTP `412 Precondition failed` status code is +returned. + +If you obtain a document using `GET` and you want to check whether a newer +revision is available, then you can use the `If-None-Match` HTTP header. If the +document is unchanged (same document revision), an HTTP `412 Precondition failed` +status code is returned. + +## Multiple document operations + +ArangoDB supports working with documents in bulk. Bulk operations affect a +*single* collection. Using this API variant allows clients to amortize the +overhead of single requests over an entire batch of documents. Bulk operations +are **not guaranteed** to be executed serially, ArangoDB _may_ execute the +operations in parallel. This can translate into large performance improvements +especially in a cluster deployment. + +ArangoDB continues to process the remaining operations should an error +occur during the processing of one operation. Errors are returned _inline_ in +the response body as an error document (see below for more details). +Additionally, the `X-Arango-Error-Codes` header is set. It contains a +map of the error codes and how often each kind of error occurred. For +example, `1200:17,1205:10` means that in 17 cases the error 1200 +("revision conflict") has happened, and in 10 cases the error 1205 +("illegal document handle"). + +Generally, the bulk operations expect an input array and the result body +contains a JSON array of the same length. + +### Get multiple documents + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}#get: + put: + operationId: getDocuments + description: | + {{</* warning */>}} + The endpoint for getting multiple documents is the same as for replacing + multiple documents but with an additional query parameter: + `PUT /_api/document/{collection}?onlyget=true`. This is because a lot of + software does not support payload bodies in `GET` requests. + {{</* /warning */>}} + + Returns the documents identified by their `_key` attribute. + The body of the request _must_ contain a JSON array of either + strings (the `_key` values to look up) or search documents. + + A search document _must_ contain at least a value for the `_key` field. + A value for `_rev` _may_ be specified to verify whether the document + has the same revision value, unless _ignoreRevs_ is set to false. + + Cluster only: The search document _may_ contain + values for the collection's pre-defined shard keys. Values for the shard keys + are treated as hints to improve performance. Should the shard keys + values be incorrect ArangoDB may answer with a *not found* error. + + The returned array of documents contain three special attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the document revision. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` from which the documents are to be read. + schema: + type: string + - name: onlyget + in: query + required: true + example: true + description: | + This parameter is required to be `true`, otherwise a replace + operation is executed! + schema: + type: boolean + - name: ignoreRevs + in: query + required: false + description: | + If set to `false` and a `_rev` attribute is included in the request, + then the document is only returned if it has the same revision. + Otherwise, a precondition failed error is returned for the document. + schema: + type: string + default: true + - name: x-arango-allow-dirty-read + in: header + required: false + description: | + Set this header to `true` to allow the Coordinator to ask any shard replica for + the data, not only the shard leader. This may result in "dirty reads". + + The header is ignored if this operation is part of a Stream Transaction + (`x-arango-trx-id` header). The header set when creating the transaction decides + about dirty reads for the entire transaction, not the individual read operations. + schema: + type: boolean + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + An array of documents to retrieve. + type: array + #items: + # type: [string, object] + #required: + # - _key + #properties: + # _key: + # type: string + responses: + '200': + description: | + No error occurred for the overall operation. + '400': + description: | + The request body does not contain a valid JSON representation + of an array of documents. + '404': + description: | + The collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Reading multiple documents identifier: +name: RestDocumentHandlerReadMultiDocument +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"_key":"doc1", "hello":"world"}); +db.products.save({"_key":"doc2", "say":"hi to mom"}); +var url = "/_api/document/products?onlyget=true"; +var body = '["doc1", {"_key":"doc2"}]'; + +var response = logCurlRequest('PUT', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Create multiple documents + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}#multiple: + post: + operationId: createDocuments + description: | + Creates new documents from the documents given in the body, unless there + is already a document with the `_key` given. If no `_key` is given, a new + unique `_key` is generated automatically. The `_id` is automatically + set in both cases, derived from the collection name and `_key`. + + The result body contains a JSON array of the + same length as the input array, and each entry contains the result + of the operation for the corresponding input. In case of an error + the entry is a document with attributes `error` set to `true` and + errorCode set to the error code that has happened. + + {{</* info */>}} + Any `_id` or `_rev` attribute specified in the body is ignored. + {{</* /info */>}} + + Unless `silent` is set to `true`, the body of the response contains an + array of JSON objects with the following attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the document revision. + + If the collection parameter `waitForSync` is `false`, then the call + returns as soon as the documents have been accepted. It does not wait + until the documents have been synced to disk. + + Optionally, the query parameter `waitForSync` can be used to force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag had been disabled for the entire + collection. Thus, the `waitForSync` query parameter can be used to + force synchronization of just this specific operations. To use this, + set the `waitForSync` parameter to `true`. If the `waitForSync` + parameter is not specified or set to `false`, then the collection's + default `waitForSync` behavior is applied. The `waitForSync` query + parameter cannot be used to disable synchronization for collections + that have a default `waitForSync` value of `true`. + + If the query parameter `returnNew` is `true`, then, for each + generated document, the complete new document is returned under + the `new` attribute in the result. + + Should an error have occurred with some of the documents, + the `X-Arango-Error-Codes` HTTP header is set. It contains a map of the + error codes and how often each kind of error occurred. For example, + `1200:17,1205:10` means that in 17 cases the error 1200 ("revision conflict") + has happened, and in 10 cases the error 1205 ("illegal document handle"). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` in which the documents are to be created. + schema: + type: string + - name: collection + in: query + required: false + description: | + The name of the collection. This is only for backward compatibility. + In ArangoDB versions < 3.0, the URL path was `/_api/document` and + this query parameter was required. This combination still works, but + the recommended way is to specify the collection in the URL path. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Wait until document has been synced to disk. + schema: + type: boolean + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. Only available if the `overwriteMode` + parameter is to `"update"` or `"replace"`, or if `overwrite` is set to `true`. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if all document operations + succeed. No meta-data is returned for the created documents. If any of the + operations raises an error, an array with the error object(s) is returned. + + You can use this option to save network traffic but you cannot map any errors + to the inputs of your request. + schema: + type: boolean + default: false + - name: overwrite + in: query + required: false + description: | + If set to `true`, the insert becomes a replace-insert. If a document with the + same `_key` already exists, the new document is not rejected with a unique + constraint violation error but replaces the old document. Note that operations + with `overwrite` parameter require a `_key` attribute in the request payload, + therefore they can only be performed on collections sharded by `_key`. + schema: + type: boolean + default: false + - name: overwriteMode + in: query + required: false + description: | + This option supersedes `overwrite` and offers the following modes: + - `"ignore"`: if a document with the specified `_key` value exists already, + nothing is done and no write operation is carried out. The + insert operation returns success in this case. This mode does not + support returning the old document version using `RETURN OLD`. When using + `RETURN NEW`, `null` is returned in case the document already existed. + - `"replace"`: if a document with the specified `_key` value exists already, + it is overwritten with the specified document value. This mode is + also used when no overwrite mode is specified but the `overwrite` + flag is set to `true`. + - `"update"`: if a document with the specified `_key` value exists already, + it is patched (partially updated) with the specified document value. + The overwrite mode can be further controlled via the `keepNull` and + `mergeObjects` parameters. + - `"conflict"`: if a document with the specified `_key` value exists already, + return a unique constraint violation error so that the insert operation + fails. This is also the default behavior in case the overwrite mode is + not set, and the `overwrite` flag is `false` or not set either. + schema: + type: string + enum: [ignore, replace, update, conflict] + default: conflict + - name: keepNull + in: query + required: false + description: | + If the intention is to delete existing attributes with the update-insert + command, set the `keepNull` query parameter to `false`. This modifies the + behavior of the patch command to remove top-level attributes and sub-attributes + from the existing document that are contained in the patch document with an + attribute value of `null` (but not attributes of objects that are nested inside + of arrays). This option controls the update-insert behavior only. + schema: + type: boolean + default: true + - name: mergeObjects + in: query + required: false + description: | + Controls whether objects (not arrays) are merged if present in both, the + existing and the update-insert document. If set to `false`, the value in the + patch document overwrites the existing document's value. If set to `true`, + objects are merged. + This option controls the update-insert behavior only. + schema: + type: boolean + default: true + - name: refillIndexCaches + in: query + required: false + description: | + Whether to add new entries to in-memory index caches if document insertions + affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + An array of documents to create. + type: array + items: + type: object + responses: + '201': + description: | + The individual operations have been processed and `waitForSync` was `true`. + '202': + description: | + The individual operations have been processed and `waitForSync` was `false`. + '400': + description: | + The request body does not contain a valid JSON representation + of an array of documents. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The document or collection cannot be found. + The response body contains an error document in this case. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Insert multiple documents: +name: RestDocumentHandlerPostMulti1 +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/document/" + cn; +var body = '[{"Hello":"Earth"}, {"Hello":"Venus"}, {"Hello":"Mars"}]'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Use of returnNew: +name: RestDocumentHandlerPostMulti2 +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/document/" + cn + "?returnNew=true"; +var body = '[{"Hello":"Earth"}, {"Hello":"Venus"}, {"Hello":"Mars"}]'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Partially illegal documents: +name: RestDocumentHandlerPostBadJsonMulti +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/document/" + cn; +var body = '[{ "_key": 111 }, {"_key":"abc"}]'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop(cn); +``` + +### Replace multiple documents + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}: + put: + operationId: replaceDocuments + description: | + Replaces multiple documents in the specified collection with the + ones in the body, the replaced documents are specified by the `_key` + attributes in the body documents. + + The values of the `_key`, `_id`, and `_rev` system attributes as well as + attributes used as sharding keys cannot be changed. + + If `ignoreRevs` is `false` and there is a `_rev` attribute in a + document in the body and its value does not match the revision of + the corresponding document in the database, the precondition is + violated. + + Cluster only: The replace documents _may_ contain + values for the collection's pre-defined shard keys. Values for the shard keys + are treated as hints to improve performance. Should the shard keys + values be incorrect ArangoDB may answer with a `not found` error. + + Optionally, the query parameter `waitForSync` can be used to force + synchronization of the document replacement operation to disk even in case + that the `waitForSync` flag had been disabled for the entire collection. + Thus, the `waitForSync` query parameter can be used to force synchronization + of just specific operations. To use this, set the `waitForSync` parameter + to `true`. If the `waitForSync` parameter is not specified or set to + `false`, then the collection's default `waitForSync` behavior is + applied. The `waitForSync` query parameter cannot be used to disable + synchronization for collections that have a default `waitForSync` value + of `true`. + + The body of the response contains a JSON array of the same length + as the input array with the information about the identifier and the + revision of the replaced documents. In each element has the following + attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the new document revision. + + In case of an error or violated precondition, an error + object with the attribute `error` set to `true` and the attribute + `errorCode` set to the error code is built. + + If the query parameter `returnOld` is `true`, then, for each + generated document, the complete previous revision of the document + is returned under the `old` attribute in the result. + + If the query parameter `returnNew` is `true`, then, for each + generated document, the complete new document is returned under + the `new` attribute in the result. + + Note that if any precondition is violated or an error occurred with + some of the documents, the return code is still 201 or 202, but the + `X-Arango-Error-Codes` HTTP header is set. It contains a map of the + error codes and how often each kind of error occurred. For example, + `1200:17,1205:10` means that in 17 cases the error 1200 ("revision conflict") + has happened, and in 10 cases the error 1205 ("illegal document handle"). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + This URL parameter is the name of the collection in which the + documents are replaced. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Wait until the new documents have been synced to disk. + schema: + type: boolean + - name: ignoreRevs + in: query + required: false + description: | + If 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 replaced if the current revision + is the one specified. + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if all document operations + succeed. No meta-data is returned for the replaced documents. If at least one + operation raises an error, an array with the error object(s) is returned. + + You can use this option to save network traffic but you cannot map any errors + to the inputs of your request. + schema: + type: boolean + default: false + - name: refillIndexCaches + in: query + required: false + description: | + Whether to update existing entries in in-memory index caches if documents + replacements affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + An array of documents. Each element has to contain a `_key` attribute. + The existing documents with matching document keys are replaced. + type: array + items: + type: object + responses: + '201': + description: | + The individual operations have been processed and `waitForSync` was `true`. + '202': + description: | + The individual operations have been processed and `waitForSync` was `false`. + '400': + description: | + The request body does not contain a valid JSON representation + of an array of documents. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +### Update multiple documents + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}: + patch: + operationId: updateDocuments + description: | + Partially updates documents, the documents to update are specified + by the `_key` attributes in the body objects. The body of the + request must contain a JSON array of document updates with the + attributes to patch (the patch documents). All attributes from the + patch documents are added to the existing documents if they do + not yet exist, and overwritten in the existing documents if they do + exist there. + + The values of the `_key`, `_id`, and `_rev` system attributes as well as + attributes used as sharding keys cannot be changed. + + Setting an attribute value to `null` in the patch documents causes a + value of `null` to be saved for the attribute by default. + + If `ignoreRevs` is `false` and there is a `_rev` attribute in a + document in the body and its value does not match the revision of + the corresponding document in the database, the precondition is + violated. + + Cluster only: The patch document _may_ contain + values for the collection's pre-defined shard keys. Values for the shard keys + are treated as hints to improve performance. Should the shard keys + values be incorrect ArangoDB may answer with a *not found* error + + Optionally, the query parameter `waitForSync` can be used to force + synchronization of the document replacement operation to disk even in case + that the `waitForSync` flag had been disabled for the entire collection. + Thus, the `waitForSync` query parameter can be used to force synchronization + of just specific operations. To use this, set the `waitForSync` parameter + to `true`. If the `waitForSync` parameter is not specified or set to + `false`, then the collection's default `waitForSync` behavior is + applied. The `waitForSync` query parameter cannot be used to disable + synchronization for collections that have a default `waitForSync` value + of `true`. + + The body of the response contains a JSON array of the same length + as the input array with the information about the identifier and the + revision of the updated documents. Each element has the following + attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the new document revision. + + In case of an error or violated precondition, an error + object with the attribute `error` set to `true` and the attribute + `errorCode` set to the error code is built. + + If the query parameter `returnOld` is `true`, then, for each + generated document, the complete previous revision of the document + is returned under the `old` attribute in the result. + + If the query parameter `returnNew` is `true`, then, for each + generated document, the complete new document is returned under + the `new` attribute in the result. + + Note that if any precondition is violated or an error occurred with + some of the documents, the return code is still 201 or 202, but the + `X-Arango-Error-Codes` HTTP header is set. It contains a map of the + error codes and how often each kind of error occurred. For example, + `1200:17,1205:10` means that in 17 cases the error 1200 ("revision conflict") + has happened, and in 10 cases the error 1205 ("illegal document handle"). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Name of the `collection` in which the documents are to be updated. + schema: + type: string + - name: keepNull + in: query + required: false + description: | + If the intention is to delete existing attributes with the patch + command, set the `keepNull` query parameter to `false`. This modifies the + behavior of the patch command to remove top-level attributes and sub-attributes + from the existing document that are contained in the patch document with an + attribute value of `null` (but not attributes of objects that are nested inside + of arrays). + schema: + type: boolean + default: true + - name: mergeObjects + in: query + required: false + description: | + Controls whether objects (not arrays) are merged if present in + both the existing and the patch document. If set to `false`, the + value in the patch document overwrites the existing document's + value. If set to `true`, objects are merged. + schema: + type: boolean + default: true + - name: waitForSync + in: query + required: false + description: | + Wait until the new documents have been synced to disk. + schema: + type: boolean + - name: ignoreRevs + in: query + required: false + description: | + If 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. + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if all document operations + succeed. No meta-data is returned for the updated documents. If at least one + operation raises an error, an array with the error object(s) is returned. + + You can use this option to save network traffic but you cannot map any errors + to the inputs of your request. + schema: + type: boolean + default: false + - name: refillIndexCaches + in: query + required: false + description: | + Whether to update existing entries in in-memory index caches if document updates + affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + An array of partial documents representing the desired updates. + Each element has to contain a `_key` attribute. The existing + documents with matching document keys are updated. + type: array + items: + type: object + responses: + '201': + description: | + The individual operations have been processed and `waitForSync` was `true`. + '202': + description: | + The individual operations have been processed and `waitForSync` was `false`. + '400': + description: | + The request body does not contain a valid JSON representation + of an array of documents. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The collection cannot be found. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +### Remove multiple documents + +```openapi +paths: + /_db/{database-name}/_api/document/{collection}: + delete: + operationId: deleteDocuments + description: | + The body of the request is an array consisting of selectors for + documents. A selector can either be a string with a key or a string + with a document identifier or an object with a `_key` attribute. This + API call removes all specified documents from `collection`. + If the `ignoreRevs` query parameter is `false` and the + selector is an object and has a `_rev` attribute, it is a + precondition that the actual revision of the removed document in the + collection is the specified one. + + The body of the response is an array of the same length as the input + array. For each input selector, the output contains a JSON object + with the information about the outcome of the operation. If no error + occurred, then such an object has the following attributes: + - `_id`, containing the document identifier with the format `<collection-name>/<document-key>`. + - `_key`, containing the document key that uniquely identifies a document within the collection. + - `_rev`, containing the document revision. + In case of an error, the object has the `error` attribute set to `true` + and `errorCode` set to the error code. + + If the `waitForSync` parameter is not specified or set to `false`, + then the collection's default `waitForSync` behavior is applied. + The `waitForSync` query parameter cannot be used to disable + synchronization for collections that have a default `waitForSync` + value of `true`. + + If the query parameter `returnOld` is `true`, then + the complete previous revision of the document + is returned under the `old` attribute in the result. + + Note that if any precondition is violated or an error occurred with + some of the documents, the return code is still 200 or 202, but the + `X-Arango-Error-Codes` HTTP header is set. It contains a map of the + error codes and how often each kind of error occurred. For example, + `1200:17,1205:10` means that in 17 cases the error 1200 ("revision conflict") + has happened, and in 10 cases the error 1205 ("illegal document handle"). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + Collection from which documents are removed. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Wait until deletion operation has been synced to disk. + schema: + type: boolean + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: silent + in: query + required: false + description: | + If set to `true`, an empty object is returned as response if all document operations + succeed. No meta-data is returned for the deleted documents. If at least one of + the operations raises an error, an array with the error object(s) is returned. + + You can use this option to save network traffic but you cannot map any errors + to the inputs of your request. + schema: + type: boolean + default: false + - name: ignoreRevs + in: query + required: false + description: | + If set to `true`, ignore any `_rev` attribute included in the request. No + revision check is performed. If set to `false`, then revisions are checked. + schema: + type: boolean + default: true + - name: refillIndexCaches + in: query + required: false + description: | + Whether to delete existing entries from in-memory index caches and refill them + if document removals affect the edge index or cache-enabled persistent indexes. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + An array of document selectors. A selector can be a string + (document key or identifier) or an object that has to contain a + `_key` attribute with the document key. + type: array + responses: + '200': + description: | + The individual operations have been processed and `waitForSync` was `true`. + '202': + description: | + The individual operations have been processed and `waitForSync` was `false`. + '403': + description: | + If the error code is `1004`, the specified write concern for the + collection cannot be fulfilled. This can happen if less than the number of + specified replicas for a shard are currently in-sync with the leader. For example, + if the write concern is `2` and the replication factor is `3`, then the + write concern is not fulfilled if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + '404': + description: | + The collection cannot be found. + The response body contains an error document in this case. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '503': + description: | + The system is temporarily not available. This can be a system + overload or temporary failure. In this case it makes sense to retry the request + later. + + If the error code is `1429`, then the write concern for the collection cannot be + fulfilled. This can happen if less than the number of specified replicas for + a shard are currently in-sync with the leader. For example, if the write concern + is `2` and the replication factor is `3`, then the write concern is not fulfilled + if two replicas are not in-sync. + + Note that the HTTP status code is configurable via the + `--cluster.failed-write-concern-status-code` startup option. It defaults to `403` + but can be changed to `503` to signal client applications that it is a + temporary error. + tags: + - Documents +``` + +**Examples** + +```curl +--- +description: |- + Using document keys: +name: RestDocumentHandlerDeleteDocumentKeyMulti +--- +var assertEqual = require("jsunity").jsUnity.assertions.assertEqual; + var cn = "products"; + db._drop(cn); + db._create(cn, { waitForSync: true }); + +var documents = db.products.save( [ + { "_key": "1", "type": "tv" }, + { "_key": "2", "type": "cookbook" } + ] ); + + var url = "/_api/document/" + cn; + + var body = [ "1", "2" ]; + var response = logCurlRequest('DELETE', url, body); + + assert(response.code === 200); + assertEqual(response.parsedBody, documents); + + logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using document identifiers: +name: RestDocumentHandlerDeleteDocumentIdentifierMulti +--- +var assertEqual = require("jsunity").jsUnity.assertions.assertEqual; + var cn = "products"; + db._drop(cn); + db._create(cn, { waitForSync: true }); + +var documents = db.products.save( [ + { "_key": "1", "type": "tv" }, + { "_key": "2", "type": "cookbook" } + ] ); + + var url = "/_api/document/" + cn; + + var body = [ "products/1", "products/2" ]; + var response = logCurlRequest('DELETE', url, body); + + assert(response.code === 200); + assertEqual(response.parsedBody, documents); + + logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using objects with document keys: +name: RestDocumentHandlerDeleteDocumentObjectMulti +--- +var assertEqual = require("jsunity").jsUnity.assertions.assertEqual; + var cn = "products"; + db._drop(cn); + db._create(cn, { waitForSync: true }); + +var documents = db.products.save( [ + { "_key": "1", "type": "tv" }, + { "_key": "2", "type": "cookbook" } + ] ); + + var url = "/_api/document/" + cn; + + var body = [ { "_key": "1" }, { "_key": "2" } ]; + var response = logCurlRequest('DELETE', url, body); + + assert(response.code === 200); + assertEqual(response.parsedBody, documents); + + logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Unknown documents: +name: RestDocumentHandlerDeleteDocumentUnknownMulti +--- +var cn = "products"; +db._drop(cn); +db._drop("other"); +db._create(cn, { waitForSync: true }); +db._create("other", { waitForSync: true }); + +var documents = db.products.save( [ +{ "_key": "1", "type": "tv" }, +{ "_key": "2", "type": "cookbook" } +] ); +db.products.remove(documents); +db.other.save( { "_key": "2" } ); + +var url = "/_api/document/" + cn; + +var body = [ "1", "other/2" ]; +var response = logCurlRequest('DELETE', url, body); + +assert(response.code === 202); +response.parsedBody.forEach(function(doc) { +assert(doc.error === true); +assert(doc.errorNum === 1202); +}); + +logJsonResponse(response); +db._drop(cn); +db._drop("other"); +``` + +```curl +--- +description: |- + Check revisions: +name: RestDocumentHandlerDeleteDocumentRevMulti +--- +var assertEqual = require("jsunity").jsUnity.assertions.assertEqual; + var cn = "products"; + db._drop(cn); + db._create(cn, { waitForSync: true }); + +var documents = db.products.save( [ + { "_key": "1", "type": "tv" }, + { "_key": "2", "type": "cookbook" } + ] ); + + var url = "/_api/document/" + cn + "?ignoreRevs=false"; +var body = [ + { "_key": "1", "_rev": documents[0]._rev }, + { "_key": "2", "_rev": documents[1]._rev } + ]; + + var response = logCurlRequest('DELETE', url, body); + + assert(response.code === 200); + assertEqual(response.parsedBody, documents); + + logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Revision conflict: +name: RestDocumentHandlerDeleteDocumentRevConflictMulti +--- +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); + +var documents = db.products.save( [ +{ "_key": "1", "type": "tv" }, +{ "_key": "2", "type": "cookbook" } +] ); + +var url = "/_api/document/" + cn + "?ignoreRevs=false"; +var body = [ +{ "_key": "1", "_rev": "non-matching revision" }, +{ "_key": "2", "_rev": "non-matching revision" } +]; + +var response = logCurlRequest('DELETE', url, body); + +assert(response.code === 202); +response.parsedBody.forEach(function(doc) { +assert(doc.error === true); +assert(doc.errorNum === 1200); +}); + +logJsonResponse(response); +db._drop(cn); +``` + +## Read from followers + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.10.0</small> + +In an ArangoDB cluster, all reads and writes are performed via +the shard leaders. Shard replicas replicate all operations, but are +only on hot standby to take over in case of a failure. This is to ensure +consistency of reads and writes and allows giving a certain amount of +transactional guarantees. + +If high throughput is more important than consistency and transactional +guarantees for you, then you may allow for so-called "dirty reads" or +"reading from followers", for certain read-only operations. In this case, +Coordinators are allowed to read not only from +leader shards but also from follower shards. This has a positive effect, +because the reads can scale out to all DB-Servers which have copies of +the data. Therefore, the read throughput is higher. Note however, that you +still have to go through your Coordinators. To get the desired result, you +have to have enough Coordinators, load balance your client requests +across all of them, and then allow reads from followers. + +You may observe the following data inconsistencies (dirty reads) when +reading from followers: + +- It is possible to see old, **obsolete revisions** of documents. More + exactly, it is possible that documents are already updated on the leader shard + but the updates have not yet been replicated to the follower shard + from which you are reading. + +- It is also possible to see changes to documents that + **have already happened on a replica**, but are not yet officially + committed on the leader shard. + +When no writes are happening, allowing reading from followers is generally safe. + +The following APIs support reading from followers: + +- Single document reads (`GET /_api/document` and `HEAD /_api/document`) +- Batch document reads (`PUT /_api/document?onlyget=true`) +- Read-only AQL queries (`POST /_api/cursor`) +- The edge API (`GET /_api/edges`) +- Read-only Stream Transactions and their sub-operations + (`POST /_api/transaction/begin` etc.) + +The following APIs do not support reading from followers: + +- The graph API (`GET /_api/gharial` etc.) +- JavaScript Transactions (`POST /_api/transaction`) + +You need to set the following HTTP header in API requests to ask for reads +from followers: + +``` +x-arango-allow-dirty-read: true +``` + +This is in line with the older support to read from followers in the +[Active Failover](../../deploy/active-failover/_index.md#reading-from-followers) +deployment mode. + +For single requests, you specify this header in the read request. +For Stream Transactions, the header has to be set on the request that +creates a read-only transaction. + +The `POST /_api/cursor` endpoint also supports a query option that you can set +instead of the HTTP header: + +```json +{ "query": "...", "options": { "allowDirtyReads": true } } +``` + +Every response to a request that could produce dirty reads has +the following HTTP header: + +``` +x-arango-potential-dirty-read: true +``` diff --git a/site/content/arangodb/oem/develop/http-api/foxx.md b/site/content/arangodb/oem/develop/http-api/foxx.md new file mode 100644 index 0000000000..fae56bd0aa --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/foxx.md @@ -0,0 +1,1075 @@ +--- +title: HTTP interface for Foxx +menuTitle: Foxx +weight: 75 +description: >- + The HTTP API for Foxx allows you to manipulate Foxx microservices installed in + a database +--- +For more information on Foxx and its JavaScript APIs see the +[Foxx documentation](../foxx-microservices/_index.md). + +## Management + +### List the installed services + +```openapi +paths: + /_db/{database-name}/_api/foxx: + get: + operationId: listFoxxServices + description: | + Fetches a list of services installed in the current database. + + Returns a list of objects with the following attributes: + + - `mount`: the mount path of the service + - `development`: `true` if the service is running in development mode + - `legacy`: `true` if the service is running in 2.8 legacy compatibility mode + - `provides`: the service manifest's `provides` value or an empty object + + Additionally the object may contain the following attributes if they have been set on the manifest: + + - `name`: a string identifying the service type + - `version`: a semver-compatible version string + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: excludeSystem + in: query + required: false + description: | + Whether or not system services should be excluded from the result. + schema: + type: boolean + default: false + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Get the service description + +```openapi +paths: + /_db/{database-name}/_api/foxx/service: + get: + operationId: getFoxxServiceDescription + description: | + Fetches detailed information for the service at the given mount path. + + Returns an object with the following attributes: + + - `mount`: the mount path of the service + - `path`: the local file system path of the service + - `development`: `true` if the service is running in development mode + - `legacy`: `true` if the service is running in 2.8 legacy compatibility mode + - `manifest`: the normalized JSON manifest of the service + + Additionally the object may contain the following attributes if they have been set on the manifest: + + - `name`: a string identifying the service type + - `version`: a semver-compatible version string + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + '400': + description: | + Returned if the mount path is unknown. + tags: + - Foxx +``` + +### Install a new service + +```openapi +paths: + /_db/{database-name}/_api/foxx: + post: + operationId: createFoxxService + description: | + Installs the given new service at the given mount path. + + The request body can be any of the following formats: + + - `application/zip`: a raw zip bundle containing a service + - `application/javascript`: a standalone JavaScript file + - `application/json`: a service definition as JSON + - `multipart/form-data`: a service definition as a multipart form + + A service definition is an object or form with the following properties or fields: + + - `configuration`: a JSON object describing configuration values + - `dependencies`: a JSON object describing dependency settings + - `source`: a fully qualified URL or an absolute path on the server's file system + + When using multipart data, the `source` field can also alternatively be a file field + containing either a zip bundle or a standalone JavaScript file. + + When using a standalone JavaScript file the given file will be executed + to define our service's HTTP endpoints. It is the same which would be defined + in the field `main` of the service manifest. + + If `source` is a URL, the URL must be reachable from the server. + If `source` is a file system path, the path will be resolved on the server. + In either case the path or URL is expected to resolve to a zip bundle, + JavaScript file or (in case of a file system path) directory. + + Note that when using file system paths in a cluster with multiple Coordinators + the file system path must resolve to equivalent files on every Coordinator. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path the service should be installed at. + schema: + type: string + - name: development + in: query + required: false + description: | + Set to `true` to enable development mode. + schema: + type: boolean + default: false + - name: setup + in: query + required: false + description: | + Set to `false` to not run the service's setup script. + schema: + type: boolean + default: true + - name: legacy + in: query + required: false + description: | + Set to `true` to install the service in 2.8 legacy compatibility mode. + schema: + type: boolean + default: false + responses: + '201': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Uninstall a service + +```openapi +paths: + /_db/{database-name}/_api/foxx/service: + delete: + operationId: deleteFoxxService + description: | + Removes the service at the given mount path from the database and file system. + + Returns an empty response on success. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + - name: teardown + in: query + required: false + description: | + Set to `false` to not run the service's teardown script. + schema: + type: boolean + default: true + responses: + '204': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Replace a service + +```openapi +paths: + /_db/{database-name}/_api/foxx/service: + put: + operationId: replaceFoxxService + description: | + Removes the service at the given mount path from the database and file system. + Then installs the given new service at the same mount path. + + This is a slightly safer equivalent to performing an uninstall of the old service + followed by installing the new service. The new service's main and script files + (if any) will be checked for basic syntax errors before the old service is removed. + + The request body can be any of the following formats: + + - `application/zip`: a raw zip bundle containing a service + - `application/javascript`: a standalone JavaScript file + - `application/json`: a service definition as JSON + - `multipart/form-data`: a service definition as a multipart form + + A service definition is an object or form with the following properties or fields: + + - `configuration`: a JSON object describing configuration values + - `dependencies`: a JSON object describing dependency settings + - `source`: a fully qualified URL or an absolute path on the server's file system + + When using multipart data, the `source` field can also alternatively be a file field + containing either a zip bundle or a standalone JavaScript file. + + When using a standalone JavaScript file the given file will be executed + to define our service's HTTP endpoints. It is the same which would be defined + in the field `main` of the service manifest. + + If `source` is a URL, the URL must be reachable from the server. + If `source` is a file system path, the path will be resolved on the server. + In either case the path or URL is expected to resolve to a zip bundle, + JavaScript file or (in case of a file system path) directory. + + Note that when using file system paths in a cluster with multiple Coordinators + the file system path must resolve to equivalent files on every Coordinator. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + - name: teardown + in: query + required: false + description: | + Set to `false` to not run the old service's teardown script. + schema: + type: boolean + default: true + - name: setup + in: query + required: false + description: | + Set to `false` to not run the new service's setup script. + schema: + type: boolean + default: true + - name: legacy + in: query + required: false + description: | + Set to `true` to install the new service in 2.8 legacy compatibility mode. + schema: + type: boolean + default: false + - name: force + in: query + required: false + description: | + Set to `true` to force service install even if no service is installed under given mount. + schema: + type: boolean + default: false + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Upgrade a service + +```openapi +paths: + /_db/{database-name}/_api/foxx/service: + patch: + operationId: upgradeFoxxService + description: | + Installs the given new service on top of the service currently installed at the given mount path. + This is only recommended for switching between different versions of the same service. + + Unlike replacing a service, upgrading a service retains the old service's configuration + and dependencies (if any) and should therefore only be used to migrate an existing service + to a newer or equivalent service. + + The request body can be any of the following formats: + + - `application/zip`: a raw zip bundle containing a service + - `application/javascript`: a standalone JavaScript file + - `application/json`: a service definition as JSON + - `multipart/form-data`: a service definition as a multipart form + + A service definition is an object or form with the following properties or fields: + + - `configuration`: a JSON object describing configuration values + - `dependencies`: a JSON object describing dependency settings + - `source`: a fully qualified URL or an absolute path on the server's file system + + When using multipart data, the `source` field can also alternatively be a file field + containing either a zip bundle or a standalone JavaScript file. + + When using a standalone JavaScript file the given file will be executed + to define our service's HTTP endpoints. It is the same which would be defined + in the field `main` of the service manifest. + + If `source` is a URL, the URL must be reachable from the server. + If `source` is a file system path, the path will be resolved on the server. + In either case the path or URL is expected to resolve to a zip bundle, + JavaScript file or (in case of a file system path) directory. + + Note that when using file system paths in a cluster with multiple Coordinators + the file system path must resolve to equivalent files on every Coordinator. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + - name: teardown + in: query + required: false + description: | + Set to `true` to run the old service's teardown script. + schema: + type: boolean + default: false + - name: setup + in: query + required: false + description: | + Set to `false` to not run the new service's setup script. + schema: + type: boolean + default: true + - name: legacy + in: query + required: false + description: | + Set to `true` to install the new service in 2.8 legacy compatibility mode. + schema: + type: boolean + default: false + - name: force + in: query + required: false + description: | + Set to `true` to force service install even if no service is installed under given mount. + schema: + type: boolean + default: false + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +## Configuration + +### Get the configuration options + +```openapi +paths: + /_db/{database-name}/_api/foxx/configuration: + get: + operationId: getFoxxConfiguration + description: | + Fetches the current configuration for the service at the given mount path. + + Returns an object mapping the configuration option names to their definitions + including a human-friendly `title` and the `current` value (if any). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Update the configuration options + +```openapi +paths: + /_db/{database-name}/_api/foxx/configuration: + patch: + operationId: updateFoxxConfiguration + description: | + Replaces the given service's configuration partially. + + Returns an object mapping all configuration option names to their new values. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + A JSON object, mapping configuration option names to their new values. + Any omitted options will be ignored. + type: object + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Replace the configuration options + +```openapi +paths: + /_db/{database-name}/_api/foxx/configuration: + put: + operationId: replaceFoxxConfiguration + description: | + Replaces the given service's configuration completely. + + Returns an object mapping all configuration option names to their new values. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + A JSON object, mapping configuration option names to their new values. + Any omitted options will be reset to their default values or marked as unconfigured. + type: object + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Get the dependency options + +```openapi +paths: + /_db/{database-name}/_api/foxx/dependencies: + get: + operationId: getFoxxDependencies + description: | + Fetches the current dependencies for service at the given mount path. + + Returns an object mapping the dependency names to their definitions + including a human-friendly `title` and the `current` mount path (if any). + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Update the dependency options + +```openapi +paths: + /_db/{database-name}/_api/foxx/dependencies: + patch: + operationId: updateFoxxDependencies + description: | + Replaces the given service's dependencies. + + Returns an object mapping all dependency names to their new mount paths. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - options + properties: + options: + description: | + A JSON object mapping dependency names to their new mount paths. + Any omitted dependencies will be ignored. + type: object + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Replace the dependency options + +```openapi +paths: + /_db/{database-name}/_api/foxx/dependencies: + put: + operationId: replaceFoxxDependencies + description: | + Replaces the given service's dependencies completely. + + Returns an object mapping all dependency names to their new mount paths. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - options + properties: + options: + description: | + A JSON object mapping dependency names to their new mount paths. + Any omitted dependencies will be disabled. + type: object + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +## Miscellaneous + +### List the service scripts + +```openapi +paths: + /_db/{database-name}/_api/foxx/scripts: + get: + operationId: listFoxxScripts + description: | + Fetches a list of the scripts defined by the service. + + Returns an object mapping the raw script names to human-friendly names. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Run a service script + +```openapi +paths: + /_db/{database-name}/_api/foxx/scripts/{name}: + post: + operationId: runFoxxScript + description: | + Runs the given script for the service at the given mount path. + + Returns the exports of the script, if any. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: name + in: path + required: true + description: | + Name of the script to run. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + An arbitrary JSON value that will be parsed and passed to the + script as its first argument. + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Run the service tests + +```openapi +paths: + /_db/{database-name}/_api/foxx/tests: + post: + operationId: runFoxxTests + description: | + Runs the tests for the service at the given mount path and returns the results. + + Supported test reporters are: + + - `default`: a simple list of test cases + - `suite`: an object of test cases nested in suites + - `stream`: a raw stream of test results + - `xunit`: an XUnit/JUnit compatible structure + - `tap`: a raw TAP compatible stream + + The `Accept` request header can be used to further control the response format: + + When using the `stream` reporter `application/x-ldjson` will result + in the response body being formatted as a newline-delimited JSON stream. + + When using the `tap` reporter `text/plain` or `text/*` will result + in the response body being formatted as a plain text TAP report. + + When using the `xunit` reporter `application/xml` or `text/xml` will result + in the response body being formatted as XML instead of JSONML. + + Otherwise the response body will be formatted as non-prettyprinted JSON. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + - name: reporter + in: query + required: false + description: | + Test reporter to use. + schema: + type: string + - name: idiomatic + in: query + required: false + description: | + Use the matching format for the reporter, regardless of the `Accept` header. + schema: + type: boolean + - name: filter + in: query + required: false + description: | + Only run tests where the full name (including full test suites and test case) + matches this string. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Enable the development mode + +```openapi +paths: + /_db/{database-name}/_api/foxx/development: + post: + operationId: enableFoxxDevelopmentMode + description: | + Puts the service into development mode. + + While the service is running in development mode the service will be reloaded + from the filesystem and its setup script (if any) will be re-executed every + time the service handles a request. + + When running ArangoDB in a cluster with multiple Coordinators note that changes + to the filesystem on one Coordinator will not be reflected across the other + Coordinators. This means you should treat your Coordinators as inconsistent + as long as any service is running in development mode. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Disable the development mode + +```openapi +paths: + /_db/{database-name}/_api/foxx/development: + delete: + operationId: disableFoxxDevelopmentMode + description: | + Puts the service at the given mount path into production mode. + + When running ArangoDB in a cluster with multiple Coordinators this will + replace the service on all other Coordinators with the version on this + Coordinator. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Get the service README + +```openapi +paths: + /_db/{database-name}/_api/foxx/readme: + get: + operationId: getFoxxReadme + description: | + Fetches the service's README or README.md file's contents if any. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + '204': + description: | + Returned if no README file was found. + tags: + - Foxx +``` + +### Get the Swagger description + +```openapi +paths: + /_db/{database-name}/_api/foxx/swagger: + get: + operationId: getFoxxSwaggerDescription + description: | + Fetches the Swagger API description for the service at the given mount path. + + The response body will be an OpenAPI 2.0 compatible JSON description of the service API. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + tags: + - Foxx +``` + +### Download a service bundle + +```openapi +paths: + /_db/{database-name}/_api/foxx/download: + post: + operationId: downloadFoxxService + description: | + Downloads a zip bundle of the service directory. + + When development mode is enabled, this always creates a new bundle. + + Otherwise the bundle will represent the version of a service that + is installed on that ArangoDB instance. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: mount + in: query + required: true + description: | + Mount path of the installed service. + schema: + type: string + responses: + '200': + description: | + Returned if the request was successful. + '400': + description: | + Returned if the mount path is unknown. + tags: + - Foxx +``` + +### Commit the local service state + +```openapi +paths: + /_db/{database-name}/_api/foxx/commit: + post: + operationId: commitFoxxServiceState + description: | + Commits the local service state of the Coordinator to the database. + + This can be used to resolve service conflicts between Coordinators that cannot be fixed automatically due to missing data. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: replace + in: query + required: false + description: | + Overwrite existing service files in database even if they already exist. + schema: + type: boolean + responses: + '204': + description: | + Returned if the request was successful. + tags: + - Foxx +``` diff --git a/site/content/arangodb/oem/develop/http-api/general-request-handling.md b/site/content/arangodb/oem/develop/http-api/general-request-handling.md new file mode 100644 index 0000000000..c2c80dbe89 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/general-request-handling.md @@ -0,0 +1,562 @@ +--- +title: HTTP request handling in ArangoDB +menuTitle: General request handling +weight: 5 +description: >- + ArangoDB exposes its API via HTTP, making the server accessible easily with a variety of clients and tools +--- +## Protocol + +ArangoDB exposes its API via HTTP, making the server accessible easily with +a variety of clients and tools (e.g. browsers, curl, telnet). The communication +can optionally be SSL-encrypted. + +Additionally, there is a custom binary protocol called +[VelocyStream](https://github.com/arangodb/velocystream) +which can be used for better throughput. HTTP requests are easily mappable +to VelocyStream and no separate documentation exists as the API is essentially +the same for both network protocols. + +{{< info >}} +VelocyStream is deprecated in v3.11 and removed in v3.12.0. + +While VelocyStream support is still available in v3.11, it is highly recommended +to already switch to the HTTP(S) protocol because of better performance and +reliability. +{{< /info >}} + +ArangoDB uses the standard HTTP methods (e.g. `GET`, `POST`, `PUT`, `DELETE`) plus +the `PATCH` method described in [RFC 5789](http://tools.ietf.org/html/rfc5789). + +Most server APIs expect clients to send any payload data in [JSON](http://www.json.org) +format or ArangoDB's custom [VelocyPack](https://github.com/arangodb/velocypack) +binary format. Details on the expected format and JSON attributes can be found +in the documentation of the individual API endpoints. + +Clients sending requests to ArangoDB must use either of the following protocols: + +- HTTP 1.1 +- HTTP 2 +- VelocyStream + +Other HTTP versions or protocols are not supported by ArangoDB. + +Clients are required to include the `Content-Length` HTTP header with the +correct content length in every request that can have a body (e.g. `POST`, +`PUT` or `PATCH`) request. ArangoDB will not process requests without a +`Content-Length` header - thus chunked transfer encoding for POST-documents +is not supported. + +## HTTP Keep-Alive + +ArangoDB supports HTTP keep-alive. If the client does not send a `Connection` +header in its request, ArangoDB will assume the client wants to keep alive the +connection. +If clients do not wish to use the keep-alive feature, they should +explicitly indicate that by sending a `Connection: Close` HTTP header in +the request. + +The default Keep-Alive timeout can be specified at server start using the +`--http.keep-alive-timeout` startup option. + +Establishing TCP connections is expensive, since it takes several round-trips +between the communication parties. Therefore you can use connection keep-alive +to send several HTTP request over one TCP-connection; +each request is treated independently by definition. You can use this feature +to build up a so called **connection pool** with several established +connections in your client application, and dynamically re-use +one of those then idle connections for subsequent requests. + +## Switch protocols + +Connections are initialized expecting the HTTP 1.1 protocol by default. To use +other protocols the client must indicate this to the server so that the +protocol may be switched. + +Upgrading to HTTP 2 is supported according to the ways outlined in +[RFC 7540 Section 3](https://tools.ietf.org/html/rfc7540#section-3), +from non-encrypted connections as well as encrypted connections. + +On non-encrypted connections with `http` scheme in the URI clients may use +HTTP 1.1 initially until an upgrade is performed. Upgrading the connection is +initiated by sending a request with the `Upgrade: h2c` header and exactly one +`HTTP2-Settings` header. The server will then respond with `101 Switching Protocols` +and begin using HTTP/2. See the RFC for details. + +For non-encrypted TCP connections ArangoDB also supports +*Starting HTTP/2 with Prior Knowledge*, as specified in +[RFC 7540 Section 3.4](https://tools.ietf.org/html/rfc7540#section-3.4). +The server will check the first 24 octets received over the connection and compare +it to the HTTP 2 connection preface `PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n`, as outlined +in [Section 5](https://tools.ietf.org/html/rfc7540#section-5). + +On TLS encrypted connections with `https` scheme in the URI ArangoDB supports the +ALPN extension with the `h2` protocol identifier. This means the connection may +switch to using HTTP/2 right away after a successful TLS handshake. + +An upgrade to the VelocyStream protocol may happen by sending `VST/1.1\r\n\r\n` +(11 octets) to the server _before_ sending anything else. The server will then +start using VelocyStream 1.1. Sending anything else is an error. + +## Request execution + +ArangoDB supports both blocking and non-blocking HTTP requests. +Clients can choose the appropriate method on a per-request level based on their +throughput, control flow, and durability requirements. + +### Blocking execution + +ArangoDB is a multi-threaded server, allowing the processing of multiple +client requests at the same time. Communication handling and the actual work can +be performed by multiple worker threads in parallel. + +Still, clients need to wait for their requests to be processed by the server, +and thus keep one connection of a pool occupied. +By default, the server fully processes an incoming request and then returns +the result to the client when the operation has finished. The client must +wait for the server's HTTP response before it can send additional requests over +the same connection. For clients that are single-threaded, or blocking on I/O +themselves, or both, it may not be optimal to wait idle for the full server response. + +Furthermore, note that even if the client closes the HTTP connection, the request +running on the server still continues until it completes and only then notices +that the client no longer listens for the result. +Thus closing the connection does not help to abort a long running query. + +### Non-blocking execution + +You can let ArangoDB execute requests asynchronously in two different ways: + +- Submit requests for async execution, without the ability to cancel requests + or access the results ("Fire and forget") + +- Submit requests for async execution and let the server store the results for + later retrieval + +#### Fire and forget + +To reduce blocking on the client-side, ArangoDB offers a generic mechanism for +non-blocking, asynchronous execution: clients can add a `x-arango-async: true` +HTTP header to any of their requests, marking them as to be executed +asynchronously on the server. + +ArangoDB puts asynchronous requests into an in-memory job queue and instantly +returns an HTTP `202 Accepted` status code to the client and thus finishes this +HTTP request. The server executes the jobs from the queue asynchronously as fast +as possible, while clients can continue to do other work. + +If the server queue is full (i.e. contains as many jobs as specified by the +[`--server.maximal-queue-size`](../../components/arangodb-server/options.md#--servermaximal-queue-size) +startup option), then the request is rejected instantly with an HTTP +`503 Service Unavailable` status code. + +Asynchronous execution decouples the request/response handling from the actual +work to be performed, allowing fast server responses and greatly reducing wait +time for clients. Overall this allows for much higher throughput than if +clients would always wait for the server's response. + +Keep in mind that the asynchronous execution is just "fire and forget". +Clients get any of their asynchronous requests answered with a generic +HTTP `202 Accepted` response. At the time the server sends this response, it does +not know whether the requested operation can be carried out successfully, as the +actual operation execution happens at some later point. Therefore, clients +cannot make a decision based on the server response and must rely on their +requests being valid and processable by the server. + +Additionally, the server's asynchronous job queue is an in-memory data +structure, meaning not-yet processed jobs from the queue are lost in +case of a crash. Client will not know whether they were processed or not and +should therefore not use the asynchronous feature when they have strict +durability requirements or if they rely on the immediate result of the request +they send. + +Finally, note that it is not possible to cancel such a fire and forget job, +since you don't get any job identifier to identify it later on. +If you need to cancel requests, use +[Async execution and later result retrieval](#async-execution-and-later-result-retrieval). + +#### Async execution and later result retrieval + +By adding a `x-arango-async: store` HTTP header to a request, clients can instruct +the ArangoDB server to execute the operation asynchronously but also store the +operation result in memory for a later retrieval. The server returns a job ID in +the `x-arango-async-id` HTTP response header. The client can use this ID in +conjunction with the `/_api/job` endpoint to access the result. See the +[HTTP interface for jobs](jobs.md) for details. + +Clients can ask the ArangoDB server via the async jobs API which results are +ready for retrieval, and which are not. Clients can also use the async jobs API to +retrieve the original results of an already executed async job by passing it the +originally returned job ID. The server then returns the job result as if the job was +executed normally. Furthermore, clients can cancel running async jobs by +their job ID. + +ArangoDB keeps all results of jobs initiated with the `x-arango-async: store` +header. Results are removed from the server only if a client explicitly asks the +server for a specific result. + +The async jobs API also provides methods for garbage collection that clients can +use to get rid of "old", not fetched results. Clients should call this method periodically +because ArangoDB does not artificially limit the number of not-yet-fetched results. + +It is thus a client responsibility to store only as many results as needed and to fetch +available results as soon as possible, or at least to clean up not fetched results +from time to time. + +The job queue and the results are kept in-memory only on the server, which means +they are lost in case of a crash. + +##### Canceling asynchronous jobs + +A running async query can internally be executed by C++ code or by JavaScript +code. For example, CRUD operations are executed directly in C++, whereas AQL +queries and transactions may be executed by JavaScript code, depending on the +AQL functions and the transaction type you use. The job cancelation only works +for JavaScript code, since the mechanism used is simply to trigger an uncatchable +exception in the JavaScript thread, which is caught on the C++ level, which in +turn leads to the cancelation of the job. No result can be retrieved later +because all data about the request is discarded. + +If you cancel a job running on a Coordinator of a cluster, then only the code +running on the Coordinator is stopped. There may remain tasks within the cluster +which have already been distributed to the DB-Servers and it is not possible to +cancel them as well. + +##### Async execution and authentication + +If a request requires authentication, the authentication procedure is run before +queueing. The request is only queued if the authentication is successful. +Otherwise, it is not queued but rejected instantly in the same way as a regular, +non-queued request. + +## Error handling + +The following should be noted about how ArangoDB handles client errors in its +HTTP layer: + +- client requests using an HTTP version signature different than `HTTP/1.0` or + `HTTP/1.1` will get an **HTTP 505** (HTTP Version Not Supported) error in return. +- ArangoDB will reject client requests with a negative value in the + `Content-Length` request header by closing the connection. +- ArangoDB doesn't support POST with `Transfer-Encoding: chunked` which forbids + the `Content-Length` header above. +- the maximum URL length accepted by ArangoDB is 16K. Incoming requests with + longer URLs will be rejected with an **HTTP 414** (Request-URI too long) error. +- if the client sends a `Content-Length` header with a value greater than 0 for + an HTTP GET, HEAD, or DELETE request, ArangoDB will process the request, but + will write a warning to its log file. +- when the client sends a `Content-Length` header that has a value that is lower + than the actual size of the body sent, ArangoDB will respond with **HTTP 400** + (Bad Request). +- if clients send a `Content-Length` value greater than the actual size of the + body of the request, ArangoDB will wait for about 90 seconds for the client to + complete its request. If the client does not send the remaining body data + within this time, ArangoDB will close the connection. Clients should avoid + sending such malformed requests as this will block one TCP connection, + and may lead to a temporary file descriptor leak. +- when clients send a body or a `Content-Length` value greater than the maximum + allowed value (1 GB), ArangoDB will respond with **HTTP 413** (Payload Too Large). +- if the overall length of the HTTP headers a client sends for one request + exceeds the maximum allowed size (1 MB), the server will fail with **HTTP 431** + (Request Header Fields Too Large). +- if clients request an HTTP method that is not supported by the server, ArangoDB + will return with **HTTP 405** (Method Not Allowed). ArangoDB offers general + support for the following HTTP methods: + - GET + - POST + - PUT + - DELETE + - HEAD + - PATCH + - OPTIONS + + Please note that not all server actions allow using all of these HTTP methods. + You should look up the supported methods for each method you intend to use + in the manual. + + Requests using any other HTTP method (such as for example CONNECT, TRACE etc.) + will be rejected by ArangoDB as mentioned before. +- if the backend is temporarily unavailable, the server will return **HTTP 503** + (Service Unavailable). Common circumstances are: + - during server start or shutdown, when the network port is open but the HTTP + service is not available + - when the queue is full + - when a Coordinator cannot reach a DB-Server + + Clients may retry requests but they might not be idempotent. + +## Cross-Origin Resource Sharing (CORS) requests + +ArangoDB automatically handles CORS requests as described below. + +### Preflight + +When a browser is told to make a cross-origin request that includes explicit +headers, credentials or uses HTTP methods other than `GET` or `POST`, it will +first perform a so-called preflight request using the `OPTIONS` method. + +ArangoDB will respond to `OPTIONS` requests with an HTTP 200 status response +with an empty body. Since preflight requests are not expected to include or +even indicate the presence of authentication credentials even when they will +be present in the actual request, ArangoDB does not enforce authentication for +`OPTIONS` requests even when authentication is enabled. + +ArangoDB will set the following headers in the response: + +- `access-control-allow-credentials`: will be set to `false` by default. + For details on when it will be set to `true` see the next section on cookies. + +- `access-control-allow-headers`: will be set to the exact value of the + request's `access-control-request-headers` header or omitted if no such + header was sent in the request. + +- `access-control-allow-methods`: will be set to a list of all supported HTTP + headers regardless of the target endpoint. In other words that a method is + listed in this header does not guarantee that it will be supported by the + endpoint in the actual request. + +- `access-control-allow-origin`: will be set to the exact value of the + request's `origin` header. + +- `access-control-expose-headers`: will be set to a list of response headers used + by the ArangoDB HTTP API. + +- `access-control-max-age`: will be set to an implementation-specific value. + +### Actual request + +If a request using any other HTTP method than `OPTIONS` includes an `origin` header, +ArangoDB will add the following headers to the response: + +- `access-control-allow-credentials`: will be set to `false` by default. + For details on when it will be set to `true` see the next section on cookies. + +- `access-control-allow-origin`: will be set to the exact value of the + request's `origin` header. + +- `access-control-expose-headers`: will be set to a list of response headers used + by the ArangoDB HTTP API. + +When making CORS requests to endpoints of Foxx services, the value of the +`access-control-expose-headers` header will instead be set to a list of +response headers used in the response itself (but not including the +`access-control-` headers). Note that +[Foxx services may override this behavior](../foxx-microservices/guides/access-from-the-browser.md#cross-origin-resource-sharing-cors). + +### Cookies and authentication + +In order for the client to be allowed to correctly provide authentication +credentials or handle cookies, ArangoDB needs to set the +`access-control-allow-credentials` response header to `true` instead of `false`. + +ArangoDB will automatically set this header to `true` if the value of the +request's `origin` header matches a trusted origin in the `http.trusted-origin` +configuration option. To make ArangoDB trust a certain origin, you can provide +a startup option when running `arangod` like this: + +`--http.trusted-origin "http://localhost:8529"` + +To specify multiple trusted origins, the option can be specified multiple times. +Alternatively you can use the special value `"*"` to trust any origin: + +`--http.trusted-origin "*"` + +Note that browsers will not actually include credentials or cookies in cross-origin +requests unless explicitly told to do so: + +- When using the Fetch API you need to set the + [`credentials` option to `include`](https://fetch.spec.whatwg.org/#cors-protocol-and-credentials). + + ```js + fetch("./", { credentials:"include" }).then(/* … */) + ``` + +- When using `XMLHttpRequest` you need to set the + [`withCredentials` option to `true`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials). + + ```js + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'https://example.com/', true); + xhr.withCredentials = true; + xhr.send(null); + ``` + +- When using jQuery you need to set the `xhrFields` option: + + ```js + $.ajax({ + url: 'https://example.com', + xhrFields: { + withCredentials: true + } + }); + ``` + +## HTTP method overriding + +{{< warning >}} +HTTP method overriding is deprecated from version 3.9.0 on and should no longer +be used. +{{< /warning >}} + +ArangoDB provides a startup option *--http.allow-method-override*. +This option can be set to allow overriding the HTTP request method (e.g. GET, POST, +PUT, DELETE, PATCH) of a request using one of the following custom HTTP headers: + +- `x-http-method-override` +- `x-http-method` +- `x-method-override` + +This allows using HTTP clients that do not support all "common" HTTP methods such as +PUT, PATCH and DELETE. It also allows bypassing proxies and tools that would otherwise +just let certain types of requests (e.g. GET and POST) pass through. + +Enabling this option may impose a security risk, so it should only be used in very +controlled environments. Thus the default value for this option is *false* (no method +overriding allowed). You need to enable it explicitly if you want to use this +feature. + +## Load-balancer support + +When running in cluster mode, ArangoDB exposes some APIs which store request +state data on specific Coordinator nodes, and thus subsequent requests which +require access to this state must be served by the Coordinator node which owns +this state data. In order to support function behind a load-balancer, ArangoDB +can transparently forward requests within the cluster to the correct node. If a +request is forwarded, the response will contain the following custom HTTP header +whose value will be the ID of the node which actually answered the request: + +- `x-arango-request-forwarded-to` + +The following APIs may use request forwarding: + +- `/_api/control_pregel` +- `/_api/cursor` +- `/_api/job` +- `/_api/replication` +- `/_api/query` +- `/_api/tasks` +- `/_api/transaction` + +Note: since forwarding such requests requires an additional cluster-internal HTTP +request, they should be avoided when possible for best performance. Typically +this is accomplished either by directing the requests to the correct Coordinator +at a client-level or by enabling request "stickiness" on a load balancer. Since +these approaches are not always possible in a given environment, we support the +request forwarding as a fall-back solution. + +Note: some endpoints which return "global" data, such as `GET /_api/tasks` will +only return data corresponding to the server on which the request is executed. +These endpoints will generally not work well with load-balancers. + +## Overload control + +<small>Introduced in: v3.9.0</small> + +_arangod_ returns an `x-arango-queue-time-seconds` HTTP +header with all responses. This header contains the most recent request +queueing/dequeuing time (in seconds) as tracked by the server's scheduler. +This value can be used by client applications and drivers to detect server +overload and react on it. + +The arangod startup option `--http.return-queue-time-header` can be set to +`false` to suppress these headers in responses sent by arangod. + +In a cluster, the value returned in the `x-arango-queue-time-seconds` header +is the most recent queueing/dequeuing request time of the Coordinator the +request was sent to, except if the request is forwarded by the Coordinator to +another Coordinator. In that case, the value will indicate the current +queueing/dequeuing time of the forwarded-to Coordinator. + +In addition, client applications and drivers can optionally augment the +requests they send to arangod with the header `x-arango-queue-time-seconds`. +If set, the value of the header should contain the maximum server-side +queuing time (in seconds) that the client application is willing to accept. +If the header is set in an incoming request, arangod will compare the current +dequeuing time from its scheduler with the maximum queue time value contained +in the request header. If the current queueing time exceeds the value set +in the header, arangod will reject the request and return HTTP 412 +(precondition failed) with the error code 21004 (queue time violated). +Using a value of 0 or a non-numeric value in the header will lead to the +header value being ignored by arangod. + +There is also a metric `arangodb_scheduler_queue_time_violations_total` +that is increased whenever a request is dropped because of the requested +queue time not being satisfiable. Administrators can use this metric to monitor +overload situations. Although all instance types will expose this metric, +it will likely always be `0` on DB-Servers and Agency instances because the +`x-arango-queue-time-seconds` header is not used in cluster-internal requests. + +In a cluster, the `x-arango-queue-time-seconds` request header will be +checked on the receiving Coordinator, before any request forwarding. If the +request is forwarded by the Coordinator to a different Coordinator, the +receiving Coordinator will also check the header on its own. +Apart from that, the header will not be included in cluster-internal requests +executed by the Coordinator, e.g. when the Coordinator issues sub-requests +to DB-Servers or Agency instances. + +## Respond to liveliness probes + +<small>Introduced in: v3.10.0</small> + +By default, the HTTP REST interface of an _arangod_ instance is opened late +during the startup sequence. The instance responds with HTTP 503 +(Service unavailable) until all REST APIs are available and usable. + +You can optionally start the HTTP REST interface early in the startup sequence +by setting the `--server.early-connections` startup option to `true`. +This configuration allows an instance to respond to a limited set of REST APIs +during the startup, even during the recovery procedure. This can be useful +because the recovery procedure can take time proportional to the amount of data +to be recovered. + +The following APIs can reply early with an HTTP 200 status: + +- `GET /_api/version` and `GET /_admin/version`: + These APIs return the server version number, but can also be used as a + liveliness probe, to check if the instance is responding to incoming HTTP requests. +- `GET /_admin/status`: + This API returns information about the instance's status, including the recovery + progress and information about which server feature is currently starting. + +During the early startup phase, all APIs other than the ones listed above are +responded to with an HTTP response code 503, so that callers can see that the +instance is not fully ready yet. + +If `--server.authentication` is enabled, then only JWT authentication can be +used during the early startup phase. Incoming requests relying on other +authentication mechanisms that require access to the database data +(e.g. HTTP basic authentication) are also responded to with HTTP 503 errors, +even if correct credentials are used. This is because access to the database +data is not possible early during the startup. + +The `GET /_admin/status` API now also returns startup and recovery information. +This can be used to determine the instance's progress during startup. The new +`progress` attribute will be returned inside the `serverInfo` object with the +following sub-attributes: + +- `phase`: + Name of the lifecycle phase the instance is currently in. Normally one of + `"in prepare"`, `"in start"`, `"in wait"`, `"in shutdown"`, `"in stop"`, + or `"in unprepare"`. +- `feature`: + Internal name of the feature that is currently being prepared, started, + stopped or unprepared. +- `recoveryTick`: + Current recovery sequence number value, if the instance is currently recovering. + If the instance is already past the recovery, this attribute contains the + last handled recovery sequence number. + +The exact values of these attributes should not be relied on, i.e. client +applications should not check for any exact values in them. Feature and phase +names are subject to change between different versions of ArangoDB. +The progress attributes can still be used to determine whether the instance has made +progress between two calls: if `phase`, `feature`, and `recoveryTick` don't +change, then there hasn't been progress. Note that this is only true if the +instance is still starting up. Once the instance has fully started and has +opened the complete REST interface, the values in the `progress` attribute are +expected to not change until shutdown. + +Note that the `maintenance` attribute in responses to `GET /_admin/status` can +still be used to determine whether the instance is fully available for arbitrary +requests. diff --git a/site/content/arangodb/oem/develop/http-api/graphs/_index.md b/site/content/arangodb/oem/develop/http-api/graphs/_index.md new file mode 100644 index 0000000000..0a431eb990 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/graphs/_index.md @@ -0,0 +1,8 @@ +--- +title: HTTP interfaces for graphs +menuTitle: Graphs +weight: 35 +description: >- + The Gharial HTTP API lets you manage named graphs and the Edge API allows you + to retrieve the edges of a vertex +--- diff --git a/site/content/arangodb/oem/develop/http-api/graphs/edges.md b/site/content/arangodb/oem/develop/http-api/graphs/edges.md new file mode 100644 index 0000000000..16d3164081 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/graphs/edges.md @@ -0,0 +1,181 @@ +--- +title: HTTP interface for edges +menuTitle: Edges +weight: 10 +description: >- + The Edge API lets you retrieve the connected edges of a single vertex, + optionally restricted to incoming or outgoing edges +# Undocumented on purpose: +# POST /_api/edges/{coll} (internal) +--- +You can use the general [Document API](../documents.md) to create, +read, modify, and delete edge documents. The only difference to working with +vertex documents is that the `_from` and `_to` attributes are mandatory and +must contain document identifiers. + +The Edge API is useful if you want to look up the inbound and outbound edges of +a vertex with low overhead. You can also retrieve edges with AQL queries, but +queries need to be parsed and planned, and thus have an overhead. On the other +hand, AQL is far more powerful, letting you perform graph traversals, for +instance. + +## Addresses of edges + +Edges are a special variation of documents and you can access them like any +document. See [Addresses of documents](../documents.md#addresses-of-documents) +for details. + +## Get inbound and outbound edges + +```openapi +paths: + /_db/{database-name}/_api/edges/{collection}: + get: + operationId: getVertexEdges + description: | + Returns an array of edges starting or ending in the vertex identified by + `vertex`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection you want to retrieve edges from. + schema: + type: string + - name: vertex + in: query + required: true + description: | + The document identifier of the start vertex. + schema: + type: string + - name: direction + in: query + required: false + description: | + - `"in"`: Return edges that reference the `vertex` in the `_to` attribute. + - `"out"`: Return edges that reference the `vertex` in the `_from` attribute. + - `"any"`: Return edges that reference the `vertex` in the `_from` or `_to` attribute. + schema: + type: string + enum: [any, in, out] + default: any + - name: x-arango-allow-dirty-read + in: header + required: false + description: | + Set this header to `true` to allow the Coordinator to ask any shard replica for + the data, not only the shard leader. This may result in "dirty reads". + schema: + type: boolean + responses: + '200': + description: | + is returned if the edge collection was found and edges were retrieved. + '400': + description: | + is returned if the request contains invalid parameters. + '404': + description: | + is returned if the edge collection was not found. + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: |- + Any direction +name: RestEdgesReadEdgesAny +--- +var db = require("@arangodb").db; +db._create("vertices"); +db._createEdgeCollection("edges"); + +db.vertices.save({_key: "1"}); +db.vertices.save({_key: "2"}); +db.vertices.save({_key: "3"}); +db.vertices.save({_key: "4"}); + +db.edges.save({_from: "vertices/1", _to: "vertices/3", _key: "5", "$label": "v1 -> v3"}); +db.edges.save({_from: "vertices/2", _to: "vertices/1", _key: "6", "$label": "v2 -> v1"}); +db.edges.save({_from: "vertices/4", _to: "vertices/1", _key: "7", "$label": "v4 -> v1"}); + +var url = "/_api/edges/edges?vertex=vertices/1"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop("edges"); +db._drop("vertices"); +``` + +```curl +--- +description: |- + In edges +name: RestEdgesReadEdgesIn +--- +var db = require("@arangodb").db; +db._create("vertices"); +db._createEdgeCollection("edges"); + +db.vertices.save({_key: "1"}); +db.vertices.save({_key: "2"}); +db.vertices.save({_key: "3"}); +db.vertices.save({_key: "4"}); + +db.edges.save({_from: "vertices/1", _to: "vertices/3", _key: "5", "$label": "v1 -> v3"}); +db.edges.save({_from: "vertices/2", _to: "vertices/1", _key: "6", "$label": "v2 -> v1"}); +db.edges.save({_from: "vertices/4", _to: "vertices/1", _key: "7", "$label": "v4 -> v1"}); + +var url = "/_api/edges/edges?vertex=vertices/1&direction=in"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop("edges"); +db._drop("vertices"); +``` + +```curl +--- +description: |- + Out edges +name: RestEdgesReadEdgesOut +--- +var db = require("@arangodb").db; +db._create("vertices"); +db._createEdgeCollection("edges"); + +db.vertices.save({_key: "1"}); +db.vertices.save({_key: "2"}); +db.vertices.save({_key: "3"}); +db.vertices.save({_key: "4"}); + +db.edges.save({_from: "vertices/1", _to: "vertices/3", _key: "5", "$label": "v1 -> v3"}); +db.edges.save({_from: "vertices/2", _to: "vertices/1", _key: "6", "$label": "v2 -> v1"}); +db.edges.save({_from: "vertices/4", _to: "vertices/1", _key: "7", "$label": "v4 -> v1"}); + +var url = "/_api/edges/edges?vertex=vertices/1&direction=out"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop("edges"); +db._drop("vertices"); +``` diff --git a/site/content/arangodb/oem/develop/http-api/graphs/named-graphs.md b/site/content/arangodb/oem/develop/http-api/graphs/named-graphs.md new file mode 100644 index 0000000000..36e9043faa --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/graphs/named-graphs.md @@ -0,0 +1,7664 @@ +--- +title: HTTP interface for named graphs +menuTitle: Named graphs +weight: 5 +description: >- + The HTTP API for named graphs lets you manage General Graphs, SmartGraphs, + EnterpriseGraphs, and SatelliteGraphs +--- +The HTTP API for [named graphs](../../../graphs/_index.md#named-graphs) is called _Gharial_. + +You can manage all types of ArangoDB's named graphs with Gharial: +- [General Graphs](../../../graphs/general-graphs/_index.md) +- [SmartGraphs](../../../graphs/smartgraphs/_index.md) +- [EnterpriseGraphs](../../../graphs/enterprisegraphs/_index.md) +- [SatelliteGraphs](../../../graphs/satellitegraphs/_index.md) + +The examples use the following example graphs: + +[_Social Graph_](../../../graphs/example-graphs.md#social-graph): + +![Social Example Graph](../../../../../images/social_graph.png) + +[_Knows Graph_](../../../graphs/example-graphs.md#knows-graph): + +![Social Example Graph](../../../../../images/knows_graph.png) + +## Management + +### List all graphs + +```openapi +paths: + /_db/{database-name}/_api/gharial: + get: + operationId: listGraphs + description: | + Lists all graphs stored in this database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + Is returned if the module is available and the graphs can be listed. + content: + application/json: + schema: + type: object + required: + - error + - code + - graphs + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + graphs: + description: | + A list of all named graphs. + type: array + items: + type: object + properties: + graph: + description: | + The properties of the named graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + + Default: The `replicationFactor` defined by the database. + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialList +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +examples.loadGraph("routeplanner"); +var url = "/_api/gharial"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("social"); +examples.dropGraph("routeplanner"); +``` + +### Create a graph + +```openapi +paths: + /_db/{database-name}/_api/gharial: + post: + operationId: createGraph + description: | + The creation of a graph requires the name of the graph and a + definition of its edges. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until everything is synced to disk. + Changes the success HTTP response status code. + schema: + type: boolean + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + Name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + A list of vertex collection names. + Edges you later insert into `collection` can only reference vertices + from these collections in their `_from` attribute (if you use the + interface for named graphs). + type: array + items: + type: string + to: + description: | + A list of vertex collection names. + Edges you later insert into `collection` can only reference vertices + from these collections in their `_to` attribute (if you use the + interface for named graphs). + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + isSmart: + description: | + Define if the created graph should be smart (Enterprise Edition only). + type: boolean + default: false + isDisjoint: + description: | + Whether to create a Disjoint SmartGraph instead of a regular SmartGraph + (Enterprise Edition only). + type: boolean + default: false + options: + description: | + Options for creating collections within this graph. + It can contain the following attributes: + type: object + properties: + smartGraphAttribute: + description: | + Only in the Enterprise Edition and required if `isSmart` is `true`. + The attribute name that is used to smartly shard the vertices of a graph. + Every vertex in this SmartGraph has to have this attribute. + Cannot be modified later. + type: string + satellites: + description: | + An array of collection names that is used to create SatelliteCollections + for a (Disjoint) SmartGraph using SatelliteCollections (Enterprise Edition only). + Each array element must be a string and a valid collection name. + The collection type cannot be modified later. + type: array + items: + type: string + numberOfShards: + description: | + The number of shards that is used for every collection within this graph. + Cannot be modified later. + type: integer + default: 1 + replicationFactor: + description: | + The replication factor used when initially creating collections for this graph. + Can be set to `"satellite"` to create a SatelliteGraph, which then ignores + `numberOfShards`, `minReplicationFactor`, and `writeConcern` + (Enterprise Edition only). + + Default: The `replicationFactor` defined by the database. + type: integer + writeConcern: + description: | + Write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + responses: + '201': + description: | + Is returned if the graph can be created and `waitForSync` is enabled + for the `_graphs` collection, or given in the request. + The response body contains the graph configuration that has been stored. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + graph: + description: | + The information about the newly created graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '202': + description: | + Is returned if the graph can be created and `waitForSync` is disabled + for the `_graphs` collection and not given in the request. + The response body contains the graph configuration that has been stored. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + graph: + description: | + The information about the newly created graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '400': + description: | + Returned if the request is in a wrong format. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to create a graph, you need to have at least the following privileges: + - `Administrate` access on the database. + - `Read Only` access on every collection used within this graph. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '409': + description: | + Returned if there is a conflict storing the graph. This can occur + either if a graph with this name already exists, or if there is an + edge definition with the same edge collection but different `from` + and `to` vertex collections in any other graph. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 409 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: |- + Create a General Graph. This graph type does not make use of any sharding + strategy and is useful on the single server. +name: HttpGharialCreate +--- +var graph = require("@arangodb/general-graph"); +if (graph._exists("myGraph")) { + graph._drop("myGraph", true); +} +var url = "/_api/gharial"; +body = { + name: "myGraph", + edgeDefinitions: [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] + }] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); + +graph._drop("myGraph", true); +``` + +```curl +--- +description: |- + Create a SmartGraph. This graph uses 9 shards and + is sharded by the "region" attribute. + Available in the Enterprise Edition only. +name: HttpGharialCreateSmart +--- +var graph = require("@arangodb/general-graph"); +if (graph._exists("smartGraph")) { + graph._drop("smartGraph", true); +} +var url = "/_api/gharial"; +body = { + name: "smartGraph", + edgeDefinitions: [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] + }], + orphanCollections: [ "orphanVertices" ], + isSmart: true, + options: { + replicationFactor: 2, + numberOfShards: 9, + smartGraphAttribute: "region" + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); + +graph._drop("smartGraph", true); +``` + +```curl +--- +description: |- + Create a disjoint SmartGraph. This graph uses 9 shards and + is sharded by the "region" attribute. + Available in the Enterprise Edition only. + Note that as you are using a disjoint version, you can only + create edges between vertices sharing the same region. +name: HttpGharialCreateDisjointSmart +--- +var graph = require("@arangodb/general-graph"); + if (graph._exists("disjointSmartGraph")) { + graph._drop("disjointSmartGraph", true); +} +var url = "/_api/gharial"; +body = { + name: "disjointSmartGraph", + edgeDefinitions: [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] + }], + orphanCollections: [ "orphanVertices" ], + isSmart: true, + options: { + isDisjoint: true, + replicationFactor: 2, + numberOfShards: 9, + smartGraphAttribute: "region" + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); + +graph._drop("disjointSmartGraph", true); +``` + +```curl +--- +description: |- + Create a SmartGraph with a satellite vertex collection. + It uses the collection "endVertices" as a satellite collection. + This collection is cloned to all servers, all other vertex + collections are split into 9 shards + and are sharded by the "region" attribute. + Available in the Enterprise Edition only. +name: HttpGharialCreateSmartWithSatellites +--- +var graph = require("@arangodb/general-graph"); + if (graph._exists("smartGraph")) { + graph._drop("smartGraph", true); +} +var url = "/_api/gharial"; +body = { + name: "smartGraph", + edgeDefinitions: [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] + }], + orphanCollections: [ "orphanVertices" ], + isSmart: true, + options: { + replicationFactor: 2, + numberOfShards: 9, + smartGraphAttribute: "region", + satellites: [ "endVertices" ] + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); + +graph._drop("smartGraph", true); +``` + +```curl +--- +description: |- + Create an EnterpriseGraph. This graph uses 9 shards, + it does not make use of specific sharding attributes. + Available in the Enterprise Edition only. +name: HttpGharialCreateEnterprise +--- +var graph = require("@arangodb/general-graph"); + if (graph._exists("enterpriseGraph")) { + graph._drop("enterpriseGraph", true); +} +var url = "/_api/gharial"; +body = { + name: "enterpriseGraph", + edgeDefinitions: [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] + }], + orphanCollections: [ ], + isSmart: true, + options: { + replicationFactor: 2, + numberOfShards: 9, + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); + +graph._drop("enterpriseGraph", true); +``` + +```curl +--- +description: |- + Create a SatelliteGraph. A SatelliteGraph does not use + shards, but uses "satellite" as replicationFactor. + Make sure to keep this graph small as it is cloned + to every server. + Available in the Enterprise Edition only. +name: HttpGharialCreateSatellite +--- +var graph = require("@arangodb/general-graph"); + if (graph._exists("satelliteGraph")) { + graph._drop("satelliteGraph", true); +} +var url = "/_api/gharial"; +body = { + name: "satelliteGraph", + edgeDefinitions: [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] + }], + orphanCollections: [ ], + options: { + replicationFactor: "satellite" + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); + +graph._drop("satelliteGraph", true); +``` + +### Get a graph + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}: + get: + operationId: getGraph + description: | + Selects information for a given graph. + Returns the edge definitions as well as the orphan collections, + or returns an error if the graph does not exist. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + responses: + '200': + description: | + Returns the graph if it can be found. + The result has the following format: + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + graph: + description: | + The information about the newly created graph + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialGetGraph +--- +var graph = require("@arangodb/general-graph"); +if (graph._exists("myGraph")) { + graph._drop("myGraph", true); +} +graph._create("myGraph", [{ + collection: "edges", + from: [ "startVertices" ], + to: [ "endVertices" ] +}]); +var url = "/_api/gharial/myGraph"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); + +graph._drop("myGraph", true); +``` + +### Drop a graph + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}: + delete: + operationId: deleteGraph + description: | + Drops an existing graph object by name. + Optionally all collections not used by other graphs + can be dropped as well. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: dropCollections + in: query + required: false + description: | + Drop the collections of this graph as well. Collections are only + dropped if they are not used in other graphs. + schema: + type: boolean + default: false + responses: + '202': + description: | + Is returned if the graph can be dropped. + content: + application/json: + schema: + type: object + required: + - error + - code + - removed + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + removed: + description: | + Always `true`. + type: boolean + example: true + '403': + description: | + Returned if your user has insufficient rights. + In order to drop a graph, you need to have at least the following privileges: + - `Administrate` access on the database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialDrop +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social?dropCollections=true"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### List vertex collections + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex: + get: + operationId: listVertexCollections + description: | + Lists all vertex collections within this graph, including orphan collections. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + responses: + '200': + description: | + Is returned if the collections can be listed. + content: + application/json: + schema: + type: object + required: + - error + - code + - collections + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + collections: + description: | + The list of all vertex collections within this graph. + Includes the vertex collections used in edge definitions + as well as orphan collections. + type: array + items: + type: string + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialListVertex +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/vertex"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Add a vertex collection + +Adding a vertex collection on its own to a graph adds it as an orphan collection. +If you want to use an additional vertex collection for graph relations, add it +by [adding a new edge definition](#add-an-edge-definition) or +[modifying an existing edge definition](#replace-an-edge-definition) instead. + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex: + post: + operationId: addVertexCollection + description: | + Adds a vertex collection to the set of orphan collections of the graph. + If the collection does not exist, it is created. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - collection + properties: + collection: + description: | + The name of the vertex collection to add to the graph definition. + type: string + options: + description: | + A JSON object to set options for creating vertex collections. + type: object + properties: + satellites: + description: | + An array of collection names that is used to create SatelliteCollections + for a (Disjoint) SmartGraph using SatelliteCollections (Enterprise Edition only). + Each array element must be a string and a valid collection name. + The collection type cannot be modified later. + type: array + items: + type: string + responses: + '201': + description: | + Is returned if the collection can be created and `waitForSync` is enabled + for the `_graphs` collection, or given in the request. + The response body contains the graph configuration that has been stored. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '202': + description: | + Is returned if the collection can be created and `waitForSync` is disabled + for the `_graphs` collection, or given in the request. + The response body contains the graph configuration that has been stored. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + graph: + description: | + The information about the newly created graph + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '400': + description: | + Returned if the request is in an invalid format. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to modify a graph, you need to have at least the following privileges: + - `Administrate` access on the database. + - `Read Only` access on every collection used within this graph. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialAddVertexCol +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/vertex"; +body = { + collection: "otherVertices" +}; +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Remove a vertex collection + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex/{collection}: + delete: + operationId: deleteVertexCollection + description: | + Removes a vertex collection from the list of the graph's + orphan collections. It can optionally delete the collection if it is + not used in any other graph. + + You cannot remove vertex collections that are used in one of the + edge definitions of the graph. You need to modify or remove the + edge definition first in order to fully remove a vertex collection from + the graph. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the vertex collection. + schema: + type: string + - name: dropCollection + in: query + required: false + description: | + Drop the collection in addition to removing it from the graph. + The collection is only dropped if it is not used in other graphs. + schema: + type: boolean + default: false + responses: + '200': + description: | + Returned if the vertex collection was removed from the graph successfully + and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + graph: + description: | + The information about the newly created graph + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + graph: + description: | + The information about the newly created graph + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '400': + description: | + Returned if the vertex collection is still used in an edge definition. + In this case it cannot be removed from the graph yet, it has to be + removed from the edge definition first. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to drop a vertex, you need to have at least the following privileges: + - `Administrate` access on the database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: |- + You can remove vertex collections that are not used in any edge definition: +name: HttpGharialRemoveVertexCollection +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +var g = examples.loadGraph("social"); +g._addVertexCollection("otherVertices"); +var url = "/_api/gharial/social/vertex/otherVertices"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +db._drop("otherVertices"); +``` + +```curl +--- +description: |- + You cannot remove vertex collections that are used in edge definitions: +name: HttpGharialRemoveVertexCollectionFailed +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +var g = examples.loadGraph("social"); +var url = "/_api/gharial/social/vertex/male"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 400); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### List edge collections + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge: + get: + operationId: listEdgeCollections + description: | + Lists all edge collections within this graph. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + responses: + '200': + description: | + Is returned if the edge definitions can be listed. + content: + application/json: + schema: + type: object + required: + - error + - code + - collections + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + collections: + description: | + A list of all edge collections used in the edge definitions + of this graph. + type: array + items: + type: string + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialListEdge +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/edge"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Add an edge definition + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge: + post: + operationId: createEdgeDefinition + description: | + Adds an additional edge definition to the graph. + + This edge definition has to contain a `collection` and an array of + each `from` and `to` vertex collections. An edge definition can only + be added if this definition is either not used in any other graph, or + it is used with exactly the same definition. For example, it is not + possible to store a definition "e" from "v1" to "v2" in one graph, and + "e" from "v2" to "v1" in another graph, but both can have "e" from + "v1" to "v2". + + Additionally, collection creation options can be set. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + The name of the edge collection to be used. + type: string + from: + description: | + One or many vertex collections that can contain source vertices. + type: array + items: + type: string + to: + description: | + One or many vertex collections that can contain target vertices. + type: array + items: + type: string + options: + description: | + A JSON object to set options for creating collections within this + edge definition. + type: object + properties: + satellites: + description: | + An array of collection names that is used to create SatelliteCollections + for a (Disjoint) SmartGraph using SatelliteCollections (Enterprise Edition only). + Each array element must be a string and a valid collection name. + The collection type cannot be modified later. + type: array + items: + type: string + responses: + '201': + description: | + Returned if the definition can be added successfully and + `waitForSync` is enabled for the `_graphs` collection. + The response body contains the graph configuration that has been stored. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '202': + description: | + Returned if the definition can be added successfully and + `waitForSync` is disabled for the `_graphs` collection. + The response body contains the graph configuration that has been stored. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '400': + description: | + Returned if the edge definition can not be added. + This can be because it is ill-formed, or if there is an + edge definition with the same edge collection but different `from` + and `to` vertex collections in any other graph. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to modify a graph, you need to have at least the following privileges: + - `Administrate` access on the database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned if no graph with this name can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialAddEdgeCol +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/edge"; +body = { + collection: "works_in", + from: ["female", "male"], + to: ["city"] +}; +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Replace an edge definition + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}: + put: + operationId: replaceEdgeDefinition + description: | + Change the vertex collections of one specific edge definition. + This modifies all occurrences of this definition in all graphs known to your database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection used in the edge definition. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: dropCollections + in: query + required: false + description: | + Drop the edge collection in addition to removing it from the graph. + The collection is only dropped if it is not used in other graphs. + schema: + type: boolean + default: false + requestBody: + content: + application/json: + schema: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + The name of the edge collection to modify. + type: string + from: + description: | + One or many vertex collections that can contain source vertices. + type: array + items: + type: string + to: + description: | + One or many vertex collections that can contain target vertices. + type: array + items: + type: string + options: + description: | + A JSON object to set options for modifying collections within this + edge definition. + type: object + properties: + satellites: + description: | + An array of collection names that is used to create SatelliteCollections + for a (Disjoint) SmartGraph using SatelliteCollections (Enterprise Edition only). + Each array element must be a string and a valid collection name. + The collection type cannot be modified later. + type: array + items: + type: string + responses: + '201': + description: | + Returned if the request was successful and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '400': + description: | + Returned if the new edge definition is ill-formed and cannot be used. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to drop a vertex, you need to have at least the following privileges: + - `Administrate` access on the database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned if no graph with this name can be found, or if no edge definition + with this name is found in the graph. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialReplaceEdgeCol +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/edge/relation"; +body = { + collection: "relation", + from: ["female", "male", "animal"], + to: ["female", "male", "animal"] +}; +var response = logCurlRequest('PUT', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Remove an edge definition + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}: + delete: + operationId: deleteEdgeDefinition + description: | + Remove one edge definition from the graph. This only removes the + edge collection from the graph definition. The vertex collections of the + edge definition become orphan collections but otherwise remain untouched + and can still be used in your queries. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection used in the edge definition. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: dropCollections + in: query + required: false + description: | + Drop the edge collection in addition to removing it from the graph. + The collection is only dropped if it is not used in other graphs. + schema: + type: boolean + default: false + responses: + '201': + description: | + Returned if the edge definition can be removed from the graph + and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '202': + description: | + Returned if the edge definition can be removed from the graph and + `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - graph + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + graph: + description: | + The information about the modified graph. + type: object + required: + - name + - edgeDefinitions + - orphanCollections + - numberOfShards + - _id + - _rev + - replicationFactor + - isSmart + - isDisjoint + - isSatellite + properties: + name: + description: | + The name of the graph. + type: string + edgeDefinitions: + description: | + An array of definitions for the relations of the graph. + Each has the following type: + type: array + items: + type: object + required: + - collection + - from + - to + properties: + collection: + description: | + Name of the edge collection, where the edges are stored in. + type: string + from: + description: | + List of vertex collection names. + Edges in collection can only be inserted if their _from is in any of the collections here. + type: array + items: + type: string + to: + description: | + List of vertex collection names. + + Edges in collection can only be inserted if their _to is in any of the collections here. + type: array + items: + type: string + orphanCollections: + description: | + An array of additional vertex collections. + Documents in these collections do not have edges within this graph. + type: array + items: + type: string + numberOfShards: + description: | + Number of shards created for every new collection in the graph. + type: integer + _id: + description: | + The internal id value of this graph. + type: string + _rev: + description: | + The revision of this graph. Can be used to make sure to not override + concurrent modifications to this graph. + type: string + replicationFactor: + description: | + The replication factor used for every new collection in the graph. + For SatelliteGraphs, it is the string `"satellite"` (Enterprise Edition only). + type: integer + writeConcern: + description: | + The default write concern for new collections in the graph. + It determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less than these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. + For SatelliteGraphs, the `writeConcern` is automatically controlled to equal the + number of DB-Servers and the attribute is not available. _(cluster only)_ + type: integer + isSmart: + description: | + Whether the graph is a SmartGraph (Enterprise Edition only). + type: boolean + isDisjoint: + description: | + Whether the graph is a Disjoint SmartGraph (Enterprise Edition only). + type: boolean + smartGraphAttribute: + description: | + Name of the sharding attribute in the SmartGraph case (Enterprise Edition only). + type: string + isSatellite: + description: | + Whether the graph is a SatelliteGraph (Enterprise Edition only). + type: boolean + '403': + description: | + Returned if your user has insufficient rights. + In order to drop a vertex, you need to have at least the following privileges: + - `Administrate` access on the database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned if no graph with this name can be found, + or if no edge definition with this name is found in the graph. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialEdgeDefinitionRemove +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/edge/relation"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); + +logJsonResponse(response); +db._drop("relation"); +examples.dropGraph("social"); +``` + +## Vertices + +### Create a vertex + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex/{collection}: + post: + operationId: createVertex + description: | + Adds a vertex to the given collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the vertex collection the vertex should be inserted into. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The body has to be a JSON object you want to store as a vertex document. + type: object + responses: + '201': + description: | + Returned if the vertex can be added and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + vertex: + description: | + The internal attributes for the vertex. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + new: + description: | + The complete newly written vertex document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + vertex: + description: | + The internal attributes generated while storing the vertex. + Does not include any attribute given in request body. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + new: + description: | + The complete newly written vertex document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to insert vertices into the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + The graph cannot be found or the collection is not part of the graph. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialAddVertex +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/vertex/male"; +body = { + name: "Francis" +} +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Get a vertex + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex/{collection}/{vertex}: + get: + operationId: getVertex + description: | + Gets a vertex from the given collection. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the vertex collection the vertex belongs to. + schema: + type: string + - name: vertex + in: path + required: true + description: | + The `_key` attribute of the vertex. + schema: + type: string + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is returned if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: If-None-Match + in: header + required: false + description: | + If you provide an `If-None-Match` header, it must contain exactly one ETag. + The document is returned if it has a different revision as the given ETag. + Otherwise, an error with HTTP status code 304 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + Returned if the vertex can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + vertex: + description: | + The complete vertex. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '304': + description: | + The `If-None-Match` header has been specified and the currently + stored vertex still has this revision value. There was no update since + the last time the vertex was fetched by the caller. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 304 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to update vertices in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Read Only` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The vertex does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialGetVertex +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/vertex/female/alice"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Update a vertex + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex/{collection}/{vertex}: + patch: + operationId: updateVertex + description: | + Updates the data of the specific vertex in the collection. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the vertex collection the vertex belongs to. + schema: + type: string + - name: vertex + in: path + required: true + description: | + The `_key` attribute of the vertex. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: keepNull + in: query + required: false + description: | + Define if values set to `null` should be stored. + By default (`true`), the given documents attribute(s) are set to `null`. + If this parameter is set to `false`, top-level attribute and sub-attributes with + a `null` value in the request are removed from the document (but not attributes + of objects that are nested inside of arrays). + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is updated if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The body has to be a JSON object containing exactly the attributes + that should be overwritten. All other attributes remain unchanged. + type: object + responses: + '200': + description: | + Returned if the vertex can be updated, and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + vertex: + description: | + The internal attributes for the vertex. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + new: + description: | + The complete newly written vertex document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + old: + description: | + The complete overwritten vertex document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '202': + description: | + Returned if the request was successful, and `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + vertex: + description: | + The internal attributes for the vertex. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + new: + description: | + The complete newly written vertex document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + old: + description: | + The complete overwritten vertex document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to update vertices in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The vertex to update does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialModifyVertex +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +body = { + age: 26 +} +var url = "/_api/gharial/social/vertex/female/alice"; +var response = logCurlRequest('PATCH', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Replace a vertex + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex/{collection}/{vertex}: + put: + operationId: replaceVertex + description: | + Replaces the data of a vertex in the collection. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the vertex collection the vertex belongs to. + schema: + type: string + - name: vertex + in: path + required: true + description: | + The `_key` attribute of the vertex. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: keepNull + in: query + required: false + description: | + Define if values set to `null` should be stored. + By default (`true`), the given documents attribute(s) are set to `null`. + If this parameter is set to `false`, top-level attribute and sub-attributes with + a `null` value in the request are removed from the document (but not attributes + of objects that are nested inside of arrays). + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is replaced if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The body has to be a JSON object you want to replace the existing + vertex document with. + type: object + responses: + '200': + description: | + Returned if the vertex can be replaced, and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + vertex: + description: | + The internal attributes for the vertex. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + new: + description: | + The complete newly written vertex document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + old: + description: | + The complete overwritten vertex document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '202': + description: | + Returned if the vertex can be replaced, and `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - vertex + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + vertex: + description: | + The internal attributes for the vertex. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + new: + description: | + The complete newly written vertex document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + old: + description: | + The complete overwritten vertex document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to replace vertices in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The vertex to replace does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialReplaceVertex +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +body = { + name: "Alice Cooper", + age: 26 +} +var url = "/_api/gharial/social/vertex/female/alice"; +var response = logCurlRequest('PUT', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Remove a vertex + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/vertex/{collection}/{vertex}: + delete: + operationId: deleteVertex + description: | + Removes a vertex from a collection of the named graph. Additionally removes all + incoming and outgoing edges of the vertex. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the vertex collection the vertex belongs to. + schema: + type: string + - name: vertex + in: path + required: true + description: | + The `_key` attribute of the vertex. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is deleted if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + Returned if the vertex can be removed. + content: + application/json: + schema: + type: object + required: + - error + - code + - removed + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + removed: + description: | + Is set to true if the remove was successful. + type: boolean + old: + description: | + The complete deleted vertex document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - removed + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + removed: + description: | + Is set to true if the remove was successful. + type: boolean + old: + description: | + The complete deleted vertex document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to delete vertices in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The vertex to remove does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialDeleteVertex +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/vertex/female/alice"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +## Edges + +### Create an edge + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}: + post: + operationId: createEdge + description: | + Creates a new edge in the specified collection. + Within the body the edge has to contain a `_from` and `_to` value referencing to valid vertices in the graph. + Furthermore, the edge has to be valid according to the edge definitions. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection the edge belongs to. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The body has to be a JSON object you want to store as an edge document. + type: object + required: + - _from + - _to + properties: + _from: + description: | + The source vertex of this edge. Has to be valid within + the used edge definition. + type: string + _to: + description: | + The target vertex of this edge. Has to be valid within + the used edge definition. + type: string + responses: + '201': + description: | + Returned if the edge can be created and `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + edge: + description: | + The internal attributes for the edge. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + new: + description: | + The complete newly written edge document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + edge: + description: | + The internal attributes for the edge. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + new: + description: | + The complete newly written edge document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '400': + description: | + Returned if the input document is invalid. + This can for instance be the case if the `_from` or `_to` attribute is missing + or malformed. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to insert edges into the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in any of the following cases: + - The graph cannot be found. + - The edge collection is not part of the graph. + - The vertex collection referenced in the `_from` or `_to` attribute is not part of the graph. + - The vertex collection is part of the graph, but does not exist. + - `_from` or `_to` vertex does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialAddEdge +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var url = "/_api/gharial/social/edge/relation"; +body = { + type: "friend", + _from: "female/alice", + _to: "female/diana" +}; +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Get an edge + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}/{edge}: + get: + operationId: getEdge + description: | + Gets an edge from the given collection. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection the edge belongs to. + schema: + type: string + - name: edge + in: path + required: true + description: | + The `_key` attribute of the edge. + schema: + type: string + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is returned if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: If-None-Match + in: header + required: false + description: | + If you provide an `If-None-Match` header, it must contain exactly one ETag. + The document is returned if it has a different revision as the given ETag. + Otherwise, an error with HTTP status code 304 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + Returned if the edge can be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + edge: + description: | + The complete edge. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '304': + description: | + The `If-None-Match` header has been specified and the currently + stored edge still has this revision value. There was no update since + the last time the edge was fetched by the caller. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 304 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to update vertices in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Read Only` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The edge does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialGetEdge +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var any = require("@arangodb").db.relation.any(); +var url = "/_api/gharial/social/edge/relation/" + any._key; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Update an edge + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}/{edge}: + patch: + operationId: updateEdge + description: | + Partially modify the data of the specific edge in the collection. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection the edge belongs to. + schema: + type: string + - name: edge + in: path + required: true + description: | + The `_key` attribute of the vertex. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: keepNull + in: query + required: false + description: | + Define if values set to `null` should be stored. + By default (`true`), the given documents attribute(s) are set to `null`. + If this parameter is set to `false`, top-level attribute and sub-attributes with + a `null` value in the request are removed from the document (but not attributes + of objects that are nested inside of arrays). + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is updated if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The body has to be a JSON object containing exactly the attributes + that should be overwritten. All other attributes remain unchanged. + type: object + responses: + '200': + description: | + Returned if the edge can be updated, and `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + edge: + description: | + The internal attributes for the edge. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + new: + description: | + The complete newly written edge document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + old: + description: | + The complete overwritten edge document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + edge: + description: | + The internal attributes for the edge. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + new: + description: | + The complete newly written edge document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + old: + description: | + The complete overwritten edge document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to update edges in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The edge to update does not exist. + - Either `_from` or `_to` vertex does not exist (if updated). + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialPatchEdge +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var any = require("@arangodb").db.relation.any(); +var url = "/_api/gharial/social/edge/relation/" + any._key; +body = { + since: "01.01.2001" +} +var response = logCurlRequest('PATCH', url, body); +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Replace an edge + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}/{edge}: + put: + operationId: replaceEdge + description: | + Replaces the data of an edge in the collection. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection the edge belongs to. + schema: + type: string + - name: edge + in: path + required: true + description: | + The `_key` attribute of the vertex. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: keepNull + in: query + required: false + description: | + Define if values set to `null` should be stored. + By default (`true`), the given documents attribute(s) are set to `null`. + If this parameter is set to `false`, top-level attribute and sub-attributes with + a `null` value in the request are removed from the document (but not attributes + of objects that are nested inside of arrays). + schema: + type: boolean + default: true + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: returnNew + in: query + required: false + description: | + Whether to additionally include the complete new document under the + `new` attribute in the result. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is replaced if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The body has to be a JSON object you want to replace an existing + edge document with. + type: object + required: + - _from + - _to + properties: + _from: + description: | + The source vertex of this edge. Has to be valid within + the used edge definition. + type: string + _to: + description: | + The target vertex of this edge. Has to be valid within + the used edge definition. + type: string + responses: + '201': + description: | + Returned if the request was successful but `waitForSync` is `true`. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + edge: + description: | + The internal attributes for the edge + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + new: + description: | + The complete newly written edge document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + old: + description: | + The complete overwritten edge document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - edge + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + edge: + description: | + The internal attributes for the edge + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + new: + description: | + The complete newly written edge document. + Includes all written attributes in the request body + and all internal attributes generated by ArangoDB. + Only present if `returnNew` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + old: + description: | + The complete overwritten edge document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to replace edges in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The edge to replace does not exist. + - Either `_from` or `_to` vertex does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialPutEdge +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var any = require("@arangodb").db.relation.any(); +var url = "/_api/gharial/social/edge/relation/" + any._key; +body = { + type: "divorced", + _from: "female/alice", + _to: "male/bob" +} +var response = logCurlRequest('PUT', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` + +### Remove an edge + +```openapi +paths: + /_db/{database-name}/_api/gharial/{graph}/edge/{collection}/{edge}: + delete: + operationId: deleteEdge + description: | + Removes an edge from an edge collection of the named graph. Any other edges + that directly reference this edge like a vertex are removed, too. + parameters: + # Purposefully undocumented: + # rev (use If-Match header) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: graph + in: path + required: true + description: | + The name of the graph. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the edge collection the edge belongs to. + schema: + type: string + - name: edge + in: path + required: true + description: | + The `_key` attribute of the edge. + schema: + type: string + - name: waitForSync + in: query + required: false + description: | + Define if the request should wait until synced to disk. + schema: + type: boolean + - name: returnOld + in: query + required: false + description: | + Whether to additionally include the complete previous document under the + `old` attribute in the result. + schema: + type: boolean + default: false + - name: If-Match + in: header + required: false + description: | + If you provide an `If-Match` header, it must contain exactly one ETag. + The document is deleted if it has the same revision as the given ETag. + Otherwise, an error with HTTP status code 412 is returned. + schema: + type: string + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + responses: + '200': + description: | + Returned if the edge can be removed. + content: + application/json: + schema: + type: object + required: + - error + - code + - removed + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + removed: + description: | + Is set to true if the remove was successful. + type: boolean + old: + description: | + The complete deleted edge document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '202': + description: | + Returned if the request was successful but `waitForSync` is `false`. + content: + application/json: + schema: + type: object + required: + - error + - code + - removed + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 202 + removed: + description: | + Is set to true if the remove was successful. + type: boolean + old: + description: | + The complete deleted edge document. + Includes all attributes stored before this operation. + Only present if `returnOld` is `true`. + type: object + required: + - _id + - _key + - _rev + - _from + - _to + properties: + _id: + description: | + The _id value of the stored data. + type: string + _key: + description: | + The _key value of the stored data. + type: string + _rev: + description: | + The _rev value of the stored data. + type: string + _from: + description: | + The _from value of the stored data. + type: string + _to: + description: | + The _to value of the stored data. + type: string + '403': + description: | + Returned if your user has insufficient rights. + In order to delete vertices in the graph, you need to have at least the following privileges: + - `Read Only` access on the database. + - `Write` access on the given collection. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + Returned in the following cases: + - The graph cannot be found. + - The collection is not part of the graph. + - The edge to remove does not exist. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '410': + description: | + This error occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 410 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '412': + description: | + The `If-Match` header has been specified but the stored document's + revision is different. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 412 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Graphs +``` + +**Examples** + +```curl +--- +description: '' +name: HttpGharialDeleteEdge +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +examples.loadGraph("social"); +var any = require("@arangodb").db.relation.any(); +var url = "/_api/gharial/social/edge/relation/" + any._key; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); + +logJsonResponse(response); +examples.dropGraph("social"); +``` diff --git a/site/content/arangodb/oem/develop/http-api/hot-backups.md b/site/content/arangodb/oem/develop/http-api/hot-backups.md new file mode 100644 index 0000000000..ad113828a2 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/hot-backups.md @@ -0,0 +1,695 @@ +--- +title: HTTP interface for Hot Backups +menuTitle: Hot Backups +weight: 120 +description: >- + The HTTP API for Hot Backups lets you manage incremental, zero-downtime data + backups +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +Hot Backups are near instantaneous consistent snapshots of an +**entire** ArangoDB deployment. This includes all databases, collections, +indexes, Views, graphs, and users at any given time. + +For creations a label may be specified, which if omitted +is replaced with a generated UUID. This label is then combined with a +timestamp to generate an identifier for the created +hot backup. Subsequently, all other APIs operate on these identifiers. + +{{< warning >}} +Make sure to understand all aspects of [Hot Backups](../../operations/backup-and-restore.md#hot-backups), +most of all the [requirements and limitations](../../operations/backup-and-restore.md#hot-backup-limitations), +before using the API. +{{< /warning >}} + +The permissions required to use the `/_admin/backup/*` endpoints depends on the +setting of the [`--backup.options-api` startup option](../../components/arangodb-server/options.md#--serveroptions-api). + +## Create a backup + +```openapi +paths: + /_admin/backup/create: + # Independent of database + post: + operationId: createBackup + description: | + Creates a consistent local backup "as soon as possible", very much + like a snapshot in time, with a given label. The ambiguity in the + phrase "as soon as possible" refers to the next window during which a + global write lock across all databases can be obtained in order to + guarantee consistency. Note that the backup at first resides on the + same machine and hard drive as the original data. Make sure to upload + it to a remote site for an actual backup. + requestBody: + content: + application/json: + schema: + type: object + properties: + label: + description: | + The label for this backup. The label is used together with a + timestamp string create a unique backup identifier, `<timestamp>_<label>`. + If no label is specified, the empty string is assumed and a default + UUID is created for this part of the ID. + type: string + timeout: + description: | + The time in seconds that the operation tries to get a consistent + snapshot. + type: integer + default: 120 + allowInconsistent: + description: | + If this flag is set to `true` and no global transaction lock can be + acquired within the given timeout, a possibly inconsistent backup + is taken. The default for this flag is `false` and in this case + a timeout results in an HTTP 408 error. + type: boolean + default: false + force: + description: | + If this flag is set to `true` and no global transaction lock can be acquired + within the given timeout, all running transactions are forcefully aborted to + ensure that a consistent backup can be created. This does not include + JavaScript transactions. It waits for the transactions to be aborted at most + `timeout` seconds. Thus using `force` the request timeout is doubled. + To abort transactions is almost certainly not what you want for your application. + In the presence of intermediate commits it can even destroy the atomicity of your + transactions. Use at your own risk, and only if you need a consistent backup at + all costs. The default and recommended value is `false`. If both + `allowInconsistent` and `force` are set to `true`, then the latter takes + precedence and transactions are aborted. This is only available in the cluster. + type: boolean + default: false + responses: + '201': + description: | + If all is well, code 201 is returned. + '400': + description: | + If the create command is invoked with bad parameters or any HTTP + method other than `POST`, then an *HTTP 400* is returned. The specifics + are detailed in the returned error document. + '408': + description: | + If the operation cannot obtain a global transaction lock + within the timeout, then an *HTTP 408* is returned. + tags: + - Hot Backups +``` + +**Examples** + +```curl +--- +description: '' +name: RestBackupCreateBackup +--- +var url = "/_admin/backup/create"; +var body = { + label: "foo" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +body = { + error:false, code:201, + result: { + id: "2019-04-28T12.00.00Z_foo" + } +}; +``` + +## Restore a backup + +```openapi +paths: + /_admin/backup/restore: + # Independent of database + post: + operationId: restoreBackup + description: | + Restores a consistent local backup from a + snapshot in time, with a given id. The backup snapshot must reside on + the ArangoDB service locally. + requestBody: + content: + application/json: + schema: + type: object + required: + - id + properties: + id: + description: | + The id of the backup to restore from. + type: string + responses: + '200': + description: | + Is returned if the backup could be restored. Note that there is an + inevitable discrepancy between the single server and the cluster. In a + single server, the request returns successfully, but the restore is + only executed afterwards. In the cluster, the request only returns when + the restore operation has been completed successfully. The cluster + behavior is obviously the desired one, but in a single instance, one + cannot keep a connection open across a restart. + '400': + description: | + If the restore command is invoked with bad parameters or any HTTP + method other than `POST`, then an *HTTP 400* is returned. The specifics + are detailed in the returned error document. + tags: + - Hot Backups +``` + +**Examples** + +```curl +--- +description: '' +name: RestBackupRestoreBackup +--- +var backup = require("@arangodb/hotbackup").create(); +var url = "/_admin/backup/restore"; +var body = { + id: backup.id +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +body = { + error: false, code: 200, + result: { + "previous":"FAILSAFE", "isCluster":false + } +}; +// Need to wait for restore to have happened, then need to try any +// request to reestablish connectivity such that the next request +// will work again: +var startTime = require("internal").time(); +var failureSeen = false; +while (require("internal").time() - startTime < 10) { + try { + // GET can throw exceptions + var r = internal.arango.GET("/_api/version"); + if (r.error === true) { + failureSeen = true; + } else { + if (failureSeen) { + break; + } + } + } catch(err) { + } + require("internal").wait(0.1); +} +``` + +## Delete a backup + +```openapi +paths: + /_admin/backup/delete: + # Independent of database + post: + operationId: deleteBackup + description: | + Delete a specific local backup identified by the given `id`. + requestBody: + content: + application/json: + schema: + type: object + required: + - id + properties: + id: + description: | + The identifier for this backup. + type: string + responses: + '200': + description: | + If all is well, this code 200 is returned. + '400': + description: | + If the delete command is invoked with bad parameters or any HTTP + method other than `POST`, then an *HTTP 400* is returned. + '404': + description: | + If a backup corresponding to the identifier `id` cannot be found. + tags: + - Hot Backups +``` + +**Examples** + +```curl +--- +description: '' +name: RestBackupDeleteBackup +--- +var backup = require("@arangodb/hotbackup").create(); +var url = "/_admin/backup/delete"; +var body = {"id" : backup.id}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +body = { + result: { + } +}; +``` + +## List all backups + +```openapi +paths: + /_admin/backup/list: + # Independent of database + post: + operationId: listBackups + description: | + Lists all locally found backups. + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + description: | + The body can either be empty (in which case all available backups are + listed), or it can be an object with an attribute `id`, which + is a string. In the latter case the returned list + is restricted to the backup with the given id. + type: string + responses: + '200': + description: | + If all is well, code 200 is returned. + '400': + description: | + If the list command is invoked with bad parameters, then an *HTTP 400* + is returned. + '404': + description: | + If an `id` or a list of ids was given and the given ids were not found + as identifiers of a backup, an *HTTP 404 Not Found* is returned. + '405': + description: | + If the list command is invoked with any HTTP + method other than `POST`, then an *HTTP 405 Method Not Allowed* is returned. + tags: + - Hot Backups +``` + +**Examples** + +```curl +--- +description: '' +name: RestBackupListBackup +--- +var backup = require("@arangodb/hotbackup").create(); +var backup2 = require("@arangodb/hotbackup").create(); +var url = "/_admin/backup/list"; +var body = {}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +body = { + result: { + list: { + "2019-04-28T12.00.00Z_my-label": { + "id": "2019-04-28T12.00.00Z_my-label", + "version": "3.4.5", + "datetime": "2019-04-28T12.00.00Z", + "keys": [ {"sha256": "861009ec4d599fab1f40abc76e6f89880cff5833c79c548c99f9045f191cd90b"} ] + }, + "2019-04-28T12.10.00Z-other-label": { + "id": "2019-04-28T12.10.00Z-other-label", + "version": "3.4.5", + "datetime": "2019-04-28T12.10.00Z", + "keys": [ {"sha256": "861009ed4d599fab1f40abc76e6f89880cff5833c79c548c99f9045f191cd90b"} ] + } + } + } +}; +``` + +## Upload a backup to a remote repository + +```openapi +paths: + /_admin/backup/upload: + # Independent of database + post: + operationId: uploadBackup + description: | + Upload a specific local backup to a remote repository, or query + progress on a previously scheduled upload operation, or abort + a running upload operation. + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + description: | + The identifier for this backup. This is required when an upload + operation is scheduled. In this case leave out the `uploadId` + attribute. + type: string + remoteRepository: + description: | + URL of remote repository. This is required when an upload operation is + scheduled. In this case leave out the `uploadId` attribute. Provided repository + URLs are normalized and validated as follows: One single colon must appear + separating the configuration section name and the path. The URL prefix up to + the colon must exist as a key in the config object below. No slashes must + appear before the colon. Multiple back to back slashes are collapsed to one, as + `..` and `.` are applied accordingly. Local repositories must be absolute + paths and must begin with a `/`. Trailing `/` are removed. + type: string + config: + description: | + Configuration of remote repository. This is required when an upload + operation is scheduled. In this case leave out the `uploadId` + attribute. See [Rclone Configuration](../../components/tools/arangobackup/examples/#rclone-configuration) + for a description of the `config` object. + type: object + uploadId: + description: | + Upload ID to specify for which upload operation progress is queried or + the upload operation to abort. + If you specify this, leave out all the above body parameters. + type: string + abort: + description: | + Set this to `true` if a running upload operation should be aborted. In + this case, the only other body parameter which is needed is `uploadId`. + type: boolean + default: false + responses: + '200': + description: | + If all is well, code 200 is returned if progress is inquired or the + operation is aborted. + '202': + description: | + If all is well, code 202 is returned if a new operation is scheduled. + '400': + description: | + If the upload command is invoked with bad parameters or any HTTP + method other than `POST`, then an *HTTP 400* is returned. + '401': + description: | + If the authentication to the remote repository fails, then an *HTTP + 400* is returned. + '404': + description: | + If a backup corresponding to the identifier `id` cannot be found, or if + there is no known upload operation with the given `uploadId`. + tags: + - Hot Backups +``` + +**Examples** + +```curl +--- +description: '' +name: RestBackupUploadBackup +--- +try { + require("fs").makeDirectory("/tmp/backups"); +} catch(e) { +} +var backup = require("@arangodb/hotbackup").create(); +var url = "/_admin/backup/upload"; +var body = {"id" : backup.id, + "remoteRepository": "local://tmp/backups", + "config": { + "local": { + "type":"local" + } + } + }; +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +body = { + result: { + uploadId: "10046" + } +}; +``` + +```curl +--- +description: |- + The `result` object of the body holds the `uploadId` string attribute which can + be used to follow the upload process. +name: RestBackupUploadBackupStarted +--- +try { + require("fs").makeDirectory("/tmp/backups"); +} catch(e) { +} +var backup = internal.arango.POST("/_admin/backup/create",""); +var body = {"id" : backup.result.id, + "remoteRepository": "local://tmp/backups", + "config": { + "local": { + "type":"local" + } + } + }; +var upload = internal.arango.POST("/_admin/backup/upload",body); +var url = "/_admin/backup/upload"; +var body = {"uploadId" : upload.result.uploadId}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +body = { + "result": { + "Timestamp": "2019-05-14T14:50:56Z", + "BackupId": "2019-05-01T00.00.00Z_some-label", + "DBServers": { + "SNGL": { + "Status": "COMPLETED" + } + } + } +}; +``` + +## Download a backup from a remote repository + +```openapi +paths: + /_admin/backup/download: + # Independent of database + post: + operationId: downloadBackup + description: | + Download a specific local backup from a remote repository, or query + progress on a previously scheduled download operation, or abort + a running download operation. + requestBody: + content: + application/json: + schema: + type: object + required: + - remoteRepository + - config + properties: + id: + description: | + The identifier for this backup. This is required when a download + operation is scheduled. In this case leave out the `downloadId` + attribute. + type: string + remoteRepository: + description: | + URL of remote repository. This is required when a download operation is + scheduled. In this case leave out the `downloadId` attribute. Provided + repository URLs are normalized and validated as follows: One single colon must + appear separating the configuration section name and the path. The URL prefix + up to the colon must exist as a key in the config object below. No slashes must + appear before the colon. Multiple back to back slashes are collapsed to one, as + `..` and `.` are applied accordingly. Local repositories must be absolute paths + and must begin with a `/`. Trailing `/` are removed. + type: string + config: + description: | + Configuration of remote repository. This is required when a download + operation is scheduled. In this case leave out the `downloadId` + attribute. See [Rclone Configuration](../../components/tools/arangobackup/examples/#rclone-configuration) + for a description of the `config` object. + type: object + downloadId: + description: | + Download ID to specify for which download operation progress is queried, or + the download operation to abort. + If you specify this, leave out all the above body parameters. + type: string + abort: + description: | + Set this to `true` if a running download operation should be aborted. In + this case, the only other body parameter which is needed is `downloadId`. + type: boolean + default: false + responses: + '200': + description: | + If all is well, code 200 is returned if progress is inquired or the + operation is aborted. + '202': + description: | + If all is well, code 202 is returned if a new operation is scheduled. + '400': + description: | + If the download command is invoked with bad parameters or any HTTP + method other than `POST`, then an *HTTP 400* is returned. + '401': + description: | + If the authentication to the remote repository fails, then an *HTTP + 401* is returned. + '404': + description: | + If a backup corresponding to the identifier `id` cannot be found, or if + there is no known download operation with the given `downloadId`. + tags: + - Hot Backups +``` + +**Examples** + +```curl +--- +description: '' +name: RestBackupDownloadBackup +--- +var hotbackup = require("@arangodb/hotbackup"); +try { + require("fs").makeDirectory("/tmp/backups"); +} catch(e) { +} +var backup = hotbackup.create(); +var upload = hotbackup.upload(backup.id, "local://tmp/backups", + {local:{type:"local"}}); +// Wait until upload complete: +for (var count = 0; count < 30; ++count) { + var progress = hotbackup.uploadProgress(upload.uploadId); + try { + if (progress.DBServers.SNGL.Status === "COMPLETED") { + break; + } + } catch(e) { + } + internal.wait(0.5); +} +hotbackup.delete(backup.id); +var url = "/_admin/backup/download"; +body = {"id" : backup.id, + "remoteRepository": "local://tmp/backups", + "config": { + "local": { + "type":"local" + } + } + }; +var response = logCurlRequest('POST', url, body); + +assert(response.code === 202); + +logJsonResponse(response); +body = { + result: { + downloadId: "10046" + } +}; +``` + +```curl +--- +description: |- + The `result` object of the body holds the `downloadId` string attribute which + can be used to follow the download process. +name: RestBackupDownloadBackupStarted +--- +var hotbackup = require("@arangodb/hotbackup"); +try { + require("fs").makeDirectory("/tmp/backups"); +} catch(e) { +} +var backup = hotbackup.create(); +var body = {"id" : backup.id, + "remoteRepository": "local://tmp/backups", + "config": { + "local": { + "type":"local" + } + } + }; +var upload = hotbackup.upload(backup.id, "local://tmp/backups", + {local:{type:"local"}}); +// Wait until upload complete: +for (var count = 0; count < 30; ++count) { + var progress = hotbackup.uploadProgress(upload.uploadId); + try { + if (progress.DBServers.SNGL.Status === "COMPLETED") { + break; + } + } catch(e) { + } + internal.wait(0.5); +} +hotbackup.delete(backup.id); +var download = hotbackup.download(backup.id, "local://tmp/backups", + {local:{type:"local"}}); + +body = {"downloadId" : download.downloadId}; +var url = "/_admin/backup/download"; +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +body = { + "result": { + "Timestamp": "2019-05-14T14:50:56Z", + "BackupId": "2019-05-01T00.00.00Z_some-label", + "DBServers": { + "SNGL": { + "Status": "COMPLETED" + } + } + } +}; +``` diff --git a/site/content/arangodb/oem/develop/http-api/import.md b/site/content/arangodb/oem/develop/http-api/import.md new file mode 100644 index 0000000000..8d1140f564 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/import.md @@ -0,0 +1,606 @@ +--- +title: HTTP interface for data import +menuTitle: Import +weight: 70 +description: >- + The Import HTTP API allows you to load JSON data in bulk into ArangoDB +--- +## Import JSON data as documents + +```openapi +paths: + /_db/{database-name}/_api/import: + post: + operationId: importData + description: | + Load JSON data and store it as documents into the specified collection. + + If you import documents into edge collections, all documents require a `_from` + and a `_to` attribute. + requestBody: + content: + 'text/plain; charset=utf-8': + schema: + description: | + The request body can have different JSON formats depending on + the `type` parameter: + - One JSON object per line (JSONL) + - A JSON array of objects + - One JSON array per line (CSV-like) + parameters: + # Purposefully undocumented: + # line (compensate for arangoimport --skip-lines in error messages) + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The name of the target collection. The collection needs to exist already. + schema: + type: string + - name: type + in: query + required: false + description: | + Determines how the body of the request is interpreted. + + - `documents`: JSON Lines (JSONL) format. Each line is expected to be one + JSON object. + + Example: + + ```json + {"_key":"john","name":"John Smith","age":35} + {"_key":"katie","name":"Katie Foster","age":28} + ``` + + - `array` (or `list`): JSON format. The request body is expected to be a + JSON array of objects. This format requires ArangoDB to parse the complete + array and keep it in memory for the duration of the import. This is more + resource-intensive than the line-wise JSONL processing. + + Any whitespace outside of strings is ignored, which means the JSON data can be + a single line or be formatted as multiple lines. + + Example: + + ```json + [ + {"_key":"john","name":"John Smith","age":35}, + {"_key":"katie","name":"Katie Foster","age":28} + ] + ``` + + - `auto`: automatically determines the type (either `documents` or `array`). + + - Omit the `type` parameter entirely (or set it to an empty string) + to import JSON arrays of tabular data, similar to CSV. + + The first line is an array of strings that defines the attribute keys. The + subsequent lines are arrays with the attribute values. The keys and values + are matched by the order of the array elements. + + Example: + + ```json + ["_key","name","age"] + ["john","John Smith",35] + ["katie","Katie Foster",28] + ``` + schema: + type: string + enum: ["", documents, array, auto] + default: "" + - name: ignoreMissing + in: query + required: false + description: | + When importing JSON arrays of tabular data (`type` parameter is omitted), + the first line of the request body defines the attribute keys and the + subsequent lines the attribute values for each document. Subsequent lines + with a different number of elements than the first line are not imported + by default. + + ```js + ["attr1", "attr2"] + [1, 2] // matching number of elements + [1] // misses 2nd element + [1, 2, 3] // excess 3rd element + ``` + + You can enable this option to import them anyway. For the missing elements, + the document attributes are omitted. Excess elements are ignored. + schema: + type: boolean + default: false + - name: fromPrefix + in: query + required: false + description: | + The collection name prefix to prepend to all values in the `_from` + attribute that only specify a document key. + schema: + type: string + - name: toPrefix + in: query + required: false + description: | + The collection name prefix to prepend to all values in the `_to` + attribute that only specify a document key. + schema: + type: string + - name: overwriteCollectionPrefix + in: query + required: false + description: | + Force the `fromPrefix` and `toPrefix`, possibly replacing existing + collection name prefixes. + schema: + type: boolean + default: false + - name: overwrite + in: query + required: false + description: | + If enabled, then all data in the collection is removed prior to the + import. Any existing index definitions are preserved. + schema: + type: boolean + default: false + - name: waitForSync + in: query + required: false + description: | + Wait until documents have been synced to disk before returning. + schema: + type: boolean + default: false + - name: onDuplicate + in: query + required: false + description: | + Controls what action is carried out in case of a unique key constraint + violation. + + - `error`: this will not import the current document because of the unique + key constraint violation. This is the default setting. + - `update`: this will update an existing document in the database with the + data specified in the request. Attributes of the existing document that + are not present in the request will be preserved. + - `replace`: this will replace an existing document in the database with the + data specified in the request. + - `ignore`: this will not update an existing document and simply ignore the + error caused by a unique key constraint violation. + + Note that `update`, `replace` and `ignore` will only work when the + import document in the request contains the `_key` attribute. `update` and + `replace` may also fail because of secondary unique key constraint violations. + schema: + type: string + enum: [error, update, replace, ignore] + default: error + - name: complete + in: query + required: false + description: | + If set to `true`, the whole import fails if any error occurs. Otherwise, the + import continues even if some documents are invalid and cannot be imported, + skipping the problematic documents. + schema: + type: boolean + default: false + - name: details + in: query + required: false + description: | + If set to `true`, the result includes a `details` attribute with information + about documents that could not be imported. + schema: + type: boolean + default: false + responses: + '201': + description: | + is returned if all documents could be imported successfully. + + The response is a JSON object with the following attributes: + content: + application/json: + schema: + type: object + required: + - created + - errors + - empty + - updated + - ignored + properties: + created: + description: | + The number of imported documents. + type: integer + errors: + description: | + The number of documents that were not imported due to errors. + type: integer + empty: + description: | + The number of empty lines found in the input. Only greater than zero for the + types `documents` and `auto`. + type: integer + updated: + description: | + The number of updated/replaced documents. Only greater than zero if `onDuplicate` + is set to either `update` or `replace`. + type: integer + ignored: + description: | + The number of failed but ignored insert operations. Only greater than zero if + `onDuplicate` is set to `ignore`. + type: integer + details: + description: | + An array with the error messages caused by documents that could not be imported. + Only present if `details` is set to `true`. + type: array + items: + type: string + '400': + description: | + The `type` contains an invalid value, no `collection` is + specified, the documents are incorrectly encoded, or the request + is malformed. + '404': + description: | + The `collection` parameter or the `_from` or `_to` attributes of an + imported edge refer to an unknown collection. + '409': + description: | + The `complete` option is enabled and the import triggers a + unique key violation. + '500': + description: | + The `complete` option is enabled and the input is invalid, + or the server cannot auto-generate a document key (out of keys error) + for a document with no user-defined key. + tags: + - Import +``` + +**Examples** + +```curl +--- +description: |- + Importing documents with heterogenous attributes from an array of JSON objects: +name: RestImportJsonList +--- +db._flushCache(); +var cn = "products"; +db._drop(cn); +db._create(cn); +db._flushCache(); + +var body = [ + { _key: "abc", value1: 25, value2: "test", allowed: true }, + { _key: "foo", name: "baz" }, + { name: { detailed: "detailed name", short: "short name" } } +]; + +var response = logCurlRequest('POST', "/_api/import?collection=" + cn + "&type=list", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 3); +assert(response.parsedBody.errors === 0); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Importing documents using JSON objects separated by new lines (JSONL): +name: RestImportJsonLines +--- +db._flushCache(); +var cn = "products"; +db._drop(cn); +db._create(cn); +db._flushCache(); + +var body = '{ "_key": "abc", "value1": 25, "value2": "test",' + + '"allowed": true }\n' + + '{ "_key": "foo", "name": "baz" }\n\n' + + '{ "name": {' + + ' "detailed": "detailed name", "short": "short name" } }\n'; +var response = logCurlRequest('POST', "/_api/import?collection=" + cn + "&type=documents", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 3); +assert(response.parsedBody.errors === 0); +assert(response.parsedBody.empty === 1); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using the `auto` type detection: +name: RestImportJsonType +--- +db._flushCache(); +var cn = "products"; +db._drop(cn); +db._create(cn); +db._flushCache(); + +var body = [ + { _key: "abc", value1: 25, value2: "test", allowed: true }, + { _key: "foo", name: "baz" }, + { name: { detailed: "detailed name", short: "short name" } } +]; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&type=auto", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 3); +assert(response.parsedBody.errors === 0); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Importing JSONL into an edge collection, with `_from`, `_to` and `name` + attributes: +name: RestImportJsonEdge +--- +db._flushCache(); +var cn = "links"; +db._drop(cn); +db._createEdgeCollection(cn); +db._drop("products"); +db._create("products"); +db._flushCache(); + +var body = '{ "_from": "products/123", "_to": "products/234" }\n' + + '{"_from": "products/332", "_to": "products/abc", ' + + ' "name": "other name" }'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&type=documents", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 2); +assert(response.parsedBody.errors === 0); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +db._drop("products"); +``` + +```curl +--- +description: |- + Importing an array of JSON objects into an edge collection, + omitting `_from` or `_to`: +name: RestImportJsonEdgeInvalid +--- +db._flushCache(); +var cn = "links"; +db._drop(cn); +db._createEdgeCollection(cn); +db._flushCache(); + +var body = [ { name: "some name" } ]; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&type=list&details=true", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 0); +assert(response.parsedBody.errors === 1); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Violating a unique constraint, but allowing partial imports: +name: RestImportJsonUniqueContinue +--- +var cn = "products"; +db._drop(cn); +db._create(cn); +db._flushCache(); + +var body = '{ "_key": "abc", "value1": 25, "value2": "test" }\n' + + '{ "_key": "abc", "value1": "bar", "value2": "baz" }'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn ++ "&type=documents&details=true", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 1); +assert(response.parsedBody.errors === 1); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Violating a unique constraint, not allowing partial imports: +name: RestImportJsonUniqueFail +--- +var cn = "products"; +db._drop(cn); +db._create(cn); +db._flushCache(); + +var body = '{ "_key": "abc", "value1": 25, "value2": "test" }\n' + + '{ "_key": "abc", "value1": "bar", "value2": "baz" }'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&type=documents&complete=true", body); + +assert(response.code === 409); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using a non-existing collection: +name: RestImportJsonInvalidCollection +--- +var cn = "products"; +db._drop(cn); + +var body = '{ "name": "test" }'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&type=documents", body); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Using a malformed body with an array of JSON objects being expected: +name: RestImportJsonInvalidBody +--- +var cn = "products"; +db._drop(cn); +db._create(cn); +db._flushCache(); + +var body = '{ }'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&type=list", body); + +assert(response.code === 400); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Importing two documents using the JSON arrays format. The documents have a + `_key`, `value1`, and `value2` attribute each. One line in the import data is + empty and skipped: +name: RestImportCsvExample +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var body = '[ "_key", "value1", "value2" ]\n' + + '[ "abc", 25, "test" ]\n\n' + + '[ "foo", "bar", "baz" ]'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn, body); + +assert(response.code === 201); +assert(response.parsedBody.created === 2); +assert(response.parsedBody.errors === 0); +assert(response.parsedBody.empty === 1); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Importing JSON arrays into an edge collection, with `_from`, `_to`, and `name` + attributes: +name: RestImportCsvEdge +--- +var cn = "links"; +db._drop(cn); +db._createEdgeCollection(cn); +db._drop("products"); +db._create("products"); + +var body = '[ "_from", "_to", "name" ]\n' + + '[ "products/123","products/234", "some name" ]\n' + + '[ "products/332", "products/abc", "other name" ]'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn, body); + +assert(response.code === 201); +assert(response.parsedBody.created === 2); +assert(response.parsedBody.errors === 0); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +db._drop("products"); +``` + +```curl +--- +description: |- + Importing JSON arrays into an edge collection, omitting `_from` or `_to`: +name: RestImportCsvEdgeInvalid +--- +var cn = "links"; +db._drop(cn); +db._createEdgeCollection(cn); + +var body = '[ "name" ]\n[ "some name" ]\n[ "other name" ]'; + +var response = logCurlRequestRaw('POST', "/_api/import?collection=" + cn + "&details=true", body); + +assert(response.code === 201); +assert(response.parsedBody.created === 0); +assert(response.parsedBody.errors === 2); +assert(response.parsedBody.empty === 0); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using a malformed body with JSON arrays being expected: +name: RestImportCsvInvalidBody +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var body = '{ "_key": "foo", "value1": "bar" }'; + +var response = logCurlRequest('POST', "/_api/import?collection=" + cn, body); + +assert(response.code === 400); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/_index.md b/site/content/arangodb/oem/develop/http-api/indexes/_index.md new file mode 100644 index 0000000000..a35384f3d0 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/_index.md @@ -0,0 +1,353 @@ +--- +title: HTTP interface for indexes +menuTitle: Indexes +weight: 55 +description: >- + The HTTP API for indexes lets you create, delete, and list indexes +# Undocumented on purpose: +# POST /_api/index/sync-caches (internal) +--- +## Addresses of indexes + +All indexes in ArangoDB have a unique identifier. It identifies an +index within a collection and is managed by ArangoDB. The full identifier +is prefixed with a collection name and a forward slash (`/`) to identify an +index within a database. + +``` +http://server:port/_api/index/<collection-name>/<index-identifier> +``` + +For example, assume that the full index identifier is `demo/63563528`, then the +URL of that index is as follows: + +``` +http://localhost:8529/_api/index/demo/63563528 +``` + +## List all indexes of a collection + +```openapi +paths: + /_db/{database-name}/_api/index: + get: + operationId: listIndexes + description: | + Returns an object with an `indexes` attribute containing an array of all + index descriptions for the given collection. The same information is also + available in the `identifiers` attribute as an object with the index identifiers + as object keys. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + - name: withStats + in: query + required: false + description: | + Whether to include figures and estimates in the result. + schema: + type: boolean + default: false + - name: withHidden + in: query + required: false + description: | + Whether to include hidden indexes in the result. Internal indexes + (such as `arangosearch`) and ones that are currently built in the + background are hidden. + schema: + type: boolean + default: false + responses: + '200': + description: | + returns a JSON object containing a list of indexes on that collection. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Return information about all indexes +name: RestIndexAllIndexes +--- +var cn = "products"; +db._drop(cn); +db._create(cn); +db[cn].ensureIndex({ type: "persistent", fields: ["name"] }); +db[cn].ensureIndex({ type: "persistent", fields: ["price"], sparse: true }); + +var url = "/_api/index?collection=" + cn; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +## Get an index + +```openapi +paths: + /_db/{database-name}/_api/index/{index-id}: + get: + operationId: getIndex + description: | + The result is an object describing the index. It has at least the following + attributes: + + - `id`: the identifier of the index + + - `type`: the index type + + All other attributes are type-dependent. For example, some indexes provide + `unique` or `sparse` flags, whereas others don't. Some indexes also provide + a selectivity estimate in the `selectivityEstimate` attribute of the result. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: index-id + in: path + required: true + description: | + The index identifier. + schema: + type: string + responses: + '200': + description: | + If the index exists, then a *HTTP 200* is returned. + '404': + description: | + If the index does not exist, then a *HTTP 404* + is returned. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: '' +name: RestIndexPrimaryIndex +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index/" + cn + "/0"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +## Create an index + +```openapi +paths: + /_db/{database-name}/_api/index: + post: + operationId: createIndex + description: | + Creates a new index in the collection `collection`. Expects + an object containing the index details. + + The type of the index to be created must specified in the **type** + attribute of the index details. Depending on the index type, additional + other attributes may need to specified in the request in order to create + the index. + + Indexes require the to be indexed attribute(s) in the **fields** attribute + of the index details. Depending on the index type, a single attribute or + multiple attributes can be indexed. In the latter case, an array of + strings is expected. + + The `.` character denotes sub-attributes in attribute paths. Attributes with + literal `.` in their name cannot be indexed. Attributes with the name `_id` + cannot be indexed either, neither as a top-level attribute nor as a sub-attribute. + + Optionally, an index name may be specified as a string in the **name** attribute. + Index names have the same restrictions as collection names. If no value is + specified, one will be auto-generated. + + Persistent indexes (including vertex-centric indexes) can be created as unique + or non-unique variants. Uniqueness can be controlled by specifying the + **unique** option for the index definition. Setting it to `true` creates a + unique index. Setting it to `false` or omitting the `unique` attribute creates a + non-unique index. + + {{</* info */>}} + Unique indexes on non-shard keys are not supported in cluster deployments. + {{</* /info */>}} + + Persistent indexes can optionally be created in a sparse + variant. A sparse index will be created if the **sparse** attribute in + the index details is set to `true`. Sparse indexes do not index documents + for which any of the index attributes is either not set or is `null`. + + The optional **deduplicate** attribute is supported by persistent array indexes. + It controls whether inserting duplicate index values + from the same document into a unique array index will lead to a unique constraint + error or not. The default value is `true`, so only a single instance of each + non-unique index value will be inserted into the index per document. Trying to + insert a value into the index that already exists in the index always fails, + regardless of the value of this attribute. + + The optional **estimates** attribute is supported by `persistent`, `mdi`, and + `mdi-prefixed` indexes. This attribute controls whether index selectivity estimates are + maintained for the index. Not maintaining index selectivity estimates can have + a slightly positive impact on write performance. + The downside of turning off index selectivity estimates will be that + the query optimizer will not be able to determine the usefulness of different + competing indexes in AQL queries when there are multiple candidate indexes to + choose from. + The `estimates` attribute is optional and defaults to `true` if not set. It will + have no effect on indexes other than persistent indexes. + + The optional attribute **cacheEnabled** is supported by indexes of type + `persistent`. This attribute controls whether an extra in-memory hash cache is + created for the index. The hash cache can be used to speed up index lookups. + The cache can only be used for queries that look up all index attributes via + an equality lookup (`==`). The hash cache cannot be used for range scans, + partial lookups or sorting. + The cache will be populated lazily upon reading data from the index. Writing data + into the collection or updating existing data will invalidate entries in the + cache. The cache may have a negative effect on performance in case index values + are updated more often than they are read. + The maximum size of cache entries that can be stored is currently 4 MB, i.e. + the cumulated size of all index entries for any index lookup value must be + less than 4 MB. This limitation is there to avoid storing the index entries + of "super nodes" in the cache. + `cacheEnabled` defaults to `false` and should only be used for indexes that + are known to benefit from an extra layer of caching. + + The optional attribute **inBackground** can be set to `true` to keep the + collection/shards available for write operations by not using an exclusive + write lock for the duration of the index creation. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The options for the index. The available attributes depend on the index type. + type: object + responses: + '200': + description: | + If the index already exists, then an *HTTP 200* is returned. + '201': + description: | + If the index does not already exist and could be created, then an *HTTP 201* + is returned. + '400': + description: | + If an invalid index description is posted or attributes are used that the + target index will not support, then an *HTTP 400* is returned. + '404': + description: | + If `collection` is unknown, then an *HTTP 404* is returned. + tags: + - Indexes +``` + +## Delete an index + +```openapi +paths: + /_db/{database-name}/_api/index/{index-id}: + delete: + operationId: deleteIndex + description: | + Deletes an index with `index-id`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: index-id + in: path + required: true + description: | + The index id. + schema: + type: string + responses: + '200': + description: | + If the index could be deleted, then an *HTTP 200* is + returned. + '404': + description: | + If the `index-id` is unknown, then an *HTTP 404* is returned. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: '' +name: RestIndexDeleteUniquePersistent +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index/" + db.products.ensureIndex({ type: "persistent", fields: ["a", "b"] }).id; + +var response = logCurlRequest('DELETE', url); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/fulltext.md b/site/content/arangodb/oem/develop/http-api/indexes/fulltext.md new file mode 100644 index 0000000000..318f73ba75 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/fulltext.md @@ -0,0 +1,120 @@ +--- +title: HTTP interface for full-text indexes +menuTitle: Fulltext +weight: 30 +description: '' +--- +## Create a full-text index + +```openapi +paths: + /_db/{database-name}/_api/index#fulltext: + post: + operationId: createIndexFulltext + description: | + {{</* warning */>}} + The fulltext index type is deprecated from version 3.10 onwards. + {{</* /warning */>}} + + Creates a fulltext index for the collection `collection-name`, if + it does not already exist. The call expects an object containing the index + details. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - type + - fields + - minLength + properties: + type: + description: | + Must be equal to `"fulltext"`. + type: string + example: fulltext + name: + description: | + An easy-to-remember name for the index to look it up or refer to it in index hints. + Index names are subject to the same character restrictions as collection names. + If omitted, a name is auto-generated so that it is unique with respect to the + collection, e.g. `idx_832910498`. + type: string + fields: + description: | + A list with exactly one attribute path. + type: array + minItems: 1 + maxItems: 1 + items: + type: string + minLength: + description: | + Minimum character length of words to index. The default is + low, thus it is recommended to set this value explicitly + when creating the index. + type: integer + default: 2 + inBackground: + description: | + Set this option to `true` to keep the collection/shards available for + write operations by not using an exclusive write lock for the duration + of the index creation. + type: boolean + default: false + responses: + '200': + description: | + The index exists already. + '201': + description: | + The index is created as there is no such existing index. + '404': + description: | + The collection is unknown. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Creating a fulltext index +name: RestIndexCreateNewFulltext +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "fulltext", + fields: [ "text" ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/geo-spatial.md b/site/content/arangodb/oem/develop/http-api/indexes/geo-spatial.md new file mode 100644 index 0000000000..4d1eac25ed --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/geo-spatial.md @@ -0,0 +1,173 @@ +--- +title: HTTP interface for geo-spatial indexes +menuTitle: Geo-Spatial +weight: 25 +description: '' +--- +## Create a geo-spatial index + +```openapi +paths: + /_db/{database-name}/_api/index#geo: + post: + operationId: createIndexGeo + description: | + Creates a geo-spatial index in the collection `collection`, if + it does not already exist. + + Geo indexes are always sparse, meaning that documents that do not contain + the index attributes or have non-numeric values in the index attributes + will not be indexed. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - type + - fields + properties: + type: + description: | + Must be equal to `"geo"`. + type: string + example: geo + name: + description: | + An easy-to-remember name for the index to look it up or refer to it in index hints. + Index names are subject to the same character restrictions as collection names. + If omitted, a name is auto-generated so that it is unique with respect to the + collection, e.g. `idx_832910498`. + type: string + fields: + description: | + An array with one or two attribute paths. + + If it is an array with one attribute path `location`, then a geo-spatial + index on all documents is created using `location` as path to the + coordinates. The value of the attribute must be an array with at least two + double values. The array must contain the latitude (first value) and the + longitude (second value). All documents, which do not have the attribute + path or with value that are not suitable, are ignored. + + If it is an array with two attribute paths `latitude` and `longitude`, + then a geo-spatial index on all documents is created using `latitude` + and `longitude` as paths the latitude and the longitude. The values of + the `latitude` and `longitude` attributes must each be a number (double). + All documents which do not have the attribute paths or which have + values that are not suitable are ignored. + type: array + minItems: 1 + maxItems: 2 + uniqueItems: true + items: + type: string + geoJson: + description: | + If you create a geo-spatial index over a single attribute and `geoJson` + is `true`, then the coordinate order within the attribute's array is + longitude followed by latitude. This corresponds to the format described in + <http://geojson.org/geojson-spec.html#positions> + type: boolean + default: false + legacyPolygons: + description: | + If `geoJson` is set to `true`, then this option controls how GeoJSON Polygons + are interpreted. + + - If `legacyPolygons` is `true`, the smaller of the two regions defined by a + linear ring is interpreted as the interior of the ring and a ring can at most + enclose half the Earth's surface. + - If `legacyPolygons` is `false`, the area to the left of the boundary ring's + path is considered to be the interior and a ring can enclose the entire + surface of the Earth. + + The default is `true` for geo indexes that were created in versions before 3.10, + and `false` for geo indexes created in 3.10 or later. + type: boolean + inBackground: + description: | + Set this option to `true` to keep the collection/shards available for + write operations by not using an exclusive write lock for the duration + of the index creation. + type: boolean + default: false + responses: + '200': + description: | + The index exists already. + '201': + description: | + The index is created as there is no such existing index. + '404': + description: | + The collection is unknown. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Creating a geo index with a location attribute +name: RestIndexCreateGeoLocation +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "geo", + fields : [ "b" ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Creating a geo index with latitude and longitude attributes +name: RestIndexCreateGeoLatitudeLongitude +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "geo", + fields: [ "e", "f" ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/inverted.md b/site/content/arangodb/oem/develop/http-api/indexes/inverted.md new file mode 100644 index 0000000000..f2604cd8b5 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/inverted.md @@ -0,0 +1,644 @@ +--- +title: HTTP interface for inverted indexes +menuTitle: Inverted +weight: 10 +description: '' +--- +## Create an inverted index + +```openapi +paths: + /_db/{database-name}/_api/index#inverted: + post: + operationId: createIndexInverted + description: | + Creates an inverted index for the collection `collection-name`, if + it does not already exist. The call expects an object containing the index + details. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - type + - fields + properties: + type: + description: | + Must be equal to `"inverted"`. + type: string + example: inverted + name: + description: | + An easy-to-remember name for the index to look it up or refer to it in index hints. + Index names are subject to the same character restrictions as collection names. + If omitted, a name is auto-generated so that it is unique with respect to the + collection, e.g. `idx_832910498`. + type: string + fields: + description: | + An array of attribute paths. You can use strings to index the fields with the + default options, or objects to specify options for the fields (with the + attribute path in the `name` property), or a mix of both. + type: array + minItems: 1 + uniqueItems: true + items: + type: object + required: + - name + properties: + name: + description: | + An attribute path. The `.` character denotes sub-attributes. + You can expand one array attribute with `[*]`. + type: string + analyzer: + description: | + The name of an Analyzer to use for this field. + + Default: the value defined by the top-level `analyzer` option. + type: string + features: + description: | + A list of Analyzer features to use for this field. You can set this option to + overwrite what features are enabled for the `analyzer`. + + Default: the features as defined by the Analyzer itself, or inherited from the + top-level `features` option if the `analyzer` option adjacent to this option is + not set. + type: array + uniqueItems: true + items: + type: string + enum: [frequency, norm, position, offset] + includeAllFields: + description: | + This option only applies if you use the inverted index in a `search-alias` Views. + + If set to `true`, then all sub-attributes of this field are indexed, excluding + any sub-attributes that are configured separately by other elements in the + `fields` array (and their sub-attributes). The `analyzer` and `features` + properties apply to the sub-attributes. + + If set to `false`, then sub-attributes are ignored. + + Default: the value defined by the top-level `includeAllFields` option. + type: boolean + searchField: + description: | + This option only applies if you use the inverted index in a `search-alias` Views. + + You can set the option to `true` to get the same behavior as with `arangosearch` + Views regarding the indexing of array values for this field. If enabled, both, + array and primitive values (strings, numbers, etc.) are accepted. Every element + of an array is indexed according to the `trackListPositions` option. + + If set to `false`, it depends on the attribute path. If it explicitly expands an + array (`[*]`), then the elements are indexed separately. Otherwise, the array is + indexed as a whole, but only `geopoint` and `aql` Analyzers accept array inputs. + You cannot use an array expansion if `searchField` is enabled. + + Default: the value defined by the top-level `searchField` option. + type: boolean + trackListPositions: + description: | + This option only applies if you use the inverted index in a `search-alias` Views, + and `searchField` needs to be `true`. + + If set to `true`, then track the value position in arrays for array values. + For example, when querying a document like `{ attr: [ "valueX", "valueY", "valueZ" ] }`, + you need to specify the array element, e.g. `doc.attr[1] == "valueY"`. + + If set to `false`, all values in an array are treated as equal alternatives. + You don't specify an array element in queries, e.g. `doc.attr == "valueY"`, and + all elements are searched for a match. + + Default: the value defined by the top-level `trackListPositions` option. + type: boolean + cache: + description: | + Enable this option to always cache the field normalization values in memory + for this specific field. This can improve the performance of scoring and + ranking queries. Otherwise, these values are memory-mapped and it is up to the + operating system to load them from disk into memory and to evict them from memory. + + Normalization values are computed for fields which are processed with Analyzers + that have the `"norm"` feature enabled. These values are used to score fairer if + the same tokens occur repeatedly, to emphasize these documents less. + + You can also enable this option to always cache auxiliary data used for querying + fields that are indexed with Geo Analyzers in memory for this specific field. + This can improve the performance of geo-spatial queries. + + Default: the value defined by the top-level `cache` option. + + This property is available in the Enterprise Edition only. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + nested: + description: | + Index the specified sub-objects that are stored in an array. Other than with the + `fields` property, the values get indexed in a way that lets you query for + co-occurring values. For example, you can search the sub-objects and all the + conditions need to be met by a single sub-object instead of across all of them. + + This property is available in the Enterprise Edition only. + type: array + items: + type: object + required: + - name + properties: + name: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + analyzer: + description: | + The name of an Analyzer to use for this field. + Default: the value defined by the parent field, or the top-level `analyzer` option. + type: string + features: + description: | + A list of Analyzer features to use for this field. You can set this option to + overwrite what features are enabled for the `analyzer`. + + Default: the features as defined by the Analyzer itself, or inherited from the + parent field's or top-level `features` option if no `analyzer` option is set + at a deeper level, closer to this option. + type: array + uniqueItems: true + items: + type: string + enum: [frequency, norm, position, offset] + searchField: + description: | + This option only applies if you use the inverted index in a `search-alias` Views. + + You can set the option to `true` to get the same behavior as with `arangosearch` + Views regarding the indexing of array values for this field. If enabled, both, + array and primitive values (strings, numbers, etc.) are accepted. Every element + of an array is indexed according to the `trackListPositions` option. + + If set to `false`, it depends on the attribute path. If it explicitly expands an + array (`[*]`), then the elements are indexed separately. Otherwise, the array is + indexed as a whole, but only `geopoint` and `aql` Analyzers accept array inputs. + You cannot use an array expansion if `searchField` is enabled. + + Default: the value defined by the top-level `searchField` option. + type: boolean + cache: + description: | + Enable this option to always cache the field normalization values in memory + for this specific nested field. This can improve the performance of scoring and + ranking queries. Otherwise, these values are memory-mapped and it is up to the + operating system to load them from disk into memory and to evict them from memory. + + Normalization values are computed for fields which are processed with Analyzers + that have the `"norm"` feature enabled. These values are used to score fairer if + the same tokens occur repeatedly, to emphasize these documents less. + + You can also enable this option to always cache auxiliary data used for querying + fields that are indexed with Geo Analyzers in memory for this specific nested field. + This can improve the performance of geo-spatial queries. + + Default: the value defined by the top-level `cache` option. + + This property is available in the Enterprise Edition only. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + nested: + description: | + You can recursively index sub-objects. See the above description of the + `nested` option. + type: array + items: + type: object + searchField: + description: | + This option only applies if you use the inverted index in a `search-alias` Views. + + You can set the option to `true` to get the same behavior as with `arangosearch` + Views regarding the indexing of array values as the default. If enabled, both, + array and primitive values (strings, numbers, etc.) are accepted. Every element + of an array is indexed according to the `trackListPositions` option. + + If set to `false`, it depends on the attribute path. If it explicitly expands an + array (`[*]`), then the elements are indexed separately. Otherwise, the array is + indexed as a whole, but only `geopoint` and `aql` Analyzers accept array inputs. + You cannot use an array expansion if `searchField` is enabled. + type: boolean + default: false + cache: + description: | + Enable this option to always cache the field normalization values in memory + for all fields by default. This can improve the performance of scoring and + ranking queries. Otherwise, these values are memory-mapped and it is up to the + operating system to load them from disk into memory and to evict them from memory. + + Normalization values are computed for fields which are processed with Analyzers + that have the `"norm"` feature enabled. These values are used to score fairer if + the same tokens occur repeatedly, to emphasize these documents less. + + You can also enable this option to always cache auxiliary data used for querying + fields that are indexed with Geo Analyzers in memory for all fields by default. + This can improve the performance of geo-spatial queries. + + This property is available in the Enterprise Edition only. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + default: false + storedValues: + description: | + The optional `storedValues` attribute can contain an array of objects with paths + to additional attributes to store in the index. These additional attributes + cannot be used for index lookups or for sorting, but they can be used for + projections. This allows an index to fully cover more queries and avoid extra + document lookups. + + You may use the following shorthand notations on index creation instead of + an array of objects. The default compression and cache settings are used in + this case: + + - An array of strings, like `["attr1", "attr2"]`, to place each attribute into + a separate column of the index (introduced in v3.10.3). + + - An array of arrays of strings, like `[["attr1", "attr2"]]`, to place the + attributes into a single column of the index, or `[["attr1"], ["attr2"]]` + to place each attribute into a separate column. You can also mix it with the + full form: + + ```json + [ + ["attr1"], + ["attr2", "attr3"], + { "fields": ["attr4", "attr5"], "cache": true } + ] + ``` + type: array + items: + type: object + required: + - fields + properties: + fields: + description: | + A list of attribute paths. The `.` character denotes sub-attributes. + type: array + #uniqueItems: true # Duplicate values are silently ignored + items: + type: string + compression: + description: | + Defines how to compress the attribute values. + - `"lz4"`: use LZ4 fast compression. + - `"none"`: disable compression to trade space for speed. + type: string + enum: [lz4, none] + default: lz4 + cache: + description: | + Enable this option to always cache stored values in memory. This can improve the + query performance if stored values are involved. Otherwise, these values are + memory-mapped and it is up to the operating system to load them from disk into + memory and to evict them from memory. + + This property is available in the Enterprise Edition only. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + default: false + primarySort: + description: | + You can define a primary sort order to enable an AQL optimization. If a query + iterates over all documents of a collection, wants to sort them by attribute values, + and the (left-most) fields to sort by, as well as their sorting direction, match + with the `primarySort` definition, then the `SORT` operation is optimized away. + type: object + required: + - fields + properties: + fields: + description: | + An array of the fields to sort the index by and the direction to sort each field in. + type: array + items: + type: object + required: + - field + - direction + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + direction: + description: | + The sorting direction. + - `"asc` for ascending + - `"desc"` for descending + type: string + enum: [asc, desc] + compression: + description: | + Defines how to compress the primary sort data. + - `"lz4"`: use LZ4 fast compression. + - `"none"`: disable compression to trade space for speed. + type: string + enum: [lz4, none] + default: lz4 + cache: + description: | + Enable this option to always cache the primary sort columns in memory. This can + improve the performance of queries that utilize the primary sort order. + Otherwise, these values are memory-mapped and it is up to the operating system + to load them from disk into memory and to evict them from memory. + + This property is available in the Enterprise Edition only. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + default: false + primaryKeyCache: + description: | + Enable this option to always cache the primary key column in memory. This can + improve the performance of queries that return many documents. Otherwise, these + values are memory-mapped and it is up to the operating system to load them from + disk into memory and to evict them from memory. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + default: false + analyzer: + description: | + The name of an Analyzer to use by default. This Analyzer is applied to the + values of the indexed fields for which you don't define Analyzers explicitly. + type: string + default: identity + features: + description: | + A list of Analyzer features. You can set this option to overwrite what features + are enabled for the default `analyzer`. + + Default: the features as defined by the Analyzer itself. + type: array + uniqueItems: true + items: + type: string + enum: [frequency, norm, position, offset] + includeAllFields: + description: | + This option only applies if you use the inverted index in a `search-alias` Views. + + If set to `true`, then all document attributes are indexed, excluding any + sub-attributes that are configured in the `fields` array (and their sub-attributes). + The `analyzer` and `features` properties apply to the sub-attributes. + + {{</* warning */>}} + Using `includeAllFields` for a lot of attributes in combination + with complex Analyzers may significantly slow down the indexing process. + {{</* /warning */>}} + type: boolean + default: false + trackListPositions: + description: | + This option only applies if you use the inverted index in a `search-alias` Views, + and `searchField` needs to be `true`. + + If set to `true`, then track the value position in arrays for array values. + For example, when querying a document like `{ attr: [ "valueX", "valueY", "valueZ" ] }`, + you need to specify the array element, e.g. `doc.attr[1] == "valueY"`. + + If set to `false`, all values in an array are treated as equal alternatives. + You don't specify an array element in queries, e.g. `doc.attr == "valueY"`, and + all elements are searched for a match. + type: boolean + default: false + parallelism: + description: | + The number of threads to use for indexing the fields. + type: integer + default: 2 + inBackground: + description: | + Set this option to `true` to keep the collection/shards available for + write operations by not using an exclusive write lock for the duration + of the index creation. + type: boolean + default: false + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (set to `0` to disable). + For the case where the consolidation policies merge segments often (i.e. a lot + of commit+consolidate), a lower value causes 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 impacts performance without any added + benefits. + + _Background:_ + With every "commit" or "consolidate" operation, a new state of the + inverted index' internal data structures is created on disk. + Old states/snapshots are released once there are no longer any users + remaining. + However, the files for the released states/snapshots are left on disk, and + only removed by "cleanup" operation. + type: integer + default: 2 + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing inverted index data store + changes and making documents visible to queries (set to `0` to disable). + For the case where there are a lot of inserts/updates, a higher value causes the + index not to account for them and memory usage continues to grow until the commit. + A lower value impacts performance, including the case where there are no or only a + few inserts/updates because of synchronous locking, and it wastes disk space for + each commit call. + + _Background:_ + For data retrieval, ArangoSearch follows the concept of + "eventually-consistent", i.e. eventually all the data in ArangoDB will be + matched by corresponding query expressions. + The concept of ArangoSearch "commit" operations is introduced to + control the upper-bound on the time until document addition/removals are + actually reflected by corresponding query expressions. + Once a "commit" operation is complete, all documents added/removed prior to + the start of the "commit" operation will be reflected by queries invoked in + subsequent ArangoDB transactions, in-progress ArangoDB transactions will + still continue to return a repeatable-read state. + type: integer + default: 1000 + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the inverted index data store and possibly release space on the filesystem + (set to `0` to disable). + For the case where there are a lot of data modification operations, a higher + value could potentially have the data store consume more space and file handles. + For the case where there are a few data modification operations, a lower value + impacts performance due to no segment candidates being available for + consolidation. + + _Background:_ + For data modification, ArangoSearch follows the concept of a + "versioned data store". Thus old versions of data may be removed once there + are no longer any users of the old data. The frequency of the cleanup and + compaction operations are governed by `consolidationIntervalMsec` and the + candidates for compaction are selected via `consolidationPolicy`. + type: integer + default: 1000 + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + _Background:_ + With each ArangoDB transaction that inserts documents, one or more + ArangoSearch-internal segments get created. + Similarly, for removed documents, the segments that contain such documents + have these documents marked as 'deleted'. + Over time, this approach causes a lot of small and sparse segments to be + created. + A "consolidation" operation selects one or more segments and copies all of + their valid documents into a single new segment, thereby allowing the + search algorithm to perform more optimally and for extra file handles to be + released once old segments are no longer used. + type: object + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The supported types are: + + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + type: string + default: tier + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments as equal for + consolidation selection. + type: integer + default: 2097152 + segmentsBytesMax: + description: | + The maximum allowed size of all consolidated segments in bytes. + type: integer + default: 5368709120 + segmentsMax: + description: | + The maximum number of segments that are evaluated as candidates for + consolidation. + type: integer + default: 10 + segmentsMin: + description: | + The minimum number of segments that are evaluated as candidates for + consolidation. + type: integer + default: 1 + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + default: 0 + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool + (set to `0` to disable). + type: integer + default: 64 + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (set to `0` to disable). + type: integer + default: 0 + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (ArangoDB server startup option). `0` value should be used carefully due to + high potential memory consumption (set to `0 `to disable). + type: integer + default: 33554432 + responses: + '200': + description: | + The index exists already. + '201': + description: | + The index is created as there is no such existing index. + '404': + description: | + The collection is unknown. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Creating an inverted index: +name: RestIndexCreateNewInverted +--- +var cn = "products"; +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "inverted", + fields: [ "a", { name: "b", analyzer: "text_en" } ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/multi-dimensional.md b/site/content/arangodb/oem/develop/http-api/indexes/multi-dimensional.md new file mode 100644 index 0000000000..b327e5df48 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/multi-dimensional.md @@ -0,0 +1,121 @@ +--- +title: HTTP interface for multi-dimensional indexes +menuTitle: Multi-dimensional +weight: 20 +description: '' +--- +## Create a multi-dimensional index + +```openapi +paths: + /_db/{database-name}/_api/index#mdi: + post: + operationId: createIndexZkd + description: | + Creates a multi-dimensional index for the collection `collection-name`, if + it does not already exist. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - type + - fields + - fieldValueTypes + properties: + type: + description: | + Must be equal to `"zkd"`. + type: string + example: zkd + name: + description: | + An easy-to-remember name for the index to look it up or refer to it in index hints. + Index names are subject to the same character restrictions as collection names. + If omitted, a name is auto-generated so that it is unique with respect to the + collection, e.g. `idx_832910498`. + type: string + fields: + description: | + An array of attribute names used for each dimension. Array expansions are not allowed. + type: array + minItems: 1 + uniqueItems: true + items: + type: string + fieldValueTypes: + description: | + Must be equal to `"double"`. Currently only doubles are supported as values. + type: string + unique: + description: | + if `true`, then create a unique index. + type: boolean + default: false + inBackground: + description: | + Set this option to `true` to keep the collection/shards available for + write operations by not using an exclusive write lock for the duration + of the index creation. + type: boolean + default: false + responses: + '200': + description: | + The index exists already. + '201': + description: | + The index is created as there is no such existing index. + '400': + description: | + The index definition is invalid. + '404': + description: | + The collection is unknown. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Creating a multi-dimensional index +name: RestIndexCreateNewZkd +--- +var cn = "intervals"; +db._drop(cn); +db._create(cn); + + var url = "/_api/index?collection=" + cn; + var body = { + type: "zkd", + fields: [ "from", "to" ], + fieldValueTypes: "double" + }; + + var response = logCurlRequest('POST', url, body); + + assert(response.code === 201); + + logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/persistent.md b/site/content/arangodb/oem/develop/http-api/indexes/persistent.md new file mode 100644 index 0000000000..4519a006c6 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/persistent.md @@ -0,0 +1,242 @@ +--- +title: HTTP interface for persistent indexes +menuTitle: Persistent +weight: 5 +description: '' +--- +{{< info >}} +The index types `hash` and `skiplist` are aliases for the `persistent` index +type and should no longer be used to create new indexes. The aliases will be +removed in a future version. +{{< /info >}} + +## Create a persistent index + +```openapi +paths: + /_db/{database-name}/_api/index#persistent: + post: + operationId: createIndexPersistent + description: | + Creates a persistent index for the collection `collection-name`, if + it does not already exist. + + In a sparse index all documents will be excluded from the index that do not + contain at least one of the specified index attributes (i.e. `fields`) or that + have a value of `null` in any of the specified index attributes. Such documents + will not be indexed, and not be taken into account for uniqueness checks if + the `unique` flag is set. + + In a non-sparse index, these documents will be indexed (for non-present + indexed attributes, a value of `null` will be used) and will be taken into + account for uniqueness checks if the `unique` flag is set. + + {{</* info */>}} + Unique indexes on non-shard keys are not supported in cluster deployments. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - type + - fields + properties: + type: + description: | + Must be equal to `"persistent"`. + type: string + example: persistent + name: + description: | + An easy-to-remember name for the index to look it up or refer to it in index hints. + Index names are subject to the same character restrictions as collection names. + If omitted, a name is auto-generated so that it is unique with respect to the + collection, e.g. `idx_832910498`. + type: string + fields: + description: | + An array of attribute paths. + + The `.` character denotes sub-attributes in attribute paths. Attributes with + literal `.` in their name cannot be indexed. Attributes with the name `_id` + cannot be indexed either, neither as a top-level attribute nor as a sub-attribute. + + You can expand one array attribute with `[*]`. + type: array + minItems: 1 + uniqueItems: true + items: + type: string + storedValues: + description: | + The optional `storedValues` attribute can contain an array of paths to additional + attributes to store in the index. These additional attributes cannot be used for + index lookups or for sorting, but they can be used for projections. This allows an + index to fully cover more queries and avoid extra document lookups. + The maximum number of attributes in `storedValues` is 32. + + It is not possible to create multiple indexes with the same `fields` attributes + and uniqueness but different `storedValues` attributes. That means the value of + `storedValues` is not considered by index creation calls when checking if an + index is already present or needs to be created. + + In unique indexes, only the attributes in `fields` are checked for uniqueness, + but the attributes in `storedValues` are not checked for their uniqueness. + Non-existing attributes are stored as `null` values inside `storedValues`. + type: array + items: + type: string + unique: + description: | + Whether to create the index with a uniqueness constraint. + In unique indexes, only the attributes in `fields` are checked for uniqueness, + but the attributes in `storedValues` are not checked for their uniqueness. + type: boolean + default: false + sparse: + description: | + Whether create a sparse index that excludes documents with at least + one of the `fields` missing or set to `null`. + type: boolean + default: false + deduplicate: + description: | + The attribute controls whether inserting duplicate index values + from the same document into a unique array index lead to a unique constraint + error or not. Only a single instance of each non-unique index value + is inserted into the index per document by default. Trying to + insert a value into the index that already exists in the index always fails, + regardless of the value of this attribute. + type: boolean + default: true + estimates: + description: | + This attribute controls whether index selectivity estimates are maintained for the + index. Not maintaining index selectivity estimates can have a slightly positive + impact on write performance. + + The downside of turning off index selectivity estimates is that + the query optimizer is not able to determine the usefulness of different + competing indexes in AQL queries when there are multiple candidate indexes to + choose from. + + The option has no effect on indexes other than `persistent`. + type: boolean + default: true + cacheEnabled: + description: | + This attribute controls whether an extra in-memory hash cache is + created for the index. The hash cache can be used to speed up index lookups. + The cache can only be used for queries that look up all index attributes via + an equality lookup (`==`). The hash cache cannot be used for range scans, + partial lookups or sorting. + + The cache will be populated lazily upon reading data from the index. Writing data + into the collection or updating existing data will invalidate entries in the + cache. The cache may have a negative effect on performance in case index values + are updated more often than they are read. + + The maximum size of cache entries that can be stored is currently 4 MB, i.e. + the cumulated size of all index entries for any index lookup value must be + less than 4 MB. This limitation is there to avoid storing the index entries + of "super nodes" in the cache. + + `cacheEnabled` defaults to `false` and should only be used for indexes that + are known to benefit from an extra layer of caching. + type: boolean + default: false + inBackground: + description: | + Set this option to `true` to keep the collection/shards available for + write operations by not using an exclusive write lock for the duration + of the index creation. + type: boolean + default: false + responses: + '200': + description: | + The index exists already. + '201': + description: | + The index is created as there is no such existing index. + '400': + description: | + You try to create a unique persistent index but there are already + documents in the collection that violate the uniqueness requirement. + '404': + description: | + The collection is unknown. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Creating a persistent index +name: RestIndexCreateNewPersistent +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "persistent", + unique: false, + fields: [ "a", "b" ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Creating a sparse persistent index +name: RestIndexCreateSparsePersistent +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "persistent", + unique: false, + sparse: true, + fields: [ "a" ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/indexes/ttl.md b/site/content/arangodb/oem/develop/http-api/indexes/ttl.md new file mode 100644 index 0000000000..11fb88d96a --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/indexes/ttl.md @@ -0,0 +1,118 @@ +--- +title: HTTP interface for TTL (time-to-live) indexes +menuTitle: TTL +weight: 15 +description: '' +--- +## Create a TTL index + +```openapi +paths: + /_db/{database-name}/_api/index#ttl: + post: + operationId: createIndexTtl + description: | + Creates a time-to-live (TTL) index for the collection `collection-name` if it + does not already exist. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The collection name. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - type + - fields + - expireAfter + properties: + type: + description: | + Must be equal to `"ttl"`. + type: string + name: + description: | + An easy-to-remember name for the index to look it up or refer to it in index hints. + Index names are subject to the same character restrictions as collection names. + If omitted, a name is auto-generated so that it is unique with respect to the + collection, e.g. `idx_832910498`. + type: string + fields: + description: | + A list with exactly one attribute path. + type: array + minItems: 1 + maxItems: 1 + items: + type: string + expireAfter: + description: | + The time interval (in seconds) from the point in time stored in the `fields` + attribute after which the documents count as expired. Can be set to `0` to let + documents expire as soon as the server time passes the point in time stored in + the document attribute, or to a higher number to delay the expiration. + type: number + inBackground: + description: | + Set this option to `true` to keep the collection/shards available for + write operations by not using an exclusive write lock for the duration + of the index creation. + type: boolean + default: false + responses: + '200': + description: | + The index exists already. + '201': + description: | + The index is created as there is no such existing index. + '400': + description: | + There is already a TTL index for the collection but there can only be one. + '404': + description: | + The collection is unknown. + tags: + - Indexes +``` + +**Examples** + +```curl +--- +description: |- + Creating a TTL index +name: RestIndexCreateNewTtlIndex +--- +var cn = "sessions"; +db._drop(cn); +db._create(cn); + +var url = "/_api/index?collection=" + cn; +var body = { + type: "ttl", + expireAfter: 3600, + fields : [ "createdAt" ] +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` diff --git a/site/content/arangodb/oem/develop/http-api/jobs.md b/site/content/arangodb/oem/develop/http-api/jobs.md new file mode 100644 index 0000000000..c019c47cdf --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/jobs.md @@ -0,0 +1,831 @@ +--- +title: HTTP interface for jobs +menuTitle: Jobs +weight: 80 +description: >- + The HTTP API for jobs lets you access the results of asynchronously executed + requests and check the status of such jobs +# All /_api/job* endpoints are also available via /_admin/job* +--- +For an introduction to non-blocking execution of requests and how to create +async jobs with the `x-arango-async` request header, see +[HTTP request handling in ArangoDB](general-request-handling.md#non-blocking-execution). + +## Get the results of an async job + +```openapi +paths: + /_db/{database-name}/_api/job/{job-id}: + put: + operationId: getJobResult + description: | + Returns the result of an async job identified by `job-id` if it's ready. + + If the async job result is available on the server, the endpoint returns + the original operation's result headers and body, plus the additional + `x-arango-async-job-id` HTTP header. The result and job are then removed + which means that you can retrieve the result exactly once. + + If the result is not available yet or if the job is not known (anymore), + the additional header is not present and you can tell the status from + the HTTP status code. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + - name: job-id + in: path + required: true + description: | + The async job id. + schema: + type: string + responses: + default: + description: | + If the job has finished, you get the result with the headers of the + original operation with an additional `x-arango-async-id` HTTP header. + The HTTP status code is also that of the operation that executed + asynchronously, which can be a success or error code depending on + the outcome of the operation. + '204': + description: | + The job is still in the queue of pending (or not yet finished) jobs. + In this case, no `x-arango-async-id` HTTP header is returned. + '400': + description: | + The `job-id` is missing in the request or has an invalid value. + In this case, no `x-arango-async-id` HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + The job cannot be found or has already been deleted, or the result + has already been fetched. In this case, no `x-arango-async-id` + HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Jobs +``` + +**Examples** + +```curl +--- +description: |- + Not providing a `job-id`: +name: job_fetch_result_01 +--- +var url = "/_api/job"; +var response = logCurlRequest('PUT', url, ""); + +assert(response.code === 400); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Providing a `job-id` for a non-existing job: +name: job_fetch_result_02 +--- +var url = "/_api/job/notthere"; +var response = logCurlRequest('PUT', url, ""); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Fetching the result of an HTTP GET job: +name: job_fetch_result_03 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/' + queryId; + +for (let i = 1; i <= 10; i++) { + var status = arango.GET_RAW(url); + if (!status.headers['x-arango-async-id'] && status.code == 204) { + internal.sleep(0.1 * i * i); + } else { + break; + } +} + +var response = logCurlRequest('PUT', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Fetching the result of an HTTP POST job that failed: +name: job_fetch_result_04 +--- +var url = "/_api/collection"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, {"name":" this name is invalid "}, headers); + +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/' + queryId; + +for (let i = 1; i <= 10; i++) { + var status = arango.GET_RAW(url); + if (!status.headers['x-arango-async-id'] && status.code == 204) { + internal.sleep(0.1 * i * i); + } else { + break; + } +} + +var response = logCurlRequest('PUT', url, ""); +assert(response.code === 400); +logJsonResponse(response); +``` + +## Cancel an async job + +```openapi +paths: + /_db/{database-name}/_api/job/{job-id}/cancel: + put: + operationId: cancelJob + description: | + Cancels the currently running job identified by `job-id`. Note that it still + might take some time to actually cancel the running async job. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + - name: job-id + in: path + required: true + description: | + The async job id. + schema: + type: string + responses: + '200': + description: | + The job cancellation has been initiated. + content: + application/json: + schema: + type: object + required: + - result + properties: + result: + description: | + Always `true`. + type: boolean + example: true + '400': + description: | + The `job-id` is missing in the request or has an invalid value. + In this case, no `x-arango-async-id` HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + The job cannot be found or has already been deleted, or the result + has already been fetched. In this case, no `x-arango-async-id` + HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Jobs +``` + +**Examples** + +```curl +--- +description: '' +name: job_cancel +--- +var url = "/_api/cursor"; +var headers = {'x-arango-async' : 'store'}; +var postData = {"query": + "FOR i IN 1..10 FOR j IN 1..10 LET x = sleep(1.0) FILTER i == 5 && j == 5 RETURN 42"} + +var response = logCurlRequest('POST', url, postData, headers); +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/pending'; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +url = '/_api/job/' + queryId + '/cancel' +var response = logCurlRequest('PUT', url, ""); +assert(response.code === 200); +logJsonResponse(response); + +url = '/_api/job/pending'; +var response = logCurlRequest('GET', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` + +## Delete async job results + +```openapi +paths: + /_db/{database-name}/_api/job/{job-id}: + delete: + operationId: deleteJob + description: | + Deletes either all job results, expired job results, or the result of a + specific job. + Clients can use this method to perform an eventual garbage collection of job + results. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + - name: job-id + in: path + required: true + description: | + The ID of the job to delete. The ID can be: + - `all`: Deletes all jobs results. Currently executing or queued async + jobs are not stopped by this call. + - `expired`: Deletes expired results. To determine the expiration status of a + result, pass the stamp query parameter. stamp needs to be a Unix timestamp, + and all async job results created before this time are deleted. + - **A numeric job ID**: In this case, the call removes the result of the + specified async job. If the job is currently executing or queued, it is + not aborted. + schema: + type: string + - name: stamp + in: query + required: false + description: | + A Unix timestamp specifying the expiration threshold for when the `job-id` is + set to `expired`. + schema: + type: number + responses: + '200': + description: | + The result of a specific job has been deleted successfully. + This code is also returned if the deletion of `all` or `expired` + jobs has been requested, including if no results were deleted. + content: + application/json: + schema: + type: object + required: + - result + properties: + result: + description: | + Always `true`. + type: boolean + example: true + '400': + description: | + The `job-id` is missing in the request or has an invalid value. + In this case, no `x-arango-async-id` HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + The job cannot be found or has already been deleted, or the result + has already been fetched. In this case, no `x-arango-async-id` + HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Jobs +``` + +**Examples** + +```curl +--- +description: |- + Deleting all jobs: +name: job_delete_01 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +url = '/_api/job/all' +var response = logCurlRequest('DELETE', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Deleting expired jobs: +name: job_delete_02 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +var response = logCurlRequest('GET', "/_admin/time"); +assert(response.code === 200); +logJsonResponse(response); +now = response.parsedBody.time; + +url = '/_api/job/expired?stamp=' + now +var response = logCurlRequest('DELETE', url, ""); +assert(response.code === 200); +logJsonResponse(response); + +url = '/_api/job/pending'; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Deleting the result of a specific job: +name: job_delete_03 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/' + queryId +var response = logCurlRequest('DELETE', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Deleting the result of a non-existing job: +name: job_delete_04 +--- +url = '/_api/job/AreYouThere' +var response = logCurlRequest('DELETE', url, ""); +assert(response.code === 404); +logJsonResponse(response); +``` + +## List async jobs by status or get the status of specific job + +```openapi +paths: + /_db/{database-name}/_api/job/{job-id}: + get: + operationId: getJob + description: | + This endpoint returns either of the following, depending on the specified value + for the `job-id` parameter: + + - The IDs of async jobs with a specific status + - The processing status of a specific async job + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + - name: job-id + in: path + required: true + description: | + If you provide a value of `pending` or `done`, then the endpoint returns an + array of strings with the job IDs of ongoing or completed async jobs. + + If you provide a numeric job ID, then the endpoint returns the status of the + specific async job in the form of an HTTP reply without payload. Check the + HTTP status code of the response for the job status. + schema: + type: string + - name: count + in: query + required: false + description: | + The maximum number of job IDs to return per call. If not specified, a + server-defined maximum value is used. Only applicable if you specify `pending` + or `done` as `job-id` to list jobs. + schema: + type: number + default: 100 + responses: + '200': + description: | + The job has finished and you can fetch the result (the response has + no body in this case), or your request for the list of `pending` or + `done` jobs has been successful. + content: + application/json: + schema: + description: | + A list of job IDs. The list can be empty. + type: array + items: + type: string + '204': + description: | + The job is still in the queue of pending (or not yet finished) jobs. + '400': + description: | + The `job-id` is missing in the request or has an invalid value. + In this case, no `x-arango-async-id` HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + The job cannot be found or has already been deleted, or the result + has already been fetched. In this case, no `x-arango-async-id` + HTTP header is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + - errorNum + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Jobs +``` + +**Examples** + +```curl +--- +description: |- + Querying the status of a done job: +name: job_getStatusById_01 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/' + queryId +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logRawResponse(response); +``` + +```curl +--- +description: |- + Querying the status of a pending job: + (therefore we create a long running job...) +name: job_getStatusById_02 +--- +var url = "/_api/transaction"; +var body = { + collections: { + read : [ "_aqlfunctions" ] + }, + action: "function () {require('internal').sleep(15.0);}" +}; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('POST', url, body, headers); + +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/' + queryId +var response = logCurlRequest('GET', url); +assert(response.code === 204); +logRawResponse(response); +``` + +```curl +--- +description: |- + Fetching the list of `done` jobs: +name: job_getByType_01 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +url = '/_api/job/done' +var response = logCurlRequest('GET', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Fetching the list of `pending` jobs: +name: job_getByType_02 +--- +var url = "/_api/version"; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('PUT', url, "", headers); + +assert(response.code === 202); +logRawResponse(response); + +url = '/_api/job/pending' +var response = logCurlRequest('GET', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Fetching the list of a `pending` jobs while a long-running job is executing + (and aborting it): +name: job_getByType_03 +--- +var url = "/_api/transaction"; +var body = { + collections: { + read : [ "_frontend" ] + }, + action: "function () {require('internal').sleep(15.0);}" +}; +var headers = {'x-arango-async' : 'store'}; +var response = logCurlRequest('POST', url, body, headers); + +assert(response.code === 202); +logRawResponse(response); + +var queryId = response.headers['x-arango-async-id']; +url = '/_api/job/pending' +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +url = '/_api/job/' + queryId +var response = logCurlRequest('DELETE', url, ""); +assert(response.code === 200); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/monitoring/_index.md b/site/content/arangodb/oem/develop/http-api/monitoring/_index.md new file mode 100644 index 0000000000..df38824946 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/monitoring/_index.md @@ -0,0 +1,8 @@ +--- +title: HTTP interfaces related to monitoring +menuTitle: Monitoring +weight: 100 +description: >- + You can observe the activity and performance of ArangoDB deployments using + the server logs, statistics, and metrics +--- diff --git a/site/content/arangodb/oem/develop/http-api/monitoring/logs.md b/site/content/arangodb/oem/develop/http-api/monitoring/logs.md new file mode 100644 index 0000000000..502882795e --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/monitoring/logs.md @@ -0,0 +1,741 @@ +--- +title: HTTP interface for server logs +menuTitle: Logs +weight: 5 +description: >- + Server events and errors are logged depending on the defined log levels for + the available log topics +--- +Whether events are logged to a file, syslog, or only an attached terminal depends +on the [log startup options](../../../components/arangodb-server/options.md#log). + +See [Log levels](../../../operations/administration/log-levels.md) for a detailed +description of the `FATAL`, `ERROR`, and other levels of log messages. + +The permissions required to use the `/_admin/log*` endpoints depends on the +setting of the [`--log.api-enabled` startup option](../../../components/arangodb-server/options.md#--logapi-enabled). + +## Get the global server logs + +```openapi +paths: + /_admin/log/entries: + get: + operationId: getLogEntries + description: | + Returns fatal, error, warning or info log messages from the server's global log. + The result is a JSON object with the following properties: + + - **total**: the total amount of log entries before pagination + - **messages**: an array with log messages that matched the criteria + + This API can be turned off via the startup option `--log.api-enabled`. In case + the API is disabled, all requests will be responded to with HTTP 403. If the + API is enabled, accessing it requires admin privileges, or even superuser + privileges, depending on the value of the `--log.api-enabled` startup option. + parameters: + - name: upto + in: query + required: false + description: | + Returns all log entries up to log level `upto`. Note that `upto` must be: + - `fatal` or `0` + - `error` or `1` + - `warning` or `2` + - `info` or `3` + - `debug` or `4` + - `trace` or `5` + schema: + #type: [string, integer] + default: info + - name: level + in: query + required: false + description: | + Returns all log entries of log level `level`. Note that the query parameters + `upto` and `level` are mutually exclusive. + schema: + type: string + - name: start + in: query + required: false + description: | + Returns all log entries such that their log entry identifier (`id` value) + is greater or equal to `start`. + schema: + type: number + default: 0 + - name: size + in: query + required: false + description: | + Restricts the result to at most `size` log entries. + schema: + type: number + - name: offset + in: query + required: false + description: | + Starts to return log entries skipping the first `offset` log entries. `offset` + and `size` can be used for pagination. + schema: + type: number + default: 0 + - name: search + in: query + required: false + description: | + Only return the log entries containing the text specified in `search`. + schema: + type: string + - name: sort + in: query + required: false + description: | + Sort the log entries either ascending (if `sort` is `asc`) or descending + (if `sort` is `desc`) according to their `id` values. Note that the `id` + imposes a chronological order. + schema: + type: string + default: asc + - name: serverId + in: query + required: false + description: | + Returns all log entries of the specified server. All other query parameters + remain valid. If no serverId is given, the asked server + will reply. This parameter is only meaningful on Coordinators. + schema: + type: string + responses: + '200': + description: | + is returned if the request is valid. + '400': + description: | + is returned if invalid values are specified for `upto` or `level`. + '403': + description: | + is returned if there are insufficient privileges to access the logs. + tags: + - Monitoring +``` + +## Get the global server logs (deprecated) + +```openapi +paths: + /_admin/log: + get: + operationId: getLog + description: | + {{</* warning */>}} + This endpoint should no longer be used. It is deprecated from version 3.8.0 on. + Use `/_admin/log/entries` instead, which provides the same data in a more + intuitive and easier to process format. + {{</* /warning */>}} + + Returns fatal, error, warning or info log messages from the server's global log. + The result is a JSON object with the attributes described below. + + This API can be turned off via the startup option `--log.api-enabled`. In case + the API is disabled, all requests will be responded to with HTTP 403. If the + API is enabled, accessing it requires admin privileges, or even superuser + privileges, depending on the value of the `--log.api-enabled` startup option. + parameters: + - name: upto + in: query + required: false + description: | + Returns all log entries up to log level `upto`. Note that `upto` must be: + - `fatal` or `0` + - `error` or `1` + - `warning` or `2` + - `info` or `3` + - `debug` or `4` + - `trace` or `5` + schema: + #type: [string, integer] + default: info + - name: level + in: query + required: false + description: | + Returns all log entries of log level `level`. Note that the query parameters + `upto` and `level` are mutually exclusive. + schema: + type: string + - name: start + in: query + required: false + description: | + Returns all log entries such that their log entry identifier (`lid` value) + is greater or equal to `start`. + schema: + type: number + default: 0 + - name: size + in: query + required: false + description: | + Restricts the result to at most `size` log entries. + schema: + type: number + - name: offset + in: query + required: false + description: | + Starts to return log entries skipping the first `offset` log entries. `offset` + and `size` can be used for pagination. + schema: + type: number + default: 0 + - name: search + in: query + required: false + description: | + Only return the log entries containing the text specified in `search`. + schema: + type: string + - name: sort + in: query + required: false + description: | + Sort the log entries either ascending (if `sort` is `asc`) or descending + (if `sort` is `desc`) according to their `lid` values. Note that the `lid` + imposes a chronological order. + schema: + type: string + default: asc + - name: serverId + in: query + required: false + description: | + Returns all log entries of the specified server. All other query parameters + remain valid. If no serverId is given, the asked server + will reply. This parameter is only meaningful on Coordinators. + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - lid + - level + - timestamp + - text + - topic + - totalAmount + properties: + lid: + description: | + a list of log entry identifiers. Each log message is uniquely + identified by its @LIT{lid} and the identifiers are in ascending + order. + type: array + items: + type: string + level: + description: | + A list of the log levels for all log entries. + type: string + timestamp: + description: | + a list of the timestamps as seconds since 1970-01-01 for all log + entries. + type: array + items: + type: string + text: + description: | + a list of the texts of all log entries + type: string + topic: + description: | + a list of the topics of all log entries + type: string + totalAmount: + description: | + the total amount of log entries before pagination. + type: integer + '400': + description: | + is returned if invalid values are specified for `upto` or `level`. + '403': + description: | + is returned if there are insufficient privileges to access the logs. + tags: + - Monitoring +``` + +## Get the server log levels + +```openapi +paths: + /_admin/log/level: + get: + operationId: getLogLevel + description: | + Returns the server's current log level settings. + The result is a JSON object with the log topics being the object keys, and + the log levels being the object values. + + This API can be turned off via the startup option `--log.api-enabled`. In case + the API is disabled, all requests will be responded to with HTTP 403. If the + API is enabled, accessing it requires admin privileges, or even superuser + privileges, depending on the value of the `--log.api-enabled` startup option. + parameters: + - name: serverId + in: query + required: false + description: | + Forwards the request to the specified server. + schema: + type: string + responses: + '200': + description: | + is returned if the request is valid + '403': + description: | + is returned if there are insufficient privileges to read log levels. + tags: + - Monitoring +``` + +## Set the server log levels + +```openapi +paths: + /_admin/log/level: + put: + operationId: setLogLevel + description: | + Modifies and returns the server's current log level settings. + The request body must be a JSON string with a log level or a JSON object with the + log topics being the object keys and the log levels being the object values. + + If only a JSON string is specified as input, the log level is adjusted for the + "general" log topic only. If a JSON object is specified as input, the log levels will + be set only for the log topic mentioned in the input object, but preserved for every + other log topic. + To set the log level for all log levels to a specific value, it is possible to hand + in the special pseudo log topic "all". + + The result is a JSON object with all available log topics being the object keys, and + the adjusted log levels being the object values. + + Possible log levels are: + - `FATAL` - Only critical errors are logged after which the _arangod_ + process terminates. + - `ERROR` - Only errors are logged. You should investigate and fix errors + as they may harm your production. + - `WARNING` - Errors and warnings are logged. Warnings may be serious + application-wise and can indicate issues that might lead to errors + later on. + - `INFO` - Errors, warnings, and general information is logged. + - `DEBUG` - Outputs debug messages used in the development of ArangoDB + in addition to the above. + - `TRACE` - Logs detailed tracing of operations in addition to the above. + This can flood the log. Don't use this log level in production. + + This API can be turned off via the startup option `--log.api-enabled`. In case + the API is disabled, all requests will be responded to with HTTP 403. If the + API is enabled, accessing it requires admin privileges, or even superuser + privileges, depending on the value of the `--log.api-enabled` startup option. + parameters: + - name: serverId + in: query + required: false + description: | + Forwards the request to the specified server. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + all: + description: | + Pseudo-topic to address all log topics. + type: string + agency: + description: | + Agents use this log topic to inform about any activity + including the RAFT consensus gossip. + type: string + agencycomm: + description: | + DB-Servers and Coordinators log the requests they send to the + Agency. + type: string + agencystore: + description: | + Optional verbose logging of Agency write operations. + type: string + aql: + description: | + Logs information about the AQL query optimization and + execution. DB-Servers and Coordinators log the cluster-internal + communication around AQL queries. It also reports the AQL + memory limit on startup. + type: string + arangosearch: + description: | + Logs information related to ArangoSearch including Analyzers, + the column cache, and the commit and consolidation threads. + type: string + audit-authentication: + description: | + Controls whether events such as successful logins and + missing or wrong credentials are written to the audit log + (_Enterprise Edition only_). + type: string + audit-authorization: + description: | + Controls whether events such as users trying to access databases + without the necessary permissions are written to the audit log + (_Enterprise Edition only_). + type: string + audit-collection: + description: | + Controls whether events about collections creation, truncation, + and deletion are written to the audit log (_Enterprise Edition only_). + type: string + audit-database: + description: | + Controls whether events about database creation and deletion + are written to the audit log (_Enterprise Edition only_). + type: string + audit-document: + description: | + Controls whether document read and write events are written + to the audit log (_Enterprise Edition only_). + type: string + audit-hotbackup: + description: | + Controls whether the Hot Backup creation, restore, and delete + events are written to the audit log (_Enterprise Edition only_). + type: string + audit-service: + description: | + Controls whether the start and stop events of the audit + service are written to the audit log (_Enterprise Edition only_). + type: string + audit-view: + description: | + Controls whether events about View creation and deletion + are written to the audit log (_Enterprise Edition only_). + type: string + authentication: + description: | + Logs events related to authentication, for example, when a + JWT secret is generated or a token is validated against a secret. + type: string + authorization: + description: | + Logs when a user has insufficient permissions for a request. + type: string + backup: + description: | + Logs events related to Hot Backup (_Enterprise Edition only_). + type: string + bench: + description: | + Logs events related to benchmarking with _arangobench_. + type: string + cache: + description: | + Logs events related to caching documents and index entries + as well as the cache configuration on startup. + type: string + cluster: + description: | + Logs information related to the cluster-internal communication + as well as cluster operations. This includes changes to the + state and readiness of DB-Servers and connectivity checks + on Coordinators. + type: string + communication: + description: | + Logs lower-level network connection and communication events. + type: string + config: + description: | + Logs information related to the startup options and server + configuration. + type: string + crash: + description: | + Logs information about a fatal error including a backtrace + before the process terminates. + type: string + development: + description: | + This log topic is reserved for the development of ArangoDB. + type: string + dump: + description: | + Logs events related to dumping data with _arangodump_. + type: string + engines: + description: | + Logs various information related to ArangoDB's use of the + RocksDB storage engine, like the initialization and + file operations. + + RocksDB's internal log messages are passed through using the + `rocksdb` log topic. + type: string + flush: + description: | + Logs events related to flushing data from memory to disk. + type: string + general: + description: | + Logs all messages of general interest and that don't fit + under any of the other log topics. For example, it reports + the ArangoDB version and the detected operating system and + memory on startup. + type: string + graphs: + description: | + Logs information related to graph operations including + graph traversal and path search tracing. + type: string + heartbeat: + description: | + Logs everything related to the cluster heartbeat for + monitoring the intra-connectivity. + type: string + httpclient: + description: | + Logs the activity of the HTTP request subsystem that is used + in replication, client tools, and V8. + type: string + ldap: + description: | + Logs everything related to LDAP authentication (_Enterprise Edition only_). + type: string + libiresearch: + description: | + Logs the internal log messages of IResearch, the underlying + library of ArangoSearch. + type: string + license: + description: | + Logs events related to the license management like the + expiration of a license (_Enterprise Edition only_). + type: string + maintenance: + description: | + Logs the operations of the cluster maintenance including + shard locking and collection creation. + type: string + memory: + description: | + Logs the memory configuration on startup and reports + problems with memory alignment and operating system settings. + type: string + mmap: + description: | + Unused log topic for information related to memory mapping. + type: string + pregel: + description: | + Logs everything related to Pregel graph processing. + type: string + queries: + description: | + Logs slow queries as well as internal details about the + execution of AQL queries at low log levels. + type: string + replication: + description: | + Logs information related to the data replication within a cluster. + type: string + requests: + description: | + Logs the handling of internal and external requests and + can include IP addresses, endpoints, and HTTP headers and + bodies when using low log levels. + + It overlaps with the network `communication` log topic. + type: string + restore: + description: | + This log topic is only used by _arangorestore_. + type: string + rocksdb: + description: | + Logs RocksDB's internal log messages as well RocksDB + background errors. + + Information related to ArangoDB's use of the + RocksDB storage engine uses the `engines` log topic. + type: string + security: + description: | + Logs the security configuration for V8. + type: string + ssl: + description: | + Logs information related to the in-transit encryption of + network communication using SSL/TLS. + type: string + startup: + description: | + Logs information related to the startup and shutdown of a + server process as well as anything related to upgrading the + database directory. + type: string + statistics: + description: | + Logs events related to processing server statistics. + This is independent of server metrics. + type: string + supervision: + description: | + Logs information related to the Agency's cluster supervision. + type: string + syscall: + description: | + Logs events related to calling operating system functions. + It reports problems related to file descriptors and the + server process monitoring. + type: string + threads: + description: | + Logs information related to the use of operating system + threads and the threading configuration of ArangoDB. + type: string + trx: + description: | + Logs information about transaction management. + type: string + ttl: + description: | + Logs the activity of the background thread for + time-to-live (TTL) indexes. + type: string + validation: + description: | + Logs when the schema validation fails for a document. + type: string + v8: + description: | + Logs various information related to ArangoDB's use of the + V8 JavaScript engine, like the initialization as well as + entering and exiting contexts. + type: string + views: + description: | + Logs certain events related to ArangoSearch Views. + type: string + responses: + '200': + description: | + is returned if the request is valid + '400': + description: | + is returned when the request body contains invalid JSON. + '403': + description: | + is returned if there are insufficient privileges to adjust log levels. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Monitoring +``` + +## Get the structured log settings + +```openapi +paths: + /_admin/log/structured: + get: + operationId: getStructuredLog + description: | + Returns the server's current structured log settings. + The result is a JSON object with the log parameters being the object keys, and + `true` or `false` being the object values, meaning the parameters are either + enabled or disabled. + + This API can be turned off via the startup option `--log.api-enabled`. In case + the API is disabled, all requests will be responded to with HTTP 403. If the + API is enabled, accessing it requires admin privileges, or even superuser + privileges, depending on the value of the `--log.api-enabled` startup option. + responses: + '200': + description: | + is returned if the request is valid + '403': + description: | + is returned if there are insufficient privileges to read structured log + parameters. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Monitoring +``` + +## Set the structured log settings + +```openapi +paths: + /_admin/log/structured: + put: + operationId: setStructuredLog + description: | + Modifies and returns the server's current structured log settings. + The request body must be a JSON object with the structured log parameters + being the object keys and `true` or `false` object values, for either + enabling or disabling the parameters. + + The result is a JSON object with all available structured log parameters being + the object keys, and `true` or `false` being the object values, meaning the + parameter in the object key is either enabled or disabled. + + This API can be turned off via the startup option `--log.api-enabled`. In case + the API is disabled, all requests will be responded to with HTTP 403. If the + API is enabled, accessing it requires admin privileges, or even superuser + privileges, depending on the value of the `--log.api-enabled` startup option. + requestBody: + content: + application/json: + schema: + type: object + properties: + database: + description: | + One of the possible log parameters. + type: boolean + username: + description: | + One of the possible log parameters. + type: boolean + url: + description: | + One of the possible log parameters. + type: boolean + responses: + '200': + description: | + is returned if the request is valid + '403': + description: | + is returned if there are insufficient privileges to adjust log levels. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Monitoring +``` diff --git a/site/content/arangodb/oem/develop/http-api/monitoring/metrics.md b/site/content/arangodb/oem/develop/http-api/monitoring/metrics.md new file mode 100644 index 0000000000..702edd0a0f --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/monitoring/metrics.md @@ -0,0 +1,214 @@ +--- +title: HTTP interface for server metrics +menuTitle: Metrics +weight: 15 +description: >- + You can use ArangoDB server metrics to monitor the healthiness and performance + of the system +pageToc: + maxHeadlineLevel: 3 +--- +_arangod_ exports metrics in the +[Prometheus format](https://prometheus.io/docs/instrumenting/exposition_formats/). +The thresholds for alerts are described for relevant metrics. + +{{< warning >}} +The list of exposed metrics is subject to change in every minor version. +While they should stay backwards compatible for the most part, some metrics are +coupled to specific internals that may be replaced by other mechanisms in the +future. +{{< /warning >}} + +Whether the `/_admin/metrics*` endpoints are available depends on the setting of +the [`--server.export-metrics-api` startup option](../../../components/arangodb-server/options.md#--serverexport-metrics-api). +For additional document read and write metrics, the +[`--server.export-read-write-metrics` startup option](../../../components/arangodb-server/options.md#--serverexport-read-write-metrics) +needs to be enabled. + +## Metrics API v2 + +### Get the metrics + +```openapi +paths: + /_db/{database-name}/_admin/metrics/v2: + get: + operationId: getMetricsV2 + description: | + Returns the instance's current metrics in Prometheus format. The + returned document collects all instance metrics, which are measured + at any given time and exposes them for collection by Prometheus. + + The document contains different metrics and metrics groups dependent + on the role of the queried instance. All exported metrics are + published with the prefix `arangodb_` or `rocksdb_` to distinguish them from + other collected data. + + The API then needs to be added to the Prometheus configuration file + for collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + - name: serverId + in: query + required: false + description: | + Returns metrics of the specified server. If no serverId is given, the asked + server will reply. This parameter is only meaningful on Coordinators. + schema: + type: string + responses: + '200': + description: | + Metrics were returned successfully. + '404': + description: | + The metrics API may be disabled using `--server.export-metrics-api false` + setting in the server. In this case, the result of the call indicates the API + to be not found. + tags: + - Monitoring +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminMetricsV2 +--- +var url = "/_admin/metrics/v2"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logPlainResponse(response); +``` + +{{% metrics %}} + +## Get usage metrics + +```openapi +paths: + /_db/{database-name}/_admin/usage-metrics: + get: + operationId: getUsageMetrics + description: | + Returns detailed shard usage metrics on DB-Servers. + + These metrics can be enabled by setting the `--server.export-shard-usage-metrics` + startup option to `enabled-per-shard` to make DB-Servers collect per-shard + usage metrics, or to `enabled-per-shard-per-user` to make DB-Servers collect + usage metrics per shard and per user whenever a shard is accessed. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + - name: serverId + in: query + required: false + description: | + Returns the usage metrics of the specified server. If no `serverId` is given, + the asked server will reply. This parameter is only meaningful on Coordinators. + schema: + type: string + responses: + '200': + description: | + Metrics were returned successfully. + tags: + - Monitoring +``` + +## Metrics API + +### Get the metrics (deprecated) + +```openapi +paths: + /_db/{database-name}/_admin/metrics: + get: + operationId: getMetrics + description: | + {{</* warning */>}} + This endpoint should no longer be used. It is deprecated from version 3.8.0 on. + Use `/_admin/metrics/v2` instead. From version 3.10.0 onward, `/_admin/metrics` + returns the same metrics as `/_admin/metrics/v2`. + {{</* /warning */>}} + + Returns the instance's current metrics in Prometheus format. The + returned document collects all instance metrics, which are measured + at any given time and exposes them for collection by Prometheus. + + The document contains different metrics and metrics groups dependent + on the role of the queried instance. All exported metrics are + published with the `arangodb_` or `rocksdb_` string to distinguish + them from other collected data. + + The API then needs to be added to the Prometheus configuration file + for collection. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + - name: serverId + in: query + required: false + description: | + Returns metrics of the specified server. If no serverId is given, the asked + server will reply. This parameter is only meaningful on Coordinators. + schema: + type: string + responses: + '200': + description: | + Metrics were returned successfully. + '404': + description: | + The metrics API may be disabled using `--server.export-metrics-api false` + setting in the server. In this case, the result of the call indicates the API + to be not found. + tags: + - Monitoring +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminMetrics +--- +var url = "/_admin/metrics"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logPlainResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/monitoring/statistics.md b/site/content/arangodb/oem/develop/http-api/monitoring/statistics.md new file mode 100644 index 0000000000..f74b5d5163 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/monitoring/statistics.md @@ -0,0 +1,689 @@ +--- +title: HTTP interface for server statistics +menuTitle: Statistics +weight: 10 +description: >- + Server statistics let you monitor the system but they are superseded by + the more detailed server metrics +--- +## Get the statistics + +```openapi +paths: + /_db/{database-name}/_admin/statistics: + get: + operationId: getStatistics + description: | + {{</* warning */>}} + This endpoint should no longer be used. It is deprecated from version 3.8.0 on. + Use `/_admin/metrics/v2` instead, which provides the data exposed by this API + and a lot more. + {{</* /warning */>}} + + Returns the statistics information. The returned object contains the + statistics figures grouped together according to the description returned by + `/_admin/statistics-description`. For instance, to access a figure `userTime` + from the group `system`, you first select the sub-object describing the + group stored in `system` and in that sub-object the value for `userTime` is + stored in the attribute of the same name. + + In case of a distribution, the returned object contains the total count in + `count` and the distribution list in `counts`. The sum (or total) of the + individual values is returned in `sum`. + + The transaction statistics show the local started, committed and aborted + transactions as well as intermediate commits done for the server queried. The + intermediate commit count will only take non zero values for the RocksDB + storage engine. Coordinators do almost no local transactions themselves in + their local databases, therefor cluster transactions (transactions started on a + Coordinator that require DB-Servers to finish before the transactions is + committed cluster wide) are just added to their local statistics. This means + that the statistics you would see for a single server is roughly what you can + expect in a cluster setup using a single Coordinator querying this Coordinator. + Just with the difference that cluster transactions have no notion of + intermediate commits and will not increase the value. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + responses: + '200': + description: | + Statistics were returned successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - time + - errorMessage + - enabled + - system + - client + - http + - server + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + time: + description: | + the current server timestamp + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + enabled: + description: | + `true` if the server has the statistics module enabled. If not, don't expect any values. + type: boolean + system: + description: | + metrics gathered from the system about this process; may depend on the host OS + type: object + required: + - minorPageFaults + - majorPageFaults + - userTime + - systemTime + - numberOfThreads + - residentSize + - residentSizePercent + - virtualSize + properties: + minorPageFaults: + description: | + pagefaults + type: integer + majorPageFaults: + description: | + pagefaults + type: integer + userTime: + description: | + the user CPU time used by the server process + type: number + systemTime: + description: | + the system CPU time used by the server process + type: number + numberOfThreads: + description: | + the number of threads in the server + type: integer + residentSize: + description: | + RSS of process + type: integer + residentSizePercent: + description: | + RSS of process in % + type: number + virtualSize: + description: | + VSS of the process + type: integer + client: + description: | + information about the connected clients and their resource usage + type: object + required: + - connectionTime + - totalTime + - requestTime + - queueTime + - ioTime + - bytesSent + - bytesReceived + - httpConnections + properties: + connectionTime: + description: | + total connection times + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + totalTime: + description: | + the system time + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + requestTime: + description: | + the request times + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + queueTime: + description: | + the time requests were queued waiting for processing + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + ioTime: + description: | + IO Time + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + bytesSent: + description: | + number of bytes sent to the clients + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + bytesReceived: + description: | + number of bytes received from the clients + type: object + required: + - sum + - count + - counts + properties: + sum: + description: | + summarized value of all counts + type: number + count: + description: | + number of values summarized + type: integer + counts: + description: | + array containing the values + type: array + items: + type: integer + httpConnections: + description: | + the number of open http connections + type: integer + http: + description: | + the numbers of requests by Verb + type: object + required: + - requestsTotal + - requestsAsync + - requestsGet + - requestsHead + - requestsPost + - requestsPut + - requestsPatch + - requestsDelete + - requestsOptions + - requestsOther + properties: + requestsTotal: + description: | + total number of http requests + type: integer + requestsAsync: + description: | + total number of asynchronous http requests + type: integer + requestsGet: + description: | + No of requests using the GET-verb + type: integer + requestsHead: + description: | + No of requests using the HEAD-verb + type: integer + requestsPost: + description: | + No of requests using the POST-verb + type: integer + requestsPut: + description: | + No of requests using the PUT-verb + type: integer + requestsPatch: + description: | + No of requests using the PATCH-verb + type: integer + requestsDelete: + description: | + No of requests using the DELETE-verb + type: integer + requestsOptions: + description: | + No of requests using the OPTIONS-verb + type: integer + requestsOther: + description: | + No of requests using the none of the above identified verbs + type: integer + server: + description: | + statistics of the server + type: object + required: + - uptime + - physicalMemory + - transactions + - v8Context + - threads + properties: + uptime: + description: | + time the server is up and running + type: integer + physicalMemory: + description: | + available physical memory on the server + type: integer + transactions: + description: | + Statistics about transactions + type: object + required: + - started + - committed + - aborted + - intermediateCommits + properties: + started: + description: | + the number of started transactions + type: integer + committed: + description: | + the number of committed transactions + type: integer + aborted: + description: | + the number of aborted transactions + type: integer + intermediateCommits: + description: | + the number of intermediate commits done + type: integer + v8Context: + description: | + Statistics about the V8 javascript contexts + type: object + required: + - available + - busy + - dirty + - free + - max + - min + - memory + properties: + available: + description: | + the number of currently spawned V8 contexts + type: integer + busy: + description: | + the number of currently active V8 contexts + type: integer + dirty: + description: | + the number of contexts that were previously used, and should now be garbage collected before being re-used + type: integer + free: + description: | + the number of V8 contexts that are free to use + type: integer + max: + description: | + the maximum number of V8 concurrent contexts we may spawn as configured by --javascript.v8-contexts + type: integer + min: + description: | + the minimum number of V8 contexts that are spawned as configured by --javascript.v8-contexts-minimum + type: integer + memory: + description: | + a list of V8 memory / garbage collection watermarks; Refreshed on every garbage collection run; + Preserves min/max memory used at that time for 10 seconds + type: array + items: + type: object + required: + - contextId + - tMax + - countOfTimes + - heapMax + - heapMin + properties: + contextId: + description: | + ID of the context this set of memory statistics is from + type: integer + tMax: + description: | + the timestamp where the 10 seconds interval started + type: number + countOfTimes: + description: | + how many times was the garbage collection run in these 10 seconds + type: integer + heapMax: + description: | + High watermark of all garbage collection runs in 10 seconds + type: integer + heapMin: + description: | + Low watermark of all garbage collection runs in these 10 seconds + type: integer + threads: + description: | + Statistics about the server worker threads (excluding V8 specific or jemalloc specific threads and system threads) + type: object + required: + - scheduler-threads + - in-progress + - queued + properties: + scheduler-threads: + description: | + The number of spawned worker threads + type: integer + in-progress: + description: | + The number of currently busy worker threads + type: integer + queued: + description: | + The number of jobs queued up waiting for worker threads becoming available + type: integer + '404': + description: | + Statistics are disabled on the instance. + tags: + - Monitoring +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminStatistics1 +--- +var url = "/_admin/statistics"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Get the statistics description + +```openapi +paths: + /_db/{database-name}/_admin/statistics-description: + get: + operationId: getStatisticsDescription + description: | + {{</* warning */>}} + This endpoint should no longer be used. It is deprecated from version 3.8.0 on. + Use `/_admin/metrics/v2` instead, which provides the data exposed by the + statistics API and a lot more. + {{</* /warning */>}} + + Returns a description of the statistics returned by `/_admin/statistics`. + The returned objects contains an array of statistics groups in the attribute + `groups` and an array of statistics figures in the attribute `figures`. + + A statistics group is described by + + - `group`: The identifier of the group. + - `name`: The name of the group. + - `description`: A description of the group. + + A statistics figure is described by + + - `group`: The identifier of the group to which this figure belongs. + - `identifier`: The identifier of the figure. It is unique within the group. + - `name`: The name of the figure. + - `description`: A description of the figure. + - `type`: Either `current`, `accumulated`, or `distribution`. + - `cuts`: The distribution vector. + - `units`: Units in which the figure is measured. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + responses: + '200': + description: | + Description was returned successfully. + content: + application/json: + schema: + type: object + required: + - groups + - figures + - code + - error + properties: + groups: + description: | + A statistics group + type: array + items: + type: object + required: + - group + - name + - description + properties: + group: + description: | + The identifier of the group. + type: string + name: + description: | + The name of the group. + type: string + description: + description: | + A description of the group. + type: string + figures: + description: | + A statistics figure + type: array + items: + type: object + required: + - group + - identifier + - name + - description + - type + - cuts + - units + properties: + group: + description: | + The identifier of the group to which this figure belongs. + type: string + identifier: + description: | + The identifier of the figure. It is unique within the group. + type: string + name: + description: | + The name of the figure. + type: string + description: + description: | + A description of the figure. + type: string + type: + description: | + Either `current`, `accumulated`, or `distribution`. + type: string + cuts: + description: | + The distribution vector. + type: string + units: + description: | + Units in which the figure is measured. + type: string + code: + description: | + The HTTP response status code. + type: integer + example: 200 + error: + description: | + the error, `false` in this case + type: boolean + tags: + - Monitoring +``` + +**Examples** + +```curl +--- +description: '' +name: RestAdminStatisticsDescription1 +--- +var url = "/_admin/statistics-description"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/pregel.md b/site/content/arangodb/oem/develop/http-api/pregel.md new file mode 100644 index 0000000000..2745359087 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/pregel.md @@ -0,0 +1,1375 @@ +--- +title: Pregel HTTP API +menuTitle: Pregel +weight: 45 +description: >- + The HTTP API for Pregel lets you execute, cancel, and list Pregel jobs +--- +See [Distributed Iterative Graph Processing (Pregel)](../../data-science/pregel/_index.md) +for details. + +## Start a Pregel job execution + +```openapi +paths: + /_api/control_pregel: + post: + operationId: createPregelJob + description: | + To start an execution you need to specify the algorithm name and a named graph + (SmartGraph in cluster). Alternatively you can specify the vertex and edge + collections. Additionally you can specify custom parameters which vary for each + algorithm. + requestBody: + content: + application/json: + schema: + type: object + required: + - algorithm + properties: + algorithm: + description: | + Name of the algorithm. One of: + - `"pagerank"` - Page Rank + - `"sssp"` - Single-Source Shortest Path + - `"connectedcomponents"` - Connected Components + - `"wcc"` - Weakly Connected Components + - `"scc"` - Strongly Connected Components + - `"hits"` - Hyperlink-Induced Topic Search + - `"effectivecloseness"` - Effective Closeness + - `"linerank"` - LineRank + - `"labelpropagation"` - Label Propagation + - `"slpa"` - Speaker-Listener Label Propagation + type: string + graphName: + description: | + Name of a graph. Either this or the parameters `vertexCollections` and + `edgeCollections` are required. + Please note that there are special sharding requirements for graphs in order + to be used with Pregel. + type: string + vertexCollections: + description: | + List of vertex collection names. + Please note that there are special sharding requirements for collections in order + to be used with Pregel. + type: array + items: + type: string + edgeCollections: + description: | + List of edge collection names. + Please note that there are special sharding requirements for collections in order + to be used with Pregel. + type: array + items: + type: string + params: + description: | + General as well as algorithm-specific options. + + The most important general option is "store", which controls whether the results + computed by the Pregel job are written back into the source collections or not. + + Another important general option is "parallelism", which controls the number of + parallel threads that work on the Pregel job at most. If "parallelism" is not + specified, a default value may be used. In addition, the value of "parallelism" + may be effectively capped at some server-specific value. + + The option "useMemoryMaps" controls whether to use disk based files to store + temporary results. This might make the computation disk-bound, but allows you to + run computations which would not fit into main memory. It is recommended to set + this flag for larger datasets. + + The attribute "shardKeyAttribute" specifies the shard key that edge collections are + sharded after (default: `"vertex"`). + type: object + responses: + '200': + description: | + HTTP 200 is returned in case the Pregel was successfully created and the reply + body is a string with the `id` to query for the status or to cancel the + execution. + '400': + description: | + An HTTP 400 error is returned if the set of collections for the Pregel job includes + a system collection, or if the collections to not conform to the sharding requirements + for Pregel jobs. + '403': + description: | + An HTTP 403 error is returned if there are not sufficient privileges to access + the collections specified for the Pregel job. + '404': + description: | + An HTTP 404 error is returned if the specified "algorithm" is not found, or the + graph specified in "graphName" is not found, or at least one the collections + specified in "vertexCollections" or "edgeCollections" is not found. + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Run the Weakly Connected Components (WCC) algorithm against a graph and store + the results in the vertices as attribute `component`: +name: RestPregelStartConnectedComponents +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("1. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + resultField: "component", + } +} +var response = logCurlRequest("POST", url, body); + +assert(response.code === 200); + +logJsonResponse(response); + +var id = response.parsedBody; +var url = "/_api/control_pregel/" + id; +while (true) { + var status = internal.arango.GET(url); + if (["done", "canceled", "fatal error"].includes(status.state)) { + assert(status.state == "done"); + break; + } else { + print(`1. Waiting for Pregel job ${id} (${status.state})...`); + internal.sleep(0.5); + } +} +examples.dropGraph("connectedComponentsGraph"); + +``` + +## Get a Pregel job execution status + +```openapi +paths: + /_api/control_pregel/{id}: + get: + operationId: getPregelJob + description: | + Returns the current state of the execution, the current global superstep, the + runtime, the global aggregator values as well as the number of sent and + received messages. + parameters: + - name: id + in: path + required: true + description: | + Pregel execution identifier. + schema: + type: number + responses: + '200': + description: | + HTTP 200 is returned in case the job execution ID was valid and the state is + returned along with the response. + content: + application/json: + schema: + description: | + The information about the Pregel job. + type: object + required: + - id + - algorithm + - created + - ttl + - state + - gss + - totalRuntime + - startupTime + - computationTime + - reports + - detail + properties: + id: + description: | + The ID of the Pregel job, as a string. + type: string + algorithm: + description: | + The algorithm used by the job. + type: string + created: + description: | + The date and time when the job was created. + type: string + expires: + description: | + The date and time when the job results expire. The expiration date is only + meaningful for jobs that were completed, canceled or resulted in an error. Such jobs + are cleaned up by the garbage collection when they reach their expiration date/time. + type: string + ttl: + description: | + The TTL (time to live) value for the job results, specified in seconds. + The TTL is used to calculate the expiration date for the job's results. + type: number + state: + description: | + The state of the execution. The following values can be returned: + - `"none"`: The Pregel run has not started yet. + - `"loading"`: The graph is being loaded from the database into memory before + executing the algorithm. + - `"running"`: The algorithm is executing normally. + - `"storing"`: The algorithm finished, but the results are still being written + back into the collections. Only occurs if the `store` parameter is set to `true`. + - `"done"`: The execution is done. This means that storing is also done. + This event is announced in the server log (requires at least the `info` + log level for the `pregel` log topic). + - `"canceled"`: The execution was permanently canceled, either by the user or by + an error. + - `"in error"`: The execution is in an error state. This can be caused by + primary DB-Servers being unreachable or unresponsive. The execution + might recover later, or switch to `"canceled"` if it is not able to recover + successfully. + - `"recovering"`: The execution is actively recovering and + switches back to `running` if the recovery is successful. + - `"fatal error"`: The execution has failed and cannot recover. + type: string + gss: + description: | + The number of global supersteps executed. + type: integer + totalRuntime: + description: | + The total runtime of the execution up to now (if the execution is still ongoing). + type: number + startupTime: + description: | + The startup runtime of the execution. + The startup time includes the data loading time and can be substantial. + type: number + computationTime: + description: | + The algorithm execution time. Is shown when the computation started. + type: number + storageTime: + description: | + The time for storing the results if the job includes results storage. + Is shown when the storing started. + type: number + gssTimes: + description: | + Computation time of each global super step. Is shown when the computation started. + type: array + items: + type: number + reports: + description: | + This attribute is used by Programmable Pregel Algorithms (`ppa`, experimental). + The value is only populated once the algorithm has finished. + type: array + items: + type: object + vertexCount: + description: | + The total number of vertices processed. + type: integer + edgeCount: + description: | + The total number of edges processed. + type: integer + detail: + description: | + The Pregel run details. + type: object + required: + - aggregatedStatus + - workerStatus + properties: + aggregatedStatus: + description: | + The aggregated details of the full Pregel run. The values are totals of all the + DB-Server. + type: object + required: + - timeStamp + properties: + timeStamp: + description: | + The time at which the status was measured. + type: string + graphStoreStatus: + description: | + The status of the in memory graph. + type: object + properties: + verticesLoaded: + description: | + The number of vertices that are loaded from the database into memory. + type: integer + edgesLoaded: + description: | + The number of edges that are loaded from the database into memory. + type: integer + memoryBytesUsed: + description: | + The number of bytes used in-memory for the loaded graph. + type: integer + verticesStored: + description: | + The number of vertices that are written back to the database after the Pregel + computation finished. It is only set if the `store` parameter is set to `true`. + type: integer + allGssStatus: + description: | + Information about the global supersteps. + type: object + properties: + items: + description: | + A list of objects with details for each global superstep. + type: array + items: + type: object + properties: + verticesProcessed: + description: | + The number of vertices that have been processed in this step. + type: integer + messagesSent: + description: | + The number of messages sent in this step. + type: integer + messagesReceived: + description: | + The number of messages received in this step. + type: integer + memoryBytesUsedForMessages: + description: | + The number of bytes used in memory for the messages in this step. + type: integer + workerStatus: + description: | + The details of the Pregel for every DB-Server. Each object key is a DB-Server ID, + + and each value is a nested object similar to the `aggregatedStatus` attribute. + + In a single server deployment, there is only a single entry with an empty string as key. + type: object + '404': + description: | + An HTTP 404 error is returned if no Pregel job with the specified execution number + is found or the execution number is invalid. + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Get the execution status of a Pregel job: +name: RestPregelStatusConnectedComponents +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("3. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + resultField: "component" + } +}; +var id = internal.arango.POST(url, body); +var url = "/_api/control_pregel/" + id; +while (true) { + var status = internal.arango.GET(url); + if (status.error || ["done", "canceled", "fatal error"].includes(status.state)) { + assert(status.state == "done"); + break; + } else { + print(`3. Waiting for Pregel job ${id} (${status.state})...`); + internal.sleep(0.5); + } +} + +var response = logCurlRequest("GET", url); +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` + +## List the running Pregel jobs + +```openapi +paths: + /_api/control_pregel: + get: + operationId: listPregelJobs + description: | + Returns a list of currently running and recently finished Pregel jobs without + retrieving their results. + responses: + '200': + description: | + Is returned when the list of jobs can be retrieved successfully. + content: + application/json: + schema: + description: | + A list of objects describing the Pregel jobs. + type: array + items: + type: object + required: + - id + - algorithm + - created + - ttl + - state + - gss + - totalRuntime + - startupTime + - computationTime + - reports + - detail + properties: + id: + description: | + The ID of the Pregel job, as a string. + type: string + algorithm: + description: | + The algorithm used by the job. + type: string + created: + description: | + The date and time when the job was created. + type: string + expires: + description: | + The date and time when the job results expire. The expiration date is only + meaningful for jobs that were completed, canceled or resulted in an error. Such jobs + are cleaned up by the garbage collection when they reach their expiration date/time. + type: string + ttl: + description: | + The TTL (time to live) value for the job results, specified in seconds. + The TTL is used to calculate the expiration date for the job's results. + type: number + state: + description: | + The state of the execution. The following values can be returned: + - `"none"`: The Pregel run has not started yet. + - `"loading"`: The graph is being loaded from the database into memory before + executing the algorithm. + - `"running"`: The algorithm is executing normally. + - `"storing"`: The algorithm finished, but the results are still being written + back into the collections. Only occurs if the `store` parameter is set to `true`. + - `"done"`: The execution is done. This means that storing is also done. + This event is announced in the server log (requires at least the `info` + log level for the `pregel` log topic). + - `"canceled"`: The execution was permanently canceled, either by the user or by + an error. + - `"in error"`: The execution is in an error state. This can be caused by + primary DB-Servers being unreachable or unresponsive. The execution + might recover later, or switch to `"canceled"` if it is not able to recover + successfully. + - `"recovering"`: The execution is actively recovering and + switches back to `running` if the recovery is successful. + - `"fatal error"`: The execution has failed and cannot recover. + type: string + gss: + description: | + The number of global supersteps executed. + type: integer + totalRuntime: + description: | + The total runtime of the execution up to now (if the execution is still ongoing). + type: number + startupTime: + description: | + The startup runtime of the execution. + The startup time includes the data loading time and can be substantial. + type: number + computationTime: + description: | + The algorithm execution time. Is shown when the computation started. + type: number + storageTime: + description: | + The time for storing the results if the job includes results storage. + Is shown when the storing started. + type: number + gssTimes: + description: | + Computation time of each global super step. Is shown when the computation started. + type: array + items: + type: number + reports: + description: | + This attribute is used by Programmable Pregel Algorithms (`ppa`, experimental). + The value is only populated once the algorithm has finished. + type: array + items: + type: object + vertexCount: + description: | + The total number of vertices processed. + type: integer + edgeCount: + description: | + The total number of edges processed. + type: integer + detail: + description: | + The Pregel run details. + type: object + required: + - aggregatedStatus + - workerStatus + properties: + aggregatedStatus: + description: | + The aggregated details of the full Pregel run. The values are totals of all the + DB-Server. + type: object + required: + - timeStamp + properties: + timeStamp: + description: | + The time at which the status was measured. + type: string + graphStoreStatus: + description: | + The status of the in memory graph. + type: object + properties: + verticesLoaded: + description: | + The number of vertices that are loaded from the database into memory. + type: integer + edgesLoaded: + description: | + The number of edges that are loaded from the database into memory. + type: integer + memoryBytesUsed: + description: | + The number of bytes used in-memory for the loaded graph. + type: integer + verticesStored: + description: | + The number of vertices that are written back to the database after the Pregel + computation finished. It is only set if the `store` parameter is set to `true`. + type: integer + allGssStatus: + description: | + Information about the global supersteps. + type: object + properties: + items: + description: | + A list of objects with details for each global superstep. + type: array + items: + type: object + properties: + verticesProcessed: + description: | + The number of vertices that have been processed in this step. + type: integer + messagesSent: + description: | + The number of messages sent in this step. + type: integer + messagesReceived: + description: | + The number of messages received in this step. + type: integer + memoryBytesUsedForMessages: + description: | + The number of bytes used in memory for the messages in this step. + type: integer + workerStatus: + description: | + The details of the Pregel for every DB-Server. Each object key is a DB-Server ID, + + and each value is a nested object similar to the `aggregatedStatus` attribute. + + In a single server deployment, there is only a single entry with an empty string as key. + type: object + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Get the status of all active Pregel jobs: +name: RestPregelStatusAllConnectedComponents +--- +var assertInstanceOf = require("jsunity").jsUnity.assertions.assertInstanceOf; +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("2. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + resultField: "component" + } +}; +var id = internal.arango.POST(url, body); + +var url = "/_api/control_pregel/"; + +var response = logCurlRequest("GET", url); +assert(response.code === 200); +assertInstanceOf(Array, response.parsedBody); +assert(response.parsedBody.length > 0); + +internal.arango.DELETE(url + id); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` + +## Cancel a Pregel job execution + +```openapi +paths: + /_api/control_pregel/{id}: + delete: + operationId: deletePregelJob + description: | + Cancel an execution which is still running, and discard any intermediate + results. This immediately frees all memory taken up by the execution, and + makes you lose all intermediary data. + + You might get inconsistent results if you requested to store the results and + then cancel an execution when it is already in its `"storing"` state (or + `"done"` state in versions prior to 3.7.1). The data is written multi-threaded + into all collection shards at once. This means there are multiple transactions + simultaneously. A transaction might already be committed when you cancel the + execution job. Therefore, you might see some updated documents, while other + documents have no or stale results from a previous execution. + parameters: + - name: id + in: path + required: true + description: | + Pregel execution identifier. + schema: + type: number + responses: + '200': + description: | + HTTP 200 is returned if the job execution ID was valid. + '404': + description: | + An HTTP 404 error is returned if no Pregel job with the specified execution number + is found or the execution number is invalid. + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Cancel a Pregel job to stop the execution or to free up the results if it was + started with `"store": false` and is in the done state: +name: RestPregelCancelConnectedComponents +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("4. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + store: false + } +}; +var id = internal.arango.POST(url, body); + +var statusUrl = "/_api/control_pregel/" + id; +var response = logCurlRequest("DELETE", statusUrl); + +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` + +## Get the execution statistics of a Pregel job + +```openapi +paths: + /_api/control_pregel/history/{id}: + get: + operationId: getPregelJobStatistics + description: | + Returns the current state of the execution, the current global superstep, the + runtime, the global aggregator values, as well as the number of sent and + received messages. + + The execution statistics are persisted to a system collection and kept until you + remove them, whereas the `/_api/control_pregel/{id}` endpoint only keeps the + information temporarily in memory. + parameters: + - name: id + in: path + required: true + description: | + Pregel job identifier. + schema: + type: number + responses: + '200': + description: | + is returned if the Pregel job ID is valid and the execution statistics are + returned along with the response. + content: + application/json: + schema: + description: | + The information about the Pregel job. + type: object + required: + - id + - algorithm + - created + - ttl + - state + - gss + - totalRuntime + - startupTime + - computationTime + - reports + - detail + properties: + id: + description: | + The ID of the Pregel job, as a string. + type: string + algorithm: + description: | + The algorithm used by the job. + type: string + created: + description: | + The date and time when the job was created. + type: string + expires: + description: | + The date and time when the job results expire. The expiration date is only + meaningful for jobs that were completed, canceled or resulted in an error. Such jobs + are cleaned up by the garbage collection when they reach their expiration date/time. + type: string + ttl: + description: | + The TTL (time to live) value for the job results, specified in seconds. + The TTL is used to calculate the expiration date for the job's results. + type: number + state: + description: | + The state of the execution. The following values can be returned: + - `"none"`: The Pregel run has not started yet. + - `"loading"`: The graph is being loaded from the database into memory before + executing the algorithm. + - `"running"`: The algorithm is executing normally. + - `"storing"`: The algorithm finished, but the results are still being written + back into the collections. Only occurs if the `store` parameter is set to `true`. + - `"done"`: The execution is done. This means that storing is also done. + This event is announced in the server log (requires at least the `info` + log level for the `pregel` log topic). + - `"canceled"`: The execution was permanently canceled, either by the user or by + an error. + - `"in error"`: The execution is in an error state. This can be caused by + primary DB-Servers being unreachable or unresponsive. The execution + might recover later, or switch to `"canceled"` if it is not able to recover + successfully. + - `"recovering"`: The execution is actively recovering and + switches back to `running` if the recovery is successful. + - `"fatal error"`: The execution has failed and cannot recover. + type: string + gss: + description: | + The number of global supersteps executed. + type: integer + totalRuntime: + description: | + The total runtime of the execution up to now (if the execution is still ongoing). + type: number + startupTime: + description: | + The startup runtime of the execution. + The startup time includes the data loading time and can be substantial. + type: number + computationTime: + description: | + The algorithm execution time. Is shown when the computation started. + type: number + storageTime: + description: | + The time for storing the results if the job includes results storage. + Is shown when the storing started. + type: number + gssTimes: + description: | + Computation time of each global super step. Is shown when the computation started. + type: array + items: + type: number + reports: + description: | + This attribute is used by Programmable Pregel Algorithms (`ppa`, experimental). + The value is only populated once the algorithm has finished. + type: array + items: + type: object + vertexCount: + description: | + The total number of vertices processed. + type: integer + edgeCount: + description: | + The total number of edges processed. + type: integer + detail: + description: | + The Pregel run details. + type: object + required: + - aggregatedStatus + - workerStatus + properties: + aggregatedStatus: + description: | + The aggregated details of the full Pregel run. The values are totals of all the + DB-Server. + type: object + required: + - timeStamp + properties: + timeStamp: + description: | + The time at which the status was measured. + type: string + graphStoreStatus: + description: | + The status of the in memory graph. + type: object + properties: + verticesLoaded: + description: | + The number of vertices that are loaded from the database into memory. + type: integer + edgesLoaded: + description: | + The number of edges that are loaded from the database into memory. + type: integer + memoryBytesUsed: + description: | + The number of bytes used in-memory for the loaded graph. + type: integer + verticesStored: + description: | + The number of vertices that are written back to the database after the Pregel + computation finished. It is only set if the `store` parameter is set to `true`. + type: integer + allGssStatus: + description: | + Information about the global supersteps. + type: object + properties: + items: + description: | + A list of objects with details for each global superstep. + type: array + items: + type: object + properties: + verticesProcessed: + description: | + The number of vertices that have been processed in this step. + type: integer + messagesSent: + description: | + The number of messages sent in this step. + type: integer + messagesReceived: + description: | + The number of messages received in this step. + type: integer + memoryBytesUsedForMessages: + description: | + The number of bytes used in memory for the messages in this step. + type: integer + workerStatus: + description: | + The details of the Pregel for every DB-Server. Each object key is a DB-Server ID, + + and each value is a nested object similar to the `aggregatedStatus` attribute. + + In a single server deployment, there is only a single entry with an empty string as key. + type: object + '404': + description: | + is returned if no Pregel job with the specified ID is found or if the ID + is invalid. + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Get the execution status of a Pregel job: +name: RestPregelConnectedComponentsStatisticsId +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("6. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + resultField: "component" + } +}; +var id = internal.arango.POST(url, body); + +const statusUrl = `${url}/${id}`; +while (true) { + var status = internal.arango.GET(statusUrl); + if (status.error || ["done", "canceled", "fatal error"].includes(status.state)) { + assert(status.state == "done"); + break; + } else { + print(`6. Waiting for Pregel job ${id} (${status.state})...`); + internal.sleep(0.5); + } +} + +const historyUrl = `/_api/control_pregel/history/${id}`; +var response = logCurlRequest("GET", historyUrl); +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` + +## Get the execution statistics of all Pregel jobs + +```openapi +paths: + /_api/control_pregel/history: + get: + operationId: listPregelJobsStatisics + description: | + Returns a list of currently running and finished Pregel jobs without retrieving + their results. + + The execution statistics are persisted to a system collection and kept until you + remove them, whereas the `/_api/control_pregel` endpoint only keeps the + information temporarily in memory. + responses: + '200': + description: | + is returned if the list of jobs can be retrieved successfully. + content: + application/json: + schema: + description: | + A list of objects describing the Pregel jobs. + type: array + items: + type: object + required: + - id + - algorithm + - created + - ttl + - state + - gss + - totalRuntime + - startupTime + - computationTime + - reports + - detail + properties: + id: + description: | + The ID of the Pregel job, as a string. + type: string + algorithm: + description: | + The algorithm used by the job. + type: string + created: + description: | + The date and time when the job was created. + type: string + expires: + description: | + The date and time when the job results expire. The expiration date is only + meaningful for jobs that were completed, canceled or resulted in an error. Such jobs + are cleaned up by the garbage collection when they reach their expiration date/time. + type: string + ttl: + description: | + The TTL (time to live) value for the job results, specified in seconds. + The TTL is used to calculate the expiration date for the job's results. + type: number + state: + description: | + The state of the execution. The following values can be returned: + - `"none"`: The Pregel run has not started yet. + - `"loading"`: The graph is being loaded from the database into memory before + executing the algorithm. + - `"running"`: The algorithm is executing normally. + - `"storing"`: The algorithm finished, but the results are still being written + back into the collections. Only occurs if the `store` parameter is set to `true`. + - `"done"`: The execution is done. This means that storing is also done. + This event is announced in the server log (requires at least the `info` + log level for the `pregel` log topic). + - `"canceled"`: The execution was permanently canceled, either by the user or by + an error. + - `"in error"`: The execution is in an error state. This can be caused by + primary DB-Servers being unreachable or unresponsive. The execution + might recover later, or switch to `"canceled"` if it is not able to recover + successfully. + - `"recovering"`: The execution is actively recovering and + switches back to `running` if the recovery is successful. + - `"fatal error"`: The execution has failed and cannot recover. + type: string + gss: + description: | + The number of global supersteps executed. + type: integer + totalRuntime: + description: | + The total runtime of the execution up to now (if the execution is still ongoing). + type: number + startupTime: + description: | + The startup runtime of the execution. + The startup time includes the data loading time and can be substantial. + type: number + computationTime: + description: | + The algorithm execution time. Is shown when the computation started. + type: number + storageTime: + description: | + The time for storing the results if the job includes results storage. + Is shown when the storing started. + type: number + gssTimes: + description: | + Computation time of each global super step. Is shown when the computation started. + type: array + items: + type: number + reports: + description: | + This attribute is used by Programmable Pregel Algorithms (`ppa`, experimental). + The value is only populated once the algorithm has finished. + type: array + items: + type: object + vertexCount: + description: | + The total number of vertices processed. + type: integer + edgeCount: + description: | + The total number of edges processed. + type: integer + detail: + description: | + The Pregel run details. + type: object + required: + - aggregatedStatus + - workerStatus + properties: + aggregatedStatus: + description: | + The aggregated details of the full Pregel run. The values are totals of all the + DB-Server. + type: object + required: + - timeStamp + properties: + timeStamp: + description: | + The time at which the status was measured. + type: string + graphStoreStatus: + description: | + The status of the in memory graph. + type: object + properties: + verticesLoaded: + description: | + The number of vertices that are loaded from the database into memory. + type: integer + edgesLoaded: + description: | + The number of edges that are loaded from the database into memory. + type: integer + memoryBytesUsed: + description: | + The number of bytes used in-memory for the loaded graph. + type: integer + verticesStored: + description: | + The number of vertices that are written back to the database after the Pregel + computation finished. It is only set if the `store` parameter is set to `true`. + type: integer + allGssStatus: + description: | + Information about the global supersteps. + type: object + properties: + items: + description: | + A list of objects with details for each global superstep. + type: array + items: + type: object + properties: + verticesProcessed: + description: | + The number of vertices that have been processed in this step. + type: integer + messagesSent: + description: | + The number of messages sent in this step. + type: integer + messagesReceived: + description: | + The number of messages received in this step. + type: integer + memoryBytesUsedForMessages: + description: | + The number of bytes used in memory for the messages in this step. + type: integer + workerStatus: + description: | + The details of the Pregel for every DB-Server. Each object key is a DB-Server ID, + + and each value is a nested object similar to the `aggregatedStatus` attribute. + + In a single server deployment, there is only a single entry with an empty string as key. + type: object + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Get the status of all active and past Pregel jobs: +name: RestPregelConnectedComponentsStatistics +--- +var assertInstanceOf = require("jsunity").jsUnity.assertions.assertInstanceOf; +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("5. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + resultField: "component" + } +}; + +const id = internal.arango.POST(url, body); +const historyUrl = `/_api/control_pregel/history`; + +var response = logCurlRequest("GET", historyUrl); +assert(response.code === 200); +assertInstanceOf(Array, response.parsedBody); +assert(response.parsedBody.length > 0); + +internal.arango.DELETE(url + id); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` + +## Remove the execution statistics of a past Pregel job + +```openapi +paths: + /_api/control_pregel/history/{id}: + delete: + operationId: deletePregelJobStatistics + description: | + Removes the persisted execution statistics of a finished Pregel job. + parameters: + - name: id + in: path + required: true + description: | + The Pregel job identifier. + schema: + type: number + responses: + '200': + description: | + is returned if the Pregel job ID is valid. + '404': + description: | + is returned if no Pregel job with the specified ID is found or if the ID + is invalid. + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Remove the persisted execution statistics of a finished Pregel job: +name: RestPregelConnectedComponentsRemoveStatisticsId +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("8. Creating graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + store: false + } +}; +var id = internal.arango.POST(url, body); + +const statusUrl = `${url}/${id}`; +while (true) { + var status = internal.arango.GET(statusUrl); + if (status.error || ["done", "canceled", "fatal error"].includes(status.state)) { + assert(status.state == "done"); + break; + } else { + print(`8. Waiting for Pregel job ${id} (${status.state})...`); + internal.sleep(0.5); + } +} + +const historyUrl = `/_api/control_pregel/history/${id}` +var response = logCurlRequest("DELETE", historyUrl); +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` + +## Remove the execution statistics of all past Pregel jobs + +```openapi +paths: + /_api/control_pregel/history: + delete: + operationId: deleteAllPregelJobStatistics + description: | + Removes the persisted execution statistics of all past Pregel jobs. + responses: + '200': + description: | + is returned if all persisted execution statistics have been successfully deleted. + tags: + - Pregel +``` + +**Examples** + +```curl +--- +description: |- + Remove the persisted execution statistics of all past Pregel jobs: +name: RestPregelConnectedComponentsRemoveStatistics +--- +var examples = require("@arangodb/graph-examples/example-graph.js"); +print("7. Creating Pregel graph"); +var graph = examples.loadGraph("connectedComponentsGraph"); + +var url = "/_api/control_pregel"; +var body = { + algorithm: "wcc", + graphName: "connectedComponentsGraph", + params: { + maxGSS: graph.components.count(), + store: false + } +}; +var id = internal.arango.POST(url, body); + +const statusUrl = `${url}/${id}`; +while (true) { + var status = internal.arango.GET(statusUrl); + if (status.error || ["done", "canceled", "fatal error"].includes(status.state)) { + assert(status.state == "done"); + break; + } else { + print(`7. Waiting for Pregel job ${id} (${status.state})...`); + internal.sleep(0.5); + } +} + +const deleteUrl = "/_api/control_pregel/history"; +var response = logCurlRequest("DELETE", deleteUrl); +assert(response.code === 200); + +logJsonResponse(response); +examples.dropGraph("connectedComponentsGraph"); + +``` diff --git a/site/content/arangodb/oem/develop/http-api/queries/_index.md b/site/content/arangodb/oem/develop/http-api/queries/_index.md new file mode 100644 index 0000000000..df40f4d41b --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/queries/_index.md @@ -0,0 +1,8 @@ +--- +title: HTTP interfaces for queries +menuTitle: Queries +weight: 40 +description: >- + The HTTP APIs for queries allow you to work with AQL queries, control the + results cache, and manage user-defined functions +--- diff --git a/site/content/arangodb/oem/develop/http-api/queries/aql-queries.md b/site/content/arangodb/oem/develop/http-api/queries/aql-queries.md new file mode 100644 index 0000000000..bfef9df1a0 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/queries/aql-queries.md @@ -0,0 +1,3482 @@ +--- +title: HTTP interfaces for AQL queries +menuTitle: AQL queries +weight: 5 +description: >- + The HTTP API for AQL queries lets you to execute, track, kill, explain, and + validate queries written in ArangoDB's query language +--- +## Cursors + +Results of AQL queries are returned as cursors in order to batch the communication +between server and client. Each batch contains a number of documents and an +indication if the current batch is the final batch. Depending on the query, the +total number of documents in the result set may or may not be known in advance. + +If the number of documents doesn't exceed the batch size, the full query result +is returned to the client in a single round-trip. If there are more documents, +then the first batch is returned to the client and the client needs to use the +cursor to retrieve the other batches. + +In order to free up server resources, the client should delete a cursor as soon +as it is no longer needed. + +### Single roundtrip + +The server only transfers a certain number of result documents back to the +client in one roundtrip. This number is controllable by the client by setting +the `batchSize` attribute when issuing the query. + +If the complete result can be transferred to the client in one go, the client +does not need to issue any further request. The client can check whether it has +retrieved the complete result set by checking the `hasMore` attribute of the +result set. If it is set to `false`, then the client has fetched the complete +result set from the server. In this case, no server-side cursor is created. + +```js +> curl --data @- -X POST --dump - http://localhost:8529/_api/cursor +{ "query" : "FOR u IN users LIMIT 2 RETURN u", "count" : true, "batchSize" : 2 } + +HTTP/1.1 201 Created +Content-type: application/json + +{ + "hasMore" : false, + "error" : false, + "result" : [ + { + "name" : "user1", + "_rev" : "210304551", + "_key" : "210304551", + "_id" : "users/210304551" + }, + { + "name" : "user2", + "_rev" : "210304552", + "_key" : "210304552", + "_id" : "users/210304552" + } + ], + "code" : 201, + "count" : 2 +} +``` + +### Using a cursor + +If the result set contains more documents than should be transferred in a single +roundtrip (i.e. as set via the `batchSize` attribute), the server returns +the first few documents and creates a temporary cursor. The cursor identifier +is also returned to the client. The server puts the cursor identifier +in the `id` attribute of the response object. Furthermore, the `hasMore` +attribute of the response object is set to `true`. This is an indication +for the client that there are additional results to fetch from the server. + +**Examples** + +Create and extract first batch: + +```js +> curl --data @- -X POST --dump - http://localhost:8529/_api/cursor +{ "query" : "FOR u IN users LIMIT 5 RETURN u", "count" : true, "batchSize" : 2 } + +HTTP/1.1 201 Created +Content-type: application/json + +{ + "hasMore" : true, + "error" : false, + "id" : "26011191", + "result" : [ + { + "name" : "user1", + "_rev" : "258801191", + "_key" : "258801191", + "_id" : "users/258801191" + }, + { + "name" : "user2", + "_rev" : "258801192", + "_key" : "258801192", + "_id" : "users/258801192" + } + ], + "code" : 201, + "count" : 5 +} +``` + +Extract next batch, still have more: + +```js +> curl -X POST --dump - http://localhost:8529/_api/cursor/26011191 + +HTTP/1.1 200 OK +Content-type: application/json + +{ + "hasMore" : true, + "error" : false, + "id" : "26011191", + "result": [ + { + "name" : "user3", + "_rev" : "258801193", + "_key" : "258801193", + "_id" : "users/258801193" + }, + { + "name" : "user4", + "_rev" : "258801194", + "_key" : "258801194", + "_id" : "users/258801194" + } + ], + "code" : 200, + "count" : 5 +} +``` + +Extract next batch, done: + +```js +> curl -X POST --dump - http://localhost:8529/_api/cursor/26011191 + +HTTP/1.1 200 OK +Content-type: application/json + +{ + "hasMore" : false, + "error" : false, + "result" : [ + { + "name" : "user5", + "_rev" : "258801195", + "_key" : "258801195", + "_id" : "users/258801195" + } + ], + "code" : 200, + "count" : 5 +} +``` + +Do not do this because `hasMore` now has a value of false: + +```js +> curl -X POST --dump - http://localhost:8529/_api/cursor/26011191 + +HTTP/1.1 404 Not Found +Content-type: application/json + +{ + "errorNum": 1600, + "errorMessage": "cursor not found: disposed or unknown cursor", + "error": true, + "code": 404 +} +``` + +The response object contains a `nextBatchId` attribute, except for the last batch +(when `hasMore` is `false`). If the `allowRetry` query option is set to `true` +and if retrieving a result batch fails because of a connection issue, you +can ask for that batch again using the `POST /_api/cursor/<cursor-id>/<batch-id>` +endpoint. The first batch has an ID of `1` and the value is incremented by 1 +with every batch. Every result response except the last one also includes a +`nextBatchId` attribute, indicating the ID of the batch after the current. +You can remember and use this batch ID should retrieving the next batch fail. + +```js +> curl --data @- -X POST --dump - http://localhost:8529/_api/cursor +{ "query": "FOR i IN 1..5 RETURN i", "batchSize": 2, "options": { "allowRetry": true } } + +HTTP/1.1 201 Created +Content-type: application/json + +{ + "result":[1,2], + "hasMore":true, + "id":"3517", + "nextBatchId":2, + "cached":false, + "error":false, + "code":201 +} +``` + +Fetching the second batch would look like this: + +```js +> curl -X POST --dump - http://localhost:8529/_api/cursor/3517 +``` + +Assuming the above request fails because of a connection issue but advances the +cursor nonetheless, you can retry fetching the batch using the `nextBatchId` of +the first request (`2`): + +```js +curl -X POST --dump http://localhost:8529/_api/cursor/3517/2 + +{ + "result":[3,4], + "hasMore":true, + "id":"3517", + "nextBatchId":3, + "cached":false, + "error":false, + "code":200 +} +``` + +To allow refetching of the last batch of the query, the server cannot +automatically delete the cursor. After the first attempt of fetching the last +batch, the server would normally delete the cursor to free up resources. As you +might need to reattempt the fetch, it needs to keep the final batch when the +`allowRetry` option is enabled. Once you successfully received the last batch, +you should call the `DELETE /_api/cursor/<cursor-id>` endpoint so that the +server doesn't unnecessarily keep the batch until the cursor times out +(`ttl` query option). + +```js +curl -X POST --dump http://localhost:8529/_api/cursor/3517/3 + +{ + "result":[5], + "hasMore":false, + "id":"3517", + "cached":false, + "error":false, + "code":200 +} + +curl -X DELETE --dump http://localhost:8529/_api/cursor/3517 + +{ + "id":"3517", + "error":false, + "code":202 +} +``` + +If you are no longer interested in the results of a query, you can call the +`DELETE /_api/cursor/<cursor-id>` endpoint as long as a cursor exists to discard +the cursor, even before you requested the last batch. + +## Execute AQL queries + +### Create a cursor + +```openapi +paths: + /_db/{database-name}/_api/cursor: + post: + operationId: createAqlQueryCursor + description: | + Submits an AQL query for execution in the current database. The server returns + a result batch and may indicate that further batches need to be fetched using + a cursor identifier. + + The query details include the query string plus optional query options and + bind parameters. These values need to be passed in a JSON representation in + the body of the POST request. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: x-arango-allow-dirty-read + in: header + required: false + description: | + Set this header to `true` to allow the Coordinator to ask any shard replica for + the data, not only the shard leader. This may result in "dirty reads". + + The header is ignored if this operation is part of a Stream Transaction + (`x-arango-trx-id` header). The header set when creating the transaction decides + about dirty reads for the entire transaction, not the individual read operations. + schema: + type: boolean + - name: x-arango-trx-id + in: header + required: false + description: | + To make this operation a part of a Stream Transaction, set this header to the + transaction ID returned by the `POST /_api/transaction/begin` call. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - query + properties: + # Purposefully undocumented: + # forceOneShardAttributeValue + query: + description: | + The AQL query string to execute. + type: string + count: + description: | + Whether the number of documents in the result set should be returned in + the `count` attribute of the result. + Calculating this count might have a performance impact for some queries + in the future, so this option is turned off by default and `count` + is only returned when requested. + type: boolean + default: false + batchSize: + description: | + The maximum number of result documents to be transferred from + the server to the client in one roundtrip. If this attribute is + not set, a server-controlled default value will be used. A `batchSize` value of + `0` is disallowed. + type: integer + default: 1000 + ttl: + description: | + The time-to-live for the cursor (in seconds). If the result set is small enough + (less than or equal to `batchSize`) then results are returned right away. + Otherwise they are stored in memory and will be accessible via the cursor with + respect to the `ttl`. The cursor will be removed on the server automatically + after the specified amount of time. This is useful to ensure garbage collection + of cursors that are not fully fetched by clients. + + The time-to-live is renewed upon every access to the cursor. + + Default: Controlled by the `--query.registry-ttl` startup option. + If not set, the defaults are 30 seconds for single servers and 600 seconds for + Coordinators of a cluster deployment. + type: integer + memoryLimit: + description: | + The maximum amount of memory (in bytes) that the query is allowed to + use. If set, then the query fails with error "resource limit exceeded" in + case it allocates too much memory. A value of `0` indicates that there is + no memory limit, but the `--query.global-memory-limit` startup option + may still limit it. + + Default: You can configure a default per-query memory limit with the + `--query.memory-limit` startup option. You can only increase + this default memory limit if `--query.memory-limit-override` + is enabled. + type: integer + bindVars: + description: | + An object with key/value pairs representing the bind parameters. + For a bind variable `@var` in the query, specify the value using an attribute + with the name `var`. For a collection bind variable `@@coll`, use `@coll` as the + attribute name. For example: `"bindVars": { "var": 42, "@coll": "products" }`. + type: object + options: + description: | + key/value object with extra options for the query. + type: object + properties: + fullCount: + description: | + 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. + type: boolean + default: false + fillBlockCache: + description: | + If set to `true`, then the query stores the data it + reads via the RocksDB storage engine in the RocksDB block cache. This is usually + the desired behavior. The option can be set to `false` for queries that are + known to either read a lot of data which would thrash the block cache, or for queries + that read data which are known to be outside of the hot set. By setting the option + to `false`, data read by the query does not make it into the RocksDB block cache if + not already in there, thus leaving more room for the actual hot set. + type: boolean + default: true + maxNumberOfPlans: + description: | + Limits the maximum number of plans that are created by the AQL query optimizer. + + Default: Controlled by the `--query.optimizer-max-plans` startup option. + type: integer + maxNodesPerCallstack: + description: | + The number of execution nodes in the query plan after that stack splitting is + performed to avoid a potential stack overflow. + + This option is only useful for testing and debugging and normally does not need + any adjustment. + + Default: Controlled by the `--query.max-nodes-per-callstack` startup option. + type: integer + maxWarningCount: + description: | + Limits the number of warnings a query can return. + You can increased or decreased the number with this option. + type: integer + default: 10 + failOnWarning: + description: | + If set to `true`, the query throws an exception and aborts instead of producing + a warning. You should use this option during development to catch potential issues + early. When the attribute is set to `false`, warnings are not propagated to + exceptions and are returned with the query result. + + Default: Controlled by the `--query.fail-on-warning` startup option, + so you don't need to set it on a per-query basis. + type: boolean + allowRetry: + description: | + Set this option to `true` to make it possible to retry + fetching the latest batch from a cursor. + + If retrieving a result batch fails because of a connection issue, you can ask + for that batch again using the `POST /_api/cursor/<cursor-id>/<batch-id>` + endpoint. The first batch has an ID of `1` and the value is incremented by 1 + with every batch. Every result response except the last one also includes a + `nextBatchId` attribute, indicating the ID of the batch after the current. + You can remember and use this batch ID should retrieving the next batch fail. + + You can only request the latest batch again (or the next batch). + Earlier batches are not kept on the server-side. + Requesting a batch again does not advance the cursor. + + You can also call this endpoint with the next batch identifier, i.e. the value + returned in the `nextBatchId` attribute of a previous request. This advances the + cursor and returns the results of the next batch. This is only supported if there + are more results in the cursor (i.e. `hasMore` is `true` in the latest batch). + + From v3.11.1 onward, you may use the `POST /_api/cursor/<cursor-id>/<batch-id>` + endpoint even if the `allowRetry` attribute is `false` to fetch the next batch, + but you cannot request a batch again unless you set it to `true`. + + To allow refetching of the very last batch of the query, the server cannot + automatically delete the cursor. After the first attempt of fetching the last + batch, the server would normally delete the cursor to free up resources. As you + might need to reattempt the fetch, it needs to keep the final batch when the + `allowRetry` option is enabled. Once you successfully received the last batch, + you should call the `DELETE /_api/cursor/<cursor-id>` endpoint so that the + server doesn't unnecessarily keep the batch until the cursor times out + (`ttl` query option). + type: boolean + default: false + stream: + description: | + Can be enabled to execute the query lazily. If set to `true`, then the query is + executed as long as necessary to produce up to `batchSize` results. These + results are returned immediately and the query is suspended until the client + asks for the next batch (if there are more results). Depending on the query + this can mean that the first results will be available much faster and that + less memory is needed because the server only needs to store a subset of + results at a time. Read-only queries can benefit the most, unless `SORT` + without index or `COLLECT` are involved that make it necessary to process all + documents before a partial result can be returned. It is advisable to only use + this option for queries without exclusive locks. + + Remarks: + - The query will hold resources until it ends (such as RocksDB snapshots, which + prevents compaction to some degree). Writes will be in memory until the query + is committed. + - If existing documents are modified, then write locks are held on these + documents and other queries trying to modify the same documents will fail + because of this conflict. + - A streaming query may fail late because of a conflict or for other reasons + after some batches were already returned successfully, possibly rendering the + results up to that point meaningless. + - The query options `cache`, `count` and `fullCount` are not supported for + streaming queries. + - Query statistics, profiling data and warnings are delivered as part of the + last batch. + + If the `stream` option is `false`, then the complete result of the + query is calculated before any of it is returned to the client. The server + stores the full result in memory (on the contacted Coordinator if in a cluster). + All other resources are freed immediately (locks, RocksDB snapshots). The query + will fail before it returns results in case of a conflict. + type: boolean + default: false + cache: + description: | + Whether the [AQL query results cache](../../../aql/execution-and-performance/caching-query-results.md) + shall be used for adding as well as for retrieving results. + + If the query cache mode is set to `demand` and you set the `cache` query option + to `true` for a query, then its query result is cached if it's eligible for + caching. If the query cache mode is set to `on`, query results are automatically + cached if they are eligible for caching unless you set the `cache` option to `false`. + + If you set the `cache` option to `false`, then any query cache lookup is skipped + for the query. If you set it to `true`, the query cache is checked for a cached result + **if** the query cache mode is either set to `on` or `demand`. + + Default: Controlled by the `--query.cache-mode` startup option. + type: boolean + + spillOverThresholdMemoryUsage: + description: | + This option allows queries to store intermediate and final results temporarily + on disk if the amount of memory used (in bytes) exceeds the specified value. + This is used for decreasing the memory usage during the query execution. + + This option only has an effect on queries that use the `SORT` operation but + without a `LIMIT`, and if you enable the spillover feature by setting a path + for the directory to store the temporary data in with the + `--temp.intermediate-results-path` startup option. + + Default: 128 MiB, respectively the value of the + `--temp.intermediate-results-spillover-threshold-memory-usage` + startup option. + + {{</* info */>}} + Spilling data from RAM onto disk is an experimental feature and is turned off + by default. The query results are still built up entirely in RAM on Coordinators + and single servers for non-streaming queries. To avoid the buildup of + the entire query result in RAM, use a streaming query (see the `stream` option). + {{</* /info */>}} + type: integer + spillOverThresholdNumRows: + description: | + This option allows queries to store intermediate and final results temporarily + on disk if the number of rows produced by the query exceeds the specified value. + This is used for decreasing the memory usage during the query execution. In a + query that iterates over a collection that contains documents, each row is a + document, and in a query that iterates over temporary values + (i.e. `FOR i IN 1..100`), each row is one of such temporary values. + + This option only has an effect on queries that use the `SORT` operation but + without a `LIMIT`, and if you enable the spillover feature by setting a path + for the directory to store the temporary data in with the + `--temp.intermediate-results-path` startup option. + + Default: 5 million rows, respectively the value of the + `--temp.intermediate-results-spillover-threshold-num-rows` + startup option. + + {{</* info */>}} + Spilling data from RAM onto disk is an experimental feature and is turned off + by default. The query results are still built up entirely in RAM on Coordinators + and single servers for non-streaming queries. To avoid the buildup of + the entire query result in RAM, use a streaming query (see the `stream` option). + {{</* /info */>}} + type: integer + optimizer: + description: | + Options related to the query optimizer. + type: object + properties: + rules: + description: | + A list of optimizer rules, telling the optimizer to + include or exclude specific rules. See the + [List of optimizer rules](../../../aql/execution-and-performance/query-optimization.md#list-of-optimizer-rules). + + To disable a rule, prefix its name with `-`. To enable a rule, + prefix it with `+`. There is also a pseudo-rule `all` that + matches all optimizer rules. `-all` disables all rules. + type: array + items: + type: string + profile: + description: | + If set to `true` or `1`, then the additional query profiling information is returned + in the `profile` sub-attribute of the `extra` return attribute, unless the query result + is served from the query results cache. If set to `2`, the query includes execution stats + per query plan node in `stats.nodes` sub-attribute of the `extra` return attribute. + Additionally, the query plan is returned in the `extra.plan` sub-attribute. + type: integer + default: 0 + satelliteSyncWait: + description: | + How long a DB-Server has time (in seconds) to bring the SatelliteCollections + involved in the query into sync. When the maximal time is reached, the query is stopped. + + This feature is only available in the Enterprise Edition. + type: number + default: 60.0 + maxRuntime: + description: | + The query has to be executed within the given runtime or it is killed. + The value is specified in seconds. A value of `0.0` means no timeout. + + Default: Controlled by the `--query.max-runtime` startup option. + type: number + maxDNFConditionMembers: + description: | + A threshold for the maximum number of `OR` sub-nodes in the internal + representation of an AQL `FILTER` condition. + + Yon can use this option to limit the computation time and memory usage when + converting complex AQL `FILTER` conditions into the internal DNF + (disjunctive normal form) format. `FILTER` conditions with a lot of logical + branches (`AND`, `OR`, `NOT`) can take a large amount of processing time and + memory. This query option limits the computation time and memory usage for + such conditions. + + Once the threshold value is reached during the DNF conversion of a `FILTER` + condition, the conversion is aborted, and the query continues with a simplified + internal representation of the condition, which **cannot be used for index lookups**. + + Default: Controlled by the `--query.max-dnf-condition-members` startup option + to set the threshold globally instead of per query. + type: integer + maxTransactionSize: + description: | + The transaction size limit in bytes. + + Default: Controlled by the `--rocksdb.max-transaction-size` startup option. + type: integer + intermediateCommitSize: + description: | + The maximum total size of operations after which an intermediate commit is performed + automatically. + + Default: Controlled by `--rocksdb.intermediate-commit-size` startup option. + type: integer + intermediateCommitCount: + description: | + The maximum number of operations after which an intermediate commit is performed + automatically. + + Default: Controlled by the `--rocksdb.intermediate-commit-count` startup option. + type: integer + skipInaccessibleCollections: + description: | + Let AQL queries (especially graph traversals) treat collections to which a user + has no access rights for as if these collections are empty. Instead of returning a + forbidden access error, your queries execute normally. This is intended to help + with certain use-cases: A graph contains several collections and different users + execute AQL queries on that graph. You can naturally limit the accessible + results by changing the access rights of users on collections. + + This feature is only available in the Enterprise Edition. + type: boolean + default: false + allowDirtyReads: + description: | + If you set this option to `true` and execute the query against a cluster + deployment, then the Coordinator is allowed to read from any shard replica and + not only from the leader. + + You may observe data inconsistencies (dirty reads) when reading from followers, + namely obsolete revisions of documents because changes have not yet been + replicated to the follower, as well as changes to documents before they are + officially committed on the leader. + + The option is ignored if this operation is part of a Stream Transaction + (`x-arango-trx-id` header). The `x-arango-allow-dirty-read` header set + when creating the transaction decides about dirty reads for the entire + transaction, not the individual read operations. + + This feature is only available in the Enterprise Edition. + type: boolean + default: false + responses: + '201': + description: | + is returned if the result set can be created by the server. + content: + application/json: + schema: + type: object + required: + - error + - code + - hasMore + - cached + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + result: + description: | + An array of result documents for the current batch + (might be empty if the query has no results). + type: array + hasMore: + description: | + A boolean indicator whether there are more results + available for the cursor on the server. + + Note that even if `hasMore` returns `true`, the next call might still return no + documents. Once `hasMore` is `false`, the cursor is exhausted and the client + can stop asking for more results. + type: boolean + count: + description: | + The total number of result documents available (only + available if the query was executed with the `count` attribute set). + type: integer + id: + description: | + The ID of the cursor for fetching more result batches. + type: string + nextBatchId: + description: | + Only set if the `allowRetry` query option is enabled in v3.11.0. + From v3.11.1 onward, this attribute is always set, except in the last batch. + + The ID of the batch after the current one. The first batch has an ID of `1` and + the value is incremented by 1 with every batch. You can remember and use this + batch ID should retrieving the next batch fail. Use the + `POST /_api/cursor/<cursor-id>/<batch-id>` endpoint to ask for the batch again. + You can also request the next batch. + type: string + extra: + description: | + An optional JSON object with extra information about the query result. + + Only delivered as part of the first batch, or the last batch in case of a cursor + with the `stream` option enabled. + type: object + required: + - warnings + - stats + properties: + warnings: + description: | + A list of query warnings. + type: array + items: + type: object + required: + - code + - message + properties: + code: + description: | + An error code. + type: integer + message: + description: | + A description of the problem. + type: string + stats: + description: | + An object with query statistics. + type: object + required: + - writesExecuted + - writesIgnored + - scannedFull + - scannedIndex + - cursorsCreated + - cursorsRearmed + - cacheHits + - cacheMisses + - filtered + - httpRequests + - executionTime + - peakMemoryUsage + - intermediateCommits + properties: + writesExecuted: + description: | + The total number of data-modification operations successfully executed. + type: integer + writesIgnored: + description: | + The total number of data-modification operations that were unsuccessful, + but have been ignored because of the `ignoreErrors` query option. + type: integer + scannedFull: + description: | + The total number of documents iterated over when scanning a collection + without an index. Documents scanned by subqueries are included in the result, but + operations triggered by built-in or user-defined AQL functions are not. + type: integer + scannedIndex: + description: | + The total number of documents iterated over when scanning a collection using + an index. Documents scanned by subqueries are included in the result, but operations + triggered by built-in or user-defined AQL functions are not. + type: integer + cursorsCreated: + description: | + The total number of cursor objects created during query execution. Cursor + objects are created for index lookups. + type: integer + cursorsRearmed: + description: | + The total number of times an existing cursor object was repurposed. + Repurposing an existing cursor object is normally more efficient compared to destroying an + existing cursor object and creating a new one from scratch. + type: integer + cacheHits: + description: | + The total number of index entries read from in-memory caches for indexes + of type edge or persistent. This value is only non-zero when reading from indexes + that have an in-memory cache enabled, and when the query allows using the in-memory + cache (i.e. using equality lookups on all index attributes). + type: integer + cacheMisses: + description: | + The total number of cache read attempts for index entries that could not + be served from in-memory caches for indexes of type edge or persistent. This value + is only non-zero when reading from indexes that have an in-memory cache enabled, the + query allows using the in-memory cache (i.e. using equality lookups on all index attributes) + and the looked up values are not present in the cache. + type: integer + filtered: + description: | + The total number of documents removed after executing a filter condition + in a `FilterNode` or another node that post-filters data. Note that nodes of the + `IndexNode` type can also filter documents by selecting only the required index range + from a collection, and the `filtered` value only indicates how much filtering was done by a + post filter in the `IndexNode` itself or following `FilterNode` nodes. + Nodes of the `EnumerateCollectionNode` and `TraversalNode` types can also apply + filter conditions and can report the number of filtered documents. + type: integer + httpRequests: + description: | + The total number of cluster-internal HTTP requests performed. + type: integer + fullCount: + description: | + The total number of documents that matched the search condition if the query's + final top-level `LIMIT` operation were not present. + This attribute may only be returned if the `fullCount` option was set when starting the + query and only contains a sensible value if the query contains a `LIMIT` operation on + the top level. + type: integer + executionTime: + description: | + The query execution time (wall-clock time) in seconds. + type: number + peakMemoryUsage: + description: | + The maximum memory usage of the query while it was running. In a cluster, + the memory accounting is done per shard, and the memory usage reported is the peak + memory usage value from the individual shards. + Note that to keep things lightweight, the per-query memory usage is tracked on a relatively + high level, not including any memory allocator overhead nor any memory used for temporary + results calculations (e.g. memory allocated/deallocated inside AQL expressions and function + calls). + type: integer + intermediateCommits: + description: | + The number of intermediate commits performed by the query. This is only non-zero + for write queries, and only for queries that reached either the `intermediateCommitSize` + or `intermediateCommitCount` thresholds. Note: in a cluster, intermediate commits can happen + on each participating DB-Server. + type: integer + nodes: + description: | + When the query is executed with the `profile` option set to at least `2`, + then this attribute contains runtime statistics per query execution node. + For a human readable output, you can execute + `db._profileQuery(<query>, <bind-vars>)` in arangosh. + type: array + items: + type: object + required: + - id + - calls + - items + - runtime + properties: + id: + description: | + The execution node ID to correlate the statistics with the `plan` returned in + the `extra` attribute. + type: integer + calls: + description: | + The number of calls to this node. + type: integer + items: + description: | + The number of items returned by this node. Items are the temporary results + returned at this stage. + type: integer + runtime: + description: | + The execution time of this node in seconds. + type: number + profile: + description: | + The duration of the different query execution phases in seconds. + type: object + required: + - initializing + - parsing + - optimizing ast + - loading collections + - instantiating plan + - optimizing plan + - instantiating executors + - executing + - finalizing + properties: + initializing: + description: '' + type: number + parsing: + description: '' + type: number + optimizing ast: + description: '' + type: number + loading collections: + description: '' + type: number + instantiating plan: + description: '' + type: number + optimizing plan: + description: '' + type: number + instantiating executors: + description: '' + type: number + executing: + description: '' + type: number + finalizing: + description: '' + type: number + plan: + description: | + The execution plan. + type: object + required: + - nodes + - rules + - collections + - variables + - estimatedCost + - estimatedNrItems + - isModificationQuery + properties: + nodes: + description: | + A nested list of the execution plan nodes. + type: array + items: + type: object + rules: + description: | + A list with the names of the applied optimizer rules. + type: array + items: + type: string + collections: + description: | + A list of the collections involved in the query. The list only includes the + collections that can statically be determined at query compile time. + type: array + items: + type: object + required: + - name + - type + properties: + name: + description: | + The collection name. + type: string + type: + description: | + How the collection is used. + type: string + enum: [read, write, exclusive] + variables: + description: | + All of the query variables, including user-created and internal ones. + type: array + items: + type: object + estimatedCost: + description: | + The estimated cost of the query. + type: number + estimatedNrItems: + description: | + The estimated number of results. + type: integer + isModificationQuery: + description: | + Whether the query contains write operations. + type: boolean + cached: + description: | + A boolean flag indicating whether the query result was served + from the query results cache or not. If the query result is served from the query + cache, the `extra` attribute in the response does not contain the `stats` + and `profile` sub-attributes. + type: boolean + '400': + description: | + The JSON representation is malformed, the query specification is + missing from the request, or the query is invalid. + + The body of the response contains a JSON object with additional error + details. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + + If the query specification is complete, the server will process the query. If an + error occurs during query processing, the server will respond with *HTTP 400*. + Again, the body of the response will contain details about the error. + type: string + '404': + description: | + A non-existing collection is accessed in the query. + + This error also occurs if you try to run this operation as part of a + Stream Transaction but the transaction ID specified in the + `x-arango-trx-id` header is unknown to the server. + '405': + description: | + An unsupported HTTP method is used. + '410': + description: | + A server which processes the query or the leader of a shard which is used + in the query stops responding, but the connection has not been closed. + + This error also occurs if you try to run this operation as part of a + Stream Transaction that has just been canceled or timed out. + '503': + description: | + A server which processes the query or the leader of a shard which is used + in the query is down, either for going through a restart, a failure, or + connectivity issues. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + Execute a query and extract the result in a single go +name: RestCursorCreateCursorForLimitReturnSingle +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"hello1":"world1"}); +db.products.save({"hello2":"world1"}); + +var url = "/_api/cursor"; +var body = { + query: "FOR p IN products LIMIT 2 RETURN p", + count: true, + batchSize: 2 +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Execute a query and extract a part of the result +name: RestCursorCreateCursorForLimitReturn +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"hello1":"world1"}); +db.products.save({"hello2":"world1"}); +db.products.save({"hello3":"world1"}); +db.products.save({"hello4":"world1"}); +db.products.save({"hello5":"world1"}); + +var url = "/_api/cursor"; +var body = { + query: "FOR p IN products LIMIT 5 RETURN p", + count: true, + batchSize: 2 +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using the query option "fullCount" +name: RestCursorCreateCursorOption +--- +var url = "/_api/cursor"; +var body = { + query: "FOR i IN 1..1000 FILTER i > 500 LIMIT 10 RETURN i", + count: true, + options: { + fullCount: true + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Enabling and disabling optimizer rules +name: RestCursorOptimizerRules +--- +var url = "/_api/cursor"; +var body = { + query: "FOR i IN 1..10 LET a = 1 LET b = 2 FILTER a + b == 3 RETURN i", + count: true, + options: { + maxPlans: 1, + optimizer: { + rules: [ "-all", "+remove-unnecessary-filters" ] + } + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Execute instrumented query and return result together with + execution plan and profiling information +name: RestCursorProfileQuery +--- +var url = "/_api/cursor"; +var body = { + query: "LET s = SLEEP(0.25) LET t = SLEEP(0.5) RETURN 1", + count: true, + options: { + profile: 2 + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Execute a data-modification query and retrieve the number of + modified documents +name: RestCursorDeleteQuery +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"hello1":"world1"}); +db.products.save({"hello2":"world1"}); + +var url = "/_api/cursor"; +var body = { + query: "FOR p IN products REMOVE p IN products" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); +assert(response.parsedBody.extra.stats.writesExecuted === 2); +assert(response.parsedBody.extra.stats.writesIgnored === 0); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Execute a data-modification query with option `ignoreErrors` +name: RestCursorDeleteIgnore +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({ _key: "foo" }); + +var url = "/_api/cursor"; +var body = { + query: "REMOVE 'bar' IN products OPTIONS { ignoreErrors: true }" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 201); +assert(response.parsedBody.extra.stats.writesExecuted === 0); +assert(response.parsedBody.extra.stats.writesIgnored === 1); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + The following example appends a value to the array `arr` of the document + with key `test` in the collection `documents`. The normal update behavior of the + `UPDATE` operation is to replace the array attribute completely, but using the + `PUSH()` function allows you to append to the array: +name: RestCursorModifyArray +--- +var cn = "documents"; +db._drop(cn); +db._create(cn); + +db.documents.save({ _key: "test", arr: [1, 2, 3] }); + +var url = "/_api/cursor"; +var body = { + query: "FOR doc IN documents FILTER doc._key == @myKey UPDATE doc._key WITH { arr: PUSH(doc.arr, @value) } IN documents RETURN NEW", + bindVars: { myKey: "test", value: 42 } +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 201); +logJsonResponse(response); + +db._drop(cn); +``` + +```curl +--- +description: |- + To set a memory limit for the query, the `memoryLimit` option can be passed to + the server. + + The memory limit specifies the maximum number of bytes that the query is + allowed to use. When a single AQL query reaches the specified limit value, + the query is aborted with a *resource limit exceeded* exception. In a + cluster, the memory accounting is done per server, so the limit value is + effectively a memory limit per query per server. + + If no memory limit is specified, then the server default value (controlled by + startup option `--query.memory-limit`) is used for restricting the maximum amount + of memory the query can use. A memory limit value of `0` means that the maximum + amount of memory for the query is not restricted. +name: RestCursorMemoryLimit +--- +var url = "/_api/cursor"; +var body = { + query: "FOR i IN 1..100000 SORT i RETURN i", + memoryLimit: 100000 +} +var response = logCurlRequest('POST', url, body); +assert(response.code === 500); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Bad query - Missing body +name: RestCursorCreateCursorMissingBody +--- +var url = "/_api/cursor"; + +var response = logCurlRequest('POST', url, ''); + +assert(response.code === 400); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Bad query - Unknown collection +name: RestCursorCreateCursorUnknownCollection +--- +var url = "/_api/cursor"; +var body = { + query: "FOR u IN unknowncoll LIMIT 2 RETURN u", + count: true, + batchSize: 2 +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Bad query - Execute a data-modification query that attempts to remove a non-existing + document +name: RestCursorDeleteQueryFail +--- +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({ _key: "bar" }); + +var url = "/_api/cursor"; +var body = { + query: "REMOVE 'foo' IN products" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 404); + +logJsonResponse(response); +db._drop(cn); +``` + +### Read the next batch from a cursor + +```openapi +paths: + /_db/{database-name}/_api/cursor/{cursor-identifier}: + post: + operationId: getNextAqlQueryCursorBatch + description: | + If the cursor is still alive, returns an object with the next query result batch. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: cursor-identifier + in: path + required: true + description: | + The name of the cursor + schema: + type: string + responses: + '200': + description: | + Successfully fetched the batch. + content: + application/json: + schema: + type: object + required: + - error + - code + - hasMore + - cached + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + An array of result documents for the current batch + (might be empty if the query has no results). + type: array + hasMore: + description: | + A boolean indicator whether there are more results + available for the cursor on the server. + + Note that even if `hasMore` returns `true`, the next call might still return no + documents. Once `hasMore` is `false`, the cursor is exhausted and the client + can stop asking for more results. + type: boolean + count: + description: | + The total number of result documents available (only + available if the query was executed with the `count` attribute set). + type: integer + id: + description: | + The ID of the cursor for fetching more result batches. + type: string + nextBatchId: + description: | + Only set if the `allowRetry` query option is enabled in v3.11.0. + From v3.11.1 onward, this attribute is always set, except in the last batch. + + The ID of the batch after the current one. The first batch has an ID of `1` and + the value is incremented by 1 with every batch. You can remember and use this + batch ID should retrieving the next batch fail. Use the + `POST /_api/cursor/<cursor-id>/<batch-id>` endpoint to ask for the batch again. + You can also request the next batch. + type: string + extra: + description: | + An optional JSON object with extra information about the query result. + + Only delivered as part of the first batch, or the last batch in case of a cursor + with the `stream` option enabled. + type: object + required: + - warnings + - stats + properties: + warnings: + description: | + A list of query warnings. + type: array + items: + type: object + required: + - code + - message + properties: + code: + description: | + An error code. + type: integer + message: + description: | + A description of the problem. + type: string + stats: + description: | + An object with query statistics. + type: object + required: + - writesExecuted + - writesIgnored + - scannedFull + - scannedIndex + - cursorsCreated + - cursorsRearmed + - cacheHits + - cacheMisses + - filtered + - httpRequests + - executionTime + - peakMemoryUsage + - intermediateCommits + properties: + writesExecuted: + description: | + The total number of data-modification operations successfully executed. + type: integer + writesIgnored: + description: | + The total number of data-modification operations that were unsuccessful, + but have been ignored because of the `ignoreErrors` query option. + type: integer + scannedFull: + description: | + The total number of documents iterated over when scanning a collection + without an index. Documents scanned by subqueries are included in the result, but + operations triggered by built-in or user-defined AQL functions are not. + type: integer + scannedIndex: + description: | + The total number of documents iterated over when scanning a collection using + an index. Documents scanned by subqueries are included in the result, but operations + triggered by built-in or user-defined AQL functions are not. + type: integer + cursorsCreated: + description: | + The total number of cursor objects created during query execution. Cursor + objects are created for index lookups. + type: integer + cursorsRearmed: + description: | + The total number of times an existing cursor object was repurposed. + Repurposing an existing cursor object is normally more efficient compared to destroying an + existing cursor object and creating a new one from scratch. + type: integer + cacheHits: + description: | + The total number of index entries read from in-memory caches for indexes + of type edge or persistent. This value is only non-zero when reading from indexes + that have an in-memory cache enabled, and when the query allows using the in-memory + cache (i.e. using equality lookups on all index attributes). + type: integer + cacheMisses: + description: | + The total number of cache read attempts for index entries that could not + be served from in-memory caches for indexes of type edge or persistent. This value + is only non-zero when reading from indexes that have an in-memory cache enabled, the + query allows using the in-memory cache (i.e. using equality lookups on all index attributes) + and the looked up values are not present in the cache. + type: integer + filtered: + description: | + The total number of documents removed after executing a filter condition + in a `FilterNode` or another node that post-filters data. Note that nodes of the + `IndexNode` type can also filter documents by selecting only the required index range + from a collection, and the `filtered` value only indicates how much filtering was done by a + post filter in the `IndexNode` itself or following `FilterNode` nodes. + Nodes of the `EnumerateCollectionNode` and `TraversalNode` types can also apply + filter conditions and can report the number of filtered documents. + type: integer + httpRequests: + description: | + The total number of cluster-internal HTTP requests performed. + type: integer + fullCount: + description: | + The total number of documents that matched the search condition if the query's + final top-level `LIMIT` operation were not present. + This attribute may only be returned if the `fullCount` option was set when starting the + query and only contains a sensible value if the query contains a `LIMIT` operation on + the top level. + type: integer + executionTime: + description: | + The query execution time (wall-clock time) in seconds. + type: number + peakMemoryUsage: + description: | + The maximum memory usage of the query while it was running. In a cluster, + the memory accounting is done per shard, and the memory usage reported is the peak + memory usage value from the individual shards. + Note that to keep things lightweight, the per-query memory usage is tracked on a relatively + high level, not including any memory allocator overhead nor any memory used for temporary + results calculations (e.g. memory allocated/deallocated inside AQL expressions and function + calls). + type: integer + intermediateCommits: + description: | + The number of intermediate commits performed by the query. This is only non-zero + for write queries, and only for queries that reached either the `intermediateCommitSize` + or `intermediateCommitCount` thresholds. Note: in a cluster, intermediate commits can happen + on each participating DB-Server. + type: integer + nodes: + description: | + When the query is executed with the `profile` option set to at least `2`, + then this attribute contains runtime statistics per query execution node. + For a human readable output, you can execute + `db._profileQuery(<query>, <bind-vars>)` in arangosh. + type: array + items: + type: object + required: + - id + - calls + - items + - runtime + properties: + id: + description: | + The execution node ID to correlate the statistics with the `plan` returned in + the `extra` attribute. + type: integer + calls: + description: | + The number of calls to this node. + type: integer + items: + description: | + The number of items returned by this node. Items are the temporary results + returned at this stage. + type: integer + runtime: + description: | + The execution time of this node in seconds. + type: number + profile: + description: | + The duration of the different query execution phases in seconds. + type: object + required: + - initializing + - parsing + - optimizing ast + - loading collections + - instantiating plan + - optimizing plan + - instantiating executors + - executing + - finalizing + properties: + initializing: + description: '' + type: number + parsing: + description: '' + type: number + optimizing ast: + description: '' + type: number + loading collections: + description: '' + type: number + instantiating plan: + description: '' + type: number + optimizing plan: + description: '' + type: number + instantiating executors: + description: '' + type: number + executing: + description: '' + type: number + finalizing: + description: '' + type: number + plan: + description: | + The execution plan. + type: object + required: + - nodes + - rules + - collections + - variables + - estimatedCost + - estimatedNrItems + - isModificationQuery + properties: + nodes: + description: | + A nested list of the execution plan nodes. + type: array + items: + type: object + rules: + description: | + A list with the names of the applied optimizer rules. + type: array + items: + type: string + collections: + description: | + A list of the collections involved in the query. The list only includes the + collections that can statically be determined at query compile time. + type: array + items: + type: object + required: + - name + - type + properties: + name: + description: | + The collection name. + type: string + type: + description: | + How the collection is used. + type: string + enum: [read, write, exclusive] + variables: + description: | + All of the query variables, including user-created and internal ones. + type: array + items: + type: object + estimatedCost: + description: | + The estimated cost of the query. + type: number + estimatedNrItems: + description: | + The estimated number of results. + type: integer + isModificationQuery: + description: | + Whether the query contains write operations. + type: boolean + cached: + description: | + A boolean flag indicating whether the query result was served + from the query results cache or not. If the query result is served from the query + cache, the `extra` attribute in the response does not contain the `stats` + and `profile` sub-attributes. + type: boolean + '400': + description: | + The cursor identifier is missing. + '404': + description: | + A cursor with the specified identifier cannot found. + '410': + description: | + A server which processes the query or the leader of a shard which is + used in the query stops responding, but the connection has not been closed. + '503': + description: | + A server which processes the query or the leader of a shard which is used + in the query is down, either for going through a restart, a failure, + or connectivity issues. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + Valid request for next batch +name: RestCursorPostForLimitReturnCont +--- +var url = "/_api/cursor"; +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"hello1":"world1"}); +db.products.save({"hello2":"world1"}); +db.products.save({"hello3":"world1"}); +db.products.save({"hello4":"world1"}); +db.products.save({"hello5":"world1"}); + +var url = "/_api/cursor"; +var body = { + query: "FOR p IN products LIMIT 5 RETURN p", + count: true, + batchSize: 2 +}; +var response = logCurlRequest('POST', url, body); + +response = logCurlRequest('POST', url + '/' + response.parsedBody.id, ''); +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Missing identifier +name: RestCursorPostMissingCursorIdentifier +--- +var url = "/_api/cursor"; + +var response = logCurlRequest('POST', url, ''); + +assert(response.code === 400); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Unknown identifier +name: RestCursorPostInvalidCursorIdentifier +--- +var url = "/_api/cursor/123123"; + +var response = logCurlRequest('POST', url, ''); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +### Read the next batch from a cursor (deprecated) + +```openapi +paths: + /_db/{database-name}/_api/cursor/{cursor-identifier}: + put: + operationId: getNextAqlQueryCursorBatchPut + description: | + {{</* warning */>}} + This endpoint is deprecated in favor its functionally equivalent POST counterpart. + {{</* /warning */>}} + + If the cursor is still alive, returns an object with the following + attributes: + + - `id`: a `cursor-identifier` + - `result`: a list of documents for the current batch + - `hasMore`: `false` if this was the last batch + - `count`: if present the total number of elements + - `code`: an HTTP status code + - `error`: a boolean flag to indicate whether an error occurred + - `errorNum`: a server error number (if `error` is `true`) + - `errorMessage`: a descriptive error message (if `error` is `true`) + - `extra`: an object with additional information about the query result, with + the nested objects `stats` and `warnings`. Only delivered as part of the last + batch in case of a cursor with the `stream` option enabled. + + Note that even if `hasMore` returns `true`, the next call might + still return no documents. If, however, `hasMore` is `false`, then + the cursor is exhausted. Once the `hasMore` attribute has a value of + `false`, the client can stop. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: cursor-identifier + in: path + required: true + description: | + The name of the cursor + schema: + type: string + responses: + '200': + description: | + Successfully fetched the batch. + '400': + description: | + The cursor identifier is missing. + '404': + description: | + A cursor with the specified identifier cannot be found. + '410': + description: | + A server which processes the query or the leader of a shard which is + used in the query stops responding, but the connection has not been closed. + '503': + description: | + A server which processes the query or the leader of a shard which is used + in the query is down, either for going through a restart, a failure, + or connectivity issues. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + Valid request for next batch +name: RestCursorForLimitReturnCont +--- +var url = "/_api/cursor"; +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"hello1":"world1"}); +db.products.save({"hello2":"world1"}); +db.products.save({"hello3":"world1"}); +db.products.save({"hello4":"world1"}); +db.products.save({"hello5":"world1"}); + +var url = "/_api/cursor"; +var body = { + query: "FOR p IN products LIMIT 5 RETURN p", + count: true, + batchSize: 2 +}; +var response = logCurlRequest('POST', url, body); + +response = logCurlRequest('PUT', url + '/' + response.parsedBody.id, ''); +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Missing identifier +name: RestCursorMissingCursorIdentifier +--- +var url = "/_api/cursor"; + +var response = logCurlRequest('PUT', url, ''); + +assert(response.code === 400); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Unknown identifier +name: RestCursorInvalidCursorIdentifier +--- +var url = "/_api/cursor/123123"; + +var response = logCurlRequest('PUT', url, ''); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +### Read a batch from the cursor again + +```openapi +paths: + /_db/{database-name}/_api/cursor/{cursor-identifier}/{batch-identifier}: + post: + operationId: getPreviousAqlQueryCursorBatch + description: | + You can use this endpoint to retry fetching the latest batch from a cursor. + The endpoint requires the `allowRetry` query option to be enabled for the cursor. + + Calling this endpoint with the last returned batch identifier returns the + query results for that same batch again. This does not advance the cursor. + Client applications can use this to re-transfer a batch once more in case of + transfer errors. + + You can also call this endpoint with the next batch identifier, i.e. the value + returned in the `nextBatchId` attribute of a previous request. This advances the + cursor and returns the results of the next batch. + + From v3.11.1 onward, you may use this endpoint even if the `allowRetry` + attribute is `false` to fetch the next batch, but you cannot request a batch + again unless you set it to `true`. + + Note that it is only supported to query the last returned batch identifier or + the directly following batch identifier. The latter is only supported if there + are more results in the cursor (i.e. `hasMore` is `true` in the latest batch). + + Note that when the last batch has been consumed successfully by a client + application, it should explicitly delete the cursor to inform the server that it + successfully received and processed the batch so that the server can free up + resources. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: cursor-identifier + in: path + required: true + description: | + The ID of the cursor. + schema: + type: string + - name: batch-identifier + in: path + required: true + description: | + The ID of the batch. The first batch has an ID of `1` and the value is + incremented by 1 with every batch. You can only request the latest batch again + (or the next batch). Earlier batches are not kept on the server-side. + schema: + type: string + responses: + '200': + description: | + The server responds with *HTTP 200* in case of success. + content: + application/json: + schema: + type: object + required: + - error + - code + - hasMore + - cached + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + An array of result documents for the current batch + (might be empty if the query has no results). + type: array + hasMore: + description: | + A boolean indicator whether there are more results + available for the cursor on the server. + + Note that even if `hasMore` returns `true`, the next call might still return no + documents. Once `hasMore` is `false`, the cursor is exhausted and the client + can stop asking for more results. + type: boolean + count: + description: | + The total number of result documents available (only + available if the query was executed with the `count` attribute set). + type: integer + id: + description: | + The ID of the cursor for fetching more result batches. + type: string + nextBatchId: + description: | + Only set if the `allowRetry` query option is enabled in v3.11.0. + From v3.11.1 onward, this attribute is always set, except in the last batch. + + The ID of the batch after the current one. The first batch has an ID of `1` and + the value is incremented by 1 with every batch. You can remember and use this + batch ID should retrieving the next batch fail. Use the + `POST /_api/cursor/<cursor-id>/<batch-id>` endpoint to ask for the batch again. + You can also request the next batch. + type: string + extra: + description: | + An optional JSON object with extra information about the query result. + + Only delivered as part of the first batch, or the last batch in case of a cursor + with the `stream` option enabled. + type: object + required: + - warnings + - stats + properties: + warnings: + description: | + A list of query warnings. + type: array + items: + type: object + required: + - code + - message + properties: + code: + description: | + An error code. + type: integer + message: + description: | + A description of the problem. + type: string + stats: + description: | + An object with query statistics. + type: object + required: + - writesExecuted + - writesIgnored + - scannedFull + - scannedIndex + - cursorsCreated + - cursorsRearmed + - cacheHits + - cacheMisses + - filtered + - httpRequests + - executionTime + - peakMemoryUsage + - intermediateCommits + properties: + writesExecuted: + description: | + The total number of data-modification operations successfully executed. + type: integer + writesIgnored: + description: | + The total number of data-modification operations that were unsuccessful, + but have been ignored because of the `ignoreErrors` query option. + type: integer + scannedFull: + description: | + The total number of documents iterated over when scanning a collection + without an index. Documents scanned by subqueries are included in the result, but + operations triggered by built-in or user-defined AQL functions are not. + type: integer + scannedIndex: + description: | + The total number of documents iterated over when scanning a collection using + an index. Documents scanned by subqueries are included in the result, but operations + triggered by built-in or user-defined AQL functions are not. + type: integer + cursorsCreated: + description: | + The total number of cursor objects created during query execution. Cursor + objects are created for index lookups. + type: integer + cursorsRearmed: + description: | + The total number of times an existing cursor object was repurposed. + Repurposing an existing cursor object is normally more efficient compared to destroying an + existing cursor object and creating a new one from scratch. + type: integer + cacheHits: + description: | + The total number of index entries read from in-memory caches for indexes + of type edge or persistent. This value is only non-zero when reading from indexes + that have an in-memory cache enabled, and when the query allows using the in-memory + cache (i.e. using equality lookups on all index attributes). + type: integer + cacheMisses: + description: | + The total number of cache read attempts for index entries that could not + be served from in-memory caches for indexes of type edge or persistent. This value + is only non-zero when reading from indexes that have an in-memory cache enabled, the + query allows using the in-memory cache (i.e. using equality lookups on all index attributes) + and the looked up values are not present in the cache. + type: integer + filtered: + description: | + The total number of documents removed after executing a filter condition + in a `FilterNode` or another node that post-filters data. Note that nodes of the + `IndexNode` type can also filter documents by selecting only the required index range + from a collection, and the `filtered` value only indicates how much filtering was done by a + post filter in the `IndexNode` itself or following `FilterNode` nodes. + Nodes of the `EnumerateCollectionNode` and `TraversalNode` types can also apply + filter conditions and can report the number of filtered documents. + type: integer + httpRequests: + description: | + The total number of cluster-internal HTTP requests performed. + type: integer + fullCount: + description: | + The total number of documents that matched the search condition if the query's + final top-level `LIMIT` operation were not present. + This attribute may only be returned if the `fullCount` option was set when starting the + query and only contains a sensible value if the query contains a `LIMIT` operation on + the top level. + type: integer + executionTime: + description: | + The query execution time (wall-clock time) in seconds. + type: number + peakMemoryUsage: + description: | + The maximum memory usage of the query while it was running. In a cluster, + the memory accounting is done per shard, and the memory usage reported is the peak + memory usage value from the individual shards. + Note that to keep things lightweight, the per-query memory usage is tracked on a relatively + high level, not including any memory allocator overhead nor any memory used for temporary + results calculations (e.g. memory allocated/deallocated inside AQL expressions and function + calls). + type: integer + intermediateCommits: + description: | + The number of intermediate commits performed by the query. This is only non-zero + for write queries, and only for queries that reached either the `intermediateCommitSize` + or `intermediateCommitCount` thresholds. Note: in a cluster, intermediate commits can happen + on each participating DB-Server. + type: integer + nodes: + description: | + When the query is executed with the `profile` option set to at least `2`, + then this attribute contains runtime statistics per query execution node. + For a human readable output, you can execute + `db._profileQuery(<query>, <bind-vars>)` in arangosh. + type: array + items: + type: object + required: + - id + - calls + - items + - runtime + properties: + id: + description: | + The execution node ID to correlate the statistics with the `plan` returned in + the `extra` attribute. + type: integer + calls: + description: | + The number of calls to this node. + type: integer + items: + description: | + The number of items returned by this node. Items are the temporary results + returned at this stage. + type: integer + runtime: + description: | + The execution time of this node in seconds. + type: number + profile: + description: | + The duration of the different query execution phases in seconds. + type: object + required: + - initializing + - parsing + - optimizing ast + - loading collections + - instantiating plan + - optimizing plan + - instantiating executors + - executing + - finalizing + properties: + initializing: + description: '' + type: number + parsing: + description: '' + type: number + optimizing ast: + description: '' + type: number + loading collections: + description: '' + type: number + instantiating plan: + description: '' + type: number + optimizing plan: + description: '' + type: number + instantiating executors: + description: '' + type: number + executing: + description: '' + type: number + finalizing: + description: '' + type: number + plan: + description: | + The execution plan. + type: object + required: + - nodes + - rules + - collections + - variables + - estimatedCost + - estimatedNrItems + - isModificationQuery + properties: + nodes: + description: | + A nested list of the execution plan nodes. + type: array + items: + type: object + rules: + description: | + A list with the names of the applied optimizer rules. + type: array + items: + type: string + collections: + description: | + A list of the collections involved in the query. The list only includes the + collections that can statically be determined at query compile time. + type: array + items: + type: object + required: + - name + - type + properties: + name: + description: | + The collection name. + type: string + type: + description: | + How the collection is used. + type: string + enum: [read, write, exclusive] + variables: + description: | + All of the query variables, including user-created and internal ones. + type: array + items: + type: object + estimatedCost: + description: | + The estimated cost of the query. + type: number + estimatedNrItems: + description: | + The estimated number of results. + type: integer + isModificationQuery: + description: | + Whether the query contains write operations. + type: boolean + cached: + description: | + A boolean flag indicating whether the query result was served + from the query results cache or not. If the query result is served from the query + cache, the `extra` attribute in the response does not contain the `stats` + and `profile` sub-attributes. + type: boolean + '400': + description: | + The cursor and the batch identifier are missing. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A cursor with the specified identifier cannot be found, or the requested + batch isn't available. + '410': + description: | + The server responds with *HTTP 410* if a server which processes the query + or is the leader for a shard which is used in the query stops responding, but + the connection has not been closed. + '503': + description: | + The server responds with *HTTP 503* if a server which processes the query + or is the leader for a shard which is used in the query is down, either for + going through a restart, a failure or connectivity issues. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + Request the second batch (again): +name: RestCursorPostBatch +--- +var url = "/_api/cursor"; +var body = { + query: "FOR i IN 1..5 RETURN i", + count: true, + batchSize: 2, + options: { + allowRetry: true + } +}; +var response = logCurlRequest('POST', url, body); +var secondBatchId = response.parsedBody.nextBatchId; +assert(response.code === 201); +logJsonResponse(response); + +response = logCurlRequest('POST', url + '/' + response.parsedBody.id, ''); +assert(response.code === 200); +logJsonResponse(response); + +response = logCurlRequest('POST', url + '/' + response.parsedBody.id + '/' + secondBatchId, ''); +assert(response.code === 200); +logJsonResponse(response); +``` + +### Delete a cursor + +```openapi +paths: + /_db/{database-name}/_api/cursor/{cursor-identifier}: + delete: + operationId: deleteAqlQueryCursor + description: | + Deletes the cursor and frees the resources associated with it. + + The cursor will automatically be destroyed on the server when the client has + retrieved all documents from it. The client can also explicitly destroy the + cursor at any earlier time using an HTTP DELETE request. The cursor identifier must + be included as part of the URL. + + Note: the server will also destroy abandoned cursors automatically after a + certain server-controlled timeout to avoid resource leakage. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: cursor-identifier + in: path + required: true + description: | + The identifier of the cursor + schema: + type: string + responses: + '202': + description: | + The server is aware of the cursor. + '404': + description: | + The server is not aware of the cursor. This is also + returned if a cursor is used after it has been destroyed. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: '' +name: RestCursorDelete +--- +var url = "/_api/cursor"; +var cn = "products"; +db._drop(cn); +db._create(cn); + +db.products.save({"hello1":"world1"}); +db.products.save({"hello2":"world1"}); +db.products.save({"hello3":"world1"}); +db.products.save({"hello4":"world1"}); +db.products.save({"hello5":"world1"}); + +var url = "/_api/cursor"; +var body = { + query: "FOR p IN products LIMIT 5 RETURN p", + count: true, + batchSize: 2 +}; +var response = logCurlRequest('POST', url, body); +logJsonResponse(response); +response = logCurlRequest('DELETE', url + '/' + response.parsedBody.id); +logJsonResponse(response); + +assert(response.code === 202); +db._drop(cn); +``` + +## Track queries + +You can track AQL queries by enabling query tracking. This allows you to list +all currently executing queries. You can also list slow queries and clear this +list. + +### Get the AQL query tracking configuration + +```openapi +paths: + /_db/{database-name}/_api/query/properties: + get: + operationId: getAqlQueryTrackingProperties + description: | + Returns the current query tracking configuration. The configuration is a + JSON object with the following properties: + + - `enabled`: if set to `true`, then queries will be tracked. If set to + `false`, neither queries nor slow queries will be tracked. + + - `trackSlowQueries`: if set to `true`, then slow queries will be tracked + in the list of slow queries if their runtime exceeds the value set in + `slowQueryThreshold`. In order for slow queries to be tracked, the `enabled` + property must also be set to `true`. + + - `trackBindVars`: if set to `true`, then bind variables used in queries will + be tracked. + + - `maxSlowQueries`: the maximum number of slow queries to keep in the list + of slow queries. If the list of slow queries is full, the oldest entry in + it will be discarded when additional slow queries occur. + + - `slowQueryThreshold`: the threshold value for treating a query as slow. A + query with a runtime greater or equal to this threshold value will be + put into the list of slow queries when slow query tracking is enabled. + The value for `slowQueryThreshold` is specified in seconds. + + - `maxQueryStringLength`: the maximum query string length to keep in the + list of queries. Query strings can have arbitrary lengths, and this property + can be used to save memory in case very long query strings are used. The + value is specified in bytes. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + Is returned if properties were retrieved successfully. + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +### Update the AQL query tracking configuration + +```openapi +paths: + /_db/{database-name}/_api/query/properties: + put: + operationId: updateAqlQueryTrackingProperties + description: | + The properties need to be passed in the attribute `properties` in the body + of the HTTP request. `properties` needs to be a JSON object. + + After the properties have been changed, the current set of properties will + be returned in the HTTP response. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + enabled: + description: | + If set to `true`, then queries are tracked. If set to + `false`, neither regular queries nor slow queries are tracked. + + Default: Controlled by the `--query.tracking` startup option. + type: boolean + trackSlowQueries: + description: | + If set to `true`, then slow queries are tracked + in the list of slow queries if their runtime exceeds the value set in + `slowQueryThreshold`. In order for slow queries to be tracked, the `enabled` + property must also be set to `true`. + + Default: Controlled by the `--query.tracking-slow-queries` startup option. + type: boolean + trackBindVars: + description: | + If set to `true`, then the bind variables used in queries are tracked + along with queries. + + Default: Controlled by the `--query.tracking-with-bindvars` startup option. + type: boolean + maxSlowQueries: + description: | + The maximum number of slow queries to keep in the list + of slow queries. If the list of slow queries is full, the oldest entry + is discarded when additional slow queries occur. + type: integer + default: 64 + slowQueryThreshold: + description: | + The threshold value for treating a query as slow (in seconds). + A query with a runtime greater or equal to this threshold value is + put into the list of slow queries if slow query tracking is enabled. + + Default: Controlled by the `--query.slow-threshold` startup option. + type: integer + slowStreamingQueryThreshold: + description: | + The threshold value for treating a streaming query as slow (in seconds). + A query with `"stream"` set to `true` and a runtime greater or equal to this + threshold value is put into the list of slow queries if slow query tracking + is enabled. + + Default: Controlled by the `--query.slow-streaming-threshold` startup option. + type: integer + maxQueryStringLength: + description: | + The maximum query string length to keep in the list of queries. + Query strings can have arbitrary lengths, and this property + can be used to save memory in case very long query strings are used. The + value is specified in bytes. + + You can disable the tracking of query strings with the + `--query.tracking-with-querystring` startup option. + type: integer + default: 4096 + responses: + '200': + description: | + Is returned if the properties were changed successfully. + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +### List the running AQL queries + +```openapi +paths: + /_db/{database-name}/_api/query/current: + get: + operationId: listAqlQueries + description: | + Returns an array containing the AQL queries currently running in the selected + database. Each query is a JSON object with the following attributes: + + - `id`: the query's id + + - `database`: the name of the database the query runs in + + - `user`: the name of the user that started the query + + - `query`: the query string (potentially truncated) + + - `bindVars`: the bind parameter values used by the query + + - `started`: the date and time when the query was started + + - `runTime`: the query's run time up to the point the list of queries was + queried + + - `peakMemoryUsage`: the query's peak memory usage in bytes (in increments of 32KB) + + - `state`: the query's current execution state (as a string). One of: + - `"initializing"` + - `"parsing"` + - `"optimizing ast"` + - `"loading collections"` + - `"instantiating plan"` + - `"optimizing plan"` + - `"instantiating executors"` + - `"executing"` + - `"finalizing"` + - `"finished"` + - `"killed"` + - `"invalid"` + + - `stream`: whether or not the query uses a streaming cursor + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: all + in: query + required: false + description: | + If set to `true`, will return the currently running queries in all databases, + not just the selected one. + Using the parameter is only allowed in the `_system` database and with superuser + privileges. + schema: + type: boolean + default: false + responses: + '200': + description: | + Is returned when the list of queries can be retrieved successfully. + '400': + description: | + The request is malformed. + '403': + description: | + In case the `all` parameter is used but the request was made in a + different database than `_system`, or by a non-privileged user. + tags: + - Queries +``` + +### List the slow AQL queries + +```openapi +paths: + /_db/{database-name}/_api/query/slow: + get: + operationId: listSlowAqlQueries + description: | + Returns an array containing the last AQL queries that are finished and + have exceeded the slow query threshold in the selected database. + The maximum amount of queries in the list can be controlled by setting + the query tracking property `maxSlowQueries`. The threshold for treating + a query as *slow* can be adjusted by setting the query tracking property + `slowQueryThreshold`. + + Each query is a JSON object with the following attributes: + + - `id`: the query's id + + - `database`: the name of the database the query runs in + + - `user`: the name of the user that started the query + + - `query`: the query string (potentially truncated) + + - `bindVars`: the bind parameter values used by the query + + - `started`: the date and time when the query was started + + - `runTime`: the query's total run time + + - `peakMemoryUsage`: the query's peak memory usage in bytes (in increments of 32KB) + + - `state`: the query's current execution state (will always be "finished" + for the list of slow queries) + + - `stream`: whether or not the query uses a streaming cursor + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: all + in: query + required: false + description: | + If set to `true`, will return the slow queries from all databases, not just + the selected one. + Using the parameter is only allowed in the `_system` database and with superuser + privileges. + schema: + type: boolean + default: false + responses: + '200': + description: | + Is returned when the list of queries can be retrieved successfully. + '400': + description: | + The request is malformed. + '403': + description: | + In case the `all` parameter is used but the request was made in a + different database than `_system`, or by a non-privileged user. + tags: + - Queries +``` + +### Clear the list of slow AQL queries + +```openapi +paths: + /_db/{database-name}/_api/query/slow: + delete: + operationId: clearSlowAqlQueryList + description: | + Clears the list of slow AQL queries for the current database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: all + in: query + required: false + description: | + If set to `true`, will clear the slow query history in all databases, not just + the selected one. + Using the parameter is only allowed in the `_system` database and with superuser + privileges. + schema: + type: boolean + default: false + responses: + '200': + description: | + The list of queries has been cleared successfully. + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +## Kill queries + +Running AQL queries can be killed on the server. To kill a running query, its ID +(as returned for the query in the list of currently running queries) must be +specified. The kill flag of the query is then set, and the query is aborted as +soon as it reaches a cancelation point. + +### Kill a running AQL query + +```openapi +paths: + /_db/{database-name}/_api/query/{query-id}: + delete: + operationId: deleteAqlQuery + description: | + Kills a running query in the currently selected database. The query will be + terminated at the next cancelation point. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: query-id + in: path + required: true + description: | + The identifier of the query. + schema: + type: string + - name: all + in: query + required: false + description: | + If set to `true`, attempt to kill the specified query in all databases, + not just the selected one. + Using the parameter is only allowed in the `_system` database and with superuser + privileges. + schema: + type: boolean + default: false + responses: + '200': + description: | + The query was still running when the kill request was executed and + the query's kill flag has been set. + '400': + description: | + The request is malformed. + '403': + description: | + In case the `all` parameter is used but the request was made in a + different database than `_system`, or by a non-privileged user. + '404': + description: | + A query with the specified identifier cannot be found. + tags: + - Queries +``` + +## Explain and parse AQL queries + +You can retrieve the execution plan for any valid AQL query, as well as +syntactically validate AQL queries. Both functionalities don't actually execute +the supplied AQL query, but only inspect it and return meta information about it. + +You can also retrieve a list of all query optimizer rules and their properties. + +### Explain an AQL query + +```openapi +paths: + /_db/{database-name}/_api/explain: + post: + operationId: explainAqlQuery + description: | + To explain how an AQL query would be executed on the server, the query string + can be sent to the server via an HTTP POST request. The server will then validate + the query and create an execution plan for it. The execution plan will be + returned, but the query will not be executed. + + The execution plan that is returned by the server can be used to estimate the + probable performance of the query. Though the actual performance will depend + on many different factors, the execution plan normally can provide some rough + estimates on the amount of work the server needs to do in order to actually run + the query. + + By default, the explain operation will return the optimal plan as chosen by + the query optimizer The optimal plan is the plan with the lowest total estimated + cost. The plan will be returned in the attribute `plan` of the response object. + If the option `allPlans` is specified in the request, the result will contain + all plans created by the optimizer. The plans will then be returned in the + attribute `plans`. + + The result will also contain an attribute `warnings`, which is an array of + warnings that occurred during optimization or execution plan creation. Additionally, + a `stats` attribute is contained in the result with some optimizer statistics. + If `allPlans` is set to `false`, the result will contain an attribute `cacheable` + that states whether the query results can be cached on the server if the query + result cache were used. The `cacheable` attribute is not present when `allPlans` + is set to `true`. + + Each plan in the result is a JSON object with the following attributes: + - `nodes`: the array of execution nodes of the plan. + + - `estimatedCost`: the total estimated cost for the plan. If there are multiple + plans, the optimizer will choose the plan with the lowest total cost. + + - `collections`: an array of collections used in the query + + - `rules`: an array of rules the optimizer applied. + + - `variables`: array of variables used in the query (note: this may contain + internal variables created by the optimizer) + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - query + properties: + query: + description: | + the query which you want explained; If the query references any bind variables, + these must also be passed in the attribute `bindVars`. Additional + options for the query can be passed in the `options` attribute. + type: string + bindVars: + description: | + An object with key/value pairs representing the bind parameters. + For a bind variable `@var` in the query, specify the value using an attribute + with the name `var`. For a collection bind variable `@@coll`, use `@coll` as the + attribute name. For example: `"bindVars": { "var": 42, "@coll": "products" }`. + type: object + options: + description: | + Options for the query + type: object + properties: + # Purposefully undocumented: + # verbosePlans + # explainInternals + # explainRegisters + allPlans: + description: | + If set to `true`, all possible execution plans are returned. + The default is `false`, meaning only the optimal plan is returned. + type: boolean + default: false + maxNumberOfPlans: + description: | + The maximum number of plans that the optimizer is allowed to + generate. Setting this attribute to a low value allows to put a + cap on the amount of work the optimizer does. + + Default: Controlled by the `--query.optimizer-max-plans` startup option. + type: integer + fullCount: + description: | + Whether to calculate the total number of documents matching the + filter conditions as if the query's final top-level `LIMIT` operation + were not applied. This option generally leads to different + execution plans. + type: boolean + default: false + profile: + description: | + Whether to include additional query profiling information. + If set to `2`, the response includes the time it took to process + each optimizer rule under `stats.rules`. + type: integer + default: 0 + maxNodesPerCallstack: + description: | + The number of execution nodes in the query plan after that stack splitting is + performed to avoid a potential stack overflow. + + This option is only useful for testing and debugging and normally does not need + any adjustment. + + Default: Controlled by the `--query.max-nodes-per-callstack` startup option. + type: integer + maxWarningCount: + description: | + Limits the number of warnings a query can return. + You can increased or decreased the number with this option. + type: integer + default: 10 + failOnWarning: + description: | + If set to `true`, the query throws an exception and aborts instead of producing + a warning. You should use this option during development to catch potential issues + early. When the attribute is set to `false`, warnings are not propagated to + exceptions and are returned with the query result. + + Default: Controlled by the `--query.fail-on-warning` startup option, + so you don't need to set it on a per-query basis. + type: boolean + optimizer: + description: | + Options related to the query optimizer. + type: object + properties: + rules: + description: | + A list of optimizer rules, telling the optimizer to + include or exclude specific rules. See the + [List of optimizer rules](../../../aql/execution-and-performance/query-optimization.md#list-of-optimizer-rules). + + To disable a rule, prefix its name with `-`. To enable a rule, + prefix it with `+`. There is also a pseudo-rule `all` that + matches all optimizer rules. `-all` disables all rules. + type: array + items: + type: string + responses: + '200': + description: | + If the query is valid, the server will respond with *HTTP 200* and + return the optimal execution plan in the `plan` attribute of the response. + If option `allPlans` was set in the request, an array of plans will be returned + in the `allPlans` attribute instead. + '400': + description: | + The request is malformed or the query contains a parse error. + The body of the response contains the error details embedded in a JSON object. + Omitting bind variables if the query references any also results + an error. + '404': + description: | + A non-existing collection is accessed in the query. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + Valid query +name: RestExplainValid +--- +var url = "/_api/explain"; +var cn = "products"; +db._drop(cn); +db._create(cn); +for (var i = 0; i < 10; ++i) { db.products.save({ id: i }); } +body = { + query : "FOR p IN products RETURN p" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + A plan with some optimizer rules applied +name: RestExplainOptimizerRules +--- +var url = "/_api/explain"; +var cn = "products"; +db._drop(cn); +db._create(cn); +db.products.ensureIndex({ type: "persistent", fields: ["id"] }); +for (var i = 0; i < 10; ++i) { db.products.save({ id: i }); } +body = { + query : "FOR p IN products LET a = p.id FILTER a == 4 LET name = p.name SORT p.id LIMIT 1 RETURN name", +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Using some options +name: RestExplainOptions +--- +var url = "/_api/explain"; +var cn = "products"; +db._drop(cn); +db._create(cn); +db.products.ensureIndex({ type: "persistent", fields: ["id"] }); +for (var i = 0; i < 10; ++i) { db.products.save({ id: i }); } +body = { + query : "FOR p IN products LET a = p.id FILTER a == 4 LET name = p.name SORT p.id LIMIT 1 RETURN name", + options : { + maxNumberOfPlans : 2, + allPlans : true, + optimizer : { + rules: [ "-all", "+use-index-for-sort", "+use-index-range" ] + } + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Returning all plans +name: RestExplainAllPlans +--- +var url = "/_api/explain"; +var cn = "products"; +db._drop(cn); +db._create(cn); +db.products.ensureIndex({ type: "persistent", fields: ["id"] }); +body = { + query : "FOR p IN products FILTER p.id == 25 RETURN p", + options: { + allPlans: true + } +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + A query that produces a warning +name: RestExplainWarning +--- +var url = "/_api/explain"; +body = { + query : "FOR i IN 1..10 RETURN 1 / 0" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Invalid query (missing bind parameter) +name: RestExplainInvalid +--- +var url = "/_api/explain"; +var cn = "products"; +db._drop(cn); +db._create(cn); +body = { + query : "FOR p IN products FILTER p.id == @id LIMIT 2 RETURN p.n" +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 400); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + The data returned in the **plan** attribute of the result contains one element per AQL top-level statement + (i.e. `FOR`, `RETURN`, `FILTER` etc.). If the query optimizer removed some unnecessary statements, + the result might also contain less elements than there were top-level statements in the AQL query. + + The following example shows a query with a non-sensible filter condition that + the optimizer has removed so that there are less top-level statements. +name: RestExplainEmpty +--- +var url = "/_api/explain"; +var cn = "products"; +db._drop(cn); +db._create(cn, { waitForSync: true }); +body = '{ "query" : "FOR i IN [ 1, 2, 3 ] FILTER 1 == 2 RETURN i" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +### Parse an AQL query + +```openapi +paths: + /_db/{database-name}/_api/query: + post: + operationId: parseAqlQuery + description: | + This endpoint is for query validation only. To actually query the database, + see `/api/cursor`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - query + properties: + query: + description: | + To validate a query string without executing it, the query string can be + passed to the server via an HTTP POST request. + type: string + responses: + '200': + description: | + If the query is valid, the server will respond with *HTTP 200* and + return the names of the bind parameters it found in the query (if any) in + the `bindVars` attribute of the response. It will also return an array + of the collections used in the query in the `collections` attribute. + If a query can be parsed successfully, the `ast` attribute of the returned + JSON will contain the abstract syntax tree representation of the query. + The format of the `ast` is subject to change in future versions of + ArangoDB, but it can be used to inspect how ArangoDB interprets a given + query. Note that the abstract syntax tree will be returned without any + optimizations applied to it. + '400': + description: | + The request is malformed or the query contains a parse error. + The body of the response contains the error details embedded in a JSON object. + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + a valid query +name: RestQueryValid +--- +var url = "/_api/query"; +var body = '{ "query" : "FOR i IN 1..100 FILTER i > 10 LIMIT 2 RETURN i * 3" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + an invalid query +name: RestQueryInvalid +--- +var url = "/_api/query"; +var body = '{ "query" : "FOR i IN 1..100 FILTER i = 1 LIMIT 2 RETURN i * 3" }'; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 400); + +logJsonResponse(response); +``` + +### List all AQL optimizer rules + +```openapi +paths: + /_db/{database-name}/_api/query/rules: + get: + operationId: getAqlQueryOptimizerRules + description: | + A list of all optimizer rules and their properties. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + is returned if the list of optimizer rules can be retrieved successfully. + content: + application/json: + schema: + description: | + An array of objects. Each object describes an AQL optimizer rule. + type: array + items: + type: object + required: + - name + - flags + properties: + name: + description: | + The name of the optimizer rule as seen in query explain outputs. + type: string + flags: + description: | + An object with the properties of the rule. + type: object + required: + - hidden + - clusterOnly + - canBeDisabled + - canCreateAdditionalPlans + - disabledByDefault + - enterpriseOnly + properties: + hidden: + description: | + Whether the rule is displayed to users. Internal rules are hidden. + type: boolean + clusterOnly: + description: | + Whether the rule is applicable in the cluster deployment mode only. + type: boolean + canBeDisabled: + description: | + Whether users are allowed to disable this rule. A few rules are mandatory. + type: boolean + canCreateAdditionalPlans: + description: | + Whether this rule may create additional query execution plans. + type: boolean + disabledByDefault: + description: | + Whether the optimizer considers this rule by default. + type: boolean + enterpriseOnly: + description: | + Whether the rule is available in the Enterprise Edition only. + type: boolean + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + Retrieve the list of all query optimizer rules: +name: RestQueryRules +--- +var url = "/_api/query/rules"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/queries/aql-query-results-cache.md b/site/content/arangodb/oem/develop/http-api/queries/aql-query-results-cache.md new file mode 100644 index 0000000000..3b92a804ad --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/queries/aql-query-results-cache.md @@ -0,0 +1,396 @@ +--- +title: HTTP interface for the query results cache +menuTitle: AQL query results cache +weight: 10 +description: >- + The query results cache HTTP API lets you control the cache for AQL query results +--- +See [The AQL query results cache](../../../aql/execution-and-performance/caching-query-results.md) +for a description of the feature and the configuration options. + +{{< info >}} +The AQL query results cache is only available for single servers, i.e. servers that +are not part of a cluster setup. +{{< /info >}} + +## List the entries of the AQL query results cache + +```openapi +paths: + /_db/{database-name}/_api/query-cache/entries: + get: + operationId: listQueryCacheResults + description: | + Returns an array containing the AQL query results currently stored in the query results + cache of the selected database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + The list of cached query results. + content: + application/json: + schema: + description: | + The entries of the query results cache. + type: array + items: + description: | + The properties of a cache entry. + type: object + required: + - hash + - query + - size + - results + - hits + - runTime + - started + - dataSources + properties: + hash: + description: | + The hash value calculated from the the query string, + certain query options, and the bind variables. + type: string + query: + description: | + The query string. + type: string + bindVars: + description: | + The bind parameters. This attribute is omitted if the + `--query.tracking-with-bindvars` startup option is set + to `false`. + type: object + size: + description: | + The size of the query result and bind parameters (in bytes). + type: integer + results: + description: | + The number of documents/rows in the query result. + type: integer + started: + description: | + The date and time at which the query result has been added + to the cache (in ISO 8601 format). + type: string + format: date-time + hits: + description: | + How many times the result has been served from the cache so far. + type: integer + runTime: + description: | + The total duration of the query in seconds. + type: number + dataSources: + description: | + The collections and Views involved in the query. + type: array + items: + type: string + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +```curl +--- +name: HttpListQueryResultsCache +description: | + Retrieve the entries stored in the AQL query results cache of the current database: +--- +var resultsCache = require("@arangodb/aql/cache"); +resultsCache.properties({ mode: "demand" }); + +db._create("coll"); +for (let i = 0; i < 3; i++) { + db._query("FOR doc IN @@coll FILTER doc.attr == @val RETURN doc", { + "@coll": "coll", val: "foo" + }, { cache: true }); +} +db._query("RETURN 42", {}, { cache: true }); + +var url = "/_api/query-cache/entries"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +assert(response.parsedBody.length >= 2); +logJsonResponse(response); + +db._drop("coll"); +``` + +## Clear the AQL query results cache + +```openapi +paths: + /_db/{database-name}/_api/query-cache: + delete: + operationId: deleteAqlQueryCache + description: | + Clears all results stored in the AQL query results cache for the current database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + The results cache has been cleared. + content: + application/json: + schema: + type: object + required: + - error + - code + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +```curl +--- +name: HttpClearQueryResultsCache +description: | + Clear the AQL query results cache of the current database: +--- +var url = "/_api/query-cache"; +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); +logJsonResponse(response); +``` + +## Get the AQL query results cache configuration + +```openapi +paths: + /_db/{database-name}/_api/query-cache/properties: + get: + operationId: getQueryCacheProperties + description: | + Returns the global AQL query results cache configuration. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + The result cache configuration is returned successfully. + content: + application/json: + schema: + description: | + The result cache configuration. + type: object + properties: + mode: + description: | + The mode the AQL query results cache operates in. + type: string + # Unquoted on and off are booleans in YAML 1.1! + enum: ["off", "on", "demand"] + maxResults: + description: | + The maximum number of query results that are stored per + database-specific cache. + type: integer + maxResultsSize: + description: | + The maximum cumulated size of query results that are + stored per database-specific cache (in bytes). + type: integer + maxEntrySize: + description: | + The maximum individual result size of queries that are + stored per database-specific cache (in bytes). + includeSystem: + description: | + Whether results of queries that involve system collections + are stored in the query results cache. + type: boolean + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +```curl +--- +name: HttpGetQueryResultsCacheProperties +description: | + Retrieve the global configuration of the AQL query results cache: +--- +var resultsCache = require("@arangodb/aql/cache"); +resultsCache.properties({ mode: "demand" }); + +var url = "/_api/query-cache/properties"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +assert(response.parsedBody.mode == "demand"); +logJsonResponse(response); +``` + +## Set the AQL query results cache configuration + +```openapi +paths: + /_db/{database-name}/_api/query-cache/properties: + put: + operationId: setQueryCacheProperties + description: | + Adjusts the global properties for the AQL query results cache. + + Changing the properties may invalidate all results currently in the cache. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + requestBody: + content: + application/json: + schema: + description: | + The result cache configuration settings to change. + type: object + properties: + mode: + description: | + The mode the AQL query cache shall operate in. + + Default: Controlled by the `--query.cache-mode` startup option. + type: string + # Unquoted on and off are booleans in YAML 1.1! + enum: ["off", "on", "demand"] + maxResults: + description: | + The maximum number of query results that are stored per + database-specific cache. + + Default: Controlled by the `--query.cache-entries` startup option. + type: integer + maxResultsSize: + description: | + The maximum cumulated size of query results that are stored + per database-specific cache (in bytes). + + Default: Controlled by the `--query.cache-entries-max-size` startup option. + type: integer + maxEntrySize: + description: | + The maximum individual size of query results that are stored + per database-specific cache (in bytes). + + Default: Controlled by the `--query.cache-entry-max-size` startup option. + type: integer + includeSystem: + description: | + Whether to store results of queries that involve + system collections in the cache. + + Default: Controlled by the `--query.cache-include-system-collections` + startup option + type: boolean + responses: + '200': + description: | + The result cache configuration has been changed successfully. + content: + application/json: + schema: + description: | + The result cache configuration. + type: object + properties: + mode: + description: | + The mode the AQL query results cache operates in. + type: string + # Unquoted on and off are booleans in YAML 1.1! + enum: ["off", "on", "demand"] + maxResults: + description: | + The maximum number of query results that are stored per + database-specific cache. + type: integer + maxResultsSize: + description: | + The maximum cumulated size of query results that are + stored per database-specific cache (in bytes). + type: integer + maxEntrySize: + description: | + The maximum individual result size of queries that are + stored per database-specific cache (in bytes). + includeSystem: + description: | + Whether results of queries that involve system collections + are stored in the query results cache. + type: boolean + '400': + description: | + The request is malformed. + tags: + - Queries +``` + +```curl +--- +name: HttpSetQueryResultsCacheProperties +description: | + Change some properties of the global configuration of the AQL query results cache: +--- +var url = "/_api/query-cache/properties"; +var body = { mode: "demand", maxResults: 32 }; +var response = logCurlRequest('PUT', url, body); +assert(response.code === 200); +assert(response.parsedBody.mode == "demand"); +assert(response.parsedBody.maxResults == 32); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/queries/user-defined-aql-functions.md b/site/content/arangodb/oem/develop/http-api/queries/user-defined-aql-functions.md new file mode 100644 index 0000000000..4fc911e2d1 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/queries/user-defined-aql-functions.md @@ -0,0 +1,481 @@ +--- +title: HTTP interface for user-defined AQL functions +menuTitle: User-defined AQL functions +weight: 15 +description: >- + The HTTP API for user-defined functions (UDFs) lets you add, delete, and list + registered AQL extensions +--- +AQL user functions are a means to extend the functionality +of ArangoDB's query language (AQL) with user-defined JavaScript code. + +For an overview of over AQL user functions and their implications, please refer +to [Extending AQL](../../../aql/user-defined-functions.md). + +All user functions managed through this interface are stored in the +`_aqlfunctions` system collection. You should not modify the documents in this +collection directly, but only via the dedicated interfaces. + +## Create a user-defined AQL function + +```openapi +paths: + /_db/{database-name}/_api/aqlfunction: + post: + operationId: createAqlUserFunction + description: | + Registers a user-defined function (UDF) written in JavaScript for the use in + AQL queries in the current database. + + In case of success, HTTP 200 is returned. + If the function isn't valid etc. HTTP 400 including a detailed error message will be returned. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + - code + properties: + name: + description: | + The fully qualified name of the user functions. + type: string + code: + description: | + A string representation of the JavaScript function definition. + type: string + isDeterministic: + description: | + Whether the function results are fully deterministic, i.e. + the function return value solely depends on the input value + and the return value is the same for repeated calls with same + input. + + This attribute is currently not used but may be used for + optimizations in the future. + type: boolean + default: false + responses: + '200': + description: | + If the function already existed and was replaced by the + call, the server will respond with *HTTP 200*. + content: + application/json: + schema: + type: object + required: + - error + - code + - isNewlyCreated + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + isNewlyCreated: + description: | + boolean flag to indicate whether the function was newly created (`false` in this case) + type: boolean + '201': + description: | + If the function can be registered by the server, the server will respond with + *HTTP 201*. + content: + application/json: + schema: + type: object + required: + - error + - code + - isNewlyCreated + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 201 + isNewlyCreated: + description: | + boolean flag to indicate whether the function was newly created (`true` in this case) + type: boolean + '400': + description: | + If the JSON representation is malformed or mandatory data is missing from the + request, the server will respond with *HTTP 400*. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: '' +name: RestAqlfunctionCreate +--- +var url = "/_api/aqlfunction"; +var body = { + name: "myfunctions::temperature::celsiustofahrenheit", + code : "function (celsius) { return celsius * 1.8 + 32; }", + isDeterministic: true +}; + +var response = logCurlRequest('POST', url, body); + +assert(response.code === 200 || response.code === 201 || response.code === 202); + +logJsonResponse(response); +``` + +## Remove a user-defined AQL function + +```openapi +paths: + /_db/{database-name}/_api/aqlfunction/{name}: + delete: + operationId: deleteAqlUserFunction + description: | + Deletes an existing user-defined function (UDF) or function group identified by + `name` from the current database. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: name + in: path + required: true + description: | + the name of the AQL user function. + schema: + type: string + - name: group + in: query + required: false + description: | + Possible values: + - `true`: The function name provided in `name` is treated as + a namespace prefix, and all functions in the specified namespace will be deleted. + The returned number of deleted functions may become 0 if none matches the string. + - `false`: The function name provided in `name` must be fully + qualified, including any namespaces. If none matches the `name`, HTTP 404 is returned. + schema: + type: boolean + default: false + responses: + '200': + description: | + If the function can be removed by the server, the server will respond with + *HTTP 200*. + content: + application/json: + schema: + type: object + required: + - error + - code + - deletedCount + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + deletedCount: + description: | + The number of deleted user functions, always `1` when `group` is set to `false`. + Any number `>= 0` when `group` is set to `true`. + type: integer + '400': + description: | + If the user function name is malformed, the server will respond with *HTTP 400*. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + If the specified user function does not exist, the server will respond with *HTTP 404*. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: |- + deletes a function: +name: RestAqlfunctionDelete +--- +var url = "/_api/aqlfunction/square::x::y"; + +var body = { + name : "square::x::y", + code : "function (x) { return x*x; }" +}; + +db._connection.POST("/_api/aqlfunction", body); +var response = logCurlRequest('DELETE', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + function not found: +name: RestAqlfunctionDeleteFails +--- +var url = "/_api/aqlfunction/myfunction::x::y"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +## List the registered user-defined AQL functions + +```openapi +paths: + /_db/{database-name}/_api/aqlfunction: + get: + operationId: listAqlUserFunctions + description: | + Returns all registered user-defined functions (UDFs) for the use in AQL of the + current database. + + The call returns a JSON array with status codes and all user functions found under `result`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: namespace + in: query + required: false + description: | + Returns all registered AQL user functions from the specified namespace. + schema: + type: string + responses: + '200': + description: | + on success *HTTP 200* is returned. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + All functions, or the ones matching the `namespace` parameter + type: array + items: + type: object + required: + - name + - code + - isDeterministic + properties: + name: + description: | + The fully qualified name of the user function + type: string + code: + description: | + A string representation of the function body + type: string + isDeterministic: + description: | + Whether the function results are fully deterministic, i.e. + the function return value solely depends on the input value + and the return value is the same for repeated calls with same + input. + + This attribute is currently not used but may be used for + optimizations in the future. + type: boolean + '400': + description: | + If the user function name is malformed, the server will respond with *HTTP 400*. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Queries +``` + +**Examples** + +```curl +--- +description: '' +name: RestAqlfunctionsGetAll +--- +var url = "/_api/aqlfunction/test"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/replication/_index.md b/site/content/arangodb/oem/develop/http-api/replication/_index.md new file mode 100644 index 0000000000..05d1a8b8d5 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/replication/_index.md @@ -0,0 +1,22 @@ +--- +title: HTTP interface for replication +menuTitle: Replication +weight: 95 +description: >- + The Replication HTTP API is used internally for synchronizing the nodes in + distributed ArangoDB setups, as well as by users to control the replication +--- +The replication architecture and components are described in more details in +[Replication](../../../deploy/architecture/replication.md). + +The HTTP replication interface serves four main purposes: +- fetch initial data from a server (e.g. for a backup, or for the initial synchronization + of data before starting the continuous replication applier) +- querying the state of a Leader +- fetch continuous changes from a Leader (used for incremental synchronization of changes) +- administer the replication applier (starting, stopping, configuring, querying state) on + a Follower + +Note that if a per-database setup is used (as opposed to server-level replication), +then the replication system must be configured individually per +database, and replicating the data of multiple databases will require multiple operations. diff --git a/site/content/arangodb/oem/develop/http-api/replication/other-replication-commands.md b/site/content/arangodb/oem/develop/http-api/replication/other-replication-commands.md new file mode 100644 index 0000000000..8bdc333647 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/replication/other-replication-commands.md @@ -0,0 +1,55 @@ +--- +title: Other Replication Commands +menuTitle: Other Replication Commands +weight: 20 +description: '' +--- +## Get the replication server ID + +```openapi +paths: + /_db/{database-name}/_api/replication/server-id: + get: + operationId: getReplicationServerId + description: | + Returns the servers id. The id is also returned by other replication API + methods, and this method is an easy means of determining a server's id. + + The body of the response is a JSON object with the attribute `serverId`. The + server id is returned as a string. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: '' +name: RestReplicationServerId +--- +var url = "/_api/replication/server-id"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/replication/replication-applier.md b/site/content/arangodb/oem/develop/http-api/replication/replication-applier.md new file mode 100644 index 0000000000..d9335f1a7b --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/replication/replication-applier.md @@ -0,0 +1,1014 @@ +--- +title: Replication applier commands +menuTitle: Replication Applier +weight: 15 +description: '' +--- +The applier commands allow to remotely start, stop, and query the state and +configuration of an ArangoDB database's replication applier. + +## Get the replication applier configuration + +```openapi +paths: + /_db/{database-name}/_api/replication/applier-config: + get: + operationId: getReplicationApplierConfig + description: | + Returns the configuration of the replication applier. + + The body of the response is a JSON object with the configuration. The + following attributes may be present in the configuration: + + - `endpoint`: the logger server to connect to (e.g. "tcp://192.168.173.13:8529"). + + - `database`: the name of the database to connect to (e.g. "_system"). + + - `username`: an optional ArangoDB username to use when connecting to the endpoint. + + - `password`: the password to use when connecting to the endpoint. + + - `maxConnectRetries`: the maximum number of connection attempts the applier + will make in a row. If the applier cannot establish a connection to the + endpoint in this number of attempts, it will stop itself. + + - `connectTimeout`: the timeout (in seconds) when attempting to connect to the + endpoint. This value is used for each connection attempt. + + - `requestTimeout`: the timeout (in seconds) for individual requests to the endpoint. + + - `chunkSize`: the requested maximum size for log transfer packets that + is used when the endpoint is contacted. + + - `autoStart`: whether or not to auto-start the replication applier on + (next and following) server starts + + - `adaptivePolling`: whether or not the replication applier will use + adaptive polling. + + - `includeSystem`: whether or not system collection operations will be applied + + - `autoResync`: whether or not the follower should perform a full automatic + resynchronization with the leader in case the leader cannot serve log data + requested by the follower, or when the replication is started and no tick + value + can be found. + + - `autoResyncRetries`: number of resynchronization retries that will be performed + in a row when automatic resynchronization is enabled and kicks in. Setting this + to `0` will effectively disable `autoResync`. Setting it to some other value + will limit the number of retries that are performed. This helps preventing endless + retries in case resynchronizations always fail. + + - `initialSyncMaxWaitTime`: the maximum wait time (in seconds) that the initial + synchronization will wait for a response from the leader when fetching initial + collection data. + This wait time can be used to control after what time the initial synchronization + will give up waiting for a response and fail. This value is relevant even + for continuous replication when `autoResync` is set to `true` because this + may re-start the initial synchronization when the leader cannot provide + log data the follower requires. + This value will be ignored if set to `0`. + + - `connectionRetryWaitTime`: the time (in seconds) that the applier will + intentionally idle before it retries connecting to the leader in case of + connection problems. + This value will be ignored if set to `0`. + + - `idleMinWaitTime`: the minimum wait time (in seconds) that the applier will + intentionally idle before fetching more log data from the leader in case + the leader has already sent all its log data. This wait time can be used + to control the frequency with which the replication applier sends HTTP log + fetch requests to the leader in case there is no write activity on the leader. + This value will be ignored if set to `0`. + + - `idleMaxWaitTime`: the maximum wait time (in seconds) that the applier will + intentionally idle before fetching more log data from the leader in case the + leader has already sent all its log data and there have been previous log + fetch attempts that resulted in no more log data. This wait time can be used + to control the maximum frequency with which the replication applier sends HTTP + log fetch requests to the leader in case there is no write activity on the + leader for longer periods. This configuration value will only be used if the + option `adaptivePolling` is set to `true`. + This value will be ignored if set to `0`. + + - `requireFromPresent`: if set to `true`, then the replication applier will check + at start whether the start tick from which it starts or resumes replication is + still present on the leader. If not, then there would be data loss. If + `requireFromPresent` is `true`, the replication applier will abort with an + appropriate error message. If set to `false`, then the replication applier will + still start, and ignore the data loss. + + - `verbose`: if set to `true`, then a log line will be emitted for all operations + performed by the replication applier. This should be used for debugging + replication + problems only. + + - `restrictType`: the configuration for `restrictCollections` + + - `restrictCollections`: the optional array of collections to include or exclude, + based on the setting of `restrictType` + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: global + in: query + required: false + description: | + If set to `true`, returns the configuration of the global replication applier for all + databases. If set to `false`, returns the configuration of the replication applier in the + selected database. + schema: + type: boolean + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: '' +name: RestReplicationApplierGetConfig +--- +var url = "/_api/replication/applier-config"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); +logJsonResponse(response); +``` + +## Update the replication applier configuration + +```openapi +paths: + /_db/{database-name}/_api/replication/applier-config: + put: + operationId: updateReplicationApplierConfig + description: | + Sets the configuration of the replication applier. The configuration can + only be changed while the applier is not running. The updated configuration + will be saved immediately but only become active with the next start of the + applier. + + In case of success, the body of the response is a JSON object with the updated + configuration. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: global + in: query + required: false + description: | + If set to `true`, adjusts the configuration of the global replication applier for all + databases. If set to `false`, adjusts the configuration of the replication applier in the + selected database. + schema: + type: boolean + requestBody: + content: + application/json: + schema: + type: object + required: + - endpoint + - database + - password + - maxConnectRetries + - connectTimeout + - requestTimeout + - chunkSize + - autoStart + - adaptivePolling + - includeSystem + - requireFromPresent + - verbose + - restrictType + properties: + endpoint: + description: | + the logger server to connect to (e.g. "tcp://192.168.173.13:8529"). The endpoint must be specified. + type: string + database: + description: | + the name of the database on the endpoint. If not specified, defaults to the current local database name. + type: string + username: + description: | + an optional ArangoDB username to use when connecting to the endpoint. + type: string + password: + description: | + the password to use when connecting to the endpoint. + type: string + maxConnectRetries: + description: | + the maximum number of connection attempts the applier + will make in a row. If the applier cannot establish a connection to the + endpoint in this number of attempts, it will stop itself. + type: integer + connectTimeout: + description: | + the timeout (in seconds) when attempting to connect to the + endpoint. This value is used for each connection attempt. + type: integer + requestTimeout: + description: | + the timeout (in seconds) for individual requests to the endpoint. + type: integer + chunkSize: + description: | + the requested maximum size for log transfer packets that + is used when the endpoint is contacted. + type: integer + autoStart: + description: | + whether or not to auto-start the replication applier on + (next and following) server starts + type: boolean + adaptivePolling: + description: | + if set to `true`, the replication applier will fall + to sleep for an increasingly long period in case the logger server at the + endpoint does not have any more replication events to apply. Using + adaptive polling is thus useful to reduce the amount of work for both the + applier and the logger server for cases when there are only infrequent + changes. The downside is that when using adaptive polling, it might take + longer for the replication applier to detect that there are new replication + events on the logger server. + + Setting `adaptivePolling` to false will make the replication applier + contact the logger server in a constant interval, regardless of whether + the logger server provides updates frequently or seldom. + type: boolean + includeSystem: + description: | + whether or not system collection operations will be applied + type: boolean + autoResync: + description: | + whether or not the follower should perform a full automatic resynchronization + with the leader in case the leader cannot serve log data requested by the + follower, or when the replication is started and no tick value can be found. + type: boolean + autoResyncRetries: + description: | + number of resynchronization retries that will be performed in a row when + automatic resynchronization is enabled and kicks in. Setting this to `0` + will + effectively disable `autoResync`. Setting it to some other value will limit + the number of retries that are performed. This helps preventing endless + retries + in case resynchronizations always fail. + type: integer + initialSyncMaxWaitTime: + description: | + the maximum wait time (in seconds) that the initial synchronization will + wait for a response from the leader when fetching initial collection data. + This wait time can be used to control after what time the initial + synchronization + will give up waiting for a response and fail. This value is relevant even + for continuous replication when `autoResync` is set to `true` because this + may re-start the initial synchronization when the leader cannot provide + log data the follower requires. + This value will be ignored if set to `0`. + type: integer + connectionRetryWaitTime: + description: | + the time (in seconds) that the applier will intentionally idle before + it retries connecting to the leader in case of connection problems. + This value will be ignored if set to `0`. + type: integer + idleMinWaitTime: + description: | + the minimum wait time (in seconds) that the applier will intentionally idle + before fetching more log data from the leader in case the leader has + already sent all its log data. This wait time can be used to control the + frequency with which the replication applier sends HTTP log fetch requests + to the leader in case there is no write activity on the leader. + This value will be ignored if set to `0`. + type: integer + idleMaxWaitTime: + description: | + the maximum wait time (in seconds) that the applier will intentionally idle + before fetching more log data from the leader in case the leader has + already sent all its log data and there have been previous log fetch attempts + that resulted in no more log data. This wait time can be used to control the + maximum frequency with which the replication applier sends HTTP log fetch + requests to the leader in case there is no write activity on the leader for + longer periods. This configuration value will only be used if the option + `adaptivePolling` is set to `true`. + This value will be ignored if set to `0`. + type: integer + requireFromPresent: + description: | + if set to `true`, then the replication applier will check + at start whether the start tick from which it starts or resumes replication is + still present on the leader. If not, then there would be data loss. If + `requireFromPresent` is `true`, the replication applier will abort with an + appropriate error message. If set to `false`, then the replication applier will + still start, and ignore the data loss. + type: boolean + verbose: + description: | + if set to `true`, then a log line will be emitted for all operations + performed by the replication applier. This should be used for debugging replication + problems only. + type: boolean + restrictType: + description: | + the configuration for `restrictCollections`; Has to be either `include` or `exclude` + type: string + restrictCollections: + description: | + the array of collections to include or exclude, + based on the setting of `restrictType` + type: array + items: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully. + '400': + description: | + is returned if the configuration is incomplete or malformed, or if the + replication applier is currently running. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: '' +name: RestReplicationApplierSetConfig +--- +var re = require("@arangodb/replication"); +re.applier.stop(); + +var url = "/_api/replication/applier-config"; +var body = { + endpoint: "tcp://127.0.0.1:8529", + username: "replicationApplier", + password: "applier1234@foxx", + chunkSize: 4194304, + autoStart: false, + adaptivePolling: true +}; + +var response = logCurlRequest('PUT', url, body); + +assert(response.code === 200); +logJsonResponse(response); +``` + +## Start the replication applier + +```openapi +paths: + /_db/{database-name}/_api/replication/applier-start: + put: + operationId: startReplicationApplier + description: | + Starts the replication applier. This will return immediately if the + replication applier is already running. + + If the replication applier is not already running, the applier configuration + will be checked, and if it is complete, the applier will be started in a + background thread. This means that even if the applier will encounter any + errors while running, they will not be reported in the response to this + method. + + To detect replication applier errors after the applier was started, use the + `/_api/replication/applier-state` API instead. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: global + in: query + required: false + description: | + If set to `true`, starts the global replication applier for all + databases. If set to `false`, starts the replication applier in the + selected database. + schema: + type: boolean + - name: from + in: query + required: false + description: | + The remote `lastLogTick` value from which to start applying. If not specified, + the last saved tick from the previous applier run is used. If there is no + previous applier state saved, the applier will start at the beginning of the + logger server's log. + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully. + '400': + description: | + is returned if the replication applier is not fully configured or the + configuration is invalid. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: '' +name: RestReplicationApplierStart +--- +var re = require("@arangodb/replication"); +re.applier.stop(); +re.applier.properties({ + endpoint: "tcp://127.0.0.1:8529", + username: "replicationApplier", + password: "applier1234@foxx", + autoStart: false, + adaptivePolling: true +}); + +var url = "/_api/replication/applier-start"; +var response = logCurlRequest('PUT', url, ""); +re.applier.stop(); + +assert(response.code === 200); +logJsonResponse(response); +``` + +## Stop the replication applier + +```openapi +paths: + /_db/{database-name}/_api/replication/applier-stop: + put: + operationId: stopReplicationApplier + description: | + Stops the replication applier. This will return immediately if the + replication applier is not running. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: global + in: query + required: false + description: | + If set to `true`, stops the global replication applier for all + databases. If set to `false`, stops the replication applier in the + selected database. + schema: + type: boolean + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: '' +name: RestReplicationApplierStop +--- +var re = require("@arangodb/replication"); +re.applier.stop(); +re.applier.properties({ + endpoint: "tcp://127.0.0.1:8529", + username: "replicationApplier", + password: "applier1234@foxx", + autoStart: false, + adaptivePolling: true +}); + +re.applier.start(); +var url = "/_api/replication/applier-stop"; +var response = logCurlRequest('PUT', url, ""); +re.applier.stop(); + +assert(response.code === 200); +logJsonResponse(response); +``` + +## Get the replication applier state + +```openapi +paths: + /_db/{database-name}/_api/replication/applier-state: + get: + operationId: getReplicationApplierState + description: | + Returns the state of the replication applier, regardless of whether the + applier is currently running or not. + + The response is a JSON object with the following attributes: + + - `state`: a JSON object with the following sub-attributes: + + - `running`: whether or not the applier is active and running + + - `lastAppliedContinuousTick`: the last tick value from the continuous + replication log the applier has applied. + + - `lastProcessedContinuousTick`: the last tick value from the continuous + replication log the applier has processed. + + Regularly, the last applied and last processed tick values should be + identical. For transactional operations, the replication applier will first + process incoming log events before applying them, so the processed tick + value might be higher than the applied tick value. This will be the case + until the applier encounters the *transaction commit* log event for the + transaction. + + - `lastAvailableContinuousTick`: the last tick value the remote server can + provide, for all databases. + + - `ticksBehind`: this attribute will be present only if the applier is currently + running. It will provide the number of log ticks between what the applier + has applied/seen and the last log tick value provided by the remote server. + If this value is zero, then both servers are in sync. If this is non-zero, + then the remote server has additional data that the applier has not yet + fetched and processed, or the remote server may have more data that is not + applicable to the applier. + + Client applications can use it to determine approximately how far the applier + is behind the remote server, and can periodically check if the value is + increasing (applier is falling behind) or decreasing (applier is catching up). + + Please note that as the remote server will only keep one last log tick value + for all of its databases, but replication may be restricted to just certain + databases on the applier, this value is more meaningful when the global applier + is used. + Additionally, the last log tick provided by the remote server may increase + due to writes into system collections that are not replicated due to replication + configuration. So the reported value may exaggerate the reality a bit for + some scenarios. + + - `time`: the time on the applier server. + + - `totalRequests`: the total number of requests the applier has made to the + endpoint. + + - `totalFailedConnects`: the total number of failed connection attempts the + applier has made. + + - `totalEvents`: the total number of log events the applier has processed. + + - `totalOperationsExcluded`: the total number of log events excluded because + of `restrictCollections`. + + - `progress`: a JSON object with details about the replication applier progress. + It contains the following sub-attributes if there is progress to report: + + - `message`: a textual description of the progress + + - `time`: the date and time the progress was logged + + - `failedConnects`: the current number of failed connection attempts + + - `lastError`: a JSON object with details about the last error that happened on + the applier. It contains the following sub-attributes if there was an error: + + - `errorNum`: a numerical error code + + - `errorMessage`: a textual error description + + - `time`: the date and time the error occurred + + In case no error has occurred, `lastError` will be empty. + + - `server`: a JSON object with the following sub-attributes: + + - `version`: the applier server's version + + - `serverId`: the applier server's id + + - `endpoint`: the endpoint the applier is connected to (if applier is + active) or will connect to (if applier is currently inactive) + + - `database`: the name of the database the applier is connected to (if applier is + active) or will connect to (if applier is currently inactive) + + Please note that all "tick" values returned do not have a specific unit. Tick + values are only meaningful when compared to each other. Higher tick values mean + "later in time" than lower tick values. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: global + in: query + required: false + description: | + If set to `true`, returns the state of the global replication applier for all + databases. If set to `false`, returns the state of the replication applier in the + selected database. + schema: + type: boolean + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + Fetching the state of an inactive applier: +name: RestReplicationApplierStateNotRunning +--- +var re = require("@arangodb/replication"); +re.applier.stop(); + +var url = "/_api/replication/applier-state"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Fetching the state of an active applier: +name: RestReplicationApplierStateRunning +--- +var re = require("@arangodb/replication"); +re.applier.stop(); +re.applier.start(); + +var url = "/_api/replication/applier-state"; +var response = logCurlRequest('GET', url); +re.applier.stop(); + +assert(response.code === 200); +logJsonResponse(response); +``` + +## Turn a server into a follower of another + +```openapi +paths: + /_db/{database-name}/_api/replication/make-follower: + put: + operationId: makeReplicationFollower + description: | + {{</* warning */>}} + Calling this endpoint will synchronize data from the collections found on the + remote leader to the local ArangoDB database. All data in the local collections + will be purged and replaced with data from the leader. Use with caution! + {{</* /warning */>}} + + {{</* info */>}} + This command may take a long time to complete and return. This is because it + will first do a full data synchronization with the leader, which will take time + roughly proportional to the amount of data. + {{</* /info */>}} + + Changes the role to a follower and starts a full data synchronization from a + remote endpoint into the local ArangoDB database and afterwards starts the + continuous replication. + + The operation works on a per-database level. + + All local database data will be removed prior to the synchronization. + + In case of success, the body of the response is a JSON object with the following + attributes: + + - `state`: a JSON object with the following sub-attributes: + + - `running`: whether or not the applier is active and running + + - `lastAppliedContinuousTick`: the last tick value from the continuous + replication log the applier has applied. + + - `lastProcessedContinuousTick`: the last tick value from the continuous + replication log the applier has processed. + + Regularly, the last applied and last processed tick values should be + identical. For transactional operations, the replication applier will first + process incoming log events before applying them, so the processed tick + value might be higher than the applied tick value. This will be the case + until the applier encounters the *transaction commit* log event for the + transaction. + + - `lastAvailableContinuousTick`: the last tick value the remote server can + provide. + + - `ticksBehind`: this attribute will be present only if the applier is currently + running. It will provide the number of log ticks between what the applier + has applied/seen and the last log tick value provided by the remote server. + If this value is zero, then both servers are in sync. If this is non-zero, + then the remote server has additional data that the applier has not yet + fetched and processed, or the remote server may have more data that is not + applicable to the applier. + + Client applications can use it to determine approximately how far the applier + is behind the remote server, and can periodically check if the value is + increasing (applier is falling behind) or decreasing (applier is catching up). + + Please note that as the remote server will only keep one last log tick value + for all of its databases, but replication may be restricted to just certain + databases on the applier, this value is more meaningful when the global applier + is used. + Additionally, the last log tick provided by the remote server may increase + due to writes into system collections that are not replicated due to replication + configuration. So the reported value may exaggerate the reality a bit for + some scenarios. + + - `time`: the time on the applier server. + + - `totalRequests`: the total number of requests the applier has made to the + endpoint. + + - `totalFailedConnects`: the total number of failed connection attempts the + applier has made. + + - `totalEvents`: the total number of log events the applier has processed. + + - `totalOperationsExcluded`: the total number of log events excluded because + of `restrictCollections`. + + - `progress`: a JSON object with details about the replication applier progress. + It contains the following sub-attributes if there is progress to report: + + - `message`: a textual description of the progress + + - `time`: the date and time the progress was logged + + - `failedConnects`: the current number of failed connection attempts + + - `lastError`: a JSON object with details about the last error that happened on + the applier. It contains the following sub-attributes if there was an error: + + - `errorNum`: a numerical error code + + - `errorMessage`: a textual error description + + - `time`: the date and time the error occurred + + In case no error has occurred, `lastError` will be empty. + + - `server`: a JSON object with the following sub-attributes: + + - `version`: the applier server's version + + - `serverId`: the applier server's id + + - `endpoint`: the endpoint the applier is connected to (if applier is + active) or will connect to (if applier is currently inactive) + + - `database`: the name of the database the applier is connected to (if applier is + active) or will connect to (if applier is currently inactive) + + Please note that all "tick" values returned do not have a specific unit. Tick + values are only meaningful when compared to each other. Higher tick values mean + "later in time" than lower tick values. + + {{</* info */>}} + This endpoint is not supported on a Coordinator in a cluster deployment. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - endpoint + - database + - password + - includeSystem + properties: + endpoint: + description: | + the leader endpoint to connect to (e.g. "tcp://192.168.173.13:8529"). + type: string + database: + description: | + the database name on the leader (if not specified, defaults to the + name of the local current database). + type: string + username: + description: | + an optional ArangoDB username to use when connecting to the leader. + type: string + password: + description: | + the password to use when connecting to the leader. + type: string + includeSystem: + description: | + whether or not system collection operations will be applied + type: boolean + restrictType: + description: | + an optional string value for collection filtering. When + specified, the allowed values are `include` or `exclude`. + type: string + restrictCollections: + description: | + an optional array of collections for use with `restrictType`. + If `restrictType` is `include`, only the specified collections + will be synchronized. If `restrictType` is `exclude`, all but the specified + collections will be synchronized. + type: array + items: + type: string + maxConnectRetries: + description: | + the maximum number of connection attempts the applier + will make in a row. If the applier cannot establish a connection to the + endpoint in this number of attempts, it will stop itself. + type: integer + connectTimeout: + description: | + the timeout (in seconds) when attempting to connect to the + endpoint. This value is used for each connection attempt. + type: integer + requestTimeout: + description: | + the timeout (in seconds) for individual requests to the endpoint. + type: integer + chunkSize: + description: | + the requested maximum size for log transfer packets that + is used when the endpoint is contacted. + type: integer + adaptivePolling: + description: | + whether or not the replication applier will use adaptive polling. + type: boolean + autoResync: + description: | + whether or not the follower should perform an automatic resynchronization with + the leader in case the leader cannot serve log data requested by the follower, + or when the replication is started and no tick value can be found. + type: boolean + autoResyncRetries: + description: | + number of resynchronization retries that will be performed in a row when + automatic resynchronization is enabled and kicks in. Setting this to `0` will + effectively disable `autoResync`. Setting it to some other value will limit + the number of retries that are performed. This helps preventing endless retries + in case resynchronizations always fail. + type: integer + initialSyncMaxWaitTime: + description: | + the maximum wait time (in seconds) that the initial synchronization will + wait for a response from the leader when fetching initial collection data. + This wait time can be used to control after what time the initial synchronization + will give up waiting for a response and fail. This value is relevant even + for continuous replication when `autoResync` is set to `true` because this + may re-start the initial synchronization when the leader cannot provide + log data the follower requires. + This value will be ignored if set to `0`. + type: integer + connectionRetryWaitTime: + description: | + the time (in seconds) that the applier will intentionally idle before + it retries connecting to the leader in case of connection problems. + This value will be ignored if set to `0`. + type: integer + idleMinWaitTime: + description: | + the minimum wait time (in seconds) that the applier will intentionally idle + before fetching more log data from the leader in case the leader has + already sent all its log data. This wait time can be used to control the + frequency with which the replication applier sends HTTP log fetch requests + to the leader in case there is no write activity on the leader. + This value will be ignored if set to `0`. + type: integer + idleMaxWaitTime: + description: | + the maximum wait time (in seconds) that the applier will intentionally idle + before fetching more log data from the leader in case the leader has + already sent all its log data and there have been previous log fetch attempts + that resulted in no more log data. This wait time can be used to control the + maximum frequency with which the replication applier sends HTTP log fetch + requests to the leader in case there is no write activity on the leader for + longer periods. This configuration value will only be used if the option + `adaptivePolling` is set to `true`. + This value will be ignored if set to `0`. + type: integer + requireFromPresent: + description: | + if set to `true`, then the replication applier will check + at start of its continuous replication if the start tick from the dump phase + is still present on the leader. If not, then there would be data loss. If + `requireFromPresent` is `true`, the replication applier will abort with an + appropriate error message. If set to `false`, then the replication applier will + still start, and ignore the data loss. + type: boolean + verbose: + description: | + if set to `true`, then a log line will be emitted for all operations + performed by the replication applier. This should be used for debugging + replication + problems only. + type: boolean + responses: + '200': + description: | + is returned if the request was executed successfully. + '400': + description: | + is returned if the configuration is incomplete or malformed. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred during synchronization or when starting the + continuous replication. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + diff --git a/site/content/arangodb/oem/develop/http-api/replication/replication-dump.md b/site/content/arangodb/oem/develop/http-api/replication/replication-dump.md new file mode 100644 index 0000000000..240f70b647 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/replication/replication-dump.md @@ -0,0 +1,992 @@ +--- +title: Replication dump commands +menuTitle: Replication Dump +weight: 5 +description: '' +--- +## Inventory + +The *inventory* method can be used to query an ArangoDB database's current +set of collections plus their indexes. Clients can use this method to get an +overview of which collections are present in the database. They can use this information +to either start a full or a partial synchronization of data, e.g. to initiate a backup +or the incremental data synchronization. + +### Get a replication inventory + +```openapi +paths: + /_db/{database-name}/_api/replication/inventory: + get: + operationId: getReplicationInventory + description: | + Returns the array of collections and their indexes, and the array of Views available. These + arrays can be used by replication clients to initiate an initial synchronization with the + server. + The response will contain all collections, their indexes and views in the requested database + if `global` is not set, and all collections, indexes and views in all databases if `global` + is set. + In case `global` is not set, it is possible to restrict the response to a single collection + by setting the `collection` parameter. In this case the response will contain only information + about the requested collection in the `collections` array, and no information about views + (i.e. the `views` response attribute will be an empty array). + + The response will contain a JSON object with the `collections`, `views`, `state` and + `tick` attributes. + + `collections` is an array of collections with the following sub-attributes: + + - `parameters`: the collection properties + + - `indexes`: an array of the indexes of the collection. Primary indexes and edge indexes + are not included in this array. + + The `state` attribute contains the current state of the replication logger. It + contains the following sub-attributes: + + - `running`: whether or not the replication logger is currently active. Note: + since ArangoDB 2.2, the value will always be `true` + + - `lastLogTick`: the value of the last tick the replication logger has written + + - `time`: the current time on the server + + `views` is an array of available views. + + Replication clients should note the `lastLogTick` value returned. They can then + fetch collections' data using the dump method up to the value of lastLogTick, and + query the continuous replication log for log events after this tick value. + + To create a full copy of the collections on the server, a replication client + can execute these steps: + + - call the `/inventory` API method. This returns the `lastLogTick` value and the + array of collections and indexes from the server. + + - for each collection returned by `/inventory`, create the collection locally and + call `/dump` to stream the collection data to the client, up to the value of + `lastLogTick`. + After that, the client can create the indexes on the collections as they were + reported by `/inventory`. + + If the clients wants to continuously stream replication log events from the logger + server, the following additional steps need to be carried out: + + - the client should call `/_api/wal/tail` initially to fetch the first batch of + replication events that were logged after the client's call to `/inventory`. + + The call to `/_api/wal/tail` should use a `from` parameter with the value of the + `lastLogTick` as reported by `/inventory`. The call to `/_api/wal/tail` will + return the `x-arango-replication-lastincluded` header which will contain the + last tick value included in the response. + + - the client can then continuously call `/_api/wal/tail` to incrementally fetch new + replication events that occurred after the last transfer. + + Calls should use a `from` parameter with the value of the `x-arango-replication-lastincluded` + header of the previous response. If there are no more replication events, the + response will be empty and clients can go to sleep for a while and try again + later. + + {{</* info */>}} + On a Coordinator, this request must have a `DBserver` + query parameter which must be an ID of a DB-Server. + The very same request is forwarded synchronously to that DB-Server. + It is an error if this attribute is not bound in the Coordinator case. + {{</* /info */>}} + + {{</* info */>}} + Using the `global` parameter the top-level object contains a key `databases` + under which each key represents a database name, and the value conforms to the above description. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: includeSystem + in: query + required: false + description: | + Include system collections in the result. + schema: + type: boolean + default: true + - name: global + in: query + required: false + description: | + Include all databases in the response. Only works in the context of + the `_system` database. + schema: + type: boolean + default: false + - name: batchId + in: query + required: true + description: | + A valid batchId is required for this API call + schema: + type: number + - name: collection + in: query + required: false + description: | + If this parameter is set, the response will be restricted to a single collection (the one + specified), and no views will be returned. This can be used as an optimization to reduce + the size of the response. + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +## Batch + +The *batch* method will create a snapshot of the current state that then can be +dumped. + +### Create a new dump batch + +```openapi +paths: + /_db/{database-name}/_api/replication/batch: + post: + operationId: createReplicationBatch + description: | + {{</* info */>}} + This is an internally used endpoint. + {{</* /info */>}} + + Creates a new dump batch and returns the batch's id. + + The response is a JSON object with the following attributes: + + - `id`: the id of the batch + - `lastTick`: snapshot tick value using when creating the batch + - `state`: additional leader state information (only present if the + `state` URL parameter was set to `true` in the request) + + {{</* info */>}} + On a Coordinator, this request must have a `DBserver` + query parameter which must be an ID of a DB-Server. + The very same request is forwarded synchronously to that DB-Server. + It is an error if this attribute is not bound in the Coordinator case. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: state + in: query + required: false + description: | + Setting `state` to `true` makes the response also contain + a `state` attribute with information about the leader state. + This is used only internally during the replication process + and should not be used by client applications. + schema: + type: boolean + requestBody: + content: + application/json: + schema: + type: object + required: + - ttl + properties: + ttl: + description: | + The time-to-live for the new batch (in seconds). + type: integer + responses: + '200': + description: | + is returned if the batch was created successfully. + '400': + description: | + is returned if the TTL value is invalid or if the `DBserver` attribute + is not specified or illegal on a Coordinator. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Replication +``` + +### Delete an existing dump batch + +```openapi +paths: + /_db/{database-name}/_api/replication/batch/{id}: + delete: + operationId: deleteReplicationBatch + description: | + {{</* info */>}} + This is an internally used endpoint. + {{</* /info */>}} + + Deletes the existing dump batch, allowing compaction and cleanup to resume. + + {{</* info */>}} + On a Coordinator, this request must have a `DBserver` + query parameter which must be an ID of a DB-Server. + The very same request is forwarded synchronously to that DB-Server. + It is an error if this attribute is not bound in the Coordinator case. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: id + in: path + required: true + description: | + The id of the batch. + schema: + type: string + responses: + '204': + description: | + is returned if the batch was deleted successfully. + '400': + description: | + is returned if the batch was not found. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Replication +``` + +### Extend the TTL of a dump batch + +```openapi +paths: + /_db/{database-name}/_api/replication/batch/{id}: + put: + operationId: extendReplicationBatch + description: | + {{</* info */>}} + This is an internally used endpoint. + {{</* /info */>}} + + Extends the time-to-live (TTL) of an existing dump batch, using the batch's ID and + the provided TTL value. + + If the batch's TTL can be extended successfully, the response is empty. + + {{</* info */>}} + On a Coordinator, this request must have a `DBserver` + query parameter which must be an ID of a DB-Server. + The very same request is forwarded synchronously to that DB-Server. + It is an error if this attribute is not bound in the Coordinator case. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: id + in: path + required: true + description: | + The id of the batch. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - ttl + properties: + ttl: + description: | + the time-to-live for the new batch (in seconds) + type: integer + responses: + '204': + description: | + is returned if the batch's ttl was extended successfully. + '400': + description: | + is returned if the ttl value is invalid or the batch was not found. + '405': + description: | + is returned when an invalid HTTP method is used. + tags: + - Replication +``` + +## Dump + +The *dump* method can be used to fetch data from a specific collection. As the +results of the dump command can be huge, *dump* may not return all data from a collection +at once. Instead, the dump command may be called repeatedly by replication clients +until there is no more data to fetch. The dump command will not only return the +current documents in the collection, but also document updates and deletions. + +Note that the *dump* method will only return documents, updates, and deletions +from a collection's journals and datafiles. Operations that are stored in the write-ahead +log only will not be returned. In order to ensure that these operations are included +in a dump, the write-ahead log must be flushed first. + +To get to an identical state of data, replication clients should apply the individual +parts of the dump results in the same order as they are provided. + +### Get a replication dump + +```openapi +paths: + /_db/{database-name}/_api/replication/dump: + get: + operationId: getReplicationDump + description: | + Returns the data from a collection for the requested range. + + The `chunkSize` query parameter can be used to control the size of the result. + It must be specified in bytes. The `chunkSize` value will only be honored + approximately. Otherwise a too low `chunkSize` value could cause the server + to not be able to put just one entry into the result and return it. + Therefore, the `chunkSize` value will only be consulted after an entry has + been written into the result. If the result size is then greater than + `chunkSize`, the server will respond with as many entries as there are + in the response already. If the result size is still less than `chunkSize`, + the server will try to return more data if there's more data left to return. + + If `chunkSize` is not specified, some server-side default value will be used. + + The `Content-Type` of the result is `application/x-arango-dump`. This is an + easy-to-process format, with all entries going onto separate lines in the + response body. + + Each line itself is a JSON object, with at least the following attributes: + + - `tick`: the operation's tick attribute + + - `key`: the key of the document/edge or the key used in the deletion operation + + - `rev`: the revision id of the document/edge or the deletion operation + + - `data`: the actual document/edge data for types 2300 and 2301. The full + document/edge data will be returned even for updates. + + - `type`: the type of entry. Possible values for `type` are: + + - 2300: document insertion/update + + - 2301: edge insertion/update + + - 2302: document/edge deletion + + {{</* info */>}} + There will be no distinction between inserts and updates when calling this method. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The name or id of the collection to dump. + schema: + type: string + - name: chunkSize + in: query + required: false + description: | + Approximate maximum size of the returned result. + schema: + type: number + - name: batchId + in: query + required: true + description: | + The id of the snapshot to use + schema: + type: number + responses: + '200': + description: | + is returned if the request was executed successfully and data was returned. The header + `x-arango-replication-lastincluded` is set to the tick of the last document returned. + '204': + description: | + is returned if the request was executed successfully, but there was no content available. + The header `x-arango-replication-lastincluded` is `0` in this case. + '404': + description: | + is returned when the collection could not be found. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + +### Get the replication revision tree + +```openapi +paths: + /_db/{database-name}/_api/replication/revisions/tree: + get: + operationId: getReplicationRevisionTree + description: | + {{</* warning */>}} + This revision-based replication endpoint will only work with collections + created in ArangoDB v3.8.0 or later. + {{</* /warning */>}} + + Returns the Merkle tree associated with the specified collection. + + The result will be JSON/VelocyPack in the following format: + ``` + { + version: <Number>, + branchingFactor: <Number> + maxDepth: <Number>, + rangeMin: <String, revision>, + rangeMax: <String, revision>, + nodes: [ + { count: <Number>, hash: <String, revision> }, + { count: <Number>, hash: <String, revision> }, + ... + { count: <Number>, hash: <String, revision> } + ] + } + ``` + + At the moment, there is only one version, 1, so this can safely be ignored for + now. + + Each `<String, revision>` value type is a 64-bit value encoded as a string of + 11 characters, using the same encoding as our document `_rev` values. The + reason for this is that 64-bit values cannot necessarily be represented in full + in JavaScript, as it handles all numbers as floating point, and can only + represent up to `2^53-1` faithfully. + + The node count should correspond to a full tree with the given `maxDepth` and + `branchingFactor`. The nodes are laid out in level-order tree traversal, so the + root is at index `0`, its children at indices `[1, branchingFactor]`, and so + on. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The name or id of the collection to query. + schema: + type: string + - name: batchId + in: query + required: true + description: | + The id of the snapshot to use + schema: + type: number + responses: + '200': + description: | + is returned if the request was executed successfully and data was returned. + '401': + description: | + is returned if necessary parameters are missing + '404': + description: | + is returned when the collection or snapshot could not be found. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned if called on a collection which doesn't support sync-by-revision + tags: + - Replication +``` + +### Rebuild the replication revision tree + +```openapi +paths: + /_db/{database-name}/_api/replication/revisions/tree: + post: + operationId: rebuildReplicationRevisionTree + description: | + {{</* warning */>}} + This revision-based replication endpoint will only work with collections + created in ArangoDB v3.8.0 or later. + {{</* /warning */>}} + + Rebuilds the Merkle tree for a collection. + + If successful, there will be no return body. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The name or id of the collection to query. + schema: + type: string + responses: + '204': + description: | + is returned if the request was executed successfully. + '401': + description: | + is returned if necessary parameters are missing + '404': + description: | + is returned when the collection or could not be found. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned if called on a collection which doesn't support sync-by-revision + tags: + - Replication +``` + +### List document revision IDs within requested ranges + +```openapi +paths: + /_db/{database-name}/_api/replication/revisions/ranges: + put: + operationId: listReplicationRevisionRanges + description: | + {{</* warning */>}} + This revision-based replication endpoint will only work with the RocksDB + engine, and with collections created in ArangoDB v3.8.0 or later. + {{</* /warning */>}} + + Returns the revision IDs of documents within the requested ranges. + + The body of the request should be JSON/VelocyPack and should consist of an + array of pairs of string-encoded revision IDs: + + ``` + [ + [<String, revision>, <String, revision>], + [<String, revision>, <String, revision>], + ... + [<String, revision>, <String, revision>] + ] + ``` + + In particular, the pairs should be non-overlapping, and sorted in ascending + order of their decoded values. + + The result will be JSON/VelocyPack in the following format: + ``` + { + ranges: [ + [<String, revision>, <String, revision>, ... <String, revision>], + [<String, revision>, <String, revision>, ... <String, revision>], + ..., + [<String, revision>, <String, revision>, ... <String, revision>] + ] + resume: <String, revision> + } + ``` + + The `resume` field is optional. If specified, then the response is to be + considered partial, only valid through the revision specified. A subsequent + request should be made with the same request body, but specifying the `resume` + URL parameter with the value specified. The subsequent response will pick up + from the appropriate request pair, and omit any complete ranges or revisions + which are less than the requested resume revision. As an example (ignoring the + string-encoding for a moment), if ranges `[1, 3], [5, 9], [12, 15]` are + requested, then a first response may return `[], [5, 6]` with a resume point of + `7` and a subsequent response might be `[8], [12, 13]`. + + If a requested range contains no revisions, then an empty array is returned. + Empty ranges will not be omitted. + + Each `<String, revision>` value type is a 64-bit value encoded as a string of + 11 characters, using the same encoding as our document `_rev` values. The + reason for this is that 64-bit values cannot necessarily be represented in full + in JavaScript, as it handles all numbers as floating point, and can only + represent up to `2^53-1` faithfully. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The name or id of the collection to query. + schema: + type: string + - name: batchId + in: query + required: true + description: | + The id of the snapshot to use + schema: + type: number + - name: resume + in: query + required: false + description: | + The revision at which to resume, if a previous request was truncated + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully and data was returned. + '401': + description: | + is returned if necessary parameters are missing or incorrect + '404': + description: | + is returned when the collection or snapshot could not be found. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned if called on a collection which doesn't support sync-by-revision + tags: + - Replication +``` + +### Get documents by revision + +```openapi +paths: + /_db/{database-name}/_api/replication/revisions/documents: + put: + operationId: listReplicationRevisionDocuments + description: | + {{</* warning */>}} + This revision-based replication endpoint will only work with collections + created in ArangoDB v3.8.0 or later. + {{</* /warning */>}} + + Returns documents by revision for replication. + + The body of the request should be JSON/VelocyPack and should consist of an + array of string-encoded revision IDs: + + ``` + [ + <String, revision>, + <String, revision>, + ... + <String, revision> + ] + ``` + + In particular, the revisions should be sorted in ascending order of their + decoded values. + + The result will be a JSON/VelocyPack array of document objects. If there is no + document corresponding to a particular requested revision, an empty object will + be returned in its place. + + The response may be truncated if it would be very long. In this case, the + response array length will be less than the request array length, and + subsequent requests can be made for the omitted documents. + + Each `<String, revision>` value type is a 64-bit value encoded as a string of + 11 characters, using the same encoding as our document `_rev` values. The + reason for this is that 64-bit values cannot necessarily be represented in full + in JavaScript, as it handles all numbers as floating point, and can only + represent up to `2^53-1` faithfully. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: collection + in: query + required: true + description: | + The name or id of the collection to query. + schema: + type: string + - name: batchId + in: query + required: true + description: | + The id of the snapshot to use + schema: + type: number + responses: + '200': + description: | + is returned if the request was executed successfully and data was returned. + '401': + description: | + is returned if necessary parameters are missing or incorrect + '404': + description: | + is returned when the collection or snapshot could not be found. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned if called on a collection which doesn't support sync-by-revision + tags: + - Replication +``` + +### Start replication from a remote endpoint + +```openapi +paths: + /_db/{database-name}/_api/replication/sync: + put: + operationId: startReplicationSync + description: | + Starts a full data synchronization from a remote endpoint into the local + ArangoDB database. + + The *sync* method can be used by replication clients to connect an ArangoDB database + to a remote endpoint, fetch the remote list of collections and indexes, and collection + data. It will thus create a local backup of the state of data at the remote ArangoDB + database. *sync* works on a per-database level. + + *sync* will first fetch the list of collections and indexes from the remote endpoint. + It does so by calling the *inventory* API of the remote database. It will then purge + data in the local ArangoDB database, and after start will transfer collection data + from the remote database to the local ArangoDB database. It will extract data from the + remote database by calling the remote database's *dump* API until all data are fetched. + + In case of success, the body of the response is a JSON object with the following + attributes: + + - *collections*: an array of collections that were transferred from the endpoint + + - *lastLogTick*: the last log tick on the endpoint at the time the transfer + was started. Use this value as the *from* value when starting the continuous + synchronization later. + + WARNING: calling this method will synchronize data from the collections found + on the remote endpoint to the local ArangoDB database. All data in the local + collections will be purged and replaced with data from the endpoint. + + Use with caution! + + {{</* info */>}} + This method is not supported on a Coordinator in a cluster deployment. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - endpoint + - password + properties: + endpoint: + description: | + the leader endpoint to connect to (e.g. "tcp://192.168.173.13:8529"). + type: string + database: + description: | + the database name on the leader (if not specified, defaults to the + name of the local current database). + type: string + username: + description: | + an optional ArangoDB username to use when connecting to the endpoint. + type: string + password: + description: | + the password to use when connecting to the endpoint. + type: string + includeSystem: + description: | + whether or not system collection operations will be applied + type: boolean + incremental: + description: | + if set to *true*, then an incremental synchronization method will be used + for synchronizing data in collections. This method is useful when + collections already exist locally, and only the remaining differences need + to be transferred from the remote endpoint. In this case, the incremental + synchronization can be faster than a full synchronization. + The default value is *false*, meaning that the complete data from the remote + collection will be transferred. + type: boolean + restrictType: + description: | + an optional string value for collection filtering. When + specified, the allowed values are *include* or *exclude*. + type: string + restrictCollections: + description: | + an optional array of collections for use with + *restrictType*. If *restrictType* is *include*, only the specified collections + will be synchronized. If *restrictType* is *exclude*, all but the specified + collections will be synchronized. + type: array + items: + type: string + initialSyncMaxWaitTime: + description: | + the maximum wait time (in seconds) that the initial synchronization will + wait for a response from the leader when fetching initial collection data. + This wait time can be used to control after what time the initial synchronization + will give up waiting for a response and fail. + This value will be ignored if set to *0*. + type: integer + responses: + '200': + description: | + is returned if the request was executed successfully. + '400': + description: | + is returned if the configuration is incomplete or malformed. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred during synchronization. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +### Get the cluster collections and indexes + +```openapi +paths: + /_db/{database-name}/_api/replication/clusterInventory: + get: + operationId: getReplicationClusterInventory + description: | + Returns the array of collections and indexes available on the cluster. + + The response will be an array of JSON objects, one for each collection. + Each collection contains exactly two keys, `parameters` and `indexes`. + This information comes from `Plan/Collections/{DB-Name}/*` in the Agency, + just that the `indexes` attribute there is relocated to adjust it to + the data format of arangodump. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: includeSystem + in: query + required: false + description: | + Include system collections in the result. + schema: + type: boolean + default: true + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + tags: + - Replication +``` + diff --git a/site/content/arangodb/oem/develop/http-api/replication/replication-logger.md b/site/content/arangodb/oem/develop/http-api/replication/replication-logger.md new file mode 100644 index 0000000000..32d1199cd6 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/replication/replication-logger.md @@ -0,0 +1,478 @@ +--- +title: Replication logger commands +menuTitle: Replication Logger +weight: 10 +description: '' +--- +All data-modification operations are written to the server's write-ahead log and are +not handled by a separate replication logger. + +You can query the current state of the logger and fetch the latest changes +written by the logger with the `logger-state` method. The operations return the +state and data from the write-ahead log. + +To query the latest changes logged by the replication logger, the HTTP interface +also provides the `logger-follow` method. This method should be used by +replication clients to incrementally fetch updates from an ArangoDB database. + +To check what range of changes is available (identified by tick values), the HTTP +interface provides the methods `logger-first-tick` and `logger-tick-ranges`. +Replication clients can use the methods to determine if certain data (identified +by a tick *date*) is still available on the Leader. + +## Get the replication logger state + +```openapi +paths: + /_db/{database-name}/_api/replication/logger-state: + get: + operationId: getReplicationLoggerState + description: | + Returns the current state of the server's replication logger. The state will + include information about whether the logger is running and about the last + logged tick value. This tick value is important for incremental fetching of + data. + + The body of the response contains a JSON object with the following + attributes: + + - `state`: the current logger state as a JSON object with the following + sub-attributes: + + - `running`: whether or not the logger is running + + - `lastLogTick`: the tick value of the latest tick the logger has logged. + This value can be used for incremental fetching of log data. + + - `totalEvents`: total number of events logged since the server was started. + The value is not reset between multiple stops and re-starts of the logger. + + - `time`: the current date and time on the logger server + + - `server`: a JSON object with the following sub-attributes: + + - `version`: the logger server's version + + - `serverId`: the logger server's id + + - `clients`: returns the last fetch status by replication clients connected to + the logger. Each client is returned as a JSON object with the following attributes: + + - `syncerId`: id of the client syncer + + - `serverId`: server id of client + + - `lastServedTick`: last tick value served to this client via the WAL tailing API + + - `time`: date and time when this client last called the WAL tailing API + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + is returned if the logger state could be determined successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if the logger state could not be determined. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + Returns the state of the replication logger. +name: RestReplicationLoggerStateActive +--- +var re = require("@arangodb/replication"); + +var url = "/_api/replication/logger-state"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Get replication log entries (deprecated) + +```openapi +paths: + /_db/{database-name}/_api/replication/logger-follow: + get: + operationId: getReplicationLoggerFollow + description: | + {{</* warning */>}} + This route should no longer be used. + It is considered as deprecated from version 3.4.0 on. Client applications + should use the REST API endpoint `/_api/wal/tail` instead. + {{</* /warning */>}} + + Returns data from the server's replication log. This method can be called + by replication clients after an initial synchronization of data. The method + will return all "recent" log entries from the logger server, and the clients + can replay and apply these entries locally so they get to the same data + state as the logger server. + + Clients can call this method repeatedly to incrementally fetch all changes + from the logger server. In this case, they should provide the `from` value so + they will only get returned the log events since their last fetch. + + When the `from` query parameter is not used, the logger server will return log + entries starting at the beginning of its replication log. When the `from` + parameter is used, the logger server will only return log entries which have + higher tick values than the specified `from` value (note: the log entry with a + tick value equal to `from` will be excluded). Use the `from` value when + incrementally fetching log data. + + The `to` query parameter can be used to optionally restrict the upper bound of + the result to a certain tick value. If used, the result will contain only log events + with tick values up to (including) `to`. In incremental fetching, there is no + need to use the `to` parameter. It only makes sense in special situations, + when only parts of the change log are required. + + The `chunkSize` query parameter can be used to control the size of the result. + It must be specified in bytes. The `chunkSize` value will only be honored + approximately. Otherwise a too low `chunkSize` value could cause the server + to not be able to put just one log entry into the result and return it. + Therefore, the `chunkSize` value will only be consulted after a log entry has + been written into the result. If the result size is then greater than + `chunkSize`, the server will respond with as many log entries as there are + in the response already. If the result size is still less than `chunkSize`, + the server will try to return more data if there's more data left to return. + + If `chunkSize` is not specified, some server-side default value will be used. + + The `Content-Type` of the result is `application/x-arango-dump`. This is an + easy-to-process format, with all log events going onto separate lines in the + response body. Each log event itself is a JSON object, with at least the + following attributes: + + - `tick`: the log event tick value + + - `type`: the log event type + + Individual log events will also have additional attributes, depending on the + event type. A few common attributes which are used for multiple events types + are: + + - `cid`: id of the collection the event was for + + - `tid`: id of the transaction the event was contained in + + - `key`: document key + + - `rev`: document revision id + + - `data`: the original document data + + The response will also contain the following HTTP headers: + + - `x-arango-replication-active`: whether or not the logger is active. Clients + can use this flag as an indication for their polling frequency. If the + logger is not active and there are no more replication events available, it + might be sensible for a client to abort, or to go to sleep for a long time + and try again later to check whether the logger has been activated. + + - `x-arango-replication-lastincluded`: the tick value of the last included + value in the result. In incremental log fetching, this value can be used + as the `from` value for the following request. **Note** that if the result is + empty, the value will be `0`. This value should not be used as `from` value + by clients in the next request (otherwise the server would return the log + events from the start of the log again). + + - `x-arango-replication-lasttick`: the last tick value the logger server has + logged (not necessarily included in the result). By comparing the last + tick and last included tick values, clients have an approximate indication of + how many events there are still left to fetch. + + - `x-arango-replication-checkmore`: whether or not there already exists more + log data which the client could fetch immediately. If there is more log data + available, the client could call `logger-follow` again with an adjusted `from` + value to fetch remaining log entries until there are no more. + + If there isn't any more log data to fetch, the client might decide to go + to sleep for a while before calling the logger again. + + {{</* info */>}} + This method is not supported on a Coordinator in a cluster deployment. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: from + in: query + required: false + description: | + Exclusive lower bound tick value for results. + schema: + type: number + - name: to + in: query + required: false + description: | + Inclusive upper bound tick value for results. + schema: + type: number + - name: chunkSize + in: query + required: false + description: | + Approximate maximum size of the returned result. + schema: + type: number + - name: includeSystem + in: query + required: false + description: | + Include system collections in the result. + schema: + type: boolean + default: true + responses: + '200': + description: | + is returned if the request was executed successfully, and there are log + events available for the requested range. The response body will not be empty + in this case. + '204': + description: | + is returned if the request was executed successfully, but there are no log + events available for the requested range. The response body will be empty + in this case. + '400': + description: | + is returned if either the `from` or `to` values are invalid. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + No log events available +name: RestReplicationLoggerFollowEmpty +--- +var re = require("@arangodb/replication"); +var lastTick = re.logger.state().state.lastLogTick; + +var url = "/_api/replication/logger-follow?from=" + lastTick; +var response = logCurlRequest('GET', url); + +assert(response.code === 204); + +logRawResponse(response); +``` + +```curl +--- +description: |- + A few log events *(One JSON document per line)* +name: RestReplicationLoggerFollowSome +--- +var re = require("@arangodb/replication"); +db._drop("products"); + +var lastTick = re.logger.state().state.lastLogTick; + +db._create("products"); +db.products.save({ "_key": "p1", "name" : "flux compensator" }); +db.products.save({ "_key": "p2", "name" : "hybrid hovercraft", "hp" : 5100 }); +db.products.remove("p1"); +db.products.update("p2", { "name" : "broken hovercraft" }); +db.products.drop(); + +require("internal").wait(1); +var url = "/_api/replication/logger-follow?from=" + lastTick; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonLResponse(response); +``` + +```curl +--- +description: |- + More events than would fit into the response +name: RestReplicationLoggerFollowBufferLimit +--- +var re = require("@arangodb/replication"); +db._drop("products"); + +var lastTick = re.logger.state().state.lastLogTick; + +db._create("products"); +db.products.save({ "_key": "p1", "name" : "flux compensator" }); +db.products.save({ "_key": "p2", "name" : "hybrid hovercraft", "hp" : 5100 }); +db.products.remove("p1"); +db.products.update("p2", { "name" : "broken hovercraft" }); +db.products.drop(); + +require("internal").wait(1); +var url = "/_api/replication/logger-follow?from=" + lastTick + "&chunkSize=400"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Get the first available replication tick value + +```openapi +paths: + /_db/{database-name}/_api/replication/logger-first-tick: + get: + operationId: getReplicationLoggerFirstTick + description: | + Returns the first available tick value that can be served from the server's + replication log. This method can be called by replication clients after to + determine if certain data (identified by a tick value) is still available + for replication. + + The result is a JSON object containing the attribute `firstTick`. This + attribute contains the minimum tick value available in the server's + replication + log. + + {{</* info */>}} + This method is not supported on a Coordinator in a cluster deployment. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + Returning the first available tick +name: RestReplicationLoggerFirstTick +--- +var url = "/_api/replication/logger-first-tick"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Get the tick ranges available in the WAL logfiles + +```openapi +paths: + /_db/{database-name}/_api/replication/logger-tick-ranges: + get: + operationId: getReplicationLoggerTickRanges + description: | + Returns the currently available ranges of tick values for all currently + available WAL logfiles. The tick values can be used to determine if certain + data (identified by tick value) are still available for replication. + + The body of the response contains a JSON array. Each array member is an + object + that describes a single logfile. Each object has the following attributes: + + - `datafile`: name of the logfile + + - `status`: status of the datafile, in textual form (e.g. "sealed", "open") + + - `tickMin`: minimum tick value contained in logfile + + - `tickMax`: maximum tick value contained in logfile + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + is returned if the tick ranges could be determined successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if the logger state could not be determined. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + Returns the available tick ranges. +name: RestReplicationLoggerTickRanges +--- +var url = "/_api/replication/logger-tick-ranges"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/replication/write-ahead-log.md b/site/content/arangodb/oem/develop/http-api/replication/write-ahead-log.md new file mode 100644 index 0000000000..b5ee33a061 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/replication/write-ahead-log.md @@ -0,0 +1,776 @@ +--- +title: HTTP interface for WAL access +menuTitle: Write-Ahead Log +weight: 25 +description: '' +--- +The WAL Access API is used to facilitate faster and +more reliable asynchronous replication. The API offers access to the +write-ahead log or operations log of the ArangoDB server. As a public +API, it is only supported to access these REST endpoints on a single-server +instance. While these APIs are also available on DB-Server instances, accessing them +as a user is not supported. This API replaces some of the APIs in `/_api/replication`. + +## Get the tick ranges available in the WAL + +```openapi +paths: + /_db/{database-name}/_api/wal/range: + get: + operationId: getWalRange + description: | + Returns the currently available ranges of tick values for all Write-Ahead Log + (WAL) files. The tick values can be used to determine if certain + data (identified by tick value) are still available for replication. + + The body of the response contains a JSON object. + - `tickMin`: minimum tick available + - `tickMax`: maximum tick available + - `time`: the server time as string in format `YYYY-MM-DDTHH:MM:SSZ` + - `server`: An object with fields `version` and `serverId` + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. The user account you authenticate with needs + at least read access to this database and administrate access to the + `_system` database. + schema: + type: string + responses: + '200': + description: | + is returned if the tick ranges could be determined successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if the server operations state could not be determined. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + Returns the available tick ranges. +name: RestWalAccessTickRange +--- +var url = "/_api/wal/range"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Get the last available tick value + +```openapi +paths: + /_db/{database-name}/_api/wal/lastTick: + get: + operationId: getWalLastTick + description: | + Returns the last available tick value that can be served from the server's + replication log. This corresponds to the tick of the latest successful operation. + + The result is a JSON object containing the attributes `tick`, `time` and `server`. + - `tick`: contains the last available tick, `time` + - `time`: the server time as string in format `YYYY-MM-DDTHH:MM:SSZ` + - `server`: An object with fields `version` and `serverId` + + {{</* info */>}} + This method is not supported on a Coordinator in a cluster deployment. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. The user account you authenticate with needs + at least read access to this database and administrate access to the + `_system` database. + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + Returning the first available tick +name: RestWalAccessFirstTick +--- +var url = "/_api/wal/lastTick"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Tail recent server operations + +```openapi +paths: + /_db/{database-name}/_api/wal/tail: + get: + operationId: getWalTail + description: | + Returns data from the server's write-ahead log (also named replication log). This method can be called + by replication clients after an initial synchronization of data. The method + returns all "recent" logged operations from the server. Clients + can replay and apply these operations locally so they get to the same data + state as the server. + + Clients can call this method repeatedly to incrementally fetch all changes + from the server. In this case, they should provide the `from` value so + they only get returned the log events since their last fetch. + + When the `from` query parameter is not used, the server returns log + entries starting at the beginning of its replication log. When the `from` + parameter is used, the server only returns log entries which have + higher tick values than the specified `from` value (note: the log entry with a + tick value equal to `from` is excluded). Use the `from` value when + incrementally fetching log data. + + The `to` query parameter can be used to optionally restrict the upper bound of + the result to a certain tick value. If used, the result contains only log events + with tick values up to (including) `to`. In incremental fetching, there is no + need to use the `to` parameter. It only makes sense in special situations, + when only parts of the change log are required. + + The `chunkSize` query parameter can be used to control the size of the result. + It must be specified in bytes. The `chunkSize` value is only honored + approximately. Otherwise, a too low `chunkSize` value could cause the server + to not be able to put just one log entry into the result and return it. + Therefore, the `chunkSize` value is only consulted after a log entry has + been written into the result. If the result size is then greater than + `chunkSize`, the server responds with as many log entries as there are + in the response already. If the result size is still less than `chunkSize`, + the server tries to return more data if there's more data left to return. + + If `chunkSize` is not specified, some server-side default value is used. + + The `Content-Type` of the result is `application/x-arango-dump`. This is an + easy-to-process format, with all log events going onto separate lines in the + response body. Each log event itself is a JSON object, with at least the + following attributes: + + - `tick`: the log event tick value + + - `type`: the log event type + + Individual log events also have additional attributes, depending on the + event type. A few common attributes which are used for multiple events types + are: + + - `cuid`: globally unique id of the View or collection the event was for + + - `db`: the database name the event was for + + - `tid`: id of the transaction the event was contained in + + - `data`: the original document data + + For a more detailed description of the individual replication event types + and their data structures, see the Operation Types. + + The response also contains the following HTTP headers: + + - `x-arango-replication-active`: whether or not the logger is active. Clients + can use this flag as an indication for their polling frequency. If the + logger is not active and there are no more replication events available, it + might be sensible for a client to abort, or to go to sleep for a long time + and try again later to check whether the logger has been activated. + + - `x-arango-replication-lastincluded`: the tick value of the last included + value in the result. In incremental log fetching, this value can be used + as the `from` value for the following request. **Note** that if the result is + empty, the value is `0`. This value should not be used as `from` value + by clients in the next request (otherwise the server would return the log + events from the start of the log again). + + - `x-arango-replication-lastscanned`: the last tick the server scanned while + computing the operation log. This might include operations the server did not + returned to you due to various reasons (i.e. the value was filtered or skipped). + You may use this value in the `lastScanned` header to allow the RocksDB storage engine + to break up requests over multiple responses. + + - `x-arango-replication-lasttick`: the last tick value the server has + logged in its write ahead log (not necessarily included in the result). By comparing the last + tick and last included tick values, clients have an approximate indication of + how many events there are still left to fetch. + + - `x-arango-replication-frompresent`: is set to _true_ if server returned + all tick values starting from the specified tick in the _from_ parameter. + Should this be set to false the server did not have these operations anymore + and the client might have missed operations. + + - `x-arango-replication-checkmore`: whether or not there already exists more + log data which the client could fetch immediately. If there is more log data + available, the client could call the tailing API again with an adjusted `from` + value to fetch remaining log entries until there are no more. + + If there isn't any more log data to fetch, the client might decide to go + to sleep for a while before calling the logger again. + + {{</* info */>}} + This method is not supported on a Coordinator in a cluster deployment. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. The user account you authenticate with needs + at least read access to this database and administrate access to the + `_system` database. + schema: + type: string + - name: global + in: query + required: false + description: | + Whether operations for all databases should be included. If set to `false`, + only the operations for the current database are included. The value `true` is + only valid on the `_system` database. + schema: + type: boolean + default: false + - name: from + in: query + required: false + description: | + Exclusive lower bound tick value for results. On successive calls + to this API you should set this to the value returned + with the `x-arango-replication-lastincluded` header (unless that header + contains 0). + schema: + type: number + - name: to + in: query + required: false + description: | + Inclusive upper bound tick value for results. + schema: + type: number + - name: lastScanned + in: query + required: false + description: | + Should be set to the value of the `x-arango-replication-lastscanned` header + or alternatively `0` on the first try. This allows the RocksDB storage engine to break up + large transactions over multiple responses. + schema: + type: number + - name: chunkSize + in: query + required: false + description: | + Approximate maximum size of the returned result. + schema: + type: number + - name: syncerId + in: query + required: false + description: | + The ID of the client used to tail results. The server uses this to + keep operations until the client has fetched them. Must be a positive integer. + {{</* info */>}} + Either `syncerId` or `serverId` is required to fetch all operations. + {{</* /info */>}} + schema: + type: number + - name: serverId + in: query + required: false + description: | + The ID of the client machine. If `syncerId` is unset, the server uses + this to keep operations until the client has fetched them. Must be a positive + integer. + {{</* info */>}} + Either `syncerId` or `serverId` is required to fetch all operations. + {{</* /info */>}} + schema: + type: number + - name: clientInfo + in: query + required: false + description: | + Short description of the client, used for informative purposes only. + schema: + type: string + responses: + '200': + description: | + is returned if the request was executed successfully, and there are log + events available for the requested range. The response body is not empty + in this case. + '204': + description: | + is returned if the request was executed successfully, but there are no log + events available for the requested range. The response body is empty + in this case. + '400': + description: | + is returned if either the `from` or `to` values are invalid. + '405': + description: | + is returned when an invalid HTTP method is used. + '500': + description: | + is returned if an error occurred while assembling the response. + '501': + description: | + is returned when this operation is called on a Coordinator in a cluster deployment. + tags: + - Replication +``` + +**Examples** + +```curl +--- +description: |- + No log events available +name: RestWalAccessTailingEmpty +--- +var re = require("@arangodb/replication"); +var lastTick = re.logger.state().state.lastLogTick; + +var url = "/_api/wal/tail?from=" + lastTick; +var response = logCurlRequest('GET', url); + +assert(response.code === 204); + +logRawResponse(response); +``` + +```curl +--- +description: |- + A few log events *(One JSON document per line)* +name: RestWalAccessTailingSome +--- +var re = require("@arangodb/replication"); +db._drop("products"); + +var lastTick = re.logger.state().state.lastLogTick; + +db._create("products"); +db.products.save({ "_key": "p1", "name" : "flux compensator" }); +db.products.save({ "_key": "p2", "name" : "hybrid hovercraft", "hp" : 5100 }); +db.products.remove("p1"); +db.products.update("p2", { "name" : "broken hovercraft" }); +db.products.drop(); + +require("internal").wait(1); +var url = "/_api/wal/tail?from=" + lastTick; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonLResponse(response); +``` + +```curl +--- +description: |- + More events than would fit into the response +name: RestWalAccessTailingBufferLimit +--- +var re = require("@arangodb/replication"); +db._drop("products"); + +var lastTick = re.logger.state().state.lastLogTick; + +db._create("products"); +db.products.save({ "_key": "p1", "name" : "flux compensator" }); +db.products.save({ "_key": "p2", "name" : "hybrid hovercraft", "hp" : 5100 }); +db.products.remove("p1"); +db.products.update("p2", { "name" : "broken hovercraft" }); +db.products.drop(); + +require("internal").wait(1); +var url = "/_api/wal/tail?from=" + lastTick + "&chunkSize=400"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Operation Types + +There are several different operation types thar an ArangoDB server might print. +All operations include a `tick` value which identified their place in the operations log. +The numeric fields _tick_ and _tid_ always contain stringified numbers to avoid problems with +drivers where numbers in JSON might be mishandled. + +The following operation types are used in ArangoDB: + +### Create Database (1100) + +Create a database. Contains the field _db_ with the database name and the field _data_, +contains the database definition. + +```json +{ + "tick": "2103", + "type": 1100, + "db": "test", + "data": { + "database": 337, + "id": "337", + "name": "test" + } +} +``` + +### Drop Database (1101) + +Drop a database. Contains the field _db_ with the database name. + +```json +{ + "tick": "3453", + "type": 1101, + "db": "test" +} +``` + +### Create Collection (2000) + +Create a collection. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. The *data* attribute contains the collection definition. + +```json +{ + "tick": "3702", + "db": "_system", + "cuid": "hC0CF79DA83B4/555", + "type": 2000, + "data": { + "allowUserKeys": true, + "cacheEnabled": false, + "cid": "555", + "deleted": false, + "globallyUniqueId": "hC0CF79DA83B4/555", + "id": "555", + "indexes": [], + "isSystem": false, + "keyOptions": { + "allowUserKeys": true, + "lastValue": 0, + "type": "traditional" + }, + "name": "test" + } +} +``` + +### Drop Collection (2001) + +Drop a collection. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. + +```json +{ + "tick": "154", + "type": 2001, + "db": "_system", + "cuid": "hD15F8FE99859/555" +} +``` + +### Rename Collection (2002) + +Rename a collection. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. The _data_ field contains the *name* field +with the new name + +```json +{ + "tick": "385", + "db": "_system", + "cuid": "hD15F8FE99859/135", + "type": 2002, + "data": { + "name": "other" + } +} +``` + +### Change Collection (2003) + +Change collection properties. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. The *data* attribute contains the updated collection definition. + +```json +{ + "tick": "154", + "type": 2003, + "db": "_system", + "cuid": "hD15F8FE99859/555", + "data": { + "waitForSync": true + } +} +``` + +### Truncate Collection (2004) + +Truncate a collection. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. + +```json +{ + "tick": "154", + "type": 2004, + "db": "_system", + "cuid": "hD15F8FE99859/555" +} +``` + +### Create Index (2100) + +Create an index. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. The field _data_ contains the index +definition. + +```json +{ + "tick": "1327", + "type": 2100, + "db": "_system", + "cuid": "hD15F8FE99859/555", + "data": { + "deduplicate": true, + "fields": [ + "value" + ], + "id": "260", + "selectivityEstimate": 1, + "sparse": false, + "type": "persistent", + "unique": false + } +} +``` + +### Drop Index (2101) + +Drop an index. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this collection. The field _data_ contains the field +*id* with the index id. + +```json +{ + "tick": "1522", + "type": 2101, + "db": "_system", + "cuid": "hD15F8FE99859/555", + "data": { + "id": "260" + } +} +``` + +### Create View (2110) + +Create a view. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this view. The field _data_ contains the view definition + +```json +{ + "tick": "1833", + "type": 2110, + "db": "_system", + "cuid": "hD15F8FE99859/322", + "data": { + "cleanupIntervalStep": 10, + "collections": [], + "commitIntervalMsec": 60000, + "consolidate": { + "segmentThreshold": 300, + "threshold": 0.8500000238418579, + "type": "tier" + }, + "deleted": false, + "globallyUniqueId": "hD15F8FE99859/322", + "id": "322", + "isSystem": false, + "locale": "C", + "name": "myview", + "type": "arangosearch" + } +} +``` + +### Drop View (2111) + +Drop a view. Contains the field _db_ with the database name, and _cuid_ with the +globally unique id to identify this view. + +```json +{ + "tick": "3113", + "type": 2111, + "db": "_system", + "cuid": "hD15F8FE99859/322" +} +``` + +### Change View (2112) + +Change view properties (including the name). Contains the field _db_ with the database name and _cuid_ with the +globally unique id to identify this view. The *data* attribute contain the updated properties. + +```json +{ + "tick": "3014", + "type": 2112, + "db": "_system", + "cuid": "hD15F8FE99859/457", + "data": { + "cleanupIntervalStep": 10, + "collections": [ + 135 + ], + "commitIntervalMsec": 60000, + "consolidate": { + "segmentThreshold": 300, + "threshold": 0.8500000238418579, + "type": "tier" + }, + "deleted": false, + "globallyUniqueId": "hD15F8FE99859/457", + "id": "457", + "isSystem": false, + "locale": "C", + "name": "renamedview", + "type": "arangosearch" + } +} +``` + +### Start Transaction (2200) + +Mark the beginning of a transaction. Contains the field _db_ with the database name +and the field _tid_ for the transaction id. This log entry might be followed +by zero or more document operations and then either one commit **or** an abort operation +(i.e. types *2300*, *2302* and *2201* / *2202*) with the same _tid_ value. + +```json +{ + "tick": "3651", + "type": 2200, + "db": "_system", + "tid": "556" +} +``` + +### Commit Transaction (2201) + +Mark the successful end of a transaction. Contains the field _db_ with the database name +and the field _tid_ for the transaction id. + +```json +{ + "tick": "3652", + "type": 2201, + "db": "_system", + "tid": "556" +} +``` + +### Abort Transaction (2202) + +Mark the abortion of a transaction. Contains the field _db_ with the database name +and the field _tid_ for the transaction id. + +```json +{ + "tick": "3654", + "type": 2202, + "db": "_system", + "tid": "556" +} +``` + +### Insert / Replace Document (2300) + +Insert or replace a document. Contains the field _db_ with the database name, +_cuid_ with the globally unique id to identify the collection and the field _tid_ for +the transaction id. The field *tid* might contain the value *"0"* to identify a single +operation that is not part of a multi-document transaction. The field *data* contains the +document. If the field *_rev* exists the client can choose to perform a revision check against +a locally available version of the document to ensure consistency. + +```json +{ + "tick": "196", + "type": 2300, + "db": "_system", + "tid": "0", + "cuid": "hE0E3D7BE511D/119", + "data": { + "_id": "users/194", + "_key": "194", + "_rev": "_XUJFD3C---", + "value": "test" + } +} +``` + +### Remove Document (2302) + +Remove a document. Contains the field _db_ with the database name, +_cuid_ with the globally unique id to identify the collection and the field _tid_ for +the transaction id. The field *tid* might contain the value *"0"* to identify a single +operation that is not part of a multi-document transaction. The field *data* contains the +*_key* and *_rev* of the removed document. The client can choose to perform a revision check against +a locally available version of the document to ensure consistency. + +```json +{ + "cuid": "hE0E3D7BE511D/119", + "data": { + "_key": "194", + "_rev": "_XUJIbS---_" + }, + "db": "_system", + "tick": "397", + "tid": "0", + "type": 2302 +} +``` diff --git a/site/content/arangodb/oem/develop/http-api/security.md b/site/content/arangodb/oem/develop/http-api/security.md new file mode 100644 index 0000000000..628f38312c --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/security.md @@ -0,0 +1,161 @@ +--- +title: HTTP interfaces for security features +menuTitle: Security +weight: 105 +description: >- + The security-related endpoints let you can configure audit logging, + encryption at rest, and encryption in transit +--- +## Audit logging + +You can get and set the log level for the `audit-*` log topics using the regular +endpoints for the log levels. See [Logs](monitoring/logs.md). + +The audit logging feature can otherwise only be configured using startup options. +See [Audit logging](../../operations/security/audit-logging.md#configuration). + +## Encryption in transit + +### Get the TLS data + +```openapi +paths: + /_db/{database-name}/_admin/server/tls: + get: + operationId: getServerTls + description: | + Return a summary of the TLS data. The JSON response will contain a field + `result` with the following components: + + - `keyfile`: Information about the key file. + - `clientCA`: Information about the Certificate Authority (CA) for + client certificate verification. + + If server name indication (SNI) is used and multiple key files are + configured for different server names, then there is an additional + attribute `SNI`, which contains for each configured server name + the corresponding information about the key file for that server name. + + In all cases the value of the attribute will be a JSON object, which + has a subset of the following attributes (whatever is appropriate): + + - `sha256`: The value is a string with the SHA256 of the whole input + file. + - `certificates`: The value is a JSON array with the public + certificates in the chain in the file. + - `privateKeySha256`: In cases where there is a private key (`keyfile` + but not `clientCA`), this field is present and contains a + JSON string with the SHA256 of the private key. + + This API requires authentication. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. If the `--server.harden` startup option is enabled, + administrate access to the `_system` database is required. + schema: + type: string + responses: + '200': + description: | + This API will return HTTP 200 if everything is ok + tags: + - Security +``` + +### Reload the TLS data + +```openapi +paths: + /_admin/server/tls: + # Independent of database (superuser has access to all databases that exist) + post: + operationId: reloadServerTls + description: | + This API call triggers a reload of all the TLS data (server key, client-auth CA) + and then returns a summary. The JSON response is exactly as in the corresponding + GET request. + + This is a protected API and can only be executed with superuser rights. + responses: + '200': + description: | + This API will return HTTP 200 if everything is ok + '403': + description: | + This API will return HTTP 403 Forbidden if it is not called with + superuser rights. + tags: + - Security +``` + +## Encryption at rest + +### Rotate the encryption at rest key + +```openapi +paths: + /_admin/server/encryption: + # Independent of database (superuser has access to all databases that exist) + post: + operationId: rotateEncryptionAtRestKey + description: | + Change the user-supplied encryption at rest key by sending a request without + payload to this endpoint. The file supplied via `--rocksdb.encryption-keyfolder` + will be reloaded and the internal encryption key will be re-encrypted with the + new user key. + + This is a protected API and can only be executed with superuser rights. + This API is not available on Coordinator nodes. + responses: + '200': + description: | + This API will return HTTP 200 if everything is ok + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The result object. + type: object + required: + - encryption-keys + properties: + encryption-keys: + description: | + An array of objects with the SHA-256 hashes of the key secrets. + Can be empty. + type: array + items: + type: object + '403': + description: | + This API will return HTTP 403 FORBIDDEN if it is not called with + superuser rights. + '404': + description: | + This API will return HTTP 404 in case encryption key rotation is disabled. + tags: + - Security +``` diff --git a/site/content/arangodb/oem/develop/http-api/tasks.md b/site/content/arangodb/oem/develop/http-api/tasks.md new file mode 100644 index 0000000000..251b615bee --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/tasks.md @@ -0,0 +1,623 @@ +--- +title: HTTP interface for tasks +menuTitle: Tasks +weight: 85 +description: >- + The HTTP API for tasks lets you manage the periodic or timed execution of + server-side JavaScript code +--- +## List all tasks + +```openapi +paths: + /_db/{database-name}/_api/tasks: + get: + operationId: listTasks + description: | + Fetches all existing tasks on the server. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + responses: + '200': + description: | + The list of tasks. + content: + application/json: + schema: + description: | + A list of all tasks. + type: array + items: + type: object + required: + - name + - id + - created + - type + - period + - offset + - command + - database + properties: + name: + description: | + A user-friendly name for the task. + type: string + id: + description: | + A string identifying the task. + type: string + created: + description: | + The timestamp when this task was created. + type: number + type: + description: | + What type of task is this [ `periodic`, `timed`] + - periodic are tasks that repeat periodically + - timed are tasks that execute once at a specific time + type: string + period: + description: | + This task should run each `period` seconds. + type: number + offset: + description: | + Time offset in seconds from the `created` timestamp. + type: number + command: + description: | + The JavaScript function for this task. + type: string + database: + description: | + The database this task belongs to. + type: string + tags: + - Tasks +``` + +**Examples** + +```curl +--- +description: Fetching all tasks +name: RestTasksListAll +--- +var url = "/_api/tasks"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); + +``` + +## Get a task + +```openapi +paths: + /_db/{database-name}/_api/tasks/{id}: + get: + operationId: getTask + description: | + fetches one existing task on the server specified by `id` + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database. + schema: + type: string + - name: id + in: path + required: true + description: | + The id of the task to fetch. + schema: + type: string + responses: + '200': + description: | + The requested task. + content: + application/json: + schema: + description: | + The function in question. + type: object + required: + - name + - id + - created + - type + - period + - offset + - command + - database + properties: + name: + description: | + A user-friendly name for the task. + type: string + id: + description: | + A string identifying the task. + type: string + created: + description: | + The timestamp when this task was created. + type: number + type: + description: | + What type of task is this [ `periodic`, `timed`] + - periodic are tasks that repeat periodically + - timed are tasks that execute once at a specific time + type: string + period: + description: | + This task should run each `period` seconds. + type: number + offset: + description: | + Time offset in seconds from the `created` timestamp. + type: number + command: + description: | + The JavaScript function for this task. + type: string + database: + description: | + The database this task belongs to. + type: string + tags: + - Tasks +``` + +**Examples** + +```curl +--- +description: Fetching a single task by its id +name: RestTasksListOne +--- +var url = "/_api/tasks"; +var response = logCurlRequest('POST', url, JSON.stringify({ id: "testTask", command: "console.log('Hello from task!');", offset: 10000 })); + +var response = logCurlRequest('GET', url + "/testTask"); + +assert(response.code === 200); +logJsonResponse(response); + +``` + +```curl +--- +description: Trying to fetch a non-existing task +name: RestTasksListNonExisting +--- +var url = "/_api/tasks/non-existing-task"; + +var response = logCurlRequest('GET', url); + +assert(response.code === 404); +logJsonResponse(response); + +``` + +## Create a task + +```openapi +paths: + /_db/{database-name}/_api/tasks: + post: + operationId: createTask + description: | + Creates a new task with a generated identifier. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - command + properties: + name: + description: | + The name of the task. + type: string + default: "user-defined task" + command: + description: | + The JavaScript code to be executed. + type: string + params: + description: | + The value to be passed to the command. + It can be of any type. + period: + description: | + The number of seconds between the executions. + type: integer + offset: + description: | + The number of seconds for the initial delay. + type: integer + default: 0 + responses: + '200': + description: | + The task has been registered. + content: + application/json: + schema: + type: object + required: + - id + - name + - created + - type + - period + - offset + - command + - database + properties: + id: + description: | + A string identifying the task. + type: string + name: + description: | + The name of the task. + type: string + created: + description: | + The timestamp when this task was created. + type: number + type: + description: | + The kind of the task: + - `"periodic"`: The task repeats periodically + - `"timed"`: The task executes once at a specific time + type: string + enum: [periodic, timed] + period: + description: | + The task runs every `period` seconds. + type: number + offset: + description: | + The time offset in seconds from the created timestamp. + type: number + command: + description: | + The JavaScript code of this task. + type: string + database: + description: | + The database this task belongs to. + type: string + '400': + description: | + The task can't be registered because the request is invalid. + tags: + - Tasks +``` + +**Examples** + +```curl +--- +description: '' +name: RestTasksCreate +--- +var url = "/_api/tasks/"; + +// Note: prints stuff if server is running in non-daemon mode. +var sampleTask = { + name: "SampleTask", + command: "(function(params) { require('@arangodb').print(params); })(params)", + params: { "foo": "bar", "bar": "foo"}, + period: 2 +} +var response = logCurlRequest('POST', url, + sampleTask); + +assert(response.code === 200); + +logJsonResponse(response); + +// Cleanup: +curlRequest('DELETE', url + response.parsedBody.id); +``` + +## Create a task with ID + +```openapi +paths: + /_db/{database-name}/_api/tasks/{id}: + put: + operationId: createTaskWithId + description: | + Registers a new task with the specified ID. + + Not compatible with load balancers. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: id + in: path + required: true + description: | + The id of the task to create + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - command + properties: + name: + description: | + The name of the task. + type: string + command: + description: | + The JavaScript code to be executed. + type: string + params: + description: | + The value to be passed to the command. + It can be of any type. + period: + description: | + The number of seconds between the executions. + type: integer + offset: + description: | + The number of seconds for the initial delay. + type: integer + default: 0 + responses: + '200': + description: | + The task has been registered. + content: + application/json: + schema: + type: object + required: + - id + - name + - created + - type + - period + - offset + - command + - database + properties: + id: + description: | + The user-provided string identifying the task. + type: string + name: + description: | + The name of the task. + type: string + created: + description: | + The timestamp when this task was created. + type: number + type: + description: | + The kind of the task: + - `"periodic"`: The task repeats periodically + - `"timed"`: The task executes once at a specific time + type: string + enum: [periodic, timed] + period: + description: | + The task runs every `period` seconds. + type: number + offset: + description: | + The time offset in seconds from the created timestamp. + type: number + command: + description: | + The JavaScript code of this task. + type: string + database: + description: | + The database this task belongs to. + type: string + '400': + description: | + The task can't be registered because the request is invalid. + '409': + description: | + A task with the specified `id` already exists. + tags: + - Tasks +``` + +**Examples** + +```curl +--- +description: '' +name: RestTasksPutWithId +--- +var url = "/_api/tasks/"; + +// Note: prints stuff if server is running in non-daemon mode. +var sampleTask = { + id: "SampleTask", + name: "SampleTask", + command: "(function(params) { require('@arangodb').print(params); })(params)", + params: { "foo": "bar", "bar": "foo"}, + period: 2 +} +var response = logCurlRequest('PUT', url + 'sampleTask', + sampleTask); +assert(response.code === 200); + +logJsonResponse(response); + +// Cleanup: +curlRequest('DELETE', url + 'sampleTask'); +``` + +## Delete a task + +```openapi +paths: + /_db/{database-name}/_api/tasks/{id}: + delete: + operationId: deleteTask + description: | + Deletes the task identified by `id` on the server. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has administrate access + to this database. + schema: + type: string + - name: id + in: path + required: true + description: | + The id of the task to delete. + schema: + type: string + responses: + '200': + description: | + If the task was deleted, *HTTP 200* is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + properties: + code: + description: | + The HTTP response status code. + type: integer + example: 200 + error: + description: | + `false` in this case + type: boolean + '404': + description: | + If the task `id` is unknown, then an *HTTP 404* is returned. + content: + application/json: + schema: + type: object + required: + - code + - error + - errorMessage + properties: + code: + description: | + The HTTP response status code. + type: integer + example: 404 + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Tasks +``` + +**Examples** + +```curl +--- +description: |- + Try to delete a non-existent task: +name: RestTasksDeleteFail +--- +var url = "/_api/tasks/NoTaskWithThatName"; + +var response = logCurlRequest('DELETE', url); + +assert(response.code === 404); + +logJsonResponse(response); +``` + +```curl +--- +description: |- + Remove existing task: +name: RestTasksDelete +--- +var url = "/_api/tasks/"; + +var sampleTask = { + id: "SampleTask", + name: "SampleTask", + command: "2+2;", + period: 2 +} +// Ensure it's really not there: +curlRequest('DELETE', url + sampleTask.id, null, null, [404,200]); +// put in something we may delete: +curlRequest('PUT', url + sampleTask.id, + sampleTask); + +var response = logCurlRequest('DELETE', url + sampleTask.id); + +assert(response.code === 200); +logJsonResponse(response); + +``` diff --git a/site/content/arangodb/oem/develop/http-api/transactions/_index.md b/site/content/arangodb/oem/develop/http-api/transactions/_index.md new file mode 100644 index 0000000000..00938fdb4d --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/transactions/_index.md @@ -0,0 +1,17 @@ +--- +title: HTTP interfaces for transactions +menuTitle: Transactions +weight: 50 +description: >- + The HTTP APIs for transactions support Stream Transactions and + JavaScript Transactions +--- +Transactions are executed on the server-side. +Clients can run different types of transactions that involve different interfaces: + +- Via the [Stream Transaction](stream-transactions.md) API +- Via the [JavaScript Transaction](javascript-transactions.md) API + +For a more detailed description of the transaction types, how transactions work +in ArangoDB, and what guarantees ArangoDB provide, please refer to +[Transactions](../../transactions/_index.md). diff --git a/site/content/arangodb/oem/develop/http-api/transactions/javascript-transactions.md b/site/content/arangodb/oem/develop/http-api/transactions/javascript-transactions.md new file mode 100644 index 0000000000..d0eefd8896 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/transactions/javascript-transactions.md @@ -0,0 +1,310 @@ +--- +title: HTTP interface for JavaScript Transactions +menuTitle: JavaScript Transactions +weight: 10 +description: >- + The HTTP API for JavaScript Transactions lets you run a transaction that + leverages ArangoDB's JavaScript API by submitting a single HTTP request +--- +JavaScript Transactions are executed on the server. Transactions can be +initiated by clients by sending the transaction description for execution to +the server. + +JavaScript Transactions in ArangoDB do not offer separate *BEGIN*, *COMMIT* and *ROLLBACK* +operations. Instead, JavaScript Transactions are described by a JavaScript function, +and the code inside the JavaScript function is then be executed transactionally. + +At the end of the function, the transaction is automatically committed, and all +changes done by the transaction are persisted. If an exception is thrown +during transaction execution, all operations performed in the transaction are +rolled back. + +For a more detailed description of how transactions work in ArangoDB please +refer to [Transactions](../../transactions/_index.md). + +## Execute a JavaScript Transaction + +```openapi +paths: + /_db/{database-name}/_api/transaction: + post: + operationId: executeJavaScriptTransaction + description: | + The transaction description must be passed in the body of the POST request. + + If the transaction is fully executed and committed on the server, + *HTTP 200* will be returned. Additionally, the return value of the + code defined in `action` will be returned in the `result` attribute. + + For successfully committed transactions, the returned JSON object has the + following properties: + + - `error`: boolean flag to indicate if an error occurred (`false` + in this case) + + - `code`: the HTTP status code + + - `result`: the return value of the transaction + + If the transaction specification is either missing or malformed, the server + will respond with *HTTP 400*. + + The body of the response will then contain a JSON object with additional error + details. The object has the following attributes: + + - `error`: boolean flag to indicate that an error occurred (`true` in this case) + + - `code`: the HTTP status code + + - `errorNum`: the server error number + + - `errorMessage`: a descriptive error message + + If a transaction fails to commit, either by an exception thrown in the + `action` code, or by an internal error, the server will respond with + an error. + Any other errors will be returned with any of the return codes + *HTTP 400*, *HTTP 409*, or *HTTP 500*. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - collections + - action + properties: + collections: + description: | + Must be a JSON object that can have one or all sub-attributes + `read`, `write` or `exclusive`, each being an array of collection names or a + single collection name as string. Collections that will be written to in the + transaction must be declared with the `write` or `exclusive` attribute or it + will fail, whereas non-declared collections from which is solely read will be + added lazily. The optional sub-attribute `allowImplicit` can be set to `false` + to let transactions fail in case of undeclared collections for reading. + Collections for reading should be fully declared if possible, to avoid + deadlocks. + type: object + properties: + read: + description: | + A single collection or a list of collections to use in + the transaction in read-only mode. + # type: [string, array] + # items: + # type: string + write: + description: | + A single collection or a list of collections to use in + the transaction in write or read mode. + # type: [string, array] + # items: + # type: string + exclusive: + description: | + A single collection or a list of collections to acquire + exclusive write access for. + # type: [string, array] + # items: + # type: string + action: + description: | + The actual transaction operations to be executed, in the + form of stringified JavaScript code. The code is executed on the server + side, with late binding. It is thus critical that the code specified in + `action` properly sets up all the variables it needs. + If the code specified in `action` ends with a return statement, the + value returned is also returned by the REST API in the `result` + attribute if the transaction committed successfully. + type: string + waitForSync: + description: | + An optional boolean flag that, if set, forces the + transaction to write all data to disk before returning. + type: boolean + allowImplicit: + description: | + Allow reading from undeclared collections. + type: boolean + default: true + lockTimeout: + description: | + The timeout in seconds for waiting on collection locks. + This option is only meaningful when using exclusive locks. + Set `lockTimeout` to `0` to make ArangoDB not time out + waiting for a lock. + type: integer + default: 900 + params: + description: | + Optional argument passed to `action`. Can be of any type. + responses: + '200': + description: | + If the transaction is fully executed and committed on the server, + *HTTP 200* will be returned. + '400': + description: | + If the transaction specification is either missing or malformed, the server + will respond with *HTTP 400*. + '404': + description: | + If the transaction specification contains an unknown collection, the server + will respond with *HTTP 404*. + '500': + description: | + Exceptions thrown by users will make the server respond with a return code of + *HTTP 500* + tags: + - Transactions +``` + +**Examples** + +```curl +--- +description: |- + Executing a transaction on a single collection +name: RestTransactionSingle +--- +var cn = "products"; +db._drop(cn); +var products = db._create(cn); +var url = "/_api/transaction"; +var body = { + collections: { + write : "products" + }, + action: "function () { var db = require('@arangodb').db; db.products.save({}); return db.products.count(); }" +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Executing a transaction using multiple collections +name: RestTransactionMulti +--- +var cn1 = "materials"; +db._drop(cn1); +var materials = db._create(cn1); +var cn2 = "products"; +db._drop(cn2); +var products = db._create(cn2); +products.save({ "a": 1}); +materials.save({ "b": 1}); +var url = "/_api/transaction"; +var body = { + collections: { + write : [ "products", "materials" ] + }, + action: ( + "function () {" + + "var db = require('@arangodb').db;" + + "db.products.save({});" + + "db.materials.save({});" + + "return 'worked!';" + + "}" + ) +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 200); + +logJsonResponse(response); +db._drop(cn1); +db._drop(cn2); +``` + +```curl +--- +description: |- + Aborting a transaction due to an internal error +name: RestTransactionAbortInternal +--- +var cn = "products"; +db._drop(cn); +var products = db._create(cn); +var url = "/_api/transaction"; +var body = { + collections: { + write : "products" + }, + action : ( + "function () {" + + "var db = require('@arangodb').db;" + + "db.products.save({ _key: 'abc'});" + + "db.products.save({ _key: 'abc'});" + + "}" + ) +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 409); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Aborting a transaction by explicitly throwing an exception +name: RestTransactionAbort +--- +var cn = "products"; +db._drop(cn); +var products = db._create(cn, { waitForSync: true }); +products.save({ "a": 1 }); +var url = "/_api/transaction"; +var body = { + collections: { + read : "products" + }, + action : "function () { throw 'doh!'; }" +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 500); + +logJsonResponse(response); +db._drop(cn); +``` + +```curl +--- +description: |- + Referring to a non-existing collection +name: RestTransactionNonExisting +--- +var cn = "products"; +db._drop(cn); +var url = "/_api/transaction"; +var body = { + collections: { + read : "products" + }, + action : "function () { return true; }" +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 404); + +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/transactions/stream-transactions.md b/site/content/arangodb/oem/develop/http-api/transactions/stream-transactions.md new file mode 100644 index 0000000000..a3e33af7e5 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/transactions/stream-transactions.md @@ -0,0 +1,557 @@ +--- +title: HTTP interface for Stream Transactions +menuTitle: Stream Transactions +weight: 5 +description: >- + Stream Transactions allow you to perform a multi-document transaction with + individual begin and commit/abort commands +--- +For an introduction to this transaction type, see +[Stream Transactions](../../transactions/stream-transactions.md). + +To use a Stream Transaction, a client first sends the [configuration](#begin-a-stream-transaction) +of the transaction to the ArangoDB server. + +{{< info >}} +Contrary to [JavaScript Transactions](javascript-transactions.md), +the definition of Stream Transaction must only contain the collections that are +going to be used and (optionally) the various transaction options supported by +ArangoDB. No `action` attribute is supported. +{{< /info >}} + +The Stream Transaction API works in *conjunction* with other APIs in ArangoDB. +To use the transaction for a supported operation a client needs to specify +the transaction identifier in the `x-arango-trx-id` HTTP header on each request. +This automatically causes these operations to use the specified transaction. + +Supported transactional API operations include: + +- All operations in the [Document API](../documents.md) +- Get the number of documents via the [Collection API](../collections.md#get-the-document-count-of-a-collection) +- Truncate a collection via the [Collection API](../collections.md#truncate-a-collection) +- Create an AQL cursor via the [Cursor API](../queries/aql-queries.md#create-a-cursor) +- Handle [vertices](../graphs/named-graphs.md#vertices) and [edges](../graphs/named-graphs.md#edges) + of managed graphs (_General Graph_ / _Gharial_ API) + +## Begin a Stream Transaction + +```openapi +paths: + /_db/{database-name}/_api/transaction/begin: + post: + operationId: beginStreamTransaction + description: | + Begin a Stream Transaction that allows clients to call selected APIs over a + short period of time, referencing the transaction ID, and have the server + execute the operations transactionally. + + Committing or aborting a running transaction must be done by the client. + It is bad practice to not commit or abort a transaction once you are done + using it. It forces the server to keep resources and collection locks + until the entire transaction times out. + + The transaction description must be passed in the body of the POST request. + If the transaction can be started on the server, *HTTP 201* is returned. + + For successfully started transactions, the returned JSON object has the + following properties: + + - `error`: boolean flag to indicate if an error occurred (`false` + in this case) + + - `code`: the HTTP status code + + - `result`: result containing + - `id`: the identifier of the transaction + - `status`: containing the string 'running' + + If the transaction specification is either missing or malformed, the server + responds with *HTTP 400* or *HTTP 404*. + + The body of the response then contains a JSON object with additional error + details. The object has the following attributes: + + - `error`: boolean flag to indicate that an error occurred (`true` in this case) + + - `code`: the HTTP status code + + - `errorNum`: the server error number + + - `errorMessage`: a descriptive error message + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: x-arango-allow-dirty-read + in: header + required: false + description: | + Set this header to `true` to allow the Coordinator to ask any shard replica for + the data, not only the shard leader. This may result in "dirty reads". + + This header decides about dirty reads for the entire transaction. Individual + read operations, that are performed as part of the transaction, cannot override it. + schema: + type: boolean + requestBody: + content: + application/json: + schema: + type: object + required: + - collections + properties: + collections: + description: | + Must be a JSON object that can have one or all sub-attributes + `read`, `write` or `exclusive`, each being an array of collection names or a + single collection name as string. Collections that will be written to in the + transaction must be declared with the `write` or `exclusive` attribute or it + will fail, whereas non-declared collections from which is solely read will be + added lazily. + type: object + properties: + read: + description: | + A single collection or a list of collections to use in + the transaction in read-only mode. + # type: [string, array] + # items: + # type: string + write: + description: | + A single collection or a list of collections to use in + the transaction in write or read mode. + # type: [string, array] + # items: + # type: string + exclusive: + description: | + A single collection or a list of collections to acquire + exclusive write access for. + # type: [string, array] + # items: + # type: string + waitForSync: + description: | + An optional boolean flag that, if set, forces the + transaction to write all data to disk before returning. + type: boolean + allowImplicit: + description: | + Allow reading from undeclared collections. + type: boolean + default: true + lockTimeout: + description: | + The timeout in seconds for waiting on collection locks. + This option is only meaningful when using exclusive locks. + Set `lockTimeout` to `0` to make ArangoDB not time out + waiting for a lock. + type: integer + default: 900 + responses: + '201': + description: | + If the transaction is running on the server, + *HTTP 201* will be returned. + '400': + description: | + If the transaction specification is either missing or malformed, the server + will respond with *HTTP 400*. + '404': + description: | + If the transaction specification contains an unknown collection, the server + will respond with *HTTP 404*. + tags: + - Transactions +``` + +**Examples** + +```curl +--- +description: |- + Executing a transaction on a single collection +name: RestTransactionBeginSingle +--- +const cn = "products"; +db._drop(cn); +db._create(cn); +let url = "/_api/transaction/begin"; +let body = { + collections: { + write : cn + }, +}; + +let response = logCurlRequest('POST', url, body); +assert(response.code === 201); +logJsonResponse(response); + +url = "/_api/transaction/" + response.parsedBody.result.id; +db._connection.DELETE(url); +db._drop(cn); +``` + +```curl +--- +description: |- + Referring to a non-existing collection +name: RestTransactionBeginNonExisting +--- +const cn = "products"; +db._drop(cn); +let url = "/_api/transaction/begin"; +let body = { + collections: { + read : "products" + } +}; + +var response = logCurlRequest('POST', url, body); +assert(response.code === 404); + +logJsonResponse(response); +``` + +## Get the status of a Stream Transaction + +```openapi +paths: + /_db/{database-name}/_api/transaction/{transaction-id}: + get: + operationId: getStreamTransaction + description: | + The result is an object describing the status of the transaction. + It has at least the following attributes: + + - `id`: the identifier of the transaction + + - `status`: the status of the transaction. One of "running", "committed" or "aborted". + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: transaction-id + in: path + required: true + description: | + The transaction identifier. + schema: + type: string + responses: + '200': + description: | + If the transaction is fully executed and committed on the server, + *HTTP 200* will be returned. + '400': + description: | + If the transaction identifier specified is either missing or malformed, the server + will respond with *HTTP 400*. + '404': + description: | + If the transaction was not found with the specified identifier, the server + will respond with *HTTP 404*. + tags: + - Transactions +``` + +**Examples** + +```curl +--- +description: |- + Get transaction status +name: RestTransactionGet +--- +db._drop("products"); +db._create("products"); +let body = { + collections: { + read : "products" + } +}; +let trx = db._createTransaction(body); +let url = "/_api/transaction/" + trx.id(); + +let response = logCurlRequest('GET', url); +assert(response.code === 200); + +logJsonResponse(response); + +trx.abort(); +db._drop("products"); +``` + +## Commit a Stream Transaction + +```openapi +paths: + /_db/{database-name}/_api/transaction/{transaction-id}: + put: + operationId: commitStreamTransaction + description: | + Commit a running server-side transaction. Committing is an idempotent operation. + It is not an error to commit a transaction more than once. + + If the transaction can be committed, *HTTP 200* is returned. + The returned JSON object has the following properties: + + - `error`: boolean flag to indicate if an error occurred (`false` + in this case) + + - `code`: the HTTP status code + + - `result`: result containing + - `id`: the identifier of the transaction + - `status`: containing the string 'committed' + + If the transaction cannot be found, committing is not allowed or the + transaction was aborted, the server + responds with *HTTP 400*, *HTTP 404* or *HTTP 409*. + + The body of the response then contains a JSON object with additional error + details. The object has the following attributes: + + - `error`: boolean flag to indicate that an error occurred (`true` in this case) + + - `code`: the HTTP status code + + - `errorNum`: the server error number + + - `errorMessage`: a descriptive error message + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: transaction-id + in: path + required: true + description: | + The transaction identifier, + schema: + type: string + responses: + '200': + description: | + If the transaction was committed, + *HTTP 200* will be returned. + '400': + description: | + If the transaction cannot be committed, the server + will respond with *HTTP 400*. + '404': + description: | + If the transaction was not found, the server + will respond with *HTTP 404*. + '409': + description: | + If the transaction was already aborted, the server + will respond with *HTTP 409*. + tags: + - Transactions +``` + +**Examples** + +```curl +--- +description: |- + Committing a transaction: +name: RestTransactionBeginAbort +--- +const cn = "products"; +db._drop(cn); +db._create(cn); +let body = { + collections: { + read : cn + } +}; +let trx = db._createTransaction(body); +let url = "/_api/transaction/" + trx.id(); + +var response = logCurlRequest('PUT', url, ""); +assert(response.code === 200); + +logJsonResponse(response); + +db._drop(cn); +``` + +## Abort a Stream Transaction + +```openapi +paths: + /_db/{database-name}/_api/transaction/{transaction-id}: + delete: + operationId: abortStreamTransaction + description: | + Abort a running server-side transaction. Aborting is an idempotent operation. + It is not an error to abort a transaction more than once. + + If the transaction can be aborted, *HTTP 200* is returned. + The returned JSON object has the following properties: + + - `error`: boolean flag to indicate if an error occurred (`false` + in this case) + + - `code`: the HTTP status code + + - `result`: result containing + - `id`: the identifier of the transaction + - `status`: containing the string 'aborted' + + If the transaction cannot be found, aborting is not allowed or the + transaction was already committed, the server + responds with *HTTP 400*, *HTTP 404* or *HTTP 409*. + + The body of the response then contains a JSON object with additional error + details. The object has the following attributes: + + - `error`: boolean flag to indicate that an error occurred (`true` in this case) + + - `code`: the HTTP status code + + - `errorNum`: the server error number + + - `errorMessage`: a descriptive error message + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: transaction-id + in: path + required: true + description: | + The transaction identifier, + schema: + type: string + responses: + '200': + description: | + If the transaction was aborted, + *HTTP 200* will be returned. + '400': + description: | + If the transaction cannot be aborted, the server + will respond with *HTTP 400*. + '404': + description: | + If the transaction was not found, the server + will respond with *HTTP 404*. + '409': + description: | + If the transaction was already committed, the server + will respond with *HTTP 409*. + tags: + - Transactions +``` + +**Examples** + +```curl +--- +description: |- + Aborting a transaction: +name: RestTransactionBeginCommit +--- +const cn = "products"; +db._drop(cn); +db._create(cn); +let body = { + collections: { + read : cn + } +}; +let trx = db._createTransaction(body); +let url = "/_api/transaction/" + trx.id(); + +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); + +logJsonResponse(response); + +db._drop(cn); +``` + +## List the running Stream Transactions + +```openapi +paths: + /_db/{database-name}/_api/transaction: + get: + operationId: listStreamTransactions + description: | + The result is an object with the `transactions` attribute, which contains + an array of transactions. + In a cluster, the array contains the transactions from all Coordinators. + + Each array entry contains an object with the following attributes: + + - `id`: the transaction's id + - `state`: the transaction's status + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + If the list of transactions can be retrieved successfully, *HTTP 200* will be returned. + tags: + - Transactions +``` + +**Examples** + +```curl +--- +description: |- + Get currently running transactions +name: RestTransactionsGet +--- +db._drop("products"); +db._create("products"); +let body = { + collections: { + read : "products" + } +}; +let trx = db._createTransaction(body); +let url = "/_api/transaction"; + +let response = logCurlRequest('GET', url); +assert(response.code === 200); + +logJsonResponse(response); + +trx.abort(); +db._drop("products"); +``` diff --git a/site/content/arangodb/oem/develop/http-api/users.md b/site/content/arangodb/oem/develop/http-api/users.md new file mode 100644 index 0000000000..9262a536a5 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/users.md @@ -0,0 +1,1106 @@ +--- +title: HTTP interface for user management +menuTitle: Users +weight: 15 +description: >- + The HTTP API for user management lets you create, modify, delete, and list + ArangoDB user accounts, as well as grant and revoke permissions for databases + and collections +# GET|PUT|DELETE /_api/user/{user}/config and GET /_api/user/{user}/config/{key} +# endpoints not documented on purpose because they are only used by the web interface +--- +The interface provides the means to manage database system users. All +users managed through this interface are stored in the protected `_users` +system collection. + +You should never manipulate the `_users` collection directly. The specialized +endpoints intentionally have limited functionality compared to the regular +Document API. + +See [Managing Users](../../operations/administration/user-management/_index.md) +for details and note that using wildcard database and collection access levels +is discouraged. + +{{< info >}} +User management operations are not included in ArangoDB's replication. +{{< /info >}} + +## Manage users + +### Create a user + +```openapi +paths: + /_db/{database-name}/_api/user: + post: + operationId: createUser + description: | + Create a new user. You need server access level *Administrate* in order to + execute this REST call. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - user + properties: + user: + description: | + The name of the user as a string. This is mandatory. + type: string + passwd: + description: | + The user password as a string. If not specified, it defaults to an empty + string. + type: string + default: "" + active: + description: | + Whether the user account should be able to log in to the database system. + type: boolean + default: true + extra: + description: | + A JSON object with extra user information. It is used by the web interface + to store graph viewer settings and saved queries. Should not be set or + modified by end users, as custom attributes will not be preserved. + type: object + responses: + '201': + description: | + Returned if the user can be added by the server + '400': + description: | + If the JSON representation is malformed or mandatory data is missing + from the request. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + '409': + description: | + Returned if a user with the same name already exists. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestCreateUser +--- +try { require("@arangodb/users").remove("admin@example"); } catch (err) {} +var url = "/_api/user"; +var data = { user: "admin@example", passwd: "secure" }; +var response = logCurlRequest('POST', url, data); + +assert(response.code === 201); + +logJsonResponse(response); +require("@arangodb/users").remove("admin@example"); +``` + +### Replace a user + +```openapi +paths: + /_db/{database-name}/_api/user/{user}: + put: + operationId: replaceUserData + description: | + Replaces the data of an existing user. This resets the user's + access levels for databases and collections. You need server access level + *Administrate* in order to execute this REST call. Additionally, users can + change their own data. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + passwd: + description: | + The user password as a string. If not specified, it defaults to an empty + string. + type: string + default: "" + active: + description: | + Whether the user account should be able to log in to the database system. + type: boolean + default: true + extra: + description: | + A JSON object with extra user information. It is used by the web interface + to store graph viewer settings and saved queries. Should not be set or + modified by end users, as custom attributes will not be preserved. + type: object + responses: + '200': + description: | + Is returned if the user data can be replaced by the server. + '400': + description: | + The JSON representation is malformed or mandatory data is missing from the request + '401': + description: | + Returned if you have *No access* database access level to the *_system* + database. + '403': + description: | + Returned if you have *No access* server access level. + '404': + description: | + The specified user does not exist + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestReplaceUser +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser; +var data = { passwd: "secure" }; +var response = logCurlRequest('PUT', url, data); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Update a user + +```openapi +paths: + /_db/{database-name}/_api/user/{user}: + patch: + operationId: updateUserData + description: | + Partially modifies the data of an existing user. You need server access level + *Administrate* in order to execute this REST call. Additionally, users can + change their own data. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + passwd: + description: | + The user password as a string. + type: string + active: + description: | + Whether the user account should be able to log in to the database system. + type: boolean + extra: + description: | + A JSON object with extra user information. It is used by the web interface + to store graph viewer settings and saved queries. Should not be set or + modified by end users, as custom attributes will not be preserved. + type: object + responses: + '200': + description: | + Is returned if the user data can be replaced by the server. + '400': + description: | + The JSON representation is malformed or mandatory data is missing from the request. + '401': + description: | + Returned if you have *No access* database access level to the *_system* + database. + '403': + description: | + Returned if you have *No access* server access level. + '404': + description: | + The specified user does not exist + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestUpdateUser +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser; +var data = { passwd: "secure" }; +var response = logCurlRequest('PATCH', url, data); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Remove a user + +```openapi +paths: + /_db/{database-name}/_api/user/{user}: + delete: + operationId: deleteUser + description: | + Removes an existing user, identified by `user`. + + You need *Administrate* permissions for the server access level in order to + execute this REST call. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user + schema: + type: string + responses: + '202': + description: | + Is returned if the user was removed by the server + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + '404': + description: | + The specified user does not exist + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestDeleteUser +--- +var users = require("@arangodb/users"); +var theUser = "userToDelete@myapp"; +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser; +var response = logCurlRequest('DELETE', url, {}); + +assert(response.code === 202); + +logJsonResponse(response); +``` + +### Get a user + +```openapi +paths: + /_db/{database-name}/_api/user/{user}: + get: + operationId: getUser + description: | + Fetches data about the specified user. You can fetch information about + yourself or you need the *Administrate* server access level in order to + execute this REST call. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user + schema: + type: string + responses: + '200': + description: | + The user was found. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + '404': + description: | + The user with the specified name does not exist. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestFetchUser +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +### List available users + +```openapi +paths: + /_db/{database-name}/_api/user: + get: + operationId: listUsers + description: | + Fetches data about all users. You need the *Administrate* server access level + in order to execute this REST call. Otherwise, you will only get information + about yourself. + + The call will return a JSON object with at least the following + attributes on success: + + - `user`: The name of the user as a string. + - `active`: Whether the user account is able to log in to the database system. + - `extra`: A JSON object with extra user information. It is used by the web + interface to store graph viewer settings and saved queries. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + responses: + '200': + description: | + The users that were found. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestFetchAllUser +--- +var url = "/_api/user"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +``` + +## Manage permissions + +### Set a user's database access level + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database/{dbname}: + put: + operationId: setUserDatabasePermissions + description: | + Sets the database access levels for the database `dbname` of user `user`. You + need the *Administrate* server access level in order to execute this REST + call. + requestBody: + content: + application/json: + schema: + type: object + required: + - grant + properties: + grant: + description: | + - `"rw"`: Set the database access level to *Administrate*. + - `"ro"`: Set the database access level to *Access*. + - `"none"`: Set the database access level to *No access*. + type: string + enum: [rw, ro, none] + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user. + schema: + type: string + - name: dbname + in: path + required: true + description: | + The name of the database to set the access level for. + schema: + type: string + responses: + '200': + description: | + Returned if the access level was changed successfully. + '400': + description: | + If the JSON representation is malformed or mandatory data is missing + from the request. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestGrantDatabase +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser + "/database/_system"; +var data = { grant: "rw" }; +var response = logCurlRequest('PUT', url, data); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Set a user's collection access level + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database/{dbname}/{collection}: + put: + operationId: setUserCollectionPermissions + description: | + Sets the collection access level for the `collection` in the database `dbname` + for user `user`. You need the *Administrate* server access level in order to + execute this REST call. + requestBody: + content: + application/json: + schema: + type: object + required: + - grant + properties: + grant: + description: | + - `"rw"`: Set the collection access level to *Read/Write*. + - `"ro"`: Set the collection access level to *Read Only*. + - `"none"`: Set the collection access level to *No access*. + type: string + enum: [rw, ro, none] + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user. + schema: + type: string + - name: dbname + in: path + required: true + description: | + The name of the database to set the access level for. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the collection to set the access level for. + schema: + type: string + responses: + '200': + description: | + Returned if the access permissions were changed successfully. + '400': + description: | + If the JSON representation is malformed or mandatory data is missing + from the request. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestGrantCollection +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +try { users.remove(theUser); } catch (err) {} +try { db_drop("reports"); } catch (err) {} +db._create("reports"); +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser + "/database/_system/reports"; +var data = { grant: "rw" }; +var response = logCurlRequest('PUT', url, data); + +assert(response.code === 200); +db._drop("reports"); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Clear a user's database access level + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database/{dbname}: + delete: + operationId: deleteUserDatabasePermissions + description: | + Clears the database access level for the database `dbname` of user `user`. As + consequence, the default database access level is used. If there is no defined + default database access level, it defaults to *No access*. + + You need write permissions (*Administrate* access level) for the `_system` + database in order to execute this REST call. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user. + schema: + type: string + - name: dbname + in: path + required: true + description: | + The name of the database to clear the access level for. + schema: + type: string + responses: + '202': + description: | + Returned if the access permissions were changed successfully. + '400': + description: | + If the JSON representation is malformed or mandatory data is missing + from the request. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestRevokeDatabase +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +try { users.remove(theUser); } catch (err) {} +users.save(theUser, "secret") + +var url = "/_api/user/" + theUser + "/database/_system"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Clear a user's collection access level + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database/{dbname}/{collection}: + delete: + operationId: deleteUserCollectionPermissions + description: | + Clears the collection access level for the collection `collection` in the + database `dbname` of user `user`. As consequence, the default collection + access level is used. If there is no defined default collection access level, + it defaults to *No access*. + + You need write permissions (*Administrate* access level) for the `_system` + database in order to execute this REST call. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user. + schema: + type: string + - name: dbname + in: path + required: true + description: | + The name of the database to clear the access level for. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the collection to clear the access level for. + schema: + type: string + responses: + '202': + description: | + Returned if the access permissions were changed successfully. + '400': + description: | + If there was an error + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestRevokeCollection +--- +var users = require("@arangodb/users"); +var theUser = "admin@myapp"; +try { users.remove(theUser); } catch (err) {} +try { db_drop("reports"); } catch (err) {} +db._create("reports"); +users.save(theUser, "secret") +users.grantCollection(theUser, "_system", "reports", "rw"); + +var url = "/_api/user/" + theUser + "/database/_system/reports"; +var response = logCurlRequest('DELETE', url); + +assert(response.code === 202); +db._drop("reports"); + +logJsonResponse(response); +users.remove(theUser); +``` + +### List a user's accessible databases + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database: + get: + operationId: listUserDatabases + description: | + Fetch the list of databases available to the specified `user`. + + You need *Administrate* permissions for the server access level in order to + execute this REST call. + + The call will return a JSON object with the per-database access + privileges for the specified user. The `result` object will contain + the databases names as object keys, and the associated privileges + for the database as values. + + In case you specified `full`, the result will contain the permissions + for the databases as well as the permissions for the collections. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user for which you want to query the databases. + schema: + type: string + - name: full + in: query + required: false + description: | + Return the full set of access levels for all databases and all collections. + schema: + type: boolean + default: false + responses: + '200': + description: | + Returned if the list of available databases can be returned. + '400': + description: | + If the access privileges are not right etc. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestFetchUserDatabaseList +--- +var users = require("@arangodb/users"); +var theUser="anotherAdmin@secapp"; +users.save(theUser, "secret"); +users.grantDatabase(theUser, "_system", "rw"); + +var url = "/_api/user/" + theUser + "/database/"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +```curl +--- +description: |- + With the full response format: +name: RestFetchUserDatabaseListFull +--- +var users = require("@arangodb/users"); +var theUser="anotherAdmin@secapp"; +users.save(theUser, "secret"); +users.grantDatabase(theUser, "_system", "rw"); + +var url = "/_api/user/" + theUser + "/database?full=true"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Get a user's database access level + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database/{dbname}: + get: + operationId: getUserDatabasePermissions + description: | + Fetch the database access level for a specific database + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user for which you want to query the databases. + schema: + type: string + - name: dbname + in: path + required: true + description: | + The name of the database to query the access level of. + schema: + type: string + responses: + '200': + description: | + Returned if the access level can be returned + '400': + description: | + If the access privileges are not right etc. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestFetchUserDatabasePermission +--- +var users = require("@arangodb/users"); +var theUser="anotherAdmin@secapp"; +users.save(theUser, "secret"); +users.grantDatabase(theUser, "_system", "rw"); + +var url = "/_api/user/" + theUser + "/database/_system"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` + +### Get a user's collection access level + +```openapi +paths: + /_db/{database-name}/_api/user/{user}/database/{dbname}/{collection}: + get: + operationId: getUserCollectionPermissions + description: | + Returns the collection access level for a specific collection + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + schema: + type: string + - name: user + in: path + required: true + description: | + The name of the user for which you want to query the databases. + schema: + type: string + - name: dbname + in: path + required: true + description: | + The name of the database to query the access level of. + schema: + type: string + - name: collection + in: path + required: true + description: | + The name of the collection to query the access level of. + schema: + type: string + responses: + '200': + description: | + Returned if the access level can be returned + '400': + description: | + If the access privileges are not right etc. + '401': + description: | + Returned if you have *No access* database access level to the `_system` + database. + '403': + description: | + Returned if you have *No access* server access level. + tags: + - Users +``` + +**Examples** + +```curl +--- +description: '' +name: RestFetchUserCollectionPermission +--- +var users = require("@arangodb/users"); +var theUser="anotherAdmin@secapp"; +users.save(theUser, "secret"); +users.grantDatabase(theUser, "_system", "rw"); + +var url = "/_api/user/" + theUser + "/database/_system/_users"; +var response = logCurlRequest('GET', url); + +assert(response.code === 200); + +logJsonResponse(response); +users.remove(theUser); +``` diff --git a/site/content/arangodb/oem/develop/http-api/views/_index.md b/site/content/arangodb/oem/develop/http-api/views/_index.md new file mode 100644 index 0000000000..78af9f9212 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/views/_index.md @@ -0,0 +1,30 @@ +--- +title: HTTP interface for Views +menuTitle: Views +weight: 60 +description: >- + The HTTP API for Views lets you manage Views of any type +--- +## Addresses of Views + +All Views in ArangoDB have a unique identifier and a unique +name. To access a View, use the View name to refer to it: + +``` +http://server:port/_api/view/<view-name> +``` + +For example, assume that the View identifier is `7254820` and +the View name is `demo`, then the URL of that View is: + +``` +http://localhost:8529/_api/view/demo +``` + +## View types + +ArangoDB supports the following types of Views and they share endpoints in the +HTTP API but the behavior is different for each: + +- [`arangosearch` Views](arangosearch-views.md) +- [`search-alias` Views](search-alias-views.md) diff --git a/site/content/arangodb/oem/develop/http-api/views/arangosearch-views.md b/site/content/arangodb/oem/develop/http-api/views/arangosearch-views.md new file mode 100644 index 0000000000..b8958aa29c --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/views/arangosearch-views.md @@ -0,0 +1,2741 @@ +--- +title: HTTP interface for arangosearch Views +menuTitle: '`arangosearch` Views' +weight: 10 +description: >- + The HTTP API for Views lets you manage `arangosearch` Views, including + handling the general View properties and View links +--- +## Create an arangosearch View + +```openapi +paths: + /_db/{database-name}/_api/view: + post: + operationId: createView + description: | + Creates a new View with a given name and properties if it does not + already exist. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + - type + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The type of the View. Must be equal to `"arangosearch"`. + This option is immutable. + type: string + example: arangosearch + links: + description: | + Expects an object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. Example: + + ```json + { + "name": "arangosearch", + "links": { + "coll": { + "fields": { + "my_attribute": { + "fields": { + "my_sub_attribute": { + "analyzers": ["text_en"] + } + } + } + } + } + } + } + ``` + + See [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + primarySort: + description: | + You can define a primary sort order to enable an AQL + optimization. If a query iterates over all documents of a View, + wants to sort them by attribute values and the (left-most) + fields to sort by as well as their sorting direction match + with the `primarySort` definition, then the `SORT` operation is + optimized away. This option is immutable. + + Expects an array of objects, each specifying a field + (attribute path) and a sort direction: + `[ { "field": "attr", "direction": "asc"}, … ]` + type: array + default: [] + items: + type: object + required: + - field + - direction + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + direction: + description: | + The sort direction. + + - `"asc"` for ascending + - `"desc"` for descending + type: string + enum: [asc, desc] + primarySortCompression: + description: | + Defines how to compress the primary sort data. + + - `"lz4"`: use LZ4 fast compression. + - `"none"`: disable compression to trade space for speed. + + This option is immutable. + type: string + enum: [lz4, none] + default: lz4 + primarySortCache: + description: | + If you enable this option, then the primary sort columns are always cached in + memory (Enterprise Edition only). This can improve the + performance of queries that utilize the primary sort order. Otherwise, these + values are memory-mapped and it is up to the operating system to load them from + disk into memory and to evict them from memory. + + This option is immutable. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option. + type: boolean + primaryKeyCache: + description: | + If you enable this option, then the primary key columns are always cached in + memory (introduced in v3.9.6, Enterprise Edition only). This can improve the + performance of queries that return many documents. Otherwise, these values are + memory-mapped and it is up to the operating system to load them from disk into + memory and to evict them from memory. + + This option is immutable. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the column + cache in cluster deployments by only using the cache for leader shards, see the + `--arangosearch.columns-cache-only-leader` startup option (introduced in v3.10.6). + type: boolean + storedValues: + description: | + An array of objects to describe which document attributes to store in the View + index. It can then cover search queries, which means the + data can be taken from the index directly and accessing the storage engine can + be avoided. + + This option is immutable. + + Each object is expected in the following form: + + `{ "fields": [ "attr1", "attr2", ... "attrN" ], "compression": "none", "cache": false }` + + You may use the following shorthand notations on View creation instead of + an array of objects as described above. The default compression and cache + settings are used in this case: + + - An array of strings, like `["attr1", "attr2"]`, to place each attribute into + a separate column of the index. + + - An array of arrays of strings, like `[["attr1", "attr2"]]`, to place the + attributes into a single column of the index, or `[["attr1"], ["attr2"]]` + to place each attribute into a separate column. You can also mix it with the + full form: + + ```json + [ + ["attr1"], + ["attr2", "attr3"], + { "fields": ["attr4", "attr5"], "cache": true } + ] + ``` + + The `storedValues` option is not to be confused with the `storeValues` option, + which allows to store meta data about attribute values in the View index. + type: array + default: [] + items: + type: object + required: + - fields + properties: + fields: + description: | + An array of strings with one or more document attribute paths. + The specified attributes are placed into a single column of the index. + A column with all fields that are involved in common search queries is + ideal for performance. The column should not include too many unneeded + fields, however. + type: array + items: + type: string + compression: + description: | + Defines the compression type used for the internal column-store. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + default: lz4 + cache: + description: | + Whether to always cache stored values in memory (Enterprise Edition only). + This can improve the query performance if stored values are involved. + Otherwise, these values are memory-mapped and it is up to the operating system + to load them from disk into memory and to evict them from memory. + + See the `--arangosearch.columns-cache-limit` startup option to control the + memory consumption of this cache. You can reduce the memory usage of the + column cache in cluster deployments by only using the cache for leader shards, + see the `--arangosearch.columns-cache-only-leader` startup option. + type: boolean + default: false + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disable). + For the case where the consolidation policies merge segments often (i.e. a lot + of commit+consolidate), a lower value causes 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 impacts performance without any added + benefits. + + _Background:_ + With every "commit" or "consolidate" operation, a new state of the View's + internal data structures is created on disk. + Old states/snapshots are released once there are no longer any users + remaining. + However, the files for the released states/snapshots are left on disk, and + only removed by "cleanup" operation. + type: integer + default: 2 + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disable). + For the case where there are a lot of inserts/updates, a higher value causes the + index not to account for them and memory usage continues to grow until the commit. + A lower value impacts performance, including the case where there are no or only a + few inserts/updates because of synchronous locking, and it wastes disk space for + each commit call. + + _Background:_ + For data retrieval, ArangoSearch follows the concept of + "eventually-consistent", i.e. eventually all the data in ArangoDB will be + matched by corresponding query expressions. + The concept of ArangoSearch "commit" operations is introduced to + control the upper-bound on the time until document addition/removals are + actually reflected by corresponding query expressions. + Once a "commit" operation is complete, all documents added/removed prior to + the start of the "commit" operation will be reflected by queries invoked in + subsequent ArangoDB transactions, in-progress ArangoDB transactions will + still continue to return a repeatable-read state. + type: integer + default: 1000 + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disable). + For the case where there are a lot of data modification operations, a higher + value could potentially have the data store consume more space and file handles. + For the case where there are a few data modification operations, a lower value + impacts performance due to no segment candidates being available for + consolidation. + + _Background:_ + For data modification, ArangoSearch follows the concept of a + "versioned data store". Thus old versions of data may be removed once there + are no longer any users of the old data. The frequency of the cleanup and + compaction operations are governed by `consolidationIntervalMsec` and the + candidates for compaction are selected via `consolidationPolicy`. + type: integer + default: 10000 + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + + _Background:_ + With each ArangoDB transaction that inserts documents, one or more + ArangoSearch-internal segments get created. + Similarly, for removed documents, the segments that contain such documents + have these documents marked as 'deleted'. + Over time, this approach causes a lot of small and sparse segments to be + created. + A "consolidation" operation selects one or more segments and copies all of + their valid documents into a single new segment, thereby allowing the + search algorithm to perform more optimally and for extra file handles to be + released once old segments are no longer used. + type: object + required: + - type + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + default: tier + threshold: + description: | + A value in the range `[0.0, 1.0]`. + type: number + default: 0 + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + default: 2097152 + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + default: 5368709120 + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + default: 10 + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + default: 1 + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + default: 0 + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool + (immutable, `0` = disable). + type: integer + default: 64 + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (immutable, `0` = disable). + type: integer + default: 0 + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. The value `0` turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (ArangoDB server startup option). This should be used carefully due to + high potential memory consumption (immutable, `0` = disable). + type: integer + default: 33554432 + responses: + '201': + description: | + The View has been created. + content: + application/json: + schema: + type: object + required: + - links + - primarySort + - primarySortCompression + # primarySortCache # omitted if disabled + # primaryKeyCache # omitted if disabled + - storedValues + - cleanupIntervalStep + - commitIntervalMsec + - consolidationIntervalMsec + - consolidationPolicy + - writebufferIdle + - writebufferActive + - writebufferSizeMax + - id + - name + - type + - globallyUniqueId + properties: + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"arangosearch"`). + type: string + example: arangosearch + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + links: + description: | + An object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. See + [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + primarySort: + description: | + The primary sort order, described by an array of objects, each specifying + a field (attribute path) and a sort direction. + type: array + items: + type: object + required: + - field + - asc + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + asc: + description: | + The sort direction. + + - `true` for ascending + - `false` for descending + type: boolean + primarySortCompression: + description: | + Defines how the primary sort data is compressed. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + primarySortCache: + description: | + Whether the primary sort columns are always cached in memory + (Enterprise Edition only). + type: boolean + primaryKeyCache: + description: | + Whether the primary key columns are always cached in memory + (Enterprise Edition only). + type: boolean + storedValues: + description: | + An array of objects that describes which document attributes are stored + in the View index for covering search queries, which means the data can + be taken from the index directly and accessing the storage engine can + be avoided. + type: array + items: + type: object + required: + - fields + properties: + fields: + description: | + An array of strings with one or more document attribute paths. + type: array + items: + type: string + compression: + description: | + The compression type used for the internal column-store. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + cache: + description: | + Whether stored values are always cached in memory + (Enterprise Edition only). + type: boolean + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disabled). + type: integer + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disabled). + type: integer + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disabled). + type: integer + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + type: object + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + threshold: + description: | + A value in the range `[0.0, 1.0]` + type: number + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool (`0` = disabled). + type: integer + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (`0` = disabled). + type: integer + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (`0` = disabled). + type: integer + '400': + description: | + The `name` or `type` attribute is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '409': + description: | + A View called `name` already exists. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 409 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: '' +name: RestViewPostViewArangoSearch +--- +var url = "/_api/view"; +var body = { + name: "products", + type: "arangosearch" +}; +var response = logCurlRequest('POST', url, body); +assert(response.code === 201); +logJsonResponse(response); + +db._dropView("products"); +``` + +## Get information about a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}: + get: + operationId: getView + description: | + Returns the basic information about a specific View. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + responses: + '200': + description: | + The basic information about the View. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - id + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"arangosearch"`). + type: string + example: arangosearch + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestViewGetViewIdentifierArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/"+ view._id; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +``` + +```curl +--- +description: |- + Using a name: +name: RestViewGetViewNameArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/productsView"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +``` + +## Get the properties of a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/properties: + get: + operationId: getViewProperties + description: | + Returns an object containing the definition of the View identified by `view-name`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + responses: + '200': + description: | + An object with a full description of the specified View, including + `arangosearch` View type-dependent properties. + content: + application/json: + schema: + type: object + required: + - error + - code + - links + - primarySort + - primarySortCompression + # primarySortCache # omitted if disabled + # primaryKeyCache # omitted if disabled + - storedValues + - cleanupIntervalStep + - commitIntervalMsec + - consolidationIntervalMsec + - consolidationPolicy + - writebufferIdle + - writebufferActive + - writebufferSizeMax + - id + - name + - type + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"arangosearch"`). + type: string + example: arangosearch + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + links: + description: | + An object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. See + [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + primarySort: + description: | + The primary sort order, described by an array of objects, each specifying + a field (attribute path) and a sort direction. + type: array + items: + type: object + required: + - field + - asc + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + asc: + description: | + The sort direction. + + - `true` for ascending + - `false` for descending + type: boolean + primarySortCompression: + description: | + Defines how the primary sort data is compressed. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + primarySortCache: + description: | + Whether the primary sort columns are always cached in memory + (Enterprise Edition only). + type: boolean + primaryKeyCache: + description: | + Whether the primary key columns are always cached in memory + (Enterprise Edition only). + type: boolean + storedValues: + description: | + An array of objects that describes which document attributes are stored + in the View index for covering search queries, which means the data can + be taken from the index directly and accessing the storage engine can + be avoided. + type: array + items: + type: object + required: + - fields + properties: + fields: + description: | + An array of strings with one or more document attribute paths. + type: array + items: + type: string + compression: + description: | + The compression type used for the internal column-store. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + cache: + description: | + Whether stored values are always cached in memory + (Enterprise Edition only). + type: boolean + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disabled). + type: integer + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disabled). + type: integer + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disabled). + type: integer + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + type: object + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + threshold: + description: | + A value in the range `[0.0, 1.0]` + type: number + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool (`0` = disabled). + type: integer + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (`0` = disabled). + type: integer + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (`0` = disabled). + type: integer + '400': + description: | + The `view-name` path parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestViewGetViewPropertiesIdentifierArangoSearch +--- +var coll = db._create("books"); +var view = db._createView("productsView", "arangosearch", { links: { books: { fields: { title: { analyzers: ["text_en"] } } } } }); + +var url = "/_api/view/"+ view._id + "/properties"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +db._drop("books"); +``` + +```curl +--- +description: |- + Using a name: +name: RestViewGetViewPropertiesNameArangoSearch +--- +var coll = db._create("books"); +var view = db._createView("productsView", "arangosearch", { links: { books: { fields: { title: { analyzers: ["text_en"] } } } } }); + +var url = "/_api/view/productsView/properties"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +db._drop("books"); +``` + +## List all Views + +```openapi +paths: + /_db/{database-name}/_api/view: + get: + operationId: listViews + description: | + Returns an object containing a listing of all Views in the current database, + regardless of their type. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + The list of Views. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The result object. + type: array + items: + type: object + required: + - name + - type + - id + - globallyUniqueId + properties: + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View. + type: string + enum: [arangosearch, search-alias] + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Return information about all Views: +name: RestViewGetAllViews +--- +var viewSearchAlias = db._createView("productsView", "search-alias"); +var viewArangoSearch = db._createView("reviewsView", "arangosearch"); + +var url = "/_api/view"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +db._dropView("reviewsView"); +``` + +## Replace the properties of an arangosearch View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/properties: + put: + operationId: replaceViewProperties + description: | + Changes all properties of a View by replacing them, except for immutable properties. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + links: + description: | + Expects an object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. Example: + + ```json + { + "name": "arangosearch", + "links": { + "coll": { + "fields": { + "my_attribute": { + "fields": { + "my_sub_attribute": { + "analyzers": ["text_en"] + } + } + } + } + } + } + } + ``` + + See [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disable). + For the case where the consolidation policies merge segments often (i.e. a lot + of commit+consolidate), a lower value causes 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 impacts performance without any added + benefits. + + _Background:_ + With every "commit" or "consolidate" operation, a new state of the View's + internal data structures is created on disk. + Old states/snapshots are released once there are no longer any users + remaining. + However, the files for the released states/snapshots are left on disk, and + only removed by "cleanup" operation. + type: integer + default: 2 + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disable). + For the case where there are a lot of inserts/updates, a higher value causes the + index not to account for them and memory usage continues to grow until the commit. + A lower value impacts performance, including the case where there are no or only a + few inserts/updates because of synchronous locking, and it wastes disk space for + each commit call. + + _Background:_ + For data retrieval, ArangoSearch follows the concept of + "eventually-consistent", i.e. eventually all the data in ArangoDB will be + matched by corresponding query expressions. + The concept of ArangoSearch "commit" operations is introduced to + control the upper-bound on the time until document addition/removals are + actually reflected by corresponding query expressions. + Once a "commit" operation is complete, all documents added/removed prior to + the start of the "commit" operation will be reflected by queries invoked in + subsequent ArangoDB transactions, in-progress ArangoDB transactions will + still continue to return a repeatable-read state. + type: integer + default: 1000 + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disable). + For the case where there are a lot of data modification operations, a higher + value could potentially have the data store consume more space and file handles. + For the case where there are a few data modification operations, a lower value + impacts performance due to no segment candidates being available for + consolidation. + + _Background:_ + For data modification, ArangoSearch follows the concept of a + "versioned data store". Thus old versions of data may be removed once there + are no longer any users of the old data. The frequency of the cleanup and + compaction operations are governed by `consolidationIntervalMsec` and the + candidates for compaction are selected via `consolidationPolicy`. + type: integer + default: 10000 + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + + _Background:_ + With each ArangoDB transaction that inserts documents, one or more + ArangoSearch-internal segments get created. + Similarly, for removed documents, the segments that contain such documents + have these documents marked as 'deleted'. + Over time, this approach causes a lot of small and sparse segments to be + created. + A "consolidation" operation selects one or more segments and copies all of + their valid documents into a single new segment, thereby allowing the + search algorithm to perform more optimally and for extra file handles to be + released once old segments are no longer used. + type: object + required: + - type + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + default: tier + threshold: + description: | + A value in the range `[0.0, 1.0]`. + type: number + default: 0 + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + default: 2097152 + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + default: 5368709120 + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + default: 10 + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + default: 1 + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + default: 0 + responses: + '200': + description: | + The View has been updated successfully. + content: + application/json: + schema: + type: object + required: + - links + - primarySort + - primarySortCompression + # primarySortCache # omitted if disabled + # primaryKeyCache # omitted if disabled + - storedValues + - cleanupIntervalStep + - commitIntervalMsec + - consolidationIntervalMsec + - consolidationPolicy + - writebufferIdle + - writebufferActive + - writebufferSizeMax + - id + - name + - type + - globallyUniqueId + properties: + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"arangosearch"`). + type: string + example: arangosearch + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + links: + description: | + An object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. See + [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + primarySort: + description: | + The primary sort order, described by an array of objects, each specifying + a field (attribute path) and a sort direction. + type: array + items: + type: object + required: + - field + - asc + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + asc: + description: | + The sort direction. + + - `true` for ascending + - `false` for descending + type: boolean + primarySortCompression: + description: | + Defines how the primary sort data is compressed. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + primarySortCache: + description: | + Whether the primary sort columns are always cached in memory + (Enterprise Edition only). + type: boolean + primaryKeyCache: + description: | + Whether the primary key columns are always cached in memory + (Enterprise Edition only). + type: boolean + storedValues: + description: | + An array of objects that describes which document attributes are stored + in the View index for covering search queries, which means the data can + be taken from the index directly and accessing the storage engine can + be avoided. + type: array + items: + type: object + required: + - fields + properties: + fields: + description: | + An array of strings with one or more document attribute paths. + type: array + items: + type: string + compression: + description: | + The compression type used for the internal column-store. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + cache: + description: | + Whether stored values are always cached in memory + (Enterprise Edition only). + type: boolean + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disabled). + type: integer + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disabled). + type: integer + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disabled). + type: integer + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + type: object + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + threshold: + description: | + A value in the range `[0.0, 1.0]` + type: number + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool (`0` = disabled). + type: integer + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (`0` = disabled). + type: integer + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (`0` = disabled). + type: integer + '400': + description: | + The `view-name` path parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +name: RestViewPutPropertiesArangoSearch +description: | + Replace the properties of an `arangosearch` View including any links with new + properties. All mutable properties that are not specified are reset to their + default values. +--- +db._create("users"); +db._create("products"); +var view = db._createView("productsView", "arangosearch", { + commitIntervalMsec: 1337, + links: { + users: {}, + products: {} + } +}); + +var url = "/_api/view/"+ view.name() + "/properties"; +var body = { + cleanupIntervalStep: 12, + links: { + products: { + fields: { + description: { + analyzers: ["text_en"] + } + } + } + } +}; +var response = logCurlRequest('PUT', url, body); +assert(response.code === 200); +assert(Object.keys(response.parsedBody.links).length === 1); +assert(response.parsedBody.commitIntervalMsec !== 1337); +logJsonResponse(response); + +db._dropView(view.name()); +db._drop("users"); +db._drop("products"); +``` + +## Update the properties of an arangosearch View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/properties: + patch: + operationId: updateViewProperties + description: | + Partially changes the properties of a View by updating the specified attributes. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + links: + description: | + Expects an object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. Example: + + ```json + { + "name": "arangosearch", + "links": { + "coll": { + "fields": { + "my_attribute": { + "fields": { + "my_sub_attribute": { + "analyzers": ["text_en"] + } + } + } + } + } + } + } + ``` + + See [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disable). + For the case where the consolidation policies merge segments often (i.e. a lot + of commit+consolidate), a lower value causes 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 impacts performance without any added + benefits. + + _Background:_ + With every "commit" or "consolidate" operation, a new state of the View's + internal data structures is created on disk. + Old states/snapshots are released once there are no longer any users + remaining. + However, the files for the released states/snapshots are left on disk, and + only removed by "cleanup" operation. + type: integer + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disable). + For the case where there are a lot of inserts/updates, a higher value causes the + index not to account for them and memory usage continues to grow until the commit. + A lower value impacts performance, including the case where there are no or only a + few inserts/updates because of synchronous locking, and it wastes disk space for + each commit call. + + _Background:_ + For data retrieval, ArangoSearch follows the concept of + "eventually-consistent", i.e. eventually all the data in ArangoDB will be + matched by corresponding query expressions. + The concept of ArangoSearch "commit" operations is introduced to + control the upper-bound on the time until document addition/removals are + actually reflected by corresponding query expressions. + Once a "commit" operation is complete, all documents added/removed prior to + the start of the "commit" operation will be reflected by queries invoked in + subsequent ArangoDB transactions, in-progress ArangoDB transactions will + still continue to return a repeatable-read state. + type: integer + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disable). + For the case where there are a lot of data modification operations, a higher + value could potentially have the data store consume more space and file handles. + For the case where there are a few data modification operations, a lower value + impacts performance due to no segment candidates being available for + consolidation. + + _Background:_ + For data modification, ArangoSearch follows the concept of a + "versioned data store". Thus old versions of data may be removed once there + are no longer any users of the old data. The frequency of the cleanup and + compaction operations are governed by `consolidationIntervalMsec` and the + candidates for compaction are selected via `consolidationPolicy`. + type: integer + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + + _Background:_ + With each ArangoDB transaction that inserts documents, one or more + ArangoSearch-internal segments get created. + Similarly, for removed documents, the segments that contain such documents + have these documents marked as 'deleted'. + Over time, this approach causes a lot of small and sparse segments to be + created. + A "consolidation" operation selects one or more segments and copies all of + their valid documents into a single new segment, thereby allowing the + search algorithm to perform more optimally and for extra file handles to be + released once old segments are no longer used. + type: object + required: + - type + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + threshold: + description: | + A value in the range `[0.0, 1.0]`. + type: number + default: 0 + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + default: 2097152 + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + default: 5368709120 + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + default: 10 + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + default: 1 + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + default: 0 + responses: + '200': + description: | + The View has been updated successfully. + content: + application/json: + schema: + type: object + required: + - links + - primarySort + - primarySortCompression + # primarySortCache # omitted if disabled + # primaryKeyCache # omitted if disabled + - storedValues + - cleanupIntervalStep + - commitIntervalMsec + - consolidationIntervalMsec + - consolidationPolicy + - writebufferIdle + - writebufferActive + - writebufferSizeMax + - id + - name + - type + - globallyUniqueId + properties: + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"arangosearch"`). + type: string + example: arangosearch + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + links: + description: | + An object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. See + [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + primarySort: + description: | + The primary sort order, described by an array of objects, each specifying + a field (attribute path) and a sort direction. + type: array + items: + type: object + required: + - field + - asc + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + asc: + description: | + The sort direction. + + - `true` for ascending + - `false` for descending + type: boolean + primarySortCompression: + description: | + Defines how the primary sort data is compressed. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + primarySortCache: + description: | + Whether the primary sort columns are always cached in memory + (Enterprise Edition only). + type: boolean + primaryKeyCache: + description: | + Whether the primary key columns are always cached in memory + (Enterprise Edition only). + type: boolean + storedValues: + description: | + An array of objects that describes which document attributes are stored + in the View index for covering search queries, which means the data can + be taken from the index directly and accessing the storage engine can + be avoided. + type: array + items: + type: object + required: + - fields + properties: + fields: + description: | + An array of strings with one or more document attribute paths. + type: array + items: + type: string + compression: + description: | + The compression type used for the internal column-store. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + cache: + description: | + Whether stored values are always cached in memory + (Enterprise Edition only). + type: boolean + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disabled). + type: integer + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disabled). + type: integer + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disabled). + type: integer + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + type: object + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + threshold: + description: | + A value in the range `[0.0, 1.0]` + type: number + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool (`0` = disabled). + type: integer + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (`0` = disabled). + type: integer + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (`0` = disabled). + type: integer + '400': + description: | + The `view-name` path parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +name: RestViewPatchPropertiesArangoSearch +description: | + Update the properties of an `arangosearch` View, only changing one setting + and removing a link. All other mutable properties that are not specified + keep their current values. +--- +var coll = db._create("users"); +var coll = db._create("products"); +var view = db._createView("productsView", "arangosearch", { + cleanupIntervalStep: 666, + commitIntervalMsec: 666, + consolidationIntervalMsec: 666, + links: { + users: { + includeAllFields: true + }, + products: { + fields: { + description: { + analyzers: ["text_en"] + } + } + } + } +}); + +var url = "/_api/view/"+ view.name() + "/properties"; +var body = { + cleanupIntervalStep: 12, + links: { + products: null + } +}; +var response = logCurlRequest('PATCH', url, body); +assert(response.code === 200); +assert(response.parsedBody.links.products === undefined); +assert(response.parsedBody.links.users !== undefined); +logJsonResponse(response); + +db._dropView("productsView"); +db._drop("users"); +db._drop("products"); +``` + +## Rename a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/rename: + put: + # The PATCH method can be used as an alias + operationId: renameView + description: | + Renames a View. + + {{</* info */>}} + Renaming Views is not supported in cluster deployments. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View to rename. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + The new name for the View. + type: string + responses: + '200': + description: | + The View has been renamed successfully. + content: + application/json: + schema: + type: object + required: + - links + - primarySort + - primarySortCompression + # primarySortCache # omitted if disabled + # primaryKeyCache # omitted if disabled + - storedValues + - cleanupIntervalStep + - commitIntervalMsec + - consolidationIntervalMsec + - consolidationPolicy + - writebufferIdle + - writebufferActive + - writebufferSizeMax + - id + - name + - type + - globallyUniqueId + properties: + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"arangosearch"`). + type: string + example: arangosearch + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + links: + description: | + An object with the attribute keys being names of to be linked collections, + and the link properties as attribute values. See + [`arangosearch` View Link Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) + for details. + type: object + primarySort: + description: | + The primary sort order, described by an array of objects, each specifying + a field (attribute path) and a sort direction. + type: array + items: + type: object + required: + - field + - asc + properties: + field: + description: | + An attribute path. The `.` character denotes sub-attributes. + type: string + asc: + description: | + The sort direction. + + - `true` for ascending + - `false` for descending + type: boolean + primarySortCompression: + description: | + Defines how the primary sort data is compressed. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + primarySortCache: + description: | + Whether the primary sort columns are always cached in memory + (Enterprise Edition only). + type: boolean + primaryKeyCache: + description: | + Whether the primary key columns are always cached in memory + (Enterprise Edition only). + type: boolean + storedValues: + description: | + An array of objects that describes which document attributes are stored + in the View index for covering search queries, which means the data can + be taken from the index directly and accessing the storage engine can + be avoided. + type: array + items: + type: object + required: + - fields + properties: + fields: + description: | + An array of strings with one or more document attribute paths. + type: array + items: + type: string + compression: + description: | + The compression type used for the internal column-store. + + - `"lz4"`: LZ4 fast compression + - `"none"`: no compression + type: string + enum: [lz4, none] + cache: + description: | + Whether stored values are always cached in memory + (Enterprise Edition only). + type: boolean + cleanupIntervalStep: + description: | + Wait at least this many commits between removing unused files in the + ArangoSearch data directory (`0` = disabled). + type: integer + commitIntervalMsec: + description: | + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries (`0` = disabled). + type: integer + consolidationIntervalMsec: + description: | + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate the View data store and possibly release space on the filesystem + (`0` = disabled). + type: integer + consolidationPolicy: + description: | + The consolidation policy to apply for selecting which segments should be merged. + + - If the `tier` type is used, then the `segments*` and `minScore` properties are available. + - If the `bytes_accum` type is used, then the `threshold` property is available. + type: object + properties: + type: + description: | + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + - `"tier"`: consolidate based on segment byte size and live + document count as dictated by the customization attributes. + - `"bytes_accum"`: consolidate if and only if + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes` + i.e. the sum of all candidate segment byte size is less than the total + segment byte size multiplied by the `{threshold}`. + type: string + enum: [tier, bytes_accum] + threshold: + description: | + A value in the range `[0.0, 1.0]` + type: number + minimum: 0.0 + maximum: 1.0 + segmentsBytesFloor: + description: | + Defines the value (in bytes) to treat all smaller segments + as equal for consolidation selection. + type: integer + segmentsBytesMax: + description: | + Maximum allowed size of all consolidated segments in bytes. + type: integer + segmentsMax: + description: | + The maximum number of segments that are evaluated as + candidates for consolidation. + type: integer + segmentsMin: + description: | + The minimum number of segments that are + evaluated as candidates for consolidation + type: integer + minScore: + description: | + Filter out consolidation candidates with a score less than this. + type: integer + writebufferIdle: + description: | + Maximum number of writers (segments) cached in the pool (`0` = disabled). + type: integer + writebufferActive: + description: | + Maximum number of concurrent active writers (segments) that perform a + transaction. Other writers (segments) wait till current active writers + (segments) finish (`0` = disabled). + type: integer + writebufferSizeMax: + description: | + Maximum memory byte size per writer (segment) before a writer (segment) flush + is triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically based on the value defined for the flush thread + (`0` = disabled). + type: integer + '400': + description: | + The `view-name` path parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: '' +name: RestViewPutRename +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/" + view.name() + "/rename"; +var response = logCurlRequest('PUT', url, { name: "catalogView" }); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("catalogView"); +``` + +## Drop a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}: + delete: + operationId: deleteView + description: | + Deletes the View identified by `view-name`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View to drop. + schema: + type: string + responses: + '200': + description: | + The View has been dropped successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The value `true`. + type: boolean + example: true + '400': + description: | + The `view-name` path parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestViewDeleteViewIdentifierArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/"+ view._id; +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Using a name: +name: RestViewDeleteViewNameArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/productsView"; +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/http-api/views/search-alias-views.md b/site/content/arangodb/oem/develop/http-api/views/search-alias-views.md new file mode 100644 index 0000000000..57c6ec5b85 --- /dev/null +++ b/site/content/arangodb/oem/develop/http-api/views/search-alias-views.md @@ -0,0 +1,1332 @@ +--- +title: HTTP interface for search-alias Views +menuTitle: '`search-alias` Views' +weight: 5 +description: >- + The HTTP API for Views lets you manage `search-alias` Views, including adding + and removing inverted indexes +--- +## Create a search-alias View + +```openapi +paths: + /_db/{database-name}/_api/view#searchalias: + post: + operationId: createViewSearchAlias + description: | + Creates a new View with a given name and properties if it does not + already exist. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + - type + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The type of the View. Must be equal to `"search-alias"`. + This option is immutable. + type: string + example: search-alias + indexes: + description: | + A list of inverted indexes to add to the View. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`, or the index ID without + the `<collection>/` prefix. + type: string + responses: + '201': + description: | + The View has been created. + content: + application/json: + schema: + type: object + required: + - name + - type + - id + - globallyUniqueId + - indexes + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The type of the View (`"search-alias"`). + type: string + example: search-alias + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + indexes: + description: | + The list of the View's inverted indexes. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`. + type: string + '400': + description: | + The `name` or `type` attribute or one of the `collection` or `index` + attributes is missing or invalid. + error is returned. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '409': + description: | + A View called `name` already exists. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 409 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: '' +name: RestViewPostViewSearchAlias +--- +var coll = db._create("books"); +var idx = coll.ensureIndex({ type: "inverted", name: "inv-idx", fields: [ { name: "title", analyzer: "text_en" } ] }); + +var url = "/_api/view"; +var body = { + name: "products", + type: "search-alias", + indexes: [ + { collection: "books", index: "inv-idx" } + ] +}; +var response = logCurlRequest('POST', url, body); +assert(response.code === 201); +logJsonResponse(response); + +db._dropView("products"); +db._drop(coll.name()); +``` + +## Get information about a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}: + get: + operationId: getView + description: | + Returns the basic information about a specific View. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + responses: + '200': + description: | + The basic information about the View. + content: + application/json: + schema: + type: object + required: + - error + - code + - name + - type + - id + - globallyUniqueId + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View (`"search-alias"`). + type: string + example: search-alias + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestViewGetViewIdentifierArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/"+ view._id; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +``` + +```curl +--- +description: |- + Using a name: +name: RestViewGetViewNameArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/productsView"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +``` + +## Read properties of a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/properties#searchalias: + get: + operationId: getViewPropertiesSearchAlias + description: | + Returns an object containing the definition of the View identified by `view-name`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + responses: + '200': + description: | + An object with a full description of the specified View, including + `search-alias` View type-dependent properties. + content: + application/json: + schema: + type: object + required: + - name + - type + - id + - globallyUniqueId + - indexes + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The type of the View (`"search-alias"`). + type: string + example: search-alias + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + indexes: + description: | + The list of the View's inverted indexes. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`. + type: string + '400': + description: | + The `view-name` parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestViewGetViewPropertiesIdentifierSearchAlias +--- +var coll = db._create("books"); +var idx = coll.ensureIndex({ type: "inverted", name: "inv-idx", fields: [ { name: "title", analyzer: "text_en" } ] }); +var view = db._createView("productsView", "search-alias", { indexes: [ { collection: "books", index: "inv-idx" } ] }); + +var url = "/_api/view/"+ view._id + "/properties"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +db._drop("books"); +``` + +```curl +--- +description: |- + Using a name: +name: RestViewGetViewPropertiesNameSearchAlias +--- +var coll = db._create("books"); +var idx = coll.ensureIndex({ type: "inverted", name: "inv-idx", fields: [ { name: "title", analyzer: "text_en" } ] }); +var view = db._createView("productsView", "search-alias", { indexes: [ { collection: "books", index: "inv-idx" } ] }); + +var url = "/_api/view/productsView/properties"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +db._drop("books"); +``` + +## List all Views + +```openapi +paths: + /_db/{database-name}/_api/view: + get: + operationId: listViews + description: | + Returns an object containing a listing of all Views in the current database, + regardless of their type. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + responses: + '200': + description: | + The list of Views. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The result object. + type: array + items: + type: object + required: + - name + - type + - id + - globallyUniqueId + properties: + name: + description: | + The name of the View. + type: string + example: coll + type: + description: | + The type of the View. + type: string + enum: [arangosearch, search-alias] + id: + description: | + A unique identifier of the View (deprecated). + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Return information about all Views: +name: RestViewGetAllViews +--- +var viewSearchAlias = db._createView("productsView", "search-alias"); +var viewArangoSearch = db._createView("reviewsView", "arangosearch"); + +var url = "/_api/view"; +var response = logCurlRequest('GET', url); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("productsView"); +db._dropView("reviewsView"); +``` + +## Replace the properties of a search-alias View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/properties#searchalias: + put: + operationId: replaceViewPropertiesSearchAlias + description: | + Replaces the list of indexes of a `search-alias` View. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + indexes: + description: | + A list of inverted indexes for the View. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`, or the index ID without + the `<collection>/` prefix. + type: string + responses: + '200': + description: | + The View has been updated successfully. + content: + application/json: + schema: + type: object + required: + - name + - type + - id + - globallyUniqueId + - indexes + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The View type (`"search-alias"`). + type: string + id: + description: | + The identifier of the View. + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + indexes: + description: | + The list of inverted indexes that are part of the View. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`. + type: string + '400': + description: | + The `view-name` parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: '' +name: RestViewPutPropertiesSearchAlias +--- +var coll = db._create("books"); +coll.ensureIndex({ type: "inverted", name: "inv_title", fields: ["title"] }); +coll.ensureIndex({ type: "inverted", name: "inv_descr", fields: ["description"] }); + +var view = db._createView("productsView", "search-alias", { + indexes: [ { collection: coll.name(), index: "inv_title" } ] }); + +var url = "/_api/view/"+ view.name() + "/properties"; +var response = logCurlRequest('PUT', url, { + "indexes": [ { collection: coll.name(), index: "inv_descr" } ] }); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView(view.name()); +db._drop(coll.name()); +``` + +## Update the properties of a search-alias View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/properties#searchalias: + patch: + operationId: updateViewPropertiesSearchAlias + description: | + Updates the list of indexes of a `search-alias` View. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + indexes: + description: | + A list of inverted indexes to add to or remove from the View. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`, or the index ID without + the `<collection>/` prefix. + type: string + operation: + description: | + Whether to add or remove the index to the stored `indexes` property of the View. + type: string + enum: [add, del] + default: add + responses: + '200': + description: | + The View has been updated successfully. + content: + application/json: + schema: + type: object + required: + - name + - type + - id + - globallyUniqueId + - indexes + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The View type (`"search-alias"`). + type: string + id: + description: | + The identifier of the View. + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + indexes: + description: | + The list of inverted indexes that are part of the View. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`. + type: string + '400': + description: | + The `view-name` parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: '' +name: RestViewPatchPropertiesSearchAlias +--- +var coll = db._create("books"); +coll.ensureIndex({ type: "inverted", name: "inv_title", fields: ["title"] }); +coll.ensureIndex({ type: "inverted", name: "inv_descr", fields: ["description"] }); + +var view = db._createView("productsView", "search-alias", { + indexes: [ { collection: coll.name(), index: "inv_title" } ] }); + +var url = "/_api/view/"+ view.name() + "/properties"; +var response = logCurlRequest('PATCH', url, { + "indexes": [ { collection: coll.name(), index: "inv_descr" } ] }); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView(view.name()); +db._drop(coll.name()); +``` + +## Rename a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}/rename: + put: + # The PATCH method can be used as an alias + operationId: renameView + description: | + Renames a View. + + {{</* info */>}} + Renaming Views is not supported in cluster deployments. + {{</* /info */>}} + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View to rename. + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: | + The new name for the View. + type: string + responses: + '200': + description: | + The View has been renamed successfully. + content: + application/json: + schema: + type: object + required: + - name + - type + - id + - globallyUniqueId + - indexes + properties: + name: + description: | + The name of the View. + type: string + type: + description: | + The View type (`"search-alias"`). + type: string + id: + description: | + The identifier of the View. + type: string + globallyUniqueId: + description: | + A unique identifier of the View. This is an internal property. + type: string + indexes: + description: | + The list of inverted indexes that are part of the View. + type: array + items: + type: object + required: + - collection + - index + properties: + collection: + description: | + The name of a collection. + type: string + index: + description: | + The name of an inverted index of the `collection`. + type: string + '400': + description: | + The `view-name` parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: '' +name: RestViewPutRename +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/" + view.name() + "/rename"; +var response = logCurlRequest('PUT', url, { name: "catalogView" }); +assert(response.code === 200); +logJsonResponse(response); + +db._dropView("catalogView"); +``` + +## Drop a View + +```openapi +paths: + /_db/{database-name}/_api/view/{view-name}: + delete: + operationId: deleteView + description: | + Deletes the View identified by `view-name`. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of the database. + schema: + type: string + - name: view-name + in: path + required: true + description: | + The name of the View to drop. + schema: + type: string + responses: + '200': + description: | + The View has been dropped successfully. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The value `true`. + type: boolean + example: true + '400': + description: | + The `view-name` path parameter is missing or invalid. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 400 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '404': + description: | + A View called `view-name` could not be found. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 404 + errorNum: + description: | + The ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Views +``` + +**Examples** + +```curl +--- +description: |- + Using an identifier: +name: RestViewDeleteViewIdentifierArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/"+ view._id; +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); +logJsonResponse(response); +``` + +```curl +--- +description: |- + Using a name: +name: RestViewDeleteViewNameArangoSearch +--- +var view = db._createView("productsView", "arangosearch"); + +var url = "/_api/view/productsView"; +var response = logCurlRequest('DELETE', url); +assert(response.code === 200); +logJsonResponse(response); +``` diff --git a/site/content/arangodb/oem/develop/integrations/_index.md b/site/content/arangodb/oem/develop/integrations/_index.md new file mode 100644 index 0000000000..635983cc4d --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/_index.md @@ -0,0 +1,49 @@ +--- +title: Integrations +menuTitle: Integrations +weight: 290 +description: >- + Integrations for third-party tools and frameworks let you use ArangoDB as the + database backend for these products +--- +Database integrations allow applications to work with different database systems +using a common interface. They are higher-level than database drivers because +they abstract away the details of specific database systems, especially the +low-level network communication. + +## Spring Data + +The [**Spring Data integration**](spring-data-arangodb/_index.md) for ArangoDB +lets you use ArangoDB as a database system in Spring-based Java applications. + +- [Tutorial](spring-data-arangodb/_index.md#get-started) +- Repository: [github.com/arangodb/spring-data](https://github.com/arangodb/spring-data) +- [Changelog](https://github.com/arangodb/spring-data/blob/main/ChangeLog.md) + +## Spring Boot Starter + +The [**Spring Boot Starter**](spring-boot-arangodb.md) simplifies the use of the +Spring Data integration for ArangoDB so you get started quickly. It is a set of +convenient dependency descriptors that you can include in your application. + +- [Tutorial](spring-boot-arangodb.md#get-started) +- Repository: <https://github.com/arangodb/spring-boot-starter> +- [Changelog](https://github.com/arangodb/spring-boot-starter/blob/main/Changelog.md) + +## Apache Spark + +The [**ArangoDB Datasource for Apache Spark**](arangodb-datasource-for-apache-spark.md) is a +library that lets you use Apache Spark with ArangoDB for data processing. +Apache Spark has first-party support for the Scala, Java, Python, and R language. + +- Repository: [github.com/arangodb/arangodb-spark-datasource](https://github.com/arangodb/arangodb-spark-datasource) +- [Changelog](https://github.com/arangodb/arangodb-spark-datasource/blob/main/ChangeLog.md) + +## Apache Kafka + +The [**Kafka Connect ArangoDB Sink Connector**](kafka-connect-arangodb-sink-connector/_index.md) +allows you to export data from Apache Kafka to ArangoDB. + +- Repository: [github.com/arangodb/kafka-connect-arangodb/](https://github.com/arangodb/kafka-connect-arangodb/) +- [Demo](https://github.com/arangodb/kafka-connect-arangodb/tree/main/demo) +- [Changelog](https://github.com/arangodb/kafka-connect-arangodb/blob/main/ChangeLog.md) diff --git a/site/content/arangodb/oem/develop/integrations/arangodb-datasource-for-apache-spark.md b/site/content/arangodb/oem/develop/integrations/arangodb-datasource-for-apache-spark.md new file mode 100644 index 0000000000..2cbf5ac7ca --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/arangodb-datasource-for-apache-spark.md @@ -0,0 +1,422 @@ +--- +title: ArangoDB Datasource for Apache Spark +menuTitle: Datasource for Apache Spark +weight: 10 +description: >- + ArangoDB Datasource for Apache Spark allows batch reading and writing Spark DataFrame data +aliases: +- arangodb-spark-connector +- arangodb-spark-connector/getting-started +- arangodb-spark-connector/reference +- arangodb-spark-connector/reference/java +- arangodb-spark-connector/reference/scala +--- +ArangoDB Datasource for Apache Spark allows batch reading and writing Spark DataFrame data from and to ArangoDB, by implementing the Spark Data Source V2 API. + +Reading tasks are parallelized according to the number of shards of the related ArangoDB collection, and the writing ones - depending on the source DataFrame partitions. The network traffic is load balanced across the available DB Coordinators. + +Filter predicates and column selections are pushed down to the DB by dynamically generating AQL queries, which will fetch only the strictly required data, thus saving network and computational resources both on the Spark and the DB side. + +The connector is usable from all the Spark supported client languages: Scala, Python, Java, and R. + +This library works with all the non-EOLed [ArangoDB versions](https://www.arangodb.com/subscriptions/end-of-life-notice/). + +## Supported versions + +There are several variants of this library, each one compatible with different Spark and Scala versions: + +- `com.arangodb:arangodb-spark-datasource-3.3_2.12` (Spark 3.3, Scala 2.12) +- `com.arangodb:arangodb-spark-datasource-3.3_2.13` (Spark 3.3, Scala 2.13) +- `com.arangodb:arangodb-spark-datasource-3.4_2.12` (Spark 3.4, Scala 2.12) (compatible with Spark `3.4.2+`) +- `com.arangodb:arangodb-spark-datasource-3.4_2.13` (Spark 3.4, Scala 2.13) (compatible with Spark `3.4.2+`) +- `com.arangodb:arangodb-spark-datasource-3.5_2.12` (Spark 3.5, Scala 2.12) +- `com.arangodb:arangodb-spark-datasource-3.5_2.13` (Spark 3.5, Scala 2.13) + +The following variants are no longer supported: + +- `com.arangodb:arangodb-spark-datasource-2.4_2.11` (Spark 2.4, Scala 2.11) +- `com.arangodb:arangodb-spark-datasource-2.4_2.12` (Spark 2.4, Scala 2.12) +- `com.arangodb:arangodb-spark-datasource-3.1_2.12` (Spark 3.1, Scala 2.12) +- `com.arangodb:arangodb-spark-datasource-3.2_2.12` (Spark 3.2, Scala 2.12) +- `com.arangodb:arangodb-spark-datasource-3.2_2.13` (Spark 3.2, Scala 2.13) + +Since version `1.7.0`, due to [breaking changes](https://github.com/apache/spark/commit/ad29290a02fb94a958fd21e301100338c9f5b82a#diff-b25c8acff88c1b4850c6642e80845aac4fb882c664795c3b0aa058e37ed732a0L42-R52) +in Spark `3.4.2`, `arangodb-spark-datasource-3.4` is not compatible anymore with Spark versions `3.4.0` and `3.4.1`. + +In the following sections the `${sparkVersion}` and `${scalaVersion}` placeholders refer to the Spark and Scala versions. + +## Setup + +To import ArangoDB Datasource for Apache Spark in a Maven project: + +```xml + <dependencies> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-spark-datasource-${sparkVersion}_${scalaVersion}</artifactId> + <version>x.y.z</version> + </dependency> + </dependencies> +``` + +Substitute `x.y.z` with the latest available version that is compatible. + +To use in an external Spark cluster, submit your application with the following parameter: + +```sh +--packages="com.arangodb:arangodb-spark-datasource-${sparkVersion}_${scalaVersion}:x.y.z" +``` + +## General Configuration + +- `user`: db user, `root` by default +- `password`: db password +- `endpoints`: list of Coordinators, e.g. `c1:8529,c2:8529` (required) +- `acquireHostList`: acquire the list of all known hosts in the cluster (`true` or `false`), `false` by default +- `protocol`: communication protocol (`vst`, `http`, or `http2`), `http2` by default +- `contentType`: content type for driver communication (`json` or `vpack`), `json` by default +- `timeout`: driver connect and request timeout in ms, `300000` by default +- `ssl.enabled`: ssl secured driver connection (`true` or `false`), `false` by default +- `ssl.verifyHost`: whether TLS hostname verification is enabled, `true` by default +- `ssl.cert.value`: Base64 encoded certificate +- `ssl.cert.type`: certificate type, `X.509` by default +- `ssl.cert.alias`: certificate alias name, `arangodb` by default +- `ssl.algorithm`: trust manager algorithm, `SunX509` by default +- `ssl.keystore.type`: keystore type, `jks` by default +- `ssl.protocol`: SSLContext protocol, `TLS` by default +- `ssl.trustStore.path`: trust store path +- `ssl.trustStore.password`: trust store password + +### SSL + +To use TLS-secured connections to ArangoDB, set `ssl.enabled` to `true` and +configure the certificate to use. This can be achieved in one of the following ways: + +- Provide the Base64-encoded certificate as the `ssl.cert.value` configuration entry: + + ```scala + val spark: SparkSession = SparkSession.builder() + // ... + .config("ssl.enabled", "true") + .config("ssl.cert.value", "<Base64-encoded certificate>") + .getOrCreate() + ``` + +- Set the trust store to use in the `ssl.trustStore.path` configuration entry and + optionally set `ssl.trustStore.password`: + + ```scala + val spark: SparkSession = SparkSession.builder() + // ... + .config("ssl.enabled", "true") + .config("ssl.trustStore.path", "<trustStore path>") + .config("ssl.trustStore.password", "<trustStore password>") + .getOrCreate() + ``` + +- Start the Spark driver and workers with a properly configured trust store: + + ```scala + val spark: SparkSession = SparkSession.builder() + // ... + .config("ssl.enabled", "true") + .getOrCreate() + ``` + + Set the following in the Spark configuration file: + + ```properties + spark.executor.extraJavaOptions=-Djavax.net.ssl.trustStore=<trustStore path> -Djavax.net.ssl.trustStorePassword=<trustStore password> + spark.driver.extraJavaOptions=-Djavax.net.ssl.trustStore=<trustStore path> -Djavax.net.ssl.trustStorePassword=<trustStore password> + ``` + + Alternatively, you can set this in the command-line when submitting the Spark job: + + ```sh + ./bin/spark-submit \ + --conf "spark.driver.extraJavaOptions=-Djavax.net.ssl.trustStore=<trustStore path> -Djavax.net.ssl.trustStorePassword=<trustStore password>" \ + --conf "spark.executor.extraJavaOptions=-Djavax.net.ssl.trustStore=<trustStore path> -Djavax.net.ssl.trustStorePassword=<trustStore password>" \ + ... + ``` + +### Supported deployment topologies + +The connector can work with a single server, a cluster and active failover deployments of ArangoDB. + +## Batch Read + +The connector implements support for batch reading from an ArangoDB collection. + +```scala +val df: DataFrame = spark.read + .format("com.arangodb.spark") + .options(options) // Map[String, String] + .schema(schema) // StructType + .load() +``` + +The connector can read data from: +- a collection +- an AQL cursor (query specified by the user) + +When reading data from a **collection**, the reading job is split into many Spark tasks, one for each shard in the ArangoDB source collection. The resulting Spark DataFrame has the same number of partitions as the number of shards in the ArangoDB collection, each one containing data from the respective collection shard. The reading tasks consist of AQL queries that are load balanced across all the available ArangoDB Coordinators. Each query is related to only one shard, therefore it will be executed locally in the DB-Server holding the related shard. + +When reading data from an **AQL cursor**, the reading job cannot be partitioned or parallelized, so it will be less scalable. This mode can be used for reading data coming from different tables, i.e. resulting from an AQL traversal query. + +**Example** + +```scala +val spark: SparkSession = SparkSession.builder() + .appName("ArangoDBSparkDemo") + .master("local[*]") + .config("spark.driver.host", "127.0.0.1") + .getOrCreate() + +val df: DataFrame = spark.read + .format("com.arangodb.spark") + .options(Map( + "password" -> "test", + "endpoints" -> "c1:8529,c2:8529,c3:8529", + "table" -> "users" + )) + .schema(new StructType( + Array( + StructField("likes", ArrayType(StringType, containsNull = false)), + StructField("birthday", DateType, nullable = true), + StructField("gender", StringType, nullable = false), + StructField("name", StructType( + Array( + StructField("first", StringType, nullable = true), + StructField("last", StringType, nullable = false) + ) + ), nullable = true) + ) + )) + .load() + +usersDF.filter(col("birthday") === "1982-12-15").show() +``` + +### Read Configuration + +- `database`: database name, `_system` by default +- `table`: datasource ArangoDB collection name, ignored if `query` is specified. Either `table` or `query` is required. +- `query`: custom AQL read query. If set, `table` will be ignored. Either `table` or `query` is required. +- `batchSize`: reading batch size, `10000` by default +- `sampleSize`: sample size prefetched for schema inference, only used if read schema is not provided, `1000` by default +- `fillBlockCache`: specifies whether the query should store the data it reads in the RocksDB block cache (`true` or `false`), `false` by default +- `stream`: specifies whether the query should be executed lazily, `true` by default +- `ttl`: cursor time to live in seconds, `30` by default +- `mode`: allows setting a mode for dealing with corrupt records during parsing: + - `PERMISSIVE` : win case of a corrupted record, the malformed string is put into a field configured by + `columnNameOfCorruptRecord`, and sets malformed fields to null. To keep corrupt records, a user can set a string + type field named `columnNameOfCorruptRecord` in a user-defined schema. If a schema does not have the field, it drops + corrupt records during parsing. When inferring a schema, it implicitly adds the `columnNameOfCorruptRecord` field in + an output schema + - `DROPMALFORMED`: ignores the whole corrupted records + - `FAILFAST`: throws an exception in case of corrupted records +- `columnNameOfCorruptRecord`: allows renaming the new field having malformed string created by the `PERMISSIVE` mode + +### Predicate and Projection Pushdown + +The connector can convert some Spark SQL filter predicates into AQL predicates and push their execution down to the data source. In this way, ArangoDB can apply the filters and return only the matching documents. + +The following filter predicates (implementations of `org.apache.spark.sql.sources.Filter`) are pushed down: +- `And` +- `Or` +- `Not` +- `EqualTo` +- `EqualNullSafe` +- `IsNull` +- `IsNotNull` +- `GreaterThan` +- `GreaterThanOrEqualFilter` +- `LessThan` +- `LessThanOrEqualFilter` +- `StringStartsWithFilter` +- `StringEndsWithFilter` +- `StringContainsFilter` +- `InFilter` + +Furthermore, the connector will push down the subset of columns required by the Spark query, so that only the relevant documents fields will be returned. + +Predicate and projection pushdowns are only performed while reading an ArangoDB collection (set by the `table` configuration parameter). In case of a batch read from a custom query (set by the `query` configuration parameter), no pushdown optimizations are performed. + +### Read Resiliency + +The data of each partition is read using an AQL cursor. If any error occurs, the read task of the related partition will fail. Depending on the Spark configuration, the task could be retried. + +## Batch Write + +The connector implements support for batch writing to ArangoDB collection. + +```scala +import org.apache.spark.sql.DataFrame + +val df: DataFrame = //... +df.write + .format("com.arangodb.spark") + .mode(SaveMode.Append) + .options(Map( + "password" -> "test", + "endpoints" -> "c1:8529,c2:8529,c3:8529", + "table" -> "users" + )) + .save() +``` + +Write tasks are load balanced across the available ArangoDB Coordinators. The data saved into the ArangoDB is sharded according to the related target collection definition and is different from the Spark DataFrame partitioning. + +### SaveMode + +On writing, `org.apache.spark.sql.SaveMode` is used to specify the expected behavior in case the target collection already exists. + +The following save modes are supported: +- `Append`: the target collection is created, if it does not exist. +- `Overwrite`: the target collection is created, if it does not exist, otherwise it is truncated. Use it in combination with the + `confirmTruncate` write configuration parameter. + +Save modes `ErrorIfExists` and `Ignore` behave the same as `Append`. + +Use the `overwriteMode` write configuration parameter to specify the document overwrite behavior (if a document with the same `_key` already exists). + +### Write Configuration + +- `database`: database name, `_system` by default +- `table`: target ArangoDB collection name (required) +- `batchSize`: writing batch size, `10000` by default +- `byteBatchSize`: byte batch size threshold, only considered for `contentType=json`, `8388608` by default (8 MB) +- `table.shards`: number of shards of the created collection (in case of the `Append` or `Overwrite` SaveMode) +- `table.type`: type (`document` or `edge`) of the created collection (in case of the `Append` or `Overwrite` SaveMode), `document` by default +- `waitForSync`: specifies whether to wait until the documents have been synced to disk (`true` or `false`), `false` by default +- `confirmTruncate`: confirms to truncate table when using the `Overwrite` SaveMode, `false` by default +- `overwriteMode`: configures the behavior in case a document with the specified `_key` value already exists. It is only considered for `Append` SaveMode. + - `ignore` (default for SaveMode other than `Append`): it will not be written + - `replace`: it will be overwritten with the specified document value + - `update`: it will be patched (partially updated) with the specified document value. The overwrite mode can be + further controlled via the `keepNull` and `mergeObjects` parameter. `keepNull` will also be automatically set to + `true`, so that null values are kept in the saved documents and not used to remove existing document fields (as for + default ArangoDB upsert behavior). + - `conflict` (default for the `Append` SaveMode): return a unique constraint violation error so that the insert operation fails +- `mergeObjects`: in case `overwriteMode` is set to `update`, controls whether objects (not arrays) will be merged. + - `true` (default): objects will be merged + - `false`: existing document fields will be overwritten +- `keepNull`: in case `overwriteMode` is set to `update` + - `true` (default): `null` values are saved within the document (by default) + - `false`: `null` values are used to delete the corresponding existing attributes +- `retry.maxAttempts`: max attempts for retrying write requests in case they are idempotent, `10` by default +- `retry.minDelay`: min delay in ms between write requests retries, `0` by default +- `retry.maxDelay`: max delay in ms between write requests retries, `0` by default + +### Write Resiliency + +The data of each partition is saved in batches using the ArangoDB API for +[inserting multiple documents](../http-api/documents.md#multiple-document-operations). +This operation is not atomic, therefore some documents could be successfully written to the database, while others could fail. To make the job more resilient to temporary errors (i.e. connectivity problems), in case of failure the request will be retried (with another Coordinator), if the provided configuration allows idempotent requests, namely: +- the schema of the dataframe has a **not nullable** `_key` field and +- `overwriteMode` is set to one of the following values: + - `replace` + - `ignore` + - `update` with `keep.null=true` + +A failing batch-saving request is retried once for every Coordinator. After that, if still failing, the write task for the related partition is aborted. According to the Spark configuration, the task can be retried and rescheduled on a different executor, if the provided write configuration allows idempotent requests (as described above). + +If a task ultimately fails and is aborted, the entire write job will be aborted as well. Depending on the `SaveMode` configuration, the following cleanup operations will be performed: +- `Append`: no cleanup is performed and the underlying data source may require manual cleanup. + `DataWriteAbortException` is thrown. +- `Overwrite`: the target collection will be truncated. +- `ErrorIfExists`: the target collection will be dropped. +- `Ignore`: if the collection did not exist before, it will be dropped; otherwise, nothing will be done. + +### Write requirements + +When writing to an edge collection (`table.type=edge`), the schema of the Dataframe being written must have: +- a non nullable string field named `_from`, and +- a non nullable string field named `_to` + +### Write Limitations + +- Batch writes are not performed atomically, so sometimes (i.e. in case of `overwrite.mode: conflict`) several documents in the batch may be written and others may return an exception (i.e. due to a conflicting key). +- Writing records with the `_key` attribute is only allowed on collections sharded by `_key`. +- In case of the `Append` save mode, failed jobs cannot be rolled back and the underlying data source may require manual cleanup. +- Speculative execution of tasks only works for idempotent write configurations. See [Write Resiliency](#write-resiliency) for more details. +- Speculative execution of tasks can cause concurrent writes to the same documents, resulting in write-write conflicts or lock timeouts + +## Mapping Configuration + +Serialization and deserialization of Spark Dataframe Row to and from JSON (or Velocypack) can be customized using the following options: +- `ignoreNullFields`: whether to ignore null fields during serialization, `false` by default (only supported in Spark 3.x) + +## Supported Spark data types + +The following Spark SQL data types (subtypes of `org.apache.spark.sql.types.Filter`) are supported for reading, writing and filter pushdown. + +- Numeric types: + - `ByteType` + - `ShortType` + - `IntegerType` + - `LongType` + - `FloatType` + - `DoubleType` + +- String types: + - `StringType` + +- Boolean types: + - `BooleanType` + +- Datetime types: + - `TimestampType` + - `DateType` + +- Complex types: + - `ArrayType` + - `MapType` (only with key type `StringType`) + - `StructType` + +## Connect to the Arango Managed Platform (AMP) + +To connect to SSL secured deployments using X.509 Base64 encoded CA certificate (AMP): + +```scala +val options = Map( + "database" -> "<dbname>", + "user" -> "<username>", + "password" -> "<passwd>", + "endpoints" -> "<endpoint>:<port>", + "ssl.cert.value" -> "<base64 encoded CA certificate>", + "ssl.enabled" -> "true", + "table" -> "<table>" +) + +// read +val myDF = spark.read + .format("com.arangodb.spark") + .options(options) + .load() + +// write +import org.apache.spark.sql.DataFrame +val df: DataFrame = //... +df.write + .format("com.arangodb.spark") + .options(options) + .save() +``` + +## Current limitations + +- For `contentType=vpack`, implicit deserialization casts don't work well, i.e. + reading a document having a field with a numeric value whereas the related + read schema requires a string value for such a field. +- Dates and timestamps fields are interpreted to be in a UTC time zone. +- In read jobs using `stream=true` (default), possible AQL warnings are only + logged at the end of each read task (BTS-671). +- Spark SQL `DecimalType` fields are not supported in write jobs when using `contentType=json`. +- Spark SQL `DecimalType` values are written to the database as strings. +- `byteBatchSize` is only considered for `contentType=json` (DE-226) + +## Demo + +Check out our [demo](https://github.com/arangodb/arangodb-spark-datasource/tree/main/demo) +to learn more about ArangoDB Datasource for Apache Spark. diff --git a/site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md b/site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md new file mode 100644 index 0000000000..56fb0ba16f --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/_index.md @@ -0,0 +1,283 @@ +--- +title: Kafka Connect ArangoDB Sink Connector +menuTitle: Kafka Connector +weight: 20 +description: >- + The Kafka connector allows you to export data from Apache Kafka to ArangoDB + by writing data from one or more topics in Kafka to a collection in ArangoDB +--- +{{< info >}} +Check out the [connector demo](https://github.com/arangodb/kafka-connect-arangodb/tree/main/demo) +to learn more about the connector. +{{< /info >}} + +## Supported versions + +This connector is compatible with: + +- Kafka 3.4 and higher versions +- JDK 8 and higher versions +- ArangoDB 3.11.1 and higher versions + +## Installation + +Download the Jar file from [Maven Central](https://repo1.maven.org/maven2/com/arangodb/kafka-connect-arangodb) +and copy it into one of the directories that are listed in the Kafka Connect +worker's `plugin.path` configuration property. This must be done on each of the +installations where Kafka Connect will be run. + +Once installed, you can then create a connector configuration file with the +connector's settings, and deploy that to a Connect worker. +See the [configuration](configuration.md) documentation for +the available options. + +For more detailed plugin installation instructions, see the +[Confluent Documentation](https://docs.confluent.io/platform/current/connect/userguide.html#connect-installing-plugins). + +## Connection handling + +Task connections to the database are evenly distributed across all available +ArangoDB Coordinators. If a connectivity error occur, a connection is +re-established with a different Coordinator. + +Available Coordinators can be periodically monitored by setting +`connection.acquireHostList.enabled` to `true` and optionally configuring the +monitoring interval. + +Over time, due to connection failovers, the distribution of task connections +across the Coordinators may become uneven. To address this, connections are +periodically re-balanced across the available Coordinators. The rebalancing +interval can be configured via the `connection.rebalance.interval.ms` property. +The default is 30 minutes. + +## Delivery guarantees + +This connector guarantees that each record in the Kafka topic is delivered at +least once. For example, the same record could be delivered multiple times in +the following scenarios: + +- Transient errors in the communication between the connector and the + database system, leading to [retries](#retries) +- Errors in the communication between the connector and Kafka, preventing to + commit offsets of already written records +- Abrupt termination of connector task + +When restarted, the connector resumes reading from the Kafka topic at an offset +prior to where it stopped. As a result, at least in the cases mentioned above, +some records might get written to ArangoDB more than once. Even if configured +for idempotent writes (e.g. with `insert.overwriteMode=replace`), writing the +same record multiple times still updates the `_rev` field of the document. + +Note that in case of retries, [Ordering Guarantees](#ordering-guarantees) +are still provided. + +To improve the likelihood that every write survives even in case of a DB-Server +failover, consider configuring the configuration property `insert.waitForSync` +(default `false`), which determines whether the write operations are synced +to disk before returning. + +## Error handling + +The connector categorizes all the possible errors into two types, +data errors and transient errors. + +### Data errors + +Data errors are unrecoverable and caused by the data being processed. +For example: + +- Conversion errors: + - Illegal key type + - Illegal value type +- Server validation errors: + - Illegal `_key`, `_from`, `_to` values + - JSON schema validation errors +- Server constraints violations + - Unique index violations + - Key conflicts (in case of `insert.overwriteMode=conflict`) + +The configuration property `data.errors.tolerance` allows you to configure the +behavior for tolerating data errors: + +- `none`: data errors result in an immediate connector task failure (default) +- `all`: changes the behavior to skip over records generating data errors. + If DLQ is configured, then the record is reported + (see [Dead Letter Queue](#dead-letter-queue)). + +Data errors detection can be further customized via the `extra.data.error.nums` +configuration property. In addition to the cases listed above, the server errors +reporting `errorNums` listed by this configuration property are considered +data errors. + +### Transient errors + +Transient errors are recoverable and may succeed if retried with some delay +(see [Retries](#retries)). If all retries fail, then the connector task fails. + +All errors that are not data errors are considered transient errors. + +## Retries + +In case of transient errors, the [`max.retries` configuration property](configuration.md#maxretries) +determines how many times the connector retries. + +The [`retry.backoff.ms` configuration property](configuration.md#retrybackoffms) +allows you to set the time in milliseconds to wait following an error before a +retry attempt is made. + +Data errors are never retried. + +## Dead Letter Queue + +This connector supports the Dead Letter Queue (DLQ) functionality. +For information about accessing and using the DLQ, +see [Confluent Platform Dead Letter Queue](https://docs.confluent.io/platform/current/connect/concepts.html#dead-letter-queue). + +Only data errors can be reported to the DLQ. Transient errors, after potential +retries, always make the task fail. + +You can enable DLQ support for data errors by setting `data.errors.tolerance=all` +and `errors.deadletterqueue.topic.name`. + +## Multiple tasks + +The connector can scale out by running multiple tasks in parallel as specified by the +[`tasks.max`](https://docs.confluent.io/platform/current/installation/configuration/connect/sink-connect-configs.html#tasks-max) +configuration parameter. In this case, each connector task handles the records +from different Kafka topics partitions. + +## Data mapping + +The sink connector optionally supports schemas. For example, the Avro converter +that comes with Schema Registry, the JSON converter with schemas enabled, or the +Protobuf converter. + +Kafka record keys and Kafka record value field `_key`, if present, must be a +primitive type of either: + +- `string` +- `integral numeric` (integer) + +The record value must be either: + +- `struct` (Kafka Connect structured record) +- `map` +- `null` (tombstone record) + +Record values are converted to JSON objects using Kafka Connect `JsonConverter`, +ensuring compatibility with Kafka Connect data types and support to schemas. +If the data in the topic is not of a compatible format, applying an +[SMT](https://docs.confluent.io/platform/current/connect/transforms/overview.html) +or implementing a custom converter may be necessary. + +## Key handling + +The `_key` of the documents inserted into ArangoDB is derived in the following way: + +1. Use the Kafka record value field `_key` if present and not null, else +2. Use the Kafka record key if not null, else +3. Use the Kafka record coordinates (`topic-partition-offset`) + +## Delete mode + +The connector can delete documents in a database collection when it consumes a +tombstone record, which is a Kafka record that has a non-null key and a null value. +This behavior is disabled by default, meaning that any tombstone records results +in a failure of the connector. + +You can enable deletes with `delete.enabled=true`. + +Delete operations are idempotent and do not throw errors if the target document +does not exist. + +Enabling delete mode does not affect the `insert.overwriteMode`. + +## Write modes + +The `insert.overwriteMode` configuration parameter allow you to set the write +behavior in case a document with the same `_key` already exists: + +- `conflict`: the new document value is not written and an exception is thrown (default) +- `ignore`: the new document value is not written +- `replace`: the existing document is overwritten with the new document value +- `update`: the existing document is patched (partially updated) with the new document value + +## Idempotent writes + +All the write modes supported are idempotent, with the exception that the +document revision field (`_rev`) changes every time a document is written. See +[Document revisions](../../../concepts/data-structure/documents/_index.md#document-revisions) +for more details. + +If there are failures, the Kafka offset used for recovery may not be up-to-date +with what was committed as of the time of the failure, which can lead to +re-processing during recovery. In case of `insert.overwriteMode=conflict` (default), +this can lead to constraint violations errors if records need to be re-processed. + +## Ordering guarantees + +Kafka records in the same Kafka topic partition that are mapped to documents with the +same `_key` (see [Key handling](#key-handling)) are written to ArangoDB in the +same order as they are in the Kafka topic partition. + +The order of the writes for records in the same Kafka partition that are mapped +to documents with different `_key` is not guaranteed. + +The order between writes for records in different Kafka partitions is not guaranteed. + +To guarantee documents in ArangoDB are eventually consistent with the records in +the Kafka topic, it is recommended deriving the document `_key` from Kafka +record keys and using a key-based partitioner that assigns the same partition to +records with the same key (i.e. Kafka default partitioner). + +Otherwise, in case the document `_key` is assigned from Kafka record value field +`_key`, the same could be achieved using a field partitioner on `_key`. + +When restarted, the connector may resume reading from the Kafka topic at an offset +prior to where it stopped. This can lead to reprocessing of batches containing +multiple Kafka records that are mapped to documents with the same `_key`. +In such case, it is possible to observe the related document in the database +being temporarily updated to older versions and eventually to newer ones. + +## Monitoring + +The Kafka Connect framework exposes basic status information over a REST interface. +Fine-grained metrics, including the number of processed messages and the rate of +processing, are available via JMX. For more information, see +[Monitoring Kafka Connect and Connectors](https://docs.confluent.io/current/connect/managing/monitoring.html) +(published by Confluent, but equally applies to a standard Apache Kafka distribution). + +## SSL + +To connect to ArangoDB using an SSL connection, you must set the `ssl.enabled` +configuration property to `true`. + +### Certificate from file + +The connector can load the trust store to be used from file. The following +configuration properties can be used: + +- `ssl.truststore.location`: the location of the trust store file +- `ssl.truststore.password`: the password for the trust store file + +Note that the trust store file path needs to be accessible at the same given +location from all Kafka Connect workers. + +### Certificate from configuration property value + +The connector can accept the SSL certificate value from configuration property +encoded as Base64 string. The following configuration properties can be used: + +- `ssl.cert.value`: Base64-encoded SSL certificate + +See [SSL configuration](configuration.md#ssl) for further options. + +## Limitations + +- Record values are required to be object-like structures (DE-644) +- Auto-creation of ArangoDB collection is not supported (DE-653) +- Batch writes are not guaranteed to be executed serially (FRB-300) +- Batch writes may succeed for some documents while failing for others (FRB-300) + This has two important consequences: + - Transient errors might be retried and succeed at a later point + - Data errors might be asynchronously reported to the DLQ diff --git a/site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md b/site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md new file mode 100644 index 0000000000..9cc49daa40 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/kafka-connect-arangodb-sink-connector/configuration.md @@ -0,0 +1,244 @@ +--- +title: ArangoDB Sink Connector Configuration Properties +menuTitle: Configuration +weight: 5 +description: '' +--- +## Connection + +### connection.endpoints + +- type: _list_ + +Database connection endpoints as comma separated list of `host:port` entries. +For example: `coordinator1:8529,coordinator2:8529`. + +### connection.user + +- type: _string_ +- default: `root` + +Database connection user. + +### connection.password + +- type: _string_ + +Database connection password. + +### connection.database + +- type: _string_ +- default: `_system` + +Target database name. + +### connection.collection + +- type: _string_ + +Target collection name. + +### connection.acquireHostList.enabled + +- type: _boolean_ +- default: `false` + +Periodically acquire the list of all known ArangoDB hosts in the cluster and +trigger tasks reconfiguration in case of changes. + +### connection.acquireHostList.interval.ms + +- type: _int_ +- default: `60_000` + +Interval for acquiring the host list. + +### connection.rebalance.interval.ms + +- type: _int_ +- default: `1_800_000` (30 min) + +Interval for re-balancing the connections across the endpoints. + +### connection.protocol + +- type: _string_ +- default: `HTTP2` + +Communication protocol: + +- `VST` +- `HTTP11` +- `HTTP2` + +### connection.content.type + +- type: _string_ +- default: `JSON` + +Communication content type: + +- `JSON` +- `VPACK` + +## SSL + +### ssl.enabled + +- type: _boolean_ +- default: `false` + +SSL secured driver connection. + +### ssl.cert.value + +- type: _string_ + +Base64 encoded SSL certificate. + +### ssl.cert.type + +- type: _string_ +- default: `X.509` + +Certificate type. + +### ssl.cert.alias + +- type: _string_ +- default: `arangodb` + +Certificate alias name. + +### ssl.algorithm + +- type: _string_ +- default: `SunX509` + +Trust manager algorithm. + +### ssl.keystore.type + +- type: _string_ +- default: `jks` + +Keystore type. + +### ssl.protocol + +- type: _string_ +- default: `TLS` + +SSLContext protocol. + +### ssl.hostname.verification + +- type: _boolean_ +- default: `true` + +SSL hostname verification. + +### ssl.truststore.location + +- type: _string_ + +The location of the trust store file. + +### ssl.truststore.password + +- type: _string_ + +The password for the trust store file. + +## Writes + +### insert.overwriteMode + +- type: _string_ +- default: `conflict` + +The overwrite mode to use in case a document with the specified `_key` value +already exists: + +- `conflict`: the new document value is not written and an exception is thrown. +- `ignore`: the new document value is not written. +- `replace`: the existing document is overwritten with the new document value. +- `update`: the existing document is patched (partially updated) with the new + document value. The behavior can be further controlled with the + `insert.mergeObjects` setting. + +### insert.mergeObjects + +- type: _boolean_ +- default: `true` + +Whether objects (not arrays) are merged, in case `insert.overwriteMode` is set +to `update`: + +- `true`: objects are merged +- `false`: existing document fields are overwritten + +### batch.size + +- type: _int_ +- default: `3_000` + +Specifies how many records to attempt to batch together for insertion or deletion +into the destination collection. + +### insert.timeout.ms + +- type: _int_ +- default: `30_000` + +Connect and request timeout in ms. + +### insert.waitForSync + +- type: _boolean_ +- default: `false` + +Whether to wait until the documents have been synced to disk. + +### delete.enabled + +- type: _boolean_ +- default: `false` + +Whether to enable delete behavior when processing tombstones. + +## Error handling + +### data.errors.tolerance + +- type: _string_ +- default: `none` + +Whether data errors are tolerated during connector operation. + +- `none`: data errors result in an immediate connector task failure +- `all`: changes the behavior to skip over records generating data errors. + If DLQ is configured, then the record is reported. + +### extra.data.error.nums + +- type: _list_ + +Additional server `errorNums` to be considered data errors. + +## Retries + +### max.retries + +- type: _int_ +- default: `10` + +The maximum number of times to retry transient errors. + +### retry.backoff.ms + +- type: _int_ +- default: `3_000` + +The time in milliseconds to wait following an error before a retry attempt is made. diff --git a/site/content/arangodb/oem/develop/integrations/spring-boot-arangodb.md b/site/content/arangodb/oem/develop/integrations/spring-boot-arangodb.md new file mode 100644 index 0000000000..4633df80a8 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-boot-arangodb.md @@ -0,0 +1,1507 @@ +--- +title: Spring Boot Starter ArangoDB +menuTitle: Spring Boot Starter +weight: 7 +description: >- + The Spring Boot Starter for ArangoDB is a set of convenient dependency descriptors + that you can include in your application based on the Spring framework +--- +- [Repository](https://github.com/arangodb/spring-boot-starter) +- [Demo](https://github.com/arangodb/spring-boot-starter/tree/main/demo) + +## Supported versions + +Spring Boot Starter ArangoDB is compatible with all supported versions of ArangoDB. +For more information, see the [End-of-life announcements](https://www.arangodb.com/subscriptions/end-of-life-notice/). + +This integration has multiple versions released, and each one is compatible with +the corresponding versions of Spring Boot, Spring Framework, Spring Data ArangoDB, +and ArangoDB Java Driver: + +| Spring Boot Starter ArangoDB | Spring Boot | Spring Framework | Spring Data ArangoDB | ArangoDB Java Driver | +|------------------------------|-------------|------------------|----------------------|----------------------| +| 3.3-x | 3.3 | 6.1 | 4.2 | 7.7 | +| 3.2-x | 3.2 | 6.1 | 4.2 | 7.7 | + +Note that the adopted versioning scheme does not honor the semantic versioning +rules, i.e. minor or patch releases may introduce new features or breaking +changes. Please refer to [releases](https://github.com/arangodb/spring-boot-starter/releases) +for details. + +## Get started + +This is an extensive demo on how to use +[Spring Data ArangoDB](https://github.com/arangodb/spring-data) with an example +dataset of **Game of Thrones** characters and locations. + +### Build a project with Maven + +First, you have to set up a project and add every needed dependency. +This demo use Maven and Spring Boot and adds `arangodb-spring-boot-starter` to +auto-configure Spring Data ArangoDB. + +Create a Maven `pom.xml`: + +```xml +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>x.y.z</version> + <relativePath/> <!-- lookup parent from repository --> + </parent> + + <groupId>com.arangodb</groupId> + <artifactId>spring-data-arangodb-tutorial</artifactId> + <version>1.0.0</version> + + <name>demo</name> + <description>Demo project for Spring Boot</description> + + <properties> + <java.version>17</java.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter</artifactId> + </dependency> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-spring-boot-starter</artifactId> + <version>x.y.z</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + </plugin> + </plugins> + </build> + +</project> +``` + +Substitute `x.y.z` with the latest available versions that are compatible. +See the [Supported versions](#supported-versions) for details. +You may also adjust the Java version. + +### Monitor the server health + +ArangoDB health monitoring can be applied to your application by adding +`spring-boot-starter-actuator` to your project and calling the +`GET /actuator/health` endpoint against your application. + +```xml +<dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> +</dependency> +``` + +### Create an Application class + +After you have ensured that you can fetch all the necessary dependencies, you +can create your first classes. + +The `DemoApplication` class is the main class where you later add certain +`CommandLineRunner` instances to be executed. + +```java +package com.arangodb.spring.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + public static void main(final String... args) { + Class<?>[] runner = new Class<?>[]{}; + System.exit(SpringApplication.exit(SpringApplication.run(runner, args))); + } +} +``` + +### Application configuration + +You need to provide the configuration for the database connection. +You can do this by adding to `src/main/resources/application.properties` +with the properties of +[ArangoProperties](https://github.com/arangodb/spring-boot-starter/blob/main/src/main/java/com/arangodb/springframework/boot/autoconfigure/ArangoProperties.java). + +``` +arangodb.spring.data.database=spring-demo +arangodb.spring.data.user=root +arangodb.spring.data.password=test +arangodb.spring.data.hosts=localhost:8529 +``` + +## Data modeling + +Create your first bean representing a collection in your database. With the +`@Document` annotation, you define the collection as a document collection. +In this case, the alternative name characters for the collection are also defined. +By default, the collection name is determined by the class name. `@Document` +also provides additional options for the collection, which is used at the +creation time of the collection. + +Because many operations on documents require a document handle, it's recommended +to add a field of type `String` annotated with `@Id` to every entity. The name +doesn't matter. It's further recommended to **not set or change** the id by hand. + +```java +package com.arangodb.spring.demo.entity; + +import com.arangodb.springframework.annotation.Document; +import org.springframework.data.annotation.Id; + +@Document("characters") +public class Character { + + @Id // db document field: _key + private String id; + + @ArangoId // db document field: _id + private String arangoId; + + private String name; + private String surname; + private boolean alive; + private Integer age; + + public Character() { + super(); + } + + public Character(final String name, final String surname, final boolean alive) { + super(); + this.name = name; + this.surname = surname; + this.alive = alive; + } + + public Character(final String name, final String surname, final boolean alive, final Integer age) { + super(); + this.name = name; + this.surname = surname; + this.alive = alive; + this.age = age; + } + + // getter & setter + + @Override + public String toString() { + return "Character [id=" + id + ", name=" + name + ", surname=" + surname + ", alive=" + alive + ", age=" + age + "]"; + } + +} +``` + +## CRUD operations + +### Create a repository + +Now that you have your data model, you want to store data. For this, you create +a repository interface which extends `ArangoRepository`. This gives you access +to CRUD operations, paging, and query by example mechanics. + +```java +package com.arangodb.spring.demo.repository; + +import com.arangodb.spring.demo.entity.Character; +import com.arangodb.springframework.repository.ArangoRepository; + +public interface CharacterRepository extends ArangoRepository<Character, String> { + +} +``` + +### Create a CommandLineRunner + +To run your demo with Spring Boot, you have to create a class implementing +`CommandLineRunner`. In this class, you can use the `@Autowired` annotation to +inject your `CharacterRepository` – created one step earlier – and also +`ArangoOperations` which offers a central support for interactions with the +database over a rich feature set. It mostly offers the features from the +[ArangoDB Java driver](https://github.com/arangodb/arangodb-java-driver) +with additional exception translation. + +To get the injection successfully running, you have to add `@ComponentScan` to your +runner to define where Spring can find your configuration class `DemoConfiguration`. + +```java +package com.arangodb.spring.demo.runner; + +import com.arangodb.spring.demo.repository.CharacterRepository; +import com.arangodb.springframework.core.ArangoOperations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan("com.arangodb.spring.demo") +public class CrudRunner implements CommandLineRunner { + + @Autowired + private ArangoOperations operations; + @Autowired + private CharacterRepository repository; + + @Override + public void run(final String... args) throws Exception { + + } +} +``` + +### Save and read an entity + +It's time to save your first entity in the database. Both the database and the +collection don't have to be created manually. This happens automatically as soon +as you execute a database request with the components involved. You don't have +to leave the Java world to manage your database. + +After you saved a character in the database, the id in the original entity is +updated with the one generated from the database. You can then use this id to +find your persisted entity. + +```java +package com.arangodb.spring.demo.runner; + +import com.arangodb.spring.demo.entity.Character; +import com.arangodb.spring.demo.repository.CharacterRepository; +import com.arangodb.springframework.core.ArangoOperations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.ComponentScan; + +import java.util.Optional; + +@ComponentScan("com.arangodb.spring.demo") +public class CrudRunner implements CommandLineRunner { + + @Autowired + private ArangoOperations operations; + @Autowired + private CharacterRepository repository; + + @Override + public void run(String... args) throws Exception { + // first drop the database so that we can run this multiple times with the same dataset + operations.dropDatabase(); + + // save a single entity in the database + // there is no need of creating the collection first. This happen automatically + final Character nedStark = new Character("Ned", "Stark", true, 41); + repository.save(nedStark); + // the generated id from the database is set in the original entity + System.out.println(String.format("Ned Stark saved in the database with id: '%s'", nedStark.getId())); + + // let us take a look whether we can find Ned Stark in the database + final Optional<Character> foundNed = repository.findById(nedStark.getId()); + assert foundNed.isPresent(); + System.out.println(String.format("Found %s", foundNed.get())); + } +} +``` + +### Run the demo + +The last thing you have to do before you can successfully run your demo +application is to add your command line runner `CrudRunner` to the list of +runners in your main class `DemoApplication`. + +```java +Class<?>[]runner = new Class<?>[]{CrudRunner.class}; +``` + +After executing the demo application, you should see the following lines within +your console output. The id will of course deviate. + +``` +Ned Stark saved in the database with id: '346' +Found Character [id=346, name=Ned, surname=Stark, alive=true, age=41] +``` + +### Update an entity + +As everyone probably knows, Ned Stark died in the first season of Game of Thrones. +So, you should to update his 'alive' flag. Thanks to the `id` field in the +`Character` class, you can use the `save()` method of the repository to perform +an upsert with the variable `nedStark` in which `id` is already set. + +Add the following lines of code to the end of our `run()` method in `CrudRunner`: + +```java +nedStark.setAlive(false); +repository.save(nedStark); +final Optional<Character> deadNed = repository.findById(nedStark.getId()); +assert deadNed.isPresent(); +System.out.println(String.format("The 'alive' flag of the persisted Ned Stark is now '%s'",deadNed.get().isAlive())); +``` + +If you run the demo a second time, the console output should look like this: + +``` +Ned Stark saved in the database with id: '508' +Found Character [id=508, name=Ned, surname=Stark, alive=true, age=41] +The 'alive' flag of the persisted Ned Stark is now 'false' +``` + +### Save and read multiple entities + +What you can do with a single entity, you can also do with multiple entities. +It's not just a single method call for convenience purpose, it also requires +only one database request. + +The following code is for saving a bunch of characters but only the main cast of +Game of Thrones – that's already a lot. After that, you can fetch all of them +from your collection and count them. + +Extend the `run()` method with these lines of code: + +```java +Collection<Character> createCharacters = createCharacters(); +System.out.println(String.format("Save %s additional characters",createCharacters.size())); +repository.saveAll(createCharacters); + +long count = repository.count(); +System.out.println(String.format("A total of %s characters are persisted in the database", count)); +``` + +You also need the `createCharacters()` method which looks as follow: + +```java +public static Collection<Character> createCharacters(){ + return Arrays.asList( + new Character("Robert","Baratheon",false), + new Character("Jaime","Lannister",true,36), + new Character("Catelyn","Stark",false,40), + new Character("Cersei","Lannister",true,36), + new Character("Daenerys","Targaryen",true,16), + new Character("Jorah","Mormont",false), + new Character("Petyr","Baelish",false), + new Character("Viserys","Targaryen",false), + new Character("Jon","Snow",true,16), + new Character("Sansa","Stark",true,13), + new Character("Arya","Stark",true,11), + new Character("Robb","Stark",false), + new Character("Theon","Greyjoy",true,16), + new Character("Bran","Stark",true,10), + new Character("Joffrey","Baratheon",false,19), + new Character("Sandor","Clegane",true), + new Character("Tyrion","Lannister",true,32), + new Character("Khal","Drogo",false), + new Character("Tywin","Lannister",false), + new Character("Davos","Seaworth",true,49), + new Character("Samwell","Tarly",true,17), + new Character("Stannis","Baratheon",false), + new Character("Melisandre",null,true), + new Character("Margaery","Tyrell",false), + new Character("Jeor","Mormont",false), + new Character("Bronn",null,true), + new Character("Varys",null,true), + new Character("Shae",null,false), + new Character("Talisa","Maegyr",false), + new Character("Gendry",null,false), + new Character("Ygritte",null,false), + new Character("Tormund","Giantsbane",true), + new Character("Gilly",null,true), + new Character("Brienne","Tarth",true,32), + new Character("Ramsay","Bolton",true), + new Character("Ellaria","Sand",true), + new Character("Daario","Naharis",true), + new Character("Missandei",null,true), + new Character("Tommen","Baratheon",true), + new Character("Jaqen","H'ghar",true), + new Character("Roose","Bolton",true), + new Character("The High Sparrow",null,true)); + } +``` + +After executing the demo again, the console should print the following +additional lines: + +``` +Save 42 additional characters +A total of 43 characters are persisted in the database +``` + +### Read with sorting and paging + +Next to the normal `findAll()` method, `ArangoRepository` also offers the +ability to sort the fetched entities by a given field name. Adding the following +source code at the end of your `run()` method gives you all characters sorted by +field `name`: + +```java +System.out.println("## Return all characters sorted by name"); +List<Character> allSorted = repository.findAll(Sort.by(Sort.Direction.ASC, "name")); +allSorted.forEach(System.out::println); +``` + +Furthermore, it's possible to use pagination combined with sorting. With the +following code, you get the first 5 characters sorted by name: + +```java +System.out.println("## Return the first 5 characters sorted by name"); +Page<Character> first5Sorted = repository.findAll(PageRequest.of(0, 5, Sort.by(Sort.Direction.ASC, "name"))); +first5Sorted.forEach(System.out::println); +``` + +Your console output should include Arya Stark, Bran Stark, Brienne Tarth, Bronn +and Catelyn Stark. + +``` +## Return the first 5 characters sorted by name +Character [id=1898, name=Arya, surname=Stark, alive=true, age=11] +Character [id=1901, name=Bran, surname=Stark, alive=true, age=10] +Character [id=1921, name=Brienne, surname=Tarth, alive=true, age=32] +Character [id=1913, name=Bronn, surname=null, alive=true, age=null] +Character [id=1890, name=Catelyn, surname=Stark, alive=false, age=40] +``` + +## Query by example + +Since version 1.12, Spring Data provides the `QueryByExampleExecutor` interface +which is also supported by ArangoDB Spring Data. It allows execution of queries +by `Example` instances. + +Create a new `CommandLineRunner` for this: + +```java +package com.arangodb.spring.demo.runner; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.ExampleMatcher; + +import com.arangodb.spring.demo.entity.Character; +import com.arangodb.spring.demo.repository.CharacterRepository; + +@ComponentScan("com.arangodb.spring.demo") +public class ByExampleRunner implements CommandLineRunner { + + @Autowired + private CharacterRepository repository; + + @Override + public void run(final String... args) throws Exception { + System.out.println("# Query by example"); + } + +} +``` + +Add it to your `DemoApplication`: + +```java +Class<?>[]runner = new Class<?>[]{ + CrudRunner.class, + ByExampleRunner.class +}; +``` + +### Single entity + +First, find Ned Stark again. But this time without knowing the id of the +persisted entity. Start with creating a Character with the same property values +as the searched one. Then create an `Example` instance of it with `Example.of(T) +and search for it with `findOne(Example)` from your `CharacterRepository`: + +```java +final Character nedStark = new Character("Ned", "Stark", false, 41); +System.out.println(String.format("## Find character which exactly match %s",nedStark)); +Optional<Character> foundNedStark = repository.findOne(Example.of(nedStark)); +System.out.println(String.format("Found %s", foundNedStark.get())); +``` + +If you did everything right, the console output should be as follows: + +``` +# Query by example +## Find character which exactly match Character [id=null, name=Ned, surname=Stark, alive=false, age=41] +Found Character [id=1880, name=Ned, surname=Stark, alive=false, age=41] +``` + +### Multiple entities + +Now find more than one entity. A lot of Starks die in Game of Thrones, so take a +look who is already dead. For this, you create a new instance of Character with +`surname` `"Stark"` and `alive` `false`. Because you only need these two fields +in your entity, you have to ignore the other fields in your `ExampleMatcher`. + +```java +System.out.println("## Find all dead Starks"); +Iterable<Character> allDeadStarks = repository.findAll(Example.of(new Character(null, "Stark", false))); +allDeadStarks.forEach(System.out::println); +``` + +After executing the application, the console output should be as follows: + +``` +## Find all dead Starks +Character [id=1887, name=Ned, surname=Stark, alive=false, age=41] +Character [id=1890, name=Catelyn, surname=Stark, alive=false, age=40] +Character [id=1899, name=Robb, surname=Stark, alive=false, age=null] +``` + +In addition to searching for specific values of the example entity, you can +search for dynamically depending values. In the next example, search for a Stark +who is 30 years younger than Ned Stark. Instead of changing the age of Ned Stark +in the previously fetched entity, you use a transformer within the `ExampleMatcher` +and subtract 30 from the age of Ned Stark. + +```java +System.out.println("## Find all Starks which are 30 years younger than Ned Stark"); +Iterable<Character> allYoungerStarks = repository.findAll( + Example.of(foundNedStark.get(), ExampleMatcher.matchingAll() + .withMatcher("surname", GenericPropertyMatcher::exact) + .withIgnorePaths("id", "arangoId", "name", "alive") + .withTransformer("age", age -> age.map(it -> (int) it - 30)))); + allYoungerStarks.forEach(System.out::println); +``` + +Because you are using the entity `foundNedStark` – fetched from the database – +you have to ignore the `id` field which isn't `null` in this case. + +The console output should only include Arya Stark. + +``` +## Find all Starks which are 30 years younger than Ned Stark +Character [id=1898, name=Arya, surname=Stark, alive=true, age=11] +``` + +Aside from searching for exact and transformed values, you can – in case of type +`String`, also search for other expressions. In this last case, search for every +character whose `surname` ends with `"ark"`. The console output should include +every Stark. + +```java +System.out.println("## Find all character which surname ends with 'ark' (ignore case)"); +Iterable<Character> ark = repository.findAll(Example.of(new Character(null, "ark", false), +ExampleMatcher.matchingAll().withMatcher("surname", GenericPropertyMatcher::endsWith) + .withIgnoreCase() + .withIgnorePaths("name", "alive", "age"))); +ark.forEach(System.out::println); +``` + +## Derived queries + +Spring Data ArangoDB supports queries derived from method names by splitting it +into its semantic parts and converting into AQL. The mechanism strips the prefixes +`find..By`, `get..By`, `query..By`, `read..By`, `stream..By`, `count..By`, +`exists..By`, `delete..By`, `remove..By` from the method and parses the rest. +The `By` acts as a separator to indicate the start of the criteria for the query +to be built. You can define conditions on entity properties and concatenate them +with `And` and `Or`. + +You can find the complete list of part types for derived queries in the +[reference documentation](spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md). + +### Simple findBy + +Start with an easy example and find characters based on their `surname`. + +The only thing you have to do is to add a method `findBySurname(String)` to your +`CharacterRepository` with a return type which allows the method to return +multiple instances of `Character`. For more information on which return types are +possible, see the [reference documentation](spring-data-arangodb/reference-version-4/repositories/queries/_index.md#return-types). + +```java +public interface CharacterRepository extends ArangoRepository<Character, String> { + Collection<Character> findBySurname(String surname); +} +``` + +After extending your repository, create a new `CommandLineRunner` and add it to +your `DemoApplication`: + +```java +Class<?>[]runner=new Class<?>[]{ + CrudRunner.class, + ByExampleRunner.class, + DerivedQueryRunner.class +}; +``` + +In the `run()` method, call your new `findBySurname(String)` method and try to +find all characters with the `surname` `"Lannister"`. + +```java +package com.arangodb.spring.demo.runner; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.ComponentScan; + +import com.arangodb.spring.demo.entity.Character; +import com.arangodb.spring.demo.repository.CharacterRepository; + +@ComponentScan("com.arangodb.spring.demo") +public class DerivedQueryRunner implements CommandLineRunner { + + @Autowired + private CharacterRepository repository; + + @Override + public void run(final String... args) throws Exception { + System.out.println("# Derived queries"); + + System.out.println("## Find all characters with surname 'Lannister'"); + Iterable<Character> lannisters = repository.findBySurname("Lannister"); + lannisters.forEach(System.out::println); + } +} +``` + +After executing the demo application, you should see the following lines in +your console output: + +``` +# Derived queries +## Find all characters with surname 'Lannister' +Character [id=238, name=Jaime, surname=Lannister, alive=true, age=36] +Character [id=240, name=Cersei, surname=Lannister, alive=true, age=36] +Character [id=253, name=Tyrion, surname=Lannister, alive=true, age=32] +Character [id=255, name=Tywin, surname=Lannister, alive=false, age=null] +``` + +### Create an index + +Indexes allow fast access to documents, provided the indexed attribute(s) are +used in a query. To make `findBySurname` queries faster, you can create an index +on the `surname` field, adding the `@PersistentIndex` to the `Character` class: + +```java + +@Document("characters") +@PersistentIndex(fields = {"surname"}) +public class Character { +``` + +Next time you run the demo, the related queries benefit from the index and +avoid performing a full collection scan. + +### More complex findBy + +Create some methods with more parts and have a look at how they fit together. +You can use different return types. Again, simply add the methods in your +`CharacterRepository`: + +```java +List<Character> findTop2DistinctBySurnameIgnoreCaseOrderByAgeDesc(String surname); +Collection<Character> findBySurnameEndsWithAndAgeBetweenAndNameInAllIgnoreCase( + String suffix, + int lowerBound, + int upperBound, + String[]nameList); +``` + +Also add the method calls in `DerivedMethodRunner`: + +```java +System.out.println("## Find top 2 Lannnisters ordered by age"); +List<Character> top2 = repository.findTop2DistinctBySurnameIgnoreCaseOrderByAgeDesc("lannister"); +top2.forEach(System.out::println); + +System.out.println("## Find all characters which name is 'Bran' or 'Sansa' and it's surname ends with 'ark' and are between 10 and 16 years old"); +Collection<Character> youngStarks = repository.findBySurnameEndsWithAndAgeBetweenAndNameInAllIgnoreCase("ark", 10, 16, new String[]{"Bran", "Sansa"}); +youngStarks.forEach(System.out::println); +``` + +The new methods produce the following console output: + +``` +## Find top 2 Lannnisters ordered by age +Character [id=444, name=Jaime, surname=Lannister, alive=true, age=36] +Character [id=446, name=Cersei, surname=Lannister, alive=true, age=36] +## Find all characters which name is 'Bran' or 'Sansa' and it's surname ends with 'ark' and are between 10 and 16 years old +Character [id=452, name=Sansa, surname=Stark, alive=true, age=13] +Character [id=456, name=Bran, surname=Stark, alive=true, age=10] +``` + +### Single entity result + +With derived queries, you can not only query for multiple entities, but also for +single entities. If you expect only a single entity as the result, you can use +the corresponding return type. + +Because you have a unique persistent index on the fields `name` and `surname`, +you can expect only a single entity when querying for both. + +For this example, add the method `findByNameAndSurname(String, String)` in +`CharacterRepository`, whose return type is `Optional<Character>`. + +```java +Optional<Character> findByNameAndSurname(String name, String surname); +``` + +Call it from `DerivedMethodRunner`: + +```java +System.out.println("## Find a single character by name & surname"); +Optional<Character> tyrion = repository.findByNameAndSurname("Tyrion", "Lannister"); +tyrion.ifPresent(c -> System.out.println(String.format("Found %s", c))); +``` + +The console output should look like this: + +``` +## Find a single character by name & surname +Found Character [id=974, name=Tyrion, surname=Lannister, alive=true, age=32] +``` + +### countBy + +Aside from `findBy`, there are other supported prefixes like `countBy`. +In comparison to the previously used `operations.collection(Character.class).count();`, +the `countBy` is able to include filter conditions. + +With the following lines of code, you are able to only count characters that +are still alive. + +`CharacterRepository`: + +```java +Integer countByAliveTrue(); +``` + +`DerivedMethodRunner`: + +```java +System.out.println("## Count how many characters are still alive"); +Integer alive = repository.countByAliveTrue(); +System.out.println(String.format("There are %s characters still alive", alive)); +``` + +### removeBy + +The last example for derived queries is `removeBy`. Here, remove all characters +except those whose surname is 'Stark' and who are still alive. + +`CharacterRepository`: + +```java +void removeBySurnameNotLikeOrAliveFalse(String surname); +``` + +`DerivedMethodRunner`: + +```java +System.out.println("## Remove all characters except of which surname is 'Stark' and which are still alive"); +repository.removeBySurnameNotLikeOrAliveFalse("Stark"); +repository.findAll().forEach(System.out::println); +``` + +Only Arya, Bran, and Sansa are expected to be left. + +``` +## Remove all characters except of which surname is 'Stark' and which are still alive +Character [id=1453, name=Sansa, surname=Stark, alive=true, age=13] +Character [id=1454, name=Arya, surname=Stark, alive=true, age=11] +Character [id=1457, name=Bran, surname=Stark, alive=true, age=10] +``` + +## Relations + +ArangoDB is a graph database system and Spring Data ArangoDB also supports +features for graphs. + +With the `@Relations` annotation, you can define relationships between the +entities. + +To demonstrate this, use the previously created `Character` entity. +Add a `children` field of type `Collection<Character>` annotated with +`@Relations(edges = ChildOf.class, lazy = true)`. + +```java +@Document("characters") +@PersistentIndex(fields = {"surname"}) +public class Character { + + @Id // db document field: _key + private String id; + + @ArangoId // db document field: _id + private String arangoId; + + private String name; + private String surname; + private boolean alive; + private Integer age; + @Relations(edges = ChildOf.class, lazy = true) + private Collection<Character> children; + + // ... + +} +``` + +Then create an entity for the edge you stated in `@Relations`. Other than a +normal entity annotated with `@Document`, this entity is annotated with +`@Edge`. This allows Spring Data ArangoDB to create an edge collection in +the database. Just like `Character`, `ChildOf` also gets a field for its +`id`. To connect two `Character` entities, it also gets a field of type +`Character` annotated with `@From` and a field of type `Character` annotated +with `@To`. `ChildOf` is persisted in the database with the ids of these +two characters. + +```java +package com.arangodb.spring.demo.entity; + +import com.arangodb.springframework.annotation.Edge; +import com.arangodb.springframework.annotation.From; +import com.arangodb.springframework.annotation.To; +import org.springframework.data.annotation.Id; + +@Edge +public class ChildOf { + + @Id + private String id; + + @From + private Character child; + + @To + private Character parent; + + public ChildOf(final Character child, final Character parent) { + super(); + this.child = child; + this.parent = parent; + } + + // setter & getter + + @Override + public String toString() { + return "ChildOf [id=" + id + ", child=" + child + ", parent=" + parent + "]"; + } + +} +``` + +To save instances of `ChildOf` in the database, create a repository for it the +same way you created `CharacterRepository`. + +```java +package com.arangodb.spring.demo.repository; + +import com.arangodb.spring.demo.entity.ChildOf; +import com.arangodb.springframework.repository.ArangoRepository; + +public interface ChildOfRepository extends ArangoRepository<ChildOf, String> { + +} +``` + +Implement another `CommandLineRunner` called `RelationsRunner` and add it to +your `DemoApplication` like with all the runners before. + +```java +Class<?>[] runner = new Class<?>[]{ + CrudRunner.class, + ByExampleRunner.class, + DerivedQueryRunner.class, + RelationsRunner.class +}; +``` + +In the newly created `RelationsRunner`, inject `CharacterRepository` and +`ChildOfRepository` and built your relations. First, save some characters +because you removed most of them earlier. To do so, use the static +`createCharacter()` method of the `CrudRunner`. After you have successfully +persisted your characters, save some relationships with the edge entity `ChildOf`. +Because `ChildOf` requires instances of `Character` with the `id` field set by +the database, you first have to find them in your `CharacterRepository`. +To ensure you find the correct `Character`, use the derived query method +`findByNameAndSurename(String, String)` that gives you one specific `Character`. +Then create instances of `ChildOf` and save them through `ChildOfRepository`. + +```java +package com.arangodb.spring.demo.runner; + +import com.arangodb.spring.demo.entity.ChildOf; +import com.arangodb.spring.demo.repository.CharacterRepository; +import com.arangodb.spring.demo.repository.ChildOfRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.ComponentScan; + +import java.util.Arrays; + +@ComponentScan("com.arangodb.spring.demo") +public class RelationsRunner implements CommandLineRunner { + + @Autowired + private CharacterRepository characterRepo; + @Autowired + private ChildOfRepository childOfRepo; + + @Override + public void run(final String... args) throws Exception { + System.out.println("# Relations"); + characterRepo.saveAll(CrudRunner.createCharacters()); + + // first create some relations for the Starks and Lannisters + Character ned = characterRepo.findByNameAndSurname("Ned", "Stark").get(); + Character catelyn = characterRepo.findByNameAndSurname("Catelyn", "Stark").get(); + Character robb = characterRepo.findByNameAndSurname("Robb", "Stark").get(); + childOfRepo.saveAll(Arrays.asList(new ChildOf(robb, ned), new ChildOf(robb, catelyn))); + Character sansa = characterRepo.findByNameAndSurname("Sansa", "Stark").get(); + childOfRepo.saveAll(Arrays.asList(new ChildOf(sansa, ned), new ChildOf(sansa, catelyn))); + Character arya = characterRepo.findByNameAndSurname("Arya", "Stark").get(); + childOfRepo.saveAll(Arrays.asList(new ChildOf(arya, ned), new ChildOf(arya, catelyn))); + Character bran = characterRepo.findByNameAndSurname("Bran", "Stark").get(); + childOfRepo.saveAll(Arrays.asList(new ChildOf(bran, ned), new ChildOf(bran, catelyn))); + Character jon = characterRepo.findByNameAndSurname("Jon", "Snow").get(); + childOfRepo.save(new ChildOf(jon, ned)); + + Character tywin = characterRepo.findByNameAndSurname("Tywin", "Lannister").get(); + Character jaime = characterRepo.findByNameAndSurname("Jaime", "Lannister").get(); + childOfRepo.save(new ChildOf(jaime, tywin)); + Character cersei = characterRepo.findByNameAndSurname("Cersei", "Lannister").get(); + childOfRepo.save(new ChildOf(cersei, tywin)); + Character joffrey = characterRepo.findByNameAndSurname("Joffrey", "Baratheon").get(); + childOfRepo.saveAll(Arrays.asList(new ChildOf(joffrey, jaime), new ChildOf(joffrey, cersei))); + Character tyrion = characterRepo.findByNameAndSurname("Tyrion", "Lannister").get(); + childOfRepo.save(new ChildOf(tyrion, tywin)); + } +} +``` + +### Read relations within an entity + +After you add `@Relations(edges = ChildOf.class, lazy = true) Collection<Character> children;` +in `Character` you can load all children of a character when you fetch the +character from the database. Use the `findByNameAndSurname(String, String)` +method again to find one specific character. + +Add the following lines of code to the `run()` method of `RelationsRunner`: + +```java +Character nedStark = characterRepo.findByNameAndSurname("Ned", "Stark").get(); +System.out.println(String.format("## These are the children of %s:", nedStark)); +nedStark.getChildren().forEach(System.out::println); +``` + +After executing the demo again, you can see the following console output: + +``` +## These are the children of Character [id=2547, name=Ned, surname=Stark, alive=false, age=41]: +Character [id=2488, name=Bran, surname=Stark, alive=true, age=10] +Character [id=2485, name=Arya, surname=Stark, alive=true, age=11] +Character [id=2559, name=Robb, surname=Stark, alive=false, age=null] +Character [id=2556, name=Jon, surname=Snow, alive=true, age=16] +Character [id=2484, name=Sansa, surname=Stark, alive=true, age=13] +``` + +### findBy including relations + +The `children` field is not persisted in the character entity itself, it is +represented by the `ChildOf` edge. Nevertheless, you can write a derived method +which includes properties of all connected `Character`. + +With the following two methods – added in `CharacterRepository` – you can query +for a `Character` which has a child with a given name or an age between two +given integers. + +```java +Collection<Character> findByChildrenName(String name); +Collection<Character> findByChildrenAgeBetween(int lowerBound, int upperBound); +``` + +Call these methods in `RelationsRunner` and search for all parents of 'Sansa' +and all parents that have a child between 16 and 20 years old. + +``` +System.out.println("## These are the parents of 'Sansa'"); +Iterable<Character> parentsOfSansa = characterRepo.findByChildrenName("Sansa"); +parentsOfSansa.forEach(System.out::println); + +System.out.println("## These parents have a child which is between 16 and 20 years old"); +Iterable<Character> childrenBetween16a20 = characterRepo.findByChildrenAgeBetween(16, 20); +childrenBetween16a20.forEach(System.out::println); +``` + +The console output shows us that Ned and Catelyn are the parents of Sansa and +that Ned, Jamie, and Cersei have at least one child in the age between 16 and +20 years. + +``` +## These are the parents of 'Sansa' +Character [id=2995, name=Ned, surname=Stark, alive=false, age=41] +Character [id=2998, name=Catelyn, surname=Stark, alive=false, age=40] +## These parents have a child which is between 16 and 20 years old +Character [id=2995, name=Ned, surname=Stark, alive=false, age=41] +Character [id=2997, name=Jaime, surname=Lannister, alive=true, age=36] +Character [id=2999, name=Cersei, surname=Lannister, alive=true, age=36] +``` + +## Query methods + +You can have repository methods with self-written AQL queries. + +When it comes to more complex use cases where a derived method would get way too +long and become unreadable, queries using the [ArangoDB Query Language (AQL)](../../aql/_index.md) +can be supplied with the `@Query` annotation on methods in your repositories. + +AQL supports the usage of [bind parameters](../../aql/fundamentals/bind-parameters.md), +thus allowing to separate the query text from literal values used in the query. +There are three ways of passing bind parameters to the query in the `@Query` +annotation that are described below. + +### Param annotation + +To pass bind parameters to your query, you can use the `@Param` annotation. +With the `@Param` annotation, the argument is placed in the query at the place +corresponding to the value passed to the `@Param` annotation. + +To demonstrate this, add another method to `CharacterRepository`: + +```java +@Query("FOR c IN characters FILTER c.surname == @surname SORT c.age ASC RETURN c") +List<Character> getWithSurname(@Param("surname") String value); +``` + +Here, the bind parameter is named `surname` and the method parameter `value` is +annoated with `@Param("surname")`. Only the value in the `@Param` annotation has +to match with your bind parameter, the method parameter name does not matter. + +Note that this uses the collection name `characters` and not `character` in your +query. Normally, a collection would be named like the corresponding entity class. +However, you used `@Document("characters")` in `Character` which set the +collection name to `characters`. + +Create a new `CommandLineRunner` and add it to our `DemoApplication`: + +```java +package com.arangodb.spring.demo.runner; + +import com.arangodb.spring.demo.entity.Character; +import com.arangodb.spring.demo.repository.CharacterRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; + +public class AQLRunner implements CommandLineRunner { + + @Autowired + private CharacterRepository repository; + + @Override + public void run(final String... args) throws Exception { + System.out.println("# AQL queries"); + } + +} +``` + +`DemoApplication`: + +```java +Class<?>[]runner=new Class<?>[]{ + CrudRunner.class, + ByExampleRunner.class, + DerivedQueryRunner.class, + RelationsRunner.class, + AQLRunner.class +}; +``` + +Add the following lines to `AQLRunner`: + +```java +System.out.println("## Find all characters with surname 'Lannister' (sort by age ascending)"); +List<Character> lannisters = repository.getWithSurname("Lannister"); +lannisters.forEach(System.out::println); +``` + +The console output should give you all characters with `surname` Lannister. + +``` +## Find all characters with surname 'Lannister' (sort by age ascending) +Character [id=7613, name=Tywin, surname=Lannister, alive=false, age=null] +Character [id=7611, name=Tyrion, surname=Lannister, alive=true, age=32] +Character [id=7596, name=Jaime, surname=Lannister, alive=true, age=36] +Character [id=7598, name=Cersei, surname=Lannister, alive=true, age=36] +``` + +### BindVars annotation + +In addition to number matching and the `@Param` annotation, you can use a method +parameter of type `Map<String, Object>` annotated with `@BindVars` as your +bind parameters. You can then fill the map with any parameter used in the query. + +Add the following to `CharacterRepository`: + +```java +@Query("FOR c IN @@col FILTER c.surname == @surname AND c.age > @age RETURN c") +ArangoCursor<Character> getWithSurnameOlderThan(@Param("age") int value, @BindVars Map<String, Object> bindvars); +``` + +This query uses three bind parameters `@@col`, `@surname`, and `@age`. +One of the bind parameter is written with two `@`. This is a special type of +bind parameter that exists for injecting collection names. This type of +bind parameter has a name prefixed with an additional `@` symbol. + +Furthermore, `@Param` is used for the `@age` bind parameter but not for `@@col` +and `@surname`. These bind parameters have to be passed through the map annotated +with `@BindVars`. It is also possible to use both annotations within one query method. + +The method call looks as expected. An integer is passed for the `age` +bind parameter and a map with the keys `surname` and `@col` to your new method. + +```java +System.out.println("## Find all characters with surname 'Lannister' which are older than 35"); +Map<String, Object> bindvars = new HashMap<>(); +bindvars.put("surname", "Lannister"); +bindvars.put("@col", Character.class); +ArangoCursor<Character> oldLannisters = repository.getWithSurnameOlderThan(35, bindvars); +oldLannisters.forEach(System.out::println); +``` + +One additional special handling for collection bind parameter is that you do not +have to pass the collection name as a String to the method. You can pass the type +(`Character.class`) to your method. Spring Data ArangoDB determines the +collection name. This is very convenient if you have used an alternative +collection name within the `@Document` or `@Edge` annotations. + +The console output should be as follows: + +``` +## Find all characters with surname 'Lannister' which are older than 35 +Character [id=8294, name=Jaime, surname=Lannister, alive=true, age=36] +Character [id=8296, name=Cersei, surname=Lannister, alive=true, age=36] +``` + +### QueryOptions annotation + +Sometimes, you want to be able to configure the query execution on a technical +level. Spring Data ArangoDB provides the `@QueryOptions` annotation for this. +With this annotation, you are able to set something like a batch size to control +the number of results to be transferred from the database server in one roundtrip +and some other things. + +For example, you can return the number of found results. To achieve that you +have to change the return type in the previously created `getWithSurnameOlderThan(int, Map)` +method from `Iterable<Character>` to `ArangoCursor<Character>`. `ArangoCursor` +provides a `getCount()` method that gives you the number of found results. +But this value is only returned from the database when you set the `count` flag +in the query options to `true`, so you also have to add the `@QueryOptions` +annotation to the method with `count = true`. + +```java +@Query("FOR c IN @@col FILTER c.surname == @surname AND c.age > @age RETURN c") +@QueryOptions(count = true) +Iterable<Character> getWithSurnameOlderThan(@Param("age") int value, @BindVars Map<String, Object> bindvars); +``` + +If you change the type of our `oldLannisters` local variable in `AQLRunner` +to `ArangoCursor`, you can get the count value from it. + +```java +ArangoCursor<Character> oldLannisters = repository.getWithSurnameOlderThan(35, bindvars); +System.out.println(String.format("Found %s documents", oldLannisters.getCount())); +oldLannisters.forEach(System.out::println); +``` + +The new console output should look like this: + +``` +## Find all characters with surname 'Lannister' which are older than 35 +Found 2 documents +Character [id=9012, name=Jaime, surname=Lannister, alive=true, age=36] +Character [id=9014, name=Cersei, surname=Lannister, alive=true, age=36] +``` + +### Graph traversal + +To finish the query method topic, add a [graph traversal](../../aql/graphs/traversals.md) +written in AQL to this demo where the `ChildOf` edges are involved. + +The following query searches for every `Character` connected (through `ChildOf`) +with the character to whom the passed `id` belongs to. This time, specify the +edge collection in the query that you pass as a bind parameter with the +`@Param` annotation. + +`CharacterRepository`: + +```java +@Query("FOR v IN 1..2 INBOUND @arangoId @@edgeCol SORT v.age DESC RETURN DISTINCT v") +List<Character> getAllChildrenAndGrandchildren(@Param("arangoId") String arangoId, @Param("@edgeCol") Class<?> edgeCollection); +``` + +Like before with `Character.class` in your map, use the type of `ChildOf` as +the parameter value. To find all children and grandchildren of Tywin Lannister, +you first have to find him to get his `id` which you can then pass to the +query method. + +`AQLRunner`: + +```java +System.out.println("## Find all children and grantchildren of 'Tywin Lannister' (sort by age descending)"); +List<Character> children = repository.findByNameAndSurname("Tywin", "Lannister").map(tywin -> + repository.getAllChildrenAndGrandchildren(tywin.getArangoId(), ChildOf.class)).get(); +children.forEach(System.out::println); +``` + +After executing the demo again, you can see the following console output: + +``` +## Find all children and grantchildren of 'Tywin Lannister' (sort by age descending) +Character [id=11255, name=Tyrion, surname=Lannister, alive=true, age=32] +Character [id=11242, name=Cersei, surname=Lannister, alive=true, age=36] +Character [id=11253, name=Joffrey, surname=Baratheon, alive=false, age=19] +Character [id=11240, name=Jaime, surname=Lannister, alive=true, age=36] +``` + +## Geospatial queries + +Geospatial queries are a subsection of derived queries. To use a geospatial +query on a collection, a geo index must exist on that collection. A geo index +can be created on a field which is a two element array, corresponding to latitude +and longitude coordinates. + +As a subsection of derived queries, geospatial queries support the same +return types, and also these additional three return types: `GeoPage`, +`GeoResult`, and `GeoResults`. These types must be used in order to get the +distance of each document as generated by the query. + +### Geo data modeling + +To demonstrate geospatial queries, create a new entity class `Location` with a +`location` field of type `org.springframework.data.geo.Point`. You also have to +create a geo index on this field. You can do so by annotating the field with +`@GeoIndexed(geoJson = true)`. As you probably remember, you have already used +an index in the `Character` class, but you annotated the type and not the +affected fields. + +Spring Data ArangoDB offers two ways of defining an index. With the +`@<IndexType>Indexed` annotations, indexes for single fields can be defined. +If the index should include multiple fields, the `@<IndexType>Index` annotations +can be used on the type instead. See the [reference documentation](spring-data-arangodb/reference-version-4/mapping/indexes.md) +for more information. + +Create a new `Location` class: + +```java +package com.arangodb.spring.demo.entity; + +import com.arangodb.springframework.annotation.Document; +import com.arangodb.springframework.annotation.GeoIndexed; +import org.springframework.data.annotation.Id; +import org.springframework.data.geo.Point; + +import java.util.Arrays; + +@Document("locations") +public class Location { + + @Id + private String id; + private final String name; + @GeoIndexed(geoJson = true) + private final Point location; + + public Location(final String name, final Point location) { + super(); + this.name = name; + this.location = location; + } + + // getter & setter + + @Override + public String toString() { + return "Location{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", location=" + location + + '}'; + } + +} +``` + +Create the corresponding `LocationRepository` repository: + +```java +package com.arangodb.spring.demo.repository; + +import com.arangodb.spring.demo.entity.Location; +import com.arangodb.springframework.repository.ArangoRepository; + +public interface LocationRepository extends ArangoRepository<Location, String> { + +} +``` + +After that, create a new `CommandLineRunner`, add it to your `DemoApplication`, +and perform some insert operations with some popular locations from +Game of Thrones with the coordinates of their real counterparts: + +```java +package com.arangodb.spring.demo.runner; + +import com.arangodb.spring.demo.entity.Location; +import com.arangodb.spring.demo.repository.LocationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; + +import java.util.Arrays; + +public class GeospatialRunner implements CommandLineRunner { + + @Autowired + private LocationRepository repository; + + @Override + public void run(final String... args) throws Exception { + System.out.println("# Geospatial"); + + repository.saveAll(Arrays.asList( + new Location("Dragonstone", new Point(-6.815096, 55.167801)), + new Location("King's Landing", new Point(18.110189, 42.639752)), + new Location("The Red Keep", new Point(14.446442, 35.896447)), + new Location("Yunkai", new Point(-7.129532, 31.046642)), + new Location("Astapor", new Point(-9.774249, 31.50974)), + new Location("Winterfell", new Point(-5.581312, 54.368321)), + new Location("Vaes Dothrak", new Point(-6.096125, 54.16776)), + new Location("Beyond the wall", new Point(-21.094093, 64.265473)) + )); + } +} +``` + +`DemoApplication`: + +```java +Class<?>[]runner=new Class<?>[]{ + CrudRunner.class, + ByExampleRunner.class, + DerivedQueryRunner.class, + RelationsRunner.class, + AQLRunner.class, + GeospatialRunner.class +}; +``` + +There are two kinds of geospatial query: `Near` and `Within`. + +### Near + +`Near` sorts entities by distance from a given point. +The result can be restricted with paging. + +`LocationRepository`: + +```java +GeoPage<Location> findByLocationNear(Point location,Pageable pageable); +``` + +In this example, search for locations sorted by distance to a given point, +matching the coordinates of Winterfell. Use pagination to split the results in +pages of five locations. + +```java +System.out.println("## Find the first 5 locations near 'Winterfell'"); +GeoPage<Location> first5 = repository.findByLocationNear(new Point(-5.581312, 54.368321), PageRequest.of(0, 5)); +first5.forEach(System.out::println); + +System.out.println("## Find the next 5 locations near 'Winterfell' (only 3 locations left)"); +GeoPage<Location> next5 = repository.findByLocationNear(new Point(-5.581312, 54.368321), PageRequest.of(1, 5)); +next5.forEach(System.out::println); +``` + +Because you use the coordinates of Winterfell, the distance in the output to +Winterfell is `0`. + +``` +## Find the first 5 locations near 'Winterfell' +GeoResult [content: Location [id=14404, name=Yunkai, location=[31.046642, -7.129532]], distance: 3533.2076972451478 KILOMETERS, ] +GeoResult [content: Location [id=14405, name=Astapor, location=[31.50974, -9.774249]], distance: 3651.785495816579 KILOMETERS, ] +GeoResult [content: Location [id=14403, name=The Red Keep, location=[35.896447, 14.446442]], distance: 4261.971994059222 KILOMETERS, ] +GeoResult [content: Location [id=14402, name=King's Landing, location=[42.639752, 18.110189]], distance: 5074.755682897005 KILOMETERS, ] +GeoResult [content: Location [id=14407, name=Vaes Dothrak, location=[54.16776, -6.096125]], distance: 6049.156388427102 KILOMETERS, ] +## Find the next 5 locations near 'Winterfell' (only 3 locations left) +GeoResult [content: Location [id=14406, name=Winterfell, location=[54.368321, -5.581312]], distance: 6067.104268175527 KILOMETERS, ] +GeoResult [content: Location [id=14401, name=Dragonstone, location=[55.167801, -6.815096]], distance: 6165.650581599857 KILOMETERS, ] +GeoResult [content: Location [id=14408, name=Beyond the wall, location=[64.265473, -21.094093]], distance: 7350.229798961836 KILOMETERS, ] +``` + +### Within + +`Within` both sorts and filters entities, returning those within the given +distance, range, or shape. + +Add some methods to `LocationRepository` that use different filter criteria: + +```java +GeoResults<Location> findByLocationWithin(Point location,Distance distance); +Iterable<Location> findByLocationWithin(Point location,Range<Double> distanceRange); +``` + +With these methods, you can search for locations within a given distance or +range to our point – Winterfell. + +```java +System.out.println("## Find all locations within 50 kilometers of 'Winterfell'"); +GeoResults<Location> findWithing50kilometers = repository + .findByLocationWithin(new Point(-5.581312, 54.368321), new Distance(50, Metrics.KILOMETERS)); +findWithing50kilometers.forEach(System.out::println); + +System.out.println("## Find all locations which are 40 to 50 kilometers away from 'Winterfell'"); +Iterable<Location> findByLocationWithin = repository.findByLocationWithin(new Point(-5.581312, 54.368321), + Range.of(Range.Bound.inclusive(40000.), Range.Bound.exclusive(50000.))); +findByLocationWithin.forEach(System.out::println); +``` + +As you can see in the console output, both _Winterfell_ and _Vaes Dothrak_ are +located within a 50 kilometers radius around your point. But only _Vaes Dothrak_ +is obviously more than 40 kilometers away from it. + +``` +## Find all locations within 50 kilometers of 'Winterfell' +GeoResult [content: Location [id=14843, name=Winterfell, location=[54.368321, -5.581312]], distance: 0.0 KILOMETERS, ] +GeoResult [content: Location [id=14844, name=Vaes Dothrak, location=[54.16776, -6.096125]], distance: 40.186277071065994 KILOMETERS, ] +## Find all locations which are 40 to 50 kilometers away from 'Winterfell' +Location [id=14844, name=Vaes Dothrak, location=[54.16776, -6.096125]] +``` + +You cannot only implement geo functions going from a single point but it is also +possible to search for locations within a polygon. + +Add a method using `Polygon`: + +`LocationRepository`: +```java +Iterable<Location> findByLocationWithin(Polygon polygon); +``` + +`GeospatialRunner`: +```java +System.out.println("## Find all locations within a given polygon"); +Iterable<Location> withinPolygon = repository.findByLocationWithin( + new Polygon(Arrays.asList(new Point(-25, 40), new Point(-25, 70), new Point(25, 70), new Point(-25, 40)))); +withinPolygon.forEach(System.out::println); +``` + +The console output should be as follows: + +``` +## Find all locations within a given polygon +Location [id=16922, name=Beyond the wall, location=[64.265473, -21.094093]] +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/_index.md new file mode 100644 index 0000000000..201c410ccc --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/_index.md @@ -0,0 +1,341 @@ +--- +title: Spring Data ArangoDB +menuTitle: Spring Data +weight: 5 +description: >- + The Spring Data ArangoDB integration is a library for accessing data stored in + ArangoDB from Spring-based Java application +--- +Spring Data provides a consistent interface for +accessing various types of data sources. Spring Data ArangoDB implements this +for ArangoDB and provides mapping of Java objects to ArangoDB documents (ODM). + +- [Repository](https://github.com/arangodb/spring-data) +- [Demo without Spring Boot Starter](https://github.com/arangodb/spring-data/tree/main/tutorial/src/main/java/com/arangodb/spring/demo) +- [Demo with Spring Boot Starter](https://github.com/arangodb/spring-boot-starter/tree/main/demo) +- [Reference (version 4)](reference-version-4/_index.md) +- [Reference (version 3)](reference-version-3/_index.md) +- [JavaDoc](https://www.javadoc.io/doc/com.arangodb/arangodb-spring-data/latest) +- [Changelog](https://github.com/arangodb/spring-data/blob/master/ChangeLog.md#changelog) +- [Migration](migration/_index.md) + +## Supported versions + +Spring Data ArangoDB is compatible with: + +{{< tabs "spring-data" >}} + +{{< tab "Version 4" >}} +- all the still supported Spring Boot 3.x [versions](https://spring.io/projects/spring-boot#support) + and related Spring Framework versions +- all the still supported ArangoDB [versions](https://arangodb.com/subscriptions/end-of-life-notice/) +{{< /tab >}} + +{{< tab "Version 3" >}} +- all the still supported Spring Boot 2.x [versions](https://spring.io/projects/spring-boot#support) + and related Spring Framework versions +- all the still supported ArangoDB [versions](https://arangodb.com/subscriptions/end-of-life-notice/) +{{< /tab >}} + +{{< /tabs >}} + +## Get started + +This tutorial is about how to configure [Spring Data ArangoDB](https://github.com/arangodb/spring-data) +without using Spring Boot Starter ArangoDB. + +For a more extensive tutorial about the features of Spring Data ArangoDB and +Spring Boot support, see the [Spring Boot Starter](../spring-boot-arangodb.md) +documentation. + +### Build a project with Maven + +Set up a project and add every needed dependency. This demo uses Maven and +Spring Boot. + +Create a Maven `pom.xml`: + +```xml +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <relativePath/> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>x.y.z</version> + </parent> + + <groupId>com.arangodb</groupId> + <artifactId>spring-data-arangodb-tutorial</artifactId> + <version>1.0.0</version> + + <name>spring-data-arangodb-tutorial</name> + <description>ArangoDB Spring Data Tutorial</description> + + <properties> + <java.version>21</java.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter</artifactId> + </dependency> + <dependency> + <groupId>com.arangodb</groupId> + <artifactId>arangodb-spring-data</artifactId> + <version>x.y.z</version> + </dependency> + </dependencies> + +</project> +``` + +Substitute `x.y.z` with the latest available versions that are compatible. +See the [Supported versions](#supported-versions) for details. +You may also adjust the Java version. + +### Entity classes + +For this tutorial we will model our entity with a Java record class: + +```java +@Document("characters") +public record Character( + @Id + String id, + String name, + String surname +) { +} +``` + +### Create a repository + +Now that we have our data model, we want to store data. For this, we create a repository interface which +extends `ArangoRepository`. This gives us access to CRUD operations, paging, and query by example mechanics. + +```java +public interface CharacterRepository extends ArangoRepository<Character, String> { +} +``` + +### Create a Configuration class + +{{< tabs "spring-data" >}} + +{{< tab "Version 4" >}} +We need a configuration class to set up everything to connect to our ArangoDB instance and to declare that all +needed Spring Beans are processed by the Spring container. + +- `@EnableArangoRepositories`: Defines where Spring can find your repositories +- `arango()`: Method to configure the connection to the ArangoDB instance +- `database()`: Method to define the database name +- `returnOriginalEntities()`: Method to configures the behavior of repository save methods to either return the + original entities (updated where possible) or new ones. Set to `false` to use java records. + +```java +@Configuration +@EnableArangoRepositories(basePackages = {"com.arangodb.spring.demo"}) +public class AdbConfig implements ArangoConfiguration { + + @Override + public ArangoDB.Builder arango() { + return new ArangoDB.Builder() + .host("localhost", 8529) + .user("root") + .password("test"); + } + + @Override + public String database() { + return "spring-demo"; + } + + @Override + public boolean returnOriginalEntities() { + return false; + } +} +``` + +Note that, in case the driver is configured to use a protocol with `VPACK` +content type (i.e. `HTTP_VPACK` or `HTTP2_VPACK`), then the +`ArangoConfiguration#contentType()` method must be overridden to return +`ContentType.VPACK` as shown in the following example: + +```java +@Override +public ArangoDB.Builder arango() { + new ArangoDB.Builder() + // ... + .protocol(Protocol.HTTP2_VPACK); +} + +@Override +public ContentType contentType() { + return ContentType.VPACK; +} +``` +{{< /tab >}} + +{{< tab "Version 3" >}} +You can use Java to configure your Spring Data environment as show below. +Setting up the underlying driver (`ArangoDB.Builder`) with default configuration +automatically loads a properties file `arangodb.properties`, if it exists in the +classpath. + +```java +@Configuration +@EnableArangoRepositories(basePackages = { "com.company.mypackage" }) +public class MyConfiguration implements ArangoConfiguration { + + @Override + public ArangoDB.Builder arango() { + return new ArangoDB.Builder(); + } + + @Override + public String database() { + // Name of the database to be used + return "example-database"; + } + +} +``` + +The driver is configured with some default values: + +| property-key | description | default value | +| ----------------- | ----------------------------------- | ------------- | +| arangodb.host | ArangoDB host | 127.0.0.1 | +| arangodb.port | ArangoDB port | 8529 | +| arangodb.timeout | socket connect timeout(millisecond) | 0 | +| arangodb.user | Basic Authentication User | +| arangodb.password | Basic Authentication Password | +| arangodb.useSsl | use SSL connection | false | + +To customize the configuration, the parameters can be changed in the Java code. + +```java +@Override +public ArangoDB.Builder arango() { + ArangoDB.Builder arango = new ArangoDB.Builder() + .host("127.0.0.1") + .port(8529) + .user("root"); + return arango; +} +``` + +In addition you can use the _arangodb.properties_ or a custom properties file to supply credentials to the driver. + +_Properties file_ + +``` +arangodb.hosts=127.0.0.1:8529 +arangodb.user=root +arangodb.password= +``` + +_Custom properties file_ + +```java +@Override +public ArangoDB.Builder arango() { + InputStream in = MyClass.class.getResourceAsStream("my.properties"); + ArangoDB.Builder arango = new ArangoDB.Builder() + .loadProperties(in); + return arango; +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### Create a CommandLineRunner + +To run our demo as command line application, we have to create a class implementing `CommandLineRunner`: + +```java +@ComponentScan("com.arangodb.spring.demo") +public class CrudRunner implements CommandLineRunner { + + @Autowired + private ArangoOperations operations; + + @Autowired + private CharacterRepository repository; + + @Override + public void run(String... args) { + // first drop the database so that we can run this multiple times with the same dataset + operations.dropDatabase(); + + System.out.println("# CRUD operations"); + + // save a single entity in the database + // there is no need of creating the collection first. This happen automatically + Character nedStark = new Character(null, "Ned", "Stark"); + Character saved = repository.save(nedStark); + System.out.println("Ned Stark saved in the database: " + saved); + } +} +``` + +### Run the application + +Finally, we create a main class: + +```java +@SpringBootApplication +public class DemoApplication { + public static void main(final String... args) { + System.exit(SpringApplication.exit( + SpringApplication.run(CrudRunner.class, args) + )); + } +} +``` + +And run it with: + +```shell +mvn spring-boot:run +``` + +This should produce a console output similar to: + +``` +Ned Stark saved in the database: Character[id=2029, name=Ned, surname=Stark] +``` + +## Using the underlying Java Driver + +The underlying Java driver can be obtained via `ArangoOperations.driver()`. +This driver instance is configured by default to use `ArangoConverter` bean to +serialize and deserialize user data, therefore keeping the same +Spring Data ArangoDB serialization behavior. + +## Limitations + +{{< tabs "spring-data" >}} + +{{< tab "Version 4" >}} +- GraalVM Native Image (available with Spring Boot 3) is not supported (DE-677) +- Spring Data REST is not supported (DE-43) +- Spring Data Reactive is not supported (DE-678) +{{< /tab >}} + +{{< tab "Version 3" >}} +- Java Record classes and Kotlin Data classes are not supported (DE-539) +- Spring Data REST is not supported (DE-43) +- Spring Data Reactive is not supported (DE-678) +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/migration.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/migration.md new file mode 100644 index 0000000000..cd5f8dfea5 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/migration.md @@ -0,0 +1,109 @@ +--- +title: Spring Data ArangoDB - Migration +menuTitle: Migration +weight: 10 +description: '' +--- +## Migrate from Spring Data ArangoDB 3.x to 4.0 + +### JDK 17, Spring Framework 6 and Spring Boot 3 + +Spring Data ArangoDB 4.0 requires: + +- [JDK 17](https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-JDK-17) +- [Spring Framework 6](https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x) + +[Spring Boot Starter ArangoDB](https://github.com/arangodb/spring-boot-starter) provides integration with +[Spring Boot 3](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide). + +### Java Driver 7 + +The implementation is now based on +[Java Driver 7](../../drivers/java/reference-version-7/changes-in-version-7.md). + +### Exception Translation + +- exceptions in `ArangoOperations.query()` and repository queries (derived queries and `@Query` annotated methods) are + now translated to Spring Data exceptions (`DataAccessExceptions` and subclasses) +- `OptimisticLockingFailureException` is now thrown in case of `_rev` conflict + +### Serialization + +- support for data type `VPackSlice` has been removed in favor of Jackson type `com.fasterxml.jackson.databind.JsonNode` + and its subclasses (`ArrayNode`, `ObjectNode`, ...) + +- the underlying Java driver (accessible via `com.arangodb.springframework.core.ArangoOperations#driver()`) uses + now the `ArangoConverter` bean to serialize and deserialize user data + +### API changes + +- `CrudRepository.deleteById()`now silently ignores an unknown id (as defined by API contract) +- renamed `ArangoOperations` methods operating on multiple documents with `All` suffix (e.g. `insert(Iterable)` has been + renamed to `insertAll(Iterable)` +- `ArangoOperations` methods for single document manipulation have now specific return + types (, `DocumentDeleteEntity<T>`, `DocumentUpdateEntity<T>`, `DocumentCreateEntity<T>`) +- `ArangoOperations` methods for multiple documents manipulation have now specific return types as for single documents, + wrapped by `MultiDocumentEntity<>` +- `ArangoOperations` methods for documents manipulation accepting options `returnNew(boolean)` or `returnOld(boolean)` + return now the deserialized entity in the response (accessible via `getNew()` or `getOld()`) +- changed the arguments order of some `ArangoOperations` methods for better API coherence +- changed the arguments type of some `ArangoOperations` methods to be covariant +- return updated entity from `ArangoOperations.repsert()` + +### Removed + +- removed deprecated `AbstractArangoConfiguration` in favor of `ArangoConfiguration` +- removed support for Joda-Time +- removed `ArangoOperations.insert(String collectionName, ...)` methods +- removed previously deprecated API classes and methods + +## Migrate from Spring Data ArangoDB 2.x to 3.0 + +### Annotations @Key + +The annotation `@Key` is removed. Use `@Id` instead. + +### Annotations @Id + +The annotation `@Id` is now saved in the database as field `_key` instead of `_id`. +All operations in `ArangoOperations` and `ArangoRepository` still work with `@Id` +and also now supports non-String fields. + +If you - for some reason - need the value of `_id` within your application, you +can use the annotation `@ArangoId` on a `String` field instead of `@Id`. + +**Note**: The field annotated with `@ArangoId` will not be persisted in the +database. It only exists for reading purposes. + +### ArangoRepository + +`ArangoRepository` now requires a second generic type. This type `ID` represents +the type of your domain object field annotated with `@Id`. + +**Examples** + +```java +public class Customer { + @Id private String id; +} + +public interface CustomerRepository extends ArangoRepository<Customer, String> { + +} +``` + +### Annotation @Param + +The annotation `com.arangodb.springframework.annotation.Param` is removed. Use `org.springframework.data.repository.query.Param` instead. + +### DBEntity + +`DBEntity` is removed. Use `VPackSlice` in your converter instead. + +### DBCollectionEntity + +`DBCollectionEntity` is removed. Use `VPackSlice` in your converter instead. + +## Migrate from Spring Data ArangoDB 1.x to 3.0 + +The steps are the same as for [Migrating from Spring Data ArangoDB 2.x to 3.0](#migrate-from-spring-data-arangodb-2x-to-30). diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/_index.md new file mode 100644 index 0000000000..e35a9f0e33 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/_index.md @@ -0,0 +1,6 @@ +--- +title: Spring Data ArangoDB - Reference (version 3) +menuTitle: Reference version 3 +weight: 6 +description: '' +--- diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md new file mode 100644 index 0000000000..5e13908900 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/_index.md @@ -0,0 +1,187 @@ +--- +title: Mapping +menuTitle: Mapping +weight: 20 +description: >- + The features and conventions for mapping Java objects to documents and how to + override those conventions with annotation based mapping metadata +--- +## Conventions + +- The Java class name is mapped to the collection name +- The non-static fields of a Java object are used as fields in the stored document +- The Java field name is mapped to the stored document field name +- All nested Java object are stored as nested objects in the stored document +- The Java class needs a constructor which meets the following criteria: + - in case of a single constructor: + - a non-parameterized constructor or + - a parameterized constructor + - in case of multiple constructors: + - a non-parameterized constructor or + - a parameterized constructor annotated with `@PersistenceConstructor` + +## Type conventions + +ArangoDB uses [VelocyPack](https://github.com/arangodb/velocypack) as it's internal storage format which supports a large number of data types. In addition Spring Data ArangoDB offers - with the underlying Java driver - built-in converters to add additional types to the mapping. + +| Java type | VelocyPack type | +| ------------------------ | ----------------------------- | +| java.lang.String | string | +| java.lang.Boolean | bool | +| java.lang.Integer | signed int 4 bytes, smallint | +| java.lang.Long | signed int 8 bytes, smallint | +| java.lang.Short | signed int 2 bytes, smallint | +| java.lang.Double | double | +| java.lang.Float | double | +| java.math.BigInteger | string | +| java.math.BigDecimal | string | +| java.lang.Number | double | +| java.lang.Character | string | +| java.util.UUID | string | +| java.lang.byte[] | string (Base64) | +| java.util.Date | string (date-format ISO 8601) | +| java.sql.Date | string (date-format ISO 8601) | +| java.sql.Timestamp | string (date-format ISO 8601) | +| java.time.Instant | string (date-format ISO 8601) | +| java.time.LocalDate | string (date-format ISO 8601) | +| java.time.LocalDateTime | string (date-format ISO 8601) | +| java.time.OffsetDateTime | string (date-format ISO 8601) | +| java.time.ZonedDateTime | string (date-format ISO 8601) | + +## Type mapping + +As collections in ArangoDB can contain documents of various types, a mechanism to retrieve the correct Java class is required. The type information of properties declared in a class may not be enough to restore the original class (due to inheritance). If the declared complex type and the actual type do not match, information about the actual type is stored together with the document. This is necessary to restore the correct type when reading from the DB. Consider the following example: + +```java +public class Person { + private String name; + private Address homeAddress; + // ... + + // getters and setters omitted +} + +public class Employee extends Person { + private Address workAddress; + // ... + + // getters and setters omitted +} + +public class Address { + private final String street; + private final String number; + // ... + + public Address(String street, String number) { + this.street = street; + this.number = number; + } + + // getters omitted +} + +@Document +public class Company { + @Key + private String key; + private Person manager; + + // getters and setters omitted +} + +Employee manager = new Employee(); +manager.setName("Jane Roberts"); +manager.setHomeAddress(new Address("Park Avenue", "432/64")); +manager.setWorkAddress(new Address("Main Street", "223")); +Company comp = new Company(); +comp.setManager(manager); +``` + +The serialized document for the DB looks like this: + +```json +{ + "manager": { + "name": "Jane Roberts", + "homeAddress": { + "street": "Park Avenue", + "number": "432/64" + }, + "workAddress": { + "street": "Main Street", + "number": "223" + }, + "_class": "com.arangodb.Employee" + }, + "_class": "com.arangodb.Company" +} +``` + +Type hints are written for top-level documents (as a collection can contain different document types) as well as for every value if it's a complex type and a sub-type of the property type declared. `Map`s and `Collection`s are excluded from type mapping. Without the additional information about the concrete classes used, the document couldn't be restored in Java. The type information of the `manager` property is not enough to determine the `Employee` type. The `homeAddress` and `workAddress` properties have the same actual and defined type, thus no type hint is needed. + +### Customizing type mapping + +By default, the fully qualified class name is stored in the documents as a type hint. A custom type hint can be set with the `@TypeAlias("my-alias")` annotation on an entity. Make sure that it is an unique identifier across all entities. If we would add a `TypeAlias("employee")` annotation to the `Employee` class above, it would be persisted as `"_class": "employee"`. + +The default type key is `_class` and can be changed by overriding the `typeKey()` method of the `ArangoConfiguration` class. + +If you need to further customize the type mapping process, the `arangoTypeMapper()` method of the configuration class can be overridden. The included `DefaultArangoTypeMapper` can be customized by providing a list of [`TypeInformationMapper`](https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/convert/TypeInformationMapper.html)s that create aliases from types and vice versa. + +In order to fully customize the type mapping process you can provide a custom type mapper implementation by extending the `DefaultArangoTypeMapper` class. + +### Deactivating type mapping + +To deactivate the type mapping process, you can return `null` from the `typeKey()` method of the `ArangoConfiguration` class. No type hints are stored in the documents with this setting. If you make sure that each defined type corresponds to the actual type, you can disable the type mapping, otherwise it can lead to exceptions when reading the entities from the DB. + +## Annotations + +### Annotation overview + +| annotation | level | description | +|-------------------------| ------------------------- |-----------------------------------------------------------------------------------------------------------------------------------------------------| +| @Document | class | marks this class as a candidate for mapping | +| @Edge | class | marks this class as a candidate for mapping | +| @Id | field | stores the field as the system field \_key | +| @Rev | field | stores the field as the system field \_rev | +| @Field("alt-name") | field | stores the field with an alternative name | +| @Ref | field | stores the \_id of the referenced document and not the nested document | +| @From | field | stores the \_id of the referenced document as the system field \_from | +| @To | field | stores the \_id of the referenced document as the system field \_to | +| @Relations | field | vertices which are connected over edges | +| @Transient | field, method, annotation | marks a field to be transient for the mapping framework, thus the property will not be persisted and not further inspected by the mapping framework | +| @PersistenceConstructor | constructor | marks a given constructor - even a package protected one - to use when instantiating the object from the database | +| @TypeAlias("alias") | class | set a type alias for the class when persisted to the DB | +| @PersistentIndex | class | describes a persistent index | +| @PersistentIndexed | field | describes how to index the field | +| @GeoIndex | class | describes a geo index | +| @GeoIndexed | field | describes how to index the field | +| @FulltextIndex | class | describes a fulltext index | +| @FulltextIndexed | field | describes how to index the field | +| @TtlIndex | class | describes a TTL index | +| @TtlIndexed | field | describes how to index the field | +| @CreatedBy | field | Declares a field as the one representing the principal that created the entity containing the field. | +| @CreatedDate | field | Declares a field as the one representing the date the entity containing the field was created. | +| @LastModifiedBy | field | Declares a field as the one representing the principal that recently modified the entity containing the field. | +| @LastModifiedDate | field | Declares a field as the one representing the date the entity containing the field was recently modified. | + +## Invoking conversion manually + +In order to invoke entity serialization and deserialization to and from `VPackSlice` manually, you can inject an +instance of `ArangoConverter` and respectively call the methods `write` and `read` on it, e.g.: + +```java +// ... + +@Autowired +ArangoConverter arangoConverter; + + // ... + VPackSlice vPackSlice = converter.write(entity); + + // ... + MyEntity entity = converter.read(MyEntity.class, vPackSlice); +``` + +This is useful for cases where you need to use the underlying Java driver directly (accessible from +`ArangoOperations#driver()`), while keeping Spring Data ArangoDB serialization behavior. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md new file mode 100644 index 0000000000..6d3c3071cf --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/auditing.md @@ -0,0 +1,148 @@ +--- +title: Auditing +menuTitle: Auditing +weight: 40 +description: '' +--- +Since version 3.0.0 Spring Data ArangoDB provides basic auditing functionality +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 implements ArangoConfiguration { +``` + +We can now add fields to our model classes and annotate 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<User> { + @Override + public Optional<User> getCurrentAuditor() { + // return current user + } +} +``` + +and add the implementation as a bean to our Spring context. + +```java +@Configuration +@EnableArangoAuditing(auditorAwareRef = "auditorProvider") +public class MyConfiguration implements ArangoConfiguration { + + @Bean + public AuditorAware<User> 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; + +} +``` + +To customize the behavior of deciding whether an entity instance is new or +has already been persisted previously, the entity can implement the +`org.springframework.data.domain.Persistable<ID>` interface which is defined as follows: + +```java +public interface Persistable<ID> { + /** + * Returns the id of the entity. + * + * @return the id. Can be {@literal null}. + */ + @Nullable + ID getId(); + + /** + * Returns if the {@code Persistable} is new or was persisted already. + * + * @return if {@literal true} the object is new. + */ + boolean isNew(); +} +``` + +For example, we might want to consider an entity instance new if the field +`createdDate` is `null`: + +```java +@Document +public class Person implements Persistable<String> { + + @Id + private String id; + private String name; + + @CreatedDate + private Instant createdDate; + + @LastModifiedDate + private Instant modifiedDate; + + @Override + public String getId() { + return id; + } + + @Override + @Transient + public boolean isNew() { + return created == null; + } + + // ... +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md new file mode 100644 index 0000000000..9b1594ac9c --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/converter.md @@ -0,0 +1,55 @@ +--- +title: Converter +menuTitle: Converter +weight: 30 +description: '' +--- +## Registering a Spring Converter + +The `ArangoConfiguration` provides a convenient way to register Spring +`Converter` by implementing the method `customConverters()`. + +**Examples** + +```java +@Configuration +public class MyConfiguration implements ArangoConfiguration { + + @Override + protected Collection<Converter<?, ?>> customConverters() { + return Arrays.asList(new MyConverter()); + } + +} +``` + +## Implementing a Spring Converter + +A `Converter` is used for reading if the source type is of type `VPackSlice` +or `DBDocumentEntity`. + +A `Converter` is used for writing if the target type is of type `VPackSlice`, +`DBDocumentEntity`, `BigInteger`, `BigDecimal`, `java.sql.Date`, +`java.sql.Timestamp`, `Instant`, `LocalDate`, `LocalDateTime`, `OffsetDateTime`, +`ZonedDateTime`, `Boolean`, `Short`, `Integer`, `Byte`, `Float`, `Double`, +`Character`, `String`, `Date`, `Class`, `Enum`, `boolean[]`, `long[]`, +`short[]`, `int[]`, `byte[]`, `float[]`, `double[]` or `char[]`. + +**Examples** + +```java +public class MyConverter implements Converter<MyObject, VPackSlice> { + + @Override + public VPackSlice convert(final MyObject source) { + VPackBuilder builder = new VPackBuilder(); + // map fields of MyObject to builder + return builder.slice(); + } + +} +``` + +For performance reasons `VPackSlice` should always be used within a converter. +If your object is too complex, you can also use `DBDocumentEntity` to simplify +the mapping. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md new file mode 100644 index 0000000000..6347675cb5 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/document.md @@ -0,0 +1,97 @@ +--- +title: Document +menuTitle: Document +weight: 5 +description: '' +--- +## Annotation @Document + +The annotations `@Document` applied to a class marks this class as a candidate +for mapping to the database. The most relevant parameter is `value` to specify +the collection name in the database. The annotation `@Document` specifies the +collection type to `DOCUMENT`. + +```java +@Document(value="persons") +public class Person { + ... +} +``` + +## Spring Expression support + +Spring Data ArangoDB supports the use of SpEL expressions within +`@Document#value`. This feature lets you define a dynamic collection name which +can be used to implement multi tenancy applications. + +```java +@Component +public class TenantProvider { + + public String getId() { + // threadlocal lookup + } + +} +``` + +```java +@Document("#{tenantProvider.getId()}_persons") +public class Person { + ... +} +``` + +## Annotation @From and @To + +With the annotations `@From` and `@To` applied on a collection or array field in +a class annotated with `@Document` the nested edge objects are fetched from the +database. Each of the nested edge objects has to be stored as separate edge +document in the edge collection described in the `@Edge` annotation of the +nested object class with the _\_id_ of the parent document as field _\_from_ +or _\_to_. + +```java +@Document("persons") +public class Person { + @From + private List<Relation> relations; +} + +@Edge(name="relations") +public class Relation { + ... +} +``` + +The database representation of `Person` in collection _persons_ looks as follow: + +``` +{ + "_key" : "123", + "_id" : "persons/123" +} +``` + +and the representation of `Relation` in collection _relations_: + +``` +{ + "_key" : "456", + "_id" : "relations/456", + "_from" : "persons/123" + "_to" : ".../..." +} +{ + "_key" : "789", + "_id" : "relations/456", + "_from" : "persons/123" + "_to" : ".../..." +} +... +``` + +**Note**: Since arangodb-spring-data 3.0.0 the annotations `@From` and `@To` +also work on non-collection/non-array fields. If multiple edges are linked with +the entity, it is not guaranteed that the same edge is returned every time. +Use at your own risk. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md new file mode 100644 index 0000000000..984f6711c0 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/edge.md @@ -0,0 +1,95 @@ +--- +title: Edge +menuTitle: Edge +weight: 10 +description: '' +--- +## Annotation @Edge + +The annotations `@Edge` applied to a class marks this class as a candidate for +mapping to the database. The most relevant parameter is `value` to specify the +collection name in the database. The annotation `@Edge` specifies the collection +type to `EDGE`. + +```java +@Edge("relations") +public class Relation { + ... +} +``` + +## Spring Expression support + +Spring Data ArangoDB supports the use of SpEL expressions within `@Edge#value`. +This feature lets you define a dynamic collection name which can be used to +implement multi tenancy applications. + +```java +@Component +public class TenantProvider { + + public String getId() { + // threadlocal lookup + } + +} +``` + +```java +@Edge("#{tenantProvider.getId()}_relations") +public class Relation { + ... +} +``` + +## Annotation @From and @To + +With the annotations `@From` and `@To` applied on a field in a class annotated +with `@Edge` the nested object is fetched from the database. The nested object +has to be stored as a separate document in the collection described in the +`@Document` annotation of the nested object class. The _\_id_ field of this +nested object is stored in the fields `_from` or `_to` within the edge document. + +```java +@Edge("relations") +public class Relation { + @From + private Person c1; + @To + private Person c2; +} + +@Document(value="persons") +public class Person { + @Id + private String id; +} +``` + +The database representation of `Relation` in collection _relations_ looks as follow: + +``` +{ + "_key" : "123", + "_id" : "relations/123", + "_from" : "persons/456", + "_to" : "persons/789" +} +``` + +and the representation of `Person` in collection _persons_: + +``` +{ + "_key" : "456", + "_id" : "persons/456", +} +{ + "_key" : "789", + "_id" : "persons/789", +} +``` + +**Note:** If you want to save an instance of `Relation`, both `Person` objects +(from & to) already have to be persisted and the class `Person` needs a field +with the annotation `@Id` so it can hold the persisted `_id` from the database. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md new file mode 100644 index 0000000000..af728f23da --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/events.md @@ -0,0 +1,42 @@ +--- +title: Events +menuTitle: Events +weight: 35 +description: '' +--- +Spring Data ArangoDB includes several `ApplicationEvent` events that your +application can respond to by registering subclasses of +`AbstractArangoEventListener` in the ApplicationContext. + +The following callback methods are present in `AbstractArangoEventListener`: + +- `onAfterLoad`: Called in `ArangoTemplate#find` and `ArangoTemplate#query` after the object is loaded from the database. +- `onBeforeSave`: Called in `ArangoTemplate#insert`/`#update`/`#replace` before the object is converted and send to the database. +- `onAfterSave`: Called in `ArangoTemplate#insert`/`#update`/`#replace` after the object is send to the database. +- `onBeforeDelete`: Called in `ArangoTemplate#delete` before the object is converted and send to the database. +- `onAfterDelete`: Called in `ArangoTemplate#delete` after the object is deleted from the database. + +**Examples** + +```java +package my.mapping.events; + +public class BeforePersonSavedListener extends AbstractArangoEventListener<Person> { + + @Override + public void onBeforeSave(BeforeSaveEvent<Person> event) { + // do some logging or data manipulation + } + +} +``` + +To register the listener add `@ComponentScan` with the package of your listener +to your configuration class. + +```java +@Configuration +@ComponentScan("my.mapping.events") +public class MyConfiguration implements ArangoConfiguration { + ... +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md new file mode 100644 index 0000000000..83dd5a0f86 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/indexes.md @@ -0,0 +1,121 @@ +--- +title: Indexes +menuTitle: Indexes +weight: 25 +description: '' +--- +Indexes can be ensured using the following annotations. For reference see the +[indexing](../../../../../index-and-search/indexing/_index.md) documentation +and specific aspects that apply to +[indexes on shards](../../../../../deploy/architecture/data-sharding.md#indexes-on-shards). + +## Annotation @\<IndexType\>Indexed + +With the `@<IndexType>Indexed` annotations user defined indexes can be created +at a collection level by annotating single fields of a class. + +Possible `@<IndexType>Indexed` annotations are: + +- `@PersistentIndexed` +- `@GeoIndexed` +- `@FulltextIndexed` +- `@TtlIndexed` + +The following example creates a persistent index on the field `name` and a +separate persistent index on the field `age`: + +```java +public class Person { + @PersistentIndexed + private String name; + + @PersistentIndexed + private int age; +} +``` + +With the `@<IndexType>Indexed` annotations different indexes can be created on the same field. + +The following example creates a TTL index and also a persistent index on the field `name`: + +```java +public class Person { + @TtlIndexed + @PersistentIndexed + private String name; +} +``` + +## Annotation @\<IndexType\>Index + +If the index should include multiple fields the `@<IndexType>Index` annotations +can be used on the type instead. + +Possible `@<IndexType>Index` annotations are: + +- `@PersistentIndex` +- `@GeoIndex` +- `@FulltextIndex` +- `@TtlIndex` + +The following example creates a single persistent index on the fields `name` and +`age`, note that if a field is renamed in the database with @Field, the new +field name must be used in the index declaration: + +```java +@PersistentIndex(fields = {"fullname", "age"}) +public class Person { + @Field("fullname") + private String name; + + private int age; +} +``` + +The `@<IndexType>Index` annotations can also be used to create an index on a nested field. + +The following example creates a single persistent index on the fields `name` and +`address.country`: + +```java +@PersistentIndex(fields = {"name", "address.country"}) +public class Person { + private String name; + + private Address address; +} +``` + +The `@<IndexType>Index` annotations and the `@<IndexType>Indexed` annotations +can be used at the same time in one class. + +The following example creates a persistent index on the fields `name` and `age` +and a separate persistent index on the field `age`: + +```java +@PersistentIndex(fields = {"name", "age"}) +public class Person { + private String name; + + @PersistentIndexed + private int age; +} +``` + +The `@<IndexType>Index` annotations can be used multiple times to create more +than one index in this way. + +The following example creates a persistent index on the fields `name` and `age` +and a separate persistent index on the fields `name` and `gender`: + +```java +@PersistentIndex(fields = {"name", "age"}) +@PersistentIndex(fields = {"name", "gender"}) +public class Person { + private String name; + + private int age; + + private Gender gender; +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md new file mode 100644 index 0000000000..fd4fcaf1d1 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/reference.md @@ -0,0 +1,65 @@ +--- +title: Reference +menuTitle: Reference +weight: 15 +description: '' +--- +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. + +**Examples** + +```java +@Document(value="persons") +public class Person { + @Ref + private Address address; +} + +@Document("addresses") +public class Address { + @Id + private String id; + private String country; + private String street; +} +``` + +The database representation of `Person` in collection _persons_ looks as follow: + +```json +{ + "_key" : "123", + "_id" : "persons/123", + "address" : "addresses/456" +} +``` + +and the representation of `Address` in collection _addresses_: + +```json +{ + "_key" : "456", + "_id" : "addresses/456", + "country" : "...", + "street" : "..." +} +``` + +Without the annotation `@Ref` at the field `address`, the stored document would look: + +```json +{ + "_key" : "123", + "_id" : "persons/123", + "address" : { + "country" : "...", + "street" : "..." + } +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md new file mode 100644 index 0000000000..b621800db3 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/mapping/relations.md @@ -0,0 +1,34 @@ +--- +title: Relations +menuTitle: Relations +weight: 20 +description: '' +--- +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). + +**Examples** + +```java +@Document(value="persons") +public class Person { + @Relations(edge=Relation.class, depth=1, direction=Direction.ANY) + private List<Person> friends; +} + +@Edge(name="relations") +public class Relation { + +} +``` + +**Note**: Since arangodb-spring-data 3.0.0 the annotation `@Relations` also work +on non-collection/non-array fields. If multiple documents are linked with the +entity, it is not guaranteed that the same document is returned every time. +Use at your own risk. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md new file mode 100644 index 0000000000..4685be73ed --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/_index.md @@ -0,0 +1,47 @@ +--- +title: Repositories +menuTitle: Repositories +weight: 15 +description: >- + Interact with ArangoDB using the high-level and consistent abstraction + provided by Spring Data 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. + +The base interface of Spring Data ArangoDB is `ArangoRepository`. It extends the +Spring Data interfaces `PagingAndSortingRepository` and `QueryByExampleExecutor`. +To get access to all Spring Data ArangoDB repository functionality simply create +your own interface extending `ArangoRepository<T, ID>`. + +The type `T` represents your domain class and type `ID` the type of your field +annotated with `@Id` in your domain class. This field is persisted in ArangoDB +as document field `_key`. + +**Examples** + +```java +@Document +public class MyDomainClass { + @Id + private String id; + +} + +public interface MyRepository extends ArangoRepository<MyDomainClass, String> { + +} +``` + +Instances of a Repository are created in Spring beans through the auto-wired mechanism of Spring. + +```java +public class MySpringBean { + + @Autowired + private MyRepository rep; + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md new file mode 100644 index 0000000000..af805d8741 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/_index.md @@ -0,0 +1,125 @@ +--- +title: Queries +menuTitle: Queries +weight: 5 +description: '' +--- +Spring Data ArangoDB supports three kinds of queries: + +- [Derived queries](derived-queries.md) +- [Query methods](query-methods.md) +- [Named queries](named-queries.md) + +## Return types + +The method return type for single results can be a primitive type, a domain +class, `Map<String, Object>`, `BaseDocument`, `BaseEdgeDocument`, +`Optional<Type>`, `GeoResult<Type>`. + +The method return type for multiple results can additionally be +`ArangoCursor<Type>`, `Iterable<Type>`, `Collection<Type>`, `List<Type>`, +`Set<Type>`, `Page<Type>`, `Slice<Type>`, `GeoPage<Type>`, `GeoResults<Type>` +where Type can be everything a single result can be. + +## AQL query options + +You can set additional options for the query and the created cursor over the +class `AqlQueryOptions` which you can simply define as a method parameter +without a specific name. AqlQuery options can also be defined with the +`@QueryOptions` annotation, as shown below. Aql query options from an annotation +and those from an argument are merged if both exist, with those in the argument +taking precedence. + +The `AqlQueryOptions` allows you to set the cursor time-to-live, batch-size, +caching flag and several other settings. This special parameter works with both +[query methods](query-methods.md) +and [derived queries](derived-queries.md). Keep in mind that some options, like +time-to-live, are only effective if the method return type is`ArangoCursor<T>` +or `Iterable<T>`. + +**Examples** + +```java +public interface MyRepository extends Repository<Customer, String> { + + + @Query("FOR c IN #collection FILTER c.name == @0 RETURN c") + Iterable<Customer> query(String name, AqlQueryOptions options); + + + Iterable<Customer> findByName(String name, AqlQueryOptions options); + + + @QueryOptions(maxPlans = 1000, ttl = 128) + ArangoCursor<Customer> findByAddressZipCode(ZipCode zipCode); + + + @Query("FOR c IN #collection FILTER c[@field] == @value RETURN c") + @QueryOptions(cache = true, ttl = 128) + ArangoCursor<Customer> query(Map<String, Object> bindVars, AqlQueryOptions options); + +} +``` + +## Paging and sorting + +Spring Data ArangoDB supports Spring Data's `Pageable` and `Sort` parameters for +repository query methods. If these parameters are used together with a native +query, either through `@Query` annotation or [named queries](named-queries.md), +a placeholder must be specified: + +- `#pageable` for `Pageable` parameter +- `#sort` for `Sort` parameter + +Sort properties or paths are attributes separated by dots (e.g. `customer.age`). +Some rules apply for them: + +- they must not begin or end with a dot (e.g. `.customer.age`) +- dots in attributes are supported, but the whole attribute must be enclosed by backticks (e.g. `` customer.`attr.with.dots` ``) +- backticks in attributes are supported, but they must be escaped with a backslash (e.g. `` customer.attr_with\` ``) +- any backslashes (that do not escape a backtick) are escaped (e.g. `customer\` => `customer\\`) + +**Examples** + +``` +just.`some`.`attributes.that`.`form\``.a path\`.\ is converted to +`just`.`some`.`attributes.that`.`form\``.`a path\``.`\\` +``` + +**Native queries example** + +```java +public interface CustomerRepository extends ArangoRepository<Customer> { + + @Query("FOR c IN #collection FILTER c.name == @1 #pageable RETURN c") + Page<Customer> findByNameNative(Pageable pageable, String name); + + @Query("FOR c IN #collection FILTER c.name == @1 #sort RETURN c") + List<Customer> findByNameNative(Sort sort, String name); +} + +// don't forget to specify the var name of the document +final Pageable page = PageRequest.of(1, 10, Sort.by("c.age")); +repository.findByNameNative(page, "Matt"); + +final Sort sort = Sort.by(Direction.DESC, "c.age"); +repository.findByNameNative(sort, "Tony"); +``` + +**Derived queries example** + +```java +public interface CustomerRepository extends ArangoRepository<Customer> { + + Page<Customer> findByName(Pageable pageable, String name); + + List<Customer> findByName(Sort sort, String name); +} + +// no var name is necessary for derived queries +final Pageable page = PageRequest.of(1, 10, Sort.by("age")); +repository.findByName(page, "Matt"); + +final Sort sort = Sort.by(Direction.DESC, "age"); +repository.findByName(sort, "Tony"); +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md new file mode 100644 index 0000000000..69e45bafd7 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/derived-queries.md @@ -0,0 +1,218 @@ +--- +title: Derived queries +menuTitle: Derived queries +weight: 5 +description: '' +--- +## Semantic parts + +Spring Data ArangoDB supports queries derived from methods names by splitting it +into its semantic parts and converting into AQL. The mechanism strips the +prefixes + +- `find..By` +- `get..By` +- `query..By` +- `read..By` +- `stream..By` +- `count..By` +- `exists..By` +- `delete..By` +- `remove..By` + +from the method and parses the rest. The `By` acts as a separator to indicate +the start of the criteria for the query to be built. You can define conditions +on entity properties and concatenate them with `And` and `Or`. + +The complete list of part types for derived methods is below, where `doc` is a +document in the database + +| Keyword | Sample | Predicate | +| ------------------------------------------- | -------------------------------------- | -------------------------------------- | +| IsGreaterThan, GreaterThan, After | findByAgeGreaterThan(int age) | doc.age > age | +| IsGreaterThanEqual, GreaterThanEqual | findByAgeIsGreaterThanEqual(int age) | doc.age >= age | +| IsLessThan, LessThan, Before | findByAgeIsLessThan(int age) | doc.age < age | +| IsLessThanEqualLessThanEqual | findByAgeLessThanEqual(int age) | doc.age <= age | +| IsBetween, Between | findByAgeBetween(int lower, int upper) | lower < doc.age < upper | +| IsNotNull, NotNull | findByNameNotNull() | doc.name != null | +| IsNull, Null | findByNameNull() | doc.name == null | +| IsLike, Like | findByNameLike(String name) | doc.name LIKE name | +| IsNotLike, NotLike | findByNameNotLike(String name) | NOT(doc.name LIKE name) | +| IsStartingWith, StartingWith, StartsWith | findByNameStartsWith(String prefix) | doc.name LIKE prefix | +| IsEndingWith, EndingWith, EndsWith | findByNameEndingWith(String suffix) | doc.name LIKE suffix | +| Regex, MatchesRegex, Matches | findByNameRegex(String pattern) | REGEX_TEST(doc.name, name, ignoreCase) | +| (No Keyword) | findByFirstName(String name) | doc.name == name | +| IsTrue, True | findByActiveTrue() | doc.active == true | +| IsFalse, False | findByActiveFalse() | doc.active == false | +| Is, Equals | findByAgeEquals(int age) | doc.age == age | +| IsNot, Not | findByAgeNot(int age) | doc.age != age | +| IsIn, In | findByNameIn(String[] names) | doc.name IN names | +| IsNotIn, NotIn | findByNameIsNotIn(String[] names) | doc.name NOT IN names | +| IsContaining, Containing, Contains | findByFriendsContaining(String name) | name IN doc.friends | +| IsNotContaining, NotContaining, NotContains | findByFriendsNotContains(String name) | name NOT IN doc.friends | +| Exists | findByFriendNameExists() | HAS(doc.friend, name) | + +**Examples** + +```java +public interface MyRepository extends ArangoRepository<Customer, String> { + + // FOR c IN customers FILTER c.name == @0 RETURN c + ArangoCursor<Customer> findByName(String name); + ArangoCursor<Customer> getByName(String name); + + // FOR c IN customers + // FILTER c.name == @0 && c.age == @1 + // RETURN c + ArangoCursor<Customer> findByNameAndAge(String name, int age); + + // FOR c IN customers + // FILTER c.name == @0 || c.age == @1 + // RETURN c + ArangoCursor<Customer> findByNameOrAge(String name, int age); +} +``` + +You can apply sorting for one or multiple sort criteria by appending `OrderBy` +to the method and `Asc` or `Desc` for the directions. + +```java +public interface MyRepository extends ArangoRepository<Customer, String> { + + // FOR c IN customers + // FILTER c.name == @0 + // SORT c.age DESC RETURN c + ArangoCursor<Customer> getByNameOrderByAgeDesc(String name); + + // FOR c IN customers + // FILTER c.name = @0 + // SORT c.name ASC, c.age DESC RETURN c + ArangoCursor<Customer> findByNameOrderByNameAscAgeDesc(String name); + +} +``` + +## Property expression + +Property expressions can refer only to direct and nested properties of the +managed domain class. The algorithm checks the domain class for the entire +expression as the property. If the check fails, the algorithm splits up the +expression at the camel case parts from the right and tries to find the +corresponding property. + +**Examples** + +```java +@Document("customers") +public class Customer { + private Address address; +} + +public class Address { + private ZipCode zipCode; +} + +public interface MyRepository extends ArangoRepository<Customer, String> { + + // 1. step: search domain class for a property "addressZipCode" + // 2. step: search domain class for "addressZip.code" + // 3. step: search domain class for "address.zipCode" + ArangoCursor<Customer> findByAddressZipCode(ZipCode zipCode); +} +``` + +It is possible for the algorithm to select the wrong property if the domain +class also has a property which matches the first split of the expression. +To resolve this ambiguity you can use `_` as a separator inside your +method-name to define traversal points. + +**Examples** + +```java +@Document("customers") +public class Customer { + private Address address; + private AddressZip addressZip; +} + +public class Address { + private ZipCode zipCode; +} + +public class AddressZip { + private String code; +} + +public interface MyRepository extends ArangoRepository<Customer, String> { + + // 1. step: search domain class for a property "addressZipCode" + // 2. step: search domain class for "addressZip.code" + // creates query with "x.addressZip.code" + ArangoCursor<Customer> findByAddressZipCode(ZipCode zipCode); + + // 1. step: search domain class for a property "addressZipCode" + // 2. step: search domain class for "addressZip.code" + // 3. step: search domain class for "address.zipCode" + // creates query with "x.address.zipCode" + ArangoCursor<Customer> findByAddress_ZipCode(ZipCode zipCode); + +} +``` + +## Geospatial queries + +Geospatial queries are a subsection of derived queries. To use a geospatial +query on a collection, a geo index must exist on that collection. A geo index +can be created on a field which is a two element array, corresponding to +latitude and longitude coordinates. + +Alternatively, it can be created on a field of one of the following types: +- `org.springframework.data.geo.Point` +- `org.springframework.data.geo.Polygon` +- `com.arangodb.springframework.core.geo.GeoJsonPoint` +- `com.arangodb.springframework.core.geo.GeoJsonMultiPoint` +- `com.arangodb.springframework.core.geo.GeoJsonLineString` +- `com.arangodb.springframework.core.geo.GeoJsonMultiLineString` +- `com.arangodb.springframework.core.geo.GeoJsonPolygon` +- `com.arangodb.springframework.core.geo.GeoJsonMultiPolygon` + +These types will be serialized and deserialized to and from GeoJSON geometry +objects. Following the GeoJSON specification, the first coordinate in the point +coordinates list is the longitude and the second one is the latitude. +Note that to create a geospatial index on GeoJSON data field, the `geoJson` +option should be set to `true`, e.g. + +```java +class MyEntity { + // ... + @GeoIndexed(geoJson = true) + private Point location; + // ... +} +``` + +As a subsection of derived queries, geospatial queries support all the same +return types, but also support the three return types `GeoPage`, `GeoResult` and +`GeoResults`. These types must be used in order to get the distance of each +document as generated by the query. + +There are two kinds of geospatial query, Near and Within. Near sorts documents +by distance from the given point, while within both sorts and filters documents, +returning those within the given distance range or shape. + +**Examples** + +```java +public interface MyRepository extends ArangoRepository<City, String> { + + GeoResult<City> getByLocationNear(Point point); + + GeoResults<City> findByLocationWithinOrLocationWithin(Box box, Polygon polygon); + + //Equivalent queries + GeoResults<City> findByLocationWithinOrLocationWithin(Point point, int distance); + GeoResults<City> findByLocationWithinOrLocationWithin(Point point, Distance distance); + GeoResults<City> findByLocationWithinOrLocationWithin(Circle circle); + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md new file mode 100644 index 0000000000..bdfe837ace --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/named-queries.md @@ -0,0 +1,34 @@ +--- +title: Named queries +menuTitle: Named queries +weight: 15 +description: '' +--- +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: + +```java +package com.arangodb.repository; + +public interface CustomerRepository extends ArangoRepository<Customer, String> { + + Customer findByUsername(@Param("username") String username); + +} +``` + +The corresponding `arango-named-queries.properties` file looks like this: + +```properties +Customer.findByUsername = FOR c IN customers FILTER c.username == @username RETURN c +``` + +The queries specified in the properties file are no different than the queries +that can be defined with the `@Query` annotation. The only difference is that +the queries are in one place. If there is a `@Query` annotation present and a +named query defined, the query in the `@Query` annotation takes precedence. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md new file mode 100644 index 0000000000..90f1fa74b9 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/repositories/queries/query-methods.md @@ -0,0 +1,132 @@ +--- +title: Query methods +menuTitle: Query methods +weight: 10 +description: '' +--- +Queries using [ArangoDB Query Language (AQL)](../../../../../../aql/_index.md) +can be supplied with the `@Query` annotation on methods. + +## Passing collection name + +Instead of writing the collection name statically into the query string, the +placeholder `#collection` can be specified. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + // FOR c IN customer RETURN c + @Query("FOR c IN #collection RETURN c") + ArangoCursor<Customer> query(); + +} +``` + +## Passing bind parameters + +There are three ways of passing bind parameters to the query in the query annotation. + +### Number matching + +Using number matching, arguments will be substituted into the query in the order +they are passed to the query method. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @0 AND c.surname == @1 RETURN c") + ArangoCursor<Customer> query(String name, String surname); + +} +``` + +### @Param + +With the `@Param` annotation, the argument will be placed in the query at the +place corresponding to the value passed to the `@Param` annotation. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname == @surname RETURN c") + ArangoCursor<Customer> query(@Param("name") String name, @Param("surname") String surname); + +} +``` + +### @BindVars + +In addition you can use a method parameter of type `Map<String, Object>` +annotated with `@BindVars` as your bind parameters. You can then fill the map +with any parameter used in the query (also see [AQL Bind Parameters](../../../../../../aql/fundamentals/bind-parameters.md)). + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname = @surname RETURN c") + ArangoCursor<Customer> query(@BindVars Map<String, Object> bindVars); + +} +``` + +A mixture of any of these methods can be used. Parameters with the same name +from an `@Param` annotation will override those in the `bindVars`. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname = @surname RETURN c") + ArangoCursor<Customer> query(@BindVars Map<String, Object> bindVars, @Param("name") String name); + +} +``` + +## Query options + +`AqlQueryOptions` can also be passed to the driver, as an argument anywhere in +the method signature. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname == @surname RETURN c") + ArangoCursor<Customer> query(@Param("name") String name, @Param("surname") String surname, AqlQueryOptions options); + +} +``` + +## Spring Expression support + +SpEL expressions can be embedded in the query string to +dynamically customize it depending on the invocation parameters and/or invoking +methods on Spring Beans. In particular: +- SpEL expressions must be wrapped within `#{}` +- SpEL variables can be set annotating method parameters with + `@SpelParam("varName")` and referenced with `#varName` +- Spring Beans can be referenced with `@myBean` (factory beans with `&myBean`) +- the SpEL variable `#collection` is automatically set + +```java +public interface MyRepository extends ArangoRepository<Customer, String> { + + @Query("FOR c IN #{#collection} FILTER #{@filterGenerator.allEqual('c', #kv)} RETURN c") + List<Customer> findByAllEqual(@SpelParam("kv") Map<String, Object> kv); + +} + +@Component("filterGenerator") +public class FilterGenerator { + + public String allEqual(String col, Map<String, Object> kv) { + return kv.entrySet().stream() + .map(it -> col + "." + it.getKey() + " == " + escape(it.getValue())) + .collect(Collectors.joining(" AND ")); + } + + private Object escape(Object o) { + if (o instanceof String) return "\"" + o + "\""; + else return o; + } + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/template.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/template.md new file mode 100644 index 0000000000..48f46f0970 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-3/template.md @@ -0,0 +1,15 @@ +--- +title: Template +menuTitle: Template +weight: 10 +description: >- + With `ArangoTemplate`, Spring Data ArangoDB offers a central support for + interactions with the database over a rich feature set +--- +`ArangoTemplate` 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. + +The `ArangoTemplate` class is the default implementation of the operations +interface `ArangoOperations` which developers of Spring Data are encouraged to +code against. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/_index.md new file mode 100644 index 0000000000..c72a332853 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/_index.md @@ -0,0 +1,6 @@ +--- +title: Spring Data ArangoDB - Reference (version 4) +menuTitle: Reference version 4 +weight: 5 +description: '' +--- diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md new file mode 100644 index 0000000000..1fa37a61a3 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/_index.md @@ -0,0 +1,280 @@ +--- +title: Mapping +menuTitle: Mapping +weight: 20 +description: >- + The features and conventions for mapping Java objects to documents and how to + override those conventions with annotation based mapping metadata +--- +## Conventions + +- The Java class name is mapped to the collection name +- The non-static fields of a Java object are used as fields in the stored document +- The Java field name is mapped to the stored document field name +- All nested Java object are stored as nested objects in the stored document +- The Java class needs a constructor which meets the following criteria: + - in case of a single constructor: + - a non-parameterized constructor or + - a parameterized constructor + - in case of multiple constructors: + - a non-parameterized constructor or + - a parameterized constructor annotated with `@PersistenceConstructor` + +## Type mapping + +As collections in ArangoDB can contain documents of various types, a mechanism +to retrieve the correct Java class is required. The type information of +properties declared in a class may not be enough to restore the original class +(due to inheritance). If the declared complex type and the actual type do not +match, information about the actual type is stored together with the document. +This is necessary to restore the correct type when reading from the DB. +Consider the following example: + +```java +public class Person { + private String name; + private Address homeAddress; + // ... + + // getters and setters omitted +} + +public class Employee extends Person { + private Address workAddress; + // ... + + // getters and setters omitted +} + +public class Address { + private final String street; + private final String number; + // ... + + public Address(String street, String number) { + this.street = street; + this.number = number; + } + + // getters omitted +} + +@Document +public class Company { + @Key + private String key; + private Person manager; + + // getters and setters omitted +} + +Employee manager = new Employee(); +manager.setName("Jane Roberts"); +manager.setHomeAddress(new Address("Park Avenue", "432/64")); +manager.setWorkAddress(new Address("Main Street", "223")); +Company comp = new Company(); +comp.setManager(manager); +``` + +The serialized document for the DB looks like this: + +```json +{ + "manager": { + "name": "Jane Roberts", + "homeAddress": { + "street": "Park Avenue", + "number": "432/64" + }, + "workAddress": { + "street": "Main Street", + "number": "223" + }, + "_class": "com.arangodb.Employee" + }, + "_class": "com.arangodb.Company" +} +``` + +Type hints are written for top-level documents (as a collection can contain +different document types) as well as for every value if it's a complex type and +a sub-type of the property type declared. `Map`s and `Collection`s are excluded +from type mapping. Without the additional information about the concrete classes +used, the document couldn't be restored in Java. The type information of the +`manager` property is not enough to determine the `Employee` type. +The `homeAddress` and `workAddress` properties have the same actual and defined +type, thus no type hint is needed. + +### Customizing type mapping + +By default, the fully qualified class name is stored in the documents as a type +hint. A custom type hint can be set with the `@TypeAlias("my-alias")` annotation +on an entity. Make sure that it is an unique identifier across all entities. +If we would add a `TypeAlias("employee")` annotation to the `Employee` class +above, it would be persisted as `"_class": "employee"`. + +The default type key is `_class` and can be changed by overriding the `typeKey()` +method of the `ArangoConfiguration` class. + +If you need to further customize the type mapping process, the `arangoTypeMapper()` +method of the configuration class can be overridden. The included +`DefaultArangoTypeMapper` can be customized by providing a list of +[`TypeInformationMapper`](https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/convert/TypeInformationMapper.html)s +that create aliases from types and vice versa. + +In order to fully customize the type mapping process you can provide a custom +type mapper implementation by extending the `DefaultArangoTypeMapper` class. + +### Deactivating type mapping + +To deactivate the type mapping process, you can return `null` from the `typeKey()` +method of the `ArangoConfiguration` class. No type hints are stored in the +documents with this setting. If you make sure that each defined type corresponds +to the actual type, you can disable the type mapping, otherwise it can lead to +exceptions when reading the entities from the DB. + +### Security considerations + +The default polymorphic type handling strategy used by Spring Data ArangoDB uses +the type hint stored in the `_class` field, which is the fully qualified class +name by default. + +In particular, when reading a property of type `java.lang.Object`, any class +referenced by the `_class` field could be instantiated. + +In addition, the framework instantiates deserialized objects by invoking +constructors with arguments and setting properties invoking the related setters. + +This represents a security vulnerability when dealing with untrusted data, which +could cause deserialization to arbitrary target classes, trigger gadget chain +attacks, and potentially lead to remote code execution. See +[Insecure deserialization](https://learn.snyk.io/lesson/insecure-deserialization) +for details. + +Therefore, using the type `java.lang.Object` for persistent entities properties +is strongly discouraged, in particular when used for modeling untrusted data, +i.e. arbitrary JSON data coming from web users. Note that this also applies to +generics type parameters, i.e. `Map<String, Object>`, `List<Object>`, and so on. + +As work-around, it is recommended to use specific user-defined types for +persistent entities properties. + +Properties containing arbitrary JSON data can be safely typed using Jackson types +like the following: +- `com.fasterxml.jackson.databind.JsonNode` +- `com.fasterxml.jackson.databind.node.ObjectNode` +- `com.fasterxml.jackson.databind.node.ArrayNode` + +## Annotations + +### Annotation overview + +| annotation | level | description | +|--------------------------------| ------------------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| @Document | class | marks this class as a candidate for mapping | +| @Edge | class | marks this class as a candidate for mapping | +| @Id | field | stores the field as the system field \_key | +| @ArangoId | field | stores the field as the system field \_id | +| @Rev | field | stores the field as the system field \_rev | +| @Field("alt-name") | field | stores the field with an alternative name | +| @Ref | field | stores the \_id of the referenced document and not the nested document | +| @From | field | stores the \_id of the referenced document as the system field \_from | +| @To | field | stores the \_id of the referenced document as the system field \_to | +| @Relations | field | vertices which are connected over edges | +| @Transient | field, method, annotation | marks a field to be transient for the mapping framework, thus the property is not persisted and not further inspected by the mapping framework | +| @PersistenceConstructor | constructor | marks a given constructor - even a package protected one - to use when instantiating the object from the database | +| @TypeAlias("alias") | class | set a type alias for the class when persisted to the DB | +| @ArangoComputedValueDefinition | class | describes a computed value data definition | +| @ArangoComputedValue | field | marks the field for the mapping framework so that the property is updated with the value coming from the server and optionally describes a computed value data definition | +| @PersistentIndex | class | describes a persistent index | +| @PersistentIndexed | field | describes how to index the field | +| @GeoIndex | class | describes a geo index | +| @GeoIndexed | field | describes how to index the field | +| @FulltextIndex | class | describes a fulltext index | +| @FulltextIndexed | field | describes how to index the field | +| @TtlIndex | class | describes a TTL index | +| @TtlIndexed | field | describes how to index the field | +| @CreatedBy | field | Declares a field as the one representing the principal that created the entity containing the field. | +| @CreatedDate | field | Declares a field as the one representing the date the entity containing the field was created. | +| @LastModifiedBy | field | Declares a field as the one representing the principal that recently modified the entity containing the field. | +| @LastModifiedDate | field | Declares a field as the one representing the date the entity containing the field was recently modified. | + +## Invoking conversion manually + +In order to invoke entity serialization and deserialization to and from Jackson +`JsonNode` manually, you can inject an instance of `ArangoConverter` and +respectively call the methods `write` and `read` on it, e.g.: + +```java +// ... + +@Autowired +ArangoConverter arangoConverter; + + // ... + JsonNode jn = converter.write(entity); + + // ... + MyEntity entity = converter.read(MyEntity.class, jn); +``` + +## Object Mapping + +Spring Data ArangoDB delegates object mapping, object creation, field and property access to +[Spring Data Commons](https://docs.spring.io/spring-data/commons/reference/object-mapping.html). + +Methods in `ArangoOperations` try modifying the domain objects accepted as parameters, +updating the properties potentially modified by the server side, if the related fields +are mutable. This applies to the fields annotated with: +- `@ArangoId` +- `@Id` +- `@Rev` + +In addition, the following methods also try to update the fields annotated with +`@ArangoComputedValue`: +- `ArangoOperations#repsert(Object)` +- `ArangoOperations#repsertAll(Iterable<Object>, Class<?>)` + +## Object Identity + +The most of the methods in `ArangoOperations` and `ArangoRepository` return new +entity instances, except the following: +- `ArangoRepository#save(Object)` +- `ArangoRepository#saveAll(Iterable<Object>)` + +These methods return by default the same instance(s) of the domain object(s) +accepted as parameter(s) and update the properties potentially modified by the +server side, if the related fields are mutable. +This applies to the fields annotated with: +- `@ArangoId` +- `@Id` +- `@Rev` +- `@ArangoComputedValue` + +This behavior can be changed by overriding `ArangoConfiguration#returnOriginalEntities()`, +which by default returns `true`. For example: + +```java +@Configuration +@EnableArangoRepositories +public class MyConfiguration implements ArangoConfiguration { + + // ... + + @Override + public boolean returnOriginalEntities() { + return false; + } + +} +``` + +Note that also in this case, input parameters properties are still updated, if mutable. + +## Working with immutable objects + +Spring Data ArangoDB can work with immutable entity classes, like Java Records, +Kotlin data classes and final classes with immutable properties. In this case, +to use `ArangoRepository#save(Object)` and `ArangoRepository#saveAll(Iterable<Object>)` +is required overriding `ArangoConfiguration#returnOriginalEntities()` to make it +return `false`, see [Object Identity](#object-identity). diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md new file mode 100644 index 0000000000..a236cd77f2 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/auditing.md @@ -0,0 +1,148 @@ +--- +title: Auditing +menuTitle: Auditing +weight: 40 +description: '' +--- +Since version 3.0.0 Spring Data ArangoDB provides basic auditing functionality +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 implements ArangoConfiguration { +``` + +We can now add fields to our model classes and annotate 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<User> { + @Override + public Optional<User> getCurrentAuditor() { + // return current user + } +} +``` + +and add the implementation as a bean to our Spring context. + +```java +@Configuration +@EnableArangoAuditing(auditorAwareRef = "auditorProvider") +public class MyConfiguration implements ArangoConfiguration { + + @Bean + public AuditorAware<User> 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; + +} +``` + +To customize the behavior of deciding whether an entity instance is new or has +already been persisted previously, the entity can implement the +`org.springframework.data.domain.Persistable<ID>` interface which is defined as follows: + +```java +public interface Persistable<ID> { + /** + * Returns the id of the entity. + * + * @return the id. Can be {@literal null}. + */ + @Nullable + ID getId(); + + /** + * Returns if the {@code Persistable} is new or was persisted already. + * + * @return if {@literal true} the object is new. + */ + boolean isNew(); +} +``` + +For example, we might want to consider an entity instance new if the field +`createdDate` is `null`: + +```java +@Document +public class Person implements Persistable<String> { + + @Id + private String id; + private String name; + + @CreatedDate + private Instant createdDate; + + @LastModifiedDate + private Instant modifiedDate; + + @Override + public String getId() { + return id; + } + + @Override + @Transient + public boolean isNew() { + return created == null; + } + + // ... +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md new file mode 100644 index 0000000000..59bf728d9a --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/computed-values.md @@ -0,0 +1,58 @@ +--- +title: Computed Values +menuTitle: Computed Values +weight: 27 +description: '' +archetype: default +--- +Spring Data ArangoDB provides annotations to allow mapping computed values to +entity properties and to include computed values data definitions during +collection creation. + +For reference, see the [computed values](../../../../../concepts/data-structure/documents/computed-values.md) +documentation. + +## Mapping + +Computed values can be mapped to entity properties by annotating the related +fields with `@ArangoComputedValue`. + +If the property is mutable, then the field is automatically updated in place +with the value coming from the server in the following methods: +- `ArangoOperations#repsert(Object)` +- `ArangoOperations#repsertAll(Iterable, Class)` +- `ArangoRepository#save(Object)` +- `ArangoRepository#saveAll(Iterable)` + +## Data Definitions + +Computed values data definitions can be specified through parameters of the +following annotations: +- `@ArangoComputedValue` on fields +- `@ArangoComputedValueDefinition` on classes (optionally within `@ArangoComputedValueDefinitions`) + +**Example** + +```java +@Document +@ArangoComputedValueDefinition( + name = "username", + expression = "RETURN \"unknown\"", + computeOn = ComputedValue.ComputeOn.insert +) +class MyEntity { + + @ArangoComputedValue + String username; + + @ArangoComputedValue("RETURN 0") + int age; + + // ... + +} +``` + +On database collection creation, the computed values metadata is included. +Note that the data definitions are not updated in case the database collection +already exists. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md new file mode 100644 index 0000000000..18ff53f945 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/converter.md @@ -0,0 +1,53 @@ +--- +title: Converter +menuTitle: Converter +weight: 30 +description: '' +--- +## Registering a Spring Converter + +The `ArangoConfiguration` provides a convenient way to register Spring +`Converter` by implementing the method `customConverters()`. + +**Examples** + +```java +@Configuration +public class MyConfiguration implements ArangoConfiguration { + + @Override + protected Collection<Converter<?, ?>> customConverters() { + return Arrays.asList(new MyConverter()); + } + +} +``` + +## Implementing a Spring Converter + +A `Converter` is used for reading if the source type is of type `JsonNode` +or `DBDocumentEntity`. + +A `Converter` is used for writing if the target type is of type `JsonNode`, +`DBDocumentEntity`, `BigInteger`, `BigDecimal`, `java.sql.Date`, +`java.sql.Timestamp`, `Instant`, `LocalDate`, `LocalDateTime`, `OffsetDateTime`, +`ZonedDateTime`, `Boolean`, `Short`, `Integer`, `Byte`, `Float`, `Double`, +`Character`, `String`, `Date`, `Class`, `Enum`, `boolean[]`, `long[]`, +`short[]`, `int[]`, `byte[]`, `float[]`, `double[]` or `char[]`. + +**Examples** + +```java +public class MyConverter implements Converter<MyObject, JsonNode> { + + @Override + public JsonNode convert(final MyObject source) { + ObjectNode on = JsonNodeFactory.instance.objectNode(); + // map fields of MyObject to builder + // on.put("key", "value"); + // ... + return on; + } + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md new file mode 100644 index 0000000000..6347675cb5 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/document.md @@ -0,0 +1,97 @@ +--- +title: Document +menuTitle: Document +weight: 5 +description: '' +--- +## Annotation @Document + +The annotations `@Document` applied to a class marks this class as a candidate +for mapping to the database. The most relevant parameter is `value` to specify +the collection name in the database. The annotation `@Document` specifies the +collection type to `DOCUMENT`. + +```java +@Document(value="persons") +public class Person { + ... +} +``` + +## Spring Expression support + +Spring Data ArangoDB supports the use of SpEL expressions within +`@Document#value`. This feature lets you define a dynamic collection name which +can be used to implement multi tenancy applications. + +```java +@Component +public class TenantProvider { + + public String getId() { + // threadlocal lookup + } + +} +``` + +```java +@Document("#{tenantProvider.getId()}_persons") +public class Person { + ... +} +``` + +## Annotation @From and @To + +With the annotations `@From` and `@To` applied on a collection or array field in +a class annotated with `@Document` the nested edge objects are fetched from the +database. Each of the nested edge objects has to be stored as separate edge +document in the edge collection described in the `@Edge` annotation of the +nested object class with the _\_id_ of the parent document as field _\_from_ +or _\_to_. + +```java +@Document("persons") +public class Person { + @From + private List<Relation> relations; +} + +@Edge(name="relations") +public class Relation { + ... +} +``` + +The database representation of `Person` in collection _persons_ looks as follow: + +``` +{ + "_key" : "123", + "_id" : "persons/123" +} +``` + +and the representation of `Relation` in collection _relations_: + +``` +{ + "_key" : "456", + "_id" : "relations/456", + "_from" : "persons/123" + "_to" : ".../..." +} +{ + "_key" : "789", + "_id" : "relations/456", + "_from" : "persons/123" + "_to" : ".../..." +} +... +``` + +**Note**: Since arangodb-spring-data 3.0.0 the annotations `@From` and `@To` +also work on non-collection/non-array fields. If multiple edges are linked with +the entity, it is not guaranteed that the same edge is returned every time. +Use at your own risk. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md new file mode 100644 index 0000000000..984f6711c0 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/edge.md @@ -0,0 +1,95 @@ +--- +title: Edge +menuTitle: Edge +weight: 10 +description: '' +--- +## Annotation @Edge + +The annotations `@Edge` applied to a class marks this class as a candidate for +mapping to the database. The most relevant parameter is `value` to specify the +collection name in the database. The annotation `@Edge` specifies the collection +type to `EDGE`. + +```java +@Edge("relations") +public class Relation { + ... +} +``` + +## Spring Expression support + +Spring Data ArangoDB supports the use of SpEL expressions within `@Edge#value`. +This feature lets you define a dynamic collection name which can be used to +implement multi tenancy applications. + +```java +@Component +public class TenantProvider { + + public String getId() { + // threadlocal lookup + } + +} +``` + +```java +@Edge("#{tenantProvider.getId()}_relations") +public class Relation { + ... +} +``` + +## Annotation @From and @To + +With the annotations `@From` and `@To` applied on a field in a class annotated +with `@Edge` the nested object is fetched from the database. The nested object +has to be stored as a separate document in the collection described in the +`@Document` annotation of the nested object class. The _\_id_ field of this +nested object is stored in the fields `_from` or `_to` within the edge document. + +```java +@Edge("relations") +public class Relation { + @From + private Person c1; + @To + private Person c2; +} + +@Document(value="persons") +public class Person { + @Id + private String id; +} +``` + +The database representation of `Relation` in collection _relations_ looks as follow: + +``` +{ + "_key" : "123", + "_id" : "relations/123", + "_from" : "persons/456", + "_to" : "persons/789" +} +``` + +and the representation of `Person` in collection _persons_: + +``` +{ + "_key" : "456", + "_id" : "persons/456", +} +{ + "_key" : "789", + "_id" : "persons/789", +} +``` + +**Note:** If you want to save an instance of `Relation`, both `Person` objects +(from & to) already have to be persisted and the class `Person` needs a field +with the annotation `@Id` so it can hold the persisted `_id` from the database. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md new file mode 100644 index 0000000000..af728f23da --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/events.md @@ -0,0 +1,42 @@ +--- +title: Events +menuTitle: Events +weight: 35 +description: '' +--- +Spring Data ArangoDB includes several `ApplicationEvent` events that your +application can respond to by registering subclasses of +`AbstractArangoEventListener` in the ApplicationContext. + +The following callback methods are present in `AbstractArangoEventListener`: + +- `onAfterLoad`: Called in `ArangoTemplate#find` and `ArangoTemplate#query` after the object is loaded from the database. +- `onBeforeSave`: Called in `ArangoTemplate#insert`/`#update`/`#replace` before the object is converted and send to the database. +- `onAfterSave`: Called in `ArangoTemplate#insert`/`#update`/`#replace` after the object is send to the database. +- `onBeforeDelete`: Called in `ArangoTemplate#delete` before the object is converted and send to the database. +- `onAfterDelete`: Called in `ArangoTemplate#delete` after the object is deleted from the database. + +**Examples** + +```java +package my.mapping.events; + +public class BeforePersonSavedListener extends AbstractArangoEventListener<Person> { + + @Override + public void onBeforeSave(BeforeSaveEvent<Person> event) { + // do some logging or data manipulation + } + +} +``` + +To register the listener add `@ComponentScan` with the package of your listener +to your configuration class. + +```java +@Configuration +@ComponentScan("my.mapping.events") +public class MyConfiguration implements ArangoConfiguration { + ... +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md new file mode 100644 index 0000000000..d21f2b1061 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/indexes.md @@ -0,0 +1,121 @@ +--- +title: Indexes +menuTitle: Indexes +weight: 25 +description: '' +--- +Indexes can be ensured using the following annotations. For reference see the +[indexing](../../../../../index-and-search/indexing/_index.md) documentation +and specific aspects that apply to +[indexes on shards](../../../../../deploy/architecture/data-sharding.md#indexes-on-shards). + +## Annotation @\<IndexType\>Indexed + +With the `@<IndexType>Indexed` annotations user defined indexes can be created +at a collection level by annotating single fields of a class. + +Possible `@<IndexType>Indexed` annotations are: + +- `@PersistentIndexed` +- `@GeoIndexed` +- `@FulltextIndexed` (deprecated) +- `@TtlIndexed` + +The following example creates a persistent index on the field `name` and a +separate persistent index on the field `age`: + +```java +public class Person { + @PersistentIndexed + private String name; + + @PersistentIndexed + private int age; +} +``` + +With the `@<IndexType>Indexed` annotations different indexes can be created on the same field. + +The following example creates a TTL index and also a persistent index on the field `name`: + +```java +public class Person { + @TtlIndexed + @PersistentIndexed + private String name; +} +``` + +## Annotation @\<IndexType\>Index + +If the index should include multiple fields the `@<IndexType>Index` annotations +can be used on the type instead. + +Possible `@<IndexType>Index` annotations are: + +- `@PersistentIndex` +- `@GeoIndex` +- `@FulltextIndex` (deprecated) +- `@TtlIndex` + +The following example creates a single persistent index on the fields `name` and +`age`, note that if a field is renamed in the database with @Field, the new +field name must be used in the index declaration: + +```java +@PersistentIndex(fields = {"fullname", "age"}) +public class Person { + @Field("fullname") + private String name; + + private int age; +} +``` + +The `@<IndexType>Index` annotations can also be used to create an index on a nested field. + +The following example creates a single persistent index on the fields `name` and +`address.country`: + +```java +@PersistentIndex(fields = {"name", "address.country"}) +public class Person { + private String name; + + private Address address; +} +``` + +The `@<IndexType>Index` annotations and the `@<IndexType>Indexed` annotations +can be used at the same time in one class. + +The following example creates a persistent index on the fields `name` and `age` +and a separate persistent index on the field `age`: + +```java +@PersistentIndex(fields = {"name", "age"}) +public class Person { + private String name; + + @PersistentIndexed + private int age; +} +``` + +The `@<IndexType>Index` annotations can be used multiple times to create more +than one index in this way. + +The following example creates a persistent index on the fields `name` and `age` +and a separate persistent index on the fields `name` and `gender`: + +```java +@PersistentIndex(fields = {"name", "age"}) +@PersistentIndex(fields = {"name", "gender"}) +public class Person { + private String name; + + private int age; + + private Gender gender; +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md new file mode 100644 index 0000000000..fd4fcaf1d1 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/reference.md @@ -0,0 +1,65 @@ +--- +title: Reference +menuTitle: Reference +weight: 15 +description: '' +--- +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. + +**Examples** + +```java +@Document(value="persons") +public class Person { + @Ref + private Address address; +} + +@Document("addresses") +public class Address { + @Id + private String id; + private String country; + private String street; +} +``` + +The database representation of `Person` in collection _persons_ looks as follow: + +```json +{ + "_key" : "123", + "_id" : "persons/123", + "address" : "addresses/456" +} +``` + +and the representation of `Address` in collection _addresses_: + +```json +{ + "_key" : "456", + "_id" : "addresses/456", + "country" : "...", + "street" : "..." +} +``` + +Without the annotation `@Ref` at the field `address`, the stored document would look: + +```json +{ + "_key" : "123", + "_id" : "persons/123", + "address" : { + "country" : "...", + "street" : "..." + } +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md new file mode 100644 index 0000000000..b621800db3 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/mapping/relations.md @@ -0,0 +1,34 @@ +--- +title: Relations +menuTitle: Relations +weight: 20 +description: '' +--- +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). + +**Examples** + +```java +@Document(value="persons") +public class Person { + @Relations(edge=Relation.class, depth=1, direction=Direction.ANY) + private List<Person> friends; +} + +@Edge(name="relations") +public class Relation { + +} +``` + +**Note**: Since arangodb-spring-data 3.0.0 the annotation `@Relations` also work +on non-collection/non-array fields. If multiple documents are linked with the +entity, it is not guaranteed that the same document is returned every time. +Use at your own risk. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md new file mode 100644 index 0000000000..4685be73ed --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/_index.md @@ -0,0 +1,47 @@ +--- +title: Repositories +menuTitle: Repositories +weight: 15 +description: >- + Interact with ArangoDB using the high-level and consistent abstraction + provided by Spring Data 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. + +The base interface of Spring Data ArangoDB is `ArangoRepository`. It extends the +Spring Data interfaces `PagingAndSortingRepository` and `QueryByExampleExecutor`. +To get access to all Spring Data ArangoDB repository functionality simply create +your own interface extending `ArangoRepository<T, ID>`. + +The type `T` represents your domain class and type `ID` the type of your field +annotated with `@Id` in your domain class. This field is persisted in ArangoDB +as document field `_key`. + +**Examples** + +```java +@Document +public class MyDomainClass { + @Id + private String id; + +} + +public interface MyRepository extends ArangoRepository<MyDomainClass, String> { + +} +``` + +Instances of a Repository are created in Spring beans through the auto-wired mechanism of Spring. + +```java +public class MySpringBean { + + @Autowired + private MyRepository rep; + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md new file mode 100644 index 0000000000..8d92f28ea7 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/_index.md @@ -0,0 +1,125 @@ +--- +title: Queries +menuTitle: Queries +weight: 5 +description: '' +--- +Spring Data ArangoDB supports three kinds of queries: + +- [Derived queries](derived-queries.md) +- [Query methods](query-methods.md) +- [Named queries](named-queries.md) + +## Return types + +The method return type for single results can be a primitive type, a domain +class, `JsonNode`, `ObjectNode`, `Map<String, Object>`, `BaseDocument`, +`BaseEdgeDocument`, `Optional<Type>`, `GeoResult<Type>`. + +The method return type for multiple results can be `JsonNode`, `ArrayNode`, +`ArangoCursor<Type>`, `Iterable<Type>`, `Collection<Type>`, `List<Type>`, +`Set<Type>`, `Page<Type>`, `Slice<Type>`, `GeoPage<Type>`, `GeoResults<Type>` +where Type can be everything a single result can be. + +## AQL query options + +You can set additional options for the query and the created cursor over the +class `AqlQueryOptions` which you can simply define as a method parameter +without a specific name. AqlQuery options can also be defined with the +`@QueryOptions` annotation, as shown below. Aql query options from an annotation +and those from an argument are merged if both exist, with those in the argument +taking precedence. + +The `AqlQueryOptions` allows you to set the cursor time-to-live, batch-size, +caching flag and several other settings. This special parameter works with both +[query methods](query-methods.md) +and [derived queries](derived-queries.md). Keep in mind that some options, like +time-to-live, are only effective if the method return type is`ArangoCursor<T>` +or `Iterable<T>`. + +**Examples** + +```java +public interface MyRepository extends Repository<Customer, String> { + + + @Query("FOR c IN #collection FILTER c.name == @0 RETURN c") + Iterable<Customer> query(String name, AqlQueryOptions options); + + + Iterable<Customer> findByName(String name, AqlQueryOptions options); + + + @QueryOptions(maxPlans = 1000, ttl = 128) + ArangoCursor<Customer> findByAddressZipCode(ZipCode zipCode); + + + @Query("FOR c IN #collection FILTER c[@field] == @value RETURN c") + @QueryOptions(cache = true, ttl = 128) + ArangoCursor<Customer> query(Map<String, Object> bindVars, AqlQueryOptions options); + +} +``` + +## Paging and sorting + +Spring Data ArangoDB supports Spring Data's `Pageable` and `Sort` parameters for +repository query methods. If these parameters are used together with a native +query, either through `@Query` annotation or [named queries](named-queries.md), +a placeholder must be specified: + +- `#pageable` for `Pageable` parameter +- `#sort` for `Sort` parameter + +Sort properties or paths are attributes separated by dots (e.g. `customer.age`). +Some rules apply for them: + +- they must not begin or end with a dot (e.g. `.customer.age`) +- dots in attributes are supported, but the whole attribute must be enclosed by backticks (e.g. `` customer.`attr.with.dots` ``) +- backticks in attributes are supported, but they must be escaped with a backslash (e.g. `` customer.attr_with\` ``) +- any backslashes (that do not escape a backtick) are escaped (e.g. `customer\` => `customer\\`) + +**Examples** + +``` +just.`some`.`attributes.that`.`form\``.a path\`.\ is converted to +`just`.`some`.`attributes.that`.`form\``.`a path\``.`\\` +``` + +**Native queries example** + +```java +public interface CustomerRepository extends ArangoRepository<Customer> { + + @Query("FOR c IN #collection FILTER c.name == @1 #pageable RETURN c") + Page<Customer> findByNameNative(Pageable pageable, String name); + + @Query("FOR c IN #collection FILTER c.name == @1 #sort RETURN c") + List<Customer> findByNameNative(Sort sort, String name); +} + + // don't forget to specify the var name of the document + final Pageable page = PageRequest.of(1, 10, Sort.by("c.age")); +repository.findByNameNative(page, "Matt"); + +final Sort sort = Sort.by(Direction.DESC, "c.age"); + repository.findByNameNative(sort, "Tony"); +``` + +**Derived queries example** + +```java +public interface CustomerRepository extends ArangoRepository<Customer> { + + Page<Customer> findByName(Pageable pageable, String name); + + List<Customer> findByName(Sort sort, String name); +} + + // no var name is necessary for derived queries + final Pageable page = PageRequest.of(1, 10, Sort.by("age")); +repository.findByName(page, "Matt"); + +final Sort sort = Sort.by(Direction.DESC, "age"); + repository.findByName(sort, "Tony"); +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md new file mode 100644 index 0000000000..69e45bafd7 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/derived-queries.md @@ -0,0 +1,218 @@ +--- +title: Derived queries +menuTitle: Derived queries +weight: 5 +description: '' +--- +## Semantic parts + +Spring Data ArangoDB supports queries derived from methods names by splitting it +into its semantic parts and converting into AQL. The mechanism strips the +prefixes + +- `find..By` +- `get..By` +- `query..By` +- `read..By` +- `stream..By` +- `count..By` +- `exists..By` +- `delete..By` +- `remove..By` + +from the method and parses the rest. The `By` acts as a separator to indicate +the start of the criteria for the query to be built. You can define conditions +on entity properties and concatenate them with `And` and `Or`. + +The complete list of part types for derived methods is below, where `doc` is a +document in the database + +| Keyword | Sample | Predicate | +| ------------------------------------------- | -------------------------------------- | -------------------------------------- | +| IsGreaterThan, GreaterThan, After | findByAgeGreaterThan(int age) | doc.age > age | +| IsGreaterThanEqual, GreaterThanEqual | findByAgeIsGreaterThanEqual(int age) | doc.age >= age | +| IsLessThan, LessThan, Before | findByAgeIsLessThan(int age) | doc.age < age | +| IsLessThanEqualLessThanEqual | findByAgeLessThanEqual(int age) | doc.age <= age | +| IsBetween, Between | findByAgeBetween(int lower, int upper) | lower < doc.age < upper | +| IsNotNull, NotNull | findByNameNotNull() | doc.name != null | +| IsNull, Null | findByNameNull() | doc.name == null | +| IsLike, Like | findByNameLike(String name) | doc.name LIKE name | +| IsNotLike, NotLike | findByNameNotLike(String name) | NOT(doc.name LIKE name) | +| IsStartingWith, StartingWith, StartsWith | findByNameStartsWith(String prefix) | doc.name LIKE prefix | +| IsEndingWith, EndingWith, EndsWith | findByNameEndingWith(String suffix) | doc.name LIKE suffix | +| Regex, MatchesRegex, Matches | findByNameRegex(String pattern) | REGEX_TEST(doc.name, name, ignoreCase) | +| (No Keyword) | findByFirstName(String name) | doc.name == name | +| IsTrue, True | findByActiveTrue() | doc.active == true | +| IsFalse, False | findByActiveFalse() | doc.active == false | +| Is, Equals | findByAgeEquals(int age) | doc.age == age | +| IsNot, Not | findByAgeNot(int age) | doc.age != age | +| IsIn, In | findByNameIn(String[] names) | doc.name IN names | +| IsNotIn, NotIn | findByNameIsNotIn(String[] names) | doc.name NOT IN names | +| IsContaining, Containing, Contains | findByFriendsContaining(String name) | name IN doc.friends | +| IsNotContaining, NotContaining, NotContains | findByFriendsNotContains(String name) | name NOT IN doc.friends | +| Exists | findByFriendNameExists() | HAS(doc.friend, name) | + +**Examples** + +```java +public interface MyRepository extends ArangoRepository<Customer, String> { + + // FOR c IN customers FILTER c.name == @0 RETURN c + ArangoCursor<Customer> findByName(String name); + ArangoCursor<Customer> getByName(String name); + + // FOR c IN customers + // FILTER c.name == @0 && c.age == @1 + // RETURN c + ArangoCursor<Customer> findByNameAndAge(String name, int age); + + // FOR c IN customers + // FILTER c.name == @0 || c.age == @1 + // RETURN c + ArangoCursor<Customer> findByNameOrAge(String name, int age); +} +``` + +You can apply sorting for one or multiple sort criteria by appending `OrderBy` +to the method and `Asc` or `Desc` for the directions. + +```java +public interface MyRepository extends ArangoRepository<Customer, String> { + + // FOR c IN customers + // FILTER c.name == @0 + // SORT c.age DESC RETURN c + ArangoCursor<Customer> getByNameOrderByAgeDesc(String name); + + // FOR c IN customers + // FILTER c.name = @0 + // SORT c.name ASC, c.age DESC RETURN c + ArangoCursor<Customer> findByNameOrderByNameAscAgeDesc(String name); + +} +``` + +## Property expression + +Property expressions can refer only to direct and nested properties of the +managed domain class. The algorithm checks the domain class for the entire +expression as the property. If the check fails, the algorithm splits up the +expression at the camel case parts from the right and tries to find the +corresponding property. + +**Examples** + +```java +@Document("customers") +public class Customer { + private Address address; +} + +public class Address { + private ZipCode zipCode; +} + +public interface MyRepository extends ArangoRepository<Customer, String> { + + // 1. step: search domain class for a property "addressZipCode" + // 2. step: search domain class for "addressZip.code" + // 3. step: search domain class for "address.zipCode" + ArangoCursor<Customer> findByAddressZipCode(ZipCode zipCode); +} +``` + +It is possible for the algorithm to select the wrong property if the domain +class also has a property which matches the first split of the expression. +To resolve this ambiguity you can use `_` as a separator inside your +method-name to define traversal points. + +**Examples** + +```java +@Document("customers") +public class Customer { + private Address address; + private AddressZip addressZip; +} + +public class Address { + private ZipCode zipCode; +} + +public class AddressZip { + private String code; +} + +public interface MyRepository extends ArangoRepository<Customer, String> { + + // 1. step: search domain class for a property "addressZipCode" + // 2. step: search domain class for "addressZip.code" + // creates query with "x.addressZip.code" + ArangoCursor<Customer> findByAddressZipCode(ZipCode zipCode); + + // 1. step: search domain class for a property "addressZipCode" + // 2. step: search domain class for "addressZip.code" + // 3. step: search domain class for "address.zipCode" + // creates query with "x.address.zipCode" + ArangoCursor<Customer> findByAddress_ZipCode(ZipCode zipCode); + +} +``` + +## Geospatial queries + +Geospatial queries are a subsection of derived queries. To use a geospatial +query on a collection, a geo index must exist on that collection. A geo index +can be created on a field which is a two element array, corresponding to +latitude and longitude coordinates. + +Alternatively, it can be created on a field of one of the following types: +- `org.springframework.data.geo.Point` +- `org.springframework.data.geo.Polygon` +- `com.arangodb.springframework.core.geo.GeoJsonPoint` +- `com.arangodb.springframework.core.geo.GeoJsonMultiPoint` +- `com.arangodb.springframework.core.geo.GeoJsonLineString` +- `com.arangodb.springframework.core.geo.GeoJsonMultiLineString` +- `com.arangodb.springframework.core.geo.GeoJsonPolygon` +- `com.arangodb.springframework.core.geo.GeoJsonMultiPolygon` + +These types will be serialized and deserialized to and from GeoJSON geometry +objects. Following the GeoJSON specification, the first coordinate in the point +coordinates list is the longitude and the second one is the latitude. +Note that to create a geospatial index on GeoJSON data field, the `geoJson` +option should be set to `true`, e.g. + +```java +class MyEntity { + // ... + @GeoIndexed(geoJson = true) + private Point location; + // ... +} +``` + +As a subsection of derived queries, geospatial queries support all the same +return types, but also support the three return types `GeoPage`, `GeoResult` and +`GeoResults`. These types must be used in order to get the distance of each +document as generated by the query. + +There are two kinds of geospatial query, Near and Within. Near sorts documents +by distance from the given point, while within both sorts and filters documents, +returning those within the given distance range or shape. + +**Examples** + +```java +public interface MyRepository extends ArangoRepository<City, String> { + + GeoResult<City> getByLocationNear(Point point); + + GeoResults<City> findByLocationWithinOrLocationWithin(Box box, Polygon polygon); + + //Equivalent queries + GeoResults<City> findByLocationWithinOrLocationWithin(Point point, int distance); + GeoResults<City> findByLocationWithinOrLocationWithin(Point point, Distance distance); + GeoResults<City> findByLocationWithinOrLocationWithin(Circle circle); + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md new file mode 100644 index 0000000000..bdfe837ace --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/named-queries.md @@ -0,0 +1,34 @@ +--- +title: Named queries +menuTitle: Named queries +weight: 15 +description: '' +--- +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: + +```java +package com.arangodb.repository; + +public interface CustomerRepository extends ArangoRepository<Customer, String> { + + Customer findByUsername(@Param("username") String username); + +} +``` + +The corresponding `arango-named-queries.properties` file looks like this: + +```properties +Customer.findByUsername = FOR c IN customers FILTER c.username == @username RETURN c +``` + +The queries specified in the properties file are no different than the queries +that can be defined with the `@Query` annotation. The only difference is that +the queries are in one place. If there is a `@Query` annotation present and a +named query defined, the query in the `@Query` annotation takes precedence. diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md new file mode 100644 index 0000000000..90f1fa74b9 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/repositories/queries/query-methods.md @@ -0,0 +1,132 @@ +--- +title: Query methods +menuTitle: Query methods +weight: 10 +description: '' +--- +Queries using [ArangoDB Query Language (AQL)](../../../../../../aql/_index.md) +can be supplied with the `@Query` annotation on methods. + +## Passing collection name + +Instead of writing the collection name statically into the query string, the +placeholder `#collection` can be specified. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + // FOR c IN customer RETURN c + @Query("FOR c IN #collection RETURN c") + ArangoCursor<Customer> query(); + +} +``` + +## Passing bind parameters + +There are three ways of passing bind parameters to the query in the query annotation. + +### Number matching + +Using number matching, arguments will be substituted into the query in the order +they are passed to the query method. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @0 AND c.surname == @1 RETURN c") + ArangoCursor<Customer> query(String name, String surname); + +} +``` + +### @Param + +With the `@Param` annotation, the argument will be placed in the query at the +place corresponding to the value passed to the `@Param` annotation. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname == @surname RETURN c") + ArangoCursor<Customer> query(@Param("name") String name, @Param("surname") String surname); + +} +``` + +### @BindVars + +In addition you can use a method parameter of type `Map<String, Object>` +annotated with `@BindVars` as your bind parameters. You can then fill the map +with any parameter used in the query (also see [AQL Bind Parameters](../../../../../../aql/fundamentals/bind-parameters.md)). + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname = @surname RETURN c") + ArangoCursor<Customer> query(@BindVars Map<String, Object> bindVars); + +} +``` + +A mixture of any of these methods can be used. Parameters with the same name +from an `@Param` annotation will override those in the `bindVars`. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname = @surname RETURN c") + ArangoCursor<Customer> query(@BindVars Map<String, Object> bindVars, @Param("name") String name); + +} +``` + +## Query options + +`AqlQueryOptions` can also be passed to the driver, as an argument anywhere in +the method signature. + +```java +public interface MyRepository extends ArangoRepository<Customer, String>{ + + @Query("FOR c IN #collection FILTER c.name == @name AND c.surname == @surname RETURN c") + ArangoCursor<Customer> query(@Param("name") String name, @Param("surname") String surname, AqlQueryOptions options); + +} +``` + +## Spring Expression support + +SpEL expressions can be embedded in the query string to +dynamically customize it depending on the invocation parameters and/or invoking +methods on Spring Beans. In particular: +- SpEL expressions must be wrapped within `#{}` +- SpEL variables can be set annotating method parameters with + `@SpelParam("varName")` and referenced with `#varName` +- Spring Beans can be referenced with `@myBean` (factory beans with `&myBean`) +- the SpEL variable `#collection` is automatically set + +```java +public interface MyRepository extends ArangoRepository<Customer, String> { + + @Query("FOR c IN #{#collection} FILTER #{@filterGenerator.allEqual('c', #kv)} RETURN c") + List<Customer> findByAllEqual(@SpelParam("kv") Map<String, Object> kv); + +} + +@Component("filterGenerator") +public class FilterGenerator { + + public String allEqual(String col, Map<String, Object> kv) { + return kv.entrySet().stream() + .map(it -> col + "." + it.getKey() + " == " + escape(it.getValue())) + .collect(Collectors.joining(" AND ")); + } + + private Object escape(Object o) { + if (o instanceof String) return "\"" + o + "\""; + else return o; + } + +} +``` diff --git a/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/template.md b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/template.md new file mode 100644 index 0000000000..48f46f0970 --- /dev/null +++ b/site/content/arangodb/oem/develop/integrations/spring-data-arangodb/reference-version-4/template.md @@ -0,0 +1,15 @@ +--- +title: Template +menuTitle: Template +weight: 10 +description: >- + With `ArangoTemplate`, Spring Data ArangoDB offers a central support for + interactions with the database over a rich feature set +--- +`ArangoTemplate` 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. + +The `ArangoTemplate` class is the default implementation of the operations +interface `ArangoOperations` which developers of Spring Data are encouraged to +code against. diff --git a/site/content/arangodb/oem/develop/javascript-api/@arangodb/_index.md b/site/content/arangodb/oem/develop/javascript-api/@arangodb/_index.md new file mode 100644 index 0000000000..d1c29b0c03 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/@arangodb/_index.md @@ -0,0 +1,248 @@ +--- +title: The `@arangodb` module of the JavaScript API +menuTitle: '@arangodb' +weight: 5 +description: >- + The `@arangodb` module provides the `db` object and AQL helper methods for + Foxx, arangosh, and a few other JavaScript contexts +--- +`const arangodb = require('@arangodb')` + +{{< warning >}} +This module should not be confused with the +[`arangojs` JavaScript driver](https://github.com/arangodb/arangojs) +which can be used to access ArangoDB from outside the database. Although the +APIs share similarities and the functionality overlaps, the two are not +compatible with each other and cannot be used interchangeably. +{{< /warning >}} + +## The `db` object + +The `db` object represents the current database and lets you access collections +and Views, run AQL queries, and more. For more information, see the +[`db` object](db-object.md). + +**Examples** + +```js +const { db } = require('@arangodb'); + +const thirteen = db._query('RETURN 5 + 8').next(); +``` + +## The `aql` template tag + +`arangodb.aql` + +The `aql` function is a JavaScript template string handler (or template tag). +It can be used to write complex AQL queries as multi-line strings without +having to worry about bindVars and the distinction between collections +and regular parameters. + +To use it just prefix a JavaScript template string (the ones with backticks +instead of quotes) with its import name (e.g. `aql`) and pass in variables +like you would with a regular template string. The string will automatically +be converted into an object with `query` and `bindVars` attributes which you +can pass directly to `db._query` to execute. If you pass in a collection it +will be automatically recognized as a collection reference +and handled accordingly. + +Queries generated using the `aql` template tag can +be used inside other `aql` template strings, allowing arbitrary nesting. Bind +parameters of nested queries will be merged automatically. + +To find out more about AQL see the [AQL documentation](../../../aql/_index.md). + +**Examples** + +```js +const filterValue = 23; +const mydata = db._collection('mydata'); +const result = db._query(aql` + FOR d IN ${mydata} + FILTER d.num > ${filterValue} + RETURN d +`).toArray(); + +// nested queries + +const color = "green"; +const filterByColor = aql`FILTER d.color == ${color}'`; +const result2 = db._query(aql` + FOR d IN ${mydata} + ${filterByColor} + RETURN d +`).toArray(); +``` + +## The `aql.literal` helper + +`arangodb.aql.literal` + +The `aql.literal` helper can be used to mark strings to be inlined into an AQL +query when using the `aql` template tag, rather than being treated as a bind +parameter. + +{{< danger >}} +Any value passed to `aql.literal` will be treated as part of the AQL query. +To avoid becoming vulnerable to AQL injection attacks you should always prefer +nested `aql` queries if possible. +{{< /danger >}} + +**Examples** + +```js +const { aql } = require('@arangodb'); + +const filterGreen = aql.literal('FILTER d.color == "green"'); +const result = db._query(aql` + FOR d IN ${mydata} + ${filterGreen} + RETURN d +`).toArray(); +``` + +## The `aql.join` helper + +`arangodb.aql.join` + +The `aql.join` helper takes an array of queries generated using the `aql` tag +and combines them into a single query. The optional second argument will be +used as literal string to combine the queries. + +```js +const { aql } = require('@arangodb'); + +// Basic usage +const parts = [aql`FILTER`, aql`x`, aql`%`, aql`2`]; +const joined = aql.join(parts); // aql`FILTER x % 2` + +// Merge without the extra space +const parts = [aql`FIL`, aql`TER`]; +const joined = aql.join(parts, ''); // aql`FILTER`; + +// Real world example: translate keys into document lookups +const users = db._collection("users"); +const keys = ["abc123", "def456"]; +const docs = keys.map(key => aql`DOCUMENT(${users}, ${key})`); +const aqlArray = aql`[${aql.join(docs, ", ")}]`; +const result = db._query(aql` + FOR d IN ${aqlArray} + RETURN d +`).toArray(); +// Query: +// FOR d IN [DOCUMENT(@@value0, @value1), DOCUMENT(@@value0, @value2)] +// RETURN d +// Bind parameters: +// @value0: "users" +// value1: "abc123" +// value2: "def456" + +// Alternative without `aql.join` +const users = db._collection("users"); +const keys = ["abc123", "def456"]; +const result = db._query(aql` + FOR key IN ${keys} + LET d = DOCUMENT(${users}, key) + RETURN d +`).toArray(); +// Query: +// FOR key IN @value0 +// LET d = DOCUMENT(@@value1, key) +// RETURN d +// Bind parameters: +// value0: ["abc123", "def456"] +// @value1: "users" +``` + +## The `query` helper + +`arangodb.query` + +In most cases you will likely use the `aql` template handler to create a query +you directly pass to `db._query()`. To make this even easier ArangoDB provides +the `query` template handler, which behaves exactly like `aql` but also directly +executes the query and returns the result cursor instead of the query object: + +```js +const { query } = require('@arangodb'); + +const filterValue = 23; +const mydata = db._collection('mydata'); +const result = query` + FOR d IN ${mydata} + FILTER d.num > ${filterValue} + RETURN d +`.toArray(); + +// Nesting with `aql` works as expected +const { aql } = require('@arangodb'); + +const filter = aql`FILTER d.num > ${filterValue}`; +const result2 = query` + FOR d IN ${mydata} + ${filter} + RETURN d +`.toArray(); +``` + +It is also possible to pass query options to the query helper: + +```js +const { query } = require('@arangodb'); + +const mydata = db._collection('mydata'); +const result = query( { fullCount: true } )` + FOR d IN ${mydata} + LIMIT 1 + RETURN d +`.data; +``` + +## The `errors` object + +`arangodb.errors` + +This object provides useful objects for each error code ArangoDB might use in +`ArangoError` errors. This is helpful when trying to catch specific errors +raised by ArangoDB, e.g. when trying to access a document that does not exist. +Each object has a `code` property corresponding to the `errorNum` found on +`ArangoError` errors. + +For a complete list of the error names and codes you may encounter see the +[appendix on error codes](../../error-codes.md). + +**Examples** + +```js +const errors = require('@arangodb').errors; + +try { + someCollection.document('does-not-exist'); +} catch (e) { + if (e.isArangoError && e.errorNum === errors.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code) { + throw new Error('Document does not exist'); + } + throw new Error('Something went wrong'); +} +``` + +## The `time` function + +`arangodb.time` + +This function provides the current time in seconds as a floating point value +with microsecond precision. + +This function can be used instead of `Date.now()` when additional precision +is needed. + +**Examples** + +```js +const time = require('@arangodb').time; + +const start = time(); +db._query(someVerySlowQuery); +console.log(`Elapsed time: ${time() - start} secs`); +``` diff --git a/site/content/arangodb/oem/develop/javascript-api/@arangodb/collection-object.md b/site/content/arangodb/oem/develop/javascript-api/@arangodb/collection-object.md new file mode 100644 index 0000000000..ef4a638933 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/@arangodb/collection-object.md @@ -0,0 +1,1773 @@ +--- +title: The _collection_ object of the JavaScript API +menuTitle: collection object +weight: 10 +description: >- + Collection objects represent document collections and provide access to + information and methods for executing collection-related operations +# Undocumented on purpose: +# collection.count(true); // document count per shard (cluster only) +--- +The JavaScript API returns _collection_ objects when you use the following methods +of the [`db` object](db-object.md) from the `@arangodb`: + +- `db._create(...)` +- `db._createDocumentCollection(...)` +- `db._createEdgeCollection(...)` +- `db._collections(...)` +- `db._collection(...)` + +{{< info >}} +Square brackets in function signatures denote optional arguments. +{{< /info >}} + +## Collection + +### `collection.checksum([withRevisions [, withData]])` + +Calculate a checksum for the data in a collection: + +The `checksum` operation calculates an aggregate hash value for all document +keys contained in collection `collection`. + +If the optional argument `withRevisions` is set to `true`, then the +revision ids of the documents are also included in the hash calculation. + +If the optional argument `withData` is set to `true`, then all user-defined +document attributes are also checksummed. Including the document data in +checksumming makes the calculation slower, but is more accurate. + +### `collection.compact()` + +Compacts the data of a collection in order to reclaim disk space. +The operation compacts the document and index +data by rewriting the underlying .sst files and only keeps the relevant +entries. + +Under normal circumstances running a compact operation is not necessary, +as the collection data is eventually compacted anyway. However, in +some situations, e.g. after running lots of update/replace or remove +operations, the disk data for a collection may contain a lot of outdated data +for which the space shall be reclaimed. In this case the compaction operation +can be used. + +### `collection.drop([options])` + +Drops a `collection` and all its indexes and data. +In order to drop a system collection, an `options` object +with attribute `isSystem` set to `true` must be specified. + +{{< info >}} +Dropping a collection in a cluster, which is prototype for sharing +in other collections is prohibited. In order to be able to drop +such a collection, all dependent collections must be dropped first. +{{< /info >}} + +**Examples** + +Drop a collection: + +```js +--- +name: collectionDrop +description: '' +--- +~db._create("example"); +var coll = db.example; +coll.drop(); +coll; +~db._drop("example"); +``` + +Drop a system collection: + +```js +--- +name: collectionDropSystem +description: '' +--- +~db._create("_example", { isSystem: true }); +var coll = db._example; +coll.drop({ isSystem: true }); +~db._drop("example", { isSystem: true }); +``` + +### `collection.figures([details])` + +Returns an object containing statistics about the collection. + +Setting `details` to `true` returns extended storage engine-specific +details to the figures (introduced in v3.8.0). The details are intended for +debugging ArangoDB itself and their format is subject to change. By default, +`details` is set to `false`, so no details are returned and the behavior is +identical to previous versions of ArangoDB. + +- `indexes`: The coarse index metrics. + - `count`: The total number of indexes defined for the + collection, including the pre-defined indexes (e.g. primary index). + - `size`: The total memory allocated for indexes in bytes. +- `documentsSize`: The approximate on-disk size of the documents in bytes. +- `cacheInUse`: Whether the document cache is enabled for this collection. +- `cacheSize`: The total memory usage of the document cache in bytes. +- `cacheUsage`: The current data memory usage of the document cache in bytes. +- `cacheLifeTimeHitRate`: The overall cache hit ratio in percent. + In cluster deployments, it is the sum of percentages of all shards. + The attribute is only present if `cacheInUse` is `true`. +- `cacheWindowedHitRate`: The cache hit ratio of the past several thousand find + operations in percent. In cluster deployments, it is the sum of percentages + of all shards. The attribute is only present if `cacheInUse` is `true`. +- `engine`: Extended, storage-engine specific figures. + - `documents`: The number of documents determined by iterating over all + RocksDB keys in range of the column family and counting them. + - `indexes`: The detailed index metrics with the number of entries per index (array of objects). + - `type`: The index type. A `persistent` index is reported as `rocksdb-persistent`. + - `id`: The identifier of the index. + - `count`: The number of index entries. + +**Examples** + +Get the basic collection figures: + +```js +--- +name: collectionFigures +description: '' +--- +~require("internal").wal.flush(true, true); +db.demo.figures() +``` + +Get the detailed collection figures: + +```js +--- +name: collectionFiguresDetails +description: '' +--- +~require("internal").wal.flush(true, true); +db.demo.figures(true) +``` + +### `collection.getResponsibleShard(document)` + +Return the responsible shard for the given document. + +Returns a string with the responsible shard's ID. Note that the +returned shard ID is the ID of responsible shard for the document's +shard key values, and it returns even if no such document exists. + +{{< info >}} +The `getResponsibleShard()` method can only be used on Coordinators +in clusters. +{{< /info >}} + +### `collection.load()` + +Loads a collection into memory. + +{{< info >}} +Cluster collections are loaded at all times. +{{< /info >}} + +{{< warning >}} +The `load()` function is **deprecated** as of ArangoDB 3.8.0. +The function may be removed in future versions of ArangoDB. There should not be +any need to load a collection with the RocksDB storage engine. +{{< /warning >}} + +### `collection.loadIndexesIntoMemory()` + +Loads suitable indexes of this collection into memory. + +See [`collection.loadIndexesIntoMemory()`](../../../index-and-search/indexing/working-with-indexes/_index.md#load-indexes-into-memory). + +### `collection.name()` + +Returns the name of the collection as a string. + +**Examples** + +Get the collection name from a collection object: + +```js +--- +name: collectionName +description: '' +--- +var coll = db._create("example"); +coll.name(); +~db._drop("example"); +``` + +### `collection.properties([properties])` + +Get or set the properties of a collection. + +`collection.properties()` + +Returns an object containing all collection properties. + +- `waitForSync` (boolean): If `true`, creating, changing, or removing documents waits + until the data has been synchronized to disk. + +- `keyOptions` (object): An object which contains key generation options. + - `type` (string): Specifies the type of the key generator. Possible values: + - `"traditional"` + - `"autoincrement"` + - `"uuid"` + - `"padded"` + - `allowUserKeys` (boolean): If set to `true`, then you are allowed to supply + own key values in the `_key` attribute of documents. If set to + `false`, then the key generator is solely responsible for + generating keys and an error is raised if you supply own key values in the + `_key` attribute of documents. + + {{< warning >}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{< /warning >}} + - `increment` (number): The increment value for the `autoincrement` key generator. + Not used by other key generator types. + - `offset` (number): The initial offset value for the `autoincrement` key generator. + Not used by other key generator types. + - `lastValue` (number): the offset value of the `autoincrement` or `padded` + key generator. This is an internal property for restoring dumps properly. + +- `schema` (object\|null): + An object that specifies the collection-level document schema for documents. + The attribute keys `rule`, `level` and `message` must follow the rules + documented in [Document Schema Validation](../../../concepts/data-structure/documents/schema-validation.md) + +- `computedValues` (array\|null): An array of objects, + each representing a [Computed Value](../../../concepts/data-structure/documents/computed-values.md). + +- `cacheEnabled` (boolean): Whether the in-memory hash cache for documents is + enabled for this collection (default: `false`). + +- `isSystem` (boolean): Whether the collection is a system collection. + Collection names that starts with an underscore are usually system collections. + +- `syncByRevision` (boolean): Whether the newer revision-based replication protocol + is enabled for this collection. This is an internal property. + +- `globallyUniqueId` (string): A unique identifier of the collection. + This is an internal property. + +In a cluster setup, the result also contains the following attributes: + +- `numberOfShards` (number): The number of shards of the collection. + +- `shardKeys` (array): Contains the names of document attributes that are used to + determine the target shard for documents. + +- `replicationFactor` (number\|string): Determines how many copies of each shard are kept + on different DB-Servers. Has to be in the range of 1-10 or the string + `"satellite"` for a SatelliteCollection (Enterprise Edition only). + _(cluster only)_ + +- `writeConcern` (number): Determines how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less then these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time, however. The value of + `writeConcern` cannot be greater than `replicationFactor`. _(cluster only)_ + +- `shardingStrategy` (string): the sharding strategy selected for the collection. + _(cluster only)_ + + Possible values: + - `"community-compat"` + - `"enterprise-compat"` + - `"enterprise-smart-edge-compat"` + - `"hash"` + - `"enterprise-hash-smart-edge"` + - `"enterprise-hex-smart-vertex"` + +- `distributeShardsLike` (string): + The name of another collection. This collection uses the `replicationFactor`, + `numberOfShards`, `shardingStrategy`, `writeConcern` properties of the other collection and + the shards of this collection are distributed in the same way as the shards of + the other collection. + +- `isSmart` (boolean): Whether the collection is used in a SmartGraph or + EnterpriseGraph (Enterprise Edition only). This is an internal property. + +- `isDisjoint` (boolean): Whether the SmartGraph this collection belongs to is + disjoint (Enterprise Edition only). This is an internal property. + +- `smartGraphAttribute` (string): + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices. + + This feature can only be used in the *Enterprise Edition*. + +- `smartJoinAttribute` (string): + In an *Enterprise Edition* cluster, this attribute determines an attribute + of the collection that must contain the shard key value of the referred-to + SmartJoin collection. + +--- + +`collection.properties(properties)` + +Changes the collection properties. `properties` must be an object and can have +one or more of the following attribute(s): + +- `waitForSync` (boolean): If `true`, creating a document only returns + after the data was synced to disk. + +- `replicationFactor` (number\|string): Change the number of shard copies kept on + different DB-Servers. Valid values are integer numbers in the range of 1-10 + or the string `"satellite"` for a SatelliteCollection (Enterprise Edition only). + _(cluster only)_ + +- `writeConcern` (number): Change how many copies of each shard are required to be + in sync on the different DB-Servers. If there are less then these many copies + in the cluster, a shard refuses to write. Writes to shards with enough + up-to-date copies succeed at the same time however. The value of + `writeConcern` cannot be greater than `replicationFactor`. _(cluster only)_ + +- `computedValues` (array\|null): An array of objects, each representing a + [Computed Value](../../../concepts/data-structure/documents/computed-values.md). + +- `schema` (object\|null): An object that specifies the collection level document schema for + documents. The attribute keys `rule`, `level` and `message` must follow the rules + documented in [Document Schema Validation](../../../concepts/data-structure/documents/schema-validation.md) + +- `cacheEnabled` (boolean): Whether the in-memory hash cache for documents should be + enabled for this collection. Can be controlled globally + with the `--cache.size` startup option. The cache can speed up repeated reads + of the same documents via their document keys. If the same documents are not + fetched often or are modified frequently, then you may disable the cache to + avoid the maintenance costs. + +{{< info >}} +Some other collection properties, such as `type`, +`keyOptions`, `numberOfShards` or `shardingStrategy` cannot be changed once +the collection is created. +{{< /info >}} + +**Examples** + +Read all properties: + +```js +--- +name: collectionProperties +description: '' +--- +~db._create("example"); +db.example.properties(); +~db._drop("example"); +``` + +Change a property: + +```js +--- +name: collectionProperty +description: '' +--- +~db._create("example"); +db.example.properties({ waitForSync : true }); +~db._drop("example"); +``` + +### `collection.recalculateCount()` + +Recalculates the document count of a collection, if it ever becomes inconsistent. + +### `collection.rename(name)` + +Renames a collection. The `new-name` must not already be +used for a different collection. `new-name` must also be a valid collection name. +For information about the naming constraints for collections, see +[Collection names](../../../concepts/data-structure/collections.md#collection-names). + +If renaming fails for any reason, an error is thrown. +If renaming the collection succeeds, then the collection is also renamed in +all graph definitions inside the `_graphs` collection in the current +database. + +{{< info >}} +The `rename()` method cannot be used in clusters. +{{< /info >}} + +**Examples** + +```js +--- +name: collectionRename +description: '' +--- +~db._create("example"); +var coll = db.example; +coll.rename("better-example"); +coll; +~db._drop("better-example"); +``` + +### `collection.revision()` + +Returns the revision ID of the collection + +The revision ID is updated when the document data is modified, either by +inserting, deleting, updating or replacing documents in it. + +The revision ID of a collection can be used by clients to check whether +data in a collection has changed or if it is still unmodified since a +previous fetch of the revision ID. + +The revision ID returned is a string value. Clients should treat this value +as an opaque string, and only use it for equality/non-equality comparisons. + +### `collection.shards([details])` + +Return the available shards for the collection. + +If `details` is not set, or set to `false`, returns an array with the names of +the available shards of the collection. + +If `details` is set to `true`, returns an object with the shard names as +object attribute keys, and the responsible servers as an array mapped to each +shard attribute key. + +The leader shards are always first in the arrays of responsible servers. + +{{< info >}} +The `shards()` method can only be used on Coordinators in clusters. +{{< /info >}} + +### `collection.truncate([options])` + +Truncates a `collection`, removing all documents but keeping all its +indexes. + +The optional `options` parameter must be an object and can be +used to specify the following options: + +- `waitForSync` (boolean, default: `false`): + If set to `true`, the data is synchronized to disk before returning from the + truncate operation. + +- `compact` (boolean, default: `true`): + If set to `true`, the storage engine is told to start a compaction in order to + free up disk space. This can be resource intensive. If the only intention is + to start over with an empty collection, specify `false`. + +**Examples** + +Truncates a collection: + +```js +--- +name: collectionTruncate +description: '' +--- +~db._create("example"); +var coll = db.example; +var doc = coll.save({ "Hello" : "World" }); +coll.count(); +coll.truncate(); +coll.count(); +~db._drop("example"); +``` + +### `collection.type()` + +Returns the type of a collection. Possible values are: + +- `2`: document collection +- `3`: edge collection + +### `collection.unload()` + +Starts unloading a collection from memory. Note that unloading is deferred +until all queries have finished. + +{{< info >}} +In cluster deployments, collections cannot be unloaded. +{{< /info >}} + +{{< warning >}} +The `unload()` function is **deprecated** as of ArangoDB 3.8.0. +The function may be removed in future versions of ArangoDB. There should not be +any need to unload a collection with the RocksDB storage engine. +{{< /warning >}} + +## Indexes + +### `collection.ensureIndex(description)` + +Creates an index if it doesn't exist already. + +See [`collection.ensureIndex()`](../../../index-and-search/indexing/working-with-indexes/_index.md#creating-an-index). + +### `collection.indexes([withStats [, withHidden]])` + +Lists all indexes of the collection. + +See [`collection.indexes()`](../../../index-and-search/indexing/working-with-indexes/_index.md#listing-all-indexes-of-a-collection). + +### `collection.getIndexes([withStats [, withHidden]])` + +Same as [`collection.indexes([withStats [, withHidden]])`](#collectionindexeswithstats--withhidden). + +### `collection.index(index)` + +Gets an index by identifier. + +See [`collection.index()`](../../../index-and-search/indexing/working-with-indexes/_index.md#index-identifiers). + +### `collection.dropIndex(index)` + +Drops an index by identifier. + +See [`collection.dropIndex()`](../../../index-and-search/indexing/working-with-indexes/_index.md#dropping-an-index-via-a-collection-object). + +## Documents + +### `collection.all()` + +Fetches all documents from a collection and returns a cursor. You can use +`toArray()`, `next()`, or `hasNext()` to access the result. The result +can be limited using the `skip()` and `limit()` operator. + +**Examples** + +Use `toArray()` to get all documents at once: + +```js +--- +name: 001_collectionAll +description: '' +--- +~db._create("five"); +var docs = db.five.insert([ + { name : "one" }, + { name : "two" }, + { name : "three" }, + { name : "four" }, + { name : "five" } +]); +db.five.all().toArray(); +~db._drop("five"); +``` + +Use `limit()` to restrict the documents: + +```js +--- +name: 002_collectionAllNext +description: '' +--- +~db._create("five"); +var docs = db.five.insert([ + { name : "one" }, + { name : "two" }, + { name : "three" }, + { name : "four" }, + { name : "five" } +]); +db.five.all().limit(2).toArray(); +~db._drop("five"); +``` + +### `collection.any()` + +Returns a random document from the collection or `null` if none exists. + +**Note**: This is generally an expensive operation for the RocksDB storage engine +but ArangoDB uses an optimization for retrieving a single pseudo-random document. + +### `collection.byExample(example)` + +Fetches all documents from a collection that match the specified +example and returns a cursor. + +You can use `toArray()`, `next()`, or `hasNext()` to access the +result. The result can be limited using the `skip()` and `limit()` +operator. + +An attribute name of the form `a.b` is interpreted as attribute path, +not as attribute. If you use + +```json +{ "a" : { "c" : 1 } } +``` + +as example, then you will find all documents, such that the attribute +`a` contains a document of the form `{ "c" : 1 }`. For example the document + +```json +{ "a" : { "c" : 1 }, "b" : 1 } +``` + +will match, but the document + +```json +{ "a" : { "c" : 1, "b" : 1 } } +``` + +will not. + +However, if you use + +```json +{ "a.c" : 1 } +``` + +then you will find all documents, which contain a sub-document in `a` +that has an attribute `c` of value `1`. Both the following documents + +```json +{ "a" : { "c" : 1 }, "b" : 1 } +``` + +and + +```json +{ "a" : { "c" : 1, "b" : 1 } } +``` + +will match. + +```js +collection.byExample(path1, value1, ...) +``` + +As alternative you can supply an array of paths and values. + +**Examples** + +Use `toArray()` to get all documents at once: + +```js +--- +name: 003_collectionByExample +description: '' +--- +~db._create("users"); +db.users.insert([ + { name: "Gerhard" }, + { name: "Helmut" }, + { name: "Angela" } +]); +db.users.all().toArray(); +db.users.byExample({ "_id" : "users/20" }).toArray(); +db.users.byExample({ "name" : "Gerhard" }).toArray(); +db.users.byExample({ "name" : "Helmut", "_id" : "users/15" }).toArray(); +~db._drop("users"); +``` + +Use `next()` to loop over all documents: + +```js +--- +name: 004_collectionByExampleNext +description: '' +--- +~db._create("users"); +db.users.insert([ + { name: "Gerhard" }, + { name: "Helmut" }, + { name: "Angela" } +]); +var cursor = db.users.byExample( {"name" : "Angela" } ); +while (cursor.hasNext()) { + print(cursor.next()); +} +~db._drop("users"); +``` + +### `collection.count()` + +Returns the number of living documents in the collection. + +**Examples** + +```js +--- +name: collectionCount +description: '' +--- +~db._create("users"); +~db.users.save([{}, {}, {}]); +db.users.count(); +~db._drop("users"); +``` + +### `collection.document(object [, options])` + +The `document()` method finds a document given an object `object` +containing the `_id` or `_key` attribute. The method returns +the document if it can be found. If both attributes are given, +the `_id` takes precedence, it is an error, if the collection part +of the `_id` does not match the `collection`. + +An error is thrown if `_rev` is specified but the document found has a +different revision already. An error is also thrown if no document exists +with the given `_id` or `_key` value. + +Please note that if the method is executed on the arangod server (e.g. from +inside a Foxx application), an immutable document object will be returned +for performance reasons. It is not possible to change attributes of this +immutable object. To update or patch the returned document, it needs to be +cloned/copied into a regular JavaScript object first. This is not necessary +if the `document` method is called from out of arangosh or from any other +client. + +If you pass `options` as the second argument, it must be an object. + +- If the object has the `allowDirtyReads` attribute set to `true`, then the + Coordinator is allowed to read from any shard replica and not only from + the leader shard. See [Read from followers](../../http-api/documents.md#read-from-followers) + for details. + +--- + +`collection.document(document-identifier [, options])` + +Finds a document using a document identifier, optionally with an options passed +as an object. + +No revision can be specified in this case. + +--- + +`collection.document(document-key [, options])` + +Finds a document using a document key, optionally with an options passed +as an object. + +No revision can be specified in this case. + +--- + +`collection.document(array [, options])` + +This variant allows you to perform the operation on a whole array of arguments. +The behavior is exactly as if `document()` would have been called on all members +of the array separately and all results are returned in an array. If an error +occurs with any of the documents, no exception is raised! Instead of a document, +an error object is returned in the result array. + +**Examples** + +Return a document using a document identifier: + +```js +--- +name: documentsCollectionNameValidPlain +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "2873916"}); +db.example.document("example/2873916"); +~db._drop("example"); +``` + +Return a document using a document key: + +```js +--- +name: documentsCollectionNameValidByKey +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "2873916"}); +db.example.document("2873916"); +~db._drop("example"); +``` + +Return a document using an object with a document identifier: + +```js +--- +name: documentsCollectionNameValidByObject +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "2873916"}); +db.example.document({_id: "example/2873916"}); +~db._drop("example"); +``` + +Return multiple documents using an array of document keys: + +```js +--- +name: documentsCollectionNameValidMulti +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "2873916"}); +~var myid = db.example.insert({_key: "2873917"}); +db.example.document(["2873916","2873917"]); +~db._drop("example"); +``` + +An error is raised if the document is unknown: + +```js +--- +name: documentsCollectionNameUnknown +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "2873916"}); +db.example.document("example/4472917"); // xpError(ERROR_ARANGO_DOCUMENT_NOT_FOUND) +~db._drop("example"); +``` + +An error is raised if the document key or identifier is invalid: + +```js +--- +name: documentsCollectionNameHandle +description: '' +--- +~db._create("example"); +db.example.document(""); // xpError(ERROR_ARANGO_DOCUMENT_HANDLE_BAD) +~db._drop("example"); +``` + +### `collection.documents(keys)` + +Looks up the documents in the specified collection using the array of +keys provided. All documents for which a matching key was specified in +the `keys` array and that exist in the collection will be returned. Keys +for which no document can be found in the underlying collection are +ignored, and no exception will be thrown for them. + +{{< info >}} +This method is deprecated in favor of the array variant of +[`document()`](#collectiondocumentobject--options). +{{< /info >}} + +**Examples** + +```js +--- +name: collectionLookupByKeys +description: '' +--- +~db._drop("example"); +~db._create("example"); +var keys = [ ]; +for (var i = 0; i < 5; ++i) { + db.example.insert({ _key: "test" + i, value: i }); + keys.push("test" + i); +} +db.example.documents(keys); +~db._drop("example"); +``` + +### `collection.documentId(documentKey)` + +Converts a document key to a document identifier by prepending the collection's +name and a forward slash to the key. + +Raises an error if the document key is invalid. Note that this method does not +check whether the document exists in the collection. + +### `collection.exists(object [, options])` + +The `exists()` method determines whether a document exists given an object +`object` containing the `_id` or `_key` attribute. If both attributes +are given, the `_id` takes precedence, it is an error, if the collection +part of the `_id` does not match the `collection`. + +An error is thrown if `_rev` is specified but the document found has a +different revision already. + +Instead of returning the found document or an error, this method will +only return an object with the attributes `_id`, `_key` and `_rev`, or +`false` if no document with the given `_id` or `_key` exists. It can +thus be used for easy existence checks. + +This method throws an error if used improperly, e.g. if called +with a string that isn't a document key or identifier, an object with invalid +or missing `_key` or `_id` attribute, or if documents from other collections are +requested. + +If you pass `options` as the second argument, it must be an object. If this +object has the `allowDirtyReads` attribute set to `true`, then the +Coordinator is allowed to read from any shard replica and not only from +the leader shard. See [Read from followers](../../http-api/documents.md#read-from-followers) +for details. + +--- + +`collection.exists(document-identifier [, options])` + +Checks whether a document exists described by a document identifier, optionally +with options passed as an object. + +No revision can be specified in this case. + +--- + +`collection.exists(document-key [, options])` + +Checks whether a document exists described by a document key, optionally +with options passed as an object. + +No revision can be specified in this case. + +### `collection.firstExample(example)` + +Returns some document of a collection that matches the specified +example. If no such document exists, `null` will be returned. +The example has to be specified as paths and values. +See `byExample` for details. + +--- + +`collection.firstExample(path1, value1, ...)` + +As alternative you can supply an array of paths and values. + +**Examples** + +```js +--- +name: collectionFirstExample +description: '' +--- +~db._create("users"); +~db.users.insert({ name: "Gerhard" }); +~db.users.insert({ name: "Helmut" }); +~db.users.insert({ name: "Angela" }); +db.users.firstExample("name", "Angela"); +~db._drop("users"); +``` + +### `collection.insert(data [, options])` + +Creates a new document in the `collection` from the given `data`. The +`data` must be an object. The attributes `_id` and `_rev` are ignored +and are automatically generated. A unique value for the attribute `_key` +will be automatically generated if not specified. If specified, there +must not be a document with the given `_key` in the collection. + +The method returns a document with the attributes `_id`, `_key` and +`_rev`. The attribute `_id` contains the document identifier of the newly +created document, the attribute `_key` the document key and the +attribute `_rev` contains the document revision. + +--- + +`collection.insert(data, options)` + +Creates a new document in the `collection` from the given `data` as +above. The optional `options` parameter must be an object and can be +used to specify the following options: + +- `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. +- `silent`: If this flag is set to `true`, the method does not return + any output. +- `returnNew`: If this flag is set to `true`, the complete new document + is returned in the output under the attribute `new`. +- `returnOld`: If this flag is set to `true`, the complete old document + is returned in the output under the attribute `old`. Only available + in combination with the `overwrite` option +- `overwrite`: If set to `true`, the insert becomes a replace-insert. + If a document with the same `_key` exists already the new document + is not rejected with unique constraint violated but will replace + the old document. Note that operations with `overwrite` parameter require + a `_key` attribute in the request payload, therefore they can only be + performed on collections sharded by `_key`. +- `overwriteMode`: this optional flag can have one of the following values: + - `ignore`: if a document with the specified `_key` value exists already, + nothing will be done and no write operation will be carried out. + The insert operation will return success in this case. This mode does not + support returning the old document version using the `returnOld` + attribute. `returnNew` will only set the `new` attribute in the response + if a new document was inserted. + - `replace`: if a document with the specified `_key` value exists already, + it will be overwritten with the specified document value. This mode will + also be used when no overwrite mode is specified but the `overwrite` + flag is set to `true`. + - `update`: if a document with the specified `_key` value exists already, + it will be patched (partially updated) with the specified document value. + The overwrite mode can be further controlled via the `keepNull` and + `mergeObjects` parameters. + - `conflict`: if a document with the specified `_key` value exists already, + return a unique constraint violation error so that the insert operation + fails. This is also the default behavior in case the overwrite mode is + not set, and the `overwrite` flag is `false` or not set either. +- `keepNull`: The optional `keepNull` parameter can be used to modify + the behavior when handling `null` values. Normally, `null` values + are stored in the database. By setting the `keepNull` parameter to + `false`, this behavior can be changed so that top-level attributes and + sub-attributes in `data` with `null` values are removed from the target + document (but not attributes of objects that are nested inside of arrays). + This option controls the update-insert behavior only. +- `mergeObjects`: Controls whether objects (not arrays) will be + merged if present in both the existing and the patch document. If + set to `false`, the value in the patch document will overwrite the + existing document's value. If set to `true`, objects will be merged. + The default is `true`. + This option controls the update-insert behavior only. + +--- + +`collection.insert(array [, options])` + +This variant allows you to perform the operation on a whole array of +arguments. The behavior is exactly as if `insert()` would have been called on all +members of the array separately and all results are returned in an array. If an +error occurs with any of the documents, no exception is raised! Instead of a +document, an error object is returned in the result array. + +**Examples** + +```js +--- +name: documentsCollectionInsertSingle +description: '' +--- +~db._create("example"); +db.example.insert({ Hello : "World" }); +db.example.insert({ Hello : "World" }, {waitForSync: true}); +~db._drop("example"); +``` + +```js +--- +name: documentsCollectionInsertMulti +description: '' +--- +~db._create("example"); +db.example.insert([{ Hello : "World" }, {Hello: "there"}]) +db.example.insert([{ Hello : "World" }, {}], {waitForSync: true}); +~db._drop("example"); +``` + +```js +--- +name: documentsCollectionInsertSingleOverwrite +description: '' +--- +~db._create("example"); +db.example.insert({ _key : "666", Hello : "World" }); +db.example.insert({ _key : "666", Hello : "Universe" }, {overwrite: true, returnOld: true}); +~db._drop("example"); +``` + +### `collection.iterate(iterator [, options])` + +{{< warning >}} +The `iterate()` method is deprecated from version 3.11.0 onwards and will be +removed in a future version. +{{< /warning >}} + +Iterates over some elements of the collection and apply the function +`iterator` to the elements. The function will be called with the +document as first argument and the current number (starting with 0) +as second argument. + +`options` must be an object with the following attributes: + +- `limit` (optional, default none): use at most `limit` documents. + +- `probability` (optional, default all): a number between `0` and + `1`. Documents are chosen with this probability. + +**Examples** + +Pick 1 out of 4 documents of a collection but at most 5: + +```js +--- +name: collectionIterate +description: '' +--- +~db._create("example"); +var arr = []; +for (var i = 0; i < 10; i++) { + arr.push({ i }); +} +var meta = db.example.save(arr); +var data = []; +db.example.iterate( (doc, idx) => data.push({ idx, i: doc.i }), { probability: 0.25, limit: 5 }); +data; +~db._drop("example"); +``` + +### `collection.remove(object)` + +Removes a document described by the `object`, which must be an object +containing the `_id` or `_key` attribute. There must be a document with +that `_id` or `_key` in the current collection. This document is then +removed. + +The method returns a document with the attributes `_id`, `_key` and `_rev`. +The attribute `_id` contains the document identifier of the +removed document, the attribute `_rev` contains the document revision of +the removed document. + +If the object contains a `_rev` attribute, the method first checks +that the specified revision is the current revision of that document. +If not, there is a conflict, and an error is thrown. + +--- + +`collection.remove(object, options)` + +Removes a document, with additional boolean `options` passed as an object: + +- `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. +- `overwrite`: If this flag is set to `true`, a `_rev` attribute in + the object is ignored. +- `returnOld`: If this flag is set to `true`, the complete previous + revision of the document is returned in the output under the + attribute `old`. +- `silent`: If this flag is set to `true`, no output is returned. + +--- + +`collection.remove(document-identifier [, options])` + +Removes a document described by a document identifier, optionally with +additional options passed as an object. + +No revision check is performed. + +--- + +`collection.remove(document-key [, options])` + +Removes a document described by a document key, optionally with +additional options passed as an object. + +No revision check is performed. + +--- + +`collection.remove(array [, options])` + +This variant allows you to perform the operation on a whole array of +document identifiers, document keys, and objects with a `_key` attribute. + +The behavior is exactly as if `remove()` would have been called on all +members of the array separately and all results are returned in an array. If an +error occurs with any of the documents, no exception is raised! Instead of a +document, an error object is returned in the result array. + +**Examples** + +Remove a document: + +```js +--- +name: documentDocumentRemoveSimple +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +db.example.document(a1); +db.example.remove(a1); +db.example.document(a1); // xpError(ERROR_ARANGO_DOCUMENT_NOT_FOUND); +~db._drop("example"); +``` + +Remove a document with a conflict: + +```js +--- +name: documentDocumentRemoveConflict +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db.example.replace(a1, { a : 2 }); +db.example.remove(a1); // xpError(ERROR_ARANGO_CONFLICT); +db.example.remove(a1, true); +db.example.document(a1); // xpError(ERROR_ARANGO_DOCUMENT_NOT_FOUND); +~db._drop("example"); +``` + +### `collection.removeByExample(example)` + +Removes all documents matching an example. + +--- + +`collection.removeByExample(document, waitForSync)` + +The optional `waitForSync` parameter can be used to force synchronization +of the document deletion operation to disk even in case that the +`waitForSync` flag had been disabled for the entire collection. Thus, +the `waitForSync` parameter can be used to force synchronization of just +specific operations. To use this, set the `waitForSync` parameter to +`true`. If the `waitForSync` parameter is not specified or set to +`false`, then the collection's default `waitForSync` behavior is +applied. The `waitForSync` parameter cannot be used to disable +synchronization for collections that have a default `waitForSync` value +of `true`. + +--- + +`collection.removeByExample(document, waitForSync, limit)` + +The optional `limit` parameter can be used to restrict the number of +removals to the specified value. If `limit` is specified but less than the +number of documents in the collection, it is undefined which documents are +removed. + +**Examples** + +```js +--- +name: 010_documentsCollectionRemoveByExample +description: '' +--- +~db._create("example"); +~db.example.insert({ Hello : "world" }); +db.example.removeByExample( {Hello : "world"} ); +~db._drop("example"); +``` + +### `collection.removeByKeys(keys)` + +Looks up the documents in the specified collection using the array of keys +provided, and removes all documents from the collection whose keys are +contained in the `keys` array. Keys for which no document can be found in +the underlying collection are ignored, and no exception will be thrown for +them. + +The method will return an object containing the number of removed documents +in the `removed` sub-attribute, and the number of not-removed/ignored +documents in the `ignored` sub-attribute. + +This method is deprecated in favor of the array variant of `remove()`. + +**Examples** + +```js +--- +name: collectionRemoveByKeys +description: '' +--- +~db._drop("example"); +~db._create("example"); +var keys = [ ]; +for (var i = 0; i < 5; ++i) { + db.example.insert({ _key: "test" + i, value: i }); + keys.push("test" + i); +} +db.example.removeByKeys(keys); +~db._drop("example"); +``` + +### `collection.replace(document, data [, options])` + +`collection.replace(object, data)` + +Replaces an existing document described by the `object`, which must +be an object containing the `_id` or `_key` attribute. There must be +a document with that `_id` or `_key` in the current collection. This +document is then replaced with the `data` given as second argument. +Any attribute `_id`, `_key` or `_rev` in `data` is ignored. + +The method returns a document with the attributes `_id`, `_key`, `_rev` +and `_oldRev`. The attribute `_id` contains the document identifier of the +updated document, the attribute `_rev` contains the document revision of +the updated document, the attribute `_oldRev` contains the revision of +the old (now replaced) document. + +If the object contains a `_rev` attribute, the method first checks +that the specified revision is the current revision of that document. +If not, there is a conflict, and an error is thrown. + +--- + +`collection.replace(object, data, options)` + +Replaces an existing document, with additional options passed as an object: + +- `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. +- `overwrite`: If this flag is set to `true`, a `_rev` attribute in + the object is ignored. +- `returnNew`: If this flag is set to `true`, the complete new document + is returned in the output under the attribute `new`. +- `returnOld`: If this flag is set to `true`, the complete previous + revision of the document is returned in the output under the + attribute `old`. +- `silent`: If this flag is set to `true`, no output is returned. + +--- + +`collection.replace(document-identifier, data [, options])` + +Replaces an existing document described by a document identifier, optionally +with additional options passed as an object. + +No revision check is performed. + +--- + +`collection.replace(document-key, data [, options])` + +Replaces an existing document described by a document key, optionally +with additional options passed as an object. + +No revision check is performed. + +--- + +`collection.replace(document-array, data-array [, options])` + +This variant allows you to perform the replace operation on two whole arrays of +arguments. The two arrays given as `document-array` and `data-array` +must have the same length. The behavior is exactly as if `replace()` would have +been called on all respective members of the two arrays in pairs and all results +are returned in an array. If an error occurs with any of the documents, no +exception is raised! Instead of a document, an error object is returned in the +result array. + +**Examples** + +Create and update a document: + +```js +--- +name: documentsCollectionReplace1 +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db.example.replace(a1, { a : 2 }); +a3 = db.example.replace(a1, { a : 3 }); // xpError(ERROR_ARANGO_CONFLICT); +a3 = db.example.replace(a1, { a : 3 }, { overwrite: true }); +~db._drop("example"); +``` + +Use a document identifier: + +```js +--- +name: documentsCollectionReplaceHandle +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "3903044"}); +a1 = db.example.insert({ a : 1 }); +a2 = db.example.replace("example/3903044", { a : 2 }); +~db._drop("example"); +``` + +### `collection.replaceByExample(example, newValue [, waitForSync [, limit]])` + +Replaces all documents matching an example with a new document body. +The entire document body of each document matching the `example` is +replaced with `newValue`. The document meta-attributes `_id`, `_key` and +`_rev` are not replaced. + +The optional `waitForSync` parameter can be used to force synchronization +of the document replacement operation to disk even in case that the +`waitForSync` flag had been disabled for the entire collection. Thus, +the `waitForSync` parameter can be used to force synchronization of just +specific operations. To use this, set the `waitForSync` parameter to +`true`. If the `waitForSync` parameter is not specified or set to +`false`, then the collection's default `waitForSync` behavior is +applied. The `waitForSync` parameter cannot be used to disable +synchronization for collections that have a default `waitForSync` value +of `true`. + +The optional `limit` parameter can be used to restrict the number of +replacements to the specified value. If `limit` is specified but less than +the number of documents in the collection, it is undefined which documents are +replaced. + +**Examples** + +```js +--- +name: 011_documentsCollectionReplaceByExample +description: '' +--- +~db._create("example"); +db.example.insert({ Hello : "world" }); +db.example.replaceByExample({ Hello: "world" }, {Hello: "mars"}, false, 5); +~db._drop("example"); +``` + +### `collection.save(data [, options])` + +See [`collection.insert(data [, options])`](#collectioninsertdata--options). + +### `collection.toArray()` + +Converts the entire collection into an array of documents. + +{{< warning >}} +Avoid calling this method on a collection in production environments as it +creates a copy of your collection data in memory, which may require a +substantial amount of resources depending on the number and size of the +documents in the collection. +{{< /warning >}} + +### `collection.update(document, data [, options])` + +`collection.update(object, data)` + +Updates an existing document described by the `object`, which must +be an object containing the `_id` or `_key` attribute. There must be +a document with that `_id` or `_key` in the current collection. This +document is then patched with the `data` given as second argument. +Any attribute `_id`, `_key` or `_rev` in `data` is ignored. + +The method returns a document with the attributes `_id`, `_key`, `_rev` +and `_oldRev`. +- The `_key` and `_id` attributes contains the document key and + document identifier of the updated document. +- The `_rev` attribute contains the document revision of + the updated document +- The `_oldRev` attribute contains the revision of + the old (now updated) document. + +If the object contains a `_rev` attribute, the method first checks +that the specified revision is the current revision of that document. +If not, there is a conflict, and an error is raised. + +--- + +`collection.update(object, data, options)` + +Updates an existing document, with additional options passed as +an object: + +- `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. +- `overwrite`: If this flag is set to `true`, a `_rev` attribute in + the selector is ignored. +- `returnNew`: If this flag is set to `true`, the complete new document + is returned in the output under the attribute `new`. +- `returnOld`: If this flag is set to `true`, the complete previous + revision of the document is returned in the output under the + attribute `old`. +- `silent`: If this flag is set to `true`, no output is returned. +- `keepNull`: The optional `keepNull` parameter can be used to modify + the behavior when handling `null` values. Normally, `null` values + are stored in the database. By setting the `keepNull` parameter to + `false`, this behavior can be changed so that top-level attributes and + sub-attributes in `data` with `null` values are removed from the target + document (but not attributes of objects that are nested inside of arrays). +- `mergeObjects`: Controls whether objects (not arrays) will be + merged if present in both the existing and the patch document. If + set to `false`, the value in the patch document will overwrite the + existing document's value. If set to `true`, objects will be merged. + The default is `true`. + +--- + +`collection.update(document-identifier, data [, options])` + +Updates an existing document described by a document identifier, optionally with +additional options passed as an object. + +No revision check is performed. + +--- + +`collection.update(document-key, data [, options])` + +Updates an existing document described by a document key, optionally with +additional options passed as an object. + +No revision check is performed. + +--- + +`collection.update(document-array, data-array [, options])` + +This variant allows you to perform the operation on two whole arrays of +arguments. The two arrays given as `document-array` and `data-array` +must have the same length. The behavior is exactly as if `update()` would have +been called on all respective members of the two arrays in pairs and all results are +returned in an array. If an error occurs with any of the documents, no +exception is raised! Instead of a document, an error object is returned in the +result array. + +**Examples** + +Create and update a document: + +```js +--- +name: documentsCollection_UpdateDocument +description: '' +--- +~db._create("example"); +a1 = db.example.insert({"a" : 1}); +a2 = db.example.update(a1, {"b" : 2, "c" : 3}); +a3 = db.example.update(a1, {"d" : 4}); // xpError(ERROR_ARANGO_CONFLICT); +a4 = db.example.update(a2, {"e" : 5, "f" : 6 }); +db.example.document(a4); +a5 = db.example.update(a4, {"a" : 1, c : 9, e : 42 }); +db.example.document(a5); +~db._drop("example"); +``` + +Use a document identifier: + +```js +--- +name: documentsCollection_UpdateHandleSingle +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "18612115"}); +a1 = db.example.insert({"a" : 1}); +a2 = db.example.update("example/18612115", { "x" : 1, "y" : 2 }); +~db._drop("example"); +``` + +Use the `keepNull` parameter to remove attributes with `null` values: + +```js +--- +name: documentsCollection_UpdateHandleKeepNull +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "19988371"}); +db.example.insert({"a" : 1}); +db.example.update("example/19988371", { "b" : null, "c" : null, "d" : 3 }); +db.example.document("example/19988371"); +db.example.update("example/19988371", { "a" : null }, false, false); +db.example.document("example/19988371"); +db.example.update("example/19988371", { "b" : null, "c": null, "d" : null }, false, false); +db.example.document("example/19988371"); +~db._drop("example"); +``` + +Patching array values: + +```js +--- +name: documentsCollection_UpdateHandleArray +description: '' +--- +~db._create("example"); +~var myid = db.example.insert({_key: "20774803"}); +db.example.insert({ + "a" : { "one" : 1, "two" : 2, "three" : 3 }, + "b" : { } +}); + +db.example.update("example/20774803", { + "a" : { "four" : 4 }, + "b" : { "b1" : 1 } +}); + +db.example.document("example/20774803"); + +db.example.update("example/20774803", { + "a" : { "one" : null }, + "b" : null +}, false, false); + +db.example.document("example/20774803"); +~db._drop("example"); +``` + +### `collection.updateByExample(example, newValue [, options])` + +`collection.updateByExample(example, newValue [, keepNull [, waitForSync [, limit]]])` + +Updates all documents matching an example with a new document body. +Specific attributes in the document body of each document matching the +`example` are updated with the values from `newValue`. +The document meta-attributes `_id`, `_key` and `_rev` cannot be updated. + +The optional `keepNull` parameter can be used to modify the behavior when +handling `null` values. Normally, `null` values are stored in the +database. By setting the `keepNull` parameter to `false`, this behavior +can be changed so that top-level attributes and sub-attributes in `data` with +`null` values are removed from the target document (but not attributes of +objects that are nested inside of arrays). + +The optional `waitForSync` parameter can be used to force synchronization +of the document replacement operation to disk even in case that the +`waitForSync` flag had been disabled for the entire collection. Thus, +the `waitForSync` parameter can be used to force synchronization of just +specific operations. To use this, set the `waitForSync` parameter to +`true`. If the `waitForSync` parameter is not specified or set to +`false`, then the collection's default `waitForSync` behavior is +applied. The `waitForSync` parameter cannot be used to disable +synchronization for collections that have a default `waitForSync` value +of `true`. + +The optional `limit` parameter can be used to restrict the number of +updates to the specified value. If `limit` is specified but less than +the number of documents in the collection, it is undefined which documents are +updated. + +--- + +`collection.updateByExample(document, newValue, options)` + +Using this variant, the options for the operation can be passed using +an object with the following sub-attributes: + +- `keepNull` +- `waitForSync` +- `limit` +- `mergeObjects` + +**Examples** + +```js +--- +name: 012_documentsCollectionUpdateByExample +description: '' +--- +~db._create("example"); +db.example.insert({ Hello : "world", foo : "bar" }); +db.example.updateByExample({ Hello: "world" }, { Hello: "foo", World: "bar" }, false); +db.example.byExample({ Hello: "foo" }).toArray() +~db._drop("example"); +``` + +## Edge documents + +### `edge-collection.edges(vertex)` + +Edges are normal documents that always contain a `_from` and a `_to` +attribute. Therefore, you can use the document methods to operate on +edges. The following methods, however, are specific to edges. + +`edge-collection.edges(vertex)` + +The `edges()` operator finds all edges starting from (outbound) or ending +in (inbound) `vertex`. + +--- + +`edge-collection.edges(vertices)` + +The `edges` operator finds all edges starting from (outbound) or ending +in (inbound) a document from `vertices`, which must be a list of documents +or document identifiers. + +```js +--- +name: EDGCOL_02_Relation +description: '' +--- +var vcoll = db._create("vertex"); +var ecoll = db._createEdgeCollection("relation"); +var myGraph = {}; +myGraph.v1 = db.vertex.insert({ name : "vertex 1" }); +myGraph.v2 = db.vertex.insert({ name : "vertex 2" }); +myGraph.e1 = db.relation.insert(myGraph.v1, myGraph.v2, { label : "knows"}); +db._document(myGraph.e1); +db.relation.edges(myGraph.e1._id); +~db._drop("relation"); +~db._drop("vertex"); +``` + +### `edge-collection.inEdges(vertex)` + +The `inEdges()` operator finds all edges ending in (inbound) `vertex`. + +--- + +`edge-collection.inEdges(vertices)` + +The `inEdges()` operator finds all edges ending in (inbound) a document from +`vertices`, which must be a list of documents or document identifiers. + +**Examples** + +```js +--- +name: EDGCOL_02_inEdges +description: '' +--- +var vcoll = db._create("vertex"); +var ecoll = db._createEdgeCollection("relation"); +var myGraph = {}; +myGraph.v1 = db.vertex.insert({ name : "vertex 1" }); +myGraph.v2 = db.vertex.insert({ name : "vertex 2" }); +myGraph.e1 = db.relation.insert(myGraph.v1, myGraph.v2, { label : "knows"}); +db._document(myGraph.e1); +db.relation.inEdges(myGraph.v1._id); +db.relation.inEdges(myGraph.v2._id); +~db._drop("relation"); +~db._drop("vertex"); +``` + +### `edge-collection.outEdges(vertex)` + +The `outEdges()` operator finds all edges starting from (outbound) +`vertices`. + +--- + +`edge-collection.outEdges(vertices)` + +The `outEdges()` operator finds all edges starting from (outbound) a document +from `vertices`, which must be a list of documents or document identifiers. + +**Examples** + +```js +--- +name: EDGCOL_02_outEdges +description: '' +--- +var vcoll = db._create("vertex"); +var ecoll = db._createEdgeCollection("relation"); +var myGraph = {}; +myGraph.v1 = db.vertex.insert({ name : "vertex 1" }); +myGraph.v2 = db.vertex.insert({ name : "vertex 2" }); +myGraph.e1 = db.relation.insert(myGraph.v1, myGraph.v2, { label : "knows"}); +db._document(myGraph.e1); +db.relation.outEdges(myGraph.v1._id); +db.relation.outEdges(myGraph.v2._id); +~db._drop("relation"); +~db._drop("vertex"); +``` diff --git a/site/content/arangodb/oem/develop/javascript-api/@arangodb/cursor-object.md b/site/content/arangodb/oem/develop/javascript-api/@arangodb/cursor-object.md new file mode 100644 index 0000000000..57f7f2ef40 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/@arangodb/cursor-object.md @@ -0,0 +1,106 @@ +--- +title: The _cursor_ object of the JavaScript API +menuTitle: cursor object +weight: 20 +description: >- + Cursor objects let you iterate over the results of executed AQL queries +--- +The JavaScript API returns _cursor_ objects when you use the following methods +of the [`db` object](db-object.md) from the `@arangodb` +module in _arangosh_, as well as in server-side JavaScript contexts if the +`stream` query option is enabled: + +- `db._query(...)` +- `db._createStatement(...).execute()` + +If a query returns a cursor, then you can use the `hasNext()` and `next()` +methods to iterate over the results, or `toArray()` to convert them to an array. + +If the number of query results is expected to be big, it is possible to +limit the amount of documents transferred between the server and the client +to a specific value. This value is called `batchSize`. The `batchSize` +can optionally be set when a statement is executed using its `execute()` method. +If no `batchSize` value is specified, the server picks a reasonable default value. +If the server has more documents than should be returned in a single batch, +the server sets the `hasMore` attribute in the result. It also +returns the ID of the server-side cursor in the `id` attribute in the response. +This ID can be used with the Cursor API to fetch any outstanding results from +the server and dispose the server-side cursor afterwards. + +## `cursor.hasNext()` + +Checks if the cursor is exhausted. + +The `hasNext()` method returns `true`, then the cursor still has +documents. In this case the next document can be accessed using the +`next` operator, which advances the cursor. + +**Examples** + +```js +--- +name: cursorHasNext +description: '' +--- +~db._create("five"); +~db.five.save({ name : "one" }); +~db.five.save({ name : "two" }); +~db.five.save({ name : "three" }); +~db.five.save({ name : "four" }); +~db.five.save({ name : "five" }); +var cursor = db._query("FOR x IN five RETURN x"); +while (cursor.hasNext()) { + print(cursor.next()); +} +~db._drop("five") +``` + +## `cursor.next()` + +Returns the next result document. + +If the `hasNext()` method returns `true`, then the underlying +cursor of the AQL query still has documents. In this case the +next document can be accessed using the `next()` method, which +advances the underlying cursor. If you use `next()` on an +exhausted cursor, then `undefined` is returned. + +**Examples** + +```js +--- +name: cursorNext +description: '' +--- +~db._create("five"); +~db.five.save({ name : "one" }); +~db.five.save({ name : "two" }); +~db.five.save({ name : "three" }); +~db.five.save({ name : "four" }); +~db.five.save({ name : "five" }); +db._query("FOR x IN five RETURN x").next(); +~db._drop("five") +``` + +## `cursor.dispose()` + +Disposes the cursor and its results. + +If you are no longer interested in any further results, you should call +`dispose()` in order to free any resources associated with the cursor. +After calling `dispose()`, you can no longer access the cursor. + +## `cursor.count()` + +Counts the number of documents in the result set and +returns that number. The `count()` method ignores any limits and returns +the total number of documents found. + +--- + +`cursor.count(true)` + +If the result set was limited by the `limit()` method or documents were +skipped using the `skip()` method, the `count()` method with argument +`true` uses the number of elements in the final result set - after +applying limit and skip. diff --git a/site/content/arangodb/oem/develop/javascript-api/@arangodb/db-object.md b/site/content/arangodb/oem/develop/javascript-api/@arangodb/db-object.md new file mode 100644 index 0000000000..83d66b096e --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/@arangodb/db-object.md @@ -0,0 +1,1284 @@ +--- +title: The `db` object of the JavaScript API +menuTitle: '`db` object' +weight: 5 +description: >- + The database object represents the currently selected database and provides + access to information and methods for executing operations in the context of + this database +--- +The `db` object of the JavaScript API is available in [arangosh](../../../components/tools/arangodb-shell/_index.md) +by default, and can also be imported and used in Foxx services and other +server-side JavaScript contexts from the `@arangodb` module. + +## Property access + +- `db.<collection-name>` and `db["<collection-name>"]` return a + [_collection_ object](collection-object.md) for the + specified collection if it exists. + +- `db.<view-name>` and `db["<view-name>"]` return a + [_view_ object](view-object.md) for the + specified View if it exists. + +## Databases + +### `db._createDatabase(name [, options [, users]])` + +Creates a new database with the specified name. +There are restrictions for database names +(see [Database names](../../../concepts/data-structure/databases.md#database-names)). + +{{< info >}} +You can only create new databases from within the `_system` database. +{{< /info >}} + +Note that even if the database is created successfully, there will be no +change into the current database to the new database. Changing the current +database must explicitly be requested by using the +`db._useDatabase()` method. + +The `options` attribute can be used to set defaults for collections that will +be created in the new database (_cluster only_): + +- `sharding`: The sharding method to use. Valid values are: `""` or `"single"`. + Setting this option to `"single"` enables the OneShard feature. +- `replicationFactor`: Default replication factor. Special values: + - `"satellite"`: Replicate the collection to every DB-Server (Enterprise Edition only) + - `1`: Disable replication +- `writeConcern`: How many copies of each shard are required to be in sync on + the different DB-Servers. If there are less then these many copies in the + cluster a shard will refuse to write. The value of `writeConcern` cannot be + greater than `replicationFactor`. + +The optional `users` attribute can be used to create initial users for +the new database. If specified, it must be a list of user objects. Each user +object can contain the following attributes: + +- `username`: the user name as a string. This attribute is mandatory. +- `passwd`: the user password as a string. If not specified, then it defaults + to an empty string. +- `active`: a boolean flag indicating whether the user account should be + active or not. The default value is `true`. +- `extra`: an optional JSON object with extra user information. The data + contained in `extra` will be stored for the user but not be interpreted + further by ArangoDB. + +If no initial users are specified, a default user `root` will be created +with an empty string password. This ensures that the new database will be +accessible via HTTP after it is created. + +You can create users in a database if no initial user is specified. Switch +into the new database (username and password must be identical to the current +session) and add or modify users with the following commands. + +```js +require("@arangodb/users").save(username, password, true); +require("@arangodb/users").update(username, password, true); +require("@arangodb/users").remove(username); +``` +Alternatively, you can specify user data directly. For example: + +```js +db._createDatabase("newDB", {}, [{ username: "newUser", passwd: "123456", active: true}]) +``` + +### `db._useDatabase(name)` + +Changes the current database to the specified database. +Note that the database specified by `name` must already exist. + +Changing the database might be disallowed in some contexts, for example, +in server-side actions (including Foxx). + +When performing this command from arangosh, the current credentials (username +and password) will be re-used. These credentials might not be valid to +connect to the database specified by `name`. Additionally, the database +only be accessed from certain endpoints only. In this case, switching the +database might not work, and the connection / session should be closed and +restarted with different username and password credentials and/or +endpoint data. + +### `db._databases()` + +Returns the list of all existing databases. + +{{< info >}} +The databases can only be listed from within the `_system` database. +{{< /info >}} + +### `db._dropDatabase(name)` + +Drops the specified database. The database specified by `name` must exist. + +{{< info >}} +Databases can only be dropped from within the `_system` database. +The `_system` database itself cannot be dropped. +{{< /info >}} + +Databases are dropped asynchronously, and will be physically removed if +all clients have disconnected and references have been garbage-collected. + +### `db._name()` + +Returns the name of the current database as a string. + +**Examples** + +```js +--- +name: dbName +description: '' +--- +require("@arangodb").db._name(); +``` + +### `db._id()` + +Returns the identifier of the current database as a string. + +**Examples** + +```js +--- +name: dbId +description: '' +--- +require("@arangodb").db._id(); +``` + +### `db._isSystem()` + +Returns whether the currently used database is the `_system` database. + +The system database has some special privileges and properties, for example, +database management operations such as creating or dropping databases can only +be executed from within the `_system` database. The `_system` database itself +cannot be dropped. + +### `db._path()` + +Returns the filesystem path of the current database as a string. + +{{< info >}} +This is a legacy method and always returns the string `none` with the +RocksDB storage engine. +{{< /info >}} + +**Examples** + +```js +--- +name: dbPath +description: '' +--- +require("@arangodb").db._path(); +``` + +### `db._properties()` + +Returns the properties of the current database as an object with the following +attributes: + +- `id`: the database identifier +- `name`: the database name +- `isSystem`: the database type +- `path`: the path to the database files (not used anymore, always `""`) +- `sharding`: the sharding method to use for new collections _(cluster only)_ +- `replicationFactor`: default replication factor for new collections + _(cluster only)_ +- `writeConcern`: a shard will refuse to write if less than this amount + of copies are in sync _(cluster only)_ + +**Examples** + +```js +--- +name: dbProperties +description: '' +type: cluster +--- +require("@arangodb").db._properties(); +``` + +## Collections + +### `db._create(collection-name [, properties [, type] [, options]])` + +Create a new document collection or edge collection. + +`db._create(collection-name)` + +Creates a new document collection named `collection-name` with the default +settings and returns a [_collection_ object](collection-object.md). + +If a collection or View with this name exists already, or if the name format is invalid, an +error is thrown. For information about the naming constraints for collections, see +[Collection names](../../../concepts/data-structure/collections.md#collection-names). + +--- + +`db._create(collection-name, properties)` + +`properties` must be an object with the following attributes: + +- `waitForSync` (boolean, _optional_, default `false`): If `true`, creating, + changing, or removing a document waits until the data is synchronized to disk. + +- `keyOptions` (object, _optional_): The options for key generation. If + specified, then `keyOptions` should be an object containing the + following attributes: + - `type` (string): specifies the type of the key generator. + The available generators are `"traditional"` (default), `"autoincrement"`, + `"uuid"` and `"padded"`. + - The `traditional` key generator generates numerical keys in ascending order. + The sequence of keys is not guaranteed to be gap-free. + - The `autoincrement` key generator generates numerical keys in ascending order, + the initial offset and the spacing can be configured (**note**: + `autoincrement` is only supported for non-sharded or + single-sharded collections). + The sequence of generated keys is not guaranteed to be gap-free, because a new key + is generated on every document insert attempt, not just for successful + inserts. + - The `padded` key generator generates keys of a fixed length (16 bytes) in + ascending lexicographical sort order. This is ideal for the RocksDB storage engine, + which slightly benefits keys that are inserted in lexicographically + ascending order. The key generator can be used in a single-server or cluster. + The sequence of generated keys is not guaranteed to be gap-free. + - The `uuid` key generator generates universally unique 128 bit keys, which + are stored in hexadecimal human-readable format. This key generator can be used + in a single-server or cluster to generate "seemingly random" keys. The keys + produced by this key generator are not lexicographically sorted. + + Please note that keys are only guaranteed to be truly ascending in single + server deployments and for collections that only have a single shard (that includes + collections in a OneShard database). + The reason is that for collections with more than a single shard, document keys + are generated on Coordinator(s). For collections with a single shard, the document + keys are generated on the leader DB-Server, which has full control over the key + sequence. + + - `allowUserKeys` (boolean, _optional_): If set to `true`, then you are allowed + to supply own key values in the `_key` attribute of documents. If set to + `false`, then the key generator is solely responsible for generating keys and + an error is raised if you supply own key values in the `_key` attribute + of documents. + + {{< warning >}} + You should not use both user-specified and automatically generated document keys + in the same collection in cluster deployments for collections with more than a + single shard. Mixing the two can lead to conflicts because Coordinators that + auto-generate keys in this case are not aware of all keys which are already used. + {{< /warning >}} + - `increment`: The increment value for the `autoincrement` key generator. + Not allowed for other key generator types. + - `offset`: The initial offset value for the `autoincrement` key generator. + Not allowed for other key generator types. + - `lastValue`: the offset value for the `autoincrement` or `padded` + key generator. This is an internal property for restoring dumps properly. + +- `schema` (object\|null, _optional_, default: `null`): + An object that specifies the collection-level document schema for documents. + The attribute keys `rule`, `level` and `message` must follow the rules + documented in [Document Schema Validation](../../../concepts/data-structure/documents/schema-validation.md) + +- `computedValues` (array\|null, _optional_, default: `null`): An array of objects, + each representing a [Computed Value](../../../concepts/data-structure/documents/computed-values.md). + +- `cacheEnabled` (boolean): Whether the in-memory hash cache for documents should be + enabled for this collection (default: `false`). Can be controlled globally + with the `--cache.size` startup option. The cache can speed up repeated reads + of the same documents via their document keys. If the same documents are not + fetched often or are modified frequently, then you may disable the cache to + avoid the maintenance costs. + +- `isSystem` (boolean, _optional_, default: `false`): If `true`, create a + system collection. In this case, the collection name should start with + an underscore. End-users should normally create non-system collections + only. API implementors may be required to create system collections in + very special occasions, but normally a regular collection is sufficient. + +- `syncByRevision` (boolean, _optional_, default: `true`): + Whether the newer revision-based replication protocol + is enabled for this collection. This is an internal property. + +- `numberOfShards` (number, _optional_, default `1`): In a cluster, this value + determines the number of shards to create for the collection. In a single + server setup, this option is meaningless. + +- `shardKeys` (array, _optional_, default: `["_key"]`): In a cluster, this + attribute determines which document attributes are used to determine the + target shard for documents. Documents are sent to shards based on the + values they have in their shard key attributes. The values of all shard + key attributes in a document are hashed, and the hash value is used to + determine the target shard. Note that values of shard key attributes cannot + be changed once set. + This option is meaningless in a single server setup. + + When choosing the shard keys, you must be aware of the following + rules and limitations: In a sharded collection with more than + one shard it is not possible to set up a unique constraint on + an attribute that is not the one and only shard key given in + `shardKeys`. This is because enforcing a unique constraint + would otherwise make a global index necessary or need extensive + communication for every single write operation. Furthermore, if + `_key` is not the one and only shard key, then it is not possible + to set the `_key` attribute when inserting a document, provided + the collection has more than one shard. Again, this is because + the database has to enforce the unique constraint on the `_key` + attribute and this can only be done efficiently if this is the + only shard key by delegating to the individual shards. + +- `replicationFactor` (number\|string, _optional_, default `1`): In a cluster, this + attribute determines how many copies of each shard are kept on + different DB-Servers. The value 1 means that only one copy (no + synchronous replication) is kept. A value of k means that + k-1 replicas are kept. Any two copies reside on different DB-Servers. + Replication between them is synchronous, that is, every write operation + to the "leader" copy is replicated to all "follower" replicas, + before the write operation is reported successful. + + If a server fails, this is detected automatically and one of the + servers holding copies take over, usually without an error being + reported. + + When using the *Enterprise Edition* of ArangoDB, the `replicationFactor` + may be set to `"satellite"` making the collection locally joinable + on every DB-Server. This reduces the number of network hops + dramatically when using joins in AQL at the costs of reduced write + performance on these collections. + +- `writeConcern` (number, _optional_, default `1`): In a cluster, this + attribute determines how many copies of each shard are required + to be in sync on the different DB-Servers. If there are less then these + many copies in the cluster, a shard refuses to write. The value of + `writeConcern` cannot be greater than `replicationFactor`. + Please note: during server failures this might lead to writes + not being possible until the failover is sorted out and might cause + write slow downs in trade for data durability. + +- `shardingStrategy` (optional): specifies the name of the sharding + strategy to use for the collection. There are + different sharding strategies to select from when creating a new + collection. The selected `shardingStrategy` value remains + fixed for the collection and cannot be changed afterwards. This is + important to make the collection keep its sharding settings and + always find documents already distributed to shards using the same + initial sharding algorithm. + + The available sharding strategies are: + - `"community-compat"`: default sharding used by ArangoDB + Community Edition before version 3.4 + - `"enterprise-compat"`: default sharding used by ArangoDB + Enterprise Edition before version 3.4 + - `"enterprise-smart-edge-compat"`: default sharding used by smart edge + collections in ArangoDB Enterprise Edition before version 3.4 + - `"hash"`: default sharding used for new collections starting from version 3.4 + (excluding smart edge collections) + - `"enterprise-hash-smart-edge"`: default sharding used for new + smart edge collections starting from version 3.4 + - `enterprise-hex-smart-vertex`: sharding used for vertex collections of + EnterpriseGraphs + + If no sharding strategy is specified, the default is `hash` for + all normal collections, `enterprise-hash-smart-edge` for all smart edge + collections, and `enterprise-hex-smart-vertex` for EnterpriseGraph + vertex collections (the latter two require the *Enterprise Edition* of ArangoDB). + Manually overriding the sharding strategy does not yet provide a + benefit, but it may later in case other sharding strategies are added. + + In single-server mode, the `shardingStrategy` attribute is meaningless + and is ignored. + +- `distributeShardsLike` (string, _optional_, default: `""`): + The name of another collection. If this property is set in a cluster, the + collection copies the `replicationFactor`, `numberOfShards`, `shardingStrategy`, and `writeConcern` + properties from the specified collection (referred to as the _prototype collection_) + and distributes the shards of this collection in the same way as the shards of + the other collection. In an Enterprise Edition cluster, this data co-location is + utilized to optimize queries. + + You need to use the same number of `shardKeys` as the prototype collection, but + you can use different attributes. + + {{< info >}} + Using this parameter has consequences for the prototype collection. + It can no longer be dropped unless the sharding-imitating collections are + dropped beforehand. Equally, backups and restores of imitating collections + alone result in errors about missing sharding prototypes. + {{< /info >}} + +- `isSmart` (boolean): Whether the collection is for a SmartGraph or + EnterpriseGraph (Enterprise Edition only). This is an internal property. + +- `isDisjoint` (boolean): Whether the collection is for a Disjoint SmartGraph + (Enterprise Edition only). This is an internal property. + +- `smartGraphAttribute` (string, _optional_): + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices. + + This feature can only be used in the *Enterprise Edition*. + +- `smartJoinAttribute` (string, _optional_): In an *Enterprise Edition* cluster, this attribute + determines an attribute of the collection that must contain the shard key value + of the referred-to SmartJoin collection. Additionally, the sharding key + for a document in this collection must contain the value of this attribute, + followed by a colon, followed by the actual primary key of the document. + + This feature can only be used in the *Enterprise Edition* and requires the + `distributeShardsLike` attribute of the collection to be set to the name + of another collection. It also requires the `shardKeys` attribute of the + collection to be set to a single shard key attribute, with an additional `:` + at the end. + A further restriction is that whenever documents are stored or updated in the + collection, the value stored in the `smartJoinAttribute` must be a string. + +--- + +`db._create(collection-name, properties, type)` + +Specifies the optional `type` of the collection, it can either be `document` +or `edge`. On default it is document. Instead of giving a type you can also use +`db._createEdgeCollection()` or `db._createDocumentCollection()`. + +--- + +`db._create(collection-name, properties [, type], options)` + +As an optional third parameter (if the `type` string is omitted) or as fourth +parameter, you can specify an optional options map that controls how the +cluster creates the collection. These options are only relevant at +creation time and are not persisted: + +- `waitForSyncReplication` (default: `true`) + If enabled, the server only reports success back to the client + if all replicas have created the collection. Set to `false` if you want faster + server responses and don't care about full replication. + +- `enforceReplicationFactor` (default: `true`) + If enabled, the server checks if there are enough replicas + available at creation time and bails out otherwise. Set to `false` to disable + this extra check. + +**Examples** + +With defaults: + +```js +--- +name: collectionDatabaseCreateSuccess +description: '' +--- +var coll = db._create("users"); +coll.properties(); +~db._drop("users"); +``` + +With properties: + +```js +--- +name: collectionDatabaseCreateProperties +description: '' +--- +var coll = db._create("users", { waitForSync: true }); +coll.properties(); +~db._drop("users"); +``` + +With a key generator: + +```js +--- +name: collectionDatabaseCreateKey +description: '' +--- +var coll = db._create("users", { keyOptions: { type: "autoincrement", offset: 10, increment: 5 } }); +db.users.save({ name: "user 1" }); +db.users.save({ name: "user 2" }); +db.users.save({ name: "user 3" }); +~db._drop("users"); +``` + +With a special key option: + +```js +--- +name: collectionDatabaseCreateSpecialKey +description: '' +--- +var coll = db._create("users", { keyOptions: { allowUserKeys: false } }); +db.users.save({ name: "user 1" }); +db.users.save({ name: "user 2", _key: "myuser" }); // xpError(ERROR_ARANGO_DOCUMENT_KEY_UNEXPECTED) +db.users.save({ name: "user 3" }); +~db._drop("users"); +``` + +### `db._createDocumentCollection(collection-name [, properties])` + +See [`db._create(collection-name [, properties])`](#db_createcollection-name--properties--type--options). + +### `db._createEdgeCollection(collection-name [, properties])` + +`db._createEdgeCollection(collection-name)` + +Creates a new edge collection named `collection-name` with the default settings +and returns a [_collection_ object](collection-object.md). + +If a collection or View with this name exists already, an error is thrown. + +--- + +`db._createEdgeCollection(collection-name, properties)` + +Creates a new edge collection with the specified properties. +See [`db._create(collection-name, properties)`](#db_createcollection-name--properties--type--options) +for the available properties. + +### `db._collections()` + +Returns all collections of the current database. +Each array element is a [_collection_ object](collection-object.md). + +**Examples** + +```js +--- +name: collectionsDatabaseName +description: '' +--- +~db._create("example"); +db._collections(); +~db._drop("example"); +``` + +### `db._collection(collection)` + +`db._collection(collection-name)` + +Returns the collection with the specified name as a [_collection_ object](collection-object.md), +or `null` if no such collection exists. + +--- + +`db._collection(collection-identifier)` + +Returns the collection with the given identifier as a [_collection_ object](collection-object.md), +or `null` if no such collection exists. + +{{< warning >}} +Accessing collections by identifier is discouraged for end-users. +Access collections using the collection name instead. +{{< /warning >}} + +**Examples** + +Get a collection by name: + +```js +--- +name: collectionDatabaseNameKnown +description: '' +--- +db._collection("demo"); +``` + +Get a collection by identifier: + +``` +arangosh> db._collection(123456); +[ArangoCollection 123456, "demo" (type document, status loaded)] +``` + +Unknown collection: + +```js +--- +name: collectionDatabaseNameUnknown +description: '' +--- +db._collection("unknown"); +``` + +### `db._truncate(collection)` + +Truncates a `collection`, removing all documents but keeping all its +index definitions and other settings. + +--- + +`db._truncate(collection-name)` + +Truncates a collection named `collection-name`. No error is thrown if +there is no such collection. + +--- + +`db._truncate(collection-identifier)` + +Truncates a collection identified by `collection-identified`. No error is +thrown if there is no such collection. + +**Examples** + +Truncates a collection: + +```js +--- +name: collectionDatabaseTruncateByObject +description: '' +--- +~db._create("example"); +var coll = db._collection("example"); +var doc = coll.save({ "Hello" : "World" }); +coll.count(); +db._truncate(coll); +coll.count(); +~db._drop("example"); +``` + +Truncates a collection identified by name: + +```js +--- +name: collectionDatabaseTruncateName +description: '' +--- +~db._create("example"); +var coll = db._collection("example"); +var doc = coll.save({ "Hello" : "World" }); +coll.count(); +db._truncate("example"); +coll.count(); +~db._drop("example"); +``` + +### `db._drop(collection [, options])` + +Drops a `collection` and all its indexes and data. + +`db._drop(collection-name)` + +Drops a collection named `collection-name` and all its indexes. No error +is thrown if there is no such collection. + +--- + +`db._drop(collection-identifier)` + +Drops a collection identified by `collection-identifier` with all its +indexes and data. No error is thrown if there is no such collection. + +--- + +`db._drop(collection-name, options)` + +In order to drop a system collection, you must specify an `options` object +with attribute `isSystem` set to `true`. Otherwise, it is not possible to +drop system collections. + +{{< info >}} +Collections in a cluster deployment that are prototypes for collections +with `distributeShardsLike` parameter cannot be dropped. +{{< /info >}} + +**Examples** + +Drops a collection: + +```js +--- +name: collectionDatabaseDropByObject +description: '' +--- +~db._create("example"); +var coll = db._collection("example"); +db._drop(coll); +~db._drop("example"); +``` + +Drops a collection identified by name: + +```js +--- +name: collectionDatabaseDropName +description: '' +--- +~db._create("example"); +coll = db._collection("example"); +db._drop("example"); +coll; +``` + +Drops a system collection + +```js +--- +name: collectionDatabaseDropSystem +description: '' +--- +~db._create("_example", { isSystem: true }); +var coll = db._example; +db._drop("_example", { isSystem: true }); +``` + +## Documents + +### `db._exists(document)` + +`db._exists(object)` + +Checks whether a document exists using an object containing an `_id` attribute. + +An error is thrown if a `_rev` attribute is specified but the found document +has a different revision. + +Instead of returning the found document or an error, this method +only returns an object with the attributes `_id`, `_key` and `_rev`, or +`false` if no document with the given `_id` or `_key` exists. It can +thus be used for easy existence checks. + +This method throws an error if used improperly, e.g. if called +with a string that isn't a document identifier, or an object with an invalid or +missing `_id` attribute. + +--- + +`db._exists(document-identifier)` + +Checks whether a document exists using a document identifier. + +### `db._update(document, data [, options])` + +`db._update(object, data)` + +Updates an existing document described by the `object`, which must +be an object containing the `_id` attribute. There must be +a document with that `_id` in the current database. This +document is then patched with the `data` given as second argument. +Any attribute `_id`, `_key` or `_rev` in `data` is ignored. + +The method returns a document with the attributes `_id`, `_key`, `_rev` +and `_oldRev`. The attribute `_id` contains the document identifier of the +updated document, the attribute `_rev` contains the document revision of +the updated document, the attribute `_oldRev` contains the revision of +the old (now updated) document. + +If the object contains a `_rev` attribute, the method first checks +that the specified revision is the current revision of that document. +If not, there is a conflict, and an error is thrown. + +--- + +`db._update(object, data, options)` + +Updates an existing document with additional boolean `options` passed via an object: + + - `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. + - `overwrite`: If this flag is set to `true`, a `_rev` attribute in + the selector is ignored. + - `returnNew`: If this flag is set to `true`, the complete new document + is returned in the output under the attribute `new`. + - `returnOld`: If this flag is set to `true`, the complete previous + revision of the document is returned in the output under the + attribute `old`. + - `silent`: If this flag is set to `true`, no output is returned. + - `keepNull`: The optional `keepNull` parameter can be used to modify + the behavior when handling `null` values. Normally, `null` values + are stored in the database. By setting the `keepNull` parameter to + `false`, this behavior can be changed so that top-level attributes and + sub-attributes in `data` with `null` values are removed from the target + document (but not attributes of objects that are nested inside of arrays). + - `mergeObjects`: Controls whether objects (not arrays) will be + merged if present in both the existing and the patch document. If + set to `false`, the value in the patch document will overwrite the + existing document's value. If set to `true`, objects will be merged. + The default is `true`. + +--- + +`db._update(document-identifier, data)` + +`db._update(document-identifier, data, options)` + +Updates an existing document described by a document identifier, optionally +with additional boolean options (see above). + +No revision check is performed. + +**Examples** + +Create and update a document: + +```js +--- +name: documentDocumentUpdate +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db._update(a1, { b : 2 }); +a3 = db._update(a1, { c : 3 }); // xpError(ERROR_ARANGO_CONFLICT); +~db._drop("example"); +``` + +Ignore a revision mismatch when updating the document: + +```js +--- +name: documentDocumentUpdateOverwrite +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db._update(a1, { b : 2 }); +a3 = db._update(a1, { c : 3 }, { overwrite: true }); +~db._drop("example"); +``` + +### `db._replace(document, data)` + +`db._replace(object, data)` + +Replaces an existing document described by the `object`, which must +be an object containing the `_id` attribute. There must be +a document with that `_id` in the current database. This +document is then replaced with the `data` given as second argument. +Any attribute `_id`, `_key` or `_rev` in `data` is ignored. + +The method returns a document with the attributes `_id`, `_key`, `_rev` +and `_oldRev`. The attribute `_id` contains the document identifier of the +updated document, the attribute `_rev` contains the document revision of +the updated document, the attribute `_oldRev` contains the revision of +the old (now replaced) document. + +If the object contains a `_rev` attribute, the method first checks +that the specified revision is the current revision of that document. +If not, there is a conflict, and an error is thrown. + +--- + +`collection.replace(object, data, options)` + +Replaces an existing document, with additional boolean `options` passed via an object: + + - `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. + - `overwrite`: If this flag is set to `true`, a `_rev` attribute in + the selector is ignored. + - `returnNew`: If this flag is set to `true`, the complete new document + is returned in the output under the attribute `new`. + - `returnOld`: If this flag is set to `true`, the complete previous + revision of the document is returned in the output under the + attribute `old`. + - `silent`: If this flag is set to `true`, no output is returned. + +--- + +`db._replace(document-identifier, data)` + +`db._replace(document-identifier, data, options)` + +Replaces an existing document described by a document identifier, optionally +with boolean options (see above). + +No revision check is performed. + +**Examples** + +Create and replace a document: + +```js +--- +name: documentsDocumentReplace +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db._replace(a1, { a : 2 }); +a3 = db._replace(a1, { a : 3 }); // xpError(ERROR_ARANGO_CONFLICT); +~db._drop("example"); +``` + +Ignore a revision mismatch when replacing the document: + +```js +--- +name: documentsDocumentReplaceOverwrite +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db._replace(a1, { a : 2 }); +a3 = db._replace(a1, { a : 3 }, { overwrite: true }); +~db._drop("example"); +``` + +### `db._remove(document)` + +`db._remove(object)` + +Removes a document described by the `object`, which must be an object +containing the `_id` attribute. There must be a document with +that `_id` in the current database. This document is then +removed. + +The method returns a document with the attributes `_id`, `_key` and `_rev`. +The attribute `_id` contains the document identifier of the +removed document, the attribute `_rev` contains the document revision of +the removed document. + +If the object contains a `_rev` attribute, the method first checks +that the specified revision is the current revision of that document. +If not, there is a conflict, and an error is thrown. + +--- + +`db._remove(object, options)` + +Removes a document, with additional boolean `options` passed via an object: + + - `waitForSync`: One can force + synchronization of the document creation operation to disk even in + case that the `waitForSync` flag is been disabled for the entire + collection. Thus, the `waitForSync` option can be used to force + synchronization of just specific operations. To use this, set the + `waitForSync` parameter to `true`. If the `waitForSync` parameter + is not specified or set to `false`, then the collection's default + `waitForSync` behavior is applied. The `waitForSync` parameter + cannot be used to disable synchronization for collections that have + a default `waitForSync` value of `true`. + - `overwrite`: If this flag is set to `true`, a `_rev` attribute in + the selector is ignored. + - `returnOld`: If this flag is set to `true`, the complete previous + revision of the document is returned in the output under the + attribute `old`. + - `silent`: If this flag is set to `true`, no output is returned. + +--- + +`db._remove(document-identifier)` + +`db._remove(document-identifier, options)` + +Removes an existing document described by a document identifier, optionally +with additional boolean options (see above). + +No revision check is performed. + +**Examples** + +Remove a document: + +```js +--- +name: documentsCollectionRemoveSuccess +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +db._remove(a1); +db._remove(a1); // xpError(ERROR_ARANGO_DOCUMENT_NOT_FOUND); +db._remove(a1, {overwrite: true}); // xpError(ERROR_ARANGO_DOCUMENT_NOT_FOUND); +~db._drop("example"); +``` + +Remove the document in the revision `a1` with a conflict: + +```js +--- +name: documentsCollectionRemoveConflict +description: '' +--- +~db._create("example"); +a1 = db.example.insert({ a : 1 }); +a2 = db._replace(a1, { a : 2 }); +db._remove(a1); // xpError(ERROR_ARANGO_CONFLICT) +db._remove(a1, {overwrite: true}); +db._document(a1); // xpError(ERROR_ARANGO_DOCUMENT_NOT_FOUND) +~db._drop("example"); +``` + +Remove a document using a document identifier: + +```js +--- +name: documentsCollectionRemoveIdentifier +description: '' +--- +~db._create("example"); +db.example.insert({ _key: "123456", a: 1 } ); +db.example.remove("example/123456"); +~db._drop("example"); +``` + +## Views + +### `db._createView(name, type [, properties])` + +Creates a new View and returns a [_view_ object](view-object.md). + +`name` is a string and the name of the View. No View or collection with the +same name may already exist in the current database. For information about the +naming constraints for Views, see [View names](../../../concepts/data-structure/views.md#view-names). + +`type` must be the string `"arangosearch"`, as it is currently the only +supported View type. + +`properties` is an optional object containing View configuration specific +to each View-type. +- [`arangosearch` View definition](../../../index-and-search/arangosearch/arangosearch-views-reference.md#view-definitionmodification) +- [`search-alias` View definition](../../../index-and-search/arangosearch/search-alias-views-reference.md#view-definition) + +**Examples** + +```js +--- +name: viewDatabaseCreate +description: '' +--- +var view = db._createView("example", "arangosearch"); +view.properties() +db._dropView("example") +``` + +### `db._views()` + +Returns all Views of the current database. + +Each element of the returned array is a [_view_ object](view-object.md). + +**Examples** + +List all Views: + +```js +--- +name: viewDatabaseList +description: '' +--- +~db._createView("exampleView", "arangosearch"); +db._views(); +~db._dropView("exampleView"); +``` + +### `db._view(view)` + +`db._view(view-name)` + +Returns the View with the given name as a [_view_ object](view-object.md), +or `null` if no such View exists. + +```js +--- +name: viewDatabaseGet +description: '' +--- +~db._createView("example", "arangosearch", {}); +var view = db._view("example"); +// or, alternatively +var view = db["example"]; +~db._dropView("example"); +``` + +--- + +`db._view(view-identifier)` + +Returns the View with the given identifier as a [_view_ object](view-object.md), +or `null` if no such View exists. + +{{< warning >}} +Accessing Views by identifier is discouraged for end-users. +Access Views using the View name instead. +{{< /warning >}} + +**Examples** + +Get a View by name: + +```js +--- +name: viewDatabaseNameKnown +description: '' +--- +db._view("demoView"); +``` + +Unknown View: + +```js +--- +name: viewDatabaseNameUnknown +description: '' +--- +db._view("unknown"); +``` + +### `db._dropView(view)` + +`db._dropView(name)` + +Drops a view named `name` and all its data. + +No error is thrown if there is no such View. + +--- + +`db._dropView(view-identifier)` + +Drops a View identified by `view-identifier` with all its data. +No error is thrown if there is no such View. + +**Examples** + +Drop a view: + +```js +--- +name: viewDatabaseDrop +description: '' +--- +var view = db._createView("exampleView", "arangosearch"); +db._dropView("exampleView"); +db._view("exampleView"); +``` + +## AQL + +### `db._createStatement(queryString)` + +See [`db._createStatement()`](../../../aql/how-to-invoke-aql/with-arangosh.md#with-db_createstatement-arangostatement). + +### `db._query(queryString [, bindVars [, mainOptions] [, subOptions]])` + +See [`db._query()`](../../../aql/how-to-invoke-aql/with-arangosh.md#with-db_query). + +### `db._explain(queryString)` + +See [`db._explain()`](../../../aql/execution-and-performance/explaining-queries.md). + +### `db._parse(queryString)` + +See [`db._parse()`](../../../aql/how-to-invoke-aql/with-arangosh.md#query-validation-with-db_parse). + +### `db._profileQuery(queryString [, bindVars [, options])` + +See [`db._profileQuery()`](../../../aql/execution-and-performance/query-profiling.md). + +## Indexes + +### `db._index(index)` + +Fetches an index by identifier. + +See [`db._index()`](../../../index-and-search/indexing/working-with-indexes/_index.md#fetching-an-index-by-identifier). + +### `db._dropIndex(index)` + +Drops an index by identifier. + +See [`db._dropIndex()`](../../../index-and-search/indexing/working-with-indexes/_index.md#dropping-an-index-via-a-database-object). + +## Transactions + +### `db._createTransaction()` + +{{< tag "arangosh" >}} + +Starts a Stream Transaction. + +See [`db._createTransaction()`](../../transactions/stream-transactions.md#create-transaction). + +### `db._executeTransaction()` + +Executes a JavaScript Transaction. + +See [`db._executeTransaction()`](../../transactions/javascript-transactions.md#execute-transaction). + +## Global + +### `db._compact([options])` + +Compacts the entire data, for all databases. + +This command can be used to reclaim disk space after substantial data deletions +have taken place. It requires superuser access. + +The optional `options` attribute can be used to get more control over the +compaction. The following attributes can be used in it: + +- `changeLevel`: whether or not compacted data should be moved to the minimum + possible level. The default value is `false`. +- `compactBottomMostLevel`: whether or not to compact the bottommost level of + data. The default value is `false`. + +{{< warning >}} +This command can cause a full rewrite of all data in all databases, which may +take very long for large databases. It should thus only be used with care +and only when additional I/O load can be tolerated for a prolonged time. +{{< /warning >}} + +### `db._engine()` + +Returns the name of the storage engine used by the server (`rocksdb`), as well +as a list of supported features such as types of indexes. + +### `db._engineStats()` + +Returns statistics related to the storage engine activity, including figures +about data size, cache usage, etc. + +### `db._version()` + +Returns the server version string. + +Note that this is different to the version of the database. + +**Examples** + +```js +--- +name: dbVersion +description: '' +--- +require("@arangodb").db._version(); +``` + +## License + +### `db._getLicense()` + +{{< tag "arangosh" >}} + +Returns the current license. + +See [`db._getLicense()`](../../../operations/administration/license-management.md#check-the-current-license). + +### `db._setLicense(licenseString)` + +{{< tag "arangosh" >}} + +Sets a license. + +See [`db._setLicense()`](../../../operations/administration/license-management.md#active-a-license). diff --git a/site/content/arangodb/oem/develop/javascript-api/@arangodb/view-object.md b/site/content/arangodb/oem/develop/javascript-api/@arangodb/view-object.md new file mode 100644 index 0000000000..783e162dc0 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/@arangodb/view-object.md @@ -0,0 +1,187 @@ +--- +title: The _view_ object of the JavaScript API +menuTitle: view object +weight: 15 +description: >- + View objects represent ArangoSearch Views and provide access to information + and methods for executing View-related operations +--- +The JavaScript API returns _view_ objects when you use the following methods +of the [`db` object](db-object.md) from the `@arangodb` module: + +- `db._createView(...)` +- `db._views()` +- `db._view(...)` + +{{< info >}} +Square brackets in function signatures denote optional arguments. +{{< /info >}} + +## Methods + +### `view.name()` + +Returns the name of the View. + +**Examples** + +Get View name: + +```js +--- +name: viewName +description: '' +--- +var view = db._view("demoView"); +view.name(); +``` + +### `view.type()` + +Returns the type of the View. + +**Examples** + +Get View type: + +```js +--- +name: viewType +description: '' +--- +var view = db._view("demoView"); +view.type(); +``` + +### `view.properties(new-properties [, partialUpdate])` + +`view.properties()` + +Returns the properties of the View. The format of the result is specific to +each of the supported [View Types](../../../concepts/data-structure/views.md). + +**Examples** + +Get View properties: + +```js +--- +name: viewGetProperties +description: '' +--- +var view = db._view("demoView"); +view.properties(); +``` + +--- + +`view.properties(new-properties, partialUpdate)` + +Modifies the properties of the `view`. The format of the result is specific to +each of the supported [View Types](../../../concepts/data-structure/views.md). + +`partialUpdate` is an optional Boolean parameter (`true` by default) that +determines how the `new-properties` object is merged with current View properties +(adds or updates `new-properties` properties to current if `true` replaces all +properties if `false`). + +For the available properties of the supported View types, see: +- [`arangosearch` View Properties](../../../index-and-search/arangosearch/arangosearch-views-reference.md#view-properties) +- [`search-alias` View Modification](../../../index-and-search/arangosearch/search-alias-views-reference.md#view-modification) + +**Examples** + +Modify `arangosearch` View properties: + +```js +--- +name: viewModifyProperties +description: '' +--- +~db._createView("example", "arangosearch"); +var view = db._view("example"); +view.properties(); + +// set cleanupIntervalStep to 12 +view.properties({cleanupIntervalStep: 12}); + +// add a link +view.properties({links: {demo: {}}}) + +// remove a link +view.properties({links: {demo: null}}) +~db._dropView("example"); +``` + +Add and remove inverted indexes from a `search-alias` View: + +```js +--- +name: viewModifyPropertiesSearchAlias +description: '' +--- +~db._create("coll"); +~db.coll.ensureIndex({ name: "inv1", type: "inverted", fields: ["a"] }); +~db.coll.ensureIndex({ name: "inv2", type: "inverted", fields: ["b[*]"] }); +~db.coll.ensureIndex({ name: "inv3", type: "inverted", fields: ["c"] }); +~db._createView("example", "search-alias", { indexes: [ +~{ collection: "coll", index: "inv1" }, +~{ collection: "coll", index: "inv2" } +~] }); +var view = db._view("example"); +view.properties(); + +view.properties({ indexes: [ + { collection: "coll", index: "inv1", operation: "del" }, + { collection: "coll", index: "inv3" } +] }); +~db._dropView("example"); +~db._drop("coll"); +``` + +### `view.rename(new-name)` + +Renames a view using the `new-name`. The `new-name` must not already be used by +a different view or collection in the same database. `new-name` must also be a +valid view name. For information about the naming constraints for Views, see +[View names](../../../concepts/data-structure/views.md#view-names). + +If renaming fails for any reason, an error is thrown. + +{{< info >}} +The rename method is not available in clusters. +{{< /info >}} + +**Examples** + +```js +--- +name: viewRename +description: '' +--- +var view = db._createView("example", "arangosearch"); +view.name(); +view.rename("exampleRenamed"); +view.name(); +~db._dropView("exampleRenamed"); +``` + +### `view.drop()` + +Drops a View and all its data. + +**Examples** + +Drop a View: + +```js +--- +name: viewDrop +description: '' +--- +var view = db._createView("example", "arangosearch"); +// or +var view = db._view("example"); +view.drop(); +db._view("example"); +``` diff --git a/site/content/arangodb/oem/develop/javascript-api/_index.md b/site/content/arangodb/oem/develop/javascript-api/_index.md new file mode 100644 index 0000000000..fb7146ff1b --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/_index.md @@ -0,0 +1,290 @@ +--- +title: JavaScript API +menuTitle: JavaScript API +weight: 270 +description: >- + You can use ArangoDB's JavaScript interface on the server-side as well as in + ArangoDB's shell to interact with the server using the JavaScript language +--- +The JavaScript API is available on the server-side in the following contexts: + +- [Foxx microservices](../foxx-microservices/_index.md) +- [User-defined AQL functions](../../aql/user-defined-functions.md) +- [JavaScript Transactions](../transactions/javascript-transactions.md) +- [Emergency console](../../operations/troubleshooting/emergency-console.md) (`arangod --console`) + +Running on the server-side means that the code runs directly inside of the +_arangod_ process, bypassing the HTTP API. In cluster deployments, the code +is executed on a Coordinator. + +The JavaScript API is also available in the ArangoDB Shell client tool: + +- [arangosh](../../components/tools/arangodb-shell/_index.md) + +It communicates with the server via the HTTP API. +<!-- TODO (DOC-139): There are some differences to the server-side API. --> + +{{< tip >}} +The JavaScript API cannot be used in browsers, Node.js, or other JavaScript +environments. You can use the [arangojs driver](../drivers/javascript.md) instead. +Note that it has a different interface. +{{< /tip >}} + +## Usage example + +The key element for using the JavaScript API is the +[`db` object](@arangodb/db-object.md), which is available by default +in _arangosh_ and can be imported in server-side JavaScript code from the +`@arangodb` module. + +```js +// Import the db object (only in server-side contexts) +let db = require("@arangodb").db; +``` + +The `db` object lets you access and manage databases, for example: + +```js +// Create a new database +db._createDatabase("myDB"); + +// Make it the current database +db._useDatabase("myDB"); +print(`Database context: ${ db._name() }`); +``` + +You can also work with collections and Views using the `db` object. +Accessing a collection returns a [_collection_ object](@arangodb/collection-object.md) +and accessing a View returns a [_view_ object](@arangodb/view-object.md). + +```js +// Create a new collection. Returns a collection object +let coll = db._create("collection"); + +// Create a new arangosearch View. Returns a view object +let view = db._createView("view", "arangosearch", { links: { collection: { includeAllFields: true } } }); +``` + +To obtain a reference to a collection or View again, you can use multiple ways: + +```js +coll = db._collection("collection"); +view = db._view("view"); +// or +coll = db.collection; +view = db.view; +``` + +You can create documents via a _collection_ object. You can use arbitrary +JavaScript code to generate data. + +```js +// Create single documents using both available methods. +// Returns an object with the document metadata (the _id, _key, and _rev attributes) +coll.save({ value: "foo" }); +coll.insert({ value: "bar" }); + +// Create an array of objects and create multiple documents at once +let arr = []; +for (let i = 1; i < 100; i++) { + arr.push({ value: i }); +} +coll.save(arr); +``` + +Indexes can also be created via a _collection_ object. + +```js +// Create an index for the collection +coll.ensureIndex({ type: "persistent", fields: ["value"] }); +``` + +To query the data in the current database, use the `db` object. Executing an +AQL query returns a [_cursor_ object](@arangodb/cursor-object.md). + +```js +// Run an AQL query. Returns a cursor object +let cursor = db._query(`FOR doc IN collection FILTER doc.value >= "bar" RETURN doc`); +cursor.toArray(); + +// Import the aql query helper (only in server-side contexts) +const aql = require("@arangodb").aql; + +// Run an AQL query using the query helper to use variables as bind parameters +let limit = 5; +db._query(aql`FOR doc IN ${ coll } LIMIT ${ limit } RETURN doc`).toArray(); +``` + +See the full reference documentation for the common objects returned by the +[`@arangodb` module](@arangodb/_index.md) for details: +- [`db` object](@arangodb/db-object.md) +- [_collection_ object](@arangodb/collection-object.md) +- [_view_ object](@arangodb/view-object.md) +- [_cursor_ object](@arangodb/cursor-object.md) + +## JavaScript Modules + +ArangoDB uses a Node.js-compatible module system. You can use the function +`require()` in order to load a module or library. It returns the exported +variables and functions of the module. + +The following global variables are available in _arangosh_ and all server-side +JavaScript contexts in ArangoDB: + +- `global` +- `process` +- `console` +- `Buffer` +- `__filename` +- `__dirname` + +### ArangoDB-specific modules + +There is a large number of ArangoDB-specific modules using the `@arangodb` +namespace. Some of these modules are for internal use by ArangoDB itself. +You can use the following modules as an end-user: + +- [**@arangodb**](@arangodb/_index.md) + provides direct access to the database and its collections. + +- [**@arangodb/analyzers**](analyzers.md) + provides an interface to manage ArangoSearch Analyzers. + +- AQL related modules: + + - [**@arangodb/aql/queries**](aql-queries.md) + offers methods to track and kill AQL queries. + + - [**@arangodb/aql/cache**](../../aql/execution-and-performance/caching-query-results.md) + allows to control the AQL query result caching feature. + + - [**@arangodb/aql/explainer**](../../aql/execution-and-performance/explaining-queries.md) + provides methods to debug, explain and profile AQL queries. + + - [**@arangodb/aql/functions**](../../aql/user-defined-functions.md#registering-and-unregistering-user-functions) + provides an interface to (un-)register user-defined AQL functions. + +- [**@arangodb/crypto**](crypto.md) + provides various cryptography functions including hashing algorithms. + +- [**@arangodb/foxx**](../foxx-microservices/_index.md) + is the namespace providing the various building blocks of the Foxx + microservice framework. + + - [**@arangodb/locals**](../foxx-microservices/reference/related-modules/_index.md#the-arangodblocals-module) + is a helper module to use Foxx together with Webpack. + +- Graph-related modules: + + - [**@arangodb/general-graph**](../../graphs/general-graphs/_index.md) + implements a graph management interface for named graphs. + + - [**@arangodb/smart-graph**](../../graphs/smartgraphs/management.md) + provides management features for SmartGraphs + + - [**@arangodb/satellite-graph**](../../graphs/satellitegraphs/management.md) + provides management features for SatelliteGraphs + + - [**@arangodb/enterprise-graph**](../../graphs/enterprisegraphs/management.md) + provides management features for EnterpriseGraphs + + - [**@arangodb/graph-examples/example-graph**](../../graphs/_index.md#example-graphs) + can load example graphs (creates collections, populates them with documents + and creates named graphs) + +- [**@arangodb/request**](request.md) + provides the functionality for making synchronous HTTP/HTTPS requests. + +- [**@arangodb/tasks**](tasks.md) + implements task management methods + +- [**@arangodb/users**](../../operations/administration/user-management/in-arangosh.md) + provides an interface for user management. + +- [**@arangodb/pregel**](../../data-science/pregel/_index.md#javascript-api) + provides an interface for Pregel management. + +### Node-compatibility modules + +ArangoDB supports a number of modules for compatibility with Node.js, including: + +- [**assert**](http://nodejs.org/api/assert.html) + implements basic assertion and testing functions. + +- [**buffer**](http://nodejs.org/api/buffer.html) + implements a binary data type for JavaScript. + +- [**console**](console.md) + is a well known logging facility to all the JavaScript developers. + ArangoDB implements most of the [Console API](http://wiki.commonjs.org/wiki/Console), + with the exceptions of *profile* and *count*. + +- [**events**](http://nodejs.org/api/events.html) + implements an event emitter. + +- [**fs**](fs.md) + provides a file system API for the manipulation of paths, directories, files, + links, and the construction of file streams. ArangoDB implements most + [Filesystem/A](http://wiki.commonjs.org/wiki/Filesystem/A) + functions. + +- [**module**](http://nodejs.org/api/modules.html) + provides direct access to the module system. + +- [**path**](http://nodejs.org/api/path.html) + implements functions dealing with filenames and paths. + +- [**punycode**](http://nodejs.org/api/punycode.html) + implements conversion functions for + [**punycode**](http://en.wikipedia.org/wiki/Punycode) encoding. + +- [**querystring**](http://nodejs.org/api/querystring.html) + provides utilities for dealing with query strings. + +- [**stream**](http://nodejs.org/api/stream.html) + provides a streaming interface. + +- [**string_decoder**](https://nodejs.org/api/string_decoder.html) + implements logic for decoding buffers into strings. + +- [**url**](http://nodejs.org/api/url.html) + provides utilities for URL resolution and parsing. + +- [**util**](http://nodejs.org/api/util.html) + provides general utility functions like `format` and `inspect`. + +Additionally ArangoDB provides partial implementations for the following modules: + +- `net`: + only `isIP`, `isIPv4` and `isIPv6`. + +- `process`: + only `env` and `cwd`; + stubs for `argv`, `stdout.isTTY`, `stdout.write`, `nextTick`. + +- `timers`: + stubs for `setImmediate`, `setTimeout`, `setInterval`, `clearImmediate`, + `clearTimeout`, `clearInterval` and `ref`. + +- `tty`: + only `isatty` (always returns `false`). + +- `vm`: + only `runInThisContext`. + +The following Node.js modules are not available at all: + +- `child_process` +- `cluster` +- `constants` +- `crypto` (but see [`@arangodb/crypto`](crypto.md)) +- `dgram` +- `dns` +- `domain` +- `http` (but see [`@arangodb/request`](request.md)) +- `https` +- `os` +- `sys` +- `tls` +- `v8` +- `zlib` diff --git a/site/content/arangodb/oem/develop/javascript-api/actions.md b/site/content/arangodb/oem/develop/javascript-api/actions.md new file mode 100644 index 0000000000..03b73b5546 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/actions.md @@ -0,0 +1,161 @@ +--- +title: The `@arangodb/actions` module of the JavaScript API +menuTitle: '@arangodb/actions' +weight: 10 +description: >- + The actions module provides the infrastructure for defining low-level HTTP actions +--- +`const actions = require('@arangodb/actions')` + +If you want to define HTTP endpoints in ArangoDB you should probably use the +[Foxx microservice framework](../foxx-microservices/_index.md) instead. + +## Basics + +### Error message + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.getErrorMessage(code)` + +Returns the error message for an error code. + +## Standard HTTP Result Generators + +`actions.defineHttp(options)` + +Defines a new action. The *options* are as follows: + +`options.url` + +The URL, which can be used to access the action. This path might contain +slashes. Note that this action will also be called, if a url is given such that +`options.url` is a prefix of the given url and no longer definition +matches. + +`options.prefix` + +If `false`, then only use the action for exact matches. The default is +`true`. + +`options.callback(request, response)` + +The request argument contains a description of the request. A request +parameter `foo` is accessible as `request.parameters.foo`. A request +header `bar` is accessible as `request.headers.bar`. Assume that +the action is defined for the URL `/foo/bar` and the request URL is +`/foo/bar/hugo/egon`. Then the suffix parts `[ "hugo", "egon" ]` +are available in `request.suffix`. + +The callback must define fill the `response`. + +- `response.responseCode`: the response code +- `response.contentType`: the content type of the response +- `response.body`: the body of the response + +You can use the functions *ResultOk* and *ResultError* to easily +generate a response. + +### Result ok + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultOk(req, res, code, result, headers)` + +The function defines a response. *code* is the status code to +return. *result* is the result object, which will be returned as JSON +object in the body. *headers* is an array of headers to returned. +The function adds the attribute *error* with value *false* +and *code* with value *code* to the *result*. + +### Result bad + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultBad(req, res, error-code, msg, headers)` + +The function generates an error response. + +### Result not found + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultNotFound(req, res, code, msg, headers)` + +The function generates an error response. + +### Result unsupported + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultUnsupported(req, res, headers)` + +The function generates an error response. + +### Result error + +<!-- js/server/modules/@arangodb/actions.js --> + +*actions.resultError(*req*, *res*, *code*, *errorNum*, + *errorMessage*, *headers*, *keyvals)* + +The function generates an error response. The response body is an array +with an attribute *errorMessage* containing the error message +*errorMessage*, *error* containing *true*, *code* containing +*code*, *errorNum* containing *errorNum*, and *errorMessage* +containing the error message *errorMessage*. *keyvals* are mixed +into the result. + +### Result not Implemented + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultNotImplemented(req, res, msg, headers)` + +The function generates an error response. + +### Result permanent redirect + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultPermanentRedirect(req, res, options, headers)` + +The function generates a redirect response. + +### Result temporary redirect + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultTemporaryRedirect(req, res, options, headers)` + +The function generates a redirect response. + +## ArangoDB Result Generators + +### Collection not found + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.collectionNotFound(req, res, collection, headers)` + +The function generates an error response. + +### Index not found + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.indexNotFound(req, res, collection, index, headers)` + +The function generates an error response. + +### Result exception + +<!-- js/server/modules/@arangodb/actions.js --> + +`actions.resultException(req, res, err, headers, verbose)` + +The function generates an error response. If @FA{verbose} is set to +*true* or not specified (the default), then the error stack trace will +be included in the error message if available. If @FA{verbose} is a string +it will be prepended before the error message and the stacktrace will also +be included. diff --git a/site/content/arangodb/oem/develop/javascript-api/analyzers.md b/site/content/arangodb/oem/develop/javascript-api/analyzers.md new file mode 100644 index 0000000000..c25f28b077 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/analyzers.md @@ -0,0 +1,183 @@ +--- +title: The `@arangodb/analyzers` module of the JavaScript API +menuTitle: '@arangodb/analyzers' +weight: 15 +description: >- + The analyzers module provides a JavaScript interface for managing ArangoSearch + Analyzers +--- +The JavaScript API can be accessed via the `@arangodb/analyzers` module from +both server-side and client-side code (arangosh, Foxx): + +```js +var analyzers = require("@arangodb/analyzers"); +``` + +See [Analyzers](../../index-and-search/analyzers.md) for general information and +details about the attributes. + +## Analyzer Module Methods + +### Create an Analyzer + +```js +var analyzer = analyzers.save(<name>, <type>[, <properties>[, <features>]]) +``` + +Create a new Analyzer with custom configuration in the current database. + +- **name** (string): name for identifying the Analyzer later +- **type** (string): the kind of Analyzer to create +- **properties** (object, _optional_): settings specific to the chosen *type*. + Most types require at least one property, so this may not be optional +- **features** (array, _optional_): array of strings with names of the features + to enable +- returns **analyzer** (object): Analyzer object, also if an Analyzer with the + same settings exists already. An error is raised if the settings mismatch + or if they are invalid + +```js +--- +name: analyzerCreate +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.save("csv", "delimiter", { "delimiter": "," }, ["frequency", "norm", "position"]); +~analyzers.remove("csv"); +``` + +### Get an Analyzer + +```js +var analyzer = analyzers.analyzer(<name>) +``` + +Get an Analyzer by the name, stored in the current database. The name can be +prefixed with `_system::` to access Analyzers stored in the `_system` database. + +- **name** (string): name of the Analyzer to find +- returns **analyzer** (object\|null): Analyzer object if found, else `null` + +```js +--- +name: analyzerByName +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.analyzer("text_en"); +``` + +### List all Analyzers + +```js +var analyzerArray = analyzers.toArray() +``` + +List all Analyzers available in the current database. + +- returns **analyzerArray** (array): array of Analyzer objects + +```js +--- +name: analyzerList +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.toArray(); +``` + +### Remove an Analyzer + +```js +analyzers.remove(<name> [, <force>]) +``` + +Delete an Analyzer from the current database. + +- **name** (string): name of the Analyzer to remove +- **force** (bool, _optional_): remove Analyzer even if in use by a View. + Default: `false` +- returns nothing: no return value on success, otherwise an error is raised + +```js +--- +name: analyzerRemove +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +~analyzers.save("csv", "delimiter", { "delimiter": "," }, []); +analyzers.remove("csv"); +``` + +## Analyzer Object Methods + +Individual Analyzer objects expose getter accessors for the aforementioned +definition attributes (see [Create an Analyzer](#create-an-analyzer)). + +### Get Analyzer Name + +```js +var name = analyzer.name() +``` + +- returns **name** (string): name of the Analyzer + +```js +--- +name: analyzerName +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.analyzer("text_en").name(); +``` + +### Get Analyzer Type + +```js +var type = analyzer.type() +``` + +- returns **type** (string): type of the Analyzer + +```js +--- +name: analyzerType +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.analyzer("text_en").type(); +``` + +### Get Analyzer Properties + +```js +var properties = analyzer.properties() +``` + +- returns **properties** (object): *type*-dependent properties of the Analyzer + +```js +--- +name: analyzerProperties +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.analyzer("text_en").properties(); +``` + +### Get Analyzer Features + +```js +var features = analyzer.features() +``` + +- returns **features** (array): array of strings with the features of the Analyzer + +```js +--- +name: analyzerFeatures +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.analyzer("text_en").features(); +``` diff --git a/site/content/arangodb/oem/develop/javascript-api/aql-queries.md b/site/content/arangodb/oem/develop/javascript-api/aql-queries.md new file mode 100644 index 0000000000..87e39411aa --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/aql-queries.md @@ -0,0 +1,98 @@ +--- +title: The `@arangodb/aql/queries` module of the JavaScript API +menuTitle: '@arangodb/aql/queries' +weight: 20 +description: >- + The query module provides the infrastructure for working with currently + running AQL queries via arangosh +--- +`const queries = require('@arangodb/aql/queries')` + +## Properties + +`queries.properties()` Returns the servers current query tracking configuration; we change the slow query threshold to get better results: + +```js +--- +name: QUERY_01_propertyOfQueries +description: '' +--- +var queries = require("@arangodb/aql/queries"); +queries.properties(); +queries.properties({slowQueryThreshold: 1}); +queries.properties({slowStreamingQueryThreshold: 1}); +``` + +## Currently running queries + +We [create a task](tasks.md) that spawns queries, so we have nice output. Since this task +uses resources, you may want to increase `period` (and not forget to remove it... afterwards): + +```js +--- +name: QUERY_02_listQueries +description: '' +--- +~var queries = require("@arangodb/aql/queries"); +var theQuery = 'FOR sleepLoooong IN 1..5 LET sleepLoooonger = SLEEP(1000) RETURN sleepLoooong'; +var tasks = require("@arangodb/tasks"); +tasks.register({ + id: "mytask-1", + name: "this is a sample task to spawn a slow aql query", + command: "require('@arangodb').db._query('" + theQuery + "');" +}); +~while (true) { +~ require("internal").wait(1); +~ if (queries.current().filter(function(query) { +~ return query.query === theQuery; +~ }).length > 0) { +~ break; +~ } +~} +queries.current(); +``` + +## Slow queries + +The function returns the last AQL queries that exceeded the slow query threshold as an array: + +```js +--- +name: QUERY_03_listSlowQueries +description: '' +--- +~var queries = require("@arangodb/aql/queries"); +queries.slow(); +``` + +## Clear slow queries + +Clear the list of slow AQL queries: + +```js +--- +name: QUERY_04_clearSlowQueries +description: '' +--- +~var queries = require("@arangodb/aql/queries"); +queries.clearSlow(); +queries.slow(); +``` + +## Kill + +Kill a running AQL query: + +```js +--- +name: QUERY_05_killQueries +description: '' +--- +~var queries = require("@arangodb/aql/queries"); +~var tasks = require("@arangodb/tasks"); +~var theQuery = 'FOR sleepLoooong IN 1..5 LET sleepLoooonger = SLEEP(1000) RETURN sleepLoooong'; +var runningQueries = queries.current().filter(function(query) { + return query.query === theQuery; +}); +queries.kill(runningQueries[0].id); +``` diff --git a/site/content/arangodb/oem/develop/javascript-api/console.md b/site/content/arangodb/oem/develop/javascript-api/console.md new file mode 100644 index 0000000000..dc04ee0443 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/console.md @@ -0,0 +1,172 @@ +--- +title: The `console` module of the JavaScript API +menuTitle: console +weight: 40 +description: >- + An implementation of the CommonJS console interface in the ArangoDB JavaScript API +--- +`global.console === require('console')` + +**Note**: You don't need to load this module directly. The `console` object is +globally defined throughout ArangoDB and provides access to all functions in +this module. + +## Format Strings + +The following format specifiers can be used in format strings, which are +accepted by various console methods (look for the `format` parameter below): + +- `%s`: string +- `%d`, `%i`: integer number +- `%f`: floating point number +- `%o`: object (circular references marked with `~`) +- `%%`: literal percent sign `%` + +Example: + +```js +console.log('%s = %i%%', 'value', 20.5) // 'value = 20%' +``` + +## console.assert + +`console.assert(expression, [format,] argument1, ...)` + +Tests that an expression is *true*. If not, logs a message and throws +an exception. + +*Examples* + +```js +console.assert(value === "abc", "expected: value === abc, actual:", value); +``` + +## console.debug + +`console.debug([format,] argument1, ...)` + +Formats the arguments according to *format* and logs the result as +debug message. Note that debug messages will only be logged if the +server is started with log levels *debug* or *trace*. + +*Examples* + +```js +console.debug("%s", "this is a test"); +``` + +## console.dir + +`console.dir(object)` + +Logs a listing of all properties of the object. + +Example usage: + +```js +console.dir(myObject); +``` + +## console.error + +`console.error([format,] argument1, ...)` + +Formats the arguments according to *format* and logs the result as error message. + +Example usage: + +```js +console.error("error '%s': %s", type, message); +``` + +## console.getline + +`console.getline()` + +Reads in a line from the console and returns it as string. + +## console.group + +`console.group([format,] argument1, ...)` + +Formats the arguments according to *format* and logs the result as +log message. Opens a nested block to indent all future messages +sent. Call *groupEnd* to close the block. Representation of block +is up to the platform, it can be an interactive block or just a set of +indented sub messages. + +Example usage: + +```js +console.group("user attributes"); +console.log("name", user.name); +console.log("id", user.id); +console.groupEnd(); +``` + +## console.groupCollapsed + +`console.groupCollapsed([format,] argument1, ...)` + +Same as *console.group*. + +## console.groupEnd + +`console.groupEnd()` + +Closes the most recently opened block created by a call to *group*. + +## console.info + +`console.info([format,] argument1, ...)` + +Formats the arguments according to *format* and logs the result as +info message. + +Example usage: + +```js +console.info("The %s jumped over %d fences", animal, count); +``` + +## console.log + +`console.log([format,] argument1, ...)` + +Formats the arguments according to *format* and logs the result as +log message. This is an alias for [console.info()](#consoleinfo). + +## console.time + +`console.time(name)` + +Creates a new timer under the given name. Call *timeEnd* with the +same name to stop the timer and log the time elapsed. + +Example usage: + +```js +console.time("mytimer"); +... +console.timeEnd("mytimer"); // this will print the elapsed time +``` + +## console.timeEnd + +`console.timeEnd(name)` + +Stops a timer created by a call to *time* and logs the time elapsed. + +## console.trace + +`console.trace()` + +Logs a stack trace of JavaScript execution at the point where it is +called. + +## console.warn + +`console.warn([format,] argument1, ...)` + +Formats the arguments according to *format* and logs the result as +warning message. diff --git a/site/content/arangodb/oem/develop/javascript-api/crypto.md b/site/content/arangodb/oem/develop/javascript-api/crypto.md new file mode 100644 index 0000000000..af6272b703 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/crypto.md @@ -0,0 +1,352 @@ +--- +title: The `@arangodb/crypto` module of the JavaScript API +menuTitle: '@arangodb/crypto' +weight: 25 +description: >- + The crypto module provides implementations of various hashing algorithms as + well as functions related to cryptography +--- +`const crypto = require('@arangodb/crypto')` + +## Nonces + +These functions deal with +[cryptographic nonces](https://en.wikipedia.org/wiki/Cryptographic_nonce). + +For single server use only. + +### createNonce + +`crypto.createNonce(): string` + +Creates a cryptographic nonce consisting of the first 32 bits of a timestamp +and 64 bit of randomness. + +The nonce is held in memory for approximately one hour by the server. + +Returns the created nonce as base64-encoded string. + +### checkAndMarkNonce + +`crypto.checkAndMarkNonce(nonce): void` + +Checks if the nonce is valid and marks it as used. + +**Arguments** + +- **nonce**: `string` + + The nonce to check and mark. + +Returns `true` if the supplied nonce was issued by the server and not marked +before, otherwise `false`. + +## Random values + +The following functions deal with generating random values. + +### rand + +`crypto.rand(): number` + +Generates a random integer that may be positive, negative or even zero. + +Returns the generated number. + +### genRandomAlphaNumbers + +`crypto.genRandomAlphaNumbers(length): string` + +Generates a string of random alphabetical characters and digits. + +**Arguments** + +- **length**: `number` + + The length of the string to generate. + +Returns the generated string. + +### genRandomNumbers + +`crypto.genRandomNumbers(length): string` + +Generates a string of random digits. + +**Arguments** + +- **length**: `number` + + The length of the string to generate. + +Returns the generated string. + +### genRandomSalt + +`crypto.genRandomSalt(length): string` + +Generates a string of random (printable) ASCII characters. + +**Arguments** + +- **length**: `number` + + The length of the string to generate. + +Returns the generated string. + +### genRandomBytes + +`crypto.genRandomBytes(length): Buffer` + +Generates a buffer of random bytes. + +**Arguments** + +- **length**: `number` + + The length of the buffer to generate. + +Returns the generated buffer. + +### uuidv4 + +`crypto.uuidv4(): string` + +Generates a random UUID v4 string. + +Returns the generated UUID string. + +## JSON Web Tokens (JWT) + +These methods implement the JSON Web Token standard. + +### jwtEncode + +`crypto.jwtEncode(key, message, algorithm): string` + +Generates a JSON Web Token for the given message. + +**Arguments** + +- **key**: `string | null` + + The secret cryptographic key to be used to sign the message using the given algorithm. + Note that this function will raise an error if the key is omitted but the algorithm expects a key, + and also if the algorithm does not expect a key but a key is provided (e.g. when using `"none"`). + +- **message**: `string` + + Message to be encoded as JWT. Note that the message will only be base64-encoded and signed, not encrypted. + Do not store sensitive information in tokens unless they will only be handled by trusted parties. + +- **algorithm**: `string` + + Name of the algorithm to use for signing the message, e.g. `"HS512"`. + +Returns the JSON Web Token. + +### jwtDecode + +`crypto.jwtDecode(key, token, noVerify): string | null` + +**Arguments** + +- **key**: `string | null` + + The secret cryptographic key that was used to sign the message using the algorithm indicated by the token. + Note that this function will raise an error if the key is omitted but the algorithm expects a key. + + If the algorithm does not expect a key but a key is provided, the token will fail to verify. + +- **token**: `string` + + The token to decode. + + Note that the function will raise an error if the token is malformed (e.g. does not have exactly three segments). + +- **noVerify**: `boolean` (Default: `false`) + + Whether verification should be skipped. If this is set to `true` the signature of the token will not be verified. + Otherwise the function will raise an error if the signature cannot be verified using the given key. + +Returns the decoded JSON message or `null` if no token is provided. + +### jwtAlgorithms + +A helper object containing the supported JWT algorithms. Each attribute name corresponds to a JWT `alg` and the value is an object with `sign` and `verify` methods. + +### jwtCanonicalAlgorithmName + +`crypto.jwtCanonicalAlgorithmName(name): string` + +A helper function that translates a JWT `alg` value found in a JWT header into the canonical name of the algorithm in `jwtAlgorithms`. Raises an error if no algorithm with a matching name is found. + +**Arguments** + +- **name**: `string` + + Algorithm name to look up. + +Returns the canonical name for the algorithm. + +## Hashing algorithms + +### md5 + +`crypto.md5(message): string` + +Hashes the given message using the MD5 algorithm. + +**Arguments** + +- **message**: `string` + + The message to hash. + +Returns the cryptographic hash. + +### sha1 + +`crypto.sha1(message): string` + +Hashes the given message using the SHA-1 algorithm. + +**Arguments** + +- **message**: `string` + + The message to hash. + +Returns the cryptographic hash. + +### sha224 + +`crypto.sha224(message): string` + +Hashes the given message using the SHA-224 algorithm. + +**Arguments** + +- **message**: `string` + + The message to hash. + +Returns the cryptographic hash. + +### sha256 + +`crypto.sha256(message): string` + +Hashes the given message using the SHA-256 algorithm. + +**Arguments** + +- **message**: `string` + + The message to hash. + +Returns the cryptographic hash. + +### sha384 + +`crypto.sha384(message): string` + +Hashes the given message using the SHA-384 algorithm. + +**Arguments** + +- **message**: `string` + + The message to hash. + +Returns the cryptographic hash. + +### sha512 + +`crypto.sha512(message): string` + +Hashes the given message using the SHA-512 algorithm. + +**Arguments** + +- **message**: `string` + + The message to hash. + +Returns the cryptographic hash. + +## Miscellaneous + +### constantEquals + +`crypto.constantEquals(str1, str2): boolean` + +Compares two strings. +This function iterates over the entire length of both strings +and can help making certain timing attacks harder. + +**Arguments** + +- **str1**: `string` + + The first string to compare. + +- **str2**: `string` + + The second string to compare. + +Returns `true` if the strings are equal, `false` otherwise. + +### pbkdf2 + +`crypto.pbkdf2(salt, password, iterations, keyLength): string` + +Generates a PBKDF2-HMAC-SHA1 hash of the given password. + +**Arguments** + +- **salt**: `string` + + The cryptographic salt to hash the password with. + +- **password**: `string` + + The message or password to hash. + +- **iterations**: `number` + + The number of iterations. + This should be a very high number. + OWASP recommended 64000 iterations in 2012 and recommends doubling that number every two years. + + When using PBKDF2 for password hashes it is also recommended to add a random value + (typically between 0 and 32000) to that number that is different for each user. + +- **keyLength**: `number` + + The key length. + +Returns the cryptographic hash. + +### hmac + +`crypto.hmac(key, message, algorithm): string` + +Generates an HMAC hash of the given message. + +**Arguments** + +- **key**: `string` + + The cryptographic key to use to hash the message. + +- **message**: `string` + + The message to hash. + +- **algorithm**: `string` + + The name of the algorithm to use. + +Returns the cryptographic hash. diff --git a/site/content/arangodb/oem/develop/javascript-api/fs.md b/site/content/arangodb/oem/develop/javascript-api/fs.md new file mode 100644 index 0000000000..9e08512955 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/fs.md @@ -0,0 +1,296 @@ +--- +title: The `fs` module of the JavaScript API +menuTitle: fs +weight: 45 +description: >- + An implementation of the CommonJS Filesystem interface in the ArangoDB JavaScript API +--- +`const fs = require('fs')` + +The implementation tries to follow the CommonJS +[Filesystem/A/0](http://wiki.commonjs.org/wiki/Filesystem/A/0) +specification where possible. + +## Working Directory + +The directory functions below shouldn't use the current working directory of the server like `.` or `./test`. +You will not be able to tell whether the environment the server is running in will permit directory listing, +reading or writing of files. + +You should either base your directories with `getTempPath()`, or as a Foxx service use the +[module.context.basePath](../foxx-microservices/reference/service-context.md). + +## Single File Directory Manipulation + +### exists + +checks if a file of any type or directory exists +`fs.exists(path)` + +Returns true if a file (of any type) or a directory exists at a given +path. If the file is a broken symbolic link, returns false. + +### isFile + +tests if path is a file +`fs.isFile(path)` + +Returns true if the *path* points to a file. + +### isDirectory + +tests if path is a directory +`fs.isDirectory(path)` + +Returns true if the *path* points to a directory. + +### size + +gets the size of a file +`fs.size(path)` + +Returns the size of the file specified by *path*. + +### mtime + +gets the last modification time of a file +`fs.mtime(filename)` + +Returns the last modification date of the specified file. The date is +returned as a Unix timestamp (number of seconds elapsed since January 1 1970). + +### pathSeparator +`fs.pathSeparator` + +If you want to combine two paths you can use fs.pathSeparator instead of `/` or `\\`. + +### join +`fs.join(path, filename)` + +The function returns the combination of the path and filename, e.g. +`fs.join('folder', 'file.ext')` would return `folder/file.ext`. + +### getTempFile + +returns the name for a (new) temporary file +`fs.getTempFile(directory, createFile)` + +Returns the name for a new temporary file in directory *directory*. +If *createFile* is *true*, an empty file will be created so no other +process can create a file of the same name. + +**Note**: The directory *directory* must exist. + +### getTempPath + +returns the temporary directory +`fs.getTempPath()` + +Returns the absolute path of the temporary directory + +### makeAbsolute + +makes a given path absolute +`fs.makeAbsolute(path)` + +Returns the given string if it is an absolute path, otherwise an +absolute path to the same location is returned. + +### chmod + +sets file permissions of specified files (non windows only) +`fs.chmod(path, mode)` + +where `mode` is a string with a leading zero matching the `OCTAL-MODE` as explained +in *nix `man chmod`. + +Returns true on success. + +### list + +returns the directory listing +`fs.list(path)` + +The functions returns the names of all the files in a directory, in +lexically sorted order. Throws an exception if the directory cannot be +traversed (or path is not a directory). + +**Note**: this means that list("x") of a directory containing "a" and "b" would +return ["a", "b"], not ["x/a", "x/b"]. + +### listTree + +returns the directory tree +`fs.listTree(path)` + +The function returns an array that starts with the given path, and all of +the paths relative to the given path, discovered by a depth first traversal +of every directory in any visited directory, reporting but not traversing +symbolic links to directories. The first path is always `""`, the path +relative to itself. + +### makeDirectory + +creates a directory +`fs.makeDirectory(path)` + +Creates the directory specified by *path*. + +### makeDirectoryRecursive + +creates a directory +`fs.makeDirectoryRecursive(path)` + +Creates the directory hierarchy specified by *path*. + +### remove + +removes a file +`fs.remove(filename)` + +Removes the file *filename* at the given path. Throws an exception if the +path corresponds to anything that is not a file or a symbolic link. If +"path" refers to a symbolic link, removes the symbolic link. + +### removeDirectory + +removes an empty directory +`fs.removeDirectory(path)` + +Removes a directory if it is empty. Throws an exception if the path is not +an empty directory. + +### removeDirectoryRecursive + +removes a directory +`fs.removeDirectoryRecursive(path)` + +Removes a directory with all subelements. Throws an exception if the path +is not a directory. + +## File IO + +### read + +reads in a file +`fs.read(filename)` + +Reads in a file and returns the content as string. Please note that the +file content must be encoded in UTF-8. + +### read64 + +reads in a file as base64 +`fs.read64(filename)` + +Reads in a file and returns the content as string. The file content is +Base64 encoded. + +### readBuffer + +reads in a file +`fs.readBuffer(filename)` + +Reads in a file and returns its content in a Buffer object. + +### readFileSync + +`fs.readFileSync(filename, encoding)` + +Reads the contents of the file specified in `filename`. If `encoding` is specified, +the file contents will be returned as a string. Supported encodings are: +- `utf8` or `utf-8` +- `ascii` +- `base64` +- `ucs2` or `ucs-2` +- `utf16le` or `utf16be` +- `hex` + +If no `encoding` is specified, the file contents will be returned in a Buffer +object. + +### write +`fs.write(filename, content)` + +Writes the content into a file. Content can be a string or a Buffer +object. If the file already exists, it is truncated. + +### writeFileSync + +`fs.writeFileSync(filename, content)` + +This is an alias for `fs.write(filename, content)`. + +### append + +`fs.append(filename, content)` + +Writes the content into a file. Content can be a string or a Buffer +object. If the file already exists, the content is appended at the +end. + +## Recursive Manipulation + +### copyRecursive + +copies a directory structure +`fs.copyRecursive(source, destination)` + +Copies *source* to *destination*. +Exceptions will be thrown on: + - Failure to copy the file + - specifying a directory for destination when source is a file + - specifying a directory as source and destination + +### CopyFile + +copies a file into a target file +`fs.copyFile(source, destination)` + +Copies *source* to destination. If Destination is a directory, a file +of the same name will be created in that directory, else the copy will get +the specified filename. + +### linkFile + +creates a symbolic link from a target in the place of linkpath. +`fs.linkFile(target, linkpath)` + +In `linkpath` a symbolic link to `target` will be created. + +### move + +renames a file +`fs.move(source, destination)` + +Moves *source* to destination. Failure to move the file, or +specifying a directory for destination when source is a file will throw an +exception. Likewise, specifying a directory as source and destination will +fail. + +## ZIP + +### unzipFile + +unzips a file +`fs.unzipFile(filename, outpath, skipPaths, overwrite, password)` + +Unzips the zip file specified by *filename* into the path specified by +*outpath*. Overwrites any existing target files if *overwrite* is set +to *true*. + +Returns *true* if the file was unzipped successfully. + +### zipFile + +zips a file +`fs.zipFile(filename, chdir, files, password)` + +Stores the files specified by *files* in the zip file *filename*. If +the file *filename* already exists, an error is thrown. The list of input +files *files* must be given as a list of absolute filenames. If *chdir* is +not empty, the *chdir* prefix will be stripped from the filename in the +zip file, so when it is unzipped filenames will be relative. +Specifying a password is optional. + +Returns *true* if the file was zipped successfully. diff --git a/site/content/arangodb/oem/develop/javascript-api/request.md b/site/content/arangodb/oem/develop/javascript-api/request.md new file mode 100644 index 0000000000..53f7162a11 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/request.md @@ -0,0 +1,184 @@ +--- +title: The `@arangodb/request` module of the JavaScript API +menuTitle: '@arangodb/request' +weight: 30 +description: >- + The request module provides the functionality for making HTTP requests +--- +`const request = require('@arangodb/request')` + +## Making HTTP requests + +### HTTP method helpers + +In addition to the `request` function convenience shorthands are available for each HTTP method in the form of, i.e.: + +- `request.head(url, options)` +- `request.get(url, options)` +- `request.post(url, options)` +- `request.put(url, options)` +- `request.delete(url, options)` +- `request.patch(url, options)` + +These are equivalent to using the `request` function directly, i.e.: + +```js +request[method](url, options) +// is equivalent to +request({method, url, ...options}); +``` + +For example: + +```js +const request = require('@arangodb/request'); + +request.get('http://localhost', {headers: {'x-session-id': 'keyboardcat'}}); +// is equivalent to +request({ + method: 'get', + url: 'http://localhost', + headers: {'x-session-id': 'keyboardcat'} +}); +``` + +### The request function + +The request function can be used to make HTTP requests. + +`request(options)` + +Performs an HTTP request and returns a *Response* object. + +*Parameter* + +The request function takes the following options: + +- `url` or `uri`: the fully-qualified URL or a parsed URL from `url.parse`. +- `qs` (optional): object containing querystring values to be appended to the URL. +- `useQuerystring` (optional): if `true`, use `querystring` module to handle querystrings, otherwise use `qs` module. Default: `false`. +- `method` (optional): HTTP method (case-insensitive). Default: `"GET"`. +- `headers` (optional): HTTP headers (case-insensitive). Default: `{}`. +- `body` (optional): request body. Must be a string or `Buffer`, or a JSON serializable value if `json` is `true`. +- `json` (optional): if `true`, `body` will be serialized to a JSON string and the `Content-Type` header will be set to `"application/json"`. Additionally the response body will also be parsed as JSON (unless `encoding` is set to `null`). Default: `false`. +- `form` (optional): when set to a string or object and no `body` has been set, `body` will be set to a querystring representation of that value and the `Content-Type` header will be set to `"application/x-www-form-urlencoded"`. Also see `useQuerystring`. +- `auth` (optional): an object with the properties `username` and `password` for HTTP Basic authentication or the property `bearer` for HTTP Bearer token authentication. +- `sslProtocol` (optional): which tls version should be used to connect to the url. The default is `4` which is TLS 1.0. See [SSL protocol](../../components/arangodb-server/options.md#--sslprotocol) for more options. +- `verifyCertificates` (optional, introduced in v3.11.11): if set to `true`, the server certificate of the remote server is verified using the default certificate store of the system. Default: `false`. +- `verifyDepth` (optional, introduced in v3.11.11): limit the maximum length of the certificate chain that counts as valid. Default: `10`. +- `followRedirect` (optional): whether HTTP 3xx redirects should be followed. Default: `true`. +- `maxRedirects` (optional): the maximum number of redirects to follow. Default: `10`. +- `encoding` (optional): encoding to be used for the response body. If set to `null`, the response body will be returned as a `Buffer`. Default: `"utf-8"`. +- `timeout` (optional): number of seconds to wait for a response before aborting the request. +- `returnBodyOnError` (optional): whether the response body should be returned even when the server response indicates an error. Default: `true`. + +The function returns a *Response* object with the following properties: + +- `rawBody`: the raw response body as a `Buffer`. +- `body`: the parsed response body. If `encoding` was not set to `null`, this is a string. If additionally `json` was set to `true` and the response body is well-formed JSON, this is the parsed JSON data. +- `headers`: an object containing the response headers. Otherwise this is identical to `rawBody`. +- `statusCode` and `status`: the HTTP status code of the response, e.g. `404`. +- `message`: the HTTP status message of the response, e.g. `Not Found`. + +#### Forms + +The request module supports `application/x-www-form-urlencoded` (URL encoded) form uploads: + +```js +const request = require('@arangodb/request'); + +var res = request.post('http://service.example/upload', {form: {key: 'value'}}); +// or +var res = request.post({url: 'http://service.example/upload', form: {key: 'value'}}); +// or +var res = request({ + method: 'post', + url: 'http://service.example/upload', + form: {key: 'value'} +}); +``` + +Form data will be encoded using the [qs](https://www.npmjs.com/package/qs) module by default. + +If you want to use the [querystring](http://nodejs.org/api/querystring.html) module instead, simply use the `useQuerystring` option. + +#### JSON + +If you want to submit JSON-serializable values as request bodies, just set the `json` option: + +```js +const request = require('@arangodb/request'); + +var res = request.post('http://service.example/notify', {body: {key: 'value'}, json: true}); +// or +var res = request.post({url: 'http://service.example/notify', body: {key: 'value'}, json: true}); +// or +var res = request({ + method: 'post', + url: 'http://service.example/notify', + body: {key: 'value'}, + json: true +}); +``` + +#### HTTP authentication + +The request module supports both *HTTP Basic* authentication. Just pass the credentials via the `auth` option: + +```js +const request = require('@arangodb/request'); + +var res = request.get( + 'http://service.example/secret', + {auth: {username: 'jcd', password: 'bionicman'}} +); +// or +var res = request.get({ + url: 'http://service.example/secret', + auth: {username: 'jcd', password: 'bionicman'} +}); +// or +var res = request({ + method: 'get', + url: 'http://service.example/secret', + auth: {username: 'jcd', password: 'bionicman'} +}); +``` + +Alternatively you can supply the credentials via the URL: + +```js +const request = require('@arangodb/request'); + +var username = 'jcd'; +var password = 'bionicman'; +var res = request.get( + 'http://' + + encodeURIComponent(username) + + ':' + + encodeURIComponent(password) + + '@service.example/secret' +); +``` + +You can also use *Bearer* token authentication: + +```js +const request = require('@arangodb/request'); + +var res = request.get( + 'http://service.example/secret', + {auth: {bearer: 'keyboardcat'}} +); +// or +var res = request.get({ + url: 'http://service.example/secret', + auth: {bearer: 'keyboardcat'} +}); +// or +var res = request({ + method: 'get', + url: 'http://service.example/secret', + auth: {bearer: 'keyboardcat'} +}); +``` diff --git a/site/content/arangodb/oem/develop/javascript-api/tasks.md b/site/content/arangodb/oem/develop/javascript-api/tasks.md new file mode 100644 index 0000000000..7240ed6586 --- /dev/null +++ b/site/content/arangodb/oem/develop/javascript-api/tasks.md @@ -0,0 +1,177 @@ +--- +title: The `@arangodb/tasks` module of the JavaScript API +menuTitle: '@arangodb/tasks' +weight: 35 +description: >- + The tasks module provides an interface for managing scheduled and periodic + execution of JavaScript code on the server side +--- +`const tasks = require('@arangodb/tasks')` + +**Note**: If you are trying to schedule tasks in Foxx you should +consider using the [Foxx queues module](../foxx-microservices/guides/scripts-and-scheduling.md#queues) instead, +which provides a more high-level API that also persists tasks across reboots. + +## Introduction to Task Management in ArangoDB + +ArangoDB can execute user-defined JavaScript functions as one-shot +or periodic tasks. This functionality can be used to implement timed +or recurring jobs in the database. + +Tasks in ArangoDB consist of a JavaScript snippet or function that is +executed when the task is scheduled. A task can be a one-shot task +(meaning it is run once and not repeated) or a periodic task (meaning +that it is re-scheduled after each execution). Tasks can have optional +parameters, which are defined at task setup time. The parameters +specified at task setup time will be passed as arguments to the +task whenever it gets executed. Periodic Tasks have an execution +frequency that needs to be specified when the task is set up. One-shot +tasks have a configurable delay after which they'll get executed. + +Tasks will be executed on the server they have been set up on. +Tasks will not be shipped around in a cluster. A task will be +executed in the context of the database it was created in. However, +when dropping a database, any tasks that were created in the context +of this database will remain active. It is therefore sensible to +first unregister all active tasks for a database before dropping the +database. + +Tasks registered in ArangoDB will be executed until the server +gets shut down or restarted. After a restart of the server, any +user-defined one-shot or periodic tasks will be lost. + +## Commands for Working with Tasks + +ArangoDB provides the following commands for working with tasks. +All commands can be accessed via the *tasks* module, which can be +loaded like this: + +`require("@arangodb/tasks")` + +Please note that the *tasks* module is available inside the ArangoDB +server only. It cannot be used from the ArangoShell or ArangoDB's web +interface. + +## Register a task + +To register a task, the JavaScript snippet or function needs to be +specified in addition to the execution frequency. Optionally, a task +can have an id and a name. If no id is specified, it will be auto-assigned +for a new task. The task id is also the means to access or unregister a +task later. Task names are informational only. They can be used to make +a task distinguishable from other tasks also running on the server. + +The following server-side commands register a task. The command to be +executed is a JavaScript string snippet which prints a message to the +server's logfile: + +```js +const tasks = require("@arangodb/tasks"); + +tasks.register({ + id: "mytask-1", + name: "this is a snippet task", + period: 15, + command: "require('console').log('hello from snippet task');" +}); +``` + +The above has register a task with id *mytask-1*, which will be executed +every 15 seconds on the server. The task will write a log message whenever +it is invoked. + +Tasks can also be set up using a JavaScript callback function like this: + +```js +const tasks = require("@arangodb/tasks"); + +tasks.register({ + id: "mytask-2", + name: "this is a function task", + period: 15, + command: function () { + require('console').log('hello from function task'); + } +}); +``` + +It is important to note that the callback function is late bound and +will be executed in a different context than in the creation context. +The callback function must therefore not access any variables defined +outside of its own scope. The callback function can still define and +use its own variables. + +To pass parameters to a task, the *params* attribute can be set when +registering a task. Note that the parameters are limited to data types +usable in JSON (meaning no callback functions can be passed as parameters +into a task): + +```js +const tasks = require("@arangodb/tasks"); + +tasks.register({ + id: "mytask-3", + name: "this is a parameter task", + period: 15, + command: function (params) { + var greeting = params.greeting; + var data = JSON.stringify(params.data); + require('console').log('%s from parameter task: %s', greeting, data); + }, + params: { greeting: "hi", data: "how are you?" } +}); +``` + +Registering a one-shot task works the same way, except that the +*period* attribute must be omitted. If *period* is omitted, then the +task will be executed just once. The task invocation delay can optionally +be specified with the *offset* attribute: + +```js +const tasks = require("@arangodb/tasks"); + +tasks.register({ + id: "mytask-once", + name: "this is a one-shot task", + offset: 10, + command: function (params) { + require('console').log('you will see me just once!'); + } +}); +``` + +**Note**: When specifying an *offset* value of 0, ArangoDB will internally add +a very small value to the offset so will be slightly greater than zero. + +## Unregister a task + +After a task has been registered, it can be unregistered using its id: + +```js +const tasks = require("@arangodb/tasks"); +tasks.unregister("mytask-1"); +``` + +Note that unregistering a non-existing task will throw an exception. + +## List all tasks + +To get an overview of which tasks are registered, there is the *get* +method. If the *get* method is called without any arguments, it will +return an array of all tasks: + +```js +const tasks = require("@arangodb/tasks"); +tasks.get(); +``` + +If *get* is called with a task id argument, it will return information +about this particular task: + +```js +const tasks = require("@arangodb/tasks"); +tasks.get("mytask-3"); +``` + +The *created* attribute of a task reveals when a task was created. It is +returned as a Unix timestamp. diff --git a/site/content/arangodb/oem/develop/operational-factors.md b/site/content/arangodb/oem/develop/operational-factors.md new file mode 100644 index 0000000000..b51bd8a9fb --- /dev/null +++ b/site/content/arangodb/oem/develop/operational-factors.md @@ -0,0 +1,361 @@ +--- +title: Data Modeling and Operational Factors +menuTitle: Operational Factors +weight: 245 +description: >- + Designing the data model of your application is a crucial task that can make + or break the performance of your application +--- +A well-designed data model allows you to write efficient AQL queries, increase +throughput of CRUD operations, and makes sure your data is distributed in the +most effective way. + +Whether you design a new application with ArangoDB or port an existing one to +use ArangoDB, you should always analyze the (expected) data access patterns of +your application in conjunction with several factors: + +## Operation Atomicity + +All insert / update / replace / remove operations in ArangoDB are +atomic on a single document, in the sense that any read operation +either observes a single document write in its entirety or not at all, +regardless of whether it is a read in the same transaction, a different +transaction, or indeed another write operation implicitly reading the +document (like update). This is true for all deployment modes including cluster. + +When using a single instance of ArangoDB or a OneShard database +in a cluster, we can make additional guarantees: Multi-document / +multi-collection queries are guaranteed to be fully atomic, in the +sense that one transaction observes any other transaction either in its +entirety, or not at all. In general, this is not guaranteed for cluster +deployments in case of failovers. + +## Transactional Isolation + +In the single instance case and in the OneShard database case, ArangoDB uses +RocksDB's +[snapshot isolation](https://jepsen.io/consistency/models/snapshot-isolation) +for reads and uses RocksDB key-level pessimistic locking for write-write-conflict +detection. Therefore, in these cases, the isolation level ArangoDB +guarantees for transactions is +"[repeatable read](https://jepsen.io/consistency/models/repeatable-read)" +in the following sense: the reads of a transaction see a snapshot +of the state of the database, that is, a transaction T does not see +"dirty reads", which are writes from other transactions which have not +yet committed. Furthermore, a transaction T does not see writes from +other transactions, which have started, after T was started, even if +they commit before the read of T happens. Finally, in the end, there is +a total order on the set of all transactions, so that the state of +the database is as if the *writes* of the transactions would have been +executed in this order. + +Note that this is strictly weaker than "serializable", since it is +possible that two concurrent transactions T1 and T2 both read the old +state from before both of them (including the documents T1 or T2 touch), +but then write to disjoint sets of keys. This allows for the possibility +of "phantom reads". + +Note that in a cluster without OneShard databases, these +isolation guarantees are not given. + +### Denormalizing Data + +In traditional _SQL_ databases it is considered a good practice to normalize +all your data across multiple tables to avoid duplicated data and ensure +consistency. + +ArangoDB is a schema-less _NoSQL_ multi-model database, so a good data model +is not necessarily normalized. On the contrary, to avoid extra joins it is +often an advantage to deliberately _denormalize_ your data model. + +To denormalize your data model you essentially combine all related entities +into a single document instead of spreading it over multiple documents and +collections. The advantage of this is that it allows you to atomically update +all of your connected data, the downside is that your documents become larger +(see below for more considerations on +[large documents](#document-and-transaction-sizes)). + +As a simple example, lets say you want to maintain the total amount of a +shopping basket (from an online shop) together with a list of all included +items and prices. The total balance of all items in the shopping basket should +stay in sync with the contained items, then you may put all contained items +inside the shopping basket document and only update them together: + +```json +{ + "_id": "basket/123", + "_key": "123", + "_rev": "_Xv0TA0O--_", + "user": "some_user", + "balance": "100", + "items": [ { "price": 10, "title": "Harry Potter and the Philosopher’s Stone" }, + { "price": 90, "title": "Vacuum XYZ" } ] +} +``` + +This allows you to avoid making lookups via the document keys in +multiple collections. + +### Ensuring Consistent Atomic Updates + +There are ways to ensure atomicity and consistency when performing updates in +your application. ArangoDB allows you to specify the revision ID (`_rev`) value +of the existing document you want to update. The update or replace operation is +only able to succeed if the values match. This way you can ensure that if your +application has read a document with a certain `_rev` value, the modifications +to it are only allowed to pass _if and only if_ the document was not changed by +someone else in the meantime. By specifying a document's previous revision ID +you can avoid losing updates on these documents without noticing it. + +You can specify the revision via the `_rev` field inside the document or via +the `If-Match: <revision>` HTTP header in the documents REST API. +In the _arangosh_ you can perform such an operation like this: + +```js +db.basketCollection.update({"_key": "123", "_rev": "_Xv0TA0O--_"}, data) +// or replace +db.basketCollection.replace({"_key": "123", "_rev": "_Xv0TA0O--_"}, data) +``` + +An AQL query with the same effect can be written by using the _ignoreRevs_ +option together with a modification operation. Either let ArangoDB compare +the `_rev` value and only succeed if they still match, or let ArangoDB +ignore them (default): + +```aql +FOR i IN 1..1000 + UPDATE { _key: CONCAT('test', i), _rev: "1287623" } + WITH { foobar: true } IN users + OPTIONS { ignoreRevs: false } +``` + +## Indexes + +Indexes can improve the performance of AQL queries drastically. Queries that +frequently filter on or one more fields can be made faster by creating an index +(in arangosh via the _ensureIndex_ command, the web interface or your specific +client driver). There is already an automatic (and non-deletable) primary index +in every collection on the `_key` and `_id` fields as well as the edge index +on `_from` and `_to` (for edge collections). + +Should you decide to create an index you should consider a few things: + +- Indexes are a trade-off between storage space, maintenance cost and query speed. +- Each new index increases the amount of RAM and the amount of disk space needed. +- Indexes with [indexed array values](../index-and-search/indexing/basics.md#indexing-array-values) + need an extra index entry per array entry +- Adding indexes increases the write-amplification i.e. it negatively affects + the write performance (how much depends on the storage engine) +- Each index needs to add at least one index entry per document. You can use + _sparse indexes_ to avoid adding _null_ index entries for rarely used attributes +- Sparse indexes can be smaller than non-sparse indexes, but they can only be + used if the optimizer determines that the _null_ value cannot be in the + result range, e.g. by an explicit `FILTER doc.attribute != null` in AQL + (also see [Type and value order](../aql/fundamentals/type-and-value-order.md)). +- Collections that are more frequently read benefit the most from added indexes, + provided the indexes can actually be utilized +- Indexes on collections with a high rate of inserts or updates compared to + reads may hurt overall performance. + +Generally it is best to design your indexes with your queries in mind. +Use the [query profiler](../aql/execution-and-performance/query-profiling.md) +to understand the bottlenecks in your queries. + +Always consider the additional space requirements of extra indexes when +planning server capacities. For more information on indexes see +[Index Basics](../index-and-search/indexing/basics.md). + +## Number of Databases and Collections + +Sometimes you can consider to split up data over multiple collections. +For example, one could create a new set of collections for each new customer +instead of having a customer field on each documents. Having a few thousand +collections has no significant performance penalty for most operations and +results in good performance. + +Grouping documents into collections by type (i.e. a session collection +'sessions_dev', 'sessions_prod') allows you to avoid an extra index on a _type_ +field. Similarly you may consider to +[split edge collections](../graphs/_index.md#multiple-edge-collections-vs-filters-on-edge-document-attributes) +instead of specifying the type of the connection inside the edge document. + +A few things to consider: +- Adding an extra collection always incurs a small amount of overhead for the + collection metadata and indexes. +- You cannot use more than _2048_ collections/shards per AQL query +- Uniqueness constraints on certain attributes (via an unique index) can only + be enforced by ArangoDB within one collection + +## Cluster Sharding + +The ArangoDB cluster _partitions_ your collections into one or more _shards_ +across multiple _DB-Servers_. This enables efficient _horizontal scaling_: +It allows you to store much more data, since ArangoDB distributes the data +automatically to the different servers. In many situations one can also reap +a benefit in data throughput, again because the load can be distributed to +multiple machines. + +ArangoDB uses the specified _shard keys_ to determine in which shard a given +document is stored. Choosing the right shard key can have significant impact on +your performance can reduce network traffic and increase performance. + +ArangoDB uses consistent hashing to compute the target shard from the given +values (as specified via 'shardKeys'). The ideal set of shard keys allows +ArangoDB to distribute documents evenly across your shards and your _DB-Servers_. +By default ArangoDB uses the `_key` field as a shard key. For a custom shard key +you should consider a few different properties: + +- **Cardinality**: The cardinality of a set is the number of distinct values + that it contains. A shard key with only _N_ distinct values cannot be hashed + onto more than _N_ shards. Consider using multiple shard keys, if one of your + values has a low cardinality. +- **Frequency**: Consider how often a given shard key value may appear in + your data. Having a lot of documents with identical shard keys leads + to unevenly distributed data. Consider using multiple shard keys or a different + one that is more suitable. + +The default sharding should randomly distribute your documents across your +cluster machines. This may be good enough for you, but depending on the kind +of AQL queries and other operations an application performs, it may leave +a lot of performance on the table. + +See [_Cluster Sharding_](../deploy/architecture/data-sharding.md) +for more information. + +### SmartGraphs + +SmartGraphs are an Enterprise Edition feature of ArangoDB. It enables you to +manage graphs at scale. It provides a vast performance benefit for all graphs +sharded in an ArangoDB Cluster. + +To add a SmartGraph you need a SmartGraph attribute that partitions your +graph into several smaller sub-graphs. Ideally these sub-graphs follow a +"natural" structure in your data. These subgraphs have a large amount of edges +that only connect vertices in the same subgraph and only have few edges +connecting vertices from other subgraphs. + +All the usual considerations for sharding keys also apply for smart attributes, +for more information see [SmartGraphs](../graphs/smartgraphs/_index.md) + +## Document and Transaction Sizes + +When designing your data-model you should keep in mind that the size of +documents affects the performance and storage requirements of your system. +Very large numbers of very small documents may have an unexpectedly big overhead: +Each document needs has a certain amount extra storage space, depending on the +storage engine and the indexes you added to the collection. The overhead may +become significant if your store a large amount of very small documents. + +Very large documents may reduce your write throughput: +This is due to the extra time needed to send larger documents over the +network as well as more copying work required inside the storage engine. + +Consider some ways to minimize the required amount of storage space: + +- Use the `_key` attribute to give documents unique identifiers. The `_key` + attribute is always present in every document (including edges), and it + is always indexed. This means it is the best-suited attribute to store a unique + document identifier. Using the `_key` attribute is preferable to storing + document identifiers in another attribute and creating a unique index on it. + Some limitations apply, see [Document keys](../concepts/data-structure/documents/_index.md#document-keys). +- Shorter field names reduce the amount of space needed to store documents. + ArangoDB is schema-free and needs to store the document structure inside of + each document. Usually, this is a small overhead compared to the overall + document size. The field name length has no effect on index sizes. +- Combining many small related documents into one larger one can also + reduce overhead. Common fields can be stored once and indexes just need to + store one entry. This is only beneficial if the combined documents are + regularly retrieved together and not just subsets of them. + +## Document Keys + +- Explicitly set the `_key` attribute to a custom unique value. + This enables you to store information in the `_key` attribute instead of another + attribute inside of the document. The `_key` attribute is always indexed, so it is + preferable to storing the document identifiers in another attribute and + creating an extra index on it. + +- Try to use short values for the `_key` attribute. + The `_key` values are used whenever a document is looked up by its primary + key, and shorter key values can improve the lookup performance and reduce the + disk usage. + + As the `_key` values are also used as foreign keys in the `_from` and `_to` attributes + of edges, the key length also matters for all graph operations. Again, shorter keys + can improve lookup performance here and reduce memory usage. + + When using hash values as document keys, try to avoid long hash values such as + generated by hash functions such as SHA256 (64 characters in the alphabet + `[0-9a-f]`) or SHA512 (128 bytes in the alphabet `[0-9a-f]`). Smaller keys are + always preferable for performance. + +- Try to avoid keys that are randomly distributed. + Keys that are randomly distributed are more expensive during larger insert + operations than keys that follow a mostly ascending sequential pattern, e.g. + `000001`, `000002`, and so on. The storage engine can process sequential keys + more efficiently on inserts than randomly distributed keys. + +## Storage Engine + +Large documents and transactions may negatively impact the write performance +of the RocksDB storage engine. + +- Consider a maximum size of 50-75 kB _per document_ as a good rule of thumb. + This allows you to maintain steady write throughput even under very high load. +- Transactions are held in-memory before they are committed. + This means that certain transactions have to be split if they become too big. + See [Known limitations for AQL queries](../aql/fundamentals/limitations.md#storage-engine-properties) + for details. + +### Improving Update Query Performance + +You may use the _exclusive_ query option for modifying AQL queries, to improve the performance drastically. +This has the downside that no concurrent writes may occur on the collection, but ArangoDB is able +to use a special fast-path which should improve the performance by up to 50% for large collections. + +```aql +FOR doc IN mycollection + UPDATE doc._key + WITH { foobar: true } IN mycollection + OPTIONS { exclusive: true } +``` + +The same naturally also applies for queries using _REPLACE_ or _INSERT_. Additionally you may be able to use +the `intermediateCommitCount` option in the API to subdivide the AQL transaction into smaller batches. + +### Read / Write Load Balance + +Depending on whether your data model has a higher read- or higher write-rate you may want +to adjust some of the RocksDB specific options. Some of the most critical options to +adjust the performance and memory usage are listed below: + +`--rocksdb.block-cache-size` + +This is the size of the block cache in bytes. This cache is used for read operations. +Increasing the size of this may improve the performance of read heavy workloads. +You may wish to adjust this parameter to control memory usage. + +`--rocksdb.write-buffer-size` + +Amount of data to build up in memory before converting to a file on disk. +Larger values increase performance, especially during bulk loads. + +`--rocksdb.max-write-buffer-number` + +Maximum number of write buffers that built up in memory, per internal column family. +The default and the minimum number is 2, so that when 1 write buffer +is being flushed to storage, new writes can continue to the other write buffer. + +`--rocksdb.total-write-buffer-size` + +The total amount of data to build up in all in-memory buffers when writing into ArangoDB. +You may wish to adjust this parameter to control memory usage. + +Setting this to a low value may limit the RAM that ArangoDB uses but may slow down +write heavy workloads. Setting this to `0` does not limit the size of the write-buffers. + +`--rocksdb.level0-stop-trigger` + +When this many files accumulate in level-0, writes are stopped to allow compaction to catch up. +Setting this value very high may improve write throughput, but may lead to temporarily +bad read performance. diff --git a/site/content/arangodb/oem/develop/satellitecollections.md b/site/content/arangodb/oem/develop/satellitecollections.md new file mode 100644 index 0000000000..9348ebf3f5 --- /dev/null +++ b/site/content/arangodb/oem/develop/satellitecollections.md @@ -0,0 +1,139 @@ +--- +title: SatelliteCollections +menuTitle: SatelliteCollections +weight: 250 +description: >- + Collections synchronously replicated to all servers to enable local joins +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +When doing joins in an ArangoDB cluster data has to be exchanged between different servers. + +Joins are executed on a Coordinator. It prepares an execution plan +and executes it. When executing, the Coordinator contacts all shards of the +starting point of the join and ask for their data. The DB-Servers carrying +out this operation loads all its local data and then ask the cluster for +the other part of the join. Again, this is distributed to all involved shards +of this join part. + +In sum this results in much network traffic and slow results depending of the +amount of data that has to be sent throughout the cluster. + +SatelliteCollections are collections that are intended to address this issue. +They facilitate the synchronous replication and replicate all their data +to all DB-Servers that are part of the cluster. + +This enables the DB-Servers to execute that part of any join locally. + +This greatly improves performance for such joins at the costs of increased +storage requirements and poorer write performance on this data. + +To create a SatelliteCollection set the `replicationFactor` of this collection +to "satellite". + +Using arangosh: + +```js +db._create("satellite", {"replicationFactor": "satellite"}); +``` + +## A full example + +```js +arangosh> var explain = require("@arangodb/aql/explainer").explain +arangosh> db._create("satellite", {"replicationFactor": "satellite"}) +arangosh> db._create("nonsatellite", {numberOfShards: 8}) +arangosh> db._create("nonsatellite2", {numberOfShards: 8}) +``` + +Let's analyze a normal join not involving SatelliteCollections: + +```js +arangosh> explain("FOR doc in nonsatellite FOR doc2 in nonsatellite2 RETURN 1") + +Query string: + FOR doc in nonsatellite FOR doc2 in nonsatellite2 RETURN 1 + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 4 CalculationNode DBS 1 - LET #2 = 1 /* json expression */ /* const assignment */ + 2 EnumerateCollectionNode DBS 0 - FOR doc IN nonsatellite /* full collection scan */ + 12 RemoteNode COOR 0 - REMOTE + 13 GatherNode COOR 0 - GATHER + 6 ScatterNode COOR 0 - SCATTER + 7 RemoteNode DBS 0 - REMOTE + 3 EnumerateCollectionNode DBS 0 - FOR doc2 IN nonsatellite2 /* full collection scan */ + 8 RemoteNode COOR 0 - REMOTE + 9 GatherNode COOR 0 - GATHER + 5 ReturnNode COOR 0 - RETURN #2 + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 move-calculations-up + 2 scatter-in-cluster + 3 remove-unnecessary-remote-scatter +``` + +All shards involved querying the `nonsatellite` collection fan out via the +Coordinator to the shards of `nonsatellite`. In sum, 8 shards open 8 connections +to the Coordinator, asking for the results of the `nonsatellite2` join. The Coordinator +fans out to the 8 shards of `nonsatellite2`. So there us quite some +network traffic. + +Let's now have a look at the same using SatelliteCollections: + +```js +arangosh> db._query("FOR doc in nonsatellite FOR doc2 in satellite RETURN 1") + +Query string: + FOR doc in nonsatellite FOR doc2 in satellite RETURN 1 + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 4 CalculationNode DBS 1 - LET #2 = 1 /* json expression */ /* const assignment */ + 2 EnumerateCollectionNode DBS 0 - FOR doc IN nonsatellite /* full collection scan */ + 3 EnumerateCollectionNode DBS 0 - FOR doc2 IN satellite /* full collection scan, satellite */ + 8 RemoteNode COOR 0 - REMOTE + 9 GatherNode COOR 0 - GATHER + 5 ReturnNode COOR 0 - RETURN #2 + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 move-calculations-up + 2 scatter-in-cluster + 3 remove-unnecessary-remote-scatter + 4 remove-satellite-joins +``` + +In this scenario all shards of `nonsatellite` are contacted. However, +as the join is a satellite join all shards can do the join locally +as the data is replicated to all servers reducing the network overhead +dramatically. + +## Caveats + +The cluster automatically keeps all SatelliteCollections on all servers in sync +by facilitating the synchronous replication. This means that writes are executed +on the leader only, and this server coordinates replication to the followers. +If a follower doesn't answer in time (due to network problems, temporary shutdown, etc.) +it may be removed as a follower. This is being reported to the Agency. + +The follower (once back in business) then periodically checks the Agency and knows +that it is out of sync. It then automatically catches up. This may take a while +depending on how much data has to be synced. When doing a join involving the `satellite` +you can specify how long the DB-Server is allowed to wait for sync until the query +is being aborted. See [Cursors](http-api/queries/aql-queries.md#create-a-cursor) for details. + +During network failure there is also a minimal chance that a query was properly +distributed to the DB-Servers but that a previous satellite write could not be +replicated to a follower and the leader dropped the follower. The follower however +only checks every few seconds if it is really in sync so it might indeed deliver +stale results. diff --git a/site/content/arangodb/oem/develop/smartjoins.md b/site/content/arangodb/oem/develop/smartjoins.md new file mode 100644 index 0000000000..498f62f6ff --- /dev/null +++ b/site/content/arangodb/oem/develop/smartjoins.md @@ -0,0 +1,308 @@ +--- +title: SmartJoins +menuTitle: SmartJoins +weight: 255 +description: >- + SmartJoins allow to execute co-located join operations among identically + sharded collections +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +## Cluster joins without being smart + +When doing joins in an ArangoDB cluster, data has to be exchanged between different servers. +Joins between different collections in a cluster normally require roundtrips between the +shards of these collections for fetching the data. Requests are routed through an extra +Coordinator hop. + +For example, with two collections `c1` and `c2` with 4 shards each, the Coordinator +initially contacts the 4 shards of `c1`. In order to perform the join, the DB-Server nodes +which manage the actual data of `c1` need to pull the data from the other collection, `c2`. +This causes extra roundtrips via the Coordinator, which then pulls the data for `c2` +from the responsible shards: + +```js +arangosh> db._explain("FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2._key RETURN doc1"); + +Query String: + FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2._key RETURN doc1 + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 EnumerateCollectionNode DBS 0 - FOR doc2 IN c2 /* full collection scan, 4 shard(s) */ + 14 RemoteNode COOR 0 - REMOTE + 15 GatherNode COOR 0 - GATHER + 8 ScatterNode COOR 0 - SCATTER + 9 RemoteNode DBS 0 - REMOTE + 7 IndexNode DBS 0 - FOR doc1 IN c1 /* primary index scan, 4 shard(s) */ + 10 RemoteNode COOR 0 - REMOTE + 11 GatherNode COOR 0 - GATHER + 6 ReturnNode COOR 0 - RETURN doc1 +``` + +This is the general query execution, and it makes sense if there is no further +information available about how the data is actually distributed to the individual +shards. It works in case `c1` and `c2` have a different amount of shards, or use +different shard keys or strategies. However, it comes with the additional cost of +having to do 4 x 4 requests to perform the join. + +## Sharding two collections identically using distributeShardsLike + +In the specific case that the two collections have the same number of shards, the +data of the two collections can be co-located on the same server for the same shard +key values. In this case, the extra hop via the Coordinator is not necessary. + +The query optimizer removes the extra hop for the join in case it can prove +that data for the two collections is co-located. + +The first step is thus to make the two collections shard their data alike. This can +be achieved by making the `distributeShardsLike` attribute of one of the collections +refer to the other collection. + +Here is an example setup for this, using arangosh: + +```js +arangosh> db._create("c1", {numberOfShards: 4, shardKeys: ["_key"]}); +arangosh> db._create("c2", {shardKeys: ["_key"], distributeShardsLike: "c1"}); +``` + +Now the collections `c1` and `c2` not only have the same shard keys, but they +also locate their data for the same shard keys values on the same server. + +Let's check how the data actually gets distributed now. We first confirm that the +two collections have 4 shards each, which in this example are evenly distributed +across two servers: + +```js +arangosh> db.c1.shards(true) +{ + "s2011661" : [ + "PRMR-64d19f43-3aa0-4abb-81f6-4b9966d32175" + ], + "s2011662" : [ + "PRMR-5f30caa0-4c93-4fdd-98f3-a2130c1447df" + ], + "s2011663" : [ + "PRMR-64d19f43-3aa0-4abb-81f6-4b9966d32175" + ], + "s2011664" : [ + "PRMR-5f30caa0-4c93-4fdd-98f3-a2130c1447df" + ] +} + +arangosh> db.c2.shards(true) +{ + "s2011666" : [ + "PRMR-64d19f43-3aa0-4abb-81f6-4b9966d32175" + ], + "s2011667" : [ + "PRMR-5f30caa0-4c93-4fdd-98f3-a2130c1447df" + ], + "s2011668" : [ + "PRMR-64d19f43-3aa0-4abb-81f6-4b9966d32175" + ], + "s2011669" : [ + "PRMR-5f30caa0-4c93-4fdd-98f3-a2130c1447df" + ] +} +``` + +Because we have told both collections that distribute their data alike, their +shards are now also populated alike: + +```js +arangosh> for (i = 0; i < 100; ++i) { + db.c1.insert({ _key: "test" + i }); + db.c2.insert({ _key: "test" + i }); +} + +arangosh> db.c1.count(true); +{ + "s2011664" : 22, + "s2011661" : 21, + "s2011663" : 27, + "s2011662" : 30 +} + +arangosh> db.c2.count(true); +{ + "s2011669" : 22, + "s2011666" : 21, + "s2011668" : 27, + "s2011667" : 30 +} +``` + +We can see that shard 1 of `c1` ("s2011664") has the same number of documents as +shard 1 of `c2` ("s20116692), that shard 2 of `c1` ("s2011661") has the same +number of documents as shard2 of `c2` ("s2011666") etc. +Additionally, we can see from the shard-to-server distribution above that the +corresponding shards from `c1` and `c2` always reside on the same node. +This is a precondition for running joins locally, and thanks to the effects of +`distributeShardsLike` it is now satisfied! + +## SmartJoins using distributeShardsLike + +With the two collections in place like this, an AQL query that uses a FILTER condition +that refers from the shard key of the one collection to the shard key of the other collection +and compares the two shard key values by equality is eligible for the query +optimizer's "smart-joins" optimization: + +```js +arangosh> db._explain("FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2._key RETURN doc1"); + +Query String: + FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2._key RETURN doc1 + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 EnumerateCollectionNode DBS 0 - FOR doc2 IN c2 /* full collection scan, 4 shard(s) */ + 7 IndexNode DBS 0 - FOR doc1 IN c1 /* primary index scan, 4 shard(s) */ + 10 RemoteNode COOR 0 - REMOTE + 11 GatherNode COOR 0 - GATHER + 6 ReturnNode COOR 0 - RETURN doc1 +``` + +As can be seen above, the extra hop via the Coordinator is gone here, which means +less cluster-internal traffic and a faster response time. + +SmartJoins also work if the shard key of the second collection is not `_key`, +and even for non-unique shard key values, e.g.: + +```js +arangosh> db._create("c1", {numberOfShards: 4, shardKeys: ["_key"]}); +arangosh> db._create("c2", {shardKeys: ["parent"], distributeShardsLike: "c1"}); +arangosh> db.c2.ensureIndex({ type: "hash", fields: ["parent"] }); +arangosh> for (i = 0; i < 100; ++i) { + db.c1.insert({ _key: "test" + i }); + for (j = 0; j < 10; ++j) { + db.c2.insert({ parent: "test" + i }); + } +} + +arangosh> db._explain("FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2.parent RETURN doc1"); + +Query String: + FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2.parent RETURN doc1 + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 EnumerateCollectionNode DBS 2000 - FOR doc2 IN c2 /* full collection scan, 4 shard(s) */ + 7 IndexNode DBS 2000 - FOR doc1 IN c1 /* primary index scan, 4 shard(s) */ + 10 RemoteNode COOR 2000 - REMOTE + 11 GatherNode COOR 2000 - GATHER + 6 ReturnNode COOR 2000 - RETURN doc1 +``` + +{{< tip >}} +All above examples used two collections only. SmartJoins also work when joining +more than two collections/Views which have the same data distribution enforced via their +`distributeShardsLike` attribute and using the shard keys as the join criteria as shown above. +{{< /tip >}} + +## SmartJoins using smartJoinAttribute + +In case the join on the second collection must be performed on a non-shard key +attribute, there is the option to specify a `smartJoinAttribute` for the collection. +Note that for this case, setting `distributeShardsLike` is still required here, and that +only a single `shardKeys` attribute can be used. +The single attribute name specified in the `shardKeys` attribute for the collection must end +with a colon character then. + +This `smartJoinAttribute` must be populated for all documents in the collection, +and must always contain a string value. The value of the `_key` attribute for each +document must consist of the value of the `smartJoinAttribute`, a colon character +and then some other user-defined key component. + +The setup thus becomes: + +```js +arangosh> db._create("c1", {numberOfShards: 4, shardKeys: ["_key"]}); +arangosh> db._create("c2", {shardKeys: ["_key:"], smartJoinAttribute: "parent", distributeShardsLike: "c1"}); +arangosh> db.c2.ensureIndex({ type: "hash", fields: ["parent"] }); +arangosh> for (i = 0; i < 100; ++i) { + db.c1.insert({ _key: "test" + i }); + db.c2.insert({ _key: "test" + i + ":" + "ownKey" + i, parent: "test" + i }); +} +``` + +Failure to populate the `smartJoinAttribute` with a string or not at all leads +to a document being rejected on insert, update or replace. Similarly, failure to +prefix a document's `_key` attribute value with the value of the `smartJoinAttribute` +also leads to the document being rejected: + +```js +arangosh> db.c2.insert({ parent: 123 }); +JavaScript exception in file './js/client/modules/@arangodb/arangosh.js' at 99,7: ArangoError 4008: SmartJoin attribute not given or invalid + +arangosh> db.c2.insert({ _key: "123:test1", parent: "124" }); +JavaScript exception in file './js/client/modules/@arangodb/arangosh.js' at 99,7: ArangoError 4007: shard key value must be prefixed with the value of the SmartJoin attribute +``` + +The join can now be performed via the collection's `smartJoinAttribute`: + +```js +arangosh> db._explain("FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2.parent RETURN doc1") + +Query String: + FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == doc2.parent RETURN doc1 + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 EnumerateCollectionNode DBS 101 - FOR doc2 IN c2 /* full collection scan, 4 shard(s) */ + 7 IndexNode DBS 101 - FOR doc1 IN c1 /* primary index scan, 4 shard(s) */ + 10 RemoteNode COOR 101 - REMOTE + 11 GatherNode COOR 101 - GATHER + 6 ReturnNode COOR 101 - RETURN doc1 +``` + +## Restricting SmartJoins to a single shard + +If a FILTER condition is used on one of the shard keys, the optimizer also tries +to restrict the queries to just the required shards: + +```js +arangosh> db._explain("FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == 'test' && doc1._key == doc2.value RETURN doc1"); + +Query String: +FOR doc1 IN c1 FOR doc2 IN c2 FILTER doc1._key == 'test' && doc1._key == doc2.value +RETURN doc1 + +Execution plan: +Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 8 IndexNode DBS 1 - FOR doc1 IN c1 /* primary index scan, shard: s2010246 */ + 7 IndexNode DBS 1 - FOR doc2 IN c2 /* primary index scan, scan only, shard: s2010253 */ +12 RemoteNode COOR 1 - REMOTE +13 GatherNode COOR 1 - GATHER + 6 ReturnNode COOR 1 - RETURN doc1 +``` + +## Limitations + +The SmartJoins optimization is currently triggered only for data selection queries, +but not for any data-manipulation operations such as INSERT, UPDATE, REPLACE, REMOVE +or UPSERT, neither traversals or subqueries. + +It is only applied when joining two collections with an identical +sharding setup. This requires all involved but one collection to be created +with its `distributeShardsLike` attribute pointing to the collection that is +the exception. All collections forming a View must be sharded in the same way, +otherwise the View is not eligible. + +It is restricted to be used with simple shard key attributes (such as `_key`, `productId`), +but not with nested attributes (e.g. `name.first`). There should be exactly one shard +key attribute defined for each collection. + +Finally, the SmartJoins optimization requires that the involved collections are +joined on their shard key attributes (or `smartJoinAttribute`) using an equality +comparison. + +## SmartJoins with Views + +Views of the `arangosearch` type are eligible for SmartJoins, provided that +their underlying collections are eligible too. diff --git a/site/content/arangodb/oem/develop/transactions/_index.md b/site/content/arangodb/oem/develop/transactions/_index.md new file mode 100644 index 0000000000..15c25079ae --- /dev/null +++ b/site/content/arangodb/oem/develop/transactions/_index.md @@ -0,0 +1,69 @@ +--- +title: Transactions +menuTitle: Transactions +weight: 260 +description: >- + ArangoDB provides support for user-definable transactions +--- +## Transaction Types + +ArangoDB offers different types of transactions: + +- AQL queries (with exceptions) +- Stream Transactions +- JavaScript Transactions + +<!-- TODO +### AQL Queries + +read own writes (UPSERT?), intermediate commits +--> + +### Stream Transactions + +[Stream Transactions](stream-transactions.md) allow you to perform +multi-document transactions with individual begin and commit / abort commands. +They work similar to the *BEGIN*, *COMMIT*, and *ROLLBACK* operations in +relational database systems. + +The client is responsible for making sure that transactions are committed or +aborted when they are no longer needed, to avoid taking up resources. + +### JavaScript Transactions + +[JavaScript Transactions](javascript-transactions.md) allow you +to send the server a dedicated piece of JavaScript code (i.e. a function), which +will be executed transactionally. + +At the end of the function, the transaction is automatically committed, and all +changes done by the transaction will be persisted. No interaction is required by +the client beyond the initial request. + +## Transactional Properties + +Transactions in ArangoDB are atomic, consistent, isolated, and durable (*ACID*). + +These *ACID* properties provide the following guarantees: + +- The *atomicity* principle makes transactions either complete in their + entirety or have no effect at all. +- The *consistency* principle ensures that no constraints or other invariants + will be violated during or after any transaction. A transaction will never + corrupt the database. +- The *isolation* property will hide the modifications of a transaction from + other transactions until the transaction commits. +- Finally, the *durability* proposition makes sure that operations from + transactions that have committed will be made persistent. The amount of + transaction durability is configurable in ArangoDB, as is the durability + on collection level. + +The descriptions in this section only provide a general overview. The actual +transactional guarantees depend on the deployment mode and usage pattern. + +Also see: +- [Operation Atomicity](../operational-factors.md#operation-atomicity) for more details on atomicity guarantees +- [Transactional Isolation](../operational-factors.md#transactional-isolation) for more details on isolation guarantees in the single server + and OneShard database case +- [Cluster Transaction Limitations](limitations.md#in-clusters) + for more details on the transactional behavior of multi-document transactions in + cluster deployments diff --git a/site/content/arangodb/oem/develop/transactions/durability.md b/site/content/arangodb/oem/develop/transactions/durability.md new file mode 100644 index 0000000000..78e6127eee --- /dev/null +++ b/site/content/arangodb/oem/develop/transactions/durability.md @@ -0,0 +1,66 @@ +--- +title: Durability of transactions +menuTitle: Durability +weight: 20 +description: '' +--- +Transactions are executed until there is either a rollback +or a commit. On rollback, the operations from the transaction are reversed. + +The RocksDB storage engine applies operations of a transaction in main memory +only until they are committed. In case of an a rollback the entire transaction +is just cleared, no extra rollback steps are required. + +<!-- TODO: point out data loss (query accepted by server, but will be lost) --> +<!-- TODO: intermediate commits?! --> + +In the event of a server crash, the storage engine scans the write-ahead log +to restore certain meta-data like the number of documents in collection +or the selectivity estimates of secondary indexes. + +<!-- TODO: obsolete? +There is thus the potential risk of losing data between the commit of the +transaction and the actual (delayed) disk synchronization. This is the same as +writing into collections that have the `waitForSync` property set to `false` +outside of a transaction. +In case of a crash with `waitForSync` set to false, the operations performed in +the transaction are either visible completely or not at all, depending on +whether the delayed synchronization had kicked in or not. + +To ensure durability of transactions on a collection that have the `waitForSync` +property set to `false`, you can set the `waitForSync` attribute of the object +that is passed to `executeTransaction`. This forces a synchronization of the +transaction to disk even for collections that have `waitForSync` set to `false`: + +```js +db._executeTransaction({ + collections: { + write: "users" + }, + waitForSync: true, + action: function () { ... } +}); +``` + +An alternative is to perform an operation with an explicit `sync` request in +a transaction, e.g. + +```js +db.users.save({ _key: "1234" }, true); +``` + +In this case, the `true` value makes the whole transaction be synchronized +to disk at the commit. + +In any case, ArangoDB gives users the choice of whether or not they want +full durability for single collection transactions. Using the delayed synchronization +(i.e. `waitForSync` with a value of `false`) potentially increases throughput +and performance of transactions, but introduces the risk of losing the last +committed transactions in the case of a crash. + +The call to the `db._executeTransaction()` function +only returns after the data of all modified collections has been synchronized +to disk and the transaction has been made fully durable. This not only reduces the +risk of losing data in case of a crash but also ensures consistency after a +restart. +--> diff --git a/site/content/arangodb/oem/develop/transactions/javascript-transactions.md b/site/content/arangodb/oem/develop/transactions/javascript-transactions.md new file mode 100644 index 0000000000..b1fd29e2d3 --- /dev/null +++ b/site/content/arangodb/oem/develop/transactions/javascript-transactions.md @@ -0,0 +1,466 @@ +--- +title: JavaScript Transactions +menuTitle: JavaScript Transactions +weight: 5 +description: >- + JavaScript Transactions allow you to submit single-request transactions + that leverage ArangoDB's JavaScript API to run complex operations that can + read and modify multiple documents from multiple collections +--- +JavaScript transactions are different from transactions in SQL. + +In SQL, transactions are started with explicit *BEGIN* or *START TRANSACTION* +command. Following any series of data retrieval or modification operations, an +SQL transaction is finished with a *COMMIT* command, or rolled back with a +*ROLLBACK* command. There may be client/server communication between the start +and the commit/rollback of an SQL transaction. + +In ArangoDB, a transaction is always a server-side operation, and is executed +on the server in one go, without any client interaction. All operations to be +executed inside a transaction need to be known by the server when the transaction +is started. + +There are no individual *BEGIN*, *COMMIT* or *ROLLBACK* transaction commands +in ArangoDB. Instead, a transaction in ArangoDB is started by providing a +description of the transaction to the `db._executeTransaction()` JavaScript +function: + +```js +db._executeTransaction(options); +``` + +This function automatically starts a transaction, executes all required +data retrieval and/or modification operations, and automatically +commit the transaction at the end. If an error occurs during transaction execution, the +transaction is automatically aborted, and all changes are rolled back. + +## JavaScript API + +### Execute Transaction + +`db._executeTransaction(options)` + +Executes a server-side JavaScript transaction. + +`options` must be an object and have the following attributes: + +- `collections`: A sub-object that defines which collections you want to use + in the transaction. It can have the following sub-attributes: + - `read`: A single collection or a list of collections to use in the + transaction in read-only mode. + - `write`: A single collection or a list of collections to use in the + transaction in write or read mode. + - `exclusive`: A single collection or a list of collections to acquire + exclusive write access for. +- `action`: A JavaScript function or a string with JavaScript code + containing all the instructions to be executed inside the transaction. + If the code runs through successfully, the transaction is committed + at the end. If the code throws an exception, the transaction is + aborted and all database operations are be rolled back. + +Additionally, `options` can have the following optional attributes: + +- `params`: Optional arguments passed to the function specified in `action`. +- `allowImplicit`: Allow reading from undeclared collections. +- `waitForSync`: An optional boolean flag that, if set, forces the + transaction to write all data to disk before returning. +- `lockTimeout`: A numeric value that can be used to set a timeout in seconds for + waiting on collection locks. This option is only meaningful when using + `exclusive` locks. If not specified, a default value of 900 seconds is used. + Setting `lockTimeout` to `0` makes ArangoDB not time out waiting for a lock. +- `maxTransactionSize`: Transaction size limit in bytes. + +### Declaration of Collections + +All collections participating in a transaction need to be declared +beforehand. This is necessary to ensure proper locking and isolation. + +Collections can be used in a transaction in write mode or in read-only mode. +<!-- TODO: exclusive --> + +If any data modification operations are to be executed, the collection must be +declared for use in write mode. The write mode allows modifying and reading data +from the collection during the transaction (i.e. the write mode includes the +read mode). + +Contrary, using a collection in read-only mode will only allow performing +read operations on a collection. Any attempt to write into a collection used +in read-only mode will make the transaction fail. + +Collections for a transaction are declared by providing them in the `collections` +attribute of the object passed to the `_executeTransaction()` function. The +`collections` attribute can have the sub-attributes `read`, `write`, and +`exclusive`: + +```js +db._executeTransaction({ + collections: { + write: [ "users", "logins" ], + read: [ "recommendations" ] + } +}); +``` + +`read`, `write`, and `exclusive` are optional attributes, and only need to be +specified if the operations inside the transactions demand for it. + +The attribute values can each be lists of collection names or a single +collection name (as a string): + +```js +db._executeTransaction({ + collections: { + write: "users", + read: "recommendations" + } +}); +``` + +**Note**: It is optional to specify collections for read-only access by default. +Even without specifying them, it is still possible to read from such collections +from within a transaction, but with relaxed isolation. Please refer to +[Transactions Locking](locking-and-isolation.md) for more details. + +In order to make a transaction fail when a non-declared collection is used inside +for reading, the optional `allowImplicit` sub-attribute of `collections` can be +set to `false`: + +```js +db._executeTransaction({ + collections: { + read: "recommendations", + allowImplicit: false /* this disallows read access to other collections + than specified */ + }, + action: function () { + var db = require("@arangodb").db; + return db.foobar.toArray(); /* will fail because db.foobar must not be accessed + for reading inside this transaction */ + } +}); +``` + +The default value for `allowImplicit` is `true`. Write-accessing collections that +have not been declared in the `collections` array is never possible, regardless of +the value of `allowImplicit`. + +### Declaration of Data Modification and Retrieval Operations + +All data modification and retrieval operations that are to be executed inside +the transaction need to be specified in a JavaScript function, using the `action` +attribute: + +```js +db._executeTransaction({ + collections: { + write: "users" + }, + action: function () { + // all operations go here + } +}); +``` + +Any valid JavaScript code is allowed inside `action` but the code may only +access the collections declared in `collections`. +`action` may be a JavaScript function as shown above, or a string representation +of a JavaScript function: + +```js +db._executeTransaction({ + collections: { + write: "users" + }, + action: "function () { doSomething(); }" +}); +``` + +Note that any operations specified in `action` will be executed on the +server, in a separate scope. Variables will be bound late. Accessing any JavaScript +variables defined on the client-side or in some other server context from inside +a transaction may not work. +Instead, any variables used inside `action` should be defined inside `action` itself: + +```js +db._executeTransaction({ + collections: { + write: "users" + }, + action: function () { + var db = require(...).db; + db.users.save({ ... }); + } +}); +``` + +When the code inside the `action` attribute is executed, the transaction is +already started and all required locks have been acquired. When the code inside +the `action` attribute finishes, the transaction will automatically commit. +There is no explicit commit command. + +To make a transaction abort and roll back all changes, an exception needs to +be thrown and not caught inside the transaction: + +```js +db._executeTransaction({ + collections: { + write: "users" + }, + action: function () { + var db = require("@arangodb").db; + db.users.save({ _key: "hello" }); + // will abort and roll back the transaction + throw "doh!"; + } +}); +``` + +There is no explicit abort or roll back command. + +As mentioned earlier, a transaction commits automatically when the end of +the `action` function is reached and no exception were thrown. In this +case, the user can return any legal JavaScript value from the function: + +```js +db._executeTransaction({ + collections: { + write: "users" + }, + action: function () { + var db = require("@arangodb").db; + db.users.save({ _key: "hello" }); + // will commit the transaction and return the value "hello" + return "hello"; + } +}); +``` + +### Passing parameters to transactions + +Arbitrary parameters can be passed to transactions by setting the `params` +attribute when declaring the transaction. This feature is handy to re-use the +same transaction code for multiple calls but with different parameters. + +A basic example: + +```js +db._executeTransaction({ + collections: { }, + action: function (params) { + return params[1]; + }, + params: [ 1, 2, 3 ] +}); +``` + +The above example will return `2`. + +Some example that uses collections: + +```js +db._executeTransaction({ + collections: { + write: "users", + read: [ "c1", "c2" ] + }, + action: function (params) { + var db = require('@arangodb').db; + var doc = db.c1.document(params['c1Key']); + db.users.save(doc); + doc = db.c2.document(params['c2Key']); + db.users.save(doc); + }, + params: { + c1Key: "foo", + c2Key: "bar" + } +}); +``` + +### Throwing Exceptions + +If you catch errors in your transaction, try to get them solved. If you can't, +you may want to mimic original ArangoDB error messages to ease the control flow +of your invoking environment. This can be done like this: + +```js +db._executeTransaction({ + collections: {}, + action: function () { + const arangodb = require('@arangodb'); + var err = new arangodb.ArangoError(); + err.errorNum = arangodb.ERROR_BAD_PARAMETER; + err.errorMessage = "who's bad?"; + throw err; + } +}); +``` + +For a complete list of possible ArangoDB errors, see +[Error codes and meanings](../error-codes.md). + +### Custom Exceptions + +You may want to define custom exceptions inside of a transaction. To have the +exception propagate upwards properly, please throw an an instance of base +JavaScript `Error` class or a derivative. To specify an error number, include it +as the `errorNumber` field. As an example: + +```js +db._executeTransaction({ + collections: {}, + action: function () { + var err = new Error('My error context'); + err.errorNum = 1234; + throw err; + } +}); +``` + +**Note**: In previous versions, custom exceptions which did not have an +`Error`-like form were simply converted to strings and exposed in the +`exception` field of the returned error. This is no longer the case, as it had +the potential to leak unwanted information if improperly used. + +**Note**: In some versions the above example wouldn't propagate the `errorNum` to the +invoking party, you may need to upgrade your ArangoDB. + +### Examples + +#### Single Collection Example + +The first example writes 3 documents into a collection named `c1`. +The `c1` collection needs to be declared in the `write` attribute of the +`collections` attribute passed to the `_executeTransaction()` function. + +The `action` attribute contains the actual transaction code to be executed. +This code contains all data modification operations (3 in this example). + +```js +// setup +db._create("c1"); + +db._executeTransaction({ + collections: { + write: [ "c1" ] + }, + action: function () { + var db = require("@arangodb").db; + db.c1.save({ _key: "key1" }); + db.c1.save({ _key: "key2" }); + db.c1.save({ _key: "key3" }); + } +}); + db.c1.count(); // 3 +``` + +Aborting the transaction by throwing an exception in the `action` function +will revert all changes, so as if the transaction never happened: + +```js +// setup +db._create("c1"); + +db._executeTransaction({ + collections: { + write: [ "c1" ] + }, + action: function () { + var db = require("@arangodb").db; + db.c1.save({ _key: "key1" }); + db.c1.count(); // 1 + db.c1.save({ _key: "key2" }); + db.c1.count(); // 2 + throw "doh!"; + } +}); + +db.c1.count(); // 0 +``` + +The automatic rollback is also executed when an internal exception is thrown +at some point during transaction execution: + +```js +// setup +db._create("c1"); + +db._executeTransaction({ + collections: { + write: [ "c1" ] + }, + action: function () { + var db = require("@arangodb").db; + db.c1.save({ _key: "key1" }); + // will throw duplicate a key error, not explicitly requested by the user + db.c1.save({ _key: "key1" }); + // we'll never get here... + } +}); + +db.c1.count(); // 0 +``` + +As required by the *consistency* principle, aborting or rolling back a +transaction will also restore secondary indexes to the state at transaction +start. + +#### Cross-collection Transactions + +There's also the possibility to run a transaction across multiple collections. +In this case, multiple collections need to be declared in the `collections` +attribute, e.g.: + +```js +// setup +db._create("c1"); +db._create("c2"); + +db._executeTransaction({ + collections: { + write: [ "c1", "c2" ] + }, + action: function () { + var db = require("@arangodb").db; + db.c1.save({ _key: "key1" }); + db.c2.save({ _key: "key2" }); + } +}); + +db.c1.count(); // 1 +db.c2.count(); // 1 +``` + +Again, throwing an exception from inside the `action` function will make the +transaction abort and roll back all changes in all collections: + +```js +// setup +db._create("c1"); +db._create("c2"); + +db._executeTransaction({ + collections: { + write: [ "c1", "c2" ] + }, + action: function () { + var db = require("@arangodb").db; + for (var i = 0; i < 100; ++i) { + db.c1.save({ _key: "key" + i }); + db.c2.save({ _key: "key" + i }); + } + db.c1.count(); // 100 + db.c2.count(); // 100 + // abort + throw "doh!" + } +}); + +db.c1.count(); // 0 +db.c2.count(); // 0 +``` + +## HTTP API + +See the [HTTP Interface for JavaScript Transactions](../http-api/transactions/javascript-transactions.md) +documentation. diff --git a/site/content/arangodb/oem/develop/transactions/limitations.md b/site/content/arangodb/oem/develop/transactions/limitations.md new file mode 100644 index 0000000000..e1fe10b818 --- /dev/null +++ b/site/content/arangodb/oem/develop/transactions/limitations.md @@ -0,0 +1,156 @@ +--- +title: Limitations of transactions +menuTitle: Limitations +weight: 25 +description: '' +--- +<!-- TODO: Update for RocksDB --> + +## In General + +Transactions in ArangoDB have been designed with particular use cases +in mind. They will be mainly useful for *short and small* data retrieval +and/or modification operations. + +The implementation is **not** optimized for *very long-running* or *very voluminous* +operations, and may not be usable for these cases. + +One limitation is that a transaction operation information must fit into main +memory. The transaction information consists of record pointers, revision numbers +and rollback information. The actual data modification operations of a transaction +are written to the write-ahead log and do not need to fit entirely into main +memory. + +Ongoing transactions will also prevent the write-ahead logs from being fully +garbage-collected. Information in the write-ahead log files cannot be written +to collection data files or be discarded while transactions are ongoing. + +To ensure progress of the write-ahead log garbage collection, transactions should +be kept as small as possible, and big transactions should be split into multiple +smaller transactions. + +Transactions in ArangoDB cannot be nested, i.e. a transaction must not start another +transaction. If an attempt is made to call a transaction from inside a running +transaction, the server will throw error *1651 (nested transactions detected)*. + +It is also disallowed to execute user transaction on some of ArangoDB's own system +collections. This shouldn't be a problem for regular usage as system collections will +not contain user data and there is no need to access them from within a user +transaction. + +Some operations are not allowed inside transactions in general: + +- creation and deletion of databases (`db._createDatabase()`, `db._dropDatabase()`) +- creation and deletion of collections (`db._create()`, `db._drop()`, `db.<collection>.rename()`) +- creation and deletion of indexes (`db.<collection>.ensureIndex()`, `db.<collection>.dropIndex()`) + +If an attempt is made to carry out any of these operations during a transaction, +ArangoDB will abort the transaction with error code *1653 (disallowed operation inside +transaction)*. + +Finally, all collections that may be modified during a transaction must be +declared beforehand, i.e. using the *collections* attribute of the object passed +to the *_executeTransaction* function. If any attempt is made to carry out a data +modification operation on a collection that was not declared in the *collections* +attribute, the transaction will be aborted and ArangoDB will throw error *1652 +unregistered collection used in transaction*. +It is legal to not declare read-only collections, but this should be avoided if +possible to reduce the probability of deadlocks and non-repeatable reads. + +## In Clusters + +Using a single instance of ArangoDB (or a OneShard database in a +cluster), multi-document / multi-collection queries are guaranteed to be +fully ACID in the +[traditional sense](https://en.wikipedia.org/wiki/ACID_(computer_science)). +For more details see +[Operation Atomicity](../operational-factors.md#operation-atomicity) +and +[Transactional Isolation](../operational-factors.md#transactional-isolation). +This is more than many other NoSQL database systems support. +In cluster mode, single-document operations are also *fully ACID*. + +Multi-document / multi-collection queries and transactions offer different guarantees. +Understanding these differences is important when designing applications that need +to be resilient against outages of individual servers. + +Cluster transactions share the underlying characteristics of the +[storage engine](../../components/arangodb-server/storage-engine.md) that is used for the cluster deployment. +A transaction started on a Coordinator translates to one transaction per involved DB-Server. +The guarantees and characteristics of the given storage-engine apply additionally +to the cluster specific information below. +Please refer to [Locking and Isolation](locking-and-isolation.md) for more details +on the storage-engines. + +### Atomicity + +A transaction on *one DB-Server* is either committed completely or not at all. + +ArangoDB transactions do currently not require any form of global consensus. This makes +them relatively fast, but also vulnerable to unexpected server outages. + +Should a transaction involve [Leader Shards](../../deploy/cluster/_index.md#db-servers) +on *multiple DB-Servers*, the atomicity of the distributed transaction *during the commit operation* +cannot be guaranteed. Should one of the involved DB-Servers fail during the commit the transaction +is not rolled-back globally, sub-transactions may have been committed on some DB-Servers, but not on others. +Should this case occur the client application will see an error. + +An improved failure handling issue might be introduced in future versions. + +### Consistency + +We provide consistency even in the cluster, a transaction will never leave the data in +an incorrect or corrupt state. + +In ArangoDB there is always exactly one DB-Server responsible for a given shard. In both +Storage-Engines the locking procedures ensure that dependent transactions (in the sense that +the transactions modify the same documents or unique index entries) are ordered sequentially. +Therefore we can provide [Causal-Consistency](https://en.wikipedia.org/wiki/Consistency_model#Causal_consistency) +for your transactions. + +From the applications point-of-view this also means that a given transaction can always +[read it's own writes](https://en.wikipedia.org/wiki/Consistency_model#Read-your-writes_consistency). +Other concurrent operations will not change the database state seen by a transaction. + +### Isolation + +The ArangoDB Cluster provides *Local Snapshot Isolation*. This means that all operations +and queries in the transactions will see the same version, or snapshot, of the data on a given +DB-Server. This snapshot is based on the state of the data at the moment in +time when the transaction begins *on that DB-Server*. + +### Durability + +It is guaranteed that successfully committed transactions are persistent. Using +replication and / or *waitForSync* increases the durability (Just as with the single-server). + +## Size and time limits + +### Intermediate commits + +[Intermediate commits](../../aql/fundamentals/limitations.md#storage-engine-properties) +that would automatically split and commit parts of big transactions are **disabled** +for JavaScript Transactions and Stream Transactions in the RocksDB storage engine, +including AQL queries that run inside of such transactions. + +### Limits for Stream transactions + +A maximum lifetime and transaction size for Stream Transactions is enforced +on the Coordinator to ensure that abandoned transactions cannot block the +cluster from operating properly: + +- Maximum idle timeout of up to **120 seconds** between operations +- Maximum transaction size of **128 MB** per DB-Server + +These limits are also enforced for Stream Transactions on single servers. + +The default maximum idle timeout is **60 seconds** between operations in a +single Stream Transaction. The maximum value can be bumped up to at most 120 +seconds by setting the startup option `--transaction.streaming-idle-timeout`. +Posting an operation into a non-expired Stream Transaction will reset the +transaction's timeout to the configured idle timeout. + +Enforcing the limit is useful to free up resources used by abandoned +transactions, for example from transactions that are abandoned by client +applications due to programming errors or that were left over because client +connections were interrupted. diff --git a/site/content/arangodb/oem/develop/transactions/locking-and-isolation.md b/site/content/arangodb/oem/develop/transactions/locking-and-isolation.md new file mode 100644 index 0000000000..dbfdf6f6f3 --- /dev/null +++ b/site/content/arangodb/oem/develop/transactions/locking-and-isolation.md @@ -0,0 +1,237 @@ +--- +title: Locking and isolation of transactions +menuTitle: Locking and isolation +weight: 15 +description: '' +--- +Transactions need to specify from which collections they will read data and which +collections they intend to modify. This can be done by setting the `read`, `write`, +or `exclusive` attributes in the `collections` attribute of the transaction: + +```js +db._executeTransaction({ + collections: { + read: "users", + write: ["test", "log"] + }, + action: function () { + const db = require("@arangodb").db; + db.users.toArray().forEach(function(doc) { + db.log.insert({ value: "removed user: " + doc.name }); + db.test.remove(doc._key); + }); + } +}); +``` + +<!-- TODO: does write access imply read access in RocksDB? --> +*write* here means write access to the collection, and also includes any read accesses. + +*exclusive* means exclusive write access to the collection, and *write* means (shared) +write access to the collection, which can be interleaved with write accesses by other +concurrent transactions. + +## Storage engine + +The RocksDB storage engine does not lock any collections participating in a transaction +for read. Read operations can run in parallel to other read or write operations on the +same collections. + +### Locking + +For all collections that are used in write mode, the RocksDB engine will internally +acquire a (shared) read lock. This means that many writers can modify data in the same +collection in parallel (and also run in parallel to ongoing reads). However, if two +concurrent transactions attempt to modify the same document or index entry, there will +be a write-write conflict, and one of the transactions will abort with error 1200 +("conflict"). It is then up to client applications to retry the failed transaction or +accept the failure. + +In order to guard long-running or complex transactions against concurrent operations +on the same data, the RocksDB engine allows to access collections in exclusive mode. +Exclusive accesses will internally acquire a write-lock on the collections, so they +are not executed in parallel with any other write operations. Read operations can still +be carried out by other concurrent transactions. + +### Isolation + +The RocksDB storage-engine provides *snapshot isolation*. This means that all operations +and queries in the transactions will see the same version, or snapshot, of the database. +This snapshot is based on the state of the database at the moment in time when the transaction +begins. No locks are acquired on the underlying data to keep this snapshot, which permits +other transactions to execute without being blocked by an older uncompleted transaction +(so long as they do not try to modify the same documents or unique index-entries concurrently). +In the cluster a snapshot is acquired on each DB-Server individually. + +## Lazily adding collections + +There might be situations when declaring all collections a priori is not possible, +for example, because further collections are determined by a dynamic AQL query +inside the transaction, for example a query using AQL graph traversal. + +In this case, it would be impossible to know beforehand which collection to lock, and +thus it is legal to not declare collections that will be accessed in the transaction in +read-only mode. Accessing a non-declared collection in read-only mode during a +transaction will add the collection to the transaction lazily, and fetch data +from the collection as usual. However, as the collection is added lazily, there is no +isolation from other concurrent operations or transactions. Reads from such +collections are potentially non-repeatable. + +**Examples:** + +```js +db._executeTransaction({ + collections: { + read: "users" + }, + action: function () { + const db = require("@arangodb").db; + /* Execute an AQL query that traverses a graph starting at a "users" vertex. + It is yet unknown into which other collections the query might traverse */ + db._createStatement({ + query: `FOR v IN ANY "users/1234" connections RETURN v` + }).execute().toArray().forEach(function (d) { + /* ... */ + }); + } +}); +``` + +This automatic lazy addition of collections to a transaction also introduces the +possibility of deadlocks. Deadlocks may occur if there are concurrent transactions +that try to acquire locks on the same collections lazily. + +In order to make a transaction fail when a non-declared collection is used inside +a transaction for reading, the optional *allowImplicit* sub-attribute of *collections* +can be set to *false*: + +```js +db._executeTransaction({ + collections: { + read: "users", + allowImplicit: false + }, + action: function () { + /* The below query will now fail because the collection "connections" has not + been specified in the list of collections used by the transaction */ + const db = require("@arangodb").db; + db._createStatement({ + query: `FOR v IN ANY "users/1234" connections RETURN v` + }).execute().toArray().forEach(function (d) { + /* ... */ + }); + } +}); +``` + +The default value for *allowImplicit* is *true*. Write-accessing collections that +have not been declared in the *collections* array is never possible, regardless of +the value of *allowImplicit*. + +If *users/1234* has an edge in *connections*, linking it to another document in +the *users* collection, then the following explicit declaration will work: + +```js +db._executeTransaction({ + collections: { + read: ["users", "connections"], + allowImplicit: false + }, + /* ... */ +``` + +If the edge points to a document in another collection however, then the query +will fail, unless that other collection is added to the declaration as well. + +Note that if a document handle is used as starting point for a traversal, e.g. +`FOR v IN ANY "users/not_linked" ...` or `FOR v IN ANY {_id: "users/not_linked"} ...`, +then no error is raised in the case of the start vertex not having any edges to +follow, with `allowImplicit: false` and *users* not being declared for read access. +AQL only sees a string and does not consider it a read access, unless there are +edges connected to it. `FOR v IN ANY DOCUMENT("users/not_linked") ...` will fail +even without edges, as it is always considered to be a read access to the *users* +collection. + +## Deadlocks and Deadlock detection + +<!-- TODO: Obsolete? --> + +A deadlock is a situation in which two or more concurrent operations (user transactions +or AQL queries) try to access the same resources (collections, documents) and need to +wait for the others to finish, but none of them can make any progress. + +A good example for a deadlock is two concurrently executing transactions T1 and T2 that +try to access the same collections but that need to wait for each other. In this example, +transaction T1 will write to collection `c1`, but will also read documents from +collection `c2` without announcing it: + +```js +db._executeTransaction({ + collections: { + write: "c1" + }, + action: function () { + const db = require("@arangodb").db; + + /* write into c1 (announced) */ + db.c1.insert({ foo: "bar" }); + + /* some operation here that takes long to execute... */ + + /* read from c2 (unannounced) */ + db.c2.toArray(); + } +}); +``` + +Transaction T2 announces to write into collection `c2`, but will also read +documents from collection `c1` without announcing it: + +```js +db._executeTransaction({ + collections: { + write: "c2" + }, + action: function () { + var db = require("@arangodb").db; + + /* write into c2 (announced) */ + db.c2.insert({ bar: "baz" }); + + /* some operation here that takes long to execute... */ + + /* read from c1 (unannounced) */ + db.c1.toArray(); + } +}); +``` + +In the above example, a deadlock will occur if transaction T1 and T2 have both +acquired their write locks (T1 for collection `c1` and T2 for collection `c2`) and +are then trying to read from the other other (T1 will read from `c2`, T2 will read +from `c1`). T1 will then try to acquire the read lock on collection `c2`, which +is prevented by transaction T2. T2 however will wait for the read lock on +collection `c1`, which is prevented by transaction T1. + +In case of such deadlock, there would be no progress for any of the involved +transactions, and none of the involved transactions could ever complete. This is +completely undesirable, so the automatic deadlock detection mechanism in ArangoDB +will automatically abort one of the transactions involved in such deadlock. Aborting +means that all changes done by the transaction will be rolled back and error 29 +(`deadlock detected`) will be thrown. + +Client code (AQL queries, user transactions) that accesses more than one collection +should be aware of the potential of deadlocks and should handle the error 29 +(`deadlock detected`) properly, either by passing the exception to the caller or +retrying the operation. + +To avoid both deadlocks and non-repeatable reads, all collections used in a +transaction should be specified in the `collections` attribute when known in advance. +In case this is not possible because collections are added dynamically inside the +transaction, deadlocks may occur and the deadlock detection may kick in and abort +the transaction. + +The RocksDB storage engine uses document-level locks and therefore will not have a deadlock +problem on collection level. If two concurrent transactions however modify the same +documents or index entries, the RocksDB engine will signal a write-write conflict +and abort one of the transactions with error 1200 ("conflict") automatically. diff --git a/site/content/arangodb/oem/develop/transactions/stream-transactions.md b/site/content/arangodb/oem/develop/transactions/stream-transactions.md new file mode 100644 index 0000000000..6114541444 --- /dev/null +++ b/site/content/arangodb/oem/develop/transactions/stream-transactions.md @@ -0,0 +1,212 @@ +--- +title: Stream Transactions +menuTitle: Stream Transactions +weight: 10 +description: >- + Stream Transactions allow you start a transaction, run multiple operations + like AQL queries over a short period of time, and then commit or abort the + transaction +--- +Stream Transactions allow you to perform multi-document transaction +with individual begin and commit / abort commands. This is comparable to the +*BEGIN*, *COMMIT* and *ROLLBACK* operations found in relational database systems. + +Stream Transaction work in conjunction with other operations in ArangoDB. +Supported operations include: + +- Read and write documents +- Get the number of documents of collections +- Truncate collections +- Run AQL queries + +You **always need to start the transaction first** and explicitly specify the +collections used for write accesses upfront. You need to make sure that the +transaction is committed or aborted when it is no longer needed. +This avoids taking up resources on the ArangoDB server. + +{{< warning >}} +Transactions acquire collection locks for write operations in RocksDB. +It is therefore advisable to keep the transactions as short as possible. +{{< /warning >}} + +For a more detailed description of how transactions work in ArangoDB, please +refer to [Transactions](_index.md). + +You can use Stream Transactions via the [JavaScript API](#javascript-api) and +the [HTTP API](../http-api/transactions/stream-transactions.md). + +## Limitations + +### Timeout and transaction size + +A maximum lifetime and transaction size for Stream Transactions is enforced +on the Coordinator to ensure that abandoned transactions cannot block the +cluster from operating properly: + +- Maximum idle timeout of up to **120 seconds** between operations. +- Maximum transaction size of **128 MB** (per DB-Server in clusters). + +These limits are also enforced for Stream Transactions on single servers. + +The default maximum idle timeout is **60 seconds** between operations in a +single Stream Transaction. The maximum value can be bumped up to at most 120 +seconds by setting the `--transaction.streaming-idle-timeout` startup option. +Posting an operation into a non-expired Stream Transaction resets the +transaction's timeout to the configured idle timeout. + +Enforcing the limit is useful to free up resources used by abandoned +transactions, for example from transactions that are abandoned by client +applications due to programming errors or that were left over because client +connections were interrupted. + +### Concurrent requests + +A given transaction is intended to be used **serially**. No concurrent requests +using the same transaction ID should be issued by the client. The server can +make some effort to serialize certain operations (see +[Streaming Lock Timeout](../../components/arangodb-server/options.md#--transactionstreaming-lock-timeout)), +however, this degrades the server's performance and may lead to sporadic +errors with code `28` (locked). + +### Batch requests + +The [Batch API](../http-api/batch-requests.md) cannot be used in combination with +Stream Transactions for submitting batched requests, because the required +`x-arango-trx-id` header is not forwarded. + +## JavaScript API + +### Create Transaction + +`db._createTransaction(options) → trx` + +Begin a Stream Transaction. + +`options` must be an object with the following attributes: + +- `collections`: A sub-object that defines which collections you want to use + in the transaction. It can have the following sub-attributes: + - `read`: A single collection or a list of collections to use in the + transaction in read-only mode. + - `write`: A single collection or a list of collections to use in the + transaction in write or read mode. + - `exclusive`: A single collection or a list of collections to acquire + exclusive write access for. + +Additionally, `options` can have the following optional attributes: + +- `allowImplicit`: Allow reading from undeclared collections. +- `waitForSync`: An optional boolean flag that, if set, forces the + transaction to write all data to disk before returning. +- `lockTimeout`: A numeric value that can be used to set a timeout in seconds for + waiting on collection locks. This option is only meaningful when using + `exclusive` locks. If not specified, a default value is used. Setting + `lockTimeout` to `0` makes ArangoDB not time out waiting for a lock. + +The method returns an object that lets you run supported operations as part of +the transactions, get the status information, and commit or abort the transaction. + +The following example shows how you can remove a document from a collection and +create a new document in the same collection using a Stream Transaction: + +```js +--- +name: jsStreamTransaction_1 +description: '' +--- +~db._create("tasks"); +~db.tasks.save({ _key: "123", type: "sendEmail", date: "2022-07-07T15:20:00.000Z" }); +var coll = "tasks"; +var trx = db._createTransaction({ collections: { write: [coll] } }); +var task = trx.query(`FOR t IN @@coll SORT t.date DESC LIMIT 1 RETURN t`, {"@coll": coll}).toArray()[0]; +if (task) { + print(task); + trx.collection(coll).remove(task._key); + var newTask = trx.collection(coll).save({ _key: "124", type: task.type, date: new Date().toISOString() }, { returnNew: true }).new; + print(newTask); + trx.commit(); +} else { + trx.abort(); +} +trx.status(); +~db._drop("tasks"); +``` + +### Commit + +`trx.commit() → status` + +Commit a Stream Transaction and return the [status](#status). + +Committing is an idempotent operation. It is not an error to commit a transaction +more than once. + +### Abort + +`trx.abort() → status` + +Abort a Stream Transaction and return the [status](#status). + +Aborting is an idempotent operation. It is not an error to abort a transaction +more than once. + +### Collection + +`trx.collection(collection-name) → coll` + +Return a collection object for the specified collection, or null if it does not +exist. + +The object lets you access the following methods to perform document and +collection operations: + +- [`count()`](../javascript-api/@arangodb/collection-object.md#collectioncount) +- [`document()`](../javascript-api/@arangodb/collection-object.md#collectiondocumentobject--options) +- [`exists()`](../javascript-api/@arangodb/collection-object.md#collectionexistsobject--options) +- [`insert()`](../javascript-api/@arangodb/collection-object.md#collectioninsertdata--options) +- [`name()`](../javascript-api/@arangodb/collection-object.md#collectionname) +- [`remove()`](../javascript-api/@arangodb/collection-object.md#collectionremoveobject) +- [`replace()`](../javascript-api/@arangodb/collection-object.md#collectionreplacedocument-data--options) +- [`save()`](../javascript-api/@arangodb/collection-object.md#collectionsavedata--options) +- [`truncate()`](../javascript-api/@arangodb/collection-object.md#collectiontruncateoptions) +- [`update()`](../javascript-api/@arangodb/collection-object.md#collectionupdatedocument-data--options) + +Compared to the collection object returned by `db._collection()`, only a subset +of methods is available, and the operations are executed as part of the +Stream Transactions, but they work the same otherwise. + +### Query + +`trx.query(aql-query) → cursor` + +Run an AQL query as part of a Stream Transaction and return a result cursor. +The method works similar to the +[`db._query()` method](../../aql/how-to-invoke-aql/with-arangosh.md#with-db_query). + +### ID + +`trx.id() → id` + +Get the identifier of the Stream Transaction. + +### Running + +`trx.running() → bool` + +Return a boolean that indicates whether the Stream Transaction is on-going. + +### Status + +`trx.status() → status` + +Return an object with the status information of the Stream Transaction. +The object has the following attributes: + +- `id`: The identifier of the Stream Transaction. +- `status`: The status of the Stream Transaction. + One of `"running"`, `"committed"`, or `"aborted"`. + +## HTTP API + +See the [HTTP Interface for Stream Transactions](../http-api/transactions/stream-transactions.md) +documentation. diff --git a/site/content/arangodb/oem/get-started/_index.md b/site/content/arangodb/oem/get-started/_index.md new file mode 100644 index 0000000000..b4a7d7f85a --- /dev/null +++ b/site/content/arangodb/oem/get-started/_index.md @@ -0,0 +1,102 @@ +--- +title: Get Started +menuTitle: Get Started +weight: 25 +description: >- + Learn about ArangoDB's core concepts such as the high-level data + organization and its data model +aliases: + - get-started/overview +--- +This chapter introduces ArangoDB's core concepts and covers the following: + +- The high-level data organization +- Its data model (or rather multiple data models) +- Important terminology used throughout the database system and in this + documentation + +You can also find examples on how to interact with the database system +using ArangoDB's interactive command-line interface called [arangosh](../components/tools/arangodb-shell/_index.md). + +See [How to Interact With ArangoDB](how-to-interact-with-arangodb.md) to learn +more about: +- Ways you can use and communicate with ArangoDB servers +- How to set up and deploy an ArangoDB instance +- Get data in and out of ArangoDB +- Back up and restore data in ArangoDB + +Learn more about ArangoDB's [data structure](../concepts/data-structure/_index.md) and +[data models](../concepts/data-models.md). + +## Modeling Data for ArangoDB + +Plan for your data needs and map your conceptual model to the right features, +making the most of ArangoDB. + +All of the following topics fall under the broader term of data modeling: + +- Analyzing your project goals and existing data +- Designing logical models for your data and mapping them to ArangoDB, often + by striking a balance between natural data structures and great performance +- Preparing and loading data into ArangoDB +- Transforming data once it is in ArangoDB + +## Coming from SQL + +If you worked with a database management system (RDBMS) such as MySQL, +MariaDB or PostgreSQL, you should be familiar with the SQL query language. + +ArangoDB's query language is called AQL. There are some similarities between both +languages despite the different data models of the database systems. The most +notable difference is probably the concept of loops in AQL, which makes it feel +more like a programming language. It suits the schema-less model more natural +and makes the query language very powerful while remaining easy to read and write. + +To get started with AQL, sign up for [ArangoDB University](https://university.arangodb.com/) +and get access to interactive courses powered by the Arango Managed Platform (AMP). + +## In the Cloud or On-premises + +When you are ready for your own ArangoDB server, you can sign up for ArangoDB's +cloud service called the Arango Managed Platform (AMP), which takes care of the setup and maintenance, so +that you can focus on building amazing things on top of ArangoDB. See +[Use ArangoDB in the Cloud](set-up-a-cloud-instance.md) to get started. + +You can also install ArangoDB locally or on your own server hardware. +See [Install ArangoDB on-premises](on-premises-installation.md) for more details. + +## Interactive Tutorials + +To get started with ArangoDB and try out some of its features, you can use the +interactive tutorials. They provide information on various topics and allow you +to set up and access a cloud instance of ArangoDB - it’s free, easy to use, and +no installation is required. + +**AQL Tutorials** + +- [Game of Thrones AQL Tutorial](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/ArangoDB_GOT_Tutorial.ipynb) +- [AQL CRUD Part 1](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/AqlCrudTutorial.ipynb) +- [AQL CRUD Part 2](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/AqlPart2Tutorial.ipynb) +- [AQL Joins](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/AqlJoinTutorial.ipynb) +- [AQL Graph Traversal](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/AqlTraversalTutorial.ipynb) +- [AQL Geospatial](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/AqlGeospatialTutorial.ipynb) + +**Graph Tutorials** + +- [Property Graph Queries](https://colab.research.google.com/github/joerg84/Graph_Powered_ML_Workshop/blob/master/Graphs_Queries.ipynb) + +**ArangoSearch Tutorials** + +- [ArangoSearch](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/ArangoSearch.ipynb) +- [Fuzzy Search](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/FuzzySearch.ipynb) + +**GraphML and Analytics Tutorials** + +- [ArangoDB and NetworkX](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/ArangoDB_NetworkX_Interface_Introduction.ipynb) +- [Graph Analytics: Collaborative Filtering](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/Collaborative_Filtering.ipynb) +- [Graph Analytics: Fraud Detection](https://colab.research.google.com/github/joerg84/Graph_Powered_ML_Workshop/blob/master/Fraud_Detection.ipynb) +- [Graph Neural Networks with PyTorch](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/arangoflix/predict_Movie_Rating_GNN.ipynb) + +You can find all interactive tutorials on GitHub: + +<https://github.com/arangodb/interactive_tutorials/> diff --git a/site/content/arangodb/oem/get-started/how-to-interact-with-arangodb.md b/site/content/arangodb/oem/get-started/how-to-interact-with-arangodb.md new file mode 100644 index 0000000000..896de02759 --- /dev/null +++ b/site/content/arangodb/oem/get-started/how-to-interact-with-arangodb.md @@ -0,0 +1,140 @@ +--- +title: How to Interact With ArangoDB +menuTitle: How to Interact with ArangoDB +weight: 50 +description: >- + Learn about the different ways you can use and communicate with ArangoDB +--- +## How to Communicate with the Server + +The core component of ArangoDB is the [ArangoDB server](../components/arangodb-server/_index.md) +(`arangod`) that stores data and handles requests. You have different options +for talking to the server, through the web interface, command-line tools, +drivers, and the server's REST API. + +### Web Interface + +The easiest way to get started with ArangoDB is to use the included +[web interface](../components/web-interface/_index.md). The ArangoDB server serves this +graphical user interface (GUI) and you can access it by pointing your browser to +the server's endpoint, which is `http://localhost:8529` by default if you run a +local server. + +The web interface lets you perform all essential actions like creating +collections, viewing documents, and running queries. You can also view graphs +and the server logs and metrics, as well as administrate user accounts. + +### Interactive Command-line Interface (CLI) + +If you are a developer, you may feel more comfortable to work in a terminal. +You can use [arangosh](../components/tools/arangodb-shell/_index.md), an interactive shell that ships +with ArangoDB, and its [JavaScript API](../develop/javascript-api/@arangodb/db-object.md), to +interact with the server. You can also use it for automating tasks. + +### Drivers and Integrations + +When you start using ArangoDB in your project, you will likely use an official +or community-made [driver](../develop/drivers/_index.md) written in the same language as your project. +Drivers implement a programming interface that should feel natural for that +programming language, and do all the talking to the server. + +Integrations combine a third-party technology with ArangoDB and can be seen as +a translation layer that takes over the low-level communication with the server. + +### HTTP REST API + +Under the hood, all interactions with the server make use of its RESTful HTTP API. +A [REST](https://en.wikipedia.org/wiki/Representational_state_transfer)-based +API is an application programming interface using the HTTP protocol, the +protocol that powers the world wide web. + +All requests from the outside to the server need to made against the respective +endpoints of this API to perform actions. This includes the web interface, _arangosh_, +as well as the drivers and integrations for different programming languages and +environments. They all provide a convenient way to work with ArangoDB, but you +may use the low-level HTTP API directly as needed. + +See the [HTTP API](../develop/http-api/_index.md) documentation to learn more +about the API, how requests are handled, and what endpoints are available. + +## Set Up and Deploy ArangoDB + +[ArangoDB Starter](../components/tools/arangodb-starter/_index.md) (`arangodb` binary) helps you set up +and deploy ArangoDB instances on bare-metal servers and supports all ArangoDB +deployment modes, such as a single server instance, Active Failover, and cluster +(including Datacenter-to-Datacenter Replication). + +In addition to the Starter, there are also other ways that you can use to deploy +ArangoDB: +- Run the `arangod` executable directly +- [Docker containers](../operations/installation/docker.md) +- [Kubernetes](../deploy/kubernetes.md) +- Use installation packages + +## How to Get Data In and Out of ArangoDB + +With the [*arangoimport*](../components/tools/arangoimport/_index.md) command-line tool, you can +import data from JSON, JSONL, CSV, and TSV formats into a database collection in +ArangoDB. Thanks to its multi-threaded architecture and bulk import capabilities, +you can import your data at high speeds. + +Similarly, with [*arangoexport*](../components/tools/arangoexport/_index.md) you can export data +from your database collection to JSON, JSONL, CSV, TSV, XML, and XGMML formats. + +There are also other alternatives, such as using drivers to write custom importers +or directly using the server's HTTP API. + +## How to Back Up and Restore Data in ArangoDB + +[*arangodump*](../components/tools/arangodump/_index.md) is a command-line tool that lets you +create backups of your data and structural information in a flexible and +efficient manner and can be used for all ArangoDB deployment modes. +With *arangodump*, you can create backups for selected collections or for all +collections of a database, including system collections. Additionally, you can +back up the structural information of your collections (name, indexes, sharding, etc.) +with or without the data stored in them. + +To restore backups created by *arangodump*, you can use +[*arangorestore*](../components/tools/arangorestore/_index.md). Similarly to the backup process, +you can restore either all collections or just specific ones and choose whether +to restore structural information with or without data. + +[*arangobackup*](../components/tools/arangobackup/_index.md) is a command-line tool that enables +you to create instantaneous and consistent [hot backups](../operations/backup-and-restore.md#hot-backups) +of the data and structural information stored in ArangoDB, without interrupting +the database operations. It can be used for all ArangoDB deployment modes. +It is only available in the Enterprise Edition. + +<!-- +## How to Import Data + + + +## How to Operate ArangoDB + + + +TODO: Aspects to incorporate in other content: + +Even for a single document as result, we still get an array at the top level. + +You may have noticed that the order of the returned documents is not necessarily +the same as they were inserted. There is no order guaranteed unless you explicitly +sort them. + +This does still not return the desired result: James (10074) is returned before +John (9883) and Katie (9915). The reason is that the `_key` attribute is a string +in ArangoDB, and not a number. The individual characters of the strings are +compared. `1` is lower than `9` and the result is therefore "correct". If we +wanted to use the numerical value of the `_key` attributes instead, we could +convert the string to a number and use it for sorting. + +It is called a projection if only a subset of attributes is returned. Another +kind of projection is to change the structure of the results. +It is also possible to compute new values, for example by concatenation: + +Pro tip: when defining objects, if the desired attribute key and the variable +to use for the attribute value are the same, you can use a shorthand notation: +`{ sumOfAges }` instead of `{ sumOfAges: sumOfAges }`. + +--> diff --git a/site/content/arangodb/oem/get-started/on-premises-installation.md b/site/content/arangodb/oem/get-started/on-premises-installation.md new file mode 100644 index 0000000000..df93e81006 --- /dev/null +++ b/site/content/arangodb/oem/get-started/on-premises-installation.md @@ -0,0 +1,99 @@ +--- +title: Install ArangoDB on-premises # TODO: distinguish between local and on-premises server deployments? +menuTitle: On-premises installation +weight: 40 +description: >- + How to download and install ArangoDB for using it locally or self-hosting it + on your own hardware +--- +## Installation + +Head to [arangodb.com/download](https://www.arangodb.com/download/), +select your operating system, and download ArangoDB. You may also follow +the instructions on how to install with a package manager, if available. + +If you installed a binary package under Linux, the server is +automatically started. + +If you installed ArangoDB under Windows as a service, the server is +automatically started. Otherwise, run the `arangod.exe` located in the +installation folder's `bin` directory. You may have to run it as administrator +to grant it write permissions to `C:\Program Files`. + +For more in-depth information on how to install ArangoDB, as well as available +startup parameters, installation in a cluster and so on, see +[Installation](../operations/installation/_index.md) and +[Deploy](../deploy/_index.md). + +<!-- +The web interface will become available shortly after you started `arangod`. + +By default, authentication is enabled. The default user is `root`. +Depending on the installation method used, the installation process either +prompted for the root password or the default root password is empty +(see [Securing the installation](.#securing-the-installation)). + +![Web Interface Login Form](../../../../images/loginView.png) + +Next you will be asked which database to use. Every server instance comes with +a `_system` database. Select this database to continue. + +![select database](../../../../images/selectDBView.png) + +You should then be presented the dashboard with server statistics like this: + +![Web Interface Dashboard Request Statistics](../../../../images/dashboardView.png) + +For a more detailed description of the interface, see [Web Interface](../components/web-interface/_index.md). +--> + +## Securing the Installation + +The default installation contains one database `_system` and a user +named `root`. + +Debian-based packages and the Windows installer ask for a +password during the installation process. Red-Hat based packages +set a random password. For all other installation packages, you need to +execute the following: + +``` +shell> arango-secure-installation +``` + +This commands asks for a root password and sets it. + +{{< warning >}} +The password that is set for the root user during the installation of the ArangoDB +package has **no effect** in case of deployments done with the _ArangoDB Starter_. +See [Securing Starter Deployments](../operations/security/securing-starter-deployments.md) instead. +{{< /warning >}} + +<!-- NOT ON-PREMISES SPECIFIC! +Authentication + +ArangoDB allows to restrict access to databases to certain users. All +users of the system database are considered administrators. During +installation a default user *root* is created, which has access to +all databases. + +You should create a database for your application together with a +user that has access rights to this database. See +[Managing Users](../operations/administration/user-management/_index.md). + +Use the *arangosh* to create a new database and user. + +```js +arangosh> db._createDatabase("example"); +arangosh> var users = require("@arangodb/users"); +arangosh> users.save("root@example", "password"); +arangosh> users.grantDatabase("root@example", "example"); +``` + +You can now connect to the new database using the user +*root@example*. + +``` +shell> arangosh --server.username "root@example" --server.database example +``` +--> diff --git a/site/content/arangodb/oem/get-started/set-up-a-cloud-instance.md b/site/content/arangodb/oem/get-started/set-up-a-cloud-instance.md new file mode 100644 index 0000000000..6b74e1c6c9 --- /dev/null +++ b/site/content/arangodb/oem/get-started/set-up-a-cloud-instance.md @@ -0,0 +1,166 @@ +--- +title: Use ArangoDB in the Cloud +menuTitle: Set up a cloud instance +weight: 35 +description: >- + This quick start guide covers the basics from creating an + Arango Managed Platform (AMP) account to setting up and accessing your first + AMP deployment +--- +For general information about the Arango Managed Platform (AMP), see +[dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). + +For guides and reference documentation, see the [AMP documentation](../../../amp/_index.md). + +## Prerequisites + +Please have following information at hand for registration: + +- An **email address**, required for email verification. + +If you use a public email service provider (e.g. Hotmail), make sure to have +the following information at hand as well: + +- A **mobile phone number**, required for SMS verification + +{{< info >}} +One mobile phone number is associated with one account and cannot be +used for multiple accounts. +{{< /info >}} + +## How to Create a New Account + +1. Go to [dashboard.arangodb.cloud](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic). +2. Click the __Start Free__ button or click the __Sign Up__ link in the top + right corner. + + ![ArangoGraph Homepage](../../../images/arangograph-homepage.png) + +3. Review the terms & conditions and privacy policy and click __I accept__. +4. Select the type of sign up you would like to use (GitHub, Google, or + email address). + - For GitHub, Google, and Microsoft please follow the on-screen instructions. + - For the email address option, type your desired email address in the + email field and type a strong password in the password field. + + {{< image src="../../../images/arangograph-create-account.png" alt="ArangoGraph Sign up" style="max-height: 50vh">}} + + Click the __Sign up__ button. You will receive a verification email. In that + mail, click the __Verify my email address__ link or button. + It opens a page in the Arango Managed Platform (AMP) that says __Welcome back!__ +5. Click the __Log in__ button to continue and login. +6. If you signed up with an email address of a public email service provider (e.g. Hotmail), + a form appears asking for your mobile phone number. Enter the country code + and the number of the mobile phone you want to use for this account. + For company email addresses, this step is skipped. +7. If you had to enter your phone number in the previous step, a verification + code is sent via SMS to the mobile number you entered. Enter the + verification code. +8. Fill out a form with your first and last name, and company + name, and then press the __Save__ button. +9. An organization with a default project is now prepared for you. + Once that is completed, you are redirected to the + [AMP dashboard](https://dashboard.arangodb.cloud). + +## Get a Deployment up and Running + +1. The first card in the AMP Dashboard has a dropdown menu to select a cloud + provider and region. Pick one and click __Create deployment__. You can also select + your intended use-case. + + ![ArangoGraph Dashboard](../../../images/arangograph-dashboard-free-tier.png) + + You can also [create a deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) + manually, if you want fine-grained configuration options. +2. The new deployment is displayed in the list of deployments for the + respective project (here: _Avocado_). + + ![ArangoGraph Deployments Bootstrapping](../../../images/arangograph-deployments-bootstrapping.png) + + It takes a couple of minutes before the deployment can be used. The status + is changed from __Bootstrapping__ to __OK__ eventually and you also + receive an email when it is ready. + + {{< image src="../../../images/arangograph-deployment-ready-email.png" alt="ArangoGraph Deployment Ready Email" style="max-height: 50vh">}} + +3. Click the name of the deployment (or the __Open deployment details__ link in + the email) to view the deployment details. + + ![ArangoGraph Deployment Ready](../../../images/arangograph-deployment-ready.png) + +4. Click the __Open database UI__ button to open the ArangoDB web interface. + +5. You can install example datasets and follow the accompanying guides to get + started with ArangoDB and its query language. In the AMP dashboard, click + the __Examples__ tab of the deployment. Click __Install__ for one of the + examples to let AMP create a separate database and import the dataset. + Click __Guide__ for instructions on how to access and run queries against + this data. + + ![ArangoGraph Deployment Examples](../../../images/arangograph-deployment-examples.png) + + ![ArangoGraph Deployment Examples IMDB Guide](../../../images/arangograph-deployment-examples-imdb-guide.png) + +## General Hierarchy + +The Arango Managed Platform (AMP) supports multi-tenant setups via organizations. +You can create your own organization(s) and invite collaborators or join +existing ones via invites. Your organization contains projects. +Your projects hold your deployments. + +- [**Organizations**](../../../amp/organizations/_index.md) + represent (commercial) entities such as companies. + You can be part of multiple organizations with a single user account. + - [**Projects**](../../../amp/projects.md) + represent organizational units such as teams or applications. + - [**Deployments**](../../../amp/deployments/_index.md) + are the actual instances of ArangoDB clusters. + +When you sign up for AMP, an organization and a default project are +automatically created for you. What is still missing is a deployment. + +## Take the Tour + +In the top right corner you find the __User toolbar__. Click the icon with the +question mark to bring up the help menu and choose __Start tour__. This guided +tour walks you through the creation of a deployment and shows you how to load +example datasets and manage projects and deployments. + +![Start tour in menu](../../../images/arangograph-tour-start.png) + +Alternatively, follow the steps of the linked guides: +- [Create a new project](../../../amp/projects.md#how-to-create-a-new-project) (optional) +- [Create a new deployment](../../../amp/deployments/_index.md#how-to-create-a-new-deployment) +- [Install a new certificate](../../../amp/security-and-access-control/x-509-certificates.md) (optional) +- [Access your deployment](../../../amp/deployments/_index.md#how-to-access-your-deployment) +- [Delete your deployment](../../../amp/deployments/_index.md#how-to-delete-a-deployment) + +## Free-to-Try vs. Paid + +The Arango Managed Platform (AMP) comes with a free-to-try tier that lets you test +the Arango cloud for free for 14 days. It includes one project and one small +deployment of 4GB, local backups, and one notebook for learning and data science. +After the trial period, your deployment is automatically deleted. + +You can unlock all features in AMP at any time by adding +your billing details and at least one payment method. See: +- [AMP Packages](../../../amp/organizations/_index.md#amp-packages) +- [How to add billing details to organizations](../../../amp/organizations/billing.md#how-to-add-billing-details) +- [How to add a payment method to an organization](../../../amp/organizations/billing.md#how-to-add-a-payment-method) + +## Managed Cloud Service vs. On-premises Comparison: Key Differences + +The Arango Managed Platform (AMP) aims to make all features of the ArangoDB +[Enterprise Edition](../about/features/enterprise-edition.md) available to you, but +there are a few key differences: + +- Encryption (both at rest & network traffic) is always on and cannot be + disabled for security reasons. +- Foxx services are not allowed to call out to the internet by default for + security reasons, but can be enabled on request. + Incoming calls to Foxx services are fully supported. +- LDAP authentication is not supported. +- Datacenter-to-Datacenter Replication (DC2DC) is not available in a + managed form. + +For more information, see the [comparison between on-premises editions and the managed cloud service](https://www.arangodb.com/subscriptions/). diff --git a/site/content/arangodb/oem/get-started/start-using-aql/_index.md b/site/content/arangodb/oem/get-started/start-using-aql/_index.md new file mode 100644 index 0000000000..bb1d1ac4e5 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/_index.md @@ -0,0 +1,157 @@ +--- +title: Start using AQL +menuTitle: Start using AQL +weight: 52 +description: >- + Learn how to run your first queries written in ArangoDB's Query Language + and how to go from there, using a Game of Thrones dataset +--- +This is an introduction to ArangoDB's query language AQL, built around a small +dataset of characters from the novel and fantasy drama television series +Game of Thrones (as of season 1). It includes character traits in two languages, +some family relations, and last but not least a small set of filming locations, +which makes for an interesting mix of data to work with. + +There is no need to import the data before you start. It is provided as part +of the AQL queries in this tutorial. You can interact with ArangoDB using its +built-in web interface to manage collections and execute the queries with ease, +but you may also use a different interface. + +## How to run AQL queries + +{{< tabs "interfaces" >}} + +{{< tab "Web interface" >}} +ArangoDB's web interface has a **Queries** section for +[executing AQL queries](../../aql/how-to-invoke-aql/with-the-web-interface.md). + +1. If necessary, [switch to the database](../../concepts/data-structure/databases.md#set-the-database-context) + that you want to run queries in. +2. Click **QUERIES** in the main navigation. +3. Enter an AQL query in the code editor, e.g. `RETURN CONCAT("Hello, ", @name)`. +4. Specify any needed bind parameters in the panel on the right-hand side, + e.g. set `name` to a value of `AQL`. +5. Click the **Execute** button or hit `Ctrl`/`Cmd` + `Return`. +{{< /tab >}} + +{{< tab "arangosh" >}} +You can run AQL queries from the ArangoDB Shell ([arangosh](../../components/tools/arangodb-shell/_index.md)) +with the [`db._query()`](../../aql/how-to-invoke-aql/with-arangosh.md#with-db_query) and +[`db._createStatement()`](../../aql/how-to-invoke-aql/with-arangosh.md#with-db_createstatement-arangostatement) +methods of the [`db` object](../../develop/javascript-api/@arangodb/db-object.md). + +```js +--- +name: arangosh_execute_query_bindvars +description: '' +--- +db._query(`RETURN CONCAT("Hello, ", @name)`, { name: "AQL" }).toArray(); +// -- or -- +var name = "AQL"; +db._query(aql`RETURN CONCAT("Hello, ", ${name})`).toArray(); +``` +See [`db._query()`](../../develop/javascript-api/@arangodb/db-object.md#db_queryquerystring--bindvars--mainoptions--suboptions) +in the _JavaScript API_ for details. + +If you use Foxx, see [how to write database queries](../../develop/foxx-microservices/getting-started.md#writing-database-queries) +for examples including tagged template strings. +{{< /tab >}} + +{{< tab "cURL" >}} +You can use a tool like [cURL](https://curl.se/) to run AQL queries from a +command-line, directly using the HTTP REST API of ArangoDB. + +The response bodies are generally compact JSON (without any line breaks and +indentation). You can format them with the [jq](https://jqlang.github.io/jq/) +tool for better readability if you have it installed: + +```sh +curl -d '{"query":"RETURN CONCAT(\"Hello, \", @name)","bindVars":{"name":"AQL"}}' http://localhost:8529/_api/cursor | jq +``` + +See the [`POST /_db/{database-name}/_api/cursor`](../../develop/http-api/queries/aql-queries.md#create-a-cursor) +endpoint in the _HTTP API_ for details. +{{< /tab >}} + +{{< tab "JavaScript" >}} +```js +import { Database, aql } from "arangojs"; +const db = new Database(); + +const name = "AQL"; +const cursor = await db.query(aql`RETURN CONCAT("Hello, ", ${name})`); +const result = cursor.all(); +console.log(result); +``` + +See [`Database.query()`](https://arangodb.github.io/arangojs/latest/classes/databases.Database.html#query) +in the _arangojs_ documentation for details. +{{< /tab >}} + +{{< tab "Go" >}} +```go +ctx := context.Background() +query := `RETURN CONCAT("Hello, ", @name)` +options := arangodb.QueryOptions{ + BindVars: map[string]interface{}{ + "name": "AQL", + }, +} +cursor, err := db.Query(ctx, query, &options) +if err != nil { + log.Fatalf("Failed to run query:\n%v\n", err) +} else { + defer cursor.Close() + var str string + for cursor.HasMore() { + meta, err := cursor.ReadDocument(ctx, &str) + _ = meta // No document metadata with this query, it only returns a string + if err != nil { + log.Fatalf("Failed to read cursor:\n%v\n", err) + } else { + fmt.Println(str) + } + } +} +``` + +See [`DatabaseQuery.Query()`](https://pkg.go.dev/github.com/arangodb/go-driver/v2/arangodb#DatabaseQuery) +in the _go-driver_ v2 documentation for details. +{{< /tab >}} + +{{< tab "Java" >}} +```java +String query = "RETURN CONCAT(\"Hello, \", @name)"; +Map<String, Object> bindVars = Map.of("name", "AQL"); +ArangoCursor<Object> cursor = db.query(query, Object.class, bindVars); +cursor.forEach(result -> System.out.println(result)); +``` + +See [`ArangoDatabase.query()`](https://www.javadoc.io/doc/com.arangodb/arangodb-java-driver/latest/com/arangodb/ArangoDatabase.html#query%28java.lang.String,java.lang.Class,java.util.Map%29) +in the _arangodb-java-driver_ documentation for details. +{{< /tab >}} + +{{< tab "Python" >}} +```py +query = "RETURN CONCAT('Hello, ', @name)" +bind_vars = { "name": "AQL" } +cursor = db.aql.execute(query, bind_vars=bind_vars) +for result in cursor: + print(result) +``` + +See [`AQL.execute()`](https://docs.python-arango.com/en/main/specs.html#arango.aql.AQL.execute) +in the _python-arango_ documentation for details. +{{< /tab >}} + +{{< /tabs >}} + +## Learn the query language + +The following pages guide you through important query constructs for storing +and retrieving data, covering basic as well as some advanced features. + +Afterwards, you can read the [AQL documentation](../../aql/_index.md) for the +full language reference and query examples. + +{{< comment >}}TODO: Advanced data manipulation: attributes, projections, calculations... Aggregation: Grouping techniques{{< /comment >}} diff --git a/site/content/arangodb/oem/get-started/start-using-aql/crud.md b/site/content/arangodb/oem/get-started/start-using-aql/crud.md new file mode 100644 index 0000000000..b68d892df3 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/crud.md @@ -0,0 +1,371 @@ +--- +title: AQL CRUD operations +menuTitle: CRUD operations +weight: 5 +description: >- + Learn how to **c**reate, **r**ead, **u**pdate, and **d**elete documents with + the ArangoDB Query Language +--- +## Create documents + +Before you can insert documents with AQL, you need a place to put them in – a +collection. You can [manage collections](../../concepts/data-structure/collections.md#collection-interfaces) +via different interfaces including the web interface, arangosh, or a driver. +It is not possible to do so with AQL, however. + +1. In the web interface, click **COLLECTIONS** in the main navigation. +2. Click the first card labeled **Add Collection**. +3. Enter `Characters` as the **Name**. +4. Leave the **Type** set to the default value of **Document**. +5. Click the **Save** button. + +The new collection should appear in the list. Next, click **QUERIES** in the +main navigation. To create the first document for the collection with AQL, +use the following AQL query, which you can paste into the query textbox and +run by clicking the **Execute** button: + +```aql +INSERT { + _key: "test", + name: "First", + surname: "Test", + alive: false, + age: 123, + traits: [ "X", "Y" ] +} INTO Characters RETURN NEW +``` + +The syntax is `INSERT document INTO collectionName`. The document is an object +like you may know it from JavaScript or JSON, which is comprised of attribute +key and value pairs. The quotes around the attribute keys are optional in AQL. +Keys are always character sequences (strings), whereas attribute values can +have [different types](../../aql/fundamentals/data-types.md): + +- `null` +- boolean (`true`, `false`) +- number (integer and floating point values) +- string +- array +- object + +The name and surname of the character document you inserted are both string +values. The alive state uses a boolean value. Age is a numeric value. +The traits are an array of strings. The entire document is an object. + +The `RETURN NEW` part is optional and makes the query return the document +including any system attributes that may get added by ArangoDB. If you don't +specify the `_key` attribute then a document key is automatically generated. + +Next, add several characters with a single query: + +```aql +FOR d IN @data + INSERT d INTO Characters +``` + +The `FOR` loop iterates over `@data`, which is a placeholder in the query for +binding the list of characters in JSON format. + +In the web interface, there is a panel for **Bind Variables** on the right-hand +side of the query editor. When you enter a placeholder like `@data` in the editor, +a row appears in the side panel to specify the value for the placeholder. +Paste the following text into the field for the `data` bind variable: + +```json +[ + { "_key": "ned", "name": "Ned", "surname": "Stark", "alive": true, "age": 41, "traits": ["A","H","C","N","P"] }, + { "_key": "robert", "name": "Robert", "surname": "Baratheon", "alive": false, "traits": ["A","H","C"] }, + { "_key": "jaime", "name": "Jaime", "surname": "Lannister", "alive": true, "age": 36, "traits": ["A","F","B"] }, + { "_key": "catelyn", "name": "Catelyn", "surname": "Stark", "alive": false, "age": 40, "traits": ["D","H","C"] }, + { "_key": "cersei", "name": "Cersei", "surname": "Lannister", "alive": true, "age": 36, "traits": ["H","E","F"] }, + { "_key": "daenerys", "name": "Daenerys", "surname": "Targaryen", "alive": true, "age": 16, "traits": ["D","H","C"] }, + { "_key": "jorah", "name": "Jorah", "surname": "Mormont", "alive": false, "traits": ["A","B","C","F"] }, + { "_key": "petyr", "name": "Petyr", "surname": "Baelish", "alive": false, "traits": ["E","G","F"] }, + { "_key": "viserys", "name": "Viserys", "surname": "Targaryen", "alive": false, "traits": ["O","L","N"] }, + { "_key": "jon", "name": "Jon", "surname": "Snow", "alive": true, "age": 16, "traits": ["A","B","C","F"] }, + { "_key": "sansa", "name": "Sansa", "surname": "Stark", "alive": true, "age": 13, "traits": ["D","I","J"] }, + { "_key": "arya", "name": "Arya", "surname": "Stark", "alive": true, "age": 11, "traits": ["C","K","L"] }, + { "_key": "robb", "name": "Robb", "surname": "Stark", "alive": false, "traits": ["A","B","C","K"] }, + { "_key": "theon", "name": "Theon", "surname": "Greyjoy", "alive": true, "age": 16, "traits": ["E","R","K"] }, + { "_key": "bran", "name": "Bran", "surname": "Stark", "alive": true, "age": 10, "traits": ["L","J"] }, + { "_key": "joffrey", "name": "Joffrey", "surname": "Baratheon", "alive": false, "age": 19, "traits": ["I","L","O"] }, + { "_key": "sandor", "name": "Sandor", "surname": "Clegane", "alive": true, "traits": ["A","P","K","F"] }, + { "_key": "tyrion", "name": "Tyrion", "surname": "Lannister", "alive": true, "age": 32, "traits": ["F","K","M","N"] }, + { "_key": "khal", "name": "Khal", "surname": "Drogo", "alive": false, "traits": ["A","C","O","P"] }, + { "_key": "tywin", "name": "Tywin", "surname": "Lannister", "alive": false, "traits": ["O","M","H","F"] }, + { "_key": "davos", "name": "Davos", "surname": "Seaworth", "alive": true, "age": 49, "traits": ["C","K","P","F"] }, + { "_key": "samwell", "name": "Samwell", "surname": "Tarly", "alive": true, "age": 17, "traits": ["C","L","I"] }, + { "_key": "stannis", "name": "Stannis", "surname": "Baratheon", "alive": false, "traits": ["H","O","P","M"] }, + { "_key": "melisandre", "name": "Melisandre", "alive": true, "traits": ["G","E","H"] }, + { "_key": "margaery", "name": "Margaery", "surname": "Tyrell", "alive": false, "traits": ["M","D","B"] }, + { "_key": "jeor", "name": "Jeor", "surname": "Mormont", "alive": false, "traits": ["C","H","M","P"] }, + { "_key": "bronn", "name": "Bronn", "alive": true, "traits": ["K","E","C"] }, + { "_key": "varys", "name": "Varys", "alive": true, "traits": ["M","F","N","E"] }, + { "_key": "shae", "name": "Shae", "alive": false, "traits": ["M","D","G"] }, + { "_key": "talisa", "name": "Talisa", "surname": "Maegyr", "alive": false, "traits": ["D","C","B"] }, + { "_key": "gendry", "name": "Gendry", "alive": false, "traits": ["K","C","A"] }, + { "_key": "ygritte", "name": "Ygritte", "alive": false, "traits": ["A","P","K"] }, + { "_key": "tormund", "name": "Tormund", "surname": "Giantsbane", "alive": true, "traits": ["C","P","A","I"] }, + { "_key": "gilly", "name": "Gilly", "alive": true, "traits": ["L","J"] }, + { "_key": "brienne", "name": "Brienne", "surname": "Tarth", "alive": true, "age": 32, "traits": ["P","C","A","K"] }, + { "_key": "ramsay", "name": "Ramsay", "surname": "Bolton", "alive": true, "traits": ["E","O","G","A"] }, + { "_key": "ellaria", "name": "Ellaria", "surname": "Sand", "alive": true, "traits": ["P","O","A","E"] }, + { "_key": "daario", "name": "Daario", "surname": "Naharis", "alive": true, "traits": ["K","P","A"] }, + { "_key": "missandei", "name": "Missandei", "alive": true, "traits": ["D","L","C","M"] }, + { "_key": "tommen", "name": "Tommen", "surname": "Baratheon", "alive": true, "traits": ["I","L","B"] }, + { "_key": "jaqen", "name": "Jaqen", "surname": "H'ghar", "alive": true, "traits": ["H","F","K"] }, + { "_key": "roose", "name": "Roose", "surname": "Bolton", "alive": true, "traits": ["H","E","F","A"] }, + { "_key": "high-sparrow", "name": "The High Sparrow", "alive": true, "traits": ["H","M","F","O"] } +] +``` + +The data is an array of objects, like `[ {...}, {...}, ... ]`. + +`FOR variableName IN expression` is used to iterate over each element of the +array. In each loop, one element is assigned to the variable `d` (`FOR d IN @data`). +This variable is then used in the `INSERT` statement instead of a literal +object definition. What it does is basically the following: + +```aql +// Invalid query + +INSERT { + "_key": "robert", + "name": "Robert", + "surname": "Baratheon", + "alive": false, + "traits": ["A","H","C"] +} INTO Characters + +INSERT { + "_key": "jaime", + "name": "Jaime", + "surname": "Lannister", + "alive": true, + "age": 36, + "traits": ["A","F","B"] +} INTO Characters + +... +``` + +{{< info >}} +AQL does not permit multiple `INSERT` operations that target the same +collection in a single query. However, you can use a `FOR` loop like in the +above query to insert multiple documents into a collection using a single +`INSERT` operation. +{{< /info >}} + +## Read documents + +There are a couple of documents in the `Characters` collection by now. You can +retrieve them all using a `FOR` loop again. This time, however, it is for +going through all documents in the collection instead of an array: + +```aql +FOR c IN Characters + RETURN c +``` + +The syntax of the loop is `FOR variableName IN collectionName`. For each +document in the collection, `c` is assigned a document, which is then returned +as per the loop body. The query returns all characters you previously stored. + +Among them should be `Ned Stark`, similar to this example: + +```json +[ + { + "_key": "ned", + "_id": "Characters/ned", + "_rev": "_V1bzsXa---", + "name": "Ned", + "surname": "Stark", + "alive": true, + "age": 41, + "traits": ["A","H","C","N","P"] + }, + ... +] +``` + +The document features the attributes you stored, plus a few more added by +the database system. Each document needs a unique `_key`, which identifies it +within a collection. The `_id` is a computed property, a concatenation of the +collection name, a forward slash `/` and the document key. It uniquely identifies +a document within a database. `_rev` is a revision ID managed by the system. + +Document keys can be provided by the user upon document creation, or a unique +value is assigned automatically. It can not be changed later. All three system +attributes starting with an underscore `_` are read-only. + +You can use either the document key or the document ID to retrieve a specific +document with the help of an AQL function `DOCUMENT()`: + +```aql +RETURN DOCUMENT("Characters", "ned") +// --- or --- +RETURN DOCUMENT("Characters/ned") +``` + +```json +[ + { + "_key": "ned", + "_id": "Characters/ned", + "_rev": "_V1bzsXa---", + "name": "Ned", + "surname": "Stark", + "alive": true, + "age": 41, + "traits": ["A","H","C","N","P"] + } +] +``` + +The `DOCUMENT()` function also allows to fetch multiple documents at once: + +```aql +RETURN DOCUMENT("Characters", ["ned", "catelyn"]) +// --- or --- +RETURN DOCUMENT(["Characters/ned", "Characters/catelyn"]) +``` + +```json +[ + [ + { + "_key": "ned", + "_id": "Characters/ned", + "_rev": "_V1bzsXa---", + "name": "Ned", + "surname": "Stark", + "alive": true, + "age": 41, + "traits": ["A","H","C","N","P"] + }, + { + "_key": "catelyn", + "_id": "Characters/catelyn", + "_rev": "_V1bzsXa--B", + "name": "Catelyn", + "surname": "Stark", + "alive": false, + "age": 40, + "traits": ["D","H","C"] + } + ] +] +``` + +See the [`DOCUMENT()` function](../../aql/functions/miscellaneous.md#document) +documentation for more details. + +The `DOCUMENT()` does not let you match documents based on the value of arbitrary +document attributes. It is also not ideal to use the function if the documents +you want to look up are all in the same collection for performance reasons. + +You can replace the call of the `DOCUMENT()` function with the powerful +combination of a `FOR` loop and a `FILTER` operation: + +```aql +FOR c IN Characters + FILTER c._key IN ["ned", "catelyn"] + RETURN c +``` + +This approach enables you to find documents using arbitrary conditions by +changing the filter criteria, but more about this later. + +## Update documents + +According to our `Ned Stark` document, he is alive. When we get to know that he +died, we need to change the `alive` attribute. Modify the existing document: + +```aql +UPDATE "ned" WITH { alive: false } IN Characters +``` + +The syntax is `UPDATE documentKey WITH object IN collectionName`. It updates the +specified document with the attributes listed (or adds them if they don't exist), +but leaves the rest untouched. To replace the entire document content, you may +use `REPLACE` instead of `UPDATE`: + +```aql +REPLACE "ned" WITH { + name: "Ned", + surname: "Stark", + alive: false, + age: 41, + traits: ["A","H","C","N","P"] +} IN Characters +``` + +This also works in a loop, to add a new attribute to all documents for instance: + +```aql +FOR c IN Characters + UPDATE c WITH { season: 1 } IN Characters +``` + +A variable is used instead of a literal document key, to update each document. +The query adds an attribute `season` to the documents' top-level. You can +inspect the result by re-running the query that returns all documents in +collection: + +```aql +FOR c IN Characters + RETURN c +``` + +```json +[ + [ + { + "_key": "ned", + "_id": "Characters/ned", + "_rev": "_V1bzsXa---", + "name": "Ned", + "surname": "Stark", + "alive": false, + "age": 41, + "traits": ["A","H","C","N","P"], + "season": 1 + }, + { + "_key": "catelyn", + "_id": "Characters/catelyn", + "_rev": "_V1bzsXa--B", + "name": "Catelyn", + "surname": "Stark", + "alive": false, + "age": 40, + "traits": ["D","H","C"], + "season": 1 + }, + { + ... + } + ] +] +``` + +## Delete documents + +To fully remove documents from a collection, there is the `REMOVE` operation. +It works similar to the other modification operations, yet without a `WITH` clause: + +```aql +REMOVE "test" IN Characters +``` + +It can also be used in a loop body to effectively truncate a collection +(but less efficient than the dedicated feature to truncate a collection): + +```aql +FOR c IN Characters + REMOVE c IN Characters +``` + +Before you continue with the next chapter, re-run the query that +[creates the character documents](#create-documents) from above to get the data back. diff --git a/site/content/arangodb/oem/get-started/start-using-aql/dataset.md b/site/content/arangodb/oem/get-started/start-using-aql/dataset.md new file mode 100644 index 0000000000..ff1780550f --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/dataset.md @@ -0,0 +1,99 @@ +--- +title: Game of Thrones example dataset +menuTitle: Dataset +weight: 3 +--- +## Characters + +The dataset features 43 characters with their name, surname, age, alive status +and trait references. Each character also has a document key derived from the +character's name. The surname and age properties are not always present. + +| _key | name | surname | alive | age | traits | +|--------------|------------|------------|-------|-----|---------------| +| ned | Ned | Stark | true | 41 | A, H, C, N, P | +| robert | Robert | Baratheon | false | | A, H, C | +| jaime | Jaime | Lannister | true | 36 | A, F, B | +| catelyn | Catelyn | Stark | false | 40 | D, H, C | +| cersei | Cersei | Lannister | true | 36 | H, E, F | +| daenerys | Daenerys | Targaryen | true | 16 | D, H, C | +| jorah | Jorah | Mormont | false | | A, B, C, F | +| petyr | Petyr | Baelish | false | | E, G, F | +| viserys | Viserys | Targaryen | false | | O, L, N | +| jon | Jon | Snow | true | 16 | A, B, C, F | +| sansa | Sansa | Stark | true | 13 | D, I, J | +| arya | Arya | Stark | true | 11 | C, K, L | +| robb | Robb | Stark | false | | A, B, C, K | +| theon | Theon | Greyjoy | true | 16 | E, R, K | +| bran | Bran | Stark | true | 10 | L, J | +| joffrey | Joffrey | Baratheon | false | 19 | I, L, O | +| sandor | Sandor | Clegane | true | | A, P, K, F | +| tyrion | Tyrion | Lannister | true | 32 | F, K, M, N | +| khal | Khal | Drogo | false | | A, C, O, P | +| tywin | Tywin | Lannister | false | | O, M, H, F | +| davos | Davos | Seaworth | true | 49 | C, K, P, F | +| samwell | Samwell | Tarly | true | 17 | C, L, I | +| stannis | Stannis | Baratheon | false | | H, O, P, M | +| melisandre | Melisandre | | true | | G, E, H | +| margaery | Margaery | Tyrell | false | | M, D, B | +| jeor | Jeor | Mormont | false | | C, H, M, P | +| bronn | Bronn | | true | | K, E, C | +| varys | Varys | | true | | M, F, N, E | +| shae | Shae | | false | | M, D, G | +| talisa | Talisa | Maegyr | false | | D, C, B | +| gendry | Gendry | | false | | K, C, A | +| ygritte | Ygritte | | false | | A, P, K | +| tormund | Tormund | Giantsbane | true | | C, P, A, I | +| gilly | Gilly | | true | | L, J | +| brienne | Brienne | Tarth | true | 32 | P, C, A, K | +| ramsay | Ramsay | Bolton | true | | E, O, G, A | +| ellaria | Ellaria | Sand | true | | P, O, A, E | +| daario | Daario | Naharis | true | | K, P, A | +| missandei | Missandei | | true | | D, L, C, M | +| tommen | Tommen | Baratheon | true | | I, L, B | +| jaqen | Jaqen | H'ghar | true | | H, F, K | +| roose | Roose | Bolton | true | | H, E, F, A | +| high-sparrow | The High Sparrow | | true | | H, M, F, O | + +## Traits + +There are 18 unique traits. Each trait has a random letter as document key. +The trait labels come in English and German. + +| _key | en | de | +|------|-------------|---------------| +| A | strong | stark | +| B | polite | freundlich | +| C | loyal | loyal | +| D | beautiful | schön | +| E | sneaky | hinterlistig | +| F | experienced | erfahren | +| G | corrupt | korrupt | +| H | powerful | einflussreich | +| I | naive | naiv | +| J | unmarried | unverheiratet | +| K | skillful | geschickt | +| L | young | jung | +| M | smart | klug | +| N | rational | rational | +| O | ruthless | skrupellos | +| P | brave | mutig | +| Q | mighty | mächtig | +| R | weak | schwach | + +## Locations + +This small collection of 8 filming locations comes with two attributes, +`name` and `coordinates`. The coordinate pairs are modeled as number arrays, +comprised of a latitude and a longitude value each. + +| name | coordinates | +|-----------------|-----------------------| +| Dragonstone | 55.167801, -6.815096 | +| King's Landing | 42.639752, 18.110189 | +| The Red Keep | 35.896447, 14.446442 | +| Yunkai | 31.046642, -7.129532 | +| Astapor | 31.509740, -9.774249 | +| Winterfell | 54.368321, -5.581312 | +| Vaes Dothrak | 54.167760, -6.096125 | +| Beyond the wall | 64.265473, -21.094093 | diff --git a/site/content/arangodb/oem/get-started/start-using-aql/filter.md b/site/content/arangodb/oem/get-started/start-using-aql/filter.md new file mode 100644 index 0000000000..0be386c435 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/filter.md @@ -0,0 +1,137 @@ +--- +title: Match documents with `FILTER` +menuTitle: Match documents +weight: 10 +--- +So far, you either looked up a single document, or returned the entire character +collection. For the lookup, you used the `DOCUMENT()` function, which means you +can only find documents by their key or ID. + +To find documents that fulfill certain criteria more complex than key equality, +there is the `FILTER` operation in AQL, which enables you to formulate arbitrary +conditions for documents to match. + +## Equality condition + +```aql +FOR c IN Characters + FILTER c.name == "Ned" + RETURN c +``` + +The filter condition reads like: "the `name` attribute of a character document +must be equal to the string `Ned`". If the condition applies, character +document gets returned. This works with any attribute likewise: + +```aql +FOR c IN Characters + FILTER c.surname == "Stark" + RETURN c +``` + +## Range conditions + +Strict equality is one possible condition you can state. There are plenty of +other conditions you can formulate, however. For example, you could ask for all +adult characters: + +```aql +FOR c IN Characters + FILTER c.age >= 13 + RETURN c.name +``` + +```json +[ + "Joffrey", + "Tyrion", + "Samwell", + "Ned", + "Catelyn", + "Cersei", + "Jon", + "Sansa", + "Brienne", + "Theon", + "Davos", + "Jaime", + "Daenerys" +] +``` + +The operator `>=` stands for *greater-or-equal*, so every character of age 13 +or older is returned (only their name in the example). You can return names +and age of all characters younger than 13 by changing the operator to +*less-than* and using the object syntax to define a subset of attributes to +return: + +```aql +FOR c IN Characters + FILTER c.age < 13 + RETURN { name: c.name, age: c.age } +``` + +```json +[ + { "name": "Tommen", "age": null }, + { "name": "Arya", "age": 11 }, + { "name": "Roose", "age": null }, + ... +] +``` + +You may notice that it returns name and age of 30 characters, most with an +age of `null`. The reason for this is, that `null` is the fallback value if +an attribute is requested by the query, but no such attribute exists in the +document, and the `null` is compares to numbers as lower (see +[Type and value order](../../aql/fundamentals/type-and-value-order.md)). Hence, it +accidentally fulfills the age criterion `c.age < 13` (`null < 13`). + +## Multiple conditions + +To not let documents pass the filter without an age attribute, you can add a +second criterion: + +```aql +FOR c IN Characters + FILTER c.age < 13 + FILTER c.age != null + RETURN { name: c.name, age: c.age } +``` + +```json +[ + { "name": "Arya", "age": 11 }, + { "name": "Bran", "age": 10 } +] +``` + +This could equally be written with a boolean `AND` operator as: + +```aql +FOR c IN Characters + FILTER c.age < 13 AND c.age != null + RETURN { name: c.name, age: c.age } +``` + +And the second condition could as well be `c.age > null`. + +## Alternative conditions + +If you want documents to fulfill one or another condition, possibly for +different attributes as well, use `OR`: + +```aql +FOR c IN Characters + FILTER c.name == "Jon" OR c.name == "Joffrey" + RETURN { name: c.name, surname: c.surname } +``` + +```json +[ + { "name": "Joffrey", "surname": "Baratheon" }, + { "name": "Jon", "surname": "Snow" } +] +``` + +See more details about [Filter operations](../../aql/high-level-operations/filter.md). diff --git a/site/content/arangodb/oem/get-started/start-using-aql/geo.md b/site/content/arangodb/oem/get-started/start-using-aql/geo.md new file mode 100644 index 0000000000..9f7d008620 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/geo.md @@ -0,0 +1,144 @@ +--- +title: Geospatial queries +menuTitle: Geospatial queries +weight: 30 +--- +Geospatial coordinates consisting of a latitude and longitude value +can be stored either as two separate attributes, or as a single +attribute in the form of an array with both numeric values. +ArangoDB can index such coordinates for fast geospatial queries. + +## Locations data + +Insert some filming locations into a new collection called `Locations`, +which you need to create first, and then run below AQL query: + +```aql +LET places = [ + { "name": "Dragonstone", "coordinates": [ 55.167801, -6.815096 ] }, + { "name": "King's Landing", "coordinates": [ 42.639752, 18.110189 ] }, + { "name": "The Red Keep", "coordinates": [ 35.896447, 14.446442 ] }, + { "name": "Yunkai", "coordinates": [ 31.046642, -7.129532 ] }, + { "name": "Astapor", "coordinates": [ 31.50974, -9.774249 ] }, + { "name": "Winterfell", "coordinates": [ 54.368321, -5.581312 ] }, + { "name": "Vaes Dothrak", "coordinates": [ 54.16776, -6.096125 ] }, + { "name": "Beyond the wall", "coordinates": [ 64.265473, -21.094093 ] } +] + +FOR place IN places + INSERT place INTO Locations + RETURN GEO_POINT(NEW.coordinates[1], NEW.coordinates[0]) +``` + +The last line of the query returns the locations as GeoJSON Points to make the +web interface render a map with markers to give you a visualization of where +the filming locations are. Note that the coordinate order is longitude, than +latitude with GeoJSON, whereas the dataset uses latitude, longitude. + +## Geospatial index + +To query based on coordinates, a [geo index](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md) +is required. It determines which fields contain the latitude and longitude +values. + +1. Click **COLLECTIONS** in the main navigation. +2. Click the card of the **Locations** collection. +3. Switch to the **Indexes** tab at the top. +4. Click the **Add Index** button. +5. Change the **Type** to **Geo Index**. +6. Enter `coordinates` into **Fields**. +7. Click the **Create** button to confirm. + +## Find nearby locations + +A `FOR` loop is used again, with a subsequent `SORT` operation based on the +`DISTANCE()` between a stored coordinate pair and a coordinate pair given in a query. +This pattern is recognized by the query optimizer. A geo index will be used to +accelerate such queries if one is available. + +The default sorting direction is ascending, so a query finds the coordinates +closest to the reference point first (lowest distance). `LIMIT` can be used +to restrict the number of results to at most *n* matches. + +In below example, the limit is set to 3. The origin (the reference point) is +a coordinate pair somewhere downtown in Dublin, Ireland: + +```aql +FOR loc IN Locations + LET distance = DISTANCE(loc.coordinates[0], loc.coordinates[1], 53.35, -6.25) + SORT distance + LIMIT 3 + RETURN { + name: loc.name, + latitude: loc.coordinates[0], + longitude: loc.coordinates[1], + distance + } +``` + +```json +[ + { + "name": "Vaes Dothrak", + "latitude": 54.16776, + "longitude": -6.096125, + "distance": 91491.58596795711 + }, + { + "name": "Winterfell", + "latitude": 54.368321, + "longitude": -5.581312, + "distance": 121425.66829502625 + }, + { + "name": "Dragonstone", + "latitude": 55.167801, + "longitude": -6.815096, + "distance": 205433.7784182078 + } +] +``` + +The query returns the location name, as well as the coordinates and the +calculated distance in meters. The coordinates are returned as two separate +attributes. You may return just the document with a simple `RETURN loc` instead +if you want. Or return the whole document with an added distance attribute using +`RETURN MERGE(loc, { distance })`. + +## Find locations within radius + +`LIMIT` can be swapped out with a `FILTER` that checks the distance, to find +locations within a given radius from a reference point. Remember that the unit +is meters. The example uses a radius of 200,000 meters (200 kilometers): + +```aql +FOR loc IN Locations + LET distance = DISTANCE(loc.coordinates[0], loc.coordinates[1], 53.35, -6.25) + SORT distance + FILTER distance < 200 * 1000 + RETURN { + name: loc.name, + latitude: loc.coordinates[0], + longitude: loc.coordinates[1], + distance: ROUND(distance / 1000) + } +``` + +```json +[ + { + "name": "Vaes Dothrak", + "latitude": 54.16776, + "longitude": -6.096125, + "distance": 91 + }, + { + "name": "Winterfell", + "latitude": 54.368321, + "longitude": -5.581312, + "distance": 121 + } +] +``` + +The distances are converted to kilometers and rounded for readability. diff --git a/site/content/arangodb/oem/get-started/start-using-aql/graphs.md b/site/content/arangodb/oem/get-started/start-using-aql/graphs.md new file mode 100644 index 0000000000..2bc5ff07b2 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/graphs.md @@ -0,0 +1,303 @@ +--- +title: Graphs and traversals +menuTitle: Graphs and traversals +weight: 25 +description: >- + How relations such as between parents and children can be modeled as graph + and how they can be queried +--- +Relations such as between parents and children can be modeled as graph. +In ArangoDB, two documents (a parent and a child character document) can be +linked by an edge document. Edge documents are stored in edge collections and +have two additional attributes: `_from` and `_to`. They reference any two +documents by their document IDs (`_id`). + +## ChildOf relations + +Our characters have the following relations between parents and children +(first names only for a better overview): + +``` + Robb -> Ned + Sansa -> Ned + Arya -> Ned + Bran -> Ned + Jon -> Ned + Robb -> Catelyn + Sansa -> Catelyn + Arya -> Catelyn + Bran -> Catelyn + Jaime -> Tywin + Cersei -> Tywin + Tyrion -> Tywin + Joffrey -> Jaime + Joffrey -> Cersei +``` + +Visualized as a graph: + +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) + +## Creating the edges + +To create the required edge documents to store these relations in the database, +you can run a query that combines joining and filtering to match up the right +character documents, then use their `_id` attribute to insert an edge into an +edge collection called `ChildOf`. + +1. Click **COLLECTIONS** in the main navigation. +2. Click the first card labelled **Add collection**. +3. Enter `ChildOf` as the **Name**. +4. Change the collection type to **Edge**. + +Then run the following query: + +```aql +LET relations = [ + { "parent": "ned", "child": "robb" }, + { "parent": "ned", "child": "sansa" }, + { "parent": "ned", "child": "arya" }, + { "parent": "ned", "child": "bran" }, + { "parent": "catelyn", "child": "robb" }, + { "parent": "catelyn", "child": "sansa" }, + { "parent": "catelyn", "child": "arya" }, + { "parent": "catelyn", "child": "bran" }, + { "parent": "ned", "child": "jon" }, + { "parent": "tywin", "child": "jaime" }, + { "parent": "tywin", "child": "cersei" }, + { "parent": "tywin", "child": "tyrion" }, + { "parent": "cersei", "child": "joffrey" }, + { "parent": "jaime", "child": "joffrey" } +] + +FOR rel in relations + INSERT { + _from: CONCAT("Characters/", rel.child), + _to: CONCAT("Characters/", rel.parent) + } INTO ChildOf + RETURN NEW +``` + +Breakdown of the query: + +- Assign the relations in form of an array of objects with a `parent` and + a `child` attribute each, both with the document key of the character. +- For each element in this array, assign a relation to a variable `rel` and + execute the subsequent instructions. + - Insert a new edge document into the ChildOf collection, with the edge going + from `child` to `parent`. The `_from` and `_to` edge attributes require + document IDs like `collection/key`. Therefore, the document keys derived + from the character names are prefixed with `Characters/` to obtain the IDs. + No other attributes are set for the edge in this example. + - Return the new edge document (optional) + +## Traverse to the parents + +Now that edges link character documents (vertices), it is a graph you can +query to find out who the parents are of another character – or in +graph terms, you want to start at a vertex and follow the edges to other +vertices in an [AQL graph traversal](../../aql/graphs/traversals.md): + +```aql +// Declare collection of start vertex (cluster only) +WITH Characters + +FOR v IN 1..1 OUTBOUND "Characters/bran" ChildOf + RETURN v.name +``` + +This `FOR` loop doesn't iterate over a collection or an array, it walks the +graph and iterates over the connected vertices it finds, with the vertex +document assigned to a variable (here: `v`). It can also emit the edges it +walked as well as the full path from start to end to +[another two variables](../../aql/graphs/traversals.md#syntax). + +In above query, the traversal is restricted to a minimum and maximum traversal +depth of 1 (how many steps to take from the start vertex), and to only follow +edges in `OUTBOUND` direction. Our edges point from child to parent, and the +parent is one step away from the child, thus it gives you the parents of the +child you start at. `"Characters/bran"` is that start vertex. + +To determine the ID of e.g. the Joffrey Baratheon document, you may iterate over +the collection of characters, filter by the name or other criteria, and return +the `_id` attribute: + +```aql +FOR c IN Characters + FILTER c.surname == "Baratheon" AND c.age != null + RETURN c._id +``` + +```json +[ "Characters/joffrey" ] +``` + +You may also combine this query with the traversal directly, to easily change +the start vertex by adjusting the filter condition(s): + +```aql +FOR c IN Characters + FILTER c.surname == "Baratheon" AND c.age != null + FOR v IN 1..1 OUTBOUND c ChildOf + RETURN v.name +``` + +The start vertex is followed by `ChildOf`, which is our edge collection. The +example query returns only the name of each parent to keep the result short: + +```json +[ + "Jaime", + "Cersei" +] +``` + +For Robb, Sansa, Arya, and Bran as the starting point, the result is Catelyn and +Ned, and for Jon Snow it is only Ned. + +Be mindful of the `FILTER` criteria. If more than one character fulfills the +conditions, there will be multiple traversals. And with the query as it is, +all of the parent names would be combined into a single list: + +```aql +FOR c IN Characters + FILTER c.surname == "Lannister" + FOR v IN 1..1 OUTBOUND c ChildOf + RETURN v.name +``` + +```json +[ + "Tywin", + "Tywin", + "Tywin" +] +``` + +You can achieve a more useful output by returning the result of each traversal +as a separate list and set the minimum traversal depth to `0` to include the +start vertex. This lets you see the child's name as the first element of each +array, followed by the parent name(s) if this information is available. + +```aql +FOR c IN Characters + FILTER c.surname == "Lannister" + RETURN (FOR v IN 0..1 OUTBOUND c ChildOf + RETURN v.name) +``` + +```json +[ + [ + "Jaime", + "Tywin" + ], + [ + "Cersei", + "Tywin" + ], + [ + "Tyrion", + "Tywin" + ], + [ + "Tywin" + ] +] +``` + +## Traverse to the children + +You can also walk from a parent in reverse edge direction (`INBOUND` that is) +to the children: + +```aql +FOR c IN Characters + FILTER c.name == "Ned" + FOR v IN 1..1 INBOUND c ChildOf + RETURN v.name +``` + +```json +[ + "Robb", + "Sansa", + "Jon", + "Arya", + "Bran" +] +``` + +## Traverse to the grandchildren + +For the Lannister family, there are relations that span from parent to +grandchild. Change the traversal depth to return grandchildren, +which means to go exactly two steps: + +```aql +FOR c IN Characters + FILTER c.name == "Tywin" + FOR v IN 2..2 INBOUND c ChildOf + RETURN v.name +``` + +```json +[ + "Joffrey", + "Joffrey" +] +``` + +It might be a bit unexpected, that Joffrey is returned twice. However, if you +look at the graph visualization, you can see that multiple paths lead from +Joffrey (bottom right) to Tywin: + +![ChildOf graph visualization](../../../../images/ChildOf_Graph.png) + +``` +Tywin <- Jaime <- Joffrey +Tywin <- Cersei <- Joffrey +``` + +As a quick fix, change the last line of the query to `RETURN DISTINCT v.name` +to return each value only once. However, there are +[traversal options](../../aql/graphs/traversals.md#syntax) including one to +suppress duplicate vertices early on for the entire traversal (which requires +breadth-first search): + +```aql +FOR c IN Characters + FILTER c.name == "Tywin" + FOR v IN 2..2 INBOUND c ChildOf OPTIONS { uniqueVertices: "global", order: "bfs" } + RETURN v.name +``` + +```json +[ + "Joffrey" +] +``` + +## Traverse with variable depth + +To return the parents and grandparents of Joffrey, you can walk edges in +`OUTBOUND` direction and adjust the traversal depth to go at least 1 step, +and 2 at most: + +```aql +FOR c IN Characters + FILTER c.name == "Joffrey" + FOR v IN 1..2 OUTBOUND c ChildOf + RETURN DISTINCT v.name +``` + +```json +[ + "Cersei", + "Tywin", + "Jaime" +] +``` + +With deeper family trees, it would only be a matter of changing the depth +values to query for great-grandchildren and similar relations. diff --git a/site/content/arangodb/oem/get-started/start-using-aql/joins.md b/site/content/arangodb/oem/get-started/start-using-aql/joins.md new file mode 100644 index 0000000000..abf30c9045 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/joins.md @@ -0,0 +1,323 @@ +--- +title: References and joins +menuTitle: References and joins +weight: 20 +--- +## References to other documents + +The character data you imported has an attribute `traits` for each character, +which is an array of strings. It does not store character features directly, +however: + +```json +{ + "_key": "ned", + "name": "Ned", + "surname": "Stark", + "alive": false, + "age": 41, + "traits": ["A","H","C","N","P"] +} +``` + +It is rather a list of letters without an apparent meaning. The idea here is +that `traits` is supposed to store documents keys of another collection, which +you can use to resolve the letters to labels such as "strong". The benefit of +using another collection for the actual traits is, that you can easily query +for all existing traits later on and store labels in multiple languages for +instance in a central place. If you would embed traits directly... + +```json +{ + "_key": "ned", + "name": "Ned", + "surname": "Stark", + "alive": false, + "age": 41, + "traits": [ + { + "de": "stark", + "en": "strong" + }, + { + "de": "einflussreich", + "en": "powerful" + }, + { + "de": "loyal", + "en": "loyal" + }, + { + "de": "rational", + "en": "rational" + }, + { + "de": "mutig", + "en": "brave" + } + ] +} +``` + +... it becomes difficult to maintain traits. If you were to rename or +translate one of them, you would need to find all other character documents +with the same trait and perform the changes there too. If you only refer to a +trait in another collection, it is as easy as updating a single document. + +{{< comment >}}What if Trait doc is deleted? DOCUMENT() skips null{{< /comment >}} + +## Importing traits + +1. In the web interface, create a document collection called `Traits`. +2. Enter the following AQL query: + ```aql + FOR trait IN @data + INSERT trait INTO Traits + ``` +3. Set the following for the `data` bind variable: + ```json + [ + { "_key": "A", "en": "strong", "de": "stark" }, + { "_key": "B", "en": "polite", "de": "freundlich" }, + { "_key": "C", "en": "loyal", "de": "loyal" }, + { "_key": "D", "en": "beautiful", "de": "schön" }, + { "_key": "E", "en": "sneaky", "de": "hinterlistig" }, + { "_key": "F", "en": "experienced", "de": "erfahren" }, + { "_key": "G", "en": "corrupt", "de": "korrupt" }, + { "_key": "H", "en": "powerful", "de": "einflussreich" }, + { "_key": "I", "en": "naive", "de": "naiv" }, + { "_key": "J", "en": "unmarried", "de": "unverheiratet" }, + { "_key": "K", "en": "skillful", "de": "geschickt" }, + { "_key": "L", "en": "young", "de": "jung" }, + { "_key": "M", "en": "smart", "de": "klug" }, + { "_key": "N", "en": "rational", "de": "rational" }, + { "_key": "O", "en": "ruthless", "de": "skrupellos" }, + { "_key": "P", "en": "brave", "de": "mutig" }, + { "_key": "Q", "en": "mighty", "de": "mächtig" }, + { "_key": "R", "en": "weak", "de": "schwach" } + ] + ``` +4. Execute the query to import the trait data. + +## Resolving traits + +Start simple by returning only the traits attribute of each character: + +```aql +FOR c IN Characters + RETURN c.traits +``` + +```json +[ + ["A","H","C","N","P"], + ["D","H","C"], + ... +] +``` + +Also see the [Fundamentals of Objects / Documents](../../aql/fundamentals/data-types.md#objects--documents) +about attribute access. + +You can use the `traits` array together with the `DOCUMENT()` function to use +the elements as document keys and look them up in the `Traits` collection: + +```aql +FOR c IN Characters + RETURN DOCUMENT("Traits", c.traits) +``` + +```json +[ + [ + { + "_key": "A", + "_id": "Traits/A", + "_rev": "_V5oRUS2---", + "en": "strong", + "de": "stark" + }, + { + "_key": "H", + "_id": "Traits/H", + "_rev": "_V5oRUS6--E", + "en": "powerful", + "de": "einflussreich" + }, + { + "_key": "C", + "_id": "Traits/C", + "_rev": "_V5oRUS6--_", + "en": "loyal", + "de": "loyal" + }, + { + "_key": "N", + "_id": "Traits/N", + "_rev": "_V5oRUT---D", + "en": "rational", + "de": "rational" + }, + { + "_key": "P", + "_id": "Traits/P", + "_rev": "_V5oRUTC---", + "en": "brave", + "de": "mutig" + } + ], + [ + { + "_key": "D", + "_id": "Traits/D", + "_rev": "_V5oRUS6--A", + "en": "beautiful", + "de": "schön" + }, + { + "_key": "H", + "_id": "Traits/H", + "_rev": "_V5oRUS6--E", + "en": "powerful", + "de": "einflussreich" + }, + { + "_key": "C", + "_id": "Traits/C", + "_rev": "_V5oRUS6--_", + "en": "loyal", + "de": "loyal" + } + ], + ... +] +``` + +The [`DOCUMENT()` function](../../aql/functions/miscellaneous.md#document) can be used +to look up a single or multiple documents via document identifiers. In our +example, you pass the collection name from which you want to fetch documents +as first argument (`"Traits"`) and an array of document keys (`_key` attribute) +as second argument. In return, you get an array of the full trait documents +for each character. + +This is a bit too much information, so only return English labels using +the [array expansion](../../aql/operators.md#array-expansion) notation: + +```aql +FOR c IN Characters + RETURN DOCUMENT("Traits", c.traits)[*].en +``` + +```json +[ + [ + "strong", + "powerful", + "loyal", + "rational", + "brave" + ], + [ + "beautiful", + "powerful", + "loyal" + ], + ... +] +``` + +## Merging characters and traits + +Great, you resolved the letters to meaningful traits! But you also need to know +to which character they belong. Thus, you need to merge both the character +document and the data from the trait documents: + +```aql +FOR c IN Characters + RETURN MERGE(c, { traits: DOCUMENT("Traits", c.traits)[*].en } ) +``` + +```json +[ + { + "_id": "Characters/ned", + "_key": "ned", + "_rev": "_V1bzsXa---", + "age": 41, + "alive": false, + "name": "Ned", + "surname": "Stark", + "traits": [ + "strong", + "powerful", + "loyal", + "rational", + "brave" + ] + }, + { + "_id": "Characters/catelyn", + "_key": "catelyn", + "_rev": "_V1bzsXa--B", + "age": 40, + "alive": false, + "name": "Catelyn", + "surname": "Stark", + "traits": [ + "beautiful", + "powerful", + "loyal" + ] + }, + ... +] +``` + +The `MERGE()` functions merges objects together. Because you used an object +`{ traits: ... }` which has the same attribute name `traits` as the original +character attribute, the latter got overwritten by the merge operation. + +## Join another way + +The `DOCUMENT()` function utilizes primary indexes to look up documents quickly. +It is limited to find documents via their identifiers however. For a use case +like in our example it is sufficient to accomplish a simple join. + +There is another, more flexible syntax for joins: nested `FOR` loops over +multiple collections, with a `FILTER` condition to match up attributes. +In case of the traits key array, there needs to be a third loop to iterate +over the keys: + +```aql +FOR c IN Characters + RETURN MERGE(c, { + traits: ( + FOR key IN c.traits + FOR t IN Traits + FILTER t._key == key + RETURN t.en + ) + }) +``` + +For each character, it loops over its `traits` attribute (e.g. `["D","H","C"]`) +and for each document reference in this array, it loops over the `Traits` +collections. There is a condition to match the document key with the key +reference. The inner `FOR` loop and the `FILTER` get transformed to a primary +index lookup in this case instead of building up a Cartesian product only to +filter away everything but a single match: Document keys within a collection +are unique, thus there can only be one match. + +Each written-out, English trait is returned and all the traits are then merged +with the character document. The result is identical to the query using +`DOCUMENT()`. However, this approach with a nested `FOR` loop and a `FILTER` +is not limited to primary keys. You can do this with any other attribute as well. +For an efficient lookup, make sure you add a persistent index for this attribute. +If its values are unique, then also set the index option to unique. + +Another advantage of the `FOR` loop approach is the performance compared to +calling the `DOCUMENT()` function: The query optimizer can optimize AQL queries +better that iterate over a collection and possibly filter by attributes and only +make use of a subset of the found documents. With the `DOCUMENT()` function, +there are individual lookups, potentially across all collections, and the full +documents need to be loaded regardless of which attributes are actually used. diff --git a/site/content/arangodb/oem/get-started/start-using-aql/sort-limit.md b/site/content/arangodb/oem/get-started/start-using-aql/sort-limit.md new file mode 100644 index 0000000000..553924c379 --- /dev/null +++ b/site/content/arangodb/oem/get-started/start-using-aql/sort-limit.md @@ -0,0 +1,183 @@ +--- +title: Sort and limit +menuTitle: Sort and limit +weight: 15 +--- +## Cap the result count with `LIMIT` + +It may not always be necessary to return all documents, that a `FOR` loop +would normally return. You can limit the amount of documents +with a `LIMIT` operation: + +```aql +FOR c IN Characters + LIMIT 5 + RETURN c.name +``` + +```json +[ + "Joffrey", + "Tommen", + "Tyrion", + "Roose", + "Tywin" +] +``` + +`LIMIT` is followed by a number for the maximum document count. There is a +second syntax however, which allows you to skip a certain amount of record +and return the next *n* documents: + +```aql +FOR c IN Characters + LIMIT 2, 5 + RETURN c.name +``` + +```json +[ + "Tyrion", + "Roose", + "Tywin", + "Samwell", + "Melisandre" +] +``` + +See how the second query skipped the first two names and returned the next +five (both results feature Tyrion, Roose and Tywin). + +## Sort by name with `SORT` + +The order in which matching records were returned by the queries shown until +here was basically random. To return them in a defined order, you can add a +`SORT()` operation. It can have a big impact on the result if combined with +a `LIMIT()`, because the result becomes predictable if you sort first. + +```aql +FOR c IN Characters + SORT c.name + LIMIT 10 + RETURN c.name +``` + +```json +[ + "Arya", + "Bran", + "Brienne", + "Bronn", + "Catelyn", + "Cersei", + "Daario", + "Daenerys", + "Davos", + "Ellaria" +] +``` + +See how it sorted by name, then returned the ten alphabetically first coming +names. You can reverse the sort order with `DESC` like descending: + +```aql +FOR c IN Characters + SORT c.name DESC + LIMIT 10 + RETURN c.name +``` + +```json +[ + "Ygritte", + "Viserys", + "Varys", + "Tywin", + "Tyrion", + "Tormund", + "Tommen", + "Theon", + "The High Sparrow", + "Talisa" +] +``` + +The first sort was ascending, which is the default order. Because it is the +default, it is not required to explicitly ask for `ASC` order. + +## Sort by multiple attributes + +Assume you want to sort by surname. Many of the characters share a surname. +The result order among characters with the same surname is undefined. You can +first sort by `surname`, then `name`, to determine the order: + +```aql +FOR c IN Characters + FILTER c.surname + SORT c.surname, c.name + LIMIT 10 + RETURN { + surname: c.surname, + name: c.name + } +``` + +```json +[ + { "surname": "Baelish", "name": "Petyr" }, + { "surname": "Baratheon", "name": "Joffrey" }, + { "surname": "Baratheon", "name": "Robert" }, + { "surname": "Baratheon", "name": "Stannis" }, + { "surname": "Baratheon", "name": "Tommen" }, + { "surname": "Bolton", "name": "Ramsay" }, + { "surname": "Bolton", "name": "Roose" }, + { "surname": "Clegane", "name": "Sandor" }, + { "surname": "Drogo", "name": "Khal" }, + { "surname": "Giantsbane", "name": "Tormund" } +] +``` + +Overall, the documents are sorted by last name. If the `surname` is the same +for two characters, the `name` values are compared and the result sorted. + +Note that a filter is applied before sorting, to only let documents through, +that actually feature a surname value (many don't have it and would cause +`null` values in the result). + +## Sort by age + +The order can also be determined by a numeric value, such as the age: + +```aql +FOR c IN Characters + FILTER c.age + SORT c.age + LIMIT 10 + RETURN { + name: c.name, + age: c.age + } +``` + +```json +[ + { "name": "Bran", "age": 10 }, + { "name": "Arya", "age": 11 }, + { "name": "Sansa", "age": 13 }, + { "name": "Jon", "age": 16 }, + { "name": "Theon", "age": 16 }, + { "name": "Daenerys", "age": 16 }, + { "name": "Samwell", "age": 17 }, + { "name": "Joffrey", "age": 19 }, + { "name": "Tyrion", "age": 32 }, + { "name": "Brienne", "age": 32 } +] +``` + +A filter is applied to avoid documents without age attribute. The remaining +documents are sorted by age in ascending order, and the name and age of the +ten youngest characters are returned. + +See the [SORT operation](../../aql/high-level-operations/sort.md) and +[LIMIT operation](../../aql/high-level-operations/limit.md) documentation for +more details. diff --git a/site/content/arangodb/oem/graphs/_index.md b/site/content/arangodb/oem/graphs/_index.md new file mode 100644 index 0000000000..e0f8c3da89 --- /dev/null +++ b/site/content/arangodb/oem/graphs/_index.md @@ -0,0 +1,431 @@ +--- +title: Graphs +menuTitle: Graphs +weight: 75 +description: >- + Graphs let you represent things and the relationships between them using + vertices and edges, to naturally model knowledge, social networks, cash flows, + supply chains, and other information webs, and to extract valuable insights by + analyzing this connected data +aliases: + - graphs/first-steps +--- +Graphs are information networks comprised of **nodes** and **relations**. Nodes +can represent objects, entities, abstract concepts, or ideas. Relations between +nodes can represent physical and social connections, temporal and causal +relationships, flows of information, energy, and material, interactions and +transactions, dependency and hierarchy, as well as similarity and relatedness of +any kind. + +![Node - Relation - Node](../../../images/data-model-graph-relation-abstract.png) + +For example, you can represent people by nodes and their friendships by +relations. This lets you form a graph that is a social network in this case. + +![Mary - is friend of - John](../../../images/data-model-graph-relation-concrete.png) + +The specific terms to refer to nodes and relations in a graph vary depending +on the field or context, but they are conceptually the same. In computer science +and mathematics, the terms **vertices** (singular: vertex) and **edges** are +commonly used to refer to nodes and relations, respectively. In information +science and data analysis, they are referred to as _entities_ and _connection_. +In social sciences, they are often called _actors_ and _ties_ or _links_. +They may also be called _points_ and _arcs_. + +Using graphs with vertices to represent things and edges to define how they +relate to one another is a very expressive data model. It lets you represent +a wide variety of information in a compact and intuitive way. It lets you model +complex relationships and interactions of basically everything. + +![Mary - bought - Book, is friend of - John](../../../images/data-model-graph-relations.png) + +Graphs are commonly directed (_digraphs_), which means that each edge goes from +one vertex to another vertex in a specific direction. This lets you model +directional relationships, such as cause and effect or the flow of material, +energy, or information. In undirected graphs, edges don't have a direction and +the relationship between two vertices is considered to be the same in both +directions. For example, a friendship is a symmetrical relationships. If _Mary_ +is a friend of _John_, then _John_ is equally a friend of _Mary_. On the other +hand, _Mary_ may subscribe to what _John_ posts online, but this does not +automatically make _John_ a subscriber of _Mary_'s posts. It is an asymmetrical +relationship in graph terms. These two types of graphs have different properties +and different algorithms exist to analyze the data. + +{{< info >}} +New to graphs? [Take our free graph course for freshers](https://www.arangodb.com/arangodb-graph-course/) +and get from zero knowledge to advanced query techniques. +{{< /info >}} + +## Graph model + +Graph database systems like ArangoDB can store graphs and provide means to query +the connected data. + +ArangoDB's graph model is that of a **property graph**. Every record, whether +vertex or edge, can have an arbitrary number of properties. Each document is a +fully-fledged JSON object and has a unique identifier. +This is different to the RDF graph model, where information is broken down into +triples of a subject, a predicate, and an object and where each triple is stored +separately, without an identifier for each statement. + +Furthermore, ArangoDB's graph model can be classified as a **labeled** property +graph because you can group related edges using edge collections, with the +collection name being the label, but you can also use a property to assign one +or more types to an edge. You can also organize vertices in different +collections based on the types of entities. + +Edges can only be stored in **edge collections**. Vertices are stored in +**document collections** which are also referred to as **vertex collections** +in the context of graphs. You can technically also use edges as vertices but +the usefulness is limited. + +Edges in ArangoDB are always directed. Every edge document has special `_from` +and `_to` attributes to reference one other document in each of the two +attributes. + +Vertices are referenced by their document identifiers. For example, +a friendship edge that connects _Mary_ with _John_ could look like +`{"_from": "Person/Mary", "_to": "Person/John", "_id": "isFriendOf/1234"}`. +Using this directed graph model means that relations you create with edges are +not reciprocal but you may create edges for the reverse direction (another edge +from _John_ to _Mary_), or you can utilize ArangoDB's ability to follow edges +in the opposite direction (**inbound** instead of **outbound**) or ignore the +direction and follow them in both directions (**any**) as if it were an +undirected graph. + +You can query graphs with ArangoDB's query language, see +[Graphs in AQL](../aql/graphs/_index.md). + +## Comparison to relational database systems + +In relational database management systems (RDBMS), you have the construct of +a relation table to store *m:n* relations between two data tables. +An edge collection is somewhat similar to these relation tables. +Vertex collections resemble the data tables with the objects to connect. + +While simple graph queries with a fixed number of hops via the relation table +may be doable in RDBMSes with SQL using several nested joins, graph databases +can handle an arbitrary and variable number of these hops over edge collections +which is called **traversal**. + +Moreover, edges in one edge collection may point to vertices in different +vertex collections. It is common to have attributes attached to edges, like a +*label* naming the type of connection. + +Edges have a direction, with their relations stored in the special `_from` and +`_to` attributes pointing *from* one document *to* another document. +In queries, you can define in which directions the edge relations may be followed +(`OUTBOUND`: `_from` → `_to`, `INBOUND`: `_from` ← `_to`, `ANY`: `_from` ↔ `_to`). + +## Supported graph algorithms + +- [Traversal](../aql/graphs/traversals.md) + - following edges in outbound, inbound, or any direction + - variable traversal depth between a defined minimum and maximum + - breadth-first, depth-first, and weighted traversals + - optionally with prune conditions +- [Shortest Path](../aql/graphs/shortest-path.md) +- [All Shortest Paths](../aql/graphs/all-shortest-paths.md) +- [k Shortest Paths](../aql/graphs/k-shortest-paths.md) +- [k Paths](../aql/graphs/k-paths.md) +- [Distributed Iterative Graph Processing (Pregel)](../data-science/pregel/_index.md) + - Page Rank + - Seeded Page Rank + - Single-Source Shortest Path (SSSP) + - Connected Components + - Weakly Connected Components (WCC) + - Strongly Connected Components (SCC) + - Hyperlink-Induced Topic Search (HITS) + - Effective Closeness Vertex Centrality + - LineRank Vertex Centrality + - Label Propagation Community Detection + - Speaker-Listener Label Propagation (SLPA) Community Detection + +## Managed and unmanaged graphs + +You can use vertex and edge collections directly, using them as an unmanaged +**anonymous graph**. In queries, you need to specify the involved collections +for graph operations like traversals. + +You can also create a managed **named graph** to define a set of vertex and +edge collections along with the allowed relations. In queries, you only need to +specify the graph instead of the individual vertex and edge collections. There +are additional integrity checks when using the named graph interfaces. + +Named graphs ensure graph integrity, both when inserting or removing edges or +vertices. You won't encounter dangling edges, even if you use the same vertex +collection in several named graphs. This involves more operations inside the +database system, which come at a cost. Therefore, anonymous graphs may be faster +in many operations. You can choose between no integrity guarantees, additional +effort to implement consistency checks in your application code, and server-side +integrity checks at a performance cost. + +### Named Graphs + +Named graphs are completely managed by ArangoDB, ensuring data consistency if the +named graph interfaces and not the raw document manipulation interfaces are used. + +The following types of named graphs exist: +- [General Graphs](general-graphs/_index.md) +- [SmartGraphs](smartgraphs/_index.md) +- [EnterpriseGraphs](enterprisegraphs/_index.md) +- [SatelliteGraphs](satellitegraphs/_index.md) + +Selecting the optimal type of named graph in ArangoDB can help you achieve +the best performance and scalability for your data-intensive applications. + +Which collections are used within a named graph is defined via +**edge definitions**. They describe which edge collections connect which +vertex collections. This is defined separately for the *from* and the *to* +per edge collection. A named graph can have one or more edge definitions. + +The underlying collections of named graphs are still accessible using the +standard collection and document APIs. However, the graph modules add an +additional layer on top of these collections to provide integrity guarantees by +doing the following: + +- Execute all modifications transactionally +- Check that vertices references by edges in the `_from` and `_to` attributes + actually exist +- Only allow to reference vertices from collections as specified by the + definition of the graph +- Delete edges when a connected vertex is deleted to avoid dangling edges +- Prohibit to use an edge collections in an edge definition with a different + set of *from* and *to* vertex collections than an existing edge definition + of any graph +- Depending on the named graph type, there can be additional restrictions to + ensure a well-formed graph + +Your edge collections will only contain valid edges and you will never have +loose ends. These guarantees are lost if you access the collections in any other +way than the graph modules. For example, if you delete documents from your +vertex collections directly, the edges pointing to them remain in place. +Note that existing inconsistencies in your data are not corrected when you create +a named graph. Therefore, make sure you start with sound data as otherwise there +could be dangling edges after all. The graph modules guarantee to not introduce +new inconsistencies only. + +You can create and manage named graphs in the following ways: +- With the [web interface](../components/web-interface/graphs.md) + in the **GRAPHS** section +- In _arangosh_ using the respective graph-related modules of the + JavaScript API (see the above links of the named graph types) +- Using the [Gharial HTTP API](../develop/http-api/graphs/named-graphs.md) + +#### When to use General Graphs + +The General Graph is the basic graph type in ArangoDB, suitable for small-scale +graph use cases. Data in this type is randomly distributed across all configured +machines, making it easy to set up. However, this approach may result in +suboptimal query performance due to random data distribution. + +{{< tip >}} +General graphs are the easiest way to get started, no special configuration required. +{{< /tip >}} + +![General Graph Random Distribution](../../../images/general-graph-distribution.png) + +#### When to use SmartGraphs + +The SmartGraphs further optimize data distribution by allowing you to define a +property called `smartGraphAttribute`. This property leverages your application's +knowledge about the graph's interconnected communities to improve data +organization and query performance. + +{{< tip >}} +For the best query performance, especially in highly interconnected graph +scenarios, use SmartGraphs. Organize your data efficiently using the +`smartGraphAttribute`. +{{< /tip >}} + +![SmartGraph Distribution](../../../images/smartgraph-distribution.png) + +#### When to use EnterpriseGraphs + +The EnterpriseGraphs are designed for large-scale graph use cases in enterprise +environments. While data is also randomly sharded, this graph type ensures that +all edges adjacent to a vertex are co-located on the same server. This +optimization significantly improves query performance by reducing network hops. + +{{< tip >}} +If you need improved query execution without manual data distribution, consider +using EnterpriseGraphs. +{{< /tip >}} + +![EnterpriseGraph Distribution](../../../images/enterprisegraph-distribution.png) + +#### When to use SatelliteGraphs + +SatelliteGraphs replicate one or more graphs to all machines within a cluster +so queries can be executed locally. All vertices and edges are available on +every node for maximum data locality, therefore no network hops are required +to traverse the graph. + +{{< tip >}} +When using SatelliteGraphs, expect slower write performance because the data is +replicated across DB-Servers. For a more efficient option that doesn't replicate +all graph data to every server in your cluster, consider SmartGraphs. +{{< /tip >}} + +### Anonymous graphs + +An anonymous graph is the graph that your data implicitly defines by edges that +reference vertices and that you directly use by defining the vertex and edge +collections for graph operations such as traversals and path finding algorithms +in queries. You can also work with [edges](working-with-edges.md) directly. + +Anonymous graphs don't have edge definitions describing which vertex collection +is connected by which edge collection. The graph model has to be maintained by +the client-side code. This gives you more freedom than the strict named graphs +such as the ability to let an edge reference documents from any collections in +the current database. + +{{% comment %}} +## Graph use cases + +many problem domains and solve them with semantic queries and graph analytics. +use cases with rough data model + +information extraction (high-level) +{{% /comment %}} + +## Model data with graphs + +Graphs can have different structures, called **topologies**. The topology +describes how the vertices and edges are arranged by classifying the pattern of +connections. Some relevant classes are: + +- Cyclic: a graph that contains at least one path that starts and ends at the + same node. An edge can also originate from and point to the same vertex. +- Acyclic: a graph that contains no cycles +- Tree: a directed acyclic graph (DAG) without cycles and exactly one path + between any two vertices in the graph +- Dense: a graph with edges between most pairs of vertices +- Sparse: a graph where only few pairs of vertices are connected by edges + +The topology for your graphs will vary depending on your data and requirements +but you always have a degree of freedom when modeling the data. + +### What information should be stored in edges and what in vertices + +The main objects in your data model, such as users, groups, or articles, are +usually considered to be vertices. For each type of object, a document collection +should store the individual entities. Entities can be connected by edges to +express and classify relations between vertices. It often makes sense to have +an edge collection per relation type. + +ArangoDB does not require you to store your data in graph structures with edges +and vertices. You can also decide to embed attributes such as which groups a +user is part of or store `_id`s of documents in another document instead of +connecting the documents with edges. It can be a meaningful performance +optimization for *1:n* relationships if your data is not focused on relations +and you don't need graph traversal with varying depth. It usually means +to introduce some redundancy and possibly inconsistencies if you embed data, but +it can be an acceptable tradeoff. + +**Vertices**: +Assume you have two vertex collections, `Users` and `Groups`. Documents in the +`Groups` collection contain the attributes of the group, i.e. when it was founded, +its subject, and so on. Documents in the `Users` collection contain the data +specific to a user, like name, birthday, hobbies, et cetera. + +**Edges**: +You can use an edge collection to store relations between users and groups. +Since multiple users may be in an arbitrary number of groups, this is an **m:n** +relation. The edge collection can be called `UsersInGroups` to store edges like +with `_from` pointing to `Users/John` and `_to` pointing to +`Groups/BowlingGroupHappyPin`. This makes the user **John** a member of the group +**Bowling Group Happy Pin**. You can store additional properties in document +attributes to qualify the relation further, like the permissions of **John** in +this group, the date when John joined the group, and so on. + +![User in group example](../../../images/graph_user_in_group.png) + +As a rule of thumb, if you use documents and their attributes in a sentence, +nouns would typically be vertices, and the verbs the edges. +You can see this in the [Knows Graph](example-graphs.md#knows-graph): + + Alice knows Bob, who in term knows Charlie. + +The advantages of using graphs is that you are not limited to a fixed number of +**m:n** relations for a document, but you can have an arbitrary number of +relations. Edges can be traversed in both directions, so it is easy to determine +all groups a user is in, but also to find out which members a certain group has. +You can also interconnect users to create a social network. + +Using the graph data model, dealing with data that has lots of relations stays +manageable and can be queried in very flexible ways, whereas it would hard to +handle it in a relational database system. + +### Multiple edge collections vs. `FILTER`s on edge document attributes + +If you want to only traverse edges of a specific type, there are two ways to +achieve this. + +The first is to use an attribute in the edge document, e.g. `type`, where you +specify a differentiator for the edge, like `"friends"`, `"family"`, `"married"`, +or `"workmates"`, so that you can later use `FILTER e.type = "friends"` in +queries if you only want to follow the friend edges. + +Another way, which may be more efficient in some cases, is to use different +edge collections for different types of edges. You could have `friend_edges`, +`family_edges`, `married_edges`, and `workmate_edges` as edge collections. +You can then limit the query to a subset of the edge and vertex collections. +To only follow friend edges, you would specify `friend_edges` as sole edge collection. + +Both approaches have advantages and disadvantages. `FILTER` operations on edge +attributes are more costly at query time because a condition needs to be checked +for every traversed edge, which may become a bottleneck. If the set of edges is +restricted by only using a certain edge collection, then other types of edges +are not traversed in the first place and there is no need to check for a `type` +attribute with `FILTER`. On the other hand, using a `type` attribute allows you +to update edges more easily and you can even assign multiple types to a single +edge. + +The multiple edge collections approach is limited by the number of collections +that can be used in one query, see [Known limitations for AQL queries](../aql/fundamentals/limitations.md). +Every collection used in a query requires some resources inside of ArangoDB and +the number is therefore limited to cap the resource requirements. You may also +have constraints on other edge attributes, such as a persistent index with a +unique constraint, which requires the documents to be in a single collection for +the uniqueness guarantee, and it may thus not be possible to store the different +types of edges in multiple edge collections. + +In conclusion, if your edges have about a dozen different types, you can choose +the approach with multiple edge collections. Otherwise, the `FILTER` approach is +preferred. You can still use `FILTER` operations on edges as needed if you choose +the former approach. It merely removes the need of a `FILTER` on the `type`, +everything else can stay the same. + +{{% comment %}} +embedded vs. joins vs. graphs + +acl/rbac +dependencies +product hierarchies +... +{{% /comment %}} + +### Example graphs + +For example data that you can use for learning graphs, see +[Example graphs](example-graphs.md). + +{{% comment %}} +## Query graphs + +Explain traversal, pattern matching, shortest paths, pregel +direction, depth, order, conditions, weights? +combine with geo, search, ... +{{% /comment %}} + +## Back up and restore graph + +For backups of your graph data, you can use [_arangodump_](../components/tools/arangodump/_index.md) +to create the backup, and [_arangorestore_](../components/tools/arangorestore/_index.md) to +restore a backup. However, note the following: + +- You need to include the `_graphs` system collection if you want to back up + named graphs as the graph definitions are stored in this collection. +- You need to back up all vertex and edge collections your graph consists of. + A partial dump/restore may not work. diff --git a/site/content/arangodb/oem/graphs/enterprisegraphs/_index.md b/site/content/arangodb/oem/graphs/enterprisegraphs/_index.md new file mode 100644 index 0000000000..f0614e1e83 --- /dev/null +++ b/site/content/arangodb/oem/graphs/enterprisegraphs/_index.md @@ -0,0 +1,56 @@ +--- +title: EnterpriseGraphs +menuTitle: EnterpriseGraphs +weight: 100 +description: >- + EnterpriseGraphs enable you to manage graphs at scale with automated sharding + key selection +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +This chapter describes the `enterprise-graph` module, a specialized version of +[SmartGraphs](../smartgraphs/_index.md). +It will give a vast performance benefit for all graphs sharded +in an ArangoDB Cluster, reducing network hops substantially. + +In terms of querying there is no difference between SmartGraphs and EnterpriseGraphs. +For graph querying please refer to [AQL Graph Operations](../../aql/graphs/_index.md) +and [General Graph Functions](../general-graphs/functions.md) sections. + +Creating and modifying the underlying collections of an EnterpriseGraph are +also similar to SmartGraphs. For a detailed API reference, please refer +to [Enterprise Graphs Management](management.md). + +Coming from the Community Edition? +See [how to migrate](getting-started.md#migrating-from-community-edition) +from a `general-graph` to an `enterprise-graph`. + +## How EnterpriseGraphs work + +The creation and usage of EnterpriseGraphs are similar to [SmartGraphs](../smartgraphs/getting-started.md). +However, the latter requires the selection of an appropriate sharding key. +This is known as the `smartGraphAttribute`, a value that is stored in every vertex, +which ensures data co-location of all vertices sharing this attribute and their +immediate edges. + +EnterpriseGraphs come with a concept of "random sharding", meaning that the +sharding key is randomly selected while ensuring that all vertices with the +same sharding key and their adjacent edges are co-located on the same servers, +whenever possible. This approach provides significant advantages as it +minimizes the impact of having suboptimal sharding keys defined when creating +the graph. + +This means that, when using EnterpriseGraphs, the `smartGraphAttribute` is +**not** required. As a consequence, you **cannot** define `_key` values on +edges. + +## EnterpriseGraphs using SatelliteCollections + +EnterpriseGraphs are capable of using [SatelliteCollections](../../develop/satellitecollections.md) +within their graph definition. Therefore, edge definitions defined between +EnterpriseCollections and SatelliteCollections can be created. As SatelliteCollections +(and the edge collections between EnterpriseGraph collections and SatelliteCollections) +are globally replicated to each participating DB-Server, (weighted) graph +traversal and (k-)shortest path(s) query can partially be executed locally on +each DB-Server. This means a larger part of the query can be executed fully +local whenever data from the SatelliteCollections is required. diff --git a/site/content/arangodb/oem/graphs/enterprisegraphs/getting-started.md b/site/content/arangodb/oem/graphs/enterprisegraphs/getting-started.md new file mode 100644 index 0000000000..3a622bbb27 --- /dev/null +++ b/site/content/arangodb/oem/graphs/enterprisegraphs/getting-started.md @@ -0,0 +1,314 @@ +--- +title: Getting Started with EnterpriseGraphs +menuTitle: Getting Started +weight: 5 +description: >- + This chapter walks you through the first steps you need to follow to create an EnterpriseGraph +--- +EnterpriseGraphs **cannot use existing collections**. When switching to +EnterpriseGraph from an existing dataset, you have to import the data into a +fresh EnterpriseGraph. + +When creating an EnterpriseGraph, you cannot have different number of shards per +collection. To preserve the sharding pattern, the `_from` and `_to` attributes +of the edges cannot be modified. +You can define any `_key` value on vertices, including existing ones. + +## Migrating from Community Edition + +When migrating from the Community Edition to the Enterprise Edition, you can +bring data from existing collections using the command-line tools `arangoexport` +and `arangoimport`. + +`arangoexport` allows you to export collections to formats like `JSON`, `JSONL`, or `CSV`. +For this particular case, it is recommended to export data to `JSONL` format. +Once the data is exported, you need to exclude +the `_key` values from edges. The `enterprise-graph` module does not allow +custom `_key` values on edges. This is necessary for the initial data replication +when using `arangoimport` because these values are immutable. + +### Migration by Example + +Let us assume you have a `general-graph` in ArangoDB +that you want to migrate over to be an `enterprise-graph` to benefit from +the sharding strategy. In this example, the graph has only two collections: +`old_vertices` which is a document collection and `old_edges` which is the +corresponding edge collection. + +**Export `general-graph` data** + +The first step is to export the raw data of those +collections using `arangoexport`: + +```sh +arangoexport --type jsonl --collection old_vertices --output-directory docOutput --overwrite true +arangoexport --type jsonl --collection old_edges --output-directory docOutput --overwrite true +``` + +Note that the `JSONL` format type is being used in the migration process +as it is more flexible and can be used with larger datasets. +The `JSON` type is limited in amount of documents, as it cannot be parsed line +by line. The `CSV` and `TSV` formats are also fine, +but require to define the list of attributes to export. `JSONL` exports data +as is, and due to its line based layout, can be processed line by line and +therefore has no artificial restrictions on the data. + +After this step, two files are generated in the `docOutput` folder, that +should look like this: + +1. `docOutput/old_vertices.jsonl`: + ``` + {"_key":"Alice","_id":"old_vertices/Alice","_rev":"_edwXFGm---","attribute1":"value1"} + {"_key":"Bob","_id":"old_vertices/Bob","_rev":"_edwXFGm--_","attribute1":"value2"} + {"_key":"Charly","_id":"old_vertices/Charly","_rev":"_edwXFGm--B","attribute1":"value3"} + ``` + +2. `docOutput/old_edges.jsonl`: + ``` + {"_key":"121","_id":"old_edges/121","_from":"old_vertices/Bob","_to":"old_vertices/Charly","_rev":"_edwW20----","attribute2":"value2"} + {"_key":"122","_id":"old_edges/122","_from":"old_vertices/Charly","_to":"old_vertices/Alice","_rev":"_edwW20G---","attribute2":"value3"} + {"_key":"120","_id":"old_edges/120","_from":"old_vertices/Alice","_to":"old_vertices/Bob","_rev":"_edwW20C---","attribute2":"value1"} + ``` + +**Create new Graph** + +The next step is to set up an empty EnterpriseGraph and configure it +according to your preferences. + +{{< info >}} +You are free to change `numberOfShards`, `replicationFactor`, or even collection names +at this point. +{{< /info >}} + +Please follow the instructions on how to create an EnterpriseGraph +[using the Web Interface](#create-an-enterprisegraph-using-the-web-interface) +or [using _arangosh_](#create-an-enterprisegraph-using-arangosh). + +**Import data while keeping collection names** + +This example describes a 1:1 migration while keeping the original graph intact +and just changing the sharding strategy. + +The empty collections that are now in the target ArangoDB cluster, +have to be filled with data. +All vertices can be imported without any change: + +```sh +arangoimport --collection old_vertices --file docOutput/old_vertices.jsonl +``` + +On the edges, EnterpriseGraphs disallow storing the `_key` value, so this attribute +needs to be removed on import: + +``` +arangoimport --collection old_edges --file docOutput/old_edges.jsonl --remove-attribute "_key" +``` + +After this step, the graph has been migrated. + +**Import data while changing collection names** + +This example describes a scenario in which the collections names have changed, +assuming that you have renamed `old_vertices` to `vertices`. + +For the vertex data this change is not relevant, the `_id` values are adjusted +automatically, so you can import the data again, and just target the new +collection name: + +```sh +arangoimport --collection vertices --file docOutput/old_vertices.jsonl +``` + +For the edges you need to apply more changes, as they need to be rewired. +To make the change of vertex collection, you need to set +`--overwrite-collection-prefix` to `true`. + +To migrate the graph and also change to new collection names, run the following +command: + +```sh +arangoimport --collection edges --file docOutput/old_edges.jsonl --remove-attribute "_key" --from-collection-prefix "vertices" --to-collection-prefix "vertices" --overwrite-collection-prefix true +``` + +Note that: +- You have to remove the `_key` value as it is disallowed for EnterpriseGraphs. +- Because you have changed the name of the `_from` collection, you need + to provide a `--from-collection-prefix`. The same is true for the `_to` collection, + so you also need to provide a `--to-collection-prefix`. +- To make the actual name change to the vertex collection, you need to + allow `--overwrite-collection-prefix`. If this option is not enabled, only values + without a collection name prefix are changed. This is helpful if your data is not + exported by ArangoDB in the first place. + +This mechanism does not provide the option to selectively replace +collection names. It only allows replacing all collection names on `_from` +respectively `_to`. +This means that, even if you use different collections in `_from` and `_to`, +their names are modified based on the prefix that is specified. + +Consider the following example where `_to` points to a vertex in a different collection, +`users_vertices/Bob`. When using `--to-collection-prefix "vertices"` to rename +the collections, all collection names on the `_to` side are renamed to +`vertices` as this transformation solely allows for the replacement of all +collection names within the edge attribute. + +```json +{"_key":"121", "_from":"old_vertices/Bob", "_to":"old_vertices/Charly", ... } +{"_key":"122", "_from":"old_vertices/Charly", "_to":"old_vertices/Alice", ... } +{"_key":"120", "_from":"old_vertices/Alice", "_to":"users_vertices/Bob", ... } +``` + +## Collections in EnterpriseGraphs + +In contrast to General Graphs, you **cannot use existing collections**. +When switching from an existing dataset, you have to import the data into a +fresh EnterpriseGraph. + +The creation of an EnterpriseGraph graph requires the name of the graph and a +definition of its edges. All collections used within the creation process are +automatically created by the `enterprise-graph` module. Make sure to only use +non-existent collection names for both vertices and edges. + +## Create an EnterpriseGraph using the web interface + +The web interface (also called Web UI) allows you to easily create and manage +EnterpriseGraphs. To get started, follow the steps outlined below. + +1. In the web interface, navigate to the **GRAPHS** section. +2. To add a new graph, click **Add Graph**. +3. In the **Create Graph** dialog that appears, select the + **EnterpriseGraph** tab. +4. Fill in all required fields: + - For **Name**, enter a name for the EnterpriseGraph. + - For **Shards**, enter the number of parts to split the graph into. + - Optional: For **Replication factor**, enter the total number of + desired copies of the data in the cluster. + - Optional: For **Write concern**, enter the total number of copies + of the data in the cluster required for each write operation. + - Optional: For **SatelliteCollections**, insert vertex collections + that are being used in your edge definitions. These collections are + then created as satellites, and thus replicated to all DB-Servers. + - For **Edge definition**, insert a single non-existent name to define + the relation of the graph. This automatically creates a new edge + collection, which is displayed in the **COLLECTIONS** section of the + left sidebar menu. + {{< tip >}} + To define multiple relations, press the **Add relation** button. + To remove a relation, press the **Remove relation** button. + {{< /tip >}} + - For **fromCollections**, insert a list of vertex collections + that contain the start vertices of the relation. + - For **toCollections**, insert a list of vertex collections that + contain the end vertices of the relation. + {{< tip >}} + Insert only non-existent collection names. Collections are automatically + created during the graph setup and are displayed in the + **Collections** tab of the left sidebar menu. + {{< /tip >}} + - For **Orphan collections**, insert a list of vertex collections + that are part of the graph but not used in any edge definition. +5. Click **Create**. +6. Click the card of the newly created graph use the functions of the Graph + Viewer to visually interact with the graph and manage the graph data. + +![Create EnterpriseGraph](../../../../images/graphs-create-enterprise-graph-dialog.png) + +## Create an EnterpriseGraph using *arangosh* + +Compared to SmartGraphs, the option `isSmart: true` is required but the +`smartGraphAttribute` is forbidden. + +```js +--- +name: enterpriseGraphCreateGraphHowTo1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var graph = graph_module._create("myGraph", [], [], {isSmart: true, numberOfShards: 9}); +graph; +~graph_module._drop("myGraph"); +``` + +### Add vertex collections + +The **collections must not exist** when creating the EnterpriseGraph. The EnterpriseGraph +module creates them for you automatically to set up the sharding for all +these collections correctly. If you create collections via the EnterpriseGraph +module and remove them from the graph definition, then you may re-add them +without trouble however, as they have the correct sharding. + +```js +--- +name: enterpriseGraphCreateGraphHowTo2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var graph = graph_module._create("myGraph", [], [], {isSmart: true, numberOfShards: 9}); +graph._addVertexCollection("shop"); +graph._addVertexCollection("customer"); +graph._addVertexCollection("pet"); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +### Define relations on the Graph + +Adding edge collections works the same as with General Graphs, but again, the +collections are created by the EnterpriseGraph module to set up sharding correctly +so they must not exist when creating the EnterpriseGraph (unless they have the +correct sharding already). + +```js +--- +name: enterpriseGraphCreateGraphHowTo3 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var graph = graph_module._create("myGraph", [], [], {isSmart: true, numberOfShards: 9}); +~graph._addVertexCollection("shop"); +~graph._addVertexCollection("customer"); +~graph._addVertexCollection("pet"); +var rel = graph_module._relation("isCustomer", ["shop"], ["customer"]); +graph._extendEdgeDefinitions(rel); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +### Create an EnterpriseGraph using SatelliteCollections + +When creating a collection, you can decide whether it's a SatelliteCollection +or not. For example, a vertex collection can be satellite as well. +SatelliteCollections don't require sharding as the data is distributed +globally on all DB-Servers. The `smartGraphAttribute` is also not required. + +In addition to the attributes you would set to create a EnterpriseGraph, there is an +additional attribute `satellites` you can optionally set. It needs to be an array of +one or more collection names. These names can be used in edge definitions +(relations) and these collections are created as SatelliteCollections. +However, all vertex collections on one side of the relation have to be of +the same type - either all satellite or all smart. This is because `_from` +and `_to` can have different types based on the sharding pattern. + +In this example, both vertex collections are created as SatelliteCollections. + +{{< info >}} +When providing a satellite collection that is not used in a relation, +it is not created. If you create the collection in a following +request, only then the option counts. +{{< /info >}} + +```js +--- +name: enterpriseGraphCreateGraphHowTo4 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var rel = graph_module._relation("isCustomer", "shop", "customer") +var graph = graph_module._create("myGraph", [rel], [], {satellites: ["shop", "customer"], isSmart: true, numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` diff --git a/site/content/arangodb/oem/graphs/enterprisegraphs/management.md b/site/content/arangodb/oem/graphs/enterprisegraphs/management.md new file mode 100644 index 0000000000..97e0828b28 --- /dev/null +++ b/site/content/arangodb/oem/graphs/enterprisegraphs/management.md @@ -0,0 +1,336 @@ +--- +title: EnterpriseGraphs Management +menuTitle: Management +weight: 10 +description: >- + This chapter describes the JavaScript interface for creating and modifying EnterpriseGraphs +--- +An EnterpriseGraph is a specialized version of a SmartGraph, which +means that both modules work similarly. The major difference is that +EnterpriseGraphs rely on a special automated sharding of the underlying +collections and hence can only work with collections that are created +through the EnterpriseGraph itself. EnterpriseGraphs cannot overlap. + +To generally understand the concept of this module please read the chapter +about [General Graph Management](../general-graphs/management.md) first, +and continue with [SmartGraph Management](../smartgraphs/management.md). + +## Create a Graph + +EnterpriseGraphs require edge relations to be created. The format of the +relations is identical to the format used for General Graphs. +The only difference is that all collections used within +the relations to create a new EnterpriseGraph must not exist yet. You have to let +the EnterpriseGraph module create the Graph collections for you, so that it can +enforce the correct sharding. + +`graph_module._create(graphName, edgeDefinitions, orphanCollections, smartOptions)` + +- `graphName` (string): + Unique identifier of the graph. +- `edgeDefinitions` (array): + List of relation definition objects, may be empty. +- `orphanCollections` (array): + List of additional vertex collection names, may be empty. +- `smartOptions` (object): + A JSON object having the following keys: + - `numberOfShards` (number): + The number of shards that are created for each collection. To maintain + the correct sharding, all collections need an identical number of shards. + This cannot be modified after the creation of the graph. + - `isSmart` (bool): + Mandatory parameter that needs to be set to `true` to create an EnterpriseGraph. + - `satellites` (array, _optional_): + An array of collection names that is used to create + [SatelliteCollections](../../develop/satellitecollections.md) for an EnterpriseGraph. + Each array element must be a string and a valid collection name. + The collection type cannot be modified later. + +The creation of a graph requires the name and some SmartGraph options. +Due to the API, `edgeDefinitions` and `orphanCollections` have to be given but +both can be empty arrays and be added later. + +The `edgeDefinitions` can be created using the convenience method `_relation` +known from the `general-graph` module, which is also available here. + +`orphanCollections` again is just a list of additional vertex collections which +are not yet connected via edges but should follow the same sharding to be +connected later on. Note that these collections are not necessarily orphans in +the graph theoretic sense: it is possible to add edges having one end in a collection +that has been declared as orphan. + +All collections used within the creation process are newly created. +The process fails if one of them already exists, unless they have the +correct sharding already. All newly created collections are immediately +dropped again in the failure case. + +**Examples** + +Create a graph without relations. Edge definitions can be added later: + +```js +--- +name: enterpriseGraphCreate1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var graph = graph_module._create("myGraph", [], [], {isSmart: true, numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +Create a graph using an edge collection `edges` and a single vertex collection +`vertices` as relation: + +```js +--- +name: enterpriseGraphCreate2 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var edgeDefinitions = [ graph_module._relation("edges", "vertices", "vertices") ]; +var graph = graph_module._create("myGraph", edgeDefinitions, [], {isSmart: true, numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +Create a graph with edge definitions and orphan collections: + +```js +--- +name: enterpriseGraphCreate3 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var edgeDefinitions = [ graph_module._relation("myRelation", ["male", "female"], ["male", "female"]) ]; +var graph = graph_module._create("myGraph", edgeDefinitions, ["sessions"], {isSmart: true, numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +## Modify a graph definition at runtime + +After you have created an EnterpriseGraph, its definition is not immutable. You can +still add or remove relations. This is again identical to General Graphs. + +However, there is one important difference: you can only add collections that +either *do not exist*, or that have been created by this graph earlier. The +latter can be the case if you, for example, remove an orphan collection from this +graph, without dropping the collection itself. When after some time you decide +to add it to the graph again, you can do it. This is because the enforced sharding is still +applied to this vertex collection. + +## Remove a vertex collection + +Remove a vertex collection from the graph: + +`graph._removeVertexCollection(vertexCollectionName, dropCollection)` + +- `vertexCollectionName` (string): + Name of vertex collection. +- `dropCollection` (bool, _optional_): + If `true`, the collection is dropped if it is not used in any other graph. + Default: `false`. + +In most cases, this function works identically to the General Graph one. +However, there is one special case: the first vertex collection added to the graph +(either orphan or within a relation) defines the sharding for all collections +within the graph. Every other collection has its `distributeShardsLike` attribute set to the +name of the initial collection. This collection cannot be dropped as long as +other collections follow its sharding (i.e. they need to be dropped first). + +**Examples** + +Create an EnterpriseGraph and list its orphan collections: + +```js +--- +name: enterpriseGraphModify1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], ["other"], {isSmart: true, numberOfShards: 9}); +graph._orphanCollections(); +~graph_module._drop("myGraph", true); +``` + +Remove the orphan collection from the EnterpriseGraph and drop the collection: + +```js +--- +name: enterpriseGraphModify2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"], {isSmart: true, numberOfShards: 9}); +graph._removeVertexCollection("other", true); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +Attempting to remove a non-orphan collection results in an error: + +```js +--- +name: enterpriseGraphModify3 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], [], {isSmart: true, numberOfShards: 9}); +graph._removeVertexCollection("vertices"); // xpError(ERROR_GRAPH_NOT_IN_ORPHAN_COLLECTION) +~graph_module._drop("myGraph", true); +``` + +You cannot drop the initial collection (`vertices`) as long as it defines the +sharding for other collections (`edges`). + +```js +--- +name: enterpriseGraphModify4 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], [], {isSmart: true, numberOfShards: 9}); +graph._deleteEdgeDefinition("edges"); +graph._removeVertexCollection("vertices"); +db._drop("vertices"); // xpError(ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE) +~graph_module._drop("myGraph", true); +~db._drop("edges"); +~db._drop("vertices"); +``` + +You may drop the complete graph including the underlying collections by setting +the second argument in the call to `_drop()` to `true`. This only drops +collections that are in the graph definition at that point. Remember to manually +drop collections that you might have removed from the graph beforehand. + +```js +--- +name: enterpriseGraphModify5 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], [], {isSmart: true, numberOfShards: 9}); +graph._deleteEdgeDefinition("edges"); // Remove edge collection from graph definition +graph._removeVertexCollection("vertices"); // Remove vertex collection from graph definition +graph_module._drop("myGraph", true); // Does not drop any collections because none are left in the graph definition +db._drop("edges"); // Manually clean up the collections that were left behind, drop 'edges' before sharding-defining 'vertices' collection +db._drop("vertices"); +``` + +Alternatively, you can `truncate()` all collections of the graph if you just +want to get rid of the data but keep the collections and graph definition. + +## Remove an edge definition + +Delete an edge definition from the graph: + +`graph._deleteEdgeDefinition(edgeCollectionName, dropCollection)` + +- `edgeCollectionName` (string): + Name of edge collection. +- `dropCollection` (bool, _optional_): + If `true`, the collection is dropped if it is not used in any other graph. + Default: `false`. + +**Examples** + +Create an EnterpriseGraph, then delete the edge definition and drop the edge collection: + +```js +--- +name: enterpriseGraphModify6 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/enterprise-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], [], {isSmart: true, numberOfShards: 9}); +graph._deleteEdgeDefinition("edges", true); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +It is allowed to remove the vertex collection `vertices` if it is not used in +any relation (i.e. after the deletion of the edge definition): + +```js +--- +name: enterpriseGraphModify7 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], [], {isSmart: true, numberOfShards: 9}); +graph._deleteEdgeDefinition("edges"); +graph._removeVertexCollection("vertices"); +~graph_module._drop("myGraph", true); +~db._drop("edges"); +~db._drop("vertices"); +``` + +Keep in mind that you cannot drop the `vertices` collection until no other +collection references it anymore (`distributeShardsLike` collection property). + +## Remove a Graph + +Remove a SmartGraph: + +`graph_module._drop(graphName, dropCollections)` + +- `graphName` (string): + Name of the Graph. +- `dropCollections` (bool, _optional_): + Define if collections should be dropped. Default: `false`. + +**Examples** + +Delete an EnterpriseGraph and drop its collections: + +```js +--- +name: enterpriseGraphRemove1 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"], {isSmart: true, numberOfShards: 9}); +graph_module._drop("myGraph", true); +``` + +Note that removing a Graph with the option to drop the collections fails if +you removed collections from the Graph but did not drop these collections. +This is because their `distributeShardsLike` attribute still references +collections that are part of the Graph. Dropping collections while others +point to them in this way is not allowed. Make sure to drop the referencing +collections first. + +```js +--- +name: enterpriseGraphRemove2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/enterprise-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"], {isSmart: true, numberOfShards: 9}); +graph._removeVertexCollection("other"); +graph_module._drop("myGraph", true); // xpError(ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE) +~db._drop("other"); +~db._drop("vertices"); +``` diff --git a/site/content/arangodb/oem/graphs/example-graphs.md b/site/content/arangodb/oem/graphs/example-graphs.md new file mode 100644 index 0000000000..58b269cbf0 --- /dev/null +++ b/site/content/arangodb/oem/graphs/example-graphs.md @@ -0,0 +1,263 @@ +--- +title: Example graphs +menuTitle: Example graphs +weight: 110 +description: >- + How to use the example graphs built into ArangoDB +--- +ArangoDB comes with a set of easy-to-understand graphs for demonstration +purposes. + +- In the web interface, navigate to the **GRAPHS** section, click the + **Add Graph** card, go to the **Examples** tab, and click the **Create** button of one of the listed graphs. + +- In _arangosh_, run `require("@arangodb/graph-examples/example-graph").loadGraph("<name>");` + with `<name>` substituted by the name of an example graph listed below. + +You can visually explore the created graphs in the +[Graph viewer](../components/web-interface/graphs.md#graph-viewer) +of the web interface. + +You can take a look at the script that creates the example graphs on +[GitHub](https://github.com/arangodb/arangodb/blob/devel/js/common/modules/%40arangodb/graph-examples/example-graph.js) +for reference about how to manage graphs programmatically. + +## Knows Graph + +The `knows` graph is a set of persons knowing each other: + +![Persons relation Example Graph](../../../images/knows_graph.png) + +The graph consists of a `persons` vertex collection connected via a `knows` +edge collection. +There are five persons, *Alice*, *Bob*, *Charlie*, *Dave*, and *Eve*. +They have the following directed relations: + +- *Alice* knows *Bob* +- *Bob* knows *Charlie* +- *Bob* knows *Dave* +- *Eve* knows *Alice* +- *Eve* knows *Bob* + +Example of how to create the graph, inspect its vertices and edges, and delete +it again: + +```js +--- +name: graph_create_knows_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("knows_graph"); +db.persons.toArray() +db.knows.toArray(); +examples.dropGraph("knows_graph"); +``` + +**Note:** With the default traversal depth of 2 of the graph viewer, you may not +see all edges of this graph by default. + +## Traversal Graph + +The `traversalGraph` has been designed to demonstrate filters in traversals. +It has some labels to filter on it. The graph's vertices are in a collection +called `circles`, and it has an edge collection `edges` to connect them. + +![Traversal Graph](../../../images/traversal_graph.png) + +Circles have unique numeric labels. Edges have two boolean attributes +(`theFalse` always being `false`, `theTruth` always being `true`) and a label +sorting *B* - *D* to the left side, *G* - *K* to the right side. +Left and right side split into paths - at *B* and *G*, which are each direct +neighbors of the root-node *A*. Starting from *A*, the graph has a depth of 3 on +all its paths. + +```js +--- +name: graph_create_traversal_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("traversalGraph"); +db.circles.toArray(); +db.edges.toArray(); +examples.dropGraph("traversalGraph"); +``` + +**Note:** With the default traversal depth of 2 of the graph viewer, you may not +see all edges of this graph by default. + +## k Shortest Paths Graph + +The vertices in the `kShortestPathsGraph` graph are train stations of cities in +Europe and North America. The edges represent train connections between them, +with the travel time for both directions as edge weight. + +![Train Connection Map](../../../images/train_map.png) + +See the [k Shortest Paths page](../aql/graphs/k-shortest-paths.md) for query examples. + +```js +--- +name: graph_create_kshortestpaths_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("kShortestPathsGraph"); +db.places.toArray(); +db.connections.toArray(); +examples.dropGraph("kShortestPathsGraph"); +``` + +## Mps Graph + +The `mps_graph` has been created to demonstrate shortest path algorithms and +the abbreviation stands for **m**ultiple **p**ath **s**earch. + +The example graph consists of vertices in the `mps_verts` collection and edges +in the `mps_edges` collection. It is a simple traversal graph with start node +*A* and end node *C*. + +![Mps Graph](../../../images/mps_graph.png) + +With the [Shortest Path](../aql/graphs/shortest-path.md) algorithm, you either +get the shortest path *A* - *B* - *C* or *A* - *D* - *C*. With the +[All Shortest Paths](../aql/graphs/all-shortest-paths.md) algorithm, both +shortest paths are returned. + +Example of how to create the graph, inspect its vertices and edges, and delete +it again: + +```js +--- +name: graph_create_mps_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("mps_graph"); +db.mps_verts.toArray(); +db.mps_edges.toArray(); +examples.dropGraph("mps_graph"); +``` + +## World Graph + +The `worldCountry` graph has as node structure as follows: + +world → continent → country → capital + +![World Graph](../../../images/world_graph.png) + +In some cases, edge directions aren't forward. Therefore, it may get displayed +disjunct in the graph viewer. + +You can create the graph as a named graph using the name `worldCountry`, or as +an anonymous graph (vertex and edge collections only) using the name +`worldCountryUnManaged`. + +```js +--- +name: graph_create_world_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("worldCountry"); +db.worldVertices.toArray(); +db.worldEdges.toArray(); +examples.dropGraph("worldCountry"); +var g = examples.loadGraph("worldCountryUnManaged"); +examples.dropGraph("worldCountryUnManaged"); +``` + +## Social Graph + +The `social` graph is a set of persons and their relations. The graph has +`female` and `male` persons as vertices in two vertex collections. +The edges are their connections and stored in the `relation` edge collection. + +![Social Example Graph](../../../images/social_graph.png) + +Example of how to create the graph, inspect its vertices and edges, and delete +it again: + +```js +--- +name: graph_create_social_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +db.female.toArray() +db.male.toArray() +db.relation.toArray() +examples.dropGraph("social"); +``` + +## City Graph + +The `routeplanner` graph is a set of european cities and their fictional +traveling distances as connections. The graph has the cities as vertices in +multiple vertex collections (`germanCity` and `frenchCity`). The edges are their +interconnections in several edge collections (`frenchHighway`, `germanHighway`, +`internationalHighway`). + +![Cities Example Graph](../../../images/cities_graph.png) + +Example of how to create the graph, inspect its edges and vertices, and delete +it again: + +```js +--- +name: graph_create_cities_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("routeplanner"); +db.frenchCity.toArray(); +db.germanCity.toArray(); +db.germanHighway.toArray(); +db.frenchHighway.toArray(); +db.internationalHighway.toArray(); +examples.dropGraph("routeplanner"); +``` + +## Connected Components Graph + +A small example graph comprised of `components` (vertices) and `connections` +(edges). Good for trying out Pregel algorithms such as Weakly Connected +Components (WCC). + +Also see: +- [Distributed Iterative Graph Processing (Pregel)](../data-science/pregel/_index.md) +- [Pregel HTTP API](../develop/http-api/pregel.md) + +![Three disjoint subgraphs with 36 nodes and edges in total](../../../images/connected_components.png) + +```js +--- +name: graph_create_connectedcomponentsgraph_sample +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("connectedComponentsGraph"); +db.components.toArray(); +db.connections.toArray(); +examples.dropGraph("connectedComponentsGraph"); +``` + +## Higher volume graph examples + +All of the above examples are rather small to make them easy to comprehend and +demonstrate how graphs work in ArangoDB. However, there are several, freely +available datasets on the web that are a lot bigger. + +You can find a collection of datasets with import scripts on +[GitHub](https://github.com/arangodb/example-datasets). + +Another huge graph is the [Pokec social network](https://snap.stanford.edu/data/soc-pokec.html) +from Slovakia. See this [blogpost](https://www.arangodb.com/2015/06/multi-model-benchmark/) +for details and an import script. + +## More examples + + - [AQL Example Queries on an Actors and Movies Database](../aql/examples-and-query-patterns/actors-and-movies-dataset-queries.md) diff --git a/site/content/arangodb/oem/graphs/general-graphs/_index.md b/site/content/arangodb/oem/graphs/general-graphs/_index.md new file mode 100644 index 0000000000..6025339a08 --- /dev/null +++ b/site/content/arangodb/oem/graphs/general-graphs/_index.md @@ -0,0 +1,107 @@ +--- +title: General Graphs +menuTitle: General Graphs +weight: 85 +description: >- + The basic type of a named graph is called a General Graph and there is a + JavaScript module for working with these graphs +--- +This chapter describes the [general-graph](../_index.md) module. +It allows you to define a graph that is spread across several edge and document +collections. +This allows you to structure your models in line with your domain and group +them logically in collections giving you the power to query them in the same +graph queries. +There is no need to include the referenced collections within the query, this +module will handle it for you. + +New to ArangoDB? Take the free +[ArangoDB Graph Course](https://www.arangodb.com/arangodb-graph-course) +for freshers. + +## Getting started + +### Create a General Graph using the web interface + +The web interface (also called Web UI) allows you to easily create and manage +General Graphs. To get started, follow the steps outlined below. + +1. In the web interface, navigate to the **GRAPHS** section. +2. To add a new graph, click **Add Graph**. +3. In the **Create Graph** dialog that appears, select the + **GeneralGraph** tab. +4. Fill in the following fields: + - For **Name**, enter a name for the General Graph. + - For **Shards**, enter the number of parts to split the graph into. + - For **Replication factor**, enter the total number of + desired copies of the data in the cluster. + - For **Write concern**, enter the total number of copies + of the data in the cluster required for each write operation. +5. Define the relation(s) on the General Graph: + - For **Edge definition**, insert a single non-existent name to define + the relation of the graph. This automatically creates a new edge + collection, which is displayed in the **COLLECTIONS** section of the + left sidebar menu. + {{< tip >}} + To define multiple relations, press the **Add relation** button. + To remove a relation, press the **Remove relation** button. + {{< /tip >}} + - For **fromCollections**, insert a list of vertex collections + that contain the start vertices of the relation. + - For **toCollections**, insert a list of vertex collections that + contain the end vertices of the relation. +6. If you want to use vertex collections that are part of the graph + but not used in any edge definition, you can insert them via + **Orphan collections**. +7. Click **Create**. +8. Click the card of the newly created graph and use the functions of the Graph + Viewer to visually interact with the graph and manage the graph data. + +![Create General Graph](../../../../images/Create-GeneralGraph.png) + +### Create a General Graph using *arangosh* + +**Create a graph** + +```js +--- +name: generalGraphCreateGraphHowTo1 +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +var graph = graph_module._create("myGraph"); +graph; +~graph_module._drop("myGraph", true); +``` + +**Add some vertex collections** + +```js +--- +name: generalGraphCreateGraphHowTo2 +description: '' +--- +~var graph_module = require("@arangodb/general-graph"); +~var graph = graph_module._create("myGraph"); +graph._addVertexCollection("shop"); +graph._addVertexCollection("customer"); +graph._addVertexCollection("pet"); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +**Define relations on the Graph** + +```js +--- +name: generalGraphCreateGraphHowTo3 +description: '' +--- +~var graph_module = require("@arangodb/general-graph"); +~var graph = graph_module._create("myGraph"); +~graph._addVertexCollection("pet"); +var rel = graph_module._relation("isCustomer", ["shop"], ["customer"]); +graph._extendEdgeDefinitions(rel); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` diff --git a/site/content/arangodb/oem/graphs/general-graphs/functions.md b/site/content/arangodb/oem/graphs/general-graphs/functions.md new file mode 100644 index 0000000000..c05189027d --- /dev/null +++ b/site/content/arangodb/oem/graphs/general-graphs/functions.md @@ -0,0 +1,938 @@ +--- +title: Graph Functions +menuTitle: Functions +weight: 10 +description: >- + Utility functions available for named graphs +--- +This chapter describes [various functions on a graph](../_index.md). +A lot of these accept a vertex (or edge) example as parameter as defined in the next section. + +Examples explain the API using the [City Graph](../example-graphs.md#city-graph): + +![Social Example Graph](../../../../images/cities_graph.png) + +## Definition of examples + +For many of the following functions *examples* can be passed in as a parameter. +*Examples* are used to filter the result set for objects that match the conditions. +These *examples* can have the following values: + +- `null`, there is no matching executed all found results are valid. +- A *string*, only results are returned, which `_id` equal the value of the string +- An example *object*, defining a set of attributes. + Only results having these attributes are matched. +- A *list* containing example *objects* and/or *strings*. + All results matching at least one of the elements in the list are returned. + +## Get vertices from edges + +### Get the source vertex of an edge + +`graph._fromVertex(edgeId)` + +Returns the vertex defined with the attribute `_from` of the edge with `edgeId` as its `_id`. + +- `edgeId` (required): `_id` attribute of the edge + +**Examples** + +```js +--- +name: generalGraphGetFromVertex +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var any = require("@arangodb").db.relation.any(); +graph._fromVertex("relation/" + any._key); +~examples.dropGraph("social"); +``` + +### Get the target vertex of an edge + +`graph._toVertex(edgeId)` + +Returns the vertex defined with the attribute `_to` of the edge with `edgeId` as its `_id`. + +- `edgeId` (required): `_id` attribute of the edge + +**Examples** + +```js +--- +name: generalGraphGetToVertex +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var any = require("@arangodb").db.relation.any(); +graph._toVertex("relation/" + any._key); +~examples.dropGraph("social"); +``` + +## _neighbors + +Get all neighbors of the vertices defined by the example. + +`graph._neighbors(vertexExample, options)` + +The function accepts an id, an example, a list of examples or even an empty +example as parameter for vertexExample. +The complexity of this method is `O(n * m^x)` with `n` being the vertices defined by the +`vertexExample` parameter, the average amount of neighbors `m`, and the maximal depths `x`. +Hence, the default call has a complexity of `O(n * m)`; + +- `vertexExample` (optional): See [Definition of examples](#definition-of-examples) +- `options` (optional): An object defining further options. Can have the following values: + - `direction`: The direction of the edges. Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `edgeExamples`: Filter the edges, see [Definition of examples](#definition-of-examples) + - `neighborExamples`: Filter the neighbor vertices, see [Definition of examples](#definition-of-examples) + - `edgeCollectionRestriction`: One or a list of edge-collection names that should be + considered to be on the path. + - `vertexCollectionRestriction`: One or a list of vertex-collection names that should be + considered on the intermediate vertex steps. + - `minDepth`: Defines the minimal number of intermediate steps to neighbors (default is 1). + - `maxDepth`: Defines the maximal number of intermediate steps to neighbors (default is 1). + +**Examples** + +A route planner example, all neighbors of capitals. + +```js +--- +name: generalGraphModuleNeighbors1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._neighbors({isCapital : true}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, all outbound neighbors of Hamburg. + +```js +--- +name: generalGraphModuleNeighbors2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._neighbors('germanCity/Hamburg', {direction : 'outbound', maxDepth : 2}); +~examples.dropGraph("routeplanner"); +``` + +## _commonNeighbors + +Get all common neighbors of the vertices defined by the examples. + +`graph._commonNeighbors(vertex1Example, vertex2Examples, optionsVertex1, optionsVertex2)` + +This function returns the intersection of `graph_module._neighbors(vertex1Example, optionsVertex1)` +and `graph_module._neighbors(vertex2Example, optionsVertex2)`. +For parameter documentation see [_neighbors](#_neighbors). + +The complexity of this method is **O(n\*m^x)** with *n* being the maximal amount of vertices +defined by the parameters vertexExamples, *m* the average amount of neighbors and *x* the +maximal depths. +Hence the default call would have a complexity of **O(n\*m)**; + +**Examples** + +A route planner example, all common neighbors of capitals. + +```js +--- +name: generalGraphModuleCommonNeighbors1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._commonNeighbors({isCapital : true}, {isCapital : true}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, all common outbound neighbors of Hamburg with any other location +which have a maximal depth of 2 : + +```js +--- +name: generalGraphModuleCommonNeighbors2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._commonNeighbors( + 'germanCity/Hamburg', + {}, + {direction : 'outbound', maxDepth : 2}, + {direction : 'outbound', maxDepth : 2}); +~examples.dropGraph("routeplanner"); +``` + +## _countCommonNeighbors + +Get the amount of common neighbors of the vertices defined by the examples. + +`graph._countCommonNeighbors(vertex1Example, vertex2Examples, optionsVertex1, optionsVertex2)` + +Similar to [_commonNeighbors](#_commonneighbors) but returns count instead of the elements. + +**Examples** + +A route planner example, all common neighbors of capitals. + +```js +--- +name: generalGraphModuleCommonNeighborsAmount1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +var example = { isCapital: true }; +var options = { includeData: true }; +graph._countCommonNeighbors(example, example, options, options); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, all common outbound neighbors of Hamburg with any other location +which have a maximal depth of 2 : + +```js +--- +name: generalGraphModuleCommonNeighborsAmount2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +var options = { direction: 'outbound', maxDepth: 2, includeData: true }; +graph._countCommonNeighbors('germanCity/Hamburg', {}, options, options); +~examples.dropGraph("routeplanner"); +``` + +## _commonProperties + +Get the vertices of the graph that share common properties. + +`graph._commonProperties(vertex1Example, vertex2Examples, options)` + +The function accepts an id, an example, a list of examples or even an empty +example as parameter for vertex1Example and vertex2Example. + +The complexity of this method is **O(n)** with *n* being the maximal amount of vertices +defined by the parameters vertexExamples. + +- `vertex1Examples` (optional): Filter the set of source vertices, see [Definition of examples](#definition-of-examples) + +- `vertex2Examples` (optional): Filter the set of vertices compared to, see [Definition of examples](#definition-of-examples) +- options (optional) An object defining further options. Can have the following values: + - `vertex1CollectionRestriction` : One or a list of vertex-collection names that should be + searched for source vertices. + - `vertex2CollectionRestriction` : One or a list of vertex-collection names that should be + searched for compare vertices. + - `ignoreProperties` : One or a list of attribute names of a document that should be ignored. + +**Examples** + +A route planner example, all locations with the same properties: + +```js +--- +name: generalGraphModuleProperties1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._commonProperties({}, {}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, all cities which share same properties except for population. + +```js +--- +name: generalGraphModuleProperties2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._commonProperties({}, {}, { ignoreProperties: 'population' }); +~examples.dropGraph("routeplanner"); +``` + +## _countCommonProperties + +Get the amount of vertices of the graph that share common properties. + +`graph._countCommonProperties(vertex1Example, vertex2Examples, options)` + +Similar to [_commonProperties](#_commonproperties) but returns count instead of +the objects. + +**Examples** + +A route planner example, all locations with the same properties: + +```js +--- +name: generalGraphModuleAmountProperties1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._countCommonProperties({}, {}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, all German cities which share same properties except for population. + +```js +--- +name: generalGraphModuleAmountProperties2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._countCommonProperties({}, {}, { + vertex1CollectionRestriction: 'germanCity', + vertex2CollectionRestriction: 'germanCity', + ignoreProperties: 'population' +}); +~examples.dropGraph("routeplanner"); +``` + +## _paths + +The _paths function returns all paths of a graph. + +`graph._paths(options)` + +This function determines all available paths in a graph. + +The complexity of this method is **O(n\*n\*m)** with *n* being the amount of vertices in +the graph and *m* the average amount of connected edges; + +- `options` (optional): An object containing options, see below: + - `direction`: The direction of the edges. Possible values are `"any"`, + `"inbound"`, and `"outbound"` (default). + - `followCycles` (optional): If set to `true` the query follows cycles in the graph, + default is false. + - `minLength` (optional): Defines the minimal length a path must + have to be returned (default is 0). + - `maxLength` (optional): Defines the maximal length a path must + have to be returned (default is 10). + +**Examples** + +Return all paths of the graph "social": + +```js +--- +name: generalGraphModulePaths1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("social"); +g._paths(); +~examples.dropGraph("social"); +``` + +Return all inbound paths of the graph "social" with a maximal +length of 1 and a minimal length of 2: + +```js +--- +name: generalGraphModulePaths2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("social"); +g._paths({ direction: 'inbound', minLength: 1, maxLength: 2 }); +~examples.dropGraph("social"); +``` + +## _shortestPath + +The _shortestPath function returns all shortest paths of a graph. + +`graph._shortestPath(startVertexExample, endVertexExample, options)` + +This function determines all shortest paths in a graph. +The function accepts an id, an example, a list of examples +or even an empty example as parameter for +start and end vertex. +The length of a path is by default the amount of edges from one start vertex to +an end vertex. The option weight allows the user to define an edge attribute +representing the length. + +- `startVertexExample` (optional): An example for the desired start Vertices (see [Definition of examples](#definition-of-examples)). +- `endVertexExample` (optional): An example for the desired end Vertices (see [Definition of examples](#definition-of-examples)). +- `options` (optional): An object containing options, see below: + - `direction`: The direction of the edges as a string. + Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `edgeCollectionRestriction`: One or multiple edge + collection names. Only edges from these collections will be considered for the path. + - `startVertexCollectionRestriction`: One or multiple vertex + collection names. Only vertices from these collections will be considered as + start vertex of a path. + - `endVertexCollectionRestriction`: One or multiple vertex + collection names. Only vertices from these collections will be considered as + end vertex of a path. + - `weight`: The name of the attribute of + the edges containing the length as a string. + - `defaultWeight`: Only used with the option `weight`. + If an edge does not have the attribute named as defined in option `weight` this default + is used as length. + If no default is supplied the default would be positive Infinity so the path could + not be calculated. + +**Examples** + +A route planner example, shortest path from all german to all french cities: + +```js +--- +name: generalGraphModuleShortestPaths1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("routeplanner"); +g._shortestPath({}, {}, { + weight: 'distance', + endVertexCollectionRestriction: 'frenchCity', + startVertexCollectionRestriction: 'germanCity' +}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, shortest path from Hamburg and Cologne to Lyon: + +```js +--- +name: generalGraphModuleShortestPaths2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("routeplanner"); +g._shortestPath([ + {_id: 'germanCity/Cologne'}, + {_id: 'germanCity/Munich'} +], 'frenchCity/Lyon', { weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _distanceTo + +The _distanceTo function returns all paths and there distance within a graph. + +`graph._distanceTo(startVertexExample, endVertexExample, options)` + +This function is a wrapper of [graph._shortestPath](#_shortestpath). +It does not return the actual path but only the distance between two vertices. + +**Examples** + +A route planner example, shortest distance from all german to all french cities: + +```js +--- +name: generalGraphModuleDistanceTo1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("routeplanner"); +g._distanceTo({}, {}, { + weight: 'distance', + endVertexCollectionRestriction: 'frenchCity', + startVertexCollectionRestriction: 'germanCity' +}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, shortest distance from Hamburg and Cologne to Lyon: + +```js +--- +name: generalGraphModuleDistanceTo2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("routeplanner"); +g._distanceTo([ + {_id: 'germanCity/Cologne'}, + {_id: 'germanCity/Munich'} +], 'frenchCity/Lyon', { weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _absoluteEccentricity + +Get the +[eccentricity](http://en.wikipedia.org/wiki/Distance_%28graph_theory%29) +of the vertices defined by the examples. + +`graph._absoluteEccentricity(vertexExample, options)` + +The function accepts an id, an example, a list of examples or even an empty +example as parameter for vertexExample. + +- `vertexExample` (optional): Filter the vertices, see [Definition of examples](#definition-of-examples) +- `options` (optional): An object defining further options. Can have the following values: + - `direction`: The direction of the edges. Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `edgeCollectionRestriction` : One or a list of edge-collection names that should be + considered to be on the path. + - `startVertexCollectionRestriction` : One or a list of vertex-collection names that should be + considered for source vertices. + - `endVertexCollectionRestriction` : One or a list of vertex-collection names that should be + considered for target vertices. + - `weight`: The name of the attribute of the edges containing the weight. + - `defaultWeight`: Only used with the option `weight`. + If an edge does not have the attribute named as defined in option `weight` this default + is used as weight. + If no default is supplied the default would be positive infinity so the path and + hence the eccentricity cannot be calculated. + +**Examples** + +A route planner example, the absolute eccentricity of all locations. + +```js +--- +name: generalGraphModuleAbsEccentricity1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteEccentricity({}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the absolute eccentricity of all locations. +This considers the actual distances. + +```js +--- +name: generalGraphModuleAbsEccentricity2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteEccentricity({}, { weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the absolute eccentricity of all cities regarding only +outbound paths. + +```js +--- +name: generalGraphModuleAbsEccentricity3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteEccentricity({}, { + startVertexCollectionRestriction: 'germanCity', + direction: 'outbound', + weight: 'distance' +}); +~examples.dropGraph("routeplanner"); +``` + +## _eccentricity + +Get the normalized +[eccentricity](http://en.wikipedia.org/wiki/Distance_%28graph_theory%29) +of the vertices defined by the examples. + +`graph._eccentricity(vertexExample, options)` + +Similar to [_absoluteEccentricity](#_absoluteeccentricity) but returns a normalized result. + +**Examples** + +A route planner example, the eccentricity of all locations. + +```js +--- +name: generalGraphModuleEccentricity2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._eccentricity(); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the weighted eccentricity. + +```js +--- +name: generalGraphModuleEccentricity3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._eccentricity({ weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _absoluteCloseness + +Get the +[closeness](http://en.wikipedia.org/wiki/Centrality#Closeness_centrality) +of the vertices defined by the examples. + +`graph._absoluteCloseness(vertexExample, options)` + +The function accepts an id, an example, a list of examples or even an empty +example as parameter for `vertexExample`. + +- `vertexExample` (optional): Filter the vertices, see [Definition of examples](#definition-of-examples) +- options (optional) An object defining further options. Can have the following values: + - `direction`: The direction of the edges. Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `edgeCollectionRestriction` : One or a list of edge-collection names that should be + considered to be on the path. + - `startVertexCollectionRestriction` : One or a list of vertex-collection names that should be + considered for source vertices. + - `endVertexCollectionRestriction` : One or a list of vertex-collection names that should be + considered for target vertices. + - `weight`: The name of the attribute of the edges containing the weight. + - `defaultWeight`: Only used with the option `weight`. + If an edge does not have the attribute named as defined in option `weight` this default + is used as weight. + If no default is supplied the default would be positive infinity so the path and + hence the closeness cannot be calculated. + +**Examples** + +A route planner example, the absolute closeness of all locations. + +```js +--- +name: generalGraphModuleAbsCloseness1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteCloseness({}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the absolute closeness of all locations. +This considers the actual distances. + +```js +--- +name: generalGraphModuleAbsCloseness2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteCloseness({}, { weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the absolute closeness of all German Cities regarding only +outbound paths. + +```js +--- +name: generalGraphModuleAbsCloseness3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteCloseness({}, { + startVertexCollectionRestriction: 'germanCity', + direction: 'outbound', + weight: 'distance' +}); +~examples.dropGraph("routeplanner"); +``` + +## _closeness + +Get the normalized +[closeness](http://en.wikipedia.org/wiki/Centrality#Closeness_centrality) +of graphs vertices. + +`graph._closeness(options)` + +Similar to [_absoluteCloseness](#_absolutecloseness) but returns a normalized value. + +**Examples** + +A route planner example, the normalized closeness of all locations. + +```js +--- +name: generalGraphModuleCloseness1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._closeness(); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the closeness of all locations. +This considers the actual distances. + +```js +--- +name: generalGraphModuleCloseness2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._closeness({ weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the closeness of all cities regarding only +outbound paths. + +```js +--- +name: generalGraphModuleCloseness3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._closeness({ direction: 'outbound', weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _absoluteBetweenness + +Get the +[betweenness](http://en.wikipedia.org/wiki/Betweenness_centrality) +of all vertices in the graph. + +`graph._absoluteBetweenness(vertexExample, options)` + +- `vertexExample` (optional): Filter the vertices, see [Definition of examples](#definition-of-examples) +- `options` (optional): An object defining further options. Can have the following values: + - `direction`: The direction of the edges. Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `weight`: The name of the attribute of the edges containing the weight. + - `defaultWeight`: Only used with the option `weight`. + If an edge does not have the attribute named as defined in option `weight` this default + is used as weight. + If no default is supplied the default would be positive infinity so the path and + hence the betweenness cannot be calculated. + +**Examples** + +A route planner example, the absolute betweenness of all locations. + +```js +--- +name: generalGraphModuleAbsBetweenness1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteBetweenness({}); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the absolute betweenness of all locations. +This considers the actual distances. + +```js +--- +name: generalGraphModuleAbsBetweenness2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteBetweenness({ weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the absolute betweenness of all cities regarding only +outbound paths. + +```js +--- +name: generalGraphModuleAbsBetweenness3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._absoluteBetweenness({ direction: 'outbound', weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _betweenness + +Get the normalized +[betweenness](http://en.wikipedia.org/wiki/Betweenness_centrality) +of graphs vertices. + +`graph_module._betweenness(options)` + +Similar to [_absoluteBetweenness](#_absolutebetweenness) but returns normalized values. + +**Examples** + +A route planner example, the betweenness of all locations. + +```js +--- +name: generalGraphModuleBetweenness1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._betweenness(); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the betweenness of all locations. +This considers the actual distances. + +```js +--- +name: generalGraphModuleBetweenness2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._betweenness({ weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the betweenness of all cities regarding only +outbound paths. + +```js +--- +name: generalGraphModuleBetweenness3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._betweenness({ direction: 'outbound', weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _radius + +Get the +[radius](http://en.wikipedia.org/wiki/Eccentricity_%28graph_theory%29) +of a graph. + +- `options` (optional): An object defining further options. Can have the following values: + - `direction`: The direction of the edges. Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `weight`: The name of the attribute of the edges containing the weight. + - `defaultWeight`: Only used with the option `weight`. + If an edge does not have the attribute named as defined in option `weight` this default + is used as weight. + If no default is supplied the default would be positive infinity so the path and + hence the radius cannot be calculated. + +**Examples** + +A route planner example, the radius of the graph. + +```js +--- +name: generalGraphModuleRadius1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._radius(); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the radius of the graph. +This considers the actual distances. + +```js +--- +name: generalGraphModuleRadius2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._radius({ weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the radius of the graph regarding only +outbound paths. + +```js +--- +name: generalGraphModuleRadius3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._radius({ direction: 'outbound', weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +## _diameter + +Get the +[diameter](http://en.wikipedia.org/wiki/Eccentricity_%28graph_theory%29) +of a graph. + +`graph._diameter(graphName, options)` + +- `options` (optional): An object defining further options. Can have the following values: + - `direction`: The direction of the edges. Possible values are `"outbound"`, `"inbound"`, and `"any"` (default). + - `weight`: The name of the attribute of the edges containing the weight. + - `defaultWeight`: Only used with the option `weight`. + If an edge does not have the attribute named as defined in option `weight` this default + is used as weight. + If no default is supplied the default would be positive infinity so the path and + hence the radius cannot be calculated. + +**Examples** + +A route planner example, the diameter of the graph. + +```js +--- +name: generalGraphModuleDiameter1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._diameter(); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the diameter of the graph. +This considers the actual distances. + +```js +--- +name: generalGraphModuleDiameter2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._diameter({ weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` + +A route planner example, the diameter of the graph regarding only +outbound paths. + +```js +--- +name: generalGraphModuleDiameter3 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("routeplanner"); +graph._diameter({ direction: 'outbound', weight: 'distance' }); +~examples.dropGraph("routeplanner"); +``` diff --git a/site/content/arangodb/oem/graphs/general-graphs/management.md b/site/content/arangodb/oem/graphs/general-graphs/management.md new file mode 100644 index 0000000000..fe1311661f --- /dev/null +++ b/site/content/arangodb/oem/graphs/general-graphs/management.md @@ -0,0 +1,833 @@ +--- +title: Graph Management +menuTitle: Management +weight: 5 +description: >- + How to manage named graphs of the type General Graph +--- +This chapter describes the JavaScript interface for creating and modifying +[named graphs](../_index.md#named-graphs). + +## Edge Definitions + +An edge definition is always a directed relation of a graph. Each graph can +have arbitrary many relations defined within the edge definitions array. + +### Initialize the List + +Create a list of edge definitions to construct a graph: + +`graph_module._edgeDefinitions(relation1, relation2, ..., relationN)` + +- `relation` (object, _optional_): + An object representing a definition of one relation in the graph + +The list of edge definitions of a graph can be managed by the graph module +itself. This function is the entry point for the management and returns +the correct list. + +**Examples** + +```js +--- +name: generalGraphEdgeDefinitionsSimple +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +var directed_relation = graph_module._relation("lives_in", "user", "city"); +var undirected_relation = graph_module._relation("knows", "user", "user"); +var edgedefinitions = graph_module._edgeDefinitions(directed_relation, undirected_relation); +edgedefinitions; +``` + +### Extend the List + +Extend the list of edge definitions to construct a graph: + +`graph_module._extendEdgeDefinitions(edgeDefinitions, relation1, relation2, ..., relationN)` + +- `edgeDefinitions` (array): + A list of relation definition objects. +- `relationX` (object): + An object representing a definition of one relation in the graph + +In order to add more edge definitions to the graph before creating it, +this function can be used to add more definitions to the initial list. + +**Examples** + +```js +--- +name: generalGraphEdgeDefinitionsExtend +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +var directed_relation = graph_module._relation("lives_in", "user", "city"); +var undirected_relation = graph_module._relation("knows", "user", "user"); +var edgedefinitions = graph_module._edgeDefinitions(directed_relation); +graph_module._extendEdgeDefinitions(edgedefinitions, undirected_relation); +edgedefinitions; +``` + +### Relation + +Define a directed relation: + +`graph_module._relation(relationName, fromVertexCollections, toVertexCollections)` + +- `relationName` (string): + The name of the edge collection where the edges should be stored. + It is created if it does not exist yet. +- `fromVertexCollections` (string\|array): + One or a list of collection names. Source vertices for the edges + have to be stored in these collections. Collections are created if they + do not exist. +- `toVertexCollections` (string\|array): + One or a list of collection names. Target vertices for the edges + have to be stored in these collections. Collections are created if they + do not exist. + +The `relationName` defines the name of this relation and references to the +underlying edge collection. The `fromVertexCollections` is an Array of document +collections holding the start vertices. The `toVertexCollections` is an array +of document collections holding the target vertices. Relations are only allowed +in the direction from any collection in `fromVertexCollections` to any +collection in `toVertexCollections`. + +**Examples** + +A relation from one vertex collection to another: + +```js +--- +name: generalGraphRelationDefinitionSingle +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +graph_module._relation("has_bought", "Customer", "Product"); +``` + +A relation from multiple vertex collections to multiple others: + +```js +--- +name: generalGraphRelationDefinitionSave +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +graph_module._relation("has_bought", ["Customer", "Company"], ["Groceries", "Electronics"]); +``` + +### Edge Definition Options + +The following edge definition options are supported: + +- `satellites` (array, _optional_): + An array of collection names that is used to create [SatelliteCollections](../../develop/satellitecollections.md) + for a (Disjoint) SmartGraph using SatelliteCollections (Enterprise Edition only). + Each array element must be a string and a valid collection name. The collection + type cannot be modified later. + +## Create a Graph + +`graph_module._create(graphName, edgeDefinitions, orphanCollections)` + +- `graphName` (string): + Unique identifier of the graph +- `edgeDefinitions` (array, _optional_): + List of relation definition objects +- `orphanCollections` (array, _optional_): + List of additional vertex collection names + +The creation of a graph requires the name of the graph and a definition of +its edges. + +For every type of edge definition a convenience method exists that can be used +to create a graph. Optionally a list of vertex collections can be added, which +are not used in any edge definition. These collections are referred to as +orphan collections within this chapter. All collections used within the +creation process are created if they do not exist. + +**Examples** + +Create an empty graph, edge definitions can be added at runtime: + +```js +--- +name: generalGraphCreateGraphNoData +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +graph = graph_module._create("myGraph"); +~graph_module._drop("myGraph", true); +``` + +Create a graph using an edge collection `edges` and a single +vertex collection `vertices`: + +```js +--- +name: generalGraphCreateGraphSingle +description: '' +--- +~db._drop("edges"); +~db._drop("vertices"); +var graph_module = require("@arangodb/general-graph"); +var edgeDefinitions = [ { collection: "edges", "from": [ "vertices" ], "to" : [ "vertices" ] } ]; +graph = graph_module._create("myGraph", edgeDefinitions); +~graph_module._drop("myGraph", true); +``` + +Create a graph with edge definitions and orphan collections: + +```js +--- +name: generalGraphCreateGraph2 +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +graph = graph_module._create("myGraph", [ + graph_module._relation("myRelation", ["male", "female"], ["male", "female"]) +], ["sessions"]); +~graph_module._drop("myGraph", true); +``` + +### Complete Example to Create a Graph + +Example call: + +```js +--- +name: general_graph_create_graph_example1 +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +var edgeDefinitions = graph_module._edgeDefinitions(); +graph_module._extendEdgeDefinitions(edgeDefinitions, graph_module._relation("friend_of", "Customer", "Customer")); +graph_module._extendEdgeDefinitions(edgeDefinitions, graph_module._relation( + "has_bought", ["Customer", "Company"], ["Groceries", "Electronics"]) +); +graph_module._create("myStore", edgeDefinitions); +~graph_module._drop("myStore"); +~db._drop("Electronics"); +~db._drop("Customer"); +~db._drop("Groceries"); +~db._drop("Company"); +~db._drop("has_bought"); +~db._drop("friend_of"); +``` + +Alternative call: + +```js +--- +name: general_graph_create_graph_example2 +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +var edgeDefinitions = graph_module._edgeDefinitions( + graph_module._relation("friend_of", ["Customer"], ["Customer"]), + graph_module._relation("has_bought", ["Customer", "Company"], ["Groceries", "Electronics"]) +); +graph_module._create("myStore", edgeDefinitions); +~graph_module._drop("myStore"); +~db._drop("Electronics"); +~db._drop("Customer"); +~db._drop("Groceries"); +~db._drop("Company"); +~db._drop("has_bought"); +~db._drop("friend_of"); +``` + +## List available Graphs + +Lists all graph names stored in this database: + +`graph_module._list()` + +--- + +Lists all graph definitions stored in this database: + +`graph_module._listObjects()` + +**Examples** + +List the graph names: + +```js +--- +name: generalGraphList +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +~graph_module._create("myGraph"); +~graph_module._create("myStore"); +graph_module._list(); +~graph_module._drop("myGraph"); +~graph_module._drop("myStore"); +``` + +List the graph definitions: + +```js +--- +name: generalGraphListObjects +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +~graph_module._create("myGraph", [ { collection: "edges", "from": [ "vertices" ], "to" : [ "vertices" ] } ]); +~graph_module._create("myStore", [ { collection: "friend_of", from: [ "Customer" ], to: [ "Customer" ] }, { collection: "has_bought", from: [ "Customer", "Company" ], to: [ "Groceries", "Electronics" ] } ]); +graph_module._listObjects(); +~graph_module._drop("myGraph", true); +~graph_module._drop("myStore", true); +``` + +## Load a Graph + +Get a graph by its name: + +`graph_module._graph(graphName)` + +- `graphName` (string): + Unique identifier of the graph + +**Examples** + +```js +--- +name: generalGraphLoadGraph +description: '' +--- +~var examples = require("@arangodb/graph-examples/example-graph"); +~var g1 = examples.loadGraph("social"); +var graph_module = require("@arangodb/general-graph"); +graph = graph_module._graph("social"); +~examples.dropGraph("social"); +``` + +## Remove a Graph + +Drop a Graph by its name: + +`graph_module._drop(graphName, dropCollections)` + +- `graphName` (string): + Unique identifier of the graph +- `dropCollections` (bool, _optional_): + Define if collections should be dropped (default: `false`) + +This can drop all collections contained in the graph as long as they are not +used within other graphs. To drop the collections only belonging to this graph, +the optional parameter `drop-collections` has to be set to `true`. + +**Examples** + +Drop a graph and keep collections: + +```js +--- +name: generalGraphDropGraphKeep +description: '' +--- +~var examples = require("@arangodb/graph-examples/example-graph"); +~var g1 = examples.loadGraph("social"); +var graph_module = require("@arangodb/general-graph"); +graph_module._graph("social"); +graph_module._drop("social"); +db._collection("female"); +db._collection("male"); +db._collection("relation"); +~db._drop("female"); +~db._drop("male"); +~db._drop("relation"); +~examples.dropGraph("social"); +``` + +Drop a graph and its collections: + +```js +--- +name: generalGraphDropGraphDropCollections +description: '' +--- +~var examples = require("@arangodb/graph-examples/example-graph"); +~var g1 = examples.loadGraph("social"); +var graph_module = require("@arangodb/general-graph"); +graph_module._graph("social"); +graph_module._drop("social", true); +db._collection("female"); +db._collection("male"); +db._collection("relation"); +``` + +## Modify a Graph definition at runtime + +After you have created a graph its definition is not immutable. +You can still add, delete or modify edge definitions and vertex collections. + +### Extend the Edge Definitions + +Add another edge definition to the graph: + +`graph._extendEdgeDefinitions(edgeDefinition, options)` + +- `edgeDefinition` (object): + The relation definition to extend the graph +- `options` (object): + Additional options related to the edge definition itself. + See [Edge Definition Options](#edge-definition-options). + +Extends the edge definitions of a graph. If an orphan collection is used in this +edge definition, it is removed from the orphanage. If the edge collection of +the edge definition to add is already used in the graph or used in a different +graph with different `from` and/or `to` collections an error is thrown. + +**Examples** + +```js +--- +name: general_graph__extendEdgeDefinitions +description: '' +--- +var graph_module = require("@arangodb/general-graph") +var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var ed2 = graph_module._relation("myEC2", ["myVC1"], ["myVC3"]); +var graph = graph_module._create("myGraph", [ed1]); +graph._extendEdgeDefinitions(ed2); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +### Modify an Edge Definition + +Modify a relation definition: + +`graph_module._editEdgeDefinitions(edgeDefinition, options)` + +- `edgeDefinition` (object): + The edge definition to replace the existing edge definition with the same + attribute `collection`. +- `options` (object): + Additional options related to the edge definition itself. + See [Edge Definition Options](#edge-definition-options). + +Edits one relation definition of a graph. The edge definition used as argument +replaces the existing edge definition of the graph which has the same collection. +Vertex Collections of the replaced edge definition that are not used in the new +definition are transformed to an orphan. Orphans that are used in this new edge +definition are deleted from the list of orphans. Other graphs with the same edge +definition are modified, too. + +**Examples** + +```js +--- +name: general_graph__editEdgeDefinition +description: '' +--- +var graph_module = require("@arangodb/general-graph") +var original = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var modified = graph_module._relation("myEC1", ["myVC2"], ["myVC3"]); +var graph = graph_module._create("myGraph", [original]); +graph._editEdgeDefinitions(modified); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +### Delete an Edge Definition + +Delete one relation definition: + +`graph_module._deleteEdgeDefinition(edgeCollectionName, dropCollection)` + +- `edgeCollectionName` (string): + Name of edge collection in the relation definition. +- `dropCollection` (bool, _optional_): + Define if the edge collection should be dropped. Default: `false` + +Deletes a relation definition defined by the edge collection of a graph. If the +collections defined in the edge definition (`collection`, `from`, `to`) are not used +in another edge definition of the graph, they are moved to the orphanage. + +**Examples** + +Remove an edge definition but keep the edge collection: + +```js +--- +name: general_graph__deleteEdgeDefinitionNoDrop +description: '' +--- +var graph_module = require("@arangodb/general-graph") +var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var ed2 = graph_module._relation("myEC2", ["myVC1"], ["myVC3"]); +var graph = graph_module._create("myGraph", [ed1, ed2]); +graph._deleteEdgeDefinition("myEC1"); +graph = graph_module._graph("myGraph"); +db._collection("myEC1"); +~db._drop("myEC1"); +~graph_module._drop("myGraph", true); +``` + +Remove an edge definition and drop the edge collection: + +```js +--- +name: general_graph__deleteEdgeDefinitionWithDrop +description: '' +--- +var graph_module = require("@arangodb/general-graph") +var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var ed2 = graph_module._relation("myEC2", ["myVC1"], ["myVC3"]); +var graph = graph_module._create("myGraph", [ed1, ed2]); +graph._deleteEdgeDefinition("myEC1", true); +graph = graph_module._graph("myGraph"); +db._collection("myEC1"); +~db._drop("myEC1"); +~graph_module._drop("myGraph", true); +``` + +### Extend Vertex Collections + +Each graph can have an arbitrary amount of vertex collections, which are not +part of any edge definition of the graph. These collections are called orphan +collections. If the graph is extended with an edge definition using one of the +orphans, it is removed from the set of orphan collection automatically. + +#### Add a Vertex Collection + +Add a vertex collection to the graph: + +`graph._addVertexCollection(vertexCollectionName, createCollection, options)` + +- `vertexCollectionName` (string): + Name of vertex collection. +- `createCollection` (bool, _optional_): + If `true`, the collection is created if it does not exist. Default: `true` +- `options` (object, _optional_): + Additional options related to the edge definition itself. + See [Edge Definition Options](#edge-definition-options). + +Adds a vertex collection to the set of orphan collections of the graph. If the +collection does not exist, it is created. If it is already used by any edge +definition of the graph, an error is thrown. + +**Examples** + +```js +--- +name: general_graph__addVertexCollection +description: '' +--- +var graph_module = require("@arangodb/general-graph"); +var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var graph = graph_module._create("myGraph", [ed1]); +graph._addVertexCollection("myVC3", true); +graph = graph_module._graph("myGraph"); +~db._drop("myVC3"); +~graph_module._drop("myGraph", true); +``` + +#### Get the Orphaned Collections + +Get all orphan collections: + +`graph._orphanCollections()` + +Returns all vertex collections of the graph that are not used in any +edge definition. + +**Examples** + +```js +--- +name: general_graph__orphanCollections +description: '' +--- +var graph_module = require("@arangodb/general-graph") +var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var graph = graph_module._create("myGraph", [ed1]); +graph._addVertexCollection("myVC3", true); +graph._orphanCollections(); +~graph_module._drop("myGraph", true); +``` + +#### Remove a Vertex Collection + +Remove a vertex collection from the graph: + +`graph._removeVertexCollection(vertexCollectionName, dropCollection)` + +- `vertexCollectionName` (string): + Name of vertex collection. +- `dropCollection` (bool, _optional_): + If `true`, the collection is dropped if it is not used in any other graph. + Default: `false` + +Removes a vertex collection from the graph. +Only collections not used in any relation definition can be removed. +Optionally the collection can be deleted, if it is not used in any other graph. + +**Examples** + +```js +--- +name: general_graph__removeVertexCollections +description: '' +--- +var graph_module = require("@arangodb/general-graph") +var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]); +var graph = graph_module._create("myGraph", [ed1]); +graph._addVertexCollection("myVC3", true); +graph._addVertexCollection("myVC4", true); +graph._orphanCollections(); +graph._removeVertexCollection("myVC3"); +graph._orphanCollections(); +~db._drop("myVC3"); +~graph_module._drop("myGraph", true); +``` + +## Manipulating Vertices + +### Save a Vertex + +Create a new vertex in `vertexCollectionName`: + +`graph.vertexCollectionName.save(data, options)` + +- `data` (object): + JSON data of vertex. +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionreplacedocument-data--options) + +**Examples** + +```js +--- +name: generalGraphVertexCollectionSave +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +graph.male.save({name: "Floyd", _key: "floyd"}, { returnNew: true }); +~examples.dropGraph("social"); +``` + +### Replace a Vertex + +Replaces the data of a vertex in collection `vertexCollectionName`: + +`graph.vertexCollectionName.replace(vertexId, data, options)` + +- `vertexId` (string): + `_id` attribute of the vertex +- `data` (object): + JSON data of vertex. +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionreplacedocument-data--options) + +**Examples** + +```js +--- +name: generalGraphVertexCollectionReplace +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var doc = graph.male.save({neym: "Jon", _key: "john"}); +graph.male.replace("male/john", {name: "John"}, { returnOld: true, returnNew: true }); +~examples.dropGraph("social"); +``` + +### Update a Vertex + +Updates the data of a vertex in collection `vertexCollectionName`. + +`graph.vertexCollectionName.update(vertexId, data, options)` + +- `vertexId` (string): + `_id` attribute of the vertex +- `data` (object): + JSON data of vertex. +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionupdatedocument-data--options) + +**Examples** + +```js +--- +name: generalGraphVertexCollectionUpdate +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var doc = graph.female.save({name: "Lynda", _key: "linda"}); +graph.female.update("female/linda", {name: "Linda", _key: "linda"}, { returnOld: true, returnNew: true }); +~examples.dropGraph("social"); +``` + +### Remove a Vertex + +Removes a vertex from a collection of the named graph. Additionally removes all +incoming and outgoing edges of the vertex. + +`graph.vertexCollectionName.remove(vertexId, options)` + +- `vertexId` (string): + `_id` attribute of the vertex +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionremoveobject) + +**Examples** + +```js +--- +name: generalGraphVertexCollectionRemove +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var doc = graph.male.save({name: "Kermit", _key: "kermit"}); +db._exists("male/kermit"); +var success = graph.male.remove("male/kermit"); +db._exists("male/kermit"); +~examples.dropGraph("social"); +``` + +## Manipulating Edges + +### Save a new Edge + +Creates an edge from vertex `data._from` to vertex `data._to` in collection +`edgeCollectionName`. + +`graph.edgeCollectionName.save(data, options)` + +- `data` (object): + JSON data of the edge. Needs to include a `_from` attribute with the document + identifier of the source vertex and a `_to` attribute with the document + identifier of the target vertex. +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectioninsertdata--options) + +**Examples** + +```js +--- +name: generalGraphEdgeCollectionSave1 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +graph.relation.save({ + _from: "male/bob", + _to: "female/alice", + _key: "bobAndAlice", type: "married" }, { returnNew: true }); +~examples.dropGraph("social"); +``` + +If the collections of `from` and `to` are not defined in an edge definition +of the graph, the edge is not stored. + +```js +--- +name: generalGraphEdgeCollectionSave2 +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +graph.relation.save( + "relation/aliceAndBob", + "female/alice", + {type: "married", _key: "bobAndAlice"}); // xpError(ERROR_GRAPH_INVALID_EDGE) +~examples.dropGraph("social"); +``` + +### Replace an Edge + +Replaces the data of an edge in collection `edgeCollectionName`. +Note that `_from` and `_to` are mandatory. + +`graph.edgeCollectionName.replace(edgeId, data, options)` + +- `edgeId` (string): + `_id` attribute of the edge +- `data` (object, _optional_): + JSON data of the edge +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionreplacedocument-data--options) + +**Examples** + +```js +--- +name: generalGraphEdgeCollectionReplace +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var doc = graph.relation.save("female/alice", "female/diana", {typo: "nose", _key: "aliceAndDiana"}); +graph.relation.replace("relation/aliceAndDiana", + { type: "knows", _from: "female/alice", _to: "female/diana" }, + { returnOld: true, returnNew: true }); +~examples.dropGraph("social"); +``` + +### Update an Edge + +Updates the data of an edge in collection `edgeCollectionName`. + +`graph.edgeCollectionName.update(edgeId, data, options)` + +- `edgeId` (string): + `_id` attribute of the edge +- `data` (object, _optional_): + JSON data of the edge +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionupdatedocument-data--options) + +**Examples** + +```js +--- +name: generalGraphEdgeCollectionUpdate +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var doc = graph.relation.save("female/alice", "female/diana", {type: "knows", _key: "aliceAndDiana"}); +graph.relation.update("relation/aliceAndDiana", + { type: "quarreled", _key: "aliceAndDiana" }, + { returnOld: true, returnNew: true }); +~examples.dropGraph("social"); +``` + +### Remove an Edge + +Removes an edge from an edge collection of the named graph. Any other edges +that directly reference this edge like a vertex are removed, too. + +`graph.edgeCollectionName.remove(edgeId, options)` + +- `edgeId` (string): + `_id` attribute of the edge +- `options` (object, _optional_): + See the [_collection_ object](../../develop/javascript-api/@arangodb/collection-object.md#collectionremoveobject) + +**Examples** + +```js +--- +name: generalGraphEdgeCollectionRemove +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var graph = examples.loadGraph("social"); +var doc = graph.relation.save("female/alice", "female/diana", {_key: "aliceAndDiana"}); +db._exists("relation/aliceAndDiana") +var success = graph.relation.remove("relation/aliceAndDiana") +db._exists("relation/aliceAndDiana") +~examples.dropGraph("social"); +``` diff --git a/site/content/arangodb/oem/graphs/satellitegraphs/_index.md b/site/content/arangodb/oem/graphs/satellitegraphs/_index.md new file mode 100644 index 0000000000..c4b5f0f647 --- /dev/null +++ b/site/content/arangodb/oem/graphs/satellitegraphs/_index.md @@ -0,0 +1,83 @@ +--- +title: SatelliteGraphs +menuTitle: SatelliteGraphs +weight: 90 +description: >- + Graphs synchronously replicated to all servers, available in the Enterprise Edition +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +## What is a SatelliteGraph? + +_SatelliteGraphs_ are a specialized _named graph_ type available for cluster +deployments. Their underlying collections are synchronously replicated to all +DB-Servers that are part of the cluster, which enables DB-Servers to execute +graph traversals locally. This includes shortest path and k-shortest paths +computations, and possibly even joins with traversals. They greatly improve +the performance of such queries. + +They are the natural extension of the [SatelliteCollections](../../develop/satellitecollections.md) +concept to graphs. The same benefits and caveats apply. + +![ArangoDB SatelliteGraphs](../../../../images/SatelliteGraphs.webp) + +## Why use a SatelliteGraph? + +When doing queries in an ArangoDB cluster, data has to be exchanged between +different cluster nodes if the data is sharded and therefore residing +on multiple nodes. In particular graph traversals are usually executed on a +Coordinator, because they need global information. This results in a lot of +network traffic and potentially slow query execution. + +Take a permission management use case for example, where you have a permissions +graph as well as a large, sharded collection of documents. You probably want to +determine quickly if a user, group or device has permission to access certain +information from that large collection. You would do this by traversing the +graph to figure out the permissions and then join it with the large collection. +With SatelliteGraphs, the entire permissions graph is available on all +DB-Servers. Thus, traversals can be executed locally. A traversal can even be +executed on multiple DB-Servers independently, so that the traversal results +are then available locally on every node, which means that the subsequent join +operation can also be executed without talking to other DB-Servers. + +## When to use SatelliteGraphs? + +While General Graphs are available in all Editions, the Enterprise Edition +offers two more _named graph_ types to achieve single-server alike query +execution times for graph queries in cluster deployments. + +- **General Graphs**: + The underlying collections of managed graphs can be sharded to distribute the + data across multiple DB-Servers. However, General Graphs do not enforce or + maintain special sharding properties of the collections. The document + distribution is arbitrary and data locality tends to be low. On the positive + side, it is possible to combine arbitrary sets of existing collections. + If the graph data is on a single shard, then graph queries can be executed + locally, but the results still need to be communicated to other nodes. + +- **SmartGraphs**: + Shard the data based on an attribute value, so that documents with the same + value are stored on the same DB-Server. This can improve data locality and + reduce the number of network hops between cluster nodes depending on the + graph layout and traversal query. It is suitable for large scale graphs, + because the graph data gets sharded to distribute it across multiple + DB-Servers. Use SmartGraphs instead of General Graphs whenever possible for + a performance boost. + +- **SatelliteGraph**: + Make the entire graph available on all DB-Servers using synchronous + replication. All vertices and edges will be available on every node for + maximum data locality. No network hops are required to traverse the graph. + The graph data must fit on each node, therefore it will typically be a small + to medium sized graph. The performance will be the highest if you are not + permanently updating the graph's structure and content because every change + needs to be replicated to all other DB-Servers. + +With SatelliteGraphs, the performance of writes into the affected graph collections +will become slower due the fact that the graph data is replicated to the +participating DB-Servers. Also, as writes are performed on every DB-Server, it +will allocate more storage distributed around the whole cluster environment. + +If you want to distribute a very large graph and you don't want to replicate +all graph data to all DB-Servers that are part of your cluster, then you should +consider [SmartGraphs](../smartgraphs/_index.md) instead. diff --git a/site/content/arangodb/oem/graphs/satellitegraphs/details.md b/site/content/arangodb/oem/graphs/satellitegraphs/details.md new file mode 100644 index 0000000000..21ca99c007 --- /dev/null +++ b/site/content/arangodb/oem/graphs/satellitegraphs/details.md @@ -0,0 +1,254 @@ +--- +title: SatelliteGraph Details +menuTitle: Details +weight: 10 +description: >- + How to create and use SatelliteGraphs +--- +Below you find usage examples and advanced configuration possibilities for +SatelliteGraphs. The examples use _arangosh_ and the +`@arangodb/satellite-graph` module. You can also manage SatelliteGraphs via +the [HTTP API](../../develop/http-api/graphs/named-graphs.md). + +## How to create a SatelliteGraph + +SatelliteGraphs enforce and rely on special properties of the underlying +collections and hence can only work with collections that are either created +implicitly through the SatelliteGraph interface, or manually with the correct +properties: + +- There needs to be a [prototype collection](#the-prototype-collection) with + `replicationFactor` set to `"satellite"` +- All other collections need to have `distributeShardsLike` set to the name + of the prototype collection + +Collections can be part of multiple SatelliteGraphs. This means that in +contrast to SmartGraphs, SatelliteGraphs can be overlapping. If you have a +larger SatelliteGraph and want to create an additional SatelliteGraph which +only covers a part of it, then you can do so. + +### Create a graph + +To create a SatelliteGraph in arangosh, use the `satellite-graph` module: + +```js +--- +name: satelliteGraphCreate1 +description: '' +type: cluster +--- +var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +graph = satelliteGraphModule._graph("satelliteGraph"); +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +In contrast to General Graphs and SmartGraphs, you do not need to take care of +the sharding and replication properties. The properties `distributeShardsLike`, +`replicationFactor` and `numberOfShards` will be set automatically. + +### Add vertex collections + +Adding vertex collections is analogous to General Graphs: + +```js +--- +name: satelliteGraphCreate2 +description: '' +type: cluster +--- +~var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +graph._addVertexCollection("aVertexCollection"); +graph = satelliteGraphModule._graph("satelliteGraph"); +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +If the collection `"aVertexCollection"` doesn't exist yet, then the +SatelliteGraph module creates it automatically with the correct +properties. If it exists already, then its properties must be suitable for a +SatelliteGraph (see [prototype collection](#the-prototype-collection)). +Otherwise, it is not added. + +### Define relations + +Adding edge collections works the same as with General Graphs, but again, the +collections are created by the SatelliteGraph module with the right properties +if they don't exist already. + +```js +--- +name: satelliteGraphCreate3 +description: '' +type: cluster +--- +~var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +var relation = satelliteGraphModule._relation("isFriend", ["person"], ["person"]); +graph._extendEdgeDefinitions(relation); +graph = satelliteGraphModule._graph("satelliteGraph"); +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +Existing edge collections can be added, but they require the +`distributeShardsLike` property to reference the prototype collection. + +## The prototype collection + +Every SatelliteGraph needs exactly one document collection with +`replicationFactor` set to `"satellite"`. This automatically leads to the +collection having an exact amount of one shard per collection. This collection +is selected as prototype. + +All other collections of the SatelliteGraph need to inherit its properties by +referencing its name in the `distributeShardsLike` property. + +If collections are created implicitly through the SatelliteGraph module, then +this is handled for you automatically. If you want to create the collections +manually before adding them to the SatelliteGraph, then you need to take care +of these properties. + +### Prototype collection examples + +Creating an empty SatelliteGraph: No prototype collection is present. + +```js +--- +name: satelliteGraphPrototype1 +description: '' +type: cluster +--- +var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +graph; +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +Creating an empty SatelliteGraph, then adding a document (vertex) collection. +This leads to the creation of a prototype collection `"myPrototypeColl"` +(assuming that no collection with this name existed before): + +```js +--- +name: satelliteGraphPrototype2 +description: '' +type: cluster +--- +var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +graph._addVertexCollection("myPrototypeColl"); +graph = satelliteGraphModule._graph("satelliteGraph"); +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +Creating an empty SatelliteGraph, then adding an edge definition. +This will select the collection `"person"` as prototype collection, as it is +the only document (vertex) collection. If you supply more than one document +collection, then one of the collections will be chosen arbitrarily as +prototype collection. + +```js +--- +name: satelliteGraphPrototype3 +description: '' +type: cluster +--- +var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +var relation = satelliteGraphModule._relation("isFriend", ["person"], ["person"]); +graph._extendEdgeDefinitions(relation); +graph = satelliteGraphModule._graph("satelliteGraph"); +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +The prototype collection can and also is automatically selected during the +graph creation process if at least one document (vertex) collection is supplied +directly. If more then one are available, they are chosen randomly as well, +regardless whether they are set inside the edge definition itself or set as a +vertex/orphan collection. + +## Utilizing SatelliteGraphs + +Obviously, a SatelliteGraph must be created before it can be queried. Valid +operations that can then be optimized are (k-)shortest path(s) computations and +traversals. Both also allow for combination with local joins or other +SatelliteGraph operations. + +Here is an example showing the difference between the execution of a General Graph +and a SatelliteGraph traversal query: + +1. First we setup our graphs and collections. + + ```js + --- + name: satelliteGraphGeneralGraph1 + description: '' + type: cluster + --- + var graphModule = require("@arangodb/general-graph"); + var satelliteGraphModule = require("@arangodb/satellite-graph"); + graphModule._create("normalGraph", [ graphModule._relation("edges", "vertices", "vertices") ], [], {}); + satelliteGraphModule._create("satelliteGraph", [ satelliteGraphModule._relation("satEdges", "satVertices", "satVertices") ], [], {}); + db._create("collection", {numberOfShards: 8}); + ~db._drop("collection"); + ~satelliteGraphModule._drop("satelliteGraph", true); + ~graphModule._drop("normalGraph", true); + ``` + +2. Let us analyze a query involving a traversal: + + ```js + --- + name: satelliteGraphGeneralGraph2 + description: '' + type: cluster + --- + ~var graphModule = require("@arangodb/general-graph"); + ~var satelliteGraphModule = require("@arangodb/satellite-graph"); + ~graphModule._create("normalGraph", [ graphModule._relation("edges", "vertices", "vertices") ], [], {}); + ~satelliteGraphModule._create("satelliteGraph", [ satelliteGraphModule._relation("satEdges", "satVertices", "satVertices") ], [], {}); + ~db._create("collection", {numberOfShards: 8}); + db._explain(`FOR doc in collection FOR v,e,p IN OUTBOUND "vertices/start" GRAPH "normalGraph" RETURN [doc,v,e,p]`, {}, {colors: false}); + ~db._drop("collection"); + ~satelliteGraphModule._drop("satelliteGraph", true); + ~graphModule._drop("normalGraph", true); + ``` + + You can see that the `TraversalNode` is executed on a Coordinator, and only + the `EnumerateCollectionNode` is executed on DB-Servers. This happens for + each of the 8 shards in `collection`. + +3. Let us now have a look at the same query using a SatelliteGraph: + + ```js + --- + name: satelliteGraphGeneralGraph3 + description: '' + type: cluster + --- + ~var graphModule = require("@arangodb/general-graph"); + ~var satelliteGraphModule = require("@arangodb/satellite-graph"); + ~graphModule._create("normalGraph", [ graphModule._relation("edges", "vertices", "vertices") ], [], {}); + ~satelliteGraphModule._create("satelliteGraph", [ satelliteGraphModule._relation("satEdges", "satVertices", "satVertices") ], [], {}); + ~db._create("collection", {numberOfShards: 8}); + db._explain(`FOR doc in collection FOR v,e,p IN OUTBOUND "vertices/start" GRAPH "satelliteGraph" RETURN [doc,v,e,p]`, {}, {colors: false}); + ~db._drop("collection"); + ~satelliteGraphModule._drop("satelliteGraph", true); + ~graphModule._drop("normalGraph", true); + ``` + + Note that now the `TraversalNode` is executed on each DB-Server, leading to a + great reduction in required network communication, and hence potential gains + in query performance. + +## Convert General Graphs or SmartGraphs to SatelliteGraphs + +If you want to transform an existing General Graph or SmartGraph into a +SatelliteGraph, then you need to dump and restore your previous graph. +This is necessary for the initial data replication and because some collection +properties are immutable. + +Use _arangodump_ and _arangorestore_. The only thing you have to change in this +pipeline is that you create the new collections during creation with the +SatelliteGraph module or add collections manually to the SatelliteGraph +**before starting the arangorestore process**. diff --git a/site/content/arangodb/oem/graphs/satellitegraphs/management.md b/site/content/arangodb/oem/graphs/satellitegraphs/management.md new file mode 100644 index 0000000000..208aebc850 --- /dev/null +++ b/site/content/arangodb/oem/graphs/satellitegraphs/management.md @@ -0,0 +1,320 @@ +--- +title: SatelliteGraph Management +menuTitle: Management +weight: 5 +description: >- + How to manage named graphs of the type SatelliteGraph +--- +This chapter describes the `satellite-graph` module, the JavaScript API to +create and modify your SatelliteGraphs in ArangoDB. + +To generally understand the concept of the graph modules please see +[General Graph Management](../general-graphs/management.md) first. +In the following only the overloaded functionality is described. +Everything else works alike in both modules. + +## Create a Graph + +In contrast to General Graphs and SmartGraphs, you do not need to take care of +the sharding and replication properties. The properties `distributeShardsLike`, +`replicationFactor` and `numberOfShards` will be set automatically (also see +[prototype collection](details.md#the-prototype-collection)). + +The format of the relations is identical. + +```js +var graph_module = require("@arangodb/satellite-graph"); +graph_module._create(graphName, edgeDefinitions, orphanCollections); +``` + +- `graphName` (string): + Unique identifier of the graph +- `edgeDefinitions` (array): + List of relation definition objects, may be empty +- `orphanCollections` (array): + List of additional vertex collection names, may be empty + +Both `edgeDefinitions` and `orphanCollections` are optional. +You can also add collections later, after the SatelliteGraph creation took place. + +The `edgeDefinitions` can be created using the convenience method `_relation()` +known from the `general-graph` module, which is also available here. + +`orphanCollections` again is just a list of additional vertex collections which +are not yet connected via edges but should follow the same sharding to be +connected later on. + +All collections used within the creation process are newly created or, if already +available, checked against the collection properties. The process will fail if one +of them already exists, unless they have the correct sharding already. All newly +created collections will immediately be dropped again in the failure case. + +**Examples** + +Create a graph without relations. Edge definitions can be added later: + +```js +--- +name: satelliteGraphManagementCreate1 +description: '' +type: cluster +--- +var satelliteGraphModule = require("@arangodb/satellite-graph"); +var graph = satelliteGraphModule._create("satelliteGraph"); +satelliteGraphModule._graph("satelliteGraph"); +~satelliteGraphModule._drop("satelliteGraph", true); +``` + +Create a graph using an edge collection `edges` and a single vertex collection +`vertices` as relation: + +```js +--- +name: satelliteGraphManagementCreate2 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/satellite-graph"); +var edgeDefinitions = [ graph_module._relation("edges", "vertices", "vertices") ]; +var graph = graph_module._create("myGraph", edgeDefinitions); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +Create a graph with edge definitions and orphan collections: + +```js +--- +name: satelliteGraphManagementCreate3 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/satellite-graph"); +var edgeDefinitions = [ graph_module._relation("myRelation", ["male", "female"], ["male", "female"]) ]; +var graph = graph_module._create("myGraph", edgeDefinitions, ["sessions"]); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +## Modify a SatelliteGraph definition at runtime + +After you have created a SatelliteGraph its definition is not immutable. You can +still add or remove relations. This is again identical to General Graphs. + +However there is one important difference: You can only add collections that +either *do not exist*, or that have been created with the correct collection +properties (either through the graph module or manually). + +### Remove a vertex collection + +Remove a vertex collection from the graph: + +`graph._removeVertexCollection(vertexCollectionName, dropCollection)` + +- `vertexCollectionName` (string): + Name of vertex collection. +- `dropCollection` (bool, _optional_): + If true the collection will be dropped if it is not used in any other graph. + Default: false. + +In most cases this function works identically to the General Graph one. +But there is one special case: The first vertex collection added to the graph +(either orphan or a vertex collection within a relation) defines the sharding +for all collections within the graph. They have their `distributeShardsLike` +attribute set to the name of the +[prototype collection](details.md#the-prototype-collection) +This collection cannot be dropped as long as other collections follow its sharding +(i.e. they need to be dropped first). + +**Examples** + +Create a SatelliteGraph and list its orphan collections: + +```js +--- +name: satelliteGraphManagementModify1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/satellite-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], ["other"]); +graph._orphanCollections(); +~graph_module._drop("myGraph", true); +``` + +Remove the orphan collection from the SatelliteGraph and drop the collection: + +```js +--- +name: satelliteGraphManagementModify2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/satellite-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"]); +graph._removeVertexCollection("other", true); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +Attempting to remove a non-orphan collection results in an error: + +```js +--- +name: satelliteGraphManagementModify3 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/satellite-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], []); +graph._removeVertexCollection("vertices"); // xpError(ERROR_GRAPH_NOT_IN_ORPHAN_COLLECTION) +~graph_module._drop("myGraph", true); +``` + +You cannot drop the prototype collection (`vertices`) as long as it defines the +sharding for other collections (`edges`). + +```js +--- +name: satelliteGraphManagementModify4 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/satellite-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], []); +graph._deleteEdgeDefinition("edges"); +graph._removeVertexCollection("vertices"); +db._drop("vertices"); // xpError(ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE) +~graph_module._drop("myGraph", true); +~db._drop("edges"); +~db._drop("vertices"); +``` + +You may drop the complete graph including the underlying collections by setting +the second argument in the call to `_drop()` to `true`. This will only drop +collections that are in the graph definition at that point. Remember to manually +drop collections that you might have removed from the graph beforehand. + +```js +--- +name: satelliteGraphManagementModify5 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/satellite-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], []); +graph._deleteEdgeDefinition("edges"); // Remove edge collection from graph definition +graph._removeVertexCollection("vertices"); // Remove vertex collection from graph definition +graph_module._drop("myGraph", true); // Does not drop any collections because none are left in the graph definition +db._drop("edges"); // Manually clean up the collections that were left behind, drop 'edges' before sharding-defining 'vertices' collection +db._drop("vertices"); +``` + +Alternatively, you can `truncate()` all collections of the graph if you just +want to get rid of the data but keep the collections and graph definition. + +### Remove an edge definition + +Delete an edge definition from the graph: + +`graph._deleteEdgeDefinition(edgeCollectionName, dropCollection)` + +- `edgeCollectionName` (string): + Name of edge collection. +- `dropCollection` (bool, _optional_): + If true the collection will be dropped if it is not used in any other graph. + Default: false. + +**Examples** + +Create a SatelliteGraph, then delete the edge definition and drop the edge collection: + +```js +--- +name: satelliteGraphManagementModify6 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/satellite-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], []); +graph._deleteEdgeDefinition("edges", true); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +It is allowed to remove the vertex collection `vertices` if it is not used in +any relation (i.e. after the deletion of the edge definition): + +```js +--- +name: satelliteGraphManagementModify7 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/satellite-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], []); +graph._deleteEdgeDefinition("edges"); +graph._removeVertexCollection("vertices"); +~graph_module._drop("myGraph", true); +~db._drop("edges"); +~db._drop("vertices"); +``` + +Keep in mind that you cannot drop the `vertices` collection until no other +collection references it anymore (`distributeShardsLike` collection property). + +## Remove a Graph + +Remove a SatelliteGraph: + +`graph_module._drop(graphName, dropCollections)` + +- `graphName` (string): + Name of the Graph. +- `dropCollections` (bool, _optional_): + Define if collections should be dropped. Default: false. + +**Examples** + +Delete a SatelliteGraph and drop its collections: + +```js +--- +name: satelliteGraphManagementRemove1 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/satellite-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"]); +graph_module._drop("myGraph", true); +``` + +Note that removing a graph with the option to drop the collections fails if +you removed collections from the graph but did not drop these collections. +This is because their `distributeShardsLike` attribute still references +collections that are part of the graph. Dropping collections while others +point to them in this way is not allowed. Make sure to drop the referencing +collections first. + +```js +--- +name: satelliteGraphManagementRemove2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/satellite-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"]); +graph._removeVertexCollection("other"); +graph_module._drop("myGraph", true); // xpError(ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE) +~db._drop("other"); +~db._drop("vertices"); +``` diff --git a/site/content/arangodb/oem/graphs/smartgraphs/_index.md b/site/content/arangodb/oem/graphs/smartgraphs/_index.md new file mode 100644 index 0000000000..e3faa431ba --- /dev/null +++ b/site/content/arangodb/oem/graphs/smartgraphs/_index.md @@ -0,0 +1,125 @@ +--- +title: SmartGraphs +menuTitle: SmartGraphs +weight: 95 +description: >- + SmartGraphs enable you to manage graphs at scale using value-based sharding +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +SmartGraphs are specifically targeted at graphs that need scalability and +high performance. The way SmartGraphs use the ArangoDB cluster sharding makes it +extremely useful for distributing data across multiple servers with minimal +network latency. + +Most graphs have one feature - a value that is stored in every vertex - that +divides the entire graph into several smaller subgraphs. These subgraphs have a +large amount of edges that only connect vertices in the same subgraph and only +have few edges connecting vertices from other subgraphs. If this feature is +known, SmartGraphs can make use if it. + +Examples for such graphs are: + +- **Social Networks**\ + Typically the feature here is the region/country users live in. Every user has + more contacts in the same region/country than in other regions/countries. + +- **Transport Systems**\ + For transport systems, the common feature is the region/country. There are + many local connections, but only a few go across countries. + +- **E-Commerce**\ + In this case, the category of products is a good feature. Products of the same + category are often bought together. + +In terms of querying there is no difference between SmartGraphs and General Graphs. +For graph querying please refer to [AQL Graph Operations](../../aql/graphs/_index.md) +and [General Graph Functions](../general-graphs/functions.md) sections. +The optimizer is clever enough to identify +whether it is a SmartGraph or not. + +Do the hands-on +[ArangoDB SmartGraphs Tutorial](https://www.arangodb.com/using-smartgraphs-arangodb/) +to learn more. + +## How SmartGraphs work + +Typically, when you shard your data with ArangoDB the goal is to have an even +distribution of data across multiple servers. This approach allows you to scale +out your data at a rather high speed in most cases. However, since one of the +best features of ArangoDB is fast graph traversals, this sort of distribution +can start causing problems if your data grows exponentially. + +Instead of traveling across every server before returning data, SmartGraphs use +a clever and optimized way of moving data through the cluster so that you retain +the scalability as well as the performance of graph traversals in ArangoDB. + +The examples below illustrate the difference in how data is sharded in the +cluster for both scenarios. Let's take a closer look at it. + +### Random data distribution + +The natural distribution of data for graphs that handle large datasets involves +a series of highly interconnected nodes with many edges running between them. + +![Random data distribution](../../../../images/SmartGraphs_random_distribution.png) + +_The orange line indicates an example graph traversal. Notice how it touches nodes on every server._ + +Once you start connecting the nodes to each other, it becomes clear that the +graph traversal might need to travel across every server before returning +results. This sort of distribution results in many network hops between +DB-Servers and Coordinators. + +### Smart data distribution + +By optimizing the distribution of data, SmartGraphs reduce the number of network +hops traversals require. + +SmartGraphs come with a concept of a `smartGraphAttribute` that is used to +inform the database how exactly to shard data. When defining this attribute, +think of it as a value that is stored in every vertex. For instance, in +social network datasets, this attribute can be the ID or the region/country of +the users. + +The graph will than be automatically sharded in such a way that all vertices +with the same value are stored on the same physical machine, all edges +connecting vertices with identical `smartGraphAttribute` values are stored on +this machine as well. Sharding with this attribute means that the relevant data +is now co-located on servers, whenever possible. + +![SmartGraphs data distribution](../../../../images/SmartGraphs_distribution.png) + +_The outcome of moving the data like this is that you retain the scalability as well as the performance of graph traversals in ArangoDB._ + +## SmartGraphs using SatelliteCollections + +These SmartGraphs are capable of using [SatelliteCollections](../../develop/satellitecollections.md) +within their graph definition. Therefore, edge definitions defined between +SmartCollections and SatelliteCollections can be created. As SatelliteCollections +(and the edge collections between SmartGraph collections and SatelliteCollections) +are globally replicated to each participating DB-Server, (weighted) graph traversal, +and (k-)shortest path(s) query can partially be executed locally on each DB-Server. +This means a larger part of the query can be executed fully local +whenever data from the SatelliteCollections is required. + +![SmartGraphs with SatelliteCollections](../../../../images/SmartGraphs-using-SatelliteCollections.png) + +## Disjoint SmartGraphs + +Disjoint SmartGraphs are are useful for use cases which have to deal with a +large forest of graphs, when you have clearly separated subgraphs in your +graph dataset. Disjoint SmartGraphs enable the automatic sharding of these +subgraphs and prohibit edges connecting them. + +![Disjoint SmartGraphs](../../../../images/SmartGraphs-Disjoint.png) + +_This ensures that graph traversals, shortest path, and k-shortest-paths queries +can be executed locally on a DB-Server, achieving improved performance for +these type of queries._ + +## Disjoint SmartGraphs using SatelliteCollections + +Disjoint SmartGraphs using SatelliteCollections prohibit +edges between vertices with different `smartGraphAttribute` values. +All SmartVertices can be connected to SatelliteVertices. diff --git a/site/content/arangodb/oem/graphs/smartgraphs/getting-started.md b/site/content/arangodb/oem/graphs/smartgraphs/getting-started.md new file mode 100644 index 0000000000..cae518afd9 --- /dev/null +++ b/site/content/arangodb/oem/graphs/smartgraphs/getting-started.md @@ -0,0 +1,207 @@ +--- +title: Getting started with SmartGraphs +menuTitle: Getting Started +weight: 5 +description: >- + How to create and use SmartGraphs +--- +SmartGraphs **cannot use existing collections**. When switching to SmartGraph +from an existing dataset you have to import the data into a fresh SmartGraph. + +All collections that are being used in SmartGraphs need to be part of the same +`distributeShardslike` group. The `smartGraphAttribute` and the number of +shards are immutable. +The `smartGraphAttribute` attribute is used to inform the database how to shard +data and, as a consequence, all vertices must have this attribute. The `_from` +and `_to` attributes that point _from_ one document _to_ another document +stored in vertex collections are set by default, following the same smart +sharding pattern. + +## Create a SmartGraph using the web interface + +The web interface (also called Web UI) allows you to easily create and manage +SmartGraphs. To get started, follow the steps outlined below. + +1. In the web interface, navigate to the **GRAPHS** section. +2. To add a new graph, click **Add Graph**. +3. In the **Create Graph** dialog that appears, select the + **SmartGraph** tab. +4. Fill in all the following fields: + - For **Name**, enter a name for the SmartGraph. + - For **Shards**, enter the number of parts to split the graph into. + - Optional: For **Replication factor**, enter the total number of + desired copies of the data in the cluster. + - Optional: For **Write concern**, enter the total number of copies + of the data in the cluster required for each write operation. + - For **SmartGraph Attribute**, insert the attribute that is used to + smartly shard the vertices of the graph. Every vertex in your graph + needs to have this attribute. Note that it cannot be modified later. + - Optional: For **SatelliteCollections**, insert vertex collections + that are used in your edge definitions. These collections are + then created as satellites, and thus replicated to all DB-Servers. +5. Define the relations on the graph: + - For **Edge definition**, insert a single non-existent name to define + the relation of the graph. This automatically creates a new edge + collection, which is displayed in the **COLLECTIONS** section of the + left sidebar menu. + {{< tip >}} + To define multiple relations, press the **Add relation** button. + To remove a relation, press the **Remove relation** button. + {{< /tip >}} + - For **fromCollections**, insert a list of vertex collections + that contain the start vertices of the relation. + - For **toCollections**, insert a list of vertex collections that + contain the end vertices of the relation. + {{< tip >}} + Insert only non-existent collection names. Collections are automatically + created during the graph setup and are displayed in the + **Collections** tab of the left sidebar menu. + {{< /tip >}} + - For **Orphan collections**, insert a list of vertex collections + that are part of the graph but not used in any edge definition. +6. Click **Create**. +7. Click the card of the newly created graph and use the functions of the Graph + Viewer to visually interact with the graph and manage the graph data. + +![Create SmartGraph](../../../../images/Create-SmartGraph.png) + +## Create a SmartGraph using *arangosh* + +In contrast to General Graphs we have to add more options when creating the +SmartGraph. The two options `smartGraphAttribute` and `numberOfShards` are +required and cannot be modified later. + +```js +--- +name: smartGraphCreateGraphHowTo1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var graph = graph_module._create("myGraph", [], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph; +~graph_module._drop("myGraph"); +``` + +## Create a Disjoint SmartGraph using *arangosh* + +In contrast to regular SmartGraphs we have to add one option when creating the +graph. The boolean option `isDisjoint` is required, needs to be set to `true` +and cannot be modified later. + +```js +--- +name: smartGraphCreateGraphHowToDisjoint1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var graph = graph_module._create("myGraph", [], [], {smartGraphAttribute: "region", numberOfShards: 9, isDisjoint: true}); +graph; +~graph_module._drop("myGraph"); +``` + +## Add vertex collections + +This is analogous to General Graphs. Unlike with General Graphs, the +**collections must not exist** when creating the SmartGraph. The SmartGraph +module will create them for you automatically to set up the sharding for all +these collections correctly. If you create collections via the SmartGraph +module and remove them from the graph definition, then you may re-add them +without trouble however, as they will have the correct sharding. + +```js +--- +name: smartGraphCreateGraphHowTo2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var graph = graph_module._create("myGraph", [], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._addVertexCollection("shop"); +graph._addVertexCollection("customer"); +graph._addVertexCollection("pet"); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +## Define relations on the Graph + +Adding edge collections works the same as with General Graphs, but again, the +collections are created by the SmartGraph module to set up sharding correctly +so they must not exist when creating the SmartGraph (unless they have the +correct sharding already). + +```js +--- +name: smartGraphCreateGraphHowTo3 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var graph = graph_module._create("myGraph", [], [], {smartGraphAttribute: "region", numberOfShards: 9}); +~graph._addVertexCollection("shop"); +~graph._addVertexCollection("customer"); +~graph._addVertexCollection("pet"); +var rel = graph_module._relation("isCustomer", ["shop"], ["customer"]); +graph._extendEdgeDefinitions(rel); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +## Using SatelliteCollections in SmartGraphs + +When creating a collection, you can decide whether it's a SatelliteCollection +or not. For example, a vertex collection can be satellite as well. +SatelliteCollections don't require sharding as the data will be distributed +globally on all DB-Servers. The `smartGraphAttribute` is also not required. + +### Create a SmartGraph using SatelliteCollections + +In addition to the attributes you would set to create a SmartGraph, there is an +additional attribute `satellites` you can optionally set. It needs to be an array of +one or more collection names. These names can be used in edge definitions +(relations) and these collections will be created as SatelliteCollections. +However, all vertex collections on one side of the relation have to be of +the same type - either all satellite or all smart. This is because `_from` +and `_to` can have different types based on the sharding pattern. + +In this example, both vertex collections are created as SatelliteCollections. + +{{< info >}} +When providing a satellite collection that is not used in a relation, +it will not be created. If you create the collection in a following +request, only then the option will count. +{{< /info >}} + +```js +--- +name: hybridSmartGraphCreateGraphHowTo1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var rel = graph_module._relation("isCustomer", "shop", "customer") +var graph = graph_module._create("myGraph", [rel], [], {satellites: ["shop", "customer"], smartGraphAttribute: "region", numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +### Create a Disjoint SmartGraph using SatelliteCollections + +The option `isDisjoint` needs to be set to `true` in addition to the other +options for a SmartGraph using SatelliteCollections. Only the `shop` vertex collection is created +as a SatelliteCollection in this example: + +```js +--- +name: hybridSmartGraphCreateGraphHowTo2 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var rel = graph_module._relation("isCustomer", "shop", "customer") +var graph = graph_module._create("myGraph", [rel], [], {satellites: ["shop"], smartGraphAttribute: "region", isDisjoint: true, numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` diff --git a/site/content/arangodb/oem/graphs/smartgraphs/management.md b/site/content/arangodb/oem/graphs/smartgraphs/management.md new file mode 100644 index 0000000000..14f44dfe61 --- /dev/null +++ b/site/content/arangodb/oem/graphs/smartgraphs/management.md @@ -0,0 +1,354 @@ +--- +title: SmartGraph Management +menuTitle: Management +weight: 10 +description: >- + How to manage named graphs of the type SmartGraph +--- +This chapter describes the JavaScript interface for creating and modifying +SmartGraphs. A SmartGraph is a specialized version of a General Graph, which +means all of the General Graph functionality is available on a SmartGraph as +well. The major difference of both modules is handling of the underlying +collections: + +- General Graphs do not enforce or maintain any sharding of the collections + and can therefore combine arbitrary sets of existing collections. +- SmartGraphs enforce and rely on a special sharding of the underlying + collections and hence can only work with collections that are created + through the SmartGraph itself. This also means that SmartGraphs cannot be + overlapping. A collection can either be sharded for one SmartGraph or for + another. If you need to make sure that all queries can be executed with + SmartGraph performance, just create one large SmartGraph covering everything + and query it stating the subset of edge collections explicitly. + +To generally understand the concept of this module please read the chapter +about [General Graph Management](../general-graphs/management.md) first. +In the following, only the overloaded functionality is described. +Everything else works identical in both modules. + +## Create a Graph + +SmartGraphs require edge relations to be created. The format of the +relations is identical to the format used for General Graphs. +The only difference is that all collections used within +the relations to create a new SmartGraph must not exist yet. You have to let +the SmartGraph module create the Graph collections for you, so that it can +enforce the correct sharding. + +`graph_module._create(graphName, edgeDefinitions, orphanCollections, smartOptions)` + +- `graphName` (string): + Unique identifier of the graph +- `edgeDefinitions` (array): + List of relation definition objects, may be empty +- `orphanCollections` (array): + List of additional vertex collection names, may be empty +- `smartOptions` (object): + A JSON object having the following keys: + - `numberOfShards` (number): + The number of shards that are created for each collection. To maintain + the correct sharding, all collections need an identical number of shards. + This cannot be modified after creation of the graph. + - `smartGraphAttribute` (string): + The attribute that is used for sharding: vertices with the same value of + this attribute are placed in the same shard. All vertices are required to + have this attribute set and it has to be a string. Edges derive the + attribute from their connected vertices. + - `isDisjoint` (bool, _optional_): + If set to `true`, a Disjoint SmartGraph is created. This flag is not + editable after creation. Default: `false`. + - `satellites` (array, _optional_): + An array of collection names that is used to create + [SatelliteCollections](../../develop/satellitecollections.md) for a (Disjoint) SmartGraph + using SatelliteCollections. + Each array element must be a string and a valid collection name. + The collection type cannot be modified later. + +The creation of a graph requires the name and some SmartGraph options. +Due to the API `edgeDefinitions` and `orphanCollections` have to be given, but +both can be empty arrays and be added later. + +The `edgeDefinitions` can be created using the convenience method `_relation` +known from the `general-graph` module, which is also available here. + +`orphanCollections` again is just a list of additional vertex collections which +are not yet connected via edges but should follow the same sharding to be +connected later on. Note that these collections are not necessarily orphans in +the graph theoretic sense: it is possible to add edges having one end in a collection +that has been declared as orphan. + +All collections used within the creation process are newly created. +The process fails if one of them already exists, unless they have the +correct sharding already. All newly created collections are immediately +be dropped again in the failure case. + +**Examples** + +Create a graph without relations. Edge definitions can be added later: + +```js +--- +name: smartGraphCreate1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var graph = graph_module._create("myGraph", [], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +Create a graph using an edge collection `edges` and a single vertex collection +`vertices` as relation: + +```js +--- +name: smartGraphCreate2 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var edgeDefinitions = [ graph_module._relation("edges", "vertices", "vertices") ]; +var graph = graph_module._create("myGraph", edgeDefinitions, [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +Create a graph with edge definitions and orphan collections: + +```js +--- +name: smartGraphCreate3 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var edgeDefinitions = [ graph_module._relation("myRelation", ["male", "female"], ["male", "female"]) ]; +var graph = graph_module._create("myGraph", edgeDefinitions, ["sessions"], {smartGraphAttribute: "region", numberOfShards: 9}); +graph; +~graph_module._drop("myGraph", true); +``` + +## Modify a graph definition at runtime + +After you have created a SmartGraph its definition is not immutable. You can +still add or remove relations. This is again identical to General Graphs. + +However there is one important difference: you can only add collections that +either *do not exist*, or that have been created by this graph earlier. The +latter can be the case if you, for example, remove an orphan collection from this +graph, without dropping the collection itself. When after some time you decide +to add it to the graph again, you can do it. This is because the enforced sharding is still +applied to this vertex collection. + +### Remove a vertex collection + +Remove a vertex collection from the graph: + +`graph._removeVertexCollection(vertexCollectionName, dropCollection)` + +- `vertexCollectionName` (string): + Name of vertex collection. +- `dropCollection` (bool, _optional_): + If `true`, the collection is dropped if it is not used in any other graph. + Default: `false`. + +In most cases this function works identically to the General Graph one. +However there is one special case: The first vertex collection added to the graph +(either orphan or within a relation) defines the sharding for all collections +within the graph. Every other collection has its `distributeShardsLike` attribute set to the +name of the initial collection. This collection cannot be dropped as long as +other collections follow its sharding (i.e. they need to be dropped first). + +**Examples** + +Create a SmartGraph and list its orphan collections: + +```js +--- +name: smartGraphModify1 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], ["other"], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._orphanCollections(); +~graph_module._drop("myGraph", true); +``` + +Remove the orphan collection from the SmartGraph and drop the collection: + +```js +--- +name: smartGraphModify2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._removeVertexCollection("other", true); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +Attempting to remove a non-orphan collection results in an error: + +```js +--- +name: smartGraphModify3 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._removeVertexCollection("vertices"); // xpError(ERROR_GRAPH_NOT_IN_ORPHAN_COLLECTION) +~graph_module._drop("myGraph", true); +``` + +You cannot drop the initial collection (`vertices`) as long as it defines the +sharding for other collections (`edges`). + +```js +--- +name: smartGraphModify4 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._deleteEdgeDefinition("edges"); +graph._removeVertexCollection("vertices"); +db._drop("vertices"); // xpError(ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE) +~graph_module._drop("myGraph", true); +~db._drop("edges"); +~db._drop("vertices"); +``` + +You may drop the complete graph including the underlying collections by setting +the second argument in the call to `_drop()` to `true`. This only drops +collections that are in the graph definition at that point. Remember to manually +drop collections that you might have removed from the graph beforehand. + +```js +--- +name: smartGraphModify5 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._deleteEdgeDefinition("edges"); // Remove edge collection from graph definition +graph._removeVertexCollection("vertices"); // Remove vertex collection from graph definition +graph_module._drop("myGraph", true); // Does not drop any collections because none are left in the graph definition +db._drop("edges"); // Manually clean up the collections that were left behind, drop 'edges' before sharding-defining 'vertices' collection +db._drop("vertices"); +``` + +Alternatively, you can `truncate()` all collections of the graph if you just +want to get rid of the data but keep the collections and graph definition. + +### Remove an edge definition + +Delete an edge definition from the graph: + +`graph._deleteEdgeDefinition(edgeCollectionName, dropCollection)` + +- `edgeCollectionName` (string): + Name of edge collection. +- `dropCollection` (bool, _optional_): + If `true`, the collection is dropped if it is not used in any other graph. + Default: `false`. + +**Examples** + +Create a SmartGraph, then delete the edge definition and drop the edge collection: + +```js +--- +name: smartGraphModify6 +description: '' +type: cluster +--- +var graph_module = require("@arangodb/smart-graph"); +var relation = graph_module._relation("edges", "vertices", "vertices"); +var graph = graph_module._create("myGraph", [relation], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._deleteEdgeDefinition("edges", true); +graph = graph_module._graph("myGraph"); +~graph_module._drop("myGraph", true); +``` + +It is allowed to remove the vertex collection `vertices` if it is not used in +any relation (i.e. after the deletion of the edge definition): + +```js +--- +name: smartGraphModify7 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], [], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._deleteEdgeDefinition("edges"); +graph._removeVertexCollection("vertices"); +~graph_module._drop("myGraph", true); +~db._drop("edges"); +~db._drop("vertices"); +``` + +Keep in mind that you cannot drop the `vertices` collection until no other +collection references it anymore (`distributeShardsLike` collection property). + +### Remove a Graph + +Remove a SmartGraph: + +`graph_module._drop(graphName, dropCollections)` + +- `graphName` (string): + Name of the Graph. +- `dropCollections` (bool, _optional_): + Define if collections should be dropped. Default: false. + +**Examples** + +Delete a SmartGraph and drop its collections: + +```js +--- +name: smartGraphRemove1 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"], {smartGraphAttribute: "region", numberOfShards: 9}); +graph_module._drop("myGraph", true); +``` + +Note that removing a Graph with the option to drop the collections fails if +you removed collections from the Graph but did not drop these collections. +This is because their `distributeShardsLike` attribute still references +collections that are part of the Graph. Dropping collections while others +point to them in this way is not allowed. Make sure to drop the referencing +collections first. + +```js +--- +name: smartGraphRemove2 +description: '' +type: cluster +--- +~var graph_module = require("@arangodb/smart-graph"); +~var relation = graph_module._relation("edges", "vertices", "vertices"); +~var graph = graph_module._create("myGraph", [relation], ["other"], {smartGraphAttribute: "region", numberOfShards: 9}); +graph._removeVertexCollection("other"); +graph_module._drop("myGraph", true); // xpError(ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE) +~db._drop("other"); +~db._drop("vertices"); +``` diff --git a/site/content/arangodb/oem/graphs/smartgraphs/testing-graphs-on-single-server.md b/site/content/arangodb/oem/graphs/smartgraphs/testing-graphs-on-single-server.md new file mode 100644 index 0000000000..cb838d8f4e --- /dev/null +++ b/site/content/arangodb/oem/graphs/smartgraphs/testing-graphs-on-single-server.md @@ -0,0 +1,44 @@ +--- +title: SmartGraphs and SatelliteGraphs on a Single Server +menuTitle: Testing Graphs on Single Server +weight: 15 +description: >- + Simulate SmartGraphs and SatelliteGraphs on a single server to make it easier + to port them to an ArangoDB cluster later +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +## General idea + +You can create SmartGraphs and SatelliteGraphs in a single server instance and +test them there. Internally, the graphs are General Graphs, supplemented by +formal properties such as `isSmart`, which play no role in the behavior of the +graphs, however. The same is true for vertex and edge collections: they have the +corresponding properties, but they are non-functional. + +After a test phase, you can dump such graphs and then restore them in a cluster +instance. The graphs themselves and the vertex and edge collections obtain true +SmartGraph or SatelliteGraph sharding properties as if they were created in the +cluster. + +## The Procedure + +On a single server, create [SmartGraphs](management.md) or +[SatelliteGraphs](../satellitegraphs/management.md) graphs by using +`arangosh` as usual. Then you can set all the cluster-relevant properties of +graphs and collections: + +- `numberOfShards` +- `isSmart` +- `isSatellite` +- `replicationFactor` +- `smartGraphAttribute` +- `satellites` +- `shardingStrategy` + +After that, you can [dump](../../components/tools/arangodump/examples.md) the graphs with +`arangodump` as usual. + +[Restore](../../components/tools/arangorestore/examples.md) the dumped data into a running +ArangoDB cluster. As a result, all cluster relevant properties are restored +correctly and affect the sharding and the performance as expected. diff --git a/site/content/arangodb/oem/graphs/working-with-edges.md b/site/content/arangodb/oem/graphs/working-with-edges.md new file mode 100644 index 0000000000..b8faeada56 --- /dev/null +++ b/site/content/arangodb/oem/graphs/working-with-edges.md @@ -0,0 +1,36 @@ +--- +title: Edges +menuTitle: Working with Edges +weight: 105 +description: >- + Edges are documents with special `_from` and `_to` attributes to reference + other documents by their ID to form a graph +--- +Edges are used in [graphs](_index.md) to link vertices together. +They are documents with two additional system attributes that you set, a +`_from` and a `_to` attribute. They need to be stored in **edge collections**. + +Together with vertex documents stored in _document collections_ (also called +_vertex collections_ in this context), edges form graphs. + +**Example** + +- An edge collection stores the information that a company's reception is a + sub-unit to the services unit and the services unit is sub-unit to the + CEO. You would express this relationship with the `_from` and `_to` attributes. +- A vertex collection stores all the properties about the reception, for example, + that 20 people are working there, the room number, and so on. +- The `_from` attribute of an edge is the document ID of the linked vertex + (incoming relation). +- The `_to` attribute of an edge is the document ID of the linked vertex + (outgoing relation). + +## Edges API + +Edges are normal documents but additionally have a `_from` and a `_to` attribute +that you need to set. +You can update the `_from` and `_to` attributes like any other document attribute +using the [Documents API](../develop/javascript-api/@arangodb/collection-object.md#documents). + +For methods you can call on edge collections, see the edge document methods of +the [_collection_ object](../develop/javascript-api/@arangodb/collection-object.md#edge-documents). diff --git a/site/content/arangodb/oem/index-and-search/_index.md b/site/content/arangodb/oem/index-and-search/_index.md new file mode 100644 index 0000000000..dc765f1be0 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/_index.md @@ -0,0 +1,6 @@ +--- +title: Index and Search +menuTitle: Index and Search +weight: 145 +description: '' +--- diff --git a/site/content/arangodb/oem/index-and-search/analyzers.md b/site/content/arangodb/oem/index-and-search/analyzers.md new file mode 100644 index 0000000000..28191e7016 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/analyzers.md @@ -0,0 +1,1693 @@ +--- +title: Transforming data with Analyzers +menuTitle: Analyzers +weight: 160 +description: >- + Analyzers allow you to transform data, for sophisticated text processing and + searching, either standalone or in combination with Views and inverted indexes +--- +While AQL string functions allow for basic text manipulation, true text +processing including tokenization, language-specific word stemming, case +conversion and removal of diacritical marks (accents) from characters only +become possible with Analyzers. + +Analyzers parse input values and transform them into sets of sub-values, +for example by breaking up text into words. If they are used in Views then +the documents' attribute values of the linked collections are used as input +and additional metadata is produced internally. The data can then be used for +searching and sorting to provide the most appropriate match for the specified +conditions, similar to queries to web search engines. + +Analyzers can be used on their own to tokenize and normalize strings in AQL +queries with the [`TOKENS()` function](../aql/functions/string.md#tokens). +The following example shows the creation of a custom Analyzer and how it +transforms an example input: + +```js +--- +name: analyzerCustomTokens +description: '' +--- +var analyzers = require("@arangodb/analyzers") +var a = analyzers.save("custom", "text", { + locale: "en", + stopwords: ["a", "example"] +}, []); +db._query(`RETURN TOKENS("UPPER & lower, a Stemming Example.", "custom")`).toArray(); +~analyzers.remove(a.name); +``` + +How Analyzers process values depends on their type and configuration. +The configuration is comprised of type-specific properties and list of features. +The features control the additional metadata to be generated to augment View +indexes, to be able to rank results for instance. + +Analyzers can be managed via an [HTTP API](../develop/http-api/analyzers.md) and through +a [JavaScript module](../develop/javascript-api/analyzers.md). + +{{< youtube id="tbOTYL26reg" >}} + +## Value Handling + +While most of the Analyzer functionality is geared towards text processing, +there is no restriction to strings as input data type when using them through +Views or inverted indexes – your documents may have attributes of any data type +after all. + +Strings are processed according to the Analyzer, whereas other primitive data +types (`null`, `true`, `false`, numbers) are generally left unchanged. +Exceptions are Analyzers that specifically work with other data types, like +geo-spatial or query-based Analyzers. + +The elements of arrays are processed individually, regardless of the level of +nesting, if you use Analyzers stand-alone. That is, strings are processed by the +configured Analyzer(s) and other primitive values are returned as-is. +This also applies if you use Analyzers in `arangosearch` Views, or in +`search-alias` Views with inverted indexes that have the `searchField` option +enabled. The array elements are unpacked, processed, and indexed individually. + +If you use inverted indexes with the `searchField` option disabled, optionally +through `search-alias` Views, array elements are not unpacked by default. Most +Analyzers do not accept arrays as input in this context. You can unpack one +array level and let the configured Analyzer process the individual elements by +using `[*]` as a suffix for a field in the index definition. Primitive values +other than strings are indexed as-is. + +Analyzers cannot process objects as a whole. However, you can work with +individual object attributes. You can use inverted indexes and Views to index +specific object attributes or sub-attributes, or index all sub-attributes with +the `includeAllFields` option enabled. Each non-object value is handled as +described above. Sub-objects in arrays can be indexed, too (with limitations). +However, only primitive values are added to the index. Arrays and objects +cannot be searched for as a whole. + +Also see: +- [`SEARCH` operation](../aql/high-level-operations/search.md) on how to query indexed + values such as numbers and nested values +- [`arangosearch` Views](arangosearch/arangosearch-views-reference.md) and + [Inverted indexes](indexing/working-with-indexes/inverted-indexes.md) for details about how + compound data types (arrays, objects) get indexed + +## Analyzer Names + +Each Analyzer has a name for identification with the following +naming constraints: + +- The name must only consist of the letters `a` to `z` (both in lower and + upper case), the numbers `0` to `9`, underscore (`_`) and dash (`-`) symbols. + This also means that any non-ASCII names are not allowed. +- It must always start with a letter. +- The maximum allowed length of a name is 254 bytes. +- Analyzer names are case-sensitive. + +Custom Analyzers are stored per database, in a system collection `_analyzers`. +The names get prefixed with the database name and two colons, e.g. +`myDB::customAnalyzer`.This does not apply to the globally available +[built-in Analyzers](#built-in-analyzers), which are not stored in an +`_analyzers` collection. + +Custom Analyzers stored in the `_system` database can be referenced in queries +against other databases by specifying the prefixed name, e.g. +`_system::customGlobalAnalyzer`. Analyzers stored in databases other than +`_system` cannot be accessed from within another database however. + +## Analyzer Types + +The following Analyzer types are available: + +- [`identity`](#identity): treats value as atom (no transformation) +- [`delimiter`](#delimiter): splits into tokens at a user-defined character sequence +- [`stem`](#stem): applies stemming to the value as a whole +- [`norm`](#norm): applies normalization to the value as a whole +- [`ngram`](#ngram): creates _n_-grams from the value with user-defined lengths +- [`text`](#text): tokenizes text strings into words, optionally with stemming, + normalization, stop-word filtering and edge _n_-gram generation +- [`segmentation`](#segmentation): tokenizes text in a language-agnostic manner, + optionally with normalization +- [`aql`](#aql): runs an AQL query to prepare tokens for index +- [`pipeline`](#pipeline): chains multiple Analyzers +- [`stopwords`](#stopwords): removes the specified tokens from the input +- [`collation`](#collation): respects the alphabetic order of a language in range queries +- [`minhash`](#minhash): applies another Analyzer and then a locality-sensitive + hash function, to find candidates for set comparisons based on the + Jaccard index (Enterprise Edition only) +- [`classification`](#classification): classifies the input text using a + word embedding model (Enterprise Edition only) +- [`nearest_neighbors`](#nearest_neighbors): finds the nearest neighbors of the + input text using a word embedding model (Enterprise Edition only) +- [`geojson`](#geojson): breaks up a GeoJSON object into a set of indexable tokens +- [`geo_s2`](#geo_s2): like `geojson` but offers more efficient formats for + indexing geo-spatial data (Enterprise Edition only) +- [`geopoint`](#geopoint): breaks up JSON data describing a coordinate pair into + a set of indexable tokens + +The following table compares the Analyzers for **text processing**: + +Analyzer / Capability | Tokenization | Stemming | Normalization | _N_-grams +:----------------------------------------:|:------------:|:--------:|:-------------:|:--------: +[`stem`](#stem) | No | Yes | No | No +[`norm`](#norm) | No | No | Yes | No +[`ngram`](#ngram) | No | No | No | Yes +[`text`](#text) | Yes | Yes | Yes | (Yes) +[`segmentation`](#segmentation) | Yes | No | Yes | No + +The available normalizations are case conversion and accents/diacritics removal. +The `segmentation` Analyzer only supports case conversion. + +The `text` Analyzer supports edge _n_-grams but not full _n_-grams. + +## Tokenization + +The `text` and `segmentation` Analyzer types tokenize text into words (or a +comparable concept of a word). See +[Word Boundaries](https://www.unicode.org/reports/tr29/#Word_Boundaries) +in the Unicode Standard Annex #29 about Unicode text segmentation for details. + +These tokenizing Analyzers extract tokens, which removes characters like +punctuation and whitespace. An exception is the [`segmentation` Analyzer](#segmentation) +if you select `"graphic"` or `"all"` for the `break` option. They preserve `@` +and `.` characters of email addresses, for instance. There are also exceptions +with both Analyzer types for sequences like numbers, for which decimal and +thousands separators (`.` and `,`) are preserved. + +## Normalization + +The `norm`, `text`, and `segmentation` Analyzer types allow you to convert the +input text to all lowercase or all uppercase for normalization purposes, namely +case insensitive search. Case folding is not supported. Also see +[Case Mapping](https://unicode-org.github.io/icu/userguide/transforms/casemappings.html) +in the ICU documentation. + +The `norm` and `text` Analyzer types also allow you to convert characters with +diacritical marks to the base characters. This normalization enables +accent-insensitive search. + +## Analyzer Features + +The *features* of an Analyzer determine what searching capabilities are +available and are only applicable in the context of Views and inverted indexes. + +The valid values for the features are dependant on both the capabilities of +the underlying Analyzer *type* and the query filtering and sorting functions that the +result can be used with. For example, the `text` type produces +`frequency` + `norm` + `position`, and the `PHRASE()` AQL function requires +`frequency` + `position` to be available. + +{{< tip >}} +You should only enable the features you require, as there is a cost associated +with them. The metadata they produce needs to be computed and stored, requiring +time and disk space. + +The examples in the documentation only set the required features for the shown +examples, which is often none (empty array `[]` in the call of `analyzers.save()`). +{{< /tip >}} + +The following *features* are supported: + +- **frequency**: track how often a term occurs. + Required for [`PHRASE()`](../aql/functions/arangosearch.md#phrase), + [`NGRAM_MATCH()`](../aql/functions/arangosearch.md#ngram_match), + [`BM25()`](../aql/functions/arangosearch.md#bm25), + [`TFIDF()`](../aql/functions/arangosearch.md#tfidf), and + [`OFFSET_INFO()`](../aql/functions/arangosearch.md#offset_info). +- **norm**: calculate and store the field normalization factor that is used to + score fairer if the same term is repeated, reducing its importance. + Required for [`BM25()`](../aql/functions/arangosearch.md#bm25) + (except BM15) and [`TFIDF()`](../aql/functions/arangosearch.md#tfidf) + (if called with normalization enabled). It is recommended to enable this + feature for custom Analyzers. +- **position**: enumerate the tokens for position-dependent queries. Required + for [`PHRASE()`](../aql/functions/arangosearch.md#phrase), + [`NGRAM_MATCH()`](../aql/functions/arangosearch.md#ngram_match), and + [`OFFSET_INFO()`](../aql/functions/arangosearch.md#offset_info). + If present, then the `frequency` feature is also required. +- **offset**: enable search highlighting capabilities (Enterprise Edition only). + Required for [`OFFSET_INFO()`](../aql/functions/arangosearch.md#offset_info). + If present, then the `position` and `frequency` features are also required. + +## Analyzer Properties + +The valid attributes/values for the *properties* are dependant on what *type* +is used. For example, the `delimiter` type needs to know the desired delimiting +character(s), whereas the `text` type takes a locale, stop-words and more. + +### `identity` + +An Analyzer applying the `identity` transformation, i.e. returning the input +unmodified. + +It does not support any *properties* and will ignore them. + +**Examples** + +Applying the identity Analyzers does not perform any transformations, hence +the input is returned unaltered: + +```js +--- +name: analyzerIdentity +description: '' +--- +db._query(`RETURN TOKENS("UPPER lower dïäcríticš", "identity")`).toArray(); +``` + +### `delimiter` + +An Analyzer capable of breaking up delimited text into tokens. + +It follows [RFC 4180](https://tools.ietf.org/html/rfc4180) but without starting +new records on newlines and letting you freely choose the delimiter. You can +wrap tokens in the input string in double quote marks to quote the delimiter. +For example, a `delimiter` Analyzer that uses `,` as delimiter and an input +string of `foo,"bar,baz"` results in the tokens `foo` and `bar,baz` instead of +`foo`, `bar`, and `baz`. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `delimiter` (string): the delimiting character or character sequence. + The whole string is considered as one delimiter. + +**Examples** + +```js +--- +name: analyzerDelimiter1 +description: Split comma-separated text into tokens but do not split quoted fields +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("delimiter_csv", "delimiter", { + delimiter: "," +}, []); +db._query(`RETURN TOKENS('foo,bar,baz,"bar,baz"', "delimiter_csv")`).toArray(); +~analyzers.remove(a.name); +``` + +```js +--- +name: analyzerDelimiter2 +description: > + Split input strings into tokens at every character sequence of hyphen-minus, + right angled bracket, and a space +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("delimiter_arrow", "delimiter", { + delimiter: "-> " +}, []); +db._query(`RETURN TOKENS("some-> hand-picked-> words", "delimiter_arrow")`).toArray(); +~analyzers.remove(a.name); +``` + +You can chain multiple `delimiter` Analyzers with a [`pipeline` Analyzer](#pipeline) +to split by different delimiters. + +### `stem` + +An Analyzer capable of stemming the text, treated as a single token, +for supported languages. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `locale` (string): a locale in the format `language`, e.g. `"de"` or `"en"`. + The locale is forwarded to the Snowball stemmer without checks. + An invalid locale does not prevent the creation of the Analyzer. + Also see [Supported Languages](#supported-languages). + +**Examples** + +Apply stemming to the input string as a whole: + +```js +--- +name: analyzerStem +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("stem_en", "stem", { + locale: "en" +}, []); +db._query(`RETURN TOKENS("databases", "stem_en")`).toArray(); +~analyzers.remove(a.name); +``` + +### `norm` + +An Analyzer capable of normalizing the text, treated as a single +token, i.e. case conversion and accent removal. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `locale` (string): a locale in the format `language[_COUNTRY][_VARIANT]` + (square brackets denote optional parts), e.g. `"de"`, `"en_US"`, or `"es__TRADITIONAL"`. + See the [ICU Documentation](https://unicode-org.github.io/icu/userguide/locale/) + for details. The locale is forwarded to ICU without checks. + An invalid locale does not prevent the creation of the Analyzer. + Also see [Supported Languages](#supported-languages). +- `accent` (boolean, _optional_): + - `true` to preserve accented characters (default) + - `false` to convert accented characters to their base characters +- `case` (string, _optional_): + - `"lower"` to convert to all lower-case characters + - `"upper"` to convert to all upper-case characters + - `"none"` to not change character case (default) + +**Examples** + +Convert input string to all upper-case characters: + +```js +--- +name: analyzerNorm1 +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("norm_upper", "norm", { + locale: "en", + case: "upper" +}, []); +db._query(`RETURN TOKENS("UPPER lower dïäcríticš", "norm_upper")`).toArray(); +~analyzers.remove(a.name); +``` + +Convert accented characters to their base characters: + +```js +--- +name: analyzerNorm2 +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("norm_accent", "norm", { + locale: "en", + accent: false +}, []); +db._query(`RETURN TOKENS("UPPER lower dïäcríticš", "norm_accent")`).toArray(); +~analyzers.remove(a.name); +``` + +Convert input string to all lower-case characters and remove diacritics: + +```js +--- +name: analyzerNorm3 +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("norm_accent_lower", "norm", { + locale: "en", + accent: false, + case: "lower" +}, []); +db._query(`RETURN TOKENS("UPPER lower dïäcríticš", "norm_accent_lower")`).toArray(); +~analyzers.remove(a.name); +``` + +### `ngram` + +An Analyzer capable of producing _n_-grams from a specified input in a range of +min..max (inclusive). Can optionally preserve the original input. + +This Analyzer type can be used to implement substring matching. +Note that it slices the input based on bytes and not characters by default +(*streamType*). The *"binary"* mode supports single-byte characters only; +multi-byte UTF-8 characters raise an *Invalid UTF-8 sequence* query error. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `min` (number): unsigned integer for the minimum _n_-gram length +- `max` (number): unsigned integer for the maximum _n_-gram length +- `preserveOriginal` (boolean): + - `true` to include the original value as well + - `false` to produce the _n_-grams based on *min* and *max* only +- `startMarker` (string, _optional_): this value will be prepended to _n_-grams + which include the beginning of the input. Can be used for matching prefixes. + Choose a character or sequence as marker which does not occur in the input. +- `endMarker` (string, _optional_): this value will be appended to _n_-grams + which include the end of the input. Can be used for matching suffixes. + Choose a character or sequence as marker which does not occur in the input. +- `streamType` (string, _optional_): type of the input stream + - `"binary"`: one byte is considered as one character (default) + - `"utf8"`: one Unicode codepoint is treated as one character + +**Examples** + +With *min* = `4` and *max* = `5`, the Analyzer will produce the following +_n_-grams for the input string `"foobar"`: +- `"foob"` +- `"fooba"` +- `"foobar"` (if *preserveOriginal* is enabled) +- `"ooba"` +- `"oobar"` +- `"obar"` + +An input string `"foo"` will not produce any _n_-gram unless *preserveOriginal* +is enabled, because it is shorter than the *min* length of 4. + +Above example but with *startMarker* = `"^"` and *endMarker* = `"$"` would +produce the following: +- `"^foob"` +- `"^fooba"` +- `"^foobar"` (if *preserveOriginal* is enabled) +- `"foobar$"` (if *preserveOriginal* is enabled) +- `"ooba"` +- `"oobar$"` +- `"obar$"` + +Create and use a trigram Analyzer with `preserveOriginal` disabled: + +```js +--- +name: analyzerNgram1 +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("trigram", "ngram", { + min: 3, + max: 3, + preserveOriginal: false, + streamType: "utf8" +}, []); +db._query(`RETURN TOKENS("foobar", "trigram")`).toArray(); +~analyzers.remove(a.name); +``` + +Create and use a bigram Analyzer with `preserveOriginal` enabled and with start +and stop markers: + +```js +--- +name: analyzerNgram2 +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("bigram_markers", "ngram", { + min: 2, + max: 2, + preserveOriginal: true, + startMarker: "^", + endMarker: "$", + streamType: "utf8" +}, []); +db._query(`RETURN TOKENS("foobar", "bigram_markers")`).toArray(); +~analyzers.remove(a.name); +``` + +### `text` + +An Analyzer capable of breaking up strings into individual words while also +optionally filtering out stop-words, extracting word stems, applying +case conversion and accent removal. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `locale` (string): a locale in the format `language[_COUNTRY][_VARIANT]` + (square brackets denote optional parts), e.g. `"de"`, `"en_US"`, or `"es__TRADITIONAL"`. + See the [ICU Documentation](https://unicode-org.github.io/icu/userguide/locale/) + for details. The locale is forwarded to ICU without checks. + An invalid locale does not prevent the creation of the Analyzer. + Also see [Supported Languages](#supported-languages). +- `accent` (boolean, _optional_): + - `true` to preserve accented characters + - `false` to convert accented characters to their base characters (default) +- `case` (string, _optional_): + - `"lower"` to convert to all lower-case characters (default) + - `"upper"` to convert to all upper-case characters + - `"none"` to not change character case +- `stemming` (boolean, _optional_): + - `true` to apply stemming on returned words (default) + - `false` to leave the tokenized words as-is +- `edgeNgram` (object, _optional_): if present, then edge _n_-grams are generated + for each token (word). That is, the start of the _n_-gram is anchored to the + beginning of the token, whereas the `ngram` Analyzer would produce all + possible substrings from a single input token (within the defined length + restrictions). Edge _n_-grams can be used to cover word-based auto-completion + queries with an index, for which you should set the following other options: + `accent: false`, `case: "lower"` and most importantly `stemming: false`. + - `min` (number, _optional_): minimal _n_-gram length + - `max` (number, _optional_): maximal _n_-gram length + - `preserveOriginal` (boolean, _optional_): whether to include the original + token even if its length is less than *min* or greater than *max* +- `stopwords` (array, _optional_): an array of strings with words to omit + from result. Default: load words from `stopwordsPath`. To disable stop-word + filtering provide an empty array `[]`. If both `stopwords` and + `stopwordsPath` are provided then both word sources are combined. +- `stopwordsPath` (string, _optional_): path with a *language* sub-directory + (e.g. `en` for a locale `en_US`) containing files with words to omit. + Each word has to be on a separate line. Everything after the first whitespace + character on a line will be ignored and can be used for comments. The files + can be named arbitrarily and have any file extension (or none). + + Default: if no path is provided then the value of the environment variable + `IRESEARCH_TEXT_STOPWORD_PATH` is used to determine the path, or if it is + undefined then the current working directory is assumed. If the `stopwords` + attribute is provided then no stop-words are loaded from files, unless an + explicit `stopwordsPat` is also provided. + + Note that if the `stopwordsPath` cannot be accessed, is missing language + sub-directories or has no files for a language required by an Analyzer, + then the creation of a new Analyzer is refused. If such an issue is + discovered for an existing Analyzer during startup then the server will + abort with a fatal error. + +The Analyzer uses a fixed order of operations: + +1. Tokenization +2. Accent removal (if `accent` is set to `false`) +3. Case conversion (unless `case` is set to `none`) +4. Stop word removal (if any are defined) +5. Word stemming (if `stemming` is set to `true`) + +If you require a different order, consider using a [`pipeline` Analyzer](#pipeline). + +Stop words are removed after case/accent operations but before stemming. +The reason is that stemming could map multiple words to the same one, and you +would not be able to filter out specific words only. + +The case/accent operations are not applied to the stop words for performance +reasons. You need to pre-process them accordingly, for example, using the +[`TOKENS()` function](../aql/functions/string.md#tokens) with a +[`text` Analyzer](#text) that has the same `locale`, `case`, and `accent` +settings as the planned `text` Analyzer, but with `stemming` set to `false` and +`stopwords` set to `[]`. + +**Examples** + +The built-in `text_en` Analyzer has stemming enabled (note the word endings): + +```js +--- +name: analyzerTextStem +description: '' +--- +db._query(`RETURN TOKENS("Crazy fast NoSQL-database!", "text_en")`).toArray(); +``` + +You may create a custom Analyzer with the same configuration but with stemming +disabled like this: + +```js +--- +name: analyzerTextNoStem +description: '' +--- +var analyzers = require("@arangodb/analyzers") +var a = analyzers.save("text_en_nostem", "text", { + locale: "en", + case: "lower", + accent: false, + stemming: false, + stopwords: [] +}, []) +db._query(`RETURN TOKENS("Crazy fast NoSQL-database!", "text_en_nostem")`).toArray(); +~analyzers.remove(a.name); +``` + +Custom text Analyzer with the edge _n_-grams capability and normalization enabled, +stemming disabled and `"the"` defined as stop-word to exclude it: + +```js +--- +name: analyzerTextEdgeNgram +description: '' +--- +~var analyzers = require("@arangodb/analyzers") +var a = analyzers.save("text_edge_ngrams", "text", { + edgeNgram: { min: 3, max: 8, preserveOriginal: true }, + locale: "en", + case: "lower", + accent: false, + stemming: false, + stopwords: [ "the" ] +}, []); +db._query(`RETURN TOKENS( + "The quick brown fox jumps over the dogWithAVeryLongName", + "text_edge_ngrams" +)`).toArray(); +~analyzers.remove(a.name); +``` + +### `collation` + +<small>Introduced in: v3.9.0</small> + +An Analyzer capable of converting the input into a set of language-specific +tokens. This makes comparisons follow the rules of the respective language, +most notable in range queries against Views. + +For example, the Swedish alphabet has 29 letters: `a` to `z` plus `å`, `ä`, and +`ö`, in that order. Using a Swedish locale (like `sv`), the sorting order is +`å` after `z`, whereas using an English locale (like `en`), it is `å` after `a`. +This impacts queries with `SEARCH` expressions like `doc.text < "c"`, excluding +`å` when using a Swedish locale but including it when using an English locale. + +{{< info >}} +Sorting by the output of the `collation` Analyzer like +`SORT TOKENS(<text>, <collationAnalyzer>)` is not a supported feature and +doesn't produce meaningful results. +{{< /info >}} + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `locale` (string): a locale in the format + `language[_COUNTRY][_VARIANT][@keywords]` (square brackets denote optional parts), + e.g. `"de"`, `"en_US"`, `"es__TRADITIONAL"`, or `fr@collation=phonebook`. See the + [ICU Documentation](https://unicode-org.github.io/icu/userguide/locale/) + for details. The locale is forwarded to ICU without checks. + An invalid locale does not prevent the creation of the Analyzer. + Also see [Supported Languages](#supported-languages). + +**Examples** + +In Swedish, the letter `å` (note the small circle above the `a`) comes after +`z`. Other languages treat it like a regular `a`, putting it before `b`. +Below example creates two `collation` Analyzers, one with an English locale +(`en`) and one with a Swedish locale (`sv`). It then demonstrates the +difference in alphabetical order using a simple range query that returns +letters before `c`: + +```js +--- +name: analyzerCollation +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var en = analyzers.save("collation_en", "collation", { locale: "en" }, []); +var sv = analyzers.save("collation_sv", "collation", { locale: "sv" }, []); +var test = db._create("test"); +var docs = db.test.save([ + { text: "a" }, + { text: "å" }, + { text: "b" }, + { text: "z" }, +]); +var view = db._createView("view", "arangosearch", + { links: { test: { analyzers: [ "collation_en", "collation_sv" ], includeAllFields: true }}}); +~assert(db._query(`FOR d IN view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 4); +db._query("FOR doc IN view SEARCH ANALYZER(doc.text < TOKENS('c', 'collation_en')[0], 'collation_en') RETURN doc.text").toArray(); +db._query("FOR doc IN view SEARCH ANALYZER(doc.text < TOKENS('c', 'collation_sv')[0], 'collation_sv') RETURN doc.text").toArray(); +~db._dropView(view.name()); +~db._drop(test.name()); +~analyzers.remove(en.name); +~analyzers.remove(sv.name); +``` + +### `aql` + +<small>Introduced in: v3.8.0</small> + +An Analyzer capable of running a restricted AQL query to perform +data manipulation / filtering. + +The query must not access the storage engine. This means no `FOR` loops over +collections or Views, no use of the `DOCUMENT()` function, no graph traversals. +AQL functions are allowed as long as they do not involve Analyzers (`TOKENS()`, +`PHRASE()`, `NGRAM_MATCH()`, `ANALYZER()` etc.) or data access, and if they can +be run on DB-Servers in case of a cluster deployment. User-defined functions +are not permitted. + +The input data is provided to the query via a bind parameter `@param`. +It is always a string. The AQL query is invoked for each token in case of +multiple input tokens, such as an array of strings. + +The output can be one or multiple tokens (top-level result elements). They get +converted to the configured `returnType`, either booleans, numbers or strings +(default). + +{{< tip >}} +If `returnType` is `"number"` or `"bool"` then it is unnecessary to set this +AQL Analyzer as context Analyzer with `ANALYZER()` in View queries. You can +compare indexed fields to numeric values, `true` or `false` directly, because +they bypass Analyzer processing. +{{< /tip >}} + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `queryString` (string): AQL query to be executed +- `collapsePositions` (boolean): + - `true`: set the position to 0 for all members of the query result array + - `false` (default): set the position corresponding to the index of the + result array member +- `keepNull` (boolean): + - `true` (default): treat `null` like an empty string + - `false`: discard `null`s from View index. Can be used for index filtering + (i.e. make your query return null for unwanted data). Note that empty + results are always discarded. +- `batchSize` (integer): number between 1 and 1000 (default = 1) that + determines the batch size for reading data from the query. In general, a + single token is expected to be returned. However, if the query is expected + to return many results, then increasing `batchSize` trades memory for + performance. +- `memoryLimit` (integer): memory limit for query execution in bytes. + (default is 1048576 = 1Mb) Maximum is 33554432U (32Mb) +- `returnType` (string): data type of the returned tokens. If the indicated + type does not match the actual type then an implicit type conversion is + applied (see [`TO_STRING()`](../aql/functions/type-check-and-cast.md#to_string), + [`TO_NUMBER()`](../aql/functions/type-check-and-cast.md#to_number), + [`TO_BOOL()`](../aql/functions/type-check-and-cast.md#to_bool)) + - `"string"` (default): convert emitted tokens to strings + - `"number"`: convert emitted tokens to numbers + - `"bool"`: convert emitted tokens to booleans + +**Examples** + +Soundex Analyzer for a phonetically similar term search: + +```js +--- +name: analyzerAqlSoundex +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("soundex", "aql", { queryString: "RETURN SOUNDEX(@param)" }, []); +db._query("RETURN TOKENS('ArangoDB', 'soundex')").toArray(); +~analyzers.remove(a.name); +``` + +Concatenating Analyzer for conditionally adding a custom prefix or suffix: + +```js +--- +name: analyzerAqlConcat +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("concat", "aql", { queryString: + "RETURN LOWER(LEFT(@param, 5)) == 'inter' ? CONCAT(@param, 'ism') : CONCAT('inter', @param)" +}, []); +db._query("RETURN TOKENS('state', 'concat')").toArray(); +db._query("RETURN TOKENS('international', 'concat')").toArray(); +~analyzers.remove(a.name); +``` + +Filtering Analyzer that ignores unwanted data based on the prefix `"ir"`, +with `keepNull: false` and explicitly returning `null`: + +```js +--- +name: analyzerAqlFilterNull +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("filter", "aql", { keepNull: false, queryString: + "RETURN LOWER(LEFT(@param, 2)) == 'ir' ? null : @param" +}, []); +db._query("RETURN TOKENS('regular', 'filter')").toArray(); +db._query("RETURN TOKENS('irregular', 'filter')").toArray(); +~analyzers.remove(a.name); +``` + +Filtering Analyzer that discards unwanted data based on the prefix `"ir"`, +using a filter for an empty result, which is discarded from the View index even +without `keepNull: false`: + +```js +--- +name: analyzerAqlFilter +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("filter", "aql", { queryString: + "FILTER LOWER(LEFT(@param, 2)) != 'ir' RETURN @param" +}, []); +var coll = db._create("coll"); +var doc1 = db.coll.save({ value: "regular" }); +var doc2 = db.coll.save({ value: "irregular" }); +var view = db._createView("view", "arangosearch", + { links: { coll: { fields: { value: { analyzers: ["filter"] }}}}}) +~assert(db._query(`FOR d IN view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] > 0); +db._query("FOR doc IN view SEARCH ANALYZER(doc.value IN ['regular', 'irregular'], 'filter') RETURN doc").toArray(); +~db._dropView(view.name()) +~analyzers.remove(a.name); +~db._drop(coll.name()); +``` + +Custom tokenization with `collapsePositions` on and off: +The input string `"A-B-C-D"` is split into an array of strings +`["A", "B", "C", "D"]`. The position metadata (as used by the `PHRASE()` +function) is set to 0 for all four strings if `collapsePositions` is enabled. +Otherwise the position is set to the respective array index, 0 for `"A"`, +1 for `"B"` and so on. + +| `collapsePositions` | A | B | C | D | +|--------------------:|:-:|:-:|:-:|:-:| +| `true` | 0 | 0 | 0 | 0 | +| `false` | 0 | 1 | 2 | 3 | + +```js +--- +name: analyzerAqlCollapse +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a1 = analyzers.save("collapsed", "aql", { collapsePositions: true, queryString: + "FOR d IN SPLIT(@param, '-') RETURN d" +}, ["frequency", "position"]); +var a2 = analyzers.save("uncollapsed", "aql", { collapsePositions: false, queryString: + "FOR d IN SPLIT(@param, '-') RETURN d" +}, ["frequency", "position"]); +var coll = db._create("coll"); +var doc = db.coll.save({ text: "A-B-C-D" }); +var view = db._createView("view", "arangosearch", + { links: { coll: { analyzers: [ "collapsed", "uncollapsed" ], includeAllFields: true }}}); +~assert(db._query(`FOR d IN view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 1); +db._query("FOR d IN view SEARCH PHRASE(d.text, {TERM: 'B'}, 1, {TERM: 'D'}, 'uncollapsed') RETURN d"); +db._query("FOR d IN view SEARCH PHRASE(d.text, {TERM: 'B'}, -1, {TERM: 'D'}, 'uncollapsed') RETURN d"); +db._query("FOR d IN view SEARCH PHRASE(d.text, {TERM: 'B'}, 1, {TERM: 'D'}, 'collapsed') RETURN d"); +db._query("FOR d IN view SEARCH PHRASE(d.text, {TERM: 'B'}, -1, {TERM: 'D'}, 'collapsed') RETURN d"); +~db._dropView(view.name()); +~analyzers.remove(a1.name); +~analyzers.remove(a2.name); +~db._drop(coll.name()); +``` + +The position data is not directly exposed, but we can see its effects through +the `PHRASE()` function. There is one token between `"B"` and `"D"` to skip in +case of uncollapsed positions. With positions collapsed, both are in the same +position, thus there is negative one to skip to match the tokens. + +### `pipeline` + +<small>Introduced in: v3.8.0</small> + +An Analyzer capable of chaining effects of multiple Analyzers into one. +The pipeline is a list of Analyzers, where the output of an Analyzer is passed +to the next for further processing. The final token value is determined by last +Analyzer in the pipeline. + +The Analyzer is designed for cases like the following: +- Normalize text for a case insensitive search and apply _n_-gram tokenization +- Split input with `delimiter` Analyzer, followed by stemming with the `stem` + Analyzer + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `pipeline` (array): an array of Analyzer definition-like objects with + `type` and `properties` attributes + +{{< info >}} +- You cannot use Analyzers of the types `geopoint`, `geojson`, and `geo_s2` in pipelines. + These Analyzers require additional postprocessing and can only be applied to + document fields directly. +- The output data type of an Analyzer needs to be compatible with the input + data type of the next Analyzer in the chain. The `aql` Analyzer, in particular, + has a `returnType` property, and if you set it to `number` or `bool`, the + subsequent Analyzer in the pipeline needs to support this data type as input. + Most Analyzers expect string inputs and are thus incompatible with such a setup. +{{< /info >}} + +**Examples** + +Normalize to all uppercase and compute bigrams: + +```js +--- +name: analyzerPipelineUpperNgram +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("ngram_upper", "pipeline", { pipeline: [ + { type: "norm", properties: { locale: "en", case: "upper" } }, + { type: "ngram", properties: { min: 2, max: 2, preserveOriginal: false, streamType: "utf8" } } +] }, []); +db._query(`RETURN TOKENS("Quick brown foX", "ngram_upper")`).toArray(); +~analyzers.remove(a.name); +``` + +Split at delimiting characters `,` and `;`, then stem the tokens: + +```js +--- +name: analyzerPipelineDelimiterStem +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("delimiter_stem", "pipeline", { pipeline: [ + { type: "delimiter", properties: { delimiter: "," } }, + { type: "delimiter", properties: { delimiter: ";" } }, + { type: "stem", properties: { locale: "en" } } +] }, []); +db._query(`RETURN TOKENS("delimited,stemmable;words", "delimiter_stem")`).toArray(); +~analyzers.remove(a.name); +``` + +### `stopwords` + +<small>Introduced in: v3.8.1</small> + +An Analyzer capable of removing specified tokens from the input. + +It uses binary comparison to determine if an input token should be discarded. +It checks for exact matches. If the input contains only a substring that +matches one of the defined stop words, then it is not discarded. Longer inputs +such as prefixes of stop words are also not discarded. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `stopwords` (array): array of strings that describe the tokens to + be discarded. The interpretation of each string depends on the value of + the `hex` parameter. +- `hex` (boolean): If false (default), then each string in `stopwords` is used + verbatim. If true, then the strings need to be hex-encoded. This allows for + removing tokens that contain non-printable characters. To encode UTF-8 + strings to hex strings you can use e.g. + - AQL: + ```aql + FOR token IN ["and","the"] RETURN TO_HEX(token) + ``` + - arangosh / Node.js: + ```js + ["and","the"].map(token => Buffer(token).toString("hex")) + ``` + - Modern browser: + ```js + ["and","the"].map(token => Array.from(new TextEncoder().encode(token), byte => byte.toString(16).padStart(2, "0")).join("")) + ``` + +**Examples** + +Create and use a `stopword` Analyzer that removes the tokens `and` and `the`. +The stop word array with hex-encoded strings for this looks like +`["616e64","746865"]` (`a` = 0x61, `n` = 0x6e, `d` = 0x64 and so on). +Note that `a` and `theater` are not removed, because there is no exact match +with either of the stop words `and` and `the`: + +```js +--- +name: analyzerStopwords +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("stop", "stopwords", { + stopwords: ["616e64","746865"], hex: true +}, []); +db._query("RETURN FLATTEN(TOKENS(SPLIT('the fox and the dog and a theater', ' '), 'stop'))").toArray(); +~analyzers.remove(a.name); +``` + +Create and use an Analyzer pipeline that normalizes the input (convert to +lower-case and base characters) and then discards the stopwords `and` and `the`: + +```js +--- +name: analyzerPipelineStopwords +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("norm_stop", "pipeline", { "pipeline": [ + { type: "norm", properties: { locale: "en", accent: false, case: "lower" } }, + { type: "stopwords", properties: { stopwords: ["and","the"], hex: false } }, +]}, []); +db._query("RETURN FLATTEN(TOKENS(SPLIT('The fox AND the dog äñḏ a ţhéäter', ' '), 'norm_stop'))").toArray(); +~analyzers.remove(a.name); +``` + +### `segmentation` + +<small>Introduced in: v3.9.0</small> + +An Analyzer capable of breaking up the input text into tokens in a +language-agnostic manner as per +[Unicode Standard Annex #29](https://unicode.org/reports/tr29), +making it suitable for mixed language strings. It can optionally preserve all +non-whitespace or all characters instead of keeping alphanumeric characters only, +as well as apply case conversion. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `break` (string, _optional_): + - `"all"`: return all tokens + - `"alpha"`: return tokens composed of alphanumeric characters only (default). + Alphanumeric characters are Unicode codepoints from the Letter and Number + categories, see + [Unicode Technical Note #36](https://www.unicode.org/notes/tn36/). + - `"graphic"`: return tokens composed of non-whitespace characters only. + Note that the list of whitespace characters does not include line breaks: + - `U+0009` Character Tabulation + - `U+0020` Space + - `U+0085` Next Line + - `U+00A0` No-break Space + - `U+1680` Ogham Space Mark + - `U+2000` En Quad + - `U+2028` Line Separator + - `U+202F` Narrow No-break Space + - `U+205F` Medium Mathematical Space + - `U+3000` Ideographic Space +- `case` (string, _optional_): + - `"lower"` to convert to all lower-case characters (default) + - `"upper"` to convert to all upper-case characters + - `"none"` to not change character case + +**Examples** + +Create different `segmentation` Analyzers to show the behavior of the different +`break` options: + +```js +--- +name: analyzerSegmentationBreak +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var all = analyzers.save("segment_all", "segmentation", { break: "all" }, []); +var alpha = analyzers.save("segment_alpha", "segmentation", { break: "alpha" }, []); +var graphic = analyzers.save("segment_graphic", "segmentation", { break: "graphic" }, []); +db._query(`LET str = 'Test\twith An_EMAIL-address+123@example.org\n蝴蝶。\u2028бутерброд' + RETURN { + "all": TOKENS(str, 'segment_all'), + "alpha": TOKENS(str, 'segment_alpha'), + "graphic": TOKENS(str, 'segment_graphic'), + } +`).toArray(); +~analyzers.remove(all.name); +~analyzers.remove(alpha.name); +~analyzers.remove(graphic.name); +``` + +### `minhash` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.10.0</small> + +An Analyzer that computes so called MinHash signatures using a +locality-sensitive hash function. It applies an Analyzer of your choice before +the hashing, for example, to break up text into words. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `analyzer` (object, _required_): an Analyzer definition-like objects with + `type` and `properties` attributes +- `numHashes` (number, _required_): the size of the MinHash signature. Must be + greater or equal to `1`. The signature size defines the probabilistic error + (`err = rsqrt(numHashes)`). For an error amount that does not exceed 5% + (`0.05`), use a size of `1 / (0.05 * 0.05) = 400`. + +**Examples** + +Create a `minhash` Analyzers: + +```js +--- +name: analyzerMinHash +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var analyzerMinHash = analyzers.save("minhash5", "minhash", { analyzer: { type: "segmentation", properties: { break: "alpha", case: "lower" } }, numHashes: 5 }, []); +var analyzerSegment = analyzers.save("segment", "segmentation", { break: "alpha", case: "lower" }, []); +db._query(` + LET str1 = "The quick brown fox jumps over the lazy dog." + LET str2 = "The fox jumps over the crazy dog." + RETURN { + approx: JACCARD(TOKENS(str1, "minhash5"), TOKENS(str2, "minhash5")), + actual: JACCARD(TOKENS(str1, "segment"), TOKENS(str2, "segment")) + }`).toArray(); +~analyzers.remove(analyzerMinHash.name); +~analyzers.remove(analyzerSegment.name); +``` + +### `classification` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.10.0</small> + +{{< warning >}} +This feature is experimental and under active development. +The naming and interfaces may change at any time. +Execution times are not representative of the final product. +{{< /warning >}} + +An Analyzer capable of classifying tokens in the input text. + +It applies a user-provided [supervised fastText](https://fasttext.cc/docs/en/supervised-tutorial.html) +word embedding model to classify the input text. It is able to classify +individual tokens as well as entire inputs. + +The *properties* allowed for this Analyzer are an object with the following attributes: + +- `model_location` (string): the on-disk path to the trained fastText supervised model. + Note: if you are running this in an ArangoDB cluster, this model must exist on + every machine in the cluster. +- `top_k` (number, optional): the number of class labels that will be produced + per input (default: 1). +- `threshold` (number, optional): the probability threshold for which a label + will be assigned to an input. A fastText model produces a probability per + class label, and this is what will be filtered (default: `0.99`). + +**Examples** + +Create and use a `classification` Analyzer with a stored "cooking" classifier +to classify items. + +```js +var analyzers = require("@arangodb/analyzers"); +var classifier_single = analyzers.save("classifier_single", "classification", { "model_location": "/path_to_local_fasttext_model_directory/model_cooking.bin" }, []); +var classifier_top_two = analyzers.save("classifier_double", "classification", { "model_location": "/path_to_local_fasttext_model_directory/model_cooking.bin", "top_k": 2 }, []); +db._query(`LET str = "Which baking dish is best to bake a banana bread ?" + RETURN { + "all": TOKENS(str, "classifier_single"), + "double": TOKENS(str, "classifier_double") + } + `); +``` + +```json +[ + { + "all" : [ + "__label__baking" + ], + "double" : [ + "__label__baking", + "__label__bananas" + ] + } +] +``` + +### `nearest_neighbors` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.10.0</small> + +{{< warning >}} +This feature is experimental and under active development. +The naming and interfaces may change at any time. +Execution times are not representative of the final product. +{{< /warning >}} + +An Analyzer capable of finding nearest neighbors of tokens in the input. + +It applies a user-provided [supervised fastText](https://fasttext.cc/docs/en/supervised-tutorial.html) +word embedding model to retrieve nearest neighbor tokens in the text. +It is able to find neighbors of individual tokens as well as entire input strings. +For entire input strings, the Analyzer will return nearest neighbors for each +token within the input string. + +The *properties* allowed for this Analyzer are an object with the following attributes: + +- `model_location` (string): the on-disk path to the trained fastText supervised model. + Note: if you are running this in an ArangoDB cluster, this model must exist on + every machine in the cluster. +- `top_k` (number, optional): the number of class labels that will be produced + per input (default: `1`). + +**Examples** + +Create and use a `nearest_neighbors` Analyzer with a stored "cooking" classifier +to find similar terms. + +```js +var analyzers = require("@arangodb/analyzers"); +var nn_single = analyzers.save("nn_single", "nearest_neighbors", { "model_location": "/path_to_local_fasttext_model_directory/model_cooking.bin" }, []); +var nn_top_two = analyzers.save("nn_double", "nearest_neighbors", { "model_location": "/path_to_local_fasttext_model_directory/model_cooking.bin", "top_k": 2 }, []); +db._query(`LET str = "salt, oil" + RETURN { + "all": TOKENS(str, "nn_single"), + "double": TOKENS(str, "nn_double") + } + `); +``` + +```json +[ + { + "all" : [ + "pepper", + "olive" + ], + "double" : [ + "pepper", + "table", + "olive", + "avocado" + ] + } +] +``` + +### `geojson` + +<small>Introduced in: v3.8.0</small> + +An Analyzer capable of breaking up a GeoJSON object or coordinate array in +`[longitude, latitude]` order into a set of indexable tokens for further usage +with [ArangoSearch Geo functions](../aql/functions/arangosearch.md#geo-functions). + +The Analyzer can be used for two different coordinate representations: + +- a GeoJSON feature like a Point or Polygon, using a JSON object like the following: + + ```js + { + "type": "Point", + "coordinates": [ -73.97, 40.78 ] // [ longitude, latitude ] + } + ``` + +- a coordinate array with two numbers as elements in the following format: + + ```js + [ -73.97, 40.78 ] // [ longitude, latitude ] + ``` + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `type` (string, _optional_): + - `"shape"` (default): index all GeoJSON geometry types (Point, Polygon etc.) + - `"centroid"`: compute and only index the centroid of the input geometry + - `"point"`: only index GeoJSON objects of type Point, ignore all other + geometry types +- `options` (object, _optional_): options for fine-tuning geo queries. + These options should generally remain unchanged + - `maxCells` (number, _optional_): maximum number of S2 cells (default: 20) + - `minLevel` (number, _optional_): the least precise S2 level (default: 4) + - `maxLevel` (number, _optional_): the most precise S2 level (default: 23) +- `legacy` (boolean, _optional_): + This option controls how GeoJSON Polygons are interpreted (introduced in v3.10.5). + Also see [Legacy Polygons](indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons) and + [GeoJSON interpretation](../aql/functions/geo.md#geojson-interpretation). + + - If `legacy` is `true`, the smaller of the two regions defined by a + linear ring is interpreted as the interior of the ring and a ring can at most + enclose half the Earth's surface. + - If `legacy` is `false`, the area to the left of the boundary ring's + path is considered to be the interior and a ring can enclose the entire + surface of the Earth. + + The default is `false`. + + {{< warning >}} + If you use `geojson` Analyzers and upgrade from a version below 3.10 to a + version of 3.10 or higher, the interpretation of GeoJSON Polygons changes. + + If you have polygons in your data that mean to refer to a relatively small + region but have the boundary running clockwise around the intended interior, + they are interpreted as intended prior to 3.10, but from 3.10 onward, they are + interpreted as "the other side" of the boundary. + + Whether a clockwise boundary specifies the complement of the small region + intentionally or not cannot be determined automatically. Please test the new + behavior manually. + + If you require the old behavior, upgrade to at least 3.10.5, drop your + `geojson` Analyzers, and create new ones with `legacy` set to `true`. + If these Analyzers are used in `arangosearch` Views, then they need to be + dropped as well before dropping the Analyzers, and recreated after creating + the new Analyzers. + {{< /warning >}} + +You should not set any of the [Analyzer features](#analyzer-features) as they +cannot be utilized for Geo Analyzers. + +**Examples** + +Create a collection with GeoJSON Points stored in an attribute `location`, a +`geojson` Analyzer with default properties, and a View using the Analyzer. +Then query for locations that are within a 3 kilometer radius of a given point +and return the matched documents, including the calculated distance in meters. +The stored coordinate pairs and the `GEO_POINT()` arguments are expected in +longitude, latitude order: + +```js +--- +name: analyzerGeoJSON +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("geo_json", "geojson", {}, []); +var coll = db._create("geo"); +var docs = db.geo.save([ + { location: { type: "Point", coordinates: [6.937, 50.932] } }, + { location: { type: "Point", coordinates: [6.956, 50.941] } }, + { location: { type: "Point", coordinates: [6.962, 50.932] } }, +]); +var view = db._createView("geo_view", "arangosearch", { + links: { + geo: { + fields: { + location: { + analyzers: ["geo_json"] + } + } + } + } +}); +~assert(db._query(`FOR d IN geo_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 3); +db._query(`LET point = GEO_POINT(6.93, 50.94) + FOR doc IN geo_view + SEARCH ANALYZER(GEO_DISTANCE(doc.location, point) < 2000, "geo_json") + RETURN MERGE(doc, { distance: GEO_DISTANCE(doc.location, point) })`).toArray(); +~db._dropView("geo_view"); +~analyzers.remove("geo_json", true); +~db._drop("geo"); +``` + +### `geo_s2` + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.10.5</small> + +An Analyzer capable of breaking up a GeoJSON object or coordinate array in +`[longitude, latitude]` order into a set of indexable tokens for further usage +with [ArangoSearch Geo functions](../aql/functions/arangosearch.md#geo-functions). + +The Analyzer is similar to the `geojson` Analyzer, but it internally uses a +format for storing the geo-spatial data that is more efficient. You can choose +between different formats to make a tradeoff between the size on disk, the +precision, and query performance. + +The Analyzer can be used for two different coordinate representations: + +- a GeoJSON feature like a Point or Polygon, using a JSON object like the following: + + ```js + { + "type": "Point", + "coordinates": [ -73.97, 40.78 ] // [ longitude, latitude ] + } + ``` + +- a coordinate array with two numbers as elements in the following format: + + ```js + [ -73.97, 40.78 ] // [ longitude, latitude ] + ``` + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `format` (string, _optional_): the internal binary representation to use for + storing the geo-spatial data in an index + - `"latLngDouble"` (default): store each latitude and longitude value as an + 8-byte floating-point value (16 bytes per coordinate pair). This format preserves + numeric values exactly and is more compact than the VelocyPack format used + by the `geojson` Analyzer. + - `"latLngInt"`: store each latitude and longitude value as an 4-byte integer + value (8 bytes per coordinate pair). This is the most compact format but the + precision is limited to approximately 1 to 10 centimeters. + - `"s2Point"`: store each longitude-latitude pair in the native format of + Google S2 which is used for geo-spatial calculations (24 bytes per coordinate pair). + This is not a particular compact format but it reduces the number of + computations necessary when you execute geo-spatial queries. + This format preserves numeric values exactly. +- `type` (string, _optional_): + - `"shape"` (default): index all GeoJSON geometry types (Point, Polygon etc.) + - `"centroid"`: compute and only index the centroid of the input geometry + - `"point"`: only index GeoJSON objects of type Point, ignore all other + geometry types +- `options` (object, _optional_): options for fine-tuning geo queries. + These options should generally remain unchanged + - `maxCells` (number, _optional_): maximum number of S2 cells (default: 20) + - `minLevel` (number, _optional_): the least precise S2 level (default: 4) + - `maxLevel` (number, _optional_): the most precise S2 level (default: 23) + +You should not set any of the [Analyzer features](#analyzer-features) as they +cannot be utilized for Geo Analyzers. + +**Examples** + +Create a collection with GeoJSON Points stored in an attribute `location`, a +`geo_s2` Analyzer with the `latLngInt` format, and a View using the Analyzer. +Then query for locations that are within a 3 kilometer radius of a given point +and return the matched documents, including the calculated distance in meters. +The stored coordinate pairs and the `GEO_POINT()` arguments are expected in +longitude, latitude order: + +```js +--- +name: analyzerGeoS2 +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("geo_efficient", "geo_s2", { format: "latLngInt" }, []); +var coll = db._create("geo"); +var docs = db.geo.save([ + { location: { type: "Point", coordinates: [6.937, 50.932] } }, + { location: { type: "Point", coordinates: [6.956, 50.941] } }, + { location: { type: "Point", coordinates: [6.962, 50.932] } }, +]); +var view = db._createView("geo_view", "arangosearch", { + links: { + geo: { + fields: { + location: { + analyzers: ["geo_efficient"] + } + } + } + } +}); +~assert(db._query(`FOR d IN geo_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 3); +db._query(`LET point = GEO_POINT(6.93, 50.94) + FOR doc IN geo_view + SEARCH ANALYZER(GEO_DISTANCE(doc.location, point) < 2000, "geo_efficient") + RETURN MERGE(doc, { distance: GEO_DISTANCE(doc.location, point) })`).toArray(); +~db._dropView("geo_view"); +~analyzers.remove("geo_efficient", true); +~db._drop("geo"); +``` + +The calculated distance between the reference point and the point stored in +the second document is `1825.1307…`. If you change the search condition to +`< 1825.1303`, then the document is still returned despite the distance being +higher than this value. This is due to the precision limitations of the +`latLngInt` format. The returned distance is unaffected because it is calculated +independent of the Analyzer. If you use either of the other two formats which +preserve the exact coordinate values, then the document is filtered out as +expected. + +### `geopoint` + +<small>Introduced in: v3.8.0</small> + +An Analyzer capable of breaking up a coordinate array in `[latitude, longitude]` +order or a JSON object describing a coordinate pair using two separate attributes +into a set of indexable tokens for further usage with +[ArangoSearch Geo functions](../aql/functions/arangosearch.md#geo-functions). + +The Analyzer can be used for two different coordinate representations: + +- an array with two numbers as elements in the following format: + + ```js + [ 40.78, -73.97 ] // [ latitude, longitude ] + ``` + +- two separate numeric attributes, one for latitude and one for longitude, as + shown below: + + ```js + { "location": { "lat": 40.78, "lon": -73.97 } } + ``` + + The attributes cannot be at the top level of the document, but must be nested + like in the example, so that the Analyzer can be defined for the field + `location` with the Analyzer properties + `{ "latitude": ["lat"], "longitude": ["lon"] }`. + +The *properties* allowed for this Analyzer are an object with the following +attributes: + +- `latitude` (array, _optional_): array of strings that describes the + attribute path of the latitude value relative to the field for which the + Analyzer is defined in the View +- `longitude` (array, _optional_): array of strings that describes the + attribute path of the longitude value relative to the field for which the + Analyzer is defined in the View +- `options` (object, _optional_): options for fine-tuning geo queries. + These options should generally remain unchanged + - `maxCells` (number, _optional_): maximum number of S2 cells (default: 20) + - `minLevel` (number, _optional_): the least precise S2 level (default: 4) + - `maxLevel` (number, _optional_): the most precise S2 level (default: 23) + +You should not set any of the [Analyzer features](#analyzer-features) as they +cannot be utilized for Geo Analyzers. + +**Examples** + +Create a collection with coordinate pairs stored in an attribute `location`, +a `geopoint` Analyzer with default properties, and a View using the Analyzer. +Then query for locations that are within a 3 kilometer radius of a given point. +The stored coordinate pairs are in latitude, longitude order, but `GEO_POINT()` and +`GEO_DISTANCE()` expect longitude, latitude order: + +```js +--- +name: analyzerGeoPointPair +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("geo_pair", "geopoint", {}, []); +var coll = db._create("geo"); +var docs = db.geo.save([ + { location: [50.932, 6.937] }, + { location: [50.941, 6.956] }, + { location: [50.932, 6.962] }, +]); +var view = db._createView("geo_view", "arangosearch", { + links: { + geo: { + fields: { + location: { + analyzers: ["geo_pair"] + } + } + } + } +}); +~assert(db._query(`FOR d IN geo_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 3); +db._query(`LET point = GEO_POINT(6.93, 50.94) + FOR doc IN geo_view + SEARCH ANALYZER(GEO_DISTANCE(doc.location, point) < 2000, "geo_pair") + RETURN MERGE(doc, { distance: GEO_DISTANCE([doc.location[1], doc.location[0]], point) })`).toArray(); +~db._dropView("geo_view"); +~analyzers.remove("geo_pair", true); +~db._drop("geo"); +``` + +Create a collection with coordinate pairs stored in an attribute `location` as +separate nested attributes `lat` and `lng`, a `geopoint` Analyzer that +specifies the attribute paths to the latitude and longitude attributes +(relative to `location` attribute), and a View using the Analyzer. +Then query for locations that are within a 3 kilometer radius of a given point: + +```js +--- +name: analyzerGeoPointLatLng +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +var a = analyzers.save("geo_latlng", "geopoint", { + latitude: ["lat"], + longitude: ["lng"] +}, []); +var coll = db._create("geo"); +var docs = db.geo.save([ + { location: { lat: 50.932, lng: 6.937 } }, + { location: { lat: 50.941, lng: 6.956 } }, + { location: { lat: 50.932, lng: 6.962 } }, +]); +var view = db._createView("geo_view", "arangosearch", { + links: { + geo: { + fields: { + location: { + analyzers: ["geo_latlng"] + } + } + } + } +}); +~assert(db._query(`FOR d IN geo_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 3); +db._query(`LET point = GEO_POINT(6.93, 50.94) + FOR doc IN geo_view + SEARCH ANALYZER(GEO_DISTANCE(doc.location, point) < 2000, "geo_latlng") + RETURN MERGE(doc, { distance: GEO_DISTANCE([doc.location.lng, doc.location.lat], point) })`).toArray(); +~db._dropView("geo_view"); +~analyzers.remove("geo_latlng", true); +~db._drop("geo"); +``` + +## Built-in Analyzers + +There is a set of built-in Analyzers which are available by default for +convenience and backward compatibility. They cannot be removed. + +The `identity` Analyzer has no properties and the `frequency` and `norm` +features. The Analyzers of type `text` all tokenize strings with stemming +enabled, no stop words configured, accent removal and case conversion to +lowercase turned on and the `frequency`, `norm` and `position` features + +Name | Type | Locale (Language) | Case | Accent | Stemming | Stop words | Features | +-----------|------------|-------------------|---------|---------|----------|------------|----------| +`identity` | `identity` | | | | | | `["frequency", "norm"]` +`text_de` | `text` | `de` (German) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_en` | `text` | `en` (English) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_es` | `text` | `es` (Spanish) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_fi` | `text` | `fi` (Finnish) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_fr` | `text` | `fr` (French) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_it` | `text` | `it` (Italian) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_nl` | `text` | `nl` (Dutch) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_no` | `text` | `no` (Norwegian) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_pt` | `text` | `pt` (Portuguese) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_ru` | `text` | `ru` (Russian) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_sv` | `text` | `sv` (Swedish) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` +`text_zh` | `text` | `zh` (Chinese) | `lower` | `false` | `true` | `[ ]` | `["frequency", "norm", "position"]` + +Note that _locale_, _case_, _accent_, _stemming_ and _stopwords_ are Analyzer +properties. `text_zh` does not have actual stemming support for Chinese despite +what the property value suggests. + +## Supported Languages + +### Tokenization and Normalization + +Analyzers rely on [ICU](http://site.icu-project.org/) for +tokenization and normalization, which is language-dependent. +The ICU data file `icudtl.dat` that ArangoDB ships with contains information for +a lot of languages, which are technically all supported. + +Setting an unsupported or invalid locale does not raise a warning or error. +ICU will fall back to a locale without the requested variant, country, or +script, or use its default locale if neither of the former is valid. + +{{< warning >}} +The alphabetical order of characters is not taken into account by ArangoSearch, +i.e. range queries in SEARCH operations against Views will not follow the +language rules as per the defined Analyzer locale (except for the +[`collation` Analyzer](#collation)) nor the server language +(startup option `--default-language`)! +Also see [Known Issues](../release-notes/version-3.11/known-issues-in-3-11.md#arangosearch). +{{< /warning >}} + +### Stemming + +Stemming support is provided by [Snowball](https://snowballstem.org/), +which supports the following languages: + +Language | Code +------------|----- +Arabic | `ar` +Armenian * | `hy` +Basque | `eu` +Catalan | `ca` +Danish | `da` +Dutch | `nl` +English | `en` +Finnish | `fi` +French | `fr` +German | `de` +Greek | `el` +Hindi | `hi` +Hungarian | `hu` +Indonesian | `id` +Irish | `ga` +Italian | `it` +Lithuanian | `lt` +Nepali | `ne` +Norwegian | `no` +Portuguese | `pt` +Romanian | `ro` +Russian | `ru` +Serbian | `sr` +Spanish | `es` +Swedish | `sv` +Tamil | `ta` +Turkish | `tr` +Yiddish * | `yi` + +\* <small>Introduced in: v3.10.0</small> diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/_index.md b/site/content/arangodb/oem/index-and-search/arangosearch/_index.md new file mode 100644 index 0000000000..ea2dcc46cb --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/_index.md @@ -0,0 +1,1004 @@ +--- +title: Information Retrieval with ArangoSearch +menuTitle: ArangoSearch +weight: 155 +description: >- + ArangoSearch is ArangoDB's built-in search engine for full-text, complex data + structures, and more +--- +ArangoSearch provides information retrieval features, natively integrated +into ArangoDB's query language and with support for all data models. It is +primarily a full-text search engine, a much more powerful alternative to the +[full-text index](../indexing/working-with-indexes/fulltext-indexes.md) type. It can index nested fields +from multiple collections, optionally with transformations such as text +normalization and tokenization applied, rank query results by relevance and +more. + +## Example Use Cases + +- Perform federated full-text searches over product descriptions for a + web shop, with the product documents stored in various collections. +- Find information in a research database using stemmed phrases, case and + accent insensitive, with irrelevant terms removed from the search index + (stop word filtering), ranked by relevance based on term frequency (TFIDF). +- Query a movie dataset for titles with words in a particular order + (optionally with wildcards), and sort the results by best matching (BM25) + but favor movies with a longer duration. + +## Getting Started with ArangoSearch + +ArangoSearch introduces the concept of **Views**, which can be seen as +virtual collections. There are two types of Views: + +- **`arangosearch` Views**: + Each View of the `arangosearch` type represents an inverted index to provide fast + full-text searching over one or multiple linked collections and holds the + configuration for the search capabilities, such as the attributes to index. + It can cover multiple or even all attributes of the documents in the linked + collections. + + See [`arangosearch` Views Reference](arangosearch-views-reference.md) for details. + +- **`search-alias` Views**: + Views of the `search-alias` type reference one or more + [Inverted indexes](../indexing/working-with-indexes/inverted-indexes.md). Inverted indexes are defined on + the collection level and can be used stand-alone for filtering, but adding + them to a `search-alias` View enables you to search over multiple collections at + once, called "federated search", and offers you the same capabilities for + ranking search results by relevance and search highlighting like with + `arangosearch` Views. Each inverted index can index multiple or even all + attribute of the documents of the collection it is defined for. + + See [`search-alias` Views Reference](search-alias-views-reference.md) for details. + +{{< info >}} +Views are not updated synchronously as the source collections +change in order to minimize the performance impact. They are +**eventually consistent**, with a configurable consolidation policy. +{{< /info >}} + +The input values can be processed by so called [**Analyzers**](../analyzers.md) +which can normalize strings, tokenize text into words and more, enabling +different possibilities to search for values later on. + +Search results can be sorted by their similarity ranking to return the best +matches first using popular scoring algorithms (Okapi BM25, TF-IDF), +user-defined relevance boosting and dynamic score calculation. + +![Conceptual model of ArangoSearch interacting with Collections and Analyzers](../../../../images/arangosearch.png) + +Views can be managed in the web interface, via an [HTTP API](../../develop/http-api/views/_index.md) and +through a [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views). + +Views can be queried with AQL using the [`SEARCH` operation](../../aql/high-level-operations/search.md). +It takes a search expression composed of the fields to search, the search terms, +logical and comparison operators, as well as +[ArangoSearch functions](../../aql/functions/arangosearch.md). + +### Create your first `arangosearch` View + +1. Create a test collection (e.g. `food`) and insert a few documents so + that you have something to index and search for: + - `{ "name": "avocado", "type": "fruit" }` (yes, it is a fruit) + - `{ "name": "carrot", "type": "vegetable" }` + - `{ "name": "chili pepper", "type": "vegetable" }` + - `{ "name": "tomato", "type": ["fruit", "vegetable"] }` +2. In the **VIEWS** section of the web interface, click the **Add View** card. +3. Enter a name (e.g. `food_view`) for the View, click **Create**, and click + the card of the newly created View. +4. Enter the name of the collection in the **Links** fields, then click the + underlined name to access the link properties and tick the + **Include All Fields** checkbox. In the editor on the right-hand side, you + can see the View definition in JSON format, including the following setting: + ```js + "links": { + "food": { + "includeAllFields": true + } + }, + ``` +5. Click **Save view**. The View indexes all attributes (fields) of the documents + in the `food` collection from now on (with some delay). The attribute values + get processed by the default `identity` Analyzer, which means that they + get indexed unaltered. Note that arrays (`["fruit", "vegetable"]` in the example) + are automatically expanded in `arangosearch` Views by default, indexing the + individual elements of the array (`"fruit"` and `"vegetable"`). +6. In the **QUERIES** section, try the following query: + ```aql + FOR doc IN food_view + RETURN doc + ``` + The View is used like a collection and simply iterated over to return all + (indexed) documents. You should see the documents stored in `food` as result. +7. Now add a search expression. Unlike with regular collections where you would + use `FILTER`, a `SEARCH` operation is needed to utilize the View index: + ```aql + FOR doc IN food_view + SEARCH doc.name == "avocado" + RETURN doc + ``` + In this basic example, the ArangoSearch expression looks identical to a + `FILTER` expression, but this is not always the case. You can also combine + both, with `FILTER`s after `SEARCH`, in which case the filter criteria are + applied to the search results as a post-processing step. + +{{< info >}} +Note that if you link a collection to a View and execute a query against this +View while it is still being indexed, you may not get complete results. In the +case where a View is still being built and simultaneously used in a query, the +query includes a warning message (code `1240`) informing you that the `arangosearch` +View building is in progress and results can be incomplete. +{{< /info >}} + +### Create your first `search-alias` View + + 1. Create a test collection (e.g. `food`) and insert a few documents so + that you have something to index and search for. You may use the web interface + for this: + - `{ "name": "avocado", "type": ["fruit"] }` (yes, it is a fruit) + - `{ "name": "carrot", "type": ["vegetable"] }` + - `{ "name": "chili pepper", "type": ["vegetable"] }` + - `{ "name": "tomato", "type": ["fruit", "vegetable"] }` + 2. In the **COLLECTIONS** section of the web interface, click the `food` collection. + 3. Go to the **Indexes** tab and click **Add Index**. + 4. Select **Inverted index** as the **Type**. + 5. In the **Fields** panel, enter `name` into **Fields** and confirm the value. + Then also add `type[*]` as a field. + The `[*]` is needed to index the individual elements of the `type` array. + Note that all `type` attributes of the example documents are arrays, even if + they only contain a single element. If you use `[*]` for expanding arrays, + only array elements are indexed, whereas primitive values like the string + `"fruit"` would be ignored by the inverted index (but see the `searchField` + options regarding exceptions). + 6. In the **General** panel, give the index a **Name** like `inv-idx-name-type` + to make it easier for you to identify the index. + 7. Click **Create**. + The inverted index indexes the specified attributes (fields) of the documents + in the `food` collection from now on (with some delay). The attribute values + get processed by the default `identity` Analyzer, which means that they + get indexed unaltered. + 8. In the **VIEWS** section, click the **Add View** card. + 9. Enter a name for the View (e.g. `food_view`) and select **search-alias** + as the **Type**. +10. Select the `food` collection as **Collection** and select the + inverted index you created for the collection as **Index**. +11. Click **Create**. The View uses the inverted index for searching and adds + additional functionality like ranking results and searching across + multiple collections at once. +12. In the **QUERIES** section, try the following query: + ```aql + FOR doc IN food_view + RETURN doc + ``` + The View is used like a collection and simply iterated over to return all + (indexed) documents. You should see the documents stored in `food` as result. +13. Now add a search expression. Unlike with regular collections where you would + use `FILTER`, a `SEARCH` operation is needed to utilize the View index: + ```aql + FOR doc IN food_view + SEARCH doc.name == "avocado" + RETURN doc + ``` + In this basic example, the ArangoSearch expression looks identical to a + `FILTER` expression, but this is not always the case. You can also combine + both, with `FILTER`s after `SEARCH`, in which case the filter criteria are + applied to the search results as a post-processing step. +14. You can also use the inverted index as a stand-alone index as demonstrated + below, by iterating over the collection (not the View) with an index hint to + utilize the inverted index together with the `FILTER` operation: + ```aql + FOR doc IN food OPTIONS { indexHint: "inv-idx-name-type", forceIndexHint: true } + FILTER doc.name == "avocado" + RETURN doc + ``` + Note that you can't rank results and search across multiple collections + using stand-alone inverted index, but you can if you add inverted indexes + to a `search-alias` View and search the View with the `SEARCH` operation. + +### Understanding the Analyzer context + +`arangosearch` Views allow you to index the same field with multiple Analyzers. +This makes it necessary to select the right one in your query by setting the +Analyzer context with the `ANALYZER()` function. + +{{< tip >}} +If you use `search-alias` Views, the Analyzers are inferred from the definitions +of the inverted indexes. This is possible because every field can only be +indexed with a single Analyzer. Don't specify the Analyzer context with the +`ANALYZER()` function in `search-alias` queries to avoid errors. +{{< /tip >}} + +We did not specify an Analyzer explicitly in above example, but it worked +regardless. That is because the `identity` Analyzer is used by default in both +View definitions and AQL queries. The Analyzer chosen in a query needs to match +with one of the Analyzers that a field was indexed with as per the `arangosearch` View +definition - and this happened to be the case. We can rewrite the query to be +more explicit about the Analyzer context: + +```aql +FOR doc IN food_view + SEARCH ANALYZER(doc.name == "avocado", "identity") + RETURN doc +``` + +`ANALYZER(… , "identity")` matches the Analyzer defined in the View +`"analyzers": [ "identity" ]`. The latter defines how fields are transformed at +index time, whereas the former selects which index to use at query time. + +To use a different Analyzer, such as the built-in `text_en` Analyzer, you would +change the View definition to `"analyzers": [ "text_en", "identity" ]` (or just +`"analyzers": [ "text_en" ]` if you don't need the `identity` Analyzer at all) +as well as adjust the query to use `ANALYZER(… , "text_en")`. + +If a field is not indexed with the Analyzer requested in the query, then you +will get an **empty result** back. Make sure that the fields are indexed +correctly and that you set the Analyzer context. + +You can test if a field is indexed with particular Analyzer with one of the +variants of the [`EXISTS()` function](../../aql/functions/arangosearch.md#exists), +for example, as shown below: + +```aql +RETURN LENGTH( + FOR doc IN food_view + SEARCH EXISTS(doc.name, "analyzer", "identity") + LIMIT 1 + RETURN true) > 0 +``` + +If you use an `arangosearch` View, you need to change the `"storeValues"` +property in the View definition from `"none"` to `"id"` for the function to work. +For `search-alias` Views, this feature is always enabled. + +### Basic search expressions + +ArangoSearch supports a variety of logical operators and comparison operators +to filter Views. A basic one is the **equality** comparison operator: + +`doc.name == "avocado"` + +The inversion (inequality) is also allowed: + +`doc.name != "avocado"` + +You can also test against multiple values with the **IN** operator: + +`doc.name IN ["avocado", "carrot"]` + +The same can be expressed with a logical **OR** for multiple conditions: + +`doc.name == "avocado" OR doc.name == "carrot"` + +Similarly, **AND** can be used to require that multiple conditions must be true: + +`doc.name == "avocado" AND doc.type == "fruit"` + +An interesting case is the tomato document with its two array elements as type: +`["fruit", "vegetable"]`. The View definition defaults to +`"trackListPositions": false`, which means that the array elements get indexed +individually as if the attribute had both string values at the same time +(requiring array expansion using `type[*]` or `"searchField": true` in case of the +inverted index for the `search-alias` View), matching the following conditions: + +`doc.type == "fruit" AND doc.type == "vegetable"` + +The same can be expressed with `ALL ==` and `ALL IN`. Note that the attribute +reference and the search conditions are swapped for this: + +`["fruit", "vegetable"] ALL == doc.type` + +To find fruits which are not vegetables at the same time, the latter can be +excluded with `NOT`: + +`doc.type == "fruit" AND NOT doc.type == "vegetable"` + +For a complete list of operators supported in ArangoSearch expressions see +[AQL `SEARCH` operation](../../aql/high-level-operations/search.md). + +### Searching for tokens from full-text + +So far we searched for full matches of name and/or type. Strings could contain +more than just a single term however. It could be multiple words, sentences, or +paragraphs. For such text, we need a way to search for individual tokens, +usually the words that it is comprised of. This is where Text Analyzers come +in. A Text Analyzer tokenizes an entire string into individual tokens that are +then stored in an inverted index. + +There are a few pre-configured text Analyzers, but you can also add your own as +needed. For now, let us use the built-in `text_en` Analyzer for tokenizing +English text. + +_`arangosearch` View:_ + +1. In the **VIEWS** section of the web interface, click the card of the + previously created `food_view` of type `arangosearch`. +2. In the **Links** panel, click the underlined name of the + `food` collection. Enter `name` into **Fields** and confirm the value. +3. Click the underlined name of the field and select the **Analyzers** `text_en` + and `identity`. + + Alternatively, use the editor on the right-hand side to replace `"fields": {},` + with the below code: + ```js + "fields": { + "name": { + "analyzers": ["text_en", "identity"] + } + }, + ``` +4. Click **Save view**. +5. After a few seconds, the `name` attribute has been indexed with the `text_en` + Analyzer in addition to the `identity` Analyzer. +6. Run below query that sets `text_en` as context Analyzer and searches for + the word `pepper`: + ```aql + FOR doc IN food_view + SEARCH ANALYZER(doc.name == "pepper", "text_en") + RETURN doc.name + ``` +7. It matches `chili pepper` because the Analyzer tokenized it into `chili` and + `pepper` and the latter matches the search criterion. Compare that to the + `identity` Analyzer: + ```aql + FOR doc IN food_view + SEARCH ANALYZER(doc.name == "pepper", "identity") + RETURN doc.name + ``` + It does not match because `chili pepper` is indexed as a single token that + does not match the search criterion. +8. Switch back to the `text_en` Analyzer but with a different search term: + ```aql + FOR doc IN food_view + SEARCH ANALYZER(doc.name == "PéPPêR", "text_en") + RETURN doc.name + ``` + This will not match anything, even though this particular Analyzer converts + characters to lowercase and accented characters to their base characters. + The problem is that this transformation is applied to the document attribute + when it gets indexed, but we haven't applied it to the search term. +9. If we apply the same transformation then we get a match: + ```aql + FOR doc IN food_view + SEARCH ANALYZER(doc.name == TOKENS("PéPPêR", "text_en")[0], "text_en") + RETURN doc.name + ``` + Note that the [`TOKENS()` functions](../../aql/functions/string.md#tokens) + returns an array. We pick the first element with `[0]`, which is the + normalized search term `"pepper"`. + +_`search-alias` View:_ + + 1. Collection indexes cannot be changed once created. Therefore, you need to + create a new inverted index to index a field differently. + In the **COLLECTIONS** section of the web interface, go to the **Indexes** + tab and click **Add Index**. + 2. Select **Inverted index** as the **Type**. + 3. In the **Fields** panel, enter `name` into **Fields** and confirm. + 4. Click the underlined `name` field and select `text_en` as **Analyzer**. + Note that every field can only be indexed with a single Analyzer in inverted + indexes and `search-alias` Views. + 5. In the **General** panel, give the index a **Name** like `inv-idx-name-en` + to make it easier for you to identify the index. + 6. Click **Create**. + The inverted indexes indexes the `name` attribute of the documents with the + `text_en` Analyzer, which splits strings into tokens so that you can search + for individual words. + 7. In the **VIEWS** section, click the **Add View** card. + 8. Enter a name for the View (e.g. `food_view_fulltext`) and select + **search-alias** as the **Type**. + 9. Select the `food` collection as **Collection** and select the + `inv-idx-name-en` inverted index as **Index**. +10. Click **Create**. After a few seconds, the `name` attribute has been indexed + with the `text_en` Analyzer. +11. Run below query which searches for the word `pepper`: + ```aql + FOR doc IN food_view_fulltext + SEARCH doc.name == "pepper" + RETURN doc.name + ``` + It matches `chili pepper` because the Analyzer tokenized it into `chili` and + `pepper` and the latter matches the search criterion. +12. Try a different search term: + ```aql + FOR doc IN food_view_fulltext + SEARCH doc.name == "PéPPêR" + RETURN doc.name + ``` + This does not match anything, even though the `text_en` Analyzer converts + characters to lowercase and accented characters to their base characters. + The problem is that this transformation is applied to the document attribute + when it gets indexed, but we haven't applied it to the search term. +13. If we apply the same transformation then we get a match: + ```aql + FOR doc IN food_view_fulltext + SEARCH doc.name == TOKENS("PéPPêR", "text_en")[0] + RETURN doc.name + ``` + Note that the [`TOKENS()` functions](../../aql/functions/string.md#tokens) + returns an array. We pick the first element with `[0]`, which is the + normalized search term `"pepper"`. + +### Search expressions with ArangoSearch functions + +Basic operators are not enough for complex query needs. Additional search +functionality is provided via [ArangoSearch functions](../../aql/functions/arangosearch.md) +that can be composed with basic operators and other functions to form search +expressions. + +ArangoSearch AQL functions take either an expression or a reference (of an +attribute path or the document emitted by a View) as the first argument. + +```aql +BOOST(<expression>, …) +STARTS_WITH(doc.attribute, …) +TDIDF(doc, …) +``` + +If an attribute path expressions is needed, then you have to reference a +document object emitted by a View, e.g. the `doc` variable of +`FOR doc IN viewName`, and then specify which attribute you want to test for, as an unquoted string literal. For example, `doc.attr` or +`doc.deeply.nested.attr`, but not `"doc.attr"`. You can also use the +bracket notation `doc["attr"]`. + +```aql +FOR doc IN viewName + SEARCH STARTS_WITH(doc.deeply.nested["attr"], "avoca") + RETURN doc +``` + +If a reference to the document emitted by the View is required, like for +scoring functions, then you need to pass the raw variable. + +```aql +FOR doc IN viewName + SEARCH ... + SORT BM25(doc) DESC + ... +``` + +If an expression is expected, it means that search conditions can be expressed in +AQL syntax. They are typically function calls to ArangoSearch filter functions, +possibly nested and/or using logical operators for multiple conditions. + +```aql +BOOST(STARTS_WITH(doc.name, "chi"), 2.5) OR STARTS_WITH(doc.name, "tom") +``` + +You should make sure that search terms can match the indexed values by processing +the search terms with the same Analyzers as the indexed document attributes. +This is especially important for full-text search and any form of normalization, +where there is little chance that an unprocessed search term happens to match +the processed, indexed values. + +If you use `arangosearch` Views, the default Analyzer that is used for searching +is `"identity"`. You need to set the Analyzer context in queries against `arangosearch` +Views to select the Analyzer of the indexed data, as a field can be indexed +by multiple Analyzers, or it uses the `identity` Analyzer. + +If you use `search-alias` Views, the Analyzers are inferred from the definitions +of the inverted indexes, and you don't need to and should not set the Analyzer +context with the `ANALYZER()` function. You should still transform search terms +using the same Analyzer as for the indexed values. + +While some ArangoSearch functions accept an Analyzer argument, it is sometimes +necessary to wrap search (sub-)expressions with an `ANALYZER()` call to set the +correct Analyzer in the query so that it matches one of the Analyzers with +which the field has been indexed. This only applies to queries against +`arangosearch` Views. + +It can be easier and cleaner to use `ANALYZER()` even if you exclusively +use functions that take an Analyzer argument and leave that argument out: + +```aql +// Analyzer specified in each function call +PHRASE(doc.name, "chili pepper", "text_en") OR PHRASE(doc.name, "tomato", "text_en") + +// Analyzer specified using ANALYZER() +ANALYZER(PHRASE(doc.name, "chili pepper") OR PHRASE(doc.name, "tomato"), "text_en") +``` + +{{< tip >}} +The [`PHRASE()` function](../../aql/functions/arangosearch.md#phrase) applies the +`text_en` Analyzer to the search terms in both cases. `chili pepper` gets +tokenized into `chili` and `pepper` and these tokens are then searched in this +order. Searching for `pepper chili` would not match. +{{< /tip >}} + +Certain expressions do not require any ArangoSearch functions, such as basic +comparisons. However, the Analyzer used for searching will be `"identity"` +unless `ANALYZER()` is used to set a different one. + +```aql +// The "identity" Analyzer will be used by default +SEARCH doc.name == "avocado" + +// Same as before but being explicit +SEARCH ANALYZER(doc.name == "avocado", "identity") + +// Use the "text_en" Analyzer for searching instead +SEARCH ANALYZER(doc.name == "avocado", "text_en") +``` + +### Ranking results by relevance + +Finding matches is one thing, but especially if there are a lot of results then +the most relevant documents should be listed first. ArangoSearch implements +[scoring functions](../../aql/functions/arangosearch.md#scoring-functions) that +can be used to rank documents by relevance. The popular ranking schemes +[Okapi BM25](https://en.wikipedia.org/wiki/Okapi_BM25) and +[TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) are +available. + +Here is an example that sorts results from high to low BM25 score and also +returns the score: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN food_view + SEARCH doc.type == "vegetable" + SORT BM25(doc) DESC + RETURN { name: doc.name, type: doc.type, score: BM25(doc) } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN food_view + SEARCH ANALYZER(doc.type == "vegetable", "identity") + SORT BM25(doc) DESC + RETURN { name: doc.name, type: doc.type, score: BM25(doc) } +``` +{{< /tab >}} + +{{< /tabs >}} + +As you can see, the variable emitted by the View in the `FOR … IN` loop is +passed to the [`BM25()` function](../../aql/functions/arangosearch.md#bm25). + +| name | type | score | +|:-------------|:----------------------|:--------------------| +| tomato | ["fruit","vegetable"] | 0.43373921513557434 | +| carrot | vegetable | 0.38845786452293396 | +| chili pepper | vegetable | 0.38845786452293396 | + +The [`TFIDF()` function](../../aql/functions/arangosearch.md#tfidf) works the same: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN food_view + SEARCH doc.type == "vegetable" + SORT TFIDF(doc) DESC + RETURN { name: doc.name, type: doc.type, score: TFIDF(doc) } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN food_view + SEARCH ANALYZER(doc.type == "vegetable", "identity") + SORT TFIDF(doc) DESC + RETURN { name: doc.name, type: doc.type, score: TFIDF(doc) } +``` +{{< /tab >}} + +{{< /tabs >}} + +It returns different scores: + +| name | type | score | +|:-------------|:----------------------|:--------------------| +| tomato | ["fruit","vegetable"] | 1.2231435775756836 | +| carrot | vegetable | 1.2231435775756836 | +| chili pepper | vegetable | 1.2231435775756836 | + +The scores will change whenever you insert, modify or remove documents, because +the ranking takes factors like how often a term occurs overall and within a +single document into account. For example, if you insert a hundred more fruit +documents (`INSERT { type: "fruit" } INTO food`) then the TF-IDF score for +vegetables will become 1.4054651260375977. + +You can adjust the ranking in two different ways: +- Boost sub-expressions to favor a condition over another with the + [`BOOST()` function](../../aql/functions/arangosearch.md#boost) +- Calculate a custom score with an expression, optionally taking `BM25()` and + `TFIDF()` into account +Have a look at the [Ranking Examples](ranking.md) for that. + +## Indexing complex JSON documents + +### Working with sub-attributes + +As with regular indexes, there is no limitation to top-level attributes. +Any document attribute at any depth can be indexed. However, with ArangoSearch +it is possible to index all documents attributes or particular attributes +including their sub-attributes without having to modifying the View definition +as new sub-attribute are added. This is possible with `arangosearch` Views +as well as with inverted indexes if you use them through `search-alias` Views. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +You need to create an inverted index and enable the **Include All Fields** +feature to index all document attributes, then add the index to a +`search-alias` View. No matter what attributes you add to your documents, +they will automatically get indexed. + +You can also add **Fields**, click their underlined names, and enable +**Include All Fields** for specific attributes and their sub-attributes: + +```js +... + "fields": [ + { + "name": "value", + "includeAllFields": true + } + ], +... +``` + +This will index the attribute `value` and its sub-attributes. Consider the +following example document: + +```json +{ + "value": { + "nested": { + "deep": "apple pie" + } + } +} +``` + +The View will automatically index `apple pie`, and it can then be queried +like this: + +```aql +FOR doc IN food_view + SEARCH doc.value.nested.deep == "apple pie" + RETURN doc +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +We already used the **Include All Fields** feature to index all document +attributes above when we modified the View definition to this: + +```js +{ + "links": { + "food": { + "includeAllFields": true + } + }, + ... +} +``` + +No matter what attributes you add to your documents, they will automatically +get indexed. To do this for certain attribute paths only, you can enable +the **Include All Fields** options for specific attributes only, and include a +list of Analyzers to process the values with: + +```js +{ + "links": { + "food": { + "fields": { + "value": { + "includeAllFields": true, + "analyzers": ["identity", "text_en"] + } + } + } + } +} +``` + +This will index the attribute `value` and its sub-attributes. Consider the +following example document: + +```json +{ + "value": { + "nested": { + "deep": "apple pie" + } + } +} +``` + +The View will automatically index `apple pie`, processed with the `identity` and +`text_en` Analyzers, and it can then be queried like this: + +```aql +FOR doc IN food_view + SEARCH ANALYZER(doc.value.nested.deep == "apple pie", "identity") + RETURN doc +``` + +```aql +FOR doc IN food_view + SEARCH ANALYZER(doc.value.nested.deep IN TOKENS("pie", "text_en"), "text_en") + RETURN doc +``` + +{{< /tab >}} + +{{< /tabs >}} + +{{< warning >}} +Using `includeAllFields` for a lot of attributes in combination with complex +Analyzers may significantly slow down the indexing process. +{{< /warning >}} + +### Indexing and querying arrays + +With `arangosearch` Views, the elements of arrays are indexed individually by +default, as if the source attribute had each element as value at the same time +(like a _disjunctive superposition_ of their values). This is controlled by the +View setting [`trackListPositions`](arangosearch-views-reference.md#link-properties) +that defaults to `false`. + +With `search-alias` Views, you can get the same behavior by enabling the +`searchField` option globally or for specific fields in their inverted indexes, +or you can explicitly expand certain array attributes by appending `[*]` to the +field name. + +Consider the following document: + +```json +{ + "value": { + "nested": { + "deep": [ 1, 2, 3 ] + } + } +} +``` + +A View that is configured to index the field `value` including sub-fields +will index the individual numbers under the path `value.nested.deep`, which +you can query for like: + +```aql +FOR doc IN viewName + SEARCH doc.value.nested.deep == 2 + RETURN doc +``` + +This is different to `FILTER` operations, where you would use an +[array comparison operator](../../aql/operators.md#array-comparison-operators) +to find an element in the array: + +```aql +FOR doc IN collection + FILTER doc.value.nested.deep ANY == 2 + RETURN doc +``` + +You can set `trackListPositions` to `true` if you want to query for a value +at a specific array index (requires `searchField` to be `true` for +`search-alias` Views): + +```aql +SEARCH doc.value.nested.deep[1] == 2 +``` + +With `trackListPositions` enabled there will be **no match** for the document +anymore if the specification of an array index is left out in the expression: + +```aql +SEARCH doc.value.nested.deep == 2 +``` + +Conversely, there will be no match if an array index is specified but +`trackListPositions` is disabled. + +String tokens are also indexed individually, but only some Analyzer types +return multiple tokens. +If the Analyzer does, then comparison tests are done per token/word. +For example, given the field `text` is analyzed with `"text_en"` and contains +the string `"a quick brown fox jumps over the lazy dog"`, the following +expression will be true: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +doc.text == 'fox' +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +ANALYZER(doc.text == 'fox', "text_en") +``` +{{< /tab >}} + +{{< /tabs >}} + +Note that the `"text_en"` Analyzer stems the words, so this is also true: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +doc.text == 'jump' +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +ANALYZER(doc.text == 'jump', "text_en") +``` +{{< /tab >}} + +{{< /tabs >}} + +So a comparison will actually test if a word is contained in the text. With +`trackListPositions: false`, this means for arrays if the word is contained in +any element of the array. For example, given: + +```json +{"text": [ "a quick", "brown fox", "jumps over the", "lazy dog" ] } +``` + +… the following will be true: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +doc.text == 'jump' +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +ANALYZER(doc.text == 'jump', "text_en") +``` +{{< /tab >}} + +{{< /tabs >}} + +With `trackListPositions: true` you would need to specify the index of the +array element `"jumps over the"` to be true: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +doc.text[2] == 'jump' +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +ANALYZER(doc.text[2] == 'jump', "text_en") +``` +{{< /tab >}} + +{{< /tabs >}} + +Arrays of strings are handled similarly. Each array element is treated like a +token (or possibly multiple tokens if a tokenizing Analyzer is used and +therefore applied to each element). + +## Dealing with eventual consistency + +Regular indexes are immediately consistent. If you have a collection with a +`persistent` index on an attribute `text` and update the value of the attribute +for instance, then this modification is reflected in the index immediately. +View indexes (and inverted indexes) on the other hand are eventual +consistent. Document changes are not reflected instantly, but only near-realtime. +This mainly has performance reasons. + +If you run a search query shortly after a CRUD operation, then the results may +be slightly stale, e.g. not include a newly inserted document: + +```js +db._query(`INSERT { text: "cheese cake" } INTO collection`); +db._query(`FOR doc IN viewName SEARCH doc.text == "cheese cake" RETURN doc`); +// May not find the new document +``` + +Re-running the search query a bit later will include the new document, however. + +There is an internal option to wait for the View to update and thus include +changes just made to documents: + +```js +db._query(`INSERT { text: "pop tart" } INTO collection`); +db._query(`FOR doc IN viewName SEARCH doc.text == "pop tart" OPTIONS { waitForSync: true } RETURN doc`); +``` + +This is not necessary if you use a single server deployment and populate a +collection with documents before creating a View. + +{{< warning >}} +`SEARCH … OPTIONS { waitForSync: true }` is intended to be used in unit tests +to block search queries until the View caught up with the underlying +collections. It is designed to make this use case easier. It should not be used +for other purposes and especially not in production, as it can stall queries. +{{< /warning >}} + +{{< danger >}} +Do not use`SEARCH … OPTIONS { waitForSync: true }` in transactions. View index +changes cannot be rolled back if transactions get aborted. It will lead to +permanent inconsistencies between the linked collections and the View. +{{< /danger >}} + +## How to go from here + +To learn more, check out the different search examples: + +- [**Exact value matching**](exact-value-matching.md): + Search for values as stored in documents (full strings, numbers, booleans). +- [**Range queries**](range-queries.md): + Match values that are above, below or between a minimum and a maximum value. + This is primarily for numeric values. +- [**Prefix matching**](prefix-matching.md): + Search for strings that start with certain strings. A common use case for + this is to implement auto-complete kind of functionality. +- [**Case-sensitivity and diacritics**](case-sensitivity-and-diacritics.md): + Strings can be normalized so that it does not matter whether characters are + upper or lower case, and character accents can be ignored for a better search + experience. This can be combined with other types of search. +- [**Wildcard search**](wildcard-search.md): + Search for partial matches in strings (ends with, contains and more). +- [**Full-text token search**](full-text-token-search.md): + Full-text can be tokenized into words that can then be searched individually, + regardless of their original order, also in combination with prefix + search. Array values are also indexed as separate tokens. +- [**Phrase and proximity search**](phrase-and-proximity-search.md): + Search tokenized full-text with the tokens in a certain order, such as + partial or full sentences, optionally with wildcard tokens for a proximity + search. +- [**Faceted search**](faceted-search.md): + Combine aggregation with search queries to retrieve how often values occur + overall. +- [**Fuzzy search**](fuzzy-search.md): + Match strings even if they are not exactly the same as the search terms. + By allowing some fuzziness you can compensate for typos and match similar + tokens that could be relevant too. +- [**Geospatial search**](geospatial-search.md): + You can use ArangoSearch for geographic search queries to find nearby + locations, places within a certain area and more. It can be combined with + other types of search queries unlike with the regular geo index. +- [**Search highlighting**](search-highlighting.md): + Retrieve the positions of matches within strings, to highlight what was found + in search results (Enterprise Edition only). +- [**Nested search**](nested-search.md): + Match arrays of objects with all the conditions met by a single sub-object, + and define for how many of the elements this must be true (Enterprise Edition only). + +For relevance and performance tuning, as well as the reference documentation, see: + +- [**Ranking**](ranking.md): + Sort search results by relevance, fine-tune the importance of certain search + conditions, and calculate a custom relevance score. +- [**Performance**](performance.md): + Give the View index a primary sort order to benefit common search queries + that you will run and store often used attributes directly in the View index + for fast access. +- **Views Reference** + You can find all View properties and options that are available for the + respective type in the [`arangosearch` Views Reference](arangosearch-views-reference.md) + and [`search-alias` Views Reference](search-alias-views-reference.md) + documentation. + +If you are interested in more technical details, have a look at: + +- [**ArangoSearch Tutorial**](https://www.arangodb.com/learn/search/tutorial/#:~:text=Ranking%20in%20ArangoSearch): + The tutorial includes sections about the View concept, Analysis, and the + ranking model. +- [**ArangoSearch architecture overview**](https://www.arangodb.com/2018/04/arangosearch-architecture-overview/): + A description of ArangoSearch's design, its inverted index and some + implementation details. +- The [**IResearch library**](https://github.com/iresearch-toolkit/iresearch) + that provides the searching and ranking capabilities. diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/arangosearch-views-reference.md b/site/content/arangodb/oem/index-and-search/arangosearch/arangosearch-views-reference.md new file mode 100644 index 0000000000..588bb9e4df --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/arangosearch-views-reference.md @@ -0,0 +1,492 @@ +--- +title: '`arangosearch` Views Reference' +menuTitle: '`arangosearch` Views Reference' +weight: 85 +description: '' +--- +`arangosearch` Views enable sophisticated information retrieval queries such as +full-text search for unstructured or semi-structured data over documents from +different collections, filtering on multiple document attributes and sorting +the documents that satisfy the search criteria by relevance. + +Views guarantee the best execution plan (merge join) when querying multiple +attributes, unlike collections with user-defined indexes. + +Views can be managed as follows: +- in the web interface, in the **VIEWS** section +- via the [Views HTTP API](../../develop/http-api/views/_index.md) +- through the [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views) + +Once you set up a View, you can query it via AQL with the +[`SEARCH` operation](../../aql/high-level-operations/search.md). + +See [Information Retrieval with ArangoSearch](_index.md) for an +introduction to Views and how to search them. + +## Create `arangosearch` Views using the web interface + +You can create and manage an `arangosearch` View through the Web Interface. +To get started, follow the steps outlined below. + +1. In the web interface, go to the left sidebar menu and select + the **VIEWS** entry. +2. To add a new View, click **Add View**. +3. Fill in the required fields: + - For **Name**, enter a name for the View. + - For **Type**, select `arangosearch` from the dropdown menu. +4. To set the **Primary Sort Compression**, select `LZ4` to use a fast compression + or `none` to disable compression and trade space for speed. +5. To set a **Primary Sort** order, define the following options: + - For **Field**, enter an array of attribute values. + - For **Direction**, select **Ascending** or **Descending** to sort the attributes by. +6. To set **Stored Values**, define the following options: + - For **Fields**, enter an array of objects to define which document attributes + to store in the View index. + - The **Compression** attribute defines the compression type used for the internal + column-store. Select `LZ4` for fast compression or `none` for no compression. +7. In the **Advanced** section, you can define the **Write Buffer** properties of a + View. ArangoSearch uses multiple writer objects that are mapped to processed + segments for carrying out operations on its index. You can control the memory + consumed by these writers by utilizing the following properties: + - For **Write Buffer Idle**, enter a value for the maximum number of writers + (segments) cached in the pool. To disable, use `0`. + - For **Write Buffer Active**, enter a value for the maximum number of + concurrent active writers (segments) that perform a transaction. To disable, + use `0`. + - For **Write Buffer Size Max**, enter a value for the maximum memory byte size + per writer (segment) before a writer (segment) flush is triggered. Use `0` to + turn off this limit for any writer. +8. Click **Create**. + +![Create new arangosearch View](../../../../images/arangosearch-create-new-view.png) + +## Create `arangosearch` Views using the JavaScript API + +The following example shows how you can create an `arangosearch` View in _arangosh_: + +```js +--- +name: viewArangoSearchCreate +description: '' +--- +var coll = db._create("books"); +db._createView("products", "arangosearch", { links: { books: { fields: { title: { analyzers: ["text_en"] } } } } }); +~db._dropView("products"); +~db._drop(coll.name()); +``` + +## View Definition/Modification + +An `arangosearch` View is configured via an object containing a set of +View-specific configuration directives and a map of link-specific configuration +directives. + +During View creation the following directives apply: + +- **name** (string, _immutable_): the View name +- **type** (string, _immutable_): the value `"arangosearch"` +- any of the directives from the section [View Properties](#view-properties) + +You may want to create the View without links and add them later. The View +creation with links is not an atomic operation. If errors related to the links +occur, for example, because of incorrect collection or Analyzers names, +inaccessible collections, or similar, then the View is still created without +these links. + +During view modification the following directives apply: + +- **links** (object, _optional_): + a mapping of `collection-name` / `collection-identifier` to one of: + - link creation - link definition as per the section [Link properties](#link-properties) + - link removal - JSON keyword `null` (i.e. nullify a link if present) +- any of the directives from the section [View Properties](#view-properties) + +### Link Properties + +- **analyzers** (_optional_; type: `array`; subtype: `string`; default: `[ + "identity" ]`) + + A list of Analyzers, by name as defined via the [Analyzers](../analyzers.md), + that should be applied to values of processed document attributes. + +- **fields** (_optional_; type: `object`; default: `{}`) + + An object `{ attribute-name: [Link properties], … }` of fields that should be + processed at each level of the document. Each key specifies the document + attribute to be processed. Note that the value of `includeAllFields` is also + consulted when selecting fields to be processed. + + The `fields` property is a recursive data structure. This means that `fields` + can be part of the Link properties again. This lets you index nested attributes. + For example, you might have documents like the following in a collection named + `coll`: + + ```json + { "attr": { "nested": "foo" } } + ``` + + If you want to index the `nested` attribute with the `text_en` Analyzer without + using `includeAllFields`, you can do so with the following View definition: + + ```json + { + "links": { + "coll": { + "fields": { + "attr": { + "fields": { + "nested": { + "analyzers": ["text_en"] + } + } + } + } + } + } + } + ``` + + Each value specifies the [Link properties](#link-properties) directives to be + used when processing the specified field. A Link properties value of `{}` + denotes inheritance of all (except `fields`) directives from the current level. + +- **includeAllFields** (_optional_; type: `boolean`; default: `false`) + + If set to `true`, then process all document attributes. Otherwise, only + consider attributes mentioned in `fields`. Attributes not explicitly + specified in `fields` are processed with default link properties, i.e. + `{}`. + + {{< warning >}} + Using `includeAllFields` for a lot of attributes in combination with complex + Analyzers may significantly slow down the indexing process. + {{< /warning >}} + +- **nested** (_optional_; type: `object`; default: `{}`) + + An object `{ attribute-name: [Link properties], … }` to index the specified + sub-objects that are stored in an array. Other than with the `fields` + property, the values get indexed in a way that lets you query for co-occurring + values. For example, you can search the sub-objects and all the conditions + need to be met by a single sub-object instead of across all of them. + + This property is available in the Enterprise Edition only. + + {{< info >}} + You cannot use the `nested` property at the top-level of the link properties. + It needs to have a parent field, e.g. + `"fields": { "<fieldName>": { "nested": { ... } } }`. + However, You can nest `nested` properties to index objects in arrays in + objects in arrays etc. + {{< /info >}} + + See [Nested search with ArangoSearch](nested-search.md) + for details. + +- **trackListPositions** (_optional_; type: `boolean`; default: `false`) + + If set to `true`, then for array values track the value position in arrays. + E.g., when querying for the input `{ attr: [ "valueX", "valueY", "valueZ" ] }`, + the user must specify: `doc.attr[1] == "valueY"`. Otherwise, all values in + an array are treated as equal alternatives. E.g., when querying for the input + `{ attr: [ "valueX", "valueY", "valueZ" ] }`, the user must specify: + `doc.attr == "valueY"`. + +- **storeValues** (_optional_; type: `string`; default: `"none"`) + + This property controls how the view should keep track of the attribute values. + Valid values are: + + - **none**: Do not store value meta data in the View. + - **id**: Store information about value presence so that you can use the + `EXISTS()` function. + + The `storeValues` option is not to be confused with the `storedValues` option, + which stores attribute values in the View index. + +- **inBackground** (_optional_; type: `boolean`; default: `false`) + + If set to `true`, then no exclusive lock is used on the source collection + during View index creation, so that it remains basically available. + `inBackground` is an option that can be set when adding links. It does not get + persisted as it is not a View property, but only a one-off option. Also see: + [Creating Indexes in Background](../indexing/basics.md#creating-indexes-in-background) + +- **cache** (_optional_; type: `boolean`; default: `false`) + + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} + + <small>Introduced in: v3.9.5, v3.10.2</small> + + If you enable this option, then field normalization values are always cached + in memory. This can improve the performance of scoring and ranking queries. + Otherwise, these values are memory-mapped and it is up to the operating system + to load them from disk into memory and to evict them from memory. + + Normalization values are computed for fields which are processed with Analyzers + that have the `"norm"` feature enabled. These values are used to score fairer + if the same tokens occur repeatedly, to emphasize these documents less. + + You can also enable this option to always cache auxiliary data used for querying + fields that are indexed with Geo Analyzers in memory. + This can improve the performance of geo-spatial queries. + + See the [`--arangosearch.columns-cache-limit` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-limit) + to control the memory consumption of this cache. You can reduce the memory + usage of the column cache in cluster deployments by only using the cache for + leader shards, see the + [`--arangosearch.columns-cache-only-leader` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-only-leader) + (introduced in v3.10.6). + +### View Properties + +- **primarySort** (_optional_; type: `array`; default: `[]`; _immutable_) + + A primary sort order can be defined to enable an AQL optimization. If a query + iterates over all documents of a View, wants to sort them by attribute values + and the (left-most) fields to sort by as well as their sorting direction match + with the *primarySort* definition, then the `SORT` operation is optimized away. + Also see [Primary Sort Order](performance.md#primary-sort-order) + +- **primarySortCompression** (_optional_; type: `string`; default: `lz4`; _immutable_) + + Defines how to compress the primary sort data. + + - `"lz4"` (default): use LZ4 fast compression. + - `"none"`: disable compression to trade space for speed. + +- **primarySortCache** (_optional_; type: `boolean`; default: `false`; _immutable_) + + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} + + <small>Introduced in: v3.9.6, v3.10.2</small> + + If you enable this option, then the primary sort columns are always cached in + memory. This can improve the performance of queries that utilize the + [primary sort order](performance.md#primary-sort-order). + Otherwise, these values are memory-mapped and it is up to the operating system + to load them from disk into memory and to evict them from memory. + + See the [`--arangosearch.columns-cache-limit` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-limit) + to control the memory consumption of this cache. You can reduce the memory + usage of the column cache in cluster deployments by only using the cache for + leader shards, see the + [`--arangosearch.columns-cache-only-leader` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-only-leader) + (introduced in v3.10.6). + +- **primaryKeyCache** (_optional_; type: `boolean`; default: `false`; _immutable_) + + {{< tag "ArangoDB Enterprise Edition" "AMP" >}} + + <small>Introduced in: v3.9.6, v3.10.2</small> + + If you enable this option, then the primary key columns are always cached in + memory. This can improve the performance of queries that return many documents. + Otherwise, these values are memory-mapped and it is up to the operating system + to load them from disk into memory and to evict them from memory. + + See the [`--arangosearch.columns-cache-limit` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-limit) + to control the memory consumption of this cache. You can reduce the memory + usage of the column cache in cluster deployments by only using the cache for + leader shards, see the + [`--arangosearch.columns-cache-only-leader` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-only-leader) + (introduced in v3.10.6). + +- **storedValues** (_optional_; type: `array`; default: `[]`; _immutable_) + + An array of objects to describe which document attributes to store in the + View index. It can then cover search queries, which means the data can be + taken from the index directly and accessing the storage engine can be + avoided. + + Each object is expected in the following form: + + `{ "fields": [ "attr1", "attr2", ... "attrN" ], "compression": "none", "cache": false }` + + - The required `fields` attribute is an array of strings with one or more + document attribute paths. The specified attributes are placed into a single + column of the index. A column with all fields that are involved in common + search queries is ideal for performance. The column should not include too + many unneeded fields, however. + + - The optional `compression` attribute defines the compression type used for + the internal column-store, which can be `"lz4"` (LZ4 fast compression, default) + or `"none"` (no compression). + + - The optional `cache` attribute allows you to always cache stored values in + memory (introduced in v3.9.5 and v3.10.2, Enterprise Edition only). + This can improve the query performance if stored values are involved. See the + [`--arangosearch.columns-cache-limit` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-limit) + to control the memory consumption of this cache. You can reduce the memory + usage of the column cache in cluster deployments by only using the cache for + leader shards, see the + [`--arangosearch.columns-cache-only-leader` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-only-leader) + (introduced in v3.10.6). + + You may use the following shorthand notations on View creation instead of + an array of objects as described above. The default compression and cache + settings are used in this case: + + - An array of strings, like `["attr1", "attr2"]`, to place each attribute into + a separate column of the index (introduced in v3.10.3). + + - An array of arrays of strings, like `[["attr1", "attr2"]]`, to place the + attributes into a single column of the index, or `[["attr1"], ["attr2"]]` + to place each attribute into a separate column. + + The `storedValues` option is not to be confused with the `storeValues` option, + which allows to store meta data about attribute values in the View index. + +An inverted index is the heart of `arangosearch` Views. +The index consists of several independent segments and the index **segment** +itself is meant to be treated as a standalone index. **Commit** is meant to be +treated as the procedure of accumulating processed data creating new index +segments. **Consolidation** is meant to be treated as the procedure of joining +multiple index segments into a bigger one and removing garbage documents (e.g. +deleted from a collection). **Cleanup** is meant to be treated as the procedure +of removing unused segments after release of internal resources. + +- **cleanupIntervalStep** (_optional_; type: `integer`; default: `2`; to + disable use: `0`) + + ArangoSearch waits at least this many commits between removing unused files in + its data directory for the case where the consolidation policies merge + segments often (i.e. a lot of commit+consolidate). A lower value causes 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 impacts + performance without any added benefits. + + > With every **commit** or **consolidate** operation a new state of the view + > internal data-structures is created on disk. Old states/snapshots are + > released once there are no longer any users remaining. However, the files + > for the released states/snapshots are left on disk, and only removed by + > "cleanup" operation. + +- **commitIntervalMsec** (_optional_; type: `integer`; default: `1000`; + to disable use: `0`) + + Wait at least this many milliseconds between committing View data store + changes and making documents visible to queries. + + For the case where there are a lot of inserts/updates, a higher value causes the + index not to account for them and memory usage continues to grow until the commit. + A lower value impacts performance, including the case where there are no or only a + few inserts/updates because of synchronous locking, and it wastes disk space for + each commit call. + + > For data retrieval `arangosearch` Views follow the concept of + > "eventually-consistent", i.e. eventually all the data in ArangoDB is + > matched by corresponding query expressions. + > The concept of `arangosearch` View "commit" operation is introduced to + > control the upper-bound on the time until document addition/removals are + > actually reflected by corresponding query expressions. + > Once a "commit" operation is complete, all documents added/removed prior to + > the start of the "commit" operation are reflected by queries invoked in + > subsequent ArangoDB transactions. In-progress ArangoDB transactions + > still continue to return a repeatable-read state. + +- **consolidationIntervalMsec** (_optional_; type: `integer`; default: `1000`; + to disable use: `0`) + + Wait at least this many milliseconds between applying `consolidationPolicy` to + consolidate View data store and possibly release space on the filesystem. + + For the case where there are a lot of data modification operations, a higher + value could potentially have the data store consume more space and file handles. + For the case where there are a few data modification operations, a lower value + impacts performance due to no segment candidates available for + consolidation. + + > For data modification `arangosearch` Views follow the concept of a + > "versioned data store". Thus old versions of data may be removed once there + > are no longer any users of the old data. The frequency of the cleanup and + > compaction operations are governed by `consolidationIntervalMsec` and the + > candidates for compaction are selected via `consolidationPolicy`. + +ArangoSearch performs operations in its index based on numerous writer +objects that are mapped to processed segments. In order to control memory that +is used by these writers (in terms of "writers pool") one can use +`writebuffer*` properties of a view. + +- **writebufferIdle** (_optional_; type: `integer`; default: `64`; + to disable use: `0`; _immutable_) + + Maximum number of writers (segments) cached in the pool. + +- **writebufferActive** (_optional_; type: `integer`; default: `0`; + to disable use: `0`; _immutable_) + + Maximum number of concurrent active writers (segments) that perform a transaction. + Other writers (segments) wait till current active writers (segments) finish. + +- **writebufferSizeMax** (_optional_; type: `integer`; default: `33554432`; + to disable use: `0`; _immutable_) + + Maximum memory byte size per writer (segment) before a writer (segment) flush is + triggered. `0` value turns off this limit for any writer (buffer) and data + is flushed periodically. `0` value should be used carefully due to high + potential memory consumption. + +- **consolidationPolicy** (_optional_; type: `object`; default: `{}`) + + The consolidation policy to apply for selecting data store segment merge + candidates. + + > With each ArangoDB transaction that inserts documents, one or more + > ArangoSearch internal segments gets created. Similarly, for removed + > documents the segments containing such documents have these documents + > marked as "deleted". Over time, this approach causes a lot of small and + > sparse segments to be created. A **consolidation** operation selects one or + > more segments and copies all of their valid documents into a single new + > segment, thereby allowing the search algorithm to perform more optimally and + > for extra file handles to be released once old segments are no longer used. + + - **type** (_optional_; type: `string`; default: `"tier"`) + + The segment candidates for the "consolidation" operation are selected based + upon several possible configurable formulas as defined by their types. + The currently supported types are: + + - `"bytes_accum"`: Consolidation is performed based on current memory + consumption of segments and `threshold` property value. + - `"tier"`: Consolidate based on segment byte size and live document count + as dictated by the customization attributes. + + {{< warning >}} + The "bytes_accum" policy type is deprecated and remains in ArangoSearch for backwards + compatibility with the older versions. Please make sure to always use the `tier` policy + instead. + {{< /warning >}} + + `consolidationPolicy` properties for `"bytes_accum"` type: + + - **threshold** (_optional_; type: `float`; default: `0.1`) + + Defines threshold value of `[0.0, 1.0]` possible range. Consolidation is + performed on segments which accumulated size in bytes is less than all + segments' byte size multiplied by the `threshold`; i.e. the following formula + is applied for each segment: + `{threshold} > (segment_bytes + sum_of_merge_candidate_segment_bytes) / all_segment_bytes`. + + `consolidationPolicy` properties for `"tier"` type: + + - **segmentsMin** (_optional_; type: `integer`; default: `1`) + + The minimum number of segments that are evaluated as candidates for consolidation. + + - **segmentsMax** (_optional_; type: `integer`; default: `10`) + + The maximum number of segments that are evaluated as candidates for consolidation. + + - **segmentsBytesMax** (_optional_; type: `integer`; default: `5368709120`) + + Maximum allowed size of all consolidated segments in bytes. + + - **segmentsBytesFloor** (_optional_; type: `integer`; default: `2097152`) + + Defines the value (in bytes) to treat all smaller segments as equal for consolidation + selection. + + - **minScore** (_optional_; type: `integer`; default: `0`) + + Filter out consolidation candidates with a score less than this. diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/case-sensitivity-and-diacritics.md b/site/content/arangodb/oem/index-and-search/arangosearch/case-sensitivity-and-diacritics.md new file mode 100644 index 0000000000..5b88316c9e --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/case-sensitivity-and-diacritics.md @@ -0,0 +1,125 @@ +--- +title: Case-insensitive Search with ArangoSearch +menuTitle: Case-sensitivity and Diacritics +weight: 25 +description: >- + You can normalize values for case-insensitive matching and to ignore diacritics, also in combination with other search techniques +--- +## Normalizing a Single Token + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### Custom Analyzer + +Create a `norm` Analyzer in arangosh to normalize case to all lowercase and to +remove diacritics: + +```js +//db._useDatabase("your_database"); // Analyzer will be created in current database +var analyzers = require("@arangodb/analyzers"); +analyzers.save("norm_en", "norm", { locale: "en", accent: false, case: "lower" }, []); +``` + +No [Analyzer features](../analyzers.md#analyzer-features) are set because the +examples on this page don't require them. + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-ci", type: "inverted", fields: [ { name: "title", analyzer: "norm_en" } ] }); +db._createView("imdb_alias", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-ci" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "title": { + "analyzers": [ + "norm_en" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +#### Example: Full string matching + +Match movie title, ignoring capitalization and using the base characters +instead of accented characters (full string). + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.title == TOKENS("thé mäTRïX", "norm_en")[0] + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.title == TOKENS("thé mäTRïX", "norm_en")[0], "norm_en") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| **The Matrix** | + +#### Example: Prefix matching + +Match a title prefix (case-insensitive). + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH STARTS_WITH(doc.title, "the matr") + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(STARTS_WITH(doc.title, "the matr"), "norm_en") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| **The Matrix** Revisited | +| **The Matrix** | +| **The Matrix** Reloaded | +| **The Matrix** Revolutions | +| **The Matrix** Trilogy | + +{{% comment %}} +## Normalizing Full-text + +{{% /comment %}} diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/exact-value-matching.md b/site/content/arangodb/oem/index-and-search/arangosearch/exact-value-matching.md new file mode 100644 index 0000000000..334e8753f5 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/exact-value-matching.md @@ -0,0 +1,236 @@ +--- +title: Matching Exact Values with ArangoSearch +menuTitle: Exact value matching +weight: 10 +description: >- + Search for exact strings, numbers or number ranges, as well as booleans without Analyzer transformations applied +--- +If you want to find strictly equal values, then the `identity` Analyzer is what +you need. It will not apply any transformations. It is a no-operation Analyzer +that passes everything through unaltered. + +## Matching an Exact String + +You can index and search strings with the `identity` Analyzer for exact +matching, that is case-sensitive, with accented characters as-is, and only if +the entire string is equal (not matching substrings). + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact", type: "inverted", fields: [ "title" ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-exact" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "title": { + "analyzers": [ + "identity" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match exact movie title (case-sensitive, full string): + +```aql +FOR doc IN imdb + SEARCH doc.title == "The Matrix" + RETURN doc.title +``` + +| Result | +|:-------| +| **The Matrix** | + +For `arangosearch` Views, it is not necessary to set the Analyzer context with +the `ANALYZER()` function here, because the default Analyzer is `identity` anyway. +However, being explicit about the Analyzer context can help with clarity and it +also makes it easier to adjust queries if you want to use something other than +the `identity` Analyzers: + +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.title == "The Matrix", "identity") + RETURN doc.title +``` + +A common pitfall is to index a field with a certain +Analyzer, but forgetting to set this Analyzer as context in the query. +The consequence is usually an empty result, because there is nothing in the +View index for the implicitly requested Analyzer. Or the field happens to be +indexed with the `identity` Analyzer as well, but there are no or different +matches because of different Analyzer pre-processing between the indexed data +and the search terms. + +For `search-alias` Views, you never need to specify an Analyzer in queries, +because the Analyzer is inferred from the inverted index definition, which only +allows a single Analyzer per field. + +## Matching Multiple Strings + +You can search for several alternatives by combining multiple conditions with +logical `OR`s, but you can also use the `IN` operator for the same purpose. +The advantage of the `IN` operator is that it scales better with the number of +alternatives and allows you to use a single query for a varying amount of +strings that you want to match. + +Match multiple exact movie titles using `OR`: + +```aql +FOR doc IN imdb + SEARCH doc.title == "The Matrix" OR doc.title == "The Matrix Reloaded" + RETURN doc.title +``` + +| Result | +|:-------| +| The Matrix | +| The Matrix Reloaded | + +Match multiple exact movie titles using `IN`: + +```aql +FOR doc IN imdb + SEARCH doc.title IN ["The Matrix", "The Matrix Reloaded"] + RETURN doc.title +``` + +| Result | +|:-------| +| The Matrix | +| The Matrix Reloaded | + +By substituting the array of strings with a bind parameter, it becomes possible +to use the same query for an arbitrary amount of alternative strings to match: + +```aql +FOR doc IN imdb + SEARCH doc.title IN @titles + RETURN doc.title +``` + +Bind parameters: + +```json +{ + "titles": [ + "The Matrix", + "The Matrix Reloaded", + "The Matrix Revolutions", + "The Matrix Trilogy", + "The Matrix Revisited" + ] +} +``` + +| Result | +|:-------| +| The Matrix Revisited | +| The Matrix | +| The Matrix Reloaded | +| The Matrix Revolutions | +| The Matrix Trilogy | + +## Using Negations + +Searching for exact values does not end with one or many equality conditions, +but extends to negations as well. You can search for inequality with the `!=` +operator to return everything from the View index but documents that do not +fulfill the criterion. This is also works with multiple alternatives using the +`NOT IN` operator. + +Match movies that do not have the title `The Matrix`: + +```aql +FOR doc IN imdb + SEARCH doc.title != "The Matrix" + RETURN doc.title +``` + +| Result | +|:-------| +| … | +| null | +| null | +| "Ploning" | +| null | +| "Code Rush" | +| null | +| null | +| null | +| null | +| "Ghost in the Shell 2.0" | +| "Christmas in Wonderland" | +| null | +| … | + +Note that this includes documents that do not even have a title attribute, +with the effect of returning many `null` values in the result. + +Match movies that neither have the title `The Matrix` nor `The Matrix Reloaded`. +Post-filter the results to exclude implicit `null`s: + +```aql +FOR doc IN imdb + SEARCH doc.title NOT IN ["The Matrix", "The Matrix Reloaded"] + FILTER doc.title != null + RETURN doc.title +``` + +| Result | +|:-------| +| Ploning | +| Code Rush | +| Ghost in the Shell 2.0 | +| Christmas in Wonderland | +| Hadashi no Gen | +| The Magician | +| … | + +A better way to ignore documents without title attribute is to use the +[`EXISTS()` function](../../aql/functions/arangosearch.md#exists). +For `arangosearch` Views, you need to change the `storeValues` View property +(not to be confused with `storedValues`!) from `"none"` to `"id"`. You can then +to test whether there is a title field or not. For `search-alias` Views, the +`EXISTS()` function works out of the box. + +On a single server with this particular dataset, the query is roughly five times +faster than the previous one without `EXISTS()`: + +```aql +FOR doc IN imdb + SEARCH EXISTS(doc.title) AND doc.title NOT IN ["The Matrix", "The Matrix Reloaded"] + RETURN doc.title +``` + +| Result | +|:-------| +| Ploning | +| Code Rush | +| Ghost in the Shell 2.0 | +| Christmas in Wonderland | +| Hadashi no Gen | +| The Magician | +| … | diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/example-datasets.md b/site/content/arangodb/oem/index-and-search/arangosearch/example-datasets.md new file mode 100644 index 0000000000..eaec48b289 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/example-datasets.md @@ -0,0 +1,38 @@ +--- +title: Example Datasets for ArangoSearch +menuTitle: Example Datasets +weight: 5 +description: >- + Datasets you may use for experimenting with ArangoSearch features +--- +## IMDB Movie Dataset + +This is a movies and actors dataset based on data of the +[Internet Movie Database](https://www.imdb.com/) (IMDB). +It was converted into a graph. Also see the +[arangodb/example-datasets](https://github.com/arangodb/example-datasets/tree/master/Graphs/IMDB) +repository. + +1. Download [imdb_graph_dump_rev2.zip](https://github.com/arangodb/example-datasets/releases/download/imdb-graph-dump-rev2/imdb_graph_dump_rev2.zip) (6.45 MB) +2. Unpack the downloaded archive +3. Restore the folder `dump` with [arangorestore](../../components/tools/arangorestore/_index.md) + into an ArangoDB instance, e.g. + `arangorestore --server.endpoint tcp://localhost:8529 --server.database IMDB --create-database --include-system-collections --input-directory dump` +4. Create a View called `imdb` in the IMDB database. You can find various View + configuration examples in this chapter. + +## Demo Geo S2 Dataset + +This is a New York restaurants and neighborhoods dataset taken from OpenData.city. +Also see the +[arangodb-foxx/demo-geo-s2](https://github.com/arangodb-foxx/demo-geo-s2) +repository. + +1. Download [dump.zip](https://github.com/arangodb-foxx/demo-geo-s2/archive/refs/heads/dump.zip) (2.2 MB) +2. Unpack the downloaded archive +3. Restore the folder `demo-geo-s2-dump` with [arangorestore](../../components/tools/arangorestore/_index.md) + into an ArangoDB instance, e.g. + `arangorestore --server.endpoint tcp://localhost:8529 --server.database GeoS2 --create-database --input-directory demo-geo-s2-dump` +4. Create a View called `restaurantsView` in the `GeoS2` database. + You can find various View configuration examples in + [Geospatial Search with ArangoSearch](geospatial-search.md). diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/faceted-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/faceted-search.md new file mode 100644 index 0000000000..dd48df4851 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/faceted-search.md @@ -0,0 +1,137 @@ +--- +title: Faceted Search with ArangoSearch +menuTitle: Faceted search +weight: 45 +description: >- + Combine aggregation with search queries to retrieve how often values occur + overall +--- +A popular method for filtering items in an online shop is to display product +categories in a list, together with the number of items in each category. +This way, users get an idea of how many items will be left after applying a +certain filter before they actually enable it. This concept can be extended to +any properties, also called facets. + +To implement such a feature in ArangoDB, you can use a `COLLECT` operation +to group and count how many documents share an attribute value. This is also +possible with `arangosearch` and `search-alias` Views by simply iterating over a +View instead of a collection. + +## Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +## View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact", type: "inverted", fields: [ "title" ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-exact" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "genre": { + "analyzers": [ + "identity" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +## AQL queries + +Find out all genre values by grouping by the `genre` attribute and count the +number of occurrences: + +```aql +FOR doc IN imdb + COLLECT genre = doc.genre WITH COUNT INTO count + RETURN { genre, count } +``` + +| genre | count | +|:----------|------:| +| null | 51287 | +| Action | 2449 | +| Adventure | 312 | +| Animation | 426 | +| British | 1 | +| Comedy | 3188 | +| … | … | + +The `COLLECT` operation is applied as a post-operation. In other words, it is +not accelerated by the View index. On the other hand, the `genre` field does +not need to be indexed for this query. + +To look up a specific genre, the field needs to be indexed. The lookup itself +utilizes the View index, but the `COLLECT` operation is still a post-operation: + +```aql +FOR doc IN imdb + SEARCH doc.genre == "Action" + COLLECT WITH COUNT INTO count + RETURN count +``` + +```json +[ + 2690 +] +``` + +For above query with a single, simple condition, there is an optimization you +can enable that can accurately determine the count from index data faster than +the standard `COLLECT`. Also see +[Count Approximation](performance.md#count-approximation). + +```aql +FOR doc IN imdb + SEARCH doc.genre == "Action" + OPTIONS { countApproximate: "cost" } + COLLECT WITH COUNT INTO count + RETURN count +``` + +To apply this optimization to the faceted search paradigm over all genres, you +can run and **cache** the following query that determines all unique genre +values: + +```aql +FOR doc IN imdb + RETURN DISTINCT doc.genre +``` + +You may use the AQL query cache if the data does not change much, or you could +execute above query periodically and store the result in a separate collection. +The numbers will not be fully up to date in that case, but it is often an +acceptable tradeoff for a faceted search. + +You can then use the genre list to look up each genre and retrieve the count +while utilizing the count approximation optimization: + +```aql +LET genres = [ "Action", "Adventure", "Animation", /* ... */ ] +FOR genre IN genres + LET count = FIRST( + FOR doc IN imdb + SEARCH doc.genre == genre + OPTIONS { countApproximate: "cost" } + COLLECT WITH COUNT INTO count + RETURN count + ) + RETURN { genre, count } +``` diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/full-text-token-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/full-text-token-search.md new file mode 100644 index 0000000000..ab922a8b74 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/full-text-token-search.md @@ -0,0 +1,182 @@ +--- +title: Searching Full-text with ArangoSearch +menuTitle: Full-text token search +weight: 35 +description: >- + Search for tokens in full-text that can occur in any order +--- +Full-text strings can be tokenized by `text` Analyzers so that each token +(usually a word) gets indexed separately. Subsequently, it becomes possible to +search for individual tokens. This is also possible with arrays of strings, +where each element is one token (or multiple, additionally tokenized by a +`text` Analyzer). + +There are two ways to search for tokens: + +- **Token search**: + The tokens can occur in any order. The words you search for merely need to + be contained in the source string somehow. +- **Phrase search**: + The order of the tokens needs to match the query. This allows you to search + for partial or full sentences. + +Token search is covered below. For phrase search see +[Phrase and Proximity Search](phrase-and-proximity-search.md). + +## Token Search + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-text", type: "inverted", fields: [ { name: "description", analyzer: "text_en" } ] }); +db._createView("imdb_alias", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-text" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "description": { + "analyzers": [ + "text_en" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +#### Example: Match one out of multiple tokens + +Search for movies with `dinosaur` or `park` (or both) in their description. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("dinosaur park", "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("dinosaur park", "text_en"), "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | +|:------|:------------| +| Alone in the Wilderness | … the Aleutian Peninsula, in what is now Lake Clark National **Park**. … | +| Madagascar Collection | … The plot follows the adventures of story of four Central **Park** Zoo animals … | +| Sea Monsters: A Prehistoric Adventure | Journey 80 million years back in time to an age when mighty **dinosaurs** dominated the land … | +| Land of the Lost | … their only ally in a world full of **dinosaurs** and other fantastic creatures. | +| … | … | + +#### Example: Match multiple tokens + +Search for movies with both `dinosaur` and `park` in their description: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH TOKENS("dinosaur park", "text_en") ALL == doc.description + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(TOKENS("dinosaur park", "text_en") ALL == doc.description, "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | +|:------|:------------| +| Jurassic Park Series | … the Jurassic **Park** films. This trilogy of films brings all our childhood fantasies to life with **dinosaurs** … | +| Jurassic Park | A wealthy entrepreneur secretly creates a theme **park** featuring living **dinosaurs** … | +| The Lost World: Jurassic Park | Four years after Jurassic **Park's** genetically bred **dinosaurs** ran amok … | +| Cesta do pravěku | … Four young boys visit a **dinosaur** exhibit … They then row out onto Central **Park** Lake … | + +The results will be the same if you use `park dinosaur` as search terms, +as the tokens can be ordered arbitrarily. + +#### Example: Match a certain number of tokens + +Search for movies with two out of the three provided tokens in their description, +so `dinosaur` and `scientist`, `dinosaur` and `moon`, or `scientist` and `moon`, +in any order: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH TOKENS("dinosaur scientist moon", "text_en") AT LEAST (2) == doc.description + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(TOKENS("dinosaur scientist moon", "text_en") AT LEAST (2) == doc.description, "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | +|:------|:------------| +| Earthstorm | A massive asteroid impact on the **moon** … a team of **scientists** turn to one man … to find a solution and secure the **moon**. +| 100 Million BC | Modern **scientists** discover the deadly consequences of time travel when they retrieve a flesh-eating **dinosaur** … +| The Lost World | Professor Challenger leads an expedition of **scientists** … to verify his claim that **dinosaurs** still live there. +| The Lost World | A **scientist** discovers **dinosaurs** on a remote plateau in Mongolia. +| By Rocket to the Moon | A **scientist** discovers that there's gold on the **moon** … +| Doctor X | A wisecracking New York reporter intrudes on a research **scientist's** quest to unmask The **Moon** Killer. diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/fuzzy-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/fuzzy-search.md new file mode 100644 index 0000000000..048f1a49ea --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/fuzzy-search.md @@ -0,0 +1,388 @@ +--- +title: Fuzzy Search with ArangoSearch +menuTitle: Fuzzy search +weight: 50 +description: >- + Loosely match strings to find partial congruences and to compensate for typing errors +--- +Fuzzy search is an umbrella term for various approximate matching algorithms. +What they allow you to do is to find matches even if the search terms are not +spelled exactly like the words in the stored text. This includes terms that +are similar, alternatively spelled, or mistyped but potentially relevant for +the search request as well. + +{{< info >}} +If you want to try out fuzzy search with ArangoDB for yourself, then check out +our interactive +[Fuzzy Search tutorial](https://colab.research.google.com/github/arangodb/interactive_tutorials/blob/master/notebooks/FuzzySearch.ipynb). +{{< /info >}} + +## Similarity Measures + +How the approximate string matching algorithms usually work is that they +measure how similar (or different) two strings are. The following similarity +measures are available in ArangoDB: + +- **Levenshtein distance** and a variant called Damerau-Levenshtein distance, + which work best with short strings +- **_n_-gram similarity** and a variant called positional _n_-gram similarity, + that are well-suited to assess the similarity of longer strings that share + subsequences + +### Levenshtein Distance + +The Levenshtein distance is an _edit distance_ string metric. It is informally +defined as the minimum number of single-character edits to go from one string +to the other. The allowed operations are: +- insertions +- deletions +- substitutions + +The lowest possible number of the required operations is the Levenshtein +distance. Consider the following two strings: + +``` +galaxy +galxy +``` + +The latter word is misspelled (it is missing the second `a`). We can correct it +by adding an `a`. One operation in total means that the Levenshtein distance is +`1`. It also is for the following pair of strings, but this time requiring the +removal of a character (an extra `l`): + +``` +galaxy +gallaxy +``` + +In the following example, the `e` needs to be replaced with an `a`: + +``` +galaxy +gelaxy +``` + +This is again one operation, so the edit distance is `1`. Here is an example that +requires more than one operation: + +``` +galaxy +glaaxy +``` + +The first `a` and the `l` are in the wrong order, perhaps cause the latter +string was entered hastily. We can remove the `l` from the second position and +insert an `l` at the third position to correct the string. Therefore, the +Levenshtein distance is `2`. We could also substitute the second and third +character instead, but the edit distance remains the same. + +### Damerau-Levenshtein Distance + +The Damerau-Levenshtein distance is like the [Levenshtein distance](#levenshtein-distance) +but with transpositions as additional operation. Consider the following example +where the latter string has the `a` and `l` in the wrong order: + +``` +galaxy +glaaxy +``` + +This can be corrected by shifting the `l` one character to the right. Hence, +the Damerau-Levenshtein distance is only `1`. The pure Levenshtein distance +is `2`. + +### N-Gram Similarity + +The _n_-grams of a string are all of its possible substrings of a given length. +The `n` in _n_-gram stands for that substring size. _N_-grams of size 2 are +called 2-grams or _bigrams_, and _n_-grams of size 3 are called 3-grams or +_trigrams_. + +Here is an example for the word `avocado` that has three trigrams: + +``` +avocado + +avo + voc + oca + cad + ado +``` + +To compare the similarity of two sets of _n_-grams, one can simply count how +many _n_-grams of the target string match the source string (the target string +being the search term and the source string being the stored string), and +divide the sum by the number of the target string's _n_-grams. Only fully +matching _n_-grams count. + +Consider the following example with `avocado` as source string and `vocals` as +target string: + +``` +avocado vocals + +avo voc + voc oca + oca cal + cad als + ado +``` + +We find the trigrams `voc` and `oca` from the right side also on the left side. +The other two do not have a corresponding trigram on the left side. That means, +`2 / 4` trigrams match, resulting in a similarity of `0.5` using this +similarity measure. + +### Positional N-Gram Similarity + +Instead of considering only full _n_-gram matches, one can also consider +partial matches where the characters are in the same positions and counting the +longest common sequence. + +``` +avocado vocals + +avo voc +voc oca +oca cal +cad als +ado +``` + +In above example, `voc` and `oca` on the right side have a fully matching +trigram on the left side. `cal` and `als` do not, but there is `cad` which has +a `c` in the first position and an `a` in the second position, and both `avo` +and `ado` have a matching `a` in the first position. + +``` +voc voc 3 / 3 = 1 +oca oca 3 / 3 = 1 +cad cal 2 / 3 = 0.666… +ado als 1 / 3 = 0.333… +``` + +We sum up the highest similarity we found for each trigram and divide by the +total _n_-gram count, which ever of the two is higher (here the left side with +5 trigrams). The result is `3 / 5` or `0.6` in positional _n_-gram similarity. + +## Fuzzy Search in ArangoDB + +There are the following AQL string functions to calculate the +[similarity](#similarity-measures) of two arbitrary strings: +- [`LEVENSHTEIN_DISTANCE()`](../../aql/functions/string.md#levenshtein_distance) +- [`NGRAM_SIMILARITY()`](../../aql/functions/string.md#ngram_similarity) +- [`NGRAM_POSITIONAL_SIMILARITY()`](../../aql/functions/string.md#ngram_positional_similarity) + +```aql +RETURN [ + LEVENSHTEIN_DISTANCE("galaxy", "glaaxy"), // 1 (with transpositions) + NGRAM_SIMILARITY("avocado", "vocals", 3) // 0.5 (using trigrams) + NGRAM_POSITIONAL_SIMILARITY("avocado", "vocals", 3) // 0.6 (using trigrams) +] +``` + +To perform fuzzy searches, there are two ArangoSearch functions: +- [`LEVENSHTEIN_MATCH()`](../../aql/functions/arangosearch.md#levenshtein_match) +- [`NGRAM_MATCH()`](../../aql/functions/arangosearch.md#ngram_match) + +They can be used in conjunction with a View for index-accelerated fuzzy search +queries. The string similarity affects the overall `BM25()` / `TFIDF()` score +when [ranking](ranking.md) results. + +### Searching with `LEVENSHTEIN_MATCH()` + +#### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +#### Custom Analyzer + +Create a `text` Analyzer in arangosh to tokenize text, normalize case to all +lowercase and to remove diacritics, but with stemming disabled unlike the +built-in `text_en` Analyzer. The search will be accent- and case-insensitive, +and the Levenshtein distance between the stored and searched text will be taken +into account accurately. With stemming enabled, it would be less accurate with +respect to the original strings, but potentially find more matches that are +also relevant. + +```js +--- +name: levenshtein_match_sample +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.save("text_en_no_stem", "text", { locale: "en", accent: false, case: "lower", stemming: false, stopwords: [] }, ["frequency", "norm"]); +~analyzers.remove("text_en_no_stem"); +``` + +The `frequency` and `norm` [Analyzer features](../analyzers.md#analyzer-features) +are set because the following examples require them for the `BM25()` scoring +function to work. + +#### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-text", type: "inverted", fields: [ { name: "description", analyzer: "text_en_no_stem" } ] }); +db._createView("imdb_alias", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-text" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "description": { + "analyzers": [ + "text_en_no_stem" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +#### AQL queries + +Search for the token `galxy` in the movie descriptions with some fuzziness. +The maximum allowed Levenshtein distance is set to `1`. Everything with a +Levenshtein distance equal to or lower than this value is a match and the +respective documents are included in the search result. The query finds +the token `galaxy` as the edit distance to `galxy` is `1`. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH LEVENSHTEIN_MATCH( + doc.description, + TOKENS("galxy", "text_en_no_stem")[0], + 1, // max distance + false // without transpositions + ) + SORT BM25(doc) DESC + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER( + LEVENSHTEIN_MATCH( + doc.description, + TOKENS("galxy", "text_en_no_stem")[0], + 1, // max distance + false // without transpositions + ), + "text_en_no_stem" + ) + SORT BM25(doc) DESC + RETURN { + title: doc.title, + description: doc.description + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | +|:------|:------------| +| Stargate: The Ark of Truth | … in the Ori's own home **galaxy**. … SG-1 travels to the Ori **galaxy** aboard the Odyssey. … finds themselves in a distant **galaxy** fighting two powerful enemies. | +| The Ice Pirates | … the most precious commodity in the **galaxy** is water. … the unreachable centre of the **galaxy** at the end of the galactic trade wars. The **galaxy** is ruled by an evil emperor … | +| Star Wars: Episode III: Revenge of the Sith | … leading a massive clone army into a **galaxy**-wide battle against the Separatists. When the sinister Sith unveil a thousand-year-old plot to rule the **galaxy**, … | +| … | … | + +### Searching with `NGRAM_MATCH()` + +#### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +#### Custom Analyzer + +`NGRAM_MATCH()` requires an `ngram` Analyzer. For this example, create a +trigram Analyzer in arangosh with a minimum and maximum _n_-gram size of 3, +not including the original string: + +```js +--- +name: ngram_match_sample +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.save("trigram", "ngram", { min: 3, max: 3, preserveOriginal: false, streamType: "utf8" }, ["frequency", "position"]); +~analyzers.remove("trigram"); +``` + +The `frequency` and `position` [Analyzer features](../analyzers.md#analyzer-features) +are set because the following examples require them for the `NGRAM_MATCH()` +filter function to work. + +#### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-ngram", type: "inverted", fields: [ { name: "name", analyzer: "trigram" } ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-ngram" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "name": { + "analyzers": [ + "trigram" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +#### AQL queries + +Search for actor names with an _n_-gram similarity of at least 50%. + +```aql +FOR doc IN imdb + SEARCH NGRAM_MATCH( + doc.name, + "avocado", + 0.5, // similarity threshold + "trigram" // custom n-gram Analyzer + ) + RETURN { + name: doc.name + } +``` + +| name | +|:-----| +| Nancy S**avoca** | +| John S**avoca** | diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/geospatial-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/geospatial-search.md new file mode 100644 index 0000000000..d8df3fc973 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/geospatial-search.md @@ -0,0 +1,632 @@ +--- +title: Geospatial Search with ArangoSearch +menuTitle: Geospatial search +weight: 55 +description: >- + ArangoSearch supports geospatial queries like finding locations and GeoJSON shapes within a radius or area +--- +ArangoSearch can accelerate various types of geospatial queries for data that +is indexed by a View. The regular [geospatial index](../indexing/working-with-indexes/geo-spatial-indexes.md) can do +most of this too, but ArangoSearch allows you to combine geospatial requests +with other kinds of searches, like full-text search. + +## Creating geospatial Analyzers + +Geospatial data that can be indexed: + +- GeoJSON features such as Points and Polygons + (with coordinates in `[longitude, latitude]` order), for example: + + ```json + { + "location": { + "type": "Point", + "coordinates": [ -73.983, 40.764 ] + } + } + ``` + +- Coordinates using an array with two numbers in `[longitude, latitude]` order, + for example: + + ```json + { + "location": [ -73.983, 40.764 ] + } + ``` + +- Coordinates using an array with two numbers in `[latitude, longitude]` order, + for example: + + ```json + { + "location": [ 40.764, -73.983 ] + } + ``` + +- Coordinates using two separate numeric attributes, for example: + + ```json + { + "location": { + "lat": 40.764, + "lng": -73.983 + } + } + ``` + +You need to create Geo Analyzers manually. There are no pre-configured +(built-in) Geo Analyzers. + +- The data needs to be pre-processed with a `geojson` or `geo_s2` Analyzer in + case of GeoJSON or coordinate arrays in `[longitude, latitude]` order. + +- For coordinate arrays in `[latitude, longitude]` order or coordinate pairs using + separate attributes, you need to use a `geopoint` Analyzer. + +**Custom Analyzers:** + +Create a `geojson` Analyzer in arangosh to pre-process arbitrary +GeoJSON features or `[longitude, latitude]` arrays. +The default properties are usually what you want, therefore an empty object +is passed. No [Analyzer features](../analyzers.md#analyzer-features) are set +because they cannot be utilized for Geo Analyzers: + +```js +//db._useDatabase("your_database"); // Analyzer will be created in current database +var analyzers = require("@arangodb/analyzers"); +analyzers.save("geojson", "geojson", {}, []); +``` + +See [`geojson` Analyzer](../analyzers.md#geojson) for details. + +{{< tip >}} +In the Enterprise Edition, you can use the `geo_s2` Analyzer instead of the +`geojson` Analyzer to more efficiently index geo-spatial data. It is mostly a +drop-in replacement, but you can choose between different binary formats. See +[Analyzers](../analyzers.md#geo_s2) for details. +{{< /tip >}} + +Create a `geopoint` Analyzer in arangosh using the default properties +(empty object) to pre-process coordinate arrays in `[latitude, longitude]` order. +No [Analyzer features](../analyzers.md#analyzer-features) are set as they cannot +be utilized for Geo Analyzers: + +```js +//db._useDatabase("your_database"); // Analyzer will be created in current database +var analyzers = require("@arangodb/analyzers"); +analyzers.save("geo_pair", "geopoint", {}, []); +``` + +Create a `geopoint` Analyzer in arangosh to pre-process coordinates with +latitude and longitude stored in two different attributes. These attributes +cannot be at the top-level of the document, but must be nested in an object, +e.g. `{ location: { lat: 40.78, lon: -73.97 } }`. The path relative to the +parent attribute (here: `location`) needs to be described in the Analyzer +properties for each of the coordinate attributes. +No [Analyzer features](../analyzers.md#analyzer-features) are set as they cannot +be utilized for Geo Analyzers: + +```js +//db._useDatabase("your_database"); // Analyzer will be created in current database +var analyzers = require("@arangodb/analyzers"); +analyzers.save("geo_latlng", "geopoint", { latitude: ["lat"], longitude: ["lng"] }, []); +``` + +## Using the example dataset + +Load the dataset into an ArangoDB instance and create a View `restaurantsViews` +as described below: + +**Dataset:** [Demo Geo S2 dataset](example-datasets.md#demo-geo-s2-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.restaurants.ensureIndex({ name: "inv-rest", type: "inverted", fields: [ { name: "location", analyzer: "geojson" } ] }); +db.neighborhoods.ensureIndex({ name: "inv-hood", type: "inverted", fields: [ "name", { name: "geometry", analyzer: "geojson" } ] }); +db._createView("restaurantsViewAlias", "search-alias", { indexes: [ + { collection: "restaurants", index: "inv-rest" }, + { collection: "neighborhoods", index: "inv-hood" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "restaurants": { + "fields": { + "name": { + "analyzers": [ + "identity" + ] + }, + "location": { + "analyzers": [ + "geojson" + ] + } + } + }, + "neighborhoods": { + "fields": { + "name": { + "analyzers": [ + "identity" + ] + }, + "geometry": { + "analyzers": [ + "geojson" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +## Search for points within a radius + +Using the Museum of Modern Arts as reference location, find restaurants within +a 100 meter radius. Return the matches sorted by distance and include how far +away they are from the reference point in the result. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET moma = GEO_POINT(-73.983, 40.764) +FOR doc IN restaurantsViewAlias + SEARCH GEO_DISTANCE(doc.location, moma) < 100 + LET distance = GEO_DISTANCE(doc.location, moma) + SORT distance + RETURN { + geometry: doc.location, + distance + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET moma = GEO_POINT(-73.983, 40.764) +FOR doc IN restaurantsView + SEARCH ANALYZER(GEO_DISTANCE(doc.location, moma) < 100, "geojson") + LET distance = GEO_DISTANCE(doc.location, moma) + SORT distance + RETURN { + geometry: doc.location, + distance + } +``` +{{< /tab >}} + +{{< /tabs >}} + +Search for restaurants with `Cafe` in their name within a radius of 1000 meters +and return the ten closest matches: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET moma = GEO_POINT(-73.983, 40.764) +FOR doc IN restaurantsViewAlias + SEARCH LIKE(doc.name, "%Cafe%") + AND GEO_DISTANCE(doc.location, moma) < 1000 + LET distance = GEO_DISTANCE(doc.location, moma) + SORT distance + LIMIT 10 + RETURN { + geometry: doc.location, + name: doc.name, + distance + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET moma = GEO_POINT(-73.983, 40.764) +FOR doc IN restaurantsView + SEARCH LIKE(doc.name, "%Cafe%") + AND ANALYZER(GEO_DISTANCE(doc.location, moma) < 1000, "geojson") + LET distance = GEO_DISTANCE(doc.location, moma) + SORT distance + LIMIT 10 + RETURN { + geometry: doc.location, + name: doc.name, + distance + } +``` +{{< /tab >}} + +{{< /tabs >}} + +## Search for points within a polygon + +First off, search for the neighborhood `Upper West Side` in a subquery and +return its GeoJSON Polygon. Then search for restaurants that are contained +in this polygon and return them together with the polygon itself: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET upperWestSide = FIRST( + FOR doc IN restaurantsViewAlias + SEARCH doc.name == "Upper West Side" + RETURN doc.geometry +) +FOR result IN PUSH( + FOR doc IN restaurantsViewAlias + SEARCH GEO_CONTAINS(upperWestSide, doc.location) + RETURN doc.location, + upperWestSide +) + RETURN result +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET upperWestSide = FIRST( + FOR doc IN restaurantsView + SEARCH doc.name == "Upper West Side" + RETURN doc.geometry +) +FOR result IN PUSH( + FOR doc IN restaurantsView + SEARCH ANALYZER(GEO_CONTAINS(upperWestSide, doc.location), "geojson") + RETURN doc.location, + upperWestSide +) + RETURN result +``` +{{< /tab >}} + +{{< /tabs >}} + +![ArangoSearch geospatial query for points in a polygon](../../../../images/arangosearch-geo-points-in-polygon.png) + +You do not have to look up the polygon, you can also provide one inline. +It is also not necessary to return the polygon, you can return the matches only: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET upperWestSide = { + "coordinates": [ + [ + [-73.9600301843709, 40.79803810789689], [-73.96147779901374, 40.79865415643638], + [-73.96286980146162, 40.79923967661966], [-73.96571144280439, 40.80043806998765], + [-73.96775900356977, 40.80130351598543], [-73.967873797219, 40.801351698184384], + [-73.96798415954912, 40.80139826627661], [-73.9685836074654, 40.80163547026629], + [-73.9700474216526, 40.8022650103398], [-73.97021594793262, 40.80233585148787], + [-73.9702740046587, 40.80235903699402], [-73.97032589767365, 40.802384560870536], + [-73.97150381003809, 40.80283773617443], [-73.97250022180596, 40.80321661262814], + [-73.97257779806121, 40.803247183771205], [-73.9726574474597, 40.803276514162725], + [-73.9727990775659, 40.803329159656634], [-73.97287179081519, 40.80335618764528], + [-73.97286807262155, 40.80332073417601], [-73.97292317001968, 40.80324982284384], + [-73.97303522902072, 40.803073973741895], [-73.97307070537943, 40.8030555484474], + [-73.97312859120993, 40.80297471550862], [-73.97320518045738, 40.802830058276285], + [-73.97336671067801, 40.80263011334645], [-73.9735422772157, 40.802356411250294], + [-73.97361322463904, 40.80229685988716], [-73.97372060455763, 40.80216781528022], + [-73.97377477246009, 40.802045845948555], [-73.97389989052462, 40.80188986353119], + [-73.97394098366709, 40.801809025361415], [-73.97414361823468, 40.80151689534114], + [-73.97448722520987, 40.801057428896804], [-73.97466556722725, 40.80081351473415], + [-73.97483924436003, 40.800558243262664], [-73.97496436808184, 40.80036963419388], + [-73.97508668067891, 40.800189533632995], [-73.97526783234453, 40.79993284953172], + [-73.97554385822018, 40.79952825063732], [-73.97576219486481, 40.79926017354928], + [-73.97579140130195, 40.799209627886206], [-73.97578169321191, 40.799156256780286], + [-73.97583055785255, 40.799092280410655], [-73.97628527884252, 40.798435235410054], + [-73.97639951930574, 40.79827321018994], [-73.97685207845194, 40.79763134839318], + [-73.97779475503205, 40.79628462977189], [-73.97828949152755, 40.79558676046088], + [-73.9792882208298, 40.79417763216331], [-73.98004684398002, 40.79311352516391], + [-73.98013222578662, 40.79299376538315], [-73.98043434256003, 40.79259428309673], + [-73.980537679464, 40.79245681262498], [-73.9809470835408, 40.79186789327993], + [-73.9812893737095, 40.79137550943302], [-73.98139174468567, 40.79122824550256], + [-73.98188645946546, 40.79051658043251], [-73.98234664147564, 40.789854780772636], + [-73.98369521623664, 40.7879152813127], [-73.98461942858408, 40.78658601634982], + [-73.98513520970327, 40.7865876183929], [-73.98581237352651, 40.78661686535709], + [-73.98594956155667, 40.786487113463934], [-73.98594285499497, 40.78645284788032], + [-73.98589227228327, 40.78642652901958], [-73.98574378790113, 40.78657008235215], + [-73.98465507883022, 40.78653474180794], [-73.98493597820354, 40.786130720650974], + [-73.98501696406497, 40.78601423719563], [-73.98513163631205, 40.786060297019965], + [-73.98516263994709, 40.78602099926717], [-73.98521103560748, 40.78603955488367], + [-73.98520511880037, 40.78604766921276], [-73.98561523764435, 40.78621964571528], + [-73.98567072256468, 40.786242911993796], [-73.98563627093053, 40.786290150146684], + [-73.9856828719225, 40.78630978621313], [-73.98576566029752, 40.786196274858625], + [-73.98571752900456, 40.78617599466878], [-73.98568388524215, 40.78622212391968], + [-73.9852400328845, 40.786035858136785], [-73.98528177918672, 40.785978620950054], + [-73.98524962933016, 40.78596313985583], [-73.98524273937655, 40.78597257215073], + [-73.98525509797992, 40.78597620551157], [-73.98521621867376, 40.786030501313824], + [-73.98517050238989, 40.786013334158156], [-73.98519883325449, 40.785966552197756], + [-73.98508113773205, 40.785921935110444], [-73.98542932126942, 40.78541394218462], + [-73.98609763784941, 40.786058225697936], [-73.98602727478911, 40.78622896423671], + [-73.98607113521973, 40.78624070602659], [-73.98612842248588, 40.78623900133112], + [-73.98616462880626, 40.786121882448306], [-73.98649778102359, 40.78595120288725], + [-73.98711901394266, 40.78521031850151], [-73.98707234561569, 40.78518963831753], + [-73.98645586240198, 40.7859192190814], [-73.98617270496544, 40.786068452258675], + [-73.98546581197026, 40.78536070057543], [-73.98561580396368, 40.78514186259503], + [-73.98611372725294, 40.78443891187735], [-73.98625187003543, 40.78423876424543], + [-73.98647480368592, 40.783916573718706], [-73.98787728725019, 40.78189205083216], + [-73.98791968459247, 40.78183347771321], [-73.98796079284213, 40.781770987031514], + [-73.98801805997222, 40.78163418881042], [-73.98807644914505, 40.78165093500162], + [-73.9881002938246, 40.78160287830527], [-73.98804128806725, 40.78158596085119], + [-73.98812746102577, 40.78140179644223], [-73.98799363156404, 40.78134281734761], + [-73.98746219857024, 40.7811086095956], [-73.98741432690473, 40.7810875110951], + [-73.98736363983177, 40.78106280511045], [-73.98730772854313, 40.781041303287786], + [-73.98707137465644, 40.78090638159226], [-73.98654378951805, 40.780657980791055], + [-73.98567936117642, 40.78031263333493], [-73.98536952677372, 40.781078372362586], + [-73.98507184345014, 40.781779680969194], [-73.9835260146705, 40.781130011022704], + [-73.98232616371553, 40.78062377270337], [-73.9816278736105, 40.780328934969766], + [-73.98151911347311, 40.78028175751621], [-73.98140948736065, 40.780235418619405], + [-73.98067365344895, 40.7799251824873], [-73.97783054404911, 40.77872973181589], + [-73.97499744020544, 40.777532546222], [-73.97453231422314, 40.77816778452296], + [-73.97406668257638, 40.77880541672153], [-73.97357117423289, 40.7794778616211], + [-73.9717230555586, 40.78202147595964], [-73.97122292220932, 40.782706256089995], + [-73.97076013116715, 40.783340137553594], [-73.97030068162124, 40.78397541394847], + [-73.96983225556819, 40.7846109105862], [-73.96933573318945, 40.78529327955705], + [-73.96884378957469, 40.78596738856434], [-73.96838479313664, 40.78659569652393], + [-73.96792696354466, 40.78722157112602], [-73.96744908373155, 40.78786072059045], + [-73.96700977073398, 40.78847679074218], [-73.96655226678917, 40.78910715282553], + [-73.96609500572444, 40.78973438976665], [-73.96562799538655, 40.790366117129004], + [-73.96517705499011, 40.79099034109932], [-73.96468540739478, 40.79166402679883], + [-73.9641759852132, 40.79236204502772], [-73.96371096541819, 40.79301293488322], + [-73.96280590635729, 40.79423581323211], [-73.96235980150668, 40.79485206056065], + [-73.96189985460951, 40.79547927006112], [-73.96144060655736, 40.79611082718394], + [-73.96097971807933, 40.79673864404529], [-73.96052271669541, 40.797368469462334], + [-73.9600301843709, 40.79803810789689] + ] + ], + "type": "Polygon" +} +FOR doc IN restaurantsViewAlias + SEARCH GEO_CONTAINS(upperWestSide, doc.location) + RETURN doc.location +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET upperWestSide = { + "coordinates": [ + [ + [-73.9600301843709, 40.79803810789689], [-73.96147779901374, 40.79865415643638], + [-73.96286980146162, 40.79923967661966], [-73.96571144280439, 40.80043806998765], + [-73.96775900356977, 40.80130351598543], [-73.967873797219, 40.801351698184384], + [-73.96798415954912, 40.80139826627661], [-73.9685836074654, 40.80163547026629], + [-73.9700474216526, 40.8022650103398], [-73.97021594793262, 40.80233585148787], + [-73.9702740046587, 40.80235903699402], [-73.97032589767365, 40.802384560870536], + [-73.97150381003809, 40.80283773617443], [-73.97250022180596, 40.80321661262814], + [-73.97257779806121, 40.803247183771205], [-73.9726574474597, 40.803276514162725], + [-73.9727990775659, 40.803329159656634], [-73.97287179081519, 40.80335618764528], + [-73.97286807262155, 40.80332073417601], [-73.97292317001968, 40.80324982284384], + [-73.97303522902072, 40.803073973741895], [-73.97307070537943, 40.8030555484474], + [-73.97312859120993, 40.80297471550862], [-73.97320518045738, 40.802830058276285], + [-73.97336671067801, 40.80263011334645], [-73.9735422772157, 40.802356411250294], + [-73.97361322463904, 40.80229685988716], [-73.97372060455763, 40.80216781528022], + [-73.97377477246009, 40.802045845948555], [-73.97389989052462, 40.80188986353119], + [-73.97394098366709, 40.801809025361415], [-73.97414361823468, 40.80151689534114], + [-73.97448722520987, 40.801057428896804], [-73.97466556722725, 40.80081351473415], + [-73.97483924436003, 40.800558243262664], [-73.97496436808184, 40.80036963419388], + [-73.97508668067891, 40.800189533632995], [-73.97526783234453, 40.79993284953172], + [-73.97554385822018, 40.79952825063732], [-73.97576219486481, 40.79926017354928], + [-73.97579140130195, 40.799209627886206], [-73.97578169321191, 40.799156256780286], + [-73.97583055785255, 40.799092280410655], [-73.97628527884252, 40.798435235410054], + [-73.97639951930574, 40.79827321018994], [-73.97685207845194, 40.79763134839318], + [-73.97779475503205, 40.79628462977189], [-73.97828949152755, 40.79558676046088], + [-73.9792882208298, 40.79417763216331], [-73.98004684398002, 40.79311352516391], + [-73.98013222578662, 40.79299376538315], [-73.98043434256003, 40.79259428309673], + [-73.980537679464, 40.79245681262498], [-73.9809470835408, 40.79186789327993], + [-73.9812893737095, 40.79137550943302], [-73.98139174468567, 40.79122824550256], + [-73.98188645946546, 40.79051658043251], [-73.98234664147564, 40.789854780772636], + [-73.98369521623664, 40.7879152813127], [-73.98461942858408, 40.78658601634982], + [-73.98513520970327, 40.7865876183929], [-73.98581237352651, 40.78661686535709], + [-73.98594956155667, 40.786487113463934], [-73.98594285499497, 40.78645284788032], + [-73.98589227228327, 40.78642652901958], [-73.98574378790113, 40.78657008235215], + [-73.98465507883022, 40.78653474180794], [-73.98493597820354, 40.786130720650974], + [-73.98501696406497, 40.78601423719563], [-73.98513163631205, 40.786060297019965], + [-73.98516263994709, 40.78602099926717], [-73.98521103560748, 40.78603955488367], + [-73.98520511880037, 40.78604766921276], [-73.98561523764435, 40.78621964571528], + [-73.98567072256468, 40.786242911993796], [-73.98563627093053, 40.786290150146684], + [-73.9856828719225, 40.78630978621313], [-73.98576566029752, 40.786196274858625], + [-73.98571752900456, 40.78617599466878], [-73.98568388524215, 40.78622212391968], + [-73.9852400328845, 40.786035858136785], [-73.98528177918672, 40.785978620950054], + [-73.98524962933016, 40.78596313985583], [-73.98524273937655, 40.78597257215073], + [-73.98525509797992, 40.78597620551157], [-73.98521621867376, 40.786030501313824], + [-73.98517050238989, 40.786013334158156], [-73.98519883325449, 40.785966552197756], + [-73.98508113773205, 40.785921935110444], [-73.98542932126942, 40.78541394218462], + [-73.98609763784941, 40.786058225697936], [-73.98602727478911, 40.78622896423671], + [-73.98607113521973, 40.78624070602659], [-73.98612842248588, 40.78623900133112], + [-73.98616462880626, 40.786121882448306], [-73.98649778102359, 40.78595120288725], + [-73.98711901394266, 40.78521031850151], [-73.98707234561569, 40.78518963831753], + [-73.98645586240198, 40.7859192190814], [-73.98617270496544, 40.786068452258675], + [-73.98546581197026, 40.78536070057543], [-73.98561580396368, 40.78514186259503], + [-73.98611372725294, 40.78443891187735], [-73.98625187003543, 40.78423876424543], + [-73.98647480368592, 40.783916573718706], [-73.98787728725019, 40.78189205083216], + [-73.98791968459247, 40.78183347771321], [-73.98796079284213, 40.781770987031514], + [-73.98801805997222, 40.78163418881042], [-73.98807644914505, 40.78165093500162], + [-73.9881002938246, 40.78160287830527], [-73.98804128806725, 40.78158596085119], + [-73.98812746102577, 40.78140179644223], [-73.98799363156404, 40.78134281734761], + [-73.98746219857024, 40.7811086095956], [-73.98741432690473, 40.7810875110951], + [-73.98736363983177, 40.78106280511045], [-73.98730772854313, 40.781041303287786], + [-73.98707137465644, 40.78090638159226], [-73.98654378951805, 40.780657980791055], + [-73.98567936117642, 40.78031263333493], [-73.98536952677372, 40.781078372362586], + [-73.98507184345014, 40.781779680969194], [-73.9835260146705, 40.781130011022704], + [-73.98232616371553, 40.78062377270337], [-73.9816278736105, 40.780328934969766], + [-73.98151911347311, 40.78028175751621], [-73.98140948736065, 40.780235418619405], + [-73.98067365344895, 40.7799251824873], [-73.97783054404911, 40.77872973181589], + [-73.97499744020544, 40.777532546222], [-73.97453231422314, 40.77816778452296], + [-73.97406668257638, 40.77880541672153], [-73.97357117423289, 40.7794778616211], + [-73.9717230555586, 40.78202147595964], [-73.97122292220932, 40.782706256089995], + [-73.97076013116715, 40.783340137553594], [-73.97030068162124, 40.78397541394847], + [-73.96983225556819, 40.7846109105862], [-73.96933573318945, 40.78529327955705], + [-73.96884378957469, 40.78596738856434], [-73.96838479313664, 40.78659569652393], + [-73.96792696354466, 40.78722157112602], [-73.96744908373155, 40.78786072059045], + [-73.96700977073398, 40.78847679074218], [-73.96655226678917, 40.78910715282553], + [-73.96609500572444, 40.78973438976665], [-73.96562799538655, 40.790366117129004], + [-73.96517705499011, 40.79099034109932], [-73.96468540739478, 40.79166402679883], + [-73.9641759852132, 40.79236204502772], [-73.96371096541819, 40.79301293488322], + [-73.96280590635729, 40.79423581323211], [-73.96235980150668, 40.79485206056065], + [-73.96189985460951, 40.79547927006112], [-73.96144060655736, 40.79611082718394], + [-73.96097971807933, 40.79673864404529], [-73.96052271669541, 40.797368469462334], + [-73.9600301843709, 40.79803810789689] + ] + ], + "type": "Polygon" +} +FOR doc IN restaurantsView + SEARCH ANALYZER(GEO_CONTAINS(upperWestSide, doc.location), "geojson") + RETURN doc.location +``` +{{< /tab >}} + +{{< /tabs >}} + +## Search for polygons within polygons + +Define a GeoJSON polygon that is a rectangle, then search for neighborhoods +that are fully contained in this area: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET sides = { + left: -74, + top: 40.8, + right: -73.93, + bottom: 40.76 +} + +LET rect = GEO_POLYGON([ + [sides.left, sides.bottom], + [sides.right, sides.bottom], + [sides.right, sides.top], + [sides.left, sides.top], + [sides.left, sides.bottom] +]) + +FOR result IN PUSH( + FOR doc IN restaurantsViewAlias + SEARCH GEO_CONTAINS(rect, doc.geometry) + RETURN doc.geometry, + rect +) + RETURN result +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET sides = { + left: -74, + top: 40.8, + right: -73.93, + bottom: 40.76 +} + +LET rect = GEO_POLYGON([ + [sides.left, sides.bottom], + [sides.right, sides.bottom], + [sides.right, sides.top], + [sides.left, sides.top], + [sides.left, sides.bottom] +]) + +FOR result IN PUSH( + FOR doc IN restaurantsView + SEARCH ANALYZER(GEO_CONTAINS(rect, doc.geometry), "geojson") + RETURN doc.geometry, + rect +) + RETURN result +``` +{{< /tab >}} + +{{< /tabs >}} + +![ArangoSearch geosptial query for polygons in a polygon](../../../../images/arangosearch-geo-polygons-in-polygon.png) + +Searching for geo features in a rectangle is something you can use together +with an interactive map that the user can select the area of interest with. +Take a look at the lunch break video about the +[ArangoBnB demo project](https://www.youtube.com/watch?v=ec-X9PA3DJc) to learn more. + +## Search for polygons intersecting polygons + +Define a GeoJSON polygon that is a rectangle, then search for neighborhoods +that intersect with this area: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET sides = { + left: -74, + top: 40.8, + right: -73.93, + bottom: 40.76 +} + +LET rect = GEO_POLYGON([ + [sides.left, sides.bottom], + [sides.right, sides.bottom], + [sides.right, sides.top], + [sides.left, sides.top], + [sides.left, sides.bottom] +]) + +FOR result IN PUSH( + FOR doc IN restaurantsViewAlias + SEARCH GEO_INTERSECTS(rect, doc.geometry) + RETURN doc.geometry, + rect +) + RETURN result +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET sides = { + left: -74, + top: 40.8, + right: -73.93, + bottom: 40.76 +} + +LET rect = GEO_POLYGON([ + [sides.left, sides.bottom], + [sides.right, sides.bottom], + [sides.right, sides.top], + [sides.left, sides.top], + [sides.left, sides.bottom] +]) + +FOR result IN PUSH( + FOR doc IN restaurantsView + SEARCH ANALYZER(GEO_INTERSECTS(rect, doc.geometry), "geojson") + RETURN doc.geometry, + rect +) + RETURN result +``` +{{< /tab >}} + +{{< /tabs >}} + +![ArangoSearch geospatial query for polygons intersecting a polygon](../../../../images/arangosearch-geo-polygons-intersecting-polygon.png) diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/nested-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/nested-search.md new file mode 100644 index 0000000000..563adf1d58 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/nested-search.md @@ -0,0 +1,321 @@ +--- +title: Nested search with ArangoSearch +menuTitle: Nested search +weight: 65 +description: >- + You can search for nested objects in arrays that satisfy multiple conditions + each, and define how often these conditions should be fulfilled for the entire + array +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +By default, `arangosearch` Views index arrays as if the parent attribute had +multiple values at once. This is also supported for `search-alias` Views by enabling +the `searchField` option. With `trackListPositions` set to `true`, every array +element is indexed individually and can be queried separately using the +respective array index. With the nested search feature, you get another +option for indexing arrays, in particular nested objects in arrays. + +You can let the View index the sub-objects in a way that lets you query for +co-occurring values. For example, you can search the sub-objects and all the +conditions need to be met by a single sub-object instead of across all of them. + +## Using nested search + +Consider the following document: + +```json +{ + "dimensions": [ + { "type": "height", "value": 35 }, + { "type": "width", "value": 60 } + ] +} +``` + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +You would normally index the `dimensions.type` and `dimensions.value` fields and +with an inverted index and then use it via a `search-alias` View, in arangosh: + +```js +db.<collection>.ensureIndex({ + name: "inv-idx", + type: "inverted", + searchField: true, + fields: [ + "dimensions.type", + "dimensions.value" + ] +}); + +db._createView("viewName", "search-alias", { indexes: [ + { collection: "<collection>", index: "inv-idx" } +]}); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +You would normally index the `dimensions` field and its sub-fields with an +`arangosearch` View definition like the following: + +```json +{ + "links": { + "<collection>": { + "fields": { + "dimensions": { + "fields": { + "type": {}, + "value": {} + } + } + } + } + }, + ... +} +``` +{{< /tab >}} + +{{< /tabs >}} + +You might then write a query like the following to find documents where the +height is greater than 40: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions.type == "height" AND doc.dimensions.value > 40 + RETURN doc +``` + +This query matches the above document despite the height only being 35. The reason is +that each condition is true for at least one of the nested objects. There is no +check whether both conditions are true for the same object, however. You could +add a `FILTER` statement to remove false-positive matches from the search +results, but it is cumbersome to check the conditions again, for every sub-object: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions.type == "height" AND doc.dimensions.value > 40 + FILTER LENGTH(doc.dimensions[* FILTER CURRENT.type == "height" AND CURRENT.value > 40]) > 0 + RETURN doc +``` + +The nested search feature allows you to condense the query while utilizing the +View index: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions[? FILTER CURRENT.type == "height" AND CURRENT.value > 40] + RETURN doc +``` + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +The required inverted index definition for using a `search-alias` View +to perform nested searches needs to index the parent `dimensions` field, as well +as the nested attributes using the `nested` property under the `fields` property: + +```js +db.<collection>.ensureIndex({ + name: "inv-nest", + type: "inverted", + fields: [ + { + name: "dimensions", + nested: [ + { name: "type" }, + { name: "value" } + ] + } + ] +}); + +db._createView("viewName", "search-alias", { indexes: [ + { collection: "<collection>", index: "inv-nest" } +]}); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +The required `arangosearch` View definition for this to work is as follows: + +```json +{ + "links": { + "<collection>": { + "fields": { + "dimensions": { + "nested": { + "type": {}, + "value": {} + } + } + } + } + } +} +``` + +Note the usage of a `nested` property instead of a `fields` property. +{{< /tab >}} + +{{< /tabs >}} + +This configures the View to index the objects in the `dimensions` array so that +you can use the [Question mark operator](../../aql/operators.md#question-mark-operator) +to query the nested objects. The default `identity` Analyzer is used for the +fields because none is specified explicitly. + +## Defining how often the conditions need to be true + +You can optionally specify a quantifier to define how often the conditions need +to be true for the entire array. The following query matches documents that have +one or two nested objects with a height greater than 40: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions[? 1..2 FILTER CURRENT.type == "height" AND CURRENT.value > 40] + RETURN doc +``` + +If you leave out the quantifier, it defaults to `ANY`. The conditions need to be +fulfilled by at least one sub-object, but more than one sub-object may meet the +conditions. With a quantity of `1`, it would need to be one match exactly. +Similarly, ranges require an exact match between the minimum and maximum number, +including the specified boundaries. To require two or more sub-objects to +fulfill the conditions, you can use `AT LEAST (2)`, and so on. + +{{< info >}} +- To use the question mark operator with the `ALL` quantifier in `SEARCH` + queries against `arangosearch` Views, you need at least ArangoDB v3.10.1 and + set the `storeValues` property of the View to `"id"`. +- The expression of the `AT LEAST` quantifier needs to evaluate to a number + before the search is performed. It can therefore not reference the document + emitted by `FOR doc IN viewName`, nor the `CURRENT` pseudo-variable. +- Using the question mark operator without quantifier and filter conditions + (`[?]`) is possible but cannot utilize indexes. +{{< /info >}} + +## Searching deeply nested data + +You can index and search for multiple levels of objects in arrays. +Consider the following document: + +```json +{ + "dimensions": [ + { + "part": "frame", + "measurements": [ + { "type": "height", "value": 47 }, + { "type": "width", "value": 72 } + ], + "comments": "Slightly damaged at the bottom right corner." + }, + { + "part": "canvas", + "measurements": [ + { "type": "height", "value": 35 }, + { "type": "width", "value": 60 } + ] + } + ] +} +``` + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +To index the array of dimension objects and the nested array of measurement +objects, you can use an inverted index and `search-view` View definition like +the following, using arangosh: + +```js +db.<collection>.ensureIndex({ + name: "inv-nest-deep", + type: "inverted", + fields: [ + { + name: "dimensions", + nested: [ + { + name: "measurements", + nested: [ + { name: "type" }, + { name: "value" } + ] + }, + "part", + { + name: "comments", + analyzer: "text_en" + } + ] + } + ] +}); + +db._createView("viewName", "search-alias", { indexes: [ + { collection: "<collection>", index: "inv-nest-deep" } +]}); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +To index the array of dimension objects and the nested array of measurement +objects, you can use an `arangosearch` View definition like the following: + +```json +{ + "links": { + "<collection>": { + "fields": { + "dimensions": { + "nested": { + "measurements": { + "nested": { + "type": {}, + "value": {} + } + }, + "part": {}, + "comments": { + "analyzers": [ + "text_en" + ] + } + } + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +The default `identity` Analyzer is used for the `type`, `value`, and `part` +attributes, and the built-in `text_en` is used for the `comments`. + +A possible query is to search for frames with damaged corners that are not wider +than 80, using a question mark operator to check the `part` and `comments`, and +a nested question mark operator to check the `type` and `value`: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions[? FILTER CURRENT.part == "frame" AND + ANALYZER(TOKENS("corner damage", "text_en") ALL == CURRENT.comments, "text_en") AND + CURRENT.measurements[? FILTER CURRENT.type == "width" AND CURRENT.value <= 80]] + RETURN doc +``` + +The conditions of the inner question mark operator need to be satisfied by a +single measurement object. The conditions of the outer question mark operator +need to be satisfied by a single dimension object, including the measurement +conditions of the inner operator. The example document does match these +conditions. diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/performance.md b/site/content/arangodb/oem/index-and-search/arangosearch/performance.md new file mode 100644 index 0000000000..f40d4834c7 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/performance.md @@ -0,0 +1,673 @@ +--- +title: Optimizing View and inverted index query performance +menuTitle: Performance +weight: 75 +description: >- + You can improve the performance of View and inverted index queries with a + primary sort order, stored values and other optimizations +--- +## Primary Sort Order + +Inverted indexes and `arangosearch` Views can have a primary sort order. +A direction can be specified upon their creation for each uniquely named +attribute (ascending or descending), to enable an optimization for AQL +queries which iterate over a collection or View and sort by one or multiple of the +indexed attributes. If the field(s) and the sorting direction(s) match, then the +data can be read directly from the index without actual sort operation. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +You can define a primary sort order when creating inverted indexes and utilize it +using inverted indexes standalone or via `search-alias` Views. + +Definition of an inverted index with a `primarySort` property: + +```js +db.coll.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["text", "date"], + primarySort: { + fields: [ + { field: "date", direction: "desc" } + ] + } +}); +``` + +AQL query example: + +```aql +FOR doc IN coll OPTIONS { indexHint: "inv-idx", forceIndexHint: true } + SORT doc.date DESC + RETURN doc +``` + +Execution plan **without** a sorted index being used: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 0 - FOR doc IN coll /* full collection scan */ + 3 CalculationNode 0 - LET #1 = doc.`date` /* attribute expression */ /* collections used: doc : coll */ + 4 SortNode 0 - SORT #1 DESC /* sorting strategy: standard */ + 5 ReturnNode 0 - RETURN doc +``` + +Execution plan with the primary sort order of the index being utilized: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 6 IndexNode 0 - FOR doc IN coll /* reverse inverted index scan, index scan + document lookup */ + 5 ReturnNode 0 - RETURN doc +``` + +You can add the inverted index to a `search-alias` View. Queries against the +View can benefit from the primary sort order, too: + +```js +db._createView("viewName", "search-alias", { indexes: [ + { collection: "coll", index: "inv-idx" } +] }); + +db._query(`FOR doc IN viewName + SORT doc.date DESC + RETURN doc`); +``` + +To define more than one attribute to sort by, use multiple sub-objects in the +`primarySort` array: + +```js +db.coll.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["text", "date"], + primarySort: { + fields: [ + { field: "date", direction: "desc" }, + { field: "text", direction: "asc" } + ] + } +}); +``` + +{{< info >}} +If you mix directions in the primary sort order, the inverted index cannot be +utilized for fully optimizing out a matching `SORT` operation if you use the +inverted index standalone. +{{< /info >}} + +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} + +{{< youtube id="bKeKzexInm0" >}} + +```json +{ + "links": { + "coll1": { + "fields": { + "text": {} + } + }, + "coll2": { + "fields": { + "text": {} + } + }, + "primarySort": [ + { + "field": "date", + "direction": "desc" + } + ] + } +} +``` + +You can only set the `primarySort` option and the related +`primarySortCompression` and `primarySortCache` options on View creation. + +AQL query example: + +```aql +FOR doc IN viewName + SORT doc.date DESC + RETURN doc +``` + +Execution plan **without** a sorted index being used: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateViewNode 1 - FOR doc IN viewName /* view query */ + 3 CalculationNode 1 - LET #1 = doc.`date` /* attribute expression */ + 4 SortNode 1 - SORT #1 DESC /* sorting strategy: standard */ + 5 ReturnNode 1 - RETURN doc +``` + +Execution plan with the primary sort order of the index being utilized: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateViewNode 1 - FOR doc IN viewName SORT doc.`date` DESC /* view query */ + 5 ReturnNode 1 - RETURN doc +``` + +To define more than one attribute to sort by, use multiple sub-objects in the +`primarySort` array: + +```json +{ + "links": { + "coll1": { + "fields": { + "text": {} + } + }, + "coll2": { + "fields": { + "text": {} + } + }, + "primarySort": [ + { + "field": "date", + "direction": "desc" + }, + { + "field": "text", + "direction": "asc" + } + ] + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +The optimization can be applied to queries which sort by both fields as +defined (`SORT doc.date DESC, doc.text`), but also if they sort in descending +order by the `date` attribute only (`SORT doc.date DESC`). Queries which sort +by `text` alone (`SORT doc.text`) are not eligible, because the index is sorted +by `date` first. This is similar to persistent indexes, but inverted sorting +directions are not covered by the View index +(e.g. `SORT doc.date, doc.text DESC`). + +You can disable the **primary sort compression** on View or index creation to +trade space for speed. The primary sort data is LZ4-compressed by default (`"lz4"`). + +- `arangosearch` Views: `primarySortCompression: "none"` +- Inverted indexes: `primarySort: { compression: "none" }` + +You can additionally enable the **primary sort cache** to always cache the primary +sort columns in memory, which can improve the query performance (Enterprise Edition only). + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +For inverted indexes, set the `cache` option of the +[`primarySort` property](../../develop/http-api/indexes/inverted.md) to `true`. + +```js +db.coll.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["text", "date"], + primarySort: { + fields: [ + { field: "date", direction: "desc" }, + { field: "text", direction: "asc" } + ], + cache: true + } +}); + +db._createView("myView", "search-alias", { indexes: [ + { collection: "coll", index: "inv-idx" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +Set the [`primarySortCache` View property](arangosearch-views-reference.md#view-properties) +to `true`. + +```json +{ + "links": { + "coll1": { + "fields": { + "text": {}, + "date": {} + } + }, + "coll2": { + "fields": { + "text": {} + } + }, + "primarySort": [ + { + "field": "date", + "direction": "desc" + }, + { + "field": "text", + "direction": "asc" + } + ], + "primarySortCache": true + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +## Stored Values + +It is possible to directly store the values of document attributes in +`arangosearch` View indexes and inverted indexes with the `storedValues` +property (not to be confused with `storeValues`). You can only set this +option on View and index creation. + +View indexes and inverted indexes may fully cover search queries by using +stored values, improving the query performance. +While late document materialization reduces the amount of fetched documents, +this optimization can avoid to access the storage engine entirely. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.articles.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["categories[*]"], + primarySort: { + fields: [ + { field: "publishedAt", direction: "desc" } + ] + }, + storedValues: [ + { + fields: [ "title", "categories" ] + } + ] +}); + +db._createView("articlesView", "search-alias", { indexes: [ + { collection: "articles", index: "inv-idx" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "articles": { + "fields": { + "categories": {} + } + } + }, + "primarySort": [ + { "field": "publishedAt", "direction": "desc" } + ], + "storedValues": [ + { "fields": [ "title", "categories" ] } + ] +} +``` +{{< /tab >}} + +{{< /tabs >}} + +In above View definitions, the document attribute `categories` is indexed for +searching, `publishedAt` is used as primary sort order, and `title` as well as +`categories` are stored in the index using the new `storedValues` property. + +```aql +FOR doc IN articlesView + SEARCH doc.categories == "recipes" + SORT doc.publishedAt DESC + RETURN { + title: doc.title, + date: doc.publishedAt, + tags: doc.categories + } +``` + +The query searches for articles which contain a certain tag in the `categories` +array and returns title, date and tags. All three values are stored in the View +(`publishedAt` via `primarySort` and the two other via `storedValues`), thus +no documents need to be fetched from the storage engine to answer the query. +This is shown in the execution plan as a comment to the `EnumerateViewNode`: +`/* view query without materialization */` + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateViewNode 1 - FOR doc IN articlesView SEARCH (doc.`categories` == "recipes") SORT doc.`publishedAt` DESC LET #1 = doc.`publishedAt` LET #7 = doc.`categories` LET #5 = doc.`title` /* view query without materialization */ + 5 CalculationNode 1 - LET #3 = { "title" : #5, "date" : #1, "tags" : #7 } /* simple expression */ + 6 ReturnNode 1 - RETURN #3 + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 move-calculations-up + 2 move-calculations-up-2 + 3 handle-arangosearch-views +``` + +The stored values data is LZ4-compressed by default (`"lz4"`). +Set it to `"none"` on View or index creation to trade space for speed. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.articles.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["categories[*]"], + primarySort: { + fields: [ + { field: "publishedAt", direction: "desc" } + ] + }, + storedValues: [ + { + fields: [ "title", "categories"], + compression: "none" + } + ] +}); + +db._createView("articlesView", "search-alias", { indexes: [ + { collection: "articles", index: "inv-idx" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "articles": { + "fields": { + "categories": {} + } + } + }, + "primarySort": [ + { "field": "publishedAt", "direction": "desc" } + ], + "storedValues": [ + { "fields": [ "title", "categories" ], "compression": "none" } + ] +} +``` +{{< /tab >}} + +{{< /tabs >}} + +You can additionally enable the ArangoSearch column cache for stored values by +setting the `cache` option in the `storedValues` definition of +`arangosearch` Views or inverted indexes to `true`. This always caches +stored values in memory, which can improve the query performance (Enterprise Edition only). + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.articles.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["categories[*]"], + primarySort: { + fields: [ + { field: "publishedAt", direction: "desc" } + ] + }, + storedValues: [ + { + fields: [ "title", "categories"], + cache: true + } + ] +}); + +db._createView("articlesView", "search-alias", { indexes: [ + { collection: "articles", index: "inv-idx" } +] }); +``` + +See the [inverted index `storedValues` property](../../develop/http-api/indexes/inverted.md) +for details. +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "articles": { + "fields": { + "categories": {} + } + } + }, + "primarySort": [ + { "field": "publishedAt", "direction": "desc" } + ], + "storedValues": [ + { "fields": [ "title", "categories" ], "cache": true } + ] +} +``` + +See the [`storedValues` View property](arangosearch-views-reference.md#view-properties) +for details. +{{< /tab >}} + +{{< /tabs >}} + +## Condition Optimization Options + +The `SEARCH` operation in AQL accepts an option `conditionOptimization` to +give you control over the search criteria optimization: + +```aql +FOR doc IN myView + SEARCH doc.val > 10 AND doc.val > 5 /* more conditions */ + OPTIONS { conditionOptimization: "none" } + RETURN doc +``` + +By default, all conditions get converted into disjunctive normal form (DNF). +Numerous optimizations can be applied, like removing redundant or overlapping +conditions (such as `doc.val > 10` which is included by `doc.val > 5`). +However, converting to DNF and optimizing the conditions can take quite some +time even for a low number of nested conditions which produce dozens of +conjunctions / disjunctions. It can be faster to just search the index without +optimizations. + +Also see the [`SEARCH` operation](../../aql/high-level-operations/search.md#search-options). + +## Count Approximation + +The `SEARCH` operation in AQL accepts an option `countApproximate` to control +how the total count of rows is calculated if the `fullCount` option is enabled +for a query or when a `COLLECT WITH COUNT` clause is executed. + +By default, rows are actually enumerated for a precise count. In some cases, an +estimate might be good enough, however. You can set `countApproximate` to +`"cost"` for a cost-based approximation. It does not enumerate rows and returns +an approximate result with O(1) complexity. It gives a precise result if the +`SEARCH` condition is empty or if it contains a single term query only +(e.g. `SEARCH doc.field == "value"`), the usual eventual consistency +of Views aside. + +```aql +FOR doc IN viewName + SEARCH doc.name == "Carol" + OPTIONS { countApproximate: "cost" } + COLLECT WITH COUNT INTO count + RETURN count +``` + +Also see [Faceted Search with ArangoSearch](faceted-search.md). + +## Field normalization value caching and caching of Geo Analyzer auxiliary data + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.9.5, v3.10.2</small> + +Normalization values are computed for fields which are processed with Analyzers +that have the [`"norm"` feature](../analyzers.md#analyzer-features) enabled. +These values are used to score fairer if the same tokens occur repeatedly, to +emphasize these documents less. + +You can set the `cache` option to `true` for individual View links or fields of +`arangosearch` Views, as well as for inverted indexes as the default or for +specific fields, to always cache the field normalization values in memory. +This can improve the performance of scoring and ranking queries. + +You can also enable this option to always cache auxiliary data used for querying +fields that are indexed with Geo Analyzers in memory, as the default or for +specific fields. This can improve the performance of geo-spatial queries. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.coll1.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: [ + { + name: "attr", + analyzer: "text_en", + cache: true + } + ] +}); + +db.coll2.ensureIndex({ + name: "inv-idx", + type: "inverted", + analyzer: "text_en", + fields: ["attr1", "attr2"], + cache: true +}); + +db._createView("myView", "search-alias", { indexes: [ + { collection: "coll1", index: "inv-idx" }, + { collection: "coll2", index: "inv-idx" } +] }); +``` + +See the [inverted index `cache` property](../../develop/http-api/indexes/inverted.md) for details. +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "coll1": { + "fields": { + "attr": { + "analyzers": ["text_en"], + "cache": true + } + } + }, + "coll2": { + "includeAllFields": true, + "analyzers": ["text_en"], + "cache": true + } + } +} +``` + +See the [`cache` Link property](arangosearch-views-reference.md#link-properties) +for details. +{{< /tab >}} + +{{< /tabs >}} + +The `"norm"` Analyzer feature has performance implications even if the cache is +used. You can create custom Analyzers without this feature to disable the +normalization and improve the performance. Make sure that the result ranking +still matches your expectations without normalization. It is recommended to +use normalization for a good scoring behavior. + +## Primary key caching + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +<small>Introduced in: v3.9.6, v3.10.2</small> + +You can always cache the primary key columns in memory. This can improve the +performance of queries that return many documents, making it faster to map +document IDs in the index to actual documents. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +To enable this feature for inverted indexes and by extension `search-alias` Views, +set the [`primaryKeyCache` property](../../develop/http-api/indexes/inverted.md) +to `true` when creating inverted indexes. + +```js +db.articles.ensureIndex({ + name: "inv-idx", + type: "inverted", + fields: ["categories[*]"], + primaryKeyCache: true +}); + +db._createView("articlesView", "search-alias", { indexes: [ + { collection: "articles", index: "inv-idx" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +To enable this feature for `arangosearch` Views, set the +[`primaryKeyCache` View property](arangosearch-views-reference.md#view-properties) +to `true` on View creation. + +```json +{ + "links": { + "articles": { + "fields": { + "categories": {} + } + } + }, + "primaryKeyCache": true +} +``` +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/phrase-and-proximity-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/phrase-and-proximity-search.md new file mode 100644 index 0000000000..9b894df506 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/phrase-and-proximity-search.md @@ -0,0 +1,165 @@ +--- +title: Phrase and Proximity Search with ArangoSearch +menuTitle: Phrase and proximity search +weight: 40 +description: >- + Search for phrases and nearby words in full-text +--- +With phrase search, you can query for tokens in a certain order. This allows +you to match partial or full sentences. You can also specify how many arbitrary +tokens may occur between defined tokens for word proximity searches. + +## Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +## View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-text", type: "inverted", fields: [ { name: "description", analyzer: "text_en" } ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-text" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "description": { + "analyzers": [ + "text_en" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +## Phrase Search + +### AQL queries + +Search for movies that have the (normalized and stemmed) tokens `biggest` and +`blockbust` in their description, in this order: + +```aql +FOR doc IN imdb + SEARCH PHRASE(doc.description, "BIGGEST Blockbuster", "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` + +| title | description | +|:------|:------------| +| Jurassic Park Series | … Steven Spielberg gives us on of the **biggest blockbusters** of the 1990’s | +| Scary Movie | … some of Hollywood's **biggest blockbusters**, … + +The search phrase can be handed in via a bind parameter, but it can also be +constructed dynamically using a subquery for instance: + +```aql +LET p = ( + FOR word IN TOKENS("tale of a woman", "text_en") + SORT RAND() + LIMIT 2 + RETURN word +) +FOR doc IN imdb + SEARCH PHRASE(doc.description, p, "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` + +You will get different results if you re-run this query multiple times. + +## Proximity Search + +The `PHRASE()` functions lets you specify tokens and the number of wildcard +tokens in an alternating order. You can use this to search for two words with +one arbitrary word in between the two words, for instance. + +### AQL queries + +Match movies that contain the phrase `epic <something> film` in their +description, where `<something>` can be exactly one arbitrary token: + +```aql +FOR doc IN imdb + SEARCH PHRASE(doc.description, "epic", 1, "film", "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` + +| title | description | +|:------|:------------| +| O thiasos | The Travelling Players is an **epic Greek film** from director Theo Angelopoulos … +| On Your Mark | … The video feels like a very compressed version of an **epic Miyazaki film**. … +| Double Decade | … It is with great pride that we present this **epic snowboarding film**. … +| The Apocalypse | In this **epic disaster film** of faith, a mother and father search for their only child … + +Analyzer pre-processing is applied automatically to `epic` and `film` based on +the Analyzer context or an optional last argument in the call to `PHRASE()`. + +The search phrase can also be dynamic. The following query looks up a +particular movie with the title `Family Business`, tokenizes the title and then +performs a proximity search for movies with the phrase +`family <something> business` or `family <something> <something> business` in +their description: + +```aql +LET title = FIRST(FOR doc IN imdb_vertices FILTER doc._key == "39967" RETURN doc.title) // Family Business +FOR doc IN imdb + SEARCH + PHRASE(doc.description, INTERLEAVE(TOKENS(title, "text_en"), [1]), "text_en") OR + PHRASE(doc.description, INTERLEAVE(TOKENS(title, "text_en"), [2]), "text_en") + RETURN { + title: doc.title, + description: doc.description + } +``` + +| title | description | +|:------|:------------| +| Spy Kids 2: The Island of Lost Dreams | … now joined the **family spy business** as … | +| Do Not Disturb | Combining a **family vacation with business**, … | + +## Combining Phrase Search with other Techniques + +Phrase search is not limited to finding full and exact tokens in a particular +order. It also lets you search for prefixes, strings with wildcards, etc. in +the specified order. See the _object tokens_ description of the +[`PHRASE()` function](../../aql/functions/arangosearch.md#phrase) for a full list +of options. + +### AQL queries + +Match movies where the title has a token that starts with `Härr` (normalized to +`harr`), followed by six arbitrary tokens and then a token that contains `eni`: + +```aql +FOR doc IN imdb + SEARCH PHRASE(doc.title, {STARTS_WITH: TOKENS("Härr", "text_en")[0]}, 6, {WILDCARD: "%eni%"}, "text_en") + RETURN doc.title +``` + +| Result | +|:-------| +| **Harr**y Potter and the Order of the Pho**eni**x | + +The search terms used in object tokens need to be pre-processed manually as +shown above with `STARTS_WITH`. diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/prefix-matching.md b/site/content/arangodb/oem/index-and-search/arangosearch/prefix-matching.md new file mode 100644 index 0000000000..076b8c04ad --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/prefix-matching.md @@ -0,0 +1,453 @@ +--- +title: Prefix Search with ArangoSearch +menuTitle: Prefix matching +weight: 20 +description: >- + Search for strings or tokens that start with one or more substrings +--- +A typical use case for matching prefixes is to provide word completion +(auto-complete). If the requirement is to find exact prefix matches only then +indexing strings with the `identity` Analyzer is sufficient. The search term +needs to have the original capitalization to match (case-sensitive) in that +case. + +Prefix matching can be used together with normalizing Analyzers (`norm`, `text`) +for case-insensitive and accent-insensitive searches. This is often preferable +over exact prefix matching in auto-complete scenarios, because users may type +everything in lower case and not use characters with diacritical marks but just +the base characters. + +The fastest option for prefix matching is to use edge _n_-grams, a feature +supported by `text` Analyzers. They make it possible for Views and inverted indexes +to simply look up prefixes in the index. The downsides are that the minimum +and maximum _n_-gram length needs to be defined upfront and only prefixes in +this range will be found, and that edge _n_-grams can take up more space. + +## Exact Prefix Matching + +In its basic form without case normalization and accent removal, prefix +matching can be done if a field is indexed with just the `identity` Analyzer. +It creates the necessary index data to perform prefix queries with +`STARTS_WITH()` but also wildcard queries with `LIKE()`. + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact", type: "inverted", fields: [ "title" ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-exact" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "title": { + "analyzers": [ + "identity" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match all movie titles that start with `"The Matri"` (case-sensitive): + +```aql +FOR doc IN imdb + SEARCH STARTS_WITH(doc.title, "The Matr") + RETURN doc.title +``` + +| Result | +|:-------| +| **The Matr**ix | +| **The Matr**ix Reloaded | +| **The Matr**ix Revolutions | +| **The Matr**ix Trilogy | +| **The Matr**ix Revisited | + +Match movie titles that start with either `"The Matr"` or `"Harry Pot"` +using `OR`: + +```aql +FOR doc IN imdb + SEARCH STARTS_WITH(doc.title, "The Matr") OR STARTS_WITH(doc.title, "Harry Pot") + RETURN doc.title +``` + +| Result | +|:-------| +| **The Matr**ix Revisited | +| **The Matr**ix | +| **The Matr**ix Reloaded | +| **The Matr**ix Revolutions | +| **Harry Pot**ter and the Sorcerer's Stone | +| **Harry Pot**ter and the Chamber Of Secrets | +| **Harry Pot**ter and the Prisoner of Azkaban | +| **Harry Pot**ter and the Goblet Of Fire | +| **Harry Pot**ter and the Order of the Phoenix | +| **Harry Pot**ter and the Half-Blood Prince | +| **Harry Pot**ter Collection | +| **The Matr**ix Trilogy | +| **Harry Pot**ter and the Deathly Hallows: Part I | +| **Harry Pot**ter and the Deathly Hallows: Part II | + +Match movie titles that start with either `"The Matr"` or `"Harry Pot"` +utilizing the feature of the `STARTS_WITH()` function that allows you to pass +multiple possible prefixes as array of strings, of which one must match: + +```aql +FOR doc IN imdb + SEARCH STARTS_WITH(doc.title, ["The Matr", "Harry Pot"]) + RETURN doc.title +``` + +| Result | +|:-------| +| **The Matr**ix Revisited | +| **The Matr**ix | +| **The Matr**ix Reloaded | +| **The Matr**ix Revolutions | +| **Harry Pot**ter and the Sorcerer's Stone | +| **Harry Pot**ter and the Chamber Of Secrets | +| **Harry Pot**ter and the Prisoner of Azkaban | +| **Harry Pot**ter and the Goblet Of Fire | +| **Harry Pot**ter and the Order of the Phoenix | +| **Harry Pot**ter and the Half-Blood Prince | +| **Harry Pot**ter Collection | +| **The Matr**ix Trilogy | +| **Harry Pot**ter and the Deathly Hallows: Part I | +| **Harry Pot**ter and the Deathly Hallows: Part II | + +## Match Multiple Token Prefixes + +It is possible to match strings if one out of multiple prefix conditions +is fulfilled with a single call to `STARTS_WITH()`, as it supports an array of +prefixes. The `STARTS_WITH()` function also accepts an optional third argument +to define how many of the given prefixes must match. This is handy if the input +is full-text tokenized by a `text` Analyzer or an array of strings, where +conditions for different tokens can be fulfilled. + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-text", type: "inverted", fields: [ { name: "title", analyzer: "text_en" } ] }); +db._createView("imdb_alias", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-text" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "title": { + "analyzers": [ + "text_en" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match movie titles that contain three out of five prefixes. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH STARTS_WITH(doc.title, TOKENS("Sec Cham Har Pot Phoe", "text_en"), 3) + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(STARTS_WITH(doc.title, TOKENS("Sec Cham Har Pot Phoe", "text_en"), 3), "text_en") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| **Har**ry **Pot**ter and the **Cham**ber Of **Sec**rets | +| **Har**ry **Pot**ter and the Order of the **Phoe**nix | + +You can calculate the number of prefixes that need to match dynamically, for +example to require that all prefixes must match. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +LET prefixes = TOKENS("Brot Blu", "text_en") +FOR doc IN imdb_alias + SEARCH STARTS_WITH(doc.title, prefixes, LENGTH(prefixes)) + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +LET prefixes = TOKENS("Brot Blu", "text_en") +FOR doc IN imdb + SEARCH ANALYZER(STARTS_WITH(doc.title, prefixes, LENGTH(prefixes)), "text_en") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| The **Blu**es **Brot**hers | +| **Blu**es **Brot**hers 2000 | + +## Edge N-Grams + +Edge _n_-grams is a feature of the `text` Analyzer type. It generates _n_-grams +for each token (usually a word), but anchored to the beginning of the token. +It thus creates prefix _n_-grams only and not all _n_-grams for the input. + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### Custom Analyzer + +Create a `text` Analyzer in arangosh to normalize case to all lowercase, remove +diacritics, with no stemming, with edge _n_-grams of size 3 to 6 for example and +including the original string as well: + +```js +//db._useDatabase("your_database"); // Analyzer will be created in current database +var analyzers = require("@arangodb/analyzers"); +analyzers.save("edge_ngram", "text", { locale: "en", accent: false, case: "lower", stemming: false, edgeNgram: { min: 3, max: 6, preserveOriginal: true } }, []); +``` + +No [Analyzer features](../analyzers.md#analyzer-features) are set because the +examples on this page don't require them. + +Test the Analyzer: + +```js +db._query(`RETURN TOKENS("Ocean Equilibrium", "edge_ngram")`); +``` + +```json +[ + [ + "oce", + "ocea", + "ocean", + "equ", + "equi", + "equil", + "equili", + "equilibrium" + ] +] +``` + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-ngram", type: "inverted", fields: [ { name: "title", analyzer: "edge_ngram" } ] }); +db._createView("imdb_alias", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-ngram" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "title": { + "analyzers": [ + "edge_ngram" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match movie titles that have a word starting with `"ocea"` + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.title == "ocea" + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.title == "ocea", "edge_ngram") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| **Ocea**n Voyagers | +| **Ocea**n's Eleven | +| **Ocea**n's Twelve | +| **Ocea**n's Thirteen | +| **Ocea**n's Eleven | +| **Ocea**n's Collection | + +Note that the search term must be normalized in order to match something. +You can create a `text` Analyzer that matches the configuration of the +edge _n_-gram `text` Analyzer to pre-process the search terms in the same way, +but without creating any _n_-grams: + +```js +//db._useDatabase("your_database"); // Analyzer will be created in current database +var analyzers = require("@arangodb/analyzers"); +analyzers.save("match_edge_ngram", "text", { locale: "en", accent: false, case: "lower", stemming: false }, []); +``` + +No [Analyzer features](../analyzers.md#analyzer-features) are set because the +examples on this page don't require them. + +Now we can also match movie titles that start with `"Oceä"` +(normalized to `"ocea"`): + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.title == TOKENS("Oceä", "match_edge_ngram")[0] + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.title == TOKENS("Oceä", "match_edge_ngram")[0], "edge_ngram") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| **Ocea**n Voyagers | +| **Ocea**n's Eleven | +| **Ocea**n's Twelve | +| **Ocea**n's Thirteen | +| **Ocea**n's Eleven | +| **Ocea**n's Collection | + +What we cannot match search terms that are longer than the maximum edge _n_-gram +size (or shorter than the minimum edge _n_-gram size), except for full tokens +if `preserveOriginal` is enabled. For example, this query does not match +anything because the longest indexed edge _n_-gram is `"equili"` but the search +term is nine characters long: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.title == TOKENS("Equilibri", "match_edge_ngram")[0] + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.title == TOKENS("Equilibri", "match_edge_ngram")[0], "edge_ngram") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +Searching for `"Equilibrium"` does match because the full token `"equilibrium"` +is indexed by our custom Analyzer thanks to `preserveOriginal`. We can take +advantage of the full token being indexed with the `STARTS_WITH()` function: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH STARTS_WITH(doc.title, TOKENS("Equilibri", "match_edge_ngram")) + RETURN doc.title +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(STARTS_WITH(doc.title, TOKENS("Equilibri", "match_edge_ngram")), "edge_ngram") + RETURN doc.title +``` +{{< /tab >}} + +{{< /tabs >}} + +| Result | +|:-------| +| Equilibrium | + +Note however, that this will not be as fast as matching an edge _n_-gram +directly. diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/range-queries.md b/site/content/arangodb/oem/index-and-search/arangosearch/range-queries.md new file mode 100644 index 0000000000..7646f9e70c --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/range-queries.md @@ -0,0 +1,303 @@ +--- +title: Range Queries with ArangoSearch +menuTitle: Range Queries +weight: 15 +description: >- + Match values that are above, below or between a minimum and a maximum value +--- +The primary use case for range queries is to search **numeric** values in +documents that are +- greater than (exclusive), +- greater than or equal (inclusive), +- less than (exclusive), +- less than or equal (inclusive) to a reference number, or +- between two numbers (inclusive or exclusive) + +Range queries are also possible for string values. + +## Comparing to a Number + +Numbers are not processed by Analyzers. They even bypass the `identity` +Analyzer. Therefore, you do not need to specify Analyzers in View definitions +and no Analyzer context in queries with the `ANALYZER()` function for numeric +fields. + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact-runtime", type: "inverted", fields: [ "runtime" ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-exact-runtime" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "runtime": { } + } + } + } +} +``` + +You can add a field with an empty object `{}` as shown above, or explicitly set +no Analyzer using an empty array `[]` as shown below. + +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "runtime": { + "analyzers": [ ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match movies with a runtime of exactly `5` minutes: + +```aql +FOR doc IN imdb + SEARCH doc.runtime == 5 + RETURN { + title: doc.title, + runtime: doc.runtime + } +``` + +| title | runtime | +|:------|:--------| +| The Spirit of Christmas | 5 | +| Super Rhino | 5 | +| Gone Nutty | 5 | +| She and Her Cat | 5 | +| … | … | + +Note that no Analyzer context is set as numeric values are not processed by +Analyzers at all. + +Match movies with a runtime of `12`, `24` or `77` minutes: + +```aql +FOR doc IN imdb + SEARCH doc.runtime IN [12, 24, 77] + RETURN { + title: doc.title, + runtime: doc.runtime + } +``` + +| title | runtime | +|:------|:--------| +| Frankenstein Punk | 12 | +| The Vagabond | 24 | +| The Rescuers Down Under | 77 | +| The Olsen Gang | 77 | + +Match movies with a runtime over `300` minutes and sort them from longest to +shortest runtime: + +```aql +FOR doc IN imdb + SEARCH doc.runtime > 300 + SORT doc.runtime DESC + RETURN { + title: doc.title, + runtime: doc.runtime + } +``` + +| title | runtime | +|:------|:--------| +| Planet of the Apes Series | 605 | +| North and South | 561 | +| Into the West | 552 | +| … | … | +| The Manns - Novel of a Century | 312 | +| Legenda o Tile | 311 | +| Nárcisz és Psyché | 302 | + +Any of the following comparison operators can be used: `>`, `>=`, `<`, `<=`, +`==`, `!=`, `IN`, `NOT IN`. + +## Comparing to a Numeric Range + +While you can combine a greater than (or equal) and a less than (or equal) +condition with a logical `AND`, it is more efficient to perform such range +queries using a single condition. You can use the range operator `..` to query +for an inclusive range of values. You can also use the +[`IN_RANGE()` function](../../aql/functions/arangosearch.md#in_range) that allows +you to specify individually whether the minimum and maximum value shall be +included or excluded in the range. + +### AQL queries + +Match movies with a runtime of `4` to `6` minutes with the range operator: + +```aql +FOR doc IN imdb + SEARCH doc.runtime IN 4..6 + RETURN { + title: doc.title, + runtime: doc.runtime + } +``` + +| title | runtime | +|:------|:--------| +| Katedra | 6 | +| The Spirit of Christmas | 4 | +| The Spirit of Christmas | 5 | +| Hell's Bells | 6 | +| … | … | + +While the dataset only has whole numbers, this query would also find decimal +fractions within the defined range, e.g. `5.5`. This is different to how +`FILTER doc.runtime IN 4..6` works, which defines an integer range and only +matches `4`, `5` and `6`. + +Match movies with a runtime of `4` to `6` minutes with the `IN_RANGE()` +function (inclusive on both ends): + +```aql +FOR doc IN imdb + SEARCH IN_RANGE(doc.runtime, 4, 6, true, true) + RETURN { + title: doc.title, + runtime: doc.runtime + } +``` + +| title | runtime | +|:------|:--------| +| Katedra | 6 | +| The Spirit of Christmas | 4 | +| The Spirit of Christmas | 5 | +| Hell's Bells | 6 | +| … | … | + +The standard comparison operators are still necessary for other kinds of range +queries, such as for searching for values below and above a range. It is +possible to express this with `IN_RANGE()` and a negation (`NOT`), but it is +less efficient than using two comparisons and the negation makes it include +documents that do not have a runtime attribute (implicitly `null`). + +Match movies with a runtime of `5` minutes or less, as well as `500` minutes +or more, but not with a runtime of `0` minutes. Sort the matches by runtime in +ascending order: + +```aql +FOR doc IN imdb + SEARCH (doc.runtime <= 5 OR doc.runtime >= 500) AND doc.runtime != 0 + SORT doc.runtime + RETURN { + title: doc.title, + runtime: doc.runtime + } +``` + +| title | runtime | +|:------|:--------| +| La Sortie des usines Lumière | 1 | +| L'Arrivée d'un train à la Ciotat | 1 | +| … | … | +| Zippeldy & Fetterig | 5 | +| Coda | 5 | +| WWE: Greatest Wrestling Stars of the '90s | 540 | +| Shogun | 547 | +| Into the West | 552 | +| North and South | 561 | +| Planet of the Apes Series | 605 | + +The search expression could alternative be written in the following ways +with the same result: + +- `doc.runtime > 0 AND doc.runtime <= 5 OR doc.runtime >= 500` +- `IN_RANGE(doc.runtime, 0, 5, false, true) OR doc.runtime >= 500` +- `NOT(IN_RANGE(doc.runtime, 5, 500, false, false)) AND doc.runtime > 0` + +## Comparing Strings + +Comparison operators and the `IN_RANGE()` function can also be used with +strings. Beware that the results can be unexpected in some cases, because the +internal sort order of ArangoSearch is different to how `FILTER`, `SORT` and +other operations work. + +{{< warning >}} +The alphabetical order of characters is not taken into account by ArangoSearch, +i.e. range queries in SEARCH operations against Views will not follow the +language rules as per the defined Analyzer locale (except for the +[`collation` Analyzer](../analyzers.md#collation)) nor the server language +(startup option `--default-language`)! +Also see [Known Issues](../../release-notes/version-3.11/known-issues-in-3-11.md#arangosearch). +{{< /warning >}} + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact-name", type: "inverted", fields: [ "name" ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-exact-name" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "name": { + "analyzers": [ "identity" ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match movies where the name is `>= Wu` and `< Y`: + +```aql +FOR doc IN imdb + SEARCH IN_RANGE(doc.name, "Wu", "Y", true, false) + RETURN doc.name +``` + +| Result | +|:-------| +| … | +| Wu Zun | +| Xiong Xin-Xin | +| Wyatt | +| Xander Berkeley | +| Xzibit | +| Xian Gao | +| Wylie Watson | +| Wyclef Jean | +| … | diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/ranking.md b/site/content/arangodb/oem/index-and-search/arangosearch/ranking.md new file mode 100644 index 0000000000..e73a662d01 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/ranking.md @@ -0,0 +1,602 @@ +--- +title: Ranking View Query Results +menuTitle: Ranking +weight: 70 +description: >- + You can query Views and return the most relevant results first based on their ranking score +--- +ArangoSearch supports the two most popular ranking schemes: + +- [Okapi BM25](https://en.wikipedia.org/wiki/Okapi_BM25) +- [TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) + +Under the hood, both models rely on two main components: + +- **Term frequency** (TF): + in the simplest case defined as the number of times a term occurs in a document +- **Inverse document frequency** (IDF): + a measure of how relevant a term is, i.e. whether the word is common or rare + across all documents + +See _Ranking in ArangoSearch_ in the +[ArangoSearch Tutorial](https://www.arangodb.com/learn/search/tutorial/#:~:text=Ranking%20in%20ArangoSearch) +to learn more about the ranking model. + +## Basic Ranking + +To sort View results from most relevant to least relevant, use a +[SORT operation](../../aql/high-level-operations/sort.md) with a call to a +[Scoring function](../../aql/functions/arangosearch.md#scoring-functions) as +expression and set the order to descending. Scoring functions expect the +document emitted by a `FOR … IN` loop that iterates over a View as first +argument. + +```aql +FOR doc IN viewName + SEARCH … + SORT BM25(doc) DESC + RETURN doc +``` + +You can also return the ranking score as part of the result. + +```aql +FOR doc IN viewName + SEARCH … + RETURN MERGE(doc, { bm25: BM25(doc), tfidf: TFIDF(doc) }) +``` + +Scoring functions cannot be used outside of `SEARCH` operations, as the scores +can only be computed in the context of a View, especially because of the +inverse document frequency (IDF). + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ + name: "inv-text", + type: "inverted", + fields: [ + { name: "description", analyzer: "text_en" } + ] +}); + +db._createView("imdb_alias", "search-alias", { indexes: [ + { collection: "imdb_vertices", index: "inv-text" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "description": { + "analyzers": [ + "text_en" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Search for movies with certain keywords in their description and rank the +results using the [`BM25()` function](../../aql/functions/arangosearch.md#bm25): + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("amazing action world alien sci-fi science documental galaxy", "text_en") + SORT BM25(doc) DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score: BM25(doc) + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("amazing action world alien sci-fi science documental galaxy", "text_en"), "text_en") + SORT BM25(doc) DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score: BM25(doc) + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | score | +|:------|:------------|:------| +| AVPR: Aliens vs. Predator - Requiem | Prepare for more mayhem as warring **aliens** and predators return … spectacular **action** sequences … | 35.85710525512695 | +| Moon 44 | … battle a familiar foe and an **alien** enemy. … **sci-fi** thriller from **action** director Roland Emmerich … | 35.85523223876953 | +| Dark Star | A low-budget, **sci-fi** satire … battle their **alien** mascot … | 28.655567169189453 | +| Starship Troopers 2: Hero of the Federation | In the sequel to Paul Verhoeven's loved/reviled **sci-fi** film … fighting **alien** bugs… | 28.635963439941406 | +| Push | The **action** packed **sci-fi** thriller involves a group of young American ex-pats… | 28.131816864013672 | +| Casshern | Live-action sci-fi movie based on a 1973 Japanese animé of the same name. | 28.070863723754883 | +| Puzzlehead | In a post apocalyptic **world** where technology is outlawed, … The resulting **Sci-Fi** love triangle is a Frankensteinian fable … | 25.57171630859375 | +| Cesta do pravěku | Most classical **sci-fi** from K. Zeman. … a wondrous prehistoric **world** … | 25.57117462158203 | +| Interstella 5555: The 5tory of the 5ecret 5tar 5ystem | A **sci-fi** japanimation House-musical movie … themes of **sci-fi** celebrity … | 22.481136322021484 | +| Alien Planet | The dynamic meeting of solid **science** … **Alien** Planet creates a realistic depiction of creatures on another **world**, … | 21.493724822998047 | + +Do the same but with the [`TFIDF()` function](../../aql/functions/arangosearch.md#tfidf): + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("amazing action world alien sci-fi science documental galaxy", "text_en") + SORT TFIDF(doc) DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score: TFIDF(doc) + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("amazing action world alien sci-fi science documental galaxy", "text_en"), "text_en") + SORT TFIDF(doc) DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score: TFIDF(doc) + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | score | +|:------|:------------|:------| +| AVPR: Aliens vs. Predator - Requiem | Prepare for more mayhem as warring **aliens** and predators return … spectacular **action** sequences … | 25.193025588989258 | +| Moon 44 | … battle a familiar foe and an **alien** enemy. … **sci-fi** thriller from **action** director Roland Emmerich … | 25.193025588989258 | +| Interstella 5555: The 5tory of the 5ecret 5tar 5ystem | A **sci-fi** japanimation House-musical movie … themes of **sci-fi** celebrity … | 20.324928283691406 | +| Dark Star | A low-budget, **sci-fi** satire … battle their **alien** mascot … | 19.935544967651367 | +| Starship Troopers 2: Hero of the Federation | In the sequel to Paul Verhoeven's loved/reviled **sci-fi** film … fighting **alien** bugs… | 19.935544967651367 | +| Casshern | Live-action sci-fi movie based on a 1973 Japanese animé of the same name. | 19.629377365112305 | +| Push | The **action** packed **sci-fi** thriller involves a group of young American ex-pats… | 19.629377365112305 | +| Puzzlehead | In a post apocalyptic **world** where technology is outlawed, … The resulting **Sci-Fi** love triangle is a Frankensteinian fable … | 18.10955047607422 | +| Cesta do pravěku | Most classical **sci-fi** from K. Zeman. … a wondrous prehistoric **world** … | 18.10955047607422 | +| The Day the Earth Stood Still | An **alien** and a robot land on earth after **World** War II … A classic **science** fiction film … | 15.719740867614746 + +## Stable pagination for results + +The `SORT` operation does not guarantee a stable sort if there is no unique value +to sort by. This leads to an undefined order when sorting equal documents. + +If you run a query multiple times with varying `LIMIT` offsets for pagination, +you can miss results or get duplicate results if the sort order is undefined. +To achieve stable pagination, you must meet the following requirements: + +- The dataset should not change between query runs. +- The `SORT` operation must have at least one field with a unique value to sort by. + +When stable sort is required, you can use a tiebreaker field. If the application +has a preferred field that indicates the order of documents with the same score, +then this field should be used in the `SORT` operation as a tiebreaker. If there +is no such field, you can use the `_id` system attribute as it is unique and +present in every document. + +```aql +// sort by score and break ties using the unique document identifiers +SORT BM25(doc) DESC, doc._id +``` + +**Example** + +You can use the [IMDB movie dataset](example-datasets.md#imdb-movie-dataset) +and create a [View](full-text-token-search.md#view-definition) for +the `imdb_vertices` collection and call it `imdb`. Index the `description` +attribute with the built-in `text-en` Analyzer. Then, you can run the following +query to find movies that contain the token `ninja` in the description, sorted +by best matching according to the Okapi BM25 scoring scheme: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("ninja", "text_en") + LET score = BM25(doc) + SORT score DESC + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("ninja", "text_en"), "text_en") + LET score = BM25(doc) + SORT score DESC + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< /tabs >}} + +Note the 5th and 6th result, which both have the same score of `6.30634880065918`: + +| title | score | +|:------|:------| +| Red Shadow: Akakage | 8.882122039794922 | +| Beverly Hills Ninja | 7.128915786743164 | +| Naruto the Movie: Ninja Clash in the Land of Snow | 7.041049957275391 | +| TMNT | 7.002012729644775 | +| Teenage Mutant Ninja Turtles II: The Secret of the Ooze | **6.30634880065918** | +| Batman Begins | **6.30634880065918** | +| ... | ... | + +If you add a `LIMIT` operation for pagination and fetch the first 5 results, +you may get the **Batman movie** as the 5th result: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("ninja", "text_en") + LET score = BM25(doc) + SORT score DESC + LIMIT 0, 5 + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("ninja", "text_en"), "text_en") + LET score = BM25(doc) + SORT score DESC + LIMIT 0, 5 + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | score | +|:------|:------| +| Red Shadow: Akakage | 8.882122039794922 | +| Beverly Hills Ninja | 7.128915786743164 | +| Naruto the Movie: Ninja Clash in the Land of Snow | 7.041049957275391 | +| TMNT | 7.002012729644775 | +| **Batman Begins** | 6.30634880065918 | + +If you change the query to `LIMIT 5, 5` to get the second batch of results, then +you may see the **Batman movie again** (as the 6th result overall) instead of +the **Ninja Turtles movie**: + +| title | score | +|:------|:------| +| **Batman Begins** | 6.30634880065918 | +| Shogun Assassin | 5.8539886474609375 | +| Scooby-Doo and the Samurai Sword | 5.736422538757324 | +| Revenge of the Ninja | 5.212964057922363 | +| Winners & Sinners 2: My Lucky Stars | 5.165824890136719 | + +The problem is the undefined order of results with the same score. There is no +guarantee whether the Batman or the Ninja Turtle movie comes first, and as a +result, both batches may include the same movie and miss the other entirely. +As the order is undefined, you can randomly encounter this problem, even if it +seems to work at first, because it may work some of the time. + +To establish a stable order, you change the query to `SORT score DESC, doc._id`. +This still ranks movies by the score, but matches with the same score are +consistently sorted by the document identifier to break ties. This guarantees +that either the Batman or the Ninja Turtles movie is included in the first batch +and the other movie in the second batch. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("ninja", "text_en") + LET score = BM25(doc) + SORT score DESC, doc._id + LIMIT 0, 5 // first batch + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("ninja", "text_en"), "text_en") + LET score = BM25(doc) + SORT score DESC, doc._id + LIMIT 0, 5 // first batch + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | score | +|:------|:------| +| Red Shadow: Akakage | 8.882122039794922 | +| Beverly Hills Ninja | 7.128915786743164 | +| Naruto the Movie: Ninja Clash in the Land of Snow | 7.041049957275391 | +| TMNT | 7.002012729644775 | +| **Teenage Mutant Ninja Turtles II: The Secret of the Ooze** | 6.30634880065918 | + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("ninja", "text_en") + LET score = BM25(doc) + SORT score DESC, doc._id + LIMIT 5, 5 // second batch + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("ninja", "text_en"), "text_en") + LET score = BM25(doc) + SORT score DESC, doc._id + LIMIT 5, 5 // second batch + RETURN { title: doc.title, score } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | score | +|:------|:------| +| **Batman Begins** | 6.30634880065918 | +| Shogun Assassin | 5.8539886474609375 | +| Scooby-Doo and the Samurai Sword | 5.736422538757324 | +| Revenge of the Ninja | 5.212964057922363 | +| Winners & Sinners 2: My Lucky Stars | 5.165824890136719 | + +## Query Time Relevance Tuning + +You can fine-tune the scores computed by the Okapi BM25 and TF-IDF relevance +models at query time via the `BOOST()` AQL function and also calculate a custom +score. In addition, the `BM25()` function lets you adjust the coefficients at +query time. + +The `BOOST()` function is similar to the `ANALYZER()` function in that it +accepts any valid `SEARCH` expression as first argument. You can set the boost +factor for that sub-expression via the second parameter. Documents that match +boosted parts of the search expression will get higher scores. + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ + name: "inv-text", + type: "inverted", + fields: [ + { name: "description", analyzer: "text_en" } + ] +}); + +db._createView("imdb_alias", "search-alias", { indexes: [ + { collection: "imdb_vertices", index: "inv-text" } +] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "description": { + "analyzers": [ + "text_en" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Prefer `galaxy` over the other keywords: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("amazing action world alien sci-fi science documental", "text_en") + OR BOOST(doc.description IN TOKENS("galaxy", "text_en"), 5) + SORT BM25(doc) DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score: BM25(doc) + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("amazing action world alien sci-fi science documental", "text_en") + OR BOOST(doc.description IN TOKENS("galaxy", "text_en"), 5), "text_en") + SORT BM25(doc) DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score: BM25(doc) + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | score | +|:------|:------------|:------| +| Star Trek Collection | Star Trek a futuristic **science** fiction franchise. … **galaxies** to explore, and cool skin tight suits to beam up in … | 64.87849426269531 | +| Alien Tracker | In a **galaxy** far away, **alien** criminals organize a spectacular prison break. … Cole is the **Alien** Tracker … | 63.959991455078125 | +| Stitch! The Movie | … the **galaxy's** most wanted extraterrestrial … Dr. Jumba brought one of his **alien** "experiments" to Hawaii. | 63.39030075073242 | +| The Hitchhiker's Guide to the Galaxy | Mere seconds before the Earth is to be demolished by an **alien** construction crew … a new edition of "The Hitchhiker's Guide to the **Galaxy**." | 63.37282943725586 | +| Stargate: The Ark of Truth | … it may be in the Ori's own home **galaxy**. … SG-1 travels to the Ori **galaxy** … in a distant **galaxy** fighting two powerful enemies. | 61.784141540527344 | +| The Ice Pirates | … the most precious commodity in the **galaxy** is water. … unreachable centre of the **galaxy** … The **galaxy** is ruled by an evil emperor … | 61.78216552734375 | +| Star Wars: Episode III: Revenge of the Sith | … leading a massive clone army into a **galaxy**-wide battle against the Separatists. … to rule the **galaxy**, the Republic crumbles … | 59.79429244995117 | +| Star Wars: Episode II - Attack of the Clones | … not only has the **galaxy** undergone significant change, but so have Obi-Wan Kenobi, Padmé Amidala, and Anakin Skywalker … | 55.723636627197266 | +| Macross Plus | … a new aircraft (Shinsei Industries' YF-19 & General **Galaxy's** YF-21) for Project Super Nova, to choose the newest successor to the VF-11 | 55.722259521484375 | +| Star Trek | The fate of the **galaxy** rests in the hands of bitter rivals. One, James Kirk, is a delinquent, thrill-seeking Iowa farm boy. The other, Spock, a Vulcan, … | 55.717037200927734 | + +If you are an information retrieval expert and want to fine-tuning the +weighting schemes at query time, then you can do so. The `BM25()` function +accepts free coefficients as parameters to turn it into BM15 for instance: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH doc.description IN TOKENS("amazing action world alien sci-fi science documental", "text_en") + OR BOOST(doc.description IN TOKENS("galaxy", "text_en"), 5) + LET score = BM25(doc, 1.2, 0) + SORT score DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH ANALYZER(doc.description IN TOKENS("amazing action world alien sci-fi science documental", "text_en") + OR BOOST(doc.description IN TOKENS("galaxy", "text_en"), 5), "text_en") + LET score = BM25(doc, 1.2, 0) + SORT score DESC + LIMIT 10 + RETURN { + title: doc.title, + description: doc.description, + score + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | description | score | +|:------|:------------|:------| +| Stargate: The Ark of Truth | … it may be in the Ori's own home **galaxy**. … SG-1 travels to the Ori **galaxy** … in a distant **galaxy** fighting two powerful enemies. | 42.88237380981445 | +| The Ice Pirates | … the most precious commodity in the **galaxy** is water. … unreachable centre of the **galaxy** … The **galaxy** is ruled by an evil emperor … | 42.88237380981445 | +| Star Wars: Episode III: Revenge of the Sith | … leading a massive clone army into a **galaxy**-wide battle against the Separatists. … to rule the **galaxy**, the Republic crumbles … | 39.27024841308594 | +| Alien Tracker | In a **galaxy** far away, **alien** criminals organize a spectacular prison break. … Cole is the **Alien** Tracker … | 38.43224334716797 | +| Star Trek Collection | Star Trek a futuristic **science** fiction franchise. … **galaxies** to explore, and cool skin tight suits to beam up in … | 38.42367935180664 | +| Stitch! The Movie | … the **galaxy's** most wanted extraterrestrial … Dr. Jumba brought one of his **alien** "experiments" to Hawaii. | 37.563819885253906 | +| The Hitchhiker's Guide to the Galaxy | Mere seconds before the Earth is to be demolished by an **alien** construction crew … a new edition of "The Hitchhiker's Guide to the **Galaxy**." | 37.563819885253906 | +| Critters 4 | … he gets a message that it would be illegal to extinguish the race from the **galaxy**. … | 32.99643325805664 +| Alien Agent | A lawman from another **galaxy** must stop an invading force from building a gateway to planet Earth. | 32.99643325805664 +| Star Trek | The fate of the **galaxy** rests in the hands of bitter rivals. One, James Kirk, is a delinquent, thrill-seeking Iowa farm boy. The other, Spock, a Vulcan, … | 32.99643325805664 | + +You can also calculate a custom score, taking into account additional fields +of the document. + +Match movies with the (normalized) phrase `star war` in the title and calculate +a custom score based on BM25 and the movie runtime to favor longer movies: + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```aql +FOR doc IN imdb_alias + SEARCH PHRASE(doc.title, "Star Wars", "text_en") + LET score = BM25(doc) * LOG(doc.runtime + 1) + SORT score DESC + RETURN { + title: doc.title, + runtime: doc.runtime, + bm25: BM25(doc), + score + } +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```aql +FOR doc IN imdb + SEARCH PHRASE(doc.title, "Star Wars", "text_en") + LET score = BM25(doc) * LOG(doc.runtime + 1) + SORT score DESC + RETURN { + title: doc.title, + runtime: doc.runtime, + bm25: BM25(doc), + score + } +``` +{{< /tab >}} + +{{< /tabs >}} + +| title | runtime | bm25 | score | +|:------|:--------|:-----|:------| +| **Star Wars**: Episode II - Attack of the Clones | 142 | 16.900253295898438 | 83.87333131958185 | +| **Star Wars**: Episode III: Revenge of the Sith | 140 | 16.900253295898438 | 83.63529564797363 | +| **Star Wars**: Episode VI - Return of the Jedi | 135 | 16.900253295898438 | 83.02511192427228 | +| **Star Wars**: Episode I - The Phantom Menace | 133 | 16.81275749206543 | 82.34619279156092 | +| **Star Wars**: Episode V: The Empire Strikes Back | 124 | 16.900253295898438 | 81.59972515247492 | +| **Star Wars**: Episode IV - A New Hope | 121 | 16.81275749206543 | 80.76884081187906 | +| The **Star Wars** Holiday Special | 97 | 16.569408416748047 | 75.97019873160025 | +| **Star Wars**: The Clone Wars | 90 | 16.569408416748047 | 74.74227347404823 | +| **Star Wars**: Revelations | 47 | 16.13064956665039 | 62.44498690901793 | +| **Star Wars** Collection | null | 16.13064956665039 | 0 | diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/search-alias-views-reference.md b/site/content/arangodb/oem/index-and-search/arangosearch/search-alias-views-reference.md new file mode 100644 index 0000000000..df4c778732 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/search-alias-views-reference.md @@ -0,0 +1,108 @@ +--- +title: '`search-alias` Views Reference' +menuTitle: '`search-alias` Views Reference' +weight: 80 +description: '' +--- +`search-alias` Views let you add one or more inverted indexes to a View, enabling +federate searching, sorting search results by relevance, and search highlighting, on top of +sophisticated information retrieval capabilities such as full-text search for +unstructured or semi-structured data provided by the inverted indexes that they +are comprised of. + +## How to use `search-alias` Views + +You need to create one or more [inverted indexes](../indexing/working-with-indexes/inverted-indexes.md). +All settings about how data shall be indexed are part of the inverted index +definition. You can then create a `search-alias` View and add inverted indexes +to it. You can also create the View first and later create and add the inverted +indexes to it. + +Some of the inverted index settings only apply if they are used in a +`search-alias` View, whereas others equally apply whether you use an inverted +index standalone or as part of a View. + +Certain settings of inverted indexes need to match if you want to add them to the +same `search-alias` View, see the [restrictions](../indexing/working-with-indexes/inverted-indexes.md#restrictions). + +Inverted indexes can be managed as follows: +- in the web interface, in the **COLLECTIONS** section, in the **Indexes** tab + of a collection +- via the [Indexes HTTP API](../../develop/http-api/indexes/inverted.md) +- through the [JavaScript API](../indexing/working-with-indexes/_index.md#creating-an-index) + with `<collection>.ensureIndex()` + +Views can be managed as follows: +- in the web interface, in the **VIEWS** section +- via the [Views HTTP API](../../develop/http-api/views/_index.md) +- through the [JavaScript API](../../develop/javascript-api/@arangodb/db-object.md#views) + +Once you set up a View, you can query it via AQL with the +[`SEARCH` operation](../../aql/high-level-operations/search.md). + +See [Information Retrieval with ArangoSearch](_index.md) for an +introduction to Views and how to search them. + +## Create `search-alias` Views using the web interface + +You can create and manage a `search-alias` View through the web interface. +To get started, follow the steps outlined below. + +1. In the web interface, go to the left sidebar menu and select + the **VIEWS** entry. +2. To add a new View, click **Add View**. +3. Fill in the required fields: + - For **Name**, enter a name for the View. + - For **Type**, select `search-alias` from the dropdown menu. +4. Select an existing collection from the dropdown menu. You can also add it + later via the Views editor. +5. Select an existing inverted index of the collection that you previously + selected. You can also add it later via the Views editor. +6. To define multiple indexes, click the **Add index** button. +7. Click **Create**. + +![Create new search-alias View](../../../../images/arangosearch-create-search-alias-view.png) + +## Create `search-alias` Views using the JavaScript API + +The following example shows how you can create a `search-alias` View in _arangosh_: + +```js +--- +name: viewSearchAliasCreate +description: '' +--- +var coll = db._create("books"); +var idx = coll.ensureIndex({ type: "inverted", name: "inv-idx", fields: [ { name: "title", analyzer: "text_en" } ] }); +db._createView("products", "search-alias", { indexes: [ + { collection: "books", index: "inv-idx" } +] }); +~db._dropView("products"); +~db._drop(coll.name()); +``` + +## View Definition + +A `search-alias` View is configured via an object containing a set of +View-specific configuration directives, allowing you to add inverted indexes: + +- **name** (string, _immutable_): the View name +- **type** (string, _immutable_): the value `"search-alias"` +- **indexes** (array, _optional_): a list of inverted indexes for the View. + Default: `[]` + - **collection** (string, _required_): the name of a collection + - **index** (string, _required_): the name of an inverted index of the + `collection`, or the index ID without the `<collection>/` prefix + +## View Modification + +You can add or remove inverted indexes from the View definition: + +- **indexes** (array, _optional_): a list of inverted indexes to add to or + remove from the View. Default: `[]` + - **collection** (string, _required_): the name of a collection + - **index** (string, _required_): the name of an inverted index of the + `collection`, or the index ID without the `<collection>/` prefix + - **operation** (string, _optional_): whether to add or remove the index to + the stored `indexes` property of the View. Possible values: `"add"`, `"del"`. + The default is `"add"` diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/search-highlighting.md b/site/content/arangodb/oem/index-and-search/arangosearch/search-highlighting.md new file mode 100644 index 0000000000..aaa11fb3c4 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/search-highlighting.md @@ -0,0 +1,215 @@ +--- +title: Search highlighting with ArangoSearch +menuTitle: Search highlighting +weight: 60 +description: >- + You can retrieve the positions of matches within strings when querying + Views with ArangoSearch, to highlight what was found in search results +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +ArangoSearch lets you search for terms and phrases in full-text, and more. +It only returns matching documents, however. With search highlighting, you can +get the exact locations of the matches. + +A common use case is to emphasize the matching parts in client applications, +for example, with a background color or an underline, so that users can easily +see and understand the matches. + +## How to use search highlighting + +To use search highlighting, you need to index the respective attributes with +Analyzers that have the `offset` feature enabled. The built-in `text` Analyzers +don't have this feature enabled, you need to create custom Analyzers. + +You can get the substring offsets of matches by calling the +[`OFFSET_INFO()` function](../../aql/functions/arangosearch.md#offset_info) in +search queries. It takes the document emitted by the View (`FOR doc IN viewName`) +and a list of paths like `"field.nested"` or `"array[0].field"`, defining for +what attributes or array elements you want to retrieve the offsets for. For +every path, it returns a list comprised of a `name` and `offsets`. + +The `name` is the path of the value, but in a different form than you passed to +the function, like `["field", "nested"]` or `["array", 0, "field"]`. You can +look up the value with the [`VALUE()` function](../../aql/functions/document-object.md#value) +using this path description. + +The `offsets` are a list of offset pairs, one for every match. Each pair is an +array with two numbers, with the start offset and length of the match. There can be +multiple matches per path. You can optionally cap how many matches are collected +per path by setting limits when calling the `OFFSET_INFO()` function. + +{{< warning >}} +The start offsets and lengths describe the positions in bytes, not characters. +You may need to account for characters encoded using multiple bytes. +{{< /warning >}} + +### Term and phrase search with highlighting + +#### Dataset + +A collection called `food` with the following documents: + +```json +{ "name": "avocado", "description": { "en": "The avocado is a medium-sized, evergreen tree, native to the Americas." } } +{ "name": "carrot", "description": { "en": "The carrot is a root vegetable, typically orange in color, native to Europe and Southwestern Asia." } } +{ "name": "chili pepper", "description": { "en": "Chili peppers are varieties of the berry-fruit of plants from the genus Capsicum, cultivated for their pungency." } } +{ "name": "tomato", "description": { "en": "The tomato is the edible berry of the tomato plant." } } +``` + +#### Custom Analyzer + +If you want to use an `arangosearch` View, +create a `text` Analyzer in arangosh to tokenize text, like the built-in +`text_en` Analyzer, but additionally set the `offset` feature, enabling +search highlighting: + +```js +--- +name: analyzerTextOffset +description: '' +--- +var analyzers = require("@arangodb/analyzers"); +analyzers.save("text_en_offset", "text", { locale: "en", stopwords: [] }, ["frequency", "position", "offset"]); +~analyzers.remove("text_en_offset"); +``` + +The `frequency`, `position`, and `offset` [Analyzer features](../analyzers.md#analyzer-features) +are set because the examples on this page require them for the `OFFSET_INFO()` +search highlighting function to work, and the `PHRASE()` filter function also +requires the former two. + +You can skip this step if you want to use a `search-alias` View, because the +Analyzer features can be overwritten in the inverted index definition. + +#### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.food.ensureIndex({ + name: "inv-text-offset", + type: "inverted", + fields: [ + { name: "description.en", analyzer: "text_en", features: ["frequency", "position", "offset"] } + ] +}); + +db._createView("food_view", "search-alias", { indexes: [ { collection: "food", index: "inv-text-offset" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "food": { + "fields": { + "description": { + "fields": { + "en": { + "analyzers": [ + "text_en_offset" + ] + } + } + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +#### AQL queries + +Search the View for descriptions that contain the tokens `avocado` or `tomato`, +the phrase `cultivated ... pungency` with two arbitrary tokens between the two +words, and for words that start with `cap`. Get the matching positions, and use +this information to extract the substrings with the +[`SUBSTRING_BYTES()` function](../../aql/functions/string.md#substring_bytes). + +The [`OFFSET_INFO()` function](../../aql/functions/arangosearch.md#offset_info) +returns a `name` that describes the path of the attribute or array element with +the match. You can use the [`VALUE()` function](../../aql/functions/document-object.md#value) +to dynamically get the respective value. + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +--- +name: searchHighlighting_2 +description: '' +--- +var coll = db._create("food"); +var docs = db.food.save([ + { name: "avocado", description: { en: "The avocado is a medium-sized, evergreen tree, native to the Americas." } }, + { name: "carrot", description: { en: "The carrot is a root vegetable, typically orange in color, native to Europe and Southwestern Asia." } }, + { name: "chili pepper", description: { en: "Chili peppers are varieties of the berry-fruit of plants from the genus Capsicum, cultivated for their pungency." } }, + { name: "tomato", description: { en: "The tomato is the edible berry of the tomato plant." } } +]); +var idx = db.food.ensureIndex({ name: "inv-text-offset", type: "inverted", fields: [ { name: "description.en", analyzer: "text_en", features: ["frequency", "position", "offset"] } ] }); +var view = db._createView("food_view", "search-alias", { indexes: [ { collection: "food", index: "inv-text-offset" } ] }); +~assert(db._query(`FOR d IN food_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 4); +db._query(`FOR doc IN food_view + SEARCH + TOKENS("avocado tomato", "text_en") ANY == doc.description.en OR + PHRASE(doc.description.en, "cultivated", 2, "pungency") OR + STARTS_WITH(doc.description.en, "cap") + FOR offsetInfo IN OFFSET_INFO(doc, ["description.en"]) + RETURN { + description: doc.description, + name: offsetInfo.name, + matches: offsetInfo.offsets[* RETURN { + offset: CURRENT, + match: SUBSTRING_BYTES(VALUE(doc, offsetInfo.name), CURRENT[0], CURRENT[1]) + }] + }`).toArray(); +~db._dropView("food_view"); +~db._drop("food"); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```js +--- +name: searchHighlighting_1 +description: '' +--- +var coll = db._create("food"); +var docs = db.food.save([ + { name: "avocado", description: { en: "The avocado is a medium-sized, evergreen tree, native to the Americas." } }, + { name: "carrot", description: { en: "The carrot is a root vegetable, typically orange in color, native to Europe and Southwestern Asia." } }, + { name: "chili pepper", description: { en: "Chili peppers are varieties of the berry-fruit of plants from the genus Capsicum, cultivated for their pungency." } }, + { name: "tomato", description: { en: "The tomato is the edible berry of the tomato plant." } } +]); +var analyzers = require("@arangodb/analyzers"); +var analyzer = analyzers.save("text_en_offset", "text", { locale: "en", stopwords: [] }, ["frequency", "position", "offset"]); +var view = db._createView("food_view", "arangosearch", { links: { food: { fields: { description: { fields: { en: { analyzers: ["text_en_offset"] } } } } } } }); +~assert(db._query(`FOR d IN food_view COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 4); +db._query(`FOR doc IN food_view + SEARCH ANALYZER( + TOKENS("avocado tomato", "text_en_offset") ANY == doc.description.en OR + PHRASE(doc.description.en, "cultivated", 2, "pungency") OR + STARTS_WITH(doc.description.en, "cap") + , "text_en_offset") + FOR offsetInfo IN OFFSET_INFO(doc, ["description.en"]) + RETURN { + description: doc.description, + name: offsetInfo.name, + matches: offsetInfo.offsets[* RETURN { + offset: CURRENT, + match: SUBSTRING_BYTES(VALUE(doc, offsetInfo.name), CURRENT[0], CURRENT[1]) + }] + }`).toArray(); +~db._dropView("food_view"); +~db._drop("food"); +~analyzers.remove(analyzer.name); +``` +{{< /tab >}} + +{{< /tabs >}} diff --git a/site/content/arangodb/oem/index-and-search/arangosearch/wildcard-search.md b/site/content/arangodb/oem/index-and-search/arangosearch/wildcard-search.md new file mode 100644 index 0000000000..fbdbd461cc --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/arangosearch/wildcard-search.md @@ -0,0 +1,203 @@ +--- +title: Wildcard Search with ArangoSearch +menuTitle: Wildcard search +weight: 30 +description: >- + Search for strings with placeholders that stand for one or many arbitrary characters +--- +You can use the `LIKE()` function and `LIKE` operator for this search technique +to find strings that start with, contain, or end with a certain substring. You +can also search for complex patterns with multiple placeholders. Place the +special characters `_` and `%` as wildcards for any single or zero-or-more +characters in the search string to match multiple partial strings. + +``` +prefix% +%infix% +%suffix +%complex%pat_ern +``` + +Wildcard searching can be an alternative to tokenizing text into words and then +searching for words in a particular order ([Phrase and Proximity Search](phrase-and-proximity-search.md)). +It is especially useful if you want to search for substrings that include +characters that are considered word boundaries like punctuation and whitespace +and would normally get removed when tokenizing text. + +## Index acceleration + +The [ArangoSearch `LIKE()` function](../../aql/functions/arangosearch.md#like) +is backed by View indexes. In contrast, the +[string `LIKE()` function](../../aql/functions/string.md#like) cannot utilize any +sort of index. This applies to the [`LIKE` operator](../../aql/operators.md#comparison-operators), +too, which you can use instead of the function. +Another difference is that the ArangoSearch variant of the `LIKE()` function does +not accept a third argument to make matching case-insensitive. You can control +this via Analyzers instead, also see +[Case-insensitive Search with ArangoSearch](case-sensitivity-and-diacritics.md). +Which of the two equally named functions is used is determined by the context. +The ArangoSearch variant is used in `SEARCH` operations. It is also used when +you have an inverted index and use the `LIKE()` function with two arguments or +the `LIKE` operator in `FILTER` operations. The string variant is used everywhere +else, including using the `LIKE()` function with three arguments in `FILTER` +operations together with an inverted index. + +## Wildcard Syntax + +- `_`: A single arbitrary character +- `%`: Zero, one or many arbitrary characters +- `\\_`: A literal underscore +- `\\%`: A literal percent sign + +{{< info >}} +Literal backlashes require different amounts of escaping depending on the +context: +- `\` in bind variables (_Table_ view mode) in the web interface (automatically + escaped to `\\` unless the value is wrapped in double quotes and already + escaped properly) +- `\\` in bind variables (_JSON_ view mode) and queries in the web interface +- `\\` in bind variables in arangosh +- `\\\\` in queries in arangosh +- Double the amount compared to arangosh in shells that use backslashes for +escaping (`\\\\` in bind variables and `\\\\\\\\` in queries) +{{< /info >}} + +## Wildcard Search Examples + +### Dataset + +[IMDB movie dataset](example-datasets.md#imdb-movie-dataset) + +### View definition + +{{< tabs "view-definition">}} + +{{< tab "`search-alias` View" >}} +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact", type: "inverted", fields: [ "title" ] }); +db._createView("imdb", "search-alias", { indexes: [ { collection: "imdb_vertices", index: "inv-exact" } ] }); +``` +{{< /tab >}} + +{{< tab "`arangosearch` View" >}} +```json +{ + "links": { + "imdb_vertices": { + "fields": { + "title": { + "analyzers": [ + "identity" + ] + } + } + } + } +} +``` +{{< /tab >}} + +{{< /tabs >}} + +### AQL queries + +Match all titles that starts with `The Matr` using `LIKE()`, +where `_` stands for a single wildcard character and `%` for an arbitrary amount: + +```aql +FOR doc IN imdb + SEARCH LIKE(doc.title, "The Matr%") + RETURN doc.title +``` + +| Result | +|:-------| +| **The Matr**ix Revisited | +| **The Matr**ix | +| **The Matr**ix Reloaded | +| **The Matr**ix Revolutions | +| **The Matr**ix Trilogy | + +You can achieve the same with the `STARTS_WITH()` function: + +```aql +FOR doc IN imdb + SEARCH STARTS_WITH(doc.title, "The Matr") + RETURN doc.title +``` + +Match all titles that contain `Mat` using `LIKE()`: + +```aql +FOR doc IN imdb + SEARCH LIKE(doc.title, "%Mat%") + RETURN doc.title +``` + +| Result | +|:-------| +| The **Mat**rix Revisited | +| Gray **Mat**ters | +| Show: A Night In The Life of **Mat**chbox Twenty | +| The **Mat**ing Habits of the Earthbound Human | +| Dark **Mat**ter | +| Dave **Mat**thews & Tim Reynolds: Live at Radio City | +| Once Upon A **Mat**tress | +| Tarzan and His **Mat**e | +| Donald in **Mat**hmagic Land | +| Das Geheimnis der **Mat**erie | +| … | + +Match all titles that end with `rix` using `LIKE()`: + +```aql +FOR doc IN imdb + SEARCH LIKE(doc.title, "%rix") + RETURN doc.title +``` + +| Result | +|:-------| +| Ben 10: Secret of the Omnit**rix** | +| Pinchcliffe Grand P**rix** | +| Hend**rix** | +| The Mat**rix** | +| The Animat**rix** | +| Les Douze travaux d'Asté**rix** | +| Vercingéto**rix** | + +Match all titles that have an `H` as first letter, followed by two arbitrary +characters, followed by `ry` and any amount of characters after that. It will +match titles starting with `Harry` and `Henry`: + +```aql +FOR doc IN imdb + SEARCH LIKE(doc.title, "H__ry%") + RETURN doc.title +``` + +| Result | +|:-------| +| **Henry** & June | +| **Henry** Rollins: Live in the Conversation Pit | +| **Henry** Rollins: Uncut from NYC | +| **Harry** Potter and the Sorcerer's Stone | +| **Harry** Potter and the Chamber Of Secrets | +| … | + +Use a bind parameter as input, but escape the characters with special meaning +and perform a contains-style search by prepending and appending a percent sign: + +```aql +FOR doc IN imdb + SEARCH LIKE(doc.title, CONCAT("%", SUBSTITUTE(@term, ["_", "%"], ["\\_", "\\%"]), "%")) + RETURN doc.title +``` + +Bind parameters: + +```json +{ "term": "y_" } +``` + +The query constructs the wildcard string `%y\\_%` and will match `Cry_Wolf`. diff --git a/site/content/arangodb/oem/index-and-search/indexing/_index.md b/site/content/arangodb/oem/index-and-search/indexing/_index.md new file mode 100644 index 0000000000..b2e24d5cb5 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/_index.md @@ -0,0 +1,8 @@ +--- +title: About indexing and indexes +menuTitle: Indexing +weight: 150 +description: >- + Overview over what indexing is for, what index types ArangoDB supports, and + how to use indexes +--- diff --git a/site/content/arangodb/oem/index-and-search/indexing/basics.md b/site/content/arangodb/oem/index-and-search/indexing/basics.md new file mode 100644 index 0000000000..509d5debd4 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/basics.md @@ -0,0 +1,657 @@ +--- +title: Index basics +menuTitle: Index Basics +weight: 5 +description: >- + Indexes allow fast access to documents by maintaining special data structures + to accelerate queries that use indexed attributes +--- +ArangoDB automatically indexes some system attributes but you are free to create +additional indexes on other attributes of documents. You generally need to strike +a balance between creating indexes for often-used attributes to improve the +performance of read queries and the cost that indexes incur during writes to +maintain them. + +User-defined indexes can be created on collection level. Most user-defined indexes +can be created by specifying the names of the index attributes. +Some index types allow indexing just one attribute (e.g. a `ttl` index) whereas +other index types allow indexing multiple attributes at the same time. + +The system attributes `_id`, `_key`, `_from` and `_to` are automatically indexed +by ArangoDB, without the user being required to create extra indexes for them. +`_id` and `_key` are covered by a collection's primary key, and `_from` and `_to` +are covered by an edge collection's edge index automatically. + +You cannot use the `_id` system attribute, nor sub-attributes with this name, in +user-defined indexes (except the inverted index type). This applies to the +`fields` the index is defined over but not the additional attributes you can +store in a persistent index using `storedValues`. Indexing and storing +the `_key`, `_rev`, `_from`, and `_to` system attributes is possible. + +You cannot index fields that contain `.` in their attribute names because dots +are interpreted as paths of nested attributes. For example, `fields: ["foo.bar"]` +indexes the value of the nested attribute `bar` under the top-level attribute +`foo` (`{ "foo": { "bar": "value" } }`) and not a top-level attribute +`foo.bar` (`{ "foo.bar": "value" }`). + +You can also not index fields whose names either start or end with `:`, for +example, `fields: ["foo:"]`. This notation is reserved for internal use. + +Creating new indexes is by default done under an exclusive collection lock. The collection is not +available while the index is being created. This "foreground" index creation can be undesirable, +if you have to perform it on a live system without a dedicated maintenance window. + +For potentially long running index creation operations, creating indexes in the +"background" is supported. The collection remains (mostly) available during the index creation, +see the section [Creating Indexes in Background](#creating-indexes-in-background) for more information. + +## Primary Index + +For each collection there will always be a *primary index* which is a persistent index +for the [document keys](../../concepts/data-structure/documents/_index.md#document-keys) (`_key` attribute) +of all documents in the collection. The primary index allows quick selection +of documents in the collection using either the `_key` or `_id` attributes. It will +be used from within AQL queries automatically when performing equality lookups on +`_key` or `_id`. + +There are also dedicated functions to find a document given its `_key` or `_id` +that will always make use of the primary index: + +```js +db.collection.document("<document-key>"); +db._document("<document-id>"); +``` + +The primary index can be used for range queries and sorting as persistent +indexes are sorted. + +The primary index of a collection cannot be dropped or changed, and there is no +mechanism to create user-defined primary indexes. + +## Edge Index + +Every [edge collection](../../concepts/data-models.md#graph-model) also has an +automatically created *edge index*. The edge index provides quick access to +documents by either their `_from` or `_to` attributes. It can therefore be +used to quickly find connections between vertex documents and is invoked when +the connecting edges of a vertex are queried. + +Edge indexes are used from within AQL when performing equality lookups on `_from` +or `_to` values in an edge collections. There are also dedicated functions to +find edges given their `_from` or `_to` values that will always make use of the +edge index: + +```js +db.collection.edges("<from-value>"); +db.collection.edges("<to-value>"); +db.collection.outEdges("<from-value>"); +db.collection.outEdges("<to-value>"); +db.collection.inEdges("<from-value>"); +db.collection.inEdges("<to-value>"); +``` + +The edge index stores the union of all `_from` and `_to` attributes. +It can be used for equality lookups, but not for range queries or for sorting. +Edge indexes are automatically created for edge collections. + +It is not possible to create user-defined edge indexes. +However, it is possible to freely use the `_from` and `_to` attributes in +user-defined indexes. + +An edge index cannot be dropped or changed. + +## Vertex-centric indexes + +As mentioned above, the most important indexes for graphs are the edge +indexes, indexing the `_from` and `_to` attributes of edge collections. +They provide very quick access to all edges originating in or arriving +at a given vertex, which allows you to quickly find all neighbors of a vertex +in a graph. + +In many cases one would like to run more specific queries, for example +finding amongst the edges originating from a given vertex only those +with a timestamp greater than or equal to some date and time. Exactly this +is achieved with "vertex-centric indexes". In a sense these are localized +indexes for an edge collection, which sit at every single vertex. + +Technically, they are implemented in ArangoDB as indexes, which sort the +complete edge collection first by `_from` and then by other attributes +for _OUTBOUND_ traversals, or first by `_to` and then by other attributes +for _INBOUND_ traversals. For traversals in _ANY_ direction two indexes +are needed, one with `_from` and the other with `_to` as first indexed field. + +If we for example have a persistent index on the attributes `_from` and +`timestamp` of an edge collection, we can answer the above question +very quickly with a single range lookup in the index. + +You can create sorted persistent indexes that index the special edge attributes +`_from` or `_to` and additionally other attributes. These are used +in graph traversals, when appropriate `FILTER` statements are found +by the optimizer. + +For example, to create a vertex-centric index of the above type, you +would simply do + +```js +db.edges.ensureIndex({"type": "persistent", "fields": ["_from", "timestamp"]}); +``` + +in arangosh. Then, queries like + +```aql +FOR v, e, p IN 1..1 OUTBOUND "V/1" edges + FILTER e.timestamp >= "2018-07-09" + RETURN p +``` + +will be considerably faster in case there are many edges originating +from vertex `"V/1"` but only few with a recent timestamp. Note that the +optimizer may prefer the default edge index over vertex-centric indexes +based on the costs it estimates, even if a vertex-centric index might +in fact be faster. Vertex-centric indexes are more likely to be chosen +for highly connected graphs. + +## Persistent Index + +The persistent index is a sorted index with logarithmic complexity for insert, +update, and remove operations. + +You can create a persistent index on one or multiple document attributes. +It is a sorted index structure. It can be used to quickly find +documents with specific attribute values (point lookups / equality comparisons), +for range queries, and for returning documents from the index in sorted order, +but only if either all index attributes is provided in a query, or if a leftmost +prefix of the index attributes is specified. + +For example, if a persistent index is created on attributes `value1` and `value2`, the +following filter conditions can use the index (note: the `<=` and `>=` operators are +intentionally omitted here for the sake of brevity): + +```aql +FILTER doc.value1 == ... +FILTER doc.value1 < ... +FILTER doc.value1 > ... +FILTER doc.value1 > ... && doc.value1 < ... + +FILTER doc.value1 == ... && doc.value2 == ... +FILTER doc.value1 == ... && doc.value2 > ... +FILTER doc.value1 == ... && doc.value2 > ... && doc.value2 < ... +``` + +In order to use a persistent index for sorting, the index attributes must be specified in +the `SORT` clause of the query in the same order as they appear in the index definition. +Persistent indexes are always created in ascending order, but they can be used to access +the indexed elements in both ascending or descending order. However, for a combined index +(an index on multiple attributes) this requires that the sort orders in a single query +as specified in the `SORT` clause must be either all ascending (optionally omitted +as ascending is the default) or all descending. + +For example, if a persistent index is created on attributes `value1` and `value2` +(in this order), then the following sorts clauses can use the index for sorting: + +- `SORT value1 ASC, value2 ASC` (and its equivalent `SORT value1, value2`) +- `SORT value1 DESC, value2 DESC` +- `SORT value1 ASC` (and its equivalent `SORT value1`) +- `SORT value1 DESC` + +The following sort clauses cannot make use of the index order, and require an extra +sort step: + +- `SORT value1 ASC, value2 DESC` +- `SORT value1 DESC, value2 ASC` +- `SORT value2` (and its equivalent `SORT value2 ASC`) +- `SORT value2 DESC` (because first indexed attribute `value1` is not used in sort clause) + +Note: the latter two sort clauses cannot use the index because the sort clause does not +refer to a leftmost prefix of the index attributes. + +Persistent indexes support [indexing array values](#indexing-array-values) if +the index attribute name is extended with a `[*]`. + +Persistent indexes can optionally be declared unique, disallowing saving the +same value in the indexed attribute. They can be sparse or non-sparse. + +The different types of persistent indexes have the following characteristics: + +- **unique persistent index**: all documents in the collection must have different values for + the attributes covered by the unique index. Trying to insert a document with the same + key value as an already existing document will lead to a unique constraint + violation. + + This type of index is not sparse. Documents that do not contain the index attributes or + that have a value of `null` in the index attribute(s) will still be indexed. + A key value of `null` may only occur once in the index, so this type of index cannot + be used for optional attributes. + + The unique option can also be used to ensure that + [no duplicate edges](#ensuring-uniqueness-of-relations-in-edge-collections) are + created, by adding a combined index for the fields `_from` and `_to` to an edge collection. + +- **unique, sparse persistent index**: all documents in the collection must have different + values for the attributes covered by the unique index. Documents in which at least one + of the index attributes is not set or has a value of `null` are not included in the + index. This type of index can be used to ensure that there are no duplicate keys in + the collection for documents that have the indexed attributes set. As the index will + exclude documents for which the indexed attributes are `null` or not set, it can be + used for optional attributes. + +- **non-unique persistent index**: all documents in the collection will be indexed. This type + of index is not sparse. Documents that do not contain the index attributes or that have + a value of `null` in the index attribute(s) will still be indexed. Duplicate key values + can occur and do not lead to unique constraint violations. + +- **non-unique, sparse persistent index**: only those documents will be indexed that have all + the indexed attributes set to a value other than `null`. It can be used for optional + attributes. + +## Inverted index + +Inverted indexes store mappings from values (of document attributes) to their +locations in collections. You can add an arbitrary number of document attributes +to an inverted index. For each attribute, you can specify an Analyzer to process +the input with. This enables you tokenize strings for full-text search, +for example. You can also index multiple levels of nested objects in arrays. + +The index can optionally be sorted to optimize away `SORT` operations if the +sort direction of the fields match. You can also store additional attributes in +the index to cover projections. + +Inverted indexes are eventually consistent. They are updated near real-time when +documents are changed, but you may get stale values until the index catches up +with the changes. + +To accelerate queries with inverted indexes, you need to specify index hints in +these queries. Inverted indexes are not utilized automatically, unlike with +other index types, even if they would be capable of accelerating the queries. + +## TTL (time-to-live) Index + +You can use the TTL index type for automatically removing expired documents +from a collection. + +A TTL index is set up by setting an `expireAfter` value and by picking a single +document attribute which contains the documents' reference point in time. Documents +are expired after `expireAfter` seconds after their reference time has been reached. +The document's reference point in time is specified as either a numeric timestamp +(Unix timestamp) or a date string in the format `YYYY-MM-DDTHH:MM:SS`, optionally +with milliseconds after a decimal point in the format `YYYY-MM-DDTHH:MM:SS.MMM` +and an optional timezone offset. All date strings without a timezone offset are +interpreted as UTC dates. + +For example, if `expireAfter` is set to 600 seconds (10 minutes) and the index +attribute is "creationDate" and there is the following document: + +```json +{ "creationDate" : 1550165973 } +``` + +This document will be indexed with a creation date time value of `1550165973`, +which translates to the human-readable date `2019-02-14T17:39:33.000Z`. The document +will expire 600 seconds afterwards, which is at timestamp `1550166573` (or +`2019-02-14T17:49:33.000Z` in the human-readable version). + +The actual removal of expired documents will not necessarily happen immediately. +Expired documents will eventually be removed by a background thread that is +periodically going through all TTL indexes. The frequency for invoking this +background thread can be configured using the `--ttl.frequency` startup option. + +There is no guarantee when exactly the removal of expired documents will be carried +out, so queries may still find and return documents that have already expired. These +will eventually be removed when the background thread kicks in and has capacity to +remove the expired documents. It is guaranteed however that only documents which are +past their expiration time will actually be removed. + +Please note that the numeric date time values for the index attribute has to be +specified **in seconds** since January 1st 1970 (Unix timestamp). To calculate the current +timestamp from JavaScript in this format, there is `Date.now() / 1000`; to calculate it +from an arbitrary Date instance, there is `Date.getTime() / 1000`. In AQL you can do +`DATE_NOW() / 1000` or divide an arbitrary Unix timestamp that is in milliseconds +by 1000 to convert it to seconds. + +Alternatively, the index attribute values can be specified as a date string in format +`YYYY-MM-DDTHH:MM:SS`, optionally with milliseconds after a decimal point in the +format `YYYY-MM-DDTHH:MM:SS.MMM` and an optional timezone offset. All date strings +without a timezone offset will be interpreted as UTC dates. + +The above example document using a date string attribute value would be + +```json +{ "creationDate" : "2019-02-14T17:39:33.000Z" } +``` + +In case the index attribute does not contain a numeric value nor a proper date string, +the document will not be stored in the TTL index and thus will not become a candidate +for expiration and removal. Providing either a non-numeric value or even no value for +the index attribute is a supported way of keeping documents from being expired and removed. + +TTL indexes are designed exactly for the purpose of removing expired documents from +a collection. It is *not recommended* to rely on TTL indexes for user-land AQL queries. +This is because TTL indexes internally may store a transformed, always numerical version +of the index attribute value even if it was originally passed in as a date string. As a +result TTL indexes will likely not be used for filtering and sort operations in user-land +AQL queries. + +## Geo Index + +Users can create additional geo indexes on one or multiple attributes in collections. +A geo-spatial index can accelerate queries that filter and sort by the distance +between stored points and points provided in a query. + +The geo index stores two-dimensional coordinate pairs. It can be created on either two +separate document attributes (latitude and longitude) or a single array attribute that +contains both latitude and longitude. Latitude and longitude must be numeric values. + +Furthermore, a geo index can also index standard +[GeoJSON objects](https://datatracker.ietf.org/doc/html/rfc7946). +GeoJSON uses the JSON syntax to describe geometric objects on the surface +of the Earth. It supports points, lines, and polygons. +See [Geo-Spatial Indexes](working-with-indexes/geo-spatial-indexes.md). + +The geo index provides operations to find documents with locations nearest to a given +comparison location, and to find documents with locations that are within a specifiable +radius around a comparison location. + +The geo index is used via dedicated functions in AQL +and it is implicitly applied when a `SORT` or `FILTER` is used with +the `GEO_DISTANCE()` function, or if `FILTER` conditions with `GEO_CONTAINS()` +or `GEO_INTERSECTS()` are used. It will not be used for other types of queries +or conditions. + +## Fulltext Index + +{{< warning >}} +The fulltext index type is deprecated from version 3.10 onwards. +It is recommended to use [ArangoSearch](../arangosearch/_index.md) for advanced full-text search capabilities. +{{< /warning >}} + +A fulltext index can be used to find words, or prefixes of words inside documents. +A fulltext index can be created on a single attribute only, and will index all words +contained in documents that have a textual value in that attribute. Only words with a (specifiable) +minimum length are indexed. Word tokenization is done using the word boundary analysis +provided by libicu, which is taking into account the selected language provided at +server start. Words are indexed in their lower-cased form. The index supports complete +match queries (full words) and prefix queries, plus basic logical operations such as +`and`, `or` and `not` for combining partial results. + +The fulltext index is sparse, meaning it will only index documents for which the index +attribute is set and contains a string value. Additionally, only words with a configurable +minimum length will be included in the index. + +The fulltext index is used via dedicated functions in AQL, but will +not be enabled for other types of queries or conditions. + +## Indexes and non-ASCII texts + +Before strings are inserted into an index, they are +[normalized by using ICU](http://www.unicode.org/reports/tr15/). + +There are several characters in the Unicode space, that have a similar meaning. +In order to have all their variants in a result set when querying, the strings +are normalized for the index. This slightly changes the behavior of `FILTER` +statements with equality comparisons (`==`) when ran on non-indexed document +attributes. + +While the index may still be useful by fetching a little more results than +you want to actually work with, you may want to have an additional +`FILTER MD5(doc.attr) == MD5(@comparisonstring)` to make sure that the result +only contains the actual values you need in the end. + +## Indexing attributes and sub-attributes + +Top-level as well as nested attributes can be indexed. For attributes at the top level, +the attribute names alone are required. To index a single field, pass an array with a +single element (string of the attribute key) to the `fields` parameter of the +[ensureIndex() method](working-with-indexes/_index.md#creating-an-index). To create a +combined index over multiple fields, simply add more members to the `fields` array: + +```js +// { name: "Smith", age: 35 } +db.posts.ensureIndex({ type: "persistent", fields: [ "name" ] }) +db.posts.ensureIndex({ type: "persistent", fields: [ "name", "age" ] }) +``` + +To index sub-attributes, specify the attribute path using the dot notation: + +```js +// { name: {last: "Smith", first: "John" } } +db.posts.ensureIndex({ type: "persistent", fields: [ "name.last" ] }) +db.posts.ensureIndex({ type: "persistent", fields: [ "name.last", "name.first" ] }) +``` + +## Indexing array values + +If an index attribute contains an array, ArangoDB will store the entire array as the index value +by default. Accessing individual members of the array via the index is not possible this +way. + +To make an index insert the individual array members into the index instead of the entire array +value, a special array index needs to be created for the attribute. Array indexes can be set up +like regular persistent indexes using the `collection.ensureIndex()` function. To make a +persistent index an array index, the index attribute name needs to be extended with `[*]` +when creating the index and when filtering in an AQL query using the `IN` operator. + +The following example creates an persistent array index on the `tags` attribute in a collection named +`posts`: + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*]" ] }); +db.posts.insert({ tags: [ "foobar", "baz", "quux" ] }); +``` + +This array index can then be used for looking up individual `tags` values from AQL queries via +the `IN` operator: + +```aql +FOR doc IN posts + FILTER 'foobar' IN doc.tags + RETURN doc +``` + +It is possible to add the [array expansion operator](../../aql/operators.md#array-expansion) +`[*]`, but it is not mandatory. You may use it to indicate that an array index is used, +it is purely cosmetic however: + +```aql +FOR doc IN posts + FILTER 'foobar' IN doc.tags[*] + RETURN doc +``` + +The following FILTER conditions will **not use** the array index: + +```aql +FILTER doc.tags ANY == 'foobar' +FILTER doc.tags ANY IN 'foobar' +FILTER doc.tags IN 'foobar' +FILTER doc.tags == 'foobar' +FILTER 'foobar' == doc.tags +``` + +It is also possible to create an index on subattributes of array values. This makes sense +if the index attribute is an array of objects, e.g. + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*].name" ] }); +db.posts.insert({ tags: [ { name: "foobar" }, { name: "baz" }, { name: "quux" } ] }); +``` + +The following query will then use the array index (this does require the +[array expansion operator](../../aql/operators.md#array-expansion)): + +```aql +FOR doc IN posts + FILTER 'foobar' IN doc.tags[*].name + RETURN doc +``` + +If you store a document having the array which does contain elements not having +the sub-attributes this document will also be indexed with the value `null`, which +in ArangoDB is equal to attribute not existing. + +ArangoDB supports creating array indexes with a single `[*]` operator per index +attribute. For example, creating an index as follows is **not supported**: + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*].name[*].value" ] }); +``` + +Array values will automatically be de-duplicated before being inserted into an array index. +For example, if the following document is inserted into the collection, the duplicate array +value `bar` will be inserted only once: + +```js +db.posts.insert({ tags: [ "foobar", "bar", "bar" ] }); +``` + +This is done to avoid redundant storage of the same index value for the same document, which +would not provide any benefit. + +If an array index is declared **unique**, the de-duplication of array values will happen before +inserting the values into the index, so the above insert operation with two identical values +`bar` will not necessarily fail + +It will always fail if the index already contains an instance of the `bar` value. However, if +the value `bar` is not already present in the index, then the de-duplication of the array values will +effectively lead to `bar` being inserted only once. + +To turn off the deduplication of array values, it is possible to set the **deduplicate** attribute +on the array index to `false`. The default value for **deduplicate** is `true` however, so +de-duplication will take place if not explicitly turned off. + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*]" ], deduplicate: false }); + +// will fail now +db.posts.insert({ tags: [ "foobar", "bar", "bar" ] }); +``` + +If an array index is declared and you store documents that do not have an array at the specified attribute +this document will not be inserted in the index. Hence the following objects will not be indexed: + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*]" ] }); +db.posts.insert({ something: "else" }); +db.posts.insert({ tags: null }); +db.posts.insert({ tags: "this is no array" }); +db.posts.insert({ tags: { content: [1, 2, 3] } }); +``` + +An array index is able to index explicit `null` values. When queried for `null`values, it +will only return those documents having explicitly `null` stored in the array, it will not +return any documents that do not have the array at all. + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*]" ] }); +db.posts.insert({tags: null}) // Will not be indexed +db.posts.insert({tags: []}) // Will not be indexed +db.posts.insert({tags: [null]}); // Will be indexed for null +db.posts.insert({tags: [null, 1, 2]}); // Will be indexed for null, 1 and 2 +``` + +Declaring an array index as **sparse** does not have an effect on the array part of the index, +this in particular means that explicit `null` values are also indexed in the **sparse** version. +If an index is combined from an array and a normal attribute the sparsity will apply for the attribute e.g.: + +```js +db.posts.ensureIndex({ type: "persistent", fields: [ "tags[*]", "name" ], sparse: true }); +db.posts.insert({tags: null, name: "alice"}) // Will not be indexed +db.posts.insert({tags: [], name: "alice"}) // Will not be indexed +db.posts.insert({tags: [1, 2, 3]}) // Will not be indexed +db.posts.insert({tags: [1, 2, 3], name: null}) // Will not be indexed +db.posts.insert({tags: [1, 2, 3], name: "alice"}) +// Will be indexed for [1, "alice"], [2, "alice"], [3, "alice"] +db.posts.insert({tags: [null], name: "bob"}) +// Will be indexed for [null, "bob"] +``` + +Please note that filtering using array indexes only works from within AQL queries and +only if the query filters on the indexed attribute using the `IN` operator. The other +comparison operators (`==`, `!=`, `>`, `>=`, `<`, `<=`, `ANY`, `ALL`, `NONE`) +cannot use array indexes currently. + +## Ensuring uniqueness of relations in edge collections + +You can create a combined index over the edge attributes `_from` and `_to` +with the unique option enabled to prevent duplicate relations from being created. + +For example, a document collection `users` might contain vertices with the document +handles `user/A`, `user/B` and `user/C`. Relations between these documents can +be stored in an edge collection `knows`, for instance. You may want to make sure +that the vertex `user/A` is never linked to `user/B` by an edge more than once. +This can be achieved by adding a unique, non-sparse persistent index for the +fields `_from` and `_to`: + +```js +db.knows.ensureIndex({ type: "persistent", fields: [ "_from", "_to" ], unique: true }); +``` + +Creating an edge `{ _from: "user/A", _to: "user/B" }` in `knows` will be accepted, +but only once. Another attempt to store an edge with the relation **A** → **B** will +be rejected by the server with a *unique constraint violated* error. This includes +updates to the `_from` and `_to` fields. + +Note that adding a relation **B** → **A** is still possible, so are **A** → **A** +and **B** → **B**, because they are all different relations in a directed graph. +Each one can only occur once however. + +## Creating Indexes in Background + +Creating new indexes is by default done under an exclusive collection lock. This means +that the collection (or the respective shards) are not available for write operations +as long as the index is being created. This "foreground" index creation can be undesirable, +if you have to perform it on a live system without a dedicated maintenance window. + +Indexes can also be created in "background", not using an +exclusive lock during the entire index creation. The collection remains basically available, +so that other CRUD operations can run on the collection while the index is being created. +This can be achieved by setting the `inBackground` attribute when creating an index. + +To create an index in the background in *arangosh* just specify `inBackground: true`, +like in the following examples: + +```js +// create the persistent indexes in the background +db.collection.ensureIndex({ type: "persistent", fields: [ "value" ], unique: false, inBackground: true }); +db.collection.ensureIndex({ type: "persistent", fields: [ "email" ], unique: true, inBackground: true }); + +// also supported for geo and fulltext indexes +db.collection.ensureIndex({ type: "geo", fields: [ "location"], inBackground: true }); +db.collection.ensureIndex({ type: "geo", fields: [ "latitude", "longitude"], inBackground: true }); +db.collection.ensureIndex({ type: "fulltext", fields: [ "text" ], minLength: 4, inBackground: true }) +``` + +### Behavior + +Indexes that are still in the build process will not be visible via the ArangoDB APIs. +Nevertheless it is not possible to create the same index twice via the `ensureIndex()` method +while an index is still begin created. AQL queries also will not use these indexes until +the index reports back as fully created. Note that the initial `ensureIndex()` call or HTTP +request will still block until the index is completely ready. Existing single-threaded +client programs can thus safely set the `inBackground` option to `true` and continue to +work as before. + +{{< info >}} +Should you be building an index in the background you cannot rename or drop the collection. +These operations will block until the index creation is finished. This is equally the case +with foreground indexing. +{{< /info >}} + +After an interrupted index build (i.e. due to a server crash) the partially built index +will the removed. In the ArangoDB cluster the index might then be automatically recreated +on affected shards. + +### Performance + +Background index creation might be slower than the "foreground" index creation and require +more RAM. Under a write heavy load (specifically many remove, update or replace operations), +the background index creation needs to keep a list of removed documents in RAM. This might +become unsustainable if this list grows to tens of millions of entries. + +Building an index is always a write heavy operation (internally), it is always a good idea to build indexes +during times with less load. + +In the Enterprise Edition, non-unique indexes can be created with multiple +threads in parallel. The number of parallel index creation threads is currently +set to 2, but future versions of ArangoDB may increase this value. +Parallel index creation is only triggered for collections with at least 120,000 +documents. diff --git a/site/content/arangodb/oem/index-and-search/indexing/index-utilization.md b/site/content/arangodb/oem/index-and-search/indexing/index-utilization.md new file mode 100644 index 0000000000..46a4592bb0 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/index-utilization.md @@ -0,0 +1,149 @@ +--- +title: Index Utilization +menuTitle: Index Utilization +weight: 15 +description: >- + How ArangoDB utilizes indexes to accelerate queries, and under what conditions + it can or cannot make use of indexes +--- +In most cases ArangoDB will use a single index per collection in a given query. AQL queries can +use more than one index per collection when multiple `FILTER` conditions are combined with a +logical `OR` and these can be covered by indexes. AQL queries will use a single index per +collection when `FILTER` conditions are combined with logical `AND`. + +Creating multiple indexes on different attributes of the same collection may give the query +optimizer more choices when picking an index. Creating multiple indexes on different attributes +can also help in speeding up different queries, with `FILTER` conditions on different attributes. + +It is often beneficial to create an index on more than just one attribute. By adding more attributes +to an index, an index can become more selective and thus reduce the number of documents that +queries need to process. + +ArangoDB's `primary` and `edge` indexes automatically provide selectivity estimates. +The `persistent`, `mdi`, and `mdi-prefixed` indexes do too, by default. +Index selectivity estimates are provided in the web interface, the `indexes()` return +value and in the `explain()` output for a given query. + +The more selective an index is, the more documents it will filter on average. The index selectivity +estimates are therefore used by the optimizer when creating query execution plans when there are +multiple indexes the optimizer can choose from. The optimizer will then select a combination of +indexes with the lowest estimated total cost. In general, the optimizer will pick the indexes with +the highest estimated selectivity. + +Sparse indexes may or may not be picked by the optimizer in a query. As sparse indexes do not contain +`null` values, they will not be used for queries if the optimizer cannot safely determine whether a +`FILTER` condition includes `null` values for the index attributes. The optimizer policy is to produce +correct results, regardless of whether or which index is used to satisfy `FILTER` conditions. If it is +unsure about whether using an index will violate the policy, it will not make use of the index. + +## Troubleshooting + +When in doubt about whether and which indexes will be used for executing a given AQL query, +click the **Explain** button in the web interface in the **Queries** view or use +the `explain()` method for the statement as follows (from the ArangoShell): + +```js +var query = "FOR doc IN collection FILTER doc.value > 42 RETURN doc"; +var stmt = db._createStatement(query); +stmt.explain(); +``` + +The `explain()` command will return a detailed JSON representation of the query's execution plan. +The JSON explain output is intended to be used programmatically. To get a human-readable and much more +compact explanation of the query, there use `db._explain(query)`: + +```js +var query = "FOR doc IN collection FILTER doc.value > 42 RETURN doc"; +db._explain(query); +``` + +If any of the explain methods shows that a query is not using indexes, the following steps may help: + +- Check if the attribute names in the query are correctly spelled. In a schema-free database, documents + in the same collection can have varying structures. There is no such thing as a *non-existing attribute* + error. A query that refers to attribute names not present in any of the documents will not return an + error, and obviously will not benefit from indexes. + +- Check the return value of the `indexes()` method for the collections used in the query and validate + that indexes are actually present on the attributes used in the query's filter conditions. + +- If indexes are present but not used by the query, the query's `FILTER` condition may not be adequate: + an index will be used only for comparison operators `==`, `<`, `<=`, `>`, `>=` and `IN`. + +- Using indexed attributes as function parameters or in arbitrary expressions will likely lead to the index + on the attribute not being used. For example, the following queries will not use an index on `value`: + + ```aql + FOR doc IN collection FILTER TO_NUMBER(doc.value) == 42 RETURN doc + ``` + + ```aql + FOR doc IN collection FILTER doc.value - 1 == 42 RETURN doc + ``` + + In these cases the queries should be rewritten so that only the index attribute is present on one side of + the operator, or additional filters and indexes should be used to restrict the amount of documents otherwise. + +- Certain AQL functions such as `WITHIN()` or `FULLTEXT()` do utilize indexes internally, but their use is + not mentioned in the query explanation for functions in general. These functions will raise query errors + (at runtime) if no suitable index is present for the collection in question. + +- The query optimizer will generally pick one index per collection in a query. It can pick more than + one index per collection if the `FILTER` condition contains multiple branches combined with logical `OR`. + For example, the following queries can use indexes: + + ```aql + FOR doc IN collection FILTER doc.value1 == 42 || doc.value1 == 23 RETURN doc + ``` + + ```aql + FOR doc IN collection FILTER doc.value1 == 42 || doc.value2 == 23 RETURN doc + ``` + + ```aql + FOR doc IN collection FILTER doc.value1 < 42 || doc.value2 > 23 RETURN doc + ``` + + The two `OR`s in the first query will be converted to an `IN` lookup, and if there is a suitable index on + `value1`, it will be used. The second query requires two separate indexes on `value1` and `value2` and + will use them if present. The third query can use the indexes on `value1` and `value2` when they are + sorted. + +- For indexes on multiple attributes (combined indexes), the index attribute order is also important. + For example, when creating an index on `["value1", "value2"]` (in this order), the index can be + used to satisfy the following `FILTER` conditions: + + ```aql + FILTER doc.value1 == ... + FILTER doc.value1 > ... + FILTER doc.value1 >= ... + FILTER doc.value1 < ... + FILTER doc.value1 <= ... + FILTER doc.value1 > ... && doc.value1 < ... + FILTER doc.value1 >= ... && doc.value1 < ... + FILTER doc.value1 > ... && doc.value1 <= ... + FILTER doc.value1 >= ... && doc.value1 <= ... + FILTER doc.value1 IN ... + + FILTER doc.value1 == ... && doc.value2 == ... + FILTER doc.value1 == ... && doc.value2 > ... + FILTER doc.value1 == ... && doc.value2 >= ... + FILTER doc.value1 == ... && doc.value2 < ... + FILTER doc.value1 == ... && doc.value2 <= ... + FILTER doc.value1 == ... && doc.value2 > ... && doc.value2 < ... + FILTER doc.value1 == ... && doc.value2 >= ... && doc.value2 < ... + FILTER doc.value1 == ... && doc.value2 > ... && doc.value2 <= ... + FILTER doc.value1 == ... && doc.value2 >= ... && doc.value2 <= ... + FILTER doc.value1 == ... && doc.value2 IN ... + ``` + + The index cannot be used to satisfy FILTER conditions on `value2` alone. + + For a combined index to be used in a query, the following algorithm is applied: + + - The index attributes are checked in order, from left to right (e.g. `value1`, `value2`). + - If there is a `FILTER` condition on an index attribute, the index is considered a valid candidate + for the query. + - If the `FILTER` condition on the current attribute does not use `==` or `IN`, the following index + attributes are not considered anymore. Otherwise, they will be considered and the algorithm will + check the next index attribute. diff --git a/site/content/arangodb/oem/index-and-search/indexing/which-index-to-use-when.md b/site/content/arangodb/oem/index-and-search/indexing/which-index-to-use-when.md new file mode 100644 index 0000000000..377b435c0b --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/which-index-to-use-when.md @@ -0,0 +1,204 @@ +--- +title: Which Index to use when +menuTitle: Which index to use when +weight: 10 +description: >- + Pick the right index type for your use case, choosing from persistent, + inverted, TTL, and multi-dimensional indexes, as well as Views +--- +ArangoDB automatically indexes the `_key` attribute in each collection. There +is no need to index this attribute separately. Please note that a document's +`_id` attribute is derived from the `_key` attribute, and is thus implicitly +indexed, too. + +ArangoDB also automatically creates an index on `_from` and `_to` in any +edge collection, meaning incoming and outgoing connections can be determined +efficiently. + +## Index types + +Users can define additional indexes on one or multiple document attributes. +Several different index types are provided by ArangoDB. These indexes have +different usage scenarios: + +- **Persistent index**: a persistent index is a general purpose index type + that can be used for equality lookups, lookups based on a leftmost prefix + of the index attributes, range queries and for sorting. + + The operations in a persistent index have logarithmic complexity. + + Persistent indexes allow you to store additional attributes in the index that + can be used to cover more queries (`storedValues` index option). + These additional attributes can be used for projections but not for + lookups/filtering or sorting. + + You can optionally let persistent indexes cache equality lookups (`==`) to + speed up index lookups for queries that cover all index attributes + (`cacheEnabled` index option). + +- **Inverted index**: an inverted index lets you accelerate a broad range of + queries, from simple lookups to complex information retrieval. It can cover + filter conditions of the following types: + + - Exact value matching + - Range queries + - Prefix matching + - Accent- and case-insensitive matching + - Wildcard and fuzzy matching + - Token and phrase queries for full-text search + - Geo-spatial queries + - Nested matching + + The inverted index type is eventually consistent like `arangosearch` Views, + but unlike other index types. + It may thus not be a suitable index type depending on your requirements. + + You can add one more more inverted indexes to a `search-alias` View for + federated searching over multiple collections, for ranking results by + relevance, and for search highlighting capabilities. It is a lightweight + alternative to an `arangosearch` View. + +- **TTL index**: a time-to-live index can be used for automatically removing + expired documents from a collection. + + You can choose a document attribute that specifies a point in time and whether + documents shall expire at the point in time or a given number of seconds after + the point in time. + +- **multi-dimensional index** (ZKD): a multi dimensional index allows to + efficiently intersect multiple range queries. Typical use cases are querying + intervals that intersect a given point or interval. For example, if intervals + are stored in documents like + + ```json + { "from": 12, "to": 45 } + ``` + + then you can create an index over `from, to` utilize it with this query: + + ```aql + FOR i IN intervals FILTER i.from <= t && t <= i.to RETURN i + ``` + + Currently only floating-point numbers (doubles) are supported as underlying + type for each dimension. + +- **Geo index**: the geo index provided by ArangoDB allows searching for documents + within a radius around a two-dimensional location (point) on Earth, or to + find documents with are closest to a point. Document coordinates can either + be specified in two different document attributes or in a single attribute, e.g. + ```json + { "latitude": 50.9406645, "longitude": 6.9599115 } + ``` + or + ```json + { "coords": [ 50.9406645, 6.9599115 ] } + ``` + + Geo indexes are invoked via special functions or AQL optimization. The + optimization can be triggered when a collection with geo index is enumerated + and a SORT or FILTER statement is used in conjunction with the distance + function. + + Furthermore, a geo index can also index standard + [GeoJSON objects](https://datatracker.ietf.org/doc/html/rfc7946). + GeoJSON uses the JSON syntax to describe geometric objects on the surface + of the Earth. It supports points, lines, and polygons. + See [Geo-Spatial Indexes](working-with-indexes/geo-spatial-indexes.md). + +- **fulltext index**: a fulltext index can be used to index all words contained in + a specific attribute of all documents in a collection. Only words with a + (specifiable) minimum length are indexed. Word tokenization is done using + the word boundary analysis provided by libicu, which is taking into account + the selected language provided at server start. + + The index supports complete match queries (full words) and prefix queries. + Fulltext indexes are invoked via special functions. + + Please note that the fulltext index type is deprecated from version 3.10 onwards + and is superseded by [ArangoSearch](../arangosearch/_index.md). + +- **View**: [ArangoSearch](../arangosearch/_index.md) is a sophisticated search engine + for full-text, with text pre-processing, ranking capabilities and more. + It offers more features and configuration options than a fulltext index. + It indexes documents near real-time, but not immediately as other indexes. + + Comparison with the full-text Index: + + Feature | ArangoSearch | Full-text Index + :---------------------------------|:-------------|:--------------- + Term search | Yes | Yes + Prefix search | Yes | Yes + Boolean expressions | Yes | Restricted + Range search | Yes | No + Phrase search | Yes | No + Relevance ranking | Yes | No + Configurable Analyzers | Yes | No + AQL composable language construct | Yes | No + Indexed attributes per collection | Unlimited | 1 + Indexed collections | Unlimited | 1 + Consistency | Eventual | Immediate + +## Sparse vs. non-sparse indexes + +Persistent indexes can optionally be created sparse. A sparse index +does not contain documents for which at least one of the index attribute is not set +or contains a value of `null`. + +As such documents are excluded from sparse indexes, they may contain fewer documents than +their non-sparse counterparts. This enables faster indexing and can lead to reduced memory +usage in case the indexed attribute does occur only in some, but not all documents of the +collection. + +In order to create a sparse index, an object with the attribute `sparse` can be added to +the index creation commands: + +```js +db.collection.ensureIndex({ type: "persistent", fields: [ "attributeName" ], sparse: true }); +db.collection.ensureIndex({ type: "persistent", fields: [ "attributeName1", "attributeName2" ], sparse: true }); +db.collection.ensureIndex({ type: "persistent", fields: [ "attributeName" ], unique: true, sparse: true }); +db.collection.ensureIndex({ type: "persistent", fields: [ "attributeName1", "attributeName2" ], unique: true, sparse: true }); +``` + +When not explicitly set, the `sparse` attribute defaults to `false` for new indexes. +Indexes other than persistent do not support the `sparse` option. + +As sparse indexes may exclude some documents from the collection, they cannot be used for +all types of queries. Sparse hash indexes cannot be used to find documents for which at +least one of the indexed attributes has a value of `null`. For example, the following AQL +query cannot use a sparse index, even if one was created on attribute `attr`: +<!-- TODO Remove above statement? --> + +```aql +FOR doc In collection + FILTER doc.attr == null + RETURN doc +``` + +If the lookup value is non-constant, a sparse index may or may not be used, depending on +the other types of conditions in the query. If the optimizer can safely determine that +the lookup value cannot be `null`, a sparse index may be used. When uncertain, the optimizer +does not make use of a sparse index in a query in order to produce correct results. + +For example, the following queries cannot use a sparse index on `attr` because the optimizer +does not know beforehand whether the values which are compared to `doc.attr` include `null`: + +```aql +FOR doc In collection + FILTER doc.attr == SOME_FUNCTION(...) + RETURN doc +``` + +```aql +FOR other IN otherCollection + FOR doc In collection + FILTER doc.attr == other.attr + RETURN doc +``` + +Sparse persistent indexes can be used for sorting if the optimizer can safely detect that the +index range does not include `null` for any of the index attributes. + +Note that if you intend to use [joins](../../aql/examples-and-query-patterns/joins.md) it may be clever +to use non-sparsity and maybe even uniqueness for that attribute, else all items containing +the `null` value match against each other and thus produce large results. diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/_index.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/_index.md new file mode 100644 index 0000000000..23815ed5ef --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/_index.md @@ -0,0 +1,376 @@ +--- +title: Working with Indexes +menuTitle: Working with Indexes +weight: 20 +description: >- + Create and manage indexes programmatically for document collections using + ArangoDB's JavaScript API +--- +## Index Identifiers + +An index identifier uniquely identifies an index within a collection. +It is a numeric value stored as a string that is auto-generated by ArangoDB. +It can be prefixed with a collection name and forward slash (`/`) to uniquely +identify an index within a database. + +A specific index of a collection can be accessed using its index identifier +as follows: + +```js +db.collection.index("<index-identifier>"); +db.collection.index("<collection-name>/<index-identifier>"); +db._index("<collection-name>/<index-identifier>"); +``` + +For example, assume that the full index identifier, which is stored in the `_id` +attribute of the index, is `demo/362549736`, and the index has been created in a +collection named `demo`. Then this index can be accessed as follows: + +```js +db.demo.index("362549736"); +db.demo.index("demo/362549736"); +``` + +Because the full index identifier is unique within the database, you can also +access the index directly from the `db` object: + +```js +db._index("demo/362549736"); +``` + +You can also look up an index by its name. Since names are only unique within +a collection rather than within the database, the lookup must also include the +collection name when calling `db._index()`: + +```js +db.demo.index("primary") +db._index("demo/primary") +``` + +## Collection Methods + +### Listing all indexes of a collection + +`collection.getIndexes(withStats, withHidden)` + +`collection.indexes(withStats, withHidden)` + +Returns an array of all indexes defined for the collection. + +You can set the following parameters: + +- `withStats` (boolean, _optional_): whether to include index figures and + estimates in the result. Default: `false` +- `withHidden` (boolean, _optional_): whether to include hidden indexes in the + result. Internal indexes (such as `arangosearch`) and ones that are currently + built in the background are hidden. Default: `false` + +The `indexes()` method is an alias for `getIndexes()`. + +Note that `_key` implicitly has an index assigned to it. + +**Examples** + +Get the index definitions for a collection: + +```js +--- +name: collectionIndexes +description: '' +--- +~db._create("test"); +~db.test.ensureIndex({ type: "persistent", fields: ["attribute"], unique: true }); +~db.test.ensureIndex({ type: "persistent", fields: ["uniqueAttribute"], unique: true }); +~db.test.ensureIndex({ type: "persistent", fields: ["attribute", "secondAttribute.subAttribute"] }); +db.test.indexes(); +~db._drop("test"); +``` + +Get the index definitions for a collection, including figures and hidden indexes: + +```js +--- +name: collectionIndexesStats +description: '' +--- +~db._create("coll"); +~db.coll.save({ attr: "foo" }); +~db.coll.save({ attr: "bar" }); +~db.coll.ensureIndex({ type: "inverted", fields: ["attr"], name: "inv-idx" }); +~db._createView("arangosearch-view", "arangosearch", { links: { coll: { includeAllFields: true } } }); +~assert(db._query(`FOR d in ´arangosearch-view´ COLLECT WITH COUNT INTO c RETURN c`).toArray()[0] === 2); +db.coll.indexes(true, true); +~db._drop("coll"); +~db._dropView("arangosearch-view"); +``` + +### Creating an index + +Ensures that an index exists: + +`collection.ensureIndex(index-description)` + +Ensures that an index according to the `index-description` exists. A +new index will be created if none exists with the given description. + +Calling this method returns an index object. Whether or not the index +object existed before the call is indicated in the `isNewlyCreated` return +attribute. + +The `index-description` input value must contain at least a `type` attribute. +Other attributes may be necessary, depending on the index type. + +- `type`: can be one of the following values: + - `"persistent"`: persistent (array) index, including vertex-centric index + - `"inverted"`: inverted index + - `"ttl"`: time-to-live index + - `"fulltext"`: full-text index (deprecated from ArangoDB 3.10 onwards) + - `"geo"`: geo-spatial index, with _one_ or _two_ attributes + - `"zkd"`: multi-dimensional index (experimental) + +- `fields`: an array of attribute paths, containing the document attributes + (or sub-attributes) to be indexed. Some indexes allow using only a single path, + and others allow multiple. + If multiple attributes are used, their order matters. + + The `.` character denotes sub-attributes in attribute paths. Attributes with + literal `.` in their name cannot be indexed. Attributes with the name `_id` + cannot be indexed either, neither as a top-level attribute nor as a sub-attribute + (except the inverted index type). + + If an attribute path contains an `[*]` extension (e.g. `friends[*].id`), it means + that the index attribute value is treated as an array and all array members are + indexed separately. This is possible with `persistent` and `inverted` indexes. + +- `storedValues`: in indexes of type `persistent` and `inverted`, additional + attributes can be stored in the index. These additional attributes cannot be used for + index lookups or for sorting, but they can be used for projections. This allows an + index to fully cover more queries and avoid extra document lookups. + Non-existing attributes are stored as `null` values inside `storedValues`. + The maximum number of attributes in `storedValues` is 32. + It is not possible to create multiple indexes with the same `fields` attributes + and uniqueness but different `storedValues` attributes. That means the value of + `storedValues` is not considered in index creation calls when checking if an + index is already present or needs to be created. + In unique indexes, only the attributes in `fields` are checked for uniqueness, + but the attributes in `storedValues` are not checked for their uniqueness. + + In `persistent` indexes, you cannot store attributes with the name `_id`, + neither as a top-level attribute nor as a sub-attribute. + +- `name`: can be a string. Index names are subject to the same character + restrictions as [collection names](../../../concepts/data-structure/collections.md#collection-names). + If omitted, a name will be auto-generated so + that it is unique with respect to the collection, e.g. `idx_832910498`. + + The purpose of user-defined index names is have easy-to-remember names to + use in index hints in AQL queries. + If no index hints are used, going with the auto-generated index names is fine. + +- `sparse`: can be `true` or `false`. + You can control the sparsity for `persistent` indexes. The `inverted`, `fulltext`, + and `geo` index types are [sparse](../which-index-to-use-when.md) by definition. + +- `unique`: can be `true` or `false` and is supported by `persistent` indexes. + By default, all user-defined indexes are non-unique. + Only the attributes in `fields` are checked for uniqueness. Any attributes in + from `storedValues` are not checked for their uniqueness. + +- `deduplicate`: can be `true` or `false` and is supported by array indexes of + type `persistent`. It controls whether inserting duplicate index values + from the same document into a unique array index will lead to a unique constraint + error or not. The default value is `true`, so only a single instance of each + non-unique index value will be inserted into the index per document. Trying to + insert a value into the index that already exists in the index will always fail, + regardless of the value of this attribute. + +- `estimates`: can be `true` or `false` and is supported by indexes of type + `persistent`. This attribute controls whether index selectivity estimates are + maintained for the index. Not maintaining index selectivity estimates can have + a slightly positive impact on write performance. + The downside of turning off index selectivity estimates will be that + the query optimizer will not be able to determine the usefulness of different + competing indexes in AQL queries when there are multiple candidate indexes to + choose from. + The `estimates` attribute is optional and defaults to `true` if not set. It will + have no effect on indexes other than `persistent` (with `hash` and `skiplist` + being mere aliases for the `persistent` index type nowadays). + +- `cacheEnabled`: can be `true` or `false` and is supported by indexes of type + `persistent`. The attribute controls whether an extra in-memory hash cache is + created for the index. The hash cache can be used to speed up index lookups. + The cache can only be used for queries that look up all index attributes via + an equality lookup (`==`). The hash cache cannot be used for range scans, + partial lookups or sorting. + The cache will be populated lazily upon reading data from the index. Writing data + into the collection or updating existing data will invalidate entries in the + cache. The cache may have a negative effect on performance in case index values + are updated more often than they are read. + The maximum size of cache entries that can be stored is currently 4 MB, i.e. + the cumulated size of all index entries for any index lookup value must be + less than 4 MB. This limitation is there to avoid storing the index entries + of "super nodes" in the cache. + `cacheEnabled` defaults to `false` and should only be used for indexes that + are known to benefit from an extra layer of caching. + +Also check the documentation of the specific index type for additional options. + +**Examples** + +```js +--- +name: collectionEnsureIndex +description: '' +--- +~db._create("test"); +db.test.ensureIndex({ type: "persistent", fields: [ "a" ], sparse: true }); +db.test.ensureIndex({ type: "persistent", fields: [ "a", "b" ], unique: true }); +~db._drop("test"); +``` + +### Dropping an index via a collection object + +`collection.dropIndex(index)` + +Delete the specified index using an index object. + +If the index does not exist or cannot be dropped, then an error is raised. +If the index existed and has been dropped, then `true` is returned. + +Note that you cannot drop certain indexes (e.g. the primary index of a +collection or the edge index of an edge collection). + +--- + +`collection.dropIndex(index-identifier)` + +Delete the specified index using an index identifier. + +```js +--- +name: col_dropIndex +description: '' +--- +~db._create("example"); +var idx1 = db.example.ensureIndex({ type: "persistent", fields: ["a", "b"] }); +var idx2 = db.example.ensureIndex({ type: "persistent", fields: ["c"] }); +var indexInfo = db.example.indexes(); +indexInfo; +db.example.dropIndex(indexInfo[1]) +db.example.dropIndex(indexInfo[2].id) +indexInfo = db.example.indexes(); +~db._drop("example"); +``` + +### Load Indexes into Memory + +Loads suitable indexes of this collection into memory: + +`collection.loadIndexesIntoMemory()` + +This function tries to cache index entries of this collection in main memory. +Index lookups that can be served from the memory cache can be much faster +than lookups not stored in the cache, so you can get a nice performance boost. + +The function iterates over suitable indexes of the collection and stores the +indexed values, not the entire document data, in memory. +This is implemented for edge indexes only. + +The function returns as soon as the index warmup has been scheduled. The index +warmup may still be ongoing in the background, even after the function has already +returned. As all suitable indexes are scanned, it may cause significant +I/O activity and background load. + +This function honors memory limits. If the indexes you want to load are smaller +than your memory limit, this function guarantees that most index values are +cached. If the index is larger than your memory limit, this function fills +up values up to this limit and there is no way to control +which indexes of the collection should have priority over others. + +It is guaranteed at all times that the in-memory cache data is consistent with +the stored index data. + +```js +--- +name: loadIndexesIntoMemory +description: '' +--- +~db._drop("example"); +~db._createEdgeCollection("example"); +db.example.loadIndexesIntoMemory(); +~db._drop("example"); +``` + +## Database Methods + +### Fetching an index by identifier + +`db._index(index-identifier)` + +Find and return the specified index, or `null` if no such index exists. + +```js +--- +name: IndexIdentifier +description: '' +--- +~db._create("example"); +db.example.ensureIndex({ type: "persistent", fields: [ "a", "b" ] }); +var indexInfo = db.example.indexes().map(function(x) { return x.id; }); +indexInfo; +db._index(indexInfo[0]) +db._index(indexInfo[1]) +~db._drop("example"); +``` + +### Dropping an index via a database object + +`db._dropIndex(index)` + +Delete the specified index using an index object. + +If the index does not exist or cannot be dropped, an error is raised. +If the index existed and has been dropped, then `true` is returned. + +--- + +`db._dropIndex(index-identifier)` + +Drop the specified index using an index identifier. + +```js +--- +name: dropIndex +description: '' +--- +~db._create("example"); +var idx1 = db.example.ensureIndex({ type: "persistent", fields: [ "a", "b" ] }); +var idx2 = db.example.ensureIndex({ type: "persistent", fields: [ "c" ] }); +var indexInfo = db.example.indexes(); +indexInfo; +db._dropIndex(indexInfo[1]) +db._dropIndex(indexInfo[2].id) +indexInfo = db.example.indexes(); +~db._drop("example"); +``` + +### Revalidating whether an index is used + +So you've created an index, and since its maintenance isn't for free, +you definitely want to know whether your query can utilize it. + +You can use explain to verify that a certain index is used: + +```js +--- +name: IndexVerify +description: '' +--- +~db._create("example"); +var explain = require("@arangodb/aql/explainer").explain; +var idx = db.example.ensureIndex({ type: "persistent", fields: [ "a", "b" ] }); +explain("FOR doc IN example FILTER doc.a < 23 RETURN doc", {colors: false}); +~db._drop("example"); +``` + +You can omit `colors: false` to get syntax highlighting in _arangosh_. diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/fulltext-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/fulltext-indexes.md new file mode 100644 index 0000000000..56fd05362f --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/fulltext-indexes.md @@ -0,0 +1,106 @@ +--- +title: Fulltext indexes +menuTitle: Fulltext Indexes +weight: 20 +description: >- + Indexes for full-text split strings into words that you can then search for +--- +{{< warning >}} +The fulltext index type is deprecated from version 3.10 onwards. +It is recommended to use [Inverted indexes](inverted-indexes.md) or +[ArangoSearch](../../arangosearch/_index.md) for advanced full-text search capabilities. +{{< /warning >}} + +## Introduction to Fulltext Indexes + +A fulltext index can be used to find words, or prefixes of words inside documents. + +A fulltext index can be defined on one attribute only, and will include all words contained in +documents that have a textual value in the index attribute. The index +will also include words from the index attribute if the index attribute is an array of +strings, or an object with string value members. + +For example, given a fulltext index on the `translations` attribute and the following +documents, then searching for `лиса` using the fulltext index would return only the +first document. Searching for the index for the exact string `Fox` would return the first +two documents, and searching for `prefix:Fox` would return all three documents: + +```js +{ translations: { en: "fox", de: "Fuchs", fr: "renard", ru: "лиса" } } +{ translations: "Fox is the English translation of the German word Fuchs" } +{ translations: [ "ArangoDB", "document", "database", "Foxx" ] } +``` + +Note that deeper nested objects are ignored. For example, a fulltext index on +`translations` would index `Fuchs`, but not `fox`, given the following document +structure: + +```js +{ translations: { en: { US: "fox" }, de: "Fuchs" } } +``` + +If you need to search across multiple fields and/or nested objects, you may write +all the strings into a special attribute, which you then create the index on +(it might be necessary to clean the strings first, e.g. remove line breaks and +strip certain words). + +If the index attribute is neither a string, an object or an array, its contents will +not be indexed. When indexing the contents of an array attribute, an array member will +only be included in the index if it is a string. When indexing the contents of an object +attribute, an object member value will only be included in the index if it is a string. +Other data types are ignored and not indexed. + +Word tokenization is performed using the word boundary analysis provided by +[ICU](http://site.icu-project.org/), which takes the selected +server language into account. + +Words are indexed in all lower-case. Only words with a (specifiable) minimum +length are indexed. + +## Accessing Fulltext Indexes from the Shell + +Ensures that a fulltext index exists: + +`collection.ensureIndex({ type: "fulltext", fields: [ "field" ], minLength: minLength })` + +Creates a fulltext index on all documents on attribute `field`. + +Fulltext indexes are implicitly sparse: all documents which do not have +the specified `field` attribute or that have a non-qualifying value in their +`field` attribute will be ignored for indexing. + +Only a single attribute can be indexed. Specifying multiple attributes is +unsupported. + +The minimum length of words that are indexed can be specified via the +`minLength` parameter. Words shorter than minLength characters will +not be indexed. `minLength` has a default value of 2, but this value might +be changed in future versions of ArangoDB. It is thus recommended to explicitly +specify this value. + +In case that the index was successfully created, an object with the index +details is returned. + +```js +--- +name: ensureFulltextIndex +description: '' +--- +~db._create("example"); +db.example.ensureIndex({ type: "fulltext", fields: [ "text" ], minLength: 3 }); +db.example.save([ + { text : "the quick brown", b : { c : 1 } }, + { text : "quick brown fox", b : { c : 2 } }, + { text : "brown fox jumps", b : { c : 3 } }, + { text : "fox jumps over", b : { c : 4 } }, + { text : "jumps over the", b : { c : 5 } }, + { text : "over the lazy", b : { c : 6 } }, + { text : "the lazy dog", b : { c : 7 } } +]); +db._query("FOR document IN FULLTEXT(example, 'text', 'quick') RETURN document").toArray(); +~db._drop("example"); +``` + +## Fulltext AQL Functions + +Fulltext AQL functions are detailed in [Fulltext functions](../../../aql/functions/fulltext.md). diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md new file mode 100644 index 0000000000..6feb707e61 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md @@ -0,0 +1,434 @@ +--- +title: Geo-Spatial Indexes +menuTitle: Geo-spatial Indexes +weight: 30 +description: >- + Indexing GeoJSON geometry and latitude/longitude pairs can accelerate + geo-spatial queries +--- +The geo-spatial index type in ArangoDB is based on [Google S2](http://s2geometry.io/). +Indexing is supported for a subset of the [**GeoJSON**](../../../aql/functions/geo.md#geojson) +geometry types as well as simple latitude/longitude pairs. + +AQL's geospatial functions and GeoJSON constructors are described in +[Geo functions](../../../aql/functions/geo.md). + +You can also perform +[geospatial searches with ArangoSearch](../../arangosearch/geospatial-search.md). + +## Using a Geo-Spatial Index + +The geospatial index supports distance, containment, and intersection +queries for various geometric 2D shapes. You should mainly be using AQL queries +to perform these types of operations. The index can operate in **two different +modes**, depending on if you want to use the GeoJSON data-format or not. The modes +are mainly toggled by using the `geoJson` field when creating the index. + +This index assumes coordinates with the latitude between -90 and 90 degrees and the +longitude between -180 and 180 degrees. A geo index ignores all +documents which do not fulfill these requirements. + +### GeoJSON Mode + +To create an index in GeoJSON mode execute: + +```js +collection.ensureIndex({ type: "geo", fields: [ "geometry" ], geoJson: true }) +``` + +This creates the index on all documents and uses _geometry_ as the attributed +field where the value is either a +[Geometry Object](https://tools.ietf.org/html/rfc7946#section-3.1) +**or** a _coordinate array_. The array must contain at least two numeric values +with longitude (first value) and latitude (second value). This corresponds +to the format described in +[RFC 7946 Position](https://tools.ietf.org/html/rfc7946#section-3.1.1). + +All documents, that do not have the attribute path or have a non-conforming +value in it, are excluded from the index. + +A geo index is implicitly sparse, and there is no way to control its +sparsity. +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +For technical details on how ArangoDB interprets GeoJSON objects, see +[GeoJSON Interpretation](../../../aql/functions/geo.md#geojson-interpretation). +In short: the **syntax** of GeoJSON is used, but polygon boundaries and lines +between points are interpreted as geodesics (pieces of great circles on Earth). + +### Non-GeoJSON mode + +This index mode exclusively supports indexing on coordinate arrays. Values that +contain GeoJSON or other types of data are ignored. In the non-GeoJSON mode +the index can be created on one or two fields. + +The following examples work in the _arangosh_ command shell. + +To create a geo-spatial index on all documents using `latitude` and +`longitude` as separate attribute paths, two paths need to be specified +in the `fields` array: + +`collection.ensureIndex({ type: "geo", fields: [ "latitude", "longitude" ] })` + +The first field is always defined to be the _latitude_ and the second is the +_longitude_. The `geoJson` flag is implicitly _false_ in this mode. + +Alternatively you can specify only one field: + +`collection.ensureIndex({ type: "geo", fields: [ "location" ], geoJson: false })` + +It creates a geospatial index on all documents using `location` as the path to the +coordinates. The value of the attribute has to be an array with at least two +numeric values. The array must contain the latitude (first value) and the +longitude (second value). + +All documents, which do not have the attribute path(s) or have a non-conforming +value in it, are excluded from the index. + +A geo index is implicitly sparse, and there is no way to control its +sparsity. +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +{{< warning >}} +If the `geoJson` option is `false`, GeoJSON data is **not indexed**. +Some queries can have different results with and without such a geo-spatial index. + +For example, if you have documents with proper GeoJSON data in an attribute +called `geo`, then the following query matches all of them: + +```aql +FOR doc IN coll + FILTER GEO_DISTANCE(doc.geo, GEO_POINT(10, 10)) >= 0 + RETURN doc +``` + +The `GEO_DISTANCE()` function correctly parses the data, takes the centroid, +computes the distance to `GEO_POINT(10, 10)` (which is non-negative regardless +of the `geo` object), and lets the document through. + +However, a geo-spatial index with `geoJson` set to `false` doesn't index the +`geo` attribute if it contains GeoJSON data and ignores these documents. If the +same query is executed with the geo-spatial index, it doesn't find the documents. +{{< /warning >}} + +### Legacy Polygons + +Between ArangoDB 3.10 and earlier versions, two things have changed: + +- boundaries of polygons are now geodesics and there is no special + and inconsistent treatment of "rectangles" any more +- linear rings are interpreted according to the rules and no longer + "normalized" + +See [GeoJSON Interpretation](../../../aql/functions/geo.md#geojson-interpretation) +for details. + +For backward compatibility, a `legacyPolygons` option has been introduced +for geo indexes. It is relevant for those that have `geoJson` set to +`true` only. Geo indexes created in versions before 3.10 always +implicitly have the `legacyPolygons` option set to `true`. Newly generated +geo indexes from 3.10 onward have the `legacyPolygons` option set to `false` +by default. However, you can still explicitly overwrite the setting with +`true` to create a legacy index, but it is not recommended. + +A geo index with `legacyPolygons` set to `true` uses the old, pre-3.10 +rules for the parsing GeoJSON polygons. This allows you to let old indexes +produce the same, potentially wrong results as before an upgrade. A geo index +with `legacyPolygons` set to `false` uses the new, correct and consistent +method for parsing of GeoJSON polygons. + +If you use a geo index and upgrade from a version below 3.10 to a version of +3.10 or higher, it is recommended that you drop your old geo indexes +and create new ones with `legacyPolygons` set to `false`. + +If you use `geojson` Analyzers and upgrade from a version below 3.10 to a +version of 3.10 or higher, the interpretation of GeoJSON Polygons changes. +See the `legacy` property of the [`geojson` Analyzer](../../analyzers.md#geojson). + +{{< warning >}} +It is possible that you might have been relying on the old (wrong) parsing of +GeoJSON polygons unknowingly. If you have polygons in your data that mean to +refer to a relatively small region, but have the boundary running clockwise +around the intended interior, they are interpreted as intended prior to 3.10, +but from 3.10 onward, they are interpreted as "the other side" of the boundary. + +Whether a clockwise boundary specifies the complement of the small region +intentionally or not cannot be determined automatically. Please test the new +behavior manually. +{{< /warning >}} + +### *arangosh* Examples + +Ensures that a geo index exists: + +`collection.ensureIndex({ type: "geo", fields: [ "location" ] })` + +Creates a geospatial index on all documents using `location` as the path to the +coordinates. The value of the attribute has to be an array with at least two +numeric values. The array must contain the latitude (first value) and the +longitude (second value). + +All documents, which do not have the attribute path or have a non-conforming +value in it, are excluded from the index. + +A geo index is implicitly sparse, and there is no way to control its +sparsity. + +The index does not provide a `unique` option because of its limited usability. +It would prevent identical coordinate pairs from being inserted only, but even a +slightly different location (like 1 inch or 1 cm off) would be unique again and +not considered a duplicate, although it probably should. The desired threshold +for detecting duplicates may vary for every project (including how to calculate +the distance even) and needs to be implemented on the application layer as +needed. You can write a [Foxx service](../../../develop/foxx-microservices/_index.md) for this purpose and +make use of the [Geo-spatial functions in AQL](../../../aql/functions/geo.md) to find nearby +locations supported by a geo index. + +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +--- + +To create a geo index on an array attribute that contains longitude first, set +the `geoJson` attribute to `true`. This corresponds to the format described in +[RFC 7946 Position](https://tools.ietf.org/html/rfc7946#section-3.1.1) + +`collection.ensureIndex({ type: "geo", fields: [ "location" ], geoJson: true })` + +--- + +To create a geo-spatial index on all documents using `latitude` and `longitude` +as separate attribute paths, two paths need to be specified in the `fields` +array: + +`collection.ensureIndex({ type: "geo", fields: [ "latitude", "longitude" ] })` + +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +**Examples** + +Create a geo index for an array attribute: + +```js +--- +name: geoIndexCreateForArrayAttribute1 +description: '' +--- +~db._create("geo"); +db.geo.ensureIndex({ type: "geo", fields: [ "loc" ] }); +~db._drop("geo"); +``` + +Create a geo index for an array attribute: + +```js +--- +name: geoIndexCreateForArrayAttribute2 +description: '' +--- +~db._create("geo2"); +db.geo2.ensureIndex({ type: "geo", fields: [ "location.latitude", "location.longitude" ] }); +~db._drop("geo2"); +``` + +Use a geo index with the AQL `SORT` operation: + +```js +--- +name: geoIndexSortOptimization +description: '' +--- +~db._create("geoSort"); +var idx = db.geoSort.ensureIndex({ type: "geo", fields: [ "latitude", "longitude" ] }); +for (i = -90; i <= 90; i += 10) { + for (j = -180; j <= 180; j += 10) { + db.geoSort.save({ name : "Name/" + i + "/" + j, latitude : i, longitude : j }); + } +} +var query = "FOR doc in geoSort SORT DISTANCE(doc.latitude, doc.longitude, 0, 0) LIMIT 5 RETURN doc" +db._explain(query, {}, {colors: false}); +db._query(query).toArray(); +~db._drop("geoSort"); +``` + +Use a geo index with the AQL `FILTER` operation: + +```js +--- +name: geoIndexFilterOptimization +description: '' +--- +~db._create("geoFilter"); +var idx = db.geoFilter.ensureIndex({ type: "geo", fields: [ "latitude", "longitude" ] }); +for (i = -90; i <= 90; i += 10) { + for (j = -180; j <= 180; j += 10) { + db.geoFilter.save({ name : "Name/" + i + "/" + j, latitude : i, longitude : j }); + } +} +var query = "FOR doc in geoFilter FILTER DISTANCE(doc.latitude, doc.longitude, 0, 0) < 2000 RETURN doc" +db._explain(query, {}, {colors: false}); +db._query(query).toArray(); +~db._drop("geoFilter"); +``` + +## Indexed GeoSpatial Queries + +The geospatial index supports a variety of AQL queries, which can be built with the help +of the [geo utility functions](../../../aql/functions/geo.md). There are three specific +geo functions that can be optimized, provided they are used correctly: +`GEO_DISTANCE()`, `GEO_CONTAINS()`, `GEO_INTERSECTS()`. Additionally, there is a built-in support to optimize +the older geo functions `DISTANCE()`, `NEAR()`, and `WITHIN()` (the last two +only if they are used in their 4 argument version, without `distanceName`). + +When in doubt whether your query is being properly optimized, +check the [AQL explain](../../../aql/execution-and-performance/explaining-queries.md) +output to check for index usage. + +### Query for Results near Origin (NEAR type query) + +A basic example of a query for results near an origin point: + +```aql +FOR x IN geo_collection + FILTER GEO_DISTANCE([@lng, @lat], x.geometry) <= 100000 + RETURN x._key +``` + +or + +```aql +FOR x IN geo_collection + FILTER GEO_DISTANCE(@geojson, x.geometry) <= 100000 + RETURN x._key +``` + +The function `GEO_DISTANCE()` always returns the distance in meters, so this +query receives results up until _100km_. + +The first parameter can be a GeoJSON object or a coordinate array in +`[longitude, latitude]` ordering. The second parameter is the document field +on that the index was created. + +In case of a GeoJSON object in the first parameter, the distance is measured +from the **centroid of the object to the indexed point**. If the index has +`geoJson` set to `true`, then the distance is measured from the +**centroid of the object to the centroid of the indexed object**. This can +be unexpected if not all GeoJSON objects are points, but it is what the index +can actually provide. + +### Query for Sorted Results near Origin (NEAR type query) + +A basic example of a query for the 1000 nearest results to an origin point (ascending sorting): + +```aql +FOR x IN geo_collection + SORT GEO_DISTANCE([@lng, @lat], x.geometry) ASC + LIMIT 1000 + RETURN x._key +``` + +The first parameter can be a GeoJSON object or a coordinate array in +`[longitude, latitude]` ordering. The second parameter is the document field +on that the index was created. + +In case of a GeoJSON object in the first parameter, the distance is measured +from the **centroid of the object to the indexed point**. If the index has +`geoJson` set to `true`, then the distance is measured from the +**centroid of the object to the centroid of the indexed object**. This can +be unexpected if not all GeoJSON objects are points, but it is what the index +can actually provide. + +You may also get results farthest away (distance sorted in descending order): + +```aql +FOR x IN geo_collection + SORT GEO_DISTANCE([@lng, @lat], x.geometry) DESC + LIMIT 1000 + RETURN x._key +``` + +### Query for Results within a Distance Range + +A query which returns documents at a distance of _1km_ or farther away, +and up to _100km_ from the origin: + +```aql +FOR x IN geo_collection + FILTER GEO_DISTANCE([@lng, @lat], x.geometry) <= 100000 + FILTER GEO_DISTANCE([@lng, @lat], x.geometry) >= 1000 + RETURN x +``` + +This returns the documents with a GeoJSON value that is located in +the specified search annulus. + +The first parameter can be a GeoJSON object or a coordinate array in +`[longitude, latitude]` ordering. The second parameter is the document field +on that the index was created. + +In case of a GeoJSON object in the first parameter, the distance is measured +from the **centroid of the object to the indexed point**. If the index has +`geoJson` set to `true`, then the distance is measured from the +**centroid of the object to the centroid of the indexed object**. This can +be unexpected if not all GeoJSON objects are points, but it is what the index +can actually provide. + +Note that all these `FILTER GEO_DISTANCE(...)` queries can be combined with a +`SORT` clause on `GEO_DISTANCE()` (provided they use the same basis point), +resulting in a sequence of findings sorted by distance, but limited to the given +`GEO_DISTANCE()` boundaries. + +### Query for Results contained in Polygon + +A query which returns documents whose stored geometry is contained within a +GeoJSON Polygon. + +```aql +LET polygon = GEO_POLYGON([[[60,35],[50,5],[75,10],[70,35],[60,35]]]) +FOR x IN geo_collection + FILTER GEO_CONTAINS(polygon, x.geometry) + RETURN x +``` + +The first parameter of `GEO_CONTAINS()` must be a polygon. Other types +are not really sensible, since for example a point cannot contain other GeoJSON +objects than itself, and for others like lines, containment is not defined in a +numerically stable way. The second parameter must contain the document field on +that the index was created. + +This `FILTER` clause can be combined with a `SORT` clause using `GEO_DISTANCE()`. + +Note that containment in the opposite direction is currently not supported by +geo indexes: + +```aql +LET polygon = GEO_POLYGON([[[60,35],[50,5],[75,10],[70,35],[60,35]]]) +FOR x IN geo_collection + FILTER GEO_CONTAINS(x.geometry, polygon) + RETURN x +``` + +### Query for Results Intersecting a Polygon + +A query that returns documents with an intersection of their stored +geometry and a GeoJSON Polygon. + +```aql +LET polygon = GEO_POLYGON([[[60,35],[50,5],[75,10],[70,35],[60,35]]]) +FOR x IN geo_collection + FILTER GEO_INTERSECTS(polygon, x.geometry) + RETURN x +``` + +The first parameter of `GEO_INTERSECTS()` is usually a polygon. + +The second parameter must contain the document field on that the index +was created. + +This `FILTER` clause can be combined with a `SORT` clause using `GEO_DISTANCE()`. diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/inverted-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/inverted-indexes.md new file mode 100644 index 0000000000..81c8a894e5 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/inverted-indexes.md @@ -0,0 +1,630 @@ +--- +title: Inverted indexes +menuTitle: Inverted Indexes +weight: 10 +description: >- + You can use inverted indexes to speed up a broad range of AQL queries, + from simple to complex, including full-text search +--- +Documents hold attributes, mapping attribute keys to values. +Inverted indexes store mappings from values (of document attributes) to their +locations in collections. You can create these indexes to accelerate queries +like value lookups, range queries, accent- and case-insensitive search, +wildcard and fuzzy search, nested search, as well as for +sophisticated full-text search with the ability to search for words, phrases, +and more. + +You can use inverted indexes as follows: + +- Stand-alone in `FILTER` operations of AQL queries. + +- Add them to [`search-alias` Views](../../arangosearch/_index.md#getting-started-with-arangosearch) + to search multiple collections at once and to rank search results by relevance. + +## Defining inverted indexes + +Inverted indexes are defined per collection. You can add an arbitrary number of +document attributes to each index. Every attribute can optionally be processed +with an [Analyzer](../../analyzers.md), for instance, to tokenize text into words. + +### Basic definition + +For example, you can create an inverted index for the attributes `value1` and +`value2` with the following command in arangosh: + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: ["value1", "value2"] +}); +``` + +You should give inverted indexes easy-to-remember names because you need to +refer to them with `indexHint` in queries to +[utilize inverted indexes](#utilizing-inverted-indexes-in-queries): + +```js +db.<collection>.ensureIndex({ + name: "inverted_index_name", + type: "inverted", + fields: ["value1", "value2"] +}); +``` + +### Processing fields with Analyzers + +The fields are processed by the `identity` Analyzer by default, which indexes +the attribute values as-is. To define a different Analyzer, you can pass an +object with the field settings instead. For example, you can use the default +Analyzer for `value1` and the built-in `text_en` Analyzer for `value2`. +You can also overwrite the `features` of an Analyzer: + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: [ + "value1", + { name: "value2", analyzer: "text_en", features: [ "frequency", "norm", "position", "offset" ] } + ] +}); +``` + +You can define default `analyzer` and `features` value at the top-level of the +index property. In the following example, both fields are indexed with the +`text_en` Analyzer: + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: ["value1", "value2" ], + analyzer: "text_en" +}); +``` + +If no `features` are defined in `fields` nor at the top-level, then the features +defined by the Analyzer itself are used. + +### Indexing sub-attributes + +To index a sub-attribute, like `{ "attr": { "sub": "value" } }`, use the +`.` character for the description of the attribute path: + +```js +db.<collection>.ensureIndex({ type: "inverted", fields: ["attr.sub"] }); +``` + +For `SEARCH` queries using a `search-alias` View, you can also index all +sub-attribute of an attribute with the `includeAllFields` options. It has no +effect on `FILTER` queries that use an inverted index directly, however. You can +enable the option for specific attributes in the `fields` definition, or for the +entire document by setting the option at the top-level of the index properties: + +```js +db.<collection>.ensureIndex({ type: "inverted", fields: [ { name: "attr", includeAllFields: true } ] }); +db.<collection>.ensureIndex({ type: "inverted", includeAllFields: true }); +``` + +With the `includeAllFields` option enabled at the top-level, the otherwise +mandatory `fields` property becomes optional. + +The `includeAllFields` option only includes the remaining fields that are not +separately specified in the `fields` definition, including their sub-attributes. + +### Indexing array values + +You can expand an attribute with an array as value so that its elements get +indexed individually by using `[*]` in the attribute path. For example, to +index the string values of a document like +`{ "arr": [ { "name": "foo" }, { "name": "bar" } ] }`, use `arr[*].name`: + +```js +db.<collection>.ensureIndex({ type: "inverted", fields: ["arr[*].name"] }); +``` + +You can only expand one level of arrays. + +If you want to use the inverted index in a `search-alias` View and index primitive +and array values like `arangosearch` Views do by default, then you can enable the +`searchField` option for specific attributes in the `fields` definition, or by +default using the top-level option with the same name. You may want to combine +it with the `includeAllFields` option to index sub-objects without explicit +definition: + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: [ + { name: "arr", searchField: true, includeAllFields: true } + ] +}); +``` + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: [ "arr", "arr.name" ], + searchField: true +}); +``` + +To index array values but preserve the array indexes for a `search-alias` View, +which you then also need to specify in queries, enable the `trackListPositions` +option (requires `searchField` to be `true`): + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: [ + { name: "arr", searchField: true, trackListPositions: true, includeAllFields: true } + ] +}); +``` + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: [ "arr", "arr.name" ], + searchField: true, + trackListPositions: true +}); +``` + +### Storing additional values in indexes + +Inverted indexes allow you to store additional attributes in the index that +can be used to satisfy projections of the document. They cannot be used for +index lookups, but for projections and sorting only. They allow inverted +indexes to fully cover more queries and avoid extra document lookups. This can +have a great positive effect on index scan performance if the number of scanned +index entries is large. + +You can set the `storedValues` option when creating a new inverted index and +specify the additional attributes as an array of objects, each with a `fields` +attribute defining the attribute paths to add to the index: + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: ["value1"], + storedValues: [ { fields: ["value1", "value2"] } ] +}); +``` + +This indexes the `value1` attribute in the traditional sense, so that the index +can be used for looking up by `value1` or for sorting by `value1`. + +In addition, due to `storedValues` being used here, the index can also supply +the values for the `value1` and `value2` attributes for projections without +having to look up the document. The values can be read from the index instead. +Non-existing attributes are stored as `null` values. + +You may specify the same attribute paths in both the `fields` and the +`storedValues` option. This is useful if you want to filter by an attribute and +also return it using an AQL query. The attribute values indexed by `fields` +cannot be utilized for projections because the index representation does not +match the original values as stored in the documents. + +Attribute paths specified in the `primarySort` option can be utilized for +projections. Therefore, you don't need to add them to `storedValues`, too. + +For each object in the `storedValues` array, you can additionally set a +`compression` (`lz4` by default) and `cache` option (`false` by default): + +```js +db.<collection>.ensureIndex({ + type: "inverted", + fields: ["value1"], + storedValues: [ + { fields: ["value1"], compression: "lz4", cache: false }, + { fields: ["value2"], compression: "none", cache: true } + ] +}); +``` + +See [Optimizing View and inverted index query performance](../../arangosearch/performance.md#stored-values) +for details. + +You may use the following shorthand notations on index creation instead of +an array of objects as described above. The default compression and cache +settings are used in this case: + +- An array of strings, like `["attr1", "attr2"]`, to place each attribute into + a separate column of the index (introduced in v3.10.3). + +- An array of arrays of strings, like `[["attr1", "attr2"]]`, to place the + attributes into a single column of the index, or `[["attr1"], ["attr2"]]` + to place each attribute into a separate column. You can also mix it with the + full form: + + ```json + [ + ["attr1"], + ["attr2", "attr3"], + { "fields": ["attr4", "attr5"], "cache": true } + ] + ``` + +### Additional configuration options + +See the full list of options in the [HTTP API](../../../develop/http-api/indexes/inverted.md) +documentation. + +### Restrictions + +- You cannot index the same field twice in a single inverted index. This includes + indexing the same field with and without array expansion (e.g. + `fields: ["arr", "arr[*]"]`). +- Every field can only be processed by a single Analyzer per index. The benefit + is that you don't need to specify the Analyzers in queries with the `ANALYZER()` + function, they can be inferred from the index definition. + +If you plan on using inverted indexes in `search-alias` Views, also consider the +following restrictions in addition: + +- All inverted indexes you add to a single `search-alias` View need to have + matching `primarySort` and `storedValues` settings. +- If different inverted indexes index fields with the same name (attribute path), + these fields need to have matching `analyzer` and `searchField` settings. +- Fields that are implicitly indexed by `includeAllFields` must also have + the same `analyzer` and `searchField` settings as fields with the same + attribute path indexed by other inverted indexes. You cannot combine inverted + indexes in a `search-alias` View if these settings would be ambiguous for any + field. + +## Utilizing inverted indexes in queries + +Unlike other index types in ArangoDB, inverted indexes are not utilized +automatically, even if they are eligible for a query. The reason is that AQL +queries may produce different results with and without an inverted index, +because of differences in how `FILTER` operations work for inverted indexes, +the eventual-consistent nature of this index type, and for backward compatibility. + +To use an inverted index, add an `OPTIONS` clause to the `FOR` operation that +you want to speed up. It needs to be a loop over a collection, not an array or +a View. Specify the desired index as an `indexHint`, using its name. + +You should enable the `forceIndexHint` option to prevent unexpected query +results: Index hints are only recommendations you provide to +the optimizer unless you force them, and because `FILTER` queries behave +differently if an inverted index is used, the results would be inconsistent, +depending on whether or not the index hint is used. Forcing the hint ensures +that an error is raised if the index isn't suitable. + +```aql +FOR doc IN coll OPTIONS { indexHint: "inverted_index_name", forceIndexHint: true } + FILTER doc.value == 42 AND PHRASE(doc.text, ["meaning", 1, "life"]) + RETURN doc +``` + +Inverted indexes are eventually consistent. Document changes are not reflected +instantly, but only near-realtime. There is an internal option to wait for the +inverted index to update. This option is intended to be used **in unit tests only**: + +```aql +FOR doc IN coll { indexHint: "inv-idx", forceIndexHint: true, waitForSync: true } + FILTER doc.value != null ... // an arbitrary expression that the index can cover +``` + +This is not necessary if you use a single server deployment and populate a +collection with documents before creating an inverted index. + +Also see [Dealing with eventual consistency](../../arangosearch/_index.md#dealing-with-eventual-consistency). + +## Examples + +The following examples demonstrate how you can set up and use inverted indexes +with the JavaScript API of arangosh. See the +[`ensureIndex()` method](_index.md#creating-an-index) +description for details. + +For more in-depth explanations and example data, see the +[ArangoSearch example datasets](../../arangosearch/example-datasets.md) and the +corresponding ArangoSearch examples. + +### Exact value matching + +Match exact movie title (case-sensitive, full string): + +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact", type: "inverted", fields: [ "title" ] }); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-exact", forceIndexHint: true } + FILTER doc.title == "The Matrix" + RETURN KEEP(doc, "title", "tagline")`); +``` + +Match multiple exact movie titles using `IN`: + +```js +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-exact", forceIndexHint: true } + FILTER doc.title IN ["The Matrix", "The Matrix Reloaded"] + RETURN KEEP(doc, "title", "tagline")`); +``` + +Match movies that neither have the title `The Matrix` nor `The Matrix Reloaded`, +but ignore documents without a title: + +```js +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-exact", forceIndexHint: true } + FILTER doc.title != null AND doc.title NOT IN ["The Matrix", "The Matrix Reloaded"] + RETURN doc.title`); +``` + +### Range queries + +Match movies with a runtime over `300` minutes and sort them from longest to +shortest runtime. You can give the index a primary sort order so that the `SORT` +operation of the query can be optimized away: + +```js +db.imdb_vertices.ensureIndex({ + name: "inv-exact-runtime", + type: "inverted", + fields: [ "runtime" ], + primarySort: { + fields: [ + { field: "runtime", direction: "desc" } + ] + } +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-exact-runtime", forceIndexHint: true } + FILTER doc.runtime > 300 + SORT doc.runtime DESC + RETURN KEEP(doc, "title", "runtime")`); +``` + +Match movies where the name is `>= Wu` and `< Y`: + +```js +db.imdb_vertices.ensureIndex({ name: "inv-exact-name", type: "inverted", fields: [ "name" ] }); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-exact-name", forceIndexHint: true } + FILTER IN_RANGE(doc.name, "Wu", "Y", true, false) + RETURN doc.name`); +``` + +{{< warning >}} +The alphabetical order of characters is not taken into account, +i.e. range queries backed by inverted indexes do not follow the +language rules as per the defined Analyzer locale (except for the +[`collation` Analyzer](../../analyzers.md#collation)) nor the server language +(startup option `--default-language`)! +Also see [Known Issues](../../../release-notes/version-3.11/known-issues-in-3-11.md#arangosearch). +{{< /warning >}} + +### Case-insensitive search + +Match movie titles, ignoring capitalization and using the base characters +instead of accented characters (full string): + +```js +var analyzers = require("@arangodb/analyzers"); +analyzers.save("norm_en", "norm", { locale: "en", accent: false, case: "lower" }); + +db.imdb_vertices.ensureIndex({ + name: "inv-ci", + type: "inverted", + fields: [ + { name: "title", analyzer: "norm_en" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-ci", forceIndexHint: true } + FILTER doc.title == TOKENS("thé mäTRïX", "norm_en")[0] + RETURN doc.title`); +``` + +### Prefix matching + +Match movie titles that start with either `"the matr"` or `"harry pot"` +(case-insensitive and accent-insensitive, using a custom `norm` Analyzer), +utilizing the feature of the `STARTS_WITH()` function that allows you to pass +multiple possible prefixes as array of strings, of which one must match: + +```js +var analyzers = require("@arangodb/analyzers"); +analyzers.save("norm_en", "norm", { locale: "en", accent: false, case: "lower" }); + +db.imdb_vertices.ensureIndex({ + name: "inv-ci", + type: "inverted", + fields: [ + { name: "title", analyzer: "norm_en" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-ci", forceIndexHint: true } + FILTER STARTS_WITH(doc.title, ["the matr", "harry pot"]) + RETURN doc.title`); +``` + +### Wildcard search + +Match all titles that starts with `the matr` (case-insensitive) using `LIKE()`, +where `_` stands for a single wildcard character and `%` for an arbitrary amount: + +```js +var analyzers = require("@arangodb/analyzers"); +analyzers.save("norm_en", "norm", { locale: "en", accent: false, case: "lower" }); + +db.imdb_vertices.ensureIndex({ + name: "inv-ci", + type: "inverted", + fields: [ + { name: "title", analyzer: "norm_en" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-ci", forceIndexHint: true } + FILTER LIKE(doc.title, "the matr%") + RETURN doc.title`); +``` + +### Full-text token search + +Search for movies with both `dinosaur` and `park` in their description: + +```js +db.imdb_vertices.ensureIndex({ + name: "inv-text", + type: "inverted", + fields: [ + { name: "description", analyzer: "text_en" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-text", forceIndexHint: true } + FILTER TOKENS("dinosaur park", "text_en") ALL == doc.description + RETURN { + title: doc.title, + description: doc.description + }`); +``` + +### Phrase and proximity search + +Search for movies that have the (normalized and stemmed) tokens `biggest` and +`blockbust` in their description, in this order: + +```js +db.imdb_vertices.ensureIndex({ + name: "inv-text", + type: "inverted", + fields: [ + { name: "description", analyzer: "text_en" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-text", forceIndexHint: true } + FILTER PHRASE(doc.description, "BIGGEST Blockbuster") + RETURN { + title: doc.title, + description: doc.description + }`); +``` + +Match movies that contain the phrase `epic <something> film` in their +description, where `<something>` can be exactly one arbitrary token: + +```js +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-text", forceIndexHint: true } + FILTER PHRASE(doc.description, "epic", 1, "film", "text_en") + RETURN { + title: doc.title, + description: doc.description + }`); +``` + +### Fuzzy search + +Search for the token `galxy` in the movie descriptions with some fuzziness. +The maximum allowed Levenshtein distance is set to `1`. Everything with a +Levenshtein distance equal to or lower than this value will be a match and the +respective documents will be included in the search result. The query will find +the token `galaxy` as the edit distance to `galxy` is `1`. + +A custom `text` Analyzer with stemming disabled is used to improve the accuracy +of the Levenshtein distance calculation: + +```js +var analyzers = require("@arangodb/analyzers"); +analyzers.save("text_en_no_stem", "text", { locale: "en", accent: false, case: "lower", stemming: false, stopwords: [] }); + +db.imdb_vertices.ensureIndex({ + name: "inv-text-no-stem", + type: "inverted", + fields: [ + { name: "description", analyzer: "text_en_no_stem" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-text-no-stem", forceIndexHint: true } + FILTER LEVENSHTEIN_MATCH( + doc.description, + TOKENS("galxy", "text_en_no_stem")[0], + 1, // max distance + false // without transpositions + ) + RETURN { + title: doc.title, + description: doc.description + }`); +``` + +### Geo-spatial search + +Using the Museum of Modern Arts as reference location, find restaurants within +a 100 meter radius. Return the matches sorted by distance and include how far +away they are from the reference point in the result: + +```js +var analyzers = require("@arangodb/analyzers"); +analyzers.save("geojson", "geojson", {}, []); + +db.restaurants.ensureIndex({ + name: "inv-rest", + type: "inverted", + fields: [ + { name: "location", analyzer: "geojson" } + ] +}); + +db._query(`LET moma = GEO_POINT(-73.983, 40.764) +FOR doc IN restaurants OPTIONS { indexHint: "inv-rest", forceIndexHint: true } + FILTER GEO_DISTANCE(doc.location, moma) < 100 + LET distance = GEO_DISTANCE(doc.location, moma) + SORT distance + RETURN { + geometry: doc.location, + distance + }`); +``` + +### Nested search (Enterprise Edition) + +Example data: + +```js +db._create("exhibits"); +db.exhibits.save([ + { + "dimensions": [ + { "type": "height", "value": 35 }, + { "type": "width", "value": 60 } + ] + }, + { + "dimensions": [ + { "type": "height", "value": 47 }, + { "type": "width", "value": 72 } + ] + } +]); +``` + +Match documents with a `dimensions` array that contains one or two sub-objects +with a `type` of `"height"` and a `value` greater than `40`: + +```js +db.exhibits.ensureIndex({ + name: "inv-nest", + type: "inverted", + fields: [ + { + name: "dimensions", + nested: [ + { name: "type" }, + { name: "value" } + ] + } + ] +}); + +db._query(`FOR doc IN exhibits OPTIONS { indexHint: "inv-nest", forceIndexHint: true } + FILTER doc.dimensions[? 1..2 FILTER CURRENT.type == "height" AND CURRENT.value > 40] + RETURN doc +`); +``` + +Nested search is only available in the Enterprise Edition. diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md new file mode 100644 index 0000000000..051ec5fb0f --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md @@ -0,0 +1,172 @@ +--- +title: Multi-dimensional indexes +menuTitle: Multi-dimensional Indexes +weight: 25 +description: >- + Multi-dimensional indexes allow you to index two- or higher-dimensional data + such as time ranges, for efficient intersection of multiple range queries +--- +A multi-dimensional index maps multi-dimensional data in the form of multiple +numeric attributes to one dimension while mostly preserving locality so that +similar values in all of the dimensions remain close to each other in the mapping +to a single dimension. Queries that filter by multiple value ranges at once can +be better accelerated with such an index compared to a persistent index. + +The multi-dimensional index type is called `zkd`. + +{{< warning >}} +`zkd` indexes are an **experimental** feature. +{{< /warning >}} + + +The `fields` property of a `zkd` index describes which document attributes to +use as dimensions. It is required that the attributes are present and have +numeric values. + +Multi-dimensional indexes can be declared as `unique` to only allow a single +document with a given combination of attribute values, using all of the `fields` +attributes. + +## Querying documents within a 3D box + +Assume we have documents in a collection `points` of the form + +```json +{"x": 12.9, "y": -284.0, "z": 0.02} +``` + +and we want to query all documents that are contained within a box defined by +`[x0, x1] * [y0, y1] * [z0, z1]`. + +To do so one creates a multi-dimensional index on the attributes `x`, `y` and +`z`, e.g. in _arangosh_: + +```js +db.collection.ensureIndex({ + type: "zkd", + fields: ["x", "y", "z"], + fieldValueTypes: "double" +}); +``` + +Unlike with other indexes, the order of the `fields` does not matter. + +`fieldValueTypes` is required and the only allowed value is `"double"` to use a +double-precision (64-bit) floating-point format internally. + +Now we can use the index in a query: + +```aql +FOR p IN points + FILTER x0 <= p.x && p.x <= x1 + FILTER y0 <= p.y && p.y <= y1 + FILTER z0 <= p.z && p.z <= z1 + RETURN p +``` + +## Possible range queries + +Having an index on a set of fields does not require you to specify a full range +for every field. For each field you can decide if you want to bound +it from both sides, from one side only (i.e. only an upper or lower bound) +or not bound it at all. + +Furthermore you can use any comparison operator. The index supports `<=` and `>=` +naturally, `==` will be translated to the bound `[c, c]`. Strict comparison +is translated to their non-strict counterparts and a post-filter is inserted. + +```aql +FOR p IN points + FILTER 2 <= p.x && p.x < 9 + FILTER p.y >= 80 + FILTER p.z == 4 + RETURN p +``` + +## Example Use Case + +If you build a calendar using ArangoDB you could create a collection for each user +that contains the appointments. The documents would roughly look as follows: + +```json +{ + "from": 345365, + "to": 678934, + "what": "Dentist", +} +``` + +`from`/`to` are the timestamps when an appointment starts/ends. Having an +multi-dimensional index on the fields `["from", "to"]` allows you to query +for all appointments within a given time range efficiently. + +### Finding all appointments within a time range + +Given a time range `[f, t]` we want to find all appointments `[from, to]` that +are completely contained in `[f, t]`. Those appointments clearly satisfy the +condition + +``` +f <= from and to <= t +``` + +Thus our query would be: + +```aql +FOR app IN appointments + FILTER f <= app.from + FILTER app.to <= t + RETURN app +``` + +### Finding all appointments that intersect a time range + +Given a time range `[f, t]` we want to find all appointments `[from, to]` that +intersect `[f, t]`. Two intervals `[f, t]` and `[from, to]` intersect if +and only if + +``` +f <= to and from <= t +``` + +Thus our query would be: + +```aql +FOR app IN appointments + FILTER f <= app.to + FILTER app.from <= t + RETURN app +``` + +## Lookahead Index Hint + +<small>Introduced in: v3.10.0</small> + +Using the lookahead index hint can increase the performance for certain use +cases. Specifying a lookahead value greater than zero makes the index fetch +more documents that are no longer in the search box, before seeking to the +next lookup position. Because the seek operation is computationally expensive, +probing more documents before seeking may reduce the number of seeks, if +matching documents are found. Please keep in mind that it might also affect +performance negatively if documents are fetched unnecessarily. + +You can specify the `lookahead` value using the `OPTIONS` keyword: + +```aql +FOR app IN appointments OPTIONS { lookahead: 32 } + FILTER @to <= app.to + FILTER app.from <= @from + RETURN app +``` + +## Limitations + +Currently there are a few limitations: + +- Using array expansions for attributes is not possible (e.g. `array[*].attr`) +- The `sparse` property is not supported. +- You can only index numeric values that are representable as IEEE-754 double. +- A high number of dimensions (more than 5) can impact the performance considerably. +- The performance can vary depending on the dataset. Densely packed points can + lead to a high number of seeks. This behavior is typical for indexing using + space filling curves. diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/persistent-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/persistent-indexes.md new file mode 100644 index 0000000000..3fb116fa82 --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/persistent-indexes.md @@ -0,0 +1,309 @@ +--- +title: Persistent indexes +menuTitle: Persistent Indexes +weight: 5 +description: >- + The persistent index type is a generic kind of index you can define over + a single or multiple document attributes, as well as arrays +--- +It is possible to define a persistent index on one or more document attributes +(or attribute paths). +The index is then used in queries to locate documents with a specific index attribute value +or to find documents whose index attribute value(s) are in a given range. + +For example, you can create a persistent index on the attributes `value1` and +`value2` with the following command: + +```js +collection.ensureIndex({ type: "persistent", fields: ["value1", "value2"] }); +``` + +If you declare an index to be `unique`, then no two documents are allowed to have +the same set of attribute values. Creating a new document or updating a document +will fail if the uniqueness is violated: + +```js +collection.ensureIndex({ type: "persistent", fields: ["value1", "value2"], unique: true }); +``` + +If you declare an index to be `sparse`, a document will be excluded from the index +and no uniqueness checks will be performed if any index attribute value is not +set or has a value of `null`: + +```js +collection.ensureIndex({ type: "persistent", fields: ["value1", "value2"], sparse: true }); +``` + +To store additional attributes in the index, you can set the `storedValues` +option: + +```js +collection.ensureIndex({ type: "persistent", fields: ["value1", "value2"], storedValues: ["value3"] }); +``` + +To enable in-memory caching of index entries, which can be used when doing point +lookups on the index, you can set the `cacheEnabled` option: + +```js +collection.ensureIndex({ type: "persistent", fields: [ "value1", "value2" ], cacheEnabled: true }); +``` + +## Storing additional values in indexes + +<small>Introduced in: v3.10.0</small> + +Persistent indexes allow you to store additional attributes in the index that +can be used to satisfy projections of the document. They cannot be used for +index lookups or for sorting, but for projections only. They allow persistent +indexes to fully cover more queries and avoid extra document lookups. This can +have a great positive effect on index scan performance if the number of scanned +index entries is large. + +You can set the `storedValues` option and specify the additional attributes as +an array of attribute paths when creating a new persistent index, similar to +the `fields` option: + +```js +db.<collection>.ensureIndex({ + type: "persistent", + fields: ["value1"], + storedValues: ["value2"] +}); +``` + +This will index the `value1` attribute in the traditional sense, so that the index +can be used for looking up by `value1` or for sorting by `value1`. The index also +supports projections on `value1` as usual. + +In addition, due to `storedValues` being used here, the index can now also +supply the values for the `value2` attribute for projections without having to +look up the full document. Non-existing attributes are stored as `null` values. + +The maximum number of attributes that you can use in `storedValues` is 32. +You cannot specify the same attribute path in both, the `fields` and the +`storedValues` option. If there is an overlap, the index creation will abort +with an error message. + +In unique indexes, only the index attributes in `fields` are checked for +uniqueness. The index attributes in `storedValues` are not checked for their +uniqueness. + +You cannot create multiple persistent indexes with the same `fields` attributes +and uniqueness option but different `storedValues` settings. That means the +value of `storedValues` is not considered by calls to `ensureIndex()` when +checking if an index is already present or needs to be created. + +## Caching of index values + +<small>Introduced in: v3.10.0</small> + +You can optionally put an in-memory hash cache in front of persistent indexes. +By default, persistent indexes will not have an in-memory cache. You can enable +it when creating an index by setting the `cacheEnabled` option to `true`: + +```js +db.<collection>.ensureIndex({ + type: "persistent", + fields: ["name"], + cacheEnabled: true +}); +``` + +You cannot create multiple persistent indexes with the same `fields` attributes +and uniqueness option but different `cacheEnabled` settings. That means the +value of `cacheEnabled` is not considered by calls to `ensureIndex()` when +checking if an index is already present or needs to be created. + +The in-memory cache for an index will be initially empty, even if the index +contains data. The cache will be populated lazily upon querying data from the +index when using equality lookups for all index attributes. Cache entries get +invalidated when modifying data in the underlying collection. Only the affected +index entries will get invalidated. + +As the cache is hash-based and unsorted, it cannot be used for full or partial +range scans, for sorting, or for lookups that do not include all index attributes. + +Filling the caches upon cache misses during lookups and upon writing to the +collection can mean extra overhead, so it is recommended to use an in-memory cache +only for collections that are accessed mostly for reading via equality lookups, +and that are not often written to. + +For AQL queries that will use indexes with an enabled in-memory cache and that are +known to not benefit from using using the cache, you may turn off the usage of +the cache for individual query parts. This can be achieved +via the `useCache` hint that can be provided to an AQL `FOR` loop: + +```aql +FOR doc IN collection OPTIONS { useCache: false } + FILTER doc.value == @lookup + ... +``` + +Using the `useCache` option will have no effect for indexes that do not have a +cache enabled, or for queries that are not eligible to use caches. + +The number of index cache hits and misses is also reported when profiling queries. +You can use this information to assess the effectiveness of the cache for +particular queries. + +You can control the maximum combined memory usage of all in-memory caches via +the existing `--cache.size` startup option, which not only controls the maximum +memory usage for all edge caches, but additionally also the memory usage for all +caches for persistent indexes. + +## Accessing Persistent Indexes from the Shell + +Ensures that a unique persistent index exists: + +`collection.ensureIndex({ type: "persistent", fields: [ "field1", ..., "fieldn" ], unique: true })` + +Creates a unique persistent index on all documents using `field1`, ... `fieldn` +as attribute paths. At least one attribute path has to be given. The index will +be non-sparse by default. + +All documents in the collection must differ in terms of the indexed +attributes. Creating a new document or updating an existing document will +will fail if the attribute uniqueness is violated. + +--- + +To create a sparse unique index, set the `sparse` attribute to `true`: + +`collection.ensureIndex({ type: "persistent", fields: [ "field1", ..., "fieldn" ], unique: true, sparse: true })` + +In a sparse index all documents will be excluded from the index that do not +contain at least one of the specified index attributes or that have a value +of `null` in any of the specified index attributes. Such documents will +not be indexed, and not be taken into account for uniqueness checks. + +In a non-sparse index, these documents will be indexed (for non-present +indexed attributes, a value of `null` will be used) and will be taken into +account for uniqueness checks. + +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +**Examples** + +```js +--- +name: ensureUniquePersistentSingle +description: '' +--- +~db._create("ids"); +db.ids.ensureIndex({ type: "persistent", fields: [ "myId" ], unique: true }); +db.ids.save({ "myId": 123 }); +db.ids.save({ "myId": 456 }); +db.ids.save({ "myId": 789 }); +db.ids.save({ "myId": 123 }); // xpError(ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED) +~db._drop("ids"); +``` + +```js +--- +name: ensureUniquePersistentMultiColmun +description: '' +--- +~db._create("ids"); +db.ids.ensureIndex({ type: "persistent", fields: [ "name.first", "name.last" ], unique: true }); +db.ids.save({ "name" : { "first" : "hans", "last": "hansen" }}); +db.ids.save({ "name" : { "first" : "jens", "last": "jensen" }}); +db.ids.save({ "name" : { "first" : "hans", "last": "jensen" }}); +db.ids.save({ "name" : { "first" : "hans", "last": "hansen" }}); // xpError(ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED) +~db._drop("ids"); +``` + +--- + +Ensures that a non-unique persistent index exists: + +`collection.ensureIndex({ type: "persistent", fields: [ "field1", ..., "fieldn" ] })` + +Creates a non-unique persistent index on all documents using `field1`, ... +`fieldn` as attribute paths. At least one attribute path has to be given. +The index will be non-sparse by default. + +To create a sparse unique index, set the `sparse` attribute to `true`. + +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +```js +--- +name: ensurePersistent +description: '' +--- +~db._create("names"); +db.names.ensureIndex({ type: "persistent", fields: [ "first" ] }); +db.names.save({ "first" : "Tim" }); +db.names.save({ "first" : "Tom" }); +db.names.save({ "first" : "John" }); +db.names.save({ "first" : "Tim" }); +db.names.save({ "first" : "Tom" }); +~db._drop("names"); +``` + +### Query by example using a persistent index + +Constructs a query-by-example using a persistent index: + +`collection.byExample(example)` + +Selects all documents from the collection that match the specified example +and returns a cursor. A persistent index will be used if present. + +You can use `toArray()`, `next()`, or `hasNext()` to access the +result. The result can be limited using the `skip()` and `limit()` +operator. + +An attribute name of the form `a.b` is interpreted as attribute path, +not as attribute. If you use + +```json +{ "a" : { "c" : 1 } } +``` + +as example, then you will find all documents, such that the attribute +`a` contains a document of the form `{ "c" : 1 }`. For example the document + +```json +{ "a" : { "c" : 1 }, "b" : 1 } +``` + +will match, but the document + +```json +{ "a" : { "c" : 1, "b" : 1 } } +``` + +will not. + +However, if you use + +```json +{ "a.c" : 1 } +``` + +then you will find all documents, which contain a sub-document in `a` +that has an attribute `c` of value `1`. Both the following documents + +```json +{ "a" : { "c" : 1 }, "b" : 1 } +``` +and + +```json +{ "a" : { "c" : 1, "b" : 1 } } +``` +will match. + +## Persistent Indexes and Server Language + +The order of index entries in persistent indexes adheres to the configured +[server language](../../../components/arangodb-server/options.md#--default-language). +If, however, the server is restarted with a different language setting as when +the persistent index was created, not all documents may be returned anymore and +the sort order of those which are returned can be wrong (whenever the persistent +index is consulted). + +To fix persistent indexes after a language change, delete and re-create them. diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/ttl-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/ttl-indexes.md new file mode 100644 index 0000000000..6544f955ed --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/ttl-indexes.md @@ -0,0 +1,202 @@ +--- +title: TTL Indexes +menuTitle: TTL Indexes +weight: 15 +description: >- + You can use time-to-live indexes to remove expired documents from collections +--- +## Introduction to TTL (time-to-live) Indexes + +The TTL index type provided by ArangoDB can be used for removing expired documents +from a collection. + +The TTL index is set up by setting an `expireAfter` value and by selecting a single +document attribute which contains a reference point in time. For each document, that +reference point in time can then be specified as a numeric timestamp (Unix timestamp) or +a date string in format `YYYY-MM-DDTHH:MM:SS`, optionally with milliseconds after a +decimal point in the format `YYYY-MM-DDTHH:MM:SS.MMM` and an optional timezone offset. +All date strings without a timezone offset will be interpreted as UTC dates. + +Documents will count as expired when wall clock time is beyond the per-document +reference point in time value plus the index' `expireAfter` value added to it. + +{{< youtube id="L944_JcC2uw" >}} + +### Removing documents at a fixed period after creation / update + +One use case supported by TTL indexes is to remove documents at a fixed duration +after they have been created or last updated. This requires setting up the index +with an attribute that contains the documents' creation or last-updated time. + +Let's assume the index attribute is set to "creationDate", and the `expireAfter` +attribute of the index was set to 600 seconds (10 minutes). + +```js +db.collection.ensureIndex({ type: "ttl", fields: ["creationDate"], expireAfter: 600 }); +``` + +Let's further assume the following document now gets inserted into the collection: + +```json +{ "creationDate" : 1550165973 } +``` + +This document will be indexed with a reference point in time value of `1550165973`, +which translates to the human-readable date/time `2019-02-14T17:39:33.000Z`. The document +will expire 600 seconds afterwards, which is at timestamp `1550166573` (or +`2019-02-14T17:49:33.000Z` in the human-readable version). From that point on, the +document is a candidate for being removed. + +The numeric date time values for the index attribute need to be specified +**in seconds** since January 1st 1970 (Unix timestamp). To calculate the +current timestamp using JavaScript in this format, use: `Date.now() / 1000`. +To calculate it from an arbitrary `Date` instance, use: +`Date.getTime() / 1000`. In AQL, you also have to divide the timestamp, +e.g. `DATE_NOW() / 1000`. + +Alternatively, the reference points in time can be specified as a date string in format +`YYYY-MM-DDTHH:MM:SS`, optionally with milliseconds after a decimal point in the +format `YYYY-MM-DDTHH:MM:SS.MMM` and an optional timezone offset. All +date strings without a timezone offset will be interpreted as UTC dates. + +The above example document using a date string attribute value would be + +```json +{ "creationDate" : "2019-02-14T17:39:33.000Z" } +``` + +Now any data-modification access to the document could update the value in the document's +`creationDate` attribute to the current date/time, which would prolong the existence +of the document and keep it from being expired and removed. + +ArangoDB will not automatically set a document's reference point in time on initial insertion +or on every subsequent modification of the document. Instead, it is the responsibility of +client applications to set and update the reference points in time of documents whenever +the use case requires it. + +### Removing documents at certain points in time + +Another use case is to specify a per-document expiration/removal point in time, and setting +the `expireAfter` attribute to a low value (e.g. 0 seconds). + +Let's assume the index attribute is set to "expireDate", and the `expireAfter` +attribute of the index was set to 0 seconds (immediately when wall clock time reaches +the value specified in `expireDate`). + +```js +db.collection.ensureIndex({ type: "ttl", fields: ["expireDate"], expireAfter: 0 }); +``` + +When storing the following document in the collection, it will expire at the point in time +specified in the document itself: + +```json +{ "expireDate" : "2019-03-28T01:06:00Z" } +``` + +As `expireAfter` was set to 0, the document will count as expired when wall clock time +has reached the timeout. + +It should be intuitive to see that the `expireDate` can be different per document. +This allows mixing of documents with different expiration periods by calculating their +expiration dates differently in the client application. + +### Format of date/time values + +The expiration date time values can be specified either as a numeric timestamp, containing +the number of seconds since January 1st 1970 (commonly referred to as Unix timestamp), +or as a date/time string in ISO 8601 format `YYYY-MM-DDTHH:MM:SS`, with optional millisecond +precision and an optional timezone offset. The timezone offset can be specified as either +`Z` (Zulu/UTC time) or as a deviation from UTC time in hours and minutes (i.e. `+HH:MM` or `-HH:MM`). + +Valid example date string values are: + +| Date/time string | Local Date | Local Time | Timezone Offset | +|-----------------------------------|---------------|--------------|-----------------------------| +| `"2019-05-27"` | May 27th 2019 | 00:00:00 | +00:00 (UTC time) | +| `"2019-05-27T21:20:00"` | May 27th 2019 | 21:20:00 | +00:00 (UTC time) | +| `"2019-05-27T21:20:00Z"` | May 27th 2019 | 21:20:00 | +00:00 (UTC time) | +| `"2019-05-27T21:20:00.123Z"` | May 27th 2019 | 21:20:00.123 | +00:00 (UTC time) | +| `"2019-05-27T21:20:00.123+01:30"` | May 27th 2019 | 21:20:00.123 | +01:30 offset from UTC time | +| `"2019-05-27T21:20:00.123-02:00"` | May 27th 2019 | 21:20:00.123 | -02:00 offset from UTC time | + +Using an invalid date string value in a document's TTL index attribute will prevent the document +from being inserted into the TTL index, so it will neither be expired nor removed automatically. +No error is raised however. + +Please note that date string values can be programmatically validated using the AQL function +`IS_DATESTRING()`. + +### Preventing documents from being removed + +In case the index attribute does not contain a numeric value nor a proper date string, +the document will not be stored in the TTL index and thus will not become a candidate +for expiration and removal. Providing either a non-numeric value or even no value for +the index attribute is a supported way to keep documents from being expired and removed. + +### Limitations + +TTL indexes are designed exactly for the purpose of removing expired documents +from collections. It is **not recommended** to rely on TTL indexes for user-land +AQL queries. This is because TTL indexes may store a transformed, always +numerical version of the index attribute value internally even if it was +originally passed in as a date string. As a result, you may see different +values for the attribute, depending on whether it gets taken from the +index or the document. TTL indexes will likely not be usable for filtering and +sort operations in user-land AQL queries. + +There can at most be one TTL index per collection. + +The actual removal of expired documents will not necessarily happen immediately when +they have reached their expiration time. +Expired documents will eventually be removed by a background thread that is periodically +going through all TTL indexes and removing the expired documents. + +There is no guarantee when exactly the removal of expired documents will be carried +out, so queries may still find and return documents that have already expired. These +will eventually be removed when the background thread kicks in and has spare capacity to +remove the expired documents. It is guaranteed however that only documents which are +past their expiration time will actually be removed. + +The frequency for invoking the background removal thread can be configured using +the `--ttl.frequency` startup option. The frequency is specified in milliseconds. + +In order to avoid "random" load spikes by the background thread suddenly kicking +in and removing a lot of documents at once, the number of to-be-removed documents +per thread invocation can be capped. +The total maximum number of documents to be removed per thread invocation is +controlled by the startup option `--ttl.max-total-removes`. The maximum number of +documents in a single collection at once can be controlled by the startup option +`--ttl.max-collection-removes`. + +Please note that there is one background thread per ArangoDB database server instance +for performing the removal of expired documents of all collections in all databases. +If the number of databases and collections with TTL indexes is high and there are many +documents to remove from these, the background thread may at least temporarily lag +behind with its removal operations. It should eventually catch up in case the number +of to-be-removed documents per invocation is not higher than the background thread's +configured threshold values. + +## Accessing TTL Indexes from the Shell + +Ensures that a TTL index exists: +`collection.ensureIndex({ type: "ttl", fields: [ "field" ], expireAfter: 600 })` + +Creates a TTL index on all documents using `field` as attribute path. Exactly +one attribute path has to be given. The index will be sparse in all cases. + +In case that the index was successfully created, an object with the index +details, including the index-identifier, is returned. + +```js +--- +name: ensureTtlIndex +description: '' +--- +~db._create("test"); +db.test.ensureIndex({ type: "ttl", fields: [ "creationDate" ], expireAfter: 600 }); +for (let i = 0; i < 100; ++i) { + db.test.insert({ creationDate: Date.now() / 1000 }); +} +~db._drop("test"); +``` diff --git a/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md new file mode 100644 index 0000000000..d2488c46dd --- /dev/null +++ b/site/content/arangodb/oem/index-and-search/indexing/working-with-indexes/vertex-centric-indexes.md @@ -0,0 +1,93 @@ +--- +title: Vertex-Centric Indexes +menuTitle: Vertex-Centric Indexes +weight: 35 +description: >- + You can create persistent indexes over the `_from` or `_to` attribute and one + or more additional edge attributes to improve certain graph traversals +--- +All edge collections in ArangoDB have a special edge index that enables fast +graph operations. If you have graphs that contain supernodes (vertices that have +an exceptionally high amount of connected edges) and you apply filters in graph +traversal queries, you can create so-called vertex-centric indexes that can +perform better than the default edge indexes. You can use the `persistent` +index type for this purpose. + +## Motivation + +The idea of a vertex-centric index is to index a combination of a vertex, the +direction, and an arbitrary set of attributes on the edges. This can be achieved +by indexing the `_from` or `_to` attribute of an edge as the first field, +which contains the document identifier of a vertex and implicitly captures the +direction, followed by any number of other attributes of an edge. + +To support traversals in `OUTBOUND` direction, you need to index the `_from` +attribute as the first attribute. For the `INBOUND` direction, you need to use +the `_to` attribute. To support both (`ANY` or mixed `INBOUND` and `OUTBOUND` +directions), you need to create two indexes, using `_from` in one and `_to` in +the other as the first attribute the index is over. + +For example, if you have an attribute called `type` on the edges and traverse +in `OUTBOUND` direction, you can create a vertex-centric `persistent` index over +`["_from", "type"]` to find all edges attached to a vertex with a given `type`. +The following query can benefit from such an index: + +```aql +FOR v, e, p IN 3..5 OUTBOUND @start GRAPH @graphName + FILTER p.edges[*].type ALL == "friend" + RETURN v +``` + +Using the built-in edge-index, ArangoDB can find the list of all edges attached +to the vertex fast but it still it has to walk through this list and check if +all of them have the attribute `type == "friend"`. A vertex-centric index allows +ArangoDB to find all edges with the attribute `type == "friend"` for the vertex +in one go, saving the iteration to verify the condition. + +## Index creation + +A vertex-centric has to be of the type [Persistent Index](persistent-indexes.md) +and is created like any other index of this type. However, in the list +of fields used to create the index over, you need to use either `_from` or `_to` +as the first field. + +For example, if you want to create a vertex-centric index on the `type` attribute +that supports traversing in the `OUTBOUND` direction, you would create the index +in the following way: + +```js +--- +name: ensureVertexCentricIndex +description: '' +--- +~db._createEdgeCollection("edgeCollection"); +db.edgeCollection.ensureIndex({ type: "persistent", fields: [ "_from", "type" ] }); +~db._drop("edgeCollection"); +``` + +All options that are supported by persistent indexes are supported by the +vertex-centric index as well. + +## Index usage + +The AQL optimizer can decide to use a vertex-centric whenever suitable. However, +it is not guaranteed that this index is used. The optimizer may estimate that +another index, in particular the built-in edge index, is a better fit. + +The optimizer considers vertex-centric indexes in pattern matching queries: + +```aql +FOR v, e, p IN 3..5 OUTBOUND @start GRAPH @graphName + FILTER p.edges[*].type ALL == "friend" + RETURN v +``` + +It also considers them when you iterate over an edge collection directly and +explicitly filter on `_from` respectively `_to` and the other indexed attributes: + + +```aql +FOR edge IN edgeCollection + FILTER edge._from == "vertices/123456" AND edge.type == "friend" + RETURN edge +``` diff --git a/site/content/arangodb/oem/operations/_index.md b/site/content/arangodb/oem/operations/_index.md new file mode 100644 index 0000000000..cd1194f219 --- /dev/null +++ b/site/content/arangodb/oem/operations/_index.md @@ -0,0 +1,6 @@ +--- +title: Operations +menuTitle: Operations +weight: 205 +description: '' +--- diff --git a/site/content/arangodb/oem/operations/administration/_index.md b/site/content/arangodb/oem/operations/administration/_index.md new file mode 100644 index 0000000000..34012917ca --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/_index.md @@ -0,0 +1,49 @@ +--- +title: Administration +menuTitle: Administration +weight: 225 +description: >- + How to configure ArangoDB, manage users accounts and backups, and what tools + you can use to administrate deployments +--- +## Tools + +Deployments of ArangoDB servers can be managed with the following tools: + +- [**Web interface**](../../components/web-interface/_index.md): + [_arangod_](../../components/arangodb-server/_index.md) serves a graphical web interface to + be accessed with a browser via the server port. It provides basic and advanced + functionality to interact with the server and its data. + + {{% comment %}}TODO: In case of a cluster, the web interface can be reached via any of the Coordinators. What about other deployment modes?{{% /comment %}} + +- **ArangoShell**: [_arangosh_](../../components/tools/arangodb-shell/_index.md) is a V8 shell to + interact with any local or remote ArangoDB server through a JavaScript + interface. It can be used to automate tasks. Some developers may prefer it over + the web interface, especially for simple CRUD. It is not to be confused with + general command lines like Bash or PowerShell. + +- **RESTful API**: _arangod_ has an [HTTP interface](../../develop/http-api/_index.md) through + which it can be fully managed. The official client tools including _arangosh_ and + the Web interface talk to this bare metal interface. It is also relevant for + [driver](../../develop/drivers/_index.md) developers. + +- [**ArangoDB Starter**](../../components/tools/arangodb-starter/_index.md): This deployment tool + helps to start _arangod_ instances, like for a Cluster or an Active Failover setup. + +For a full list of tools, please refer to the [Programs & Tools](../../components/tools/_index.md) chapter. + +## Deployment Administration + +- [Active Failover](../../deploy/active-failover/administration.md) +- [Cluster](../../deploy/cluster/administration.md) +- [Datacenter-to-Datacenter Replication](../../deploy/arangosync/administration.md) +- [ArangoDB Starter Administration](arangodb-starter/_index.md) + +## Other Topics + +- [Configuration](configuration.md) +- [License Management](license-management.md) +- [Backup & Restore](../backup-and-restore.md) +- [Import & Export](import-and-export.md) +- [User Management](user-management/_index.md) diff --git a/site/content/arangodb/oem/operations/administration/arangodb-starter/_index.md b/site/content/arangodb/oem/operations/administration/arangodb-starter/_index.md new file mode 100644 index 0000000000..1b65daa1a4 --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/arangodb-starter/_index.md @@ -0,0 +1,10 @@ +--- +title: ArangoDB Starter Administration +menuTitle: ArangoDB Starter Administration +weight: 35 +description: >- + Administration procedures for deployments the have been created using the + ArangoDB Starter +aliases: + - arangodb-starter-administration +--- diff --git a/site/content/arangodb/oem/operations/administration/arangodb-starter/recovery-procedure.md b/site/content/arangodb/oem/operations/administration/arangodb-starter/recovery-procedure.md new file mode 100644 index 0000000000..e13c21505c --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/arangodb-starter/recovery-procedure.md @@ -0,0 +1,46 @@ +--- +title: ArangoDB Starter Recovery Procedure +menuTitle: Recovery Procedure +weight: 10 +description: >- + You can replace a failed machine and recover a cluster that has been created + with ArangoDB Starter using a new machine with the old or a new IP address +aliases: + - ../arangodb-starter-administration/recovery-procedure +--- +This procedure is intended to recover a cluster that was started with the +[ArangoDB Starter](../../../components/tools/arangodb-starter/_index.md) when a +machine of that cluster is broken without the possibility to recover +it (e.g. complete hard drive failure). In the procedure is does not matter if a replacement +machine uses the old or a new IP address. + +To recover from this scenario, you must: + +- Create a new (replacement) machine with ArangoDB (including _Starter_) installed. +- Create a file called `RECOVERY` in the directory you are going to use as data + directory of the _Starter_ (the one that is passed via the option `--starter.data-dir`). + This file must contain the IP address and port of the _Starter_ that has been + broken (and will be replaced with this new machine). + +Example: + +```bash +echo "192.168.1.25:8528" > $DATADIR/RECOVERY +``` + +After creating the `RECOVERY` file, start the _Starter_ using all the normal command +line arguments. + +The _Starter_ will now: + +1. Talk to the remaining _Starters_ to find the ID of the _Starter_ it replaces and + use that ID to join the remaining _Starters_. +1. Talk to the remaining _Agents_ to find the ID of the _Agent_ it replaces and + adjust the command-line arguments of the _Agent_ (it will start) to use that ID. + This is skipped if the _Starter_ was not running an _Agent_. +1. Remove the `RECOVERY` file from the data directory. + +The cluster will now recover automatically. It will however have one more _Coordinators_ +and _DB-Servers_ than expected. Exactly one _Coordinator_ and one _DB-Server_ will +be listed "red" in the web interface of the database. They will have to be removed manually +using the ArangoDB web interface. diff --git a/site/content/arangodb/oem/operations/administration/arangodb-starter/removal-procedure.md b/site/content/arangodb/oem/operations/administration/arangodb-starter/removal-procedure.md new file mode 100644 index 0000000000..8af297789a --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/arangodb-starter/removal-procedure.md @@ -0,0 +1,71 @@ +--- +title: ArangoDB Starter Removal Procedure +menuTitle: Removal Procedure +weight: 5 +description: >- + You can remove a machine from a cluster that was started with ArangoDB Starter + as long as the machine does not run an Agent +aliases: + - ../arangodb-starter-administration/removal-procedure +--- +{{< danger >}} +**Do not** apply this procedure to machines that have an **Agent** on it. +{{< /danger >}} + +This procedure is intended to remove a machine from a cluster +that was started with the ArangoDB _Starter_. + +It is possible to run this procedure while the machine is still running +or when it has already been removed. + +It is not possible to remove machines that have an Agent on it! +The _Agency_ needs to remain functional for the cluster to operate. +Use the [recovery procedure](recovery-procedure.md) if you have +a failed machine with an Agent on it. + +Note that it is highly recommended to remove a machine while it is still running. + +To remove a machine from a cluster, run the following command: + +```bash +arangodb remove starter --starter.endpoint=<endpoint> [--starter.id=<id>] [--force] +``` + +Where `<endpoint>` is the endpoint of the starter that you want to remove, +or the endpoint of one of the remaining starters. E.g. `http://localhost:8528`. + +If you want to remove a machine that is no longer running, use the `--starter.id` +option. Set it to the ID of the ArangoDB _Starter_ on the machine that you want to remove. + +You can find this ID in a `setup.json` file in the data directory of one of +the remaining ArangoDB _Starters_. Example: + +```json +{ + ... + "peers": { + "Peers": [ + { + "ID": "21e42415", + "Address": "10.21.56.123", + "Port": 8528, + "PortOffset": 0, + "DataDir": "/mydata/server1", + "HasAgent": true, + "IsSecure": false + }, + ... + ] + } +} +``` + +If the machine you want to remove has address `10.21.56.123` and was listening +on port `8528`, use ID `21e42415`. + +The `remove starter` command will attempt the cleanout all data from the servers +of the machine that you want to remove. This can take a long of time. +If the cleanout fails, the `remove starter` command will fail. + +If you want to remove the machine even when the cleanout has failed, use +the `--force` option. Note that this may lead to data loss! diff --git a/site/content/arangodb/oem/operations/administration/configuration.md b/site/content/arangodb/oem/operations/administration/configuration.md new file mode 100644 index 0000000000..0a9e912442 --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/configuration.md @@ -0,0 +1,343 @@ +--- +title: Configuration +menuTitle: Configuration +weight: 5 +description: '' +--- +The [programs and tools](../../components/tools/_index.md) shipped in an +ArangoDB package can be configured with various _startup options_. + +- Startup options you specify on a command line are referred to as + [command line options](#command-line-options): + + `arangosh --server.database myDB --server.username Jay` + +- The same options can also be set via + [configuration files](#configuration-file-format), + using a slightly different syntax: + + ```conf + server.database = myDB + server.username = Jay + ``` + + Or more compact like this: + + ```conf + [server] + database = myDB + username = Jay + ``` + +- There are also _commands_ that are intended for command line usage only, + such as `‑‑help` and `‑‑version`. + +## Available startup options + +Find the available options and commands in the _Options_ sub-chapters of the +respective [Programs & Tools](../../components/tools/_index.md) sub-chapter, like the +[ArangoDB Server Options](../../components/arangodb-server/options.md). + +The [ArangoDB Starter](../../components/tools/arangodb-starter/_index.md) works differently +to the other programs and tools. It uses `setup.json` files for its own +[configuration](../../components/tools/arangodb-starter/architecture.md#starter-data-directory) +and has a fluent command line interface to execute certain actions. +If you deploy ArangoDB with the Starter, then custom `arangod.conf` files +are generated by this tool and are used instead of the default configuration. + +## Command line options + +Command line options can be supplied in the style `‑‑option value` with two +dashes (also known as hyphen minus), the name of the option, a space as +separator and the value. You may also use an equals sign `=` as separator +like `‑‑option=value`. + +The value can be surrounded with double quote marks `"` like +`‑‑option="value"`. This is mandatory if the value contains spaces, +but it is optional otherwise. + +Boolean options that you want to enable do not need to be set to `true` +explicitly. For example, `--log.role` is equivalent to `--log.role true`. + +Some binaries accept one unnamed argument, which means you can take a +shortcut and leave out the `‑‑option` part and supply the value directly. +It does not matter if you supply it as first or last argument, or between +any of the named arguments. For _arangod_ it is the `‑‑database.directory` +option. The following commands are identical: + +``` +arangod my_data_dir +arangod "my_data_dir" +arangod --database.directory my_data_dir +arangod --database.directory=my_data_dir +arangod --database.directory "my_data_dir" +arangod --database.directory="my_data_dir" +``` + +Many options belong to a section as in `‑‑section.param`, e.g. +`‑‑server.database`, but there can also be options without any section. +These options are referred to as _general options_. + +To list available options, you can run a binary with the `‑‑help` command: + +``` +arangosh --help +``` + +To list the options of a certain section only, use `‑‑help‑{section}`, +like `‑‑help‑server`. To list all options including hidden ones use +`--help-all`. + +## Configuration file format + +`.conf` files for ArangoDB binaries are in a simple key-value pair format. +Each option is specified on a separate line in the form: + +```conf +key = value +``` + +It may look like this: + +```conf +server.endpoint = tcp://127.0.0.1:8529 +server.authentication = true +``` + +Alternatively, a header section can be specified and options pertaining to +that section can be specified in a shorter form: + +```conf +[server] +endpoint = tcp://127.0.0.1:8529 +authentication = true +``` + +So you see, a command line option `‑‑section.param value` can be easily +translated to an option in a configuration file: + +```conf +[section] +param = value +``` + +{{< tip >}} +Whitespace around `=` is ignored in configuration files. +This includes whitespace around equality signs in the parameter value: + +```conf +log.level = startup = trace +``` + +It is the same as without whitespace: + +```conf +log.level=startup=trace +``` +{{< /tip >}} + +Comments can be placed in the configuration file by placing one or more +hash symbols `#` at the beginning of a line. Comments that are placed in +other places (i.e. not at the beginning of a line) are unsupported and should +be avoided to ensure correct parsing of the startup options as intended. + +Commands like `--version` should not be used in configuration files +(`version = true`) because the process will terminate after executing the +command, potentially giving the impression that it failed to start. + +## Using Configuration Files + +Binaries have a corresponding `.conf` file that an ArangoDB package ships with. +`arangosh.conf` contains the default ArangoShell configuration for instance. +The configuration files can be adjusted or new ones be created. + +To load a particular configuration file, there is a `‑‑configuration` option +available to let you specify a path to a `.conf` file. If you want to +completely ignore a configuration file (likely the default one) without +necessarily deleting the file, then add the command line option + +``` +-c none +``` + +or + +``` +--configuration none +``` + +The value `none` is case-insensitive. + +{{% comment %}} +Specific to arangod, move to programs detail page? +Does the resolution order for config files apply to all binaries? +Linux only? Also macOS? Windows not addressed so far. + +If this command is not passed to the server, then by default, the server +attempts to first locate a file named `~/.arango/arangod.conf` in the user's home +directory. + +If no such file is found, the server proceeds to look for a file +`arangod.conf` in the system configuration directory. The system configuration +directory is platform-specific, and may be changed when compiling ArangoDB +yourself. It may default to `/etc/arangodb` or `/usr/local/etc/arangodb`. This +file is installed when using a package manager like rpm or dpkg. If you modify +this file and later upgrade to a new version of ArangoDB, then the package +manager normally warns you about the conflict. In order to avoid these warning +for small adjustments, you can put local overrides into a file +`arangod.conf.local`. +{{% /comment %}} + +## Suffixes for Numeric Options + +You can add suffixes to numeric options to let ArangoDB multiply the value by a +certain factor. This allows you to conveniently specify values, for example, +in megabytes, gigabytes, or terabytes. + +| Suffix | Factor | Bytes | Example | +|----------------------|------------------|-------------------|-----------| +| `kib`, `KiB`, `KIB` | 1024 | 1,024 | `512KiB` | +| `mib`, `MiB`, `MIB` | 1024<sup>2</sup> | 1,048,576 | `64mib` | +| `gib`, `GiB`, `GIB` | 1024<sup>3</sup> | 1,073,741,824 | `3GIB` | +| `tib`, `TiB`, `TIB` | 1024<sup>4</sup> | 1,099,511,627,776 | `3tib` | +| `b`, `B` | 1 | 1 | `10b` | +| `k`, `K`, `kb`, `KB` | 1000 | 1,000 | `3k` | +| `m`, `M`, `mb`, `MB` | 1000<sup>2</sup> | 1,000,000 | `3M` | +| `g`, `G`, `gb`, `GB` | 1000<sup>3</sup> | 1,000,000,000 | `3GB` | +| `t`, `T`, `tb`, `TB` | 1000<sup>4</sup> | 1,000,000,000,000 | `4tb` | +| `%` | 0.01 | n/a | `5%` | + +You can also use suffixes in configuration files like this: + +```conf +[rocksdb] +write-buffer-size=512KiB +block-cache-size=512MiB +total-write-buffer-size=2GiB +max-bytes-for-level-multiplier=1K + +[cache] +size=2G +``` + +## Environment variables as parameters + +If you want to use an environment variable in a value of a startup option, +write the name of the variable wrapped in at signs `@`. It acts as a +placeholder. It can be combined with fixed strings for instance. +For literal at signs in startup option arguments, escape them like `@@`. + +Command line example: + +``` +arangod --temp.path @TEMP@/arango_tmp +``` + +In a configuration file: + +```conf +[temp] +path = @TEMP@/arango_tmp +``` + +On a Windows system, above setting would typically make the ArangoDB Server +create its folder for temporary files in `%USERPROFILE%\AppData\Local\Temp`, +i.e. `C:\Users\xxx\AppData\Local\Temp\arango_tmp`. + +{{% comment %}}What other placeholders are there? @ROOTDIR@ ...{{% /comment %}} + +## Options with multiple values + +Certain startup options accept multiple values. In case of parameters being +_vectors_ you can specify one or more times the option with varying values. +Whether this is the case can be seen by looking at the **Type** column of a +tool's option table (e.g. [ArangoDB Server Options](../../components/arangodb-server/options.md)) +or the type information provided on a command line in the `--help` output of +an ArangoDB binary: + +``` +--log.level <string...> the global or topic-specific log level +``` + +Vectors can be identified by the three dots `...` at the end of the data type +information (in angled brackets). For `log.level` you can set one or more +strings for different log levels for example. Simply repeat the option to +do so. On a command line: + +``` +arangod --log.level all=warning --log.level queries=trace --log.level startup=info +``` + +This sets a global log level of `warning` and two topic-specific levels +(`trace` for queries and `info` for startup). Note that `--log.level warning` +does not set a log level globally for all existing topics, but only the +`general` topic. Use the pseudo-topic `all` to set a global log level. + +The same in a configuration file: + +```conf +[log] +level = all=warning +level = queries=trace +level = startup=info +``` + +## Configuration precedence + +There are built-in defaults, with which all configuration variables are first +initialized. They can be overridden by configuration files and command line +options (in this order). Only a fraction of all available options are set in +the configuration files that ArangoDB ships with. Many options therefore +fall back to the built-in defaults unless they are overridden by the user. + +It is common to use modified configuration files together with startup +options on a command line to override specific settings. Command line options +take precedence over values set in a configuration file. + +If the same option is set multiple times, but only supports a single value, +then the last occurrence of the option becomes the final value. +For example, if you edit `arangosh.conf` as follows: + +```conf +server.database = myDB1 +server.database = myDB2 +``` + +Then start ArangoShell like this: + +``` +arangosh --server.database myDB3 --server.database myDB4 +``` + +The database it connects to is `myDB4`, because this startup option +takes a single value only (i.e. it is not a vector), the built-in default +is `_system` but the configuration file overrules the setting. It gets set to +`myDB1` temporarily before it is replaced by `myDB2`, which in turn gets +overridden by the command line options twice, first to `myDB3` and then the +final value `myDB4`. + +## Change configuration at runtime + +In general, supplied startup options cannot be changed nor can configuration +files be reloaded once an executable is started, other than by restarting the +executable with different options. However, some of the startup options +define default values which can be overridden on a per-query basis for +instance, or adjusted at runtime via an API call. Examples: + +- [Query cache configuration](../../aql/execution-and-performance/caching-query-results.md#global-configuration) + via JavaScript API + +## Fetch Current Configuration Options + +To list the configuration options of a running `arangod` instance, you can +connect with an [ArangoShell](../../components/tools/arangodb-shell/_index.md) and invoke a +[Transaction](../../develop/transactions/_index.md) by calling `db._executeTransaction()` +and providing a JavaScript function to retrieve the server options: + +```js +--- +name: listCurrentConfigOpts +description: '' +--- +db._executeTransaction({ collections: {}, action: function() {return require("internal").options(); } }) +``` diff --git a/site/content/arangodb/oem/operations/administration/import-and-export.md b/site/content/arangodb/oem/operations/administration/import-and-export.md new file mode 100644 index 0000000000..459b245016 --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/import-and-export.md @@ -0,0 +1,11 @@ +--- +title: Import and Export +menuTitle: Import & Export +weight: 25 +description: '' +--- +Imports and exports can be done with the tools +[_arangoimport_](../../components/tools/arangoimport/_index.md) and +[_arangoexport_](../../components/tools/arangoexport/_index.md). + +{{% comment %}}TODO: Importing from files, Bulk import via HTTP API, Export to files, Bulk export via HTTP API, Syncing with 3rd party systems?{{% /comment %}} diff --git a/site/content/arangodb/oem/operations/administration/license-management.md b/site/content/arangodb/oem/operations/administration/license-management.md new file mode 100644 index 0000000000..6747d85843 --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/license-management.md @@ -0,0 +1,94 @@ +--- +title: Enterprise Edition License Management +menuTitle: License Management +weight: 20 +description: >- + How to check and activate licenses for ArangoDB Enterprise Edition deployments +--- +The Enterprise Edition of ArangoDB requires a license to activate the +Enterprise Edition features. How to set a license key and to retrieve +information about the current license via the JavaScript API is described below. +You can also use an [HTTP API](../../develop/http-api/administration.md#license). + +If you use the ArangoDB Kubernetes Operator, check the +[kube-arangodb documentation](https://arangodb.github.io/kube-arangodb/docs/how-to/set_license.html) +for more details on how to set a license key. + +## Active a license + +On the first installation of any ArangoDB Enterprise Edition instance, you can +immediately use it for testing without restrictions for three hours. + +In the email with the download link, you find a fully featured but +time-wise limited license that allows you to continue testing for two weeks. + +You can apply this evaluation license or a proper license you bought via +_arangosh_ like so: + +```js +db._setLicense("<license-string>"); +``` + +You receive a message reporting whether the operation has been successful. +Please be careful to copy the exact string from the email and to put it in +quotes as shown above. + +```json +{ "error": false, "code": 201 } +``` + +Your license has now been applied. + +## Check the current license + +At any point, you may check the current state of your license in _arangosh_: + +```js +db._getLicense(); +``` + +```json +{ + "features": { + "expires": 1632411828 + }, + "license": "JD4E ... dnDw==", + "version": 1, + "status": "good", + "hash": "..." +} +``` + +The `status` attribute is the executive summary of your license and +can have the following values: + +- `good`: Your license is valid for more than another 1 week. +- `expiring`: Your license is about to expire shortly. Please contact + your ArangoDB sales representative to acquire a new license or + extend your old license. +- `read-only`: Your license has expired at which + point the deployment will be in read-only mode. All read operations to the + instance will keep functioning. However, no data or data definition changes + can be made. Please contact your ArangoDB sales representative immediately. + +The attribute `expires` in `features` denotes the expiry date as Unix timestamp +(in seconds since January 1st, 1970 UTC). + +The `license` field holds an encrypted and base64-encoded version of the +applied license for reference and support from ArangoDB. + +## Monitoring + +In order to monitor the remaining validity of the license, the metric +`arangodb_license_expires` is exposed by Coordinators and DB-Servers, see the +[Metrics API](../../develop/http-api/monitoring/metrics.md). + +## Managing Your License + +Backups, restores, exports and imports and the license management do not +interfere with each other. In other words, the license is not backed up +and restored with any of the above mechanisms. + +Make sure that you store your license in a safe place, and potentially the +email with which you received it, should you require the license key to +re-activate a deployment. diff --git a/site/content/arangodb/oem/operations/administration/log-levels.md b/site/content/arangodb/oem/operations/administration/log-levels.md new file mode 100644 index 0000000000..99d142d025 --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/log-levels.md @@ -0,0 +1,154 @@ +--- +title: Log levels +menuTitle: Log Levels +weight: 15 +description: >- + Every server log message has a log level that classifies the severity of the + reported event and ranges from debug information to fatal errors +--- +The log levels in ArangoDB are, from most to least severe: + +- `FATAL` +- `ERROR` +- `WARN` +- `INFO` +- `DEBUG` +- `TRACE` + +For each log topic (`authentication`, `cluster`, `queries`, etc.), you can +configure the lowest level to log. For example, if you set the log level to +`ERROR` for some log topic, you only get messages of level `ERROR` and higher +(`ERROR` and `FATAL`). If you set the log level to `INFO`, you only get messages +of level `INFO` and higher (`INFO`, `WARN`, `ERROR`, and `FATAL`). + +Most log topics have a default log level of `WARN` or `INFO`. + +See an example of how to +[configure log levels](configuration.md#options-with-multiple-values). + +The meaning of each log level is described below. + +For a list of the available log topics, see [Set the server log levels](../../develop/http-api/monitoring/logs.md#set-the-server-log-levels) in the HTTP API documentation. + +## FATAL + +_Fatal_ errors are the most severe errors and only occur if a service or application +cannot recover safely from an abnormal state, which forces it to shut down. + +Typically, a fatal error only occurs once in the process lifetime, +so if the log file is tied to the process, this is typically +the last message in the log. There might be a few exceptions to this +rule, where it makes more sense to keep the server running, for example +to be able to diagnose the problem better. + +We reserve this error type for the following events: + +- crucial files/folders are missing or inaccessible during startup +- overall application or system failure with a serious danger of + data corruption or loss (the following shutdown is intended to prevent + possible or further data loss) + +**Recommendation**: +Fatal errors should be investigated immediately by a system administrator. + +## ERROR + +If a problem is encountered which is fatal to some operation, but not for +the service or the application as a whole, then an _error_ is logged. + +Reasons for log entries of this severity are for example: + +- missing data +- a required file can't be opened +- incorrect connection strings +- missing services + +If some operation is automatically retried and eventually succeeds, +no error is written to the log. Therefore, if an error is logged, then +it should be taken seriously as it may require user intervention to solve. + +Note that in any distributed system, temporary failures of network connections +or certain servers or services can and will happen. Most systems tolerate +such failures and retry for some time, but eventually run out of patience, +give up, and fail the operation one level up. + +**Recommendation**: +A system administrator should be notified automatically to investigate the error. +By filtering the log to look at errors (and other logged events above), +you can determine the error frequency and quickly identify the initial failure +that might have resulted in a cascade of additional errors. + +## WARN + +A _warning_ is triggered by anything that can potentially cause +application oddities, but from which the system recovers automatically. + +Examples of events which lead to warnings: + +- switching from a primary to backup server +- retrying an operation +- missing secondary data +- things running inefficiently + (in particular slow queries and bad system settings) + +Certain warnings are logged at startup time only, such as startup option +values which lie outside the recommended range. + +These _might_ be problems, or might not. For example, expected transient +environmental conditions such as short loss of network or database +connectivity are logged as warnings, not errors. Viewing a log filtered +to show only warnings and errors may give quick insight into early +hints at the root cause of subsequent errors. + +**Recommendation**: +Can mostly be ignored but can give hints for inefficiencies or +future problems. + +## INFO + +_Info_ messages are generally useful information to log to better +understand what state the system is in. You usually want to +have info messages available but typically don't care about them +under normal circumstances. + +Informative messages are logged in events like: + +- successful initialization +- services starting or stopping +- successful completion of significant transactions +- configuration assumptions + +Viewing log entries of severity _info_ and above should give a quick overview +of major state changes in the process providing top-level context for +understanding any warnings or errors that also occur. Logging info level +messages and above does usually not spam anything beyond good readability. + +**Recommendation**: +Usually good to have, but you don't have to look at _info_ level messages +under normal circumstances. + +## DEBUG + +Information which is helpful to ArangoDB developers as well as to other +people like system administrators to diagnose an application or service +is logged as _debug_ message. + +Debug messages make software much more maintainable but require some +diligence because the value of individual debug statements may change +over time as programs evolve. The best way to achieve this is by getting +the development team in the habit of regularly reviewing logs as a standard +part of troubleshooting reported issues. We encourage our teams to +prune out messages that no longer provide useful context and to add +messages where needed to understand the context of subsequent messages. + +**Recommendation**: +_Debug_ level messages are usually switched off, but you can switch them on +to investigate problems. + +## TRACE + +_Trace_ messages produce a lot of output and are usually only needed by +ArangoDB developers to debug problems in the source code. + +**Recommendation**: +_Trace_ level logging should generally stay disabled. diff --git a/site/content/arangodb/oem/operations/administration/reduce-memory-footprint.md b/site/content/arangodb/oem/operations/administration/reduce-memory-footprint.md new file mode 100644 index 0000000000..5039fe7dcd --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/reduce-memory-footprint.md @@ -0,0 +1,725 @@ +--- +title: Reducing the Memory Footprint of ArangoDB servers +menuTitle: Reduce Memory Footprint +weight: 40 +description: '' +--- +{{< warning >}} +The changes suggested here can be useful to reduce the memory usage of +ArangoDB servers, but they can cause side-effects on performance and other +aspects. +Do not apply any of the changes suggested here before you have tested them in +in a development or staging environment. +{{< /warning >}} + +Usually, a database server tries to use all the memory it can get to +improve performance by caching or buffering. Therefore, it is important +to tell an ArangoDB process how much memory it is allowed to use. +ArangoDB detects the available RAM on the server and divides this up +amongst its subsystems in some default way, which is suitable for a wide +range of applications. This detected RAM size can be overridden with +the environment variable +[`ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY`](../../components/arangodb-server/environment-variables.md). + +However, there may be situations in which there +are good reasons why these defaults are not suitable and the +administrator wants to fine tune memory usage. The two +major reasons for this are: + + - something else (potentially another `arangod` server) is running on + the same machine so that your `arangod` is supposed to use less than + the available RAM, and/or + - the actual usage scenario makes it necessary to increase the memory + allotted to some subsystem at the cost of another to achieve higher + performance for specific tasks. + +To a lesser extent, the same holds true for CPU usage, but operating +systems are generally better in automatically distributing available CPU +capacity amongst different processes and different subsystems. + +There are settings to make ArangoDB run on systems with very +limited resources, but they may also be interesting for your +development machine if you want to make it less taxing for +the hardware and do not work with much data. For production +environments, it is recommended to use less restrictive settings, to +[benchmark](https://www.arangodb.com/performance/) your setup and +fine-tune the settings for maximal performance. + +## Limiting the overall RAM usage + +A first simple approach could be to simply tell the `arangod` process +as a whole to use only a certain amount of memory. This is done by +overriding the detected memory size using the +[`ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY`](../../components/arangodb-server/environment-variables.md) +environment variable. + +This essentially scales down `arangod`'s memory usage to the +given value. This is for example a first measure if more than +one `arangod` server are running on the same machine. + +Note, however, that certain subsystems will then still be able to use +an arbitrary amount of RAM, depending on the load from the user. If you +want to protect your server against such misusages and for more detailed +tuning of the various subsystems, consult the sections below. + +Before getting into the nitty-gritty details, check the overview over +the different subsystems of ArangoDB that are using significant amounts of RAM. + +## Overview over RAM usage in ArangoDB + +This section explains the various areas which use RAM and what they are +for. + +Broadly, ArangoDB uses significant amounts of RAM for the following subsystems: + +- Storage engine including the block cache +- HTTP server and queues +- Edge caches and other caches +- AQL queries +- V8 (JavaScript features) +- ArangoSearch +- AgencyCache/ClusterInfo (cluster meta data) +- Cluster-internal replication + +Of these, the storage engine itself has some subsystems which contribute +towards its memory usage: + +- RocksDB block cache +- Data structures to read data (Bloom filters, index blocks, table readers) +- Data structures to write data (write buffers, table builders, transaction data) +- RocksDB background compaction + +It is important to understand that all these have a high impact on +performance. For example, the block cache is there such that already +used blocks can be retained in RAM for later access. The larger the +cache, the more blocks can be retained and so the higher the probability +that a subsequent access does not need to reach out to disk and thus +incurs no additional cost on performance and IO capacity. + +RocksDB can cache bloom filters and index blocks of its SST files in RAM. +It usually needs approx. 1% of the total size of all SST files in RAM +just for caching these. As a result, most random accesses need only a +single actual disk read to find the data stored under a single RocksDB +key! If not all Bloom filters and block indexes can be held in RAM, then +this can easily slow down random accesses by a factor of 10 to 100, +since suddenly many disk reads are needed to find a single +RocksDB key! + +Other data structures for reading (table readers) and writing (write +batches and write buffers) are also needed for smooth operation. If one +cuts down on these too harshly, reads can be slowed down considerably +and writes can be delayed. The latter can lead to overall slowdowns and +could even end up in total write stalls and stops until enough write +buffers have been written out to disk. + +Since RocksDB is a log structured merge tree (LSM), there must be +background threads to perform compactions. They merge different SST +files and throw out old, no-longer used data. These compaction +operations also need considerable amounts of RAM. If this is limited too +much (by reducing the number of concurrent compaction operations), then +a compaction debt can occur, which also results in write stalls or +stops. + +The other subsystems outside the storage engine also need RAM. If an +ArangoDB server queues up too many requests (for example, if more +requests arrive per time than can be executed), then the data of these +requests (headers, bodies, etc.) are stored in RAM until they can be +processed. + +Furthermore, there are multiple different caches which are sitting in +front of the storage engine, the most prominent one being the edge cache +which helps to speed up graph traversals. The larger these caches, +the more data can be cached and the higher the likelihood that data +which is needed repeatedly is found to be available in cache. + +Essentially, all AQL queries are executed in RAM. That means that every +single AQL query needs some RAM - both on Coordinators and on DB-Servers. +It is possible to limit the memory usage of a single AQL query as well +as the global usage for all AQL queries running concurrently. Obviously, +if either of these limits is reached, an AQL query can fail due to a lack +of RAM, which is then reported back to the user. + +Everything which executes JavaScript (only on Coordinators, user defined +AQL functions and Foxx services), needs RAM, too. If JavaScript is not +to be used, memory can be saved by reducing the number of V8 contexts. + +ArangoSearch uses memory in different ways: + +- Writes which are committed in RocksDB but have not yet been **committed** to + the search index are buffered in RAM, +- The search indexes use memory for **consolidation** of multiple smaller + search index segments into fewer larger ones, +- The actual indexed search data resides in memory mapped files, which + also need RAM to be cached. + +Finally, the cluster internal management uses RAM in each `arangod` +instance. The whole meta data of the cluster is kept in the AgencyCache +and in the ClusterInfo cache. There is very little one can change about +this memory usage. + +Furthermore, the cluster-internal replication needs memory to perform +its synchronization and replication work. Again, there is not a lot one +can do about that. + +The following sections show the various subsystems which the +administrator can influence and explain how this can be done. + +## Write ahead log (WAL) + +RocksDB writes all changes first to the write ahead log (WAL). This is +for crash recovery, the data will then later be written in an orderly +fashion to disk. The WAL itself does not need a lot of RAM, but limiting +its total size can lead to the fact that write buffers are flushed +earlier to make older WAL files obsolete. Therefore, adjusting the +option + +``` +--rocksdb.max-total-wal-size +``` + +to some value smaller than its default of 80MB can potentially help +to reduce RAM usage. However, the effect is rather indirect. + +## Write Buffers + +RocksDB writes into +[memory buffers mapped to on-disk blocks](https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager) +first. At some point, the memory buffers will be full and have to be +flushed to disk. In order to support high write loads, RocksDB might +open a lot of these memory buffers. + +By default, the system may use up to 10 write buffers per column family +and the default write buffer size is 64MB. Since normal write loads will +only hit the documents, edge, primary index and vpack index column +families, this effectively limits the RAM usage to something like 2.5GB. +However, there is a global limit which works across column families, +which can be used to limit the total amount of memory for write buffers +(set to unlimited by default!): + +``` +--rocksdb.total-write-buffer-size +``` + +Note that it does not make sense to set this limit smaller than +10 times the size of a write buffer, since there are currently 10 column +families and each will need at least one write buffer. + +Additionally, RocksDB might keep some write buffers in RAM, which are +already flushed to disk. This is to speed up transaction conflict +detection. This only happens if the option + +``` +--rocksdb.max-write-buffer-size-to-maintain +``` + +is set to a non-zero value. By default, this is set to 0. + +The other options to configure write buffer usage are: + +``` +--rocksdb.write-buffer-size +--rocksdb.max-write-buffer-number +--rocksdb.max-write-buffer-number-definitions +--rocksdb.max-write-buffer-number-documents +--rocksdb.max-write-buffer-number-edge +--rocksdb.max-write-buffer-number-fulltext +--rocksdb.max-write-buffer-number-geo +--rocksdb.max-write-buffer-number-primary +--rocksdb.max-write-buffer-number-replicated-logs +--rocksdb.max-write-buffer-number-vpack +``` + +However, adjusting these usually not helps with RAM usage. + +## RocksDB Block Cache + +The RocksDB block cache has a number of options for configuration. First +of all, its maximal size can be adjusted with the following option: + +``` +--rocksdb.block-cache-size +``` + +The default is 30% of (R - 2GB) where R is the total detected RAM. This +is a sensible default for many cases, but in particular if other +services are running on the same system, this can be too large. On the +other hand, if lots of other things are accounted with the block cache +(see options below), the value can also be too small. + +Sometimes, the system can temporarily use a bit more than the configured +upper limit. If you want to strictly enforce the block cache size limit, +you can set the option + +``` +--rocksdb.enforce-block-cache-size-limit +``` + +to `true`, but it is not recommended since it might lead to failed +operations if the cache is full and we have observed that RocksDB +instances can get stuck in this case. You have been warned. + +There are a number of things for which RocksDB needs RAM. It is possible +to make it so that all of these RAM usages count towards the block cache +usage. This is usually sensible, since it effectively allows to keep +RocksDB RAM usage under a certain configured limit (namely the block +cache size limit). If these things are not accounted in the block cache +usage, they are allocated anyway and this can lead to too much memory +usage. On the other hand, if they are accounted in the block cache +usage, then the block cache has less capacity for its core operations, +the caching of data blocks. + +The following options control accounting for RocksDB RAM usage: + +``` +--rocksdb.cache-index-and-filter-blocks +--rocksdb.cache-index-and-filter-blocks-with-high-priority +--rocksdb.reserve-file-metadata-memory +--rocksdb.reserve-table-builder-memory +--rocksdb.reserve-table-reader-memory +``` + +They are for Bloom filter and block indexes, file metadata, table +building (RAM usage for building SST files, this happens when flushing +memtables to level 0 SST files, during compaction and on recovery) +and table reading (RAM usage for read operations) respectively. + +There are additional options you can enable to avoid that the index and filter +blocks get evicted from cache: + +``` +--rocksdb.pin-l0-filter-and-index-blocks-in-cache +--rocksdb.pin-top-level-index-and-filter +``` + +The first does level 0 Bloom filters and index blocks and its default is +`false`. The second does top level of partitioned index blocks and Bloom +filters into the cache, its default is `true`. + +The block cache basically trades increased RAM usage for less disk I/O, so its +size does not only affect memory usage, but can also affect read performance. + +See also: +- [RocksDB Server Options](../../components/arangodb-server/options.md#rocksdb) +- [Write Buffer Manager](https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager) + +## Transactions + +Before commit, RocksDB builds up transaction data in RAM. This happens +in so-called "memtables" and "write batches". Note that from +v3.12 onwards, this memory usage is accounted for in writing AQL queries and +other write operations, and can thus be limited there. When there are +many or large open transactions, this can sum up to a large amount of +RAM usage. + +A further limit on RAM usage can be imposed by setting the option + +``` +--rocksdb.max-transaction-size +``` + +which is by default unlimited. This setting limits the total size of +a single RocksDB transaction. If the memtables exceed this size, +the transaction is automatically aborted. Note that this cannot guard +against **many** simultaneously uncommitted transactions. + +Another way to limit actual transaction size is "intermediate commits". +This is a setting which leads to the behavior that ArangoDB +automatically commits large write operations while they are executed. This of +course goes against the whole concept of a transaction, since parts of a +transaction which have already been committed cannot be rolled back any +more. Therefore, this is a rather desperate measure to prevent RAM +overusage. You can control this with the following options: + +``` +--rocksdb.intermediate-commit-count +--rocksdb.intermediate-commit-size +``` + +The first option configures automatic intermediate commits based on the number +of documents touched in the transaction (default is `1000000`). The second +configures intermediate commits based on the total size of the documents +touched in the transaction (default is `512MB`). + +## RocksDB compactions + +RocksDB compactions are necessary, but use RAM. You can control how many +concurrent compactions can happen by configuring the number of +background threads RocksDB can use. This can either be done with the + +``` +--rocksdb.max-background-jobs +``` + +option whose default is the number of detected cores. Half +of that number will be the default value for the option + +``` +--rocksdb.num-threads-priority-low +``` + +and that many compactions can happen concurrently. You can also leave +the total number of background jobs and just adjust the latter option. +Fewer concurrent compaction jobs will use less RAM, but will also lead +to slower compaction overall, which can lead to write stalls and even +stops, if a compaction debt builds up under a high write load. + +## Scheduler queues + +If too much memory is used to queue requests in the scheduler queues, +one can simply limit the queue length with this option: + +``` +--server.scheduler-queue-size +``` + +The default is `4096`, which is quite a lot. For small requests, the +memory usage for a full queue will not be significant, but since +individual requests can be large, it may sometimes be necessary to +limit the queue size a lot more to avoid RAM over usage on the queue. + +## Index Caches + +There are in-RAM caches for edge indexes and other indexes. The total +RAM limit for them can be configured with this option: + +``` +--cache.size +``` + +By default, this is set to 25% of (R - 2GB) where R is the total +detected available RAM (or 256MB if that total is at most 4GB). +You can disable the in-memory index +[caches](../../components/arangodb-server/options.md#cache), by setting the limit to 0. + +If you do not have a graph use case and do not use edge collections, +nor the optional hash cache for persistent indexes, it is possible to +use no cache (or a minimal cache size) without a performance impact. In +general, this should correspond to the size of the hot-set of edges and +cached lookups from persistent indexes. + +Starting with v3.11, another way to save memory in the caches is to use compression +by setting the following option: + +``` +--cache.min-value-size-for-edge-compression +``` + +The default is `1GB` which essentially switches the compression off. +If you set this to something like 100, values with at least 100 bytes +will be compressed. + +This costs a little CPU power but the system can then cache more +data in the same amount of memory. + +The behavior of the hash tables used internally by the caches can be +adjusted with the following two options: + +``` +--cache.ideal-lower-fill-ratio +--cache.ideal-upper-fill-ratio +``` + +The defaults are `0.04` and `0.25` respectively. If you increase these +limits, the hash tables have a higher utilization, which uses +less memory but can potentially harm performance. + +There are a number of options to pre-fill the caches under certain +circumstances: + +``` +--rocksdb.auto-fill-index-caches-on-startup +--rocksdb.auto-refill-index-caches-on-modify +--rocksdb.auto-refill-index-caches-on-followers +--rocksdb.auto-refill-index-caches-queue-capacity +``` + +The first leads to the caches being automatically filled on startup, the +second on any modifications. Both are set to `false` by default, so +setting these to `true` will - in general - use more RAM rather than +less. However, it will not lead to usage of more RAM than the configured +limits for all caches. + +The third option above is by default `true`, so that caches on +followers will automatically be refilled if any of the first two options +is set to `true`. Setting this to `false` can save RAM usage on +followers. Of course, this means that in case of a failover the caches +of the new leader will be cold! + +Finally, the amount of write operations being queued for index refill +can be limited with `--rocksdb.auto-refill-index-caches-queue-capacity` +to avoid over-allocation if the indexing cannot keep up with the writes. +The default for this value is 131072. + +## AQL Query Memory Usage + +In addition to all the buffers and caches above, AQL queries will use additional +memory during their execution to process your data and build up result sets. +This memory is used during the query execution only and will be released afterwards, +in contrast to the held memory for buffers and caches. + +By default, queries will build up their full results in memory. While you can +fetch the results batch by batch by using a cursor, every query needs to compute +the entire result first before you can retrieve the first batch. The server +also needs to hold the results in memory until the corresponding cursor is fully +consumed or times out. Building up the full results reduces the time the server +has to work with collections at the cost of main memory. + +In ArangoDB version 3.4 we introduced +[streaming cursors](../../release-notes/version-3.4/whats-new-in-3-4.md#streaming-aql-cursors) with +somewhat inverted properties: less peak memory usage, longer access to the +collections. Streaming is possible on document level, which means that it cannot +be applied to all query parts. For example, a `MERGE()` of all results of a +subquery cannot be streamed (the result of the operation has to be built up fully). +Nonetheless, the surrounding query may be eligible for streaming. + +Aside from streaming cursors, ArangoDB offers the possibility to specify a +memory limit which a query should not exceed. If it does, the query will be +aborted. Memory statistics are checked between execution blocks, which +correspond to lines in the *explain* output. That means queries which require +functions may require more memory for intermediate processing, but this will not +kill the query because the memory. +The startup option to restrict the peak memory usage for each AQL query is +`--query.memory-limit`. This is a per-query limit, i.e. at maximum each AQL query is allowed +to use the configured amount of memory. To set a global memory limit for +all queries together, use the `--query.global-memory-limit` setting. + +You can also use *LIMIT* operations in AQL queries to reduce the number of documents +that need to be inspected and processed. This is not always what happens under +the hood, as some operations may lead to an intermediate result being computed before +any limit is applied. + +## Statistics + +The server collects +[statistics](../../components/arangodb-server/options.md#--serverstatistics) regularly, +which is displayed in the web interface. You will have a light query load every +few seconds, even if your application is idle, because of the statistics. If required, you can +turn it off via: + +``` +--server.statistics false +``` +This setting will disable both the background statistics gathering and the statistics +APIs. To only turn off the statistics gathering, you can use +``` +--server.statistics-history false +``` +That leaves all statistics APIs enabled but still disables all background work +done by the statistics gathering. + +## JavaScript & Foxx + +[JavaScript](../../components/arangodb-server/options.md#javascript) is executed in the ArangoDB +process using the embedded V8 engine: + +- Backend parts of the web interface +- Foxx Apps +- Foxx Queues +- GraphQL +- JavaScript-based transactions +- User-defined AQL functions + +There are several *V8 contexts* for parallel execution. You can think of them as +a thread pool. They are also called *isolates*. Each isolate has a heap of a few +gigabytes by default. You can restrict V8 if you use no or very little +JavaScript: + +``` +--javascript.v8-contexts 2 +--javascript.v8-max-heap 512 +``` + +This will limit the number of V8 isolates to two. All JavaScript related +requests will be queued up until one of the isolates becomes available for the +new task. It also restricts the heap size to 512 MByte, so that both V8 contexts +combined cannot use more than 1 GByte of memory in the worst case. + +### V8 for the Desperate + +You should not use the following settings unless there are very good reasons, +like a local development system on which performance is not critical or an +embedded system with very limited hardware resources! + +``` +--javascript.v8-contexts 1 +--javascript.v8-max-heap 256 +``` + +Using the settings above, you can reduce the memory usage of V8 to 256 MB and just +one thread. There is a chance that some operations will be aborted because they run +out of memory in the web interface for instance. Also, JavaScript requests will be +executed one by one. + +If you are very tight on memory, and you are sure that you do not need V8, you +can disable it completely: + +``` +--javascript.enabled false +--foxx.queues false +``` + +In consequence, the following features will not be available: + +- Backend parts of the web interface +- Foxx Apps +- Foxx Queues +- GraphQL +- JavaScript-based transactions +- User-defined AQL functions + +Note that JavaScript / V8 is automatically disabled for DB-Server and Agency +nodes in a cluster without these limitations. They apply only to single server +instances and Coordinator nodes. You should not disable V8 on Coordinators +because certain cluster operations depend on it. + +## Concurrent operations + +Starting with ArangoDB 3.8 one can limit the number of concurrent +operations being executed on each Coordinator. Reducing the amount of +concurrent operations can lower the RAM usage on Coordinators. The +startup option for this is: + +``` +--server.ongoing-low-priority-multiplier +``` + +The default for this option is 4, which means that a Coordinator with `t` +scheduler threads can execute up to `4 * t` requests concurrently. The +minimal value for this option is 1. + +Also see the [_arangod_ startup options](../../components/arangodb-server/options.md#--serverongoing-low-priority-multiplier). + +## CPU usage + +We cannot really reduce CPU usage, but the number of threads running in parallel. +Again, you should not do this unless there are very good reasons, like an +embedded system. Note that this will limit the performance for concurrent +requests, which may be okay for a local development system with you as only +user. + +The number of background threads can be limited in the following way: + +``` +--arangosearch.threads-limit 1 +--rocksdb.max-background-jobs 4 +--server.maintenance-threads 3 +--server.maximal-threads 5 +--server.minimal-threads 1 +``` + +This will usually not be good for performance, though. + +In general, the number of threads is determined automatically to match the +capabilities of the target machine. However, each thread requires at most 8 MB +of stack memory when running ArangoDB on Linux (most of the time a lot less), +so having a lot of concurrent +threads around will need a lot of memory, too. +Reducing the number of server threads as in the example above can help reduce the +memory usage by thread, but will sacrifice throughput. + +In addition, the following option will make logging synchronous, saving one +dedicated background thread for the logging: + +``` +--log.force-direct true +``` + +This is not recommended unless you only log errors and warnings. + +## Examples + +If you don't want to go with the default settings, you should first adjust the +size of the block cache and the edge cache. If you have a graph use case, you +should go for a larger edge cache. For example, split the memory 50:50 between +the block cache and the edge cache. If you have no edges, then go for a minimal +edge cache and use most of the memory for the block cache. + +For example, if you have a machine with 40 GByte of memory and you want to +restrict ArangoDB to 20 GB of that, use 10 GB for the edge cache and 10 GB for +the block cache if you use graph features. + +Please keep in mind that during query execution additional memory will be used +for query results temporarily. If you are tight on memory, you may want to go +for 7 GB each instead. + +If you have an embedded system or your development laptop, you can use all of +the above settings to lower the memory footprint further. For normal operation, +especially production, these settings are not recommended. + +## Linux System Configuration + +The main deployment target for ArangoDB is Linux. As you have learned above +ArangoDB and its innards work a lot with memory. Thus its vital to know how +ArangoDB and the Linux kernel interact on that matter. The linux kernel offers +several modes of how it will manage memory. You can influence this via the proc +filesystem, the file `/etc/sysctl.conf` or a file in `/etc/sysctl.conf.d/` which +your system will apply to the kernel settings at boot time. The settings as +named below are intended for the sysctl infrastructure, meaning that they map +to the `proc` filesystem as `/proc/sys/vm/overcommit_memory`. + +A `vm.overcommit_memory` setting of **2** can cause issues in some environments +in combination with the bundled memory allocator ArangoDB ships with (jemalloc). + +The allocator demands consecutive blocks of memory from the kernel, which are +also mapped to on-disk blocks. This is done on behalf of the server process +(*arangod*). The process may use some chunks of a block for a long time span, but +others only for a short while and therefore release the memory. It is then up to +the allocator to return the freed parts back to the kernel. Because it can only +give back consecutive blocks of memory, it has to split the large block into +multiple small blocks and can then return the unused ones. + +With an `vm.overcommit_memory` kernel settings value of **2**, the allocator may +have trouble with splitting existing memory mappings, which makes the *number* +of memory mappings of an arangod server process grow over time. This can lead to +the kernel refusing to hand out more memory to the arangod process, even if more +physical memory is available. The kernel will only grant up to `vm.max_map_count` +memory mappings to each process, which defaults to 65530 on many Linux +environments. + +Another issue when running jemalloc with `vm.overcommit_memory` set to **2** is +that for some workloads the amount of memory that the Linux kernel tracks as +*committed memory* also grows over time and never decreases. Eventually, +*arangod* may not get any more memory simply because it reaches the configured +overcommit limit (physical RAM * `overcommit_ratio` + swap space). + +The solution is to +[modify the value of `vm.overcommit_memory`](../installation/linux/operating-system-configuration.md#overcommit-memory) +from **2** to either **0** or **1**. This will fix both of these problems. +We still observe ever-increasing *virtual memory* consumption when using +jemalloc regardless of the overcommit setting, but in practice this should not +cause any issues. **0** is the Linux kernel default and also the setting we recommend. + +For the sake of completeness, let us also mention another way to address the +problem: use a different memory allocator. This requires to compile ArangoDB +from the source code without jemalloc (`-DUSE_JEMALLOC=Off` in the call to cmake). +With the system's libc allocator you should see quite stable memory usage. We +also tried another allocator, precisely the one from `libmusl`, and this also +shows quite stable memory usage over time. What holds us back to change the +bundled allocator are that it is a non-trivial change and because jemalloc has +very nice performance characteristics for massively multi-threaded processes +otherwise. + +## Testing the Effects of Reduced I/O Buffers + +![Performance Graph](../../../../images/performance_graph.png) + +- 15:50 – Start bigger import +- 16:00 – Start writing documents of ~60 KB size one at a time +- 16:45 – Add similar second writer +- 16:55 – Restart ArangoDB with the RocksDB write buffer configuration suggested above +- 17:20 – Buffers are full, write performance drops +- 17:38 – WAL rotation + +What you see in above performance graph are the consequences of restricting the +write buffers. Until we reach a 90% fill rate of the write buffers the server +can almost follow the load pattern for a while at the cost of constantly +increasing buffers. Once RocksDB reaches 90% buffer fill rate, it will +significantly throttle the load to ~50%. This is expected according to the +[upstream documentation](https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager): + +> […] a flush will be triggered […] if total mutable memtable size exceeds 90% +> of the limit. If the actual memory is over the limit, more aggressive flush +> may also be triggered even if total mutable memtable size is below 90%. + +Since we only measured the disk I/O bytes, we do not see that the document save +operations also doubled in request time. diff --git a/site/content/arangodb/oem/operations/administration/telemetrics.md b/site/content/arangodb/oem/operations/administration/telemetrics.md new file mode 100644 index 0000000000..49e50f608f --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/telemetrics.md @@ -0,0 +1,129 @@ +--- +title: Telemetrics +menuTitle: Telemetrics +weight: 10 +description: >- + ArangoDB automatically gathers information on how it is used and the features + being utilized, but you can disable this data collection +--- +ArangoDB gathers metrics by default, to identify the primary usage patterns and +features, and to measure their adoption rate. + +It is important to note that the information collected by ArangoDB is +non-personal and purely statistical and helps ArangoDB determine which +features are most used, how the general usage model looks like, and +whether ArangoDB is configured properly. + +This data is anonymous and does not contain any personal information like +usernames or IP addresses that could be used to identify a particular user, nor +does it contain any content of the documents stored in ArangoDB. +This means that your privacy is protected, and that there is no risk of your +data being compromised. + +The data is fetched and transmitted by _arangosh_ and sent to ArangoDB Inc. or +one of its subsidiaries. It is not shared with other companies. + +## How to disable telemetrics + +If for any reason you prefer not to share usage statistics with ArangoDB, you +can easily disable this feature by setting the `--server.telemetrics-api` +startup option to `false`. The default value is `true`. + +## Collected metrics + +The anonymous metrics ArangoDB collects and transmits include the following: + +**Host machine environment**: This includes statistics about your operating +system, license type, and available RAM and CPU resources. + +- The operating system +- The platform (e.g. Linux) +- The number of CPU cores +- Whether the number of CPU cores is overridden +- The memory size +- Whether the memory size is overridden +- The ArangoDB license type (Community Edition or Enterprise Edition) + +**Runtime information**: This includes statistics related to your deployment +and startup mode, RAM and CPU usage, and shard configuration (number of +shards, followers, leaders, Coordinators, databases, and servers participating +in sharding). + +- The date and time of fetching the deployment information +- The deployment mode (cluster, Active Failover, etc.) +- The persisted deployment ID +- The startup mode (ArangoDB Starter, Kubernetes operator, etc.) +- The number of Agents +- The number of DB-Servers +- The number of Coordinators +- A list of detailed information per server + - Is it in maintenance mode? + - Is it read-only? + - The endpoint address + - The server ID + - The server alias + - The server role (Agent, DB-Server, Coordinator, Single) + - The ArangoDB version + - The ArangoDB build +- Shards statistics + - The number of servers participating in sharding + - The number of collections + - The number of shards + - The number of leaders + - The number of real leaders + - The number of followers +- Engine statistics + - The `rocksdb_block_cache_usage` metric + - The `rocksdb_block_cache_capacity` metric + - The `rocksdb_free_disk_space` metric + - The `rocksdb_total_disk_space` metric + - The `rocksdb_live_sst_files_size` metric + - The `rocksdb_estimate_live_data_size` metric + - The `rocksdb_estimate_num_keys` metric + - RocksDB's `cache.allocated` metric + - RocksDB's `cache.limit` metric +- Process statistics + - The number of threads + - The process uptime + - The resident set size + - The virtual size + +**Feature usage data**: This includes information about which features are +most used and how the usage model looks like. Statistics include details about +the type and number of collections per database, indexes, smart graphs, queries, +as well as configuration details in terms of sharding and replication. + +- The number of databases +- A list of detailed information per database + - Whether it is a single shard database + - The number of document collections + - The number of edge collections + - The number of smart collections + - The number of disjoint smart collections + - The number of Views + - A list of detailed information per collection + - The collection type + - The persistent collection ID + - Whether it is used in a SmartGraph + - Whether it is a disjoint collection + - The number of shards + - The replication factor + - The plan ID + - The number of documents + - The number of primary indexes + - The number of edge indexes + - The number of hash indexes + - The number of skiplist indexes + - The number of persistent indexes + - The number of geo indexes + - The number of fulltext indexes + - The number of iresearch indexes + - The number of inverted indexes + - The number of zkd indexes + - A list of detailed information per index + - The index type + - Is it a unique index? + - Is it a sparse index? + - The index memory size + - The index cache usage + - The index cache size diff --git a/site/content/arangodb/oem/operations/administration/user-management/_index.md b/site/content/arangodb/oem/operations/administration/user-management/_index.md new file mode 100644 index 0000000000..a07198e053 --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/user-management/_index.md @@ -0,0 +1,433 @@ +--- +title: Managing Users +menuTitle: User Management +weight: 30 +description: >- + User management is possible in the web interface and in _arangosh_ in the + context of the `_system` database +--- +Authentication needs to be enabled on the server in order to employ user +permissions. Authentication is turned on by default in ArangoDB. You should +make sure that it was not turned off manually however. Check the configuration +file (normally named `/etc/arangodb.conf`) and make sure it contains the +following line in the `[server]` section: + +``` +authentication = true +``` + +This will make ArangoDB require authentication for every request (including +requests to Foxx apps depending on the option below). If you want to run Foxx +apps without HTTP authentication, but activate HTTP authentication for the built-in +server APIs, you can add the following line in the `[server]` section of the +configuration: + +``` +authentication-system-only = true +``` + +The above will bypass authentication for requests to Foxx apps. + +When finished making changes, you need to restart ArangoDB, e.g.: + +``` +service arangodb restart +``` + +User management is possible in the [web interface](../../../components/web-interface/users.md) +while logged on to the `_system` database and in +[arangosh](in-arangosh.md), as well as via the +[HTTP API](../../../develop/http-api/users.md). + +There is a built-in user account `root` which cannot be removed. Note that it +has an empty password by default, so make sure to set a strong password +immediately. Additional users can be created and granted different actions and +access levels. ArangoDB user accounts are valid throughout a server instance +(across databases). + +## Actions and Access Levels + +An ArangoDB server contains a list of users. It also defines various +access levels that can be assigned to a user (for details, see below) +and that are needed to perform certain actions. These actions can be grouped +into three categories: + +- server actions +- database actions +- collection actions + +The **server actions** are + +- **create user**: allows to create a new user. + +- **update user**: allows to change the access levels and details of an existing +user. + +- **drop user**: allows to delete an existing user. + +- **create database**: allows to create a new database. + +- **drop database**: allows to delete an existing database. + +- **shutdown server**: remove server from cluster and shutdown + +The **database actions** are tied to a given database, and access +levels must be set +for each database individually. For a given database the actions are + +- **create collection**: allows to create a new collection in the given database. + +- **update collection**: allows to update properties of an existing collection. + +- **drop collection**: allows to delete an existing collection. + +- **create index**: allows to create an index for an existing collection in the +given database. + +- **drop index**: allows to delete an index of an existing collection in the given +database. + +The **collection actions** are tied to a given collection of a given +database, and access levels must be set for each collection individually. +For a given collection the actions are + +- **read document**: read a document of the given collection. + +- **create document**: creates a new document in the given collection. + +- **modify document**: modifies an existing document of the given collection, +this can be an update or replace operation. + +- **drop document**: deletes an existing document of the given collection. + +- **truncate collection**: deletes all documents of a given collection. + +To perform actions on the server level the user needs at least the following +access levels. The access levels are *Administrate* and +*No access*: + +| server action | server level | +|---------------------------|--------------| +| create a database | Administrate | +| drop a database | Administrate | +| create a user | Administrate | +| update a user | Administrate | +| update user access level | Administrate | +| drop a user | Administrate | +| shutdown server | Administrate | + +To perform actions in a specific database (like creating or dropping collections), +a user needs at least the following access level. +The possible access levels for databases are *Administrate*, *Access* and *No access*. +The access levels for collections are *Read/Write*, *Read Only* and *No Access*. + +| database action | database level | collection level | +|------------------------------|----------------|------------------| +| create collection | Administrate | Read/Write | +| list collections | Access | Read Only | +| rename collection | Administrate | Read/Write | +| modify collection properties | Administrate | Read/Write | +| read properties | Access | Read Only | +| drop collection | Administrate | Read/Write | +| create an index | Administrate | Read/Write | +| drop an index | Administrate | Read/Write | +| see index definition | Access | Read Only | + +Note that the access level *Access* for a database is always required to perform +any action on a collection in that database. + +For collections a user needs the following access +levels to the given database and the given collection. The access levels for +the database are *Administrate*, *Access* and *No access*. The access levels +for the collection are *Read/Write*, *Read Only* and *No Access*. + +| action | collection level | database level | +|-----------------------|-------------------------|------------------------| +| read a document | Read/Write or Read Only | Administrate or Access | +| create a document | Read/Write | Administrate or Access | +| modify a document | Read/Write | Administrate or Access | +| drop a document | Read/Write | Administrate or Access | +| truncate a collection | Read/Write | Administrate or Access | + +**Example** + +For example, given + +- a database *example* +- a collection *data* in the database *example* +- a user *JohnSmith* + +If the user *JohnSmith* is assigned the access level *Access* for the database +*example* and the level *Read/Write* for the collection *data*, then the user +is allowed to read, create, modify or delete documents in the collection +*data*. But the user is, for example, not allowed to create indexes for the +collection *data* nor create new collections in the database *example*. + +## Granting Access Levels + +Access levels can be managed via the [web interface](../../../components/web-interface/users.md) +or in [arangosh](in-arangosh.md). + +In order to grant an access level to a user, you can assign one of +three access levels for each database and one of three levels for each +collection in a database. The server access level for the user follows +from the database access level in the `_system` database, it is +*Administrate* if and only if the database access level is +*Administrate*. Note that this means that database access level +*Access* does not grant a user server access level *Administrate*. + +### Initial Access Levels + +When a user creates a database, the access level of the user for that database +is set to *Administrate*. The same is true for creating a collection, in this +case the user gets *Read/Write* access to the collection. + +### Wildcard Database Access Level + +With the above definition, one must define the database access level for +all database/user pairs in the server, which would be very tedious. In +order to simplify this process, it is possible to define a wildcard +database access level for a user. This wildcard is used if the database +access level is *not* explicitly defined for a certain database. Each new +created user has an initial database wildcard of *No Access*. + +Changing the wildcard database access level for a user will change the +access level for all databases that have no explicitly defined +access level. Note that this includes databases which will be created +in the future and for which no explicit access levels are set for that +user! + +If you delete the wildcard, the default access level is defined as *No Access*. + +The `root` user has an initial database wildcard of *Administrate*. + +If a user has the access level *Access* or *Administrate* for the `_system` +database but a lower wildcard database access level, then the `_system` database +access level is granted for all databases that do not have an explicit +access level defined. + +See [Permission Resolution](#permission-resolution) for details. + +**Example** + +Assume user *JohnSmith* has the following database access levels: + +| | Access level | +|--------------------|--------------| +| database `_system` | No Access | +| database `shop1` | Administrate | +| database `shop2` | No Access | +| database `*` | Access | + +This gives the user *JohnSmith* the following database level access: + +- database `_system`: *No Access* +- database `shop1`: *Administrate* +- database `shop2`: *No Access* +- database `something`: *Access* + +If the wildcard `*` is changed from *Access* to *No Access*, then the +permissions change as follows: + +- database `_system`: *No Access* +- database `shop1`: *Administrate* +- database `shop2`: *No Access* +- database `something`: *No Access* + +If the `_system` database access level is changed from *No Access* to +*Administrate*, then the permissions change again for databases with no +explicitly defined access level: + +- database `_system`: *Administrate* +- database `shop1`: *Administrate* +- database `shop2`: *No Access* +- database `something`: *Administrate* + +### Wildcard Collection Access Level + +For each user and database, there is a wildcard collection access level. +This level is used for all collections of a database without an explicitly +defined collection access level. Note that this includes collections +which will be created in the future and for which no explicit access +levels are set for a that user! Each new created user has an initial +collection wildcard of *No Access*. + +If you delete the wildcard, the system defaults to *No Access*. + +The `root` user has an initial collection wildcard of *Read/Write* in every database. + +When creating a user through +[`db._createDatabase()`](../../../develop/javascript-api/@arangodb/db-object.md#db_createdatabasename--options--users), +the access level of the user for this database is set to *Administrate* and the +wildcard for all collections within this database are set to *Read/Write*. + +If a user has the access level *Access* or *Administrate* for the `_system` +database but a lower wildcard database access level or wildcard collection +access level, then the `_system` database access level is granted for all +collections that do not have an explicit access level defined. + +See [Permission Resolution](#permission-resolution) for details. + +{{< security >}} +It is recommended to use explicitly defined access levels for all databases and +collections instead of wildcard grants to avoid accidentally granting more +permissions than intended. +{{< /security >}} + +**Examples** + +Assume user *JohnSmith* has the following database access levels: + +| | Access level | +|--------------------|--------------| +| database `_system` | No Access | +| database `*` | Access | + +And the following collection access levels: + +| | Access level | +|-----------------------------------------|--------------| +| database `*`, collection `*` | Read/Write | +| database `shop1`, collection `products` | Read-Only | +| database `shop1`, collection `*` | No Access | +| database `shop2`, collection `reviews` | No Access | + +Then the user *JohnSmith* gets the following collection access levels: + +- database `shop1`, collection `products`: *Read-Only* +- database `shop1`, collection `customers`: *Read/Write* +- database `shop2`, collection `reviews`: *No Access* + +Explanation: + +Database `shop1`, collection `products` directly matches a defined +collection access level and the database access level is higher +than *No Access*, leading to *Read-Only* access for the collection. + +Database `shop1`, collection `customers` does not match a defined access +level. There is a wildcard collection access level of *No Access*, but it cannot +lower the access level granted by the wildcard combination of database `*`, +collection `*`, leading to *Read/Write* access for the collection. + +Database `shop2` does not match a defined access level. However, the database +matches the database wildcard access level of *Access*. The access level for all +collections with no defined access level would be *Read/Write* because of the +wildcard combination of database `*`, collection `*`, but the `reviews` +collection has a defined access level of *No Access*, leading to no access for +this collection. + +Assume user *JohnSmith* has the following database access levels: + +| | Access level | +|--------------------|--------------| +| database `_system` | Access | +| database `shop2` | Administrate | +| database `*` | No Access | + +And the following collection access levels: + +| | Access level | +|------------------------------------------|--------------| +| database `shop1`, collection `customers` | No Access | +| database `shop1`, collection `*` | No Access | + +Then the user *JohnSmith* gets the following collection access levels: + +- database `shop1`, collection `products`: *Read-Only* +- database `shop1`, collection `customers`: *No Access* +- database `shop2`, collection `reviews`: *Read/Write* + +Explanation: + +Database `shop1`, collection `products` does not match a defined access +level. There is a wildcard collection access level of *No Access*, but it cannot +lower the access level granted via the `_system` database, leading to *Read-Only* +access for the collection. + +Database `shop1`, collection `customers` directly matches a defined +collection access level. The database access level is higher than *No Access* +but the explicitly defined collection access level of *No Access* leads to no +access for the collection. + +Database `shop2` has a defined access level of *Administrate*. No access level +is defined for its collections, which is equal to a wildcard collection +access level of *No Access*. However, the *Administrate* database access level +leads to *Read-Write* access for all collections in the database, including the +`reviews` collection. + +### Permission Resolution + +The access levels for databases and collections are resolved in the following way: + +For a database "*foo*": +1. Check if there is a specific database grant for *foo*. + If yes, use the granted access level. +2. Choose the higher access level of: + - A wildcard database grant (like `grantDatabase('user', '*', 'rw')`). + - A database grant on the `_system` database. + +For a collection named "*bar*" in a database "*foo*": +1. Check whether the effective access level for the database *foo* is higher than + *No Access* (see above). If not, then you cannot access the collection *bar*. +2. Check if there is a specific collection grant for *bar*. + If yes, use the granted collection access level for *bar*. +3. Choose the higher access level of: + - A wildcard collection grant in the same database + (like `grantCollection('user', 'foo', '*', 'rw')`). + - A wildcard database grant (like `grantDatabase('user', '*', 'rw')`). + - The access level for the current database (like `grantDatabase('user', 'foo', 'rw'`). + - The access level for the `_system` database. + +An exception to this are system collections, where only the access level for the +database is used. + +### System Collections + +The access level for system collections cannot be changed. They follow +different rules than user defined collections and may change without further +notice. The system collections follow these rules: + +| Collection | Access level | +|--------------------------------------|--------------| +| `_users` (in the `_system` database) | No Access | +| `_queues` | Read-Only | +| `_frontend` | Read/Write | +| `*` (default) | *based on the current database* | + +All other system collections have access level *Read/Write* if the +user has *Administrate* access to the database. They have access level +*Read/Only* if the user has *Access* to the database. + +To modify these system collections, you should always use the +specialized APIs provided by ArangoDB. For example, +no user has access to the `_users` collection in the `_system` +database. All changes to the access levels must be done using the +[`@arangodb/users` module of the JavaScript API](in-arangosh.md), +the [`/_api/user` HTTP API endpoints](../../../develop/http-api/users.md), +or the web interface. + +### LDAP Users + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +ArangoDB supports LDAP as an external authentication system. For detailed +information please have look into the +[LDAP configuration guide](../../../components/arangodb-server/ldap.md). + +There are a few differences to *normal* ArangoDB users: +- ArangoDB does not "*know*" LDAP users before they first authenticate. + Calls to various APIs using endpoints in `_api/users/*` will **fail** until + the user first logs-in. +- Access levels of each user are periodically updated. This will happen by + default every *5 minutes*. +- It is not possible to change permissions on LDAP users directly, only on **roles** +- LDAP users cannot store configuration data per user + (affects for example custom settings in the graph viewer). + +To grant access for an LDAP user you will need to create *roles* within the +ArangoDB server. A role is just a user with the `:role:` prefix in its name. +Role users cannot login as database users, the `:role:` prefix ensures this. +Your LDAP users will need to have at least one role; once users log in they +will be automatically granted the union of all access rights of all their roles. +Note that a lower right grant in one role will be overwritten by a higher +access grant in a different role. diff --git a/site/content/arangodb/oem/operations/administration/user-management/in-arangosh.md b/site/content/arangodb/oem/operations/administration/user-management/in-arangosh.md new file mode 100644 index 0000000000..395f606c1d --- /dev/null +++ b/site/content/arangodb/oem/operations/administration/user-management/in-arangosh.md @@ -0,0 +1,364 @@ +--- +title: Managing Users in the ArangoDB Shell +menuTitle: In arangosh +weight: 5 +description: >- + The `@arangodb/users` module exposes a JavaScript API to manage user accounts +--- +Connect with `arangosh` to the server or a Coordinator respectively. +The module `@arangodb/users` exposes a JavaScript API to manage user accounts. + +Please note, that for backward compatibility the server access levels +follow from the database access level on the `_system` database. + +Also note that the server and database access levels are represented as + +- `rw`: for *Administrate* +- `ro`: for *Access* +- `none`: for *No access* + +See [Managing Users](../_index.md) for details and note that using wildcard +database and collection access levels is discouraged. + +**Example** + +Start *arangosh* and require the users module. Use it to create a new user: + +```js +arangosh --server.endpoint tcp://127.0.0.1:8529 ... +... +> const users = require('@arangodb/users'); +> users.save('JohnSmith', 'mypassword'); +``` + +It creates a user called *JohnSmith* with *mypassword* as password. This user +will have no access at all. + +Note that running the command like this may store the password literally in +ArangoShell's history. To avoid that, either disable the history +(`--console.history false`) or use a dynamically created password, e.g.: + +```js +> passwd = require('internal').genRandomAlphaNumbers(20); +> users.save('JohnSmith', passwd); +``` + +The above will print the password on screen (so you can memorize it) but will +not store it in the command history. + +While there, you probably want to change the password of the default `root` +user too. Otherwise one will be able to connect with the default `root` user +and its empty password. The following commands change the `root` user's password: + +```js +> passwd = require('internal').genRandomAlphaNumbers(20); +> require('@arangodb/users').update('root', passwd); +``` + +Back to our user account *JohnSmith*. Let us create a new database +and grant him access to it with `grantDatabase()`: + +```js +> db._createDatabase('testdb'); +> users.grantDatabase('JohnSmith', 'testdb', 'rw'); +``` + +This grants the user *Administrate* access to the database +*testdb*. `revokeDatabase()` will revoke this access level setting. + +{{< info >}} +Using the `grantDatabase()` function does not necessarily grant users the +access level to read or write to collections in a database. If you grant access +to a database, you need to explicitly grant access levels to individual +collections via `grantCollection()` unless a wildcard or `_system` database +access level applies. +{{< /info >}} + +Before we can grant *JohnSmith* access to a collection, we first have to +connect to the new database and create a collection. Disconnect `arangosh` +by pressing Ctrl+C twice. Then reconnect, but to the database we created: + +```js +arangosh --server.endpoint tcp://127.0.0.1:8529 --server.database testdb ... +... +> db._create('testcoll'); +> const users = require('@arangodb/users'); +> users.grantCollection('JohnSmith', 'testdb', 'testcoll', 'rw'); +``` + +It is not necessary to reconnect to the `_system` database in order to grant +access to the collection. + +To confirm that the authentication works as expected, try to connect to +different databases as *JohnSmith*: + +``` +arangosh --server.endpoint tcp://127.0.0.1:8529 --server.username JohnSmith --server.database testdb ... +... +> Connected to ArangoDB 'http+tcp://127.0.0.1:8529, version: 3.5.2 [SINGLE, server], database: 'testdb', username: 'JohnSmith' +``` + +``` +arangosh --server.endpoint tcp://127.0.0.1:8529 --server.username JohnSmith --server.database _system ... +... +> Could not connect to endpoint 'tcp://127.0.0.1:8529', database: '_system', username: 'JohnSmith' +> Error message: 'not authorized to execute this request' +``` + +You can also use curl to check that you are actually getting HTTP 401 +(Unauthorized) server responses for requests that require authentication: + +``` +curl --dump - http://127.0.0.1:8529/_api/version +``` + +## Save + +`users.save(user, passwd, active, extra)` + +This will create a new ArangoDB user. The user name must be specified in *user* +and must not be empty. Note that usernames *must* not start with `:role:` +(reserved for LDAP authentication). + +The password must be given as a string, too, but can be left empty if +required. If you pass the special value *ARANGODB_DEFAULT_ROOT_PASSWORD*, the +password will be set the value stored in the environment variable +`ARANGODB_DEFAULT_ROOT_PASSWORD`. This can be used to pass an instance +variable into ArangoDB. For example, the instance identifier from Amazon. + +If the *active* attribute is not specified, it defaults to *true*. The *extra* +attribute can be used to save custom data with the user. + +This method will fail if either the user name or the passwords are not +specified or given in a wrong format, or there already exists a user with the +specified name. + +**Note**: The user will not have permission to access any database. You need +to grant the access rights for one or more databases using +[grantDatabase](#grant-database). + +*Examples* + +```js +--- +name: USER_02_saveUser +description: '' +--- +require('@arangodb/users').save('my-user', 'my-secret-password'); +``` + +## Grant Database + +`users.grantDatabase(user, database, type)` + +This grants *type* ('rw', 'ro' or 'none') access to the *database* for +the *user*. If *database* is `"*"`, this sets the wildcard database access +level for the user *user*. + +The server access level follows from the access level for the database +`_system`. + +## Revoke Database + +`users.revokeDatabase(user, database)` + +This clears the access level setting to the *database* for the *user* and +the wildcard database access setting for this user kicks in. In case no wildcard +access was defined the default is *No Access*. This will also +clear the access levels for all the collections in this database. + +## Grant Collection + +`users.grantCollection(user, database, collection, type)` + +This grants *type* ('rw', 'ro' or 'none') access level to the *collection* +in *database* for the *user*. If *collection* is `"*"` this sets the +wildcard collection access level for the user *user* in database +*database*. + +## Revoke Collection + +`users.revokeCollection(user, database)` + +This clears the access level setting to the collection *collection* for the +user *user*. The system will either fallback to the wildcard collection access +level or default to *No Access* + +## Replace + +`users.replace(user, passwd, active, extra)` + +This will look up an existing ArangoDB user and replace its user data. + +The username must be specified in *user*, and a user with the specified name +must already exist in the database. + +The password must be given as a string, too, but can be left empty if required. + +If the *active* attribute is not specified, it defaults to *true*. The +*extra* attribute can be used to save custom data with the user. + +This method will fail if either the user name or the passwords are not specified +or given in a wrong format, or if the specified user cannot be found in the +database. + +**Note**: this function will not work from within the web interface + +*Examples* + +```js +--- +name: USER_03_replaceUser +description: '' +--- +require("@arangodb/users").replace("my-user", "my-changed-password"); +``` + +## Update + +`users.update(user, passwd, active, extra)` + +This will update an existing ArangoDB user with a new password and other data. + +The user name must be specified in *user* and the user must already exist in +the database. + +The password must be given as a string, too, but can be left empty if required. + +If the *active* attribute is not specified, the current value saved for the +user will not be changed. The same is true for the *extra* attribute. + +This method will fail if either the user name or the passwords are not specified +or given in a wrong format, or if the specified user cannot be found in the +database. + +*Examples* + +```js +--- +name: USER_04_updateUser +description: '' +--- +require("@arangodb/users").update("my-user", "my-secret-password"); +``` + +## isValid + +`users.isValid(user, password)` + +Checks whether the given combination of user name and password is valid. The +function will return a boolean value if the combination of user name and password +is valid. + +Each call to this function is penalized by the server sleeping a random +amount of time. + +*Examples* + +```js +--- +name: USER_05_isValidUser +description: '' +--- +require("@arangodb/users").isValid("my-user", "my-secret-password"); +``` + +## Remove + +`users.remove(user)` + +Removes an existing ArangoDB user from the database. + +The user name must be specified in *User* and the specified user must exist in +the database. + +This method will fail if the user cannot be found in the database. + +*Examples* + +```js +--- +name: USER_07_removeUser +description: '' +--- +require("@arangodb/users").remove("my-user"); +~require('@arangodb/users').save('my-user', 'my-secret-password'); +``` + +## Document + +`users.document(user)` + +Fetches an existing ArangoDB user from the database. + +The user name must be specified in *user*. + +This method will fail if the user cannot be found in the database. + +*Examples* + +```js +--- +name: USER_04_documentUser +description: '' +--- +require("@arangodb/users").document("my-user"); +``` + +## All + +`users.all()` + +Fetches all existing ArangoDB users from the database. + +*Examples* + +```js +--- +name: USER_06_AllUsers +description: '' +--- +require("@arangodb/users").all(); +``` + +## Reload + +`users.reload()` + +Reloads the user authentication data on the server + +All user authentication data is loaded by the server once on startup only and is +cached after that. When users get added or deleted, a cache flush is done +automatically, and this can be performed by a call to this method. + +*Examples* + +```js +--- +name: USER_03_reloadUser +description: '' +--- +require("@arangodb/users").reload(); +``` + +## Permission + +`users.permission(user, database[, collection])` + +Fetches the access level to the database or a collection. + +The user and database name must be specified, optionally you can specify +the collection name. + +This method will fail if the user cannot be found in the database. + +*Examples* + +```js +--- +name: USER_05_permission +description: '' +--- +~require("@arangodb/users").grantDatabase("my-user", "testdb"); +require("@arangodb/users").permission("my-user", "testdb"); +``` diff --git a/site/content/arangodb/oem/operations/backup-and-restore.md b/site/content/arangodb/oem/operations/backup-and-restore.md new file mode 100644 index 0000000000..483260b65e --- /dev/null +++ b/site/content/arangodb/oem/operations/backup-and-restore.md @@ -0,0 +1,345 @@ +--- +title: Backup and Restore +menuTitle: Backup & Restore +weight: 215 +description: >- + Physical backups, logical backups with _arangodump_ and _arangorestore_, + hot backups with _arangobackup_ +--- +ArangoDB supports three backup methods: + +1. Physical (raw or "cold") backups +2. Logical backups +3. Hot backups + +These backup methods save the data which is in the database system. In addition, +make sure to backup things like configuration files, startup scripts, Foxx +services, access tokens, secrets, certificates etc. and store them in a +different location securely. + +Performing frequent backups is important and a recommended best practices that +can allow you to recover your data in case unexpected problems occur. +Hardware failures, system crashes, or users mistakenly deleting data can always +happen. Furthermore, while a big effort is put into the development and testing +of ArangoDB (in all its deployment modes), ArangoDB, as any other software +product, might include bugs or errors and data loss could occur. +It is therefore important to regularly backup your data to be able to recover +and get up and running again in case of serious problems. + +Creating backups of your data before an ArangoDB upgrade is also a best practice. + +{{< warning >}} +Making use of a high availability deployment mode of ArangoDB, like Active Failover, +Cluster or Datacenter-to-Datacenter Replication, does not remove the need of +taking frequent backups, which are recommended also when using such deployment modes. +{{< /warning >}} + +## Physical backups + +Physical (raw or "cold") backups can be done when the ArangoDB Server is not running +by making a raw copy of the ArangoDB data directory. + +Such backups are extremely fast as they only involve file copying. + +If ArangoDB runs in Active Failover or Cluster mode, it is necessary +to copy the data directories of all the involved processes (_Agents_, _Coordinators_ and +_DB-Servers_). + +{{< warning >}} +It is extremely important that physical backups are taken only after all the ArangoDB +processes have been shut down and the processes are not running anymore. +Otherwise files might still be written to, likely resulting in a corrupt and incomplete backup. +{{< /warning >}} + +It is not always possible to take a physical backup as this method requires a shutdown +of the ArangoDB processes. However in some occasions such backups are useful, often +in conjunction to the backup coming from another backup method. + +## Logical Backups + +Logical backups can be created and restored with the tools +[_arangodump_](../components/tools/arangodump/_index.md) and +[_arangorestore_](../components/tools/arangorestore/_index.md). + +## Hot Backups + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +Hot backup and restore associated operations can be performed with the +[_arangobackup_](../components/tools/arangobackup/_index.md) client tool and the +[Hot Backup HTTP API](../develop/http-api/hot-backups.md). + +Many operations cannot afford downtimes and thus require administrators and +operators to create consistent freezes of the data during normal operation. +Such use cases imply that near instantaneous hot backups must be +obtained in sync across say a cluster's deployment. For this purpose the +hot backup mechanism was created. + +The process of creating hot backups is ideally an instantaneous event during +normal operations, that consists of a few subsequent steps behind the scenes: + +- Stop all write accesses to the entire installation using a write transaction lock. +- Create a new local directory under `<data-dir>/backups/<timestamp>_<backup-label>`. +- Create hard links to the active database files in `<data-dir>` in the newly + created backup directory. +- Release the write transaction lock to resume normal operation. +- Report success of the operation. + +The above quite precisely describes the tasks in a single instance installation +and could technically finish in under a millisecond. The unknown factor above is +of course, when the hot backup process is able to obtain the write transaction lock. + +When considering the ArangoDB cluster two more steps need to integrate while +others just become slightly more exciting. On the Coordinator tasked with the +hot backup the following is done: + +- Using the Agency, make sure that no two hot backups collide. +- Obtain a dump of the Agency's `Plan` key. +- Stop all write access to the **entire cluster** installation using a + global write transaction lock, this amounts to get each local write + transaction lock on each DB-Server, all at the same time. +- Getting all the locks on the DB-Servers is tried using subsequently growing + time periods, and if not all local locks can be acquired during a period, + all locks are released again to allow writes to continue. If it is not + possible to acquire all local locks in the same period, and this continues + for an extended, configurable amount of time, the Coordinator gives + up. With the `allowInconsistent` option set to `true`, it proceeds instead + to create a potentially non-consistent hot backup. +- **On each DB-Server** create a new local directory under + `<data-dir>/backups/<timestamp>_<backup-label>`. +- **On each DB-Server** create hard links to the active database files + in `<data-dir>` in the newly created backup directory. +- **On each DB-Server** store a redundant copy of the above Agency dump. +- Release the global write transaction lock to resume normal operation. +- Report success of the operation. + +Again under good conditions, a complete hot backup could be obtained from a +cluster with many DB-Servers within a very short time in the range +of that of the single server installation. + +### Technical Details + +- **The Global Write Transaction Lock** + + To create a consistent snapshot of an ArangoDB single server or + cluster deployment, all transactions need to be suspended in order for the + state of a deployment to be consistent. However, there is no way for ArangoDB + to know by its own when this time comes. This is why a hot backup needs to + acquire a global write transaction lock in order to create the backup in a + consistent state. + + On a single server instance, this lock is eventually obtained and the hot + backup is then created within a very short amount of time. + + However, in a cluster, this process is more complex. One Coordinator tries to + obtain the global write transaction lock on all _DB-Servers_ simultaneously. + Depending on the activity in the cluster, it can take some time for the + Coordinator to acquire all the locks the cluster needs. Grabbing all the + necessary locks at once might not always be successful, leading to times + when it seems like the cluster's write operations are suspended. + + This process can happen multiple times until all locks are obtained. + The system administrator has control over the length of the time during which + the lock is tried to be obtained each time, prolonging the last wait time by + 10% (which gives more time for the global write transaction lock to resolve). + +- **Agency Lock** + + Less of a variable, however equally important is to obtain a freeze on the + cluster's structure itself. This is done through the creation of a simple key + lock in the cluster's configuration to stop all ongoing background tasks, + which are there to handle fail overs, shard movings, server removals etc. + Its role is also to prevent multiple simultaneous hot backup operations. + The acquisition of this key is predictably done within a matter of a few seconds. + +- **Operation's Time Scope** + + Once the global write transaction lock is obtained, everything goes very quickly. + A new backup directory is created, the write ahead lock is flushed and + hard links are made on file system level to all persistent files. + The duration is not affected by the amount of data in ArangoDB and is near + instantaneous. + +- **Point in Time Recovery** + + One of the great advantages of the method is the consistent snapshot nature. + It gives the operator of the database the ability to persist a true and + complete time freeze at near zero impact on the ongoing operation. + The recovery is easy and restores the entire ArangoDB installation to a + desired snapshot. + + Apart from the ability of creating such snapshots it offers a great and easy + to use opportunity to experiment with ArangoDB with a means to protect + against data loss or corruption. + +- **Remote Upload and Download** + + We have fully integrated the + [rclone](https://rclone.org/) sync for cloud storage. Rclone is a very + versatile inter site sync facility, which opens up a vast field of transport + protocols and remote syncing APIs from Amazon's S3 over Dropbox, WebDAV, + all the way to the local file system and network storage. + + One can use the upload and download functionalities to migrate entire cluster + installations in this way, copy cluster and single server snapshots all + over the world, create an intuitive and easy to use quick access safety + backbone of the data operation. + + Rclone is open source and available under the MIT license, is battle tested + and has garnered close to 15k stars on GitHub professing to the confidence + of lots of users. + +### Hot Backup Limitations + +ArangoDB hot backups impose limitations with respect to storage engine, +storage usage, upgrades, deployment scheme, etc. Please review the below +list of limitations closely to conclude which operations it might or might +not be suited for. + +- **Global Scope** + + In order to be able to create hot backups instantaneously, they are created + on the file system level and thus well below any structural entity related to + databases, collections, indexes, users, etc. + + As a consequence, a hot backup is a backup of the entire ArangoDB single server + or cluster. In other words, one cannot restore to an older hot backup of a + single collection or database. With every restore, one restores the entire + deployment including of course the `_system` database. + + Note that this applies in particular in the case that a certain user + might have admin access for the `_system` database, but explicitly has + no access to certain collections. The backup still extends across + **all** collections! + + {{< danger >}} + A restore to an earlier hot backup snapshot also reverts users, graphs, + Foxx apps - everything - back to that at the time of the hot backup! + {{< /danger >}} + +- **Cluster's Special Limitations** + + Creating hot backups can only be done while the internal structure of the + cluster remains unaltered. The background of this limitation lies in the + distributed nature and the asynchronicity of creation, alteration and + dropping of cluster databases, collections and indexes. + + It must be ensured that for the hot backup no such changes are made to the + cluster's inventory, as this could lead to inconsistent hot backups. + +- **Active Failover Special Limitations** + + When restoring hot backups in Active Failover setups, it is necessary to + prevent that a non-restored follower becomes leader by temporarily setting + the maintenance mode: + + 1. `curl -X PUT <endpoint>/_admin/cluster/maintenance -d'"on"'` + 2. Restore the Hot Backup + 3. `curl -X PUT <endpoint>/_admin/cluster/maintenance -d'"off"'` + + Substitute `<endpoint>` with the actual endpoint of the **leader** + single server instance. + +- **Restoring from a different version** + + Hot backups share the same limitations with respect to different versions + as ArangoDB itself. This means that a hot backup created with some version + `a.b.c` can without any limitations be restored on any version `a.b.d` with + `d` not equal to `c`, that is, the patch level can be changed arbitrarily. + With respect to minor versions (second number, `b`), one can only upgrade + and **not downgrade**. That is, a hot backup created with a version `a.b.c` + can be restored on a version `a.d.e` for `d` greater than `b` but not for `d` + less than `b`. At this stage, we do not guarantee any compatibility between + versions with a different major version number (first number). + +- **Identical Topology** + + Unlike dumps created with [_arangodump_](../components/tools/arangodump/_index.md) and restored + with [_arangorestore_](../components/tools/arangorestore/_index.md), + hot backups can only be restored to the same type and structure of deployment. + This means that one cannot restore a 3-node ArangoDB cluster's hot backup to + any other deployment than another 3-node ArangoDB cluster of the same version. + +- **Storage Space** + + Without the creation of hot backups, RocksDB keeps compacting the file system + level files as the operation continues. Compacted files are subsequently + deleted automatically. Every hot backup needs to hold on to the + files as they were at the moment of the hot backup creation, thus preventing + the deletions and consequently growing the storage space of the ArangoDB + data directory. That growth of course depends on the amount of write operations + per time. + + This is a crucial factor for sustained operation and might require + significantly higher storage reservation for ArangoDB instances involved and + a much more fine grained monitoring of storage usage than before. + + Also note that in a cluster, each RocksDB instance is backed up + individually and hence the overall storage space is the sum of all + RocksDB instances (i.e., data which is replicated between instances is + not de-duplicated for performance reasons). + +- **Global Transaction Lock** + + In order to be able to create consistent hot backups, it is mandatory to get + a very brief global transaction lock across the entire installation. + In single server deployments, constant invocation of very long running + transactions could prevent that from ever happening during a timeout period. + The same holds true for clusters, where this lock must now be obtained on all + DB-Servers at the same time. + + Especially in the cluster, the result of these successively longer tries to + obtain the global transaction lock might become visible in periods of apparent + dead time. Locks might be obtained on some machines and and not on others, so + that the process has to be retried over and over. Every unsuccessful try would + then lead to the release of all partial locks. + + {{< info >}} + The _arangobackup_ tool provides a `--force` option + that can be used to abort ongoing write transactions and thus to more quickly + obtain the global transaction lock. + {{< /info >}} + + At this stage, index creation constitutes a write transactions, which means + that during index creation one cannot create a hot backup. We intend to lift + this limitation in a future version. + +- **Services on Single Server** + + On a single server, the installed Foxx microservices are not backed up and are + therefore also not restored. This is because in single server mode + the service installation is done locally in the file system and does not + track the information in the `_apps` collection. + + In a cluster, the Coordinators eventually restore the state of the + services from the `_apps` and `_appbundles` collections after a backup is + restored. + +- **Encryption at Rest** + + The hot backup simply takes a snapshot of the database files. + If you use encryption at rest, then the backed up files are + encrypted, with the encryption key that has been used in the + instance which created the backup. + + Such an encrypted backup can only be restored to an instance using the + same encryption key. + +- **Replication and Hot Backup** + + Hot backups are not automatically replicated between instances. This is + true for both the Active Failover setup with 2 (or more) single servers + and for the Datacenter-to-Datacenter Replication between clusters. + Simply take hot backups on all instances. + + {{< info >}} + The DC2DC replication needs to be stopped before restoring a Hot Backup. + + 1. Stop the DC2DC synchronization with `arangosync stop sync ...`. + 2. Restore the Hot Backup. + 3. Restart the DC2DC synchronization with `arangosync configure sync ...`. + {{< /info >}} + +- **Known Issues** + + See the list of [Known Issues](../release-notes/version-3.11/known-issues-in-3-11.md#hot-backup). diff --git a/site/content/arangodb/oem/operations/installation/_index.md b/site/content/arangodb/oem/operations/installation/_index.md new file mode 100644 index 0000000000..9f247d359a --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/_index.md @@ -0,0 +1,82 @@ +--- +title: Installation +menuTitle: Installation +weight: 210 +description: >- + You can install ArangoDB by downloading and running the official packages, + as well as run ArangoDB using Docker images +--- +To install ArangoDB, as first step, please download a package for your operating +system from the official [Download](https://www.arangodb.com/download) +page of the ArangoDB web site. + +You can find packages for various operating systems, including _RPM_ and _Debian_ +packages for Linux, including `tar.gz` archives. For macOS, only client tools `tar.gz` +packages are available. For Windows, _Installers_ and `zip` archives are available. + +- [Linux](linux/_index.md) +- [macOS](macos.md) +- [Windows](windows.md) + +{{< tip >}} +You can also use the official [Docker images](https://hub.docker.com/_/arangodb/) +to run ArangoDB in containers on Linux, macOS, and Windows. For more information, +see the [Docker](docker.md) section. +{{< /tip >}} + +If you prefer to compile ArangoDB from source, please refer to the [Compiling](compiling/_index.md) +section. + +For detailed information on how to deploy ArangoDB, once it has been installed, +please refer to the [Deploy](../../deploy/_index.md) chapter. + +## Supported platforms and architectures + +Work with ArangoDB on Linux, macOS, and Windows, and run it in production on Linux. + +{{< info >}} +ArangoDB requires systems with Little Endian byte order. +{{< /info >}} + +{{< tip >}} +[Arango Managed Platform (AMP)](https://dashboard.arangodb.cloud/home?utm_source=docs&utm_medium=cluster_pages&utm_campaign=docs_traffic) +is a fully-managed service and requires no installation. It's the easiest way +to run ArangoDB in the cloud. +{{< /tip >}} + +### Linux + +ArangoDB is available for the following architectures: + +- **x86-64**: The processor(s) must support the **x86-64** architecture with the + **SSE 4.2** and **AVX** instruction set extensions (Intel Sandy Bridge or better, + AMD Bulldozer or better, etc.). +- **ARM**: The processor(s) must be 64-bit ARM chips (**AArch64**). The minimum + requirement is **ARMv8** with **Neon** (SIMD extension). + +The official Linux release executables of ArangoDB require the operating system +to use a page size of **4096 bytes** or less. + +## macOS + +{{< info >}} +Starting with version 3.11.0, ArangoDB Server binaries for macOS are not +provided anymore. +{{< /info >}} + +Client tools are available for the following architectures: + +- **x86-64**: The processor(s) must support the **x86-64** architecture with the + **SSE 4.2** and **AVX** instruction set extensions (Intel Sandy Bridge or better, + AMD Bulldozer or better, etc.). +- **ARM**: The processor(s) must be 64-bit Apple silicon (**M1** or later) based on + ARM (**AArch64**). + +## Windows + +ArangoDB is available for the following architectures: + +- **x86-64**: The processor(s) must support the **x86-64** architecture with the + **SSE 4.2** and **AVX** instruction set extensions (Intel Sandy Bridge or better, + AMD Bulldozer or better, etc.). + \ No newline at end of file diff --git a/site/content/arangodb/oem/operations/installation/compiling/_index.md b/site/content/arangodb/oem/operations/installation/compiling/_index.md new file mode 100644 index 0000000000..151e559cf3 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/compiling/_index.md @@ -0,0 +1,26 @@ +--- +title: Compiling ArangoDB from Source +menuTitle: Compiling +weight: 25 +description: >- + ArangoDB can be compiled directly from source code +--- +ArangoDB can be compiled directly from source. It will compile on most Linux +and macOS systems, as well as on Windows. + +We assume that you use the GNU C/C++ compiler or clang/clang++ to compile the +source. ArangoDB has been tested with these compilers, but should be able to +compile with any Posix-compliant, C++14-enabled compiler. For our Windows +builds we use Microsoft's Visual C++ 2017 compiler. + +By default, cloning the GitHub repository will checkout the _devel_ branch. +This branch contains the development version of the ArangoDB. Use this branch +if you want to make changes to the ArangoDB source. + +- [Compile on Debian](compile-on-debian.md) + +- [Compile on Windows](compile-on-windows.md) + +- [Running Custom Build](running-custom-build.md) + +- [Recompiling jemalloc](recompiling-jemalloc.md) diff --git a/site/content/arangodb/oem/operations/installation/compiling/compile-on-debian.md b/site/content/arangodb/oem/operations/installation/compiling/compile-on-debian.md new file mode 100644 index 0000000000..26b91a0128 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/compiling/compile-on-debian.md @@ -0,0 +1,273 @@ +--- +title: Compiling on Debian +menuTitle: Compile on Debian +weight: 5 +description: >- + You want to compile and run the devel branch, for example to test a bug fix +--- +This guide describes how to compile and run the devel branch under a Debian +based system. It was tested using a fresh Debian Testing machine on Amazon EC2. +For completeness, the steps pertaining to AWS are also included here. + +{{< info >}} +ArangoDB v3.7 requires at least g++ 9.2 as compiler. Older versions, especially +g++ 7, do not work anymore. +{{< /info >}} + +## Launch the VM + +*Optional* + +Login to your AWS account and launch an instance of Debian Testing. I used an +'m3.xlarge' since that has a bunch of cores, more than enough memory, optimized +network and the instance store is on SSDs which can be switched to provisioned +IOPs. + +The Current AMI ID's can be found in the Debian Wiki: +[wiki.debian.org/Cloud/AmazonEC2Image/](https://wiki.debian.org/Cloud/AmazonEC2Image/) + +## Upgrade to the very latest version + +*Optional* + +Once your EC2 instance is up, login ad `admin` and `sudo su` to become `root`. + +First, we remove the backports and change the primary sources.list + +```bash +rm -rf /etc/apt/sources.list.d +echo "deb http://http.debian.net/debian testing main contrib" > /etc/apt/sources.list +echo "deb-src http://http.debian.net/debian testing main contrib" >> /etc/apt/sources.list +``` + +Update and upgrade the system. Make sure you don't have any broken/unconfigured +packages. Sometimes you need to run safe/full upgrade more than once. When you +are done, reboot. + +```bash +apt-get update +apt-get install aptitude +aptitude -y update +aptitude -y safe-upgrade +aptitude -y full-upgrade +reboot +``` + +## Install build dependencies + +*Mandatory* + +Before you can build ArangoDB, you need a few packages pre-installed on your system. + +Login again and install them. + +```bash +sudo aptitude -y install git-core \ + build-essential \ + libssl-dev \ + libjemalloc-dev \ + cmake \ + python2.7 \ +sudo aptitude -y install libldap2-dev # Enterprise Edition only +``` + +## Download the Source + +Download the latest source using ***git***: + + unix> git clone git://github.com/arangodb/arangodb.git + +This will automatically clone the **devel** branch. + +Note: if you only plan to compile ArangoDB locally and do not want to modify or +push any changes, you can speed up cloning substantially by using the +*--single-branch* and *--depth* parameters for the clone command as follows: + + unix> git clone --single-branch --depth 1 git://github.com/arangodb/arangodb.git + +## Setup + +Switch into the ArangoDB directory + + unix> cd arangodb + unix> mkdir build + unix> cd build + +In order to generate the build environment please execute + + unix> cmake .. + +to setup the Makefiles. This will check the various system characteristics and +installed libraries. If you installed the compiler in a non standard location, +you may need to specify it: + + cmake -DCMAKE_C_COMPILER=/opt/bin/gcc -DCMAKE_CXX_COMPILER=/opt/bin/g++ .. + +If you compile on macOS, you should add the following options to the cmake +command: + + cmake .. -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 + +If you also plan to make changes to the source code of ArangoDB, you may want +to compile with the `Debug` build type: + + cmake .. -DCMAKE_BUILD_TYPE=Debug + +The `Debug` target enables additional checks etc. which would slow down +production binaries. If no build type is specified, ArangoDB will be compiled +with build type `RelWithDebInfo`, which is a compromise between good +performance and medium debugging experience. + +Other options valuable for development: + + -DUSE_MAINTAINER_MODE=On + +Needed if you plan to make changes to AQL language (which is implemented using +a lexer and parser files in `arangod/Aql/grammar.y` and `arangod/Aql/tokens.ll`) +or if you want to enable runtime assertions. To use the maintainer mode, your +system has to contain the tools FLEX and BISON. + + -DUSE_BACKTRACE=On + +Use this option if you want to have C++ stacktraces attached to your exceptions. +This can be useful to more quickly locate the place where an exception or an +assertion was thrown. Note that this option will slow down the produces binaries +a bit and requires building with maintainer mode. + + -DUSE_OPTIMIZE_FOR_ARCHITECTURE=On + +This will optimize the binary for the target architecture, potentially enabling +more compiler optimizations, but making the resulting binary less portable. + +ArangoDB will then automatically use the configuration from file +*etc/relative/arangod.conf*. + + -DUSE_FAILURE_TESTS=On + +This option activates additional code in the server that intentionally makes +the server crash or misbehave (e.g. by pretending the system ran out of memory) +when certain tests are run. This option is useful for writing tests. + + -DUSE_GOOGLE_TESTS=off + +This option disables all unit tests based on +[Googletest](https://github.com/google/googletest). + + -DUSE_JEMALLOC=Off + +By default ArangoDB will be built with a bundled version of the JEMalloc +allocator. This however will not work when using runtime analyzers such as ASAN +or Valgrind. In order to use these tools for instrumenting an ArangoDB binary, +JEMalloc must be turned off during compilation. + +For **release builds** configure CMake with the following options: + + cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_MAINTAINER_MODE=off -DUSE_OPTIMIZE_FOR_ARCHITECTURE=On -DUSE_GOOGLE_TESTS=off + +## Shared memory + +Gyp is used as makefile generator by V8. Gyp requires shared memory to be +available, which may not if you i.e. compile in a chroot. You can make it +available like this: + + none /opt/chroots/ubuntu_precise_x64/dev/shm tmpfs rw,nosuid,nodev,noexec 0 2 + devpts /opt/chroots/ubuntu_precise_x64/dev/pts devpts gid=5,mode=620 0 0 + +## Compilation + +Compile the programs (server, client, utilities) by executing + + make + +in the build subdirectory. This will compile ArangoDB and create the binary executable +in file `build/bin/arangod`. + +To run multiple jobs in parallel pass `-j<numJobs>`, e.g. `make -j8`. + +## Starting and testing + +Check the binary by starting it using the command line. + + unix> build/bin/arangod -c etc/relative/arangod.conf --server.endpoint tcp://127.0.0.1:8529 /tmp/database-dir + +This will start up the ArangoDB and listen for HTTP requests on port 8529 bound +to IP address 127.0.0.1. You should see the startup messages similar to the +following: + +``` +2016-06-01T12:47:29Z [29266] INFO ArangoDB xxx ... +2016-06-10T12:47:29Z [29266] INFO using endpoint 'tcp://127.0.0.1.8529' for non-encrypted requests +2016-06-01T12:47:30Z [29266] INFO Authentication is turned on +2016-60-01T12:47:30Z [29266] INFO ArangoDB (version xxx) is ready for business. Have fun! +``` + +If it fails with a message about the database directory, please make sure the +database directory you specified exists and can be written into. + +Use your favorite browser to access the URL + + http://127.0.0.1:8529/ + +This should bring up ArangoDB's web interface. + +## Re-building ArangoDB after an update + +To stay up-to-date with changes made in the main ArangoDB repository, you will +need to pull the changes from it and re-run `make`. + +Normally, this will be as simple as follows: + + unix> git pull + unix> (cd build && make) + +From time to time there will be bigger structural changes in ArangoDB, which may +render the old Makefiles invalid. Should this be the case and `make` complains +about missing files etc., the following commands should fix it: + + unix> rm -rf build/* + unix> cd build && cmake .. <cmake options go here> + unix> (cd build && make) + +Note that the above commands will run a full rebuild of ArangoDB and all +of its third-party components. That will take a while to complete. + +## Installation + +In a local development environment it is not necessary to install ArangoDB +somewhere, because it can be started from within the source directory as +shown above. + +If there should be the need to install ArangoDB, execute the following command: + + (cd build && sudo make install) + +The server will by default be installed in + + /usr/local/sbin/arangod + +The configuration file will be installed in + + /usr/local/etc/arangodb3/arangod.conf + +The database will be installed in + + /usr/local/var/lib/arangodb3 + +The ArangoShell will be installed in + + /usr/local/bin/arangosh + +You should add an arangodb user and group (as root), plus make sure it owns these directories: + + useradd -g arangodb arangodb + chown -R arangodb:arangodb /usr/local/var/lib/arangodb3-apps/ + chown -R arangodb:arangodb /tmp/database-dir/ + +**Note:** The installation directory will be different if you use one of the +`precompiled` packages. Please check the default locations of your operating +system, e. g. `/etc` and `/var/lib`. + +When upgrading from a previous version of ArangoDB, please make sure you inspect +ArangoDB's log file after an upgrade. It may also be necessary to start ArangoDB +with the *--database.auto-upgrade* parameter once to perform required upgrade or +initialization tasks. diff --git a/site/content/arangodb/oem/operations/installation/compiling/compile-on-windows.md b/site/content/arangodb/oem/operations/installation/compiling/compile-on-windows.md new file mode 100644 index 0000000000..dcdac2e1a1 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/compiling/compile-on-windows.md @@ -0,0 +1,190 @@ +--- +title: Compiling ArangoDB under Windows +menuTitle: Compile on Windows +weight: 10 +description: >- + This guide describes how to compile ArangoDB 3.4 and onwards under Windows +--- +## Install chocolatey + +With ArangoDB 3.0 a complete cmake environment was introduced. This also +streamlines the dependencies on Windows. We suggest to use +[chocolatey.org](https://chocolatey.org/) to install most of +the dependencies. For sure most projects offer their own setup & install +packages, chocolatey offers a simplified way to install them with less user +interactions. You can even use chocolatey via +[ansibles 2.7 winrm facility](https://docs.ansible.com/ansible/latest/user_guide/windows.html) +to do unattended installations of some software on Windows. + +First install the choco package manager by pasting this tiny cmdlet into a +command window with Administrator privileges (press Windows key, type `cmd` +and hit Ctrl+Shift+Enter): + + @powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin + +### Visual Studio and its Compiler + +Since choco currently fails to alter the environment for +[Microsoft Visual Studio](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx), +we suggest to download and install Visual Studio by hand. + +ArangoDB v3.7 requires Visual Studio 2019 v16.5.0 or later. + +{{< warning >}} +You need to make sure that it installs the **Desktop development with C++** preset, +else cmake will fail to detect it later on. Furthermore, the **Windows 8.1 SDK and UCRT SDK** +optional component is required to be selected during Visual Studio installation, else V8 +will fail to compile later on. +{{< /warning >}} + +After it successfully installed, start it once, so it can finish its setup. + +### More Dependencies + +Now you can invoke the choco package manager for an unattended install of the dependencies +*(needs to be run with Administrator privileges again)*: + + choco install -y cmake.portable nsis python2 procdump windbg wget + +Then we need to install the [OpenSSL](https://openssl.org) library from its sources or using precompiled +[Third Party OpenSSL Related Binary Distributions](https://wiki.openssl.org/index.php/Binaries). + +### Optional Dependencies + +_Remember that you need to run below commands with Administrator privileges!_ + +If you want to checkout the code with git, install it like this: + + choco install -y git + +You need to allow and +[enable symlinks for your user](https://github.com/git-for-windows/git/wiki/Symbolic-Links#allowing-non-administrators-to-create-symbolic-links). + +If you intend to run the unit tests, you also need the following: + + choco install -y winflexbison ruby + +Close and reopen the Administrator command window in order to continue with the ruby devkit: + + choco install -y ruby2.devkit + +And manually install the requirements via the `Gemfile` fetched from the ArangoDB Git repository +*(needs to be run with Administrator privileges)*: + + wget https://raw.githubusercontent.com/arangodb/arangodb/devel/tests/rb/HttpInterface/Gemfile + setx PATH %PATH%;C:\tools\DevKit2\bin;C:\tools\DevKit2\mingw\bin + gem install bundler + bundler + +Note that the V8 build scripts and gyp aren't compatible with Python 3.x hence you need python2! + +## Building ArangoDB + +Download and extract the release tarball from +[www.arangodb.com/download/](https://www.arangodb.com/download/) + +Or clone the GitHub repository and checkout the branch or tag you need (e.g. `devel`) + + git clone https://github.com/arangodb/arangodb.git -b devel + cd arangodb + +Generate the Visual studio project files, and check back that cmake discovered all components on your system: + + mkdir Build64 + cd Build64 + cmake -G "Visual Studio 15 2017 Win64" .. + +Note that in some cases cmake struggles to find the proper python interpreter +(i.e. the cygwin one won't work). You can force overrule it by appending: + + -DPYTHON_EXECUTABLE:FILEPATH=C:/Python27/python.exe + +You can now load these in the Visual Studio IDE or use cmake to start the build: + + cmake --build . --config RelWithDebInfo + +The binaries need the ICU datafile `icudt54l.dat`, which is automatically copied into the directory containing the +executable. + +If you intend to use the machine for development purposes, it may be more practical to copy it to a common place: + + cd 3rdParty/V8/v*/third_party/icu/source/data/in && cp icudt*.dat /cygdrive/c/Windows/ + +And configure your environment (yes this instruction remembers to the hitchhikers guide to the galaxy...) so that +`ICU_DATA` points to `c:\\Windows`. You do that by opening the explorer, +right click on `This PC` in the tree on the left, choose `Properties` in the opening window `Advanced system settings`, +in the Popup `Environment Variables`, another popup opens, in the `System Variables` part you click `New`, +And variable name: `ICU_DATA` to the value: `c:\\Windows` + +![HowtoSetEnv](../../../../../images/SetEnvironmentVar.png) + +## Unit tests (Optional) + +The unit tests require a [cygwin](https://www.cygwin.com/) environment. + +You need at least `make` from cygwin. Cygwin also offers a `cmake`. Do **not** install the cygwin cmake. + +You should also issue these commands to generate user information for the cygwin commands: + + mkpasswd > /etc/passwd + mkgroup > /etc/group + +Turning ACL off (noacl) for all mounts in cygwin fixes permissions troubles that may appear in the build: + + # /etc/fstab + # + # This file is read once by the first process in a Cygwin process tree. + # To pick up changes, restart all Cygwin processes. For a description + # see https://cygwin.com/cygwin-ug-net/using.html#mount-table + + # noacl = Ignore Access Control List and let Windows handle permissions + C:/cygwin64/bin /usr/bin ntfs binary,auto,noacl 0 0 + C:/cygwin64/lib /usr/lib ntfs binary,auto,noacl 0 0 + C:/cygwin64 / ntfs override,binary,auto,noacl 0 0 + none /cygdrive cygdrive binary,posix=0,user,noacl 0 0 + +### Enable native symlinks for Cygwin and git + +Cygwin will create proprietary files as placeholders by default instead of +actually symlinking files. The placeholders later tell Cygwin where to resolve +paths to. It does not intercept every access to the placeholders however, so +that 3rd party scripts break. Windows Vista and above support real symlinks, +and Cygwin can be configured to make use of it: + + # use actual symlinks to prevent documentation build errors + # (requires elevated rights!) + export CYGWIN="winsymlinks:native" + +Note that you must run Cygwin as administrator or change the Windows group +policies to allow user accounts to create symlinks (`gpedit.msc` if available). + +BTW: You can create symlinks manually on Windows like: + + mklink /H target/file.ext source/file.ext + mklink /D target/path source/path + mklink /J target/path source/path/for/junction + +And in Cygwin: + + ln -s source target + +### Running Unit tests + +You can then run the integration tests in the cygwin shell like that: + + Build64/bin/RelWithDebInfo/arangosh.exe \ + -c etc/relative/arangosh.conf \ + --log.level warning \ + --server.endpoint tcp://127.0.0.1:1024 \ + --javascript.execute UnitTests/unittest.js \ + -- \ + all \ + --build Build64 \ + --buildType RelWithDebInfo \ + --skipNondeterministic true \ + --skipTimeCritical true \ + --skipBoost true \ + --skipGeo true + +Additional options `--ruby c:/tools/ruby25/bin/ruby` and `--rspec c:/tools/ruby25/bin/rspec` +should be used only if Ruby is not in the *PATH*. diff --git a/site/content/arangodb/oem/operations/installation/compiling/recompiling-jemalloc.md b/site/content/arangodb/oem/operations/installation/compiling/recompiling-jemalloc.md new file mode 100644 index 0000000000..b9e38587bd --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/compiling/recompiling-jemalloc.md @@ -0,0 +1,54 @@ +--- +title: Jemalloc +menuTitle: Recompiling jemalloc +weight: 20 +description: >- + Resolving +--- +{{< info >}} +This article is only relevant if you intend to compile ArangoDB on Ubuntu 16.10 +or Debian testing +{{< /info >}} + +On more modern linux systems (development/floating at the time of this writing) +you may get compile / link errors with ArangoDB regarding jemalloc. +This is due to compilers switching their default behavior regarding the +`PIC` - Position Independent Code. It seems common that jemalloc remains in a +stage where this change isn't followed and causes ArangoDB to error out during +the linking phase. + +From now on cmake will detect this and give you this hint: + + the static system jemalloc isn't suitable! Recompile with the current compiler or disable using `-DCMAKE_CXX_FLAGS=-no-pie -DCMAKE_C_FLAGS=-no-pie` + +Now you've got three choices. + +- **Doing without jemalloc** + + Fixes the compilation issue, but you will get problems with the glibcs heap + fragmentation behavior which in the longer run will lead to an ever + increasing memory consumption of ArangoDB. + + While this may be suitable for development / testing systems, its definitely + not for production. + +- **Disabling PIC altogether** + + This will build an arangod which doesn't use this compiler feature. It may + be not so nice for development builds. It can be achieved by specifying + these options on cmake: + + -DCMAKE_CXX_FLAGS=-no-pie -DCMAKE_C_FLAGS=-no-pie + +- **Recompile jemalloc** + + The smartest way is to fix the jemalloc libraries packages on your system so + its reflecting that new behavior. On Debian / Ubuntu systems it can be + achieved like this: + + apt-get install automake debhelper docbook-xsl xsltproc dpkg-dev + apt source jemalloc + cd jemalloc* + dpkg-buildpackage + cd .. + dpkg -i *jemalloc*deb diff --git a/site/content/arangodb/oem/operations/installation/compiling/running-custom-build.md b/site/content/arangodb/oem/operations/installation/compiling/running-custom-build.md new file mode 100644 index 0000000000..2fe985d026 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/compiling/running-custom-build.md @@ -0,0 +1,54 @@ +--- +title: create data directory +menuTitle: Running Custom Build +weight: 15 +description: >- + You've already built a custom version of ArangoDB and want to run it +--- +Once you built a custom version of ArangoDB (see +[Compiling](_index.md)), you may want to run it using +existing data or possibly in isolation from an existing installation. + +We assumes that you are in the root directory of the ArangoDB distribution +and compiling has successfully finished. + +Note that this guide is for Linux only. + +## Running in isolation + +This part shows how to run your custom build with an empty database directory + +```bash +mkdir /tmp/arangodb + +# run +bin/arangod \ + --configuration etc/relative/arangod.conf\ + --database.directory /tmp/arangodb +``` + +## Running with data + +This part shows how to run your custom build with the config and data from a pre-existing stable installation. + +{{< danger >}} +ArangoDB's developers may change the db file format and after running with a +changed file format, there may be no way back. Alternatively you can run your +build in isolation and [dump](../../../components/tools/arangodump/_index.md) and +[restore](../../../components/tools/arangorestore/_index.md) the data from the +stable to your custom build. +{{< /danger >}} + +When running like this, you must run the db as the arangod user (the default +installed by the package) in order to have write access to the log, database +directory etc. Running as root will likely mess up the file permissions - good +luck fixing that! + +```bash +# become root first +su + +# now switch to arangod and run +su - arangod +bin/arangod --configuration /etc/arangodb/arangod.conf +``` diff --git a/site/content/arangodb/oem/operations/installation/docker.md b/site/content/arangodb/oem/operations/installation/docker.md new file mode 100644 index 0000000000..39601fa5ca --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/docker.md @@ -0,0 +1,263 @@ +--- +title: Install with Docker +menuTitle: Docker +weight: 5 +description: >- + You can use Docker images to run ArangoDB in containers on Linux, macOS, and Windows +--- +The recommended way of using ArangoDB is via ArangoDB Docker images with, +for instance, [Docker Desktop](https://www.docker.com/products/docker-desktop/). + +You can choose one of the following: +- [`arangodb` official Docker images](https://hub.docker.com/_/arangodb), + verified and published by Docker. +- [`arangodb/arangodb` Docker images](https://hub.docker.com/r/arangodb/arangodb), + maintained and directly published by ArangoDB on a regular basis. + +Check also the following resources: +- [Manually starting a stand-alone instance via Docker](../../deploy/single-instance/manual-start.md#manual-start-in-docker) +- [Manually starting an Active Failover deployment via Docker](../../deploy/active-failover/manual-start.md#manual-start-in-docker) +- [Manually starting a Cluster via Docker](../../deploy/cluster/deployment/manual-start.md#manual-start-in-docker) + +## Start an ArangoDB instance + +In order to start an ArangoDB instance, run: + +``` +docker run -e ARANGO_RANDOM_ROOT_PASSWORD=1 -d --name arangodb-instance arangodb +``` + +{{< tip >}} +Docker chooses the processor architecture for the image that matches your host +CPU by default. If this is not the case, for example, because you have the +`DOCKER_DEFAULT_PLATFORM` environment variable set to a different architecture, +you can pass the `--platform` flag to the `docker run` command to specify the +appropriate operating system and architecture for the container. For x86-64, +use `linux/amd64`. On ARM, especially Apple silicon with no emulation for the +required AVX instruction set extension, use `linux/arm64/v8`: + +``` +docker run --platform linux/arm64/v8 -p 8529:8529 -e ARANGO_RANDOM_ROOT_PASSWORD=1 arangodb-instance arangodb +``` +{{< /tip >}} + +This creates and launches the ArangoDB Docker instance as a background process. +The identifier of the process is printed. By default, ArangoDB listens on port +`8529` for requests and the image includes `EXPOSE 8529`. If you link an +application container, it is automatically available in the linked container. + +In order to get the IP ArangoDB listens on, run: + +``` +docker inspect --format '{{ .NetworkSettings.IPAddress }}' arangodb-instance +``` + +## Initialize the server language + +When using Docker, you need to specify the language you want to initialize the +server to on the first run in one of the following ways: + +- Set the environment variable `LANG` to a locale in the `docker run` command, + e.g. `-e LANG=sv` for a Swedish locale. + +- Use an `arangod.conf` configuration file that sets a language and mount it + into the container. For example, create a configuration file on your + host system in which you set `icu-language = sv` at the top (before any + `[section]`) and then mount the file over the default configuration file like + `docker run -v /your-host-path/arangod.conf:/etc/arangodb3/arangod.conf ...`. + +Note that you cannot set the language using only a startup option on the +command-line, like `docker run ... arangodb --icu-language sv`. + +If you don't specify a language explicitly, the default is `en_US` up to +ArangoDB v3.11. + +## Using the instance + +To use the running instance from an application, link the container: + +``` +docker run -e ARANGO_RANDOM_ROOT_PASSWORD=1 --name my-app --link arangodb-instance:db-link arangodb +``` + +This uses the instance named `arangodb-instance` and links it into the +application container. The application container contains the following +environment variables, which can be used to access the database. + +``` +DB_LINK_PORT_8529_TCP=tcp://172.17.0.17:8529 +DB_LINK_PORT_8529_TCP_ADDR=172.17.0.17 +DB_LINK_PORT_8529_TCP_PORT=8529 +DB_LINK_PORT_8529_TCP_PROTO=tcp +DB_LINK_NAME=/naughty_ardinghelli/db-link +``` + +## Exposing the port to the outside world + +If you want to expose the port to the outside world, run: + +``` +docker run -e ARANGO_RANDOM_ROOT_PASSWORD=1 -p 8529:8529 -d arangodb +``` + +ArangoDB listens on port `8529` for requests and the image includes `EXPOSE 8529`. +The `-p 8529:8529` exposes this port on the host. + +## Choosing an authentication method + +The ArangoDB image provides several authentication methods which can be +specified via environment variables (-e) when using `docker run`. + +1. `ARANGO_RANDOM_ROOT_PASSWORD=1` + + Generates a random root password when starting. The password is printed to + `stdout` (and may be inspected later using `docker logs`). + +2. `ARANGO_NO_AUTH=1` + + Disables authentication. Useful for testing. + + {{< warning >}} + Disabling authentication in production environments exposes all your data. + Make sure that ArangoDB is not directly accessible from the internet. + {{< /warning >}} + +3. `ARANGO_ROOT_PASSWORD=somepassword` + + Specify your own root password. + +{{< tip >}} +These authentication methods only apply to single server installations. For +clusters you have to provision the users via the root user with an empty +password once the system is up and running. +{{< /tip >}} + +## Command line options + +You can pass arguments to the ArangoDB server by appending them at the end of +the Docker command. + +``` +docker run -e ARANGO_RANDOM_ROOT_PASSWORD=1 arangodb --help +``` + +The entry point script starts the `arangod` binary by default and forwards +your arguments. + +You may also start other binaries, such as the ArangoDB Shell (`arangosh`): + +``` +docker run -it arangodb arangosh --server.database myDB ... +``` + +Note that you need to set up networking for containers if `arangod` runs in one +container and you want to access it with `arangosh` running in another container. +It is easier to execute it in the same container instead. +Use `docker ps` to find out the container ID or the name of a running container: + +``` +docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +1234567890ab arangodb "/entrypoint.sh aran…" 2 hours ago Up 2 hours 0.0.0.0:8529->8529/tcp jolly_joker +``` + +Then, use `docker exec` and the ID or name to run something inside of the +existing container: + +``` +docker exec -it jolly_joker arangosh +``` + +For more information, see the [Configuration](../administration/configuration.md) section. + +## Limiting resource utilization + +`arangod` checks the following environment variables, which can be used to +restrict how much memory and how many CPU cores it should use. + +- `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` + + This variable can be used to override the automatic detection of the total + amount of RAM present in the system. You can specify a decimal number + (in bytes). Furthermore, if `G` or `g` is appended, the value is multiplied + by `2^30`. If `M` or `m` is appended, the value is multiplied by `2^20`. + If `K` or `k` is appended, the value is multiplied by `2^10`. That is, `64G` + meaning 64 gigabytes. + + The total amount of RAM detected is logged as an INFO message at server start. + If the variable is set, the overridden value is shown. Various default sizes + are calculated based on this value (i.e. RocksDB buffer cache size). + + Setting this option can be useful in two cases: + + - If `arangod` is running in a container and its cgroup has a RAM limitation, + then you should specify this limitation in this environment variable, since + it is currently not automatically detected. + + - If `arangod` is running alongside other services on the same machine and + thus sharing the RAM with them, you should limit the amount of memory using + this environment variable. + +- `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` + + This variable can be used to override the automatic detection of the number + of CPU cores present on the system. + + The number of CPU cores detected is logged as an INFO message at server start. + If the variable is set, the overridden value is shown. Various default values + for threading are calculated based on this value. + + Setting this option is useful if `arangod` is running in a container or alongside + other services on the same machine and shall not use all available CPUs. + +## Using host directories + +You can map the container's volumes to a directory on the host, so that the data +is kept between the runs of the container. + +``` +mkdir /tmp/arangodb +docker run -e ARANGO_RANDOM_ROOT_PASSWORD=1 -p 8529:8529 -d \ + -v /tmp/arangodb:/var/lib/arangodb3 \ + arangodb +``` + +This uses the `/tmp/arangodb directory` of the host as database directory for +ArangoDB inside the container. + +## Using a data container + +Alternatively, you can create a container holding the data and use this data +container in your ArangoDB container. + +``` +docker create --name arangodb-persist arangodb true +``` + +``` +docker run -e ARANGO_RANDOM_ROOT_PASSWORD=1 --volumes-from arangodb-persist -p 8529:8529 arangodb +``` + +If you want to save a few bytes, you can alternatively use [busybox](https://hub.docker.com/_/busybox) +or [alpine](https://hub.docker.com/_/alpine) for creating the volume containers. +Note that you need to provide the used volumes in this case. + +``` +docker run -d --name arangodb-persist -v /var/lib/arangodb3 busybox true +``` + +## Usage as a base image + +If you use the image as a base image, make sure to write any `CMD` instructions in the +[*exec* form](https://docs.docker.com/engine/reference/builder/#cmd). +Otherwise, the default entry point will not do its bootstrapping work. + +When deriving the image, you can control the instantiation via putting files +into `/docker-entrypoint-initdb.d/`. + +- `*.sh` - files having this extension are run as a bash shell script. +- `*.js` - files having this extension are executed with `arangosh`. You can + specify additional `arangosh` arguments via the `ARANGOSH_ARGS` environment variable. +- `dumps/` - in this directory you can place subdirectories containing database + dumps generated using [arangodump](../../components/tools/arangodump/_index.md). + They can be restored using [arangorestore](../../components/tools/arangorestore/_index.md). diff --git a/site/content/arangodb/oem/operations/installation/linux/_index.md b/site/content/arangodb/oem/operations/installation/linux/_index.md new file mode 100644 index 0000000000..9def90d4cb --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/linux/_index.md @@ -0,0 +1,90 @@ +--- +title: Installing ArangoDB on Linux +menuTitle: Linux +weight: 10 +description: >- + Download an installation or tar package, or use a package manager +--- +You can install ArangoDB on most common Linux distributions. The basic +installation steps are: + +1. Visit the official [Download](https://www.arangodb.com/download) + page of the ArangoDB web site and choose between Community and + Enterprise Edition. + +2. Click the logo of the distribution that matches your operating system. + If you use Linux Mint, click Ubuntu or Debian. + +3. You can choose between different installation methods and packages: + - distribution-dependent installation packages (`.rpm`, `.deb`) + - tar packages (`tar.gz` archives) + - installation via a package manager + +4. Installation and tar packages: You may verify the integrity of a download + by comparing the SHA256 hash listed on the website with the hash of the file. + For example, you can you run `openssl sha256 <filename>` or + `sha256sum <filename>` in a terminal. + + Package manager: package managers generally validate downloaded packages + automatically. For more information, see + [SecureApt](https://wiki.debian.org/SecureApt) (Debian packages) and + [Secure distribution of RPM packages](https://www.redhat.com/en/blog/secure-distribution-rpm-packages) + for instance. + +5. Installation packages: run `sudo rpm -i <filename>.rpm` or + `sudo apt install <filename>.deb` respectively in a terminal and follow the + on-screen instructions. + + Tar packages: unpack the archive, for example by running `tar -xzf <filename>`. + + Package manager: follow the installation instructions on the _Download_ page. + You may also use another package manager. After setting up the ArangoDB + repository, you can easily install ArangoDB using _yum_, _aptitude_, _urpmi_, + or _zypper_. + +6. You can start ArangoDB in several ways. The exact start-up command depends on + your Linux distribution, as well as on the type of ArangoDB deployment you + are interested in (_Single Server_, _Active Failover_, _Cluster_, _DC2DC_). + Please refer to the [Deploy](../../../deploy/_index.md) chapter for details. + +## Securing your Installation + +### Debian / Ubuntu + +Debian-based packages will ask you to set a password for the `root` user during +installation. + +#### Securing Unattended Installations on Debian + +For unattended installations, you can set the password using the +[debconf helpers](https://web.archive.org/web/20230521083047/http://www.microhowto.info/howto/perform_an_unattended_installation_of_a_debian_package.html): + +```bash +echo arangodb3 arangodb3/password password NEWPASSWORD | debconf-set-selections +echo arangodb3 arangodb3/password_again password NEWPASSWORD | debconf-set-selections +``` + +The commands above should be executed prior to the installation. + +### Red-Hat / CentOS + +Red-Hat-based packages will set a random password for the `root` user during +installation. The generated random password is printed during the installation. +Please write it down somewhere, or change it to a password of your choice by +executing: + +```bash +ARANGODB_DEFAULT_ROOT_PASSWORD=NEWPASSWORD arango-secure-installation +``` + +The command should be executed after the installation. + +### Other Distributions + +For other distributions run `arango-secure-installation` to set the password +for the `root` user. + +{{< danger >}} +Please be aware that running `arango-secure-installation` on your ArangoDB +server will remove all current database users but root. +{{< /danger >}} diff --git a/site/content/arangodb/oem/operations/installation/linux/linux-os-tuning-script-examples.md b/site/content/arangodb/oem/operations/installation/linux/linux-os-tuning-script-examples.md new file mode 100644 index 0000000000..86fbca25fe --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/linux/linux-os-tuning-script-examples.md @@ -0,0 +1,132 @@ +--- +title: Provides arangodb-memory-configuration +menuTitle: Linux OS Tuning Script Examples +weight: 10 +description: '' +--- +The most important suggestions listed in the section +[Linux Operating System Configuration](operating-system-configuration.md) +can be easily applied by making use of a script and _init.d_. + +This page includes script examples that can be used to tune the +operating system (OS) in case you are using _Debian_ or _CentOS_, +along with instructions on how to install the scripts. + +{{< warning >}} +It is important that the script is set up in a way that it gets +executed even after the machine reboots. Instructions on how to +configure your system so that the script executes during the +boot process can be found below. +{{< /warning >}} + +## Debian + +**Script:** + +```bash +#!/bin/bash + +### BEGIN INIT INFO +# Required-Start: +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Set arangodb kernel parameters +# Description: Set arangodb kernel parameters +### END INIT INFO + +# 1 - Raise the vm map count value +sudo sysctl -w "vm.max_map_count=2048000" + +# 2 - Disable Transparent Huge Pages +sudo bash -c "echo madvise > /sys/kernel/mm/transparent_hugepage/enabled" +sudo bash -c "echo madvise > /sys/kernel/mm/transparent_hugepage/defrag" + +# 3 - Set the virtual memory accounting mode +sudo bash -c "echo 0 > /proc/sys/vm/overcommit_memory" +``` + +**Installation Instructions:** + +1. Create the file inside the `/etc/init.d/` directory, e.g. + + `/etc/init.d/arangodb-os-optimization` + +2. Set correct permission, to mark the file executable: + + `sudo chmod 755 /etc/init.d/arangodb-os-optimization` + +3. On Ubuntu, use the following command to configure your system + to execute the script during the boot process: + + `sudo update-rc.d arangodb-os-optimization defaults` + +**Note:** + +You might need the package _sysfsutils_. If this is the case, +please install it via: + +`sudo apt install sysfsutils` + +**Important:** + +To optimize the OS "now", without having to restart the system, +the script **must** also be directly executed once. + +## RedHat / CentOS / SUSE + +**Script:** + +```bash +#!/bin/bash + +### BEGIN INIT INFO +# Provides: arangodb-memory-configuration +# Required-Start: +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Set arangodb kernel parameters +# Description: Set arangodb kernel parameters +### END INIT INFO + +# 1 - Raise the vm map count value +sysctl -w "vm.max_map_count=2048000" + +# 2 - Disable Transparent Huge Pages +bash -c "echo madvise > /sys/kernel/mm/transparent_hugepage/enabled" +bash -c "echo madvise > /sys/kernel/mm/transparent_hugepage/defrag" + +# 3 - Set the virtual memory accounting mode +bash -c "echo 0 > /proc/sys/vm/overcommit_memory" +``` + +**Installation Instructions:** + +1. Create the file inside the `/etc/init.d/` directory. e.g. + + `/etc/init.d/arangodb-os-optimization` + +2. Set correct permission, to mark the file executable. As _root_: + + `chmod 755 /etc/init.d/arangodb-os-optimization` + +3. On CentOS/RedHat, use the following commands to configure your system + to execute the script during the boot process. As _root_: + + ``` + chkconfig --add /etc/init.d/arangodb-os-optimization + chkconfig arangodb-os-optimization on + ``` + +**Note:** + +You might need the package _sysfsutils_. If this is the case, +please install it, as _root_, via: + +`yum install sysfsutils` + +**Important:** + +To optimize the OS "now", without having to restart the system, +the script **must** also be directly executed once. diff --git a/site/content/arangodb/oem/operations/installation/linux/operating-system-configuration.md b/site/content/arangodb/oem/operations/installation/linux/operating-system-configuration.md new file mode 100644 index 0000000000..95948af290 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/linux/operating-system-configuration.md @@ -0,0 +1,192 @@ +--- +title: Linux Operating System Configuration +menuTitle: Operating System Configuration +weight: 5 +description: >- + Recommendations regarding file systems, memory settings, and other options for + running ArangoDB on Linux +--- +{{< tip >}} +The most important suggestions listed in this section can be +easily applied by making use of a script. Please refer to the page +[Linux OS Tuning Script Examples](linux-os-tuning-script-examples.md) for +ready-to-use examples. +{{< /tip >}} + +## System Locales + +Some systems may miss the required locale to start the server, resulting in an +error message like the following: + +``` +FATAL [7ef60] {config} specified language 'en_US' does not match previously used language '' +``` + +The locale can be generated with the following command: + +```bash +sudo locale-gen "en_US.UTF-8" +``` + +Your distribution may also provide a frontend for doing so, for instance +[`dpkg-reconfigure locales` on Debian](https://wiki.debian.org/Locale). + +If you don't set a [default language](../../../components/arangodb-server/options.md#--default-language) +for the server explicitly, ArangoDB will use the default locale of your system. + +{{< warning >}} +The server language is stored in the `LANGUAGE` file in the database directory. +This file should not be modified manually to bypass issues with the locale, +because it may render indexes invalid without raising a warning or error. +Dumping the data and restoring it into an instance that has the correct +language configured is advised. +{{< /warning >}} + +## File Systems + +We recommend to **not** use BTRFS on linux, as user have reported issues using it in +conjunction with ArangoDB. We experienced ArangoDB facing latency issues when accessing +its database files on BTRFS partitions. In conjunction with BTRFS and AUFS we also saw +data loss on restart. + +We would not recommend network filesystems such as NFS for performance reasons, +furthermore we experienced some issues with hard links required for Hot Backup. + +## Page Sizes + +On Linux ArangoDB uses [jemalloc](https://github.com/jemalloc/jemalloc) as +its memory allocator. Unfortunately, some OS configurations can interfere with +jemalloc's ability to function properly. Specifically, Linux's "transparent hugepages", +Windows' "large pages" and other similar features sometimes prevent jemalloc from +returning unused memory to the operating system and result in unnecessarily high +memory use. Therefore, we recommend disabling these features when using jemalloc with +ArangoDB. Please consult your operating system's documentation for how to do this. + +Execute: + +```bash +sudo bash -c "echo madvise >/sys/kernel/mm/transparent_hugepage/enabled" +sudo bash -c "echo madvise >/sys/kernel/mm/transparent_hugepage/defrag" +``` + +before executing `arangod`. + +{{< info >}} +The official release executables of ArangoDB require the operating system +to use a page size of **4096 bytes** or less. +Larger page sizes lead to the error `<jemalloc>: Unsupported system page size` +during startup. + +You can check the page size with the `getconf PAGESIZE` command. +{{< /info >}} + +## Swap Space + +It is recommended to assign swap space for a server that is running arangod. +Configuring swap space can prevent the operating system's OOM killer from +killing ArangoDB too eagerly on Linux. + +## Overcommit Memory + +The recommended kernel setting for `overcommit_memory` is 0 or 1. +The Linux kernel default is 0. + +You can set it as follows before executing `arangod`: + +```bash +sudo bash -c "echo 0 >/proc/sys/vm/overcommit_memory" +``` + +From [www.kernel.org](https://www.kernel.org/doc/Documentation/sysctl/vm.txt): + +- When this flag is 0, the kernel attempts to estimate the amount + of free memory left when userspace requests more memory. + +- When this flag is 1, the kernel pretends there is always enough + memory until it actually runs out. + +- When this flag is 2, the kernel uses a "never overcommit" + policy that attempts to prevent any overcommit of memory. + +Experience has shown that setting `overcommit_memory` to a value of 2 has severe +negative side-effects when running arangod, so it should be avoided at all costs. + +## Max Memory Mappings + +Linux kernels by default restrict the maximum number of memory mappings of a +single process to about 64K mappings. While this value is sufficient for most +workloads, it may be too low for a process that has lots of parallel threads +that all require their own memory mappings. In this case all the threads' +memory mappings will be accounted to the single arangod process, and the +maximum number of 64K mappings may be reached. When the maximum number of +mappings is reached, calls to mmap will fail, so the process will think no +more memory is available although there may be plenty of RAM left. + +To avoid this scenario, it is recommended to raise the default value for the +maximum number of memory mappings to a sufficiently high value. As a rule of +thumb, one could use 8 times the number of available cores times 8,000. + +For a 32 core server, a good rule-of-thumb value thus would be 2,048,000 +(32 * 8 * 8000). For certain workloads, it may be sensible to use even a higher +value for the number of memory mappings. + +To set the value once, use the following command before starting arangod: + +```bash +sudo bash -c "sysctl -w 'vm.max_map_count=2048000'" +``` + +To make the settings durable, it will be necessary to store the adjusted +settings in /etc/sysctl.conf or other places that the operating system is +looking at. + +## Memory Limits + +A long-running arangod process may accumulate a lot of virtual memory after a +while, so it is recommended to **not** restrict the amount of virtual memory +that a process can acquire, neither via using `ulimit`, `cgroups` or systemd. + +## Zone Reclaim + +Execute + +```bash +sudo bash -c "echo 0 >/proc/sys/vm/zone_reclaim_mode" +``` + +before executing `arangod`. + +From [www.kernel.org](https://www.kernel.org/doc/Documentation/sysctl/vm.txt): + +This is value ORed together of + +- 1 = Zone reclaim on +- 2 = Zone reclaim writes dirty pages out +- 4 = Zone reclaim swaps pages + +## NUMA + +Multi-processor systems often have non-uniform Access Memory (NUMA). ArangoDB +should be started with interleave on such system. This can be achieved using + +```bash +numactl --interleave=all arangod ... +``` + +## Open Files Limit + +An arangod instance may need to use a lot of file descriptors for working with +files and network resources. It is therefore required to allow arangod processes +to use a lot of file descriptors at the same time. A reasonable value for the +maximum number of open file descriptors for an arangod process is 1048576. This +should provide enough headroom so that arangod doesn't run out of file descriptors. + +The maximum number of file descriptors can be adjusted using `ulimit`, `cgroups` +and `systemd`. + +## 32-bit + +While it might be possible to compile ArangoDB on 32-bit systems, this is not +officially supported and not a recommended environment. 64-bit systems can address +a significantly larger memory space. This is also the reason why only 64-bit +release builds are offered by ArangoDB Inc. diff --git a/site/content/arangodb/oem/operations/installation/macos.md b/site/content/arangodb/oem/operations/installation/macos.md new file mode 100644 index 0000000000..57e00ff323 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/macos.md @@ -0,0 +1,43 @@ +--- +title: Installing ArangoDB on macOS +menuTitle: macOS +weight: 15 +description: '' +--- +You can use ArangoDB on macOS with [Docker images](#docker) and run the client +tools using [_tar.gz_ archives](#installing-the-client-tools-using-the-archive). + +{{< tip >}} +Starting from version 3.10.0, ArangoDB has native support for the ARM +architecture and can run on Apple silicon (e.g. M1 chips). +{{< /tip >}} + +{{< info >}} +Running production environments on macOS is not supported. +{{< /info >}} + +{{< info >}} +Starting from version 3.11.0, ArangoDB Server binaries for macOS are not +provided anymore. +{{< /info >}} + +## Docker + +The recommended way of using ArangoDB on macOS is to use the +[ArangoDB Docker images](https://www.arangodb.com/download-major/docker/) +with, for instance, [Docker Desktop](https://www.docker.com/products/docker-desktop/). + +See the documentation on [Docker Hub](https://hub.docker.com/_/arangodb), +as well as the [Deploy](../../deploy/_index.md) section about +different deployment modes and methods including Docker containers. + +## Installing the client tools using the archive + +1. Visit the official [Download](https://www.arangodb.com/download) + page of the ArangoDB website and download the client tools _tar.gz_ archive for macOS. + +2. You may verify the download by comparing the SHA256 hash listed on the website + to the hash of the file. For example, you can you run `openssl sha256 <filename>` + or `shasum -a 256 <filename>` in a terminal. + +3. Extract the archive by double-clicking the file. diff --git a/site/content/arangodb/oem/operations/installation/uninstallation.md b/site/content/arangodb/oem/operations/installation/uninstallation.md new file mode 100644 index 0000000000..a5458bb2ee --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/uninstallation.md @@ -0,0 +1,35 @@ +--- +title: Uninstallation +menuTitle: Uninstallation +weight: 30 +description: >- + You can uninstall ArangoDB from a system and keep your data +--- +Uninstallation depends on the method used to install ArangoDB, and on the +operating system in use, and typically consists of the following high-level steps: + +**If an installation package is used:** + +- Uninstallation of the ArangoDB package, which may or may not remove the + database directory and the configuration files in addition to the ArangoDB + _binaries_, depending on how the uninstallation process is started and on + the operating system in use. +- Optional removal of the leftover files (database directory and/or + configuration files) + +**If a _tar.gz_ or _.zip_ archive is used:** + +- Removal of the files and folders that were unpacked from the archive. + A data directory might exist in a subdirectory of the root folder. +- Optional removal of the leftover files (database directory and/or + configuration files) stored in a different place + +{{< info >}} +If the ArangoDB _Starter_ was used to deploy ArangoDB, there will be an +additional manual step: + +- Removal of the data directory created by the _Starter_ + (the path used for the option `--starter.data-dir`). + This is different and in addition to the removal of the data directory + that is created for the _Single Instance_ by the installation package. +{{< /info >}} diff --git a/site/content/arangodb/oem/operations/installation/windows.md b/site/content/arangodb/oem/operations/installation/windows.md new file mode 100644 index 0000000000..ae507e12c5 --- /dev/null +++ b/site/content/arangodb/oem/operations/installation/windows.md @@ -0,0 +1,254 @@ +--- +title: Installing ArangoDB on Windows +menuTitle: Windows +weight: 20 +description: >- + You can use ArangoDB on Windows via Docker images, or use an installer or zip archives +--- +You can use ArangoDB on Windows (64-bit) in different ways: + +- [Docker image](#docker) +- Automated, using an installation wizard ("installer") + - [attended](#installing-using-the-installer) (GUI) + - [unattended](#unattended-installation-using-the-installer) (command line) +- Manually, using a [ZIP archive](#installing-using-the-zip-archive) + +Visit the official [Download](https://www.arangodb.com/download) +page of the ArangoDB web site. + +You may verify the download by comparing the SHA256 hash listed on the website +to the hash of the file. For example, you can run `openssl sha256 <filename>` +or `certutil -hashfile <filename> sha256` in a terminal. + +{{< info >}} +Running production environments on Windows is not supported. +{{< /info >}} + +## Docker + +The recommended way of using ArangoDB on Windows is to use the ArangoDB Docker +images with, for instance, [Docker Desktop](https://www.docker.com/products/docker-desktop/). + +You can choose one of the following: +- [`arangodb` official Docker images](https://hub.docker.com/_/arangodb), + verified and published by Docker. +- [`arangodb/arangodb` Docker images](https://hub.docker.com/r/arangodb/arangodb), + maintained and directly published by ArangoDB on a regular basis. + +See the documentation on [Docker Hub](https://hub.docker.com/_/arangodb), +as well as the [Deploy](../../deploy/_index.md) section about +different deployment modes and methods including Docker containers. + +## Installing using the Installer + +The default installation directory is `%PROGRAMFILES%\ArangoDB-3.x.x` +(multi-user) or `%LOCALAPPDATA%\ArangoDB-3.x.x\` (single-user). You may change +it during the installation process. In the following description, it is assumed +that ArangoDB has been installed in the location `<ROOTDIR>`. + +You have to be careful when choosing an installation directory. You need either +write permission to this directory or you need to modify the configuration file +for the server process. In the latter case the database directory and the Foxx +directory have to be writable by the user. + +### Single- and Multi-User Installation + +There are two main modes for the installer of ArangoDB. +The installer lets you select: + +- **Multi-user installation** (default; admin privileges required). + Installs ArangoDB as service. +- **Single-user installation**. + Allows to install ArangoDB as normal user. + Requires manual starting of the database server. + +### Installation Options + +You can tick or untick the following checkboxes: + +- Choose custom install paths +- Do an automatic upgrade +- Keep an backup of your data +- Add executables to path +- Create a desktop icon + +#### Custom Install Paths + +This checkbox controls if you are able to override +the default paths for the installation in subsequent steps. + +The default installation paths are: + +Multi-User Default: +- Installation: `%PROGRAMFILES%\ArangoDB-3.x.x` +- DataBase: `%PROGRAMDATA%\ArangoDB` +- Foxx Service: `%PROGRAMDATA%\ArangoDB-apps` + +Single-User Default: +- Installation: `%LOCALAPPDATA%\ArangoDB-3.x.x\` +- DataBase: `%LOCALAPPDATA%\ArangoDB\` +- Foxx Service: `%LOCALAPPDATA%\ArangoDB-apps\` + +The environment variables are typically: +- `%PROGRAMFILES%`: `C:\Program Files` +- `%PROGRAMDATA%`: `C:\ProgramData` +- `%LOCALAPPDATA%`: `C:\Users\<YourName>\AppData\Local` + +We are not using the roaming part of the user's profile, because doing so +avoids the data being synced to the windows domain controller. + +#### Automatic Upgrade + +If this checkbox is selected, the installer attempts to perform an automatic +update. For more information, please see +[Upgrading on Windows](../upgrading/os-specific-information/windows.md). + +#### Keep Backup + +Select this to create a backup of your database directory during automatic upgrade. +The backup is created next to your current database directory suffixed by +a time stamp. + +#### Add to Path + +Select this to add the binary directory to your system's path (multi-user +installation) or user's path (single-user installation). + +#### Desktop Icon + +Select if you want the installer to create Desktop Icons that let you: + +- access the web interface +- start the command-line client (arangosh) +- start the database server (single-user installation only) + +### Starting + +If you installed ArangoDB for multiple users (as a service), it is automatically +started. Otherwise you need to use the shortcut that was created on your desktop +(depending on the installer settings) or by running the executable `arangod.exe` +located in `<ROOTDIR>\usr\bin`. It uses the configuration file `arangod.conf` +located in `<ROOTDIR>\etc\arangodb3`, which you can adjust to your needs. + +Please check the output of the `arangod.exe` executable before continuing. +If the server started successfully, you should see a line +`ArangoDB is ready for business. Have fun!` at the end of its output. + +You can access the administration web interface by pointing your web browser to +the following address: + +``` +http://127.0.0.1:8529/ +``` + +### Advanced Starting + +If you want to provide your own start scripts, you can set the environment +variable `ARANGODB_CONFIG_PATH`. This variable should point to a directory +containing the configuration files. + +### Using the Client + +To connect to an already running ArangoDB server instance, there is a shell +`arangosh.exe` located in `<ROOTDIR>\usr\bin`. This starts a shell that can be +used – amongst other things – to administer and query a local or remote +ArangoDB server. + +Note that `arangosh.exe` does NOT start a separate server, it only starts the +shell. To use it you must have a server running somewhere, e.g. by using +the `arangod.exe` executable. + +`arangosh.exe` uses the configuration from the file `arangosh.conf` located in +`<ROOTDIR>\etc\arangodb3\`. Please adjust this to your needs if you want to +use different connection settings etc. + +### Uninstalling + +To uninstall the Arango server application you can use the windows control panel +(as you would normally uninstall an application). Note however, that any data +files created by the ArangoDB server as well as the `<ROOTDIR>` directory +remain. To complete the uninstallation process, remove the data files and +the `<ROOTDIR>` directory manually. + +## Unattended installation using the installer + +The NSIS-based installer requires user interaction by default, but it also +offers a [Silent Mode](https://nsis.sourceforge.io/Docs/Chapter4.html#silent) +which allows you to run it non-interactively from the command line: + +``` +ArangoDB3-3.x.x_win64.exe /S ... +``` + +You can run the uninstaller in Silent Mode: + +``` +Uninstall.exe /S ... +``` + +All choices available in the GUI can be passed as arguments. The options can +be specified like `/OPTIONNAME=value`. + +### Supported options + +*For Installation*: + +- `/PASSWORD` - Set the password for the `root` user. If this option is not set + but a persistent environment variable `PASSWORD` is, then its value is + used as password. +- `/INSTDIR` - Installation directory. A directory that you have access to. +- `/DATABASEDIR` - Database directory. A directory that you have access to + and the databases should be created in. +- `/APPDIR` - Foxx Services directory. A directory that you have access to. +- `/INSTALL_SCOPE_ALL`: + - `1` - Install for all users, as well as install a Windows service called + `arangodb` and launch it. + - `0` - Install for the current user only. Does not start the server + automatically, but creates a shortcut on the desktop to start it. +- `/DESKTOPICON` + - `0` - Do not create any shortcuts + - `1` - Create shortcuts on the desktop for arangosh and the web interface +- `/UPGRADE` + - `1` - Automatically upgrade existing ArangoDB databases + - `0` - No upgrade of databases +- `/BACKUP_ON_UPGRADE` + - `1` - Keep a backup of the databases if `/UPGRADE=1` is set + - `0` - No backup +- `/PATH` + - `0` - Do not add ArangoDB to the PATH environment variable + - `1`: + - With `/INSTALL_SCOPE_ALL=1`: add it to the path for all users + - With `/INSTALL_SCOPE_ALL=0`: add it to the path of the currently logged in users + +*For Uninstallation*: + +- `/PURGE_DB` + - `0` - Database files remain on the system + - `1` - Database files ArangoDB created during its lifetime are removed, too. + +## Installing using the ZIP archive + +Not all users prefer the guided _Installer_ to install ArangoDB. In order to have a +[portable application](http://en.wikipedia.org/wiki/Portable_application), or easily +start different ArangoDB versions on the same machine, and/or for the maximum flexibility, +you might want to install using the _ZIP_ archive ([XCOPY deployment](http://en.wikipedia.org/wiki/XCOPY_deployment)). + +### Unzip the archive + +Open an explorer, choose a place where you would like ArangoDB to be, and extract the +archive there. It creates its own top-level directory with the version number in the name. + +### Edit the configuration + +*This step is optional.* + +If the default configuration of ArangoDB does not suite your needs, +you can edit `etc\arangodb3\arangod.conf` to change or add configuration options. + +### Start the Server + +After installation, you may start ArangoDB in several ways. The exact start-up command +depends on the type of ArangoDB deployment you are interested in +(_Single Instance_, _Active Failover_ or _Cluster_). + +Please refer to the [Deploy](../../deploy/_index.md) chapter for details. diff --git a/site/content/arangodb/oem/operations/security/_index.md b/site/content/arangodb/oem/operations/security/_index.md new file mode 100644 index 0000000000..5d3bf98245 --- /dev/null +++ b/site/content/arangodb/oem/operations/security/_index.md @@ -0,0 +1,7 @@ +--- +title: Security +menuTitle: Security +weight: 230 +description: >- + Learn about the various security options you can use in ArangoDB +--- diff --git a/site/content/arangodb/oem/operations/security/audit-logging.md b/site/content/arangodb/oem/operations/security/audit-logging.md new file mode 100644 index 0000000000..60dd5d212c --- /dev/null +++ b/site/content/arangodb/oem/operations/security/audit-logging.md @@ -0,0 +1,291 @@ +--- +title: Audit logging +menuTitle: Audit logging +weight: 20 +description: >- + Audit logs capture interactions with the database system and allow you to + check who accessed it, what actions were performed, and how the system + responded +pageToc: + maxHeadlineLevel: 3 +--- +{{< tag "ArangoDB Enterprise Edition" >}} + +{{< tip >}} +A similar feature is also available in the +[Arango Managed Platform (AMP)](../../../../amp/security-and-access-control/_index.md#using-an-audit-log). +{{< /tip >}} + +## Configuration + +To enable audit logging, set the `--audit.output` startup option to either a +file path (`file://<path-to-file>`) or a syslog server (`syslog://<facility>`). + +For information about the startup options for audit logging, see +[ArangoDB Server Options](../../components/arangodb-server/options.md#audit). + +## Log format + +The general format of audit logs is as follows: + +``` +<time-stamp> | <server> | <topic> | <username> | <database> | <client-ip> | <authentication> | <text1> | <text2> | ... +``` + +- `time-stamp`: When the event occurred. The timezone is GMT. This allows you to + easily match log entries from servers in different timezones. + +- `server`: The server name. You can specify a custom name on startup with the + [`--audit.hostname`](../../components/arangodb-server/options.md#--audithostname) + startup option. Otherwise, the default hostname is used. + +- `topic`: The log topic of the entry. A topic can be suppressed via the + `--log.level` startup option or the [HTTP API](../../develop/http-api/monitoring/logs.md#set-the-server-log-levels). + +- `username`: The (authenticated or unauthenticated) name supplied by the client. + A dash (`-`) indicates that no name was given by the client. + +- `database`: The database that was accessed. Note that there are no + database-crossing queries. Each access is restricted to one database in ArangoDB. + +- `client-ip`: The source network address of the request. + +- `authentication`: The method used to authenticate the user. + +- Details about the request in the additional fields. + Any additional fields (e.g. `text1` and `text2`) are determined by the type + of log message. Most messages include a status of `ok` or `failed`. + +## Events + +Unless otherwise noted, all events are logged to their respective topics at the +`INFO` level. To suppress events from a given topic, set the topic to the `WARNING` +level or higher. By default, each topic is set to the `INFO` level. You need to +set a more verbose level for some topics to log all events. + +The examples for different topics listed below are not exhaustive. + +### Authentication + +#### Unknown authentication methods + +``` +2016-10-03 15:44:23 | server1 | audit-authentication | n/a | database1 | 127.0.0.1:61525 | n/a | unknown authentication method | /_api/version +``` + +This message occurs when a request contains an `Authorization` header with +an unknown authentication method. Typically, only `basic` and `bearer` are +accepted. + +#### Missing credentials + +``` +2016-10-03 15:39:49 | server1 | audit-authentication | n/a | database1 | 127.0.0.1:61498 | n/a | credentials missing | /_api/version +``` + +This message occurs when authentication is enabled and a request omits an +`Authorization` header. Note that this may naturally occur when making an +initial request to e.g. log in or load the web interface. For this reason, such +low-priority events are logged at the `DEBUG` level. + +#### Wrong credentials + +``` +2016-10-03 17:21:22 | server1 | audit-authentication | root | database1 | 127.0.0.1:64214 | http jwt | user 'root' wrong credentials | /_open/auth +``` + +This message occurs when a user makes an attempt to log in with incorrect +credentials, or passes a JWT with invalid credentials. + +Note that the user given as fourth part is the user that requested the login. +In general, it may be unavailable: + +``` +2016-10-03 15:47:26 | server1 | audit-authentication | n/a | database1 | 127.0.0.1:61528 | http basic | credentials wrong | /_api/version +``` + +#### JWT login succeeded + +``` +2016-10-03 17:21:22 | server1 | audit-authentication | root | database1 | 127.0.0.1:64214 | http jwt | user 'root' authenticated | /_open/auth +``` + +The message occurs when a user successfully logs in and is given a JWT token +for further use. + +Note that the user given as fourth part is the user that requested the login. + +### Authorization + +Internal low-priority operations are logged to the `audit-authorization` topic +at the `DEBUG` level. + +#### User not authorized to access database + +``` +2016-10-03 16:20:52 | server1 | audit-authorization | user1 | database2 | 127.0.0.1:62262 | http basic | not authorized | /_api/version +``` + +This message occurs when a user attempts to access a database in a manner in +which they have not been granted access. + +### Databases + +#### Database created + +``` +2016-10-04 15:33:25 | server1 | audit-database | user1 | database1 | 127.0.0.1:56920 | http basic | create database 'database1' | ok | /_api/database +``` + +This message occurs whenever a user attempts to create a database. If +successful, the status is `ok`, otherwise `failed`. + +#### Database dropped + +``` +2016-10-04 15:33:25 | server1 | audit-database | user1 | database1 | 127.0.0.1:56920 | http basic | delete database 'database1' | ok | /_api/database +``` + +This message occurs whenever a user attempts to drop a database. If +successful, the status is `ok`, otherwise `failed`. + +### Collections + +#### Collection created + +``` +2016-10-05 17:35:57 | server1 | audit-collection | user1 | database1 | 127.0.0.1:51294 | http basic | create collection 'collection1' | ok | /_api/collection +``` + +This message occurs whenever a user attempts to create a collection. If +successful, the status is `ok`, otherwise `failed`. + +#### Collection truncated + +``` +2016-10-05 17:36:08 | server1 | audit-collection | user1 | database1 | 127.0.0.1:51294 | http basic | truncate collection 'collection1' | ok | /_api/collection/collection1/truncate +``` + +This message occurs whenever a user attempts to truncate a collection. If +successful, the status is `ok`, otherwise `failed`. + +#### Collection dropped + +``` +2016-10-05 17:36:30 | server1 | audit-collection | user1 | database1 | 127.0.0.1:51294 | http basic | delete collection 'collection1' | ok | /_api/collection/collection1 +``` + +This message occur whenever a user attempts to drop a collection. If +successful, the status is `ok`, otherwise `failed`. + +### Indexes + +#### Index created + +``` +2016-10-05 18:19:40 | server1 | audit-collection | user1 | database1 | 127.0.0.1:52467 | http basic | create index in 'collection1' | ok | {"fields":["a"],"sparse":false,"type":"persistent","unique":false} | /_api/index?collection=collection1 +``` + +This message occurs whenever a user attempts to create an index. If +successful, the status is `ok`, otherwise `failed`. + +#### Index dropped + +``` +2016-10-05 18:18:28 | server1 | audit-collection | user1 | database1 | 127.0.0.1:52464 | http basic | drop index 'collection1/44051' | ok | /_api/index/collection1/44051 +``` + +This message occurs whenever a user attempts to drop an index. If +successful, the status is `ok`, otherwise `failed`. + +### Documents + +If statistics are enabled, the system will periodically perform several document +operations on a few system collections. These low-priority operations are logged +to the `audit-document` topic at the `DEBUG` level. + +#### Single document read + +``` +2016-10-04 12:27:55 | server1 | audit-document | user1 | database1 | 127.0.0.1:53699 | http basic | read document in 'collection1' | ok | /_api/document/collection1 +``` + +This message occurs whenever a user attempts to read a document. If +successful, the status is `ok`, otherwise `failed`. + +#### Single document created + +``` +2016-10-04 12:27:55 | server1 | audit-document | user1 | database1 | 127.0.0.1:53699 | http basic | create document in 'collection1' | ok | /_api/document/collection1 +``` + +This message occurs whenever a user attempts to create a document. If +successful, the status is `ok`, otherwise `failed`. + +#### Single document replaced + +``` +2016-10-04 12:28:08 | server1 | audit-document | user1 | database1 | 127.0.0.1:53699 | http basic | replace document 'collection1/21456' | ok | /_api/document/collection1/21456?ignoreRevs=false +``` + +This message occurs whenever a user attempts to replace a document. If +successful, the status is `ok`, otherwise `failed`. + +#### Single document updated + +``` +2016-10-04 12:28:15 | server1 | audit-document | user1 | database1 | 127.0.0.1:53699 | http basic | modify document 'collection1/21456' | ok | /_api/document/collection1/21456?keepNull=true&ignoreRevs=false +``` + +This message occurs whenever a user attempts to update a document. If +successful, the status is `ok`, otherwise `failed`. + +#### Single document deleted + +``` +2016-10-04 12:28:23 | server1 | audit-document | user1 | database1 | 127.0.0.1:53699 | http basic | delete document 'collection1/21456' | ok | /_api/document/collection1/21456?ignoreRevs=false +``` + +This message occurs whenever a user attempts to delete a document. If +successful, the status is `ok`, otherwise `failed`. + +### Queries + +``` +2016-10-06 12:12:10 | server1 | audit-document | user1 | database1 | 127.0.0.1:54232 | http basic | query document | ok | for i in collection1 return i | /_api/cursor +``` + +This message occurs whenever a user attempts to execute a query. If +successful, the status is `ok`, otherwise `failed`. + +### Hot Backups + +There are three operations which are put into the audit log with respect +to Hot Backups. + +#### Hot Backup created + +``` +2020-01-21 15:29:06 | tux | audit-hotbackup | root | n/a | (internal) | n/a | Hotbackup taken with ID 2020-01-21T15:29:06Z_a98422de-03ab-4b94-8ed9-e084bfd4bae1, result: 0 +``` + +This message occurs whenever a user attempts to create a Hot Backup. +If successful, the status is `0`, otherwise some numerical error code. + +#### Hot Backup restored + +``` +2020-01-21 15:29:42 | tux | audit-hotbackup | root | n/a | (internal) | n/a | Hotbackup restored with ID 2020-01-21T15.29.06Z_a98422de-03ab-4b94-8ed9-e084bfd4bae1, result: 0 +``` + +This message occurs whenever a user attempts to restore from a Hot Backup. +If successful, the status is `0`, otherwise some numerical error code. + +#### Hot Backup deleted + +``` +2020-01-21 15:32:37 | tux | audit-hotbackup | root | n/a | (internal) | n/a | Hotbackup deleted with ID 2020-01-21T15.32.27Z_cf1e3cb1-32c0-41d2-9a3f-528c9b43cbf9, result: 0 +``` + +This message occurs whenever a user attempts to delete a Hot Backup. +If successful, the status is `0`, otherwise some numerical error code. diff --git a/site/content/arangodb/oem/operations/security/change-root-password.md b/site/content/arangodb/oem/operations/security/change-root-password.md new file mode 100644 index 0000000000..cd5d7cebd8 --- /dev/null +++ b/site/content/arangodb/oem/operations/security/change-root-password.md @@ -0,0 +1,37 @@ +--- +title: How to reset the root password +menuTitle: Change Root Password +weight: 10 +description: >- + You can temporarily start ArangoDB with authentication disabled to set a new + password for the root user +--- +You can reset the _root_ password in the following way: + +- Stop the Server +- Set `authentication=false` in the `arangod.conf` file +- Restart the Server + - **Note:** you might need to take any needed precaution to avoid this server can be accessed from outside as currently authentication is temporarily disabled. You might do this by disabling network access or using _localhost_ for the binding (`--server.endpoint tcp://127.0.0.1:8529`) +- Change the password using the ArangoDB web interface, or using the following command via `arangosh`: + +```js +require("@arangodb/users").update("root", "newpassword"); +``` + +This command should return: + +```json +{ + "user" : "root", + "active" : true, + "extra" : { + }, + "code" : 200 +} +``` + +- Set `authentication=true` in the `arangod.conf` file +- Restart the server +- Test the connection + +Please note that the above procedure is meant for _Single Instance_. If you are using an _ArangoDB Cluster_ or _Active Failover_ you should disable and enable authentication in the `arangod.conf` file of each node. Changes to the `arangod.conf` file under the path `etc/arangodb3/arangod.conf` in _Cluster_ and _Active Failover_ deployments will not work in this case. diff --git a/site/content/arangodb/oem/operations/security/encryption-at-rest.md b/site/content/arangodb/oem/operations/security/encryption-at-rest.md new file mode 100644 index 0000000000..ee1e7ac15a --- /dev/null +++ b/site/content/arangodb/oem/operations/security/encryption-at-rest.md @@ -0,0 +1,145 @@ +--- +title: Encryption at Rest +menuTitle: Encryption at Rest +weight: 15 +description: >- + You can secure the physical storage media of an ArangoDB deployment by letting + it encrypt the database directories +--- +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +When you store sensitive data in your ArangoDB database, you want to protect +that data under all circumstances. At runtime you will protect it with SSL +transport encryption and strong authentication, but when the data is already +on disk, you also need protection. That is where the Encryption feature comes +in. + +The Encryption feature of ArangoDB will encrypt all data that ArangoDB is +storing in your database before it is written to disk. + +The data is encrypted with AES-256-CTR, which is a strong encryption algorithm, +that is very suitable for multi-processor environments. This means that your +data is safe, but your database is still fast, even under load. + +Hardware acceleration for encryption and decryption is automatically used if +available. The required AES-NI instruction set (Advanced Encryption Standard +New Instructions) is available on the majority of Intel and AMD processors from +the last decade. The benefits over a software-only implementation are better +performance and resistance to side-channel attacks. + +The encryption feature is supported by all ArangoDB deployment modes. + +{{< info >}} +The Arango Managed Platform (AMP) has encryption at rest as well as in transit +set on by default and cannot be disabled. For more information, see the +[Arango Managed Platform (AMP) documentation](../../../../amp/_index.md). +{{< /info >}} + +## Limitations + +The encryption feature has the following limitations: + +- Encrypting a single collection is not supported: all the databases are + encrypted. +- It is not possible to enable encryption at runtime: if you have existing + data you will need to take a backup first, then enable encryption and + start your server on an empty data-directory, and finally restore your + backup. + +## Encryption keys + +The encryption feature of ArangoDB requires a single 32-byte key per server. +It is recommended to use a different key for each server (when operating in a +cluster configuration). + +{{< security >}} +Make sure to protect the encryption keys! That means: + +- Do not write them to persistent disks or your server(s), always store them on + an in-memory (`tmpfs`) filesystem. + +- Transport your keys safely to your server(s). There are various tools for + managing secrets like this (e.g. + [vaultproject.io](https://www.vaultproject.io/)). + +- Store a copy of your key offline in a safe place. If you lose your key, there + is NO way to get your data back. +{{< /security >}} + +## Configuration + +To activate encryption of your database, you need to supply an encryption key +to the server. + +Make sure to pass this option the very first time you start your database. +You cannot encrypt a database that already exists. + +### Encryption key stored in file + +Pass the following option to `arangod`: + +``` +$ arangod --rocksdb.encryption-keyfile=/mytmpfs/mySecretKey ... +``` +The file `/mytmpfs/mySecretKey` must contain the encryption key. This +file must be secured, so that only `arangod` can access it. You should +also ensure that in case someone steals the hardware, they will not be +able to read the file. For example, by encrypting `/mytmpfs` or +creating an in-memory file-system under `/mytmpfs`. + +### Encryption key generated by a program + +Pass the following option to `arangod`: + +``` +$ arangod --rocksdb.encryption-key-generator=path-to-my-generator ... +``` + +The program `path-to-my-generator` output the encryption on standard +output and exit. + +### Kubernetes encryption secret + +If you use _kube-arangodb_ then use the `spec.rocksdb.encryption.keySecretName` +setting to specify the name of the Kubernetes secret to be used for encryption. +See the [kube-arangodb documentation](https://arangodb.github.io/kube-arangodb/docs/api/ArangoDeployment.V1#specrocksdbencryptionkeysecretname). + +## Creating keys + +The encryption keyfile must contain 32 bytes of random data. + +You can create it with a command line this. + +``` +dd if=/dev/random bs=1 count=32 of=yourSecretKeyFile +``` + +For security, it is best to create these keys offline (away from your database +servers) and directly store them in your secret management tool. + +## Rotating encryption keys + +ArangoDB supports rotating the user supplied encryption at rest key. +This is implemented via key indirection. At initial startup, the first found +user-supplied key is used as the internal master key. Alternatively, the internal +master key can be generated from random characters if the startup option +`--rocksdb.encryption-gen-internal-key` is set to `true`. + +It is possible to change the user supplied encryption at rest key via the +[HTTP API](../../develop/http-api/security.md#encryption-at-rest). This API +is disabled by default, but can be turned on by setting the startup option +`--rocksdb.encryption-key-rotation` to `true`. + +To enable smooth rollout of new keys you can use the new option +`--rocksdb.encryption-keyfolder` to provide a set of secrets. +_arangod_ will then store the master key encrypted with the provided secrets. + +``` +$ arangod --rocksdb.encryption-keyfolder=/mytmpfs/mySecrets ... +``` + +To start an arangod instance only one of the secrets needs to be correct, +this should guard against service interruptions during the rotation process. + +Please be aware that the encryption at rest key rotation is an **experimental** +feature, and its APIs and behavior are still subject to change. diff --git a/site/content/arangodb/oem/operations/security/securing-starter-deployments.md b/site/content/arangodb/oem/operations/security/securing-starter-deployments.md new file mode 100644 index 0000000000..bfca9d5f70 --- /dev/null +++ b/site/content/arangodb/oem/operations/security/securing-starter-deployments.md @@ -0,0 +1,39 @@ +--- +title: Securing Starter Deployments +menuTitle: Securing Starter Deployments +weight: 25 +description: >- + You should enable authentication for deployments you create with the + ArangoDB Starter before starting them the first time +--- +The password that is set for the _root_ user during the installation of the ArangoDB +package has no effect in case of deployments done with the tool _ArangoDB Starter_, +as this tool creates new database directories and configuration files that are +separate from those created by the stand-alone installation. + +Assuming you have enabled authentication in your _Starter_ deployment (using `--auth.jwt-secret=<secret-file>`), by default +the _root_ user will be created with an _empty_ password. + +In order to the change the password of the _root_ user, you can: + +- Open the ArangoDB web interface and change the password from there. [More information](../../components/web-interface/users.md). +- Open _arangosh_ and use the [`users.replace()` function](../administration/user-management/in-arangosh.md#replace). + +In case you would like to automate the _root_ password change, you might use the +`--javascript.execute-string` option of the _arangosh_ binary, e.g.: + +```bash +arangosh --server.endpoint your-server-endpoint \ + --server.password "" \ + --javascript.execute-string 'require("@arangodb/users").update("root", "mypwd");' +``` + +where "mypwd" is the new password you want to set. + +If your _Starter_ deployment has authentication turned off, it is suggested to +turn it on using a _JWT secret_ file. For more information on this topic, please +refer to the _Starter_ [Option](../../components/tools/arangodb-starter/options.md#authentication-options) page. + +Note that you cannot easily turn authentication on/off once your deployment +has started for the first time. It is possible to stop all _Starters_ and then +manually modify all the `arangod.conf` files in yor data directory, but this is not recommended. diff --git a/site/content/arangodb/oem/operations/security/security-options.md b/site/content/arangodb/oem/operations/security/security-options.md new file mode 100644 index 0000000000..109d930ef9 --- /dev/null +++ b/site/content/arangodb/oem/operations/security/security-options.md @@ -0,0 +1,372 @@ +--- +title: Server security options +menuTitle: Security Options +weight: 5 +description: >- + You can harden an ArangoDB server by restricting APIs, limiting what can be + accessed in JavaScript contexts, and disable unused features +--- +_arangod_ provides a variety of options to make a setup more secure. +Administrators can use these options to limit access to certain ArangoDB +server functionality as well as preventing the leakage of information about +the environment that a server is running in. + +## General security options + +The following security options are available: + +- `--server.harden` + If this option is set to `true` and authentication is enabled, non-admin users + will be denied access to the following REST APIs: + + - `/_admin/cluster/numberOfServers` + - `/_admin/log` + - `/_admin/log/level` + - `/_admin/status` + - `/_admin/statistics` + - `/_admin/statistics-description` + - `/_api/engine/stats` + + Additionally, no version details will be revealed by the version REST API at + `/_api/version`. + + The default value for this option is `false`. + +- `--server.support-info-api` + This option controls access to the REST API endpoint `/_admin/support-info` + for retrieving deployment information. It can have the following values: + - `disabled`: support info API is disabled. + - `jwt`: support info API can only be accessed via superuser JWT. + - `admin` (default): the support info API can only be accessed by admin users and superuser JWTs. + - `public`: everyone with access to the `_system` database can access the + support info API. + + The default value for this option is `admin`. + +## JavaScript security options + +`arangod` has several options that allow you to make your installation more +secure when it comes to running application code in it. Below you will find +an overview of the relevant options. + +### Allowlists and denylists + +Several options exist to restrict JavaScript application code functionality +to just certain allowed subsets. Which subset of functionality is available +can be controlled via "denylisting" and "allowlisting" access to individual +components. + +The set theory for these lists works as follow: + +- **Only a denylist is specified:** + Everything is allowed except a set of items matching the denylist. +- **Only an allowlist is specified:** + Everything is disallowed except the set of items matching the allowlist. +- **Both allowlist and denylist are specified:** + Everything is disallowed except the set of items matching the allowlist. + From this allowed set, subsets can be forbidden again using the denylist. + +Values for denylist and allowlist options need to be specified as ECMAScript +regular expressions. +Each option can be used multiple times. When specifying more than one +pattern, these patterns will be combined with a _logical or_ to the actual pattern +ArangoDB will use. + +These patterns and how they are applied can be observed by enabling +`--log.level SECURITY=debug` in the `arangod` or `arangosh` log output. + +### Options for allowlisting and denylisting + +The following options are available for allowlisting and denylisting access +to dedicated functionality for application code: + +- `--javascript.startup-options-[allowlist|denylist]`: + These options control which startup options will be exposed to JavaScript code. + +- `--javascript.environment-variables-[allowlist|denylist]`: + These options control which environment variables will be exposed to + JavaScript code. + +- `--javascript.files-allowlist`: + This option controls which filesystem paths can be accessed from JavaScript + code. There is only an allowlist option for file access. + +- `--javascript.endpoints-[allowlist|denylist]`: + These options control which endpoints can be used from within the + `@arangodb/request` JavaScript module. + +#### Startup option access + +The security option to observe the behavior of the pattern matching most easily +is the masquerading of the startup options: + +``` +--javascript.startup-options-allowlist "^server\." +--javascript.startup-options-allowlist "^log\." +--javascript.startup-options-denylist "^javascript\." +--javascript.startup-options-denylist "^endpoint$" +``` + +These sets will resolve internally to the following regular expressions: + +``` +--javascript.startup-options-allowlist = "^server\.|^log\." +--javascript.startup-options-denylist = "^javascript\.|endpoint" +``` + +Invoking _arangosh_ with these options will hide the denied command-line +options from the output of: + +```js +require('internal').options() +``` + +… and an exception will be thrown when trying to access items that are masked +in the same way as if they weren't there in first place. + +#### Environment variable access + +Access to environment variables can be restricted to hide sensitive information +from JavaScript code, for example: + +``` +--javascript.environment-variables-allowlist "^ARANGO_" +--javascript.environment-variables-denylist "PASSWORD" +``` + +This will allow JavaScript code to only see environment variables that start +with `ARANGO_` except if they contain `PASSWORD`. It excludes the variables +`PATH` and `ARANGO_ROOT_PASSWORD` for instance. + +Note that regular expression matching is case-sensitive. `PASSWORD` will not +exclude environment variables that include `password`. You may use +`[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]` for case-insensitive matching. + +You can test the allow-/denylisting in _arangosh_, here using the ArangoDB 3.7 +Docker image: + +``` +docker run --rm -e ARANGO_ROOT_PASSWORD="secret" arangodb:3.7 arangosh --javascript.execute-string "print(process.env)" +... +{ + "ARANGO_PACKAGE" : "arangodb3_3.7.15-1_amd64.deb", + "HOSTNAME" : "84fe29186eba", + "SHLVL" : "1", + "HOME" : "/root", + "ARANGO_ROOT_PASSWORD" : "secret", + "ARANGO_VERSION" : "3.7.15", + "PATH" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "ARANGO_URL" : "https://download.arangodb.com/arangodb37/DEBIAN/amd64", + "ARANGO_PACKAGE_URL" : "https://download.arangodb.com/arangodb37/DEBIAN/amd64/arangodb3_3.7.15-1_amd64.deb", + "ARANGO_SIGNATURE_URL" : "https://download.arangodb.com/arangodb37/DEBIAN/amd64/arangodb3_3.7.15-1_amd64.deb.asc", + "PWD" : "/", + "ICU_DATA" : "/usr/share/arangodb3/" +} + +docker run --rm -e ARANGO_ROOT_PASSWORD="secret" arangodb:3.7 arangosh --javascript.execute-string "print(process.env)" --javascript.environment-variables-allowlist "^ARANGO_" --javascript.environment-variables-denylist "PASSWORD" +... +[Object { + "ARANGO_PACKAGE" : "arangodb3_3.7.15-1_amd64.deb", + "ARANGO_VERSION" : "3.7.15", + "ARANGO_URL" : "https://download.arangodb.com/arangodb37/DEBIAN/amd64", + "ARANGO_PACKAGE_URL" : "https://download.arangodb.com/arangodb37/DEBIAN/amd64/arangodb3_3.7.15-1_amd64.deb", + "ARANGO_SIGNATURE_URL" : "https://download.arangodb.com/arangodb37/DEBIAN/amd64/arangodb3_3.7.15-1_amd64.deb.asc" +}] +``` + +#### File access + +In contrast to other areas, access to directories and files from JavaScript +operations is only controlled via an allowlist, which can be specified via the +startup option `--javascript.files-allowlist`. Thus any files or directories +not matching the allowlist will be inaccessible from JavaScript filesystem +functions. + +For example, when using the following startup options + +``` +--javascript.files-allowlist "^/etc/required/" +--javascript.files-allowlist "^/etc/mtab/" +--javascript.files-allowlist "^/etc/issue$" +``` + +The file `/etc/issue` will be allowed to accessed and all files in the directories +`/etc/required` and `/etc/mtab` plus their subdirectories will be accessible, +while access to files in any other directories will be disallowed from +JavaScript operations, with the following exceptions: + +- ArangoDB's temporary directory: JavaScript code is given access to this + directory for storing temporary files. The temporary directory location + can be specified explicitly via the `--temp.path` option at startup. + If the option is not specified, ArangoDB will automatically use a subdirectory + of the system's temporary directory. +- ArangoDB's own JavaScript code, shipped with the ArangoDB release packages. + Files in this directory and its subdirectories will be readable for JavaScript + code running in ArangoDB. The exact path can be specified by the startup option + `--javascript.startup-directory`. + +#### Endpoint access + +The endpoint allow-/denylisting limits access to external HTTP resources: + +``` +--javascript.endpoints-denylist "<regex>" +--javascript.endpoints-allowlist "<regex>" +``` + +Filtering is done against the full request URL, including protocol, hostname / +IP address, port, and path. + +{{< security >}} +Keep in mind that these startup options are treated as regular expressions. +Certain characters have special meaning that may require escaping and the +expression only needs to match a substring by default. It is recommended to +fully specify URLs and to use a leading `^` and potentially a trailing `$` to +ensure that no other than the intended URLs are matched. +{{< /security >}} + +Specifying `arangodb.org` will match: +- `http://arangodb.org` +- `http://arangodb.org/` +- `http://arangodb.org/folder/file.html` +- `https://arangodb.org` +- `https://arangodb.org:12345` +- `https://subdomain.arangodb.organic` **(!)** +- `https://arangodb-org.evil.domain` **(!)** +- etc. + +An unescaped `.` represents any character. For a literal dot use `\.`. + +Specifying `http://arangodb\.org` will match: +- `http://arangodb.org` +- `http://arangodb.org:12345` +- `http://arangodb.organic` **(!)** +- `http://arangodb.org.evil.domain` **(!)** +- etc. + +Specifying `^http://arangodb\.org$` will only match `http://arangodb.org`. +Despite port 80 being the default HTTP port, this will not match +`http://arangodb.org:80` with an explicitly stated port. Conversely, specifying +`^http://arangodb\.org:80$` will match `http://arangodb.org:80` with an explicit +port in the request URL but not `http://arangodb.org` with the port left out. +To allow both, you can make the port optional like `^http://arangodb\.org(:80)?$`. +However, the trailing `$` demands that the URL has no path. This means +`http://arangodb.org/folder/file.html` and even `http://arangodb.org/` will not +match. You can specify `^http://arangodb\.org(:80)?/` to allow any path (but +the trailing slash will be needed in the request URL). + +Specifying `^https?://arangodb\.org(:80|:443)?(/|$)` will match: +- `http://arangodb.org` +- `http://arangodb.org/` +- `http://arangodb.org/folder/file.html` +- `http://arangodb.org:80` +- `http://arangodb.org:80/` +- `http://arangodb.org:80/folder/file.html` +- `https://arangodb.org:443` +- `https://arangodb.org:443/` +- `https://arangodb.org:443/folder/file.html` +- etc. + +You can test the allow-/denylisting in _arangosh_: + +``` +arangosh --javascript.endpoints-allowlist "^https://arangodb\.org(:443)?/" +127.0.0.1:8529@_system> require('internal').download('http://arangodb.org/file.zip') +JavaScript exception: ArangoError 11: not allowed to connect to this URL: http://arangodb.org/file.zip +... + +127.0.0.1:8529@_system> require('internal').download('https://arangodb.org/file.zip') +<request permitted by allowlist> +``` + +{{< warning >}} +Startup options may require additional escaping in your command line. +Examples are: +- Dollar symbols and backslashes in most Linux and macOS shells (`\$`, `\\`), + unless the entire string is wrapped in single quotes (`'tcp://arangodb\.org$'` + instead of `tcp://arangodb\\.org\$`) +- Circumflex accents in Windows `cmd` (`^^`) unless the entire string is + wrapped in double quotes (`"^http…"`). +{{< /warning >}} + +### Additional JavaScript security options + +In addition to the allowlisting and denylisting security options, the following +extra options are available for locking down JavaScript access to server functionality: + +- `--javascript.allow-port-testing`: + If set to `true`, this option enables the `testPort` JavaScript function in the + `internal` module. The default value is `false`. + +- `--javascript.allow-external-process-control`: + If set to `true`, this option allows the execution and control of external processes + from JavaScript code via the functions from the `internal` module: + + - `executeExternal` + - `executeExternalAndWait` + - `getExternalSpawned` + - `killExternal` + - `suspendExternal` + - `continueExternal` + - `statusExternal` + +- `--javascript.harden`: + If set to `true`, this setting will deactivate the following JavaScript functions + from the `internal` module, which may leak information about the environment: + + - `getPid()` + - `logLevel()` + + The default value is `false`. + +- `--javascript.tasks`: You can set this option to `false` to turn off + [JavaScript tasks](../../develop/javascript-api/tasks.md). It disallows the + execution of user-defined JavaScript code on the server inside of periodic + and one-off tasks. + +- `--javascript.transactions`: You can set this option to `false` to turn off + [JavaScript Transactions](../../develop/http-api/transactions/javascript-transactions.md). It disallows + the execution of user-defined JavaScript code on the server inside of + JavaScript Transactions. + +- `--javascript.user-defined-functions`: You can set this option to `false` to + turn off [user-defined functions](../../aql/user-defined-functions.md) (UDFs). It disallows + the execution of user-defined JavaScript code on the server inside of + user-defined AQL functions (introduced in: v3.10.4). + +## Security options for managing Foxx applications + +The following options are available for controlling the installation of Foxx applications +in an ArangoDB server: + +- `--foxx.enable` (introduced in: v3.10.5): + If set to `false`, this option disables access to any user-defined Foxx apps. + Accessing the URL of any (existing or potentially existing) Foxx app produces an + HTTP `403 Forbidden` error with this setting. + ArangoDB's built-in web interface and all built-in REST APIs remain accessible, + except the Foxx service management API, which makes it impossible to install and + uninstall Foxx applications. Setting the option to `false` also deactivates the + **SERVICES** section in the web interface. + The default value is `true`, meaning that Foxx apps can be accessed. + +- `--foxx.api`: + If set to `false`, this option disables the Foxx management API, which will make it + impossible to install and uninstall Foxx applications. Setting the option to `false` + will also deactivate the "Services" section in the web interface. + The default value is `true`, meaning that Foxx apps can be installed and uninstalled. + +- `--foxx.store`: + If set to `false`, this option disables the Foxx app store in ArangoDB's web interface, + which will also prevent ArangoDB and its web interface from making calls to the main Foxx + application Github repository at + [github.com/arangodb/foxx-apps](https://github.com/arangodb/foxx-apps). + The default value is `true`. + +- `--foxx.allow-install-from-remote`: + When set to `false`, this option prevents installation of Foxx apps from any + remote source other than GitHub and deactivates the **Remote** tab in the **Services** + section of the web interface. Installing apps from Github and/or zip files is + still possible with this setting, but any other remote sources are blocked. + When set to `true`, installing Foxx apps from other remote sources via URLs + is allowed (introduced in: v3.8.5). + The default value is `false`. diff --git a/site/content/arangodb/oem/operations/troubleshooting/_index.md b/site/content/arangodb/oem/operations/troubleshooting/_index.md new file mode 100644 index 0000000000..7ed9065811 --- /dev/null +++ b/site/content/arangodb/oem/operations/troubleshooting/_index.md @@ -0,0 +1,7 @@ +--- +title: Troubleshooting +menuTitle: Troubleshooting +weight: 235 +description: >- + Information for investigating and fixing issues with ArangoDB instances +--- diff --git a/site/content/arangodb/oem/operations/troubleshooting/arangod.md b/site/content/arangodb/oem/operations/troubleshooting/arangod.md new file mode 100644 index 0000000000..8f11ecba42 --- /dev/null +++ b/site/content/arangodb/oem/operations/troubleshooting/arangod.md @@ -0,0 +1,136 @@ +--- +title: Troubleshooting _arangod_ +menuTitle: arangod +weight: 10 +description: >- + If a server fails on startup or if it is not reachable, you should check the + log, configuration, and connectivity +--- +## Server not starting or not reachable + +If the ArangoDB server does not start or if you cannot connect to it +using *arangosh* or other clients, you can try to find the problem cause by +executing the following steps. If the server starts up without problems +you can skip this section. + +- *Check the server log file*: If the server has written a log file you should + check it because it might contain relevant error context information. + +- *Check the configuration*: The server looks for a configuration file + named *arangod.conf* on startup. The contents of this file will be used + as a base configuration that can optionally be overridden with command-line + configuration parameters. You should check the config file for the most + relevant parameters such as: + - *server.endpoint*: What IP address and port to bind to + - *log parameters*: If and where to log + - *database.directory*: Path the database files are stored in + + If the configuration reveals that something is not configured right the config + file should be adjusted and the server be restarted. + +- *Start the server manually and check its output*: Starting the server might + fail even before logging is activated so the server will not produce log + output. This can happen if the server is configured to write the logs to + a file that the server has no permissions on. In this case the server + cannot log an error to the specified log file but will write a startup + error on stderr instead. + Starting the server manually will also allow you to override specific + configuration options, e.g. to turn on/off file or screen logging etc. + +- *Check the TCP port*: If the server starts up but does not accept any incoming + connections this might be due to firewall configuration between the server + and any client(s). The server by default will listen on TCP port 8529. Please + make sure this port is actually accessible by other clients if you plan to use + ArangoDB in a network setup. + + When using hostnames in the configuration or when connecting, please make + sure the hostname is actually resolvable. Resolving hostnames might invoke + DNS, which can be a source of errors on its own. + + It is generally good advice to not use DNS when specifying the endpoints + and connection addresses. Using IP addresses instead will rule out DNS as + a source of errors. Another alternative is to use a hostname specified + in the local */etc/hosts* file, which will then bypass DNS. + +- *Test if *curl* can connect*: Once the server is started, you can quickly + verify if it responds to requests at all. This check allows you to + determine whether connection errors are client-specific or not. If at + least one client can connect, it is likely that connection problems of + other clients are not due to ArangoDB's configuration but due to client + or in-between network configurations. + + You can test connectivity using a simple command such as: + + ``` + curl --dump - --user "username:password" -X GET http://127.0.0.1:8529/_api/version && echo + ``` + + (Replace `username` and `password` with the actual credentials.) + + This should return a response with an *HTTP 200* status code when the + server is running. If it does it also means the server is generally + accepting connections. Alternative tools to check connectivity are *lynx* + or *ab*. + +## Out of memory crashes + +When there is an out-of-memory situation, the Linux operating system is usually +configured to kill processes that use most RAM. When running a dedicated +database server, this process is like the ArangoDB server, arangod. + +A system process called OOM (out of memory) killer will send the arangod server +a SIGKILL signal then, which the arangod process can neither detect nor ignore. +It will be terminated ungracefully then. + +Usually, the Linux kernel will write information about the killing of processes +into its own system logs. These logs should be checked if you suspect that +ArangoDB was killed because of an out-of-memory situation. + +## Other crashes + +The Linux builds of the arangod executable contain a built-in crash handler. + +The crash handler is supposed to log basic crash information to the ArangoDB +logfile in case the arangod process receives one of the signals SIGSEGV, +SIGBUS, SIGILL, SIGFPE or SIGABRT. SIGKILL signals, which the operating system +can send to a process in case of OOM (out of memory), are not interceptable and +thus cannot be intercepted by the crash handler. + +In case the crash handler receives one of the mentioned interceptable signals, +it will write basic crash information to the logfile and a backtrace of the +call site. The backtrace can be provided to the Arango support for further +inspection. Note that backtaces are only usable if debug symbols for ArangoDB +have been installed as well. + +After logging the crash information, the crash handler will execute the default +action for the signal it has caught. If core dumps are enabled, the default +action for these signals is to generate a core file. If core dumps are not +enabled, the crash handler will simply terminate the program with a non-zero +exit code. + +The crash handler can be disabled at server start by setting the environment +variable `ARANGODB_OVERRIDE_CRASH_HANDLER` to an empty string, `0` or `off`. + +An example log output from the crash handler looks like this: + +``` +2020-05-26T23:26:10Z [16657] FATAL [a7902] {crash} ArangoDB 3.7.1-devel enterprise [linux], thread 22 [Console] caught unexpected signal 11 (SIGSEGV) accessing address 0x0000000000000000: signal handler invoked +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 1 [0x00007f9124e93ece]: _ZN12_GLOBAL__N_112crashHandlerEiP9siginfo_tPv (+0x000000000000002e) +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 2 [0x00007f912687bfb2]: sigprocmask (+0x0000000000000021) +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 3 [0x00007f9123e08024]: _ZN8arangodb3aql10Expression23executeSimpleExpressionEPKNS0_7AstNodeEPNS_11transaction7MethodsERbb (+0x00000000000001c4) +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 4 [0x00007f9123e08314]: _ZN8arangodb3aql10Expression7executeEPNS0_17ExpressionContextERb (+0x0000000000000064) +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 5 [0x00007f9123feaab2]: _ZN8arangodb3aql19CalculationExecutorILNS0_15CalculationTypeE0EE12doEvaluationERNS0_15InputAqlItemRowERNS0_16OutputAqlItemRowE (+0x0000000000000062) +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 6 [0x00007f9123feae85]: _ZN8arangodb3aql19CalculationExecutorILNS0_15CalculationTypeE0EE11produceRowsERNS0_22AqlItemBlockInputRangeERNS0_16OutputAqlItemRowE (+0x00000000000000f5) +... +2020-05-26T23:26:10Z [16657] INFO [308c3] {crash} frame 31 [0x000018820ffc6d91]: *no symbol name available for this frame +2020-05-26T23:26:10Z [16657] INFO [ded81] {crash} available physical memory: 41721995264, rss usage: 294256640, vsz usage: 1217839104, threads: 46 +Segmentation fault (core dumped) +``` + +The first line of the crash output will contain the cause of the crash +(SIGSEGV in this case). The following lines contain information about the +stack frames. The hexadecimal value presented for each frame is the instruction +pointer, and if debug symbols are installed, there will be name information +about the called procedures (in mangled format) plus the offsets into the +procedures. If no debug symbols are installed, symbol names and offsets cannot +be shown for the stack frames. diff --git a/site/content/arangodb/oem/operations/troubleshooting/cluster/_index.md b/site/content/arangodb/oem/operations/troubleshooting/cluster/_index.md new file mode 100644 index 0000000000..335c464e63 --- /dev/null +++ b/site/content/arangodb/oem/operations/troubleshooting/cluster/_index.md @@ -0,0 +1,32 @@ +--- +title: Cluster Troubleshooting +menuTitle: Cluster +weight: 20 +description: >- + Troubleshooting issues of ArangoDB cluster deployments +--- +- Cluster front end is unresponsive + - Check if the _Coordinator(s)_ in question are started up. + - Check if the _Agency_ is up and a _leader_ has been elected. If not + ensure that all or a majority of _Agents_ are up and running. + - Check if all processes have been started up with the same + `JWT_SECRET`. If not ensure that the `JWT_SECRET` used across + the cluster nodes is identical for every process. + - Check if all cluster nodes have been started with SSL either + dis- or enabled. If not decide what mode of operation you would + like to run your cluster in, and consistently stick with for all + _Agents_, _Coordinators_ and _DB-Servers_. + - Check if network communication between the cluster nodes is such + that all processes can directly access their peers. Do not + operate proxies between the cluster nodes. + +- Cluster front end announces errors on any number of nodes + - This is an indication that the _Agency_ is running but either + _Coordinators_ or _DB-Servers_ are disconnected or shut + down. Establish network connection to or start the according + nodes. + - Make sure that the nodes in question share the same `JWT_SECRET` + and SSL operation mode with the functioning nodes. + +Dig deeper into cluster troubleshooting by going through the +[ArangoDB Cluster Administration Course](https://www.arangodb.com/learn/operations/cluster-course/). diff --git a/site/content/arangodb/oem/operations/troubleshooting/cluster/agency-dump.md b/site/content/arangodb/oem/operations/troubleshooting/cluster/agency-dump.md new file mode 100644 index 0000000000..8a3386580b --- /dev/null +++ b/site/content/arangodb/oem/operations/troubleshooting/cluster/agency-dump.md @@ -0,0 +1,40 @@ +--- +title: How to produce an Agency Dump +menuTitle: Agency Dump +weight: 5 +description: '' +--- +One can read out all information of an _Agency_ in the following way: + +``` +curl -k https://<any-coordinator>:<port>/_api/cluster/agency-dump > agency.json +``` + +When authentication is enabled, the user provides either an authentication +header to access every server or uses the root user credentials. The +authentication header is generated using the following `arangodb` call: + +``` +AUTH=$(arangodb auth header --auth.jwt-secret <path-to-cluster-jwt-secret>) +``` + +The generated authentication header is then used in the following way with `curl`, to produce the _Agency_ dump: + +``` +curl -kH"$AUTH" https://<any-coordinator>:<port>/_api/cluster/agency-dump > agency.json +``` + +Or using username and password like below, where one is prompted to +type in the password. It is best practices to not specify the root +password on command line considering the risks associated with finding +passwords in the shell history. The jwt secret method or username +password method if done like above leaves no such traces. + +``` +curl -k --username root https://<any-coordinator>:<port>/_api/cluster/agency-dump +``` + +Should the _Agency_ be down, an _Agency_ dump can still be created +starting from the database directory of (one of) the _Agents_. Contact +ArangoDB Support, in this case, to obtain more detailed guidelines on +how to produce the dump. diff --git a/site/content/arangodb/oem/operations/troubleshooting/emergency-console.md b/site/content/arangodb/oem/operations/troubleshooting/emergency-console.md new file mode 100644 index 0000000000..f193ecf2c4 --- /dev/null +++ b/site/content/arangodb/oem/operations/troubleshooting/emergency-console.md @@ -0,0 +1,47 @@ +--- +title: Emergency Console +menuTitle: Emergency Console +weight: 15 +description: >- + You can start an `arangod` process in an emergency mode with a console +--- +The ArangoDB database server has two modes of operation: As a server, where it +will answer to client requests and as an emergency console, in which you can +access the database directly. The latter - as the name suggests - should +only be used in case of an emergency, for example, a corrupted +collection. Using the emergency console allows you to issue all commands +normally available in actions and transactions. When starting the server in +emergency console mode, the server cannot handle any client requests. + +You should never start more than one server using the same database directory, +independent of the mode of operation. Normally, ArangoDB will prevent +you from doing this by placing a lockfile in the database directory and +not allowing a second ArangoDB instance to use the same database directory +if a lockfile is already present. + +## In Case Of Disaster + +The following command starts an emergency console. + +**Note**: Never start the emergency console for a database which also has a +server attached to it. In general, the ArangoDB shell is what you want. + +``` +> ./arangod --console --log error /tmp/vocbase +ArangoDB shell [V8 version 5.0.71.39, DB version 3.x.x] + +arango> 1 + 2; +3 + +arango> var db = require("@arangodb").db; db.geo.count(); +703 + +``` + +The emergency console provides a JavaScript console directly running in the +arangod server process. This allows to debug and examine collections and +documents as with the normal ArangoDB shell, but without client/server +communication. + +However, it is very likely that you will never need the emergency console +unless you are an ArangoDB developer. diff --git a/site/content/arangodb/oem/operations/troubleshooting/query-debug-packages.md b/site/content/arangodb/oem/operations/troubleshooting/query-debug-packages.md new file mode 100644 index 0000000000..081331c879 --- /dev/null +++ b/site/content/arangodb/oem/operations/troubleshooting/query-debug-packages.md @@ -0,0 +1,75 @@ +--- +title: Query debug packages +menuTitle: Query debug packages +weight: 5 +description: >- + If you have an issue with a specific AQL query, you can create a debug package + to provide all necessary information to others for investigating the issue +--- +Query debug packages, or debug dumps, facilitate the debugging of issues you +might find after executing AQL queries. A debug package is a JSON file that +contains information about the query and the environment to make it possible to +reproduce the issue: + +- General information about the server including the exact version +- The properties of the involved database, collections, Views, and graphs +- The query, its bind variables, and options +- The query execution plan +- Storage engine statistics +- Optionally samples of your data, with the option to + **obfuscate all string values** in a non-reversible way + +{{< security >}} +Before sharing a debug package, open the file locally and check if it contains +anything that you are not allowed or willing to share and obfuscate it. +{{< /security >}} + +## Create a query debug package in the web interface + +1. In **QUERIES** section of the web interface, enter an AQL query into the + editor and provide the bind parameters if necessary. +2. Click **Create Debug Package** below the text area. +3. The download of a compressed debug package starts. +4. Unzip the downloaded file if you want to inspect its content. + +## Create a query debug package with *arangosh* + +Connect to the server with the [ArangoDB shell](../../components/tools/arangodb-shell/_index.md) and call +the `debugDump()` method of the explainer module. You can specify the output +file path, the AQL query, any bind parameters if necessary, as well as options +for the query, including two additional options to include sample documents, +`examples` and `anonymize`: + +```js +--- +name: 01_debugDumpCreate +description: '' +--- +var examples = require("@arangodb/graph-examples/example-graph"); +var g = examples.loadGraph("worldCountry"); +var query = `FOR v, e, p IN 0..10 INBOUND "worldVertices/continent-europe" GRAPH "worldCountry" FILTER v._key != @country RETURN CONCAT_SEPARATOR(" -- ", p.vertices)`; +var bindVars = { country: "country-denmark" }; +var options = { examples: 10, anonymize: true } +var explainer = require("@arangodb/aql/explainer"); +explainer.debugDump("/tmp/debugDumpFilename", query, bindVars, options); +~examples.dropGraph("worldCountry"); +``` + +See [Gathering debug information about a query](../../aql/execution-and-performance/explaining-queries.md#gathering-debug-information-about-a-query) +for details. + +## Inspect a query debug package with *arangosh* + +The debug package JSON is compactly formatted. To get a more readable output, +you can use a tool for pretty-printing like [`jq`](https://stedolan.github.io/jq/), +or use the `inspectDump()` method of the explainer module for formatting. + +```js +--- +name: 02_debugDumpInspect +description: '' +--- +~assert(fs.exists("/tmp/debugDumpFilename")); +var explainer = require("@arangodb/aql/explainer"); +explainer.inspectDump("/tmp/debugDumpFilename"); +``` diff --git a/site/content/arangodb/oem/operations/upgrading/_index.md b/site/content/arangodb/oem/operations/upgrading/_index.md new file mode 100644 index 0000000000..fb00ae586c --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/_index.md @@ -0,0 +1,88 @@ +--- +title: Upgrading +menuTitle: Upgrading +weight: 220 +description: >- + You can create a backup and upgrade ArangoDB in-place, but downgrading + is only possible with the backup or by dumping and restoring all data +--- +{{< info >}} +When upgrading from a 3.11 version, please see +[Resolving known issues with versions up to 3.11.11](../../release-notes/version-3.11/incompatible-changes-in-3-11.md#resolving-known-issues-with-versions-up-to-31111) +and follow the linked upgrade procedures instead of the regular upgrade procedure. +{{< /info >}} + +## Upgrade methods + +There are two main ways to upgrade ArangoDB: + +- **_In-Place_ upgrade**: when the installed ArangoDB package is replaced with a new + one, and the new server executable is started on the existing data directory. + + The database files typically require to be upgraded when you upgrade to a + consecutive release, for example, from 3.9 to 3.10. The database files cannot + be downgraded again. Take a backup before upgrading if you want to be able to + return to the old version of your data and ArangoDB. + +- **_Logical_ upgrade**: when the data is exported from the old ArangoDB version + using [_arangodump_](../../components/tools/arangodump/_index.md) and then restored in + the new ArangoDB version using [_arangorestore_](../../components/tools/arangorestore/_index.md). + + Depending on the size of your database, this strategy can be more time consuming, + but might be necessary under some circumstances. + +## Before the upgrade + +Before upgrading, it is recommended to: + +- Check the [CHANGELOG](../../release-notes/_index.md#changelogs) and the + [list of incompatible changes](../../release-notes/_index.md#incompatible-changes) + for API or other changes in the new version of ArangoDB, and make sure your applications + can deal with them. +- As an extra precaution, and as a requirement if you want to [downgrade](downgrading.md), + you might want to: + - **Take a backup** of the old ArangoDB database using [_arangodump_](../../components/tools/arangodump/_index.md), + as well as + - Copy the entire "old" data directory to a safe place, after stopping the ArangoDB Server + running on it (if you run an Active Failover or Cluster deployment, you will need to take a copy of their + data directories, from all involved machines, after stopping all the running + ArangoDB processes). + - Keep a copy of all ArangoDB package files (executables, configuration files, + bundled scripts, etc.) in case you want to return to the old version of + ArangoDB. + +## Upgrade paths + +- It is always possible to upgrade to patch versions of the same + general availability (GA) release, i.e from x.y.W to x.y.Z, where Z > W. + + Examples: + - Upgrading from 3.11.0 to 3.11.1 or (directly to) 3.11.3 is supported. + - Upgrading from 3.11.1 to 3.11.2 or (directly to) 3.11.3 is supported. + +- It is possible to upgrade between two different consecutive GA releases, but it is + not officially supported to upgrade if the two GA releases are not consecutive + (in this case, you first have to upgrade to all intermediate releases). + + Examples: + - Upgrading from 3.10 to 3.11 is supported. + - Upgrading from 3.11 to 3.12 is supported. + - Upgrading from 3.10 directly to 3.12 is not officially supported! + The officially supported upgrade path in this case is 3.10 to 3.11, and then + 3.11 to 3.12. + + {{< info >}} + Before upgrading between two consecutive GA releases, it is highly recommended + to first upgrade the previous GA release to its latest patch version. + + Examples: + - To upgrade from 3.10 to 3.11, first upgrade your 3.10 deployment to + the latest 3.10 version, for example, from 3.10.2 to 3.10.14 and then to 3.11.x. + - To upgrade from 3.11 to 3.12, first upgrade your 3.11 deployment to + the latest 3.11 version, for example, from 3.11.5 to 3.11.13 and then to 3.12.x. + {{< /info >}} + +### Additional notes regarding rolling upgrades + +In addition to the paragraph above, rolling upgrades via the tool _Starter_ are supported, +as documented in [Upgrading Starter Deployments](starter-deployments.md). diff --git a/site/content/arangodb/oem/operations/upgrading/community-to-enterprise-upgrade.md b/site/content/arangodb/oem/operations/upgrading/community-to-enterprise-upgrade.md new file mode 100644 index 0000000000..a047f597d8 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/community-to-enterprise-upgrade.md @@ -0,0 +1,61 @@ +--- +title: Community Edition to Enterprise Edition Upgrade Procedure +menuTitle: Community to Enterprise Edition +weight: 5 +description: '' +--- +{{< warning >}} +While migrating from the Community to the Enterprise Edition is supported, +installing directly the Enterprise package over the Community package is **not** +supported. Please see below for the correct migration procedure. +{{< /warning >}} + +{{< danger >}} +Migrating from Enterprise to Community Edition is, in general, **not** supported. This +is because the Community Edition does not include some features, such as +[SmartGraphs](../../graphs/smartgraphs/_index.md) that, if used while the database +was running under the Enterprise Edition, do not make easily possible the +conversion of some database structures. +{{< /danger >}} + +Upgrading from the Community to the Enterprise Edition requires uninstallation of +the Community package (can be done in a way that the database data are preserved) +and installation of the Enterprise package. The upgrade can be done in a +[_logical_](#procedure-for-a-logical-upgrade) or +[_in-place_](#procedure-for-an-in-place-upgrade) way. Please refer to the +[Upgrade methods](_index.md#upgrade-methods) section for a general +description of the two methods. Refer to the sections below for a detailed +procedure. + +The Enterprise Edition of ArangoDB requires a license to run the Enterprise Edition and activate its features. +For more information about setting a license key, see [License Management](../administration/license-management.md). + +## Procedure for a *Logical* Upgrade + +1. Use the tool [_arangodump_](../../components/tools/arangodump/_index.md) to **take a backup** + of your data stored by your Community Edition installation +2. Uninstall the ArangoDB Community Edition package +3. Install the ArangoDB Enterprise Edition package + (and start your _Single Instance_, _Active Failover_ or _Cluster_) +4. Restore the backup using the tool [_arangorestore_](../../components/tools/arangorestore/_index.md). + +## Procedure for an *In-Place* Upgrade + +1. Shutdown ArangoDB and make a copy of your data directory (e.g., in Linux, by + using the _cp_ command). If you are using a setup that involves several _arangod_ processes + (e.g. _Active Failover_ or _Cluster_) please make sure all _arangod_ processes + are stopped and all the data directories in use are copied in a safe location +2. Uninstall the ArangoDB Community Edition package (make sure this is done in a way that + your database is kept on your disk, e.g. on _Debian_ systems do **not** use the + _purge_ option of _dpkg_ or, on Windows, do **not** check the "_Delete databases with + uninstallation?_" option) +3. Install the ArangoDB Enterprise Edition package +4. If you are moving from version A to version B, where B > A, start _arangod_ on + your data directory with the option `--database.auto-upgrade` (in addition to + any other options you are currently using). The server will stop after a while + (check the log file of _arangod_ as it should contain relevant information about + the upgrade). If you are using a setup that involves several _arangod_ processes + (e.g. _Active Failover_ or _Cluster_) this step has to be repeated for all _arangod_ + processes +5. Start ArangoDB Enterprise Edition + (in the same way you were starting ArangoDB Community Edition) diff --git a/site/content/arangodb/oem/operations/upgrading/downgrading.md b/site/content/arangodb/oem/operations/upgrading/downgrading.md new file mode 100644 index 0000000000..e43cb81f51 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/downgrading.md @@ -0,0 +1,85 @@ +--- +title: Downgrading +menuTitle: Downgrading +weight: 30 +description: >- + Downgrading database files and to an older version of ArangoDB requires a + logical backup +--- +A direct, in-place downgrade of ArangoDB is **not** supported. If you have upgraded +your ArangoDB package, and then also upgraded your current data directory, it is +not supported to downgrade the package and start an older ArangoDB version on a +data directory that was upgraded already. + +If you are using a standalone ArangoDB server, data directory could have been upgraded +automatically during package upgrade. If you are using the _Starter_ to start your +ArangoDB, and you have not triggered yet the rolling upgrade, or upgraded it +manually, your data directory is (probably) still on the old version, so you should +be able to downgrade the binaries in this case. + +## Supported downgrade procedures + +In order to downgrade, the following options are available: + +- Restore a backup you took using the tool [_arangodump_](../../components/tools/arangodump/_index.md) + before the upgrade. +- Start the old package on the data directory backup you took before the upgrade. + +### Restore an *arangodump* backup + +This procedure assumes that you have taken an _arangodump_ backup using the old +ArangoDB version, before you upgraded it. + +1. Stop ArangoDB (if you are using an Active Failover, or a Cluster, stop all the needed + processes on all the machines). +2. As extra precaution, take a backup of your current data directory (at filesystem level). + If you are using an Active Failover or a Cluster, you will need to backup all the data + directories of all the processes involved, from all machines. Make sure you move your + data directory backup to a safe place. +3. Uninstall the ArangoDB package (use appropriate _purge_ option so your current data + directory is deleted, if you are using a stand alone instance). +4. Install the old version of ArangoDB. +5. Start ArangoDB. If you are using the _Starter_, please make sure you use a new data + directory for the _Starter_. +6. Restore the _arangodump_ backup taken before upgrading. + +### Start the old package on the data directory backup + +This procedure assumes that you have created a copy of your data directory (after having +stopped the ArangoDB process running on it) before the upgrade. If you are running an +Active Failover, or a Cluster, this procedure assumes that you have stopped them before +the upgrade, and that you have taken a copy of their data directories, from all involved +machines. + +This procedure cannot be used if you have done a rolling upgrade of your Active Failover +or Cluster setups because in this case you do not have a copy of the data directories. + +1. Stop ArangoDB (if you are using an Active Failover, or a Cluster, stop all the needed + processes on all the machines). +2. As extra precaution, take a backup of your data directory (at filesystem level). If + you are using an Active Failover or a Cluster, you will need to backup all the data + directories of all the processes involved, from all machines. Make sure you move your + backup to a safe place. +3. Uninstall the ArangoDB package (use appropriate _purge_ option so your current data + directory is deleted, if you are using a stand alone instance). +4. Install the old version of ArangoDB. +5. Start ArangoDB on the data directory that you have backup-ed up (at filesystem level) + before the upgrade. As an extra precaution, please first take a new copy of this + directory and move it to a safe place. + +### Other possibilities + +If you have upgraded by mistake, and: + +- your data directory has been upgraded already +- it is not possible for you to follow any of the + [Supported Downgrade Procedures](#supported-downgrade-procedures) because: + - you do not have a _dump_ backup taken using the old ArangoDB version + - you do not have a copy of your data directory taken after stopping the old ArangoDB + process and before the upgrade + +One possible option to downgrade could be to export the data from the new ArangoDB version +using the tool _arangoexport_ and reimport it using the tool _arangoimport_ in the old +version (after having installed and started it on a clean data directory). This method will +require some manual work to recreate the structure of your collections and your indexes - but +it might still help you solving an otherwise challenging situation. diff --git a/site/content/arangodb/oem/operations/upgrading/manual-deployments/_index.md b/site/content/arangodb/oem/operations/upgrading/manual-deployments/_index.md new file mode 100644 index 0000000000..7c6f7ad9b5 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/manual-deployments/_index.md @@ -0,0 +1,10 @@ +--- +title: Upgrading Manual Deployments +menuTitle: Manual Deployments +weight: 20 +description: >- + You can upgrade ArangoDB instances without the help of any deployment tools + but be careful when following the steps to not risk downtime or data loss +aliases: + - upgrading-manual-deployments +--- diff --git a/site/content/arangodb/oem/operations/upgrading/manual-deployments/active-failover.md b/site/content/arangodb/oem/operations/upgrading/manual-deployments/active-failover.md new file mode 100644 index 0000000000..1fad2fda7f --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/manual-deployments/active-failover.md @@ -0,0 +1,215 @@ +--- +title: Manually Upgrading an _Active Failover_ Deployment +menuTitle: Active Failover +weight: 5 +description: >- + The server binaries need to be upgraded, requiring a restart of the `arangod` + processes and optionally using the supervision maintenance mode +aliases: + - ../upgrading-manual-deployments/upgrading-an-active-failover-deployment +--- +To manually upgrade an [_Active Failover_](../../../deploy/active-failover/_index.md) +setup, the different nodes can be upgraded one at a time without incurring a +prolonged downtime of the entire system. The downtimes of the individual nodes +should also stay fairly low. + +The manual upgrade procedure described in this section can be used to upgrade +to a new hotfix version, or to perform an upgrade to a new minor version of ArangoDB. +Please refer to the [Upgrade paths](../_index.md#upgrade-paths) section +for detailed information. + +{{< warning >}} +The Active Failover deployment mode is deprecated and will no longer be +supported in the next minor version of ArangoDB, from v3.12 onward. +{{< /warning >}} + +## Preparations + +The ArangoDB installation packages (e.g. for Debian or Ubuntu) set up a +convenient standalone instance of `arangod`. During installation, this instance's +database will be upgraded (see [`--database.auto-upgrade`](../../../components/arangodb-server/options.md#--databaseauto-upgrade)) +and the service will be (re)started. + +You have to make sure that your _Active Failover_ deployment is independent of this +standalone instance. Specifically, make sure that the database directory as +well as the socket used by the standalone instance provided by the package are +separate from the ones in your _Active Failover_ configuration. Also, check that you haven't +modified the init script or systemd unit file for the standalone instance in a way +that it would start or stop your _Active Failover_ instance instead. + +{{< warning >}} +It is highly recommended to take a backup of your data before upgrading ArangoDB +using [_arangodump_](../../../components/tools/arangodump/_index.md). +{{< /warning >}} + +### Install the new ArangoDB version binary + +The first step is to install the new ArangoDB package. + +**Note:** you do not have to stop the _Active Failover_ (_arangod_) processes before upgrading it. + +For example, if you want to upgrade to `3.7.13` on Debian or Ubuntu, either call + +``` +$ apt install arangodb=3.7.13-1 +``` + +(`apt-get` on older versions) if you have added the ArangoDB repository. Or +install a specific package using + +``` +$ dpkg -i arangodb3-3.7.13-1_amd64.deb +``` + +after you have downloaded the corresponding file from +[download.arangodb.com](https://download.arangodb.com/). + +#### Stop the Standalone Instance + +As the package will automatically start the standalone instance, you might want to +stop that instance now, as otherwise it can create some confusion later. As you are +starting the _Active Failover_ processes manually +you will not need the automatically installed and started standalone instance, +and you should hence stop it via: + +``` +$ service arangodb3 stop +``` + +Also, you might want to remove the standalone instance from the default +_runlevels_ to prevent it from starting on the next reboots of your machine. How this +is done depends on your distribution and _init_ system. For example, on older Debian +and Ubuntu systems using a SystemV-compatible _init_, you can use: + +``` +$ update-rc.d -f arangodb3 remove +``` + +## Set supervision into maintenance mode + +You have two main choices when performing an upgrade of the _Active Failover_ setup: + +- Upgrade while incurring a leader-to-follower switch (with reduced downtime) +- An upgrade with no leader-to-follower switch. + +Turning the maintenance mode _on_ will enable the latter case. You might have a short +downtime during the _leader_ upgrade, but there will be no potential loss of _acknowledged_ operations. + +To enable the maintenance mode means to essentially disable the Agency supervision for a limited amount +of time during the upgrade procedure. The following API calls will +activate and deactivate the maintenance mode of the supervision job. You might use _curl_ to send the API calls. +The following examples assume there is an _Active Failover_ node running on `localhost` on port 7002. + +### Activate Maintenance mode + +`curl -u username:password <single-server>/_admin/cluster/maintenance -XPUT -d'"on"'` + +For example: +``` +curl -u "root:" http://localhost:7002/_admin/cluster/maintenance -XPUT -d'"on"' + +{"error":false,"warning":"Cluster supervision deactivated. +It will be reactivated automatically in 60 minutes unless this call is repeated until then."} +``` +**Note:** In case the manual upgrade takes longer than 60 minutes, the API call has to be resent. + +### Deactivate Maintenance mode + +The _cluster_ supervision resumes automatically 60 minutes after disabling it. +It can be manually reactivated earlier at any point using the following API call: + +`curl -u username:password <single-server>/_admin/cluster/maintenance -XPUT -d'"off"'` + +For example: +``` +curl -u "root:" http://localhost:7002/_admin/cluster/maintenance -XPUT -d'"off"' + +{"error":false,"warning":"Cluster supervision reactivated."} +``` + +## Upgrade the *Active Failover* processes + +Now all the _Active Failover_ (_Agents_, _Single-Server_) processes (_arangod_) have to be +upgraded on each node. + +**Note:** Please read the section regarding the maintenance mode above. + +In order to stop an _arangod_ process we will need to use a command like `kill -15`: + +``` +kill -15 <pid-of-arangod-process> +``` + +The _pid_ associated to your _Active Failover setup_ can be checked using a command like _ps_: + +``` +ps -C arangod -fww +``` + +The output of the command above does not only show the process ids of all _arangod_ +processes but also the used commands, which is useful for the following +restarts of all _arangod_ processes. + +The output below is from a test machine where three _Agents_ and two _Single-Servers_ +were running locally. In a more production-like scenario, you will find only one instance of each +type running per machine: + +``` +ps -C arangod -fww +UID PID PPID C STIME TTY TIME CMD +max 29075 8072 0 13:50 pts/2 00:00:42 arangod --server.endpoint tcp://0.0.0.0:5001 --agency.my-address=tcp://127.0.0.1:5001 --server.authentication false --agency.activate true --agency.size 3 --agency.endpoint tcp://127.0.0.1:5001 --agency.supervision true --log.file a1 --javascript.app-path /tmp --database.directory agent1 +max 29208 8072 2 13:51 pts/2 00:02:08 arangod --server.endpoint tcp://0.0.0.0:5002 --agency.my-address=tcp://127.0.0.1:5002 --server.authentication false --agency.activate true --agency.size 3 --agency.endpoint tcp://127.0.0.1:5001 --agency.supervision true --log.file a2 --javascript.app-path /tmp --database.directory agent2 +max 29329 16224 0 13:51 pts/3 00:00:42 arangod --server.endpoint tcp://0.0.0.0:5003 --agency.my-address=tcp://127.0.0.1:5003 --server.authentication false --agency.activate true --agency.size 3 --agency.endpoint tcp://127.0.0.1:5001 --agency.supervision true --log.file a3 --javascript.app-path /tmp --database.directory agent3 +max 29824 16224 1 13:55 pts/3 00:01:53 arangod --server.authentication=false --server.endpoint tcp://0.0.0.0:7001 --cluster.my-address tcp://127.0.0.1:7001 --cluster.my-role SINGLE --cluster.agency-endpoint tcp://127.0.0.1:5001 --cluster.agency-endpoint tcp://127.0.0.1:5002 --cluster.agency-endpoint tcp://127.0.0.1:5003 --log.file c1 --javascript.app-path /tmp --database.directory single1 +max 29938 16224 2 13:56 pts/3 00:02:13 arangod --server.authentication=false --server.endpoint tcp://0.0.0.0:7002 --cluster.my-address tcp://127.0.0.1:7002 --cluster.my-role SINGLE --cluster.agency-endpoint tcp://127.0.0.1:5001 --cluster.agency-endpoint tcp://127.0.0.1:5002 --cluster.agency-endpoint tcp://127.0.0.1:5003 --log.file c2 --javascript.app-path /tmp --database.directory single2 +``` + +**Note:** The start commands of _Agent_ and _Single Server_ are required for restarting the processes later. + +The recommended procedure for upgrading an _Active Failover_ setup is to stop, upgrade +and restart the _arangod_ instances one by one on all participating servers, +starting first with all _Agent_ instances, and then following with the _Active Failover_ +instances themselves. When upgrading the _Active Failover_ instances, the followers should +be upgraded first. + +To figure out the node containing the followers you can consult the cluster endpoints API: +``` +curl http://<single-server>:7002/_api/cluster/endpoints +``` +This will yield a list of endpoints, the _first_ of which is always the leader node. + +### Stopping, upgrading and restarting an instance + +To stop an instance, the currently running process has to be identified using the `ps` +command above. + +Let's assume we are about to upgrade an _Agent_ instance, so we have to look in the `ps` +output for an Agent instance first, and note its process id (pid) and start command. + +The process can then be stopped using the following command: + +``` +kill -15 <pid-of-agent> +``` + +The instance then has to be upgraded using the same command that was used before (in the `ps` output), +but with the additional option: + +``` +--database.auto-upgrade=true +``` + +After the upgrade procedure has finishing successfully, the instance will remain stopped. +So it has to be restarted using the command from the `ps` output before +(this time without the `--database.auto-upgrade` option). + +Once an _Agent_ was upgraded and restarted successfully, repeat the procedure for the +other _Agent_ instances in the setup and then repeat the procedure for the _Active Failover_ +instances, there starting with the followers. + +### Final words + +The _Agency_ supervision then needs to be reactivated by issuing the following API call +to the leader: + +`curl -u username:password <single-server>/_admin/cluster/maintenance -XPUT -d'"off"'` diff --git a/site/content/arangodb/oem/operations/upgrading/manual-deployments/cluster.md b/site/content/arangodb/oem/operations/upgrading/manual-deployments/cluster.md new file mode 100644 index 0000000000..0dd713df28 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/manual-deployments/cluster.md @@ -0,0 +1,240 @@ +--- +title: Manually Upgrading a _Cluster_ Deployment +menuTitle: Cluster +weight: 10 +description: >- + The server binaries need to be upgraded, requiring a restart of the `arangod` + processes and using the supervision maintenance mode +aliases: + - ../upgrading-manual-deployments/upgrading-a-cluster +--- +To manually upgrade a [_cluster_](../../../deploy/cluster/_index.md) +setup, the different nodes of a _cluster_ can be upgraded one at a time without +incurring downtime of the _cluster_ and very short downtimes of the single nodes. + +The manual upgrade procedure described in this section can be used to upgrade +to a new hotfix, or to perform an upgrade to a new minor version of ArangoDB. +Please refer to the [Upgrade paths](../_index.md#upgrade-paths) section +for detailed information. + +## Preparations + +The ArangoDB installation packages (e.g. for Debian or Ubuntu) set up a +convenient standalone instance of `arangod`. During installation, this instance's +database will be upgraded (see [`--database.auto-upgrade`](../../../components/arangodb-server/options.md#--databaseauto-upgrade)) +and the service will be (re)started. + +You have to make sure that your _cluster_ deployment is independent of this +standalone instance. Specifically, make sure that the database directory as +well as the socket used by the standalone instance provided by the package are +separate from the ones in your _cluster_ configuration. Also, that you haven't +modified the init script or systemd unit file for the standalone instance in way +that it would start or stop your _cluster_ instance instead. + +You can read about the details on how to deploy your _cluster_ independently of the +standalone instance in the [_cluster_ deployment preliminary](../../../deploy/cluster/deployment/_index.md). + +In the following, we assume that you don't use the standalone instance from the +package but only a manually started _cluster_ instance, and we will move the +standalone instance out of the way if necessary so you have to make as little +changes as possible to the running _cluster_. + +{{< warning >}} +It is highly recommended to take a backup of your data before upgrading ArangoDB +using [_arangodump_](../../../components/tools/arangodump/_index.md). +{{< /warning >}} + +### Install the new ArangoDB version binary + +The first step is to install the new ArangoDB package. + +**Note:** you do not have to stop the _cluster_ (_arangod_) processes before upgrading it. + +For example, if you want to upgrade to `3.7.13` on Debian or Ubuntu, either call + +``` +$ apt install arangodb=3.7.13 +``` + +(`apt-get` on older versions) if you have added the ArangoDB repository. Or +install a specific package using + +``` +$ dpkg -i arangodb3-3.7.13-1_amd64.deb +``` + +after you have downloaded the corresponding file from +[download.arangodb.com](https://download.arangodb.com/). + +#### Stop the Standalone Instance + +As the package will automatically start the standalone instance, you might want to +stop it now, as otherwise this standalone instance that is started on your machine +can create some confusion later. As you are starting the _cluster_ processes manually +you do not need this standalone instance, and you can hence stop it: + +``` +$ service arangodb3 stop +``` + +Also, you might want to remove the standalone instance from the default +_runlevels_ to prevent it to start on the next reboot of your machine. How this +is done depends on your distribution and _init_ system. For example, on older Debian +and Ubuntu systems using a SystemV-compatible _init_, you can use: + +``` +$ update-rc.d -f arangodb3 remove +``` + +## Set supervision in maintenance mode + +It is required to disable _cluster_ supervision in order to upgrade your _cluster_. The +following API calls will activate and de-activate the Maintenance mode of the Supervision job: + +You might use _curl_ to send the API call. + +### Activate Maintenance mode + +`curl -u username:password <coordinator>/_admin/cluster/maintenance -XPUT -d'"on"'` + +For Example: +``` +curl http://localhost:7002/_admin/cluster/maintenance -XPUT -d'"on"' + +{"error":false,"warning":"Cluster supervision deactivated. +It will be reactivated automatically in 60 minutes unless this call is repeated until then."} +``` +**Note:** In case the manual upgrade takes longer than 60 minutes, the API call has to be resend. + +### Deactivate Maintenance mode + +The _cluster_ supervision reactivates 60 minutes after disabling it. +It can be manually reactivated by the following API call: + +`curl -u username:password <coordinator>/_admin/cluster/maintenance -XPUT -d'"off"'` + +For example: +``` +curl http://localhost:7002/_admin/cluster/maintenance -XPUT -d'"off"' + +{"error":false,"warning":"Cluster supervision reactivated."} +``` + +## Upgrade the *cluster* processes + +Now all the _cluster_ (_Agents_, _DB-Servers_ and _Coordinators_) processes (_arangod_) have to be +upgraded on each node. + +**Note:** The maintenance mode has to be activated. + +In order to stop the _arangod_ processes we will need to use a command like `kill -15`: + +``` +kill -15 <pid-of-arangod-process> +``` + +The _pid_ associated to your _cluster_ can be checked using a command like _ps_: + +``` +ps -C arangod -fww +``` + +The output of the command above does not only show the PID's of all _arangod_ +processes but also the used commands, which can be useful for the following +restart of all _arangod_ processes. + +The output below is from a test machine where three _Agents_, two _DB-Servers_ +and two _Coordinators_ are running locally. In a more production-like scenario, +you will find only one instance of each one running: + +``` +ps -C arangod -fww +UID PID PPID C STIME TTY TIME CMD +max 29075 8072 0 13:50 pts/2 00:00:42 arangod --server.endpoint tcp://0.0.0.0:5001 --agency.my-address=tcp://127.0.0.1:5001 --server.authentication false --agency.activate true --agency.size 3 --agency.endpoint tcp://127.0.0.1:5001 --agency.supervision true --log.file a1 --javascript.app-path /tmp --database.directory agent1 +max 29208 8072 2 13:51 pts/2 00:02:08 arangod --server.endpoint tcp://0.0.0.0:5002 --agency.my-address=tcp://127.0.0.1:5002 --server.authentication false --agency.activate true --agency.size 3 --agency.endpoint tcp://127.0.0.1:5001 --agency.supervision true --log.file a2 --javascript.app-path /tmp --database.directory agent2 +max 29329 16224 0 13:51 pts/3 00:00:42 arangod --server.endpoint tcp://0.0.0.0:5003 --agency.my-address=tcp://127.0.0.1:5003 --server.authentication false --agency.activate true --agency.size 3 --agency.endpoint tcp://127.0.0.1:5001 --agency.supervision true --log.file a3 --javascript.app-path /tmp --database.directory agent3 +max 29461 16224 1 13:53 pts/3 00:01:11 arangod --server.authentication=false --server.endpoint tcp://0.0.0.0:6001 --cluster.my-address tcp://127.0.0.1:6001 --cluster.my-role PRIMARY --cluster.agency-endpoint tcp://127.0.0.1:5001 --cluster.agency-endpoint tcp://127.0.0.1:5002 --cluster.agency-endpoint tcp://127.0.0.1:5003 --log.file db1 --javascript.app-path /tmp --database.directory dbserver1 +max 29596 8072 0 13:54 pts/2 00:00:56 arangod --server.authentication=false --server.endpoint tcp://0.0.0.0:6002 --cluster.my-address tcp://127.0.0.1:6002 --cluster.my-role PRIMARY --cluster.agency-endpoint tcp://127.0.0.1:5001 --cluster.agency-endpoint tcp://127.0.0.1:5002 --cluster.agency-endpoint tcp://127.0.0.1:5003 --log.file db2 --javascript.app-path /tmp --database.directory dbserver2 +max 29824 16224 1 13:55 pts/3 00:01:53 arangod --server.authentication=false --server.endpoint tcp://0.0.0.0:7001 --cluster.my-address tcp://127.0.0.1:7001 --cluster.my-role COORDINATOR --cluster.agency-endpoint tcp://127.0.0.1:5001 --cluster.agency-endpoint tcp://127.0.0.1:5002 --cluster.agency-endpoint tcp://127.0.0.1:5003 --log.file c1 --javascript.app-path /tmp --database.directory coordinator1 +max 29938 16224 2 13:56 pts/3 00:02:13 arangod --server.authentication=false --server.endpoint tcp://0.0.0.0:7002 --cluster.my-address tcp://127.0.0.1:7002 --cluster.my-role COORDINATOR --cluster.agency-endpoint tcp://127.0.0.1:5001 --cluster.agency-endpoint tcp://127.0.0.1:5002 --cluster.agency-endpoint tcp://127.0.0.1:5003 --log.file c2 --javascript.app-path /tmp --database.directory coordinator2 + +``` + +### Upgrade a *cluster* node + +The following procedure is upgrading _Agent_, _DB-Server_ and _Coordinator_ on one node. + +**Note:** The starting commands of _Agent_, _DB-Server_ and _Coordinator_ have to be reused. + +#### Stop the *Agent* + +``` +kill -15 <pid-of-agent> +``` + +#### Upgrade the *Agent* + +The _arangod_ process of the _Agent_ has to be upgraded using the same command that has +been used before with the additional option: + +``` +--database.auto-upgrade=true +``` + +The _Agent_ will stop automatically after the upgrade. + +#### Restart the *Agent* + +The _arangod_ process of the _Agent_ has to be restarted using the same command that has +been used before (without the additional option). + +#### Stop the *DB-Server* + +``` +kill -15 <pid-of-dbserver> +``` + +#### Upgrade the *DB-Server* + +The _arangod_ process of the _DB-Server_ has to be upgraded using the same command that has +been used before with the additional option: + +``` +--database.auto-upgrade=true +``` + +The _DB-Server_ will stop automatically after the upgrade. + +#### Restart the *DB-Server* + +The _arangod_ process of the _DB-Server_ has to be restarted using the same command that has +been used before (without the additional option). + +#### Stop the *Coordinator* + +``` +kill -15 <pid-of-coordinator> +``` + +#### Upgrade the *Coordinator* + +The _arangod_ process of the _Coordinator_ has to be upgraded using the same command that has +been used before with the additional option: + +``` +--database.auto-upgrade=true +``` + +The _Coordinator_ will stop automatically after the upgrade. + +#### Restart the *Coordinator* + +The _arangod_ process of the _Coordinator_ has to be restarted using the same command that has +been used before (without the additional option). + +After repeating this process on every node all _Agents_, _DB-Servers_ and _Coordinators_ are upgraded and the manual upgrade +has successfully finished. + +The _cluster_ supervision is reactivated by the API call: + +`curl -u username:password <coordinator>/_admin/cluster/maintenance -XPUT -d'"off"'` diff --git a/site/content/arangodb/oem/operations/upgrading/os-specific-information/_index.md b/site/content/arangodb/oem/operations/upgrading/os-specific-information/_index.md new file mode 100644 index 0000000000..e9f092741f --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/os-specific-information/_index.md @@ -0,0 +1,6 @@ +--- +title: OS-specific Information +menuTitle: OS-specific Information +weight: 10 +description: '' +--- diff --git a/site/content/arangodb/oem/operations/upgrading/os-specific-information/linux.md b/site/content/arangodb/oem/operations/upgrading/os-specific-information/linux.md new file mode 100644 index 0000000000..a7388c1d80 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/os-specific-information/linux.md @@ -0,0 +1,72 @@ +--- +title: Upgrading on Linux +menuTitle: Linux +weight: 5 +description: >- + How to upgrade a single server installation installed using package managers +aliases: + - upgrading-on-linux +--- +By installing the new ArangoDB package the standalone instance is automatically +upgraded. In addition to the ArangoDB daemon (_arangod_), also the ArangoDB +_Starter_ binary is updated. As a result, the procedure described below +is a first step to upgrade more complex deployments such as a +[Cluster](../../../deploy/cluster/_index.md) or an +[Active Failover](../../../deploy/active-failover/_index.md) setup. + +{{< warning >}} +It is highly recommended to take a backup of your data before upgrading ArangoDB +using [_arangodump_](../../../components/tools/arangodump/_index.md). +{{< /warning >}} + +## Upgrading via APT (Ubuntu) + +First add the repository key to _apt_: + +``` +curl -OL https://download.arangodb.com/arangodb33/xUbuntu_17.04/Release.key +sudo apt-key add - < Release.key +``` + +Use **apt-get** to install arangodb: + +``` +echo 'deb https://download.arangodb.com/arangodb33/xUbuntu_17.04/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list +sudo apt-get install apt-transport-https +sudo apt-get update +sudo apt-get install arangodb3=3.3.10 +``` + +**Note**: The latest available version can be found in the [download section](https://www.arangodb.com/download-major/ubuntu/). + +## Upgrading via DPKG (Ubuntu) + +Download the corresponding file from the [download section](https://download.arangodb.com/). + +Install a specific package using **dpkg**: + +``` +$ dpkg -i arangodb3-3.3.10-1_amd64.deb +``` + +## Upgrading via YUM (CentOS) + +Use **yum** to install ArangoDB: + +``` +cd /etc/yum.repos.d/ +curl -OL https://download.arangodb.com/arangodb33/CentOS_7/arangodb.repo +yum -y install arangodb3-3.3.10 +``` + +**Note**: The latest available version can be found in the [download section](https://www.arangodb.com/download-major/centos/). + +## Upgrading via RPM (CentOS) + +Download the corresponding file from the [download section](https://download.arangodb.com/). + +Install a specific package using **rpm**: + +``` +$ rpm -i arangodb3-3.3.10-1.x86_64.rpm +``` diff --git a/site/content/arangodb/oem/operations/upgrading/os-specific-information/macos.md b/site/content/arangodb/oem/operations/upgrading/os-specific-information/macos.md new file mode 100644 index 0000000000..9e5ec267db --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/os-specific-information/macos.md @@ -0,0 +1,35 @@ +--- +title: Upgrading on macOS +menuTitle: macOS +weight: 10 +description: >- + How to upgrade an ArangoDB single server installation installed via a DMG package +aliases: + - upgrading-on-macos +--- +If you installed ArangoDB on macOS using a _DMG_ package for a single server +installation, follow the instructions below to upgrade the deployment. + +{{< warning >}} +It is highly recommended to take a backup of your data before upgrading ArangoDB +using [_arangodump_](../../../components/tools/arangodump/_index.md). +{{< /warning >}} + +## Upgrading via Package + +[Download](https://www.arangodb.com/download/) the latest +ArangoDB macOS package and install it as usual by mounting the `.dmg` file. +Drag and drop the `ArangoDB3-CLI` (Community Edition) or the `ArangoDB3e-CLI` +(Enterprise Edition) file onto the shown `Applications` folder. +You are asked if you want to replace the old file with the newer one. + +![MacOSUpgrade](../../../../../images/MacOSUpgrade.png) + +Select `Replace` to install the new ArangoDB version. + +## Upgrading more complex environments + +The procedure described above is a first step to upgrade more complex +deployments such as +[Cluster](../../../deploy/cluster/_index.md) +and [Active Failover](../../../deploy/active-failover/_index.md). diff --git a/site/content/arangodb/oem/operations/upgrading/os-specific-information/windows.md b/site/content/arangodb/oem/operations/upgrading/os-specific-information/windows.md new file mode 100644 index 0000000000..dcb9b5d831 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/os-specific-information/windows.md @@ -0,0 +1,124 @@ +--- +title: Upgrading on Windows +menuTitle: Windows +weight: 15 +description: >- + How to upgrade a single server installation using an installer or zip archive +aliases: + - upgrading-on-windows +--- +As there are different ways to install ArangoDB on Windows, the upgrade +method depends on the installation method that was used. + +In general, it will be needed to: + +- Install (or unpack) the new ArangoDB binaries on the system +- Upgrade the current database (or perform a restore) +- Optional (but suggested) to keep the system clean (unless there are specific + reasons to not do so): remove the old binaries from the system + +Some of the above steps may be done automatically, depending on your +specific situation. + +{{< warning >}} +It is highly recommended to take a backup of your data before upgrading ArangoDB +using [_arangodump_](../../../components/tools/arangodump/_index.md). +{{< /warning >}} + +## Upgrading via the Installer + +If you have installed via the _Installer_, to upgrade: + +- Download the new _Installer_ and run it. +- The _Installer_ will ask if you want to update your current database: select + the option "_Automatically update existing ArangoDB database_" so that the database + files will be upgraded. + +![Update Option](../../../../../images/installer_upgrade.png) + +{{< info >}} +Upgrading via the Installer, when the old data is kept, will keep your +password and choice of storage engine as it is. +{{< /info >}} + +- After installing the new package, you will have both packages installed. +- You can uninstall the old one manually (make a copy of your old configuration +file first). + +![Uninstall old version](../../../../../images/both_installations.png) + +{{< danger >}} +When uninstalling the old package, please make sure the option +"_Delete databases with uninstallation_" is **not** checked. +{{< /danger >}} + +![Delete Option](../../../../../images/installer_delete.png) + +{{< danger >}} +When upgrading, the Windows Installer does not use the old configuration file +for the installed _Single Instance_ but a new (default) one ([Issue #3773](https://github.com/arangodb/arangodb/issues/3773)). +To use the old configuration, it is currently needed to: +- Stop the server +- Replace the new with the old configuration file +- Restart the server +{{< /danger >}} + +## Manual upgrade of a 'ZIP archive' installation + +There are two ways to upgrade a _Single Instance_ that has been started +from a _ZIP_ package: + +- In-Place upgrade +- Logical upgrade + +### In-Place upgrade + +{{< info >}} This method works easier if: +- You are using a data directory which is located outside of the directory + created when extracting the _ZIP_ archive (data directory can be set via + the server option *--database.directory*) +- You are using a configuration file which is located outside of the directory + created when extracting the _ZIP_ archive (a configuration file can be passed via + the server option *--configuration*) +{{< /info >}} + +Assuming that: +- Your data directory is _directory1_ (e.g. "D:\arango\data") +- Your configuration file is _file_ (e.g. "D:\arango\conf\arangod.conf") +- Your old binaries are on _directory2_ (e.g. "C:\tools\arangodb-3.4.0") + +to perform the upgrade of a _Single Instance_: + +1. Download and extract the new _ZIP_ package into a new directory (e.g + _directory3_ "C:\tools\arangodb-3.4.1") +2. Stop your old server +3. Start again the server (this time using the binary located in _directory3_) + passing: + - _directory1_ as *--database.directory*, + - _file_ as *--configuration* + - the option *--database.auto-upgrade* (so that the old data directory will + be upgraded) +4. When the previous step is finished the server will stop automatically; you + can now start your server again as done in the previous step but without + passing the *--database.auto-upgrade* option +5. Optionally remove the old server package by dropping the corresponding + directory when you are confident enough that all is working fine. + +### Logical upgrade + +To perform the upgrade of a _Single Instance_: + +1. Download the new package and extract it on a different location than the + previous one +2. Stop writes to the old server (e.g. block incoming connections) +3. Take a backup of the data using _arangodump_ +4. Stop the old server +5. Optional (depending on whether or not you modified default configuration), + copy old ArangoDB configuration file to the new server (or just edit + the new configuration file) +6. Start the new server (with a fresh data directory, by default it will be + inside the directory created when extracting the _ZIP_ archive) +7. Restore the backup into the new server using _arangorestore_ +8. Re-enable the writes (e.g. allow again incoming connections) +9. Optionally remove the old server package by dropping the corresponding + directory when you are confident enough that all is working fine. diff --git a/site/content/arangodb/oem/operations/upgrading/starter-deployments.md b/site/content/arangodb/oem/operations/upgrading/starter-deployments.md new file mode 100644 index 0000000000..45de4a8194 --- /dev/null +++ b/site/content/arangodb/oem/operations/upgrading/starter-deployments.md @@ -0,0 +1,297 @@ +--- +title: Upgrading _Starter_ Deployments +menuTitle: Starter Deployments +weight: 15 +description: >- + Procedure to perform a rolling upgrade with the `arangodb` executable +aliases: + - upgrading-starter-deployments +--- +The ArangoDB [_Starter_](../../components/tools/arangodb-starter/_index.md) supports an automated procedure +to perform upgrades, including rolling upgrades +of a [Cluster](../../deploy/cluster/_index.md) setup. + +The upgrade procedure of the _Starter_ described in this section can be used to +upgrade to a new hotfix, or to perform an upgrade to a new minor version of ArangoDB. +Please refer to the [Upgrade paths](_index.md#upgrade-paths) section +for detailed information. + +## Upgrade Scenarios + +The following four cases are possible: + +1. You have installed via an installation package (e.g. a `.deb` or `.rpm` package) + and you will upgrade this installation using again an installation package + (e.g. a `.deb` or `.rpm`). +2. You have installed via the `.tar.gz` distribution and you will upgrade this + installation using again a `.tar.gz` distribution. +3. You have installed via an installation package (e.g. a `.deb` or `.rpm` package) + and you will upgrade this installation using a `.tar.gz` distribution. +4. You have installed via the `.tar.gz` distribution and you will upgrade this + installation using an installation package (e.g. a `.deb` or `.rpm` package). + +Cases 1. and 2. are more common, though cases 3. and 4. are also possible. + +## Upgrade Procedure + +The following procedure has to be executed on every ArangoDB _Starter_ instance. +It is assumed that a _Starter_ deployment with mode `single`, `activefailover` or +`cluster` is running. + +{{< warning >}} +It is highly recommended to take a backup of your data before upgrading ArangoDB +using [_arangodump_](../../components/tools/arangodump/_index.md). +{{< /warning >}} + +### Install the new ArangoDB version binary + +Installing the new ArangoDB version binary also includes the latest ArangoDB _Starter_ +binary, which is necessary to perform the rolling upgrade. + +The first step is to install the new ArangoDB package. + +**Note:** you do not have to stop the _Starter_ processes before upgrading it. + +For example, if you want to upgrade to `3.9.2` on Debian or Ubuntu, either call + +```bash +apt install arangodb=3.9.2 +``` + +(`apt-get` on older versions) if you have added the ArangoDB repository. Or +install a specific package using + +```bash +dpkg -i arangodb3-3.9.2-1_amd64.deb +``` + +after you have downloaded the corresponding file from +[www.arangodb.com/download/](https://www.arangodb.com/download/) +or have downloaded the new Enterprise Edition executable. + +If you are using the `.tar.gz` distribution, +you can simply extract the new archive in a different +location and keep the old installation where it is. Note that +this does not launch a standalone instance, so the following section can +be skipped in this case. + +#### Stop the Standalone Instance + +As the package will automatically start the standalone instance, you might want to +stop it now, as otherwise this standalone instance that is started on your machine +can create some confusion later. As you are using the _Starter_ you do not need +this standalone instance, and you can hence stop it: + +```bash +service arangodb3 stop +``` + +Also, you might want to remove the standalone instance from the default +_runlevels_ to prevent it to start on the next reboot of your machine. How this +is done depends on your distribution and _init_ system. For example, on older Debian +and Ubuntu systems using a SystemV-compatible _init_, you can use: + +```bash +update-rc.d -f arangodb3 remove +``` + +### Stop the *Starter* without stopping the ArangoDB Server processes + +Now all the _Starter_ (_arangodb_) processes have to be stopped. +Please note that **no** _arangod_ processes should be stopped! + +In order to stop the _arangodb_ processes, leaving the _arangod_ processes they +have started up and running (as we want for a rolling upgrade), we will need to +use a command like `kill -9`. + +{{< tip >}} +When using _SystemD_ as supervisor, make sure that the +[unit file](https://www.freedesktop.org/software/systemd/man/systemd.unit.html) +contains `KillMode=process` (see +[systemd.kill documentation](https://www.freedesktop.org/software/systemd/man/systemd.kill.html#KillMode=)). +Otherwise `kill -9` will not just kill the respective _arangodb_ starter process, +but also the _arangod_ server processes it started because of the +default setting `KillMode=control-group`. +{{< /tip >}} + +```bash +kill -9 <pid-of-starter> +``` + +The _PID_ associated to your _Starter_ can be checked using a command like `ps`: + +```bash +ps -C arangodb -fww +``` + +The output of the command above does not only show the PIDs of all _arangodb_ +processes but also the used commands, which can be useful for the following +restart of all _arangodb_ processes. + +The output below is from a test machine where three instances of a _Starter_ are +running locally. In a more production-like scenario, you will find only one instance +of _arangodb_ running: + +```bash +ps -C arangodb -fww +UID PID PPID C STIME TTY TIME CMD +max 29419 3684 0 11:46 pts/1 00:00:00 arangodb --starter.data-dir=./db1 +max 29504 3695 0 11:46 pts/2 00:00:00 arangodb --starter.data-dir=./db2 --starter.join 127.0.0.1 +max 29513 3898 0 11:46 pts/4 00:00:00 arangodb --starter.data-dir=./db3 --starter.join 127.0.0.1 +``` + +You can use `pstree` to inspect the _arangod_ server instances launched by one +of these starters: + +```bash +pstree -Tp 29419 +arangodb(29419)─┬─arangod(30201) + ├─arangod(30202) + └─arangod(30217) +``` + +### Restart the *Starter* + +When using a supervisor like _SystemD_, this will happen automatically. In case +the _Starter_ was initiated manually, the _arangodb_ processes have to be restarted +manually with the same command that has been used before. + +You can inspect which processes belong to a starter instance using the `pstree` +command (see above). + +If you are using the `.tar.gz` distribution, +your new version of the executable might be located in a +different directory. Make sure that you now start the new _Starter_ +executable (`bin/arangodb`) in the new installation place. If you are +using a supervisor like _SystemD_, you might have to adjust the path to +the executable in the service description to the new location. +Do this before you `kill -9` the _Starter_ or else the old version will be +restarted in this case. If you forgot, simply do the `kill -9` again. + +After you stopped the _Starter_ make sure the `arangod` processes it spawned +are still running; they should be re-parented to the systemd or init process: + +```bash +ps -f -p 30201,30202,30217 +UID PID PPID C STIME TTY TIME CMD +root 30201 1 0 13:02 pts/45 00:01:09 usr/sbin/arangod ... +root 30202 1 0 13:02 pts/45 00:00:55 usr/sbin/arangod ... +root 30217 1 0 13:02 pts/45 00:01:11 usr/sbin/arangod ... +``` + +If not, rollback to the old version and restart that _Starter_, or the +subsequent upgrade procedure will fail. + +After you have successfully restarted the _Starter_ you will find yourself in +the following situation: + +- The _Starter_ is up and running, and it is on the new version +- The ArangoDB Server processes are up and running, and they are still on the + old version + +### Start the upgrade process of all *arangod* & *arangosync* servers + +Once you have carried out the above steps on all servers of the clusters, the +actual upgrade procedure can be started. + +Run the following command on any of the cluster nodes for any of the starter +endpoints (e.g. `http://localhost:8528`) to upgrade the entire cluster: + +```bash +arangodb upgrade --starter.endpoint=<endpoint-of-a-starter> +``` + +If you have connected clusters across multiple datacenter +(DC2DC deployment), then you need to update each of the clusters. + +If the upgrade command fails, please try again. If the upgrade command continues +to fail, please contact the ArangoDB support. + +#### Deployment mode `single` + +For deployment mode `single`, the `arangodb upgrade` command will: + +- Restart the single server with an additional `--database.auto-upgrade=true` argument. + The server will perform the auto-upgrade and then stop. + After that the _Starter_ will automatically restart it with its normal arguments. + +The `arangodb upgrade` command will complete right away. +Inspect the log of the _Starter_ to know when the upgrade has finished. + +#### Deployment mode `activefailover` or `cluster` + +The _Starters_ will now perform an initial check that upgrading is possible +and when that all succeeds, create an upgrade _plan_. This _plan_ is then +executed by every _Starter_. + +The `arangodb upgrade` command will show the progress of the upgrade +and stop when the upgrade has either finished successfully or finished +with an error. + +### Uninstall old package + +{{< info >}} +This step is required in the cases 2., 3. and 4. only. It is not required +in case 1., see [Upgrade Scenarios](#upgrade-scenarios) above. +{{< /info >}} + +After verifying your upgraded ArangoDB system is working, you can remove +the old package. This can be done in different ways, depending on the case +you are: + +- Cases 2. and 4.: just remove the old directory created by the `.tar.gz` + (assumes your `--starter.data-dir` is located outside of this + directory - which is a recommended approach). +- Case 3.: just remove the old package by running the corresponding + uninstallation command (the exact command depends on whether you are + using a `.deb` or `.rmp` package and it is assumed that your + `--starter.data-dir` is located outside of the standard directories + created by the installation package - which is a recommended approach). + +## Retrying a failed upgrade + +When an upgrade _plan_ (in deployment mode `activefailover` or `cluster`) +has failed, it can be retried. + +To retry, run: + +```bash +arangodb retry upgrade --starter.endpoint=<endpoint-of-a-starter> +``` + +The `--starter.endpoint` option can be set to the endpoint of any +of the starters, e.g. `http://localhost:8528`. + +## Aborting an upgrade + +When an upgrade _plan_ (in deployment mode `activefailover` or `cluster`) +is in progress or has failed, it can be aborted. + +To abort, run: + +```bash +arangodb abort upgrade --starter.endpoint=<endpoint-of-a-starter> +``` + +The `--starter.endpoint` option can be set to the endpoint of any +of the starters, e.g. `http://localhost:8528`. + +Note that an abort does not stop all upgrade processes immediately. +If an _arangod_ or _arangosync_ server is being upgraded when the abort +was issued, this upgrade will be finished. Remaining servers will not be +upgraded. + +## Going back to the previous version in case of failure + +In case the upgrade cannot be carried out (i.e. the upgrade command continues +to fail with an error message) please contact the ArangoDB support. + +Until then, the not yet upgraded instances will still be running the previous +version of ArangoDB. When instances are restarted, they will be starting +with the newly installed version. + +In order to avoid that instances use the new version upon the +next restart, it is possible to install the previous version again. +The steps for that are the same as for installing the new version (see above) +and making sure that the service for the standalone instance is disabled +(also see above). diff --git a/site/content/arangodb/oem/release-notes/_index.md b/site/content/arangodb/oem/release-notes/_index.md new file mode 100644 index 0000000000..4aa1c9336c --- /dev/null +++ b/site/content/arangodb/oem/release-notes/_index.md @@ -0,0 +1,96 @@ +--- +title: Release Notes +menuTitle: Release Notes +weight: 285 +description: >- + You can directly navigate to the information about changes in a specific + version of ArangoDB by following the links of this overview +--- +## What's New + +For a high level list of changes, please refer to one of the following sections: + +- What's New in 3.x: + [3.11](version-3.11/whats-new-in-3-11.md), + [3.10](version-3.10/whats-new-in-3-10.md), + [3.9](version-3.9/whats-new-in-3-9.md), + [3.8](version-3.8/whats-new-in-3-8.md), + [3.7](version-3.7/whats-new-in-3-7.md), + [3.6](version-3.6/whats-new-in-3-6.md), + [3.5](version-3.5/whats-new-in-3-5.md), + [3.4](version-3.4/whats-new-in-3-4.md), + [3.3](version-3.3/whats-new-in-3-3.md), + [3.2](version-3.2/whats-new-in-3-2.md), + [3.1](version-3.1/whats-new-in-3-1.md), + [3.0](version-3.0/whats-new-in-3-0.md) + +## Changelogs + +For a detailed list of changes to the ArangoDB core programs and tools, +please refer to the version specific changelogs: + +- Changelogs 3.x: + [3.11](https://raw.githubusercontent.com/arangodb/arangodb/3.11/CHANGELOG), + [3.10](https://raw.githubusercontent.com/arangodb/arangodb/3.10/CHANGELOG), + [3.9](https://raw.githubusercontent.com/arangodb/arangodb/3.9/CHANGELOG), + [3.8](https://raw.githubusercontent.com/arangodb/arangodb/3.8/CHANGELOG), + [3.7](https://raw.githubusercontent.com/arangodb/arangodb/3.7/CHANGELOG), + [3.6](https://raw.githubusercontent.com/arangodb/arangodb/3.6/CHANGELOG), + [3.5](https://raw.githubusercontent.com/arangodb/arangodb/3.5/CHANGELOG), + [3.4](https://raw.githubusercontent.com/arangodb/arangodb/3.4/CHANGELOG), + [3.3](https://raw.githubusercontent.com/arangodb/arangodb/3.3/CHANGELOG), + [3.2](https://raw.githubusercontent.com/arangodb/arangodb/3.2/CHANGELOG), + [3.1](https://raw.githubusercontent.com/arangodb/arangodb/3.1/CHANGELOG), + [3.0](https://raw.githubusercontent.com/arangodb/arangodb/3.0/CHANGELOG) + +Additional changelogs for tools not included in the main repository: + +- [ArangoDB Starter](https://github.com/arangodb-helper/arangodb/blob/master/CHANGELOG.md) +- [Foxx CLI](https://github.com/arangodb/foxx-cli/blob/main/CHANGELOG.md) +- [kube-arangodb](https://github.com/arangodb/kube-arangodb/blob/master/CHANGELOG.md) + +## Incompatible changes + +For a list of incompatible changes, please refer to one of the following sections. + +- Incompatible changes in 3.x: + [3.11](version-3.11/incompatible-changes-in-3-11.md), + [3.10](version-3.10/incompatible-changes-in-3-10.md), + [3.9](version-3.9/incompatible-changes-in-3-9.md), + [3.8](version-3.8/incompatible-changes-in-3-8.md), + [3.7](version-3.7/incompatible-changes-in-3-7.md), + [3.6](version-3.6/incompatible-changes-in-3-6.md), + [3.5](version-3.5/incompatible-changes-in-3-5.md), + [3.4](version-3.4/incompatible-changes-in-3-4.md), + [3.3](version-3.3/incompatible-changes-in-3-3.md), + [3.2](version-3.2/incompatible-changes-in-3-2.md), + [3.1](version-3.1/incompatible-changes-in-3-1.md), + [3.0](version-3.0/incompatible-changes-in-3-0.md) + +## API Changes + +For an overview of changes to ArangoDB's interfaces, have a look at below +sections. The HTTP API part is especially relevant for driver maintainers. + +- API Changes in 3.x: + [3.11](version-3.11/api-changes-in-3-11.md), + [3.10](version-3.10/api-changes-in-3-10.md), + [3.9](version-3.9/api-changes-in-3-9.md), + [3.8](version-3.8/api-changes-in-3-8.md), + [3.7](version-3.7/api-changes-in-3-7.md) + +## Known Issues + +For a list of known issues, please refer to one of the following sections: + +- Known Issues in 3.x: + [3.11](version-3.11/known-issues-in-3-11.md), + [3.10](version-3.10/known-issues-in-3-10.md), + [3.9](version-3.9/known-issues-in-3-9.md), + [3.8](version-3.8/known-issues-in-3-8.md), + [3.7](version-3.7/known-issues-in-3-7.md), + [3.6](version-3.6/known-issues-in-3-6.md), + [3.5](version-3.5/known-issues-in-3-5.md), + [3.4](version-3.4/known-issues-in-3-4.md), + [3.3](version-3.3/known-issues-in-3-3.md), + [3.2](version-3.2/known-issues-in-3-2.md) diff --git a/site/content/arangodb/oem/release-notes/deprecated-and-removed-features.md b/site/content/arangodb/oem/release-notes/deprecated-and-removed-features.md new file mode 100644 index 0000000000..53501c13f4 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/deprecated-and-removed-features.md @@ -0,0 +1,283 @@ +--- +title: Deprecated and removed features +menuTitle: Deprecated and removed features +weight: 100 +description: >- + Features listed in this section should no longer be used, because they are considered obsolete and may get removed in a future release +aliases: + - ../arangograph/migrate-to-the-cloud +--- +Features listed on this page should no longer be used because they have been +deprecated and may get removed in a future release, or have been removed already +and are thus no longer available. + +Deprecated features are still available for backward compatibility, but you should +update your applications to prepare for upgrades of ArangoDB that may remove the +features. There are usually alternatives to replace the old features with. + +{{< info >}} +This page only lists significant obsolete features but not minor API changes. +See the [Release notes](_index.md) of the respective versions for +detailed information about breaking changes before upgrading. +{{< /info >}} + +- **VelocyStream protocol**: + ArangoDB's own bi-directional asynchronous binary protocol VelocyStream (VST) + is deprecated in v3.11 and removed in v3.12.0. Use JSON or VelocyPack over the + HTTP(S) protocol instead. + +- **Little-endian on-disk key format for the RocksDB storage engine**: + + The little-endian on-disk key format for the RocksDB storage engine is + deprecated and support will be removed in v3.12. Parallel index creation and + the `--use-experimental-dump` arangodump option are only available in v3.11 + for deployments that use the big-endian format, which is the default since v3.4. + + Only deployments that were set up with the RocksDB storage engine using + ArangoDB v3.2 or v3.3 and that have been upgraded since then are affected. + +- **Pregel features**: + The following features have been deprecated or removed from Pregel in v3.11: + + - The experimental _Custom Pregel_ feature, also known as + _programmable Pregel algorithms_ (PPA), has been removed. + + - The built-in _DMID_ Pregel algorithm has been deprecated and will be removed + in a future release. + + - The `async` option for Pregel jobs has been removed. + + - The `useMemoryMaps` option for Pregel jobs to use memory-mapped files as a + backing storage for large datasets has been removed. + +- **Cloud Migration Tool**: + The `arangosync-migration` tool to move from on-premises to the cloud is not + available anymore. + +- **Leader/Follower Deployment Mode**: + The Leader/Follower deployment mode is deprecated and already removed from + documentation. Active Failover and OneShard databases in clusters are better + alternatives. + +- **Skiplist and hash indexes**: + Skiplist and hash indexes have been deprecated in 3.9 and will be removed in a + future version of ArangoDB. Currently, they are an alias for a + [persistent index](../index-and-search/indexing/basics.md#persistent-index). + +- **Bundled NPM modules**: + The bundled NPM modules `aqb`, `chai`, `dedent`, `error-stack-parser`, + `graphql-sync`, `highlight.js`, `i` (inflect), `iconv-lite`, `joi`, + `js-yaml`, `lodash`, `minimatch`, `qs`, `semver`, `sinon`, and `timezone` + have been deprecated in 3.9 and will be removed in a future version of ArangoDB. + If you want to use NPM modules in your Foxx service, please refer to the + [Foxx guide](../develop/foxx-microservices/guides/using-node-modules.md). + +- **Batch Requests API**: + The [batch request REST API](../develop/http-api/batch-requests.md) is deprecated and will be + removed in a future version. Instead of using this API, please use the + [HTTP interface for documents](../develop/http-api/documents.md#multiple-document-operations) + that can insert, update, replace or remove arrays of documents. + +- **PUT method in Cursor API**: + The HTTP endpoint `PUT /_api/cursor/<cursor-id>` in the + [Cursor REST API](../develop/http-api/queries/aql-queries.md) is deprecated and will be + removed in a future version. Please use the drop-in replacement + `POST /_api/cursor/<cursor-id>` instead. The POST endpoint is functionally + equivalent to the PUT endpoint, but does not violate idempotency requirements + prescribed by the [HTTP specification](https://tools.ietf.org/html/rfc7231#section-4.2). + +- **Fulltext indexes**: + The fulltext index type is deprecated from version 3.10 onwards. + It is recommended to use [ArangoSearch](../index-and-search/arangosearch/_index.md) for advanced full-text search capabilities. + +- **Simple Queries**: Idiomatic interface in arangosh to perform trivial queries. + They are superseded by [AQL queries](../aql/_index.md), which can also + be run in arangosh. AQL is a language on its own and way more powerful than + *Simple Queries* could ever be. In fact, the (still supported) *Simple Queries* + are translated internally to AQL, then the AQL query is optimized and run + against the database in recent versions, because of better performance and + reduced maintenance complexity. + +- **Accessing collections by ID instead of by name**: + Accessing collections by their internal ID instead of accessing them by name + is deprecated and highly discouraged. This functionality may be removed in + future versions of ArangoDB. + +- **Old metrics REST API**: + The old metrics API under `/_admin/metrics` is deprecated and replaced by + a new one under `/_admin/metrics/v2` from version 3.8.0 on. This step was + necessary because the old API did not follow quite a few Prometheus + guidelines for metrics. + +- **Statistics REST API**: + The endpoints `/_admin/statistics` and `/_admin/statistics-description` + are deprecated in favor of the new metrics API under `/_admin/metrics/v2`. + The metrics API provides a lot more information than the statistics API, so + it is much more useful. + +- **Database target version REST API**: + The `GET /_admin/database/target-version` endpoint is deprecated in favor of the + more general version API with the endpoint `GET /_api/version`. The endpoint may be + removed in a future version of ArangoDB. + +- **Replication logger-follow REST API**: + The endpoint `/_api/replication/logger-follow` is deprecated since 3.4.0 and + may be removed in a future version. Client applications should use the REST + API endpoint `/_api/wal/tail` instead, which is available since ArangoDB 3.3. + +- **Loading and unloading of collections**: + The JavaScript functions for explicitly loading and unloading collections, + `db.<collection-name>.load()` and `db.<collection-name>.unload()` and their + REST API endpoints `PUT /_api/collection/<collection-name>/load` and + `PUT /_api/collection/<collection-name>/unload` are deprecated in 3.8. + There should be no need to explicitly load or unload a collection with the + RocksDB storage engine. The load/unload functionality was useful only with + the MMFiles storage engine, which is not available anymore since 3.7. + +- **Actions**: Snippets of JavaScript code on the server-side for minimal + custom endpoints. Since the Foxx revamp in 3.0, it became really easy to + write [Foxx Microservices](../develop/foxx-microservices/_index.md), which allow you to define + custom endpoints even with complex business logic. + + From v3.5.0 on, the system collections `_routing` and `_modules` are not + created anymore when the `_system` database is first created (blank new data + folder). They are not actively removed, they remain on upgrade or backup + restoration from previous versions. + +- **Outdated AQL functions**: The following AQL functions are deprecated and + their usage is discouraged: + - `IS_IN_POLYGON` + - `NEAR` + - `WITHIN` + - `WITHIN_RECTANGLE` + + See [Geo functions](../aql/functions/geo.md) for substitutes. + +- **`bfs` option** in AQL graph traversal: Using the *bfs* attribute inside + traversal options is deprecated since v3.8.0. The preferred way to start a + breadth-first traversal is by using the new `order` attribute, and setting it + to a value of `bfs`. + +- **`overwrite` option**: The `overwrite` option for insert operations (either + single document operations or AQL `INSERT` operations) is deprecated in favor + of the `overwriteMode` option, which provides more flexibility. + +- **`minReplicationFactor` collection option**: The `minReplicationFactor` + option for collections has been renamed to `writeConcern`. If + `minReplicationFactor` is specified and no `writeConcern` is set, the + `minReplicationFactor` value will still be picked up and used as + `writeConcern` value. However, this compatibility mode will be removed + eventually, so changing applications from using `minReplicationFactor` to + `writeConcern` is advised. + +- **Outdated startup options** + + The following _arangod_ startup options are deprecated and will be removed + in a future version: + - `--database.old-system-collections` (no need to use it anymore) + - `--server.jwt-secret` (use `--server.jwt-secret-keyfile`) + - `--arangosearch.threads` / `--arangosearch.threads-limit` + (use the following options instead): + - `--arangosearch.commit-threads` + - `--arangosearch.commit-threads-idle` + - `--arangosearch.consolidation-threads` + - `--arangosearch.consolidation-threads-idle` + - `--rocksdb.exclusive-writes` (was intended only as a stopgap measure to + make porting applications from MMFiles to RocksDB easier) + - `--http.allow-method-override`: this option allows incoming HTTP POST + request to override the actual HTTP method used by setting one of the + special HTTP headers `x-http-method`, `x-method-override` or + `x-http-method-override`. This was originally intended for very restricted + callers, which only supported HTTP GET and HTTP POST, but seems very + unnecessary nowadays. + The functionality will be removed in ArangoDB 3.12. + - `--http.hide-product-header`: whether or not to hide the `Server: ArangoDB` + header in all responses served by arangod. + The functionality will be removed in ArangoDB 3.12. + - `--network.protocol`: network protocol to use for cluster-internal + communication. The protocol will be auto-decided from version 3.9 onwards. + - `--query.allow-collections-in-expressions`: allow full collections to be + used in AQL expressions. This option defaults to `false` from version 3.9 + onwards and will be removed in a future version. It is only useful to + enable it when migrating from older versions. + + The following options are deprecated for _arangorestore_: + - `--default-number-of-shards` (use `--number-of-shards` instead) + - `--default-replication-factor` (use `--replication-factor` instead) + + The following options are deprecated for _arangodump_: + - `--envelope`: setting this option to `true` previously wrapped every dumped + document into a `{data, type}` envelope. + This was useful for the MMFiles storage engine, where dumps could also include + document removals. With the RocksDB storage engine, the envelope only caused + overhead and increased the size of the dumps. The default value of `--envelope` + was changed to false in ArangoDB 3.9 already, so by default all arangodump + invocations since then create non-envelope dumps. + - `--tick-start`: setting this option allowed to restrict the dumped data to some + time range with the MMFiles storage engine. It has no effect for the RocksDB + storage engine. + - `--tick-end`: setting this option allowed to restrict the dumped data to some + time range with the MMFiles storage engine. It has no effect for the RocksDB + storage engine. + + The following startup options are deprecated in _arangod_ and all client tools: + - `--log` (use `--log.level` instead) + - `--log.use-local-time` (use `--log.time-format` instead) + - `--log.use-microtime` (use `--log.time-format` instead) + - `--log.performance` (use `--log.level` instead) + +- **Obsoleted startup options**: Any startup options marked as obsolete can be + removed in any future version of ArangoDB, so their usage is highly + discouraged. Their functionality is already removed, but they still exist to + prevent unknown startup option errors. + +- **arangoimp** executable: ArangoDB release packages install an executable named + _arangoimp_ as an alias for the _arangoimport_ executable. This is done to + provide compatibility with older releases, in which _arangoimport_ did not + yet exist and was named _arangoimp_. The renaming was actually carried out in + the codebase in December 2017. Using the _arangoimp_ executable is deprecated, + and it is always favorable to use _arangoimport_ instead. + While the _arangoimport_ executable will remain, the _arangoimp_ alias will be + removed in a future version of ArangoDB. + +- **HTTP and JavaScript traversal APIs**: The HTTP traversal API + is deprecated since version 3.4.0. The JavaScript traversal module + `@arangodb/graph/traversal` is also deprecated since then. The preferred way + to traverse graphs is via AQL. + +- **JavaScript-based AQL graph functions**: The following JavaScript-based AQL + graph functions are deprecated: + - `arangodb::GRAPH_EDGES` + - `arangodb::GRAPH_VERTICES` + - `arangodb::GRAPH_NEIGHBORS` + - `arangodb::GRAPH_COMMON_NEIGHBORS` + - `arangodb::GRAPH_COMMON_PROPERTIES` + - `arangodb::GRAPH_PATHS` + - `arangodb::GRAPH_SHORTEST_PATH` + - `arangodb::GRAPH_DISTANCE_TO` + - `arangodb::GRAPH_ABSOLUTE_ECCENTRICITY` + - `arangodb::GRAPH_ECCENTRICITY` + - `arangodb::GRAPH_ABSOLUTE_CLOSENESS` + - `arangodb::GRAPH_CLOSENESS` + - `arangodb::GRAPH_ABSOLUTE_BETWEENNESS` + - `arangodb::GRAPH_BETWEENNESS` + - `arangodb::GRAPH_RADIUS` + - `arangodb::GRAPH_DIAMETER` + + These functions will be removed in ArangoDB 3.12. + +- **Specialized index creation methods in JavaScript API**: + The following JavaScript methods for creating indexes from the ArangoShell + (_arangosh_) or from within Foxx are deprecated: + - `collection.ensureHashIndex(...)` + - `collection.ensureUniqueConstraint(...)` + - `collection.ensureSkiplist(...)` + - `collection.ensureUniqueSkiplist(...)` + - `collection.ensureFulltextIndex(...)` + - `collection.ensureGeoIndex(...)` + - `collection.ensureGeoConstraint(...)` + + Instead of using these methods, you should use the generic + `collection.ensureIndex(...)` method, which provides a superset of all the + deprecated methods. Also see + [Creating an index](../index-and-search/indexing/working-with-indexes/_index.md#creating-an-index). diff --git a/site/content/arangodb/oem/release-notes/version-3.0/_index.md b/site/content/arangodb/oem/release-notes/version-3.0/_index.md new file mode 100644 index 0000000000..a0f9bce237 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.0/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.0 +menuTitle: Version 3.0 +weight: 99 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.0/incompatible-changes-in-3-0.md b/site/content/arangodb/oem/release-notes/version-3.0/incompatible-changes-in-3-0.md new file mode 100644 index 0000000000..0babc90491 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.0/incompatible-changes-in-3-0.md @@ -0,0 +1,1093 @@ +--- +title: Incompatible changes in ArangoDB 3.0 +menuTitle: Incompatible changes in 3.0 +weight: 10 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Build system + +Building ArangoDB 3.0 from source now requires CMake. + +The pre-3.0 build system used a configure-based approach. The steps to build +ArangoDB 2.8 from source code were: + +``` +make setup +./configure <options> +make +``` + +These steps will not work anymore, as ArangoDB 3.0 does not come with a +configure script. + +To build 3.0 on Linux, create a separate build directory first: + +``` +mkdir -p build +``` + +and then create the initial build scripts once using CMake: + +``` +(cd build && cmake <options> ..) +``` + +The above command will configure the build and check for the required +dependencies. If everything works well the actual build can be started with + +``` +(cd build && make) +``` + +The binaries for the ArangoDB server and all client tools will then be created +inside the `build` directory. To start ArangoDB locally from the `build` directory, +use + +``` +build/bin/arangod <options> +``` + +## Datafiles and datafile names + +ArangoDB 3.0 uses a new VelocyPack-based format for storing data in WAL logfiles +and collection datafiles. The file format is not compatible with the files used +in prior versions of ArangoDB. That means datafiles written by ArangoDB 3.0 cannot be +used in earlier versions and vice versa. + +The pattern for collection directory names was changed in 3.0 to include a random +id component at the end. The new pattern is `collection-<id>-<random>`, where `<id>` +is the collection id and `<random>` is a random number. Previous versions of ArangoDB +used a pattern `collection-<id>` without the random number. + +## User Management + +Unlike ArangoDB 2.x, ArangoDB 3.0 users are now separated from databases, and you can +grant one or more database permissions to a user. + +If you want to mimic the behavior of ArangoDB, you should name your users like +`username@dbname`. + +Users that can access the *_system* database are allowed to manage users and +permissions for all databases. + +## Edges and edges attributes + +In ArangoDB prior to 3.0 the attributes `_from` and `_to` of edges were treated +specially when loading or storing edges. That special handling led to these attributes +being not as flexible as regular document attributes. For example, the `_from` and +`_to` attribute values of an existing edge could not be updated once the edge was +created. Additionally, the `_from` and `_to` attributes could not be indexed in +user-defined indexes, e.g. to make each combination of `_from` and `_to` unique. +Finally, as `_from` and `_to` referenced the linked collections by collection id +and not by collection name, their meaning became unclear once a referenced collection +was dropped. The collection id stored in edges then became unusable, and when +accessing such edge the collection name part of it was always translated to `_undefined`. + +In ArangoDB 3.0, the `_from` and `_to` values of edges are saved as regular strings. +This allows using `_from` and `_to` in user-defined indexes. Additionally this allows +updating the `_from` and `_to` values of existing edges. Furthermore, collections +referenced by `_from` and `_to` values may be dropped and re-created later. Any +`_from` and `_to` values of edges pointing to such dropped collection are unaffected +by the drop operation now. Also note that renaming the collection referenced in +`_from` and `_to` in ArangoDB 2.8 also relinked the edges. In 3.0 the edges are NOT +automatically relinked to the new collection anymore. + +## Documents + +Documents (in contrast to edges) cannot contain the attributes `_from` or `_to` on the +main level in ArangoDB 3.0. These attributes will be automatically removed when saving +documents (i.e. non-edges). `_from` and `_to` can be still used in sub-objects inside +documents. + +The `_from` and `_to` attributes will of course be preserved and are still required when +saving edges. + +## AQL + +### Edges handling + +When updating or replacing edges via AQL, any modifications to the `_from` and `_to` +attributes of edges were ignored by previous versions of ArangoDB, without signaling +any errors. This was due to the `_from` and `_to` attributes being immutable in earlier +versions of ArangoDB. + +From 3.0 on, the `_from` and `_to` attributes of edges are mutable, so any AQL queries that +modify the `_from` or `_to` attribute values of edges will attempt to actually change these +attributes. Clients should be aware of this change and should review their queries that +modify edges to rule out unintended side-effects. + +Additionally, when completely replacing the data of existing edges via the AQL `REPLACE` +operation, it is now required to specify values for the `_from` and `_to` attributes, +as `REPLACE` requires the entire new document to be specified. If either `_from` or `_to` +are missing from the replacement document, an `REPLACE` operation will fail. + +#### Graph functions + +In version 3.0 all former graph related functions have been removed from AQL to +be replaced by [native AQL constructs](../../aql/graphs/_index.md). +These constructs allow for more fine-grained filtering on several graph levels. +Also this allows the AQL optimizer to automatically improve these queries by +enhancing them with appropriate indexes. + +The following functions have been removed: + +- `GRAPH_*` functions + - GRAPH_COMMON_NEIGHBORS() + - GRAPH_COMMON_PROPERTIES() + - GRAPH_DISTANCE_TO() + - GRAPH_EDGES() + - GRAPH_NEIGHBORS() + - GRAPH_TRAVERSAL() + - GRAPH_TRAVERSAL_TREE() + - GRAPH_SHORTEST_PATH() + - GRAPH_PATHS() + - GRAPH_VERTICES() + +- `GRAPH_*` measurements functions + - GRAPH_ABSOLUTE_BETWEENNESS() + - GRAPH_ABSOLUTE_CLOSENESS() + - GRAPH_ABSOLUTE_ECCENTRICITY() + - GRAPH_BETWEENNESS() + - GRAPH_CLOSENESS() + - GRAPH_DIAMETER() + - GRAPH_ECCENTRICITY() + - GRAPH_RADIUS() +- Anonymous graph functions + - EDGES() + - NEIGHBORS() + - PATHS() + - TRAVERSAL() + - TRAVERSAL_TREE() + +### Typecasting functions + +The type casting applied by the `TO_NUMBER()` AQL function has changed as follows: +- string values that do not contain a valid numeric value are now converted to the number + `0`. In previous versions of ArangoDB such string values were converted to the value + `null`. +- array values with more than 1 member are now converted to the number `0`. In previous + versions of ArangoDB such arrays were converted to the value `null`. +- objects / documents are now converted to the number `0`. In previous versions of ArangoDB + objects / documents were converted to the value `null`. + +Additionally, the `TO_STRING()` AQL function now converts `null` values into an empty string +(`""`) instead of the string `"null"`, which is more in line with `LENGTH(null)` returning +`0` and not `4` since v2.6. + +The output of `TO_STRING()` has also changed for arrays and objects as follows: + +- arrays are now converted into their JSON-stringify equivalents, e.g. + + - `[ ]` is now converted to `[]` + - `[ 1, 2, 3 ]` is now converted to `[1,2,3]` + - `[ "test", 1, 2 ] is now converted to `["test",1,2]` + + Previous versions of ArangoDB converted arrays with no members into the + empty string, and non-empty arrays into a comma-separated list of member + values, without the surrounding angular brackets. Additionally, string + array members were not enclosed in quotes in the result string: + + - `[ ]` was converted to `` + - `[ 1, 2, 3 ]` was converted to `1,2,3` + - `[ "test", 1, 2 ] was converted to `test,1,2` + +- objects are now converted to their JSON-stringify equivalents, e.g. + + - `{ }` is converted to `{}` + - `{ a: 1, b: 2 }` is converted to `{"a":1,"b":2}` + - `{ "test" : "foobar" }` is converted to `{"test":"foobar"}` + + Previous versions of ArangoDB always converted objects into the string + `[object Object]` + +This change also affects other parts in AQL that used `TO_STRING()` to implicitly +cast operands to strings. It also affects the AQL functions `CONCAT()` and +`CONCAT_SEPARATOR()` which treated array values differently. Previous versions +of ArangoDB automatically flattened array values in the first level of the array, +e.g. `CONCAT([1, 2, 3, [ 4, 5, 6 ]])` produced `1,2,3,4,5,6`. Now this will produce +`[1,2,3,[4,5,6]]`. To flatten array members on the top level, you can now use +the more explicit `CONCAT(FLATTEN([1, 2, 3, [4, 5, 6]], 1))`. + +### Arithmetic operators + +As the arithmetic operations in AQL implicitly convert their operands to numeric values using +`TO_NUMBER()`, their casting behavior has also changed as described above. + +Some examples of the changed behavior: + +- `"foo" + 1` produces `1` now. In previous versions this produced `null`. +- `[ 1, 2 ] + 1` produces `1`. In previous versions this produced `null`. +- `1 + "foo" + 1´ produces `2` now. In previous version this produced `1`. + +### Attribute names and parameters + +Previous versions of ArangoDB had some trouble with attribute names that contained the dot +symbol (`.`). Some code parts in AQL used the dot symbol to split an attribute name into +sub-components, so an attribute named `a.b` was not completely distinguishable from an +attribute `a` with a sub-attribute `b`. This inconsistent behavior sometimes allowed "hacks" +to work such as passing sub-attributes in a bind parameter as follows: + +``` +FOR doc IN collection + FILTER doc.@name == 1 + RETURN doc +``` + +If the bind parameter `@name` contained the dot symbol (e.g. `@bind` = `a.b`, it was unclear +whether this should trigger sub-attribute access (i.e. `doc.a.b`) or a access to an attribute +with exactly the specified name (i.e. `doc["a.b"]`). + +ArangoDB 3.0 now handles attribute names containing the dot symbol properly, and sending a +bind parameter `@name` = `a.b` will now always trigger an access to the attribute `doc["a.b"]`, +not the sub-attribute `b` of `a` in `doc`. + +For users that used the "hack" of passing bind parameters containing dot symbol to access +sub-attributes, ArangoDB 3.0 allows specifying the attribute name parts as an array of strings, +e.g. `@name` = `[ "a", "b" ]`, which will be resolved to the sub-attribute access `doc.a.b` +when the query is executed. + +### Keywords + +`LIKE` is now a keyword in AQL. Using `LIKE` in either case as an attribute or collection +name in AQL queries now requires quoting. + +`SHORTEST_PATH` is now a keyword in AQL. Using `SHORTEST_PATH` in either case as an attribute or collection +name in AQL queries now requires quoting. + +### Subqueries + +Queries that contain subqueries that contain data-modification operations such as `INSERT`, +`UPDATE`, `REPLACE`, `UPSERT` or `REMOVE` will now refuse to execute if the collection +affected by the subquery's data-modification operation is read-accessed in an outer scope +of the query. + +For example, the following query will refuse to execute as the collection `myCollection` +is modified in the subquery but also read-accessed in the outer scope: + +``` +FOR doc IN myCollection + LET changes = ( + FOR what IN myCollection + FILTER what.value == 1 + REMOVE what IN myCollection + ) + RETURN doc +``` + +It is still possible to write to collections from which data is read in the same query, +e.g. + +``` +FOR doc IN myCollection + FILTER doc.value == 1 + REMOVE doc IN myCollection +``` + +and to modify data in different collection via subqueries. + +### Other changes + +The AQL optimizer rule "merge-traversal-filter" that already existed in 3.0 was renamed to +"optimize-traversals". This should be of no relevance to client applications except if +they programmatically look for applied optimizer rules in the explain out of AQL queries. + +The order of results created by the AQL functions `VALUES()` and `ATTRIBUTES()` was never +guaranteed and it only had the "correct" ordering by accident when iterating over objects +that were not loaded from the database. As some of the function internals have changed, the +"correct" ordering will not appear anymore, and still no result order is guaranteed by +these functions unless the `sort` parameter is specified (for the `ATTRIBUTES()` function). + +## Upgraded V8 version + +The V8 engine that is used inside ArangoDB to execute JavaScript code has been upgraded from +version 4.3.61 to 5.0.71.39. The new version should be mostly compatible to the old version, +but there may be subtle differences, including changes of error message texts thrown by the +engine. +Furthermore, some V8 startup parameters have changed their meaning or have been removed in +the new version. This is only relevant when ArangoDB or ArangoShell are started with a custom +value for the `--javascript.v8-options` startup option. + +Among others, the following V8 options change in the new version of ArangoDB: + +- `--es_staging`: in 2.8 it had the meaning `enable all completed harmony features`, in 3.0 + the option means `enable test-worthy harmony features (for internal use only)` + +- `--strong_this`: this option wasn't present in 2.8. In 3.0 it means `don't allow 'this' to + escape from constructors` and defaults to true. + +- `--harmony_regexps`: this options means `enable "harmony regular expression extensions"` + and changes its default value from false to true + +- `--harmony_proxies`: this options means `enable "harmony proxies"` and changes its default + value from false to true + +- `--harmony_reflect`: this options means `enable "harmony Reflect API"` and changes its + default value from false to true + +- `--harmony_sloppy`: this options means `enable "harmony features in sloppy mode"` and + changes its default value from false to true + +- `--harmony_tostring`: this options means `enable "harmony toString"` and changes its + default value from false to true + +- `--harmony_unicode_regexps`: this options means `enable "harmony unicode regexps"` and + changes its default value from false to true + +- `--harmony_arrays`, `--harmony_array_includes`, `--harmony_computed_property_names`, + `--harmony_arrow_functions`, `--harmony_rest_parameters`, `--harmony_classes`, + `--harmony_object_literals`, `--harmony_numeric_literals`, `--harmony_unicode`: + these option have been removed in V8 5. + +As a consequence of the upgrade to V8 version 5, the implementation of the +JavaScript `Buffer` object had to be changed. JavaScript `Buffer` objects in +ArangoDB now always store their data on the heap. There is no shared pool +for small Buffer values, and no pointing into existing Buffer data when +extracting slices. This change may increase the cost of creating Buffers with +short contents or when peeking into existing Buffers, but was required for +safer memory management and to prevent leaks. + +## JavaScript API changes + +The following incompatible changes have been made to the JavaScript API in ArangoDB 3.0: + +### Foxx + +The Foxx framework has been completely rewritten for 3.0 with a new, simpler and more +familiar API. To make Foxx services developed for 2.8 or earlier ArangoDB versions run in 3.0, the service's manifest file needs to be edited. + +To enable the legacy mode for a Foxx service, add `"engines": {"arangodb": "^2.8.0"}` +(or similar version ranges that exclude 3.0 and up) to the service manifest file +(named "manifest.json", located in the service's base directory). + +### Require + +Modules shipped with ArangoDB can now be required using the pattern `@arangodb/<module>` +instead of `org/arangodb/<module>`, e.g. + +```js +var cluster = require("@arangodb/cluster"); +``` + +The old format can still be used for compatibility: + +```js +var cluster = require("org/arangodb/cluster"); +``` + +ArangoDB prior to version 3.0 allowed a transparent use of CoffeeScript +source files with the `require()` function. Files with a file name extension +of `coffee` were automatically sent through a CoffeeScript parser and +transpiled into JavaScript on-the-fly. This support is gone with ArangoDB +3.0. To run any CoffeeScript source files, they must be converted to JavaScript +by the client application. + +### Response object + +The `@arangodb/request` response object now stores the parsed JSON response +body in a property `json` instead of `body` when the request was made using the +`json` option. The `body` instead contains the response body as a string. + +### JavaScript Edges API + +When completely replacing an edge via a collection's `replace()` function the replacing +edge data now needs to contain the `_from` and `_to` attributes for the new edge. Previous +versions of ArangoDB did not require the edge data to contain `_from` and `_to` attributes +when replacing an edge, since `_from` and `_to` values were immutable for existing edges. + +For example, the following call worked in ArangoDB 2.8 but will fail in 3.0: + +```js +db.edgeCollection.replace("myKey", { value: "test" }); +``` + +To make this work in ArangoDB 3.0, `_from` and `_to` need to be added to the replacement +data: + +```js +db.edgeCollection.replace("myKey", { _from: "myVertexCollection/1", _to: "myVertexCollection/2", value: "test" }); +``` + +Note that this only affects the `replace()` function but not `update()`, which will +only update the specified attributes of the edge and leave all others intact. + +Additionally, the functions `edges()`, `outEdges()` and `inEdges()` with an array of edge +ids will now make the edge ids unique before returning the connected edges. This is probably +desired anyway, as results will be returned only once per distinct input edge id. However, +it may break client applications that rely on the old behavior. + +### Databases API + +The `_listDatabases()` function of the `db` object has been renamed to `_databases()`, making it +consistent with the `_collections()` function. Also the `_listEndpoints()` function has been +renamed to `_endpoints()`. + +### Collection API + +#### Example matching + +The collection function `byExampleHash()` and `byExampleSkiplist()` have been removed in 3.0. +Their functionality is provided by collection's `byExample()` function, which will automatically +use a suitable index if present. + +The collection function `byConditionSkiplist()` has been removed in 3.0. The same functionality +can be achieved by issuing an AQL query with the target condition, which will automatically use +a suitable index if present. + +#### Javascript Revision id handling + +The `exists()` method of a collection now throws an exception when the specified document +exists but its revision id does not match the revision id specified. Previous versions of +ArangoDB simply returned `false` if either no document existed with the specified key or +when the revision id did not match. It was therefore impossible to distinguish these two +cases from the return value alone. 3.0 corrects this. Additionally, `exists()` in previous +versions always returned a boolean if only the document key was given. 3.0 now returns the +document's meta-data, which includes the document's current revision id. + +Given there is a document with key `test` in collection `myCollection`, then the behavior +of 3.0 is as follows: + +```js +/* test if document exists. this returned true in 2.8 */ +db.myCollection.exists("test"); +{ + "_key" : "test", + "_id" : "myCollection/test", + "_rev" : "9758059" +} + +/* test if document exists. this returned true in 2.8 */ +db.myCollection.exists({ _key: "test" }); +{ + "_key" : "test", + "_id" : "myCollection/test", + "_rev" : "9758059" +} + +/* test if document exists. this also returned false in 2.8 */ +db.myCollection.exists("foo"); +false + +/* test if document with a given revision id exists. this returned true in 2.8 */ +db.myCollection.exists({ _key: "test", _rev: "9758059" }); +{ + "_key" : "test", + "_id" : "myCollection/test", + "_rev" : "9758059" +} + +/* test if document with a given revision id exists. this returned false in 2.8 */ +db.myCollection.exists({ _key: "test", _rev: "1234" }); +JavaScript exception: ArangoError 1200: conflict +``` + +#### Cap constraints + +The cap constraints feature has been removed. This change has led to the removal of the +collection operations `first()` and `last()`, which were internally based on data from +cap constraints. + +As cap constraints have been removed in ArangoDB 3.0 it is not possible to create an +index of type "cap" with a collection's `ensureIndex()` function. The dedicated function +`ensureCapConstraint()` has also been removed from the collection API. + +#### Graph Blueprints JS Module + +The deprecated module `graph-blueprints` has been deleted. +All it's features are covered by the `general-graph` module. + +#### General Graph Fluent AQL interface + +The fluent interface has been removed from ArangoDB. +It's features were completely overlapping with ["aqb"](https://github.com/arangodb/aqbjs) +which comes pre installed as well. +Please switch to AQB instead. + +#### Undocumented APIs + +The undocumented functions `BY_EXAMPLE_HASH()` and `BY_EXAMPLE_SKIPLIST()`, +`BY_CONDITION_SKIPLIST`, `CPP_NEIGHBORS` and `CPP_SHORTEST_PATH` have been removed. +These functions were always hidden and not intended to be part of +the public JavaScript API for collections. + +## HTTP API changes + +### CRUD operations + +The following incompatible changes have been made to the HTTP API in ArangoDB 3.0: + +#### General + +The HTTP insert operations for single documents and edges (POST `/_api/document`) do +not support the URL parameter "createCollection" anymore. In previous versions of +ArangoDB this parameter could be used to automatically create a collection upon +insertion of the first document. It is now required that the target collection already +exists when using this API, otherwise it will return an HTTP 404 error. +The same is true for the import API at POST `/_api/import`. + +Collections can still be created easily via a separate call to POST `/_api/collection` +as before. + +The "location" HTTP header returned by ArangoDB when inserting a new document or edge +now always contains the database name. This was also the default behavior in previous +versions of ArangoDB, but it could be overridden by clients sending the HTTP header +`x-arango-version: 1.4` in the request. Clients can continue to send this header to +ArangoDB 3.0, but the header will not influence the location response headers produced +by ArangoDB 3.0 anymore. + +Additionally the CRUD operations APIs do not return an attribute "error" in the +response body with an attribute value of "false" in case an operation succeeded. + +#### Revision id handling + +The operations for updating, replacing and removing documents can optionally check the +revision number of the document to be updated, replaced or removed so the caller can +ensure the operation works on a specific version of the document and there are no +lost updates. + +Previous versions of ArangoDB allowed passing the revision id of the previous document +either in the HTTP header `If-Match` or in the URL parameter `rev`. For example, +removing a document with a specific revision id could be achieved as follows: + +``` +curl -X DELETE \ + "http://127.0.0.1:8529/_api/document/myCollection/myKey?rev=123" +``` + +ArangoDB 3.0 does not support passing the revision id via the "rev" URL parameter +anymore. Instead the previous revision id must be passed in the HTTP header `If-Match`, +e.g. + +``` +curl -X DELETE \ + --header "If-Match: '123'" \ + "http://127.0.0.1:8529/_api/document/myCollection/myKey" +``` + +The URL parameter "policy" was also usable in previous versions of ArangoDB to +control revision handling. Using it was redundant to specifying the expected revision +id via the "rev" parameter or "If-Match" HTTP header and therefore support for the "policy" +parameter was removed in 3.0. + +In order to check for a previous revision id when updating, replacing or removing +documents please use the `If-Match` HTTP header as described above. When no revision +check if required the HTTP header can be omitted, and the operations will work on the +current revision of the document, regardless of its revision id. + +### All documents API + +The HTTP API for retrieving the ids, keys or URLs of all documents from a collection +was previously located at GET `/_api/document?collection=...`. This API was moved to +PUT `/_api/simple/all-keys` and is now executed as an AQL query. +The name of the collection must now be passed in the HTTP request body instead of in +the request URL. The same is true for the "type" parameter, which controls the type of +the result to be created. + +Calls to the previous API can be translated as follows: + +- old: GET `/_api/document?collection=<collection>&type=<type>` without HTTP request body +- 3.0: PUT `/_api/simple/all-keys` with HTTP request body `{"collection":"<collection>","type":"id"}` + +The result format of this API has also changed slightly. In previous versions calls to +the API returned a JSON object with a `documents` attribute. As the functionality is +based on AQL internally in 3.0, the API now returns a JSON object with a `result` attribute. + +### Edges API + +#### CRUD operations on edges + +The API for documents and edges have been unified in ArangoDB 3.0. The CRUD operations +for documents and edges are now handled by the same endpoint at `/_api/document`. For +CRUD operations there is no distinction anymore between documents and edges API-wise. + +That means CRUD operations concerning edges need to be sent to the HTTP endpoint +`/_api/document` instead of `/_api/edge`. Sending requests to `/_api/edge` will +result in an HTTP 404 error in 3.0. The following methods are available at +`/_api/document` for documents and edge: + +- HTTP POST: insert new document or edge +- HTTP GET: fetch an existing document or edge +- HTTP PUT: replace an existing document or edge +- HTTP PATCH: partially update an existing document or edge +- HTTP DELETE: remove an existing document or edge + +When completely replacing an edge via HTTP PUT please note that the replacing edge +data now needs to contain the `_from` and `_to` attributes for the edge. Previous +versions of ArangoDB did not require sending `_from` and `_to` when replacing edges, +as `_from` and `_to` values were immutable for existing edges. + +The `_from` and `_to` attributes of edges now also need to be present inside the +edges objects sent to the server: + +``` +curl -X POST \ + --data '{"value":1,"_from":"myVertexCollection/1","_to":"myVertexCollection/2"}' \ + "http://127.0.0.1:8529/_api/document?collection=myEdgeCollection" +``` + +Previous versions of ArangoDB required the `_from` and `_to` attributes of edges be +sent separately in URL parameter `from` and `to`: + +``` +curl -X POST \ + --data '{"value":1}' \ + "http://127.0.0.1:8529/_api/edge?collection=e&from=myVertexCollection/1&to=myVertexCollection/2" +``` + +#### Querying connected edges + +The REST API for querying connected edges at GET `/_api/edges/<collection>` will now +make the edge ids unique before returning the connected edges. This is probably desired anyway +as results will now be returned only once per distinct input edge id. However, it may break +client applications that rely on the old behavior. + +#### Graph API + +Some data-modification operations in the named graphs API at `/_api/gharial` now return either +HTTP 202 (Accepted) or HTTP 201 (Created) if the operation succeeds. Which status code is returned +depends on the `waitForSync` attribute of the affected collection. In previous versions some +of these operations return HTTP 200 regardless of the `waitForSync` value. + +The deprecated graph API `/_api/graph` has been removed. +All it's features can be replaced using `/_api/gharial` and AQL instead. + +### Simple queries API + +The REST routes PUT `/_api/simple/first` and `/_api/simple/last` have been removed +entirely. These APIs were responsible for returning the first-inserted and +last-inserted documents in a collection. This feature was built on cap constraints +internally, which have been removed in 3.0. + +Calling one of these endpoints in 3.0 will result in an HTTP 404 error. + +### Indexes API + +It is not supported in 3.0 to create an index with type `cap` (cap constraint) in +3.0 as the cap constraints feature has bee removed. Calling the index creation +endpoint HTTP API POST `/_api/index?collection=...` with an index type `cap` will +therefore result in an HTTP 400 error. + +### Log entries API + +The REST route HTTP GET `/_admin/log` is now accessible from within all databases. In +previous versions of ArangoDB, this route was accessible from within the `_system` +database only, and an HTTP 403 (Forbidden) was thrown by the server for any access +from within another database. + +### Figures API + +The REST route HTTP GET `/_api/collection/<collection>/figures` will not return the +following result attributes as they became meaningless in 3.0: + +- shapefiles.count +- shapes.fileSize +- shapes.count +- shapes.size +- attributes.count +- attributes.size + +### Databases and Collections APIs + +When creating a database via the API POST `/_api/database`, ArangoDB will now always +return the HTTP status code 202 (created) if the operation succeeds. Previous versions +of ArangoDB returned HTTP 202 as well, but this behavior was changeable by sending an +HTTP header `x-arango-version: 1.4`. When sending this header, previous versions of +ArangoDB returned an HTTP status code 200 (ok). Clients can still send this header to +ArangoDB 3.0 but this will not influence the HTTP status code produced by ArangoDB. + +The "location" header produced by ArangoDB 3.0 will now always contain the database +name. This was also the default in previous versions of ArangoDB, but the behavior +could be overridden by sending the HTTP header `x-arango-version: 1.4`. Clients can +still send the header, but this will not make the database name in the "location" +response header disappear. + +The result format for querying all collections via the API GET `/_api/collection` +has been changed. + +Previous versions of ArangoDB returned an object with an attribute named `collections` +and an attribute named `names`. Both contained all available collections, but +`collections` contained the collections as an array, and `names` contained the +collections again, contained in an object in which the attribute names were the +collection names, e.g. + +``` +{ + "collections": [ + {"id":"5874437","name":"test","isSystem":false,"status":3,"type":2}, + {"id":"17343237","name":"something","isSystem":false,"status":3,"type":2}, + ... + ], + "names": { + "test": {"id":"5874437","name":"test","isSystem":false,"status":3,"type":2}, + "something": {"id":"17343237","name":"something","isSystem":false,"status":3,"type":2}, + ... + } +} +``` +This result structure was redundant, and therefore has been simplified to just + +``` +{ + "result": [ + {"id":"5874437","name":"test","isSystem":false,"status":3,"type":2}, + {"id":"17343237","name":"something","isSystem":false,"status":3,"type":2}, + ... + ] +} +``` + +in ArangoDB 3.0. + +### Replication APIs + +The URL parameter "failOnUnknown" was removed from the REST API GET `/_api/replication/dump`. +This parameter controlled whether dumping or replicating edges should fail if one +of the vertex collections linked in the edge's `_from` or `_to` attributes was not +present anymore. In this case the `_from` and `_to` values could not be translated into +meaningful ids anymore. + +There were two ways for handling this: +- setting `failOnUnknown` to `true` caused the HTTP request to fail, leaving error + handling to the user +- setting `failOnUnknown` to `false` caused the HTTP request to continue, translating + the collection name part in the `_from` or `_to` value to `_unknown`. + +In ArangoDB 3.0 this parameter is obsolete, as `_from` and `_to` are stored as self-contained +string values all the time, so they cannot get invalid when referenced collections are +dropped. + +The result format of the API GET `/_api/replication/logger-follow` has changed slightly in +the following aspects: + +- documents and edges are reported in the same way. The type for document insertions/updates + and edge insertions/updates is now always `2300`. Previous versions of ArangoDB returned + a `type` value of `2300` for documents and `2301` for edges. +- records about insertions, updates or removals of documents and edges do not have the + `key` and `rev` attributes on the top-level anymore. Instead, `key` and `rev` can be + accessed by peeking into the `_key` and `_rev` attributes of the `data` sub-attributes + of the change record. + +The same is true for the collection-specific changes API GET `/_api/replication/dump`. + +### User management APIs + +The REST API endpoint POST `/_api/user` for adding new users now requires the request to +contain a JSON object with an attribute named `user`, containing the name of the user to +be created. Previous versions of ArangoDB also checked this attribute, but additionally +looked for an attribute `username` if the `user` attribute did not exist. + +### Undocumented HTTP APIs + +The following undocumented HTTP REST endpoints have been removed from ArangoDB's REST +API: + +- `/_open/cerberus` and `/_system/cerberus`: these endpoints were intended for some + ArangoDB-internal applications only +- PUT `/_api/simple/by-example-hash`, PUT `/_api/simple/by-example-skiplist` and + PUT `/_api/simple/by-condition-skiplist`: these methods were documented in early + versions of ArangoDB but have been marked as not intended to be called by end + users since ArangoDB version 2.3. These methods should not have been part of any + ArangoDB manual since version 2.4. +- `/_api/structure`: an older unfinished and unpromoted API for data format and type + checks, superseded by Foxx applications. + +### Administration APIs + +- `/_admin/shutdown` now needs to be called with the HTTP DELETE method + +### Handling of CORS requests + +It can now be controlled in detail for which origin hosts CORS (Cross-origin resource +sharing) requests with credentials will be allowed. ArangoDB 3.0 provides the startup +option `--http.trusted-origin` that can be used to specify one or many origins from +which CORS requests are treated as "trustworthy". + +The option can be specified multiple times, once per trusted origin, e.g. + +``` +--http.trusted-origin http://127.0.0.1:8529 --http.trusted-origin https://127.0.0.1:8599 +``` + +This will make the ArangoDB server respond to CORS requests from these origins with an +`Access-Control-Allow-Credentials` HTTP header with a value of `true`. Web browsers can +inspect this header and can allow passing ArangoDB web interface credentials (if stored +in the browser) to the requesting site. ArangoDB will not forward or provide any credentials. + +Setting this option is only required if applications on other hosts need to access the +ArangoDB web interface or other HTTP REST APIs from a web browser with the same credentials +that the user has entered when logging into the web interface. When a web browser finds +the `Access-Control-Allow-Credentials` HTTP response header, it may forward the credentials +entered into the browser for the ArangoDB web interface login to the other site. + +This is a potential security issue, so there are no trusted origins by default. It may +be required to set some trusted origins if you're planning to issue AJAX requests to ArangoDB +from other sites from the browser, with the credentials entered during the ArangoDB interface +login (i.e. single sign-on). If such functionality is not used, the option should not +be set. + +To specify a trusted origin, specify the option once per trusted origin as shown above. +Note that the trusted origin values specified in this option will be compared bytewise +with the `Origin` HTTP header value sent by clients, and only exact matches will pass. + +There is also the wildcard `all` for enabling CORS access from all origins in a +test or development setup: + +``` +--http.trusted-origin all +``` + +Setting this option will lead to the ArangoDB server responding with an +`Access-Control-Allow-Credentials: true` HTTP header to all incoming CORS requests. + +## Command-line options + +Quite a few startup options in ArangoDB 2 were double negations (like +`--server.disable-authentication false`). In ArangoDB 3 these are now expressed as +positives (e. g. `--server.authentication`). Also the options between the ArangoDB +server and its client tools have being unified. For example, the logger options are +now the same for the server and the client tools. Additionally many options have +been moved into more appropriate topic sections. + +### Renamed options + +The following options have been available before 3.0 and have changed their name +in 3.0: + +- `--server.disable-authentication` was renamed to `--server.authentication`. + Note that the meaning of the option `--server.authentication` is the opposite of + the previous `--server.disable-authentication`. +- `--server.disable-authentication-unix-sockets` was renamed to + `--server.authentication-unix-sockets`. Note that the meaning of the option + `--server.authentication-unix-sockets` is the opposite of the previous + `--server.disable-authentication-unix-sockets`. +- `--server.authenticate-system-only` was renamed to `--server.authentication-system-only`. + The meaning of the option in unchanged. +- `--server.disable-statistics` was renamed to `--server.statistics`. Note that the + meaning of the option `--server.statistics` is the opposite of the previous + `--server.disable-statistics`. +- `--server.cafile` was renamed to `--ssl.cafile`. The meaning of the option is + unchanged. +- `--server.keyfile` was renamed to `--ssl.keyfile`. The meaning of the option is + unchanged. +- `--server.ssl-cache` was renamed to `--ssl.session-cache`. The meaning of the option + is unchanged. +- `--server.ssl-cipher-list` was renamed to `--ssl.cipher-list`. The meaning of the + option is unchanged. +- `--server.ssl-options` was renamed to `--ssl.options`. The meaning of the option + is unchanged. +- `--server.ssl-protocol` was renamed to `--ssl.protocol`. The meaning of the option + is unchanged. +- `--server.backlog-size` was renamed to `--tcp.backlog-size`. The meaning of the + option is unchanged. +- `--server.reuse-address` was renamed to `--tcp.reuse-address`. The meaning of the + option is unchanged. +- `--server.disable-replication-applier` was renamed to `--database.replication-applier`. + The meaning of the option `--database.replication-applier` is the opposite of the + previous `--server.disable-replication-applier`. +- `--server.allow-method-override` was renamed to `--http.allow-method-override`. The + meaning of the option is unchanged. +- `--server.hide-product-header` was renamed to `--http.hide-product-header`. The + meaning of the option is unchanged. +- `--server.keep-alive-timeout` was renamed to `--http.keep-alive-timeout`. The + meaning of the option is unchanged. +- `--server.foxx-queues` was renamed to `--foxx.queues`. The meaning of the option + is unchanged. +- `--server.foxx-queues-poll-interval` was renamed to `--foxx.queues-poll-interval`. + The meaning of the option is unchanged. +- `--no-server` was renamed to `--server.rest-server`. Note that the meaning of the + option `--server.rest-server` is the opposite of the previous `--no-server`. +- `--database.query-cache-mode` was renamed to `--query.cache-mode`. The meaning of + the option is unchanged. +- `--database.query-cache-max-results` was renamed to `--query.cache-entries`. The + meaning of the option is unchanged. +- `--database.disable-query-tracking` was renamed to `--query.tracking`. The meaning + of the option `--query.tracking` is the opposite of the previous + `--database.disable-query-tracking`. +- `--log.tty` was renamed to `--log.foreground-tty`. The meaning of the option is + unchanged. +- `--upgrade` has been renamed to `--database.auto-upgrade`. In contrast to 2.8 this + option now requires a boolean parameter. To actually perform an automatic database + upgrade at startup use `--database.auto-upgrade true`. To not perform it, use + `--database.auto-upgrade false`. +- `--check-version` has been renamed to `--database.check-version`. +- `--temp-path` has been renamed to `--temp.path`. + +### Log verbosity, topics and output files + +Logging now supports log topics. You can control these by specifying a log +topic in front of a log level or an output. For example + +``` + --log.level startup=trace --log.level info +``` + +will log messages concerning startup at trace level, everything else at info +level. `--log.level` can be specified multiple times at startup, for as many +topics as needed. + +Some relevant log topics available in 3.0 are: + +- *collector*: information about the WAL collector's state +- *compactor*: information about the collection datafile compactor +- *datafiles*: datafile-related operations +- *mmap*: information about memory-mapping operations +- *performance*: some performance-related information +- *queries*: executed AQL queries +- *replication*: replication-related info +- *requests*: HTTP requests +- *startup*: information about server startup and shutdown +- *threads*: information about threads + +The new log option `--log.output <definition>` allows directing the global +or per-topic log output to different outputs. The output definition "<definition>" +can be one of + +- "-" for stdin +- "+" for stderr +- "syslog://<syslog-facility>" +- "syslog://<syslog-facility>/<application-name>" +- "file://<relative-path>" + +The option can be specified multiple times in order to configure the output +for different log topics. To set up a per-topic output configuration, use +`--log.output <topic>=<definition>`, e.g. + + queries=file://queries.txt + +logs all queries to the file "queries.txt". + +The old option `--log.file` is still available in 3.0 for convenience reasons. In +3.0 it is a shortcut for the more general option `--log.output file://filename`. + +The old option `--log.requests-file` is still available in 3.0. It is now a shortcut +for the more general option `--log.output requests=file://...`. + +The old option `--log.performance` is still available in 3.0. It is now a shortcut +for the more general option `--log.level performance=trace`. + +### Removed options for logging + +The options `--log.content-filter` and `--log.source-filter` have been removed. They +have most been used during ArangoDB's internal development. + +The syslog-related options `--log.application` and `--log.facility` have been removed. +They are superseded by the more general `--log.output` option which can also handle +syslog targets. + +### Removed other options + +The option `--server.default-api-compatibility` was present in earlier version of +ArangoDB to control various aspects of the server behavior, e.g. HTTP return codes +or the format of HTTP "location" headers. Client applications could send an HTTP +header "x-arango-version" with a version number to request the server behavior of +a certain ArangoDB version. + +This option was only honored in a handful of cases (described above) and was removed +in 3.0 because the changes in server behavior controlled by this option were changed +even before ArangoDB 2.0. This should have left enough time for client applications +to adapt to the new behavior, making the option superfluous in 3.0. + +### Thread options + +The options `--server.threads` and `--scheduler.threads` now have a default value of +`0`. When `--server.threads` is set to `0` on startup, the suitable number of +threads will be determined by ArangoDB by asking the OS for the number of available +CPUs and using that as a baseline. If the number of CPUs is lower than 4, ArangoDB +will still start 4 dispatcher threads. When `--scheduler.threads` is set to `0`, +then ArangoDB will automatically determine the number of scheduler threads to start. +This will normally create 2 scheduler threads. + +If the exact number of threads needs to be set by the admin, then it is still possible +to set `--server.threads` and `--scheduler.threads` to non-zero values. ArangoDB will +use these values and start that many threads (note that some threads may be created +lazily so they may not be present directly after startup). + +The number of V8 JavaScript contexts to be created (`--javascript.v8-contexts`) now +has a default value of `0` too, meaning that ArangoDB will create as many V8 contexts +as there will be dispatcher threads (controlled by the `--server.threads` option). +Setting this option to a non-zero value will create exactly as many V8 contexts as +specified. + +Setting these options explicitly to non-zero values may be beneficial in environments +that have few resources (processing time, maximum thread count, available memory). + +## Authentication + +The default value for `--server.authentication` is now `true` in the configuration +files shipped with ArangoDB. This means the server will be started with authentication +enabled by default, requiring all client connections to provide authentication data +when connecting to ArangoDB APIs. Previous ArangoDB versions used the setting +`--server.disable-authentication true`, effectively disabling authentication by default. + +The default value for `--server.authentication-system-only` is now `true` in ArangoDB. +That means that Foxx applications running in ArangoDB will be public accessible (at +least they will not use ArangoDB's builtin authentication mechanism). Only requests to +ArangoDB APIs at URL path prefixes `/_api/` and `/_admin` will require authentication. +To change that, and use the builtin authentication mechanism for Foxx applications too, +set `--server.authentication-system-only` to `false`, and make sure to have the option +`--server.authentication` set to `true` as well. + +Though enabling the authentication is recommended for production setups, it may be +overkill in a development environment. To turn off authentication, the option +`--server.authentication` can be set to `false` in ArangoDB's configuration file or +on the command-line. + +## Web Admin Interface + +The JavaScript shell has been removed from ArangoDB's web interface. The functionality +the shell provided is still fully available in the ArangoShell (arangosh) binary shipped +with ArangoDB. + +## ArangoShell and client tools + +The ArangoShell (arangosh) and the other client tools bundled with ArangoDB can only +connect to an ArangoDB server of version 3.0 or higher. They will not connect to an +ArangoDB 2.8. This is because the server HTTP APIs have changed between 2.8 and 3.0, +and all client tools uses these APIs. + +In order to connect to earlier versions of ArangoDB with the client tools, an older +version of the client tools needs to be kept installed. + +The preferred name for the template string generator function `aqlQuery` is now +`aql` and is automatically available in arangosh. Elsewhere, it can be loaded +like `const aql = require('@arangodb').aql`. + +### Command-line options added + +All client tools in 3.0 provide an option `--server.max-packet-size` for controlling +the maximum size of HTTP packets to be handled by the client tools. The default value +is 128 MB, as in previous versions of ArangoDB. In contrast to previous versions in +which the value was hard-coded, the option is now configurable. It can be increased to +make the client tools handle very large HTTP result messages sent by the server. + +### Command-line options changed + +For all client tools, the option `--server.disable-authentication` was renamed to +`--server.authentication`. Note that the meaning of the option `--server.authentication` +is the opposite of the previous `--server.disable-authentication`. + +The option `--server.ssl-protocol` was renamed to `--ssl.protocol`. The meaning of +the option is unchanged. + +The command-line option `--quiet` was removed from all client tools except arangosh +because it had no effect in them. + +### arangobench + +In order to make its purpose more apparent the former `arangob` client tool has +been renamed to `arangobench` in 3.0. + +## Miscellaneous changes + +The checksum calculation algorithm for the `collection.checksum()` method and its +corresponding REST API GET `/_api/collection/<collection</checksum` has changed in 3.0. +Checksums calculated in 3.0 will differ from checksums calculated with 2.8 or before. + +The ArangoDB server in 3.0 does not read a file `ENDPOINTS` containing a list of +additional endpoints on startup. In 2.8 this file was automatically read if present +in the database directory. + +The names of the sub-threads started by ArangoDB have changed in 3.0. This is relevant +on Linux only, where threads can be named and thread names may be visible to system +tools such as *top* or monitoring solutions. diff --git a/site/content/arangodb/oem/release-notes/version-3.0/whats-new-in-3-0.md b/site/content/arangodb/oem/release-notes/version-3.0/whats-new-in-3-0.md new file mode 100644 index 0000000000..3fb7c66594 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.0/whats-new-in-3-0.md @@ -0,0 +1,536 @@ +--- +title: Features and Improvements in ArangoDB 3.0 +menuTitle: What's New in 3.0 +weight: 5 +description: >- + Redesigned cluster core architecture, graph traversals using the AQL query + language, persistent indexes, overhauled Foxx microservices and web interface +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.0. ArangoDB 3.0 also contains several bugfixes that are not listed +here. + +## Internal data format changes + +ArangoDB now uses [VelocyPack](https://github.com/arangodb/velocypack) for +storing documents, query results and temporarily computed values. Using a single +data format removed the need for some data conversions in the core that slowed +operations down previously. + +The VelocyPack format is also quite compact, and reduces storage space +requirements for "small" values such as boolean, integers, short strings. This +can speed up several operations inside AQL queries. + +VelocyPack document entries stored on disk are also self-contained, in the sense +that each stored document will contain all of its data type and attribute name +descriptions. While this may require a bit more space for storing the documents, +it removes the overhead of fetching attribute names and document layout from +shared structures as in previous versions of ArangoDB. It also simplifies the +code paths for storing and reading documents. + +## AQL improvements + +### Syntax improvements + +#### `LIKE` string-comparison operator + +AQL now provides a `LIKE` operator and can be used to compare strings like this, +for example inside filter conditions: + +``` +value LIKE search +``` + +This change makes `LIKE` an AQL keyword. Using `LIKE` as an attribute or collection +name in AQL thus requires quoting the name from now on. + +The `LIKE` operator is currently implemented by calling the already existing AQL +function `LIKE`, which also remains operational in 3.0. Use the `LIKE` function +in case you want to search case-insensitive (optional parameter), as the `LIKE` +operator always compares case-sensitive. + +#### AQL array comparison operators + +All AQL comparison operators now also exist in an array variant. In the +array variant, the operator is preceded with one of the keywords `ALL`, `ANY` +or `NONE`. Using one of these keywords changes the operator behavior to +execute the comparison operation for all, any, or none of its left hand +argument values. It is therefore expected that the left hand argument +of an array operator is an array. + +Examples: + +``` +[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false +[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true +[ 1, 2, 3 ] NONE IN [ 3 ] // false +[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true +[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false +[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true +[ 1, 2, 3 ] ANY == 2 // true +[ 1, 2, 3 ] ANY == 4 // false +[ 1, 2, 3 ] ANY > 0 // true +[ 1, 2, 3 ] ANY <= 1 // true +[ 1, 2, 3 ] NONE < 99 // false +[ 1, 2, 3 ] NONE > 10 // true +[ 1, 2, 3 ] ALL > 2 // false +[ 1, 2, 3 ] ALL > 0 // true +[ 1, 2, 3 ] ALL >= 3 // false +["foo", "bar"] ALL != "moo" // true +["foo", "bar"] NONE == "bar" // false +["foo", "bar"] ANY == "foo" // true +``` + +#### Regular expression string-comparison operators + +AQL now supports the operators *=~* and *!~* for testing strings against regular +expressions. *=~* tests if a string value matches a regular expression, and *!~* tests +if a string value does not match a regular expression. + +The two operators expect their left-hand operands to be strings, and their right-hand +operands to be strings containing valid regular expressions as specified below. + +The regular expressions may consist of literal characters and the following +characters and sequences: + +- `.` – the dot matches any single character except line terminators. + To include line terminators, use `[\s\S]` instead to simulate `.` with *DOTALL* flag. +- `\d` – matches a single digit, equivalent to `[0-9]` +- `\s` – matches a single whitespace character +- `\S` – matches a single non-whitespace character +- `\t` – matches a tab character +- `\r` – matches a carriage return +- `\n` – matches a line-feed character +- `[xyz]` – set of characters. matches any of the enclosed characters (i.e. + *x*, *y* or *z* in this case +- `[^xyz]` – negated set of characters. matches any other character than the + enclosed ones (i.e. anything but *x*, *y* or *z* in this case) +- `[x-z]` – range of characters. Matches any of the characters in the + specified range, e.g. `[0-9A-F]` to match any character in + *0123456789ABCDEF* +- `[^x-z]` – negated range of characters. Matches any other character than the + ones specified in the range +- `(xyz)` – defines and matches a pattern group +- `(x|y)` – matches either *x* or *y* +- `^` – matches the beginning of the string (e.g. `^xyz`) +- `$` – matches the end of the string (e.g. `xyz$`) + +Note that the characters `.`, `*`, `?`, `[`, `]`, `(`, `)`, `{`, `}`, `^`, +and `$` have a special meaning in regular expressions and may need to be +escaped using a backslash (`\\`). A literal backslash should also be escaped +using another backslash, i.e. `\\\\`. + +Characters and sequences may optionally be repeated using the following +quantifiers: + +- `x*` – matches zero or more occurrences of *x* +- `x+` – matches one or more occurrences of *x* +- `x?` – matches one or zero occurrences of *x* +- `x{y}` – matches exactly *y* occurrences of *x* +- `x{y,z}` – matches between *y* and *z* occurrences of *x* +- `x{y,}` – matches at least *y* occurrences of *x* + +#### Enclosing identifiers in forward ticks + +AQL identifiers can now optionally be enclosed in forward ticks in addition to using +backward ticks. This allows convenient writing of AQL queries in JavaScript template +strings (which are delimited with backticks themselves), e.g. + +```js +var q = `FOR doc IN ´collection´ RETURN doc.´name´`; +``` + +### Functions added + +The following AQL functions have been added in 3.0: + +- *REGEX_TEST(value, regex)*: tests whether the string *value* matches the regular expression + specified in *regex*. Returns *true* if it matches, and *false* otherwise. + + The syntax for regular expressions is the same as for the regular expression operators + *=~* and *!~*. + +- *HASH(value)*: Calculates a hash value for *value*. *value* is not required to be a + string, but can have any data type. The calculated hash value will take the data type + of *value* into account, so for example the number *1* and the string *"1"* will have + different hash values. For arrays the hash values will be created if the arrays contain + exactly the same values (including value types) in the same order. For objects the same + hash values will be created if the objects have exactly the same attribute names and + values (including value types). The order in which attributes appear inside objects + is not important for hashing. + The hash value returned by this function is a number. The hash algorithm is not guaranteed + to remain the same in future versions of ArangoDB. The hash values should therefore be + used only for temporary calculations, e.g. to compare if two documents are the same, or + for grouping values in queries. + +- *TYPENAME(value)*: Returns the data type name of *value*. The data type name can + be either *null*, *bool*, *number*, *string*, *array* or *object*. + +- *LOG(value)*: Returns the natural logarithm of *value*. The base is Euler's constant + (2.71828...). + +- *LOG2(value)*: Returns the base 2 logarithm of *value*. + +- *LOG10(value)*: Returns the base 10 logarithm of *value*. + +- *EXP(value)*: Returns Euler's constant (2.71828...) raised to the power of *value*. + +- *EXP2(value)*: Returns 2 raised to the power of *value*. + +- *SIN(value)*: Returns the sine of *value*. + +- *COS(value)*: Returns the cosine of *value*. + +- *TAN(value)*: Returns the tangent of *value*. + +- *ASIN(value)*: Returns the arcsine of *value*. + +- *ACOS(value)*: Returns the arccosine of *value*. + +- *ATAN(value)*: Returns the arctangent of *value*. + +- *ATAN2(y, x)*: Returns the arctangent of the quotient of *y* and *x*. + +- *RADIANS(value)*: Returns the angle converted from degrees to radians. + +- *DEGREES(value)*: Returns the angle converted from radians to degrees. + +### Optimizer improvements + +#### "inline-subqueries" rule + +The AQL optimizer rule "inline-subqueries" has been added. This rule can pull +out certain subqueries that are used as an operand to a `FOR` loop one level +higher, eliminating the subquery completely. This reduces complexity of the +query's execution plan and will likely enable further optimizations. For +example, the query + +``` +FOR i IN ( + FOR j IN [1,2,3] + RETURN j + ) + RETURN i +``` + +will be transformed by the rule to: + +``` +FOR i IN [1,2,3] + RETURN i +``` + +The query + +``` +FOR name IN ( + FOR doc IN _users + FILTER doc.status == 1 + RETURN doc.name + ) + LIMIT 2 + RETURN name +``` + +will be transformed into + +``` +FOR tmp IN _users + FILTER tmp.status == 1 + LIMIT 2 + RETURN tmp.name +``` + +The rule will only fire when the subquery is used as an operand to a `FOR` loop, +and if the subquery does not contain a `COLLECT` with an `INTO` variable. + +#### "remove-unnecessary-calculations" rule + +The AQL optimizer rule "remove-unnecessary-calculations" now fires in more cases +than in previous versions. This rule removes calculations from execution plans, +and by having less calculations done, a query may execute faster or requires +less memory. + +The rule will now remove calculations that are used exactly once in other +expressions (e.g. `LET a = doc RETURN a.value`) and calculations, or calculations +that are just references to other variables (e.g. `LET a = b`). + +#### "optimize-traversals" rule + +The AQL optimizer rule "merge-traversal-filter" was renamed to "optimize-traversals". +The rule will remove unused edge and path result variables from the traversal in case +they are specified in the `FOR` section of the traversal, but not referenced later in +the query. This saves constructing edges and paths results that are not used later. + +AQL now uses VelocyPack internally for storing intermediate values. For many value types +it can now get away without extra memory allocations and less internal conversions. +Values can be passed into internal AQL functions without copying them. This can lead to +reduced query execution times for queries that use C++-based AQL functions. + +#### "replace-or-with-in" and "use-index-for-sort" rules + +These rules now fire in some additional cases, which allows simplifying index lookup +conditions and removing SortNodes from execution plans. + +## Cluster state management + +The cluster's internal state information is now also managed by ArangoDB instances. +Earlier versions relied on third party software being installed for the storing the +cluster state. +The state is managed by dedicated ArangoDB instances, which can be started in a special +*agency* mode. These instances can operate in a distributed fashion. They will +automatically elect one of them to become their leader, being responsible for storing +the state changes sent from servers in the cluster. The other instances will automatically +follow the leader and will transparently stand in should it become unavailable. +The Agency instances are also self-organizing: they will continuously probe each +other and re-elect leaders. The communication between the Agency instances use the +consensus-based RAFT protocol. + +The operations for storing and retrieving cluster state information are now much less +expensive from an ArangoDB cluster node perspective, which in turn allows for faster +cluster operations that need to fetch or update the overall cluster state. + +## `_from` and `_to` attributes of edges are updatable and usable in indexes + +In ArangoDB prior to 3.0 the attributes `_from` and `_to` of edges were treated +specially when loading or storing edges. That special handling led to these attributes +being not as flexible as regular document attributes. For example, the `_from` and +`_to` attribute values of an existing edge could not be updated once the edge was +created. Now this is possible via the single-document APIs and via AQL. + +Additionally, the `_from` and `_to` attributes could not be indexed in +user-defined indexes, e.g. to make each combination of `_from` and `_to` unique. +Finally, as `_from` and `_to` referenced the linked collections by collection id +and not by collection name, their meaning became unclear once a referenced collection +was dropped. The collection id stored in edges then became unusable, and when +accessing such edge the collection name part of it was always translated to `_undefined`. + +In ArangoDB 3.0, the `_from` and `_to` values of edges are saved as regular strings. +This allows using `_from` and `_to` in user-defined indexes. Additionally, this allows +to update the `_from` and `_to` values of existing edges. Furthermore, collections +referenced by `_from` and `_to` values may be dropped and re-created later. Any +`_from` and `_to` values of edges pointing to such dropped collection are unaffected +by the drop operation now. + +## Unified APIs for CRUD operations + +The CRUD APIs for documents and edge have been unified. Edges can now be inserted +and modified via the same APIs as documents. `_from` and `_to` attribute values can +be passed as regular document attributes now: + +```js +db.myedges.insert({ _from: "myvertices/some", _to: "myvertices/other", ... }); +``` + +Passing `_from` and `_to` separately as it was required in earlier versions is not +necessary anymore but will still work: + +```js +db.myedges.insert("myvertices/some", "myvertices/other", { ... }); +``` + +The CRUD operations now also support batch variants that works on arrays of +documents/edges, e.g. + +```js +db.myedges.insert([ + { _from: "myvertices/some", _to: "myvertices/other", ... }, + { _from: "myvertices/who", _to: "myvertices/friend", ... }, + { _from: "myvertices/one", _to: "myvertices/two", ... }, +]); +``` + +The batch variants are also available in ArangoDB's HTTP API. They can be used to +more efficiently carry out operations with multiple documents than their single-document +equivalents, which required one HTTP request per operation. With the batch operations, +the HTTP request/response overhead can be amortized across multiple operations. + +## Persistent indexes + +ArangoDB 3.0 provides an experimental persistent index feature. Persistent indexes store +the index values on disk instead of in-memory only. This means the indexes do not need +to be rebuilt in-memory when a collection is loaded or reloaded, which should improve +collection loading times. + +The persistent indexes in ArangoDB are based on the RocksDB engine. +To create a persistent index for a collection, create an index of type "rocksdb" as +follows: + +```js +db.mycollection.ensureIndex({ type: "rocksdb", fields: [ "fieldname" ]}); +``` + +The persistent indexes are sorted, so they allow equality lookups and range queries. +Note that the feature is still highly experimental and has some known deficiencies. It +will be finalized until the release of the 3.0 stable version. + +## Upgraded V8 version + +The V8 engine that is used inside ArangoDB to execute JavaScript code has been upgraded from +version 4.3.61 to 5.0.71.39. The new version makes several more ES6 features available by +default, including + +- arrow functions +- computed property names +- rest parameters +- array destructuring +- numeric and object literals + +## Web Admin Interface + +The ArangoDB 3.0 web interface is significantly improved. It now comes with a more +responsive design, making it easier to use on different devices. Navigation and menus +have been simplified, and related items have been regrouped to stay closer together +and allow tighter workflows. + +The AQL query editor is now much easier to use. Multiple queries can be started and tracked +in parallel, while results of earlier queries are still preserved. Queries still running +can be canceled directly from the editor. The AQL query editor now allows the usage of bind +parameters too, and provides a helper for finding collection names, AQL function names and +keywords quickly. + +The web interface now keeps track of whether the server is offline and of which server-side +operations have been started and are still running. It now remains usable while such +longer-running operations are ongoing. It also keeps more state about user's choices (e.g. +windows sizes, whether the tree or the code view was last used in the document editor). + +Cluster statistics are now integrated into the web interface as well. Additionally, a +menu item "Help us" has been added to easily provide the Arango team feedback about +the product. + +{{< comment >}} NOTE: This feature doesn't work properly anymore! + +The frontend may now be mounted behind a reverse proxy on a different path. For this to work +the proxy should send a X-Script-Name header containing the path. + +A backend configuration for haproxy might look like this: + +``` +reqadd X-Script-Name:\ /arangodb +``` + +The frontend will recognize the subpath and produce appropriate links. ArangoDB will only +accept paths from trusted frontend proxies. Trusted proxies may be added on startup: + +``` +--frontend.proxy-request-check true --frontend.trusted-proxy 192.168.1.117 +``` + +--frontend.trusted-proxy may be any address or netmask. + +To disable the check and blindly accept any x-script-name set --frontend.proxy-request-check +to false. +{{< /comment >}} + +## Foxx improvements + +The Foxx framework has been completely rewritten for 3.0 with a new, simpler and +more familiar API. The most notable changes are: + +- Legacy mode for 2.8 services + + Stuck with old code? You can continue using your 2.8-compatible Foxx services with + 3.0 by adding `"engines": {"arangodb": "^2.8.0"}` (or similar version ranges that + exclude 3.0 and up) to the service manifest. + +- No more global variables and magical comments + + The `applicationContext` is now `module.context`. Instead of magical comments just + use the `summary` and `description` methods to document your routes. + +- Repository and Model have been removed + + Instead of repositories just use ArangoDB collections directly. For validation simply + use the joi schemas (but wrapped in `joi.object()`) that previously lived inside the + model. Collections and queries return plain JavaScript objects. + +- Controllers have been replaced with nestable routers + + Create routers with `require('@arangodb/foxx/router')()`, attach them to your service + with `module.context.use(router)`. Because routers are no longer mounted automagically, + you can export and import them like any other object. Use `router.use('/path', subRouter)` + to nest routers as deeply as you want. + +- Routes can be named and reversed + + No more memorizing URLs: add a name to your route like + `router.get('/hello/:name', function () {...}, 'hello')` and redirect to the full URL + with `res.redirect(req.resolve('hello', {name: 'world'}))`. + +- Simpler express-like middleware + + If you already know express, this should be familiar. Here's a request logger in + three lines of code: + + ```js + router.use(function (req, res, next) { + var start = Date.now(); + try {next();} + finally {console.log(`${req.method} ${req.url} ${res.statusCode} ${Date.now() - start}ms`);} + }); + ``` + +- Sessions and auth without dependencies + + To make it easier to get started, the functionality previously provided by the + `simple-auth`, `oauth2`, `sessions-local` and `sessions-jwt` services have been moved + into Foxx as the `@arangodb/foxx/auth`, `@arangodb/foxx/oauth2` and `@arangodb/foxx/sessions` + modules. + +## Logging + +ArangoDB's logging is now grouped into topics. The log verbosity and output files can +be adjusted per log topic. For example + +``` +--log.level startup=trace --log.level queries=trace --log.level info +``` + +will log messages concerning startup at trace level, AQL queries at trace level and +everything else at info level. `--log.level` can be specified multiple times at startup, +for as many topics as needed. + +Some relevant log topics available in 3.0 are: + +- *collector*: information about the WAL collector's state +- *compactor*: information about the collection datafile compactor +- *datafiles*: datafile-related operations +- *mmap*: information about memory-mapping operations (including msync) +- *queries*: executed AQL queries, slow queries +- *replication*: replication-related info +- *requests*: HTTP requests +- *startup*: information about server startup and shutdown +- *threads*: information about threads + +This also allows directing log output to different files based on topics. For +example, to log all AQL queries to a file "queries.log" one can use the options: + +``` +--log.level queries=trace --log.output queries=file:///path/to/queries.log +``` + +To additionally log HTTP request to a file named "requests.log" add the options: + +``` +--log.level requests=info --log.output requests=file:///path/to/requests.log +``` + +## Build system + +ArangoDB now uses the cross-platform build system CMake for all its builds. +Previous versions used two different build systems, making development and +contributions harder than necessary. Now the build system is unified, and +all targets (Linux, Windows, macOS) are built from the same set of build +instructions. + +## Documentation + +The documentation has been enhanced and re-organized to be more intuitive. + +A new introduction for beginners should bring you up to speed with ArangoDB +in less than an hour. Additional topics have been introduced and will be +extended with upcoming releases. + +The topics AQL and HTTP API are now separated from the manual for better +searchability and less confusion. A version switcher makes it easier to +jump to the version of the docs you are interested in. diff --git a/site/content/arangodb/oem/release-notes/version-3.1/_index.md b/site/content/arangodb/oem/release-notes/version-3.1/_index.md new file mode 100644 index 0000000000..f076955a62 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.1/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.1 +menuTitle: Version 3.1 +weight: 98 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.1/incompatible-changes-in-3-1.md b/site/content/arangodb/oem/release-notes/version-3.1/incompatible-changes-in-3-1.md new file mode 100644 index 0000000000..adf88b7caa --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.1/incompatible-changes-in-3-1.md @@ -0,0 +1,137 @@ +--- +title: Incompatible changes in ArangoDB 3.1 +menuTitle: Incompatible changes in 3.1 +weight: 10 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Communication Layer + +The internal communication layer is now based on Boost ASIO. A few options +regarding threads and communication have been changed. + +There are no longer two different threads pools (`--scheduler.threads` and +`--server.threads`). The option `--scheduler.threads` has been removed. The +number of threads is now controlled by the option `--server.threads` only. +By default `--server.threads` is set to the number of hyper-cores. + +As a consequence of the change, the following (hidden) startup options have +been removed: + +- `--server.extra-threads` +- `--server.aql-threads` +- `--server.backend` +- `--server.show-backends` +- `--server.thread-affinity` + +## AQL + +The behavior of the AQL array comparison operators has changed for empty arrays: + +- `ALL` and `ANY` now always return `false` when the left-hand operand is an + empty array. The behavior for non-empty arrays does not change: + - `[] ALL == 1` will return `false` + - `[1] ALL == 1` will return `true` + - `[1, 2] ALL == 1` will return `false` + - `[2, 2] ALL == 1` will return `false` + - `[] ANY == 1` will return `false` + - `[1] ANY == 1` will return `true` + - `[1, 2] ANY == 1` will return `true` + - `[2, 2] ANY == 1` will return `false` + +- `NONE` now always returns `true` when the left-hand operand is an empty array. + The behavior for non-empty arrays does not change: + - `[] NONE == 1` will return `true` + - `[1] NONE == 1` will return `false` + - `[1, 2] NONE == 1` will return `false` + - `[2, 2] NONE == 1` will return `true` + +- `WITH` in cluster traversals is now mandatory in order to avoid deadlocks. + +## Data format changes + +The attribute `maximalSize` has been renamed to `journalSize` in collection +meta-data files ("parameter.json"). Files containing the `maximalSize` attribute +will still be picked up correctly for not-yet adjusted collections. + +The format of the revision values stored in the `_rev` attribute of documents +has been changed in 3.1. Up to 3.0 they were strings containing largish decimal numbers. With 3.1, revision values are still strings, but are actually encoded time stamps of the creation date of the revision of the document. The time stamps are acquired using a hybrid logical clock (HLC) on the DB-Server that holds the +revision (for the concept of a hybrid logical clock see +[this paper](http://www.cse.buffalo.edu/tech-reports/2014-04.pdf)). +See [this manual section](../../concepts/data-structure/documents/_index.md#document-revisions) for details. + +ArangoDB >= 3.1 can ArangoDB 3.0 database directories and will simply continue +to use the old `_rev` attribute values. New revisions will be written with +the new time stamps. + +It is highly recommended to backup all your data before loading a database +directory that was written by ArangoDB <= 3.0 into an ArangoDB >= 3.1. + +To change all your old `_rev` attributes into new style time stamps you +have to use `arangodump` to dump all data out (using ArangoDB 3.0), and +use `arangorestore` into the new ArangoDB 3.1, which is the safest +way to upgrade. + +The change also affects the return format of `_rev` values and other revision +values in HTTP APIs (see below). + +## HTTP API changes + +### APIs added + +The following HTTP REST APIs have been added for online log level adjustment of +the server: + +- GET `/_admin/log/level` returns the current log level settings +- PUT `/_admin/log/level` modifies the current log level settings + +### APIs changed + +- the following REST APIs that return revision ids now make use of the new revision + id format introduced in 3.1. All revision ids returned will be strings as in 3.0, but + have a different internal format. + + The following APIs are affected: + - GET /_api/collection/{collection}/checksum: `revision` attribute + - GET /_api/collection/{collection}/revision: `revision` attribute + - all other APIs that return documents, which may include the documents' `_rev` attribute + + Client applications should not try to interpret the internals of revision values, but only + use revision values for checking whether two revision strings are identical. + +- the replication REST APIs will now use the attribute name `journalSize` instead of + `maximalSize` when returning information about collections. + +- the default value for `keepNull` has been changed from `false` to `true` for + the following partial update operations for vertices and edges in /_api/gharial: + + - PATCH /_api/gharial/{graph}/vertex/{collection}/{key} + - PATCH /_api/gharial/{graph}/edge/{collection}/{key} + + The value for `keepNull` can still be set explicitly to `false` by setting the + URL parameter `keepNull` to a value of `false`. + +- the REST API for dropping collections (DELETE /_api/collection) now accepts an + optional query string parameter `isSystem`, which can set to `true` in order to + drop system collections. If the parameter is not set or not set to true, the REST + API will refuse to drop system collections. In previous versions of ArangoDB, the + `isSystem` parameter did not exist, and there was no distinction between system + and non-system collections when dropping collections. + +- the REST API for retrieving AQL query results (POST /_api/cursor) will now return an + additional sub-attribute `loading collections` that will contain the total time + required for loading and locking collections during the AQL query when profiling is + enabled. The attribute can be found in the `extra` result attribute in sub-attribute + `loading collections`. The attribute will only be set if profiling was enabled for + the query. + +- the REST API for retrieving AQL query results (POST /_api/cursor) will now accept the optional attribute `memoryLimit`. + +## Foxx Testing + +The QUnit interface to Mocha has been removed. This affects the behavior of the `suite`, `test`, `before`, `after`, `beforeEach` and `afterEach` functions in Foxx test suites. The `suite` and `test` functions are now provided by the TDD interface. The `before`, `after`, `beforeEach` and `afterEach` functions are now provided by the BDD interface. + +This should not cause any problems with existing tests but may result in failures in test cases that previously passed for the wrong reasons. Specifically the execution order of the `before`, `after`, etc functions now follows the intended order and is no longer arbitrary. + +For details on the expected behavior of these functions see the [testing chapter](../../develop/foxx-microservices/guides/testing-foxx-services.md) in the Foxx documentation. diff --git a/site/content/arangodb/oem/release-notes/version-3.1/whats-new-in-3-1.md b/site/content/arangodb/oem/release-notes/version-3.1/whats-new-in-3-1.md new file mode 100644 index 0000000000..f87f2895ca --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.1/whats-new-in-3-1.md @@ -0,0 +1,222 @@ +--- +title: Features and Improvements in ArangoDB 3.1 +menuTitle: What's New in 3.1 +weight: 5 +description: >- + Vertex-centric indexes, a new managed graph type with smart sharding, + audit logging +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.1. ArangoDB 3.1 also contains several bugfixes that are not listed +here. + +## SmartGraphs + +ArangoDB 3.1 adds a first major Enterprise Edition feature called SmartGraphs. +SmartGraphs form an addition to the already existing graph features and allow to +scale graphs beyond a single machine while keeping almost the same query performance. +The SmartGraph feature is suggested for all graph database use cases that require +a cluster of DB-Servers for what ever reason. +You can either have a graph that is too large to be stored on a single machine only. +Or you can have a small graph, but at the same time need additional data with has to be +sharded and you want to keep all of them in the same environment. +Or you simply use the cluster for high-availability. +In all the above cases SmartGraphs will significantly increase the performance of +graph operations. +For more detailed information read the [SmartGraphs section](../../graphs/smartgraphs/_index.md). + +## Data format + +The format of the revision values stored in the `_rev` attribute of documents +has been changed in 3.1. Up to 3.0 they were strings containing largish decimal numbers. With 3.1, revision values are still strings, but are actually encoded time stamps of the creation date of the revision of the document. The time stamps are acquired using a hybrid logical clock (HLC) on the DB-Server that holds the +revision (for the concept of a hybrid logical clock see +[this paper](http://www.cse.buffalo.edu/tech-reports/2014-04.pdf)). +See [this manual section](../../concepts/data-structure/documents/_index.md#document-revisions) for details. + +ArangoDB >= 3.1 can ArangoDB 3.0 database directories and will simply continue +to use the old `_rev` attribute values. New revisions will be written with +the new time stamps. + +It is highly recommended to backup all your data before loading a database +directory that was written by ArangoDB <= 3.0 into an ArangoDB >= 3.1. + +## Communication Layer + +ArangoDB up to 3.0 used [libev](http://software.schmorp.de/pkg/libev.html) for +the communication layer. ArangoDB starting from 3.1 uses +[Boost ASIO](https://www.boost.org). + +Starting with ArangoDB 3.1 we begin to provide the VelocyStream Protocol (vst) as +a addition to the established http protocol. + +A few options have changed concerning communication, please checkout +[Incompatible changes in 3.1](incompatible-changes-in-3-1.md). + +## Cluster + +For its internal cluster communication a (bundled version) of curl is now being +used. This enables asynchronous operation throughout the cluster and should +improve general performance slightly. + +Authentication is now supported within the cluster. + +## Document revisions cache + +The ArangoDB server now provides an in-memory cache for frequently accessed +document revisions. Documents that are accessed during read/write operations +are loaded into the revisions cache automatically, and subsequently served from +there. + +The cache has a total target size, which can be controlled with the startup +option `--database.revision-cache-target-size`. Once the cache reaches the +target size, older entries may be evicted from the cache to free memory. Note that +the target size currently is a high water mark that will trigger cache memory +garbage collection if exceeded. However, if all cache chunks are still in use +when the high water mark is reached, the cache may still grow and allocate more +chunks until cache entries become unused and are allowed to be garbage-collected. + +The cache is maintained on a per-collection basis, that is, memory for the cache +is allocated on a per-collection basis in chunks. The size for the cache memory +chunks can be controlled via the startup option `--database.revision-cache-chunk-size`. +The default value is 4 MB per chunk. +Bigger chunk sizes allow saving more documents per chunk, which can lead to more +efficient chunk allocation and lookups, but will also lead to memory waste if many +chunks are allocated and not fully used. The latter will be the case if there exist +many small collections which all allocate their own chunks but not fully utilize them +because of the low number of documents. + +## AQL + +### Functions added + +The following AQL functions have been added in 3.1: + +- `OUTERSECTION(array1, array2, ..., arrayn)`: returns the values that occur + only once across all arrays specified. + +- `DISTANCE(lat1, lon1, lat2, lon2)`: returns the distance between the two + coordinates specified by `(lat1, lon1)` and `(lat2, lon2)`. The distance is + calculated using the haversine formula. + +- `JSON_STRINGIFY(value)`: returns a JSON string representation of the value. + +- `JSON_PARSE(value)`: converts a JSON-encoded string into a regular object + +### Index usage in traversals + +3.1 allows AQL traversals to use other indexes than just the edge index. +Traversals with filters on edges can now make use of more specific indexes. For +example, the query + +```aql +FOR v, e, p IN 2 OUTBOUND @start @@edge + FILTER p.edges[0].foo == "bar" + RETURN [v, e, p] +``` + +may use a hash index on `["_from", "foo"]` instead of the edge index on just +`["_from"]`. + +### Optimizer improvements + +Make the AQL query optimizer inject filter condition expressions referred to +by variables during filter condition aggregation. For example, in the following +query + +```aql +FOR doc IN collection + LET cond1 = (doc.value == 1) + LET cond2 = (doc.value == 2) + FILTER cond1 || cond2 + RETURN { doc, cond1, cond2 } +``` + +the optimizer will now inject the conditions for `cond1` and `cond2` into the +filter condition `cond1 || cond2`, expanding it to `(doc.value == 1) || (doc.value == 2)` +and making these conditions available for index searching. + +Note that the optimizer previously already injected some conditions into other +conditions, but only if the variable that defined the condition was not used elsewhere. +For example, the filter condition in the query + +```aql +FOR doc IN collection + LET cond = (doc.value == 1) + FILTER cond + RETURN { doc } +``` + +already got optimized before because `cond` was only used once in the query and the +optimizer decided to inject it into the place where it was used. + +This only worked for variables that were referred to once in the query. When a variable +was used multiple times, the condition was not injected as in the following query + +```aql +FOR doc IN collection + LET cond = (doc.value == 1) + FILTER cond + RETURN { doc, cond } +``` + +3.1 allows using this condition so that the query can use an index on `doc.value` +(if such index exists). + +### Miscellaneous improvements + +The performance of the `[*]` operator was improved for cases in which this operator +did not use any filters, projections and/or offset/limits. + +The AQL query executor can now report the time required for loading and locking the +collections used in an AQL query. When profiling is enabled, it will report the total +loading and locking time for the query in the `loading collections` sub-attribute of the +`extra.profile` value of the result. The loading and locking time can also be view in the +AQL query editor in the web interface. + +## Audit Log + +Audit logging has been added, see [Auditing](../../operations/security/audit-logging.md). + +## Client tools + +Added option `--skip-lines` for arangoimp. +This allows skipping the first few lines from the import file in case the CSV or TSV +import are used and some initial lines should be skipped from the input. + +## Web Admin Interface + +The usability of the AQL editor significantly improved. In addition to the standard JSON +output, the AQL Editor is now able to render query results as a graph preview or a table. +Furthermore the AQL editor displays query profiling information. + +Added a new Graph Viewer in order to exchange the technically obsolete version. The new Graph +Viewer is based on Canvas but does also include a first WebGL implementation (limited +functionality - will change in the future). The new Graph Viewer offers a smooth way to +discover and visualize your graphs. + +The shard view in cluster mode now displays a progress indicator while moving shards. + +## Authentication + +Up to ArangoDB 3.0 authentication of client requests was only possible with HTTP basic +authentication. + +Starting with 3.1 it is now possible to also use a [JSON Web Tokens](https://jwt.io/) +(JWT) for authenticating incoming requests. + +For details check the HTTP authentication chapter. Both authentication methods are +valid and will be supported in the near future. Use whatever suits you best. + +## Foxx + +### GraphQL + +It is now easy to get started with providing GraphQL APIs in Foxx, see [Foxx GraphQL](../../develop/foxx-microservices/reference/related-modules/graphql.md). + +### OAuth2 + +Foxx now officially provides a module for implementing OAuth2 clients, see [Foxx OAuth2](../../develop/foxx-microservices/reference/related-modules/oauth-2-0.md). + +### Per-route middleware + +It's now possible to specify middleware functions for a route when defining a route handler. These middleware functions only apply to the single route and share the route's parameter definitions. Check out the [Foxx Router documentation](../../develop/foxx-microservices/reference/routers/_index.md) for more information. diff --git a/site/content/arangodb/oem/release-notes/version-3.10/_index.md b/site/content/arangodb/oem/release-notes/version-3.10/_index.md new file mode 100644 index 0000000000..e37c33e0e3 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.10/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.10 +menuTitle: Version 3.10 +weight: 89 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.10/api-changes-in-3-10.md b/site/content/arangodb/oem/release-notes/version-3.10/api-changes-in-3-10.md new file mode 100644 index 0000000000..bac507b0c2 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.10/api-changes-in-3-10.md @@ -0,0 +1,1006 @@ +--- +title: API Changes in ArangoDB 3.10 +menuTitle: API changes in 3.10 +weight: 20 +description: >- + A summary of the changes to the HTTP API and other interfaces that are relevant + for developers, like maintainers of drivers and integrations for ArangoDB +--- +## HTTP RESTful API + +### Behavior changes + +#### Early connections + +The HTTP interface of _arangod_ instances can now optionally be started earlier +during the startup process, so that ping probes from monitoring tools can +already be responded to when the instance has not fully started. + +By default, the HTTP interface is opened at the same point during the startup +sequence as in previous versions, but it can optionally be opened earlier by +setting the new `--server.early-connections` startup option to `true`. + +The following APIs can reply early with an HTTP 200 status: + +- `GET /_api/version` and `GET /_admin/version`: + These APIs return the server version number, but can also be used as a + lifeliness probe, to check if the instance is responding to incoming HTTP requests. +- `GET /_admin/status`: + This API returns information about the instance's status, now also including + recovery progress and information about which server feature is currently starting. + +See [Respond to liveliness probes](../../develop/http-api/general-request-handling.md#respond-to-liveliness-probes) for more details. + +#### Validation of collections in named graphs + +The `/_api/gharial` endpoints for named graphs have changed: + +- If you reference a vertex collection in the `_from` or `_to` attribute of an + edge that doesn't belong to the graph, an error with the number `1947` is + returned. The HTTP status code of such an `ERROR_GRAPH_REFERENCED_VERTEX_COLLECTION_NOT_USED` + error has been changed from `400` to `404`. This change aligns the behavior to + the similar `ERROR_GRAPH_EDGE_COLLECTION_NOT_USED` error (number `1930`). + +- Write operations now check if the specified vertex or edge collection is part + of the graph definition. If you try to create a vertex via + `POST /_api/gharial/{graph}/vertex/{collection}` but the `collection` doesn't + belong to the `graph`, then the `ERROR_GRAPH_REFERENCED_VERTEX_COLLECTION_NOT_USED` + error is returned. If you try to create an edge via + `POST /_api/gharial/{graph}/edge/{collection}` but the `collection` doesn't + belong to the `graph`, then the error is `ERROR_GRAPH_EDGE_COLLECTION_NOT_USED`. + +#### Validation of `smartGraphAttribute` in SmartGraphs + +<small>Introduced in: v3.10.13</small> + +The attribute defined by the `smartGraphAttribute` graph property is not allowed to be +changed in the documents of SmartGraph vertex collections. This is now strictly enforced. +You must set the attribute when creating a document. Any attempt to modify or remove +the attribute afterward by update or replace operations now throws an error. Previously, +the `smartGraphAttribute` value was checked only when inserting documents into a +SmartGraph vertex collection, but not for update or replace operations. + +The missing checks on update and replace operations allowed to retroactively +modify the value of the `smartGraphAttribute` for existing documents, which +could have led to problems when the data of such a SmartGraph vertex collection was +replicated to a new follower shard. On the new follower shard, the documents +went through the full validation and led to documents with modified +`smartGraphAttribute` values being rejected on the follower. This could have +led to follower shards not getting in sync. + +Now, the value of the `smartGraphAttribute` is fully validated with every +insert, update, or replace operation, and every attempt to modify the value of +the `smartGraphAttribute` retroactively fails with the `4003` error, +`ERROR_KEY_MUST_BE_PREFIXED_WITH_SMART_GRAPH_ATTRIBUTE`. +Additionally, if upon insertion the `smartGraphAttribute` is missing for a +SmartGraph vertex, the error code is error `4001`, `ERROR_NO_SMART_GRAPH_ATTRIBUTE`. + +To retroactively repair the data in any of the affected collections, it is +possible to update every (affected) document with the correct value of the +`smartGraphAttribute` via an AQL query as follows: + +``` +FOR doc IN @@collection + LET expected = SUBSTRING(doc._key, 0, FIND_FIRST(doc._key, ':')) + LET actual = doc.@attr + FILTER expected != actual + UPDATE doc WITH {@attr: expected} IN @@collection + COLLECT WITH COUNT INTO updated + RETURN updated +``` + +This updates all documents with the correct (expected) value of the +`smartGraphAttribute` if it deviates from the expected value. The query +returns the number of updated documents as well. + +The bind parameters necessary to run this query are: +- `@@collection`: name of a SmartGraph vertex collection to be updated +- `@attr`: attribute name of the `smartGraphAttribute` of the collection + +#### Disabled Foxx APIs + +<small>Introduced in: v3.10.5</small> + +A `--foxx.enable` startup option has been added to _arangod_. It defaults to `true`. +If the option is set to `false`, access to Foxx services is forbidden and is +responded with an HTTP `403 Forbidden` error. Access to the management APIs for +Foxx services are also disabled as if `--foxx.api false` is set manually. + +#### Configurable whitespace in metrics + +<small>Introduced in: v3.10.6</small> + +The output format of the `/_admin/metrics` and `/_admin/metrics/v2` endpoints +slightly changes for metrics with labels. By default, the metric label and value +are separated by a space for improved compatibility with some tools. This is +controlled by the new `--server.ensure-whitespace-metrics-format` startup option, +which is enabled by default from v3.10.6 onward. Example: + +Enabled: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"} 0 +``` + +Disabled: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"}0 +``` + +#### Cursor API + +<small>Introduced in: v3.9.11, v3.10.7</small> + +In AQL graph traversals (`POST /_api/cursor` endpoint), you can restrict the +vertex and edge collections in the traversal options like so: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { + vertexCollections: [ "bolts", "screws" ], + edgeCollections: [ "productsToBolts", "productsToScrews" ] + } + RETURN v +``` + +If you specify collections that don't exist, queries now fail with +a "collection or view not found" error (code `1203` and HTTP status +`404 Not Found`). In previous versions, unknown vertex collections were ignored, +and the behavior for unknown edge collections was undefined. + +Additionally, the collection types are now validated. If a document collection +or View is specified in `edgeCollections`, an error is raised +(code `1218` and HTTP status `400 Bad Request`). + +Furthermore, it is now an error if you specify a vertex collection that is not +part of the specified named graph (code `1926` and HTTP status `404 Not Found`). +It is also an error if you specify an edge collection that is not part of the +named graph's definition or of the list of edge collections (code `1939` and +HTTP status `400 Bad Request`). + +#### Document API + +<small>Introduced in: v3.9.12, v3.10.9</small> + +Using the Document API for reading multiple documents used to return an error +if the request body was an empty array. Example: + +```bash +> curl -XPUT -d '[]' 'http://localhost:8529/_api/document/coll?onlyget=true' +{"code":500,"error":true,"errorMessage":"internal error","errorNum":4} +``` + +Now, a request like this succeeds and returns an empty array as response. + +#### Limit to the number of databases in a deployment + +<small>Introduced in: v3.10.10</small> + +The new `--database.max-databases` startup option can cap the number of databases +and creating databases using the `POST /_api/database` endpoint can thus now fail +for this reason if your deployment is at or above the configured maximum. Example: + +```json +{ + "code": 400, + "error": true, + "errorMessage": "unable to create additional database because it would exceed the configured maximum number of databases (2)", + "errorNum": 32 +} +``` + +### Endpoint return value changes + +- Since ArangoDB 3.8, there have been two APIs for retrieving the metrics in two + different formats: `/_admin/metrics` and `/_admin/metrics/v2`. + The metrics API v1 (`/_admin/metrics`) was deprecated in 3.8 and the usage of + `/_admin/metrics/v2` was encouraged. + + In ArangoDB 3.10, `/_admin/metrics` and `/_admin/metrics/v2` now behave + identically and return the same output in a fully Prometheus-compatible format. + The old metrics format is not available anymore. + + For the metrics APIs at `/_admin/metrics` and `/_admin/metrics/v2`, unnecessary + spaces have been removed between the `}` delimiting the labels and the value of + the metric. + +- Changed the encoding of revision IDs returned by the below listed REST APIs. + + <small>Introduced in: v3.8.8, v3.9.4, v3.10.1</small> + + - `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. + - `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +### Endpoints deprecated + +The `GET /_admin/database/target-version` endpoint is deprecated in favor of the +more general version API with the endpoint `GET /_api/version`. +The endpoint will be removed in ArangoDB v3.12. + +### Endpoints added + +#### Optimizer rules for AQL queries + +Added the `GET /_api/query/rules` endpoint that returns the available +optimizer rules for AQL queries. It returns an array of objects that contain +the name of each available rule and its respective flags. + +The JavaScript API was not extended, but you can make a request using a +low-level method in _arangosh_: + +```js +arango.GET("/_api/query/rules") +``` + +#### Shard rebalancing + +Starting with version 3.10, new endpoints are added that allow you to perform +move shard operations and improve balance in the cluster. + +- `GET /_admin/cluster/rebalance` +- `POST /_admin/cluster/rebalance` +- `POST /_admin/cluster/rebalance_execute` +- `PUT /_admin/cluster/rebalance` + +For more information, see the [Cluster](../../develop/http-api/cluster.md#get-the-current-cluster-imbalance) +section of the HTTP API documentation. + +#### Maintenance mode for DB-Servers + +<small>Introduced in: v3.10.1</small> + +For rolling upgrades or rolling restarts, DB-Servers can now be put into +maintenance mode, so that no attempts are made to re-distribute the data in a +cluster for such planned events. DB-Servers in maintenance mode are not +considered viable failover targets because they are likely restarted soon. + +To query the maintenance status of a DB-Server, use this new endpoint: + +`GET /_admin/cluster/maintenance/<DB-Server-ID>` + +An example reply of a DB-Server that is in maintenance mode: + +```json +{ + "error": false, + "code": 200, + "result": { + "Mode": "maintenance", + "Until": "2022-10-26T06:14:23Z" + } +} +``` + +If the DB-Server is not in maintenance mode, then the `result` attribute is +omitted: + +```json +{ + "error": false, + "code": 200, +} +``` + +To put a DB-Server into maintenance mode, use this new endpoint: + +`PUT /_admin/cluster/maintenance/<DB-Server-ID>` + +The payload of the request needs to be as follows, with the `timeout` in seconds: + +```json +{ + "mode": "maintenance", + "timeout": 360 +} +``` + +To turn the maintenance mode off, set `mode` to `"normal"` instead, and omit the +`timeout` attribute or set it to `0`. + +You can send another request when the DB-Server is already in maintenance mode +to extend the timeout. + +The maintenance mode ends automatically after the defined timeout. + +Also see the [HTTP interface for cluster maintenance](../../develop/http-api/cluster.md#get-the-maintenance-status-of-a-db-server). + +#### Shard usage metrics + +<small>Introduced in: v3.10.13</small> + +With `GET /_admin/usage-metrics` you can retrieve detailed shard usage metrics on +DB-Servers. + +These metrics can be enabled by setting the `--server.export-shard-usage-metrics` +startup option to `enabled-per-shard` to make DB-Servers collect per-shard +usage metrics, or to `enabled-per-shard-per-user` to make DB-Servers collect +usage metrics per shard and per user whenever a shard is accessed. + +For more information, see the [HTTP API description](../../develop/http-api/monitoring/metrics.md#get-usage-metrics) +and [Monitoring per collection/database/user](../version-3.10/whats-new-in-3-10.md#monitoring-per-collectiondatabaseuser). + +### Endpoints augmented + +#### EnterpriseGraphs (Enterprise Edition) + +You can create EnterpriseGraphs by setting `isSmart` to `true`, the `numberOfShards`, +but no `smartGraphAttribute`. You can optionally specify which collections shall +be `satellites`. There are no new attributes for creating this type of graph. + +The vertex collections of an EnterpriseGraph have a new `shardingStrategy` value +of `enterprise-hex-smart-vertex`. + +Also see [EnterpriseGraphs](../../graphs/enterprisegraphs/_index.md). + +#### Inverted Indexes + +The `/_api/index` endpoints support a new `inverted` index type. + +Options for creating an index (`POST /_api/index`): + +- `type` (string): needs to be set to `"inverted"` +- `name` (string, _optional_) +- `fields` (array): required unless the top-level `includeAllFields` option is + set to `true`. The array elements can be a mix of strings and objects: + - `name` (string, _required_): an attribute path. Passing a string instead of + an object is the same as passing an object with this name attribute + - `analyzer` (string, _optional_): default: the value defined by the top-level + `analyzer` option + - `features` (array, _optional_): an array of strings, possible values: + `"frequency"`, `"norm"`, `"position"`, `"offset"`. Default: the features as + defined by the Analyzer itself, or inherited from the top-level `features` + option if the `analyzer` option adjacent to this option is not set + - `includeAllFields` (boolean, _optional_): default: `false` + - `searchField` (boolean, _optional_): default: the value defined by the + top-level `searchField` option + - `trackListPositions` (boolean, _optional_): default: the value of the + top-level `trackListPositions` option + - `cache` (boolean, _optional_): default: the value of the top-level `cache` + option (introduced in v3.10.2, Enterprise Edition only) + - `nested` (array, _optional_): Enterprise Edition only. + The array elements can be a mix of strings and objects: + - `name` (string, _required_): an attribute path. Passing a string instead + of an object is the same as passing an object with this name attribute + - `analyzer` (string, _optional_): default: the value defined by the parent + field, or the top-level `analyzer` option + - `features` (array, _optional_): an array of strings, possible values: + `"frequency"`, `"norm"`, `"position"`, `"offset"`. Default: the features as + defined by the Analyzer itself, or inherited from the parent field's or + top-level `features` option if no `analyzer` option is set at a deeper + level, closer to this option + - `searchField` (boolean, _optional_): default: the value defined by the + top-level `searchField` option + - `nested` (array, _optional_): can be used recursively. See `nested` above +- `searchField` (boolean, _optional_): default: `false` +- `cache` (boolean, _optional_): default: `false` + (introduced in v3.10.2, Enterprise Edition only) +- `storedValues` (array, _optional_): an array of objects (or an array of arrays + of strings as shorthand, or also an array of strings from v3.10.3 on): + - `fields` (array, _required_): an array of strings + - `compression` (string, _optional_): possible values: `"lz4"`, `"none"`. + Default: `"lz"` + - `cache` (boolean, _optional_): default: `false` + (introduced in v3.10.2, Enterprise Edition only) +- `primarySort` (object, _optional_) + - `fields` (array, _required_): an array of objects: + - `field` (string, _required_) + - `direction` (string, _required_): possible values: `"asc"`, `"desc"` + - `compression` (string, _optional_): possible values: `"lz4"`, `"none"`. + Default: `"lz4"` + - `cache` (boolean, _optional_): default: `false` + (introduced in v3.10.2, Enterprise Edition only) +- `primaryKeyCache` (boolean, _optional_): default: `false` + (introduced in v3.10.2, Enterprise Edition only) +- `analyzer` (string, _optional_): default: `identity` +- `features` (array, _optional_): an array of strings, possible values: + `"frequency"`, `"norm"`, `"position"`, `"offset"`. Default: the features as + defined by the Analyzer itself +- `includeAllFields` (boolean, _optional_): default: `false` +- `trackListPositions` (boolean, _optional_): default: `false` +- `parallelism` (integer, _optional_): default: `2` +- `inBackground` (boolean, _optional_) +- `cleanupIntervalStep` (integer, _optional_): default: `2` +- `commitIntervalMsec` (integer, _optional_): default: `1000` +- `consolidationIntervalMsec` (integer, _optional_): default: `1000` +- `consolidationPolicy` (object, _optional_): + - `type` (string, _optional_): possible values: `"tier"`. Default: `"tier"` + - `segmentsBytesFloor` (integer, _optional_): default: `2097152` + - `segmentsBytesMax` (integer, _optional_): default: `5368709120` + - `segmentsMax` (integer, _optional_): default: `10` + - `segmentsMin` (integer, _optional_): default: `1` + - `minScore`: (integer, _optional_): default: `0` +- `writebufferIdle` (integer, _optional_): default: `64` +- `writebufferActive` (integer, _optional_): default: `0` +- `writebufferSizeMax` (integer, _optional_): default: `33554432` + +Index definition returned by index endpoints: + +- `id` (string) +- `isNewlyCreated` (boolean) +- `unique` (boolean): `false` +- `sparse` (boolean): `true` +- `version` (integer) +- `code` (integer) +- `type` (string): `"inverted"` +- `name` (string) +- `fields` (array): array of objects: + - `name` (string) + - `analyzer` (string): default: omitted + - `features` (array): an array of strings, possible values: + `"frequency"`, `"norm"`, `"position"`, `"offset"`. Default: omitted + - `includeAllFields` (boolean): default: omitted + - `searchField` (boolean): default: the value defined by the top-level + `searchField` option + - `trackListPositions` (boolean): default: omitted + - `cache` (boolean): default: omitted + (introduced in v3.10.2, Enterprise Edition only) + - `nested` (array): default: omitted. Enterprise Edition only. An array of objects: + - `name` (string) + - `analyzer` (string), default: omitted + - `features` (array): an array of strings, possible values: + `"frequency"`, `"norm"`, `"position"`, `"offset"`. Default: the features + as defined by the Analyzer itself + - `searchField` (boolean): default: the value defined by the top-level + `searchField` option +- `searchField` (boolean): default: `false` +- `cache` (boolean): default: omitted + (introduced in v3.10.2, Enterprise Edition only) +- `storedValues` (array): default: `[]`. An array of objects: + - `fields` (array): an array of strings + - `compression` (string): possible values: `"lz4"`, `"none"`. + Default: `"lz"` + - `cache` (boolean): default: omitted + (introduced in v3.10.2, Enterprise Edition only) +- `primarySort` (object) + - `fields` (array): default: `[]`. An array of objects: + - `field` (string) + - `direction` (string): possible values: `"asc"`, `"desc"` + - `compression` (string): possible values: `"lz4"`, `"none"`. + Default: `"lz4"` + - `cache` (boolean): default: omitted + (introduced in v3.10.2, Enterprise Edition only) +- `analyzer` (string): default: `identity` +- `features` (array): default: the features as defined by the Analyzer itself +- `includeAllFields` (boolean): default: `false` +- `trackListPositions` (boolean): default: `false` +- `cleanupIntervalStep` (integer): default: `2` +- `commitIntervalMsec` (integer): default: `1000` +- `consolidationIntervalMsec` (integer): default: `1000` +- `consolidationPolicy` (object): + - `type` (string): possible values: `"tier"`. Default: `"tier"` + - `segmentsBytesFloor` (integer): default: `2097152` + - `segmentsBytesMax` (integer): default: `5368709120` + - `segmentsMax` (integer): default: `10` + - `segmentsMin` (integer): default: `1` + - `minScore`: (integer): default: `0` +- `writebufferIdle` (integer): default: `64` +- `writebufferActive` (integer): default: `0` +- `writebufferSizeMax` (integer): default: `33554432` + +Also see the [HTTP API documentation](../../develop/http-api/indexes/inverted.md). + +#### `search-alias` Views + +The `/_api/view` endpoints support a new `search-alias` type. + +Options for creating an `search-alias` View (`POST /_api/view`): + +- `name` (string, _required_) +- `type` (string, _required_): needs to be set to `"search-alias"` +- `indexes` (array, _optional_): default: `[]`. An array of objects: + - `collection` (string, _required_) + - `index` (string, _required_) + +Options for partially changing properties (`PATCH /_api/view/<view>/properties`), +to add or remove inverted indexes from the View definition: + +- `indexes` (array, _optional_): default: `[]`. An array of objects: + - `collection` (string, _required_) + - `index` (string, _required_) + - `operation` (string, _optional_): possible values: `"add"` and `"del"`. + Default: `"add"` + +View definition returned by View endpoints: + +- `name` (string) +- `type` (string): `"search-alias"` +- `indexes` (array): default: `[]`. An array of objects: + - `collection` (string) + - `index` (string) + +Also see the [HTTP API documentation](../../develop/http-api/views/search-alias-views.md). + +#### Computed Values + +The [Computed Values](../../concepts/data-structure/documents/computed-values.md) feature +extends the following endpoints with a new `computedValues` collection property +that you can read or write to manage the computed value definitions: + +- Create a collection (`POST /_api/collection`) +- Read the properties of a collection (`GET /_api/collection/{collection-name}/properties`) +- Change the properties of a collection (`PUT /_api/collection/{collection-name}/properties`) + +The `computedValues` attribute is either `null` or an array of objects with the +following attributes: +- `name` (string, _required_) +- `expression` (string, _required_) +- `overwrite` (boolean, _required_) +- `computeOn` (array of strings, _optional_, default: `["insert","update","replace"]`) +- `keepNull` (boolean, _optional_, default: `true`) +- `failOnWarning` (boolean, _optional_, default: `false`) + +#### Nested search (Enterprise Edition) + +The following endpoints accepts a new, optional link property called `nested` +for Views of type `arangosearch` in the Enterprise Edition: + +- `POST /_api/view` +- `PUT /_api/view/{view-name}/properties` +- `PATCH /_api/view/{view-name}/properties` + +It is an object and similar to the existing `fields` property. However, it +cannot be used at the top-level of the link properties. It needs to have a +parent field (`"fields": { "<field>": { "nested": { ... } } }`). It can be +nested, however (`"nested": { "<field>": { "nested": { ... } } }`). + +The `GET /_api/view/{view-name}/properties` endpoint may return link properties +including the new `nested` property. + +For nested search with inverted indexes (and indirectly with `search-alias` Views), +see the `nested` property supported by [inverted indexes](#inverted-indexes). + +#### `offset` Analyzer feature + +In the Enterprise Edition, the `POST /_api/analyzer` endpoint accepts `"offset"` +as a string in the `features` array attribute. The `/_api/analyzer` endpoints +may return this new value in the `features` attribute. It enables +search highlighting capabilities for Views. + +#### Analyzer types + +The `/_api/analyzer` endpoint supports new Analyzer types in the +Enterprise Edition: + +- [`minhash`](../../index-and-search/analyzers.md#minhash): + It has two properties, `analyzer` (object) and `numHashes` (number). + The `analyzer` object is an Analyzer-like definition with a `type` (string) and + a `properties` attribute (object). The properties depend on the Analyzer type. + +- [`classification`](../../index-and-search/analyzers.md#classification) (experimental): + It has three properties, `model_location` (string), `top_k` (number, optional, + default: `1`), and `threshold` (number, optional, default: `0.99`). + +- [`nearest_neighbors`](../../index-and-search/analyzers.md#nearest_neighbors) (experimental): + It has two properties, `model_location` (string) and `top_k` (number, optional, + default: `1`). + +- [`geo_s2`](../../index-and-search/analyzers.md#geo_s2) (introduced in v3.10.5): + Like the existing `geojson` Analyzer, but with an additional `format` property + that can be set to `"latLngDouble"` (default), `"latLngInt"`, or `"s2Point"`. + +#### `geojson` Analyzer + +<small>Introduced in: v3.10.5</small> + +Analyzers of the `geojson` type have a new `legacy` property. The default is `false`. + +This option controls how GeoJSON Polygons are interpreted. +See the [`geojson` Analyzer](../../index-and-search/analyzers.md#geojson). + +#### Views API + +Views of the type `arangosearch` support new caching options in the +Enterprise Edition. + +<small>Introduced in: v3.9.5, v3.10.2</small> + +- A `cache` option for individual View links or fields (boolean, default: `false`). +- A `cache` option in the definition of a `storedValues` View property + (boolean, immutable, default: `false`). + +<small>Introduced in: v3.9.6, v3.10.2</small> + +- A `primarySortCache` View property (boolean, immutable, default: `false`). +- A `primaryKeyCache` View property (boolean, immutable, default: `false`). + +The `POST /_api/view` endpoint accepts these new options for `arangosearch` +Views, the `GET /_api/view/<view-name>/properties` endpoint may return these +options, and you can change the `cache` View link/field property with the +`PUT /_api/view/<view-name>/properties` and `PATCH /_api/view/<view-name>/properties` +endpoints. + +<small>Introduced in: v3.10.3</small> + +You may use a shorthand notations on `arangosearch` View creation or the +`storedValues` option, like `["attr1", "attr2"]`, instead of using an array of +objects. + +See the [`arangosearch` Views Reference](../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) +for details. + +#### Geo-spatial indexes + +Indexes of the `geo` type have a new `legacyPolygons` option. + +If `geoJson` is set to `true`, then this option controls how GeoJSON Polygons +are interpreted. Also see [Legacy Polygons](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons). + +The default is `true` for geo indexes that were created in versions +before 3.10, and `false` for geo indexes created in 3.10 or later. + +#### Collection truncation markers + +APIs that return data from ArangoDB's write-ahead log (WAL) may now return +collection truncate markers in the cluster, too. Previously such truncate +markers were only issued in the single server and active failover modes, but not +in a cluster. Client applications that tail ArangoDB's WAL are thus supposed +to handle WAL markers of type `2004`. + +The following HTTP APIs are affected: +- `/_api/wal/tail` +- `/_api/replication/logger-follow` + +#### Startup and recovery information + +The GET `/_admin/status` API now also returns startup and recovery information. This +can be used to determine the instance's progress during startup. The new `progress` +attribute is returned inside the `serverInfo` object with the following subattributes: + +- `phase`: name of the lifecycle phase the instance is currently in. Normally one of + `"in prepare"`, `"in start"`, `"in wait"`, `"in shutdown"`, `"in stop"`, or `"in unprepare"`. +- `feature`: internal name of the feature that is currently being prepared, started, + stopped or unprepared. +- `recoveryTick`: current recovery sequence number value if the instance is currently in + recovery. If the instance is already past the recovery, this attribute contains + the last handled recovery sequence number. + +See [Respond to liveliness probes](../../develop/http-api/general-request-handling.md#respond-to-liveliness-probes) for more information. + +#### Read from followers + +A number of read-only APIs now observe the `x-arango-allow-dirty-read` +header, which was previously only used in Active Failover deployments. +This header allows reading from followers or "dirty reads". See +[Read from followers](../../develop/http-api/documents.md#read-from-followers) +for details. + +The following APIs are affected: + +- Single document reads (`GET /_api/document`) +- Batch document reads (`PUT /_api/document?onlyget=true`) +- Read-only AQL queries (`POST /_api/cursor`) +- The edge API (`GET /_api/edges`) +- Read-only Stream Transactions and their sub-operations + (`POST /_api/transaction/begin` etc.) + +If the header is not specified, the behavior is the same as before. + +#### Cursor API + +The cursor API can now return additional statistics values in its `stats` subattribute: + +- **cursorsCreated**: the total number of cursor objects created during query execution. Cursor + objects are created for index lookups. +- **cursorsRearmed**: the total number of times an existing cursor object was repurposed. + Repurposing an existing cursor object is normally more efficient compared to destroying an + existing cursor object and creating a new one from scratch. +- **cacheHits**: the total number of index entries read from in-memory caches for indexes + of type edge or persistent. This value will only be non-zero when reading from indexes + that have an in-memory cache enabled, and when the query allows using the in-memory + cache (i.e. using equality lookups on all index attributes). +- **cacheMisses**: the total number of cache read attempts for index entries that could not + be served from in-memory caches for indexes of type edge or persistent. This value will + only be non-zero when reading from indexes that have an in-memory cache enabled, the + query allows using the in-memory cache (i.e. using equality lookups on all index attributes) + and the looked up values are not present in the cache. + +These attributes are optional and only useful for detailed performance analyses. + +The `POST /_api/cursor` endpoint accepts two new parameters in the `options` +object to set per-query thresholds for the +[query spillover feature](whats-new-in-3-10.md#query-result-spillover-to-decrease-memory-usage): + +- `spillOverThresholdMemoryUsage` (integer, _optional_): in bytes, default: `134217728` (128MB) +- `spillOverThresholdNumRows` (integer, _optional_): default: `5000000` rows + +#### Index API + +- The index creation API at POST `/_api/index` now accepts an optional `storedValues` + attribute to include additional attributes in a persistent index. + These additional attributes cannot be used for index lookups or sorts, but they + can be used for projections. + + If set, `storedValues` must be an array of index attribute paths. There must be no + overlap of attribute paths between `fields` and `storedValues`. The maximum number + of values is 32. + + All index APIs that return additional data about indexes (e.g. GET `/_api/index`) + will now also return the `storedValues` attribute for indexes that have their + `storedValues` attribute set. + + The extra index information is also returned by inventory-like APIs that return + the full set of collections with their indexes. + +- The index creation API at POST `/_api/index` now accepts an optional `cacheEnabled` + attribute to enable an in-memory cache for index values for persistent indexes. + + If `cacheEnabled` is set to `true`, the index is created with the cache. Otherwise + the index is created without it. Caching is turned off by default. + + APIs that return information about all indexes such as GET `/_api/index` + or GET `/_api/index/<index-id>` can now also return the `cacheEnabled` + attribute. + +You cannot create multiple persistent indexes with the same `fields` attributes +and uniqueness option but different `storedValues` or `cacheEnabled` attributes. +The values of `storedValues` and `cacheEnabled` are not considered in index +creation calls when checking if a persistent index is already present or a new +one needs to be created. + +The index API may now include `figures` for `arangosearch` View links and +inverted indexes. This information was previously not available for these index +types. The `withStats` query parameter needs to be set to `true` to retrieve +figures, and for `arangosearch` Views, `withHidden` needs to be enabled, too: + +```json +{ + "figures" : { + "numDocs" : 4, + "numLiveDocs" : 4, + "numSegments" : 1, + "numFiles" : 8, + "indexSize" : 1358 + }, ... +} +``` + +#### Progress indication on the index generation + +<small>Introduced in: v3.10.13</small> + +The `GET /_api/index` endpoint may now include a `progress` attribute for the +elements in the `indexes` array. For every index that is currently being created, +it indicates the progress of the index generation (in percent). + +To return indexes that are not yet fully built but are in the building phase, +add the `withHidden=true` query parameter to the call of the endpoint. + +``` +curl "http://localhost:8529/_api/index?collection=myCollection&withHidden=true" +``` + +#### Document API + +<small>Introduced in: v3.9.6, v3.10.2</small> + +The following endpoints support a new, experimental `refillIndexCaches` query +parameter to repopulate the edge cache after requests that insert, update, +replace, or remove single or multiple edge documents: + +- `POST /_api/document/{collection}` +- `PATCH /_api/document/{collection}/{key}` +- `PUT /_api/document/{collection}/{key}` +- `DELETE /_api/document/{collection}/{key}` + +It is a boolean option and the default is `false`. + +This also applies to the `INSERT`, `UPDATE`, `REPLACE`, and `REMOVE` operations +in AQL queries, which support a `refillIndexCache` option, too. + +#### Metrics API + +The `GET /_admin/metrics/v2` (and `GET /_admin/metrics`) endpoints provide +newly added metrics for `arangosearch` View links and inverted indexes: + +- `arangodb_search_cleanup_time` +- `arangodb_search_commit_time` +- `arangodb_search_consolidation_time` +- `arangodb_search_index_size` +- `arangodb_search_num_docs` +- `arangodb_search_num_failed_cleanups` +- `arangodb_search_num_failed_commits` +- `arangodb_search_num_failed_consolidations` +- `arangodb_search_num_files` +- `arangodb_search_num_live_docs` +- `arangodb_search_num_out_of_sync_links` +- `arangodb_search_num_segments` + +--- + +<small>Introduced in: v3.10.7</small> + +This new metric reports the number of RocksDB `.sst` files: + +| Label | Description | +|:------|:------------| +| `rocksdb_total_sst_files` | Total number of RocksDB sst files, aggregated over all levels. | + +--- + +<small>Introduced in: v3.8.9, v3.9.6, v3.10.2</small> + +The metrics endpoints include the following new traffic accounting metrics: + +- `arangodb_client_user_connection_statistics_bytes_received` +- `arangodb_client_user_connection_statistics_bytes_sent` +- `arangodb_http1_connections_total` + +--- + +<small>Introduced in: v3.9.6, v3.10.2</small> + +The metrics endpoints include the following new edge cache (re-)filling metrics: + +- `rocksdb_cache_auto_refill_loaded_total` +- `rocksdb_cache_auto_refill_dropped_total` +- `rocksdb_cache_full_index_refills_total` + +--- + +<small>Introduced in: v3.9.10, v3.10.5</small> + +The following metrics for write-ahead log (WAL) file tracking have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_live_wal_files` | Number of live RocksDB WAL files. | +| `rocksdb_wal_released_tick_flush` | Lower bound sequence number from which WAL files need to be kept because of external flushing needs. | +| `rocksdb_wal_released_tick_replication` | Lower bound sequence number from which WAL files need to be kept because of replication. | +| `arangodb_flush_subscriptions` | Number of currently active flush subscriptions. | + +--- + +<small>Introduced in: v3.10.5</small> + +The following metric for the number of replication clients for a server has +been added: + +| Label | Description | +|:------|:------------| +| `arangodb_replication_clients` | Number of currently connected/active replication clients. | + +--- + +<small>Introduced in: v3.9.11, v3.10.6</small> + +The following metrics for diagnosing delays in cluster-internal network requests +have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_network_dequeue_duration` | Internal request duration for the dequeue in seconds. | +| `arangodb_network_response_duration` | Internal request duration from fully sent till response received in seconds. | +| `arangodb_network_send_duration` | Internal request send duration in seconds. | +| `arangodb_network_unfinished_sends_total` | Number of internal requests for which sending has not finished. | + +--- + +<small>Introduced in: v3.10.7</small> + +The following metric stores the peak value of the `rocksdb_cache_allocated` metric: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_peak_allocated` | Global peak memory allocation of ArangoDB in-memory caches. | + +--- + +<small>Introduced in: v3.10.7</small> + +The following metrics have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_file_descriptors_limit` | System limit for the number of open files for the arangod process. | +| `arangodb_file_descriptors_current` | Number of file descriptors currently opened by the arangod process. | + +--- + +<small>Introduced in: v3.10.11</small> + +The following metrics have been added to improve the observability of in-memory +cache subsystem: + +- `rocksdb_cache_free_memory_tasks_total` +- `rocksdb_cache_free_memory_tasks_duration_total` +- `rocksdb_cache_migrate_tasks_total` +- `rocksdb_cache_migrate_tasks_duration_total` + +#### Pregel API + +When loading the graph data into memory, a `"loading"` state is now returned by +the `GET /_api/control_pregel` and `GET /_api/control_pregel/{id}` endpoints. +The state changes to `"running"` when loading finishes. + +In previous versions, the state was `"running"` when loading the data as well as +when running the algorithm. + +Both endpoints return a new `detail` attribute with additional Pregel run details: + +- `detail` (object) + - `aggregatedStatus` (object) + - `timeStamp` (string) + - `graphStoreStatus` (object) + - `verticesLoaded` (integer) + - `edgesLoaded` (integer) + - `memoryBytesUsed` (integer) + - `verticesStored` (integer) + - `allGssStatus` (object) + - `items` (array of objects) + - `verticesProcessed` (integer) + - `messagesSent` (integer) + - `messagesReceived` (integer) + - `memoryBytesUsedForMessages` (integer) + - `workerStatus` (object) + - `<serverId>` (object) + - (the same attributes like under `aggregatedStatus`) + +For a detailed description of the attributes, see +[Pregel HTTP API](../../develop/http-api/pregel.md#get-a-pregel-job-execution-status). + +#### Log level API + +<small>Introduced in: v3.10.2</small> + +The `GET /_admin/log/level` and `PUT /_admin/log/level` endpoints support a new +query parameter `serverId`, to forward log level get and set requests to a +specific server. This makes it easier to adjust the log levels in clusters +because DB-Servers require JWT authentication whereas Coordinators also support +authentication using usernames and passwords. + +#### Explain API + +<small>Introduced in: v3.10.4</small> + +The `POST /_api/explain` endpoint for explaining AQL queries includes the +following two new statistics in the `stats` attribute of the response now: + +- `peakMemoryUsage` (number): The maximum memory usage of the query during + explain (in bytes) +- `executionTime` (number): The (wall-clock) time in seconds needed to explain + the query. + +#### Optimizer rule descriptions + +<small>Introduced in: v3.10.9</small> + +The `GET /_api/query/rules` endpoint now includes a `description` attribute for +every optimizer rule that briefly explains what it does. + +## JavaScript API + +### Computed values + +The Computed Values feature extends the collection properties with a new +`computedValues` attribute. See [Computed Values](../../concepts/data-structure/documents/computed-values.md#interfaces) +for details. + +### Query spillover and Read from followers + +The `db._query()` and `db._createStatement()` methods accepts new query +options (`options` object) to set per-query thresholds for the +[query spillover feature](whats-new-in-3-10.md#query-result-spillover-to-decrease-memory-usage) +and to [Read from followers](../../develop/http-api/documents.md#read-from-followers): + +- `allowDirtyReads` (boolean, _optional_): default: `false` +- `spillOverThresholdMemoryUsage` (integer, _optional_): in bytes, default: `134217728` (128MB) +- `spillOverThresholdNumRows` (integer, _optional_): default: `5000000` rows + +### AQL queries + +<small>Introduced in: v3.9.11, v3.10.7</small> + +If you specify collections that don't exist in the options of AQL graph traversals +(`vertexCollections`, `edgeCollections`), queries now fail. In previous versions, +unknown vertex collections were ignored, and the behavior for unknown +edge collections was undefined. + +Additionally, queries now fail if you specify a document collection or View +in `edgeCollections`. diff --git a/site/content/arangodb/oem/release-notes/version-3.10/incompatible-changes-in-3-10.md b/site/content/arangodb/oem/release-notes/version-3.10/incompatible-changes-in-3-10.md new file mode 100644 index 0000000000..6ae62977a3 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.10/incompatible-changes-in-3-10.md @@ -0,0 +1,395 @@ +--- +title: Incompatible changes in ArangoDB 3.10 +menuTitle: Incompatible changes in 3.10 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Declaration of start vertex collections + +In cluster deployments, you need to declare collections that an AQL query +implicitly reads from using the [`WITH` operation](../../aql/high-level-operations/with.md). + +From version 3.10.0 onward, it is necessary to also declare the collections of +start vertices that are used for [graph traversals](../../aql/graphs/traversals.md) +if you specify start vertices using strings. + +In previous versions, the following query would work: + +```aql +WITH managers +FOR v, e, p IN 1..2 OUTBOUND 'users/1' usersHaveManagers + RETURN { v, e, p } +``` + +Now, you need to declare the `users` collection as well because the start vertex +`users/1` is specified as a string and the `users` collection is not otherwise +specified explicitly in a language construct: + +```aql +WITH users, managers +FOR v, e, p IN 1..2 OUTBOUND 'users/1' usersHaveManagers + RETURN { v, e, p } +``` + +In the following case, the `users` collection is accessed explicitly to retrieve +the start vertex. Therefore, the collection does not need to be declared using +`WITH`: + +```aql +WITH managers +LET startVertex = (FOR u IN users FILTER u._id == "users/1" RETURN u)[0] +FOR v, e, p IN 1..2 OUTBOUND startVertex usersHaveManagers + RETURN { v, e, p } +``` + +## Empty Document Updates + +ArangoDB 3.10 adds back the optimization for empty document update operations +(i.e. updates in which no attributes were specified to be updated). +Such updates were handled in a special way in ArangoDB until including 3.7.12, +so that no actual writes were performed and replicated. This +also included the `_rev` value of documents not being changed on an empty +update. + +ArangoDB 3.7.13 and 3.8.0 changed this behavior so that empty document updates +actually performed a write operation, leading to the replication of changes and modification +of the `_rev` value of affected. + +ArangoDB 3.10 adds back the optimal behavior for empty document +updates, which no longer perform a write operation, do not need to be +replicated and do not change the documents' `_rev` values. + +## Foxx / Server Console + +Previously a call to `db._version(true)` inside a Foxx app or the server console +would return a different structure than the same call from arangosh. +Foxx/server console would return `{ <details> }` while arangosh would return +`{ server: ..., license: ..., version: ..., details: { <details> }}`. + +This is now unified so that the result structure is always consistent with the +one in arangosh. Any Foxx app or script that ran in the server console which +used `db._version(true)` must now be changed to use `db._version(true).details` +instead. + +## Indexes + +The fulltext index type is now deprecated in favor of [ArangoSearch](../../index-and-search/arangosearch/_index.md). +Fulltext indexes are still usable in this version of ArangoDB, although their usage is +now discouraged. + +### Geo Indexes + +After an upgrade to 3.10 or higher, consider to drop and recreate geo +indexes. GeoJSON polygons are interpreted slightly differently (and more +correctly) in the newer versions. + +Legacy geo indexes will continue to work and continue to produce the +same results as in earlier versions, since they will have the option +`legacyPolygons` implicitly set to `true`. + +Newly created indexes will have `legacyPolygons` set to `false` by default +and thus enable the new polygon parsing. + +Note that linear rings are not normalized automatically from version 3.10 onward, +following the [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946). +The "interior" of a polygon strictly conforms to the GeoJSON standard: +it lies to the left of the boundary line (in the direction of travel along the +boundary line on the surface of the Earth). This can be the "larger" connected +component of the surface, or the smaller one. Note that this differs from the +interpretation of GeoJSON polygons in version 3.9 and older: + +| `legacyPolygons` enabled | `legacyPolygons` disabled | +|:-------------------------|:--------------------------| +| The smaller of the two regions defined by a linear ring is interpreted as the interior of the ring. | The area to the left of the boundary ring's path is considered to be the interior. | +| A ring can at most enclose half the Earth's surface | A ring can enclose the entire surface of the Earth | + +This can mean that old polygon GeoJSON data in the database is +suddenly interpreted in a different way. See +[Legacy Polygons](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons) for details. +Also see the definition of [Polygons](../../aql/functions/geo.md#polygon) +and [GeoJSON interpretation](../../aql/functions/geo.md#geojson-interpretation). + +## `geojson` Analyzers + +If you use `geojson` Analyzers and upgrade from a version below 3.10 to a +version of 3.10 or higher, the interpretation of GeoJSON Polygons changes. + +If you have polygons in your data that mean to refer to a relatively small +region but have the boundary running clockwise around the intended interior, +they are interpreted as intended prior to 3.10, but from 3.10 onward, they are +interpreted as "the other side" of the boundary. + +Whether a clockwise boundary specifies the complement of the small region +intentionally or not cannot be determined automatically. Please test the new +behavior manually. + +See [Legacy Polygons](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons) for details. + +--- + +<small>Introduced in: v3.10.5</small> + +Analyzers of the `geojson` type have a new `legacy` property. +The default is `false`. + +This option controls how GeoJSON Polygons are interpreted. + +If you require the old behavior, upgrade to at least 3.10.5, drop your +`geojson` Analyzers, and create new ones with `legacy` set to `true`. +If these Analyzers are used in `arangosearch` Views, then they need to be +dropped as well before dropping the Analyzers, and recreated after creating +the new Analyzers. + +| `legacy` enabled | `legacy` disabled | +|:-----------------|:------------------| +| The smaller of the two regions defined by a linear ring is interpreted as the interior of the ring. | The area to the left of the boundary ring's path is considered to be the interior. | +| A ring can at most enclose half the Earth's surface | A ring can enclose the entire surface of the Earth | + +Also see the definition of [Polygons](../../aql/functions/geo.md#polygon) and the +[`geojson` Analyzer](../../index-and-search/analyzers.md#geojson) documentation. + +## Maximum Array / Object Nesting + +When reading any data from JSON or VelocyPack input or when serializing any data to JSON or +VelocyPack, there is a maximum recursion depth for nested arrays and objects, which is slightly +below 200. Arrays or objects with higher nesting than this will cause `Too deep nesting in Array/Object` +exceptions. +The limit is also enforced when converting any server data to JavaScript in Foxx, or +when sending JavaScript input data from Foxx to a server API. +This maximum recursion depth is hard-coded in arangod and all client tools. + +## Validation of `smartGraphAttribute` in SmartGraphs + +<small>Introduced in: v3.10.13</small> + +The attribute defined by the `smartGraphAttribute` graph property is not allowed to be +changed in the documents of SmartGraph vertex collections. This is now strictly enforced. +See [API Changes in ArangoDB 3.10](api-changes-in-3-10.md#validation-of-smartgraphattribute-in-smartgraphs) +for details and instructions on how to repair affected attributes. + +## Validation of traversal collection restrictions + +<small>Introduced in: v3.9.11, v3.10.7</small> + +In AQL graph traversals, you can restrict the vertex and edge collections in the +traversal options like so: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { + vertexCollections: [ "bolts", "screws" ], + edgeCollections: [ "productsToBolts", "productsToScrews" ] + } + RETURN v +``` + +If you specify collections that don't exist, queries now fail with +a "collection or view not found" error (code `1203` and HTTP status +`404 Not Found`). In previous versions, unknown vertex collections were ignored, +and the behavior for unknown edge collections was undefined. + +Additionally, the collection types are now validated. If a document collection +or View is specified in `edgeCollections`, an error is raised +(code `1218` and HTTP status `400 Bad Request`). + +Furthermore, it is now an error if you specify a vertex collection that is not +part of the specified named graph (code `1926` and HTTP status `404 Not Found`). +It is also an error if you specify an edge collection that is not part of the +named graph's definition or of the list of edge collections (code `1939` and +HTTP status `400 Bad Request`). + +## Exit code adjustments + +<small>Introduced in: v3.10.13</small> + +For some fatal errors like a required database upgrade or a failed version check, +_arangod_ set the generic exit code of `1`. It now returns a different, more +specific exit code in these cases. + +## Startup Options + +### Handling of Invalid Startup Options + +Starting with ArangoDB 3.10, the _arangod_ executable and all other client +tools use more specific process exit codes in the following situations: + +- An unknown startup option name is used: Previously, the exit code was `1`. + Now, the exit code when using an invalid option is `3` (symbolic exit code + name `EXIT_INVALID_OPTION_NAME`). +- An invalid value is used for a startup option (e.g. a number that is + outside the allowed range for the option's underlying value type, or a + string value is used for a numeric option): Previously, the exit code was + `1`. Now, the exit code for these case is `4` (symbolic exit code name + `EXIT_INVALID_OPTION_VALUE`). +- A config file is specified that does not exist: Previously, the exit code + was either `1` or `6` (symbolic exit code name `EXIT_CONFIG_NOT_FOUND`). + Now, the exit code in this case is always `6` (`EXIT_CONFIG_NOT_FOUND`). +- A structurally invalid config file is used, e.g. the config file contains + a line that cannot be parsed: Previously, the exit code in this situation + was `1`. Now, it is always `6` (symbolic exit code name `EXIT_CONFIG_NOT_FOUND`). + +Note that this change can affect any custom scripts that check for startup +failures using the specific exit code `1`. These scripts should be adjusted so +that they check for a non-zero exit code. They can opt into more specific +error handling using the additional exit codes mentioned above, in order to +distinguish between different kinds of startup errors. + +### Web Interface Options + +The `--frontend.*` startup options were renamed to `--web-interface.*`: + +- `--frontend.proxy-request.check` is now `--web-interface.proxy-request.check` +- `--frontend.trusted-proxy` is now `--web-interface.trusted-proxy` +- `--frontend.version-check` is now `--web-interface.version-check` + +The former startup options are still supported for backward compatibility. + +### RocksDB Options + +The default value of the `--rocksdb.cache-index-and-filter-blocks` startup option was changed +from `false` to `true`. This makes RocksDB track all loaded index and filter blocks in the +block cache, so they are accounted against the RocksDB's block cache memory limit. +The default value for the `--rocksdb.enforce-block-cache-size-limit` startup option was also +changed from `false` to `true` to make the RocksDB block cache not temporarily exceed the +configured memory limit. + +These default value changes will make RocksDB adhere much better to the configured memory limit +(configurable via `--rocksdb.block-cache-size`). +The changes may have a small negative impact on performance because, if the block cache is +not large enough to hold the data plus the index and filter blocks, additional disk I/O may +need to be performed compared to the previous versions. +This is a trade-off between memory usage predictability and performance, and ArangoDB 3.10 +will default to more stable and predictable memory usage. If there is still unused RAM +capacity available, it may be sensible to increase the total size of the RocksDB block cache, +by increasing `--rocksdb.block-cache-size`. Due to the changed configuration, the block +cache size limit will not be exceeded anymore. + +It is possible to opt out of these changes and get back the memory and performance characteristics +of the previous versions by setting the `--rocksdb.cache-index-and-filter-blocks` +and `--rocksdb.enforce-block-cache-size-limit` startup options to `false` on startup. + +### RocksDB File Format + +ArangoDB 3.10 internally switches to RocksDB's `format_version` 5, which can still be +read by older versions of ArangoDB. +However, ArangoDB 3.10 uses the LZ4 compression scheme to reduce the size of RocksDB .sst +files from LSM tree level 2 onwards. This compression scheme is not supported in ArangoDB +versions before 3.10, so any database files created with ArangoDB 3.10 or higher cannot be +opened with versions before 3.10. +The internal checksum type of RocksDB .sst files has been changed to xxHash64 in ArangoDB +3.10 for a slight performance improvement. + +### Pregel Options + +Pregel jobs now have configurable minimum, maximum and default parallelism values. You can set them +by the following startup options: + +- `--pregel.min-parallelism`: minimum parallelism usable in Pregel jobs. Defaults to `1`. +- `--pregel.max-parallelism`: maximum parallelism usable in Pregel jobs. Defaults to the + number of available cores. +- `--pregel.parallelism`: default parallelism to use in Pregel jobs. Defaults to the number + of available cores divided by 4. The result will be clamped to a value between 1 and 16. + +{{< info >}} +The default values of these options may differ from parallelism values effectively +used by previous versions, so it is advised to explicitly set the desired parallelism +values in ArangoDB 3.10. +{{< /info >}} + +Pregel now also stores its temporary data in memory-mapped files on disk by default, whereas +in previous versions the default behavior was to buffer it to RAM. +Storing temporary data in memory-mapped files rather than in RAM has the advantage of lowering +the RAM usage, which reduces the likelihood of out-of-memory situations. +However, storing the files on disk requires disk capacity, so that instead of running out +of RAM it is now possible to run out of disk space. + +{{< info >}} +It is advised to set the storage location for Pregel's memory-mapped files explicitly +in ArangoDB 3.10. The following startup options are available for the configuration of +memory-mapped files: `--pregel.memory-mapped-files` and `--pregel.memory-mapped-files-location-type`. +{{< /info >}} + +For more information on the new options, please refer to [ArangoDB Server Pregel Options](../../components/arangodb-server/options.md#pregel). + +## HTTP RESTful API + +### Validation of collections in named graphs + +The `/_api/gharial` endpoints for named graphs have changed: + +- If you reference a vertex collection in the `_from` or `_to` attribute of an + edge that doesn't belong to the graph, an error with the number `1947` is + returned. The HTTP status code of such an `ERROR_GRAPH_REFERENCED_VERTEX_COLLECTION_NOT_USED` + error has been changed from `400` to `404`. This change aligns the behavior to + the similar `ERROR_GRAPH_EDGE_COLLECTION_NOT_USED` error (number `1930`). + +- Write operations now check if the specified vertex or edge collection is part + of the graph definition. If you try to create a vertex via + `POST /_api/gharial/{graph}/vertex/{collection}` but the `collection` doesn't + belong to the `graph`, then the `ERROR_GRAPH_REFERENCED_VERTEX_COLLECTION_NOT_USED` + error is returned. If you try to create an edge via + `POST /_api/gharial/{graph}/edge/{collection}` but the `collection` doesn't + belong to the `graph`, then the error is `ERROR_GRAPH_EDGE_COLLECTION_NOT_USED`. + +### Encoding of revision IDs + +<small>Introduced in: v3.8.8, v3.9.4, v3.10.1</small> + +- `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. +- `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +## Client Tools + +### arangobench + +Renamed the `--concurrency` startup option to `--threads`. + +The following deprecated arangobench testcases have been removed from _arangobench_: +- `aqltrx` +- `aqlv8` +- `counttrx` +- `deadlocktrx` +- `multi-collection` +- `multitrx` +- `random-shapes` +- `shapes` +- `shapes-append` +- `skiplist` +- `stream-cursor` + +These test cases had been deprecated since ArangoDB 3.9. + +The testcase `hash` was renamed to `persistent-index` to better reflect its +scope. + +### arangoexport + +To improve naming consistency across different client tools, the existing +_arangoexport_ startup options `--query` and `--query-max-runtime` were renamed +to `--custom-query` and `--custom-query-max-runtime`. + +Using the old option names (`--query` and `--query-max-runtime`) is still +supported and will implicitly use the `--custom-query` and +`--custom-query-max-runtime` options under the hood. Client scripts should +eventually be updated to use the new option name, however. + +### ArangoDB Starter + +The _ArangoDB Starter_ comes with the following usability improvements: +- Headers are now added to generated command files, indicating the purpose of + the file. +- The process output is now shown when errors occur during process startup. +- When passing through other database options, explicit hints are now displayed + to indicate how to pass those options. +- The Starter now returns exit code `1` if it encounters any errors while + starting. Previously, the exit code was `0`. Note that this change can affect + any custom scripts that check for startup errors or invalid command line options. + These scripts can be adjusted so that they check for a non-zero exit code. diff --git a/site/content/arangodb/oem/release-notes/version-3.10/known-issues-in-3-10.md b/site/content/arangodb/oem/release-notes/version-3.10/known-issues-in-3-10.md new file mode 100644 index 0000000000..884cccf599 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.10/known-issues-in-3-10.md @@ -0,0 +1,63 @@ +--- +title: Known Issues in ArangoDB 3.10 +menuTitle: Known Issues in 3.10 +weight: 10 +description: >- + Important issues affecting the 3.10.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by `arangosearch` View may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in `arangosearch` View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | +| **Date Added:** 2022-09-15 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** In `FILTER` operations that utilize inverted indexes, you cannot use the `<value> IN doc.<attribute>` syntax, e.g. `FILTER "string" IN doc.arr[*].attr`, like with persistent array indexes (or no index). You can use `["string"] ALL IN doc.arr[*].attr`, however. <br> **Affected Versions:** 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [SEARCH-382](https://arangodb.atlassian.net/browse/SEARCH-382) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** New Views of the search-alias type may return an incorrect amount of documents or other inconsistent results if they contain nested fields. <br> **Affected Versions:** 3.10.0 <br> **Fixed in Versions:** 3.10.1 <br> **Reference:** [SEARCH-391](https://arangodb.atlassian.net/browse/SEARCH-391) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** When using an inverted index, if the same nested field in the document is referenced multiple times and nested fields' definitions are different, only one definition will be used. <br> **Affected Versions:** 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [SEARCH-390](https://arangodb.atlassian.net/browse/SEARCH-390) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** In a cluster deployment using the new View of the `search-alias` type, running the `arangodump`/`arangorestore` commands fails. <br> **Affected Versions:** 3.10.0 <br> **Fixed in Versions:** 3.10.1 <br> **Reference:** [SEARCH-401](https://arangodb.atlassian.net/browse/SEARCH-401) (internal) | +| **Date Added:** 2023-02-08 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Active Failover <br> **Description:** ArangoSearch caching is available in some 3.9 versions but not v3.10.0 and v3.10.1. If you upgrade deployments to one of these two versions, the column cache is unavailable, but cache-related options are remembered. If you upgrade to v3.10.2 or later, the feature is automatically available again. However, an exception are Active Failover deployments. If a failover (leader change) occurs with v3.10.0 or v3.10.1, then the cache options are reset. You need to re-configure them, requiring that you recreate inverted indexes and Views as necessary as most of these options are immutable. <br> **Affected Versions:** 3.10.0, 3.10.1 <br> **Fixed in Versions:** 3.10.2 <br> **Reference:** N/A | + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2023-06-06 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** During a cluster upgrade while the supervision is deactivated (maintenance mode), upgraded DB-Server nodes are incorrectly reported to still have the old server version. The versions are visible in the Agency as well as in the **NODES** section of the web interface. <br> **Affected Versions:** 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-1409](https://arangodb.atlassian.net/browse/BTS-1409) (internal) | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-24 <br> **Component:** Web Interface <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Leader/Follower mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-04-03 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Updating the properties of a collection in the cluster may return before the properties are updated consistently on all shards. This is especially visible when setting a schema for a collection with multiple shards, and then instantly starting to store non-conforming documents into the collection. These may be accepted until the properties change has been fully propagated to all shards. <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | +| **Date Added:** 2021-08-06 <br> **Component:** Installer <br> **Deployment Mode:** Single Server <br> **Description:** The Windows installer fails during database initialization with the error `failed to locate tzdata` if there are non-ASCII characters in the destination path. <br> **Affected Versions:** 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-531](https://arangodb.atlassian.net/browse/BTS-531) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** Web Interface <br> **Deployment Mode:** All <br> **Description:** In the web interface for ArangoSearch Views, it's not possible to create a link to a collection, if the collection has only one letter in its name. <br> **Affected Versions:** 3.10.0 <br> **Fixed in Versions:** 3.10.1 <br> **Reference:** [BTS-1008](https://arangodb.atlassian.net/browse/BTS-1008) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter may fail to pick a Docker container name from cgroups. <br> **Affected Versions:** 3.8.x, 3.9.x, 3.10.x <br> **Fixed in Versions:** 3.9.9, 3.10.4 <br> **Reference:** [GT-207](https://arangodb.atlassian.net/browse/GT-207) (internal) | +| **Date Added:** 2022-10-26 <br> **Component:** ArangoSync <br> **Deployment Mode:** DC2DC <br> **Description:** When upgrading to 3.10.0, 3.10.1, 3.10.2, the _analyzers collection cannot be replicated. <br> **Affected Versions:** 3.8.8, 3.9.4, 3.10.0, 3.10.1, 3.10.2 <br> **Fixed in Versions:** 3.8.9, 3.9.6, 3.10.3 <br> **Reference:** [BTS-1094](https://arangodb.atlassian.net/browse/BTS-1094) (internal) | +| **Date Added:** 2023-02-17 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** When using a Windows build with `netgo`, the `localhost` cannot be resolved. <br> **Affected Versions:** 3.9.8, 3.10.3 <br> **Fixed in Versions:** 3.9.9, 3.10.4 <br> **Reference:** [GT-330](https://arangodb.atlassian.net/browse/GT-330) (internal) | +| **Date Added:** 2023-06-07 <br> **Component:** ArangoSync <br> **Deployment Mode:** All <br> **Description:** In ArangoSync v2.18.0, synchronization may be interrupted with errors like "CloneDirectMQToken failed" due to network disturbances. <br> **Affected Versions:** 3.9.11, 3.10.7 <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2023-06-16 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** If more than a certain threshold of queries on the same Coordinator get into the shutdown networking code at the same time, all of them lock up and the Coordinator does not longer process requests. <br> **Affected Versions:** 3.9.x. 3.10.x <br> **Fixed in Versions:** 3.9.12, 3.10.8 <br> **Reference:** [BTS-1486](https://arangodb.atlassian.net/browse/BTS-1486) (internal) | +| **Date Added:** 2024-03-21 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** When creating an `inverted` index with the `inBackground` option enabled, HTTP API calls like `http://localhost:8529/_api/index?collection=<coll>&withHidden=true` don't return the `isBuilding` and `progress` attributes and the progress of the index building can thus not be observed. <br> **Affected Versions:** 3.10.13 <br> **Fixed in Versions:** - <br> **Reference:** [BTS-1788](https://arangodb.atlassian.net/browse/BTS-1788) (internal) | diff --git a/site/content/arangodb/oem/release-notes/version-3.10/whats-new-in-3-10.md b/site/content/arangodb/oem/release-notes/version-3.10/whats-new-in-3-10.md new file mode 100644 index 0000000000..e416b5c2aa --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.10/whats-new-in-3-10.md @@ -0,0 +1,1822 @@ +--- +title: Features and Improvements in ArangoDB 3.10 +menuTitle: What's New in 3.10 +weight: 5 +description: >- + Support for ARM, computed values, a new managed graph type with automated + sharding, various search features, AQL optimizations +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.10. ArangoDB 3.10 also contains several bug fixes that are not listed +here. + +## Native ARM Support + +ArangoDB is now available for the ARM architecture, in addition to the x86-64 +architecture. + +It can natively run on Apple silicon (e.g. M1 chips). It was already possible to +run 3.8.x and older versions on these systems via Rosetta 2 emulation, but not +3.9.x because of its use of AVX instructions, which Rosetta 2 does not emulate. +3.10.x runs on this hardware again, but now without emulation. + +ArangoDB 3.10.x also runs on 64-bit ARM (AArch64, Little Endian) chips under Linux. +The minimum requirement is an ARMv8 chip with Neon (SIMD extension). + +## SmartGraphs (Enterprise Edition) + +### SmartGraphs and SatelliteGraphs on a single server + +It is now possible to test [SmartGraphs](../../graphs/smartgraphs/_index.md) and +[SatelliteGraphs](../../graphs/satellitegraphs/_index.md) on a single server and then to +port them to a cluster with multiple servers. + +You can create SmartGraphs, Disjoint SmartGraphs, SmartGraphs using +SatelliteCollections, Disjoint SmartGraphs using SatelliteCollections, as well +as SatelliteGraphs in the usual way, using +`arangosh` for instance, but on a single server, then dump them, start a cluster +(with multiple servers) and restore the graphs in the cluster. The graphs and +the collections will keep all properties that are kept when the graph is already +created in a cluster. + +Also see [SmartGraphs and SatelliteGraphs on a Single Server](../../graphs/smartgraphs/testing-graphs-on-single-server.md). + +This feature is only available in the Enterprise Edition. + +### EnterpriseGraphs (Enterprise Edition) + +The 3.10 version of ArangoDB introduces a specialized version of SmartGraphs, +called EnterpriseGraphs. + +EnterpriseGraphs come with a concept of automated sharding key selection, +meaning that the sharding key is randomly selected while ensuring that all +their adjacent edges are co-located +on the same servers, whenever possible. This approach provides significant +advantages as it minimizes the impact of having suboptimal sharding keys +defined when creating the graph. + +See the [EnterpriseGraphs](../../graphs/enterprisegraphs/_index.md) chapter for more details. + +This feature is only available in the Enterprise Edition. + +### (Disjoint) Hybrid SmartGraphs renaming + +(Disjoint) Hybrid SmartGraphs were renamed to +**(Disjoint) SmartGraphs using SatelliteCollections**. +The functionality and behavior of both types of graphs stay the same. + +## Computed Values + +This feature lets you define expressions on the collection level +that run on inserts, modifications, or both. You can access the data of the +current document to compute new values using a subset of AQL. + +Possible use cases are to add timestamps of the creation or last modification to +every document, to add default attributes, or to automatically process +attributes for indexing purposes, like filtering, combining multiple attributes +into one, and to convert characters to lowercase. + +The following example uses the JavaScript API to create a collection with two +computed values, one to add a timestamp of the document creation, and another +to maintain an attribute that combines two other attributes: + +```js +var coll = db._create("users", { + computedValues: [ + { + name: "createdAt", + expression: "RETURN DATE_ISO8601(DATE_NOW())", + overwrite: true, + computeOn: ["insert"] + }, + { + name: "fullName", + expression: "RETURN LOWER(CONCAT_SEPARATOR(' ', @doc.firstName, @doc.lastName))", + overwrite: false, + computeOn: ["insert", "update", "replace"], // default + keepNull: false, + failOnWarning: true + } + ] +}); +var doc = db.users.save({ firstName: "Paula", lastName: "Plant" }); +/* Stored document: + { + "createdAt": "2022-08-08T17:14:37.362Z", + "fullName": "paula plant", + "firstName": "Paula", + "lastName": "Plant" + } +*/ +``` + +See [Computed Values](../../concepts/data-structure/documents/computed-values.md) for more +information and examples. + +## ArangoSearch + +### Inverted collection indexes + +A new `inverted` index type is available that you can define at the collection +level. You can use these indexes similar to `arangosearch` Views, to accelerate +queries like value lookups, range queries, accent- and case-insensitive search, +wildcard and fuzzy search, nested search, as well as for +sophisticated full-text search with the ability to search for words, phrases, +and more. + +```js +db.imdb_vertices.ensureIndex({ + type: "inverted", + name: "inv-idx", + fields: [ + "title", + { name: "description", analyzer: "text_en" } + ] +}); + +db._query(`FOR doc IN imdb_vertices OPTIONS { indexHint: "inv-idx", forceIndexHint: true } + FILTER TOKENS("neo morpheus", "text_en") ALL IN doc.description + RETURN doc.title`); +``` + +You need to use an index hint to utilize an inverted index. +Note that the `FOR` loop uses a collection, not a View, and documents are +matched using a `FILTER` operation. Filter conditions work similar to the +`SEARCH` operation but you don't need to specify Analyzers with the `ANALYZER()` +function in queries. + +Like Views, this type of index is eventually consistent. + +See [Inverted index](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md) for details. + +### `search-alias` Views + +A new `search-alias` View type was added to let you add one or more +inverted indexes to a View, enabling federated searching over multiple collections, +ranking of search results by relevance, and search highlighting, similar to +`arangosearch` Views. This is on top of the filtering capabilities provided by the +inverted indexes, including full-text processing with Analyzers and more. + +```js +db._createView("view", "search-alias", { + indexes: [ + { collection: "coll", index: "inv-idx" } + ] +}); + +db._query(`FOR doc IN imdb + SEARCH STARTS_WITH(doc.title, "The Matrix") AND + PHRASE(doc.description, "invasion", 2, "machine") + RETURN doc`); +``` + +A key difference between `arangosearch` and `search-alias` Views is that you don't +need to specify an Analyzer context with the `ANALYZER()` function in queries +because it is inferred from the inverted index definition, which only supports +a single Analyzer per field. + +Also see [Getting started with ArangoSearch](../../index-and-search/arangosearch/_index.md#getting-started-with-arangosearch). + +### Search highlighting (Enterprise Edition) + +Views now support search highlighting, letting you retrieve the positions of +matches within strings, to highlight what was found in search results. + +You need to index attributes with custom Analyzers that have the new `offset` +feature enabled to use this feature. You can then call the +[`OFFSET_INFO()` function](../../aql/functions/arangosearch.md#offset_info) to +get the start offsets and lengths of the matches (in bytes). + +You can use the [`SUBSTRING_BYTES()` function](../../aql/functions/string.md#substring_bytes) +together with the [`VALUE()` function](../../aql/functions/document-object.md#value) to +extract a match. + +```js +db._create("food"); +db.food.save({ name: "avocado", description: { en: "The avocado is a medium-sized, evergreen tree, native to the Americas." } }); +db.food.save({ name: "carrot", description: { en: "The carrot is a root vegetable, typically orange in color, native to Europe and Southwestern Asia." } }); +db.food.save({ name: "chili pepper", description: { en: "Chili peppers are varieties of the berry-fruit of plants from the genus Capsicum, cultivated for their pungency." } }); +db.food.save({ name: "tomato", description: { en: "The tomato is the edible berry of the tomato plant." } }); + +var analyzers = require("@arangodb/analyzers"); +var analyzer = analyzers.save("text_en_offset", "text", { locale: "en", stopwords: [] }, ["frequency", "norm", "position", "offset"]); + +db._createView("food_view", "arangosearch", { links: { food: { fields: { description: { fields: { en: { analyzers: ["text_en_offset"] } } } } } } }); +db._query(`FOR doc IN food_view + SEARCH ANALYZER( + TOKENS("avocado tomato", "text_en_offset") ANY == doc.description.en OR + PHRASE(doc.description.en, "cultivated", 2, "pungency") OR + STARTS_WITH(doc.description.en, "cap") + , "text_en_offset") + FOR offsetInfo IN OFFSET_INFO(doc, ["description.en"]) + RETURN { + description: doc.description, + name: offsetInfo.name, + matches: offsetInfo.offsets[* RETURN { + offset: CURRENT, + match: SUBSTRING_BYTES(VALUE(doc, offsetInfo.name), CURRENT[0], CURRENT[1]) + }] + }`); +``` + +```json +[ + { + "description" : { "en" : "The avocado is a medium-sized, evergreen tree, native to the Americas." }, + "name" : [ "description", "en" ], + "matches" : [ + { "offset" : [4, 11], "match" : "avocado" } + ] + }, + { + "description" : { "en" : "Chili peppers are varieties of the berry-fruit of plants from the genus Capsicum, cultivated for their pungency." }, + "name" : [ "description", "en" ], + "matches" : [ + { "offset" : [82, 111], "match" : "cultivated for their pungency" }, + { "offset" : [72, 80], "match" : "Capsicum" } + ] + }, + { + "description" : { "en" : "The tomato is the edible berry of the tomato plant." }, + "name" : [ "description", "en" ], + "matches" : [ + { "offset" : [4, 10], "match" : "tomato" }, + { "offset" : [38, 44], "match" : "tomato" } + ] + } +] +*/ +``` + +See [Search highlighting with ArangoSearch](../../index-and-search/arangosearch/search-highlighting.md) +for details. + +### Nested search (Enterprise Edition) + +Nested search allows you to index arrays of objects in a way that lets you +search the sub-objects with all the conditions met by a single sub-object +instead of each condition being met by any of the sub-objects. + +Consider a document like the following: + +```json +{ + "dimensions": [ + { "type": "height", "value": 35 }, + { "type": "width", "value": 60 } + ] +} +``` + +The following search query matches the document because the individual conditions +are satisfied by one of the nested objects: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions.type == "height" AND doc.dimensions.value > 40 + RETURN doc +``` + +If you only want to find documents where both conditions are true for a single +nested object, you could post-filter the search results: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions.type == "height" AND doc.dimensions.value > 40 + FILTER LENGTH(doc.dimensions[* FILTER CURRENT.type == "height" AND CURRENT.value > 40]) > 0 + RETURN doc +``` + +The new nested search feature allows you to simplify the query and get better +performance: + +```aql +FOR doc IN viewName + SEARCH doc.dimensions[? FILTER CURRENT.type == "height" AND CURRENT.value > 40] + RETURN doc +``` + +See [Nested search with ArangoSearch](../../index-and-search/arangosearch/nested-search.md) using Views +and the nested search example using [Inverted indexes](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md#nested-search-enterprise-edition) +for details. + +This feature is only available in the Enterprise Edition. + +### Optimization rule `arangosearch-constrained-sort` + +This new optimization rule brings significant performance improvements by +allowing you to perform sorting and limiting inside `arangosearch` Views +enumeration node, if using just scoring for a sort operation. + +### ArangoSearch column cache (Enterprise Edition) + +[`arangosearch` Views](../../index-and-search/arangosearch/arangosearch-views-reference.md) support new caching options. + +<small>Introduced in: v3.9.5, v3.10.2</small> + +- You can enable the new `cache` option for individual View links or fields + to always cache field normalization values in memory. This can improve the + performance of scoring and ranking queries. + + It also enables caching of auxiliary data used for querying fields that are + indexed with Geo Analyzers. This can improve the performance of geo-spatial + queries. + +- You can enable the new `cache` option in the definition of a `storedValues` + View property to always cache stored values in memory. This can improve the + query performance if stored values are involved. + +--- + +<small>Introduced in: v3.9.6, v3.10.2</small> + +- You can enable the new `primarySortCache` View property to always cache the + primary sort columns in memory. This can improve the performance of queries + that utilize the primary sort order. + +- You can enable the new `primaryKeyCache` View property to always cache the + primary key column in memory. This can improve the performance of queries + that return many documents. + +--- + +[Inverted indexes](../../develop/http-api/indexes/inverted.md) also support similar new caching +options. + +<small>Introduced in: v3.10.2</small> + +- A new `cache` option for inverted indexes as the default or for specific + `fields` to always cache field normalization values and Geo Analyzer auxiliary + data in memory. + +- A new `cache` option per object in the definition of the `storedValues` + elements to always cache stored values in memory. + +- A new `cache` option in the `primarySort` property to always cache the + primary sort columns in memory. + +- A new `primaryKeyCache` property for inverted indexes to always cache the + primary key column in memory. + +--- + +The cache size can be controlled with the new `--arangosearch.columns-cache-limit` +startup option and monitored via the new `arangodb_search_columns_cache_size` +metric. + +ArangoSearch caching is only available in the Enterprise Edition. + +See [Optimizing View and inverted index query performance](../../index-and-search/arangosearch/performance.md) +for examples. + +{{< info >}} +If you use ArangoSearch caching in supported 3.9 versions and upgrade an +Active Failover deployment to 3.10, you may need to re-configure the +cache-related options and thus recreate inverted indexes and Views. See +[Known Issues in 3.10](known-issues-in-3-10.md#arangosearch). +{{< /info >}} + +### Skip ArangoSearch recovery + +With `--arangosearch.skip-recovery`, you can skip data recovery for the +specified View links and inverted indexes on startup. +Values for this startup option should have the format `<collection-name>/<link-id>`, +`<collection-name>/<index-id>`, or `<collection-name>/<index-name>`. +On DB-Servers, the `<collection-name>` part should contain a shard name. + +### Fail ArangoSearch queries on out-of-sync + +With the `--arangosearch.fail-queries-on-out-of-sync` startup option you can let +write operations fail if `arangosearch` View links or inverted indexes are not +up-to-date with the collection data. The option is set to `false` by default. +Queries on out-of-sync links/indexes are answered normally, but the return data +may be incomplete. +If set to `true`, any data retrieval queries on out-of-sync +links/indexes are going to fail with error "collection/view is out of sync" +(error code 1481). + +### Disable user-defined AQL functions + +<small>Introduced in: v3.10.4</small> + +The new `--javascript.user-defined-functions` startup option lets you disable +user-defined AQL functions so that no user-defined JavaScript code of +[UDFs](../../aql/user-defined-functions.md) runs on the server. This can be useful to close off +a potential attack vector in case no user-defined AQL functions are used. +Also see [Server security options](../../operations/security/security-options.md). + +### ArangoSearch metrics and figures + +The [Metrics HTTP API](../../develop/http-api/monitoring/metrics.md) has been +extended with metrics for ArangoSearch for monitoring `arangosearch` View links +and inverted indexes. + +The following metrics have been added in ArangoDB 3.10: + +| Label | Description | +|:------|:------------| +| `arangodb_search_cleanup_time` | Average time of few last cleanups. +| `arangodb_search_commit_time` | Average time of few last commits. +| `arangodb_search_consolidation_time` | Average time of few last consolidations. +| `arangodb_search_index_size` | Size of the index in bytes for current snapshot. +| `arangodb_search_num_docs` | Number of documents for current snapshot. +| `arangodb_search_num_failed_cleanups` | Number of failed cleanups. +| `arangodb_search_num_failed_commits` | Number of failed commits. +| `arangodb_search_num_failed_consolidations` | Number of failed consolidations. +| `arangodb_search_num_files` | Number of files for current snapshot. +| `arangodb_search_num_live_docs` | Number of live documents for current snapshot. +| `arangodb_search_num_out_of_sync_links` | Number of out-of-sync arangosearch links/inverted indexes. +| `arangodb_search_num_segments` | Number of segments for current snapshot. +| `arangodb_search_columns_cache_size` | Size of all ArangoSearch columns currently loaded into the cache. + +These metrics are exposed by single servers and DB-Servers. + +Additionally, the JavaScript and HTTP API for indexes has been extended with +figures for `arangosearch` View links and inverted indexes. + +In arangosh, you can call `db.<collection>.indexes(true, true);` to get at this +information. Also see [Listing all indexes of a collection](../../index-and-search/indexing/working-with-indexes/_index.md#listing-all-indexes-of-a-collection). +The information has the following structure: + +```js +{ + "figures" : { + "numDocs" : 4, // total number of documents in the index with removals + "numLiveDocs" : 4, // total number of documents in the index without removals + "numSegments" : 1, // total number of index segments + "numFiles" : 8, // total number of index files + "indexSize" : 1358 // size of the index in bytes + }, ... +} +``` + +Note that the number of (live) docs may differ from the actual number of +documents if the nested search feature is used. + +## Analyzers + +### `minhash` Analyzer (Enterprise Edition) + +This new Analyzer applies another Analyzer, for example, a `text` Analyzer to +tokenize text into words, and then computes so called *MinHash signatures* from +the tokens using a locality-sensitive hash function. The result lets you +approximate the Jaccard similarity of sets. + +A common use case is to compare sets with many elements for entity resolution, +such as for finding duplicate records, based on how many common elements they +have. + +You can use the Analyzer with a new inverted index or `arangosearch` View to +quickly find candidates for the actual Jaccard similarity comparisons you want +to perform. + +This feature is only available in the Enterprise Edition. + +See [Analyzers](../../index-and-search/analyzers.md#minhash) for details. + +### `classification` Analyzer (Enterprise Edition) + +A new, experimental Analyzer for classifying individual tokens or entire inputs +using a supervised fastText word embedding model that you provide. + +This feature is only available in the Enterprise Edition. + +See [Analyzers](../../index-and-search/analyzers.md#classification) for details. + +### `nearest_neighbors` Analyzer (Enterprise Edition) + +A new, experimental Analyzer for finding similar tokens +using a supervised fastText word embedding model that you provide. + +This feature is only available in the Enterprise Edition. + +See [Analyzers](../../index-and-search/analyzers.md#nearest_neighbors) for details. + +### `geo_s2` Analyzer (Enterprise Edition) + +<small>Introduced in: v3.10.5</small> + +This new Analyzer lets you index GeoJSON data with inverted indexes or Views +similar to the existing `geojson` Analyzer, but it internally uses a format for +storing the geo-spatial data that is more efficient. + +You can choose between different formats to make a tradeoff between the size on +disk, the precision, and query performance: + +- 8 bytes per coordinate pair using 4-byte integer values, with limited precision. +- 16 bytes per coordinate pair using 8-byte floating-point values, which is still + more compact than the VelocyPack format used by the `geojson` Analyzer +- 24 bytes per coordinate pair using the native Google S2 format to reduce the number + of computations necessary when you execute geo-spatial queries. + +This feature is only available in the Enterprise Edition. + +See [Analyzers](../../index-and-search/analyzers.md#geo_s2) for details. + +## Web Interface + +The 3.10 release of ArangoDB introduces a new Web UI for **Views** that allows +you to view, configure, or drop `arangosearch` Views. + +## AQL + +### All Shortest Paths Graph Traversal + +In addition to finding any shortest path and enumerating all paths between two +vertices in order of increasing length, you can now use the new +`ALL_SHORTEST_PATHS` graph traversal algorithm in AQL to get all paths of +shortest length: + +```aql +FOR p IN OUTBOUND ALL_SHORTEST_PATHS 'places/Carlisle' TO 'places/London' + GRAPH 'kShortestPathsGraph' + RETURN { places: p.vertices[*].label } +``` + +See [All Shortest Paths in AQL](../../aql/graphs/all-shortest-paths.md) for details. + +### Parallelism for Sharded Graphs (Enterprise Edition) + +The 3.10 release supports traversal parallelism for Sharded Graphs, +which means that traversals with many start vertices can now run +in parallel. An almost linear performance improvement has been +achieved, so the parallel processing of threads leads to faster results. + +This feature supports all types of graphs - General Graphs, SmartGraphs, +EnterpriseGraphs (including Disjoint). + +Traversals with many start vertices can now run in parallel. +A traversal always starts with one single start vertex and then explores +the vertex neighborhood. When you want to explore the neighborhoods of +multiple vertices, you now have the option to do multiple operations in parallel. + +The example below shows how to use parallelism to allow using up to three +threads to search for `v/1`, `v/2`, and `v/3` in parallel and independent of one +another. Note that parallelism increases the memory usage of the query due to +having multiple operations performed simultaneously, instead of one after the +other. + +```aql +FOR startVertex IN ["v/1", "v/2", "v/3", "v/4"] +FOR v,e,p IN 1..3 OUTBOUND startVertex GRAPH "yourShardedGraph" OPTIONS {parallelism: 3} +[...] +``` + +This feature is only available in the Enterprise Edition. + +### GeoJSON changes + +The 3.10 release of ArangoDB conforms to the standards specified in +[GeoJSON](https://datatracker.ietf.org/doc/html/rfc7946) +and [GeoJSON Mode](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#geojson-mode). +This diverges from the previous implementation in two fundamental ways: + +1. The syntax of GeoJSON objects is interpreted so that lines on the + sphere are geodesics (pieces of great circles). This is in + particular true for boundaries of polygons. No special treatment + of longitude-latitude-rectangles is done any more. + +2. Linear rings in polygons are no longer automatically normalized so + that the "smaller" of the two connected components are the interior. + This allows specifying polygons that cover more than half of + the surface of the Earth and conforms to the GeoJSON standard. + See [GeoJSON interpretation](../../aql/functions/geo.md#geojson-interpretation) + for examples. + +Additionally, the reported issues, which occasionally produced +wrong results in geo queries when using geo indexes, have been fixed. + +For existing users who do not wish to rebuild their geo indexes and +continue using the previous behavior, the `legacyPolygons` index option +has been introduced to guarantee backwards compatibility. + +For existing users who wish to take advantage of the new standard behavior, +geo indexes need to be dropped and recreated after an upgrade. + +See [Legacy Polygons](../../index-and-search/indexing/working-with-indexes/geo-spatial-indexes.md#legacy-polygons) for +details and for hints about upgrading to version 3.10 or later. + +If you use `geojson` Analyzers including in `arangosearch` Views and upgrade +from a version below 3.10 to a version of 3.10 or higher, the interpretation of +GeoJSON Polygons changes. See the `legacy` property of the +[`geojson` Analyzer](../../index-and-search/analyzers.md#geojson) for details and how to restore the +old behavior. + +### Traversal Projections (Enterprise Edition) + +Starting with version 3.10, the AQL optimizer automatically detects which +document attributes you access in traversal queries and optimizes the data +loading. This optimization is beneficial if you have large document sizes +but only access small parts of the documents. + +By default, up to 5 attributes are extracted instead of loading the full document. +You can control this number with the `maxProjections` option, which is now +supported for [graph traversals](../../aql/graphs/traversals.md#working-with-named-graphs). +See also [how to use `maxProjections` with FOR loops](../../aql/high-level-operations/for.md#maxprojections). + +In the following query, the accessed attributes are the `name` attribute of the +neighbor vertices and the `vertex` attribute of the edges (via the path variable): + +```aql +FOR v, e, p IN 1..3 OUTBOUND "persons/alice" GRAPH "knows_graph" OPTIONS { maxProjections: 5 } + RETURN { name: v.name, vertices: p.edges[*].vertex } +``` + +The use of projections is indicated in the query explain output: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 TraversalNode 1 - FOR v /* vertex (projections: `name`) */, p /* paths: edges (projections: `_from`, `_to`, `vertex`) */ IN 1..3 /* min..maxPathDepth */ OUTBOUND 'persons/alice' /* startnode */ GRAPH 'knows_graph' + 3 CalculationNode 1 - LET #7 = { "name" : v.`name`, "vertex" : p.`edges`[*].`vertex` } /* simple expression */ + 4 ReturnNode 1 - RETURN #7 +``` + +This feature is only available in the Enterprise Edition. + +### Number of filtered documents in profiling output + +The AQL query profiling output now shows the number of filtered inputs for each execution node +separately, so that it is more visible how often filter conditions are invoked and how effective +they are. Previously the number of filtered inputs was only available as a total value in the +profiling output, and it wasn't clear which execution node caused which amount of filtering. + +For example, consider the following query: + +```aql +FOR doc1 IN collection + FILTER doc1.value1 < 1000 /* uses index */ + FILTER doc1.value2 NOT IN [1, 4, 7] /* post filter */ + FOR doc2 IN collection + FILTER doc1.value1 == doc2.value2 /* uses index */ + FILTER doc2.value2 != 5 /* post filter */ + RETURN doc2 +``` + +The profiling output for this query now shows how often the filters were invoked for the +different execution nodes: + +```aql +Execution plan: + Id NodeType Calls Items Filtered Runtime [s] Comment + 1 SingletonNode 1 1 0 0.00008 * ROOT + 14 IndexNode 1 700 300 0.00694 - FOR doc1 IN collection /* persistent index scan, projections: `value1`, `value2` */ FILTER (doc1.`value2` not in [ 1, 4, 7 ]) /* early pruning */ + 13 IndexNode 61 60000 10000 0.11745 - FOR doc2 IN collection /* persistent index scan */ FILTER (doc2.`value2` != 5) /* early pruning */ + 12 ReturnNode 61 60000 0 0.00212 - RETURN doc2 + +Indexes used: + By Name Type Collection Unique Sparse Selectivity Fields Ranges + 14 idx_1727463382256189440 persistent collection false false 99.99 % [ `value1` ] (doc1.`value1` < 1000) + 13 idx_1727463477736374272 persistent collection false false 0.01 % [ `value2` ] (doc1.`value1` == doc2.`value2`) + +Query Statistics: + Writes Exec Writes Ign Scan Full Scan Index Cache Hits/Misses Filtered Peak Mem [b] Exec Time [s] + 0 0 0 71000 0 / 0 10300 98304 0.13026 +``` + +### Number of cache hits / cache misses in profiling output + +When profiling an AQL query via `db._profileQuery(...)` command or via the web interface, the +query profile output will now contain the number of index entries read from +in-memory caches (usable for edge and persistent indexes) plus the number of cache misses. + +In the following example query, there are in-memory caches present for both indexes used in +the query. However, only the innermost index node #13 can use the cache, because the outer +FOR loop does not use an equality lookup. + +```aql +Query String (270 chars, cacheable: false): + FOR doc1 IN collection FILTER doc1.value1 < 1000 FILTER doc1.value2 NOT IN [1, 4, 7] + FOR doc2 IN collection FILTER doc1.value1 == doc2.value2 FILTER doc2.value2 != 5 RETURN doc2 + +Execution plan: + Id NodeType Calls Items Filtered Runtime [s] Comment + 1 SingletonNode 1 1 0 0.00008 * ROOT + 14 IndexNode 1 700 300 0.00630 - FOR doc1 IN collection /* persistent index scan, projections: `value1`, `value2` */ FILTER (doc1.`value2` not in [ 1, 4, 7 ]) /* early pruning */ + 13 IndexNode 61 60000 10000 0.14254 - FOR doc2 IN collection /* persistent index scan */ FILTER (doc2.`value2` != 5) /* early pruning */ + 12 ReturnNode 61 60000 0 0.00168 - RETURN doc2 + +Indexes used: + By Name Type Collection Unique Sparse Cache Selectivity Fields Ranges + 14 idx_1727463613020504064 persistent collection false false true 99.99 % [ `value1` ] (doc1.`value1` < 1000) + 13 idx_1727463601873092608 persistent collection false false true 0.01 % [ `value2` ] (doc1.`value1` == doc2.`value2`) + +Query Statistics: + Writes Exec Writes Ign Scan Full Scan Index Cache Hits/Misses Filtered Peak Mem [b] Exec Time [s] + 0 0 0 71000 689 / 11 10300 98304 0.15389 +``` + +### Number of cluster requests in profiling output + +<small>Introduced in: v3.9.5, v3.10.2</small> + +The query profiling output in the web interface and _arangosh_ now shows the +number of HTTP requests for queries that you run against cluster deployments in +the `Query Statistics`: + +```aql +Query String (33 chars, cacheable: false): + FOR doc IN coll + RETURN doc._key + +Execution plan: + Id NodeType Site Calls Items Filtered Runtime [s] Comment + 1 SingletonNode DBS 3 3 0 0.00024 * ROOT + 9 IndexNode DBS 3 0 0 0.00060 - FOR doc IN coll /* primary index scan, index only (projections: `_key`), 3 shard(s) */ + 3 CalculationNode DBS 3 0 0 0.00025 - LET #1 = doc.`_key` /* attribute expression */ /* collections used: doc : coll */ + 7 RemoteNode COOR 6 0 0 0.00227 - REMOTE + 8 GatherNode COOR 2 0 0 0.00209 - GATHER /* parallel, unsorted */ + 4 ReturnNode COOR 2 0 0 0.00008 - RETURN #1 + +Indexes used: + By Name Type Collection Unique Sparse Cache Selectivity Fields Stored values Ranges + 9 primary primary coll true false false 100.00 % [ `_key` ] [ ] * + +Optimization rules applied: + Id RuleName + 1 scatter-in-cluster + 2 distribute-filtercalc-to-cluster + 3 remove-unnecessary-remote-scatter + 4 reduce-extraction-to-projection + 5 parallelize-gather + +Query Statistics: + Writes Exec Writes Ign Scan Full Scan Index Cache Hits/Misses Filtered Requests Peak Mem [b] Exec Time [s] + 0 0 0 0 0 / 0 0 9 32768 0.00564 +``` + +### Index Lookup Optimization + +ArangoDB 3.10 features a new optimization for index lookups that can help to +speed up index accesses with post-filter conditions. The optimization is +triggered if an index is used that does not cover all required attributes for +the query, but the index lookup post-filter conditions only access attributes +that are part of the index. + +For example, if you have a collection with an index on `value1` and `value2`, +a query like below can only partially utilize the index for the lookup: + +```aql +FOR doc IN collection + FILTER doc.value1 == @value1 /* uses the index */ + FILTER ABS(doc.value2) != @value2 /* does not use the index */ + RETURN doc +``` + +In this case, previous versions of ArangoDB always fetched the full documents +from the storage engine for all index entries that matched the index lookup +conditions. 3.10 will now only fetch the full documents from the storage engine +for all index entries that matched the index lookup conditions, and that satisfy +the index lookup post-filter conditions, too. + +If the post-filter conditions filter out a lot of documents, this optimization +can significantly speed up queries that produce large result sets from index +lookups but filter many of the documents away with post-filter conditions. + +See [Filter Projections Optimization](../../aql/execution-and-performance/query-optimization.md#filter-projections-optimizations) +for details. + +### Lookahead for Multi-Dimensional Indexes + +The multi-dimensional index type `zkd` (experimental) now supports an optional +index hint for tweaking performance: + +```aql +FOR … IN … OPTIONS { lookahead: 32 } +``` + +See [Lookahead Index Hint](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md#lookahead-index-hint). + +### Question mark operator + +The new `[? ... ]` array operator is a shorthand for an inline filter with a +surrounding length check: + +```aql +LET arr = [ 1, 2, 3, 4 ] +RETURN arr[? 2 FILTER CURRENT % 2 == 0] // true + +/* Equivalent expression: +RETURN LENGTH(arr[* FILTER CURRENT % 2 == 0]) == 2 +*/ +``` + +The quantifier can be a number, a range, `NONE`, `ANY`, `ALL`, or `AT LEAST`. + +This operator is used for the new [Nested search](#nested-search-enterprise-edition) +feature (Enterprise Edition only). + +See [Array Operators](../../aql/operators.md#question-mark-operator) +for details. + +### New `AT LEAST` array comparison operator + +You can now combine one of the supported comparison operators with the special +`AT LEAST (<expression>)` operator to require an arbitrary number of elements +to satisfy the condition to evaluate to `true`. You can use a static number or +calculate it dynamically using an expression: + +```aql +[ 1, 2, 3 ] AT LEAST (2) IN [ 2, 3, 4 ] // true +["foo", "bar"] AT LEAST (1+1) == "foo" // false +``` + +See [Array Comparison Operators](../../aql/operators.md#array-comparison-operators). +The `AT LEAST` operator is also supported by ArangoSearch in the +[`SEARCH` operation](../../aql/high-level-operations/search.md#array-comparison-operators). + +### New and Changed AQL Functions + +AQL functions added to the 3.10 Enterprise Edition: + +- [`OFFSET_INFO()`](../../aql/functions/arangosearch.md#offset_info): + An ArangoSearch function to get the start offsets and lengths of matches for + [search highlighting](../../index-and-search/arangosearch/search-highlighting.md). + +- [`MINHASH()`](../../aql/functions/miscellaneous.md#minhash): + A new function for locality-sensitive hashing to approximate the + Jaccard similarity. + +- [`MINHASH_COUNT()`](../../aql/functions/miscellaneous.md#minhash_count): + A helper function to calculate the number of hashes (MinHash signature size) + needed to not exceed the specified error amount. + +- [`MINHASH_ERROR()`](../../aql/functions/miscellaneous.md#minhash_error): + A helper function to calculate the error amount based on the number of hashes + (MinHash signature size). + +- [`MINHASH_MATCH()`](../../aql/functions/arangosearch.md#minhash_match): + A new ArangoSearch function to match documents with an approximate + Jaccard similarity of at least the specified threshold that are indexed by a View. + +AQL functions added to all editions of 3.10: + +- [`SUBSTRING_BYTES()`](../../aql/functions/string.md#substring_bytes): + A function to get a string subset using a start and length in bytes instead of + in number of characters. + +- [`VALUE()`](../../aql/functions/document-object.md#value): + A new document function to dynamically get an attribute value of an object, + using an array to specify the path. + +- [`KEEP_RECURSIVE()`](../../aql/functions/document-object.md#keep_recursive): + A document function to recursively keep attributes from objects/documents, + as a counterpart to `UNSET_RECURSIVE()`. + +AQL functions changed in 3.10: + +- [`MERGE_RECURSIVE()`](../../aql/functions/document-object.md#merge_recursive): + You can now call the function with a single argument instead of at least two. + It also accepts an array of objects now, matching the behavior of the + `MERGE()` function. + +- [`EXISTS()`](../../aql/functions/arangosearch.md#testing-for-nested-fields): + The function supports a new signature `EXISTS(doc.attr, "nested")` to check + whether the specified attribute is indexed as nested field by a View or + inverted index (introduced in v3.10.1). + +### Edge cache refilling (experimental) + +<small>Introduced in: v3.9.6, v3.10.2</small> + +A new feature to automatically refill the in-memory edge cache is available. +When edges are added, modified, or removed, these changes are tracked and a +background thread tries to update the edge cache accordingly if the feature is +enabled, by adding new, updating existing, or deleting and refilling cache +entries. + +You can enable it for individual `INSERT`, `UPDATE`, `REPLACE`, and `REMOVE` +operations in AQL queries (using `OPTIONS { refillIndexCaches: true }`), for +individual document API requests that insert, update, replace, or remove single +or multiple edge documents (by setting `refillIndexCaches=true` as query +parameter), as well as enable it by default using the new +`--rocksdb.auto-refill-index-caches-on-modify` startup option. + +The new `--rocksdb.auto-refill-index-caches-queue-capacity` startup option +restricts how many edge cache entries the background thread can queue at most. +This limits the memory usage for the case of the background thread being slower +than other operations that invalidate edge cache entries. + +The background refilling is done on a best-effort basis and not guaranteed to +succeed, for example, if there is no memory available for the cache subsystem, +or during cache grow/shrink operations. A background thread is used so that +foreground write operations are not slowed down by a lot. It may still cause +additional I/O activity to look up data from the storage engine to repopulate +the cache. + +In addition to refilling the edge cache, the cache can also automatically be +seeded on server startup. Use the new `--rocksdb.auto-fill-index-caches-on-startup` +startup option to enable this feature. It may cause additional CPU and I/O load. +You can limit how many index filling operations can execute concurrently with the +`--rocksdb.max-concurrent-index-fill-tasks` option. The lower this number, the +lower the impact of the cache filling, but the longer it takes to complete. + +The following metrics are available: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_auto_refill_loaded_total` | Total number of queued items for in-memory index caches refilling. +| `rocksdb_cache_auto_refill_dropped_total` | Total number of dropped items for in-memory index caches refilling. +| `rocksdb_cache_full_index_refills_total` | Total number of in-memory index caches refill operations for entire indexes. + +This feature is experimental. + +Also see: +- [AQL `INSERT` operation](../../aql/high-level-operations/insert.md#refillindexcaches) +- [AQL `UPDATE` operation](../../aql/high-level-operations/update.md#refillindexcaches) +- [AQL `REPLACE` operation](../../aql/high-level-operations/replace.md#refillindexcaches) +- [AQL `REMOVE` operation](../../aql/high-level-operations/remove.md#refillindexcaches) +- [Document HTTP API](../../develop/http-api/documents.md) +- [Edge cache refill options](#edge-cache-refill-options) + +### Extended query explain statistics + +<small>Introduced in: v3.10.4</small> + +The query explain result now includes the peak memory usage and execution time. +This helps finding queries that use a lot of memory or take long to build the +execution plan. + +The additional statistics are displayed at the end of the output in the +web interface (using the **Explain** button in the **QUERIES** section) and in +_arangosh_ (using `db._explain()`): + +``` +44 rule(s) executed, 1 plan(s) created, peak mem [b]: 32768, exec time [s]: 0.00214 +``` + +The HTTP API returns the extended statistics in the `stats` attribute when you +use the `POST /_api/explain` endpoint: + +```json +{ + ... + "stats": { + "rulesExecuted": 44, + "rulesSkipped": 0, + "plansCreated": 1, + "peakMemoryUsage": 32768, + "executionTime": 0.00241307167840004 + } +} +``` + +Also see: +- [API Changes in ArangoDB 3.10](api-changes-in-3-10.md#explain-api) +- [The AQL query optimizer](../../aql/execution-and-performance/query-optimization.md#optimizer-statistics) + +## Indexes + +### Parallel index creation (Enterprise Edition) + +In the Enterprise Edition, non-unique indexes can be created with multiple +threads in parallel. The number of parallel index creation threads is currently +set to 2, but future versions of ArangoDB may increase this value. +Parallel index creation is only triggered for collections with at least 120,000 +documents. + +### Storing additional values in indexes + +Persistent indexes now allow you to store additional attributes in the index +that can be used to cover more queries without having to look up full documents. +They cannot be used for index lookups or for sorting, but for projections only. + +You can specify the additional attributes in the new `storedValues` option when +creating a new persistent index: + +```js +db.<collection>.ensureIndex({ + type: "persistent", + fields: ["value1"], + storedValues: ["value2"] +}); +``` + +See [Persistent Indexes](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#storing-additional-values-in-indexes). + +### Enabling caching for index values + +Persistent indexes now support in-memory caching of index entries, which can be +used when doing point lookups on the index. You can enable the cache with the +new `cacheEnabled` option when creating a persistent index: + +```js +db.<collection>.ensureIndex({ + type: "persistent", + fields: ["value"], + cacheEnabled: true +}); +``` + +This can have a great positive effect on index scan performance if the number of +scanned index entries is large. + +As the cache is hash-based and unsorted, it cannot be used for full or partial range +scans, for sorting, or for lookups that do not include all index attributes. + +See [Persistent Indexes](../../index-and-search/indexing/working-with-indexes/persistent-indexes.md#caching-of-index-values). + +## Document keys + +Some key generators can generate keys in an ascending order, meaning that document +keys with "higher" values also represent newer documents. This is true for the +`traditional`, `autoincrement` and `padded` key generators. + +Previously, the generated keys were only guaranteed to be truly ascending in single +server deployments. The reason was that document keys could be generated not only by +the DB-Server, but also by Coordinators (of which there are normally multiple instances). +While each component would still generate an ascending sequence of keys, the overall +sequence (mixing the results from different components) was not guaranteed to be +ascending. +ArangoDB 3.10 changes this behavior so that collections with only a single +shard can provide truly ascending keys. This includes collections in OneShard +databases as well. +Also, `autoincrement` key generation is now supported in cluster mode for +single-sharded collections. +Document keys are still not guaranteed to be truly ascending for collections with +more than a single shard. + +## Read from followers in Clusters (Enterprise Edition) + +You can now allow for reads from followers for a +number of read-only operations in cluster deployments. In this case, Coordinators +are allowed to read not only from leader shards but also from follower shards. +This has a positive effect, because the reads can scale out to all DB-Servers +that have copies of the data. Therefore, the read throughput is higher. + +This feature is only available in the Enterprise Edition. + +For more information, see [Read from followers](../../develop/http-api/documents.md#read-from-followers) +in the HTTP API documentation. + +The JavaScript API supports an `allowDirtyReads` option for +[AQL queries](../../aql/how-to-invoke-aql/with-arangosh.md#allowdirtyreads) and +[reading documents](../../develop/javascript-api/@arangodb/collection-object.md#collectiondocumentobject--options). + +## Improved shard rebalancing + +Starting with version 3.10, the shard rebalancing feature introduces an +automatic shard rebalancing API. + +You can do any of the following by using the API: + +- Get an analysis of the current cluster imbalance. +- Compute a plan of move shard operations to rebalance the cluster and thus improve balance. +- Execute the given set of move shard operations. +- Compute a set of move shard operations to improve balance and execute them immediately. + +For more information, see the [Cluster](../../develop/http-api/cluster.md#get-the-current-cluster-imbalance) +section of the HTTP API documentation. + +## Query result spillover to decrease memory usage + +Queries can be executed with storing intermediate and final results temporarily +on disk to decrease memory usage when a specified threshold is reached, either +based on the memory usage (in bytes) or the number of result rows. + +{{< info >}} +This feature is experimental and is turned off by default. It is currently +limited to AQL queries that use `SORT` operations but without a `LIMIT`. +The query results are still built up entirely in memory on Coordinators +and single servers unless you use streaming queries. +{{< /info >}} + +An example of how to configure the spillover feature: + +``` +arangod --database.directory "myDir" +--temp.intermediate-results-path "tempDir" +--temp.intermediate-results-encryption +--temp.intermediate-results-encryption-hardware-acceleration +--temp.intermediate-results-spillover-threshold-memory-usage 134217728 +--temp.intermediate-results-spillover-threshold-num-rows 50000 +``` + +You can also set the thresholds per query in the JavaScript and HTTP APIs. + +For details, see: +- [`temp` startup options](../../components/arangodb-server/options.md#--tempintermediate-results-path) +- [Executing queries from _arangosh_](../../aql/how-to-invoke-aql/with-arangosh.md#spilloverthresholdmemoryusage) +- [HTTP interfaces for AQL queries](../../develop/http-api/queries/aql-queries.md#create-a-cursor) + +## Server options + +### Responses early during instance startup + +The HTTP interface of _arangod_ instances can now optionally be started earlier +during the startup process, so that ping probes from monitoring tools can +already be responded to when the instance has not fully started. + +You can set the new `--server.early-connections` startup option to `true` to +let the instance respond to the `/_api/version`, `/_admin/version`, and +`/_admin/status` REST APIs early. + +See [Respond to liveliness probes](../../develop/http-api/general-request-handling.md#respond-to-liveliness-probes). + +### Cache RocksDB index and filter blocks by default + +The default value of the `--rocksdb.cache-index-and-filter-blocks` startup option was changed +from `false` to `true`. This makes RocksDB track all loaded index and filter blocks in the +block cache, so they are accounted against the RocksDB's block cache memory limit. +The default value for the `--rocksdb.enforce-block-cache-size-limit` startup option was also +changed from `false` to `true` to make the RocksDB block cache not temporarily exceed the +configured memory limit. + +These default value changes will make RocksDB adhere much better to the configured memory limit +(configurable via `--rocksdb.block-cache-size`). +The changes may have a small negative impact on performance because, if the block cache is +not large enough to hold the data plus the index and filter blocks, additional disk I/O may +need to be performed compared to the previous versions. +This is a trade-off between memory usage predictability and performance, and ArangoDB 3.10 +will default to more stable and predictable memory usage. If there is still unused RAM +capacity available, it may be sensible to increase the total size of the RocksDB block cache, +by increasing `--rocksdb.block-cache-size`. Due to the changed configuration, the block +cache size limit will not be exceeded anymore. + +It is possible to opt out of these changes and get back the memory and performance characteristics +of previous versions by setting the `--rocksdb.cache-index-and-filter-blocks` +and `--rocksdb.enforce-block-cache-size-limit` startup options to `false` on startup. + +### RocksDB range delete operations in cluster + +The new `--rocksdb.use-range-delete-in-wal` startup option controls whether the +collection truncate operation in a cluster can use RangeDelete operations in +RocksDB. Using RangeDeletes is fast and reduces the algorithmic complexity of +the truncate operation to O(1), compared to O(n) when this option is turned off +(with n being the number of documents in the collection/shard). + +Previous versions of ArangoDB used RangeDeletes only on a single server, but +never in a cluster. + +The default value for this startup option is `true`, and the option should only +be changed in case of emergency. This option is only honored in the cluster. +Single server and Active Failover deployments use RangeDeletes regardless of the +value of this option. + +Note that it is not guaranteed that all truncate operations use a RangeDelete +operation. For collections containing a low number of documents, the O(n) +truncate method may still be used. + +### Pregel configuration options + +There are now several startup options to configure the parallelism of Pregel jobs: + +- `--pregel.min-parallelism`: minimum parallelism usable in Pregel jobs. +- `--pregel.max-parallelism`: maximum parallelism usable in Pregel jobs. +- `--pregel.parallelism`: default parallelism to use in Pregel jobs. + +Administrators can use these options to set concurrency defaults and bounds +for Pregel jobs on an instance level. + +There are also new startup options to configure the usage of memory-mapped files for Pregel +temporary data: + +- `--pregel.memory-mapped-files`: to specify whether to use memory-mapped files or RAM for + storing temporary Pregel data. + +- `--pregel.memory-mapped-files-location-type`: to set a location for memory-mapped + files written by Pregel. This option is only meaningful, if memory-mapped + files are used. + +For more information on the new options, please refer to [ArangoDB Server Pregel Options](../../components/arangodb-server/options.md#pregel). + +### Query spillover options + +The following new options are available to control the +[Query spillover feature](#query-result-spillover-to-decrease-memory-usage). + +- `--temp.intermediate-results-path` +- `--temp.intermediate-results-encryption` (Enterprise Edition only) +- `--temp.intermediate-results-encryption-hardware-acceleration` (Enterprise Edition only) +- `--temp.intermediate-results-spillover-threshold-memory-usage` +- `--temp.intermediate-results-spillover-threshold-num-rows` + +### AQL query logging + +<small>Introduced in: v3.9.5, v3.10.2</small> + +There are three new startup options to configure how AQL queries are logged: + +- `--query.log-failed` for logging all failed AQL queries, to be used during + development or to catch unexpected failed queries in production (off by default) +- `--query.log-memory-usage-threshold` to define a peak memory threshold from + which on a warning is logged for AQL queries that exceed it (default: 4 GB) +- `--query.max-artifact-log-length` for controlling the length of logged query + strings and bind parameter values. Both are truncated to 4096 bytes by default. + +### ArangoSearch column cache limit + +<small>Introduced in: v3.9.5, v3.10.2</small> + +The new `--arangosearch.columns-cache-limit` startup option lets you control how +much memory (in bytes) the [ArangoSearch column cache](#arangosearch-column-cache-enterprise-edition) +is allowed to use. + +<small>Introduced in: v3.10.6</small> + +You can reduce the memory usage of the column cache in cluster deployments by +only using the cache for leader shards with the new +[`--arangosearch.columns-cache-only-leader` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-only-leader). +It is disabled by default, which means followers also maintain a column cache. + +### Cluster supervision options + +<small>Introduced in: v3.9.6, v3.10.2</small> + +The following new options allow you to delay supervision actions for a +configurable amount of time. This is desirable in case DB-Servers are restarted +or fail and come back quickly because it gives the cluster a chance to get in +sync and fully resilient without deploying additional shard replicas and thus +without causing any data imbalance: + +- `--agency.supervision-delay-add-follower`: + The delay in supervision, before an AddFollower job is executed (in seconds). + +- `--agency.supervision-delay-failed-follower`: + The delay in supervision, before a FailedFollower job is executed (in seconds). + +<small>Introduced in: v3.9.7, v3.10.2</small> + +A `--agency.supervision-failed-leader-adds-follower` startup option has been +added with a default of `true` (behavior as before). If you set this option to +`false`, a `FailedLeader` job does not automatically configure a new shard +follower, thereby preventing unnecessary network traffic, CPU load, and I/O load +for the case that the server comes back quickly. If the server has permanently +failed, an `AddFollower` job is created anyway eventually, as governed by the +`--agency.supervision-delay-add-follower` option. + +### Edge cache refill options + +<small>Introduced in: v3.9.6, v3.10.2</small> + +- `--rocksdb.auto-refill-index-caches-on-modify`: Whether to automatically + (re-)fill in-memory edge cache entries on insert/update/replace operations + by default. Default: `false`. +- `--rocksdb.auto-refill-index-caches-queue-capacity`: How many changes can be + queued at most for automatically refilling the edge cache. Default: `131072`. +- `--rocksdb.auto-fill-index-caches-on-startup`: Whether to automatically fill + the in-memory edge cache with entries on server startup. Default: `false`. +- `--rocksdb.max-concurrent-index-fill-tasks`: The maximum number of index fill + tasks that can run concurrently on server startup. Default: the number of + cores divided by 8, but at least `1`. + +--- + +<small>Introduced in: v3.9.10, v3.10.5</small> + +- `--rocksdb.auto-refill-index-caches-on-followers`: Control whether automatic + refilling of in-memory caches should happen on followers or only leaders. + The default value is `true`, i.e. refilling happens on followers, too. + +### RocksDB Bloom filter option + +<small>Introduced in: v3.10.3</small> + +A new `--rocksdb.bloom-filter-bits-per-key` startup option has been added to +configure the number of bits to use per key in a Bloom filter. + +The default value is `10`, which is downwards-compatible to the previously +hard-coded value. + +### Option to disable Foxx + +<small>Introduced in: v3.10.5</small> + +A `--foxx.enable` startup option has been added to let you configure whether +access to user-defined Foxx services is possible for the instance. It defaults +to `true`. + +If you set the option to `false`, access to Foxx services is forbidden and is +responded with an HTTP `403 Forbidden` error. Access to the management APIs for +Foxx services are also disabled as if you set `--foxx.api false` manually. + +Access to ArangoDB's built-in web interface, which is also a Foxx service, is +still possible even with the option set to `false`. + +Disabling the access to Foxx can be useful to close off a potential attack +vector in case Foxx is not used. +Also see [Server security options](../../operations/security/security-options.md). + +### RocksDB auto-flushing + +<small>Introduced in: v3.9.10, v3.10.5</small> + +A new feature for automatically flushing RocksDB Write-Ahead Log (WAL) files and +in-memory column family data has been added. + +An auto-flush occurs if the number of live WAL files exceeds a certain threshold. +This ensures that WAL files are moved to the archive when there are a lot of +live WAL files present, for example, after a restart. In this case, RocksDB does +not count any previously existing WAL files when calculating the size of WAL +files and comparing its `max_total_wal_size`. Auto-flushing fixes this problem, +but may prevent WAL files from being moved to the archive quickly. + +You can configure the feature via the following new startup options: +- `--rocksdb.auto-flush-min-live-wal-files`: + The minimum number of live WAL files that triggers an auto-flush. Defaults to `10`. +- `--rocksdb.auto-flush-check-interval`: + The interval (in seconds) in which auto-flushes are executed. Defaults to `3600`. + Note that an auto-flush is only executed if the number of live WAL files + exceeds the configured threshold and the last auto-flush is longer ago than + the configured auto-flush check interval. This avoids too frequent auto-flushes. + +### Configurable whitespace in metrics + +<small>Introduced in: v3.10.6</small> + +The output format of the metrics API slightly changed in v3.10.0. It no longer +had a space between the label and the value for metrics with labels. Example: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"}0 +``` + +The new `--server.ensure-whitespace-metrics-format` startup option lets you +control whether the metric label and value shall be separated by a space for +improved compatibility with some tools. This option is enabled by default. +From v3.10.6 onward, the default output format looks like this: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"} 0 +``` + +### Configurable interval when counting open file descriptors + +<small>Introduced in: v3.10.7</small> + +The `--server.count-descriptors-interval` startup option can be used to specify +the update interval in milliseconds when counting the number of open file +descriptors. + +The default value is `60000`, i.e. the update interval is once per minute. +To disable the counting of open file descriptors, you can set the value to `0`. +If counting is turned off, the `arangodb_file_descriptors_current` metric +reports a value of `0`. + +### Configurable limit of collections per query + +<small>Introduced in: v3.10.7</small> + +The `--query.max-collections-per-query` startup option allows you to adjust the +previously fixed limit for the maximum number of collections/shards per AQL query. +The default value is `2048`, which is equal to the fixed limit of +collections/shards in older versions. + +### Custom arguments to rclone + +<small>Introduced in: v3.9.11, v3.10.7</small> + +The `--rclone.argument` startup option can be used to prepend custom arguments +to rclone. For example, you can enable debug logging to a separate file on +startup as follows: + +``` +arangod --rclone.argument "--log-level=DEBUG" --rclone.argument "--log-file=rclone.log" +``` + +### Limit the number of databases in a deployment + +<small>Introduced in: v3.10.10</small> + +The `--database.max-databases` startup option allows you to limit the +number of databases that can exist in parallel in a deployment. You can use this +option to limit the resources used by database objects. If the option is used +and there are already as many databases as configured by this option, any +attempt to create an additional database fails with error +`32` (`ERROR_RESOURCE_LIMIT`). Additional databases can then only be created +if other databases are dropped first. The default value for this option is +unlimited, so an arbitrary amount of databases can be created. + +### Configurable maximum for queued log entries + +<small>Introduced in: v3.10.12</small> + +The new `--log.max-queued-entries` startup option lets you configure how many +log entries are queued in a background thread. + +Log entries are pushed on a queue for asynchronous writing unless you enable the +`--log.force-direct` startup option. If you use a slow log output (e.g. syslog), +the queue might grow and eventually overflow. + +You can configure the upper bound of the queue with this option. If the queue is +full, log entries are written synchronously until the queue has space again. + +### Monitoring per collection/database/user + +<small>Introduced in: v3.10.13</small> + +The following metrics have been introduced to track per-shard requests on +DB-Servers: +- `arangodb_collection_leader_reads_total`: The number of read requests on + leaders, per shard, and optionally also split by user. +- `arangodb_collection_leader_writes_total`: The number of write requests on + leaders, per shard, and optionally also split by user. +- `arangodb_collection_requests_bytes_read_total`: The number of bytes read in + read requests on leaders. +- `arangodb_collection_requests_bytes_written_total`: The number of bytes written + in write requests on leaders and followers. + +To opt into these metrics, you can use the new `--server.export-shard-usage-metrics` +startup option. It can be set to one of the following values on DB-Servers: +- `disabled`: No shard usage metrics are recorded nor exported. This is the + default value. +- `enabled-per-shard`: This makes DB-Servers collect per-shard usage metrics. +- `enabled-per-shard-per-user`: This makes DB-Servers collect per-shard + and per-user metrics. This is more granular than `enabled-per-shard` but + can produce a lot of metrics. + +Whenever a shard is accessed in read or write mode by one of the following +operations, the metrics are populated dynamically, either with a per-user +label or not, depending on the above setting. +The metrics are retained in memory on DB-Servers. Removing databases, +collections, or users that are already included in the metrics won't remove +the metrics until the DB-Server is restarted. + +The following operations increase the metrics: +- AQL queries: an AQL query increases the read or write counters exactly + once for each involved shard. For shards that are accessed in read/write + mode, only the write counter is increased. +- Single-document insert, update, replace, and remove operations: for each + such operation, the write counter is increased once for the affected + shard. +- Multi-document insert, update, replace, and remove operations: for each + such operation, the write counter is increased once for each shard + that is affected by the operation. Note that this includes collection + truncate operations. +- Single and multi-document read operations: for each such operation, the + read counter is increased once for each shard that is affected by the + operation. + +The metrics are increased when any of the above operations start, and they +are not decreased should an operation abort or if an operation does not +lead to any actual reads or writes. + +As there can be many of these dynamic metrics based on the number of shards +and/or users in the deployment, these metrics are turned off by default. +When turned on, the metrics are exposed only via the new +`GET /_admin/usage-metrics` endpoint. They are not exposed via the existing +metrics `GET /_admin/metrics` endpoint. + +Note that internal operations, such as internal queries executed for statistics +gathering, internal garbage collection, and TTL index cleanup are not counted in +these metrics. Additionally, all requests that are using the superuser JWT for +authentication and that do not have a specific user set are not counted. + +Enabling these metrics can likely result in a small latency overhead of a few +percent for write operations. The exact overhead depends on +several factors, such as the type of operation (single or multi-document operation), +replication factor, network latency, etc. + +## Miscellaneous changes + +### Optimizer rules endpoint + +Added the `GET /_api/query/rules` REST API endpoint that returns the available +optimizer rules for AQL queries. + +### Additional metrics for caching subsystem + +The caching subsystem now provides the following 3 additional metrics: +- `rocksdb_cache_active_tables`: total number of active hash tables used for + caching index values. There should be 1 table per shard per index for which + the in-memory cache is enabled. The number also includes temporary tables + that are built when migrating existing tables to larger equivalents. +- `rocksdb_cache_unused_memory`: total amount of memory used for inactive + hash tables used for caching index values. Some inactive tables can be kept + around after use, so they can be recycled quickly. The overall amount of + inactive tables is limited, so not much memory will be used here. +- `rocksdb_cache_unused_tables`: total number of inactive hash tables used + for caching index values. Some inactive tables are kept around after use, + so they can be recycled quickly. The overall amount of inactive tables is + limited, so not much memory will be used here. + +### Observability of in-memory cache subsystem + +<small>Introduced in: v3.10.11</small> + +The following metrics have been added to improve the observability of in-memory +cache subsystem: +- `rocksdb_cache_free_memory_tasks_total`: Total number of free memory tasks + that were scheduled by the in-memory edge cache subsystem. This metric will + be increased whenever the cache subsystem schedules a task to free up memory + in one of the managed in-memory caches. It is expected to see this metric + rising when the cache subsystem hits its global memory budget. +- `rocksdb_cache_free_memory_tasks_duration_total`: Total amount of time spent + inside the free memory tasks of the in-memory cache subsystem. Free memory + tasks are scheduled by the cache subsystem to free up memory in existing cache + hash tables. +- `rocksdb_cache_migrate_tasks_total`: Total number of migrate tasks that were + scheduled by the in-memory edge cache subsystem. This metric will be increased + whenever the cache subsystem schedules a task to migrate an existing cache hash + table to a bigger or smaller size. +- `rocksdb_cache_migrate_tasks_duration_total`: Total amount of time spent inside + the migrate tasks of the in-memory cache subsystem. Migrate tasks are scheduled + by the cache subsystem to migrate existing cache hash tables to a bigger or + smaller table. + +### Replication improvements + +For synchronous replication of document operations in the cluster, the follower +can now return smaller responses to the leader. This change reduces the network +traffic between the leader and its followers, and can lead to slightly faster +turnover in replication. + +### Calculation of file hashes (Enterprise Edition) + +The calculation of SHA256 file hashes for the .sst files created by RocksDB and +that are required for hot backups has been moved from a separate background +thread into the actual RocksDB operations that write out the .sst files. + +The SHA256 hashes are now calculated incrementally while .sst files are being +written, so that no post-processing of .sst files is necessary anymore. +The previous background thread named `Sha256Thread`, which was responsible for +calculating the SHA256 hashes and sometimes for high CPU utilization after +larger write operations, has now been fully removed. + +### Traffic accounting metrics + +<small>Introduced in: v3.8.9, v3.9.6, v3.10.2</small> + +The following metrics for traffic accounting have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_client_user_connection_statistics_bytes_received` | Bytes received for requests, only user traffic. | +| `arangodb_client_user_connection_statistics_bytes_sent` | Bytes sent for responses, only user traffic. +| `arangodb_http1_connections_total` | Total number of HTTP/1.1 connections accepted. | + +### Configurable `CACHE_OBLIVIOUS` option for jemalloc + +<small>Introduced in: v3.9.7, v3.10.3</small> + +The jemalloc memory allocator supports an option to toggle cache-oblivious large +allocation alignment. It is enabled by default up to v3.10.3, but disabled from +v3.10.4 onwards. Disabling it helps to save 4096 bytes of memory for every +allocation which is at least 16384 bytes large. This is particularly beneficial +for the RocksDB buffer cache. + +You can now configure the option by setting a `CACHE_OBLIVIOUS` environment +variable to the string `true` or `false` before starting ArangoDB. + +See [ArangoDB Server environment variables](../../components/arangodb-server/environment-variables.md) +for details. + +### WAL file tracking metrics + +<small>Introduced in: v3.9.10, v3.10.5</small> + +The following metrics for write-ahead log (WAL) file tracking have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_live_wal_files` | Number of live RocksDB WAL files. | +| `rocksdb_wal_released_tick_flush` | Lower bound sequence number from which WAL files need to be kept because of external flushing needs. | +| `rocksdb_wal_released_tick_replication` | Lower bound sequence number from which WAL files need to be kept because of replication. | +| `arangodb_flush_subscriptions` | Number of currently active flush subscriptions. | + +### Number of replication clients metric + +<small>Introduced in: v3.10.5</small> + +The following metric for the number of replication clients for a server has +been added: + +| Label | Description | +|:------|:------------| +| `arangodb_replication_clients` | Number of currently connected/active replication clients. | + +### Reduced memory usage of in-memory edge indexes + +<small>Introduced in: v3.10.5</small> + +The memory usage of in-memory edge index caches is reduced if most of the edges +in an index refer to a single or mostly the same collection. + +Previously, the full edge IDs, consisting of the referred-to collection +name and the referred-to key of the edge, were stored in full, i.e. the full +values of the edges' `_from` and `_to` attributes. +Now, the first edge inserted into an edge index' in-memory cache determines +the collection name for which all corresponding edges can be stored +prefix-compressed. + +For example, when inserting an edge pointing to `the-collection/abc` into the +empty cache, the collection name `the-collection` is noted for that cache +as a prefix. The edge is stored in-memory as only `/abc`. Further edges +that are inserted into the cache and that point to the same collection are +also stored prefix-compressed. + +The prefix compression is transparent and does not require configuration or +setup. Compression is done separately for each cache, i.e. a separate prefix +can be used for each individual edge index, and separately for the `_from` and +`_to` parts. Lookups from the in-memory edge cache do not return compressed +values but the full-length edge IDs. The compressed values are also used +in-memory only and are not persisted on disk. + +### Sending delay metrics for internal requests + +<small>Introduced in: v3.9.11, v3.10.6</small> + +The following metrics for diagnosing delays in cluster-internal network requests +have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_network_dequeue_duration` | Internal request duration for the dequeue in seconds. | +| `arangodb_network_response_duration` | Internal request duration from fully sent till response received in seconds. | +| `arangodb_network_send_duration` | Internal request send duration in seconds. | +| `arangodb_network_unfinished_sends_total` | Number of internal requests for which sending has not finished. | + +### Peak memory metric for in-memory caches + +<small>Introduced in: v3.10.7</small> + +This new metric stores the peak value of the `rocksdb_cache_allocated` metric: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_peak_allocated` | Global peak memory allocation of ArangoDB in-memory caches. | + +### Number of SST files metric + +<small>Introduced in: v3.10.7</small> + +This new metric reports the number of RocksDB `.sst` files: + +| Label | Description | +|:------|:------------| +| `rocksdb_total_sst_files` | Total number of RocksDB sst files, aggregated over all levels. | + +### File descriptor limit metric + +<small>Introduced in: v3.10.7</small> + +The following system metrics have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_file_descriptors_limit` | System limit for the number of open files for the arangod process. | +| `arangodb_file_descriptors_current` | Number of file descriptors currently opened by the arangod process. | + +### Memory usage of connection and request statistics + +<small>Introduced in: v3.10.12</small> + +The following metrics have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_connection_statistics_memory_usage` | Total memory usage of connection statistics. | +| `arangodb_request_statistics_memory_usage` | Total memory usage of request statistics. | + +If the `--server.statistics` startup option is set to `true`, then some +connection and request statistics are built up in memory for incoming request. +It is expected that the memory usage reported by these metrics remains +relatively constant over time. It may grow only when there are bursts of new +connections. Some memory is pre-allocated at startup for higher efficiency. If the +`--server.statistics` startup option is set to `false`, then no memory will be +allocated for connection and request statistics. + +### More instant Hot Backups + +<small>Introduced in: v3.10.10</small> + +Cluster deployments no longer wait for all in-progress transactions to get +committed when a user requests a Hot Backup. The waiting could cause deadlocks +and thus Hot Backups to fail, in particular in the Arango Managed Platform (AMP). Now, Hot Backups are +created immediately and commits have to wait until the backup process is done. + +### Detached scheduler threads + +<small>Introduced in: v3.10.13</small> + +A scheduler thread now has the capability to detach itself from the scheduler +if it observes the need to perform a potentially long running task, like waiting +for a lock. This allows a new scheduler thread to be started and prevents +scenarios where all threads are blocked waiting for a lock, which has previously +led to deadlock situations. + +Threads waiting for more than 1 second on a collection lock will detach +themselves. + +The following startup option has been added: +- `--server.max-number-detached-threads`: The maximum number of detached scheduler + threads. + +The following metric has been added: +- `arangodb_scheduler_num_detached_threads`: The number of worker threads + currently started and detached from the scheduler. + +## Client tools + +### arangobench + +_arangobench_ has a new `--create-collection` startup option that can be set to `false` +to skip setting up a new collection for the to-be-run workload. That way, some +workloads can be run on already existing collections. + +### arangoexport + +_arangoexport_ has a new `--custom-query-bindvars` startup option that lets you set +bind variables that you can now use in the `--custom-query` option +(renamed from `--query`): + +```bash +arangoexport \ + --custom-query 'FOR book IN @@@@collectionName FILTER book.sold > @@sold RETURN book' \ + --custom-query-bindvars '{"@@collectionName": "books", "sold": 100}' \ + ... +``` + +Note that you need to escape at signs in command-lines by doubling them (see +[Environment variables as parameters](../../operations/administration/configuration.md#environment-variables-as-parameters)). + +_arangoexport_ now also has a `--custom-query-file` startup option that you can +use instead of `--custom-query`, to read a query from a file. This allows you to +store complex queries and no escaping is necessary in the file: + +```aql +// example.aql +FOR book IN @@collectionName + FILTER book.sold > @sold + RETURN book +``` + +```bash +arangoexport \ + --custom-query-file example.aql \ + --custom-query-bindvars '{"@@collectionName": "books", "sold": 100}' \ + ... +``` + +### arangoimport + +_arangoimport_ has a new `--overwrite-collection-prefix` option that is useful +when importing edge collections. This option should be used together with +`--to-collection-prefix` or `--from-collection-prefix`. +If there are vertex collection prefixes in the file you want to import, +you can overwrite them with prefixes specified on the command line. If the option is set +to `false`, only `_from` and `_to` values without a prefix are going to be +prefixed by the entered values. + +_arangoimport_ now supports the `--remove-attribute` option when using JSON +as input file format. +For more information, refer to the [_arangoimport_ Options](../../components/tools/arangoimport/options.md). + +### ArangoDB Starter + +_ArangoDB Starter_ has a new feature that allows you to configure the binary +by reading from a configuration file. The default configuration file of the Starter +is `arangodb-starter.conf` and can be changed using the `--configuration` option. + +See the [Starter configuration file](../../components/tools/arangodb-starter/architecture.md#starter-configuration-file) +section for more information about the configuration file format, passing +through command line options, and examples. + +### arangodump + +#### Improved dump performance (experimental) + +<small>Introduced in: v3.10.8</small> + +_arangodump_ has experimental extended parallelization capabilities +to work not only at the collection level, but also at the shard level. +In combination with the newly added support for the VelocyPack format that +ArangoDB uses internally, database dumps can now be created and restored more +quickly and occupy less disk space. This major performance boost makes dumps and +restores up to several times faster, which is extremely useful when dealing +with large shards. + +- Whether the new parallel dump variant is used is controlled by the newly added + `--use-experimental-dump` startup option (introduced in v3.10.8). + The default value is `false`. + +- Optionally, you can make _arangodump_ write multiple output files per + collection/shard (introduced in v3.10.10). + The file splitting allows for better parallelization when + writing the results to disk, which in case of non-split files must be serialized. + You can enable it by setting the `--split-files` option to `true`. This option + is disabled by default because dumps created with this option enabled cannot + be restored into previous versions of ArangoDB. + +## Internal changes + +### C++20 + +ArangoDB is now compiled using the `-std=c++20` compile option on Linux and MacOS. +A compiler with c++-20 support is thus needed to compile ArangoDB from source. + +### Upgraded bundled library versions + +The bundled version of the RocksDB library has been upgraded from 6.8.0 to 7.2. + +The bundled version of the Boost library has been upgraded from 1.71.0 to 1.78.0. + +The bundled version of the immer library has been upgraded from 0.6.2 to 0.7.0. + +The bundled version of the jemalloc library has been upgraded from 5.2.1-dev to 5.3.0. + +The bundled version of the zlib library has been upgraded from 1.2.11 to 1.2.12. + +For ArangoDB 3.10, the bundled version of rclone is 1.59.0. Check if your +rclone configuration files require changes. diff --git a/site/content/arangodb/oem/release-notes/version-3.11/_index.md b/site/content/arangodb/oem/release-notes/version-3.11/_index.md new file mode 100644 index 0000000000..ef1083b501 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.11/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.11 +menuTitle: Version 3.11 +weight: 88 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.11/api-changes-in-3-11.md b/site/content/arangodb/oem/release-notes/version-3.11/api-changes-in-3-11.md new file mode 100644 index 0000000000..22304d5112 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.11/api-changes-in-3-11.md @@ -0,0 +1,881 @@ +--- +title: API Changes in ArangoDB 3.11 +menuTitle: API changes in 3.11 +weight: 20 +description: >- + A summary of the changes to the HTTP API and other interfaces that are relevant + for developers, like maintainers of drivers and integrations for ArangoDB +--- +## HTTP RESTful API + +### Behavior changes + +#### Extended naming constraints for collections, Views, and indexes + +In ArangoDB 3.9, the `--database.extended-names-databases` startup option was +added to optionally allow database names to contain most UTF-8 characters. +The startup option has been renamed to `--database.extended-names` in 3.11 and +now controls whether you want to use the extended naming constraints for +database, collection, View, and index names. + +The feature is disabled by default to ensure compatibility with existing client +drivers and applications that only support ASCII names according to the +traditional naming constraints used in previous ArangoDB versions. + +If the feature is enabled, then any endpoints that contain database, collection, +View, or index names in the URL may contain special characters that were +previously not allowed (percent-encoded). They are also to be expected in +payloads that contain database, collection, View, or index names, as well as +document identifiers (because they are comprised of the collection name and the +document key). If client applications assemble URLs with extended names +programmatically, they need to ensure that extended names are properly +URL-encoded. + +When using extended names, any Unicode characters in names need to be +[NFC-normalized](http://unicode.org/reports/tr15/#Norm_Forms). +If you try to create a database, collection, View, or index with a non-NFC-normalized +name, the server rejects it. + +The ArangoDB web interface as well as the _arangobench_, _arangodump_, +_arangoexport_, _arangoimport_, _arangorestore_, and _arangosh_ client tools +ship with support for the extended naming constraints, but they require you +to provide NFC-normalized names. + +Please be aware that dumps containing extended names cannot be restored +into older versions that only support the traditional naming constraints. In a +cluster setup, it is required to use the same naming constraints for all +Coordinators and DB-Servers of the cluster. Otherwise, the startup is +refused. In DC2DC setups, it is also required to use the same naming +constraints for both datacenters to avoid incompatibilities. + +Also see: +- [Collection names](../../concepts/data-structure/collections.md#collection-names) +- [View names](../../concepts/data-structure/views.md#view-names) +- Index names have the same character restrictions as collection names + +#### Stricter validation of Unicode surrogate values in JSON data + +ArangoDB 3.11 employs a stricter validation of Unicode surrogate pairs in +incoming JSON data, for all REST APIs. + +In previous versions, the following loopholes existed when validating UTF-8 +surrogate pairs in incoming JSON data: + +- a high surrogate, followed by something other than a low surrogate + (or the end of the string) +- a low surrogate, not preceded by a high surrogate + +These validation loopholes have been closed in 3.11, which means that any JSON +inputs containing such invalid surrogate pair data are rejected by the server. + +This is normally the desired behavior, as it helps invalid data from entering +the database. However, in situations when a database is known to contain invalid +data and must continue supporting it (at least temporarily), the extended +validation can be disabled by setting the server startup option +`--server.validate-utf8-strings` to `false`. This is not recommended long-term, +but only during upgrading or data cleanup. + +#### Status code if write concern not fulfilled + +The new `--cluster.failed-write-concern-status-code` startup option can be used +to change the default `403` status code to `503` when the write concern cannot +be fulfilled for a write operation to a collection in a cluster deployment. +This signals client applications that it is a temporary error. Only the +HTTP status code changes in this case, no automatic retry of the operation is +attempted by the cluster. + +#### Graph API (Gharial) + +The `POST /_api/gharial/` endpoint for creating named graphs validates the +`satellites` property of the graph `options` for SmartGraphs differently now. + +If the `satellites` property is set, it must be an array, either empty or with +one or more collection name strings. If the value is not in that format, the +error "Missing array for field `satellites`" is now returned, for example, if +it is a string or a `null` value. Previously, it returned "invalid parameter type". +If the graph is not a SmartGraph, the `satellites` property is ignored unless its +value is an array but its elements are not strings, in which case the error +"Invalid parameter type" is returned. + +#### Validation of `smartGraphAttribute` in SmartGraphs + +<small>Introduced in: v3.10.13, v3.11.7</small> + +The attribute defined by the `smartGraphAttribute` graph property is not allowed to be +changed in the documents of SmartGraph vertex collections. This is now strictly enforced. +You must set the attribute when creating a document. Any attempt to modify or remove +the attribute afterward by update or replace operations now throws an error. Previously, +the `smartGraphAttribute` value was checked only when inserting documents into a +SmartGraph vertex collection, but not for update or replace operations. + +The missing checks on update and replace operations allowed to retroactively +modify the value of the `smartGraphAttribute` for existing documents, which +could have led to problems when the data of such a SmartGraph vertex collection was +replicated to a new follower shard. On the new follower shard, the documents +went through the full validation and led to documents with modified +`smartGraphAttribute` values being rejected on the follower. This could have +led to follower shards not getting in sync. + +Now, the value of the `smartGraphAttribute` is fully validated with every +insert, update, or replace operation, and every attempt to modify the value of +the `smartGraphAttribute` retroactively fails with the `4003` error, +`ERROR_KEY_MUST_BE_PREFIXED_WITH_SMART_GRAPH_ATTRIBUTE`. +Additionally, if upon insertion the `smartGraphAttribute` is missing for a +SmartGraph vertex, the error code is error `4001`, `ERROR_NO_SMART_GRAPH_ATTRIBUTE`. + +To retroactively repair the data in any of the affected collections, it is +possible to update every (affected) document with the correct value of the +`smartGraphAttribute` via an AQL query as follows: + +``` +FOR doc IN @@collection + LET expected = SUBSTRING(doc._key, 0, FIND_FIRST(doc._key, ':')) + LET actual = doc.@attr + FILTER expected != actual + UPDATE doc WITH {@attr: expected} IN @@collection + COLLECT WITH COUNT INTO updated + RETURN updated +``` + +This updates all documents with the correct (expected) value of the +`smartGraphAttribute` if it deviates from the expected value. The query +returns the number of updated documents as well. + +The bind parameters necessary to run this query are: +- `@@collection`: name of a SmartGraph vertex collection to be updated +- `@attr`: attribute name of the `smartGraphAttribute` of the collection + +#### Database API + +The `POST /_api/database` endpoint for creating a new database has changed. +If the specified database name is invalid/illegal, it now returns the error code +`1208` (`ERROR_ARANGO_ILLEGAL_NAME`). It previously returned `1229` +(`ERROR_ARANGO_DATABASE_NAME_INVALID`) in this case. + +This is a downwards-incompatible change, but unifies the behavior for database +creation with the behavior of collection and View creation, which also return +the error code `1208` in case the specified name is not allowed. + +#### Document API + +The following endpoints support a new `refillIndexCaches` query +parameter to repopulate the index caches after requests that insert, update, +replace, or remove single or multiple documents (including edges) if this +affects an edge index or cache-enabled persistent indexes: + +- `POST /_api/document/{collection}` +- `PATCH /_api/document/{collection}/{key}` +- `PUT /_api/document/{collection}/{key}` +- `DELETE /_api/document/{collection}/{key}` + +It is a boolean option and the default is `false`. + +This also applies to the `INSERT`, `UPDATE`, `REPLACE`, and `REMOVE` operations +in AQL queries, which support a `refillIndexCache` option, too. + +In 3.9 and 3.10, `refillIndexCaches` was experimental and limited to edge caches. + +--- + +<small>Introduced in: v3.11.1</small> + +When inserting multiple documents/edges at once in a cluster, the Document API +used to let the entire request fail if any of the documents/edges failed to be +saved due to a key error. More specifically, if the value of a `_key` attribute +contains illegal characters or if the key doesn't meet additional requirements, +for instance, coming from the collection being used in a Disjoint SmartGraph, +the `POST /_api/document/{collection}` endpoint would not reply with the usual +array of either the document metadata or the error object for each attempted +document insertion. Instead, it used to return an error object for the first +offending document only, and aborted the operation with an HTTP `400 Bad Request` +status code so that none of the documents were saved. Example: + +```bash +> curl -d '[{"_key":"valid"},{"_key":"invalid space"}]' http://localhost:8529/_api/document/coll +{"code":400,"error":true,"errorMessage":"illegal document key","errorNum":1221} + +> curl http://localhost:8529/_api/document/coll/valid +{"code":404,"error":true,"errorMessage":"document not found","errorNum":1202} +``` + +Now, such key errors in cluster deployments no longer fail the entire request, +matching the behavior of single server deployments. Any errors are reported in +the result array for the respective documents, along with the successful ones: + +```bash +> curl -d '[{"_key":"valid"},{"_key":"invalid space"}]' http://localhost:8529/_api/document/coll +[{"_id":"coll/valid","_key":"valid","_rev":"_gG9JHsW---"},{"error":true,"errorNum":1221,"errorMessage":"illegal document key"}] + +> curl http://localhost:8529/_api/document/coll/valid +{"_key":"valid","_id":"coll/valid","_rev":"_gG9JHsW---"} +``` + +--- + +<small>Introduced in: v3.11.1</small> + +Using the Document API for reading multiple documents used to return an error +if the request body was an empty array. Example: + +```bash +> curl -XPUT -d '[]' 'http://localhost:8529/_api/document/coll?onlyget=true' +{"code":500,"error":true,"errorMessage":"internal error","errorNum":4} +``` + +Now, a request like this succeeds and returns an empty array as response. + +#### Collection API + +The edge collections of EnterpriseGraphs and SmartGraphs (including +Disjoint SmartGraphs and SmartGraphs using SatelliteCollections but excluding +the edge collections of the SatelliteCollections) previously reported a +value of `0` as the `numberOfShards`. They now return the actual number of +shards. This value can be higher than the configured `numberOfShards` value of +the graph due to internally used hidden collections. + +#### Cursor API + +When you link a collection to an `arangosearch` View and run an AQL query +against this View while it is still being indexed, you now receive the query result +including a warning. This warning alerts you about potentially incomplete results obtained +from a partially indexed collection. The error code associated with this +warning is `1240` (`ERROR_ARANGO_INCOMPLETE_READ`). + +--- + +<small>Introduced in: v3.9.11, v3.10.7</small> + +In AQL graph traversals (`POST /_api/cursor` endpoint), you can restrict the +vertex and edge collections in the traversal options like so: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { + vertexCollections: [ "bolts", "screws" ], + edgeCollections: [ "productsToBolts", "productsToScrews" ] + } + RETURN v +``` + +If you specify collections that don't exist, queries now fail with +a "collection or view not found" error (code `1203` and HTTP status +`404 Not Found`). In previous versions, unknown vertex collections were ignored, +and the behavior for unknown edge collections was undefined. + +Additionally, the collection types are now validated. If a document collection +or View is specified in `edgeCollections`, an error is raised +(code `1218` and HTTP status `400 Bad Request`). + +Furthermore, it is now an error if you specify a vertex collection that is not +part of the specified named graph (code `1926` and HTTP status `404 Not Found`). +It is also an error if you specify an edge collection that is not part of the +named graph's definition or of the list of edge collections (code `1939` and +HTTP status `400 Bad Request`). + +#### Log API + +Setting the log level for the `graphs` log topic to `TRACE` now logs detailed +information about AQL graph traversals and (shortest) path searches. +Some new log messages are also logged for the `DEBUG` level. + +#### Disabled Foxx APIs + +<small>Introduced in: v3.10.5</small> + +A `--foxx.enable` startup option has been added to _arangod_. It defaults to `true`. +If the option is set to `false`, access to Foxx services is forbidden and is +responded with an HTTP `403 Forbidden` error. Access to the management APIs for +Foxx services are also disabled as if `--foxx.api false` is set manually. + +#### Configurable whitespace in metrics + +<small>Introduced in: v3.10.6</small> + +The output format of the `/_admin/metrics` and `/_admin/metrics/v2` endpoints +slightly changes for metrics with labels. By default, the metric label and value +are separated by a space for improved compatibility with some tools. This is +controlled by the new `--server.ensure-whitespace-metrics-format` startup option, +which is enabled by default from v3.10.6 onward. Example: + +Enabled: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"} 0 +``` + +Disabled: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"}0 +``` + +#### Limit to the number of databases in a deployment + +<small>Introduced in: v3.10.10, v3.11.2</small> + +The new `--database.max-databases` startup option can cap the number of databases +and creating databases using the `POST /_api/database` endpoint can thus now fail +for this reason if your deployment is at or above the configured maximum. Example: + +```json +{ + "code": 400, + "error": true, + "errorMessage": "unable to create additional database because it would exceed the configured maximum number of databases (2)", + "errorNum": 32 +} +``` + +### Endpoint return value changes + +<small>Introduced in: v3.8.8, v3.9.4, v3.10.1</small> + +Changed the encoding of revision IDs returned by the below listed REST APIs: + +- `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. +- `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +### Endpoints added + +#### Maintenance mode for DB-Servers + +<small>Introduced in: v3.10.1</small> + +For rolling upgrades or rolling restarts, DB-Servers can now be put into +maintenance mode, so that no attempts are made to re-distribute the data in a +cluster for such planned events. DB-Servers in maintenance mode are not +considered viable failover targets because they are likely restarted soon. + +To query the maintenance status of a DB-Server, use this new endpoint: + +`GET /_admin/cluster/maintenance/<DB-Server-ID>` + +An example reply of a DB-Server that is in maintenance mode: + +```json +{ + "error": false, + "code": 200, + "result": { + "Mode": "maintenance", + "Until": "2022-10-26T06:14:23Z" + } +} +``` + +If the DB-Server is not in maintenance mode, then the `result` attribute is +omitted: + +```json +{ + "error": false, + "code": 200, +} +``` + +To put a DB-Server into maintenance mode, use this new endpoint: + +`PUT /_admin/cluster/maintenance/<DB-Server-ID>` + +The payload of the request needs to be as follows, with the `timeout` in seconds: + +```json +{ + "mode": "maintenance", + "timeout": 360 +} +``` + +To turn the maintenance mode off, set `mode` to `"normal"` instead, and omit the +`timeout` attribute or set it to `0`. + +You can send another request when the DB-Server is already in maintenance mode +to extend the timeout. + +The maintenance mode ends automatically after the defined timeout. + +Also see the [HTTP interface for cluster maintenance](../../develop/http-api/cluster.md#get-the-maintenance-status-of-a-db-server). + +#### Shard usage metrics + +<small>Introduced in: v3.10.13, v3.11.7</small> + +With `GET /_admin/usage-metrics` you can retrieve detailed shard usage metrics on +DB-Servers. + +These metrics can be enabled by setting the `--server.export-shard-usage-metrics` +startup option to `enabled-per-shard` to make DB-Servers collect per-shard +usage metrics, or to `enabled-per-shard-per-user` to make DB-Servers collect +usage metrics per shard and per user whenever a shard is accessed. + +For more information, see the [HTTP API description](../../develop/http-api/monitoring/metrics.md#get-usage-metrics) +and [Monitoring per collection/database/user](../version-3.11/whats-new-in-3-11.md#monitoring-per-collectiondatabaseuser). + +### Endpoints augmented + +#### Cursor API + +- The `POST /_api/cursor` and `POST /_api/cursor/{cursor-identifier}` endpoints + can now return an additional statistics value in the `stats` sub-attribute, + `intermediateCommits`. It is the total number of intermediate commits the + query has performed. This number can only be greater than zero for + data modification queries that perform modifications beyond the + `--rocksdb.intermediate-commit-count` or `--rocksdb.intermediate-commit-size` + thresholds. In clusters, the intermediate commits are tracked per DB-Server + that participates in the query and are summed up in the end. + +- The `/_api/cursor` endpoint accepts a new `allowRetry` attribute in the + `options` object. Set this option to `true` to make it possible to retry + fetching the latest batch from a cursor. The default is `false`. + + If retrieving a result batch fails because of a connection issue, you can ask + for that batch again using the new `POST /_api/cursor/<cursor-id>/<batch-id>` + endpoint. The first batch has an ID of `1` and the value is incremented by 1 + with every batch. Every result response except the last one also includes a + `nextBatchId` attribute, indicating the ID of the batch after the current. + You can remember and use this batch ID should retrieving the next batch fail. + + You can only request the latest batch again (or the next batch). + Earlier batches are not kept on the server-side. + Requesting a batch again does not advance the cursor. + + You can also call this endpoint with the next batch identifier, i.e. the value + returned in the `nextBatchId` attribute of a previous request. This advances the + cursor and returns the results of the next batch. This is only supported if there + are more results in the cursor (i.e. `hasMore` is `true` in the latest batch). + + From v3.11.1 onward, you may use the `POST /_api/cursor/<cursor-id>/<batch-id>` + endpoint even if the `allowRetry` attribute is `false` to fetch the next batch, + but you cannot request a batch again unless you set it to `true`. + The `nextBatchId` attribute is always present in result objects (except in the + last batch) from v3.11.1 onward. + + To allow refetching of the very last batch of the query, the server cannot + automatically delete the cursor. After the first attempt of fetching the last + batch, the server would normally delete the cursor to free up resources. As you + might need to reattempt the fetch, it needs to keep the final batch when the + `allowRetry` option is enabled. Once you successfully received the last batch, + you should call the `DELETE /_api/cursor/<cursor-id>` endpoint so that the + server doesn't unnecessarily keep the batch until the cursor times out + (`ttl` query option). + +- When profiling a query (`profile` option `true`, `1`, or `2`), the `profile` + object returned under `extra` now includes a new `"instantiating executors"` + attribute with the time needed to create the query executors, and in cluster + mode, this also includes the time needed for physically distributing the query + snippets to the participating DB-Servers. Previously, the time spent for + instantiating executors and the physical distribution was contained in the + `optimizing plan` stage. + +- The endpoint supports a new `maxDNFConditionMembers` query option, which is a + threshold for the maximum number of `OR` sub-nodes in the internal + representation of an AQL `FILTER` condition and defaults to `786432`. + +#### Analyzer types + +The `/_api/analyzer` endpoint supports a new Analyzer type in the +Enterprise Edition: + +- [`geo_s2`](../../index-and-search/analyzers.md#geo_s2) (introduced in v3.10.5): + Like the existing `geojson` Analyzer, but with an additional `format` property + that can be set to `"latLngDouble"` (default), `"latLngInt"`, or `"s2Point"`. + +#### Query API + +The [`GET /_api/query/current`](../../develop/http-api/queries/aql-queries.md#list-the-running-aql-queries) +and [`GET /_api/query/slow`](../../develop/http-api/queries/aql-queries.md#list-the-slow-aql-queries) +endpoints include a new numeric `peakMemoryUsage` attribute. + +--- + +The `GET /_api/query/current` endpoint can return a new value +`"instantiating executors"` as `state` in the query list. + +#### Index API + +##### Progress indication on the index generation + +<small>Introduced in: v3.10.13, v3.11.7</small> + +The `GET /_api/index` endpoint may now include a `progress` attribute for the +elements in the `indexes` array. For every index that is currently being created, +it indicates the progress of the index generation (in percent). + +To return indexes that are not yet fully built but are in the building phase, +add the `withHidden=true` query parameter to the call of the endpoint. +Note that this includes internal indexes in the response as well, such as +`arangosearch` indexes. + +``` +curl "http://localhost:8529/_api/index?collection=myCollection&withHidden=true" +``` + +##### Restriction of indexable fields + +It is now forbidden to create indexes that cover fields whose attribute names +start or end with `:` , for example, `fields: ["value:"]`. This notation is +reserved for internal use. + +Existing indexes are not affected but you cannot create new indexes with a +preceding or trailing colon using the `POST /_api/index` endpoint. + +##### Inverted indexes + +<small>Introduced in: v3.10.2</small> + +[Inverted indexes](../../develop/http-api/indexes/inverted.md) support new +caching options in the Enterprise Edition. + +- A new `cache` option for inverted indexes as the default (boolean, default: + `false`) or for specific `fields` (boolean, default: the value of the + top-level `cache` option) to always cache field normalization values and + Geo Analyzer auxiliary data in memory. + +- A new `cache` option per object in the definition of the `storedValues` + elements to always cache stored values in memory (boolean, default: `false`). + +- A new `cache` option in the `primarySort` property to always cache the + primary sort columns in memory (boolean, default: `false`). + +- A new `primaryKeyCache` property for inverted indexes to always cache the + primary key column in memory (boolean, default: `false`). + +The `POST /_api/index` endpoint accepts these new options for `inverted` indexes +and the `GET /_api/index` and `GET /_api/index/<index-id>` endpoints may return +these options. The attributes are omitted in responses unless you enable the +respective option. + +#### View API + +Views of the type `arangosearch` support new caching options in the +Enterprise Edition. + +<small>Introduced in: v3.9.5, v3.10.2</small> + +- A `cache` option for individual View links or fields (boolean, default: `false`). +- A `cache` option in the definition of a `storedValues` View property + (boolean, immutable, default: `false`). + +<small>Introduced in: v3.9.6, v3.10.2</small> + +- A `primarySortCache` View property (boolean, immutable, default: `false`). +- A `primaryKeyCache` View property (boolean, immutable, default: `false`). + +The `POST /_api/view` endpoint accepts these new options for `arangosearch` +Views, the `GET /_api/view/<view-name>/properties` endpoint may return these +options, and you can change the `cache` View link/field property with the +`PUT /_api/view/<view-name>/properties` and `PATCH /_api/view/<view-name>/properties` +endpoints. + +<small>Introduced in: v3.10.3</small> + +You may use a shorthand notations on `arangosearch` View creation or the +`storedValues` option, like `["attr1", "attr2"]`, instead of using an array of +objects. + +See the [`arangosearch` Views Reference](../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) +for details. + +#### Pregel API + +Four new endpoints have been added to the Pregel HTTP interface for the new +persisted execution statistics for Pregel jobs: + +- `GET /_api/control_pregel/history/{id}` to retrieve the persisted execution + statistics of a specific Pregel job +- `GET /_api/control_pregel/history` to retrieve the persisted execution + statistics of all currently active and past Pregel jobs +- `DELETE /_api/control_pregel/history/{id}` to delete the persisted execution + statistics of a specific Pregel job +- `DELETE /_api/control_pregel/history` to delete the persisted execution + statistics of all Pregel jobs + +See [Pregel HTTP API](../../develop/http-api/pregel.md) for details. + +#### Cluster rebalance API + +The `POST /_admin/cluster/rebalance` and `PUT /_admin/cluster/rebalance` +endpoints support a new `excludeSystemCollections` option that lets you ignore +system collections in the shard rebalance plan. + +The `/_admin/cluster/rebalance` route (`GET`, `POST`, and `PUT` methods) returns +a new `totalShardsFromSystemCollections` property in the `shards` object of the +`result` with the number of leader shards from system collections. The adjacent +`totalShards` property may not include system collections depending on the +`excludeSystemCollections` option. + +#### Explain API + +<small>Introduced in: v3.10.4</small> + +The `POST /_api/explain` endpoint for explaining AQL queries includes the +following two new statistics in the `stats` attribute of the response now: + +- `peakMemoryUsage` (number): The maximum memory usage of the query during + explain (in bytes) +- `executionTime` (number): The (wall-clock) time in seconds needed to explain + the query. + +#### Metrics API + +The following metric has been added in version 3.11: + +| Label | Description | +|:------|:------------| +| `arangodb_search_num_primary_docs` | Number of primary documents for current snapshot. | + +--- + +<small>Introduced in: v3.10.7, v3.11.1</small> + +This new metric reports the number of RocksDB `.sst` files: + +| Label | Description | +|:------|:------------| +| `rocksdb_total_sst_files` | Total number of RocksDB sst files, aggregated over all levels. | + +--- + +<small>Introduced in: v3.10.7</small> + +The metrics endpoints include the following new file descriptors metrics: + +- `arangodb_file_descriptors_current` +- `arangodb_file_descriptors_limit` + +--- + +<small>Introduced in: v3.8.9, v3.9.6, v3.10.2</small> + +The metrics endpoints include the following new traffic accounting metrics: + +- `arangodb_client_user_connection_statistics_bytes_received` +- `arangodb_client_user_connection_statistics_bytes_sent` +- `arangodb_http1_connections_total` + +--- + +<small>Introduced in: v3.9.6, v3.10.2</small> + +The metrics endpoints include the following new edge cache (re-)filling metrics: + +- `rocksdb_cache_auto_refill_loaded_total` +- `rocksdb_cache_auto_refill_dropped_total` +- `rocksdb_cache_full_index_refills_total` + +--- + +<small>Introduced in: v3.9.10, v3.10.5</small> + +The following metrics for write-ahead log (WAL) file tracking have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_live_wal_files` | Number of live RocksDB WAL files. | +| `rocksdb_wal_released_tick_flush` | Lower bound sequence number from which WAL files need to be kept because of external flushing needs. | +| `rocksdb_wal_released_tick_replication` | Lower bound sequence number from which WAL files need to be kept because of replication. | +| `arangodb_flush_subscriptions` | Number of currently active flush subscriptions. | + +--- + +<small>Introduced in: v3.10.5</small> + +The following metric for the number of replication clients for a server has +been added: + +| Label | Description | +|:------|:------------| +| `arangodb_replication_clients` | Number of currently connected/active replication clients. | + +--- + +<small>Introduced in: v3.9.11, v3.10.6</small> + +The following metrics for diagnosing delays in cluster-internal network requests +have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_network_dequeue_duration` | Internal request duration for the dequeue in seconds. | +| `arangodb_network_response_duration` | Internal request duration from fully sent till response received in seconds. | +| `arangodb_network_send_duration` | Internal request send duration in seconds. | +| `arangodb_network_unfinished_sends_total` | Number of internal requests for which sending has not finished. | + +--- + +<small>Introduced in: v3.10.7</small> + +The following metric stores the peak value of the `rocksdb_cache_allocated` metric: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_peak_allocated` | Global peak memory allocation of ArangoDB in-memory caches. | + +--- + +<small>Introduced in: v3.11.2</small> + +The following metrics have been added about the LZ4 compression for values in +the in-memory edge cache: + +- `rocksdb_cache_edge_inserts_effective_entries_size_total` +- `rocksdb_cache_edge_inserts_uncompressed_entries_size_total` +- `rocksdb_cache_edge_compression_ratio` + +--- + +<small>Introduced in: v3.10.11, v3.11.4</small> + +The following metrics have been added to improve the observability of in-memory +cache subsystem: + +- `rocksdb_cache_free_memory_tasks_total` +- `rocksdb_cache_free_memory_tasks_duration_total` +- `rocksdb_cache_migrate_tasks_total` +- `rocksdb_cache_migrate_tasks_duration_total` + +--- + +<small>Introduced in: v3.11.4</small> + +The following metrics have been added to improve the observability of in-memory +edge cache: + +- `rocksdb_cache_edge_compressed_inserts_total` +- `rocksdb_cache_edge_empty_inserts_total` +- `rocksdb_cache_edge_inserts_total` + +--- + +<small>Introduced in: v3.11.5</small> + +The following metrics have been added to monitor and detect temporary or +permanent connectivity issues as well as how many scheduler threads are in the +detached state: + +- `arangodb_network_connectivity_failures_coordinators` +- `arangodb_network_connectivity_failures_dbservers_total` +- `arangodb_scheduler_num_detached_threads` + +#### Log level API + +<small>Introduced in: v3.10.2</small> + +The `GET /_admin/log/level` and `PUT /_admin/log/level` endpoints support a new +query parameter `serverId`, to forward log level get and set requests to a +specific server. This makes it easier to adjust the log levels in clusters +because DB-Servers require JWT authentication whereas Coordinators also support +authentication using usernames and passwords. + +#### Explain API + +<small>Introduced in: v3.10.4</small> + +The `POST /_api/explain` endpoint for explaining AQL queries includes the +following two new statistics in the `stats` attribute of the response now: + +- `peakMemoryUsage` (number): The maximum memory usage of the query during + explain (in bytes) +- `executionTime` (number): The (wall-clock) time in seconds needed to explain + the query. + +#### Optimizer rule descriptions + +<small>Introduced in: v3.10.9, v3.11.2</small> + +The `GET /_api/query/rules` endpoint now includes a `description` attribute for +every optimizer rule that briefly explains what it does. + +### Endpoints deprecated + +The `GET /_admin/database/target-version` endpoint is deprecated in favor of the +more general version API with the endpoint `GET /_api/version`. +The endpoint will be removed in ArangoDB v3.12. + +## JavaScript API + +### Database creation + +The `db._createDatabase()` method for creating a new database has changed. +If the specified database name is invalid/illegal, it now returns the error code +`1208` (`ERROR_ARANGO_ILLEGAL_NAME`). It previously returned `1229` +(`ERROR_ARANGO_DATABASE_NAME_INVALID`) in this case. + +This is a downwards-incompatible change, but unifies the behavior for database +creation with the behavior of collection and View creation, which also return +the error code `1208` in case the specified name is not allowed. + +### Index methods + +Calling `collection.dropIndex(...)` or `db._dropIndex(...)` now raises an error +if the specified index does not exist or cannot be dropped (for example, because +it is a primary index or edge index). The methods previously returned `false`. +In case of success, they still return `true`. + +You can wrap calls to these methods with a `try { ... }` block to catch errors, +for example, in _arangosh_ or in Foxx services. + +### AQL queries + +When you use e.g. the `db._query()` method to execute an AQL query against an +`arangosearch` View while it is still in the process of being built, +the query now includes a warning message that the results may not be +complete due to the ongoing indexing process of the View. + +The error code associated with this warning is `1240` +(`ERROR_ARANGO_INCOMPLETE_READ`). + +--- + +<small>Introduced in: v3.9.11, v3.10.7</small> + +If you specify collections that don't exist in the options of AQL graph traversals +(`vertexCollections`, `edgeCollections`), queries now fail. In previous versions, +unknown vertex collections were ignored, and the behavior for unknown +edge collections was undefined. + +Additionally, queries fail if you specify a document collection or View +in `edgeCollections`. + +### Pregel module + +Two new methods have been added to the `@arangodb/pregel` module: + +- `history(...)` to get the persisted execution statistics of a specific or all + algorithm executions +- `removeHistory(...)` to delete the persisted execution statistics of a + specific or all algorithm executions + +```js +var pregel = require("@arangodb/pregel"); +const execution = pregel.start("sssp", "demograph", { source: "vertices/V" }); +const historyStatus = pregel.history(execution); +pregel.removeHistory(); +``` + +See [Distributed Iterative Graph Processing (Pregel)](../../data-science/pregel/_index.md#get-persisted-execution-statistics) +for details. + +### `collection.iterate()` deprecated + +The `collection.iterate()` method is deprecated from v3.11.0 onwards and will be +removed in a future version. + +### `@arangodb/request` certificate validation + +<small>Introduced in: v3.11.11</small> + +The `@arangodb/request` module now supports two additional options for making +HTTPS requests: + +- `verifyCertificates` (optional): if set to `true`, the server certificate of + the remote server is verified using the default certificate store of the system. + Default: `false`. +- `verifyDepth` (optional): limit the maximum length of the certificate chain + that counts as valid. Default: `10`. diff --git a/site/content/arangodb/oem/release-notes/version-3.11/incompatible-changes-in-3-11.md b/site/content/arangodb/oem/release-notes/version-3.11/incompatible-changes-in-3-11.md new file mode 100644 index 0000000000..a99cec9295 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.11/incompatible-changes-in-3-11.md @@ -0,0 +1,695 @@ +--- +title: Incompatible changes in ArangoDB 3.11 +menuTitle: Incompatible changes in 3.11 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Resolving known issues with versions up to 3.11.11 + +Due to an issue with the versions up to 3.11.11, please read the +information below and follow the linked procedures to avoid a potential problem. +Not following these procedures can cause your deployment to become +read-only in rare cases. + +{{< warning >}} +If you are a paying customer with a self-hosted deployment, contact the +Arango support for direct assistance. +Arango Managed Platform (AMP) customers do not need to take any action. +{{< /warning >}} + +**Issues that has been discovered that requires action:** + +- [Issues with the comparison of large indexed numbers](#corrected-sorting-order-for-numbers-in-velocypack-indexes) + +**Who should check for a potential issue:** + +- Deployments created with a version prior to 3.11.11 + +**Deployments not impacted:** + +- Deployments created with 3.11.11 or later 3.11.x version + +**Overview of impact** + +There is a risk of the RocksDB storage engine entering a state where no write operations are +possible anymore, should it discover index entries that are in an unexpected order. + +This can occur at any time, even if a previous check reported no affected indexes, +as there is no protection against storing and indexing data that may cause issues. +To prevent RocksDB from becoming read-only at some point in the future, it is +essential to follow the linked procedures. + +{{< tip >}} +It is recommended to schedule a maintenance time window for taking the ArangoDB +deployment offline to perform the upgrade procedure in the safest possible manner. +{{< /tip >}} + +**Paths to resolution:** + +| Current version | Resolved version | Steps to take | +|-----------------|------------------|---------------| +| 3.11.10 (or older) | 3.11.11 (or newer 3.11.x) | Create a backup, upgrade normally (following the standard [Upgrade path](../../operations/upgrading/_index.md#upgrade-paths) all the way to the latest 3.11.x version), then check for [affected numbers in indexes](#corrected-sorting-order-for-numbers-in-velocypack-indexes) and fix them. | +| 3.11.11 (or newer 3.11.x) | 3.12.4 (or newer) | **Do not upgrade to version 3.12.0, 3.12.1, 3.12.2, or 3.12.3**. Create a backup, check for [affected numbers in indexes](#corrected-sorting-order-for-numbers-in-velocypack-indexes) and fix them (if you haven't done so already or created the deployment with 3.11.11 or a later 3.11.x version), then upgrade to the latest 3.11.x version first, and finally upgrade to version 3.12.4 or later. | + +## Incompatibilities due to switch to glibc + +From version 3.11.10 onward, ArangoDB uses the glibc C standard library +implementation instead of libmusl. Even though glibc is statically linked into +the ArangoDB server and client tool executables, it may load additional modules +at runtime that are installed on your system. Under rare circumstances, it is +possible that ArangoDB crashes when performing host name or address lookups. +This is only the case if all of the following conditions are true: + +- You either use ArangoDB version 3.11.10 (non-hotfix), or you use a 3.11 version + from 3.11.10-1 onward with the `--honor-nsswitch` startup option enabled. +- You use an ArangoDB package on bare metal (not a Docker container) +- Your operating system uses glibc (like Ubuntu, Debian, RedHat, Centos, or + most other Linux distributions, but not Alpine for instance) +- The glibc version of your system is different than the one used by ArangoDB, + in particular if the system glibc is older than version 2.35 +- The `libnss-*` dynamic libraries are installed +- The `/etc/nsswitch.conf` configuration file contains settings other than for + `files` and `dns` in the `hosts:` line, or the `passwd:` and `group:` lines + contain something other than `files` + +If you are affected, consider using Docker containers, `chroot`, or change +`nsswitch.conf`. + +## VelocyStream protocol deprecation + +ArangoDB's own bi-directional asynchronous binary protocol VelocyStream (VST) is +deprecated in v3.11 and removed in v3.12.0. + +While VelocyStream support is still available in v3.11, it is highly recommended +to already switch to the HTTP(S) protocol because of better performance and +reliability. ArangoDB supports both VelocyPack and JSON over HTTP(S). + +## Active Failover deployment mode deprecation + +Running a single server with asynchronous replication to one or more passive +single servers for automatic failover is deprecated and will no longer be +supported in the next minor version of ArangoDB, from v3.12 onward. + +## Extended naming constraints for collections, Views, and indexes + +In ArangoDB 3.9, the `--database.extended-names-databases` startup option was +added to optionally allow database names to contain most UTF-8 characters. +The startup option has been renamed to `--database.extended-names` in 3.11 and +now controls whether you want to use the extended naming constraints for +database, collection, View, and index names. + +The old `--database.extended-names-databases` startup option should no longer +be used, but if you do, it behaves the same as the new +`--database.extended-names` option. + +The feature is disabled by default to ensure compatibility with existing client +drivers and applications that only support ASCII names according to the +traditional naming constraints used in previous ArangoDB versions. + +If the feature is enabled, then any endpoints that contain database, collection, +View, or index names in the URL may contain special characters that were +previously not allowed (percent-encoded). They are also to be expected in +payloads that contain database, collection, View, or index names, as well as +document identifiers (because they are comprised of the collection name and the +document key). If client applications assemble URLs with extended names +programmatically, they need to ensure that extended names are properly +URL-encoded. + +When using extended names, any Unicode characters in names need to be +[NFC-normalized](http://unicode.org/reports/tr15/#Norm_Forms). +If you try to create a database, collection, View, or index with a non-NFC-normalized +name, the server rejects it. + +The ArangoDB web interface as well as the _arangobench_, _arangodump_, +_arangoexport_, _arangoimport_, _arangorestore_, and _arangosh_ client tools +ship with support for the extended naming constraints, but they require you +to provide NFC-normalized names. + +Please be aware that dumps containing extended names cannot be restored +into older versions that only support the traditional naming constraints. In a +cluster setup, it is required to use the same naming constraints for all +Coordinators and DB-Servers of the cluster. Otherwise, the startup is +refused. In DC2DC setups, it is also required to use the same naming +constraints for both datacenters to avoid incompatibilities. + +Also see: +- [Collection names](../../concepts/data-structure/collections.md#collection-names) +- [View names](../../concepts/data-structure/views.md#view-names) +- Index names have the same character restrictions as collection names + +## No AQL user-defined functions (UDF) in `PRUNE` + +AQL user-defined functions (UDFs) cannot be used inside traversal PRUNE conditions +nor inside FILTER conditions that can be moved into the traversal execution on DB-Servers. +This limitation also applies to single servers to keep the differences to cluster +deployments minimal. + +## Stricter validation of Unicode surrogate values in JSON data + +ArangoDB 3.11 employs a stricter validation of Unicode surrogate pairs in +incoming JSON data, for all REST APIs. + +In previous versions, the following loopholes existed when validating UTF-8 +surrogate pairs in incoming JSON data: + +- a high surrogate, followed by something other than a low surrogate + (or the end of the string) +- a low surrogate, not preceded by a high surrogate + +These validation loopholes have been closed in 3.11, which means that any JSON +inputs containing such invalid surrogate pair data are rejected by the server. + +This is normally the desired behavior, as it helps invalid data from entering +the database. However, in situations when a database is known to contain invalid +data and must continue supporting it (at least temporarily), the extended +validation can be disabled by setting the server startup option +`--server.validate-utf8-strings` to `false`. This is not recommended long-term, +but only during upgrading or data cleanup. + +## Restriction of indexable fields + +It is now forbidden to create indexes that cover fields whose attribute names +start or end with `:` , for example, `fields: ["value:"]`. This notation is +reserved for internal use. + +Existing indexes are not affected but you cannot create new indexes with a +preceding or trailing colon. + +## Write-write conflict improvements + +Writes to the same document in quick succession can result in write-write +conflicts, requiring you to retry the operations. In v3.11, single document +operations via the [HTTP Interface for Documents](../../develop/http-api/documents.md) try to +avoid conflicts by locking the key of the document before performing the +modification. This serializes the write operations on the same document. +The behavior of AQL queries, Stream Transactions, and multi-document operations +remains unchanged. + +It is still possible for write-write conflicts to occur, and in these cases the +reported error is now slightly different. + +The lock acquisition on the key of the document that is supposed to be +inserted/modified has a hard-coded timeout of 1 second. If the lock cannot be +acquired, the error message is as follows: + +``` +Timeout waiting to lock key - in index primary of type primary over '_key'; conflicting key: <key> +``` + +The `<key>` corresponds to the document key of the write attempt. In addition, +the error object contains `_key`, `_id`, and `_rev` attributes. The `_key` and +`_id` correspond to the document of the write attempt, and `_rev` corresponds +to the current revision of the document as stored in the database (if available, +otherwise empty). + +If the lock cannot be acquired on a unique index entry, the error message is as +follows: + +``` +Timeout waiting to lock key - in index <indexName> of type persistent over '<fields>'; document key: <key>; indexed values: [<values>] +``` + +The `<indexName>` is the name of the index in which the write attempt tried to +lock the entry, `<fields>` is the list of fields included in that index, `<key>` +corresponds to the document key of the write attempt, and `<values>` +corresponds to the indexed values of the document. In addition, the error object +contains `_key`, `_id`, and `_rev` attributes. The `_key` and `_id` correspond +to the document of the write attempt, and `_rev` corresponds to the current +revision of the document as stored in the database (if available, otherwise empty). + +## Deprecated and removed Pregel features + +- The experimental _Custom Pregel_ feature, also known as + _programmable Pregel algorithms_ (PPA), has been removed. + +- The built-in _DMID_ Pregel algorithm has been deprecated and will be removed + in a future release. + +- The `async` option for Pregel jobs has been removed. Some algorithms supported + an asynchronous mode to run without synchronized global iterations. This is no + longer supported. + +- The `useMemoryMaps` option for Pregel jobs to use memory-mapped files as a + backing storage for large datasets has been removed. Memory paging/swapping + provided by the operating system is equally effective. + +## New query stage + +- When profiling a query (`profile` option `true`, `1`, or `2`), the `profile` + object returned under `extra` now includes a new `"instantiating executors"` + attribute with the time needed to create the query executors, and in cluster + mode, this also includes the time needed for physically distributing the query + snippets to the participating DB-Servers. Previously, the time spent for + instantiating executors and the physical distribution was contained in the + `optimizing plan` stage. + +- The `state` of a query can now additionally be `"instantiating executors"` in + the list of currently running queries. + +## Limit for the normalization of `FILTER` conditions + +Converting complex AQL `FILTER` conditions with a lot of logical branches +(`AND`, `OR`, `NOT`) into the internal DNF (disjunctive normal form) format can +take a large amount of processing time and memory. The new `maxDNFConditionMembers` +query option is a threshold for the maximum number of `OR` sub-nodes in the +internal representation and defaults to `786432`. + +You can also set the threshold globally instead of per query with the +[`--query.max-dnf-condition-members` startup option](../../components/arangodb-server/options.md#--querymax-dnf-condition-members). + +If the threshold is hit, the query continues with a simplified representation of +the condition, which is **not usable in index lookups**. However, this should +still be better than overusing memory or taking a very long time to compute the +DNF version. + +## Validation of `smartGraphAttribute` in SmartGraphs + +<small>Introduced in: v3.10.13, v3.11.7</small> + +The attribute defined by the `smartGraphAttribute` graph property is not allowed to be +changed in the documents of SmartGraph vertex collections. This is now strictly enforced. +See [API Changes in ArangoDB 3.11](api-changes-in-3-11.md#validation-of-smartgraphattribute-in-smartgraphs) +for details and instructions on how to repair affected attributes. + +## Validation of traversal collection restrictions + +<small>Introduced in: v3.9.11, v3.10.7</small> + +In AQL graph traversals, you can restrict the vertex and edge collections in the +traversal options like so: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { + vertexCollections: [ "bolts", "screws" ], + edgeCollections: [ "productsToBolts", "productsToScrews" ] + } + RETURN v +``` + +If you specify collections that don't exist, queries now fail with +a "collection or view not found" error (code `1203` and HTTP status +`404 Not Found`). In previous versions, unknown vertex collections were ignored, +and the behavior for unknown edge collections was undefined. + +Additionally, the collection types are now validated. If a document collection +or View is specified in `edgeCollections`, an error is raised +(code `1218` and HTTP status `400 Bad Request`). + +Furthermore, it is now an error if you specify a vertex collection that is not +part of the specified named graph (code `1926` and HTTP status `404 Not Found`). +It is also an error if you specify an edge collection that is not part of the +named graph's definition or of the list of edge collections (code `1939` and +HTTP status `400 Bad Request`). + +## Batch insertions of documents with key errors no longer fail the entire operation + +<small>Introduced in: v3.11.1</small> + +When inserting multiple documents/edges at once in a cluster, the Document API +used to let the entire request fail if any of the documents/edges failed to be +saved due to a key error. More specifically, if the value of a `_key` attribute +contains illegal characters or if the key doesn't meet additional requirements, +for instance, coming from the collection being used in a Disjoint SmartGraph, +the `POST /_api/document/{collection}` endpoint would not reply with the usual +array of either the document metadata or the error object for each attempted +document insertion. Instead, it used to return an error object for the first +offending document only, and aborted the operation so that none of the documents +were saved. Example: + +```bash +> curl -d '[{"_key":"valid"},{"_key":"invalid space"}]' http://localhost:8529/_api/document/coll +{"code":400,"error":true,"errorMessage":"illegal document key","errorNum":1221} + +> curl http://localhost:8529/_api/document/coll/valid +{"code":404,"error":true,"errorMessage":"document not found","errorNum":1202} +``` + +Now, such key errors in cluster deployments no longer fail the entire request, +matching the behavior of single server deployments. Any errors are reported in +the result array for the respective documents, along with the successful ones: + +```bash +> curl -d '[{"_key":"valid"},{"_key":"invalid space"}]' http://localhost:8529/_api/document/coll +[{"_id":"coll/valid","_key":"valid","_rev":"_gG9JHsW---"},{"error":true,"errorNum":1221,"errorMessage":"illegal document key"}] + +> curl http://localhost:8529/_api/document/coll/valid +{"_key":"valid","_id":"coll/valid","_rev":"_gG9JHsW---"} +``` + +## Exit code adjustments + +<small>Introduced in: v3.10.13, v3.11.7</small> + +For some fatal errors like a required database upgrade or a failed version check, +_arangod_ set the generic exit code of `1`. It now returns a different, more +specific exit code in these cases. + +## Batch-reading an empty list of documents succeeds + +<small>Introduced in: v3.11.1</small> + +Using the Document API for reading multiple documents used to return an error +if the request body was an empty array. Example: + +```bash +> curl -XPUT -d '[]' 'http://localhost:8529/_api/document/coll?onlyget=true' +{"code":500,"error":true,"errorMessage":"internal error","errorNum":4} +``` + +Now, a request like this succeeds and returns an empty array as response. + +## Corrected sorting order for numbers in VelocyPack indexes + +<small>Introduced in: v3.11.11, v3.12.2</small> + +- [Issues with the comparison of large indexed numbers](#issues-with-the-comparison-of-large-indexed-numbers) +- [Check if you are affected](#check-if-you-are-affected) +- [If the deployment is NOT affected](#if-the-deployment-is-not-affected) +- [If the deployment is affected](#if-the-deployment-is-affected) + +### Issues with the comparison of large indexed numbers + +If you store very large numeric values in ArangoDB – greater than/equal to +2<sup>53</sup> (9,007,199,254,740,992) or less than/equal to +-2<sup>53</sup> (-9,007,199,254,740,992) – and index them with an affected +index type, the values may not be in the correct order. This is due to how the +comparison is executed in versions before v3.11.11 and v3.12.2. If the numbers +are represented using different VelocyPack types internally, they are converted +to doubles and then compared. This conversion is lossy for integers with a very +large absolute value, resulting in an incorrect ordering of the values. + +The possibly affected index types are the following that allow storing +VelocyPack data in them: +- `persistent` (including vertex-centric indexes) +- `mdi-prefixed` (but not `mdi` indexes; only available from v3.12.0 onward) +- `hash` (legacy alias for persistent indexes) +- `skiplist` (legacy alias for persistent indexes) + +{{< warning >}} +The incorrect sort order in an index can lead to the RocksDB storage engine +discovering out-of-order keys and then refusing further write operations with +errors and warnings. +{{< /warning >}} + +To prevent ArangoDB deployments from entering a read-only mode due to this issue, +please follow the below procedures to check if your deployment is affected and +how to correct it if necessary. + +### Check if you are affected + +The following procedure is recommended for every deployment unless it has been +created with v3.11.11, v3.12.2, or any later version. + +1. Create a backup as a precaution. If you run the Enterprise Edition, you can + create a Hot Backup. Otherwise, create a full dump with _arangodump_ + (including all databases and system collections). + +2. If your deployment is on a 3.11.x version older than 3.11.11, upgrade to + the latest 3.11 version that is available. + + If your deployment is on version 3.12.0 or 3.12.1, upgrade to the latest + 3.12 version that is available but be sure to also read about the string + sorting issue in [Resolving known issues with versions prior to 3.12.4](../../../3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md#resolving-known-issues-with-versions-prior-to-3124) + and the linked upgrade procedures. + +3. Call the `GET /_admin/cluster/vpackSortMigration/check` endpoint to let + ArangoDB check all indexes. As it can take a while for large deployments, + it is recommended to run this operation as an asynchronous job + (`x-arango-async: store` header) so that you can check the result later. + + The endpoint is available for all deployment modes, not only in clusters. + In case of a cluster, send the request to one of the Coordinators. + Example with ArangoDB running locally on the default port: + + ```shell + curl --dump-header - -H "x-arango-async: store" http://localhost:8529/_admin/cluster/vpackSortMigration/check + ``` + +4. Inspect the response to find the job ID in the `X-Arango-Async-Id` HTTP header. + The job ID is `12345` in the following example: + + ``` + HTTP/1.1 202 Accepted + X-Arango-Queue-Time-Seconds: 0.000000 + Strict-Transport-Security: max-age=31536000 ; includeSubDomains + Expires: 0 + Pragma: no-cache + Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0 + Content-Security-Policy: frame-ancestors 'self'; form-action 'self'; + X-Content-Type-Options: nosniff + X-Arango-Async-Id: 12345 + Server: ArangoDB + Connection: Keep-Alive + Content-Type: text/plain; charset=utf-8 + Content-Length: 0 + ``` + +5. Call the `PUT /_api/job/12345` endpoint, substituting `12345` with your + actual job ID. It returns nothing if the job is still ongoing. You can repeat + this call every once in a while to check again. + + ```shell + curl -XPUT http://localhost:8529/_api/job/12345 + ``` + +6. If there are no issues with your deployment, the check result reports an + empty list of affected indexes and an according message. + + ```json + { + "error": false, + "code": 200, + "result": { + "affected": [], + "error": false, + "errorCode": 0, + "errorMessage": "all good with sorting order" + } + } + ``` + + If this is the case, continue with + [If the deployment is NOT affected](#if-the-deployment-is-not-affected). + + If affected indexes are found, the check result looks similar to this: + + ```json + { + "error": false, + "code": 200, + "result": { + "affected": [ + { + "database": "_system", + "collection": "coll", + "indexId": 195, + "indexName": "idx_1806192152446763008" + } + ], + "error": true, + "errorCode": 1242, + "errorMessage": "some indexes have legacy sorted keys" + } + } + ``` + + If this is the case, continue with + [If the deployment is affected](#if-the-deployment-is-affected). + +### If the deployment is NOT affected + +1. Make sure that no problematic values are written to or removed from an index + between checking for affected indexes and completing the procedure. + To be safe, you may want to stop all writes to the database system. + +2. You can perform a regular in-place upgrade and mark the deployment as correct + using a special HTTP API endpoint in the next step. + + That is, create a backup and upgrade your deployment to the + latest bugfix version with the same major and minor version (e.g. from 3.11.x + to at least 3.11.11 or from 3.12.x to at least 3.12.2). + +3. Call the `PUT /_admin/cluster/vpackSortMigration/migrate` endpoint to mark + the deployment as having the correct sorting order. This requires + [superuser permissions](../../develop/http-api/authentication.md#jwt-superuser-tokens) + unless authentication is disabled. + + ```shell + curl -H "Authorization: bearer <superuser-token>" -XPUT http://localhost:8529/_admin/cluster/vpackSortMigration/migrate + ``` + + ```json + { + "error": false, + "code": 200, + "result": { + "error": false, + "errorCode": 0, + "errorMessage": "VPack sorting migration done." + } + } + ``` + +4. For the corrected sorting order to take effect, restart the ArangoDB server, + respectively restart the DB-Servers of the cluster. + +5. Complete the procedure by resuming writes to the database systems. + +### If the deployment is affected + +{{< info >}} +If you are a customer, please contact the Arango support to assist you with +the following steps. +{{< /info >}} + +1. This step depends on the deployment mode: + + - **Single server**: Create a new server. Then create a full dump with + [arangodump](../../components/tools/arangodump/_index.md) of the old server, + using the `--all-databases` and `--include-system-collections` startup options + and a user account with administrate access to the `_system` database and + at least read access to all other databases to ensure all data including + the `_users` system collection are dumped. + + Restore the dump to the new single server using at least v3.11.11 or v3.12.4 + (v3.12.2 only addresses this but not [another issue](../../../3.12/release-notes/version-3.12/incompatible-changes-in-3-12.md#corrected-sorting-order-for-strings-in-velocypack-indexes)). + You need to use a new database directory. + + - **Active Failover**: You need to replace all servers of the deployment. + You can do so in a rolling manner. + + Create a new server and add it as a new follower to the deployment. + When it is in-sync with the leader, remove one of the old followers. + Replace any other old followers in the same manner. Then create + one more new server, add it as a follower, and wait until it is in-sync. + Then remove the old leader, failing over to one of the new followers. + You should stop all writes temporarily before and after the failover so + that nothing is lost, as the Active Failover replication is asynchronous. + + You can also follow the single server instructions if it's acceptable to + have downtime. + + - **Cluster**: Replace the DB-Server nodes until they all run at least + v3.11.11 or v3.12.4 (rolling upgrade). Syncing new nodes writes the data in + the correct order. This deployment mode and approach avoids downtimes. + + For each DB-Server, add a new DB-Server node to the cluster. Wait until all + new DB-Servers are in sync, then clean out the old DB-Server nodes. + +2. New instances using the fixed versions initialize the database directory + with the sorting order marked as correct and also restore data from dumps + correctly. There is no need to call the `.../vpackSortMigration/migrate` + HTTP API endpoint like in the unaffected case. + +3. If you revert to an older state with affected indexes by restoring a + Hot Backup, you need to repeat the procedure. + +## Changed JSON serialization and VelocyPack format for replication + +<small>Introduced in: v3.11.12, v3.12.3</small> + +While there is only one number type in JSON, the VelocyPack format that ArangoDB +uses supports different numeric data types. When converting between VelocyPack +and JSON, it was previously possible for precision loss to occur in edge cases. +This also affected creating and restoring dumps with arangodump and arangorestore. + +A double (64-bit floating-point) value `1152921504606846976.0` (2<sup>60</sup>) +used to be serialized to `1152921504606847000` in JSON, which deserializes back +to `1152921504606846976` when using a double. However, the serialized value got +parsed as an unsigned integer, resulting in an incorrect value of +`1152921504606847000`. + +Numbers with an absolute value greater or equal to 2<sup>53</sup> and less than +2<sup>64</sup> (which always represents an integer) are now serialized faithfully +to JSON using an integer conversion routine and then `.0` is appended (e.g. +`1152921504606846976.0`) to ensure that they get parsed back to the exact same +double value. All other values are serialized as before, e.g. small integral +values don't get `.0` appended, and they get parsed back to integers with the +same numerical value. + +Moreover, replication-related APIs such as the `/_api/wal/tail` endpoint now +support the VelocyPack format. The cluster replication has been changed to use +VelocyPack instead of JSON to avoid unnecessary conversions and avoiding any +risk of deviations due to the serialization. + +## JavaScript API + +### Database creation + +The `db._createDatabase()` method for creating a new database has changed. +If the specified database name is invalid/illegal, it now returns the error code +`1208` (`ERROR_ARANGO_ILLEGAL_NAME`). It previously returned `1229` +(`ERROR_ARANGO_DATABASE_NAME_INVALID`) in this case. + +This is a downwards-incompatible change, but unifies the behavior for database +creation with the behavior of collection and View creation, which also return +the error code `1208` in case the specified name is not allowed. + +### Index methods + +Calling `collection.dropIndex(...)` or `db._dropIndex(...)` now raises an error +if the specified index does not exist or cannot be dropped (for example, because +it is a primary index or edge index). The methods previously returned `false`. +In case of success, they still return `true`. + +You can wrap calls to these methods with a `try { ... }` block to catch errors, +for example, in _arangosh_ or in Foxx services. + +## Startup options + +### `--server.disable-authentication` and `--server.disable-authentication-unix-sockets` obsoleted + +The `--server.disable-authentication` and `--server.disable-authentication-unix-sockets` +startup options are now obsolete. Specifying them is still tolerated but has +no effect anymore. These options were deprecated in v3.0 and mapped to +`--server.authentication` and `--server.authentication-unix-sockets`, which +made them do the opposite of what their names suggest. + +### `--database.force-sync-properties` deprecated + +The `--database.force-sync-properties` option was useful with the MMFiles +storage engine, which has been removed in v3.7. The option does not have any +useful effect if you use the RocksDB storage engine. From v3.11.0 onwards, it +has no effect at all, is deprecated, and will be removed in a future version. + +### `--agency.pool-size` deprecated + +The `--agency.pool-size` option was effectively not properly supported in any +version of ArangoDB. Setting the option to anything but the value of +`--agency.size` should be avoided. + +From v3.11.0 onwards, this option is deprecated, and setting it to a value +different than the value of `--agency.size` leads to a startup error. + +### `--query.parallelize-gather-writes` obsoleted + +Parallel gather is now enabled by default and supported for most queries. +The `--query.parallelize-gather-writes` startup option has no effect anymore, +but specifying it still tolerated. + +See [Features and Improvements in ArangoDB 3.11](whats-new-in-3-11.md#parallel-gather) +for details. + +### `--pregel.memory-mapped-files*` obsoleted + +Pregel no longer supports use memory-mapped files as a backing storage. +The following startup options have therefore been removed: + +- `--pregel.memory-mapped-files` +- `--pregel.memory-mapped-files-custom-path` +- `--pregel.memory-mapped-files-location-type` + +You can still specify them on startup without raising errors but they have no +effect anymore. + +## Client tools + +### arangoexport + +The default output file type produced by arangoexport, controlled by the `--type` +startup option, has been changed from `json` to `jsonl`. +This allows for more efficient processing of the files produced by arangoexport +with other tools, such as arangoimport, by default. diff --git a/site/content/arangodb/oem/release-notes/version-3.11/known-issues-in-3-11.md b/site/content/arangodb/oem/release-notes/version-3.11/known-issues-in-3-11.md new file mode 100644 index 0000000000..9d28df36f3 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.11/known-issues-in-3-11.md @@ -0,0 +1,61 @@ +--- +title: Known Issues in ArangoDB 3.11 +menuTitle: Known Issues in 3.11 +weight: 10 +description: >- + Important issues affecting the 3.11.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by `arangosearch` View may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in `arangosearch` View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2023-06-06 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** During a cluster upgrade while the supervision is deactivated (maintenance mode), upgraded DB-Server nodes are incorrectly reported to still have the old server version. The versions are visible in the Agency as well as in the **NODES** section of the web interface. <br> **Affected Versions:** 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-1409](https://arangodb.atlassian.net/browse/BTS-1409) (internal) | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-24 <br> **Component:** Web Interface <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Leader/Follower mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-04-03 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Updating the properties of a collection in the cluster may return before the properties are updated consistently on all shards. This is especially visible when setting a schema for a collection with multiple shards, and then instantly starting to store non-conforming documents into the collection. These may be accepted until the properties change has been fully propagated to all shards. <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | +| **Date Added:** 2021-08-06 <br> **Component:** Installer <br> **Deployment Mode:** Single Server <br> **Description:** The Windows installer fails during database initialization with the error `failed to locate tzdata` if there are non-ASCII characters in the destination path. <br> **Affected Versions:** 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-531](https://arangodb.atlassian.net/browse/BTS-531) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter may fail to pick a Docker container name from cgroups. <br> **Affected Versions:** 3.8.x, 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [GT-207](https://arangodb.atlassian.net/browse/GT-207) (internal) | +| **Date Added:** 2023-05-25 <br> **Component:** Web Interface <br> **Deployment Mode:** All <br> **Description:** When accessing the Web Interface with Chromium-based browsers, the following issue may occur: the **Download JSON** button in the **Collections** page and the **Download** button in the **Queries** page don't work. <br> **Affected Versions:** 3.11.x <br> **Fixed in Versions:** 3.11.2 <br> **Reference:** [BTS-1424](https://arangodb.atlassian.net/browse/BTS-1424) (internal) | +| **Date Added:** 2023-05-25 <br> **Component:** arangod <br> **Deployment Mode:** Single Server <br> **Description:** After an upgrade to 3.11.0 from an older version of ArangoDB with existing data, the following issue may occur: when you start a Pregel run or request its status, the Pregel command fails with `ArangoError 1203: _pregel_queries...`. As a workaround, you can manually create the collection by running `db._create("_pregel_queries", { isSystem: true });` in arangosh. <br> **Affected Versions:** 3.11.0 <br> **Fixed in Versions:** 3.11.1 <br> **Reference:** [arangodb/arangodb#19101](https://github.com/arangodb/arangodb/pull/19101) | +| **Date Added:** 2023-05-25 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** When starting an async job by sending a request with the `x-arango-async: store` or `x-arango-async: keep` HTTP header **and** additionally sending the `accept-encoding: gzip` or `accept-encoding: deflate` HTTP header , the generated response may be compressed twice when fetching the async job's response later via the `/_api/job/<id>` REST API. <br> **Affected Versions:** 3.11.0 <br> **Fixed in Versions:** 3.11.1 <br> **Reference:** [arangodb/arangodb#19103](https://github.com/arangodb/arangodb/pull/19103) | +| **Date Added:** 2023-06-15 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** After an upgrade to 3.11.0 from an older version of ArangoDB with existing data, the following issue may occur after performing a HotBackup: `_pregel_queries` collections do not exist. <br> **Affected Versions:** 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-1462](https://arangodb.atlassian.net/browse/BTS-1462) (internal) | +| **Date Added:** 2023-06-16 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** If more than a certain threshold of queries on the same Coordinator get into the shutdown networking code at the same time, all of them lock up and the Coordinator does not longer process requests. <br> **Affected Versions:** 3.9.x. 3.10.x, 3.11.x <br> **Fixed in Versions:** 3.9.12, 3.10.8, 3.11.2 <br> **Reference:** [BTS-1486](https://arangodb.atlassian.net/browse/BTS-1486) (internal) | +| **Date Added:** 2024-03-21 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** When creating an `inverted` index with the `inBackground` option enabled, HTTP API calls like `http://localhost:8529/_api/index?collection=<coll>&withHidden=true` don't return the `isBuilding` and `progress` attributes and the progress of the index building can thus not be observed. <br> **Affected Versions:** 3.10.13, 3.11.7 <br> **Fixed in Versions:** - <br> **Reference:** [BTS-1788](https://arangodb.atlassian.net/browse/BTS-1788) (internal) | +| **Date Added:** 2024-07-03 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** ArangoDB can crash if run on bare metal and the Linux distribution uses a different glibc version, the `libnss-*` libraries are installed, and the `/etc/nsswitch.conf` configuration file contains settings other than for `files` and `dns` in the `hosts:` line, or the `passwd:` and `group:` lines contain something other than `files`. If you use a fixed version, it can still crash under these circumstances if you enable the `--honor-nsswitch` startup option. <br> **Affected Versions:** 3.11.10 (non-hotfix) <br> **Fixed in Versions:** 3.11.10-1 <br> **Reference:** [Incompatibility due to switch to glibc](incompatible-changes-in-3-11.md#incompatibilities-due-to-switch-to-glibc) | +| **Date Added:** 2025-01-30 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** If the invariant is violated that ArangoDB's data is not modified while a server is down, manually as well as automatically triggered operations such as moving shards can make a DB-Server the leader (again) even though it may not have the correct data. ArangoDB does currently not protect against certain cases like bringing a DB-Server back without data (by accident or on purpose), which can lead to this empty state getting replicated across the cluster and thus causing data loss. <br> **Affected Versions:** 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2025-06-25 <br> **Component:** Web interface <br> **Deployment Mode:** All <br> **Description:** Specifying an `X-Script-Name` HTTP header in requests to the web interface (`/_admin/aardvark`) to add a path prefix is non-functional. The feature was originally added in version 3.0 for basic proxy setups but doesn't adequately handle the requests of certain internal services. <br> **Affected Versions:** 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | diff --git a/site/content/arangodb/oem/release-notes/version-3.11/whats-new-in-3-11.md b/site/content/arangodb/oem/release-notes/version-3.11/whats-new-in-3-11.md new file mode 100644 index 0000000000..b0bcd27fe8 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.11/whats-new-in-3-11.md @@ -0,0 +1,1458 @@ +--- +title: Features and Improvements in ArangoDB 3.11 +menuTitle: What's New in 3.11 +weight: 5 +description: >- + Improved performance and reporting for AQL queries, new caching features for + indexed data, improvements to the web interface +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.11. ArangoDB 3.11 also contains several bug fixes that are not listed +here. + +## ArangoSearch + +### Late materialization improvements + +The number of disk reads required when executing search queries with late +materialization optimizations applied has been reduced so that less data needs +to be requested from the RocksDB storage engine. + +### ArangoSearch column cache (Enterprise Edition) + +[`arangosearch` Views](../../index-and-search/arangosearch/arangosearch-views-reference.md) support new caching options. + +<small>Introduced in: v3.9.5, v3.10.2</small> + +- You can enable the new `cache` option for individual View links or fields + to always cache field normalization values in memory. This can improve the + performance of scoring and ranking queries. + + It also enables caching of auxiliary data used for querying fields that are + indexed with Geo Analyzers. This can improve the performance of geo-spatial + queries. + +- You can enable the new `cache` option in the definition of a `storedValues` + View property to always cache stored values in memory. This can improve the + query performance if stored values are involved. + +--- + +<small>Introduced in: v3.9.6, v3.10.2</small> + +- You can enable the new `primarySortCache` View property to always cache the + primary sort columns in memory. This can improve the performance of queries + that utilize the primary sort order. + +- You can enable the new `primaryKeyCache` View property to always cache the + primary key column in memory. This can improve the performance of queries + that return many documents. + +--- + +[Inverted indexes](../../develop/http-api/indexes/inverted.md) also support similar new caching +options. + +<small>Introduced in: v3.10.2</small> + +- A new `cache` option for inverted indexes as the default or for specific + `fields` to always cache field normalization values and Geo Analyzer auxiliary + data in memory. + +- A new `cache` option per object in the definition of the `storedValues` + elements to always cache stored values in memory. + +- A new `cache` option in the `primarySort` property to always cache the + primary sort columns in memory. + +- A new `primaryKeyCache` property for inverted indexes to always cache the + primary key column in memory. + +--- + +The cache size can be controlled with the new `--arangosearch.columns-cache-limit` +startup option and monitored via the new `arangodb_search_columns_cache_size` +metric. + +ArangoSearch caching is only available in the Enterprise Edition. + +See [Optimizing View and inverted index query performance](../../index-and-search/arangosearch/performance.md) +for examples. + +{{< info >}} +If you use ArangoSearch caching in supported 3.9 versions and upgrade an +Active Failover deployment to 3.10, you may need to re-configure the +cache-related options and thus recreate inverted indexes and Views. See +[Known Issues in 3.10](../version-3.10/known-issues-in-3-10.md#arangosearch). +{{< /info >}} + +## Analyzers + +### `geo_s2` Analyzer (Enterprise Edition) + +<small>Introduced in: v3.10.5</small> + +This new Analyzer lets you index GeoJSON data with inverted indexes or Views +similar to the existing `geojson` Analyzer, but it internally uses a format for +storing the geo-spatial data that is more efficient. + +You can choose between different formats to make a tradeoff between the size on +disk, the precision, and query performance: + +- 8 bytes per coordinate pair using 4-byte integer values, with limited precision. +- 16 bytes per coordinate pair using 8-byte floating-point values, which is still + more compact than the VelocyPack format used by the `geojson` Analyzer +- 24 bytes per coordinate pair using the native Google S2 format to reduce the number + of computations necessary when you execute geo-spatial queries. + +This feature is only available in the Enterprise Edition. + +See [Analyzers](../../index-and-search/analyzers.md#geo_s2) for details. + +## Web interface + +### New graph viewer + +The graph viewer for visualizing named graphs has been reimplemented based on +the [vis.js](https://visjs.org/) library, the interface +has been redesigned to be cleaner and rewritten to use the React framework, +and the overall performance has been improved. + +The available **Layout** algorithms are **forceAtlas2** and **hierarchical**. +Force-based layouts try to avoid overlaps while grouping adjacent nodes together. +The new hierarchical layout is useful for strict topologies like trees. + +A new feature is the ability to search the visible graph to center a specific +vertex. Another quality-of-life improvement is the **Start node** setting listing +the graph's vertex collections and the available document keys, that you can +also search by. + +![New graph viewer](../../../../images/graphViewer.png) + +You can still switch to the old graph viewer if desired. + +See the [Graph Viewer](../../components/web-interface/graphs.md) documentation for +details. + +### `search-alias` Views + +The 3.11 release of ArangoDB introduces a new web interface for Views that lets +you to create and manage [`search-alias` Views](../../index-and-search/arangosearch/search-alias-views-reference.md). + +Through this dialog, you can easily create a new View and add to it one or more +inverted indexes from your collections that you could otherwise do via the HTTP +or JavaScript API. + +When opening your newly created View, you can copy mutable properties from +previously created `search-alias` Views, providing a convenient way to apply +the same settings to multiple Views. In addition, the JSON editor offers the +option to directly write the definition of your View in JSON format. + +For more information, see the +[detailed guide](../../index-and-search/arangosearch/search-alias-views-reference.md#create-search-alias-views-using-the-web-interface). + +### `arangosearch` Views + +The existing way of creating and managing `arangosearch` Views through the +web interface has been redesigned, offering a more straightforward approach to add +or modify the definition of your View. The settings, links, and JSON editor have +been merged into a single page, allowing for a much quicker workflow. + +For more information, see the +[detailed guide](../../index-and-search/arangosearch/arangosearch-views-reference.md#create-arangosearch-views-using-the-web-interface). + +### Inverted indexes + +The web interface now includes the option for creating +[inverted indexes](../../index-and-search/indexing/working-with-indexes/inverted-indexes.md) on collections. You can set all the +properties directly in the web interface, which previously required the JavaScript +or HTTP API. It also offers an editor where you can write the definition of +your inverted index in JSON format. + +### New sorting mechanism and search box for Saved Queries + +When working with **Saved Queries** in the web interface, you can now +configure their sort order so that your saved queries are listed by the +date they were last modified. +This is particularly helpful when you have a large amount of saved custom +queries and want to see which ones have been created or used recently. + +In addition, the web interface also offers a search box which helps you +quickly find the query you're looking for. + +## AQL + +### Parallel gather + +On Coordinators in cluster deployments, results from different DB-Servers are +combined into a stream of results. This process is called gathering. It shows as +`GatherNode` nodes in the execution plan of AQL queries. + +Previously, a cluster AQL query could only parallelize a `GatherNode` if the +DB-Server query part above it (in terms of query execution plan layout) was a +terminal part of the query. That means that it was not allowed for other nodes of +type `ScatterNode`, `GatherNode`, or `DistributeNode` to be present in the query. + +Modification queries were also not allowed to use parallel gather unless the +`--query.parallelize-gather-writes` startup option was enabled, which defaulted +to `false`. + +From v3.11.0 onward, these limitations are removed so that parallel gather can be +used in almost all queries. As a result, the feature is enabled by default and +the `--query.parallelize-gather-writes` startup option is now obsolete. You can +still disable the optimization by disabling the `parallelize-gather` AQL +optimizer rule. + +The only case where parallel gather is not supported is when using traversals, +although there are some exceptions for Disjoint SmartGraphs where the traversal +can run completely on the local DB-Server (only available in the Enterprise Edition). + +The parallel gather optimization can not only speed up queries quite significantly, +but also overcome issues with the previous serial processing within `GatherNode` +nodes, which could lead to high memory usage on Coordinators caused by buffering +of documents for other shards, and timeouts on some DB-Servers because query parts +were idle for too long. + +### Optimized access of last element in traversals + +If you use a `FOR` operation for an AQL graph traversal like `FOR v, e, p IN ...` +and later access the last vertex or edge via the path variable `p`, like +`FILTER p.vertices[-1].name == "ArangoDB"` or `FILTER p.edges[-1].weight > 5`, +the access is transformed to use the vertex variable `v` or edge variable `e` +instead, like `FILTER v.name == "ArangoDB"` or `FILTER e.weight > 5`. This is +cheaper to compute because the path variable `p` may not need to be computed at +all, and it can enable further optimizations that are not possible on `p`. + +The new `optimize-traversal-last-element-access` optimization rule appears in +query execution plans if this optimization is applied. + +### Faster bulk `INSERT` operations in clusters + +AQL `INSERT` operations that insert multiple documents can now be faster in +cluster deployments by avoiding unnecessary overhead that AQL queries typically +require for the setup and shutdown in a cluster, as well as for the internal +batching. + +This improvement also decreases the number of HTTP requests to the DB-Servers. +Instead of batching the array of documents (with a default batch size of `1000`), +a single request per DB-Server is used internally to transfer the data. + +The optimization brings the AQL `INSERT` performance close to the performance of +the specialized HTTP API for [creating multiple documents](../../develop/http-api/documents.md#create-multiple-documents). + +The pattern that is recognized by the optimizer is as follows: + +```aql +FOR doc IN <docs> INSERT doc INTO collection +``` + +`<docs>` can either be a bind parameter, a variable, or an array literal. +The value needs to be an array of objects and be known at query compile time. + +```aql +Query String (43 chars, cacheable: false): + FOR doc IN @docs INSERT doc INTO collection + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode COOR 1 * ROOT + 2 CalculationNode COOR 1 - LET #2 = [ { "value" : 1 }, { "value" : 2 }, { "value" : 3 } ] /* json expression */ /* const assignment */ + 5 MultipleRemoteModificationNode COOR 3 - FOR doc IN #2 INSERT doc IN collection + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 remove-data-modification-out-variables + 2 optimize-cluster-multiple-document-operations +``` + +The query runs completely on the Coordinator. The `MultipleRemoteModificationNode` +performs a bulk document insert for the whole input array in one go, internally +using a transaction that is more lightweight for transferring the data to the +DB-Servers than a regular AQL query. + +Without the optimization, the Coordinator requests data from the DB-Servers +(`GatherNode`), but the DB-Servers have to contact the Coordinator in turn to +request their data (`DistributeNode`), involving a network request for every +batch of documents: + +```aql +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode COOR 1 * ROOT + 2 CalculationNode COOR 1 - LET #2 = [ { "value" : 1 }, { "value" : 2 }, { "value" : 3 } ] /* json expression */ /* const assignment */ + 3 EnumerateListNode COOR 3 - FOR doc IN #2 /* list iteration */ + 9 CalculationNode COOR 3 - LET #4 = MAKE_DISTRIBUTE_INPUT_WITH_KEY_CREATION(doc, null, { "allowSpecifiedKeys" : false, "ignoreErrors" : false, "collection" : "collection" }) /* simple expression */ + 5 DistributeNode COOR 3 - DISTRIBUTE #4 + 6 RemoteNode DBS 3 - REMOTE + 4 InsertNode DBS 0 - INSERT #4 IN collection + 7 RemoteNode COOR 0 - REMOTE + 8 GatherNode COOR 0 - GATHER /* parallel, unsorted */ +``` + +The new `optimize-cluster-multiple-document-operations` optimizer rule that +enables the optimization is only applied if there is no `RETURN` operation, +which means you cannot use `RETURN NEW` or similar to access the new documents +including their document keys. Additionally, all preceding calculations must be +constant, which excludes any subqueries that read documents. + +See the list of [optimizer rules](../../aql/execution-and-performance/query-optimization.md#optimizer-rules) +for details. + +### Index cache refilling + +The [edge cache refilling](../version-3.10/whats-new-in-3-10.md#edge-cache-refilling-experimental) +feature introduced in v3.9.6 and v3.10.2 is no longer experimental. From v3.11.0 +onward, it is called _**index** cache refilling_ and is not limited to edge caches +anymore, but also supports in-memory hash caches of persistent indexes +(persistent indexes with the `cacheEnabled` option set to `true`). + +This new feature automatically refills the in-memory index caches. +When documents (including edges) are added, modified, or removed and if this +affects an edge index or cache-enabled persistent indexes, these changes are +tracked and a background thread tries to update the index caches accordingly if +the feature is enabled, by adding new, updating existing, or deleting and +refilling cache entries. + +You can enable it for individual `INSERT`, `UPDATE`, `REPLACE`, and `REMOVE` +operations in AQL queries (using `OPTIONS { refillIndexCaches: true }`), for +individual document API requests that insert, update, replace, or remove single +or multiple documents (by setting `refillIndexCaches=true` as query +parameter), as well as enable it by default using the new +`--rocksdb.auto-refill-index-caches-on-modify` startup option. + +The new `--rocksdb.auto-refill-index-caches-queue-capacity` startup option +restricts how many index cache entries the background thread can queue at most. +This limits the memory usage for the case of the background thread being slower +than other operations that invalidate index cache entries. + +The background refilling is done on a best-effort basis and not guaranteed to +succeed, for example, if there is no memory available for the cache subsystem, +or during cache grow/shrink operations. A background thread is used so that +foreground write operations are not slowed down by a lot. It may still cause +additional I/O activity to look up data from the storage engine to repopulate +the cache. + +In addition to refilling the index caches, the caches can also automatically be +seeded on server startup. Use the new `--rocksdb.auto-fill-index-caches-on-startup` +startup option to enable this feature. It may cause additional CPU and I/O load. +You can limit how many index filling operations can execute concurrently with the +`--rocksdb.max-concurrent-index-fill-tasks` option. The lower this number, the +lower the impact of the cache filling, but the longer it takes to complete. + +The following metrics are available: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_auto_refill_loaded_total` | Total number of queued items for in-memory index caches refilling. +| `rocksdb_cache_auto_refill_dropped_total` | Total number of dropped items for in-memory index caches refilling. +| `rocksdb_cache_full_index_refills_total` | Total number of in-memory index caches refill operations for entire indexes. + +This feature is experimental. + +Also see: +- [AQL `INSERT` operation](../../aql/high-level-operations/insert.md#refillindexcaches) +- [AQL `UPDATE` operation](../../aql/high-level-operations/update.md#refillindexcaches) +- [AQL `REPLACE` operation](../../aql/high-level-operations/replace.md#refillindexcaches) +- [AQL `REMOVE` operation](../../aql/high-level-operations/remove.md#refillindexcaches) +- [Document HTTP API](../../develop/http-api/documents.md) +- [Index cache refill options](#index-cache-refill-options) + +### Retry request for result batch + +You can retry the request for the latest result batch of an AQL query cursor if +you enable the new `allowRetry` query option. See +[API Changes in ArangoDB 3.11](api-changes-in-3-11.md#cursor-api) +for details. + +### `COLLECT ... INTO` can use `hash` method + +Grouping with the `COLLECT` operation supports two different methods, `hash` and +`sorted`. For `COLLECT` operations with an `INTO` clause, only the `sorted` method +was previously supported, but the `hash` variant has been extended to now support +`INTO` clauses as well. + +```aql +FOR i IN 1..10 + COLLECT v = i % 2 INTO group // OPTIONS { method: "hash" } + SORT null + RETURN { v, group } +``` + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 CalculationNode 1 - LET #3 = 1 .. 10 /* range */ /* simple expression */ + 3 EnumerateListNode 10 - FOR i IN #3 /* list iteration */ + 4 CalculationNode 10 - LET #5 = (i % 2) /* simple expression */ + 5 CollectNode 8 - COLLECT v = #5 INTO group KEEP i /* hash */ + 8 CalculationNode 8 - LET #9 = { "v" : v, "group" : group } /* simple expression */ + 9 ReturnNode 8 - RETURN #9 +``` + +The query optimizer automatically chooses the `hash` method for the above +example query, but you can also specify your preferred method explicitly. + +See the [`COLLECT` options](../../aql/high-level-operations/collect.md#method) for details. + +### K_SHORTEST_PATHS performance improvements + +The `K_SHORTEST_PATHS` graph algorithm in AQL has been refactored in ArangoDB 3.11, +resulting in major performance improvements. The query now returns the +shortest paths between two documents in a graph up to 100 times faster. + +### Added AQL functions + +Added the `DATE_ISOWEEKYEAR()` function that returns the ISO week number, +like `DATE_ISOWEEK()` does, but also the year it belongs to: + +```aql +RETURN DATE_ISOWEEKYEAR("2023-01-01") // { "week": 52, "year": 2022 } +``` + +See [AQL Date functions](../../aql/functions/date.md#date_isoweekyear) for details. + +--- + +Added the `SHA256()` function that calculates the SHA256 checksum for a string +and returns it in a hexadecimal string representation. + +```aql +RETURN SHA256("ArangoDB") // "acbd84398a61fcc6fd784f7e16c32e02a0087fd5d631421bf7b5ede5db7fda31" +``` + +See [AQL String functions](../../aql/functions/string.md#sha256) for details. + +### Extended query explain statistics + +<small>Introduced in: v3.10.4</small> + +The query explain result now includes the peak memory usage and execution time. +This helps finding queries that use a lot of memory or take long to build the +execution plan. + +The additional statistics are displayed at the end of the output in the +web interface (using the **Explain** button in the **QUERIES** section) and in +_arangosh_ (using `db._explain()`): + +``` +44 rule(s) executed, 1 plan(s) created, peak mem [b]: 32768, exec time [s]: 0.00214 +``` + +The HTTP API returns the extended statistics in the `stats` attribute when you +use the `POST /_api/explain` endpoint: + +```json +{ + ... + "stats": { + "rulesExecuted": 44, + "rulesSkipped": 0, + "plansCreated": 1, + "peakMemoryUsage": 32768, + "executionTime": 0.00241307167840004 + } +} +``` + +Also see: +- [API Changes in ArangoDB 3.11](api-changes-in-3-11.md#explain-api) +- [The AQL query optimizer](../../aql/execution-and-performance/query-optimization.md#optimizer-statistics) + +### Extended peak memory usage reporting + +The peak memory usage of AQL queries is now also reported for running queries +and slow queries. + +In the web interface, you can find the **Peak memory usage** column in the +**QUERIES** section, in the **Running Queries** and **Slow Query History** tabs. + +In the JavaScript and HTTP APIs, the value is reported as `peakMemoryUsage`. +See [API Changes in ArangoDB 3.11](api-changes-in-3-11.md#query-api). + +### Number of cluster requests in profiling output + +<small>Introduced in: v3.9.5, v3.10.2</small> + +The query profiling output in the web interface and _arangosh_ now shows the +number of HTTP requests for queries that you run against cluster deployments in +the `Query Statistics`: + +```aql +Query String (33 chars, cacheable: false): + FOR doc IN coll + RETURN doc._key + +Execution plan: + Id NodeType Site Calls Items Filtered Runtime [s] Comment + 1 SingletonNode DBS 3 3 0 0.00024 * ROOT + 9 IndexNode DBS 3 0 0 0.00060 - FOR doc IN coll /* primary index scan, index only (projections: `_key`), 3 shard(s) */ + 3 CalculationNode DBS 3 0 0 0.00025 - LET #1 = doc.`_key` /* attribute expression */ /* collections used: doc : coll */ + 7 RemoteNode COOR 6 0 0 0.00227 - REMOTE + 8 GatherNode COOR 2 0 0 0.00209 - GATHER /* parallel, unsorted */ + 4 ReturnNode COOR 2 0 0 0.00008 - RETURN #1 + +Indexes used: + By Name Type Collection Unique Sparse Cache Selectivity Fields Stored values Ranges + 9 primary primary coll true false false 100.00 % [ `_key` ] [ ] * + +Optimization rules applied: + Id RuleName + 1 scatter-in-cluster + 2 distribute-filtercalc-to-cluster + 3 remove-unnecessary-remote-scatter + 4 reduce-extraction-to-projection + 5 parallelize-gather + +Query Statistics: + Writes Exec Writes Ign Scan Full Scan Index Cache Hits/Misses Filtered Requests Peak Mem [b] Exec Time [s] + 0 0 0 0 0 / 0 0 9 32768 0.00564 +``` + +### New stage in query profiling output + +<small>Introduced in: v3.10.3</small> + +The query profiling output has a new `instantiating executors` stage. +The time spent in this stage is the time needed to create the query executors +from the final query execution time. In cluster mode, this stage also includes +the time needed for physically distributing the query snippets to the +participating DB-Servers. Previously, the time spent for instantiating executors +and the physical distribution was contained in the `optimizing plan` stage. + +``` +Query Profile: + Query Stage Duration [s] + initializing 0.00001 + parsing 0.00009 + optimizing ast 0.00001 + loading collections 0.00001 + instantiating plan 0.00004 + optimizing plan 0.00088 + instantiating executors 0.00153 + executing 1.27349 + finalizing 0.00091 +``` + +### Limit for the normalization of `FILTER` conditions + +Converting complex AQL `FILTER` conditions with a lot of logical branches +(`AND`, `OR`, `NOT`) into the internal DNF (disjunctive normal form) format can +take a large amount of processing time and memory. The new `maxDNFConditionMembers` +query option is a threshold for the maximum number of `OR` sub-nodes in the +internal representation and defaults to `786432`. + +You can also set the threshold globally instead of per query with the +[`--query.max-dnf-condition-members` startup option](../../components/arangodb-server/options.md#--querymax-dnf-condition-members). + +If the threshold is hit, the query continues with a simplified representation of +the condition, which is **not usable in index lookups**. However, this should +still be better than overusing memory or taking a very long time to compute the +DNF version. + +## Server options + +### Telemetrics + +Starting with version 3.11, ArangoDB automatically gathers information on how +it is used and the features being utilized. This data is used to identify the +primary usage patterns and features, and to measure their adoption rate. + +The information collected by ArangoDB is anonymous and purely statistical. +It does not contain any personal information like usernames or IP addresses, nor +any content of the documents stored in ArangoDB. This means that your privacy is +protected, and that there is no risk of your data being compromised. + +If for any reason you prefer not to share usage statistics with ArangoDB, you +can easily disable this feature by setting the new `--server.telemetrics-api` +startup option to `false`. The default value is `true`. + +For a detailed list of what anonymous metrics ArangoDB collects see +[Telemetrics](../../operations/administration/telemetrics.md). + +### Extended naming constraints for collections, Views, and indexes + +In ArangoDB 3.9, the `--database.extended-names-databases` startup option was +added to optionally allow database names to contain most UTF-8 characters. +The startup option has been renamed to `--database.extended-names` in 3.11 and +now controls whether you want to use the extended naming constraints for +database, collection, View, and index names. + +This feature is **experimental** in ArangoDB 3.11, but will become the norm in +a future version. + +Running the server with the option enabled provides support for extended names +that are not comprised within the ASCII table, such as Japanese or Arabic +letters, emojis, letters with accentuation. Also, many ASCII characters that +were formerly banned by the traditional naming constraints are now accepted. + +Example collection, View, and index names that can be used with the new extended +constraints: `España`, `😀`, `犬`, `كلب`, `@abc123`, `København`, `München`, +`Бишкек`, `abc? <> 123!` + +Using extended collection and View names in the JavaScript API such as in +_arangosh_ or Foxx may require using the square bracket notation instead of the +dot notation for property access depending on the characters you use: + +```js +db._create("🥑~колекція =)"); +db.🥑~колекція =).properties(); // dot notation (syntax error) +db["🥑~колекція =)"].properties() // square bracket notation +``` + +Using extended collection and View names in AQL queries requires wrapping the +name in backticks or forward ticks (see [AQL Syntax](../../aql/fundamentals/syntax.md#names)): + +```aql +FOR doc IN `🥑~колекція =)` + RETURN doc +``` + +When using extended names, any Unicode characters in names need to be +[NFC-normalized](http://unicode.org/reports/tr15/#Norm_Forms). +If you try to create a database, collection, View, or index with a non-NFC-normalized +name, the server rejects it. + +The ArangoDB web interface as well as the _arangobench_, _arangodump_, +_arangoexport_, _arangoimport_, _arangorestore_, and _arangosh_ client tools +ship with support for the extended naming constraints, but they require you +to provide NFC-normalized names. + +Note that the default value for `--database.extended-names` is `false` +for compatibility with existing client drivers and applications that only support +ASCII names according to the traditional naming constraints used in previous +ArangoDB versions. Enabling the feature may lead to incompatibilities up to the +ArangoDB instance becoming inaccessible for such drivers and client applications. + +Please be aware that dumps containing extended names cannot be restored +into older versions that only support the traditional naming constraints. In a +cluster setup, it is required to use the same naming constraints for all +Coordinators and DB-Servers of the cluster. Otherwise, the startup is +refused. In DC2DC setups, it is also required to use the same naming constraints +for both datacenters to avoid incompatibilities. + +Also see: +- [Collection names](../../concepts/data-structure/collections.md#collection-names) +- [View names](../../concepts/data-structure/views.md#view-names) +- Index names have the same character restrictions as collection names + +### Verify `.sst` files + +The new `--rocksdb.verify-sst` startup option lets you validate the `.sst` files +currently contained in the database directory on startup. If set to `true`, +on startup, all SST files in the `engine-rocksdb` folder in the database +directory are validated, then the process finishes execution. +The default value is `false`. + +### Support for additional value suffixes + +Numeric startup options support suffixes like `m` (megabytes) and `GiB` (gibibytes) +to make it easier to specify values that are expected in bytes. The following +suffixes are now also supported: + +- `tib`, `TiB`, `TIB`: tebibytes (factor 1024<sup>4</sup>) +- `t`, `tb`, `T`, `TB`: terabytes (factor 1000<sup>4</sup>) +- `b`, `B`: bytes (factor 1) + +Example: `arangod --rocksdb.total-write-buffer-size 2TiB` + +See [Suffixes for numeric options](../../operations/administration/configuration.md#suffixes-for-numeric-options) +for details. + +### Configurable status code if write concern not fulfilled + +In cluster deployments, you can use a replication factor greater than `1` for +collections. This creates additional shard replicas for redundancy. For write +operations to these collections, you can define how many replicas need to +acknowledge the write for the operation to succeed. This option is called the +write concern. If there are not enough in-sync replicas available, the +write concern cannot be fulfilled. An error with the HTTP `403 Forbidden` +status code is returned immediately in this case. + +You can now change the status code via the new +`--cluster.failed-write-concern-status-code` startup option. It defaults to `403` +but you can set it to `503` to use an HTTP `503 Service Unavailable` status code +instead. This signals client applications that it is a temporary error. + +Note that no automatic retry of the operation is attempted by the cluster if you +set the startup option to `503`. It only changes the status code to one that +doesn't signal a permanent error like `403` does. +It is up to client applications to retry the operation. + +### RocksDB BLOB storage (experimental) + +From version 3.11 onward, ArangoDB can make use of RocksDB's integrated BLOB +(binary large object) storage for larger documents, called _BlobDB_. +This is currently an experimental feature, not supported and should not be used in production. + +[BlobDB is an integral part of RocksDB](https://rocksdb.org/blog/2021/05/26/integrated-blob-db.html) +and provides a key-value separation: large values are stored in dedicated BLOB +files, and only a small pointer to them is stored in the LSM tree's SST files. +Storing values separate from the keys means that the values do no need to be moved +through the LSM tree by the compaction. This reduces write amplification and is +especially beneficial for large values. + +When the option is enabled in ArangoDB, the key-value separation is used for +the documents column family, because large values are mostly to be expected here. +The cutoff value for the key-value separation is configurable by a startup option, +i.e. the administrator can set a size limit for values from which onwards they +are offloaded to separate BLOB files. This allows storing small documents +inline with the keys as before, but still benefit from reduced write amplification +for larger documents. + +BlobDB is disabled by default in ArangoDB 3.11. +Using BlobDB in ArangoDB is experimental and not recommended in production. It is +made available as an experimental feature so that further tests and tuning can be +done by interested parties. Future versions of ArangoDB may declare the feature +production-ready and even enable BlobDB by default. + +There are currently a few caveats when using BlobDB in ArangoDB: + +- Even though BlobDB can help reduce the write amplification, it may increase the + read amplification and may worsen the read performance for some workloads. +- The various tuning parameters that BlobDB offers are made available in ArangoDB, + but the current default settings for the BlobDB tuning options are not ideal + for many use cases and need to be adjusted by administrators first. +- It is very likely that the default settings for the BlobDB tuning options will + change in future versions of ArangoDB. +- Memory and disk usage patterns are different to that of versions running without + BlobDB enabled. It is very likely that memory limits and disk capacity may + need to be adjusted. +- Some metrics for observing RocksDB do not react properly when BlobDB is in use. +- The built-in throttling mechanism for controlling the write-throughput + slows down writes too much when BlobDB is used. This can be circumvented with + tuning parameters, but the defaults may be too aggressive. + +The following experimental startup options have been added in ArangoDB 3.11 to +enable and configure BlobDB: + +- `--rocksdb.enable-blob-files`: Enable the usage of BLOB files for the + documents column family. This option defaults to `false`. All following + options are only relevant if this option is set to `true`. +- `--rocksdb.min-blob-size`: Size threshold for storing large documents in + BLOB files (in bytes, 0 = store all documents in BLOB files). +- `--rocksdb.blob-file-size`: Size limit for BLOB files in the documents + column family (in bytes). Note that RocksDB counts the size of uncompressed + BLOBs before checking if a new BLOB file needs to be started, even though + the BLOB may be compressed and end up much smaller than uncompressed. +- `--rocksdb.blob-compression-type`: Compression algorithm to use for BLOB + data in the documents column family. +- `--rocksdb.enable-blob-garbage-collection`: Enable BLOB garbage collection + during compaction in the documents column family. +- `--rocksdb.blob-garbage-collection-age-cutoff`: Age cutoff for garbage + collecting BLOB files in the documents column family (percentage value from + 0 to 1 determines how many BLOB files are garbage collected during + compaction). +- `--rocksdb.blob-garbage-collection-force-threshold`: Garbage ratio + threshold for scheduling targeted compactions for the oldest BLOB files + in the documents column family. + +Note that ArangoDB's built-in throttling mechanism that automatically adjusts +the write rate for RocksDB may need to be reconfigured as well to see the +benefits of BlobDB. The relevant startup options for the throttle are: + +- `--rocksdb.throttle-lower-bound-bps` +- `--rocksdb.throttle-max-write-rate` +- `--rocksdb.throttle-slow-down-writes-trigger` + +### `--query.max-dnf-condition-members` option + +See [Limit for the normalization of `FILTER` conditions](#limit-for-the-normalization-of-filter-conditions). + +### `--rocksdb.reserve-file-metadata-memory` option + +This new startup option controls whether to account for `.sst` file metadata +memory in the block cache. + +### ArangoSearch column cache limit + +<small>Introduced in: v3.9.5, v3.10.2</small> + +The new `--arangosearch.columns-cache-limit` startup option lets you control how +much memory (in bytes) the [ArangoSearch column cache](#arangosearch-column-cache-enterprise-edition) +is allowed to use. + +<small>Introduced in: v3.10.6</small> + +You can reduce the memory usage of the column cache in cluster deployments by +only using the cache for leader shards with the new +[`--arangosearch.columns-cache-only-leader` startup option](../../components/arangodb-server/options.md#--arangosearchcolumns-cache-only-leader). +It is disabled by default, which means followers also maintain a column cache. + +### AQL query logging + +<small>Introduced in: v3.9.5, v3.10.2</small> + +There are three new startup options to configure how AQL queries are logged: + +- `--query.log-failed` for logging all failed AQL queries, to be used during + development or to catch unexpected failed queries in production (off by default) +- `--query.log-memory-usage-threshold` to define a peak memory threshold from + which on a warning is logged for AQL queries that exceed it (default: 4 GB) +- `--query.max-artifact-log-length` for controlling the length of logged query + strings and bind parameter values. Both are truncated to 4096 bytes by default. + +### Index cache refill options + +<small>Introduced in: v3.9.6, v3.10.2</small> + +- `--rocksdb.auto-refill-index-caches-on-modify`: Whether to automatically + (re-)fill in-memory index cache entries on insert/update/replace operations + by default. Default: `false`. +- `--rocksdb.auto-refill-index-caches-queue-capacity`: How many changes can be + queued at most for automatically refilling the index cache. Default: `131072`. +- `--rocksdb.auto-fill-index-caches-on-startup`: Whether to automatically fill + the in-memory index cache with entries on server startup. Default: `false`. +- `--rocksdb.max-concurrent-index-fill-tasks`: The maximum number of index fill + tasks that can run concurrently on server startup. Default: the number of + cores divided by 8, but at least `1`. + +--- + +<small>Introduced in: v3.9.10, v3.10.5</small> + +- `--rocksdb.auto-refill-index-caches-on-followers`: Control whether automatic + refilling of in-memory caches should happen on followers or only leaders. + The default value is `true`, i.e. refilling happens on followers, too. + +### Cluster supervision options + +<small>Introduced in: v3.9.6, v3.10.2</small> + +The following new options allow you to delay supervision actions for a +configurable amount of time. This is desirable in case DB-Servers are restarted +or fail and come back quickly because it gives the cluster a chance to get in +sync and fully resilient without deploying additional shard replicas and thus +without causing any data imbalance: + +- `--agency.supervision-delay-add-follower`: + The delay in supervision, before an AddFollower job is executed (in seconds). + +- `--agency.supervision-delay-failed-follower`: + The delay in supervision, before a FailedFollower job is executed (in seconds). + +<small>Introduced in: v3.9.7, v3.10.2</small> + +A `--agency.supervision-failed-leader-adds-follower` startup option has been +added with a default of `true` (behavior as before). If you set this option to +`false`, a `FailedLeader` job does not automatically configure a new shard +follower, thereby preventing unnecessary network traffic, CPU load, and I/O load +for the case that the server comes back quickly. If the server has permanently +failed, an `AddFollower` job is created anyway eventually, as governed by the +`--agency.supervision-delay-add-follower` option. + +### RocksDB Bloom filter option + +<small>Introduced in: v3.10.3</small> + +A new `--rocksdb.bloom-filter-bits-per-key` startup option has been added to +configure the number of bits to use per key in a Bloom filter. + +The default value is `10`, which is downwards-compatible to the previously +hard-coded value. + +### Disable user-defined AQL functions + +<small>Introduced in: v3.10.4</small> + +The new `--javascript.user-defined-functions` startup option lets you disable +user-defined AQL functions so that no user-defined JavaScript code of +[UDFs](../../aql/user-defined-functions.md) runs on the server. This can be useful to close off +a potential attack vector in case no user-defined AQL functions are used. +Also see [Server security options](../../operations/security/security-options.md). + +### Option to disable Foxx + +<small>Introduced in: v3.10.5</small> + +A `--foxx.enable` startup option has been added to let you configure whether +access to user-defined Foxx services is possible for the instance. It defaults +to `true`. + +If you set the option to `false`, access to Foxx services is forbidden and is +responded with an HTTP `403 Forbidden` error. Access to the management APIs for +Foxx services are also disabled as if you set `--foxx.api false` manually. + +Access to ArangoDB's built-in web interface, which is also a Foxx service, is +still possible even with the option set to `false`. + +Disabling the access to Foxx can be useful to close off a potential attack +vector in case Foxx is not used. +Also see [Server security options](../../operations/security/security-options.md). + +### RocksDB auto-flushing + +<small>Introduced in: v3.9.10, v3.10.5</small> + +A new feature for automatically flushing RocksDB Write-Ahead Log (WAL) files and +in-memory column family data has been added. + +An auto-flush occurs if the number of live WAL files exceeds a certain threshold. +This ensures that WAL files are moved to the archive when there are a lot of +live WAL files present, for example, after a restart. In this case, RocksDB does +not count any previously existing WAL files when calculating the size of WAL +files and comparing its `max_total_wal_size`. Auto-flushing fixes this problem, +but may prevent WAL files from being moved to the archive quickly. + +You can configure the feature via the following new startup options: +- `--rocksdb.auto-flush-min-live-wal-files`: + The minimum number of live WAL files that triggers an auto-flush. Defaults to `10`. +- `--rocksdb.auto-flush-check-interval`: + The interval (in seconds) in which auto-flushes are executed. Defaults to `3600`. + Note that an auto-flush is only executed if the number of live WAL files + exceeds the configured threshold and the last auto-flush is longer ago than + the configured auto-flush check interval. This avoids too frequent auto-flushes. + +### Configurable whitespace in metrics + +<small>Introduced in: v3.10.6</small> + +The output format of the metrics API slightly changed in v3.10.0. It no longer +had a space between the label and the value for metrics with labels. Example: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"}0 +``` + +The new `--server.ensure-whitespace-metrics-format` startup option lets you +control whether the metric label and value shall be separated by a space for +improved compatibility with some tools. This option is enabled by default. +From v3.10.6 onward, the default output format looks like this: + +``` +arangodb_agency_cache_callback_number{role="SINGLE"} 0 +``` + +### Configurable interval when counting open file descriptors + +<small>Introduced in: v3.10.7</small> + +The `--server.count-descriptors-interval` startup option can be used to specify +the update interval in milliseconds when counting the number of open file +descriptors. + +The default value is `60000`, i.e. the update interval is once per minute. +To disable the counting of open file descriptors, you can set the value to `0`. +If counting is turned off, the `arangodb_file_descriptors_current` metric +reports a value of `0`. + +### Configurable limit of collections per query + +<small>Introduced in: v3.10.7, v3.11.1</small> + +The `--query.max-collections-per-query` startup option allows you to adjust the +previously fixed limit for the maximum number of collections/shards per AQL query. +The default value is `2048`, which is equal to the fixed limit of +collections/shards in older versions. + +### Custom arguments to rclone + +<small>Introduced in: v3.9.11, v3.10.7, v3.11.1</small> + +The `--rclone.argument` startup option can be used to prepend custom arguments +to rclone. For example, you can enable debug logging to a separate file on +startup as follows: + +``` +arangod --rclone.argument "--log-level=DEBUG" --rclone.argument "--log-file=rclone.log" +``` + +### LZ4 compression for values in the in-memory edge cache + +<small>Introduced in: v3.11.2</small> + +LZ4 compression of edge index cache values allows to store more data in main +memory than without compression, so the available memory can be used more +efficiently. The compression is transparent and does not require any change to +queries or applications. +The compression can add CPU overhead for compressing values when storing them +in the cache, and for decompressing values when fetching them from the cache. + +The new startup option `--cache.min-value-size-for-edge-compression` can be +used to set a threshold value size for compression edge index cache payload +values. The default value is `1GB`, which effectively turns compression +off. Setting the option to a lower value (i.e. `100`) turns on the +compression for any payloads whose size exceeds this value. + +The new startup option `--cache.acceleration-factor-for-edge-compression` can +be used to fine-tune the compression. The default value is `1`. +Higher values typically mean less compression but faster speeds. + +The following new metrics can be used to determine the usefulness of +compression: + +- `rocksdb_cache_edge_inserts_effective_entries_size_total`: returns the total + number of bytes of all entries that were ever stored in the in-memory edge cache, + after compression was attempted/applied. This metric is populated regardless + of whether compression is used or not. +- `rocksdb_cache_edge_inserts_uncompressed_entries_size_total`: returns the total + number of bytes of all entries that were ever stored in the in-memory edge + cache, before compression was applied. This metric is populated regardless of + whether compression is used or not. +- `rocksdb_cache_edge_compression_ratio`: returns the effective + compression ratio for all edge cache entries ever stored in the cache. + +Note that these metrics are increased upon every insertion into the edge +cache, but not decreased when data gets evicted from the cache. + +### Limit the number of databases in a deployment + +<small>Introduced in: v3.10.10, v3.11.2</small> + +The `--database.max-databases` startup option allows you to limit the +number of databases that can exist in parallel in a deployment. You can use this +option to limit the resources used by database objects. If the option is used +and there are already as many databases as configured by this option, any +attempt to create an additional database fails with error +`32` (`ERROR_RESOURCE_LIMIT`). Additional databases can then only be created +if other databases are dropped first. The default value for this option is +unlimited, so an arbitrary amount of databases can be created. + +### Cluster-internal connectivity checks + +<small>Introduced in: v3.11.5</small> + +This feature makes Coordinators and DB-Servers in a cluster periodically send +check requests to each other, in order to see if all nodes can connect to +each other. +If a cluster-internal connection to another Coordinator or DB-Server cannot +be established within 10 seconds, a warning is now logged. + +The new `--cluster.connectivity-check-interval` startup option can be used +to control the frequency of the connectivity check, in seconds. +If set to a value greater than zero, the initial connectivity check is +performed approximately 15 seconds after the instance start, and subsequent +connectivity checks are executed with the specified frequency. +If set to `0`, connectivity checks are disabled. + +You can also use the following metrics to monitor and detect temporary or +permanent connectivity issues: +- `arangodb_network_connectivity_failures_coordinators`: Number of failed + connectivity check requests sent by this instance to Coordinators. +- `arangodb_network_connectivity_failures_dbservers_total`: Number of failed + connectivity check requests sent to DB-Servers. + +### Configurable maximum for queued log entries + +<small>Introduced in: v3.10.12, v3.11.5</small> + +The new `--log.max-queued-entries` startup option lets you configure how many +log entries are queued in a background thread. + +Log entries are pushed on a queue for asynchronous writing unless you enable the +`--log.force-direct` startup option. If you use a slow log output (e.g. syslog), +the queue might grow and eventually overflow. + +You can configure the upper bound of the queue with this option. If the queue is +full, log entries are written synchronously until the queue has space again. + +### Monitoring per collection/database/user + +<small>Introduced in: v3.10.13, v3.11.7</small> + +The following metrics have been introduced to track per-shard requests on +DB-Servers: +- `arangodb_collection_leader_reads_total`: The number of read requests on + leaders, per shard, and optionally also split by user. +- `arangodb_collection_leader_writes_total`: The number of write requests on + leaders, per shard, and optionally also split by user. +- `arangodb_collection_requests_bytes_read_total`: The number of bytes read in + read requests on leaders. +- `arangodb_collection_requests_bytes_written_total`: The number of bytes written + in write requests on leaders and followers. + +To opt into these metrics, you can use the new `--server.export-shard-usage-metrics` +startup option. It can be set to one of the following values on DB-Servers: +- `disabled`: No shard usage metrics are recorded nor exported. This is the + default value. +- `enabled-per-shard`: This makes DB-Servers collect per-shard usage metrics. +- `enabled-per-shard-per-user`: This makes DB-Servers collect per-shard + and per-user metrics. This is more granular than `enabled-per-shard` but + can produce a lot of metrics. + +Whenever a shard is accessed in read or write mode by one of the following +operations, the metrics are populated dynamically, either with a per-user +label or not, depending on the above setting. +The metrics are retained in memory on DB-Servers. Removing databases, +collections, or users that are already included in the metrics won't remove +the metrics until the DB-Server is restarted. + +The following operations increase the metrics: +- AQL queries: an AQL query increases the read or write counters exactly + once for each involved shard. For shards that are accessed in read/write + mode, only the write counter is increased. +- Single-document insert, update, replace, and remove operations: for each + such operation, the write counter is increased once for the affected + shard. +- Multi-document insert, update, replace, and remove operations: for each + such operation, the write counter is increased once for each shard + that is affected by the operation. Note that this includes collection + truncate operations. +- Single and multi-document read operations: for each such operation, the + read counter is increased once for each shard that is affected by the + operation. + +The metrics are increased when any of the above operations start, and they +are not decreased should an operation abort or if an operation does not +lead to any actual reads or writes. + +As there can be many of these dynamic metrics based on the number of shards +and/or users in the deployment, these metrics are turned off by default. +When turned on, the metrics are exposed only via the new +`GET /_admin/usage-metrics` endpoint. They are not exposed via the existing +metrics `GET /_admin/metrics` endpoint. + +Note that internal operations, such as internal queries executed for statistics +gathering, internal garbage collection, and TTL index cleanup are not counted in +these metrics. Additionally, all requests that are using the superuser JWT for +authentication and that do not have a specific user set are not counted. + +Enabling these metrics can likely result in a small latency overhead of a few +percent for write operations. The exact overhead depends on +several factors, such as the type of operation (single or multi-document operation), +replication factor, network latency, etc. + +## Miscellaneous changes + +### Write-write conflict improvements + +It is now less likely that writes to the same document in quick succession +result in write-write conflicts for single document operations that use the +Document HTTP API. See +[Incompatible changes in ArangoDB 3.11](incompatible-changes-in-3-11.md#write-write-conflict-improvements) +about the detailed behavior changes. + +### Trace logs for graph traversals and path searches + +Detailed information is now logged if you run AQL graph traversals +or (shortest) path searches with AQL and set the +log level to `TRACE` for the `graphs` log topic. This information is fairly +low-level but can help to understand correctness and performance issues with +traversal queries. There are also some new log messages for the `DEBUG` level. + +To enable tracing for traversals and path searches at startup, you can set +`--log.level graphs=trace`. + +To enable or disable it at runtime, you can call the +[`PUT /_admin/log/level`](../../develop/http-api/monitoring/logs.md#set-the-server-log-levels) +endpoint of the HTTP API and set the log level using a request body like +`{"graphs":"TRACE"}`. + +### Persisted Pregel execution statistics + +Pregel algorithm executions now persist execution statistics to a system +collection. The statistics are kept until you remove them, whereas the +previously existing interfaces only store the information about Pregel jobs +temporarily in memory. + +To access and delete persisted execution statistics, you can use the newly added +`history()` and `removeHistory()` JavaScript API methods of the Pregel module: + +```js +var pregel = require("@arangodb/pregel"); +const execution = pregel.start("sssp", "demograph", { source: "vertices/V" }); +const historyStatus = pregel.history(execution); +pregel.removeHistory(); +``` + +See [Distributed Iterative Graph Processing (Pregel)](../../data-science/pregel/_index.md#get-persisted-execution-statistics) +for details. + +You can also use the newly added HTTP endpoints with the +`/_api/control_pregel/history` route. +See [Pregel HTTP API](../../develop/http-api/pregel.md) for details. + +You can still use the old interfaces (the `pregel.status()` method as well as +the `GET /_api/control_pregel` and `GET /_api/control_pregel/{id}` endpoints). + +### ArangoSearch metric + +The following ArangoSearch metric has been added in version 3.11: + +| Label | Description | +|:------|:------------| +| `arangodb_search_num_primary_docs` | Number of primary documents for current snapshot. | + +### Traffic accounting metrics + +<small>Introduced in: v3.8.9, v3.9.6, v3.10.2</small> + +The following metrics for traffic accounting have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_client_user_connection_statistics_bytes_received` | Bytes received for requests, only user traffic. | +| `arangodb_client_user_connection_statistics_bytes_sent` | Bytes sent for responses, only user traffic. +| `arangodb_http1_connections_total` | Total number of HTTP/1.1 connections accepted. | + +### Configurable `CACHE_OBLIVIOUS` option for jemalloc + +<small>Introduced in: v3.9.7, v3.10.3</small> + +The jemalloc memory allocator supports an option to toggle cache-oblivious large +allocation alignment. It is enabled by default up to v3.10.3, but disabled from +v3.10.4 onwards. Disabling it helps to save 4096 bytes of memory for every +allocation which is at least 16384 bytes large. This is particularly beneficial +for the RocksDB buffer cache. + +You can now configure the option by setting a `CACHE_OBLIVIOUS` environment +variable to the string `true` or `false` before starting ArangoDB. + +See [ArangoDB Server environment variables](../../components/arangodb-server/environment-variables.md) +for details. + +### WAL file tracking metrics + +<small>Introduced in: v3.9.10, v3.10.5</small> + +The following metrics for write-ahead log (WAL) file tracking have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_live_wal_files` | Number of live RocksDB WAL files. | +| `rocksdb_wal_released_tick_flush` | Lower bound sequence number from which WAL files need to be kept because of external flushing needs. | +| `rocksdb_wal_released_tick_replication` | Lower bound sequence number from which WAL files need to be kept because of replication. | +| `arangodb_flush_subscriptions` | Number of currently active flush subscriptions. | + +### Number of replication clients metric + +<small>Introduced in: v3.10.5</small> + +The following metric for the number of replication clients for a server has +been added: + +| Label | Description | +|:------|:------------| +| `arangodb_replication_clients` | Number of currently connected/active replication clients. | + +### Reduced memory usage of in-memory edge indexes + +<small>Introduced in: v3.10.5</small> + +The memory usage of in-memory edge index caches is reduced if most of the edges +in an index refer to a single or mostly the same collection. + +Previously, the full edge IDs, consisting of the referred-to collection +name and the referred-to key of the edge, were stored in full, i.e. the full +values of the edges' `_from` and `_to` attributes. +Now, the first edge inserted into an edge index' in-memory cache determines +the collection name for which all corresponding edges can be stored +prefix-compressed. + +For example, when inserting an edge pointing to `the-collection/abc` into the +empty cache, the collection name `the-collection` is noted for that cache +as a prefix. The edge is stored in-memory as only `/abc`. Further edges +that are inserted into the cache and that point to the same collection are +also stored prefix-compressed. + +The prefix compression is transparent and does not require configuration or +setup. Compression is done separately for each cache, i.e. a separate prefix +can be used for each individual edge index, and separately for the `_from` and +`_to` parts. Lookups from the in-memory edge cache do not return compressed +values but the full-length edge IDs. The compressed values are also used +in-memory only and are not persisted on disk. + +### Sending delay metrics for internal requests + +<small>Introduced in: v3.9.11, v3.10.6</small> + +The following metrics for diagnosing delays in cluster-internal network requests +have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_network_dequeue_duration` | Internal request duration for the dequeue in seconds. | +| `arangodb_network_response_duration` | Internal request duration from fully sent till response received in seconds. | +| `arangodb_network_send_duration` | Internal request send duration in seconds. | +| `arangodb_network_unfinished_sends_total` | Number of internal requests for which sending has not finished. | + +### Peak memory metric for in-memory caches + +<small>Introduced in: v3.10.7</small> + +This new metric stores the peak value of the `rocksdb_cache_allocated` metric: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_peak_allocated` | Global peak memory allocation of ArangoDB in-memory caches. | + +### Number of SST files metric + +<small>Introduced in: v3.10.7, v3.11.1</small> + +This new metric reports the number of RocksDB `.sst` files: + +| Label | Description | +|:------|:------------| +| `rocksdb_total_sst_files` | Total number of RocksDB sst files, aggregated over all levels. | + +### File descriptor metrics + +<small>Introduced in: v3.10.7</small> + +The following system metrics have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_file_descriptors_limit` | System limit for the number of open files for the arangod process. | +| `arangodb_file_descriptors_current` | Number of file descriptors currently opened by the arangod process. | + +### More instant Hot Backups + +<small>Introduced in: v3.10.10, v3.11.3</small> + +Cluster deployments no longer wait for all in-progress transactions to get +committed when a user requests a Hot Backup. The waiting could cause deadlocks +and thus Hot Backups to fail, in particular in the Arango Managed Platform (AMP). Now, Hot Backups are +created immediately and commits have to wait until the backup process is done. + +### In-memory edge cache startup options and metrics + +<small>Introduced in: v3.11.4</small> + +The following startup options have been added: + +- `--cache.max-spare-memory-usage`: the maximum memory usage for spare tables + in the in-memory cache. + +- `--cache.high-water-multiplier`: controls the cache's effective memory usage + limit. The user-defined memory limit (i.e. `--cache.size`) is multiplied with + this value to create the effective memory limit, from which on the cache tries + to free up memory by evicting the oldest entries. The default value is `0.56`, + matching the previously hardcoded 56% for the cache subsystem. + + You can increase the multiplier to make the cache subsystem use more memory, but + this may overcommit memory because the cache memory reclamation procedure is + asynchronous and can run in parallel to other tasks that insert new data. + In case a deployment's memory usage is already close to the maximum, increasing + the multiplier can lead to out-of-memory (OOM) kills. + +The following metrics have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_edge_compressed_inserts_total` | Total number of compressed inserts into the in-memory edge cache. | +| `rocksdb_cache_edge_empty_inserts_total` | Total number of insertions into the in-memory edge cache for non-connected edges. | +| `rocksdb_cache_edge_inserts_total` | Total number of insertions into the in-memory edge cache. | + +### Observability of in-memory cache subsystem + +<small>Introduced in: v3.10.11, v3.11.4</small> + +The following metrics have been added to improve the observability of in-memory +cache subsystem: +- `rocksdb_cache_free_memory_tasks_total`: Total number of free memory tasks + that were scheduled by the in-memory edge cache subsystem. This metric will + be increased whenever the cache subsystem schedules a task to free up memory + in one of the managed in-memory caches. It is expected to see this metric + rising when the cache subsystem hits its global memory budget. +- `rocksdb_cache_free_memory_tasks_duration_total`: Total amount of time spent + inside the free memory tasks of the in-memory cache subsystem. Free memory + tasks are scheduled by the cache subsystem to free up memory in existing cache + hash tables. +- `rocksdb_cache_migrate_tasks_total`: Total number of migrate tasks that were + scheduled by the in-memory edge cache subsystem. This metric will be increased + whenever the cache subsystem schedules a task to migrate an existing cache hash + table to a bigger or smaller size. +- `rocksdb_cache_migrate_tasks_duration_total`: Total amount of time spent inside + the migrate tasks of the in-memory cache subsystem. Migrate tasks are scheduled + by the cache subsystem to migrate existing cache hash tables to a bigger or + smaller table. + +### Detached scheduler threads + +<small>Introduced in: v3.10.13, v3.11.5</small> + +A scheduler thread now has the capability to detach itself from the scheduler +if it observes the need to perform a potentially long running task, like waiting +for a lock. This allows a new scheduler thread to be started and prevents +scenarios where all threads are blocked waiting for a lock, which has previously +led to deadlock situations. + +Threads waiting for more than 1 second on a collection lock will detach +themselves. + +The following startup option has been added: +- `--server.max-number-detached-threads`: The maximum number of detached scheduler + threads. + +The following metric has been added: +- `arangodb_scheduler_num_detached_threads`: The number of worker threads + currently started and detached from the scheduler. + +### Memory usage of connection and request statistics + +<small>Introduced in: v3.10.12, v3.11.6</small> + +The following metrics have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_connection_statistics_memory_usage` | Total memory usage of connection statistics. | +| `arangodb_request_statistics_memory_usage` | Total memory usage of request statistics. | + +If the `--server.statistics` startup option is set to `true`, then some +connection and request statistics are built up in memory for incoming request. +It is expected that the memory usage reported by these metrics remains +relatively constant over time. It may grow only when there are bursts of new +connections. Some memory is pre-allocated at startup for higher efficiency. If the +`--server.statistics` startup option is set to `false`, then no memory will be +allocated for connection and request statistics. + +## Client tools + +### arangodump + +#### Option to not dump Views + +_arangodump_ has a new `--dump-views` startup option to control whether +View definitions shall be included in the backup. The default value is `true`. + +#### Improved dump performance (experimental) + +<small>Introduced in: v3.10.8, v3.11.2</small> + +_arangodump_ has experimental extended parallelization capabilities +to work not only at the collection level, but also at the shard level. +In combination with the newly added support for the VelocyPack format that +ArangoDB uses internally, database dumps can now be created and restored more +quickly and occupy less disk space. This major performance boost makes dumps and +restores up to several times faster, which is extremely useful when dealing +with large shards. + +- Whether the new parallel dump variant is used is controlled by the newly added + `--use-experimental-dump` startup option (introduced in v3.10.8 and v3.11.2). + The default value is `false`. + +- Optionally, you can make _arangodump_ write multiple output files per + collection/shard (introduced in v3.10.10 and v3.11.2). + The file splitting allows for better parallelization when + writing the results to disk, which in case of non-split files must be serialized. + You can enable it by setting the `--split-files` option to `true`. This option + is disabled by default because dumps created with this option enabled cannot + be restored into previous versions of ArangoDB. + +## Internal changes + +### Upgraded bundled library versions + +The bundled version of the OpenSSL library has been upgraded from 1.1.1 to 3.0.8. + +The bundled version of the zlib library has been upgraded to 1.2.13. + +The bundled version of the fmt library has been upgraded to 9.1.0. + +The bundled version of the immer library has been upgraded to 0.8.0. + +The bundled versions of the abseil-cpp, s2geometry, and wcwidth library have +been updated to more recent versions that don't have a version number. + +For ArangoDB 3.11, the bundled version of rclone is 1.62.2. Check if your +rclone configuration files require changes. + +From version 3.11.10 onward, ArangoDB uses the glibc C standard library +implementation with an LGPL-3.0 license instead of libmusl. Notably, it features +string functions that are better optimized for common CPUs. diff --git a/site/content/arangodb/oem/release-notes/version-3.2/_index.md b/site/content/arangodb/oem/release-notes/version-3.2/_index.md new file mode 100644 index 0000000000..eeb7e37945 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.2/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.2 +menuTitle: Version 3.2 +weight: 97 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.2/incompatible-changes-in-3-2.md b/site/content/arangodb/oem/release-notes/version-3.2/incompatible-changes-in-3-2.md new file mode 100644 index 0000000000..c5ca53d863 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.2/incompatible-changes-in-3-2.md @@ -0,0 +1,139 @@ +--- +title: Incompatible changes in ArangoDB 3.2 +menuTitle: Incompatible changes in 3.2 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## AQL + +- AQL breaking change in cluster: + The SHORTEST_PATH statement using edge-collection names instead + of a graph name now requires to explicitly name the vertex-collection names + within the AQL query in the cluster. It can be done by adding `WITH <name>` + at the beginning of the query. + + Example: + ``` + FOR v,e IN OUTBOUND SHORTEST_PATH @start TO @target edges [...] + ``` + + Now has to be: + + ``` + WITH vertices + FOR v,e IN OUTBOUND SHORTEST_PATH @start TO @target edges [...] + ``` + + This change is due to avoid dead-lock situations in clustered case. + An error stating the above is included. + +## REST API + +- Removed undocumented internal HTTP API: + - PUT /_api/edges + + The documented GET /_api/edges and the undocumented POST /_api/edges remains unmodified. + +- change undocumented behavior in case of invalid revision ids in + `If-Match` and `If-None-Match` headers from returning HTTP status code 400 (bad request) + to returning HTTP status code 412 (precondition failed). + +- the REST API for fetching the list of currently running AQL queries and the REST API + for fetching the list of slow AQL queries now return an extra *bindVars* attribute which + contains the bind parameters used by the queries. + + This affects the return values of the following API endpoints: + - GET /_api/query/current + - GET /_api/query/slow + +- The REST API for retrieving indexes (GET /_api/index) now returns the *deduplicate* + attribute for each index + +- The REST API for creating indexes (POST /_api/index) now accepts the optional *deduplicate* + attribute + +- The REST API for executing a server-side transaction (POST /_api/transaction) now accepts the optional attributes: `maxTransactionSize`, `intermediateCommitCount`, `intermediateCommitSize` + +- The REST API for creating a cursor (POST /_api/cursor) now accepts the optional attributes: `failOnWarning`, `maxTransactionSize`, `maxWarningCount`, `intermediateCommitCount`, `satelliteSyncWait`, `intermediateCommitSize`. `skipInaccessibleCollections` + +## JavaScript API + +- change undocumented behavior in case of invalid revision ids in + JavaScript document operations from returning error code 1239 ("illegal document revision") + to returning error code 1200 ("conflict"). + +- the `collection.getIndexes()` function now returns the *deduplicate* attribute for each index + +- the `collection.ensureIndex()` function now accepts the optional *deduplicate* attribute + +## Foxx + +- JWT tokens issued by the built-in [JWT session storage](../../develop/foxx-microservices/reference/sessions-middleware/session-storages/jwt-storage.md) now correctly specify the `iat` and `exp` values in seconds rather than milliseconds as specified in the JSON Web Token standard. + + This may result in previously expired tokens using milliseconds being incorrectly accepted. For this reason it is recommended to replace the signing `secret` or set the new `maxExp` option to a reasonable value that is smaller than the oldest issued expiration timestamp. + + For example setting `maxExp` to `10**12` would invalidate all incorrectly issued tokens before 9 September 2001 without impairing new tokens until the year 33658 (at which point these tokens are hopefully no longer relevant). + +- ArangoDB running in standalone mode will commit all services in the `javascript.app-path` to the database on startup. This may result in uninstalled services showing up in ArangoDB if they were not properly removed from the filesystem. + +- ArangoDB Coordinators in a cluster now perform a self-healing step during startup to ensure installed services are consistent across all Coordinators. We recommend backing up your services and configuration before upgrading to ArangoDB 3.2, especially if you have made use of the development mode. + +- Services installed before upgrading to 3.2 (including services installed on alpha releases of ArangoDB 3.2) are **NOT** picked up by the Coordinator self-healing watchdog. This can be solved by either upgrading/replacing these services or by using the ["commit" route of the Foxx service management HTTP API](../../develop/http-api/foxx.md#miscellaneous), which commits the exact services installed on a given Coordinator to the cluster. New services will be picked up automatically. + +- The format used by Foxx to store internal service metadata in the database has been simplified and existing documents will be updated to the new format. If you have made any changes to the data stored in the `_apps` system collection, you may wish to export these changes as they will be overwritten. + +- There is now an [official HTTP API for managing services](../../develop/http-api/foxx.md). If you were previously using any of the undocumented APIs or the routes used by the administrative web interface we highly recommend migrating to the new API. The old undocumented HTTP API for managing services is deprecated and will be removed in a future version of ArangoDB. + +- Although changes to the filesystem outside of development mode were already strongly discouraged, this is a reminder that they are no longer supported. All files generated by services (whether by a setup script or during normal operation such as uploads) should either be stored outside the service directory or be considered extremely volatile. + +- Introduced distinction between `arangoUser` and `authorized` in Foxx requests. Cluster internal requests will never have an `arangoUser` but are authorized. In earlier versions of ArangoDB parts of the statistics were not accessible by the Coordinators because the underlying Foxx service couldn't authorize the requests. It now correctly checks the new `req.authorized` property. `req.arangoUser` still works as before. End-users may use this new property as well to easily check if a request is authorized or not regardless of a specific user. + +## Command-line options changed + +- --server.maximal-queue-size is now an absolute maximum. If the queue is + full, then 503 is returned. Setting it to 0 means "no limit". The default + value for this option is now `0`. + +- the default value for `--ssl.protocol` has been changed from `4` (TLSv1) to `5` (TLSv1.2). + +- the startup options `--database.revision-cache-chunk-size` and + `--database.revision-cache-target-size` are now obsolete and do nothing + +- the startup option `--database.index-threads` option is now obsolete + +- the option `--javascript.v8-contexts` is now an absolute maximum. The server + may start less V8 contexts for JavaScript execution at startup. If at some + point the server needs more V8 contexts it may start them dynamically, until + the number of V8 contexts reaches the value of `--javascript.v8-contexts`. + + the minimum number of V8 contexts to create at startup can be configured via + the new startup option `--javascript.v8-contexts-minimum`. + +- added command-line option `--javascript.allow-admin-execute` + + This option can be used to control whether user-defined JavaScript code + is allowed to be executed on server by sending via HTTP to the API endpoint + `/_admin/execute` with an authenticated user account. + The default value is `false`, which disables the execution of user-defined + code. This is also the recommended setting for production. In test environments, + it may be convenient to turn the option on in order to send arbitrary setup + or teardown commands for execution on the server. + + The introduction of this option changes the default behavior of ArangoDB 3.2: + 3.2 now by default disables the execution of JavaScript code via this API, + whereas earlier versions allowed it. To restore the old behavior, it is + necessary to set the option to `true`. + +## Users Management + +- It is no longer supported to access the `_users` collection in any way directly, except through the official `@arangodb/users` module or the `/_api/users` REST API. + +- The access to the `_users` collection from outside of the arangod server process is now forbidden (Through drivers, arangosh or the REST API). Foxx services are still be able to access the `_users` collection for now, but this might change in future minor releases. + +- The internal format of the documents in the `_users` collection has changed from previous versions + +- The `_queues` collection only allows read-only access from outside of the arangod server process. + +- Accessing `_queues` is only supported through the official `@arangodb/queues` module for Foxx apps. diff --git a/site/content/arangodb/oem/release-notes/version-3.2/known-issues-in-3-2.md b/site/content/arangodb/oem/release-notes/version-3.2/known-issues-in-3-2.md new file mode 100644 index 0000000000..9260ca5edd --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.2/known-issues-in-3-2.md @@ -0,0 +1,105 @@ +--- +title: Known Issues in ArangoDB 3.2 +menuTitle: Known Issues in 3.2 +weight: 10 +description: >- + Important issues affecting the 3.2.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## RocksDB storage engine + +The RocksDB storage engine is intentionally missing the following features that +are present in the MMFiles engine: + +- the datafile debugger (arango-dfdb) cannot be used with this storage engine + + RocksDB has its own crash recovery so using the dfdb will not make any sense here. + +- APIs that return collection properties or figures will return slightly different + attributes for the RocksDB engine than for the MMFiles engine. For example, the + attributes `journalSize`, `doCompact`, `indexBuckets` and `isVolatile` are present + in the MMFiles engine but not in the RocksDB engine. The memory usage figures reported + for collections in the RocksDB engine are estimate values, whereas they are + exact for the MMFiles engine. + +- the RocksDB engine does not support some operations which only make sense in the + context of the MMFiles engine. These are: + + - the `rotate` method on collections + - the `flush` method for WAL files + +- the RocksDB storage engine does not support volatile collections + +- transactions are limited in size. Transactions that get too big (in terms of + number of operations involved or the total size of data modified by the transaction) + will be committed automatically. Effectively this means that big user transactions + are split into multiple smaller RocksDB transactions that are committed individually. + The entire user transaction will not necessarily have ACID properties in this case. + + The threshold values for transaction sizes can be configured globally using the + startup options + + - `--rocksdb.intermediate-commit-size`: if the size of all operations in a transaction + reaches this threshold, the transaction is committed automatically and a new transaction + is started. The value is specified in bytes. + + - `--rocksdb.intermediate-commit-count`: if the number of operations in a transaction + reaches this value, the transaction is committed automatically and a new transaction + is started. + + - `--rocksdb.max-transaction-size`: this is an upper limit for the total number of bytes + of all operations in a transaction. If the operations in a transaction consume more + than this threshold value, the transaction will automatically abort with error 32 + ("resource limit exceeded"). + + It is also possible to override these thresholds per transaction. + +The following known issues will be resolved in future releases: + +- the RocksDB engine is not yet performance-optimized and potentially not well configured + +- collections for which a geo index is present will use collection-level write locks + even with the RocksDB engine. Reads from these collections can still be done in parallel + but no writes + +- modifying documents in a collection with a geo index will cause multiple additional + writes to RocksDB for maintaining the index structures + +- the number of documents reported for collections (`db.<collection>.count()`) may be + slightly wrong during transactions if there are parallel transactions ongoing for the + same collection that also modify the number of documents + +- the `any` operation to provide a random document from a collection is supported + by the RocksDB engine but the operation has much higher algorithmic complexity than + in the MMFiles engine. It is therefore discouraged to call it for cases other than manual + inspection of a few documents in a collection + +- AQL queries in the cluster still issue an extra locking HTTP request per shard though + this would not be necessary for the RocksDB engine in most cases + +## Installer + +- Upgrading from 3.1 to 3.2 on Windows requires the user to manually copy the database directory + to the new location and run an upgrade on the database. Please consult the + [Documentation](../../operations/installation/windows.md) + for detailed instructions. + +## System Integration + +- On some Linux systems systemd and system v might report that the arangodb + service is in good condition when it could not be started. In this case the + user needs to check `/var/log/arangodb3` for further information about the + failed startup. + +## macOS + + - Storage engine is not changeable on an existing database. Currently only the + initial selection of the storage engine is supported. + In order to use another storage engine, you have to delete your ArangoDB + application (macOS Application Folder) +   and `/Users/<your_user_name>/Library/ArangoDB` folder. + +## OpenSSL 1.1 + + - ArangoDB v3.2 has been tested with OpenSSL 1.0 only and won't build against 1.1 when compiling on your own. diff --git a/site/content/arangodb/oem/release-notes/version-3.2/whats-new-in-3-2.md b/site/content/arangodb/oem/release-notes/version-3.2/whats-new-in-3-2.md new file mode 100644 index 0000000000..3d592bbc00 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.2/whats-new-in-3-2.md @@ -0,0 +1,388 @@ +--- +title: Features and Improvements in ArangoDB 3.2 +menuTitle: What's New in 3.2 +weight: 5 +description: >- + An alternative storage engine, distributed graph processing, on-disk data + encryption, replicated collections, LDAP support +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.2. ArangoDB 3.2 also contains several bugfixes that are not listed +here. + +## Storage engines + +ArangoDB 3.2 offers two storage engines: + +- the always-existing memory-mapped files storage engine +- a new storage engine based on [RocksDB](https://www.github.com/facebook/rocksdb/) + +### Memory-mapped files storage engine (MMFiles) + +The former storage engine (named MMFiles engine henceforth) persists data in memory-mapped +files. + +Any data changes are done first in the engine's write-ahead log (WAL). The WAL +is replayed after a crash so the engine offers durability and crash-safety. Data +from the WAL is eventually moved to collection-specific datafiles. The files are +always written in an append-only fashion, so data in files is never overwritten. +Obsolete data in files will eventually be purged by background compaction threads. + +Most of this engine's indexes are built in RAM. When a collection is loaded, this requires +rebuilding the indexes in RAM from the data stored on disk. The MMFiles engine has +collection-level locking. + +This storage engine is a good choice when data (including the indexes) can fit in the +server's available RAM. If the size of data plus the in-memory indexes exceeds the size +of the available RAM, then this engine may try to allocate more memory than available. +This will either make the operating system swap out parts of the data (and cause disk I/O) +or, when no swap space is configured, invoke the operating system's out-of-memory process +killer. + +The locking strategy allows parallel reads and is often good enough in read-mostly +workloads. Writes need exclusive locks on the collections, so they can block other +operations in the same collection. The locking strategy also provides transactional consistency +and isolation. + +### RocksDB storage engine + +The RocksDB storage engine is new in ArangoDB 3.2. It is designed to store datasets +that are bigger than the server's available RAM. It persists all data (including the +indexes) in a RocksDB instance. + +That means any document read or write operations will be answered by RocksDB under the +hood. RocksDB will serve the data from its own in-RAM caches or from disk. +The RocksDB engine has a write-ahead log (WAL) and uses background threads for compaction. +It supports data compression. + +The RocksDB storage engine has document-level locking. Read operations do not block and +are never blocked by other operations. Write operations only block writes on the same +documents/index values. Because multiple writers can operate in parallel on the same +collection, there is the possibility of write-write conflicts. If such write conflict +is detected, one of the write operations is aborted with error 1200 ("conflict"). +Client applications can then either abort the operation or retry, based on the required +consistency semantics. + +### Storage engine selection + +The storage engine to use in an ArangoDB cluster or a single-server instance must be +selected initially. The default storage engine in ArangoDB 3.2 is the MMFiles engine if +no storage engine is selected explicitly. This ensures all users upgrading from earlier +versions can continue with the well-known MMFiles engine. + +To select the storage-engine, there is the configuration option `--server.storage-engine`. +It can be set to either `mmfiles`, `rocksdb` or `auto`. While the first two values will +explicitly select a storage engine, the `auto` option will automatically choose the +storage engine based on which storage engine was previously selected. If no engine was +selected previously, `auto` will select the MMFiles engine. If an engine was previously +selected, the selection will be written to a file `ENGINE` in the server's database +directory and will be read from there at any subsequent server starts. + +Once the storage engine was selected, the selection cannot be changed by adjusting +`--server.storage-engine`. In order to switch to another storage engine, it is required +to re-start the server with another (empty) database directory. In order to use data +created with the other storage engine, it is required to dump the data first with the +old engine and restore it using the new storage engine. This can be achieved via +invoking arangodump and arangorestore. + +Unlike in MySQL, the storage engine selection in ArangoDB is for an entire cluster or +an entire single-server instance. All databases and collections will use the same storage +engine. + +### RocksDB storage engine: supported index types + +The existing indexes in the RocksDB engine are all persistent. The following indexes are +supported there: + +- primary: this type of index is automatically created. It indexes `_id` / `_key` + +- edge: this index is automatically created for edge collections. It indexes + `_from` and `_to` + +- hash, skiplist, persistent: these are user-defined indexes, Despite their names, they are + neither hash nor skiplist indexes. These index types map to the same RocksDB-based + sorted index implementation. The same is true for the "persistent" index. The names + "hash", "skiplist" and "persistent" are only used for compatibility with the MMFiles + engine where these indexes existed in previous and the current version of ArangoDB. + +- geo: user-defined index for proximity searches + +- fulltext: user-defined sorted reverted index on words occurring in documents + +## SatelliteCollections + +With SatelliteCollections, you can define collections to shard to a cluster and +collections to replicate to each machine. The ArangoDB query optimizer knows where +each shard is located and sends the requests to the DB-Servers involved, which then +executes the query, locally. With this approach, network hops during join +operations on sharded collections can be avoided and response times can be close to +that of a single instance. + +[SatelliteCollections](../../develop/satellitecollections.md) +are available in the *Enterprise Edition*. + +## Memory management + +- make arangod start with less V8 JavaScript contexts + + This speeds up the server start and makes arangod use less memory at start. + Whenever a V8 context is needed by a Foxx action or some other JavaScript operation + and there is no usable V8 context, a new context will be created dynamically now. + + Up to `--javascript.v8-contexts` V8 contexts will be created, so this option + will change its meaning. Previously as many V8 contexts as specified by this + option were created at server start, and the number of V8 contexts did not + change at runtime. Now up to this number of V8 contexts will be in use at the + same time, but the actual number of V8 contexts is dynamic. + + The garbage collector thread will automatically delete unused V8 contexts after + a while. The number of spare contexts will go down to as few as configured in + the new option `--javascript.v8-contexts-minimum`. Actually that many V8 contexts + are also created at server start. + + The first few requests in new V8 contexts may take longer than in contexts + that have been there already. Performance may therefore suffer a bit for the + initial requests sent to ArangoDB or when there are only few but performance- + critical situations in which new V8 contexts need to be created. If this is a + concern, it can easily be fixed by setting `--javascript.v8-contexts-minimum` + and `--javascript.v8-contexts` to a relatively high value, which will guarantee + that many number of V8 contexts to be created at startup and kept around even + when unused. + + Waiting for an unused V8 context will now also abort and write a log message + in case no V8 context can be acquired/created after 60 seconds. + +- the number of pending operations in arangod can now be limited to a configurable + number. If this number is exceeded, the server will now respond with HTTP 503 + (service unavailable). The maximum size of pending operations is controlled via + the startup option `--server.maximal-queue-size`. Setting it to 0 means "no limit". + +- the in-memory document revisions cache was removed entirely because it did not + provide the expected benefits. The 3.1 implementation shadowed document data in + RAM, which increased the server's RAM usage but did not speed up document lookups + too much. + + This also obsoletes the startup options `--database.revision-cache-chunk-size` and + `--database.revision-cache-target-size`. + + The MMFiles engine now does not use a document revisions cache but has in-memory + indexes and maps documents to RAM automatically via mmap when documents are + accessed. The RocksDB engine has its own mechanism for caching accessed documents. + +## Communication Layer + +- HTTP responses returned by arangod will now include the extra HTTP header + `x-content-type-options: nosniff` to work around a cross-site scripting bug + in MSIE + +- the default value for `--ssl.protocol` was changed from TLSv1 to TLSv1.2. + When not explicitly set, arangod and all client tools will now use TLSv1.2. + +- the JSON data in all incoming HTTP requests in now validated for duplicate + attribute names. + + Incoming JSON data with duplicate attribute names will now be rejected as + invalid. Previous versions of ArangoDB only validated the uniqueness of + attribute names inside incoming JSON for some API endpoints, but not + consistently for all APIs. + +- Internal JavaScript REST actions will now hide their stack traces to the client + unless in HTTP responses. Instead they will always log to the logfile. + +## JavaScript + +- updated V8 version to 5.7.0.0 + +- change undocumented behavior in case of invalid revision ids in + `If-Match` and `If-None-Match` headers from 400 (BAD) to 412 (PRECONDITION + FAILED). + +- change default string truncation length from 80 characters to 256 characters for + `print`/`printShell` functions in ArangoShell and arangod. This will emit longer + prefixes of string values before truncating them with `...`, which is helpful + for debugging. This change is mostly useful when using the ArangoShell (arangosh). + +- the `@arangodb` module now provides a `time` function which returns the current time + in seconds as a floating point value with microsecond precision. + +## Foxx + +- There is now an [official HTTP API for managing services](../../develop/http-api/foxx.md), + allowing services to be installed, modified, uninstalled and reconfigured without + the administrative web interface. + +- It is now possible to upload a single JavaScript file instead of a zip archive + if your service requires no configuration, additional files or setup. + A minimal manifest will be generated automatically upon installation and the + uploaded file will be used as the service's main entry point. + +## Distributed Graph Processing + +- We added support for executing distributed graph algorithms aka `Pregel`. +- Users can run arbitrary algorithms on an entire graph, including in cluster mode. +- We implemented a number of algorithms for various well-known graph measures: + - Connected Components + - PageRank + - Shortest Paths + - Centrality Measures (Centrality and Betweenness) + - Community Detection (via Label Propagation, Speakers-Listeners Label Propagation or DMID) +- Users can contribute their own algorithms + +## AQL + +### Optimizer improvements + +- Geo indexes are now implicitly and automatically used when using appropriate SORT/FILTER + statements in AQL, without the need to use the somewhat limited special-purpose geo AQL + functions `NEAR` or `WITHIN`. + + Compared to using the special purpose AQL functions this approach has the + advantage that it is more composable, and will also honor any `LIMIT` values + used in the AQL query. + + The special purpose `NEAR` AQL function can now be substituted with the + following AQL (provided there is a geo index present on the `doc.latitude` + and `doc.longitude` attributes): + + ```aql + FOR doc in geoSort + SORT DISTANCE(doc.latitude, doc.longitude, 0, 0) + LIMIT 5 + RETURN doc + ``` + + `WITHIN` can be substituted with the following AQL: + + ```aql + FOR doc in geoFilter + FILTER DISTANCE(doc.latitude, doc.longitude, 0, 0) < 2000 + RETURN doc + ``` + +### Miscellaneous improvements + +- added `REGEX_REPLACE` AQL function + + `REGEX_REPLACE(text, search, replacement, caseInsensitive) → string` + + Replace the pattern *search* with the string *replacement* in the string + *text*, using regular expression matching. + + - **text** (string): the string to search in + - **search** (string): a regular expression search pattern + - **replacement** (string): the string to replace the *search* pattern with + - returns **string** (string): the string *text* with the *search* regex + pattern replaced with the *replacement* string wherever the pattern exists + in *text* + +- added new startup option `--query.fail-on-warning` to make AQL queries + abort instead of continuing with warnings. + + When set to *true*, this will make an AQL query throw an exception and + abort in case a warning occurs. This option should be used in development to catch + errors early. If set to *false*, warnings will not be propagated to exceptions and + will be returned with the query results. The startup option can also be overridden + on a per query-level. + +- the slow query list now contains the values of bind variables used in the + slow queries. Bind variables are also provided for the currently running + queries. This helps debugging slow or blocking queries that use dynamic + collection names via bind parameters. + +- AQL breaking change in cluster: + The SHORTEST_PATH statement using edge collection names instead + of a graph names now requires to explicitly name the vertex collection names + within the AQL query in the cluster. It can be done by adding `WITH <name>` + at the beginning of the query. + + Example: + + ```aql + FOR v,e IN OUTBOUND SHORTEST_PATH @start TO @target edges [...] + ``` + + Now has to be: + + ```aql + WITH vertices + FOR v,e IN OUTBOUND SHORTEST_PATH @start TO @target edges [...] + ``` + + This change is due to avoid deadlock situations in clustered case. + An error stating the above is included. + +## Client tools + +- added data export tool, arangoexport. + + arangoexport can be used to export collections to json, jsonl or xml + and export a graph or collections to xgmml. + +- added "jsonl" as input file type for arangoimp + +- added `--translate` option for arangoimp to translate attribute names from + the input files to attribute names expected by ArangoDB + + The `--translate` option can be specified multiple times (once per translation + to be executed). The following example renames the "id" column from the input + file to "_key", and the "from" column to "_from", and the "to" column to "_to": + + ``` + arangoimp --type csv --file data.csv --translate "id=_key" --translate "from=_from" --translate "to=_to" + ``` + + `--translate` works for CSV and TSV inputs only. + +- added `--threads` option to arangoimp to specify the number of parallel import threads + +- changed default value for client tools option `--server.max-packet-size` from 128 MB + to 256 MB. this allows transferring bigger result sets from the server without the + client tools rejecting them as invalid. + +## Authentication + +- added [LDAP](../../components/arangodb-server/ldap.md) authentication (Enterprise Edition only) + +## Authorization + +- added read only mode for users +- collection level authorization rights + +Read more in the [overview](../../operations/administration/user-management/_index.md). + +## Foxx and authorization + +- the [cookie session transport](../../develop/foxx-microservices/reference/sessions-middleware/session-transports/cookie-transport.md) now supports + all options supported by the [cookie method of the response object](../../develop/foxx-microservices/reference/routers/response.md#cookie). + +- it's now possible to provide your own version of the `graphql-sync` module when using the [GraphQL extensions for Foxx](../../develop/foxx-microservices/reference/related-modules/graphql.md) by passing a copy of the module using the new _graphql_ option. + +- custom API endpoints can now be tagged using the [tag method](../../develop/foxx-microservices/reference/routers/endpoints.md#tag) to generate a cleaner Swagger documentation. + +## Miscellaneous Changes + +- arangod now validates several OS/environment settings on startup and warns if + the settings are non-ideal. It additionally will print out ways to remedy the + options. + + Most of the checks are executed on Linux systems only. + +- added "deduplicate" attribute for array indexes, which controls whether inserting + duplicate index values from the same document into a unique array index will lead to + an error or not: + + ```js + // with deduplicate = true, which is the default value: + db._create("test"); + db.test.ensureIndex({ type: "hash", fields: ["tags[*]"], deduplicate: true }); + db.test.insert({ tags: ["a", "b"] }); + db.test.insert({ tags: ["c", "d", "c"] }); // will work, because deduplicate = true + db.test.insert({ tags: ["a"] }); // will fail + + // with deduplicate = false + db._create("test"); + db.test.ensureIndex({ type: "hash", fields: ["tags[*]"], deduplicate: false }); + db.test.insert({ tags: ["a", "b"] }); + db.test.insert({ tags: ["c", "d", "c"] }); // will not work, because deduplicate = false + db.test.insert({ tags: ["a"] }); // will fail + ``` diff --git a/site/content/arangodb/oem/release-notes/version-3.3/_index.md b/site/content/arangodb/oem/release-notes/version-3.3/_index.md new file mode 100644 index 0000000000..eb13fca056 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.3/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.3 +menuTitle: Version 3.3 +weight: 96 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.3/incompatible-changes-in-3-3.md b/site/content/arangodb/oem/release-notes/version-3.3/incompatible-changes-in-3-3.md new file mode 100644 index 0000000000..d0fccb4a1c --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.3/incompatible-changes-in-3-3.md @@ -0,0 +1,62 @@ +--- +title: Incompatible changes in ArangoDB 3.3 +menuTitle: Incompatible changes in 3.3 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +- AQL: during a traversal if a vertex is not found, arangod will not log an error and + continue with a NULL value, but will instead register a warning at the query and + continue with a NULL value. + + If a non-existing vertex is referenced from a traversal, it is not desirable to log + errors as ArangoDB can store edges pointing to non-existing vertices (which is perfectly + valid if the low-level insert APIs are used). As linking to non-existing vertices + may indicate an issue in/with the data model or the client application, the warning is + registered in the query so client applications have access to it. + +- ArangoDB usernames must not start with the string `:role:`. + +- The startup configuration parameter `--cluster.my-id` does not have any effect in 3.3. + For compatibility reasons, ArangoDB 3.3 will not fail on startup if the option is + still used in the configuration, but it will silently ignore this option. + +- The startup configuration parameter `--cluster.my-local-info` is deprecated now. + Using it will make arangod log a warning on startup. + +- Server startup: the recommended value for the Linux kernel setting in + `/proc/sys/vm/max_map_count` was increased to a value eight times as high as in + 3.2. arangod compares at startup if the effective value of this setting is + presumably too low, and it will issue a warning in this case, recommending to + increase the value. + + This is now more likely to happen than in previous versions, as the recommended + value is now eight times higher than in 3.2. The startup warnings will look like + this (with actual numbers varying): + + ``` + WARNING {memory} maximum number of memory mappings per process is 65530, which seems too low. it is recommended to set it to at least 512000 + ``` + + Please refer to [the Linux kernel documentation](https://www.kernel.org/doc/Documentation/sysctl/vm.txt) + for more information on this setting. This change only affects the Linux version of ArangoDB. + +## Client tools + +- The option `--recycle-ids` has been removed from the arangorestore command. + Using this option could have led to problems on the restore, with potential + id conflicts between the originating server (the source dump server) and the + target server (the restore server). + +- The option `--compat` has been removed from the arangodump command + and the `/_api/replication/dump` REST API endpoint. + In order to create a dump from an ArangoDB 2.8 instance, please use an older + version of the client tools. Older ArangoDB versions are no longer be supported by + the arangodump and arangorestore binaries shipped with 3.3. + +## Miscellaneous + +The minimum supported compiler for compiling ArangoDB from source is now g++ 5.4 +(bumped up from g++ 4.9). This change only affects users that compile ArangoDB on +their own. diff --git a/site/content/arangodb/oem/release-notes/version-3.3/known-issues-in-3-3.md b/site/content/arangodb/oem/release-notes/version-3.3/known-issues-in-3-3.md new file mode 100644 index 0000000000..b69595cc3d --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.3/known-issues-in-3-3.md @@ -0,0 +1,18 @@ +--- +title: Known Issues in ArangoDB 3.3 +menuTitle: Known Issues in 3.3 +weight: 10 +description: >- + Important issues affecting the 3.3.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +| Issue | +|------------| +| **Date Added:** 2018-12-04 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Parallel creation of collections using multiple client connections with the same database user may spuriously fail with "Could not update user due to conflict" warnings when setting user permissions on the new collections. A follow-up effect of this may be that access to the just-created collection is denied. <br> **Affected Versions:** 3.3.x (all) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#5342](https://github.com/arangodb/arangodb/issues/5342) | +| **Date Added:** 2018-11-30 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Wrong suggestion printed in the log on how to optimize an OS setting, if followed, could cause ArangoDB to run into problems as the number of memory mappings will keep growing <br> **Affected Versions:** 3.3.0 to 3.3.19 <br> **Fixed in Versions:** 3.3.20 <br> **Reference:** [https://www.arangodb.com/alerts/tech03/](https://www.arangodb.com/alerts/tech03/) | +| **Date Added:** 2018-11-16 <br> **Component:** Backup/Restore <br> **Deployment Mode:** All <br> **Description:** Users not included in the backup if _--server.authentication = true_ <br> **Affected Versions:** 3.3.0 to 3.3.13 <br> **Fixed in Versions:** 3.3.14 <br> **Reference:** [https://www.arangodb.com/alerts/tech02/](https://www.arangodb.com/alerts/tech02/) | +| **Date Added:** 2018-11-03 <br> **Component:** Security <br> **Deployment Mode:** All <br> **Description:** Unauthorized access to ArangoDB when using LDAP authentication <br> **Affected Versions:** 3.3.0 to 3.3.18 <br> **Fixed in Versions:** 3.3.19 <br> **Reference:** [https://www.arangodb.com/alerts/sec01/](https://www.arangodb.com/alerts/sec01/) | +| **Date Added:** 2018-04-09 <br> **Component:** Storage <br> **Deployment Mode:** Single Instance <br> **Description:** Data corruption could happen under Linux <br> **Affected Versions:** 3.3.0 <br> **Fixed in Versions:** 3.3.1 <br> **Reference:** [https://www.arangodb.com/alerts/tech01/](https://www.arangodb.com/alerts/tech01/) | +| **Date Added:** 2019-02-18 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** There is a clock overflow bug within Facebook's RocksDB storage engine for Windows. The problem manifests under heavy write loads, including long imports. The Windows server will suddenly block all writes for minutes or hours, then begin working again just fine. An immediate workaround is to change the server configuration: <br>`[rocksdb]`<br>`throttle = false` <br> **Affected Versions:** all 3.x versions (Windows only) <br> **Fixed in Versions:** 3.3.23, 3.4.4 <br> **Reference:** [facebook/rocksdb#4983](https://github.com/facebook/rocksdb/issues/4983) | +| **Date Added:** 2019-07-04 <br> **Component:** Config file parsing <br> **Deployment Mode:** All <br> **Description:** Config file parser may produce unexpected values for settings that contain comments and a unit modifier. <br> **Affected Versions:** 3.x <br> **Fixed in Versions:** 3.3.24, 3.4.7 <br> **Reference:** [arangodb/arangodb#9404](https://github.com/arangodb/arangodb/issues/9404) | diff --git a/site/content/arangodb/oem/release-notes/version-3.3/whats-new-in-3-3.md b/site/content/arangodb/oem/release-notes/version-3.3/whats-new-in-3-3.md new file mode 100644 index 0000000000..909174e3ba --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.3/whats-new-in-3-3.md @@ -0,0 +1,308 @@ +--- +title: Features and Improvements in ArangoDB 3.3 +menuTitle: What's New in 3.3 +weight: 5 +description: >- + Replication of clusters to other datacenters, encrypted backups, server-level + replication, asynchronous failover for single servers +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.3. ArangoDB 3.3 also contains several bugfixes that are not listed +here. + +## Datacenter-to-datacenter replication (DC2DC) + +Every company needs a disaster recovery plan for all important systems. +This is true from small units like single processes running in some +container to the largest distributed architectures. For databases in +particular this usually involves a mixture of fault-tolerance, +redundancy, regular backups and emergency plans. The larger a +data store, the more difficult it is to come up with a good strategy. + +Therefore, it is desirable to be able to run a distributed database +in one data-center and replicate all transactions to another +data-center in some way. Often, transaction logs are shipped +over the network to replicate everything in another, identical +system in the other data-center. Some distributed data stores have +built-in support for multiple data-center awareness and can +replicate between data-centers in a fully automatic fashion. + +ArangoDB 3.3 takes an evolutionary step forward by introducing +multi-data-center support, which is asynchronous Datacenter-to-Datacenter Replication. +Our solution is asynchronous and scales +to arbitrary cluster sizes, provided your network link between +the data-centers has enough bandwidth. It is fault-tolerant +without a single point of failure and includes a lot of +metrics for monitoring in a production scenario. + +DC2DC is available in the *Enterprise Edition*. + +## Encrypted backups + +_arangodump_ can now create encrypted backups using AES256 for encryption. +The encryption key can be read from a file or from a generator program. +It works in single server and cluster mode. + +Example for non-encrypted backup (everyone with access to the backup will be +able to read it): + +``` +arangodump --collection "secret" dump +``` + +In order to create an encrypted backup, add the `--encryption.keyfile` +option when invoking _arangodump_: + +``` +arangodump --collection "secret" dump --encryption.keyfile ~/SECRET-KEY +``` + +The key must be exactly 32 bytes long (required by the AES block cipher). + +Note that _arangodump_ will not store the key anywhere. It is the responsibility +of the user to find a safe place for the key. However, _arangodump_ will store +the used encryption method in a file named `ENCRYPTION` in the dump directory. +That way _arangorestore_ can later find out whether it is dealing with an +encrypted dump or not. + +Trying to restore the encrypted dump without specifying the key will fail: + +``` +arangorestore --collection "secret-collection" dump --create-collection true +``` + +arangorestore will complain with: + +``` +the dump data seems to be encrypted with aes-256-ctr, but no key information was specified to decrypt the dump +it is recommended to specify either `--encryption.keyfile` or `--encryption.key-generator` when invoking arangorestore with an encrypted dump +``` + +It is required to use the exact same key when restoring the data. Again this is +done by providing the `--encryption.keyfile` parameter: + +``` +arangorestore --collection "secret-collection" dump --create-collection true --encryption.keyfile ~/SECRET-KEY +``` + +Using a different key will lead to the backup being non-recoverable. + +Note that encrypted backups can be used together with the already existing +RocksDB encryption-at-rest feature, but they can also be used for the MMFiles +engine, which does not have encryption-at-rest. + +[Encrypted backups](../../components/tools/arangodump/examples.md#encryption) are available +in the *Enterprise Edition*. + +## Server-level replication + +ArangoDB supports asynchronous replication functionality since version 1.4, but +replicating from a master server with multiple databases required manual setup +on the slave for each individual database to replicate. When a new database was +created on the master, one needed to take action on the slave to ensure that data +for that database got actually replicated. Replication on the slave also was not +aware of when a database was dropped on the master. + +3.3 adds server-level replication, which will replicate the current and future databases from the master to the +slave automatically after the initial setup. + +In order to set up global replication on a 3.3 slave for all databases of a given +3.3 master, there is now the so-called `globalApplier`. It has the same interface +as the existing `applier`, but it will replicate from all databases of the +master and not just a single one. + +In order to start the replication on the slave and make it replicate all +databases from a given master, use these commands on the slave: + +```js +var replication = require("@arangodb/replication"); + +replication.setupReplicationGlobal({ + endpoint: "tcp://127.0.0.1:8529", + username: "root", + password: "", + autoStart: true +}); +``` + +To check if the applier is running, also use the `globalApplier` object: + +```js +replication.globalApplier.state().state +``` + +The server-level replication requires both the master and slave servers to +ArangoDB version 3.3 or higher. + +## Asynchronous failover + +A resilient setup can now easily be achieved by running a pair of connected servers, +of which one instance becomes the master and the other an asynchronously replicating +slave, with automatic failover between them. + +Two servers are connected via asynchronous replication. One of the servers is +elected leader, and the other one is made a follower automatically. At startup, +the two servers fight for leadership. The follower will automatically start +replication from the master for all available databases, using the server-level +replication introduced in 3.3. + +When the master goes down, this is automatically detected by an Agency +instance, which is also started in this mode. This instance will make the +previous follower stop its replication and make it the new leader. + +The follower will automatically deny all read and write requests from client +applications. Only the replication itself is allowed to access the follower's data +until the follower becomes a new leader. + +When sending a request to read or write data on a follower, the follower will +always respond with `HTTP 503 (Service unavailable)` and provide the address of +the current leader. Client applications and drivers can use this information to +then make a follow-up request to the proper leader: + +``` +HTTP/1.1 503 Service Unavailable +X-Arango-Endpoint: http://[::1]:8531 +.... +``` + +Client applications can also detect who the current leader and the followers +are by calling the `/_api/cluster/endpoints` REST API. This API is accessible +on leaders and followers alike. + +The ArangoDB starter supports starting two servers with asynchronous +replication and failover out of the box. + +The arangojs driver for JavaScript, the Go driver and the Java driver for +ArangoDB support automatic failover in case the currently accessed server endpoint +responds with HTTP 503. + +Blog article: +[Introducing the new ArangoDB Java driver with load balancing and advanced fallback](https://www.arangodb.com/2017/12/introducing-the-new-arangodb-java-driver-load-balancing/) + +## RocksDB throttling + +ArangoDB 3.3 allows write operations to the RocksDB engine be throttled, in +order to prevent longer write stalls. The throttling is adaptive, meaning that it +automatically adapts to the actual write rate. This results in much more stable +response times, which is better for client applications and cluster health +tests, because timeouts caused by write stalls are less likely to occur and +the server thus not mistakenly assumed to be down. + +Blog article: +[RocksDB smoothing for ArangoDB customers](https://www.arangodb.com/2017/11/rocksdb-smoothing-arangodb-customers/) + +## Faster shard creation in cluster + +When using a cluster, one normally wants resilience, so `replicationFactor` +is set to at least `2`. The number of shards is often set to rather high values +when creating collections. + +Creating a collection in the cluster will make the Coordinator store the setup +metadata of the new collection in the Agency first. Subsequently all DB-Servers of the cluster will detect that there is work to do and will begin creating +the shards. This will first happen for the shard leaders. For each shard leader +that finishes with the setup, the synchronous replication with its followers is +then established. That will make sure that every future data modification will not +become effective on the leader only, but also on all the followers. + +In 3.3 this setup protocol has got some shortcuts for the initial shard creation, +which speeds up collection creation by roughly 50 to 60 percent. + +## LDAP authentication + +The LDAP authentication module in the *Enterprise Edition* has been enhanced. +The following options have been added to it: + +- the option `--server.local-authentication` controls whether the local *_users* + collection is also used for looking up users. This is also the default behavior. + If the authentication shall be restricted to just the LDAP directory, the + option can be set to *true*, and arangod will then not make any queries to its + *_users* collection when looking up users. + +- the option `--server.authentication-timeout` controls the expiration time for + cached LDAP user information entries in arangod. + +- basic role support has been added for the LDAP module in the *Enterprise Edition*. + New configuration options for LDAP in 3.3 are: + + - `--ldap.roles-attribute-name` + - `--ldap.roles-transformation` + - `--ldap.roles-search` + - `--ldap.roles-include` + - `--ldap.roles-exclude` + - `--ldap.superuser-role` + + Please refer to [LDAP](../../components/arangodb-server/ldap.md) for a detailed + explanation. + +## Miscellaneous features + +- when creating a collection in the cluster, there is now an optional + parameter `enforceReplicationFactor`: when set, this parameter + enforces that the collection will only be created if there are not + enough DB-Servers available for the desired `replicationFactor`. + +- AQL DISTINCT is not changing the order of previous (sorted) results + + Previously the implementation of AQL distinct stored all encountered values + in a hash table internally. When done, the final results were returned in the + order dictated by the hash table that was used to store the keys. This order + was more or less unpredictable. Though this was documented behavior, it was + inconvenient for end users. + + 3.3 now does not change the sort order of the result anymore when DISTINCT + is used. + +- Several AQL functions have been implemented in C++, which can help save + memory and CPU time for converting the function arguments and results. + The following functions have been ported: + + - LEFT + - RIGHT + - SUBSTRING + - TRIM + - MATCHES + +- The ArangoShell prompt substitution characters have been extended. Now the + following extra substitutions can be used for the arangosh prompt: + + - '%t': current time as timestamp + - '%a': elapsed time since ArangoShell start in seconds + - '%p': duration of last command in seconds + + For example, to show the execution time of the last command executed in arangosh + in the shell's prompt, start arangosh using: + + ``` + arangosh --console.prompt "%E@%d %p> " + ``` + +- There are new startup options for the logging to aid debugging and error reporting: + + - `--log.role`: will show one-letter code of server role (A = Agent, C = Coordinator, ...) + This is especially useful when aggregating logs. + + The existing roles used in logs are: + + - U: undefined/unclear (used at startup) + - S: single server + - C: Coordinator + - P: primary + - A: Agent + + - `--log.line-number true`: this option will now additionally show the name of the C++ + function that triggered the log message (file name and line number were already logged + in previous versions) + + - `--log.thread-name true`: this new option will log the name of the ArangoDB thread that + triggered the log message. Will have meaningful output on Linux only + +- make the ArangoShell (arangosh) refill its collection cache when a yet-unknown collection + is first accessed. This fixes the following problem when working with the shell while + in another shell or by another process a new collection is added: + + ```js + arangosh1> db._collections(); // shell1 lists all collections + arangosh2> db._create("test"); // shell2 now creates a new collection 'test' + arangosh1> db.test.insert({}); // shell1 is not aware of the collection created + // in shell2, so the insert will fail + ``` diff --git a/site/content/arangodb/oem/release-notes/version-3.4/_index.md b/site/content/arangodb/oem/release-notes/version-3.4/_index.md new file mode 100644 index 0000000000..d39577713e --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.4/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.4 +menuTitle: Version 3.4 +weight: 95 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.4/incompatible-changes-in-3-4.md b/site/content/arangodb/oem/release-notes/version-3.4/incompatible-changes-in-3-4.md new file mode 100644 index 0000000000..de077ac962 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.4/incompatible-changes-in-3-4.md @@ -0,0 +1,842 @@ +--- +title: Deprecated features +menuTitle: Incompatible changes in 3.4 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Release packages + +The official ArangoDB release packages for Linux are now built as static executables +linked with the [musl libc](https://www.musl-libc.org/) standard library. For Linux, +there are release packages for the Debian-based family of Linux distributions (.deb), +and packages for RedHat-based distributions (.rpm). There are no specialized binaries +for the individual Linux distributions nor for their individual subversions. + +The release packages are intended to be reasonably portable (see minimum supported +architectures below) and should run on a variety of different Linux distributions and +versions. + +Release packages are provided for Windows and macOS as well. + +## Supported architectures + +The minimum supported architecture for the official release packages of ArangoDB is +now the Westmere architecture. + +All release packages are built with compiler optimizations that require at least +this architecture. The following CPU features are required for running an official +release package (note: these are all included in the Westmere architecture and upwards): + +- SSE2 +- SSE3 +- SSE4.1 +- SSE4.2 +- PCLMUL + +In case the target platform does not conform to these requirements, ArangoDB may +not work correctly. + +The compiled-in architecture optimizations can be retrieved on most platforms by +invoking the *arangod* binary with the `--version` option. The optimization switches +will then show up in the output in the line starting with `optimization-flags`, e.g. + +``` +$ arangod --version +... +optimization-flags: -march=westmere -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -mno-sse4a -mno-avx -mno-fma -mno-bmi2 -mno-avx2 -mno-xop -mno-fma4 -mno-avx512f -mno-avx512vl -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512dq -mno-avx512bw -mno-avx512ifma -mno-avx512vbmi +platform: linux +``` + +Note that to get even more target-specific optimizations, it is possible for end +users to compile ArangoDB on their own with compiler optimizations tailored to the +target environment. + +## Target host requirements + +When the ArangoDB service is started on a Linux host, it will switch to user +`arangodb` and group `arangodb` at some point during the startup process. +This user and group are created during ArangoDB package installation as usual. + +However, if either the group `arangodb` or the user `arangodb` cannot be found in +the target hosts local `/etc/group` or `/etc/passwd` storage (for example, +because system users and groups are stored centrally using NIS, LDAP etc.), then +the underlying group-lookup implementation used by ArangoDB will always consult +the local nscd (name-service cache daemon) for this. Effectively this requires +a running nscd instance on hosts that ArangoDB is installed on and that do store +the operating system users in a place other than the host-local `/etc/group` and +`/etc/passwd`. + +## Storage engine + +In ArangoDB 3.4, the default storage engine for new installations is the RocksDB +engine. This differs to previous versions (3.2 and 3.3), in which the default +storage engine was the MMFiles engine. + +The MMFiles engine can still be explicitly selected as the storage engine for +all new installations. It's only that the "auto" setting for selecting the storage +engine will now use the RocksDB engine instead of MMFiles engine. + +In the following scenarios, the effectively selected storage engine for new +installations will be RocksDB: + +- `--server.storage-engine rocksdb` +- `--server.storage-engine auto` +- `--server.storage-engine` option not specified + +The MMFiles storage engine will be selected for new installations only when +explicitly selected: + +- `--server.storage-engine mmfiles` + +To make users aware of that the RocksDB storage engine was chosen automatically +due to an explicit other storage engine selection, 3.4 will come up with the following +startup warning: + +``` +using default storage engine 'rocksdb', as no storage engine was explicitly selected via the `--server.storage-engine` option. +please note that default storage engine has changed from 'mmfiles' to 'rocksdb' in ArangoDB 3.4 +``` + +On upgrade, any existing ArangoDB installation will keep its previously selected +storage engine. The change of the default storage engine in 3.4 is thus only relevant +for new ArangoDB installations and/or existing cluster setups for which new server +nodes get added later. All server nodes in a cluster setup should use the same +storage engine to work reliably. Using different storage engines in a cluster is +unsupported. + +To validate that the different nodes in a cluster deployment use the same storage +engine throughout the entire cluster, there is now a startup check performed by +each Coordinator. Each Coordinator will contact all DB-Servers and check if the +same engine on the DB-Server is the same as its local storage engine. In case +there is any discrepancy, the Coordinator will abort its startup. + +## Geo indexes + +- The on-disk storage format for indexes of type `geo` has changed for the RocksDB + storage engine. This also affects `geo1` and `geo2` indexes. + + This **requires** users to start the arangod process with the + `--database.auto-upgrade true` option to allow ArangoDB recreating these + indexes using the new on-disk format. + + The on-disk format for geo indexes is incompatible with the on-disk format used + in 3.3 and 3.2, so an in-place downgrade from 3.4 to 3.3 is not supported. + +- Geo indexes will now be reported no longer as _geo1_ or _geo2_ but as type `geo`. + The two previously known geo index types (`geo1`and `geo2`) are **deprecated**. + APIs for creating indexes (`ArangoCollection.ensureIndex`) will continue to support + `geo1`and `geo2`. + +## RocksDB engine data storage format + +Installations that start using ArangoDB 3.4 will use an optimized on-disk format +for storing documents using the RocksDB storage engine. The RocksDB engine will also +a new table format version that was added in a recent version of the RocksDB library +and that is not available in ArangoDB versions before 3.4. + +This format cannot be used with ArangoDB 3.3 or before, meaning it is not possible to +perform an in-place downgrade from a fresh 3.4 install to 3.3 or earlier when using the +RocksDB engine. For more information on how to downgrade, please refer to the +[Downgrading](../../operations/upgrading/downgrading.md) chapter. + +Installations that were originally set up with older versions of ArangoDB (e.g. 3.2 +or 3.3) will continue to use the existing on-disk format for the RocksDB engine +even with ArangoDB 3.4 (unless you install a fresh 3.4 package and restore a backup +of your data on this fresh installation). + +In order to use the new binary format with existing data, it is required to +create a logical dump of the database data, shut down the server, erase the +database directory and restore the data from the logical dump. To minimize +downtime you can alternatively run a second arangod instance in your system, +that replicates the original data; once the replication has reached completion, +you can switch the instances. + +## RocksDB intermediate commits + +Intermediate commits in the rocksdb engine are now only enabled in standalone AQL queries +(not within a JS transaction), standalone truncate as well as for the "import" API. + +The options `intermediateCommitCount` and `intermediateCommitSize` will have no affect +anymore on transactions started via `/_api/transaction`, or `db._executeTransaction()`. + +## RocksDB background sync thread + +The RocksDB storage engine in 3.4 has a background WAL syncing thread that by default +syncs RocksDB's WAL to disk every 100 milliseconds. This may cause additional background +I/Os compared to ArangoDB 3.3, but will distribute the sync calls more evenly over time +than the all-or-nothing file syncs that were performed by previous versions of ArangoDB. + +The syncing interval can be configured by adjusting the configuration option +`--rocksdb.sync-interval`. + +Note: this option is not supported on Windows platforms. Setting the sync interval to +to a value greater than 0 will produce a startup warning on Windows. + +## RocksDB write buffer size + +The total amount of data to build up in all in-memory write buffers (backed by log +files) is now by default restricted to a certain fraction of the available physical +RAM. This helps restricting memory usage for the arangod process, but may have an +effect on the RocksDB storage engine's write performance. + +In ArangoDB 3.3 the governing configuration option `--rocksdb.total-write-buffer-size` +had a default value of `0`, which meant that the memory usage was not limited. ArangoDB +3.4 now changes the default value to about 40% of available physical RAM, and 512MiB +for setups with less than 4GiB of RAM. + +## Threading and request handling + +The processing of incoming requests and the execution of requests by server threads +has changed in 3.4. + +Previous ArangoDB versions had a hard-coded implicit lower bound of 64 running +threads, and up to which they would increase the number of running server threads. +That value could be increased further by adjusting the option `--server.maximal-threads`. +The configuration option `--server.threads` existed, but did not effectively set +or limit the number of running threads. + +In ArangoDB 3.4, the number of threads ArangoDB uses for request handling can now +be strictly bounded by configuration options. + +The number of server threads is now configured by the following startup options: + +- `--server.minimal-threads`: determines the minimum number of request processing + threads the server will start and always keep around +- `--server.maximal-threads`: determines the maximum number of request processing + threads the server will start for request handling. If that number of threads is + already running, arangod will not start further threads for request handling + +The actual number of request processing threads is adjusted dynamically at runtime +and will float between `--server.minimal-threads` and `--server.maximal-threads`. + +## HTTP REST API + +The following incompatible changes were made in context of ArangoDB's HTTP REST +APIs: + +- The following, partly undocumented internal REST APIs have been removed in ArangoDB 3.4: + + - `GET /_admin/test` + - `GET /_admin/clusterCheckPort` + - `GET /_admin/cluster-test` + - `GET /_admin/routing/routes` + - `GET /_admin/statistics/short` + - `GET /_admin/statistics/long` + - `GET /_admin/auth/reload` + +- `GET /_api/index` will now return type `geo` for geo indexes, not type `geo1` + or `geo2` as previous versions did. + + For geo indexes, the index API will not return the attributes `constraint` and + `ignoreNull` anymore. These attributes were initially deprecated in ArangoDB 2.5 + +- `GET /_api/aqlfunction` was migrated to match the general structure of + ArangoDB replies. It now returns an object with a "result" attribute that + contains the list of available AQL user functions: + + ```json + { + "code": 200, + "error": false, + "result": [ + { + "name": "UnitTests::mytest1", + "code": "function () { return 1; }", + "isDeterministic": false + } + ] + } + ``` + + In previous versions, this REST API returned only the list of available + AQL user functions on the top level of the response. + Each AQL user function description now also contains the 'isDeterministic' attribute. + +- if authentication is turned on, requests to databases by users with insufficient + access rights will be answered with HTTP 401 (Forbidden) instead of HTTP 404 (Not found). + +- the REST handler for user permissions at `/_api/user` will now return HTTP 404 + (Not found) when trying to grant or revoke user permissions for a non-existing + collection. + + This affects the HTTP PUT calls to the endpoint `/_api/user/<user>/<database>/<collection>` + for collections that do not exist. + +The following APIs have been added or augmented: + +- additional `stream` attribute in queries HTTP API + + The REST APIs for retrieving the list of currently running and slow queries + at `GET /_api/query/current` and `GET /_api/query/slow` are now returning an + additional attribute `stream` for each query. + + This attribute indicates whether the query was started using a streaming cursor. + +- `POST /_api/document/{collection}` now supports repsert (replace-insert). + + This can be achieved by using the URL parameter `overwrite=true`. When set to + `true`, insertion will not fail in case of a primary key conflict, but turn + into a replace operation. + + When an insert turns into a replace, the previous version of the document can + be retrieved by passing the URL parameter `returnOld=true` + +- `POST /_api/aqlfunction` now includes an "isNewlyCreated" attribute that indicates + if a new function was created or if an existing one was replaced (in addition to the + "code" attribute, which remains 200 for replacement and 201 for creation): + + ```json + { + "code": "201", + "error": false, + "isNewlyCreated": true + } + ``` + +- `DELETE /_api/aqlfunction` now returns the number of deleted functions: + + ```json + { + "code": 200, + "error": false, + "deletedCount": 10 + } + ``` + +- `GET /_admin/status` now returns the attribute `operationMode` in addition to + `mode`. The attribute `writeOpsEnabled` is now also represented by the new + attribute `readOnly`, which is has an inverted value compared to the original + attribute. The old attributes are deprecated in favor of the new ones. + +- `POST /_api/collection` now will process the optional `shardingStrategy` + attribute in the response body in cluster mode. + + This attribute specifies the name of the sharding strategy to use for the + collection. Since ArangoDB 3.4 there are different sharding strategies to + select from when creating a new collection. The selected *shardingStrategy* + value will remain fixed for the collection and cannot be changed afterwards. + This is important to make the collection keep its sharding settings and + always find documents already distributed to shards using the same initial + sharding algorithm. + + The available sharding strategies are: + - `community-compat`: default sharding used by ArangoDB + Community Edition before version 3.4 + - `enterprise-compat`: default sharding used by ArangoDB + Enterprise Edition before version 3.4 + - `enterprise-smart-edge-compat`: default sharding used by smart edge + collections in ArangoDB Enterprise Edition before version 3.4 + - `hash`: default sharding used for new collections starting from version 3.4 + (excluding smart edge collections) + - `enterprise-hash-smart-edge`: default sharding used for new + smart edge collections starting from version 3.4 + + If no sharding strategy is specified, the default will be `hash` for + all collections, and `enterprise-hash-smart-edge` for all smart edge + collections (requires the *Enterprise Edition* of ArangoDB). + Manually overriding the sharding strategy does not yet provide a + benefit, but it may later in case other sharding strategies are added. + + In single-server mode, the *shardingStrategy* attribute is meaningless and + will be ignored. + +- a new API for inspecting the contents of the AQL query results cache has been added + to endpoint `GET /_api/query/cache/entries` + + This API returns the current contents of the AQL query results cache of the + currently selected database. + +- APIs for view management have been added at endpoint `/_api/view`. + +- The REST APIs for modifying graphs at endpoint `/_api/gharial` now support returning + the old revision of vertices / edges after modifying them. The APIs also supports + returning the just-inserted vertex / edge. This is in line with the already existing + single-document functionality provided at endpoint `/_api/document`. + + The old/new revisions can be accessed by passing the URL parameters `returnOld` and + `returnNew` to the following endpoints: + + - `/_api/gharial/<graph>/vertex/<collection>` + - `/_api/gharial/<graph>/edge/<collection>` + + The exception from this is that the HTTP DELETE verb for these APIs does not + support `returnOld` because that would make the existing API incompatible. + +## AQL + +- all AQL date functions in 3.4 may raise an "invalid date value" warning when given a + syntactically invalid date string as an input. The rules for valid date strings have been + made more strict in ArangoDB 3.4. + + In previous versions, passing in a date value with a one-digit hour, minute or second + component worked just fine, and the date was considered valid. + + From ArangoDB 3.4 onwards, using date values with a one-digit hour, minute or second + component will render the date value invalid, and make the underlying date functions + return a value of `null` and issue an "invalid date value" warning. + + The following overview details which values are considered valid and invalid in the + respective ArangoDB versions: + + | Date string | 3.3 | 3.4 | + |-------------------------|-------|-------------| + | `"2019-07-01 05:02:34"` | valid | valid | + | `"2019-7-1 05:02:34"` | valid | valid | + | `"2019-7-1 5:02:34"` | valid | **invalid** | + | `"2019-7-1 05:2:34"` | valid | **invalid** | + | `"2019-7-1 05:02:4"` | valid | **invalid** | + | `"2019-07-01T05:02:34"` | valid | valid | + | `"2019-7-1T05:02:34"` | valid | valid | + | `"2019-7-1T5:02:34"` | valid | **invalid** | + | `"2019-7-1T05:2:34"` | valid | **invalid** | + | `"2019-7-1T05:02:4"` | valid | **invalid** | + +- the AQL functions `CALL` and `APPLY` may now throw the errors 1540 + (`ERROR_QUERY_FUNCTION_NAME_UNKNOWN`) and 1541 (`ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH`) + instead of error 1582 (`ERROR_QUERY_FUNCTION_NOT_FOUND`) in some situations. + +- the existing "fulltext-index-optimizer" optimizer rule has been removed + because its duty is now handled by the new "replace-function-with-index" rule. + +- the behavior of the `fullCount` option for AQL queries has changed so that it + will only take into account `LIMIT` statements on the top level of the query. + + `LIMIT` statements in subqueries will not have any effect on the `fullCount` results + any more. + +- the AQL functions `NEAR`, `WITHIN`, `WITHIN_RECTANGLE` and `FULLTEXT` do not + support accessing collections dynamically anymore. + + The name of the underlying collection and the name of the index attribute to be + used have to specified using either collection name identifiers, string literals + or bind parameters, but must not be specified using query variables. + + For example, the following AQL queries are ok: + + ```aql + FOR doc IN NEAR(myCollection, 2.5, 3) RETURN doc + FOR doc IN NEAR(@@collection, 2.5, 3) RETURN doc + FOR doc IN FULLTEXT("myCollection", "body", "foxx") RETURN doc + FOR doc IN FULLTEXT(@@collection, @attribute, "foxx") RETURN doc + ``` + + Contrary, the following queries will fail to execute with 3.4 because of dynamic + collection/attribute names used in them: + + ```aql + FOR name IN ["col1", "col2"] FOR doc IN NEAR(name, 2.5, 3) RETURN doc + ``` + + ```aql + FOR doc IN collection + FOR match IN FULLTEXT(PARSE_IDENTIFIER(doc).collection, PARSE_IDENTIFIER(doc).key, "foxx") RETURN doc + ``` + +- the AQL warning 1577 ("collection used in expression") will not occur anymore + + It was used in previous versions of ArangoDB when the name of a collection was + used in an expression in an AQL query, e.g. + + ```aql + RETURN c1 + c2 + ``` + + Due to internal changes in AQL this is not detected anymore in 3.4, so this + particular warning will not be raised. + + Additionally, using collections in arbitrary AQL expressions as above is unsupported + in a mixed cluster that is running a 3.3 Coordinator and 3.4 DB-Server(s). The + DB-Server(s) running 3.4 will in this case not be able to use a collection in an + arbitrary expression, and instead throw an error. + +- the undocumented built-in visitor functions for AQL traversals have been removed, + as they were based on JavaScript implementations: + + - `HASATTRIBUTESVISITOR` + - `PROJECTINGVISITOR` + - `IDVISITOR` + - `KEYVISITOR` + - `COUNTINGVISITOR` + + Using any of these functions from inside AQL will now produce an error. + +- in previous versions, the AQL optimizer used two different ways of converting + strings into numbers. The two different ways have been unified into a single + way that behaves like the `TO_NUMBER` AQL function, which is also the documented + behavior. + + The change affects arithmetic operations with strings that contain numbers and + other trailing characters, e.g. + + ``` + expression 3.3 result 3.4 result TO_NUMBER() + 0 + "1a" 0 + 1 = 1 0 + 0 = 0 TO_NUMBER("1a") = 0 + 0 + "1 " 0 + 1 = 1 0 + 1 = 1 TO_NUMBER("1 ") = 1 + 0 + " 1" 0 + 1 = 1 0 + 1 = 1 TO_NUMBER(" 1") = 1 + 0 + "a1" 0 + 0 = 0 0 + 0 = 0 TO_NUMBER("a1") = 0 + ``` + +- the AQL function `DATE_NOW` is now marked as deterministic internally, meaning that + the optimizer may evaluate the function at query compile time and not at query + runtime. This will mean that calling the function repeatedly inside the same query will + now always produce the same result, whereas in previous versions of ArangoDB the + function may have generated different results. + + Each AQL query that is run will still evaluate the result value of the `DATE_NOW` + function independently, but only once at the beginning of the query. This is most + often what is desired anyway, but the change makes `DATE_NOW` useless to measure + time differences inside a single query. + +- the internal AQL function `PASSTHRU` (which simply returns its call argument) + has been changed from being non-deterministic to being deterministic, provided its + call argument is also deterministic. This change should not affect end users, as + `PASSTHRU` is intended to be used for internal testing only. Should end users use + this AQL function in any query and need a wrapper to make query parts non-deterministic, + the `NOOPT` AQL function can stand in as a non-deterministic variant of `PASSTHRU` + +- the AQL query optimizer will by default now create at most 128 different execution + plans per AQL query. In previous versions the maximum number of plans was 192. + + Normally the AQL query optimizer will generate a single execution plan per AQL query, + but there are some cases in which it creates multiple competing plans. More plans + can lead to better optimized queries, however, plan creation has its costs. The + more plans are created and shipped through the optimization pipeline, the more + time will be spent in the optimizer. + To make the optimizer better cope with some edge cases, the maximum number of plans + to create is now strictly enforced and was lowered compared to previous versions of + ArangoDB. + + Note that this default maximum value can be adjusted globally by setting the startup + option `--query.optimizer-max-plans` or on a per-query basis by setting a query's + `maxNumberOfPlans` option. + +- When creating query execution plans for a query, the query optimizer was fetching + the number of documents of the underlying collections in case multiple query + execution plans were generated. The optimizer used these counts as part of its + internal decisions and execution plan costs calculations. + + Fetching the number of documents of a collection can have measurable overhead in a + cluster, so ArangoDB 3.4 now caches the "number of documents" that are referred to + when creating query execution plans. This may save a few roundtrips in case the + same collections are frequently accessed using AQL queries. + + The "number of documents" value was not and is not supposed to be 100% accurate + in this stage, as it is used for rough cost estimates only. It is possible however + that when explaining an execution plan, the "number of documents" estimated for + a collection is using a cached stale value, and that the estimates change slightly + over time even if the underlying collection is not modified. + +- AQL query results that are served from the AQL query results cache can now return + the *fullCount* attribute as part of the query statistics. Alongside the *fullCount* + attribute, other query statistics will be returned. However, these statistics will + reflect figures generated during the initial query execution, so especially a + query's *executionTime* figure may be misleading for a cached query result. + +## Usage of V8 + +The internal usage of the V8 JavaScript engine for non-user actions has been +reduced in ArangoDB 3.4. Several APIs have been rewritten to not depend on V8 +and thus do not require using the V8 engine nor a V8 context for execution +anymore. + +Compared to ArangoDB 3.3, the following parts of ArangoDB can now be used +without the V8 engine: + +- Agency nodes in a cluster +- DB-Server nodes in a cluster +- cluster plan application on DB-Server nodes +- all of AQL (with the exception of user-defined functions) +- the graph modification APIs at endpoint `/_api/gharial` +- background statistics gathering + +Reduced usage of V8 in ArangoDB may allow end users to lower the configured +numbers of V8 contexts to start. In terms of configuration options, these +are: + +- `--javascript.v8-contexts`: the maximum number of V8 contexts to create + (high-water mark) +- `--javascript.v8-contexts-minimum`: the minimum number of V8 contexts to + create at server start and to keep around permanently (low-water mark) + +The default values for these startup options have not been changed in ArangoDB +3.4, but depending on the actual workload, 3.4 ArangoDB instances may need +less V8 contexts than 3.3. + +As mentioned above, Agency and DB-Server nodes in a cluster does not +require V8 for any operation in 3.4, so the V8 engine is turned off entirely on +such nodes, regardless of the number of configured V8 contexts there. + +The V8 engine is still enabled on Coordinator servers in a cluster and on single +server instances. Here the number of started V8 contexts may actually be reduced +in case a lot of the above features are used. + +## Startup option changes + +For arangod, the following startup options have changed: + +- the number of server threads is now configured by the following startup options: + + - `--server.minimal-threads`: determines the minimum number of request processing + threads the server will start + - `--server.maximal-threads`: determines the maximum number of request processing + threads the server will start + + The actual number of request processing threads is adjusted dynamically at runtime + and will float between `--server.minimal-threads` and `--server.maximal-threads`. + +- the default value for the existing startup option `--javascript.gc-interval` + has been increased from every 1000 to every 2000 requests, and the default value + for the option `--javascript.gc-frequency` has been increased from 30 to 60 seconds. + + This will make the V8 garbage collection run less often by default than in previous + versions, reducing CPU load a bit and leaving more V8 contexts available on average. + +- the startup option `--cluster.my-local-info` has been removed in favor of persisted + server UUIDs. + + The option `--cluster.my-local-info` was deprecated since ArangoDB 3.3. + +- the startup option `--database.check-30-revisions` was removed. It was used for + checking the revision ids of documents for having been created with ArangoDB 3.0, + which required a dump & restore migration of the data to 3.1. + + As direct upgrades from ArangoDB 3.0 to 3.4 or from 3.1 to 3.4 are not supported, + this option has been removed in 3.4. + +- the startup option `--server.session-timeout` has been obsoleted. Setting this + option will not have any effect. + +- the option `--replication.automatic-failover` was renamed to `--replication.active-failover` + + Using the old option name will still work in ArangoDB 3.4, but support for the old + option name will be removed in future versions of ArangoDB. + +- the option `--rocksdb.block-align-data-blocks` has been added + + If set to true, data blocks stored by the RocksDB engine are aligned on lesser of page + size and block size, which may waste some memory but may reduce the number of cross-page + I/Os operations. + + The default value for this option is *false*. + + As mentioned above, ArangoDB 3.4 changes the default value of the configuration option + `--rocksdb.total-write-buffer-size` to about 40% of available physical RAM, and 512MiB + for setups with less than 4GiB of RAM. In ArangoDB 3.3 this option had a default value + of `0`, which meant that the memory usage for write buffers was not limited. + +## Permissions + +The behavior of permissions for databases and collections changed: + +The new fallback rule for databases for which no access level is explicitly +specified is now: + +- Choose the higher access level of: + - A wildcard database grant + - A database grant on the `_system` database + +The new fallback rule for collections for which no access level is explicitly +specified is now: + +- Choose the higher access level of: + - Any wildcard access grant in the same database, or on `"*"` + - The access level for the current database + - The access level for the `_system` database + +## SSLv2 + +Support for SSLv2 has been removed from arangod and all client tools. + +Startup will now be aborted when using SSLv2 for a server endpoint, or when connecting +with one of the client tools via an SSLv2 connection. + +SSLv2 has been disabled in the OpenSSL library by default in recent versions +because of security vulnerabilities inherent in this protocol. + +As it is not safe at all to use this protocol, the support for it has also +been stopped in ArangoDB. End users that use SSLv2 for connecting to ArangoDB +should change the protocol from SSLv2 to TLSv12 if possible, by adjusting +the value of the `--ssl.protocol` startup option. + +## Replication + +By default, database-specific and global replication appliers use a slightly +different configuration in 3.4 than in 3.3. In 3.4 the default value for the +configuration option `requireFromPresent` is now `true`, meaning the follower +will abort the replication when it detects gaps in the leader's stream of +events. Such gaps can happen if the leader has pruned WAL log files with +events that have not been fetched by a follower yet, which may happen for +example if the network connectivity between follower and leader is bad. + +Previous versions of ArangoDB 3.3 used a default value of `false` for +`requireFromPresent`, meaning that any such gaps in the replication data +exchange will not cause the replication to stop. 3.4 now stops replication by +default and writes according errors to the log. Replication can automatically +be restarted in this case by setting the `autoResync` replication configuration +option to `true`. + +## Mixed-engine clusters + +Starting a cluster with Coordinators and DB-Servers using different storage +engines is not supported. Doing it anyway will now log an error and abort a +Coordinator's startup. + +Previous versions of ArangoDB did not detect the usage of different storage +engines in a cluster, but the runtime behavior of the cluster was undefined. + +## Client tools + +The client tool _arangoimp_ has been renamed to _arangoimport_ for consistency. + +Release packages will still install _arangoimp_ as a symlink to _arangoimport_, +so user scripts invoking _arangoimp_ do not need to be changed to work with +ArangoDB 3.4. However, user scripts invoking _arangoimp_ should eventually be +changed to use _arangoimport_ instead, as that will be the long-term supported +way of running imports. + +The tools _arangodump_ and _arangorestore_ will now by default work with two +threads when extracting data from a server or loading data back into a server resp. +The number of threads to use can be adjusted for both tools by adjusting the +`--threads` parameter when invoking them. This change is noteworthy because in +previous versions of ArangoDB both tools were single-threaded and only processed +one collection at a time, while starting with ArangoDB 3.4 by default they will +process two collections at a time, with the intended benefit of completing their +work faster. However, this may create higher load on servers than in previous +versions of ArangoDB. If the load produced by _arangodump_ or _arangorestore_ is +higher than desired, please consider setting their `--threads` parameter to a +value of `1` when invoking them. + +In the ArangoShell, the undocumented JavaScript module `@arangodb/actions` has +been removed. This module contained the methods `printRouting` and `printFlatRouting`, +which were used for debugging purposes only. + +In the ArangoShell, the undocumented JavaScript functions `reloadAuth` and `routingCache` +have been removed from the `internal` module. + +## Foxx applications + +The undocumented JavaScript module `@arangodb/database-version` has been +removed, so it cannot be use from Foxx applications anymore The module only +provided the current version of the database, so any client-side invocations +can easily be replaced by using the `db._version()` instead. + +The `ShapedJson` JavaScript object prototype, a remainder from ArangoDB 2.8 +for encapsulating database documents, has been removed in ArangoDB 3.4. + +## Miscellaneous changes + +For the MMFiles engine, the compactor thread(s) were renamed from "Compactor" +to "MMFilesCompactor". + +This change will be visible only on systems which allow assigning names to +threads. + +The following features and APIs are deprecated in ArangoDB 3.4, and will be +removed in future versions of ArangoDB: + +- the JavaScript-based traversal REST API at `/_api/traversal` and the + underlying traversal module `@arangodb/graph/traversal`: + + This API has several limitations (including low result set sizes) and has + effectively been unmaintained since the introduction of native AQL traversal. + + It is recommended to migrate client applications that use the REST API at + `/_api/traversal` to use AQL-based traversal queries instead. + +- the REST API for simple queries at `/_api/simple`: + + The simple queries provided by the `/_api/simple` endpoint are limited in + functionality and will internally resort to AQL queries anyway. It is advised + that client applications also use the equivalent AQL queries instead of + using the simple query API, because that is more flexible and allows greater + control of how the queries are executed. + +- the REST API for querying endpoints at `/_api/endpoint`: + + The API `/_api/endpoint` is deprecated since ArangoDB version 3.1. + For cluster mode there is `/_api/cluster/endpoints` to find all current + Coordinator endpoints. + +- accessing collections via their numeric IDs instead of their names. This mostly + affects the REST APIs at + + - `/_api/collection/<collection-id>` + - `/_api/document/<collection-id>` + - `/_api/simple` + + Note that in ArangoDB 3.4 it is still possible to access collections via + their numeric ID, but the preferred way to access a collections is by its + user-defined name. + +- the REST API for WAL tailing at `/_api/replication/logger-follow`: + + The `logger-follow` WAL tailing API has several limitations. A better API + was introduced at endpoint `/_api/wal/tail` in ArangoDB 3.3. + + Client applications using the old tailing API at `/_api/replication/logger-follow` + should switch to the new API eventually. + +- the result attributes `mode` and `writeOpsEnabled` in the REST API for querying + a server's status at `/_admin/status`: + + `GET /_admin/status` returns the additional attributes `operationMode` and + `readOnly` now, which should be used in favor of the old attributes. + +- creating geo indexes via any APIs with one of the types `geo1` or `geo2`: + + The two previously known geo index types (`geo1`and `geo2`) are deprecated now. + Instead, when creating geo indexes, the type `geo` should be used. + + The types `geo1` and `geo2` will still work in ArangoDB 3.4, but may be removed + in future versions. + +- the persistent index type is marked for removal in 4.0.0 and is thus deprecated. + + This index type was added when there was only the MMFiles storage engine as + kind of a stop gap. We recommend to switch to RocksDB engine, which persists + all index types with no difference between skiplist and persistent indexes. + +- the legacy mode for Foxx applications from ArangoDB 2.8 or earlier. + +- the AQL geo functions `NEAR`, `WITHIN`, `WITHIN_RECTANGLE` and `IS_IN_POLYGON`: + + The special purpose `NEAR` AQL function can be substituted with the + following AQL (provided there is a geo index present on the `doc.latitude` + and `doc.longitude` attributes) since ArangoDB 3.2: + + ```aql + FOR doc in geoSort + SORT DISTANCE(doc.latitude, doc.longitude, 0, 0) + LIMIT 5 + RETURN doc + ``` + + `WITHIN` can be substituted with the following AQL since ArangoDB 3.2: + + ```aql + FOR doc in geoFilter + FILTER DISTANCE(doc.latitude, doc.longitude, 0, 0) < 2000 + RETURN doc + ``` + + Compared to using the special purpose AQL functions this approach has the + advantage that it is more composable, and will also honor any `LIMIT` values + used in the AQL query. + + In ArangoDB 3.4, `NEAR`, `WITHIN`, `WITHIN_RECTANGLE` and `IS_IN_POLYGON` + will still work and automatically be rewritten by the AQL query optimizer + to the above forms. However, AQL queries using the deprecated AQL functions + should eventually be adjusted. + +- using the `arangoimp` binary instead of `arangoimport` + + `arangoimp` has been renamed to `arangoimport` for consistency in ArangoDB + 3.4, and `arangoimp` is just a symbolic link to `arangoimport` now. + `arangoimp` is there for compatibility only, but client scripts should + eventually be migrated to use `arangoimport` instead. + +- the `foxx-manager` executable is deprecated and will be removed in ArangoDB 4. + + Please use [Foxx CLI](../../components/tools/foxx-cli/_index.md) instead. diff --git a/site/content/arangodb/oem/release-notes/version-3.4/known-issues-in-3-4.md b/site/content/arangodb/oem/release-notes/version-3.4/known-issues-in-3-4.md new file mode 100644 index 0000000000..1f408a382b --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.4/known-issues-in-3-4.md @@ -0,0 +1,58 @@ +--- +title: Known Issues in ArangoDB 3.4 +menuTitle: Known Issues in 3.4 +weight: 10 +description: >- + Important issues affecting the 3.4.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** ArangoSearch index consolidation does not work during creation of a link on existing collection which may lead to massive file descriptors consumption <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** 3.6.0 <br> **Reference:** [arangodb/backlog#509](https://github.com/arangodb/backlog/issues/509) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Long-running DML transactions on collections (linked with ArangoSearch view) block "ArangoDB flush thread" making impossible to refresh data "visible" by a view <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.5.0 <br> **Reference:** [arangodb/backlog#510](https://github.com/arangodb/backlog/issues/510) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** RocksDB recovery fails sometimes after renaming a view <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.5.0 <br> **Reference:** [arangodb/backlog#469](https://github.com/arangodb/backlog/issues/469) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using score functions (BM25/TFIDF) in ArangoDB expression is not supported <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.5.0 <br> **Reference:** [arangodb/backlog#316](https://github.com/arangodb/backlog/issues/316) (internal) | +| **Date Added:** 2019-05-16 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** You may experience server slowdowns caused by Views. Removing a collection link from the view configuration mitigates the problem. <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-28 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** For specific input data indexed by ArangoSearch and used via views functionality a crash can occur during lookup (AQL query execution) in the internal index structure. This issue affects only view-related AQL queries with the SEARCH keyword involved. Please upgrade to ArangoDB v3.4.6 (or newer) which contains a fix for the ArangoSearch implementation and reindex views by recreating them (drop and create with the same parameters). <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.4.6 <br> **Reference:** N/A | + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Upgrading from 3.4.4 to 3.4.x under CentOS using `rpm -U` or `yum upgrade` is unable to succeed because of a problem with the package. The arangodb3 service will not be available anymore. Uninstalling with `rpm -e` or `yum remove` may fail or not clean up all of the folders. <br> **Affected Versions:** >= 3.4.4 <br> **Fixed in Versions:** 3.4.8, 3.5.0 (upgrading works from these versions on again) <br> **Reference:** [arangodb/release-qa#50](https://github.com/arangodb/release-qa/issues/50) (internal) | +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Major upgrades such as 3.3.22 to 3.4.5 fail to upgrade the database directory under CentOS. The server log suggests to use the script `/etc/init.d/arangodb` but it is not available under CentOS. Workaround: Add `database.auto-upgrade = true` to `/etc/arangodb3/arangod.conf`, restart the service, remove `database.auto-upgrade = true` from the configuration and restart the service once more. <br> **Affected Versions:** 3.4.x (CentOS only) <br> **Fixed in Versions:** 3.4.8 <br> **Reference:** [arangodb/release-qa#50](https://github.com/arangodb/release-qa/issues/50) (internal) | +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-11-06 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Upgrades from ArangoDB version 3.4.x to 3.5.0 or 3.5.1 don't create the `_analyzers` system collection, preventing creation and use of custom Analyzers.<br>Suggested workaround: Create the missing collection manually in each database of an ArangoDB deployment after upgrade (arangosh example: `db._create("_analyzers", {isSystem: true})`) <br> **Affected Versions:** 3.5.0, 3.5.1 <br> **Fixed in Versions:** 3.5.2 <br> **Reference:** [arangodb/backlog#652](https://github.com/arangodb/backlog/issues/652) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | + +## Other + +| Issue | +|------------| +| **Date Added:** 2018-12-04 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Parallel creation of collections using multiple client connections with the same database user may spuriously fail with "Could not update user due to conflict" warnings when setting user permissions on the new collections. A follow-up effect of this may be that access to the just-created collection is denied. <br> **Affected Versions:** 3.4.0 <br> **Fixed in Versions:** 3.4.1 <br> **Reference:** [arangodb/arangodb#5342](https://github.com/arangodb/arangodb/issues/5342) | +| **Date Added:** 2019-02-18 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** There is a clock overflow bug within Facebook's RocksDB storage engine for Windows. The problem manifests under heavy write loads, including long imports. The Windows server will suddenly block all writes for minutes or hours, then begin working again just fine. An immediate workaround is to change the server configuration: <br>`[rocksdb]`<br>`throttle = false` <br> **Affected Versions:** 3.x.x (Windows only) <br> **Fixed in Versions:** 3.3.23, 3.4.4 <br> **Reference:** [facebook/rocksdb#4983](https://github.com/facebook/rocksdb/issues/4983) | +| **Date Added:** 2019-03-13 <br> **Component:** arangod <br> **Deployment Mode:** Active Failover <br> **Description:** A full resync is triggered after a failover, when the former leader instance is brought back online. A full resync may even occur twice sporadically. <br> **Affected Versions:** all 3.4.x versions <br> **Fixed in Versions:** 3.4.5 <br> **Reference:** [arangodb/planning#3757](https://github.com/arangodb/planning/issues/3757) (internal) | +| **Date Added:** 2019-03-13 <br> **Component:** arangod <br> **Deployment Mode:** Active Failover <br> **Description:** The leader instance may hang on shutdown. This behavior was observed in an otherwise successful failover. <br> **Affected Versions:** all 3.4.x versions <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3756](https://github.com/arangodb/planning/issues/3756) (internal) | +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-29 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The LOGS menu entry in the web interface does not work. <br> **Affected Versions:** 3.4.6 <br> **Fixed in Versions:** 3.4.7 <br> **Reference:** [arangodb/arangodb#9093](https://github.com/arangodb/arangodb/pull/9093) | +| **Date Added:** 2019-06-04 <br> **Component:** Agency <br> **Deployment Mode:** Cluster <br> **Description:** Data loss can occur in the form of collections getting dropped. This may occur for any collection newly created in v3.4.6 clusters. <br> **Affected Versions:** 3.4.6 <br> **Fixed in Versions:** 3.4.6-1 <br> **Reference:** [arangodb.com/alerts/tech05/](https://www.arangodb.com/alerts/tech05/) | +| **Date Added:** 2019-07-04 <br> **Component:** Config file parsing <br> **Deployment Mode:** All <br> **Description:** Config file parser may produce unexpected values for settings that contain comments and a unit modifier. <br> **Affected Versions:** 3.x.x <br> **Fixed in Versions:** 3.3.24, 3.4.7 <br> **Reference:** [arangodb/arangodb#9404](https://github.com/arangodb/arangodb/issues/9404) | +| **Date Added:** 2019-09-14 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The user-provided value to the startup option `http.keep-alive-timeout` is ignored. <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.5.0 <br> **Reference:** N/A | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The DMG package for macOS is not notarized, which prevents the execution of _ArangoDB3-CLI.app_ under macOS 10.15 (Catalina) with error message: "_ArangoDB3-CLI_ can't be opened because Apple cannot check it for malicious software" <br> **Affected Versions:** 3.3.x, 3.4.x <br> **Fixed in Versions:** 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10561](https://github.com/arangodb/arangodb/issues/10561) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** V8-based binaries of the client packages (arangosh, arangoinspect, foxx-manager) have an incorrect default value for `javascript.startup-directory` and will thus not find the required JavaScript folder unless specified by the user. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.0 <br> **Fixed in Versions:** 3.4.9, 3.5.4, 3.6.1 <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The client packages for Windows miss the arangoinspect binary. As a workaround, you can run arangosh with the following options:<br>`arangosh --server.authentication false --server.ask-jwt-secret --javascript.client-module inspector.js …` <br> **Affected Versions:** 3.3.x, 3.4.x, 3.5.x, 3.6.0 <br> **Fixed in Versions:** 3.3.25, 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10835](https://github.com/arangodb/arangodb/pull/10835) | +| **Date Added:** 2020-01-07 <br> **Component:** Foxx <br> **Deployment Mode:** Cluster <br> **Description:** In case of a Foxxmaster failover, jobs in state `'progress'` are not reset to `'pending'` to restart execution. <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10800](https://github.com/arangodb/arangodb/pull/10800) | +| **Date Added:** 2020-05-18 <br> **Component:** all arangod / arangosh based programs & tools <br> **Deployment Mode:** All <br> **Description:** When using the `--config` option to set the configuration file location the ArangoDB C++ binaries check for `<filename>.local` among other paths. If this path happens to be a directory then the expected configuration cannot be read, resulting in an early exit. <br> **Affected Versions:** 3.4.x <br> **Fixed in Versions:** 3.4.11 <br> **Reference:** [arangodb/arangodb#11632](https://github.com/arangodb/arangodb/pull/11632) | +| **Date Added:** 2020-06-19 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** When inserting edges into an edge collection of a SmartGraph, the auto-generated `_rev` values for the ingoing and outgoing part of the edge may differ. This can be confusing when querying the `_rev` values of the edges later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.5, 3.7.1 <br> **Reference:** N/A | diff --git a/site/content/arangodb/oem/release-notes/version-3.4/whats-new-in-3-4.md b/site/content/arangodb/oem/release-notes/version-3.4/whats-new-in-3-4.md new file mode 100644 index 0000000000..981ec834ee --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.4/whats-new-in-3-4.md @@ -0,0 +1,1146 @@ +--- +title: Features and Improvements in ArangoDB 3.4 +menuTitle: What's New in 3.4 +weight: 5 +description: >- + An integrated search engine for full-text and beyond, overhauled geo-spatial + indexing, query result streaming, storage engine changes +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.4. ArangoDB 3.4 also contains several bug fixes that are not listed +here. + +## ArangoSearch + +ArangoSearch is a sophisticated, integrated full-text search solution over +a user-defined set of attributes and collections. It is the first type of +view in ArangoDB. + +- [ArangoSearch tutorial](https://www.arangodb.com/learn/search/tutorial/) +- [ArangoSearch overview](../../index-and-search/arangosearch/_index.md) +- ArangoSearch in AQL: + - [SEARCH operation](../../aql/high-level-operations/search.md) + - [ArangoSearch functions](../../aql/functions/arangosearch.md) + +## New geo index implementation + +### S2 based geo index + +The geo index in ArangoDB has been reimplemented based on [S2 library](http://s2geometry.io/) +functionality. The new geo index allows indexing points, but also indexing of more +complex geographical objects. The new implementation is much faster than the previous one for +the RocksDB engine. + +Additionally, several AQL functions have been added to facilitate working with +geographical data: `GEO_POINT`, `GEO_MULTIPOINT`, `GEO_LINESTRING`, `GEO_MULTILINESTRING`, +`GEO_POLYGON` and `GEO_MULTIPOLYGON`. These functions will produce GeoJSON objects. + +Additionally there are new geo AQL functions `GEO_CONTAINS`, `GEO_INTERSECTS` and `GEO_EQUALS` +for querying and comparing GeoJSON objects. + +### AQL Editor GeoJSON Support + +As a feature on top, the web ui embedded AQL editor now supports also displaying all +GeoJSON supported data. + +## RocksDB storage engine + +### RocksDB as default storage engine + +The default storage engine in ArangoDB 3.4 is now the RocksDB engine. + +Previous versions of ArangoDB used MMFiles as the default storage engine. This +change will have an effect for new ArangoDB installations only, and only if no +storage engine is selected explicitly or the storage engine selected is "auto". +In this case, a new installation will default to the RocksDB storage engine. + +Existing ArangoDB installations upgraded to 3.4 from previous versions will +continue to use their previously selected storage engine. + +### Optimized binary storage format + +The RocksDB storage engine in ArangoDB 3.4 now also uses an optimized binary +format for storing documents. This format allows inserting new documents in +an order that RocksDB prefers. Using the new format will reduce the number +of compactions that RocksDB needs to do for the ArangoDB documents stored, +allowing for better long-term insertion performance. + +The new binary format will **only be used for new installations** that start with +ArangoDB 3.4. Existing installations upgraded from previous versions will +continue to use the previous binary format. + +Note that there is no need to use the new binary format for installations upgraded +from 3.3, as the old binary format will continue to work as before. +In order to use the new binary format with existing data, it is required to +create a logical dump of the database data, shut down the server, erase the +database directory and restore the data from the logical dump. To minimize +downtime you can alternatively run a second arangod instance in your system, +that replicates the original data; once the replication has reached completion, +you can switch the instances. + +### Better control of RocksDB WAL sync interval + +ArangoDB 3.4 also provides a new configuration option `--rocksdb.sync-interval` +to control how frequently ArangoDB will automatically synchronize data in RocksDB's +write-ahead log (WAL) files to disk. Automatic syncs will only be performed for +not-yet synchronized data, and only for operations that have been executed without +the *waitForSync* attribute. + +Automatic synchronization of RocksDB WAL file data is performed by a background +thread in ArangoDB. The default sync interval is 100 milliseconds. This can be +adjusted so syncs happen more or less frequently. + +### Reduced replication catch-up time + +The catch-up time for comparing the contents of two collections (or shards) on two +different hosts via the incremental replication protocol has been reduced when using +the RocksDB storage engine. + +### Improved RocksDB geo index performance + +The rewritten geo index implementation 3.4 speeds up the RocksDB-based geo index +functionality by a factor of 3 to 6 for many common cases when compared to the +RocksDB-based geo index in 3.3. + +A notable implementation detail of previous versions of ArangoDB was that accessing +a RocksDB collection with a geo index acquired a collection-level lock. This severely +limited concurrent access to RocksDB collections with geo indexes in previous +versions. This requirement is now gone and no extra locks need to be acquired when +accessing a RocksDB collection with a geo index. + +### Optional caching for documents and primary index values + +The RocksDB engine now provides a new per-collection property `cacheEnabled` which +enables in-memory caching of documents and primary index entries. This can potentially +speed up point-lookups significantly, especially if collection have a subset of frequently +accessed documents. + +The option can be enabled for a collection as follows: + +```js +db.<collection>.properties({ cacheEnabled: true }); +``` + +If the cache is enabled, it will be consulted when reading documents and primary index +entries for the collection. If there is a cache miss and the document or primary index +entry has to be looked up from the RocksDB storage engine, the cache will be populated. + +The per-collection cache utilization for primary index entries can be checked via the +command `db.<collection>.indexes(true)`, which will provide the attributes `cacheInUse`, +`cacheSize` and `cacheLifeTimeHitRate`. + +Memory for the documents and primary index entries cache will be provided by ArangoDB's +central cache facility, whose maximal size can be configured by adjusting the value of +the startup option `--cache.size`. + +Please note that caching may adversely affect the performance for collections that are +frequently updated. This is because cache entries need to be invalidated whenever documents +in the collection are updated, replaced or removed. Additionally, enabling caching will +subtract memory from the overall cache, so that less RAM may be available for other +items that use in-memory caching (e.g. edge index entries). It is therefore recommended +to turn on caching only for dedicated collections for which the caching effects have been +confirmed to be positive. + +### Exclusive collection access option + +In contrast to the MMFiles engine, the RocksDB engine does not require collection-level +locks. This is good in general because it allows concurrent access to a RocksDB +collection. + +Reading documents does not require any locks with the RocksDB engine, and writing documents +will acquire per-document locks. This means that different documents can be modified +concurrently by different transactions. + +When concurrent transactions modify the same documents in a RocksDB collection, there +will be a write-write conflict, and one of the transactions will be aborted. This is +incompatible with the MMFiles engine, in which write-write conflicts are impossible due +to its collection-level locks. In the MMFiles engine, a write transaction always has +exclusive access to a collection, and locks out all other writers. + +While making access to a collection exclusive is almost always undesired from the +throughput perspective, it can greatly simplify client application development. Therefore +the RocksDB engine now provides optional exclusive access to collections on a +per-query/per-transaction basis. + +For AQL queries, all data-modification operations now support the `exclusive` option, e.g. + +```aql +FOR doc IN collection + UPDATE doc WITH { updated: true } IN collection OPTIONS { exclusive: true } +``` + +JavaScript-based transactions can specify which collections to lock exclusively in the +`exclusive` sub-attribute of their `collections` attribute: + +```js +db._executeTransaction({ + collections: { + exclusive: [ "collection" ] + }, + ... +}); +``` + +Note that using exclusive access for RocksDB collections will serialize write operations +to RocksDB collections, so it should be used with extreme care. + +### RocksDB library upgrade + +The version of the bundled RocksDB library was upgraded from 5.6 to 5.16. + +The version of the bundled Snappy compression library used by RocksDB was upgraded from +1.1.3 to 1.1.7. + +## Collection and document operations + +### Repsert operation + +The existing functionality for inserting documents got an extra option to turn +an insert into a replace, in case that a document with the specified `_key` value +already exists. This type of operation is called a "Repsert" (Replace-insert). + +Using the new option client applications do not need to check first whether a +given document exists, but can use a single atomic operation to conditionally insert +or replace it. + +Here is an example of control flow that was previously necessary to conditionally +insert or replace a document: + +```js +doc = { _key: "someKey", value1: 123, value2: "abc" }; + +// check if the document already exists... +if (!db.collection.exists(doc._key)) { + // ... document did not exist, so insert it + db.collection.insert(doc); +} else { + // ... document did exist, so replace it + db.collection.replace(doc._key, doc); +} +``` + +With ArangoDB 3.4 this can now be simplified to: + +```js +doc = { _key: "someKey", value1: 123, value2: "abc" }; + +// insert the document if it does not exist yet, other replace +db.collection.insert(doc, { overwrite: true }); +``` + +Client applications can also optionally retrieve the old revision of the document +in case the insert turned into a replace operation: + +```js +doc = { _key: "someKey", value1: 123, value2: "abc" }; + +// insert the document if it does not exist yet, other replace +// in case of a replace, previous will be populated, in case of an +// insert, previous will be undefined +previous = db.collection.insert(doc, { overwrite: true, returnOld: true }).old; +``` + +The same functionality is available for the document insert method in the +HTTP REST API. The HTTP endpoint for `POST /_api/document` will now accept the +optional URL parameters `overwrite` and `returnOld`. + +AQL also supports making an INSERT a conditional REPSERT. In contrast to regular +INSERT it supports returning the OLD and the NEW document on disk to i.e. inspect +the revision or the previous content of the document. +AQL INSERT is switched to REPSERT by setting the option `overwrite` for it: + +```aql +INSERT { + _key: "someKey", + value1: 123, + value2: "abc" +} INTO collection OPTIONS { overwrite: true } +RETURN OLD +``` + +Please note that in a cluster setup the Repsert operation requires the collection +to be sharded by `_key`. + +### Graph API extensions + +The REST APIs for modifying graphs at endpoint `/_api/gharial` now support returning +the old revision of vertices / edges after modifying them. The APIs also supports +returning the just-inserted vertex / edge. This is in line with the already existing +single-document functionality provided at endpoint `/_api/document`. + +The old/new revisions can be accessed by passing the URL parameters `returnOld` and +`returnNew` to the following endpoints: + +- `/_api/gharial/<graph>/vertex/<collection>` +- `/_api/gharial/<graph>/edge/<collection>` + +The exception from this is that the HTTP DELETE verb for these APIs does not +support `returnOld` because that would make the existing API incompatible. + +### Additional key generators + +In addition to the existing key generators `traditional` (which is still the +default key generator) and `autoincrement`, ArangoDB 3.4 adds the following key +generators: + +- `padded`: + The `padded` key generator generates keys of a fixed length (16 bytes) in + ascending lexicographical sort order. This is ideal for usage with the RocksDB + engine, which will slightly benefit keys that are inserted in lexicographically + ascending order. The key generator can be used in a single-server or cluster. + +- `uuid`: the `uuid` key generator generates universally unique 128 bit keys, which + are stored in hexadecimal human-readable format. This key generator can be used + in a single-server or cluster to generate "seemingly random" keys. The keys + produced by this key generator are not lexicographically sorted. + +Generators may be chosen with the creation of collections; here an example for +the *padded* key generator: + +```js +db._create("padded", { keyOptions: { type: "padded" } }); + +db.padded.insert({}); +{ + "_id" : "padded/0000000009d0d1c0", + "_key" : "0000000009d0d1c0", + "_rev" : "_XI6VqNK--_" +} + +db.padded.insert({}); +{ + "_id" : "padded/0000000009d0d1c4", + "_key" : "0000000009d0d1c4", + "_rev" : "_XI6VquC--_" +} +``` + +Example for the *uuid* key generator: + +```js +db._create("uuid", { keyOptions: { type: "uuid" } }); + +db.uuid.insert({}); + +{ + "_id" : "uuid/16d5dc96-79d6-4803-b547-5a34ce795099", + "_key" : "16d5dc96-79d6-4803-b547-5a34ce795099", + "_rev" : "_XI6VPc2--_" +} + +db.uuid.insert({}); +{ + "_id" : "uuid/0af83d4a-56d4-4553-a97d-c7ed2644dc09", + "_key" : "0af83d4a-56d4-4553-a97d-c7ed2644dc09", + "_rev" : "_XI6VQgO--_" +} +``` + +### Miscellaneous improvements + +The command `db.<collection>.indexes()` was added as an alias for the already existing +`db.<collection>.getIndexes()` method for retrieving all indexes of a collection. The +alias name is more consistent with the already existing method names for retrieving +all databases and collections. + +## Cluster improvements + +### Load-balancer support + +ArangoDB now supports running multiple Coordinators behind a load balancer that +randomly routes client requests to the different Coordinators. It is not required +anymore that load balancers implement session or connection stickiness on behalf +of ArangoDB. + +In particular, the following ArangoDB APIs were extended to work well with load +balancing: + +- the cursor API at endpoint `/_api/cursor` +- the jobs API at endpoint `/_api/job` +- the tasks API at endpoint `/_api/tasks` +- Pregel APIs at endpoint `/_api/pregel` + +Some of these APIs build up Coordinator-local state in memory when being first +accessed, and allow accessing further data using follow-up requests. This caused +problems in previous versions of ArangoDB, when load balancers routed the follow +up requests to these APIs to different Coordinators that did not have access to +the other Coordinator's in-memory state. + +With ArangoDB 3.4, if such an API is accessed by a follow-up request that refers +to state being created on a different Coordinator, the actually accessed Coordinator +will forward the client request to the correct Coordinator. Client applications +and load balancers do not need to be aware of which Coordinator they had used +for the previous requests, though from a performance point of view accessing the +same Coordinator for a sequence of requests will still be beneficial. + +If a Coordinator forwards a request to a different Coordinator, it will send the +client an extra HTTP header `x-arango-request-forwarded-to` with the id of the +Coordinator it forwarded the request to. Client applications or load balancers +can optionally use that information to make follow-up requests to the "correct" +Coordinator to save the forwarding. + +### Refusal to start mixed-engine clusters + +Starting a cluster with Coordinators and DB-Servers using different storage +engines is not supported. Doing it anyway will now log an error and abort a +Coordinator's startup. + +Previous versions of ArangoDB did not detect the usage of different storage +engines in a cluster, but the runtime behavior of the cluster was undefined. + +### Advertised endpoints + +It is now possible to configure the endpoints advertised by the +Coordinators to clients to be different from the endpoints which are +used for cluster internal communication. This is important for client +drivers which refresh the list of endpoints during the lifetime of the +cluster (which they should do!). In this way one can make the cluster +advertise a load balancer or a separate set of IP addresses for external +access. The new option is called `--cluster.my-advertised-endpoint`. + +### Startup safety checks + +The new option `--cluster.require-persisted-id` can be used to prevent the startup +of a cluster node using the wrong data directory. + +If the option is set to true, then the ArangoDB instance will only start if a +UUID file (containing the instance's cluster-wide ID) is found in the database +directory on startup. Setting this option will make sure the instance is started +using an already existing database directory and not a new one. + +For the first start, the UUID file must either be created manually or the option +must be set to `false` for the initial startup and later be changed to `true`. + +### Coordinator storage engine + +In previous versions of ArangoDB, cluster Coordinator nodes used the storage +engine selected by the database administrator (i.e. MMFiles or RocksDB). +Although all database and document data was forwarded from Coordinators to be +stored on the DB-Servers and not on the Coordinator nodes, the storage +engine used on the Coordinator was checking and initializing its on-disk state +on startup. +Especially because no "real" data was stored by the Coordinator's storage engine, +using a storage engine here did not provide any value but only introduced +unnecessary potential points of failure. + +As of ArangoDB 3.4, cluster Coordinator nodes will now use an internal "cluster" +storage engine, which actually does not store any data. That prevents 3.4 +Coordinators from creating any files or directories inside the database directory +except the meta data files such as `ENGINE`, `LOCK`, `SERVER`, `UUID` and `VERSION`. +And as no files need to be read on Coordinator startup except these mentioned +files, it also reduces the possibility of data corruption on Coordinator nodes. + +### `DBSERVER` role as alias of `PRIMARY` + +When starting a _DB-Server_, the value `DBSERVER` can now be specified (as alias of +`PRIMARY`) in the option `--cluster.my-role`. The value `PRIMARY` is still accepted. + +All REST APIs that currently return "PRIMARY" as _role_, will continue to return +"PRIMARY". + +## AQL + +### AQL query profiling + +AQL queries can now be executed with optional profiling, using ArangoDB 3.4's new +`db._queryProfile()` function. + +This new function is a hybrid of the already existing `db._query()` and `db._explain()` +functions: + +- `db._query()` will execute an AQL query, but not show the execution plan nor + runtime profile information +- `db._explain()` will show the query's execution plan, but not execute the query +- `db._queryProfile()` will run the query, collect the runtime costs of each component + of the query, and finally show the query's execution plan with actual runtime information. + This is very useful for debugging AQL query performance and optimizing queries. + +For more information please refer to the [Query Profiling](../../aql/execution-and-performance/query-profiling.md) +page. + +### Revised cluster-internal AQL protocol + +When running an AQL query in a cluster, the Coordinator has to distribute the +individual parts of the AQL query to the relevant shards that will participate +in the execution of the query. + +Up to including ArangoDB 3.3, the Coordinator has deployed the query parts to the +individual shards one by one. The more shards were involved in a query, the more +cluster-internal requests this required, and the longer the setup took. + +In ArangoDB 3.4 the Coordinator will now only send a single request to each of +the involved DB-Servers (in contrast to one request per shard involved). +This will speed up the setup phase of most AQL queries, which will be noticable for +queries that affect a lot of shards. + +The AQL setup has been changed from a two-step protocol to a single-step protocol, +which additionally reduces the total number of cluster-internal requests necessary +for running an AQL query. + +The internal protocol and APIs have been adjusted so that AQL queries can now get +away with less cluster-internal requests than in 3.3 also after the setup phase. + +Finally, there is now an extra optimization for trivial AQL queries that will only +access a single document by its primary key (see below). + +### AQL functions added + +The following AQL functions have been added in ArangoDB 3.4: + +- `TO_BASE64`: creates the base64-encoded representation of a value +- `TO_HEX`: creates a hex-encoded string representation of a value +- `ENCODE_URI_COMPONENT`: URI-encodes a string value, for later usage in URLs +- `SOUNDEX`: calculates the soundex fingerprint of a string value +- `ASSERT`: aborts a query if a condition is not met +- `WARN`: makes a query produce a warning if a condition is not met +- `IS_KEY`: this function checks if the value passed to it can be used as a document + key, i.e. as the value of the `_key` attribute for a document +- `SORTED`: will return a sorted version of the input array using AQL's internal + comparison order +- `SORTED_UNIQUE`: same as `SORTED`, but additionally removes duplicates +- `COUNT_DISTINCT`: counts the number of distinct / unique items in an array +- `LEVENSHTEIN_DISTANCE`: calculates the Levenshtein distance between two string values +- `REGEX_MATCHES`: finds matches in a string using a regular expression +- `REGEX_SPLIT`: splits a string using a regular expression +- `UUID`: generates a universally unique identifier value +- `TOKENS`: splits a string into tokens using a language-specific text Analyzer +- `VERSION`: returns the server version as a string + +The following AQL functions have been added to make working with geographical +data easier: + +- `GEO_POINT` +- `GEO_MULTIPOINT` +- `GEO_POLYGON` +- `GEO_LINESTRING` +- `GEO_MULTILINESTRING` +- `GEO_CONTAINS` +- `GEO_INTERSECTS` +- `GEO_EQUALS`. + +The first five functions will produce GeoJSON objects from coordinate data. The +latter three functions can be used for querying and comparing GeoJSON objects. + +The following AQL functions can now be used as aggregation functions in a +COLLECT statement: + +- `UNIQUE` +- `SORTED_UNIQUE` +- `COUNT_DISTINCT` + +The following function aliases have been created for existing AQL functions: + +- `CONTAINS_ARRAY` is an alias for `POSITION` +- `KEYS` is an alias for `ATTRIBUTES` + +### Distributed COLLECT + +In the general case, AQL COLLECT operations are expensive to execute in a cluster, +because the DB-Servers need to send all shard-local data to the Coordinator +for a centralized aggregation. + +The AQL query optimizer can push some parts of certain COLLECT operations to the +DB-Servers so they can do a per-shard aggregation. The DB-Servers can +then send only the already aggregated results to the Coordinator for a final aggregation. +For several queries this will reduce the amount of data that has to be transferred +between the DB-Servers servers and the Coordinator by a great extent, and thus +will speed up these queries. Work on this has started with ArangoDB 3.3.5, but +ArangoDB 3.4 allows more cases in which COLLECT operations can partially be pushed to +the DB-Servers. + +In ArangoDB 3.3, the following aggregation functions could make use of a distributed +COLLECT in addition to `COLLECT WITH COUNT INTO` and `RETURN DISTINCT`: + +- `COUNT` +- `SUM` +- `MIN` +- `MAX` + +ArangoDB 3.4 additionally enables distributed COLLECT queries that use the following +aggregation functions: + +- `AVERAGE` +- `VARIANCE` +- `VARIANCE_SAMPLE` +- `STDDEV` +- `STDDEV_SAMPLE` + +### Native AQL function implementations + +All built-in AQL functions now have a native implementation in C++. +Previous versions of ArangoDB had AQL function implementations in both C++ and +in JavaScript. + +The JavaScript implementations of AQL functions were powered by the V8 JavaScript +engine, which first required the conversion of all function input into V8's own +data structures, and a later conversion of the function result data into ArangoDB's +native format. + +As all AQL functions are now exclusively implemented in native C++, no more +conversions have to be performed to invoke any of the built-in AQL functions. +This will considerably speed up the following AQL functions and any AQL expression +that uses any of these functions: + +- `APPLY` +- `CALL` +- `CURRENT_USER` +- `DATE_ADD` +- `DATE_COMPARE` +- `DATE_DAYOFWEEK` +- `DATE_DAYOFYEAR` +- `DATE_DAYS_IN_MONTH` +- `DATE_DAY` +- `DATE_DIFF` +- `DATE_FORMAT` +- `DATE_HOUR` +- `DATE_ISO8601` +- `DATE_ISOWEEK` +- `DATE_LEAPYEAR` +- `DATE_MILLISECOND` +- `DATE_MINUTE` +- `DATE_MONTH` +- `DATE_NOW` +- `DATE_QUARTER` +- `DATE_SECOND` +- `DATE_SUBTRACT` +- `DATE_TIMESTAMP` +- `DATE_YEAR` +- `IS_DATESTRING` +- `IS_IN_POLYGON` +- `LTRIM` +- `RTRIM` +- `FIND_FIRST` +- `FIND_LAST` +- `REVERSE` +- `SPLIT` +- `SUBSTITUTE` +- `SHA512` +- `TRANSLATE` +- `WITHIN_RECTANGLE` + +Additionally, the AQL functions `FULLTEXT`, `NEAR` and `WITHIN` now use the native +implementations even when executed in a cluster. In previous versions of ArangoDB, +these functions had native implementations for single-server setups only, but fell +back to using the JavaScript variants in a cluster environment. + +Apart from saving conversion overhead, another side effect of adding native +implementations for all built-in AQL functions is, that AQL does not require the usage +of V8 anymore, except for user-defined functions. + +If no user-defined functions are used in AQL, end users do not need to put aside +dedicated V8 contexts for executing AQL queries with ArangoDB 3.4, making server +configuration less complex and easier to understand. + +### AQL optimizer query planning improvements + +The AQL query optimizer will by default now create at most 128 different execution +plans per AQL query. In previous versions the maximum number of plans was 192. + +Normally the AQL query optimizer will generate a single execution plan per AQL query, +but there are some cases in which it creates multiple competing plans. More plans +can lead to better optimized queries, however, plan creation has its costs. The +more plans are created and shipped through the optimization pipeline, the more +time will be spent in the optimizer. +To make the optimizer better cope with some edge cases, the maximum number of plans +created is now strictly enforced and was lowered compared to previous versions of +ArangoDB. This helps a specific class of complex queries. + +Note that the default maximum value can be adjusted globally by setting the startup +option `--query.optimizer-max-plans` or on a per-query basis by setting a query's +`maxNumberOfPlans` option. + +### Condition simplification + +The query optimizer rule `simplify-conditions` has been added to simplify certain +expressions inside CalculationNodes, which can speed up runtime evaluation of these +expressions. + +The optimizer rule `fuse-filters` has been added to merge adjacent FILTER conditions +into a single FILTER condition where possible, allowing to save some runtime registers. + +### Single document optimizations + +In a cluster, the cost of setting up a distributed query can be considerable for +trivial AQL queries that will only access a single document, e.g. + +```aql +FOR doc IN collection FILTER doc._key == ... RETURN doc +FOR doc IN collection FILTER doc._key == ... RETURN 1 + +FOR doc IN collection FILTER doc._key == ... REMOVE doc IN collection +FOR doc IN collection FILTER doc._key == ... REMOVE doc._key IN collection +REMOVE... IN collection + +FOR doc IN collection FILTER doc._key == ... UPDATE doc WITH { ... } IN collection +FOR doc IN collection FILTER doc._key == ... UPDATE doc._key WITH { ... } IN collection +UPDATE ... WITH { ... } IN collection + +FOR doc IN collection FILTER doc._key == ... REPLACE doc WITH { ... } IN collection +FOR doc IN collection FILTER doc._key == ... REPLACE doc._key WITH { ... } IN collection +REPLACE ... WITH { ... } IN collection + +INSERT { ... } INTO collection +``` + +All of the above queries will affect at most a single document, identified by its +primary key. The AQL query optimizer can now detect this, and use a specialized +code path for directly carrying out the operation on the participating DB-Server(s). This special code path bypasses the general AQL query cluster setup and +shutdown, which would have prohibitive costs for these kinds of queries. + +In case the optimizer makes use of the special code path, the explain output will +contain a node of the type `SingleRemoteOperationNode`, and the optimizer rules +will contain `optimize-cluster-single-document-operations`. + +The optimization will fire automatically only for queries with the above patterns. +It will only fire when using `_key` to identify a single document, +and will be most effective if `_key` is also used as the collection's shard key. + +### Subquery optimizations + +The AQL query optimizer can now optimize certain subqueries automatically so that +they perform less work. + +The new optimizer rule `optimize-subqueries` will fire in the following situations: + +- in case only a few results are used from a non-modifying subquery, the rule will + automatically add a LIMIT statement into the subquery. + + For example, the unbounded subquery + + ```aql + LET docs = ( + FOR doc IN collection + FILTER ... + RETURN doc + ) + RETURN docs[0] + ``` + + will be turned into a subquery that only produces a single result value: + + ```aql + LET docs = ( + FOR doc IN collection + FILTER ... + LIMIT 1 + RETURN doc + ) + RETURN docs[0] + ``` + +- in case the result returned by a subquery is not used later but only the number + of subquery results, the optimizer will modify the result value of the subquery + so that it will return constant values instead of potentially more expensive + data structures. + + For example, the following subquery returning entire documents + + ```aql + RETURN LENGTH( + FOR doc IN collection + FILTER ... + RETURN doc + ) + ``` + + will be turned into a subquery that returns only simple boolean values: + + ```aql + RETURN LENGTH( + FOR doc IN collection + FILTER ... + RETURN true + ) + ``` + + This saves fetching the document data from disk in first place, and copying it + from the subquery to the outer scope. + There may be more follow-up optimizations. + +### COLLECT INTO ... KEEP optimization + +When using an AQL COLLECT ... INTO without a `KEEP` clause, then the AQL query +optimizer will now automatically detect which sub-attributes of the `INTO` variables +are used later in the query. The optimizer will add automatic `KEEP` clauses to +the COLLECT statement then if possible. + +For example, the query + +```aql +FOR doc1 IN collection1 + FOR doc2 IN collection2 + COLLECT x = doc1.x INTO g + RETURN { x, all: g[*].doc1.y } +``` + +will automatically be turned into + +```aql +FOR doc1 IN collection1 + FOR doc2 IN collection2 + COLLECT x = doc1.x INTO g KEEP doc1 + RETURN { x, all: g[*].doc1.y } +``` + +This prevents variable `doc2` from being temporarily stored in the variable `g`, +which saves processing time and memory, especially for big result sets. + +### Fullcount changes + +The behavior of the `fullCount` option for AQL query cursors was adjusted to conform +to users' demands. The value returned in the `fullCount` result attribute will now +be produced only by the last `LIMIT` statement on the upper most level of the query - +hence `LIMIT` statements in subqueries will not have any effect on the +`fullCount` results any more. + +This is a change to previous versions of ArangoDB, in which the `fullCount` +value was produced by the sequential last `LIMIT` statement in a query, +regardless if the `LIMIT` was on the top level of the query or in a subquery. + +The `fullCount` result value will now also be returned for queries that are served +from the query results cache. + +### Relaxed restrictions for LIMIT values + +The `offset` and `count` values used in an AQL LIMIT clause can now be expressions, as +long as the expressions can be resolved at query compile time. +For example, the following query will now work: + +```aql +FOR doc IN collection + LIMIT 0, CEIL(@percent * @count / 100) + RETURN doc +``` + +Previous versions of ArangoDB required the `offset` and `count` values to be +either number literals or numeric bind parameter values. + +### Improved sparse index support + +The AQL query optimizer can now use sparse indexes in more cases than it was able to +in ArangoDB 3.3. If a sparse index is not used in a query because the query optimizer +cannot prove itself that the index attribute value cannot be `null`, it is now often +useful to add an extra filter condition to the query that requires the sparse index' +attribute to be non-null. + +For example, if for the following query there is a sparse index on `value` in any +of the collections, the optimizer cannot prove that `value` can never be `null`: + +```aql +FOR doc1 IN collection1 + FOR doc2 IN collection2 + FILTER doc1.value == doc2.value + RETURN [doc1, doc2] +``` + +By adding an extra filter condition to the query that excludes `null` values explicitly, +the optimizer in 3.4 will now be able to use a sparse index on `value`: + +```aql +FOR doc1 IN collection1 + FOR doc2 IN collection2 + FILTER doc1.value == doc2.value + FILTER doc2.value != null + RETURN [doc1, doc2] +``` + +The optimizer in 3.3 was not able to detect this, and refused to use sparse indexes +for such queries. + +### Query results cache + +The AQL query results cache in ArangoDB 3.4 has got additional parameters to +control which queries should be stored in the cache. + +In addition to the already existing configuration option `--query.cache-entries` +that controls the maximum number of query results cached in each database's +query results cache, there now exist the following extra options: + +- `--query.cache-entries-max-size`: maximum cumulated size of the results stored + in each database's query results cache +- `--query.cache-entry-max-size`: maximum size for an individual cache result +- `--query.cache-include-system-collections`: whether or not results of queries + that involve system collections should be stored in the query results cache + +These options allow more effective control of the amount of memory used by the +query results cache, and can be used to better utilize the cache memory. + +The cache configuration can be changed at runtime using the `properties` function +of the cache. For example, to limit the per-database number of cache entries to +256 MB and to limit the per-database cumulated size of query results to 64 MB, +and the maximum size of each individual cache entry to 1MB, the following call +could be used: + +```js +require("@arangodb/aql/cache").properties({ + maxResults: 256, + maxResultsSize: 64 * 1024 * 1024, + maxEntrySize: 1024 * 1024, + includeSystem: false +}); +``` + +The contents of the query results cache can now also be inspected at runtime using +the cache's new `toArray` function: + +```js +require("@arangodb/aql/cache").toArray(); +``` + +This will show all query results currently stored in the query results cache of +the current database, along with their query strings, sizes, number of results +and original query run times. + +The functionality is also available via HTTP REST APIs. + +### Miscellaneous changes + +When creating query execution plans for a query, the query optimizer was fetching +the number of documents of the underlying collections in case multiple query +execution plans were generated. The optimizer used these counts as part of its +internal decisions and execution plan costs calculations. + +Fetching the number of documents of a collection can have measurable overhead in a +cluster, so ArangoDB 3.4 now caches the "number of documents" that are referred to +when creating query execution plans. This may save a few roundtrips in case the +same collections are frequently accessed using AQL queries. + +The "number of documents" value was not and is not supposed to be 100% accurate +in this stage, as it is used for rough cost estimates only. It is possible however +that when explaining an execution plan, the "number of documents" estimated for +a collection is using a cached stale value, and that the estimates change slightly +over time even if the underlying collection is not modified. + +## Streaming AQL Cursors + +AQL query cursors created by client applications traditionally executed an AQL query, +and built up the entire query result in memory. Once the query completed, the results +were sent back to the client application in chunks of configurable size. + +This approach was a good fit for the MMFiles engine with its collection-level locks, +and usually smaller-than-RAM query results. For the RocksDB engine with its document-level +locks and lock-free reads and potentially huge query results, this approach does not always +fit. + +ArangoDB 3.4 allows to optionally execute AQL queries initiated via the cursor API in a +streaming fashion. The query result will then be calculated on the fly, and results are +sent back to the client application as soon as they become available on the server, even +if the query has not yet completed. + +This is especially useful for queries that produce big result sets (e.g. +`FOR doc IN collection RETURN doc` for big collections). Such queries will take very long +to complete without streaming, because the entire query result will be computed first and +stored in memory. Executing such queries in non-streaming fashion may lead to client +applications timing out before receiving the first chunk of data from the server. Additionally, +creating a huge query result set on the server may make it run out of memory, which is also +undesired. Creating a streaming cursor for such queries will solve both problems. + +Please note that streaming cursors will use resources all the time till you +fetch the last chunk of results. + +Depending on the storage engine used this has different consequences: + +- **MMFiles**: While before collection locks would only be held during the creation of the cursor + (the first request) and thus until the result set was well prepared, + they will now be held until the last chunk requested + by the client through the cursor is processed. + + While Multiple reads are possible, one write operation will effectively stop + all other actions from happening on the collections in question. +- **RocksDB**: Reading occurs on the state of the data when the query + was started. Writing however will happen during working with the cursor. + Thus be prepared for possible conflicts if you have other writes on the collections, + and probably overrule them by `ignoreErrors: True`, else the query + will abort by the time the conflict happens. + +Taking into account the above consequences, you shouldn't use streaming +cursors light-minded for data modification queries. + +Please note that the query options `cache`, `count` and `fullCount` will not work with streaming +cursors. Additionally, the query statistics, warnings and profiling data will only be available +when the last result batch for the query is sent. Using a streaming cursor will also prevent +the query results being stored in the AQL query results cache. + +By default, query cursors created via the cursor API are non-streaming in ArangoDB 3.4, +but streaming can be enabled on a per-query basis by setting the `stream` attribute +in the request to the cursor API at endpoint `/_api/cursor`. + +However, streaming cursors are enabled automatically for the following parts of ArangoDB in 3.4: + +- when exporting data from collections using the arangoexport binary +- when using `db.<collection>.toArray()` from the Arango shell + +Please note that AQL queries consumed in a streaming fashion have their own, adjustable +"slow query" threshold. That means the "slow query" threshold can be configured separately for +regular queries and streaming queries. + +## Native implementations + +The following internal and user-facing functionality has been ported from +JavaScript-based implementations to C++-based implementations in ArangoDB 3.4: + +- the statistics gathering background thread +- the REST APIs for + - managing user defined AQL functions + - graph management at `/_api/gharial` that also does: + - vertex management + - edge management +- the implementations of all built-in AQL functions +- all other parts of AQL except user-defined functions +- database creation and setup +- all the DB-Server internal maintenance tasks for shard creation, index + creation and the like in the cluster + +By making the listed functionality not use and not depend on the V8 JavaScript +engine, the respective functionality can now be invoked more efficiently in the +server, without requiring the conversion of data between ArangoDB's native format +and V8's internal formats. For the maintenance operations this will lead to +improved stability in the cluster. + +As a consequence, ArangoDB Agency and DB-Server nodes in an ArangoDB 3.4 +cluster will now turn off the V8 JavaScript engine at startup entirely and automatically. +The V8 engine will still be enabled on cluster Coordinators, single servers and +active failover instances. But even the latter instance types will not require as +many V8 contexts as previous versions of ArangoDB. +This should reduce problems with servers running out of available V8 contexts or +using a lot of memory just for keeping V8 contexts around. + +## Foxx + +The functions `uuidv4` and `genRandomBytes` have been added to the `crypto` module. + +The functions `hexSlice`, `hexWrite` have been added to the `Buffer` object. + +The functions `Buffer.from`, `Buffer.of`, `Buffer.alloc` and `Buffer.allocUnsafe` +have been added to the `Buffer` object for improved compatibility with node.js. + +## Security + +### Ownership for cursors, jobs and tasks + +Cursors for AQL query results created by the API at endpoint `/_api/cursor` +are now tied to the user that first created the cursor. + +Follow-up requests to consume or remove data of an already created cursor will +now be denied if attempted by a different user. + +The same mechanism is also in place for the following APIs: + +- jobs created via the endpoint `/_api/job` +- tasks created via the endpoint `/_api/tasks` + +### Dropped support for SSLv2 + +ArangoDB 3.4 will not start when attempting to bind the server to a Secure Sockets +Layer (SSL) v2 endpoint. Additionally, the client tools (arangosh, arangoimport, +arangodump, arangorestore etc.) will refuse to connect to an SSLv2-enabled server. + +SSLv2 can be considered unsafe nowadays and as such has been disabled in the OpenSSL +library by default in recent versions. ArangoDB is following this step. + +Clients that use SSLv2 with ArangoDB should change the protocol from SSLv2 to TLSv12 +if possible, by adjusting the value of the `--ssl.protocol` startup option for the +`arangod` server and all client tools. + +## Distribution Packages + +In addition to the OS-specific packages (eg. _rpm_ for Red Hat / CentOS, _deb_ for +Debian, NSIS installer for Windows etc.) starting from 3.4.0 new `tar.gz` archive packages +are available for Linux and Mac. They correspond to the `.zip` packages for Windows, +which can be used for portable installations, and to easily run different ArangoDB +versions on the same machine (e.g. for testing). + +## Client tools + +### arangosh + +Starting with ArangoDB version 3.4.5, the ArangoShell (_arangosh_) provides the option +`--console.history` for controlling whether the shell's command-line history +should be loaded from and persisted in a file. + +The default value for this option is `true`. Setting it to `false` +will make arangosh not load any command-line history from the history +file, and not store the current session's history when the shell is +exited. The command-line history will then only be available in the +current shell session. + +### arangodump + +_arangodump_ can now dump multiple collections in parallel. This can significantly +reduce the time required to take a backup. + +By default, _arangodump_ will use 2 threads for dumping collections. The number of +threads used by _arangodump_ can be adjusted by using the `--threads` option when +invoking it. + +### arangorestore + +_arangorestore_ can now restore multiple collections in parallel. This can significantly +reduce the time required to recover data from a backup. + +By default, _arangorestore_ will use 2 threads for restoring collections. The number of +threads used by _arangorestore_ can be adjusted by using the `--threads` option when +invoking it. + +### arangoimport + +_arangoimp_ was renamed to _arangoimport_ for consistency. +The 3.4 release packages will still install `arangoimp` as a symlink so user scripts +invoking `arangoimp` do not need to be changed. + +[arangoimport now can pace the data load rate automatically](../../components/tools/arangoimport/details.md#automatic-pacing-with-busy-or-low-throughput-disk-subsystems) +based on the actual rate of +data the server can handle. This is useful in contexts when the server has a limited +I/O bandwidth, which is often the case in cloud environments. Loading data too quickly +may lead to the server exceeding its provisioned I/O operations quickly, which will +make the cloud environment throttle the disk performance and slowing it down drastically. +Using a controlled and adaptive import rate allows preventing this throttling. + +The pacing algorithm is turned on by default, but can be disabled by manually specifying +any value for the `--batch-size` parameter. + +_arangoimport_ also got an extra option `--create-database` so that it can automatically +create the target database should this be desired. Previous versions of _arangoimp_ +provided options for creating the target collection only +(`--create-collection`, `--create-collection-type`). + +Finally, _arangoimport_ got an option `--latency` which can be used to print microsecond +latency statistics on 10 second intervals for import runs. This can be used to get +additional information about the import run performance and performance development. + +## Miscellaneous features + +### Logging without escaping non-printable characters + +The new option `--log.escape` can be used to enable a slightly different log output +format. + +If set to `true` (which is the default value), then the logging will work as in +previous versions of ArangoDB, and the following characters in the log output are +escaped: + +- the carriage return character (hex 0d) +- the newline character (hex 0a) +- the tabstop character (hex 09) +- any other characters with an ordinal value less than hex 20 + +If the `--log.escape` option is set to `false` however, no characters are escaped +when logging them. Characters with an ordinal value less than hex 20 (including +carriage return, newline and tabstop) will not be printed in this mode, but will +be replaced with a space character (hex 20). This is because these characters are +often undesired in logs anyway. +Another positive side effect of turning off the escaping is that it will slightly +reduce the CPU overhead for logging. However, this will only be noticable when the +logging is set to a very verbose level (e.g. log levels debug or trace). + +### Active Failover + +The _Active Failover_ mode is now officially supported for multiple slaves. + +Additionally you can now send read-only requests to followers, so you can +use them for read scaling. To make sure only requests that are intended for +this use-case are served by the follower you need to add a +`X-Arango-Allow-Dirty-Read: true` header to HTTP requests. + +For more information see +[Active Failover Architecture](../../deploy/active-failover/_index.md). diff --git a/site/content/arangodb/oem/release-notes/version-3.5/_index.md b/site/content/arangodb/oem/release-notes/version-3.5/_index.md new file mode 100644 index 0000000000..972cbba748 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.5/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.5 +menuTitle: Version 3.5 +weight: 94 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.5/incompatible-changes-in-3-5.md b/site/content/arangodb/oem/release-notes/version-3.5/incompatible-changes-in-3-5.md new file mode 100644 index 0000000000..1a5a4235d3 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.5/incompatible-changes-in-3-5.md @@ -0,0 +1,163 @@ +--- +title: Incompatible changes in ArangoDB 3.5 +menuTitle: Incompatible changes in 3.5 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## ID values in log messages + +By default, ArangoDB and its client tools now show a 5 digit unique ID value in +any of their log messages, e.g. + +``` +2019-03-25T21:23:19Z [8144] INFO [cf3f4] ArangoDB (version 3.5.0 enterprise [linux]) is ready for business. Have fun!. +``` + +In this message, the `cf3f4` is the message's unique ID value. ArangoDB users can +use this ID to build custom monitoring or alerting based on specific log ID values. + +The presence of these ID values in log messages may confuse custom log message filtering +or routing mechanisms that parse log messages and that rely on the old log message +format. + +This can be fixed adjusting any existing log message parsers and making them aware +of the ID values. The ID values are always 5 byte strings, consisting of the characters +`[0-9a-f]`. ID values are placed directly behind the log level (e.g. `INFO`) for +general log messages that do not contain a log topic, and directly behind the log +topic for messages that contain a topic, e.g. + +``` +2019-03-25T21:23:19Z [8144] INFO [cf3f4] ArangoDB (version 3.5.0 enterprise [linux]) is ready for business. Have fun!. +2019-03-25T21:23:16Z [8144] INFO {authentication} [3844e] Authentication is turned on (system only), authentication for unix sockets is turned on +``` + +Alternatively, the log IDs can be suppressed in all log messages by setting the startup +option `--log.ids false` when starting arangod or any of the client tools. + +## Startup options + +The hidden startup option `--rocksdb.delayed_write_rate` was renamed to the more +consistent `--rocksdb.delayed-write-rate`. When the old option name is used, the +arangod startup will be aborted with a descriptive error message. + +## HTTP REST API +The following APIs have been added: + +- [The new Stream Transaction API](../../develop/http-api/transactions/_index.md) +- [The new ArangoSearch Analyzer management API](../../develop/http-api/analyzers.md) +- [The management of the new TTL indexes](../../develop/http-api/indexes/ttl.md); this enhances the existing index-API +- [Query the actual shard a document lives in](../../develop/http-api/collections.md#get-the-responsible-shard-for-a-document) + +The following APIs have been expanded: + +- The [ArangoSearch management API](../../develop/http-api/views/arangosearch-views.md) has the new `commitIntervalMsec` attribute in all routes +- Indexes can now have user-defined names +- The new "ttl" index type has been added to the [index creation API](../../develop/http-api/indexes/_index.md) +- [Collection creation API now provides the `smartJoinAttribute` parameter](../../develop/javascript-api/@arangodb/db-object.md#db_createcollection-name--properties--type--options) +- [`filter` foxx-tests](../../develop/http-api/foxx.md#miscellaneous) for testing + +The following documentation has been enhanced: + +- the documentation for [collection creation and fetching its properties](../../develop/http-api/collections.md) has been made more precise + +## Web interface + +### Potentially different sort order of documents + +In the list of documents for a collection, the documents will now always be sorted +in lexicographical order of their `_key` values. An exception for keys representing +quasi-numerical values has been removed when doing the sorting in the web interface. + +Therefore a document with a key value "10" will now be displayed before a document +with a key value of "9". + +### Removal of index types "hash" and "skiplist" from the web UI (RocksDB engine) + +For the RocksDB engine, the selection of index types "hash" and "skiplist" +has been removed from the web interface when creating new indexes. + +The index types "hash", "skiplist" and "persistent" are just aliases of each other +when using the RocksDB engine, so there is no need to offer all of them in parallel. + +We found that offering the different types of indexes while in fact they were the +same often confused end users. We opted for keeping "persistent" because from the +candidates "hash", "skiplist" and "persistent" only "persistent" is actually a valid +description of the index capabilities/implementation. + +## AQL + +3.5 enforces the invalidation of variables in AQL queries after usage of an AQL +COLLECT statements as documented. The documentation for variable invalidation claims +that + +> The COLLECT statement will eliminate all local variables in the current scope. +> After COLLECT only the variables introduced by COLLECT itself are available. + +However, the described behavior was not enforced when a COLLECT was preceded by a +FOR loop that was itself preceded by a COLLECT. In the following query the final +RETURN statement accesses variable `key1` though the variable should have been +invalidated by the COLLECT directly before it: + +```aql +FOR x1 IN 1..2 + COLLECT key1 = x1 + FOR x2 IN 1..2 + COLLECT key2 = x2 + RETURN [key2, key1] +``` + +In previous releases, this query was +parsed ok, but the contents of variable `key1` in the final RETURN statement were +undefined. + +This change is about making queries as the above fail with a parse error, as an +unknown variable `key1` is accessed here, avoiding the undefined behavior. This is +also in line with what the documentation states about variable invalidation. + +## HTTP Replication APIs + +### New parameter for WAL tailing API + +Tailing of recent server operations via `/_api/wal/tail` gets a new parameter +`syncerId`, which helps in tracking the WAL tick of each client. If set, this +supersedes the parameter `serverId` for this purpose. The API stays backwards +compatible. + +## Miscellaneous + +### Index creation + +In previous versions of ArangoDB, if one attempted to create an index with a +specified `_id`, and that `_id` was already in use, the server would typically +return the existing index with matching `_id`. This is somewhat unintuitive, as +it would ignore if the rest of the definition did not match. This behavior has +been changed so that the server will now return a duplicate identifier error. + +ArangoDB 3.5 also disallows creating indexes on the `_id` sub-attribute of an attribute, +`referredTo._id` or `documents[*]._id`. Previous versions of ArangoDB allowed creating +such indexes, but the indexes were non-functional. +Starting with ArangoDB 3.5 such indexes cannot be created anymore, and any attempts to +create them will fail. + +### Version details output + +The attribute key `openssl-version` in the server/client tool version details +output was renamed to `openssl-version-compile-time`. + +This change affects the output produced when starting one of the ArangoDB +executables (e.g. arangod, arangosh) with the `--version` command. It also +changes the attribute name in the detailed response of the `/_api/version` REST API. + +### Overcommit settings + +On Linux, ArangoDB will now show a startup warning in case the kernel setting +`vm.overcommit_memory` is set to a value of 2 and the jemalloc memory allocator +is in use. This combination does not play well together, and may lead to the +kernel denying arangod's memory allocation requests in more cases than necessary. + +## Usage of V8 + +`ArangoQueryStreamCursor.id()` used to return a 32 bit number, and will now +return a string as similar places where V8 has representations of ArangoDB IDs. diff --git a/site/content/arangodb/oem/release-notes/version-3.5/known-issues-in-3-5.md b/site/content/arangodb/oem/release-notes/version-3.5/known-issues-in-3-5.md new file mode 100644 index 0000000000..b4e1b9ac2b --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.5/known-issues-in-3-5.md @@ -0,0 +1,98 @@ +--- +title: Known Issues in ArangoDB 3.5 +menuTitle: Known Issues in 3.5 +weight: 10 +description: >- + Important issues affecting the 3.5.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by ArangoSearch view may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** ArangoSearch index consolidation does not work during creation of a link on existing collection which may lead to massive file descriptors consumption <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** 3.6.0 <br> **Reference:** [arangodb/backlog#509](https://github.com/arangodb/backlog/issues/509) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in ArangoSearch View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-11-06 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** There is a possibility to get into deadlocks during Coordinator execution if a custom Analyzer was created (and is present in the `_analyzers` system collection). It is recommended not to use custom Analyzers in production environments in affected versions. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** 3.5.3 <br> **Reference:** [arangodb/backlog#651](https://github.com/arangodb/backlog/issues/651) (internal) | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | +| **Date Added:** 2020-05-22 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** The immediate recreation of ArangoSearch Analyzers in cluster deployments (deleting and shortly after creating one with the same name but different properties) causes errors in queries which involve such recreated Analyzers. For a workaround see [Purge Analyzer cache](#purge-analyzer-cache) below. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#669](https://github.com/arangodb/backlog/issues/669) (internal), [arangodb/backlog#695](https://github.com/arangodb/backlog/issues/695) (internal) | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** AQL queries with subqueries or joins in SEARCH expressions may return incorrect results. As a workaround, you can disable the optimizer rule which causes the problem with the following query options: `{ optimizer: { rules: [ "-inline-subqueries" ] } }` <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#12247](https://github.com/arangodb/arangodb/issues/12247) | + +### Purge Analyzer cache + +To fix query errors caused by an immediately re-created Analyzer, the +DB-Servers need to be forced to clear their Analyzer caches. This can be +achieved by using below code in _arangosh_: + +1. Connect to a Coordinator with `arangosh` +2. `var analyzers = require("@arangodb/analyzers");` +3. `analyzers.remove("<PROBLEMATIC ANALYZER>");` +4. `var dummy = "dummy_analyzer_" + Date.now();` +4. `analyzers.save(dummy, "identity", {});` +5. `db._query("FOR d IN <ANY EXISTING VIEW> SEARCH ANALYZER(STARTS_WITH(d.test, 'something'), @a) RETURN d", {a: dummy});` + + This query with a new Analyzer will force cache purging. If this query + reports an error about a missing Analyzer, then wait for a minute and + retry until it succeeds. +6. Re-create your Analyzer (`<PROBLEMATIC ANALYZER>`) with the new, + correct properties. +7. `analyzers.remove(dummy);` +8. Check if the original query still fails. It is possible that it reports a + missing Analyzer, but the problem should go away in a minute and the query + execute normally. + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-11-06 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Upgrades from ArangoDB version 3.4.x to 3.5.0 or 3.5.1 don't create the `_analyzers` system collection, preventing creation and use of custom Analyzers.<br>Suggested workaround: Create the missing collection manually in each database of an ArangoDB deployment after upgrade (arangosh example: `db._create("_analyzers", {isSystem: true})`) <br> **Affected Versions:** 3.5.0, 3.5.1 <br> **Fixed in Versions:** 3.5.2 <br> **Reference:** [arangodb/backlog#652](https://github.com/arangodb/backlog/issues/652) (internal) | +| **Date Added:** 2019-11-06 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Rolling cluster upgrades from ArangoDB version 3.5.0 to 3.5.1 are not possible due to errors at DB-Server nodes. A fix is contained from version 3.5.2 on, and rolling upgrades to this version are possible. <br> **Affected Versions:** 3.5.0, 3.5.1 <br> **Fixed in Versions:** 3.5.2 <br> **Reference:** [arangodb/backlog#652](https://github.com/arangodb/backlog/issues/652) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-12-18 <br> **Component:** Agency <br> **Deployment Mode:** Cluster <br> **Description:** When upgrading a cluster from 3.5.x to 3.6.10, the upgrade can get stuck. Please update to 3.5.7 first before you upgrade to 3.6.10. If you are already in this situation, then you need to kill the stuck Agent. In a Kubernetes environment, use `kubectl` to get a list of all ArangoDB pods. You should see that one of the Agent pods has not yet restarted. Check the log file for a line like `control-c received` near the end, followed by no or only a few more log lines. Kill this pod with `kubectl`. <br> **Affected Versions:** 3.5.x, 3.6.10 <br> **Fixed in Versions:** 3.5.7 <br> **Reference:** N/A | + +## Stream Transactions + +| Issue | +|------------| +| **Date Added:** 2019-08-19 <br> **Component:** Transactions <br> **Deployment Mode:** All <br> **Description:** Stream Transactions do not honor the limits described in the documentation. Currently the idle timeout of 10 seconds will not be enforced, neither will the maximum size of transaction be enforced. <br> **Affected Versions:** 3.5.0 <br> **Fixed in Versions:** 3.5.1 <br> **Reference:** [arangodb/arangodb#9775](https://github.com/arangodb/arangodb/pull/9775) | +| **Date Added:** 2019-08-19 <br> **Component:** Transactions <br> **Deployment Mode:** All <br> **Description:** Stream Transactions do not support the graph operations that are initiated via the `general-graph` / `smart-graph` JavaScript module or via the REST API at `/_api/gharial`. These operations will act as if no stream transaction is present. <br> **Affected Versions:** 3.5.0 <br> **Fixed in Versions:** 3.5.1 <br> **Reference:** [arangodb/arangodb#9855](https://github.com/arangodb/arangodb/pull/9855) / [arangodb/arangodb#9911](https://github.com/arangodb/arangodb/pull/9911) | +| **Date Added:** 2019-08-19 <br> **Component:** Transactions <br> **Deployment Mode:** All <br> **Description:** Stream Transactions do not support user restrictions. Any authenticated user may access any ongoing transaction so long as they have access to the database in question. <br> **Affected Versions:** 3.5.0 <br> **Fixed in Versions:** 3.5.1 <br> **Reference:** [arangodb/arangodb#9796](https://github.com/arangodb/arangodb/pull/9796) | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** ArangoSearch Views are not backed up and thus not restored yet. Therefore, Views have to be dropped and recreated after a restore. This happens automatically in the background, but in particular in the presence of large amounts of data, the recreation of the ArangoSearch indexes can take some time after the restore. It is planned to rectify this limitation in one of the next releases.<br>Note furthermore that a running query with views can prevent a restore operation from happening whilst the query is running. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** 3.6.0 <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Calling a shutdown endpoint may not result in a proper shutdown while the node/server is still under load. The server processes must be ended manually.<br>In v3.5.1 and later, two different issues are fixed: libgcc/libmusl wrongly detecting multi-threadedness in statically linked executables and a read/write lock race condition. <br> **Affected Versions:** 3.5.0 <br> **Fixed in Versions:** 3.5.1 <br> **Reference:** [v3.5.1 CHANGELOG](https://github.com/arangodb/arangodb/blob/v3.5.1/CHANGELOG) / [Blog Post "When Exceptions Collide"](https://www.arangodb.com/2019/09/when-exceptions-collide/) | +| **Date Added:** 2019-05-24 <br> **Component:** Web UI <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Master/Slave mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-09-11 <br> **Component:** Indexing <br> **Deployment Mode:** All <br> **Description:** A time to live (TTL) index does not remove documents from a collection if the path points to a nested attribute. Only top-level attributes work. <br> **Affected Versions:** 3.5.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The DMG package for macOS is not notarized, which prevents the execution of _ArangoDB3-CLI.app_ under macOS 10.15 (Catalina) with error message: "_ArangoDB3-CLI_ can't be opened because Apple cannot check it for malicious software" <br> **Affected Versions:** 3.3.x, 3.4.x, 3.5.x <br> **Fixed in Versions:** 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10561](https://github.com/arangodb/arangodb/issues/10561) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** V8-based binaries of the client packages (arangosh, arangoinspect, foxx-manager) have an incorrect default value for `javascript.startup-directory` and will thus not find the required JavaScript folder unless specified by the user. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.0 <br> **Fixed in Versions:** 3.4.9, 3.5.4, 3.6.1 <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The client packages for Windows miss the arangoinspect binary. As a workaround, you can run arangosh with the following options:<br>`arangosh --server.authentication false --server.ask-jwt-secret --javascript.client-module inspector.js …` <br> **Affected Versions:** 3.3.x, 3.4.x, 3.5.x, 3.6.0 <br> **Fixed in Versions:** 3.3.25, 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10835](https://github.com/arangodb/arangodb/pull/10835) | +| **Date Added:** 2020-01-07 <br> **Component:** Foxx <br> **Deployment Mode:** Cluster <br> **Description:** In case of a Foxxmaster failover, jobs in state `'progress'` are not reset to `'pending'` to restart execution. <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10800](https://github.com/arangodb/arangodb/pull/10800) | +| **Date Added:** 2020-05-18 <br> **Component:** all arangod / arangosh based programs & tools <br> **Deployment Mode:** All <br> **Description:** When using the `--config` option to set the configuration file location the ArangoDB C++ binaries check for `<filename>.local` among other paths. If this path happens to be a directory then the expected configuration cannot be read, resulting in an early exit. <br> **Affected Versions:** 3.4.x, 3.5.x <br> **Fixed in Versions:** 3.4.11, 3.5.6 <br> **Reference:** [arangodb/arangodb#11632](https://github.com/arangodb/arangodb/pull/11632) | +| **Date Added:** 2020-06-19 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** When inserting edges into an edge collection of a SmartGraph, the auto-generated `_rev` values for the ingoing and outgoing part of the edge may differ. This can be confusing when querying the `_rev` values of the edges later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.5, 3.7.1 <br> **Reference:** N/A | +| **Date Added:** 2020-06-30 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** Changing the collection properties of a smart edge collection did not propagate the changes to child collections for the `waitForSync`, `cacheEnabled` and `schema` attributes. This has been fixed in 3.7.1 for new smart edge collections, created with 3.7.1 or later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.7.1 <br> **Reference:** [arangodb/arangodb#12065](https://github.com/arangodb/arangodb/pull/12065) | +| **Date Added:** 2020-07-31 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The API tab of Foxx services does not render the Swagger UI interface. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.5.6, 3.6.6, 3.7.1 <br> **Reference:** [arangodb/arangodb#12297](https://github.com/arangodb/arangodb/issues/12297) | +| **Date Added:** 2020-11-20 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The `Www-Authenticate` header is not set for HTTP 401 responses as required by the HTTP specification, despite the documentation claiming this behavior. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.8.0 <br> **Reference:** [arangodb/arangodb#13001](https://github.com/arangodb/arangodb/issues/13001) | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | diff --git a/site/content/arangodb/oem/release-notes/version-3.5/whats-new-in-3-5.md b/site/content/arangodb/oem/release-notes/version-3.5/whats-new-in-3-5.md new file mode 100644 index 0000000000..9875c19b12 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.5/whats-new-in-3-5.md @@ -0,0 +1,742 @@ +--- +title: Features and Improvements in ArangoDB 3.5 +menuTitle: What's New in 3.5 +weight: 5 +description: >- + Customized Analyzers, multiple shortest path algorithm for graphs, fast cluster + joins, a new transaction API, hot backups, a feature for expiring documents +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.5. ArangoDB 3.5 also contains several bug fixes that are not listed +here. + +## ArangoSearch + +### Configurable Analyzers + +Analyzers can split string values into smaller parts and perform additional +processing such as word stemming and case conversion. In ArangoDB 3.4 there +is a fixed set of text analyzers for 12 different languages, which tokenize +strings into case-insensitive word stems using language-dependent rules based +on the chosen locale, without discarding any stop-words (common words which +carry little meaning such as "the"). An additional no-operation analyzer +*identity* is available to keep the input unaltered in its entirety. + +In 3.5, analyzers can be customized as well as used independent of +ArangoSearch Views in AQL. It is possible to tokenize strings without +word stemming, remove user-defined stop-words, split by a delimiting +character only, perform case conversion and/or removal of diacritic +characters against the full input without tokenization and more. + +See [Analyzers](../../index-and-search/analyzers.md) for all available options. + +### Sorted Index + +The index behind an ArangoSearch View can have a primary sort order. +A direction can be specified upon View creation for each uniquely named +attribute (ascending or descending), to enable an optimization for AQL +queries which iterate over a view and sort by one of the attributes. +If the index direction matches the requested `SORT` direction, then +the data can be read in order directly from the index without actual +sort operation. + +View definition example: + +```json +{ + "links": { + "coll1": { + "fields": { + "text": { } + } + }, + "coll2": { + "fields": { + "text": { } + } + }, + "primarySort": [ + { + "field": "text", + "direction": "desc" + } + ] + } +} +``` + +AQL query example: + +```aql +FOR doc IN viewName + SORT doc.text DESC + RETURN doc +``` + +Execution plan **without** a sorted index being used: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateViewNode 1 - FOR doc IN viewName /* view query */ + 3 CalculationNode 1 - LET #1 = doc.`val` /* attribute expression */ + 4 SortNode 1 - SORT #1 DESC /* sorting strategy: standard */ + 5 ReturnNode 1 - RETURN doc +``` + +Execution plan with the primary sort order of the index being utilized: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateViewNode 1 - FOR doc IN viewName SORT doc.`val` DESC /* view query */ + 5 ReturnNode 1 - RETURN doc +``` + +Note that the `primarySort` option is immutable: it cannot be changed after +View creation. It is therefore not possible to configure it through the Web UI. +The View needs to be created via the HTTP or JavaScript API (arangosh) to set it. + +See [Primary Sort Order](../../index-and-search/arangosearch/performance.md#primary-sort-order) +of ArangoSearch Views. + +### AQL Integration + +Some small new features give more control over ArangoSearch from AQL. + +- The scoring functions `BM25()` and `TFIDF()` are not limited to the `SORT` + operation anymore, but can also be returned as part of the query result: + + ```aql + FOR doc IN viewName + SEARCH ... + LET score = BM25(doc) + SORT score DESC + RETURN { doc, score } + ``` + +- The score can be manipulated to influence the ranking based on + attribute values and using numeric AQL functions: + + ```aql + FOR movie IN imdbView + SEARCH PHRASE(movie.title, "Star Wars", "text_en") + SORT BM25(movie) * LOG(movie.runtime + 1) DESC + RETURN movie + ``` + +- The `SEARCH` operation accepts an options object to restrict the search to + certain collections indexed by a View: + + ```aql + FOR doc IN viewName + SEARCH ... OPTIONS { collections: ["coll1", "coll2"] } + RETURN doc + ``` + +- A new function `IN_RANGE()` was added for matching values within defined + boundaries, to enable easy range searching primarily for numbers and strings. + +See: +- [AQL Scoring Functions](../../aql/functions/arangosearch.md#scoring-functions) +- [AQL Search Options](../../aql/high-level-operations/search.md#search-options) +- [IN_RANGE() function](../../aql/functions/arangosearch.md#in_range) + +## AQL + +### Pruning in Traversals + +With `PRUNE` you can stop walking down certain paths early in a graph traversal +to improve its efficiency. This is different to `FILTER`, which would perform +a post-filtering after the actual traversal was carried out already in most +cases. Using `PRUNE`, the traverser will not follow any more edges on the +current path if the pruning condition is met, but will emit the traversal +variables for whatever stopped it. + +See: [Graph Traversal Pruning](../../aql/graphs/traversals.md#pruning) + +### SORT-LIMIT optimization + +A new SORT-LIMIT optimization has been added. This optimization will be pulled off +by the query optimizer if there is a SORT statement followed by a LIMIT node, and the +overall number of documents to return is relatively small in relation to the total +number of documents to be sorted. In this case, the optimizer will use a size-constrained +heap for keeping only the required number of results in memory, which can drastically +reduce memory usage and, for some queries, also execution time for the sorting. + +If the optimization is applied, it will show as "sort-limit" rule in the query execution +plan. + +Also see: +- [AQL Optimizer Rules](../../aql/execution-and-performance/query-optimization.md#optimizer-rules) + (`sort-limit` rule) +- [Sort-Limit Optimization in AQL](https://www.arangodb.com/2019/03/sort-limit-optimization-aql/) + (blog post) + +### Index hints in AQL + +Users may now take advantage of the `indexHint` inline query option to override +the internal optimizer decision regarding which index to use to serve content +from a given collection. The index hint works with the [named indexes](#named-indexes) +feature, making it easy to specify which index to use. + +See: +- [AQL Index Hints](../../aql/high-level-operations/for.md#indexhint) +- [An introduction to index hints and named indices](https://www.arangodb.com/learn/development/index-hints-named-indices/) + (tutorial) + +### Sorted primary index (RocksDB engine) + +The query optimizer can now make use of the sortedness of primary indexes if the +RocksDB engine is used. This means the primary index can be utilized for queries +that sort by either the `_key` or `_id` attributes of a collection and also for +range queries on these attributes. + +In the list of documents for a collection in the web interface, the documents will +now always be sorted in lexicographical order of their `_key` values. An exception for +keys representing quasi-numerical values has been removed when doing the sorting in +the web interface. Removing this exception can also speed up the display of the list +of documents. + +This change potentially affects the order in which documents are displayed in the +list of documents overview in the web interface. A document with a key value "10" will +now be displayed before a document with a key value of "9". In previous versions of +ArangoDB this was exactly opposite. + +### Edge index query optimization (RocksDB engine) + +An AQL query that uses the edge index only and returns the opposite side of +the edge can now be executed in a more optimized way, e.g. + +```aql +FOR edge IN edgeCollection FILTER edge._from == "v/1" RETURN edge._to +``` + +is fully covered by the RocksDB edge index. + +For MMFiles this rule does not apply. + +### AQL syntax improvements + +AQL now allows the usage of floating point values without leading zeros, e.g. +`.1234`. Previous versions of ArangoDB required a leading zero in front of +the decimal separator, i.e `0.1234`. + +Also see: [AQL Numeric Literals](../../aql/fundamentals/data-types.md#numeric-literals) + +### k Shortest Paths queries + +AQL now allows to perform k Shortest Paths queries, that is, query a number of +paths of increasing length from a start vertex to a target vertex. + +See: [AQL k Shortest Paths](../../aql/graphs/k-shortest-paths.md) + +## SmartJoins + +The SmartJoins feature available in the ArangoDB Enterprise Edition allows +running joins between two sharded collections with performance close to that +of a local join operation. + +The prerequisite for this is that the two collections have an identical sharding setup, +established via the `distributeShardsLike` attribute of one of the collections. + +Quick example setup for two collections with identical sharding: + +```js +db._create("products", { numberOfShards: 3, shardKeys: ["_key"] }); +db._create("orders", { distributeShardsLike: "products", shardKeys: ["productId"] }); +db.orders.ensureIndex({ type: "hash", fields: ["productId"] }); +``` + +Now an AQL query that joins the two collections via their shard keys will benefit from +the SmartJoins optimization, e.g. + +```aql +FOR p IN products + FOR o IN orders + FILTER p._key == o.productId + RETURN o +``` + +In this query's execution plan, the extra hop via the coordinator can be saved +that is normally there for generic joins. Thanks to the SmartJoins optimization, +the query's execution is as simple as: + +```aql +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 EnumerateCollectionNode DBS 9 - FOR o IN orders /* full collection scan, 3 shard(s) */ + 7 IndexNode DBS 0 - FOR p IN products /* primary index scan, scan only, 3 shard(s) */ + 10 RemoteNode COOR 0 - REMOTE + 11 GatherNode COOR 0 - GATHER + 6 ReturnNode COOR 0 - RETURN o +``` + +Without the SmartJoins optimization, there will be an extra hop via the +coordinator for shipping the data from each shard of the one collection to +each shard of the other collection, which will be a lot more expensive: + +```aql +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 16 IndexNode DBS 3 - FOR p IN products /* primary index scan, index only, projections: `_key`, 3 shard(s) */ + 14 RemoteNode COOR 3 - REMOTE + 15 GatherNode COOR 3 - GATHER + 8 ScatterNode COOR 3 - SCATTER + 9 RemoteNode DBS 3 - REMOTE + 7 IndexNode DBS 3 - FOR o IN orders /* hash index scan, 3 shard(s) */ + 10 RemoteNode COOR 3 - REMOTE + 11 GatherNode COOR 3 - GATHER + 6 ReturnNode COOR 3 - RETURN o +``` + +In the end, SmartJoins can optimize away a lot of the inter-node network +requests normally required for performing a join between sharded collections. +The performance advantage of SmartJoins compared to regular joins will grow +with the number of shards of the underlying collections. + +In general, for two collections with `n` shards each, the minimal number of +network requests for the general join (_no_ SmartJoins optimization) will be +`n * (n + 2)`. The number of network requests increases quadratically with the +number of shards. + +SmartJoins can get away with a minimal number of `n` requests here, which scales +linearly with the number of shards. + +SmartJoins will also be especially advantageous for queries that have to ship a lot +of data around for performing the join, but that will filter out most of the data +after the join. In this case SmartJoins should greatly outperform the general join, +as they will eliminate most of the inter-node data shipping overhead. + +Also see: +- [SmartJoins documentation](../../develop/smartjoins.md) +- [SmartJoins tutorial](https://www.arangodb.com/enterprise-server/smartjoins/) + +## Background Index Creation + +Creating new indexes is by default done under an exclusive collection lock. This means +that the collection (or the respective shards) are not available for write operations +as long as the index is created. This "foreground" index creation can be undesirable, +if you have to perform it on a live system without a dedicated maintenance window. + +Starting with ArangoDB 3.5, indexes can also be created in "background", not using an +exclusive lock during the entire index creation. The collection remains basically available, +so that other CRUD operations can run on the collection while the index is being created. +This can be achieved by setting the *inBackground* attribute when creating an index. + +To create an index in the background in *arangosh* just specify `inBackground: true`, +like in the following example: + +```js +db.collection.ensureIndex({ type: "hash", fields: [ "value" ], inBackground: true }); +``` + +Indexes that are still in the build process will not be visible via the ArangoDB APIs. +Nevertheless it is not possible to create the same index twice via the *ensureIndex* API +while an index is still being created. AQL queries also will not use these indexes until +the index reports back as fully created. Note that the initial *ensureIndex* call or HTTP +request will still block until the index is completely ready. Existing single-threaded +client programs can thus safely set the *inBackground* option to *true* and continue to +work as before. + +Should you be building an index in the background you cannot rename or drop the collection. +These operations will block until the index creation is finished. This is equally the case +with foreground indexing. + +After an interrupted index build (i.e. due to a server crash) the partially built index +will the removed. In the ArangoDB cluster the index might then be automatically recreated +on affected shards. + +Background index creation might be slower than the "foreground" index creation and require +more RAM. Under a write heavy load (specifically many remove, update or replace operations), +the background index creation needs to keep a list of removed documents in RAM. This might +become unsustainable if this list grows to tens of millions of entries. + +Building an index is always a write-heavy operation, so it is always a good idea to build +indexes during times with less load. + +Please note that background index creation is useful only in combination with the RocksDB +storage engine. With the MMFiles storage engine, creating an index will always block any +other operations on the collection. + +Also see: [Creating Indexes in Background](../../index-and-search/indexing/basics.md#creating-indexes-in-background) + +## TTL (time-to-live) Indexes + +The new TTL indexes feature provided by ArangoDB can be used for automatically +removing expired documents from a collection. + +TTL indexes support eventual removal of documents which are past a configured +expiration timepoint. The expiration timepoints can be based upon the documents' +original insertion or last-updated timepoints, with adding a period during +which to retain the documents. +Alternatively, expiration timepoints can be specified as absolute values per +document. +It is also possible to exclude documents from automatic expiration and removal. + +Please also note that TTL indexes are designed exactly for the purpose of removing +expired documents from collections. It is *not recommended* to rely on TTL indexes +for user-land AQL queries. This is because TTL indexes internally may store a transformed, +always numerical version of the index attribute value even if it was originally passed in +as a datestring. As a result TTL indexes will likely not be used for filtering and sort +operations in user-land AQL queries. + +Also see: [TTL Indexes](../../index-and-search/indexing/working-with-indexes/ttl-indexes.md) + +## Collections + +All collections now support a minimum replication factor (minReplicationFactor) +property. This is default set to `1`, which is identical to previous behavior. +If in a failover scenario a shard of a collection has less than minReplicationFactor +many in sync followers it will go into "read-only" mode and will reject writes +until enough followers are in sync again. + +In more detail: +- Having `minReplicationFactor == 1` means as soon as a "master-copy" is + available of the data writes are allowed. +- Having `minReplicationFactor > 1` requires additional in sync copies on + follower servers to allow writes. + +The feature is used to reduce the diverging of data in case of server failures +and to help new followers to catch up. + +Also see the [`db` object](../../develop/javascript-api/@arangodb/db-object.md#db_createcollection-name--properties--type--options) + +## HTTP API extensions + +### Extended index API + +The HTTP API for creating indexes at POST `/_api/index` has been extended two-fold: + +- to create a TTL (time-to-live) index, it is now possible to specify a value of `ttl` + in the `type` attribute. When creating a TTL index, the attribute `expireAfter` is + also required. That attribute contains the expiration time (in seconds), which is + based on the documents' index attribute value. + +- to create an index in background, the attribute `inBackground` can be set to `true`. + +### API for querying the responsible shard + +The HTTP API for collections has got an additional route for retrieving the responsible +shard for a document at PUT `/_api/collection/<name>/responsibleShard`. + +When calling this route, the request body is supposed to contain the document for which +the responsible shard should be determined. The response will contain an attribute `shardId` +containing the ID of the shard that is responsible for that document. + +A method `collection.getResponsibleShard(document)` was added to the JS API as well. + +It does not matter if the document actually exists or not, as the shard responsibility +is determined from the document's attribute values only. + +Please note that this API is only meaningful and available on a cluster coordinator. + +See: +- [Get responsible shard in JS API](../../develop/javascript-api/@arangodb/collection-object.md#collectiongetresponsiblesharddocument) +- [Get responsible shard in HTTP API](../../develop/http-api/collections.md#get-the-responsible-shard-for-a-document) + +### Foxx API for running tests + +The HTTP API for running Foxx service tests now supports a `filter` attribute, +which can be used to limit which test cases should be executed. + +### Stream Transaction API + +There is a new HTTP API for transactions. This API allows clients to add operations to a +transaction in a streaming fashion. A transaction can consist of a series of supported +transactional operations, followed by a commit or abort command. +This allows clients to construct transactions in a more natural way than +with JavaScript-based transactions. + +Note that this requires client applications to abort transactions which are no +longer necessary. Otherwise resources and locks acquired by the transactions +will be in use until the server decides to garbage-collect them. + +In order to keep resource usage low, a maximum lifetime and transaction size for stream +transactions is enforced on the coordinator to ensure that transactions cannot block the +cluster from operating properly: + +- Maximum idle timeout of **10 seconds** between operations +- Maximum transaction size of **128 MB** per DB-Server + +These limits are also enforced for stream transactions on single servers. + +Enforcing the limits is useful to free up resources used by abandoned +transactions, for example from transactions that are abandoned by client +applications due to programming errors or that were left over because client +connections were interrupted. Also see +[Known Issues](known-issues-in-3-5.md#stream-transactions) + +See: [Stream Transaction HTTP API](../../develop/http-api/transactions/stream-transactions.md) + +### Minimal replication Factor + +Within the properties of a collection we can now define a `minReplicationFactor`. +This affects all routes that can create or modify the properties of a collection, +including the graph API `_api/gharial`. All places where a replicationFactor can +be modified, can now modify the minReplicationFactor as well. + +## Web interface + +When using the RocksDB engine, the selection of index types "hash" and "skiplist" +has been removed from the web interface when creating new indexes. + +The index types "hash", "skiplist" and "persistent" are just aliases of each other +when using the RocksDB engine, so there is no need to offer them all. In the web +interface there remains the index of type "persistent", which is feature-wise +identical with "hash" and "skiplist" indexes for the RocksDB engine. +Existing "hash" and "skiplist" indexes will remain fully functional. + +## JavaScript + +### V8 updated + +The bundled version of the V8 JavaScript engine has been upgraded from 5.7.492.77 to +7.1.302.28. + +Among other things, the new version of V8 provides a native JavaScript `BigInt` type which +can be used to store arbitrary-precision integers. However, to store such `BigInt` objects +in ArangoDB, they need to be explicitly converted to either strings or simple JavaScript +numbers. +Converting BigInts to strings for storage is preferred because converting a BigInt to a +simple number may lead to precision loss. + +```js +// will fail with "bad parameter" error: +value = BigInt("123456789012345678901234567890"); +db.collection.insert({ value }); + +// will succeed: +db.collection.insert({ value: String(value) }); + +// will succeed, but lead to precision loss: +db.collection.insert({ value: Number(value) }); +``` + +The new V8 version also changes the default timezone of date strings to be conditional +on whether a time part is included: + +```js +> new Date("2019-04-01"); +Mon Apr 01 2019 02:00:00 GMT+0200 (Central European Summer Time) + +> new Date("2019-04-01T00:00:00"); +Mon Apr 01 2019 00:00:00 GMT+0200 (Central European Summer Time) +``` + +If the timezone is explicitly set in the date string, then the specified timezone will +always be honored: + +```js +> new Date("2019-04-01Z"); +Mon Apr 01 2019 02:00:00 GMT+0200 (Central European Summer Time) +> new Date("2019-04-01T00:00:00Z"); +Mon Apr 01 2019 02:00:00 GMT+0200 (Central European Summer Time) +``` + +### JavaScript Dependencies + +More than a dozen JavaScript dependencies were updated in 3.5 +([changelog](https://github.com/arangodb/arangodb/blob/3.5/CHANGELOG)). + +The most significant one is the update of `joi` from 9.2.0 to 14.3.1. See the +respective [release notes](https://github.com/hapijs/joi/issues?q=is%3Aissue+label%3A%22release+notes%22) +to see if there are breaking changes for you. + +Note that you can bundle your own version of `joi` if you need to rely on +version-dependent features. + +### JavaScript Security Options + +ArangoDB 3.5 provides several new options for restricting the functionality of +JavaScript application code running in the server, with the intent to make a setup +more secure. + +There now exist startup options for restricting which environment variables and +values of which configuration options JavaScript code is allowed to read. These +options can be set to prevent leaking of confidential information from the +environment or the setup into the JavaScript application code. +Additionally there are options to restrict outbound HTTP connections from JavaScript +applications to certain endpoints and to restrict filesystem access from JavaScript +applications to certain directories only. + +Finally there are startup options to turn off the REST APIs for managing Foxx +services, which can be used to prevent installation and uninstallation of Foxx +applications on a server. A separate option is provided to turn off access and +connections to the central Foxx app store via the web interface. + +A complete overview of the security options can be found in +[Security Options](../../operations/security/security-options.md). + +### Foxx + +Request credentials are now exposed via the `auth` property: + +```js +const tokens = context.collection("tokens"); +router.get("/authorized", (req, res) => { + if (!req.auth || !req.auth.bearer || !tokens.exists(req.auth.bearer)) { + res.throw(403, "Not authenticated"); + } + // ... +}); +``` + +### API improvements + +Collections now provide the `documentId` method to derive document ids from keys. + +Before: + +```js +const collection = context.collection("users"); +const documentKey = "my-document-key"; +const documentId = `${collection.name()}/${documentKey}`; +``` + +After: + +```js +const collection = context.collection("users"); +const documentKey = "my-document-key"; +const documentId = collection.documentId(documentKey); +``` + +## Client tools + +### Dump and restore all databases + +**arangodump** got an option `--all-databases` to make it dump all available databases +instead of just a single database specified via the option `--server.database`. + +When set to true, this makes arangodump dump all available databases the current +user has access to. The option `--all-databases` cannot be used in combination with +the option `--server.database`. + +When `--all-databases` is used, arangodump will create a subdirectory with the data +of each dumped database. Databases will be dumped one after the after. However, +inside each database, the collections of the database can be dumped in parallel +using multiple threads. +When dumping all databases, the consistency guarantees of arangodump are the same +as when dumping multiple single database individually, so the dump does not provide +cross-database consistency of the data. + +**arangorestore** got an option `--all-databases` to make it restore all databases from +inside the subdirectories of the specified dump directory, instead of just the +single database specified via the option `--server.database`. + +Using the option for arangorestore only makes sense for dumps created with arangodump +and the `--all-databases` option. As for arangodump, arangorestore cannot be invoked +with the both options `--all-databases` and `--server.database` at the same time. +Additionally, the option `--force-same-database` cannot be used together with +`--all-databases`. + +If the to-be-restored databases do not exist on the target server, then restoring data +into them will fail unless the option `--create-database` is also specified for +arangorestore. Please note that in this case a database user must be used that has +access to the `_system` database, in order to create the databases on restore. + +Also see: +- [_arangodump_](../../components/tools/arangodump/_index.md) +- [_arangorestore_](../../components/tools/arangorestore/_index.md) + +### Warning if connected to DB-Server + +Under normal circumstances there should be no need to connect to a +database server in a cluster with one of the client tools, and it is +likely that any user operations carried out there with one of the client +tools may cause trouble. + +The client tools arangosh, arangodump and arangorestore will now emit +a warning when connecting with them to a database server node in a cluster. + +## Startup option changes + +The value type of the hidden startup option `--rocksdb.recycle-log-file-num` has +been changed from numeric to boolean in ArangoDB 3.5, as the option is also a +boolean option in the underlying RocksDB library. + +Client configurations that use this configuration variable should adjust their +configuration and set this variable to a boolean value instead of to a numeric +value. + +## Miscellaneous + +### Improved overview of available program options + +The `--help-all` command-line option for all ArangoDB executables will now also +show all hidden program options. + +Previously hidden program options were only returned when invoking arangod or +a client tool with the cryptic `--help-.` option. Now `--help-all` simply returns +them as well. + +### Fewer system collections + +The system collections `_frontend`, `_modules` and `_routing` are not created +anymore for new databases by default. + +`_modules` and `_routing` are only needed for legacy functionality. +Existing `_routing` collections will not be touched as they may contain user-defined +entries, and will continue to work. + +Existing `_modules` collections will also remain functional. + +The `_frontend` collection may still be required for actions triggered by the +web interface, but it will automatically be created lazily if needed. + +### Named indexes + +indexes now have an additional `name` field, which allows for more useful +identifiers. System indexes, like the primary and edge indexes, have default +names (`primary` and `edge`, respectively). If no `name` value is specified +on index creation, one will be auto-generated (e.g. `idx_13820395`). The index +name _cannot_ be changed after index creation. No two indexes on the same +collection may share the same name, but two indexes on different collections +may. + +### ID values in log messages + +By default, ArangoDB and its client tools now show a 5 digit unique ID value in +any of their log messages, e.g. + +``` +2019-03-25T21:23:19Z [8144] INFO [cf3f4] ArangoDB (version 3.5.0 enterprise [linux]) is ready for business. Have fun!. +``` + +In this message, the `cf3f4` is the message's unique ID value. ArangoDB users can +use this ID to build custom monitoring or alerting based on specific log ID values. +Existing log ID values are supposed to stay constant in future releases of arangod. + +Additionally the unique log ID values can be used by the Arango support to find +out which component of the product exactly generated a log message. The IDs also +make disambiguation of identical log messages easier. + +The presence of these ID values in log messages may confuse custom log message filtering +or routing mechanisms that parse log messages and that rely on the old log message +format. + +This can be fixed adjusting any existing log message parsers and making them aware +of the ID values. The ID values are always 5 byte strings, consisting of the characters +`[0-9a-f]`. ID values are placed directly behind the log level (e.g. `INFO`). + +Alternatively, the log IDs can be suppressed in all log messages by setting the startup +option `--log.ids false` when starting arangod or any of the client tools. + +## Internal + +We have moved from C++11 to C++14, which allows us to use some of the simplifications, +features and guarantees that this standard has in stock. +To compile ArangoDB from source, a compiler that supports C++14 is now required. + +The bundled JEMalloc memory allocator used in ArangoDB release packages has been +upgraded from version 5.0.1 to version 5.2.0. + +The bundled version of the RocksDB library has been upgraded from 5.16 to 6.2. + +The unit test framework has been changed from catch to googletest. This change also +renames a CMake configuration variable from `USE_CATCH_TESTS` to `USE_GOOGLE_TESTS`. diff --git a/site/content/arangodb/oem/release-notes/version-3.6/_index.md b/site/content/arangodb/oem/release-notes/version-3.6/_index.md new file mode 100644 index 0000000000..4aafa37386 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.6/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.6 +menuTitle: Version 3.6 +weight: 93 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.6/incompatible-changes-in-3-6.md b/site/content/arangodb/oem/release-notes/version-3.6/incompatible-changes-in-3-6.md new file mode 100644 index 0000000000..d86bb901d8 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.6/incompatible-changes-in-3-6.md @@ -0,0 +1,60 @@ +--- +title: Incompatible changes in ArangoDB 3.6 +menuTitle: Incompatible changes in 3.6 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Restricted ranges for date/time values in AQL + +ArangoDB 3.6 enforces valid date ranges for working with date/time in AQL. +The valid date ranges for any AQL date/time function are: + +- for string date/time values: `"0000-01-01T00:00:00.000Z"` (including) up to + `"9999-12-31T23:59:59.999Z"` (including) +- for numeric date/time values: -62167219200000 (including) up to + 253402300799999 (including). These values are the numeric equivalents of + `"0000-01-01T00:00:00.000Z"` and `"9999-12-31T23:59:59.999Z"`. + +Any date/time values outside the given range that are passed into an AQL date +function will make the function return `null` and trigger a warning in the +query, which can optionally be escalated to an error and stop the query. + +Any date/time operations that produce date/time outside the valid ranges stated +above will make the function return `null` and trigger a warning too. Example: + +```aql +DATE_SUBTRACT("2018-08-22T10:49:00+02:00", 100000, "years") // null +``` + +## Startup options + +The following startup options have been removed in ArangoDB 3.6: + +- `--vst.maxsize`: this option was used in previous versions to control the + maximum size (in bytes) of VelocyPack chunks when using the VelocyStream + (VST) protocol. This is now handled automatically by the server and does not + need any configuration. + +## Deprecation of MMFiles Storage Engine + +The MMFiles storage engine is deprecated starting with version +3.6.0 and it will be removed in a future release. + +We recommend to switch to RocksDB even before the removal of MMFiles. +RocksDB is the default [storage engine](../../components/arangodb-server/storage-engine.md) +since v3.4.0. + +## Requests statistics + +<small>Introduced in: v3.6.5</small> + +Previous versions of ArangoDB excluded all requests made to the web interface at +`/_admin/aardvark` from the requests statistics if the request was made for the +`_system` database. Requests for all other endpoints or requests to the same +endpoint for any non-system database were already counted. +ArangoDB now treats all incoming requests to the web interface in the same +way as requests to other endpoints, so the request counters may show higher +values than before in case the web interface was used a lot on the +`_system` database. diff --git a/site/content/arangodb/oem/release-notes/version-3.6/known-issues-in-3-6.md b/site/content/arangodb/oem/release-notes/version-3.6/known-issues-in-3-6.md new file mode 100644 index 0000000000..459350f2c3 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.6/known-issues-in-3-6.md @@ -0,0 +1,95 @@ +--- +title: Known Issues in ArangoDB 3.6 +menuTitle: Known Issues in 3.6 +weight: 10 +description: >- + Important issues affecting the 3.6.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by ArangoSearch view may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in ArangoSearch View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | +| **Date Added:** 2020-05-22 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** The immediate recreation of ArangoSearch Analyzers in cluster deployments (deleting and shortly after creating one with the same name but different properties) causes errors in queries which involve such recreated Analyzers. For a workaround see [Purge Analyzer cache](#purge-analyzer-cache) below. <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#669](https://github.com/arangodb/backlog/issues/669) (internal), [arangodb/backlog#695](https://github.com/arangodb/backlog/issues/695) (internal) | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** AQL queries with subqueries or joins in SEARCH expressions may return incorrect results. As a workaround, you can disable the optimizer rule which causes the problem with the following query options: `{ optimizer: { rules: [ "-inline-subqueries" ] } }` <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#12247](https://github.com/arangodb/arangodb/issues/12247) | + +### Purge Analyzer cache + +To fix query errors caused by an immediately re-created Analyzer, the +DB-Servers need to be forced to clear their Analyzer caches. This can be +achieved by using below code in _arangosh_: + +1. Connect to a Coordinator with `arangosh` +2. `var analyzers = require("@arangodb/analyzers");` +3. `analyzers.remove("<PROBLEMATIC ANALYZER>");` +4. `var dummy = "dummy_analyzer_" + Date.now();` +4. `analyzers.save(dummy, "identity", {});` +5. `db._query("FOR d IN <ANY EXISTING VIEW> SEARCH ANALYZER(STARTS_WITH(d.test, 'something'), @a) RETURN d", {a: dummy});` + + This query with a new Analyzer will force cache purging. If this query + reports an error about a missing Analyzer, then wait for a minute and + retry until it succeeds. +6. Re-create your Analyzer (`<PROBLEMATIC ANALYZER>`) with the new, + correct properties. +7. `analyzers.remove(dummy);` +8. Check if the original query still fails. It is possible that it reports a + missing Analyzer, but the problem should go away in a minute and the query + execute normally. + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | +| **Date Added:** 2020-01-07 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** It is not possible to execute AQL traversals in a cluster using collection sets (anonymous graph) for datasets where edges point to other edges. This is an uncommon use case, but it worked in previous versions. <br> **Affected Versions:** 3.6.0 <br> **Fixed in Versions:** 3.6.1 <br> **Reference:** [arangodb/arangodb#10801](https://github.com/arangodb/arangodb/pull/10801) | +| **Date Added:** 2020-07-22 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** When explicitly destroying an AQL Cursor created with `stream: true` in a cluster deployment, the server does not reply (the request hangs forever). <br> **Affected Versions:** 3.6.x, 3.7.0 <br> **Fixed in Versions:** 3.7.1 <br> **Reference:** [BTS-126](https://arangodb.atlassian.net/browse/BTS-126) (internal) | +| **Date Added:** 2021-04-19 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** User-defined variable names in AQL cannot start with an underscore, in contrast to what the AQL documentation claimed. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.9.0 <br> **Reference:** [arangodb/arangodb#13513](https://github.com/arangodb/arangodb/issues/13513) | +| **Date Added:** 2021-05-25 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** Global and per-query memory limits are not enforced for AQL graph traversals. Such queries may thus cause out-of-memory issues as they will not be killed despite exceeding the configured `--query.memory-limit` or Cursor API `memoryLimit`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-411](https://arangodb.atlassian.net/browse/BTS-411) (internal) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-12-18 <br> **Component:** Agency <br> **Deployment Mode:** Cluster <br> **Description:** When upgrading a cluster from 3.5.x to 3.6.10, the upgrade can get stuck. Please update to 3.5.7 first before you upgrade to 3.6.10. If you are already in this situation, then you need to kill the stuck Agent. In a Kubernetes environment, use `kubectl` to get a list of all ArangoDB pods. You should see that one of the Agent pods has not yet restarted. Check the log file for a line like `control-c received` near the end, followed by no or only a few more log lines. Kill this pod with `kubectl`. <br> **Affected Versions:** 3.5.x, 3.6.10 <br> **Fixed in Versions:** 3.5.7 <br> **Reference:** N/A | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-08-06 <br> **Component:** Coordinator <br> **Deployment Mode:** Cluster <br> **Description:** Restoring a hot backup to another deployment that has databases with the same names as in the backup can cause these databases to become inaccessible on Coordinators. They can be listed with `db._databases()` in arangosh, but not accessed using `db._useDatabase()`. <br> **Affected Versions:** 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.7.14, 3.8.1 <br> **Reference:** [BTS-527](https://arangodb.atlassian.net/browse/BTS-527) (internal) | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-24 <br> **Component:** Web UI <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Master/Slave mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x, 3.6.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The DMG package for macOS is not notarized, which prevents the execution of _ArangoDB3-CLI.app_ under macOS 10.15 (Catalina) with error message: "_ArangoDB3-CLI_ can't be opened because Apple cannot check it for malicious software" <br> **Affected Versions:** 3.3.x, 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10561](https://github.com/arangodb/arangodb/issues/10561) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** V8-based binaries of the client packages (arangosh, arangoinspect, foxx-manager) have an incorrect default value for `javascript.startup-directory` and will thus not find the required JavaScript folder unless specified by the user. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.0 <br> **Fixed in Versions:** 3.4.9, 3.5.4, 3.6.1 <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The client packages for Windows miss the arangoinspect binary. As a workaround, you can run arangosh with the following options:<br>`arangosh --server.authentication false --server.ask-jwt-secret --javascript.client-module inspector.js …` <br> **Affected Versions:** 3.3.x, 3.4.x, 3.5.x, 3.6.0 <br> **Fixed in Versions:** 3.3.25, 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10835](https://github.com/arangodb/arangodb/pull/10835) | +| **Date Added:** 2020-01-07 <br> **Component:** Foxx <br> **Deployment Mode:** Cluster <br> **Description:** In case of a Foxxmaster failover, jobs in state `'progress'` are not reset to `'pending'` to restart execution. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** 3.4.10, 3.5.5, 3.6.1 <br> **Reference:** [arangodb/arangodb#10800](https://github.com/arangodb/arangodb/pull/10800) | +| **Date Added:** 2020-04-23 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** The creation of example graphs fails if `--cluster.min-replication-factor` is set to a value greater than 1, because the system attempts to create the collections with a replication factor of 1 despite the higher minimum. <br> **Affected Versions:** 3.6.x <br> **Fixed in Versions:** 3.6.4 <br> **Reference:** [arangodb/arangodb#11487](https://github.com/arangodb/arangodb/pull/11487) | +| **Date Added:** 2020-05-18 <br> **Component:** all arangod / arangosh based programs & tools <br> **Deployment Mode:** All <br> **Description:** When using the `--config` option to set the configuration file location the ArangoDB C++ binaries check for `<filename>.local` among other paths. If this path happens to be a directory then the expected configuration cannot be read, resulting in an early exit. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x <br> **Fixed in Versions:** 3.4.11, 3.5.6, 3.6.4 <br> **Reference:** [arangodb/arangodb#11632](https://github.com/arangodb/arangodb/pull/11632) | +| **Date Added:** 2020-06-19 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** When inserting edges into an edge collection of a SmartGraph, the auto-generated `_rev` values for the ingoing and outgoing part of the edge may differ. This can be confusing when querying the `_rev` values of the edges later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.5, 3.7.1 <br> **Reference:** N/A | +| **Date Added:** 2020-06-30 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** Changing the collection properties of a smart edge collection did not propagate the changes to child collections for the `waitForSync`, `cacheEnabled` and `schema` attributes. This has been fixed in 3.7.1 for new smart edge collections, created with 3.7.1 or later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.7.1 <br> **Reference:** [arangodb/arangodb#12065](https://github.com/arangodb/arangodb/pull/12065) | +| **Date Added:** 2020-07-31 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The API tab of Foxx services does not render the Swagger UI interface. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.5.6, 3.6.6, 3.7.1 <br> **Reference:** [arangodb/arangodb#12297](https://github.com/arangodb/arangodb/issues/12297) | +| **Date Added:** 2020-07-31 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The web interface confirms the creation of an index, but then displays an error `404: Not Found` despite of a successful index creation. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.6, 3.7.1 <br> **Reference:** [arangodb/arangodb#12248](https://github.com/arangodb/arangodb/issues/12248) | +| **Date Added:** 2020-08-12 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The web interface may show inconsistent results, such as an empty view for a collection with documents while displaying a document count higher than 0, if nginx or Cloudflare proxying with HTTP 2 is used. The Chrome developer console logs the following error when it occurs: `Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR`. Version 3.7.0 and above resolve the problem indirectly because of server-side support for the HTTP/2 protocol. <br> **Affected Versions:** 3.6.x <br> **Fixed in Versions:** 3.7.0 <br> **Reference:** [arangodb/arangodb#11636](https://github.com/arangodb/arangodb/issues/11636) | +| **Date Added:** 2020-11-20 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The value of the startup option `--network.io-threads` is clamped to `1`. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.10, 3.7.5 <br> **Reference:** [arangodb/arangodb#13051](https://github.com/arangodb/arangodb/issues/13051) | +| **Date Added:** 2020-11-20 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The `Www-Authenticate` header is not set for HTTP 401 responses as required by the HTTP specification, despite the documentation claiming this behavior. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.8.0 <br> **Reference:** [arangodb/arangodb#13001](https://github.com/arangodb/arangodb/issues/13001) | +| **Date Added:** 2020-12-10 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** A _database not found_ error may occur in a setup with multiple Coordinators when the list of slow queries is accessed or cleared directly after a new database has been created. <br> **Affected Versions:** 3.6.10, 3.7.5 <br> **Fixed in Versions:** 3.6.11, 3.7.6 <br> **Reference:** [arangodb/arangodb#13190](https://github.com/arangodb/arangodb/issues/13190) | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | +| **Date Added:** 2021-04-19 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Deadlocks may occur with transactions that acquire exclusive transaction locks in cluster deployments (Stream Transactions and JavaScript transactions with `{ "collections": { "exclusive": […] } }`, AQL queries with `OPTIONS { exclusive: true }`). If two or more exclusive transactions touch data on different DB-Servers from one another, then they may get executed in parallel, thus being exclusive only at DB-Server level and not cluster-wide. Depending on what subsequent operations are performed, the transactions can potentially lock each other so that neither can make progress anymore. They will eventually expire due to idle timeout. <br> **Affected Versions:** 3.6.x <br> **Fixed in Versions:** 3.7.0 <br> **Reference:** [BTS-331](https://arangodb.atlassian.net/browse/BTS-331) (internal) | +| **Date Added:** 2021-07-20 <br> **Component:** Replication <br> **Deployment Mode:** Cluster <br> **Description:** The synchronous replication protocol used in cluster deployments has a flaw that can cause follower shards to lag behind the leader shards for extended periods of time, without detecting that the synchronization is delayed. While uncommon to occur, it can lead to inconsistencies between replicas that may cause follow-up issues. It is important to upgrade 3.6.x deployments to at least **3.6.15** and 3.7.x deployments to **3.7.13** and to **set and keep the supervision in maintenance mode** during the whole upgrade process in case of **manual cluster deployments**. For **ArangoDB Starter cluster deployments**, make sure to use at least version **0.15.0-1** of the starter. In case of **Kubernetes-operated clusters**, make sure to use at least version **1.2.0** of `kube-arangodb`. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.15, 3.7.13 <br> **Reference:** [Technical Alert #6](https://www.arangodb.com/alerts/tech06/) | diff --git a/site/content/arangodb/oem/release-notes/version-3.6/whats-new-in-3-6.md b/site/content/arangodb/oem/release-notes/version-3.6/whats-new-in-3-6.md new file mode 100644 index 0000000000..b25cb21b69 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.6/whats-new-in-3-6.md @@ -0,0 +1,872 @@ +--- +title: Features and Improvements in ArangoDB 3.6 +menuTitle: What's New in 3.6 +weight: 5 +description: >- + Multiple performance improvements to AQL queries, dynamic search expressions, + a new cluster deployment mode +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.6. ArangoDB 3.6 also contains several bug fixes that are not listed +here. + +## AQL + +### Early pruning of non-matching documents + +Previously, AQL queries with filter conditions that could not be satisfied by +any index required all documents to be copied from the storage engine into the +AQL scope in order to be fed into the filter. + +An example query execution plan for such query from ArangoDB 3.5 looks like this: + +```aql +Query String (75 chars, cacheable: true): + FOR doc IN test FILTER doc.value1 > 9 && doc.value2 == 'test854' RETURN doc + +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 100000 - FOR doc IN test /* full collection scan */ + 3 CalculationNode 100000 - LET #1 = ((doc.`value1` > 9) && (doc.`value2` == "test854")) + 4 FilterNode 100000 - FILTER #1 + 5 ReturnNode 100000 - RETURN doc +``` + +ArangoDB 3.6 adds an optimizer rule `move-filters-into-enumerate` which allows +applying the filter condition directly while scanning the documents, so copying +of any documents that don't match the filter condition can be avoided. + +The query execution plan for the above query from 3.6 with that optimizer rule +applied looks as follows: + +```aql +Query String (75 chars, cacheable: true): + FOR doc IN test FILTER doc.value1 > 9 && doc.value2 == 'test854' RETURN doc + +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 100000 - FOR doc IN test /* full collection scan */ FILTER ((doc.`value1` > 9) && (doc.`value2` == "test854")) /* early pruning */ + 5 ReturnNode 100000 - RETURN doc +``` + +Note that in this execution plan the scanning and filtering are combined in one +node, so the copying of all non-matching documents from the storage engine into +the AQL scope is completely avoided. + +This optimization will be beneficial if the filter condition is very selective +and will filter out many documents, and if documents are large. In this case a +lot of copying will be avoided. + +The optimizer rule also works if an index is used, but there are also filter +conditions that cannot be satisfied by the index alone. Here is a 3.5 query +execution plan for a query using a filter on an indexed value plus a filter on +a non-indexed value: + +```aql +Query String (101 chars, cacheable: true): + FOR doc IN test FILTER doc.value1 > 10000 && doc.value1 < 30000 && doc.value2 == 'test854' RETURN + doc + +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 6 IndexNode 26666 - FOR doc IN test /* hash index scan */ + 7 CalculationNode 26666 - LET #1 = (doc.`value2` == "test854") + 4 FilterNode 26666 - FILTER #1 + 5 ReturnNode 26666 - RETURN doc + +Indexes used: + By Name Type Collection Unique Sparse Selectivity Fields Ranges + 6 idx_1649353982658740224 hash test false false 100.00 % [ `value1` ] ((doc.`value1` > 10000) && (doc.`value1` < 30000)) +``` + +In 3.6, the same query will be executed using a combined index scan & filtering +approach, again avoiding any copies of non-matching documents: + +```aql +Query String (101 chars, cacheable: true): + FOR doc IN test FILTER doc.value1 > 10000 && doc.value1 < 30000 && doc.value2 == 'test854' RETURN + doc + +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 6 IndexNode 26666 - FOR doc IN test /* hash index scan */ FILTER (doc.`value2` == "test854") /* early pruning */ + 5 ReturnNode 26666 - RETURN doc + +Indexes used: + By Name Type Collection Unique Sparse Selectivity Fields Ranges + 6 idx_1649353982658740224 hash test false false 100.00 % [ `value1` ] ((doc.`value1` > 10000) && (doc.`value1` < 30000)) +``` + +### Subquery Splicing Optimization + +In earlier versions of ArangoDB, on every execution of a subquery the following +happened for each input row: + +- The subquery tree issues one initializeCursor cascade through all nodes +- The subquery node pulls rows until the subquery node is empty for this input + +On subqueries with many results per input row (10000 or more) the above steps +did not contribute significantly to query execution time. On subqueries with +few results per input, there was a serious performance impact. + +Subquery splicing inlines the execution of subqueries using an optimizer rule +called `splice-subqueries`. Only suitable queries can be spliced. +A subquery becomes unsuitable if it contains a `LIMIT` node or a +`COLLECT WITH COUNT INTO …` construct (but not due to a +`COLLECT var = <expr> WITH COUNT INTO …`). A subquery *also* becomes +unsuitable if it is contained in a (sub)query containing unsuitable parts +*after* the subquery. + +Consider the following query to illustrate the difference. + +```aql +FOR x IN c1 + LET firstJoin = ( + FOR y IN c2 + FILTER y._id == x.c2_id + LIMIT 1 + RETURN y + ) + LET secondJoin = ( + FOR z IN c3 + FILTER z.value == x.value + RETURN z + ) + RETURN { x, firstJoin, secondJoin } +``` + +The execution plan **without** subquery splicing: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 0 - FOR x IN c1 /* full collection scan */ + 9 SubqueryNode 0 - LET firstJoin = ... /* subquery */ + 3 SingletonNode 1 * ROOT + 18 IndexNode 0 - FOR y IN c2 /* primary index scan */ + 7 LimitNode 0 - LIMIT 0, 1 + 8 ReturnNode 0 - RETURN y + 15 SubqueryNode 0 - LET secondJoin = ... /* subquery */ + 10 SingletonNode 1 * ROOT + 11 EnumerateCollectionNode 0 - FOR z IN c3 /* full collection scan */ + 12 CalculationNode 0 - LET #11 = (z.`value` == x.`value`) /* simple expression */ /* collections used: z : c3, x : c1 */ + 13 FilterNode 0 - FILTER #11 + 14 ReturnNode 0 - RETURN z + 16 CalculationNode 0 - LET #13 = { "x" : x, "firstJoin" : firstJoin, "secondJoin" : secondJoin } /* simple expression */ /* collections used: x : c1 */ + 17 ReturnNode 0 - RETURN #13 + +Optimization rules applied: + Id RuleName + 1 use-indexes + 2 remove-filter-covered-by-index + 3 remove-unnecessary-calculations-2 +``` + +Note in particular the `SubqueryNode`s, followed by a `SingletonNode` in +both cases. + +When using the optimizer rule `splice-subqueries` the plan is as follows: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateCollectionNode 0 - FOR x IN c1 /* full collection scan */ + 9 SubqueryNode 0 - LET firstJoin = ... /* subquery */ + 3 SingletonNode 1 * ROOT + 18 IndexNode 0 - FOR y IN c2 /* primary index scan */ + 7 LimitNode 0 - LIMIT 0, 1 + 8 ReturnNode 0 - RETURN y + 19 SubqueryStartNode 0 - LET secondJoin = ( /* subquery begin */ + 11 EnumerateCollectionNode 0 - FOR z IN c3 /* full collection scan */ + 12 CalculationNode 0 - LET #11 = (z.`value` == x.`value`) /* simple expression */ /* collections used: z : c3, x : c1 */ + 13 FilterNode 0 - FILTER #11 + 20 SubqueryEndNode 0 - ) /* subquery end */ + 16 CalculationNode 0 - LET #13 = { "x" : x, "firstJoin" : firstJoin, "secondJoin" : secondJoin } /* simple expression */ /* collections used: x : c1 */ + 17 ReturnNode 0 - RETURN #13 + +Optimization rules applied: + Id RuleName + 1 use-indexes + 2 remove-filter-covered-by-index + 3 remove-unnecessary-calculations-2 + 4 splice-subqueries +``` + +The first subquery is unsuitable for the optimization because it contains +a `LIMIT` statement and is therefore not spliced. The second subquery is +suitable and hence is spliced – which one can tell from the different node +type `SubqueryStartNode` (beginning of spliced subquery). Note how it is +not followed by a `SingletonNode`. The end of the spliced subquery is +marked by a `SubqueryEndNode`. + +### Late document materialization (RocksDB) + +With the _late document materialization_ optimization ArangoDB tries to +read only documents that are absolutely necessary to compute the query result, +reducing load to the storage engine. This is only supported for the RocksDB +storage engine. + +In 3.6 the optimization can only be applied to queries retrieving data from a +collection or an ArangoSearch View and that contain a `SORT`+`LIMIT` +combination. + +For the collection case the optimization is possible if and only if: +- there is an index of type `primary`, `hash`, `skiplist`, `persistent` + or `edge` picked by the optimizer +- all attribute accesses can be covered by indexed attributes + +```aql +// Given we have a persistent index on attributes [ "foo", "bar", "baz" ] +FOR d IN myCollection + FILTER d.foo == "someValue" // hash index will be picked to optimize filtering + SORT d.baz DESC // field "baz" will be read from index + LIMIT 100 // only 100 documents will be materialized + RETURN d +``` + +For the ArangoSearch View case the optimization is possible if and only if: +- all attribute accesses can be covered by attributes stored in the View index + (e.g. using `primarySort`) +- the primary sort order optimization is not applied, because it voids the need + for late document materialization + +```aql +// Given primarySort is {"field": "foo", "asc": false}, i.e. +// field "foo" covered by index but sort optimization not applied +// (sort order of primarySort and SORT operation mismatch) +FOR d IN myView + SORT d.foo + LIMIT 100 // only 100 documents will be materialized + RETURN d +``` + +```aql +// Given primarySort contains field "foo" +FOR d IN myView + SEARCH d.foo == "someValue" + SORT BM25(d) DESC // BM25(d) will be evaluated by the View node above + LIMIT 100 // only 100 documents will be materialized + RETURN d +``` + +```aql +// Given primarySort contains fields "foo" and "bar", and "bar" is not the +// first field or at least not sorted by in descending order, i.e. the sort +// optimization cannot be applied but the late document materialization instead +FOR d IN myView + SEARCH d.foo == "someValue" + SORT d.bar DESC // field "bar" will be read from the View + LIMIT 100 // only 100 documents will be materialized + RETURN d +``` + +The respective optimizer rules are called `late-document-materialization` +(collection source) and `late-document-materialization-arangosearch` +(ArangoSearch View source). If applied, you will find `MaterializeNode`s +in [execution plans](../../aql/execution-and-performance/query-optimization.md#execution-nodes). + +### Parallelization of cluster AQL queries + +ArangoDB 3.6 can parallelize work in many cluster AQL queries when there are +multiple DB-Servers involved. The parallelization is done in the +*GatherNode*, which then can send parallel cluster-internal requests to the +DB-Servers attached. The DB-Servers can then work fully parallel +for the different shards involved. + +When parallelization is used, one or multiple *GatherNode*s in a query's +execution plan will be tagged with `parallel` as follows: + +```aql + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 2 EnumerateCollectionNode DBS 1000000 - FOR doc IN test /* full collection scan, 5 shard(s) */ + 6 RemoteNode COOR 1000000 - REMOTE + 7 GatherNode COOR 1000000 - GATHER /* parallel */ + 3 ReturnNode COOR 1000000 - RETURN doc +``` + +Parallelization is currently restricted to certain types and parts of queries. +*GatherNode*s will go into parallel mode only if the DB-Server query part +above it (in terms of query execution plan layout) is a terminal part of the +query. To trigger the optimization, there must not be other nodes of type +*ScatterNode*, *GatherNode* or *DistributeNode* present in the query. + +Please note that the parallelization of AQL execution may lead to a different +resource usage pattern for eligible AQL queries in the cluster. In isolation, +queries are expected to complete faster with parallelization than when executing +their work serially on all involved DB-Servers. However, working on +multiple DB-Servers in parallel may also mean that more work than before +is happening at the very same time. If this is not desired because of resource +scarcity, there are options to control the parallelization: + +The startup option `--query.parallelize-gather-writes` can be used to control +whether eligible write operation parts will be parallelized. This option +defaults to `true`, meaning that eligible write operations are also parallelized +by default. This can be turned off so that potential I/O overuse can be avoided +for write operations when used together with a high replication factor. + +Additionally, the startup option `--query.optimizer-rules` can be used to +globally toggle the usage of certain optimizer rules for all queries. +By default, all optimizations are turned on. However, specific optimizations +can be turned off using the option. + +For example, to turn off the parallelization entirely (including parallel +gather writes), one can use the following configuration: + +``` +--query.optimizer-rules "-parallelize-gather" +``` + +This toggle works for any other non-mandatory optimizer rules as well. +To specify multiple optimizer rules, the option can be used multiple times, e.g. + +``` +--query.optimizer-rules "-parallelize-gather" --query.optimizer-rules "-splice-subqueries" +``` + +You can overrule which optimizer rules to use or not use on a per-query basis +still. `--query.optimizer-rules` merely defines a default. However, +`--query.parallelize-gather-writes false` turns off parallel gather writes +completely and it cannot be re-enabled for individual queries. + +### Optimizations for simple UPDATE and REPLACE queries + +Cluster query execution plans for simple `UPDATE` and `REPLACE` queries that +modify multiple documents and do not use `LIMIT` are now more efficient as +several steps were removed. The existing optimizer rule +`undistribute-remove-after-enum-coll` has been extended to cover these cases +too, in case the collection is sharded by `_key` and the `UPDATE`/`REPLACE` +operation is using the full document or the `_key` attribute to find it. + +For example, a query such as: + +```aql +FOR doc IN test UPDATE doc WITH { updated: true } IN test +``` + +… is executed as follows in 3.5: + +```aql + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 CalculationNode DBS 1 - LET #3 = { "updated" : true } + 2 EnumerateCollectionNode DBS 1000000 - FOR doc IN test /* full collection scan, 5 shard(s) */ + 11 RemoteNode COOR 1000000 - REMOTE + 12 GatherNode COOR 1000000 - GATHER + 5 DistributeNode COOR 1000000 - DISTRIBUTE /* create keys: false, variable: doc */ + 6 RemoteNode DBS 1000000 - REMOTE + 4 UpdateNode DBS 0 - UPDATE doc WITH #3 IN test + 7 RemoteNode COOR 0 - REMOTE + 8 GatherNode COOR 0 - GATHER +``` + +In 3.6 the execution plan is streamlined to just: + +```aql + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 3 CalculationNode DBS 1 - LET #3 = { "updated" : true } + 13 IndexNode DBS 1000000 - FOR doc IN test /* primary index scan, index only, projections: `_key`, 5 shard(s) */ + 4 UpdateNode DBS 0 - UPDATE doc WITH #3 IN test + 7 RemoteNode COOR 0 - REMOTE + 8 GatherNode COOR 0 - GATHER /* parallel */ +``` + +As can be seen above, the benefit of applying the optimization is that the extra +communication between the Coordinator and DB-Server is removed. This will +mean less cluster-internal traffic and thus can result in faster execution. +As an extra benefit, the optimization will also make the affected queries +eligible for parallel execution. It is only applied in cluster deployments. + +The optimization will also work when a filter is involved: + +```aql +Query String (79 chars, cacheable: false): + FOR doc IN test FILTER doc.value == 4 UPDATE doc WITH { updated: true } IN test + +Execution plan: + Id NodeType Site Est. Comment + 1 SingletonNode DBS 1 * ROOT + 5 CalculationNode DBS 1 - LET #5 = { "updated" : true } + 2 EnumerateCollectionNode DBS 1000000 - FOR doc IN test /* full collection scan, projections: `_key`, `value`, 5 shard(s) */ + 3 CalculationNode DBS 1000000 - LET #3 = (doc.`value` == 4) + 4 FilterNode DBS 1000000 - FILTER #3 + 6 UpdateNode DBS 0 - UPDATE doc WITH #5 IN test + 9 RemoteNode COOR 0 - REMOTE + 10 GatherNode COOR 0 - GATHER +``` + +### AQL Date functionality + +AQL now enforces a valid date range for working with date/time in AQL. +The valid date ranges for any AQL date/time function are: + +- for string date/time values: `"0000-01-01T00:00:00.000Z"` (including) up to + `"9999-12-31T23:59:59.999Z"` (including) +- for numeric date/time values: -62167219200000 (including) up to 253402300799999 + (including). These values are the numeric equivalents of + `"0000-01-01T00:00:00.000Z"` and `"9999-12-31T23:59:59.999Z"`. + +Any date/time values outside the given range that are passed into an AQL date +function will make the function return `null` and trigger a warning in the +query, which can optionally be escalated to an error and stop the query. + +Any date/time operations that produce date/time outside the valid ranges stated +above will make the function return `null` and trigger a warning too. +An example for this is: + +```aql +DATE_SUBTRACT("2018-08-22T10:49:00+02:00", 100000, "years") +``` + +The performance of AQL date operations that work on +[date strings](../../aql/functions/date.md) has been improved +compared to previous versions. + +Finally, ArangoDB 3.6 provides a new [AQL function](../../aql/functions/date.md#date_round) +`DATE_ROUND()` to bin a date/time into a set of equal-distance buckets. + +### Miscellaneous AQL changes + +In addition, ArangoDB 3.6 provides the following new AQL functionality: + +- a function `GEO_AREA()` for [area calculations](../../aql/functions/geo.md#geo_area) + (also added to v3.5.1) + +- a [`maxRuntime` query option](../../aql/how-to-invoke-aql/with-arangosh.md#maxruntime) + to restrict the execution to a given time in seconds (also added to v3.5.4). + Also see [HTTP interfaces for AQL queries](../../develop/http-api/queries/aql-queries.md#create-a-cursor). + +- a startup option `--query.optimizer-rules` to turn certain AQL query optimizer + rules off (or on) by default. This can be used to turn off certain optimizations + that would otherwise lead to undesired changes in server resource usage patterns. + +## ArangoSearch + +### Analyzers + +- Added UTF-8 support and ability to mark beginning/end of the sequence to + the [`ngram` Analyzer type](../../index-and-search/analyzers.md#ngram). + + The following optional properties can be provided for an `ngram` Analyzer + definition: + + - `startMarker` : `<string>`, default: ""\ + this value will be prepended to _n_-grams at the beginning of input sequence + + - `endMarker` : `<string>`, default: ""\ + this value will be appended to _n_-grams at the beginning of input sequence + + - `streamType` : `"binary"|"utf8"`, default: "binary"\ + type of the input stream (support for UTF-8 is new) + +- Added _edge n-gram_ support to the [`text` Analyzer type](../../index-and-search/analyzers.md#text). + The input gets tokenized as usual, but then _n_-grams are generated from each + token. UTF-8 encoding is assumed (whereas the `ngram` Analyzer has a + configurable stream type and defaults to binary). + + The following optional properties can be provided for a `text` + Analyzer definition: + + - `edgeNgram` (object, _optional_): + - `min` (number, _optional_): minimal _n_-gram length + - `max` (number, _optional_): maximal _n_-gram length + - `preserveOriginal` (boolean, _optional_): include the original token + if its length is less than *min* or greater than *max* + +### Dynamic search expressions with arrays + +ArangoSearch now accepts [SEARCH expressions](../../aql/high-level-operations/search.md#syntax) +with array comparison operators in the form of: + +``` +<array> [ ALL|ANY|NONE ] [ <=|<|==|!=|>|>=|IN ] doc.<attribute> +``` + +i.e. the left-hand side operand is always an array, which can be dynamic. + +```aql +LET tokens = TOKENS("some input", "text_en") // ["some", "input"] +FOR doc IN myView SEARCH tokens ALL IN doc.title RETURN doc // dynamic conjunction +FOR doc IN myView SEARCH tokens ANY IN doc.title RETURN doc // dynamic disjunction +FOR doc IN myView SEARCH tokens NONE IN doc.title RETURN doc // dynamic negation +FOR doc IN myView SEARCH tokens ALL > doc.title RETURN doc // dynamic conjunction with comparison +FOR doc IN myView SEARCH tokens ANY <= doc.title RETURN doc // dynamic disjunction with comparison +``` + +In addition, both the `TOKENS()` and the `PHRASE()` functions were +extended with array support for convenience. + +[TOKENS()](../../aql/functions/string.md#tokens) accepts recursive arrays of +strings as the first argument: + +```aql +TOKENS("quick brown fox", "text_en") // [ "quick", "brown", "fox" ] +TOKENS(["quick brown", "fox"], "text_en") // [ ["quick", "brown"], ["fox"] ] +TOKENS(["quick brown", ["fox"]], "text_en") // [ ["quick", "brown"], [["fox"]] ] +``` + +In most cases you will want to flatten the resulting array for further usage, +because nested arrays are not accepted in `SEARCH` statements such as +`<array> ALL IN doc.<attribute>`: + +```aql +LET tokens = TOKENS(["quick brown", ["fox"]], "text_en") // [ ["quick", "brown"], [["fox"]] ] +LET tokens_flat = FLATTEN(tokens, 2) // [ "quick", "brown", "fox" ] +FOR doc IN myView SEARCH ANALYZER(tokens_flat ALL IN doc.title, "text_en") RETURN doc +``` + +[PHRASE()](../../aql/functions/arangosearch.md#phrase) accepts an array as the +second argument: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, ["quick brown fox"], "text_en") RETURN doc +FOR doc IN myView SEARCH PHRASE(doc.title, ["quick", "brown", "fox"], "text_en") RETURN doc + +LET tokens = TOKENS("quick brown fox", "text_en") // ["quick", "brown", "fox"] +FOR doc IN myView SEARCH PHRASE(doc.title, tokens, "text_en") RETURN doc +``` + +It is equivalent to the more cumbersome and static form: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, "quick", 0, "brown", 0, "fox", "text_en") RETURN doc +``` + +You can optionally specify the number of _skipTokens_ in the array form before +every string element: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, ["quick", 1, "fox", "jumps"], "text_en") RETURN doc +``` + +It is the same as the following: + +```aql +FOR doc IN myView SEARCH PHRASE(doc.title, "quick", 1, "fox", 0, "jumps", "text_en") RETURN doc +``` + +### SmartJoins and Views + +ArangoSearch Views are now eligible for [SmartJoins](../../develop/smartjoins.md) in AQL, +provided that their underlying collections are eligible too. + +All collections forming the View must be sharded equally. The other join +operand can be a collection or another View. + +## OneShard + +{{< tag "ArangoDB Enterprise Edition" "AMP" >}} + +Not all use cases require horizontal scalability. In such cases, a OneShard +deployment offers a practicable solution that enables significant performance +improvements by massively reducing cluster-internal communication. + +A database created with OneShard enabled is limited to a single DB-Server node +but still replicated synchronously to ensure resilience. This configuration +allows running transactions with ACID guarantees on shard leaders. + +This setup is highly recommended for most graph use cases and join-heavy +queries. + +Unlike a (flexibly) sharded cluster, where the Coordinator distributes access +to shards across different DB-Server nodes, collects and processes partial +results, the Coordinator in a OneShard setup moves the query execution directly +to the respective DB-Server for local query execution. The Coordinator receives +only the final result. This can drastically reduce resource consumption and +communication effort for the Coordinator. + +An entire cluster, selected databases or selected collections can be made +eligible for the OneShard optimization. See [OneShard cluster architecture](../../deploy/oneshard.md) +for details and usage examples. + +## HTTP API + +The following APIs have been expanded / changed: + +- [Database creation API](../../develop/http-api/databases.md#create-a-database),\ + HTTP route `POST /_api/database` + + The database creation API now handles the `replicationFactor`, `writeConcern` + and `sharding` attributes. All these attributes are optional, and only + meaningful in a cluster. + + The values provided for the attributes `replicationFactor` and `writeConcern` + will be used as default values when creating collections in that database, + allowing to omit these attributes when creating collections. However, the + values set here are just defaults for new collections in the database. + The values can still be adjusted per collection when creating new collections + in that database via the web UI, the arangosh or drivers. + + In an Enterprise Edition cluster, the `sharding` attribute can be given a + value of `"single"`, which will make all new collections in that database use + the same shard distribution and use one shard by default (OneShard + configuration). This can still be overridden by setting the values of + `numberOfShards` and `distributeShardsLike` when creating new collections in + that database via the web UI, arangosh or drivers (unless the startup option + `--cluster.force-one-shard` is enabled). + +- [Database properties API](../../develop/http-api/databases.md#get-information-about-the-current-database),\ + HTTP route `GET /_api/database/current` + + The database properties endpoint returns the new additional attributes + `replicationFactor`, `writeConcern` and `sharding` in a cluster. + A description of these attributes can be found above. + +- [Collection](../../develop/http-api/collections.md) / [Graph APIs](../../develop/http-api/graphs/named-graphs.md#management),\ + HTTP routes `POST /_api/collection`, `GET /_api/collection/{collection-name}/properties` + and various `/_api/gharial/*` endpoints + + `minReplicationFactor` has been renamed to `writeConcern` for consistency. + The old attribute name is still accepted and returned for compatibility. + +- [Hot Backup API](../../develop/http-api/hot-backups.md#create-a-backup),\ + HTTP route `POST /_admin/backup/create` + + New attribute `force`, see [Hot Backup](#hot-backup) below. + +- New [Metrics API](../../develop/http-api/monitoring/metrics.md#metrics-api),\ + HTTP route `GET /_admin/metrics` + + Returns the instance's current metrics in Prometheus format. The returned + document collects all instance metrics, which are measured at any given + time and exposes them for collection by Prometheus. + + The new endpoint can be used instead of the additional tool + [arangodb-exporter](https://github.com/arangodb-helper/arangodb-exporter). + +## Web interface + +The web interface now shows the shards of all collections (including system +collections) in the shard distribution view. Displaying system collections here +is necessary to access the prototype collections of a collection sharded via +`distributeShardsLike` in case the prototype is a system collection, and the +prototype collection shall be moved to another server using the web interface. + +The web interface now also allows setting a default replication factor when a +creating a new database. This default replication factor will be used for all +collections created in the new database, unless explicitly overridden. + +## Startup options + +### Metrics API option + +The new [option](../../components/arangodb-server/options.md#--serverexport-metrics-api) +`--server.export-metrics-api` allows you to disable the metrics API by setting +it to `false`, which is otherwise turned on by default. + +### OneShard cluster option + +The [option](../../components/arangodb-server/options.md#--clusterforce-one-shard) +`--cluster.force-one-shard` enables the new OneShard feature for the entire +cluster deployment. It forces the cluster into creating all future collections +with only a single shard and using the same DB-Server as these collections' +shards leader. All collections created this way will be eligible for specific +AQL query optimizations that can improve query performance and provide advanced +transactional guarantees. + +### Cluster upgrade option + +The new [option](../../components/arangodb-server/options.md#--clusterupgrade) `--cluster.upgrade` +toggles the cluster upgrade mode for Coordinators. It supports the following +values: + +- `auto`: + perform a cluster upgrade and shut down afterwards if the startup option + `--database.auto-upgrade` is set to true. Otherwise, don't perform an upgrade. + +- `disable`: + never perform a cluster upgrade, regardless of the value of + `--database.auto-upgrade`. + +- `force`: + always perform a cluster upgrade and shut down, regardless of the value of + `--database.auto-upgrade`. + +- `online`: + always perform a cluster upgrade but don't shut down afterwards + +The default value is `auto`. The option only affects Coordinators. It does not +have any affect on single servers, Agents or DB-Servers. + +### Other cluster options + +The following [options](../../components/arangodb-server/options.md#cluster) have been added: + +- `--cluster.max-replication-factor`: maximum replication factor for new + collections. A value of `0` means that there is no restriction. + The default value is `10`. + +- `--cluster.min-replication-factor`: minimum replication factor for new + collections. The default value is `1`. This option can be used to prevent the + creation of collections that do not have any or enough replicas. + +- `--cluster.write-concern`: default write concern value used for new + collections. This option controls the number of replicas that must + successfully acknowledge writes to a collection. If any write operation gets + less acknowledgements than configured here, the collection will go into + read-only mode until the configured number of replicas are available again. + The default value is `1`, meaning that writes to just the leader are + sufficient. To ensure that there is at least one extra copy (i.e. one + follower), set this option to `2`. + +- `--cluster.max-number-of-shards`: maximum number of shards allowed for new + collections. A value of `0` means that there is no restriction. + The default value is `1000`. + +Note that the above options only have an effect when set for Coordinators, and +only for collections that are created after the options have been set. They do +not affect already existing collections. + +Furthermore, the following network related [options](../../components/arangodb-server/options.md#network) +have been added: + +- `--network.idle-connection-ttl`: default time-to-live for idle cluster-internal + connections (in milliseconds). The default value is `60000`. + +- `--network.io-threads`: number of I/O threads for cluster-internal network + requests. The default value is `2`. + +- `--network.max-open-connections`: maximum number of open network connections + for cluster-internal requests. The default value is `1024`. + +- `--network.verify-hosts`: if set to `true`, this will verify peer certificates + for cluster-internal requests when TLS is used. The default value is `false`. + +### RocksDB exclusive writes option + +The new option `--rocksdb.exclusive-writes` allows to make all writes to the +RocksDB storage exclusive and therefore avoids write-write conflicts. +This option was introduced to open a way to upgrade from MMFiles to RocksDB +storage engine without modifying client application code. Otherwise it should +best be avoided as the use of exclusive locks on collections will introduce a +noticeable throughput penalty. + +Note that the MMFiles engine is deprecated +from v3.6.0 on and will be removed in a future release. So will be this option, +which is a stopgap measure only. + +### AQL options + +The new startup option `--query.optimizer-rules` can be used to to selectively +enable or disable AQL query optimizer rules by default. The option can be +specified multiple times, and takes the same input as the query option of the +same name. + +For example, to turn off the rule `use-indexes-for-sort`, use + +``` +--query.optimizer-rules "-use-indexes-for-sort" +``` + +The purpose of this [startup option](../../components/arangodb-server/options.md#--queryoptimizer-rules) +is to be able to enable potential future experimental optimizer rules, which +may be shipped in a disabled-by-default state. + +## Hot Backup + +- Force Backup + + When creating backups there is an additional option `--force` for + [arangobackup](../../components/tools/arangobackup/examples.md) and in the HTTP API. + This option **aborts** ongoing write transactions to obtain the global lock + for creating the backup. Most likely this is _not_ what you want to do + because it will abort valid ongoing write operations, but it makes sure that + backups can be acquired more quickly. The force flag currently only aborts + [Stream Transactions](../../develop/http-api/transactions/stream-transactions.md) but no + [JavaScript Transactions](../../develop/http-api/transactions/javascript-transactions.md). + +- View Data + + HotBackup now includes View data. Previously the Views had to be rebuilt + after a restore. Now the Views are available immediately. + +## TLS v1.3 + +Added support for TLS 1.3 for the [arangod server](../../components/arangodb-server/options.md#--sslprotocol) +and the client tools (also added to v3.5.1). + +The arangod server can be started with option `--ssl.protocol 6` to make it require +TLS 1.3 for incoming client connections. The server can be started with option +`--ssl.protocol 5` to make it require TLS 1.2, as in previous versions of arangod. + +The default TLS protocol for the arangod server is now generic TLS +(`--ssl.protocol 9`), which will allow the negotiation of the TLS version between +the client and the server. + +All client tools also support TLS 1.3, by using the `--ssl.protocol 6` option when +invoking them. The client tools will use TLS 1.2 by default, in order to be +compatible with older versions of ArangoDB that may be contacted by these tools. + +To configure the TLS version for arangod instances started by the ArangoDB starter, +one can use the `--all.ssl.protocol=VALUE` startup option for the ArangoDB starter, +where VALUE is one of the following: + +- 4 = TLSv1 +- 5 = TLSv1.2 +- 6 = TLSv1.3 +- 9 = generic TLS + +Note: TLS v1.3 support has been added in ArangoDB v3.5.1 already, but the default TLS +version in ArangoDB 3.5 was still TLS v1.2. ArangoDB v3.6 uses "generic TLS" as its +default TLS version, which will allows clients to negotiate the TLS version with the +server, dynamically choosing the **highest** mutually supported version of TLS. + +## Miscellaneous + +- Remove operations for documents in the cluster will now use an optimization, + if all sharding keys are specified. Should the sharding keys not match the + values in the actual document, a not found error will be returned. + +- [Collection names](../../concepts/data-structure/collections.md#collection-names) + in ArangoDB can now be up to 256 characters long, instead of 64 characters in + previous versions. + +- Disallow using `_id` or `_rev` as shard keys in clustered collections. + + Using these attributes for sharding was not supported before, but didn't trigger + any errors. Instead, collections were created and silently using `_key` as + the shard key, without making the caller aware of that an unsupported shard + key was used. + +- Make the scheduler enforce the configured queue lengths. The values of the + options `--server.scheduler-queue-size`, `--server.prio1-size` and + `--server.maximal-queue-size` will now be honored and not exceeded. + + The default queue sizes in the scheduler for requests buffering have + also been changed as follows: + + ``` + request type before now + ----------------------------------- + high priority 128 4096 + medium priority 1048576 4096 + low priority 4096 4096 + ``` + + The queue sizes can still be adjusted at server start using the above- + mentioned startup options. + +## Internal + +Release packages for Linux are now built using inter-procedural +optimizations (IPO). + +We have moved from C++14 to C++17, which allows us to use some of the +simplifications, features and guarantees that this standard has in stock. +To compile ArangoDB 3.6 from source, a compiler that supports C++17 is now +required. + +The bundled JEMalloc memory allocator used in ArangoDB release packages has +been upgraded from version 5.2.0 to version 5.2.1. + +The bundled version of the Boost library has been upgraded from 1.69.0 to +1.71.0. + +The bundled version of xxhash has been upgraded from 0.5.1 to 0.7.2. diff --git a/site/content/arangodb/oem/release-notes/version-3.7/_index.md b/site/content/arangodb/oem/release-notes/version-3.7/_index.md new file mode 100644 index 0000000000..1ef24612b2 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.7/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.7 +menuTitle: Version 3.7 +weight: 92 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.7/api-changes-in-3-7.md b/site/content/arangodb/oem/release-notes/version-3.7/api-changes-in-3-7.md new file mode 100644 index 0000000000..47ad299929 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.7/api-changes-in-3-7.md @@ -0,0 +1,240 @@ +--- +title: API Changes in ArangoDB 3.7 +menuTitle: API changes in 3.7 +weight: 20 +description: >- + A summary of the changes to the HTTP API and other interfaces that are relevant + for developers, like maintainers of drivers and integrations for ArangoDB +--- +## UTF-8 validation + +The ArangoDB server will now perform more strict UTF-8 string validation for +incoming JSON and VelocyPack data. Attribute names or string attribute values +with incorrectly encoded UTF-8 sequences will be rejected by default, and +incoming requests containing such invalid data will be responded to with errors +by default. + +In case an ArangoDB deployment already contains UTF-8 data from previous +versions, this will be a breaking change. For this case, there is the startup +option `--server.validate-utf8-strings` which can be set to `false` in order to +ensure operability until any invalid UTF-8 string data has been fixed. + +## Metrics + +The following existing metrics for monitoring that are exposed via the HTTP +REST endpoint `/_admin/metrics` have been renamed in ArangoDB 3.7: + +- `agency_agent_read_no_leader` +- `agency_agent_read_ok` +- `agency_agent_write_hist` +- `agency_agent_write_no_leader` +- `agency_agent_write_ok` + +The new names are: + +- `arangodb_agency_agent_read_no_leader` +- `arangodb_agency_agent_read_ok` +- `arangodb_agency_agent_write_hist` +- `arangodb_agency_agent_write_no_leader` +- `arangodb_agency_agent_write_ok` + +This change was made to put the metrics into the "arangodb" namespace, so +that metrics from different systems can unambiguously combined into a single +monitoring system. + +The REST endpoint `/_admin/metrics` also returns additional metrics in 3.7, +compared to the list of metrics that it returned in 3.6. + +## HTTP RESTful API + +### Privilege changes + +The access privileges for the REST API endpoint at `/_admin/cluster/numberOfServers` +can now be controlled via the `--server.harden` startup option. The behavior is +as follows: + +- for HTTP GET requests, all authenticated users can access the API if `--server.harden` + is `false` (which is the default). +- for HTTP GET requests, only admin users can access the API if `--server.harden` + is `true`. This is a change compared to previous versions. +- for HTTP PUT requests, only admin users can access the API, regardless of the value + of `--server.harden`. + +### Endpoints API return value changes + +The REST API endpoint at `/_api/cluster/endpoints` will now return HTTP 501 (Not +implemented) on single server instead of HTTP 403 (Forbidden), which it returned +previously. + +When invoked via the PUT HTTP verb with an empty JSON object, the REST API +endpoint at `/_admin/cluster/numberOfServers` will now return with the +following response body: + +```json +{"error":false,"code":200} +``` + +In previous releases, calling that endpoint with an empty JSON object as +the request body returned a JSON response that was just `true`. + +### Precondition failed error message changes + +The REST API endpoints for updating, replacing and removing documents using a +revision ID guard value now may return a different error message string in case +the document exists on the server with a revision ID value other than the +specified one. The API still returns HTTP 412, and ArangoDB error code 1200 as +previously, but the error message string in the `errorMessage` return value +attribute may change from "precondition failed" to "conflict", +"write-write conflict" or other values. + +### REST endpoints added + +The following REST API endpoints have been added in 3.7: + +- HTTP POST `/_admin/server/tls`: this endpoint can be used to change the + TLS keyfile (secret key as well as public certificates) at run time. The API + basically makes the `arangod` server reload the keyfile from disk. +- HTTP POST `/_admin/server/jwt`: can be used to + [reload the JWT secrets](../../develop/http-api/authentication.md#hot-reload-jwt-secrets) + of a local arangod process without having to restart it (hot-reload). + This may be used to roll out new JWT secrets throughout an ArangoDB cluster. + This endpoint is available only in the Enterprise Edition. +- HTTP POST `/_admin/server/encryption` can be used to + [reload the user-supplied key(s)](../../develop/http-api/security.md#encryption-at-rest) + used for encryption at rest, after they have been changed on disk. + This endpoint is available only in the Enterprise Edition. + +Using these endpoints requires superuser privileges. + +### REST endpoints augmented + +The REST API endpoint for inserting documents at POST `/_api/document/<collection>` +will now handle the URL parameter `overwriteMode`. + +This URL parameter supports the following values: + +- `"ignore"`: if a document with the specified `_key` value exists already, + nothing will be done and no write operation will be carried out. The + insert operation will return success in this case. This mode does not + support returning the old document version using the `returnOld` + attribute. `returnNew` will only set the `new` attribute in the response + if a new document was inserted. +- `"replace"`: if a document with the specified `_key` value exists already, + it will be overwritten with the specified document value. This mode will + also be used when no overwrite mode is specified but the `overwrite` + flag is set to `true`. +- `"update"`: if a document with the specified `_key` value exists already, + it will be patched (partially updated) with the specified document value. +- `"conflict"`: if a document with the specified `_key` value exists already, + return a unique constraint violation error so that the insert operation + fails. This is also the default behavior in case the overwrite mode is + not set, and the *overwrite* flag is *false* or not set either. + +If `overwriteMode` is not set, the behavior is as follows: + +- if the `overwrite` URL parameter is not set, the insert will implicitly + use the `"conflict"` overwrite mode, i.e. the insert will fail in case of a + primary key unique constraint violation. +- if the `overwrite` URL parameter is set to true, the insert will implicitly + use the `"replace"` overwrite mode, i.e. the insert will replace the existing + document in case a primary key unique constraint violation occurs. + +The main use case of inserting documents with overwrite mode `"ignore"` is +to make sure that certain documents exist in the cheapest possible way. +In case the target document already exists, the `"ignore"` mode is most +efficient, as it will not retrieve the existing document from storage and +not write any updates to it. + +Note that operations with `overwrite` or `overwriteMode` parameter require +a `_key` attribute in the request payload, therefore they can only be performed +on collections sharded by `_key`. + +The REST API endpoints for creating collections at POST `/_api/collection` as well +as listing and changing collection properties at PUT/GET +`/_api/collection/<collection>/properties` will now make use of the additional +attribute `schema`. The attribute can be used so specify document schema +validation at collection level. See +[Schema Validation](../../concepts/data-structure/documents/schema-validation.md). + +The REST API endpoint for creating a graph at POST `/_api/gharial` is now able +to accept the string value `"satellite"` as an option parameter for the +attribute `replicationFactor`. Only numeric values were allowed before. Setting +the `replicationFactor` to `"satellite"` will lead to a SatelliteGraph being +created. SatelliteGraph creation will ignore the option parameters +`numberOfShards`, `minReplicationFactor` and `writeConcern`, as all of them +will be set automatically. Additionally, the REST API endpoint for reading the +graph definitions of all graphs at GET `GET /_api/gharial` or a graph +definition of a single graph at `/_api/gharial/{graph}` will include an +additional boolean attribute called `isSatellite`. + +The REST API endpoint for creating a graph at POST `/_api/gharial` accepts a +new boolean parameter `isDisjoint`. In combination with `smartGraphAttribute` +it allows to create the newly introduced graph type **Disjoint SmartGraph**. +`isDisjoint` defaults to `false`, which will create a regular **SmartGraph**. +Additionally, the REST API endpoint for reading the graph definitions of all +graphs at GET `/_api/gharial` or a graph definition of a single graph at +GET `/_api/gharial/{graph}` will include an additional boolean attribute +called `isDisjoint` in case of **Disjoint SmartGraphs**. + +The REST endpoint `/_admin/metrics` also returns additional metrics in 3.7, +compared to the list of metrics that it returned in 3.6. + +### REST endpoints moved + +The following existing REST APIs have moved in ArangoDB 3.7 to improve API +naming consistency: + +- the endpoint at `/_admin/clusterNodeVersion` is now merely redirecting requests + to the `/_admin/cluster/nodeVersion` endpoint. The new endpoint will handle + incoming requests in the same way the old endpoint did. +- the endpoint at `/_admin/clusterNodeEngine` is now merely redirecting requests + to the endpoint `/_admin/cluster/nodeEngine`. The new endpoint will handle + incoming requests in the same way the old endpoint did. +- the endpoint at `/_admin/clusterNodeStats` is now merely redirecting requests + to the endpoint `/_admin/cluster/nodeStatistics`. The new endpoint will handle + incoming requests in the same way the old endpoint did. +- the endpoint at `/_admin/clusterStatistics` is now merely redirecting requests + to the endpoint `/_admin/cluster/statistics`. The new endpoint will handle + incoming requests in the same way the old endpoint did. + +The above endpoints are part of ArangoDB's exposed REST API, however, they are +not supposed to be called directly by drivers or client + +### REST endpoints removed + +The REST API endpoint at `/_admin/aql/reload` has been removed in ArangoDB 3.7. +There is no necessity to call this endpoint from a driver or a client application +directly. + +The REST API endpoint at `/_api/collection/<collection>/rotate` has been removed +in ArangoDB 3.7. This endpoint was previously only available for the MMFiles +storage engine, but not for the RocksDB storage engine. + +## JavaScript API + +### Functions removed + +The `rotate` function has been removed on the ArangoCollection object. This +means the following JavaScript code will not work in ArangoDB 3.7, neither in +the ArangoShell nor in arangod (when using Foxx): + +```js +db.<collection>.rotate(); +``` + +The `rotate` function was previously only supported for the MMFiles storage +engine, but not for the RocksDB storage engine. + +## ArangoDB Server Environment Variables + +### Variables added + +The following [ArangoDB Server environment variables](../../components/arangodb-server/environment-variables.md) +have been added: + +- `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` can be used to override the + automatic detection of the total amount of RAM present on the system. +- `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` can be used to override the + automatic detection of the number of CPU cores present on the system. +- `ARANGODB_OVERRIDE_CRASH_HANDLER` can be used to toggle the presence + of the built-in crash handler on Linux deployments. diff --git a/site/content/arangodb/oem/release-notes/version-3.7/incompatible-changes-in-3-7.md b/site/content/arangodb/oem/release-notes/version-3.7/incompatible-changes-in-3-7.md new file mode 100644 index 0000000000..c63aa14292 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.7/incompatible-changes-in-3-7.md @@ -0,0 +1,241 @@ +--- +title: Incompatible changes in ArangoDB 3.7 +menuTitle: Incompatible changes in 3.7 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## MMFiles storage engine + +This version of ArangoDB does not contain the MMFiles storage engine anymore. In +ArangoDB 3.7, the only available storage engine is the RocksDB storage engine, +which is the default storage engine in ArangoDB since version 3.4. The MMFiles +storage engine had been deprecated since the release of ArangoDB 3.6. + +Any deployments that use the MMFiles storage engine will need to migrate to the +RocksDB storage engine using ArangoDB 3.6 (or earlier versions) in order to upgrade +to ArangoDB 3.7. + +All storage engine selection functionality has also been removed from the ArangoDB +package installers. The RocksDB storage engine will be selected automatically for +any new deployments created with ArangoDB 3.7. + +A side effect of this change is that any MMFiles-specific startup options lose +their functionality in 3.7. This affects all startup options starting with `--wal.`, +which could be used in earlier versions of ArangoDB to configure the write-ahead +log of the MMFiles storage engine. Another option that is now non-functional is +the MMFiles-specific `--database.journal-size` startup option, which previously +controlled the size of journal files for the MMFiles engine. +Using these options in ArangoDB 3.7 is not an error, meaning that the server can +still be started if any of these options are specified. Nevertheless using these +options does not have any effect. + +## ArangoSearch + +The stemming library Snowball was updated, bringing a breaking change to Analyzers: + +There is a 33rd letter in the Russian alphabet, `ё` (`e"`), but it is rarely used +and often replaced by `е` in informal writing. The original algorithm assumed it +had already been mapped to `е` (`e`), but now it actively translates this character +if the locale is set to Russian language. + +## AQL + +The memory usage reported by AQL queries may now be slightly higher in 3.7 than in +previous versions of ArangoDB. This is not due to queries using more memory in 3.7, +but due to a change in the memory accounting code, which is slightly more accurate +now. + +For cluster AQL queries the memory usage now is now tracked on a per-server basis +and not on a per-shard basis as in previous versions of ArangoDB. +These changes can affect queries that set a memory limit via the query options +or are employing a global limit via the `--query.memory-limit` option. It may be +required to raise the configured memory limit value in either client applications +or the ArangoDB configuration to take these changes into account. + +The number of HTTP requests reported for cluster AQL queries now also includes the +requests for deploying the queries to the database servers. These requests weren't +tracked in previous versions of ArangoDB. + +## UTF-8 validation + +The ArangoDB server will now perform more strict UTF-8 string validation for +incoming JSON and VelocyPack data. Attribute names or string attribute values +with incorrectly encoded UTF-8 sequences will be rejected by default, and +incoming requests containing such invalid data will be responded to with errors +by default. + +In case an ArangoDB deployment already contains UTF-8 data from previous +versions, this will be a breaking change. For this case, there is the startup +option `--server.validate-utf8-strings` which can be set to `false` in order to +ensure operability until any invalid UTF-8 string data has been fixed. + +## Requests statistics + +Previous versions of ArangoDB excluded all requests made to the web interface at +`/_admin/aardvark` from the requests statistics if the request was made for the +`_system` database. Requests for all other endpoints or requests to the same +endpoint for any non-system database were already counted. +ArangoDB 3.7 now treats all incoming requests to the web interface in the same +way as requests to other endpoints, so the request counters may show higher +values in 3.7 than before in case the web interface was used a lot on the +`_system` database. + +This change in behavior was also backported to ArangoDB v3.6.5. + +## Client tools + +_arangodump_ and _arangorestore_ will now fail when using the `--collection` +option and none of the specified collections actually exist in the database (on dump) +or in the dump to restore (on restore). In case only some of the specified collections +exist, _arangodump_ / _arangorestore_ will issue warnings about the invalid collections, +but will continue to work for the valid collections. + +## Metrics + +The following existing metrics for monitoring that are exposed via the HTTP +REST endpoint `/_admin/metrics` have been renamed in ArangoDB 3.7: + +- `agency_agent_read_no_leader` +- `agency_agent_read_ok` +- `agency_agent_write_hist` +- `agency_agent_write_no_leader` +- `agency_agent_write_ok` + +The new names are: + +- `arangodb_agency_agent_read_no_leader` +- `arangodb_agency_agent_read_ok` +- `arangodb_agency_agent_write_hist` +- `arangodb_agency_agent_write_no_leader` +- `arangodb_agency_agent_write_ok` + +This change was made to put the metrics into the "arangodb" namespace, so +that metrics from different systems can unambiguously combined into a single +monitoring system. + +## HTTP RESTful API + +### Privilege changes + +The access privileges for the REST API endpoint at `/_admin/cluster/numberOfServers` +can now be controlled via the `--server.harden` startup option. The behavior is +as follows: + +- for HTTP GET requests, all authenticated users can access the API if `--server.harden` + is `false` (which is the default). +- for HTTP GET requests, only admin users can access the API if `--server.harden` + is `true`. This is a change compared to previous versions. +- for HTTP PUT requests, only admin users can access the API, regardless of the value + of `--server.harden`. + +### Endpoints API return value changes + +The REST API endpoint at `/_api/cluster/endpoints` will now return HTTP 501 (Not +implemented) on single server instead of HTTP 403 (Forbidden), which it returned +previously. + +When invoked via the PUT HTTP verb with an empty JSON object, the REST API +endpoint at `/_admin/cluster/numberOfServers` will now return with the +following response body: + +```json +{"error":false,"code":200} +``` + +In previous releases, calling that endpoint with an empty JSON object as +the request body returned a JSON response that was just `true`. + +### Precondition failed error message changes + +The REST API endpoints for updating, replacing and removing documents using a +revision ID guard value now may return a different error message string in case +the document exists on the server with a revision ID value other than the +specified one. The API still returns HTTP 412, and ArangoDB error code 1200 as +previously, but the error message string in the `errorMessage` return value +attribute may change from "precondition failed" to "conflict", +"write-write conflict" or other values. + +### Endpoints moved + +The following existing REST APIs have moved in ArangoDB 3.7 to improve API +naming consistency: + +- the endpoint at `/_admin/clusterNodeVersion` is now merely redirecting requests + to the `/_admin/cluster/nodeVersion` endpoint. The new endpoint will handle + incoming requests in the same way the old endpoint did. +- the endpoint at `/_admin/clusterNodeEngine` is now merely redirecting requests + to the endpoint `/_admin/cluster/nodeEngine`. The new endpoint will handle + incoming requests in the same way the old endpoint did. +- the endpoint at `/_admin/clusterNodeStats` is now merely redirecting requests + to the endpoint `/_admin/cluster/nodeStatistics`. The new endpoint will handle + incoming requests in the same way the old endpoint did. +- the endpoint at `/_admin/clusterStatistics` is now merely redirecting requests + to the endpoint `/_admin/cluster/statistics`. The new endpoint will handle + incoming requests in the same way the old endpoint did. + +The above endpoints are part of ArangoDB's exposed REST API, however, they are +not supposed to be called directly by drivers or client + +### Endpoints removed + +The REST API endpoint at `/_admin/aql/reload` has been removed in ArangoDB 3.7. +There is no necessity to call this endpoint from a driver or a client application +directly. + +The REST API endpoint at `/_api/collection/<collection>/rotate` has been removed +in ArangoDB 3.7. This endpoint was previously only available for the MMFiles +storage engine, but not for the RocksDB storage engine. + +## JavaScript API + +The `rotate` function has been removed on the ArangoCollection object. This +means the following JavaScript code will not work in ArangoDB 3.7, neither in +the ArangoShell nor in arangod (when using Foxx): + +```js +db.<collection>.rotate(); +``` + +The `rotate` function was previously only supported for the MMFiles storage +engine, but not for the RocksDB storage engine. + +## DC2DC + +The replication in DC2DC deployments relies on a message queue and ArangoSync +supported two different message queue systems up to and including version +0.7.2. **Support for Kafka is dropped in ArangoSync v1.0.0** and the built-in +DirectMQ remains as sole message queue system. + +If you rely on Kafka, then you must use an ArangoSync 0.x version. ArangoDB +v3.7 ships with ArangoSync 1.x, so be sure to keep the old binary or download +a compatible version for your deployment. ArangoSync 1.x is otherwise +compatible with ArangoDB v3.3 and above. + +## Memory usage + +Coordinators and DB-Servers in a cluster will need memory for buffering Agency +data in their local caches. The memory usage for these caches should be proportional +to the total number of database objects (databases, collections, shards, indexes, +views) in the cluster. + +## Startup options + +The default values for the startup options `--rocksdb.block-cache-size` and +`--rocksdb.total-write-buffer-size` have been decreased for systems with less +than 4GiB of RAM. The intention is to make arangod use less memory on very +small systems. + +For systems with less than 4GiB of RAM, the default values for +`--rocksdb.block-cache-size` are now: + +- 512MiB for systems with between 2 and 4GiB of RAM. +- 256MiB for systems with between 1 and 2GiB of RAM. +- 128MiB for systems with less than 1GiB of RAM. + +For systems with less than 4GiB of RAM, the default values for +`--rocksdb.total-write-buffer-size` are now: + +- 512MiB for systems with between 1 and 4GiB of RAM. +- 256MiB for systems with less than 1GiB of RAM. diff --git a/site/content/arangodb/oem/release-notes/version-3.7/known-issues-in-3-7.md b/site/content/arangodb/oem/release-notes/version-3.7/known-issues-in-3-7.md new file mode 100644 index 0000000000..1033a77745 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.7/known-issues-in-3-7.md @@ -0,0 +1,81 @@ +--- +title: Known Issues in ArangoDB 3.7 +menuTitle: Known Issues in 3.7 +weight: 10 +description: >- + Important issues affecting the 3.7.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by ArangoSearch view may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in ArangoSearch View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | +| **Date Added:** 2020-05-22 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** The immediate recreation of ArangoSearch Analyzers in cluster deployments (deleting and shortly after creating one with the same name but different properties) causes errors in queries which involve such recreated Analyzers. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.0, 3.7.0-1 <br> **Fixed in Versions:** 3.7.1-alpha.1 <br> **Reference:** [arangodb/backlog#669](https://github.com/arangodb/backlog/issues/669) (internal), [arangodb/backlog#695](https://github.com/arangodb/backlog/issues/695) (internal) | +| **Date Added:** 2020-06-16 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The creation of Views in databases other than `_system` fails if the current user has no access to the default database. This is caused by the system which attempts to read from the global `_analyzers` collection without checking permissions first. <br> **Affected Versions:** 3.7.0 <br> **Fixed in Versions:** 3.7.1 <br> **Reference:** [arangodb/backlog#669](https://github.com/arangodb/backlog/issues/669) (internal), [arangodb/arangodb#11849](https://github.com/arangodb/arangodb/pull/11849) | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** AQL queries with subqueries or joins in SEARCH expressions may return incorrect results. As a workaround, you can disable the optimizer rule which causes the problem with the following query options: `{ optimizer: { rules: [ "-inline-subqueries" ] } }` <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#12247](https://github.com/arangodb/arangodb/issues/12247) | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `STARTS_WITH()` and `PHRASE()` ArangoSearch functions don't accept an array of prefixes / phrase parts as intended. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#741](https://github.com/arangodb/backlog/issues/741) (internal), [arangodb/backlog#738](https://github.com/arangodb/backlog/issues/738) (internal) | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `LEVENSHTEIN_MATCH()` ArangoSearch function incorrectly calculates the Damerau-Levenshtein distance if the distance is greater than 4 and pure Levenshtein distance is requested. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** 3.7.2 <br> **Reference:** [arangodb/backlog#731](https://github.com/arangodb/backlog/issues/731) (internal) | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Wildcard searches like `"%a%b_c%"` may not match all indexed terms (e.g. `"aQWEQbbQcDDDFS"`). <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** 3.7.2 <br> **Reference:** [arangodb/backlog#732](https://github.com/arangodb/backlog/issues/732) (internal) | + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | +| **Date Added:** 2020-07-22 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** When explicitly destroying an AQL Cursor created with `stream: true` in a cluster deployment, the server does not reply (the request hangs forever). <br> **Affected Versions:** 3.6.x, 3.7.0 <br> **Fixed in Versions:** 3.7.1 <br> **Reference:** [BTS-126](https://arangodb.atlassian.net/browse/BTS-126) (internal) | +| **Date Added:** 2021-03-24 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** Queries can crash the server if the `splice-subqueries` optimization is applied and a sub-query has no results. Disabling said optimization via the query option `{ "optimizer": { "rules": [ "-splice-subqueries" ] } }` avoids the problem. <br> **Affected Versions:** 3.7.6 - 3.7.10 <br> **Fixed in Versions:** 3.7.11 <br> **Reference:** [arangodb/arangodb#13702](https://github.com/arangodb/arangodb/issues/13702) | +| **Date Added:** 2021-04-19 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** User-defined variable names in AQL cannot start with an underscore, in contrast to what the AQL documentation claimed. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.9.0 <br> **Reference:** [arangodb/arangodb#13513](https://github.com/arangodb/arangodb/issues/13513) | +| **Date Added:** 2021-05-25 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** Global and per-query memory limits are not enforced for AQL graph traversals. Such queries may thus cause out-of-memory issues as they will not be killed despite exceeding the configured `--query.memory-limit` or Cursor API `memoryLimit`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-411](https://arangodb.atlassian.net/browse/BTS-411) (internal) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-08-06 <br> **Component:** Coordinator <br> **Deployment Mode:** Cluster <br> **Description:** Restoring a hot backup to another deployment that has databases with the same names as in the backup can cause these databases to become inaccessible on Coordinators. They can be listed with `db._databases()` in arangosh, but not accessed using `db._useDatabase()`. <br> **Affected Versions:** 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.7.14, 3.8.1 <br> **Reference:** [BTS-527](https://arangodb.atlassian.net/browse/BTS-527) (internal) | + +## Schema Validation + +| Issue | +|------------| +| **Date Added:** 2019-03-17 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** The schema validation cannot pin-point which part of a rule made it fail. This is under investigation but very hard to solve for complex schemas. For example, when using `not` and `anyOf`, this would result in trees of possible errors. For now users should fall back to tools like [jsonschemavalidator.net](https://www.jsonschemavalidator.net/) <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-03-17 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** Remote schemas are not supported for security reasons. This limitation will likely remain unfixed. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-06-25 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** When using arangorestore for a collection with a defined schema, schema validation is not executed. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-24 <br> **Component:** Web UI <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Master/Slave mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-04-03 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Updating the properties of a collection in the cluster may return before the properties are updated consistently on all shards. This is especially visible when setting a schema for a collection with multiple shards, and then instantly starting to store non-conforming documents into the collection. These may be accepted until the properties change has been fully propagated to all shards. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-04-23 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** The creation of example graphs fails if `--cluster.min-replication-factor` is set to a value greater than 1, because the system attempts to create the collections with a replication factor of 1 despite the higher minimum. <br> **Affected Versions:** 3.6.x, 3.7.0, 3.7.0-1 <br> **Fixed in Versions:** 3.6.4, 3.7.1-alpha.1 <br> **Reference:** [arangodb/arangodb#11487](https://github.com/arangodb/arangodb/pull/11487) | +| **Date Added:** 2020-06-19 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** When inserting edges into an edge collection of a SmartGraph, the auto-generated `_rev` values for the ingoing and outgoing part of the edge may differ. This can be confusing when querying the `_rev` values of the edges later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.5, 3.7.1 <br> **Reference:** N/A | +| **Date Added:** 2020-06-30 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** Changing the collection properties of a smart edge collection did not propagate the changes to child collections for the `waitForSync`, `cacheEnabled` and `schema` attributes. This has been fixed in 3.7.1 for new smart edge collections, created with 3.7.1 or later. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.7.1 <br> **Reference:** [arangodb/arangodb#12065](https://github.com/arangodb/arangodb/pull/12065) | +| **Date Added:** 2020-07-31 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The API tab of Foxx services does not render the Swagger UI interface. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.6, 3.7.1 <br> **Reference:** [arangodb/arangodb#12297](https://github.com/arangodb/arangodb/issues/12297) | +| **Date Added:** 2020-07-31 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** The web interface confirms the creation of an index, but then displays an error `404: Not Found` despite of a successful index creation. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.6, 3.7.1 <br> **Reference:** [arangodb/arangodb#12248](https://github.com/arangodb/arangodb/issues/12248) | +| **Date Added:** 2020-07-31 <br> **Component:** arangosync <br> **Deployment Mode:** DC2DC <br> **Description:** No JWT rotation takes place with the included arangosync (v0.7.8). If ArangoDB rotates the JWT secret, arangosync processes must be restarted (with the new JWT secret for ArangoDB) if Datacenter-to-Datacenter Replication is required. That may trigger full resync. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** 3.6.6, 3.7.2 <br> **Reference:** N/A | +| **Date Added:** 2020-07-31 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** The included ArangoDB Starter version does not support JWT secret rotation. In addition, there is no way to set the arangod option `server.jwt-secret-keyfile` (via option pass-through capability of the Starter) because the Starter either ignores it (if no `--auth.jwt-secret` was used) or blocks it with an error (_Pass through option --server.jwt-secret-keyfile conflicts with automatically generated option with value_). <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-124](https://arangodb.atlassian.net/browse/BTS-124) (internal) | +| **Date Added:** 2020-07-31 <br> **Component:** arangosync <br> **Deployment Mode:** DC2DC <br> **Description:** A OneShard cluster deployment can currently not be combined with Datacenter-to-Datacenter Replication. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-11-20 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The value of the startup option `--network.io-threads` is clamped to `1`. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.10, 3.7.5 <br> **Reference:** [arangodb/arangodb#13051](https://github.com/arangodb/arangodb/issues/13051) | +| **Date Added:** 2020-11-20 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The `Www-Authenticate` header is not set for HTTP 401 responses as required by the HTTP specification, despite the documentation claiming this behavior. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.8.0 <br> **Reference:** [arangodb/arangodb#13001](https://github.com/arangodb/arangodb/issues/13001) | +| **Date Added:** 2020-12-10 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** A _database not found_ error may occur in a setup with multiple Coordinators when the list of slow queries is accessed or cleared directly after a new database has been created. <br> **Affected Versions:** 3.6.10, 3.7.5 <br> **Fixed in Versions:** 3.6.11, 3.7.6 <br> **Reference:** [arangodb/arangodb#13190](https://github.com/arangodb/arangodb/issues/13190) | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | +| **Date Added:** 2021-07-20 <br> **Component:** Replication <br> **Deployment Mode:** Cluster <br> **Description:** The synchronous replication protocol used in cluster deployments has a flaw that can cause follower shards to lag behind the leader shards for extended periods of time, without detecting that the synchronization is delayed. While uncommon to occur, it can lead to inconsistencies between replicas that may cause follow-up issues. It is important to upgrade 3.6.x deployments to at least **3.6.15** and 3.7.x deployments to **3.7.13** and to **set and keep the supervision in maintenance mode** during the whole upgrade process in case of **manual cluster deployments**. For **ArangoDB Starter cluster deployments**, make sure to use at least version **0.15.0-1** of the starter. In case of **Kubernetes-operated clusters**, make sure to use at least version **1.2.0** of `kube-arangodb`. <br> **Affected Versions:** 3.6.x, 3.7.x <br> **Fixed in Versions:** 3.6.15, 3.7.13 <br> **Reference:** [Technical Alert #6](https://www.arangodb.com/alerts/tech06/) | +| **Date Added:** 2022-01-31 <br> **Component:** ArangoSync, SmartGraphs <br> **Deployment Mode:** DC2DC <br> **Description:** In a DC2DC replication scenario, when you try to replicate a Disjoint Smartgraph, the sync of collections may get stuck. <br> **Affected Versions:** 3.7.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-737](https://arangodb.atlassian.net/browse/BTS-737) (internal) | diff --git a/site/content/arangodb/oem/release-notes/version-3.7/whats-new-in-3-7.md b/site/content/arangodb/oem/release-notes/version-3.7/whats-new-in-3-7.md new file mode 100644 index 0000000000..f366ab69c1 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.7/whats-new-in-3-7.md @@ -0,0 +1,1004 @@ +--- +title: Features and Improvements in ArangoDB 3.7 +menuTitle: What's New in 3.7 +weight: 5 +description: >- + Extended search features and index utilization, document schema validation, + replicated and disjoint managed graphs, security features +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.7. ArangoDB 3.7 also contains several bug fixes that are not listed +here. + +## ArangoSearch + +### Wildcard search + +ArangoSearch was extended to support the `LIKE()` function and `LIKE` operator +in AQL. This allows to check whether the given search pattern is contained in +specified attribute using wildcard matching (`_` for any single character and +`%` for any sequence of characters including none): + +```aql +FOR doc IN viewName + SEARCH ANALYZER(LIKE(doc.text, "foo%b_r"), "text_en") + // or + SEARCH ANALYZER(doc.text LIKE "foo%b_r", "text_en") + // will match "foobar", "fooANYTHINGbor" etc. + RETURN doc.text +``` + +See [ArangoSearch functions](../../aql/functions/arangosearch.md#like) + +### Covering Indexes + +It is possible to directly store the values of document attributes in View +indexes now via a new View property `storedValues` (not to be confused with +the existing `storeValues`). + +View indexes may fully cover `SEARCH` queries for improved performance. +While late document materialization reduces the amount of fetched documents, +this new optimization can avoid to access the storage engine entirely. + +```json +{ + "links": { + "articles": { + "fields": { + "categories": {} + } + } + }, + "primarySort": [ + { "field": "publishedAt", "direction": "desc" } + ], + "storedValues": [ + { "fields": [ "title", "categories" ] } + ], + ... +} +``` + +In above View definition, the document attribute *categories* is indexed for +searching, *publishedAt* is used as primary sort order and *title* as well as +*categories* are stored in the View using the new `storedValues` property. + +```aql +FOR doc IN articlesView + SEARCH doc.categories == "recipes" + SORT doc.publishedAt DESC + RETURN { + title: doc.title, + date: doc.publishedAt, + tags: doc.categories + } +``` + +The query searches for articles which contain a certain tag in the *categories* +array and returns title, date and tags. All three values are stored in the View +(`publishedAt` via `primarySort` and the two other via `storedValues`), thus +no documents need to be fetched from the storage engine to answer the query. +This is shown in the execution plan as a comment to the *EnumerateViewNode*: +`/* view query without materialization */` + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 EnumerateViewNode 1 - FOR doc IN articlesView SEARCH (doc.`categories` == "recipes") SORT doc.`publishedAt` DESC LET #1 = doc.`publishedAt` LET #7 = doc.`categories` LET #5 = doc.`title` /* view query without materialization */ + 5 CalculationNode 1 - LET #3 = { "title" : #5, "date" : #1, "tags" : #7 } /* simple expression */ + 6 ReturnNode 1 - RETURN #3 + +Indexes used: + none + +Optimization rules applied: + Id RuleName + 1 move-calculations-up + 2 move-calculations-up-2 + 3 handle-arangosearch-views +``` + +See [ArangoSearch Views](../../index-and-search/arangosearch/arangosearch-views-reference.md#view-properties). + +### Stemming support for more languages + +The Snowball library was updated to the latest version 2, adding stemming +support for the following languages: + +- Arabic (`ar`) +- Basque (`eu`) +- Catalan (`ca`) +- Danish (`da`) +- Greek (`el`) +- Hindi (`hi`) +- Hungarian (`hu`) +- Indonesian (`id`) +- Irish (`ga`) +- Lithuanian (`lt`) +- Nepali (`ne`) +- Romanian (`ro`) +- Serbian (`sr`) +- Tamil (`ta`) +- Turkish (`tr`) + +Create a custom Analyzer and set the `locale` accordingly in the properties, +e.g. `"el.utf-8"` for Greek. _arangosh_ example: + +```js +var analyzers = require("@arangodb/analyzers"); + +analyzers.save("text_el", "text", { + locale: "el.utf-8", + stemming: true, + case: "lower", + accent: false, + stopwords: [] +}, ["frequency", "norm", "position"]); + +db._query(`RETURN TOKENS("αυτοκινητουσ πρωταγωνιστούσαν", "text_el")`) +// [ [ "αυτοκινητ", "πρωταγωνιστ" ] ] +``` + +Also see [Analyzers: Supported Languages](../../index-and-search/analyzers.md#supported-languages) + +### Condition Optimization Option + +The `SEARCH` operation in AQL accepts a new option `conditionOptimization` to +give users control over the search criteria optimization: + +```aql +FOR doc IN myView + SEARCH doc.val > 10 AND doc.val > 5 /* more conditions */ + OPTIONS { conditionOptimization: "none" } + RETURN doc +``` + +By default, all conditions get converted into disjunctive normal form (DNF). +Numerous optimizations can be applied, like removing redundant or overlapping +conditions (such as `doc.val > 10` which is included by `doc.val > 5`). +However, converting to DNF and optimizing the conditions can take quite some +time even for a low number of nested conditions which produce dozens of +conjunctions / disjunctions. It can be faster to just search the index without +optimizations. + +See [SEARCH operation](../../aql/high-level-operations/search.md#search-options). + +### Primary Sort Compression Option + +There is a new option `primarySortCompression` which can be set on View +creation to enable or disable the compression of the primary sort data: + +```json +{ + "primarySort": [ + { "field": "date", "direction": "desc" }, + { "field": "title", "direction": "asc" } + ], + "primarySortCompression": "none", + ... +} +``` + +It defaults to LZ4 compression (`"lz4"`), which was already used in ArangoDB +v3.5 and v3.6. Set it to `"none"` on View creation to trade space for speed. + +See [ArangoSearch Views](../../index-and-search/arangosearch/arangosearch-views-reference.md#view-properties). + +## SatelliteGraphs + +When doing joins involving graph traversals, shortest path or k-shortest paths +computation in an ArangoDB cluster, data has to be exchanged between different +servers. In particular graph traversals are usually executed on a Coordinator, +because they need global information. This results in a lot of network traffic +and potentially slow query execution. + +SatelliteGraphs are the natural extension of the concept of +SatelliteCollections to graphs. All of the usual benefits and caveats apply. +SatelliteGraphs are synchronously replicated to all DB-Servers that are part +of a cluster, which enables DB-Servers to execute graph traversals locally. +This includes (k-)shortest path(s) computation and possibly joins with +traversals and greatly improves performance for such queries. + +[SatelliteGraphs](../../graphs/satellitegraphs/_index.md) +are only available in the Enterprise Edition. + +## Disjoint SmartGraphs + +SmartGraphs have been extended with a new option `isDisjoint`. +A Disjoint SmartGraph prohibits edges connecting different SmartGraph +components. If your graph doesn't need edges between vertices with different +SmartGraph attribute values, then you should enable this option. This topology +restriction allows the query optimizer to improve traversal execution times, +because in many cases the execution can be pushed down to a single DB-Server. + +[Disjoint SmartGraphs](../../graphs/smartgraphs/_index.md) +are only available in the Enterprise Edition. + +## AQL + +### Subquery optimizations + +The execution process of AQL has been refactored internally. This especially +pays off in subqueries. It will allow for more optimizations and better +batching of requests. + +The first stage of this refactoring has been part of 3.6 already where some +subqueries have gained a significant performance boost. 3.7 takes the next step +in this direction. AQL can now combine skipping and producing of outputs in a +single call, so all queries with a LIMIT offset or the fullCount option enabled +will benefit from this change straight away. This also holds true for subqueries, +hence the existing AQL optimizer rule `splice-subqueries` is now able to +optimize all subqueries and is enabled by default. + +The query planner can now also reuse internal registers that were allocated for +storing temporary results inside subqueries, but not outside of subqueries. + +### Count optimizations + +Subqueries can now use an optimized code path for counting documents if they +are supposed to only return the number of matching documents. +The optimization will be triggered for read-only subqueries that use a full +collection scan or an index scan, without any additional filtering on document +attributes (early pruning or document post-filtering) and without using LIMIT. + +The optimization will help in the following situation (in case `subCollection` +is an edge collection): + +```aql +FOR doc IN collection + LET count = COUNT( + FOR sub IN subCollection + FILTER sub._from == doc._id + RETURN sub + ) + ... +``` + +The restrictions are that the subquery result must only be used with the +`COUNT`/`LENGTH` AQL function and not for anything else. The subquery itself +must be read-only (no data-modification subquery), not use nested FOR loops, +no LIMIT clause and no FILTER condition or calculation that requires +accessing document data. Accessing index data is supported for filtering (as +in the above example that would use the edge index), but not for further +calculations. + +In case a subquery does not match these criteria, it will not use the +optimized code path for counting, but will execute normally. + +If the optimization is triggered, it will show up in the query execution +plan under the rule name `optimize-count`, and the subquery's FOR loop will +be marked with a `with count optimization` tag. + +### Traversal optimizations + +Graph traversal performance is improved via some internal code refactoring: + +- Traversal cursors are reused instead of recreated from scratch, if possible. + This can save lots of calls to the memory management subsystem. +- Unnecessary checks have been removed from the cursors, by ensuring some + invariants beforehand. +- Each vertex lookup needs to perform slightly less work. + +The traversal speedups observed by these changes alone were around 8 to 10% for +single-server traversals and traversals in OneShard setups. Cluster traversals +will also benefit from these changes, but to a lesser extent. This is because +the network roundtrips have a higher share of the total query execution times there. + +Traversal performance can be further improved by not fetching the visited vertices +from the storage engine in case the traversal query does not refer to them. +For example, in the query: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'collection/startVertex' edges + RETURN e +``` + +…the vertex variable (`v`) is never accessed, making it unnecessary to fetch the +vertices from storage. If this optimization is applied, the traversal node will be +marked with `/* vertex optimized away */` in the query's execution plan output. +Unused edge and path variables (`e` and `p`) were already optimized away in +previous versions by the `optimize-traversals` optimizer rule. + +### Traversal collection restrictions + +AQL traversals now accept the options `vertexCollections` and `edgeCollections` +to restrict the traversal to certain vertex or edge collections. + +The use case for `vertexCollections` is to not follow any edges that will point +to other than the specified vertex collections, e.g. + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { vertexCollections: [ "bolts", "screws" ] } + RETURN v +``` + +The traversal's start vertex is always considered valid, even if it not stored +in any of the collections listed in the `vertexCollections` option. + +The use case for `edgeCollections` is to not take into consideration any edges +from edge collections other than the specified ones, e.g. + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' GRAPH 'components' + OPTIONS { edgeCollections: [ "productsToBolts", "productsToScrews" ] } + RETURN v +``` + +This is mostly useful in the context of named graphs, when the named graph +contains many edge collections. Not restricting the edge collections for the +traversal will make the traversal search for edges in all edge collections +of the graph, which can be expensive. In case it is known that only certain +edges from the named graph are needed, the `edgeCollections` option can be a +handy performance optimization. It can replace less efficient post-filtering: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' GRAPH 'components' + FILTER p.edges[* RETURN IS_SAME_COLLECTION("productsToBolts", CURRENT) + OR IS_SAME_COLLECTION("productsToScrews", CURRENT)] ALL == true + RETURN v +``` + +Also see [AQL Traversal Options](../../aql/graphs/traversals.md#working-with-named-graphs) + +### Traversal parallelization (Enterprise Edition) + +Nested traversals that run on a single server or a cluster DB-Server can now +be executed in parallel. + +Traversals have a new option `parallelism` which can be used to specify the +level of parallelism: + +```aql +FOR doc IN outerCollection + FOR v, e, p IN 1..3 OUTBOUND doc._id GRAPH 'components' + OPTIONS { parallelism: 4 } + ... +``` + +Traversal parallelism is opt-in. If not specified, the `parallelism` value +implicitly defaults to 1, which means no parallelism will be used. The maximum +value for `parallelism` is capped to the number of available cores on the +target machine. + +Due to the required synchronization for splitting up traversal inputs and +merging results, using traversal parallelization may incur some overhead. So it +is not a silver bullet for all use cases. However, parallelizing a traversal is +normally useful when there are many inputs (start vertices) that the nested +traversal can work on concurrently. This is often the case when a nested +traversal is fed with several tens of thousands of start vertices, which can +then be distributed randomly to worker threads for parallel execution. + +Right now, traversal parallelization is limited to traversals in single server +deployments and to cluster traversals that are running in a OneShard setup. +Cluster traversals that run on a coordinator node and SmartGraph traversals are +currently not parallelized. + +See [Graph traversal options](../../aql/graphs/traversals.md#working-with-named-graphs) + +### AQL functions added + +The following AQL functions have been added in ArangoDB 3.7: + +- [IN_RANGE()](../../aql/functions/miscellaneous.md#in_range) + (now available outside of `SEARCH` operations) +- [INTERLEAVE()](../../aql/functions/array.md#interleave) +- [IPV4_FROM_NUMBER()](../../aql/functions/string.md#ipv4_from_number) +- [IPV4_TO_NUMBER()](../../aql/functions/string.md#ipv4_to_number) +- [IS_IPV4()](../../aql/functions/string.md#is_ipv4) +- [JACCARD()](../../aql/functions/array.md#jaccard) +- [LEVENSHTEIN_MATCH()](../../aql/functions/arangosearch.md#levenshtein_match) +- [NGRAM_MATCH()](../../aql/functions/arangosearch.md#ngram_match) +- [NGRAM_POSITIONAL_SIMILARITY()](../../aql/functions/string.md#ngram_positional_similarity) +- [NGRAM_SIMILARITY()](../../aql/functions/string.md#ngram_similarity) +- [PRODUCT()](../../aql/functions/numeric.md#product) +- [REPLACE_NTH()](../../aql/functions/array.md#replace_nth) + +### Syntax enhancements + +AQL now supports trailing commas in array and object definitions. + +This is especially convenient for editing multi-line array/object definitions, +since there doesn't need to be a distinction between the last element and all +others just for the comma. That means definitions such as the following are +now supported: + +```js +[ + 1, + 2, + 3, // trailing comma +] +``` + +```js +{ + "a": 1, + "b": 2, + "c": 3, // trailing comma +} +``` + +Previous versions of ArangoDB did not support trailing commas in AQL queries +and threw query parse errors when they were used. + +### AQL datetime parsing + +The performance of parsing ISO 8601 date/time string values in AQL has improved +significantly thanks to a specialized parser, replacing a regular expression. + +### Ternary operator + +Improved the lazy evaluation capabilities of the [ternary operator](../../aql/operators.md#ternary-operator). +If the second operand is left out, the expression of the condition is only +evaluated once now, instead of once more for the true branch. + +### Other AQL improvements + +#### "remove-unnecessary-calculations" optimizer rule + +The AQL query optimizer now tries to not move potentially expensive AQL function +calls into loops in the `remove-unnecessary-calculations` rule. + +For example, in the query: + +```aql +LET x = NOOPT(1..100) +LET values = SORTED(x) +FOR j IN 1..100 + FILTER j IN values + RETURN j +``` + +… there is only one use of the `values` variable. So the optimizer can remove +that variable and replace the filter condition with `FILTER j IN SORTED(x)`. +However, that would move the potentially expensive function call into the +inner loop, which could be a pessimization. + +The optimizer will not move the calculation of values into the loop anymore when +it merges calculations in the `remove-unnecessary-calculations` optimizer rule. + +#### "move-calculations-down" optimizer rule + +The existing AQL optimizer rule `move-calculations-down` is now able to also move +unrelated subqueries beyond SORT and LIMIT instructions, which can help avoid the +execution of subqueries for which the results are later discarded. + +For example, in the query: + +```aql +FOR doc IN collection1 + LET sub1 = FIRST(FOR sub IN collection2 FILTER sub.ref == doc._key RETURN sub) + LET sub2 = FIRST(FOR sub IN collection3 FILTER sub.ref == doc._key RETURN sub) + + SORT sub1 + LIMIT 10 + RETURN { doc, sub1, sub2 } +``` + +… the execution of the `sub2` subquery can be delayed to after the SORT and LIMIT. +The query optimizer will automatically transform this query into the following: + +```aql +FOR doc IN collection1 + LET sub1 = FIRST(FOR sub IN collection2 FILTER sub.ref == doc._key RETURN sub) + SORT sub1 + LIMIT 10 + + LET sub2 = FIRST(FOR sub IN collection3 FILTER sub.ref == doc._key RETURN sub) + RETURN { doc, sub1, sub2 } +``` + +## Cluster + +### Incremental Plan Updates + +In ArangoDB clusters, the Agency is the single source of truth for data definition +(databases, collections, shards, indexes, views), the cluster configuration and the +current cluster setup (e.g. shard distribution, shard leadership). + +Coordinators and DB-Servers in the cluster maintain a local cache of the Agency's +information, in order to access it in a performant way whenever they need any +information about the setup. +However, any change that was applied to the `Plan` and `Current` sections in the +Agency led to the server-local caches being invalidated, which triggered a full +reload of either `Plan` or `Current` by all Coordinators and DB-Servers. +The size of `Plan` and `Current` is proportional to the number of database objects, +so fully reloading the data from the Agency is an expensive operation for deployments +which have a high number of databases, collections, or shards. + +In ArangoDB 3.7 the mechanism for filling the local caches on Coordinators and +DB-Servers with Agency data has changed fundamentally. Instead of invalidating the +entire cache and reloading the full `Plan` or `Current` section on every change, +each server is now using a permanent connection to the Agency and uses it to +poll for changes. Changes to the Agency data are sent over these connections as +soon as they are applied in the Agency, meaning that Coordinators and DB-Servers +can apply them immediately and incrementally. This removes the need for full +reloads. As a consequence, a significant reduction of overall network traffic between +Agents and other cluster nodes is expected, plus a significant reduction in CPU +usage on Agents for assembling and sending the `Plan` or `Current` parts. +Another positive side effect of this modification is that changes made to Agency +data should propagate faster in the cluster. + +### Parallel Move Shard + +Shards can now move in parallel. The old locking mechanism was replaced by a +read-write lock and thus allows multiple jobs for the same destination server. +The actual transfer rates are still limited on DB-Server side but there is a +huge overall speedup. This also affects `CleanOutServer` and +`ResignLeadership` jobs. + +## General + +### Schema Validation for Documents + +ArangoDB now supports validating documents on collection level using +JSON Schema (draft-4). + +In order to enforce a certain document structure in a collection we have +introduced the `schema` collection property. It expects an object comprised +of a `rule` (JSON Schema object), a `level` and a `message` that will be used +when validation fails. When documents are validated is controlled by the +validation level, which can be `none` (off), `new` (insert only), `moderate` +(on insert and modification, but existing documents can remain invalid) +or `strict` (always). + +See: [Schema Validation](../../concepts/data-structure/documents/schema-validation.md) + +### HTTP/2 support + +The server now supports upgrading connections from HTTP 1.1 to HTTP 2. +This should improve ArangoDBs compatibility with various L7 load balancers +and modern cloud platforms like Kubernetes. + +We also expect improved request throughput in cases where there are many +concurrent requests. + +See: [HTTP Switching Protocols](../../develop/http-api/general-request-handling.md#switch-protocols) + +### Server Name Indication (Enterprise Edition) + +Sometimes it is desirable to have the same server use different server keys +and certificates when it is contacted under different names. This is possible +with the [Server Name Indication](../../components/arangodb-server/options.md#--sslserver-name-indication) +(SNI) TLS extension. It is now supported by ArangoDB using a new startup option +`--ssl.server-name-indication`. + +### JWT secret rotation (Enterprise Edition) + +There are now new APIs and startup options for JWT secrets. The new option +`--server.jwt-secret-folder` can be used to specify a path for more than one +JWT secret file. + +Additionally the `/_admin/server/jwt` API can be used to +[reload the JWT secrets](../../develop/http-api/authentication.md#hot-reload-jwt-secrets) +of a local arangod process without having to restart it (hot-reload). +This may be used to roll out new JWT secrets throughout an ArangoDB cluster. + +### TLS key and certificate rotation + +It is now possible to change the TLS keyfile (secret key as well as +public certificates) at run time. The API `POST /_admin/server/tls` +basically makes the `arangod` server reload the keyfile from disk. + +Furthermore, one can query the current TLS setup at runtime with the +`GET /_admin/server/tls` API. The public certificates as well as a +SHA-256 hash of the private key is returned. + +This allows +[rotation of TLS keys and certificates](../../develop/http-api/security.md#encryption-in-transit) +without a server restart. + +### Encryption at rest key rotation (Enterprise Edition) + +It is possible to change the user supplied encryption key via the +[HTTP API](../../develop/http-api/security.md#encryption-at-rest) +by sending a POST request without payload to the new endpoint +`/_admin/server/encryption`. The file supplied via `--rocksdb.encryption-keyfile` +will be reloaded and the internal encryption key will be re-encrypted with the +new user key. Note that this API is turned off by default. It can be enabled +via the `--rocksdb.encryption-key-rotation` startup option. + +Similarly the new option `--rocksdb.encryption-keyfolder` can be used +to supply multiple user keys. By default, the first available user-supplied key +will be used as the internal encryption key. Alternatively, if the option +`--rocksdb.encryption-gen-internal-key` is set to `true`, a random internal +key will be generated and encrypted with each of the provided user keys. + +Please be aware that the encryption at rest key rotation is an **experimental** +feature, and its APIs and behavior are still subject to change. + +### Insert-Update and Insert-Ignore + +ArangoDB 3.7 adds an insert-update operation that is similar to the already +existing insert-replace functionality. A new `overwriteMode` flag has been +introduced to control the type of the overwrite operation in case of colliding +primary keys during the insert. + +In the case of `overwriteMode: "update"`, the parameters `keepNull` and +`mergeObjects` can be provided to control the update operation. + +There is now also an insert-ignore operation that allows insert operations +to do nothing in case of a primary key conflict. This operation is an efficient +way of making sure a document with a specific primary key exists. If it does +not exist already, it will be created as specified. Should the document exist +already, nothing will happen and the insert will return without an error. No +write operations happens in this case, and only a single primary key lookup +needs to be performed in the storage engine. +This makes the insert-ignore operation the most efficient way +existing insert-replace functionality. A new `overwriteMode` flag has been +introduced to control the type of the overwrite operation in case of colliding +primary keys during the insert. + +The query options are available in [AQL](../../aql/high-level-operations/insert.md#query-options), +the [JS API](../../develop/javascript-api/@arangodb/collection-object.md#collectioninsertdata--options) and +[HTTP API](../../develop/http-api/documents.md#create-a-document). + +### Override detected total memory and CPU cores + +`arangod` detects the total amount of RAM present on the system and calculates +various default sizes based on this value. If you run it alongside other +services or in a container with a RAM limitation for its cgroup, then you +probably don't want the server to detect and use all available memory. + +An environment variable `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` can now be +set to restrict the amount of memory it will detect (also available in v3.6.3). + +An environment variable `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` can be +set to restrict the number of CPU cores that are visible to arangod. + +See [ArangoDB Server Environment Variables](../../components/arangodb-server/environment-variables.md) + +### RocksDB storage engine options exposed + +Multiple additional RocksDB configuration options are now exposed to be +configurable in _arangod_: + +- `--rocksdb.cache-index-and-filter-blocks` to make the RocksDB block cache + quota also include RocksDB memtable sizes +- `--rocksdb.cache-index-and-filter-blocks-with-high-priority` to use cache + index and filter blocks with high priority making index and filter blocks + be less likely to be evicted than data blocks +- `--rocksdb.pin-l0-filter-and-index-blocks-in-cache` to make filter and index + blocks be pinned and only evicted from cache when the table reader is freed +- `--rocksdb.pin-top-level-index-and-filter` to make the top-level index of + partitioned filter and index blocks pinned and only be evicted from cache + when the table reader is freed +- `--rocksdb.target-file-size-base`: Per-file target file size for compaction + (in bytes). the actual target file size for each level is + `--rocksdb.target-file-size-base` multiplied by `--rocksdb.target-file-size-multiplier ^ (level - 1)` +- `--rocksdb.target-file-size-multiplier`: Multiplier for `--rocksdb.target-file-size`, + a value of 1 means that files in different levels will have the same size (default) + +## Pregel + +A new algorithm `"wcc"` has been added to Pregel to find connected components. + +There are now three algorithms to find connected components in a graph: + +1. If your graph is effectively undirected (you have edges in both directions + between vertices) then the simple connected components algorithm named + `"connectedcomponents"` is suitable. + + It is a very simple and fast algorithm, but will only work correctly on undirected + graphs. Your results on directed graphs may vary, depending on how connected your + components are. + +2. To find **weakly connected components** (WCC) you can now use the new algorithm named + `"wcc"`. Weakly connected means that there exists a path from every vertex pair in + that component. + + This algorithm will work on directed graphs but requires a greater amount of traffic + between your DB-Servers. + +3. to find **strongly connected components** (SCC) you can use the algorithm named + `"scc"`. Strongly connected means every vertex is reachable from any other vertex in + the same component. + + The algorithm is more complex than the WCC algorithm and requires more memory, + because each vertex needs to store much more state. + +Also see [Pregel](../../data-science/pregel/_index.md) + +## Foxx + +Foxx endpoints now provide the methods `securityScheme`, `securityScope` and +`security` to allow defining Swagger security schemes. + +Foxx routes now always have a Swagger `operationId`. If the route is unnamed, +a distinct operationId will be generated based on the HTTP method and URL. + +## JavaScript + +### V8 and ICU library upgrades + +The bundled V8 JavaScript engine was upgraded to version 7.9.317. The bundled +Unicode character handling library ICU was upgraded to version 64.2. + +The resource usage of V8 has improved a lot. Memory usage is down by 15%, +spawning a new Isolate has become almost 10 times faster. + +Here is the list of improvements that may matter to you as an ArangoDB user: + +- [JSON.parse improvements](https://v8.dev/blog/v8-release-76#json.parse-improvements): + JSON parsing is roughly 60% faster compared to ArangoDB v3.6. Parsing JSON + is generally faster than parsing JavaScript because of the lower syntactic + complexity, but with the additional speedup of the JSON parser you should + consider to use `JSON.parse(string)` over JavaScript variable declarations + for complex data: + ```js + // Parsing a JSON string + let structuredVar = JSON.parse('{"foo": "bar", …}'); + // instead of using an object literal + let structuredVar = {foo: "bar", …}; + ``` + Also see [Embedding JSON into JavaScript programs with JSON.parse](https://v8.dev/features/subsume-json#embedding-json-parse). + +- [BigInt support in formatter](https://v8.dev/features/intl-numberformat): + Large integer numbers are now supported in number formatters: + ```js + const formatter = new Intl.NumberFormat('fr'); + formatter.format(12345678901234567890n); + ``` + This no longer throws an `Cannot convert a BigInt value to a number` error. + Note that ArangoDB does not support BigInt in general but only in JavaScript + contexts. AQL, JSON etc. do not support BigInt. + +- [Object.fromEntries support](https://v8.dev/features/object-fromentries): + Performs the inverse operation of `Object.entries()`: + ```js + const object = { x: 42, y: 50 }; + const entries = Object.entries(object); + // → [['x', 42], ['y', 50]] + + const result = Object.fromEntries(entries); + // → { x: 42, y: 50 } + ``` + +- [Underscores for better readability of large numbers](https://v8.dev/features/numeric-separators): + ``` + 1_000_000_000_000 // → equals 1000000000000 + ``` + +- [matchAll support for strings](https://v8.dev/features/string-matchall): + A convenient generator for a match object for each match: + ```js + const string = 'Favorite GitHub repos: tc39/ecma262 v8/v8.dev'; + const regex = /\b(?<owner>[a-z0-9]+)\/(?<repo>[a-z0-9\.]+)\b/g; + for (const match of string.matchAll(regex)) { + console.log(`${match[0]} at ${match.index} with '${match.input}'`); + console.log(`→ owner: ${match.groups.owner}`); + console.log(`→ repo: ${match.groups.repo}`); + ``` + +- ICU supports more languages and characters (Unicode 12.1), + emoji handling was improved + +Also see: +- [V8 release blog posts](https://v8.dev/blog) (v7.2 to v7.9) +- [V8 features](https://v8.dev/features) (up to Chrome 79) + +### JavaScript APIs + +The [`query` helper](../../develop/javascript-api/@arangodb/_index.md#the-query-helper) +was extended to support passing +[query options](../../aql/how-to-invoke-aql/with-arangosh.md#main-query-options): + +```js +require("@arangodb").query( { maxRuntime: 1 } )`RETURN SLEEP(2)` +``` + +## Web UI + +The interactive description of ArangoDB's HTTP API (Swagger UI) shows the +endpoint and model entries collapsed by default now for a better overview. + +The bundled version of Swagger has been upgraded to 3.25.1. This change has +also been backported to ArangoDB v3.6.4. + +## Metrics + +The amount of exported metrics for monitoring has been extended and is now +available in a format compatible with Prometheus. You can now easily scrape +on `/_admin/metrics`. +See [Metrics HTTP API](../../develop/http-api/monitoring/metrics.md). + +The following metrics have been added in ArangoDB 3.7: + +| Label | Description | +|:------|:------------| +| `arangodb_agency_append_hist` | Agency RAFT follower append histogram | +| `arangodb_agency_commit_hist` | Agency RAFT commit histogram | +| `arangodb_agency_compaction_hist` | Agency compaction histogram | +| `arangodb_agency_local_commit_index` | This agent's commit index | +| `arangodb_agency_log_size_bytes` | Agency replicated log size (bytes) | +| `arangodb_agency_read_no_leader` | Agency read no leader | +| `arangodb_agency_read_ok` | Agency read ok | +| `arangodb_agency_supervision_accum_runtime_msec` | Accumulated Supervision Runtime | +| `arangodb_agency_supervision_accum_runtime_wait_for_replication_msec` | Accumulated Supervision wait for replication time | +| `arangodb_agency_supervision_failed_server_count` | Counter for FailedServer jobs | +| `arangodb_agency_supervision_runtime_msec` | Agency Supervision runtime histogram (ms) | +| `arangodb_agency_supervision_runtime_wait_for_replication_msec` | Agency Supervision wait for replication time (ms) | +| `arangodb_agency_term` | Agency's term | +| `arangodb_agency_write_hist` | Agency write histogram (ms) | +| `arangodb_agency_write_no_leader` | Agency write no leader | +| `arangodb_agency_write_ok` | Agency write ok | +| `arangodb_agencycomm_request_time_msec` | Request time for Agency requests | +| `arangodb_aql_slow_query` | Number of AQL slow queries | +| `arangodb_aql_total_query_time_msec` | Total execution time of all queries | +| `arangodb_client_connection_statistics_io_time_bucket` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_io_time_count` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_io_time_sum` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_queue_time_bucket` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_queue_time_count` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_queue_time_sum` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_request_time_bucket` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_request_time_count` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_request_time_sum` | Request time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_total_time_bucket` | Total time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_total_time_count` | Total time needed to answer a request (ms) | +| `arangodb_client_connection_statistics_total_time_sum` | Total time needed to answer a request (ms) | +| `arangodb_dropped_followers_count` | Number of drop-follower events | +| `arangodb_heartbeat_failures` | Counting failed heartbeat transmissions | +| `arangodb_heartbeat_send_time_msec` | Time required to send heartbeat (ms) | +| `arangodb_http_request_statistics_async_requests` | Number of asynchronously executed HTTP requests | +| `arangodb_http_request_statistics_http_delete_requests` | Number of HTTP DELETE requests | +| `arangodb_http_request_statistics_http_get_requests` | Number of HTTP GET requests | +| `arangodb_http_request_statistics_http_head_requests` | Number of HTTP HEAD requests | +| `arangodb_http_request_statistics_http_options_requests` | Number of HTTP OPTIONS requests | +| `arangodb_http_request_statistics_http_patch_requests` | Number of HTTP PATCH requests | +| `arangodb_http_request_statistics_http_post_requests` | Number of HTTP POST requests | +| `arangodb_http_request_statistics_http_put_requests` | Number of HTTP PUT requests | +| `arangodb_http_request_statistics_other_http_requests` | Number of other HTTP requests | +| `arangodb_http_request_statistics_total_requests` | Total number of HTTP requests | +| `arangodb_load_current_accum_runtime_msec` | Accumulated Current loading time (ms) | +| `arangodb_load_current_runtime` | Current loading runtimes | +| `arangodb_load_plan_accum_runtime_msec` | Accumulated runtime of Plan loading (ms) | +| `arangodb_load_plan_runtime` | Plan loading runtimes | +| `arangodb_maintenance_action_accum_queue_time_msec` | Accumulated action queue time | +| `arangodb_maintenance_action_accum_runtime_msec` | Accumulated action runtime | +| `arangodb_maintenance_action_done_counter` | Counter of action that are done and have been removed from the registry | +| `arangodb_maintenance_action_duplicate_counter` | Counter of action that have been discarded because of a duplicate | +| `arangodb_maintenance_action_failure_counter` | Failure counter for the action | +| `arangodb_maintenance_action_queue_time_msec` | Time spend in the queue before execution | +| `arangodb_maintenance_action_registered_counter` | Counter of action that have been registered in the action registry | +| `arangodb_maintenance_action_runtime_msec` | Time spend execution the action | +| `arangodb_maintenance_agency_sync_accum_runtime_msec` | Accumulated runtime of agency sync phase | +| `arangodb_maintenance_agency_sync_runtime_msec` | Total time spend on agency sync | +| `arangodb_maintenance_phase1_accum_runtime_msec` | Accumulated runtime of phase one | +| `arangodb_maintenance_phase1_runtime_msec` | Maintenance Phase 1 runtime histogram | +| `arangodb_maintenance_phase2_accum_runtime_msec` | Accumulated runtime of phase two | +| `arangodb_maintenance_phase2_runtime_msec` | Maintenance Phase 2 runtime histogram | +| `arangodb_scheduler_awake_threads` | Number of awake worker threads | +| `arangodb_scheduler_num_worker_threads` | Number of worker threads | +| `arangodb_scheduler_queue_full_failures` | Number of times the scheduler queue was full and a task/request was rejected | +| `arangodb_scheduler_queue_length` | Server's internal queue length | +| `arangodb_server_statistics_physical_memory` | Physical memory in bytes | +| `arangodb_server_statistics_server_uptime` | Number of seconds elapsed since server start | +| `arangodb_shards_leader_count` | Number of leader shards on this machine | +| `arangodb_shards_not_replicated` | Number of shards not replicated at all | +| `arangodb_shards_out_of_sync` | Number of leader shards not fully replicated | +| `arangodb_shards_total_count` | Number of shards on this machine | +| `arangodb_v8_context_alive` | Number of V8 contexts currently alive | +| `arangodb_v8_context_busy` | Number of V8 contexts currently busy | +| `arangodb_v8_context_created` | Number of V8 contexts created | +| `arangodb_v8_context_destroyed` | Number of V8 contexts destroyed | +| `arangodb_v8_context_dirty` | Number of V8 contexts currently dirty (waiting for garbage collection) | +| `arangodb_v8_context_enter_failures` | Number of times a V8 context could not be entered/acquired | +| `arangodb_v8_context_entered` | Number of times a V8 context was successfully entered | +| `arangodb_v8_context_exited` | Number of times a V8 context was successfully exited | +| `arangodb_v8_context_free` | Number of V8 contexts currently free | +| `arangodb_v8_context_max` | Maximum number of concurrent V8 contexts allowed | +| `arangodb_v8_context_min` | Minimum number of concurrent V8 contexts allowed | +{.fixed} + +## Client tools + +_arangodump_ and _arangorestore_ will now fail when using the `--collection` +option and none of the specified collections actually exist in the database (on dump) +or in the dump to restore (on restore). In case only some of the specified collections +exist, _arangodump_ / _arangorestore_ will issue warnings about the invalid collections, +but will continue to work for the valid collections. + +These change were made to make end users more aware of that the executed +commands for dumping or restoring data refer to non-existing collections and +that backup or restore operations are potentially incomplete. + +## MMFiles storage engine + +ArangoDB 3.7 does not contain the MMFiles storage engine anymore. In ArangoDB +3.7, the only available storage engine is the RocksDB storage engine, which is +the default storage engine in ArangoDB since version 3.4. The MMFiles storage +engine had been deprecated since the release of ArangoDB 3.6. + +Any deployments that use the MMFiles storage engine will need to be migrated to +the RocksDB storage engine using ArangoDB 3.6 (or earlier versions) in order to +upgrade to ArangoDB 3.7. + +All storage engine selection functionality has also been removed from the +ArangoDB package installers. The RocksDB storage engine will be selected +automatically for any new deployments created with ArangoDB 3.7. + +This change simplifies the installation procedures and internal code paths. + +## Internal changes + +### Upgraded bundled RocksDB library version + +The bundled version of the RocksDB library has been upgraded from 6.2 to 6.8. + +### Upgraded bundled OpenLDAP library version + +The OpenLDAP version used for the LDAP integration in the ArangoDB Enterprise +Edition has been upgraded to 2.4.50. +This change has been backported to ArangoDB v3.6.5 as well. + +### Added libunwind library dependency + +The Linux builds of ArangoDB now use the third-party library +[libunwind](https://github.com/libunwind/libunwind) to get +backtraces and to symbolize stack frames. + +Building with libunwind can be turned off at compile time using the +`-DUSE_LIBUNWIND` CMake variable. + +### Removed libcurl library dependency + +The compile-time dependency on libcurl was removed. Cluster-internal +communication is now performed using [fuerte](https://github.com/arangodb/fuerte) +instead of libcurl. + +### Crash handler + +The Linux builds of the arangod executable contain a built-in crash handler +The crash handler is supposed to log basic crash information to the ArangoDB +logfile in case the arangod process receives one of the signals SIGSEGV, +SIGBUS, SIGILL, SIGFPE or SIGABRT. SIGKILL signals, which the operating system +can send to a process in case of OOM (out of memory), are not interceptable and +thus cannot be intercepted by the crash handler. + +In case the crash handler receives one of the mentioned interceptable signals, +it will write basic crash information to the logfile and a backtrace of the +call site. The backtrace can be provided to the Arango support for further +inspection. Note that backtaces are only usable if debug symbols for ArangoDB +have been installed as well. + +After logging the crash information, the crash handler will execute the default +action for the signal it has caught. If core dumps are enabled, the default +action for these signals is to generate a core file. If core dumps are not +enabled, the crash handler will simply terminate the program with a non-zero +exit code. + +The crash handler can be disabled at server start by setting the environment +variable `ARANGODB_OVERRIDE_CRASH_HANDLER` to an empty string, `0` or `off`. + +Also see: +- [Troubleshooting _arangod_](../../operations/troubleshooting/arangod.md#other-crashes) +- [Server environment variables](../../components/arangodb-server/environment-variables.md) + +### Supported compilers + +Manually compiling ArangoDB from source will require a C++17-ready compiler. + +Older versions of g++ that could be used to compile previous versions of +ArangoDB, namely g++7, cannot be used anymore for compiling ArangoDB. +g++9.2, g++9.3 and g++10 are known to work, and are the preferred compilers +to build ArangoDB under Linux. + +Under macOS, the official compiler is clang with a minimal target of +macOS 10.14 (Mojave). + +Under Windows, use the Visual C++ compiler of Visual Studio 2019 v16.5.0 or +later. VS 2017 might still work, but is not officially supported any longer. + +### Documentation generation + +The following features have been added for auto-generating documentation: + +- the `--dump-options` command for arangod and the client tools now also emits + an attribute `os` which indicates on which operating system(s) the respective + options are supported. +- the `--dump-options` command for arangod now also emits an attribute + `component` which indicates for which node type(s) the respective options are + supported (`single` server, `coordinator`, `dbserver`, `agent`). diff --git a/site/content/arangodb/oem/release-notes/version-3.8/_index.md b/site/content/arangodb/oem/release-notes/version-3.8/_index.md new file mode 100644 index 0000000000..f1a461f4db --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.8/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.8 +menuTitle: Version 3.8 +weight: 91 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.8/api-changes-in-3-8.md b/site/content/arangodb/oem/release-notes/version-3.8/api-changes-in-3-8.md new file mode 100644 index 0000000000..c8a71b1325 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.8/api-changes-in-3-8.md @@ -0,0 +1,374 @@ +--- +title: API Changes in ArangoDB 3.8 +menuTitle: API changes in 3.8 +weight: 20 +description: >- + A summary of the changes to the HTTP API and other interfaces that are relevant + for developers, like maintainers of drivers and integrations for ArangoDB +--- +## HTTP RESTful API + +### Collection API + +The following changes affect the behavior of the RESTful collection APIs at +endpoints starting with path `/_api/collection/`: + +The collection properties `indexBuckets`, `journalSize`, `doCompact` and +`isVolatile` only had a meaning for the MMFiles storage engine, which is not +available anymore since ArangoDB 3.7. + +ArangoDB 3.8 now removes any special handling for these obsolete collection +properties, meaning these attributes will not be processed by the server and +not be returned by any server APIs. Using these attributes in any API call +will be ignored, and will not trigger any errors. + +Client applications and tests that rely on the behavior that setting any of +these obsolete properties produces an error on the server side may need to +be adjusted now. + +### Www-Authenticate response header + +ArangoDB 3.8 adds back the `Www-Authenticate` response header for HTTP server +responses with a status code of 401. Returning the `Www-Authenticate` header for +401 responses is required by the HTTP/1.1 specification and was also advertised +functionality in the ArangoDB documentation, but wasn't happening in practice. + +Now the functionality of returning `Www-Authenticate` response headers for HTTP +401 responses is restored, along with the already advertised functionality of +suppressing this header in case the client sends an `X-Omit-Www-Authenticate` +header with the request. + +This change should not have any impact for client applications that use ArangoDB +as a database only. It may have an effect for Foxx applications that use HTTP +401 status code responses and that will now see this extra header getting returned. + +### Endpoint return value changes + +- The endpoint `/_api/replication/clusterInventory` returns, among other things, + an array of the existing collections. Each collection has a `planVersion` + attribute, which in ArangoDB 3.8 is now hard-coded to the value of 1. + + Before 3.7, the most recent Plan version from the agency was returned inside + `planVersion` for each collection. In 3.7, the attribute contained the Plan + version that was in use when the in-memory LogicalCollection object was last + constructed. The object was always reconstructed in case the underlying Plan + data for the collection changed, or when a collection contained links to + ArangoSearch Views. This made the attribute relatively useless for any + real-world use cases, and so we are now hard-coding it to simplify the internal + code. Using the attribute in client applications is also deprecated. + +- The endpoint `/_api/transaction` previously would allow users to list, query, + commit, and abort transactions operating in any database as long as the user had + sufficient permissions. Now the endpoint will restrict operations to + transactions within the current database. + +- The HTTP API for starting a Pregel run `/_api/control-pregel` now returns the + Pregel execution number as a stringified execution number, e.g. "12345" instead + of 12345. + This is not downwards-compatible, so all client applications that depend + on the return value being a numeric value need to be adjusted to handle + a string return value and convert that string into a number. + +- Changed the encoding of revision IDs returned by the below listed REST APIs. + + <small>Introduced in: v3.8.8</small> + + - `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. + - `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +### Endpoints added + +- The cursor API endpoint `PUT /_api/cursor/<cursor-id>` to retrieve more data + from an existing AQL query cursor is now also available under + `POST /_api/cursor/<cursor-id>`. + + The new POST API is a drop-in replacement for the existing PUT API and + functionally equivalent to it. The benefit of using the POST API is that + HTTP POST requests will not be considered as idempotent, so proxies may not + retry them if they fail. This was the case with the existing PUT API, as + HTTP PUT requests can be considered idempotent according to the + [HTTP specification](https://tools.ietf.org/html/rfc7231#section-4.2). + + The POST API is not yet used by ArangoDB 3.8, including the web UI and the + client tools. This is to ensure the compatibility of 3.8 with earlier + versions, which may be in use during upgrade to 3.8, or with one of the 3.8 + client tools. The PUT API will remain fully functional in this version of + ArangoDB and the next. The following version of ArangoDB will switch to using + the POST variant instead of the PUT for its own requests, including web UI + and client tools. Driver maintainers should eventually move to the POST + variant of the cursor API as well. This is safe for drivers targeting 3.8 + or higher. + +- The new REST endpoint at GET `/_admin/log/entries` can be used to retrieve + server log messages in a more intuitive format than the already existing API + at GET `/_admin/log`. + + The new API returns all matching log messages in an array, with one array + entry per log message. Each log message is returned as an object containing + the properties of the log message: + + ```json + { + "total" : 13, + "messages": [ + { + "id" : 12, + "topic" : "general", + "level" : "INFO", + "date" : "2021-02-07T01:00:21Z", + "message" : "[cf3f4] {general} ArangoDB (version 3.8.0-devel enterprise [linux]) is ready for business. Have fun!" + }, + { + "id" : 11, + "topic" : "general", + "level" : "INFO", + "date" : "2021-02-07T01:00:21Z", + "message" : "[99d80] {general} You are using a milestone/alpha/beta/preview version ('3.8.0-devel') of ArangoDB" + } + ] + } + ``` + + The previous API returned an object with 5 attributes at the top-level + instead, which contained arrays with the attribute values of all log + messages: + + ```json + { + "totalAmount" : 13, + "lid" : [ + 12, + 11 + ], + "topic" : [ + "general", + "general" + ], + "level" : [ + 3, + 3 + ], + "timestamp" : [ + 1612659621, + 1612659621 + ], + "text" : [ + "[cf3f4] {general} ArangoDB (version 3.8.0-devel enterprise [linux]) is ready for business. Have fun!", + "[99d80] {general} You are using a milestone/alpha/beta/preview version ('3.8.0-devel') of ArangoDB" + ] + } + ``` + + The old API endpoint GET `/_admin/log` for retrieving log messages is now + deprecated, although it will stay available for some time. + +- Added endpoint for new version "v2" of the metrics API: + + `GET /_admin/metrics/v2` will return Prometheus-format of the server metrics. + + The old endpoint `GET /_admin/metrics` is still supported but is considered + to be obsolete from 3.8 on and will be removed in a future version. Also see + [Features and Improvements in 3.8](whats-new-in-3-8.md#metrics). + + In the new API V2, there are quite a lot more metrics than in previous + versions and a lot have been renamed to follow Prometheus conventions. + Below is a list of renamed metrics: + + | `/_admin/metrics` | `/_admin/metrics/v2` | + |:------------------|:---------------------| + | `arangodb_agency_cache_callback_count` | `arangodb_agency_cache_callback_number` | + | `arangodb_agency_callback_count` | `arangodb_agency_callback_number` | + | `arangodb_agency_callback_registered` | `arangodb_agency_callback_registered_total` | + | `arangodb_agency_read_no_leader` | `arangodb_agency_read_no_leader_total` | + | `arangodb_agency_read_ok` | `arangodb_agency_read_ok_total` | + | `arangodb_agency_supervision_accum_runtime_msec` | `arangodb_agency_supervision_accum_runtime_msec_total` | + | `arangodb_agency_supervision_accum_runtime_wait_for_replication_msec` | `arangodb_agency_supervision_accum_runtime_wait_for_replication_msec_total` | + | `arangodb_agency_supervision_failed_server_count` | `arangodb_agency_supervision_failed_server_total` | + | `arangodb_agency_write_no_leader` | `arangodb_agency_write_no_leader_total` | + | `arangodb_agency_write_ok` | `arangodb_agency_write_ok_total` | + | `arangodb_aql_all_query` | `arangodb_aql_all_query_total` | + | `arangodb_aql_slow_query` | `arangodb_aql_slow_query_total` | + | `arangodb_aql_total_query_time_msec` | `arangodb_aql_total_query_time_msec_total` | + | `arangodb_collection_lock_acquisition_micros` | `arangodb_collection_lock_acquisition_micros_total` | + | `arangodb_collection_lock_sequential_mode` | `arangodb_collection_lock_sequential_mode_total` | + | `arangodb_collection_lock_timeouts_exclusive` | `arangodb_collection_lock_timeouts_exclusive_total` | + | `arangodb_collection_lock_timeouts_write` | `arangodb_collection_lock_timeouts_write_total` | + | `arangodb_collection_truncates` | `arangodb_collection_truncates_total` | + | `arangodb_collection_truncates_replication` | `arangodb_collection_truncates_replication_total` | + | `arangodb_connection_connections_current` | `arangodb_connection_pool_connections_current` | + | `arangodb_connection_leases_successful` | `arangodb_connection_pool_leases_successful_total` | + | `arangodb_connection_pool_connections_created` | `arangodb_connection_pool_connections_created_total` | + | `arangodb_connection_pool_leases_failed` | `arangodb_connection_pool_leases_failed_total` | + | `arangodb_document_writes` | `arangodb_document_writes_total` | + | `arangodb_document_writes_replication` | `arangodb_document_writes_replication_total` | + | `arangodb_dropped_followers_count` | `arangodb_dropped_followers_total` | + | `arangodb_heartbeat_failures` | `arangodb_heartbeat_failures_total` | + | `arangodb_http_request_statistics_async_requests` | `arangodb_http_request_statistics_async_requests_total` | + | `arangodb_http_request_statistics_http_delete_requests` | `arangodb_http_request_statistics_http_delete_requests_total` | + | `arangodb_http_request_statistics_http_get_requests` | `arangodb_http_request_statistics_http_get_requests_total` | + | `arangodb_http_request_statistics_http_head_requests` | `arangodb_http_request_statistics_http_head_requests_total` | + | `arangodb_http_request_statistics_http_options_requests` | `arangodb_http_request_statistics_http_options_requests_total` | + | `arangodb_http_request_statistics_http_patch_requests` | `arangodb_http_request_statistics_http_patch_requests_total` | + | `arangodb_http_request_statistics_http_post_requests` | `arangodb_http_request_statistics_http_post_requests_total` | + | `arangodb_http_request_statistics_http_put_requests` | `arangodb_http_request_statistics_http_put_requests_total` | + | `arangodb_http_request_statistics_other_http_requests` | `arangodb_http_request_statistics_other_http_requests_total` | + | `arangodb_http_request_statistics_superuser_requests` | `arangodb_http_request_statistics_superuser_requests_total` | + | `arangodb_http_request_statistics_total_requests` | `arangodb_http_request_statistics_total_requests_total` | + | `arangodb_http_request_statistics_user_requests` | `arangodb_http_request_statistics_user_requests_total` | + | `arangodb_intermediate_commits` | `arangodb_intermediate_commits_total` | + | `arangodb_load_current_accum_runtime_msec` | `arangodb_load_current_accum_runtime_msec_total` | + | `arangodb_load_plan_accum_runtime_msec` | `arangodb_load_plan_accum_runtime_msec_total` | + | `arangodb_maintenance_action_accum_queue_time_msec` | `arangodb_maintenance_action_accum_queue_time_msec_total` | + | `arangodb_maintenance_action_accum_runtime_msec` | `arangodb_maintenance_action_accum_runtime_msec_total` | + | `arangodb_maintenance_action_done_counter` | `arangodb_maintenance_action_done_total` | + | `arangodb_maintenance_action_duplicate_counter` | `arangodb_maintenance_action_duplicate_total` | + | `arangodb_maintenance_action_failure_counter` | `arangodb_maintenance_action_failure_total` | + | `arangodb_maintenance_action_registered_counter` | `arangodb_maintenance_action_registered_total` | + | `arangodb_maintenance_agency_sync_accum_runtime_msec` | `arangodb_maintenance_agency_sync_accum_runtime_msec_total` | + | `arangodb_maintenance_phase1_accum_runtime_msec` | `arangodb_maintenance_phase1_accum_runtime_msec_total` | + | `arangodb_maintenance_phase2_accum_runtime_msec` | `arangodb_maintenance_phase2_accum_runtime_msec_total` | + | `arangodb_network_forwarded_requests` | `arangodb_network_forwarded_requests_total` | + | `arangodb_network_request_timeouts` | `arangodb_network_request_timeouts_total` | + | `arangodb_process_statistics_major_page_faults` | `arangodb_process_statistics_major_page_faults_total` | + | `arangodb_process_statistics_minor_page_faults` | `arangodb_process_statistics_minor_page_faults_total` | + | `arangodb_refused_followers_count` | `arangodb_refused_followers_total` | + | `arangodb_replication_cluster_inventory_requests` | `arangodb_replication_cluster_inventory_requests_total` | + | `arangodb_replication_dump_apply_time` | `arangodb_replication_dump_apply_time_total` | + | `arangodb_replication_dump_bytes_received` | `arangodb_replication_dump_bytes_received_total` | + | `arangodb_replication_dump_documents` | `arangodb_replication_dump_documents_total` | + | `arangodb_replication_dump_requests` | `arangodb_replication_dump_requests_total` | + | `arangodb_replication_dump_request_time` | `arangodb_replication_dump_request_time_total` | + | `arangodb_replication_failed_connects` | `arangodb_replication_failed_connects_total` | + | `arangodb_replication_initial_chunks_requests_time` | `arangodb_replication_initial_chunks_requests_time_total` | + | `arangodb_replication_initial_docs_requests_time` | `arangodb_replication_initial_docs_requests_time_total` | + | `arangodb_replication_initial_insert_apply_time` | `arangodb_replication_initial_insert_apply_time_total` | + | `arangodb_replication_initial_keys_requests_time` | `arangodb_replication_initial_keys_requests_time_total` | + | `arangodb_replication_initial_lookup_time` | `arangodb_replication_initial_lookup_time_total` | + | `arangodb_replication_initial_remove_apply_time` | `arangodb_replication_initial_remove_apply_time_total` | + | `arangodb_replication_initial_sync_bytes_received` | `arangodb_replication_initial_sync_bytes_received_total` | + | `arangodb_replication_initial_sync_docs_inserted` | `arangodb_replication_initial_sync_docs_inserted_total` | + | `arangodb_replication_initial_sync_docs_removed` | `arangodb_replication_initial_sync_docs_removed_total` | + | `arangodb_replication_initial_sync_docs_requested` | `arangodb_replication_initial_sync_docs_requested_total` | + | `arangodb_replication_initial_sync_docs_requests` | `arangodb_replication_initial_sync_docs_requests_total` | + | `arangodb_replication_initial_sync_keys_requests` | `arangodb_replication_initial_sync_keys_requests_total` | + | `arangodb_replication_synchronous_requests_total_number` | `arangodb_replication_synchronous_requests_total_number_total` | + | `arangodb_replication_synchronous_requests_total_time` | `arangodb_replication_synchronous_requests_total_time_total` | + | `arangodb_replication_tailing_apply_time` | `arangodb_replication_tailing_apply_time_total` | + | `arangodb_replication_tailing_bytes_received` | `arangodb_replication_tailing_bytes_received_total` | + | `arangodb_replication_tailing_documents` | `arangodb_replication_tailing_documents_total` | + | `arangodb_replication_tailing_follow_tick_failures` | `arangodb_replication_tailing_follow_tick_failures_total` | + | `arangodb_replication_tailing_markers` | `arangodb_replication_tailing_markers_total` | + | `arangodb_replication_tailing_removals` | `arangodb_replication_tailing_removals_total` | + | `arangodb_replication_tailing_requests` | `arangodb_replication_tailing_requests_total` | + | `arangodb_replication_tailing_request_time` | `arangodb_replication_tailing_request_time_total` | + | `arangodb_scheduler_queue_full_failures` | `arangodb_scheduler_queue_full_failures_total` | + | `arangodb_scheduler_threads_started` | `arangodb_scheduler_threads_started_total` | + | `arangodb_scheduler_threads_stopped` | `arangodb_scheduler_threads_stopped_total` | + | `arangodb_server_statistics_server_uptime` | `arangodb_server_statistics_server_uptime_total` | + | `arangodb_shards_leader_count` | `arangodb_shards_leader_number` | + | `arangodb_shards_total_count` | `arangodb_shards_number` | + | `arangodb_sync_wrong_checksum` | `arangodb_sync_wrong_checksum_total` | + | `arangodb_transactions_aborted` | `arangodb_transactions_aborted_total` | + | `arangodb_transactions_committed` | `arangodb_transactions_committed_total` | + | `arangodb_transactions_expired` | `arangodb_transactions_expired_total` | + | `arangodb_transactions_started` | `arangodb_transactions_started_total` | + | `arangodb_v8_context_created` | `arangodb_v8_context_created_total` | + | `arangodb_v8_context_creation_time_msec` | `arangodb_v8_context_creation_time_msec_total` | + | `arangodb_v8_context_destroyed` | `arangodb_v8_context_destroyed_total` | + | `arangodb_v8_context_entered` | `arangodb_v8_context_entered_total` | + | `arangodb_v8_context_enter_failures` | `arangodb_v8_context_enter_failures_total` | + | `arangodb_v8_context_exited` | `arangodb_v8_context_exited_total` | + | `rocksdbengine_throttle_bps` | `rocksdb_engine_throttle_bps` | + | `rocksdb_write_stalls` | `arangodb_rocksdb_write_stalls_total` | + | `rocksdb_write_stops` | `arangodb_rocksdb_write_stops_total` | + {.fixed} + +### Endpoints augmented + +- The REST endpoint at GET `/_api/engine/stats` now returns useful information in cluster + setups too. Previously calling this API on a Coordinator always produced an empty JSON + object result, whereas now it will produce a JSON object with one key per DB-Server. + The mapped value per DB-Server are the engine statistics for this particular server. + + The return value structure is different to the return value structure in single server, + where the return value is a simple JSON object with the statistics at the top level. + +- The REST endpoint for creating indexes, POST `/_api/index`, can now handle the attribute + `estimates`, which determines if the to-be-created index should maintain selectivity + estimates or not. If not specified, the default value for this attribute is `true` for + indexes of type "persistent", so that selectivity estimates are maintained. They can be + optionally turned off by setting the attribute to `false`. Turning off selectivity + estimates can have a slightly positive effect on write performance. The attribute will + only be picked up for indexes of type "persistent", "hash" and "skiplist" (where the + latter two are aliases for "persistent" nowadays). + +- The REST endpoint at GET `/_api/collection/<collection>/checksum` now also works + in cluster setups. In previous versions, this endpoint was not supported in cluster + setups and returned HTTP 501 (Not implemented). + +- The HTTP REST API endpoint `POST /_api/cursor` can now handle an + additional sub-attribute `fillBlockCache` for its `options` attribute. + `fillBlockCache` controls whether the to-be-executed query should + populate the RocksDB block cache with the data read by the query. + This is an optional attribute, and its default value is `true`, meaning + that the block cache will be populated (introduced in v3.8.1). + +- The metrics endpoints include the following new traffic accounting metrics: + + <small>Introduced in: v3.8.9</small> + + - `arangodb_client_user_connection_statistics_bytes_received` + - `arangodb_client_user_connection_statistics_bytes_sent` + - `arangodb_http1_connections_total` + +### Endpoints deprecated + +The API endpoints `/_admin/statistics` and `/_admin/statistics-description` are +now deprecated in favor of the new metrics API endpoint `/_admin/metrics/v2`. +The metrics endpoint provides a lot more information than the statistics +endpoints, and will also be augmented with more metrics in the future. +The statistics endpoints will still be functional in 3.8, but will eventually +be removed in a future version of ArangoDB. + +The REST API endpoint `/_api/export` is also deprecated in ArangoDB 3.8. This +endpoint was previously only present in single server, but never supported in +cluster deployments. The purpose of the endpoint was to provide the full data +of a collection without holding collection locks for a long time, which was +useful for the MMFile storage engine with its collection-level locks. If the +functionality provided by this endpoint is still required by client +applications, running a streaming AQL query to export the collection data can +be used as a substitution. + +### Endpoints removed + +The API endpoint `/_admin/repair/distributeShardsLike` for repairing the +`distributeShardsLike` settings of cluster collections introduced before +version 3.2.12 or 3.3.4 respectively, is now deprecated and removed from +documentation. + +There should not be any reasons to use this API with 3.8 or higher, and there +was never any driver or official script support for it. The endpoint will be +removed in ArangoDB 3.9. + +## JavaScript API + +- The JavaScript API for starting a Pregel run `/_api/control-pregel` now returns the + Pregel execution number as a stringified execution number, e.g. "12345" instead + of 12345. + This is not downwards-compatible. Foxx services, arangosh scripts etc. that depend + on the return value being a numeric value may need to be adjusted to handle + a string return value and convert that string into a number. + +## ArangoDB Server Environment Variables + +The new environment variable `TZ_DATA` can be used to specify the path to the +directory containing the timezone information database for ArangoDB. +That directory is normally named `tzdata` and is shipped with ArangoDB releases. +It is normally not required to set this environment variable, but it may be +necessary in unusual setups with non-conventional directory layouts and paths. diff --git a/site/content/arangodb/oem/release-notes/version-3.8/incompatible-changes-in-3-8.md b/site/content/arangodb/oem/release-notes/version-3.8/incompatible-changes-in-3-8.md new file mode 100644 index 0000000000..064b076cab --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.8/incompatible-changes-in-3-8.md @@ -0,0 +1,568 @@ +--- +title: Incompatible changes in ArangoDB 3.8 +menuTitle: Incompatible changes in 3.8 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Foxx + +The default value of the startup option `--foxx.force-update-on-startup` changes +from `true` to `false` in ArangoDB 3.8. +This option controls whether the startup procedure should synchronize all Foxx +apps in all databases before making them available, or whether startup should +proceed without ensuring all Foxx apps are in sync. In the latter case, the +synchronization will happen eventually. + +In ArangoDB 3.6 and 3.7, the option's default value is `true`, meaning all Foxx apps +in all databases will be synchronized on server startup. This can delay the startup +procedure for installations with many databases, and is unnecessary in case no +Foxx apps are used. + +In ArangoDB 3.8 the default value for the option is `false`, meaning a server will +complete the boot sequence faster, and the Foxx services will be synchronized in +a background operation. Until that operation has completed, any requests to a +Foxx app may be responded to with an HTTP 503 error and message + +``` +waiting for initialization of Foxx services in this database +``` + +This can cause an unavailability window for Foxx apps for the initial requests to +Foxx apps. + +This option only has an effect for cluster setups. On single servers and in +active failover mode, all Foxx apps will always be initialized completely when +the server starts up, and there will be no unavailability window. + +## Collection attributes + +The collection properties `indexBuckets`, `journalSize`, `doCompact` and +`isVolatile` only had a meaning for the MMFiles storage engine, which is not +available anymore since ArangoDB 3.7. + +ArangoDB 3.8 now removes any special handling for these obsolete collection +properties, meaning these attributes will not be processed by the server and +not be returned by any server APIs. Using these attributes in any API call +will be ignored, and will not trigger any errors. + +Client applications and tests that rely on the behavior that setting any of +these obsolete properties produces an error on the server side may need to +be adjusted now. + +## Startup options + +### Renamed options + +The following startup options have been renamed in ArangoDB 3.8: + +| Old name | New name | +|:---------|:---------| +| `--javascript.startup-options-whitelist` | `--javascript.startup-options-allowlist` +| `--javascript.startup-options-blacklist` | `--javascript.startup-options-denylist` +| `--javascript.environment-variables-whitelist` | `--javascript.environment-variables-allowlist` +| `--javascript.environment-variables-blacklist` | `--javascript.environment-variables-denylist` +| `--javascript.endpoints-whitelist` | `--javascript.endpoints-allowlist` +| `--javascript.endpoints-blacklist` | `--javascript.endpoints-denylist` +| `--javascript.files-whitelist` | `--javascript.files-allowlist` + +Using the old option names will still work in ArangoDB 3.8, but is discouraged. + +### Deprecated options + +The following server startup options have been obsoleted in ArangoDB 3.8: + +- `--database.throw-collection-not-loaded-error` +- `--ttl.only-loaded-collection` + +These options were meaningful for the MMFiles storage engine only, but for +the RocksDB storage engine they did not make any difference. Using these startup +options is still possible, but will have no effect other than generating a +warning at server startup. + +The following arangosearch-related startup options are deprecated in ArangoDB 3.8: + +- `--arangosearch.threads` +- `--arangosearch.threads-limit` + +There are two new options for each of the deprecated options, now allowing to +set the minimum and maximum number of threads for committing and consolidation +separately. If either `--arangosearch.commit-threads` or +`--arangosearch.consolidation-threads` is set, then both deprecated options are +ignored. If only the legacy options are set, then they are used to calculate +the thread count. See +[ArangoDB Server ArangoSearch Options](../../components/arangodb-server/options.md#arangosearch). + +### Changed default values + +#### System collections + +The default value for the startup option `--database.old-system-collections` is +changed from `true` to `false` in ArangoDB 3.8. + +This means that by default the system collections `_modules` and `_fishbowl` will +not be created anymore when a new database is created. These collections are useful +only in very few cases, so it is normally not worth to create them in all databases. + +Already existing `_modules` and `_fishbowl` system collections will not be modified +by this default value change, even though they will likely be empty and unused. + +The long-term side effects of this change will be: +- there will be no iteration over all databases at server startup just to check + the contents of all `_modules` collections. +- less collections/shards will be around for deployments that create a large + number of databases (and thus the default system collections). + +Any functionality related to the `_modules` system collection is deprecated in +ArangoDB 3.8 and will be removed in ArangoDB 3.9. + +#### Foxx + +The default value for `--foxx.force-update-on-startup` changed from `true` in +previous version to `false` in ArangoDB 3.8, also see [Foxx](#foxx) above. + +#### RocksDB + +The value of the startup option `--rocksdb.block-cache-size` is limited to 1 GB +for agent instances to reduce agency RAM usage, unless the option is explicitly +configured otherwise. + +In addition, the value of `--rocksdb.total-write-buffer-size` is limited to 512 MB +on agent instances for the same reason, unless otherwise configuration. + +No limitations apply for DB-Server instances or single servers. + +#### Network + +The default value for the number of network I/O threads `--network.io-threads` +was changed to `2` in ArangoDB 3.8, up from a value of `1` in previous version. + +#### Stream Transactions + +The idle timeout for Stream Transactions was raised from 10 seconds to 60 +seconds in ArangoDB 3.8. The default value can be adjusted via the new startup +option `--transaction.streaming-idle-timeout`. The maximum value is 120 seconds. + +Stream Transactions will automatically time out after the configured idle +period if no further operations are posted into them. Posting an operation into +a non-expired Stream Transaction will reset the transaction's timeout to the +configured idle timeout. + +Previous versions of ArangoDB had a hard-coded idle timeout for +Stream Transactions which could not be adjusted. + +#### File descriptors + +The default value for `--server.descriptors-minimum` changed from `0` in previous +versions to `8192` in ArangoDB 3.8. +This change means that on Linux and macOS, the system limits need to allow the +arangod process to use at least 8192 file descriptors. +If less file descriptors are available to the arangod process, then the startup +process of the arangod server is automatically aborted. + +Even the chosen minimum value of 8192 will often not be high enough to store +considerable amounts of data. However, no higher value was chosen in order to not +make too many existing installations fail after upgrading. + +The required number of file descriptors can be configured using the startup option +`--server.descriptors-minimum`. It now defaults to 8192, but it can be increased +to ensure that arangod can make use of a sufficiently high number of files. + +Setting `--server.descriptors-minimum` to a value of `0` will make the startup +require only an absolute minimum limit of 1024 file descriptors, effectively +disabling the change. Such low values should only be used to bypass the file +descriptors check in case of an emergency, but this is not recommended for production. + +#### Scheduler + +The default value of the startup option `--server.unavailability-queue-fill-grade` +has been changed from value `1` in previous versions to a value of `0.75` in ArangoDB +3.8. + +This change has a consequence for the `/_admin/server/availability` REST API only, +which is often called by load-balancers and other availability probing systems. + +The `/_admin/server/availability` API will return HTTP 200 if the fill grade of the +scheduler's queue is below the configured value, or HTTP 503 if the fill grade is +above it. This can be used to flag a server as unavailable in case it is already +highly loaded. + +The default value change for this option will lead to server's reporting their +unavailability earlier than previous versions of ArangoDB. With only the default +values used, ArangoDB versions prior to 3.8 reported unavailability only if the +queue was completely full, which means 4096 pending requests in the queue. +ArangoDB 3.8 will report as unavailable if the queue is 75% full, i.e when 3072 +or more jobs are queued in the scheduler. + +Although this is a behavior change, 75% is still a high watermark and should not +cause unavailability false-positives. +However, to restore the pre-3.8 behavior, it is possible to set the value of +this option to `1`. The value can even be set to `0` to disable using the +scheduler's queue fill grade as an (un)availability indicator. + +### AQL query memory usage + +#### Per-query memory limit + +ArangoDB 3.8 introduces a default per-query memory limit to prevent rogue AQL +queries from consuming the entire memory available to an arangod instance. + +The per-query memory limit is introduced via changing the default value of the +startup option `--query.memory-limit` from previously `0` (meaning: no limit) +to a dynamically calculated value. The per-query memory limit defaults are now: + +``` +Available memory: 0 (0MiB) Limit: 0 unlimited, %mem: n/a +Available memory: 134217728 (128MiB) Limit: 33554432 (32MiB), %mem: 25.0 +Available memory: 268435456 (256MiB) Limit: 67108864 (64MiB), %mem: 25.0 +Available memory: 536870912 (512MiB) Limit: 201326592 (192MiB), %mem: 37.5 +Available memory: 805306368 (768MiB) Limit: 402653184 (384MiB), %mem: 50.0 +Available memory: 1073741824 (1024MiB) Limit: 603979776 (576MiB), %mem: 56.2 +Available memory: 2147483648 (2048MiB) Limit: 1288490189 (1228MiB), %mem: 60.0 +Available memory: 4294967296 (4096MiB) Limit: 2576980377 (2457MiB), %mem: 60.0 +Available memory: 8589934592 (8192MiB) Limit: 5153960755 (4915MiB), %mem: 60.0 +Available memory: 17179869184 (16384MiB) Limit: 10307921511 (9830MiB), %mem: 60.0 +Available memory: 25769803776 (24576MiB) Limit: 15461882265 (14745MiB), %mem: 60.0 +Available memory: 34359738368 (32768MiB) Limit: 20615843021 (19660MiB), %mem: 60.0 +Available memory: 42949672960 (40960MiB) Limit: 25769803776 (24576MiB), %mem: 60.0 +Available memory: 68719476736 (65536MiB) Limit: 41231686041 (39321MiB), %mem: 60.0 +Available memory: 103079215104 (98304MiB) Limit: 61847529063 (58982MiB), %mem: 60.0 +Available memory: 137438953472 (131072MiB) Limit: 82463372083 (78643MiB), %mem: 60.0 +Available memory: 274877906944 (262144MiB) Limit: 164926744167 (157286MiB), %mem: 60.0 +Available memory: 549755813888 (524288MiB) Limit: 329853488333 (314572MiB), %mem: 60.0 +``` + +As before, a memory limit value of `0` means no per-query limitation. +The limit values are per AQL query, so they may still be too high in case +queries run in parallel. The defaults are intentionally high in order to not +stop too many existing and valid queries from working that use _a lot_ of memory. + +Using a per-query memory limit by default is a downwards-incompatible change in +ArangoDB 3.8 and may make queries fail if they use a lot of memory. If this +happens, it may be useful to increase the value of `--query.memory-limit` or +even set it to `0` (meaning no limitation). +There is a metric `arangodb_aql_local_query_memory_limit_reached` that can be +used to check how many times queries reached the per-query memory limit. + +#### Global memory limit + +ArangoDB 3.8 also introduces a global memory limit for all AQL queries that +limits the total amount of memory that can be used by concurrently running +queries. Such global memory limit did not exist in previous versions of ArangoDB. + +The global query memory limit can be controlled via the new startup option +`--query.global-memory-limit`, which has a default value that depends on the +amount of available RAM: + +``` +Available memory: 0 (0MiB) Limit: 0 unlimited, %mem: n/a +Available memory: 134217728 (128MiB) Limit: 33554432 (32MiB), %mem: 25.0 +Available memory: 268435456 (256MiB) Limit: 67108864 (64MiB), %mem: 25.0 +Available memory: 536870912 (512MiB) Limit: 255013683 (243MiB), %mem: 47.5 +Available memory: 805306368 (768MiB) Limit: 510027366 (486MiB), %mem: 63.3 +Available memory: 1073741824 (1024MiB) Limit: 765041049 (729MiB), %mem: 71.2 +Available memory: 2147483648 (2048MiB) Limit: 1785095782 (1702MiB), %mem: 83.1 +Available memory: 4294967296 (4096MiB) Limit: 3825205248 (3648MiB), %mem: 89.0 +Available memory: 8589934592 (8192MiB) Limit: 7752415969 (7393MiB), %mem: 90.2 +Available memory: 17179869184 (16384MiB) Limit: 15504831938 (14786MiB), %mem: 90.2 +Available memory: 25769803776 (24576MiB) Limit: 23257247908 (22179MiB), %mem: 90.2 +Available memory: 34359738368 (32768MiB) Limit: 31009663877 (29573MiB), %mem: 90.2 +Available memory: 42949672960 (40960MiB) Limit: 38762079846 (36966MiB), %mem: 90.2 +Available memory: 68719476736 (65536MiB) Limit: 62019327755 (59146MiB), %mem: 90.2 +Available memory: 103079215104 (98304MiB) Limit: 93028991631 (88719MiB), %mem: 90.2 +Available memory: 137438953472 (131072MiB) Limit: 124038655509 (118292MiB), %mem: 90.2 +Available memory: 274877906944 (262144MiB) Limit: 248077311017 (236584MiB), %mem: 90.2 +Available memory: 549755813888 (524288MiB) Limit: 496154622034 (473169MiB), %mem: 90.2 +``` + +Using a global memory limit for all queries by default is a +downwards-incompatible change in ArangoDB 3.8 and may make queries fail if they +use a lot of memory. If this happens, it may be useful to increase the value of +`--query.global-memory-limit` or even set it to `0` (meaning no limitation). +There is a metric `arangodb_aql_global_query_memory_limit_reached` that can be +used to check how many times queries reached the global memory limit. + +#### Memory usage granularity + +In ArangoDB 3.8, the per-query memory and global query memory tracking have a +granularity of 32 KB chunks. That means checking for memory limits such as "1" +(e.g. for testing) may not make a query fail if the total memory allocations +in the query will not exceed 32 KB. The effective lowest memory limit value +that can be enforced is thus 32 KB. Memory limit values higher than 32 KB will +be checked whenever the total memory allocations cross a 32 KB boundary. + +The peak memory usage reported for AQL queries will also only return full +multiples of 32 KB in ArangoDB 3.8, whereas in previous versions it may have +reported values with higher granularity. + +### Audit Logging (Enterprise Edition) + +The Enterprise Edition's audit log feature now honors the configured +date/time output format. Previously, the audit logging always logged date/time +values in the server's local time in the format `YYYY-MM-DDTHH:MM:SS`. + +From 3.8 onwards, the audit logging will honor the date/time format specified +via the `--log.time-format` startup option, which defaults to `utc-datestring`. +That means the audit logging will log all dates/times in UTC time by default. + +To restore the pre-3.8 format, please set the option `--log.time-format` to +`local-datestring`, which will make the audit logger (and all other server log +messages) use the server's local time. + +## HTTP RESTful API + +### Www-Authenticate response header + +ArangoDB 3.8 adds back the `Www-Authenticate` response header for HTTP server +responses with a status code of 401. Returning the `Www-Authenticate` header for +401 responses is required by the HTTP/1.1 specification and was also advertised +functionality in the ArangoDB documentation, but wasn't happening in practice. + +Now the functionality of returning `Www-Authenticate` response headers for HTTP +401 responses is restored, along with the already advertised functionality of +suppressing this header in case the client sends an `X-Omit-Www-Authenticate` +header with the request. + +This change should not have any impact for client applications that use ArangoDB +as a database only. It may have an effect for Foxx applications that use HTTP +401 status code responses and that will now see this extra header getting returned. + +### Endpoint return value changes + +- The endpoint `/_api/replication/clusterInventory` returns, among other things, + an array of the existing collections. Each collection has a `planVersion` + attribute, which in ArangoDB 3.8 is now hard-coded to the value of 1. + + Before 3.7, the most recent Plan version from the agency was returned inside + `planVersion` for each collection. In 3.7, the attribute contained the Plan + version that was in use when the in-memory LogicalCollection object was last + constructed. The object was always reconstructed in case the underlying Plan + data for the collection changed, or when a collection contained links to + ArangoSearch Views. This made the attribute relatively useless for any + real-world use cases, and so we are now hard-coding it to simplify the internal + code. Using the attribute in client applications is also deprecated, because + it will be removed from the API's return value in future versions of ArangoDB. + +- The endpoint `/_admin/metrics` for server metrics is unchanged but is + declared obsolete from 3.8 on. This is, because we have moved to a new + endpoint `/_admin/metrics/v2`, which is more in line with Prometheus + conventions. See [Features and Improvements in 3.8](whats-new-in-3-8.md#metrics). + + The migration from 3.7 to 3.8 is straightforward: You can keep your old + metrics collection in Prometheus using the old endpoint and thus have + continuous collection of metrics and simply keep your old dashboards + for a while after the upgrade. However, you should then add metrics + collections from the new endpoint `/_admin/metrics/v2` and use the new + dashboards we deliver for 3.8. The new dashboards know all the new + names and the new, corrected format of the output. Over time, you can + then retire your old metrics collection process and dashboards. + +- Changed the encoding of revision IDs returned by the below listed REST APIs. + + <small>Introduced in: v3.8.8</small> + + - `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. + - `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +### Optional lockdown of `/_admin/cluster` REST API + +ArangoDB 3.8 provides a new startup option `--cluster.api-jwt-policy` that +allows *additional* checking for valid JWTs in all requests to sub-routes of +the `/_admin/cluster` REST API endpoint. +This is a security option to restrict access to these cluster APIs to +operator tools and privileged users. + +The possible values for the startup option are: + +- `jwt-all`: requires a valid JWT for all accesses to `/_admin/cluster` and + its sub-routes. If this configuration is used, the _CLUSTER_ and _NODES_ + sections of the web interface will be disabled, as they are relying on the + ability to read data from several cluster APIs. +- `jwt-write`: requires a valid JWT for write accesses (all HTTP methods + except HTTP GET) to `/_admin/cluster`. This setting can be used to allow + privileged users to read data from the cluster APIs, but not to do any + modifications. All existing permissions checks for the cluster API routes + are still in effect with this setting, meaning that read operations without + a valid JWT may still require dedicated other permissions (as in v3.7). +- `jwt-compat`: no *additional* access checks are in place for the cluster + APIs. However, all existing permissions checks for the cluster API routes + are still in effect with this setting, meaning that all operations may + still require dedicated other permissions (as in v3.7). + +The default value for the option is `jwt-compat`, which means this option will +not cause any *extra* JWT checks compared to v3.7. + +If this option is changed to either `jwt-all` or `jwt-write`, non-conforming +requests without valid JWTs will be responded with HTTP 403 (Forbidden) errors. +This can have impact on custom tooling and monitoring etc. + +## AQL + +### Graph traversal option `bfs` deprecated + +The graph traversal option `bfs` is now deprecated and superseded by the new +option `order`. + +The preferred way to start a breadth-first search from now on is with +`order: "bfs"`. The default remains depth-first search if no `order` is +specified, but can also be explicitly requested with `order: "dfs"`. + +### New `WINDOW` keyword + +A new keyword `WINDOW` was added to AQL in ArangoDB 3.8. Any existing AQL +queries that use `WINDOW` (in any capitalization) as a variable name, +collection or View name or refer to an attribute named `WINDOW` will likely +run into parse errors when upgrading to ArangoDB 3.8. + +When a query is affect, the fix is to put the name `WINDOW` into backticks +inside the query, in the same way as when using other reserved keywords as +identifiers/names in AQL queries. + +For example, the query: + +```aql +FOR status IN Window + RETURN status.open +``` + +… will need to be adjusted to: + +```aql +FOR status IN `Window` + RETURN status.open +``` + +## Subqueries + +The AQL optimizer rule `splice-subqueries` was introduced in ArangoDB 3.6 to +optimize most subqueries, and it was extended in 3.7 to work with all types +of subqueries. It was always turned on by default, but it still could be +deactivated manually using a startup option (`--query.optimizer-rules`) or +for individual queries via the `optimizer.rules` query option. + +In ArangoDB 3.8, the optimizer rule `splice-subqueries` is now required for +subquery execution, and cannot be turned off. Trying to disable it via the +mentioned startup option or query option has no effect, as the optimizer rule +will always run for queries containing subqueries. + +### UPDATE queries with `keepNull: false` + +AQL update queries using the `keepNull` option set to false had an inconsistent +behavior in previous versions of ArangoDB. + +For example, given a collection `test` with an empty document with just key +`testDoc`, the following query would return different results when running for +the first time and the second time: + +```aql +UPDATE 'testDoc' +WITH { test: { sub1: true, sub2: null } } IN test +OPTIONS { keepNull: false, mergeObjects: true } +``` + +On its first run, the query would return: + +```json +{ + "_key": "testDoc", + "test": { + "sub1": true, + "sub2": null + } +} +``` + +(with the `null` attribute value not being removed). For all subsequent runs, +the same query would return: + +```json +{ + "_key": "testDoc", + "test": { + "sub1": true, + } +} +``` + +(with the `null` value removed as requested). + +This inconsistency was due to how the `keepNull` attribute was handled if +the attribute already existed in the to-be-updated document or not. The +behavior is now consistent, so `null` values are now properly removed from +sub-attributes even if in the to-be-updated document the target attribute +did not yet exist. This makes such updates idempotent again. + +This a behavior change compared previous versions, but it will only have +effect when `keepNull` is set to `false` (the default value is `true`), +and only when just-inserted object sub-attributes contained `null` values. + +## Pregel + +The HTTP and JavaScript APIs for controlling Pregel jobs now also accept +stringified execution number values, in addition to numeric ones. + +This allows passing larger execution numbers as strings, so that any data +loss due to numeric data type conversion (uint32 => double) can be avoided. +This change is downwards-compatible. + +However, the HTTP and JavaScript APIs for starting Pregel runs now also +return a stringified execution number, e.g. "12345" instead of 12345. +This is not downwards-compatible, so all client applications that depend +on the return value being a numeric value need to be adjusted to handle +a string return value and convert that string into a number. + +## Document operations + +### Update operations with `keepNull: false` + +Non-AQL document update operations using the `keepNull` option set to false had +an inconsistent behavior in previous versions of ArangoDB. + +For example, given a collection `test` with an empty document with just key `testDoc`, +the following operation would produce different documents when running for the first +time and the second time: + +```js +db.test.update("testDoc", { test: { sub1: true, sub2: null } }, { keepNull: false }); +``` + +Also see [AQL UPDATE queries with `keepNull: false`](#update-queries-with-keepnull-false) + +## Client tools + +### arangoimport + +The default value for arangoimport's `--batch-size` option was raised from +1 MB to 8 MB. This means that arangoimport can send larger batches containing +more documents. + +_arangoimport_ also has a rate limiting feature, which was turned on by default +previously. This rate limiting feature limited the import rate to 1 MB per +second, which is probably too low for most use cases. In ArangoDB 3.8, the +rate limiting for arangoimport is now turned off by default, but can be +enabled on demand using the new `--auto-rate-limit` option. When enabled, it +will start sending batches with up to `--batch-size` bytes, and then adapt +the loading rate dynamically. + +### arangodump + +arangodump can now dump multiple shards of cluster collections in parallel. +While this normally helps with dump performance, it may lead to more arangodump +issuing more concurrent requests to a cluster than it did before. + +Previously, arangodump's `--threads` option controlled how many collections were +dumped concurrently, at most. As arangodump can now dump the shards of +collections in parallel, `--threads` now controls the maximum amount of shards +that are dumped concurrently. + +If arangodump now causes too much load on a cluster with a high degree of +parallelism, it is possible to reduce it by decreasing arangodump's `--threads` +value. The value of `--threads` will the determine the maximum parallelism +used by arangodump. diff --git a/site/content/arangodb/oem/release-notes/version-3.8/known-issues-in-3-8.md b/site/content/arangodb/oem/release-notes/version-3.8/known-issues-in-3-8.md new file mode 100644 index 0000000000..2aee7f62fe --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.8/known-issues-in-3-8.md @@ -0,0 +1,68 @@ +--- +title: Known Issues in ArangoDB 3.8 +menuTitle: Known Issues in 3.8 +weight: 10 +description: >- + Important issues affecting the 3.8.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by ArangoSearch view may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in ArangoSearch View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | +| **Date Added:** 2021-06-08 <br> **Component:** Analyzers <br> **Deployment Mode:** All <br> **Description:** Some implementation and usability issues were found with the new `stopwords` Analyzers. Therefore, it was removed from documentation for the time being. Technically, it is available in v3.8.0, but its usage is strongly discouraged until an improved version is released with v3.8.1. <br> **Affected Versions:** 3.8.0 <br> **Fixed in Versions:** 3.8.1 <br> **Reference:** [QA-66](https://arangodb.atlassian.net/browse/QA-66) (internal) | + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | +| **Date Added:** 2021-04-19 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** User-defined variable names in AQL cannot start with an underscore, in contrast to what the AQL documentation claimed. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.9.0 <br> **Reference:** [arangodb/arangodb#13513](https://github.com/arangodb/arangodb/issues/13513) | +| **Date Added:** 2021-05-25 <br> **Component:** AQL <br> **Deployment Mode:** All <br> **Description:** Global and per-query memory limits are not enforced for `SHORTEST_PATH` and `K_SHORTEST_PATHS` AQL graph traversals. Such queries may thus cause out-of-memory issues as they will not be killed despite exceeding the configured `--query.memory-limit` or Cursor API `memoryLimit`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.8.1 <br> **Reference:** [BTS-411](https://arangodb.atlassian.net/browse/BTS-411) (internal) | +| **Date Added:** 2022-08-12 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** Since ArangoDB 3.8, there was a loophole for creating duplicate keys in the same collection. This was only possible in cluster and needed an AQL query that copied over data from a collection (source) into another (target). The target collection must have more than one shard and must use a custom shard key. Inserting documents into the target collection must have happened via an AQL query like `FOR doc IN source INSERT doc INTO target`. In this particular situation, the document keys (`_key` attribute) from the source collection were used as-is for insertion into the target collection. However, as the target collection is not sharded by `_key` and uses a custom shard key, it is actually not allowed to specify user-defined values for `_key`. Versions before 3.8 failed with the error "must not specify _key for this collection" when running such an AQL query, but versions between 3.8.0 and 3.8.7 did not. <br> **Affected Versions:** 3.8.0 - 3.8.7 <br> **Fixed in Versions:** 3.8.8 <br> **Reference:** [arangodb/arangodb#16764](https://github.com/arangodb/arangodb/issues/16764) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-08-06 <br> **Component:** Coordinator <br> **Deployment Mode:** Cluster <br> **Description:** Restoring a hot backup to another deployment that has databases with the same names as in the backup can cause these databases to become inaccessible on Coordinators. They can be listed with `db._databases()` in arangosh, but not accessed using `db._useDatabase()`. <br> **Affected Versions:** 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.7.14, 3.8.1 <br> **Reference:** [BTS-527](https://arangodb.atlassian.net/browse/BTS-527) (internal) | + +## Schema Validation + +| Issue | +|------------| +| **Date Added:** 2019-03-17 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** The schema validation cannot pin-point which part of a rule made it fail. This is under investigation but very hard to solve for complex schemas. For example, when using `not` and `anyOf`, this would result in trees of possible errors. For now users should fall back to tools like [jsonschemavalidator.net](https://www.jsonschemavalidator.net/) <br> **Affected Versions:** 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-03-17 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** Remote schemas are not supported for security reasons. This limitation will likely remain unfixed. <br> **Affected Versions:** 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-06-25 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** When using arangorestore for a collection with a defined schema, schema validation is not executed. <br> **Affected Versions:** 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-24 <br> **Component:** Web UI <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Leader/Follower mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-04-03 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Updating the properties of a collection in the cluster may return before the properties are updated consistently on all shards. This is especially visible when setting a schema for a collection with multiple shards, and then instantly starting to store non-conforming documents into the collection. These may be accepted until the properties change has been fully propagated to all shards. <br> **Affected Versions:** 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | +| **Date Added:** 2021-07-09 <br> **Component:** Web UI <br> **Deployment Mode:** All <br> **Description:** When clicking the *LOGS* menu entry in the web interface for the second time, the view becomes unresponsive and does not display any data. Reloading the web interface helps to work around the problem. <br> **Affected Versions:** 3.8.0 <br> **Fixed in Versions:** - <br> **Reference:** [BTS-507](https://arangodb.atlassian.net/browse/BTS-507) (internal) | +| **Date Added:** 2021-08-06 <br> **Component:** Installer <br> **Deployment Mode:** Single Server <br> **Description:** The Windows installer fails during database initialization with the error `failed to locate tzdata` if there are non-ASCII characters in the destination path. <br> **Affected Versions:** 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-531](https://arangodb.atlassian.net/browse/BTS-531) (internal) | +| **Date Added:** 2022-01-31 <br> **Component:** ArangoSync, SmartGraphs <br> **Deployment Mode:** DC2DC <br> **Description:** In a DC2DC replication scenario, when you try to replicate a Disjoint Smartgraph, the sync of collections may get stuck. <br> **Affected Versions:** 3.7.x, 3.8.x <br> **Fixed in Versions:** 3.8.7 <br> **Reference:** [BTS-737](https://arangodb.atlassian.net/browse/BTS-737) (internal) | +| **Date Added:** 2022-05-30 <br> **Component:** ArangoSync <br> **Deployment Mode:** DC2DC <br> **Description:** In a DC2DC replication scenario, _users collection may fail to be replicated. <br> **Affected Versions:** 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-854](https://arangodb.atlassian.net/browse/BTS-854) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter may fail to pick a Docker container name from cgroups. <br> **Affected Versions:** 3.8.x <br> **Fixed in Versions:** - <br> **Reference:** [GT-207](https://arangodb.atlassian.net/browse/GT-207) (internal) | +| **Date Added:** 2022-10-26 <br> **Component:** ArangoSync <br> **Deployment Mode:** DC2DC <br> **Description:** When upgrading from/to 3.8.8, the _analyzers collection cannot be replicated. <br> **Affected Versions:** 3.8.8 <br> **Fixed in Versions:** 3.8.9 <br> **Reference:** [BTS-1094](https://arangodb.atlassian.net/browse/BTS-1094) (internal) | diff --git a/site/content/arangodb/oem/release-notes/version-3.8/whats-new-in-3-8.md b/site/content/arangodb/oem/release-notes/version-3.8/whats-new-in-3-8.md new file mode 100644 index 0000000000..0423b45d3a --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.8/whats-new-in-3-8.md @@ -0,0 +1,1147 @@ +--- +title: Features and Improvements in ArangoDB 3.8 +menuTitle: What's New in 3.8 +weight: 5 +description: >- + Sliding window aggregation, new graph algorithms, powerful user-defined + Analyzers, AQL performance and usability improvements +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.8. ArangoDB 3.8 also contains several bug fixes that are not listed +here. + +## AQL + +### AQL window operations + +The `WINDOW` keyword can be used for aggregations over related rows, usually +preceding and / or following rows. + +The `WINDOW` operation performs a `COLLECT AGGREGATE`-like operation on a set +of query rows. However, whereas a `COLLECT` operation groups multiple query +rows into a single result group, a `WINDOW` operation produces a result for +each query row: + +- The row for which function evaluation occurs is called the current row. +- The query rows related to the current row over which function evaluation + occurs, comprise the window frame for the current row. + +Window frames are determined with respect to the current row: + +- By defining a window frame to be all rows from the query start to the current + row, you can compute running totals for each row. +- By defining a frame as extending *N* rows on either side of the current row, + you can compute rolling averages. + +See [`WINDOW` operation](../../aql/high-level-operations/window.md). + +### Weighted Traversals + +The graph traversal option `bfs` is now deprecated and superseded by the new +option `order`. It supports a new traversal type `"weighted"`, which enumerate +paths by increasing weights. + +The cost of an edge can be read from an attribute which can be specified with +the `weightAttribute` option. + +```aql +FOR x, v, p IN 0..10 OUTBOUND "places/York" GRAPH "kShortestPathsGraph" + OPTIONS { + order: "weighted", + weightAttribute: "travelTime", + uniqueVertices: "path" + } + FILTER p.edges[*].travelTime ALL < 3 + LET totalTime = LAST(p.weights) + FILTER totalTime < 6 + SORT totalTime DESC + RETURN { + path: p.vertices[*]._key, + weight: LAST(p.weights), + weights: p.edges[*].travelTime + } +``` + +`path` | `weight` | `weights` +:------|:---------|:--------- +`["York","London","Birmingham","Carlisle"]` | `5.3` | `[1.8,2.5,1]` +`["York","London","Birmingham"]` | `4.3` | `[1.8,2.5]` +`["York","London","Brussels"]` | `4.3` | `[1.8,2.5]` +`["York","London"]` | `1.8` | `[1.8]` +`["York"]` | `0` | `[]` + +{{< info >}} +Weighted traversals do not support negative weights. If a document +attribute (as specified by `weightAttribute`) with a negative value is +encountered during traversal, or if `defaultWeight` is set to a negative +number, then the query is aborted with an error. +{{< /info >}} + +The preferred way to start a breadth-first search from now on is with +`order: "bfs"`. The default remains depth-first search if no `order` is +specified, but can also be explicitly requested with `order: "dfs"`. + +Also see [AQL graph traversals](../../aql/graphs/traversals.md) + +### k Paths + +A new graph traversal method `K_PATHS` was added to AQL. It will enumerate all +paths between a source and a target vertex that match the given path length. + +For example, the query: + +```aql +FOR path IN 2..4 OUTBOUND K_PATHS "v/source" TO "v/target" GRAPH "g" + RETURN path +``` + +… will yield all paths in the format: + +```js +{ + "vertices": ["v/source", ... , "v/target"], + "edges": ["v/source" -> "v/1", ... , "v/n" -> "v/target"] +} +``` + +… that have length of exactly 2 or 3 or 4, start at `v/source` and end at +`v/target`. No order is guaranteed for those paths in the result set. + +For more details see [AQL k Paths](../../aql/graphs/k-paths.md) + +### AQL bit functions + +ArangoDB 3.8 adds the following bit handling functions to AQL: + +- `BIT_AND()`: and-combine two or more numbers +- `BIT_OR()`: or-combine two or more numbers +- `BIT_XOR()`: xor-combine two or more numbers +- `BIT_NEGATE()`: bitwise negation +- `BIT_TEST()`: test if bit is set at position +- `BIT_POPCOUNT()`: number of bits set +- `BIT_SHIFT_LEFT()`: bitwise shift-left +- `BIT_SHIFT_RIGHT()`: bitwise shift-right +- `BIT_CONSTRUCT()`: construct a number with bits set at given positions +- `BIT_DECONSTRUCT()`: deconstruct a number into an array with the positions of its set bits +- `BIT_TO_STRING()`: create a bitstring representation from a numeric value +- `BIT_FROM_STRING()`: parse a bitstring representation into a number + +Also see [Bit functions](../../aql/functions/bit.md). + +`BIT_AND()`, `BIT_OR()` and `BIT_XOR()` are also available as aggregate +functions for usage inside [`COLLECT AGGREGATE`](../../aql/high-level-operations/collect.md#aggregation). + +All above bit operations support unsigned integer values with up to 32 bits. +Using values outside the supported range will make any of these bit functions +return `null` and register a warning. + +This functionality has been backported to v3.7.7 as well. + +### AQL binary and hexadecimal integer literals + +ArangoDB 3.8 allows using binary (base 2) and hexadecimal (base 16) integer +literals in AQL. These literals can be used where regular (base 10) integer +literals can be used. + +- The prefix for binary integer literals is `0b`, e.g. `0b10101110`. +- The prefix for hexadecimal integer literals is `0x`, e.g. `0xabcdef02`. + +Binary and hexadecimal integer literals can only be used for unsigned integers. +The maximum supported value is 2<sup>32</sup> - 1, i.e. +`0b11111111111111111111111111111111` (binary) or `0xffffffff` (hexadecimal). + +This functionality has been backported to v3.7.7 as well. + +### Projections on sub-attributes + +AQL now also support projections on sub-attributes (e.g. `a.b.c`). + +In previous versions of ArangoDB, projections were only supported on top-level +attributes. For example, in the query: + +```aql +FOR doc IN collection + RETURN doc.a.b +``` + +… the projection that was used was just `a`. Now the projection will be `a.b`, +which can help reduce the amount of data to be extracted from documents, when +only some sub-attributes are accessed. + +In addition, indexes can now be used to extract the data of sub-attributes +for projections. If for the above example query an index on `a.b` exists, +it will be used now. Previously, no index could be used for this projection. + +Projections now can also be fed by any attribute in a combined index. +For example, in the query: + +```aql +FOR doc IN collection + RETURN doc.b +``` + +… the projection can be satisfied by a single-attribute index on attribute `b`, +but now also by a combined index on attributes `a` and `b` (or `b` and `a`). + +### AQL optimizer improvements + +The "move-calculations-up" optimizer rule was improved so that it can move +calculations out of subqueries into the outer query, so that they will be +executed less often. + +In queries or subqueries that return only constant values and/or that assign +constant values to variables, these constant values are now stored only once +per query and not once input row. This can slightly improve memory usage and +execution time of such queries. + +Explaining a query now also shows the query optimizer rules with the highest +execution times in the explain output. + +### AQL performance improvements + +The performance of AQL `standard` sort operations has been improved in ArangoDB +3.8. This is true for sorts carried out explicitly by using the `SORT` keyword +and for sorts that are implicitly executed due to using a sorting `COLLECT` +operation. Sort performance is especially better for sorting numeric values. + +The improvements are limited to SortNodes with the `standard` sorting strategy. +SortNodes using the `constrained heap` strategy may not see a speedup. + +There are also performance improvements for `COLLECT` operations that only +count values or that aggregate values using `AGGREGATE`. The exact mileage +can vary, but is substantial for some queries. + +### AQL usability options + +#### Requiring `WITH` statements + +The new startup option `--query.require-with` will make AQL queries in single +server mode also require `WITH` clauses in AQL queries where a cluster +installation would require them. +The option is set to *false* by default, but can be turned on in single servers +to remove this behavior difference between single servers and clusters, making +a later transition from single server to cluster easier. + +#### Allowing the usage of collection names in AQL expressions + +The new startup option `--query.allow-collections-in-expressions` controls +whether using collection names in arbitrary places in AQL expressions is +allowed, although using collection names like this is very likely unintended. + +For example, consider the query + +```aql +FOR doc IN collection RETURN collection +``` + +Here, the collection name is *collection*, and its usage in the `FOR` loop is +intended and valid. However, *collection* is also used in the `RETURN` +statement, which is legal but potentially unintended. It should likely be +`RETURN doc` or `RETURN doc.someAttribute` instead. Otherwise, the entire +collection will be materialized and returned as many times as there are +documents in the collection. This can take a long time and even lead to +out-of-memory crashes in the worst case. + +Setting the option `--query.allow-collections-in-expression` to *false* will +prohibit such unintentional usage of collection names in queries, and instead +make the query fail with error 1568 ("collection used as expression operand"). + +The default value of the option is *true* in 3.8, meaning that potentially +unintended usage of collection names in queries is still allowed. The default +value for the option will change to *false* in 3.9. The option will also be +deprecated in 3.9 and removed in future versions. From then on, unintended +usage of collection names will always be disallowed. + +Also see [ArangoDB Server Query Options](../../components/arangodb-server/options.md#--queryallow-collections-in-expressions) + +## ArangoSearch + +### Pipeline Analyzer + +Added new Analyzer type `"pipeline"` for chaining effects of multiple Analyzers +into one. It allows you to combine text normalization for a case insensitive +search with _n_-gram tokenization, or to split text at multiple delimiting +characters followed by stemming. + +See [ArangoSearch Pipeline Analyzer](../../index-and-search/analyzers.md#pipeline) + +### AQL Analyzer + +Added new Analyzer type `"aql"` capable of running an AQL query (with some +restrictions) to perform data manipulation/filtering. + +See [ArangoSearch AQL Analyzer](../../index-and-search/analyzers.md#aql) + +### Geo-spatial queries + +Added two Geo Analyzers [`"geojson"`](../../index-and-search/analyzers.md#geojson) +and [`"geopoint"`](../../index-and-search/analyzers.md#geopoint) as well as the +following [ArangoSearch Geo functions](../../aql/functions/arangosearch.md#geo-functions) +which enable geo-spatial queries backed by View indexes: +- `GEO_CONTAINS()` +- `GEO_DISTANCE()` +- `GEO_IN_RANGE()` +- `GEO_INTERSECTS()` + +### Stop words Analyzer + +<small>Introduced in: v3.8.1</small> + +Added new Analyzer `"stopwords"` capable of removing specified tokens from the +input. It can be used standalone or be combined with other Analyzers via a +pipeline Analyzer to add stop word functionality to them. Previously, only the +text Analyzer type provided stop word support. + +See [ArangoSearch `stopwords` Analyzer](../../index-and-search/analyzers.md#stopwords) + +### Approximate count + +Added a new option `countApproximate` for `SEARCH` queries to control how the +total count of rows is calculated if the `fullCount` option is enabled for a +query or when a `COLLECT WITH COUNT` clause is executed: + +- `"exact"` (default): rows are actually enumerated for a precise count. +- `"cost"`: a cost based approximation is used. Does not enumerate rows and + returns an approximate result with O(1) complexity. Gives a precise result + if the `SEARCH` condition is empty or if it contains a single term query + only (e.g. `SEARCH doc.field == "value"`), the usual eventual consistency + of Views aside. + +Also see: [AQL `SEARCH` Operation](../../aql/high-level-operations/search.md#search-options) + +This feature was also backported to v3.7.6. + +### ArangoSearch thread control + +Added new command line options for fine-grained control over ArangoSearch's +maintenance threads, now allowing to set the minimum and maximum number of +threads for committing and consolidation separately: + +- `--arangosearch.commit-threads` +- `--arangosearch.commit-threads-idle` +- `--arangosearch.consolidation-threads` +- `--arangosearch.consolidation-threads-idle` + +They supersede the options `--arangosearch.threads` and +`--arangosearch.threads-limit`. See +[ArangoDB Server ArangoSearch Options](../../components/arangodb-server/options.md#arangosearch). + +This feature was also backported to v3.7.5. + +## Web interface + +### Dashboard + +The cluster nodes overview in the web interface will now also display all Agent +instances. Agent failures are now visible there, too. The overview also shows +which agent is currently the leader. + +### Shard distribution overview + +The web interface now provides a shard distribution overview for the entire +cluster. The overview includes general details about cluster-wide distribution +as well as per-server figures for the number of leader and follower shards. + +The shard distribution overview is only available in the `_system` database. + +### Cluster maintenance mode + +Inside the `_system` database of a cluster, the web interface now displays the +cluster supervision maintenance status. This can be used to check if the cluster +is currently in maintenance mode. For users with sufficient privileges, it is +also possible to toggle the maintenance mode from there. + +### Collection figures + +The web interface now displays the approximate size of the data in a collection +for both indexes and documents, based on the estimates provided by RocksDB. + +These are estimates which are intended to be calculated quickly, but are not +perfectly accurate. The estimates can still be useful to get an idea of how +"big" a collection approximately is. The sizing information is provided in the +*Info* tab of each collection's detail view. + +For collections in a cluster, the web interface now displays the number of +documents in each shard (data distribution) plus the leader and follower +DB-Servers for each shard. + +### Server logs in cluster + +The web interface can now display the most recent server log entries for +Coordinators and DB-Servers in a cluster. Logs are made available in the +`_system` database via the _Nodes_ menu item. Up to 2048 log entries will be +kept on each instance. + +The privileges for accessing server logs in the web interface are identical +to the privileges required for accessing logs via the `GET /_admin/log` HTTP +REST API. If security is a concern, in-memory logs buffering can be turned +off entirely using the startup option `--log.in-memory false`, plus the log +API can be turned off or restricted via the `--log.api-enabled false` or +`--log.api-enabled jwt` startup options. + +### Server metrics + +The statistics view in the web interface now provide some key metrics for +DB-Servers in case the metrics API is enabled. Different statistics may be +visible depending on the operating system. + +The web interface can now display the servers' current metrics (as exposed +via the `/_admin/metrics/v2` API) for all Coordinators and DB-Servers in a cluster. +The current metrics are provided in a tabular format output and can be downloaded +from the UI for further analysis. This is not meant to be a 100% replacement for +Grafana, but rather as a quick self-service alternative to check the servers' +statuses. + +### Shard synchronization status + +The shard synchronization overview in the web interface now provides a better +overview of what the shard synchronization is currently doing, and what its +progress is. + +For shards that are currently not in sync it will display whether the +followers are currently syncing or waiting for their turn to come (because +the amount of parallelism for syncing multiple shards can be restricted). +The progress values displayed for shard synchronization should also be more +helpful for shards with more than one follower and in situations where one +follower is in sync and the other is not (yet). + +## Memory usage + +### Agency memory usage + +The in-memory object sizes for Agency data have been reduced in ArangoDB 3.8, +which should reduce the memory usage of Agent instances for clusters with a +larger amount of databases/collections/shards. On-disk sizes or sizes of Agency +dumps retrieved via APIs should not change, however. + +The change also helps Coordinators and DB-Servers, which since v3.7.4 also +maintain an in-memory cache of Agency data so that they can reduce the number +of requests to the Agency. + +The default RocksDB settings for Agency instances have been adjusted so that +the Agency memory usage consumed by RocksDB is limited to a 1 GB RocksDB block +cache and to 512 MB for the total write buffer size. Previously, Agency memory +usage could grow a lot higher for systems with a lot of memory if the startup +parameters were not set explicitly. + +### Default per-query memory limit + +A default per-query memory limit has been introduced for queries, to prevent rogue +AQL queries from consuming the too much memory of an arangod instance. + +The per-query limit is introduced via changing the default value of the option +`--query.memory-limit` from previously `0` (meaning no limit) to a dynamically +calculated value. The per-query memory limit defaults are now (depending on the +amount of available RAM): + +``` +Available memory: 0 (0MiB) Limit: 0 unlimited, %mem: n/a +Available memory: 134217728 (128MiB) Limit: 33554432 (32MiB), %mem: 25.0 +Available memory: 268435456 (256MiB) Limit: 67108864 (64MiB), %mem: 25.0 +Available memory: 536870912 (512MiB) Limit: 201326592 (192MiB), %mem: 37.5 +Available memory: 805306368 (768MiB) Limit: 402653184 (384MiB), %mem: 50.0 +Available memory: 1073741824 (1024MiB) Limit: 603979776 (576MiB), %mem: 56.2 +Available memory: 2147483648 (2048MiB) Limit: 1288490189 (1228MiB), %mem: 60.0 +Available memory: 4294967296 (4096MiB) Limit: 2576980377 (2457MiB), %mem: 60.0 +Available memory: 8589934592 (8192MiB) Limit: 5153960755 (4915MiB), %mem: 60.0 +Available memory: 17179869184 (16384MiB) Limit: 10307921511 (9830MiB), %mem: 60.0 +Available memory: 25769803776 (24576MiB) Limit: 15461882265 (14745MiB), %mem: 60.0 +Available memory: 34359738368 (32768MiB) Limit: 20615843021 (19660MiB), %mem: 60.0 +Available memory: 42949672960 (40960MiB) Limit: 25769803776 (24576MiB), %mem: 60.0 +Available memory: 68719476736 (65536MiB) Limit: 41231686041 (39321MiB), %mem: 60.0 +Available memory: 103079215104 (98304MiB) Limit: 61847529063 (58982MiB), %mem: 60.0 +Available memory: 137438953472 (131072MiB) Limit: 82463372083 (78643MiB), %mem: 60.0 +Available memory: 274877906944 (262144MiB) Limit: 164926744167 (157286MiB), %mem: 60.0 +Available memory: 549755813888 (524288MiB) Limit: 329853488333 (314572MiB), %mem: 60.0 +``` + +As before, a per-query memory limit value of `0` means no limitation. +The limit values are per AQL query, so they may still be too high in case +queries run in parallel. The defaults are intentionally high in order to not +stop any valid, previously working queries from succeeding. + +Using a per-query memory limit by default is a downwards-incompatible change in +ArangoDB 3.8 and may make queries fail if they use a lot of memory. If this +happens, it may be useful to increase the value of `--query.memory-limit` or +even set it to `0` (meaning no limitation). +There is a metric `arangodb_aql_local_query_memory_limit_reached` that can be +used to check how many times queries reached the per-query memory limit. + +There is now also a startup option `--query.memory-limit-override` which can be +used to control whether individual AQL queries can increase their memory limit +via the `memoryLimit` query option. This is the default, so a query that +increases its memory limit is allowed to use more memory than set via the +`--query.memory-limit` startup option value. If the option is set to `false`, +individual queries can only lower their maximum allowed memory usage but not +increase it. + +### Global AQL query memory limit + +The new startup option `--query.global-memory-limit` can be used to set a limit +on the combined estimated memory usage of all AQL queries (in bytes). If this +option has a value of `0`, then no global memory limit is in place. This is +also the default value and the same behavior as in previous versions of ArangoDB. + +Setting the option to a value greater than zero will mean that the total memory +usage of all AQL queries will be limited approximately to the configured value. +The limit is enforced by each server in a cluster independently, i.e. it can be +set separately for Coordinators, DB-Servers etc. The memory usage of a query +that runs on multiple servers in parallel is not summed up, but tracked +separately on each server. + +If a memory allocation in a query would lead to the violation of the configured +global memory limit, then the query is aborted with error code 32 +("resource limit exceeded"). + +The global memory limit is approximate, in the same fashion as the per-query +memory limit exposed by the option `--query.memory-limit` is. Some operations, +namely calls to AQL functions and their intermediate results, are currently not +properly tracked. + +The global query memory limit in option `--query.global-memory-limit` has a +default value that depends on the amount of available RAM: + +``` +Available memory: 0 (0MiB) Limit: 0 unlimited, %mem: n/a +Available memory: 134217728 (128MiB) Limit: 33554432 (32MiB), %mem: 25.0 +Available memory: 268435456 (256MiB) Limit: 67108864 (64MiB), %mem: 25.0 +Available memory: 536870912 (512MiB) Limit: 255013683 (243MiB), %mem: 47.5 +Available memory: 805306368 (768MiB) Limit: 510027366 (486MiB), %mem: 63.3 +Available memory: 1073741824 (1024MiB) Limit: 765041049 (729MiB), %mem: 71.2 +Available memory: 2147483648 (2048MiB) Limit: 1785095782 (1702MiB), %mem: 83.1 +Available memory: 4294967296 (4096MiB) Limit: 3825205248 (3648MiB), %mem: 89.0 +Available memory: 8589934592 (8192MiB) Limit: 7752415969 (7393MiB), %mem: 90.2 +Available memory: 17179869184 (16384MiB) Limit: 15504831938 (14786MiB), %mem: 90.2 +Available memory: 25769803776 (24576MiB) Limit: 23257247908 (22179MiB), %mem: 90.2 +Available memory: 34359738368 (32768MiB) Limit: 31009663877 (29573MiB), %mem: 90.2 +Available memory: 42949672960 (40960MiB) Limit: 38762079846 (36966MiB), %mem: 90.2 +Available memory: 68719476736 (65536MiB) Limit: 62019327755 (59146MiB), %mem: 90.2 +Available memory: 103079215104 (98304MiB) Limit: 93028991631 (88719MiB), %mem: 90.2 +Available memory: 137438953472 (131072MiB) Limit: 124038655509 (118292MiB), %mem: 90.2 +Available memory: 274877906944 (262144MiB) Limit: 248077311017 (236584MiB), %mem: 90.2 +Available memory: 549755813888 (524288MiB) Limit: 496154622034 (473169MiB), %mem: 90.2 +``` + +Using a global memory limit for all queries by default is a +downwards-incompatible change in ArangoDB 3.8 and may make queries fail if they +use a lot of memory. If this happens, it may be useful to increase the value of +`--query.global-memory-limit` or even set it to `0` (meaning no limitation). +There is a metric `arangodb_aql_global_query_memory_limit_reached` that can be +used to check how many times queries reached the global memory limit. + +If both `--query.global-memory-limit` and `--query.memory-limit` are set, the +former must be set at least as high as the latter. + +## Shard synchronization + +### Improvements for initial synchronization + +The initial replication of collections/shards data is now faster by not wrapping +each document in a separate `{"type":2300,"data":...}` envelope. In addition, the +follower side of the replication will request initial shard data from leaders in +VelocyPack format if the leader is running at least version 3.8. + +Stripping the envelopes and using VelocyPack for data transfer allows for smaller +data sizes when exchanging the documents and for faster processing, and thus can +lead to time savings in document packing and unpacking as well as a reduction in +the number of required roundtrips. + +The shard synchronization protocol was also improved by only transferring the +required parts of the inventory from leader to follower. Previously, for each +shard the entire inventory was exchanged, which included all shards of the +respective database with all their details. This change helps to reduce memory +usage and speed up initial synchronization for databases with lots of collections +or shards. + +In addition, 3 cluster-internal requests are now saved per shard in the initial +shard synchronization protocol by reusing already existing information in the +different steps of the replication process. All these changes can speed up the +getting-in-sync of followers after a server restart, or when provisioning new +replicas. + +### Replication protocol based on Merkle trees + +For collections created with ArangoDB 3.8, a new internal data format is used +that allows for a very fast synchronization of differences between the leader +and a follower that is trying to reconnect. + +The new format used in 3.8 is based on Merkle trees, making it more efficient +to pin-point the data differences between the leader and a follower that is +trying to reconnect. + +The algorithmic complexity of the new protocol is determined by the amount of +differences between the leader and follower shard data, meaning that if there +are no or very few differences, the getting-in-sync protocol will run very fast. +In previous versions of ArangoDB, the complexity of the protocol was determined +by the number of documents in the shard, and the protocol required a scan over +all documents in the shard on both the leader and the follower to find the +differences. + +The new protocol is used automatically for all collections/shards created with +ArangoDB 3.8. Collections/shards created with earlier versions will use the +old protocol, which is still fully supported. + +New deployments created with ArangoDB 3.8 will automatically benefit from the +new protocol, and existing deployments will benefit from the new protocol for +any collections that are created with 3.8 onwards. +Existing collections created with previous versions of ArangoDB will only benefit +from the new protocol if the collections are dumped and recreated/restored using +arangodump and arangorestore. + +## Index selectivity estimates + +### Compressed estimates format + +When index selectivity estimates are updated and written to disk, they are now +written in a compressed format. This can greatly reduce the amount of data +written to disk for each index estimate update. The compressed format is used +automatically in ArangoDB 3.8 for all selectivity estimate writes. + +### Less impact of selectivity estimate updates for system collections + +Previous versions of ArangoDB could suffer from an "idle writes" problem, in +which an otherwise idle arangod instance would still write a lot of data to +disk over time. These writes happened because the server statistics feature +periodically stored the current statistics in some system collections, so that +they can be retrieved later and also be inspected from the web interface at +any point. + +With ArangoDB 3.8 these background writes to the statistics collections will +still happen, but their impact has been greatly reduced: if the statistics +collections are created with ArangoDB 3.8 (this will happen when creating a new +deployment based on 3.8), there will be no updates to the index selectivity +estimates of the statistics collections at all. This will save the majority of +the write payload size. For deployments created with earlier versions of +ArangoDB, the index selectivity estimates for the statistics collections will +still be updated periodically, but they are written in the compressed index +selectivity estimates format (see above). + +### Optional selectivity estimates for new indexes + +For any user-defined index of type "persistent", it is now also possible to +disable index selectivity estimates for the index, by setting the `estimates` +flag to `false` when creating the index, e.g. + +```js +db.myCollection.ensureIndex({ type: "persistent", fields: ["value"], estimates: false }); +``` + +By default index selectivity estimates are maintained for all newly created +indexes. Turning them off can have a slightly positive performance impact for +write operations. The downside of turning off index selectivity estimates will +be that the query optimizer will not be able to determine the usefulness of +different competing indexes in AQL queries when there are multiple candidate +indexes to choose from. + +## Encryption at Rest + +The Encryption at Rest feature in the ArangoDB 3.8 Enterprise Edition will now +automatically use hardware acceleration for encryption and decryption if +available. + +The AES-NI instruction set (Advanced Encryption Standard New Instructions) +will be used if available on the target platform. This instruction set is +available on major Intel and AMD processors for around a decade. + +The benefits of using the hardware-accelerated version of AES are better +performance than for a software-only implementation, plus resistance to +side-channel attacks. + +All other things equal, deployments that use +[Encryption at Rest](../../operations/security/encryption-at-rest.md) should see a reduction of CPU +usage by using the hardware-accelerated encryption. + +## HTTP security options + +ArangoDB 3.8 provides a new startup option `--cluster.api-jwt-policy` that +allows *additional* checking for valid JWTs in all requests to sub-routes of +the `/_admin/cluster` REST API endpoint. +This is a security option to restrict access to these cluster APIs to +operator tools and privileged users. + +The possible values for the startup option are: + +- `jwt-all`: requires a valid JWT for all accesses to `/_admin/cluster` and + its sub-routes. If this configuration is used, the _CLUSTER_ and _NODES_ + sections of the web interface will be disabled, as they are relying on the + ability to read data from several cluster APIs. +- `jwt-write`: requires a valid JWT for write accesses (all HTTP methods + except HTTP GET) to `/_admin/cluster`. This setting can be used to allow + privileged users to read data from the cluster APIs, but not to do any + modifications. All existing permissions checks for the cluster API routes + are still in effect with this setting, meaning that read operations without + a valid JWT may still require dedicated other permissions (as in v3.7). +- `jwt-compat`: no *additional* access checks are in place for the cluster + APIs. However, all existing permissions checks for the cluster API routes + are still in effect with this setting, meaning that all operations may + still require dedicated other permissions (as in v3.7). + +The default value for the option is `jwt-compat`, which means this option will +not cause any *extra* JWT checks compared to v3.7. + +## JavaScript security options + +The following startup options have been added to optionally limit certain +areas of JavaScript code execution: + +- `--javascript.tasks`: the default value for this option is `true`, meaning + JavaScript tasks are available as before. However, with this option they can + be turned off by admins to limit the amount of JavaScript user code that is + executed. + +- `--javascript.transactions`: the default value for this option is + `true`, meaning JavaScript Transactions are available as before. However, + with this option they can be turned off by admins to limit the amount of + JavaScript user code that is executed. + +## Metrics + +3.8 features a new metrics API under `/_admin/metrics/v2`. +This became necessary, since the old metrics output was not following +all Prometheus conventions for metrics. For example, the naming +convention says that the name of a counters **must end in** `_total`. +Furthermore, the histogram bucket counts **must be reported** cumulated. +Fixing all these is a breaking change, therefore we continue to serve +the old metrics output (with old names and uncumulated histograms) +under `/_admin/metrics` and deprecate this API in 3.8. It will be +removed in future versions. + +The new API under `/_admin/metrics/v2` should be used from now on and +we publish new dashboards for Grafana for it. We have defined multiple +"personas" and build individual dashboards which each include a certain +subset of the metrics tailored for the particular persona. So for +example, a database admin would only see metrics which are relevant +for the database administration work. Of course, there is also a +dashboard with all metrics, neatly sorted into categories. In 3.8, +we have over 200 metrics and nearly 300 graphs in the complete +dashboard. + +The complete list of metrics together with documentation can be found in the +[Metrics HTTP API](../../develop/http-api/monitoring/metrics.md) +documentation. + +The list of renamed metrics can be found under +[API Changes in 3.8](api-changes-in-3-8.md#endpoints-added). + +For the description of a seamless upgrade path see +[Incompatible changes in 3.8](incompatible-changes-in-3-8.md#endpoint-return-value-changes). + +### Traffic accounting metrics + +<small>Introduced in: v3.8.9</small> + +The following metrics for traffic accounting were added: + +| Label | Description | +|:------|:------------| +| `arangodb_client_user_connection_statistics_bytes_received` | Bytes received for requests, only user traffic. | +| `arangodb_client_user_connection_statistics_bytes_sent` | Bytes sent for responses, only user traffic. +| `arangodb_http1_connections_total` | Total number of HTTP/1.1 connections accepted. | + +## Logging + +### New options for logging + +The following logging-related options have been added: + +- added option `--log.use-json-format` to switch log output to JSON format. + Each log message then produces a separate line with JSON-encoded log data, + which can be consumed by applications. + + The attributes produced for each log message JSON object are: + + | Key | Value | + |:-----------|:-----------| + | `time` | date/time of log message, in format specified by `--log.time-format` + | `prefix` | only emitted if `--log.prefix` is set + | `pid` | process id, only emitted if `--log.process` is set + | `tid` | thread id, only emitted if `--log.thread` is set + | `thread` | thread name, only emitted if `--log.thread-name` is set + | `role` | server role (1 character), only emitted if `--log.role` is set + | `level` | log level (e.g. `"WARN"`, `"INFO"`) + | `file` | source file name of log message, only emitted if `--log.line-number` is set + | `line` | source file line of log message, only emitted if `--log.line-number` is set + | `function` | source file function name, only emitted if `--log.line-number` is set + | `topic` | log topic name + | `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set + | `hostname` | hostname if `--log.hostname` is set + | `message` | the actual log message payload + +- added option `--log.process` to toggle the logging of the process id + (pid) in log messages. Logging the process ID is useless when running + arangod in Docker containers, as the pid will always be 1. So one may + as well turn it off in these contexts with the new option. + +- added option `--log.hostname` to optionally log the current host's name + at the beginning of each log message (or inside the `hostname` attribute for + JSON-based logging). Setting `--log.hostname` to a value of `auto` will + automatically determine the hostname and use that for logging. + +- added option `--log.in-memory` to toggle storing log messages in memory, + from which they can be consumed via the `/_admin/log` HTTP API and by the + Web UI. By default, this option is turned on, so log messages are consumable + via the API and UI. Turning this option off will disable that functionality, + save a tiny bit of memory for the in-memory log buffers and prevent potential + log information leakage via these means. + +- added option `--log.in-memory-level` to control which log messages are + preserved in memory (in case --log.in-memory is set to true). The default + value is `info`, meaning all log messages of types `info`, `warning`, `error` + and `fatal` will be stored by an instance in memory. + By setting this option to `warning`, only warning log messages will be + preserved in memory, and by setting the option to `error` only error messages + will be kept. + This option is useful because the number of in-memory log messages is limited + to the latest 2048 messages, and these slots are by default shared between + informational, warning and error messages. + +- added option `--log.max-entry-length` to control the maximum line length for + individual log messages that are written into normal logfiles by arangod + (note: this does not include audit log messages). + Any log messages longer than the specified value will be truncated and the + suffix '...' will be added to them. + The purpose of this parameter is to shorten long log messages in case there is + not a lot of space for logfiles, and to keep rogue log messages from overusing + resources. + The default value is 128 MB, which is very high and should effectively mean + downwards-compatibility with previous arangod versions, which did not restrict + the maximum size of log messages. + +- added option `--audit.max-entry-length` to control the maximum line length + for individual audit log messages that are written into audit logs by arangod. + Any audit log messages longer than the specified value will be truncated and + the suffix '...' will be added to them. + The default value is 128 MB, which is very high and should effectively mean + downwards-compatibility with previous arangod versions, which did not restrict + the maximum size of log messages. + +- added option `--audit.queue` to control audit logging queuing behavior + (Enterprise Edition only): + + The option controls whether audit log messages are submitted to a queue + and written to disk in batches or if they should be written to disk directly + without being queued. + Queueing audit log entries may be beneficial for latency, but can lead to + unqueued messages being lost in case of a power loss or crash. Setting + this option to `false` mimics the behavior from 3.7 and before, where + audit log messages were not queued but written in a blocking fashion. + +- any occurrence of `$PID` inside a log output value (e.g. `--log.output` or + `--audit.output`) will be replaced at runtime with the actual process id. + This enables logging to process-specific files. + + Please note that the dollar sign in `$PID` may need extra escaping when + specified from inside shells such as Bash. + +### Other logging improvements + +- The maximum size of log messages buffered in memory was increased from 256 + bytes per log message to 512 bytes per log message. This should prevent most + in-memory log messages returned by the `/_admin/log` HTTP API from being + truncated unnecessarily. + +- Audit logging and slow query logging for AQL queries now also include the + query's result code (success or error code in case the query ran into an + error). This can be used to find queries which ran into errors (audit logging) + or long-running queries which ran into errors (normal logging). + +- Audit logging now also honors the configured logging date/time output format + for the regular logger. Previously the audit logging always logged date/time + value in the server's local time, and used the format `YYYY-MM-DDTHH:MM:SS`. + + From 3.8 onwards, the audit logger will use the format specified via the + `--log.time-format` option, which defaults to `utc-datestring`. The means the + audit logging will by default log all dates/times in UTC time. To restore the + pre-3.8 behavior, please set the option to `local-datestring`, which will + make the audit logger (and all other server log messages) use the server's + local time. + +## Timezone conversion + +Added IANA timezone database [tzdata](https://www.iana.org/time-zones). + +The following AQL functions have been added for converting datetimes in UTC to +any timezone in the world including historical daylight saving times and vice +versa. An optional detail flag returns the timezone information including +effect range, abbreviation, offset to UTC and whether daylight saving time is +active: + +- [DATE_UTCTOLOCAL()](../../aql/functions/date.md#date_utctolocal) + + ```aql + RETURN DATE_UTCTOLOCAL("2020-10-15T01:00:00.999Z", "America/New_York") + // [ "2020-10-14T21:00:00.999" ] + ``` + + ```aql + RETURN DATE_UTCTOLOCAL("2020-10-15T01:00:00.999Z", "America/New_York", true) + /* + { + "local": "2020-10-14T21:00:00.999", + "tzdb": "2020f", + "zoneInfo": { + "name": "EDT", + "begin": "2020-03-08T07:00:00.000Z", + "end": "2020-11-01T06:00:00.000Z", + "save": true, + "offset": -14400 + } + } + */ + ``` + +- [DATE_LOCALTOUTC()](../../aql/functions/date.md#date_localtoutc) + + ```aql + RETURN DATE_LOCALTOUTC("2020-10-14T21:00:00.999", "America/New_York") + // [ "2020-10-15T01:00:00.999Z" ] + ``` + + ```aql + RETURN DATE_LOCALTOUTC("2020-10-14T21:00:00.999", "America/New_York") + /* + { + "utc": "2020-10-15T01:00:00.999Z", + "tzdb": "2020f", + "zoneInfo": { + "name": "EDT", + "begin": "2020-03-08T07:00:00.000Z", + "end": "2020-11-01T06:00:00.000Z", + "save": true, + "offset": -14400 + } + } + */ + ``` + +Also some functions have been added to acquire the system timezone ArangoDB is +running on and to list all valid IANA timezone names including canonical, +aliases and deprecated ones. + +- [DATE_TIMEZONE()](../../aql/functions/date.md#date_timezone) + + ```aql + RETURN DATE_TIMEZONE() // [ "Etc/UTC" ] + ``` + +- [DATE_TIMEZONES()](../../aql/functions/date.md#date_timezones) + + ```aql + RETURN DATE_TIMEZONES() // [ "Africa/Abidjan", ..., "Europe/Berlin", ..., "Zulu" ] + ``` + +## Client tools + +### arangodump concurrency / shard-parallelism + +Since v3.4.0, _arangodump_ can use multiple threads for dumping database data in +parallel. _arangodump_ versions prior to v3.8.0 distribute dump jobs for +individual collections to concurrent worker threads, which is optimal for +dumping many collections of approximately the same size, but does not help for +dumping few large collections or few large collections with many shards. + +Starting with v3.8.0, _arangodump_ can also dispatch dump jobs for individual +shards of each collection, allowing higher parallelism if there are many shards +to dump but only few collections. + +Also see [_arangodump_ Threads](../../components/tools/arangodump/examples.md#threads). + +### arangodump output format + +Since its inception, _arangodump_ wrapped each dumped document into an extra +JSON envelope, such as follows: + +```json +{"type":2300,"key":"test","data":{"_key":"test","_rev":..., ...}} +``` + +In case a dump taken with v3.8.0 or higher is known to never be used in older +ArangoDB versions, the JSON envelopes can be turned off with the new startup +option `--envelope false` to reduce the dump size and use a bit less memory +and bandwidth: + +```json +{"_key":"test","_rev":..., ...} +``` + +Using the new non-enveloped dump format also allows _arangorestore_ to +parallelize restore operations for individual collections. This is not possible +with the old, enveloped format. + +### arangorestore parallelization for single collections + +_arangorestore_ can now parallelize restore operations even for single +collections, which can lead to increased restore performance. +This requires that a dump in the new non-enveloped dump format is used, and that +there are enough _arangorestore_ threads to employ. + +The dump format can be configured by specifying the `--envelope false` option +when invoking arangodump, and the number of restore threads can be adjusted by +setting _arangorestore_'s `--threads` option. + +### arangodump dumping of individual shards + +_arangodump_ can now optionally dump individual shards only, by specifying the +`--shard` option one or multiple times. This option can be used to split the +dump of a large collection with multiple shards into multiple separate dump +processes, which could be run against different Coordinators etc. + +### arangodump and arangorestore with JWT secret + +_arangodump_ and _arangorestore_ can now also be invoked by providing the cluster's +JWT secret instead of the username/password combination. Both tools now provide +the options `--server.jwt-secret-keyfile` (to read the JWT secret from a file) +and `--server.ask-jwt-secret` (to enter it manually). + +### arangobench with custom queries + +In addition to executing the predefined benchmarks, the _arangobench_ client tool +now offers a new test case named `custom-query` for running arbitrary AQL +queries against an ArangoDB installation. + +To run a custom AQL query, the query needs to be specified in either the +`--custom-query` option or the `--custom-query-file` option. In the former case +the query string can be passed on the command-line, in the latter case the +query string will be read from a file. + +### Continuing arangorestore operations + +_arangorestore_ now provides a `--continue` option. Setting it will make +_arangorestore_ keep track of the restore progress, so if the restore process +gets aborted it can later be continued from the point it left off. + +### Controlling the number of documents per batch for arangoexport + +_arangoexport_ now has a `--documents-per-batch` option that can be used to limit +the number of documents to be returned in each batch from the server. This is +useful if a query is run on overly large documents, which would lead to the +response sizes getting out of hand with the default number of documents per +batch (1000). + +### Controlling the maximum query runtime of arangoexport + +_arangoexport_ now has a `--query-max-runtime` option to limit the runtime of +queries it executes. + +### arangorestore option to enable revision trees + +<small>Introduced in: v3.8.7, v3.9.2</small> + +A new `--enable-revision-trees` option has been added to _arangorestore_, which +adds the `syncByRevision` and `usesRevisionsAsDocumentIds` attributes to the +collection structure if they are missing. As a consequence, these collections +created by arangorestore are able to use revision trees and a faster +getting-in-sync procedure after a restart. + +The option defaults to `true`, meaning that the attributes are added if they are +missing. If you set the option to `false`, the attributes are not added to the +collection structure. If the attributes are already present in the dump data, they +are not modified by arangorestore, irrespective of the setting of this option. + +Miscellaneous +------------- + +### Cluster support for two APIs + +- Added cluster support for the JavaScript API method `collection.checksum()` + and the REST HTTP API endpoint `GET /_api/collection/{collection-name}/checksum`, + which calculate CRC checksums for collections. + +- Added cluster support for the JavaScript API method `db._engineStats()` + and the REST HTTP API endpoint `GET /_api/engine/stats`, which provide + runtime information about the storage engine state. + +### I/O heartbeat + +<small>Introduced in: v3.8.7, v3.9.2</small> + +An I/O heartbeat has been added which checks that the underlying volume is +writable with reasonable performance. The test is done every 15 seconds and can +be switched off. + +Use the accompanying new metrics to check for test failures: + +| Label | Description | +|:------|:------------| +| `arangodb_ioheartbeat_delays_total` | Total number of delayed I/O heartbeats. | +| `arangodb_ioheartbeat_duration` | Histogram of execution times in microseconds. | +| `arangodb_ioheartbeat_failures_total` | Total number of failures. | + +These metrics are only populated if the new `--database.io-heartbeat` startup +option is set to `true` (which is the default). + +Internal changes +---------------- + +### Library version upgrades + +The bundled version of the Snappy compression/decompression library has been +upgraded to 1.1.8. + +The bundled version of libunwind has been upgraded to 1.5. + +For ArangoDB 3.8, the bundled version of rclone is 1.51.0. + +### Spliced subqueries + +The AQL optimizer rule "splice-subqueries" is now mandatory, in the sense that +it cannot be disabled anymore. As a side effect of this change, there will no +query execution plans created by 3.8 that contain execution nodes of type +`SubqueryNode`. `SubqueryNode`s will only be used during query planning and +optimization, but at the end of the query optimization phase will all have +been replaced with nodes of types `SubqueryStartNode` and `SubqueryEndNode`. + +The code to execute non-spliced subqueries remains in place so that 3.8 can +still execute queries planned on a 3.7 instance with the "splice-subqueries" +optimizer rule intentionally turned off. The code for executing non-spliced +subqueries can be removed in 3.9. + +### Query register usage + +There is an AQL query execution plan register usage optimization that may +positively affect some AQL queries that use a lot of variables that are only +needed in certain parts of the query. The positive effect will come from saving +registers, which directly translates to saving columns in *AqlItemBlocks*. + +Previously, the number of registers that were planned for each depth level of +the query never decreased when going from one level to the next. Even though +unused registers were recycled since 3.7, this did not lead to unused registers +being completely dismantled. + +Now there is an extra step at the end of the register planning that keeps track +of the actually used registers on each depth, and that will shrink the number +of registers for the depth to the id of the maximum register. This is done for +each depth separately. Unneeded registers on the right hand side of the maximum +used register are now discarded. Unused registers on the left-hand side of the +maximum used register id are not discarded, because we still need to guarantee +that registers from depths above stay in the same slot when starting a new +depth. + +### Better protection against overwhelm + +The cluster now protects itself better against being overwhelmed by too +many concurrent requests. + +This is mostly achieved by limiting the total amount of requests from +the low priority queue which are ongoing concurrently. There is a new option +`--server.ongoing-low-priority-multiplier` (default is 4), which +essentially says that only 4 times as many requests may be ongoing +concurrently as there are worker threads. The default is chosen such +that it is sensible for most workloads, but in special situations it +can help to adjust the value. + +See [ArangoDB Server _Server_ Options](../../components/arangodb-server/options.md#--serverongoing-low-priority-multiplier) +for details and hints for configuration. + +There have been further improvements, in particular to ensure that +certain APIs to diagnose the situation in the cluster still work, even +when a lot of normal requests are piling up. For example, the cluster +health API will still be available in such a case. + +Furthermore, followers will now be dropped much later and only if they +are actually failed, which leads to a lot fewer shard re-synchronizations +in case of very high load. + +Overall, these measures should all be below the surface and not be +visible to the user at all (apart from preventing problems under high +load). diff --git a/site/content/arangodb/oem/release-notes/version-3.9/_index.md b/site/content/arangodb/oem/release-notes/version-3.9/_index.md new file mode 100644 index 0000000000..46eed9a22e --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.9/_index.md @@ -0,0 +1,6 @@ +--- +title: Version 3.9 +menuTitle: Version 3.9 +weight: 90 +description: '' +--- diff --git a/site/content/arangodb/oem/release-notes/version-3.9/api-changes-in-3-9.md b/site/content/arangodb/oem/release-notes/version-3.9/api-changes-in-3-9.md new file mode 100644 index 0000000000..93816f9036 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.9/api-changes-in-3-9.md @@ -0,0 +1,504 @@ +--- +title: API Changes in ArangoDB 3.9 +menuTitle: API changes in 3.9 +weight: 20 +description: >- + A summary of the changes to the HTTP API and other interfaces that are relevant + for developers, like maintainers of drivers and integrations for ArangoDB +--- +## HTTP RESTful API + +### Behavior changes + +#### Graph API (Gharial) + +The following changes affect the behavior of the RESTful graph APIs at +endpoints starting with path `/_api/gharial/`: + +The options object now supports a new optional field `satellites` in the +Enterprise Edition when creating a graph (POST method). If set, it needs to be +an array of collection names. Each name must be a string and valid as collection +name. The `satellites` option is ignored in the Community Edition. + +Using `satellites` during SmartGraph creation will result in a SmartGraph +with SatelliteCollections. +Using `satellites` during Disjoint SmartGraph creation will result in a +Disjoint SmartGraph with SatelliteCollections. + +(Disjoint) SmartGraphs using SatelliteCollections are capable of having +SatelliteCollections in their +graph definitions. If a collection is named in `satellites` and also used in the +graph definition itself (e.g. EdgeDefinition), this collection will be created +as a SatelliteCollection. (Disjoint) SmartGraphs using SatelliteCollections are +then capable of executing all types of graph queries between the regular +SmartCollections and SatelliteCollections. + +The following changes affect the behavior of the RESTful graph APIs at +endpoints starting with path `/_api/gharial/{graph}/edge` and +`/_api/gharial/{graph}/vertex`: + +Added new optional `options` object that can be set when creating a new or +modifying an existing edge definition (POST / PUT method), as well as when +creating a new vertex collection (POST method). This was not available in +previous ArangoDB versions. The `options` object can currently contain a field +called `satellites` only. + +The `satellites` field must be an array with one or more collection name strings. +If an EdgeDefinition contains a collection name that is also contained in the +`satellites` option, or if the vertex collection to add is contained in the +`satellites` option, the collection will be created as a SatelliteCollection. +Otherwise, it will be ignored. This option only takes effect using SmartGraphs. + +Also see [Graph Management](../../develop/http-api/graphs/named-graphs.md#management). + +#### Extended naming convention for databases + +There is a new startup option `--database.extended-names-databases` to allow +database names to contain most UTF-8 characters. + +The feature is disabled by default to ensure compatibility with existing client +drivers and applications that only support ASCII names according to the +traditional database naming convention used in previous ArangoDB versions. + +If the feature is enabled, then any endpoints that contain database names in the URL +may contain special characters that were previously not allowed +(percent-encoded). They are also to be expected in payloads that contain +database names. + +For client applications and drivers that assemble URLs containing database names, +it is required that database names are properly URL-encoded in URLs. In addition, +database names containing UTF-8 characters must be +[NFC-normalized](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). +Non-NFC-normalized names will be rejected by arangod. +This is true for any REST API endpoint in arangod if the extended database naming +convention is used. + +{{< info >}} +The extended naming convention is an **experimental** feature +but will become the norm in a future version. Check if your drivers and +client applications are prepared for this feature before enabling it. +{{< /info >}} + +Also see [Database names](../../concepts/data-structure/databases.md#database-names). + +#### Overload control + +Starting with version 3.9.0, ArangoDB returns an `x-arango-queue-time-seconds` +HTTP header with all responses. This header contains the most recent request +queueing/dequeuing time (in seconds) as tracked by the server's scheduler. +This value can be used by client applications and drivers to detect server +overload and react on it. + +The arangod startup option `--http.return-queue-time-header` can be set to +`false` to suppress these headers in responses sent by arangod. + +In a cluster, the value returned in the `x-arango-queue-time-seconds` header +is the most recent queueing/dequeuing request time of the Coordinator the +request was sent to, except if the request is forwarded by the Coordinator to +another Coordinator. In that case, the value will indicate the current +queueing/dequeuing time of the forwarded-to Coordinator. + +In addition, client applications and drivers can optionally augment the +requests they send to arangod with the header `x-arango-queue-time-seconds`. +If set, the value of the header should contain the maximum server-side +queuing time (in seconds) that the client application is willing to accept. +If the header is set in an incoming request, arangod will compare the current +dequeuing time from its scheduler with the maximum queue time value contained +in the request header. If the current queueing time exceeds the value set +in the header, arangod will reject the request and return HTTP 412 +(precondition failed) with the error code 21004 (queue time violated). +In a cluster, the `x-arango-queue-time-seconds` request header will be +checked on the receiving Coordinator, before any request forwarding. + +#### Cursor API + +<small>Introduced in: v3.9.11, v3.10.7</small> + +In AQL graph traversals (`POST /_api/cursor` endpoint), you can restrict the +vertex and edge collections in the traversal options like so: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { + vertexCollections: [ "bolts", "screws" ], + edgeCollections: [ "productsToBolts", "productsToScrews" ] + } + RETURN v +``` + +If you specify collections that don't exist, queries now fail with +a "collection or view not found" error (code `1203` and HTTP status +`404 Not Found`). In previous versions, unknown vertex collections were ignored, +and the behavior for unknown edge collections was undefined. + +Additionally, the collection types are now validated. If a document collection +or View is specified in `edgeCollections`, an error is raised +(code `1218` and HTTP status `400 Bad Request`). + +Furthermore, it is now an error if you specify a vertex collection that is not +part of the specified named graph (code `1926` and HTTP status `404 Not Found`). +It is also an error if you specify an edge collection that is not part of the +named graph's definition or of the list of edge collections (code `1939` and +HTTP status `400 Bad Request`). + +#### Document API + +<small>Introduced in: v3.9.12</small> + +Using the Document API for reading multiple documents used to return an error +if the request body was an empty array. Example: + +```bash +> curl -XPUT -d '[]' 'http://localhost:8529/_api/document/coll?onlyget=true' +{"code":500,"error":true,"errorMessage":"internal error","errorNum":4} +``` + +Now, a request like this succeeds and returns an empty array as response. + +### Endpoint return value changes + +- All collections in ArangoDB are now always in the `loaded` state. APIs return + return a collection's status will now return it as `loaded`, unconditionally. + +- The HTTP endpoints for loading and unloading collections (i.e. HTTP PUT + `/_api/collection/<collection>/load` and HTTP PUT `/_api/collection/<collection>/unload`) + have been turned into no-ops. They still exist in ArangoDB 3.9, but do not + serve any purpose and are deprecated. + +- Changed the encoding of revision IDs returned by the below listed REST APIs. + + <small>Introduced in: v3.8.8, v3.9.4</small> + + - `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. + - `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +### Endpoints added + +#### Support Info API + +The HTTP REST API endpoint `GET /_admin/support-info` was added for retrieving +deployment information for support purposes. The endpoint returns data about the +ArangoDB version used, the host (operating system, server ID, CPU and storage capacity, +current utilization, a few metrics) and the other servers in the deployment +(in case of active failover or cluster deployments). + +As this API may reveal sensitive data about the deployment, it can only be +accessed from inside the `_system` database. In addition, there is a policy control +startup option `--server.support-info-api` that controls if and to whom the API +is made available. This option can have the following values: + +- `disabled`: support info API is disabled. +- `jwt`: support info API can only be accessed via superuser JWTs. +- `admin` (default): the support info API can only be accessed by admin users and superuser JWTs. +- `public`: everyone with access to the `_system` database can access the support info API. + +#### License Management (Enterprise Edition) + +Two endpoints were added for the new +[License Management](../../operations/administration/license-management.md). They can be called on +single servers, Coordinators and DB-Servers: + +- `GET /_admin/license`: Query license information and status. + + ```json + { + "features": { + "expires": 1640255734 + }, + "license": "JD4EOk5fcx...HgdnWw==", + "version": 1, + "status": "good" + } + ``` + + - `features`: + - `expires`: Unix timestamp (seconds since January 1st, 1970 UTC) + - `license`: Encrypted and base64-encoded license key + - `version`: License version number + - `status`: + - `good`: The license is valid for more than 2 weeks. + - `expiring`: The license is valid for less than 2 weeks. + - `expired`: The license has expired. In this situation, no new + Enterprise Edition features can be utilized. + - `read-only`: The license is expired over 2 weeks. The instance is now + restricted to read-only mode. + +- `PUT /_admin/license`: Set a new license key. Expects the key as string in the + request body (wrapped in double quotes). + + Server reply on success: + + ```json + { + "result": { + "error": false, + "code": 201 + } + } + ``` + + If the new license expires sooner than the current one, an error will be + returned. The query parameter `?force=true` can be set to update it anyway. + + ```json + { + "code": 400, + "error": true, + "errorMessage": "This license expires sooner than the existing. You may override this by specifying force=true with invocation.", + "errorNum": 9007 + } + ``` + +### Endpoints augmented + +#### Cursor API + +The HTTP REST API endpoint `POST /_api/cursor` can now handle an +additional sub-attribute `fillBlockCache` for its `options` attribute. +`fillBlockCache` controls whether the to-be-executed query should +populate the RocksDB block cache with the data read by the query. +This is an optional attribute, and its default value is `true`, meaning +that the block cache will be populated. This functionality was also backported +to v3.8.1. + +The HTTP REST API endpoint `POST /_api/cursor` can also handle the +sub-attribute `maxNodesPerCallstack`, which controls after how many +execution nodes in a query a stack split should be performed. This is +only relevant for very large queries. If this option is not specified, +the default value is 200 on MacOS, and 250 for other platforms. +Please note that this option is only useful for testing and debugging +and normally does not need any adjustment. + +#### Log API + +The HTTP REST API endpoint `PUT /_admin/log/level` can now handle the +pseudo log topic `"all"`. Setting the log level for the "all" log topic will +adjust the log level for **all existing log topics**. +For example, sending the JSON object to this API + +```json +{"all":"debug"} +``` + +will set all log topics to log level "debug". + +#### Authentication API + +The HTTP REST API endpoint `POST /_open/auth` now returns JWTs with a shorter +lifetime of one hour by default. You can adjust the lifetime with the +`--server.session-timeout` startup option. + +#### Analyzers API + +Analyzers with a `locale` property use a new syntax. The encoding (`.utf-8`) +does not need to be set anymore. The `collation` Analyzer supports +`language[_COUNTRY][_VARIANT][@keywords]` (square bracket denote optional parts). +The `text` and `norm` Analyzers support `language[_COUNTRY][_VARIANT]`, the `stem` +Analyzer only `language`. The former syntax is still supported but automatically +normalized to the new syntax. + +#### Views API + +Views of the type `arangosearch` support new caching options in the +Enterprise Edition. + +<small>Introduced in: v3.9.5</small> + +- A `cache` option for individual View links or fields (boolean, default: `false`). +- A `cache` option in the definition of a `storedValues` View property + (boolean, immutable, default: `false`). + +<small>Introduced in: v3.9.6</small> + +- A `primarySortCache` View property (boolean, immutable, default: `false`). +- A `primaryKeyCache` View property (boolean, immutable, default: `false`). + +The `POST /_api/view` endpoint accepts these new options for `arangosearch` +Views, the `GET /_api/view/<view-name>/properties` endpoint may return these +options, and you can change the `cache` View link/field property with the +`PUT /_api/view/<view-name>/properties` and `PATCH /_api/view/<view-name>/properties` +endpoints. + +See the [`arangosearch` Views Reference](../../index-and-search/arangosearch/arangosearch-views-reference.md#link-properties) +for details. + +#### Document API + +<small>Introduced in: v3.9.6</small> + +The following endpoints support a new, experimental `refillIndexCaches` query +parameter to repopulate the edge cache after requests that insert, update, +replace, or remove single or multiple edge documents: + +- `POST /_api/document/{collection}` +- `PATCH /_api/document/{collection}/{key}` +- `PUT /_api/document/{collection}/{key}` +- `DELETE /_api/document/{collection}/{key}` + +It is a boolean option and the default is `false`. + +#### Metrics API + +<small>Introduced in: v3.8.7, v3.9.2</small> + +I/O heartbeat metrics have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_ioheartbeat_delays_total` | Total number of delayed I/O heartbeats. | +| `arangodb_ioheartbeat_duration` | Histogram of execution times in microseconds. | +| `arangodb_ioheartbeat_failures_total` | Total number of failures. | + +--- + +<small>Introduced in: v3.9.5</small> + +The `GET /_admin/metrics/v2` and `GET /_admin/metrics` endpoints includes a new +metrics `arangodb_search_columns_cache_size` which reports the ArangoSearch +column cache size. + +--- + +<small>Introduced in: v3.8.9, v3.9.6</small> + +The metrics endpoints include the following new traffic accounting metrics: + +- `arangodb_client_user_connection_statistics_bytes_received` +- `arangodb_client_user_connection_statistics_bytes_sent` +- `arangodb_http1_connections_total` + +--- + +<small>Introduced in: v3.9.6</small> + +The metrics endpoints include the following new edge cache (re-)filling metrics: + +- `rocksdb_cache_auto_refill_loaded_total` +- `rocksdb_cache_auto_refill_dropped_total` +- `rocksdb_cache_full_index_refills_total` + +--- + +<small>Introduced in: v3.9.10</small> + +The following metrics for write-ahead log (WAL) file tracking have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_live_wal_files` | Number of live RocksDB WAL files. | +| `rocksdb_wal_released_tick_flush` | Lower bound sequence number from which WAL files need to be kept because of external flushing needs. | +| `rocksdb_wal_released_tick_replication` | Lower bound sequence number from which WAL files need to be kept because of replication. | +| `arangodb_flush_subscriptions` | Number of currently active flush subscriptions. | + +--- + +The following metrics for diagnosing delays in cluster-internal network requests +have been added: + +<small>Introduced in: v3.9.11</small> + +| Label | Description | +|:------|:------------| +| `arangodb_network_dequeue_duration` | Internal request duration for the dequeue in seconds. | +| `arangodb_network_response_duration` | Internal request duration from fully sent till response received in seconds. | +| `arangodb_network_send_duration` | Internal request send duration in seconds. | +| `arangodb_network_unfinished_sends_total` | Number of internal requests for which sending has not finished. | + +### Endpoints moved + +#### Cluster API redirects + +Since ArangoDB 3.7, some cluster APIs were made available under different +paths. The old paths were left in place and simply redirected to the new +address. These redirects have now been removed in ArangoDB 3.9. + +The following list shows the old, now dysfunctional paths and their +replacements: + +- `/_admin/clusterNodeVersion`: replaced by `/_admin/cluster/nodeVersion` +- `/_admin/clusterNodeEngine`: replaced by `/_admin/cluster/nodeEngine` +- `/_admin/clusterNodeStats`: replaced by `/_admin/cluster/nodeStatistics` +- `/_admin/clusterStatistics`: replaced by `/_admin/cluster/statistics` + +Using the replacements will work from ArangoDB 3.7 onwards already, so +any client applications that still call the old addresses can be adjusted +to call the new addresses from 3.7 onwards. + +### Endpoints deprecated + +The REST API endpoint GET `/_api/replication/logger-follow` is deprecated +since ArangoDB 3.4.0 and will be removed in a future version. Client +applications should use the endpoint `/_api/wal/tail` instead, which is +available since ArangoDB 3.3. This is a reminder to migrate to the other +endpoint. + +### Endpoints removed + +#### Redirects + +The following API redirect endpoints have been removed in ArangoDB 3.9. +These endpoints have been only been redirections since ArangoDB 3.7. Any +caller of these API endpoints should use the updated endpoints: + +- `/_admin/clusterNodeVersion`: use `/_admin/cluster/nodeVersion` +- `/_admin/clusterNodeEngine`: use `/_admin/cluster/nodeEngine` +- `/_admin/clusterNodeStats`: use `/_admin/cluster/nodeStatistics` +- `/_admin/clusterStatistics`: use `/_admin/cluster/statistics` + +The REST API endpoint `/_msg/please-upgrade-handler` has been removed in +ArangoDB 3.9 as it is no longer needed. Its purpose was to display a static +message. + +#### Export API + +The REST API endpoint `/_api/export` has been removed in ArangoDB 3.9. +This endpoint was previously only present in single server, but never +supported in cluster deployments. + +The purpose of the endpoint was to provide the full data of a collection +without holding collection locks for a long time, which was useful for +the MMFile storage engine with its collection-level locks. + +The MMFiles engine is gone since ArangoDB 3.7, and the only remaining +storage engine since then is RocksDB. For the RocksDB engine, the +`/_api/export` endpoint internally used a streaming AQL query such as + +```aql +FOR doc IN @@collection RETURN doc +``` + +anyway. To remove API redundancy, the API endpoint has been deprecated +in ArangoDB 3.8 and is now removed. If the functionality is still required +by client applications, running a streaming AQL query can be used as a +substitution. + +## JavaScript API + +### Loading and unloading of collections + +All collections in ArangoDB are now always in the "loaded" state. Any +JavaScript functions for returning a collection's status will now return +"loaded", unconditionally. + +The JavaScript functions for loading and unloading collections (i.e. +`db.<collection>.load()` and `db.<collection>.unload()`) have been turned +into no-ops. They still exist in ArangoDB 3.9, but do not serve any purpose +and are deprecated. + +### AQL queries + +<small>Introduced in: v3.9.11, v3.10.7</small> + +If you specify collections that don't exist in the options of AQL graph traversals +(`vertexCollections`, `edgeCollections`), queries now fail. In previous versions, +unknown vertex collections were ignored, and the behavior for unknown +edge collections was undefined. + +Additionally, queries fail if you specify a document collection or View +in `edgeCollections`. diff --git a/site/content/arangodb/oem/release-notes/version-3.9/incompatible-changes-in-3-9.md b/site/content/arangodb/oem/release-notes/version-3.9/incompatible-changes-in-3-9.md new file mode 100644 index 0000000000..189a7f3473 --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.9/incompatible-changes-in-3-9.md @@ -0,0 +1,304 @@ +--- +title: Incompatible changes in ArangoDB 3.9 +menuTitle: Incompatible changes in 3.9 +weight: 15 +description: >- + Check the following list of potential breaking changes **before** upgrading to + this ArangoDB version and adjust any client applications if necessary +--- +## Architecture requirements + +The minimum architecture requirements have been raised from the Westmere +architecture to the Sandy Bridge architecture. 256 bit AVX instructions are +now expected to be present on all targets that run ArangoDB 3.9 executables. +If a target does not support AVX instructions, it may fail with SIGILL at +runtime. + +## Deployment mode "leader-follower" no longer supported + +The Leader/Follower deployment mode in which two single servers were +set up as a leader and follower pair (without any kind of automatic +failover) was deprecated and removed from the documentation. + +Recommended alternatives are the Active Failover deployment option and the OneShard feature in a cluster. + +## Extended naming convention for databases + +There is a new startup option allowing database names to contain most UTF-8 +characters. The option name is `--database.extended-names-databases`. + +The feature is disabled by default to ensure compatibility with existing client +drivers and applications that only support ASCII names according to the +traditional database naming convention used in previous ArangoDB versions. + +If the feature is enabled, then any endpoints that contain database names +in the URL may contain special characters that were previously not allowed +(percent-encoded). They are also to be expected in payloads that contain +database names. If client applications assemble URLs with database names +programmatically, they need to ensure that database names are properly URL-encoded +and also NFC-normalized if they contain UTF-8 characters. + +The ArangoDB client tools _arangobench_, _arangodump_, _arangoexport_, +_arangoimport_, _arangorestore_, and _arangosh_ ship with full support for the +extended database naming convention. + +Please be aware that dumps containing extended database names cannot be restored +into older versions that only support the traditional naming convention. In a +cluster setup, it is required to use the same database naming convention for all +Coordinators and DB-Servers of the cluster. Otherwise the startup will be +refused. In DC2DC setups it is also required to use the same database naming +convention for both datacenters to avoid incompatibilities. + +Also see [Database names](../../concepts/data-structure/databases.md#database-names). + +## AQL + +The following complexity limits have been added in 3.9 for AQL queries, +Additional complexity limits have been added for AQL queries, in order to +prevent programmatically generated large queries from causing trouble +(too deep recursion, enormous memory usage, long query optimization +and distribution passes etc.). + +The following limits have been added: + +- a recursion limit for AQL query expressions. An expression can now be + up to 500 levels deep. An example expression is `1 + 2 + 3 + 4`, which + is 3 levels deep `1 + (2 + (3 + 4))`. + The recursion of expressions is limited to 500 levels. +- a limit for the number of execution nodes in the initial query + execution plan. The number of execution nodes is limited to 4000. + This number includes all execution nodes of the initial execution plan, + even if some of them could be optimized away later by the + query optimizer during plan optimization. + +AQL queries that violate these limits will fail to run, and instead abort +with error `1524` ("too much nesting or too many objects") during setup. + +Also see [Known limitations for AQL queries](../../aql/fundamentals/limitations.md). + +## Validation of traversal collection restrictions + +<small>Introduced in: v3.9.11, v3.10.7</small> + +In AQL graph traversals, you can restrict the vertex and edge collections in the +traversal options like so: + +```aql +FOR v, e, p IN 1..3 OUTBOUND 'products/123' components + OPTIONS { + vertexCollections: [ "bolts", "screws" ], + edgeCollections: [ "productsToBolts", "productsToScrews" ] + } + RETURN v +``` + +If you specify collections that don't exist, queries now fail with +a "collection or view not found" error (code `1203` and HTTP status +`404 Not Found`). In previous versions, unknown vertex collections were ignored, +and the behavior for unknown edge collections was undefined. + +Additionally, the collection types are now validated. If a document collection +or View is specified in `edgeCollections`, an error is raised +(code `1218` and HTTP status `400 Bad Request`). + +Furthermore, it is now an error if you specify a vertex collection that is not +part of the specified named graph (code `1926` and HTTP status `404 Not Found`). +It is also an error if you specify an edge collection that is not part of the +named graph's definition or of the list of edge collections (code `1939` and +HTTP status `400 Bad Request`). + +## Startup options + +### Installing Foxx apps from remote URLS + +The `--foxx.allow-install-from-remote` option controls whether installing Foxx apps +from remote URL sources other than Github is allowed. If set to `false`, +installing Foxx apps is blocked for any remote sources other than Github. Installing +Foxx apps from Github or from uploaded zip files is still possible with this +option. +Setting it to `true` will allow installing Foxx apps from any remote +URL sources. + +In ArangoDB 3.9, the default value for this option is `false`, meaning that +installing Foxx apps from remote sources other than Github is now disallowed. This +also inactivates the **Remote** tab in the **Services** section of the web interface. +Compared to the previous versions of ArangoDB, this is a downwards-incompatible default +value change, which was made for security reasons. To enable installing +apps from remote sources again, set this option to `true`. + +### RocksDB options + +The default value for the startup `--rocksdb.max-subcompactions` option was +changed from `1` to `2`. +This allows compactions jobs to be broken up into disjoint ranges which +can be processed in parallel by multiple threads. + +### Rebalance shards + +The new `--cluster.max-number-of-move-shards` option limits the maximum number of +move shards operations that can be made when the **Rebalance Shards** button is +clicked in the Web UI. For backwards compatibility purposes, the default value +is `10`. If the value is `0`, the tab containing the button is not clickable. + +### Timeout for JWT sessions + +The lifetime for tokens that can be obtained from the `POST /_open/auth` +endpoint is now configurable via the `--server.session-timeout` startup option. + +The value for the option can be specified in seconds. The default timeout is +**one hour**. Previous versions of ArangoDB had a longer, hard-coded timeout. + +The web interface uses JWT for authentication. However, +the session will be renewed automatically as long as you regularly interact with +the Web UI in your browser. You will not get logged out while actively using it. + +### Disallowed usage of collection names in AQL expressions + +The startup option `--query.allow-collections-in-expressions` added in 3.8.0 +controls whether collection names are allowed in arbitrary places in AQL +expressions. The default was *true*, but is now changed to *false* in 3.9.0 to +make queries like `FOR doc IN collection RETURN collection` fail, where it was +probably intended to `RETURN doc` instead. Also see +[ArangoDB Server Query Options](../../components/arangodb-server/options.md#--queryallow-collections-in-expressions) + +Such unintentional usage of collection names in queries now makes the query +fail with error 1568 ("collection used as expression operand") by default. +The option can be set to *true* to restore the 3.8 behavior. However, the +option is deprecated from 3.9.0 on and will be removed in future versions. +From then on, unintended usage of collection names will always be disallowed. + +If you use queries like `RETURN collection` then you should replace them with +`FOR doc IN collection RETURN doc` to ensure future compatibility. + +### Cluster-internal network protocol + +The cluster-internal network protocol is hard-coded to HTTP/1 in ArangoDB 3.9. +Any other protocol selected via the startup option `--network.protocol` will +automatically be switched to HTTP/1. The startup option `--network.protocol` +is now deprecated and hidden by default. It will be removed in a future version. + +### "Old" system collections + +The option `--database.old-system-collections` was introduced in 3.6 and 3.7 +to control if the obsolete system collections `_modules` and `_routing` should +be created with every new database or not. + +The option was introduced with a default value of `true` in 3.6 and 3.7 for +downwards-compatibility reasons. With the introduction of the option, it was +also announced that the default value would change to `false` in ArangoDB 3.8. +This has happened, meaning that 3.8 installations by default will not create +these system collections anymore. + +In ArangoDB 3.9 the option `--database.old-system-collections` is now +completely obsolete, and ArangoDB will never create these system collections +for any new databases. The option can still be specified at startup, but it +meaningless now. + +## HTTP RESTful API + +### Endpoint return value changes + +- Changed the encoding of revision IDs returned by the below listed REST APIs. + + <small>Introduced in: v3.8.8, v3.9.4</small> + + - `GET /_api/collection/<collection-name>/revision`: The revision ID was + previously returned as numeric value, and now it is returned as + a string value with either numeric encoding or HLC-encoding inside. + - `GET /_api/collection/<collection-name>/checksum`: The revision ID in + the `revision` attribute was previously encoded as a numeric value + in single server, and as a string in cluster. This is now unified so + that the `revision` attribute always contains a string value with + either numeric encoding or HLC-encoding inside. + +## Client tools + +### General changes + +The default value for the `--threads` startup parameter was changed from +2 to the maximum of 2 and the number of available CPU cores for the +following client tools: + +- arangodump +- arangoimport +- arangorestore + +This change can help to improve performance of imports, dumps or restore +processes on machines with multiple cores in case the `--threads` parameter +was not previously used. As a trade-off, the change may lead to an increased +load on servers, so any scripted imports, dumps or restore processes that +want to keep the server load under control should set the number of client +threads explicitly when invoking any of the above client tools. + +### arangodump + +The default value of arangodump's `--envelope` option changes from `true` +in 3.8 to `false` in 3.9. This change turns on the non-envelope dump +format by default, which will lead to smaller and slightly faster dumps. +In addition, the non-enveloped format allows higher parallelism when +restoring dumps with arangorestore. + +The non-enveloped dump format is different to the enveloped dump format +used by default in previous versions of ArangoDB. + +In the enveloped format, dumps were JSONL files with a JSON object in each +line, and the actual database documents were placed inside a `data` attribute. +There was also a `type` attribute for each line, which designated +the type of object in that line (typically this will have been type `"2300"`, +meaning "document"). The old, enveloped format looks like this: + +```json +{"type":2300,"key":"test","data":{"_key":"test","_rev":..., ...}} +``` + +The non-enveloped format which is now enabled by default only contains the +actual documents, e.g. + +```json +{"_key":"test","_rev":..., ...} +``` + +The change of the default dump format may have an effect on third-party +backup tools or script. arangorestore will work fine with both formats. +To switch between the formats, arangodump provides the `--envelope` option. + +### arangorestore + +With the default dump format changing from the enveloped variant to the +non-enveloped variant, arangorestore will now by default be able to employ +higher parallelism when restoring data of large collections. + +When restoring a collection from a non-enveloped dump, arangorestore can +send multiple batches of data for the collection in parallel if it can read +the dump files faster than the server can respond to arangorestore's requests. +This increased parallelism normally helps to speed up the restore process, +but it can also lead to arangorestore saturating the server with its restore +requests. +In this case it is advised to decrease the value of arangorestore's `--threads` +option accordingly. The value of `--threads` will the determine the maximum +parallelism used by arangorestore. + +### arangoimport + +ArangoDB release packages install an executable named _arangoimp_ as an alias +for the _arangoimport_ executable. This is done to provide compatibility with +older releases, in which _arangoimport_ did not yet exist and was named +_arangoimp_. +The renaming was actually carried out in the codebase in December 2017. Using +the _arangoimp_ executable is now deprecated, and it is always favorable to use +_arangoimport_ instead. +While the _arangoimport_ executable will remain, the _arangoimp_ alias will be +removed in a future version of ArangoDB, and its use is now highly discouraged. + +### arangovpack + +The former `--json` and `--pretty` options of the *arangovpack* utility +were removed and replaced with separate options for specifying +the input and output types: + +- `--input-type` (`json`, `json-hex`, `vpack`, `vpack-hex`) +- `--output-type` (`json`, `json-pretty`, `vpack`, `vpack-hex`) + +The former `--print-non-json` option was replaced with the new +`--fail-on-non-json` option, which makes arangovpack fail when trying to emit non-JSON +types to JSON output. diff --git a/site/content/arangodb/oem/release-notes/version-3.9/known-issues-in-3-9.md b/site/content/arangodb/oem/release-notes/version-3.9/known-issues-in-3-9.md new file mode 100644 index 0000000000..b512310eea --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.9/known-issues-in-3-9.md @@ -0,0 +1,69 @@ +--- +title: Known Issues in ArangoDB 3.9 +menuTitle: Known Issues in 3.9 +weight: 10 +description: >- + Important issues affecting the 3.9.x versions of the ArangoDB suite of products +--- +Note that this page does not list all open issues. + +## ArangoSearch + +| Issue | +|------------| +| **Date Added:** 2018-12-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Single-server <br> **Description:** Value of `_id` attribute indexed by ArangoSearch view may become inconsistent after renaming a collection <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#514](https://github.com/arangodb/backlog/issues/514) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** Cluster <br> **Description:** Score values evaluated by corresponding score functions (BM25/TFIDF) may differ in single-server and cluster with a collection having more than 1 shard <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#508](https://github.com/arangodb/backlog/issues/508) (internal) | +| **Date Added:** 2018-12-03 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Using a loop variable in expressions within a corresponding SEARCH condition is not supported <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#318](https://github.com/arangodb/backlog/issues/318) (internal) | +| **Date Added:** 2019-06-25 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** The `primarySort` attribute in ArangoSearch View definitions cannot be set via the web interface. The option is immutable, but the web interface does not allow to set any View properties upfront (it creates a View with default parameters before the user has a chance to configure it). <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2020-03-19 <br> **Component:** ArangoSearch <br> **Deployment Mode:** All <br> **Description:** Operators and functions in `SEARCH` clauses of AQL queries which compare values such as `>`, `>=`, `<`, `<=`, `IN_RANGE()` and `STARTS_WITH()` neither take the server language (`--default-language`) nor the Analyzer locale into account. The alphabetical order of characters as defined by a language is thus not honored and can lead to unexpected results in range queries. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/backlog#679](https://github.com/arangodb/backlog/issues/679) (internal) | + +## AQL + +| Issue | +|------------| +| **Date Added:** 2018-09-05 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** In a very uncommon edge case there is an issue with an optimization rule in the cluster. If you are running a cluster and use a custom shard key on a collection (default is `_key`) **and** you provide a wrong shard key in a modifying query (`UPDATE`, `REPLACE`, `DELETE`) **and** the wrong shard key is on a different shard than the correct one, a `DOCUMENT NOT FOUND` error is returned instead of a modification (example query: `UPDATE { _key: "123", shardKey: "wrongKey"} WITH { foo: "bar" } IN mycollection`). Note that the modification always happens if the rule is switched off, so the suggested workaround is to [deactivate the optimizing rule](../../aql/execution-and-performance/query-optimization.md#turning-specific-optimizer-rules-off) `restrict-to-single-shard`. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#6399](https://github.com/arangodb/arangodb/issues/6399) | +| **Date Added:** 2022-08-12 <br> **Component:** AQL <br> **Deployment Mode:** Cluster <br> **Description:** Since ArangoDB 3.8 there was a loophole for creating duplicate keys in the same collection. This was only possible in cluster and needed an AQL query that copied over data from a collection (source) into another (target). The target collection must have more than one shard and must use a custom shard key. Inserting documents into the target collection must have happened via an AQL query like `FOR doc IN source INSERT doc INTO target`. In this particular situation, the document keys (`_key` attribute) from the source collection were used as-is for insertion into the target collection. However, as the target collection is not sharded by `_key` and uses a custom shard key, it is actually not allowed to specify user-defined values for `_key`. Versions before 3.8 failed with the error "must not specify _key for this collection" when running such AQL query, but versions between 3.8.0 and 3.9.2 did not. <br> **Affected Versions:** 3.8.0 - 3.8.7, 3.9.0 - 3.9.2 <br> **Fixed in Versions:** 3.8.8, 3.9.3 <br> **Reference:** [arangodb/arangodb#16764](https://github.com/arangodb/arangodb/issues/16764) | + +## Upgrading + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** Bugfix release upgrades such as 3.4.4 to 3.4.5 may not create a backup of the database directory even if they should. Please create a copy manually before upgrading. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x (Windows and Linux) <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/planning#3745](https://github.com/arangodb/planning/issues/3745) (internal) | +| **Date Added:** 2019-12-10 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows may fail to upgrade an existing installation, e.g. from 3.4.a to 3.4.b (patch release), with the error message: "failed to detect whether we need to Upgrade" <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2020-01-07 <br> **Component:** Installer <br> **Deployment Mode:** All <br> **Description:** The NSIS installer for Windows can fail to add the path to the ArangoDB binaries to the `PATH` environment variable, silently or with an error. <br> **Affected Versions:** 3.4.x, 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/release-qa#183](https://github.com/arangodb/release-qa/issues/183) (internal) | +| **Date Added:** 2022-08-25 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** If any collection in a 3.8.x cluster has a schema set, the following issue may occur after upgrading to 3.9.x: the server background maintenance tasks go into a busy loop. As no workaround currently exists, such an upgrade must not be performed. <br> **Affected Versions:** 3.9.0 - 3.9.2 <br> **Fixed in Versions:** 3.9.3 <br> | +| **Date Added:** 2023-06-06 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** During a cluster upgrade while the supervision is deactivated (maintenance mode), upgraded DB-Server nodes are incorrectly reported to still have the old server version. The versions are visible in the Agency as well as in the **NODES** section of the web interface. <br> **Affected Versions:** 3.9.x, 3.10.x, 3.11.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-1409](https://arangodb.atlassian.net/browse/BTS-1409) (internal) | + +## Hot Backup + +| Issue | +|------------| +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** All <br> **Description:** The Hot Backup feature is not supported in the Windows version of ArangoDB at this point in time. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** Hot Backup API / arangobackup <br> **Deployment Mode:** DC2DC <br> **Description:** Hot Backup functionality in Datacenter-to-Datacenter Replication setups is experimental and may not work. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-10-09 <br> **Component:** arangobackup <br> **Deployment Mode:** All <br> **Description:** The startup option `--operation` works as positional argument only, e.g. `arangobackup list`. The alternative syntax `arangobackup --operation list` is not accepted. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Schema Validation + +| Issue | +|------------| +| **Date Added:** 2019-03-17 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** The schema validation cannot pin-point which part of a rule made it fail. This is under investigation but very hard to solve for complex schemas. For example, when using `not` and `anyOf`, this would result in trees of possible errors. For now users should fall back to tools like [jsonschemavalidator.net](https://www.jsonschemavalidator.net/) <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-03-17 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** Remote schemas are not supported for security reasons. This limitation will likely remain unfixed. <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-06-25 <br> **Component:** Schema Validation <br> **Deployment Mode:** All <br> **Description:** When using arangorestore for a collection with a defined schema, schema validation is not executed. <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | + +## Other + +| Issue | +|------------| +| **Date Added:** 2019-05-16 <br> **Component:** Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter falls back to the IP `[::1]` under macOS. If there is no entry `::1 localhost` in the `/etc/hosts` file or the option `--starter.disable-ipv6` is passed to the starter to use IPv4, then it will hang during startup. <br> **Affected Versions:** 0.14.3 (macOS only) <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-05-24 <br> **Component:** Web UI <br> **Deployment Mode:** Active Failover <br> **Description:** The web interface shows a wrong replication mode in the replication tab in Active Failover deployments sometimes. It may display Leader/Follower mode (the default value) because of timeouts if `/_api/cluster/endpoints` is requested too frequently. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2019-04-03 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** Updating the properties of a collection in the cluster may return before the properties are updated consistently on all shards. This is especially visible when setting a schema for a collection with multiple shards, and then instantly starting to store non-conforming documents into the collection. These may be accepted until the properties change has been fully propagated to all shards. <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2021-04-07 <br> **Component:** arangod <br> **Deployment Mode:** All <br> **Description:** The Batch API (HTTP endpoint `/_api/batch`) cannot be used in combination with Stream transactions to submit batched requests, because the required header `x-arango-trx-id` is not forwarded. It only processes `Content-Type` and `Content-Id`. <br> **Affected Versions:** 3.5.x, 3.6.x, 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [arangodb/arangodb#13552](https://github.com/arangodb/arangodb/issues/13552) | +| **Date Added:** 2021-08-06 <br> **Component:** Installer <br> **Deployment Mode:** Single Server <br> **Description:** The Windows installer fails during database initialization with the error `failed to locate tzdata` if there are non-ASCII characters in the destination path. <br> **Affected Versions:** 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-531](https://arangodb.atlassian.net/browse/BTS-531) (internal) | +| **Date Added:** 2022-01-31 <br> **Component:** ArangoSync, SmartGraphs <br> **Deployment Mode:** DC2DC <br> **Description:** In a DC2DC replication scenario, when you try to replicate a Smartgraph using SatelliteCollections (for versions 3.9.x) or a Disjoint Smartgraph (for versions 3.8.x and earlier), the sync of collections may get stuck. <br> **Affected Versions:** 3.7.x, 3.8.x, 3.9.x <br> **Fixed in Versions:** 3.8.7, 3.9.2 <br> **Reference:** [BTS-737](https://arangodb.atlassian.net/browse/BTS-737) (internal) | +| **Date Added:** 2022-02-08 <br> **Component:** SmartGraphs <br> **Deployment Mode:** Cluster <br> **Description:** An error may occur during an attempt to alter a Disjoint SmartGraph using SatelliteCollections relation for a specific case when several relations of different configurations are present. <br> **Affected Versions:** 3.9.x <br> **Fixed in Versions:** 3.9.2 <br> **Reference:** [BTS-787](https://arangodb.atlassian.net/browse/BTS-787) (internal)| +| **Date Added:** 2022-05-30 <br> **Component:** ArangoSync <br> **Deployment Mode:** DC2DC <br> **Description:** In a DC2DC replication scenario, _users collection may fail to be replicated. <br> **Affected Versions:** 3.8.x, 3.9.x <br> **Fixed in Versions:** - <br> **Reference:** [BTS-854](https://arangodb.atlassian.net/browse/BTS-854) (internal) | +| **Date Added:** 2022-09-29 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** The ArangoDB Starter may fail to pick a Docker container name from cgroups. <br> **Affected Versions:** 3.8.x, 3.9.x <br> **Fixed in Versions:** 3.9.9 <br> **Reference:** [GT-207](https://arangodb.atlassian.net/browse/GT-207) (internal) | +| **Date Added:** 2022-10-26 <br> **Component:** ArangoSync <br> **Deployment Mode:** DC2DC <br> **Description:** When upgrading from 3.8.8 or to 3.8.8/3.9.4, the _analyzers collection cannot be replicated. <br> **Affected Versions:** 3.8.8, 3.9.4 <br> **Fixed in Versions:** 3.8.9, 3.9.6 <br> **Reference:** [BTS-1094](https://arangodb.atlassian.net/browse/BTS-1094) (internal) | +| **Date Added:** 2023-02-17 <br> **Component:** ArangoDB Starter <br> **Deployment Mode:** All <br> **Description:** When using a Windows build with `netgo`, the `localhost` cannot be resolved. <br> **Affected Versions:** 3.9.8 <br> **Fixed in Versions:** 3.9.9 <br> **Reference:** [GT-330](https://arangodb.atlassian.net/browse/GT-330) (internal) | +| **Date Added:** 2023-06-07 <br> **Component:** ArangoSync <br> **Deployment Mode:** All <br> **Description:** In ArangoSync v2.18.0, synchronization may be interrupted with errors like "CloneDirectMQToken failed" due to network disturbances. <br> **Affected Versions:** 3.9.11 <br> **Fixed in Versions:** - <br> **Reference:** N/A | +| **Date Added:** 2023-06-16 <br> **Component:** arangod <br> **Deployment Mode:** Cluster <br> **Description:** If more than a certain threshold of queries on the same Coordinator get into the shutdown networking code at the same time, all of them lock up and the Coordinator does not longer process requests. <br> **Affected Versions:** 3.9.x <br> **Fixed in Versions:** 3.9.12 <br> **Reference:** [BTS-1486](https://arangodb.atlassian.net/browse/BTS-1486) (internal) | diff --git a/site/content/arangodb/oem/release-notes/version-3.9/whats-new-in-3-9.md b/site/content/arangodb/oem/release-notes/version-3.9/whats-new-in-3-9.md new file mode 100644 index 0000000000..f77f661cbc --- /dev/null +++ b/site/content/arangodb/oem/release-notes/version-3.9/whats-new-in-3-9.md @@ -0,0 +1,1266 @@ +--- +title: Features and Improvements in ArangoDB 3.9 +menuTitle: What's New in 3.9 +weight: 5 +description: >- + Extended SmartGraphs, new AQL and index features for efficiency, new Analyzers +--- +The following list shows in detail which features have been added or improved in +ArangoDB 3.9. ArangoDB 3.9 also contains several bug fixes that are not listed +here. + +## (Disjoint) SmartGraphs using SatelliteCollections (Enterprise Edition) + +SmartGraphs have been extended with a new option to create SmartGraphs +using SatelliteCollections. +These SmartGraphs are capable of using SatelliteCollections within their graph +definition and therefore can make use of all the benefits of +[SatelliteCollections](../../develop/satellitecollections.md). + +Edge definitions can now be created between SmartCollections and +SatelliteCollections. As SatelliteCollections are globally replicated to each +participating DB-Server, regular graph traversals, weighted traversals, +shortest path, and k shortest paths queries can partially be executed locally on +each DB-Server. This means that query execution can be fully local whenever +actual data from the SatelliteCollections is being processed. This can improve +data locality and reduce the number of network hops between cluster nodes. + +In case you do have collections that are needed in almost every traversal but +are small enough to be copied over to every participating DB-Server, +SmartGraphs with SatelliteCollections are the perfect fit, as this will increase +the amount of local query execution. + +SmartGraphs using SatelliteCollections can also be disjoint. A Disjoint SmartGraph +prohibits edges connecting different SmartGraph components. The same rule applies to +[Disjoint SmartGraphs using SatelliteCollections](../../graphs/smartgraphs/_index.md). +If your graph does not need edges between vertices with different SmartGraph +attribute values, then you should enable this option. This topology restriction +allows the query optimizer to improve traversal execution times, because the +execution can be pushed down to a single DB-Server in many cases. + +[SmartGraphs using SatelliteCollections](../../graphs/smartgraphs/_index.md) +are only available in the Enterprise Edition. + +## ArangoSearch + +### Segmentation and Collation Analyzers + +The new `segmentation` Analyzer type allows you to tokenize text in a +language-agnostic manner as per +[Unicode Standard Annex #29](https://unicode.org/reports/tr29), +making it suitable for mixed language strings. It can optionally preserve all +non-whitespace or all characters instead of keeping alphanumeric characters only, +as well as apply case conversion. + +The `collation` Analyzer converts the input into a set of language-specific +tokens. This makes comparisons follow the rules of the respective language, +most notable in range queries against Views. + +See: +- [`segmentation` Analyzer](../../index-and-search/analyzers.md#segmentation) +- [`collation` Analyzer](../../index-and-search/analyzers.md#collation) + +### Analyzer locale normalization + +Analyzers with a `locale` property no longer require that you specify the UTF-8 +encoding (`.utf-8`) that ArangoDB uses for strings. + +The syntax for specifying the language, and possibly a country, variant, +keywords, is now the same as described in the +[ICU Documentation](https://unicode-org.github.io/icu/userguide/locale/). +The new `collation` Analyzer is currently the only Analyzer that supports all +four: `language[_COUNTRY][_VARIANT][@keywords]` (square bracket denote optional +parts). The `text` and `norm` Analyzers support `language[_COUNTRY][_VARIANT]`, the +`stem` Analyzer only `language`. + +The former syntax is still supported but automatically normalized to the +new syntax. + +### ArangoSearch column cache (Enterprise Edition) + +Views of the type `arangosearch` support new caching options. + +<small>Introduced in: v3.9.5</small> + +- You can enable the new `cache` option for individual View links or fields + to always cache field normalization values in memory. This can improve the + performance of scoring and ranking queries. + + It also enables caching of auxiliary data used for querying fields that are + indexed with Geo Analyzers. This can improve the performance of geo-spatial + queries. + +- You can enable the new `cache` option in the definition of a `storedValues` + View property to always cache stored values in memory. This can improve the + query performance if stored values are involved. + +--- + +<small>Introduced in: v3.9.6</small> + +- You can enable the new `primarySortCache` View property to always cache the + primary sort columns in memory. This can improve the performance of queries + that utilize the primary sort order. + +- You can enable the new `primaryKeyCache` View property to always cache the + primary key column in memory. This can improve the performance of queries + that return many documents. + +The cache size can be controlled with the new `--arangosearch.columns-cache-limit` +startup option and monitored via the new `arangodb_search_columns_cache_size` +metric. + +[ArangoSearch caching](../../index-and-search/arangosearch/arangosearch-views-reference.md) is only available in the +Enterprise Edition. + +See [Optimizing View query performance](../../index-and-search/arangosearch/performance.md) +for examples. + +## UI + +### Rebalance Shards for all databases in Web UI + +The rebalance shards section displays a button for rebalancing shards. +In previous versions, this button only appeared for the `_system` database, +but now it appears in user-created databases as well if the user has the write +permission for the database. + +There is also a new startup option to limit the +[Maximum number of move shards](#maximum-number-of-move-shards). + +### Analyzers in Web Interface + +A new menu item _ANALYZERS_ has been added to the side navigation bar of the +Web UI. Through this page, you can view existing Analyzers as well create new +Analyzers. The UI is full-featured and lets you feed in all parameters and +options that you could otherwise input through the HTTP or JavaScript API. + +It also lets you copy configuration from an existing Analyzer, allowing for a +much quicker workflow when your new Analyzer is very similar to an existing one. + +It offers two edit/view modes - a form mode where a standard web form is used to +capture user input, and a JSON mode where experienced users can directly write +the raw Analyzer configuration in JSON format. + +### Additional Fields in Views Creation Form + +ArangoSearch Views have 6 immutable fields (apart from `name` and `type`) that +can only be set once at the time of creation. The web interface now includes +these fields in the View creation form, so that you can set them when creating +Views through the UI: + +- `primarySort` +- `primarySortCompression` +- `storedValues` +- `writebufferIdle` +- `writebufferActive` +- `writebufferSizeMax` + +### Web interface session handling + +The previously inactive startup parameter `--server.session-timeout` was +revived and now controls the timeout for web interface sessions (and other +sessions that are based on JWTs created by the `/_open/auth` API). + +For security reasons, the default timeout value for web interface sessions +has been reduced to one hour, after which a session is ended automatically. +Web interface sessions that are active (i.e. that have any user activity) +are automatically extended until the user ends the session explicitly or +if there is a period of one hour without any user activity. + +The timeout value for web interface sessions can be adjusted via the +`--server.session-timeout` startup parameter (in seconds). + +### Configurable root redirect + +Added two options to `arangod` to allow HTTP redirection customization for +root (`/`) call of the HTTP API: + +- `--http.permanently-redirect-root`: if `true` (default), use a permanent + redirection (use HTTP 301 code), if `false` fall back to temporary redirection + (use HTTP 302 code). + +- `--http.redirect-root-to`: redirect of root URL to a specified path. + Redirects to `/_admin/aardvark/index.html` if not set (default). + +These options are useful to override the built-in web interface with some +user-defined action. + +## AQL + +### Upsert with Index Hint + +Added support for the `indexHint` and `forceIndexHint` options to the `UPSERT` +operation. It will be used as a hint for the document lookup that is performed +as part of the `UPSERT` operation, and can help in cases such as `UPSERT` not +picking the best index automatically. + +```aql +UPSERT { a: 1234 } + INSERT { a: 1234, name: "AB"} + UPDATE {name: "ABC"} IN myCollection + OPTIONS { indexHint: "index_name", forceIndexHint: true } +``` + +See [`UPSERT` Options](../../aql/high-level-operations/upsert.md#indexhint) + +### Decay Functions + +Added three decay functions to AQL: + +- [DECAY_EXP()](../../aql/functions/numeric.md#decay_exp) +- [DECAY_LINEAR()](../../aql/functions/numeric.md#decay_linear) +- [DECAY_GAUSS()](../../aql/functions/numeric.md#decay_gauss) + +Decay functions calculate a score with a function that decays depending on the +distance of a numeric value from a user given origin. + +```aql +DECAY_GAUSS(41, 40, 5, 5, 0.5) // 1 +DECAY_LINEAR(5, 0, 10, 0, 0.2) // 0.6 +DECAY_EXP(2, 0, 10, 0, 0.2) // 0.7247796636776955 +``` + +### Vector Functions + +Added three vector functions to AQL for calculating the cosine similarity +(`COSINE_SIMILARITY`), Manhattan distance (named `L1_DISTANCE`), and Euclidean +distance (named `L2_DISTANCE`): + +- [COSINE_SIMILARITY()](../../aql/functions/numeric.md#cosine_similarity) +- [L1_DISTANCE()](../../aql/functions/numeric.md#l1_distance) +- [L2_DISTANCE()](../../aql/functions/numeric.md#l2_distance) + +```aql +COSINE_SIMILARITY([0,1], [1,0]) // 0 +L1_DISTANCE([-1,-1], [2,2]) // 6 +L2_DISTANCE([1,1], [5,2]) // 4.1231056256176606 +``` + +### Traversal filtering optimizations + +A post-filter on the vertex and/or edge result of a traversal will now be +applied during the traversal to avoid generating the full output for AQL. +This will have a positive impact on performance when filtering on the +vertex/edge but still returning the path. + +Previously all paths were produced even for non-matching vertices/edges. +The new optimization now will check on the vertex/edge filter condition +first and only produce the remaining paths. + +For example, the query + +```aql +FOR v, e, p IN 10 OUTBOUND @start GRAPH "myGraph" + FILTER v.isRelevant == true + RETURN p +``` + +can now be optimized, and the traversal statement will only produce +paths for which the last vertex satisfies `isRelevant == true`. + +This optimization is now part of the existing `optimize-traversals` rule and +you will see the conditions under `Filter / Prune Conditions` in the query +explain output (`` FILTER (v.`isRelevant` == true) `` in this example): + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 TraversalNode 1 - FOR v /* vertex */, p /* paths: vertices, edges */ IN 10..10 /* min..maxPathDepth */ OUTBOUND 'A' /* startnode */ GRAPH 'myGraph' + 3 CalculationNode 1 - LET #5 = (v.`isRelevant` == true) /* simple expression */ + 4 FilterNode 1 - FILTER #5 + 5 ReturnNode 1 - RETURN p + +Indexes used: + By Name Type Collection Unique Sparse Selectivity Fields Ranges + 2 edge edge edge false false 100.00 % [ `_from` ] base OUTBOUND + +Traversals on graphs: + Id Depth Vertex collections Edge collections Options Filter / Prune Conditions + 2 10..10 vert edge uniqueVertices: none, uniqueEdges: path FILTER (v.`isRelevant` == true) + +Optimization rules applied: + Id RuleName + 1 optimize-traversals +``` + +### Traversal partial path buildup + +There is now a performance optimization for traversals in which the path +is returned, but only a specific sub-attribute of the path is used later +(e.g. `vertices`, `edges`, or `weight` sub-attribute). + +For example, the query + +```aql +FOR v, e, p IN 1..3 OUTBOUND @start GRAPH "myGraph" + RETURN p.vertices +``` + +only requires the buildup of the `vertices` sub-attribute of the path result `p` +but not the buildup of the `edges` sub-attribute. The optimization can be +observed in the query explain output: + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 2 TraversalNode 1 - FOR v /* vertex */, p /* paths: vertices */ IN 1..3 /* min..maxPathDepth */ OUTBOUND 'A' /* startnode */ GRAPH 'myGraph' + 3 CalculationNode 1 - LET #5 = p.`vertices` /* attribute expression */ + 4 ReturnNode 1 - RETURN #5 + +Indexes used: + By Name Type Collection Unique Sparse Selectivity Fields Ranges + 2 edge edge edge false false 100.00 % [ `_from` ] base OUTBOUND + +Traversals on graphs: + Id Depth Vertex collections Edge collections Options Filter / Prune Conditions + 2 1..3 vert edge uniqueVertices: none, uniqueEdges: path + +Optimization rules applied: + Id RuleName + 1 optimize-traversals + 2 remove-redundant-path-var +``` + +The `remove-redundant-path-var` optimization rule is applied and the +TraversalNode's comment indicates that only the `vertices` sub-attribute is +built up for this query: `p /* paths: vertices */` + +This optimization should have a positive impact on performance for larger +traversal result sets. + +### Prune Variable + +Added an option to store the `PRUNE` expression as a variable. Now, the `PRUNE` +condition can be stored in a variable and be used later in the query without +having to repeat the `PRUNE` condition: + +```aql +FOR v, e, p IN 10 OUTBOUND @start GRAPH "myGraph" + PRUNE pruneCondition = v.isRelevant == true + FILTER pruneCondition + RETURN p +``` + +The `v.isRelevant == true` condition is stored in the `pruneCondition` variable +and used as a condition for `FILTER` later. + +See [Pruning](../../aql/graphs/traversals.md#pruning). + +### Warnings on invalid OPTIONS + +Invalid use of `OPTIONS` in AQL queries will now raise a warning when the query +is parsed. This is useful to detect misspelled attribute names in `OPTIONS`, e.g. + +```aql +INSERT ... INTO collection + OPTIONS { overwrightMode: 'ignore' } /* should have been 'overwriteMode' */ +``` + +It is also useful to detect the usage of valid `OPTIONS` attribute names that +are used at a wrong position in the query, e.g. + +```aql +FOR doc IN collection + FILTER doc.value == 1234 + INSERT doc INTO other + OPTIONS { indexHint: 'myIndex' } /* should have been used above for FOR */ +``` + +In case options are used incorrectly, a warning with code 1575 will be raised +during query parsing or optimization. By default, warnings are reported but do +not lead to the query being aborted. This can be toggled by the startup option +`--query.fail-on-warnings` or the per-query runtime option `failOnWarnings`. + +### Memory usage tracking + +The AQL operations `K_SHORTEST_PATHS` and `SHORTEST_PATH` are now included +in the memory usage tracking performed by AQL, so that memory acquired by these +operations will be accounted for and checked against the configured memory +limit (options `--query.memory-limit` and `--query.memory-limit-global`). + +### Execution of complex queries + +Very large queries (in terms of query execution plan complexity) are now split +into multiple segments which are executed using separate stacks. This prevents a +potential stack overflow. To configure the number of execution nodes after such a +stack splitting is performed, use the `--query.max-nodes-per-callstack` startup option. +The default value is 200 for macOS, and 250 +for the other supported platforms. The value can be adjusted per query via the +`maxNodesPerCallstack` query option. Please note that the default values +should work and adjusting the option is only useful for testing and debugging. + +### Query complexity limits + +AQL now has some hard-coded query complexity limits, to prevent large +programmatically generated queries from causing trouble (too deep recursion, +enormous memory usage, long query optimization and distribution passes etc.). + +The following limits have been introduced: +- a recursion limit for AQL query expressions. An expression can now be + up to 500 levels deep. An example expression is `1 + 2 + 3 + 4`, which + is 3 levels deep `1 + (2 + (3 + 4))`. + The expression recursion is limited to 500 levels. +- a limit for the number of execution nodes in the initial query + execution plan. + The number of execution nodes in the initial query execution plan is + limited to 4000. This number includes all execution nodes of the + initial execution plan, even if some of them could be + optimized away later by the query optimizer during plan optimization. + +AQL queries that violate these limits will fail to run, and instead abort +with error `1524` ("too much nesting or too many objects") during setup. + +### `disableIndex` hint + +<small>Introduced in: v3.9.1</small> + +In some rare cases, an AQL query can be executed faster if it ignores indexes. +You can force the optimizer not use an index for any given `FOR` +loop by setting the new `disableIndex` hint to `true`: + +```aql +FOR doc IN collection OPTIONS { disableIndex: true } + FILTER doc.value <= 99 + RETURN doc.other +``` + +See the [`FOR` Operation Options](../../aql/high-level-operations/for.md#disableindex) for details. + +### `maxProjections` hint + +<small>Introduced in: v3.9.1</small> + +If an AQL query accesses 5 or fewer attributes of a collection in a `FOR` loop, +the query optimizer changes the strategy for retrieving the data from the +storage engine. Instead of extracting full documents, only subsets of the +documents are fetched. + +Such projections are typically faster as long as there are not too many of them +but it depends on the number of attributes and their size. The new `maxProjections` +hint lets you adjust the threshold to fine-tune your queries. + +```aql +FOR doc IN collection OPTIONS { maxProjections: 7 } + RETURN [ doc.val1, doc.val2, doc.val3, doc.val4, doc.val5, doc.val6, doc.val7 ] +``` + +See the [`FOR` Operation Options](../../aql/high-level-operations/for.md#maxprojections) for details. + +### RocksDB block cache control + +The new query option `fillBlockCache` can be used to control the population +of the RocksDB block cache with data read by the query. The default value for +this per-query option is `true`, which means that any data read by the query +will be inserted into the RocksDB block cache if not already present in there. +This mimics the previous behavior and is a sensible default. + +Setting the option to `false` allows to not store any data read by the query +in the RocksDB block cache. This is useful for queries that read a lot of (cold) +data which would lead to the eviction of the hot data from the block cache. + +### AQL function to return a shard ID for a document + +A new [AQL function](../../aql/functions/miscellaneous.md#shard_id) is available which allows you to +obtain the responsible shard for any document in a collection by specifying its shard keys. + +### Improved query explanation for index scans + +<small>Introduced in: v3.9.3</small> + +The AQL query explainer now displays `index scan + document lookup` comments for +queries that use an index for filtering, but need to fetch more document data +from the storage engine. + +```aql +FOR doc IN coll + FILTER doc.attr == 42 // indexed attribute + RETURN doc +``` + +```aql +Execution plan: + Id NodeType Est. Comment + 1 SingletonNode 1 * ROOT + 6 IndexNode 1 - FOR doc IN coll /* persistent index scan, index scan + document lookup */ + 5 ReturnNode 1 - RETURN doc +``` + +Previously, it was labeled as `index scan` only, obfuscating the fact that +there are document lookups needed. Covering index queries are still labeled +`index scan, index only` as before. + +### Number of cluster requests in profiling output + +<small>Introduced in: v3.9.5</small> + +The query profiling output in the web interface and _arangosh_ now shows the +number of HTTP `Requests` for queries that you run against cluster deployments +in the `Query Statistics`: + +```aql +Query String (33 chars, cacheable: false): + FOR doc IN coll + RETURN doc._key + +Execution plan: + Id NodeType Site Calls Items Filtered Runtime [s] Comment + 1 SingletonNode DBS 3 3 0 0.00024 * ROOT + 9 IndexNode DBS 3 0 0 0.00060 - FOR doc IN coll /* primary index scan, index only (projections: `_key`), 3 shard(s) */ + 3 CalculationNode DBS 3 0 0 0.00025 - LET #1 = doc.`_key` /* attribute expression */ /* collections used: doc : coll */ + 7 RemoteNode COOR 6 0 0 0.00227 - REMOTE + 8 GatherNode COOR 2 0 0 0.00209 - GATHER /* parallel, unsorted */ + 4 ReturnNode COOR 2 0 0 0.00008 - RETURN #1 + +Indexes used: + By Name Type Collection Unique Sparse Cache Selectivity Fields Stored values Ranges + 9 primary primary coll true false false 100.00 % [ `_key` ] [ ] * + +Optimization rules applied: + Id RuleName + 1 scatter-in-cluster + 2 distribute-filtercalc-to-cluster + 3 remove-unnecessary-remote-scatter + 4 reduce-extraction-to-projection + 5 parallelize-gather + +Query Statistics: + Writes Exec Writes Ign Scan Full Scan Index Cache Hits/Misses Filtered Requests Peak Mem [b] Exec Time [s] + 0 0 0 0 0 / 0 0 9 32768 0.00564 +``` + +### Edge cache refilling (experimental) + +<small>Introduced in: v3.9.6</small> + +A new feature to automatically refill the in-memory edge cache is available. +When edges are added, modified, or removed, these changes are tracked and a +background thread tries to update the edge cache accordingly if the feature is +enabled, by adding new, updating existing, or deleting and refilling cache +entries. + +You can enable it for individual `INSERT`, `UPDATE`, `REPLACE`, and `REMOVE` +operations in AQL queries (using `OPTIONS { refillIndexCaches: true }`), for +individual document API requests that insert, update, replace, or remove single +or multiple edge documents (by setting `refillIndexCaches=true` as query +parameter), as well as enable it by default using the new +`--rocksdb.auto-refill-index-caches-on-modify` startup option. + +The new `--rocksdb.auto-refill-index-caches-queue-capacity` startup option +restricts how many edge cache entries the background thread can queue at most. +This limits the memory usage for the case of the background thread being slower +than other operations that invalidate edge cache entries. + +The background refilling is done on a best-effort basis and not guaranteed to +succeed, for example, if there is no memory available for the cache subsystem, +or during cache grow/shrink operations. A background thread is used so that +foreground write operations are not slowed down by a lot. It may still cause +additional I/O activity to look up data from the storage engine to repopulate +the cache. + +In addition to refilling the edge cache, the cache can also automatically be +seeded on server startup. Use the new `--rocksdb.auto-fill-index-caches-on-startup` +startup option to enable this feature. It may cause additional CPU and I/O load. +You can limit how many index filling operations can execute concurrently with the +`--rocksdb.max-concurrent-index-fill-tasks` option. The lower this number, the +lower the impact of the cache filling, but the longer it takes to complete. + +The following metrics are available: + +| Label | Description | +|:------|:------------| +| `rocksdb_cache_auto_refill_loaded_total` | Total number of queued items for in-memory index caches refilling. +| `rocksdb_cache_auto_refill_dropped_total` | Total number of dropped items for in-memory index caches refilling. +| `rocksdb_cache_full_index_refills_total` | Total number of in-memory index caches refill operations for entire indexes. + +This feature is experimental. + +Also see: +- [AQL `INSERT` operation](../../aql/high-level-operations/insert.md#refillindexcaches) +- [AQL `UPDATE` operation](../../aql/high-level-operations/update.md#refillindexcaches) +- [AQL `REPLACE` operation](../../aql/high-level-operations/replace.md#refillindexcaches) +- [AQL `REMOVE` operation](../../aql/high-level-operations/remove.md#refillindexcaches) +- [Document HTTP API](../../develop/http-api/documents.md) +- [Edge cache refill options](#edge-cache-refill-options) + +## Multi-dimensional Indexes (experimental) + +ArangoDB 3.9 features a new index type `zkd`. It can be created like other +indexes on collections. In contrast to the `persistent` index type (same for +`hash` and `skiplist`, which today are just aliases for `persistent`), it lifts +the following restriction. + +A `persistent` index can only be used with query filters where a conjunction of +equalities on a prefix of indexed fields covers the filter. For example, given a +collection with a `persistent` index on the fields `["a", "b"]`. Then the +following filters _can_ be satisfied by the index: + +- `FILTER doc.a == @a` +- `FILTER doc.a == @a && doc.b == @b` +- `FILTER doc.a == @a && @bl <= doc.b && doc.b <= @bu` + +While the following filters _cannot_, or only partially, be satisfied by a +`persistent` index: + +- `FILTER doc.b == @b` +- `FILTER @bl <= doc.b && doc.b <= @bu` +- `FILTER @al <= doc.a && doc.a <= @au && @bl <= doc.b && doc.b <= @bu` + +A `zkd` index can be used to satisfy them all. An example where this is useful +are documents with an assigned time interval, where a query should find all +documents that contain a given time point, or overlap with some time interval. + +There are also drawbacks in comparison with `persistent` indexes. For one, the +`zkd` index is not sorted. Secondly, it has a significantly higher overhead, and +the emerging performance is much more dependent on the distribution of the +dataset, making it less predictable. A third limitation is that `zkd` indexes +can only be created for index values which are IEEE 754 doubles. + +[Multi-dimensional Indexes](../../index-and-search/indexing/working-with-indexes/multi-dimensional-indexes.md) are an experimental feature. + +## Server options + +### Maximum number of move shards + +The `--cluster.max-number-of-move-shards` startup option limits the maximum +number of move shards operations that can be made when the **Rebalance Shards** +button is clicked in the Web UI. For backwards compatibility purposes, the +default value is `10`. If the value is `0`, then the tab containing this button +will be inactive and the button cannot be clicked. + +### Extended naming convention for databases + +There is a new startup option `--database.extended-names-databases` to allow +database names to contain most UTF-8 characters. This feature is +**experimental** in ArangoDB 3.9, but will become the norm in a future version. + +Running the server with the option enabled provides support for database names +that are not comprised within the ASCII table, such as Japanese or Arabic +letters, emojis, letters with accentuation. Also, many ASCII characters that +were formerly banned in the traditional naming convention are now accepted. + +Example database names that can be used with the new naming convention: +`"España", "😀", "犬", "كلب", "@abc123", "København", "München", "Россия", "abc? <> 123!"` + +The ArangoDB client tools _arangobench_, _arangodump_, _arangoexport_, +_arangoimport_, _arangorestore_, and _arangosh_ ship with full support for the +extended database naming convention. + +Note that the default value for `--database.extended-names-databases` is `false` +for compatibility with existing client drivers and applications that only support +ASCII names according to the traditional database naming convention used in previous +ArangoDB versions. Enabling the feature may lead to incompatibilities up to the +ArangoDB instance becoming inaccessible for such drivers and client applications. + +Please be aware that dumps containing extended database names cannot be restored +into older versions that only support the traditional naming convention. In a +cluster setup, it is required to use the same database naming convention for all +Coordinators and DB-Servers of the cluster. Otherwise the startup will be +refused. In DC2DC setups it is also required to use the same database naming +convention for both datacenters to avoid incompatibilities. + +Also see [Database names](../../concepts/data-structure/databases.md#database-names). + +### ICU Language + +<small>Introduced in: v3.9.1</small> + +A new server startup option for setting the language was added. The new +`--icu-language` option will replace the existing `--default-language` option, +and only one of the two can be set. + +Also see [ArangoDB Server General Options](../../components/arangodb-server/options.md#--icu-language). + +### Logging + +The server now has two flags for retaining or escaping control and Unicode +characters in the log. The flag `--log.escape` is now deprecated and, instead, +the new flags `--log.escape-control-chars` and `--log.escape-unicode-chars` +should be used. + +- `--log.escape-control-chars`: + + This flag applies to the control characters, that have hex codes below `\x20`, + and also the character `DEL` with hex code `\x7f`. + + When the flag value is set to `false`, control characters will be retained + when they have a visible representation, and replaced with a space character + in case they do not have a visible representation. For example, the control + character `\n` is visible, so a `\n` will be displayed in the log. Contrary, + the control character `BEL` is not visible, so a space will be displayed + instead. + + When the flag value is set to `true`, the hex code for the character is + displayed, for example, the `BEL` character will be displayed as its hex code, + `\x07`. + + The default value for this flag is `true` to ensure compatibility with + previous versions. + +- `--log.escape-unicode-chars`: + + If its value is set to `false`, Unicode characters will be retained and + written to the log as-is. For example, `犬` will be logged as `犬`. If the + flag value is set to `true`, any Unicode characters are escaped, and the hex + codes for all Unicode characters are logged instead. For example, `犬` would + be logged as its hex code, `\u72AC`. + + The default value for this flag is set to `false` for compatibility with + previous versions. + +Also see [Logging](../../components/arangodb-server/options.md#log). + +### Version information + +The _arangod_ server now provides a command `--version-json` to print version +information in JSON format. This output can be used by tools that need to +programmatically inspect an _arangod_ executable. + +A pseudo log topic `"all"` was added. Setting the log level for the "all" log +topic will adjust the log level for **all existing log topics**. For example, +`--log.level all=debug` will set all log topics to log level "debug". + +### Cluster option for shard synchronization timeout + +<small>Introduced in: v3.9.2</small> + +A `--cluster.shard-synchronization-attempt-timeout` startup option has been +added, letting you limit the amount of time to spend in shard synchronization +attempts (in seconds). + +The default timeout value is 20 minutes. Running into the timeout does not lead +to a synchronization failure, but continues the synchronization shortly after. +Setting a timeout can help to split the synchronization of large shards into +smaller chunks and release snapshots and archived WAL files on the leader earlier. + +This change also introduces a new `arangodb_sync_timeouts_total` metric that +counts the number of timed-out shard synchronization attempts. + +### RocksDB range delete operations in cluster + +<small>Introduced in: v3.9.3</small> + +The new `--rocksdb.use-range-delete-in-wal` startup option controls whether the +collection truncate operation in a cluster can use RangeDelete operations in +RocksDB. Using RangeDeletes is fast and reduces the algorithmic complexity of +the truncate operation to O(1), compared to O(n) when this option is turned off +(with n being the number of documents in the collection/shard). + +Previous versions of ArangoDB used RangeDeletes only on a single server, but +never in a cluster. + +The default value for this startup option is `true`, and the option should only +be changed in case of emergency. This option is only honored in the cluster. +Single server and Active Failover deployments use RangeDeletes regardless of the +value of this option. + +Note that it is not guaranteed that all truncate operations use a RangeDelete +operation. For collections containing a low number of documents, the O(n) +truncate method may still be used. + +### RocksDB periodic compaction TTL + +<small>Introduced in: v3.9.3</small> + +A `--rocksdb.periodic-compaction-ttl` startup option has been added to control +the time-to-live (in seconds) for periodic compaction of .sst files in RocksDB, +based on the .sst file age. + +The default value from RocksDB is ~30 days. You can set the option to `0` to +avoid periodic auto-compaction. + +### Option for file copying method on Linux + +<small>Introduced in: v3.9.4</small> + +A Linux-specific `--use-splice-syscall` startup option has been added to control +whether the Linux-specific `splice()` syscall should be used for copying file +contents. Set it to `false` to use a less efficient, but more portable user-space +file copying method, which should work on all file systems. + +See [ArangoDB Server Options](../../components/arangodb-server/options.md#--use-splice-syscall) +for details. + +### AQL query logging + +<small>Introduced in: v3.9.5</small> + +There are three new startup options to configure how AQL queries are logged: + +- `--query.log-failed` for logging all failed AQL queries, to be used during + development or to catch unexpected failed queries in production (off by default) +- `--query.log-memory-usage-threshold` to define a peak memory threshold from + which on a warning is logged for AQL queries that exceed it (default: 4 GB) +- `--query.max-artifact-log-length` for controlling the length of logged query + strings and bind parameter values. Both are truncated to 4096 bytes by default. + +### ArangoSearch column cache limit + +<small>Introduced in: v3.9.5</small> + +The new `--arangosearch.columns-cache-limit` startup option lets you control how +much memory (in bytes) the [ArangoSearch column cache](#arangosearch-column-cache-enterprise-edition) +is allowed to use. + +### Cluster supervision options + +<small>Introduced in: v3.9.6</small> + +The following new options allow you to delay supervision actions for a +configurable amount of time. This is desirable in case DB-Servers are restarted +or fail and come back quickly because it gives the cluster a chance to get in +sync and fully resilient without deploying additional shard replicas and thus +without causing any data imbalance: + +- `--agency.supervision-delay-add-follower`: + The delay in supervision, before an AddFollower job is executed (in seconds). + +- `--agency.supervision-delay-failed-follower`: + The delay in supervision, before a FailedFollower job is executed (in seconds). + +<small>Introduced in: v3.9.7</small> + +A `--agency.supervision-failed-leader-adds-follower` startup option has been +added with a default of `true` (behavior as before). If you set this option to +`false`, a `FailedLeader` job does not automatically configure a new shard +follower, thereby preventing unnecessary network traffic, CPU load, and I/O load +for the case that the server comes back quickly. If the server has permanently +failed, an `AddFollower` job is created anyway eventually, as governed by the +`--agency.supervision-delay-add-follower` option. + +### Edge cache refill options + +<small>Introduced in: v3.9.6</small> + +- `--rocksdb.auto-refill-index-caches-on-modify`: Whether to automatically + (re-)fill in-memory edge cache entries on insert/update/replace operations + by default. Default: `false`. +- `--rocksdb.auto-refill-index-caches-queue-capacity`: How many changes can be + queued at most for automatically refilling the edge cache. Default: `131072`. +- `--rocksdb.auto-fill-index-caches-on-startup`: Whether to automatically fill + the in-memory edge cache with entries on server startup. Default: `false`. +- `--rocksdb.max-concurrent-index-fill-tasks`: The maximum number of index fill + tasks that can run concurrently on server startup. Default: the number of + cores divided by 8, but at least `1`. + +--- + +<small>Introduced in: v3.9.10</small> + +- `--rocksdb.auto-refill-index-caches-on-followers`: Control whether automatic + refilling of in-memory caches should happen on followers or only leaders. + The default value is `true`, i.e. refilling happens on followers, too. + +### RocksDB auto-flushing + +<small>Introduced in: v3.9.10</small> + +A new feature for automatically flushing RocksDB Write-Ahead Log (WAL) files and +in-memory column family data has been added. + +An auto-flush occurs if the number of live WAL files exceeds a certain threshold. +This ensures that WAL files are moved to the archive when there are a lot of +live WAL files present, for example, after a restart. In this case, RocksDB does +not count any previously existing WAL files when calculating the size of WAL +files and comparing its `max_total_wal_size`. Auto-flushing fixes this problem, +but may prevent WAL files from being moved to the archive quickly. + +You can configure the feature via the following new startup options: +- `--rocksdb.auto-flush-min-live-wal-files`: + The minimum number of live WAL files that triggers an auto-flush. Defaults to `10`. +- `--rocksdb.auto-flush-check-interval`: + The interval (in seconds) in which auto-flushes are executed. Defaults to `3600`. + Note that an auto-flush is only executed if the number of live WAL files + exceeds the configured threshold and the last auto-flush is longer ago than + the configured auto-flush check interval. This avoids too frequent auto-flushes. + +### Custom arguments to rclone + +<small>Introduced in: v3.9.11</small> + +The `--rclone.argument` startup option can be used to prepend custom arguments +to rclone. For example, you can enable debug logging to a separate file on +startup as follows: + +``` +arangod --rclone.argument "--log-level=DEBUG" --rclone.argument "--log-file=rclone.log" +``` + +## Overload control + +Starting with version 3.9.0, ArangoDB returns an `x-arango-queue-time-seconds` +HTTP header with all responses. This header contains the most recent request +queueing/dequeuing time (in seconds) as tracked by the server's scheduler. +This value can be used by client applications and drivers to detect server +overload and react on it. + +The arangod startup option `--http.return-queue-time-header` can be set to +`false` to suppress these headers in responses sent by arangod. + +In a cluster, the value returned in the `x-arango-queue-time-seconds` header +is the most recent queueing/dequeuing request time of the Coordinator the +request was sent to, except if the request is forwarded by the Coordinator to +another Coordinator. In that case, the value will indicate the current +queueing/dequeuing time of the forwarded-to Coordinator. + +In addition, client applications and drivers can optionally augment the +requests they send to arangod with the header `x-arango-queue-time-seconds`. +If set, the value of the header should contain the maximum server-side +queuing time (in seconds) that the client application is willing to accept. +If the header is set in an incoming request, arangod will compare the current +dequeuing time from its scheduler with the maximum queue time value contained +in the request header. If the current queueing time exceeds the value set +in the header, arangod will reject the request and return HTTP 412 +(precondition failed) with the error code 21004 (queue time violated). +In a cluster, the `x-arango-queue-time-seconds` request header will be +checked on the receiving Coordinator, before any request forwarding. + +## Support info API + +A new HTTP REST API endpoint `GET /_admin/support-info` was added for retrieving +deployment information for support purposes. The endpoint returns data about the +ArangoDB version used, the host (operating system, server ID, CPU and storage capacity, +current utilization, a few metrics) and the other servers in the deployment +(in case of active failover or cluster deployments). + +As this API may reveal sensitive data about the deployment, it can only be +accessed from inside the `_system` database. In addition, there is a policy control +startup option `--server.support-info-api` that controls if and to whom the API +is made available. This option can have the following values: + +- `disabled`: support info API is disabled. +- `jwt`: support info API can only be accessed via superuser JWT. +- `hardened` (default): if `--server.harden` is set, the support info API can only be + accessed via superuser JWT. Otherwise it can be accessed by admin users only. +- `public`: everyone with access to the `_system` database can access the support info API. + +## License Management (Enterprise Edition) + +The Enterprise Edition of ArangoDB requires a license to activate it. +ArangoDB 3.9 comes with a new license management that lets you test ArangoDB +for three hours before requiring a license key to keep the Enterprise Edition +features activated. + +There is a new JavaScript API for querying the license status and to set a +license key (typically run in _arangosh_): + +```js +db._getLicense(); +db._setLicense("<license-string>"); +``` + +There are two new REST API routes to do the same, `GET /_admin/license` and +`PUT /_admin/license`. + +See [License Management](../../operations/administration/license-management.md) and the +[License Management HTTP API](../../develop/http-api/administration.md#license). + +## Miscellaneous changes + +### Collection statuses + +The previously existing collection statuses "new born", "loading", "unloading" +and "unloaded" were removed, as they weren't actively used in arangod. + +These statuses were last relevant with the MMFiles storage engine, when it was +important to differentiate which collections were present in main memory and +which weren't. With the RocksDB storage engine, all that is automatically +handled anyway, and the mentioned statuses are not important anymore. + +The "Load" and "Unload" buttons for collections have also been removed from the +web interface. This change also obsoletes the `load()` and `unload()` calls for +collections as well as their HTTP API equivalents. The APIs will remain in place +for now for downwards-compatibility but have been changed to no-ops. +They will eventually be removed in a future version of ArangoDB. + +### Cluster-internal timeouts + +The internal timeouts for inactive cluster transactions on DB-Servers was +increased from 3 to 5 minutes. + +Previously transactions on DB-Servers could expire quickly, which led to +spurious "query ID not found" or "transaction ID not found" errors on DB +servers for multi-server queries/transactions with unbalanced access patterns +for the different participating DB-Servers. + +Transaction timeouts on Coordinators remain unchanged, so any queries/transactions +that are abandoned will be aborted there, which will also be propagated to +DB-Servers. + +### Deployment mode "leader-follower" no longer supported + +The Leader/Follower deployment mode in which two single servers were +set up as a leader and follower pair (without any kind of automatic +failover) was deprecated and removed from the documentation. + +Recommended alternatives are the Active Failover deployment option and the OneShard feature in a cluster. + +### Traffic accounting metrics + +<small>Introduced in: v3.8.9, v3.9.6</small> + +The following metrics for traffic accounting have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_client_user_connection_statistics_bytes_received` | Bytes received for requests, only user traffic. | +| `arangodb_client_user_connection_statistics_bytes_sent` | Bytes sent for responses, only user traffic. +| `arangodb_http1_connections_total` | Total number of HTTP/1.1 connections accepted. | + +### I/O heartbeat + +<small>Introduced in: v3.8.7, v3.9.2</small> + +An I/O heartbeat has been added which checks that the underlying volume is +writable with reasonable performance. The test is done every 15 seconds and can +be switched off. + +Use the accompanying new metrics to check for test failures: + +| Label | Description | +|:------|:------------| +| `arangodb_ioheartbeat_delays_total` | Total number of delayed I/O heartbeats. | +| `arangodb_ioheartbeat_duration` | Histogram of execution times in microseconds. | +| `arangodb_ioheartbeat_failures_total` | Total number of failures. | + +These metrics are only populated if the new `--database.io-heartbeat` startup +option is set to `true` (which is the default). + +### Lock stripes option for RocksDB transactions + +<small>Introduced in: v3.9.2</small> + +The new `--rocksdb.transaction-lock-stripes` option controls the number of lock +stripes to use for RocksDB's transaction lock manager. Higher values can be used +to reduce a potential contention in the lock manager. + +The option defaults to the number of available cores, but is increased to a +value of `16` if the number of cores is lower. + +### Configurable `CACHE_OBLIVIOUS` option for jemalloc + +<small>Introduced in: v3.9.7</small> + +The jemalloc memory allocator supports an option to toggle cache-oblivious large +allocation alignment. It is enabled by default, but disabling it helps to save +4096 bytes of memory for every allocation which is at least 16384 bytes large. +This is particularly beneficial for the RocksDB buffer cache. + +You can now configure the option by setting a `CACHE_OBLIVIOUS` environment +variable to the string `true` or `false` before starting ArangoDB. + +See [ArangoDB Server environment variables](../../components/arangodb-server/environment-variables.md) +for details. + +### WAL file tracking metrics + +<small>Introduced in: v3.9.10</small> + +The following metrics for write-ahead log (WAL) file tracking have been added: + +| Label | Description | +|:------|:------------| +| `rocksdb_live_wal_files` | Number of live RocksDB WAL files. | +| `rocksdb_wal_released_tick_flush` | Lower bound sequence number from which WAL files need to be kept because of external flushing needs. | +| `rocksdb_wal_released_tick_replication` | Lower bound sequence number from which WAL files need to be kept because of replication. | +| `arangodb_flush_subscriptions` | Number of currently active flush subscriptions. | + +### Sending delay metrics for internal requests + +<small>Introduced in: v3.9.11</small> + +The following metrics for diagnosing delays in cluster-internal network requests +have been added: + +| Label | Description | +|:------|:------------| +| `arangodb_network_dequeue_duration` | Internal request duration for the dequeue in seconds. | +| `arangodb_network_response_duration` | Internal request duration from fully sent till response received in seconds. | +| `arangodb_network_send_duration` | Internal request send duration in seconds. | +| `arangodb_network_unfinished_sends_total` | Number of internal requests for which sending has not finished. | + +## Client tools + +### Increased default number of threads + +The default value for the `--threads` startup parameter was changed from +2 to the maximum of 2 and the number of available CPU cores for the following +client tools: + +- arangodump +- arangoimport +- arangorestore + +The `--threads` option works dynamically, its value depends on the number of available CPU cores. If the amount of available CPU cores is less than `3`, a threads value of `2` is used. Otherwise the value of threads is set to the number of available CPU cores. + +This change can help to improve performance of imports, dumps or restore +processes on machines with multiple cores in case the `--threads` parameter +was not previously used. As a trade-off, the change may lead to an increased +load on servers, so any scripted imports, dumps or restore processes that +want to keep the server load under control should set the number of client +threads explicitly when invoking any of the above client tools. + +### arangoimport + +_arangoimport_ received a new startup option `--merge-attributes` that allows +you to create additional attributes in CSV/TSV imports based on other attribute +values and hard-coded string literals/separators. + +The following example would add a new attribute named `fullName` that consists +of the values of the `firstName` and `lastName` columns, separated by a colon +character `:`, as well as as an additional attribute `nameAndId` that builds on +the new `fullName` attribute and concatenates it with a hyphen `-` and the value +of the `id` column: + +``` +arangoimport \ + --merge-attributes fullName=[firstName]:[lastName] \ + --merge-attributes nameAndId=[fullName]-[id] \ + ... +``` + +Also see [Merging Attributes](../../components/tools/arangoimport/examples-csv.md#merging-attributes). + +_arangoimport_ also provides a new `--datatype` startup option, in order to fix +the datatypes for certain attributes in CSV/TSV imports. For example, in the +following CSV input file, it is unclear if the numeric values should be +imported as numbers or as stringified numbers for the individual attributes: + +``` +key,price,weight,fk +123456,200,5,585852 +864924,120,10,9998242 +9949,70,11.5,499494 +6939926,2130,5,96962612 +``` + +To determine the datatypes for the individual columns, _arangoimport_ can be +invoked with the `--datatype` startup option, once for each attribute: + +``` +--datatype key=string +--datatype price=number +--datatype weight=number +--datatype fk=string +``` + +This will turn the numeric-looking values in the `key` attribute into strings +but treat the attributes `price` and `weight` as numbers. Finally, the values in +attribute `fk` will be treated as strings again. + +See [Overriding data types per attribute](../../components/tools/arangoimport/examples-csv.md#overriding-data-types-per-attribute). + +### arangobench + +Histogram is now switched off by default (the `--histogram.generate` flag set to false). To display it, set the flag to true. +If this option is disabled, but other histogram flags are addressed, e.g. `--histogram.interval-size 500`, everything will still run normally, but a warning message will be displayed saying that the histogram is switched off and using that flag has no effect. + +_arangobench_ now prints a short description of the test case started, so +it is easier to figure out what operations are carried out by a test case. +Several test cases in arangobench have been deprecated because they do not +target real world use cases but were rather writing for some internal testing. +The deprecated test cases will be removed in a future version to clear up +the list of test cases. + +_arangobench_ now supports multiple Coordinators. The flag `--server.endpoint` +can be specified multiple times, as in the example below: + +``` +arangobench \ + --server.endpoint tcp://[::1]::8529 \ + --server.endpoint tcp://[::1]::8530 \ + --server.endpoint tcp://[::1]::8531 \ + ... +``` + +This does not compromise the use of the other client tools, that preserve +the behavior of having one Coordinator and one endpoint. + +Also see [_arangobench_ Options](../../components/tools/arangobench/_index.md#general-configuration) + +### arangodump + +_arangodump_ now supports multiple Coordinators. The flag `--server.endpoint` +can be used multiple times, as in the example below: + +``` +arangodump \ + --server.endpoint tcp://[::1]::8529 \ + --server.endpoint tcp://[::1]::8530 \ + --server.endpoint tcp://[::1]::8531 \ + ... +``` + +This does not compromise the use of the other client tools that preserve +the behavior of having one Coordinator and one endpoint. + +Also see [_arangodump_ examples](../../components/tools/arangodump/examples.md) + +### arangorestore + +_arangorestore_ now supports multiple Coordinators. The flag `--server.endpoint` +can be used multiple times, as in the example below: + +``` +arangorestore \ + --server.endpoint tcp://[::1]::8529 \ + --server.endpoint tcp://[::1]::8530 \ + --server.endpoint tcp://[::1]::8531 \ + ... +``` + +This does not compromise the use of the other client tools that preserve +the behavior of having one Coordinator and one endpoint. + +--- + +<small>Introduced in: v3.8.7, v3.9.2</small> + +A new `--enable-revision-trees` option has been added to _arangorestore_, which +adds the `syncByRevision` and `usesRevisionsAsDocumentIds` attributes to the +collection structure if they are missing. As a consequence, these collections +created by arangorestore are able to use revision trees and a faster +getting-in-sync procedure after a restart. + +The option defaults to `true`, meaning that the attributes are added if they are +missing. If you set the option to `false`, the attributes are not added to the +collection structure. If the attributes are already present in the dump data, they +are not modified by arangorestore, irrespective of the setting of this option. + +Also see [_arangorestore_ examples](../../components/tools/arangorestore/examples.md). + +### arangovpack + +The _arangovpack_ utility supports more input and output formats (JSON and +VelocyPack, plain or hex-encoded). The former options `--json` and `--pretty` +have been removed and have been replaced with separate options for specifying +the input and output types: + +- `--input-type` (`json`, `json-hex`, `vpack`, `vpack-hex`) +- `--output-type` (`json`, `json-pretty`, `vpack`, `vpack-hex`) + +The former option `--print-non-json` has been replaced with the new option +`--fail-on-non-json` which makes [arangovpack](../../components/tools/arangovpack/_index.md) +fail when trying to emit non-JSON types to JSON output. + +## Internal changes + +The compiler version used to build the ArangoDB Linux executables has been +upgraded from g++ 9.3.0 to g++ 10.2.1. +g++ 10 is also the expected version of g++ when compiling ArangoDB from +source. + +The bundled version of the Snappy compression library has been upgraded from +version 1.1.8 to version 1.1.9. + +The bundled version of the RocksDB library has been upgraded from 6.8 to 6.27. + +For ArangoDB 3.9, the bundled version of rclone is 1.51.0. + +The minimum architecture requirements have been raised from the Westmere +architecture to the Sandy Bridge architecture. 256-bit AVX instructions are +now expected to be present on all targets that run ArangoDB 3.9 executables. +If a target does not support AVX instructions, it may fail with SIGILL at +runtime. diff --git a/site/data/oem/allMetrics.yaml b/site/data/oem/allMetrics.yaml new file mode 100644 index 0000000000..c26e8664f4 --- /dev/null +++ b/site/data/oem/allMetrics.yaml @@ -0,0 +1,7073 @@ +- name: arangodb_agency_append_hist + introducedIn: "3.7.1" + help: | + Agency RAFT follower append time histogram. + unit: ms + type: histogram + category: Agency + complexity: medium + exposedBy: + - agent + description: | + This measures the time an Agency follower needs for individual + append operations resulting from `AppendEntriesRPC` requests. + Every event contributes a measurement to the histogram, which + also exposes the number of events and the total sum of all + measurements. + threshold: | + Normally these times should be clearly sub-second. + troubleshoot: | + If you see delays here, the Agents might not have enough IO bandwidth + or might be overloaded. Try to provision more IOPS or more CPU capacity, + potentially moving Agents to separate machines. + +- name: arangodb_agency_cache_callback_number + renamedFrom: arangodb_agency_cache_callback_count + introducedIn: "3.8.0" + help: | + Current number of entries in Agency cache callbacks table. + unit: number + type: gauge + category: Agency + complexity: advanced + exposedBy: + - dbserver + - coordinator + - single + description: | + This reflects the current number of callbacks the local `AgencyCache` + has registered. + This metric was named `arangodb_agency_cache_callback_count` in + previous versions of ArangoDB. + Note that on single servers this metric only has a non-zero value + in the Active Failover deployment mode. + threshold: | + This number is usually very low, something between `10` and `20`. + troubleshoot: | + If this number is considerably higher, this should be investigated. + Please contact support. + +- name: arangodb_agency_callback_number + renamedFrom: arangodb_agency_callback_count + introducedIn: "3.8.0" + help: | + Current number of Agency callbacks registered. + unit: number + type: gauge + category: Agency + complexity: advanced + exposedBy: + - coordinator + - dbserver + - single + description: | + This metric reflects the current number of Agency callbacks being + registered, including Agency cache callbacks. + This metric was named `arangodb_agency_callback_count` in previous versions + of ArangoDB. + Note that on single servers this metric only has a non-zero value + in the Active Failover deployment mode. + threshold: | + This number is usually low, between `10` or `20`. It can temporarily + increase while there are ongoing DDL operations in the cluster. The + number should go down again once the DDL operations have finished. + troubleshoot: | + If this number is considerably higher, this should be investigated. + Please contact support. + +- name: arangodb_agency_callback_registered_total + renamedFrom: arangodb_agency_callback_registered + introducedIn: "3.8.0" + help: | + Total number of Agency callbacks ever registered. + unit: number + type: counter + category: Agency + complexity: advanced + exposedBy: + - coordinator + - dbserver + - single + description: | + This metric was named `arangodb_agency_callback_registered` in previous versions + of ArangoDB. + Note that on single servers this metric only has a non-zero value + in the Active Failover deployment mode. + +- name: arangodb_agency_client_lookup_table_size + introducedIn: "3.6.11" + help: | + Current number of entries in Agency client id lookup table. + unit: number + type: gauge + category: Agency + complexity: advanced + exposedBy: + - agent + description: | + Current number of entries in Agency client id lookup table. + The lookup table is used internally for Agency inquire operations + and should be compacted at the same time when the Agency's in-memory + log is compacted. + +- name: arangodb_agency_commit_hist + introducedIn: "3.7.1" + help: | + Agency RAFT commit histogram. + unit: ms + type: histogram + category: Agency + complexity: medium + exposedBy: + - agent + description: | + Agency RAFT commit time histogram. Provides a distribution + of commit times for all Agency write operations. + +- name: arangodb_agency_compaction_hist + introducedIn: "3.7.1" + help: | + Agency compaction time histogram. + unit: ms + type: histogram + category: Agency + complexity: medium + exposedBy: + - agent + description: | + Agency compaction time histogram. Provides a distribution + of Agency compaction run times. Compactions are triggered after + `--agency.compaction-keep-size` entries have accumulated in the + RAFT log. + troubleshoot: | + If compaction takes too long, it may be useful to reduce the number + of log entries to keep in `--agency.compaction-keep-size`. + +- name: arangodb_agency_local_commit_index + introducedIn: "3.7.1" + help: | + This Agent's commit index. + unit: number + type: gauge + category: Agency + complexity: simple + exposedBy: + - agent + description: | + This Agent's commit index (i.e. the index until it has advanced in + the Agency's RAFT protocol). + +- name: arangodb_agency_log_size_bytes + introducedIn: "3.6.9" + help: | + Agency replicated log size. + unit: bytes + type: gauge + category: Agency + complexity: simple + exposedBy: + - agent + description: | + Size of the Agency's in-memory part of replicated log in bytes. + The replicated log grows in memory until a certain number of + log entries have been accumulated. Then the in-memory log is + compacted. The number of in-memory log entries to keep before + log compaction kicks in can be controlled via the startup option + `--agency.compaction-keep-size`. + +- name: arangodb_agency_read_no_leader_total + renamedFrom: arangodb_agency_read_no_leader + introducedIn: "3.8.0" + help: | + Agency read operations with no leader or on followers. + unit: number + type: counter + category: Agency + complexity: simple + exposedBy: + - agent + description: | + Total number of Agency read operations with no leader or on followers. + threshold: | + This should normally not happen. If it happens regularly, the Agency + is reelecting its leader often. + troubleshoot: | + The latency of the network between the Agents might be too high or + the Agents may be overloaded. It might help to move Agent instances + to separate machines. + +- name: arangodb_agency_read_ok_total + renamedFrom: arangodb_agency_read_ok + introducedIn: "3.8.0" + help: | + Number of successful Agency read operations. + unit: number + type: counter + category: Agency + complexity: simple + exposedBy: + - agent + description: | + Number of Agency read operations which were successful (i.e. completed + without any error). Successful reads can only be executed on the leader, so + this metric is supposed to increase only on Agency leaders, but not on + followers. Read requests that are executed on followers are rejected + and can be tracked via the metric `arangodb_agency_read_no_leader_total`. + This metric was named `arangodb_agency_read_ok` in previous + versions of ArangoDB. + +- name: arangodb_agency_supervision_failed_server_total + renamedFrom: arangodb_agency_supervision_failed_server_count + introducedIn: "3.8.0" + help: | + Counter for FailedServer jobs. + unit: number + type: counter + category: Agency + complexity: medium + exposedBy: + - agent + description: | + Counter for FailedServer jobs. This counter is increased whenever a + supervision run encounters a failed server and starts a FailedServer job. + This metric was named `arangodb_agency_supervision_failed_server_count` + in previous versions of ArangoDB. + threshold: | + Many FailedServer jobs indicate frequent failures of DB-Servers. This + is generally not good. + troubleshoot: | + Find the root cause of server failures. Overload and bad network latency + can lead to misdetected server failures. + +- name: arangodb_agency_supervision_runtime_msec + introducedIn: "3.7.1" + help: | + Agency supervision runtime histogram. + unit: ms + type: histogram + category: Agency + complexity: simple + exposedBy: + - agent + description: | + Agency supervision runtime histogram. A new value is recorded for each + run of the supervision. + threshold: | + The supervision runtime goes up linearly with the number of collections + and shards. + +- name: arangodb_agency_supervision_runtime_wait_for_replication_msec + introducedIn: "3.7.1" + help: | + Agency supervision wait for replication time. + unit: ms + type: histogram + category: Agency + complexity: medium + exposedBy: + - agent + description: | + Agency supervision replication time histogram. Whenever the Agency + supervision carries out changes, it writes them to the leader's log + and replicates the changes to followers. This metric provides a histogram + of the time it took to replicate the supervision changes to followers. + +- name: arangodb_agency_term + introducedIn: "3.7.1" + help: | + Agency's term. + unit: number + type: gauge + category: Agency + complexity: medium + exposedBy: + - agent + description: | + The Agency's current term. + threshold: | + This number should usually not grow. If it does, the Agency is doing + repeated reelections, which suggests overload or bad network latency + between Agents. + troubleshoot: | + It might help to reduce network latency between Agents or move Agent + instances to separate machines. + +- name: arangodb_agency_write_hist + introducedIn: "3.7.1" + help: | + Agency write time histogram. + unit: ms + type: histogram + category: Agency + complexity: medium + exposedBy: + - agent + description: | + Agency write time histogram. This histogram provides the distribution + of the times spent in Agency write operations, in milliseconds. This only + includes the time required to write the data into the leader's log, but + does not include the time required to replicate the writes to the followers. + +- name: arangodb_agency_write_no_leader_total + renamedFrom: arangodb_agency_write_no_leader + introducedIn: "3.8.0" + help: | + Agency write operations with no leader or on followers. + unit: number + type: counter + category: Agency + complexity: medium + exposedBy: + - agent + description: | + Total number of Agency write operations with no leader or on followers. + threshold: | + This should normally not happen. If it happens regularly, the Agency + is reelecting its leader often. + troubleshoot: | + The latency of the network between the Agents might be too high or + the Agents may be overloaded. It might help to move Agent instances + to separate machines. + +- name: arangodb_agency_write_ok_total + renamedFrom: arangodb_agency_write_ok + introducedIn: "3.8.0" + help: | + Number of successful Agency write operations. + unit: number + type: counter + category: Agency + complexity: simple + exposedBy: + - agent + description: | + Number of Agency write operations which were successful (i.e. completed + without any error). Successful writes can only be executed on the leader, so + this metric is supposed to increase only on Agency leaders, but not on + followers. Write requests that are executed on followers are rejected + and can be tracked via the metric `arangodb_agency_write_no_leader_total`. + This metric was named `arangodb_agency_write_ok` in previous + versions of ArangoDB. + +- name: arangodb_agencycomm_request_time_msec + introducedIn: "3.7.1" + help: | + Request time for Agency requests. + unit: ms + type: histogram + category: Network + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + This histogram shows how long requests to the Agency took. + threshold: | + Usually, such requests should be relatively quick, mostly clearly + sub-second. + troubleshoot: | + If the network or the Agents are overloaded, it can help to move + Agent instances to separate machines. + +- name: arangodb_aql_all_query_total + renamedFrom: arangodb_aql_all_query + introducedIn: "3.8.0" + help: | + Total number of AQL queries finished. + unit: number + type: counter + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of AQL queries finished. + This metric was named `arangodb_aql_all_query` in previous + versions of ArangoDB. + +- name: arangodb_aql_current_query + introducedIn: "3.8.0" + help: | + Current number of AQL queries executing. + unit: number + type: gauge + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Current number of AQL queries executing. + +- name: arangodb_aql_global_memory_limit + introducedIn: "3.8.0" + help: | + Total memory limit for all AQL queries combined. + unit: bytes + type: gauge + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total memory limit for all AQL queries combined, in bytes. + If this value is reported as `0`, it means there is no total memory + limit in place for AQL queries. The value can be adjusted by the setting + the `--query.global-memory-limit` startup option. + +- name: arangodb_aql_global_memory_usage + introducedIn: "3.8.0" + help: | + Total memory usage of all AQL queries executing; granularity: 32768 bytes steps. + unit: bytes + type: gauge + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total memory usage of all AQL queries currently executing. + The granularity of this metric is steps of 32768 bytes. The current + memory usage of all AQL queries is compared against the configured + limit in the `--query.global-memory-limit` startup option. + If the startup option has a value of `0`, then no global memory limit + are enforced. If the startup option has a non-zero value, queries + are aborted once the total query memory usage goes above the configured + limit. + +- name: arangodb_aql_global_query_memory_limit_reached_total + introducedIn: "3.8.0" + help: | + Number of times the global query memory limit threshold was reached. + unit: number + type: counter + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of times the global query memory limit threshold was reached. + This can happen if all running AQL queries in total try to use more memory than + configured via the `--query.global-memory-limit` startup option. + Every time this counter increases, an AQL query aborted with a + "resource limit exceeded" error. + +- name: arangodb_aql_local_query_memory_limit_reached_total + introducedIn: "3.8.0" + help: | + Number of times a local query memory limit threshold was reached. + unit: number + type: counter + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of times a local query memory limit threshold was reached, i.e. + a single query tried to allocate more memory than configured in the query's + `memoryLimit` attribute or the value configured via the startup option + `--query.memory-limit`. + Every time this counter increases, an AQL query aborted with a + "resource limit exceeded" error. + +- name: arangodb_aql_query_time + introducedIn: "3.6.10" + help: | + Execution time histogram for all AQL queries. + unit: s + type: histogram + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Execution time histogram for all AQL queries, in seconds. + The histogram includes all slow queries. + +- name: arangodb_aql_slow_query_time + introducedIn: "3.6.10" + help: | + Execution time histogram for slow AQL queries. + unit: s + type: histogram + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Execution time histogram for slow AQL queries, in seconds. + Queries are considered "slow" if their execution time is above the + threshold configured in the startup options `--query.slow-threshold` + or `--query.slow-streaming-threshold`, respectively. + +- name: arangodb_aql_total_query_time_msec_total + renamedFrom: arangodb_aql_total_query_time_msec + introducedIn: "3.8.0" + help: | + Total execution time of all AQL queries. + unit: ms + type: counter + category: AQL + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total execution time of all AQL queries, in milliseconds, + including all slow queries. + +- name: arangodb_client_connection_statistics_bytes_received + introducedIn: "3.8.0" + help: | + Bytes received for requests. + unit: bytes + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the received request sizes in bytes. + +- name: arangodb_client_connection_statistics_bytes_sent + introducedIn: "3.8.0" + help: | + Bytes sent for responses. + unit: bytes + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the sent response sizes in bytes + +- name: arangodb_client_connection_statistics_client_connections + introducedIn: "3.6.1" + help: | + The number of client connections that are currently open. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of client connections that are currently open. + Note: this metric considers only HTTP and HTTP/2 connections, but not VST + connections. + +- name: arangodb_client_connection_statistics_connection_time + introducedIn: "3.8.0" + help: | + Total connection time of a client. + unit: s + type: histogram + category: Statistics + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the connection's total lifetime, i.e., the time between the + point when the connection was established until it was closed. Smaller + numbers indicate that there is not a lot of load and/or that connections + are not reused for multiple requests. Consider using keep-alive header + or HTTP/2 or VST. + +- name: arangodb_client_connection_statistics_io_time + introducedIn: "3.8.0" + help: | + I/O time needed to answer a request. + unit: number + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of I/O times needed to answer a request. This includes the time + required to read the incoming request as well as the time required to send + the response. + +- name: arangodb_client_connection_statistics_queue_time + introducedIn: "3.8.0" + help: | + Queueing time needed for requests. + unit: s + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the time requests are spending on a queue waiting to be + processed. The overwhelming majority of these times should be clearly + sub-second. + +- name: arangodb_client_connection_statistics_request_time + introducedIn: "3.8.0" + help: | + Request time needed to answer a request. + unit: s + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the time required to actually process a request. This does not + include the time required to read the incoming request, the time the request + is sitting on the queue, or the time required to send the response. + +- name: arangodb_client_connection_statistics_total_time + introducedIn: "3.8.0" + help: | + Total time needed to answer a request. + unit: s + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the total times required to process a request. This includes + the time required to read the incoming request, the time the request is + sitting in the queue, the time to actually process the request, and the + time required to send the response. + +- name: arangodb_client_user_connection_statistics_bytes_received + introducedIn: "3.10.2" + help: | + Bytes received for requests, only user traffic. + unit: bytes + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the received request sizes in bytes, only considering user + traffic, i.e. traffic authenticated with a real user (or role). + +- name: arangodb_client_user_connection_statistics_bytes_sent + introducedIn: "3.10.2" + help: | + Bytes sent for responses, only user traffic. + unit: bytes + type: histogram + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the sent response sizes in bytes, only user traffic, i.e. + traffic that has been authenticated with a real user (or role). + +- name: arangodb_collection_leader_reads_total + introducedIn: "3.11.7" + help: | + Number of read operation requests on leaders. + unit: number + type: counter + category: Transactions + complexity: advanced + exposedBy: + - dbserver + description: | + This metric exposes the number of per-shard read operation requests on DB-Servers. + It is increased by AQL queries and single-/multi-document read operations. + + An AQL query increases the counter exactly once for a shard that is involved + in the query in read-only mode, regardless if and how many documents/edges the + query actually reads from the shard. For shards that are accessed by an AQL query + in read/write mode, only the write counter is increased. + + For every single- or multi-document read operation, the counter is + increased exactly once for each shard that is affected by the operation, even + if multiple documents are read from the same shard. + + This metric is not exposed by default. It is only present if the startup option + `--server.export-shard-usage-metrics` is set to either `enabled-per-shard` or + `enabled-per-shard-per-user`. With the former setting, the metric has different + labels for each shard that was read from. With the latter setting, the metric + has different labels for each combination of shard and user that accessed the shard. + The metric is only exposed on DB servers and not on Coordinators or single servers. + + Note that internal operations, such as internal queries executed for statistics + gathering, internal garbage collection, and TTL index cleanup are not counted in + these metrics. Additionally, all requests that use the superuser JWT for + authentication and that do not have a specific user set, are not counted. + Requests are also only counted if they have an ArangoDB user associated with them, + so that the cluster must also be running with authentication turned on. + +- name: arangodb_collection_leader_writes_total + introducedIn: "3.11.7" + help: | + Number of write operation requests on leaders. + unit: number + type: counter + category: Transactions + complexity: advanced + exposedBy: + - dbserver + description: | + This metric exposes the number of per-shard write operation requests on DB-Servers. + It is increased by AQL queries and single-/multi-document write operations. + + An AQL query increases the counter exactly once for a shard that is involved + in the query in write-only or read-write mode, regardless if and how many + documents/edges are inserted or modified in the shard. + + For every single- or multi-document write operation, the counter is + increased exactly once for each shard that is affected by the operation, even + if multiple documents are inserted, modified, or removed from the same shard. + + For collection truncate operations, the counter is also increased exactly once for + each shard affected by the truncate. + + This metric is not exposed by default. It is only present if the startup option + `--server.export-shard-usage-metrics` is set to either `enabled-per-shard` or + `enabled-per-shard-per-user`. With the former setting, the metric has different + labels for each shard that was read from. With the latter setting, the metric + has different labels for each combination of shard and user that accessed the shard. + The metric is only exposed on DB servers and not on Coordinators or single servers. + + Note that internal operations, such as internal queries executed for statistics + gathering, internal garbage collection, and TTL index cleanup are not counted in + these metrics. Additionally, all requests that use the superuser JWT for + authentication and that do not have a specific user set, are not counted. + Requests are also only counted if they have an ArangoDB user associated with them, + so that the cluster must also be running with authentication turned on. + +- name: arangodb_collection_lock_acquisition_micros_total + renamedFrom: arangodb_collection_lock_acquisition_micros + introducedIn: "3.8.0" + help: | + Total amount of collection lock acquisition time. + unit: us + type: counter + category: Transactions + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + Total amount of time it took to acquire collection/shard locks for + write operations, summed up for all collections/shards. Does not increase + for any read operations. + The value is measured in microseconds. + troubleshoot: | + In case this value is considered too high, check if there are AQL queries + or transactions that use exclusive locks on collections, and try to reduce them. + Operations using exclusive locks may lock out other queries/transactions temporarily, + which leads to an increase in lock acquisition time. + +- name: arangodb_collection_lock_acquisition_time + introducedIn: "3.6.11" + help: | + Collection lock acquisition time histogram. + unit: s + type: histogram + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + Histogram of the collection/shard lock acquisition times. Locks are acquired for + all write operations, but not for read operations. + The values here are measured in seconds. + troubleshoot: | + In case these values are considered too high, check if there are AQL queries + or transactions that use exclusive locks on collections, and try to reduce them. + Operations using exclusive locks may lock out other queries/transactions temporarily, + which leads to an increase in lock acquisition times. + +- name: arangodb_collection_lock_sequential_mode_total + renamedFrom: arangodb_collection_lock_sequential_mode + introducedIn: "3.8.0" + help: | + Number of transactions using sequential locking of collections to avoid deadlocking. + unit: number + type: counter + category: Transactions + complexity: advanced + exposedBy: + - coordinator + description: | + Number of transactions using sequential locking of collections to avoid deadlocking. + By default, a Coordinator tries to lock all shards of a collection in parallel. + This approach is normally fast but can cause deadlocks with other transactions that + lock the same shards in a different order. In case such a deadlock is detected, the + Coordinator aborts the lock round and starts a new one that locks all shards in + sequential order. This avoids deadlocks, but has a higher setup overhead. + troubleshoot: | + In case this value is increasing, check if there are AQL queries or transactions that + use exclusive locks on collections, and try to reduce them. + Operations using exclusive locks may lock out other queries/transactions temporarily, + which can lead to (temporary) deadlocks in case the queries/transactions + are run on multiple shards on different servers. + +- name: arangodb_collection_lock_timeouts_exclusive_total + renamedFrom: arangodb_collection_lock_timeouts_exclusive + introducedIn: "3.8.0" + help: | + Number of timeouts when trying to acquire collection exclusive locks. + unit: number + type: counter + category: Transactions + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + Number of timeouts when trying to acquire collection exclusive locks. + This counter increases whenever an exclusive collection lock + cannot be acquired within the configured lock timeout. + troubleshoot: | + In case this value is considered too high, check if there are AQL queries + or transactions that use exclusive locks on collections, and try to reduce them. + Operations using exclusive locks may lock out other queries/transactions temporarily, + which can lead to other operations running into timeouts waiting for the same locks. + +- name: arangodb_collection_lock_timeouts_write_total + renamedFrom: arangodb_collection_lock_timeouts_write + introducedIn: "3.8.0" + help: | + Number of timeouts when trying to acquire collection write locks. + unit: number + type: counter + category: Transactions + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + Number of timeouts when trying to acquire collection write locks. + This counter increases whenever a collection write lock + cannot be acquired within the configured lock timeout. + This can only happen if writes on a collection are locked out by + other operations on the collection that use an exclusive lock. Writes + are not locked out by other, non-exclusively locked writes. + troubleshoot: | + In case this value is considered too high, check if there are AQL queries + or transactions that use exclusive locks on collections, and try to reduce them. + Operations using exclusive locks may lock out other queries/transactions temporarily, + which can lead to other operations running into timeouts waiting for the same locks. + +- name: arangodb_collection_requests_bytes_read_total + introducedIn: "3.11.7" + help: | + Number of bytes read in read requests on DB-Servers. + unit: number + type: counter + category: Transactions + complexity: advanced + exposedBy: + - dbserver + description: | + This metric exposes the per-shard number of bytes read by read operation + requests on DB-Servers. + It is increased by AQL queries that read documents or edges and for single- + or multi-document read operations. + The metric is normally increased only on the leader, but it can also increase + on followers if "reads from followers" are enabled. + + For every read operation, the metric is increased by the approximate + number of bytes read to retrieve the underlying document or edge data. This + is also true if a document or edge is served from an in-memory cache. + If an operation reads multiple documents/edges, it increases the counter + multiple times, each time with the approximate number of bytes read for the + particular document/edge. + + The numbers reported by this metric normally relate to the cumulated sizes of + documents/edges read. + The metric is also increased for transactions that are started but later + aborted. However, metrics updates may be buffered until the end of a transaction. + Note that the metric is not increased for secondary index point lookups or + scans, or for scans in a collection that iterate over documents but do not + read them. + + This metric is not exposed by default. It is only present if the startup option + `--server.export-shard-usage-metrics` is set to either `enabled-per-shard` or + `enabled-per-shard-per-user`. With the former setting, the metric has different + labels for each shard that was read from. With the latter setting, the metric + has different labels for each combination of shard and user that accessed the shard. + The metric is only exposed on DB servers and not on Coordinators or single servers. + + Note that internal operations, such as internal queries executed for statistics + gathering, internal garbage collection, and TTL index cleanup are not counted in + these metrics. Additionally, all requests that use the superuser JWT for + authentication and that do not have a specific user set, are not counted. + Requests are also only counted if they have an ArangoDB user associated with them, + so that the cluster must also be running with authentication turned on. + + Enabling this metric via the startup option will likely result in a small + latency overhead of few percent for read operations. The exact overhead depends on + several factors, such as the type of operation (single or multi-document operation), + replication factor, network latency etc. + +- name: arangodb_collection_requests_bytes_written_total + introducedIn: "3.11.7" + help: | + Number of bytes written in write requests on DB-Servers. + unit: number + type: counter + category: Transactions + complexity: advanced + exposedBy: + - dbserver + description: | + This metric exposes the per-shard number of bytes written by write operation + requests on DB-Servers, on both leaders and followers. + It is increased by AQL queries and single-/multi-document write operations. + The metric is first increased only the leader. With traditional replication, + the metric is also increased on followers for every replication request that + the leader make to the followers. With the new replication protocol + ("replication2"), the metric is not increased on followers. + + For every write operation, the metric is increased by the approximate + number of bytes written for the document or edge in question. + If an operation writes multiple documents/edges, it increases the counter + multiple times, each time with the approximate number of bytes written for the + particular document/edge. + + An AQL query also increases the counter for every document or edge written, + each time with the approximate number of bytes written for document/edge. + + The numbers reported by this metric normally relate to the cumulated sizes of + documents/edges written. For remove operations, however, only a fixed number of + bytes is counted per removed document/edge. For truncate operations, the metrics + will be affected differently depending on how the truncate is executed internally. + For truncates on smaller shards, the truncate operation will be executed as the + removal of the individual documents in the shard. Thus the metric will also be + increased as if the documents were removed individually. Truncate operations on + larger shards however will be executed via a special operation in the storage + engine, which marks a whole range of documents as removed, but defers the actual + removal until much later (compaction process). If a truncate is executed like + this, the metric will not be increased at all. + Writes into secondary indexes are not counted at all. + The metric is also increased for transactions that are started but later aborted. + However, metrics updates may be buffered until the end of a transaction. + + This metric is not exposed by default. It is only present if the startup option + `--server.export-shard-usage-metrics` is set to either `enabled-per-shard` or + `enabled-per-shard-per-user`. With the former setting, the metric has different + labels for each shard that was read from. With the latter setting, the metric + has different labels for each combination of shard and user that accessed the shard. + The metric is only exposed on DB servers and not on Coordinators or single servers. + + Note that internal operations, such as internal queries executed for statistics + gathering, internal garbage collection, and TTL index cleanup are not counted in + these metrics. Additionally, all requests that use the superuser JWT for + authentication and that do not have a specific user set, are not counted. + Requests are also only counted if they have an ArangoDB user associated with them, + so that the cluster must also be running with authentication turned on. + + Enabling this metric via the startup option will likely result in a small + latency overhead of few percent for write operations. The exact overhead depends on + several factors, such as the type of operation (single or multi-document operation), + replication factor, network latency etc. + +- name: arangodb_collection_truncate_time + introducedIn: "3.8.0" + help: | + Total time spent in collection truncate operations. + unit: s + type: histogram + category: Transactions + complexity: simple + exposedBy: + - dbserver + - agent + - single + description: | + Total time spent in collection truncate operations, including both + user-initiated truncate operations and truncate operations + executed by the synchronous replication on followers. + Note that this metric is only present when the command + line option `--server.export-read-write-metrics` is set to `true`. + +- name: arangodb_collection_truncates_replication_total + renamedFrom: arangodb_collection_truncates_replication + introducedIn: "3.8.0" + help: | + Total number of collection truncate operations by synchronous replication. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + Total number of collection truncate operations by synchronous + replication on followers. Note that this metric is only present when the command + line option `--server.export-read-write-metrics` is set to `true`. + +- name: arangodb_collection_truncates_total + renamedFrom: arangodb_collection_truncates + introducedIn: "3.8.0" + help: | + Total number of collection truncate operations (excluding synchronous replication). + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - agent + - dbserver + - single + description: | + Total number of collection truncate operations on leaders (excluding synchronous + replication). Note that this metric is only present when the command + line option `--server.export-read-write-metrics` is set to `true`. + +- name: arangodb_connection_pool_connections_created_total + renamedFrom: arangodb_connection_pool_connections_created + introducedIn: "3.8.0" + help: | + Total number of connections created for connection pool. + unit: number + type: counter + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + Total number of connections created for connection pool. There are + two pools, one for the Agency communication with label `AgencyComm` + and one for the other cluster internal communication with label + `ClusterComm`. + threshold: | + Because of idle timeouts, the total number of connections ever created + grows. However, under high load, most connections should usually + be reused and a fast growth of this number can indicate underlying + connectivity issues. + +- name: arangodb_connection_pool_connections_current + renamedFrom: arangodb_connection_connections_current + introducedIn: "3.8.0" + help: | + Current number of connections in pool. + unit: number + type: gauge + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + Current number of connections in pool. There are two pools, one for the + Agency communication with label `AgencyComm` and one for the other + cluster internal communication with label `ClusterComm`. + threshold: | + Normally, one should not see an excessive amount of open connections + here, unless a very high amount of operations happens concurrently. + +- name: arangodb_connection_pool_lease_time_hist + introducedIn: "3.8.0" + help: | + Time to lease a connection from the connection pool. + unit: ms + type: histogram + category: Connectivity + complexity: simple + exposedBy: + - coordinator + - dbserver + description: | + Time to lease a connection from the connection pool. There are two pools, + one for the Agency communication with label `AgencyComm` and one for + the other cluster internal communication with label `ClusterComm`. + threshold: | + Leasing connections from the pool should be fast, unless a new connection + has to be formed, which can easily take (in particular with TLS) several + milliseconds. If times are a lot higher, then some underlying network + problem might be there. + +- name: arangodb_connection_pool_leases_failed_total + renamedFrom: arangodb_connection_pool_leases_failed + introducedIn: "3.8.0" + help: | + Total number of failed connection leases. + unit: number + type: counter + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + Total number of failed connection leases. There are two pools, one for + the Agency communication with label `AgencyComm` and one for the other + cluster internal communication with label `ClusterComm`. + threshold: | + A failed lease can happen if a connection has been terminated + by some idle timeout or if it is already in use by some other request. + Since this can happen under concurrent load, failed leases are not + actually very worrying. + +- name: arangodb_connection_pool_leases_successful_total + renamedFrom: arangodb_connection_leases_successful + introducedIn: "3.8.0" + help: | + Total number of successful connection leases from connection pool. + unit: number + type: counter + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + Total number of successful connection leases from connection pool. + There are two pools, one for the Agency communication with label + `AgencyComm` and one for the other cluster internal communication with + label `ClusterComm`. + threshold: | + It is normal that this number is growing rapidly when there is any + kind of activity in the cluster. + +- name: arangodb_connection_statistics_memory_usage + introducedIn: "3.11.6" + help: | + Total memory usage of connection statistics. + unit: bytes + type: gauge + category: Statistics + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total memory usage of connection statistics. + If the startup option `--server.statistics` is set to `true`, then some + connection statistics are built up in memory for every connection that is + made to the arangod server. + It is expected that the memory usage reported by this metric remains + relatively constant over time. It should grow only when there are bursts of + new connections. + Some memory is pre-allocated at startup for higher efficiency. + No memory will be allocated for connection statistics if the startup option + is set to `false`. + +- name: arangodb_dirty_read_queries_total + introducedIn: "3.10.0" + help: | + Number of AQL queries which have been executed with dirty reads. + unit: number + type: counter + category: AQL + complexity: simple + exposedBy: + - coordinator + description: | + This counter exposes the number of AQL queries which have been executed + with "dirty reads". A dirty read is one which may also use follower shards + and not only leader shards. Note that it is the transaction in the context + of which the AQL runs which determines, if dirty reads are allowed. + +- name: arangodb_dirty_read_transactions_total + introducedIn: "3.10.0" + help: | + Number of read transactions, which are allowed to do dirty reads. + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of read-only transactions, which allow for dirty reads + (read from followers). This metric is only collected for + transactions on Coordinators in a cluster. Other instances may expose + the value as `0`. + +- name: arangodb_document_insert_time + introducedIn: "3.8.0" + help: | + Total time spent in document insert operations. + unit: s + type: histogram + category: Transactions + complexity: simple + exposedBy: + - agent + - dbserver + - single + description: | + Total time spent in document insert operations, including both + user-initiated insert operations and insert operations executed by + the synchronous replication on followers. This metric + is only present if the option `--server.export-read-write-metrics` is set + to `true`. + +- name: arangodb_document_read_time + introducedIn: "3.8.0" + help: | + Total time spent in document read-by-primary-key operations. + unit: s + type: histogram + category: Transactions + complexity: simple + exposedBy: + - dbserver + - single + - agent + description: | + Total time spent in document read-by-primary-key operations. This metric + is only present if the option `--server.export-read-write-metrics` is set + to `true`. + +- name: arangodb_document_remove_time + introducedIn: "3.8.0" + help: | + Total time spent in document remove operations. + unit: s + type: histogram + category: Transactions + complexity: simple + exposedBy: + - agent + - dbserver + - single + description: | + Total time spent in document replace operations, including both + user-initiated replace operations and replace operations executed by + the synchronous replication on followers. This metric + is only present if the option `--server.export-read-write-metrics` is set + to `true`. + +- name: arangodb_document_replace_time + introducedIn: "3.8.0" + help: | + Total time spent in document replace operations. + unit: s + type: histogram + category: Transactions + complexity: simple + exposedBy: + - agent + - dbserver + - single + description: | + Total time spent in document replace operations, including both + user-initiated replace operations and replace operations executed by + the synchronous replication on followers. This metric + is only present if the option `--server.export-read-write-metrics` is set + to `true`. + +- name: arangodb_document_update_time + introducedIn: "3.8.0" + help: | + Total time spent in document update operations. + unit: s + type: histogram + category: Transactions + complexity: simple + exposedBy: + - agent + - dbserver + - single + description: | + Total time spent in document update operations, including both + user-initiated update operations and update operations executed by + the synchronous replication on followers. This metric + is only present if the option `--server.export-read-write-metrics` is set + to `true`. + +- name: arangodb_document_writes_replication_total + renamedFrom: arangodb_document_writes_replication + introducedIn: "3.8.0" + help: | + Total number of document write operations by synchronous replication. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + Total number of document write operations by synchronous replication. + This metric is only present if the option + `--server.export-read-write-metrics` is set to `true`. + Total number of document write operations (insert, update, replace, remove) + executed by the synchronous replication on followers. + This metric is only present if the option `--server.export-read-write-metrics` + is set to `true`. + +- name: arangodb_document_writes_total + renamedFrom: arangodb_document_writes + introducedIn: "3.8.0" + help: | + Total number of document write operations (excluding synchronous replication). + unit: number + type: counter + category: Transactions + complexity: medium + exposedBy: + - agent + - dbserver + - single + description: | + Total number of document write operations (insert, update, replace, remove) on + leaders, excluding writes by the synchronous replication on followers. + This metric is only present if the option `--server.export-read-write-metrics` + is set to `true`. + +- name: arangodb_dropped_followers_total + renamedFrom: arangodb_dropped_followers_count + introducedIn: "3.8.0" + help: | + Number of drop-follower events. + unit: number + type: counter + category: Health + complexity: simple + exposedBy: + - dbserver + description: | + Total number of drop-follower events. This metric is increased on leaders + whenever a write operation cannot be replicated to a follower during + synchronous replication, and it would be unsafe in terms of data consistency + to keep that follower. + This metric was named `arangodb_dropped_followers_count` in previous + versions of ArangoDB. + threshold: | + Usually, drop-follower events should only happen if servers are + restarted or if there are real problems on followers. + +- name: arangodb_file_descriptors_current + introducedIn: "3.11.0" + help: | + Number of file descriptors currently opened by the arangod process. + unit: number + type: gauge + category: Statistics + complexity: medium + exposedBy: + - agent + - coordinator + - dbserver + - single + description: | + Number of file descriptors currently opened by the arangod process. + This will include regular files as well as sockets. + The metric is only available on platforms that support it. + As counting the number of file descriptors can be expensive and can have + an impact on performance, the metric will only be updated in a controllable + interval. The interval can be adjusted via the startup option + `--server.count-descriptors-interval`. Shorter intervals mean more up-to-date + count values, at the potential expense of more IO operations that are + required for counting. + It is possible to turn off counting of file descriptors by setting the + interval to 0. In this case, the metric will report a value of 0. + +- name: arangodb_file_descriptors_limit + introducedIn: "3.11.0" + help: | + System limit for the number of open file descriptors for the arangod process. + unit: number + type: gauge + category: Statistics + complexity: medium + exposedBy: + - agent + - coordinator + - dbserver + - single + description: | + System limit for the number of open file descriptors for the arangod process. + It is only available on platforms that support it. The limit is imposed by + the operating system or system configuration. + The value of this metric will remain constant for the entire lifetime of + the process. + +- name: arangodb_flush_subscriptions + introducedIn: "3.9.10" + help: | + Number of currently active flush subscriptions. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exposes the number of currently active flush subscriptions. + Flush subscriptions can be created by `arangosearch` View links and by background + index creation. + +- name: arangodb_heartbeat_failures_total + renamedFrom: arangodb_heartbeat_failures + introducedIn: "3.8.0" + help: | + Total number of failed heartbeat transmissions. + unit: number + type: counter + category: Health + complexity: simple + exposedBy: + - coordinator + - dbserver + - single + description: | + Total number of failed heartbeat transmissions. + Servers in a cluster periodically send their heartbeats to + the Agency to report their own liveliness. This counter gets + increased whenever sending such a heartbeat fails. In the single + server, this counter is only used in the Active Failover deployment mode. + threshold: | + It is a bad sign for health if heartbeat transmissions fail. This can + lead to failover actions which are ultimately bad for the service. + troubleshoot: | + This can be a sign of overload or of bad network connectivity. Potentially + move the Agent instances to separate machines. + +- name: arangodb_heartbeat_send_time_msec + introducedIn: "3.7.1" + help: | + Time required to send a heartbeat. + unit: ms + type: histogram + category: Health + complexity: medium + exposedBy: + - coordinator + - dbserver + - single + description: | + Histogram of times required to send heartbeats. For every heartbeat + sent the time is measured and an event is put into the histogram. + In the single server, this counter is only used in the Active Failover + deployment mode. + threshold: | + It is a bad sign for health if heartbeat transmissions are not fast. + If there are heartbeats which frequently take longer than a few hundred + milliseconds, or even seconds, this can eventually lead to failover actions + which are ultimately bad for the service. + troubleshoot: | + High heartbeat send times can be a sign of overload or of bad network + connectivity. Potentially move the Agent instances to separate machines. + +- name: arangodb_http1_connections_total + introducedIn: "3.10.2" + help: | + Total number of HTTP/1.1 connections accepted. + unit: number + type: counter + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of connections accepted for HTTP/1.1. Note that this can + include connections that are negotiated to be upgraded to HTTP/2. + +- name: arangodb_http2_connections_total + introducedIn: "3.7.15" + help: | + Total number of HTTP/2 connections accepted. + unit: number + type: counter + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of connections accepted for HTTP/2, this can be upgraded + connections from HTTP/1.1 or connections negotiated to be HTTP/2 during + the TLS handshake. + +- name: arangodb_http_request_statistics_async_requests_total + renamedFrom: arangodb_http_request_statistics_async_requests + introducedIn: "3.8.0" + help: | + Number of asynchronously executed HTTP requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of **asynchronous** HTTP (or VST) + requests which have hit this particular instance of `arangod`. Asynchronous + refers to the fact that the response is not sent with the HTTP response, + but is rather queried separately using the `/_api/jobs` API. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_delete_requests_total + renamedFrom: arangodb_http_request_statistics_http_delete_requests + introducedIn: "3.8.0" + help: | + Number of HTTP DELETE requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **DELETE** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_get_requests_total + renamedFrom: arangodb_http_request_statistics_http_get_requests + introducedIn: "3.8.0" + help: | + Number of HTTP GET requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **GET** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_head_requests_total + renamedFrom: arangodb_http_request_statistics_http_head_requests + introducedIn: "3.8.0" + help: | + Number of HTTP HEAD requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **HEAD** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_options_requests_total + renamedFrom: arangodb_http_request_statistics_http_options_requests + introducedIn: "3.8.0" + help: | + Number of HTTP OPTIONS requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **OPTIONS** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_patch_requests_total + renamedFrom: arangodb_http_request_statistics_http_patch_requests + introducedIn: "3.8.0" + help: | + Number of HTTP PATCH requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **PATCH** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_post_requests_total + renamedFrom: arangodb_http_request_statistics_http_post_requests + introducedIn: "3.8.0" + help: | + Number of HTTP POST requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **POST** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_http_put_requests_total + renamedFrom: arangodb_http_request_statistics_http_put_requests + introducedIn: "3.8.0" + help: | + Number of HTTP PUT requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **PUT** + requests which have hit this particular instance of `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_other_http_requests_total + renamedFrom: arangodb_http_request_statistics_other_http_requests + introducedIn: "3.8.0" + help: | + Number of other HTTP requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) **other** + or **ILLEGAL** requests which have hit this particular instance of + `arangod`. These are all requests, which are not one of the following: + `DELETE`, `GET`, `HEAD`, `POST`, `PUT`, `OPTIONS`, `PATCH`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_superuser_requests_total + renamedFrom: arangodb_http_request_statistics_superuser_requests + introducedIn: "3.8.0" + help: | + Total number of HTTP requests executed by superuser/JWT. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) + requests that have been authenticated with the JWT superuser token, + which have hit this particular instance of + `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_total_requests_total + renamedFrom: arangodb_http_request_statistics_total_requests + introducedIn: "3.8.0" + help: | + Total number of HTTP requests. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) requests which + have hit this particular instance of `arangod`. Note that this counter + is ever growing during the lifetime of the `arangod` process. However, + when the process is restarted, it starts from scratch. In the Grafana + dashboards, it is usually visualized as a rate per second, averaged + with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_http_request_statistics_user_requests_total + renamedFrom: arangodb_http_request_statistics_user_requests + introducedIn: "3.8.0" + help: | + Total number of HTTP requests executed by user clients. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of HTTP (or VST) requests + that have been authenticated for some user (as opposed to with the + JWT superuser token), which have hit this particular instance of + `arangod`. + + Note that this counter is ever growing during the lifetime of the + `arangod` process. However, when the process is restarted, it starts + from scratch. In the Grafana dashboards, it is usually visualized as a + rate per second, averaged with a sliding window of a minute. + threshold: | + This metrics reflects the performance of an instance in a certain way. + Note that your mileage may vary according to available resources as well + as to complexity of the requests the client sends. + +- name: arangodb_intermediate_commits_total + renamedFrom: arangodb_intermediate_commits + introducedIn: "3.8.0" + help: | + Number of intermediate commits performed in transactions. + unit: number + type: counter + category: Statistics + complexity: medium + exposedBy: + - dbserver + - single + description: | + Number of intermediate commits performed in transactions. + An intermediate commit happens if a logical transaction needs to be + split into multiple physical transaction because of the volume of data + handled in the transaction. The thresholds for when to perform an + intermediate commit can be controlled by startup options + `--rocksdb.intermediate-commit-count` (number of write operations after + which an intermediate commit is triggered) and `--rocksdb.intermediate-commit-size` + (cumulated size of write operations after which an intermediate commit is triggered). + The values can also be overridden for individual transactions. + This metric was named `arangodb_intermediate_commits` in previous + versions of ArangoDb. + troubleshoot: | + If this value is non-zero, it doesn't necessarily indicate a problem. It can + happen for large transactions and large data-loading jobs. However, as modifications + performed by intermediate commits are persisted and cannot simply be rolled back in + memory, it should be monitored whether the intermediate commits only happen for + operations where they are expected. If they also happen for operations that are + supposed to be atomic, then the intermediate commit size and count parameters need + to be adjusted, or larger operations should be broken up into smaller ones in the + client application. + +- name: arangodb_ioheartbeat_delays_total + introducedIn: "3.8.7" + help: | + Number of delays in the io heartbeat test. + unit: number + type: counter + category: Health + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This counter is increased whenever the io heartbeat encounters a delay + of at least 1s when writing a small file to the database directory, + reading it and then removing it again. + This test is done periodically to ensure that the underlying volume is + usable and performs reasonably well. The test can be switched off + explicitly with the flag `--database.io-heartbeat=false`, but the + default is `true`. Furthermore, every such failure leads to a line in + the log at INFO level for the `ENGINES` topic. + +- name: arangodb_ioheartbeat_duration + introducedIn: "3.8.7" + help: | + Histogram of execution times of a single IO heartbeat check. + unit: us + type: histogram + category: Health + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This histogram is updated whenever the io heartbeat runs its test in + the database directory. It writes a small file, syncs it to durable + storage, reads it, and then unlinks the file again. This test is done + periodically to ensure that the underlying volume is usable and performs + reasonably well. The test can be switched off explicitly with the flag + `--database.io-heartbeat=false`, but the default is `true`. + +- name: arangodb_ioheartbeat_failures_total + introducedIn: "3.8.7" + help: | + Number of failures in the io heartbeat test. + unit: number + type: counter + category: Health + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This counter is increased whenever the io heartbeat encounters a problem + when writing a small file to the database directory, reading it and then + removing it again. This test is done + periodically to ensure that the underlying volume is usable. The test can + be switched off explicitly with the flag `--database.io-heartbeat=false`, + but the default is `true`. Furthermore, every such failure leads to a + line in the log at INFO level for the `ENGINES` topic. + +- name: arangodb_license_expires + introducedIn: "3.9.1" + help: | + This instance's license expiry in days. + unit: number + type: gauge + category: License + complexity: simple + exposedBy: + - coordinator + - dbserver + description: | + This instance's remaining license validity time. + +- name: arangodb_load_current_runtime + introducedIn: "3.7.1" + help: | + `Current` loading runtimes. + unit: ms + type: histogram + category: Maintenance + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + Histogram of `Current` loading runtimes, i.e. the runtimes + of the `ClusterInfo::loadCurrent` internal method. Provides a + distribution of all loading times for the `Current` + section of the Agency data. The `Current` section gets + loaded on server startup, and then gets reloaded on servers + only for any databases in which there have been recent structural + changes (i.e. DDL changes). + troubleshoot: | + In case this histogram contains very high loading times, this + may be due to using many collections or many shards inside a + database for which there are often structural changes. It then + may make sense to reduce the number of collections or number + of shards. Note that this can have other effects, so it requires + an informed decision. + +- name: arangodb_load_plan_runtime + introducedIn: "3.7.1" + help: | + `Plan` loading runtimes. + unit: ms + type: histogram + category: Maintenance + complexity: medium + exposedBy: + - coordinator + - dbserver + description: | + Histogram of `Plan` loading runtimes, i.e. the runtimes + of the `ClusterInfo::loadPlan` internal method. Provides a + distribution of all loading times for the `Plan` + section of the Agency data. The `Plan` section normally gets + loaded on server startup, and then gets reloaded on servers + only for any databases in which there have been recent structural + changes (i.e. DDL changes). + troubleshoot: | + In case this histogram contains very high loading times, this + may be due to using many collections or many shards inside a + database for which there are often structural changes. It then + may make sense to reduce the number of collections or number + of shards. Note that this can have other effects, so it requires + an informed decision. + +- name: arangodb_logger_errors_total + introducedIn: "3.9.0" + help: | + Total number of errors logged. + unit: number + type: counter + category: Errors + complexity: simple + exposedBy: + - agent + - coordinator + - dbserver + - single + description: | + Total number of errors (ERR messages) logged by the logger. + + If a problem is encountered which is fatal to some operation, but not for + the service or the application as a whole, then an _error is logged. + + Reasons for log entries of this severity are for example include missing + data, inability to open required files, incorrect connection strings, + missing services. + + If an error is logged then it should be taken seriously as it may require + user intervention to solve. + +- name: arangodb_logger_warnings_total + introducedIn: "3.9.0" + help: | + Total number of warnings logged. + unit: number + type: counter + category: Errors + complexity: simple + exposedBy: + - agent + - coordinator + - dbserver + - single + description: | + Total number of warnings (WARN messages) logged by the logger, + including startup warnings. + + Warnings might indicate problems, or might not. For example, + expected transient environmental conditions such as short loss of + network or database connectivity are logged as warnings, not errors. + +- name: arangodb_maintenance_action_done_total + renamedFrom: arangodb_maintenance_action_done_counter + introducedIn: "3.8.0" + help: | + Counter of actions that are done and have been removed from the registry. + unit: number + type: counter + category: Maintenance + complexity: simple + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. Actions are created, registered, queued and executed. + Once they are done, they are eventually removed. + + This metric counts the number of actions that are done and have been removed. + +- name: arangodb_maintenance_action_duplicate_total + renamedFrom: arangodb_maintenance_action_duplicate_counter + introducedIn: "3.8.0" + help: | + Counter of actions that have been discarded because of a duplicate. + unit: number + type: counter + category: Maintenance + complexity: advanced + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. Actions are created, registered, queued and executed. + Once they are done, they are eventually removed. + + This metric counts the number of actions that have been created but found to + be a duplicate of a already queued action. + +- name: arangodb_maintenance_action_failure_total + renamedFrom: arangodb_maintenance_action_failure_counter + introducedIn: "3.8.0" + help: | + Failure counter for the maintenance actions. + unit: number + type: counter + category: Maintenance + complexity: simple + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. Actions are created, registered, queued and executed. + Once they are done, they are eventually removed. + + Those action can fail for different reasons. This metric counts the failed + actions and can thus provide hints to investigate a malfunction. + +- name: arangodb_maintenance_action_queue_time_msec + introducedIn: "3.7.1" + help: | + Time spent in the queue before execution for maintenance actions. + unit: ms + type: histogram + category: Maintenance + complexity: advanced + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. Actions are created, registered, queued and executed. + Once they are done, they are eventually removed. + + This metric tracks the time actions spend waiting in the queue in a histogram. + +- name: arangodb_maintenance_action_registered_total + renamedFrom: arangodb_maintenance_action_registered_counter + introducedIn: "3.8.0" + help: | + Counter of actions that have been registered in the action registry. + unit: number + type: counter + category: Maintenance + complexity: simple + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. Actions are created, registered, queued and executed. + Once they are done, they are eventually removed. + + This metric counts the number of actions that are queued or active. + +- name: arangodb_maintenance_action_runtime_msec + introducedIn: "3.7.1" + help: | + Time spent executing a maintenance action. + unit: ms + type: histogram + category: Maintenance + complexity: advanced + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. Actions are created, registered, queued and executed. + Once they are done, they are eventually removed. + + This metric tracks the time actions spend executing in a histogram. + +- name: arangodb_maintenance_agency_sync_runtime_msec + introducedIn: "3.7.1" + help: | + Total time spent on Agency sync. + unit: ms + type: histogram + category: Maintenance + complexity: simple + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. To identify the target state differences in the meta + data store provided by the Agency are investigated and local changes are + reported. This process is called Agency sync and is executed in regular + intervals. + + This metric tracks the runtime of individual Agency syncs in a histogram. + During DDL operations the runtime can increase but should generally be below + 1s. + +- name: arangodb_maintenance_phase1_runtime_msec + introducedIn: "3.7.1" + help: | + Maintenance Phase 1 runtime histogram. + unit: ms + type: histogram + category: Maintenance + complexity: advanced + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. To identify the target state differences in the meta + data store provided by the Agency are investigated and local changes are + reported. This process is called Agency sync and is executed in regular + intervals. + + This metric tracks the runtime of phase1 of an Agency sync. Phase1 calculates + the difference between the local and the target state. + +- name: arangodb_maintenance_phase2_runtime_msec + introducedIn: "3.7.1" + help: | + Maintenance Phase 2 runtime histogram. + unit: ms + type: histogram + category: Maintenance + complexity: advanced + exposedBy: + - dbserver + description: | + DB-Servers execute reconciliation actions to let the cluster converge + to the desired state. To identify the target state differences in the meta + data store provided by the Agency are investigated and local changes are + reported. This process is called Agency sync and is executed in regular + intervals. + + This metric tracks the runtime of phase2 of an Agency sync. Phase2 calculates + what actions to execute given the difference of the local and target state. + +- name: arangodb_network_connectivity_failures_coordinators_total + introducedIn: "3.11.4" + help: | + Number of failed connectivity check requests sent to Coordinators. + unit: number + type: counter + category: Network + complexity: simple + exposedBy: + - coordinator + - dbserver + description: | + Number of failed connectivity check requests sent by this instance + to Coordinators. + The metric will be increased if a cluster-internal connection to a + Coordinator cannot be established within 10 seconds. In this case the + instance will also log a warning. + Connectivity checks run with a configurable frequency, adjustable via + the `--cluster.connectivity-check-interval` startup option. + + troubleshoot: | + If this metric keeps increasing permanently or for longer periods, there + are likely network connectivity issues or misconfigurations, which can + prevent the instance from connecting to every Coordinator in the cluster + (potentially connecting to itself). In this case it is advised to check + the connectivity manually, and ensure that the instance can make connections + to all Coordinators, potentially including itself. + + If there are temporary network glitches or instance restarts, this metric + can also increase. But increases should stop once the network has stabilized + and/or instances have restarted successfully. + +- name: arangodb_network_connectivity_failures_dbservers_total + introducedIn: "3.11.4" + help: | + Number of failed connectivity check requests sent to DB-Servers. + unit: number + type: counter + category: Network + complexity: simple + exposedBy: + - coordinator + - dbserver + description: | + Number of failed connectivity check requests sent by this instance + to DB-Server. + The metric will be increased if a cluster-internal connection to a + DB-Server cannot be established within 10 seconds. In this case the + instance will also log a warning. + Connectivity checks run with a configurable frequency, adjustable via + the `--cluster.connectivity-check-interval` startup option. + + troubleshoot: | + If this metric keeps increasing permanently or for longer periods, there + are likely network connectivity issues or misconfigurations, which can + prevent the instance from connecting to every DB-Server in the cluster + (potentially connecting to itself). In this case it is advised to check + the connectivity manually, and ensure that the instance can make connections + to all DB-Servers, potentially including itself. + + If there are temporary network glitches or instance restarts, this metric + can also increase. But increases should stop once the network has stabilized + and/or instances have restarted successfully. + +- name: arangodb_network_dequeue_duration + introducedIn: "3.10.6" + help: | + Internal request duration for the dequeue in seconds. + unit: seconds + type: histogram + category: Network + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + description: | + Histogram providing the time from submitting an internal requests until + the IO thread in the fuerte driver starts working on it. Times are in + seconds. + troubleshoot: | + Counts in the high brackets indicate that the IO threads cannot keep up + with the work. + +- name: arangodb_network_forwarded_requests_total + renamedFrom: arangodb_network_forwarded_requests + introducedIn: "3.8.0" + help: | + Number of requests forwarded to another Coordinator. + unit: number + type: counter + category: Network + complexity: simple + exposedBy: + - coordinator + description: | + Number of requests forwarded to another Coordinator. + Request forwarding can happen in load-balanced setups, + when one Coordinator receives and forwards requests + that can only be handled by a different Coordinator. + This includes requests for streaming transactions, + AQL, query cursors, Pregel jobs and some others. + +- name: arangodb_network_request_duration_as_percentage_of_timeout + introducedIn: "3.8.0" + help: | + Internal request round-trip time as a percentage of timeout. + unit: percentage + type: gauge + category: Network + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + description: | + Histogram providing the round-trip time of internal requests as a percentage + of the respective request timeout. + This metric provides values between `0` and `100`. + troubleshoot: | + High values indicate problems with requests that have timed out or have not been + far away from running into timeouts. If many requests timeout, this is normally + a symptom of overload. This can normally be mitigated by reducing the workload + or adjusting the type of operations that are causing the high response times. + If the timeouts happen as a result of not enough processing power, it may be + useful to scale up the cluster. + +- name: arangodb_network_request_timeouts_total + renamedFrom: arangodb_network_request_timeouts + introducedIn: "3.8.0" + help: | + Number of internal requests that have timed out. + unit: number + type: counter + category: Network + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + description: | + Number of internal requests that have timed out. This metric is increased + whenever any cluster-internal request executed in the underlying connection + pool runs into a timeout. + troubleshoot: | + Request timeouts can be caused by the destination servers being overloaded + and thus slow to respond, or by network errors. If this counter increases, + it is advised to check network connectivity and server loads. + +- name: arangodb_network_requests_in_flight + introducedIn: "3.8.0" + help: | + Number of outgoing internal requests in flight. + unit: number + type: gauge + category: Network + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + description: | + Number of outgoing internal requests in flight. This metric is increased + whenever any cluster-internal request is about to be sent via the underlying + connection pool, and is decreased whenever a response for such a request is + received or the request runs into a timeout. + This metric provides an estimate of the fan-out of operations. For example, + a user operation on a collection with a single shard normally leads to + a single internal request (plus replication), whereas an operation on a + collection with 10 shards may lead to a fan-out of 10 (plus replication). + +- name: arangodb_network_response_duration + introducedIn: "3.10.6" + help: | + Internal request duration from fully sent till response received in seconds. + unit: seconds + type: histogram + category: Network + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + description: | + Histogram providing the time from when the request was fully sent off + until the response has been received of internal requests in seconds. + troubleshoot: | + Counts in the high brackets indicate problems with the network infrastructure. + +- name: arangodb_network_send_duration + introducedIn: "3.10.6" + help: | + Internal request send duration in seconds. + unit: seconds + type: histogram + category: Network + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + description: | + Histogram providing the sending time of internal requests in seconds. + troubleshoot: | + Counts in the high brackets indicate problems with the network infrastructure. + +- name: arangodb_network_unfinished_sends_total + introducedIn: "3.10.6" + help: | + Number of internal requests for which sending has not finished. + unit: number + type: counter + category: Network + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + description: | + Number of internal requests for which sending has not finished. This is + usually due to some connection problem or to a timeout in case the + receiving side did not receive the data fast enough. + troubleshoot: | + If this counter moves, it is a sign that either there are delays in the + networking infrastructure or on the receiving side. + +- name: arangodb_potentially_dirty_document_reads_total + introducedIn: "3.10.0" + help: | + Number of document reads which have been executed with dirty reads. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + description: | + This counter exposes the number of document reads (single or batch to + shards in the cluster) which have been executed with "dirty reads". + A dirty read is one which may also use follower shards and not only + leader shards. Note that it is the transaction in the context of which + the read runs which determines, if dirty reads are allowed. + +- name: arangodb_pregel_conductors_loading_number + introducedIn: "3.10.0" + help: | + Number of loading Pregel conductors. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of loading Pregel conductors. + +- name: arangodb_pregel_conductors_number + introducedIn: "3.10.0" + help: | + Number of Pregel conductors. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of Pregel conductors. + +- name: arangodb_pregel_conductors_running_number + introducedIn: "3.10.0" + help: | + Number of running Pregel conductors. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of running Pregel conductors. + +- name: arangodb_pregel_conductors_storing_number + introducedIn: "3.10.0" + help: | + Number of storing Pregel conductors. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of storing Pregel conductors. + +- name: arangodb_pregel_graph_memory_bytes_number + introducedIn: "3.10.0" + help: | + Memory allocated by Pregel for graph storage. + unit: bytes + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + The number of bytes allocated by Pregel. + +- name: arangodb_pregel_messages_received_total + introducedIn: "3.10.0" + help: | + Number of messages received by Pregel. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + The number of messages received by Pregel. + +- name: arangodb_pregel_messages_sent_total + introducedIn: "3.10.0" + help: | + Number of messages sent by Pregel. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of messages sent by Pregel. + +- name: arangodb_pregel_threads_number + introducedIn: "3.10.0" + help: | + Number of threads running for Pregel. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of threads running for Pregel. + +- name: arangodb_pregel_workers_loading_number + introducedIn: "3.10.0" + help: | + Number of loading Pregel workers. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of loading Pregel workers. + +- name: arangodb_pregel_workers_number + introducedIn: "3.10.0" + help: | + Number of Pregel workers. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of Pregel Workers. + +- name: arangodb_pregel_workers_running_number + introducedIn: "3.10.0" + help: | + Number of running Pregel workers. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of running Pregel workers. + +- name: arangodb_pregel_workers_storing_number + introducedIn: "3.10.0" + help: | + Number of storing Pregel workers. + unit: number + type: gauge + category: Pregel + complexity: simple + exposedBy: + - dbserver + - single + - coordinator + description: | + Number of storing Pregel workers. + +- name: arangodb_process_statistics_major_page_faults_total + renamedFrom: arangodb_process_statistics_major_page_faults + introducedIn: "3.8.0" + help: | + Number of major page faults. + unit: number + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + On Windows, this figure contains the total number of page faults. + On other system, this figure contains the number of major faults the + process has made which have required loading a memory page from disk. + troubleshooting: | + If the rate of this is high, i.e. it increases fast, it could be an indication + that the memory usage is too high, or the memory is too low, or paging is done + too aggressively (for Linux, this see sysctl and vm.swappiness). + +- name: arangodb_process_statistics_minor_page_faults_total + renamedFrom: arangodb_process_statistics_minor_page_faults + introducedIn: "3.8.0" + help: | + Number of minor page faults. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of minor faults the process has made which have not required + loading a memory page from disk. This figure is not reported on Windows. + +- name: arangodb_process_statistics_number_of_threads + introducedIn: "3.6.1" + help: | + Number of threads. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of threads in the arangod process. + +- name: arangodb_process_statistics_resident_set_size + introducedIn: "3.6.1" + help: | + Resident set size. + unit: bytes + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The total size of the number of pages the process has in real memory. + This is just the pages which count toward text, data, or stack space. + This does not include pages which have not been demand-loaded in, or + which are swapped out. The resident set size is reported in bytes. + +- name: arangodb_process_statistics_resident_set_size_percent + introducedIn: "3.6.1" + help: | + Resident set size as fraction of system memory. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The relative size of the number of pages the process has in real + memory compared to system memory. This is just the pages which count + toward text, data, or stack space. This does not include pages which + have not been demand-loaded in, or which are swapped out. The value is a + ratio between 0.00 and 1.00. + threshold: | + This value can be consistently relatively high, even when not under load, + due to different caches like the RocksDB block cache or the edge cache. There + should be some safety margin left, so it should not get too close to 1. + troubleshooting: | + If the memory is nearly full, this can lead to performance degradation, errors + because queries can't be executed, or the process being killed by the + operating system to free memory. This can be mitigated by adding more memory, + decreasing the size of caches if they aren't much needed, or restricting the + amount of memory AQL queries may use. + +- name: arangodb_process_statistics_system_time + introducedIn: "3.6.1" + help: | + Process system time. + unit: s + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Amount of time that this process has been scheduled in kernel mode, + measured in seconds. + threshold: | + This metric can vary significantly dependent on the workload. If the rate is + consistently very high, it could be an indication of some problem. + troubleshooting: | + There are many possible reasons for this, and specific advice cannot be given + here. Examples can be costly or inefficient queries being executed, or just + that the machine's performance is not sufficient for the tasks. + +- name: arangodb_process_statistics_user_time + introducedIn: "3.6.1" + help: | + Process user time. + unit: s + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Amount of time that this process has been scheduled in user mode, + measured in seconds. + threshold: | + This metric can vary significantly dependent on the workload. If the rate is + consistently very high, it could be an indication of some problem. + troubleshooting: | + There are many possible reasons for this, and specific advice cannot be given + here. Examples can be costly or inefficient queries being executed, or just + that the machine's performance is not sufficient for the tasks. + +- name: arangodb_process_statistics_virtual_memory_size + introducedIn: "3.6.1" + help: | + Virtual memory size. + unit: bytes + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + On Windows, this figure contains the total amount of memory that the + memory manager has committed for the arangod process. On other systems, + this figure contains the size of the virtual memory the process is + using. + +- name: arangodb_read_transactions_total + introducedIn: "3.8.2" + help: | + Number of read transactions. + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of read-only transactions. In the cluster, this metric is + collected separately for transactions on Coordinators and the + transaction counterparts on leaders and followers. + +- name: arangodb_refused_followers_total + renamedFrom: arangodb_refused_followers_count + introducedIn: "3.8.0" + help: | + Number of refusal answers from a follower during synchronous replication. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of refusal answers from a follower during synchronous replication. + A refusal answer is only sent by a follower if the follower is under + the impression that the replication request was not sent by the current + shard leader. This can happen if replication requests to the follower are + delayed or the follower is slow to process incoming requests and there was + a leader change for the shard. + If such a refusal answer is received by the shard leader, it drops the + follower from the list of followers. + This metrics was named `arangodb_refused_followers_count` in previous + versions of ArangoDB. + threshold: | + Usually, refusal answers only occur if request processing on followers is + delayed and there was a recent leadership change. This should not be a + common case and normally indicates a problem with the setup or with the load. + +- name: arangodb_replication2_replicated_log_append_entries_rtt + introducedIn: "3.11.0" + help: | + Histogram of the RTT of appendEntries requests in microseconds. + unit: us + type: histogram + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + The leader of a replicated log replicates the log entries by sending + appendEntries requests to its followers. + This is a histogram keeping track of the number of such requests this + server sends (for any log it is a leader of), as well as their respective + round-trip times in microseconds. + +- name: arangodb_replication2_replicated_log_creation_total + introducedIn: "3.11.0" + help: | + Number of replicated log instances created on this server since its start. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + - single + description: | + Number of replicated log instances created on this server since its start. + +- name: arangodb_replication2_replicated_log_deletion_total + introducedIn: "3.11.0" + help: | + Number of replicated log instances deleted on this server since its start. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + - single + description: | + Number of replicated log instances deleted on this server since its start. + +- name: arangodb_replication2_replicated_log_follower_append_entries_rt + introducedIn: "3.11.0" + help: | + Histogram of the duration of appendEntries calls in microseconds. + unit: us + type: histogram + category: Replication + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Followers of a replicated log, including the local followers for persistence + each leader has, receive appendEntries requests. These contain log entries + to be replicated. Serving these requests means writing them to persistence. + + This histogram counts the number of such requests server by this server, + plus their respective runtime in microseconds. + +- name: arangodb_replication2_replicated_log_follower_number + introducedIn: "3.11.0" + help: | + Current number of followers of replicated logs. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - dbserver + - single + description: | + Current number of replicated logs this server is a follower of. + +- name: arangodb_replication2_replicated_log_inactive_number + introducedIn: "3.11.0" + help: | + Current number of inactive replicated logs. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - dbserver + - single + description: | + Current number of replicated logs this server is a participant of, + but is not yet configured to be either a leader or a follower. This + number should usually be zero, except during server startup until + the configuration from the Agency is fetched and applied, and for + a short time when a log is newly created. + +- name: arangodb_replication2_replicated_log_inserts_bytes + introducedIn: "3.11.0" + help: | + Number of bytes inserted into replicated logs. + unit: bytes + type: histogram + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + For all replicated logs this server is a leader of, this counts the number + of bytes of raw payload inserted into it. + +- name: arangodb_replication2_replicated_log_inserts_rtt + introducedIn: "3.11.0" + help: | + Round-trip time of inserts into replicated logs in microseconds. + unit: us + type: histogram + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + Inserts into replicated logs this server is a leader of are counted by this + histogram, plus their respective round-trip time. This includes the time for + replication, at least until the writeConcern is satisfied. + +- name: arangodb_replication2_replicated_log_leader_number + introducedIn: "3.11.0" + help: | + Current number of replicated log leaders. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - dbserver + - single + description: | + Number of replicated logs this server is currently a leader of. + +- name: arangodb_replication2_replicated_log_leader_took_over_total + introducedIn: "3.11.0" + help: | + Number of leader takeovers. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + Number of times this server took over the leadership of a replicated log + since server start. + +- name: arangodb_replication2_replicated_log_number + introducedIn: "3.11.0" + help: | + Number of replicated logs. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + - single + description: | + Number of replicated logs this server is a participant of. + +- name: arangodb_replication2_replicated_log_number_accepted_entries_total + introducedIn: "3.11.0" + help: | + Number of accepted (not yet committed) log entries. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + The entries have been inserted into the log and are being replicated but a quorum has not yet been reached. + +- name: arangodb_replication2_replicated_log_number_committed_entries_total + introducedIn: "3.11.0" + help: | + Number of committed log entries. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of committed log entries. + +- name: arangodb_replication2_replicated_log_number_compacted_entries_total + introducedIn: "3.11.0" + help: | + Number of compacted log entries. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of compacted log entries. If log entries have been replicated to every participant and applied + durably, they can be compacted, i.e. deleted. + +- name: arangodb_replication2_replicated_log_number_meta_entries_total + introducedIn: "3.11.0" + help: | + Number of meta log entries. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of meta log entries. A meta log entry is used to create artificial write barriers, for example during a + configuration change or move shard operation. + +- name: arangodb_replication2_replicated_log_started_following_total + introducedIn: "3.11.0" + help: | + Number of times started following a replicated log. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + Number of times this server started following a replicated log + since server start. + +- name: arangodb_replication2_replicated_state_acquire_snapshot_errors_total + introducedIn: "3.11.0" + help: | + Number of errors during an acquire snapshot operation. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of errors during an acquire snapshot operation. + +- name: arangodb_replication2_replicated_state_applied_entries_total + introducedIn: "3.11.0" + help: | + Number of log entries applied to the internal state. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of log entries applied to the internal state. + +- name: arangodb_replication2_replicated_state_apply_entries_errors_total + introducedIn: "3.11.0" + help: | + Number of errors during an apply entries operation. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of errors during an apply entries operation. + +- name: arangodb_replication2_replicated_state_follower_acquire_snapshot_rt + introducedIn: "3.11.0" + help: | + Histogram of the duration of acquireSnapshot calls in microseconds. + unit: us + type: histogram + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Histogram of the duration of acquireSnapshot calls in microseconds. This measures the time + a new follower takes to acquire a snapshot from the leader. + +- name: arangodb_replication2_replicated_state_follower_apply_entries_rt + introducedIn: "3.11.0" + help: | + Histogram of the duration of applyEntries calls in microseconds. + unit: us + type: histogram + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Histogram of the duration of applyEntries calls in microseconds. This measures the time + a follower takes to apply log entries to its local state after they have been committed. + +- name: arangodb_replication2_replicated_state_follower_number + introducedIn: "3.11.0" + help: | + Number of follower replicated states. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of replicated states this server is a follower of. + +- name: arangodb_replication2_replicated_state_follower_waiting_for_leader_number + introducedIn: "3.11.0" + help: | + Number of followers waiting for the leader to acknowledge the current term. + unit: number + type: gauge + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of followers waiting for the leader to acknowledge the current term. + +- name: arangodb_replication2_replicated_state_follower_waiting_for_snapshot_number + introducedIn: "3.11.0" + help: | + Number of followers waiting for a snapshot transfer to complete. + unit: number + type: gauge + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of followers waiting for a snapshot transfer to complete. + +- name: arangodb_replication2_replicated_state_leader_number + introducedIn: "3.11.0" + help: | + Number of leader replicated states. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of replicated states this server is a leader of. + +- name: arangodb_replication2_replicated_state_leader_recover_entries_rt + introducedIn: "3.11.0" + help: | + Histogram of the duration of recoverEntries calls in microseconds. + unit: us + type: histogram + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Histogram of the duration of recoverEntries calls in microseconds. This measures the time + a new leader takes to recover from existing log entries after it was elected. + +- name: arangodb_replication2_replicated_state_leader_waiting_for_recovery_number + introducedIn: "3.11.0" + help: | + Number of leaders waiting for recovery to be complete. + unit: number + type: gauge + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of leaders waiting for recovery to be complete. + +- name: arangodb_replication2_replicated_state_number + introducedIn: "3.11.0" + help: | + Number of replicated states. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of replicated states this server is a participant of. + +- name: arangodb_replication2_replicated_state_processed_entries_total + introducedIn: "3.11.0" + help: | + Number of log entries processed by the follower. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Number of log entries processed by the follower. + +- name: arangodb_replication_clients + introducedIn: "3.10.5" + help: | + Number of currently connected/active replication clients. + unit: number + type: gauge + category: Replication + complexity: medium + exposedBy: + - single + - dbserver + description: | + This metric contains the number of currently active/connected replication clients + that have started or are currently receiving data from this server for replication + purposes. + +- name: arangodb_replication_cluster_inventory_requests_total + renamedFrom: arangodb_replication_cluster_inventory_requests + introducedIn: "3.8.0" + help: | + (DC-2-DC only) Number of times the database and collection overviews have been requested. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - coordinator + description: | + When using a DC-2-DC configuration of ArangoDB this metric is active on both data-centers. + It indicates that the follower data-center periodically matches the available databases and collections + in order to mirror them. If no DC-2-DC is set up this value is expected to be 0. + troubleshoot: | + If you have a DC-2-DC installation, and this metric stays constant over a longer period of time in any of the two data centers + this indicates that the follower data center is not properly connected anymore. + The issue most likely is within the sync process on either of the two data-centers as they do not compare their inventory anymore. + This gives no information about the healthiness of the ArangoDB cluster itself, please check other metrics for this. + +- name: arangodb_replication_dump_apply_time_total + renamedFrom: arangodb_replication_dump_apply_time + introducedIn: "3.8.0" + help: | + Accumulated time needed to apply asynchronously replicated data on initial synchronization of shards. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + Measures the time required to clone the existing leader copy of the data onto a new replica shard. + It is only measured on the follower server. This time is expected to increase whenever new followers + are created, e.g. increasing replication factor, shard redistribution. + troubleshoot: | + This metric measures as typical operation to keep the cluster resilient, so no reaction is required. + In a stable cluster situation (no outages, no collection modification) this metric should also be stable. + +- name: arangodb_replication_dump_bytes_received_total + renamedFrom: arangodb_replication_dump_bytes_received + introducedIn: "3.8.0" + help: | + Total number of bytes replicated in initial asynchronous phase. + unit: bytes + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + During initial replication the existing data from the leader is copied asynchronously + over to new shards. The amount of requests required to transport data to this server, + as a replica for a shard, is counted here. + +- name: arangodb_replication_dump_documents_total + renamedFrom: arangodb_replication_dump_documents + introducedIn: "3.8.0" + help: | + Total number of documents replicated in initial asynchronous phase. + unit: number + type: counter + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + During initial replication the existing data from the leader is copied asynchronously + over to new shards. The amount of documents transported to this server, as a replica for + a shard, is counted here. + +- name: arangodb_replication_dump_request_time_total + renamedFrom: arangodb_replication_dump_request_time + introducedIn: "3.8.0" + help: | + Accumulated wait time for replication requests in initial asynchronous phase. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + During initial replication the existing data from the leader is copied asynchronously + over to new shards. The accumulated time the follower waited for the leader to send + the data is counted here. + +- name: arangodb_replication_dump_requests_total + renamedFrom: arangodb_replication_dump_requests + introducedIn: "3.8.0" + help: | + Number of requests used in initial asynchronous replication phase. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + During initial replication the existing data from the leader is copied asynchronously + over to new shards. The amount of data transported to this server, as a replica for + a shard, is counted here. + +- name: arangodb_replication_failed_connects_total + renamedFrom: arangodb_replication_failed_connects + introducedIn: "3.8.0" + help: | + Number of failed connection attempts and response errors during initial + asynchronous replication. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + During initial replication the existing data from the leader is copied asynchronously + over to new shards. Whenever there is a communication issue between the follower and + the leader of the shard, it is counted here for the follower. This communication + issues cover failed connections or http errors, but they also cover invalid or + unexpected data formats received on the follower. + threshold: | + In ideal situation this counter should be 0. It is expected to increase if there is + server or network outage. However it is not guaranteed that this metric increases + in such a situation. + troubleshoot: | + If this counter increases this typically indicates an issue with the communication + between servers. If it is just occasionally an increase of one, it can be a simple + network hiccup, if you see constant increases here that indicates serious issues. + This also indicates that there is a shard trying to get into sync with the existing + data, which cannot make progress. So you have only replicationFactor - 1 copies of + the data right now. If more servers suffer outage you may lose data in this case. + * First thing to check: Network connectivity, make sure all servers are online + and the machines can communicate to one-another. + * Second: Check ArangoDB logs of this server for more details, most likely + you see `WARN` or `ERROR` messages in the `replication` log topic. If you contact + ArangoDB support for this issue, it helps to include these servers logs as well. + * Third: (Unlikely) If the logs contain unexpected format or value entries + please check if you are running all ArangoDB DB-Servers within the same + version of ArangoDB. Only upgrades of one minor version at a time are supported + in general, so if you are running one server with a much newer / older version + please upgrade all servers to the newest version. + * Forth: If none of the above applies, please contact ArangoDB Support. + +- name: arangodb_replication_initial_chunks_requests_time_total + renamedFrom: arangodb_replication_initial_chunks_requests_time + introducedIn: "3.8.0" + help: | + Accumulated wait time for replication key chunks determination requests. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the accumulated wait time for replication key + chunks determination requests, in milliseconds. This is part of the + older (pre 3.8) initial replication protocol, which might still be used + in 3.8 for collections which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the time used for the initial step of getting + the checksums for the key chunks. + +- name: arangodb_replication_initial_docs_requests_time_total + renamedFrom: arangodb_replication_initial_docs_requests_time + introducedIn: "3.8.0" + help: | + Accumulated time needed to request replication docs data. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the accumulated wait time for requesting actual + documents for the initial replication, in milliseconds. This is part + of the older (pre 3.8) initial replication protocol, which might + still be used in 3.8 for collections which have been created by older + versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the time used for the final step of actually + getting the needed documents. + +- name: arangodb_replication_initial_insert_apply_time_total + renamedFrom: arangodb_replication_initial_insert_apply_time + introducedIn: "3.8.0" + help: | + Accumulated time needed to apply replication initial sync insertions. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + Accumulated time needed to apply replication initial sync insertions. + This counter exhibits the accumulated wait time for actually inserting + documents for the initial synchronization, in milliseconds. This is + part of the older (pre 3.8) initial replication protocol, which might + still be used in 3.8 for collections which have been created by older + versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the time used for the actual insertion of + replicated documents on the follower. + +- name: arangodb_replication_initial_keys_requests_time_total + renamedFrom: arangodb_replication_initial_keys_requests_time + introducedIn: "3.8.0" + help: | + Accumulated wait time for replication keys requests. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the accumulated wait time for fetching key + lists for a chunk, in milliseconds. This is part of the + older (pre 3.8) initial replication protocol, which might still be used + in 3.8 for collections which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the time used for the second step of getting + lists of key/revision pairs for each chunk. + +- name: arangodb_replication_initial_remove_apply_time_total + renamedFrom: arangodb_replication_initial_remove_apply_time + introducedIn: "3.8.0" + help: | + Accumulated time needed to apply replication initial sync removals. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the accumulated wait time for removing local + documents during initial synchronization of a shard on the follower, + in milliseconds. This is part of the older (pre 3.8) initial + replication protocol, which might still be used in 3.8 for collections + which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the time used for the intermediate step of + removing unneeded documents on the follower. + +- name: arangodb_replication_initial_sync_bytes_received_total + renamedFrom: arangodb_replication_initial_sync_bytes_received + introducedIn: "3.8.0" + help: | + Accumulated amount of bytes received in initial sync. + unit: bytes + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the accumulated number of bytes received + for initial synchronization of shards. This is part of the + older (pre 3.8) initial replication protocol, which might still be used + in 3.8 for collections which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates number of bytes received for all three steps. + +- name: arangodb_replication_initial_sync_docs_inserted_total + renamedFrom: arangodb_replication_initial_sync_docs_inserted + introducedIn: "3.8.0" + help: | + Number of documents inserted by replication initial sync. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the total number of documents inserted on the + follower during initial synchronization of shards. This is part of the + older (pre 3.8) initial replication protocol, which might still be + used in 3.8 for collections which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the total number of documents inserted in the + third step. + +- name: arangodb_replication_initial_sync_docs_removed_total + renamedFrom: arangodb_replication_initial_sync_docs_removed + introducedIn: "3.8.0" + help: | + Number of documents removed by replication initial sync. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the total number of documents removed on the + follower during initial synchronization of shards. This is part of the + older (pre 3.8) initial replication protocol, which might still be + used in 3.8 for collections which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the total number of documents removed in the + third step. + +- name: arangodb_replication_initial_sync_docs_requested_total + renamedFrom: arangodb_replication_initial_sync_docs_requested + introducedIn: "3.8.0" + help: | + Number of documents requested by replication initial sync. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the total number of documents fetched on the + follower from the leader during initial synchronization of shards. + This is part of the older (pre 3.8) initial replication protocol, + which might still be used in 3.8 for collections which have been + created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the total number of documents fetched from the + leader in the third step. + +- name: arangodb_replication_initial_sync_docs_requests_total + renamedFrom: arangodb_replication_initial_sync_docs_requests + introducedIn: "3.8.0" + help: | + Number of replication initial sync docs requests. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the total number of times documents have been + fetched on the follower from the leader during initial synchronization + of shards. This is part of the older (pre 3.8) initial replication + protocol, which might still be used in 3.8 for collections which have + been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric accumulates the total number of times documents have been + fetched from the leader in the third step. + +- name: arangodb_replication_initial_sync_keys_requests_total + renamedFrom: arangodb_replication_initial_sync_keys_requests + introducedIn: "3.8.0" + help: | + Number of replication initial sync keys requests. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + This counter exhibits the accumulated number of keys requests for + initial synchronization of shards. This is part of the + older (pre 3.8) initial replication protocol, which might still be used + in 3.8 for collections which have been created by older versions. + + In this older protocol, the follower first fetches an overview over + a shard from the leader. This does a full collection scan and + divides the primary keys in the collection into equal sized chunks. + Then, a checksum for each chunk is returned. The same is then done + on the follower and the checksums are compared, chunk by chunk. For + each chunk, for which the checksums do not match, the list of keys and + revisions is fetched from the leader. This then enables the follower + to fetch the actually needed documents and remove superfluous ones + locally. + + This metric counts the number of times the follower fetches a list of + keys for some chunk. + +- name: arangodb_replication_synchronous_requests_total_number_total + renamedFrom: arangodb_replication_synchronous_requests_total_number + introducedIn: "3.8.0" + help: | + Total number of synchronous replication requests. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + The total amount of all synchronous replication operation requests + between DB-Servers being done. + +- name: arangodb_replication_synchronous_requests_total_time_total + renamedFrom: arangodb_replication_synchronous_requests_total_time + introducedIn: "3.8.0" + help: | + Total time needed for all synchronous replication requests. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + The total time needed for all synchronous replication requests + between DB-Servers being done. + +- name: arangodb_replication_tailing_apply_time_total + renamedFrom: arangodb_replication_tailing_apply_time + introducedIn: "3.8.0" + help: | + Accumulated time needed to apply replication tailing data. + unit: ms + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + The accumulated time needed to locally process the continuous + replication log on a follower received from a replication + leader. + troubleshoot: | + If you see unusual spikes here, the follower might not have enough + IO bandwidth or might be overloaded. Try to provision more IOPS or + more CPU capacity. Additionally, it could make sense to compare the + value with all other available follower DB-Servers to detect potential + differences. + +- name: arangodb_replication_tailing_bytes_received_total + renamedFrom: arangodb_replication_tailing_bytes_received + introducedIn: "3.8.0" + help: | + Accumulated number of bytes received for replication tailing requests. + unit: bytes + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: + The accumulated number of bytes received from a leader for replication + tailing requests. The higher the amount of bytes is, the more data + is being processed afterwards on the follower DB-Server. + troubleshoot: + Compare this metric with all other related participating follower + DB-Servers. If the given value on a DB-Server is considerable higher, + you might want to think about rebalancing your data as the overall + work might not be evenly distributed. + +- name: arangodb_replication_tailing_documents_total + renamedFrom: arangodb_replication_tailing_documents + introducedIn: "3.8.0" + help: | + Accumulated number of replication tailing document inserts/replaces processed. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: + The accumulated number of replication tailing document inserts/replaces + processed on a follower. + troubleshoot: + Compare this metric with all other related participating follower + DB-Servers. If the given value on a DB-Server is considerable higher, + you might want to think about rebalancing your data as the overall + work might not be evenly distributed. It is important to understand + that this metric only enumerates the amount of documents and does not + compare document sizes. Even if values compared to other DB-Servers + may vary, work load could be fine. Therefore also check the metric + arangodb_replication_tailing_bytes_received_total to have an overall + and more precise picture. + +- name: arangodb_replication_tailing_follow_tick_failures_total + renamedFrom: arangodb_replication_tailing_follow_tick_failures + introducedIn: "3.8.0" + help: | + Number of replication tailing failures due to missing tick on leader. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + The number of replication tailing failures due to missing tick on leader. + troubleshoot: + If this is non-zero, action is required. A required follower tick is not present (potentially + removed) on a leader DB-Server. Please check the related leader DB-Server + log-files to identify the origin of the cause. It may be required to do + a full re-sync and/or increase the number of historic logfiles on the + leader(s). + +- name: arangodb_replication_tailing_markers_total + renamedFrom: arangodb_replication_tailing_markers + introducedIn: "3.8.0" + help: | + Number of replication tailing markers processed. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + The number of replication tailing markers processed on a follower + DB-Server. Markers are specific operations which are part of the + write-ahead log (WAL). Example actions which are being used in + markers: Create or drop a database. Create, drop, rename, change + or truncate a collection. Create or drop an index. Create, drop, + change a view. Start, commit or abort a transaction. + +- name: arangodb_replication_tailing_removals_total + renamedFrom: arangodb_replication_tailing_removals + introducedIn: "3.8.0" + help: | + Number of replication tailing document removals processed. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + The amount of document removal based marker operations on a + follower DB-Server. + +- name: arangodb_replication_tailing_request_time_total + renamedFrom: arangodb_replication_tailing_request_time + introducedIn: "3.8.0" + help: | + Aggregated wait time for replication tailing requests. + unit: ms + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + description: | + Aggregated wait time for replication tailing requests. + troubleshoot: + If you see unusual spikes here, please inspect potential + network issues. It may help to increase network bandwidth + and/or reduce network latency. In case there are no network + issues, also check the load of the serving leader DB-Server, + as well as the follower DB-Server, as they could potentially + be overloaded and reaching hardware-based limits. + +- name: arangodb_replication_tailing_requests_total + renamedFrom: arangodb_replication_tailing_requests + introducedIn: "3.8.0" + help: | + Number of replication tailing requests. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + The total amount of network replication tailing requests. + +- name: arangodb_request_body_size_http1 + introducedIn: "3.7.15" + help: | + Body size in bytes for HTTP/1.1 requests. + unit: bytes + type: histogram + category: Statistics + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the body sizes of the received HTTP/1.1 requests in bytes. + Note that this does not account for the header. + +- name: arangodb_request_body_size_http2 + introducedIn: "3.7.15" + help: | + Body size in bytes for HTTP/2 requests. + unit: bytes + type: histogram + category: Statistics + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the body sizes of the received HTTP/2 requests in bytes. + Note that this does not account for the header. + +- name: arangodb_request_body_size_vst + introducedIn: "3.7.15" + help: | + Body size in bytes for VST requests. + unit: bytes + type: histogram + category: Statistics + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Histogram of the body sizes of the received VST requests in bytes. + Note that this does include the binary header. + +- name: arangodb_request_statistics_memory_usage + introducedIn: "3.11.6" + help: | + Total memory usage of request statistics. + unit: bytes + type: gauge + category: Statistics + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total memory usage of request statistics. + If the startup option `--server.statistics` is set to `true`, then some + request statistics are built up in memory for incoming requests. + Some memory is pre-allocated at startup for higher efficiency. + It is expected that the memory usage reported by this metric remains + relatively constant over time. It should grow only when there are bursts of + incoming requests. + No memory will be allocated for request statistics if the startup option + is set to `false`. + +- name: arangodb_revision_tree_hibernations_total + introducedIn: "3.8.5" + help: | + Number of revision tree hibernations. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + The revision trees of collections/shards are normally present + in RAM in an uncompressed state. However, to reduce the memory + usage of keeping all revision trees in RAM at the same time, + revision trees can be put into "hibernation" mode. Any inactive + revision tree is automatically hibernated by ArangoDB after + a while. For the hibernation step, a revision tree is + compressed in RAM, and only the compressed version is then kept. + Later accesses of a compressed revision tree require uncompressing + the tree again. + This metric is increased whenever a revision tree is hibernated. + This can happened many times during the lifetime of a revision tree. + +- name: arangodb_revision_tree_memory_usage + introducedIn: "3.8.5" + help: | + Total memory usage of all revision trees (both hibernated and uncompressed). + unit: bytes + type: gauge + category: Replication + complexity: simple + exposedBy: + - dbserver + - agent + - single + description: | + Total memory usage of all revision trees for collections/shards. + The revision trees of collections/shards are normally present + in RAM in an uncompressed state. However, to reduce the memory + usage of keeping all revision trees in RAM at the same time, + revision trees can be put into "hibernation" mode. Any inactive + revision tree is automatically hibernated by ArangoDB after + a while. For the hibernation step, a revision tree is + compressed in RAM, and only the compressed version is then kept. + Later accesses of a compressed revision tree require uncompressing + the tree again. + This metrics reports the total memory usage of all revision trees, + including both the hibernated and uncompressed forms). + +- name: arangodb_revision_tree_rebuilds_failure_total + introducedIn: "3.8.2" + help: | + Number of failed revision tree rebuilds. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Number of failed background revision tree rebuilds. + Ideally this value stays at 0, because if a revision tree rebuild + fails, the system may stall and not be able to make progress in + terms of WAL file collection. When the counter increases, + an error message is also logged to the server logfile. + +- name: arangodb_revision_tree_rebuilds_success_total + introducedIn: "3.8.2" + help: | + Number of successful revision tree rebuilds. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Number of successful background revision tree rebuilds. + Ideally this value stays at 0, because a revision tree rebuild + indicates a problem with a collection/shard's revision tree that + has happened before. + +- name: arangodb_revision_tree_resurrections_total + introducedIn: "3.8.5" + help: | + Number of revision tree resurrections. + unit: number + type: counter + category: Replication + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + The revision trees of collections/shards are normally present + in RAM in an uncompressed state. However, to reduce the memory + usage of keeping all revision trees in RAM at the same time, + revision trees can be put into "hibernation" mode. Any inactive + revision tree is automatically hibernated by ArangoDB after + a while. For the hibernation step, a revision tree is + compressed in RAM, and only the compressed version is then kept. + Later accesses of a compressed revision tree require uncompressing + the tree again. + This metric is increased whenever a revision tree is restored from + its hibernated state back into an uncompressed form in RAM. + This can happened many times during the lifetime of a revision tree. + +- name: arangodb_rocksdb_write_stalls_total + renamedFrom: rocksdb_write_stalls + introducedIn: "3.8.0" + help: | + Number of times RocksDB has entered a stalled (slowed) write state. + unit: number + type: counter + category: RocksDB + complexity: simple + exposedBy: + - dbserver + - agent + - single + description: | + This counter reflects the number of times RocksDB was observed by + ArangoDB to have entered a stalled (slowed) write state. + + If the RocksDB background threads which do cleanup and compaction + cannot keep up with the writing, then RocksDB first throttles its + write rate ("write stall") and later stops the writing entirely + ("write stop"). Both are suboptimal, since the write rate is too high. + threshold: | + If this number grows, you are probably writing faster to ArangoDB than + RocksDB can keep up with its background processing. This is OK for + a while, but might eventually lead to actual write stops, which are + bad since they can lead to unavailability. + troubleshoot: | + Quite often, RocksDB is limited by the available I/O bandwidth. Sometimes, + it is not the bandwidth itself, but the number of I/O operations per + second (IOPS) which is limited. If you are in a cloud environment, + IOPS are often scarce (or expensive) and you might be able to + deploy more. + +- name: arangodb_rocksdb_write_stops_total + renamedFrom: rocksdb_write_stops + introducedIn: "3.8.0" + help: | + Number of times RocksDB has entered a stopped write state. + unit: number + type: counter + category: RocksDB + complexity: simple + exposedBy: + - dbserver + - agent + - single + description: | + This counter reflects the number of times RocksDB was observed by + ArangoDB to have entered a stopped write state. + + If the RocksDB background threads which do cleanup and compaction + cannot keep up with the writing, then RocksDB first throttles its + write rate ("write stall") and later stops the writing entirely + ("write stop"). Both are suboptimal, since the write rate is too high, + but write stops are considerably worse, since they can lead to service + unavailability. + threshold: | + If this number grows, you are probably writing a lot faster to + ArangoDB than RocksDB can keep up with its background processing. + This has lead to actual write stops, which are bad since they can lead + to unavailability. If you see this number grow, you need to act, + if in doubt, contact ArangoDB support. + troubleshoot: | + Quite often, RocksDB is limited by the available I/O bandwidth. Sometimes, + it is not the bandwidth itself, but the number of I/O operations per + second (IOPS) which is limited. If you are in a cloud environment, + IOPS are often scarce (or expensive) and you might be able to + deploy more. + +- name: arangodb_scheduler_handler_tasks_created_total + introducedIn: "3.8.2" + help: | + Total number of REST handler tasks created for the scheduler. + unit: number + type: counter + category: Scheduler + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of REST handler tasks that were created for execution + via the scheduler. This counter is increased for each incoming + request for which a REST handler mapping exists and that does not + need to be forwarded to another Coordinator in the cluster. + +- name: arangodb_scheduler_high_prio_queue_length + introducedIn: "3.8.0" + help: | + Current queue length of the high priority queue in the scheduler. + unit: number + type: gauge + category: Scheduler + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of jobs currently queued on the scheduler's high priority queue. + The capacity of the high priority queue can be configured via the startup + option `--server.prio1-size`. + +- name: arangodb_scheduler_jobs_dequeued_total + introducedIn: "3.8.0" + help: | + Total number of jobs dequeued. + unit: number + type: counter + category: Scheduler + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The total number of jobs dequeued from all scheduler queues. + Calculating the difference between arangodb_scheduler_jobs_submitted_total + and arangodb_scheduler_jobs_dequeued_total gives the total number of + currently queued jobs. + Calculating the difference between arangodb_scheduler_jobs_dequeued_total + and arangodb_scheduler_jobs_done_total gives the number of jobs currently + being processed. + +- name: arangodb_scheduler_jobs_done_total + introducedIn: "3.8.0" + help: | + Total number of queue jobs done. + unit: number + type: gauge + category: Scheduler + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The total number of queue jobs done. + Calculating the difference between arangodb_scheduler_jobs_dequeued_total + and arangodb_scheduler_jobs_done_total gives the total number of jobs + currently being processed. + +- name: arangodb_scheduler_jobs_submitted_total + introducedIn: "3.8.0" + help: | + Total number of jobs submitted to the scheduler. + unit: number + type: gauge + category: Scheduler + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of jobs submitted to the scheduler. + Calculating the difference between arangodb_scheduler_jobs_submitted_total + and arangodb_scheduler_jobs_dequeued_total gives the total number of + currently queued jobs. + +- name: arangodb_scheduler_low_prio_queue_last_dequeue_time + introducedIn: "3.8.0" + help: | + Last recorded dequeue time for a low priority queue item. + unit: ms + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Last recorded dequeue time for a low priority queue item, i.e., the amount of + time the job was sitting in the queue. If there is nothing to do for a long + time, this metric is reset to zero. + A large value for this metric indicates that the server is under heavy load + and low priority jobs cannot be dequeued in a timely manner + threshold: Normally this time should be clearly sub-second. + troubleshoot: If you see larger values here, in particular over a longer period + of time, you should consider reducing the load of the server (if possible), + scaling up (bigger machine) or scaling out (more Coordinators). Otherwise + requests cannot be processed in a timely manner and you run the risk that the + queue becomes full and requests are declined. + +- name: arangodb_scheduler_low_prio_queue_length + introducedIn: "3.8.0" + help: | + Current queue length of the low priority queue in the scheduler. + unit: number + type: gauge + category: Scheduler + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of jobs currently queued on the scheduler's low priority queue. + The capacity of the low priority queue can be configured via the startup + option `--server.maximal-queue-size`. + +- name: arangodb_scheduler_maintenance_prio_queue_length + introducedIn: "3.8.0" + help: | + Current queue length of the maintenance priority queue in the scheduler. + unit: number + type: gauge + category: Scheduler + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of jobs currently queued on the scheduler's maintenance priority + queue. These are the jobs with the highest priority and are mainly used for + cluster internal operations. The capacity of the maintenance priority queue + can be configured via the startup option `--server.scheduler-queue-size`. + +- name: arangodb_scheduler_medium_prio_queue_length + introducedIn: "3.8.0" + help: | + Current queue length of the medium priority queue in the scheduler. + unit: number + type: gauge + category: Scheduler + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of jobs currently queued on the scheduler's medium priority queue. + The capacity of the medium priority queue can be configured via the startup + option `--server.prio2-size`. + +- name: arangodb_scheduler_num_awake_threads + renamedFrom: arangodb_scheduler_awake_threads + introducedIn: "3.8.0" + help: | + Number of awake worker threads. + unit: number + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of worker threads currently working on some job or spinning while + waiting for new work (i.e., not sleeping). + +- name: arangodb_scheduler_num_detached_threads + introducedIn: "3.11.5" + help: | + Current number of detached worker threads. + unit: number + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of worker threads currently started and detached from the + scheduler. Worker threads which perform potentially long running + tasks like waiting for a lock can detach themselves from the scheduler + to allow new scheduler threads to be started and avoid server blockage. + +- name: arangodb_scheduler_num_worker_threads + introducedIn: "3.6.7" + help: | + Current number of worker threads. + unit: number + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The number of worker threads currently started. This includes detached + worker threads. Worker threads can be started and stopped dynamically + based on the server load. + +- name: arangodb_scheduler_num_working_threads + introducedIn: "3.6.10" + help: | + Current number of working threads. + unit: number + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The current number of threads actually working on some job (i.e., not + spinning while waiting for new work). + +- name: arangodb_scheduler_ongoing_low_prio + introducedIn: "3.8.0" + help: | + Total number of ongoing RestHandlers coming from the low priority queue. + unit: number + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of low priority jobs currently being processed. + +- name: arangodb_scheduler_queue_full_failures_total + renamedFrom: arangodb_scheduler_queue_full_failures + introducedIn: "3.8.0" + help: | + Number of tasks dropped and not added to internal queue. + unit: number + type: counter + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of tasks dropped because the queue was already full. The queue capacities + can be configured via the startup options `--server.scheduler-queue-size`, + `--server.prio1-size`, `--server.prio2-size` and `--server.maximal-queue-size`. + +- name: arangodb_scheduler_queue_length + introducedIn: "3.6.7" + help: | + Server's internal queue length. + unit: number + type: gauge + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + The total number of currently queued jobs in all queues. + +- name: arangodb_scheduler_queue_time_violations_total + introducedIn: "3.9.0" + help: | + Number of tasks/requests dropped and not added to internal queue + due to the client-specified queue time requirements not being + satisfiable. + unit: number + type: counter + category: Scheduler + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of tasks/requests dropped because the client-specified queue time + requirements, as indicated by client applications in the + `x-arango-queue-time-seconds` HTTP request header could not be satisfied by + the receiving server instance. This happens when the actual time needed to + queue/dequeue requests on the scheduler queue exceeds the maximum time value + that the client has specified in the request. + Whenever this happens, the client application gets an HTTP 412 error + response back with error code 21004 ("queue time violated"). + Although the metric is exposed on all instance types, it is likely + always `0` on DB-Servers, simply because Coordinators do not forward the + `x-arango-queue-time-seconds` when they send internal requests to DB-Servers. + +- name: arangodb_scheduler_threads_started_total + renamedFrom: arangodb_scheduler_threads_started + introducedIn: "3.8.0" + help: | + Total accumulated number of scheduler threads started. + unit: number + type: counter + category: Scheduler + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total accumulated number of scheduler threads started. Worker threads can be + started and stopped dynamically based on the server load. + +- name: arangodb_scheduler_threads_stopped_total + renamedFrom: arangodb_scheduler_threads_stopped + introducedIn: "3.8.0" + help: | + Accumulated total number of scheduler threads stopped. + unit: number + type: counter + category: Scheduler + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total accumulated number of scheduler threads stopped. Worker threads can be + started and stopped dynamically based on the server load. + +- name: arangodb_search_cleanup_time + introducedIn: "3.10.0" + help: | + Average time of few last cleanups. + unit: ms + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Average time of few last cleanups. + +- name: arangodb_search_columns_cache_size + introducedIn: "3.9.5" + help: | + ArangoSearch columns cache usage. + unit: bytes + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Size of all ArangoSearch columns currently loaded into the cache. + troubleshoot: | + If this metric contains a value close to configured + `--arangosearch.columns-cache-limit`, there might be columns + that are marked to be cached but do not fit into the cache. + That may result in query performance degradation. Check the + log for pattern "Failed to allocate memory for buffered column" + +- name: arangodb_search_commit_time + introducedIn: "3.10.0" + help: | + Average time of few last commits. + unit: ms + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Average time of few last commits. + +- name: arangodb_search_consolidation_time + introducedIn: "3.10.0" + help: | + Average time of few last consolidations. + unit: ms + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Average time of few last consolidations. + +- name: arangodb_search_execution_threads_demand + introducedIn: "3.11.6" + help: | + Number of Arangosearch parallel execution threads requested by queries. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of Arangosearch parallel execution threads requested by queries. + troubleshoot: | + If this metric contains a value lower than configured "--arangosearch.execution-threads-limit" + (number of cores * 2 by default) then there is enought threads for runninng queries with parallel execution. + The value of the metric represents the number of currently used threads. If the value is greater than + "--arangosearch.execution-threads-limit" that means currently some queries can not get enough threads to + achieve the requested parallelism. In that state queries are less parallel up to single-threaded execution. + Query performance migth degrade. + +- name: arangodb_search_index_size + introducedIn: "3.10.0" + help: | + Size of the index in bytes for current snapshot. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Size of the index in bytes for current snapshot. + +- name: arangodb_search_num_docs + introducedIn: "3.10.0" + help: | + Number of documents for current snapshot. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of documents for current snapshot. + +- name: arangodb_search_num_failed_cleanups + introducedIn: "3.10.0" + help: | + Number of failed cleanups. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of failed cleanups. + +- name: arangodb_search_num_failed_commits + introducedIn: "3.10.0" + help: | + Number of failed commits. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of failed commits. + +- name: arangodb_search_num_failed_consolidations + introducedIn: "3.10.0" + help: | + Number of failed consolidations. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of failed consolidations. + +- name: arangodb_search_num_files + introducedIn: "3.10.0" + help: | + Number of files for current snapshot. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of files for current snapshot. + +- name: arangodb_search_num_live_docs + introducedIn: "3.10.0" + help: | + Number of live documents for current snapshot. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of live documents for current snapshot. + +- name: arangodb_search_num_out_of_sync_links + introducedIn: "3.9.4" + help: | + Number of out-of-sync arangosearch links/inverted indexes. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of `arangosearch` View links and inverted indexes that are + currently out of sync. A link or inverted index is out of sync + if the recovery for it is intentionally skipped or a commit + operation on the link/index has failed. + troubleshoot: | + If this metric contains a value greater than zero, the + log files should be checked to find out which links/indexes + are affected. The out-of-sync links/indexes should then + be dropped and recreated. + +- name: arangodb_search_num_primary_docs + introducedIn: "3.11.0" + help: | + Number of primary documents for current snapshot. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of primary documents for current snapshot. + +- name: arangodb_search_num_segments + introducedIn: "3.10.0" + help: | + Number of segments for current snapshot. + unit: number + type: gauge + category: ArangoSearch + complexity: advanced + exposedBy: + - dbserver + - single + description: | + Number of segments for current snapshot. + +- name: arangodb_server_statistics_cpu_cores + introducedIn: "3.8.0" + help: | + Number of CPU cores visible to the arangod process. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of CPU cores visible to the arangod process, unless the + environment variable `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` + is set. In that case, the environment variable's value is reported. + +- name: arangodb_server_statistics_idle_percent + introducedIn: "3.8.0" + help: | + Percentage of time that the system CPUs have been idle. + unit: percentage + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Percentage of time that the system CPUs have been idle, as + a value between `0` and `100`, and as reported by the operating system. + This metric is only reported on some operating systems. + +- name: arangodb_server_statistics_iowait_percent + introducedIn: "3.8.0" + help: | + Percentage of time that the system CPUs have been waiting for I/O. + unit: percentage + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Percentage of time that the system CPUs have been waiting for I/O, as + a value between `0` and `100`, and as reported by the operating system. + This metric is only reported on some operating systems. + +- name: arangodb_server_statistics_physical_memory + introducedIn: "3.6.7" + help: | + Physical memory in bytes. + unit: bytes + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Physical memory of the system in bytes, as reported by the operating system + unless the environment variable `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` + is set. In that case, the environment variable's value is reported. + +- name: arangodb_server_statistics_server_uptime_total + renamedFrom: arangodb_server_statistics_server_uptime + introducedIn: "3.8.0" + help: | + Number of seconds elapsed since server start. + unit: s + type: counter + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of seconds elapsed since server start, including fractional + seconds. + This metric was named `arangodb_server_statistics_server_uptime` + in previous versions of ArangoDB. + +- name: arangodb_server_statistics_system_percent + introducedIn: "3.8.0" + help: | + Percentage of time that the system CPUs have spent in kernel mode. + unit: percentage + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Percentage of time that the system CPUs have spent in kernel mode, as + a value between `0` and `100`, and as reported by the operating system. + This metric is only reported on some operating systems. + +- name: arangodb_server_statistics_user_percent + introducedIn: "3.8.0" + help: | + Percentage of time that the system CPUs have spent in user mode. + unit: percentage + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Percentage of time that the system CPUs have spent in user mode, as + a value between `0` and `100`, and as reported by the operating system. + This metric is only reported on some operating systems. + +- name: arangodb_shards_leader_number + renamedFrom: arangodb_shards_leader_count + introducedIn: "3.8.0" + help: | + Number of leader shards on this machine. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + description: | + Number of leader shards on this machine. Every shard has a leader and + potentially multiple followers. + troubleshoot: | + Since the leaders perform all the read and write operations and + the followers only replicate the writes, one should usually have a + relatively even distribution of leader shards across DB-Servers. An + exception can be one-shard deployments, in which every collection has + a single shard and all shards in a database must have the same leader. + If you have few databases in a one-shard deployment, then an uneven + distribution of leader shards is natural. + + You can either move shards manually, use the **Rebalance shards** button + in the ArangoDB web interface, or use the + [cluster maintenance tools](https://github.com/arangodb/cluster-maintenance) + (`create-move-plan` and `execute-move-plan` specifically). In the latter + case, contact ArangoDB customer support. + +- name: arangodb_shards_not_replicated + introducedIn: "3.7.1" + help: | + Number of shards not replicated at all. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + description: | + Number of shards not replicated at all. This is counted for all shards + for which this server is currently the leader. The number is increased + by one for every shards for which no follower is in sync. + troubleshoot: | + Needless to say, such a situation is very bad for resilience, since it + indicates a single point of failure. So, if this number is greater than 0, + then some action is indicated. During an upgrade or when some DB-Server + was restarted, it can happen that shard followers are out of sync. + Normally, shards should get in sync on their own, so observation + and waiting is a good measure at first. However, if the situation + persists, something is wrong, potentially some constant server crash + (maybe out of memory crashes?) or another situation preventing + shards to get in sync. Contact ArangoDB customer support in this case. + +- name: arangodb_shards_number + renamedFrom: arangodb_shards_total_count + introducedIn: "3.8.0" + help: | + Number of shards on this machine. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - dbserver + description: | + Number of shards on this machine. Every shard has a leader and + potentially multiple followers. This metric counts both leader and + follower shards. + troubleshoot: | + Since both leader and follower shards use memory and disk space, + the total number of shards should be approximately balanced + evenly across the DB-Servers. To achieve this, you can either + move shards manually, use the **Rebalance shards** button in the + ArangoDB web interface, or use the + [cluster maintenance tools](https://github.com/arangodb/cluster-maintenance) + (`create-move-plan` and `execute-move-plan` specifically). In the latter + case, contact ArangoDB customer support. + +- name: arangodb_shards_out_of_sync + introducedIn: "3.7.1" + help: | + Number of leader shards not fully replicated. + unit: number + type: gauge + category: Replication + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + description: | + Number of leader shards not fully replicated. This is counted for all + shards for which this server is currently the leader. The number is + increased by one for every shards for which not all followers are in sync. + troubleshoot: | + Needless to say, such a situation is not good resilience, since we + do not have as many copies of the data as the `replicationFactor` + prescribes. If this metrics has a value greater than 0, then some + action is indicated. During an upgrade or when some DB-Server was + restarted, it can happen that shard followers are out of sync. + Normally, shards should get in sync on their own, so observation + and waiting is a good measure at first. However, if the situation + persists, something is wrong, potentially some constant server crash + (maybe out of memory crashes?) or another situation preventing shards + to get in sync. Contact ArangoDB customer support in this case. + +- name: arangodb_sync_rebuilds_total + introducedIn: "3.8.0" + help: | + Number of times a follower shard needed to be completely rebuilt because of + too many synchronization failures. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + Number of times a follower shard needed to be completely rebuilt + because of too many subsequent shard synchronization failures. + This metric is always zero from version 3.9.3 onwards. In previous + releases, a non-zero value indicates that a follower shard could + not get in sync with the leader even after many attempts. When + the metric got increased, the follower shard was dropped and + completely rebuilt from leader data, in order to increase its + chances of getting in sync. + troubleshoot: | + This number is always `0` from version 3.9.3 onwards. If it is + non-zero in previous versions, then something is wrong, please + contact ArangoDB customer support in this case. + +- name: arangodb_sync_timeouts_total + introducedIn: "3.9.2" + help: | + Number of times the synchronization of a follower shard synchronization + attempt ran into a timeout. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + description: | + Number of times a follower shard synchronization attempt ran into the + timeout controlled by the startup option `--cluster.shard-synchronization-attempt-timeout`. + Running into this timeout is not an error. The timeout simply restricts + individual shard synchronization attempts to a certain maximum runtime. + When it happens, the shard synchronization attempt is aborted by the + follower, but immediately retried afterwards. This abort-and-retry + operation allows the leader DB-Servers to purge their archived WAL files + for the aborted snapshots timely, so that long-running shard synchronization + aborts do not lead to overly long WAL file retention periods on leaders. + +- name: arangodb_sync_tree_rebuilds_total + introducedIn: "3.10.6" + help: | + Number of times a revision tree for a shard was completely + rebuilt because of too many subsequent failures in the shard + synchronization. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + Number of times a revision tree for a shard was completely + rebuilt because of too many subsequent failures in the shard + synchronization. + If shards cannot get in sync after several attempts, the shard's + revision tree is first rebuilt on the follower, and then on the + leader. If the value is greater than zero, it means there have + been shard synchronization failures. + +- name: arangodb_sync_wrong_checksum_total + renamedFrom: arangodb_sync_wrong_checksum + introducedIn: "3.8.0" + help: | + Number of times a mismatching shard checksum was detected when syncing shards. + unit: number + type: counter + category: Replication + complexity: medium + exposedBy: + - dbserver + - single + description: | + Number of times a mismatching shard checksum was detected when + syncing shards. This is a very special metric which is rarely used. + When followers of shards get in sync with their leaders, just when + everything is completed a final checksum is taken as an additional + precaution. If this checksum differs between leader an follower, the + incremental resync process starts from scratch. + troubleshoot: | + Normally, this number is always `0`. If it is not, then usually + something is wrong, please contact ArangoDB customer support in this + case. + +- name: arangodb_transactions_aborted_total + renamedFrom: arangodb_transactions_aborted + introducedIn: "3.8.0" + help: | + Number of transactions aborted. + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of transactions aborted. In the cluster, this metric is + collected separately for transactions on Coordinators and the + transaction counterparts on leaders and followers. + This metric was named `arangodb_transactions_aborted` in previous + versions of ArangoDB. + +- name: arangodb_transactions_committed_total + renamedFrom: arangodb_transactions_committed + introducedIn: "3.8.0" + help: | + Number of transactions committed. + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of transactions committed. In the cluster, this metric is + collected separately for transactions on Coordinators and the + transaction counterparts on leaders and followers. + This metric was named `arangodb_transactions_committed` in previous + versions of ArangoDB. + +- name: arangodb_transactions_expired_total + renamedFrom: arangodb_transactions_expired + introducedIn: "3.8.0" + help: | + Total number of expired transactions. + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of expired transactions, i.e. transactions that have + been begun but that were automatically garbage-collected due to + inactivity within the transactions' time-to-live (TTL) period. + In the cluster, this metric is collected separately for transactions + on Coordinators and the transaction counterparts on leaders and followers. + This metric was named `arangodb_transactions_expired` in previous + versions of ArangoDB. + +- name: arangodb_transactions_started_total + renamedFrom: arangodb_transactions_started + introducedIn: "3.8.0" + help: | + Number of transactions started. + unit: number + type: counter + category: Transactions + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of transactions started/begun. In the cluster, this metric is + collected separately for transactions on Coordinators and the + transaction counterparts on leaders and followers. + This metric was named `arangodb_transactions_started` in previous + versions of ArangoDB. + +- name: arangodb_v8_context_alive + introducedIn: "3.6.7" + help: | + Number of V8 contexts currently alive. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of V8 contexts currently alive. Normally, only Coordinators and + single servers should have V8 contexts, for DB-Servers and Agents the + value is always zero. + threshold: | + If this number is close to the maximum allowed number of V8 contexts, + there might be a shortage. This can delay Foxx queries and AQL + user defined functions. On the other hand, V8 contexts can use + quite a lot of memory, so one should not have too many if RAM + is scarce. + +- name: arangodb_v8_context_busy + introducedIn: "3.6.7" + help: | + Number of V8 contexts currently busy. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Number of V8 contexts currently busy, that means, they are currently + working on some JavaScript task. Normally, only Coordinators and + single servers should have V8 contexts, for DB-Servers and Agents the + value is always zero. + threshold: | + If this number is close to the maximum allowed number of V8 contexts, + there might be a shortage. This can delay Foxx queries and AQL + user defined functions. On the other hand, V8 contexts can use + quite a lot of memory, so one should not have too many if RAM + is scarce. + +- name: arangodb_v8_context_created_total + renamedFrom: arangodb_v8_context_created + introducedIn: "3.8.0" + help: | + Total number of V8 contexts ever created. + unit: number + type: counter + category: V8 + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of V8 contexts ever created. It is + OK if this number keeps growing since the V8 contexts are created and + destroyed as needed. In rare cases a high fluctuation can indicate + some unfortunate usage pattern. + +- name: arangodb_v8_context_creation_time_msec_total + renamedFrom: arangodb_v8_context_creation_time_msec + introducedIn: "3.8.0" + help: | + Accumulated total time for creating V8 contexts. + unit: ms + type: counter + category: V8 + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the accumulated total time for creating V8 + contexts, in milliseconds. It is OK if this number keeps growing since + the V8 contexts are created and destroyed as needed. In rare cases a + high fluctuation can indicate some unfortunate usage pattern. + +- name: arangodb_v8_context_destroyed_total + renamedFrom: arangodb_v8_context_destroyed + introducedIn: "3.8.0" + help: | + Total number of V8 contexts ever destroyed. + unit: number + type: counter + category: V8 + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of V8 contexts ever destroyed. + It is OK if this number keeps growing since the V8 contexts are + created and destroyed as needed. In rare cases a high fluctuation can + indicate some unfortunate usage pattern. + +- name: arangodb_v8_context_dirty + introducedIn: "3.6.7" + help: | + Number of V8 contexts currently dirty. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This gauge reflects the number of V8 contexts that are currently dirty. + A V8 context is dirty, if it has executed JavaScript for some time and + is due for a garbage collection. + +- name: arangodb_v8_context_enter_failures_total + renamedFrom: arangodb_v8_context_enter_failures + introducedIn: "3.8.0" + help: | + Total number of V8 context enter failures. + unit: number + type: counter + category: V8 + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of V8 context enter failures. A context receives a context + enter event every time it begins to execute some JavaScript. If no + context is available at such a time the system waits for 60s for a + context to become free. If this does not happen within the 60s, the + context enter event fails, a warning is logged and this counter is + increased by one. + threshold: | + If you see V8 context enter failures, then you do not have enough + V8 contexts or the server is overloaded by JavaScript tasks. If some + JavaScript code blocks V8 contexts for too long, the free V8 contexts + can run out and these failures begin to happen. + +- name: arangodb_v8_context_entered_total + renamedFrom: arangodb_v8_context_entered + introducedIn: "3.8.0" + help: | + Total number of V8 context enter events. + unit: number + type: counter + category: V8 + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of V8 context enter events. A context receives a context + enter event every time it begins to execute some JavaScript. This number + is a rough estimate as to how much JavaScript the server executes. + +- name: arangodb_v8_context_exited_total + renamedFrom: arangodb_v8_context_exited + introducedIn: "3.8.0" + help: | + Total number of V8 context exit events. + unit: number + type: counter + category: V8 + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This counter reflects the total number of V8 context exit events. + A context receives a context exit event every time it finishes to + execute some JavaScript. + +- name: arangodb_v8_context_free + introducedIn: "3.6.7" + help: | + Number of V8 contexts currently free. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This gauge reflects the number of V8 contexts that are currently free. + If this number drops to `0` there might be a shortage of V8 contexts. + +- name: arangodb_v8_context_max + introducedIn: "3.6.7" + help: | + Maximum number of concurrent V8 contexts. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This is the maximum number of concurrent V8 contexts. This is limited + by a server option, since V8 contexts can use a lot of RAM. V8 contexts + are created and destroyed as needed up to the limit shown in this metric. + +- name: arangodb_v8_context_min + introducedIn: "3.6.7" + help: | + Minimum number of concurrent V8 contexts. + unit: number + type: gauge + category: Statistics + complexity: simple + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This is the minimum number of concurrent V8 contexts. This is limited + by a server option. V8 contexts are created and destroyed as needed + but there are never fewer than the limit shown in this metric. + +- name: arangodb_vst_connections_total + introducedIn: "3.7.15" + help: | + Total number of VST connections accepted. + unit: number + type: counter + category: Connectivity + complexity: medium + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + Total number of connections accepted for VST, this are upgraded + connections from HTTP/1.1. + +- name: rocksdb_actual_delayed_write_rate + introducedIn: "3.6.1" + help: | + Actual delayed RocksDB write rate. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-actual-delayed-write-rate`. + It shows the current actual delayed write rate. The value `0` means no delay. + +- name: rocksdb_archived_wal_files + introducedIn: "3.8.2" + help: | + Number of RocksDB WAL files in the archive. + unit: number + type: gauge + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the total number of RocksDB WAL files in the + "archive" subdirectory. These are WAL files that can be garbage-collected + eventually, when they are not used anymore by replication, WAL tailing + or other purposes. + +- name: rocksdb_archived_wal_files_size + introducedIn: "3.9.11" + help: | + Cumulated size of RocksDB WAL files in the archive. + unit: bytes + type: gauge + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the cumulated size of RocksDB WAL files in the + `archive` subdirectory on disk. These are WAL files that can be + garbage-collected eventually, when they are not used anymore by + replication, WAL tailing or other purposes. + +- name: rocksdb_background_errors + introducedIn: "3.6.1" + help: | + Total number of RocksDB background errors. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `background-errors`. It shows + the accumulated number of background errors. + +- name: rocksdb_base_level + introducedIn: "3.6.1" + help: | + RocksDB base level. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-base-level`. + It shows the number of the level to which L0 data is compacted. + +- name: rocksdb_block_cache_capacity + introducedIn: "3.6.1" + help: | + RocksDB block cache capacity. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-block-cache-capacity`. + It shows the block cache capacity in bytes. This can be configured with + the `--rocksdb.block-cache-size` startup option. + +- name: rocksdb_block_cache_pinned_usage + introducedIn: "3.6.1" + help: | + Size of pinned RocksDB block cache entries. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-block-cache-pinned-usage`. + It shows the memory size for the RocksDB block cache for the entries + which are pinned, in bytes. + +- name: rocksdb_block_cache_usage + introducedIn: "3.6.1" + help: | + Cumulated size of RocksDB block cache entries. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-block-cache-usage`. + It shows the total memory size for the entries residing in the block cache, + in bytes. + +- name: rocksdb_cache_active_tables + introducedIn: "3.10.0" + help: | + Global current number of hash tables in ArangoDB cache. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the current number of active hash tables used by the + in-memory cache which sits in front of RocksDB. Active tables are used for + caching index entries. There should be one active table per index per shard + for each index that has in-memory caching enabled. There can also be + additional active tables while an existing hash table is migrated to a + larger table. + +- name: rocksdb_cache_allocated + introducedIn: "3.6.1" + help: | + Global current memory allocation of ArangoDB in-memory caches. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the current global allocation for the ArangoDB + in-memory cache which sits in front of RocksDB. For example, the edge caches + counts towards this allocation. All these caches together have a + global limit which can be controlled with the `--cache.size` startup option. + +- name: rocksdb_cache_auto_refill_dropped_total + introducedIn: "3.10.2" + help: | + Total number of dropped entries in automatic in-memory index cache refilling. + unit: number + type: counter + category: RocksDB + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This metric shows the total number of entries for which no automatic refilling + happened in the in-memory index caches. + This counter increases only for insert, update, replace, and remove operations + affecting edge indexes and cache-enabled persistent indexes and with requested + automatic refilling, + if no refill operation could be queued due to capacity constraints. + A refill operation request can be rejected if the number of currently queued + refill operations exceeds the maximum value configured via the + `--rocksdb.auto-refill-index-cache-queue-capacity` startup option. + Correctness of index lookups is not affected if this metric is non-zero, as + it only reports the number of failed refilling attempts in the in-memory caches + of any index. These in-memory caches are optional and their fill grade does not + affect correctness. + troubleshoot: | + If this metric keeps increasing, it indicates that the index refill background + thread can't keep up with the incoming data modification requests. + In this case, consider increasing the background thread's queueing capacity via + the `--rocksdb.auto-refill-index-cache-queue-capacity` startup option. + Increasing the capacity helps to handle bursts of request, but does not help + if the background thread is overwhelmed by a continuous high load. + +- name: rocksdb_cache_auto_refill_loaded_total + introducedIn: "3.10.2" + help: | + Total number of automatically refilled in-memory index cache entries. + unit: number + type: counter + category: RocksDB + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This metric shows the total number of automatically refilled in-memory + index cache entries. Entries in the in-memory index caches are automatically + refilled for edge indexes and cache-enabled persistent indexes if an insert, + update, replace, or remove operation requests the cache refilling, or if the + `--rocksdb.auto-refill-index-caches` startup option is enabled. + On Agents and Coordinators, the values reported by this metric are always zero. + +- name: rocksdb_cache_edge_compressed_inserts_total + introducedIn: "3.11.3" + help: | + Total number of compressed inserts into the in-memory edge cache. + unit: number + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total number of compressed inserts into the in-memory edge cache. This + metric is increased whenever a payload value for the edge cache was + compressed and then inserted. + +- name: rocksdb_cache_edge_compression_ratio + introducedIn: "3.11.2" + help: | + Overall effective compression ratio of all edge cache entries ever stored + in the edge cache. + unit: bytes + type: gauge + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Overall effective compression ratio of all edge cache entries ever stored + in the in-memory edge cache. The value should be 0 if compression is not + used. + +- name: rocksdb_cache_edge_empty_inserts_total + introducedIn: "3.11.4" + help: | + Total number of insertions into the in-memory edge cache + for non-connected edges. + unit: number + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total number of insertions into the in-memory edge cache for edges that + were not connected to other edges. + In this case, the edge case will store the information that there are no + connected edges. + +- name: rocksdb_cache_edge_inserts_effective_entries_size_total + renamedFrom: rocksdb_cache_edge_effective_entries_size + introducedIn: "3.11.2" + help: | + Total effective memory size of all edge cache entries ever stored in the edge cache. + unit: bytes + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total effective memory size of all edge cache data that were stored in the + the edge cache of any collection/shard since the server start. + The size is calculated after any potential compression, so the compression + efficiency can be estimated by this metric by the size of the uncompressed + edge cache entries. + Note that this metric is incremented upon every edge cache insert attempt. + It is increased also when data cannot be inserted into the cache (e.g. because + the cache had no memory left). The metric is not decreased when data gets + evicted from the cache. + +- name: rocksdb_cache_edge_inserts_total + introducedIn: "3.11.4" + help: | + Total number of insertions into the in-memory edge cache. + in the edge cache. + unit: number + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total number of insertions into the in-memory edge cache. + This metric is increased whenever a value is inserted into the + in-memory edge cache, regardless of whether the value was + compressed or not. + +- name: rocksdb_cache_edge_inserts_uncompressed_entries_size_total + renamedFrom: rocksdb_cache_edge_uncompressed_entries_size + introducedIn: "3.11.2" + help: | + Total gross memory size of all edge cache entries ever stored in the edge cache. + unit: bytes + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total gross memory size of all edge cache data that were stored in the edge + cache of any collection/shard since the server start. + The size is calculated before any potential compression. + Note that this metric is incremented upon every cache insert attempt. + It is increased also when data cannot be inserted into the cache (e.g. because + the cache had no memory left). The metric is not decreased when data gets + evicted from the cache. + +- name: rocksdb_cache_free_memory_tasks_duration_total + introducedIn: "3.10.11" + help: | + Total amount of time spent in 'free memory' tasks of the in-memory + cache subsystem. + unit: us + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total amount of time spent inside 'free memory' tasks of the in-memory + cache subsystem. 'free memory' tasks are scheduled by the cache subsystem + to free up memory in existing cache hash tables. + +- name: rocksdb_cache_free_memory_tasks_total + introducedIn: "3.10.11" + help: | + Total number of 'free memory' tasks scheduled by the in-memory + cache subsystem. + unit: number + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total number of 'free memory' tasks that were scheduled by the + in-memory edge cache subsystem. This metric will be increased + whenever the cache subsystem schedules a task to free up memory + in one of the managed in-memory caches. It is expected to see + this metric rising when the cache subsystem hits its global + memory budget. + +- name: rocksdb_cache_full_index_refills_total + introducedIn: "3.10.2" + help: | + Total number of in-memory index cache refill operations for a complete + index. + unit: number + type: counter + category: RocksDB + complexity: advanced + exposedBy: + - coordinator + - dbserver + - agent + - single + description: | + This metric shows the total number of refill operations to in-memory + index caches for entire edge indexes and cache-enabled persistent indexes. + On DB-Servers, a full index reload can increase this metric by more than one, + as counting is done per shard. + On Coordinators and Agents, this metric always contains a value of zero. + +- name: rocksdb_cache_hit_rate_lifetime + introducedIn: "3.6.1" + help: | + Lifetime hit rate of the ArangoDB cache in front of RocksDB. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the lifetime hit rate of the ArangoDB in-memory + cache which is sitting in front of RocksDB. For example, the edge + cache is a part of this. The value is a ratio between `0` and `1`. + "Lifetime" means here that accounting is done from the most recent + start of the `arangod` instance. + If the hit rate is too low, you might have to little RAM available + for the in-memory caches. + +- name: rocksdb_cache_hit_rate_recent + introducedIn: "3.6.1" + help: | + Recent hit rate of the ArangoDB cache in front of RocksDB. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the recent hit rate of the ArangoDB in-memory + cache which is sitting in front of RocksDB. For example, the edge + cache is a part of this. The value is a ratio between `0` and `1`. + If the hit rate is too low, you might have to little RAM available + for the in-memory caches. + +- name: rocksdb_cache_limit + introducedIn: "3.6.1" + help: | + Global allocation limit for the ArangoDB cache in front of RocksDB. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the current global allocation limit for the + ArangoDB caches which sit in front of RocksDB. For example, the + edge cache counts towards this allocation. This global limit can + be controlled with the `--cache.size` startup option. + +- name: rocksdb_cache_migrate_tasks_duration_total + introducedIn: "3.10.11" + help: | + Total amount of time spent in 'migrate' tasks of the in-memory + cache subsystem. + unit: us + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total amount of time spent inside 'migrate' tasks of the in-memory + cache subsystem. 'migrate' tasks are scheduled by the cache subsystem + to migrate existing cache hash tables to a bigger or smaller table. + +- name: rocksdb_cache_migrate_tasks_total + introducedIn: "3.10.11" + help: | + Total number of 'migrate' tasks scheduled by the in-memory + cache subsystem. + unit: number + type: counter + category: Statistics + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + Total number of 'migrate' tasks that were scheduled by the + in-memory edge cache subsystem. This metric will be increased + whenever the cache subsystem schedules a task to migrate an + existing cache hash table to a bigger or smaller size. + +- name: rocksdb_cache_peak_allocated + introducedIn: "3.10.7" + help: | + Global peak memory allocation of ArangoDB in-memory caches. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the peak global allocation for the ArangoDB + in-memory cache which sits in front of RocksDB. It records the peak value + of the metric `rocksdb_cache_allocated` during the lifetime of the + arangod instance. + +- name: rocksdb_cache_unused_memory + introducedIn: "3.10.0" + help: | + Global current memory allocation of inactive/reserve hash tables in ArangoDB cache. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the current memory allocation for unused hash tables + used by the in-memory cache which sits in front of RocksDB. Unused tables + can be kept as backups to provide new, readily initialized tables for new + caches. The overall memory usage of unused tables is capped by the system, + so it does not grow overly large. + +- name: rocksdb_cache_unused_tables + introducedIn: "3.10.0" + help: | + Global current number of inactive/reserve hash tables in ArangoDB cache. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reflects the current number of unused hash tables used by the + in-memory cache which sits in front of RocksDB. Unused tables can be kept as + backups to provide new, readily initialized tables for new caches. + Unused tables can consume some memory, but the overall memory usage of + unused tables is capped. + +- name: rocksdb_compaction_pending + introducedIn: "3.6.1" + help: | + Number of RocksDB column families with pending compaction. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `compaction-pending`. + It shows the number of column families for which at least one compaction + is pending. + +- name: rocksdb_compression_ratio_at_level0 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 0. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 0 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 0. + +- name: rocksdb_compression_ratio_at_level1 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 1. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 1 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 1. + +- name: rocksdb_compression_ratio_at_level2 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 2. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 2 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 2. + +- name: rocksdb_compression_ratio_at_level3 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 3. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 3 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 3. + +- name: rocksdb_compression_ratio_at_level4 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 4. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 4 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 4. + +- name: rocksdb_compression_ratio_at_level5 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 5. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 5 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 5. + +- name: rocksdb_compression_ratio_at_level6 + introducedIn: "3.6.1" + help: | + RocksDB compression ratio at level 6. + unit: ratio + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the compression ratio of data at level 6 in RocksDB's + log structured merge tree. Here, compression + ratio is defined as uncompressed data size / compressed file size. + Returns `-1.0` if there are no open files at level 6. + +- name: rocksdb_cur_size_active_mem_table + introducedIn: "3.6.1" + help: | + Approximate size of RocksDB's active memtable. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-cur-size-active-mem-table`. + It shows the approximate size of the active memtable in bytes, summed + over all column families. + +- name: rocksdb_cur_size_all_mem_tables + introducedIn: "3.6.1" + help: | + Approximate size of all active and unflushed RocksDB memtables. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-cur-size-all-mem-tables`. + It shows the approximate size of active and unflushed immutable memtables + in bytes, summed over all column families. + +- name: rocksdb_engine_throttle_bps + renamedFrom: rocksdbengine_throttle_bps + introducedIn: "3.8.0" + help: | + Current rate of the RocksDB throttle in bytes per second. + unit: bytes per second + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exposes the current write rate limit of the ArangoDB + RocksDB throttle. The throttle limits the write rate to allow + RocksDB's background threads to catch up with compactions and not + fall behind too much, since this would in the end lead to nasty + write stops in RocksDB and incur considerable delays. If `0` is + shown, no throttling happens, otherwise, you see the current + write rate limit in bytes per second. Also see the `--rocksdb.*` + startup options. + +- name: rocksdb_estimate_live_data_size + introducedIn: "3.6.1" + help: | + Estimated amount of live RocksDB data. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-estimate-live-data-size`. + It shows an estimate of the amount of live data in bytes, summed over + all column families. + +- name: rocksdb_estimate_num_keys + introducedIn: "3.6.1" + help: | + Estimated number of RocksDB keys. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-estimate-num-keys`. + It shows the estimated number of total keys in the active and unflushed + immutable memtables and storage, summed over all column families. + +- name: rocksdb_estimate_pending_compaction_bytes + introducedIn: "3.6.1" + help: | + Estimated number of bytes awaiting RocksDB compaction. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric + `rocksdb-estimate-pending-compaction-bytes`. + It shows the estimated total number of bytes compaction needs to + rewrite to get all levels down to under target size. Not valid for + other compactions than level-based. This value is summed over all + column families. + +- name: rocksdb_estimate_table_readers_mem + introducedIn: "3.6.1" + help: | + Estimated memory usage for reading RocksDB SST tables. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric + `rocksdb-estimate-table-readers-mem`. + It shows the estimated memory used for reading SST tables, excluding + memory used in block cache (e.g. filter and index blocks), summed over + all column families. + +- name: rocksdb_free_disk_space + introducedIn: "3.8.0" + help: | + Free disk space in bytes on volume used by RocksDB. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric shows the currently free disk space in bytes on the volume + which is used by RocksDB. Since RocksDB does not like out of disk + space scenarios, please make sure that there is enough free disk space + available at all times! Note that this metric is only available/populated on some platforms. + +- name: rocksdb_free_inodes + introducedIn: "3.8.0" + help: | + Number of free inodes on the volume used by RocksDB. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric shows the currently free number of inodes on the disk volume + used by RocksDB. Since RocksDB does not like out of disk space + scenarios, please make sure that there is enough free inodes available + at all times! Note that this metric is only available/populated on some platforms. + +- name: rocksdb_is_file_deletions_enabled + introducedIn: "3.6.1" + help: | + Whether RocksDB file deletion is enabled. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-is-file-deletions-enabled`. + It shows `0` if deletion of obsolete files is enabled, and otherwise, + it shows a non-zero number. Note that for ArangoDB, this is supposed + to always return `1`, since the deletion of obsolete WAL files is done + from ArangoDB, externally to RocksDB. + +- name: rocksdb_is_write_stopped + introducedIn: "3.6.1" + help: | + Whether RocksDB writes are stopped. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-is-write-stopped`. + It shows `1` if writing to RocksDB has been stopped, and otherwise 0. + If `1` is shown, this usually means that there are too many uncompacted + files and the RocksDB background threads have not managed to keep up + with their compaction work. This situation should be avoided, since + nasty delays in database operations are incurred. If in doubt, + contact ArangoDB support. + +- name: rocksdb_live_sst_files_size + introducedIn: "3.6.1" + help: | + Size of live RocksDB SST files. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-live-sst-files-size`. + It shows the total size in bytes of all SST files belonging to the latest + LSM tree, summed over all column families. + +- name: rocksdb_live_wal_files + introducedIn: "3.9.10" + help: | + Number of live RocksDB WAL files. + unit: number + type: gauge + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the total number of live RocksDB WAL files. These are + WAL files that cannot be garbage-collected until they are moved over to the + archive. + +- name: rocksdb_live_wal_files_size + introducedIn: "3.9.11" + help: | + Cumulated live RocksDB WAL files. + unit: bytes + type: gauge + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the cumulated size of live RocksDB WAL files on disk. + WAL files that cannot be garbage-collected until they are moved over to the + archive. + +- name: rocksdb_mem_table_flush_pending + introducedIn: "3.6.1" + help: | + Number of RocksDB column families awaiting memtable flush. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `mem-table-flush-pending`. It + shows the number of column families for which a memtable flush is + pending. + +- name: rocksdb_min_log_number_to_keep + introducedIn: "3.6.1" + help: | + Minimum number of RocksDB log files to keep. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-min-log-number-to-keep`. + It shows the minimum log number of the log files that should be kept. + +- name: rocksdb_num_deletes_active_mem_table + introducedIn: "3.6.1" + help: | + Number of deletes in active RocksDB memtable. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric + `rocksdb-num-deletes-active-mem-table`. + It shows the total number of delete entries in the active memtable, + summed over all column families. + +- name: rocksdb_num_deletes_imm_mem_tables + introducedIn: "3.6.1" + help: | + Number of deletes in unflushed immutable RocksDB memtables. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric + `rocksdb-num-deletes-imm-mem-tables`. + It shows the total number of delete entries in the unflushed immutable + memtables, summed over all column families. + +- name: rocksdb_num_entries_active_mem_table + introducedIn: "3.6.1" + help: | + Number of entries in the active RocksDB memtable. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric + `rocksdb-num-entries-active-mem-table`. + It shows the total number of entries in the active memtable, + summed over all column families. + +- name: rocksdb_num_entries_imm_mem_tables + introducedIn: "3.6.1" + help: | + Number of entries in unflushed immutable RocksDB memtables. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric + `rocksdb-num-entries-imm-mem-tables`. + It shows the total number of entries in the unflushed immutable memtables, + summed over all column families. + +- name: rocksdb_num_files_at_level0 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 0. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 0 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_files_at_level1 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 1. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 1 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_files_at_level2 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 2. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 2 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_files_at_level3 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 3. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 3 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_files_at_level4 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 4. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 4 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_files_at_level5 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 5. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 5 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_files_at_level6 + introducedIn: "3.6.1" + help: | + Number of RocksDB files at level 6. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of files at level 6 in the log structured + merge tree of RocksDB. + +- name: rocksdb_num_immutable_mem_table + introducedIn: "3.6.1" + help: | + Number of unflushed immutable RocksDB memtables. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `num-immutable-mem-table`, + which shows the number of immutable memtables that have not yet been + flushed. This value is the sum over all column families. + + Memtables are sorted tables of key/value pairs which begin + to be built up in memory. At some stage they are closed and become + immutable, and some time later they are flushed to disk. + +- name: rocksdb_num_immutable_mem_table_flushed + introducedIn: "3.6.1" + help: | + Number of flushed immutable RocksDB memtables. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `num-immutable-mem-table-flushed`, + which shows the number of immutable memtables that have already been + flushed. This value is the sum over all column families. + + Memtables are sorted tables of key/value pairs which begin + to be built up in memory. At some stage they are closed and become + immutable, and some time later they are flushed to disk. + +- name: rocksdb_num_live_versions + introducedIn: "3.6.1" + help: | + Number of live RocksDB versions. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-num-live-versions`. + It shows the number of live versions. `Version` is an internal data + structure. See `version_set.h` in the RocksDB source for details. More + live versions often mean more SST files are held from being deleted, + by iterators or unfinished compactions. This number is the number + summed up over all column families. + +- name: rocksdb_num_running_compactions + introducedIn: "3.6.1" + help: | + Number of running RocksDB compactions. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-num-running-compactions`. + It shows the number of currently running compactions. + +- name: rocksdb_num_running_flushes + introducedIn: "3.6.1" + help: | + Number of running RocksDB flushes. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-num-running-flushes`. + It shows the number of currently running flushes. + +- name: rocksdb_num_snapshots + introducedIn: "3.6.1" + help: | + Number of unreleased RocksDB snapshots. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-num-snapshots`. + It shows the number of unreleased snapshots of the database. + +- name: rocksdb_oldest_snapshot_time + introducedIn: "3.6.1" + help: | + Timestamp of oldest unreleased RocksDB snapshot. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-oldest-snapshot-time`. + It shows a number representing the Unix timestamp of the oldest + unreleased snapshot. + +- name: rocksdb_prunable_wal_files + introducedIn: "3.8.2" + help: | + Number of prunable RocksDB WAL files in the archive. + unit: number + type: gauge + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the total number of RocksDB WAL files in the + "archive" subdirectory that can be pruned. These are WAL files that + can be pruned by a background thread to reclaim disk space. + +- name: rocksdb_read_only + introducedIn: "3.8.1" + help: | + RocksDB metric "background-errors". + unit: number + type: gauge + category: RocksDB + complexity: simple + exposedBy: + - dbserver + - agent + - single + description: | + This metric indicates whether RocksDB currently is in read-only + mode, due to a background error. If RocksDB is in read-only mode, + this metric has a value of `1`. When in read-only mode, all + writes into RocksDB fail. When RocksDB is in normal operations + mode, this metric has a value of `0`. + troubleshoot: | + If this value is non-zero, it means that all write operations in + RocksDB fail until the RocksDB background error is resolved. + The arangod server logfile should show more details about the exact + errors that are happening, so logs should be inspected first. + RocksDB can set a background error when some I/O operation fails. + This is often due to disk space usage issues, so often either freeing + disk space or increasing the disk capacity help. + Under some conditions, RocksDB can automatically resume from the + background error and go back into normal operations. However, if the + background error happens during certain RocksDB operations, it cannot + resume operations automatically, so the instance needs a manual + restart after the error condition is removed. + +- name: rocksdb_size_all_mem_tables + introducedIn: "3.6.1" + help: | + Approximate size of all RocksDB memtables. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-size-all-mem-tables`. + It shows the approximate size of all active, unflushed immutable, and + pinned immutable memtables in bytes, summed over all column families. + +- name: rocksdb_total_disk_space + introducedIn: "3.8.0" + help: | + Used disk space in bytes on volume used by RocksDB. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric shows the currently used disk space in bytes on the volume + which is used by RocksDB. Since RocksDB does not like out of disk + space scenarios, please make sure that there is enough free disk space + available at all times! Note that this metric is only available/populated on some platforms. + +- name: rocksdb_total_inodes + introducedIn: "3.8.0" + help: | + Number of used inodes on the volume used by RocksDB. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric shows the currently used number of inodes on the disk volume + used by RocksDB. Since RocksDB does not like out of disk space + scenarios, please make sure that there are enough free inodes available + at all times! Note that this metric is only available/populated on some platforms. + +- name: rocksdb_total_sst_files + introducedIn: "3.11.1" + help: | + Total number of RocksDB sst files, aggregated over all levels. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric reports the number of sst files of the log structured + merge tree of RocksDB, aggregated over all levels. + +- name: rocksdb_total_sst_files_size + introducedIn: "3.6.1" + help: | + Size of all RocksDB SST files. + unit: bytes + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exhibits the RocksDB metric `rocksdb-total-sst-files-size`. + It shows the total size in bytes of all SST files, summed over all + column families. + +- name: rocksdb_wal_pruning_active + introducedIn: "3.8.2" + help: | + Whether or not the pruning of archived RocksDB WAL files is currently + activated. + unit: number + type: gauge + category: RocksDB + complexity: medium + exposedBy: + - dbserver + - agent + - single + description: | + This metric contains a value of `0` if the pruning of archived RocksDB WAL + files is not activated, and `1` if it is activated. + WAL file pruning is normally deactivated for the first few minutes after + an instance is started, so that other instances in the cluster can start + replicating from the instance before all archived WAL files are deleted. + The value should flip from `0` to `1` a few minutes after server start. + +- name: rocksdb_wal_released_tick_flush + introducedIn: "3.9.10" + help: | + Lower bound sequence number from which WAL files need to be kept because + of external flushing needs. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exposes the RocksDB WAL sequence number from which onwards + WAL files have to be kept because the WAL data could be used by external + flushing needs. WAL files with sequence numbers higher than this value + are not garbage-collected. + The candidates that can keep WAL files from being garbage-collected are + `arangosearch` View links or inverted indexes that are still syncing data, + and background index creation. + +- name: rocksdb_wal_released_tick_replication + introducedIn: "3.9.10" + help: | + Lower bound sequence number from which WAL files need to be kept because + of replication. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exposes the RocksDB WAL sequence number from which onwards + WAL files have to kept in the archive because the WAL data could be used + by the replication. + WAL files with sequence numbers higher than this value are not + garbage-collected. + +- name: rocksdb_wal_sequence + introducedIn: "3.8.5" + help: | + Current RocksDB WAL sequence number. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exposes the current RocksDB WAL sequence number. Any + write operations into the database increases the sequence number. + +- name: rocksdb_wal_sequence_lower_bound + introducedIn: "3.8.2" + help: | + RocksDB sequence number until which the background sync thread + has caught up. + unit: number + type: gauge + category: RocksDB + complexity: advanced + exposedBy: + - dbserver + - agent + - single + description: | + This metric exposes the RocksDB WAL sequence number until which the + ArangoDB background sync thread has fully caught up to. The value exposed + here should be monotonically increasing and always progress if there are + write operations executing. + diff --git a/site/data/oem/arangobackup.json b/site/data/oem/arangobackup.json new file mode 100644 index 0000000000..ab4b4d6793 --- /dev/null +++ b/site/data/oem/arangobackup.json @@ -0,0 +1,1349 @@ +{ + "abort" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Abort the transfer with the given status-id (upload/download operation).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "allow-inconsistent" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to attempt to continue in face of errors; may result in inconsistent backup state (create operation).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "force" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Abort transactions if needed to ensure a consistent snapshot. This option can destroy the atomicity of your transactions in the presence of intermediate commits! Use it with great care and only if you really need a consistent backup at all costs (create operation).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "identifier" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "a unique identifier for a backup (restore/upload/download operation)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "ignore-version" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Ignore stored version of a backup. Restore may not work if versions mismatch (restore operation).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "label" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "An additional label to add to the backup identifier (create operation)-", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "max-wait-for-lock" : { + "base" : 1, + "category" : "option", + "default" : 60, + "deprecatedIn" : null, + "description" : "The maximum time to wait (in seconds) to acquire a lock on all necessary resources (create operation).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "double" + }, + "max-wait-for-restart" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum time to wait (in seconds) for the server to restart after a restore operation before reporting an error; if zero, arangobackup does not wait to check that the server restarts and simply returns the result of the restore request (restore operation).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "double" + }, + "operation" : { + "category" : "option", + "default" : "list", + "deprecatedIn" : null, + "description" : "The operation to perform (may be specified as positional argument without '--operation').", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"create\", \"delete\", \"download\", \"list\", \"restore\", \"upload\"" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "rclone-config-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A path to the rclone configuration file to use forfile transfer (upload/download operation).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "remote-path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The remote rclone path of a directory to use to store or receive backups (upload/download operation).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "status-id" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Return the status of a transfer process (upload/download operation).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangobench.json b/site/data/oem/arangobench.json new file mode 100644 index 0000000000..6e6ae3b3a2 --- /dev/null +++ b/site/data/oem/arangobench.json @@ -0,0 +1,1738 @@ +{ + "async" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Send asynchronous requests.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "batch-size" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "The number of operations in one batch (0 = disable batching)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "collection" : { + "category" : "option", + "default" : "ArangoBenchmark", + "deprecatedIn" : null, + "description" : "The collection name to use in tests (if they involve collections).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "complexity" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The complexity parameter for the test (meaning depends on test case).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "create-collection" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to create the collection specified via the `--collection` option.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "create-database" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to create the database specified via the `--server.database` option.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "custom-query" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The query to be used in the \"custom-query\" test case.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "custom-query-bindvars" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The bind parameters to be used in the \"custom-query\" test case.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "custom-query-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A path to the file with the query to use in the \"custom-query\" test case. If `--custom-query` is specified as well, it has higher priority.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "delay" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use a startup delay (necessary only when run in series).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "duration" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "Test for a duration of this many seconds instead of a fixed test count.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "histogram.generate" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Display a histogram.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "histogram", + "type" : "boolean" + }, + "histogram.interval-size" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "The bucket width, dynamically calculated by default: `(first measured time * 20) / num-intervals`.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "histogram", + "type" : "double" + }, + "histogram.num-intervals" : { + "base" : 1, + "category" : "option", + "default" : 1000, + "deprecatedIn" : null, + "description" : "The number of buckets (resolution).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "histogram", + "type" : "uint64" + }, + "histogram.percentiles" : { + "category" : "option", + "default" : [ + 50, + 80, + 85, + 90, + 95, + 99, + 99.99 + ], + "deprecatedIn" : null, + "description" : "Which percentiles to calculate.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "histogram", + "type" : "double..." + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "json-report-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The filename to write a report in JSON format to.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "junit-report-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The filename to write junit-style report to.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "keep-alive" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use HTTP keep-alive.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "number-of-shards" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The number of shards of created collections (cluster only).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "progress" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log intermediate progress.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "quiet" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "suppress status messages", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "replication-factor" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The replication factor of created collections (cluster only).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "requests" : { + "base" : 1, + "category" : "option", + "default" : 1000, + "deprecatedIn" : null, + "description" : "The total number of operations.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "runs" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "Run test this many times (and calculate statistics based on the median).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "temp.path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "test-case" : { + "category" : "option", + "default" : "version", + "deprecatedIn" : null, + "description" : "The test case to use.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"aqlinsert\", \"collection\", \"crud\", \"crud-append\", \"crud-write-read\", \"custom-query\", \"document\", \"edge\", \"import-document\", \"persistent-index\", \"version\"" + }, + "threads" : { + "base" : 1, + "category" : "option", + "default" : 8, + "deprecatedIn" : null, + "description" : "The number of parallel threads and connections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "wait-for-sync" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use waitForSync for created collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangod.json b/site/data/oem/arangod.json new file mode 100644 index 0000000000..8b192d8c97 --- /dev/null +++ b/site/data/oem/arangod.json @@ -0,0 +1,14457 @@ +{ + "agency.activate" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Activate the Agency.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "agency", + "type" : "boolean" + }, + "agency.compaction-keep-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 50000, + "deprecatedIn" : null, + "description" : "Keep as many Agency log entries before compaction point.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.compaction-step-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 1000, + "deprecatedIn" : null, + "description" : "The step size between state machine compactions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.disaster-recovery-id" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Specify the ID for this agent. WARNING: This is a dangerous option, for disaster recover only!", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "string" + }, + "agency.election-timeout-max" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 5, + "deprecatedIn" : null, + "description" : "The maximum timeout before an Agent calls for a new election (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "double" + }, + "agency.election-timeout-min" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The minimum timeout before an Agent calls for a new election (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : false, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "double" + }, + "agency.endpoint" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "The Agency endpoints.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "string..." + }, + "agency.max-append-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 250, + "deprecatedIn" : null, + "description" : "The maximum size of appendEntries document (number of log entries).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.my-address" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Which address to advertise to the outside.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "string" + }, + "agency.pool-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 1, + "deprecatedIn" : [ + "v3.11.0" + ], + "description" : "The number of Agents in the pool.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.size" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The number of Agents.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.supervision" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Perform ArangoDB cluster supervision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "agency", + "type" : "boolean" + }, + "agency.supervision-delay-add-follower" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The delay in supervision, before an AddFollower job is executed (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.6", + "v3.10.2" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.supervision-delay-failed-follower" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The delay in supervision, before a FailedFollower job is executed (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.6", + "v3.10.2" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "uint64" + }, + "agency.supervision-failed-leader-adds-follower" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Flag indicating whether or not the FailedLeader job adds a new follower.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.7", + "v3.10.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "agency", + "type" : "boolean" + }, + "agency.supervision-frequency" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The ArangoDB cluster supervision frequency (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "double" + }, + "agency.supervision-grace-period" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The supervision time after which a server is considered to have failed (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "A value of `10` seconds is recommended for regular\ncluster deployments. For Active Failover deployments, it is recommended to use a\nhigher value for the grace period to avoid unnecessary failovers.\n\nIn Active Failover setups, the leader server needs to handle all the load and is\nthus expected to get overloaded and unresponsive more easily than a server in a\nregular cluster, which needs to handle only a part of the overall load.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "double" + }, + "agency.supervision-ok-threshold" : { + "base" : 1, + "category" : "option", + "component" : [ + "agent" + ], + "default" : 5, + "deprecatedIn" : null, + "description" : "The supervision time after which a server is considered to be bad (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "agency", + "type" : "double" + }, + "agency.wait-for-sync" : { + "category" : "option", + "component" : [ + "agent" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Wait for hard disk syncs on every persistence call (required in production).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "agency", + "type" : "boolean" + }, + "arangosearch.columns-cache-limit" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The limit (in bytes) for ArangoSearch columns cache (0 = no caching).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint64" + }, + "arangosearch.columns-cache-only-leader" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Cache ArangoSearch columns only for leader shards.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.6" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "arangosearch", + "type" : "boolean" + }, + "arangosearch.commit-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The upper limit to the allowed number of commit threads (0 = auto-detect).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.5" + ], + "longDescription" : "The option value must fall in the range\n`[ 1..4 * NumberOfCores ]`. Set it to `0` to automatically choose a sensible\nnumber based on the number of cores in the system.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.commit-threads-idle" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The upper limit to the allowed number of idle threads to use for commit tasks (0 = auto-detect)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.5" + ], + "longDescription" : "The option value must fall in the range\n`[ 1..arangosearch.commit-threads ]`. Set it to `0` to automatically choose a\nsensible number based on the number of cores in the system.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.consolidation-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The upper limit to the allowed number of consolidation threads (0 = auto-detect).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.5" + ], + "longDescription" : "The option value must fall in the range\n`[ 1..arangosearch.consolidation-threads ]`. Set it to `0` to automatically\nchoose a sensible number based on the number of cores in the system.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.consolidation-threads-idle" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The upper limit to the allowed number of idle threads to use for consolidation tasks (0 = auto-detect).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.5" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.default-parallelism" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "Default parallelism for ArangoSearch queries", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.6" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.execution-threads-limit" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Max number of threads that could be used to process ArangoSearch indexes during SEARCH operation", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.6" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.fail-queries-on-out-of-sync" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether retrieval queries on out-of-sync View links and inverted indexes should fail.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "If set to `true`, any data retrieval queries on\nout-of-sync links/indexes fail with the error 'collection/view is out of sync'\n(error code 1481).\n\nIf set to `false`, queries on out-of-sync links/indexes are answered normally,\nbut the returned data may be incomplete.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "arangosearch", + "type" : "boolean" + }, + "arangosearch.skip-recovery" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Skip the data recovery for the specified View link or inverted index on startup. The value for this option needs to have the format '<collection-name>/<index-id>' or '<collection-name>/<index-name>'. You can use the option multiple times, for each View link and inverted index to skip the recovery for. The pseudo-value 'all' disables the recovery for all View links and inverted indexes. The links/indexes skipped during the recovery are marked as out-of-sync when the recovery completes. You need to recreate them manually afterwards.\nWARNING: Using this option causes data of affected links/indexes to become incomplete or more incomplete until they have been manually recreated.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "string..." + }, + "arangosearch.threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : [ + "v3.7.5" + ], + "description" : "The exact number of threads to use for asynchronous tasks (0 = auto-detect).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "From version 3.7.5 on, you should set the commit\nand consolidation thread counts separately via the following options instead:\n\n- `--arangosearch.commit-threads`\n- `--arangosearch.commit-threads-idle`\n- `--arangosearch.consolidation-threads`\n- `--arangosearch.consolidation-threads-idle`\n\nIf either `--arangosearch.commit-threads` or\n`--arangosearch.consolidation-threads` is set, then `--arangosearch.threads` and\n`arangosearch.threads-limit` are ignored. If only the legacy options are set,\nthen the commit and consolidation thread counts are calculated as follows:\n\n- Maximum: The smaller value out of `--arangosearch.threads` and\n `arangosearch.threads-limit` divided by 2, but at least 1.\n- Minimum: the maximum divided by 2, but at least 1.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "arangosearch.threads-limit" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : [ + "v3.7.5" + ], + "description" : "The upper limit to the auto-detected number of threads to use for asynchronous tasks (0 = use default).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "From version 3.7.5 on, you should set the commit\nand consolidation thread counts separately via the following options instead:\n\n- `--arangosearch.commit-threads`\n- `--arangosearch.commit-threads-idle`\n- `--arangosearch.consolidation-threads`\n- `--arangosearch.consolidation-threads-idle`\n\nIf either `--arangosearch.commit-threads` or\n`--arangosearch.consolidation-threads` is set, then `--arangosearch.threads` and\n`arangosearch.threads-limit` are ignored. If only the legacy options are set,\nthen the commit and consolidation thread counts are calculated as follows:\n\n- Maximum: The smaller value out of `--arangosearch.threads` and\n `arangosearch.threads-limit` divided by 2, but at least 1.\n- Minimum: the maximum divided by 2, but at least 1.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "arangosearch", + "type" : "uint32" + }, + "audit.hostname" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The server name to be used in audit log messages. By default, the system hostname is used.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "audit", + "type" : "string" + }, + "audit.max-entry-length" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0", + "v3.7.9" + ], + "longDescription" : "You can use this option to limit the maximum line\nlength for individual audit log messages that are written into audit logs by\narangod.\n\nAny audit log messages longer than the specified value are truncated and the\nsuffix `...` is appended to them.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of audit log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "audit", + "type" : "uint32" + }, + "audit.output" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Specifies the target(s) of the audit log.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "To write to a file, use `file://<filename>` with a\nrelative or absolute file path.\n\nTo write to a syslog server, use `syslog://<facility>` or\n`syslog://<facility>/<application-name>`.\n\nYou can specify this option multiple times to configure the output for multiple\ntargets.\n\nAny occurrence of `$PID` inside a filename is replaced with the actual process\nID at runtime. This allows you to log to process-specific files, e.g.\n`--audit.output file:///var/log/arangod.log.$PID`. Note that your terminal may\nrequire the dollar sign to be escaped.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "audit", + "type" : "string..." + }, + "audit.queue" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Queue audit log messages before writing them out (can reduce latency).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can control whether audit log messages are\nsubmitted to a queue and written to disk in batches or if they should be written\nto disk directly without being queued with this option.\n\nQueueing audit log entries may be beneficial for latency, but can lead to\nunqueued messages being lost in case of a crash or power loss. Setting this\noption to `false` mimics the behavior of version 3.7 and before, where audit log\nmessages were not queued but written in a blocking fashion.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "audit", + "type" : "boolean" + }, + "audit.write-log-level" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Add the log level of the audit event (TRACE, INFO, DEBUG, WARNING, ERROR) to audit log messages.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "You can control whether the log level is shown in\nthe audit log messages with this option. If you omit it or set it to `false`,\nthe log level is not shown in messages:\n\n`2016-10-03 15:47:26 | server1 | audit-authentication | n/a | database1 |\n127.0.0.1:61528 | http basic | credentials wrong | /_api/version`\n\nIf you set the option to `true`, the log level is included in the messages:\n\n`2016-10-03 15:47:26 | INFO | server1 | audit-authentication | n/a |\ndatabase1 | 127.0.0.1:61528 | http basic | credentials wrong |\n/_api/version`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "audit", + "type" : "boolean" + }, + "backup.api-enabled" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "true", + "deprecatedIn" : null, + "description" : "Whether the Hot Backup API is enabled (true) or not (false), or only enabled for superuser JWT (jwt).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "backup", + "type" : "string" + }, + "backup.files-per-batch" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 100, + "deprecatedIn" : null, + "description" : "Define how many files rclone should process in one call when uploading or downloading Hot Backups.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.8", + "v3.9.4" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "backup", + "type" : "uint64" + }, + "backup.local-path-prefix" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "/", + "deprecatedIn" : null, + "description" : "Restrict any backup target to the given path prefix.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "backup", + "type" : "string" + }, + "backup.number-parallel-remote-copies" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The number of remote-to-remote copy operations to run in parallel when uploading/downloading Hot Backups (0 = use system-specific default of 100)", + "dynamic" : true, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.4" + ], + "longDescription" : "This is to speed up the incremental upload process. Note that each instance needs approx. 7 to 10 MB of RAM in addition to `arangod`. The default should normally be OK for most situations.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "backup", + "type" : "uint32" + }, + "cache.acceleration-factor-for-edge-compression" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The acceleration factor for the LZ4 compression of in-memory edge cache entries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.2" + ], + "longDescription" : "This value controls the LZ4-internal acceleration factor for the \nLZ4 compression. Higher values typically yield less compression in exchange\nfor faster compression and decompression speeds. An increase of 1 commonly leads\nto a compression speed increase of 3%, and could slightly increase decompression\nspeed.", + "maxInclusive" : true, + "maxValue" : 65537, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "uint32" + }, + "cache.high-water-multiplier" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0.56, + "deprecatedIn" : null, + "description" : "The multiplier to be used for calculating the in-memory cache's effective memory usage limit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.3" + ], + "longDescription" : "This value controls the cache's effective memory usage limit.\nThe user-defined memory limit (i.e. `--cache.size`) is multipled with this\nvalue to create the effective memory limit, from which on the cache will \ntry to free up memory by evicting the oldest entries.", + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0.1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "double" + }, + "cache.ideal-lower-fill-ratio" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0.04, + "deprecatedIn" : null, + "description" : "The lower bound fill ratio value for a cache table.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.2" + ], + "longDescription" : "Cache tables with a fill ratio lower than this\nvalue will be shrunk by the cache rebalancer.", + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "double" + }, + "cache.ideal-upper-fill-ratio" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0.25, + "deprecatedIn" : null, + "description" : "The upper bound fill ratio value for a cache table.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.2" + ], + "longDescription" : "Cache tables with a fill ratio higher than this\nvalue will be inflated in size by the cache rebalancer.", + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "double" + }, + "cache.max-spare-memory-usage" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 67108864, + "deprecatedIn" : null, + "description" : "The maximum memory usage for spare tables in the in-memory cache.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.3" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "uint64" + }, + "cache.min-value-size-for-edge-compression" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The size threshold (in bytes) from which on payloads in the edge index cache transparently get LZ4-compressed.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.2" + ], + "longDescription" : "By transparently compressing values in the in-memory\nedge index cache, more data can be held in memory than without compression. \nStoring compressed values can increase CPU usage for the on-the-fly compression \nand decompression. In case compression is undesired, this option can be set to a \nvery high value, which will effectively disable it. To use compression, set the\noption to a value that is lower than medium-to-large average payload sizes.\nIt is normally not that useful to compress values that are smaller than 100 bytes.", + "maxInclusive" : true, + "maxValue" : 1073741824, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "uint64" + }, + "cache.rebalancing-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 2000000, + "deprecatedIn" : null, + "description" : "The time between cache rebalancing attempts (in microseconds). The minimum value is 500000 (0.5 seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The server uses a cache system which pools memory\nacross many different cache tables. In order to provide intelligent internal\nmemory management, the system periodically reclaims memory from caches which are\nused less often and reallocates it to caches which get more activity.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 500000, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "uint64" + }, + "cache.size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 7735569408, + "deprecatedIn" : null, + "description" : "The global size limit for all caches (in bytes).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The global caching system, all caches, and all the\ndata contained therein are constrained to this limit.\n\nIf there is less than 4 GiB of RAM in the system, default value is 256 MiB.\nIf there is more, the default is `(system RAM size - 2 GiB) * 0.25`.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cache", + "type" : "uint64" + }, + "check-configuration" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "cluster.agency-endpoint" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Agency endpoint(s) to connect to.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can specify this option multiple times to let\nthe server use a cluster of Agency servers.\n\nEndpoints have the following pattern:\n\n- `tcp://ipv4-address:port` - TCP/IP endpoint, using IPv4\n- `tcp://[ipv6-address]:port` - TCP/IP endpoint, using IPv6\n- `ssl://ipv4-address:port` - TCP/IP endpoint, using IPv4, SSL encryption\n- `ssl://[ipv6-address]:port` - TCP/IP endpoint, using IPv6, SSL encryption\n\nYou must specify at least one endpoint or ArangoDB refuses to start. It is\nrecommended to specify at least two endpoints, so that ArangoDB has an\nalternative endpoint if one of them becomes unavailable:\n\n`--cluster.agency-endpoint tcp://192.168.1.1:4001\n--cluster.agency-endpoint tcp://192.168.1.2:4002 ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "string..." + }, + "cluster.api-jwt-policy" : { + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : "jwt-compat", + "deprecatedIn" : null, + "description" : "Controls the access permissions required for accessing /_admin/cluster REST APIs (jwt-all = JWT required to access all operations, jwt-write = JWT required for POST/PUT/DELETE operations, jwt-compat = 3.7 compatibility mode)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "The possible values for the option are:\n\n- `jwt-all`: requires a valid JWT for all accesses to `/_admin/cluster` and its\n sub-routes. If you use this configuration, the **CLUSTER** and **NODES**\n sections of the web interface are disabled, as they rely on the ability to\n read data from several cluster APIs.\n\n- `jwt-write`: requires a valid JWT for write accesses (all HTTP methods except\n GET) to `/_admin/cluster`. You can use this setting to allow privileged users\n to read data from the cluster APIs, but not to do any modifications.\n Modifications (carried out by write accesses) are then only possible by\n requests with a valid JWT.\n\n All existing permission checks for the cluster API routes are still in effect\n with this setting, meaning that read operations without a valid JWT may still\n require dedicated other permissions (as in v3.7).\n\n- `jwt-compat`: no **additional** access checks are in place for the cluster\n APIs. However, all existing permissions checks for the cluster API routes are\n still in effect with this setting, meaning that all operations may still\n require dedicated other permissions (as in v3.7).\n\nThe default value is `jwt-compat`, which means that this option does not cause\nany extra JWT checks compared to v3.7.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "string", + "values" : "Possible values: \"jwt-all\", \"jwt-compat\", \"jwt-write\"" + }, + "cluster.connectivity-check-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver" + ], + "default" : 3600, + "deprecatedIn" : null, + "description" : "The interval (in seconds) in which cluster-internal connectivity checks are performed.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.4" + ], + "longDescription" : "Setting this option to a value greater than\nzero makes Coordinators and DB-Servers run period connectivity checks\nwith approximately the specified frequency. The first connectivity check\nis carried out approximately 15 seconds after server start.\nNote that a random delay is added to the interval on each server, so that\ndifferent servers do not execute their connectivity checks all at the\nsame time.\nSetting this option to a value of zero disables these connectivity checks.\"", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.create-waits-for-sync-replication" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Let the active Coordinator wait for all replicas to create collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "cluster", + "type" : "boolean" + }, + "cluster.default-replication-factor" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The default replication factor for non-system collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "longDescription" : "If you don't set this option, it defaults to the\nvalue of the `--cluster.min-replication-factor` option. If set, the value must\nbe between the values of `--cluster.min-replication-factor` and\n`--cluster.max-replication-factor`.\n\nNote that you can still adjust the replication factor per collection. This value\nis only the default value used for new collections if no replication factor is\nspecified when creating a collection.\n\n**Warning**: If you use multiple Coordinators, use the same value on all\nCoordinators.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.failed-write-concern-status-code" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : 403, + "deprecatedIn" : null, + "description" : "The HTTP status code to send if a shard has not enough in-sync replicas to fulfill the write concern.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "longDescription" : "The default behavior is to return an HTTP\n`403 Forbidden` status code. You can set the option to `503` to return a\n`503 Service Unavailable`.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32", + "values" : "Possible values: 403, 503" + }, + "cluster.force-one-shard" : { + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Force the OneShard mode for all new collections.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "longDescription" : "If set to `true`, forces the cluster into creating\nall future collections with only a single shard and using the same DB-Server as\nas these collections' shards leader. All collections created this way are\neligible for specific AQL query optimizations that can improve query performance\nand provide advanced transactional guarantees.\n\n**Warning**: If you use multiple Coordinators, use the same value on all\nCoordinators.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "cluster", + "type" : "boolean" + }, + "cluster.index-create-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 259200, + "deprecatedIn" : null, + "description" : "The amount of time (in seconds) the Coordinator waits for an index to be created before giving up.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "double" + }, + "cluster.max-number-of-move-shards" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The number of shards to be moved per rebalance operation. If set to 0, no shards are moved.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option limits the maximum number of move\nshards operations that can be made when the **Rebalance Shards** button is\nclicked in the web interface. For backwards compatibility, the default value is\n`10`. A value of `0` disables the button.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.max-number-of-shards" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 1000, + "deprecatedIn" : null, + "description" : "The maximum number of shards that can be configured when creating new collections (0 = unrestricted).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.1" + ], + "longDescription" : "If you change the value of this setting and\nrestart the servers, no changes are applied to existing collections that would\nviolate the new setting.\n\n**Warning**: If you use multiple Coordinators, use the same value on all\nCoordinators.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.max-replication-factor" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The maximum replication factor for new collections (0 = unrestricted).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "longDescription" : "If you change the value of this setting and\nrestart the servers, no changes are applied to existing collections that would\nviolate the new setting.\n\n**Warning**: If you use multiple Coordinators, use the same value on all\nCoordinators.", + "maxInclusive" : true, + "maxValue" : 10, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.min-replication-factor" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The minimum replication factor for new collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "longDescription" : "If you change the value of this setting and\nrestart the servers, no changes are applied to existing collections that would\nviolate the new setting.\n\n**Warning**: If you use multiple Coordinators, use the same value on all\nCoordinators.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.my-address" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "This server's endpoint for cluster-internal communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If specified, the endpoint needs to be in one of\nthe following formats:\n\n- `tcp://ipv4-address:port` - TCP/IP endpoint, using IPv4\n- `tcp://[ipv6-address]:port` - TCP/IP endpoint, using IPv6\n- `ssl://ipv4-address:port` - TCP/IP endpoint, using IPv4, SSL encryption\n- `ssl://[ipv6-address]:port` - TCP/IP endpoint, using IPv6, SSL encryption\n\nIf you don't specify an endpoint, the server looks up its internal endpoint\naddress in the Agency. If no endpoint can be found in the Agency for the\nserver's ID, ArangoDB refuses to start.\n\n**Examples**\n\nListen only on the interface with the address `192.168.1.1`:\n\n`--cluster.my-address tcp://192.168.1.1:8530`\n\nListen on all IPv4 and IPv6 addresses which are configured on port `8530`:\n\n`--cluster.my-address ssl://[::]:8530`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "string" + }, + "cluster.my-advertised-endpoint" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "This server's advertised endpoint for external communication (optional, e.g. aan external IP address or load balancer).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If specified, the endpoint needs to be in one of\nthe following formats:\n\n- `tcp://ipv4-address:port` - TCP/IP endpoint, using IPv4\n- `tcp://[ipv6-address]:port` - TCP/IP endpoint, using IPv6\n- `ssl://ipv4-address:port` - TCP/IP endpoint, using IPv4, SSL encryption\n- `ssl://[ipv6-address]:port` - TCP/IP endpoint, using IPv6, SSL encryption\n\nIf you don't specify an advertised endpoint, no external endpoint is\nadvertised.\n\n**Examples**\n\nIf an external interface is available to this server, you can specify it to\ncommunicate with external software / drivers:\n\n`--cluster.my-advertised-endpoint tcp://some.public.place:8530`\n\nAll specifications of endpoints apply.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "string" + }, + "cluster.my-role" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "This server's role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "For a cluster, the possible values are `DBSERVER`\n(backend data server) and `COORDINATOR` (frontend server for external and \napplication access).\n\nFor Active Failover deployments, the role needs to be `SINGLE`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "string" + }, + "cluster.require-persisted-id" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If set to `true`, then the instance only starts if a UUID file is found in the database directory on startup. This ensures that the instance is started using an already existing database directory and not a new one. For the first start, you must either create the UUID file manually or set the option to `false` for the initial startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "cluster", + "type" : "boolean" + }, + "cluster.resign-leadership-on-shutdown" : { + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Create a resign leader ship job for this DB-Server on shutdown.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "cluster", + "type" : "boolean" + }, + "cluster.shard-synchronization-attempt-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1200, + "deprecatedIn" : null, + "description" : "The timeout (in seconds) for every shard synchronization attempt. Running into the timeout does not lead to a synchronization failure, but continues the synchronization shortly after. Setting a timeout can help to split the replication of large shards into smaller chunks and release snapshots on the leader earlier.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.9.2" + ], + "longDescription" : "**Warning**: If you use multiple DB-Servers, use\nthe same value on all DB-Servers.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "double" + }, + "cluster.synchronous-replication-timeout-factor" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "All synchronous replication timeouts are multiplied by this factor.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "**Warning**: If you use multiple DB-Servers, use\nthe same value on all DB-Servers.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "double" + }, + "cluster.synchronous-replication-timeout-maximum" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 3600, + "deprecatedIn" : null, + "description" : "All synchronous replication timeouts are at most this value (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "**Warning**: This option should generally remain\nuntouched and only be changed with great care!\n\nExtend or shorten the timeouts for the internal synchronous replication\nmechanism between DB-Servers. All such timeouts are affected by this change.\n\n**Warning**: If you use multiple DB-Servers, use the same value on all\nDB-Servers.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "double" + }, + "cluster.synchronous-replication-timeout-minimum" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 900, + "deprecatedIn" : null, + "description" : "All synchronous replication timeouts are at least this value (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.1" + ], + "longDescription" : "**Warning**: This option should generally remain\nuntouched and only be changed with great care!\n\nThe minimum timeout in seconds for the internal synchronous replication\nmechanism between DB-Servers. If replication requests are slow, but the servers\nare otherwise healthy, timeouts can cause followers to be dropped unnecessarily,\nresulting in costly resync operations. Increasing this value may help avoid such\nresyncs. Conversely, decreasing it may cause more resyncs, while lowering the\nlatency of individual write operations.\n\n**Warning**: If you use multiple DB-Servers, use the same value on all\nDB-Servers.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "double" + }, + "cluster.synchronous-replication-timeout-per-4k" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0.1, + "deprecatedIn" : null, + "description" : "All synchronous replication timeouts are increased by this amount per 4096 bytes (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "**Warning**: If you use multiple DB-Servers, use\nthe same value on all DB-Servers.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "double" + }, + "cluster.system-replication-factor" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The default replication factor for system collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "**Warning**: If you use multiple Coordinators, use\nthe same value on all Coordinators.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "cluster.upgrade" : { + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : "auto", + "deprecatedIn" : null, + "description" : "Perform a cluster upgrade if necessary (auto = perform an upgrade and shut down only if `--database.auto-upgrade true` is set, disable = ignore `--database.auto-upgrade` and never perform an upgrade, force = ignore `--database.auto-upgrade` and always perform an upgrade and shut down, online = always perform an upgrade but don't shut down).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "string", + "values" : "Possible values: \"auto\", \"disable\", \"force\", \"online\"" + }, + "cluster.write-concern" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The global default write concern used for writes to new collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "longDescription" : "This value is used as the default write concern\nfor databases, which in turn is used as the default for collections.\n\n**Warning**: If you use multiple Coordinators, use the same value on all\nCoordinators.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "cluster", + "type" : "uint32" + }, + "config" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "console" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Start the server with a JavaScript emergency console.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "In this exclusive emergency mode, all networking\nand HTTP interfaces of the server are disabled. No requests can be made to the\nserver in this mode, and the only way to work with the server in this mode is by\nusing the emergency console.\n\nThe server cannot be started in this mode if it is already running in this or\nanother mode.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "daemon" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Start the server as a daemon (background process). Requires --pid-file to be set.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "database.auto-upgrade" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Perform a database upgrade if necessary.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you specify this option, then the server\nperforms a database upgrade instead of starting normally.\n\nA database upgrade first compares the version number stored in the `VERSION`\nfile in the database directory with the current server version.\n\nIf the version number found in the database directory is higher than that of the\nserver, the server considers this is an unintentional downgrade and warns about\nthis. Using the server in these conditions is neither recommended nor supported.\n\nIf the version number found in the database directory is lower than that of the\nserver, the server checks whether there are any upgrade tasks to perform.\nIt then executes all required upgrade tasks and prints the status. If one of the\nupgrade tasks fails, the server exits with an error. Re-starting the server with\nthe upgrade option again triggers the upgrade check and execution until the\nproblem is fixed.\n\nWhether or not you specify this option, the server always perform a version\ncheck on startup. If you running the server with a non-matching version number\nin the `VERSION` file, the server refuses to start.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.check-version" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Check the version of the database and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.directory" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "/var/lib/arangodb3", + "deprecatedIn" : null, + "description" : "The path to the database directory.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This defines the location where all data of a\nserver is stored.\n\nMake sure the directory is writable by the arangod process. You should further\nnot use a database directory which is provided by a network filesystem such as\nNFS. The reason is that networked filesystems might cause inconsistencies when\nthere are multiple parallel readers or writers or they lack features required by\narangod, e.g. `flock()`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "database", + "type" : "string" + }, + "database.extended-names" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow most UTF-8 characters in the names of databases, collections, Views, and indexes. Once in use, this option cannot be turned off again.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.ignore-datafile-errors" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Load collections even if datafiles may contain errors.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.init-database" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Initialize an empty database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.io-heartbeat" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Perform I/O heartbeat to test the underlying volume.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.7", + "v3.9.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.max-databases" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 18446744073709551615, + "deprecatedIn" : null, + "description" : "The maximum number of databases that can exist in parallel.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.2" + ], + "longDescription" : "If the maximum number of databases is reached, no\nadditional databases can be created in the deployment. In order to create additional\ndatabases, other databases need to be removed first.\"", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "database", + "type" : "uint64" + }, + "database.password" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The initial password of the root user.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "database", + "type" : "string" + }, + "database.required-directory-state" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "any", + "deprecatedIn" : null, + "description" : "The required state of the database directory at startup (non-existing: the database directory must not exist, existing: thedatabase directory must exist, empty: the database directory must exist but be empty, populated: the database directory must exist and contain specific files already, any: any state is allowed)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "database", + "type" : "string", + "values" : "Possible values: \"any\", \"empty\", \"existing\", \"non-existing\", \"populated\"" + }, + "database.restore-admin" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Reset the admin users and set a new password.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.upgrade-check" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Skip the database upgrade if set to false.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "database.wait-for-sync" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "The default waitForSync behavior. Can be overwritten when creating a collection.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "database", + "type" : "boolean" + }, + "default-language" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : [ + "v3.10.0" + ], + "description" : "An ISO-639 language code. You can only set this option once, when initializing the database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The default language is used for sorting and\ncomparing strings. The language value is a two-letter language code (ISO-639) or\nit is composed by a two-letter language code followed by a two letter country\ncode (ISO-3166). For example: `de`, `en`, `en_US`, `en_UK`.\n\nThe default is the system locale of the platform.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "default-language-check" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Check if `--icu-language` / `--default-language` matches the stored language.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "define" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "fortune" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Show a fortune cookie on startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "foxx.allow-install-from-remote" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow installing Foxx apps from remote URLs other than GitHub.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "foxx", + "type" : "boolean" + }, + "foxx.api" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable the Foxx management REST APIs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "foxx", + "type" : "boolean" + }, + "foxx.enable" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable Foxx.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.5" + ], + "longDescription" : "If set to `false`, access to any custom Foxx \nservices in the deployment will be forbidden. Access to ArangoDB's built-in\nweb interface will still be possible though.\n\n**Note**: when setting this option to `false`, the management API for Foxx\nservices will automatically be disabled as well. This is the same as manually\nsetting the startup option `--foxx.api false`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "foxx", + "type" : "boolean" + }, + "foxx.force-update-on-startup" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Ensure that all Foxx services are synchronized before completing the startup sequence.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.10", + "v3.7.6" + ], + "longDescription" : "If set to `true`, all Foxx services in all\ndatabases are synchronized between multiple Coordinators during the startup\nsequence. This ensures that all Foxx services are up-to-date when a Coordinator\nreports itself as ready.\n\nIn case the option is set to `false` (i.e. no waiting), the Coordinator\ncompletes the startup sequence faster, and the Foxx services are propagated\nlazily. Until the initialization procedure has completed for the local Foxx\napps, any request to a Foxx app is responded to with an HTTP 500 error and a\nmessage `waiting for initialization of Foxx services in this database`. This can\ncause an unavailability window for Foxx services on Coordinator startup for the\ninitial requests to Foxx apps until the app propagation has completed.\n\nIf you don't use Foxx, you should set this option to `false` to benefit from a\nfaster Coordinator startup. Deployments relying on Foxx apps being available as\nsoon as a Coordinator is integrated or responding should set this option to\n`true`.\n\nThe option only has an effect for cluster setups. On single servers and in\nActive Failover mode, all Foxx apps are available from the very beginning.\n\n**Note**: ArangoDB 3.8 changes the default value to `false` for this option.\nIn previous versions, this option had a default value of `true`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "foxx", + "type" : "boolean" + }, + "foxx.queues" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable or disable Foxx queues.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If set to `true`, the Foxx queues are available\nand jobs in the queues are executed asynchronously.\n\nIf set to `false`, the queue manager is disabled and any jobs are prevented from\nbeing processed, which may reduce CPU load a bit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "foxx", + "type" : "boolean" + }, + "foxx.queues-poll-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The poll interval for the Foxx queue manager (in seconds)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Lower values lead to more immediate and more\nfrequent Foxx queue job execution, but make the queue thread wake up and query\nthe queues more often. If set to a low value, the queue thread might cause\nCPU load.\n\nIf you don't use Foxx queues much, then you may increase this value to make the\nqueues thread wake up less.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "foxx", + "type" : "double" + }, + "foxx.store" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable the Foxx store in the web interface.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "foxx", + "type" : "boolean" + }, + "gid" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Switch to this group ID after reading configuration files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The name (identity) of the group to run the\nserver as.\n\nIf you don't specify this option, the server does not attempt to change its GID,\nso that the GID the server runs as is the primary group of the user who started\nthe server.\n\nIf you specify this option, the server changes its GID after opening ports and\nreading configuration files, but before accepting connections or opening other\nfiles (such as recovery files).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "honor-nsswitch" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "http.allow-method-override" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.8.0" + ], + "description" : "Allow HTTP method override using special headers.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, the HTTP request\nmethod is optionally fetched from one of the following HTTP request headers if\npresent in the request:\n\n- `x-http-method`\n- `x-http-method-override`\n- `x-method-override`\n\nIf the option is enabled and any of these headers is set, the request method is\noverridden by the value of the header. For example, this allows you to issue an\nHTTP DELETE request which, to the outside world, looks like an HTTP GET request.\nThis allows you to bypass proxies and tools that only let certain request types\npass.\n\nEnabling this option may impose a security risk. You should only use it in\ncontrolled environments.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "http", + "type" : "boolean" + }, + "http.hide-product-header" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.8.0" + ], + "description" : "Whether to omit the `Server: ArangoDB` header in HTTP responses.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "http", + "type" : "boolean" + }, + "http.keep-alive-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 300, + "deprecatedIn" : null, + "description" : "The keep-alive timeout for HTTP connections (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Idle keep-alive connections are closed by the\nserver automatically when the timeout is reached. A keep-alive-timeout value of\n`0` disables the keep-alive feature entirely.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "http", + "type" : "double" + }, + "http.permanently-redirect-root" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to use a permanent or temporary redirect.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.12" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "http", + "type" : "boolean" + }, + "http.redirect-root-to" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "/_admin/aardvark/index.html", + "deprecatedIn" : null, + "description" : "Redirect of the root URL.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.12" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "http", + "type" : "string" + }, + "http.return-queue-time-header" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to return the `x-arango-queue-time-seconds` header in all responses.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "The value contained in this header indicates the\ncurrent queueing/dequeuing time for requests in the scheduler (in seconds).\nClient applications and drivers can use this value to control the server load\nand also react on overload.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "http", + "type" : "boolean" + }, + "http.trusted-origin" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "The trusted origin URLs for CORS requests with credentials.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "http", + "type" : "string..." + }, + "hund" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Make ArangoDB bark on startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "icu-language" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "An ICU locale ID to set a language and optionally additional properties that affect string comparisons and sorting. You can only set this option once, when initializing the database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.9.1" + ], + "longDescription" : "With this option, you can get the sorting and\ncomparing order exactly as it is defined in the ICU standard. The language value\ncan be a two-letter language code (ISO-639), a two-letter language code followed\nby a two letter country code (ISO-3166), or any other valid ICU locale\ndefinition. For example: `de`, `en`, `en_US`, `en_UK`,\n`de_AT@collation=phonebook`.\n\nFor the Swedish language (`sv`), for instance, the correct ICU-based sorting\norder for letters is `'a','A','b','B','z','Z','å','Ä','ö','Ö'`. To get this\norder, use `--icu-language sv`. If you use `--default-language sv` instead, the\nsorting order will be `\"A\", \"a\", \"B\", \"b\", \"Z\", \"z\", \"å\", \"Ä\", \"Ö\", \"ö\"`.\n\n**Note**: You can use only one of the language options, either `--icu-language`\nor `--default-language`. Setting both of them results in an error.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "javascript.allow-admin-execute" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "For testing purposes, allow `/_admin/execute`. Never enable this option in production!", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to control whether\nuser-defined JavaScript code is allowed to be executed on the server by sending\nHTTP requests to the `/_admin/execute` API endpoint with an authenticated user\naccount.\n\nThe default value is `false`, which disables the execution of user-defined\ncode. This is also the recommended setting for production. In test environments,\nit may be convenient to turn the option on in order to send arbitrary setup\nor teardown commands for execution on the server.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.allow-external-process-control" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow the execution and control of external processes from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.allow-port-testing" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow the testing of ports from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.app-path" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : "/var/lib/arangodb3-apps", + "deprecatedIn" : null, + "description" : "The directory for Foxx applications.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.copy-installation" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Copy the contents of `javascript.startup-directory` on first start.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option is intended to be useful for rolling\nupgrades. If you set it to `true`, you can upgrade the underlying ArangoDB\npackages without influencing the running _arangod_ instance.\n\nSetting this value does only make sense if you use ArangoDB outside of a\ncontainer solution, like Docker or Kubernetes.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.enabled" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable the V8 JavaScript engine.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "By default, the V8 engine is enabled on single\nservers and Coordinators. It is disabled by default on Agents and DB-Servers.\n\nIt is possible to turn the V8 engine off also on the latter instance types to \nreduce the footprint of ArangoDB. Turning the V8 engine off on single servers or\nCoordinators will automatically render certain functionality unavailable or\ndysfunctional. The affected functionality includes JavaScript transactions, Foxx, \nAQL user-defined functions, the built-in web interface and some server APIs.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.endpoints-allowlist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Endpoints that can be connected to via the `@arangodb/request` module in JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.endpoints-denylist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Endpoints that cannot be connected to via the `@arangodb/request` module in JavaScript actions (if not in the allowlist).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.environment-variables-allowlist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Environment variables that are accessible in JavaScript.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.environment-variables-denylist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Environment variables that are inaccessible in JavaScript (if not in the allowlist).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.files-allowlist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Filesystem paths that are accessible from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.gc-frequency" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 60, + "deprecatedIn" : null, + "description" : "Time-based garbage collection frequency for JavaScript objects (each x seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is useful to have the garbage\ncollection still work in periods with no or little numbers of requests.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "double" + }, + "javascript.gc-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 2000, + "deprecatedIn" : null, + "description" : "Request-based garbage collection interval for JavaScript objects (each x requests).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.harden" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Disable access to JavaScript functions in the internal module: getPid() and logLevel().", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.module-directory" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Additional paths containing JavaScript modules.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.script" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Run the script and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.script-parameter" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Script parameter.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.startup-directory" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : "/usr/share/arangodb3/js", + "deprecatedIn" : null, + "description" : "A path to the directory containing the JavaScript startup scripts.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.startup-options-allowlist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Startup options whose names match this regular expression are allowed and exposed to JavaScript.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.startup-options-denylist" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Startup options whose names match this regular expression are not exposed (if not in the allowlist) to JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.tasks" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable JavaScript tasks.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.transactions" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable JavaScript transactions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.user-defined-functions" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable JavaScript user-defined functions (UDFs) in AQL queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.4" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.v8-contexts" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum number of V8 contexts that are created for executing JavaScript actions.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "More contexts allow executing more JavaScript\nactions in parallel, provided that there are also enough threads available.\nNote that each V8 context uses a substantial amount of memory and requires\nperiodic CPU processing time for garbage collection.\n\nThis option configures the maximum number of V8 contexts that can be used in\nparallel. On server start, only as many V8 contexts are created as are\nconfigured by the `--javascript.v8-contexts-minimum` option. The actual number\nof available V8 contexts may vary between `--javascript.v8-contexts-minimum`\nand `--javascript.v8-contexts` at runtime. When there are unused V8 contexts\nthat linger around, the server's garbage collector thread automatically deletes\nthem.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.v8-contexts-max-age" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 60, + "deprecatedIn" : null, + "description" : "The maximum age for each V8 context (in seconds) before it is disposed.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "If both `--javascript.v8-contexts-max-invocations`\nand `--javascript.v8-contexts-max-age` are set, then the context is destroyed\nwhen either of the specified threshold values is reached.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "double" + }, + "javascript.v8-contexts-max-invocations" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum number of invocations for each V8 context before it is disposed (0 = unlimited).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.v8-contexts-minimum" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The minimum number of V8 contexts to keep available for executing JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The actual number of V8 contexts never drops below\nthis value, but it may go up as high as specified by the\n`--javascript.v8-contexts` option.\n\nWhen there are unused V8 contexts that linger around and the number of V8\ncontexts is greater than `--javascript.v8-contexts-minimum`, the server's\ngarbage collector thread automatically deletes them.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.v8-max-heap" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 3072, + "deprecatedIn" : null, + "description" : "The maximal heap size (in MiB).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.v8-options" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Options to pass to V8.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can optionally pass arguments to the V8\nJavaScript engine. The V8 engine runs with the default settings unless you\nexplicitly specify them. The options are forwarded to the V8 engine, which\nparses them on its own. Passing invalid options may result in an error being\nprinted on stderr and the option being ignored.\n\nYou need to pass the options as one string, with V8 option names being prefixed\nwith two hyphens. Multiple options need to be separated by whitespace. To get\na list of all available V8 options, you can use the value `\"--help\"` as follows:\n\n```\n--javascript.v8-options=\"--help\"\n```\n\nAnother example of specific V8 options being set at startup:\n\n```\n--javascript.v8-options=\"--log --no-logfile-per-isolate --logfile=v8.log\"\n```\n\nNames and features or usable options depend on the version of V8 being used, and\nmight change in the future if a different version of V8 is being used in\nArangoDB. Not all options offered by V8 might be sensible to use in the context\nof ArangoDB. Use the specific options only if you are sure that they are not\nharmful for the regular database operation.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "ldap.allow-offline" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If a refresh attempt fails to connect to the LDAP server, continue with the cached authentication data.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.async-connect" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the connection to the LDAP library is done asynchronously.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.basedn" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP basedn. Example: \"dc=example,dc=com\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.binddn" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP binddn. Example: \"cn=admin,dc=example,dc=com\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.bindpasswd" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP bindpassword. Example: \"admin\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.debug" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Turn on the internal OpenLDAP library output (warning: prints to stdout).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.enabled" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable LDAP.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.network-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Timeout value (in seconds) after which network operations following the initial connection return in case of no activity (0 = default timeout).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "double" + }, + "ldap.port" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 389, + "deprecatedIn" : null, + "description" : "The port to use.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 65535, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "uint16" + }, + "ldap.prefix" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP prefix. Example: \"uid= xor dn= xor cn=\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.referrals" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the LDAP library should implicitly chase referrals.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.refresh-rate" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 300, + "deprecatedIn" : null, + "description" : "Refresh user settings after this time (in seconds).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "double" + }, + "ldap.responsible-for" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A file of usernames this provider is responsible for. If empty, it is responsible for all users.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.11" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.restart" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the LDAP library should implicitly restart connections.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.retries" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The number of tries to attempt connecting to the LDAP server. Setting it to values greater than 1 retries connecting in case the LDAP server is unavailable or denies the connection.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "uint32" + }, + "ldap.roles-attribute-name" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP attributename where the roles are located.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.roles-exclude" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Regular expression to exclude groups. Leave empty to exclude none.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.roles-include" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Regular expression to include groups. Leave empty to include all.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.roles-search" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP search for roles; '{USER}' is replaced by the 'dn' of the user.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.roles-transformation" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Regular expression to normalizer role name. Example: '/^ *(.*[^ ]])*/$2/'", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string..." + }, + "ldap.search-attribute" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "uid", + "deprecatedIn" : null, + "description" : "LDAP search attribute: Example: \"uid\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.search-filter" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "objectClass=*", + "deprecatedIn" : null, + "description" : "LDAP search filter. Example: \"(objectClass=simpleSecurityObject)\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.search-scope" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "sub", + "deprecatedIn" : null, + "description" : "LDAP search scope, one of: base, one, sub", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.serialize-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 5, + "deprecatedIn" : null, + "description" : "Maximum amount of time (in seconds) to wait for the serialization mutex.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "double" + }, + "ldap.serialized" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether calls into the LDAP library should be serialized. You can use this option to work around thread-unsafe LDAP library functionality.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.server" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The server to use.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.suffix" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP suffix. Example: \",dc=example,dc=com\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.superuser-role" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Role mapping to the super-users.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Timeout value (in seconds) for synchronous LDAP API calls (0 = default timeout).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "double" + }, + "ldap.tls" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable TLS.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap", + "type" : "boolean" + }, + "ldap.tls-cacert-dir" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP TLS CA certificate directory.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.tls-cacert-file" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP TLS CA certificate file.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.tls-cert-check-strategy" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "hard", + "deprecatedIn" : null, + "description" : "LDAP TLS certificate check strategy, one of: never, hard, demand, allow, try", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.tls-version" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "1.2", + "deprecatedIn" : null, + "description" : "LDAP TLS version, one of: 1.0, 1.1, 1.2", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap.url" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The LDAP URL. Example: ldap://example.com:389/dc=example,dc=com?uid?sub", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap", + "type" : "string" + }, + "ldap2.allow-offline" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If a refresh attempt fails to connect to the LDAP server, continue with the cached authentication data.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.async-connect" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the connection to the LDAP library is done asynchronously.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.basedn" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP basedn. Example: \"dc=example,dc=com\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.binddn" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP binddn. Example: \"cn=admin,dc=example,dc=com\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.bindpasswd" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP bindpassword. Example: \"admin\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.debug" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Turn on the internal OpenLDAP library output (warning: prints to stdout).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.enabled" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable LDAP.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.network-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Timeout value (in seconds) after which network operations following the initial connection return in case of no activity (0 = default timeout).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "double" + }, + "ldap2.port" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 389, + "deprecatedIn" : null, + "description" : "The port to use.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 65535, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "uint16" + }, + "ldap2.prefix" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP prefix. Example: \"uid= xor dn= xor cn=\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.referrals" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the LDAP library should implicitly chase referrals.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.refresh-rate" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 300, + "deprecatedIn" : null, + "description" : "Refresh user settings after this time (in seconds).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "double" + }, + "ldap2.responsible-for" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A file of usernames this provider is responsible for. If empty, it is responsible for all users.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.11" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.restart" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the LDAP library should implicitly restart connections.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.retries" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The number of tries to attempt connecting to the LDAP server. Setting it to values greater than 1 retries connecting in case the LDAP server is unavailable or denies the connection.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "uint32" + }, + "ldap2.roles-attribute-name" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP attributename where the roles are located.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.roles-exclude" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Regular expression to exclude groups. Leave empty to exclude none.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.roles-include" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Regular expression to include groups. Leave empty to include all.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.roles-search" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP search for roles; '{USER}' is replaced by the 'dn' of the user.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.roles-transformation" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Regular expression to normalizer role name. Example: '/^ *(.*[^ ]])*/$2/'", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string..." + }, + "ldap2.search-attribute" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "uid", + "deprecatedIn" : null, + "description" : "LDAP search attribute: Example: \"uid\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.search-filter" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "objectClass=*", + "deprecatedIn" : null, + "description" : "LDAP search filter. Example: \"(objectClass=simpleSecurityObject)\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.search-scope" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "sub", + "deprecatedIn" : null, + "description" : "LDAP search scope, one of: base, one, sub", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.serialize-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 5, + "deprecatedIn" : null, + "description" : "Maximum amount of time (in seconds) to wait for the serialization mutex.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "double" + }, + "ldap2.serialized" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether calls into the LDAP library should be serialized. You can use this option to work around thread-unsafe LDAP library functionality.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.server" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The server to use.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.suffix" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP suffix. Example: \",dc=example,dc=com\"", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.superuser-role" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Role mapping to the super-users.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Timeout value (in seconds) for synchronous LDAP API calls (0 = default timeout).", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "double" + }, + "ldap2.tls" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable TLS.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ldap2", + "type" : "boolean" + }, + "ldap2.tls-cacert-dir" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP TLS CA certificate directory.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.tls-cacert-file" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "LDAP TLS CA certificate file.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.tls-cert-check-strategy" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "hard", + "deprecatedIn" : null, + "description" : "LDAP TLS certificate check strategy, one of: never, hard, demand, allow, try", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.tls-version" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "1.2", + "deprecatedIn" : null, + "description" : "LDAP TLS version, one of: 1.0, 1.1, 1.2", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "ldap2.url" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The LDAP URL. Example: ldap://example.com:389/dc=example,dc=com?uid?sub", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ldap2", + "type" : "string" + }, + "log" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + "info", + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.api-enabled" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "true", + "deprecatedIn" : null, + "description" : "Whether the log API is enabled (true) or not (false), or only enabled for superuser JWT (jwt).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.11", + "v3.5.6", + "v3.6.5" + ], + "longDescription" : "Credentials are not written to log files.\nNevertheless, some logged data might be sensitive depending on the context of\nthe deployment. For example, if request logging is switched on, user requests\nand corresponding data might end up in log files. Therefore, a certain care\nwith log files is recommended.\n\nSince the database server offers an API to control logging and query logging\ndata, this API has to be secured properly. By default, the API is accessible\nfor admin users (administrative access to the `_system` database). However,\nyou can lock this down further.\n\nThe possible values for this option are:\n\n - `true`: The `/_admin/log` API is accessible for admin users.\n - `jwt`: The `/_admin/log` API is accessible for the superuser only\n (authentication with JWT token and empty username).\n - `false`: The `/_admin/log` API is not accessible at all.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.color" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.in-memory" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Use an in-memory log appender which can be queried via the API and web interface.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to toggle storing log\nmessages in memory, from which they can be consumed via the `/_admin/log`\nHTTP API and via the web interface.\n\nBy default, this option is turned on, so log messages are consumable via the API\nand web interface. Turning this option off disables that functionality, saves a\nbit of memory for the in-memory log buffers, and prevents potential log\ninformation leakage via these means.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.in-memory-level" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "info", + "deprecatedIn" : null, + "description" : "Use an in-memory log appender only for this log level and higher.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "You can use this option to control which log\nmessages are preserved in memory (in case `--log.in-memory` is enabled).\n\nThe default value is `info`, meaning all log messages of types `info`,\n`warning`, `error`, and `fatal` are stored in-memory by an instance. By setting\nthis option to `warning`, only `warning`, `error` and `fatal` log messages are \npreserved in memory, and by setting the option to `error`, only `error` and\n`fatal` messages are kept.\n\nThis option is useful because the number of in-memory log messages is limited \nto the latest 2048 messages, and these slots are shared between informational,\nwarning, and error messages by default.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"debug\", \"err\", \"error\", \"fatal\", \"info\", \"trace\", \"warn\", \"warning\"" + }, + "log.keep-logrotate" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Keep the old log file after receiving a SIGHUP.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + "info", + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, arangosearch, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, libiresearch, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "network.idle-connection-ttl" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 120000, + "deprecatedIn" : null, + "description" : "The default time-to-live of idle connections for cluster-internal communication (in milliseconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "network", + "type" : "uint64" + }, + "network.io-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The number of network I/O threads for cluster-internal communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "network", + "type" : "uint32" + }, + "network.max-open-connections" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1024, + "deprecatedIn" : null, + "description" : "The maximum number of open TCP connections for cluster-internal communication per endpoint", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "network", + "type" : "uint64" + }, + "network.max-requests-in-flight" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 65536, + "deprecatedIn" : null, + "description" : "The number of internal requests that can be in flight at a given point in time.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "network", + "type" : "uint64" + }, + "network.protocol" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : [ + "v3.9.0" + ], + "description" : "The network protocol to use for cluster-internal communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "network", + "type" : "string", + "values" : "Possible values: \"\", \"h2\", \"http\", \"http2\", \"vst\"" + }, + "network.verify-hosts" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Verify peer certificates when using TLS in cluster-internal communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "network", + "type" : "boolean" + }, + "pid-file" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The name of the process ID file to use if the server runs as a daemon.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "pregel.max-parallelism" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 8, + "deprecatedIn" : null, + "description" : "The maximum parallelism usable in a Pregel job.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "This option effectively limits the parallelism of\neach Pregel job to the specified value. In a cluster deployment, the limit\napplies per DB-Server.\n\nDefaults to the number of available cores.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "pregel", + "type" : "uint64" + }, + "pregel.min-parallelism" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The minimum parallelism usable in a Pregel job.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Increasing the value of this option forces each\nPregel job to run with at least this level of parallelism. In a cluster\ndeployment, the limit applies per DB-Server.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "pregel", + "type" : "uint64" + }, + "pregel.parallelism" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The default parallelism to use in a Pregel job if none is specified.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "The default parallelism for a Pregel job is only\nused if you start a job without setting the `parallelism` attribute.\n\nDefaults to the number of available cores divided by 4. The result is limited to\na value between 1 and 16.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "pregel", + "type" : "uint64" + }, + "query.allow-collections-in-expressions" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.9.0" + ], + "description" : "Allow full collections to be used in AQL expressions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "If set to `true`, using collection names in\narbitrary places in AQL expressions is allowed, although using collection names\nlike this is very likely unintended.\n\nFor example, consider the following query:\n\n```aql\nFOR doc IN collection RETURN collection\n```\n\nHere, the collection name is `collection`, and its usage in the `FOR` loop is\nintended and valid. However, `collection` is also used in the `RETURN`\nstatement, which is legal but potentially unintended. It should likely be\n`RETURN doc` or `RETURN doc.someAttribute` instead. Otherwise, the entire\ncollection is materialized and returned as many times as there are documents in\nthe collection. This can take a long time and even lead to out-of-memory crashes\nin the worst case.\n\nIf you set the option to `false`, such unintentional usage of collection names\nin queries is prohibited, and instead makes the query fail with error 1568\n(\"collection used as expression operand\").\n\nThe default value of the option was `true` in v3.8, meaning that potentially\nunintended usage of collection names in queries were still allowed. In v3.9,\nthe default value changes to `false`. The option is also deprecated from\n3.9.0 on and will be removed in future versions. From then on, unintended\nusage of collection names will always be disallowed.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.cache-entries" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 128, + "deprecatedIn" : null, + "description" : "The maximum number of results in query result cache per database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If a query is eligible for caching and the number\nof items in the database's query cache is equal to this threshold value, another\ncached query result is removed from the cache.\n\nThis option only has an effect if the query cache mode is set to either `on` or\n`demand`.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.cache-entries-max-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 268435456, + "deprecatedIn" : null, + "description" : "The maximum cumulated size of results in the query result cache per database (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "When a query result is inserted into the query\nresults cache, it is checked if the total size of cached results would exceed\nthis value, and if so, another cached query result is removed from the cache\nbefore a new one is inserted.\n\nThis option only has an effect if the query cache mode is set to either `on` or\n`demand`.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.cache-entry-max-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 16777216, + "deprecatedIn" : null, + "description" : "The maximum size of an individual result entry in query result cache (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Query results are only eligible for caching if\ntheir size does not exceed this setting's value.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.cache-include-system-collections" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to include system collection queries in the query result cache.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Not storing these results is normally beneficial\nif you use the query results cache, as queries on system collections are\ninternal to ArangoDB and use space in the query results cache unnecessarily.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.cache-mode" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "off", + "deprecatedIn" : null, + "description" : "The mode for the AQL query result cache. Can be \"on\", \"off\", or \"demand\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Toggles the AQL query results cache behavior.\nThe possible values are:\n\n- `off`: do not use query results cache\n- `on`: always use query results cache, except for queries that have their\n `cache` attribute set to `false`\n- `demand`: use query results cache only for queries that have their `cache`\n attribute set to `true`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "string" + }, + "query.enable-debug-apis" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable query debug APIs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.9" + ], + "longDescription" : "If set to `true`, the server will expose an API for\ndebugging some internals of AQL queries and transactions for support purposes.\nThese APIs return information about currently ongoing queries and transactions and\nwhich collections they affect, their acquired locks and timeouts.\nThese APIs are probably only meaningful for the ArangoDB support, as their output\nis undocumented and can change from version to version.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.fail-on-warning" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether AQL queries should fail with errors even for recoverable warnings.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If set to `true`, AQL queries that produce\nwarnings are instantly aborted and throw an exception. This option can be set\nto catch obvious issues with AQL queries early.\n\nIf set to `false`, AQL queries that produce warnings are not aborted and return\nthe warnings along with the query results.\n\nYou can override the option for each individual AQL query via the\n`failOnWarning` attribute.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.global-memory-limit" : { + "base" : 33089761280, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 26802706636, + "deprecatedIn" : null, + "description" : "The memory threshold for all AQL queries combined (in bytes, 0 = no limit).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to set a limit on the\ncombined estimated memory usage of all AQL queries (in bytes). If this option\nhas a value of `0`, then no global memory limit is in place. This is also the\ndefault value and the same behavior as in version 3.7 and older.\n\nIf you set this option to a value greater than zero, then the total memory usage\nof all AQL queries is limited approximately to the configured value. The limit\nis enforced by each server node in a cluster independently, i.e. it can be set\nseparately for Coordinators, DB-Servers etc. The memory usage of a query that\nruns on multiple servers in parallel is not summed up, but tracked separately on\neach server.\n\nIf a memory allocation in a query would lead to the violation of the configured\nglobal memory limit, then the query is aborted with error code 32\n(\"resource limit exceeded\").\n\nThe global memory limit is approximate, in the same fashion as the per-query\nmemory limit exposed by the option `--query.memory-limit` is. The global memory\ntracking has a granularity of 32 KiB chunks.\n\nIf both, `--query.global-memory-limit` and `--query.memory-limit`, are set, you\nmust set the former at least as high as the latter.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.log-failed" : { + "category" : "option", + "component" : [ + "coordinator", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to log failed AQL queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.5", + "v3.10.2" + ], + "longDescription" : "If set to `true`, all failed AQL queries are\nlogged to the server log. You can use this option during development, or to\ncatch unexpected failed queries in production.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.log-memory-usage-threshold" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "agent", + "single" + ], + "default" : 4294967296, + "deprecatedIn" : null, + "description" : "Log queries that have a peak memory usage larger than this threshold.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.5", + "v3.10.2" + ], + "longDescription" : "A warning is logged if queries exceed the\nspecified threshold. This is useful for finding queries that use a large\namount of memory.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.max-artifact-log-length" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "agent", + "single" + ], + "default" : 4096, + "deprecatedIn" : null, + "description" : "The maximum length of query strings and bind parameter values in logs before they get truncated.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.5", + "v3.10.2" + ], + "longDescription" : "This option allows you to truncate overly long\nquery strings and bind parameter values to a reasonable length in log files.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.max-collections-per-query" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 2048, + "deprecatedIn" : null, + "description" : "The maximum number of collections/shards that can be used in one AQL query.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.7" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.max-dnf-condition-members" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 786432, + "deprecatedIn" : null, + "description" : "The maximum number of OR sub-nodes in the internal representation of an AQL FILTER condition.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.0" + ], + "longDescription" : "Yon can use this option to limit the computation\ntime and memory usage when converting complex AQL FILTER conditions into the\ninternal DNF (disjunctive normal form) format. FILTER conditions with a lot of\nlogical branches (AND, OR, NOT) can take a large amount of processing time and\nmemory. This startup option limits the computation time and memory usage for\nsuch conditions.\n\nOnce the threshold value is reached during the DNF conversion of a FILTER\ncondition, the conversion is aborted, and the query continues with a simplified\ninternal representation of the condition, which cannot be used for index\nlookups.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.max-nodes-per-callstack" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 250, + "deprecatedIn" : null, + "description" : "The maximum number of execution nodes on the callstack before splitting the remaining nodes into a separate thread", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.9.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.max-parallelism" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4, + "deprecatedIn" : null, + "description" : "The maximum number of threads to use for a single query; the actual query execution may use less depending on various factors.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.max-runtime" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The runtime threshold for AQL queries (in seconds, 0 = no limit).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.7", + "v3.7.3" + ], + "longDescription" : "Sets a default maximum runtime for AQL queries.\n\nThe default value is `0`, meaning that the runtime of AQL queries is not\nlimited. If you set it to any positive value, it restricts the runtime of all\nAQL queries, unless you override it with the `maxRuntime` query option on a\nper-query basis.\n\nIf a query exceeds the configured runtime, it is killed on the next occasion\nwhen the query checks its own status. Killing is best effort-based, so it is not\nguaranteed that a query will no longer than exactly the configured amount of\ntime.\n\n**Warning**: This option affects all queries in all databases, including queries\nissued for administration and database-internal purposes.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "double" + }, + "query.memory-limit" : { + "base" : 33089761280, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 19853856768, + "deprecatedIn" : null, + "description" : "The memory threshold per AQL query (in bytes, 0 = no limit).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The default maximum amount of memory (in bytes)\nthat a single AQL query can use. When a single AQL query reaches the specified\nlimit value, the query is aborted with a *resource limit exceeded* exception.\nIn a cluster, the memory accounting is done per server, so the limit value is\neffectively a memory limit per query per server node.\n\nSome operations, namely calls to AQL functions and their intermediate results, \nare not properly tracked.\n\nYou can override the limit by setting the `memoryLimit` option for individual\nqueries when running them. Overriding the per-query limit value is only possible\nif the `--query.memory-limit-override` option is set to `true`.\n\nThe default per-query memory limit value in version 3.8 and later depends on\nthe amount of available RAM. In version 3.7 and older, the default value was\n`0`, meaning \"unlimited\".\n\nThe default values are:\n\n```\nAvailable memory: 0 (0MiB) Limit: 0 unlimited, %mem: n/a\nAvailable memory: 134217728 (128MiB) Limit: 33554432 (32MiB), %mem: 25.0\nAvailable memory: 268435456 (256MiB) Limit: 67108864 (64MiB), %mem: 25.0\nAvailable memory: 536870912 (512MiB) Limit: 201326592 (192MiB), %mem: 37.5\nAvailable memory: 805306368 (768MiB) Limit: 402653184 (384MiB), %mem: 50.0\nAvailable memory: 1073741824 (1024MiB) Limit: 603979776 (576MiB), %mem: 56.2\nAvailable memory: 2147483648 (2048MiB) Limit: 1288490189 (1228MiB), %mem: 60.0\nAvailable memory: 4294967296 (4096MiB) Limit: 2576980377 (2457MiB), %mem: 60.0\nAvailable memory: 8589934592 (8192MiB) Limit: 5153960755 (4915MiB), %mem: 60.0\nAvailable memory: 17179869184 (16384MiB) Limit: 10307921511 (9830MiB), %mem: 60.0\nAvailable memory: 25769803776 (24576MiB) Limit: 15461882265 (14745MiB), %mem: 60.0\nAvailable memory: 34359738368 (32768MiB) Limit: 20615843021 (19660MiB), %mem: 60.0\nAvailable memory: 42949672960 (40960MiB) Limit: 25769803776 (24576MiB), %mem: 60.0\nAvailable memory: 68719476736 (65536MiB) Limit: 41231686041 (39321MiB), %mem: 60.0\nAvailable memory: 103079215104 (98304MiB) Limit: 61847529063 (58982MiB), %mem: 60.0\nAvailable memory: 137438953472 (131072MiB) Limit: 82463372083 (78643MiB), %mem: 60.0\nAvailable memory: 274877906944 (262144MiB) Limit: 164926744167 (157286MiB), %mem: 60.0\nAvailable memory: 549755813888 (524288MiB) Limit: 329853488333 (314572MiB), %mem: 60.0\n```\n\nYou can set a global memory limit for the total memory used by all AQL queries\nthat currently execute via the `--query.global-memory-limit` option.\n\nFrom ArangoDB 3.8 on, the per-query memory tracking has a granularity of 32 KB \nchunks. That means checking for memory limits such as \"1\" (e.g. for testing) \nmay not make a query fail if the total memory allocations in the query don't \nexceed 32 KiB. The effective lowest memory limit value that can be enforced is\nthus 32 KiB. Memory limit values higher than 32 KiB will be checked whenever the\ntotal memory allocations cross a 32 KiB boundary.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.memory-limit-override" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Allow increasing the per-query memory limits for individual queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to control whether\nindividual AQL queries can increase their memory limit via the `memoryLimit`\nquery option. This is the default, so a query that increases its memory limit is\nallowed to use more memory than set via the `--query.memory-limit` startup\noption value.\n\nIf the option is set to `false`, individual queries can only lower their maximum\nallowed memory usage but not increase it.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.optimizer-max-plans" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 128, + "deprecatedIn" : null, + "description" : "The maximum number of query plans to create for a query.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can control how many different query execution\nplans the AQL query optimizer generates at most for any given AQL query with\nthis option. Normally, the AQL query optimizer generates a single execution plan\nper AQL query, but there are some cases in which it creates multiple competing\nplans.\n\nMore plans can lead to better optimized queries. However, plan creation has its\ncosts. The more plans are created and shipped through the optimization pipeline,\nthe more time is spent in the optimizer. You can lower the number to make the\noptimizer stop creating additional plans when it has already created enough\nplans.\n\nNote that this setting controls the default maximum number of plans to create.\nThe value can still be adjusted on a per-query basis by setting the\n`maxNumberOfPlans` attribute for individual queries.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "uint64" + }, + "query.optimizer-rules" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Enable or disable specific optimizer rules by default. Specify the rule name prefixed with `-` for disabling, or `+` for enabling.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.6.0" + ], + "longDescription" : "You can use this option to selectively enable or\ndisable AQL query optimizer rules by default. You can specify the option\nmultiple times.\n\nFor example, to turn off the rules `use-indexes-for-sort` and\n`reduce-extraction-to-projection` by default, use the following:\n\n```\n--query.optimizer-rules \"-use-indexes-for-sort\" --query.optimizer-rules \"-reduce-extraction-to-projection\"\n```\n\nThe purpose of this startup option is to be able to enable potential future\nexperimental optimizer rules, which may be shipped in a disabled-by-default\nstate.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "string..." + }, + "query.parallelize-traversals" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable traversal parallelization.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.registry-ttl" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The default time-to-live of cursors and query snippets (in seconds). If set to 0 or lower, the value defaults to 30 for single server instances and 600 for Coordinator instances.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "double" + }, + "query.require-with" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether AQL queries should require the `WITH collection-name` clause even on single servers (enable this to remove this behavior difference between single server and cluster).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.11", + "v3.8.0" + ], + "longDescription" : "If set to `true`, AQL queries in single server\nmode also require `WITH` clauses in AQL queries where a cluster installation\nwould require them.\n\nThe option is set to `false` by default, but you can turn it on in single\nservers to remove this behavior difference between single servers and clusters,\nmaking a later transition from single server to cluster easier.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.slow-streaming-threshold" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The threshold for slow streaming AQL queries (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can control after what execution time\nstreaming AQL queries are considered \"slow\" with this option. It exists to give\nstreaming queries a separate, potentially higher timeout value than for regular\nqueries. Streaming queries are often executed in lockstep with application data\nprocessing logic, which then also accounts for the queries' runtime. It is thus\nexpected that the lifetime of streaming queries is longer than for regular\nqueries.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "double" + }, + "query.slow-threshold" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The threshold for slow AQL queries (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can control after what execution time an AQL\nquery is considered \"slow\" with this option. Any slow queries that exceed the\nspecified execution time are logged when they are finished.\n\nYou can turn off the tracking of slow queries entirely by setting the option\n`--query.tracking` to `false`.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "query", + "type" : "double" + }, + "query.smart-joins" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable the SmartJoins query optimization.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.tracking" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to track queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.tracking-slow-queries" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to track slow queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.4" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.tracking-with-bindvars" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to track bind variable of AQL queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If set to `true`, then the bind variables are\ntracked and shown for all running and slow AQL queries. This also enables the\ndisplay of bind variable values in the list of cached AQL query results. This\noption only has an effect if `--query.tracking` is set to `true` or if the query\nresults cache is used.\n\nYou can disable tracking and displaying bind variable values by setting the\noption to `false`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.tracking-with-datasources" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to track data sources of AQL queries.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.4" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "query.tracking-with-querystring" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to track the query string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.4" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "query", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "rclone.argument" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Prepend custom arguments to rclone.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.11", + "v3.10.7", + "v3.11.1" + ], + "longDescription" : "You can add custom arguments to rclone to i.e.\nenable debug logging into a separato logfile. This would be achieved by\nspecifying:\n --rclone.argument --log-level=DEBUG --rclone.argument --log-file=rclone.log\nin conjunction with the starter the ARANGODB_SERVER_DIR environment variable\ncan be utilized with the @VAR@-suplementing facility to generate individual\nlogfile names for clusters.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rclone", + "type" : "string..." + }, + "rclone.executable" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Path to the rclone executable used for uploading and downloading of Hot Backups.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rclone", + "type" : "string" + }, + "replication.active-failover" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable active-failover during asynchronous replication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "replication", + "type" : "boolean" + }, + "replication.active-failover-leader-grace-period" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 120, + "deprecatedIn" : null, + "description" : "The amount of time (in seconds) for which the current leader will continue to assume its leadership even if it lost connection to the agency (0 = unlimited)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.8" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "replication", + "type" : "double" + }, + "replication.auto-repair-revision-trees" : { + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to automatically repair revision trees of shards after too many shard synchronization failures.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.6" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "replication", + "type" : "boolean" + }, + "replication.auto-start" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable or disable the automatic start of replication appliers.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "replication", + "type" : "boolean" + }, + "replication.connect-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The default timeout value for replication connection attempts (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.9", + "v3.5.4" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "replication", + "type" : "double" + }, + "replication.max-parallel-tailing-invocations" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum number of concurrently allowed WAL tailing invocations (0 = unlimited).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "replication", + "type" : "uint64" + }, + "replication.quick-keys-limit" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1000000, + "deprecatedIn" : null, + "description" : "Limit at which 'quick' calls to the replication keys API return only the document count for the second run.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.9" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "replication", + "type" : "uint64" + }, + "replication.request-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 600, + "deprecatedIn" : null, + "description" : "The default timeout value for replication requests (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.9", + "v3.5.4" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "replication", + "type" : "double" + }, + "replication.sync-by-revision" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to use the newer revision-based replication protocol.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "replication", + "type" : "boolean" + }, + "rocksdb.allow-fallocate" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to allow RocksDB to use fallocate calls. If disabled, fallocate calls are bypassed and no pre-allocation is done.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.4.5" + ], + "longDescription" : "Preallocation is turned on by default, but you can\nturn it off for operating system versions that are known to have issues with it.\nThis option only has an effect on operating systems that support\n`fallocate`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.auto-fill-index-caches-on-startup" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to automatically fill the in-memory index caches with entries from edge indexes and cache-enabled persistent indexes on server startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.6", + "v3.10.2" + ], + "longDescription" : "Enabling this option may cause additional CPU and\nI/O load. You can limit how many index filling operations can execute\nconcurrently with the `--rocksdb.max-concurrent-index-fill-tasks` startup\noption.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.auto-flush-check-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 1800, + "deprecatedIn" : null, + "description" : "The interval (in seconds) in which auto-flushes of WAL and column family data is executed.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.5" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.auto-flush-min-live-wal-files" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 20, + "deprecatedIn" : null, + "description" : "The minimum number of live WAL files that triggers an auto-flush of WAL and column family data.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.auto-refill-index-caches-on-followers" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether or not to automatically (re-)fill the in-memory index caches on followers as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.5" + ], + "longDescription" : "Set this to `false` to only (re-)fill in-memory\nindex caches on leaders and save memory on followers. \nNote that the value of this option should be identical for all DBServers.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.auto-refill-index-caches-on-modify" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to automatically (re-)fill the in-memory index caches with entries from edge indexes and cache-enabled persistent indexes on insert/update/replace/remove operations by default.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.6", + "v3.10.2" + ], + "longDescription" : "When documents are added, modified, or removed,\nthese changes are tracked and a background thread tries to update the index\ncaches accordingly if the feature is enabled, by adding new, updating existing,\nor deleting and refilling cache entries.\n\nYou can enable the feature for individual `INSERT`, `UPDATE`, `REPLACE`, and\n`REMOVE` operations in AQL queries, for individual document API requests that\ninsert, update, replace, or remove single or multiple documents, as well\nas enable it by default using this startup option.\n\nThe background refilling is done on a best-effort basis and not guaranteed to\nsucceed, for example, if there is no memory available for the cache subsystem,\nor during cache grow/shrink operations. A background thread is used so that\nforeground write operations are not slowed down by a lot. It may still cause\nadditional I/O activity to look up data from the storage engine to repopulate\nthe cache.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.auto-refill-index-caches-queue-capacity" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 131072, + "deprecatedIn" : null, + "description" : "How many changes can be queued at most for automatically refilling the index caches.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.6", + "v3.10.2" + ], + "longDescription" : "This option restricts how many cache entries\nthe background thread for (re-)filling the in-memory index caches can queue at\nmost. This limits the memory usage for the case of the background thread being\nslower than other operations that invalidate cache entries of edge indexes\nor cache-enabled persistent indexes.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.blob-compression-type" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : "lz4", + "deprecatedIn" : null, + "description" : "The compression algorithm to use for blob data in the documents column family. Requires `--rocksdb.enable-blob-files`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string", + "values" : "Possible values: \"lz4\", \"lz4hc\", \"none\", \"snappy\"" + }, + "rocksdb.blob-file-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The size limit for blob files in the documents column family (in bytes). Requires `--rocksdb.enable-blob-files`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.blob-garbage-collection-age-cutoff" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 0.25, + "deprecatedIn" : null, + "description" : "The age cutoff for garbage collecting blob files in the documents column family (percentage value from 0 to 1 determines how many blob files are garbage collected during compaction). Requires `--rocksdb.enable-blob-files` and `--rocksdb.enable-blob-garbage-collection`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.blob-garbage-collection-force-threshold" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The garbage ratio threshold for scheduling targeted compactions for the oldest blob files in the documents column family (percentage value between 0 and 1). Requires `--rocksdb.enable-blob-files` and `--rocksdb.enable-blob-garbage-collection`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.block-align-data-blocks" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, data blocks are aligned on the lesser of page size and block size.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This may waste some memory but may reduce the\nnumber of cross-page I/O operations.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.block-cache-jemalloc-allocator" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Use jemalloc-based memory allocator for RocksDB block cache.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.11.0" + ], + "longDescription" : "The jemalloc-based memory allocator for the RocksDB block cache\nwill also exclude the block cache contents from coredumps, potentially making generated \ncoredumps a lot smaller.\nIn order to use this option, the executable needs to be compiled with jemalloc\nsupport (which is the default on Linux).", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.block-cache-shard-bits" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : -1, + "deprecatedIn" : null, + "description" : "The number of shard bits to use for the block cache (-1 = default value).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The number of bits used to shard the block cache\nto allow concurrent operations. To keep individual shards at a reasonable size\n(i.e. at least 512 KiB), keep this value to at most\n`block-cache-shard-bits / 512 KiB`. Default: `block-cache-size / 2^19`.", + "maxInclusive" : false, + "maxValue" : 20, + "minInclusive" : true, + "minValue" : -1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int64" + }, + "rocksdb.block-cache-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 9282683289, + "deprecatedIn" : null, + "description" : "The size of block cache (in bytes).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This is the maximum size of the block cache in\nbytes. Increasing this value may improve performance. If there is more than\n4 GiB of RAM in the system, the default value is\n`(system RAM size - 2GiB) * 0.3`.\n\nFor systems with less RAM, the default values are:\n\n- 512 MiB for systems with between 2 and 4 GiB of RAM.\n- 256 MiB for systems with between 1 and 2 GiB of RAM.\n- 128 MiB for systems with less than 1 GiB of RAM.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.bloom-filter-bits-per-key" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The average number of bits to use per key in a Bloom filter.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.3" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.cache-index-and-filter-blocks" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "If enabled, the RocksDB block cache quota also includes RocksDB memtable sizes.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "longDescription" : "If you set this option to `true`, RocksDB tracks\nall loaded index and filter blocks in the block cache, so that they count\ntowards RocksDB's block cache memory limit.\n\nIf you set this option to `false`, the memory usage for index and filter blocks\nis not accounted for.\n\nThe default value of `--rocksdb.cache-index-and-filter-blocks` was `false` in \nversions before 3.10, and was changed to `true` from version 3.10 onwards.\n\nTo improve stability of memory usage and avoid untracked memory allocations by\nRocksDB, it is recommended to set this option to `true`. Note that tracking\nindex and filter blocks leaves less room for other data in the block cache, so\nin case servers have unused RAM capacity available, it may be useful to increase\nthe overall size of the block cache.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.cache-index-and-filter-blocks-with-high-priority" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "If enabled and `--rocksdb.cache-index-and-filter-blocks` is also enabled, cache index and filter blocks with high priority, making index and filter blocks be less likely to be evicted than data blocks.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.checksum-type" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : "xxHash64", + "deprecatedIn" : null, + "description" : "The checksum type to use for table files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string", + "values" : "Possible values: \"XXH3\", \"crc32c\", \"xxHash\", \"xxHash64\"" + }, + "rocksdb.compaction-read-ahead-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 2097152, + "deprecatedIn" : null, + "description" : "If non-zero, bigger reads are performed when doing compaction. If you run RocksDB on spinning disks, you should set this to at least 2 MB. That way, RocksDB's compaction does sequential instead of random reads.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.compaction-style" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : "level", + "deprecatedIn" : null, + "description" : "The compaction style which is used to pick the next file(s) to be compacted (note: all styles except 'level' are experimental).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string", + "values" : "Possible values: \"fifo\", \"level\", \"none\", \"universal\"" + }, + "rocksdb.compression-type" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "lz4", + "deprecatedIn" : null, + "description" : "The compression algorithm to use within RocksDB.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string", + "values" : "Possible values: \"lz4\", \"lz4hc\", \"none\", \"snappy\"" + }, + "rocksdb.create-sha-files" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable the generation of sha256 files for each .sst file.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.debug-logging" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to enable RocksDB debug logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "If set to `true`, enables verbose logging of\nRocksDB's actions into the logfile written by ArangoDB (if the\n`--rocksdb.use-file-logging` option is off), or RocksDB's own log (if the\n`--rocksdb.use-file-logging` option is on).\n\nThis option is turned off by default, but you can enable it for debugging\nRocksDB internals and performance.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.delayed-write-rate" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Limit the write rate to the database (in bytes per second) when writing to the last mem-table allowed and if more than 3 mem-tables are allowed, or if a certain number of level-0 files are surpassed and writes need to be slowed down.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.dynamic-level-bytes" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to determine the number of bytes for each level dynamically to minimize space amplification.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If set to `true`, the amount of data in each level\nof the LSM tree is determined dynamically to minimize the space amplification.\nOtherwise, the level sizes are fixed. The dynamic sizing allows RocksDB to\nmaintain a well-structured LSM tree regardless of total data size.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.edge-cache" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : true, + "deprecatedIn" : [ + "v3.10.0" + ], + "description" : "Whether to use the in-memory cache for edges", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.6.4" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.enable-blob-files" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable blob files for the documents column family.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.enable-blob-garbage-collection" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable blob garbage collection during compaction in the documents column family. Requires `--rocksdb.enable-blob-files`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.enable-index-compression" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable index compression.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.enable-pipelined-write" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "If enabled, use a two stage write queue for WAL writes and memtable writes.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.enable-statistics" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether RocksDB statistics should be enabled.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.encryption-gen-internal-key" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Generate an internal encryption-at-rest key.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.encryption-hardware-acceleration" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Use Intel intrinsics-based encryption, requiring a CPU with the AES-NI instruction set. If turned off, then OpenSSL is used, which may use hardware-accelerated encryption, too.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.encryption-key-generator" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string" + }, + "rocksdb.encryption-key-rotation" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow encryption key rotation.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.encryption-keyfile" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A file containing an encryption key. If set, encryption is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string" + }, + "rocksdb.encryption-keyfolder" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A folder containing all possible user encryption keys. All keys are used to decrypt the internal keystore.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string" + }, + "rocksdb.enforce-block-cache-size-limit" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, strictly enforces the block cache size limit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Whether the maximum size of the RocksDB block\ncache is strictly enforced. You can set this option to limit the memory usage of\nthe block cache to at most the specified size. If inserting a data block into\nthe cache would exceed the cache's capacity, the data block is not inserted.\nIf disabled, a data block may still get inserted into the cache. It is evicted\nlater, but the cache may temporarily grow beyond its capacity limit. \n\nThe default value for `--rocksdb.enforce-block-cache-size-limit` was `false`\nbefore version 3.10, but was changed to `true` from version 3.10 onwards.\n\nTo improve stability of memory usage and prevent exceeding the block cache\ncapacity limit (as configurable via `--rocksdb.block-cache-size`), it is\nrecommended to set this option to `true`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.exclusive-writes" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : [ + "v3.8.0" + ], + "description" : "If enabled, writes are exclusive. This allows the RocksDB engine to mimic the collection locking behavior of the now-removed MMFiles storage engine, but inhibits concurrent write operations.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.4" + ], + "longDescription" : "This option allows you to make all writes to the\nRocksDB storage exclusive and therefore avoid write-write conflicts.\n\nThis option was introduced to open a way to upgrade from the legacy MMFiles to\nthe RocksDB storage engine without modifying client application code.\nYou should avoid enabling this option as the use of exclusive locks on\ncollections introduce a noticeable throughput penalty.\n\n**Note**: The MMFiles engine was removed and this option is a stopgap measure\nonly. This option is thus deprecated, and will be removed in a future\nversion.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.force-legacy-comparator" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If set to `true`, forces a new database directory to use the legacy sorting method. This is only for testing. Don't use.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.12.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.format-version" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 5, + "deprecatedIn" : null, + "description" : "The table format version to use inside RocksDB.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.0" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint32", + "values" : "Possible values: 3, 4, 5" + }, + "rocksdb.intermediate-commit-count" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1000000, + "deprecatedIn" : null, + "description" : "An intermediate commit is performed automatically when this number of operations is reached in a transaction, and a new transaction is started.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.intermediate-commit-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 536870912, + "deprecatedIn" : null, + "description" : "An intermediate commit is performed automatically when a transaction has accumulated operations of this size (in bytes), and a new transaction is started.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.level0-compaction-trigger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The number of level-0 files that triggers a compaction.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Compaction of level-0 to level-1 is triggered when\nthis many files exist in level-0. If you set this option to a higher number, it\nmay help bulk writes at the expense of slowing down reads.", + "maxInclusive" : true, + "maxValue" : 9223372036854775807, + "minInclusive" : true, + "minValue" : -9223372036854775808, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int64" + }, + "rocksdb.level0-slowdown-trigger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 16, + "deprecatedIn" : null, + "description" : "The number of level-0 files that triggers a write slowdown", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "When this many files accumulate in level-0, writes\nare slowed down to `--rocksdb.delayed-write-rate` to allow compaction to\ncatch up.", + "maxInclusive" : true, + "maxValue" : 9223372036854775807, + "minInclusive" : true, + "minValue" : -9223372036854775808, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int64" + }, + "rocksdb.level0-stop-trigger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 256, + "deprecatedIn" : null, + "description" : "The number of level-0 files that triggers a full write stop", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "When this many files accumulate in level-0, writes\nare stopped to allow compaction to catch up.", + "maxInclusive" : true, + "maxValue" : 9223372036854775807, + "minInclusive" : true, + "minValue" : -9223372036854775808, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int64" + }, + "rocksdb.limit-open-files-at-startup" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Limit the amount of .sst files RocksDB inspects at startup, in order to reduce the startup I/O operations.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.max-background-jobs" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 8, + "deprecatedIn" : null, + "description" : "The maximum number of concurrent background jobs (compactions and flushes).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The jobs are submitted to the low priority thread\npool. The default value is the number of processors in the system.", + "maxInclusive" : true, + "maxValue" : 2147483647, + "minInclusive" : true, + "minValue" : -2147483648, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int32" + }, + "rocksdb.max-bytes-for-level-base" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 268435456, + "deprecatedIn" : null, + "description" : "If not using dynamic level sizes, this controls the maximum total data size for level-1 of the LSM tree.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-bytes-for-level-multiplier" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "If not using dynamic level sizes, the maximum number of bytes for level L of the LSM tree can be calculated as max-bytes-for-level-base * (max-bytes-for-level-multiplier ^ (L-1))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : false, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.max-concurrent-index-fill-tasks" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The maximum number of index fill tasks that can run concurrently on server startup.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.6", + "v3.10.2" + ], + "longDescription" : "The lower this number, the lower the impact of the\nindex cache filling, but the longer it takes to complete.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-parallel-compactions" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The maximum number of parallel compactions jobs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.11" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-subcompactions" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The maximum number of concurrent sub-jobs for a background compaction.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint32" + }, + "rocksdb.max-total-wal-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 83886080, + "deprecatedIn" : null, + "description" : "The maximum total size of WAL files that force a flush of stale column families.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "When reached, force a flush of all column families\nwhose data is backed by the oldest WAL files. If you set this option to a low\nvalue, regular flushing of column family data from memtables is triggered, so\nthat WAL files can be moved to the archive.\n\nIf you set this option to a high value, regular flushing is avoided but may\nprevent WAL files from being moved to the archive and being removed.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-transaction-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 18446744073709551615, + "deprecatedIn" : null, + "description" : "The transaction size limit (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Transactions store all keys and values in RAM, so\nlarge transactions run the risk of causing out-of-memory situations. This\nsetting allows you to ensure that it does not happen by limiting the size of\nany individual transaction. Transactions whose operations would consume more\nRAM than this threshold value are aborted automatically with error 32\n(\"resource limit exceeded\").", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The maximum number of write buffers that build up in memory (default: number of column families + 2 = 9 write buffers). You can only increase the number.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If this number is reached before the buffers can\nbe flushed, writes are slowed or stalled.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-definitions" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the definitions column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-documents" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the documents column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-edge" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the edge column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-fulltext" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the fulltext column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-geo" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the geo column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-primary" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the primary column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-replicated-logs" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the replicated-logs column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-number-vpack" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "If non-zero, overrides the value of `--rocksdb.max-write-buffer-number` for the vpack column family", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.max-write-buffer-size-to-maintain" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum size of immutable write buffers that build up in memory per column family. Larger values mean that more in-memory data can be used for transaction conflict checking (-1 = use automatic default value, 0 = do not keep immutable flushed write buffers, which is the default and usually correct).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.3" + ], + "longDescription" : "The default value `0` restores the memory usage\npattern of version 3.6. This makes RocksDB not keep any flushed immutable\nwrite-buffers in memory.", + "maxInclusive" : true, + "maxValue" : 9223372036854775807, + "minInclusive" : true, + "minValue" : -9223372036854775808, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int64" + }, + "rocksdb.min-blob-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 256, + "deprecatedIn" : null, + "description" : "The size threshold for storing documents in blob files (in bytes, 0 = store all documents in blob files). Requires `--rocks.enable-blob-files`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.min-write-buffer-number-to-merge" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The minimum number of write buffers that are merged together before writing to storage.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.minimum-disk-free-bytes" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 16777216, + "deprecatedIn" : null, + "description" : "The minimum number of free disk bytes for considering the server healthy in health checks (0 = disable the check).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.minimum-disk-free-percent" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0.01, + "deprecatedIn" : null, + "description" : "The minimum percentage of free disk space for considering the server healthy in health checks (0 = disable the check).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.num-levels" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 7, + "deprecatedIn" : null, + "description" : "The number of levels for the database in the LSM tree.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 20, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.num-threads-priority-high" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The number of threads for high priority operations (e.g. flush).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.5" + ], + "longDescription" : "The recommended value is to set this equal to\n`max-background-flushes`. The default value is `number of processors / 2`.", + "maxInclusive" : true, + "maxValue" : 64, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint32" + }, + "rocksdb.num-threads-priority-low" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The number of threads for low priority operations (e.g. compaction).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The default value is\n`number of processors / 2`.", + "maxInclusive" : true, + "maxValue" : 256, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint32" + }, + "rocksdb.num-uncompressed-levels" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The number of levels that do not use compression in the LSM tree.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Levels above the default of `2` use Snappy\ncompression to reduce the disk space requirements for storing data in these\nlevels.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.optimize-filters-for-hits" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether the implementation should optimize the filters mainly for cases where keys are found rather than also optimize for keys missed. You can enable the option if you know that there are very few misses or the performance in the case of misses is not important for your application.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.partition-files-for-documents" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, the document data for different collections/shards will end up in different .sst files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.11.3" + ], + "longDescription" : "Enabling this option will make RocksDB's\ncompaction write the document data for different collections/shards\ninto different .sst files. Otherwise the document data from different \ncollections/shards can be mixed and written into the same .sst files.\n\nEnabling this option usually has the benefit of making the RocksDB\ncompaction more efficient when a lot of different collections/shards\nare written to in parallel.\nThe disavantage of enabling this option is that there can be more .sst\nfiles than when the option is turned off, and the disk space used by\nthese .sst files can be higher than if there are fewer .sst files (this\nis because there is some per-.sst file overhead).\nIn particular on deployments with many collections/shards\nthis can lead to a very high number of .sst files, with the potential\nof outgrowing the maximum number of file descriptors the ArangoDB process \ncan open. Thus the option should only be enabled on deployments with a\nlimited number of collections/shards.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.partition-files-for-edge-index" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, the index data for different edge indexes will end up in different .sst files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.11.3" + ], + "longDescription" : "Enabling this option will make RocksDB's\ncompaction write the edge index data for different edge collections/shards\ninto different .sst files. Otherwise the edge index data from different \nedge collections/shards can be mixed and written into the same .sst files.\n\nEnabling this option usually has the benefit of making the RocksDB\ncompaction more efficient when a lot of different edge collections/shards\nare written to in parallel.\nThe disavantage of enabling this option is that there can be more .sst\nfiles than when the option is turned off, and the disk space used by\nthese .sst files can be higher than if there are fewer .sst files (this\nis because there is some per-.sst file overhead).\nIn particular on deployments with many edge collections/shards\nthis can lead to a very high number of .sst files, with the potential\nof outgrowing the maximum number of file descriptors the ArangoDB process \ncan open. Thus the option should only be enabled on deployments with a\nlimited number of edge collections/shards.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.partition-files-for-persistent-index" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, the index data for different persistent indexes will end up in different .sst files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.11.3" + ], + "longDescription" : "Enabling this option will make RocksDB's\ncompaction write the persistent index data for different persistent\nindexes (also indexes from different collections/shards) into different \n.sst files. Otherwise the persistent index data from different \ncollections/shards/indexes can be mixed and written into the same .sst files.\n\nEnabling this option usually has the benefit of making the RocksDB\ncompaction more efficient when a lot of different collections/shards/indexes\nare written to in parallel.\nThe disavantage of enabling this option is that there can be more .sst\nfiles than when the option is turned off, and the disk space used by\nthese .sst files can be higher than if there are fewer .sst files (this\nis because there is some per-.sst file overhead).\nIn particular on deployments with many collections/shards/indexes\nthis can lead to a very high number of .sst files, with the potential\nof outgrowing the maximum number of file descriptors the ArangoDB process \ncan open. Thus the option should only be enabled on deployments with a\nlimited number of edge collections/shards/indexes.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.partition-files-for-primary-index" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, the primary index data for different collections/shards will end up in different .sst files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.11.3" + ], + "longDescription" : "Enabling this option will make RocksDB's\ncompaction write the primary index data for different collections/shards\ninto different .sst files. Otherwise the primary index data from different \ncollections/shards can be mixed and written into the same .sst files.\n\nEnabling this option usually has the benefit of making the RocksDB\ncompaction more efficient when a lot of different collections/shards\nare written to in parallel.\nThe disavantage of enabling this option is that there can be more .sst\nfiles than when the option is turned off, and the disk space used by\nthese .sst files can be higher than if there are fewer .sst files (this\nis because there is some per-.sst file overhead).\nIn particular on deployments with many collections/shards\nthis can lead to a very high number of .sst files, with the potential\nof outgrowing the maximum number of file descriptors the ArangoDB process \ncan open. Thus the option should only be enabled on deployments with a\nlimited number of collections/shards.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.pending-compactions-slowdown-trigger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 131072, + "deprecatedIn" : null, + "description" : "The number of pending compaction bytes that triggers a write slowdown.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.pending-compactions-stop-trigger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 17179869184, + "deprecatedIn" : null, + "description" : "The number of pending compaction bytes that triggers a full write stop.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.periodic-compaction-ttl" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 2592000, + "deprecatedIn" : null, + "description" : "Time-to-live (in seconds) for periodic compaction of .sst files, based on the file age (0 = no periodic compaction).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.3" + ], + "longDescription" : "The default value from RocksDB is ~30 days. To\navoid periodic auto-compaction and the I/O caused by it, you can set this\noption to `0`.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.pin-l0-filter-and-index-blocks-in-cache" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled and `--rocksdb.cache-index-and-filter-blocks` is also enabled, filter and index blocks are pinned and only evicted from cache when the table reader is freed.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.pin-top-level-index-and-filter" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "If enabled and `--rocksdb.cache-index-and-filter-blocks` is also enabled, the top-level index of partitioned filter and index blocks are pinned and only evicted from cache when the table reader is freed.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.prepopulate-block-cache" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Pre-populate block cache on flushes.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.recycle-log-file-num" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, keep a pool of log files around for recycling.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.reserve-file-metadata-memory" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "account for .sst file metadata memory in block cache", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.reserve-table-builder-memory" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Account for table building memory in block cache.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.reserve-table-reader-memory" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Account for table reader memory in block cache.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.sync-delay-threshold" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 5000, + "deprecatedIn" : null, + "description" : "The threshold for self-observation of WAL disk syncs (in milliseconds, 0 = no warnings). Any WAL disk sync longer ago than this threshold triggers a warning ", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.6.8", + "v3.7.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.sync-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 100, + "deprecatedIn" : null, + "description" : "The interval for automatic, non-requested disk syncs (in milliseconds, 0 = turn automatic syncing off)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Automatic synchronization of data from RocksDB's\nwrite-ahead logs to disk is only performed for not-yet synchronized data, and\nonly for operations that have been executed without the `waitForSync`\nattribute.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.table-block-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 16384, + "deprecatedIn" : null, + "description" : "The approximate size (in bytes) of the user data packed per block for uncompressed data.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.target-file-size-base" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 67108864, + "deprecatedIn" : null, + "description" : "Per-file target file size for compaction (in bytes). The actual target file size for each level is `--rocksdb.target-file-size-base` multiplied by `--rocksdb.target-file-size-multiplier` ^ (level - 1)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.1" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.target-file-size-multiplier" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The multiplier for `--rocksdb.target-file-size`. A value of 1 means that files in different levels will have the same size.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.1" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.throttle" : { + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable write-throttling.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If enabled, dynamically throttles the ingest rate\nof writes if necessary to reduce chances of compactions getting too far behind\nand blocking incoming writes.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.throttle-frequency" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 1000, + "deprecatedIn" : null, + "description" : "The frequency for write-throttle calculations (in milliseconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.5" + ], + "longDescription" : "If the throttling is enabled, it recalculates a\nnew maximum ingestion rate with this frequency.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.throttle-lower-bound-bps" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 10485760, + "deprecatedIn" : null, + "description" : "The lower bound for throttle's write bandwidth (in bytes per second).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.throttle-max-write-rate" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum write rate enforced by throttle (in bytes per second, 0 = unlimited).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.5" + ], + "longDescription" : "The actual write rate established by the\nthrottling is the minimum of this value and the value that the regular throttle\ncalculation produces, i.e. this option can be used to set a fixed upper bound\non the write rate.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.throttle-scaling-factor" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 17, + "deprecatedIn" : null, + "description" : "The adaptiveness scaling factor for write-throttle calculations.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.5" + ], + "longDescription" : "There is normally no need to change this value.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.throttle-slots" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 120, + "deprecatedIn" : null, + "description" : "The number of historic metrics to use for throttle value calculation.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.5" + ], + "longDescription" : "If throttling is enabled, this parameter controls\nthe number of previous intervals to use for throttle value calculation.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.throttle-slow-down-writes-trigger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 8, + "deprecatedIn" : null, + "description" : "The number of level 0 files whose payload is not considered in throttle calculations when penalizing the presence of L0 files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.5" + ], + "longDescription" : "There is normally no need to change this value.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.total-write-buffer-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 12376911052, + "deprecatedIn" : null, + "description" : "The maximum total size of in-memory write buffers (0 = unbounded).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The total amount of data to build up in all\nin-memory buffers (backed by log files). You can use this option together with\nthe block cache size configuration option to limit memory usage.\n\nIf set to `0`, the memory usage is not limited.\n\nIf set to a value larger than `0`, this caps memory usage for write buffers but\nmay have an effect on performance. If there is more than 4 GiB of RAM in the\nsystem, the default value is `(system RAM size - 2 GiB) * 0.5`.\n\nFor systems with less RAM, the default values are:\n\n- 512 MiB for systems with between 1 and 4 GiB of RAM.\n- 256 MiB for systems with less than 1 GiB of RAM.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.transaction-lock-stripes" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 16, + "deprecatedIn" : null, + "description" : "The number of lock stripes to use for transaction locks.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.2" + ], + "longDescription" : "You can control the number of lock stripes to use\nfor RocksDB's transaction lock manager with this option. You can use higher\nvalues to reduce a potential contention in the lock manager.\n\nThe option defaults to the number of available cores, but is increased to a\nvalue of `16` if the number of cores is lower.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.transaction-lock-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 1000, + "deprecatedIn" : null, + "description" : "If positive, specifies the wait timeout in milliseconds when a transaction attempts to lock a document. A negative value is not recommended as it can lead to deadlocks (0 = no waiting, < 0 no timeout)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 9223372036854775807, + "minInclusive" : true, + "minValue" : -9223372036854775808, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "int64" + }, + "rocksdb.use-direct-io-for-flush-and-compaction" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Use O_DIRECT for writing files for flush and compaction.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.use-direct-reads" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Use O_DIRECT for reading files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.use-file-logging" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Use a file-base logger for RocksDB's own logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "If set to `true`, enables writing of RocksDB's own\ninformational log files into RocksDB's database directory.\n\nThis option is turned off by default, but you can enable it for debugging\nRocksDB internals and performance.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.use-fsync" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to use fsync calls when writing to disk (set to false for issuing fdatasync calls only).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.use-range-delete-in-wal" : { + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable range delete markers in the write-ahead log (WAL). Potentially incompatible with older arangosync versions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.9.3" + ], + "longDescription" : "Controls whether the collection truncate operation\nin the cluster can use RangeDelete operations in RocksDB. Using RangeDeletes is\nfast and reduces the algorithmic complexity of the truncate operation to O(1),\ncompared to O(n) for when this option is turned off (with n being the number of\ndocuments in the collection/shard).\n\nPrevious versions of ArangoDB used RangeDeletes only on a single server, but\nnever in a cluster. \n\nThe default value for this option is `true`, and you should only change this\nvalue in case of emergency. This option is only honored in the cluster.\nSingle server and Active Failover deployments do not use RangeDeletes regardless\nof the value of this option.\n\nNote that it is not guaranteed that all truncate operations use a RangeDelete\noperation. For collections containing a low number of documents, the O(n)\ntruncate method may still be used.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.verify-sst" : { + "category" : "command", + "component" : [ + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Verify the validity of .sst files present in the `engine-rocksdb` directory on startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.0" + ], + "longDescription" : "If set to `true`, during startup, all .sst files\nin the `engine-rocksdb` folder in the database directory are checked for\npotential corruption and errors. The server process stops after the check and\nreturns an exit code of `0` if the validation was successful, or a non-zero\nexit code if there is an error in any of the .sst files.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.wal-archive-size-limit" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum total size (in bytes) of archived WAL files to keep on the leader (0 = unlimited).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "A value of `0` does not restrict the size of the\narchive, so the leader removes archived WAL files when there are no replication\nclients needing them. Any non-zero value restricts the size of the WAL files\narchive to about the specified value and trigger WAL archive file deletion once\nthe threshold is reached. You can use this to get rid of archived WAL files in\na disk size-constrained environment.\n\n**Note**: The value is only a threshold, so the archive may get bigger than \nthe configured value until the background thread actually deletes files from\nthe archive. Also note that deletion from the archive only kicks in after\n`--rocksdb.wal-file-timeout-initial` seconds have elapsed after server start.\n\nArchived WAL files are normally deleted automatically after a short while when\nthere is no follower attached that may read from the archive. However, in case\nwhen there are followers attached that may read from the archive, WAL files\nnormally remain in the archive until their contents have been streamed to the\nfollowers. In case there are slow followers that cannot catch up, this causes a\ngrowth of the WAL files archive over time.\n\nYou can use the option to force a deletion of WAL files from the archive even if\nthere are followers attached that may want to read the archive. In case the\noption is set and a leader deletes files from the archive that followers want to\nread, this aborts the replication on the followers. Followers can restart the\nreplication doing a resync, however.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "rocksdb.wal-directory" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Absolute path for RocksDB WAL files. If not set, a subdirectory `journals` inside the database directory is used.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "string" + }, + "rocksdb.wal-file-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 10, + "deprecatedIn" : null, + "description" : "The timeout after which unused WAL files are deleted (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Data of ongoing transactions is stored in RAM.\nTransactions that get too big (in terms of number of operations involved or the\ntotal size of data created or modified by the transaction) are committed\nautomatically. Effectively, this means that big user transactions are split into\nmultiple smaller RocksDB transactions that are committed individually.\nThe entire user transaction does not necessarily have ACID properties in this\ncase.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.wal-file-timeout-initial" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "single" + ], + "default" : 60, + "deprecatedIn" : null, + "description" : "The initial timeout (in seconds) after which unused WAL files deletion kicks in after server start.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "If you decrease the value, the server starts the\nremoval of obsolete WAL files earlier after server start. This is useful in\ntesting environments that are space-restricted and do not require keeping much\nWAL file data at all.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "double" + }, + "rocksdb.wal-recovery-skip-corrupted" : { + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Skip corrupted records in WAL recovery.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "rocksdb", + "type" : "boolean" + }, + "rocksdb.write-buffer-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver", + "agent", + "single" + ], + "default" : 67108864, + "deprecatedIn" : null, + "description" : "The amount of data to build up in memory before converting to a sorted on-disk file (0 = disabled).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The amount of data to build up in each in-memory\nbuffer (backed by a log file) before closing the buffer and queuing it to be\nflushed to standard storage. Larger values than the default may improve\nperformance, especially for bulk loads.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "rocksdb", + "type" : "uint64" + }, + "server.allow-use-database" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow to change the database in REST actions. Only needed internally for unit tests.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to use authentication for all client requests.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can set this option to `false` to turn off\nauthentication on the server-side, so that all clients can execute any action\nwithout authorization and privilege checks. You should only do this if you bind\nthe server to `localhost` to not expose it to the public internet", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication-system-only" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Use HTTP authentication only for requests to /_api and /_admin endpoints.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, then HTTP\nauthentication is only required for requests going to URLs starting with `/_`,\nbut not for other endpoints. You can thus use this option to expose custom APIs\nof Foxx microservices without HTTP authentication to the outside world, but\nprevent unauthorized access of ArangoDB APIs and the admin interface.\n\nNote that checking the URL is performed after any database name prefix has been\nremoved. That means, if the request URL is `/_db/_system/myapp/myaction`, the\nURL `/myapp/myaction` is checked for the `/_` prefix.\n\nAuthentication still needs to be enabled for the server via\n`--server.authentication` in order for HTTP authentication to be forced for the\nArangoDB APIs and the web interface. Only setting\n`--server.authentication-system-only` is not enough.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The timeout for the authentication cache (in seconds, 0 = indefinitely).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option is only necessary if you use an\nexternal authentication system like LDAP.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.authentication-unix-sockets" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to use authentication for requests via UNIX domain sockets.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `false`, authentication\nfor requests coming in via UNIX domain sockets is turned off on the server-side.\nClients located on the same host as the ArangoDB server can use UNIX domain\nsockets to connect to the server without authentication. Requests coming in by\nother means (e.g. TCP/IP) are not affected by this option.", + "obsolete" : false, + "os" : [ + "linux", + "macos" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.cluster-metrics-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "Cluster metrics polling timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.0" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint32" + }, + "server.count-descriptors-interval" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 60000, + "deprecatedIn" : null, + "description" : "Controls the interval (in milliseconds) in which the number of open file descriptors for the process is determined (0 = disable counting).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.descriptors-minimum" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 8192, + "deprecatedIn" : null, + "description" : "The minimum number of file descriptors needed to start (0 = no minimum)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.early-connections" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allow requests to a limited set of APIs early during the server startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.endpoint" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + "tcp://0.0.0.0:8529" + ], + "deprecatedIn" : null, + "description" : "Endpoint for client requests (e.g. `http+tcp://127.0.0.1:8529`, or `vst+ssl://192.168.1.1:8529`)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can specify this option multiple times to let\nthe ArangoDB server listen for incoming requests on multiple endpoints.\n\nThe endpoints are normally specified either in ArangoDB's configuration file or\non the command-line with `--server.endpoint`. ArangoDB supports different types\nof endpoints:\n\n- `tcp://ipv4-address:port` - TCP/IP endpoint, using IPv4\n- `tcp://[ipv6-address]:port` - TCP/IP endpoint, using IPv6\n- `ssl://ipv4-address:port` - TCP/IP endpoint, using IPv4, SSL encryption\n- `ssl://[ipv6-address]:port` - TCP/IP endpoint, using IPv6, SSL encryption\n- `unix:///path/to/socket` - Unix domain socket endpoint\n\nIf a TCP/IP endpoint is specified without a port number, then the default port\n(8529) is used.\n\nIf you use SSL-encrypted endpoints, you must also supply the path to a server\ncertificate using the `--ssl.keyfile` option.\n\n```bash\narangod --server.endpoint tcp://127.0.0.1:8529 \\\n --server.endpoint ssl://127.0.0.1:8530 \\\n --ssl.keyfile server.pem /tmp/data-dir\n\n2022-11-07T10:39:29Z [1] INFO [e52b0] {general} ArangoDB 3.10.0 [linux] 64bit, using jemalloc, build tags/v3.10.0-0-g207ec6937e4, VPack 0.1.36, RocksDB 7.2.0, ICU 64.2, V8 7.9.317, OpenSSL 1.1.1q 5 Jul 2022\n2022-11-07T10:39:29Z [1] INFO [75ddc] {general} detected operating system: Linux version 4.15.0-140-generic (buildd@lgw01-amd64-054) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #144-Ubuntu SMP Fri Mar 19 14:12:35 UTC 2021\n2022-11-07T10:39:29Z [1] INFO [25362] {memory} Available physical memory: 67513589760 bytes, available cores: 32\n2022-11-07T10:39:29Z [1] INFO [a1c60] {syscall} file-descriptors (nofiles) hard limit is 1048576, soft limit is 1048576\n2022-11-07T10:39:29Z [1] INFO [3bb7d] {cluster} Starting up with role SINGLE\n2022-11-07T10:39:29Z [1] INFO [f6e0e] {aql} memory limit per AQL query automatically set to 40508153856 bytes. to modify this value, please adjust the startup option `--query.memory-limit`\n2022-11-07T10:39:30Z [1] INFO [fe333] {engines} RocksDB recovery starting, scanning WAL starting from sequence number 91, latest sequence number: 202, files in archive: 0\n2022-11-07T10:39:30Z [1] INFO [a4ec8] {engines} RocksDB recovery finished, WAL entries scanned: 116, recovery start sequence number: 91, latest WAL sequence number: 202, max tick value found in WAL: 24, last HLC value found in WAL: 1748833470939922432\n2022-11-07T10:39:30Z [1] INFO [c1b63] {arangosearch} ArangoSearch maintenance: [5..5] commit thread(s), [5..5] consolidation thread(s)\n2022-11-07T10:39:30Z [1] INFO [6ea38] {general} using endpoint 'http+ssl://0.0.0.0:8530' for ssl-encrypted requests\n2022-11-07T10:39:30Z [1] INFO [6ea38] {general} using endpoint 'http+tcp://0.0.0.0:8529' for non-encrypted requests\n2022-11-07T10:39:31Z [1] INFO [cf3f4] {general} ArangoDB (version 3.10.0 [linux]) is ready for business. Have fun!\n```\n\nOn one specific ethernet interface, each port can only be bound\n**exactly once**. You can look up your available interfaces using the `ifconfig`\ncommand on Linux / macOS, and `ipconfig` on Windows. The general names of the\ninterfaces differ between operating systems and the hardware they run on.\nHowever, every host has typically a so called loopback interface, which is a\nvirtual interface. By convention, it always has the address `127.0.0.1` (IPv4)\nor `::1` (IPv6), and can only be reached from the very same host. Ethernet\ninterfaces usually have names like `eth0`, `wlan0`, `eth1:17`, `le0`, or a\nplain text name in Windows.\n\nTo find out which services already use ports (so ArangoDB can't bind them\nanymore), you can use the `netstat` command. It behaves a little different on\neach platform; run it with `-lnpt` on Linux, `-p tcp` on macOS, or with `-an`\non Windows for valuable information.\n\nArangoDB can also do a so called *broadcast bind* using `tcp://0.0.0.0:8529`.\nThis way, it is reachable on all interfaces of the host. This may be useful on\ndevelopment systems that frequently change their network setup, like laptops.\n\nArangoDB can also listen to IPv6 link-local addresses via adding the zone ID\nto the IPv6 address in the form `[ipv6-link-local-address%zone-id]`. However,\nwhat you probably want instead is to bind to a local IPv6 address. Local IPv6\naddresses start with `fd`. If you only see a `fe80:` IPv6 address in your\ninterface configuration but no IPv6 address starting with `fd`, your interface\nhas no local IPv6 address assigned. You can read more about IPv6 link-local\naddresses here: https://en.wikipedia.org/wiki/Link-local_address#IPv6.\n\nTo bind to a link-local and local IPv6 address, run `ifconfig` or equivalent\ncommand. The command lists all interfaces and assigned IP addresses. The\nlink-local address may be `fe80::6257:18ff:fe82:3ec6%eth0` (IPv6 address plus\ninterface name). A local IPv6 address may be `fd12:3456::789a`.\nTo bind ArangoDB to it, start `arangod` with\n`--server.endpoint tcp://[fe80::6257:18ff:fe82:3ec6%eth0]:8529`.\nYou can use `telnet` to test the connection.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.ensure-whitespace-metrics-format" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Set to `true` to ensure whitespace between the exported metric value and the preceding token (metric name or labels) in the metrics output.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.6" + ], + "longDescription" : "Using the whitespace characters in the output may\nbe required to make the metrics output compatible with some processing tools,\nalthough Prometheus itself doesn't need it.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.export-metrics-api" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable the metrics API.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.6.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.export-read-write-metrics" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to enable metrics for document reads and writes.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.7" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.export-shard-usage-metrics" : { + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : "disabled", + "deprecatedIn" : null, + "description" : "Whether or not to export shard usage metrics.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.13", + "v3.11.7" + ], + "longDescription" : "This option can be used to make DB-Servers export\ndetailed shard usage metrics.\n\n- By default, this option is set to `disabled` so that no shard usage metrics\n are exported.\n\n- Set the option to `enabled-per-shard` to make DB-Servers collect per-shard\n usage metrics whenever a shard is accessed.\n\n- Set this option to `enabled-per-shard-per-user` to make DB-Servers collect\n usage metrics per shard and per user whenever a shard is accessed.\n\nNote that enabling shard usage metrics can produce a lot of metrics if there \nare many shards and/or users in the system.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string", + "values" : "Possible values: \"disabled\", \"enabled-per-shard\", \"enabled-per-shard-per-user\"" + }, + "server.gid" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Switch to this group ID after reading configuration files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.harden" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Lock down REST APIs that reveal version information or server internals for non-admin users.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.io-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The number of threads used to handle I/O.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.jwt-secret" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "description" : "The secret to use when doing JWT authentication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.jwt-secret-folder" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A folder containing one or more JWT secret files to use for JWT authentication.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.0" + ], + "longDescription" : "Files are sorted alphabetically, the first secret\nis used for signing + verifying JWT tokens (_active_ secret), and all other\nsecrets are only used to validate incoming JWT tokens (_passive_ secrets).\nOnly one secret needs to verify a JWT token for it to be accepted.\n\nYou can reload JWT secrets from disk without restarting the server or the nodes\nof a cluster deployment via the `POST /_admin/server/jwt` HTTP API endpoint.\nYou can use this feature to roll out new JWT secrets throughout a cluster.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.jwt-secret-keyfile" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "A file containing the JWT secret to use when doing JWT authentication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses JSON Web Tokens to authenticate\nrequests. Using this option lets you specify a JWT secret stored in a file.\nThe secret must be at most 64 bytes long.\n\n**Warning**: Avoid whitespace characters in the secret because they may get\ntrimmed, leading to authentication problems:\n- Character Tabulation (`\\t`, U+0009)\n- End of Line (`\\n`, U+000A)\n- Line Tabulation (`\\v`, U+000B)\n- Form Feed (`\\f`, U+000C)\n- Carriage Return (`\\r`, U+000D)\n- Space (U+0020)\n- Next Line (U+0085)\n- No-Nreak Space (U+00A0)\n\nIn single server setups, ArangoDB generates a secret if none is specified.\n\nIn cluster deployments which have authentication enabled, a secret must\nbe set consistently across all cluster nodes so they can talk to each other.\n\nArangoDB also supports an `--server.jwt-secret` option to pass the secret\ndirectly (without a file). However, this is discouraged for security\nreasons.\n\nYou can reload JWT secrets from disk without restarting the server or the nodes\nof a cluster deployment via the `POST /_admin/server/jwt` HTTP API endpoint.\nYou can use this feature to roll out new JWT secrets throughout a cluster.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.local-authentication" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to use ArangoDB's built-in authentication system.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `false`, only an\nexternal authentication system like LDAP is used. If set to `true`, also use\nthe built-in system which uses the `_users` system collection.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.maintenance-actions-block" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : 2, + "deprecatedIn" : null, + "description" : "The minimum number of seconds finished actions block duplicates.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 2147483647, + "minInclusive" : true, + "minValue" : -2147483648, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "int32" + }, + "server.maintenance-actions-linger" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : 3600, + "deprecatedIn" : null, + "description" : "The minimum number of seconds finished actions remain in the deque.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 2147483647, + "minInclusive" : true, + "minValue" : -2147483648, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "int32" + }, + "server.maintenance-slow-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : 1, + "deprecatedIn" : null, + "description" : "The maximum number of threads available for slow maintenance actions (long SynchronizeShard and long EnsureIndex).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.3" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint32" + }, + "server.maintenance-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : 3, + "deprecatedIn" : null, + "description" : "The maximum number of threads available for maintenance actions.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint32" + }, + "server.max-number-detached-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1000, + "deprecatedIn" : null, + "description" : "The maximum number of detached scheduler threads.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.5" + ], + "longDescription" : "If a scheduler thread performs a potentially long running operation like waiting for a lock, it can detach itself from the scheduler. This allows a new scheduler thread to be started and avoids blocking all threads with long-running operations, thereby avoiding deadlock situations. The default should normally be OK.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.maximal-number-sync-shard-actions" : { + "base" : 1, + "category" : "option", + "component" : [ + "dbserver" + ], + "default" : 32, + "deprecatedIn" : null, + "description" : "The maximum number of SynchronizeShard actions which may be queued at any given time.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.12.5" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.maximal-queue-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4096, + "deprecatedIn" : null, + "description" : "The size of the priority 3 FIFO.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can specify the maximum size of the queue for\nasynchronous task execution. If the queue already contains this many tasks, new\ntasks are rejected until other tasks are popped from the queue. Setting this\nvalue may help preventing an instance from being overloaded or from running out\nof memory if the queue is filled up faster than the server can process\nrequests.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.maximal-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum number of request handling threads to run (0 = use system-specific default of 32)", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option determines the maximum number of\nrequest processing threads the server is allowed to start for request handling.\nIf this number of threads is already running, arangod does not start further\nthreads for request handling. The default value is\n`max(32, 2 * available cores)`, so twice the number of CPU cores, but at least\n32 threads.\n\nThe actual number of request processing threads is adjusted dynamically at\nruntime and is between `--server.minimal-threads` and\n`--server.maximal-threads`.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.minimal-threads" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4, + "deprecatedIn" : null, + "description" : "The minimum number of request handling threads to run.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option determines the minimum number of\nrequest processing threads the server starts and always keeps around.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.ongoing-low-priority-multiplier" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4, + "deprecatedIn" : null, + "description" : "Controls the number of low priority requests that can be ongoing at a given point in time, relative to the maximum number of request handling threads.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "There are some countermeasures built into\nCoordinators to prevent a cluster from being overwhelmed by too many\nconcurrently executing requests.\n\nIf a request is executed on a Coordinator but needs to wait for some operation\non a DB-Server, the operating system thread executing the request can often\npostpone execution on the Coordinator, put the request to one side and do\nsomething else in the meantime. When the response from the DB-Server arrives,\nanother worker thread continues the work. This is a form of asynchronous\nimplementation, which is great to achieve better thread utilization and enhance\nthroughput.\n\nOn the other hand, this runs the risk that work is started on new requests\nfaster than old ones can be finished off. Before version 3.8, this could\noverwhelm the cluster over time, and lead to out-of-memory situations and other\nunwanted side effects. For example, it could lead to excessive latency for\nindividual requests.\n\nThere is a limit as to how many requests coming from the low priority queue\n(most client requests are of this type), can be executed concurrently.\nThe default value for this is 4 times as many as there are scheduler threads\n(see `--server.minimal-threads` and --server.maximal-threads), which is good\nfor most workloads. Requests in excess of this are not started but remain on\nthe scheduler's input queue (see `--server.maximal-queue-size`).\n\nVery occasionally, 4 is already too much. You would notice this if the latency\nfor individual requests is already too high because the system tries to execute\ntoo many of them at the same time (for example, if they fight for resources).\n\nOn the other hand, in rare cases it is possible that throughput can be improved\nby increasing the value, if latency is not a big issue and all requests\nessentially spend their time waiting, so that a high concurrency is acceptable.\nThis increases memory usage, though.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.prio1-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4096, + "deprecatedIn" : null, + "description" : "The size of the priority 1 FIFO.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.prio2-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4096, + "deprecatedIn" : null, + "description" : "The size of the priority 2 FIFO.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.rest-server" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Start a REST server.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.scheduler-queue-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 4096, + "deprecatedIn" : null, + "description" : "The number of simultaneously queued requests inside the scheduler.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.session-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 3600, + "deprecatedIn" : null, + "description" : "The lifetime for tokens (in seconds) that can be obtained from the `POST /_open/auth` endpoint. Used by the web interface for JWT-based sessions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "The web interface uses JWT for authentication.\nHowever, the session are renewed automatically as long as you regularly interact\nwith the web interface in your browser. You are not logged out while actively\nusing it.", + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : false, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.statistics" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable statistics gathering and statistics APIs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `false`, then ArangoDB's\nstatistics gathering is turned off. Statistics gathering causes regular\nbackground CPU activity, memory usage, and writes to the storage engine, so\nusing this option to turn statistics off might relieve heavily-loaded instances\na bit.\n\nA side effect of setting this option to `false` is that no statistics are\nshown in the dashboard of ArangoDB's web interface, and that the REST API for\nserver statistics at `/_admin/statistics` returns HTTP 404.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.statistics-all-databases" : { + "category" : "option", + "component" : [ + "coordinator" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Provide cluster statistics in the web interface for all databases.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.statistics-history" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to store statistics in the database.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.9", + "v3.5.1" + ], + "longDescription" : "If you set this option to `false`, then ArangoDB's\nstatistics gathering is turned off. Statistics gathering causes regular\nbackground CPU activity, memory usage, and writes to the storage engine, so\nusing this option to turn statistics off might relieve heavily-loaded instances\na bit.\n\nIf set to `false`, no statistics are shown in the dashboard of ArangoDB's\nweb interface, but the current statistics are available and can be queried\nusing the REST API for server statistics at `/_admin/statistics`.\nThis is less intrusive than setting the `--server.statistics` option to\n`false`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.storage-engine" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "auto", + "deprecatedIn" : null, + "description" : "The storage engine type (note that the MMFiles engine is unavailable since v3.7.0 and cannot be used anymore).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's storage engine is based on RocksDB, see\nhttp://rocksdb.org. It is the only available engine from ArangoDB v3.7 onwards.\n\nThe storage engine type needs to be the same for an entire deployment.\nLive switching of storage engines on already installed systems isn't supported.\nConfiguring the wrong engine (not matching the previously used one) results\nin the server refusing to start. You may use `auto` to let ArangoDB choose the\npreviously used one.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string", + "values" : "Possible values: \"auto\", \"rocksdb\"" + }, + "server.support-info-api" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "admin", + "deprecatedIn" : null, + "description" : "The policy for exposing the support info and also the telemetrics API.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string", + "values" : "Possible values: \"admin\", \"disabled\", \"jwt\", \"public\"" + }, + "server.telemetrics-api" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to enable the telemetrics API.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.telemetrics-api-max-requests" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 3, + "deprecatedIn" : null, + "description" : "The maximum number of requests from arangosh that the telemetrics API responds to without rate-limiting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.11.0" + ], + "longDescription" : "This option limits requests from the arangosh to\nthe telemetrics API, but not any other requests to the API.\n\nRequests to the telemetrics API are counted for every 2 hour interval, and then\nreset. This means after a period of at most 2 hours, the telemetrics API\nbecomes usable again.\n\nThe purpose of this option is to keep a deployment from being overwhelmed by\ntoo many telemetrics requests issued by arangosh instances that are used for\nbatch processing.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.uid" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Switch to this user ID after reading configuration files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.unavailability-queue-fill-grade" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0.75, + "deprecatedIn" : null, + "description" : "The queue fill grade from which onwards the server is considered unavailable because of an overload (ratio, 0 = disable)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.6.10", + "v3.7.6" + ], + "longDescription" : "You can use this option to set a high-watermark\nfor the scheduler's queue fill grade, from which onwards the server starts\nreporting unavailability via its availability API.\n\nThis option has a consequence for the `/_admin/server/availability` REST API\nonly, which is often called by load-balancers and other availability probing\nsystems.\n\nThe `/_admin/server/availability` REST API returns HTTP 200 if the fill\ngrade of the scheduler's queue is below the configured value, or HTTP 503 if\nthe fill grade is equal to or above it. This can be used to flag a server as\nunavailable in case it is already highly loaded.\n\nThe default value for this option is `0.75` since version 3.8, i.e. 75%.\n\nTo prevent sending more traffic to an already overloaded server, it can be\nsensible to reduce the default value to even `0.5`. This would mean that\ninstances with a queue longer than 50% of their maximum queue capacity would\nreturn HTTP 503 instead of HTTP 200 when their availability API is probed.", + "maxInclusive" : true, + "maxValue" : 1, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.validate-utf8-strings" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Perform UTF-8 string validation for incoming JSON and VelocyPack data.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.7.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "ssl.cafile" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The CA file used for secure connections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can use this option to specify a file with\nCA certificates that are sent to the client whenever the server requests a\nclient certificate. If you specify a file, the server only accepts client\nrequests with certificates issued by these CAs. Do not specify this option if\nyou want clients to be able to connect without specific certificates.\n\nThe certificates in the file must be PEM-formatted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "string" + }, + "ssl.cipher-list" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "HIGH:!EXPORT:!aNULL@STRENGTH", + "deprecatedIn" : null, + "description" : "The SSL ciphers to use. See the OpenSSL documentation.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can use this option to restrict the server to\ncertain SSL ciphers only, and to define the relative usage preference of SSL\nciphers.\n\nThe format of the option's value is documented in the OpenSSL documentation.\n\nTo check which ciphers are available on your platform, you may use the\nfollowing shell command:\n\n```bash\n> openssl ciphers -v\n\nECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1\nECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1\nDHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1\nDHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1\nDHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(256)\nMac=SHA1\n...\n```", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "string" + }, + "ssl.ecdh-curve" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "prime256v1", + "deprecatedIn" : null, + "description" : "The SSL ECDH curve, see the output of \"openssl ecparam -list_curves\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "string" + }, + "ssl.keyfile" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The keyfile used for secure connections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you use SSL-encryption by binding the server to\nan SSL endpoint (e.g. `--server.endpoint ssl://127.0.0.1:8529`), you must use\nthis option to specify the filename of the server's private key. The file must\nbe PEM-formatted and contain both, the certificate and the server's private key.\n\nYou can generate a keyfile using OpenSSL as follows:\n\n```bash\n# create private key in file \"server.key\"\nopenssl genpkey -out server.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -aes-128-cbc\n\n# create certificate signing request (csr) in file \"server.csr\"\nopenssl req -new -key server.key -out server.csr\n\n# copy away original private key to \"server.key.org\"\ncp server.key server.key.org\n\n# remove passphrase from the private key\nopenssl rsa -in server.key.org -out server.key\n\n# sign the csr with the key, creates certificate PEM file \"server.crt\"\nopenssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt\n\n# combine certificate and key into single PEM file \"server.pem\"\ncat server.crt server.key > server.pem\n```\n\nYou may use certificates issued by a Certificate Authority or self-signed\ncertificates. Self-signed certificates can be created by a tool of your\nchoice. When using OpenSSL for creating the self-signed certificate, the\nfollowing commands should create a valid keyfile:\n\n```\n-----BEGIN CERTIFICATE-----\n\n(base64 encoded certificate)\n\n-----END CERTIFICATE-----\n-----BEGIN RSA PRIVATE KEY-----\n\n(base64 encoded private key)\n\n-----END RSA PRIVATE KEY-----\n```\n\nFor further information please check the manuals of the tools you use to create\nthe certificate.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "string" + }, + "ssl.options" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 2147485776, + "deprecatedIn" : null, + "description" : "The SSL connection options. See the OpenSSL documentation.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to set various SSL-related\noptions. Individual option values must be combined using bitwise OR.\n\nWhich options are available on your platform is determined by the OpenSSL\nversion you use. The list of options available on your platform might be\nretrieved by the following shell command:\n\n```bash\n > grep \"#define SSL_OP_.*\" /usr/include/openssl/ssl.h\n\n #define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L\n #define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L\n #define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L\n #define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L\n #define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x00000010L\n #define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L\n ...\n```\n\nA description of the options can be found online in the OpenSSL documentation:\nhttp://www.openssl.org/docs/ssl/SSL_CTX_set_options.html)", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64" + }, + "ssl.prefer-http1-in-alpn" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Allows to let the server prefer HTTP/1.1 over HTTP/2 in ALPN protocol negotiations", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ssl", + "type" : "boolean" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 9, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "Use this option to specify the default encryption\nprotocol to be used. The default value is 9 (generic TLS), which allows the\nnegotiation of the TLS version between the client and the server, dynamically\nchoosing the highest mutually supported version of TLS.\n\nNote that SSLv2 is unsupported as of version 3.4, because of the inherent\nsecurity vulnerabilities in this protocol. Selecting SSLv2 as protocol aborts\nthe startup.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "ssl.require-peer-certificate" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Require a peer certificate from the client before connecting.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ssl", + "type" : "boolean" + }, + "ssl.server-name-indication" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Use a different server keyfile and certificate if the client indicates a specific server name. Format: SERVERNAME=KEYFILENAME", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.0" + ], + "longDescription" : "Sometimes, it is desirable to have the same server\nuse different server keys and certificates when it is contacted under different\nnames. This is what the TLS \"server name\" extension is for. See\nhttps://en.wikipedia.org/wiki/Server_Name_Indication) for details.\nfor details). With this extension, the client can choose a server name, and the\nserver can, using this information during the TLS handshake, use different\nserver keys and certificate chains.\n\nYou can specify the option multiple times. Each value must be a string in the\nformat `SERVERNAME=KEYFILENAME`. Replace `SERVERNAME` by a server name and\n`KEYFILENAME` by the file name of the key file to be used for that server name.\n\nThe format of the keyfile is identical to the one used for the `--ssl.keyfile`\noption. The keyfile used by default is the one in the `--ssl.keyfile` option,\nand only if there is an exact match between one server name given with\n`--ssl.server-name-indication` and the one in the handshake, the server switches\nto the alternative keyfile.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "string..." + }, + "ssl.session-cache" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Enable the session cache for connections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "ssl", + "type" : "boolean" + }, + "supervisor" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Start the server in supervisor mode. Requires --pid-file to be set.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Runs an arangod process as supervisor with another\narangod process as child, which acts as the server. In the event that the server\nunexpectedly terminates due to an internal error, the supervisor automatically\nrestarts the server. Enabling this option implies that the server runs as a\ndaemon.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "tcp.backlog-size" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 64, + "deprecatedIn" : null, + "description" : "Specify the size of the backlog for the `listen` system call.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The maximum value is platform-dependent.\nIf you specify a value higher than defined in the system header's `SOMAXCONN`\nmay result in a warning on server start. The actual value used by `listen`\nmay also be silently truncated on some platforms (this happens inside the\n`listen` system call).", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "tcp", + "type" : "uint64" + }, + "tcp.reuse-address" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Try to reuse TCP port(s).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, the socket\noption `SO_REUSEADDR` is set on all server endpoints, which is the default.\nIf you set this option to `false`, it is possible that it takes up to a minute\nafter a server has terminated until it is possible for a new server to use the\nsame endpoint again.\n\n**Note**: Under some operating systems, this can be a security risk because it\nmight be possible for another process to bind to the same address and port,\npossibly hijacking network traffic. Under Windows, ArangoDB additionally sets\nthe `SO_EXCLUSIVEADDRUSE` flag as a measure to alleviate this problem.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "tcp", + "type" : "boolean" + }, + "temp.intermediate-results-capacity" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 0, + "deprecatedIn" : null, + "description" : "The maximum capacity (in bytes) to use for ephemeral, intermediate results on disk (0 = unlimited).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "uint64" + }, + "temp.intermediate-results-encryption" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : false, + "deprecatedIn" : null, + "description" : "Encrypt ephemeral, intermediate results on disk.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "temp", + "type" : "boolean" + }, + "temp.intermediate-results-encryption-hardware-acceleration" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Use Intel intrinsics-based encryption, requiring a CPU with the AES-NI instruction set. If turned off, then OpenSSL is used, which may use hardware-accelerated encryption, too.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "temp", + "type" : "boolean" + }, + "temp.intermediate-results-path" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The path for storing ephemeral, intermediate results on disk (empty = not used).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Queries can store intermediate and final results\ntemporarily on disk if a specified threshold is exceeded, to decrease the memory\nusage. Specify a path to a directory for the temporary data to activate the\nspillover feature. The directory must not be located underneath the instance's \ndatabase directory.\n\nThe threshold value to start spilling data onto disk is either a number of rows\nproduced by a query or an amount of memory used in bytes, which you can set as\nquery options (`spillOverThresholdNumRows` and `spillOverThresholdMemoryUsage`).\n\n**Note**: This feature is experimental and is turned off by default.\nAlso, the query results are still built up entirely in memory on Coordinators\nand single servers for non-streaming queries. To avoid the buildup of the entire\nquery result in RAM, use a streaming query.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "temp.intermediate-results-spillover-threshold-memory-usage" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The memory usage threshold (in bytes) after which a spillover from RAM to disk happens for intermediate results (threshold per query executor).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "uint64" + }, + "temp.intermediate-results-spillover-threshold-num-rows" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 5000000, + "deprecatedIn" : null, + "description" : "The number of result rows after which a spillover from RAM to disk happens for intermediate results (threshold per query executor).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "uint64" + }, + "temp.path" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "transaction.streaming-idle-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : 60, + "deprecatedIn" : null, + "description" : "The idle timeout (in seconds) for Stream Transactions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "Stream Transactions automatically expire after\nthis period when no further operations are posted into them. Posting an\noperation into a non-expired Stream Transaction resets the transaction's\ntimeout to the configured idle timeout.", + "maxInclusive" : true, + "maxValue" : 120, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "transaction", + "type" : "double" + }, + "transaction.streaming-lock-timeout" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 8, + "deprecatedIn" : null, + "description" : "The lock timeout (in seconds) in case of parallel access to the same Stream Transaction.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.6.5", + "v3.7.1" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "transaction", + "type" : "double" + }, + "ttl.frequency" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 30000, + "deprecatedIn" : null, + "description" : "The frequency (in milliseconds) for the TTL background thread invocation (0 = turn the TTL background thread off entirely).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The lower this value, the more frequently the TTL\nbackground thread kicks in and scans all available TTL indexes for expired\ndocuments, and the earlier the expired documents are actually removed.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ttl", + "type" : "uint64" + }, + "ttl.max-collection-removes" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 100000, + "deprecatedIn" : null, + "description" : "The maximum number of documents to remove per collection in each invocation of the TTL thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can configure this value separately from the\ntotal removal amount so that the per-collection time window for locking and\npotential write-write conflicts can be reduced.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ttl", + "type" : "uint64" + }, + "ttl.max-total-removes" : { + "base" : 1, + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : 1000000, + "deprecatedIn" : null, + "description" : "The maximum number of documents to remove per invocation of the TTL thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "In order to avoid \"random\" load spikes by the\nbackground thread suddenly kicking in and removing a lot of documents at once,\nyou can cap the number of to-be-removed documents per thread invocation.\n\nThe TTL background thread goes back to sleep once it has removed the configured\nnumber of documents in one iteration. If more candidate documents are left for\nremoval, they are removed in subsequent runs of the background thread.", + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 1, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ttl", + "type" : "uint64" + }, + "uid" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "", + "deprecatedIn" : null, + "description" : "Switch to this user ID after reading the configuration files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The name (identity) of the user to run the\nserver as.\n\nIf you don't specify this option, the server does not attempt to change its UID,\nso that the UID used by the server is the same as the UID of the user who\nstarted the server.\n\nIf you specify this option, the server changes its UID after opening ports and\nreading configuration files, but before accepting connections or opening other\nfiles (such as recovery files). This is useful if the server must be started\nwith raised privileges (in certain environments) but security considerations\nrequire that these privileges are dropped once the server has started work.\n\n**Note**: You cannot use this option to bypass operating system security.\nIn general, this option (and the related `--gid`) can lower privileges but not\nraise them.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "use-splice-syscall" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "web-interface.proxy-request-check" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Enable proxy request checking.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "web-interface", + "type" : "boolean" + }, + "web-interface.trusted-proxy" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : [ + ], + "deprecatedIn" : null, + "description" : "The list of proxies to trust (can be IP or network). Make sure `--web-interface.proxy-request-check` is enabled.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "web-interface", + "type" : "string..." + }, + "web-interface.version-check" : { + "category" : "option", + "component" : [ + "coordinator", + "single" + ], + "default" : true, + "deprecatedIn" : null, + "description" : "Alert the user if new versions are available.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "web-interface", + "type" : "boolean" + }, + "working-directory" : { + "category" : "option", + "component" : [ + "coordinator", + "dbserver", + "agent", + "single" + ], + "default" : "/var/tmp", + "deprecatedIn" : null, + "description" : "The working directory in daemon mode.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + } +} diff --git a/site/data/oem/arangodump.json b/site/data/oem/arangodump.json new file mode 100644 index 0000000000..cb3b2b60fe --- /dev/null +++ b/site/data/oem/arangodump.json @@ -0,0 +1,1779 @@ +{ + "all-databases" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Whether to dump all databases.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "batch-size" : { + "base" : 1, + "category" : "option", + "default" : 67108864, + "deprecatedIn" : null, + "description" : "The maximum size for individual data batches (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "collection" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Restrict the dump to this collection name (can be specified multiple times).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "compress-output" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Compress files containing collection contents using the gzip format (not compatible with encryption).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.6" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "dbserver-prefetch-batches" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "Number of batches to prefetch on each DB-Server.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.10.8", + "v3.11.2" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "dbserver-worker-threads" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "Number of worker threads on each DB-Server.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.10.8", + "v3.11.2" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-data" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to dump collection data.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-views" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to dump view definitions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.11.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "envelope" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.11.4" + ], + "description" : "Wrap each document into a {type, data} envelope (this is required for compatibility with v3.7 and before).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "force" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Continue dumping even in the face of some server-side errors.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "ignore-distribute-shards-like-errors" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Continue dumping even if a sharding prototype collection is not backed up, too.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "include-system-collections" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include system collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "initial-batch-size" : { + "base" : 1, + "category" : "option", + "default" : 8388608, + "deprecatedIn" : null, + "description" : "The initial size for individual data batches (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "local-network-threads" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "Number of local network threads, i.e. how many requests are sent in parallel.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.10.8", + "v3.11.2" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "local-writer-threads" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "Number of local writer threads.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.10.8", + "v3.11.2" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "maskings" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A path to a file with masking definitions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "output-directory" : { + "category" : "option", + "default" : "/dump", + "deprecatedIn" : null, + "description" : "The folder path to write the dump to.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "overwrite" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Overwrite data in the output directory.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "progress" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the dump progress.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "server.ask-jwt-secret" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, you are prompted for a JWT secret. This option is not compatible with --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.jwt-secret-keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "If enabled, the JWT secret is loaded from the given file. This option is not compatible with --server.ask-jwt-secret, --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "shard" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Restrict the dump to this shard (can be specified multiple times).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "split-files" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Split a collection in multiple files to increase throughput.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.10.10", + "v3.11.2" + ], + "longDescription" : "This option only has effect when the option\n`--use-experimental-dump` is set to `true`. Restoring split files also\nrequires an arangorestore version that is capable of restoring data of a\nsingle collection/shard from multiple files.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "threads" : { + "base" : 1, + "category" : "option", + "default" : 8, + "deprecatedIn" : null, + "description" : "The maximum number of collections/shards to process in parallel.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.0" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint32" + }, + "tick-end" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : [ + "v3.11.4" + ], + "description" : "Last tick to be included in data dump.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "tick-start" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : [ + "v3.11.4" + ], + "description" : "Only include data after this tick.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "use-experimental-dump" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Enable experimental dump behavior.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : true, + "hidden" : true, + "introducedIn" : [ + "v3.10.8", + "v3.11.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangoexport.json b/site/data/oem/arangoexport.json new file mode 100644 index 0000000000..7b14668da6 --- /dev/null +++ b/site/data/oem/arangoexport.json @@ -0,0 +1,1510 @@ +{ + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "collection" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Restrict the export to this collection name (can be specified multiple times).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "compress-output" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Compress files containing collection contents using the gzip format.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.8", + "v3.5.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "custom-query" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "An AQL query to run for computing the data you want to export.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "custom-query-bindvars" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The bind parameters to be used with the `--custom-query` or `--custom-query-file` option.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "custom-query-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A path to a file with the custom query to be used.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "custom-query-max-runtime" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "The runtime threshold for AQL queries (in seconds, 0 = no limit).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "double" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "documents-per-batch" : { + "base" : 1, + "category" : "option", + "default" : 1000, + "deprecatedIn" : null, + "description" : "The number of documents to return in each batch.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "escape-csv-formulae" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Prefix string cells in CSV output with extra single quote to prevent formula injection.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "fields" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A comma-separated list of fields to export to a CSV file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "graph-name" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The name of a graph to export.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "output-directory" : { + "category" : "option", + "default" : "/export", + "deprecatedIn" : null, + "description" : "The output directory.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "overwrite" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Overwrite the data in the output directory.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "progress" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the progress.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "temp.path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "type" : { + "category" : "option", + "default" : "jsonl", + "deprecatedIn" : null, + "description" : "type of export", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"csv\", \"json\", \"jsonl\", \"xgmml\", \"xml\"" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "xgmml-label-attribute" : { + "category" : "option", + "default" : "label", + "deprecatedIn" : null, + "description" : "Specify the document attribute to use as the XGMML label.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "xgmml-label-only" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Export XGMML label only.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangoimport.json b/site/data/oem/arangoimport.json new file mode 100644 index 0000000000..0bda4cfa80 --- /dev/null +++ b/site/data/oem/arangoimport.json @@ -0,0 +1,1763 @@ +{ + "auto-rate-limit" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Adjust the data loading rate automatically, starting at `--batch-size` bytes per thread per second.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.11" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "backslash-escape" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use backslash as the escape character for quotes. Used for CSV and TSV imports.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "batch-size" : { + "base" : 1, + "category" : "option", + "default" : 8388608, + "deprecatedIn" : null, + "description" : "The size for individual data batches (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "collection" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The name of the collection to import into.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "convert" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Convert the strings `null`, `false`, `true` and strings containing numbers into non-string types. For CSV and TSV only.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "create-collection" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Create the target collection if it does not already exist.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "create-collection-type" : { + "category" : "option", + "default" : "document", + "deprecatedIn" : null, + "description" : "The type of the collection if it needs to be created (edge or document).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"document\", \"edge\"" + }, + "create-database" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Create the target database if it does not exist.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "datatype" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Force a specific datatype for an attribute (null/boolean/number/string) using the syntax \"attribute=type\". For CSV and TSV only. Takes precedence over `--convert`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The file to import (\"-\" for stdin).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "from-collection-prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The collection name prefix to prepend to all values in the `_from` attribute.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "headers-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The file to read the CSV or TSV column headers from. If specified, no header is expected in the regular input file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "ignore-missing" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Ignore missing columns in CSV and TSV input.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "latency" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show 10 second latency statistics (values in microseconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "merge-attributes" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Concatenate attributes into a new document attribute, like \"mergedAttribute=[someAttribute]-[otherAttribute]\" (CSV and TSV only).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.1" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "on-duplicate" : { + "category" : "option", + "default" : "error", + "deprecatedIn" : null, + "description" : "The action to perform when a unique key constraint violation occurs. Possible values: ignore, replace, update, error", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"error\", \"ignore\", \"replace\", \"update\"" + }, + "overwrite" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Overwrite the collection if it exists. WARNING: This removes any data from the collection!", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "overwrite-collection-prefix" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "If the collection name is already prefixed, overwrite the prefix. Only useful in combination with `--from-collection-prefix` / `--to-collection-prefix`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "progress" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the progress.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "quote" : { + "category" : "option", + "default" : "\"", + "deprecatedIn" : null, + "description" : "Quote character(s). Used for CSV and TSV.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "remove-attribute" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "remove an attribute before inserting documents into collection (for CSV, TSV and JSON only)", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "separator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The field separator. Used for CSV and TSV imports. Defaults to a comma (CSV) or a tabulation character (TSV).", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "skip-lines" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "The number of lines to skip of the input file (CSV and TSV only).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "skip-validation" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Skip document schema validation during import.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "temp.path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "threads" : { + "base" : 1, + "category" : "option", + "default" : 8, + "deprecatedIn" : null, + "description" : "Number of parallel import threads.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint32" + }, + "to-collection-prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The collection name prefix to prepend to all values in the `_to` attribute.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "translate" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a mapping for a column header to an attribute name using the syntax \"from=to\". You can specify this startup option multiple times. For CSV and TSV only.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "type" : { + "category" : "option", + "default" : "json", + "deprecatedIn" : null, + "description" : "The format of import file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"auto\", \"csv\", \"json\", \"jsonl\", \"tsv\"" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangoinspect.json b/site/data/oem/arangoinspect.json new file mode 100644 index 0000000000..f3f6de7d42 --- /dev/null +++ b/site/data/oem/arangoinspect.json @@ -0,0 +1,2033 @@ +{ + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "console.audit-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The audit log file to save commands and results to.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "console", + "type" : "string" + }, + "console.auto-complete" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Enable auto-completion.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.colors" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Enable color support.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.history" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to load and persist command-line history.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.pager" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Enable paging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.pager-command" : { + "category" : "option", + "default" : "less -X -R -F -L", + "deprecatedIn" : null, + "description" : "The pager command.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "console", + "type" : "string" + }, + "console.pretty-print" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Enable pretty-printing.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.prompt" : { + "category" : "option", + "default" : "%E@%d> ", + "deprecatedIn" : null, + "description" : "The prompt used in REPL (placeholders: %t = the current time as timestamp, %p = the duration of last command in seconds, %d = the name of the current database, %e = the current endpoint, %E = the current endpoint without the protocol, %u = the current user", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "console", + "type" : "string" + }, + "default-language" : { + "category" : "option", + "default" : "", + "deprecatedIn" : [ + "v3.10.0" + ], + "description" : "An ISO-639 language code. You can only set this option once, when initializing the database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The default language is used for sorting and\ncomparing strings. The language value is a two-letter language code (ISO-639) or\nit is composed by a two-letter language code followed by a two letter country\ncode (ISO-3166). For example: `de`, `en`, `en_US`, `en_UK`.\n\nThe default is the system locale of the platform.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "default-language-check" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Check if `--icu-language` / `--default-language` matches the stored language.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "icu-language" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "An ICU locale ID to set a language and optionally additional properties that affect string comparisons and sorting. You can only set this option once, when initializing the database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.9.1" + ], + "longDescription" : "With this option, you can get the sorting and\ncomparing order exactly as it is defined in the ICU standard. The language value\ncan be a two-letter language code (ISO-639), a two-letter language code followed\nby a two letter country code (ISO-3166), or any other valid ICU locale\ndefinition. For example: `de`, `en`, `en_US`, `en_UK`,\n`de_AT@collation=phonebook`.\n\nFor the Swedish language (`sv`), for instance, the correct ICU-based sorting\norder for letters is `'a','A','b','B','z','Z','å','Ä','ö','Ö'`. To get this\norder, use `--icu-language sv`. If you use `--default-language sv` instead, the\nsorting order will be `\"A\", \"a\", \"B\", \"b\", \"Z\", \"z\", \"å\", \"Ä\", \"Ö\", \"ö\"`.\n\n**Note**: You can use only one of the language options, either `--icu-language`\nor `--default-language`. Setting both of them results in an error.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "javascript.allow-external-process-control" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow the execution and control of external processes from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.allow-port-testing" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow the testing of ports from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.check-syntax" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Check the syntax of the JavaScript code from the specified file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.client-module" : { + "category" : "option", + "default" : "inspector.js", + "deprecatedIn" : null, + "description" : "The client module to use at startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.copy-directory" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The target directory to copy files from `--javascript.startup-directory` to (only used if `--javascript.copy-installation` is enabled).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.copy-installation" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Copy the contents of `--javascript.startup-directory`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.current-module-directory" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Add the current directory to the module path.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.endpoints-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Endpoints that can be connected to via the `@arangodb/request` module in JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.endpoints-denylist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Endpoints that cannot be connected to via the `@arangodb/request` module in JavaScript actions (if not in the allowlist).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.environment-variables-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Environment variables that are accessible in JavaScript.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.environment-variables-denylist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Environment variables that are inaccessible in JavaScript (if not in the allowlist).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.execute" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Execute the JavaScript code from the specified file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.execute-string" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Execute the JavaScript code from the specified string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.execution-deadline" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "deadline in seconds. Once reached, calls will throw. HTTP timeouts will be adjusted.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint32" + }, + "javascript.files-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Filesystem paths that are accessible from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.gc-interval" : { + "base" : 1, + "category" : "option", + "default" : 50, + "deprecatedIn" : null, + "description" : "Request-based garbage collection interval (each n-th command).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.harden" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Disable access to JavaScript functions in the internal module: getPid() and logLevel().", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.module-directory" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Additional paths containing JavaScript modules.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.startup-directory" : { + "category" : "option", + "default" : "/usr/share/arangodb3/js", + "deprecatedIn" : null, + "description" : "The startup paths containing the JavaScript files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.startup-options-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Startup options whose names match this regular expression are allowed and exposed to JavaScript.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.startup-options-denylist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Startup options whose names match this regular expression are not exposed (if not in the allowlist) to JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.unit-test-filter" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Filter the test cases in the test suite.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.unit-tests" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Do not start as a shell, run unit tests instead.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.v8-max-heap" : { + "base" : 1, + "category" : "option", + "default" : 3072, + "deprecatedIn" : null, + "description" : "The maximal heap size (in MiB).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.v8-options" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Options to pass to V8.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can optionally pass arguments to the V8\nJavaScript engine. The V8 engine runs with the default settings unless you\nexplicitly specify them. The options are forwarded to the V8 engine, which\nparses them on its own. Passing invalid options may result in an error being\nprinted on stderr and the option being ignored.\n\nYou need to pass the options as one string, with V8 option names being prefixed\nwith two hyphens. Multiple options need to be separated by whitespace. To get\na list of all available V8 options, you can use the value `\"--help\"` as follows:\n\n```\n--javascript.v8-options=\"--help\"\n```\n\nAnother example of specific V8 options being set at startup:\n\n```\n--javascript.v8-options=\"--log --no-logfile-per-isolate --logfile=v8.log\"\n```\n\nNames and features or usable options depend on the version of V8 being used, and\nmight change in the future if a different version of V8 is being used in\nArangoDB. Not all options offered by V8 might be sensible to use in the context\nof ArangoDB. Use the specific options only if you are sure that they are not\nharmful for the regular database operation.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "jslint" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Do not start as a shell, run jslint instead.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "quiet" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Silent startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "server.ask-jwt-secret" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "If enabled, you are prompted for a JWT secret. This option is not compatible with --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.jwt-secret-keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "If enabled, the JWT secret is loaded from the given file. This option is not compatible with --server.ask-jwt-secret, --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "temp.path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangorestore.json b/site/data/oem/arangorestore.json new file mode 100644 index 0000000000..c5b19c6384 --- /dev/null +++ b/site/data/oem/arangorestore.json @@ -0,0 +1,1750 @@ +{ + "all-databases" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Restore the data of all databases.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "batch-size" : { + "base" : 1, + "category" : "option", + "default" : 8388608, + "deprecatedIn" : null, + "description" : "The maximum size for individual data batches (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "cleanup-duplicate-attributes" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Clean up duplicate attributes (use first specified value) in input documents instead of making the restore operation fail.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "collection" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Restrict the restore to this collection name (can be specified multiple times).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "continue" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Continue the restore operation.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "create-collection" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Create collection structure.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "create-database" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Create the target database if it does not exist.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "default-number-of-shards" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "description" : "The default `numberOfShards` value if not specified in the dump.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "default-replication-factor" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "description" : "The default `replicationFactor` value if not specified in the dump.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint64" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "enable-revision-trees" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Enable revision trees for new collections if the collection attributes `syncByRevision` and `usesRevisionsAsDocumentIds` are missing.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.7" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "envelope" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "wrap each document into a {type, data} envelope (this is required for compatibility with v3.7 and before).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "force" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Continue the restore even in the face of some server-side errors.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "force-same-database" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Force the same database name as in the source `dump.json` file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "ignore-distribute-shards-like-errors" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Continue the restore even if the sharding prototype collection is missing.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "import-data" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Import data into collection.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "include-system-collections" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include system collections.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "initial-connect-retries" : { + "base" : 1, + "category" : "option", + "default" : 3, + "deprecatedIn" : null, + "description" : "The number of connect retries for the initial connection.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.13", + "v3.8.1" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint32" + }, + "input-directory" : { + "category" : "option", + "default" : "/dump", + "deprecatedIn" : null, + "description" : "The input directory.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "number-of-shards" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Override the `numberOfShards` value (can be specified multiple times, e.g. --number-of-shards 2 --number-of-shards myCollection=3).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "overwrite" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Overwrite collections if they exist.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "progress" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the progress.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "replication-factor" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Override the `replicationFactor` value (can be specified multiple times, e.g. --replication-factor 2 --replication-factor myCollection=3).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.3.22", + "v3.4.2" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "server.ask-jwt-secret" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, you are prompted for a JWT secret. This option is not compatible with --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp:// or unix://", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.jwt-secret-keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "If enabled, the JWT secret is loaded from the given file. This option is not compatible with --server.ask-jwt-secret, --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "temp.path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "threads" : { + "base" : 1, + "category" : "option", + "default" : 8, + "deprecatedIn" : null, + "description" : "The maximum number of collections to process in parallel.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.0" + ], + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "uint32" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "view" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Restrict the restore to this view name (can be specified multiple times).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + } +} diff --git a/site/data/oem/arangosh.json b/site/data/oem/arangosh.json new file mode 100644 index 0000000000..0c85c326f0 --- /dev/null +++ b/site/data/oem/arangosh.json @@ -0,0 +1,2057 @@ +{ + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "config" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "console.audit-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The audit log file to save commands and results to.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "console", + "type" : "string" + }, + "console.auto-complete" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Enable auto-completion.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.colors" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Enable color support.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.history" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Whether to load and persist command-line history.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.pager" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Enable paging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.pager-command" : { + "category" : "option", + "default" : "less -X -R -F -L", + "deprecatedIn" : null, + "description" : "The pager command.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "console", + "type" : "string" + }, + "console.pretty-print" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Enable pretty-printing.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "console", + "type" : "boolean" + }, + "console.prompt" : { + "category" : "option", + "default" : "%E@%d> ", + "deprecatedIn" : null, + "description" : "The prompt used in REPL (placeholders: %t = the current time as timestamp, %p = the duration of last command in seconds, %d = the name of the current database, %e = the current endpoint, %E = the current endpoint without the protocol, %u = the current user", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "console", + "type" : "string" + }, + "default-language" : { + "category" : "option", + "default" : "", + "deprecatedIn" : [ + "v3.10.0" + ], + "description" : "An ISO-639 language code. You can only set this option once, when initializing the database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "The default language is used for sorting and\ncomparing strings. The language value is a two-letter language code (ISO-639) or\nit is composed by a two-letter language code followed by a two letter country\ncode (ISO-3166). For example: `de`, `en`, `en_US`, `en_UK`.\n\nThe default is the system locale of the platform.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "default-language-check" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Check if `--icu-language` / `--default-language` matches the stored language.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "encryption.key-generator" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "A program providing the encryption key on stdout. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "The program must output 32 bytes of data on the\nstandard output and exit.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "encryption.keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path to the file that contains the encryption key. Must contain 32 bytes of data. If set, encryption at rest is enabled.", + "dynamic" : false, + "enterpriseOnly" : true, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You must secure the encryption key file so that\nonly `arangodump`, `arangorestore`, and `arangod` can access it. You should also\nensure that the file is not readable if someone steals your hardware, for\nexample, by encrypting `/mytmpfs` or creating an in-memory file-system under\n`/mytmpfs`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "encryption", + "type" : "string" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "icu-language" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "An ICU locale ID to set a language and optionally additional properties that affect string comparisons and sorting. You can only set this option once, when initializing the database.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.9.1" + ], + "longDescription" : "With this option, you can get the sorting and\ncomparing order exactly as it is defined in the ICU standard. The language value\ncan be a two-letter language code (ISO-639), a two-letter language code followed\nby a two letter country code (ISO-3166), or any other valid ICU locale\ndefinition. For example: `de`, `en`, `en_US`, `en_UK`,\n`de_AT@collation=phonebook`.\n\nFor the Swedish language (`sv`), for instance, the correct ICU-based sorting\norder for letters is `'a','A','b','B','z','Z','å','Ä','ö','Ö'`. To get this\norder, use `--icu-language sv`. If you use `--default-language sv` instead, the\nsorting order will be `\"A\", \"a\", \"B\", \"b\", \"Z\", \"z\", \"å\", \"Ä\", \"Ö\", \"ö\"`.\n\n**Note**: You can use only one of the language options, either `--icu-language`\nor `--default-language`. Setting both of them results in an error.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "javascript.allow-external-process-control" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow the execution and control of external processes from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.allow-port-testing" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow the testing of ports from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.check-syntax" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Check the syntax of the JavaScript code from the specified file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.client-module" : { + "category" : "option", + "default" : "client.js", + "deprecatedIn" : null, + "description" : "The client module to use at startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.copy-directory" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The target directory to copy files from `--javascript.startup-directory` to (only used if `--javascript.copy-installation` is enabled).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.copy-installation" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Copy the contents of `--javascript.startup-directory`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.current-module-directory" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Add the current directory to the module path.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.endpoints-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Endpoints that can be connected to via the `@arangodb/request` module in JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.endpoints-denylist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Endpoints that cannot be connected to via the `@arangodb/request` module in JavaScript actions (if not in the allowlist).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.environment-variables-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Environment variables that are accessible in JavaScript.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.environment-variables-denylist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Environment variables that are inaccessible in JavaScript (if not in the allowlist).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.execute" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Execute the JavaScript code from the specified file.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.execute-string" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Execute the JavaScript code from the specified string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.execution-deadline" : { + "base" : 1, + "category" : "option", + "default" : 0, + "deprecatedIn" : null, + "description" : "deadline in seconds. Once reached, calls will throw. HTTP timeouts will be adjusted.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint32" + }, + "javascript.files-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Filesystem paths that are accessible from within JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.gc-interval" : { + "base" : 1, + "category" : "option", + "default" : 50, + "deprecatedIn" : null, + "description" : "Request-based garbage collection interval (each n-th command).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.harden" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Disable access to JavaScript functions in the internal module: getPid() and logLevel().", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "javascript", + "type" : "boolean" + }, + "javascript.module-directory" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Additional paths containing JavaScript modules.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.startup-directory" : { + "category" : "option", + "default" : "/usr/share/arangodb3/js", + "deprecatedIn" : null, + "description" : "The startup paths containing the JavaScript files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.startup-options-allowlist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Startup options whose names match this regular expression are allowed and exposed to JavaScript.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.startup-options-denylist" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Startup options whose names match this regular expression are not exposed (if not in the allowlist) to JavaScript actions.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.unit-test-filter" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Filter the test cases in the test suite.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string" + }, + "javascript.unit-tests" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Do not start as a shell, run unit tests instead.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "javascript.v8-max-heap" : { + "base" : 1, + "category" : "option", + "default" : 3072, + "deprecatedIn" : null, + "description" : "The maximal heap size (in MiB).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "uint64" + }, + "javascript.v8-options" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Options to pass to V8.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can optionally pass arguments to the V8\nJavaScript engine. The V8 engine runs with the default settings unless you\nexplicitly specify them. The options are forwarded to the V8 engine, which\nparses them on its own. Passing invalid options may result in an error being\nprinted on stderr and the option being ignored.\n\nYou need to pass the options as one string, with V8 option names being prefixed\nwith two hyphens. Multiple options need to be separated by whitespace. To get\na list of all available V8 options, you can use the value `\"--help\"` as follows:\n\n```\n--javascript.v8-options=\"--help\"\n```\n\nAnother example of specific V8 options being set at startup:\n\n```\n--javascript.v8-options=\"--log --no-logfile-per-isolate --logfile=v8.log\"\n```\n\nNames and features or usable options depend on the version of V8 being used, and\nmight change in the future if a different version of V8 is being used in\nArangoDB. Not all options offered by V8 might be sensible to use in the context\nof ArangoDB. Use the specific options only if you are sure that they are not\nharmful for the regular database operation.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "javascript", + "type" : "string..." + }, + "jslint" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Do not start as a shell, run jslint instead.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "-", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "quiet" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Silent startup.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "server.ask-jwt-secret" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "If enabled, you are prompted for a JWT secret. This option is not compatible with --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.authentication" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Require authentication credentials when connecting (does not affect the server-side authentication settings).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.connection-timeout" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The connection timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.database" : { + "category" : "option", + "default" : "_system", + "deprecatedIn" : null, + "description" : "The database name to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.endpoint" : { + "category" : "option", + "default" : [ + "tcp://127.0.0.1:8529" + ], + "deprecatedIn" : null, + "description" : "The endpoint to connect to. Use 'none' to start without a server. Use http+ssl:// or vst+ssl:// as schema to connect to an SSL-secured server endpoint, otherwise http+tcp://, vst+tcp:// or unix://.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "You can use `--server.endpoint none` to start\narangosh without connecting to a server.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string..." + }, + "server.force-json" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Force to not use VelocyPack for easier debugging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.6.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "server", + "type" : "boolean" + }, + "server.jwt-secret-keyfile" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "If enabled, the JWT secret is loaded from the given file. This option is not compatible with --server.ask-jwt-secret, --server.username and --server.password. If specified, it is used for all connections - even if a new connection to another server is created.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.max-packet-size" : { + "base" : 1, + "category" : "option", + "default" : 1073741824, + "deprecatedIn" : null, + "description" : "The maximum packet size (in bytes) for client/server communication.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "uint64" + }, + "server.password" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The password to use when connecting. If not specified and authentication is required, the user is prompted for a password", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "server.request-timeout" : { + "base" : 1, + "category" : "option", + "default" : 1200, + "deprecatedIn" : null, + "description" : "The request timeout (in seconds).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 1.7976931348623157e+308, + "minInclusive" : true, + "minValue" : 2.2250738585072014e-308, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "double" + }, + "server.username" : { + "category" : "option", + "default" : "root", + "deprecatedIn" : null, + "description" : "The username to use when connecting.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "server", + "type" : "string" + }, + "ssl.protocol" : { + "base" : 1, + "category" : "option", + "default" : 5, + "deprecatedIn" : null, + "description" : "The SSL protocol (1 = SSLv2 (unsupported), 2 = SSLv2 or SSLv3 (negotiated), 3 = SSLv3, 4 = TLSv1, 5 = TLSv1.2, 6 = TLSv1.3, 9 = generic TLS (negotiated))", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "maxInclusive" : true, + "maxValue" : 18446744073709551615, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "ssl", + "type" : "uint64", + "values" : "Possible values: 1, 2, 3, 4, 5, 6, 9" + }, + "temp.path" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The path for temporary files.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB uses the path for storing temporary\nfiles, for extracting data from uploaded zip files (e.g. for Foxx services),\nand other things.\n\nIdeally, the temporary path is set to an instance-specific subdirectory of the\noperating system's temporary directory. To avoid data loss, the temporary path\nshould not overlap with any directories that contain important data, for\nexample, the instance's database directory.\n\nIf you set the temporary path to the same directory as the instance's database\ndirectory, a startup error is logged and the startup is aborted.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "temp", + "type" : "string" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/arangovpack.json b/site/data/oem/arangovpack.json new file mode 100644 index 0000000000..5d16f00258 --- /dev/null +++ b/site/data/oem/arangovpack.json @@ -0,0 +1,1002 @@ +{ + "check-configuration" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Check the configuration and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "config" : { + "category" : "option", + "default" : "none", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "configuration" : { + "category" : "option", + "default" : "none", + "deprecatedIn" : null, + "description" : "The configuration file or \"none\".", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "define" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Define a value for a `@key@` entry in the configuration file using the syntax `\"key=value\"`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "dump-dependencies" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump the dependency graph of the feature phases (internal) and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "dump-options" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Dump all available startup options in JSON format and exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "fail-on-non-json" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Raise an error when trying to emit non-JSON types to JSON output.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "honor-nsswitch" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Allow hostname lookup configuration via /etc/nsswitch.conf if on Linux/glibc.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "input-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The input file (leave empty or use \"-\" for stdin).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "input-type" : { + "category" : "option", + "default" : "vpack", + "deprecatedIn" : null, + "description" : "The input format.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"json\", \"json-hex\", \"vpack\", \"vpack-hex\"" + }, + "log" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Set the topic-specific log level, using `--log level` for the general topic or `--log topic=level` for the specified topic (can be specified multiple times). Available log levels: fatal, error, warning, info, debug, trace.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string..." + }, + "log.color" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use colors for TTY logging.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-control-chars" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Escape control characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "This option applies to the control characters,\nthat have hex codes below `\\x20`, and also the character `DEL` with hex code\n`\\x7f`.\n\nIf you set this option to `false`, control characters are retained when they\nhave a visible representation, and replaced with a space character in case they\ndo not have a visible representation. For example, the control character `\\n`\nis visible, so a `\\n` is displayed in the log. Contrary, the control character\n`BEL` is not visible, so a space is displayed instead.\n\nIf you set this option to `true`, the hex code for the character is displayed,\nfor example, the `BEL` character is displayed as `\\x07`.\n\nThe default value for this option is `true` to ensure compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.escape-unicode-chars" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Escape Unicode characters in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "longDescription" : "If you set this option to `false`, Unicode\ncharacters are retained and written to the log as-is. For example, `犬` is\nlogged as `犬`.\n\nIf you set this options to `true`, any Unicode characters are escaped, and the\nhex codes for all Unicode characters are logged instead. For example, `犬` is\nlogged as `\\u72AC`.\n\nThe default value for this option is set to `false` for compatibility with\nprevious versions.\n\nA side effect of turning off the escaping is that it reduces the CPU overhead\nfor the logging. However, this is only noticeable if logging is set to a very\nverbose level (e.g. `debug` or `trace`).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Shortcut for `--log.output file://<filename>`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-group" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The group to use for a new log file. The user must be a member of this group.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.file-mode" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The mode to use for a new log file. The umask is applied as well.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.4.5" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.force-direct" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Do not start a separate thread for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "You can use this option to disable logging in an\nextra logging thread. If set to `true`, any log messages are immediately\nprinted in the thread that triggered the log message. This is non-optimal for\nperformance but can aid debugging. If set to `false`, log messages are handed\noff to an extra logging thread, which asynchronously writes the log messages.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.foreground-tty" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Also log to TTY if backgrounded.", + "dynamic" : true, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.hostname" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The hostname to use in log message. Leave empty for none, use \"auto\" to automatically determine a hostname.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can specify a hostname to be logged at the\nbeginning of each log message (for regular logging) or inside the `hostname`\nattribute (for JSON-based logging).\n\nThe default value is an empty string, meaning no hostnames is logged.\nIf you set this option to `auto`, the hostname is automatically determined.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.ids" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Log unique message IDs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Each log invocation in the ArangoDB source code\ncontains a unique log ID, which can be used to quickly find the location in the\nsource code that produced a specific log message.\n\nLog IDs are printed as 5-digit hexadecimal identifiers in square brackets\nbetween the log level and the log topic:\n\n`2020-06-22T21:16:48Z [39028] INFO [144fe] {general} using storage engine\n'rocksdb'` (where `144fe` is the log ID).", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.level" : { + "category" : "option", + "default" : [ + "info" + ], + "deprecatedIn" : null, + "description" : "Set the topic-specific log level, using `--log.level level` for the general topic or `--log.level topic=level` for the specified topic (can be specified multiple times).\n\nAvailable log levels: fatal, error, warning, info, debug, trace.\n\nAvailable log topics: all, agency, agencycomm, agencystore, aql, audit-authentication, audit-authorization, audit-collection, audit-database, audit-document, audit-hotbackup, audit-service, audit-view, authentication, authorization, backup, bench, cache, cluster, communication, config, crash, development, dump, engines, flush, general, graphs, heartbeat, httpclient, ldap, license, maintenance, memory, mmap, pregel, queries, rep-state, replication, replication2, requests, restore, rocksdb, security, ssl, startup, statistics, supervision, syscall, threads, trx, ttl, v8, validation, views.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "ArangoDB's log output is grouped by topics.\n`--log.level` can be specified multiple times at startup, for as many topics as\nneeded. The log verbosity and output files can be adjusted per log topic.\n\n```\narangod --log.level all=warning --log.level queries=trace --log.level startup=trace\n```\n\nThis sets a global log level of `warning` and two topic-specific levels\n(`trace` for queries and `info` for startup). Note that `--log.level warning`\ndoes not set a log level globally for all existing topics, but only the\n`general` topic. Use the pseudo-topic `all` to set a global log level.\n\nThe same in a configuration file:\n\n```\n[log]\nlevel = all=warning\nlevel = queries=trace\nlevel = startup=trace\n```\n\nThe available log levels are:\n\n- `fatal`: Only log fatal errors.\n- `error`: Only log errors.\n- `warning`: Only log warnings and errors.\n- `info`: Log information messages, warnings, and errors.\n- `debug`: Log debug and information messages, warnings, and errors.\n- `trace`: Logs trace, debug, and information messages, warnings, and errors.\n\nNote that the `debug` and `trace` levels are very verbose.\n\nSome relevant log topics available in ArangoDB 3 are:\n\n- `agency`: Information about the cluster Agency.\n- `performance`: Performance-related messages.\n- `queries`: Executed AQL queries, slow queries.\n- `replication`: Replication-related information.\n- `requests`: HTTP requests.\n- `startup`: Information about server startup and shutdown.\n- `threads`: Information about threads.\n\nYou can adjust the log levels at runtime via the `PUT /_admin/log/level`\nHTTP API endpoint.\n\n**Audit logging** (Enterprise Edition): The server logs all audit events by\ndefault. Low priority events, such as statistics operations, are logged with the\n`debug` log level. To keep such events from cluttering the log, set the\nappropriate log topics to the `info` log level.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.line-number" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Include the function name, file name, and line number of the source code that issues the log message. Format: `[func@FileName.cpp:123]`", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.max-entry-length" : { + "base" : 1, + "category" : "option", + "default" : 134217728, + "deprecatedIn" : null, + "description" : "The maximum length of a log entry (in bytes).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.7.9" + ], + "longDescription" : "**Note**: This option does not include audit log\nmessages. See `--audit.max-entry-length` instead.\n\nAny log messages longer than the specified value are truncated and the suffix\n`...` is added to them.\n\nThe purpose of this option is to shorten long log messages in case there is not\na lot of space for log files, and to keep rogue log messages from overusing\nresources.\n\nThe default value is 128 MB, which is very high and should effectively mean\ndownwards-compatibility with previous arangod versions, which did not restrict\nthe maximum size of log messages.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.max-queued-entries" : { + "base" : 1, + "category" : "option", + "default" : 10000, + "deprecatedIn" : null, + "description" : "Upper limit of log entries that are queued in a background thread.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.10.12", + "v3.11.5" + ], + "longDescription" : "Log entries are pushed on a queue for asynchronous\nwriting unless you enable the `--log.force-direct` startup option. If you use a\nslow log output (e.g. syslog), the queue might grow and eventually overflow.\n\nYou can configure the upper bound of the queue with this option. If the queue is\nfull, log entries are written synchronously until the queue has space again.", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "uint32" + }, + "log.output" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Log destination(s), e.g. file:///path/to/file (any occurrence of $PID is replaced with the process ID).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "This option allows you to direct the global or\nper-topic log messages to different outputs. The output definition can be one\nof the following:\n\n- `-` for stdin\n- `+` for stderr\n- `syslog://<syslog-facility>`\n- `syslog://<syslog-facility>/<application-name>`\n- `file://<relative-or-absolute-path>`\n\nTo set up a per-topic output configuration, use\n`--log.output <topic>=<definition>`:\n\n`--log.output queries=file://queries.log`\n\nThe above example logs query-related messages to the file `queries.log`.\n\nYou can specify the option multiple times in order to configure the output\nfor different log topics:\n\n`--log.level queries=trace --log.output queries=file:///queries.log\n--log.level requests=info --log.output requests=file:///requests.log`\n\nThe above example logs all query-related messages to the file `queries.log`\nand HTTP requests with a level of `info` or higher to the file `requests.log`.\n\nAny occurrence of `$PID` in the log output value is replaced at runtime with\nthe actual process ID. This enables logging to process-specific files:\n\n`--log.output 'file://arangod.log.$PID'`\n\nNote that dollar sign may need extra escaping when specified on a\ncommand-line such as Bash.\n\nIf you specify `--log.file-mode <octalvalue>`, then any newly created log\nfile uses `octalvalue` as file mode. Please note that the `umask` value is\napplied as well.\n\nIf you specify `--log.file-group <name>`, then any newly created log file tries\nto use `<name>` as the group name. Note that you have to be a member of that\ngroup. Otherwise, the group ownership is not changed. This option is only\navailable under Linux and macOS. It is not available under Windows.\n\nThe old `--log.file` option is still available for convenience. It is a\nshortcut for the more general option `--log.output file://filename`.\n\nThe old `--log.requests-file` option is still available. It is a shortcut for\nthe more general option `--log.output requests=file://...`.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.performance" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Shortcut for `--log.level performance=trace`.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.prefix" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "Prefix log message with this string.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "Example: `arangod ... --log.prefix \"-->\"`\n\n`2020-07-23T09:46:03Z --> [17493] INFO ...`", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string" + }, + "log.process" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Show the process identifier (PID) in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.request-parameters" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "include full URLs and HTTP request parameters in trace logs", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.role" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Log the server role.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "longDescription" : "If you set this option to `true`, log messages\ncontains a single character with the server's role. The roles are:\n\n- `U`: Undefined / unclear (used at startup)\n- `S`: Single server\n- `C`: Coordinator\n- `P`: Primary / DB-Server\n- `A`: Agent", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.shorten-filenames" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Shorten filenames in log output (use with `--log.line-number`).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.structured-param" : { + "category" : "option", + "default" : [ + ], + "deprecatedIn" : null, + "description" : "Toggle the usage of the log category parameter in structured log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.10.0" + ], + "longDescription" : "Some log messages can be displayed together with\nadditional information in a structured form. The following parameters are\navailable:\n\n- `database`: The name of the database.\n- `username`: The name of the user.\n- `url`: The endpoint path.\n- `pregelID`: The ID of the Pregel job.\n\nThe format to enable or disable a parameter is `<parameter>=<bool>`, or\n`<parameter>` to enable it. You can specify the option multiple times to\nconfigure multiple parameters:\n\n`arangod --log.structured-param database=true --log.structured-param url\n--log.structured-param username=false`\n\nYou can adjust the parameter settings at runtime using the\n`/_admin/log/structured` HTTP API.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string..." + }, + "log.thread" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show the thread identifier in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.thread-name" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Show thread name in log messages.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.time-format" : { + "category" : "option", + "default" : "utc-datestring", + "deprecatedIn" : null, + "description" : "The time format to use in logs.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.5.0" + ], + "longDescription" : "Overview over the different options:\n\nFormat | Example | Description\n:-----------------------|:------------------------ |:-----------\n`timestamp` | 1553766923000 | Unix timestamps, in seconds\n`timestamp-millis` | 1553766923000.123 | Unix timestamps, in seconds, with millisecond precision\n`timestamp-micros` | 1553766923000.123456 | Unix timestamps, in seconds, with microsecond precision\n`uptime` | 987654 | seconds since server start\n`uptime-millis` | 987654.123 | seconds since server start, with millisecond precision\n`uptime-micros` | 987654.123456 | seconds since server start, with microsecond precision\n`utc-datestring` | 2019-03-28T09:55:23Z | UTC-based date and time in format YYYY-MM-DDTHH:MM:SSZ \n`utc-datestring-millis` | 2019-03-28T09:55:23.123Z | like `utc-datestring`, but with millisecond precision\n`local-datestring` | 2019-03-28T10:55:23 | local date and time in format YYYY-MM-DDTHH:MM:SS", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "log", + "type" : "string", + "values" : "Possible values: \"local-datestring\", \"timestamp\", \"timestamp-micros\", \"timestamp-millis\", \"uptime\", \"uptime-micros\", \"uptime-millis\", \"utc-datestring\", \"utc-datestring-micros\", \"utc-datestring-millis\"" + }, + "log.use-json-format" : { + "category" : "option", + "default" : false, + "deprecatedIn" : null, + "description" : "Use JSON as output format for logging.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "longDescription" : "You can use this option to switch the log output\nto the JSON format. Each log message then produces a separate line with\nJSON-encoded log data, which can be consumed by other applications.\n\nThe object attributes produced for each log message are:\n\n| Key | Value |\n|:-----------|:-----------|\n| `time` | date/time of log message, in format specified by `--log.time-format`\n| `prefix` | only emitted if `--log.prefix` is set\n| `pid` | process id, only emitted if `--log.process` is set\n| `tid` | thread id, only emitted if `--log.thread` is set\n| `thread` | thread name, only emitted if `--log.thread-name` is set\n| `role` | server role (1 character), only emitted if `--log.role` is set\n| `level` | log level (e.g. `\"WARN\"`, `\"INFO\"`)\n| `file` | source file name of log message, only emitted if `--log.line-number` is set\n| `line` | source file line of log message, only emitted if `--log.line-number` is set \n| `function` | source file function name, only emitted if `--log.line-number` is set\n| `topic` | log topic name\n| `id` | log id (5 digit hexadecimal string), only emitted if `--log.ids` is set\n| `hostname` | hostname if `--log.hostname` is set\n| `message` | the actual log message payload", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-local-time" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use the local timezone instead of UTC.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format local-datestring` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "log.use-microtime" : { + "category" : "option", + "default" : false, + "deprecatedIn" : [ + "v3.5.0" + ], + "description" : "Use Unix timestamps in seconds with microsecond precision.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "This option is deprecated.\nUse `--log.time-format timestamp-micros` instead.", + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "required" : false, + "requiresValue" : false, + "section" : "log", + "type" : "boolean" + }, + "output-file" : { + "category" : "option", + "default" : "", + "deprecatedIn" : null, + "description" : "The output file (leave empty or use \"+\" for stdout).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string" + }, + "output-type" : { + "category" : "option", + "default" : "json-pretty", + "deprecatedIn" : null, + "description" : "The output format.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.8.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "", + "type" : "string", + "values" : "Possible values: \"json\", \"json-pretty\", \"vpack\", \"vpack-hex\"" + }, + "random.generator" : { + "base" : 1, + "category" : "option", + "default" : 1, + "deprecatedIn" : null, + "description" : "The random number generator to use (1 = MERSENNE, 2 = RANDOM, 3 = URANDOM, 4 = COMBINED (not available on Windows), 5 = WinCrypt (Windows only). The options 2, 3, 4, and 5 are deprecated and will be removed in a future version.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : true, + "introducedIn" : null, + "longDescription" : "- `1`: a pseudo-random number generator using an\nimplication of the Mersenne Twister MT19937 algorithm\n- `2`: use a blocking random (or pseudo-random) number generator\n- `3`: use the non-blocking random (or pseudo-random) number generator supplied\n by the operating system\n- `4`: a combination of the blocking random number generator and the Mersenne\n Twister (not available on Windows)\n- `5`: use WinCrypt (Windows only)", + "maxInclusive" : true, + "maxValue" : 4294967295, + "minInclusive" : true, + "minValue" : 0, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : true, + "section" : "random", + "type" : "uint32", + "values" : "Possible values: 1, 2, 3, 4" + }, + "use-splice-syscall" : { + "category" : "option", + "default" : true, + "deprecatedIn" : null, + "description" : "Use the splice() syscall for file copying (may not be supported on all filesystems).", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.4" + ], + "longDescription" : "While the syscall is generally available since\nLinux 2.6.x, it is also required that the underlying filesystem supports the\nsplice operation. This is not true for some encrypted filesystems\n(e.g. ecryptfs), on which `splice()` calls can fail.\n\nYou can set the `--use-splice-syscall` startup option to `false` to use a less\nefficient, but more portable file copying method instead, which should work on\nall filesystems.", + "obsolete" : false, + "os" : [ + "linux" + ], + "required" : false, + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : null, + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + }, + "version-json" : { + "category" : "command", + "deprecatedIn" : null, + "description" : "Print the version and other related information in JSON format, then exit.", + "dynamic" : false, + "enterpriseOnly" : false, + "experimental" : false, + "hidden" : false, + "introducedIn" : [ + "v3.9.0" + ], + "obsolete" : false, + "os" : [ + "linux", + "macos", + "windows" + ], + "requiresValue" : false, + "section" : "", + "type" : "boolean" + } +} diff --git a/site/data/oem/cache.json b/site/data/oem/cache.json new file mode 100644 index 0000000000..1efb041356 --- /dev/null +++ b/site/data/oem/cache.json @@ -0,0 +1,4158 @@ +{ + "001_collectionAll_single": { + "request": "LS0tCm5hbWU6IDAwMV9jb2xsZWN0aW9uQWxsCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImZpdmUiKTsKdmFyIGRvY3MgPSBkYi5maXZlLmluc2VydChbCiAgeyBuYW1lIDogIm9uZSIgfSwKICB7IG5hbWUgOiAidHdvIiB9LAogIHsgbmFtZSA6ICJ0aHJlZSIgfSwKICB7IG5hbWUgOiAiZm91ciIgfSwKICB7IG5hbWUgOiAiZml2ZSIgfQpdKTsKZGIuZml2ZS5hbGwoKS50b0FycmF5KCk7Cn5kYi5fZHJvcCgiZml2ZSIpOw==", + "response": "eyJpbnB1dCI6InZhciBkb2NzID0gZGIuZml2ZS5pbnNlcnQoW1xuICB7IG5hbWUgOiBcIm9uZVwiIH0sXG4gIHsgbmFtZSA6IFwidHdvXCIgfSxcbiAgeyBuYW1lIDogXCJ0aHJlZVwiIH0sXG4gIHsgbmFtZSA6IFwiZm91clwiIH0sXG4gIHsgbmFtZSA6IFwiZml2ZVwiIH1cbl0pO1xuZGIuZml2ZS5hbGwoKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NDlcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS83Mjc0OVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSYi0tLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIm9uZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS83Mjc1MFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSYi0tLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcInR3b1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NTFcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS83Mjc1MVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSYi0tLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcInRocmVlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mjc1MlwiLCBcbiAgICBcIl9pZFwiIDogXCJmaXZlLzcyNzUyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVJiLS0tQlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiZm91clwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NTNcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS83Mjc1M1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSYi0tLUNcIiwgXG4gICAgXCJuYW1lXCIgOiBcImZpdmVcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDAxX2NvbGxlY3Rpb25BbGwiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "002_collectionAllNext_single": { + "request": "LS0tCm5hbWU6IDAwMl9jb2xsZWN0aW9uQWxsTmV4dApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJmaXZlIik7CnZhciBkb2NzID0gZGIuZml2ZS5pbnNlcnQoWwogIHsgbmFtZSA6ICJvbmUiIH0sCiAgeyBuYW1lIDogInR3byIgfSwKICB7IG5hbWUgOiAidGhyZWUiIH0sCiAgeyBuYW1lIDogImZvdXIiIH0sCiAgeyBuYW1lIDogImZpdmUiIH0KXSk7CmRiLmZpdmUuYWxsKCkubGltaXQoMikudG9BcnJheSgpOwp+ZGIuX2Ryb3AoImZpdmUiKTs=", + "response": "eyJpbnB1dCI6InZhciBkb2NzID0gZGIuZml2ZS5pbnNlcnQoW1xuICB7IG5hbWUgOiBcIm9uZVwiIH0sXG4gIHsgbmFtZSA6IFwidHdvXCIgfSxcbiAgeyBuYW1lIDogXCJ0aHJlZVwiIH0sXG4gIHsgbmFtZSA6IFwiZm91clwiIH0sXG4gIHsgbmFtZSA6IFwiZml2ZVwiIH1cbl0pO1xuZGIuZml2ZS5hbGwoKS5saW1pdCgyKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NjRcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS83Mjc2NFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSY20tLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIm9uZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NjVcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS83Mjc2NVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSY20tLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcInR3b1wiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMDJfY29sbGVjdGlvbkFsbE5leHQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "003_collectionByExample_single": { + "request": "LS0tCm5hbWU6IDAwM19jb2xsZWN0aW9uQnlFeGFtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoInVzZXJzIik7CmRiLnVzZXJzLmluc2VydChbCiAgeyBuYW1lOiAiR2VyaGFyZCIgfSwKICB7IG5hbWU6ICJIZWxtdXQiIH0sCiAgeyBuYW1lOiAiQW5nZWxhIiB9Cl0pOwpkYi51c2Vycy5hbGwoKS50b0FycmF5KCk7CmRiLnVzZXJzLmJ5RXhhbXBsZSh7ICJfaWQiIDogInVzZXJzLzIwIiB9KS50b0FycmF5KCk7CmRiLnVzZXJzLmJ5RXhhbXBsZSh7ICJuYW1lIiA6ICJHZXJoYXJkIiB9KS50b0FycmF5KCk7CmRiLnVzZXJzLmJ5RXhhbXBsZSh7ICJuYW1lIiA6ICJIZWxtdXQiLCAiX2lkIiA6ICJ1c2Vycy8xNSIgfSkudG9BcnJheSgpOwp+ZGIuX2Ryb3AoInVzZXJzIik7", + "response": "eyJpbnB1dCI6ImRiLnVzZXJzLmluc2VydChbXG4gIHsgbmFtZTogXCJHZXJoYXJkXCIgfSxcbiAgeyBuYW1lOiBcIkhlbG11dFwiIH0sXG4gIHsgbmFtZTogXCJBbmdlbGFcIiB9XG5dKTtcbmRiLnVzZXJzLmFsbCgpLnRvQXJyYXkoKTtcbmRiLnVzZXJzLmJ5RXhhbXBsZSh7IFwiX2lkXCIgOiBcInVzZXJzLzIwXCIgfSkudG9BcnJheSgpO1xuZGIudXNlcnMuYnlFeGFtcGxlKHsgXCJuYW1lXCIgOiBcIkdlcmhhcmRcIiB9KS50b0FycmF5KCk7XG5kYi51c2Vycy5ieUV4YW1wbGUoeyBcIm5hbWVcIiA6IFwiSGVsbXV0XCIsIFwiX2lkXCIgOiBcInVzZXJzLzE1XCIgfSkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNzI3NzlcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjcyNzc5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVJlQy0tLVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy83Mjc4MFwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNzI3ODBcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUmVDLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzcyNzgxXCIsIFxuICAgIFwiX2tleVwiIDogXCI3Mjc4MVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSZUMtLUFcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3NzlcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNzI3NzlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUmVDLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJHZXJoYXJkXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mjc4MFwiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy83Mjc4MFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSZUMtLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkhlbG11dFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzI3ODFcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNzI3ODFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUmVDLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbmdlbGFcIiBcbiAgfSBcbl1cblxuWyBdXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjcyNzc5XCIsIFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzcyNzc5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVJlQy0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiR2VyaGFyZFwiIFxuICB9IFxuXVxuXG5bIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDAzX2NvbGxlY3Rpb25CeUV4YW1wbGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "004_collectionByExampleNext_single": { + "request": "LS0tCm5hbWU6IDAwNF9jb2xsZWN0aW9uQnlFeGFtcGxlTmV4dApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJ1c2VycyIpOwpkYi51c2Vycy5pbnNlcnQoWwogIHsgbmFtZTogIkdlcmhhcmQiIH0sCiAgeyBuYW1lOiAiSGVsbXV0IiB9LAogIHsgbmFtZTogIkFuZ2VsYSIgfQpdKTsKdmFyIGN1cnNvciA9IGRiLnVzZXJzLmJ5RXhhbXBsZSggeyJuYW1lIiA6ICJBbmdlbGEiIH0gKTsKd2hpbGUgKGN1cnNvci5oYXNOZXh0KCkpIHsKICBwcmludChjdXJzb3IubmV4dCgpKTsKfQp+ZGIuX2Ryb3AoInVzZXJzIik7", + "response": "eyJpbnB1dCI6ImRiLnVzZXJzLmluc2VydChbXG4gIHsgbmFtZTogXCJHZXJoYXJkXCIgfSxcbiAgeyBuYW1lOiBcIkhlbG11dFwiIH0sXG4gIHsgbmFtZTogXCJBbmdlbGFcIiB9XG5dKTtcbnZhciBjdXJzb3IgPSBkYi51c2Vycy5ieUV4YW1wbGUoIHtcIm5hbWVcIiA6IFwiQW5nZWxhXCIgfSApO1xud2hpbGUgKGN1cnNvci5oYXNOZXh0KCkpIHtcbiAgcHJpbnQoY3Vyc29yLm5leHQoKSk7XG59Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy83Mjc5OFwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNzI3OThcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUmZpLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzcyNzk5XCIsIFxuICAgIFwiX2tleVwiIDogXCI3Mjc5OVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSZmktLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNzI4MDBcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjcyODAwXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVJmaS0tQVwiIFxuICB9IFxuXVxueyBcbiAgXCJfa2V5XCIgOiBcIjcyODAwXCIsIFxuICBcIl9pZFwiIDogXCJ1c2Vycy83MjgwMFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUmZpLS1BXCIsIFxuICBcIm5hbWVcIiA6IFwiQW5nZWxhXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjAwNF9jb2xsZWN0aW9uQnlFeGFtcGxlTmV4dCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "010_documentsCollectionRemoveByExample_single": { + "request": "LS0tCm5hbWU6IDAxMF9kb2N1bWVudHNDb2xsZWN0aW9uUmVtb3ZlQnlFeGFtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKfmRiLmV4YW1wbGUuaW5zZXJ0KHsgSGVsbG8gOiAid29ybGQiIH0pOwpkYi5leGFtcGxlLnJlbW92ZUJ5RXhhbXBsZSgge0hlbGxvIDogIndvcmxkIn0gKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUucmVtb3ZlQnlFeGFtcGxlKCB7SGVsbG8gOiBcIndvcmxkXCJ9ICk7Iiwib3V0cHV0IjoiMSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMTBfZG9jdW1lbnRzQ29sbGVjdGlvblJlbW92ZUJ5RXhhbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "011_documentsCollectionReplaceByExample_single": { + "request": "LS0tCm5hbWU6IDAxMV9kb2N1bWVudHNDb2xsZWN0aW9uUmVwbGFjZUJ5RXhhbXBsZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmRiLmV4YW1wbGUuaW5zZXJ0KHsgSGVsbG8gOiAid29ybGQiIH0pOwpkYi5leGFtcGxlLnJlcGxhY2VCeUV4YW1wbGUoeyBIZWxsbzogIndvcmxkIiB9LCB7SGVsbG86ICJtYXJzIn0sIGZhbHNlLCA1KTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHsgSGVsbG8gOiBcIndvcmxkXCIgfSk7XG5kYi5leGFtcGxlLnJlcGxhY2VCeUV4YW1wbGUoeyBIZWxsbzogXCJ3b3JsZFwiIH0sIHtIZWxsbzogXCJtYXJzXCJ9LCBmYWxzZSwgNSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzAxM1wiLCBcbiAgXCJfa2V5XCIgOiBcIjczMDEzXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSOG0tLV9cIiBcbn1cblxuMSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMTFfZG9jdW1lbnRzQ29sbGVjdGlvblJlcGxhY2VCeUV4YW1wbGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "012_documentsCollectionUpdateByExample_single": { + "request": "LS0tCm5hbWU6IDAxMl9kb2N1bWVudHNDb2xsZWN0aW9uVXBkYXRlQnlFeGFtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKZGIuZXhhbXBsZS5pbnNlcnQoeyBIZWxsbyA6ICJ3b3JsZCIsIGZvbyA6ICJiYXIiIH0pOwpkYi5leGFtcGxlLnVwZGF0ZUJ5RXhhbXBsZSh7IEhlbGxvOiAid29ybGQiIH0sIHsgSGVsbG86ICJmb28iLCBXb3JsZDogImJhciIgfSwgZmFsc2UpOwpkYi5leGFtcGxlLmJ5RXhhbXBsZSh7IEhlbGxvOiAiZm9vIiB9KS50b0FycmF5KCkKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHsgSGVsbG8gOiBcIndvcmxkXCIsIGZvbyA6IFwiYmFyXCIgfSk7XG5kYi5leGFtcGxlLnVwZGF0ZUJ5RXhhbXBsZSh7IEhlbGxvOiBcIndvcmxkXCIgfSwgeyBIZWxsbzogXCJmb29cIiwgV29ybGQ6IFwiYmFyXCIgfSwgZmFsc2UpO1xuZGIuZXhhbXBsZS5ieUV4YW1wbGUoeyBIZWxsbzogXCJmb29cIiB9KS50b0FycmF5KCkiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMDc2XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMwNzZcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNEaS0tX1wiIFxufVxuXG4xXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczMDc2XCIsIFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvNzMwNzZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhU0RtLS0tXCIsIFxuICAgIFwiSGVsbG9cIiA6IFwiZm9vXCIsIFxuICAgIFwiZm9vXCIgOiBcImJhclwiLCBcbiAgICBcIldvcmxkXCIgOiBcImJhclwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMTJfZG9jdW1lbnRzQ29sbGVjdGlvblVwZGF0ZUJ5RXhhbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "01_debugDumpCreate_single": { + "request": "LS0tCm5hbWU6IDAxX2RlYnVnRHVtcENyZWF0ZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKCJ3b3JsZENvdW50cnkiKTsKdmFyIHF1ZXJ5ID0gYEZPUiB2LCBlLCBwIElOIDAuLjEwIElOQk9VTkQgIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZSIgR1JBUEggIndvcmxkQ291bnRyeSIgRklMVEVSIHYuX2tleSAhPSBAY291bnRyeSBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUigiIC0tICIsIHAudmVydGljZXMpYDsKdmFyIGJpbmRWYXJzID0geyBjb3VudHJ5OiAiY291bnRyeS1kZW5tYXJrIiB9Owp2YXIgb3B0aW9ucyA9IHsgZXhhbXBsZXM6IDEwLCBhbm9ueW1pemU6IHRydWUgfQp2YXIgZXhwbGFpbmVyID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FxbC9leHBsYWluZXIiKTsgCmV4cGxhaW5lci5kZWJ1Z0R1bXAoIi90bXAvZGVidWdEdW1wRmlsZW5hbWUiLCBxdWVyeSwgYmluZFZhcnMsIG9wdGlvbnMpOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJ3b3JsZENvdW50cnkiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwid29ybGRDb3VudHJ5XCIpO1xudmFyIHF1ZXJ5ID0gYEZPUiB2LCBlLCBwIElOIDAuLjEwIElOQk9VTkQgXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiBHUkFQSCBcIndvcmxkQ291bnRyeVwiIEZJTFRFUiB2Ll9rZXkgIT0gQGNvdW50cnkgUkVUVVJOIENPTkNBVF9TRVBBUkFUT1IoXCIgLS0gXCIsIHAudmVydGljZXMpYDtcbnZhciBiaW5kVmFycyA9IHsgY291bnRyeTogXCJjb3VudHJ5LWRlbm1hcmtcIiB9O1xudmFyIG9wdGlvbnMgPSB7IGV4YW1wbGVzOiAxMCwgYW5vbnltaXplOiB0cnVlIH1cbnZhciBleHBsYWluZXIgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FxbC9leHBsYWluZXJcIik7IFxuZXhwbGFpbmVyLmRlYnVnRHVtcChcIi90bXAvZGVidWdEdW1wRmlsZW5hbWVcIiwgcXVlcnksIGJpbmRWYXJzLCBvcHRpb25zKTsiLCJvdXRwdXQiOiIyMDI1LTA1LTIzVDE4OjE2OjQ1WiBbMTQzNl0gSU5GTyBbOTlkODBdIHtnZW5lcmFsfSBzdG9yZWQgcXVlcnkgZGVidWcgaW5mb3JtYXRpb24gaW4gZmlsZSAnL3RtcC9kZWJ1Z0R1bXBGaWxlbmFtZSciLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDFfZGVidWdEdW1wQ3JlYXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "01_workWithAQL_all_single": { + "request": "LS0tCm5hbWU6IDAxX3dvcmtXaXRoQVFMX2FsbApkZXNjcmlwdGlvbjogJycKLS0tCn5hZGRJZ25vcmVDb2xsZWN0aW9uKCJteWNvbGxlY3Rpb24iKQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoIm15Y29sbGVjdGlvbiIpCnZhciBkb2MgPSBkYi5teWNvbGxlY3Rpb24uc2F2ZSh7IF9rZXk6ICJ0ZXN0S2V5IiwgSGVsbG8gOiAiV29ybGQiIH0pCmRiLl9xdWVyeSgnRk9SIG15IElOIG15Y29sbGVjdGlvbiBSRVRVUk4gbXkuX2tleScpLnRvQXJyYXkoKQ==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcIm15Y29sbGVjdGlvblwiKVxudmFyIGRvYyA9IGRiLm15Y29sbGVjdGlvbi5zYXZlKHsgX2tleTogXCJ0ZXN0S2V5XCIsIEhlbGxvIDogXCJXb3JsZFwiIH0pXG5kYi5fcXVlcnkoJ0ZPUiBteSBJTiBteWNvbGxlY3Rpb24gUkVUVVJOIG15Ll9rZXknKS50b0FycmF5KCkiLCJvdXRwdXQiOiJbIFxuICBcInRlc3RLZXlcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDFfd29ya1dpdGhBUUxfYWxsIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "01_workWithAQL_databaseExplain_single": { + "request": "LS0tCm5hbWU6IDAxX3dvcmtXaXRoQVFMX2RhdGFiYXNlRXhwbGFpbgpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9leHBsYWluKCJMRVQgcyA9IFNMRUVQKDAuMjUpIExFVCB0ID0gU0xFRVAoMC41KSBSRVRVUk4gMSIsIHt9LCB7Y29sb3JzOiBmYWxzZX0pOw==", + "response": "eyJpbnB1dCI6ImRiLl9leHBsYWluKFwiTEVUIHMgPSBTTEVFUCgwLjI1KSBMRVQgdCA9IFNMRUVQKDAuNSkgUkVUVVJOIDFcIiwge30sIHtjb2xvcnM6IGZhbHNlfSk7Iiwib3V0cHV0IjoiUXVlcnkgU3RyaW5nICg0NyBjaGFycywgY2FjaGVhYmxlOiBmYWxzZSk6XG4gTEVUIHMgPSBTTEVFUCgwLjI1KSBMRVQgdCA9IFNMRUVQKDAuNSkgUkVUVVJOIDFcblxuRXhlY3V0aW9uIHBsYW46XG4gSWQgICBOb2RlVHlwZSAgICAgICAgICBFc3QuICAgQ29tbWVudFxuICAxICAgU2luZ2xldG9uTm9kZSAgICAgICAgMSAgICogUk9PVFxuICA0ICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgMSAgICAgLSBMRVQgIzIgPSAxICAgLyoganNvbiBleHByZXNzaW9uICovICAgLyogY29uc3QgYXNzaWdubWVudCAqL1xuICAyICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgMSAgICAgLSBMRVQgcyA9IFNMRUVQKDAuMjUpICAgLyogc2ltcGxlIGV4cHJlc3Npb24gKi9cbiAgMyAgIENhbGN1bGF0aW9uTm9kZSAgICAgIDEgICAgIC0gTEVUIHQgPSBTTEVFUCgwLjUpICAgLyogc2ltcGxlIGV4cHJlc3Npb24gKi9cbiAgNSAgIFJldHVybk5vZGUgICAgICAgICAgIDEgICAgIC0gUkVUVVJOICMyXG5cbkluZGV4ZXMgdXNlZDpcbiBub25lXG5cbkZ1bmN0aW9ucyB1c2VkOlxuIE5hbWUgICAgRGV0ZXJtaW5pc3RpYyAgIENhY2hlYWJsZSAgIFVzZXMgVjhcbiBTTEVFUCAgIGZhbHNlICAgICAgICAgICBmYWxzZSAgICAgICBmYWxzZSAgXG5cbk9wdGltaXphdGlvbiBydWxlcyBhcHBsaWVkOlxuIElkICAgUnVsZU5hbWVcbiAgMSAgIG1vdmUtY2FsY3VsYXRpb25zLXVwXG5cbjQ0IHJ1bGUocykgZXhlY3V0ZWQsIDEgcGxhbihzKSBjcmVhdGVkLCBwZWFrIG1lbSBbYl06IDAsIGV4ZWMgdGltZSBbc106IDAuMDAwMTciLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDFfd29ya1dpdGhBUUxfZGF0YWJhc2VFeHBsYWluIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "01_workWithAQL_databaseProfileQuery_single": { + "request": "LS0tCm5hbWU6IDAxX3dvcmtXaXRoQVFMX2RhdGFiYXNlUHJvZmlsZVF1ZXJ5CmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3Byb2ZpbGVRdWVyeSgiTEVUIHMgPSBTTEVFUCgwLjI1KSBMRVQgdCA9IFNMRUVQKDAuNSkgUkVUVVJOIDEiLCB7fSwge2NvbG9yczogZmFsc2V9KTs=", + "response": "eyJpbnB1dCI6ImRiLl9wcm9maWxlUXVlcnkoXCJMRVQgcyA9IFNMRUVQKDAuMjUpIExFVCB0ID0gU0xFRVAoMC41KSBSRVRVUk4gMVwiLCB7fSwge2NvbG9yczogZmFsc2V9KTsiLCJvdXRwdXQiOiJRdWVyeSBTdHJpbmcgKDQ3IGNoYXJzLCBjYWNoZWFibGU6IGZhbHNlKTpcbiBMRVQgcyA9IFNMRUVQKDAuMjUpIExFVCB0ID0gU0xFRVAoMC41KSBSRVRVUk4gMVxuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICAgIENhbGxzICAgSXRlbXMgICBGaWx0ZXJlZCAgIFJ1bnRpbWUgW3NdICAgQ29tbWVudFxuICAxICAgU2luZ2xldG9uTm9kZSAgICAgICAgIDEgICAgICAgMSAgICAgICAgICAwICAgICAgIDAuMDAwMDAgICAqIFJPT1RcbiAgNCAgIENhbGN1bGF0aW9uTm9kZSAgICAgICAxICAgICAgIDEgICAgICAgICAgMCAgICAgICAwLjAwMDAwICAgICAtIExFVCAjMiA9IDEgICAvKiBqc29uIGV4cHJlc3Npb24gKi8gICAvKiBjb25zdCBhc3NpZ25tZW50ICovXG4gIDIgICBDYWxjdWxhdGlvbk5vZGUgICAgICAgMSAgICAgICAxICAgICAgICAgIDAgICAgICAgMC4yNTE1MSAgICAgLSBMRVQgcyA9IFNMRUVQKDAuMjUpICAgLyogc2ltcGxlIGV4cHJlc3Npb24gKi9cbiAgMyAgIENhbGN1bGF0aW9uTm9kZSAgICAgICAxICAgICAgIDEgICAgICAgICAgMCAgICAgICAwLjUwMjk5ICAgICAtIExFVCB0ID0gU0xFRVAoMC41KSAgIC8qIHNpbXBsZSBleHByZXNzaW9uICovXG4gIDUgICBSZXR1cm5Ob2RlICAgICAgICAgICAgMSAgICAgICAxICAgICAgICAgIDAgICAgICAgMC4wMDAwMSAgICAgLSBSRVRVUk4gIzJcblxuSW5kZXhlcyB1c2VkOlxuIG5vbmVcblxuT3B0aW1pemF0aW9uIHJ1bGVzIGFwcGxpZWQ6XG4gSWQgICBSdWxlTmFtZVxuICAxICAgbW92ZS1jYWxjdWxhdGlvbnMtdXBcblxuUXVlcnkgU3RhdGlzdGljczpcbiBXcml0ZXMgRXhlYyAgIFdyaXRlcyBJZ24gICBTY2FuIEZ1bGwgICBTY2FuIEluZGV4ICAgQ2FjaGUgSGl0cy9NaXNzZXMgICBGaWx0ZXJlZCAgIFBlYWsgTWVtIFtiXSAgIEV4ZWMgVGltZSBbc11cbiAgICAgICAgICAgMCAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgICAwICAgICAgICAgICAgICAgMCAvIDAgICAgICAgICAgMCAgICAgICAgICAgICAgMCAgICAgICAgIDAuNzU0NjVcblxuUXVlcnkgUHJvZmlsZTpcbiBRdWVyeSBTdGFnZSAgICAgICAgICAgICAgIER1cmF0aW9uIFtzXVxuIGluaXRpYWxpemluZyAgICAgICAgICAgICAgICAgICAwLjAwMDAwXG4gcGFyc2luZyAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDJcbiBvcHRpbWl6aW5nIGFzdCAgICAgICAgICAgICAgICAgMC4wMDAwMFxuIGxvYWRpbmcgY29sbGVjdGlvbnMgICAgICAgICAgICAwLjAwMDAxXG4gaW5zdGFudGlhdGluZyBwbGFuICAgICAgICAgICAgIDAuMDAwMDFcbiBvcHRpbWl6aW5nIHBsYW4gICAgICAgICAgICAgICAgMC4wMDAwNVxuIGluc3RhbnRpYXRpbmcgZXhlY3V0b3JzICAgICAgICAwLjAwMDA0XG4gZXhlY3V0aW5nICAgICAgICAgICAgICAgICAgICAgIDAuNzU0NTJcbiBmaW5hbGl6aW5nICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMV93b3JrV2l0aEFRTF9kYXRhYmFzZVByb2ZpbGVRdWVyeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "01_workWithAQL_profileQuerySimple_single": { + "request": "LS0tCm5hbWU6IDAxX3dvcmtXaXRoQVFMX3Byb2ZpbGVRdWVyeVNpbXBsZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fZHJvcCgiYWNvbGxlY3Rpb24iKTsKfmRiLl9jcmVhdGUoJ2Fjb2xsZWN0aW9uJyk7Cn5mb3IgKGxldCBpPTA7IGkgPCAxMDAwMDsgaSsrKSB7IGRiLmFjb2xsZWN0aW9uLmluc2VydCh7dmFsdWU6aX0pOyB9CmRiLl9wcm9maWxlUXVlcnkoYAogIEZPUiBkb2MgSU4gYWNvbGxlY3Rpb24KICAgIEZJTFRFUiBkb2MudmFsdWUgPCAxMAogICAgUkVUVVJOIGRvY2AsIHt9LCB7Y29sb3JzOiBmYWxzZX0KKTsKfmRiLl9kcm9wKCJhY29sbGVjdGlvbiIpOw==", + "response": "eyJpbnB1dCI6ImRiLl9wcm9maWxlUXVlcnkoYFxuICBGT1IgZG9jIElOIGFjb2xsZWN0aW9uXG4gICAgRklMVEVSIGRvYy52YWx1ZSBcdTAwM2MgMTBcbiAgICBSRVRVUk4gZG9jYCwge30sIHtjb2xvcnM6IGZhbHNlfVxuKTsiLCJvdXRwdXQiOiJRdWVyeSBTdHJpbmcgKDY2IGNoYXJzLCBjYWNoZWFibGU6IGZhbHNlKTpcbiAgIEZPUiBkb2MgSU4gYWNvbGxlY3Rpb25cbiAgICAgRklMVEVSIGRvYy52YWx1ZSBcdTAwM2MgMTBcbiAgICAgUkVUVVJOIGRvY1xuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICAgICAgICAgICAgQ2FsbHMgICBJdGVtcyAgIEZpbHRlcmVkICAgUnVudGltZSBbc10gICBDb21tZW50XG4gIDEgICBTaW5nbGV0b25Ob2RlICAgICAgICAgICAgICAgICAxICAgICAgIDEgICAgICAgICAgMCAgICAgICAwLjAwMDAwICAgKiBST09UXG4gIDIgICBFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZSAgICAgICAxICAgICAgMTAgICAgICAgOTk5MCAgICAgICAwLjAwMjAwICAgICAtIEZPUiBkb2MgSU4gYWNvbGxlY3Rpb24gICAvKiBmdWxsIGNvbGxlY3Rpb24gc2NhbiAgKi8gICBGSUxURVIgKGRvYy5gdmFsdWVgIFx1MDAzYyAxMCkgICAvKiBlYXJseSBwcnVuaW5nICovXG4gIDUgICBSZXR1cm5Ob2RlICAgICAgICAgICAgICAgICAgICAxICAgICAgMTAgICAgICAgICAgMCAgICAgICAwLjAwMDAxICAgICAgIC0gUkVUVVJOIGRvY1xuXG5JbmRleGVzIHVzZWQ6XG4gbm9uZVxuXG5PcHRpbWl6YXRpb24gcnVsZXMgYXBwbGllZDpcbiBJZCAgIFJ1bGVOYW1lXG4gIDEgICBtb3ZlLWZpbHRlcnMtaW50by1lbnVtZXJhdGVcblxuUXVlcnkgU3RhdGlzdGljczpcbiBXcml0ZXMgRXhlYyAgIFdyaXRlcyBJZ24gICBTY2FuIEZ1bGwgICBTY2FuIEluZGV4ICAgQ2FjaGUgSGl0cy9NaXNzZXMgICBGaWx0ZXJlZCAgIFBlYWsgTWVtIFtiXSAgIEV4ZWMgVGltZSBbc11cbiAgICAgICAgICAgMCAgICAgICAgICAgIDAgICAgICAgMTAwMDAgICAgICAgICAgICAwICAgICAgICAgICAgICAgMCAvIDAgICAgICAgOTk5MCAgICAgICAgICAgICAgMCAgICAgICAgIDAuMDAyMThcblxuUXVlcnkgUHJvZmlsZTpcbiBRdWVyeSBTdGFnZSAgICAgICAgICAgICAgIER1cmF0aW9uIFtzXVxuIGluaXRpYWxpemluZyAgICAgICAgICAgICAgICAgICAwLjAwMDAwXG4gcGFyc2luZyAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDNcbiBvcHRpbWl6aW5nIGFzdCAgICAgICAgICAgICAgICAgMC4wMDAwMFxuIGxvYWRpbmcgY29sbGVjdGlvbnMgICAgICAgICAgICAwLjAwMDAwXG4gaW5zdGFudGlhdGluZyBwbGFuICAgICAgICAgICAgIDAuMDAwMDFcbiBvcHRpbWl6aW5nIHBsYW4gICAgICAgICAgICAgICAgMC4wMDAwOFxuIGluc3RhbnRpYXRpbmcgZXhlY3V0b3JzICAgICAgICAwLjAwMDAzXG4gZXhlY3V0aW5nICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDJcbiBmaW5hbGl6aW5nICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMV93b3JrV2l0aEFRTF9wcm9maWxlUXVlcnlTaW1wbGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "02_debugDumpInspect_single": { + "request": "LS0tCm5hbWU6IDAyX2RlYnVnRHVtcEluc3BlY3QKZGVzY3JpcHRpb246ICcnCi0tLQp+YXNzZXJ0KGZzLmV4aXN0cygiL3RtcC9kZWJ1Z0R1bXBGaWxlbmFtZSIpKTsKdmFyIGV4cGxhaW5lciA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyIik7IApleHBsYWluZXIuaW5zcGVjdER1bXAoIi90bXAvZGVidWdEdW1wRmlsZW5hbWUiKTs=", + "response": "eyJpbnB1dCI6InZhciBleHBsYWluZXIgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FxbC9leHBsYWluZXJcIik7IFxuZXhwbGFpbmVyLmluc3BlY3REdW1wKFwiL3RtcC9kZWJ1Z0R1bXBGaWxlbmFtZVwiKTsiLCJvdXRwdXQiOiIvKiBvcmlnaW5hbCBkYXRhIGlzIGZyb20gdW5kZWZpbmVkLCBlbnRlcnByaXNlICovXG4vKiBvcmlnaW5hbCBkYXRhIGdhdGhlcmVkIGZyb20gZGF0YWJhc2UgJ1tvYmplY3QgT2JqZWN0XScgKi9cblxuLyogZ3JhcGhzICovXG50cnkgeyBkYi5fZ3JhcGhzLnJlbW92ZShcIndvcmxkQ291bnRyeVwiKTsgfSBjYXRjaCAoZXJyKSB7fVxuZGIuX2dyYXBocy5pbnNlcnQoe1wiX2tleVwiOlwid29ybGRDb3VudHJ5XCIsXCJfaWRcIjpcIl9ncmFwaHMvd29ybGRDb3VudHJ5XCIsXCJfcmV2XCI6XCJfanQzYWx1aS0tX1wiLFwiZWRnZURlZmluaXRpb25zXCI6W3tcImNvbGxlY3Rpb25cIjpcIndvcmxkRWRnZXNcIixcImZyb21cIjpbXCJ3b3JsZFZlcnRpY2VzXCJdLFwidG9cIjpbXCJ3b3JsZFZlcnRpY2VzXCJdfV0sXCJvcnBoYW5Db2xsZWN0aW9uc1wiOltdfSk7XG5cbi8qZHJvcCB2aWV3cyAqL1xuXG4vKiBhbmFseXplcnMgc2V0dXAgKi9cblxuLyogY29sbGVjdGlvbnMgYW5kIGluZGV4ZXMgc2V0dXAgKi9cbnRyeSB7IGRiLl9kcm9wKFwid29ybGRFZGdlc1wiKTsgfSBjYXRjaCAoZXJyKSB7IHByaW50KFN0cmluZyhlcnIpKTsgfVxudHJ5IHsgZGIuX2Ryb3AoXCJ3b3JsZFZlcnRpY2VzXCIpOyB9IGNhdGNoIChlcnIpIHsgcHJpbnQoU3RyaW5nKGVycikpOyB9XG5kYi5fY3JlYXRlKFwid29ybGRWZXJ0aWNlc1wiLCB7XCJnbG9iYWxseVVuaXF1ZUlkXCI6XCJoNjgxMzhENjMwNURBLzgzNTY0XCIsXCJpc1N5c3RlbVwiOmZhbHNlLFwid2FpdEZvclN5bmNcIjpmYWxzZSxcImtleU9wdGlvbnNcIjp7XCJhbGxvd1VzZXJLZXlzXCI6dHJ1ZSxcInR5cGVcIjpcInRyYWRpdGlvbmFsXCIsXCJsYXN0VmFsdWVcIjowfSxcIndyaXRlQ29uY2VyblwiOjEsXCJjYWNoZUVuYWJsZWRcIjpmYWxzZSxcImNvbXB1dGVkVmFsdWVzXCI6bnVsbCxcInN5bmNCeVJldmlzaW9uXCI6dHJ1ZSxcInNjaGVtYVwiOm51bGx9KTtcblxuZGIuX2NyZWF0ZUVkZ2VDb2xsZWN0aW9uKFwid29ybGRFZGdlc1wiLCB7XCJnbG9iYWxseVVuaXF1ZUlkXCI6XCJoNjgxMzhENjMwNURBLzgzNTY3XCIsXCJpc1N5c3RlbVwiOmZhbHNlLFwid2FpdEZvclN5bmNcIjpmYWxzZSxcImtleU9wdGlvbnNcIjp7XCJhbGxvd1VzZXJLZXlzXCI6dHJ1ZSxcInR5cGVcIjpcInRyYWRpdGlvbmFsXCIsXCJsYXN0VmFsdWVcIjo4MzgzM30sXCJ3cml0ZUNvbmNlcm5cIjoxLFwiY2FjaGVFbmFibGVkXCI6ZmFsc2UsXCJjb21wdXRlZFZhbHVlc1wiOm51bGwsXCJzeW5jQnlSZXZpc2lvblwiOnRydWUsXCJzY2hlbWFcIjpudWxsfSk7XG4vKiBleGFtcGxlIGRhdGEgKi9cbmRiW1wid29ybGRWZXJ0aWNlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwid29ybGRcIixcIl9pZFwiOlwid29ybGRWZXJ0aWNlcy93b3JsZFwiLFwiX3JldlwiOlwiX2p0M2FsdWktLUFcIixcIm5hbWVcIjpcIlhYWFhYMTFcIixcInR5cGVcIjpcIlhYWFgxMlwifSk7XG5kYltcIndvcmxkVmVydGljZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcImNvbnRpbmVudC1hZnJpY2FcIixcIl9pZFwiOlwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYWZyaWNhXCIsXCJfcmV2XCI6XCJfanQzYWx1bS0tLVwiLFwibmFtZVwiOlwiWFhYWFhYMTNcIixcInR5cGVcIjpcIlhYWFhYWFhYWDE0XCJ9KTtcbmRiW1wid29ybGRWZXJ0aWNlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwiY29udGluZW50LWFzaWFcIixcIl9pZFwiOlwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLFwiX3JldlwiOlwiX2p0M2FsdW0tLV9cIixcIm5hbWVcIjpcIlhYWFgxNVwiLFwidHlwZVwiOlwiWFhYWFhYWFhYMTZcIn0pO1xuZGJbXCJ3b3JsZFZlcnRpY2VzXCJdLmluc2VydCh7XCJfa2V5XCI6XCJjb250aW5lbnQtYXVzdHJhbGlhXCIsXCJfaWRcIjpcIndvcmxkVmVydGljZXMvY29udGluZW50LWF1c3RyYWxpYVwiLFwiX3JldlwiOlwiX2p0M2FsdW0tLUFcIixcIm5hbWVcIjpcIlhYWFhYWFhYWDE3XCIsXCJ0eXBlXCI6XCJYWFhYWFhYWFgxOFwifSk7XG5kYltcIndvcmxkVmVydGljZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcImNvbnRpbmVudC1ldXJvcGVcIixcIl9pZFwiOlwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXCIsXCJfcmV2XCI6XCJfanQzYWx1bS0tQlwiLFwibmFtZVwiOlwiWFhYWFhYMTlcIixcInR5cGVcIjpcIlhYWFhYWFhYWDIwXCJ9KTtcbmRiW1wid29ybGRWZXJ0aWNlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwiY29udGluZW50LW5vcnRoLWFtZXJpY2FcIixcIl9pZFwiOlwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtbm9ydGgtYW1lcmljYVwiLFwiX3JldlwiOlwiX2p0M2FsdW0tLUNcIixcIm5hbWVcIjpcIlhYWFhYWFhYWFhYWFgyMVwiLFwidHlwZVwiOlwiWFhYWFhYWFhYMjJcIn0pO1xuZGJbXCJ3b3JsZFZlcnRpY2VzXCJdLmluc2VydCh7XCJfa2V5XCI6XCJjb250aW5lbnQtc291dGgtYW1lcmljYVwiLFwiX2lkXCI6XCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1zb3V0aC1hbWVyaWNhXCIsXCJfcmV2XCI6XCJfanQzYWx1bS0tRFwiLFwibmFtZVwiOlwiWFhYWFhYWFhYWFhYWDIzXCIsXCJ0eXBlXCI6XCJYWFhYWFhYWFgyNFwifSk7XG5kYltcIndvcmxkVmVydGljZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcImNvdW50cnktYWZnaGFuaXN0YW5cIixcIl9pZFwiOlwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFmZ2hhbmlzdGFuXCIsXCJfcmV2XCI6XCJfanQzYWx1cS0tLVwiLFwibmFtZVwiOlwiWFhYWFhYWFhYWFgyNVwiLFwidHlwZVwiOlwiWFhYWFhYWDI2XCIsXCJjb2RlXCI6XCJYWFgyN1wifSk7XG5kYltcIndvcmxkVmVydGljZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcImNvdW50cnktYWxiYW5pYVwiLFwiX2lkXCI6XCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxiYW5pYVwiLFwiX3JldlwiOlwiX2p0M2FsdXEtLV9cIixcIm5hbWVcIjpcIlhYWFhYWFgyOFwiLFwidHlwZVwiOlwiWFhYWFhYWDI5XCIsXCJjb2RlXCI6XCJYWFgzMFwifSk7XG5kYltcIndvcmxkVmVydGljZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcImNvdW50cnktYWxnZXJpYVwiLFwiX2lkXCI6XCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxnZXJpYVwiLFwiX3JldlwiOlwiX2p0M2FsdXEtLUFcIixcIm5hbWVcIjpcIlhYWFhYWFgzMVwiLFwidHlwZVwiOlwiWFhYWFhYWDMyXCIsXCJjb2RlXCI6XCJYWFgzM1wifSk7XG4vKiBjb2xsZWN0aW9uICd3b3JsZFZlcnRpY2VzJyBuZWVkcyA3NyBtb3JlIGRvY3VtZW50KHMpICovXG5cbmRiW1wid29ybGRFZGdlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwiODM2NjNcIixcIl9pZFwiOlwid29ybGRFZGdlcy84MzY2M1wiLFwiX2Zyb21cIjpcIndvcmxkVmVydGljZXMvY29udGluZW50LWFmcmljYVwiLFwiX3RvXCI6XCJ3b3JsZFZlcnRpY2VzL3dvcmxkXCIsXCJfcmV2XCI6XCJfanQzYWx2Uy0tQVwiLFwidHlwZVwiOlwiWFhYWFgxXCJ9KTtcbmRiW1wid29ybGRFZGdlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwiODM2NjVcIixcIl9pZFwiOlwid29ybGRFZGdlcy84MzY2NVwiLFwiX2Zyb21cIjpcIndvcmxkVmVydGljZXMvY29udGluZW50LWFzaWFcIixcIl90b1wiOlwid29ybGRWZXJ0aWNlcy93b3JsZFwiLFwiX3JldlwiOlwiX2p0M2FsdlMtLUJcIixcInR5cGVcIjpcIlhYWFhYMlwifSk7XG5kYltcIndvcmxkRWRnZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcIjgzNjY3XCIsXCJfaWRcIjpcIndvcmxkRWRnZXMvODM2NjdcIixcIl9mcm9tXCI6XCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hdXN0cmFsaWFcIixcIl90b1wiOlwid29ybGRWZXJ0aWNlcy93b3JsZFwiLFwiX3JldlwiOlwiX2p0M2FsdlMtLUNcIixcInR5cGVcIjpcIlhYWFhYM1wifSk7XG5kYltcIndvcmxkRWRnZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcIjgzNjY5XCIsXCJfaWRcIjpcIndvcmxkRWRnZXMvODM2NjlcIixcIl9mcm9tXCI6XCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIixcIl90b1wiOlwid29ybGRWZXJ0aWNlcy93b3JsZFwiLFwiX3JldlwiOlwiX2p0M2FsdlMtLURcIixcInR5cGVcIjpcIlhYWFhYNFwifSk7XG5kYltcIndvcmxkRWRnZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcIjgzNjcxXCIsXCJfaWRcIjpcIndvcmxkRWRnZXMvODM2NzFcIixcIl9mcm9tXCI6XCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ub3J0aC1hbWVyaWNhXCIsXCJfdG9cIjpcIndvcmxkVmVydGljZXMvd29ybGRcIixcIl9yZXZcIjpcIl9qdDNhbHZXLS0tXCIsXCJ0eXBlXCI6XCJYWFhYWDVcIn0pO1xuZGJbXCJ3b3JsZEVkZ2VzXCJdLmluc2VydCh7XCJfa2V5XCI6XCI4MzY3M1wiLFwiX2lkXCI6XCJ3b3JsZEVkZ2VzLzgzNjczXCIsXCJfZnJvbVwiOlwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLFwiX3RvXCI6XCJ3b3JsZFZlcnRpY2VzL3dvcmxkXCIsXCJfcmV2XCI6XCJfanQzYWx2Vy0tX1wiLFwidHlwZVwiOlwiWFhYWFg2XCJ9KTtcbmRiW1wid29ybGRFZGdlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwiODM2NzVcIixcIl9pZFwiOlwid29ybGRFZGdlcy84MzY3NVwiLFwiX2Zyb21cIjpcIndvcmxkVmVydGljZXMvY291bnRyeS1hZmdoYW5pc3RhblwiLFwiX3RvXCI6XCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hc2lhXCIsXCJfcmV2XCI6XCJfanQzYWx2Vy0tQVwiLFwidHlwZVwiOlwiWFhYWFg3XCJ9KTtcbmRiW1wid29ybGRFZGdlc1wiXS5pbnNlcnQoe1wiX2tleVwiOlwiODM2NzdcIixcIl9pZFwiOlwid29ybGRFZGdlcy84MzY3N1wiLFwiX2Zyb21cIjpcIndvcmxkVmVydGljZXMvY291bnRyeS1hbGJhbmlhXCIsXCJfdG9cIjpcIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZVwiLFwiX3JldlwiOlwiX2p0M2FsdlctLUJcIixcInR5cGVcIjpcIlhYWFhYOFwifSk7XG5kYltcIndvcmxkRWRnZXNcIl0uaW5zZXJ0KHtcIl9rZXlcIjpcIjgzNjc5XCIsXCJfaWRcIjpcIndvcmxkRWRnZXMvODM2NzlcIixcIl9mcm9tXCI6XCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxnZXJpYVwiLFwiX3RvXCI6XCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIixcIl9yZXZcIjpcIl9qdDNhbHZXLS1DXCIsXCJ0eXBlXCI6XCJYWFhYWDlcIn0pO1xuZGJbXCJ3b3JsZEVkZ2VzXCJdLmluc2VydCh7XCJfa2V5XCI6XCI4MzY4MVwiLFwiX2lkXCI6XCJ3b3JsZEVkZ2VzLzgzNjgxXCIsXCJfZnJvbVwiOlwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFuZG9ycmFcIixcIl90b1wiOlwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXCIsXCJfcmV2XCI6XCJfanQzYWx2YS0tLVwiLFwidHlwZVwiOlwiWFhYWFgxMFwifSk7XG4vKiBjb2xsZWN0aW9uICd3b3JsZEVkZ2VzJyBuZWVkcyA3NiBtb3JlIGRvY3VtZW50KHMpICovXG4vKiB2aWV3cyAqL1xuXG4vKiBleHBsYWluIHJlc3VsdCAqL1xuLy8gUXVlcnkgU3RyaW5nICgxNTIgY2hhcnMsIGNhY2hlYWJsZTogdHJ1ZSk6XG4vLyAgRk9SIHYsIGUsIHAgSU4gMC4uMTAgSU5CT1VORCBcIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZVwiIEdSQVBIIFwid29ybGRDb3VudHJ5XCIgRklMVEVSIHYuX2tleSAhPSBcbi8vICBAY291bnRyeSBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUihcIiAtLSBcIiwgcC52ZXJ0aWNlcylcbi8vIFxuLy8gRXhlY3V0aW9uIHBsYW46XG4vLyAgSWQgICBOb2RlVHlwZSAgICAgICAgICBFc3QuICAgQ29tbWVudFxuLy8gICAxICAgU2luZ2xldG9uTm9kZSAgICAgICAgMSAgICogUk9PVFxuLy8gICAyICAgVHJhdmVyc2FsTm9kZSAgICAgICAgMSAgICAgLSBGT1IgdiAgLyogdmVydGV4ICovLCBwICAvKiBwYXRoczogdmVydGljZXMgKi8gSU4gMC4uMTAgIC8qIG1pbi4ubWF4UGF0aERlcHRoICovIElOQk9VTkQgJ3dvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZScgLyogc3RhcnRub2RlICovICBHUkFQSCAnd29ybGRDb3VudHJ5J1xuLy8gICAzICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgMSAgICAgICAtIExFVCAjNSA9ICh2LmBfa2V5YCAhPSBcIlhYWFhYWFhYWFhYWFhYWDBcIikgICAvKiBzaW1wbGUgZXhwcmVzc2lvbiAqL1xuLy8gICA0ICAgRmlsdGVyTm9kZSAgICAgICAgICAgMSAgICAgICAtIEZJTFRFUiAjNVxuLy8gICA1ICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgMSAgICAgICAtIExFVCAjNyA9IENPTkNBVF9TRVBBUkFUT1IoXCIgLS0gXCIsIHAuYHZlcnRpY2VzYCkgICAvKiBzaW1wbGUgZXhwcmVzc2lvbiAqL1xuLy8gICA2ICAgUmV0dXJuTm9kZSAgICAgICAgICAgMSAgICAgICAtIFJFVFVSTiAjN1xuLy8gXG4vLyBJbmRleGVzIHVzZWQ6XG4vLyAgQnkgICBOYW1lICAgVHlwZSAgIENvbGxlY3Rpb24gICBVbmlxdWUgICBTcGFyc2UgICBDYWNoZSAgIFNlbGVjdGl2aXR5ICAgRmllbGRzICAgICAgU3RvcmVkIHZhbHVlcyAgIFJhbmdlc1xuLy8gICAyICAgZWRnZSAgIGVkZ2UgICB3b3JsZEVkZ2VzICAgZmFsc2UgICAgZmFsc2UgICAgZmFsc2UgICAgICAxMDAuMDAgJSAgIFsgYF90b2AgXSAgIFsgIF0gICAgICAgICAgICBiYXNlIElOQk9VTkRcbi8vIFxuLy8gRnVuY3Rpb25zIHVzZWQ6XG4vLyAgTmFtZSAgICAgICAgICAgICAgIERldGVybWluaXN0aWMgICBDYWNoZWFibGUgICBVc2VzIFY4XG4vLyAgQ09OQ0FUX1NFUEFSQVRPUiAgIHRydWUgICAgICAgICAgICB0cnVlICAgICAgICBmYWxzZSAgXG4vLyBcbi8vIFRyYXZlcnNhbHMgb24gZ3JhcGhzOlxuLy8gIElkICBEZXB0aCAgVmVydGV4IGNvbGxlY3Rpb25zICBFZGdlIGNvbGxlY3Rpb25zICBPcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlciAvIFBydW5lIENvbmRpdGlvbnMgICAgICAgICAgICAgIFxuLy8gIDIgICAwLi4xMCAgd29ybGRWZXJ0aWNlcyAgICAgICB3b3JsZEVkZ2VzICAgICAgICB1bmlxdWVWZXJ0aWNlczogbm9uZSwgdW5pcXVlRWRnZXM6IHBhdGggIEZJTFRFUiAodi5gX2tleWAgIT0gXCJYWFhYWFhYWFhYWFhYWFgwXCIpXG4vLyBcbi8vIE9wdGltaXphdGlvbiBydWxlcyBhcHBsaWVkOlxuLy8gIElkICAgUnVsZU5hbWVcbi8vICAgMSAgIG1vdmUtY2FsY3VsYXRpb25zLXVwXG4vLyAgIDIgICBtb3ZlLWZpbHRlcnMtdXBcbi8vICAgMyAgIG1vdmUtY2FsY3VsYXRpb25zLXVwLTJcbi8vICAgNCAgIG1vdmUtZmlsdGVycy11cC0yXG4vLyAgIDUgICBvcHRpbWl6ZS10cmF2ZXJzYWxzXG4vLyAgIDYgICByZW1vdmUtcmVkdW5kYW50LXBhdGgtdmFyXG4vLyBcbi8vIDQ0IHJ1bGUocykgZXhlY3V0ZWQsIDEgcGxhbihzKSBjcmVhdGVkLCBwZWFrIG1lbSBbYl06IDAsIGV4ZWMgdGltZSBbc106IDAuMDAwMjhcblxuLyogZXhwbGFpbiBjb21tYW5kICovXG5kYi5fZXhwbGFpbih7XCJxdWVyeVwiOlwiRk9SIHYsIGUsIHAgSU4gMC4uMTAgSU5CT1VORCBcXFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXFxcIiBHUkFQSCBcXFwid29ybGRDb3VudHJ5XFxcIiBGSUxURVIgdi5fa2V5ICE9IEBjb3VudHJ5IFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFxcXCIgLS0gXFxcIiwgcC52ZXJ0aWNlcylcIixcImJpbmRWYXJzXCI6e1wiY291bnRyeVwiOlwiWFhYWFhYWFhYWFhYWFhYMFwifSxcIm9wdGlvbnNcIjp7XCJleHBsYWluUmVnaXN0ZXJzXCI6dHJ1ZSxcImV4cGxhaW5JbnRlcm5hbHNcIjpmYWxzZSxcInZlcmJvc2VQbGFuc1wiOnRydWUsXCJwcm9maWxlXCI6Mn19KTsiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDJfZGVidWdEdW1wSW5zcGVjdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_aqlCollectionQuery_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2FxbENvbGxlY3Rpb25RdWVyeQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBrZXkgPSAndGVzdEtleSc7CmRiLl9xdWVyeShhcWxgRk9SIGRvYyBJTiAkeyBkYi5teWNvbGxlY3Rpb24gfSBSRVRVUk4gZG9jYCkudG9BcnJheSgpOw==", + "response": "eyJpbnB1dCI6InZhciBrZXkgPSAndGVzdEtleSc7XG5kYi5fcXVlcnkoYXFsYEZPUiBkb2MgSU4gJHsgZGIubXljb2xsZWN0aW9uIH0gUkVUVVJOIGRvY2ApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJ0ZXN0S2V5XCIsIFxuICAgIFwiX2lkXCIgOiBcIm15Y29sbGVjdGlvbi90ZXN0S2V5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlp6eS0tQVwiLCBcbiAgICBcIkhlbGxvXCIgOiBcIldvcmxkXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjAyX3dvcmtXaXRoQVFMX2FxbENvbGxlY3Rpb25RdWVyeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_aqlQuery_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2FxbFF1ZXJ5CmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGtleSA9ICd0ZXN0S2V5JzsKZGIuX3F1ZXJ5KAogIGFxbGBGT1IgYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGMuX2tleSA9PSAke2tleX0gUkVUVVJOIGMuX2tleWAKKS50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6InZhciBrZXkgPSAndGVzdEtleSc7XG5kYi5fcXVlcnkoXG4gIGFxbGBGT1IgYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGMuX2tleSA9PSAke2tleX0gUkVUVVJOIGMuX2tleWBcbikudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFwidGVzdEtleVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMl93b3JrV2l0aEFRTF9hcWxRdWVyeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_aqlTemplateString_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2FxbFRlbXBsYXRlU3RyaW5nCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGtleSA9ICd0ZXN0S2V5JzsKYXFsYEZPUiBjIElOIG15Y29sbGVjdGlvbiBGSUxURVIgYy5fa2V5ID09ICR7a2V5fSBSRVRVUk4gYy5fa2V5YA==", + "response": "eyJpbnB1dCI6InZhciBrZXkgPSAndGVzdEtleSc7XG5hcWxgRk9SIGMgSU4gbXljb2xsZWN0aW9uIEZJTFRFUiBjLl9rZXkgPT0gJHtrZXl9IFJFVFVSTiBjLl9rZXlgIiwib3V0cHV0IjoieyBcbiAgXCJxdWVyeVwiIDogXCJGT1IgYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGMuX2tleSA9PSBAdmFsdWUwIFJFVFVSTiBjLl9rZXlcIiwgXG4gIFwiYmluZFZhcnNcIiA6IHsgXG4gICAgXCJ2YWx1ZTBcIiA6IFwidGVzdEtleVwiIFxuICB9LCBcbiAgXCJfc291cmNlXCIgOiAoKSB7IC4uLiB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMl93b3JrV2l0aEFRTF9hcWxUZW1wbGF0ZVN0cmluZyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_batchSize_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2JhdGNoU2l6ZQpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9xdWVyeSgKICAnRk9SIGkgSU4gMS4uMyBSRVRVUk4gaScsCiAge30sCiAgeyBiYXRjaFNpemU6IDIgfSwKICB7fQopLnRvQXJyYXkoKTsgLy8gZnVsbCByZXN1bHQgcmV0cmlldmVkIGluIHR3byBiYXRjaGVz", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShcbiAgJ0ZPUiBpIElOIDEuLjMgUkVUVVJOIGknLFxuICB7fSxcbiAgeyBiYXRjaFNpemU6IDIgfSxcbiAge31cbikudG9BcnJheSgpOyAvLyBmdWxsIHJlc3VsdCByZXRyaWV2ZWQgaW4gdHdvIGJhdGNoZXMiLCJvdXRwdXQiOiJbIFxuICAxLCBcbiAgMiwgXG4gIDMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjAyX3dvcmtXaXRoQVFMX2JhdGNoU2l6ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_bindValues_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2JpbmRWYWx1ZXMKZGVzY3JpcHRpb246ICcnCi0tLQpkYi5fcXVlcnkoJ0ZPUiBjIElOIEBAY29sbGVjdGlvbiBGSUxURVIgYy5fa2V5ID09IEBrZXkgUkVUVVJOIGMuX2tleScsIHsKICAnQGNvbGxlY3Rpb24nOiAnbXljb2xsZWN0aW9uJywgCiAgJ2tleSc6ICd0ZXN0S2V5Jwp9KS50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeSgnRk9SIGMgSU4gQEBjb2xsZWN0aW9uIEZJTFRFUiBjLl9rZXkgPT0gQGtleSBSRVRVUk4gYy5fa2V5Jywge1xuICAnQGNvbGxlY3Rpb24nOiAnbXljb2xsZWN0aW9uJywgXG4gICdrZXknOiAndGVzdEtleSdcbn0pLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBcInRlc3RLZXlcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDJfd29ya1dpdGhBUUxfYmluZFZhbHVlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_cache_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2NhY2hlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHJlc3VsdENhY2hlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FxbC9jYWNoZSIpOwpyZXN1bHRDYWNoZS5wcm9wZXJ0aWVzKHsgbW9kZTogImRlbWFuZCIgfSk7Cn5yZXN1bHRDYWNoZS5jbGVhcigpOwpkYi5fcXVlcnkoIkZPUiBpIElOIDEuLjUgUkVUVVJOIGkiLCB7fSwgeyBjYWNoZTogdHJ1ZSB9KTsgLy8gQWRkcyByZXN1bHQgdG8gY2FjaGUKZGIuX3F1ZXJ5KCJGT1IgaSBJTiAxLi41IFJFVFVSTiBpIiwge30sIHsgY2FjaGU6IHRydWUgfSk7IC8vIFJldHJpZXZlcyByZXN1bHQgZnJvbSBjYWNoZQpkYi5fcXVlcnkoIkZPUiBpIElOIDEuLjUgUkVUVVJOIGkiLCB7fSwgeyBjYWNoZTogZmFsc2UgfSk7IC8vIEJ5cGFzc2VzIHRoZSBjYWNoZQ==", + "response": "eyJpbnB1dCI6InZhciByZXN1bHRDYWNoZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvYXFsL2NhY2hlXCIpO1xucmVzdWx0Q2FjaGUucHJvcGVydGllcyh7IG1vZGU6IFwiZGVtYW5kXCIgfSk7XG5kYi5fcXVlcnkoXCJGT1IgaSBJTiAxLi41IFJFVFVSTiBpXCIsIHt9LCB7IGNhY2hlOiB0cnVlIH0pOyAvLyBBZGRzIHJlc3VsdCB0byBjYWNoZVxuZGIuX3F1ZXJ5KFwiRk9SIGkgSU4gMS4uNSBSRVRVUk4gaVwiLCB7fSwgeyBjYWNoZTogdHJ1ZSB9KTsgLy8gUmV0cmlldmVzIHJlc3VsdCBmcm9tIGNhY2hlXG5kYi5fcXVlcnkoXCJGT1IgaSBJTiAxLi41IFJFVFVSTiBpXCIsIHt9LCB7IGNhY2hlOiBmYWxzZSB9KTsgLy8gQnlwYXNzZXMgdGhlIGNhY2hlIiwib3V0cHV0IjoieyBcbiAgXCJtb2RlXCIgOiBcImRlbWFuZFwiLCBcbiAgXCJtYXhSZXN1bHRzXCIgOiAxMjgsIFxuICBcIm1heFJlc3VsdHNTaXplXCIgOiAyNjg0MzU0NTYsIFxuICBcIm1heEVudHJ5U2l6ZVwiIDogMTY3NzcyMTYsIFxuICBcImluY2x1ZGVTeXN0ZW1cIiA6IGZhbHNlIFxufVxuW29iamVjdCBBcmFuZ29RdWVyeUN1cnNvciwgY291bnQ6IDUsIGNhY2hlZDogZmFsc2UsIGhhc01vcmU6IGZhbHNlXVxuXG5bIFxuICAxLCBcbiAgMiwgXG4gIDMsIFxuICA0LCBcbiAgNSBcbl1cblxuW29iamVjdCBBcmFuZ29RdWVyeUN1cnNvciwgY291bnQ6IDUsIGNhY2hlZDogdHJ1ZSwgaGFzTW9yZTogZmFsc2VdXG5cblsgXG4gIDEsIFxuICAyLCBcbiAgMywgXG4gIDQsIFxuICA1IFxuXVxuXG5bb2JqZWN0IEFyYW5nb1F1ZXJ5Q3Vyc29yLCBjb3VudDogNSwgY2FjaGVkOiBmYWxzZSwgaGFzTW9yZTogZmFsc2VdXG5cblsgXG4gIDEsIFxuICAyLCBcbiAgMywgXG4gIDQsIFxuICA1IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMl93b3JrV2l0aEFRTF9jYWNoZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_count_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX2NvdW50CmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGN1cnNvciA9IGRiLl9xdWVyeSgKICAnRk9SIGkgSU4gMS4uNDIgUkVUVVJOIGknLAogIHt9LAogIHsgY291bnQ6IHRydWUgfSwKICB7fQopOwpjdXJzb3IuY291bnQoKTsKY3Vyc29yLnRvQXJyYXkoKS5sZW5ndGg7", + "response": "eyJpbnB1dCI6InZhciBjdXJzb3IgPSBkYi5fcXVlcnkoXG4gICdGT1IgaSBJTiAxLi40MiBSRVRVUk4gaScsXG4gIHt9LFxuICB7IGNvdW50OiB0cnVlIH0sXG4gIHt9XG4pO1xuY3Vyc29yLmNvdW50KCk7XG5jdXJzb3IudG9BcnJheSgpLmxlbmd0aDsiLCJvdXRwdXQiOiI0MlxuXG40MiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMl93b3JrV2l0aEFRTF9jb3VudCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "02_workWithAQL_memoryLimit_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX21lbW9yeUxpbWl0CmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3F1ZXJ5KAogICdGT1IgaSBJTiAxLi4xMDAwMDAgU09SVCBpIFJFVFVSTiBpJywKICB7fSwKICB7IG1lbW9yeUxpbWl0OiAxMDAwMDAgfQopLnRvQXJyYXkoKTsgLy8geHBFcnJvcihFUlJPUl9SRVNPVVJDRV9MSU1JVCk=", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShcbiAgJ0ZPUiBpIElOIDEuLjEwMDAwMCBTT1JUIGkgUkVUVVJOIGknLFxuICB7fSxcbiAgeyBtZW1vcnlMaW1pdDogMTAwMDAwIH1cbikudG9BcnJheSgpOyAiLCJvdXRwdXQiOiJbQXJhbmdvRXJyb3IgMzI6IEFRTDogcXVlcnkgd291bGQgdXNlIG1vcmUgbWVtb3J5IHRoYW4gYWxsb3dlZCAod2hpbGUgZXhlY3V0aW5nKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDJfd29ya1dpdGhBUUxfbWVtb3J5TGltaXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "02_workWithAQL_profileQuerySimpleIndex_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX3Byb2ZpbGVRdWVyeVNpbXBsZUluZGV4CmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoJ2Fjb2xsZWN0aW9uJyk7Cn5kYi5hY29sbGVjdGlvbi5lbnN1cmVJbmRleCh7dHlwZToicGVyc2lzdGVudCIsIGZpZWxkczpbInZhbHVlIl19KTsKfmZvciAobGV0IGk9MDsgaSA8IDEwMDAwOyBpKyspIHsgZGIuYWNvbGxlY3Rpb24uaW5zZXJ0KHt2YWx1ZTppfSk7IH0KZGIuX3Byb2ZpbGVRdWVyeShgCiAgRk9SIGRvYyBJTiBhY29sbGVjdGlvbgogICAgRklMVEVSIGRvYy52YWx1ZSA8IDEwCiAgICBSRVRVUk4gZG9jYCwge30sIHtjb2xvcnM6IGZhbHNlfQopOwp+ZGIuX2Ryb3AoImFjb2xsZWN0aW9uIik7", + "response": "eyJpbnB1dCI6ImRiLl9wcm9maWxlUXVlcnkoYFxuICBGT1IgZG9jIElOIGFjb2xsZWN0aW9uXG4gICAgRklMVEVSIGRvYy52YWx1ZSBcdTAwM2MgMTBcbiAgICBSRVRVUk4gZG9jYCwge30sIHtjb2xvcnM6IGZhbHNlfVxuKTsiLCJvdXRwdXQiOiJRdWVyeSBTdHJpbmcgKDY2IGNoYXJzLCBjYWNoZWFibGU6IGZhbHNlKTpcbiAgIEZPUiBkb2MgSU4gYWNvbGxlY3Rpb25cbiAgICAgRklMVEVSIGRvYy52YWx1ZSBcdTAwM2MgMTBcbiAgICAgUkVUVVJOIGRvY1xuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICBDYWxscyAgIEl0ZW1zICAgRmlsdGVyZWQgICBSdW50aW1lIFtzXSAgIENvbW1lbnRcbiAgMSAgIFNpbmdsZXRvbk5vZGUgICAgICAgMSAgICAgICAxICAgICAgICAgIDAgICAgICAgMC4wMDAwMCAgICogUk9PVFxuICA2ICAgSW5kZXhOb2RlICAgICAgICAgICAxICAgICAgMTAgICAgICAgICAgMCAgICAgICAwLjAwMDA1ICAgICAtIEZPUiBkb2MgSU4gYWNvbGxlY3Rpb24gICAvKiBwZXJzaXN0ZW50IGluZGV4IHNjYW4sIGluZGV4IHNjYW4gKyBkb2N1bWVudCBsb29rdXAgKi8gICAgXG4gIDUgICBSZXR1cm5Ob2RlICAgICAgICAgIDEgICAgICAxMCAgICAgICAgICAwICAgICAgIDAuMDAwMDAgICAgICAgLSBSRVRVUk4gZG9jXG5cbkluZGV4ZXMgdXNlZDpcbiBCeSAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIENvbGxlY3Rpb24gICAgVW5pcXVlICAgU3BhcnNlICAgQ2FjaGUgICBTZWxlY3Rpdml0eSAgIEZpZWxkcyAgICAgICAgU3RvcmVkIHZhbHVlcyAgIFJhbmdlc1xuICA2ICAgaWR4XzE4MzI5MzYxNDE3NjE4MDYzMzcgICBwZXJzaXN0ZW50ICAgYWNvbGxlY3Rpb24gICBmYWxzZSAgICBmYWxzZSAgICBmYWxzZSAgICAgIDEwMC4wMCAlICAgWyBgdmFsdWVgIF0gICBbICBdICAgICAgICAgICAgKGRvYy5gdmFsdWVgIFx1MDAzYyAxMClcblxuT3B0aW1pemF0aW9uIHJ1bGVzIGFwcGxpZWQ6XG4gSWQgICBSdWxlTmFtZVxuICAxICAgdXNlLWluZGV4ZXNcbiAgMiAgIHJlbW92ZS1maWx0ZXItY292ZXJlZC1ieS1pbmRleFxuICAzICAgcmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9ucy0yXG5cblF1ZXJ5IFN0YXRpc3RpY3M6XG4gV3JpdGVzIEV4ZWMgICBXcml0ZXMgSWduICAgU2NhbiBGdWxsICAgU2NhbiBJbmRleCAgIENhY2hlIEhpdHMvTWlzc2VzICAgRmlsdGVyZWQgICBQZWFrIE1lbSBbYl0gICBFeGVjIFRpbWUgW3NdXG4gICAgICAgICAgIDAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAxMCAgICAgICAgICAgICAgIDAgLyAwICAgICAgICAgIDAgICAgICAgICAgICAgIDAgICAgICAgICAwLjAwMDI3XG5cblF1ZXJ5IFByb2ZpbGU6XG4gUXVlcnkgU3RhZ2UgICAgICAgICAgICAgICBEdXJhdGlvbiBbc11cbiBpbml0aWFsaXppbmcgICAgICAgICAgICAgICAgICAgMC4wMDAwMFxuIHBhcnNpbmcgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA0XG4gb3B0aW1pemluZyBhc3QgICAgICAgICAgICAgICAgIDAuMDAwMDBcbiBsb2FkaW5nIGNvbGxlY3Rpb25zICAgICAgICAgICAgMC4wMDAwMFxuIGluc3RhbnRpYXRpbmcgcGxhbiAgICAgICAgICAgICAwLjAwMDAyXG4gb3B0aW1pemluZyBwbGFuICAgICAgICAgICAgICAgIDAuMDAwMTBcbiBpbnN0YW50aWF0aW5nIGV4ZWN1dG9ycyAgICAgICAgMC4wMDAwM1xuIGV4ZWN1dGluZyAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA3XG4gZmluYWxpemluZyAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDJfd29ya1dpdGhBUUxfcHJvZmlsZVF1ZXJ5U2ltcGxlSW5kZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "02_workWithAQL_ttl_single": { + "request": "LS0tCm5hbWU6IDAyX3dvcmtXaXRoQVFMX3R0bApkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9xdWVyeSgKICAnRk9SIGkgSU4gMS4uMjAgUkVUVVJOIGknLAogIHt9LAogIHsgdHRsOiA1LCBiYXRjaFNpemU6IDEwIH0sCiAge30KKS50b0FycmF5KCk7IC8vIEVhY2ggYmF0Y2ggbmVlZHMgdG8gYmUgZmV0Y2hlZCB3aXRoaW4gNSBzZWNvbmRz", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShcbiAgJ0ZPUiBpIElOIDEuLjIwIFJFVFVSTiBpJyxcbiAge30sXG4gIHsgdHRsOiA1LCBiYXRjaFNpemU6IDEwIH0sXG4gIHt9XG4pLnRvQXJyYXkoKTsgLy8gRWFjaCBiYXRjaCBuZWVkcyB0byBiZSBmZXRjaGVkIHdpdGhpbiA1IHNlY29uZHMiLCJvdXRwdXQiOiJbIFxuICAxLCBcbiAgMiwgXG4gIDMsIFxuICA0LCBcbiAgNSwgXG4gIDYsIFxuICA3LCBcbiAgOCwgXG4gIDksIFxuICAxMCwgXG4gIDExLCBcbiAgMTIsIFxuICAxMywgXG4gIDE0LCBcbiAgMTUsIFxuICAxNiwgXG4gIDE3LCBcbiAgMTgsIFxuICAxOSwgXG4gIDIwIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwMl93b3JrV2l0aEFRTF90dGwiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "03_workWithAQL_getExtra_single": { + "request": "LS0tCm5hbWU6IDAzX3dvcmtXaXRoQVFMX2dldEV4dHJhCmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3F1ZXJ5KGAKICBGT1IgaSBJTiAxLi4xMDAKICAgIElOU0VSVCB7IF9rZXk6IENPTkNBVCgndGVzdCcsIFRPX1NUUklORyhpKSkgfSBJTlRPIG15Y29sbGVjdGlvbgpgKS5nZXRFeHRyYSgpOw==", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgXG4gIEZPUiBpIElOIDEuLjEwMFxuICAgIElOU0VSVCB7IF9rZXk6IENPTkNBVCgndGVzdCcsIFRPX1NUUklORyhpKSkgfSBJTlRPIG15Y29sbGVjdGlvblxuYCkuZ2V0RXh0cmEoKTsiLCJvdXRwdXQiOiJ7IFxuICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDEwMCwgXG4gICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAwLCBcbiAgICBcInNjYW5uZWRGdWxsXCIgOiAwLCBcbiAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMCwgXG4gICAgXCJjdXJzb3JzUmVhcm1lZFwiIDogMCwgXG4gICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAxMDU0NzcyOTk5OTkyNzkyNCwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDMyNzY4LCBcbiAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjAzX3dvcmtXaXRoQVFMX2dldEV4dHJhIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "03_workWithAQL_profileQuerySubquery_single": { + "request": "LS0tCm5hbWU6IDAzX3dvcmtXaXRoQVFMX3Byb2ZpbGVRdWVyeVN1YnF1ZXJ5CmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoJ2Fjb2xsZWN0aW9uJyk7Cn5kYi5hY29sbGVjdGlvbi5lbnN1cmVJbmRleCh7dHlwZToicGVyc2lzdGVudCIsIGZpZWxkczpbInZhbHVlIl19KTsKfmZvciAobGV0IGk9MDsgaSA8IDEwMDAwO2krKykgeyBkYi5hY29sbGVjdGlvbi5pbnNlcnQoe3ZhbHVlOml9KTsgfQpkYi5fcHJvZmlsZVF1ZXJ5KGAKICBMRVQgbGlzdCA9IChGT1IgZG9jIGluIGFjb2xsZWN0aW9uIEZJTFRFUiBkb2MudmFsdWUgPiA5MCBSRVRVUk4gZG9jKQogIEZPUiBhIElOIGxpc3QgCiAgICBGSUxURVIgYS52YWx1ZSA8IDkxIAogICAgUkVUVVJOIGFgLCB7fSwge2NvbG9yczogZmFsc2UsIG9wdGltaXplcjp7cnVsZXM6WyItYWxsIl19fQopOwp+ZGIuX2Ryb3AoImFjb2xsZWN0aW9uIik7", + "response": "eyJpbnB1dCI6ImRiLl9wcm9maWxlUXVlcnkoYFxuICBMRVQgbGlzdCA9IChGT1IgZG9jIGluIGFjb2xsZWN0aW9uIEZJTFRFUiBkb2MudmFsdWUgXHUwMDNlIDkwIFJFVFVSTiBkb2MpXG4gIEZPUiBhIElOIGxpc3QgXG4gICAgRklMVEVSIGEudmFsdWUgXHUwMDNjIDkxIFxuICAgIFJFVFVSTiBhYCwge30sIHtjb2xvcnM6IGZhbHNlLCBvcHRpbWl6ZXI6e3J1bGVzOltcIi1hbGxcIl19fVxuKTsiLCJvdXRwdXQiOiJRdWVyeSBTdHJpbmcgKDEyNiBjaGFycywgY2FjaGVhYmxlOiBmYWxzZSk6XG4gICBMRVQgbGlzdCA9IChGT1IgZG9jIGluIGFjb2xsZWN0aW9uIEZJTFRFUiBkb2MudmFsdWUgXHUwMDNlIDkwIFJFVFVSTiBkb2MpXG4gICBGT1IgYSBJTiBsaXN0IFxuICAgICBGSUxURVIgYS52YWx1ZSBcdTAwM2MgOTEgXG4gICAgIFJFVFVSTiBhXG5cbkV4ZWN1dGlvbiBwbGFuOlxuIElkICAgTm9kZVR5cGUgICAgICAgICAgICAgICAgICBDYWxscyAgIEl0ZW1zICAgRmlsdGVyZWQgICBSdW50aW1lIFtzXSAgIENvbW1lbnRcbiAgMSAgIFNpbmdsZXRvbk5vZGUgICAgICAgICAgICAgICAgIDEgICAgICAgMSAgICAgICAgICAwICAgICAgIDAuMDAwMDAgICAqIFJPT1RcbiAxMiAgIFN1YnF1ZXJ5U3RhcnROb2RlICAgICAgICAgICAgIDEgICAgICAgMiAgICAgICAgICAwICAgICAgIDAuMDAwMDEgICAgIC0gTEVUIGxpc3QgPSAoIC8qIHN1YnF1ZXJ5IGJlZ2luICovXG4gIDMgICBFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZSAgICAgIDExICAgMTAwMDEgICAgICAgICAgMCAgICAgICAwLjAwMjA1ICAgICAgIC0gRk9SIGRvYyBJTiBhY29sbGVjdGlvbiAgIC8qIGZ1bGwgY29sbGVjdGlvbiBzY2FuICAqL1xuICA0ICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgICAgICAgICAxMSAgIDEwMDAxICAgICAgICAgIDAgICAgICAgMC4wMDE0OCAgICAgICAgIC0gTEVUICM1ID0gKGRvYy5gdmFsdWVgIFx1MDAzZSA5MCkgICAvKiBzaW1wbGUgZXhwcmVzc2lvbiAqLyAgIC8qIGNvbGxlY3Rpb25zIHVzZWQ6IGRvYyA6IGFjb2xsZWN0aW9uICovXG4gIDUgICBGaWx0ZXJOb2RlICAgICAgICAgICAgICAgICAgIDEwICAgIDk5MTAgICAgICAgICA5MSAgICAgICAwLjAwMTM4ICAgICAgICAgLSBGSUxURVIgIzVcbiAxMyAgIFN1YnF1ZXJ5RW5kTm9kZSAgICAgICAgICAgICAgIDEgICAgICAgMSAgICAgICAgICAwICAgICAgIDAuMDAwOTYgICAgICAgICAtIFJFVFVSTiAgZG9jICkgLyogc3VicXVlcnkgZW5kICovXG4gIDggICBFbnVtZXJhdGVMaXN0Tm9kZSAgICAgICAgICAgIDEwICAgIDk5MDkgICAgICAgICAgMCAgICAgICAwLjAwMDk5ICAgICAtIEZPUiBhIElOIGxpc3QgICAvKiBsaXN0IGl0ZXJhdGlvbiAqL1xuICA5ICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgICAgICAgICAxMCAgICA5OTA5ICAgICAgICAgIDAgICAgICAgMC4wMDE1MyAgICAgICAtIExFVCAjNyA9IChhLmB2YWx1ZWAgXHUwMDNjIDkxKSAgIC8qIHNpbXBsZSBleHByZXNzaW9uICovXG4gMTAgICBGaWx0ZXJOb2RlICAgICAgICAgICAgICAgICAgICAxICAgICAgIDAgICAgICAgOTkwOSAgICAgICAwLjAwMDM5ICAgICAgIC0gRklMVEVSICM3XG4gMTEgICBSZXR1cm5Ob2RlICAgICAgICAgICAgICAgICAgICAxICAgICAgIDAgICAgICAgICAgMCAgICAgICAwLjAwMDAxICAgICAgIC0gUkVUVVJOIGFcblxuSW5kZXhlcyB1c2VkOlxuIG5vbmVcblxuT3B0aW1pemF0aW9uIHJ1bGVzIGFwcGxpZWQ6XG4gSWQgICBSdWxlTmFtZVxuICAxICAgc3BsaWNlLXN1YnF1ZXJpZXNcblxuUXVlcnkgU3RhdGlzdGljczpcbiBXcml0ZXMgRXhlYyAgIFdyaXRlcyBJZ24gICBTY2FuIEZ1bGwgICBTY2FuIEluZGV4ICAgQ2FjaGUgSGl0cy9NaXNzZXMgICBGaWx0ZXJlZCAgIFBlYWsgTWVtIFtiXSAgIEV4ZWMgVGltZSBbc11cbiAgICAgICAgICAgMCAgICAgICAgICAgIDAgICAgICAgMTAwMDAgICAgICAgICAgICAwICAgICAgICAgICAgICAgMCAvIDAgICAgICAxMDAwMCAgICAgICAgIDcyMDg5NiAgICAgICAgIDAuMDA5MDFcblxuUXVlcnkgUHJvZmlsZTpcbiBRdWVyeSBTdGFnZSAgICAgICAgICAgICAgIER1cmF0aW9uIFtzXVxuIGluaXRpYWxpemluZyAgICAgICAgICAgICAgICAgICAwLjAwMDAwXG4gcGFyc2luZyAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDRcbiBvcHRpbWl6aW5nIGFzdCAgICAgICAgICAgICAgICAgMC4wMDAwMVxuIGxvYWRpbmcgY29sbGVjdGlvbnMgICAgICAgICAgICAwLjAwMDAwXG4gaW5zdGFudGlhdGluZyBwbGFuICAgICAgICAgICAgIDAuMDAwMDRcbiBvcHRpbWl6aW5nIHBsYW4gICAgICAgICAgICAgICAgMC4wMDAwNlxuIGluc3RhbnRpYXRpbmcgZXhlY3V0b3JzICAgICAgICAwLjAwMDA1XG4gZXhlY3V0aW5nICAgICAgICAgICAgICAgICAgICAgIDAuMDA4ODBcbiBmaW5hbGl6aW5nICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMyIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwM193b3JrV2l0aEFRTF9wcm9maWxlUXVlcnlTdWJxdWVyeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "04_workWithAQL_profileQueryAggregation_single": { + "request": "LS0tCm5hbWU6IDA0X3dvcmtXaXRoQVFMX3Byb2ZpbGVRdWVyeUFnZ3JlZ2F0aW9uCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoJ215dXNlcnMnKTsKflsiYmVybGluIiwgInBhcmlzIiwgImNvbG9nbmUiLCAibXVuaWNoIiwgImxvbmRvbiJdLmZvckVhY2goKGMpID0+IHsgWyJwZXRlciIsICJkYXZpZCIsICJzaW1vbiIsICJsYXJzIl0uZm9yRWFjaCggbiA9PiBkYi5teXVzZXJzLmluc2VydCh7IGNpdHkgOiBjLCBuYW1lIDogbiwgYWdlOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA3NSkgfSkgKSB9KTsKZGIuX3Byb2ZpbGVRdWVyeShgCiAgRk9SIHUgSU4gbXl1c2VycwogICAgQ09MTEVDVCBhZ2VHcm91cCA9IEZMT09SKHUuYWdlIC8gMTApICogMTAKICAgIEFHR1JFR0FURSBtaW5BZ2UgPSBNSU4odS5hZ2UpLCBtYXhBZ2UgPSBNQVgodS5hZ2UpLCBsZW4gPSBMRU5HVEgodSkKICAgIFJFVFVSTiB7CiAgICAgIGFnZUdyb3VwLCAKICAgICAgbWluQWdlLCAKICAgICAgbWF4QWdlLAogICAgICBsZW4KICAgIH1gLCB7fSwge2NvbG9yczogZmFsc2V9Cik7Cn5kYi5fZHJvcCgibXl1c2VycyIp", + "response": "eyJpbnB1dCI6ImRiLl9wcm9maWxlUXVlcnkoYFxuICBGT1IgdSBJTiBteXVzZXJzXG4gICAgQ09MTEVDVCBhZ2VHcm91cCA9IEZMT09SKHUuYWdlIC8gMTApICogMTBcbiAgICBBR0dSRUdBVEUgbWluQWdlID0gTUlOKHUuYWdlKSwgbWF4QWdlID0gTUFYKHUuYWdlKSwgbGVuID0gTEVOR1RIKHUpXG4gICAgUkVUVVJOIHtcbiAgICAgIGFnZUdyb3VwLCBcbiAgICAgIG1pbkFnZSwgXG4gICAgICBtYXhBZ2UsXG4gICAgICBsZW5cbiAgICB9YCwge30sIHtjb2xvcnM6IGZhbHNlfVxuKTsiLCJvdXRwdXQiOiJRdWVyeSBTdHJpbmcgKDIxMiBjaGFycywgY2FjaGVhYmxlOiBmYWxzZSk6XG4gICBGT1IgdSBJTiBteXVzZXJzXG4gICAgIENPTExFQ1QgYWdlR3JvdXAgPSBGTE9PUih1LmFnZSAvIDEwKSAqIDEwXG4gICAgIEFHR1JFR0FURSBtaW5BZ2UgPSBNSU4odS5hZ2UpLCBtYXhBZ2UgPSBNQVgodS5hZ2UpLCBsZW4gPSBMRU5HVEgodSlcbiAgICAgUkVUVVJOIHtcbiAgICAgICBhZ2VHcm91cCwgXG4gICAgICAgbWluQWdlLCBcbiAgICAgICBtYXhBZ2UsXG4gICAgICAgbGVuXG4gICAgIH1cblxuRXhlY3V0aW9uIHBsYW46XG4gSWQgICBOb2RlVHlwZSAgICAgICAgICAgICAgICAgIENhbGxzICAgSXRlbXMgICBGaWx0ZXJlZCAgIFJ1bnRpbWUgW3NdICAgQ29tbWVudFxuICAxICAgU2luZ2xldG9uTm9kZSAgICAgICAgICAgICAgICAgMSAgICAgICAxICAgICAgICAgIDAgICAgICAgMC4wMDAwMCAgICogUk9PVFxuICAyICAgRW51bWVyYXRlQ29sbGVjdGlvbk5vZGUgICAgICAgMSAgICAgIDIwICAgICAgICAgIDAgICAgICAgMC4wMDAwMyAgICAgLSBGT1IgdSBJTiBteXVzZXJzICAgLyogZnVsbCBjb2xsZWN0aW9uIHNjYW4gKHByb2plY3Rpb25zOiBgYWdlYCkgICovXG4gIDMgICBDYWxjdWxhdGlvbk5vZGUgICAgICAgICAgICAgICAxICAgICAgMjAgICAgICAgICAgMCAgICAgICAwLjAwMDAxICAgICAgIC0gTEVUICM1ID0gKEZMT09SKCh1LmBhZ2VgIC8gMTApKSAqIDEwKSAgIC8qIHNpbXBsZSBleHByZXNzaW9uICovICAgLyogY29sbGVjdGlvbnMgdXNlZDogdSA6IG15dXNlcnMgKi9cbiAgNCAgIENhbGN1bGF0aW9uTm9kZSAgICAgICAgICAgICAgIDEgICAgICAyMCAgICAgICAgICAwICAgICAgIDAuMDAwMDAgICAgICAgLSBMRVQgIzcgPSB1LmBhZ2VgICAgLyogYXR0cmlidXRlIGV4cHJlc3Npb24gKi8gICAvKiBjb2xsZWN0aW9ucyB1c2VkOiB1IDogbXl1c2VycyAqL1xuICA2ICAgQ29sbGVjdE5vZGUgICAgICAgICAgICAgICAgICAgMSAgICAgICA2ICAgICAgICAgIDAgICAgICAgMC4wMDAwMSAgICAgICAtIENPTExFQ1QgYWdlR3JvdXAgPSAjNSBBR0dSRUdBVEUgbWluQWdlID0gTUlOKCM3KSwgbWF4QWdlID0gTUFYKCM3KSwgbGVuID0gTEVOR1RIKCkgICAvKiBoYXNoICovXG4gIDkgICBTb3J0Tm9kZSAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIDYgICAgICAgICAgMCAgICAgICAwLjAwMDAyICAgICAgIC0gU09SVCBhZ2VHcm91cCBBU0MgICAvKiBzb3J0aW5nIHN0cmF0ZWd5OiBzdGFuZGFyZCAqL1xuICA3ICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgICAgICAgICAgMSAgICAgICA2ICAgICAgICAgIDAgICAgICAgMC4wMDAwMSAgICAgICAtIExFVCAjMTEgPSB7IFwiYWdlR3JvdXBcIiA6IGFnZUdyb3VwLCBcIm1pbkFnZVwiIDogbWluQWdlLCBcIm1heEFnZVwiIDogbWF4QWdlLCBcImxlblwiIDogbGVuIH0gICAvKiBzaW1wbGUgZXhwcmVzc2lvbiAqL1xuICA4ICAgUmV0dXJuTm9kZSAgICAgICAgICAgICAgICAgICAgMSAgICAgICA2ICAgICAgICAgIDAgICAgICAgMC4wMDAwMCAgICAgICAtIFJFVFVSTiAjMTFcblxuSW5kZXhlcyB1c2VkOlxuIG5vbmVcblxuT3B0aW1pemF0aW9uIHJ1bGVzIGFwcGxpZWQ6XG4gSWQgICBSdWxlTmFtZVxuICAxICAgbW92ZS1jYWxjdWxhdGlvbnMtdXBcbiAgMiAgIHJlbW92ZS1yZWR1bmRhbnQtY2FsY3VsYXRpb25zXG4gIDMgICByZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zXG4gIDQgICBtb3ZlLWNhbGN1bGF0aW9ucy11cC0yXG4gIDUgICBtb3ZlLWNhbGN1bGF0aW9ucy1kb3duXG4gIDYgICByZWR1Y2UtZXh0cmFjdGlvbi10by1wcm9qZWN0aW9uXG5cblF1ZXJ5IFN0YXRpc3RpY3M6XG4gV3JpdGVzIEV4ZWMgICBXcml0ZXMgSWduICAgU2NhbiBGdWxsICAgU2NhbiBJbmRleCAgIENhY2hlIEhpdHMvTWlzc2VzICAgRmlsdGVyZWQgICBQZWFrIE1lbSBbYl0gICBFeGVjIFRpbWUgW3NdXG4gICAgICAgICAgIDAgICAgICAgICAgICAwICAgICAgICAgIDIwICAgICAgICAgICAgMCAgICAgICAgICAgICAgIDAgLyAwICAgICAgICAgIDAgICAgICAgICAgNjU1MzYgICAgICAgICAwLjAwMDQxXG5cblF1ZXJ5IFByb2ZpbGU6XG4gUXVlcnkgU3RhZ2UgICAgICAgICAgICAgICBEdXJhdGlvbiBbc11cbiBpbml0aWFsaXppbmcgICAgICAgICAgICAgICAgICAgMC4wMDAwMFxuIHBhcnNpbmcgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA1XG4gb3B0aW1pemluZyBhc3QgICAgICAgICAgICAgICAgIDAuMDAwMDFcbiBsb2FkaW5nIGNvbGxlY3Rpb25zICAgICAgICAgICAgMC4wMDAwMFxuIGluc3RhbnRpYXRpbmcgcGxhbiAgICAgICAgICAgICAwLjAwMDAyXG4gb3B0aW1pemluZyBwbGFuICAgICAgICAgICAgICAgIDAuMDAwMThcbiBpbnN0YW50aWF0aW5nIGV4ZWN1dG9ycyAgICAgICAgMC4wMDAwNVxuIGV4ZWN1dGluZyAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEwXG4gZmluYWxpemluZyAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDRfd29ya1dpdGhBUUxfcHJvZmlsZVF1ZXJ5QWdncmVnYXRpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "04_workWithAQL_statements1_single": { + "request": "LS0tCm5hbWU6IDA0X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMxCmRlc2NyaXB0aW9uOiAnJwotLS0Kc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIHsgInF1ZXJ5IjogIkZPUiBpIElOIFsgMSwgMiBdIFJFVFVSTiBpICogMiIgfSApOw==", + "response": "eyJpbnB1dCI6InN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCB7IFwicXVlcnlcIjogXCJGT1IgaSBJTiBbIDEsIDIgXSBSRVRVUk4gaSAqIDJcIiB9ICk7Iiwib3V0cHV0IjoiW29iamVjdCBBcmFuZ29TdGF0ZW1lbnRdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA0X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements10_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMxMApkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIHsgInF1ZXJ5IjogIkZPUiBpIElOIFsgMSwgMiwgMywgNCBdIFJFVFVSTiBpIiwgImNvdW50IjogdHJ1ZSB9ICk7CnZhciBjdXJzb3IgPSBzdG10LmV4ZWN1dGUoKTsKY3Vyc29yLmNvdW50KCk7", + "response": "eyJpbnB1dCI6InZhciBjdXJzb3IgPSBzdG10LmV4ZWN1dGUoKTtcbmN1cnNvci5jb3VudCgpOyIsIm91dHB1dCI6IjQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDVfd29ya1dpdGhBUUxfc3RhdGVtZW50czEwIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements2_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMyCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCggeyAicXVlcnkiOiAiRk9SIGkgSU4gWyAxLCAyIF0gUkVUVVJOIGkgKiAyIiB9ICk7CmN1cnNvciA9IHN0bXQuZXhlY3V0ZSgpOw==", + "response": "eyJpbnB1dCI6ImN1cnNvciA9IHN0bXQuZXhlY3V0ZSgpOyIsIm91dHB1dCI6IltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiAyLCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgMiwgXG4gIDQgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements3_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMzCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCggeyAicXVlcnkiOiAiRk9SIGkgSU4gWyAxLCAyIF0gUkVUVVJOIGkgKiAyIiB9ICk7Cn52YXIgY3Vyc29yID0gc3RtdC5leGVjdXRlKCk7CmN1cnNvci50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6ImN1cnNvci50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgMiwgXG4gIDQgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements4_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM0CmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCggeyAicXVlcnkiOiAiRk9SIGkgSU4gWyAxLCAyIF0gUkVUVVJOIGkgKiAyIiB9ICk7Cn52YXIgYyA9IHN0bXQuZXhlY3V0ZSgpOwp3aGlsZSAoYy5oYXNOZXh0KCkpIHsKICByZXF1aXJlKCJAYXJhbmdvZGIiKS5wcmludChjLm5leHQoKSk7Cn0=", + "response": "eyJpbnB1dCI6IndoaWxlIChjLmhhc05leHQoKSkge1xuICByZXF1aXJlKFwiQGFyYW5nb2RiXCIpLnByaW50KGMubmV4dCgpKTtcbn0iLCJvdXRwdXQiOiIyXG40IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements5_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM1CmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCB7ICJxdWVyeSI6ICJGT1IgaSBJTiBbIEBvbmUsIEB0d28gXSBSRVRVUk4gaSAqIDIiIH0gKTsKc3RtdC5iaW5kKCJvbmUiLCAxKTsKc3RtdC5iaW5kKCJ0d28iLCAyKTsKY3Vyc29yID0gc3RtdC5leGVjdXRlKCk7", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCggeyBcInF1ZXJ5XCI6IFwiRk9SIGkgSU4gWyBAb25lLCBAdHdvIF0gUkVUVVJOIGkgKiAyXCIgfSApO1xuc3RtdC5iaW5kKFwib25lXCIsIDEpO1xuc3RtdC5iaW5kKFwidHdvXCIsIDIpO1xuY3Vyc29yID0gc3RtdC5leGVjdXRlKCk7Iiwib3V0cHV0IjoiW29iamVjdCBBcmFuZ29RdWVyeUN1cnNvciwgY291bnQ6IDIsIGNhY2hlZDogZmFsc2UsIGhhc01vcmU6IGZhbHNlXVxuXG5bIFxuICAyLCBcbiAgNCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDVfd29ya1dpdGhBUUxfc3RhdGVtZW50czUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "05_workWithAQL_statements6_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM2CmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCggeyAicXVlcnkiOiAiRk9SIGkgSU4gWyBAb25lLCBAdHdvIF0gUkVUVVJOIGkgKiAyIiB9ICk7Cn5zdG10LmJpbmQoIm9uZSIsIDEpOwp+c3RtdC5iaW5kKCJ0d28iLCAyKTsKfnZhciBjdXJzb3IgPSBzdG10LmV4ZWN1dGUoKTsKY3Vyc29yLnRvQXJyYXkoKTs=", + "response": "eyJpbnB1dCI6ImN1cnNvci50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgMiwgXG4gIDQgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM2IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements7_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM3CmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCggeyAicXVlcnkiOiAiRk9SIGkgSU4gWyBAb25lLCBAdHdvIF0gUkVUVVJOIGkgKiAyIiB9ICk7Cn5zdG10LmJpbmQoIm9uZSIsIDEpOwp+c3RtdC5iaW5kKCJ0d28iLCAyKTsKfnZhciBjdXJzb3IgPSBzdG10LmV4ZWN1dGUoKTsKd2hpbGUgKGN1cnNvci5oYXNOZXh0KCkpIHsKICByZXF1aXJlKCJAYXJhbmdvZGIiKS5wcmludChjdXJzb3IubmV4dCgpKTsKfQ==", + "response": "eyJpbnB1dCI6IndoaWxlIChjdXJzb3IuaGFzTmV4dCgpKSB7XG4gIHJlcXVpcmUoXCJAYXJhbmdvZGJcIikucHJpbnQoY3Vyc29yLm5leHQoKSk7XG59Iiwib3V0cHV0IjoiMlxuNCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwNV93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzNyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "05_workWithAQL_statements8_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM4CmRlc2NyaXB0aW9uOiAnJwotLS0Kc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoeyAKICAicXVlcnkiOiAiRk9SIGkgSU4gWyBAb25lLCBAdHdvIF0gUkVUVVJOIGkgKiAyIiwgCiAgImJpbmRWYXJzIjogeyAKICAgICJvbmUiOiAxLCAKICAgICJ0d28iOiAyIAogIH0gCn0pOw==", + "response": "eyJpbnB1dCI6InN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KHsgXG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiBbIEBvbmUsIEB0d28gXSBSRVRVUk4gaSAqIDJcIiwgXG4gIFwiYmluZFZhcnNcIjogeyBcbiAgICBcIm9uZVwiOiAxLCBcbiAgICBcInR3b1wiOiAyIFxuICB9IFxufSk7Iiwib3V0cHV0IjoiW29iamVjdCBBcmFuZ29TdGF0ZW1lbnRdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "05_workWithAQL_statements9_single": { + "request": "LS0tCm5hbWU6IDA1X3dvcmtXaXRoQVFMX3N0YXRlbWVudHM5CmRlc2NyaXB0aW9uOiAnJwotLS0Kc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIHsKICAicXVlcnkiOiAiRk9SIGkgSU4gWyAxLCAyLCAzLCA0IF0gUkVUVVJOIGkiLAogICJjb3VudCI6IHRydWUgfSApOw==", + "response": "eyJpbnB1dCI6InN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCB7XG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiBbIDEsIDIsIDMsIDQgXSBSRVRVUk4gaVwiLFxuICBcImNvdW50XCI6IHRydWUgfSApOyIsIm91dHB1dCI6IltvYmplY3QgQXJhbmdvU3RhdGVtZW50XSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwNV93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzOSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "06_workWithAQL_statements11_single": { + "request": "LS0tCm5hbWU6IDA2X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMxMQpkZXNjcmlwdGlvbjogJycKLS0tCnN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KHsKICBxdWVyeTogIkZPUiBpIElOIFsgMSwgMiwgMywgNCBdIFJFVFVSTiBpIiwKICBvcHRpb25zOiB7InByb2ZpbGUiOiB0cnVlfX0pOw==", + "response": "eyJpbnB1dCI6InN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KHtcbiAgcXVlcnk6IFwiRk9SIGkgSU4gWyAxLCAyLCAzLCA0IF0gUkVUVVJOIGlcIixcbiAgb3B0aW9uczoge1wicHJvZmlsZVwiOiB0cnVlfX0pOyIsIm91dHB1dCI6IltvYmplY3QgQXJhbmdvU3RhdGVtZW50XSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwNl93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzMTEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "06_workWithAQL_statements12_single": { + "request": "LS0tCm5hbWU6IDA2X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMxMgpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIHsgInF1ZXJ5IjogIkZPUiBpIElOIFsgMSwgMiwgMywgNCBdIFJFVFVSTiBpIiwgb3B0aW9uczogeyJwcm9maWxlIjogdHJ1ZX19ICk7CnZhciBjdXJzb3IgPSBzdG10LmV4ZWN1dGUoKTsKY3Vyc29yLmdldEV4dHJhKCk7", + "response": "eyJpbnB1dCI6InZhciBjdXJzb3IgPSBzdG10LmV4ZWN1dGUoKTtcbmN1cnNvci5nZXRFeHRyYSgpOyIsIm91dHB1dCI6InsgXG4gIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gIFwic3RhdHNcIiA6IHsgXG4gICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMCwgXG4gICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAwLCBcbiAgICBcInNjYW5uZWRGdWxsXCIgOiAwLCBcbiAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMCwgXG4gICAgXCJjdXJzb3JzUmVhcm1lZFwiIDogMCwgXG4gICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMDkwMzE3OTk5OTkwOTI5ODIsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gIH0sIFxuICBcInByb2ZpbGVcIiA6IHsgXG4gICAgXCJpbml0aWFsaXppbmdcIiA6IDAuMDAwMDA3OTM5OTk5OTg5MDQ4Mzc0LCBcbiAgICBcInBhcnNpbmdcIiA6IDAuMDAwMDE1NTI1OTk5OTk4NTQ0NjUsIFxuICAgIFwib3B0aW1pemluZyBhc3RcIiA6IDAuMDAwMDAxNjQzMDAwMDE4NzAyODc4MiwgXG4gICAgXCJsb2FkaW5nIGNvbGxlY3Rpb25zXCIgOiAwLjAwMDAwNDU1Njk5OTk4MjY5NjY1MiwgXG4gICAgXCJpbnN0YW50aWF0aW5nIHBsYW5cIiA6IDAuMDAwMDA5MjE1OTk5OTk1MTQ5MTA1LCBcbiAgICBcIm9wdGltaXppbmcgcGxhblwiIDogMC4wMDAwMTY1NDE5OTk5OTczNDM3MzcsIFxuICAgIFwiaW5zdGFudGlhdGluZyBleGVjdXRvcnNcIiA6IDAuMDAwMDE3MjE2MDAwMDAzMzcyNzU2LCBcbiAgICBcImV4ZWN1dGluZ1wiIDogMC4wMDAwMTU2OTUwMDAwMDE4Njk2MywgXG4gICAgXCJmaW5hbGl6aW5nXCIgOiAwLjAwMDAwNzg2NTAwMDAxNDgxNzI3IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwNl93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzMTIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "06_workWithAQL_statements13_single": { + "request": "LS0tCm5hbWU6IDA2X3dvcmtXaXRoQVFMX3N0YXRlbWVudHMxMwpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9wYXJzZSggIkZPUiBpIElOIFsgMSwgMiBdIFJFVFVSTiBpIiApOw==", + "response": "eyJpbnB1dCI6ImRiLl9wYXJzZSggXCJGT1IgaSBJTiBbIDEsIDIgXSBSRVRVUk4gaVwiICk7Iiwib3V0cHV0IjoieyBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInBhcnNlZFwiIDogdHJ1ZSwgXG4gIFwiY29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gIFwiYmluZFZhcnNcIiA6IFsgXSwgXG4gIFwiYXN0XCIgOiBbIFxuICAgIHsgXG4gICAgICBcInR5cGVcIiA6IFwicm9vdFwiLCBcbiAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcImZvclwiLCBcbiAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhcmlhYmxlXCIsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImFycmF5XCIsIFxuICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgICAgICBcInZhbHVlXCIgOiAxIFxuICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgICAgICBcInZhbHVlXCIgOiAyIFxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJuby1vcFwiIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwicmV0dXJuXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIF0gXG4gICAgfSBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDZfd29ya1dpdGhBUUxfc3RhdGVtZW50czEzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "06_workWithAQL_statementsExtra_single": { + "request": "LS0tCm5hbWU6IDA2X3dvcmtXaXRoQVFMX3N0YXRlbWVudHNFeHRyYQpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9xdWVyeShgCiAgRk9SIGkgSU4gMS4uQGNvdW50CiAgICBJTlNFUlQgeyBfa2V5OiBDT05DQVQoJ2Fub3RoZXJ0ZXN0JywgVE9fU1RSSU5HKGkpKSB9IElOVE8gbXljb2xsZWN0aW9uYCwKIHsgY291bnQ6IDEwMCB9LAoge30sCiB7IGZ1bGxDb3VudDogdHJ1ZSB9CikuZ2V0RXh0cmEoKTsKCmRiLl9xdWVyeSh7CiAgInF1ZXJ5IjogYAogICAgRk9SIGkgSU4gMjAwLi5AY291bnQKICAgICAgSU5TRVJUIHsgX2tleTogQ09OQ0FUKCdhbm90aGVydGVzdCcsIFRPX1NUUklORyhpKSkgfSBJTlRPIG15Y29sbGVjdGlvbmAsCiAgImJpbmRWYXJzIjogeyBjb3VudDogMzAwIH0sCiAgIm9wdGlvbnMiOiB7IGZ1bGxDb3VudDogdHJ1ZSB9Cn0pLmdldEV4dHJhKCk7", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgXG4gIEZPUiBpIElOIDEuLkBjb3VudFxuICAgIElOU0VSVCB7IF9rZXk6IENPTkNBVCgnYW5vdGhlcnRlc3QnLCBUT19TVFJJTkcoaSkpIH0gSU5UTyBteWNvbGxlY3Rpb25gLFxuIHsgY291bnQ6IDEwMCB9LFxuIHt9LFxuIHsgZnVsbENvdW50OiB0cnVlIH1cbikuZ2V0RXh0cmEoKTtcblxuZGIuX3F1ZXJ5KHtcbiAgXCJxdWVyeVwiOiBgXG4gICAgRk9SIGkgSU4gMjAwLi5AY291bnRcbiAgICAgIElOU0VSVCB7IF9rZXk6IENPTkNBVCgnYW5vdGhlcnRlc3QnLCBUT19TVFJJTkcoaSkpIH0gSU5UTyBteWNvbGxlY3Rpb25gLFxuICBcImJpbmRWYXJzXCI6IHsgY291bnQ6IDMwMCB9LFxuICBcIm9wdGlvbnNcIjogeyBmdWxsQ291bnQ6IHRydWUgfVxufSkuZ2V0RXh0cmEoKTsiLCJvdXRwdXQiOiJbQXJhbmdvQ29sbGVjdGlvbiA2MTM1MywgXCJteWNvbGxlY3Rpb25cIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldXG5cbnsgXG4gIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gIFwic3RhdHNcIiA6IHsgXG4gICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMTAwLCBcbiAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDAsIFxuICAgIFwic2Nhbm5lZEluZGV4XCIgOiAwLCBcbiAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgIFwiZnVsbENvdW50XCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwNjg0MjY5MDAwMDA0MTc4NSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDMyNzY4LCBcbiAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gIH0gXG59XG5cbnsgXG4gIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gIFwic3RhdHNcIiA6IHsgXG4gICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMTAxLCBcbiAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDAsIFxuICAgIFwic2Nhbm5lZEluZGV4XCIgOiAwLCBcbiAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgIFwiZnVsbENvdW50XCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwNjk1OTg0MDAwMDAzNTkxMSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDMyNzY4LCBcbiAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjA2X3dvcmtXaXRoQVFMX3N0YXRlbWVudHNFeHRyYSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "07_workWithAQL_statementsExplain_single": { + "request": "LS0tCm5hbWU6IDA3X3dvcmtXaXRoQVFMX3N0YXRlbWVudHNFeHBsYWluCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgdXNlciBJTiBfdXNlcnMgUkVUVVJOIHVzZXIiKTsKc3RtdC5leHBsYWluKCk7", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudChcIkZPUiB1c2VyIElOIF91c2VycyBSRVRVUk4gdXNlclwiKTtcbnN0bXQuZXhwbGFpbigpOyIsIm91dHB1dCI6InsgXG4gIFwicGxhblwiIDogeyBcbiAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiRW51bWVyYXRlQ29sbGVjdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDEgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAzLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgXCJyYW5kb21cIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpbmRleEhpbnRcIiA6IHsgXG4gICAgICAgICAgXCJmb3JjZWRcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImxvb2thaGVhZFwiIDogMSwgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIm5vbmVcIiBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInVzZXJcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiB0cnVlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJwcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJmaWx0ZXJQcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJjb3VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInByb2R1Y2VzUmVzdWx0XCIgOiB0cnVlLCBcbiAgICAgICAgXCJyZWFkT3duV3JpdGVzXCIgOiBmYWxzZSwgXG4gICAgICAgIFwidXNlQ2FjaGVcIiA6IHRydWUsIFxuICAgICAgICBcIm1heFByb2plY3Rpb25zXCIgOiA1LCBcbiAgICAgICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwiX3VzZXJzXCIsIFxuICAgICAgICBcInNhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICBcImlzU2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaXNTYXRlbGxpdGVPZlwiIDogbnVsbCBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlJldHVybk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDIgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAzLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJ1c2VyXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY291bnRcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwicnVsZXNcIiA6IFsgXSwgXG4gICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwibmFtZVwiIDogXCJfdXNlcnNcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJyZWFkXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwidmFyaWFibGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJ1c2VyXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNCwgXG4gICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQ0LCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogMCwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTI4NzI5MDAwMDEwNzA3NzUgXG4gIH0sIFxuICBcImNhY2hlYWJsZVwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMDdfd29ya1dpdGhBUUxfc3RhdGVtZW50c0V4cGxhaW4iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "08_workWithAQL_statementsPlans_single": { + "request": "LS0tCm5hbWU6IDA4X3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFucwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBmb3JtYXRQbGFuID0gZnVuY3Rpb24gKHBsYW4pIHsKICByZXR1cm4geyBlc3RpbWF0ZWRDb3N0OiBwbGFuLmVzdGltYXRlZENvc3QsCiAgICBub2RlczogcGxhbi5ub2Rlcy5tYXAoZnVuY3Rpb24obm9kZSkgewogICAgICByZXR1cm4gbm9kZS50eXBlOyB9KSB9OyB9Owpmb3JtYXRQbGFuKHN0bXQuZXhwbGFpbigpLnBsYW4pOw==", + "response": "eyJpbnB1dCI6InZhciBmb3JtYXRQbGFuID0gZnVuY3Rpb24gKHBsYW4pIHtcbiAgcmV0dXJuIHsgZXN0aW1hdGVkQ29zdDogcGxhbi5lc3RpbWF0ZWRDb3N0LFxuICAgIG5vZGVzOiBwbGFuLm5vZGVzLm1hcChmdW5jdGlvbihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlOyB9KSB9OyB9O1xuZm9ybWF0UGxhbihzdG10LmV4cGxhaW4oKS5wbGFuKTsiLCJvdXRwdXQiOiJ7IFxuICBcImVzdGltYXRlZENvc3RcIiA6IDQsIFxuICBcIm5vZGVzXCIgOiBbIFxuICAgIFwiU2luZ2xldG9uTm9kZVwiLCBcbiAgICBcIkVudW1lcmF0ZUNvbGxlY3Rpb25Ob2RlXCIsIFxuICAgIFwiUmV0dXJuTm9kZVwiIFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwOF93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzUGxhbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "09_workWithAQL_statementsPlansBind_single": { + "request": "LS0tCm5hbWU6IDA5X3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFuc0JpbmQKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoCiAgYEZPUiBkb2MgSU4gQEBjb2xsZWN0aW9uIEZJTFRFUiBkb2MudXNlciA9PSBAdXNlciBSRVRVUk4gZG9jYAopOwpzdG10LmJpbmQoeyAiQGNvbGxlY3Rpb24iIDogIl91c2VycyIsICJ1c2VyIiA6ICJyb290IiB9KTsKc3RtdC5leHBsYWluKCk7", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudChcbiAgYEZPUiBkb2MgSU4gQEBjb2xsZWN0aW9uIEZJTFRFUiBkb2MudXNlciA9PSBAdXNlciBSRVRVUk4gZG9jYFxuKTtcbnN0bXQuYmluZCh7IFwiQGNvbGxlY3Rpb25cIiA6IFwiX3VzZXJzXCIsIFwidXNlclwiIDogXCJyb290XCIgfSk7XG5zdG10LmV4cGxhaW4oKTsiLCJvdXRwdXQiOiJ7IFxuICBcInBsYW5cIiA6IHsgXG4gICAgXCJub2Rlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJTaW5nbGV0b25Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBdLCBcbiAgICAgICAgXCJpZFwiIDogMSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMSwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkluZGV4Tm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgMSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDYsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDIuMDQ0NzUsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEsIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJkb2NcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiB0cnVlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJwcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJmaWx0ZXJQcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJjb3VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInByb2R1Y2VzUmVzdWx0XCIgOiB0cnVlLCBcbiAgICAgICAgXCJyZWFkT3duV3JpdGVzXCIgOiBmYWxzZSwgXG4gICAgICAgIFwidXNlQ2FjaGVcIiA6IHRydWUsIFxuICAgICAgICBcIm1heFByb2plY3Rpb25zXCIgOiA1LCBcbiAgICAgICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwiX3VzZXJzXCIsIFxuICAgICAgICBcInNhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICBcImlzU2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaXNTYXRlbGxpdGVPZlwiIDogbnVsbCwgXG4gICAgICAgIFwibmVlZHNHYXRoZXJOb2RlU29ydFwiIDogZmFsc2UsIFxuICAgICAgICBcImluZGV4Q292ZXJzUHJvamVjdGlvbnNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpbmRleGVzXCIgOiBbIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcImlkXCIgOiBcIjQzXCIsIFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImhhc2hcIiwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYwOTk0MDY2NzU5NjhcIiwgXG4gICAgICAgICAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgICAgICAgICAgXCJ1c2VyXCIgXG4gICAgICAgICAgICBdLCBcbiAgICAgICAgICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgICAgICAgICBcInVuaXF1ZVwiIDogdHJ1ZSwgXG4gICAgICAgICAgICBcInNwYXJzZVwiIDogdHJ1ZSwgXG4gICAgICAgICAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICAgICAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgICAgICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSBcbiAgICAgICAgICB9IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJjb25kaXRpb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIm4tYXJ5IG9yXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiA2MywgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJuLWFyeSBhbmRcIiwgXG4gICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA2MiwgXG4gICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJjb21wYXJlID09XCIsIFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDI1LCBcbiAgICAgICAgICAgICAgICAgIFwiZXhjbHVkZXNOdWxsXCIgOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcInVzZXJcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJkb2NcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDAsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IFwicm9vdFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICBcInZUeXBlSURcIiA6IDQgXG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICBcImFsbENvdmVyZWRCeU9uZUluZGV4XCIgOiBmYWxzZSwgXG4gICAgICAgIFwic29ydGVkXCIgOiB0cnVlLCBcbiAgICAgICAgXCJhc2NlbmRpbmdcIiA6IHRydWUsIFxuICAgICAgICBcInJldmVyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJldmFsRkNhbGxzXCIgOiB0cnVlLCBcbiAgICAgICAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICAgICAgICBcImxpbWl0XCIgOiAwLCBcbiAgICAgICAgXCJsb29rYWhlYWRcIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA2IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMy4wNDQ3NSwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiAwLCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiZG9jXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY291bnRcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwicnVsZXNcIiA6IFsgXG4gICAgICBcInVzZS1pbmRleGVzXCIsIFxuICAgICAgXCJyZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcIiwgXG4gICAgICBcInJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnMtMlwiIFxuICAgIF0sIFxuICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIm5hbWVcIiA6IFwiX3VzZXJzXCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwicmVhZFwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZhcmlhYmxlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiMVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJkb2NcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAzLjA0NDc1LCBcbiAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEsIFxuICAgIFwiaXNNb2RpZmljYXRpb25RdWVyeVwiIDogZmFsc2UgXG4gIH0sIFxuICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwicnVsZXNFeGVjdXRlZFwiIDogNDQsIFxuICAgIFwicnVsZXNTa2lwcGVkXCIgOiAwLCBcbiAgICBcInBsYW5zQ3JlYXRlZFwiIDogMSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMjE4MTQwMDAwMTA1NDQ5OSBcbiAgfSwgXG4gIFwiY2FjaGVhYmxlXCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIwOV93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzUGxhbnNCaW5kIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "10_workWithAQL_debugging1_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX2RlYnVnZ2luZzEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgcXVlcnkgPSAiRk9SIGRvYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSA+IDQyIFJFVFVSTiBkb2MiOwpyZXF1aXJlKCJAYXJhbmdvZGIvYXFsL2V4cGxhaW5lciIpLmRlYnVnRHVtcCgiL3RtcC9xdWVyeS1kZWJ1Zy1pbmZvIiwgcXVlcnkpOw==", + "response": "eyJpbnB1dCI6InZhciBxdWVyeSA9IFwiRk9SIGRvYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSBcdTAwM2UgNDIgUkVUVVJOIGRvY1wiO1xucmVxdWlyZShcIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyXCIpLmRlYnVnRHVtcChcIi90bXAvcXVlcnktZGVidWctaW5mb1wiLCBxdWVyeSk7Iiwib3V0cHV0IjoiMjAyNS0wNS0yM1QxODoxNToyMFogWzE0MzZdIElORk8gWzk5ZDgwXSB7Z2VuZXJhbH0gc3RvcmVkIHF1ZXJ5IGRlYnVnIGluZm9ybWF0aW9uIGluIGZpbGUgJy90bXAvcXVlcnktZGVidWctaW5mbyciLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMTBfd29ya1dpdGhBUUxfZGVidWdnaW5nMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "10_workWithAQL_debugging2_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX2RlYnVnZ2luZzIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgcXVlcnkgPSAiRk9SIGRvYyBJTiBAQGNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSA+IEB2YWx1ZSBSRVRVUk4gZG9jIjsKdmFyIGJpbmRWYXJzID0geyB2YWx1ZTogNDIsICJAY29sbGVjdGlvbiI6ICJteWNvbGxlY3Rpb24iIH07CnJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyIikuZGVidWdEdW1wKCIvdG1wL3F1ZXJ5LWRlYnVnLWluZm8iLCBxdWVyeSwgYmluZFZhcnMpOw==", + "response": "eyJpbnB1dCI6InZhciBxdWVyeSA9IFwiRk9SIGRvYyBJTiBAQGNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSBcdTAwM2UgQHZhbHVlIFJFVFVSTiBkb2NcIjtcbnZhciBiaW5kVmFycyA9IHsgdmFsdWU6IDQyLCBcIkBjb2xsZWN0aW9uXCI6IFwibXljb2xsZWN0aW9uXCIgfTtcbnJlcXVpcmUoXCJAYXJhbmdvZGIvYXFsL2V4cGxhaW5lclwiKS5kZWJ1Z0R1bXAoXCIvdG1wL3F1ZXJ5LWRlYnVnLWluZm9cIiwgcXVlcnksIGJpbmRWYXJzKTsiLCJvdXRwdXQiOiIyMDI1LTA1LTIzVDE4OjE1OjIwWiBbMTQzNl0gSU5GTyBbOTlkODBdIHtnZW5lcmFsfSBzdG9yZWQgcXVlcnkgZGVidWcgaW5mb3JtYXRpb24gaW4gZmlsZSAnL3RtcC9xdWVyeS1kZWJ1Zy1pbmZvJyIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIxMF93b3JrV2l0aEFRTF9kZWJ1Z2dpbmcyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "10_workWithAQL_debugging3_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX2RlYnVnZ2luZzMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgcXVlcnkgPSAiRk9SIGRvYyBJTiBAQGNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSA+IEB2YWx1ZSBSRVRVUk4gZG9jIjsKdmFyIGJpbmQgPSB7IHZhbHVlOiA0MiwgIkBjb2xsZWN0aW9uIjogIm15Y29sbGVjdGlvbiIgfTsKdmFyIG9wdGlvbnMgPSB7IGV4YW1wbGVzOiAxMCwgYW5vbnltaXplOiB0cnVlIH07CnJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyIikuZGVidWdEdW1wKCIvdG1wL3F1ZXJ5LWRlYnVnLWluZm8iLCBxdWVyeSwgYmluZCwgb3B0aW9ucyk7", + "response": "eyJpbnB1dCI6InZhciBxdWVyeSA9IFwiRk9SIGRvYyBJTiBAQGNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSBcdTAwM2UgQHZhbHVlIFJFVFVSTiBkb2NcIjtcbnZhciBiaW5kID0geyB2YWx1ZTogNDIsIFwiQGNvbGxlY3Rpb25cIjogXCJteWNvbGxlY3Rpb25cIiB9O1xudmFyIG9wdGlvbnMgPSB7IGV4YW1wbGVzOiAxMCwgYW5vbnltaXplOiB0cnVlIH07XG5yZXF1aXJlKFwiQGFyYW5nb2RiL2FxbC9leHBsYWluZXJcIikuZGVidWdEdW1wKFwiL3RtcC9xdWVyeS1kZWJ1Zy1pbmZvXCIsIHF1ZXJ5LCBiaW5kLCBvcHRpb25zKTsiLCJvdXRwdXQiOiIyMDI1LTA1LTIzVDE4OjE1OjIwWiBbMTQzNl0gSU5GTyBbOTlkODBdIHtnZW5lcmFsfSBzdG9yZWQgcXVlcnkgZGVidWcgaW5mb3JtYXRpb24gaW4gZmlsZSAnL3RtcC9xdWVyeS1kZWJ1Zy1pbmZvJyIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIxMF93b3JrV2l0aEFRTF9kZWJ1Z2dpbmczIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "10_workWithAQL_statementsPlansOptimizer0_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFuc09wdGltaXplcjAKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoCiAgIkZPUiB1c2VyIElOIF91c2VycyBGSUxURVIgdXNlci51c2VyID09ICdyb290JyBSRVRVUk4gdXNlciIpOwpzdG10LmV4cGxhaW4oeyBhbGxQbGFuczogdHJ1ZSB9KS5wbGFucy5sZW5ndGg7", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudChcbiAgXCJGT1IgdXNlciBJTiBfdXNlcnMgRklMVEVSIHVzZXIudXNlciA9PSAncm9vdCcgUkVUVVJOIHVzZXJcIik7XG5zdG10LmV4cGxhaW4oeyBhbGxQbGFuczogdHJ1ZSB9KS5wbGFucy5sZW5ndGg7Iiwib3V0cHV0IjoiMSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIxMF93b3JrV2l0aEFRTF9zdGF0ZW1lbnRzUGxhbnNPcHRpbWl6ZXIwIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "10_workWithAQL_statementsPlansOptimizer1_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFuc09wdGltaXplcjEKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgdXNlciBJTiBfdXNlcnMgRklMVEVSIHVzZXIudXNlciA9PSAncm9vdCcgUkVUVVJOIHVzZXIiKTsKc3RtdC5leHBsYWluKHsgYWxsUGxhbnM6IHRydWUgfSkucGxhbnMubWFwKAogIGZ1bmN0aW9uKHBsYW4pIHsgcmV0dXJuIGZvcm1hdFBsYW4ocGxhbik7IH0pOw==", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IGFsbFBsYW5zOiB0cnVlIH0pLnBsYW5zLm1hcChcbiAgZnVuY3Rpb24ocGxhbikgeyByZXR1cm4gZm9ybWF0UGxhbihwbGFuKTsgfSk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImVzdGltYXRlZENvc3RcIiA6IDMuMDQ0NzUsIFxuICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICBcIkluZGV4Tm9kZVwiLCBcbiAgICAgIFwiUmV0dXJuTm9kZVwiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IjEwX3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFuc09wdGltaXplcjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "10_workWithAQL_statementsPlansOptimizer2_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFuc09wdGltaXplcjIKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgdXNlciBJTiBfdXNlcnMgRklMVEVSIHVzZXIudXNlciA9PSAncm9vdCcgUkVUVVJOIHVzZXIiKTsKc3RtdC5leHBsYWluKHsgb3B0aW1pemVyOiB7CiAgcnVsZXM6IFsgIi1hbGwiLCAiK3JlbW92ZS1yZWR1bmRhbnQtY2FsY3VsYXRpb25zIiBdIH0gfSk7", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IG9wdGltaXplcjoge1xuICBydWxlczogWyBcIi1hbGxcIiwgXCIrcmVtb3ZlLXJlZHVuZGFudC1jYWxjdWxhdGlvbnNcIiBdIH0gfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJwbGFuXCIgOiB7IFxuICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiU2luZ2xldG9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXSwgXG4gICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgMSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDMsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEsIFxuICAgICAgICBcInJhbmRvbVwiIDogZmFsc2UsIFxuICAgICAgICBcImluZGV4SGludFwiIDogeyBcbiAgICAgICAgICBcImZvcmNlZFwiIDogZmFsc2UsIFxuICAgICAgICAgIFwibG9va2FoZWFkXCIgOiAxLCBcbiAgICAgICAgICBcInR5cGVcIiA6IFwibm9uZVwiIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiAwLCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwidXNlclwiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICAgIH0sIFxuICAgICAgICBcInByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICBcImZpbHRlclByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICBcImNvdW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwicHJvZHVjZXNSZXN1bHRcIiA6IHRydWUsIFxuICAgICAgICBcInJlYWRPd25Xcml0ZXNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJ1c2VDYWNoZVwiIDogdHJ1ZSwgXG4gICAgICAgIFwibWF4UHJvamVjdGlvbnNcIiA6IDUsIFxuICAgICAgICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJfdXNlcnNcIiwgXG4gICAgICAgIFwic2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaXNTYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZU9mXCIgOiBudWxsIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiQ2FsY3VsYXRpb25Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAyIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogMywgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNCwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiY29tcGFyZSA9PVwiLCBcbiAgICAgICAgICBcInR5cGVJRFwiIDogMjUsIFxuICAgICAgICAgIFwiZXhjbHVkZXNOdWxsXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwidXNlclwiLCBcbiAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwidXNlclwiLCBcbiAgICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDAsIFxuICAgICAgICAgICAgICBcInZhbHVlXCIgOiBcInJvb3RcIiwgXG4gICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogNCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJzaW1wbGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkZpbHRlck5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDMgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA1LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIxXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA0IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNiwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiAwLCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwidXNlclwiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInJ1bGVzXCIgOiBbIF0sIFxuICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIm5hbWVcIiA6IFwiX3VzZXJzXCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwicmVhZFwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZhcmlhYmxlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiMVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJ1c2VyXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNiwgXG4gICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQsIFxuICAgIFwicnVsZXNTa2lwcGVkXCIgOiA0MCwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMDgwMDMwOTk5OTgxNzcyNzcgXG4gIH0sIFxuICBcImNhY2hlYWJsZVwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMTBfd29ya1dpdGhBUUxfc3RhdGVtZW50c1BsYW5zT3B0aW1pemVyMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "10_workWithAQL_statementsPlansOptimizer3_single": { + "request": "LS0tCm5hbWU6IDEwX3dvcmtXaXRoQVFMX3N0YXRlbWVudHNQbGFuc09wdGltaXplcjMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgcXVlcnkgPSAiRk9SIGRvYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSA+IDQyIFJFVFVSTiBkb2MiOwpyZXF1aXJlKCJAYXJhbmdvZGIvYXFsL2V4cGxhaW5lciIpLmV4cGxhaW4ocXVlcnksIHtjb2xvcnM6ZmFsc2V9KTs=", + "response": "eyJpbnB1dCI6InZhciBxdWVyeSA9IFwiRk9SIGRvYyBJTiBteWNvbGxlY3Rpb24gRklMVEVSIGRvYy52YWx1ZSBcdTAwM2UgNDIgUkVUVVJOIGRvY1wiO1xucmVxdWlyZShcIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyXCIpLmV4cGxhaW4ocXVlcnksIHtjb2xvcnM6ZmFsc2V9KTsiLCJvdXRwdXQiOiJRdWVyeSBTdHJpbmcgKDU2IGNoYXJzLCBjYWNoZWFibGU6IHRydWUpOlxuIEZPUiBkb2MgSU4gbXljb2xsZWN0aW9uIEZJTFRFUiBkb2MudmFsdWUgXHUwMDNlIDQyIFJFVFVSTiBkb2NcblxuRXhlY3V0aW9uIHBsYW46XG4gSWQgICBOb2RlVHlwZSAgICAgICAgICAgICAgICAgIEVzdC4gICBDb21tZW50XG4gIDEgICBTaW5nbGV0b25Ob2RlICAgICAgICAgICAgICAgIDEgICAqIFJPT1RcbiAgMiAgIEVudW1lcmF0ZUNvbGxlY3Rpb25Ob2RlICAgICAgMCAgICAgLSBGT1IgZG9jIElOIG15Y29sbGVjdGlvbiAgIC8qIGZ1bGwgY29sbGVjdGlvbiBzY2FuICAqLyAgIEZJTFRFUiAoZG9jLmB2YWx1ZWAgXHUwMDNlIDQyKSAgIC8qIGVhcmx5IHBydW5pbmcgKi9cbiAgNSAgIFJldHVybk5vZGUgICAgICAgICAgICAgICAgICAgMCAgICAgICAtIFJFVFVSTiBkb2NcblxuSW5kZXhlcyB1c2VkOlxuIG5vbmVcblxuT3B0aW1pemF0aW9uIHJ1bGVzIGFwcGxpZWQ6XG4gSWQgICBSdWxlTmFtZVxuICAxICAgbW92ZS1maWx0ZXJzLWludG8tZW51bWVyYXRlXG5cbjQ0IHJ1bGUocykgZXhlY3V0ZWQsIDEgcGxhbihzKSBjcmVhdGVkLCBwZWFrIG1lbSBbYl06IDAsIGV4ZWMgdGltZSBbc106IDAuMDAwMDkiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiMTBfd29ya1dpdGhBUUxfc3RhdGVtZW50c1BsYW5zT3B0aW1pemVyMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "11_workWithAQL_parseQueries_single": { + "request": "LS0tCm5hbWU6IDExX3dvcmtXaXRoQVFMX3BhcnNlUXVlcmllcwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCgKICAiRk9SIGRvYyBJTiBAQGNvbGxlY3Rpb24gRklMVEVSIGRvYy5mb28gPT0gQGJhciBSRVRVUk4gZG9jIik7CnN0bXQucGFyc2UoKTsKfnJlbW92ZUlnbm9yZUNvbGxlY3Rpb24oIm15Y29sbGVjdGlvbiIpCn5kYi5fZHJvcCgibXljb2xsZWN0aW9uIik=", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudChcbiAgXCJGT1IgZG9jIElOIEBAY29sbGVjdGlvbiBGSUxURVIgZG9jLmZvbyA9PSBAYmFyIFJFVFVSTiBkb2NcIik7XG5zdG10LnBhcnNlKCk7Iiwib3V0cHV0IjoieyBcbiAgXCJiaW5kVmFyc1wiIDogWyBcbiAgICBcImJhclwiLCBcbiAgICBcIkBjb2xsZWN0aW9uXCIgXG4gIF0sIFxuICBcImNvbGxlY3Rpb25zXCIgOiBbIF0sIFxuICBcImFzdFwiIDogWyBcbiAgICB7IFxuICAgICAgXCJ0eXBlXCIgOiBcInJvb3RcIiwgXG4gICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJmb3JcIiwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YXJpYWJsZVwiLCBcbiAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImRvY1wiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImRhdGFzb3VyY2UgcGFyYW1ldGVyXCIsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiQGNvbGxlY3Rpb25cIiBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcIm5vLW9wXCIgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJmaWx0ZXJcIiwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJjb21wYXJlID09XCIsIFxuICAgICAgICAgICAgICBcImV4Y2x1ZGVzTnVsbFwiIDogZmFsc2UsIFxuICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJmb29cIiwgXG4gICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImRvY1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInBhcmFtZXRlclwiLCBcbiAgICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJiYXJcIiBcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwicmV0dXJuXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiZG9jXCIsIFxuICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9IFxuICAgICAgXSBcbiAgICB9IFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiIxMV93b3JrV2l0aEFRTF9wYXJzZVF1ZXJpZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "AQLEXP_01_axplainer_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wMV9heHBsYWluZXIKZGVzY3JpcHRpb246ICcnCi0tLQp+YWRkSWdub3JlQ29sbGVjdGlvbigidGVzdCIpCn5kYi5fZHJvcCgidGVzdCIpOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInRlc3QiKTsKZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7IGRiLnRlc3Quc2F2ZSh7IHZhbHVlOiBpIH0pOyB9CnZhciBpZHggPSBkYi50ZXN0LmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsgInZhbHVlIiBdIH0pOwp2YXIgZXhwbGFpbiA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyIikuZXhwbGFpbjsKZXhwbGFpbigiRk9SIGkgSU4gdGVzdCBGSUxURVIgaS52YWx1ZSA+IDk3IFNPUlQgaS52YWx1ZSBSRVRVUk4gaS52YWx1ZSIsIHtjb2xvcnM6ZmFsc2V9KTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInRlc3RcIik7XG5mb3IgKGkgPSAwOyBpIFx1MDAzYyAxMDA7ICsraSkgeyBkYi50ZXN0LnNhdmUoeyB2YWx1ZTogaSB9KTsgfVxudmFyIGlkeCA9IGRiLnRlc3QuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInBlcnNpc3RlbnRcIiwgZmllbGRzOiBbIFwidmFsdWVcIiBdIH0pO1xudmFyIGV4cGxhaW4gPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FxbC9leHBsYWluZXJcIikuZXhwbGFpbjtcbmV4cGxhaW4oXCJGT1IgaSBJTiB0ZXN0IEZJTFRFUiBpLnZhbHVlIFx1MDAzZSA5NyBTT1JUIGkudmFsdWUgUkVUVVJOIGkudmFsdWVcIiwge2NvbG9yczpmYWxzZX0pOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcInRlc3QvMTIzNFwiLCBcbiAgXCJfa2V5XCIgOiBcIjEyMzRcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWlRPeS0tQlwiIFxufVxuXG5RdWVyeSBTdHJpbmcgKDYxIGNoYXJzLCBjYWNoZWFibGU6IHRydWUpOlxuIEZPUiBpIElOIHRlc3QgRklMVEVSIGkudmFsdWUgXHUwMDNlIDk3IFNPUlQgaS52YWx1ZSBSRVRVUk4gaS52YWx1ZVxuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICAgIEVzdC4gICBDb21tZW50XG4gIDEgICBTaW5nbGV0b25Ob2RlICAgICAgICAxICAgKiBST09UXG4gIDkgICBJbmRleE5vZGUgICAgICAgICAgMTAwICAgICAtIEZPUiBpIElOIHRlc3QgICAvKiBwZXJzaXN0ZW50IGluZGV4IHNjYW4sIGluZGV4IG9ubHkgKHByb2plY3Rpb25zOiBgdmFsdWVgKSAqLyAgICBcbiAgNSAgIENhbGN1bGF0aW9uTm9kZSAgICAxMDAgICAgICAgLSBMRVQgIzMgPSBpLmB2YWx1ZWAgICAvKiBhdHRyaWJ1dGUgZXhwcmVzc2lvbiAqLyAgIC8qIGNvbGxlY3Rpb25zIHVzZWQ6IGkgOiB0ZXN0ICovXG4gIDggICBSZXR1cm5Ob2RlICAgICAgICAgMTAwICAgICAgIC0gUkVUVVJOICMzXG5cbkluZGV4ZXMgdXNlZDpcbiBCeSAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIENvbGxlY3Rpb24gICBVbmlxdWUgICBTcGFyc2UgICBDYWNoZSAgIFNlbGVjdGl2aXR5ICAgRmllbGRzICAgICAgICBTdG9yZWQgdmFsdWVzICAgUmFuZ2VzXG4gIDkgICBpZHhfMTgzMjkzNjE0MDI3MDczMTI2OCAgIHBlcnNpc3RlbnQgICB0ZXN0ICAgICAgICAgZmFsc2UgICAgZmFsc2UgICAgZmFsc2UgICAgICAxMDAuMDAgJSAgIFsgYHZhbHVlYCBdICAgWyAgXSAgICAgICAgICAgIChpLmB2YWx1ZWAgXHUwMDNlIDk3KVxuXG5PcHRpbWl6YXRpb24gcnVsZXMgYXBwbGllZDpcbiBJZCAgIFJ1bGVOYW1lXG4gIDEgICBtb3ZlLWNhbGN1bGF0aW9ucy11cFxuICAyICAgbW92ZS1maWx0ZXJzLXVwXG4gIDMgICByZW1vdmUtcmVkdW5kYW50LWNhbGN1bGF0aW9uc1xuICA0ICAgcmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9uc1xuICA1ICAgbW92ZS1jYWxjdWxhdGlvbnMtdXAtMlxuICA2ICAgbW92ZS1maWx0ZXJzLXVwLTJcbiAgNyAgIHVzZS1pbmRleGVzXG4gIDggICByZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcbiAgOSAgIHVzZS1pbmRleC1mb3Itc29ydFxuIDEwICAgcmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9ucy0yXG4gMTEgICByZWR1Y2UtZXh0cmFjdGlvbi10by1wcm9qZWN0aW9uXG5cbjQ2IHJ1bGUocykgZXhlY3V0ZWQsIDEgcGxhbihzKSBjcmVhdGVkLCBwZWFrIG1lbSBbYl06IDAsIGV4ZWMgdGltZSBbc106IDAuMDAwMjEiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQVFMRVhQXzAxX2F4cGxhaW5lciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "AQLEXP_01_explainCreate_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wMV9leHBsYWluQ3JlYXRlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgaSBJTiB0ZXN0IEZJTFRFUiBpLnZhbHVlID4gOTcgU09SVCBpLnZhbHVlIFJFVFVSTiBpLnZhbHVlIik7CnN0bXQuZXhwbGFpbigpOw==", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudChcIkZPUiBpIElOIHRlc3QgRklMVEVSIGkudmFsdWUgXHUwMDNlIDk3IFNPUlQgaS52YWx1ZSBSRVRVUk4gaS52YWx1ZVwiKTtcbnN0bXQuZXhwbGFpbigpOyIsIm91dHB1dCI6InsgXG4gIFwicGxhblwiIDogeyBcbiAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiSW5kZXhOb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAxIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogOSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTIuNjQzODU2MTg5Nzc0NzIzLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcInByb2plY3Rpb25zXCIgOiBbIFxuICAgICAgICAgIFwidmFsdWVcIiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiZmlsdGVyUHJvamVjdGlvbnNcIiA6IFsgXSwgXG4gICAgICAgIFwiY291bnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJwcm9kdWNlc1Jlc3VsdFwiIDogdHJ1ZSwgXG4gICAgICAgIFwicmVhZE93bldyaXRlc1wiIDogZmFsc2UsIFxuICAgICAgICBcInVzZUNhY2hlXCIgOiB0cnVlLCBcbiAgICAgICAgXCJtYXhQcm9qZWN0aW9uc1wiIDogNSwgXG4gICAgICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcInRlc3RcIiwgXG4gICAgICAgIFwic2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaXNTYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZU9mXCIgOiBudWxsLCBcbiAgICAgICAgXCJuZWVkc0dhdGhlck5vZGVTb3J0XCIgOiB0cnVlLCBcbiAgICAgICAgXCJpbmRleENvdmVyc1Byb2plY3Rpb25zXCIgOiB0cnVlLCBcbiAgICAgICAgXCJpbmRleGVzXCIgOiBbIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcImlkXCIgOiBcIjEyMzZcIiwgXG4gICAgICAgICAgICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE0MDI3MDczMTI2OFwiLCBcbiAgICAgICAgICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgICAgICAgICBcInZhbHVlXCIgXG4gICAgICAgICAgICBdLCBcbiAgICAgICAgICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgICAgICAgICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICAgICAgICAgICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICAgICAgICAgICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgICAgICAgICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlIFxuICAgICAgICAgIH0gXG4gICAgICAgIF0sIFxuICAgICAgICBcImNvbmRpdGlvblwiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwibi1hcnkgb3JcIiwgXG4gICAgICAgICAgXCJ0eXBlSURcIiA6IDYzLCBcbiAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcIm4tYXJ5IGFuZFwiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDYyLCBcbiAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImNvbXBhcmUgXHUwMDNlXCIsIFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDI5LCBcbiAgICAgICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImF0dHJpYnV0ZSBhY2Nlc3NcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDM1LCBcbiAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQwLCBcbiAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCIgOiA5NywgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ2VHlwZUlEXCIgOiAyIFxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJhbGxDb3ZlcmVkQnlPbmVJbmRleFwiIDogZmFsc2UsIFxuICAgICAgICBcInNvcnRlZFwiIDogdHJ1ZSwgXG4gICAgICAgIFwiYXNjZW5kaW5nXCIgOiB0cnVlLCBcbiAgICAgICAgXCJyZXZlcnNlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiZXZhbEZDYWxsc1wiIDogdHJ1ZSwgXG4gICAgICAgIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJsaW1pdFwiIDogMCwgXG4gICAgICAgIFwibG9va2FoZWFkXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiQ2FsY3VsYXRpb25Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA5IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTEyLjY0Mzg1NjE4OTc3NDcyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcImF0dHJpYnV0ZSBhY2Nlc3NcIiwgXG4gICAgICAgICAgXCJ0eXBlSURcIiA6IDM1LCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjYW5UaHJvd1wiIDogZmFsc2UsIFxuICAgICAgICBcImV4cHJlc3Npb25UeXBlXCIgOiBcImF0dHJpYnV0ZVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiUmV0dXJuTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgNSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDgsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDIxMi42NDM4NTYxODk3NzQ3NCwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInJ1bGVzXCIgOiBbIFxuICAgICAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cFwiLCBcbiAgICAgIFwibW92ZS1maWx0ZXJzLXVwXCIsIFxuICAgICAgXCJyZW1vdmUtcmVkdW5kYW50LWNhbGN1bGF0aW9uc1wiLCBcbiAgICAgIFwicmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9uc1wiLCBcbiAgICAgIFwibW92ZS1jYWxjdWxhdGlvbnMtdXAtMlwiLCBcbiAgICAgIFwibW92ZS1maWx0ZXJzLXVwLTJcIiwgXG4gICAgICBcInVzZS1pbmRleGVzXCIsIFxuICAgICAgXCJyZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcIiwgXG4gICAgICBcInVzZS1pbmRleC1mb3Itc29ydFwiLCBcbiAgICAgIFwicmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9ucy0yXCIsIFxuICAgICAgXCJyZWR1Y2UtZXh0cmFjdGlvbi10by1wcm9qZWN0aW9uXCIgXG4gICAgXSwgXG4gICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwibmFtZVwiIDogXCJ0ZXN0XCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwicmVhZFwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZhcmlhYmxlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDYsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiNVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAyMTIuNjQzODU2MTg5Nzc0NzQsIFxuICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQ2LCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogMCwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTg1OTM2MDAwMDA4MjY4ODIgXG4gIH0sIFxuICBcImNhY2hlYWJsZVwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQVFMRVhQXzAxX2V4cGxhaW5DcmVhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "AQLEXP_02_explainOverview_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wMl9leHBsYWluT3ZlcnZpZXcKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgaSBJTiB0ZXN0IEZJTFRFUiBpLnZhbHVlID4gOTcgU09SVCBpLnZhbHVlIFJFVFVSTiBpLnZhbHVlIik7CnN0bXQuZXhwbGFpbigpLnBsYW4ubm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnR5cGU7IH0pOw==", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbigpLnBsYW4ubm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnR5cGU7IH0pOyIsIm91dHB1dCI6IlsgXG4gIFwiU2luZ2xldG9uTm9kZVwiLCBcbiAgXCJJbmRleE5vZGVcIiwgXG4gIFwiQ2FsY3VsYXRpb25Ob2RlXCIsIFxuICBcIlJldHVybk5vZGVcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQVFMRVhQXzAyX2V4cGxhaW5PdmVydmlldyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "AQLEXP_03_explainRules_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wM19leHBsYWluUnVsZXMKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgaSBJTiB0ZXN0IEZJTFRFUiBpLnZhbHVlID4gOTcgU09SVCBpLnZhbHVlIFJFVFVSTiBpLnZhbHVlIik7CnN0bXQuZXhwbGFpbigpLnBsYW4ucnVsZXM7", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbigpLnBsYW4ucnVsZXM7Iiwib3V0cHV0IjoiWyBcbiAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cFwiLCBcbiAgXCJtb3ZlLWZpbHRlcnMtdXBcIiwgXG4gIFwicmVtb3ZlLXJlZHVuZGFudC1jYWxjdWxhdGlvbnNcIiwgXG4gIFwicmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9uc1wiLCBcbiAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cC0yXCIsIFxuICBcIm1vdmUtZmlsdGVycy11cC0yXCIsIFxuICBcInVzZS1pbmRleGVzXCIsIFxuICBcInJlbW92ZS1maWx0ZXItY292ZXJlZC1ieS1pbmRleFwiLCBcbiAgXCJ1c2UtaW5kZXgtZm9yLXNvcnRcIiwgXG4gIFwicmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9ucy0yXCIsIFxuICBcInJlZHVjZS1leHRyYWN0aW9uLXRvLXByb2plY3Rpb25cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQVFMRVhQXzAzX2V4cGxhaW5SdWxlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "AQLEXP_04_explainCollections_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wNF9leHBsYWluQ29sbGVjdGlvbnMKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgaSBJTiB0ZXN0IEZJTFRFUiBpLnZhbHVlID4gOTcgU09SVCBpLnZhbHVlIFJFVFVSTiBpLnZhbHVlIik7CnN0bXQuZXhwbGFpbigpLnBsYW4uY29sbGVjdGlvbnM=", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbigpLnBsYW4uY29sbGVjdGlvbnMiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJ0ZXN0XCIsIFxuICAgIFwidHlwZVwiIDogXCJyZWFkXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkFRTEVYUF8wNF9leHBsYWluQ29sbGVjdGlvbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "AQLEXP_05_explainAllPlans_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wNV9leHBsYWluQWxsUGxhbnMKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHN0bXQgPSBkYi5fY3JlYXRlU3RhdGVtZW50KCJGT1IgaSBJTiB0ZXN0IEZJTFRFUiBpLnZhbHVlID4gOTcgU09SVCBpLnZhbHVlIFJFVFVSTiBpLnZhbHVlIik7CnN0bXQuZXhwbGFpbih7IGFsbFBsYW5zOiB0cnVlIH0pOw==", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IGFsbFBsYW5zOiB0cnVlIH0pOyIsIm91dHB1dCI6InsgXG4gIFwicGxhbnNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXSwgXG4gICAgICAgICAgXCJpZFwiIDogMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJJbmRleE5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgICAxIFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDksIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTIuNjQzODU2MTg5Nzc0NzIzLCBcbiAgICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwicHJvamVjdGlvbnNcIiA6IFsgXG4gICAgICAgICAgICBcInZhbHVlXCIgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJmaWx0ZXJQcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgICBcImNvdW50XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJwcm9kdWNlc1Jlc3VsdFwiIDogdHJ1ZSwgXG4gICAgICAgICAgXCJyZWFkT3duV3JpdGVzXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJ1c2VDYWNoZVwiIDogdHJ1ZSwgXG4gICAgICAgICAgXCJtYXhQcm9qZWN0aW9uc1wiIDogNSwgXG4gICAgICAgICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJ0ZXN0XCIsIFxuICAgICAgICAgIFwic2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICAgIFwiaXNTYXRlbGxpdGVPZlwiIDogbnVsbCwgXG4gICAgICAgICAgXCJuZWVkc0dhdGhlck5vZGVTb3J0XCIgOiB0cnVlLCBcbiAgICAgICAgICBcImluZGV4Q292ZXJzUHJvamVjdGlvbnNcIiA6IHRydWUsIFxuICAgICAgICAgIFwiaW5kZXhlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwiaWRcIiA6IFwiMTIzNlwiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE0MDI3MDczMTI2OFwiLCBcbiAgICAgICAgICAgICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiIFxuICAgICAgICAgICAgICBdLCBcbiAgICAgICAgICAgICAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgICAgICAgICAgICAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgICAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcImNvbmRpdGlvblwiIDogeyBcbiAgICAgICAgICAgIFwidHlwZVwiIDogXCJuLWFyeSBvclwiLCBcbiAgICAgICAgICAgIFwidHlwZUlEXCIgOiA2MywgXG4gICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJuLWFyeSBhbmRcIiwgXG4gICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDYyLCBcbiAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImNvbXBhcmUgXHUwMDNlXCIsIFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogMjksIFxuICAgICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQ1LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQwLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IDk3LCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogMiBcbiAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgXSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImFsbENvdmVyZWRCeU9uZUluZGV4XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJzb3J0ZWRcIiA6IHRydWUsIFxuICAgICAgICAgIFwiYXNjZW5kaW5nXCIgOiB0cnVlLCBcbiAgICAgICAgICBcInJldmVyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImV2YWxGQ2FsbHNcIiA6IHRydWUsIFxuICAgICAgICAgIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImxpbWl0XCIgOiAwLCBcbiAgICAgICAgICBcImxvb2thaGVhZFwiIDogMSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDkgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMTIuNjQzODU2MTg5Nzc0NzIsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQ1LCBcbiAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgXSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJjYW5UaHJvd1wiIDogZmFsc2UsIFxuICAgICAgICAgIFwiZXhwcmVzc2lvblR5cGVcIiA6IFwiYXR0cmlidXRlXCIgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgICAgNSBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcImlkXCIgOiA4LCBcbiAgICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDIxMi42NDM4NTYxODk3NzQ3NCwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiY291bnRcIiA6IHRydWUgXG4gICAgICAgIH0gXG4gICAgICBdLCBcbiAgICAgIFwicnVsZXNcIiA6IFsgXG4gICAgICAgIFwibW92ZS1jYWxjdWxhdGlvbnMtdXBcIiwgXG4gICAgICAgIFwibW92ZS1maWx0ZXJzLXVwXCIsIFxuICAgICAgICBcInJlbW92ZS1yZWR1bmRhbnQtY2FsY3VsYXRpb25zXCIsIFxuICAgICAgICBcInJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnNcIiwgXG4gICAgICAgIFwibW92ZS1jYWxjdWxhdGlvbnMtdXAtMlwiLCBcbiAgICAgICAgXCJtb3ZlLWZpbHRlcnMtdXAtMlwiLCBcbiAgICAgICAgXCJ1c2UtaW5kZXhlc1wiLCBcbiAgICAgICAgXCJyZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcIiwgXG4gICAgICAgIFwidXNlLWluZGV4LWZvci1zb3J0XCIsIFxuICAgICAgICBcInJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnMtMlwiLCBcbiAgICAgICAgXCJyZWR1Y2UtZXh0cmFjdGlvbi10by1wcm9qZWN0aW9uXCIgXG4gICAgICBdLCBcbiAgICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInRlc3RcIiwgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcInJlYWRcIiBcbiAgICAgICAgfSBcbiAgICAgIF0sIFxuICAgICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjVcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSBcbiAgICAgIF0sIFxuICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAyMTIuNjQzODU2MTg5Nzc0NzQsIFxuICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgXCJpc01vZGlmaWNhdGlvblF1ZXJ5XCIgOiBmYWxzZSBcbiAgICB9IFxuICBdLCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQ2LCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogMCwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTI5MTMxOTk5OTgzNjU2IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJBUUxFWFBfMDVfZXhwbGFpbkFsbFBsYW5zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "AQLEXP_06_explainUnoptimizedPlans_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wNl9leHBsYWluVW5vcHRpbWl6ZWRQbGFucwpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIkZPUiBpIElOIHRlc3QgRklMVEVSIGkudmFsdWUgPiA5NyBTT1JUIGkudmFsdWUgUkVUVVJOIGkudmFsdWUiKTsKc3RtdC5leHBsYWluKHsgb3B0aW1pemVyOiB7IHJ1bGVzOiBbICItYWxsIiBdIH0gfSk7", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IG9wdGltaXplcjogeyBydWxlczogWyBcIi1hbGxcIiBdIH0gfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJwbGFuXCIgOiB7IFxuICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiU2luZ2xldG9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXSwgXG4gICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgMSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEwMiwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgXCJyYW5kb21cIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpbmRleEhpbnRcIiA6IHsgXG4gICAgICAgICAgXCJmb3JjZWRcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImxvb2thaGVhZFwiIDogMSwgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIm5vbmVcIiBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiB0cnVlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJwcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJmaWx0ZXJQcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJjb3VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInByb2R1Y2VzUmVzdWx0XCIgOiB0cnVlLCBcbiAgICAgICAgXCJyZWFkT3duV3JpdGVzXCIgOiBmYWxzZSwgXG4gICAgICAgIFwidXNlQ2FjaGVcIiA6IHRydWUsIFxuICAgICAgICBcIm1heFByb2plY3Rpb25zXCIgOiA1LCBcbiAgICAgICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwidGVzdFwiLCBcbiAgICAgICAgXCJzYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICBcImlzU2F0ZWxsaXRlT2ZcIiA6IG51bGwgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDIgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAzLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAyMDIsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiY29tcGFyZSBcdTAwM2VcIiwgXG4gICAgICAgICAgXCJ0eXBlSURcIiA6IDI5LCBcbiAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImF0dHJpYnV0ZSBhY2Nlc3NcIiwgXG4gICAgICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDAsIFxuICAgICAgICAgICAgICBcInZhbHVlXCIgOiA5NywgXG4gICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogMiBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJzaW1wbGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkZpbHRlck5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDMgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAzMDIsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiMVwiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICB9IFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiQ2FsY3VsYXRpb25Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA0IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNDAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcImF0dHJpYnV0ZSBhY2Nlc3NcIiwgXG4gICAgICAgICAgXCJ0eXBlSURcIiA6IDM1LCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjYW5UaHJvd1wiIDogZmFsc2UsIFxuICAgICAgICBcImV4cHJlc3Npb25UeXBlXCIgOiBcImF0dHJpYnV0ZVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiU29ydE5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDUgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA2LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMDY2LjM4NTYxODk3NzQ3MjQsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiZWxlbWVudHNcIiA6IFsgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICBcImFzY2VuZGluZ1wiIDogdHJ1ZSBcbiAgICAgICAgICB9IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJzdGFibGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJsaW1pdFwiIDogMCwgXG4gICAgICAgIFwic3RyYXRlZ3lcIiA6IFwic3RhbmRhcmRcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgNiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDcsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDExNjYuMzg1NjE4OTc3NDcyNCwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjVcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJhdHRyaWJ1dGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlJldHVybk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDcgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA4LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMjY2LjM4NTYxODk3NzQ3MjQsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiA2LCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiNVwiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjb3VudFwiIDogdHJ1ZSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJydWxlc1wiIDogWyBdLCBcbiAgICBcImNvbGxlY3Rpb25zXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJuYW1lXCIgOiBcInRlc3RcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJyZWFkXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwidmFyaWFibGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgIFwibmFtZVwiIDogXCI1XCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiMVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTI2Ni4zODU2MTg5Nzc0NzI0LCBcbiAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgXCJpc01vZGlmaWNhdGlvblF1ZXJ5XCIgOiBmYWxzZSBcbiAgfSwgXG4gIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gIFwic3RhdHNcIiA6IHsgXG4gICAgXCJydWxlc0V4ZWN1dGVkXCIgOiAzLCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogNDEsIFxuICAgIFwicGxhbnNDcmVhdGVkXCIgOiAxLCBcbiAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDEwMTQ3Mzk5OTk5MDI3NTg0IFxuICB9LCBcbiAgXCJjYWNoZWFibGVcIiA6IHRydWUgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkFRTEVYUF8wNl9leHBsYWluVW5vcHRpbWl6ZWRQbGFucyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "AQLEXP_07_explainSingleRulePlans_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wN19leHBsYWluU2luZ2xlUnVsZVBsYW5zCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCgiRk9SIGkgSU4gdGVzdCBGSUxURVIgaS52YWx1ZSA+IDk3IFNPUlQgaS52YWx1ZSBSRVRVUk4gaS52YWx1ZSIpOwpzdG10LmV4cGxhaW4oeyBvcHRpbWl6ZXI6IHsgcnVsZXM6IFsgIi1hbGwiLCAiK3VzZS1pbmRleC1yYW5nZSIgXSB9IH0pOw==", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IG9wdGltaXplcjogeyBydWxlczogWyBcIi1hbGxcIiwgXCIrdXNlLWluZGV4LXJhbmdlXCIgXSB9IH0pOyIsIm91dHB1dCI6InsgXG4gIFwicGxhblwiIDogeyBcbiAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiRW51bWVyYXRlQ29sbGVjdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDEgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMDIsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwicmFuZG9tXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaW5kZXhIaW50XCIgOiB7IFxuICAgICAgICAgIFwiZm9yY2VkXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJsb29rYWhlYWRcIiA6IDEsIFxuICAgICAgICAgIFwidHlwZVwiIDogXCJub25lXCIgXG4gICAgICAgIH0sIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvamVjdGlvbnNcIiA6IFsgXSwgXG4gICAgICAgIFwiZmlsdGVyUHJvamVjdGlvbnNcIiA6IFsgXSwgXG4gICAgICAgIFwiY291bnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJwcm9kdWNlc1Jlc3VsdFwiIDogdHJ1ZSwgXG4gICAgICAgIFwicmVhZE93bldyaXRlc1wiIDogZmFsc2UsIFxuICAgICAgICBcInVzZUNhY2hlXCIgOiB0cnVlLCBcbiAgICAgICAgXCJtYXhQcm9qZWN0aW9uc1wiIDogNSwgXG4gICAgICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcInRlc3RcIiwgXG4gICAgICAgIFwic2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaXNTYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZU9mXCIgOiBudWxsIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiQ2FsY3VsYXRpb25Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAyIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogMywgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMjAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcImNvbXBhcmUgXHUwMDNlXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiAyOSwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQwLCBcbiAgICAgICAgICAgICAgXCJ2YWx1ZVwiIDogOTcsIFxuICAgICAgICAgICAgICBcInZUeXBlSURcIiA6IDIgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIxXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgIFwiZXhwcmVzc2lvblR5cGVcIiA6IFwic2ltcGxlXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJGaWx0ZXJOb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAzIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMzAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImluVmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgNCBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDUsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDQwMiwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJhdHRyaWJ1dGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNvcnROb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA1IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTA2Ni4zODU2MTg5Nzc0NzI0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImVsZW1lbnRzXCIgOiBbIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcImluVmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgXCJhc2NlbmRpbmdcIiA6IHRydWUgXG4gICAgICAgICAgfSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwic3RhYmxlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwibGltaXRcIiA6IDAsIFxuICAgICAgICBcInN0cmF0ZWd5XCIgOiBcInN0YW5kYXJkXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDYgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA3LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMTY2LjM4NTYxODk3NzQ3MjQsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQ1LCBcbiAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDYsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCI1XCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgIFwiZXhwcmVzc2lvblR5cGVcIiA6IFwiYXR0cmlidXRlXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA3IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogOCwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTI2Ni4zODU2MTg5Nzc0NzI0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImluVmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjVcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY291bnRcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwicnVsZXNcIiA6IFsgXSwgXG4gICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwibmFtZVwiIDogXCJ0ZXN0XCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwicmVhZFwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZhcmlhYmxlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDYsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiNVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcImVzdGltYXRlZENvc3RcIiA6IDEyNjYuMzg1NjE4OTc3NDcyNCwgXG4gICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgIFwiaXNNb2RpZmljYXRpb25RdWVyeVwiIDogZmFsc2UgXG4gIH0sIFxuICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwicnVsZXNFeGVjdXRlZFwiIDogMywgXG4gICAgXCJydWxlc1NraXBwZWRcIiA6IDQxLCBcbiAgICBcInBsYW5zQ3JlYXRlZFwiIDogMSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMTkyNTEwMDAwMDA5ODYxIFxuICB9LCBcbiAgXCJjYWNoZWFibGVcIiA6IHRydWUgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkFRTEVYUF8wN19leHBsYWluU2luZ2xlUnVsZVBsYW5zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "AQLEXP_08_explainDisableSingleRulePlans_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wOF9leHBsYWluRGlzYWJsZVNpbmdsZVJ1bGVQbGFucwpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIkZPUiBpIElOIHRlc3QgRklMVEVSIGkudmFsdWUgPiA5NyBTT1JUIGkudmFsdWUgUkVUVVJOIGkudmFsdWUiKTsKc3RtdC5leHBsYWluKHsgb3B0aW1pemVyOiB7IHJ1bGVzOiBbICItdXNlLWluZGV4LXJhbmdlIiwgIi11c2UtaW5kZXgtZm9yLXNvcnQiIF0gfSB9KTs=", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IG9wdGltaXplcjogeyBydWxlczogWyBcIi11c2UtaW5kZXgtcmFuZ2VcIiwgXCItdXNlLWluZGV4LWZvci1zb3J0XCIgXSB9IH0pOyIsIm91dHB1dCI6InsgXG4gIFwicGxhblwiIDogeyBcbiAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiSW5kZXhOb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAxIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogOSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTIuNjQzODU2MTg5Nzc0NzIzLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcInByb2plY3Rpb25zXCIgOiBbIFxuICAgICAgICAgIFwidmFsdWVcIiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiZmlsdGVyUHJvamVjdGlvbnNcIiA6IFsgXSwgXG4gICAgICAgIFwiY291bnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJwcm9kdWNlc1Jlc3VsdFwiIDogdHJ1ZSwgXG4gICAgICAgIFwicmVhZE93bldyaXRlc1wiIDogZmFsc2UsIFxuICAgICAgICBcInVzZUNhY2hlXCIgOiB0cnVlLCBcbiAgICAgICAgXCJtYXhQcm9qZWN0aW9uc1wiIDogNSwgXG4gICAgICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcInRlc3RcIiwgXG4gICAgICAgIFwic2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaXNTYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZU9mXCIgOiBudWxsLCBcbiAgICAgICAgXCJuZWVkc0dhdGhlck5vZGVTb3J0XCIgOiBmYWxzZSwgXG4gICAgICAgIFwiaW5kZXhDb3ZlcnNQcm9qZWN0aW9uc1wiIDogdHJ1ZSwgXG4gICAgICAgIFwiaW5kZXhlc1wiIDogWyBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJpZFwiIDogXCIxMjM2XCIsIFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYxNDAyNzA3MzEyNjhcIiwgXG4gICAgICAgICAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgICAgICAgICAgXCJ2YWx1ZVwiIFxuICAgICAgICAgICAgXSwgXG4gICAgICAgICAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgICAgICAgICAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICAgICAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgICAgICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSBcbiAgICAgICAgICB9IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJjb25kaXRpb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIm4tYXJ5IG9yXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiA2MywgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJuLWFyeSBhbmRcIiwgXG4gICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA2MiwgXG4gICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJjb21wYXJlIFx1MDAzZVwiLCBcbiAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiAyOSwgXG4gICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0MCwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiIDogOTcsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogMiBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiYWxsQ292ZXJlZEJ5T25lSW5kZXhcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJzb3J0ZWRcIiA6IHRydWUsIFxuICAgICAgICBcImFzY2VuZGluZ1wiIDogdHJ1ZSwgXG4gICAgICAgIFwicmV2ZXJzZVwiIDogZmFsc2UsIFxuICAgICAgICBcImV2YWxGQ2FsbHNcIiA6IHRydWUsIFxuICAgICAgICBcIndhaXRGb3JTeW5jXCIgOiBmYWxzZSwgXG4gICAgICAgIFwibGltaXRcIiA6IDAsIFxuICAgICAgICBcImxvb2thaGVhZFwiIDogMSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgOSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDUsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDExMi42NDM4NTYxODk3NzQ3MiwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJhdHRyaWJ1dGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNvcnROb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA1IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNzc3LjAyOTQ3NTE2NzI0NzEsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiZWxlbWVudHNcIiA6IFsgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwiaW5WYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICBcImFzY2VuZGluZ1wiIDogdHJ1ZSBcbiAgICAgICAgICB9IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJzdGFibGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJsaW1pdFwiIDogMCwgXG4gICAgICAgIFwic3RyYXRlZ3lcIiA6IFwic3RhbmRhcmRcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlJldHVybk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDYgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA4LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA4NzcuMDI5NDc1MTY3MjQ3MSwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInJ1bGVzXCIgOiBbIFxuICAgICAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cFwiLCBcbiAgICAgIFwibW92ZS1maWx0ZXJzLXVwXCIsIFxuICAgICAgXCJyZW1vdmUtcmVkdW5kYW50LWNhbGN1bGF0aW9uc1wiLCBcbiAgICAgIFwicmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9uc1wiLCBcbiAgICAgIFwibW92ZS1jYWxjdWxhdGlvbnMtdXAtMlwiLCBcbiAgICAgIFwibW92ZS1maWx0ZXJzLXVwLTJcIiwgXG4gICAgICBcInVzZS1pbmRleGVzXCIsIFxuICAgICAgXCJyZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcIiwgXG4gICAgICBcInJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnMtMlwiLCBcbiAgICAgIFwicmVkdWNlLWV4dHJhY3Rpb24tdG8tcHJvamVjdGlvblwiIFxuICAgIF0sIFxuICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIm5hbWVcIiA6IFwidGVzdFwiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcInJlYWRcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiA2LCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjVcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgIFwibmFtZVwiIDogXCIxXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiAwLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogODc3LjAyOTQ3NTE2NzI0NzEsIFxuICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAwLCBcbiAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQ1LCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogMSwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTU0ODA5OTk5OTk3OTUxMyBcbiAgfSwgXG4gIFwiY2FjaGVhYmxlXCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJBUUxFWFBfMDhfZXhwbGFpbkRpc2FibGVTaW5nbGVSdWxlUGxhbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "AQLEXP_09_explainMaxNumberOfPlans_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8wOV9leHBsYWluTWF4TnVtYmVyT2ZQbGFucwpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgc3RtdCA9IGRiLl9jcmVhdGVTdGF0ZW1lbnQoIkZPUiBpIElOIHRlc3QgRklMVEVSIGkudmFsdWUgPiA5NyBTT1JUIGkudmFsdWUgUkVUVVJOIGkudmFsdWUiKTsKc3RtdC5leHBsYWluKHsgbWF4TnVtYmVyT2ZQbGFuczogMSB9KTs=", + "response": "eyJpbnB1dCI6InN0bXQuZXhwbGFpbih7IG1heE51bWJlck9mUGxhbnM6IDEgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJwbGFuXCIgOiB7IFxuICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiU2luZ2xldG9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXSwgXG4gICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJJbmRleE5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDEgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA5LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMi42NDM4NTYxODk3NzQ3MjMsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvamVjdGlvbnNcIiA6IFsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJmaWx0ZXJQcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgXCJjb3VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInByb2R1Y2VzUmVzdWx0XCIgOiB0cnVlLCBcbiAgICAgICAgXCJyZWFkT3duV3JpdGVzXCIgOiBmYWxzZSwgXG4gICAgICAgIFwidXNlQ2FjaGVcIiA6IHRydWUsIFxuICAgICAgICBcIm1heFByb2plY3Rpb25zXCIgOiA1LCBcbiAgICAgICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwidGVzdFwiLCBcbiAgICAgICAgXCJzYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICBcImlzU2F0ZWxsaXRlT2ZcIiA6IG51bGwsIFxuICAgICAgICBcIm5lZWRzR2F0aGVyTm9kZVNvcnRcIiA6IHRydWUsIFxuICAgICAgICBcImluZGV4Q292ZXJzUHJvamVjdGlvbnNcIiA6IHRydWUsIFxuICAgICAgICBcImluZGV4ZXNcIiA6IFsgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwiaWRcIiA6IFwiMTIzNlwiLCBcbiAgICAgICAgICAgIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MTQwMjcwNzMxMjY4XCIsIFxuICAgICAgICAgICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICAgICAgICAgIFwidmFsdWVcIiBcbiAgICAgICAgICAgIF0sIFxuICAgICAgICAgICAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgICAgICAgICAgIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICAgICAgICAgICAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gICAgICAgICAgICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gICAgICAgICAgICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UgXG4gICAgICAgICAgfSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiY29uZGl0aW9uXCIgOiB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJuLWFyeSBvclwiLCBcbiAgICAgICAgICBcInR5cGVJRFwiIDogNjMsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwibi1hcnkgYW5kXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNjIsIFxuICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwiY29tcGFyZSBcdTAwM2VcIiwgXG4gICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogMjksIFxuICAgICAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQ1LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDAsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IDk3LCBcbiAgICAgICAgICAgICAgICAgICAgICBcInZUeXBlSURcIiA6IDIgXG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICBcImFsbENvdmVyZWRCeU9uZUluZGV4XCIgOiBmYWxzZSwgXG4gICAgICAgIFwic29ydGVkXCIgOiB0cnVlLCBcbiAgICAgICAgXCJhc2NlbmRpbmdcIiA6IHRydWUsIFxuICAgICAgICBcInJldmVyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJldmFsRkNhbGxzXCIgOiB0cnVlLCBcbiAgICAgICAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICAgICAgICBcImxpbWl0XCIgOiAwLCBcbiAgICAgICAgXCJsb29rYWhlYWRcIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDkgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA1LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMTIuNjQzODU2MTg5Nzc0NzIsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwMCwgXG4gICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQ1LCBcbiAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgIFwiZXhwcmVzc2lvblR5cGVcIiA6IFwiYXR0cmlidXRlXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA1IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogOCwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMjEyLjY0Mzg1NjE4OTc3NDc0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgICAgICBcImluVmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY291bnRcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwicnVsZXNcIiA6IFsgXG4gICAgICBcIm1vdmUtY2FsY3VsYXRpb25zLXVwXCIsIFxuICAgICAgXCJtb3ZlLWZpbHRlcnMtdXBcIiwgXG4gICAgICBcInJlbW92ZS1yZWR1bmRhbnQtY2FsY3VsYXRpb25zXCIsIFxuICAgICAgXCJyZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zXCIsIFxuICAgICAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cC0yXCIsIFxuICAgICAgXCJtb3ZlLWZpbHRlcnMtdXAtMlwiLCBcbiAgICAgIFwidXNlLWluZGV4ZXNcIiwgXG4gICAgICBcInJlbW92ZS1maWx0ZXItY292ZXJlZC1ieS1pbmRleFwiLCBcbiAgICAgIFwidXNlLWluZGV4LWZvci1zb3J0XCIsIFxuICAgICAgXCJyZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zLTJcIiwgXG4gICAgICBcInJlZHVjZS1leHRyYWN0aW9uLXRvLXByb2plY3Rpb25cIiBcbiAgICBdLCBcbiAgICBcImNvbGxlY3Rpb25zXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJuYW1lXCIgOiBcInRlc3RcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJyZWFkXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwidmFyaWFibGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgIFwibmFtZVwiIDogXCI1XCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiMVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcImVzdGltYXRlZENvc3RcIiA6IDIxMi42NDM4NTYxODk3NzQ3NCwgXG4gICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMDAsIFxuICAgIFwiaXNNb2RpZmljYXRpb25RdWVyeVwiIDogZmFsc2UgXG4gIH0sIFxuICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwicnVsZXNFeGVjdXRlZFwiIDogNDUsIFxuICAgIFwicnVsZXNTa2lwcGVkXCIgOiAxLCBcbiAgICBcInBsYW5zQ3JlYXRlZFwiIDogMSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxNDE0MDE5OTk5OTcwMTUwOCBcbiAgfSwgXG4gIFwiY2FjaGVhYmxlXCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJBUUxFWFBfMDlfZXhwbGFpbk1heE51bWJlck9mUGxhbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "AQLEXP_10_explainWarn_single": { + "request": "LS0tCm5hbWU6IEFRTEVYUF8xMF9leHBsYWluV2FybgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudCgiRk9SIGkgSU4gMS4uMTAgUkVUVVJOIDEgLyAwIikKc3RtdC5leHBsYWluKCkud2FybmluZ3M7Cn5kYi5fZHJvcCgidGVzdCIpCn5yZW1vdmVJZ25vcmVDb2xsZWN0aW9uKCJ0ZXN0Iik=", + "response": "eyJpbnB1dCI6InZhciBzdG10ID0gZGIuX2NyZWF0ZVN0YXRlbWVudChcIkZPUiBpIElOIDEuLjEwIFJFVFVSTiAxIC8gMFwiKVxuc3RtdC5leHBsYWluKCkud2FybmluZ3M7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImNvZGVcIiA6IDE1NjIsIFxuICAgIFwibWVzc2FnZVwiIDogXCJkaXZpc2lvbiBieSB6ZXJvXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkFRTEVYUF8xMF9leHBsYWluV2FybiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "COMBINING_GRAPH_01_create_graph_single": { + "request": "LS0tCm5hbWU6IENPTUJJTklOR19HUkFQSF8wMV9jcmVhdGVfZ3JhcGgKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwpleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbmV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTsiLCJvdXRwdXQiOiJ7W0dlbmVyYWxHcmFwaF0gXG4gIFwiZnJlbmNoSGlnaHdheVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNDE4LCBcImZyZW5jaEhpZ2h3YXlcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImZyZW5jaENpdHlcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDQwNSwgXCJmcmVuY2hDaXR5XCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwiZ2VybWFuSGlnaHdheVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNDEzLCBcImdlcm1hbkhpZ2h3YXlcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImdlcm1hbkNpdHlcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDQwMiwgXCJnZXJtYW5DaXR5XCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwiaW50ZXJuYXRpb25hbEhpZ2h3YXlcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDQwOCwgXCJpbnRlcm5hdGlvbmFsSGlnaHdheVwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQ09NQklOSU5HX0dSQVBIXzAxX2NyZWF0ZV9ncmFwaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "COMBINING_GRAPH_02_show_geo_single": { + "request": "LS0tCm5hbWU6IENPTUJJTklOR19HUkFQSF8wMl9zaG93X2dlbwpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogcm91dGVwbGFubmVyCmJpbmRWYXJzOiAKICB7CiAgICAiYm9ubiI6IFs3LjA5OTgsIDUwLjczNDBdLAogICAgInJhZGl1cyI6IDQwMDAwMAogIH0KLS0tCkZPUiBzdGFydENpdHkgSU4gZ2VybWFuQ2l0eQogIEZJTFRFUiBHRU9fRElTVEFOQ0UoQGJvbm4sIHN0YXJ0Q2l0eS5nZW9tZXRyeSkgPCBAcmFkaXVzCiAgICBSRVRVUk4gc3RhcnRDaXR5Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiBzdGFydENpdHkgSU4gZ2VybWFuQ2l0eVxuICBGSUxURVIgR0VPX0RJU1RBTkNFKEBib25uLCBzdGFydENpdHkuZ2VvbWV0cnkpIFx1MDAzYyBAcmFkaXVzXG4gICAgUkVUVVJOIHN0YXJ0Q2l0eS5fa2V5Iiwib3V0cHV0IjoiWyBcbiAgXCJDb2xvZ25lXCIsIFxuICBcIkhhbWJ1cmdcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQ09NQklOSU5HX0dSQVBIXzAyX3Nob3dfZ2VvIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImJpbmRWYXJzIjp7ImJvbm4iOls3LjA5OTgsNTAuNzM0XSwicmFkaXVzIjo0MDAwMDB9LCJkYXRhc2V0Ijoicm91dGVwbGFubmVyIn19Cg==" + }, + "COMBINING_GRAPH_03_explain_geo_single": { + "request": "LS0tCm5hbWU6IENPTUJJTklOR19HUkFQSF8wM19leHBsYWluX2dlbwpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogcm91dGVwbGFubmVyCmV4cGxhaW46IHRydWUKYmluZFZhcnM6IAogIHsKICAgICJib25uIjogWzcuMDk5OCwgNTAuNzM0MF0sCiAgICAicmFkaXVzIjogNDAwMDAwCiAgfQotLS0KRk9SIHN0YXJ0Q2l0eSBJTiBnZXJtYW5DaXR5CiAgRklMVEVSIEdFT19ESVNUQU5DRShAYm9ubiwgc3RhcnRDaXR5Lmdlb21ldHJ5KSA8IEByYWRpdXMKICAgIFJFVFVSTiBzdGFydENpdHkuX2tleQ==", + "response": "eyJpbnB1dCI6IkZPUiBzdGFydENpdHkgSU4gZ2VybWFuQ2l0eVxuICBGSUxURVIgR0VPX0RJU1RBTkNFKEBib25uLCBzdGFydENpdHkuZ2VvbWV0cnkpIFx1MDAzYyBAcmFkaXVzXG4gICAgUkVUVVJOIHN0YXJ0Q2l0eS5fa2V5Iiwib3V0cHV0IjoiWyBcbiAgXCJDb2xvZ25lXCIsIFxuICBcIkhhbWJ1cmdcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQ09NQklOSU5HX0dSQVBIXzAzX2V4cGxhaW5fZ2VvIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImV4cGxhaW4iOnRydWUsImJpbmRWYXJzIjp7ImJvbm4iOls3LjA5OTgsNTAuNzM0XSwicmFkaXVzIjo0MDAwMDB9LCJkYXRhc2V0Ijoicm91dGVwbGFubmVyIn19Cg==" + }, + "COMBINING_GRAPH_04_combine_single": { + "request": "LS0tCm5hbWU6IENPTUJJTklOR19HUkFQSF8wNF9jb21iaW5lCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiByb3V0ZXBsYW5uZXIKYmluZFZhcnM6IAogIHsKICAgICJib25uIjogWzcuMDk5OCwgNTAuNzM0MF0sCiAgICAicmFkaXVzIjogNDAwMDAwCiAgfQotLS0KRk9SIHN0YXJ0Q2l0eSBJTiBnZXJtYW5DaXR5CiAgRklMVEVSIEdFT19ESVNUQU5DRShAYm9ubiwgc3RhcnRDaXR5Lmdlb21ldHJ5KSA8IEByYWRpdXMKICAgIEZPUiB2LCBlLCBwIElOIDEuLjEgT1VUQk9VTkQgc3RhcnRDaXR5CiAgICAgIEdSQVBIICdyb3V0ZXBsYW5uZXInCiAgICBSRVRVUk4ge3N0YXJ0Y2l0eTogc3RhcnRDaXR5Ll9rZXksIHRyYXZlcnNlZENpdHk6IHYuX2tleX0=", + "response": "eyJpbnB1dCI6IkZPUiBzdGFydENpdHkgSU4gZ2VybWFuQ2l0eVxuICBGSUxURVIgR0VPX0RJU1RBTkNFKEBib25uLCBzdGFydENpdHkuZ2VvbWV0cnkpIFx1MDAzYyBAcmFkaXVzXG4gICAgRk9SIHYsIGUsIHAgSU4gMS4uMSBPVVRCT1VORCBzdGFydENpdHlcbiAgICAgIEdSQVBIICdyb3V0ZXBsYW5uZXInXG4gICAgUkVUVVJOIHtzdGFydGNpdHk6IHN0YXJ0Q2l0eS5fa2V5LCB0cmF2ZXJzZWRDaXR5OiB2Ll9rZXl9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInN0YXJ0Y2l0eVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwidHJhdmVyc2VkQ2l0eVwiIDogXCJQYXJpc1wiIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0Y2l0eVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwidHJhdmVyc2VkQ2l0eVwiIDogXCJMeW9uXCIgXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRjaXR5XCIgOiBcIkhhbWJ1cmdcIiwgXG4gICAgXCJ0cmF2ZXJzZWRDaXR5XCIgOiBcIkx5b25cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydGNpdHlcIiA6IFwiSGFtYnVyZ1wiLCBcbiAgICBcInRyYXZlcnNlZENpdHlcIiA6IFwiUGFyaXNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydGNpdHlcIiA6IFwiSGFtYnVyZ1wiLCBcbiAgICBcInRyYXZlcnNlZENpdHlcIiA6IFwiQ29sb2duZVwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJDT01CSU5JTkdfR1JBUEhfMDRfY29tYmluZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJiaW5kVmFycyI6eyJib25uIjpbNy4wOTk4LDUwLjczNF0sInJhZGl1cyI6NDAwMDAwfSwiZGF0YXNldCI6InJvdXRlcGxhbm5lciJ9fQo=" + }, + "COMBINING_GRAPH_05_combine_let_single": { + "request": "LS0tCm5hbWU6IENPTUJJTklOR19HUkFQSF8wNV9jb21iaW5lX2xldApkZXNjcmlwdGlvbjogJycKZGF0YXNldDogcm91dGVwbGFubmVyCmJpbmRWYXJzOiAKICB7CiAgICAiYm9ubiI6IFs3LjA5OTgsIDUwLjczNDBdLAogICAgInJhZGl1cyI6IDQwMDAwMAogIH0KLS0tCkZPUiBzdGFydENpdHkgSU4gZ2VybWFuQ2l0eQogIEZJTFRFUiBHRU9fRElTVEFOQ0UoQGJvbm4sIHN0YXJ0Q2l0eS5nZW9tZXRyeSkgPCBAcmFkaXVzCiAgICBMRVQgb25lQ2l0eSA9ICgKICAgICAgRk9SIHYsIGUsIHAgSU4gMS4uMSBPVVRCT1VORCBzdGFydENpdHkKICAgICAgICBHUkFQSCAncm91dGVwbGFubmVyJyBSRVRVUk4gdi5fa2V5CiAgICApCiAgICAgIFJFVFVSTiB7c3RhcnRDaXR5OiBzdGFydENpdHkuX2tleSwgY29ubmVjdGVkQ2l0aWVzOiBvbmVDaXR5fQ==", + "response": "eyJpbnB1dCI6IkZPUiBzdGFydENpdHkgSU4gZ2VybWFuQ2l0eVxuICBGSUxURVIgR0VPX0RJU1RBTkNFKEBib25uLCBzdGFydENpdHkuZ2VvbWV0cnkpIFx1MDAzYyBAcmFkaXVzXG4gICAgTEVUIG9uZUNpdHkgPSAoXG4gICAgICBGT1IgdiwgZSwgcCBJTiAxLi4xIE9VVEJPVU5EIHN0YXJ0Q2l0eVxuICAgICAgICBHUkFQSCAncm91dGVwbGFubmVyJyBSRVRVUk4gdi5fa2V5XG4gICAgKVxuICAgICAgUkVUVVJOIHtzdGFydENpdHk6IHN0YXJ0Q2l0eS5fa2V5LCBjb25uZWN0ZWRDaXRpZXM6IG9uZUNpdHl9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInN0YXJ0Q2l0eVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwiY29ubmVjdGVkQ2l0aWVzXCIgOiBbIFxuICAgICAgXCJQYXJpc1wiLCBcbiAgICAgIFwiTHlvblwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRDaXR5XCIgOiBcIkhhbWJ1cmdcIiwgXG4gICAgXCJjb25uZWN0ZWRDaXRpZXNcIiA6IFsgXG4gICAgICBcIkx5b25cIiwgXG4gICAgICBcIlBhcmlzXCIsIFxuICAgICAgXCJDb2xvZ25lXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQ09NQklOSU5HX0dSQVBIXzA1X2NvbWJpbmVfbGV0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImJpbmRWYXJzIjp7ImJvbm4iOls3LjA5OTgsNTAuNzM0XSwicmFkaXVzIjo0MDAwMDB9LCJkYXRhc2V0Ijoicm91dGVwbGFubmVyIn19Cg==" + }, + "COMBINING_GRAPH_06_cleanup_single": { + "request": "LS0tCm5hbWU6IENPTUJJTklOR19HUkFQSF8wNl9jbGVhbnVwCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7Cn52YXIgZyA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6ImV4YW1wbGVzLmRyb3BHcmFwaChcInJvdXRlcGxhbm5lclwiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiQ09NQklOSU5HX0dSQVBIXzA2X2NsZWFudXAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "EDGCOL_02_Relation_single": { + "request": "LS0tCm5hbWU6IEVER0NPTF8wMl9SZWxhdGlvbgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciB2Y29sbCA9IGRiLl9jcmVhdGUoInZlcnRleCIpOwp2YXIgZWNvbGwgPSBkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oInJlbGF0aW9uIik7CnZhciBteUdyYXBoID0ge307Cm15R3JhcGgudjEgPSBkYi52ZXJ0ZXguaW5zZXJ0KHsgbmFtZSA6ICJ2ZXJ0ZXggMSIgfSk7Cm15R3JhcGgudjIgPSBkYi52ZXJ0ZXguaW5zZXJ0KHsgbmFtZSA6ICJ2ZXJ0ZXggMiIgfSk7Cm15R3JhcGguZTEgPSBkYi5yZWxhdGlvbi5pbnNlcnQobXlHcmFwaC52MSwgbXlHcmFwaC52MiwgeyBsYWJlbCA6ICJrbm93cyJ9KTsKZGIuX2RvY3VtZW50KG15R3JhcGguZTEpOwpkYi5yZWxhdGlvbi5lZGdlcyhteUdyYXBoLmUxLl9pZCk7Cn5kYi5fZHJvcCgicmVsYXRpb24iKTsKfmRiLl9kcm9wKCJ2ZXJ0ZXgiKTs=", + "response": "eyJpbnB1dCI6InZhciB2Y29sbCA9IGRiLl9jcmVhdGUoXCJ2ZXJ0ZXhcIik7XG52YXIgZWNvbGwgPSBkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oXCJyZWxhdGlvblwiKTtcbnZhciBteUdyYXBoID0ge307XG5teUdyYXBoLnYxID0gZGIudmVydGV4Lmluc2VydCh7IG5hbWUgOiBcInZlcnRleCAxXCIgfSk7XG5teUdyYXBoLnYyID0gZGIudmVydGV4Lmluc2VydCh7IG5hbWUgOiBcInZlcnRleCAyXCIgfSk7XG5teUdyYXBoLmUxID0gZGIucmVsYXRpb24uaW5zZXJ0KG15R3JhcGgudjEsIG15R3JhcGgudjIsIHsgbGFiZWwgOiBcImtub3dzXCJ9KTtcbmRiLl9kb2N1bWVudChteUdyYXBoLmUxKTtcbmRiLnJlbGF0aW9uLmVkZ2VzKG15R3JhcGguZTEuX2lkKTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJ2ZXJ0ZXgvNzMwOTVcIiwgXG4gIFwiX2tleVwiIDogXCI3MzA5NVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0U2LS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcInZlcnRleC83MzA5N1wiLCBcbiAgXCJfa2V5XCIgOiBcIjczMDk3XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTRi0tLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzMwOTlcIiwgXG4gIFwiX2tleVwiIDogXCI3MzA5OVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0YtLS1fXCIgXG59XG5cbnsgXG4gIFwiX2tleVwiIDogXCI3MzA5OVwiLCBcbiAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzMwOTlcIiwgXG4gIFwiX2Zyb21cIiA6IFwidmVydGV4LzczMDk1XCIsIFxuICBcIl90b1wiIDogXCJ2ZXJ0ZXgvNzMwOTdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNGLS0tX1wiLCBcbiAgXCJsYWJlbFwiIDogXCJrbm93c1wiIFxufVxuXG5bIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiRURHQ09MXzAyX1JlbGF0aW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "EDGCOL_02_inEdges_single": { + "request": "LS0tCm5hbWU6IEVER0NPTF8wMl9pbkVkZ2VzCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHZjb2xsID0gZGIuX2NyZWF0ZSgidmVydGV4Iik7CnZhciBlY29sbCA9IGRiLl9jcmVhdGVFZGdlQ29sbGVjdGlvbigicmVsYXRpb24iKTsKdmFyIG15R3JhcGggPSB7fTsKbXlHcmFwaC52MSA9IGRiLnZlcnRleC5pbnNlcnQoeyBuYW1lIDogInZlcnRleCAxIiB9KTsKbXlHcmFwaC52MiA9IGRiLnZlcnRleC5pbnNlcnQoeyBuYW1lIDogInZlcnRleCAyIiB9KTsKbXlHcmFwaC5lMSA9IGRiLnJlbGF0aW9uLmluc2VydChteUdyYXBoLnYxLCBteUdyYXBoLnYyLCB7IGxhYmVsIDogImtub3dzIn0pOwpkYi5fZG9jdW1lbnQobXlHcmFwaC5lMSk7CmRiLnJlbGF0aW9uLmluRWRnZXMobXlHcmFwaC52MS5faWQpOwpkYi5yZWxhdGlvbi5pbkVkZ2VzKG15R3JhcGgudjIuX2lkKTsKfmRiLl9kcm9wKCJyZWxhdGlvbiIpOwp+ZGIuX2Ryb3AoInZlcnRleCIpOw==", + "response": "eyJpbnB1dCI6InZhciB2Y29sbCA9IGRiLl9jcmVhdGUoXCJ2ZXJ0ZXhcIik7XG52YXIgZWNvbGwgPSBkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oXCJyZWxhdGlvblwiKTtcbnZhciBteUdyYXBoID0ge307XG5teUdyYXBoLnYxID0gZGIudmVydGV4Lmluc2VydCh7IG5hbWUgOiBcInZlcnRleCAxXCIgfSk7XG5teUdyYXBoLnYyID0gZGIudmVydGV4Lmluc2VydCh7IG5hbWUgOiBcInZlcnRleCAyXCIgfSk7XG5teUdyYXBoLmUxID0gZGIucmVsYXRpb24uaW5zZXJ0KG15R3JhcGgudjEsIG15R3JhcGgudjIsIHsgbGFiZWwgOiBcImtub3dzXCJ9KTtcbmRiLl9kb2N1bWVudChteUdyYXBoLmUxKTtcbmRiLnJlbGF0aW9uLmluRWRnZXMobXlHcmFwaC52MS5faWQpO1xuZGIucmVsYXRpb24uaW5FZGdlcyhteUdyYXBoLnYyLl9pZCk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwidmVydGV4LzczMTE4XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMxMThcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNHVy0tX1wiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJ2ZXJ0ZXgvNzMxMjBcIiwgXG4gIFwiX2tleVwiIDogXCI3MzEyMFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0dXLS1BXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcInJlbGF0aW9uLzczMTIyXCIsIFxuICBcIl9rZXlcIiA6IFwiNzMxMjJcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNHVy0tQlwiIFxufVxuXG57IFxuICBcIl9rZXlcIiA6IFwiNzMxMjJcIiwgXG4gIFwiX2lkXCIgOiBcInJlbGF0aW9uLzczMTIyXCIsIFxuICBcIl9mcm9tXCIgOiBcInZlcnRleC83MzExOFwiLCBcbiAgXCJfdG9cIiA6IFwidmVydGV4LzczMTIwXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTR1ctLUJcIiwgXG4gIFwibGFiZWxcIiA6IFwia25vd3NcIiBcbn1cblxuWyBdXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczMTIyXCIsIFxuICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzczMTIyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwidmVydGV4LzczMTE4XCIsIFxuICAgIFwiX3RvXCIgOiBcInZlcnRleC83MzEyMFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FTR1ctLUJcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJrbm93c1wiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJFREdDT0xfMDJfaW5FZGdlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "EDGCOL_02_outEdges_single": { + "request": "LS0tCm5hbWU6IEVER0NPTF8wMl9vdXRFZGdlcwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciB2Y29sbCA9IGRiLl9jcmVhdGUoInZlcnRleCIpOwp2YXIgZWNvbGwgPSBkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oInJlbGF0aW9uIik7CnZhciBteUdyYXBoID0ge307Cm15R3JhcGgudjEgPSBkYi52ZXJ0ZXguaW5zZXJ0KHsgbmFtZSA6ICJ2ZXJ0ZXggMSIgfSk7Cm15R3JhcGgudjIgPSBkYi52ZXJ0ZXguaW5zZXJ0KHsgbmFtZSA6ICJ2ZXJ0ZXggMiIgfSk7Cm15R3JhcGguZTEgPSBkYi5yZWxhdGlvbi5pbnNlcnQobXlHcmFwaC52MSwgbXlHcmFwaC52MiwgeyBsYWJlbCA6ICJrbm93cyJ9KTsKZGIuX2RvY3VtZW50KG15R3JhcGguZTEpOwpkYi5yZWxhdGlvbi5vdXRFZGdlcyhteUdyYXBoLnYxLl9pZCk7CmRiLnJlbGF0aW9uLm91dEVkZ2VzKG15R3JhcGgudjIuX2lkKTsKfmRiLl9kcm9wKCJyZWxhdGlvbiIpOwp+ZGIuX2Ryb3AoInZlcnRleCIpOw==", + "response": "eyJpbnB1dCI6InZhciB2Y29sbCA9IGRiLl9jcmVhdGUoXCJ2ZXJ0ZXhcIik7XG52YXIgZWNvbGwgPSBkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oXCJyZWxhdGlvblwiKTtcbnZhciBteUdyYXBoID0ge307XG5teUdyYXBoLnYxID0gZGIudmVydGV4Lmluc2VydCh7IG5hbWUgOiBcInZlcnRleCAxXCIgfSk7XG5teUdyYXBoLnYyID0gZGIudmVydGV4Lmluc2VydCh7IG5hbWUgOiBcInZlcnRleCAyXCIgfSk7XG5teUdyYXBoLmUxID0gZGIucmVsYXRpb24uaW5zZXJ0KG15R3JhcGgudjEsIG15R3JhcGgudjIsIHsgbGFiZWwgOiBcImtub3dzXCJ9KTtcbmRiLl9kb2N1bWVudChteUdyYXBoLmUxKTtcbmRiLnJlbGF0aW9uLm91dEVkZ2VzKG15R3JhcGgudjEuX2lkKTtcbmRiLnJlbGF0aW9uLm91dEVkZ2VzKG15R3JhcGgudjIuX2lkKTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJ2ZXJ0ZXgvNzMxNDNcIiwgXG4gIFwiX2tleVwiIDogXCI3MzE0M1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0lTLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcInZlcnRleC83MzE0NVwiLCBcbiAgXCJfa2V5XCIgOiBcIjczMTQ1XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTSVMtLUFcIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzMxNDdcIiwgXG4gIFwiX2tleVwiIDogXCI3MzE0N1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0lXLS0tXCIgXG59XG5cbnsgXG4gIFwiX2tleVwiIDogXCI3MzE0N1wiLCBcbiAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzMxNDdcIiwgXG4gIFwiX2Zyb21cIiA6IFwidmVydGV4LzczMTQzXCIsIFxuICBcIl90b1wiIDogXCJ2ZXJ0ZXgvNzMxNDVcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNJVy0tLVwiLCBcbiAgXCJsYWJlbFwiIDogXCJrbm93c1wiIFxufVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzE0N1wiLCBcbiAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83MzE0N1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcInZlcnRleC83MzE0M1wiLCBcbiAgICBcIl90b1wiIDogXCJ2ZXJ0ZXgvNzMxNDVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhU0lXLS0tXCIsIFxuICAgIFwibGFiZWxcIiA6IFwia25vd3NcIiBcbiAgfSBcbl1cblxuWyBdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkVER0NPTF8wMl9vdXRFZGdlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "FUNCTION_DOCUMENT_10_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzEwCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrbm93c19ncmFwaApiaW5kVmFyczogCiAgewogICAgImtleXMiOiBbInBlcnNvbnMvYWxpY2UiLCAicGVyc29ucy9ib2IiXQogIH0KLS0tClJFVFVSTiBET0NVTUVOVCggQGtleXMgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggQGtleXMgKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYWxpY2VcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M1pZSC0tLS1cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYm9iXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNaWUhDLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgIH0gXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkZVTkNUSU9OX0RPQ1VNRU5UXzEwIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImJpbmRWYXJzIjp7ImtleXMiOlsicGVyc29ucy9hbGljZSIsInBlcnNvbnMvYm9iIl19LCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "FUNCTION_DOCUMENT_11_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzExCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrbm93c19ncmFwaApiaW5kVmFyczogCiAgewogICAgImtleSI6ICJib2IiCiAgfQotLS0KUkVUVVJOIERPQ1VNRU5UKCBDT05DQVQoInBlcnNvbnMvIiwgQGtleSkgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggQ09OQ0FUKFwicGVyc29ucy9cIiwgQGtleSkgKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICBcIl9pZFwiIDogXCJwZXJzb25zL2JvYlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZSGUtLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJGVU5DVElPTl9ET0NVTUVOVF8xMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJiaW5kVmFycyI6eyJrZXkiOiJib2IifSwiZGF0YXNldCI6Imtub3dzX2dyYXBoIn19Cg==" + }, + "FUNCTION_DOCUMENT_1_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzEKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCi0tLQpSRVRVUk4gRE9DVU1FTlQoIHBlcnNvbnMsICJwZXJzb25zL2FsaWNlIiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggcGVyc29ucywgXCJwZXJzb25zL2FsaWNlXCIgKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYWxpY2VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWUI2LS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJGVU5DVElPTl9ET0NVTUVOVF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrbm93c19ncmFwaCJ9fQo=" + }, + "FUNCTION_DOCUMENT_2_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzIKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCi0tLQpSRVRVUk4gRE9DVU1FTlQoIHBlcnNvbnMsICJhbGljZSIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggcGVyc29ucywgXCJhbGljZVwiICkiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICBcIl9pZFwiIDogXCJwZXJzb25zL2FsaWNlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWllDYS0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiRlVOQ1RJT05fRE9DVU1FTlRfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "FUNCTION_DOCUMENT_3_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzMKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCi0tLQpSRVRVUk4gRE9DVU1FTlQoIHBlcnNvbnMsIFsgInBlcnNvbnMvYWxpY2UiLCAicGVyc29ucy9ib2IiIF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggcGVyc29ucywgWyBcInBlcnNvbnMvYWxpY2VcIiwgXCJwZXJzb25zL2JvYlwiIF0gKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYWxpY2VcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M1pZQzItLS1cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYm9iXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNaWUMyLS1fXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgIH0gXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkZVTkNUSU9OX0RPQ1VNRU5UXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6Imtub3dzX2dyYXBoIn19Cg==" + }, + "FUNCTION_DOCUMENT_4_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzQKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCi0tLQpSRVRVUk4gRE9DVU1FTlQoIHBlcnNvbnMsIFsgImFsaWNlIiwgImJvYiIgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggcGVyc29ucywgWyBcImFsaWNlXCIsIFwiYm9iXCIgXSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwicGVyc29ucy9hbGljZVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzWllEUy0tQVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIl9rZXlcIiA6IFwiYm9iXCIsIFxuICAgICAgXCJfaWRcIiA6IFwicGVyc29ucy9ib2JcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M1pZRFctLS1cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQm9iXCIgXG4gICAgfSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiRlVOQ1RJT05fRE9DVU1FTlRfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "FUNCTION_DOCUMENT_5_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzUKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCmJpbmRWYXJzOiAKICB7CiAgICAiQGNvbGwiOiAicGVyc29ucyIsCiAgICAia2V5IjogImFsaWNlIgogIH0KLS0tClJFVFVSTiBET0NVTUVOVCggQEBjb2xsLCBAa2V5ICkg", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggQEBjb2xsLCBAa2V5ICkgIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgXCJfaWRcIiA6IFwicGVyc29ucy9hbGljZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZRUstLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkZVTkNUSU9OX0RPQ1VNRU5UXzUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiYmluZFZhcnMiOnsiQGNvbGwiOiJwZXJzb25zIiwia2V5IjoiYWxpY2UifSwiZGF0YXNldCI6Imtub3dzX2dyYXBoIn19Cg==" + }, + "FUNCTION_DOCUMENT_6_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzYKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCmJpbmRWYXJzOiAKICB7CiAgICAiQGNvbGwiOiAicGVyc29ucyIsCiAgICAia2V5cyI6IFsiYWxpY2UiLCAiYm9iIl0KICB9Ci0tLQpSRVRVUk4gRE9DVU1FTlQoIEBAY29sbCwgQGtleXMgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggQEBjb2xsLCBAa2V5cyApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwicGVyc29ucy9hbGljZVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzWllFcS0tLVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIl9rZXlcIiA6IFwiYm9iXCIsIFxuICAgICAgXCJfaWRcIiA6IFwicGVyc29ucy9ib2JcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M1pZRXEtLV9cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQm9iXCIgXG4gICAgfSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiRlVOQ1RJT05fRE9DVU1FTlRfNiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJiaW5kVmFycyI6eyJAY29sbCI6InBlcnNvbnMiLCJrZXlzIjpbImFsaWNlIiwiYm9iIl19LCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "FUNCTION_DOCUMENT_7_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzcKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCi0tLQpSRVRVUk4gRE9DVU1FTlQoInBlcnNvbnMvYWxpY2UiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVChcInBlcnNvbnMvYWxpY2VcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICBcIl9pZFwiIDogXCJwZXJzb25zL2FsaWNlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWllGRy0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiRlVOQ1RJT05fRE9DVU1FTlRfNyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "FUNCTION_DOCUMENT_8_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzgKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCi0tLQpSRVRVUk4gRE9DVU1FTlQoIFsgInBlcnNvbnMvYWxpY2UiLCAicGVyc29ucy9ib2IiIF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggWyBcInBlcnNvbnMvYWxpY2VcIiwgXCJwZXJzb25zL2JvYlwiIF0gKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYWxpY2VcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M1pZRnEtLS1cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInBlcnNvbnMvYm9iXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNaWUZ1LS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgIH0gXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkZVTkNUSU9OX0RPQ1VNRU5UXzgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6Imtub3dzX2dyYXBoIn19Cg==" + }, + "FUNCTION_DOCUMENT_9_single": { + "request": "LS0tCm5hbWU6IEZVTkNUSU9OX0RPQ1VNRU5UXzkKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtub3dzX2dyYXBoCmJpbmRWYXJzOiAKICB7CiAgICAia2V5IjogInBlcnNvbnMvYWxpY2UiCiAgfQotLS0KUkVUVVJOIERPQ1VNRU5UKCBAa2V5ICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBET0NVTUVOVCggQGtleSApIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgXCJfaWRcIiA6IFwicGVyc29ucy9hbGljZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZR08tLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkZVTkNUSU9OX0RPQ1VNRU5UXzkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiYmluZFZhcnMiOnsia2V5IjoicGVyc29ucy9hbGljZSJ9LCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "GRAPHASP_01_Carlisle_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIQVNQXzAxX0Nhcmxpc2xlX3RvX0xvbmRvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHYsIGUgSU4gT1VUQk9VTkQgU0hPUlRFU1RfUEFUSCAncGxhY2VzL0Nhcmxpc2xlJyBUTyAncGxhY2VzL0xvbmRvbicKR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnCiAgUkVUVVJOIHsgcGxhY2U6IHYubGFiZWwgfQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlIElOIE9VVEJPVU5EIFNIT1JURVNUX1BBVEggJ3BsYWNlcy9DYXJsaXNsZScgVE8gJ3BsYWNlcy9Mb25kb24nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgUkVUVVJOIHsgcGxhY2U6IHYubGFiZWwgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJwbGFjZVwiIDogXCJDYXJsaXNsZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlXCIgOiBcIllvcmtcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJwbGFjZVwiIDogXCJMb25kb25cIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhBU1BfMDFfQ2FybGlzbGVfdG9fTG9uZG9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHASP_01_create_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIQVNQXzAxX2NyZWF0ZV9ncmFwaApkZXNjcmlwdGlvbjogJycKLS0tCn5hZGRJZ25vcmVDb2xsZWN0aW9uKCJwbGFjZXMiKTsKfmFkZElnbm9yZUNvbGxlY3Rpb24oImNvbm5lY3Rpb25zIik7CnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgia1Nob3J0ZXN0UGF0aHNHcmFwaCIpOwpkYi5wbGFjZXMudG9BcnJheSgpOwpkYi5jb25uZWN0aW9ucy50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcImtTaG9ydGVzdFBhdGhzR3JhcGhcIik7XG5kYi5wbGFjZXMudG9BcnJheSgpO1xuZGIuY29ubmVjdGlvbnMudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkludmVybmVzc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3Vy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkludmVybmVzc1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQWJlcmRlZW5cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3Vy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkFiZXJkZWVuXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJMZXVjaGFyc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdXLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiTGV1Y2hhcnNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlN0QW5kcmV3c1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3YS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIlN0QW5kcmV3c1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRWRpbmJ1cmdoXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdhLS1fXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiRWRpbmJ1cmdoXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJHbGFzZ293XCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3YS0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkdsYXNnb3dcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIllvcmtcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdhLS1CXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiWW9ya1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQ2FybGlzbGVcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3YS0tQ1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNhcmxpc2xlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCaXJtaW5naGFtXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3YS0tRFwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJpcm1pbmdoYW1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkxvbmRvblwiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3YS0tRVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkxvbmRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQnJ1c3NlbHNcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3ZS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJydXNzZWxzXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3ZS0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNvbG9nbmVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlRvcm9udG9cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Rvcm9udG9cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdlLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiVG9yb250b1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiV2lubmlwZWdcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3ZS0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIldpbm5pcGVnXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJTYXNrYXRvb25cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN2UtLUNcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJTYXNrYXRvb25cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVkbW9udG9uXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN2UtLURcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJFZG1vbnRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSmFzcGVyXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9KYXNwZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdlLS1FXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiSmFzcGVyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJWYW5jb3V2ZXJcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1ZhbmNvdXZlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN2UtLUZcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJWYW5jb3V2ZXJcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NDRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NDRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN2ktLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NDZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NDZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQWJlcmRlZW5cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0ludmVybmVzc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN2ktLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc0OFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc0OFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdpLS1BXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMS41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3aS0tQlwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc1MlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc1MlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3aS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzU0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzU0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdpLS1EXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMyBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzU2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzU2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN20tLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NThcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NThcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3bS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc2MFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc2MFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdtLS1BXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMy41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NjJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NjJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3bS0tQlwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDQgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc2NFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc2NFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN20tLUNcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NjZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NjZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQ2FybGlzbGVcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0dsYXNnb3dcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTdtLS1EXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzY4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzY4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Zb3JrXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3cS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzcwXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzcwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3cS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzcyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzcyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3cS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc3NFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc3NFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3EtLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3NzZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3NzZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3cS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzc4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzc4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3EtLURcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc4MFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc4MFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3cS0tRVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDAuMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzgyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzgyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1N0QW5kcmV3c1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTd1LS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMC4yIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3ODRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3ODRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3dS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuOCBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzg2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzg2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3UtLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI3ODhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI3ODhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3UtLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc5MFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc5MFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3dS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzkyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzkyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3dS0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc5NFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc5NFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3UtLUVcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mjc5NlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mjc5NlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9XaW5uaXBlZ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3ktLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzNiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyNzk4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyNzk4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3eS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDM1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI4MDBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI4MDBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZN3ktLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyODAyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyODAyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTd5LS1CXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYyODA0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYyODA0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTd5LS1DXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MjgwNlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MjgwNlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU2Fza2F0b29uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlk3eS0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDE3IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI4MDhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI4MDhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZNzItLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA2IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI4MTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI4MTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZNzItLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjI4MTJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjI4MTJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWTcyLS1BXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MjgxNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MjgxNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pZNzItLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMyBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhBU1BfMDFfY3JlYXRlX2dyYXBoIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "GRAPHASP_02_Carlisle_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIQVNQXzAyX0Nhcmxpc2xlX3RvX0xvbmRvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHAgSU4gT1VUQk9VTkQgQUxMX1NIT1JURVNUX1BBVEhTICdwbGFjZXMvQ2FybGlzbGUnIFRPICdwbGFjZXMvTG9uZG9uJwpHUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCcKICBSRVRVUk4geyBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWwgfQ==", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEFMTF9TSE9SVEVTVF9QQVRIUyAncGxhY2VzL0Nhcmxpc2xlJyBUTyAncGxhY2VzL0xvbmRvbidcbkdSQVBIICdrU2hvcnRlc3RQYXRoc0dyYXBoJ1xuICBSRVRVUk4geyBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWwgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJwbGFjZXNcIiA6IFsgXG4gICAgICBcIkNhcmxpc2xlXCIsIFxuICAgICAgXCJZb3JrXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlc1wiIDogWyBcbiAgICAgIFwiQ2FybGlzbGVcIiwgXG4gICAgICBcIkJpcm1pbmdoYW1cIiwgXG4gICAgICBcIkxvbmRvblwiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIQVNQXzAyX0Nhcmxpc2xlX3RvX0xvbmRvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia1Nob3J0ZXN0UGF0aHNHcmFwaCJ9fQo=" + }, + "GRAPHASP_03_Carlisle_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIQVNQXzAzX0Nhcmxpc2xlX3RvX0xvbmRvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHAgSU4gT1VUQk9VTkQgS19TSE9SVEVTVF9QQVRIUyAncGxhY2VzL0Nhcmxpc2xlJyBUTyAncGxhY2VzL0xvbmRvbicKR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnCiAgUkVUVVJOIHsgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsIH0=", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEtfU0hPUlRFU1RfUEFUSFMgJ3BsYWNlcy9DYXJsaXNsZScgVE8gJ3BsYWNlcy9Mb25kb24nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgUkVUVVJOIHsgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsIH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwicGxhY2VzXCIgOiBbIFxuICAgICAgXCJDYXJsaXNsZVwiLCBcbiAgICAgIFwiWW9ya1wiLCBcbiAgICAgIFwiTG9uZG9uXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJwbGFjZXNcIiA6IFsgXG4gICAgICBcIkNhcmxpc2xlXCIsIFxuICAgICAgXCJCaXJtaW5naGFtXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlc1wiIDogWyBcbiAgICAgIFwiQ2FybGlzbGVcIiwgXG4gICAgICBcIkdsYXNnb3dcIiwgXG4gICAgICBcIkVkaW5idXJnaFwiLCBcbiAgICAgIFwiWW9ya1wiLCBcbiAgICAgIFwiTG9uZG9uXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhBU1BfMDNfQ2FybGlzbGVfdG9fTG9uZG9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHASP_04_Carlisle_to_Toronto_single": { + "request": "LS0tCm5hbWU6IEdSQVBIQVNQXzA0X0Nhcmxpc2xlX3RvX1Rvcm9udG8KZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiBwIElOIE9VVEJPVU5EIEFMTF9TSE9SVEVTVF9QQVRIUyAncGxhY2VzL0Nhcmxpc2xlJyBUTyAncGxhY2VzL1Rvcm9udG8nCkdSQVBIICdrU2hvcnRlc3RQYXRoc0dyYXBoJwogIFJFVFVSTiB7CiAgICBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWwKICB9", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEFMTF9TSE9SVEVTVF9QQVRIUyAncGxhY2VzL0Nhcmxpc2xlJyBUTyAncGxhY2VzL1Rvcm9udG8nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgUkVUVVJOIHtcbiAgICBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWxcbiAgfSIsIm91dHB1dCI6IlsgXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSEFTUF8wNF9DYXJsaXNsZV90b19Ub3JvbnRvIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHASP_99_drop_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIQVNQXzk5X2Ryb3BfZ3JhcGgKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwpleGFtcGxlcy5kcm9wR3JhcGgoImtTaG9ydGVzdFBhdGhzR3JhcGgiKTsKfnJlbW92ZUlnbm9yZUNvbGxlY3Rpb24oInBsYWNlcyIpOwp+cmVtb3ZlSWdub3JlQ29sbGVjdGlvbigiY29ubmVjdGlvbnMiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcImtTaG9ydGVzdFBhdGhzR3JhcGhcIik7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIQVNQXzk5X2Ryb3BfZ3JhcGgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHKP_01_Aberdeen_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1BfMDFfQWJlcmRlZW5fdG9fTG9uZG9uCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrU2hvcnRlc3RQYXRoc0dyYXBoCi0tLQpGT1IgcCBJTiAxLi4xMCBPVVRCT1VORCBLX1BBVEhTICdwbGFjZXMvQWJlcmRlZW4nIFRPICdwbGFjZXMvTG9uZG9uJwpHUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCcKICAgIFJFVFVSTiB7IHBsYWNlczogcC52ZXJ0aWNlc1sqXS5sYWJlbCwgdHJhdmVsVGltZXM6IHAuZWRnZXNbKl0udHJhdmVsVGltZSB9", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIDEuLjEwIE9VVEJPVU5EIEtfUEFUSFMgJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Mb25kb24nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgICBSRVRVUk4geyBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWwsIHRyYXZlbFRpbWVzOiBwLmVkZ2VzWypdLnRyYXZlbFRpbWUgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJwbGFjZXNcIiA6IFsgXG4gICAgICBcIkFiZXJkZWVuXCIsIFxuICAgICAgXCJMZXVjaGFyc1wiLCBcbiAgICAgIFwiRWRpbmJ1cmdoXCIsIFxuICAgICAgXCJZb3JrXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVzXCIgOiBbIFxuICAgICAgMS41LCBcbiAgICAgIDEuNSwgXG4gICAgICAzLjUsIFxuICAgICAgMS44IFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwicGxhY2VzXCIgOiBbIFxuICAgICAgXCJBYmVyZGVlblwiLCBcbiAgICAgIFwiTGV1Y2hhcnNcIiwgXG4gICAgICBcIkVkaW5idXJnaFwiLCBcbiAgICAgIFwiR2xhc2dvd1wiLCBcbiAgICAgIFwiQ2FybGlzbGVcIiwgXG4gICAgICBcIkJpcm1pbmdoYW1cIiwgXG4gICAgICBcIkxvbmRvblwiIFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZXNcIiA6IFsgXG4gICAgICAxLjUsIFxuICAgICAgMS41LCBcbiAgICAgIDEsIFxuICAgICAgMSwgXG4gICAgICAyLCBcbiAgICAgIDEuNSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlc1wiIDogWyBcbiAgICAgIFwiQWJlcmRlZW5cIiwgXG4gICAgICBcIkxldWNoYXJzXCIsIFxuICAgICAgXCJFZGluYnVyZ2hcIiwgXG4gICAgICBcIkdsYXNnb3dcIiwgXG4gICAgICBcIkNhcmxpc2xlXCIsIFxuICAgICAgXCJZb3JrXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVzXCIgOiBbIFxuICAgICAgMS41LCBcbiAgICAgIDEuNSwgXG4gICAgICAxLCBcbiAgICAgIDEsIFxuICAgICAgMi41LCBcbiAgICAgIDEuOCBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlc1wiIDogWyBcbiAgICAgIFwiQWJlcmRlZW5cIiwgXG4gICAgICBcIkxldWNoYXJzXCIsIFxuICAgICAgXCJFZGluYnVyZ2hcIiwgXG4gICAgICBcIllvcmtcIiwgXG4gICAgICBcIkNhcmxpc2xlXCIsIFxuICAgICAgXCJCaXJtaW5naGFtXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVzXCIgOiBbIFxuICAgICAgMS41LCBcbiAgICAgIDEuNSwgXG4gICAgICAzLjUsIFxuICAgICAgMy41LCBcbiAgICAgIDIsIFxuICAgICAgMS41IFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIS1BfMDFfQWJlcmRlZW5fdG9fTG9uZG9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHKP_01_create_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1BfMDFfY3JlYXRlX2dyYXBoCmRlc2NyaXB0aW9uOiAnJwotLS0KfmFkZElnbm9yZUNvbGxlY3Rpb24oInBsYWNlcyIpOwp+YWRkSWdub3JlQ29sbGVjdGlvbigiY29ubmVjdGlvbnMiKTsKdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJrU2hvcnRlc3RQYXRoc0dyYXBoIik7CmRiLnBsYWNlcy50b0FycmF5KCk7CmRiLmNvbm5lY3Rpb25zLnRvQXJyYXkoKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcImtTaG9ydGVzdFBhdGhzR3JhcGhcIik7XG5kYi5wbGFjZXMudG9BcnJheSgpO1xuZGIuY29ubmVjdGlvbnMudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkludmVybmVzc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDRy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkludmVybmVzc1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQWJlcmRlZW5cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDRy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkFiZXJkZWVuXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJMZXVjaGFyc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNHLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiTGV1Y2hhcnNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlN0QW5kcmV3c1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIlN0QW5kcmV3c1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRWRpbmJ1cmdoXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNLLS1fXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiRWRpbmJ1cmdoXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJHbGFzZ293XCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkdsYXNnb3dcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIllvcmtcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNLLS1CXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiWW9ya1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQ2FybGlzbGVcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tQ1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNhcmxpc2xlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCaXJtaW5naGFtXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tRFwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJpcm1pbmdoYW1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkxvbmRvblwiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tRVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkxvbmRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQnJ1c3NlbHNcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tRlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJydXNzZWxzXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDSy0tR1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNvbG9nbmVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlRvcm9udG9cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Rvcm9udG9cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNPLS0tXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiVG9yb250b1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiV2lubmlwZWdcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDTy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIldpbm5pcGVnXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJTYXNrYXRvb25cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ08tLUFcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJTYXNrYXRvb25cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVkbW9udG9uXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ08tLUJcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJFZG1vbnRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSmFzcGVyXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9KYXNwZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNPLS1DXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiSmFzcGVyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJWYW5jb3V2ZXJcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1ZhbmNvdXZlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ08tLURcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJWYW5jb3V2ZXJcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjMzOTRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjMzOTRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ08tLUVcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjMzOTZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjMzOTZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQWJlcmRlZW5cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0ludmVybmVzc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ08tLUZcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzM5OFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzM5OFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNTLS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMS41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MDBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MDBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDUy0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQwMlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQwMlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDUy0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDA0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDA0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNTLS1CXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMyBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDA2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDA2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ1MtLUNcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MDhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MDhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDUy0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQxMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQxMFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNTLS1FXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMy41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MTJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MTJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDVy0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDQgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQxNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQxNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ1ctLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MTZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MTZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQ2FybGlzbGVcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0dsYXNnb3dcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNXLS1BXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDE4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDE4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Zb3JrXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDVy0tQlwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDIwXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDIwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDVy0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDIyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDIyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDVy0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQyNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQyNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2EtLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MjZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MjZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDYS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDI4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDI4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2EtLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQzMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQzMFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDYS0tQlwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDAuMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDMyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDMyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1N0QW5kcmV3c1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNhLS1DXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMC4yIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MzRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MzRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDYS0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuOCBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDM2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDM2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2EtLUVcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0MzhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0MzhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2UtLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQ0MFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQ0MFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDZS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDQyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDQyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDZS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQ0NFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQ0NFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2UtLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQ0NlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQ0NlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9XaW5uaXBlZ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2UtLUNcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzNiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDQ4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDQ4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDZS0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDM1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0NTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0NTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2ktLS1cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDUyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDUyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNpLS1fXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNDU0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNDU0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNpLS1BXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQ1NlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQ1NlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU2Fza2F0b29uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpDaS0tQlwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDE3IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0NThcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0NThcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2ktLUNcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA2IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0NjBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0NjBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ2ktLURcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM0NjJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM0NjJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkNtLS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzQ2NFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzQ2NFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paQ20tLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMyBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhLUF8wMV9jcmVhdGVfZ3JhcGgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHKP_02_Aberdeen_to_Toronto_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1BfMDJfQWJlcmRlZW5fdG9fVG9yb250bwpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHAgSU4gMS4uMTAgT1VUQk9VTkQgS19QQVRIUyAncGxhY2VzL0FiZXJkZWVuJyBUTyAncGxhY2VzL1Rvcm9udG8nCkdSQVBIICdrU2hvcnRlc3RQYXRoc0dyYXBoJwogICAgUkVUVVJOIHsgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsLCB0cmF2ZWxUaW1lczogcC5lZGdlc1sqXS50cmF2ZWxUaW1lIH0=", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIDEuLjEwIE9VVEJPVU5EIEtfUEFUSFMgJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Ub3JvbnRvJ1xuR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnXG4gICAgUkVUVVJOIHsgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsLCB0cmF2ZWxUaW1lczogcC5lZGdlc1sqXS50cmF2ZWxUaW1lIH0iLCJvdXRwdXQiOiJbIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhLUF8wMl9BYmVyZGVlbl90b19Ub3JvbnRvIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHKP_99_drop_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1BfOTlfZHJvcF9ncmFwaApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CmV4YW1wbGVzLmRyb3BHcmFwaCgia1Nob3J0ZXN0UGF0aHNHcmFwaCIpOwp+cmVtb3ZlSWdub3JlQ29sbGVjdGlvbigicGxhY2VzIik7Cn5yZW1vdmVJZ25vcmVDb2xsZWN0aW9uKCJjb25uZWN0aW9ucyIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcImtTaG9ydGVzdFBhdGhzR3JhcGhcIik7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIS1BfOTlfZHJvcF9ncmFwaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "GRAPHKSP_01_Aberdeen_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzAxX0FiZXJkZWVuX3RvX0xvbmRvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHYsIGUgSU4gT1VUQk9VTkQgU0hPUlRFU1RfUEFUSCAncGxhY2VzL0FiZXJkZWVuJyBUTyAncGxhY2VzL0xvbmRvbicKR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnCiAgICBSRVRVUk4geyBwbGFjZTogdi5sYWJlbCwgdHJhdmVsVGltZTogZS50cmF2ZWxUaW1lIH0=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlIElOIE9VVEJPVU5EIFNIT1JURVNUX1BBVEggJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Mb25kb24nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgICBSRVRVUk4geyBwbGFjZTogdi5sYWJlbCwgdHJhdmVsVGltZTogZS50cmF2ZWxUaW1lIH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwicGxhY2VcIiA6IFwiQWJlcmRlZW5cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiBudWxsIFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlXCIgOiBcIkxldWNoYXJzXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMS41IFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlXCIgOiBcIkVkaW5idXJnaFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJwbGFjZVwiIDogXCJZb3JrXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMy41IFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlXCIgOiBcIkxvbmRvblwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuOCBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhLU1BfMDFfQWJlcmRlZW5fdG9fTG9uZG9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHKSP_01_create_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzAxX2NyZWF0ZV9ncmFwaApkZXNjcmlwdGlvbjogJycKLS0tCn5hZGRJZ25vcmVDb2xsZWN0aW9uKCJwbGFjZXMiKTsKfmFkZElnbm9yZUNvbGxlY3Rpb24oImNvbm5lY3Rpb25zIik7CnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgia1Nob3J0ZXN0UGF0aHNHcmFwaCIpOwpkYi5wbGFjZXMudG9BcnJheSgpOwpkYi5jb25uZWN0aW9ucy50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcImtTaG9ydGVzdFBhdGhzR3JhcGhcIik7XG5kYi5wbGFjZXMudG9BcnJheSgpO1xuZGIuY29ubmVjdGlvbnMudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkludmVybmVzc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHaS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkludmVybmVzc1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQWJlcmRlZW5cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHaS0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkFiZXJkZWVuXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJMZXVjaGFyc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkdpLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiTGV1Y2hhcnNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlN0QW5kcmV3c1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHbS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIlN0QW5kcmV3c1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRWRpbmJ1cmdoXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkdtLS1fXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiRWRpbmJ1cmdoXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJHbGFzZ293XCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHbS0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkdsYXNnb3dcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIllvcmtcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkdtLS1CXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiWW9ya1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQ2FybGlzbGVcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHbS0tQ1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNhcmxpc2xlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCaXJtaW5naGFtXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHbS0tRFwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJpcm1pbmdoYW1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkxvbmRvblwiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHbS0tRVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkxvbmRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQnJ1c3NlbHNcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHcS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJydXNzZWxzXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHcS0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNvbG9nbmVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlRvcm9udG9cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Rvcm9udG9cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkdxLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiVG9yb250b1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiV2lubmlwZWdcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHcS0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIldpbm5pcGVnXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJTYXNrYXRvb25cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3EtLUNcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJTYXNrYXRvb25cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVkbW9udG9uXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3EtLURcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJFZG1vbnRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSmFzcGVyXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9KYXNwZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkdxLS1FXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiSmFzcGVyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJWYW5jb3V2ZXJcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1ZhbmNvdXZlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3UtLS1cIiwgXG4gICAgXCJsYWJlbFwiIDogXCJWYW5jb3V2ZXJcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM3ODhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM3ODhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3UtLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM3OTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM3OTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQWJlcmRlZW5cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0ludmVybmVzc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3UtLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mzc5MlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mzc5MlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkd1LS1CXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMS41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM3OTRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM3OTRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHdS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mzc5NlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mzc5NlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHdS0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzNzk4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzNzk4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkd1LS1FXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMyBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODAwXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODAwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3UtLUZcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4MDJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4MDJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHeS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzgwNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzgwNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkd5LS1fXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMy41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4MDZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4MDZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHeS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDQgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzgwOFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzgwOFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paR3ktLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4MTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4MTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQ2FybGlzbGVcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0dsYXNnb3dcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkd5LS1DXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODEyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODEyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Zb3JrXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHeS0tRFwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODE0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODE0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHeS0tRVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODE2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODE2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHMi0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzgxOFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzgxOFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paRzItLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4MjBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4MjBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHMi0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODIyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODIyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paRzItLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzgyNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzgyNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHMi0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDAuMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODI2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODI2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1N0QW5kcmV3c1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkcyLS1EXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMC4yIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4MjhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4MjhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHNi0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuOCBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODMwXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODMwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paRzYtLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4MzJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4MzJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paRzYtLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzgzNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzgzNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHNi0tQlwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODM2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODM2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpHNi0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MzgzOFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82MzgzOFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paRzYtLURcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mzg0MFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mzg0MFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9XaW5uaXBlZ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paRzYtLUVcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzNiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODQyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODQyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpILS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDM1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4NDRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4NDRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paSC0tLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODQ2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODQ2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkgtLS1BXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYzODQ4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzYzODQ4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkgtLS1CXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mzg1MFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mzg1MFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU2Fza2F0b29uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpILS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDE3IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4NTJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4NTJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paSC0tLURcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA2IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4NTRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4NTRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paSC0tLUVcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjM4NTZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNjM4NTZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWkhDLS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2Mzg1OFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy82Mzg1OFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paSEMtLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMyBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhLU1BfMDFfY3JlYXRlX2dyYXBoIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "GRAPHKSP_02_Aberdeen_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzAyX0FiZXJkZWVuX3RvX0xvbmRvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHAgSU4gT1VUQk9VTkQgS19TSE9SVEVTVF9QQVRIUyAncGxhY2VzL0FiZXJkZWVuJyBUTyAncGxhY2VzL0xvbmRvbicKR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnCiAgICBMSU1JVCAxCiAgICBSRVRVUk4geyBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWwsIHRyYXZlbFRpbWVzOiBwLmVkZ2VzWypdLnRyYXZlbFRpbWUgfQ==", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEtfU0hPUlRFU1RfUEFUSFMgJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Mb25kb24nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHsgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsLCB0cmF2ZWxUaW1lczogcC5lZGdlc1sqXS50cmF2ZWxUaW1lIH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwicGxhY2VzXCIgOiBbIFxuICAgICAgXCJBYmVyZGVlblwiLCBcbiAgICAgIFwiTGV1Y2hhcnNcIiwgXG4gICAgICBcIkVkaW5idXJnaFwiLCBcbiAgICAgIFwiWW9ya1wiLCBcbiAgICAgIFwiTG9uZG9uXCIgXG4gICAgXSwgXG4gICAgXCJ0cmF2ZWxUaW1lc1wiIDogWyBcbiAgICAgIDEuNSwgXG4gICAgICAxLjUsIFxuICAgICAgMy41LCBcbiAgICAgIDEuOCBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSEtTUF8wMl9BYmVyZGVlbl90b19Mb25kb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6ImtTaG9ydGVzdFBhdGhzR3JhcGgifX0K" + }, + "GRAPHKSP_03_Aberdeen_to_London_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzAzX0FiZXJkZWVuX3RvX0xvbmRvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDoga1Nob3J0ZXN0UGF0aHNHcmFwaAotLS0KRk9SIHAgSU4gT1VUQk9VTkQgS19TSE9SVEVTVF9QQVRIUyAncGxhY2VzL0FiZXJkZWVuJyBUTyAncGxhY2VzL0xvbmRvbicKR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnCiAgICBMSU1JVCAzCiAgICBSRVRVUk4gewogICAgICAgIHBsYWNlczogcC52ZXJ0aWNlc1sqXS5sYWJlbCwKICAgICAgICB0cmF2ZWxUaW1lczogcC5lZGdlc1sqXS50cmF2ZWxUaW1lLAogICAgICAgIHRyYXZlbFRpbWVUb3RhbDogU1VNKHAuZWRnZXNbKl0udHJhdmVsVGltZSkKICAgIH0=", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEtfU0hPUlRFU1RfUEFUSFMgJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Mb25kb24nXG5HUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgICBMSU1JVCAzXG4gICAgUkVUVVJOIHtcbiAgICAgICAgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsLFxuICAgICAgICB0cmF2ZWxUaW1lczogcC5lZGdlc1sqXS50cmF2ZWxUaW1lLFxuICAgICAgICB0cmF2ZWxUaW1lVG90YWw6IFNVTShwLmVkZ2VzWypdLnRyYXZlbFRpbWUpXG4gICAgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJwbGFjZXNcIiA6IFsgXG4gICAgICBcIkFiZXJkZWVuXCIsIFxuICAgICAgXCJMZXVjaGFyc1wiLCBcbiAgICAgIFwiRWRpbmJ1cmdoXCIsIFxuICAgICAgXCJZb3JrXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVzXCIgOiBbIFxuICAgICAgMS41LCBcbiAgICAgIDEuNSwgXG4gICAgICAzLjUsIFxuICAgICAgMS44IFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZVRvdGFsXCIgOiA4LjMgXG4gIH0sIFxuICB7IFxuICAgIFwicGxhY2VzXCIgOiBbIFxuICAgICAgXCJBYmVyZGVlblwiLCBcbiAgICAgIFwiTGV1Y2hhcnNcIiwgXG4gICAgICBcIkVkaW5idXJnaFwiLCBcbiAgICAgIFwiR2xhc2dvd1wiLCBcbiAgICAgIFwiQ2FybGlzbGVcIiwgXG4gICAgICBcIkJpcm1pbmdoYW1cIiwgXG4gICAgICBcIkxvbmRvblwiIFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZXNcIiA6IFsgXG4gICAgICAxLjUsIFxuICAgICAgMS41LCBcbiAgICAgIDEsIFxuICAgICAgMSwgXG4gICAgICAyLCBcbiAgICAgIDEuNSBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVUb3RhbFwiIDogOC41IFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlc1wiIDogWyBcbiAgICAgIFwiQWJlcmRlZW5cIiwgXG4gICAgICBcIkxldWNoYXJzXCIsIFxuICAgICAgXCJFZGluYnVyZ2hcIiwgXG4gICAgICBcIkdsYXNnb3dcIiwgXG4gICAgICBcIkNhcmxpc2xlXCIsIFxuICAgICAgXCJZb3JrXCIsIFxuICAgICAgXCJMb25kb25cIiBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVzXCIgOiBbIFxuICAgICAgMS41LCBcbiAgICAgIDEuNSwgXG4gICAgICAxLCBcbiAgICAgIDEsIFxuICAgICAgMi41LCBcbiAgICAgIDEuOCBcbiAgICBdLCBcbiAgICBcInRyYXZlbFRpbWVUb3RhbFwiIDogOS4zIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSEtTUF8wM19BYmVyZGVlbl90b19Mb25kb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6ImtTaG9ydGVzdFBhdGhzR3JhcGgifX0K" + }, + "GRAPHKSP_04_Aberdeen_to_Toronto_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzA0X0FiZXJkZWVuX3RvX1Rvcm9udG8KZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiBwIElOIE9VVEJPVU5EIEtfU0hPUlRFU1RfUEFUSFMgJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Ub3JvbnRvJwpHUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCcKICAgIExJTUlUIDMKICAgIFJFVFVSTiB7CiAgICAgICAgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsLAogICAgICAgIHRyYXZlbFRpbWVzOiBwLmVkZ2VzWypdLnRyYXZlbFRpbWUsCiAgICAgICAgdHJhdmVsVGltZVRvdGFsOiBTVU0ocC5lZGdlc1sqXS50cmF2ZWxUaW1lKQogICAgfQ==", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEtfU0hPUlRFU1RfUEFUSFMgJ3BsYWNlcy9BYmVyZGVlbicgVE8gJ3BsYWNlcy9Ub3JvbnRvJ1xuR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnXG4gICAgTElNSVQgM1xuICAgIFJFVFVSTiB7XG4gICAgICAgIHBsYWNlczogcC52ZXJ0aWNlc1sqXS5sYWJlbCxcbiAgICAgICAgdHJhdmVsVGltZXM6IHAuZWRnZXNbKl0udHJhdmVsVGltZSxcbiAgICAgICAgdHJhdmVsVGltZVRvdGFsOiBTVU0ocC5lZGdlc1sqXS50cmF2ZWxUaW1lKVxuICAgIH0iLCJvdXRwdXQiOiJbIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhLU1BfMDRfQWJlcmRlZW5fdG9fVG9yb250byIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia1Nob3J0ZXN0UGF0aHNHcmFwaCJ9fQo=" + }, + "GRAPHKSP_05_StAndrews_to_Cologne_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzA1X1N0QW5kcmV3c190b19Db2xvZ25lCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrU2hvcnRlc3RQYXRoc0dyYXBoCi0tLQpGT1IgcCBJTiBPVVRCT1VORCBLX1NIT1JURVNUX1BBVEhTICdwbGFjZXMvU3RBbmRyZXdzJyBUTyAncGxhY2VzL0NvbG9nbmUnCkdSQVBIICdrU2hvcnRlc3RQYXRoc0dyYXBoJwpPUFRJT05TIHsKICAgIHdlaWdodEF0dHJpYnV0ZTogJ3RyYXZlbFRpbWUnLAogICAgZGVmYXVsdFdlaWdodDogMTUKfQogICAgTElNSVQgMwogICAgUkVUVVJOIHsKICAgICAgICBwbGFjZXM6IHAudmVydGljZXNbKl0ubGFiZWwsCiAgICAgICAgdHJhdmVsVGltZXM6IHAuZWRnZXNbKl0udHJhdmVsVGltZSwKICAgICAgICB0cmF2ZWxUaW1lVG90YWw6IFNVTShwLmVkZ2VzWypdLnRyYXZlbFRpbWUpCiAgICB9", + "response": "eyJpbnB1dCI6IkZPUiBwIElOIE9VVEJPVU5EIEtfU0hPUlRFU1RfUEFUSFMgJ3BsYWNlcy9TdEFuZHJld3MnIFRPICdwbGFjZXMvQ29sb2duZSdcbkdSQVBIICdrU2hvcnRlc3RQYXRoc0dyYXBoJ1xuT1BUSU9OUyB7XG4gICAgd2VpZ2h0QXR0cmlidXRlOiAndHJhdmVsVGltZScsXG4gICAgZGVmYXVsdFdlaWdodDogMTVcbn1cbiAgICBMSU1JVCAzXG4gICAgUkVUVVJOIHtcbiAgICAgICAgcGxhY2VzOiBwLnZlcnRpY2VzWypdLmxhYmVsLFxuICAgICAgICB0cmF2ZWxUaW1lczogcC5lZGdlc1sqXS50cmF2ZWxUaW1lLFxuICAgICAgICB0cmF2ZWxUaW1lVG90YWw6IFNVTShwLmVkZ2VzWypdLnRyYXZlbFRpbWUpXG4gICAgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJwbGFjZXNcIiA6IFsgXG4gICAgICBcIlN0QW5kcmV3c1wiLCBcbiAgICAgIFwiTGV1Y2hhcnNcIiwgXG4gICAgICBcIkVkaW5idXJnaFwiLCBcbiAgICAgIFwiWW9ya1wiLCBcbiAgICAgIFwiTG9uZG9uXCIsIFxuICAgICAgXCJCcnVzc2Vsc1wiLCBcbiAgICAgIFwiQ29sb2duZVwiIFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZXNcIiA6IFsgXG4gICAgICAwLjIsIFxuICAgICAgMS41LCBcbiAgICAgIDMuNSwgXG4gICAgICAxLjgsIFxuICAgICAgMi41LCBcbiAgICAgIDIgXG4gICAgXSwgXG4gICAgXCJ0cmF2ZWxUaW1lVG90YWxcIiA6IDExLjUgXG4gIH0sIFxuICB7IFxuICAgIFwicGxhY2VzXCIgOiBbIFxuICAgICAgXCJTdEFuZHJld3NcIiwgXG4gICAgICBcIkxldWNoYXJzXCIsIFxuICAgICAgXCJFZGluYnVyZ2hcIiwgXG4gICAgICBcIkdsYXNnb3dcIiwgXG4gICAgICBcIkNhcmxpc2xlXCIsIFxuICAgICAgXCJCaXJtaW5naGFtXCIsIFxuICAgICAgXCJMb25kb25cIiwgXG4gICAgICBcIkJydXNzZWxzXCIsIFxuICAgICAgXCJDb2xvZ25lXCIgXG4gICAgXSwgXG4gICAgXCJ0cmF2ZWxUaW1lc1wiIDogWyBcbiAgICAgIDAuMiwgXG4gICAgICAxLjUsIFxuICAgICAgMSwgXG4gICAgICAxLCBcbiAgICAgIDIsIFxuICAgICAgMS41LCBcbiAgICAgIDIuNSwgXG4gICAgICAyIFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZVRvdGFsXCIgOiAxMS43IFxuICB9LCBcbiAgeyBcbiAgICBcInBsYWNlc1wiIDogWyBcbiAgICAgIFwiU3RBbmRyZXdzXCIsIFxuICAgICAgXCJMZXVjaGFyc1wiLCBcbiAgICAgIFwiRWRpbmJ1cmdoXCIsIFxuICAgICAgXCJHbGFzZ293XCIsIFxuICAgICAgXCJDYXJsaXNsZVwiLCBcbiAgICAgIFwiWW9ya1wiLCBcbiAgICAgIFwiTG9uZG9uXCIsIFxuICAgICAgXCJCcnVzc2Vsc1wiLCBcbiAgICAgIFwiQ29sb2duZVwiIFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZXNcIiA6IFsgXG4gICAgICAwLjIsIFxuICAgICAgMS41LCBcbiAgICAgIDEsIFxuICAgICAgMSwgXG4gICAgICAyLjUsIFxuICAgICAgMS44LCBcbiAgICAgIDIuNSwgXG4gICAgICAyIFxuICAgIF0sIFxuICAgIFwidHJhdmVsVGltZVRvdGFsXCIgOiAxMi41IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSEtTUF8wNV9TdEFuZHJld3NfdG9fQ29sb2duZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia1Nob3J0ZXN0UGF0aHNHcmFwaCJ9fQo=" + }, + "GRAPHKSP_99_drop_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIS1NQXzk5X2Ryb3BfZ3JhcGgKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwpleGFtcGxlcy5kcm9wR3JhcGgoImtTaG9ydGVzdFBhdGhzR3JhcGgiKTsKfnJlbW92ZUlnbm9yZUNvbGxlY3Rpb24oInBsYWNlcyIpOwp+cmVtb3ZlSWdub3JlQ29sbGVjdGlvbigiY29ubmVjdGlvbnMiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcImtTaG9ydGVzdFBhdGhzR3JhcGhcIik7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIS1NQXzk5X2Ryb3BfZ3JhcGgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHSP_01_create_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIU1BfMDFfY3JlYXRlX2dyYXBoCmRlc2NyaXB0aW9uOiAnJwotLS0KfmFkZElnbm9yZUNvbGxlY3Rpb24oImNpcmNsZXMiKTsKfmFkZElnbm9yZUNvbGxlY3Rpb24oImVkZ2VzIik7CnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgidHJhdmVyc2FsR3JhcGgiKTsKZGIuY2lyY2xlcy50b0FycmF5KCk7CmRiLmVkZ2VzLnRvQXJyYXkoKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInRyYXZlcnNhbEdyYXBoXCIpO1xuZGIuY2lyY2xlcy50b0FycmF5KCk7XG5kYi5lZGdlcy50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQVwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk8yLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiMVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQlwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS0tXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiMlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQ1wiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0NcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS1fXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiM1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRFwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0RcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiNFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRVwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS1CXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiNVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRlwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0ZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS1DXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiNlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiR1wiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0dcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS1EXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiN1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSFwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWk82LS1FXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiOFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSVwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0lcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWlAtLS0tXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiOVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSlwiLCBcbiAgICBcIl9pZFwiIDogXCJjaXJjbGVzL0pcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWlAtLS1fXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiMTBcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIktcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9LXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpQLS0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjExXCIgXG4gIH0gXG5dXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY0NTU5XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY0NTU5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9BXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvQlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paUC0tLUJcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwibGVmdF9iYXJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY0NTYxXCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY0NTYxXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9CXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvQ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paUC0tLUNcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwibGVmdF9ibGFyZ1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjQ1NjNcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjQ1NjNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0NcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9EXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpQLS0tRFwiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJsZWZ0X2Jsb3JnXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NDU2NVwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy82NDU2NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvQlwiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWlAtLS1FXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcImxlZnRfYmx1YlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjQ1NjdcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjQ1NjdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0VcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9GXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpQQy0tLVwiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJsZWZ0X3NjaHViaVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjQ1NjlcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjQ1NjlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0FcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9HXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpQQy0tX1wiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJyaWdodF9mb29cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY0NTcxXCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY0NTcxXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9HXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvSFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paUEMtLUFcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfYmxvYlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjQ1NzNcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjQ1NzNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0hcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9JXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpQQy0tQlwiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJyaWdodF9ibHViXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NDU3NVwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy82NDU3NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvR1wiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0pcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWlBDLS1DXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcInJpZ2h0X3ppcFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjQ1NzdcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjQ1NzdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0pcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9LXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpQQy0tRFwiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJyaWdodF96dXBcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhTUF8wMV9jcmVhdGVfZ3JhcGgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHSP_02_A_to_D_single": { + "request": "LS0tCm5hbWU6IEdSQVBIU1BfMDJfQV90b19ECmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3F1ZXJ5KGAKICBGT1IgdiwgZSBJTiBPVVRCT1VORCBTSE9SVEVTVF9QQVRIICdjaXJjbGVzL0EnIFRPICdjaXJjbGVzL0QnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCcKICAgIFJFVFVSTiBbdi5fa2V5LCBlLl9rZXldCmApOwoKZGIuX3F1ZXJ5KGAKICBGT1IgdiwgZSBJTiBPVVRCT1VORCBTSE9SVEVTVF9QQVRIICdjaXJjbGVzL0EnIFRPICdjaXJjbGVzL0QnIGVkZ2VzCiAgICBSRVRVUk4gW3YuX2tleSwgZS5fa2V5XQpgKTs=", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgXG4gIEZPUiB2LCBlIElOIE9VVEJPVU5EIFNIT1JURVNUX1BBVEggJ2NpcmNsZXMvQScgVE8gJ2NpcmNsZXMvRCcgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIFJFVFVSTiBbdi5fa2V5LCBlLl9rZXldXG5gKTtcblxuZGIuX3F1ZXJ5KGBcbiAgRk9SIHYsIGUgSU4gT1VUQk9VTkQgU0hPUlRFU1RfUEFUSCAnY2lyY2xlcy9BJyBUTyAnY2lyY2xlcy9EJyBlZGdlc1xuICAgIFJFVFVSTiBbdi5fa2V5LCBlLl9rZXldXG5gKTsiLCJvdXRwdXQiOiJbb2JqZWN0IEFyYW5nb1F1ZXJ5Q3Vyc29yLCBjb3VudDogNCwgY2FjaGVkOiBmYWxzZSwgaGFzTW9yZTogZmFsc2VdXG5cblsgXG4gIFsgXG4gICAgXCJBXCIsIFxuICAgIG51bGwgXG4gIF0sIFxuICBbIFxuICAgIFwiQlwiLCBcbiAgICBcIjY0NTU5XCIgXG4gIF0sIFxuICBbIFxuICAgIFwiQ1wiLCBcbiAgICBcIjY0NTYxXCIgXG4gIF0sIFxuICBbIFxuICAgIFwiRFwiLCBcbiAgICBcIjY0NTYzXCIgXG4gIF0gXG5dXG5cbltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiA0LCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgWyBcbiAgICBcIkFcIiwgXG4gICAgbnVsbCBcbiAgXSwgXG4gIFsgXG4gICAgXCJCXCIsIFxuICAgIFwiNjQ1NTlcIiBcbiAgXSwgXG4gIFsgXG4gICAgXCJDXCIsIFxuICAgIFwiNjQ1NjFcIiBcbiAgXSwgXG4gIFsgXG4gICAgXCJEXCIsIFxuICAgIFwiNjQ1NjNcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhTUF8wMl9BX3RvX0QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHSP_03_A_to_D_single": { + "request": "LS0tCm5hbWU6IEdSQVBIU1BfMDNfQV90b19ECmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3F1ZXJ5KGAKICBGT1IgYSBJTiBjaXJjbGVzCiAgICBGSUxURVIgYS5fa2V5ID09ICdBJwogICAgRk9SIGQgSU4gY2lyY2xlcwogICAgICBGSUxURVIgZC5fa2V5ID09ICdEJwogICAgICBGT1IgdiwgZSBJTiBPVVRCT1VORCBTSE9SVEVTVF9QQVRIIGEgVE8gZCBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICAgICAgUkVUVVJOIFt2Ll9rZXksIGUuX2tleV0KYCk7CgpkYi5fcXVlcnkoYAogIEZPUiBhIElOIGNpcmNsZXMKICAgIEZJTFRFUiBhLl9rZXkgPT0gJ0EnCiAgICBGT1IgZCBJTiBjaXJjbGVzCiAgICAgIEZJTFRFUiBkLl9rZXkgPT0gJ0QnCiAgICAgIEZPUiB2LCBlIElOIE9VVEJPVU5EIFNIT1JURVNUX1BBVEggYSBUTyBkIGVkZ2VzCiAgICAgICAgUkVUVVJOIFt2Ll9rZXksIGUuX2tleV0KYCk7", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgXG4gIEZPUiBhIElOIGNpcmNsZXNcbiAgICBGSUxURVIgYS5fa2V5ID09ICdBJ1xuICAgIEZPUiBkIElOIGNpcmNsZXNcbiAgICAgIEZJTFRFUiBkLl9rZXkgPT0gJ0QnXG4gICAgICBGT1IgdiwgZSBJTiBPVVRCT1VORCBTSE9SVEVTVF9QQVRIIGEgVE8gZCBHUkFQSCAndHJhdmVyc2FsR3JhcGgnXG4gICAgICAgIFJFVFVSTiBbdi5fa2V5LCBlLl9rZXldXG5gKTtcblxuZGIuX3F1ZXJ5KGBcbiAgRk9SIGEgSU4gY2lyY2xlc1xuICAgIEZJTFRFUiBhLl9rZXkgPT0gJ0EnXG4gICAgRk9SIGQgSU4gY2lyY2xlc1xuICAgICAgRklMVEVSIGQuX2tleSA9PSAnRCdcbiAgICAgIEZPUiB2LCBlIElOIE9VVEJPVU5EIFNIT1JURVNUX1BBVEggYSBUTyBkIGVkZ2VzXG4gICAgICAgIFJFVFVSTiBbdi5fa2V5LCBlLl9rZXldXG5gKTsiLCJvdXRwdXQiOiJbb2JqZWN0IEFyYW5nb1F1ZXJ5Q3Vyc29yLCBjb3VudDogNCwgY2FjaGVkOiBmYWxzZSwgaGFzTW9yZTogZmFsc2VdXG5cblsgXG4gIFsgXG4gICAgXCJBXCIsIFxuICAgIG51bGwgXG4gIF0sIFxuICBbIFxuICAgIFwiQlwiLCBcbiAgICBcIjY0NTU5XCIgXG4gIF0sIFxuICBbIFxuICAgIFwiQ1wiLCBcbiAgICBcIjY0NTYxXCIgXG4gIF0sIFxuICBbIFxuICAgIFwiRFwiLCBcbiAgICBcIjY0NTYzXCIgXG4gIF0gXG5dXG5cbltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiA0LCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgWyBcbiAgICBcIkFcIiwgXG4gICAgbnVsbCBcbiAgXSwgXG4gIFsgXG4gICAgXCJCXCIsIFxuICAgIFwiNjQ1NTlcIiBcbiAgXSwgXG4gIFsgXG4gICAgXCJDXCIsIFxuICAgIFwiNjQ1NjFcIiBcbiAgXSwgXG4gIFsgXG4gICAgXCJEXCIsIFxuICAgIFwiNjQ1NjNcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhTUF8wM19BX3RvX0QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHSP_99_drop_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIU1BfOTlfZHJvcF9ncmFwaApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CmV4YW1wbGVzLmRyb3BHcmFwaCgidHJhdmVyc2FsR3JhcGgiKTsKfnJlbW92ZUlnbm9yZUNvbGxlY3Rpb24oImNpcmNsZXMiKTsKfnJlbW92ZUlnbm9yZUNvbGxlY3Rpb24oImVkZ2VzIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcInRyYXZlcnNhbEdyYXBoXCIpOyIsIm91dHB1dCI6IkVtcHR5IE91dHB1dCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFNQXzk5X2Ryb3BfZ3JhcGgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "GRAPHTRAV_01_create_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wMV9jcmVhdGVfZ3JhcGgKZGVzY3JpcHRpb246ICcnCi0tLQp+YWRkSWdub3JlQ29sbGVjdGlvbigiY2lyY2xlcyIpOwp+YWRkSWdub3JlQ29sbGVjdGlvbigiZWRnZXMiKTsKdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJ0cmF2ZXJzYWxHcmFwaCIpOwpkYi5jaXJjbGVzLnRvQXJyYXkoKTsKZGIuZWRnZXMudG9BcnJheSgpOwpwcmludCgib25jZSB5b3UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUsIGNsZWFuIHRoZW0gdXA6Iik7CmV4YW1wbGVzLmRyb3BHcmFwaCgidHJhdmVyc2FsR3JhcGgiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInRyYXZlcnNhbEdyYXBoXCIpO1xuZGIuY2lyY2xlcy50b0FycmF5KCk7XG5kYi5lZGdlcy50b0FycmF5KCk7XG5wcmludChcIm9uY2UgeW91IGRvbid0IG5lZWQgdGhlbSBhbnltb3JlLCBjbGVhbiB0aGVtIHVwOlwiKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcInRyYXZlcnNhbEdyYXBoXCIpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9BXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnQy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9CXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnQy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkNcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9DXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnQy0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9EXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjRcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9FXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9GXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjZcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkdcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9HXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjdcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9IXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tQ1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjhcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIklcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9JXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tRFwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjlcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkpcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9KXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnRy0tRVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjEwXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJLXCIsIFxuICAgIFwiX2lkXCIgOiBcImNpcmNsZXMvS1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paZ0stLS1cIiwgXG4gICAgXCJsYWJlbFwiIDogXCIxMVwiIFxuICB9IFxuXVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NjIxNFwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy82NjIxNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvQVwiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWmdLLS1fXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcImxlZnRfYmFyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NjIxNlwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy82NjIxNlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvQlwiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0NcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWmdLLS1BXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcImxlZnRfYmxhcmdcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY2MjE4XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY2MjE4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9DXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvRFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paZ0stLUJcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwibGVmdF9ibG9yZ1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjYyMjBcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjYyMjBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0JcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9FXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnSy0tQ1wiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJsZWZ0X2JsdWJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY2MjIyXCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY2MjIyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9FXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvRlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paZ0stLURcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwibGVmdF9zY2h1YmlcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY2MjI0XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY2MjI0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9BXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvR1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paZ08tLS1cIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfZm9vXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NjIyNlwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy82NjIyNlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvR1wiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWmdPLS1fXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcInJpZ2h0X2Jsb2JcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY2MjI4XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY2MjI4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9IXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvSVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paZ08tLUFcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfYmx1YlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjYyMzBcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNjYyMzBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0dcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9KXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlpnTy0tQlwiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJyaWdodF96aXBcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY2MjMyXCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzY2MjMyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9KXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvS1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paZ08tLUNcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfenVwXCIgXG4gIH0gXG5dXG5cbm9uY2UgeW91IGRvbid0IG5lZWQgdGhlbSBhbnltb3JlLCBjbGVhbiB0aGVtIHVwOiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfMDFfY3JlYXRlX2dyYXBoIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "GRAPHTRAV_02_traverse_all_a_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wMl90cmF2ZXJzZV9hbGxfYQpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogIFJFVFVSTiB2Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICBSRVRVUk4gdi5fa2V5Iiwib3V0cHV0IjoiWyBcbiAgXCJHXCIsIFxuICBcIkpcIiwgXG4gIFwiS1wiLCBcbiAgXCJIXCIsIFxuICBcIklcIiwgXG4gIFwiQlwiLCBcbiAgXCJFXCIsIFxuICBcIkZcIiwgXG4gIFwiQ1wiLCBcbiAgXCJEXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wMl90cmF2ZXJzZV9hbGxfYSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_02_traverse_all_b_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wMl90cmF2ZXJzZV9hbGxfYgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgZWRnZXMgUkVUVVJOIHYuX2tleQ==", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgZWRnZXMgUkVUVVJOIHYuX2tleSIsIm91dHB1dCI6IlsgXG4gIFwiR1wiLCBcbiAgXCJKXCIsIFxuICBcIktcIiwgXG4gIFwiSFwiLCBcbiAgXCJJXCIsIFxuICBcIkJcIiwgXG4gIFwiRVwiLCBcbiAgXCJGXCIsIFxuICBcIkNcIiwgXG4gIFwiRFwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfMDJfdHJhdmVyc2VfYWxsX2IiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6InRyYXZlcnNhbEdyYXBoIn19Cg==" + }, + "GRAPHTRAV_03_traverse_3a_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wM190cmF2ZXJzZV8zYQpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDIuLjIgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogIFJFVFVSTiB2Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDIuLjIgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICBSRVRVUk4gdi5fa2V5Iiwib3V0cHV0IjoiWyBcbiAgXCJKXCIsIFxuICBcIkhcIiwgXG4gIFwiRVwiLCBcbiAgXCJDXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wM190cmF2ZXJzZV8zYSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_03_traverse_3b_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wM190cmF2ZXJzZV8zYgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDIgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogIFJFVFVSTiB2Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDIgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICBSRVRVUk4gdi5fa2V5Iiwib3V0cHV0IjoiWyBcbiAgXCJKXCIsIFxuICBcIkhcIiwgXG4gIFwiRVwiLCBcbiAgXCJDXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wM190cmF2ZXJzZV8zYiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_04_traverse_4a_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNF90cmF2ZXJzZV80YQpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogICAgRklMVEVSIHAudmVydGljZXNbMV0uX2tleSAhPSAnRycKICAgIFJFVFVSTiB2Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLnZlcnRpY2VzWzFdLl9rZXkgIT0gJ0cnXG4gICAgUkVUVVJOIHYuX2tleSIsIm91dHB1dCI6IlsgXG4gIFwiQlwiLCBcbiAgXCJFXCIsIFxuICBcIkZcIiwgXG4gIFwiQ1wiLCBcbiAgXCJEXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wNF90cmF2ZXJzZV80YSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_04_traverse_4b_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNF90cmF2ZXJzZV80YgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogICAgRklMVEVSIHAuZWRnZXNbMF0ubGFiZWwgIT0gJ3JpZ2h0X2ZvbycKICAgIFJFVFVSTiB2Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWzBdLmxhYmVsICE9ICdyaWdodF9mb28nXG4gICAgUkVUVVJOIHYuX2tleSIsIm91dHB1dCI6IlsgXG4gIFwiQlwiLCBcbiAgXCJFXCIsIFxuICBcIkZcIiwgXG4gIFwiQ1wiLCBcbiAgXCJEXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wNF90cmF2ZXJzZV80YiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_05_traverse_5a_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNV90cmF2ZXJzZV81YQpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2LGUscCBJTiAxLi4zIE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCcKICAgIEZJTFRFUiBwLnZlcnRpY2VzWzFdLl9rZXkgIT0gJ0cnCiAgICBGSUxURVIgcC5lZGdlc1sxXS5sYWJlbCAhPSAnbGVmdF9ibHViJwogICAgUkVUVVJOIHYuX2tleQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LGUscCBJTiAxLi4zIE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCdcbiAgICBGSUxURVIgcC52ZXJ0aWNlc1sxXS5fa2V5ICE9ICdHJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWzFdLmxhYmVsICE9ICdsZWZ0X2JsdWInXG4gICAgUkVUVVJOIHYuX2tleSIsIm91dHB1dCI6IlsgXG4gIFwiQlwiLCBcbiAgXCJDXCIsIFxuICBcIkRcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWXzA1X3RyYXZlcnNlXzVhIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJ0cmF2ZXJzYWxHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_05_traverse_5b_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNV90cmF2ZXJzZV81YgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2LGUscCBJTiAxLi4zIE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCcKICAgIEZJTFRFUiBwLnZlcnRpY2VzWzFdLl9rZXkgIT0gJ0cnIEFORCBwLmVkZ2VzWzFdLmxhYmVsICE9ICdsZWZ0X2JsdWInCiAgICBSRVRVUk4gdi5fa2V5", + "response": "eyJpbnB1dCI6IkZPUiB2LGUscCBJTiAxLi4zIE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCdcbiAgICBGSUxURVIgcC52ZXJ0aWNlc1sxXS5fa2V5ICE9ICdHJyBBTkQgcC5lZGdlc1sxXS5sYWJlbCAhPSAnbGVmdF9ibHViJ1xuICAgIFJFVFVSTiB2Ll9rZXkiLCJvdXRwdXQiOiJbIFxuICBcIkJcIiwgXG4gIFwiQ1wiLCBcbiAgXCJEXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wNV90cmF2ZXJzZV81YiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_06_traverse_6a_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNl90cmF2ZXJzZV82YQpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvRScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogICAgUkVUVVJOIHYuX2tleQ==", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDEuLjMgT1VUQk9VTkQgJ2NpcmNsZXMvRScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIFJFVFVSTiB2Ll9rZXkiLCJvdXRwdXQiOiJbIFxuICBcIkZcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWXzA2X3RyYXZlcnNlXzZhIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJ0cmF2ZXJzYWxHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_06_traverse_6b_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNl90cmF2ZXJzZV82YgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDEuLjMgSU5CT1VORCAnY2lyY2xlcy9FJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICBSRVRVUk4gdi5fa2V5", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDEuLjMgSU5CT1VORCAnY2lyY2xlcy9FJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnXG4gICAgUkVUVVJOIHYuX2tleSIsIm91dHB1dCI6IlsgXG4gIFwiQlwiLCBcbiAgXCJBXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl8wNl90cmF2ZXJzZV82YiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_06_traverse_6c_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wNl90cmF2ZXJzZV82YwpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2IElOIDEuLjMgQU5ZICdjaXJjbGVzL0UnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCcKICAgIFJFVFVSTiB2Ll9rZXk=", + "response": "eyJpbnB1dCI6IkZPUiB2IElOIDEuLjMgQU5ZICdjaXJjbGVzL0UnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCdcbiAgICBSRVRVUk4gdi5fa2V5Iiwib3V0cHV0IjoiWyBcbiAgXCJCXCIsIFxuICBcIkFcIiwgXG4gIFwiR1wiLCBcbiAgXCJDXCIsIFxuICBcIkRcIiwgXG4gIFwiRlwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfMDZfdHJhdmVyc2VfNmMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6InRyYXZlcnNhbEdyYXBoIn19Cg==" + }, + "GRAPHTRAV_07_traverse_7_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wN190cmF2ZXJzZV83CmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiB0cmF2ZXJzYWxHcmFwaApleHBsYWluOiB0cnVlCi0tLQpGT1IgdixlLHAgSU4gMS4uMyBPVVRCT1VORCAnY2lyY2xlcy9BJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICBMRVQgbG9jYWxTY29wZVZhciA9IFJBTkQoKSA+IDAuNQogICAgRklMVEVSIHAuZWRnZXNbMF0udGhlVHJ1dGggIT0gbG9jYWxTY29wZVZhcgogICAgUkVUVVJOIHYuX2tleQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LGUscCBJTiAxLi4zIE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCdcbiAgICBMRVQgbG9jYWxTY29wZVZhciA9IFJBTkQoKSBcdTAwM2UgMC41XG4gICAgRklMVEVSIHAuZWRnZXNbMF0udGhlVHJ1dGggIT0gbG9jYWxTY29wZVZhclxuICAgIFJFVFVSTiB2Ll9rZXkiLCJvdXRwdXQiOiJbIFxuICBcIkdcIiwgXG4gIFwiRVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfMDdfdHJhdmVyc2VfNyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJleHBsYWluIjp0cnVlLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_07_traverse_8_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl8wN190cmF2ZXJzZV84CmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiB0cmF2ZXJzYWxHcmFwaApleHBsYWluOiB0cnVlCi0tLQpGT1IgdixlLHAgSU4gMS4uMyBPVVRCT1VORCAnY2lyY2xlcy9BJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICBGSUxURVIgcC5lZGdlc1swXS5sYWJlbCA9PSAncmlnaHRfZm9vJwogICAgUkVUVVJOIHYuX2tleQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LGUscCBJTiAxLi4zIE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCdcbiAgICBGSUxURVIgcC5lZGdlc1swXS5sYWJlbCA9PSAncmlnaHRfZm9vJ1xuICAgIFJFVFVSTiB2Ll9rZXkiLCJvdXRwdXQiOiJbIFxuICBcIkdcIiwgXG4gIFwiSlwiLCBcbiAgXCJLXCIsIFxuICBcIkhcIiwgXG4gIFwiSVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfMDdfdHJhdmVyc2VfOCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJleHBsYWluIjp0cnVlLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_99_drop_graph_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl85OV9kcm9wX2dyYXBoCmRlc2NyaXB0aW9uOiAnJwotLS0KfmV4YW1wbGVzLmxvYWRHcmFwaCgidHJhdmVyc2FsR3JhcGgiKTsKdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJ0cmF2ZXJzYWxHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcInRyYXZlcnNhbEdyYXBoXCIpOyIsIm91dHB1dCI6IkVtcHR5IE91dHB1dCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfOTlfZHJvcF9ncmFwaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "GRAPHTRAV_graphFilterCombine_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaEZpbHRlckNvbWJpbmUKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IHRyYXZlcnNhbEdyYXBoCi0tLQpGT1IgdiwgZSwgcCBJTiAxLi41IE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCcKICAgIEZJTFRFUiBwLmVkZ2VzWzBdLnRoZVRydXRoID09IHRydWUKICAgICAgIEFORCBwLmVkZ2VzWzFdLnRoZUZhbHNlID09IGZhbHNlCiAgICBGSUxURVIgcC52ZXJ0aWNlc1sxXS5fa2V5ID09ICJHIgogICAgUkVUVVJOIHsgdmVydGljZXM6IHAudmVydGljZXNbKl0uX2tleSwgZWRnZXM6IHAuZWRnZXNbKl0ubGFiZWwgfQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWzBdLnRoZVRydXRoID09IHRydWVcbiAgICAgICBBTkQgcC5lZGdlc1sxXS50aGVGYWxzZSA9PSBmYWxzZVxuICAgIEZJTFRFUiBwLnZlcnRpY2VzWzFdLl9rZXkgPT0gXCJHXCJcbiAgICBSRVRVUk4geyB2ZXJ0aWNlczogcC52ZXJ0aWNlc1sqXS5fa2V5LCBlZGdlczogcC5lZGdlc1sqXS5sYWJlbCB9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIsIFxuICAgICAgXCJKXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIsIFxuICAgICAgXCJyaWdodF96aXBcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIsIFxuICAgICAgXCJKXCIsIFxuICAgICAgXCJLXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIsIFxuICAgICAgXCJyaWdodF96aXBcIiwgXG4gICAgICBcInJpZ2h0X3p1cFwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkhcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X2Jsb2JcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIsIFxuICAgICAgXCJIXCIsIFxuICAgICAgXCJJXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIsIFxuICAgICAgXCJyaWdodF9ibG9iXCIsIFxuICAgICAgXCJyaWdodF9ibHViXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWX2dyYXBoRmlsdGVyQ29tYmluZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0IjoidHJhdmVyc2FsR3JhcGgifX0K" + }, + "GRAPHTRAV_graphFilterEdges_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaEZpbHRlckVkZ2VzCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiB0cmF2ZXJzYWxHcmFwaAotLS0KRk9SIHYsIGUsIHAgSU4gMS4uNSBPVVRCT1VORCAnY2lyY2xlcy9BJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICBGSUxURVIgcC5lZGdlc1swXS50aGVUcnV0aCA9PSB0cnVlCiAgICBSRVRVUk4geyB2ZXJ0aWNlczogcC52ZXJ0aWNlc1sqXS5fa2V5LCBlZGdlczogcC5lZGdlc1sqXS5sYWJlbCB9", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWzBdLnRoZVRydXRoID09IHRydWVcbiAgICBSRVRVUk4geyB2ZXJ0aWNlczogcC52ZXJ0aWNlc1sqXS5fa2V5LCBlZGdlczogcC5lZGdlc1sqXS5sYWJlbCB9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSlwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfemlwXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSlwiLCBcbiAgICAgIFwiS1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfemlwXCIsIFxuICAgICAgXCJyaWdodF96dXBcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIsIFxuICAgICAgXCJIXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIsIFxuICAgICAgXCJyaWdodF9ibG9iXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSFwiLCBcbiAgICAgIFwiSVwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfYmxvYlwiLCBcbiAgICAgIFwicmlnaHRfYmx1YlwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkVcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibHViXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiQlwiLCBcbiAgICAgIFwiRVwiLCBcbiAgICAgIFwiRlwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcImxlZnRfYmFyXCIsIFxuICAgICAgXCJsZWZ0X2JsdWJcIiwgXG4gICAgICBcImxlZnRfc2NodWJpXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiQlwiLCBcbiAgICAgIFwiQ1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcImxlZnRfYmFyXCIsIFxuICAgICAgXCJsZWZ0X2JsYXJnXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiQlwiLCBcbiAgICAgIFwiQ1wiLCBcbiAgICAgIFwiRFwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcImxlZnRfYmFyXCIsIFxuICAgICAgXCJsZWZ0X2JsYXJnXCIsIFxuICAgICAgXCJsZWZ0X2Jsb3JnXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWX2dyYXBoRmlsdGVyRWRnZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6InRyYXZlcnNhbEdyYXBoIn19Cg==" + }, + "GRAPHTRAV_graphFilterEntirePath_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaEZpbHRlckVudGlyZVBhdGgKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IHRyYXZlcnNhbEdyYXBoCi0tLQpGT1IgdiwgZSwgcCBJTiAxLi41IE9VVEJPVU5EICdjaXJjbGVzL0EnIEdSQVBIICd0cmF2ZXJzYWxHcmFwaCcKICAgIEZJTFRFUiBwLmVkZ2VzWypdLnRoZVRydXRoIEFMTCA9PSB0cnVlCiAgICBSRVRVUk4geyB2ZXJ0aWNlczogcC52ZXJ0aWNlc1sqXS5fa2V5LCBlZGdlczogcC5lZGdlc1sqXS5sYWJlbCB9", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWypdLnRoZVRydXRoIEFMTCA9PSB0cnVlXG4gICAgUkVUVVJOIHsgdmVydGljZXM6IHAudmVydGljZXNbKl0uX2tleSwgZWRnZXM6IHAuZWRnZXNbKl0ubGFiZWwgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkpcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X3ppcFwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkpcIiwgXG4gICAgICBcIktcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X3ppcFwiLCBcbiAgICAgIFwicmlnaHRfenVwXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSFwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfYmxvYlwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkhcIiwgXG4gICAgICBcIklcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X2Jsb2JcIiwgXG4gICAgICBcInJpZ2h0X2JsdWJcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJCXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwibGVmdF9iYXJcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJCXCIsIFxuICAgICAgXCJFXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwibGVmdF9iYXJcIiwgXG4gICAgICBcImxlZnRfYmx1YlwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkVcIiwgXG4gICAgICBcIkZcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibHViXCIsIFxuICAgICAgXCJsZWZ0X3NjaHViaVwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkNcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibGFyZ1wiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkNcIiwgXG4gICAgICBcIkRcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibGFyZ1wiLCBcbiAgICAgIFwibGVmdF9ibG9yZ1wiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl9ncmFwaEZpbHRlckVudGlyZVBhdGgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6InRyYXZlcnNhbEdyYXBoIn19Cg==" + }, + "GRAPHTRAV_graphFilterPathAnyEdge_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaEZpbHRlclBhdGhBbnlFZGdlCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiB0cmF2ZXJzYWxHcmFwaAotLS0KRk9SIHYsIGUsIHAgSU4gMS4uNSBPVVRCT1VORCAnY2lyY2xlcy9BJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICBGSUxURVIgcC5lZGdlc1sqXS50aGVUcnV0aCBBTlkgPT0gdHJ1ZQogICAgUkVUVVJOIHsgdmVydGljZXM6IHAudmVydGljZXNbKl0uX2tleSwgZWRnZXM6IHAuZWRnZXNbKl0ubGFiZWwgfQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWypdLnRoZVRydXRoIEFOWSA9PSB0cnVlXG4gICAgUkVUVVJOIHsgdmVydGljZXM6IHAudmVydGljZXNbKl0uX2tleSwgZWRnZXM6IHAuZWRnZXNbKl0ubGFiZWwgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkpcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X3ppcFwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkpcIiwgXG4gICAgICBcIktcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X3ppcFwiLCBcbiAgICAgIFwicmlnaHRfenVwXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSFwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfYmxvYlwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkdcIiwgXG4gICAgICBcIkhcIiwgXG4gICAgICBcIklcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJyaWdodF9mb29cIiwgXG4gICAgICBcInJpZ2h0X2Jsb2JcIiwgXG4gICAgICBcInJpZ2h0X2JsdWJcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJCXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwibGVmdF9iYXJcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJCXCIsIFxuICAgICAgXCJFXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwibGVmdF9iYXJcIiwgXG4gICAgICBcImxlZnRfYmx1YlwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkVcIiwgXG4gICAgICBcIkZcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibHViXCIsIFxuICAgICAgXCJsZWZ0X3NjaHViaVwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkNcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibGFyZ1wiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcIkFcIiwgXG4gICAgICBcIkJcIiwgXG4gICAgICBcIkNcIiwgXG4gICAgICBcIkRcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgXCJsZWZ0X2JhclwiLCBcbiAgICAgIFwibGVmdF9ibGFyZ1wiLCBcbiAgICAgIFwibGVmdF9ibG9yZ1wiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl9ncmFwaEZpbHRlclBhdGhBbnlFZGdlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJ0cmF2ZXJzYWxHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_graphFilterPathEdges_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaEZpbHRlclBhdGhFZGdlcwpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogdHJhdmVyc2FsR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJwogICAgRklMVEVSIHAuZWRnZXNbKl0udGhlVHJ1dGggTk9ORSA9PSB0cnVlCiAgICBSRVRVUk4geyB2ZXJ0aWNlczogcC52ZXJ0aWNlc1sqXS5fa2V5LCBlZGdlczogcC5lZGdlc1sqXS5sYWJlbCB9", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLmVkZ2VzWypdLnRoZVRydXRoIE5PTkUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB7IHZlcnRpY2VzOiBwLnZlcnRpY2VzWypdLl9rZXksIGVkZ2VzOiBwLmVkZ2VzWypdLmxhYmVsIH0iLCJvdXRwdXQiOiJbIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWX2dyYXBoRmlsdGVyUGF0aEVkZ2VzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJ0cmF2ZXJzYWxHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_graphFilterVertices_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaEZpbHRlclZlcnRpY2VzCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiB0cmF2ZXJzYWxHcmFwaAotLS0KRk9SIHYsIGUsIHAgSU4gMS4uNSBPVVRCT1VORCAnY2lyY2xlcy9BJyBHUkFQSCAndHJhdmVyc2FsR3JhcGgnCiAgICBGSUxURVIgcC52ZXJ0aWNlc1sxXS5fa2V5ID09ICJHIgogICAgUkVUVVJOIHsgdmVydGljZXM6IHAudmVydGljZXNbKl0uX2tleSwgZWRnZXM6IHAuZWRnZXNbKl0ubGFiZWwgfQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjUgT1VUQk9VTkQgJ2NpcmNsZXMvQScgR1JBUEggJ3RyYXZlcnNhbEdyYXBoJ1xuICAgIEZJTFRFUiBwLnZlcnRpY2VzWzFdLl9rZXkgPT0gXCJHXCJcbiAgICBSRVRVUk4geyB2ZXJ0aWNlczogcC52ZXJ0aWNlc1sqXS5fa2V5LCBlZGdlczogcC5lZGdlc1sqXS5sYWJlbCB9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSlwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfemlwXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSlwiLCBcbiAgICAgIFwiS1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfemlwXCIsIFxuICAgICAgXCJyaWdodF96dXBcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJBXCIsIFxuICAgICAgXCJHXCIsIFxuICAgICAgXCJIXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIFwicmlnaHRfZm9vXCIsIFxuICAgICAgXCJyaWdodF9ibG9iXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiQVwiLCBcbiAgICAgIFwiR1wiLCBcbiAgICAgIFwiSFwiLCBcbiAgICAgIFwiSVwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICBcInJpZ2h0X2Zvb1wiLCBcbiAgICAgIFwicmlnaHRfYmxvYlwiLCBcbiAgICAgIFwicmlnaHRfYmx1YlwiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl9ncmFwaEZpbHRlclZlcnRpY2VzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJ0cmF2ZXJzYWxHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_graphPruneExample1_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTEKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDAuLjEwIE9VVEJPVU5EICJwbGFjZXMvVG9yb250byIgR1JBUEggImtTaG9ydGVzdFBhdGhzR3JhcGgiCiAgUFJVTkUgdi5sYWJlbCA9PSAiRWRtb250b24iCiAgT1BUSU9OUyB7IHVuaXF1ZVZlcnRpY2VzOiAicGF0aCIgfQogIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIgLS0gIiwgcC52ZXJ0aWNlc1sqXS5sYWJlbCk=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDAuLjEwIE9VVEJPVU5EIFwicGxhY2VzL1Rvcm9udG9cIiBHUkFQSCBcImtTaG9ydGVzdFBhdGhzR3JhcGhcIlxuICBQUlVORSB2LmxhYmVsID09IFwiRWRtb250b25cIlxuICBPUFRJT05TIHsgdW5pcXVlVmVydGljZXM6IFwicGF0aFwiIH1cbiAgUkVUVVJOIENPTkNBVF9TRVBBUkFUT1IoXCIgLS0gXCIsIHAudmVydGljZXNbKl0ubGFiZWwpIiwib3V0cHV0IjoiWyBcbiAgXCJUb3JvbnRvXCIsIFxuICBcIlRvcm9udG8gLS0gV2lubmlwZWdcIiwgXG4gIFwiVG9yb250byAtLSBXaW5uaXBlZyAtLSBTYXNrYXRvb25cIiwgXG4gIFwiVG9yb250byAtLSBXaW5uaXBlZyAtLSBTYXNrYXRvb24gLS0gRWRtb250b25cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWX2dyYXBoUHJ1bmVFeGFtcGxlMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia1Nob3J0ZXN0UGF0aHNHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_graphPruneExample2_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTIKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgInBsYWNlcy9Mb25kb24iIEdSQVBIICJrU2hvcnRlc3RQYXRoc0dyYXBoIgogIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogInBhdGgiIH0KICBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUigiIC0tICIsIElOVEVSTEVBVkUocC52ZXJ0aWNlc1sqXS5sYWJlbCwgcC5lZGdlc1sqXS50cmF2ZWxUaW1lKSk=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgXCJwbGFjZXMvTG9uZG9uXCIgR1JBUEggXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCJcbiAgT1BUSU9OUyB7IHVuaXF1ZVZlcnRpY2VzOiBcInBhdGhcIiB9XG4gIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiIC0tIFwiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkpIiwib3V0cHV0IjoiWyBcbiAgXCJMb25kb24gLS0gMi41IC0tIEJydXNzZWxzIC0tIDIgLS0gQ29sb2duZVwiLCBcbiAgXCJMb25kb24gLS0gMiAtLSBZb3JrIC0tIDMuNSAtLSBDYXJsaXNsZVwiLCBcbiAgXCJMb25kb24gLS0gMiAtLSBZb3JrIC0tIDMuNSAtLSBDYXJsaXNsZSAtLSAyIC0tIEJpcm1pbmdoYW1cIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSAzLjUgLS0gQ2FybGlzbGUgLS0gMSAtLSBHbGFzZ293XCIsIFxuICBcIkxvbmRvbiAtLSAyIC0tIFlvcmsgLS0gNCAtLSBFZGluYnVyZ2hcIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSA0IC0tIEVkaW5idXJnaCAtLSAxIC0tIEdsYXNnb3dcIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSA0IC0tIEVkaW5idXJnaCAtLSAzIC0tIExldWNoYXJzXCIsIFxuICBcIkxvbmRvbiAtLSAyLjUgLS0gQmlybWluZ2hhbSAtLSAxIC0tIENhcmxpc2xlXCIsIFxuICBcIkxvbmRvbiAtLSAyLjUgLS0gQmlybWluZ2hhbSAtLSAxIC0tIENhcmxpc2xlIC0tIDIuNSAtLSBZb3JrXCIsIFxuICBcIkxvbmRvbiAtLSAyLjUgLS0gQmlybWluZ2hhbSAtLSAxIC0tIENhcmxpc2xlIC0tIDEgLS0gR2xhc2dvd1wiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfZ3JhcGhQcnVuZUV4YW1wbGUyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHTRAV_graphPruneExample3_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTMKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgInBsYWNlcy9Mb25kb24iIEdSQVBIICJrU2hvcnRlc3RQYXRoc0dyYXBoIgogIFBSVU5FIHYubGFiZWwgPT0gIkNhcmxpc2xlIiBPUiBlLnRyYXZlbFRpbWUgPiAzCiAgT1BUSU9OUyB7IHVuaXF1ZVZlcnRpY2VzOiAicGF0aCIgfQogIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIgLS0gIiwgSU5URVJMRUFWRShwLnZlcnRpY2VzWypdLmxhYmVsLCBwLmVkZ2VzWypdLnRyYXZlbFRpbWUpKQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgXCJwbGFjZXMvTG9uZG9uXCIgR1JBUEggXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCJcbiAgUFJVTkUgdi5sYWJlbCA9PSBcIkNhcmxpc2xlXCIgT1IgZS50cmF2ZWxUaW1lIFx1MDAzZSAzXG4gIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogXCJwYXRoXCIgfVxuICBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUihcIiAtLSBcIiwgSU5URVJMRUFWRShwLnZlcnRpY2VzWypdLmxhYmVsLCBwLmVkZ2VzWypdLnRyYXZlbFRpbWUpKSIsIm91dHB1dCI6IlsgXG4gIFwiTG9uZG9uIC0tIDIuNSAtLSBCcnVzc2VscyAtLSAyIC0tIENvbG9nbmVcIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSAzLjUgLS0gQ2FybGlzbGVcIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSA0IC0tIEVkaW5idXJnaFwiLCBcbiAgXCJMb25kb24gLS0gMi41IC0tIEJpcm1pbmdoYW0gLS0gMSAtLSBDYXJsaXNsZVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfZ3JhcGhQcnVuZUV4YW1wbGUzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHTRAV_graphPruneExample4_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTQKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgInBsYWNlcy9Mb25kb24iIEdSQVBIICJrU2hvcnRlc3RQYXRoc0dyYXBoIgogIFBSVU5FIGNvbmQgPSB2LmxhYmVsID09ICJDYXJsaXNsZSIgT1IgZS50cmF2ZWxUaW1lID4gMwogIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogInBhdGgiIH0KICBGSUxURVIgY29uZAogIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIgLS0gIiwgSU5URVJMRUFWRShwLnZlcnRpY2VzWypdLmxhYmVsLCBwLmVkZ2VzWypdLnRyYXZlbFRpbWUpKQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgXCJwbGFjZXMvTG9uZG9uXCIgR1JBUEggXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCJcbiAgUFJVTkUgY29uZCA9IHYubGFiZWwgPT0gXCJDYXJsaXNsZVwiIE9SIGUudHJhdmVsVGltZSBcdTAwM2UgM1xuICBPUFRJT05TIHsgdW5pcXVlVmVydGljZXM6IFwicGF0aFwiIH1cbiAgRklMVEVSIGNvbmRcbiAgUkVUVVJOIENPTkNBVF9TRVBBUkFUT1IoXCIgLS0gXCIsIElOVEVSTEVBVkUocC52ZXJ0aWNlc1sqXS5sYWJlbCwgcC5lZGdlc1sqXS50cmF2ZWxUaW1lKSkiLCJvdXRwdXQiOiJbIFxuICBcIkxvbmRvbiAtLSAyIC0tIFlvcmsgLS0gMy41IC0tIENhcmxpc2xlXCIsIFxuICBcIkxvbmRvbiAtLSAyIC0tIFlvcmsgLS0gNCAtLSBFZGluYnVyZ2hcIiwgXG4gIFwiTG9uZG9uIC0tIDIuNSAtLSBCaXJtaW5naGFtIC0tIDEgLS0gQ2FybGlzbGVcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWX2dyYXBoUHJ1bmVFeGFtcGxlNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia1Nob3J0ZXN0UGF0aHNHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_graphPruneExample5_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTUKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgInBsYWNlcy9Mb25kb24iIEdSQVBIICJrU2hvcnRlc3RQYXRoc0dyYXBoIgogIFBSVU5FIGNvbmQgPSB2LmxhYmVsID09ICJDYXJsaXNsZSIgT1IgZS50cmF2ZWxUaW1lID4gMwogIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogInBhdGgiIH0KICBGSUxURVIgTk9UIGNvbmQKICBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUigiIC0tICIsIElOVEVSTEVBVkUocC52ZXJ0aWNlc1sqXS5sYWJlbCwgcC5lZGdlc1sqXS50cmF2ZWxUaW1lKSk=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgXCJwbGFjZXMvTG9uZG9uXCIgR1JBUEggXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCJcbiAgUFJVTkUgY29uZCA9IHYubGFiZWwgPT0gXCJDYXJsaXNsZVwiIE9SIGUudHJhdmVsVGltZSBcdTAwM2UgM1xuICBPUFRJT05TIHsgdW5pcXVlVmVydGljZXM6IFwicGF0aFwiIH1cbiAgRklMVEVSIE5PVCBjb25kXG4gIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiIC0tIFwiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkpIiwib3V0cHV0IjoiWyBcbiAgXCJMb25kb24gLS0gMi41IC0tIEJydXNzZWxzIC0tIDIgLS0gQ29sb2duZVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfZ3JhcGhQcnVuZUV4YW1wbGU1IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHTRAV_graphPruneExample6_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTYKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDIuLjUgT1VUQk9VTkQgInBsYWNlcy9Mb25kb24iIEdSQVBIICJrU2hvcnRlc3RQYXRoc0dyYXBoIgogIFBSVU5FIGNvbmQgPSB2LmxhYmVsID09ICJDYXJsaXNsZSIgT1IgZS50cmF2ZWxUaW1lID4gMwogIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogInBhdGgiIH0KICBGSUxURVIgY29uZCBBTkQgcC5lZGdlc1stMV0udHJhdmVsVGltZSA+PSBwLmVkZ2VzWy0yXS50cmF2ZWxUaW1lCiAgUkVUVVJOIENPTkNBVF9TRVBBUkFUT1IoIiAtLSAiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkp", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDIuLjUgT1VUQk9VTkQgXCJwbGFjZXMvTG9uZG9uXCIgR1JBUEggXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCJcbiAgUFJVTkUgY29uZCA9IHYubGFiZWwgPT0gXCJDYXJsaXNsZVwiIE9SIGUudHJhdmVsVGltZSBcdTAwM2UgM1xuICBPUFRJT05TIHsgdW5pcXVlVmVydGljZXM6IFwicGF0aFwiIH1cbiAgRklMVEVSIGNvbmQgQU5EIHAuZWRnZXNbLTFdLnRyYXZlbFRpbWUgXHUwMDNlPSBwLmVkZ2VzWy0yXS50cmF2ZWxUaW1lXG4gIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiIC0tIFwiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkpIiwib3V0cHV0IjoiWyBcbiAgXCJMb25kb24gLS0gMiAtLSBZb3JrIC0tIDMuNSAtLSBDYXJsaXNsZVwiLCBcbiAgXCJMb25kb24gLS0gMiAtLSBZb3JrIC0tIDQgLS0gRWRpbmJ1cmdoXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTYiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6ImtTaG9ydGVzdFBhdGhzR3JhcGgifX0K" + }, + "GRAPHTRAV_graphPruneExample7_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTcKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgInBsYWNlcy9Mb25kb24iIEdSQVBIICJrU2hvcnRlc3RQYXRoc0dyYXBoIgogIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogInBhdGgiIH0KICBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUigiIC0tICIsIElOVEVSTEVBVkUocC52ZXJ0aWNlc1sqXS5sYWJlbCwgcC5lZGdlc1sqXS50cmF2ZWxUaW1lKSk=", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDIuLjMgT1VUQk9VTkQgXCJwbGFjZXMvTG9uZG9uXCIgR1JBUEggXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCJcbiAgT1BUSU9OUyB7IHVuaXF1ZVZlcnRpY2VzOiBcInBhdGhcIiB9XG4gIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiIC0tIFwiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkpIiwib3V0cHV0IjoiWyBcbiAgXCJMb25kb24gLS0gMi41IC0tIEJydXNzZWxzIC0tIDIgLS0gQ29sb2duZVwiLCBcbiAgXCJMb25kb24gLS0gMiAtLSBZb3JrIC0tIDMuNSAtLSBDYXJsaXNsZVwiLCBcbiAgXCJMb25kb24gLS0gMiAtLSBZb3JrIC0tIDMuNSAtLSBDYXJsaXNsZSAtLSAyIC0tIEJpcm1pbmdoYW1cIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSAzLjUgLS0gQ2FybGlzbGUgLS0gMSAtLSBHbGFzZ293XCIsIFxuICBcIkxvbmRvbiAtLSAyIC0tIFlvcmsgLS0gNCAtLSBFZGluYnVyZ2hcIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSA0IC0tIEVkaW5idXJnaCAtLSAxIC0tIEdsYXNnb3dcIiwgXG4gIFwiTG9uZG9uIC0tIDIgLS0gWW9yayAtLSA0IC0tIEVkaW5idXJnaCAtLSAzIC0tIExldWNoYXJzXCIsIFxuICBcIkxvbmRvbiAtLSAyLjUgLS0gQmlybWluZ2hhbSAtLSAxIC0tIENhcmxpc2xlXCIsIFxuICBcIkxvbmRvbiAtLSAyLjUgLS0gQmlybWluZ2hhbSAtLSAxIC0tIENhcmxpc2xlIC0tIDIuNSAtLSBZb3JrXCIsIFxuICBcIkxvbmRvbiAtLSAyLjUgLS0gQmlybWluZ2hhbSAtLSAxIC0tIENhcmxpc2xlIC0tIDEgLS0gR2xhc2dvd1wiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfZ3JhcGhQcnVuZUV4YW1wbGU3IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "GRAPHTRAV_graphPruneExample8_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTgKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LGUscCBJTiAyLi4zIE9VVEJPVU5EICJwbGFjZXMvTG9uZG9uIiBHUkFQSCAia1Nob3J0ZXN0UGF0aHNHcmFwaCIKICBQUlVORSB2LmxhYmVsID09ICJHbGFzZ293IiBPUiBlLnRyYXZlbFRpbWUgPCAyLjUKICBPUFRJT05TIHsgdW5pcXVlVmVydGljZXM6ICJwYXRoIiB9CiAgUkVUVVJOIENPTkNBVF9TRVBBUkFUT1IoIiAtLSAiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkp", + "response": "eyJpbnB1dCI6IkZPUiB2LGUscCBJTiAyLi4zIE9VVEJPVU5EIFwicGxhY2VzL0xvbmRvblwiIEdSQVBIIFwia1Nob3J0ZXN0UGF0aHNHcmFwaFwiXG4gIFBSVU5FIHYubGFiZWwgPT0gXCJHbGFzZ293XCIgT1IgZS50cmF2ZWxUaW1lIFx1MDAzYyAyLjVcbiAgT1BUSU9OUyB7IHVuaXF1ZVZlcnRpY2VzOiBcInBhdGhcIiB9XG4gIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiIC0tIFwiLCBJTlRFUkxFQVZFKHAudmVydGljZXNbKl0ubGFiZWwsIHAuZWRnZXNbKl0udHJhdmVsVGltZSkpIiwib3V0cHV0IjoiWyBdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6ImtTaG9ydGVzdFBhdGhzR3JhcGgifX0K" + }, + "GRAPHTRAV_graphPruneExample9_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9ncmFwaFBydW5lRXhhbXBsZTkKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGtTaG9ydGVzdFBhdGhzR3JhcGgKLS0tCkZPUiB2LGUscCBJTiAyLi4zIE9VVEJPVU5EICJwbGFjZXMvTG9uZG9uIiBHUkFQSCAia1Nob3J0ZXN0UGF0aHNHcmFwaCIKICBQUlVORSB2LmxhYmVsID09ICJHbGFzZ293IiBPUiAoZSAhPSBudWxsIEFORCBlLnRyYXZlbFRpbWUgPCAyLjUpCiAgT1BUSU9OUyB7IHVuaXF1ZVZlcnRpY2VzOiAicGF0aCIgfQogIFJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIgLS0gIiwgSU5URVJMRUFWRShwLnZlcnRpY2VzWypdLmxhYmVsLCBwLmVkZ2VzWypdLnRyYXZlbFRpbWUpKQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LGUscCBJTiAyLi4zIE9VVEJPVU5EIFwicGxhY2VzL0xvbmRvblwiIEdSQVBIIFwia1Nob3J0ZXN0UGF0aHNHcmFwaFwiXG4gIFBSVU5FIHYubGFiZWwgPT0gXCJHbGFzZ293XCIgT1IgKGUgIT0gbnVsbCBBTkQgZS50cmF2ZWxUaW1lIFx1MDAzYyAyLjUpXG4gIE9QVElPTlMgeyB1bmlxdWVWZXJ0aWNlczogXCJwYXRoXCIgfVxuICBSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUihcIiAtLSBcIiwgSU5URVJMRUFWRShwLnZlcnRpY2VzWypdLmxhYmVsLCBwLmVkZ2VzWypdLnRyYXZlbFRpbWUpKSIsIm91dHB1dCI6IlsgXG4gIFwiTG9uZG9uIC0tIDIuNSAtLSBCcnVzc2VscyAtLSAyIC0tIENvbG9nbmVcIiwgXG4gIFwiTG9uZG9uIC0tIDIuNSAtLSBCaXJtaW5naGFtIC0tIDEgLS0gQ2FybGlzbGVcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiR1JBUEhUUkFWX2dyYXBoUHJ1bmVFeGFtcGxlOSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia1Nob3J0ZXN0UGF0aHNHcmFwaCJ9fQo=" + }, + "GRAPHTRAV_removeVertex1_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9yZW1vdmVWZXJ0ZXgxCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrbm93c19ncmFwaAotLS0KTEVUIGVkZ2VLZXlzID0gKEZPUiB2LCBlIElOIDEuLjEgQU5ZICdwZXJzb25zL2V2ZScgR1JBUEggJ2tub3dzX2dyYXBoJyBSRVRVUk4gZS5fa2V5KQpMRVQgciA9IChGT1Iga2V5IElOIGVkZ2VLZXlzIFJFTU9WRSBrZXkgSU4ga25vd3MpIApSRU1PVkUgJ2V2ZScgSU4gcGVyc29ucw==", + "response": "eyJpbnB1dCI6IkxFVCBlZGdlS2V5cyA9IChGT1IgdiwgZSBJTiAxLi4xIEFOWSAncGVyc29ucy9ldmUnIEdSQVBIICdrbm93c19ncmFwaCcgUkVUVVJOIGUuX2tleSlcbkxFVCByID0gKEZPUiBrZXkgSU4gZWRnZUtleXMgUkVNT1ZFIGtleSBJTiBrbm93cykgXG5SRU1PVkUgJ2V2ZScgSU4gcGVyc29ucyIsIm91dHB1dCI6IlsgXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfcmVtb3ZlVmVydGV4MSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "GRAPHTRAV_removeVertex2_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9yZW1vdmVWZXJ0ZXgyCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrbm93c19ncmFwaAotLS0KTEVUIGVkZ2VLZXlzID0gKEZPUiB2LCBlIElOIDEuLjEgQU5ZICdwZXJzb25zL2V2ZScgR1JBUEggJ2tub3dzX2dyYXBoJwogICAgICAgICAgICBSRU1PVkUgZS5fa2V5IElOIGtub3dzKQpSRU1PVkUgJ2V2ZScgSU4gcGVyc29ucw==", + "response": "eyJpbnB1dCI6IkxFVCBlZGdlS2V5cyA9IChGT1IgdiwgZSBJTiAxLi4xIEFOWSAncGVyc29ucy9ldmUnIEdSQVBIICdrbm93c19ncmFwaCdcbiAgICAgICAgICAgIFJFTU9WRSBlLl9rZXkgSU4ga25vd3MpXG5SRU1PVkUgJ2V2ZScgSU4gcGVyc29ucyIsIm91dHB1dCI6IlsgXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfcmVtb3ZlVmVydGV4MiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoia25vd3NfZ3JhcGgifX0K" + }, + "GRAPHTRAV_removeVertex3_single": { + "request": "LS0tCm5hbWU6IEdSQVBIVFJBVl9yZW1vdmVWZXJ0ZXgzCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiByb3V0ZXBsYW5uZXIKLS0tCkxFVCBlZGdlS2V5cyA9IChGT1IgdiwgZSBJTiAxLi4xIEFOWSAnZ2VybWFuQ2l0eS9CZXJsaW4nIEdSQVBIICdyb3V0ZXBsYW5uZXInIFJFVFVSTiBlLl9rZXkpCkxFVCByID0gKEZPUiBrZXkgSU4gZWRnZUtleXMgUkVNT1ZFIGtleSBJTiBpbnRlcm5hdGlvbmFsSGlnaHdheQogICAgICAgIE9QVElPTlMgeyBpZ25vcmVFcnJvcnM6IHRydWUgfSBSRU1PVkUga2V5IElOIGdlcm1hbkhpZ2h3YXkKICAgICAgICBPUFRJT05TIHsgaWdub3JlRXJyb3JzOiB0cnVlIH0gUkVNT1ZFIGtleSBJTiBmcmVuY2hIaWdod2F5CiAgICAgICAgT1BUSU9OUyB7IGlnbm9yZUVycm9yczogdHJ1ZSB9KSAKUkVNT1ZFICdCZXJsaW4nIElOIGdlcm1hbkNpdHk=", + "response": "eyJpbnB1dCI6IkxFVCBlZGdlS2V5cyA9IChGT1IgdiwgZSBJTiAxLi4xIEFOWSAnZ2VybWFuQ2l0eS9CZXJsaW4nIEdSQVBIICdyb3V0ZXBsYW5uZXInIFJFVFVSTiBlLl9rZXkpXG5MRVQgciA9IChGT1Iga2V5IElOIGVkZ2VLZXlzIFJFTU9WRSBrZXkgSU4gaW50ZXJuYXRpb25hbEhpZ2h3YXlcbiAgICAgICAgT1BUSU9OUyB7IGlnbm9yZUVycm9yczogdHJ1ZSB9IFJFTU9WRSBrZXkgSU4gZ2VybWFuSGlnaHdheVxuICAgICAgICBPUFRJT05TIHsgaWdub3JlRXJyb3JzOiB0cnVlIH0gUkVNT1ZFIGtleSBJTiBmcmVuY2hIaWdod2F5XG4gICAgICAgIE9QVElPTlMgeyBpZ25vcmVFcnJvcnM6IHRydWUgfSkgXG5SRU1PVkUgJ0JlcmxpbicgSU4gZ2VybWFuQ2l0eSIsIm91dHB1dCI6IlsgXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJHUkFQSFRSQVZfcmVtb3ZlVmVydGV4MyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoicm91dGVwbGFubmVyIn19Cg==" + }, + "HttpClearQueryResultsCache_single": { + "request": "LS0tCm5hbWU6IEh0dHBDbGVhclF1ZXJ5UmVzdWx0c0NhY2hlCmRlc2NyaXB0aW9uOiB8CiAgQ2xlYXIgdGhlIEFRTCBxdWVyeSByZXN1bHRzIGNhY2hlIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlOgotLS0KdmFyIHVybCA9ICIvX2FwaS9xdWVyeS1jYWNoZSI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9xdWVyeS1jYWNoZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI2XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ2xlYXIgdGhlIEFRTCBxdWVyeSByZXN1bHRzIGNhY2hlIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlOlxuIiwibmFtZSI6Ikh0dHBDbGVhclF1ZXJ5UmVzdWx0c0NhY2hlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGetQueryResultsCacheProperties_single": { + "request": "LS0tCm5hbWU6IEh0dHBHZXRRdWVyeVJlc3VsdHNDYWNoZVByb3BlcnRpZXMKZGVzY3JpcHRpb246IHwKICBSZXRyaWV2ZSB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIEFRTCBxdWVyeSByZXN1bHRzIGNhY2hlOgotLS0KdmFyIHJlc3VsdHNDYWNoZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvY2FjaGUiKTsKcmVzdWx0c0NhY2hlLnByb3BlcnRpZXMoeyBtb2RlOiAiZGVtYW5kIiB9KTsgCgp2YXIgdXJsID0gIi9fYXBpL3F1ZXJ5LWNhY2hlL3Byb3BlcnRpZXMiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5Lm1vZGUgPT0gImRlbWFuZCIpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3F1ZXJ5LWNhY2hlL3Byb3BlcnRpZXMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMDdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJtb2RlXCIgOiBcImRlbWFuZFwiLCBcbiAgXCJtYXhSZXN1bHRzXCIgOiAxMjgsIFxuICBcIm1heFJlc3VsdHNTaXplXCIgOiAyNjg0MzU0NTYsIFxuICBcIm1heEVudHJ5U2l6ZVwiIDogMTY3NzcyMTYsIFxuICBcImluY2x1ZGVTeXN0ZW1cIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHJpZXZlIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgQVFMIHF1ZXJ5IHJlc3VsdHMgY2FjaGU6XG4iLCJuYW1lIjoiSHR0cEdldFF1ZXJ5UmVzdWx0c0NhY2hlUHJvcGVydGllcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "HttpGharialAddEdgeCol_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEFkZEVkZ2VDb2wKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbC9zb2NpYWwvZWRnZSI7CmJvZHkgPSB7CiAgY29sbGVjdGlvbjogIndvcmtzX2luIiwKICBmcm9tOiBbImZlbWFsZSIsICJtYWxlIl0sCiAgdG86IFsiY2l0eSJdCn07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcImNvbGxlY3Rpb25cIjogXCJ3b3Jrc19pblwiLFxuICBcImZyb21cIjogW1xuICAgIFwiZmVtYWxlXCIsXG4gICAgXCJtYWxlXCJcbiAgXSxcbiAgXCJ0b1wiOiBbXG4gICAgXCJjaXR5XCJcbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyOTRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUpzbS0tLVxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcImdyYXBoXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJzb2NpYWxcIiwgXG4gICAgXCJlZGdlRGVmaW5pdGlvbnNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwicmVsYXRpb25cIiwgXG4gICAgICAgIFwiZnJvbVwiIDogWyBcbiAgICAgICAgICBcImZlbWFsZVwiLCBcbiAgICAgICAgICBcIm1hbGVcIiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwidG9cIiA6IFsgXG4gICAgICAgICAgXCJmZW1hbGVcIiwgXG4gICAgICAgICAgXCJtYWxlXCIgXG4gICAgICAgIF0gXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJ3b3Jrc19pblwiLCBcbiAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgIFwiZmVtYWxlXCIsIFxuICAgICAgICAgIFwibWFsZVwiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcImNpdHlcIiBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBdLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKc20tLS1cIiwgXG4gICAgXCJfaWRcIiA6IFwiX2dyYXBocy9zb2NpYWxcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNvY2lhbFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbEFkZEVkZ2VDb2wiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialAddEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEFkZEVkZ2UKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbC9zb2NpYWwvZWRnZS9yZWxhdGlvbiI7CmJvZHkgPSB7CiAgdHlwZTogImZyaWVuZCIsCiAgX2Zyb206ICJmZW1hbGUvYWxpY2UiLAogIF90bzogImZlbWFsZS9kaWFuYSIKfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpleGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlL3JlbGF0aW9uJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJmcmllbmRcIixcbiAgXCJfZnJvbVwiOiBcImZlbWFsZS9hbGljZVwiLFxuICBcIl90b1wiOiBcImZlbWFsZS9kaWFuYVwiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDk0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogX2p0M2FKMm0tLS1cbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAyLCBcbiAgXCJlZGdlXCIgOiB7IFxuICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzcxNzI0XCIsIFxuICAgIFwiX2tleVwiIDogXCI3MTcyNFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKMm0tLS1cIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSHR0cEdoYXJpYWxBZGRFZGdlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGharialAddVertexCol_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEFkZFZlcnRleENvbAotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgiOwpib2R5ID0gewogIGNvbGxlY3Rpb246ICJvdGhlclZlcnRpY2VzIgp9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiY29sbGVjdGlvblwiOiBcIm90aGVyVmVydGljZXNcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyNDRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUpuMi0tX1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcImdyYXBoXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJzb2NpYWxcIiwgXG4gICAgXCJlZGdlRGVmaW5pdGlvbnNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwicmVsYXRpb25cIiwgXG4gICAgICAgIFwiZnJvbVwiIDogWyBcbiAgICAgICAgICBcImZlbWFsZVwiLCBcbiAgICAgICAgICBcIm1hbGVcIiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwidG9cIiA6IFsgXG4gICAgICAgICAgXCJmZW1hbGVcIiwgXG4gICAgICAgICAgXCJtYWxlXCIgXG4gICAgICAgIF0gXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICBcIm90aGVyVmVydGljZXNcIiBcbiAgICBdLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKbjItLV9cIiwgXG4gICAgXCJfaWRcIiA6IFwiX2dyYXBocy9zb2NpYWxcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNvY2lhbFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbEFkZFZlcnRleENvbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "HttpGharialAddVertex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEFkZFZlcnRleAotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvbWFsZSI7CmJvZHkgPSB7CiAgbmFtZTogIkZyYW5jaXMiCn0KdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpleGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvbWFsZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwiRnJhbmNpc1wiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDkyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogX2p0M2FKd20tLV9cbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAyLCBcbiAgXCJ2ZXJ0ZXhcIiA6IHsgXG4gICAgXCJfaWRcIiA6IFwibWFsZS83MTQyMFwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNzE0MjBcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhSndtLS1fXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Ikh0dHBHaGFyaWFsQWRkVmVydGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGharialCreateDisjointSmart_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIGRpc2pvaW50IFNtYXJ0R3JhcGguIFRoaXMgZ3JhcGggdXNlcyA5IHNoYXJkcyBhbmQKICBpcyBzaGFyZGVkIGJ5IHRoZSAicmVnaW9uIiBhdHRyaWJ1dGUuCiAgQXZhaWxhYmxlIGluIHRoZSBFbnRlcnByaXNlIEVkaXRpb24gb25seS4KICBOb3RlIHRoYXQgYXMgeW91IGFyZSB1c2luZyBhIGRpc2pvaW50IHZlcnNpb24sIHlvdSBjYW4gb25seQogIGNyZWF0ZSBlZGdlcyBiZXR3ZWVuIHZlcnRpY2VzIHNoYXJpbmcgdGhlIHNhbWUgcmVnaW9uLgpuYW1lOiBIdHRwR2hhcmlhbENyZWF0ZURpc2pvaW50U21hcnQKLS0tCnZhciBncmFwaCA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CiBpZiAoZ3JhcGguX2V4aXN0cygiZGlzam9pbnRTbWFydEdyYXBoIikpIHsKICAgIGdyYXBoLl9kcm9wKCJkaXNqb2ludFNtYXJ0R3JhcGgiLCB0cnVlKTsKfQp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwiOwpib2R5ID0gewogIG5hbWU6ICJkaXNqb2ludFNtYXJ0R3JhcGgiLAogIGVkZ2VEZWZpbml0aW9uczogW3sKICAgIGNvbGxlY3Rpb246ICJlZGdlcyIsCiAgICBmcm9tOiBbICJzdGFydFZlcnRpY2VzIiBdLAogICAgdG86IFsgImVuZFZlcnRpY2VzIiBdCiAgfV0sCiAgb3JwaGFuQ29sbGVjdGlvbnM6IFsgIm9ycGhhblZlcnRpY2VzIiBdLAogIGlzU21hcnQ6IHRydWUsCiAgb3B0aW9uczogewogICAgaXNEaXNqb2ludDogdHJ1ZSwKICAgIHJlcGxpY2F0aW9uRmFjdG9yOiAyLAogICAgbnVtYmVyT2ZTaGFyZHM6IDksCiAgICBzbWFydEdyYXBoQXR0cmlidXRlOiAicmVnaW9uIgogIH0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmdyYXBoLl9kcm9wKCJkaXNqb2ludFNtYXJ0R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJkaXNqb2ludFNtYXJ0R3JhcGhcIixcbiAgXCJlZGdlRGVmaW5pdGlvbnNcIjogW1xuICAgIHtcbiAgICAgIFwiY29sbGVjdGlvblwiOiBcImVkZ2VzXCIsXG4gICAgICBcImZyb21cIjogW1xuICAgICAgICBcInN0YXJ0VmVydGljZXNcIlxuICAgICAgXSxcbiAgICAgIFwidG9cIjogW1xuICAgICAgICBcImVuZFZlcnRpY2VzXCJcbiAgICAgIF1cbiAgICB9XG4gIF0sXG4gIFwib3JwaGFuQ29sbGVjdGlvbnNcIjogW1xuICAgIFwib3JwaGFuVmVydGljZXNcIlxuICBdLFxuICBcImlzU21hcnRcIjogdHJ1ZSxcbiAgXCJvcHRpb25zXCI6IHtcbiAgICBcImlzRGlzam9pbnRcIjogdHJ1ZSxcbiAgICBcInJlcGxpY2F0aW9uRmFjdG9yXCI6IDIsXG4gICAgXCJudW1iZXJPZlNoYXJkc1wiOiA5LFxuICAgIFwic21hcnRHcmFwaEF0dHJpYnV0ZVwiOiBcInJlZ2lvblwiXG4gIH1cbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDg4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogX2p0M2FKZ0stLUFcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAyLCBcbiAgXCJncmFwaFwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiZGlzam9pbnRTbWFydEdyYXBoXCIsIFxuICAgIFwibnVtYmVyT2ZTaGFyZHNcIiA6IDksIFxuICAgIFwicmVwbGljYXRpb25GYWN0b3JcIiA6IDIsIFxuICAgIFwibWluUmVwbGljYXRpb25GYWN0b3JcIiA6IDEsIFxuICAgIFwid3JpdGVDb25jZXJuXCIgOiAxLCBcbiAgICBcImlzU21hcnRcIiA6IHRydWUsIFxuICAgIFwiaXNTYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJlZGdlc1wiLCBcbiAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgIFwic3RhcnRWZXJ0aWNlc1wiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcImVuZFZlcnRpY2VzXCIgXG4gICAgICAgIF0gXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICBcIm9ycGhhblZlcnRpY2VzXCIgXG4gICAgXSwgXG4gICAgXCJpbml0aWFsXCIgOiBcInN0YXJ0VmVydGljZXNcIiwgXG4gICAgXCJpbml0aWFsQ2lkXCIgOiA3MDU0NSwgXG4gICAgXCJzbWFydEdyYXBoQXR0cmlidXRlXCIgOiBcInJlZ2lvblwiLCBcbiAgICBcImlzRGlzam9pbnRcIiA6IHRydWUsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUpnSy0tQVwiLCBcbiAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL2Rpc2pvaW50U21hcnRHcmFwaFwiLCBcbiAgICBcIm5hbWVcIiA6IFwiZGlzam9pbnRTbWFydEdyYXBoXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRlIGEgZGlzam9pbnQgU21hcnRHcmFwaC4gVGhpcyBncmFwaCB1c2VzIDkgc2hhcmRzIGFuZFxuaXMgc2hhcmRlZCBieSB0aGUgXCJyZWdpb25cIiBhdHRyaWJ1dGUuXG5BdmFpbGFibGUgaW4gdGhlIEVudGVycHJpc2UgRWRpdGlvbiBvbmx5LlxuTm90ZSB0aGF0IGFzIHlvdSBhcmUgdXNpbmcgYSBkaXNqb2ludCB2ZXJzaW9uLCB5b3UgY2FuIG9ubHlcbmNyZWF0ZSBlZGdlcyBiZXR3ZWVuIHZlcnRpY2VzIHNoYXJpbmcgdGhlIHNhbWUgcmVnaW9uLiIsIm5hbWUiOiJIdHRwR2hhcmlhbENyZWF0ZURpc2pvaW50U21hcnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialCreateEnterprise_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhbiBFbnRlcnByaXNlR3JhcGguIFRoaXMgZ3JhcGggdXNlcyA5IHNoYXJkcywKICBpdCBkb2VzIG5vdCBtYWtlIHVzZSBvZiBzcGVjaWZpYyBzaGFyZGluZyBhdHRyaWJ1dGVzLgogIEF2YWlsYWJsZSBpbiB0aGUgRW50ZXJwcmlzZSBFZGl0aW9uIG9ubHkuCm5hbWU6IEh0dHBHaGFyaWFsQ3JlYXRlRW50ZXJwcmlzZQotLS0KdmFyIGdyYXBoID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKIGlmIChncmFwaC5fZXhpc3RzKCJlbnRlcnByaXNlR3JhcGgiKSkgewogICAgZ3JhcGguX2Ryb3AoImVudGVycHJpc2VHcmFwaCIsIHRydWUpOwp9CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbCI7CmJvZHkgPSB7CiAgbmFtZTogImVudGVycHJpc2VHcmFwaCIsCiAgZWRnZURlZmluaXRpb25zOiBbewogICAgY29sbGVjdGlvbjogImVkZ2VzIiwKICAgIGZyb206IFsgInN0YXJ0VmVydGljZXMiIF0sCiAgICB0bzogWyAiZW5kVmVydGljZXMiIF0KICB9XSwKICBvcnBoYW5Db2xsZWN0aW9uczogWyBdLAogIGlzU21hcnQ6IHRydWUsCiAgb3B0aW9uczogewogICAgcmVwbGljYXRpb25GYWN0b3I6IDIsCiAgICBudW1iZXJPZlNoYXJkczogOSwKICB9Cn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpncmFwaC5fZHJvcCgiZW50ZXJwcmlzZUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJlbnRlcnByaXNlR3JhcGhcIixcbiAgXCJlZGdlRGVmaW5pdGlvbnNcIjogW1xuICAgIHtcbiAgICAgIFwiY29sbGVjdGlvblwiOiBcImVkZ2VzXCIsXG4gICAgICBcImZyb21cIjogW1xuICAgICAgICBcInN0YXJ0VmVydGljZXNcIlxuICAgICAgXSxcbiAgICAgIFwidG9cIjogW1xuICAgICAgICBcImVuZFZlcnRpY2VzXCJcbiAgICAgIF1cbiAgICB9XG4gIF0sXG4gIFwib3JwaGFuQ29sbGVjdGlvbnNcIjogW10sXG4gIFwiaXNTbWFydFwiOiB0cnVlLFxuICBcIm9wdGlvbnNcIjoge1xuICAgIFwicmVwbGljYXRpb25GYWN0b3JcIjogMixcbiAgICBcIm51bWJlck9mU2hhcmRzXCI6IDlcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0MzNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUppQy0tQVxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcImdyYXBoXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJlbnRlcnByaXNlR3JhcGhcIiwgXG4gICAgXCJudW1iZXJPZlNoYXJkc1wiIDogOSwgXG4gICAgXCJyZXBsaWNhdGlvbkZhY3RvclwiIDogMiwgXG4gICAgXCJtaW5SZXBsaWNhdGlvbkZhY3RvclwiIDogMSwgXG4gICAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICAgIFwiaXNTbWFydFwiIDogdHJ1ZSwgXG4gICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgIFwiZWRnZURlZmluaXRpb25zXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImVkZ2VzXCIsIFxuICAgICAgICBcImZyb21cIiA6IFsgXG4gICAgICAgICAgXCJzdGFydFZlcnRpY2VzXCIgXG4gICAgICAgIF0sIFxuICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgIFwiZW5kVmVydGljZXNcIiBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBdLCBcbiAgICBcImluaXRpYWxcIiA6IFwic3RhcnRWZXJ0aWNlc1wiLCBcbiAgICBcImluaXRpYWxDaWRcIiA6IDcwNjUzLCBcbiAgICBcImlzRGlzam9pbnRcIiA6IGZhbHNlLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKaUMtLUFcIiwgXG4gICAgXCJfaWRcIiA6IFwiX2dyYXBocy9lbnRlcnByaXNlR3JhcGhcIiwgXG4gICAgXCJuYW1lXCIgOiBcImVudGVycHJpc2VHcmFwaFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNyZWF0ZSBhbiBFbnRlcnByaXNlR3JhcGguIFRoaXMgZ3JhcGggdXNlcyA5IHNoYXJkcyxcbml0IGRvZXMgbm90IG1ha2UgdXNlIG9mIHNwZWNpZmljIHNoYXJkaW5nIGF0dHJpYnV0ZXMuXG5BdmFpbGFibGUgaW4gdGhlIEVudGVycHJpc2UgRWRpdGlvbiBvbmx5LiIsIm5hbWUiOiJIdHRwR2hhcmlhbENyZWF0ZUVudGVycHJpc2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialCreateSatellite_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIFNhdGVsbGl0ZUdyYXBoLiBBIFNhdGVsbGl0ZUdyYXBoIGRvZXMgbm90IHVzZQogIHNoYXJkcywgYnV0IHVzZXMgInNhdGVsbGl0ZSIgYXMgcmVwbGljYXRpb25GYWN0b3IuCiAgTWFrZSBzdXJlIHRvIGtlZXAgdGhpcyBncmFwaCBzbWFsbCBhcyBpdCBpcyBjbG9uZWQKICB0byBldmVyeSBzZXJ2ZXIuCiAgQXZhaWxhYmxlIGluIHRoZSBFbnRlcnByaXNlIEVkaXRpb24gb25seS4KbmFtZTogSHR0cEdoYXJpYWxDcmVhdGVTYXRlbGxpdGUKLS0tCnZhciBncmFwaCA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CiBpZiAoZ3JhcGguX2V4aXN0cygic2F0ZWxsaXRlR3JhcGgiKSkgewogICAgZ3JhcGguX2Ryb3AoInNhdGVsbGl0ZUdyYXBoIiwgdHJ1ZSk7Cn0KdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsIjsKYm9keSA9IHsKICBuYW1lOiAic2F0ZWxsaXRlR3JhcGgiLAogIGVkZ2VEZWZpbml0aW9uczogW3sKICAgIGNvbGxlY3Rpb246ICJlZGdlcyIsCiAgICBmcm9tOiBbICJzdGFydFZlcnRpY2VzIiBdLAogICAgdG86IFsgImVuZFZlcnRpY2VzIiBdCiAgfV0sCiAgb3JwaGFuQ29sbGVjdGlvbnM6IFsgXSwKICBvcHRpb25zOiB7CiAgICByZXBsaWNhdGlvbkZhY3RvcjogInNhdGVsbGl0ZSIKICB9Cn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpncmFwaC5fZHJvcCgic2F0ZWxsaXRlR3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJzYXRlbGxpdGVHcmFwaFwiLFxuICBcImVkZ2VEZWZpbml0aW9uc1wiOiBbXG4gICAge1xuICAgICAgXCJjb2xsZWN0aW9uXCI6IFwiZWRnZXNcIixcbiAgICAgIFwiZnJvbVwiOiBbXG4gICAgICAgIFwic3RhcnRWZXJ0aWNlc1wiXG4gICAgICBdLFxuICAgICAgXCJ0b1wiOiBbXG4gICAgICAgIFwiZW5kVmVydGljZXNcIlxuICAgICAgXVxuICAgIH1cbiAgXSxcbiAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiOiBbXSxcbiAgXCJvcHRpb25zXCI6IHtcbiAgICBcInJlcGxpY2F0aW9uRmFjdG9yXCI6IFwic2F0ZWxsaXRlXCJcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAzNzlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUpqRy0tQVxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcImdyYXBoXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJzYXRlbGxpdGVHcmFwaFwiLCBcbiAgICBcIm51bWJlck9mU2hhcmRzXCIgOiAxLCBcbiAgICBcInJlcGxpY2F0aW9uRmFjdG9yXCIgOiBcInNhdGVsbGl0ZVwiLCBcbiAgICBcImlzU21hcnRcIiA6IGZhbHNlLCBcbiAgICBcImlzU2F0ZWxsaXRlXCIgOiB0cnVlLCBcbiAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJlZGdlc1wiLCBcbiAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgIFwic3RhcnRWZXJ0aWNlc1wiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcImVuZFZlcnRpY2VzXCIgXG4gICAgICAgIF0gXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgXCJpbml0aWFsXCIgOiBcInN0YXJ0VmVydGljZXNcIiwgXG4gICAgXCJpbml0aWFsQ2lkXCIgOiA3MDY5NiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhSmpHLS1BXCIsIFxuICAgIFwiX2lkXCIgOiBcIl9ncmFwaHMvc2F0ZWxsaXRlR3JhcGhcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNhdGVsbGl0ZUdyYXBoXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRlIGEgU2F0ZWxsaXRlR3JhcGguIEEgU2F0ZWxsaXRlR3JhcGggZG9lcyBub3QgdXNlXG5zaGFyZHMsIGJ1dCB1c2VzIFwic2F0ZWxsaXRlXCIgYXMgcmVwbGljYXRpb25GYWN0b3IuXG5NYWtlIHN1cmUgdG8ga2VlcCB0aGlzIGdyYXBoIHNtYWxsIGFzIGl0IGlzIGNsb25lZFxudG8gZXZlcnkgc2VydmVyLlxuQXZhaWxhYmxlIGluIHRoZSBFbnRlcnByaXNlIEVkaXRpb24gb25seS4iLCJuYW1lIjoiSHR0cEdoYXJpYWxDcmVhdGVTYXRlbGxpdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialCreateSmartWithSatellites_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIFNtYXJ0R3JhcGggd2l0aCBhIHNhdGVsbGl0ZSB2ZXJ0ZXggY29sbGVjdGlvbi4KICBJdCB1c2VzIHRoZSBjb2xsZWN0aW9uICJlbmRWZXJ0aWNlcyIgYXMgYSBzYXRlbGxpdGUgY29sbGVjdGlvbi4KICBUaGlzIGNvbGxlY3Rpb24gaXMgY2xvbmVkIHRvIGFsbCBzZXJ2ZXJzLCBhbGwgb3RoZXIgdmVydGV4CiAgY29sbGVjdGlvbnMgYXJlIHNwbGl0IGludG8gOSBzaGFyZHMKICBhbmQgYXJlIHNoYXJkZWQgYnkgdGhlICJyZWdpb24iIGF0dHJpYnV0ZS4KICBBdmFpbGFibGUgaW4gdGhlIEVudGVycHJpc2UgRWRpdGlvbiBvbmx5LgpuYW1lOiBIdHRwR2hhcmlhbENyZWF0ZVNtYXJ0V2l0aFNhdGVsbGl0ZXMKLS0tCnZhciBncmFwaCA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CiBpZiAoZ3JhcGguX2V4aXN0cygic21hcnRHcmFwaCIpKSB7CiAgICBncmFwaC5fZHJvcCgic21hcnRHcmFwaCIsIHRydWUpOwp9CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbCI7CmJvZHkgPSB7CiAgbmFtZTogInNtYXJ0R3JhcGgiLAogIGVkZ2VEZWZpbml0aW9uczogW3sKICAgIGNvbGxlY3Rpb246ICJlZGdlcyIsCiAgICBmcm9tOiBbICJzdGFydFZlcnRpY2VzIiBdLAogICAgdG86IFsgImVuZFZlcnRpY2VzIiBdCiAgfV0sCiAgb3JwaGFuQ29sbGVjdGlvbnM6IFsgIm9ycGhhblZlcnRpY2VzIiBdLAogIGlzU21hcnQ6IHRydWUsCiAgb3B0aW9uczogewogICAgcmVwbGljYXRpb25GYWN0b3I6IDIsCiAgICBudW1iZXJPZlNoYXJkczogOSwKICAgIHNtYXJ0R3JhcGhBdHRyaWJ1dGU6ICJyZWdpb24iLAogICAgc2F0ZWxsaXRlczogWyAiZW5kVmVydGljZXMiIF0KICB9Cn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpncmFwaC5fZHJvcCgic21hcnRHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJzbWFydEdyYXBoXCIsXG4gIFwiZWRnZURlZmluaXRpb25zXCI6IFtcbiAgICB7XG4gICAgICBcImNvbGxlY3Rpb25cIjogXCJlZGdlc1wiLFxuICAgICAgXCJmcm9tXCI6IFtcbiAgICAgICAgXCJzdGFydFZlcnRpY2VzXCJcbiAgICAgIF0sXG4gICAgICBcInRvXCI6IFtcbiAgICAgICAgXCJlbmRWZXJ0aWNlc1wiXG4gICAgICBdXG4gICAgfVxuICBdLFxuICBcIm9ycGhhbkNvbGxlY3Rpb25zXCI6IFtcbiAgICBcIm9ycGhhblZlcnRpY2VzXCJcbiAgXSxcbiAgXCJpc1NtYXJ0XCI6IHRydWUsXG4gIFwib3B0aW9uc1wiOiB7XG4gICAgXCJyZXBsaWNhdGlvbkZhY3RvclwiOiAyLFxuICAgIFwibnVtYmVyT2ZTaGFyZHNcIjogOSxcbiAgICBcInNtYXJ0R3JhcGhBdHRyaWJ1dGVcIjogXCJyZWdpb25cIixcbiAgICBcInNhdGVsbGl0ZXNcIjogW1xuICAgICAgXCJlbmRWZXJ0aWNlc1wiXG4gICAgXVxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ2NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IF9qdDNhSmhtLS1fXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwiZ3JhcGhcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcInNtYXJ0R3JhcGhcIiwgXG4gICAgXCJudW1iZXJPZlNoYXJkc1wiIDogOSwgXG4gICAgXCJyZXBsaWNhdGlvbkZhY3RvclwiIDogMiwgXG4gICAgXCJtaW5SZXBsaWNhdGlvbkZhY3RvclwiIDogMSwgXG4gICAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICAgIFwiaXNTbWFydFwiIDogdHJ1ZSwgXG4gICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgIFwiZWRnZURlZmluaXRpb25zXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImVkZ2VzXCIsIFxuICAgICAgICBcImZyb21cIiA6IFsgXG4gICAgICAgICAgXCJzdGFydFZlcnRpY2VzXCIgXG4gICAgICAgIF0sIFxuICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgIFwiZW5kVmVydGljZXNcIiBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIFwib3JwaGFuVmVydGljZXNcIiBcbiAgICBdLCBcbiAgICBcImluaXRpYWxcIiA6IFwic3RhcnRWZXJ0aWNlc1wiLCBcbiAgICBcImluaXRpYWxDaWRcIiA6IDcwNTk5LCBcbiAgICBcInNtYXJ0R3JhcGhBdHRyaWJ1dGVcIiA6IFwicmVnaW9uXCIsIFxuICAgIFwiaXNEaXNqb2ludFwiIDogZmFsc2UsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUpobS0tX1wiLCBcbiAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL3NtYXJ0R3JhcGhcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNtYXJ0R3JhcGhcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGUgYSBTbWFydEdyYXBoIHdpdGggYSBzYXRlbGxpdGUgdmVydGV4IGNvbGxlY3Rpb24uXG5JdCB1c2VzIHRoZSBjb2xsZWN0aW9uIFwiZW5kVmVydGljZXNcIiBhcyBhIHNhdGVsbGl0ZSBjb2xsZWN0aW9uLlxuVGhpcyBjb2xsZWN0aW9uIGlzIGNsb25lZCB0byBhbGwgc2VydmVycywgYWxsIG90aGVyIHZlcnRleFxuY29sbGVjdGlvbnMgYXJlIHNwbGl0IGludG8gOSBzaGFyZHNcbmFuZCBhcmUgc2hhcmRlZCBieSB0aGUgXCJyZWdpb25cIiBhdHRyaWJ1dGUuXG5BdmFpbGFibGUgaW4gdGhlIEVudGVycHJpc2UgRWRpdGlvbiBvbmx5LiIsIm5hbWUiOiJIdHRwR2hhcmlhbENyZWF0ZVNtYXJ0V2l0aFNhdGVsbGl0ZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialCreateSmart_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIFNtYXJ0R3JhcGguIFRoaXMgZ3JhcGggdXNlcyA5IHNoYXJkcyBhbmQKICBpcyBzaGFyZGVkIGJ5IHRoZSAicmVnaW9uIiBhdHRyaWJ1dGUuCiAgQXZhaWxhYmxlIGluIHRoZSBFbnRlcnByaXNlIEVkaXRpb24gb25seS4KbmFtZTogSHR0cEdoYXJpYWxDcmVhdGVTbWFydAotLS0KdmFyIGdyYXBoID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKaWYgKGdyYXBoLl9leGlzdHMoInNtYXJ0R3JhcGgiKSkgewogIGdyYXBoLl9kcm9wKCJzbWFydEdyYXBoIiwgdHJ1ZSk7Cn0KdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsIjsKYm9keSA9IHsKICBuYW1lOiAic21hcnRHcmFwaCIsCiAgZWRnZURlZmluaXRpb25zOiBbewogICAgY29sbGVjdGlvbjogImVkZ2VzIiwKICAgIGZyb206IFsgInN0YXJ0VmVydGljZXMiIF0sCiAgICB0bzogWyAiZW5kVmVydGljZXMiIF0KICB9XSwKICBvcnBoYW5Db2xsZWN0aW9uczogWyAib3JwaGFuVmVydGljZXMiIF0sCiAgaXNTbWFydDogdHJ1ZSwKICBvcHRpb25zOiB7CiAgICByZXBsaWNhdGlvbkZhY3RvcjogMiwKICAgIG51bWJlck9mU2hhcmRzOiA5LAogICAgc21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIKICB9Cn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpncmFwaC5fZHJvcCgic21hcnRHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJzbWFydEdyYXBoXCIsXG4gIFwiZWRnZURlZmluaXRpb25zXCI6IFtcbiAgICB7XG4gICAgICBcImNvbGxlY3Rpb25cIjogXCJlZGdlc1wiLFxuICAgICAgXCJmcm9tXCI6IFtcbiAgICAgICAgXCJzdGFydFZlcnRpY2VzXCJcbiAgICAgIF0sXG4gICAgICBcInRvXCI6IFtcbiAgICAgICAgXCJlbmRWZXJ0aWNlc1wiXG4gICAgICBdXG4gICAgfVxuICBdLFxuICBcIm9ycGhhbkNvbGxlY3Rpb25zXCI6IFtcbiAgICBcIm9ycGhhblZlcnRpY2VzXCJcbiAgXSxcbiAgXCJpc1NtYXJ0XCI6IHRydWUsXG4gIFwib3B0aW9uc1wiOiB7XG4gICAgXCJyZXBsaWNhdGlvbkZhY3RvclwiOiAyLFxuICAgIFwibnVtYmVyT2ZTaGFyZHNcIjogOSxcbiAgICBcInNtYXJ0R3JhcGhBdHRyaWJ1dGVcIjogXCJyZWdpb25cIlxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ2NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IF9qdDNhSmZLLS1fXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwiZ3JhcGhcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcInNtYXJ0R3JhcGhcIiwgXG4gICAgXCJudW1iZXJPZlNoYXJkc1wiIDogOSwgXG4gICAgXCJyZXBsaWNhdGlvbkZhY3RvclwiIDogMiwgXG4gICAgXCJtaW5SZXBsaWNhdGlvbkZhY3RvclwiIDogMSwgXG4gICAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICAgIFwiaXNTbWFydFwiIDogdHJ1ZSwgXG4gICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgIFwiZWRnZURlZmluaXRpb25zXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImVkZ2VzXCIsIFxuICAgICAgICBcImZyb21cIiA6IFsgXG4gICAgICAgICAgXCJzdGFydFZlcnRpY2VzXCIgXG4gICAgICAgIF0sIFxuICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgIFwiZW5kVmVydGljZXNcIiBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIFwib3JwaGFuVmVydGljZXNcIiBcbiAgICBdLCBcbiAgICBcImluaXRpYWxcIiA6IFwic3RhcnRWZXJ0aWNlc1wiLCBcbiAgICBcImluaXRpYWxDaWRcIiA6IDcwNDkxLCBcbiAgICBcInNtYXJ0R3JhcGhBdHRyaWJ1dGVcIiA6IFwicmVnaW9uXCIsIFxuICAgIFwiaXNEaXNqb2ludFwiIDogZmFsc2UsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUpmSy0tX1wiLCBcbiAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL3NtYXJ0R3JhcGhcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNtYXJ0R3JhcGhcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGUgYSBTbWFydEdyYXBoLiBUaGlzIGdyYXBoIHVzZXMgOSBzaGFyZHMgYW5kXG5pcyBzaGFyZGVkIGJ5IHRoZSBcInJlZ2lvblwiIGF0dHJpYnV0ZS5cbkF2YWlsYWJsZSBpbiB0aGUgRW50ZXJwcmlzZSBFZGl0aW9uIG9ubHkuIiwibmFtZSI6Ikh0dHBHaGFyaWFsQ3JlYXRlU21hcnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialCreate_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIEdlbmVyYWwgR3JhcGguIFRoaXMgZ3JhcGggdHlwZSBkb2VzIG5vdCBtYWtlIHVzZSBvZiBhbnkgc2hhcmRpbmcKICBzdHJhdGVneSBhbmQgaXMgdXNlZnVsIG9uIHRoZSBzaW5nbGUgc2VydmVyLgpuYW1lOiBIdHRwR2hhcmlhbENyZWF0ZQotLS0KdmFyIGdyYXBoID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKaWYgKGdyYXBoLl9leGlzdHMoIm15R3JhcGgiKSkgewogIGdyYXBoLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7Cn0KdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsIjsKYm9keSA9IHsKICBuYW1lOiAibXlHcmFwaCIsCiAgZWRnZURlZmluaXRpb25zOiBbewogICAgY29sbGVjdGlvbjogImVkZ2VzIiwKICAgIGZyb206IFsgInN0YXJ0VmVydGljZXMiIF0sCiAgICB0bzogWyAiZW5kVmVydGljZXMiIF0KICB9XQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZ3JhcGguX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJteUdyYXBoXCIsXG4gIFwiZWRnZURlZmluaXRpb25zXCI6IFtcbiAgICB7XG4gICAgICBcImNvbGxlY3Rpb25cIjogXCJlZGdlc1wiLFxuICAgICAgXCJmcm9tXCI6IFtcbiAgICAgICAgXCJzdGFydFZlcnRpY2VzXCJcbiAgICAgIF0sXG4gICAgICBcInRvXCI6IFtcbiAgICAgICAgXCJlbmRWZXJ0aWNlc1wiXG4gICAgICBdXG4gICAgfVxuICBdXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIyN1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IF9qdDNhSmVhLS1BXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwiZ3JhcGhcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcIm15R3JhcGhcIiwgXG4gICAgXCJlZGdlRGVmaW5pdGlvbnNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwiZWRnZXNcIiwgXG4gICAgICAgIFwiZnJvbVwiIDogWyBcbiAgICAgICAgICBcInN0YXJ0VmVydGljZXNcIiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwidG9cIiA6IFsgXG4gICAgICAgICAgXCJlbmRWZXJ0aWNlc1wiIFxuICAgICAgICBdIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcIm9ycGhhbkNvbGxlY3Rpb25zXCIgOiBbIF0sIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUplYS0tQVwiLCBcbiAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL215R3JhcGhcIiwgXG4gICAgXCJuYW1lXCIgOiBcIm15R3JhcGhcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGUgYSBHZW5lcmFsIEdyYXBoLiBUaGlzIGdyYXBoIHR5cGUgZG9lcyBub3QgbWFrZSB1c2Ugb2YgYW55IHNoYXJkaW5nXG5zdHJhdGVneSBhbmQgaXMgdXNlZnVsIG9uIHRoZSBzaW5nbGUgc2VydmVyLiIsIm5hbWUiOiJIdHRwR2hhcmlhbENyZWF0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "HttpGharialDeleteEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbERlbGV0ZUVkZ2UKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciBhbnkgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYi5yZWxhdGlvbi5hbnkoKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlL3JlbGF0aW9uLyIgKyBhbnkuX2tleTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlL3JlbGF0aW9uLzcxOTYxJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDFcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwicmVtb3ZlZFwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSHR0cEdoYXJpYWxEZWxldGVFZGdlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGharialDeleteVertex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbERlbGV0ZVZlcnRleAotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvZmVtYWxlL2FsaWNlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvZmVtYWxlL2FsaWNlJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDFcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwicmVtb3ZlZFwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSHR0cEdoYXJpYWxEZWxldGVWZXJ0ZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialDrop_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbERyb3AKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbC9zb2NpYWw/ZHJvcENvbGxlY3Rpb25zPXRydWUiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbD9kcm9wQ29sbGVjdGlvbnM9dHJ1ZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQxXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcInJlbW92ZWRcIiA6IHRydWUgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Ikh0dHBHaGFyaWFsRHJvcCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "HttpGharialEdgeDefinitionRemove_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEVkZ2VEZWZpbml0aW9uUmVtb3ZlCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaC5qcyIpOwpleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UvcmVsYXRpb24iOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoInJlbGF0aW9uIik7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlL3JlbGF0aW9uJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTcxXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogX2p0M2FKdm0tLUFcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAyLCBcbiAgXCJncmFwaFwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwic29jaWFsXCIsIFxuICAgIFwiZWRnZURlZmluaXRpb25zXCIgOiBbIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXG4gICAgICBcImZlbWFsZVwiLCBcbiAgICAgIFwibWFsZVwiIFxuICAgIF0sIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUp2bS0tQVwiLCBcbiAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL3NvY2lhbFwiLCBcbiAgICBcIm5hbWVcIiA6IFwic29jaWFsXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Ikh0dHBHaGFyaWFsRWRnZURlZmluaXRpb25SZW1vdmUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialGetEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEdldEVkZ2UKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciBhbnkgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYi5yZWxhdGlvbi5hbnkoKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlL3JlbGF0aW9uLyIgKyBhbnkuX2tleTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UvcmVsYXRpb24vNzE3NzgnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNzBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUozbS0tX1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImVkZ2VcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcIjcxNzc4XCIsIFxuICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzcxNzc4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgIFwiX3RvXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUozbS0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwiZnJpZW5kXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImFsaWNlXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Ikh0dHBHaGFyaWFsR2V0RWRnZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "HttpGharialGetGraph_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEdldEdyYXBoCi0tLQp2YXIgZ3JhcGggPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwppZiAoZ3JhcGguX2V4aXN0cygibXlHcmFwaCIpKSB7CiAgZ3JhcGguX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTsKfQpncmFwaC5fY3JlYXRlKCJteUdyYXBoIiwgW3sKICBjb2xsZWN0aW9uOiAiZWRnZXMiLAogIGZyb206IFsgInN0YXJ0VmVydGljZXMiIF0sCiAgdG86IFsgImVuZFZlcnRpY2VzIiBdCn1dKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL215R3JhcGgiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpncmFwaC5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvbXlHcmFwaCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIyN1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJncmFwaFwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwibXlHcmFwaFwiLCBcbiAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJlZGdlc1wiLCBcbiAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgIFwic3RhcnRWZXJ0aWNlc1wiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcImVuZFZlcnRpY2VzXCIgXG4gICAgICAgIF0gXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhSmtTLS0tXCIsIFxuICAgIFwiX2lkXCIgOiBcIl9ncmFwaHMvbXlHcmFwaFwiLCBcbiAgICBcIm5hbWVcIiA6IFwibXlHcmFwaFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbEdldEdyYXBoIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGharialGetVertex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbEdldFZlcnRleAotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvZmVtYWxlL2FsaWNlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL3ZlcnRleC9mZW1hbGUvYWxpY2UnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMDlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUp4ZS0tLVxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInZlcnRleFwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUp4ZS0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSHR0cEdoYXJpYWxHZXRWZXJ0ZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialListEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbExpc3RFZGdlCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaC5qcyIpOwpleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1M1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICBcInJlbGF0aW9uXCIgXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Ikh0dHBHaGFyaWFsTGlzdEVkZ2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialListVertex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbExpc3RWZXJ0ZXgKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbC9zb2NpYWwvdmVydGV4IjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL3ZlcnRleCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImNvbGxlY3Rpb25zXCIgOiBbIFxuICAgIFwiZmVtYWxlXCIsIFxuICAgIFwibWFsZVwiIFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbExpc3RWZXJ0ZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialList_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbExpc3QKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbCI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpleGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOwpleGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2MjNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiZ3JhcGhzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL3NvY2lhbFwiLCBcbiAgICAgIFwiX2tleVwiIDogXCJzb2NpYWxcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKY2UtLUFcIiwgXG4gICAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgICAgeyBcbiAgICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwicmVsYXRpb25cIiwgXG4gICAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgICAgXCJmZW1hbGVcIiwgXG4gICAgICAgICAgICBcIm1hbGVcIiBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgICAgXCJmZW1hbGVcIiwgXG4gICAgICAgICAgICBcIm1hbGVcIiBcbiAgICAgICAgICBdIFxuICAgICAgICB9IFxuICAgICAgXSwgXG4gICAgICBcIm9ycGhhbkNvbGxlY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgXCJuYW1lXCIgOiBcInNvY2lhbFwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL3JvdXRlcGxhbm5lclwiLCBcbiAgICAgIFwiX2tleVwiIDogXCJyb3V0ZXBsYW5uZXJcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKY3UtLV9cIiwgXG4gICAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgICAgeyBcbiAgICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwiZnJlbmNoSGlnaHdheVwiLCBcbiAgICAgICAgICBcImZyb21cIiA6IFsgXG4gICAgICAgICAgICBcImZyZW5jaENpdHlcIiBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgICAgXCJmcmVuY2hDaXR5XCIgXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImdlcm1hbkhpZ2h3YXlcIiwgXG4gICAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgICAgXCJnZXJtYW5DaXR5XCIgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICAgIFwiZ2VybWFuQ2l0eVwiIFxuICAgICAgICAgIF0gXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJpbnRlcm5hdGlvbmFsSGlnaHdheVwiLCBcbiAgICAgICAgICBcImZyb21cIiA6IFsgXG4gICAgICAgICAgICBcImZyZW5jaENpdHlcIiwgXG4gICAgICAgICAgICBcImdlcm1hbkNpdHlcIiBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgICAgXCJmcmVuY2hDaXR5XCIsIFxuICAgICAgICAgICAgXCJnZXJtYW5DaXR5XCIgXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIF0sIFxuICAgICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgIFwibmFtZVwiIDogXCJyb3V0ZXBsYW5uZXJcIiBcbiAgICB9IFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbExpc3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialModifyVertex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbE1vZGlmeVZlcnRleAotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKYm9keSA9IHsKICBhZ2U6IDI2Cn0KdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvZmVtYWxlL2FsaWNlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BBVENIJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZ2hhcmlhbC9zb2NpYWwvdmVydGV4L2ZlbWFsZS9hbGljZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJhZ2VcIjogMjZcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTE4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogX2p0M2FKei0tLUFcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAyLCBcbiAgXCJ2ZXJ0ZXhcIiA6IHsgXG4gICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FKeTYtLS1cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhSnotLS1BXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Ikh0dHBHaGFyaWFsTW9kaWZ5VmVydGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGharialPatchEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbFBhdGNoRWRnZQotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGFueSA9IHJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiLnJlbGF0aW9uLmFueSgpOwp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UvcmVsYXRpb24vIiArIGFueS5fa2V5Owpib2R5ID0gewogIHNpbmNlOiAiMDEuMDEuMjAwMSIKfQp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZ2hhcmlhbC9zb2NpYWwvZWRnZS9yZWxhdGlvbi83MTgzNycgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJzaW5jZVwiOiBcIjAxLjAxLjIwMDFcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMThcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUo1Ty0tLVxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcImVkZ2VcIiA6IHsgXG4gICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzE4MzdcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjcxODM3XCIsIFxuICAgIFwiX29sZFJldlwiIDogXCJfanQzYUo1Ry0tQlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKNU8tLS1cIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSHR0cEdoYXJpYWxQYXRjaEVkZ2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialPutEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbFB1dEVkZ2UKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciBhbnkgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYi5yZWxhdGlvbi5hbnkoKTsKdmFyIHVybCA9ICIvX2FwaS9naGFyaWFsL3NvY2lhbC9lZGdlL3JlbGF0aW9uLyIgKyBhbnkuX2tleTsKYm9keSA9IHsKICB0eXBlOiAiZGl2b3JjZWQiLAogIF9mcm9tOiAiZmVtYWxlL2FsaWNlIiwKICBfdG86ICJtYWxlL2JvYiIKfQp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UvcmVsYXRpb24vNzE5MDAnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwidHlwZVwiOiBcImRpdm9yY2VkXCIsXG4gIFwiX2Zyb21cIjogXCJmZW1hbGUvYWxpY2VcIixcbiAgXCJfdG9cIjogXCJtYWxlL2JvYlwiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDExOFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IF9qdDNhSjZhLS0tXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwiZWRnZVwiIDogeyBcbiAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83MTkwMFwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNzE5MDBcIiwgXG4gICAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhSjZXLS1BXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYUo2YS0tLVwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbFB1dEVkZ2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialRemoveVertexCollectionFailed_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFlvdSBjYW5ub3QgcmVtb3ZlIHZlcnRleCBjb2xsZWN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIGVkZ2UgZGVmaW5pdGlvbnM6Cm5hbWU6IEh0dHBHaGFyaWFsUmVtb3ZlVmVydGV4Q29sbGVjdGlvbkZhaWxlZAotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwvc29jaWFsL3ZlcnRleC9tYWxlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvbWFsZSciLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDAgQmFkIFJlcXVlc3RcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEwNlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJjb2xsZWN0aW9uIGlzIG5vdCBpbiBsaXN0IG9mIG9ycGhhbiBjb2xsZWN0aW9uc1wiLCBcbiAgXCJlcnJvck51bVwiIDogMTkyOCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJZb3UgY2Fubm90IHJlbW92ZSB2ZXJ0ZXggY29sbGVjdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBlZGdlIGRlZmluaXRpb25zOiIsIm5hbWUiOiJIdHRwR2hhcmlhbFJlbW92ZVZlcnRleENvbGxlY3Rpb25GYWlsZWQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialRemoveVertexCollection_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFlvdSBjYW4gcmVtb3ZlIHZlcnRleCBjb2xsZWN0aW9ucyB0aGF0IGFyZSBub3QgdXNlZCBpbiBhbnkgZWRnZSBkZWZpbml0aW9uOgpuYW1lOiBIdHRwR2hhcmlhbFJlbW92ZVZlcnRleENvbGxlY3Rpb24KLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKZy5fYWRkVmVydGV4Q29sbGVjdGlvbigib3RoZXJWZXJ0aWNlcyIpOwp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwvc29jaWFsL3ZlcnRleC9vdGhlclZlcnRpY2VzIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7CmRiLl9kcm9wKCJvdGhlclZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9naGFyaWFsL3NvY2lhbC92ZXJ0ZXgvb3RoZXJWZXJ0aWNlcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIyOVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IF9qdDNhSnBHLS0tXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwiZ3JhcGhcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcInNvY2lhbFwiLCBcbiAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJyZWxhdGlvblwiLCBcbiAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgIFwiZmVtYWxlXCIsIFxuICAgICAgICAgIFwibWFsZVwiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcImZlbWFsZVwiLCBcbiAgICAgICAgICBcIm1hbGVcIiBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBdLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKcEctLS1cIiwgXG4gICAgXCJfaWRcIiA6IFwiX2dyYXBocy9zb2NpYWxcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNvY2lhbFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IllvdSBjYW4gcmVtb3ZlIHZlcnRleCBjb2xsZWN0aW9ucyB0aGF0IGFyZSBub3QgdXNlZCBpbiBhbnkgZWRnZSBkZWZpbml0aW9uOiIsIm5hbWUiOiJIdHRwR2hhcmlhbFJlbW92ZVZlcnRleENvbGxlY3Rpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpGharialReplaceEdgeCol_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbFJlcGxhY2VFZGdlQ29sCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaC5qcyIpOwpleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgdXJsID0gIi9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UvcmVsYXRpb24iOwpib2R5ID0gewogIGNvbGxlY3Rpb246ICJyZWxhdGlvbiIsCiAgZnJvbTogWyJmZW1hbGUiLCAibWFsZSIsICJhbmltYWwiXSwKICB0bzogWyJmZW1hbGUiLCAibWFsZSIsICJhbmltYWwiXQp9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL2VkZ2UvcmVsYXRpb24nIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiY29sbGVjdGlvblwiOiBcInJlbGF0aW9uXCIsXG4gIFwiZnJvbVwiOiBbXG4gICAgXCJmZW1hbGVcIixcbiAgICBcIm1hbGVcIixcbiAgICBcImFuaW1hbFwiXG4gIF0sXG4gIFwidG9cIjogW1xuICAgIFwiZmVtYWxlXCIsXG4gICAgXCJtYWxlXCIsXG4gICAgXCJhbmltYWxcIlxuICBdXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI0N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IF9qdDNhSnR5LS1CXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwiZ3JhcGhcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcInNvY2lhbFwiLCBcbiAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJyZWxhdGlvblwiLCBcbiAgICAgICAgXCJmcm9tXCIgOiBbIFxuICAgICAgICAgIFwiYW5pbWFsXCIsIFxuICAgICAgICAgIFwiZmVtYWxlXCIsIFxuICAgICAgICAgIFwibWFsZVwiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcImFuaW1hbFwiLCBcbiAgICAgICAgICBcImZlbWFsZVwiLCBcbiAgICAgICAgICBcIm1hbGVcIiBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJvcnBoYW5Db2xsZWN0aW9uc1wiIDogWyBdLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKdHktLUJcIiwgXG4gICAgXCJfaWRcIiA6IFwiX2dyYXBocy9zb2NpYWxcIiwgXG4gICAgXCJuYW1lXCIgOiBcInNvY2lhbFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJIdHRwR2hhcmlhbFJlcGxhY2VFZGdlQ29sIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpGharialReplaceVertex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBIdHRwR2hhcmlhbFJlcGxhY2VWZXJ0ZXgKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CmV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CmJvZHkgPSB7CiAgbmFtZTogIkFsaWNlIENvb3BlciIsCiAgYWdlOiAyNgp9CnZhciB1cmwgPSAiL19hcGkvZ2hhcmlhbC9zb2NpYWwvdmVydGV4L2ZlbWFsZS9hbGljZSI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpleGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2doYXJpYWwvc29jaWFsL3ZlcnRleC9mZW1hbGUvYWxpY2UnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibmFtZVwiOiBcIkFsaWNlIENvb3BlclwiLFxuICBcImFnZVwiOiAyNlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMThcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBfanQzYUowRy0tLVxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcInZlcnRleFwiIDogeyBcbiAgICBcIl9pZFwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgIFwiX29sZFJldlwiIDogXCJfanQzYUowLS0tLVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FKMEctLS1cIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSHR0cEdoYXJpYWxSZXBsYWNlVmVydGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "HttpListQueryResultsCache_single": { + "request": "LS0tCm5hbWU6IEh0dHBMaXN0UXVlcnlSZXN1bHRzQ2FjaGUKZGVzY3JpcHRpb246IHwKICBSZXRyaWV2ZSB0aGUgZW50cmllcyBzdG9yZWQgaW4gdGhlIEFRTCBxdWVyeSByZXN1bHRzIGNhY2hlIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlOgotLS0KdmFyIHJlc3VsdHNDYWNoZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvY2FjaGUiKTsKcmVzdWx0c0NhY2hlLnByb3BlcnRpZXMoeyBtb2RlOiAiZGVtYW5kIiB9KTsgCgpkYi5fY3JlYXRlKCJjb2xsIik7CmZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgZGIuX3F1ZXJ5KCJGT1IgZG9jIElOIEBAY29sbCBGSUxURVIgZG9jLmF0dHIgPT0gQHZhbCBSRVRVUk4gZG9jIiwgewogICAgIkBjb2xsIjogImNvbGwiLCB2YWw6ICJmb28iCiAgfSwgeyBjYWNoZTogdHJ1ZSB9KTsKfQpkYi5fcXVlcnkoIlJFVFVSTiA0MiIsIHt9LCB7IGNhY2hlOiB0cnVlIH0pOwoKdmFyIHVybCA9ICIvX2FwaS9xdWVyeS1jYWNoZS9lbnRyaWVzIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5sZW5ndGggPj0gMik7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZHJvcCgiY29sbCIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3F1ZXJ5LWNhY2hlL2VudHJpZXMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0MzJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcImhhc2hcIiA6IFwiMTczNDEzMTg4NjQxMDgwNDYzNzBcIiwgXG4gICAgXCJxdWVyeVwiIDogXCJSRVRVUk4gNDJcIiwgXG4gICAgXCJiaW5kVmFyc1wiIDogeyBcbiAgICB9LCBcbiAgICBcInNpemVcIiA6IDE1LCBcbiAgICBcInJlc3VsdHNcIiA6IDEsIFxuICAgIFwiaGl0c1wiIDogMCwgXG4gICAgXCJydW5UaW1lXCIgOiAwLjAwMDA1MDQ5MjAwMDAxMzk0NjM4LCBcbiAgICBcInN0YXJ0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxOFpcIiwgXG4gICAgXCJkYXRhU291cmNlc1wiIDogWyBdIFxuICB9LCBcbiAgeyBcbiAgICBcImhhc2hcIiA6IFwiMTAyODcwMjI2MzcwNzA4MTkxMVwiLCBcbiAgICBcInF1ZXJ5XCIgOiBcIkZPUiBkb2MgSU4gQEBjb2xsIEZJTFRFUiBkb2MuYXR0ciA9PSBAdmFsIFJFVFVSTiBkb2NcIiwgXG4gICAgXCJiaW5kVmFyc1wiIDogeyBcbiAgICAgIFwiQGNvbGxcIiA6IFwiY29sbFwiLCBcbiAgICAgIFwidmFsXCIgOiBcImZvb1wiIFxuICAgIH0sIFxuICAgIFwic2l6ZVwiIDogNzUsIFxuICAgIFwicmVzdWx0c1wiIDogMCwgXG4gICAgXCJoaXRzXCIgOiAyLCBcbiAgICBcInJ1blRpbWVcIiA6IDAuMDAwMTkzNzk0OTk5OTcyODUxNjYsIFxuICAgIFwic3RhcnRlZFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE4WlwiLCBcbiAgICBcImRhdGFTb3VyY2VzXCIgOiBbIFxuICAgICAgXCJjb2xsXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXRyaWV2ZSB0aGUgZW50cmllcyBzdG9yZWQgaW4gdGhlIEFRTCBxdWVyeSByZXN1bHRzIGNhY2hlIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlOlxuIiwibmFtZSI6Ikh0dHBMaXN0UXVlcnlSZXN1bHRzQ2FjaGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "HttpSetQueryResultsCacheProperties_single": { + "request": "LS0tCm5hbWU6IEh0dHBTZXRRdWVyeVJlc3VsdHNDYWNoZVByb3BlcnRpZXMKZGVzY3JpcHRpb246IHwKICBDaGFuZ2Ugc29tZSBwcm9wZXJ0aWVzIG9mIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgQVFMIHF1ZXJ5IHJlc3VsdHMgY2FjaGU6Ci0tLQp2YXIgdXJsID0gIi9fYXBpL3F1ZXJ5LWNhY2hlL3Byb3BlcnRpZXMiOwp2YXIgYm9keSA9IHsgbW9kZTogImRlbWFuZCIsIG1heFJlc3VsdHM6IDMyIH07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkubW9kZSA9PSAiZGVtYW5kIik7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5Lm1heFJlc3VsdHMgPT0gMzIpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3F1ZXJ5LWNhY2hlL3Byb3BlcnRpZXMnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibW9kZVwiOiBcImRlbWFuZFwiLFxuICBcIm1heFJlc3VsdHNcIjogMzJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTA2XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwibW9kZVwiIDogXCJkZW1hbmRcIiwgXG4gIFwibWF4UmVzdWx0c1wiIDogMzIsIFxuICBcIm1heFJlc3VsdHNTaXplXCIgOiAyNjg0MzU0NTYsIFxuICBcIm1heEVudHJ5U2l6ZVwiIDogMTY3NzcyMTYsIFxuICBcImluY2x1ZGVTeXN0ZW1cIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNoYW5nZSBzb21lIHByb3BlcnRpZXMgb2YgdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uIG9mIHRoZSBBUUwgcXVlcnkgcmVzdWx0cyBjYWNoZTpcbiIsIm5hbWUiOiJIdHRwU2V0UXVlcnlSZXN1bHRzQ2FjaGVQcm9wZXJ0aWVzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "IndexIdentifier_single": { + "request": "LS0tCm5hbWU6IEluZGV4SWRlbnRpZmllcgpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmRiLmV4YW1wbGUuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyAiYSIsICJiIiBdIH0pOwp2YXIgaW5kZXhJbmZvID0gZGIuZXhhbXBsZS5pbmRleGVzKCkubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHguaWQ7IH0pOwppbmRleEluZm87CmRiLl9pbmRleChpbmRleEluZm9bMF0pCmRiLl9pbmRleChpbmRleEluZm9bMV0pCn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInBlcnNpc3RlbnRcIiwgZmllbGRzOiBbIFwiYVwiLCBcImJcIiBdIH0pO1xudmFyIGluZGV4SW5mbyA9IGRiLmV4YW1wbGUuaW5kZXhlcygpLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiB4LmlkOyB9KTtcbmluZGV4SW5mbztcbmRiLl9pbmRleChpbmRleEluZm9bMF0pXG5kYi5faW5kZXgoaW5kZXhJbmZvWzFdKSIsIm91dHB1dCI6InsgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwiYVwiLCBcbiAgICBcImJcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwiZXhhbXBsZS84NDE5MFwiLCBcbiAgXCJpc05ld2x5Q3JlYXRlZFwiIDogdHJ1ZSwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjI0MTY3ODUxNjIyNVwiLCBcbiAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufVxuWyBcbiAgXCJleGFtcGxlLzBcIiwgXG4gIFwiZXhhbXBsZS84NDE5MFwiIFxuXVxuXG57IFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcIl9rZXlcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwiZXhhbXBsZS8wXCIsIFxuICBcIm5hbWVcIiA6IFwicHJpbWFyeVwiLCBcbiAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgXCJ0eXBlXCIgOiBcInByaW1hcnlcIiwgXG4gIFwidW5pcXVlXCIgOiB0cnVlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59XG5cbnsgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwiYVwiLCBcbiAgICBcImJcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwiZXhhbXBsZS84NDE5MFwiLCBcbiAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MjQxNjc4NTE2MjI1XCIsIFxuICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IkluZGV4SWRlbnRpZmllciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "IndexVerify_single": { + "request": "LS0tCm5hbWU6IEluZGV4VmVyaWZ5CmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKdmFyIGV4cGxhaW4gPSByZXF1aXJlKCJAYXJhbmdvZGIvYXFsL2V4cGxhaW5lciIpLmV4cGxhaW47CnZhciBpZHggPSBkYi5leGFtcGxlLmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsgImEiLCAiYiIgXSB9KTsKZXhwbGFpbigiRk9SIGRvYyBJTiBleGFtcGxlIEZJTFRFUiBkb2MuYSA8IDIzIFJFVFVSTiBkb2MiLCB7Y29sb3JzOiBmYWxzZX0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6InZhciBleHBsYWluID0gcmVxdWlyZShcIkBhcmFuZ29kYi9hcWwvZXhwbGFpbmVyXCIpLmV4cGxhaW47XG52YXIgaWR4ID0gZGIuZXhhbXBsZS5lbnN1cmVJbmRleCh7IHR5cGU6IFwicGVyc2lzdGVudFwiLCBmaWVsZHM6IFsgXCJhXCIsIFwiYlwiIF0gfSk7XG5leHBsYWluKFwiRk9SIGRvYyBJTiBleGFtcGxlIEZJTFRFUiBkb2MuYSBcdTAwM2MgMjMgUkVUVVJOIGRvY1wiLCB7Y29sb3JzOiBmYWxzZX0pOyIsIm91dHB1dCI6IlF1ZXJ5IFN0cmluZyAoNDcgY2hhcnMsIGNhY2hlYWJsZTogdHJ1ZSk6XG4gRk9SIGRvYyBJTiBleGFtcGxlIEZJTFRFUiBkb2MuYSBcdTAwM2MgMjMgUkVUVVJOIGRvY1xuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICBFc3QuICAgQ29tbWVudFxuICAxICAgU2luZ2xldG9uTm9kZSAgICAgIDEgICAqIFJPT1RcbiAgNiAgIEluZGV4Tm9kZSAgICAgICAgICAwICAgICAtIEZPUiBkb2MgSU4gZXhhbXBsZSAgIC8qIHBlcnNpc3RlbnQgaW5kZXggc2NhbiwgaW5kZXggc2NhbiArIGRvY3VtZW50IGxvb2t1cCAqLyAgICBcbiAgNSAgIFJldHVybk5vZGUgICAgICAgICAwICAgICAgIC0gUkVUVVJOIGRvY1xuXG5JbmRleGVzIHVzZWQ6XG4gQnkgICBOYW1lICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBDb2xsZWN0aW9uICAgVW5pcXVlICAgU3BhcnNlICAgQ2FjaGUgICBTZWxlY3Rpdml0eSAgIEZpZWxkcyAgICAgICAgIFN0b3JlZCB2YWx1ZXMgICBSYW5nZXNcbiAgNiAgIGlkeF8xODMyOTM2MjQxNzQ1NjI1MDg4ICAgcGVyc2lzdGVudCAgIGV4YW1wbGUgICAgICBmYWxzZSAgICBmYWxzZSAgICBmYWxzZSAgICAgIDEwMC4wMCAlICAgWyBgYWAsIGBiYCBdICAgWyAgXSAgICAgICAgICAgIChkb2MuYGFgIFx1MDAzYyAyMylcblxuT3B0aW1pemF0aW9uIHJ1bGVzIGFwcGxpZWQ6XG4gSWQgICBSdWxlTmFtZVxuICAxICAgdXNlLWluZGV4ZXNcbiAgMiAgIHJlbW92ZS1maWx0ZXItY292ZXJlZC1ieS1pbmRleFxuICAzICAgcmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9ucy0yXG5cbjQ0IHJ1bGUocykgZXhlY3V0ZWQsIDEgcGxhbihzKSBjcmVhdGVkLCBwZWFrIG1lbSBbYl06IDAsIGV4ZWMgdGltZSBbc106IDAuMDAwMjAiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiSW5kZXhWZXJpZnkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "QUERY_01_propertyOfQueries_single": { + "request": "LS0tCm5hbWU6IFFVRVJZXzAxX3Byb3BlcnR5T2ZRdWVyaWVzCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHF1ZXJpZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYXFsL3F1ZXJpZXMiKTsKcXVlcmllcy5wcm9wZXJ0aWVzKCk7CnF1ZXJpZXMucHJvcGVydGllcyh7c2xvd1F1ZXJ5VGhyZXNob2xkOiAxfSk7CnF1ZXJpZXMucHJvcGVydGllcyh7c2xvd1N0cmVhbWluZ1F1ZXJ5VGhyZXNob2xkOiAxfSk7", + "response": "eyJpbnB1dCI6InZhciBxdWVyaWVzID0gcmVxdWlyZShcIkBhcmFuZ29kYi9hcWwvcXVlcmllc1wiKTtcbnF1ZXJpZXMucHJvcGVydGllcygpO1xucXVlcmllcy5wcm9wZXJ0aWVzKHtzbG93UXVlcnlUaHJlc2hvbGQ6IDF9KTtcbnF1ZXJpZXMucHJvcGVydGllcyh7c2xvd1N0cmVhbWluZ1F1ZXJ5VGhyZXNob2xkOiAxfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImVuYWJsZWRcIiA6IHRydWUsIFxuICBcInRyYWNrU2xvd1F1ZXJpZXNcIiA6IHRydWUsIFxuICBcInRyYWNrQmluZFZhcnNcIiA6IHRydWUsIFxuICBcIm1heFNsb3dRdWVyaWVzXCIgOiA2NCwgXG4gIFwic2xvd1F1ZXJ5VGhyZXNob2xkXCIgOiAxMCwgXG4gIFwic2xvd1N0cmVhbWluZ1F1ZXJ5VGhyZXNob2xkXCIgOiAxMCwgXG4gIFwibWF4UXVlcnlTdHJpbmdMZW5ndGhcIiA6IDQwOTYgXG59XG5cbnsgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJlbmFibGVkXCIgOiB0cnVlLCBcbiAgXCJ0cmFja1Nsb3dRdWVyaWVzXCIgOiB0cnVlLCBcbiAgXCJ0cmFja0JpbmRWYXJzXCIgOiB0cnVlLCBcbiAgXCJtYXhTbG93UXVlcmllc1wiIDogNjQsIFxuICBcInNsb3dRdWVyeVRocmVzaG9sZFwiIDogMSwgXG4gIFwic2xvd1N0cmVhbWluZ1F1ZXJ5VGhyZXNob2xkXCIgOiAxMCwgXG4gIFwibWF4UXVlcnlTdHJpbmdMZW5ndGhcIiA6IDQwOTYgXG59XG5cbnsgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJlbmFibGVkXCIgOiB0cnVlLCBcbiAgXCJ0cmFja1Nsb3dRdWVyaWVzXCIgOiB0cnVlLCBcbiAgXCJ0cmFja0JpbmRWYXJzXCIgOiB0cnVlLCBcbiAgXCJtYXhTbG93UXVlcmllc1wiIDogNjQsIFxuICBcInNsb3dRdWVyeVRocmVzaG9sZFwiIDogMSwgXG4gIFwic2xvd1N0cmVhbWluZ1F1ZXJ5VGhyZXNob2xkXCIgOiAxLCBcbiAgXCJtYXhRdWVyeVN0cmluZ0xlbmd0aFwiIDogNDA5NiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUVVFUllfMDFfcHJvcGVydHlPZlF1ZXJpZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "QUERY_02_listQueries_single": { + "request": "LS0tCm5hbWU6IFFVRVJZXzAyX2xpc3RRdWVyaWVzCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBxdWVyaWVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FxbC9xdWVyaWVzIik7CnZhciB0aGVRdWVyeSA9ICdGT1Igc2xlZXBMb29vb25nIElOIDEuLjUgTEVUIHNsZWVwTG9vb29uZ2VyID0gU0xFRVAoMTAwMCkgUkVUVVJOIHNsZWVwTG9vb29uZyc7CnZhciB0YXNrcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi90YXNrcyIpOwp0YXNrcy5yZWdpc3Rlcih7CiAgaWQ6ICJteXRhc2stMSIsCiAgbmFtZTogInRoaXMgaXMgYSBzYW1wbGUgdGFzayB0byBzcGF3biBhIHNsb3cgYXFsIHF1ZXJ5IiwKICBjb21tYW5kOiAicmVxdWlyZSgnQGFyYW5nb2RiJykuZGIuX3F1ZXJ5KCciICsgdGhlUXVlcnkgKyAiJyk7Igp9KTsKfndoaWxlICh0cnVlKSB7Cn4gIHJlcXVpcmUoImludGVybmFsIikud2FpdCgxKTsKfiAgaWYgKHF1ZXJpZXMuY3VycmVudCgpLmZpbHRlcihmdW5jdGlvbihxdWVyeSkgewp+ICAgIHJldHVybiBxdWVyeS5xdWVyeSA9PT0gdGhlUXVlcnk7Cn4gIH0pLmxlbmd0aCA+IDApIHsKfiAgICBicmVhazsKfiAgfQp+fQpxdWVyaWVzLmN1cnJlbnQoKTs=", + "response": "eyJpbnB1dCI6InZhciB0aGVRdWVyeSA9ICdGT1Igc2xlZXBMb29vb25nIElOIDEuLjUgTEVUIHNsZWVwTG9vb29uZ2VyID0gU0xFRVAoMTAwMCkgUkVUVVJOIHNsZWVwTG9vb29uZyc7XG52YXIgdGFza3MgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3Rhc2tzXCIpO1xudGFza3MucmVnaXN0ZXIoe1xuICBpZDogXCJteXRhc2stMVwiLFxuICBuYW1lOiBcInRoaXMgaXMgYSBzYW1wbGUgdGFzayB0byBzcGF3biBhIHNsb3cgYXFsIHF1ZXJ5XCIsXG4gIGNvbW1hbmQ6IFwicmVxdWlyZSgnQGFyYW5nb2RiJykuZGIuX3F1ZXJ5KCdcIiArIHRoZVF1ZXJ5ICsgXCInKTtcIlxufSk7XG5xdWVyaWVzLmN1cnJlbnQoKTsiLCJvdXRwdXQiOiJ7IFxuICBcImlkXCIgOiBcIm15dGFzay0xXCIsIFxuICBcIm5hbWVcIiA6IFwidGhpcyBpcyBhIHNhbXBsZSB0YXNrIHRvIHNwYXduIGEgc2xvdyBhcWwgcXVlcnlcIiwgXG4gIFwiY3JlYXRlZFwiIDogMTc0ODAyNDE4Ni4xNTI4NjY0LCBcbiAgXCJ0eXBlXCIgOiBcInRpbWVkXCIsIFxuICBcIm9mZnNldFwiIDogMCwgXG4gIFwiY29tbWFuZFwiIDogXCIoZnVuY3Rpb24gKHBhcmFtcykgeyByZXF1aXJlKCdAYXJhbmdvZGInKS5kYi5fcXVlcnkoJ0ZPUiBzbGVlcExvb29vbmcgSU4gMS4uNSBMRVQgc2xlZXBMb29vb25nZXIgPSBTTEVFUCgxMDAwKSBSRVRVUk4gc2xlZXBMb29vb25nJyk7IH0gKShwYXJhbXMpO1wiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIgXG59XG5bIFxuICB7IFxuICAgIFwiaWRcIiA6IFwiNzM0MDlcIiwgXG4gICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgIFwidXNlclwiIDogXCJyb290XCIsIFxuICAgIFwicXVlcnlcIiA6IFwiRk9SIHNsZWVwTG9vb29uZyBJTiAxLi41IExFVCBzbGVlcExvb29vbmdlciA9IFNMRUVQKDEwMDApIFJFVFVSTiBzbGVlcExvb29vbmdcIiwgXG4gICAgXCJiaW5kVmFyc1wiIDogeyBcbiAgICB9LCBcbiAgICBcInN0YXJ0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoyNlpcIiwgXG4gICAgXCJydW5UaW1lXCIgOiAxLjAxMjQ4MTMzMjk5OTk4MjQsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAzMjc2OCwgXG4gICAgXCJzdGF0ZVwiIDogXCJleGVjdXRpbmdcIiwgXG4gICAgXCJzdHJlYW1cIiA6IGZhbHNlIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJRVUVSWV8wMl9saXN0UXVlcmllcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "QUERY_03_listSlowQueries_single": { + "request": "LS0tCm5hbWU6IFFVRVJZXzAzX2xpc3RTbG93UXVlcmllcwpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgcXVlcmllcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hcWwvcXVlcmllcyIpOwpxdWVyaWVzLnNsb3coKTs=", + "response": "eyJpbnB1dCI6InF1ZXJpZXMuc2xvdygpOyIsIm91dHB1dCI6IlsgXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJRVUVSWV8wM19saXN0U2xvd1F1ZXJpZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "QUERY_04_clearSlowQueries_single": { + "request": "LS0tCm5hbWU6IFFVRVJZXzA0X2NsZWFyU2xvd1F1ZXJpZXMKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIHF1ZXJpZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYXFsL3F1ZXJpZXMiKTsKcXVlcmllcy5jbGVhclNsb3coKTsKcXVlcmllcy5zbG93KCk7", + "response": "eyJpbnB1dCI6InF1ZXJpZXMuY2xlYXJTbG93KCk7XG5xdWVyaWVzLnNsb3coKTsiLCJvdXRwdXQiOiJ7IFxuICBcImNvZGVcIiA6IDIwMCBcbn1cblxuWyBdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlFVRVJZXzA0X2NsZWFyU2xvd1F1ZXJpZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "QUERY_05_killQueries_single": { + "request": "LS0tCm5hbWU6IFFVRVJZXzA1X2tpbGxRdWVyaWVzCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBxdWVyaWVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FxbC9xdWVyaWVzIik7Cn52YXIgdGFza3MgPSByZXF1aXJlKCJAYXJhbmdvZGIvdGFza3MiKTsKfnZhciB0aGVRdWVyeSA9ICdGT1Igc2xlZXBMb29vb25nIElOIDEuLjUgTEVUIHNsZWVwTG9vb29uZ2VyID0gU0xFRVAoMTAwMCkgUkVUVVJOIHNsZWVwTG9vb29uZyc7CnZhciBydW5uaW5nUXVlcmllcyA9IHF1ZXJpZXMuY3VycmVudCgpLmZpbHRlcihmdW5jdGlvbihxdWVyeSkgewogIHJldHVybiBxdWVyeS5xdWVyeSA9PT0gdGhlUXVlcnk7Cn0pOwpxdWVyaWVzLmtpbGwocnVubmluZ1F1ZXJpZXNbMF0uaWQpOw==", + "response": "eyJpbnB1dCI6InZhciBydW5uaW5nUXVlcmllcyA9IHF1ZXJpZXMuY3VycmVudCgpLmZpbHRlcihmdW5jdGlvbihxdWVyeSkge1xuICByZXR1cm4gcXVlcnkucXVlcnkgPT09IHRoZVF1ZXJ5O1xufSk7XG5xdWVyaWVzLmtpbGwocnVubmluZ1F1ZXJpZXNbMF0uaWQpOyIsIm91dHB1dCI6InsgXG4gIFwiY29kZVwiIDogMjAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJRVUVSWV8wNV9raWxsUXVlcmllcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAdminCompact_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5Db21wYWN0Ci0tLQp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgJy9fYWRtaW4vY29tcGFjdCcsICcnKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2NvbXBhY3QnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RBZG1pbkNvbXBhY3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestAdminLicenseGet_cluster": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5MaWNlbnNlR2V0CnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBhc3NlcnRUeXBlT2YgPSByZXF1aXJlKCJqc3VuaXR5IikuanNVbml0eS5hc3NlcnRpb25zLmFzc2VydFR5cGVPZjsKdmFyIHVybCA9ICIvX2FkbWluL2xpY2Vuc2UiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwphc3NlcnRUeXBlT2YoInN0cmluZyIsIHJlc3BvbnNlLnBhcnNlZEJvZHkubGljZW5zZSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYWRtaW4vbGljZW5zZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE2MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInVwZ3JhZGluZ1wiIDogZmFsc2UsIFxuICBcImZlYXR1cmVzXCIgOiB7IFxuICAgIFwiZXhwaXJlc1wiIDogMTc0ODAzNDg4NSBcbiAgfSwgXG4gIFwibGljZW5zZVwiIDogXCJKRDRFT1hka2MxWlZPbmxVQlZSOFV3TkJaMWdIZlNkZFcxMWtHV1FNWEU1MkdXQUhlSEVwQ0h3RklIOHlkUWxmXCIsIFxuICBcInZlcnNpb25cIiA6IDEsIFxuICBcInN0YXR1c1wiIDogXCJleHBpcmluZ1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0QWRtaW5MaWNlbnNlR2V0IiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAdminMetricsV2_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5NZXRyaWNzVjIKLS0tCnZhciB1cmwgPSAiL19hZG1pbi9tZXRyaWNzL3YyIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ1BsYWluUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYWRtaW4vbWV0cmljcy92MiciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc5OTMzXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbiMgSEVMUCBhcmFuZ29kYl9hZ2VuY3lfY2FjaGVfY2FsbGJhY2tfbnVtYmVyIEN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gYWdlbmN5IGNhY2hlIGNhbGxiYWNrcyB0YWJsZVxuIyBUWVBFIGFyYW5nb2RiX2FnZW5jeV9jYWNoZV9jYWxsYmFja19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX2FnZW5jeV9jYWNoZV9jYWxsYmFja19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYWdlbmN5X2NhbGxiYWNrX251bWJlciBDdXJyZW50IG51bWJlciBvZiBhZ2VuY3kgY2FsbGJhY2tzIHJlZ2lzdGVyZWRcbiMgVFlQRSBhcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2FnZW5jeV9jYWxsYmFja19yZWdpc3RlcmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBhZ2VuY3kgY2FsbGJhY2tzIHJlZ2lzdGVyZWRcbiMgVFlQRSBhcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfcmVnaXN0ZXJlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfcmVnaXN0ZXJlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjIFJlcXVlc3QgdGltZSBmb3IgQWdlbmN5IHJlcXVlc3RzIFttc11cbiMgVFlQRSBhcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjIGhpc3RvZ3JhbVxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjkyXCJ9IDBcbmFyYW5nb2RiX2FnZW5jeWNvbW1fcmVxdWVzdF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjUyNlwifSAwXG5hcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI5OTVcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTkzMlwifSAwXG5hcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzODA2XCJ9IDBcbmFyYW5nb2RiX2FnZW5jeWNvbW1fcmVxdWVzdF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjc1NTRcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTUwNTBcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzAwNDNcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjAwMjlcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjX2NvdW50e3JvbGU9XCJTSU5HTEVcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19zdW17cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2FsbF9xdWVyeV90b3RhbCBUb3RhbCBudW1iZXIgb2YgQVFMIHF1ZXJpZXMgZmluaXNoZWRcbiMgVFlQRSBhcmFuZ29kYl9hcWxfYWxsX3F1ZXJ5X3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2FxbF9hbGxfcXVlcnlfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxODJcbiMgSEVMUCBhcmFuZ29kYl9hcWxfY3VycmVudF9xdWVyeSBDdXJyZW50IG51bWJlciBvZiBBUUwgcXVlcmllcyBleGVjdXRpbmdcbiMgVFlQRSBhcmFuZ29kYl9hcWxfY3VycmVudF9xdWVyeSBnYXVnZVxuYXJhbmdvZGJfYXFsX2N1cnJlbnRfcXVlcnl7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2dsb2JhbF9tZW1vcnlfbGltaXQgVG90YWwgbWVtb3J5IGxpbWl0IGZvciBhbGwgQVFMIHF1ZXJpZXMgY29tYmluZWQgW2J5dGVzXVxuIyBUWVBFIGFyYW5nb2RiX2FxbF9nbG9iYWxfbWVtb3J5X2xpbWl0IGdhdWdlXG5hcmFuZ29kYl9hcWxfZ2xvYmFsX21lbW9yeV9saW1pdHtyb2xlPVwiU0lOR0xFXCJ9IDI2ODAyNzAwMDAyXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2dsb2JhbF9tZW1vcnlfdXNhZ2UgVG90YWwgbWVtb3J5IHVzYWdlIG9mIGFsbCBBUUwgcXVlcmllcyBleGVjdXRpbmcgW2J5dGVzXSwgZ3JhbnVsYXJpdHk6IDMyNzY4IGJ5dGVzIHN0ZXBzXG4jIFRZUEUgYXJhbmdvZGJfYXFsX2dsb2JhbF9tZW1vcnlfdXNhZ2UgZ2F1Z2VcbmFyYW5nb2RiX2FxbF9nbG9iYWxfbWVtb3J5X3VzYWdle3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2FxbF9nbG9iYWxfcXVlcnlfbWVtb3J5X2xpbWl0X3JlYWNoZWRfdG90YWwgTnVtYmVyIG9mIGdsb2JhbCBBUUwgcXVlcnkgbWVtb3J5IGxpbWl0IHZpb2xhdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9hcWxfZ2xvYmFsX3F1ZXJ5X21lbW9yeV9saW1pdF9yZWFjaGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2FxbF9nbG9iYWxfcXVlcnlfbWVtb3J5X2xpbWl0X3JlYWNoZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2xvY2FsX3F1ZXJ5X21lbW9yeV9saW1pdF9yZWFjaGVkX3RvdGFsIE51bWJlciBvZiBsb2NhbCBBUUwgcXVlcnkgbWVtb3J5IGxpbWl0IHZpb2xhdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9hcWxfbG9jYWxfcXVlcnlfbWVtb3J5X2xpbWl0X3JlYWNoZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfYXFsX2xvY2FsX3F1ZXJ5X21lbW9yeV9saW1pdF9yZWFjaGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2FxbF9xdWVyeV90aW1lIEV4ZWN1dGlvbiB0aW1lIGhpc3RvZ3JhbSBmb3IgYWxsIEFRTCBxdWVyaWVzIFtzXVxuIyBUWVBFIGFyYW5nb2RiX2FxbF9xdWVyeV90aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfYXFsX3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDAwMDk1XCJ9IDg1XG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAxOTFcIn0gMTcxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAzODFcIn0gMTc5XG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDA3NjNcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDE1MjZcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDMwNTJcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDYxMDRcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMTIyMDdcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMjQ0MTRcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wNDg4MjhcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wOTc2NTZcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4xOTUzMTJcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4zOTA2MjVcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC43ODEyNTBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS41NjI1MDBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMy4xMjUwMDBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNi4yNTAwMDBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTIuNTAwMDAwXCJ9IDE4MlxuYXJhbmdvZGJfYXFsX3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjI1LjAwMDAwMFwifSAxODJcbmFyYW5nb2RiX2FxbF9xdWVyeV90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDE4MlxuYXJhbmdvZGJfYXFsX3F1ZXJ5X3RpbWVfY291bnR7cm9sZT1cIlNJTkdMRVwifSAxODJcbmFyYW5nb2RiX2FxbF9xdWVyeV90aW1lX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDMwNTQyXG4jIEhFTFAgYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZSBFeGVjdXRpb24gdGltZSBoaXN0b2dyYW0gZm9yIHNsb3cgQVFMIHF1ZXJpZXMgW3NdXG4jIFRZUEUgYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQuOTA0Mjk3XCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjguODA4NTk0XCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2LjYxNzE4OFwifSAwXG5hcmFuZ29kYl9hcWxfc2xvd19xdWVyeV90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzMi4yMzQzNzVcIn0gMFxuYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjMuNDY4NzUwXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEyNS45Mzc1MDBcIn0gMFxuYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjUwLjg3NTAwMFwifSAwXG5hcmFuZ29kYl9hcWxfc2xvd19xdWVyeV90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI1MDAuNzUwMDAwXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAuNTAwMDAwXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZV9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9hcWxfdG90YWxfcXVlcnlfdGltZV9tc2VjX3RvdGFsIFRvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIGFsbCBBUUwgcXVlcmllcyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfYXFsX3RvdGFsX3F1ZXJ5X3RpbWVfbXNlY190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9hcWxfdG90YWxfcXVlcnlfdGltZV9tc2VjX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMTBcbiMgSEVMUCBhcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fbWljcm9zX3RvdGFsIFRvdGFsIGFtb3VudCBvZiBjb2xsZWN0aW9uIGxvY2sgYWNxdWlzaXRpb24gdGltZSBbzrxzXVxuIyBUWVBFIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl9taWNyb3NfdG90YWwgY291bnRlclxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX21pY3Jvc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDEyMlxuIyBIRUxQIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lIENvbGxlY3Rpb24gbG9jayBhY3F1aXNpdGlvbiB0aW1lIGhpc3RvZ3JhbSBbc11cbiMgVFlQRSBhcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAwMDFcIn0gMTE5MVxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDAwMDEwXCJ9IDEyOTNcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMDEwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDEwMDBcIn0gMTI5NFxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDEwMDAwXCJ9IDEyOTRcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjEwMDAwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS4wMDAwMDBcIn0gMTI5NFxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwLjAwMDAwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAwLjAwMDAwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDEyOTRcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwODY1XG4jIEhFTFAgYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3NlcXVlbnRpYWxfbW9kZV90b3RhbCBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHVzaW5nIHNlcXVlbnRpYWwgbG9ja2luZyBvZiBjb2xsZWN0aW9ucyB0byBhdm9pZCBkZWFkbG9ja2luZ1xuIyBUWVBFIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19zZXF1ZW50aWFsX21vZGVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3NlcXVlbnRpYWxfbW9kZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfdGltZW91dHNfZXhjbHVzaXZlX3RvdGFsIE51bWJlciBvZiB0aW1lb3V0cyB3aGVuIHRyeWluZyB0byBhY3F1aXJlIGNvbGxlY3Rpb24gZXhjbHVzaXZlIGxvY2tzXG4jIFRZUEUgYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3RpbWVvdXRzX2V4Y2x1c2l2ZV90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfdGltZW91dHNfZXhjbHVzaXZlX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja190aW1lb3V0c193cml0ZV90b3RhbCBOdW1iZXIgb2YgdGltZW91dHMgd2hlbiB0cnlpbmcgdG8gYWNxdWlyZSBjb2xsZWN0aW9uIHdyaXRlIGxvY2tzXG4jIFRZUEUgYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3RpbWVvdXRzX3dyaXRlX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja190aW1lb3V0c193cml0ZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfY29ubmVjdGlvbnNfY3JlYXRlZF90b3RhbCBUb3RhbCBudW1iZXIgb2YgY29ubmVjdGlvbnMgY3JlYXRlZFxuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9jb25uZWN0aW9uc19jcmVhdGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9jb25uZWN0aW9uc19jcmVhdGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9jb25uZWN0aW9uc19jdXJyZW50IEN1cnJlbnQgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGluIHBvb2xcbiMgVFlQRSBhcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfY29ubmVjdGlvbnNfY3VycmVudCBnYXVnZVxuYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2Nvbm5lY3Rpb25zX2N1cnJlbnR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlX3RpbWVfaGlzdCBUaW1lIHRvIGxlYXNlIGEgY29ubmVjdGlvbiBmcm9tIHBvb2wgW21zXVxuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3QgaGlzdG9ncmFtXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIxLjk1MzEyNVwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIzLjkwNjI1MFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCI3LjgxMjUwMFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIxNS42MjUwMDBcIn0gMFxuYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlX3RpbWVfaGlzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwiLGxlPVwiMzEuMjUwMDAwXCJ9IDBcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIixsZT1cIjYyLjUwMDAwMFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIxMjUuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIixsZT1cIjI1MC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlX3RpbWVfaGlzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwiLGxlPVwiNTAwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3RfY291bnR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X3N1bXtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlc19mYWlsZWRfdG90YWwgVG90YWwgbnVtYmVyIG9mIGZhaWxlZCBjb25uZWN0aW9uIGxlYXNlc1xuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfZmFpbGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfZmFpbGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfc3VjY2Vzc2Z1bF90b3RhbCBUb3RhbCBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGxlYXNlc1xuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfc3VjY2Vzc2Z1bF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VzX3N1Y2Nlc3NmdWxfdG90YWx7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX21lbW9yeV91c2FnZSBNZW1vcnkgdXNlZCBieSB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbiBzdGF0aXN0aWNzXG4jIFRZUEUgYXJhbmdvZGJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX21lbW9yeV91c2FnZSBnYXVnZVxuYXJhbmdvZGJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX21lbW9yeV91c2FnZXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9kaXJ0eV9yZWFkX3RyYW5zYWN0aW9uc190b3RhbCBOdW1iZXIgb2YgcmVhZCB0cmFuc2FjdGlvbnMgd2hpY2ggY2FuIGRvIGRpcnR5IHJlYWRzXG4jIFRZUEUgYXJhbmdvZGJfZGlydHlfcmVhZF90cmFuc2FjdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfZGlydHlfcmVhZF90cmFuc2FjdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19jdXJyZW50IE51bWJlciBvZiBjdXJyZW50bHkgb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgYXJhbmdvZCBwcm9jZXNzXG4jIFRZUEUgYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19jdXJyZW50IGdhdWdlXG5hcmFuZ29kYl9maWxlX2Rlc2NyaXB0b3JzX2N1cnJlbnR7cm9sZT1cIlNJTkdMRVwifSAyN1xuIyBIRUxQIGFyYW5nb2RiX2ZpbGVfZGVzY3JpcHRvcnNfbGltaXQgTGltaXQgZm9yIHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgYXJhbmdvZCBwcm9jZXNzXG4jIFRZUEUgYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19saW1pdCBnYXVnZVxuYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19saW1pdHtyb2xlPVwiU0lOR0xFXCJ9IDEwNDg1NzZcbiMgSEVMUCBhcmFuZ29kYl9mbHVzaF9zdWJzY3JpcHRpb25zIE51bWJlciBvZiBhY3RpdmUgZmx1c2ggc3Vic2NyaXB0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX2ZsdXNoX3N1YnNjcmlwdGlvbnMgZ2F1Z2VcbmFyYW5nb2RiX2ZsdXNoX3N1YnNjcmlwdGlvbnN7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfaGVhcnRiZWF0X2ZhaWx1cmVzX3RvdGFsIENvdW50aW5nIGZhaWxlZCBoZWFydGJlYXQgdHJhbnNtaXNzaW9uc1xuIyBUWVBFIGFyYW5nb2RiX2hlYXJ0YmVhdF9mYWlsdXJlc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9oZWFydGJlYXRfZmFpbHVyZXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfaGVhcnRiZWF0X3NlbmRfdGltZV9tc2VjIFRpbWUgcmVxdWlyZWQgdG8gc2VuZCBoZWFydGJlYXQgW21zXVxuIyBUWVBFIGFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlYyBoaXN0b2dyYW1cbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTlcIn0gMFxuYXJhbmdvZGJfaGVhcnRiZWF0X3NlbmRfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzNVwifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjY2XCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI4XCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjUzXCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTAzXCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAwM1wifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjIwMDNcIn0gMFxuYXJhbmdvZGJfaGVhcnRiZWF0X3NlbmRfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MDAyXCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2h0dHAxX2Nvbm5lY3Rpb25zX3RvdGFsIFRvdGFsIG51bWJlciBvZiBIVFRQLzEuMSBjb25uZWN0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX2h0dHAxX2Nvbm5lY3Rpb25zX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHAxX2Nvbm5lY3Rpb25zX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIGFyYW5nb2RiX2h0dHAyX2Nvbm5lY3Rpb25zX3RvdGFsIFRvdGFsIG51bWJlciBvZiBIVFRQLzIgY29ubmVjdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9odHRwMl9jb25uZWN0aW9uc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwMl9jb25uZWN0aW9uc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9pbnRlcm1lZGlhdGVfY29tbWl0c190b3RhbCBOdW1iZXIgb2YgaW50ZXJtZWRpYXRlIGNvbW1pdHMgcGVyZm9ybWVkIGluIHRyYW5zYWN0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX2ludGVybWVkaWF0ZV9jb21taXRzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2ludGVybWVkaWF0ZV9jb21taXRzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2lvaGVhcnRiZWF0X2RlbGF5c190b3RhbCBUb3RhbCBudW1iZXIgb2YgZGVsYXlzIGluIElPIGhlYXJ0YmVhdFxuIyBUWVBFIGFyYW5nb2RiX2lvaGVhcnRiZWF0X2RlbGF5c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9kZWxheXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb24gVGltZSB0byBleGVjdXRlIHRoZSBpbyBoZWFydGJlYXQgb25jZSBbdXNdXG4jIFRZUEUgYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb24gaGlzdG9ncmFtXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4xMDAwMDBcIn0gMFxuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX2lvaGVhcnRiZWF0X2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX2lvaGVhcnRiZWF0X2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAwMC4wMDAwMDBcIn0gM1xuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAwMC4wMDAwMDBcIn0gM1xuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gM1xuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fY291bnR7cm9sZT1cIlNJTkdMRVwifSAzXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9kdXJhdGlvbl9zdW17cm9sZT1cIlNJTkdMRVwifSA5ODI0LjAwMDAwMFxuIyBIRUxQIGFyYW5nb2RiX2lvaGVhcnRiZWF0X2ZhaWx1cmVzX3RvdGFsIFRvdGFsIG51bWJlciBvZiBmYWlsdXJlcyBpbiBJTyBoZWFydGJlYXRcbiMgVFlQRSBhcmFuZ29kYl9pb2hlYXJ0YmVhdF9mYWlsdXJlc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9mYWlsdXJlc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9saWNlbnNlX2V4cGlyZXMgVGhpcyBpbnN0YW5jZSdzIGxpY2Vuc2Ugd2lsbCBleHBpcmUgaW4gZGF5c1xuIyBUWVBFIGFyYW5nb2RiX2xpY2Vuc2VfZXhwaXJlcyBnYXVnZVxuYXJhbmdvZGJfbGljZW5zZV9leHBpcmVze3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lIEN1cnJlbnQgbG9hZGluZyBydW50aW1lcyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWUgaGlzdG9ncmFtXG5hcmFuZ29kYl9sb2FkX2N1cnJlbnRfcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4zMDg1MjVcIn0gMFxuYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuODM4NjU3XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyLjI3OTcwNVwifSAwXG5hcmFuZ29kYl9sb2FkX2N1cnJlbnRfcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNi4xOTY4ODJcIn0gMFxuYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2Ljg0NDg3MFwifSAwXG5hcmFuZ29kYl9sb2FkX2N1cnJlbnRfcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNDUuNzg5MTA0XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMjQuNDY3NjgyXCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzMzguMzM4MjI2XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI5MTkuNjk4NjA4XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2NvdW50e3JvbGU9XCJTSU5HTEVcIn0gMFxuYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWVfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZSBQbGFuIGxvYWRpbmcgcnVudGltZXMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfbG9hZF9wbGFuX3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMzA4NTI1XCJ9IDBcbmFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjgzODY1N1wifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMi4yNzk3MDVcIn0gMFxuYXJhbmdvZGJfbG9hZF9wbGFuX3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjYuMTk2ODgyXCJ9IDBcbmFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNi44NDQ4NzBcIn0gMFxuYXJhbmdvZGJfbG9hZF9wbGFuX3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQ1Ljc4OTEwNFwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI0LjQ2NzY4MlwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzM4LjMzODIyNlwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiOTE5LjY5ODYwOFwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfbG9nZ2VyX2Vycm9yc190b3RhbCBOdW1iZXIgb2YgZXJyb3JzIGxvZ2dlZC5cbiMgVFlQRSBhcmFuZ29kYl9sb2dnZXJfZXJyb3JzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2xvZ2dlcl9lcnJvcnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxNFxuIyBIRUxQIGFyYW5nb2RiX2xvZ2dlcl93YXJuaW5nc190b3RhbCBOdW1iZXIgb2Ygd2FybmluZ3MgbG9nZ2VkLlxuIyBUWVBFIGFyYW5nb2RiX2xvZ2dlcl93YXJuaW5nc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9sb2dnZXJfd2FybmluZ3NfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxM1xuIyBIRUxQIGFyYW5nb2RiX25ldHdvcmtfZGVxdWV1ZV9kdXJhdGlvbiBUaW1lIHRvIGRlcXVldWUgYSBxdWV1ZWQgbmV0d29yayByZXF1ZXN0IGluIGZ1ZXJ0ZSBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uIGhpc3RvZ3JhbVxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMDAwMVwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX2RlcXVldWVfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDAwMDEwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfZGVxdWV1ZV9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAxMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMTAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX2RlcXVldWVfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDEwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfZGVxdWV1ZV9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4xMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX2RlcXVldWVfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2NvdW50e3JvbGU9XCJTSU5HTEVcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfbmV0d29ya19mb3J3YXJkZWRfcmVxdWVzdHNfdG90YWwgTnVtYmVyIG9mIHJlcXVlc3RzIGZvcndhcmRlZCB0byBhbm90aGVyIGNvb3JkaW5hdG9yXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19mb3J3YXJkZWRfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfbmV0d29ya19mb3J3YXJkZWRfcmVxdWVzdHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dCBJbnRlcm5hbCByZXF1ZXN0IHJvdW5kLXRyaXAgdGltZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGltZW91dCBbJV1cbiMgVFlQRSBhcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RfZHVyYXRpb25fYXNfcGVyY2VudGFnZV9vZl90aW1lb3V0IGhpc3RvZ3JhbVxuYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNS4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTUuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdF9kdXJhdGlvbl9hc19wZXJjZW50YWdlX29mX3RpbWVvdXRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjUwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RfZHVyYXRpb25fYXNfcGVyY2VudGFnZV9vZl90aW1lb3V0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdF9kdXJhdGlvbl9hc19wZXJjZW50YWdlX29mX3RpbWVvdXRfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RfZHVyYXRpb25fYXNfcGVyY2VudGFnZV9vZl90aW1lb3V0X3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X3RpbWVvdXRzX3RvdGFsIE51bWJlciBvZiBpbnRlcm5hbCByZXF1ZXN0cyB0aGF0IGhhdmUgdGltZWQgb3V0XG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X3RpbWVvdXRzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdF90aW1lb3V0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RzX2luX2ZsaWdodCBOdW1iZXIgb2Ygb3V0Z29pbmcgaW50ZXJuYWwgcmVxdWVzdHMgaW4gZmxpZ2h0XG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0c19pbl9mbGlnaHQgZ2F1Z2VcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdHNfaW5fZmxpZ2h0e3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb24gVGltZSB0byB3YWl0IGZvciBuZXR3b3JrIHJlc3BvbnNlIGFmdGVyIGl0IHdhcyBzZW50IG91dCBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19yZXNwb25zZV9kdXJhdGlvbiBoaXN0b2dyYW1cbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDEwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMTAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3Jlc3BvbnNlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19yZXNwb25zZV9kdXJhdGlvbl9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fc3Vte3JvbGU9XCJTSU5HTEVcIn0gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9uZXR3b3JrX3NlbmRfZHVyYXRpb24gVGltZSB0byBzZW5kIG91dCBpbnRlcm5hbCByZXF1ZXN0cyBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uIGhpc3RvZ3JhbVxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAxMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3NlbmRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMTAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAwMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9zdW17cm9sZT1cIlNJTkdMRVwifSAwLjAwMDAwMFxuIyBIRUxQIGFyYW5nb2RiX25ldHdvcmtfdW5maW5pc2hlZF9zZW5kc190b3RhbCBOdW1iZXIgb2YgdGltZXMgdGhlIHNlbmRpbmcgb2YgYSByZXF1ZXN0IHJlbWFpbmVkIHVuZmluaXNoZWRcbiMgVFlQRSBhcmFuZ29kYl9uZXR3b3JrX3VuZmluaXNoZWRfc2VuZHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfbmV0d29ya191bmZpbmlzaGVkX3NlbmRzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX2xvYWRpbmdfbnVtYmVyIE51bWJlciBvZiBQcmVnZWwgY29uZHVjdG9ycyBpbiBsb2FkaW5nIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfbG9hZGluZ19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX2xvYWRpbmdfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX251bWJlciBOdW1iZXIgb2YgbGl2ZSBQcmVnZWwgY29uZHVjdG9yc1xuIyBUWVBFIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gN1xuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3J1bm5pbmdfbnVtYmVyIE51bWJlciBvZiBQcmVnZWwgY29uZHVjdG9ycyBpbiBydW5uaW5nIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfcnVubmluZ19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3J1bm5pbmdfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3N0b3JpbmdfbnVtYmVyIE51bWJlciBvZiBQcmVnZWwgY29uZHVjdG9ycyBpbiBzdG9yaW5nIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfc3RvcmluZ19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3N0b3JpbmdfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9ncmFwaF9tZW1vcnlfYnl0ZXNfbnVtYmVyIEFtb3VudCBvZiBtZW1vcnkgaW4gdXNlIGZvciBQcmVnZWwgZ3JhcGggc3RvcmFnZVxuIyBUWVBFIGFyYW5nb2RiX3ByZWdlbF9ncmFwaF9tZW1vcnlfYnl0ZXNfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9wcmVnZWxfZ3JhcGhfbWVtb3J5X2J5dGVzX251bWJlcntyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9wcmVnZWxfbWVzc2FnZXNfcmVjZWl2ZWRfdG90YWwgTnVtYmVyIG9mIG1lc3NhZ2VzIHJlY2VpdmVkIGJ5IFByZWdlbFxuIyBUWVBFIGFyYW5nb2RiX3ByZWdlbF9tZXNzYWdlc19yZWNlaXZlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9wcmVnZWxfbWVzc2FnZXNfcmVjZWl2ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAyNTM0XG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX21lc3NhZ2VzX3NlbnRfdG90YWwgTnVtYmVyIG9mIG1lc3NhZ2VzIHNlbnQgYnkgUHJlZ2VsXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX21lc3NhZ2VzX3NlbnRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcHJlZ2VsX21lc3NhZ2VzX3NlbnRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3RocmVhZHNfbnVtYmVyIE51bWJlciBvZiB0aHJlYWRzIHVzZWQgYnkgUHJlZ2VsXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX3RocmVhZHNfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9wcmVnZWxfdGhyZWFkc19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbG9hZGluZ19udW1iZXIgTnVtYmVyIG9mIFByZWdlbCBjb25kdWN0b3JzIGluIGxvYWRpbmcgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19sb2FkaW5nX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbG9hZGluZ19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbnVtYmVyIE51bWJlciBvZiBsaXZlIFByZWdlbCB3b3JrZXJzXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAyXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfcnVubmluZ19udW1iZXIgTnVtYmVyIG9mIFByZWdlbCBjb25kdWN0b3JzIGluIHJ1bm5pbmcgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19ydW5uaW5nX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfcnVubmluZ19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfc3RvcmluZ19udW1iZXIgTnVtYmVyIG9mIFByZWdlbCBjb25kdWN0b3JzIGluIHN0b3Jpbmcgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19zdG9yaW5nX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfc3RvcmluZ19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSA0XG4jIEhFTFAgYXJhbmdvZGJfcmVhZF90cmFuc2FjdGlvbnNfdG90YWwgTnVtYmVyIG9mIHJlYWQgdHJhbnNhY3Rpb25zXG4jIFRZUEUgYXJhbmdvZGJfcmVhZF90cmFuc2FjdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVhZF90cmFuc2FjdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA1MDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0IFJUVCBmb3IgQXBwZW5kRW50cmllcyByZXF1ZXN0cyBbdXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dCBoaXN0b2dyYW1cbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzIwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjI1NjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI1MTIwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAyNDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMDQ4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwOTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiODE5MjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjM4NDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfY3JlYXRpb25fdG90YWwgTnVtYmVyIG9mIHJlcGxpY2F0ZWQgbG9ncyBjcmVhdGVkIHNpbmNlIHNlcnZlciBzdGFydFxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19jcmVhdGlvbl90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfY3JlYXRpb25fdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2RlbGV0aW9uX3RvdGFsIE51bWJlciBvZiByZXBsaWNhdGVkIGxvZ3MgZGVsZXRlZCBzaW5jZSBzZXJ2ZXIgc3RhcnRcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZGVsZXRpb25fdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2RlbGV0aW9uX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydCBSVCBmb3IgQXBwZW5kRW50cmllcyBjYWxsIFt1c11cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnQgaGlzdG9ncmFtXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMjgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyNTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI1MTIwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDI0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjA0ODAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwOTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MTkyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTYzODQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9zdW17cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX251bWJlciBOdW1iZXIgb2YgcmVwbGljYXRlZCBsb2dzIHRoaXMgc2VydmVyIGhhcywgYW5kIGlzIGN1cnJlbnRseSBhIGZvbGxvd2VyIG9mXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX251bWJlcntyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5hY3RpdmVfbnVtYmVyIE51bWJlciBvZiByZXBsaWNhdGVkIGxvZ3MgdGhpcyBzZXJ2ZXIgaGFzLCBhbmQgaXMgY3VycmVudGx5IG5laXRoZXIgbGVhZGVyIG5vciBmb2xsb3dlciBvZlxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbmFjdGl2ZV9udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbmFjdGl2ZV9udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHBlciBpbnNlcnQgaW4gcmVwbGljYXRlZCBsb2cgbGVhZGVyIGluc3RhbmNlcyBvbiB0aGlzIHNlcnZlciBbYnl0ZXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXMgaGlzdG9ncmFtXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMVwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTZcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjY0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyNTZcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMjRcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwOTZcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2Mzg0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI2NTUzNlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjYyMTQ0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDQ4NTc2XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MTk0MzA0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjc3NzIxNlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjcxMDg4NjRcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjI2ODQzNTQ1NlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTA3Mzc0MTgyNFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHQgSGlzdG9ncmFtIG9mIHJvdW5kLXRyaXAgdGltZXMgb2YgcmVwbGljYXRlZCBsb2cgaW5zZXJ0cyBbdXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0IGhpc3RvZ3JhbVxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzMjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjY0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjU2MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTEyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAyNDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjIwNDgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MDk2MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiODE5MjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2Mzg0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19sZWFkZXJfbnVtYmVyIE51bWJlciBvZiByZXBsaWNhdGVkIGxvZ3MgdGhpcyBzZXJ2ZXIgaGFzLCBhbmQgaXMgY3VycmVudGx5IGEgbGVhZGVyIG9mXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2xlYWRlcl9udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19sZWFkZXJfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19sZWFkZXJfdG9va19vdmVyX3RvdGFsIE51bWJlciBvZiB0aW1lcyBhIHJlcGxpY2F0ZWQgbG9nIG9uIHRoaXMgc2VydmVyIHRvb2sgb3ZlciBhcyBsZWFkZXIgaW4gYSB0ZXJtXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2xlYWRlcl90b29rX292ZXJfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2xlYWRlcl90b29rX292ZXJfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlciBOdW1iZXIgb2YgcmVwbGljYXRlZCBsb2dzIG9uIHRoaXMgYXJhbmdvZGIgaW5zdGFuY2VcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfYWNjZXB0ZWRfZW50cmllc190b3RhbCBOdW1iZXIgb2YgYWNjZXB0ZWQgKG5vdCB5ZXQgY29tbWl0dGVkKSBsb2cgZW50cmllc1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfYWNjZXB0ZWRfZW50cmllc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyX2FjY2VwdGVkX2VudHJpZXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlcl9jb21taXR0ZWRfZW50cmllc190b3RhbCBOdW1iZXIgb2YgY29tbWl0dGVkIGxvZyBlbnRyaWVzXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlcl9jb21taXR0ZWRfZW50cmllc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyX2NvbW1pdHRlZF9lbnRyaWVzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfY29tcGFjdGVkX2VudHJpZXNfdG90YWwgTnVtYmVyIG9mIGNvbXBhY3RlZCBsb2cgZW50cmllc1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfY29tcGFjdGVkX2VudHJpZXNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlcl9jb21wYWN0ZWRfZW50cmllc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyX21ldGFfZW50cmllc190b3RhbCBOdW1iZXIgb2YgbWV0YSBsb2cgZW50cmllc1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfbWV0YV9lbnRyaWVzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfbWV0YV9lbnRyaWVzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19zdGFydGVkX2ZvbGxvd2luZ190b3RhbCBOdW1iZXIgb2YgdGltZXMgYSByZXBsaWNhdGVkIGxvZyBvbiB0aGlzIHNlcnZlciBzdGFydGVkIGZvbGxvd2luZyBhIGxlYWRlciBpbiBhIHRlcm1cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfc3RhcnRlZF9mb2xsb3dpbmdfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX3N0YXJ0ZWRfZm9sbG93aW5nX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2NsaWVudHMgTnVtYmVyIG9mIHJlcGxpY2F0aW9uIGNsaWVudHMgY29ubmVjdGVkXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fY2xpZW50cyBnYXVnZVxuYXJhbmdvZGJfcmVwbGljYXRpb25fY2xpZW50c3tyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9jbHVzdGVyX2ludmVudG9yeV9yZXF1ZXN0c190b3RhbCAoREMtMi1EQyBvbmx5KSBOdW1iZXIgb2YgdGltZXMgdGhlIGRhdGFiYXNlIGFuZCBjb2xsZWN0aW9uIG92ZXJ2aWV3cyBoYXZlIGJlZW4gcmVxdWVzdGVkLlxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2NsdXN0ZXJfaW52ZW50b3J5X3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2NsdXN0ZXJfaW52ZW50b3J5X3JlcXVlc3RzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfYXBwbHlfdGltZV90b3RhbCBBY2N1bXVsYXRlZCB0aW1lIG5lZWRlZCB0byBhcHBseSBhc3luY2hyb25vdXNseSByZXBsaWNhdGVkIGRhdGEgb24gaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gb2Ygc2hhcmRzLiBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9hcHBseV90aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfYXBwbHlfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9kdW1wX2J5dGVzX3JlY2VpdmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBieXRlcyByZXBsaWNhdGVkIGluIGluaXRpYWwgYXN5bmNocm9ub3VzIHBoYXNlLlxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfYnl0ZXNfcmVjZWl2ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9ieXRlc19yZWNlaXZlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9kdW1wX2RvY3VtZW50c190b3RhbCBUb3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIHJlcGxpY2F0ZWQgaW4gaW5pdGlhbCBhc3luY2hyb25vdXMgcGhhc2UuXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9kb2N1bWVudHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9kb2N1bWVudHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9yZXF1ZXN0X3RpbWVfdG90YWwgQWNjdW11bGF0ZWQgd2FpdCB0aW1lIGZvciByZXBsaWNhdGlvbiByZXF1ZXN0cyBpbiBpbml0aWFsIGFzeW5jaHJvbm91cyBwaGFzZS4gW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfcmVxdWVzdF90aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfcmVxdWVzdF90aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfcmVxdWVzdHNfdG90YWwgTnVtYmVyIG9mIHJlcXVlc3RzIHVzZWQgaW4gaW5pdGlhbCBhc3luY2hyb25vdXMgcmVwbGljYXRpb24gcGhhc2UuXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl9kdW1wX3JlcXVlc3RzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2ZhaWxlZF9jb25uZWN0c190b3RhbCBOdW1iZXIgb2YgZmFpbGVkIGNvbm5lY3Rpb24gYXR0ZW1wdHMgYW5kIHJlc3BvbnNlIGVycm9ycyBkdXJpbmcgaW5pdGlhbCBhc3luY2hyb25vdXMgcmVwbGljYXRpb25cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9mYWlsZWRfY29ubmVjdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fZmFpbGVkX2Nvbm5lY3RzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfY2h1bmtzX3JlcXVlc3RzX3RpbWVfdG90YWwgV2FpdCB0aW1lIGZvciByZXBsaWNhdGlvbiBrZXkgY2h1bmtzIGRldGVybWluYXRpb24gcmVxdWVzdHMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfY2h1bmtzX3JlcXVlc3RzX3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9jaHVua3NfcmVxdWVzdHNfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX2RvY3NfcmVxdWVzdHNfdGltZV90b3RhbCBUaW1lIG5lZWRlZCB0byBhcHBseSByZXBsaWNhdGlvbiBkb2NzIGRhdGEgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfZG9jc19yZXF1ZXN0c190aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfZG9jc19yZXF1ZXN0c190aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfaW5zZXJ0X2FwcGx5X3RpbWVfdG90YWwgVGltZSBuZWVkZWQgdG8gYXBwbHkgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIGluc2VydGlvbnMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfaW5zZXJ0X2FwcGx5X3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9pbnNlcnRfYXBwbHlfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX2tleXNfcmVxdWVzdHNfdGltZV90b3RhbCBXYWl0IHRpbWUgZm9yIHJlcGxpY2F0aW9uIGtleXMgcmVxdWVzdHMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfa2V5c19yZXF1ZXN0c190aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfa2V5c19yZXF1ZXN0c190aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfcmVtb3ZlX2FwcGx5X3RpbWVfdG90YWwgVGltZSBuZWVkZWQgdG8gYXBwbHkgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIHJlbW92YWxzIFttc11cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3JlbW92ZV9hcHBseV90aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfcmVtb3ZlX2FwcGx5X3RpbWVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2J5dGVzX3JlY2VpdmVkX3RvdGFsIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBkdXJpbmcgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2J5dGVzX3JlY2VpdmVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19ieXRlc19yZWNlaXZlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19pbnNlcnRlZF90b3RhbCBOdW1iZXIgb2YgZG9jdW1lbnRzIGluc2VydGVkIGJ5IHJlcGxpY2F0aW9uIGluaXRpYWwgc3luY1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX2luc2VydGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX2luc2VydGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX3JlbW92ZWRfdG90YWwgTnVtYmVyIG9mIGRvY3VtZW50cyByZW1vdmVkIGJ5IHJlcGxpY2F0aW9uIGluaXRpYWwgc3luY1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX3JlbW92ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2RvY3NfcmVtb3ZlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0ZWRfdG90YWwgTnVtYmVyIG9mIGRvY3VtZW50cyByZXF1ZXN0ZWQgYnkgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2RvY3NfcmVxdWVzdGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX3JlcXVlc3RlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIGRvY3MgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfa2V5c19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIGtleXMgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfa2V5c19yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfa2V5c19yZXF1ZXN0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9zeW5jaHJvbm91c19yZXF1ZXN0c190b3RhbF9udW1iZXJfdG90YWwgVG90YWwgbnVtYmVyIG9mIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9uIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fc3luY2hyb25vdXNfcmVxdWVzdHNfdG90YWxfbnVtYmVyX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX3N5bmNocm9ub3VzX3JlcXVlc3RzX3RvdGFsX251bWJlcl90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9zeW5jaHJvbm91c19yZXF1ZXN0c190b3RhbF90aW1lX3RvdGFsIFRvdGFsIHRpbWUgbmVlZGVkIGZvciBhbGwgc3luY2hyb25vdXMgcmVwbGljYXRpb24gcmVxdWVzdHMgW25zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3N5bmNocm9ub3VzX3JlcXVlc3RzX3RvdGFsX3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fc3luY2hyb25vdXNfcmVxdWVzdHNfdG90YWxfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX2FwcGx5X3RpbWVfdG90YWwgVGltZSBuZWVkZWQgdG8gYXBwbHkgcmVwbGljYXRpb24gdGFpbGluZyBkYXRhIFttc11cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX2FwcGx5X3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19hcHBseV90aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfYnl0ZXNfcmVjZWl2ZWRfdG90YWwgTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciByZXBsaWNhdGlvbiB0YWlsaW5nIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19ieXRlc19yZWNlaXZlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX2J5dGVzX3JlY2VpdmVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfZG9jdW1lbnRzX3RvdGFsIE51bWJlciBvZiByZXBsaWNhdGlvbiB0YWlsaW5nIGRvY3VtZW50IGluc2VydHMvcmVwbGFjZXMgcHJvY2Vzc2VkXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19kb2N1bWVudHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19kb2N1bWVudHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19mb2xsb3dfdGlja19mYWlsdXJlc190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gdGFpbGluZyBmYWlsdXJlcyBkdWUgdG8gbWlzc2luZyB0aWNrIG9uIGxlYWRlclxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfZm9sbG93X3RpY2tfZmFpbHVyZXNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19mb2xsb3dfdGlja19mYWlsdXJlc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX21hcmtlcnNfdG90YWwgTnVtYmVyIG9mIHJlcGxpY2F0aW9uIHRhaWxpbmcgbWFya2VycyBwcm9jZXNzZWRcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX21hcmtlcnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19tYXJrZXJzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfcmVtb3ZhbHNfdG90YWwgTnVtYmVyIG9mIHJlcGxpY2F0aW9uIHRhaWxpbmcgZG9jdW1lbnQgcmVtb3ZhbHMgcHJvY2Vzc2VkXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZW1vdmFsc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX3JlbW92YWxzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfcmVxdWVzdF90aW1lX3RvdGFsIFdhaXQgdGltZSBmb3IgcmVwbGljYXRpb24gdGFpbGluZyByZXF1ZXN0cyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0X3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0X3RpbWVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gdGFpbGluZyByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMSBCb2R5IHNpemUgb2YgSFRUUC8xLjEgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMSBoaXN0b2dyYW1cbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxOTFcIn0gMTU2NlxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDFfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMxOVwifSAxNTcwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTc1XCJ9IDE1NzBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDg3XCJ9IDE1NzBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMTEwXCJ9IDE1NzBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MTU2XCJ9IDE1NzBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MjQ4XCJ9IDE1NzBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjQzMlwifSAxNTcwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzI4MDBcIn0gMTU3MFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDFfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMTU3MFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDFfY291bnR7cm9sZT1cIlNJTkdMRVwifSAxNTcwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMV9zdW17cm9sZT1cIlNJTkdMRVwifSAzNzc1N1xuIyBIRUxQIGFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyIEJvZHkgc2l6ZSBvZiBIVFRQLzIgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMiBoaXN0b2dyYW1cbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxOTFcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDJfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMxOVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTc1XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDg3XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMTEwXCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MTU2XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MjQ4XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjQzMlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzI4MDBcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDJfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDJfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMl9zdW17cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfdnN0IEJvZHkgc2l6ZSBvZiBWU1QgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3QgaGlzdG9ncmFtXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE5MVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMxOVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjU3NVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwODdcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfdnN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMTEwXCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX3ZzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNDE1NlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjgyNDhcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfdnN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjQzMlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMyODAwXCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX3ZzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3Rfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcXVlc3Rfc3RhdGlzdGljc19tZW1vcnlfdXNhZ2UgTWVtb3J5IHVzZWQgYnkgdGhlIGludGVybmFsIHJlcXVlc3Qgc3RhdGlzdGljc1xuIyBUWVBFIGFyYW5nb2RiX3JlcXVlc3Rfc3RhdGlzdGljc19tZW1vcnlfdXNhZ2UgZ2F1Z2VcbmFyYW5nb2RiX3JlcXVlc3Rfc3RhdGlzdGljc19tZW1vcnlfdXNhZ2V7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9oaWJlcm5hdGlvbnNfdG90YWwgTnVtYmVyIG9mIHJldmlzaW9uIHRyZWUgaGliZXJuYXRpb25zXG4jIFRZUEUgYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9oaWJlcm5hdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9oaWJlcm5hdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA2XG4jIEhFTFAgYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9tZW1vcnlfdXNhZ2UgVG90YWwgbWVtb3J5IGNvbnN1bWVkIGJ5IGFsbCByZXZpc2lvbiB0cmVlc1xuIyBUWVBFIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfbWVtb3J5X3VzYWdlIGdhdWdlXG5hcmFuZ29kYl9yZXZpc2lvbl90cmVlX21lbW9yeV91c2FnZXtyb2xlPVwiU0lOR0xFXCJ9IDMyNzk2MFxuIyBIRUxQIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfcmVidWlsZHNfZmFpbHVyZV90b3RhbCBOdW1iZXIgb2YgZmFpbGVkIHJldmlzaW9uIHRyZWUgcmVidWlsZHNcbiMgVFlQRSBhcmFuZ29kYl9yZXZpc2lvbl90cmVlX3JlYnVpbGRzX2ZhaWx1cmVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9yZWJ1aWxkc19mYWlsdXJlX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfcmVidWlsZHNfc3VjY2Vzc190b3RhbCBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCByZXZpc2lvbiB0cmVlIHJlYnVpbGRzXG4jIFRZUEUgYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9yZWJ1aWxkc19zdWNjZXNzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JldmlzaW9uX3RyZWVfcmVidWlsZHNfc3VjY2Vzc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXZpc2lvbl90cmVlX3Jlc3VycmVjdGlvbnNfdG90YWwgTnVtYmVyIG9mIHJldmlzaW9uIHRyZWUgcmVzdXJyZWN0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfcmVzdXJyZWN0aW9uc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXZpc2lvbl90cmVlX3Jlc3VycmVjdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAyXG4jIEhFTFAgYXJhbmdvZGJfcm9ja3NkYl93cml0ZV9zdGFsbHNfdG90YWwgTnVtYmVyIG9mIHRpbWVzIFJvY2tzREIgaGFzIGVudGVyZWQgYSBzdGFsbGVkIChzbG93ZWQpIHdyaXRlIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcm9ja3NkYl93cml0ZV9zdGFsbHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcm9ja3NkYl93cml0ZV9zdGFsbHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcm9ja3NkYl93cml0ZV9zdG9wc190b3RhbCBOdW1iZXIgb2YgdGltZXMgUm9ja3NEQiBoYXMgZW50ZXJlZCBhIHN0b3BwZWQgd3JpdGUgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9yb2Nrc2RiX3dyaXRlX3N0b3BzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JvY2tzZGJfd3JpdGVfc3RvcHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX2hhbmRsZXJfdGFza3NfY3JlYXRlZF90b3RhbCBOdW1iZXIgb2Ygc2NoZWR1bGVyIHRhc2tzIGNyZWF0ZWRcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfaGFuZGxlcl90YXNrc19jcmVhdGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl9oYW5kbGVyX3Rhc2tzX2NyZWF0ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxNTcwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX2hpZ2hfcHJpb19xdWV1ZV9sZW5ndGggQ3VycmVudCBxdWV1ZSBsZW5ndGggb2YgdGhlIGhpZ2ggcHJpb3JpdHkgcXVldWUgaW4gdGhlIHNjaGVkdWxlclxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9oaWdoX3ByaW9fcXVldWVfbGVuZ3RoIGdhdWdlXG5hcmFuZ29kYl9zY2hlZHVsZXJfaGlnaF9wcmlvX3F1ZXVlX2xlbmd0aHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfam9ic19kZXF1ZXVlZF90b3RhbCBUb3RhbCBudW1iZXIgb2Ygam9icyBkZXF1ZXVlZFxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9qb2JzX2RlcXVldWVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl9qb2JzX2RlcXVldWVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMjE2MlxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9qb2JzX2RvbmVfdG90YWwgVG90YWwgbnVtYmVyIG9mIHF1ZXVlIGpvYnMgZG9uZVxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9qb2JzX2RvbmVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfc2NoZWR1bGVyX2pvYnNfZG9uZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDIxNjBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfam9ic19zdWJtaXR0ZWRfdG90YWwgVG90YWwgbnVtYmVyIG9mIGpvYnMgc3VibWl0dGVkIHRvIHRoZSBzY2hlZHVsZXJcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfam9ic19zdWJtaXR0ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfc2NoZWR1bGVyX2pvYnNfc3VibWl0dGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMjE2MlxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9sb3dfcHJpb19xdWV1ZV9sYXN0X2RlcXVldWVfdGltZSBMYXN0IHJlY29yZGVkIGRlcXVldWUgdGltZSBmb3IgYSBsb3cgcHJpb3JpdHkgcXVldWUgaXRlbSBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX2xvd19wcmlvX3F1ZXVlX2xhc3RfZGVxdWV1ZV90aW1lIGdhdWdlXG5hcmFuZ29kYl9zY2hlZHVsZXJfbG93X3ByaW9fcXVldWVfbGFzdF9kZXF1ZXVlX3RpbWV7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX2xvd19wcmlvX3F1ZXVlX2xlbmd0aCBDdXJyZW50IHF1ZXVlIGxlbmd0aCBvZiB0aGUgbG93IHByaW9yaXR5IHF1ZXVlIGluIHRoZSBzY2hlZHVsZXJcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfbG93X3ByaW9fcXVldWVfbGVuZ3RoIGdhdWdlXG5hcmFuZ29kYl9zY2hlZHVsZXJfbG93X3ByaW9fcXVldWVfbGVuZ3Roe3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9tYWludGVuYW5jZV9wcmlvX3F1ZXVlX2xlbmd0aCBDdXJyZW50IHF1ZXVlIGxlbmd0aCBvZiB0aGUgbWFpbnRlbmFuY2UgcHJpb3JpdHkgcXVldWUgaW4gdGhlIHNjaGVkdWxlclxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9tYWludGVuYW5jZV9wcmlvX3F1ZXVlX2xlbmd0aCBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX21haW50ZW5hbmNlX3ByaW9fcXVldWVfbGVuZ3Roe3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9tZWRpdW1fcHJpb19xdWV1ZV9sZW5ndGggQ3VycmVudCBxdWV1ZSBsZW5ndGggb2YgdGhlIG1lZGl1bSBwcmlvcml0eSBxdWV1ZSBpbiB0aGUgc2NoZWR1bGVyXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX21lZGl1bV9wcmlvX3F1ZXVlX2xlbmd0aCBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX21lZGl1bV9wcmlvX3F1ZXVlX2xlbmd0aHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfbnVtX2F3YWtlX3RocmVhZHMgTnVtYmVyIG9mIGF3YWtlIHdvcmtlciB0aHJlYWRzXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX251bV9hd2FrZV90aHJlYWRzIGdhdWdlXG5hcmFuZ29kYl9zY2hlZHVsZXJfbnVtX2F3YWtlX3RocmVhZHN7cm9sZT1cIlNJTkdMRVwifSAyXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX251bV9kZXRhY2hlZF90aHJlYWRzIE51bWJlciBvZiBkZXRhY2hlZCB3b3JrZXIgdGhyZWFkc1xuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9udW1fZGV0YWNoZWRfdGhyZWFkcyBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX251bV9kZXRhY2hlZF90aHJlYWRze3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9udW1fd29ya2VyX3RocmVhZHMgTnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX251bV93b3JrZXJfdGhyZWFkcyBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX251bV93b3JrZXJfdGhyZWFkc3tyb2xlPVwiU0lOR0xFXCJ9IDRcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfbnVtX3dvcmtpbmdfdGhyZWFkcyBOdW1iZXIgb2Ygd29ya2luZyB0aHJlYWRzXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX251bV93b3JraW5nX3RocmVhZHMgZ2F1Z2VcbmFyYW5nb2RiX3NjaGVkdWxlcl9udW1fd29ya2luZ190aHJlYWRze3JvbGU9XCJTSU5HTEVcIn0gMlxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9vbmdvaW5nX2xvd19wcmlvIFRvdGFsIG51bWJlciBvZiBvbmdvaW5nIFJlc3RIYW5kbGVycyBjb21pbmcgZnJvbSB0aGUgbG93IHByaW8gcXVldWVcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfb25nb2luZ19sb3dfcHJpbyBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX29uZ29pbmdfbG93X3ByaW97cm9sZT1cIlNJTkdMRVwifSAyXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX2Z1bGxfZmFpbHVyZXNfdG90YWwgVGFza3MgZHJvcHBlZCBhbmQgbm90IGFkZGVkIHRvIGludGVybmFsIHF1ZXVlXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX2Z1bGxfZmFpbHVyZXNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX2Z1bGxfZmFpbHVyZXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX2xlbmd0aCBTZXJ2ZXIncyBpbnRlcm5hbCBxdWV1ZSBsZW5ndGhcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfcXVldWVfbGVuZ3RoIGdhdWdlXG5hcmFuZ29kYl9zY2hlZHVsZXJfcXVldWVfbGVuZ3Roe3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9xdWV1ZV90aW1lX3Zpb2xhdGlvbnNfdG90YWwgVGFza3MgZHJvcHBlZCBiZWNhdXNlIHRoZSBjbGllbnQtcmVxdWVzdGVkIHF1ZXVlIHRpbWUgcmVzdHJpY3Rpb24gd291bGQgYmUgdmlvbGF0ZWRcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfcXVldWVfdGltZV92aW9sYXRpb25zX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl9xdWV1ZV90aW1lX3Zpb2xhdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX3RocmVhZHNfc3RhcnRlZF90b3RhbCBOdW1iZXIgb2Ygc2NoZWR1bGVyIHRocmVhZHMgc3RhcnRlZFxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl90aHJlYWRzX3N0YXJ0ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfc2NoZWR1bGVyX3RocmVhZHNfc3RhcnRlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDRcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfdGhyZWFkc19zdG9wcGVkX3RvdGFsIE51bWJlciBvZiBzY2hlZHVsZXIgdGhyZWFkcyBzdG9wcGVkXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX3RocmVhZHNfc3RvcHBlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9zY2hlZHVsZXJfdGhyZWFkc19zdG9wcGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NlYXJjaF9jb2x1bW5zX2NhY2hlX3NpemUgQXJhbmdvU2VhcmNoIGNvbHVtbnMgY2FjaGUgdXNhZ2UgaW4gYnl0ZXNcbiMgVFlQRSBhcmFuZ29kYl9zZWFyY2hfY29sdW1uc19jYWNoZV9zaXplIGdhdWdlXG5hcmFuZ29kYl9zZWFyY2hfY29sdW1uc19jYWNoZV9zaXple3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NlYXJjaF9leGVjdXRpb25fdGhyZWFkc19kZW1hbmQgTnVtYmVyIG9mIEFyYW5nb3NlYXJjaCBwYXJhbGxlbCBleGVjdXRpb24gdGhyZWFkcyByZXF1ZXN0ZWQgYnkgcXVlcmllcy5cbiMgVFlQRSBhcmFuZ29kYl9zZWFyY2hfZXhlY3V0aW9uX3RocmVhZHNfZGVtYW5kIGdhdWdlXG5hcmFuZ29kYl9zZWFyY2hfZXhlY3V0aW9uX3RocmVhZHNfZGVtYW5ke3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NlYXJjaF9udW1fb3V0X29mX3N5bmNfbGlua3MgTnVtYmVyIG9mIGFyYW5nb3NlYXJjaCBsaW5rcy9pbmRleGVzIGN1cnJlbnRseSBvdXQgb2Ygc3luY1xuIyBUWVBFIGFyYW5nb2RiX3NlYXJjaF9udW1fb3V0X29mX3N5bmNfbGlua3MgZ2F1Z2VcbmFyYW5nb2RiX3NlYXJjaF9udW1fb3V0X29mX3N5bmNfbGlua3N7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2Fib3J0ZWRfdG90YWwgTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhYm9ydGVkXG4jIFRZUEUgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2Fib3J0ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2Fib3J0ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA3NVxuIyBIRUxQIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19jb21taXR0ZWRfdG90YWwgTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjb21taXR0ZWRcbiMgVFlQRSBhcmFuZ29kYl90cmFuc2FjdGlvbnNfY29tbWl0dGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3RyYW5zYWN0aW9uc19jb21taXR0ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxNjEwXG4jIEhFTFAgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2V4cGlyZWRfdG90YWwgVG90YWwgbnVtYmVyIG9mIGV4cGlyZWQgdHJhbnNhY3Rpb25zXG4jIFRZUEUgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2V4cGlyZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2V4cGlyZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX3N0YXJ0ZWRfdG90YWwgTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBzdGFydGVkXG4jIFRZUEUgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX3N0YXJ0ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdHJhbnNhY3Rpb25zX3N0YXJ0ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxMjk0XG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9jcmVhdGVkX3RvdGFsIFY4IGNvbnRleHRzIGNyZWF0ZWRcbiMgVFlQRSBhcmFuZ29kYl92OF9jb250ZXh0X2NyZWF0ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdjhfY29udGV4dF9jcmVhdGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gM1xuIyBIRUxQIGFyYW5nb2RiX3Y4X2NvbnRleHRfY3JlYXRpb25fdGltZV9tc2VjX3RvdGFsIFRvdGFsIHRpbWUgZm9yIGNyZWF0aW5nIFY4IGNvbnRleHRzIFttc11cbiMgVFlQRSBhcmFuZ29kYl92OF9jb250ZXh0X2NyZWF0aW9uX3RpbWVfbXNlY190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl92OF9jb250ZXh0X2NyZWF0aW9uX3RpbWVfbXNlY190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDEzXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9kZXN0cm95ZWRfdG90YWwgVjggY29udGV4dHMgZGVzdHJveWVkXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9kZXN0cm95ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdjhfY29udGV4dF9kZXN0cm95ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9lbnRlcl9mYWlsdXJlc190b3RhbCBWOCBjb250ZXh0IGVudGVyIGZhaWx1cmVzXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9lbnRlcl9mYWlsdXJlc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl92OF9jb250ZXh0X2VudGVyX2ZhaWx1cmVzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3Y4X2NvbnRleHRfZW50ZXJlZF90b3RhbCBWOCBjb250ZXh0IGVudGVyIGV2ZW50c1xuIyBUWVBFIGFyYW5nb2RiX3Y4X2NvbnRleHRfZW50ZXJlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl92OF9jb250ZXh0X2VudGVyZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA1N1xuIyBIRUxQIGFyYW5nb2RiX3Y4X2NvbnRleHRfZXhpdGVkX3RvdGFsIFY4IGNvbnRleHQgZXhpdCBldmVudHNcbiMgVFlQRSBhcmFuZ29kYl92OF9jb250ZXh0X2V4aXRlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl92OF9jb250ZXh0X2V4aXRlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDU1XG4jIEhFTFAgYXJhbmdvZGJfdnN0X2Nvbm5lY3Rpb25zX3RvdGFsIFRvdGFsIG51bWJlciBvZiBWU1QgY29ubmVjdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl92c3RfY29ubmVjdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdnN0X2Nvbm5lY3Rpb25zX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIHJvY2tzZGJfYXJjaGl2ZWRfd2FsX2ZpbGVzIE51bWJlciBvZiBhcmNoaXZlZCBSb2Nrc0RCIFdBTCBmaWxlc1xuIyBUWVBFIHJvY2tzZGJfYXJjaGl2ZWRfd2FsX2ZpbGVzIGdhdWdlXG5yb2Nrc2RiX2FyY2hpdmVkX3dhbF9maWxlc3tyb2xlPVwiU0lOR0xFXCJ9IDEyXG4jIEhFTFAgcm9ja3NkYl9hcmNoaXZlZF93YWxfZmlsZXNfc2l6ZSBDdW11bGF0ZWQgc2l6ZSBvZiBhcmNoaXZlZCBSb2Nrc0RCIFdBTCBmaWxlc1xuIyBUWVBFIHJvY2tzZGJfYXJjaGl2ZWRfd2FsX2ZpbGVzX3NpemUgZ2F1Z2VcbnJvY2tzZGJfYXJjaGl2ZWRfd2FsX2ZpbGVzX3NpemV7cm9sZT1cIlNJTkdMRVwifSA4MDEzMDUyXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9hdXRvX3JlZmlsbF9kcm9wcGVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBkcm9wcGVkIGl0ZW1zIGZvciBpbi1tZW1vcnkgY2FjaGUgcmVmaWxsaW5nXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9hdXRvX3JlZmlsbF9kcm9wcGVkX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfYXV0b19yZWZpbGxfZHJvcHBlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2F1dG9fcmVmaWxsX2xvYWRlZF90b3RhbCBUb3RhbCBudW1iZXIgb2YgYXV0by1yZWZpbGxlZCBpbi1tZW1vcnkgY2FjaGUgaXRlbXNcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2F1dG9fcmVmaWxsX2xvYWRlZF90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX2F1dG9fcmVmaWxsX2xvYWRlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2VkZ2VfY29tcHJlc3NlZF9pbnNlcnRzX3RvdGFsIE51bWJlciBvZiBjb21wcmVzc2VkIGluc2VydHMgaW50byB0aGUgZWRnZSBjYWNoZVxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZWRnZV9jb21wcmVzc2VkX2luc2VydHNfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9lZGdlX2NvbXByZXNzZWRfaW5zZXJ0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2VkZ2VfZW1wdHlfaW5zZXJ0c190b3RhbCBOdW1iZXIgb2YgaW5zZXJ0cyBpbnRvIHRoZSBlZGdlIGNhY2hlIHRoYXQgd2VyZSBhbiBlbXB0eSBhcnJheVxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZWRnZV9lbXB0eV9pbnNlcnRzX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfZWRnZV9lbXB0eV9pbnNlcnRzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gM1xuIyBIRUxQIHJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX2VmZmVjdGl2ZV9lbnRyaWVzX3NpemVfdG90YWwgVG90YWwgZWZmZWN0aXZlIG1lbW9yeSBzaXplIG9mIGFsbCBlZGdlIGNhY2hlIGVudHJpZXMgZXZlciBzdG9yZWQgaW4gbWVtb3J5IChhZnRlciBjb21wcmVzc2lvbilcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2VkZ2VfaW5zZXJ0c19lZmZlY3RpdmVfZW50cmllc19zaXplX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX2VmZmVjdGl2ZV9lbnRyaWVzX3NpemVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAyOTVcbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2VkZ2VfaW5zZXJ0c190b3RhbCBOdW1iZXIgb2YgaW5zZXJ0cyBpbnRvIHRoZSBlZGdlIGNhY2hlXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9lZGdlX2luc2VydHNfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9lZGdlX2luc2VydHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA4XG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9lZGdlX2luc2VydHNfdW5jb21wcmVzc2VkX2VudHJpZXNfc2l6ZV90b3RhbCBUb3RhbCBncm9zcyBtZW1vcnkgc2l6ZSBvZiBhbGwgZWRnZSBjYWNoZSBlbnRyaWVzIGV2ZXIgc3RvcmVkIGluIG1lbW9yeVxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX3VuY29tcHJlc3NlZF9lbnRyaWVzX3NpemVfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9lZGdlX2luc2VydHNfdW5jb21wcmVzc2VkX2VudHJpZXNfc2l6ZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDI5NVxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfZnVsbF9pbmRleF9yZWZpbGxzX3RvdGFsIFRvdGFsIG51bWJlciBvZiBjb21wbGV0ZWQgZnVsbCBpbmRleCBjYWNoZSByZWZpbGxzXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9mdWxsX2luZGV4X3JlZmlsbHNfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9mdWxsX2luZGV4X3JlZmlsbHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgcm9ja3NkYl9saXZlX3dhbF9maWxlcyBOdW1iZXIgb2YgbGl2ZSBSb2Nrc0RCIFdBTCBmaWxlc1xuIyBUWVBFIHJvY2tzZGJfbGl2ZV93YWxfZmlsZXMgZ2F1Z2VcbnJvY2tzZGJfbGl2ZV93YWxfZmlsZXN7cm9sZT1cIlNJTkdMRVwifSAxXG4jIEhFTFAgcm9ja3NkYl9saXZlX3dhbF9maWxlc19zaXplIEN1bXVsYXRlZCBzaXplIG9mIGxpdmUgUm9ja3NEQiBXQUwgZmlsZXNcbiMgVFlQRSByb2Nrc2RiX2xpdmVfd2FsX2ZpbGVzX3NpemUgZ2F1Z2VcbnJvY2tzZGJfbGl2ZV93YWxfZmlsZXNfc2l6ZXtyb2xlPVwiU0lOR0xFXCJ9IDQxMjQzOVxuIyBIRUxQIHJvY2tzZGJfcHJ1bmFibGVfd2FsX2ZpbGVzIE51bWJlciBvZiBwcnVuYWJsZSBSb2Nrc0RCIFdBTCBmaWxlc1xuIyBUWVBFIHJvY2tzZGJfcHJ1bmFibGVfd2FsX2ZpbGVzIGdhdWdlXG5yb2Nrc2RiX3BydW5hYmxlX3dhbF9maWxlc3tyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCByb2Nrc2RiX3dhbF9wcnVuaW5nX2FjdGl2ZSBXaGV0aGVyIG9yIG5vdCBSb2Nrc0RCIFdBTCBmaWxlIHBydW5pbmcgaXMgYWN0aXZlXG4jIFRZUEUgcm9ja3NkYl93YWxfcHJ1bmluZ19hY3RpdmUgZ2F1Z2VcbnJvY2tzZGJfd2FsX3BydW5pbmdfYWN0aXZle3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIHJvY2tzZGJfd2FsX3JlbGVhc2VkX3RpY2tfZmx1c2ggUmVsZWFzZWQgdGljayBmb3IgUm9ja3NEQiBXQUwgZGVsZXRpb24gKGZsdXNoLWluZHVjZWQpXG4jIFRZUEUgcm9ja3NkYl93YWxfcmVsZWFzZWRfdGlja19mbHVzaCBnYXVnZVxucm9ja3NkYl93YWxfcmVsZWFzZWRfdGlja19mbHVzaHtyb2xlPVwiU0lOR0xFXCJ9IDE4NjE5OFxuIyBIRUxQIHJvY2tzZGJfd2FsX3JlbGVhc2VkX3RpY2tfcmVwbGljYXRpb24gUmVsZWFzZWQgdGljayBmb3IgUm9ja3NEQiBXQUwgZGVsZXRpb24gKHJlcGxpY2F0aW9uLWluZHVjZWQpXG4jIFRZUEUgcm9ja3NkYl93YWxfcmVsZWFzZWRfdGlja19yZXBsaWNhdGlvbiBnYXVnZVxucm9ja3NkYl93YWxfcmVsZWFzZWRfdGlja19yZXBsaWNhdGlvbntyb2xlPVwiU0lOR0xFXCJ9IDE4NjIxM1xuIyBIRUxQIHJvY2tzZGJfd2FsX3NlcXVlbmNlX2xvd2VyX2JvdW5kIFJvY2tzREIgV0FMIHNlcXVlbmNlIG51bWJlciB1bnRpbCB3aGljaCBiYWNrZ3JvdW5kIHRocmVhZCBoYXMgY2F1Z2h0IHVwXG4jIFRZUEUgcm9ja3NkYl93YWxfc2VxdWVuY2VfbG93ZXJfYm91bmQgZ2F1Z2VcbnJvY2tzZGJfd2FsX3NlcXVlbmNlX2xvd2VyX2JvdW5ke3JvbGU9XCJTSU5HTEVcIn0gMTgwNzQ2XG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX21pbm9yX3BhZ2VfZmF1bHRzX3RvdGFsIFRoZSBudW1iZXIgb2YgbWlub3IgZmF1bHRzIHRoZSBwcm9jZXNzIGhhcyBtYWRlIHdoaWNoIGhhdmUgbm90IHJlcXVpcmVkIGxvYWRpbmcgYSBtZW1vcnkgcGFnZSBmcm9tIGRpc2suIFRoaXMgZmlndXJlIGlzIG5vdCByZXBvcnRlZCBvbiBXaW5kb3dzXG4jIFRZUEUgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX21pbm9yX3BhZ2VfZmF1bHRzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19taW5vcl9wYWdlX2ZhdWx0c190b3RhbHt9IDE1MzI4OVxuIyBIRUxQIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19tYWpvcl9wYWdlX2ZhdWx0c190b3RhbCBPbiBXaW5kb3dzLCB0aGlzIGZpZ3VyZSBjb250YWlucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzLiBPbiBvdGhlciBzeXN0ZW0sIHRoaXMgZmlndXJlIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgbWFqb3IgZmF1bHRzIHRoZSBwcm9jZXNzIGhhcyBtYWRlIHdoaWNoIGhhdmUgcmVxdWlyZWQgbG9hZGluZyBhIG1lbW9yeSBwYWdlIGZyb20gZGlza1xuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19tYWpvcl9wYWdlX2ZhdWx0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfbWFqb3JfcGFnZV9mYXVsdHNfdG90YWx7fSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3VzZXJfdGltZSBBbW91bnQgb2YgdGltZSB0aGF0IHRoaXMgcHJvY2VzcyBoYXMgYmVlbiBzY2hlZHVsZWQgaW4gdXNlciBtb2RlLCBtZWFzdXJlZCBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3VzZXJfdGltZSBnYXVnZVxuYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3VzZXJfdGltZXt9IDUuMjAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3N5c3RlbV90aW1lIEFtb3VudCBvZiB0aW1lIHRoYXQgdGhpcyBwcm9jZXNzIGhhcyBiZWVuIHNjaGVkdWxlZCBpbiBrZXJuZWwgbW9kZSwgbWVhc3VyZWQgaW4gc2Vjb25kc1xuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19zeXN0ZW1fdGltZSBnYXVnZVxuYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3N5c3RlbV90aW1le30gMS43MDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfbnVtYmVyX29mX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIGFyYW5nb2QgcHJvY2Vzc1xuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19udW1iZXJfb2ZfdGhyZWFkcyBnYXVnZVxuYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX251bWJlcl9vZl90aHJlYWRze30gNjNcbiMgSEVMUCBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfcmVzaWRlbnRfc2V0X3NpemUgVGhlIHRvdGFsIHNpemUgb2YgdGhlIG51bWJlciBvZiBwYWdlcyB0aGUgcHJvY2VzcyBoYXMgaW4gcmVhbCBtZW1vcnkuIFRoaXMgaXMganVzdCB0aGUgcGFnZXMgd2hpY2ggY291bnQgdG93YXJkIHRleHQsIGRhdGEsIG9yIHN0YWNrIHNwYWNlLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcGFnZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBkZW1hbmQtbG9hZGVkIGluLCBvciB3aGljaCBhcmUgc3dhcHBlZCBvdXQuIFRoZSByZXNpZGVudCBzZXQgc2l6ZSBpcyByZXBvcnRlZCBpbiBieXRlc1xuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19yZXNpZGVudF9zZXRfc2l6ZSBnYXVnZVxuYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3Jlc2lkZW50X3NldF9zaXple30gMjk5MTA2MzA0XG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3Jlc2lkZW50X3NldF9zaXplX3BlcmNlbnQgVGhlIHJlbGF0aXZlIHNpemUgb2YgdGhlIG51bWJlciBvZiBwYWdlcyB0aGUgcHJvY2VzcyBoYXMgaW4gcmVhbCBtZW1vcnkgY29tcGFyZWQgdG8gc3lzdGVtIG1lbW9yeS4gVGhpcyBpcyBqdXN0IHRoZSBwYWdlcyB3aGljaCBjb3VudCB0b3dhcmQgdGV4dCwgZGF0YSwgb3Igc3RhY2sgc3BhY2UuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBwYWdlcyB3aGljaCBoYXZlIG5vdCBiZWVuIGRlbWFuZC1sb2FkZWQgaW4sIG9yIHdoaWNoIGFyZSBzd2FwcGVkIG91dC4gVGhlIHZhbHVlIGlzIGEgcmF0aW8gYmV0d2VlbiAwLjAwIGFuZCAxLjAwXG4jIFRZUEUgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3Jlc2lkZW50X3NldF9zaXplX3BlcmNlbnQgZ2F1Z2VcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19yZXNpZGVudF9zZXRfc2l6ZV9wZXJjZW50e30gMC4wMDkwMzlcbiMgSEVMUCBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfdmlydHVhbF9tZW1vcnlfc2l6ZSBPbiBXaW5kb3dzLCB0aGlzIGZpZ3VyZSBjb250YWlucyB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHRoZSBtZW1vcnkgbWFuYWdlciBoYXMgY29tbWl0dGVkIGZvciB0aGUgYXJhbmdvZCBwcm9jZXNzLiBPbiBvdGhlciBzeXN0ZW1zLCB0aGlzIGZpZ3VyZSBjb250YWlucyBUaGUgc2l6ZSBvZiB0aGUgdmlydHVhbCBtZW1vcnkgdGhlIHByb2Nlc3MgaXMgdXNpbmdcbiMgVFlQRSBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfdmlydHVhbF9tZW1vcnlfc2l6ZSBnYXVnZVxuYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3ZpcnR1YWxfbWVtb3J5X3NpemV7fSAxNTU0OTkzMTUyXG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfcGh5c2ljYWxfbWVtb3J5IFBoeXNpY2FsIG1lbW9yeSBpbiBieXRlc1xuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3BoeXNpY2FsX21lbW9yeSBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfcGh5c2ljYWxfbWVtb3J5e30gMzMwODk3NTMwODhcbiMgSEVMUCBhcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19zZXJ2ZXJfdXB0aW1lX3RvdGFsIE51bWJlciBvZiBzZWNvbmRzIGVsYXBzZWQgc2luY2Ugc2VydmVyIHN0YXJ0XG4jIFRZUEUgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3Nfc2VydmVyX3VwdGltZV90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19zZXJ2ZXJfdXB0aW1lX3RvdGFse30gNDMuNTEwNzUwXG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfY3B1X2NvcmVzIE51bWJlciBvZiBDUFUgY29yZXMgdmlzaWJsZSB0byB0aGUgYXJhbmdvZCBwcm9jZXNzXG4jIFRZUEUgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfY3B1X2NvcmVzIGdhdWdlXG5hcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19jcHVfY29yZXN7fSA4XG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfdXNlcl9wZXJjZW50IFBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBzeXN0ZW0gQ1BVcyBoYXZlIHNwZW50IGluIHVzZXIgbW9kZVxuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3VzZXJfcGVyY2VudCBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfdXNlcl9wZXJjZW50e30gNi42NDc3MzdcbiMgSEVMUCBhcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19zeXN0ZW1fcGVyY2VudCBQZXJjZW50YWdlIG9mIHRpbWUgdGhhdCB0aGUgc3lzdGVtIENQVXMgaGF2ZSBzcGVudCBpbiBrZXJuZWwgbW9kZVxuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3N5c3RlbV9wZXJjZW50IGdhdWdlXG5hcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19zeXN0ZW1fcGVyY2VudHt9IDMuNDAwNjU5XG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaWRsZV9wZXJjZW50IFBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBzeXN0ZW0gQ1BVcyBoYXZlIGJlZW4gaWRsZVxuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX2lkbGVfcGVyY2VudCBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaWRsZV9wZXJjZW50e30gODguNTAyNDA2XG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaW93YWl0X3BlcmNlbnQgUGVyY2VudGFnZSBvZiB0aW1lIHRoYXQgdGhlIHN5c3RlbSBDUFVzIGhhdmUgYmVlbiB3YWl0aW5nIGZvciBJL09cbiMgVFlQRSBhcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19pb3dhaXRfcGVyY2VudCBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaW93YWl0X3BlcmNlbnR7fSAxLjI5NTE3MFxuIyBIRUxQIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY2xpZW50X2Nvbm5lY3Rpb25zIFRoZSBudW1iZXIgb2YgY2xpZW50IGNvbm5lY3Rpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBvcGVuXG4jIFRZUEUgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jbGllbnRfY29ubmVjdGlvbnMgZ2F1Z2VcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY2xpZW50X2Nvbm5lY3Rpb25ze30gMVxuIyBIRUxQIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY29ubmVjdGlvbl90aW1lIFRvdGFsIGNvbm5lY3Rpb24gdGltZSBvZiBhIGNsaWVudFxuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY29ubmVjdGlvbl90aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jb25uZWN0aW9uX3RpbWVfYnVja2V0e2xlPVwiMC4wMVwifSAwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2Nvbm5lY3Rpb25fdGltZV9idWNrZXR7bGU9XCIxLjBcIn0gMFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jb25uZWN0aW9uX3RpbWVfYnVja2V0e2xlPVwiNjAuMFwifSAwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2Nvbm5lY3Rpb25fdGltZV9idWNrZXR7bGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY29ubmVjdGlvbl90aW1lX2NvdW50e30gMFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jb25uZWN0aW9uX3RpbWVfc3Vte30gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWUgVG90YWwgdGltZSBuZWVkZWQgdG8gYW5zd2VyIGEgcmVxdWVzdFxuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIwLjAxXCJ9IDE1NDlcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIwLjA1XCJ9IDE1NTdcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIwLjFcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc190b3RhbF90aW1lX2J1Y2tldHtsZT1cIjAuMlwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiMC41XCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIxLjBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc190b3RhbF90aW1lX2J1Y2tldHtsZT1cIjUuMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiMTUuMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiMzAuMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiK0luZlwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfY291bnR7fSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfc3Vte30gMC43OTc5NTBcbiMgSEVMUCBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZSBSZXF1ZXN0IHRpbWUgbmVlZGVkIHRvIGFuc3dlciBhIHJlcXVlc3RcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2J1Y2tldHtsZT1cIjAuMDFcIn0gMTU1MlxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiMC4wNVwifSAxNTU4XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZV9idWNrZXR7bGU9XCIwLjFcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiMC4yXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2J1Y2tldHtsZT1cIjAuNVwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZV9idWNrZXR7bGU9XCIxLjBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiNS4wXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2J1Y2tldHtsZT1cIjE1LjBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiMzAuMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZV9idWNrZXR7bGU9XCIrSW5mXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2NvdW50e30gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfc3Vte30gMC41NjMxNzlcbiMgSEVMUCBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3F1ZXVlX3RpbWUgUmVxdWVzdCB0aW1lIG5lZWRlZCB0byBhbnN3ZXIgYSByZXF1ZXN0XG4jIFRZUEUgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjAuMDFcIn0gMTU1N1xuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjAuMDVcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjAuMVwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3F1ZXVlX3RpbWVfYnVja2V0e2xlPVwiMC4yXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIwLjVcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjEuMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3F1ZXVlX3RpbWVfYnVja2V0e2xlPVwiNS4wXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIxNS4wXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIzMC4wXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIrSW5mXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9jb3VudHt9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9zdW17fSAwLjE1MjczM1xuIyBIRUxQIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfaW9fdGltZSBSZXF1ZXN0IHRpbWUgbmVlZGVkIHRvIGFuc3dlciBhIHJlcXVlc3RcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWUgaGlzdG9ncmFtXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMC4wMVwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMC4wNVwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMC4xXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfaW9fdGltZV9idWNrZXR7bGU9XCIwLjJcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIjAuNVwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMS4wXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfaW9fdGltZV9idWNrZXR7bGU9XCI1LjBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIjE1LjBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIjMwLjBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIitJbmZcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2NvdW50e30gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX3N1bXt9IDAuMDgyMDM4XG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50IEJ5dGVzIHNlbnQgZm9yIHJlc3BvbnNlc1xuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudCBoaXN0b2dyYW1cbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9idWNrZXR7bGU9XCIyNTBcIn0gNlxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDBcIn0gMTQzN1xuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjIwMDBcIn0gMTQ0M1xuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjUwMDBcIn0gMTU1OFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDAwXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9idWNrZXR7bGU9XCIrSW5mXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9jb3VudHt9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9zdW17fSAxMTQwNTI2XG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZCBCeXRlcyByZWNlaXZlZCBmb3IgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkIGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIyNTBcIn0gMTAyNVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfYnVja2V0e2xlPVwiMjAwMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkX2J1Y2tldHtsZT1cIjUwMDBcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkX2J1Y2tldHtsZT1cIitJbmZcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9jb3VudHt9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfc3Vte30gMzYzMTQwXG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnQgQnl0ZXMgc2VudCBmb3IgcmVzcG9uc2VzLCBvbmx5IHVzZXIgdHJhZmZpY1xuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50IGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnRfYnVja2V0e2xlPVwiMjUwXCJ9IDZcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDBcIn0gMTQzN1xuYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnRfYnVja2V0e2xlPVwiMjAwMFwifSAxNDQzXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9idWNrZXR7bGU9XCI1MDAwXCJ9IDE1NThcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDAwXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIitJbmZcIn0gMTU2MFxuYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnRfY291bnR7fSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9zdW17fSAxMTQwNTI2XG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkIEJ5dGVzIHJlY2VpdmVkIGZvciByZXF1ZXN0cywgb25seSB1c2VyIHRyYWZmaWNcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWQgaGlzdG9ncmFtXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfYnVja2V0e2xlPVwiMjUwXCJ9IDEwMjVcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIyMDAwXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCI1MDAwXCJ9IDE1NjBcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwMFwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfYnVja2V0e2xlPVwiK0luZlwifSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfY291bnR7fSAxNTYwXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfc3Vte30gMzYzMTQwXG4jIEhFTFAgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfYXN5bmNfcmVxdWVzdHNfdG90YWwgTnVtYmVyIG9mIGFzeW5jaHJvbm91c2x5IGV4ZWN1dGVkIEhUVFAgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19hc3luY19yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19hc3luY19yZXF1ZXN0c190b3RhbHt9IDZcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2RlbGV0ZV9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBERUxFVEUgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2RlbGV0ZV9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2RlbGV0ZV9yZXF1ZXN0c190b3RhbHt9IDEwNlxuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfZ2V0X3JlcXVlc3RzX3RvdGFsIE51bWJlciBvZiBIVFRQIEdFVCByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfZ2V0X3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfZ2V0X3JlcXVlc3RzX3RvdGFse30gMzk3XG4jIEhFTFAgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9oZWFkX3JlcXVlc3RzX3RvdGFsIE51bWJlciBvZiBIVFRQIEhFQUQgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2hlYWRfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9oZWFkX3JlcXVlc3RzX3RvdGFse30gMFxuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfb3B0aW9uc19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBPUFRJT05TIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9vcHRpb25zX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfb3B0aW9uc19yZXF1ZXN0c190b3RhbHt9IDBcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3BhdGNoX3JlcXVlc3RzX3RvdGFsIE51bWJlciBvZiBIVFRQIFBBVENIIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9wYXRjaF9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3BhdGNoX3JlcXVlc3RzX3RvdGFse30gM1xuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfcG9zdF9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBQT1NUIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9wb3N0X3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfcG9zdF9yZXF1ZXN0c190b3RhbHt9IDEwMjdcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3B1dF9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBQVVQgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3B1dF9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3B1dF9yZXF1ZXN0c190b3RhbHt9IDI3XG4jIEhFTFAgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3Nfb3RoZXJfaHR0cF9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2Ygb3RoZXIgSFRUUCByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX290aGVyX2h0dHBfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3Nfb3RoZXJfaHR0cF9yZXF1ZXN0c190b3RhbHt9IDBcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc190b3RhbF9yZXF1ZXN0c190b3RhbCBUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3RvdGFsX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3RvdGFsX3JlcXVlc3RzX3RvdGFse30gMTU2MFxuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3N1cGVydXNlcl9yZXF1ZXN0c190b3RhbCBUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cyBleGVjdXRlZCBieSBzdXBlcnVzZXIvSldUXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3Nfc3VwZXJ1c2VyX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3N1cGVydXNlcl9yZXF1ZXN0c190b3RhbHt9IDBcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc191c2VyX3JlcXVlc3RzX3RvdGFsIFRvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzIGV4ZWN1dGVkIGJ5IGNsaWVudHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc191c2VyX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3VzZXJfcmVxdWVzdHNfdG90YWx7fSAxNTYwXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9hbGl2ZSBOdW1iZXIgb2YgVjggY29udGV4dHMgY3VycmVudGx5IGFsaXZlXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9hbGl2ZSBnYXVnZVxuYXJhbmdvZGJfdjhfY29udGV4dF9hbGl2ZXt9IDNcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2J1c3kgTnVtYmVyIG9mIFY4IGNvbnRleHRzIGN1cnJlbnRseSBidXN5XG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9idXN5IGdhdWdlXG5hcmFuZ29kYl92OF9jb250ZXh0X2J1c3l7fSAyXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9kaXJ0eSBOdW1iZXIgb2YgVjggY29udGV4dHMgY3VycmVudGx5IGRpcnR5XG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9kaXJ0eSBnYXVnZVxuYXJhbmdvZGJfdjhfY29udGV4dF9kaXJ0eXt9IDBcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2ZyZWUgTnVtYmVyIG9mIFY4IGNvbnRleHRzIGN1cnJlbnRseSBmcmVlXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9mcmVlIGdhdWdlXG5hcmFuZ29kYl92OF9jb250ZXh0X2ZyZWV7fSAxXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9taW4gTWluaW11bSBudW1iZXIgb2YgY29uY3VycmVudCBWOCBjb250ZXh0c1xuIyBUWVBFIGFyYW5nb2RiX3Y4X2NvbnRleHRfbWluIGdhdWdlXG5hcmFuZ29kYl92OF9jb250ZXh0X21pbnt9IDFcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X21heCBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IFY4IGNvbnRleHRzXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9tYXggZ2F1Z2VcbmFyYW5nb2RiX3Y4X2NvbnRleHRfbWF4e30gMjhcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfYWN0aXZlX3RhYmxlcyByb2Nrc2RiX2NhY2hlX2FjdGl2ZV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2FjdGl2ZV90YWJsZXMgZ2F1Z2VcbnJvY2tzZGJfY2FjaGVfYWN0aXZlX3RhYmxlcyAwXG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2FsbG9jYXRlZCByb2Nrc2RiX2NhY2hlX2FsbG9jYXRlZFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfYWxsb2NhdGVkIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX2FsbG9jYXRlZCAxMzQ3MTA0XG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2VkZ2VfY29tcHJlc3Npb25fcmF0aW8gcm9ja3NkYl9jYWNoZV9lZGdlX2NvbXByZXNzaW9uX3JhdGlvXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9lZGdlX2NvbXByZXNzaW9uX3JhdGlvIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX2VkZ2VfY29tcHJlc3Npb25fcmF0aW8gMFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc19kdXJhdGlvbl90b3RhbCByb2Nrc2RiX2NhY2hlX2ZyZWVfbWVtb3J5X3Rhc2tzX2R1cmF0aW9uX3RvdGFsXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc19kdXJhdGlvbl90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX2ZyZWVfbWVtb3J5X3Rhc2tzX2R1cmF0aW9uX3RvdGFsIDBcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfZnJlZV9tZW1vcnlfdGFza3NfdG90YWwgcm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc190b3RhbFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZnJlZV9tZW1vcnlfdGFza3NfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc190b3RhbCAwXG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2hpdF9yYXRlX2xpZmV0aW1lIHJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfbGlmZXRpbWVcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2hpdF9yYXRlX2xpZmV0aW1lIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX2hpdF9yYXRlX2xpZmV0aW1lIDBcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfcmVjZW50IHJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfcmVjZW50XG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9oaXRfcmF0ZV9yZWNlbnQgZ2F1Z2VcbnJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfcmVjZW50IDBcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfbGltaXQgcm9ja3NkYl9jYWNoZV9saW1pdFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfbGltaXQgZ2F1Z2VcbnJvY2tzZGJfY2FjaGVfbGltaXQgNzczNTU2NzM2MFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9taWdyYXRlX3Rhc2tzX2R1cmF0aW9uX3RvdGFsIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc19kdXJhdGlvbl90b3RhbFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc19kdXJhdGlvbl90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX21pZ3JhdGVfdGFza3NfZHVyYXRpb25fdG90YWwgMFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9taWdyYXRlX3Rhc2tzX3RvdGFsIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc190b3RhbFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc190b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX21pZ3JhdGVfdGFza3NfdG90YWwgMFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9wZWFrX2FsbG9jYXRlZCByb2Nrc2RiX2NhY2hlX3BlYWtfYWxsb2NhdGVkXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9wZWFrX2FsbG9jYXRlZCBnYXVnZVxucm9ja3NkYl9jYWNoZV9wZWFrX2FsbG9jYXRlZCAxMzk2NjY0XG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX3VudXNlZF9tZW1vcnkgcm9ja3NkYl9jYWNoZV91bnVzZWRfbWVtb3J5XG4jIFRZUEUgcm9ja3NkYl9jYWNoZV91bnVzZWRfbWVtb3J5IGdhdWdlXG5yb2Nrc2RiX2NhY2hlX3VudXNlZF9tZW1vcnkgMjY0MjU2XG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX3VudXNlZF90YWJsZXMgcm9ja3NkYl9jYWNoZV91bnVzZWRfdGFibGVzXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV91bnVzZWRfdGFibGVzIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX3VudXNlZF90YWJsZXMgOFxuXG4jIEhFTFAgcm9ja3NkYl9hY3R1YWxfZGVsYXllZF93cml0ZV9yYXRlIHJvY2tzZGJfYWN0dWFsX2RlbGF5ZWRfd3JpdGVfcmF0ZVxuIyBUWVBFIHJvY2tzZGJfYWN0dWFsX2RlbGF5ZWRfd3JpdGVfcmF0ZSBnYXVnZVxucm9ja3NkYl9hY3R1YWxfZGVsYXllZF93cml0ZV9yYXRlIDBcblxuIyBIRUxQIHJvY2tzZGJfYmFja2dyb3VuZF9lcnJvcnMgcm9ja3NkYl9iYWNrZ3JvdW5kX2Vycm9yc1xuIyBUWVBFIHJvY2tzZGJfYmFja2dyb3VuZF9lcnJvcnMgZ2F1Z2VcbnJvY2tzZGJfYmFja2dyb3VuZF9lcnJvcnMgMFxuXG4jIEhFTFAgcm9ja3NkYl9iYXNlX2xldmVsIHJvY2tzZGJfYmFzZV9sZXZlbFxuIyBUWVBFIHJvY2tzZGJfYmFzZV9sZXZlbCBnYXVnZVxucm9ja3NkYl9iYXNlX2xldmVsIDZcblxuIyBIRUxQIHJvY2tzZGJfYmxvY2tfY2FjaGVfY2FwYWNpdHkgcm9ja3NkYl9ibG9ja19jYWNoZV9jYXBhY2l0eVxuIyBUWVBFIHJvY2tzZGJfYmxvY2tfY2FjaGVfY2FwYWNpdHkgZ2F1Z2VcbnJvY2tzZGJfYmxvY2tfY2FjaGVfY2FwYWNpdHkgOTI4MjY4MDgzMlxuXG4jIEhFTFAgcm9ja3NkYl9ibG9ja19jYWNoZV9waW5uZWRfdXNhZ2Ugcm9ja3NkYl9ibG9ja19jYWNoZV9waW5uZWRfdXNhZ2VcbiMgVFlQRSByb2Nrc2RiX2Jsb2NrX2NhY2hlX3Bpbm5lZF91c2FnZSBnYXVnZVxucm9ja3NkYl9ibG9ja19jYWNoZV9waW5uZWRfdXNhZ2UgOTZcblxuIyBIRUxQIHJvY2tzZGJfYmxvY2tfY2FjaGVfdXNhZ2Ugcm9ja3NkYl9ibG9ja19jYWNoZV91c2FnZVxuIyBUWVBFIHJvY2tzZGJfYmxvY2tfY2FjaGVfdXNhZ2UgZ2F1Z2VcbnJvY2tzZGJfYmxvY2tfY2FjaGVfdXNhZ2UgMTQ2ODMyXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXBhY3Rpb25fcGVuZGluZyByb2Nrc2RiX2NvbXBhY3Rpb25fcGVuZGluZ1xuIyBUWVBFIHJvY2tzZGJfY29tcGFjdGlvbl9wZW5kaW5nIGdhdWdlXG5yb2Nrc2RiX2NvbXBhY3Rpb25fcGVuZGluZyAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMFxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwwIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMCAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMSByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMVxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwxIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMSAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMiByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMlxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwyIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMiAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMyByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsM1xuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwzIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMyAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNFxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWw0IGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNCAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNSByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNVxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWw1IGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNSAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNiByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNlxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWw2IGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNiAxXG5cbiMgSEVMUCByb2Nrc2RiX2N1cl9zaXplX2FjdGl2ZV9tZW1fdGFibGUgcm9ja3NkYl9jdXJfc2l6ZV9hY3RpdmVfbWVtX3RhYmxlXG4jIFRZUEUgcm9ja3NkYl9jdXJfc2l6ZV9hY3RpdmVfbWVtX3RhYmxlIGdhdWdlXG5yb2Nrc2RiX2N1cl9zaXplX2FjdGl2ZV9tZW1fdGFibGUgNjM5ODE1NjhcblxuIyBIRUxQIHJvY2tzZGJfY3VyX3NpemVfYWxsX21lbV90YWJsZXMgcm9ja3NkYl9jdXJfc2l6ZV9hbGxfbWVtX3RhYmxlc1xuIyBUWVBFIHJvY2tzZGJfY3VyX3NpemVfYWxsX21lbV90YWJsZXMgZ2F1Z2VcbnJvY2tzZGJfY3VyX3NpemVfYWxsX21lbV90YWJsZXMgNjM5ODE1NjhcblxuIyBIRUxQIHJvY2tzZGJfZXN0aW1hdGVfbGl2ZV9kYXRhX3NpemUgcm9ja3NkYl9lc3RpbWF0ZV9saXZlX2RhdGFfc2l6ZVxuIyBUWVBFIHJvY2tzZGJfZXN0aW1hdGVfbGl2ZV9kYXRhX3NpemUgZ2F1Z2VcbnJvY2tzZGJfZXN0aW1hdGVfbGl2ZV9kYXRhX3NpemUgMTEwNzQ4XG5cbiMgSEVMUCByb2Nrc2RiX2VzdGltYXRlX251bV9rZXlzIHJvY2tzZGJfZXN0aW1hdGVfbnVtX2tleXNcbiMgVFlQRSByb2Nrc2RiX2VzdGltYXRlX251bV9rZXlzIGdhdWdlXG5yb2Nrc2RiX2VzdGltYXRlX251bV9rZXlzIDIyMjJcblxuIyBIRUxQIHJvY2tzZGJfZXN0aW1hdGVfcGVuZGluZ19jb21wYWN0aW9uX2J5dGVzIHJvY2tzZGJfZXN0aW1hdGVfcGVuZGluZ19jb21wYWN0aW9uX2J5dGVzXG4jIFRZUEUgcm9ja3NkYl9lc3RpbWF0ZV9wZW5kaW5nX2NvbXBhY3Rpb25fYnl0ZXMgZ2F1Z2VcbnJvY2tzZGJfZXN0aW1hdGVfcGVuZGluZ19jb21wYWN0aW9uX2J5dGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfZXN0aW1hdGVfdGFibGVfcmVhZGVyc19tZW0gcm9ja3NkYl9lc3RpbWF0ZV90YWJsZV9yZWFkZXJzX21lbVxuIyBUWVBFIHJvY2tzZGJfZXN0aW1hdGVfdGFibGVfcmVhZGVyc19tZW0gZ2F1Z2VcbnJvY2tzZGJfZXN0aW1hdGVfdGFibGVfcmVhZGVyc19tZW0gMTM2MDhcblxuIyBIRUxQIHJvY2tzZGJfZnJlZV9kaXNrX3NwYWNlIHJvY2tzZGJfZnJlZV9kaXNrX3NwYWNlXG4jIFRZUEUgcm9ja3NkYl9mcmVlX2Rpc2tfc3BhY2UgZ2F1Z2VcbnJvY2tzZGJfZnJlZV9kaXNrX3NwYWNlIDE0MDk1NTU5NDc1MlxuXG4jIEhFTFAgcm9ja3NkYl9mcmVlX2lub2RlcyByb2Nrc2RiX2ZyZWVfaW5vZGVzXG4jIFRZUEUgcm9ja3NkYl9mcmVlX2lub2RlcyBnYXVnZVxucm9ja3NkYl9mcmVlX2lub2RlcyAxODg5MjczNFxuXG4jIEhFTFAgcm9ja3NkYl9pc19maWxlX2RlbGV0aW9uc19lbmFibGVkIHJvY2tzZGJfaXNfZmlsZV9kZWxldGlvbnNfZW5hYmxlZFxuIyBUWVBFIHJvY2tzZGJfaXNfZmlsZV9kZWxldGlvbnNfZW5hYmxlZCBnYXVnZVxucm9ja3NkYl9pc19maWxlX2RlbGV0aW9uc19lbmFibGVkIDFcblxuIyBIRUxQIHJvY2tzZGJfaXNfd3JpdGVfc3RvcHBlZCByb2Nrc2RiX2lzX3dyaXRlX3N0b3BwZWRcbiMgVFlQRSByb2Nrc2RiX2lzX3dyaXRlX3N0b3BwZWQgZ2F1Z2VcbnJvY2tzZGJfaXNfd3JpdGVfc3RvcHBlZCAwXG5cbiMgSEVMUCByb2Nrc2RiX2xpdmVfc3N0X2ZpbGVzX3NpemUgcm9ja3NkYl9saXZlX3NzdF9maWxlc19zaXplXG4jIFRZUEUgcm9ja3NkYl9saXZlX3NzdF9maWxlc19zaXplIGdhdWdlXG5yb2Nrc2RiX2xpdmVfc3N0X2ZpbGVzX3NpemUgMTIyMzk4XG5cbiMgSEVMUCByb2Nrc2RiX21lbV90YWJsZV9mbHVzaF9wZW5kaW5nIHJvY2tzZGJfbWVtX3RhYmxlX2ZsdXNoX3BlbmRpbmdcbiMgVFlQRSByb2Nrc2RiX21lbV90YWJsZV9mbHVzaF9wZW5kaW5nIGdhdWdlXG5yb2Nrc2RiX21lbV90YWJsZV9mbHVzaF9wZW5kaW5nIDBcblxuIyBIRUxQIHJvY2tzZGJfbWluX2xvZ19udW1iZXJfdG9fa2VlcCByb2Nrc2RiX21pbl9sb2dfbnVtYmVyX3RvX2tlZXBcbiMgVFlQRSByb2Nrc2RiX21pbl9sb2dfbnVtYmVyX3RvX2tlZXAgZ2F1Z2VcbnJvY2tzZGJfbWluX2xvZ19udW1iZXJfdG9fa2VlcCAxMjJcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2RlbGV0ZXNfYWN0aXZlX21lbV90YWJsZSByb2Nrc2RiX251bV9kZWxldGVzX2FjdGl2ZV9tZW1fdGFibGVcbiMgVFlQRSByb2Nrc2RiX251bV9kZWxldGVzX2FjdGl2ZV9tZW1fdGFibGUgZ2F1Z2VcbnJvY2tzZGJfbnVtX2RlbGV0ZXNfYWN0aXZlX21lbV90YWJsZSAzMjQxXG5cbiMgSEVMUCByb2Nrc2RiX251bV9kZWxldGVzX2ltbV9tZW1fdGFibGVzIHJvY2tzZGJfbnVtX2RlbGV0ZXNfaW1tX21lbV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX251bV9kZWxldGVzX2ltbV9tZW1fdGFibGVzIGdhdWdlXG5yb2Nrc2RiX251bV9kZWxldGVzX2ltbV9tZW1fdGFibGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2VudHJpZXNfYWN0aXZlX21lbV90YWJsZSByb2Nrc2RiX251bV9lbnRyaWVzX2FjdGl2ZV9tZW1fdGFibGVcbiMgVFlQRSByb2Nrc2RiX251bV9lbnRyaWVzX2FjdGl2ZV9tZW1fdGFibGUgZ2F1Z2VcbnJvY2tzZGJfbnVtX2VudHJpZXNfYWN0aXZlX21lbV90YWJsZSA3OTc2XG5cbiMgSEVMUCByb2Nrc2RiX251bV9lbnRyaWVzX2ltbV9tZW1fdGFibGVzIHJvY2tzZGJfbnVtX2VudHJpZXNfaW1tX21lbV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX251bV9lbnRyaWVzX2ltbV9tZW1fdGFibGVzIGdhdWdlXG5yb2Nrc2RiX251bV9lbnRyaWVzX2ltbV9tZW1fdGFibGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMCByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDBcbiMgVFlQRSByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDAgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMCAzXG5cbiMgSEVMUCByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDEgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwxXG4jIFRZUEUgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwxIGdhdWdlXG5yb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDEgMFxuXG4jIEhFTFAgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwyIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMlxuIyBUWVBFIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMiBnYXVnZVxucm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwyIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMyByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDNcbiMgVFlQRSByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDMgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMyAwXG5cbiMgSEVMUCByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDQgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw0XG4jIFRZUEUgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw0IGdhdWdlXG5yb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDQgMFxuXG4jIEhFTFAgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw1IHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNVxuIyBUWVBFIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNSBnYXVnZVxucm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw1IDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNiByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDZcbiMgVFlQRSByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDYgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNiA0XG5cbiMgSEVMUCByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlIHJvY2tzZGJfbnVtX2ltbXV0YWJsZV9tZW1fdGFibGVcbiMgVFlQRSByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlIGdhdWdlXG5yb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ltbXV0YWJsZV9tZW1fdGFibGVfZmx1c2hlZCByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlX2ZsdXNoZWRcbiMgVFlQRSByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlX2ZsdXNoZWQgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ltbXV0YWJsZV9tZW1fdGFibGVfZmx1c2hlZCA0XG5cbiMgSEVMUCByb2Nrc2RiX251bV9saXZlX3ZlcnNpb25zIHJvY2tzZGJfbnVtX2xpdmVfdmVyc2lvbnNcbiMgVFlQRSByb2Nrc2RiX251bV9saXZlX3ZlcnNpb25zIGdhdWdlXG5yb2Nrc2RiX251bV9saXZlX3ZlcnNpb25zIDlcblxuIyBIRUxQIHJvY2tzZGJfbnVtX3J1bm5pbmdfY29tcGFjdGlvbnMgcm9ja3NkYl9udW1fcnVubmluZ19jb21wYWN0aW9uc1xuIyBUWVBFIHJvY2tzZGJfbnVtX3J1bm5pbmdfY29tcGFjdGlvbnMgZ2F1Z2VcbnJvY2tzZGJfbnVtX3J1bm5pbmdfY29tcGFjdGlvbnMgMFxuXG4jIEhFTFAgcm9ja3NkYl9udW1fcnVubmluZ19mbHVzaGVzIHJvY2tzZGJfbnVtX3J1bm5pbmdfZmx1c2hlc1xuIyBUWVBFIHJvY2tzZGJfbnVtX3J1bm5pbmdfZmx1c2hlcyBnYXVnZVxucm9ja3NkYl9udW1fcnVubmluZ19mbHVzaGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX3NuYXBzaG90cyByb2Nrc2RiX251bV9zbmFwc2hvdHNcbiMgVFlQRSByb2Nrc2RiX251bV9zbmFwc2hvdHMgZ2F1Z2VcbnJvY2tzZGJfbnVtX3NuYXBzaG90cyAyXG5cbiMgSEVMUCByb2Nrc2RiX29sZGVzdF9zbmFwc2hvdF90aW1lIHJvY2tzZGJfb2xkZXN0X3NuYXBzaG90X3RpbWVcbiMgVFlQRSByb2Nrc2RiX29sZGVzdF9zbmFwc2hvdF90aW1lIGdhdWdlXG5yb2Nrc2RiX29sZGVzdF9zbmFwc2hvdF90aW1lIDE3NDgwMjQxNzJcblxuIyBIRUxQIHJvY2tzZGJfcmVhZF9vbmx5IHJvY2tzZGJfcmVhZF9vbmx5XG4jIFRZUEUgcm9ja3NkYl9yZWFkX29ubHkgZ2F1Z2VcbnJvY2tzZGJfcmVhZF9vbmx5IDBcblxuIyBIRUxQIHJvY2tzZGJfc2l6ZV9hbGxfbWVtX3RhYmxlcyByb2Nrc2RiX3NpemVfYWxsX21lbV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX3NpemVfYWxsX21lbV90YWJsZXMgZ2F1Z2VcbnJvY2tzZGJfc2l6ZV9hbGxfbWVtX3RhYmxlcyA5MzM1NTI0MFxuXG4jIEhFTFAgcm9ja3NkYl90b3RhbF9kaXNrX3NwYWNlIHJvY2tzZGJfdG90YWxfZGlza19zcGFjZVxuIyBUWVBFIHJvY2tzZGJfdG90YWxfZGlza19zcGFjZSBnYXVnZVxucm9ja3NkYl90b3RhbF9kaXNrX3NwYWNlIDE1NTg5NzYxMDI0MFxuXG4jIEhFTFAgcm9ja3NkYl90b3RhbF9pbm9kZXMgcm9ja3NkYl90b3RhbF9pbm9kZXNcbiMgVFlQRSByb2Nrc2RiX3RvdGFsX2lub2RlcyBnYXVnZVxucm9ja3NkYl90b3RhbF9pbm9kZXMgMTkzNTM2MDBcblxuIyBIRUxQIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzXG4jIFRZUEUgcm9ja3NkYl90b3RhbF9zc3RfZmlsZXMgZ2F1Z2VcbnJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzIDdcblxuIyBIRUxQIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzX3NpemUgcm9ja3NkYl90b3RhbF9zc3RfZmlsZXNfc2l6ZVxuIyBUWVBFIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzX3NpemUgZ2F1Z2VcbnJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzX3NpemUgMTIyMzk4XG5cbiMgSEVMUCByb2Nrc2RiX3dhbF9zZXF1ZW5jZSByb2Nrc2RiX3dhbF9zZXF1ZW5jZVxuIyBUWVBFIHJvY2tzZGJfd2FsX3NlcXVlbmNlIGdhdWdlXG5yb2Nrc2RiX3dhbF9zZXF1ZW5jZSAxODg3MDhcblxuIyBIRUxQIHJvY2tzZGJfZW5naW5lX3Rocm90dGxlX2JwcyByb2Nrc2RiX2VuZ2luZV90aHJvdHRsZV9icHNcbiMgVFlQRSByb2Nrc2RiX2VuZ2luZV90aHJvdHRsZV9icHMgZ2F1Z2VcbnJvY2tzZGJfZW5naW5lX3Rocm90dGxlX2JwcyAwIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RBZG1pbk1ldHJpY3NWMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAdminMetrics_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5NZXRyaWNzCi0tLQp2YXIgdXJsID0gIi9fYWRtaW4vbWV0cmljcyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dQbGFpblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYWRtaW4vbWV0cmljcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc5OTQyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbiMgSEVMUCBhcmFuZ29kYl9hZ2VuY3lfY2FjaGVfY2FsbGJhY2tfbnVtYmVyIEN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gYWdlbmN5IGNhY2hlIGNhbGxiYWNrcyB0YWJsZVxuIyBUWVBFIGFyYW5nb2RiX2FnZW5jeV9jYWNoZV9jYWxsYmFja19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX2FnZW5jeV9jYWNoZV9jYWxsYmFja19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYWdlbmN5X2NhbGxiYWNrX251bWJlciBDdXJyZW50IG51bWJlciBvZiBhZ2VuY3kgY2FsbGJhY2tzIHJlZ2lzdGVyZWRcbiMgVFlQRSBhcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2FnZW5jeV9jYWxsYmFja19yZWdpc3RlcmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBhZ2VuY3kgY2FsbGJhY2tzIHJlZ2lzdGVyZWRcbiMgVFlQRSBhcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfcmVnaXN0ZXJlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9hZ2VuY3lfY2FsbGJhY2tfcmVnaXN0ZXJlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjIFJlcXVlc3QgdGltZSBmb3IgQWdlbmN5IHJlcXVlc3RzIFttc11cbiMgVFlQRSBhcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjIGhpc3RvZ3JhbVxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjkyXCJ9IDBcbmFyYW5nb2RiX2FnZW5jeWNvbW1fcmVxdWVzdF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjUyNlwifSAwXG5hcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI5OTVcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTkzMlwifSAwXG5hcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzODA2XCJ9IDBcbmFyYW5nb2RiX2FnZW5jeWNvbW1fcmVxdWVzdF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjc1NTRcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTUwNTBcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzAwNDNcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjAwMjlcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9hZ2VuY3ljb21tX3JlcXVlc3RfdGltZV9tc2VjX2NvdW50e3JvbGU9XCJTSU5HTEVcIn0gMFxuYXJhbmdvZGJfYWdlbmN5Y29tbV9yZXF1ZXN0X3RpbWVfbXNlY19zdW17cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2FsbF9xdWVyeV90b3RhbCBUb3RhbCBudW1iZXIgb2YgQVFMIHF1ZXJpZXMgZmluaXNoZWRcbiMgVFlQRSBhcmFuZ29kYl9hcWxfYWxsX3F1ZXJ5X3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2FxbF9hbGxfcXVlcnlfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxODJcbiMgSEVMUCBhcmFuZ29kYl9hcWxfY3VycmVudF9xdWVyeSBDdXJyZW50IG51bWJlciBvZiBBUUwgcXVlcmllcyBleGVjdXRpbmdcbiMgVFlQRSBhcmFuZ29kYl9hcWxfY3VycmVudF9xdWVyeSBnYXVnZVxuYXJhbmdvZGJfYXFsX2N1cnJlbnRfcXVlcnl7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2dsb2JhbF9tZW1vcnlfbGltaXQgVG90YWwgbWVtb3J5IGxpbWl0IGZvciBhbGwgQVFMIHF1ZXJpZXMgY29tYmluZWQgW2J5dGVzXVxuIyBUWVBFIGFyYW5nb2RiX2FxbF9nbG9iYWxfbWVtb3J5X2xpbWl0IGdhdWdlXG5hcmFuZ29kYl9hcWxfZ2xvYmFsX21lbW9yeV9saW1pdHtyb2xlPVwiU0lOR0xFXCJ9IDI2ODAyNzAwMDAyXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2dsb2JhbF9tZW1vcnlfdXNhZ2UgVG90YWwgbWVtb3J5IHVzYWdlIG9mIGFsbCBBUUwgcXVlcmllcyBleGVjdXRpbmcgW2J5dGVzXSwgZ3JhbnVsYXJpdHk6IDMyNzY4IGJ5dGVzIHN0ZXBzXG4jIFRZUEUgYXJhbmdvZGJfYXFsX2dsb2JhbF9tZW1vcnlfdXNhZ2UgZ2F1Z2VcbmFyYW5nb2RiX2FxbF9nbG9iYWxfbWVtb3J5X3VzYWdle3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2FxbF9nbG9iYWxfcXVlcnlfbWVtb3J5X2xpbWl0X3JlYWNoZWRfdG90YWwgTnVtYmVyIG9mIGdsb2JhbCBBUUwgcXVlcnkgbWVtb3J5IGxpbWl0IHZpb2xhdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9hcWxfZ2xvYmFsX3F1ZXJ5X21lbW9yeV9saW1pdF9yZWFjaGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2FxbF9nbG9iYWxfcXVlcnlfbWVtb3J5X2xpbWl0X3JlYWNoZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfYXFsX2xvY2FsX3F1ZXJ5X21lbW9yeV9saW1pdF9yZWFjaGVkX3RvdGFsIE51bWJlciBvZiBsb2NhbCBBUUwgcXVlcnkgbWVtb3J5IGxpbWl0IHZpb2xhdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9hcWxfbG9jYWxfcXVlcnlfbWVtb3J5X2xpbWl0X3JlYWNoZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfYXFsX2xvY2FsX3F1ZXJ5X21lbW9yeV9saW1pdF9yZWFjaGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2FxbF9xdWVyeV90aW1lIEV4ZWN1dGlvbiB0aW1lIGhpc3RvZ3JhbSBmb3IgYWxsIEFRTCBxdWVyaWVzIFtzXVxuIyBUWVBFIGFyYW5nb2RiX2FxbF9xdWVyeV90aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfYXFsX3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDAwMDk1XCJ9IDg1XG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAxOTFcIn0gMTcxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAzODFcIn0gMTc5XG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDA3NjNcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDE1MjZcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDMwNTJcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDYxMDRcIn0gMTgxXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMTIyMDdcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMjQ0MTRcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wNDg4MjhcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wOTc2NTZcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4xOTUzMTJcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4zOTA2MjVcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC43ODEyNTBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS41NjI1MDBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMy4xMjUwMDBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNi4yNTAwMDBcIn0gMTgyXG5hcmFuZ29kYl9hcWxfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTIuNTAwMDAwXCJ9IDE4MlxuYXJhbmdvZGJfYXFsX3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjI1LjAwMDAwMFwifSAxODJcbmFyYW5nb2RiX2FxbF9xdWVyeV90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDE4MlxuYXJhbmdvZGJfYXFsX3F1ZXJ5X3RpbWVfY291bnR7cm9sZT1cIlNJTkdMRVwifSAxODJcbmFyYW5nb2RiX2FxbF9xdWVyeV90aW1lX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDMwNTQyXG4jIEhFTFAgYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZSBFeGVjdXRpb24gdGltZSBoaXN0b2dyYW0gZm9yIHNsb3cgQVFMIHF1ZXJpZXMgW3NdXG4jIFRZUEUgYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQuOTA0Mjk3XCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjguODA4NTk0XCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2LjYxNzE4OFwifSAwXG5hcmFuZ29kYl9hcWxfc2xvd19xdWVyeV90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzMi4yMzQzNzVcIn0gMFxuYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjMuNDY4NzUwXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEyNS45Mzc1MDBcIn0gMFxuYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjUwLjg3NTAwMFwifSAwXG5hcmFuZ29kYl9hcWxfc2xvd19xdWVyeV90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI1MDAuNzUwMDAwXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAuNTAwMDAwXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfYXFsX3Nsb3dfcXVlcnlfdGltZV9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX2FxbF9zbG93X3F1ZXJ5X3RpbWVfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9hcWxfdG90YWxfcXVlcnlfdGltZV9tc2VjX3RvdGFsIFRvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIGFsbCBBUUwgcXVlcmllcyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfYXFsX3RvdGFsX3F1ZXJ5X3RpbWVfbXNlY190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9hcWxfdG90YWxfcXVlcnlfdGltZV9tc2VjX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMTBcbiMgSEVMUCBhcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fbWljcm9zX3RvdGFsIFRvdGFsIGFtb3VudCBvZiBjb2xsZWN0aW9uIGxvY2sgYWNxdWlzaXRpb24gdGltZSBbzrxzXVxuIyBUWVBFIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl9taWNyb3NfdG90YWwgY291bnRlclxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX21pY3Jvc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDEyMlxuIyBIRUxQIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lIENvbGxlY3Rpb24gbG9jayBhY3F1aXNpdGlvbiB0aW1lIGhpc3RvZ3JhbSBbc11cbiMgVFlQRSBhcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAwMDFcIn0gMTE5MVxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDAwMDEwXCJ9IDEyOTNcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMDEwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDEwMDBcIn0gMTI5NFxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDEwMDAwXCJ9IDEyOTRcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjEwMDAwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS4wMDAwMDBcIn0gMTI5NFxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX2FjcXVpc2l0aW9uX3RpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwLjAwMDAwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAwLjAwMDAwMFwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAxMjk0XG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfYWNxdWlzaXRpb25fdGltZV9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDEyOTRcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19hY3F1aXNpdGlvbl90aW1lX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwODY1XG4jIEhFTFAgYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3NlcXVlbnRpYWxfbW9kZV90b3RhbCBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHVzaW5nIHNlcXVlbnRpYWwgbG9ja2luZyBvZiBjb2xsZWN0aW9ucyB0byBhdm9pZCBkZWFkbG9ja2luZ1xuIyBUWVBFIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja19zZXF1ZW50aWFsX21vZGVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3NlcXVlbnRpYWxfbW9kZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfdGltZW91dHNfZXhjbHVzaXZlX3RvdGFsIE51bWJlciBvZiB0aW1lb3V0cyB3aGVuIHRyeWluZyB0byBhY3F1aXJlIGNvbGxlY3Rpb24gZXhjbHVzaXZlIGxvY2tzXG4jIFRZUEUgYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3RpbWVvdXRzX2V4Y2x1c2l2ZV90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9jb2xsZWN0aW9uX2xvY2tfdGltZW91dHNfZXhjbHVzaXZlX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja190aW1lb3V0c193cml0ZV90b3RhbCBOdW1iZXIgb2YgdGltZW91dHMgd2hlbiB0cnlpbmcgdG8gYWNxdWlyZSBjb2xsZWN0aW9uIHdyaXRlIGxvY2tzXG4jIFRZUEUgYXJhbmdvZGJfY29sbGVjdGlvbl9sb2NrX3RpbWVvdXRzX3dyaXRlX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2NvbGxlY3Rpb25fbG9ja190aW1lb3V0c193cml0ZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfY29ubmVjdGlvbnNfY3JlYXRlZF90b3RhbCBUb3RhbCBudW1iZXIgb2YgY29ubmVjdGlvbnMgY3JlYXRlZFxuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9jb25uZWN0aW9uc19jcmVhdGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9jb25uZWN0aW9uc19jcmVhdGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9jb25uZWN0aW9uc19jdXJyZW50IEN1cnJlbnQgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGluIHBvb2xcbiMgVFlQRSBhcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfY29ubmVjdGlvbnNfY3VycmVudCBnYXVnZVxuYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2Nvbm5lY3Rpb25zX2N1cnJlbnR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlX3RpbWVfaGlzdCBUaW1lIHRvIGxlYXNlIGEgY29ubmVjdGlvbiBmcm9tIHBvb2wgW21zXVxuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3QgaGlzdG9ncmFtXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIxLjk1MzEyNVwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIzLjkwNjI1MFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCI3LjgxMjUwMFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIxNS42MjUwMDBcIn0gMFxuYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlX3RpbWVfaGlzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwiLGxlPVwiMzEuMjUwMDAwXCJ9IDBcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIixsZT1cIjYyLjUwMDAwMFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIxMjUuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIixsZT1cIjI1MC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlX3RpbWVfaGlzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwiLGxlPVwiNTAwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZV90aW1lX2hpc3RfY291bnR7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwifSAwXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VfdGltZV9oaXN0X3N1bXtyb2xlPVwiU0lOR0xFXCIscG9vbD1cIkNsdXN0ZXJDb21tXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfY29ubmVjdGlvbl9wb29sX2xlYXNlc19mYWlsZWRfdG90YWwgVG90YWwgbnVtYmVyIG9mIGZhaWxlZCBjb25uZWN0aW9uIGxlYXNlc1xuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfZmFpbGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfZmFpbGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIixwb29sPVwiQ2x1c3RlckNvbW1cIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfc3VjY2Vzc2Z1bF90b3RhbCBUb3RhbCBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGxlYXNlc1xuIyBUWVBFIGFyYW5nb2RiX2Nvbm5lY3Rpb25fcG9vbF9sZWFzZXNfc3VjY2Vzc2Z1bF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9jb25uZWN0aW9uX3Bvb2xfbGVhc2VzX3N1Y2Nlc3NmdWxfdG90YWx7cm9sZT1cIlNJTkdMRVwiLHBvb2w9XCJDbHVzdGVyQ29tbVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX21lbW9yeV91c2FnZSBNZW1vcnkgdXNlZCBieSB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbiBzdGF0aXN0aWNzXG4jIFRZUEUgYXJhbmdvZGJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX21lbW9yeV91c2FnZSBnYXVnZVxuYXJhbmdvZGJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX21lbW9yeV91c2FnZXtyb2xlPVwiU0lOR0xFXCJ9IDEwMjRcbiMgSEVMUCBhcmFuZ29kYl9kaXJ0eV9yZWFkX3RyYW5zYWN0aW9uc190b3RhbCBOdW1iZXIgb2YgcmVhZCB0cmFuc2FjdGlvbnMgd2hpY2ggY2FuIGRvIGRpcnR5IHJlYWRzXG4jIFRZUEUgYXJhbmdvZGJfZGlydHlfcmVhZF90cmFuc2FjdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfZGlydHlfcmVhZF90cmFuc2FjdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19jdXJyZW50IE51bWJlciBvZiBjdXJyZW50bHkgb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgYXJhbmdvZCBwcm9jZXNzXG4jIFRZUEUgYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19jdXJyZW50IGdhdWdlXG5hcmFuZ29kYl9maWxlX2Rlc2NyaXB0b3JzX2N1cnJlbnR7cm9sZT1cIlNJTkdMRVwifSAyN1xuIyBIRUxQIGFyYW5nb2RiX2ZpbGVfZGVzY3JpcHRvcnNfbGltaXQgTGltaXQgZm9yIHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgYXJhbmdvZCBwcm9jZXNzXG4jIFRZUEUgYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19saW1pdCBnYXVnZVxuYXJhbmdvZGJfZmlsZV9kZXNjcmlwdG9yc19saW1pdHtyb2xlPVwiU0lOR0xFXCJ9IDEwNDg1NzZcbiMgSEVMUCBhcmFuZ29kYl9mbHVzaF9zdWJzY3JpcHRpb25zIE51bWJlciBvZiBhY3RpdmUgZmx1c2ggc3Vic2NyaXB0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX2ZsdXNoX3N1YnNjcmlwdGlvbnMgZ2F1Z2VcbmFyYW5nb2RiX2ZsdXNoX3N1YnNjcmlwdGlvbnN7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfaGVhcnRiZWF0X2ZhaWx1cmVzX3RvdGFsIENvdW50aW5nIGZhaWxlZCBoZWFydGJlYXQgdHJhbnNtaXNzaW9uc1xuIyBUWVBFIGFyYW5nb2RiX2hlYXJ0YmVhdF9mYWlsdXJlc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9oZWFydGJlYXRfZmFpbHVyZXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfaGVhcnRiZWF0X3NlbmRfdGltZV9tc2VjIFRpbWUgcmVxdWlyZWQgdG8gc2VuZCBoZWFydGJlYXQgW21zXVxuIyBUWVBFIGFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlYyBoaXN0b2dyYW1cbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTlcIn0gMFxuYXJhbmdvZGJfaGVhcnRiZWF0X3NlbmRfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzNVwifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjY2XCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI4XCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjUzXCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTAzXCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAwM1wifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjIwMDNcIn0gMFxuYXJhbmdvZGJfaGVhcnRiZWF0X3NlbmRfdGltZV9tc2VjX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MDAyXCJ9IDBcbmFyYW5nb2RiX2hlYXJ0YmVhdF9zZW5kX3RpbWVfbXNlY19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9oZWFydGJlYXRfc2VuZF90aW1lX21zZWNfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2h0dHAxX2Nvbm5lY3Rpb25zX3RvdGFsIFRvdGFsIG51bWJlciBvZiBIVFRQLzEuMSBjb25uZWN0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX2h0dHAxX2Nvbm5lY3Rpb25zX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHAxX2Nvbm5lY3Rpb25zX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIGFyYW5nb2RiX2h0dHAyX2Nvbm5lY3Rpb25zX3RvdGFsIFRvdGFsIG51bWJlciBvZiBIVFRQLzIgY29ubmVjdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9odHRwMl9jb25uZWN0aW9uc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwMl9jb25uZWN0aW9uc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9pbnRlcm1lZGlhdGVfY29tbWl0c190b3RhbCBOdW1iZXIgb2YgaW50ZXJtZWRpYXRlIGNvbW1pdHMgcGVyZm9ybWVkIGluIHRyYW5zYWN0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX2ludGVybWVkaWF0ZV9jb21taXRzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2ludGVybWVkaWF0ZV9jb21taXRzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2lvaGVhcnRiZWF0X2RlbGF5c190b3RhbCBUb3RhbCBudW1iZXIgb2YgZGVsYXlzIGluIElPIGhlYXJ0YmVhdFxuIyBUWVBFIGFyYW5nb2RiX2lvaGVhcnRiZWF0X2RlbGF5c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9kZWxheXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb24gVGltZSB0byBleGVjdXRlIHRoZSBpbyBoZWFydGJlYXQgb25jZSBbdXNdXG4jIFRZUEUgYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb24gaGlzdG9ncmFtXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4xMDAwMDBcIn0gMFxuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX2lvaGVhcnRiZWF0X2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX2lvaGVhcnRiZWF0X2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAwMC4wMDAwMDBcIn0gM1xuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAwMC4wMDAwMDBcIn0gM1xuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gM1xuYXJhbmdvZGJfaW9oZWFydGJlYXRfZHVyYXRpb25fY291bnR7cm9sZT1cIlNJTkdMRVwifSAzXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9kdXJhdGlvbl9zdW17cm9sZT1cIlNJTkdMRVwifSA5ODI0LjAwMDAwMFxuIyBIRUxQIGFyYW5nb2RiX2lvaGVhcnRiZWF0X2ZhaWx1cmVzX3RvdGFsIFRvdGFsIG51bWJlciBvZiBmYWlsdXJlcyBpbiBJTyBoZWFydGJlYXRcbiMgVFlQRSBhcmFuZ29kYl9pb2hlYXJ0YmVhdF9mYWlsdXJlc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9pb2hlYXJ0YmVhdF9mYWlsdXJlc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9saWNlbnNlX2V4cGlyZXMgVGhpcyBpbnN0YW5jZSdzIGxpY2Vuc2Ugd2lsbCBleHBpcmUgaW4gZGF5c1xuIyBUWVBFIGFyYW5nb2RiX2xpY2Vuc2VfZXhwaXJlcyBnYXVnZVxuYXJhbmdvZGJfbGljZW5zZV9leHBpcmVze3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lIEN1cnJlbnQgbG9hZGluZyBydW50aW1lcyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWUgaGlzdG9ncmFtXG5hcmFuZ29kYl9sb2FkX2N1cnJlbnRfcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4zMDg1MjVcIn0gMFxuYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuODM4NjU3XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyLjI3OTcwNVwifSAwXG5hcmFuZ29kYl9sb2FkX2N1cnJlbnRfcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNi4xOTY4ODJcIn0gMFxuYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2Ljg0NDg3MFwifSAwXG5hcmFuZ29kYl9sb2FkX2N1cnJlbnRfcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNDUuNzg5MTA0XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMjQuNDY3NjgyXCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzMzguMzM4MjI2XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI5MTkuNjk4NjA4XCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX2xvYWRfY3VycmVudF9ydW50aW1lX2NvdW50e3JvbGU9XCJTSU5HTEVcIn0gMFxuYXJhbmdvZGJfbG9hZF9jdXJyZW50X3J1bnRpbWVfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZSBQbGFuIGxvYWRpbmcgcnVudGltZXMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfbG9hZF9wbGFuX3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMzA4NTI1XCJ9IDBcbmFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjgzODY1N1wifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMi4yNzk3MDVcIn0gMFxuYXJhbmdvZGJfbG9hZF9wbGFuX3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjYuMTk2ODgyXCJ9IDBcbmFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNi44NDQ4NzBcIn0gMFxuYXJhbmdvZGJfbG9hZF9wbGFuX3J1bnRpbWVfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQ1Ljc4OTEwNFwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI0LjQ2NzY4MlwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzM4LjMzODIyNlwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiOTE5LjY5ODYwOFwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9sb2FkX3BsYW5fcnVudGltZV9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX2xvYWRfcGxhbl9ydW50aW1lX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfbG9nZ2VyX2Vycm9yc190b3RhbCBOdW1iZXIgb2YgZXJyb3JzIGxvZ2dlZC5cbiMgVFlQRSBhcmFuZ29kYl9sb2dnZXJfZXJyb3JzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2xvZ2dlcl9lcnJvcnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxNFxuIyBIRUxQIGFyYW5nb2RiX2xvZ2dlcl93YXJuaW5nc190b3RhbCBOdW1iZXIgb2Ygd2FybmluZ3MgbG9nZ2VkLlxuIyBUWVBFIGFyYW5nb2RiX2xvZ2dlcl93YXJuaW5nc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9sb2dnZXJfd2FybmluZ3NfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxM1xuIyBIRUxQIGFyYW5nb2RiX25ldHdvcmtfZGVxdWV1ZV9kdXJhdGlvbiBUaW1lIHRvIGRlcXVldWUgYSBxdWV1ZWQgbmV0d29yayByZXF1ZXN0IGluIGZ1ZXJ0ZSBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uIGhpc3RvZ3JhbVxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMDAwMVwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX2RlcXVldWVfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDAwMDEwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfZGVxdWV1ZV9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4wMDAxMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAwMTAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX2RlcXVldWVfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDEwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfZGVxdWV1ZV9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMC4xMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX2RlcXVldWVfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX2NvdW50e3JvbGU9XCJTSU5HTEVcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19kZXF1ZXVlX2R1cmF0aW9uX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfbmV0d29ya19mb3J3YXJkZWRfcmVxdWVzdHNfdG90YWwgTnVtYmVyIG9mIHJlcXVlc3RzIGZvcndhcmRlZCB0byBhbm90aGVyIGNvb3JkaW5hdG9yXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19mb3J3YXJkZWRfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfbmV0d29ya19mb3J3YXJkZWRfcmVxdWVzdHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dCBJbnRlcm5hbCByZXF1ZXN0IHJvdW5kLXRyaXAgdGltZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGltZW91dCBbJV1cbiMgVFlQRSBhcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RfZHVyYXRpb25fYXNfcGVyY2VudGFnZV9vZl90aW1lb3V0IGhpc3RvZ3JhbVxuYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNS4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X2R1cmF0aW9uX2FzX3BlcmNlbnRhZ2Vfb2ZfdGltZW91dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTUuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdF9kdXJhdGlvbl9hc19wZXJjZW50YWdlX29mX3RpbWVvdXRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjUwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RfZHVyYXRpb25fYXNfcGVyY2VudGFnZV9vZl90aW1lb3V0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdF9kdXJhdGlvbl9hc19wZXJjZW50YWdlX29mX3RpbWVvdXRfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RfZHVyYXRpb25fYXNfcGVyY2VudGFnZV9vZl90aW1lb3V0X3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDAuMDAwMDAwXG4jIEhFTFAgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X3RpbWVvdXRzX3RvdGFsIE51bWJlciBvZiBpbnRlcm5hbCByZXF1ZXN0cyB0aGF0IGhhdmUgdGltZWQgb3V0XG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0X3RpbWVvdXRzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdF90aW1lb3V0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9uZXR3b3JrX3JlcXVlc3RzX2luX2ZsaWdodCBOdW1iZXIgb2Ygb3V0Z29pbmcgaW50ZXJuYWwgcmVxdWVzdHMgaW4gZmxpZ2h0XG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19yZXF1ZXN0c19pbl9mbGlnaHQgZ2F1Z2VcbmFyYW5nb2RiX25ldHdvcmtfcmVxdWVzdHNfaW5fZmxpZ2h0e3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb24gVGltZSB0byB3YWl0IGZvciBuZXR3b3JrIHJlc3BvbnNlIGFmdGVyIGl0IHdhcyBzZW50IG91dCBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19yZXNwb25zZV9kdXJhdGlvbiBoaXN0b2dyYW1cbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMDEwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMTAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwLjAwMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3Jlc3BvbnNlX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19yZXNwb25zZV9kdXJhdGlvbl9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfcmVzcG9uc2VfZHVyYXRpb25fc3Vte3JvbGU9XCJTSU5HTEVcIn0gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9uZXR3b3JrX3NlbmRfZHVyYXRpb24gVGltZSB0byBzZW5kIG91dCBpbnRlcm5hbCByZXF1ZXN0cyBpbiBzZWNvbmRzXG4jIFRZUEUgYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uIGhpc3RvZ3JhbVxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIwLjAxMDAwMFwifSAwXG5hcmFuZ29kYl9uZXR3b3JrX3NlbmRfZHVyYXRpb25fYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjAuMTAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMS4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAuMDAwMDAwXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAwMC4wMDAwMDBcIn0gMFxuYXJhbmdvZGJfbmV0d29ya19zZW5kX2R1cmF0aW9uX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX25ldHdvcmtfc2VuZF9kdXJhdGlvbl9zdW17cm9sZT1cIlNJTkdMRVwifSAwLjAwMDAwMFxuIyBIRUxQIGFyYW5nb2RiX25ldHdvcmtfdW5maW5pc2hlZF9zZW5kc190b3RhbCBOdW1iZXIgb2YgdGltZXMgdGhlIHNlbmRpbmcgb2YgYSByZXF1ZXN0IHJlbWFpbmVkIHVuZmluaXNoZWRcbiMgVFlQRSBhcmFuZ29kYl9uZXR3b3JrX3VuZmluaXNoZWRfc2VuZHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfbmV0d29ya191bmZpbmlzaGVkX3NlbmRzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX2xvYWRpbmdfbnVtYmVyIE51bWJlciBvZiBQcmVnZWwgY29uZHVjdG9ycyBpbiBsb2FkaW5nIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfbG9hZGluZ19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX2xvYWRpbmdfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX251bWJlciBOdW1iZXIgb2YgbGl2ZSBQcmVnZWwgY29uZHVjdG9yc1xuIyBUWVBFIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gN1xuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3J1bm5pbmdfbnVtYmVyIE51bWJlciBvZiBQcmVnZWwgY29uZHVjdG9ycyBpbiBydW5uaW5nIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfcnVubmluZ19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3J1bm5pbmdfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3N0b3JpbmdfbnVtYmVyIE51bWJlciBvZiBQcmVnZWwgY29uZHVjdG9ycyBpbiBzdG9yaW5nIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX2NvbmR1Y3RvcnNfc3RvcmluZ19udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3ByZWdlbF9jb25kdWN0b3JzX3N0b3JpbmdfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3ByZWdlbF9ncmFwaF9tZW1vcnlfYnl0ZXNfbnVtYmVyIEFtb3VudCBvZiBtZW1vcnkgaW4gdXNlIGZvciBQcmVnZWwgZ3JhcGggc3RvcmFnZVxuIyBUWVBFIGFyYW5nb2RiX3ByZWdlbF9ncmFwaF9tZW1vcnlfYnl0ZXNfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9wcmVnZWxfZ3JhcGhfbWVtb3J5X2J5dGVzX251bWJlcntyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9wcmVnZWxfbWVzc2FnZXNfcmVjZWl2ZWRfdG90YWwgTnVtYmVyIG9mIG1lc3NhZ2VzIHJlY2VpdmVkIGJ5IFByZWdlbFxuIyBUWVBFIGFyYW5nb2RiX3ByZWdlbF9tZXNzYWdlc19yZWNlaXZlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9wcmVnZWxfbWVzc2FnZXNfcmVjZWl2ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAyNTM0XG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX21lc3NhZ2VzX3NlbnRfdG90YWwgTnVtYmVyIG9mIG1lc3NhZ2VzIHNlbnQgYnkgUHJlZ2VsXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX21lc3NhZ2VzX3NlbnRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcHJlZ2VsX21lc3NhZ2VzX3NlbnRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3RocmVhZHNfbnVtYmVyIE51bWJlciBvZiB0aHJlYWRzIHVzZWQgYnkgUHJlZ2VsXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX3RocmVhZHNfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9wcmVnZWxfdGhyZWFkc19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbG9hZGluZ19udW1iZXIgTnVtYmVyIG9mIFByZWdlbCBjb25kdWN0b3JzIGluIGxvYWRpbmcgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19sb2FkaW5nX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbG9hZGluZ19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbnVtYmVyIE51bWJlciBvZiBsaXZlIFByZWdlbCB3b3JrZXJzXG4jIFRZUEUgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAyXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfcnVubmluZ19udW1iZXIgTnVtYmVyIG9mIFByZWdlbCBjb25kdWN0b3JzIGluIHJ1bm5pbmcgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19ydW5uaW5nX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfcnVubmluZ19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfc3RvcmluZ19udW1iZXIgTnVtYmVyIG9mIFByZWdlbCBjb25kdWN0b3JzIGluIHN0b3Jpbmcgc3RhdGVcbiMgVFlQRSBhcmFuZ29kYl9wcmVnZWxfd29ya2Vyc19zdG9yaW5nX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcHJlZ2VsX3dvcmtlcnNfc3RvcmluZ19udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSA0XG4jIEhFTFAgYXJhbmdvZGJfcmVhZF90cmFuc2FjdGlvbnNfdG90YWwgTnVtYmVyIG9mIHJlYWQgdHJhbnNhY3Rpb25zXG4jIFRZUEUgYXJhbmdvZGJfcmVhZF90cmFuc2FjdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVhZF90cmFuc2FjdGlvbnNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA1MDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0IFJUVCBmb3IgQXBwZW5kRW50cmllcyByZXF1ZXN0cyBbdXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dCBoaXN0b2dyYW1cbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzIwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjI1NjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI1MTIwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAyNDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMDQ4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwOTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2FwcGVuZF9lbnRyaWVzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiODE5MjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjM4NDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19hcHBlbmRfZW50cmllc19ydHRfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfYXBwZW5kX2VudHJpZXNfcnR0X3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfY3JlYXRpb25fdG90YWwgTnVtYmVyIG9mIHJlcGxpY2F0ZWQgbG9ncyBjcmVhdGVkIHNpbmNlIHNlcnZlciBzdGFydFxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19jcmVhdGlvbl90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfY3JlYXRpb25fdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2RlbGV0aW9uX3RvdGFsIE51bWJlciBvZiByZXBsaWNhdGVkIGxvZ3MgZGVsZXRlZCBzaW5jZSBzZXJ2ZXIgc3RhcnRcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZGVsZXRpb25fdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2RlbGV0aW9uX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydCBSVCBmb3IgQXBwZW5kRW50cmllcyBjYWxsIFt1c11cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnQgaGlzdG9ncmFtXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMjgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyNTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI1MTIwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDI0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjA0ODAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfZm9sbG93ZXJfYXBwZW5kX2VudHJpZXNfcnRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwOTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MTkyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTYzODQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX2FwcGVuZF9lbnRyaWVzX3J0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19mb2xsb3dlcl9hcHBlbmRfZW50cmllc19ydF9zdW17cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX251bWJlciBOdW1iZXIgb2YgcmVwbGljYXRlZCBsb2dzIHRoaXMgc2VydmVyIGhhcywgYW5kIGlzIGN1cnJlbnRseSBhIGZvbGxvd2VyIG9mXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX251bWJlciBnYXVnZVxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2ZvbGxvd2VyX251bWJlcntyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5hY3RpdmVfbnVtYmVyIE51bWJlciBvZiByZXBsaWNhdGVkIGxvZ3MgdGhpcyBzZXJ2ZXIgaGFzLCBhbmQgaXMgY3VycmVudGx5IG5laXRoZXIgbGVhZGVyIG5vciBmb2xsb3dlciBvZlxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbmFjdGl2ZV9udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbmFjdGl2ZV9udW1iZXJ7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHBlciBpbnNlcnQgaW4gcmVwbGljYXRlZCBsb2cgbGVhZGVyIGluc3RhbmNlcyBvbiB0aGlzIHNlcnZlciBbYnl0ZXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXMgaGlzdG9ncmFtXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMVwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTZcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjY0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyNTZcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwMjRcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwOTZcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2Mzg0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI2NTUzNlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjYyMTQ0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDQ4NTc2XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MTk0MzA0XCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjc3NzIxNlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNjcxMDg4NjRcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfYnl0ZXNfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjI2ODQzNTQ1NlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTA3Mzc0MTgyNFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ieXRlc19jb3VudHtyb2xlPVwiU0lOR0xFXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX2J5dGVzX3N1bXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHQgSGlzdG9ncmFtIG9mIHJvdW5kLXRyaXAgdGltZXMgb2YgcmVwbGljYXRlZCBsb2cgaW5zZXJ0cyBbdXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0IGhpc3RvZ3JhbVxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjQwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTYwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIzMjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjY0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTI4MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMjU2MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTEyMDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMTAyNDAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjIwNDgwMDBcIn0gMFxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2luc2VydHNfcnR0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MDk2MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiODE5MjAwMFwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE2Mzg0MDAwXCJ9IDBcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19pbnNlcnRzX3J0dF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfaW5zZXJ0c19ydHRfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19sZWFkZXJfbnVtYmVyIE51bWJlciBvZiByZXBsaWNhdGVkIGxvZ3MgdGhpcyBzZXJ2ZXIgaGFzLCBhbmQgaXMgY3VycmVudGx5IGEgbGVhZGVyIG9mXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2xlYWRlcl9udW1iZXIgZ2F1Z2VcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19sZWFkZXJfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19sZWFkZXJfdG9va19vdmVyX3RvdGFsIE51bWJlciBvZiB0aW1lcyBhIHJlcGxpY2F0ZWQgbG9nIG9uIHRoaXMgc2VydmVyIHRvb2sgb3ZlciBhcyBsZWFkZXIgaW4gYSB0ZXJtXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2xlYWRlcl90b29rX292ZXJfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX2xlYWRlcl90b29rX292ZXJfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlciBOdW1iZXIgb2YgcmVwbGljYXRlZCBsb2dzIG9uIHRoaXMgYXJhbmdvZGIgaW5zdGFuY2VcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyIGdhdWdlXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVye3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfYWNjZXB0ZWRfZW50cmllc190b3RhbCBOdW1iZXIgb2YgYWNjZXB0ZWQgKG5vdCB5ZXQgY29tbWl0dGVkKSBsb2cgZW50cmllc1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfYWNjZXB0ZWRfZW50cmllc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyX2FjY2VwdGVkX2VudHJpZXNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlcl9jb21taXR0ZWRfZW50cmllc190b3RhbCBOdW1iZXIgb2YgY29tbWl0dGVkIGxvZyBlbnRyaWVzXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlcl9jb21taXR0ZWRfZW50cmllc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyX2NvbW1pdHRlZF9lbnRyaWVzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfY29tcGFjdGVkX2VudHJpZXNfdG90YWwgTnVtYmVyIG9mIGNvbXBhY3RlZCBsb2cgZW50cmllc1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfY29tcGFjdGVkX2VudHJpZXNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX251bWJlcl9jb21wYWN0ZWRfZW50cmllc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfbnVtYmVyX21ldGFfZW50cmllc190b3RhbCBOdW1iZXIgb2YgbWV0YSBsb2cgZW50cmllc1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfbWV0YV9lbnRyaWVzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19udW1iZXJfbWV0YV9lbnRyaWVzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uMl9yZXBsaWNhdGVkX2xvZ19zdGFydGVkX2ZvbGxvd2luZ190b3RhbCBOdW1iZXIgb2YgdGltZXMgYSByZXBsaWNhdGVkIGxvZyBvbiB0aGlzIHNlcnZlciBzdGFydGVkIGZvbGxvd2luZyBhIGxlYWRlciBpbiBhIHRlcm1cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbjJfcmVwbGljYXRlZF9sb2dfc3RhcnRlZF9mb2xsb3dpbmdfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb24yX3JlcGxpY2F0ZWRfbG9nX3N0YXJ0ZWRfZm9sbG93aW5nX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2NsaWVudHMgTnVtYmVyIG9mIHJlcGxpY2F0aW9uIGNsaWVudHMgY29ubmVjdGVkXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fY2xpZW50cyBnYXVnZVxuYXJhbmdvZGJfcmVwbGljYXRpb25fY2xpZW50c3tyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9jbHVzdGVyX2ludmVudG9yeV9yZXF1ZXN0c190b3RhbCAoREMtMi1EQyBvbmx5KSBOdW1iZXIgb2YgdGltZXMgdGhlIGRhdGFiYXNlIGFuZCBjb2xsZWN0aW9uIG92ZXJ2aWV3cyBoYXZlIGJlZW4gcmVxdWVzdGVkLlxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2NsdXN0ZXJfaW52ZW50b3J5X3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2NsdXN0ZXJfaW52ZW50b3J5X3JlcXVlc3RzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfYXBwbHlfdGltZV90b3RhbCBBY2N1bXVsYXRlZCB0aW1lIG5lZWRlZCB0byBhcHBseSBhc3luY2hyb25vdXNseSByZXBsaWNhdGVkIGRhdGEgb24gaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gb2Ygc2hhcmRzLiBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9hcHBseV90aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfYXBwbHlfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9kdW1wX2J5dGVzX3JlY2VpdmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBieXRlcyByZXBsaWNhdGVkIGluIGluaXRpYWwgYXN5bmNocm9ub3VzIHBoYXNlLlxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfYnl0ZXNfcmVjZWl2ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9ieXRlc19yZWNlaXZlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9kdW1wX2RvY3VtZW50c190b3RhbCBUb3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIHJlcGxpY2F0ZWQgaW4gaW5pdGlhbCBhc3luY2hyb25vdXMgcGhhc2UuXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9kb2N1bWVudHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9kb2N1bWVudHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9yZXF1ZXN0X3RpbWVfdG90YWwgQWNjdW11bGF0ZWQgd2FpdCB0aW1lIGZvciByZXBsaWNhdGlvbiByZXF1ZXN0cyBpbiBpbml0aWFsIGFzeW5jaHJvbm91cyBwaGFzZS4gW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfcmVxdWVzdF90aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfcmVxdWVzdF90aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2R1bXBfcmVxdWVzdHNfdG90YWwgTnVtYmVyIG9mIHJlcXVlc3RzIHVzZWQgaW4gaW5pdGlhbCBhc3luY2hyb25vdXMgcmVwbGljYXRpb24gcGhhc2UuXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fZHVtcF9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl9kdW1wX3JlcXVlc3RzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2ZhaWxlZF9jb25uZWN0c190b3RhbCBOdW1iZXIgb2YgZmFpbGVkIGNvbm5lY3Rpb24gYXR0ZW1wdHMgYW5kIHJlc3BvbnNlIGVycm9ycyBkdXJpbmcgaW5pdGlhbCBhc3luY2hyb25vdXMgcmVwbGljYXRpb25cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9mYWlsZWRfY29ubmVjdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fZmFpbGVkX2Nvbm5lY3RzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfY2h1bmtzX3JlcXVlc3RzX3RpbWVfdG90YWwgV2FpdCB0aW1lIGZvciByZXBsaWNhdGlvbiBrZXkgY2h1bmtzIGRldGVybWluYXRpb24gcmVxdWVzdHMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfY2h1bmtzX3JlcXVlc3RzX3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9jaHVua3NfcmVxdWVzdHNfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX2RvY3NfcmVxdWVzdHNfdGltZV90b3RhbCBUaW1lIG5lZWRlZCB0byBhcHBseSByZXBsaWNhdGlvbiBkb2NzIGRhdGEgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfZG9jc19yZXF1ZXN0c190aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfZG9jc19yZXF1ZXN0c190aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfaW5zZXJ0X2FwcGx5X3RpbWVfdG90YWwgVGltZSBuZWVkZWQgdG8gYXBwbHkgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIGluc2VydGlvbnMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfaW5zZXJ0X2FwcGx5X3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9pbnNlcnRfYXBwbHlfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX2tleXNfcmVxdWVzdHNfdGltZV90b3RhbCBXYWl0IHRpbWUgZm9yIHJlcGxpY2F0aW9uIGtleXMgcmVxdWVzdHMgW21zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfa2V5c19yZXF1ZXN0c190aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfa2V5c19yZXF1ZXN0c190aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfcmVtb3ZlX2FwcGx5X3RpbWVfdG90YWwgVGltZSBuZWVkZWQgdG8gYXBwbHkgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIHJlbW92YWxzIFttc11cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3JlbW92ZV9hcHBseV90aW1lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfcmVtb3ZlX2FwcGx5X3RpbWVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2J5dGVzX3JlY2VpdmVkX3RvdGFsIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBkdXJpbmcgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2J5dGVzX3JlY2VpdmVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19ieXRlc19yZWNlaXZlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19pbnNlcnRlZF90b3RhbCBOdW1iZXIgb2YgZG9jdW1lbnRzIGluc2VydGVkIGJ5IHJlcGxpY2F0aW9uIGluaXRpYWwgc3luY1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX2luc2VydGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX2luc2VydGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX3JlbW92ZWRfdG90YWwgTnVtYmVyIG9mIGRvY3VtZW50cyByZW1vdmVkIGJ5IHJlcGxpY2F0aW9uIGluaXRpYWwgc3luY1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX3JlbW92ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2RvY3NfcmVtb3ZlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0ZWRfdG90YWwgTnVtYmVyIG9mIGRvY3VtZW50cyByZXF1ZXN0ZWQgYnkgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25faW5pdGlhbF9zeW5jX2RvY3NfcmVxdWVzdGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX2luaXRpYWxfc3luY19kb2NzX3JlcXVlc3RlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIGRvY3MgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfZG9jc19yZXF1ZXN0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfa2V5c19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gaW5pdGlhbCBzeW5jIGtleXMgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfa2V5c19yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl9pbml0aWFsX3N5bmNfa2V5c19yZXF1ZXN0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9zeW5jaHJvbm91c19yZXF1ZXN0c190b3RhbF9udW1iZXJfdG90YWwgVG90YWwgbnVtYmVyIG9mIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9uIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fc3luY2hyb25vdXNfcmVxdWVzdHNfdG90YWxfbnVtYmVyX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JlcGxpY2F0aW9uX3N5bmNocm9ub3VzX3JlcXVlc3RzX3RvdGFsX251bWJlcl90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl9zeW5jaHJvbm91c19yZXF1ZXN0c190b3RhbF90aW1lX3RvdGFsIFRvdGFsIHRpbWUgbmVlZGVkIGZvciBhbGwgc3luY2hyb25vdXMgcmVwbGljYXRpb24gcmVxdWVzdHMgW25zXVxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3N5bmNocm9ub3VzX3JlcXVlc3RzX3RvdGFsX3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fc3luY2hyb25vdXNfcmVxdWVzdHNfdG90YWxfdGltZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX2FwcGx5X3RpbWVfdG90YWwgVGltZSBuZWVkZWQgdG8gYXBwbHkgcmVwbGljYXRpb24gdGFpbGluZyBkYXRhIFttc11cbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX2FwcGx5X3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19hcHBseV90aW1lX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfYnl0ZXNfcmVjZWl2ZWRfdG90YWwgTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciByZXBsaWNhdGlvbiB0YWlsaW5nIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19ieXRlc19yZWNlaXZlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX2J5dGVzX3JlY2VpdmVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfZG9jdW1lbnRzX3RvdGFsIE51bWJlciBvZiByZXBsaWNhdGlvbiB0YWlsaW5nIGRvY3VtZW50IGluc2VydHMvcmVwbGFjZXMgcHJvY2Vzc2VkXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19kb2N1bWVudHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19kb2N1bWVudHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19mb2xsb3dfdGlja19mYWlsdXJlc190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gdGFpbGluZyBmYWlsdXJlcyBkdWUgdG8gbWlzc2luZyB0aWNrIG9uIGxlYWRlclxuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfZm9sbG93X3RpY2tfZmFpbHVyZXNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19mb2xsb3dfdGlja19mYWlsdXJlc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX21hcmtlcnNfdG90YWwgTnVtYmVyIG9mIHJlcGxpY2F0aW9uIHRhaWxpbmcgbWFya2VycyBwcm9jZXNzZWRcbiMgVFlQRSBhcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX21hcmtlcnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19tYXJrZXJzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfcmVtb3ZhbHNfdG90YWwgTnVtYmVyIG9mIHJlcGxpY2F0aW9uIHRhaWxpbmcgZG9jdW1lbnQgcmVtb3ZhbHMgcHJvY2Vzc2VkXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZW1vdmFsc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXBsaWNhdGlvbl90YWlsaW5nX3JlbW92YWxzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfcmVxdWVzdF90aW1lX3RvdGFsIFdhaXQgdGltZSBmb3IgcmVwbGljYXRpb24gdGFpbGluZyByZXF1ZXN0cyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0X3RpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0X3RpbWVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgcmVwbGljYXRpb24gdGFpbGluZyByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX3JlcGxpY2F0aW9uX3RhaWxpbmdfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmVwbGljYXRpb25fdGFpbGluZ19yZXF1ZXN0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMSBCb2R5IHNpemUgb2YgSFRUUC8xLjEgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMSBoaXN0b2dyYW1cbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxOTFcIn0gMTU2N1xuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDFfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMxOVwifSAxNTcxXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTc1XCJ9IDE1NzFcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDg3XCJ9IDE1NzFcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMTEwXCJ9IDE1NzFcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MTU2XCJ9IDE1NzFcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MjQ4XCJ9IDE1NzFcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAxX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjQzMlwifSAxNTcxXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMV9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzI4MDBcIn0gMTU3MVxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDFfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMTU3MVxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDFfY291bnR7cm9sZT1cIlNJTkdMRVwifSAxNTcxXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMV9zdW17cm9sZT1cIlNJTkdMRVwifSAzNzc1N1xuIyBIRUxQIGFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyIEJvZHkgc2l6ZSBvZiBIVFRQLzIgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMiBoaXN0b2dyYW1cbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxOTFcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDJfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMxOVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNTc1XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxMDg3XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMTEwXCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI0MTU2XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCI4MjQ4XCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX2h0dHAyX2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjQzMlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMl9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiMzI4MDBcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDJfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIitJbmZcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfaHR0cDJfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV9odHRwMl9zdW17cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfdnN0IEJvZHkgc2l6ZSBvZiBWU1QgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3QgaGlzdG9ncmFtXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjE5MVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMxOVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjU3NVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjEwODdcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfdnN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIyMTEwXCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX3ZzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiNDE1NlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjgyNDhcIn0gMFxuYXJhbmdvZGJfcmVxdWVzdF9ib2R5X3NpemVfdnN0X2J1Y2tldHtyb2xlPVwiU0lOR0xFXCIsbGU9XCIxNjQzMlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfYnVja2V0e3JvbGU9XCJTSU5HTEVcIixsZT1cIjMyODAwXCJ9IDBcbmFyYW5nb2RiX3JlcXVlc3RfYm9keV9zaXplX3ZzdF9idWNrZXR7cm9sZT1cIlNJTkdMRVwiLGxlPVwiK0luZlwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3RfY291bnR7cm9sZT1cIlNJTkdMRVwifSAwXG5hcmFuZ29kYl9yZXF1ZXN0X2JvZHlfc2l6ZV92c3Rfc3Vte3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JlcXVlc3Rfc3RhdGlzdGljc19tZW1vcnlfdXNhZ2UgTWVtb3J5IHVzZWQgYnkgdGhlIGludGVybmFsIHJlcXVlc3Qgc3RhdGlzdGljc1xuIyBUWVBFIGFyYW5nb2RiX3JlcXVlc3Rfc3RhdGlzdGljc19tZW1vcnlfdXNhZ2UgZ2F1Z2VcbmFyYW5nb2RiX3JlcXVlc3Rfc3RhdGlzdGljc19tZW1vcnlfdXNhZ2V7cm9sZT1cIlNJTkdMRVwifSAxMTg1NlxuIyBIRUxQIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfaGliZXJuYXRpb25zX3RvdGFsIE51bWJlciBvZiByZXZpc2lvbiB0cmVlIGhpYmVybmF0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfaGliZXJuYXRpb25zX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JldmlzaW9uX3RyZWVfaGliZXJuYXRpb25zX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gNlxuIyBIRUxQIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfbWVtb3J5X3VzYWdlIFRvdGFsIG1lbW9yeSBjb25zdW1lZCBieSBhbGwgcmV2aXNpb24gdHJlZXNcbiMgVFlQRSBhcmFuZ29kYl9yZXZpc2lvbl90cmVlX21lbW9yeV91c2FnZSBnYXVnZVxuYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9tZW1vcnlfdXNhZ2V7cm9sZT1cIlNJTkdMRVwifSAzMjc5NjBcbiMgSEVMUCBhcmFuZ29kYl9yZXZpc2lvbl90cmVlX3JlYnVpbGRzX2ZhaWx1cmVfdG90YWwgTnVtYmVyIG9mIGZhaWxlZCByZXZpc2lvbiB0cmVlIHJlYnVpbGRzXG4jIFRZUEUgYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9yZWJ1aWxkc19mYWlsdXJlX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JldmlzaW9uX3RyZWVfcmVidWlsZHNfZmFpbHVyZV90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9yZXZpc2lvbl90cmVlX3JlYnVpbGRzX3N1Y2Nlc3NfdG90YWwgTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgcmV2aXNpb24gdHJlZSByZWJ1aWxkc1xuIyBUWVBFIGFyYW5nb2RiX3JldmlzaW9uX3RyZWVfcmVidWlsZHNfc3VjY2Vzc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yZXZpc2lvbl90cmVlX3JlYnVpbGRzX3N1Y2Nlc3NfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9yZXN1cnJlY3Rpb25zX3RvdGFsIE51bWJlciBvZiByZXZpc2lvbiB0cmVlIHJlc3VycmVjdGlvbnNcbiMgVFlQRSBhcmFuZ29kYl9yZXZpc2lvbl90cmVlX3Jlc3VycmVjdGlvbnNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcmV2aXNpb25fdHJlZV9yZXN1cnJlY3Rpb25zX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMlxuIyBIRUxQIGFyYW5nb2RiX3JvY2tzZGJfd3JpdGVfc3RhbGxzX3RvdGFsIE51bWJlciBvZiB0aW1lcyBSb2Nrc0RCIGhhcyBlbnRlcmVkIGEgc3RhbGxlZCAoc2xvd2VkKSB3cml0ZSBzdGF0ZVxuIyBUWVBFIGFyYW5nb2RiX3JvY2tzZGJfd3JpdGVfc3RhbGxzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3JvY2tzZGJfd3JpdGVfc3RhbGxzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3JvY2tzZGJfd3JpdGVfc3RvcHNfdG90YWwgTnVtYmVyIG9mIHRpbWVzIFJvY2tzREIgaGFzIGVudGVyZWQgYSBzdG9wcGVkIHdyaXRlIHN0YXRlXG4jIFRZUEUgYXJhbmdvZGJfcm9ja3NkYl93cml0ZV9zdG9wc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9yb2Nrc2RiX3dyaXRlX3N0b3BzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9oYW5kbGVyX3Rhc2tzX2NyZWF0ZWRfdG90YWwgTnVtYmVyIG9mIHNjaGVkdWxlciB0YXNrcyBjcmVhdGVkXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX2hhbmRsZXJfdGFza3NfY3JlYXRlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9zY2hlZHVsZXJfaGFuZGxlcl90YXNrc19jcmVhdGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMTU3MVxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9oaWdoX3ByaW9fcXVldWVfbGVuZ3RoIEN1cnJlbnQgcXVldWUgbGVuZ3RoIG9mIHRoZSBoaWdoIHByaW9yaXR5IHF1ZXVlIGluIHRoZSBzY2hlZHVsZXJcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfaGlnaF9wcmlvX3F1ZXVlX2xlbmd0aCBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX2hpZ2hfcHJpb19xdWV1ZV9sZW5ndGh7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX2pvYnNfZGVxdWV1ZWRfdG90YWwgVG90YWwgbnVtYmVyIG9mIGpvYnMgZGVxdWV1ZWRcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfam9ic19kZXF1ZXVlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9zY2hlZHVsZXJfam9ic19kZXF1ZXVlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDIyMjVcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfam9ic19kb25lX3RvdGFsIFRvdGFsIG51bWJlciBvZiBxdWV1ZSBqb2JzIGRvbmVcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfam9ic19kb25lX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl9qb2JzX2RvbmVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAyMjIzXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX2pvYnNfc3VibWl0dGVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBqb2JzIHN1Ym1pdHRlZCB0byB0aGUgc2NoZWR1bGVyXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX2pvYnNfc3VibWl0dGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl9qb2JzX3N1Ym1pdHRlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDIyMjVcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfbG93X3ByaW9fcXVldWVfbGFzdF9kZXF1ZXVlX3RpbWUgTGFzdCByZWNvcmRlZCBkZXF1ZXVlIHRpbWUgZm9yIGEgbG93IHByaW9yaXR5IHF1ZXVlIGl0ZW0gW21zXVxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9sb3dfcHJpb19xdWV1ZV9sYXN0X2RlcXVldWVfdGltZSBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX2xvd19wcmlvX3F1ZXVlX2xhc3RfZGVxdWV1ZV90aW1le3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9sb3dfcHJpb19xdWV1ZV9sZW5ndGggQ3VycmVudCBxdWV1ZSBsZW5ndGggb2YgdGhlIGxvdyBwcmlvcml0eSBxdWV1ZSBpbiB0aGUgc2NoZWR1bGVyXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX2xvd19wcmlvX3F1ZXVlX2xlbmd0aCBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX2xvd19wcmlvX3F1ZXVlX2xlbmd0aHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfbWFpbnRlbmFuY2VfcHJpb19xdWV1ZV9sZW5ndGggQ3VycmVudCBxdWV1ZSBsZW5ndGggb2YgdGhlIG1haW50ZW5hbmNlIHByaW9yaXR5IHF1ZXVlIGluIHRoZSBzY2hlZHVsZXJcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfbWFpbnRlbmFuY2VfcHJpb19xdWV1ZV9sZW5ndGggZ2F1Z2VcbmFyYW5nb2RiX3NjaGVkdWxlcl9tYWludGVuYW5jZV9wcmlvX3F1ZXVlX2xlbmd0aHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfbWVkaXVtX3ByaW9fcXVldWVfbGVuZ3RoIEN1cnJlbnQgcXVldWUgbGVuZ3RoIG9mIHRoZSBtZWRpdW0gcHJpb3JpdHkgcXVldWUgaW4gdGhlIHNjaGVkdWxlclxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9tZWRpdW1fcHJpb19xdWV1ZV9sZW5ndGggZ2F1Z2VcbmFyYW5nb2RiX3NjaGVkdWxlcl9tZWRpdW1fcHJpb19xdWV1ZV9sZW5ndGh7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX251bV9hd2FrZV90aHJlYWRzIE51bWJlciBvZiBhd2FrZSB3b3JrZXIgdGhyZWFkc1xuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9udW1fYXdha2VfdGhyZWFkcyBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX251bV9hd2FrZV90aHJlYWRze3JvbGU9XCJTSU5HTEVcIn0gMlxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9udW1fZGV0YWNoZWRfdGhyZWFkcyBOdW1iZXIgb2YgZGV0YWNoZWQgd29ya2VyIHRocmVhZHNcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfbnVtX2RldGFjaGVkX3RocmVhZHMgZ2F1Z2VcbmFyYW5nb2RiX3NjaGVkdWxlcl9udW1fZGV0YWNoZWRfdGhyZWFkc3tyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfbnVtX3dvcmtlcl90aHJlYWRzIE51bWJlciBvZiB3b3JrZXIgdGhyZWFkc1xuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9udW1fd29ya2VyX3RocmVhZHMgZ2F1Z2VcbmFyYW5nb2RiX3NjaGVkdWxlcl9udW1fd29ya2VyX3RocmVhZHN7cm9sZT1cIlNJTkdMRVwifSA0XG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX251bV93b3JraW5nX3RocmVhZHMgTnVtYmVyIG9mIHdvcmtpbmcgdGhyZWFkc1xuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9udW1fd29ya2luZ190aHJlYWRzIGdhdWdlXG5hcmFuZ29kYl9zY2hlZHVsZXJfbnVtX3dvcmtpbmdfdGhyZWFkc3tyb2xlPVwiU0lOR0xFXCJ9IDJcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfb25nb2luZ19sb3dfcHJpbyBUb3RhbCBudW1iZXIgb2Ygb25nb2luZyBSZXN0SGFuZGxlcnMgY29taW5nIGZyb20gdGhlIGxvdyBwcmlvIHF1ZXVlXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX29uZ29pbmdfbG93X3ByaW8gZ2F1Z2VcbmFyYW5nb2RiX3NjaGVkdWxlcl9vbmdvaW5nX2xvd19wcmlve3JvbGU9XCJTSU5HTEVcIn0gMlxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9xdWV1ZV9mdWxsX2ZhaWx1cmVzX3RvdGFsIFRhc2tzIGRyb3BwZWQgYW5kIG5vdCBhZGRlZCB0byBpbnRlcm5hbCBxdWV1ZVxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl9xdWV1ZV9mdWxsX2ZhaWx1cmVzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl9xdWV1ZV9mdWxsX2ZhaWx1cmVzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl9xdWV1ZV9sZW5ndGggU2VydmVyJ3MgaW50ZXJuYWwgcXVldWUgbGVuZ3RoXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX2xlbmd0aCBnYXVnZVxuYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX2xlbmd0aHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zY2hlZHVsZXJfcXVldWVfdGltZV92aW9sYXRpb25zX3RvdGFsIFRhc2tzIGRyb3BwZWQgYmVjYXVzZSB0aGUgY2xpZW50LXJlcXVlc3RlZCBxdWV1ZSB0aW1lIHJlc3RyaWN0aW9uIHdvdWxkIGJlIHZpb2xhdGVkXG4jIFRZUEUgYXJhbmdvZGJfc2NoZWR1bGVyX3F1ZXVlX3RpbWVfdmlvbGF0aW9uc190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9zY2hlZHVsZXJfcXVldWVfdGltZV92aW9sYXRpb25zX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3NjaGVkdWxlcl90aHJlYWRzX3N0YXJ0ZWRfdG90YWwgTnVtYmVyIG9mIHNjaGVkdWxlciB0aHJlYWRzIHN0YXJ0ZWRcbiMgVFlQRSBhcmFuZ29kYl9zY2hlZHVsZXJfdGhyZWFkc19zdGFydGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3NjaGVkdWxlcl90aHJlYWRzX3N0YXJ0ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA0XG4jIEhFTFAgYXJhbmdvZGJfc2NoZWR1bGVyX3RocmVhZHNfc3RvcHBlZF90b3RhbCBOdW1iZXIgb2Ygc2NoZWR1bGVyIHRocmVhZHMgc3RvcHBlZFxuIyBUWVBFIGFyYW5nb2RiX3NjaGVkdWxlcl90aHJlYWRzX3N0b3BwZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfc2NoZWR1bGVyX3RocmVhZHNfc3RvcHBlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zZWFyY2hfY29sdW1uc19jYWNoZV9zaXplIEFyYW5nb1NlYXJjaCBjb2x1bW5zIGNhY2hlIHVzYWdlIGluIGJ5dGVzXG4jIFRZUEUgYXJhbmdvZGJfc2VhcmNoX2NvbHVtbnNfY2FjaGVfc2l6ZSBnYXVnZVxuYXJhbmdvZGJfc2VhcmNoX2NvbHVtbnNfY2FjaGVfc2l6ZXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zZWFyY2hfZXhlY3V0aW9uX3RocmVhZHNfZGVtYW5kIE51bWJlciBvZiBBcmFuZ29zZWFyY2ggcGFyYWxsZWwgZXhlY3V0aW9uIHRocmVhZHMgcmVxdWVzdGVkIGJ5IHF1ZXJpZXMuXG4jIFRZUEUgYXJhbmdvZGJfc2VhcmNoX2V4ZWN1dGlvbl90aHJlYWRzX2RlbWFuZCBnYXVnZVxuYXJhbmdvZGJfc2VhcmNoX2V4ZWN1dGlvbl90aHJlYWRzX2RlbWFuZHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl9zZWFyY2hfbnVtX291dF9vZl9zeW5jX2xpbmtzIE51bWJlciBvZiBhcmFuZ29zZWFyY2ggbGlua3MvaW5kZXhlcyBjdXJyZW50bHkgb3V0IG9mIHN5bmNcbiMgVFlQRSBhcmFuZ29kYl9zZWFyY2hfbnVtX291dF9vZl9zeW5jX2xpbmtzIGdhdWdlXG5hcmFuZ29kYl9zZWFyY2hfbnVtX291dF9vZl9zeW5jX2xpbmtze3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19hYm9ydGVkX3RvdGFsIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgYWJvcnRlZFxuIyBUWVBFIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19hYm9ydGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3RyYW5zYWN0aW9uc19hYm9ydGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gNzVcbiMgSEVMUCBhcmFuZ29kYl90cmFuc2FjdGlvbnNfY29tbWl0dGVkX3RvdGFsIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgY29tbWl0dGVkXG4jIFRZUEUgYXJhbmdvZGJfdHJhbnNhY3Rpb25zX2NvbW1pdHRlZF90b3RhbCBjb3VudGVyXG5hcmFuZ29kYl90cmFuc2FjdGlvbnNfY29tbWl0dGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMTYxMFxuIyBIRUxQIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19leHBpcmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiBleHBpcmVkIHRyYW5zYWN0aW9uc1xuIyBUWVBFIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19leHBpcmVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3RyYW5zYWN0aW9uc19leHBpcmVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19zdGFydGVkX3RvdGFsIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgc3RhcnRlZFxuIyBUWVBFIGFyYW5nb2RiX3RyYW5zYWN0aW9uc19zdGFydGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3RyYW5zYWN0aW9uc19zdGFydGVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMTI5NFxuIyBIRUxQIGFyYW5nb2RiX3Y4X2NvbnRleHRfY3JlYXRlZF90b3RhbCBWOCBjb250ZXh0cyBjcmVhdGVkXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9jcmVhdGVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3Y4X2NvbnRleHRfY3JlYXRlZF90b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDNcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2NyZWF0aW9uX3RpbWVfbXNlY190b3RhbCBUb3RhbCB0aW1lIGZvciBjcmVhdGluZyBWOCBjb250ZXh0cyBbbXNdXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9jcmVhdGlvbl90aW1lX21zZWNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdjhfY29udGV4dF9jcmVhdGlvbl90aW1lX21zZWNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAxM1xuIyBIRUxQIGFyYW5nb2RiX3Y4X2NvbnRleHRfZGVzdHJveWVkX3RvdGFsIFY4IGNvbnRleHRzIGRlc3Ryb3llZFxuIyBUWVBFIGFyYW5nb2RiX3Y4X2NvbnRleHRfZGVzdHJveWVkX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3Y4X2NvbnRleHRfZGVzdHJveWVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIGFyYW5nb2RiX3Y4X2NvbnRleHRfZW50ZXJfZmFpbHVyZXNfdG90YWwgVjggY29udGV4dCBlbnRlciBmYWlsdXJlc1xuIyBUWVBFIGFyYW5nb2RiX3Y4X2NvbnRleHRfZW50ZXJfZmFpbHVyZXNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdjhfY29udGV4dF9lbnRlcl9mYWlsdXJlc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2VudGVyZWRfdG90YWwgVjggY29udGV4dCBlbnRlciBldmVudHNcbiMgVFlQRSBhcmFuZ29kYl92OF9jb250ZXh0X2VudGVyZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdjhfY29udGV4dF9lbnRlcmVkX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gNTdcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2V4aXRlZF90b3RhbCBWOCBjb250ZXh0IGV4aXQgZXZlbnRzXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9leGl0ZWRfdG90YWwgY291bnRlclxuYXJhbmdvZGJfdjhfY29udGV4dF9leGl0ZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSA1NVxuIyBIRUxQIGFyYW5nb2RiX3ZzdF9jb25uZWN0aW9uc190b3RhbCBUb3RhbCBudW1iZXIgb2YgVlNUIGNvbm5lY3Rpb25zXG4jIFRZUEUgYXJhbmdvZGJfdnN0X2Nvbm5lY3Rpb25zX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX3ZzdF9jb25uZWN0aW9uc190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCByb2Nrc2RiX2FyY2hpdmVkX3dhbF9maWxlcyBOdW1iZXIgb2YgYXJjaGl2ZWQgUm9ja3NEQiBXQUwgZmlsZXNcbiMgVFlQRSByb2Nrc2RiX2FyY2hpdmVkX3dhbF9maWxlcyBnYXVnZVxucm9ja3NkYl9hcmNoaXZlZF93YWxfZmlsZXN7cm9sZT1cIlNJTkdMRVwifSAxMlxuIyBIRUxQIHJvY2tzZGJfYXJjaGl2ZWRfd2FsX2ZpbGVzX3NpemUgQ3VtdWxhdGVkIHNpemUgb2YgYXJjaGl2ZWQgUm9ja3NEQiBXQUwgZmlsZXNcbiMgVFlQRSByb2Nrc2RiX2FyY2hpdmVkX3dhbF9maWxlc19zaXplIGdhdWdlXG5yb2Nrc2RiX2FyY2hpdmVkX3dhbF9maWxlc19zaXple3JvbGU9XCJTSU5HTEVcIn0gODAxMzA1MlxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfYXV0b19yZWZpbGxfZHJvcHBlZF90b3RhbCBUb3RhbCBudW1iZXIgb2YgZHJvcHBlZCBpdGVtcyBmb3IgaW4tbWVtb3J5IGNhY2hlIHJlZmlsbGluZ1xuIyBUWVBFIHJvY2tzZGJfY2FjaGVfYXV0b19yZWZpbGxfZHJvcHBlZF90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX2F1dG9fcmVmaWxsX2Ryb3BwZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9hdXRvX3JlZmlsbF9sb2FkZWRfdG90YWwgVG90YWwgbnVtYmVyIG9mIGF1dG8tcmVmaWxsZWQgaW4tbWVtb3J5IGNhY2hlIGl0ZW1zXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9hdXRvX3JlZmlsbF9sb2FkZWRfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9hdXRvX3JlZmlsbF9sb2FkZWRfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9lZGdlX2NvbXByZXNzZWRfaW5zZXJ0c190b3RhbCBOdW1iZXIgb2YgY29tcHJlc3NlZCBpbnNlcnRzIGludG8gdGhlIGVkZ2UgY2FjaGVcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2VkZ2VfY29tcHJlc3NlZF9pbnNlcnRzX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfZWRnZV9jb21wcmVzc2VkX2luc2VydHNfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9lZGdlX2VtcHR5X2luc2VydHNfdG90YWwgTnVtYmVyIG9mIGluc2VydHMgaW50byB0aGUgZWRnZSBjYWNoZSB0aGF0IHdlcmUgYW4gZW1wdHkgYXJyYXlcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2VkZ2VfZW1wdHlfaW5zZXJ0c190b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX2VkZ2VfZW1wdHlfaW5zZXJ0c190b3RhbHtyb2xlPVwiU0lOR0xFXCJ9IDNcbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2VkZ2VfaW5zZXJ0c19lZmZlY3RpdmVfZW50cmllc19zaXplX3RvdGFsIFRvdGFsIGVmZmVjdGl2ZSBtZW1vcnkgc2l6ZSBvZiBhbGwgZWRnZSBjYWNoZSBlbnRyaWVzIGV2ZXIgc3RvcmVkIGluIG1lbW9yeSAoYWZ0ZXIgY29tcHJlc3Npb24pXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9lZGdlX2luc2VydHNfZWZmZWN0aXZlX2VudHJpZXNfc2l6ZV90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX2VkZ2VfaW5zZXJ0c19lZmZlY3RpdmVfZW50cmllc19zaXplX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMjk1XG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9lZGdlX2luc2VydHNfdG90YWwgTnVtYmVyIG9mIGluc2VydHMgaW50byB0aGUgZWRnZSBjYWNoZVxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gOFxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX3VuY29tcHJlc3NlZF9lbnRyaWVzX3NpemVfdG90YWwgVG90YWwgZ3Jvc3MgbWVtb3J5IHNpemUgb2YgYWxsIGVkZ2UgY2FjaGUgZW50cmllcyBldmVyIHN0b3JlZCBpbiBtZW1vcnlcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2VkZ2VfaW5zZXJ0c191bmNvbXByZXNzZWRfZW50cmllc19zaXplX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfZWRnZV9pbnNlcnRzX3VuY29tcHJlc3NlZF9lbnRyaWVzX3NpemVfdG90YWx7cm9sZT1cIlNJTkdMRVwifSAyOTVcbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2Z1bGxfaW5kZXhfcmVmaWxsc190b3RhbCBUb3RhbCBudW1iZXIgb2YgY29tcGxldGVkIGZ1bGwgaW5kZXggY2FjaGUgcmVmaWxsc1xuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZnVsbF9pbmRleF9yZWZpbGxzX3RvdGFsIGNvdW50ZXJcbnJvY2tzZGJfY2FjaGVfZnVsbF9pbmRleF9yZWZpbGxzX3RvdGFse3JvbGU9XCJTSU5HTEVcIn0gMFxuIyBIRUxQIHJvY2tzZGJfbGl2ZV93YWxfZmlsZXMgTnVtYmVyIG9mIGxpdmUgUm9ja3NEQiBXQUwgZmlsZXNcbiMgVFlQRSByb2Nrc2RiX2xpdmVfd2FsX2ZpbGVzIGdhdWdlXG5yb2Nrc2RiX2xpdmVfd2FsX2ZpbGVze3JvbGU9XCJTSU5HTEVcIn0gMVxuIyBIRUxQIHJvY2tzZGJfbGl2ZV93YWxfZmlsZXNfc2l6ZSBDdW11bGF0ZWQgc2l6ZSBvZiBsaXZlIFJvY2tzREIgV0FMIGZpbGVzXG4jIFRZUEUgcm9ja3NkYl9saXZlX3dhbF9maWxlc19zaXplIGdhdWdlXG5yb2Nrc2RiX2xpdmVfd2FsX2ZpbGVzX3NpemV7cm9sZT1cIlNJTkdMRVwifSA0MTI0MzlcbiMgSEVMUCByb2Nrc2RiX3BydW5hYmxlX3dhbF9maWxlcyBOdW1iZXIgb2YgcHJ1bmFibGUgUm9ja3NEQiBXQUwgZmlsZXNcbiMgVFlQRSByb2Nrc2RiX3BydW5hYmxlX3dhbF9maWxlcyBnYXVnZVxucm9ja3NkYl9wcnVuYWJsZV93YWxfZmlsZXN7cm9sZT1cIlNJTkdMRVwifSAwXG4jIEhFTFAgcm9ja3NkYl93YWxfcHJ1bmluZ19hY3RpdmUgV2hldGhlciBvciBub3QgUm9ja3NEQiBXQUwgZmlsZSBwcnVuaW5nIGlzIGFjdGl2ZVxuIyBUWVBFIHJvY2tzZGJfd2FsX3BydW5pbmdfYWN0aXZlIGdhdWdlXG5yb2Nrc2RiX3dhbF9wcnVuaW5nX2FjdGl2ZXtyb2xlPVwiU0lOR0xFXCJ9IDBcbiMgSEVMUCByb2Nrc2RiX3dhbF9yZWxlYXNlZF90aWNrX2ZsdXNoIFJlbGVhc2VkIHRpY2sgZm9yIFJvY2tzREIgV0FMIGRlbGV0aW9uIChmbHVzaC1pbmR1Y2VkKVxuIyBUWVBFIHJvY2tzZGJfd2FsX3JlbGVhc2VkX3RpY2tfZmx1c2ggZ2F1Z2VcbnJvY2tzZGJfd2FsX3JlbGVhc2VkX3RpY2tfZmx1c2h7cm9sZT1cIlNJTkdMRVwifSAxODYxOThcbiMgSEVMUCByb2Nrc2RiX3dhbF9yZWxlYXNlZF90aWNrX3JlcGxpY2F0aW9uIFJlbGVhc2VkIHRpY2sgZm9yIFJvY2tzREIgV0FMIGRlbGV0aW9uIChyZXBsaWNhdGlvbi1pbmR1Y2VkKVxuIyBUWVBFIHJvY2tzZGJfd2FsX3JlbGVhc2VkX3RpY2tfcmVwbGljYXRpb24gZ2F1Z2VcbnJvY2tzZGJfd2FsX3JlbGVhc2VkX3RpY2tfcmVwbGljYXRpb257cm9sZT1cIlNJTkdMRVwifSAxODYyMTNcbiMgSEVMUCByb2Nrc2RiX3dhbF9zZXF1ZW5jZV9sb3dlcl9ib3VuZCBSb2Nrc0RCIFdBTCBzZXF1ZW5jZSBudW1iZXIgdW50aWwgd2hpY2ggYmFja2dyb3VuZCB0aHJlYWQgaGFzIGNhdWdodCB1cFxuIyBUWVBFIHJvY2tzZGJfd2FsX3NlcXVlbmNlX2xvd2VyX2JvdW5kIGdhdWdlXG5yb2Nrc2RiX3dhbF9zZXF1ZW5jZV9sb3dlcl9ib3VuZHtyb2xlPVwiU0lOR0xFXCJ9IDE4MDc0NlxuIyBIRUxQIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19taW5vcl9wYWdlX2ZhdWx0c190b3RhbCBUaGUgbnVtYmVyIG9mIG1pbm9yIGZhdWx0cyB0aGUgcHJvY2VzcyBoYXMgbWFkZSB3aGljaCBoYXZlIG5vdCByZXF1aXJlZCBsb2FkaW5nIGEgbWVtb3J5IHBhZ2UgZnJvbSBkaXNrLiBUaGlzIGZpZ3VyZSBpcyBub3QgcmVwb3J0ZWQgb24gV2luZG93c1xuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19taW5vcl9wYWdlX2ZhdWx0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfbWlub3JfcGFnZV9mYXVsdHNfdG90YWx7fSAxNTMzMzdcbiMgSEVMUCBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfbWFqb3JfcGFnZV9mYXVsdHNfdG90YWwgT24gV2luZG93cywgdGhpcyBmaWd1cmUgY29udGFpbnMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlIGZhdWx0cy4gT24gb3RoZXIgc3lzdGVtLCB0aGlzIGZpZ3VyZSBjb250YWlucyB0aGUgbnVtYmVyIG9mIG1ham9yIGZhdWx0cyB0aGUgcHJvY2VzcyBoYXMgbWFkZSB3aGljaCBoYXZlIHJlcXVpcmVkIGxvYWRpbmcgYSBtZW1vcnkgcGFnZSBmcm9tIGRpc2tcbiMgVFlQRSBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfbWFqb3JfcGFnZV9mYXVsdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX21ham9yX3BhZ2VfZmF1bHRzX3RvdGFse30gMFxuIyBIRUxQIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc191c2VyX3RpbWUgQW1vdW50IG9mIHRpbWUgdGhhdCB0aGlzIHByb2Nlc3MgaGFzIGJlZW4gc2NoZWR1bGVkIGluIHVzZXIgbW9kZSwgbWVhc3VyZWQgaW4gc2Vjb25kc1xuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc191c2VyX3RpbWUgZ2F1Z2VcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc191c2VyX3RpbWV7fSA1LjIwMDAwMFxuIyBIRUxQIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19zeXN0ZW1fdGltZSBBbW91bnQgb2YgdGltZSB0aGF0IHRoaXMgcHJvY2VzcyBoYXMgYmVlbiBzY2hlZHVsZWQgaW4ga2VybmVsIG1vZGUsIG1lYXN1cmVkIGluIHNlY29uZHNcbiMgVFlQRSBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3Nfc3lzdGVtX3RpbWUgZ2F1Z2VcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19zeXN0ZW1fdGltZXt9IDEuNzEwMDAwXG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX251bWJlcl9vZl90aHJlYWRzIE51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBhcmFuZ29kIHByb2Nlc3NcbiMgVFlQRSBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfbnVtYmVyX29mX3RocmVhZHMgZ2F1Z2VcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19udW1iZXJfb2ZfdGhyZWFkc3t9IDYzXG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3Jlc2lkZW50X3NldF9zaXplIFRoZSB0b3RhbCBzaXplIG9mIHRoZSBudW1iZXIgb2YgcGFnZXMgdGhlIHByb2Nlc3MgaGFzIGluIHJlYWwgbWVtb3J5LiBUaGlzIGlzIGp1c3QgdGhlIHBhZ2VzIHdoaWNoIGNvdW50IHRvd2FyZCB0ZXh0LCBkYXRhLCBvciBzdGFjayBzcGFjZS4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHBhZ2VzIHdoaWNoIGhhdmUgbm90IGJlZW4gZGVtYW5kLWxvYWRlZCBpbiwgb3Igd2hpY2ggYXJlIHN3YXBwZWQgb3V0LiBUaGUgcmVzaWRlbnQgc2V0IHNpemUgaXMgcmVwb3J0ZWQgaW4gYnl0ZXNcbiMgVFlQRSBhcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfcmVzaWRlbnRfc2V0X3NpemUgZ2F1Z2VcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19yZXNpZGVudF9zZXRfc2l6ZXt9IDI5OTIzNzM3NlxuIyBIRUxQIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19yZXNpZGVudF9zZXRfc2l6ZV9wZXJjZW50IFRoZSByZWxhdGl2ZSBzaXplIG9mIHRoZSBudW1iZXIgb2YgcGFnZXMgdGhlIHByb2Nlc3MgaGFzIGluIHJlYWwgbWVtb3J5IGNvbXBhcmVkIHRvIHN5c3RlbSBtZW1vcnkuIFRoaXMgaXMganVzdCB0aGUgcGFnZXMgd2hpY2ggY291bnQgdG93YXJkIHRleHQsIGRhdGEsIG9yIHN0YWNrIHNwYWNlLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcGFnZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBkZW1hbmQtbG9hZGVkIGluLCBvciB3aGljaCBhcmUgc3dhcHBlZCBvdXQuIFRoZSB2YWx1ZSBpcyBhIHJhdGlvIGJldHdlZW4gMC4wMCBhbmQgMS4wMFxuIyBUWVBFIGFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc19yZXNpZGVudF9zZXRfc2l6ZV9wZXJjZW50IGdhdWdlXG5hcmFuZ29kYl9wcm9jZXNzX3N0YXRpc3RpY3NfcmVzaWRlbnRfc2V0X3NpemVfcGVyY2VudHt9IDAuMDA5MDQzXG4jIEhFTFAgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3ZpcnR1YWxfbWVtb3J5X3NpemUgT24gV2luZG93cywgdGhpcyBmaWd1cmUgY29udGFpbnMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdGhhdCB0aGUgbWVtb3J5IG1hbmFnZXIgaGFzIGNvbW1pdHRlZCBmb3IgdGhlIGFyYW5nb2QgcHJvY2Vzcy4gT24gb3RoZXIgc3lzdGVtcywgdGhpcyBmaWd1cmUgY29udGFpbnMgVGhlIHNpemUgb2YgdGhlIHZpcnR1YWwgbWVtb3J5IHRoZSBwcm9jZXNzIGlzIHVzaW5nXG4jIFRZUEUgYXJhbmdvZGJfcHJvY2Vzc19zdGF0aXN0aWNzX3ZpcnR1YWxfbWVtb3J5X3NpemUgZ2F1Z2VcbmFyYW5nb2RiX3Byb2Nlc3Nfc3RhdGlzdGljc192aXJ0dWFsX21lbW9yeV9zaXple30gMTU1NDk5MzE1MlxuIyBIRUxQIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3BoeXNpY2FsX21lbW9yeSBQaHlzaWNhbCBtZW1vcnkgaW4gYnl0ZXNcbiMgVFlQRSBhcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19waHlzaWNhbF9tZW1vcnkgZ2F1Z2VcbmFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3BoeXNpY2FsX21lbW9yeXt9IDMzMDg5NzUzMDg4XG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3Nfc2VydmVyX3VwdGltZV90b3RhbCBOdW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHNlcnZlciBzdGFydFxuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3NlcnZlcl91cHRpbWVfdG90YWwgY291bnRlclxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3Nfc2VydmVyX3VwdGltZV90b3RhbHt9IDQzLjU5NDM2NFxuIyBIRUxQIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX2NwdV9jb3JlcyBOdW1iZXIgb2YgQ1BVIGNvcmVzIHZpc2libGUgdG8gdGhlIGFyYW5nb2QgcHJvY2Vzc1xuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX2NwdV9jb3JlcyBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfY3B1X2NvcmVze30gOFxuIyBIRUxQIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3VzZXJfcGVyY2VudCBQZXJjZW50YWdlIG9mIHRpbWUgdGhhdCB0aGUgc3lzdGVtIENQVXMgaGF2ZSBzcGVudCBpbiB1c2VyIG1vZGVcbiMgVFlQRSBhcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc191c2VyX3BlcmNlbnQgZ2F1Z2VcbmFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3VzZXJfcGVyY2VudHt9IDMwLjc2OTIzMVxuIyBIRUxQIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3N5c3RlbV9wZXJjZW50IFBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBzeXN0ZW0gQ1BVcyBoYXZlIHNwZW50IGluIGtlcm5lbCBtb2RlXG4jIFRZUEUgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3Nfc3lzdGVtX3BlcmNlbnQgZ2F1Z2VcbmFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX3N5c3RlbV9wZXJjZW50e30gMTAuNzY5MjMxXG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaWRsZV9wZXJjZW50IFBlcmNlbnRhZ2Ugb2YgdGltZSB0aGF0IHRoZSBzeXN0ZW0gQ1BVcyBoYXZlIGJlZW4gaWRsZVxuIyBUWVBFIGFyYW5nb2RiX3NlcnZlcl9zdGF0aXN0aWNzX2lkbGVfcGVyY2VudCBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaWRsZV9wZXJjZW50e30gNTguNDYxNTM4XG4jIEhFTFAgYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaW93YWl0X3BlcmNlbnQgUGVyY2VudGFnZSBvZiB0aW1lIHRoYXQgdGhlIHN5c3RlbSBDUFVzIGhhdmUgYmVlbiB3YWl0aW5nIGZvciBJL09cbiMgVFlQRSBhcmFuZ29kYl9zZXJ2ZXJfc3RhdGlzdGljc19pb3dhaXRfcGVyY2VudCBnYXVnZVxuYXJhbmdvZGJfc2VydmVyX3N0YXRpc3RpY3NfaW93YWl0X3BlcmNlbnR7fSAwLjAwMDAwMFxuIyBIRUxQIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY2xpZW50X2Nvbm5lY3Rpb25zIFRoZSBudW1iZXIgb2YgY2xpZW50IGNvbm5lY3Rpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBvcGVuXG4jIFRZUEUgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jbGllbnRfY29ubmVjdGlvbnMgZ2F1Z2VcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY2xpZW50X2Nvbm5lY3Rpb25ze30gMVxuIyBIRUxQIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY29ubmVjdGlvbl90aW1lIFRvdGFsIGNvbm5lY3Rpb24gdGltZSBvZiBhIGNsaWVudFxuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY29ubmVjdGlvbl90aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jb25uZWN0aW9uX3RpbWVfYnVja2V0e2xlPVwiMC4wMVwifSAwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2Nvbm5lY3Rpb25fdGltZV9idWNrZXR7bGU9XCIxLjBcIn0gMFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jb25uZWN0aW9uX3RpbWVfYnVja2V0e2xlPVwiNjAuMFwifSAwXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2Nvbm5lY3Rpb25fdGltZV9idWNrZXR7bGU9XCIrSW5mXCJ9IDBcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfY29ubmVjdGlvbl90aW1lX2NvdW50e30gMFxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19jb25uZWN0aW9uX3RpbWVfc3Vte30gMC4wMDAwMDBcbiMgSEVMUCBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWUgVG90YWwgdGltZSBuZWVkZWQgdG8gYW5zd2VyIGEgcmVxdWVzdFxuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIwLjAxXCJ9IDE1NTRcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIwLjA1XCJ9IDE1NjJcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIwLjFcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc190b3RhbF90aW1lX2J1Y2tldHtsZT1cIjAuMlwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiMC41XCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfdG90YWxfdGltZV9idWNrZXR7bGU9XCIxLjBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc190b3RhbF90aW1lX2J1Y2tldHtsZT1cIjUuMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiMTUuMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiMzAuMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfYnVja2V0e2xlPVwiK0luZlwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfY291bnR7fSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3RvdGFsX3RpbWVfc3Vte30gMC44MDA2MDJcbiMgSEVMUCBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZSBSZXF1ZXN0IHRpbWUgbmVlZGVkIHRvIGFuc3dlciBhIHJlcXVlc3RcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZSBoaXN0b2dyYW1cbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2J1Y2tldHtsZT1cIjAuMDFcIn0gMTU1N1xuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiMC4wNVwifSAxNTYzXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZV9idWNrZXR7bGU9XCIwLjFcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiMC4yXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2J1Y2tldHtsZT1cIjAuNVwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZV9idWNrZXR7bGU9XCIxLjBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiNS4wXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2J1Y2tldHtsZT1cIjE1LjBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfYnVja2V0e2xlPVwiMzAuMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3JlcXVlc3RfdGltZV9idWNrZXR7bGU9XCIrSW5mXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcmVxdWVzdF90aW1lX2NvdW50e30gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19yZXF1ZXN0X3RpbWVfc3Vte30gMC41NjQ4MjlcbiMgSEVMUCBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3F1ZXVlX3RpbWUgUmVxdWVzdCB0aW1lIG5lZWRlZCB0byBhbnN3ZXIgYSByZXF1ZXN0XG4jIFRZUEUgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lIGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjAuMDFcIn0gMTU2MlxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjAuMDVcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjAuMVwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3F1ZXVlX3RpbWVfYnVja2V0e2xlPVwiMC4yXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIwLjVcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19xdWV1ZV90aW1lX2J1Y2tldHtsZT1cIjEuMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX3F1ZXVlX3RpbWVfYnVja2V0e2xlPVwiNS4wXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIxNS4wXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIzMC4wXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9idWNrZXR7bGU9XCIrSW5mXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9jb3VudHt9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfcXVldWVfdGltZV9zdW17fSAwLjE1MzMxN1xuIyBIRUxQIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfaW9fdGltZSBSZXF1ZXN0IHRpbWUgbmVlZGVkIHRvIGFuc3dlciBhIHJlcXVlc3RcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWUgaGlzdG9ncmFtXG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMC4wMVwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMC4wNVwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMC4xXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfaW9fdGltZV9idWNrZXR7bGU9XCIwLjJcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIjAuNVwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2lvX3RpbWVfYnVja2V0e2xlPVwiMS4wXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfaW9fdGltZV9idWNrZXR7bGU9XCI1LjBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIjE1LjBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIjMwLjBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2J1Y2tldHtsZT1cIitJbmZcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX2NvdW50e30gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19pb190aW1lX3N1bXt9IDAuMDgyNDU2XG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50IEJ5dGVzIHNlbnQgZm9yIHJlc3BvbnNlc1xuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudCBoaXN0b2dyYW1cbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9idWNrZXR7bGU9XCIyNTBcIn0gNlxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDBcIn0gMTQ0MVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjIwMDBcIn0gMTQ0N1xuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjUwMDBcIn0gMTU2MlxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDAwXCJ9IDE1NjRcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9idWNrZXR7bGU9XCIrSW5mXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9jb3VudHt9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9zdW17fSAxMjIzNDg0XG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZCBCeXRlcyByZWNlaXZlZCBmb3IgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkIGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIyNTBcIn0gMTAyOVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfYnVja2V0e2xlPVwiMjAwMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkX2J1Y2tldHtsZT1cIjUwMDBcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkX2J1Y2tldHtsZT1cIitJbmZcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9jb3VudHt9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfc3Vte30gMzY0MTgwXG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnQgQnl0ZXMgc2VudCBmb3IgcmVzcG9uc2VzLCBvbmx5IHVzZXIgdHJhZmZpY1xuIyBUWVBFIGFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50IGhpc3RvZ3JhbVxuYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnRfYnVja2V0e2xlPVwiMjUwXCJ9IDZcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDBcIn0gMTQ0MVxuYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnRfYnVja2V0e2xlPVwiMjAwMFwifSAxNDQ3XG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9idWNrZXR7bGU9XCI1MDAwXCJ9IDE1NjJcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIjEwMDAwXCJ9IDE1NjRcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19zZW50X2J1Y2tldHtsZT1cIitJbmZcIn0gMTU2NVxuYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3NlbnRfY291bnR7fSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfc2VudF9zdW17fSAxMjIzNDg0XG4jIEhFTFAgYXJhbmdvZGJfY2xpZW50X3VzZXJfY29ubmVjdGlvbl9zdGF0aXN0aWNzX2J5dGVzX3JlY2VpdmVkIEJ5dGVzIHJlY2VpdmVkIGZvciByZXF1ZXN0cywgb25seSB1c2VyIHRyYWZmaWNcbiMgVFlQRSBhcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWQgaGlzdG9ncmFtXG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfYnVja2V0e2xlPVwiMjUwXCJ9IDEwMjlcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIyMDAwXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCI1MDAwXCJ9IDE1NjVcbmFyYW5nb2RiX2NsaWVudF91c2VyX2Nvbm5lY3Rpb25fc3RhdGlzdGljc19ieXRlc19yZWNlaXZlZF9idWNrZXR7bGU9XCIxMDAwMFwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfYnVja2V0e2xlPVwiK0luZlwifSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfY291bnR7fSAxNTY1XG5hcmFuZ29kYl9jbGllbnRfdXNlcl9jb25uZWN0aW9uX3N0YXRpc3RpY3NfYnl0ZXNfcmVjZWl2ZWRfc3Vte30gMzY0MTgwXG4jIEhFTFAgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfYXN5bmNfcmVxdWVzdHNfdG90YWwgTnVtYmVyIG9mIGFzeW5jaHJvbm91c2x5IGV4ZWN1dGVkIEhUVFAgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19hc3luY19yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19hc3luY19yZXF1ZXN0c190b3RhbHt9IDZcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2RlbGV0ZV9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBERUxFVEUgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2RlbGV0ZV9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2RlbGV0ZV9yZXF1ZXN0c190b3RhbHt9IDEwN1xuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfZ2V0X3JlcXVlc3RzX3RvdGFsIE51bWJlciBvZiBIVFRQIEdFVCByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfZ2V0X3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfZ2V0X3JlcXVlc3RzX3RvdGFse30gMzk5XG4jIEhFTFAgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9oZWFkX3JlcXVlc3RzX3RvdGFsIE51bWJlciBvZiBIVFRQIEhFQUQgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX2hlYWRfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9oZWFkX3JlcXVlc3RzX3RvdGFse30gMFxuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfb3B0aW9uc19yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBPUFRJT05TIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9vcHRpb25zX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfb3B0aW9uc19yZXF1ZXN0c190b3RhbHt9IDBcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3BhdGNoX3JlcXVlc3RzX3RvdGFsIE51bWJlciBvZiBIVFRQIFBBVENIIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9wYXRjaF9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3BhdGNoX3JlcXVlc3RzX3RvdGFse30gM1xuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfcG9zdF9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBQT1NUIHJlcXVlc3RzXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3NfaHR0cF9wb3N0X3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX2h0dHBfcG9zdF9yZXF1ZXN0c190b3RhbHt9IDEwMjlcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3B1dF9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2YgSFRUUCBQVVQgcmVxdWVzdHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3B1dF9yZXF1ZXN0c190b3RhbCBjb3VudGVyXG5hcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc19odHRwX3B1dF9yZXF1ZXN0c190b3RhbHt9IDI3XG4jIEhFTFAgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3Nfb3RoZXJfaHR0cF9yZXF1ZXN0c190b3RhbCBOdW1iZXIgb2Ygb3RoZXIgSFRUUCByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX290aGVyX2h0dHBfcmVxdWVzdHNfdG90YWwgY291bnRlclxuYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3Nfb3RoZXJfaHR0cF9yZXF1ZXN0c190b3RhbHt9IDBcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc190b3RhbF9yZXF1ZXN0c190b3RhbCBUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0c1xuIyBUWVBFIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3RvdGFsX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3RvdGFsX3JlcXVlc3RzX3RvdGFse30gMTU2NVxuIyBIRUxQIGFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3N1cGVydXNlcl9yZXF1ZXN0c190b3RhbCBUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cyBleGVjdXRlZCBieSBzdXBlcnVzZXIvSldUXG4jIFRZUEUgYXJhbmdvZGJfaHR0cF9yZXF1ZXN0X3N0YXRpc3RpY3Nfc3VwZXJ1c2VyX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3N1cGVydXNlcl9yZXF1ZXN0c190b3RhbHt9IDBcbiMgSEVMUCBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc191c2VyX3JlcXVlc3RzX3RvdGFsIFRvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzIGV4ZWN1dGVkIGJ5IGNsaWVudHNcbiMgVFlQRSBhcmFuZ29kYl9odHRwX3JlcXVlc3Rfc3RhdGlzdGljc191c2VyX3JlcXVlc3RzX3RvdGFsIGNvdW50ZXJcbmFyYW5nb2RiX2h0dHBfcmVxdWVzdF9zdGF0aXN0aWNzX3VzZXJfcmVxdWVzdHNfdG90YWx7fSAxNTY1XG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9hbGl2ZSBOdW1iZXIgb2YgVjggY29udGV4dHMgY3VycmVudGx5IGFsaXZlXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9hbGl2ZSBnYXVnZVxuYXJhbmdvZGJfdjhfY29udGV4dF9hbGl2ZXt9IDNcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2J1c3kgTnVtYmVyIG9mIFY4IGNvbnRleHRzIGN1cnJlbnRseSBidXN5XG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9idXN5IGdhdWdlXG5hcmFuZ29kYl92OF9jb250ZXh0X2J1c3l7fSAyXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9kaXJ0eSBOdW1iZXIgb2YgVjggY29udGV4dHMgY3VycmVudGx5IGRpcnR5XG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9kaXJ0eSBnYXVnZVxuYXJhbmdvZGJfdjhfY29udGV4dF9kaXJ0eXt9IDBcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X2ZyZWUgTnVtYmVyIG9mIFY4IGNvbnRleHRzIGN1cnJlbnRseSBmcmVlXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9mcmVlIGdhdWdlXG5hcmFuZ29kYl92OF9jb250ZXh0X2ZyZWV7fSAxXG4jIEhFTFAgYXJhbmdvZGJfdjhfY29udGV4dF9taW4gTWluaW11bSBudW1iZXIgb2YgY29uY3VycmVudCBWOCBjb250ZXh0c1xuIyBUWVBFIGFyYW5nb2RiX3Y4X2NvbnRleHRfbWluIGdhdWdlXG5hcmFuZ29kYl92OF9jb250ZXh0X21pbnt9IDFcbiMgSEVMUCBhcmFuZ29kYl92OF9jb250ZXh0X21heCBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IFY4IGNvbnRleHRzXG4jIFRZUEUgYXJhbmdvZGJfdjhfY29udGV4dF9tYXggZ2F1Z2VcbmFyYW5nb2RiX3Y4X2NvbnRleHRfbWF4e30gMjhcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfYWN0aXZlX3RhYmxlcyByb2Nrc2RiX2NhY2hlX2FjdGl2ZV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2FjdGl2ZV90YWJsZXMgZ2F1Z2VcbnJvY2tzZGJfY2FjaGVfYWN0aXZlX3RhYmxlcyAwXG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2FsbG9jYXRlZCByb2Nrc2RiX2NhY2hlX2FsbG9jYXRlZFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfYWxsb2NhdGVkIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX2FsbG9jYXRlZCAxMzQ3MTA0XG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2VkZ2VfY29tcHJlc3Npb25fcmF0aW8gcm9ja3NkYl9jYWNoZV9lZGdlX2NvbXByZXNzaW9uX3JhdGlvXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9lZGdlX2NvbXByZXNzaW9uX3JhdGlvIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX2VkZ2VfY29tcHJlc3Npb25fcmF0aW8gMFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc19kdXJhdGlvbl90b3RhbCByb2Nrc2RiX2NhY2hlX2ZyZWVfbWVtb3J5X3Rhc2tzX2R1cmF0aW9uX3RvdGFsXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc19kdXJhdGlvbl90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX2ZyZWVfbWVtb3J5X3Rhc2tzX2R1cmF0aW9uX3RvdGFsIDBcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfZnJlZV9tZW1vcnlfdGFza3NfdG90YWwgcm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc190b3RhbFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfZnJlZV9tZW1vcnlfdGFza3NfdG90YWwgY291bnRlclxucm9ja3NkYl9jYWNoZV9mcmVlX21lbW9yeV90YXNrc190b3RhbCAwXG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX2hpdF9yYXRlX2xpZmV0aW1lIHJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfbGlmZXRpbWVcbiMgVFlQRSByb2Nrc2RiX2NhY2hlX2hpdF9yYXRlX2xpZmV0aW1lIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX2hpdF9yYXRlX2xpZmV0aW1lIDBcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfcmVjZW50IHJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfcmVjZW50XG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9oaXRfcmF0ZV9yZWNlbnQgZ2F1Z2VcbnJvY2tzZGJfY2FjaGVfaGl0X3JhdGVfcmVjZW50IDBcblxuIyBIRUxQIHJvY2tzZGJfY2FjaGVfbGltaXQgcm9ja3NkYl9jYWNoZV9saW1pdFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfbGltaXQgZ2F1Z2VcbnJvY2tzZGJfY2FjaGVfbGltaXQgNzczNTU2NzM2MFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9taWdyYXRlX3Rhc2tzX2R1cmF0aW9uX3RvdGFsIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc19kdXJhdGlvbl90b3RhbFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc19kdXJhdGlvbl90b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX21pZ3JhdGVfdGFza3NfZHVyYXRpb25fdG90YWwgMFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9taWdyYXRlX3Rhc2tzX3RvdGFsIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc190b3RhbFxuIyBUWVBFIHJvY2tzZGJfY2FjaGVfbWlncmF0ZV90YXNrc190b3RhbCBjb3VudGVyXG5yb2Nrc2RiX2NhY2hlX21pZ3JhdGVfdGFza3NfdG90YWwgMFxuXG4jIEhFTFAgcm9ja3NkYl9jYWNoZV9wZWFrX2FsbG9jYXRlZCByb2Nrc2RiX2NhY2hlX3BlYWtfYWxsb2NhdGVkXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV9wZWFrX2FsbG9jYXRlZCBnYXVnZVxucm9ja3NkYl9jYWNoZV9wZWFrX2FsbG9jYXRlZCAxMzk2NjY0XG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX3VudXNlZF9tZW1vcnkgcm9ja3NkYl9jYWNoZV91bnVzZWRfbWVtb3J5XG4jIFRZUEUgcm9ja3NkYl9jYWNoZV91bnVzZWRfbWVtb3J5IGdhdWdlXG5yb2Nrc2RiX2NhY2hlX3VudXNlZF9tZW1vcnkgMjY0MjU2XG5cbiMgSEVMUCByb2Nrc2RiX2NhY2hlX3VudXNlZF90YWJsZXMgcm9ja3NkYl9jYWNoZV91bnVzZWRfdGFibGVzXG4jIFRZUEUgcm9ja3NkYl9jYWNoZV91bnVzZWRfdGFibGVzIGdhdWdlXG5yb2Nrc2RiX2NhY2hlX3VudXNlZF90YWJsZXMgOFxuXG4jIEhFTFAgcm9ja3NkYl9hY3R1YWxfZGVsYXllZF93cml0ZV9yYXRlIHJvY2tzZGJfYWN0dWFsX2RlbGF5ZWRfd3JpdGVfcmF0ZVxuIyBUWVBFIHJvY2tzZGJfYWN0dWFsX2RlbGF5ZWRfd3JpdGVfcmF0ZSBnYXVnZVxucm9ja3NkYl9hY3R1YWxfZGVsYXllZF93cml0ZV9yYXRlIDBcblxuIyBIRUxQIHJvY2tzZGJfYmFja2dyb3VuZF9lcnJvcnMgcm9ja3NkYl9iYWNrZ3JvdW5kX2Vycm9yc1xuIyBUWVBFIHJvY2tzZGJfYmFja2dyb3VuZF9lcnJvcnMgZ2F1Z2VcbnJvY2tzZGJfYmFja2dyb3VuZF9lcnJvcnMgMFxuXG4jIEhFTFAgcm9ja3NkYl9iYXNlX2xldmVsIHJvY2tzZGJfYmFzZV9sZXZlbFxuIyBUWVBFIHJvY2tzZGJfYmFzZV9sZXZlbCBnYXVnZVxucm9ja3NkYl9iYXNlX2xldmVsIDZcblxuIyBIRUxQIHJvY2tzZGJfYmxvY2tfY2FjaGVfY2FwYWNpdHkgcm9ja3NkYl9ibG9ja19jYWNoZV9jYXBhY2l0eVxuIyBUWVBFIHJvY2tzZGJfYmxvY2tfY2FjaGVfY2FwYWNpdHkgZ2F1Z2VcbnJvY2tzZGJfYmxvY2tfY2FjaGVfY2FwYWNpdHkgOTI4MjY4MDgzMlxuXG4jIEhFTFAgcm9ja3NkYl9ibG9ja19jYWNoZV9waW5uZWRfdXNhZ2Ugcm9ja3NkYl9ibG9ja19jYWNoZV9waW5uZWRfdXNhZ2VcbiMgVFlQRSByb2Nrc2RiX2Jsb2NrX2NhY2hlX3Bpbm5lZF91c2FnZSBnYXVnZVxucm9ja3NkYl9ibG9ja19jYWNoZV9waW5uZWRfdXNhZ2UgOTZcblxuIyBIRUxQIHJvY2tzZGJfYmxvY2tfY2FjaGVfdXNhZ2Ugcm9ja3NkYl9ibG9ja19jYWNoZV91c2FnZVxuIyBUWVBFIHJvY2tzZGJfYmxvY2tfY2FjaGVfdXNhZ2UgZ2F1Z2VcbnJvY2tzZGJfYmxvY2tfY2FjaGVfdXNhZ2UgMTQ2ODMyXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXBhY3Rpb25fcGVuZGluZyByb2Nrc2RiX2NvbXBhY3Rpb25fcGVuZGluZ1xuIyBUWVBFIHJvY2tzZGJfY29tcGFjdGlvbl9wZW5kaW5nIGdhdWdlXG5yb2Nrc2RiX2NvbXBhY3Rpb25fcGVuZGluZyAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMFxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwwIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMCAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMSByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMVxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwxIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMSAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMiByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMlxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwyIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMiAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMyByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsM1xuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWwzIGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsMyAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNFxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWw0IGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNCAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNSByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNVxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWw1IGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNSAwXG5cbiMgSEVMUCByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNiByb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNlxuIyBUWVBFIHJvY2tzZGJfY29tcHJlc3Npb25fcmF0aW9fYXRfbGV2ZWw2IGdhdWdlXG5yb2Nrc2RiX2NvbXByZXNzaW9uX3JhdGlvX2F0X2xldmVsNiAxXG5cbiMgSEVMUCByb2Nrc2RiX2N1cl9zaXplX2FjdGl2ZV9tZW1fdGFibGUgcm9ja3NkYl9jdXJfc2l6ZV9hY3RpdmVfbWVtX3RhYmxlXG4jIFRZUEUgcm9ja3NkYl9jdXJfc2l6ZV9hY3RpdmVfbWVtX3RhYmxlIGdhdWdlXG5yb2Nrc2RiX2N1cl9zaXplX2FjdGl2ZV9tZW1fdGFibGUgNjM5ODE1NjhcblxuIyBIRUxQIHJvY2tzZGJfY3VyX3NpemVfYWxsX21lbV90YWJsZXMgcm9ja3NkYl9jdXJfc2l6ZV9hbGxfbWVtX3RhYmxlc1xuIyBUWVBFIHJvY2tzZGJfY3VyX3NpemVfYWxsX21lbV90YWJsZXMgZ2F1Z2VcbnJvY2tzZGJfY3VyX3NpemVfYWxsX21lbV90YWJsZXMgNjM5ODE1NjhcblxuIyBIRUxQIHJvY2tzZGJfZXN0aW1hdGVfbGl2ZV9kYXRhX3NpemUgcm9ja3NkYl9lc3RpbWF0ZV9saXZlX2RhdGFfc2l6ZVxuIyBUWVBFIHJvY2tzZGJfZXN0aW1hdGVfbGl2ZV9kYXRhX3NpemUgZ2F1Z2VcbnJvY2tzZGJfZXN0aW1hdGVfbGl2ZV9kYXRhX3NpemUgMTEwNzQ4XG5cbiMgSEVMUCByb2Nrc2RiX2VzdGltYXRlX251bV9rZXlzIHJvY2tzZGJfZXN0aW1hdGVfbnVtX2tleXNcbiMgVFlQRSByb2Nrc2RiX2VzdGltYXRlX251bV9rZXlzIGdhdWdlXG5yb2Nrc2RiX2VzdGltYXRlX251bV9rZXlzIDIyMjJcblxuIyBIRUxQIHJvY2tzZGJfZXN0aW1hdGVfcGVuZGluZ19jb21wYWN0aW9uX2J5dGVzIHJvY2tzZGJfZXN0aW1hdGVfcGVuZGluZ19jb21wYWN0aW9uX2J5dGVzXG4jIFRZUEUgcm9ja3NkYl9lc3RpbWF0ZV9wZW5kaW5nX2NvbXBhY3Rpb25fYnl0ZXMgZ2F1Z2VcbnJvY2tzZGJfZXN0aW1hdGVfcGVuZGluZ19jb21wYWN0aW9uX2J5dGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfZXN0aW1hdGVfdGFibGVfcmVhZGVyc19tZW0gcm9ja3NkYl9lc3RpbWF0ZV90YWJsZV9yZWFkZXJzX21lbVxuIyBUWVBFIHJvY2tzZGJfZXN0aW1hdGVfdGFibGVfcmVhZGVyc19tZW0gZ2F1Z2VcbnJvY2tzZGJfZXN0aW1hdGVfdGFibGVfcmVhZGVyc19tZW0gMTM2MDhcblxuIyBIRUxQIHJvY2tzZGJfZnJlZV9kaXNrX3NwYWNlIHJvY2tzZGJfZnJlZV9kaXNrX3NwYWNlXG4jIFRZUEUgcm9ja3NkYl9mcmVlX2Rpc2tfc3BhY2UgZ2F1Z2VcbnJvY2tzZGJfZnJlZV9kaXNrX3NwYWNlIDE0MDk1NTQ2MzY4MFxuXG4jIEhFTFAgcm9ja3NkYl9mcmVlX2lub2RlcyByb2Nrc2RiX2ZyZWVfaW5vZGVzXG4jIFRZUEUgcm9ja3NkYl9mcmVlX2lub2RlcyBnYXVnZVxucm9ja3NkYl9mcmVlX2lub2RlcyAxODg5MjczNFxuXG4jIEhFTFAgcm9ja3NkYl9pc19maWxlX2RlbGV0aW9uc19lbmFibGVkIHJvY2tzZGJfaXNfZmlsZV9kZWxldGlvbnNfZW5hYmxlZFxuIyBUWVBFIHJvY2tzZGJfaXNfZmlsZV9kZWxldGlvbnNfZW5hYmxlZCBnYXVnZVxucm9ja3NkYl9pc19maWxlX2RlbGV0aW9uc19lbmFibGVkIDFcblxuIyBIRUxQIHJvY2tzZGJfaXNfd3JpdGVfc3RvcHBlZCByb2Nrc2RiX2lzX3dyaXRlX3N0b3BwZWRcbiMgVFlQRSByb2Nrc2RiX2lzX3dyaXRlX3N0b3BwZWQgZ2F1Z2VcbnJvY2tzZGJfaXNfd3JpdGVfc3RvcHBlZCAwXG5cbiMgSEVMUCByb2Nrc2RiX2xpdmVfc3N0X2ZpbGVzX3NpemUgcm9ja3NkYl9saXZlX3NzdF9maWxlc19zaXplXG4jIFRZUEUgcm9ja3NkYl9saXZlX3NzdF9maWxlc19zaXplIGdhdWdlXG5yb2Nrc2RiX2xpdmVfc3N0X2ZpbGVzX3NpemUgMTIyMzk4XG5cbiMgSEVMUCByb2Nrc2RiX21lbV90YWJsZV9mbHVzaF9wZW5kaW5nIHJvY2tzZGJfbWVtX3RhYmxlX2ZsdXNoX3BlbmRpbmdcbiMgVFlQRSByb2Nrc2RiX21lbV90YWJsZV9mbHVzaF9wZW5kaW5nIGdhdWdlXG5yb2Nrc2RiX21lbV90YWJsZV9mbHVzaF9wZW5kaW5nIDBcblxuIyBIRUxQIHJvY2tzZGJfbWluX2xvZ19udW1iZXJfdG9fa2VlcCByb2Nrc2RiX21pbl9sb2dfbnVtYmVyX3RvX2tlZXBcbiMgVFlQRSByb2Nrc2RiX21pbl9sb2dfbnVtYmVyX3RvX2tlZXAgZ2F1Z2VcbnJvY2tzZGJfbWluX2xvZ19udW1iZXJfdG9fa2VlcCAxMjJcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2RlbGV0ZXNfYWN0aXZlX21lbV90YWJsZSByb2Nrc2RiX251bV9kZWxldGVzX2FjdGl2ZV9tZW1fdGFibGVcbiMgVFlQRSByb2Nrc2RiX251bV9kZWxldGVzX2FjdGl2ZV9tZW1fdGFibGUgZ2F1Z2VcbnJvY2tzZGJfbnVtX2RlbGV0ZXNfYWN0aXZlX21lbV90YWJsZSAzMjQxXG5cbiMgSEVMUCByb2Nrc2RiX251bV9kZWxldGVzX2ltbV9tZW1fdGFibGVzIHJvY2tzZGJfbnVtX2RlbGV0ZXNfaW1tX21lbV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX251bV9kZWxldGVzX2ltbV9tZW1fdGFibGVzIGdhdWdlXG5yb2Nrc2RiX251bV9kZWxldGVzX2ltbV9tZW1fdGFibGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2VudHJpZXNfYWN0aXZlX21lbV90YWJsZSByb2Nrc2RiX251bV9lbnRyaWVzX2FjdGl2ZV9tZW1fdGFibGVcbiMgVFlQRSByb2Nrc2RiX251bV9lbnRyaWVzX2FjdGl2ZV9tZW1fdGFibGUgZ2F1Z2VcbnJvY2tzZGJfbnVtX2VudHJpZXNfYWN0aXZlX21lbV90YWJsZSA3OTc2XG5cbiMgSEVMUCByb2Nrc2RiX251bV9lbnRyaWVzX2ltbV9tZW1fdGFibGVzIHJvY2tzZGJfbnVtX2VudHJpZXNfaW1tX21lbV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX251bV9lbnRyaWVzX2ltbV9tZW1fdGFibGVzIGdhdWdlXG5yb2Nrc2RiX251bV9lbnRyaWVzX2ltbV9tZW1fdGFibGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMCByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDBcbiMgVFlQRSByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDAgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMCAzXG5cbiMgSEVMUCByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDEgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwxXG4jIFRZUEUgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwxIGdhdWdlXG5yb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDEgMFxuXG4jIEhFTFAgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwyIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMlxuIyBUWVBFIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMiBnYXVnZVxucm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWwyIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMyByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDNcbiMgVFlQRSByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDMgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsMyAwXG5cbiMgSEVMUCByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDQgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw0XG4jIFRZUEUgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw0IGdhdWdlXG5yb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDQgMFxuXG4jIEhFTFAgcm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw1IHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNVxuIyBUWVBFIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNSBnYXVnZVxucm9ja3NkYl9udW1fZmlsZXNfYXRfbGV2ZWw1IDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNiByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDZcbiMgVFlQRSByb2Nrc2RiX251bV9maWxlc19hdF9sZXZlbDYgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ZpbGVzX2F0X2xldmVsNiA0XG5cbiMgSEVMUCByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlIHJvY2tzZGJfbnVtX2ltbXV0YWJsZV9tZW1fdGFibGVcbiMgVFlQRSByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlIGdhdWdlXG5yb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX2ltbXV0YWJsZV9tZW1fdGFibGVfZmx1c2hlZCByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlX2ZsdXNoZWRcbiMgVFlQRSByb2Nrc2RiX251bV9pbW11dGFibGVfbWVtX3RhYmxlX2ZsdXNoZWQgZ2F1Z2VcbnJvY2tzZGJfbnVtX2ltbXV0YWJsZV9tZW1fdGFibGVfZmx1c2hlZCA0XG5cbiMgSEVMUCByb2Nrc2RiX251bV9saXZlX3ZlcnNpb25zIHJvY2tzZGJfbnVtX2xpdmVfdmVyc2lvbnNcbiMgVFlQRSByb2Nrc2RiX251bV9saXZlX3ZlcnNpb25zIGdhdWdlXG5yb2Nrc2RiX251bV9saXZlX3ZlcnNpb25zIDlcblxuIyBIRUxQIHJvY2tzZGJfbnVtX3J1bm5pbmdfY29tcGFjdGlvbnMgcm9ja3NkYl9udW1fcnVubmluZ19jb21wYWN0aW9uc1xuIyBUWVBFIHJvY2tzZGJfbnVtX3J1bm5pbmdfY29tcGFjdGlvbnMgZ2F1Z2VcbnJvY2tzZGJfbnVtX3J1bm5pbmdfY29tcGFjdGlvbnMgMFxuXG4jIEhFTFAgcm9ja3NkYl9udW1fcnVubmluZ19mbHVzaGVzIHJvY2tzZGJfbnVtX3J1bm5pbmdfZmx1c2hlc1xuIyBUWVBFIHJvY2tzZGJfbnVtX3J1bm5pbmdfZmx1c2hlcyBnYXVnZVxucm9ja3NkYl9udW1fcnVubmluZ19mbHVzaGVzIDBcblxuIyBIRUxQIHJvY2tzZGJfbnVtX3NuYXBzaG90cyByb2Nrc2RiX251bV9zbmFwc2hvdHNcbiMgVFlQRSByb2Nrc2RiX251bV9zbmFwc2hvdHMgZ2F1Z2VcbnJvY2tzZGJfbnVtX3NuYXBzaG90cyAyXG5cbiMgSEVMUCByb2Nrc2RiX29sZGVzdF9zbmFwc2hvdF90aW1lIHJvY2tzZGJfb2xkZXN0X3NuYXBzaG90X3RpbWVcbiMgVFlQRSByb2Nrc2RiX29sZGVzdF9zbmFwc2hvdF90aW1lIGdhdWdlXG5yb2Nrc2RiX29sZGVzdF9zbmFwc2hvdF90aW1lIDE3NDgwMjQxNzJcblxuIyBIRUxQIHJvY2tzZGJfcmVhZF9vbmx5IHJvY2tzZGJfcmVhZF9vbmx5XG4jIFRZUEUgcm9ja3NkYl9yZWFkX29ubHkgZ2F1Z2VcbnJvY2tzZGJfcmVhZF9vbmx5IDBcblxuIyBIRUxQIHJvY2tzZGJfc2l6ZV9hbGxfbWVtX3RhYmxlcyByb2Nrc2RiX3NpemVfYWxsX21lbV90YWJsZXNcbiMgVFlQRSByb2Nrc2RiX3NpemVfYWxsX21lbV90YWJsZXMgZ2F1Z2VcbnJvY2tzZGJfc2l6ZV9hbGxfbWVtX3RhYmxlcyA5MzM1NTI0MFxuXG4jIEhFTFAgcm9ja3NkYl90b3RhbF9kaXNrX3NwYWNlIHJvY2tzZGJfdG90YWxfZGlza19zcGFjZVxuIyBUWVBFIHJvY2tzZGJfdG90YWxfZGlza19zcGFjZSBnYXVnZVxucm9ja3NkYl90b3RhbF9kaXNrX3NwYWNlIDE1NTg5NzYxMDI0MFxuXG4jIEhFTFAgcm9ja3NkYl90b3RhbF9pbm9kZXMgcm9ja3NkYl90b3RhbF9pbm9kZXNcbiMgVFlQRSByb2Nrc2RiX3RvdGFsX2lub2RlcyBnYXVnZVxucm9ja3NkYl90b3RhbF9pbm9kZXMgMTkzNTM2MDBcblxuIyBIRUxQIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzXG4jIFRZUEUgcm9ja3NkYl90b3RhbF9zc3RfZmlsZXMgZ2F1Z2VcbnJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzIDdcblxuIyBIRUxQIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzX3NpemUgcm9ja3NkYl90b3RhbF9zc3RfZmlsZXNfc2l6ZVxuIyBUWVBFIHJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzX3NpemUgZ2F1Z2VcbnJvY2tzZGJfdG90YWxfc3N0X2ZpbGVzX3NpemUgMTIyMzk4XG5cbiMgSEVMUCByb2Nrc2RiX3dhbF9zZXF1ZW5jZSByb2Nrc2RiX3dhbF9zZXF1ZW5jZVxuIyBUWVBFIHJvY2tzZGJfd2FsX3NlcXVlbmNlIGdhdWdlXG5yb2Nrc2RiX3dhbF9zZXF1ZW5jZSAxODg3MDhcblxuIyBIRUxQIHJvY2tzZGJfZW5naW5lX3Rocm90dGxlX2JwcyByb2Nrc2RiX2VuZ2luZV90aHJvdHRsZV9icHNcbiMgVFlQRSByb2Nrc2RiX2VuZ2luZV90aHJvdHRsZV9icHMgZ2F1Z2VcbnJvY2tzZGJfZW5naW5lX3Rocm90dGxlX2JwcyAwIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RBZG1pbk1ldHJpY3MiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestAdminStatistics1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5TdGF0aXN0aWNzMQotLS0KdmFyIHVybCA9ICIvX2FkbWluL3N0YXRpc3RpY3MiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYWRtaW4vc3RhdGlzdGljcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIzNDNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJ0aW1lXCIgOiAxNzQ4MDI0MTc3LjAzODY0NCwgXG4gIFwiZW5hYmxlZFwiIDogdHJ1ZSwgXG4gIFwic3lzdGVtXCIgOiB7IFxuICAgIFwibWlub3JQYWdlRmF1bHRzXCIgOiAxNTMzMzksIFxuICAgIFwibWFqb3JQYWdlRmF1bHRzXCIgOiAwLCBcbiAgICBcInVzZXJUaW1lXCIgOiA1LjIsIFxuICAgIFwic3lzdGVtVGltZVwiIDogMS43MSwgXG4gICAgXCJudW1iZXJPZlRocmVhZHNcIiA6IDYzLCBcbiAgICBcInJlc2lkZW50U2l6ZVwiIDogMjk5MjM3Mzc2LCBcbiAgICBcInJlc2lkZW50U2l6ZVBlcmNlbnRcIiA6IDAuMDA5MDQzMjAzNjUyOTMxNDEsIFxuICAgIFwidmlydHVhbFNpemVcIiA6IDE1NTQ5OTMxNTIgXG4gIH0sIFxuICBcImNsaWVudFwiIDogeyBcbiAgICBcImh0dHBDb25uZWN0aW9uc1wiIDogMSwgXG4gICAgXCJjb25uZWN0aW9uVGltZVwiIDogeyBcbiAgICAgIFwic3VtXCIgOiAwLCBcbiAgICAgIFwiY291bnRcIiA6IDAsIFxuICAgICAgXCJjb3VudHNcIiA6IFsgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwidG90YWxUaW1lXCIgOiB7IFxuICAgICAgXCJzdW1cIiA6IDAuODAxNDc2NDc4NTc2NjYwMiwgXG4gICAgICBcImNvdW50XCIgOiAxNTY2LCBcbiAgICAgIFwiY291bnRzXCIgOiBbIFxuICAgICAgICAxNTU1LCBcbiAgICAgICAgOCwgXG4gICAgICAgIDMsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcInJlcXVlc3RUaW1lXCIgOiB7IFxuICAgICAgXCJzdW1cIiA6IDAuNTY1NTU0ODU3MjU0MDI4MywgXG4gICAgICBcImNvdW50XCIgOiAxNTY2LCBcbiAgICAgIFwiY291bnRzXCIgOiBbIFxuICAgICAgICAxNTU4LCBcbiAgICAgICAgNiwgXG4gICAgICAgIDIsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcInF1ZXVlVGltZVwiIDogeyBcbiAgICAgIFwic3VtXCIgOiAwLjE1MzMzMzkwMjM1OTAwODgsIFxuICAgICAgXCJjb3VudFwiIDogMTU2NiwgXG4gICAgICBcImNvdW50c1wiIDogWyBcbiAgICAgICAgMTU2MywgXG4gICAgICAgIDMsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgXCJpb1RpbWVcIiA6IHsgXG4gICAgICBcInN1bVwiIDogMC4wODI1ODc3MTg5NjM2MjMwNSwgXG4gICAgICBcImNvdW50XCIgOiAxNTY2LCBcbiAgICAgIFwiY291bnRzXCIgOiBbIFxuICAgICAgICAxNTY2LCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcImJ5dGVzU2VudFwiIDogeyBcbiAgICAgIFwic3VtXCIgOiAxMzAzODkwLCBcbiAgICAgIFwiY291bnRcIiA6IDE1NjYsIFxuICAgICAgXCJjb3VudHNcIiA6IFsgXG4gICAgICAgIDYsIFxuICAgICAgICAxNDM1LCBcbiAgICAgICAgNiwgXG4gICAgICAgIDExNSwgXG4gICAgICAgIDIsIFxuICAgICAgICAyIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcImJ5dGVzUmVjZWl2ZWRcIiA6IHsgXG4gICAgICBcInN1bVwiIDogMzY0MzI2LCBcbiAgICAgIFwiY291bnRcIiA6IDE1NjYsIFxuICAgICAgXCJjb3VudHNcIiA6IFsgXG4gICAgICAgIDEwMzAsIFxuICAgICAgICA1MzYsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwIFxuICAgICAgXSBcbiAgICB9IFxuICB9LCBcbiAgXCJjbGllbnRVc2VyXCIgOiB7IFxuICAgIFwiaHR0cENvbm5lY3Rpb25zXCIgOiAxLCBcbiAgICBcImNvbm5lY3Rpb25UaW1lXCIgOiB7IFxuICAgICAgXCJzdW1cIiA6IDAsIFxuICAgICAgXCJjb3VudFwiIDogMCwgXG4gICAgICBcImNvdW50c1wiIDogWyBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgXCJ0b3RhbFRpbWVcIiA6IHsgXG4gICAgICBcInN1bVwiIDogMC44MDE0NzY0Nzg1NzY2NjAyLCBcbiAgICAgIFwiY291bnRcIiA6IDE1NjYsIFxuICAgICAgXCJjb3VudHNcIiA6IFsgXG4gICAgICAgIDE1NTUsIFxuICAgICAgICA4LCBcbiAgICAgICAgMywgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwicmVxdWVzdFRpbWVcIiA6IHsgXG4gICAgICBcInN1bVwiIDogMC41NjU1NTQ4NTcyNTQwMjgzLCBcbiAgICAgIFwiY291bnRcIiA6IDE1NjYsIFxuICAgICAgXCJjb3VudHNcIiA6IFsgXG4gICAgICAgIDE1NTgsIFxuICAgICAgICA2LCBcbiAgICAgICAgMiwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwicXVldWVUaW1lXCIgOiB7IFxuICAgICAgXCJzdW1cIiA6IDAuMTUzMzMzOTAyMzU5MDA4OCwgXG4gICAgICBcImNvdW50XCIgOiAxNTY2LCBcbiAgICAgIFwiY291bnRzXCIgOiBbIFxuICAgICAgICAxNTYzLCBcbiAgICAgICAgMywgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcImlvVGltZVwiIDogeyBcbiAgICAgIFwic3VtXCIgOiAwLjA4MjU4NzcxODk2MzYyMzA1LCBcbiAgICAgIFwiY291bnRcIiA6IDE1NjYsIFxuICAgICAgXCJjb3VudHNcIiA6IFsgXG4gICAgICAgIDE1NjYsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwiYnl0ZXNTZW50XCIgOiB7IFxuICAgICAgXCJzdW1cIiA6IDEzMDM4OTAsIFxuICAgICAgXCJjb3VudFwiIDogMTU2NiwgXG4gICAgICBcImNvdW50c1wiIDogWyBcbiAgICAgICAgNiwgXG4gICAgICAgIDE0MzUsIFxuICAgICAgICA2LCBcbiAgICAgICAgMTE1LCBcbiAgICAgICAgMiwgXG4gICAgICAgIDIgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwiYnl0ZXNSZWNlaXZlZFwiIDogeyBcbiAgICAgIFwic3VtXCIgOiAzNjQzMjYsIFxuICAgICAgXCJjb3VudFwiIDogMTU2NiwgXG4gICAgICBcImNvdW50c1wiIDogWyBcbiAgICAgICAgMTAzMCwgXG4gICAgICAgIDUzNiwgXG4gICAgICAgIDAsIFxuICAgICAgICAwLCBcbiAgICAgICAgMCwgXG4gICAgICAgIDAgXG4gICAgICBdIFxuICAgIH0gXG4gIH0sIFxuICBcImh0dHBcIiA6IHsgXG4gICAgXCJyZXF1ZXN0c1RvdGFsXCIgOiAxNTY2LCBcbiAgICBcInJlcXVlc3RzU3VwZXJ1c2VyXCIgOiAwLCBcbiAgICBcInJlcXVlc3RzVXNlclwiIDogMTU2NiwgXG4gICAgXCJyZXF1ZXN0c0FzeW5jXCIgOiA2LCBcbiAgICBcInJlcXVlc3RzR2V0XCIgOiA0MDAsIFxuICAgIFwicmVxdWVzdHNIZWFkXCIgOiAwLCBcbiAgICBcInJlcXVlc3RzUG9zdFwiIDogMTAyOSwgXG4gICAgXCJyZXF1ZXN0c1B1dFwiIDogMjcsIFxuICAgIFwicmVxdWVzdHNQYXRjaFwiIDogMywgXG4gICAgXCJyZXF1ZXN0c0RlbGV0ZVwiIDogMTA3LCBcbiAgICBcInJlcXVlc3RzT3B0aW9uc1wiIDogMCwgXG4gICAgXCJyZXF1ZXN0c090aGVyXCIgOiAwIFxuICB9LCBcbiAgXCJzZXJ2ZXJcIiA6IHsgXG4gICAgXCJ1cHRpbWVcIiA6IDQzLjcwMTUzNTQ2MzMzMzEzLCBcbiAgICBcInBoeXNpY2FsTWVtb3J5XCIgOiAzMzA4OTc1MzA4OCwgXG4gICAgXCJ0cmFuc2FjdGlvbnNcIiA6IHsgXG4gICAgICBcInN0YXJ0ZWRcIiA6IDEyOTQsIFxuICAgICAgXCJhYm9ydGVkXCIgOiA3NSwgXG4gICAgICBcImNvbW1pdHRlZFwiIDogMTYxMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAsIFxuICAgICAgXCJyZWFkT25seVwiIDogNTAwLCBcbiAgICAgIFwiZGlydHlSZWFkT25seVwiIDogMCBcbiAgICB9LCBcbiAgICBcInY4Q29udGV4dFwiIDogeyBcbiAgICAgIFwiYXZhaWxhYmxlXCIgOiAzLCBcbiAgICAgIFwiYnVzeVwiIDogMiwgXG4gICAgICBcImRpcnR5XCIgOiAwLCBcbiAgICAgIFwiZnJlZVwiIDogMSwgXG4gICAgICBcIm1heFwiIDogMjgsIFxuICAgICAgXCJtaW5cIiA6IDEsIFxuICAgICAgXCJtZW1vcnlcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJjb250ZXh0SWRcIiA6IDAsIFxuICAgICAgICAgIFwidE1heFwiIDogMTc0ODAyNDEzMy41ODMzMzQ0LCBcbiAgICAgICAgICBcImNvdW50T2ZUaW1lc1wiIDogOCwgXG4gICAgICAgICAgXCJoZWFwTWF4XCIgOiAxNDkwODQ0MCwgXG4gICAgICAgICAgXCJoZWFwTWluXCIgOiAwLCBcbiAgICAgICAgICBcImludm9jYXRpb25zXCIgOiA0MyBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJjb250ZXh0SWRcIiA6IDEsIFxuICAgICAgICAgIFwidE1heFwiIDogMTc0ODAyNDE3Mi44MTkzMjAyLCBcbiAgICAgICAgICBcImNvdW50T2ZUaW1lc1wiIDogOCwgXG4gICAgICAgICAgXCJoZWFwTWF4XCIgOiAxNDk1NjQwMCwgXG4gICAgICAgICAgXCJoZWFwTWluXCIgOiAwLCBcbiAgICAgICAgICBcImludm9jYXRpb25zXCIgOiAzIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcImNvbnRleHRJZFwiIDogMiwgXG4gICAgICAgICAgXCJ0TWF4XCIgOiAxNzQ4MDI0MTcyLjkxNjA3NzYsIFxuICAgICAgICAgIFwiY291bnRPZlRpbWVzXCIgOiA4LCBcbiAgICAgICAgICBcImhlYXBNYXhcIiA6IDE0ODU1Nzc2LCBcbiAgICAgICAgICBcImhlYXBNaW5cIiA6IDAsIFxuICAgICAgICAgIFwiaW52b2NhdGlvbnNcIiA6IDE4IFxuICAgICAgICB9IFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcInRocmVhZHNcIiA6IHsgXG4gICAgICBcInNjaGVkdWxlci10aHJlYWRzXCIgOiA0LCBcbiAgICAgIFwiYmxvY2tlZFwiIDogMCwgXG4gICAgICBcInF1ZXVlZFwiIDogMywgXG4gICAgICBcImluLXByb2dyZXNzXCIgOiAzLCBcbiAgICAgIFwiZGlyZWN0LWV4ZWNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RBZG1pblN0YXRpc3RpY3MxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestAdminStatisticsDescription1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5TdGF0aXN0aWNzRGVzY3JpcHRpb24xCi0tLQp2YXIgdXJsID0gIi9fYWRtaW4vc3RhdGlzdGljcy1kZXNjcmlwdGlvbiI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYWRtaW4vc3RhdGlzdGljcy1kZXNjcmlwdGlvbiciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc4OTJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJncm91cHNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwic3lzdGVtXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlByb2Nlc3MgU3RhdGlzdGljc1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiU3RhdGlzdGljcyBhYm91dCB0aGUgQXJhbmdvREIgcHJvY2Vzc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJDbGllbnQgQ29ubmVjdGlvbiBTdGF0aXN0aWNzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJTdGF0aXN0aWNzIGFib3V0IHRoZSBjb25uZWN0aW9ucy5cIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRVc2VyXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkNsaWVudCBVc2VyIENvbm5lY3Rpb24gU3RhdGlzdGljc1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiU3RhdGlzdGljcyBhYm91dCB0aGUgY29ubmVjdGlvbnMsIG9ubHkgdXNlciB0cmFmZmljIChpZ25vcmluZyBzdXBlcnVzZXIgSldUIHRyYWZmaWMpLlwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImh0dHBcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiSFRUUCBSZXF1ZXN0IFN0YXRpc3RpY3NcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlN0YXRpc3RpY3MgYWJvdXQgdGhlIEhUVFAgcmVxdWVzdHMuXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwic2VydmVyXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlNlcnZlciBTdGF0aXN0aWNzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJTdGF0aXN0aWNzIGFib3V0IHRoZSBBcmFuZ29EQiBzZXJ2ZXJcIiBcbiAgICB9IFxuICBdLCBcbiAgXCJmaWd1cmVzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcInN5c3RlbVwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJ1c2VyVGltZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJVc2VyIFRpbWVcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkFtb3VudCBvZiB0aW1lIHRoYXQgdGhpcyBwcm9jZXNzIGhhcyBiZWVuIHNjaGVkdWxlZCBpbiB1c2VyIG1vZGUsIG1lYXN1cmVkIGluIHNlY29uZHMuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImFjY3VtdWxhdGVkXCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJzZWNvbmRzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwic3lzdGVtXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcInN5c3RlbVRpbWVcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiU3lzdGVtIFRpbWVcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkFtb3VudCBvZiB0aW1lIHRoYXQgdGhpcyBwcm9jZXNzIGhhcyBiZWVuIHNjaGVkdWxlZCBpbiBrZXJuZWwgbW9kZSwgbWVhc3VyZWQgaW4gc2Vjb25kcy5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiYWNjdW11bGF0ZWRcIiwgXG4gICAgICBcInVuaXRzXCIgOiBcInNlY29uZHNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJzeXN0ZW1cIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwibnVtYmVyT2ZUaHJlYWRzXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIk51bWJlciBvZiBUaHJlYWRzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJOdW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgYXJhbmdvZCBwcm9jZXNzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJjdXJyZW50XCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJudW1iZXJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJzeXN0ZW1cIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwicmVzaWRlbnRTaXplXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlJlc2lkZW50IFNldCBTaXplXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJUaGUgdG90YWwgc2l6ZSBvZiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoZSBwcm9jZXNzIGhhcyBpbiByZWFsIG1lbW9yeS4gVGhpcyBpcyBqdXN0IHRoZSBwYWdlcyB3aGljaCBjb3VudCB0b3dhcmQgdGV4dCwgZGF0YSwgb3Igc3RhY2sgc3BhY2UuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBwYWdlcyB3aGljaCBoYXZlIG5vdCBiZWVuIGRlbWFuZC1sb2FkZWQgaW4sIG9yIHdoaWNoIGFyZSBzd2FwcGVkIG91dC4gVGhlIHJlc2lkZW50IHNldCBzaXplIGlzIHJlcG9ydGVkIGluIGJ5dGVzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJjdXJyZW50XCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJieXRlc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcInN5c3RlbVwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXNpZGVudFNpemVQZXJjZW50XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlJlc2lkZW50IFNldCBTaXplXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJUaGUgcGVyY2VudGFnZSBvZiBwaHlzaWNhbCBtZW1vcnkgdXNlZCBieSB0aGUgcHJvY2VzcyBhcyByZXNpZGVudCBzZXQgc2l6ZS5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiY3VycmVudFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwicGVyY2VudFwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcInN5c3RlbVwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJ2aXJ0dWFsU2l6ZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJWaXJ0dWFsIE1lbW9yeSBTaXplXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJPbiBXaW5kb3dzLCB0aGlzIGZpZ3VyZSBjb250YWlucyB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHRoZSBtZW1vcnkgbWFuYWdlciBoYXMgY29tbWl0dGVkIGZvciB0aGUgYXJhbmdvZCBwcm9jZXNzLiBPbiBvdGhlciBzeXN0ZW1zLCB0aGlzIGZpZ3VyZSBjb250YWlucyBUaGUgc2l6ZSBvZiB0aGUgdmlydHVhbCBtZW1vcnkgdGhlIHByb2Nlc3MgaXMgdXNpbmcuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImN1cnJlbnRcIiwgXG4gICAgICBcInVuaXRzXCIgOiBcImJ5dGVzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwic3lzdGVtXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcIm1pbm9yUGFnZUZhdWx0c1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJNaW5vciBQYWdlIEZhdWx0c1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVGhlIG51bWJlciBvZiBtaW5vciBmYXVsdHMgdGhlIHByb2Nlc3MgaGFzIG1hZGUgd2hpY2ggaGF2ZSBub3QgcmVxdWlyZWQgbG9hZGluZyBhIG1lbW9yeSBwYWdlIGZyb20gZGlzay4gVGhpcyBmaWd1cmUgaXMgbm90IHJlcG9ydGVkIG9uIFdpbmRvd3MuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImFjY3VtdWxhdGVkXCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJudW1iZXJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJzeXN0ZW1cIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwibWFqb3JQYWdlRmF1bHRzXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIk1ham9yIFBhZ2UgRmF1bHRzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJPbiBXaW5kb3dzLCB0aGlzIGZpZ3VyZSBjb250YWlucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzLiBPbiBvdGhlciBzeXN0ZW0sIHRoaXMgZmlndXJlIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgbWFqb3IgZmF1bHRzIHRoZSBwcm9jZXNzIGhhcyBtYWRlIHdoaWNoIGhhdmUgcmVxdWlyZWQgbG9hZGluZyBhIG1lbW9yeSBwYWdlIGZyb20gZGlzay5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiYWNjdW11bGF0ZWRcIiwgXG4gICAgICBcInVuaXRzXCIgOiBcIm51bWJlclwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJodHRwQ29ubmVjdGlvbnNcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQ2xpZW50IENvbm5lY3Rpb25zXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJUaGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBvcGVuLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJjdXJyZW50XCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJudW1iZXJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwidG90YWxUaW1lXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlRvdGFsIFRpbWVcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlRvdGFsIHRpbWUgbmVlZGVkIHRvIGFuc3dlciBhIHJlcXVlc3QuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImRpc3RyaWJ1dGlvblwiLCBcbiAgICAgIFwiY3V0c1wiIDogWyBcbiAgICAgICAgMC4wMSwgXG4gICAgICAgIDAuMDUsIFxuICAgICAgICAwLjEsIFxuICAgICAgICAwLjIsIFxuICAgICAgICAwLjUsIFxuICAgICAgICAxLCBcbiAgICAgICAgNSwgXG4gICAgICAgIDE1LCBcbiAgICAgICAgMzAgXG4gICAgICBdLCBcbiAgICAgIFwidW5pdHNcIiA6IFwic2Vjb25kc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0VGltZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJSZXF1ZXN0IFRpbWVcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlJlcXVlc3QgdGltZSBuZWVkZWQgdG8gYW5zd2VyIGEgcmVxdWVzdC5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiZGlzdHJpYnV0aW9uXCIsIFxuICAgICAgXCJjdXRzXCIgOiBbIFxuICAgICAgICAwLjAxLCBcbiAgICAgICAgMC4wNSwgXG4gICAgICAgIDAuMSwgXG4gICAgICAgIDAuMiwgXG4gICAgICAgIDAuNSwgXG4gICAgICAgIDEsIFxuICAgICAgICA1LCBcbiAgICAgICAgMTUsIFxuICAgICAgICAzMCBcbiAgICAgIF0sIFxuICAgICAgXCJ1bml0c1wiIDogXCJzZWNvbmRzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiY2xpZW50XCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcInF1ZXVlVGltZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJRdWV1ZSBUaW1lXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJRdWV1ZSB0aW1lIG5lZWRlZCB0byBhbnN3ZXIgYSByZXF1ZXN0LlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJkaXN0cmlidXRpb25cIiwgXG4gICAgICBcImN1dHNcIiA6IFsgXG4gICAgICAgIDAuMDEsIFxuICAgICAgICAwLjA1LCBcbiAgICAgICAgMC4xLCBcbiAgICAgICAgMC4yLCBcbiAgICAgICAgMC41LCBcbiAgICAgICAgMSwgXG4gICAgICAgIDUsIFxuICAgICAgICAxNSwgXG4gICAgICAgIDMwIFxuICAgICAgXSwgXG4gICAgICBcInVuaXRzXCIgOiBcInNlY29uZHNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwiYnl0ZXNTZW50XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkJ5dGVzIFNlbnRcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkJ5dGVzIHNlbnRzIGZvciBhIHJlcXVlc3QuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImRpc3RyaWJ1dGlvblwiLCBcbiAgICAgIFwiY3V0c1wiIDogWyBcbiAgICAgICAgMjUwLCBcbiAgICAgICAgMTAwMCwgXG4gICAgICAgIDIwMDAsIFxuICAgICAgICA1MDAwLCBcbiAgICAgICAgMTAwMDAgXG4gICAgICBdLCBcbiAgICAgIFwidW5pdHNcIiA6IFwiYnl0ZXNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwiYnl0ZXNSZWNlaXZlZFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJCeXRlcyBSZWNlaXZlZFwiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiQnl0ZXMgcmVjZWl2ZWQgZm9yIGEgcmVxdWVzdC5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiZGlzdHJpYnV0aW9uXCIsIFxuICAgICAgXCJjdXRzXCIgOiBbIFxuICAgICAgICAyNTAsIFxuICAgICAgICAxMDAwLCBcbiAgICAgICAgMjAwMCwgXG4gICAgICAgIDUwMDAsIFxuICAgICAgICAxMDAwMCBcbiAgICAgIF0sIFxuICAgICAgXCJ1bml0c1wiIDogXCJieXRlc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJjb25uZWN0aW9uVGltZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJDb25uZWN0aW9uIFRpbWVcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlRvdGFsIGNvbm5lY3Rpb24gdGltZSBvZiBhIGNsaWVudC5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiZGlzdHJpYnV0aW9uXCIsIFxuICAgICAgXCJjdXRzXCIgOiBbIFxuICAgICAgICAwLjEsIFxuICAgICAgICAxLCBcbiAgICAgICAgNjAgXG4gICAgICBdLCBcbiAgICAgIFwidW5pdHNcIiA6IFwic2Vjb25kc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFVzZXJcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwiaHR0cENvbm5lY3Rpb25zXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkNsaWVudCBDb25uZWN0aW9uc1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVGhlIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgb3BlbiAob25seSB1c2VyIHRyYWZmaWMpLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJjdXJyZW50XCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJudW1iZXJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRVc2VyXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcInRvdGFsVGltZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJUb3RhbCBUaW1lXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJUb3RhbCB0aW1lIG5lZWRlZCB0byBhbnN3ZXIgYSByZXF1ZXN0IChvbmx5IHVzZXIgdHJhZmZpYykuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImRpc3RyaWJ1dGlvblwiLCBcbiAgICAgIFwiY3V0c1wiIDogWyBcbiAgICAgICAgMC4wMSwgXG4gICAgICAgIDAuMDUsIFxuICAgICAgICAwLjEsIFxuICAgICAgICAwLjIsIFxuICAgICAgICAwLjUsIFxuICAgICAgICAxLCBcbiAgICAgICAgNSwgXG4gICAgICAgIDE1LCBcbiAgICAgICAgMzAgXG4gICAgICBdLCBcbiAgICAgIFwidW5pdHNcIiA6IFwic2Vjb25kc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFVzZXJcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwicmVxdWVzdFRpbWVcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiUmVxdWVzdCBUaW1lXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJSZXF1ZXN0IHRpbWUgbmVlZGVkIHRvIGFuc3dlciBhIHJlcXVlc3QgKG9ubHkgdXNlciB0cmFmZmljKS5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiZGlzdHJpYnV0aW9uXCIsIFxuICAgICAgXCJjdXRzXCIgOiBbIFxuICAgICAgICAwLjAxLCBcbiAgICAgICAgMC4wNSwgXG4gICAgICAgIDAuMSwgXG4gICAgICAgIDAuMiwgXG4gICAgICAgIDAuNSwgXG4gICAgICAgIDEsIFxuICAgICAgICA1LCBcbiAgICAgICAgMTUsIFxuICAgICAgICAzMCBcbiAgICAgIF0sIFxuICAgICAgXCJ1bml0c1wiIDogXCJzZWNvbmRzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiY2xpZW50VXNlclwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJxdWV1ZVRpbWVcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiUXVldWUgVGltZVwiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiUXVldWUgdGltZSBuZWVkZWQgdG8gYW5zd2VyIGEgcmVxdWVzdCAob25seSB1c2VyIHRyYWZmaWMpLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJkaXN0cmlidXRpb25cIiwgXG4gICAgICBcImN1dHNcIiA6IFsgXG4gICAgICAgIDAuMDEsIFxuICAgICAgICAwLjA1LCBcbiAgICAgICAgMC4xLCBcbiAgICAgICAgMC4yLCBcbiAgICAgICAgMC41LCBcbiAgICAgICAgMSwgXG4gICAgICAgIDUsIFxuICAgICAgICAxNSwgXG4gICAgICAgIDMwIFxuICAgICAgXSwgXG4gICAgICBcInVuaXRzXCIgOiBcInNlY29uZHNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRVc2VyXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcImJ5dGVzU2VudFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJCeXRlcyBTZW50XCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJCeXRlcyBzZW50cyBmb3IgYSByZXF1ZXN0IChvbmx5IHVzZXIgdHJhZmZpYykuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImRpc3RyaWJ1dGlvblwiLCBcbiAgICAgIFwiY3V0c1wiIDogWyBcbiAgICAgICAgMjUwLCBcbiAgICAgICAgMTAwMCwgXG4gICAgICAgIDIwMDAsIFxuICAgICAgICA1MDAwLCBcbiAgICAgICAgMTAwMDAgXG4gICAgICBdLCBcbiAgICAgIFwidW5pdHNcIiA6IFwiYnl0ZXNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJjbGllbnRVc2VyXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcImJ5dGVzUmVjZWl2ZWRcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQnl0ZXMgUmVjZWl2ZWRcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkJ5dGVzIHJlY2VpdmVkIGZvciBhIHJlcXVlc3QgKG9ubHkgdXNlciB0cmFmZmljKS5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiZGlzdHJpYnV0aW9uXCIsIFxuICAgICAgXCJjdXRzXCIgOiBbIFxuICAgICAgICAyNTAsIFxuICAgICAgICAxMDAwLCBcbiAgICAgICAgMjAwMCwgXG4gICAgICAgIDUwMDAsIFxuICAgICAgICAxMDAwMCBcbiAgICAgIF0sIFxuICAgICAgXCJ1bml0c1wiIDogXCJieXRlc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImNsaWVudFVzZXJcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwiY29ubmVjdGlvblRpbWVcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQ29ubmVjdGlvbiBUaW1lXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJUb3RhbCBjb25uZWN0aW9uIHRpbWUgb2YgYSBjbGllbnQgKG9ubHkgdXNlciB0cmFmZmljKS5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiZGlzdHJpYnV0aW9uXCIsIFxuICAgICAgXCJjdXRzXCIgOiBbIFxuICAgICAgICAwLjEsIFxuICAgICAgICAxLCBcbiAgICAgICAgNjAgXG4gICAgICBdLCBcbiAgICAgIFwidW5pdHNcIiA6IFwic2Vjb25kc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImh0dHBcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwicmVxdWVzdHNUb3RhbFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJUb3RhbCByZXF1ZXN0c1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVG90YWwgbnVtYmVyIG9mIEhUVFAgcmVxdWVzdHMuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImFjY3VtdWxhdGVkXCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJudW1iZXJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJodHRwXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcInJlcXVlc3RzU3VwZXJ1c2VyXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlRvdGFsIHN1cGVydXNlciByZXF1ZXN0c1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVG90YWwgbnVtYmVyIG9mIEhUVFAgcmVxdWVzdHMgZXhlY3V0ZWQgYnkgc3VwZXJ1c2VyL0pXVC5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiYWNjdW11bGF0ZWRcIiwgXG4gICAgICBcInVuaXRzXCIgOiBcIm51bWJlclwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcImh0dHBcIiwgXG4gICAgICBcImlkZW50aWZpZXJcIiA6IFwicmVxdWVzdHNVc2VyXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIlRvdGFsIHVzZXIgcmVxdWVzdHNcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlRvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzIGV4ZWN1dGVkIGJ5IGNsaWVudHMuXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImFjY3VtdWxhdGVkXCIsIFxuICAgICAgXCJ1bml0c1wiIDogXCJudW1iZXJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJncm91cFwiIDogXCJodHRwXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcInJlcXVlc3RzQXN5bmNcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQXN5bmMgcmVxdWVzdHNcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk51bWJlciBvZiBhc3luY2hyb25vdXNseSBleGVjdXRlZCBIVFRQIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c0dldFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJIVFRQIEdFVCByZXF1ZXN0c1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiTnVtYmVyIG9mIEhUVFAgR0VUIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c0hlYWRcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiSFRUUCBIRUFEIHJlcXVlc3RzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJOdW1iZXIgb2YgSFRUUCBIRUFEIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c1Bvc3RcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiSFRUUCBQT1NUIHJlcXVlc3RzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJOdW1iZXIgb2YgSFRUUCBQT1NUIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c1B1dFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJIVFRQIFBVVCByZXF1ZXN0c1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiTnVtYmVyIG9mIEhUVFAgUFVUIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c1BhdGNoXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkhUVFAgUEFUQ0ggcmVxdWVzdHNcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk51bWJlciBvZiBIVFRQIFBBVENIIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c0RlbGV0ZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJIVFRQIERFTEVURSByZXF1ZXN0c1wiLCBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiTnVtYmVyIG9mIEhUVFAgREVMRVRFIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c09wdGlvbnNcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiSFRUUCBPUFRJT05TIHJlcXVlc3RzXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJOdW1iZXIgb2YgSFRUUCBPUFRJT05TIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwiaHR0cFwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJyZXF1ZXN0c090aGVyXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIm90aGVyIEhUVFAgcmVxdWVzdHNcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk51bWJlciBvZiBvdGhlciBIVFRQIHJlcXVlc3RzLlwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhY2N1bXVsYXRlZFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwibnVtYmVyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiZ3JvdXBcIiA6IFwic2VydmVyXCIsIFxuICAgICAgXCJpZGVudGlmaWVyXCIgOiBcInVwdGltZVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJTZXJ2ZXIgVXB0aW1lXCIsIFxuICAgICAgXCJkZXNjcmlwdGlvblwiIDogXCJOdW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHNlcnZlciBzdGFydC5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiY3VycmVudFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwic2Vjb25kc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImdyb3VwXCIgOiBcInNlcnZlclwiLCBcbiAgICAgIFwiaWRlbnRpZmllclwiIDogXCJwaHlzaWNhbE1lbW9yeVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJQaHlzaWNhbCBNZW1vcnlcIiwgXG4gICAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlBoeXNpY2FsIG1lbW9yeSBpbiBieXRlcy5cIiwgXG4gICAgICBcInR5cGVcIiA6IFwiY3VycmVudFwiLCBcbiAgICAgIFwidW5pdHNcIiA6IFwiYnl0ZXNcIiBcbiAgICB9IFxuICBdLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEFkbWluU3RhdGlzdGljc0Rlc2NyaXB0aW9uMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAdminStatus_cluster": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QWRtaW5TdGF0dXMKdHlwZTogY2x1c3RlcgotLS0KdmFyIHVybCA9ICIvX2FkbWluL3N0YXR1cyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCJHRVQiLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYWRtaW4vc3RhdHVzJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzEwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwic2VydmVyXCIgOiBcImFyYW5nb1wiLCBcbiAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gIFwicGlkXCIgOiAyNDMsIFxuICBcImxpY2Vuc2VcIiA6IFwiZW50ZXJwcmlzZVwiLCBcbiAgXCJtb2RlXCIgOiBcInNlcnZlclwiLCBcbiAgXCJvcGVyYXRpb25Nb2RlXCIgOiBcInNlcnZlclwiLCBcbiAgXCJmb3h4QXBpXCIgOiB0cnVlLCBcbiAgXCJob3N0XCIgOiBcImxvY2FsaG9zdFwiLCBcbiAgXCJob3N0bmFtZVwiIDogXCJkYmU0YWNlYzdjMDZcIiwgXG4gIFwic2VydmVySW5mb1wiIDogeyBcbiAgICBcInByb2dyZXNzXCIgOiB7IFxuICAgICAgXCJwaGFzZVwiIDogXCJpbiB3YWl0XCIsIFxuICAgICAgXCJmZWF0dXJlXCIgOiBcIlwiLCBcbiAgICAgIFwicmVjb3ZlcnlUaWNrXCIgOiAwIFxuICAgIH0sIFxuICAgIFwibWFpbnRlbmFuY2VcIiA6IGZhbHNlLCBcbiAgICBcInJvbGVcIiA6IFwiQ09PUkRJTkFUT1JcIiwgXG4gICAgXCJ3cml0ZU9wc0VuYWJsZWRcIiA6IHRydWUsIFxuICAgIFwicmVhZE9ubHlcIiA6IGZhbHNlLCBcbiAgICBcInBlcnNpc3RlZElkXCIgOiBcIkNSRE4tZmUxNWU2MjItMzVhZS00MTU3LThmZWUtMTRiMGJjYTRmYjJlXCIsIFxuICAgIFwicmVib290SWRcIiA6IDEsIFxuICAgIFwiYWRkcmVzc1wiIDogXCJ0Y3A6Ly9sb2NhbGhvc3Q6ODUyOVwiLCBcbiAgICBcInNlcnZlcklkXCIgOiBcIkNSRE4tZmUxNWU2MjItMzVhZS00MTU3LThmZWUtMTRiMGJjYTRmYjJlXCIsIFxuICAgIFwic3RhdGVcIiA6IFwiU0VSVklOR1wiIFxuICB9LCBcbiAgXCJjb29yZGluYXRvclwiIDogeyBcbiAgICBcImZveHhtYXN0ZXJcIiA6IFwiQ1JETi1hODJkM2I2Yy03ZjdlLTQ0NGYtOTkxYy05MjQ4NDdlYzIxMWRcIiwgXG4gICAgXCJpc0ZveHhtYXN0ZXJcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJhZ2VuY3lcIiA6IHsgXG4gICAgXCJhZ2VuY3lDb21tXCIgOiB7IFxuICAgICAgXCJlbmRwb2ludHNcIiA6IFsgXG4gICAgICAgIFwidGNwOi8vbG9jYWxob3N0Ojg1MzFcIiwgXG4gICAgICAgIFwidGNwOi8vbG9jYWxob3N0Ojg1NDFcIiwgXG4gICAgICAgIFwidGNwOi8vbG9jYWxob3N0Ojg1NTFcIiBcbiAgICAgIF0gXG4gICAgfSBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEFkbWluU3RhdHVzIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAdminSupportInfo_cluster": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFF1ZXJ5IHN1cHBvcnQgaW5mb3JtYXRpb24gZnJvbSBhIGNsdXN0ZXIKbmFtZTogUmVzdEFkbWluU3VwcG9ydEluZm8KdHlwZTogY2x1c3RlcgotLS0KdmFyIHVybCA9ICIvX2RiL19zeXN0ZW0vX2FkbWluL3N1cHBvcnQtaW5mbyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCJHRVQiLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZGVwbG95bWVudC5zZXJ2ZXJzICE9PSB1bmRlZmluZWQpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fZGIvX3N5c3RlbS9fYWRtaW4vc3VwcG9ydC1pbmZvJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjU2MVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImRlcGxveW1lbnRcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcImNsdXN0ZXJcIiwgXG4gICAgXCJzZXJ2ZXJzXCIgOiB7IFxuICAgICAgXCJDUkROLWZlMTVlNjIyLTM1YWUtNDE1Ny04ZmVlLTE0YjBiY2E0ZmIyZVwiIDogeyBcbiAgICAgICAgXCJpZFwiIDogXCJDUkROLWZlMTVlNjIyLTM1YWUtNDE1Ny04ZmVlLTE0YjBiY2E0ZmIyZVwiLCBcbiAgICAgICAgXCJhbGlhc1wiIDogXCJDb29yZGluYXRvcjAwMDNcIiwgXG4gICAgICAgIFwiZW5kcG9pbnRcIiA6IFwidGNwOi8vbG9jYWxob3N0Ojg1MjlcIiwgXG4gICAgICAgIFwicm9sZVwiIDogXCJDT09SRElOQVRPUlwiLCBcbiAgICAgICAgXCJtYWludGVuYW5jZVwiIDogZmFsc2UsIFxuICAgICAgICBcInJlYWRPbmx5XCIgOiBmYWxzZSwgXG4gICAgICAgIFwidmVyc2lvblwiIDogXCIzLjExLjE0XCIsIFxuICAgICAgICBcImJ1aWxkXCIgOiBcInJlZnMvMy4xMS4xNCA0NmUyYjMwODdcIiwgXG4gICAgICAgIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICAgICAgICBcIm9zXCIgOiBcIkxpbnV4IHZlcnNpb24gNi44LjAtMTAxOS1hd3MgKGJ1aWxkZEBsY3kwMi1hbWQ2NC0wNTgpICh4ODZfNjQtbGludXgtZ251LWdjYy0xMiAoVWJ1bnR1IDEyLjMuMC0xdWJ1bnR1MX4yMi4wNCkgMTIuMy4wLCBHTlUgbGQgKEdOVSBCaW51dGlscyBmb3IgVWJ1bnR1KSAyLjM4KSAjMjF+MjIuMDQuMS1VYnVudHUgU01QIFRodSBOb3YgIDcgMTc6MzM6MzAgVVRDIDIwMjRcIiwgXG4gICAgICAgIFwicGxhdGZvcm1cIiA6IFwibGludXhcIiwgXG4gICAgICAgIFwicGh5c2ljYWxNZW1vcnlcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogMzMwODk3NTMwODgsIFxuICAgICAgICAgIFwib3ZlcnJpZGRlblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcIm51bWJlck9mQ29yZXNcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogOCwgXG4gICAgICAgICAgXCJvdmVycmlkZGVuXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvY2Vzc1N0YXRzXCIgOiB7IFxuICAgICAgICAgIFwicHJvY2Vzc1VwdGltZVwiIDogNDUuNTEzNzkyMjc2MzgyNDQ2LCBcbiAgICAgICAgICBcIm51bWJlck9mVGhyZWFkc1wiIDogMzksIFxuICAgICAgICAgIFwidmlydHVhbFNpemVcIiA6IDczNDk0MTE4NCwgXG4gICAgICAgICAgXCJyZXNpZGVudFNldFNpemVcIiA6IDExMDQ3MzIxNiBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY3B1U3RhdHNcIiA6IHsgXG4gICAgICAgICAgXCJ1c2VyUGVyY2VudFwiIDogNS42ODM1NzYwODE2NjE5MjksIFxuICAgICAgICAgIFwic3lzdGVtUGVyY2VudFwiIDogMi40NzQwNTI0MjUwNzQ1MzczLCBcbiAgICAgICAgICBcImlkbGVQZXJjZW50XCIgOiA5MC4yMTAzMTA1MTQ0NTUxNywgXG4gICAgICAgICAgXCJpb3dhaXRQZXJjZW50XCIgOiAxLjQ1OTcwMTYzNjM0MzE5ODUgXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIFwiUFJNUi02ZGI0MWMxMC01ZjZhLTRkYWQtOTAxZS1lZWEyMTIyNDhmZTNcIiA6IHsgXG4gICAgICAgIFwiaWRcIiA6IFwiUFJNUi02ZGI0MWMxMC01ZjZhLTRkYWQtOTAxZS1lZWEyMTIyNDhmZTNcIiwgXG4gICAgICAgIFwiYWxpYXNcIiA6IFwiREJTZXJ2ZXIwMDAxXCIsIFxuICAgICAgICBcImVuZHBvaW50XCIgOiBcInRjcDovL2xvY2FsaG9zdDo4NTQwXCIsIFxuICAgICAgICBcInJvbGVcIiA6IFwiUFJJTUFSWVwiLCBcbiAgICAgICAgXCJtYWludGVuYW5jZVwiIDogZmFsc2UsIFxuICAgICAgICBcInJlYWRPbmx5XCIgOiBmYWxzZSwgXG4gICAgICAgIFwidmVyc2lvblwiIDogXCIzLjExLjE0XCIsIFxuICAgICAgICBcImJ1aWxkXCIgOiBcInJlZnMvMy4xMS4xNCA0NmUyYjMwODdcIiwgXG4gICAgICAgIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICAgICAgICBcIm9zXCIgOiBcIkxpbnV4IHZlcnNpb24gNi44LjAtMTAxOS1hd3MgKGJ1aWxkZEBsY3kwMi1hbWQ2NC0wNTgpICh4ODZfNjQtbGludXgtZ251LWdjYy0xMiAoVWJ1bnR1IDEyLjMuMC0xdWJ1bnR1MX4yMi4wNCkgMTIuMy4wLCBHTlUgbGQgKEdOVSBCaW51dGlscyBmb3IgVWJ1bnR1KSAyLjM4KSAjMjF+MjIuMDQuMS1VYnVudHUgU01QIFRodSBOb3YgIDcgMTc6MzM6MzAgVVRDIDIwMjRcIiwgXG4gICAgICAgIFwicGxhdGZvcm1cIiA6IFwibGludXhcIiwgXG4gICAgICAgIFwicGh5c2ljYWxNZW1vcnlcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogMzMwODk3NTMwODgsIFxuICAgICAgICAgIFwib3ZlcnJpZGRlblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcIm51bWJlck9mQ29yZXNcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogOCwgXG4gICAgICAgICAgXCJvdmVycmlkZGVuXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvY2Vzc1N0YXRzXCIgOiB7IFxuICAgICAgICAgIFwicHJvY2Vzc1VwdGltZVwiIDogNDYuNTAwOTYyOTcyNjQwOTksIFxuICAgICAgICAgIFwibnVtYmVyT2ZUaHJlYWRzXCIgOiA2OCwgXG4gICAgICAgICAgXCJ2aXJ0dWFsU2l6ZVwiIDogOTYwOTE3NTA0LCBcbiAgICAgICAgICBcInJlc2lkZW50U2V0U2l6ZVwiIDogMTcwMTAyNzg0IFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjcHVTdGF0c1wiIDogeyBcbiAgICAgICAgICBcInVzZXJQZXJjZW50XCIgOiA1LjY4MzU3NjA4MTY2MTkyOSwgXG4gICAgICAgICAgXCJzeXN0ZW1QZXJjZW50XCIgOiAyLjQ3NDA1MjQyNTA3NDUzNzMsIFxuICAgICAgICAgIFwiaWRsZVBlcmNlbnRcIiA6IDkwLjIxMDMxMDUxNDQ1NTE3LCBcbiAgICAgICAgICBcImlvd2FpdFBlcmNlbnRcIiA6IDEuNDU5NzAxNjM2MzQzMTk4NSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiZW5naW5lU3RhdHNcIiA6IHsgXG4gICAgICAgICAgXCJjYWNoZS5saW1pdFwiIDogNzczNTU2NzM2MCwgXG4gICAgICAgICAgXCJjYWNoZS5hbGxvY2F0ZWRcIiA6IDEwODI4NDgsIFxuICAgICAgICAgIFwicm9ja3NkYi5lc3RpbWF0ZS1udW0ta2V5c1wiIDogMjExLCBcbiAgICAgICAgICBcInJvY2tzZGIuZXN0aW1hdGUtbGl2ZS1kYXRhLXNpemVcIiA6IDAsIFxuICAgICAgICAgIFwicm9ja3NkYi5saXZlLXNzdC1maWxlcy1zaXplXCIgOiAwLCBcbiAgICAgICAgICBcInJvY2tzZGIuYmxvY2stY2FjaGUtY2FwYWNpdHlcIiA6IDkyODI2ODA4MzIsIFxuICAgICAgICAgIFwicm9ja3NkYi5ibG9jay1jYWNoZS11c2FnZVwiIDogOTYsIFxuICAgICAgICAgIFwicm9ja3NkYi5mcmVlLWRpc2stc3BhY2VcIiA6IDE0MTA0MjUyNDE2MCwgXG4gICAgICAgICAgXCJyb2Nrc2RiLnRvdGFsLWRpc2stc3BhY2VcIiA6IDE1NTg5NzYxMDI0MCBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCJDUkROLTlhYzk4M2RlLTUyMTktNGYwMy1iZDdjLTE2MGFjNWVjMTc2N1wiIDogeyBcbiAgICAgICAgXCJpZFwiIDogXCJDUkROLTlhYzk4M2RlLTUyMTktNGYwMy1iZDdjLTE2MGFjNWVjMTc2N1wiLCBcbiAgICAgICAgXCJhbGlhc1wiIDogXCJDb29yZGluYXRvcjAwMDFcIiwgXG4gICAgICAgIFwiZW5kcG9pbnRcIiA6IFwidGNwOi8vbG9jYWxob3N0Ojg1MzlcIiwgXG4gICAgICAgIFwicm9sZVwiIDogXCJDT09SRElOQVRPUlwiLCBcbiAgICAgICAgXCJtYWludGVuYW5jZVwiIDogZmFsc2UsIFxuICAgICAgICBcInJlYWRPbmx5XCIgOiBmYWxzZSwgXG4gICAgICAgIFwidmVyc2lvblwiIDogXCIzLjExLjE0XCIsIFxuICAgICAgICBcImJ1aWxkXCIgOiBcInJlZnMvMy4xMS4xNCA0NmUyYjMwODdcIiwgXG4gICAgICAgIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICAgICAgICBcIm9zXCIgOiBcIkxpbnV4IHZlcnNpb24gNi44LjAtMTAxOS1hd3MgKGJ1aWxkZEBsY3kwMi1hbWQ2NC0wNTgpICh4ODZfNjQtbGludXgtZ251LWdjYy0xMiAoVWJ1bnR1IDEyLjMuMC0xdWJ1bnR1MX4yMi4wNCkgMTIuMy4wLCBHTlUgbGQgKEdOVSBCaW51dGlscyBmb3IgVWJ1bnR1KSAyLjM4KSAjMjF+MjIuMDQuMS1VYnVudHUgU01QIFRodSBOb3YgIDcgMTc6MzM6MzAgVVRDIDIwMjRcIiwgXG4gICAgICAgIFwicGxhdGZvcm1cIiA6IFwibGludXhcIiwgXG4gICAgICAgIFwicGh5c2ljYWxNZW1vcnlcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogMzMwODk3NTMwODgsIFxuICAgICAgICAgIFwib3ZlcnJpZGRlblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcIm51bWJlck9mQ29yZXNcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogOCwgXG4gICAgICAgICAgXCJvdmVycmlkZGVuXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvY2Vzc1N0YXRzXCIgOiB7IFxuICAgICAgICAgIFwicHJvY2Vzc1VwdGltZVwiIDogNDUuNDk3MTY0OTY0Njc1OSwgXG4gICAgICAgICAgXCJudW1iZXJPZlRocmVhZHNcIiA6IDM5LCBcbiAgICAgICAgICBcInZpcnR1YWxTaXplXCIgOiA3MzI1ODE4ODgsIFxuICAgICAgICAgIFwicmVzaWRlbnRTZXRTaXplXCIgOiAxMTAwMzkwNDAgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNwdVN0YXRzXCIgOiB7IFxuICAgICAgICAgIFwidXNlclBlcmNlbnRcIiA6IDUuNjgzNTc2MDgxNjYxOTI5LCBcbiAgICAgICAgICBcInN5c3RlbVBlcmNlbnRcIiA6IDIuNDc0MDUyNDI1MDc0NTM3MywgXG4gICAgICAgICAgXCJpZGxlUGVyY2VudFwiIDogOTAuMjEwMzEwNTE0NDU1MTcsIFxuICAgICAgICAgIFwiaW93YWl0UGVyY2VudFwiIDogMS40NTk3MDE2MzYzNDMxOTg1IFxuICAgICAgICB9IFxuICAgICAgfSwgXG4gICAgICBcIkNSRE4tYTgyZDNiNmMtN2Y3ZS00NDRmLTk5MWMtOTI0ODQ3ZWMyMTFkXCIgOiB7IFxuICAgICAgICBcImlkXCIgOiBcIkNSRE4tYTgyZDNiNmMtN2Y3ZS00NDRmLTk5MWMtOTI0ODQ3ZWMyMTFkXCIsIFxuICAgICAgICBcImFsaWFzXCIgOiBcIkNvb3JkaW5hdG9yMDAwMlwiLCBcbiAgICAgICAgXCJlbmRwb2ludFwiIDogXCJ0Y3A6Ly9sb2NhbGhvc3Q6ODU0OVwiLCBcbiAgICAgICAgXCJyb2xlXCIgOiBcIkNPT1JESU5BVE9SXCIsIFxuICAgICAgICBcIm1haW50ZW5hbmNlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwicmVhZE9ubHlcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gICAgICAgIFwiYnVpbGRcIiA6IFwicmVmcy8zLjExLjE0IDQ2ZTJiMzA4N1wiLCBcbiAgICAgICAgXCJsaWNlbnNlXCIgOiBcImVudGVycHJpc2VcIiwgXG4gICAgICAgIFwib3NcIiA6IFwiTGludXggdmVyc2lvbiA2LjguMC0xMDE5LWF3cyAoYnVpbGRkQGxjeTAyLWFtZDY0LTA1OCkgKHg4Nl82NC1saW51eC1nbnUtZ2NjLTEyIChVYnVudHUgMTIuMy4wLTF1YnVudHUxfjIyLjA0KSAxMi4zLjAsIEdOVSBsZCAoR05VIEJpbnV0aWxzIGZvciBVYnVudHUpIDIuMzgpICMyMX4yMi4wNC4xLVVidW50dSBTTVAgVGh1IE5vdiAgNyAxNzozMzozMCBVVEMgMjAyNFwiLCBcbiAgICAgICAgXCJwbGF0Zm9ybVwiIDogXCJsaW51eFwiLCBcbiAgICAgICAgXCJwaHlzaWNhbE1lbW9yeVwiIDogeyBcbiAgICAgICAgICBcInZhbHVlXCIgOiAzMzA4OTc1MzA4OCwgXG4gICAgICAgICAgXCJvdmVycmlkZGVuXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwibnVtYmVyT2ZDb3Jlc1wiIDogeyBcbiAgICAgICAgICBcInZhbHVlXCIgOiA4LCBcbiAgICAgICAgICBcIm92ZXJyaWRkZW5cIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJwcm9jZXNzU3RhdHNcIiA6IHsgXG4gICAgICAgICAgXCJwcm9jZXNzVXB0aW1lXCIgOiA0Ni40OTM1MzU5OTU0ODM0LCBcbiAgICAgICAgICBcIm51bWJlck9mVGhyZWFkc1wiIDogMzksIFxuICAgICAgICAgIFwidmlydHVhbFNpemVcIiA6IDczNDk0MTE4NCwgXG4gICAgICAgICAgXCJyZXNpZGVudFNldFNpemVcIiA6IDExMDkwMzI5NiBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY3B1U3RhdHNcIiA6IHsgXG4gICAgICAgICAgXCJ1c2VyUGVyY2VudFwiIDogNS42ODM1NzYwODE2NjE5MjksIFxuICAgICAgICAgIFwic3lzdGVtUGVyY2VudFwiIDogMi40NzQwNTI0MjUwNzQ1MzczLCBcbiAgICAgICAgICBcImlkbGVQZXJjZW50XCIgOiA5MC4yMTAzMTA1MTQ0NTUxNywgXG4gICAgICAgICAgXCJpb3dhaXRQZXJjZW50XCIgOiAxLjQ1OTcwMTYzNjM0MzE5ODUgXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIFwiUFJNUi0yMWNiMTA3Mi03ZTllLTQ5YjItYTA5YS0wOTM5Y2RjNjg1MjVcIiA6IHsgXG4gICAgICAgIFwiaWRcIiA6IFwiUFJNUi0yMWNiMTA3Mi03ZTllLTQ5YjItYTA5YS0wOTM5Y2RjNjg1MjVcIiwgXG4gICAgICAgIFwiYWxpYXNcIiA6IFwiREJTZXJ2ZXIwMDAyXCIsIFxuICAgICAgICBcImVuZHBvaW50XCIgOiBcInRjcDovL2xvY2FsaG9zdDo4NTUwXCIsIFxuICAgICAgICBcInJvbGVcIiA6IFwiUFJJTUFSWVwiLCBcbiAgICAgICAgXCJtYWludGVuYW5jZVwiIDogZmFsc2UsIFxuICAgICAgICBcInJlYWRPbmx5XCIgOiBmYWxzZSwgXG4gICAgICAgIFwidmVyc2lvblwiIDogXCIzLjExLjE0XCIsIFxuICAgICAgICBcImJ1aWxkXCIgOiBcInJlZnMvMy4xMS4xNCA0NmUyYjMwODdcIiwgXG4gICAgICAgIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICAgICAgICBcIm9zXCIgOiBcIkxpbnV4IHZlcnNpb24gNi44LjAtMTAxOS1hd3MgKGJ1aWxkZEBsY3kwMi1hbWQ2NC0wNTgpICh4ODZfNjQtbGludXgtZ251LWdjYy0xMiAoVWJ1bnR1IDEyLjMuMC0xdWJ1bnR1MX4yMi4wNCkgMTIuMy4wLCBHTlUgbGQgKEdOVSBCaW51dGlscyBmb3IgVWJ1bnR1KSAyLjM4KSAjMjF+MjIuMDQuMS1VYnVudHUgU01QIFRodSBOb3YgIDcgMTc6MzM6MzAgVVRDIDIwMjRcIiwgXG4gICAgICAgIFwicGxhdGZvcm1cIiA6IFwibGludXhcIiwgXG4gICAgICAgIFwicGh5c2ljYWxNZW1vcnlcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogMzMwODk3NTMwODgsIFxuICAgICAgICAgIFwib3ZlcnJpZGRlblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcIm51bWJlck9mQ29yZXNcIiA6IHsgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogOCwgXG4gICAgICAgICAgXCJvdmVycmlkZGVuXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvY2Vzc1N0YXRzXCIgOiB7IFxuICAgICAgICAgIFwicHJvY2Vzc1VwdGltZVwiIDogNDcuNDk4ODcwMzcyNzcyMjIsIFxuICAgICAgICAgIFwibnVtYmVyT2ZUaHJlYWRzXCIgOiA2OCwgXG4gICAgICAgICAgXCJ2aXJ0dWFsU2l6ZVwiIDogOTcwODc4OTc2LCBcbiAgICAgICAgICBcInJlc2lkZW50U2V0U2l6ZVwiIDogMTcxNzMyOTkyIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjcHVTdGF0c1wiIDogeyBcbiAgICAgICAgICBcInVzZXJQZXJjZW50XCIgOiA1LjY4MzU3NjA4MTY2MTkyOSwgXG4gICAgICAgICAgXCJzeXN0ZW1QZXJjZW50XCIgOiAyLjQ3NDA1MjQyNTA3NDUzNzMsIFxuICAgICAgICAgIFwiaWRsZVBlcmNlbnRcIiA6IDkwLjIxMDMxMDUxNDQ1NTE3LCBcbiAgICAgICAgICBcImlvd2FpdFBlcmNlbnRcIiA6IDEuNDU5NzAxNjM2MzQzMTk4NSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiZW5naW5lU3RhdHNcIiA6IHsgXG4gICAgICAgICAgXCJjYWNoZS5saW1pdFwiIDogNzczNTU2NzM2MCwgXG4gICAgICAgICAgXCJjYWNoZS5hbGxvY2F0ZWRcIiA6IDEwODI4NDgsIFxuICAgICAgICAgIFwicm9ja3NkYi5lc3RpbWF0ZS1udW0ta2V5c1wiIDogMTk5LCBcbiAgICAgICAgICBcInJvY2tzZGIuZXN0aW1hdGUtbGl2ZS1kYXRhLXNpemVcIiA6IDAsIFxuICAgICAgICAgIFwicm9ja3NkYi5saXZlLXNzdC1maWxlcy1zaXplXCIgOiAwLCBcbiAgICAgICAgICBcInJvY2tzZGIuYmxvY2stY2FjaGUtY2FwYWNpdHlcIiA6IDkyODI2ODA4MzIsIFxuICAgICAgICAgIFwicm9ja3NkYi5ibG9jay1jYWNoZS11c2FnZVwiIDogOTYsIFxuICAgICAgICAgIFwicm9ja3NkYi5mcmVlLWRpc2stc3BhY2VcIiA6IDE0MTA0MjUyNDE2MCwgXG4gICAgICAgICAgXCJyb2Nrc2RiLnRvdGFsLWRpc2stc3BhY2VcIiA6IDE1NTg5NzYxMDI0MCBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCJQUk1SLTIzYTk1MzhjLWI0ZDctNGY2Yy05YTQxLTBmY2IzZjA3NzZmZFwiIDogeyBcbiAgICAgICAgXCJpZFwiIDogXCJQUk1SLTIzYTk1MzhjLWI0ZDctNGY2Yy05YTQxLTBmY2IzZjA3NzZmZFwiLCBcbiAgICAgICAgXCJhbGlhc1wiIDogXCJEQlNlcnZlcjAwMDNcIiwgXG4gICAgICAgIFwiZW5kcG9pbnRcIiA6IFwidGNwOi8vbG9jYWxob3N0Ojg1MzBcIiwgXG4gICAgICAgIFwicm9sZVwiIDogXCJQUklNQVJZXCIsIFxuICAgICAgICBcIm1haW50ZW5hbmNlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwicmVhZE9ubHlcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gICAgICAgIFwiYnVpbGRcIiA6IFwicmVmcy8zLjExLjE0IDQ2ZTJiMzA4N1wiLCBcbiAgICAgICAgXCJsaWNlbnNlXCIgOiBcImVudGVycHJpc2VcIiwgXG4gICAgICAgIFwib3NcIiA6IFwiTGludXggdmVyc2lvbiA2LjguMC0xMDE5LWF3cyAoYnVpbGRkQGxjeTAyLWFtZDY0LTA1OCkgKHg4Nl82NC1saW51eC1nbnUtZ2NjLTEyIChVYnVudHUgMTIuMy4wLTF1YnVudHUxfjIyLjA0KSAxMi4zLjAsIEdOVSBsZCAoR05VIEJpbnV0aWxzIGZvciBVYnVudHUpIDIuMzgpICMyMX4yMi4wNC4xLVVidW50dSBTTVAgVGh1IE5vdiAgNyAxNzozMzozMCBVVEMgMjAyNFwiLCBcbiAgICAgICAgXCJwbGF0Zm9ybVwiIDogXCJsaW51eFwiLCBcbiAgICAgICAgXCJwaHlzaWNhbE1lbW9yeVwiIDogeyBcbiAgICAgICAgICBcInZhbHVlXCIgOiAzMzA4OTc1MzA4OCwgXG4gICAgICAgICAgXCJvdmVycmlkZGVuXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwibnVtYmVyT2ZDb3Jlc1wiIDogeyBcbiAgICAgICAgICBcInZhbHVlXCIgOiA4LCBcbiAgICAgICAgICBcIm92ZXJyaWRkZW5cIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJwcm9jZXNzU3RhdHNcIiA6IHsgXG4gICAgICAgICAgXCJwcm9jZXNzVXB0aW1lXCIgOiA0Ni41MTczOTE0NDMyNTI1NiwgXG4gICAgICAgICAgXCJudW1iZXJPZlRocmVhZHNcIiA6IDY4LCBcbiAgICAgICAgICBcInZpcnR1YWxTaXplXCIgOiA5NTgyOTYwNjQsIFxuICAgICAgICAgIFwicmVzaWRlbnRTZXRTaXplXCIgOiAxNjgyNzU5NjggXG4gICAgICAgIH0sIFxuICAgICAgICBcImNwdVN0YXRzXCIgOiB7IFxuICAgICAgICAgIFwidXNlclBlcmNlbnRcIiA6IDUuNjgzNTc2MDgxNjYxOTI5LCBcbiAgICAgICAgICBcInN5c3RlbVBlcmNlbnRcIiA6IDIuNDc0MDUyNDI1MDc0NTM3MywgXG4gICAgICAgICAgXCJpZGxlUGVyY2VudFwiIDogOTAuMjEwMzEwNTE0NDU1MTcsIFxuICAgICAgICAgIFwiaW93YWl0UGVyY2VudFwiIDogMS40NTk3MDE2MzYzNDMxOTg1IFxuICAgICAgICB9LCBcbiAgICAgICAgXCJlbmdpbmVTdGF0c1wiIDogeyBcbiAgICAgICAgICBcImNhY2hlLmxpbWl0XCIgOiA3NzM1NTY3MzYwLCBcbiAgICAgICAgICBcImNhY2hlLmFsbG9jYXRlZFwiIDogMTA4Mjg0OCwgXG4gICAgICAgICAgXCJyb2Nrc2RiLmVzdGltYXRlLW51bS1rZXlzXCIgOiAxMiwgXG4gICAgICAgICAgXCJyb2Nrc2RiLmVzdGltYXRlLWxpdmUtZGF0YS1zaXplXCIgOiAwLCBcbiAgICAgICAgICBcInJvY2tzZGIubGl2ZS1zc3QtZmlsZXMtc2l6ZVwiIDogMCwgXG4gICAgICAgICAgXCJyb2Nrc2RiLmJsb2NrLWNhY2hlLWNhcGFjaXR5XCIgOiA5MjgyNjgwODMyLCBcbiAgICAgICAgICBcInJvY2tzZGIuYmxvY2stY2FjaGUtdXNhZ2VcIiA6IDk2LCBcbiAgICAgICAgICBcInJvY2tzZGIuZnJlZS1kaXNrLXNwYWNlXCIgOiAxNDEwNDI1MjQxNjAsIFxuICAgICAgICAgIFwicm9ja3NkYi50b3RhbC1kaXNrLXNwYWNlXCIgOiAxNTU4OTc2MTAyNDAgXG4gICAgICAgIH0gXG4gICAgICB9IFxuICAgIH0sIFxuICAgIFwiYWdlbnRzXCIgOiAzLCBcbiAgICBcImNvb3JkaW5hdG9yc1wiIDogMywgXG4gICAgXCJkYlNlcnZlcnNcIiA6IDMsIFxuICAgIFwic2hhcmRzXCIgOiB7IFxuICAgICAgXCJkYXRhYmFzZXNcIiA6IDEsIFxuICAgICAgXCJjb2xsZWN0aW9uc1wiIDogMTcsIFxuICAgICAgXCJzaGFyZHNcIiA6IDMwLCBcbiAgICAgIFwibGVhZGVyc1wiIDogMTcsIFxuICAgICAgXCJyZWFsTGVhZGVyc1wiIDogNSwgXG4gICAgICBcImZvbGxvd2Vyc1wiIDogMTMsIFxuICAgICAgXCJzZXJ2ZXJzXCIgOiAzIFxuICAgIH0gXG4gIH0sIFxuICBcImRhdGVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNToyOVpcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJRdWVyeSBzdXBwb3J0IGluZm9ybWF0aW9uIGZyb20gYSBjbHVzdGVyIiwibmFtZSI6IlJlc3RBZG1pblN1cHBvcnRJbmZvIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAdminSupportInfo_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFF1ZXJ5IHN1cHBvcnQgaW5mb3JtYXRpb24gZnJvbSBhIHNpbmdsZSBzZXJ2ZXIKbmFtZTogUmVzdEFkbWluU3VwcG9ydEluZm8KLS0tCnZhciB1cmwgPSAiL19kYi9fc3lzdGVtL19hZG1pbi9zdXBwb3J0LWluZm8iOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgiR0VUIiwgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5Lmhvc3QgIT09IHVuZGVmaW5lZCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fZGIvX3N5c3RlbS9fYWRtaW4vc3VwcG9ydC1pbmZvJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTEyOVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImRlcGxveW1lbnRcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcInNpbmdsZVwiIFxuICB9LCBcbiAgXCJob3N0XCIgOiB7IFxuICAgIFwicm9sZVwiIDogXCJTSU5HTEVcIiwgXG4gICAgXCJtYWludGVuYW5jZVwiIDogZmFsc2UsIFxuICAgIFwicmVhZE9ubHlcIiA6IGZhbHNlLCBcbiAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICBcImJ1aWxkXCIgOiBcInJlZnMvMy4xMS4xNCA0NmUyYjMwODdcIiwgXG4gICAgXCJsaWNlbnNlXCIgOiBcImVudGVycHJpc2VcIiwgXG4gICAgXCJvc1wiIDogXCJMaW51eCB2ZXJzaW9uIDYuOC4wLTEwMTktYXdzIChidWlsZGRAbGN5MDItYW1kNjQtMDU4KSAoeDg2XzY0LWxpbnV4LWdudS1nY2MtMTIgKFVidW50dSAxMi4zLjAtMXVidW50dTF+MjIuMDQpIDEyLjMuMCwgR05VIGxkIChHTlUgQmludXRpbHMgZm9yIFVidW50dSkgMi4zOCkgIzIxfjIyLjA0LjEtVWJ1bnR1IFNNUCBUaHUgTm92ICA3IDE3OjMzOjMwIFVUQyAyMDI0XCIsIFxuICAgIFwicGxhdGZvcm1cIiA6IFwibGludXhcIiwgXG4gICAgXCJwaHlzaWNhbE1lbW9yeVwiIDogeyBcbiAgICAgIFwidmFsdWVcIiA6IDMzMDg5NzUzMDg4LCBcbiAgICAgIFwib3ZlcnJpZGRlblwiIDogZmFsc2UgXG4gICAgfSwgXG4gICAgXCJudW1iZXJPZkNvcmVzXCIgOiB7IFxuICAgICAgXCJ2YWx1ZVwiIDogOCwgXG4gICAgICBcIm92ZXJyaWRkZW5cIiA6IGZhbHNlIFxuICAgIH0sIFxuICAgIFwicHJvY2Vzc1N0YXRzXCIgOiB7IFxuICAgICAgXCJwcm9jZXNzVXB0aW1lXCIgOiA0OC4zMTYwMzUyNzA2OTA5MiwgXG4gICAgICBcIm51bWJlck9mVGhyZWFkc1wiIDogNjMsIFxuICAgICAgXCJ2aXJ0dWFsU2l6ZVwiIDogMTExMjExNzI0OCwgXG4gICAgICBcInJlc2lkZW50U2V0U2l6ZVwiIDogMjI0MTkwNDY0IFxuICAgIH0sIFxuICAgIFwiY3B1U3RhdHNcIiA6IHsgXG4gICAgICBcInVzZXJQZXJjZW50XCIgOiA1LjY4MjY4ODAzNTYyOTIxMiwgXG4gICAgICBcInN5c3RlbVBlcmNlbnRcIiA6IDIuNDczNTk2NTkxMjQzNjUsIFxuICAgICAgXCJpZGxlUGVyY2VudFwiIDogOTAuMjExNjAxOTc2MzA3ODYsIFxuICAgICAgXCJpb3dhaXRQZXJjZW50XCIgOiAxLjQ1OTc0ODUxODU3MjA0OCBcbiAgICB9LCBcbiAgICBcImVuZ2luZVN0YXRzXCIgOiB7IFxuICAgICAgXCJjYWNoZS5saW1pdFwiIDogNzczNTU2NzM2MCwgXG4gICAgICBcImNhY2hlLmFsbG9jYXRlZFwiIDogMTI4MTA0MCwgXG4gICAgICBcInJvY2tzZGIuZXN0aW1hdGUtbnVtLWtleXNcIiA6IDE1NzQsIFxuICAgICAgXCJyb2Nrc2RiLmVzdGltYXRlLWxpdmUtZGF0YS1zaXplXCIgOiAwLCBcbiAgICAgIFwicm9ja3NkYi5saXZlLXNzdC1maWxlcy1zaXplXCIgOiAwLCBcbiAgICAgIFwicm9ja3NkYi5ibG9jay1jYWNoZS1jYXBhY2l0eVwiIDogOTI4MjY4MDgzMiwgXG4gICAgICBcInJvY2tzZGIuYmxvY2stY2FjaGUtdXNhZ2VcIiA6IDk2LCBcbiAgICAgIFwicm9ja3NkYi5mcmVlLWRpc2stc3BhY2VcIiA6IDE0MTA0MjUyNDE2MCwgXG4gICAgICBcInJvY2tzZGIudG90YWwtZGlzay1zcGFjZVwiIDogMTU1ODk3NjEwMjQwIFxuICAgIH0gXG4gIH0sIFxuICBcImRhdGVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNToyOVpcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJRdWVyeSBzdXBwb3J0IGluZm9ybWF0aW9uIGZyb20gYSBzaW5nbGUgc2VydmVyIiwibmFtZSI6IlJlc3RBZG1pblN1cHBvcnRJbmZvIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestAnalyzerDeleteForce_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlbW92aW5nIHdpdGggYGZvcmNlYDoKbmFtZTogUmVzdEFuYWx5emVyRGVsZXRlRm9yY2UKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBkYiA9IHJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiOwp2YXIgYW5hbHl6ZXJOYW1lID0gInRlc3RBbmFseXplciI7CmFuYWx5emVycy5zYXZlKGFuYWx5emVyTmFtZSwgImlkZW50aXR5Iik7CgovLyBjcmVhdGUgQW5hbHl6ZXIgcmVmZXJlbmNlCnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbiI7CnZhciBib2R5ID0geyBuYW1lOiAidGVzdENvbGxlY3Rpb24iIH07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CnZhciB1cmwgPSAiL19hcGkvdmlldyI7CnZhciBib2R5ID0gewogIG5hbWU6ICJ0ZXN0VmlldyIsCiAgdHlwZTogImFyYW5nb3NlYXJjaCIsCiAgbGlua3M6IHsgdGVzdENvbGxlY3Rpb246IHsgYW5hbHl6ZXJzOiBbIGFuYWx5emVyTmFtZSBdIH0gfQp9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7CgovLyByZW1vdmFsIChmYWlsKQp2YXIgdXJsID0gIi9fYXBpL2FuYWx5emVyLyIgKyBlbmNvZGVVUklDb21wb25lbnQoYW5hbHl6ZXJOYW1lKSArICI/Zm9yY2U9ZmFsc2UiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwOSk7CgovLyByZW1vdmFsCnZhciB1cmwgPSAiL19hcGkvYW5hbHl6ZXIvIiArIGVuY29kZVVSSUNvbXBvbmVudChhbmFseXplck5hbWUpICsgIj9mb3JjZT10cnVlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygidGVzdFZpZXciKTsKZGIuX2Ryb3AoInRlc3RDb2xsZWN0aW9uIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJ0ZXN0Q29sbGVjdGlvblwiXG59XG5FT0ZcblxuY3VybCAtWCBQT1NUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibmFtZVwiOiBcInRlc3RWaWV3XCIsXG4gIFwidHlwZVwiOiBcImFyYW5nb3NlYXJjaFwiLFxuICBcImxpbmtzXCI6IHtcbiAgICBcInRlc3RDb2xsZWN0aW9uXCI6IHtcbiAgICAgIFwiYW5hbHl6ZXJzXCI6IFtcbiAgICAgICAgXCJ0ZXN0QW5hbHl6ZXJcIlxuICAgICAgXVxuICAgIH1cbiAgfVxufVxuRU9GXG5cbmN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hbmFseXplci90ZXN0QW5hbHl6ZXI/Zm9yY2U9ZmFsc2UnXG5cbmN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hbmFseXplci90ZXN0QW5hbHl6ZXI/Zm9yY2U9dHJ1ZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcIm5hbWVcIiA6IFwiX3N5c3RlbTo6dGVzdEFuYWx5emVyXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmVtb3Zpbmcgd2l0aCBgZm9yY2VgOiIsIm5hbWUiOiJSZXN0QW5hbHl6ZXJEZWxldGVGb3JjZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAnalyzerDelete_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlbW92aW5nIHdpdGhvdXQgYGZvcmNlYDoKbmFtZTogUmVzdEFuYWx5emVyRGVsZXRlCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgZGIgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYjsKdmFyIGFuYWx5emVyTmFtZSA9ICJ0ZXN0QW5hbHl6ZXIiOwphbmFseXplcnMuc2F2ZShhbmFseXplck5hbWUsICJpZGVudGl0eSIpOwoKLy8gcmVtb3ZhbAp2YXIgdXJsID0gIi9fYXBpL2FuYWx5emVyLyIgKyBlbmNvZGVVUklDb21wb25lbnQoYW5hbHl6ZXJOYW1lKTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7CmNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hbmFseXplci90ZXN0QW5hbHl6ZXInIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJuYW1lXCIgOiBcIl9zeXN0ZW06OnRlc3RBbmFseXplclwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJlbW92aW5nIHdpdGhvdXQgYGZvcmNlYDoiLCJuYW1lIjoiUmVzdEFuYWx5emVyRGVsZXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestAnalyzerGet_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZlIGFuIEFuYWx5emVyIGRlZmluaXRpb246Cm5hbWU6IFJlc3RBbmFseXplckdldAotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGRiID0gcmVxdWlyZSgiQGFyYW5nb2RiIikuZGI7CnZhciBhbmFseXplck5hbWUgPSAidGVzdEFuYWx5emVyIjsKYW5hbHl6ZXJzLnNhdmUoYW5hbHl6ZXJOYW1lLCAiaWRlbnRpdHkiKTsKCi8vIHJldHJpZXZhbAp2YXIgdXJsID0gIi9fYXBpL2FuYWx5emVyLyIgKyBlbmNvZGVVUklDb21wb25lbnQoYW5hbHl6ZXJOYW1lKTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmFuYWx5emVycy5yZW1vdmUoYW5hbHl6ZXJOYW1lLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2FuYWx5emVyL3Rlc3RBbmFseXplciciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEwNVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJmZWF0dXJlc1wiIDogWyBdLCBcbiAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICB9LCBcbiAgXCJ0eXBlXCIgOiBcImlkZW50aXR5XCIsIFxuICBcIm5hbWVcIiA6IFwiX3N5c3RlbTo6dGVzdEFuYWx5emVyXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0cmlldmUgYW4gQW5hbHl6ZXIgZGVmaW5pdGlvbjoiLCJuYW1lIjoiUmVzdEFuYWx5emVyR2V0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestAnalyzerPost_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QW5hbHl6ZXJQb3N0Ci0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgZGIgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYjsKdmFyIGFuYWx5emVyTmFtZSA9ICJ0ZXN0QW5hbHl6ZXIiOwoKLy8gY3JlYXRpb24KdmFyIHVybCA9ICIvX2FwaS9hbmFseXplciI7CnZhciBib2R5ID0gewogIG5hbWU6ICJ0ZXN0QW5hbHl6ZXIiLAogIHR5cGU6ICJpZGVudGl0eSIKfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgphbmFseXplcnMucmVtb3ZlKGFuYWx5emVyTmFtZSwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hbmFseXplcicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwidGVzdEFuYWx5emVyXCIsXG4gIFwidHlwZVwiOiBcImlkZW50aXR5XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA4MFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIm5hbWVcIiA6IFwiX3N5c3RlbTo6dGVzdEFuYWx5emVyXCIsIFxuICBcInR5cGVcIiA6IFwiaWRlbnRpdHlcIiwgXG4gIFwicHJvcGVydGllc1wiIDogeyBcbiAgfSwgXG4gIFwiZmVhdHVyZXNcIiA6IFsgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEFuYWx5emVyUG9zdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAnalyzersGet_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZlIGFsbCBBbmFseXplciBkZWZpbml0aW9uczoKbmFtZTogUmVzdEFuYWx5emVyc0dldAotLS0KLy8gcmV0cmlldmFsCnZhciB1cmwgPSAiL19hcGkvYW5hbHl6ZXIiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2FuYWx5emVyJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMjExNlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwibmFtZVwiIDogXCJ0ZXh0X2ZpXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcInRleHRcIiwgXG4gICAgICBcInByb3BlcnRpZXNcIiA6IHsgXG4gICAgICAgIFwibG9jYWxlXCIgOiBcImZpXCIsIFxuICAgICAgICBcImNhc2VcIiA6IFwibG93ZXJcIiwgXG4gICAgICAgIFwic3RvcHdvcmRzXCIgOiBbIF0sIFxuICAgICAgICBcImFjY2VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInN0ZW1taW5nXCIgOiB0cnVlIFxuICAgICAgfSwgXG4gICAgICBcImZlYXR1cmVzXCIgOiBbIFxuICAgICAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICAgICAgXCJwb3NpdGlvblwiLCBcbiAgICAgICAgXCJub3JtXCIgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIm5hbWVcIiA6IFwidGV4dF9ydVwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJ0ZXh0XCIsIFxuICAgICAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICAgICAgICBcImxvY2FsZVwiIDogXCJydVwiLCBcbiAgICAgICAgXCJjYXNlXCIgOiBcImxvd2VyXCIsIFxuICAgICAgICBcInN0b3B3b3Jkc1wiIDogWyBdLCBcbiAgICAgICAgXCJhY2NlbnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJzdGVtbWluZ1wiIDogdHJ1ZSBcbiAgICAgIH0sIFxuICAgICAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICAgICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgICAgIFwicG9zaXRpb25cIiwgXG4gICAgICAgIFwibm9ybVwiIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBcInRleHRfZXNcIiwgXG4gICAgICBcInR5cGVcIiA6IFwidGV4dFwiLCBcbiAgICAgIFwicHJvcGVydGllc1wiIDogeyBcbiAgICAgICAgXCJsb2NhbGVcIiA6IFwiZXNcIiwgXG4gICAgICAgIFwiY2FzZVwiIDogXCJsb3dlclwiLCBcbiAgICAgICAgXCJzdG9wd29yZHNcIiA6IFsgXSwgXG4gICAgICAgIFwiYWNjZW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwic3RlbW1pbmdcIiA6IHRydWUgXG4gICAgICB9LCBcbiAgICAgIFwiZmVhdHVyZXNcIiA6IFsgXG4gICAgICAgIFwiZnJlcXVlbmN5XCIsIFxuICAgICAgICBcInBvc2l0aW9uXCIsIFxuICAgICAgICBcIm5vcm1cIiBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwibmFtZVwiIDogXCJ0ZXh0X2RlXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcInRleHRcIiwgXG4gICAgICBcInByb3BlcnRpZXNcIiA6IHsgXG4gICAgICAgIFwibG9jYWxlXCIgOiBcImRlXCIsIFxuICAgICAgICBcImNhc2VcIiA6IFwibG93ZXJcIiwgXG4gICAgICAgIFwic3RvcHdvcmRzXCIgOiBbIF0sIFxuICAgICAgICBcImFjY2VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInN0ZW1taW5nXCIgOiB0cnVlIFxuICAgICAgfSwgXG4gICAgICBcImZlYXR1cmVzXCIgOiBbIFxuICAgICAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICAgICAgXCJwb3NpdGlvblwiLCBcbiAgICAgICAgXCJub3JtXCIgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIm5hbWVcIiA6IFwidGV4dF9lblwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJ0ZXh0XCIsIFxuICAgICAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICAgICAgICBcImxvY2FsZVwiIDogXCJlblwiLCBcbiAgICAgICAgXCJjYXNlXCIgOiBcImxvd2VyXCIsIFxuICAgICAgICBcInN0b3B3b3Jkc1wiIDogWyBdLCBcbiAgICAgICAgXCJhY2NlbnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJzdGVtbWluZ1wiIDogdHJ1ZSBcbiAgICAgIH0sIFxuICAgICAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICAgICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgICAgIFwicG9zaXRpb25cIiwgXG4gICAgICAgIFwibm9ybVwiIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBcInRleHRfaXRcIiwgXG4gICAgICBcInR5cGVcIiA6IFwidGV4dFwiLCBcbiAgICAgIFwicHJvcGVydGllc1wiIDogeyBcbiAgICAgICAgXCJsb2NhbGVcIiA6IFwiaXRcIiwgXG4gICAgICAgIFwiY2FzZVwiIDogXCJsb3dlclwiLCBcbiAgICAgICAgXCJzdG9wd29yZHNcIiA6IFsgXSwgXG4gICAgICAgIFwiYWNjZW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwic3RlbW1pbmdcIiA6IHRydWUgXG4gICAgICB9LCBcbiAgICAgIFwiZmVhdHVyZXNcIiA6IFsgXG4gICAgICAgIFwiZnJlcXVlbmN5XCIsIFxuICAgICAgICBcInBvc2l0aW9uXCIsIFxuICAgICAgICBcIm5vcm1cIiBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwibmFtZVwiIDogXCJ0ZXh0X25vXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcInRleHRcIiwgXG4gICAgICBcInByb3BlcnRpZXNcIiA6IHsgXG4gICAgICAgIFwibG9jYWxlXCIgOiBcIm5vXCIsIFxuICAgICAgICBcImNhc2VcIiA6IFwibG93ZXJcIiwgXG4gICAgICAgIFwic3RvcHdvcmRzXCIgOiBbIF0sIFxuICAgICAgICBcImFjY2VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInN0ZW1taW5nXCIgOiB0cnVlIFxuICAgICAgfSwgXG4gICAgICBcImZlYXR1cmVzXCIgOiBbIFxuICAgICAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICAgICAgXCJwb3NpdGlvblwiLCBcbiAgICAgICAgXCJub3JtXCIgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIm5hbWVcIiA6IFwidGV4dF96aFwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJ0ZXh0XCIsIFxuICAgICAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICAgICAgICBcImxvY2FsZVwiIDogXCJ6aFwiLCBcbiAgICAgICAgXCJjYXNlXCIgOiBcImxvd2VyXCIsIFxuICAgICAgICBcInN0b3B3b3Jkc1wiIDogWyBdLCBcbiAgICAgICAgXCJhY2NlbnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJzdGVtbWluZ1wiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIFwiZmVhdHVyZXNcIiA6IFsgXG4gICAgICAgIFwiZnJlcXVlbmN5XCIsIFxuICAgICAgICBcInBvc2l0aW9uXCIsIFxuICAgICAgICBcIm5vcm1cIiBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwibmFtZVwiIDogXCJpZGVudGl0eVwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJpZGVudGl0eVwiLCBcbiAgICAgIFwicHJvcGVydGllc1wiIDogeyBcbiAgICAgIH0sIFxuICAgICAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICAgICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgICAgIFwibm9ybVwiIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBcInRleHRfZnJcIiwgXG4gICAgICBcInR5cGVcIiA6IFwidGV4dFwiLCBcbiAgICAgIFwicHJvcGVydGllc1wiIDogeyBcbiAgICAgICAgXCJsb2NhbGVcIiA6IFwiZnJcIiwgXG4gICAgICAgIFwiY2FzZVwiIDogXCJsb3dlclwiLCBcbiAgICAgICAgXCJzdG9wd29yZHNcIiA6IFsgXSwgXG4gICAgICAgIFwiYWNjZW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwic3RlbW1pbmdcIiA6IHRydWUgXG4gICAgICB9LCBcbiAgICAgIFwiZmVhdHVyZXNcIiA6IFsgXG4gICAgICAgIFwiZnJlcXVlbmN5XCIsIFxuICAgICAgICBcInBvc2l0aW9uXCIsIFxuICAgICAgICBcIm5vcm1cIiBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwibmFtZVwiIDogXCJ0ZXh0X25sXCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcInRleHRcIiwgXG4gICAgICBcInByb3BlcnRpZXNcIiA6IHsgXG4gICAgICAgIFwibG9jYWxlXCIgOiBcIm5sXCIsIFxuICAgICAgICBcImNhc2VcIiA6IFwibG93ZXJcIiwgXG4gICAgICAgIFwic3RvcHdvcmRzXCIgOiBbIF0sIFxuICAgICAgICBcImFjY2VudFwiIDogZmFsc2UsIFxuICAgICAgICBcInN0ZW1taW5nXCIgOiB0cnVlIFxuICAgICAgfSwgXG4gICAgICBcImZlYXR1cmVzXCIgOiBbIFxuICAgICAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICAgICAgXCJwb3NpdGlvblwiLCBcbiAgICAgICAgXCJub3JtXCIgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIm5hbWVcIiA6IFwidGV4dF9wdFwiLCBcbiAgICAgIFwidHlwZVwiIDogXCJ0ZXh0XCIsIFxuICAgICAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICAgICAgICBcImxvY2FsZVwiIDogXCJwdFwiLCBcbiAgICAgICAgXCJjYXNlXCIgOiBcImxvd2VyXCIsIFxuICAgICAgICBcInN0b3B3b3Jkc1wiIDogWyBdLCBcbiAgICAgICAgXCJhY2NlbnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJzdGVtbWluZ1wiIDogdHJ1ZSBcbiAgICAgIH0sIFxuICAgICAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICAgICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgICAgIFwicG9zaXRpb25cIiwgXG4gICAgICAgIFwibm9ybVwiIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBcInRleHRfc3ZcIiwgXG4gICAgICBcInR5cGVcIiA6IFwidGV4dFwiLCBcbiAgICAgIFwicHJvcGVydGllc1wiIDogeyBcbiAgICAgICAgXCJsb2NhbGVcIiA6IFwic3ZcIiwgXG4gICAgICAgIFwiY2FzZVwiIDogXCJsb3dlclwiLCBcbiAgICAgICAgXCJzdG9wd29yZHNcIiA6IFsgXSwgXG4gICAgICAgIFwiYWNjZW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwic3RlbW1pbmdcIiA6IHRydWUgXG4gICAgICB9LCBcbiAgICAgIFwiZmVhdHVyZXNcIiA6IFsgXG4gICAgICAgIFwiZnJlcXVlbmN5XCIsIFxuICAgICAgICBcInBvc2l0aW9uXCIsIFxuICAgICAgICBcIm5vcm1cIiBcbiAgICAgIF0gXG4gICAgfSBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXRyaWV2ZSBhbGwgQW5hbHl6ZXIgZGVmaW5pdGlvbnM6IiwibmFtZSI6IlJlc3RBbmFseXplcnNHZXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestApiCollectionCompact_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QXBpQ29sbGVjdGlvbkNvbXBhY3QKLS0tCnZhciBjbiA9ICJ0ZXN0Q29sbGVjdGlvbiI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgJy9fYXBpL2NvbGxlY3Rpb24vJyArIGNuICsgJy9jb21wYWN0JywgJycpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL3Rlc3RDb2xsZWN0aW9uL2NvbXBhY3QnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNDFcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi90ZXN0Q29sbGVjdGlvbi9jb21wYWN0XG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzY4MjY3XCIsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJ0eXBlXCIgOiAyLCBcbiAgXCJuYW1lXCIgOiBcInRlc3RDb2xsZWN0aW9uXCIsIFxuICBcImlkXCIgOiBcIjY4MjY3XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RBcGlDb2xsZWN0aW9uQ29tcGFjdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestAqlfunctionCreate_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QXFsZnVuY3Rpb25DcmVhdGUKLS0tCnZhciB1cmwgPSAiL19hcGkvYXFsZnVuY3Rpb24iOwp2YXIgYm9keSA9IHsKICBuYW1lOiAibXlmdW5jdGlvbnM6OnRlbXBlcmF0dXJlOjpjZWxzaXVzdG9mYWhyZW5oZWl0IiwKICBjb2RlIDogImZ1bmN0aW9uIChjZWxzaXVzKSB7IHJldHVybiBjZWxzaXVzICogMS44ICsgMzI7IH0iLAogIGlzRGV0ZXJtaW5pc3RpYzogdHJ1ZQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCB8fCByZXNwb25zZS5jb2RlID09PSAyMDEgfHwgcmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hcWxmdW5jdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwibXlmdW5jdGlvbnM6OnRlbXBlcmF0dXJlOjpjZWxzaXVzdG9mYWhyZW5oZWl0XCIsXG4gIFwiY29kZVwiOiBcImZ1bmN0aW9uIChjZWxzaXVzKSB7IHJldHVybiBjZWxzaXVzICogMS44ICsgMzI7IH1cIixcbiAgXCJpc0RldGVybWluaXN0aWNcIjogdHJ1ZVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEsIFxuICBcImlzTmV3bHlDcmVhdGVkXCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0QXFsZnVuY3Rpb25DcmVhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestAqlfunctionDeleteFails_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIGZ1bmN0aW9uIG5vdCBmb3VuZDoKbmFtZTogUmVzdEFxbGZ1bmN0aW9uRGVsZXRlRmFpbHMKLS0tCnZhciB1cmwgPSAiL19hcGkvYXFsZnVuY3Rpb24vbXlmdW5jdGlvbjo6eDo6eSI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwNCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hcWxmdW5jdGlvbi9teWZ1bmN0aW9uOjp4Ojp5JyIsIm91dHB1dCI6IkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDExNFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwNCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJubyBBUUwgdXNlciBmdW5jdGlvbiB3aXRoIG5hbWUgJ215ZnVuY3Rpb246Ong6OnknIGZvdW5kXCIsIFxuICBcImVycm9yTnVtXCIgOiAxNTgyIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6ImZ1bmN0aW9uIG5vdCBmb3VuZDoiLCJuYW1lIjoiUmVzdEFxbGZ1bmN0aW9uRGVsZXRlRmFpbHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestAqlfunctionDelete_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIGRlbGV0ZXMgYSBmdW5jdGlvbjoKbmFtZTogUmVzdEFxbGZ1bmN0aW9uRGVsZXRlCi0tLQp2YXIgdXJsID0gIi9fYXBpL2FxbGZ1bmN0aW9uL3NxdWFyZTo6eDo6eSI7Cgp2YXIgYm9keSA9IHsKICBuYW1lIDogInNxdWFyZTo6eDo6eSIsCiAgY29kZSA6ICJmdW5jdGlvbiAoeCkgeyByZXR1cm4geCp4OyB9Igp9OwoKZGIuX2Nvbm5lY3Rpb24uUE9TVCgiL19hcGkvYXFsZnVuY3Rpb24iLCBib2R5KTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9hcWxmdW5jdGlvbi9zcXVhcmU6Ong6OnknIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0M1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJkZWxldGVkQ291bnRcIiA6IDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiZGVsZXRlcyBhIGZ1bmN0aW9uOiIsIm5hbWUiOiJSZXN0QXFsZnVuY3Rpb25EZWxldGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestAqlfunctionsGetAll_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QXFsZnVuY3Rpb25zR2V0QWxsCi0tLQp2YXIgdXJsID0gIi9fYXBpL2FxbGZ1bmN0aW9uL3Rlc3QiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2FxbGZ1bmN0aW9uL3Rlc3QnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAzOFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IFsgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEFxbGZ1bmN0aW9uc0dldEFsbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestBackupCreateBackup_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QmFja3VwQ3JlYXRlQmFja3VwCi0tLQp2YXIgdXJsID0gIi9fYWRtaW4vYmFja3VwL2NyZWF0ZSI7CnZhciBib2R5ID0gewogIGxhYmVsOiAiZm9vIgp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpib2R5ID0gewogIGVycm9yOmZhbHNlLCBjb2RlOjIwMSwKICByZXN1bHQ6IHsKICAgIGlkOiAiMjAxOS0wNC0yOFQxMi4wMC4wMFpfZm9vIgogIH0KfTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC9jcmVhdGUnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibGFiZWxcIjogXCJmb29cIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE4NlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxLCBcbiAgXCJyZXN1bHRcIiA6IHsgXG4gICAgXCJpZFwiIDogXCIyMDI1LTA1LTIzVDE4LjE1LjMxWl9mb29cIiwgXG4gICAgXCJwb3RlbnRpYWxseUluY29uc2lzdGVudFwiIDogZmFsc2UsIFxuICAgIFwic2l6ZUluQnl0ZXNcIiA6IDgxNjQ1ODUsIFxuICAgIFwiZGF0ZXRpbWVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNTozMVpcIiwgXG4gICAgXCJuckRCU2VydmVyc1wiIDogMSwgXG4gICAgXCJuckZpbGVzXCIgOiAyNyBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEJhY2t1cENyZWF0ZUJhY2t1cCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestBackupDeleteBackup_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QmFja3VwRGVsZXRlQmFja3VwCi0tLQp2YXIgYmFja3VwID0gcmVxdWlyZSgiQGFyYW5nb2RiL2hvdGJhY2t1cCIpLmNyZWF0ZSgpOwp2YXIgdXJsID0gIi9fYWRtaW4vYmFja3VwL2RlbGV0ZSI7CnZhciBib2R5ID0geyJpZCIgOiBiYWNrdXAuaWR9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpib2R5ID0gewogIHJlc3VsdDogewogIH0KfTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC9kZWxldGUnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaWRcIjogXCIyMDI1LTA1LTIzVDE4LjE1LjQxWl82ODQxNzUzMC0wOTVkLTQ1NjgtYmZlYS1iM2FjYmUyNzJlOGRcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAzOFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IHsgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RCYWNrdXBEZWxldGVCYWNrdXAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestBackupDownloadBackupStarted_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFRoZSBgcmVzdWx0YCBvYmplY3Qgb2YgdGhlIGJvZHkgaG9sZHMgdGhlIGBkb3dubG9hZElkYCBzdHJpbmcgYXR0cmlidXRlIHdoaWNoCiAgY2FuIGJlIHVzZWQgdG8gZm9sbG93IHRoZSBkb3dubG9hZCBwcm9jZXNzLgpuYW1lOiBSZXN0QmFja3VwRG93bmxvYWRCYWNrdXBTdGFydGVkCi0tLQp2YXIgaG90YmFja3VwID0gcmVxdWlyZSgiQGFyYW5nb2RiL2hvdGJhY2t1cCIpOwp0cnkgewogIHJlcXVpcmUoImZzIikubWFrZURpcmVjdG9yeSgiL3RtcC9iYWNrdXBzIik7Cn0gY2F0Y2goZSkgewp9CnZhciBiYWNrdXAgPSBob3RiYWNrdXAuY3JlYXRlKCk7CnZhciBib2R5ID0geyJpZCIgOiBiYWNrdXAuaWQsCiAgICAgICAgICAgICJyZW1vdGVSZXBvc2l0b3J5IjogImxvY2FsOi8vdG1wL2JhY2t1cHMiLAogICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICJsb2NhbCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjoibG9jYWwiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgfTsKdmFyIHVwbG9hZCA9IGhvdGJhY2t1cC51cGxvYWQoYmFja3VwLmlkLCAibG9jYWw6Ly90bXAvYmFja3VwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsb2NhbDp7dHlwZToibG9jYWwifX0pOwovLyBXYWl0IHVudGlsIHVwbG9hZCBjb21wbGV0ZToKZm9yICh2YXIgY291bnQgPSAwOyBjb3VudCA8IDMwOyArK2NvdW50KSB7CiAgdmFyIHByb2dyZXNzID0gaG90YmFja3VwLnVwbG9hZFByb2dyZXNzKHVwbG9hZC51cGxvYWRJZCk7CiAgdHJ5IHsKICAgIGlmIChwcm9ncmVzcy5EQlNlcnZlcnMuU05HTC5TdGF0dXMgPT09ICJDT01QTEVURUQiKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0gY2F0Y2goZSkgewogIH0KICBpbnRlcm5hbC53YWl0KDAuNSk7Cn0KaG90YmFja3VwLmRlbGV0ZShiYWNrdXAuaWQpOwp2YXIgZG93bmxvYWQgPSBob3RiYWNrdXAuZG93bmxvYWQoYmFja3VwLmlkLCAibG9jYWw6Ly90bXAvYmFja3VwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG9jYWw6e3R5cGU6ImxvY2FsIn19KTsKCmJvZHkgPSB7ImRvd25sb2FkSWQiIDogZG93bmxvYWQuZG93bmxvYWRJZH07CnZhciB1cmwgPSAiL19hZG1pbi9iYWNrdXAvZG93bmxvYWQiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmJvZHkgPSB7CiAgInJlc3VsdCI6IHsKICAgICJUaW1lc3RhbXAiOiAiMjAxOS0wNS0xNFQxNDo1MDo1NloiLAogICAgIkJhY2t1cElkIjogIjIwMTktMDUtMDFUMDAuMDAuMDBaX3NvbWUtbGFiZWwiLAogICAgIkRCU2VydmVycyI6IHsKICAgICAgIlNOR0wiOiB7CiAgICAgICAgIlN0YXR1cyI6ICJDT01QTEVURUQiCiAgICAgIH0KICAgIH0KICB9Cn07", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC9kb3dubG9hZCcgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJkb3dubG9hZElkXCI6IFwiNjg3MTBcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyMjRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiB7IFxuICAgIFwiVGltZXN0YW1wXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTJaXCIsIFxuICAgIFwiRG93bmxvYWRJZFwiIDogXCI2ODcxMFwiLCBcbiAgICBcIkNhbmNlbGxlZFwiIDogZmFsc2UsIFxuICAgIFwiQmFja3VwSWRcIiA6IFwiMjAyNS0wNS0yM1QxOC4xNS41N1pfZjU3NzNjNDUtMzM4ZC00ZmMyLThlMjUtNGU1NjhmZTE3NWU4XCIsIFxuICAgIFwiREJTZXJ2ZXJzXCIgOiB7IFxuICAgICAgXCJTTkdMXCIgOiB7IFxuICAgICAgICBcIlN0YXR1c1wiIDogXCJTVEFSVEVEXCIgXG4gICAgICB9IFxuICAgIH0gXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVGhlIGByZXN1bHRgIG9iamVjdCBvZiB0aGUgYm9keSBob2xkcyB0aGUgYGRvd25sb2FkSWRgIHN0cmluZyBhdHRyaWJ1dGUgd2hpY2hcbmNhbiBiZSB1c2VkIHRvIGZvbGxvdyB0aGUgZG93bmxvYWQgcHJvY2Vzcy4iLCJuYW1lIjoiUmVzdEJhY2t1cERvd25sb2FkQmFja3VwU3RhcnRlZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestBackupDownloadBackup_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QmFja3VwRG93bmxvYWRCYWNrdXAKLS0tCnZhciBob3RiYWNrdXAgPSByZXF1aXJlKCJAYXJhbmdvZGIvaG90YmFja3VwIik7CnRyeSB7CiAgcmVxdWlyZSgiZnMiKS5tYWtlRGlyZWN0b3J5KCIvdG1wL2JhY2t1cHMiKTsKfSBjYXRjaChlKSB7Cn0KdmFyIGJhY2t1cCA9IGhvdGJhY2t1cC5jcmVhdGUoKTsKdmFyIHVwbG9hZCA9IGhvdGJhY2t1cC51cGxvYWQoYmFja3VwLmlkLCAibG9jYWw6Ly90bXAvYmFja3VwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsb2NhbDp7dHlwZToibG9jYWwifX0pOwovLyBXYWl0IHVudGlsIHVwbG9hZCBjb21wbGV0ZToKZm9yICh2YXIgY291bnQgPSAwOyBjb3VudCA8IDMwOyArK2NvdW50KSB7CiAgdmFyIHByb2dyZXNzID0gaG90YmFja3VwLnVwbG9hZFByb2dyZXNzKHVwbG9hZC51cGxvYWRJZCk7CiAgdHJ5IHsKICAgIGlmIChwcm9ncmVzcy5EQlNlcnZlcnMuU05HTC5TdGF0dXMgPT09ICJDT01QTEVURUQiKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0gY2F0Y2goZSkgewogIH0KICBpbnRlcm5hbC53YWl0KDAuNSk7Cn0KaG90YmFja3VwLmRlbGV0ZShiYWNrdXAuaWQpOwp2YXIgdXJsID0gIi9fYWRtaW4vYmFja3VwL2Rvd25sb2FkIjsKYm9keSA9IHsiaWQiIDogYmFja3VwLmlkLAogICAgICAgICJyZW1vdGVSZXBvc2l0b3J5IjogImxvY2FsOi8vdG1wL2JhY2t1cHMiLAogICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAibG9jYWwiOiB7CiAgICAgICAgICAgICJ0eXBlIjoibG9jYWwiCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpib2R5ID0gewogIHJlc3VsdDogewogICAgZG93bmxvYWRJZDogIjEwMDQ2IgogIH0KfTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC9kb3dubG9hZCcgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJpZFwiOiBcIjIwMjUtMDUtMjNUMTguMTUuNDFaX2FmZjYxYWNlLTA5ZTgtNDI2Zi05ZjZiLTEwMGMyYTFiNGM0NVwiLFxuICBcInJlbW90ZVJlcG9zaXRvcnlcIjogXCJsb2NhbDovL3RtcC9iYWNrdXBzXCIsXG4gIFwiY29uZmlnXCI6IHtcbiAgICBcImxvY2FsXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImxvY2FsXCJcbiAgICB9XG4gIH1cbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNThcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiwgXG4gIFwicmVzdWx0XCIgOiB7IFxuICAgIFwiZG93bmxvYWRJZFwiIDogXCI2ODcwNFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0QmFja3VwRG93bmxvYWRCYWNrdXAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestBackupListBackup_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QmFja3VwTGlzdEJhY2t1cAotLS0KdmFyIGJhY2t1cCA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ob3RiYWNrdXAiKS5jcmVhdGUoKTsKdmFyIGJhY2t1cDIgPSByZXF1aXJlKCJAYXJhbmdvZGIvaG90YmFja3VwIikuY3JlYXRlKCk7CnZhciB1cmwgPSAiL19hZG1pbi9iYWNrdXAvbGlzdCI7CnZhciBib2R5ID0ge307Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmJvZHkgPSB7CiAgcmVzdWx0OiB7CiAgICBsaXN0OiB7CiAgICAgICAgIjIwMTktMDQtMjhUMTIuMDAuMDBaX215LWxhYmVsIjogewogICAgICAgICAgICAiaWQiOiAiMjAxOS0wNC0yOFQxMi4wMC4wMFpfbXktbGFiZWwiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIzLjQuNSIsCiAgICAgICAgICAgICJkYXRldGltZSI6ICIyMDE5LTA0LTI4VDEyLjAwLjAwWiIsCiAgICAgICAgICAgICJrZXlzIjogWyB7InNoYTI1NiI6ICI4NjEwMDllYzRkNTk5ZmFiMWY0MGFiYzc2ZTZmODk4ODBjZmY1ODMzYzc5YzU0OGM5OWY5MDQ1ZjE5MWNkOTBiIn0gXQogICAgICAgIH0sCiAgICAgICAgIjIwMTktMDQtMjhUMTIuMTAuMDBaLW90aGVyLWxhYmVsIjogewogICAgICAgICAgICAiaWQiOiAiMjAxOS0wNC0yOFQxMi4xMC4wMFotb3RoZXItbGFiZWwiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIzLjQuNSIsCiAgICAgICAgICAgICJkYXRldGltZSI6ICIyMDE5LTA0LTI4VDEyLjEwLjAwWiIsCiAgICAgICAgICAgICJrZXlzIjogWyB7InNoYTI1NiI6ICI4NjEwMDllZDRkNTk5ZmFiMWY0MGFiYzc2ZTZmODk4ODBjZmY1ODMzYzc5YzU0OGM5OWY5MDQ1ZjE5MWNkOTBiIn0gXQogICAgICAgIH0KICAgIH0KICB9Cn07", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC9saXN0JyBcdTAwM2NcdTAwM2MnRU9GJ1xue31cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTM5N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IHsgXG4gICAgXCJzZXJ2ZXJcIiA6IFwiU05HTC00Y2M1NmE4MC1hOTcxLTQ5OGEtOWIwNy04ZjM2NmJmNThkYjNcIiwgXG4gICAgXCJsaXN0XCIgOiB7IFxuICAgICAgXCIyMDI1LTA1LTIzVDE4LjE1LjMxWl9mb29cIiA6IHsgXG4gICAgICAgIFwiaWRcIiA6IFwiMjAyNS0wNS0yM1QxOC4xNS4zMVpfZm9vXCIsIFxuICAgICAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICAgICAgXCJkYXRldGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE1OjMxWlwiLCBcbiAgICAgICAgXCJrZXlzXCIgOiBbIF0sIFxuICAgICAgICBcInNpemVJbkJ5dGVzXCIgOiA4MTY0NTg1LCBcbiAgICAgICAgXCJuckZpbGVzXCIgOiAyNywgXG4gICAgICAgIFwibnJEQlNlcnZlcnNcIiA6IDEsIFxuICAgICAgICBcImF2YWlsYWJsZVwiIDogdHJ1ZSwgXG4gICAgICAgIFwibnJQaWVjZXNQcmVzZW50XCIgOiAxLCBcbiAgICAgICAgXCJwb3RlbnRpYWxseUluY29uc2lzdGVudFwiIDogZmFsc2UsIFxuICAgICAgICBcImNvdW50SW5jbHVkZXNGaWxlc09ubHlcIiA6IHRydWUgXG4gICAgICB9LCBcbiAgICAgIFwiMjAyNS0wNS0yM1QxOC4xNS40MVpfN2Q1ZDlmYzktY2ZlZS00MDgzLTg0ODAtNTNiODY0ZjFjMGFlXCIgOiB7IFxuICAgICAgICBcImlkXCIgOiBcIjIwMjUtMDUtMjNUMTguMTUuNDFaXzdkNWQ5ZmM5LWNmZWUtNDA4My04NDgwLTUzYjg2NGYxYzBhZVwiLCBcbiAgICAgICAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gICAgICAgIFwiZGF0ZXRpbWVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNTo0MVpcIiwgXG4gICAgICAgIFwia2V5c1wiIDogWyBdLCBcbiAgICAgICAgXCJzaXplSW5CeXRlc1wiIDogODE1MjI5MCwgXG4gICAgICAgIFwibnJGaWxlc1wiIDogMjcsIFxuICAgICAgICBcIm5yREJTZXJ2ZXJzXCIgOiAxLCBcbiAgICAgICAgXCJhdmFpbGFibGVcIiA6IHRydWUsIFxuICAgICAgICBcIm5yUGllY2VzUHJlc2VudFwiIDogMSwgXG4gICAgICAgIFwicG90ZW50aWFsbHlJbmNvbnNpc3RlbnRcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJjb3VudEluY2x1ZGVzRmlsZXNPbmx5XCIgOiB0cnVlIFxuICAgICAgfSwgXG4gICAgICBcIjIwMjUtMDUtMjNUMTguMTUuNDFaX2JlNjY5MDc2LTgxYzQtNGI5MS04OGEzLTAzYTI4MTlmNDVjNFwiIDogeyBcbiAgICAgICAgXCJpZFwiIDogXCIyMDI1LTA1LTIzVDE4LjE1LjQxWl9iZTY2OTA3Ni04MWM0LTRiOTEtODhhMy0wM2EyODE5ZjQ1YzRcIiwgXG4gICAgICAgIFwidmVyc2lvblwiIDogXCIzLjExLjE0XCIsIFxuICAgICAgICBcImRhdGV0aW1lXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTU6NDFaXCIsIFxuICAgICAgICBcImtleXNcIiA6IFsgXSwgXG4gICAgICAgIFwic2l6ZUluQnl0ZXNcIiA6IDgxNTIzMjIsIFxuICAgICAgICBcIm5yRmlsZXNcIiA6IDI4LCBcbiAgICAgICAgXCJuckRCU2VydmVyc1wiIDogMSwgXG4gICAgICAgIFwiYXZhaWxhYmxlXCIgOiB0cnVlLCBcbiAgICAgICAgXCJuclBpZWNlc1ByZXNlbnRcIiA6IDEsIFxuICAgICAgICBcInBvdGVudGlhbGx5SW5jb25zaXN0ZW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwiY291bnRJbmNsdWRlc0ZpbGVzT25seVwiIDogdHJ1ZSBcbiAgICAgIH0sIFxuICAgICAgXCIyMDI1LTA1LTIzVDE4LjE1LjMxWl84MTNmYmY2ZS00OTUyLTQ0ZmYtOGY3Yi00NzhkNGM2ZWJkYTVcIiA6IHsgXG4gICAgICAgIFwiaWRcIiA6IFwiMjAyNS0wNS0yM1QxOC4xNS4zMVpfODEzZmJmNmUtNDk1Mi00NGZmLThmN2ItNDc4ZDRjNmViZGE1XCIsIFxuICAgICAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICAgICAgXCJkYXRldGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE1OjMxWlwiLCBcbiAgICAgICAgXCJrZXlzXCIgOiBbIF0sIFxuICAgICAgICBcInNpemVJbkJ5dGVzXCIgOiA4MTcxMjQ5LCBcbiAgICAgICAgXCJuckZpbGVzXCIgOiAzMCwgXG4gICAgICAgIFwibnJEQlNlcnZlcnNcIiA6IDEsIFxuICAgICAgICBcImF2YWlsYWJsZVwiIDogdHJ1ZSwgXG4gICAgICAgIFwibnJQaWVjZXNQcmVzZW50XCIgOiAxLCBcbiAgICAgICAgXCJwb3RlbnRpYWxseUluY29uc2lzdGVudFwiIDogZmFsc2UsIFxuICAgICAgICBcImNvdW50SW5jbHVkZXNGaWxlc09ubHlcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIH0gXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RCYWNrdXBMaXN0QmFja3VwIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestBackupRestoreBackup_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QmFja3VwUmVzdG9yZUJhY2t1cAotLS0KdmFyIGJhY2t1cCA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ob3RiYWNrdXAiKS5jcmVhdGUoKTsKdmFyIHVybCA9ICIvX2FkbWluL2JhY2t1cC9yZXN0b3JlIjsKdmFyIGJvZHkgPSB7CiAgaWQ6IGJhY2t1cC5pZAp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpib2R5ID0gewogIGVycm9yOiBmYWxzZSwgY29kZTogMjAwLAogIHJlc3VsdDogewogICAgInByZXZpb3VzIjoiRkFJTFNBRkUiLCAiaXNDbHVzdGVyIjpmYWxzZQogIH0KfTsKLy8gTmVlZCB0byB3YWl0IGZvciByZXN0b3JlIHRvIGhhdmUgaGFwcGVuZWQsIHRoZW4gbmVlZCB0byB0cnkgYW55Ci8vIHJlcXVlc3QgdG8gcmVlc3RhYmxpc2ggY29ubmVjdGl2aXR5IHN1Y2ggdGhhdCB0aGUgbmV4dCByZXF1ZXN0Ci8vIHdpbGwgd29yayBhZ2FpbjoKdmFyIHN0YXJ0VGltZSA9IHJlcXVpcmUoImludGVybmFsIikudGltZSgpOwp2YXIgZmFpbHVyZVNlZW4gPSBmYWxzZTsKd2hpbGUgKHJlcXVpcmUoImludGVybmFsIikudGltZSgpIC0gc3RhcnRUaW1lIDwgMTApIHsKICB0cnkgewogICAgLy8gR0VUIGNhbiB0aHJvdyBleGNlcHRpb25zCiAgICB2YXIgciA9IGludGVybmFsLmFyYW5nby5HRVQoIi9fYXBpL3ZlcnNpb24iKTsKICAgIGlmIChyLmVycm9yID09PSB0cnVlKSB7CiAgICAgIGZhaWx1cmVTZWVuID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmYWlsdXJlU2VlbikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSBjYXRjaChlcnIpIHsKICB9CiAgcmVxdWlyZSgiaW50ZXJuYWwiKS53YWl0KDAuMSk7Cn0=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC9yZXN0b3JlJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcImlkXCI6IFwiMjAyNS0wNS0yM1QxOC4xNS4zMVpfODEzZmJmNmUtNDk1Mi00NGZmLThmN2ItNDc4ZDRjNmViZGE1XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogOTdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiB7IFxuICAgIFwicHJldmlvdXNcIiA6IFwiL3Zhci9saWIvYXJhbmdvZGIzL2JhY2t1cHMvRElSRUNUT1JZX1RPX0RFTEVURVwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0QmFja3VwUmVzdG9yZUJhY2t1cCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestBackupUploadBackupStarted_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFRoZSBgcmVzdWx0YCBvYmplY3Qgb2YgdGhlIGJvZHkgaG9sZHMgdGhlIGB1cGxvYWRJZGAgc3RyaW5nIGF0dHJpYnV0ZSB3aGljaCBjYW4KICBiZSB1c2VkIHRvIGZvbGxvdyB0aGUgdXBsb2FkIHByb2Nlc3MuCm5hbWU6IFJlc3RCYWNrdXBVcGxvYWRCYWNrdXBTdGFydGVkCi0tLQp0cnkgewogIHJlcXVpcmUoImZzIikubWFrZURpcmVjdG9yeSgiL3RtcC9iYWNrdXBzIik7Cn0gY2F0Y2goZSkgewp9CnZhciBiYWNrdXAgPSBpbnRlcm5hbC5hcmFuZ28uUE9TVCgiL19hZG1pbi9iYWNrdXAvY3JlYXRlIiwiIik7CnZhciBib2R5ID0geyJpZCIgOiBiYWNrdXAucmVzdWx0LmlkLAogICAgICAgICAgICAicmVtb3RlUmVwb3NpdG9yeSI6ICJsb2NhbDovL3RtcC9iYWNrdXBzIiwKICAgICAgICAgICAgImNvbmZpZyI6IHsKICAgICAgICAgICAgICAibG9jYWwiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ImxvY2FsIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgIH07CnZhciB1cGxvYWQgPSBpbnRlcm5hbC5hcmFuZ28uUE9TVCgiL19hZG1pbi9iYWNrdXAvdXBsb2FkIixib2R5KTsKdmFyIHVybCA9ICIvX2FkbWluL2JhY2t1cC91cGxvYWQiOwp2YXIgYm9keSA9IHsidXBsb2FkSWQiIDogdXBsb2FkLnJlc3VsdC51cGxvYWRJZH07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmJvZHkgPSB7CiAgInJlc3VsdCI6IHsKICAgICJUaW1lc3RhbXAiOiAiMjAxOS0wNS0xNFQxNDo1MDo1NloiLAogICAgIkJhY2t1cElkIjogIjIwMTktMDUtMDFUMDAuMDAuMDBaX3NvbWUtbGFiZWwiLAogICAgIkRCU2VydmVycyI6IHsKICAgICAgIlNOR0wiOiB7CiAgICAgICAgIlN0YXR1cyI6ICJDT01QTEVURUQiCiAgICAgIH0KICAgIH0KICB9Cn07", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC91cGxvYWQnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwidXBsb2FkSWRcIjogXCI2ODY5NFwiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIyMlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IHsgXG4gICAgXCJUaW1lc3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNTo0MVpcIiwgXG4gICAgXCJVcGxvYWRJZFwiIDogXCI2ODY5NFwiLCBcbiAgICBcIkNhbmNlbGxlZFwiIDogZmFsc2UsIFxuICAgIFwiQmFja3VwSWRcIiA6IFwiMjAyNS0wNS0yM1QxOC4xNS40MVpfYzk4OGU2ZDItMjg4YS00MTViLTg3ODItNjRlZjFlZWMxN2JmXCIsIFxuICAgIFwiREJTZXJ2ZXJzXCIgOiB7IFxuICAgICAgXCJTTkdMXCIgOiB7IFxuICAgICAgICBcIlN0YXR1c1wiIDogXCJTVEFSVEVEXCIgXG4gICAgICB9IFxuICAgIH0gXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVGhlIGByZXN1bHRgIG9iamVjdCBvZiB0aGUgYm9keSBob2xkcyB0aGUgYHVwbG9hZElkYCBzdHJpbmcgYXR0cmlidXRlIHdoaWNoIGNhblxuYmUgdXNlZCB0byBmb2xsb3cgdGhlIHVwbG9hZCBwcm9jZXNzLiIsIm5hbWUiOiJSZXN0QmFja3VwVXBsb2FkQmFja3VwU3RhcnRlZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestBackupUploadBackup_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0QmFja3VwVXBsb2FkQmFja3VwCi0tLQp0cnkgewogIHJlcXVpcmUoImZzIikubWFrZURpcmVjdG9yeSgiL3RtcC9iYWNrdXBzIik7Cn0gY2F0Y2goZSkgewp9CnZhciBiYWNrdXAgPSByZXF1aXJlKCJAYXJhbmdvZGIvaG90YmFja3VwIikuY3JlYXRlKCk7CnZhciB1cmwgPSAiL19hZG1pbi9iYWNrdXAvdXBsb2FkIjsKdmFyIGJvZHkgPSB7ImlkIiA6IGJhY2t1cC5pZCwKICAgICAgICAgICAgInJlbW90ZVJlcG9zaXRvcnkiOiAibG9jYWw6Ly90bXAvYmFja3VwcyIsCiAgICAgICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICAgImxvY2FsIjogewogICAgICAgICAgICAgICAgInR5cGUiOiJsb2NhbCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICB9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmJvZHkgPSB7CiAgcmVzdWx0OiB7CiAgICB1cGxvYWRJZDogIjEwMDQ2IgogIH0KfTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL2JhY2t1cC91cGxvYWQnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaWRcIjogXCIyMDI1LTA1LTIzVDE4LjE1LjQxWl82MDlkMGQ3Ny01NTAxLTRhMDgtOTM4Mi01MjNjZTAxMzcxMzJcIixcbiAgXCJyZW1vdGVSZXBvc2l0b3J5XCI6IFwibG9jYWw6Ly90bXAvYmFja3Vwc1wiLFxuICBcImNvbmZpZ1wiOiB7XG4gICAgXCJsb2NhbFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJsb2NhbFwiXG4gICAgfVxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU2XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIsIFxuICBcInJlc3VsdFwiIDogeyBcbiAgICBcInVwbG9hZElkXCIgOiBcIjY4NjkzXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RCYWNrdXBVcGxvYWRCYWNrdXAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestBatchImplicitBoundary_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFNlbmRpbmcgYSBiYXRjaCByZXF1ZXN0LCBzZXR0aW5nIHRoZSBib3VuZGFyeSBpbXBsaWNpdGx5LiBUaGUgc2VydmVyIHRyaWVzCiAgdG8gZmluZCB0aGUgYm91bmRhcnkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdCBib2R5IGluIHRoaXMgY2FzZS4KCiAgVGhlIHNlcnZlciByZXNwb25zZSBpcyBmb3JtYXR0ZWQgZm9yIHJlYWRhYmlsaXR5LiBUaGUgYOKGqWAgY2hhcmFjdGVyIGRlbm90ZXMKICB0aGUgb3JpZ2luYWwgbGluZSBicmVha3MuCm5hbWU6IFJlc3RCYXRjaEltcGxpY2l0Qm91bmRhcnkKLS0tCnZhciBwYXJ0cyA9IFsKICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcclxuXHJcbiIgKwogICAgICJERUxFVEUgL19hcGkvY29sbGVjdGlvbi9ub25leGlzdGVudDEgSFRUUC8xLjFcclxuIiwKICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcclxuXHJcbiIgKwogICAgICJERUxFVEUgX2FwaS9jb2xsZWN0aW9uL25vbmV4aXN0ZW50MiBIVFRQLzEuMVxyXG4iCl07CnZhciBib3VuZGFyeSA9ICJTb21lQm91bmRhcnlWYWx1ZSI7CnZhciBib2R5ID0gIi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iICsKICAgICAgICAgICBwYXJ0cy5qb2luKCJcclxuIiArICItLSIgKyBib3VuZGFyeSArICJcclxuIikgKwogICAgICAgICAgICItLSIgKyBib3VuZGFyeSArICItLVxyXG4iOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCAnL19hcGkvYmF0Y2gnLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwphc3NlcnQocmVzcG9uc2UuaGVhZGVyc1sneC1hcmFuZ28tZXJyb3JzJ10gPT0gMik7Cgpsb2dQbGFpblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9iYXRjaCcgXHUwMDNjXHUwMDNjJ0VPRidcbi0tU29tZUJvdW5kYXJ5VmFsdWVcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XG5cbkRFTEVURSAvX2FwaS9jb2xsZWN0aW9uL25vbmV4aXN0ZW50MSBIVFRQLzEuMVxuXG4tLVNvbWVCb3VuZGFyeVZhbHVlXG5Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWJhdGNocGFydFxuXG5ERUxFVEUgX2FwaS9jb2xsZWN0aW9uL25vbmV4aXN0ZW50MiBIVFRQLzEuMVxuLS1Tb21lQm91bmRhcnlWYWx1ZS0tXG5cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiB1bnNldFxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU5OFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tZXJyb3JzOiAyXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWVcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XG5cbkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcblNlcnZlcjogXG5Db25uZWN0aW9uOiBDbG9zZSBcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFxuQ29udGVudC1MZW5ndGg6IDg3XG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcImNvbGxlY3Rpb24gb3IgdmlldyBub3QgZm91bmRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDMgXG594oapXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWVcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XG5cbkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcblNlcnZlcjogXG5Db25uZWN0aW9uOiBDbG9zZSBcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFxuQ29udGVudC1MZW5ndGg6IDEwMVxuXG57IFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yTnVtXCIgOiA0MDQsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJ1bmtub3duIHBhdGggJ19hcGkvY29sbGVjdGlvbi9ub25leGlzdGVudDInXCIgXG594oapXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWUtLSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlNlbmRpbmcgYSBiYXRjaCByZXF1ZXN0LCBzZXR0aW5nIHRoZSBib3VuZGFyeSBpbXBsaWNpdGx5LiBUaGUgc2VydmVyIHRyaWVzXG50byBmaW5kIHRoZSBib3VuZGFyeSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0IGJvZHkgaW4gdGhpcyBjYXNlLlxuXG5UaGUgc2VydmVyIHJlc3BvbnNlIGlzIGZvcm1hdHRlZCBmb3IgcmVhZGFiaWxpdHkuIFRoZSBg4oapYCBjaGFyYWN0ZXIgZGVub3Rlc1xudGhlIG9yaWdpbmFsIGxpbmUgYnJlYWtzLiIsIm5hbWUiOiJSZXN0QmF0Y2hJbXBsaWNpdEJvdW5kYXJ5IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestBatchMultipartHeader_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFNlbmRpbmcgYSBiYXRjaCByZXF1ZXN0IHdpdGggZml2ZSBiYXRjaCBwYXJ0czoKCiAgLSBHRVQgL19hcGkvdmVyc2lvbgogIC0gREVMRVRFIC9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMKICAtIFBPU1QgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cwogIC0gR0VUIC9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvZmlndXJlcwogIC0gREVMRVRFIC9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMKCiAgVGhlIGJvdW5kYXJ5IChgU29tZUJvdW5kYXJ5VmFsdWVgKSBpcyBwYXNzZWQgdG8gdGhlIHNlcnZlciBpbiB0aGUgSFRUUAogIGBDb250ZW50LVR5cGVgIEhUVFAgaGVhZGVyLgoKICBUaGUgc2VydmVyIHJlc3BvbnNlIGlzIGZvcm1hdHRlZCBmb3IgcmVhZGFiaWxpdHkuIFRoZSBg4oapYCBjaGFyYWN0ZXIgZGVub3RlcwogIHRoZSBvcmlnaW5hbCBsaW5lIGJyZWFrcy4KbmFtZTogUmVzdEJhdGNoTXVsdGlwYXJ0SGVhZGVyCi0tLQp2YXIgcGFydHMgPSBbCiAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XHJcbiIgKwogICJDb250ZW50LUlkOiBteUlkMVxyXG5cclxuIiArCiAgIkdFVCAvX2FwaS92ZXJzaW9uIEhUVFAvMS4xXHJcbiIsCgogICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWJhdGNocGFydFxyXG4iICsKICAiQ29udGVudC1JZDogbXlJZDJcclxuXHJcbiIgKwogICJERUxFVEUgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cyBIVFRQLzEuMVxyXG4iLAoKICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcclxuIiArCiAgIkNvbnRlbnQtSWQ6IHNvbWVJZFxyXG5cclxuIiArCiAgIlBPU1QgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cyBIVFRQLzEuMVxyXG5cclxuIiArCiAgIntcIm5hbWVcIjogXCJwcm9kdWN0c1wiIH1cclxuIiwKCiAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XHJcbiIgKwogICJDb250ZW50LUlkOiBuZXh0SWRcclxuXHJcbiIgKwogICJHRVQgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9maWd1cmVzIEhUVFAvMS4xXHJcbiIsCgogICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWJhdGNocGFydFxyXG4iICsKICAiQ29udGVudC1JZDogb3RoZXJJZFxyXG5cclxuIiArCiAgIkRFTEVURSAvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzIEhUVFAvMS4xXHJcbiIKXTsKdmFyIGJvdW5kYXJ5ID0gIlNvbWVCb3VuZGFyeVZhbHVlIjsKdmFyIGhlYWRlcnMgPSB7ICJDb250ZW50LVR5cGUiIDogIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSIgKyBib3VuZGFyeSB9Owp2YXIgYm9keSA9ICItLSIgKyBib3VuZGFyeSArICJcclxuIiArCiAgICAgICAgICAgcGFydHMuam9pbigiXHJcbiIgKyAiLS0iICsgYm91bmRhcnkgKyAiXHJcbiIpICsKICAgICAgICAgICAiLS0iICsgYm91bmRhcnkgKyAiLS1cclxuIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgJy9fYXBpL2JhdGNoJywgYm9keSwgaGVhZGVycyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ1BsYWluUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT1Tb21lQm91bmRhcnlWYWx1ZScgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvYmF0Y2gnIFx1MDAzY1x1MDAzYydFT0YnXG4tLVNvbWVCb3VuZGFyeVZhbHVlXG5Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWJhdGNocGFydFxuQ29udGVudC1JZDogbXlJZDFcblxuR0VUIC9fYXBpL3ZlcnNpb24gSFRUUC8xLjFcblxuLS1Tb21lQm91bmRhcnlWYWx1ZVxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcbkNvbnRlbnQtSWQ6IG15SWQyXG5cbkRFTEVURSAvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzIEhUVFAvMS4xXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWVcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XG5Db250ZW50LUlkOiBzb21lSWRcblxuUE9TVCAvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzIEhUVFAvMS4xXG5cbntcIm5hbWVcIjogXCJwcm9kdWN0c1wiIH1cblxuLS1Tb21lQm91bmRhcnlWYWx1ZVxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcbkNvbnRlbnQtSWQ6IG5leHRJZFxuXG5HRVQgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9maWd1cmVzIEhUVFAvMS4xXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWVcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XG5Db250ZW50LUlkOiBvdGhlcklkXG5cbkRFTEVURSAvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzIEhUVFAvMS4xXG4tLVNvbWVCb3VuZGFyeVZhbHVlLS1cblxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IG11bHRpcGFydC9mb3JtLWRhdGFcbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyMzIwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1lcnJvcnM6IDFcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuLS1Tb21lQm91bmRhcnlWYWx1ZVxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcbkNvbnRlbnQtSWQ6IG15SWQxXG5cbkhUVFAvMS4xIDIwMCBPS1xuU2VydmVyOiBcbkNvbm5lY3Rpb246IENsb3NlIFxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XG5Db250ZW50LUxlbmd0aDogNjJcblxueyBcbiAgXCJzZXJ2ZXJcIiA6IFwiYXJhbmdvXCIsIFxuICBcImxpY2Vuc2VcIiA6IFwiZW50ZXJwcmlzZVwiLCBcbiAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiBcbn3ihqlcblxuLS1Tb21lQm91bmRhcnlWYWx1ZVxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1iYXRjaHBhcnRcbkNvbnRlbnQtSWQ6IG15SWQyXG5cbkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcblNlcnZlcjogXG5Db25uZWN0aW9uOiBDbG9zZSBcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFxuQ29udGVudC1MZW5ndGg6IDg3XG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcImNvbGxlY3Rpb24gb3IgdmlldyBub3QgZm91bmRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDMgXG594oapXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWVcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tYmF0Y2hwYXJ0XG5Db250ZW50LUlkOiBzb21lSWRcblxuSFRUUC8xLjEgMjAwIE9LXG5TZXJ2ZXI6IFxuQ29ubmVjdGlvbjogQ2xvc2UgXG5Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcbkNvbnRlbnQtTGVuZ3RoOiA0NDZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwid3JpdGVDb25jZXJuXCIgOiAxLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcInVzZXNSZXZpc2lvbnNBc0RvY3VtZW50SWRzXCIgOiB0cnVlLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic3RhdHVzU3RyaW5nXCIgOiBcImxvYWRlZFwiLCBcbiAgXCJpZFwiIDogXCI2NzkyOFwiLCBcbiAgXCJpc1NtYXJ0Q2hpbGRcIiA6IGZhbHNlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwsIFxuICBcIm5hbWVcIiA6IFwicHJvZHVjdHNcIiwgXG4gIFwidHlwZVwiIDogMiwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcImludGVybmFsVmFsaWRhdG9yVHlwZVwiIDogMCwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzY3OTI4XCIsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJvYmplY3RJZFwiIDogXCI2NzkyN1wiIFxufeKGqVxuXG4tLVNvbWVCb3VuZGFyeVZhbHVlXG5Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWJhdGNocGFydFxuQ29udGVudC1JZDogbmV4dElkXG5cbkhUVFAvMS4xIDIwMCBPS1xuU2VydmVyOiBcbkxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL2ZpZ3VyZXNcbkNvbm5lY3Rpb246IENsb3NlIFxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XG5Db250ZW50LUxlbmd0aDogNTY1XG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImZpZ3VyZXNcIiA6IHsgXG4gICAgXCJpbmRleGVzXCIgOiB7IFxuICAgICAgXCJjb3VudFwiIDogMSwgXG4gICAgICBcInNpemVcIiA6IDAgXG4gICAgfSwgXG4gICAgXCJkb2N1bWVudHNTaXplXCIgOiAwLCBcbiAgICBcImNhY2hlSW5Vc2VcIiA6IGZhbHNlLCBcbiAgICBcImNhY2hlU2l6ZVwiIDogMCwgXG4gICAgXCJjYWNoZVVzYWdlXCIgOiAwIFxuICB9LCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcIndhaXRGb3JTeW5jXCIgOiBmYWxzZSwgXG4gIFwidXNlc1JldmlzaW9uc0FzRG9jdW1lbnRJZHNcIiA6IHRydWUsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzdGF0dXNTdHJpbmdcIiA6IFwibG9hZGVkXCIsIFxuICBcImlkXCIgOiBcIjY3OTI4XCIsIFxuICBcImlzU21hcnRDaGlsZFwiIDogZmFsc2UsIFxuICBcInNjaGVtYVwiIDogbnVsbCwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1wiLCBcbiAgXCJ0eXBlXCIgOiAyLCBcbiAgXCJzdGF0dXNcIiA6IDMsIFxuICBcImNvdW50XCIgOiAwLCBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcImludGVybmFsVmFsaWRhdG9yVHlwZVwiIDogMCwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzY3OTI4XCIsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJvYmplY3RJZFwiIDogXCI2NzkyN1wiIFxufeKGqVxuXG4tLVNvbWVCb3VuZGFyeVZhbHVlXG5Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWJhdGNocGFydFxuQ29udGVudC1JZDogb3RoZXJJZFxuXG5IVFRQLzEuMSAyMDAgT0tcblNlcnZlcjogXG5Db25uZWN0aW9uOiBDbG9zZSBcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFxuQ29udGVudC1MZW5ndGg6IDM5XG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImlkXCIgOiBcIjY3OTI4XCIgXG594oapXG5cbi0tU29tZUJvdW5kYXJ5VmFsdWUtLSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlNlbmRpbmcgYSBiYXRjaCByZXF1ZXN0IHdpdGggZml2ZSBiYXRjaCBwYXJ0czpcblxuLSBHRVQgL19hcGkvdmVyc2lvblxuLSBERUxFVEUgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0c1xuLSBQT1NUIC9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHNcbi0gR0VUIC9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvZmlndXJlc1xuLSBERUxFVEUgL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0c1xuXG5UaGUgYm91bmRhcnkgKGBTb21lQm91bmRhcnlWYWx1ZWApIGlzIHBhc3NlZCB0byB0aGUgc2VydmVyIGluIHRoZSBIVFRQXG5gQ29udGVudC1UeXBlYCBIVFRQIGhlYWRlci5cblxuVGhlIHNlcnZlciByZXNwb25zZSBpcyBmb3JtYXR0ZWQgZm9yIHJlYWRhYmlsaXR5LiBUaGUgYOKGqWAgY2hhcmFjdGVyIGRlbm90ZXNcbnRoZSBvcmlnaW5hbCBsaW5lIGJyZWFrcy4iLCJuYW1lIjoiUmVzdEJhdGNoTXVsdGlwYXJ0SGVhZGVyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionCreateCollection_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbkNyZWF0ZUNvbGxlY3Rpb24KLS0tCnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbiI7CnZhciBib2R5ID0gewogIG5hbWU6ICJ0ZXN0Q29sbGVjdGlvbkJhc2ljcyIKfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKYm9keSA9IHsKICBuYW1lOiAidGVzdENvbGxlY3Rpb25FZGdlcyIsCiAgdHlwZSA6IDMKfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZGIuX2ZsdXNoQ2FjaGUoKTsKZGIuX2Ryb3AoInRlc3RDb2xsZWN0aW9uQmFzaWNzIik7CmRiLl9kcm9wKCJ0ZXN0Q29sbGVjdGlvbkVkZ2VzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJ0ZXN0Q29sbGVjdGlvbkJhc2ljc1wiXG59XG5FT0ZcblxuY3VybCAtWCBQT1NUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24nIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibmFtZVwiOiBcInRlc3RDb2xsZWN0aW9uRWRnZXNcIixcbiAgXCJ0eXBlXCI6IDNcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDU4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwiaWRcIiA6IFwiNjgyMDFcIiwgXG4gIFwiaXNTbWFydENoaWxkXCIgOiBmYWxzZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJuYW1lXCIgOiBcInRlc3RDb2xsZWN0aW9uQmFzaWNzXCIsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODIwMVwiLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwib2JqZWN0SWRcIiA6IFwiNjgyMDBcIiBcbn1cblxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ1N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcIndhaXRGb3JTeW5jXCIgOiBmYWxzZSwgXG4gIFwidXNlc1JldmlzaW9uc0FzRG9jdW1lbnRJZHNcIiA6IHRydWUsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzdGF0dXNTdHJpbmdcIiA6IFwibG9hZGVkXCIsIFxuICBcImlkXCIgOiBcIjY4MjA2XCIsIFxuICBcImlzU21hcnRDaGlsZFwiIDogZmFsc2UsIFxuICBcInNjaGVtYVwiIDogbnVsbCwgXG4gIFwibmFtZVwiIDogXCJ0ZXN0Q29sbGVjdGlvbkVkZ2VzXCIsIFxuICBcInR5cGVcIiA6IDMsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODIwNlwiLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwib2JqZWN0SWRcIiA6IFwiNjgyMDVcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25DcmVhdGVDb2xsZWN0aW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionCreateKeyopt_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbkNyZWF0ZUtleW9wdAotLS0KdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uIjsKdmFyIGJvZHkgPSB7CiAgbmFtZTogInRlc3RDb2xsZWN0aW9uVXNlcnMiLAogIGtleU9wdGlvbnMgOiB7CiAgICB0eXBlIDogImF1dG9pbmNyZW1lbnQiLAogICAgaW5jcmVtZW50IDogNSwKICAgIGFsbG93VXNlcktleXMgOiB0cnVlCiAgfQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZmx1c2hDYWNoZSgpOwpkYi5fZHJvcCgidGVzdENvbGxlY3Rpb25Vc2VycyIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJ0ZXN0Q29sbGVjdGlvblVzZXJzXCIsXG4gIFwia2V5T3B0aW9uc1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiYXV0b2luY3JlbWVudFwiLFxuICAgIFwiaW5jcmVtZW50XCI6IDUsXG4gICAgXCJhbGxvd1VzZXJLZXlzXCI6IHRydWVcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0ODRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwid3JpdGVDb25jZXJuXCIgOiAxLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcInVzZXNSZXZpc2lvbnNBc0RvY3VtZW50SWRzXCIgOiB0cnVlLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic3RhdHVzU3RyaW5nXCIgOiBcImxvYWRlZFwiLCBcbiAgXCJpZFwiIDogXCI2ODIxNVwiLCBcbiAgXCJpc1NtYXJ0Q2hpbGRcIiA6IGZhbHNlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwsIFxuICBcIm5hbWVcIiA6IFwidGVzdENvbGxlY3Rpb25Vc2Vyc1wiLCBcbiAgXCJ0eXBlXCIgOiAyLCBcbiAgXCJzdGF0dXNcIiA6IDMsIFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwiaW50ZXJuYWxWYWxpZGF0b3JUeXBlXCIgOiAwLCBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjgyMTVcIiwgXG4gIFwia2V5T3B0aW9uc1wiIDogeyBcbiAgICBcImFsbG93VXNlcktleXNcIiA6IHRydWUsIFxuICAgIFwidHlwZVwiIDogXCJhdXRvaW5jcmVtZW50XCIsIFxuICAgIFwib2Zmc2V0XCIgOiAwLCBcbiAgICBcImluY3JlbWVudFwiIDogNSwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJvYmplY3RJZFwiIDogXCI2ODIxNFwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkNyZWF0ZUtleW9wdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCollectionDeleteCollectionIdentifier_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3RDb2xsZWN0aW9uRGVsZXRlQ29sbGVjdGlvbklkZW50aWZpZXIKLS0tCnZhciBjbiA9ICJwcm9kdWN0czEiOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7CnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbi8iKyBjb2xsLl9pZDsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwpkYltjbl0gPSB1bmRlZmluZWQ7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uLzY4MjIxJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiaWRcIiA6IFwiNjgyMjFcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBhbiBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkRlbGV0ZUNvbGxlY3Rpb25JZGVudGlmaWVyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionDeleteCollectionName_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbmFtZToKbmFtZTogUmVzdENvbGxlY3Rpb25EZWxldGVDb2xsZWN0aW9uTmFtZQotLS0KdmFyIGNuID0gInByb2R1Y3RzMSI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0czEiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7CmRiW2NuXSA9IHVuZGVmaW5lZDsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzMSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDM5XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImlkXCIgOiBcIjY4MjI3XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYSBuYW1lOiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkRlbGV0ZUNvbGxlY3Rpb25OYW1lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionDeleteCollectionSystem_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIERyb3BwaW5nIGEgc3lzdGVtIGNvbGxlY3Rpb24KbmFtZTogUmVzdENvbGxlY3Rpb25EZWxldGVDb2xsZWN0aW9uU3lzdGVtCi0tLQp2YXIgY24gPSAiX2V4YW1wbGUiOwpkYi5fZHJvcChjbiwgeyBpc1N5c3RlbTogdHJ1ZSB9KTsKZGIuX2NyZWF0ZShjbiwgeyBpc1N5c3RlbTogdHJ1ZSB9KTsKdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uL19leGFtcGxlP2lzU3lzdGVtPXRydWUiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7CmRiW2NuXSA9IHVuZGVmaW5lZDsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL19leGFtcGxlP2lzU3lzdGVtPXRydWUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAzOVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJpZFwiIDogXCI2ODIzM1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkRyb3BwaW5nIGEgc3lzdGVtIGNvbGxlY3Rpb24iLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25EZWxldGVDb2xsZWN0aW9uU3lzdGVtIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionGetAllCollections_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY29sbGVjdGlvbnM6Cm5hbWU6IFJlc3RDb2xsZWN0aW9uR2V0QWxsQ29sbGVjdGlvbnMKLS0tCnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbiI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24nIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxODc1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInJlc3VsdFwiIDogWyBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCI0XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIl91c2Vyc1wiLCBcbiAgICAgIFwic3RhdHVzXCIgOiAzLCBcbiAgICAgIFwidHlwZVwiIDogMiwgXG4gICAgICBcImlzU3lzdGVtXCIgOiB0cnVlLCBcbiAgICAgIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJfdXNlcnNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCIzN1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfZnJvbnRlbmRcIiwgXG4gICAgICBcInN0YXR1c1wiIDogMywgXG4gICAgICBcInR5cGVcIiA6IDIsIFxuICAgICAgXCJpc1N5c3RlbVwiIDogdHJ1ZSwgXG4gICAgICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiX2Zyb250ZW5kXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiMTE3XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcImRlbW9cIiwgXG4gICAgICBcInN0YXR1c1wiIDogMywgXG4gICAgICBcInR5cGVcIiA6IDIsIFxuICAgICAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvMTE3XCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiMTIzXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcImFuaW1hbHNcIiwgXG4gICAgICBcInN0YXR1c1wiIDogMywgXG4gICAgICBcInR5cGVcIiA6IDIsIFxuICAgICAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvMTIzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiN1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfZ3JhcGhzXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9ncmFwaHNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCIxOVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfYW5hbHl6ZXJzXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9hbmFseXplcnNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCIxM1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfc3RhdGlzdGljczE1XCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9zdGF0aXN0aWNzMTVcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCIzMVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfYXBwc1wiLCBcbiAgICAgIFwic3RhdHVzXCIgOiAzLCBcbiAgICAgIFwidHlwZVwiIDogMiwgXG4gICAgICBcImlzU3lzdGVtXCIgOiB0cnVlLCBcbiAgICAgIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJfYXBwc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImlkXCIgOiBcIjExMlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJpZ25vcmVcIiwgXG4gICAgICBcInN0YXR1c1wiIDogMywgXG4gICAgICBcInR5cGVcIiA6IDIsIFxuICAgICAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvMTEyXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiMjVcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiX3F1ZXVlc1wiLCBcbiAgICAgIFwic3RhdHVzXCIgOiAzLCBcbiAgICAgIFwidHlwZVwiIDogMiwgXG4gICAgICBcImlzU3lzdGVtXCIgOiB0cnVlLCBcbiAgICAgIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJfcXVldWVzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiNjcyOTBcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwibXljb2xsZWN0aW9uXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgICAgIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzY3MjkwXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiNjc4OTZcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwic2NoZW1hQ29sbGVjdGlvblwiLCBcbiAgICAgIFwic3RhdHVzXCIgOiAzLCBcbiAgICAgIFwidHlwZVwiIDogMiwgXG4gICAgICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gICAgICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82Nzg5NlwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImlkXCIgOiBcIjM0XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIl9hcHBidW5kbGVzXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9hcHBidW5kbGVzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiNDBcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiX3ByZWdlbF9xdWVyaWVzXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9wcmVnZWxfcXVlcmllc1wiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImlkXCIgOiBcIjEwXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIl9zdGF0aXN0aWNzXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9zdGF0aXN0aWNzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiMTZcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiX3N0YXRpc3RpY3NSYXdcIiwgXG4gICAgICBcInN0YXR1c1wiIDogMywgXG4gICAgICBcInR5cGVcIiA6IDIsIFxuICAgICAgXCJpc1N5c3RlbVwiIDogdHJ1ZSwgXG4gICAgICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiX3N0YXRpc3RpY3NSYXdcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCIyMlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfYXFsZnVuY3Rpb25zXCIsIFxuICAgICAgXCJzdGF0dXNcIiA6IDMsIFxuICAgICAgXCJ0eXBlXCIgOiAyLCBcbiAgICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcIl9hcWxmdW5jdGlvbnNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJpZFwiIDogXCIyOFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJfam9ic1wiLCBcbiAgICAgIFwic3RhdHVzXCIgOiAzLCBcbiAgICAgIFwidHlwZVwiIDogMiwgXG4gICAgICBcImlzU3lzdGVtXCIgOiB0cnVlLCBcbiAgICAgIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJfam9ic1wiIFxuICAgIH0gXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGFsbCBjb2xsZWN0aW9uczoiLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25HZXRBbGxDb2xsZWN0aW9ucyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCollectionGetCollectionChecksumNoRev_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZpbmcgdGhlIGNoZWNrc3VtIG9mIGEgY29sbGVjdGlvbiBpbmNsdWRpbmcgdGhlIGNvbGxlY3Rpb24gZGF0YSwKICBidXQgbm90IHRoZSByZXZpc2lvbnM6Cm5hbWU6IFJlc3RDb2xsZWN0aW9uR2V0Q29sbGVjdGlvbkNoZWNrc3VtTm9SZXYKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIGNvbGwgPSBkYi5fY3JlYXRlKGNuKTsKY29sbC5zYXZlKHsgZm9vOiAiYmFyIiB9KTsKdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uLyIgKyBjb2xsLm5hbWUoKSArICIvY2hlY2tzdW0/d2l0aFJldmlzaW9ucz1mYWxzZSZ3aXRoRGF0YT10cnVlIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvY2hlY2tzdW0/d2l0aFJldmlzaW9ucz1mYWxzZVx1MDAyNndpdGhEYXRhPXRydWUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxOTNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9jaGVja3N1bVxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJ0eXBlXCIgOiAyLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcImlkXCIgOiBcIjY4MTkyXCIsIFxuICBcInJldmlzaW9uXCIgOiBcIl9qdDNaZC1xLS0tXCIsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODE5MlwiLCBcbiAgXCJjaGVja3N1bVwiIDogXCIzNjA3Mjk1ODI5MDM2Mzg3MTIzXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0cmlldmluZyB0aGUgY2hlY2tzdW0gb2YgYSBjb2xsZWN0aW9uIGluY2x1ZGluZyB0aGUgY29sbGVjdGlvbiBkYXRhLFxuYnV0IG5vdCB0aGUgcmV2aXNpb25zOiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkdldENvbGxlY3Rpb25DaGVja3N1bU5vUmV2IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionGetCollectionChecksum_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZpbmcgdGhlIGNoZWNrc3VtIG9mIGEgY29sbGVjdGlvbjoKbmFtZTogUmVzdENvbGxlY3Rpb25HZXRDb2xsZWN0aW9uQ2hlY2tzdW0KLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIGNvbGwgPSBkYi5fY3JlYXRlKGNuKTsKY29sbC5zYXZlKHsgZm9vOiAiYmFyIiB9KTsKdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uLyIgKyBjb2xsLm5hbWUoKSArICIvY2hlY2tzdW0iOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvY2hlY2tzdW0nIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxOTRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9jaGVja3N1bVxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJ0eXBlXCIgOiAyLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcImlkXCIgOiBcIjY4MTgzXCIsIFxuICBcInJldmlzaW9uXCIgOiBcIl9qdDNaYzkyLS1fXCIsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODE4M1wiLCBcbiAgXCJjaGVja3N1bVwiIDogXCIxNzI4MDQwOTYyNTQ2MzcwNzI2MVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHJpZXZpbmcgdGhlIGNoZWNrc3VtIG9mIGEgY29sbGVjdGlvbjoiLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25HZXRDb2xsZWN0aW9uQ2hlY2tzdW0iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionGetCollectionCount_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlcXVlc3RpbmcgdGhlIG51bWJlciBvZiBkb2N1bWVudHM6Cm5hbWU6IFJlc3RDb2xsZWN0aW9uR2V0Q29sbGVjdGlvbkNvdW50Ci0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CnZhciBjb2xsID0gZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKZm9yKHZhciBpPTA7aTwxMDA7aSsrKSB7CiAgIGNvbGwuc2F2ZSh7ImNvdW50IiA6ICBpIH0pOwp9CnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbi8iKyBjb2xsLm5hbWUoKSArICIvY291bnQiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvY291bnQnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0NjFcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9jb3VudFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwid2FpdEZvclN5bmNcIiA6IHRydWUsIFxuICBcInVzZXNSZXZpc2lvbnNBc0RvY3VtZW50SWRzXCIgOiB0cnVlLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic3RhdHVzU3RyaW5nXCIgOiBcImxvYWRlZFwiLCBcbiAgXCJpZFwiIDogXCI2Nzk1MVwiLCBcbiAgXCJpc1NtYXJ0Q2hpbGRcIiA6IGZhbHNlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwsIFxuICBcIm5hbWVcIiA6IFwicHJvZHVjdHNcIiwgXG4gIFwidHlwZVwiIDogMiwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJjb3VudFwiIDogMTAwLCBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcImludGVybmFsVmFsaWRhdG9yVHlwZVwiIDogMCwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzY3OTUxXCIsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDY4MTU0IFxuICB9LCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwib2JqZWN0SWRcIiA6IFwiNjc5NTBcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXF1ZXN0aW5nIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzOiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkdldENvbGxlY3Rpb25Db3VudCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCollectionGetCollectionFiguresDetails_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbkdldENvbGxlY3Rpb25GaWd1cmVzRGV0YWlscwotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoY24pOwpjb2xsLnNhdmUoeyJ0ZXN0IjoiaGVsbG8ifSk7CnJlcXVpcmUoImludGVybmFsIikud2FsLmZsdXNoKHRydWUsIHRydWUpOwp2YXIgdXJsID0gIi9fYXBpL2NvbGxlY3Rpb24vIisgY29sbC5uYW1lKCkgKyAiL2ZpZ3VyZXM/ZGV0YWlscz10cnVlIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvZmlndXJlcz9kZXRhaWxzPXRydWUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2NDhcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9maWd1cmVzXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiZmlndXJlc1wiIDogeyBcbiAgICBcImluZGV4ZXNcIiA6IHsgXG4gICAgICBcImNvdW50XCIgOiAxLCBcbiAgICAgIFwic2l6ZVwiIDogMTIzMyBcbiAgICB9LCBcbiAgICBcImRvY3VtZW50c1NpemVcIiA6IDU2MDEsIFxuICAgIFwiY2FjaGVJblVzZVwiIDogZmFsc2UsIFxuICAgIFwiY2FjaGVTaXplXCIgOiAwLCBcbiAgICBcImNhY2hlVXNhZ2VcIiA6IDAsIFxuICAgIFwiZW5naW5lXCIgOiB7IFxuICAgICAgXCJkb2N1bWVudHNcIiA6IDEsIFxuICAgICAgXCJpbmRleGVzXCIgOiBbIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJwcmltYXJ5XCIsIFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwiY291bnRcIiA6IDEgXG4gICAgICAgIH0gXG4gICAgICBdIFxuICAgIH0gXG4gIH0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwiaWRcIiA6IFwiNjgxNjdcIiwgXG4gIFwiaXNTbWFydENoaWxkXCIgOiBmYWxzZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY291bnRcIiA6IDEsIFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwiaW50ZXJuYWxWYWxpZGF0b3JUeXBlXCIgOiAwLCBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjgxNjdcIiwgXG4gIFwia2V5T3B0aW9uc1wiIDogeyBcbiAgICBcImFsbG93VXNlcktleXNcIiA6IHRydWUsIFxuICAgIFwidHlwZVwiIDogXCJ0cmFkaXRpb25hbFwiLCBcbiAgICBcImxhc3RWYWx1ZVwiIDogNjgxNzIgXG4gIH0sIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJvYmplY3RJZFwiIDogXCI2ODE2NlwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkdldENvbGxlY3Rpb25GaWd1cmVzRGV0YWlscyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCollectionGetCollectionFigures_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXIgYW5kIHJlcXVlc3RpbmcgdGhlIGZpZ3VyZXMgb2YgdGhlIGNvbGxlY3Rpb246Cm5hbWU6IFJlc3RDb2xsZWN0aW9uR2V0Q29sbGVjdGlvbkZpZ3VyZXMKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIGNvbGwgPSBkYi5fY3JlYXRlKGNuKTsKY29sbC5zYXZlKHsidGVzdCI6ImhlbGxvIn0pOwpyZXF1aXJlKCJpbnRlcm5hbCIpLndhbC5mbHVzaCh0cnVlLCB0cnVlKTsKdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uLyIrIGNvbGwubmFtZSgpICsgIi9maWd1cmVzIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvZmlndXJlcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU3NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL2ZpZ3VyZXNcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJmaWd1cmVzXCIgOiB7IFxuICAgIFwiaW5kZXhlc1wiIDogeyBcbiAgICAgIFwiY291bnRcIiA6IDEsIFxuICAgICAgXCJzaXplXCIgOiAyNjk4IFxuICAgIH0sIFxuICAgIFwiZG9jdW1lbnRzU2l6ZVwiIDogMzU0NiwgXG4gICAgXCJjYWNoZUluVXNlXCIgOiBmYWxzZSwgXG4gICAgXCJjYWNoZVNpemVcIiA6IDAsIFxuICAgIFwiY2FjaGVVc2FnZVwiIDogMCBcbiAgfSwgXG4gIFwid3JpdGVDb25jZXJuXCIgOiAxLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcInVzZXNSZXZpc2lvbnNBc0RvY3VtZW50SWRzXCIgOiB0cnVlLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic3RhdHVzU3RyaW5nXCIgOiBcImxvYWRlZFwiLCBcbiAgXCJpZFwiIDogXCI2ODE1OFwiLCBcbiAgXCJpc1NtYXJ0Q2hpbGRcIiA6IGZhbHNlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwsIFxuICBcIm5hbWVcIiA6IFwicHJvZHVjdHNcIiwgXG4gIFwidHlwZVwiIDogMiwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJjb3VudFwiIDogMSwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODE1OFwiLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiA2ODE2MyBcbiAgfSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcIm9iamVjdElkXCIgOiBcIjY4MTU3XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYW4gaWRlbnRpZmllciBhbmQgcmVxdWVzdGluZyB0aGUgZmlndXJlcyBvZiB0aGUgY29sbGVjdGlvbjoiLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25HZXRDb2xsZWN0aW9uRmlndXJlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCollectionGetCollectionIdentifier_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3RDb2xsZWN0aW9uR2V0Q29sbGVjdGlvbklkZW50aWZpZXIKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIGNvbGwgPSBkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwp2YXIgdXJsID0gIi9fYXBpL2NvbGxlY3Rpb24vIisgY29sbC5faWQgKyAiL3Byb3BlcnRpZXMiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vNjc5MzcvcHJvcGVydGllcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ0NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uLzY3OTM3L3Byb3BlcnRpZXNcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcIndhaXRGb3JTeW5jXCIgOiB0cnVlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwiaWRcIiA6IFwiNjc5MzdcIiwgXG4gIFwiaXNTbWFydENoaWxkXCIgOiBmYWxzZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82NzkzN1wiLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwib2JqZWN0SWRcIiA6IFwiNjc5MzZcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBhbiBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbkdldENvbGxlY3Rpb25JZGVudGlmaWVyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionGetCollectionName_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbmFtZToKbmFtZTogUmVzdENvbGxlY3Rpb25HZXRDb2xsZWN0aW9uTmFtZQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwp2YXIgdXJsID0gIi9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvcHJvcGVydGllcyI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvcHJvcGVydGllcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ0NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL3Byb3BlcnRpZXNcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcIndhaXRGb3JTeW5jXCIgOiB0cnVlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwiaWRcIiA6IFwiNjc5NDRcIiwgXG4gIFwiaXNTbWFydENoaWxkXCIgOiBmYWxzZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82Nzk0NFwiLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwib2JqZWN0SWRcIiA6IFwiNjc5NDNcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBhIG5hbWU6IiwibmFtZSI6IlJlc3RDb2xsZWN0aW9uR2V0Q29sbGVjdGlvbk5hbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionGetCollectionRevision_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZpbmcgdGhlIHJldmlzaW9uIG9mIGEgY29sbGVjdGlvbgpuYW1lOiBSZXN0Q29sbGVjdGlvbkdldENvbGxlY3Rpb25SZXZpc2lvbgotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IGZhbHNlIH0pOwp2YXIgdXJsID0gIi9fYXBpL2NvbGxlY3Rpb24vIisgY29sbC5uYW1lKCkgKyAiL3JldmlzaW9uIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvcmV2aXNpb24nIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0NjJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9yZXZpc2lvblxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJyZXZpc2lvblwiIDogXCI1NFwiLCBcbiAgXCJpZFwiIDogXCI2ODE3NlwiLCBcbiAgXCJpc1NtYXJ0Q2hpbGRcIiA6IGZhbHNlLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJvYmplY3RJZFwiIDogXCI2ODE3NVwiLCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwiaW50ZXJuYWxWYWxpZGF0b3JUeXBlXCIgOiAwLCBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjgxNzZcIiwgXG4gIFwia2V5T3B0aW9uc1wiIDogeyBcbiAgICBcImFsbG93VXNlcktleXNcIiA6IHRydWUsIFxuICAgIFwidHlwZVwiIDogXCJ0cmFkaXRpb25hbFwiLCBcbiAgICBcImxhc3RWYWx1ZVwiIDogMCBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXRyaWV2aW5nIHRoZSByZXZpc2lvbiBvZiBhIGNvbGxlY3Rpb24iLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25HZXRDb2xsZWN0aW9uUmV2aXNpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionIdentifierLoadIndexesIntoMemory_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJMb2FkSW5kZXhlc0ludG9NZW1vcnkKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIGNvbGwgPSBkYi5fY3JlYXRlKGNuKTsKdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uLyIrIGNvbGwubmFtZSgpICsgIi9sb2FkSW5kZXhlc0ludG9NZW1vcnkiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgJycpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL2xvYWRJbmRleGVzSW50b01lbW9yeSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvbG9hZEluZGV4ZXNJbnRvTWVtb3J5XG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJMb2FkSW5kZXhlc0ludG9NZW1vcnkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionIdentifierLoad_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJMb2FkCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CnZhciBjb2xsID0gZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uLyIrIGNvbGwubmFtZSgpICsgIi9sb2FkIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICcnKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL2xvYWQnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNDVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvY29sbGVjdGlvbi9wcm9kdWN0cy9sb2FkXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiY291bnRcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODI3M1wiLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwidHlwZVwiIDogMiwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1wiLCBcbiAgXCJpZFwiIDogXCI2ODI3M1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJMb2FkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCollectionIdentifierPropertiesSync_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJQcm9wZXJ0aWVzU3luYwotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7CnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbi8iKyBjb2xsLm5hbWUoKSArICIvcHJvcGVydGllcyI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCB7IndhaXRGb3JTeW5jIiA6IHRydWUgfSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvcHJvcGVydGllcycgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJ3YWl0Rm9yU3luY1wiOiB0cnVlXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ0NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL3Byb3BlcnRpZXNcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcIndhaXRGb3JTeW5jXCIgOiB0cnVlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwiaWRcIiA6IFwiNjgyNDVcIiwgXG4gIFwiaXNTbWFydENoaWxkXCIgOiBmYWxzZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODI0NVwiLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwib2JqZWN0SWRcIiA6IFwiNjgyNDRcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25JZGVudGlmaWVyUHJvcGVydGllc1N5bmMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionIdentifierRename_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJSZW5hbWUKLS0tCnZhciBjbiA9ICJwcm9kdWN0czEiOwp2YXIgY25uID0gIm5ld25hbWUiOwpkYi5fZHJvcChjbik7CmRiLl9kcm9wKGNubik7CnZhciBjb2xsID0gZGIuX2NyZWF0ZShjbik7CnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbi8iICsgY29sbC5uYW1lKCkgKyAiL3JlbmFtZSI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCB7IG5hbWU6IGNubiB9KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpkYi5fZmx1c2hDYWNoZSgpOwpkYi5fZHJvcChjbm4pOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMxL3JlbmFtZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwibmV3bmFtZVwiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEzNFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzMS9yZW5hbWVcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjgyNTlcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJzdGF0dXNcIiA6IDMsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcIm5hbWVcIiA6IFwibmV3bmFtZVwiLCBcbiAgXCJpZFwiIDogXCI2ODI1OVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJSZW5hbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionIdentifierTruncate_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJUcnVuY2F0ZQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7CnZhciB1cmwgPSAiL19hcGkvY29sbGVjdGlvbi8iKyBjb2xsLm5hbWUoKSArICIvdHJ1bmNhdGUiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgJycpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL3RydW5jYXRlJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTM1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2NvbGxlY3Rpb24vcHJvZHVjdHMvdHJ1bmNhdGVcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjgyMzhcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJzdGF0dXNcIiA6IDMsIFxuICBcInR5cGVcIiA6IDIsIFxuICBcIm5hbWVcIiA6IFwicHJvZHVjdHNcIiwgXG4gIFwiaWRcIiA6IFwiNjgyMzhcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdENvbGxlY3Rpb25JZGVudGlmaWVyVHJ1bmNhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCollectionIdentifierUnload_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJVbmxvYWQKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIGNvbGwgPSBkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwp2YXIgdXJsID0gIi9fYXBpL2NvbGxlY3Rpb24vIisgY29sbC5uYW1lKCkgKyAiL3VubG9hZCI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAnJyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL3VubG9hZCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEzNVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Byb2R1Y3RzL3VubG9hZFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82ODI4MFwiLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcInN0YXR1c1wiIDogMywgXG4gIFwidHlwZVwiIDogMiwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1wiLCBcbiAgXCJpZFwiIDogXCI2ODI4MFwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Q29sbGVjdGlvbklkZW50aWZpZXJVbmxvYWQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCreateUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q3JlYXRlVXNlcgotLS0KdHJ5IHsgcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIikucmVtb3ZlKCJhZG1pbkBleGFtcGxlIik7IH0gY2F0Y2ggKGVycikge30KdmFyIHVybCA9ICIvX2FwaS91c2VyIjsKdmFyIGRhdGEgPSB7IHVzZXI6ICJhZG1pbkBleGFtcGxlIiwgcGFzc3dkOiAic2VjdXJlIiB9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgZGF0YSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CnJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpLnJlbW92ZSgiYWRtaW5AZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS91c2VyJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInVzZXJcIjogXCJhZG1pbkBleGFtcGxlXCIsXG4gIFwicGFzc3dkXCI6IFwic2VjdXJlXCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInVzZXJcIiA6IFwiYWRtaW5AZXhhbXBsZVwiLCBcbiAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICBcImV4dHJhXCIgOiB7IFxuICB9LCBcbiAgXCJjb2RlXCIgOiAyMDEsIFxuICBcImVycm9yXCIgOiBmYWxzZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdENyZWF0ZVVzZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorCreateCursorForLimitReturnSingle_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGUgYSBxdWVyeSBhbmQgZXh0cmFjdCB0aGUgcmVzdWx0IGluIGEgc2luZ2xlIGdvCm5hbWU6IFJlc3RDdXJzb3JDcmVhdGVDdXJzb3JGb3JMaW1pdFJldHVyblNpbmdsZQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzEiOiJ3b3JsZDEifSk7CmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzIiOiJ3b3JsZDEifSk7Cgp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBib2R5ID0gewogIHF1ZXJ5OiAiRk9SIHAgSU4gcHJvZHVjdHMgTElNSVQgMiBSRVRVUk4gcCIsCiAgY291bnQ6IHRydWUsCiAgYmF0Y2hTaXplOiAyCn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgcCBJTiBwcm9kdWN0cyBMSU1JVCAyIFJFVFVSTiBwXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDUxOVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjcyMDc3XCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNzIwNzdcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FLYkctLV9cIiwgXG4gICAgICBcImhlbGxvMVwiIDogXCJ3b3JsZDFcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjcyMDc5XCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNzIwNzlcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FLYkctLUFcIiwgXG4gICAgICBcImhlbGxvMlwiIDogXCJ3b3JsZDFcIiBcbiAgICB9IFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiBmYWxzZSwgXG4gIFwiY291bnRcIiA6IDIsIFxuICBcImNhY2hlZFwiIDogZmFsc2UsIFxuICBcImV4dHJhXCIgOiB7IFxuICAgIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gICAgXCJzdGF0c1wiIDogeyBcbiAgICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDAsIFxuICAgICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDIsIFxuICAgICAgXCJzY2FubmVkSW5kZXhcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgICBcImh0dHBSZXF1ZXN0c1wiIDogMCwgXG4gICAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMjExNTM1OTk5OTk0Nzk0MSwgXG4gICAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXhlY3V0ZSBhIHF1ZXJ5IGFuZCBleHRyYWN0IHRoZSByZXN1bHQgaW4gYSBzaW5nbGUgZ28iLCJuYW1lIjoiUmVzdEN1cnNvckNyZWF0ZUN1cnNvckZvckxpbWl0UmV0dXJuU2luZ2xlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCursorCreateCursorForLimitReturn_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGUgYSBxdWVyeSBhbmQgZXh0cmFjdCBhIHBhcnQgb2YgdGhlIHJlc3VsdApuYW1lOiBSZXN0Q3Vyc29yQ3JlYXRlQ3Vyc29yRm9yTGltaXRSZXR1cm4KLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CgpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8xIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8yIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8zIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG80Ijoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG81Ijoid29ybGQxIn0pOwoKdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIkZPUiBwIElOIHByb2R1Y3RzIExJTUlUIDUgUkVUVVJOIHAiLAogIGNvdW50OiB0cnVlLAogIGJhdGNoU2l6ZTogMgp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgcCBJTiBwcm9kdWN0cyBMSU1JVCA1IFJFVFVSTiBwXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU1MFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjcyMDg5XCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNzIwODlcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FLYmUtLV9cIiwgXG4gICAgICBcImhlbGxvMVwiIDogXCJ3b3JsZDFcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjcyMDkxXCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNzIwOTFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FLYmUtLUFcIiwgXG4gICAgICBcImhlbGxvMlwiIDogXCJ3b3JsZDFcIiBcbiAgICB9IFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiB0cnVlLCBcbiAgXCJpZFwiIDogXCI3MjEwMFwiLCBcbiAgXCJjb3VudFwiIDogNSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gICAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgICBcInN0YXRzXCIgOiB7IFxuICAgICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMCwgXG4gICAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkRnVsbFwiIDogNSwgXG4gICAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMTk3MTEwMDAwMjQ4MzU4MSwgXG4gICAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiY2FjaGVkXCIgOiBmYWxzZSwgXG4gIFwibmV4dEJhdGNoSWRcIiA6IFwiMlwiLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeGVjdXRlIGEgcXVlcnkgYW5kIGV4dHJhY3QgYSBwYXJ0IG9mIHRoZSByZXN1bHQiLCJuYW1lIjoiUmVzdEN1cnNvckNyZWF0ZUN1cnNvckZvckxpbWl0UmV0dXJuIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCursorCreateCursorMissingBody_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEJhZCBxdWVyeSAtIE1pc3NpbmcgYm9keQpuYW1lOiBSZXN0Q3Vyc29yQ3JlYXRlQ3Vyc29yTWlzc2luZ0JvZHkKLS0tCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCAnJyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvY3Vyc29yJyIsIm91dHB1dCI6IkhUVFAvMS4xIDQwMCBCYWQgUmVxdWVzdFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDAsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwicXVlcnkgaXMgZW1wdHlcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDE1MDIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQmFkIHF1ZXJ5IC0gTWlzc2luZyBib2R5IiwibmFtZSI6IlJlc3RDdXJzb3JDcmVhdGVDdXJzb3JNaXNzaW5nQm9keSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorCreateCursorOption_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIHRoZSBxdWVyeSBvcHRpb24gImZ1bGxDb3VudCIKbmFtZTogUmVzdEN1cnNvckNyZWF0ZUN1cnNvck9wdGlvbgotLS0KdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIkZPUiBpIElOIDEuLjEwMDAgRklMVEVSIGkgPiA1MDAgTElNSVQgMTAgUkVUVVJOIGkiLAogIGNvdW50OiB0cnVlLAogIG9wdGlvbnM6IHsKICAgIGZ1bGxDb3VudDogdHJ1ZQogIH0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiAxLi4xMDAwIEZJTFRFUiBpIFx1MDAzZSA1MDAgTElNSVQgMTAgUkVUVVJOIGlcIixcbiAgXCJjb3VudFwiOiB0cnVlLFxuICBcIm9wdGlvbnNcIjoge1xuICAgIFwiZnVsbENvdW50XCI6IHRydWVcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQyNVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICA1MDEsIFxuICAgIDUwMiwgXG4gICAgNTAzLCBcbiAgICA1MDQsIFxuICAgIDUwNSwgXG4gICAgNTA2LCBcbiAgICA1MDcsIFxuICAgIDUwOCwgXG4gICAgNTA5LCBcbiAgICA1MTAgXG4gIF0sIFxuICBcImhhc01vcmVcIiA6IGZhbHNlLCBcbiAgXCJjb3VudFwiIDogMTAsIFxuICBcImNhY2hlZFwiIDogZmFsc2UsIFxuICBcImV4dHJhXCIgOiB7IFxuICAgIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gICAgXCJzdGF0c1wiIDogeyBcbiAgICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDAsIFxuICAgICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkSW5kZXhcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgICAgXCJmaWx0ZXJlZFwiIDogNTAwLCBcbiAgICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICAgIFwiZnVsbENvdW50XCIgOiA1MDAsIFxuICAgICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDI5MTUxNjAwMDAwNDMyMTU0LCBcbiAgICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAzMjc2OCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgdGhlIHF1ZXJ5IG9wdGlvbiBcImZ1bGxDb3VudFwiIiwibmFtZSI6IlJlc3RDdXJzb3JDcmVhdGVDdXJzb3JPcHRpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorCreateCursorUnknownCollection_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEJhZCBxdWVyeSAtIFVua25vd24gY29sbGVjdGlvbgpuYW1lOiBSZXN0Q3Vyc29yQ3JlYXRlQ3Vyc29yVW5rbm93bkNvbGxlY3Rpb24KLS0tCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yIjsKdmFyIGJvZHkgPSB7CiAgcXVlcnk6ICJGT1IgdSBJTiB1bmtub3duY29sbCBMSU1JVCAyIFJFVFVSTiB1IiwKICBjb3VudDogdHJ1ZSwKICBiYXRjaFNpemU6IDIKfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDQpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgdSBJTiB1bmtub3duY29sbCBMSU1JVCAyIFJFVFVSTiB1XCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTIxXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcIkFRTDogY29sbGVjdGlvbiBvciB2aWV3IG5vdCBmb3VuZDogdW5rbm93bmNvbGwgKHdoaWxlIHBhcnNpbmcpXCIsIFxuICBcImVycm9yTnVtXCIgOiAxMjAzIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkJhZCBxdWVyeSAtIFVua25vd24gY29sbGVjdGlvbiIsIm5hbWUiOiJSZXN0Q3Vyc29yQ3JlYXRlQ3Vyc29yVW5rbm93bkNvbGxlY3Rpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorDeleteIgnore_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGUgYSBkYXRhLW1vZGlmaWNhdGlvbiBxdWVyeSB3aXRoIG9wdGlvbiBgaWdub3JlRXJyb3JzYApuYW1lOiBSZXN0Q3Vyc29yRGVsZXRlSWdub3JlCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKZGIucHJvZHVjdHMuc2F2ZSh7IF9rZXk6ICJmb28iIH0pOwoKdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIlJFTU9WRSAnYmFyJyBJTiBwcm9kdWN0cyBPUFRJT05TIHsgaWdub3JlRXJyb3JzOiB0cnVlIH0iCn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZXh0cmEuc3RhdHMud3JpdGVzRXhlY3V0ZWQgPT09IDApOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5leHRyYS5zdGF0cy53cml0ZXNJZ25vcmVkID09PSAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJSRU1PVkUgJ2JhcicgSU4gcHJvZHVjdHMgT1BUSU9OUyB7IGlnbm9yZUVycm9yczogdHJ1ZSB9XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAzNTJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJyZXN1bHRcIiA6IFsgXSwgXG4gIFwiaGFzTW9yZVwiIDogZmFsc2UsIFxuICBcImNhY2hlZFwiIDogZmFsc2UsIFxuICBcImV4dHJhXCIgOiB7IFxuICAgIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gICAgXCJzdGF0c1wiIDogeyBcbiAgICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDAsIFxuICAgICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAxLCBcbiAgICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkSW5kZXhcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgICBcImh0dHBSZXF1ZXN0c1wiIDogMCwgXG4gICAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTM3ODU5MDAwMDA1ODQ2NiwgXG4gICAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXhlY3V0ZSBhIGRhdGEtbW9kaWZpY2F0aW9uIHF1ZXJ5IHdpdGggb3B0aW9uIGBpZ25vcmVFcnJvcnNgIiwibmFtZSI6IlJlc3RDdXJzb3JEZWxldGVJZ25vcmUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorDeleteQueryFail_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEJhZCBxdWVyeSAtIEV4ZWN1dGUgYSBkYXRhLW1vZGlmaWNhdGlvbiBxdWVyeSB0aGF0IGF0dGVtcHRzIHRvIHJlbW92ZSBhIG5vbi1leGlzdGluZwogIGRvY3VtZW50Cm5hbWU6IFJlc3RDdXJzb3JEZWxldGVRdWVyeUZhaWwKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CgpkYi5wcm9kdWN0cy5zYXZlKHsgX2tleTogImJhciIgfSk7Cgp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBib2R5ID0gewogIHF1ZXJ5OiAiUkVNT1ZFICdmb28nIElOIHByb2R1Y3RzIgp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwNCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJSRU1PVkUgJ2ZvbycgSU4gcHJvZHVjdHNcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcIkFRTDogZG9jdW1lbnQgbm90IGZvdW5kICh3aGlsZSBleGVjdXRpbmcpXCIsIFxuICBcImVycm9yTnVtXCIgOiAxMjAyIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkJhZCBxdWVyeSAtIEV4ZWN1dGUgYSBkYXRhLW1vZGlmaWNhdGlvbiBxdWVyeSB0aGF0IGF0dGVtcHRzIHRvIHJlbW92ZSBhIG5vbi1leGlzdGluZ1xuZG9jdW1lbnQiLCJuYW1lIjoiUmVzdEN1cnNvckRlbGV0ZVF1ZXJ5RmFpbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorDeleteQuery_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGUgYSBkYXRhLW1vZGlmaWNhdGlvbiBxdWVyeSBhbmQgcmV0cmlldmUgdGhlIG51bWJlciBvZgogIG1vZGlmaWVkIGRvY3VtZW50cwpuYW1lOiBSZXN0Q3Vyc29yRGVsZXRlUXVlcnkKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CgpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8xIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8yIjoid29ybGQxIn0pOwoKdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIkZPUiBwIElOIHByb2R1Y3RzIFJFTU9WRSBwIElOIHByb2R1Y3RzIgp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmV4dHJhLnN0YXRzLndyaXRlc0V4ZWN1dGVkID09PSAyKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZXh0cmEuc3RhdHMud3JpdGVzSWdub3JlZCA9PT0gMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgcCBJTiBwcm9kdWN0cyBSRU1PVkUgcCBJTiBwcm9kdWN0c1wiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzUyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicmVzdWx0XCIgOiBbIF0sIFxuICBcImhhc01vcmVcIiA6IGZhbHNlLCBcbiAgXCJjYWNoZWRcIiA6IGZhbHNlLCBcbiAgXCJleHRyYVwiIDogeyBcbiAgICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICAgIFwic3RhdHNcIiA6IHsgXG4gICAgICBcIndyaXRlc0V4ZWN1dGVkXCIgOiAyLCBcbiAgICAgIFwid3JpdGVzSWdub3JlZFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRGdWxsXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEluZGV4XCIgOiAyLCBcbiAgICAgIFwiY3Vyc29yc0NyZWF0ZWRcIiA6IDEsIFxuICAgICAgXCJjdXJzb3JzUmVhcm1lZFwiIDogMCwgXG4gICAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgICBcImNhY2hlTWlzc2VzXCIgOiAwLCBcbiAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDIzMjQ2MDk5OTk5NTk2NDgsIFxuICAgICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgICAgXCJpbnRlcm1lZGlhdGVDb21taXRzXCIgOiAwIFxuICAgIH0gXG4gIH0sIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4ZWN1dGUgYSBkYXRhLW1vZGlmaWNhdGlvbiBxdWVyeSBhbmQgcmV0cmlldmUgdGhlIG51bWJlciBvZlxubW9kaWZpZWQgZG9jdW1lbnRzIiwibmFtZSI6IlJlc3RDdXJzb3JEZWxldGVRdWVyeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorDelete_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Q3Vyc29yRGVsZXRlCi0tLQp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CgpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8xIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8yIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8zIjoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG80Ijoid29ybGQxIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG81Ijoid29ybGQxIn0pOwoKdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIkZPUiBwIElOIHByb2R1Y3RzIExJTUlUIDUgUkVUVVJOIHAiLAogIGNvdW50OiB0cnVlLAogIGJhdGNoU2l6ZTogMgp9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CnJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCArICcvJyArIHJlc3BvbnNlLnBhcnNlZEJvZHkuaWQpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgcCBJTiBwcm9kdWN0cyBMSU1JVCA1IFJFVFVSTiBwXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMlxufVxuRU9GXG5cbmN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3IvNzIyMDknIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU0OVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjcyMTk4XCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNzIxOThcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FMZlctLV9cIiwgXG4gICAgICBcImhlbGxvMVwiIDogXCJ3b3JsZDFcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjcyMjAwXCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNzIyMDBcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FMZlctLUFcIiwgXG4gICAgICBcImhlbGxvMlwiIDogXCJ3b3JsZDFcIiBcbiAgICB9IFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiB0cnVlLCBcbiAgXCJpZFwiIDogXCI3MjIwOVwiLCBcbiAgXCJjb3VudFwiIDogNSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gICAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgICBcInN0YXRzXCIgOiB7IFxuICAgICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMCwgXG4gICAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkRnVsbFwiIDogNSwgXG4gICAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxNjQ2NTY5OTk5NzA3MDI2LCBcbiAgICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICAgIFwiaW50ZXJtZWRpYXRlQ29tbWl0c1wiIDogMCBcbiAgICB9IFxuICB9LCBcbiAgXCJjYWNoZWRcIiA6IGZhbHNlLCBcbiAgXCJuZXh0QmF0Y2hJZFwiIDogXCIyXCIsIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufVxuXG5cbkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJpZFwiIDogXCI3MjIwOVwiLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEN1cnNvckRlbGV0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorForLimitReturnCont_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFZhbGlkIHJlcXVlc3QgZm9yIG5leHQgYmF0Y2gKbmFtZTogUmVzdEN1cnNvckZvckxpbWl0UmV0dXJuQ29udAotLS0KdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKZGIucHJvZHVjdHMuc2F2ZSh7ImhlbGxvMSI6IndvcmxkMSJ9KTsKZGIucHJvZHVjdHMuc2F2ZSh7ImhlbGxvMiI6IndvcmxkMSJ9KTsKZGIucHJvZHVjdHMuc2F2ZSh7ImhlbGxvMyI6IndvcmxkMSJ9KTsKZGIucHJvZHVjdHMuc2F2ZSh7ImhlbGxvNCI6IndvcmxkMSJ9KTsKZGIucHJvZHVjdHMuc2F2ZSh7ImhlbGxvNSI6IndvcmxkMSJ9KTsKCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yIjsKdmFyIGJvZHkgPSB7CiAgcXVlcnk6ICJGT1IgcCBJTiBwcm9kdWN0cyBMSU1JVCA1IFJFVFVSTiBwIiwKICBjb3VudDogdHJ1ZSwKICBiYXRjaFNpemU6IDIKfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsICsgJy8nICsgcmVzcG9uc2UucGFyc2VkQm9keS5pZCwgJycpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgcCBJTiBwcm9kdWN0cyBMSU1JVCA1IFJFVFVSTiBwXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMlxufVxuRU9GXG5cbmN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3IvNzIxODcnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1NTBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJyZXN1bHRcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI3MjE4MFwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInByb2R1Y3RzLzcyMTgwXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhTGFTLS1BXCIsIFxuICAgICAgXCJoZWxsbzNcIiA6IFwid29ybGQxXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI3MjE4MlwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInByb2R1Y3RzLzcyMTgyXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhTGFXLS0tXCIsIFxuICAgICAgXCJoZWxsbzRcIiA6IFwid29ybGQxXCIgXG4gICAgfSBcbiAgXSwgXG4gIFwiaGFzTW9yZVwiIDogdHJ1ZSwgXG4gIFwiaWRcIiA6IFwiNzIxODdcIiwgXG4gIFwiY291bnRcIiA6IDUsIFxuICBcImV4dHJhXCIgOiB7IFxuICAgIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gICAgXCJzdGF0c1wiIDogeyBcbiAgICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDAsIFxuICAgICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDUsIFxuICAgICAgXCJzY2FubmVkSW5kZXhcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgICBcImh0dHBSZXF1ZXN0c1wiIDogMCwgXG4gICAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTYzOTI2OTk5OTYwMDQwMTIsIFxuICAgICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgICAgXCJpbnRlcm1lZGlhdGVDb21taXRzXCIgOiAwIFxuICAgIH0gXG4gIH0sIFxuICBcImNhY2hlZFwiIDogZmFsc2UsIFxuICBcIm5leHRCYXRjaElkXCIgOiBcIjNcIiwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVmFsaWQgcmVxdWVzdCBmb3IgbmV4dCBiYXRjaCIsIm5hbWUiOiJSZXN0Q3Vyc29yRm9yTGltaXRSZXR1cm5Db250IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCursorInvalidCursorIdentifier_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gaWRlbnRpZmllcgpuYW1lOiBSZXN0Q3Vyc29ySW52YWxpZEN1cnNvcklkZW50aWZpZXIKLS0tCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yLzEyMzEyMyI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAnJyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3IvMTIzMTIzJyIsIm91dHB1dCI6IkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcImN1cnNvciBub3QgZm91bmRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDE2MDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVW5rbm93biBpZGVudGlmaWVyIiwibmFtZSI6IlJlc3RDdXJzb3JJbnZhbGlkQ3Vyc29ySWRlbnRpZmllciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorMemoryLimit_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFRvIHNldCBhIG1lbW9yeSBsaW1pdCBmb3IgdGhlIHF1ZXJ5LCB0aGUgYG1lbW9yeUxpbWl0YCBvcHRpb24gY2FuIGJlIHBhc3NlZCB0bwogIHRoZSBzZXJ2ZXIuCgogIFRoZSBtZW1vcnkgbGltaXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBxdWVyeSBpcwogIGFsbG93ZWQgdG8gdXNlLiBXaGVuIGEgc2luZ2xlIEFRTCBxdWVyeSByZWFjaGVzIHRoZSBzcGVjaWZpZWQgbGltaXQgdmFsdWUsCiAgdGhlIHF1ZXJ5IGlzIGFib3J0ZWQgd2l0aCBhICpyZXNvdXJjZSBsaW1pdCBleGNlZWRlZCogZXhjZXB0aW9uLiBJbiBhCiAgY2x1c3RlciwgdGhlIG1lbW9yeSBhY2NvdW50aW5nIGlzIGRvbmUgcGVyIHNlcnZlciwgc28gdGhlIGxpbWl0IHZhbHVlIGlzCiAgZWZmZWN0aXZlbHkgYSBtZW1vcnkgbGltaXQgcGVyIHF1ZXJ5IHBlciBzZXJ2ZXIuCgogIElmIG5vIG1lbW9yeSBsaW1pdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlcnZlciBkZWZhdWx0IHZhbHVlIChjb250cm9sbGVkIGJ5CiAgc3RhcnR1cCBvcHRpb24gYC0tcXVlcnkubWVtb3J5LWxpbWl0YCkgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIG1heGltdW0gYW1vdW50CiAgb2YgbWVtb3J5IHRoZSBxdWVyeSBjYW4gdXNlLiBBIG1lbW9yeSBsaW1pdCB2YWx1ZSBvZiBgMGAgbWVhbnMgdGhhdCB0aGUgbWF4aW11bQogIGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBxdWVyeSBpcyBub3QgcmVzdHJpY3RlZC4KbmFtZTogUmVzdEN1cnNvck1lbW9yeUxpbWl0Ci0tLQp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBib2R5ID0gewogIHF1ZXJ5OiAiRk9SIGkgSU4gMS4uMTAwMDAwIFNPUlQgaSBSRVRVUk4gaSIsCiAgbWVtb3J5TGltaXQ6IDEwMDAwMAp9CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDUwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiAxLi4xMDAwMDAgU09SVCBpIFJFVFVSTiBpXCIsXG4gIFwibWVtb3J5TGltaXRcIjogMTAwMDAwXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMjBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA1MDAsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiQVFMOiBxdWVyeSB3b3VsZCB1c2UgbW9yZSBtZW1vcnkgdGhhbiBhbGxvd2VkICh3aGlsZSBleGVjdXRpbmcpXCIsIFxuICBcImVycm9yTnVtXCIgOiAzMiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJUbyBzZXQgYSBtZW1vcnkgbGltaXQgZm9yIHRoZSBxdWVyeSwgdGhlIGBtZW1vcnlMaW1pdGAgb3B0aW9uIGNhbiBiZSBwYXNzZWQgdG9cbnRoZSBzZXJ2ZXIuXG5cblRoZSBtZW1vcnkgbGltaXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBxdWVyeSBpc1xuYWxsb3dlZCB0byB1c2UuIFdoZW4gYSBzaW5nbGUgQVFMIHF1ZXJ5IHJlYWNoZXMgdGhlIHNwZWNpZmllZCBsaW1pdCB2YWx1ZSxcbnRoZSBxdWVyeSBpcyBhYm9ydGVkIHdpdGggYSAqcmVzb3VyY2UgbGltaXQgZXhjZWVkZWQqIGV4Y2VwdGlvbi4gSW4gYVxuY2x1c3RlciwgdGhlIG1lbW9yeSBhY2NvdW50aW5nIGlzIGRvbmUgcGVyIHNlcnZlciwgc28gdGhlIGxpbWl0IHZhbHVlIGlzXG5lZmZlY3RpdmVseSBhIG1lbW9yeSBsaW1pdCBwZXIgcXVlcnkgcGVyIHNlcnZlci5cblxuSWYgbm8gbWVtb3J5IGxpbWl0IGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VydmVyIGRlZmF1bHQgdmFsdWUgKGNvbnRyb2xsZWQgYnlcbnN0YXJ0dXAgb3B0aW9uIGAtLXF1ZXJ5Lm1lbW9yeS1saW1pdGApIGlzIHVzZWQgZm9yIHJlc3RyaWN0aW5nIHRoZSBtYXhpbXVtIGFtb3VudFxub2YgbWVtb3J5IHRoZSBxdWVyeSBjYW4gdXNlLiBBIG1lbW9yeSBsaW1pdCB2YWx1ZSBvZiBgMGAgbWVhbnMgdGhhdCB0aGUgbWF4aW11bVxuYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIHF1ZXJ5IGlzIG5vdCByZXN0cmljdGVkLiIsIm5hbWUiOiJSZXN0Q3Vyc29yTWVtb3J5TGltaXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorMissingCursorIdentifier_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE1pc3NpbmcgaWRlbnRpZmllcgpuYW1lOiBSZXN0Q3Vyc29yTWlzc2luZ0N1cnNvcklkZW50aWZpZXIKLS0tCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICcnKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIiwib3V0cHV0IjoiSFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJleHBlY3RpbmcgUE9TVCAvX2FwaS9jdXJzb3IvXHUwMDNjY3Vyc29yLWlkXHUwMDNlXCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiTWlzc2luZyBpZGVudGlmaWVyIiwibmFtZSI6IlJlc3RDdXJzb3JNaXNzaW5nQ3Vyc29ySWRlbnRpZmllciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorModifyArray_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhcHBlbmRzIGEgdmFsdWUgdG8gdGhlIGFycmF5IGBhcnJgIG9mIHRoZSBkb2N1bWVudAogIHdpdGgga2V5IGB0ZXN0YCBpbiB0aGUgY29sbGVjdGlvbiBgZG9jdW1lbnRzYC4gVGhlIG5vcm1hbCB1cGRhdGUgYmVoYXZpb3Igb2YgdGhlCiAgYFVQREFURWAgb3BlcmF0aW9uIGlzIHRvIHJlcGxhY2UgdGhlIGFycmF5IGF0dHJpYnV0ZSBjb21wbGV0ZWx5LCBidXQgdXNpbmcgdGhlCiAgYFBVU0goKWAgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBhcHBlbmQgdG8gdGhlIGFycmF5OgpuYW1lOiBSZXN0Q3Vyc29yTW9kaWZ5QXJyYXkKLS0tCnZhciBjbiA9ICJkb2N1bWVudHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKZGIuZG9jdW1lbnRzLnNhdmUoeyBfa2V5OiAidGVzdCIsIGFycjogWzEsIDIsIDNdIH0pOwoKdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIkZPUiBkb2MgSU4gZG9jdW1lbnRzIEZJTFRFUiBkb2MuX2tleSA9PSBAbXlLZXkgVVBEQVRFIGRvYy5fa2V5IFdJVEggeyBhcnI6IFBVU0goZG9jLmFyciwgQHZhbHVlKSB9IElOIGRvY3VtZW50cyBSRVRVUk4gTkVXIiwKICBiaW5kVmFyczogeyBteUtleTogInRlc3QiLCB2YWx1ZTogNDIgfQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgZG9jIElOIGRvY3VtZW50cyBGSUxURVIgZG9jLl9rZXkgPT0gQG15S2V5IFVQREFURSBkb2MuX2tleSBXSVRIIHsgYXJyOiBQVVNIKGRvYy5hcnIsIEB2YWx1ZSkgfSBJTiBkb2N1bWVudHMgUkVUVVJOIE5FV1wiLFxuICBcImJpbmRWYXJzXCI6IHtcbiAgICBcIm15S2V5XCI6IFwidGVzdFwiLFxuICAgIFwidmFsdWVcIjogNDJcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQzMVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcInRlc3RcIiwgXG4gICAgICBcIl9pZFwiIDogXCJkb2N1bWVudHMvdGVzdFwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYUxSQy0tLVwiLCBcbiAgICAgIFwiYXJyXCIgOiBbIFxuICAgICAgICAxLCBcbiAgICAgICAgMiwgXG4gICAgICAgIDMsIFxuICAgICAgICA0MiBcbiAgICAgIF0gXG4gICAgfSBcbiAgXSwgXG4gIFwiaGFzTW9yZVwiIDogZmFsc2UsIFxuICBcImNhY2hlZFwiIDogZmFsc2UsIFxuICBcImV4dHJhXCIgOiB7IFxuICAgIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gICAgXCJzdGF0c1wiIDogeyBcbiAgICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDEsIFxuICAgICAgXCJ3cml0ZXNJZ25vcmVkXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkSW5kZXhcIiA6IDEsIFxuICAgICAgXCJjdXJzb3JzQ3JlYXRlZFwiIDogMSwgXG4gICAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICAgIFwiY2FjaGVNaXNzZXNcIiA6IDAsIFxuICAgICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgICBcImh0dHBSZXF1ZXN0c1wiIDogMCwgXG4gICAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMzk4NDU0OTk5OTgxMzY4LCBcbiAgICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAzMjc2OCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVGhlIGZvbGxvd2luZyBleGFtcGxlIGFwcGVuZHMgYSB2YWx1ZSB0byB0aGUgYXJyYXkgYGFycmAgb2YgdGhlIGRvY3VtZW50XG53aXRoIGtleSBgdGVzdGAgaW4gdGhlIGNvbGxlY3Rpb24gYGRvY3VtZW50c2AuIFRoZSBub3JtYWwgdXBkYXRlIGJlaGF2aW9yIG9mIHRoZVxuYFVQREFURWAgb3BlcmF0aW9uIGlzIHRvIHJlcGxhY2UgdGhlIGFycmF5IGF0dHJpYnV0ZSBjb21wbGV0ZWx5LCBidXQgdXNpbmcgdGhlXG5gUFVTSCgpYCBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGFwcGVuZCB0byB0aGUgYXJyYXk6IiwibmFtZSI6IlJlc3RDdXJzb3JNb2RpZnlBcnJheSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorOptimizerRules_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb3B0aW1pemVyIHJ1bGVzCm5hbWU6IFJlc3RDdXJzb3JPcHRpbWl6ZXJSdWxlcwotLS0KdmFyIHVybCA9ICIvX2FwaS9jdXJzb3IiOwp2YXIgYm9keSA9IHsKICBxdWVyeTogIkZPUiBpIElOIDEuLjEwIExFVCBhID0gMSBMRVQgYiA9IDIgRklMVEVSIGEgKyBiID09IDMgUkVUVVJOIGkiLAogIGNvdW50OiB0cnVlLAogIG9wdGlvbnM6IHsKICAgIG1heFBsYW5zOiAxLAogICAgb3B0aW1pemVyOiB7CiAgICAgIHJ1bGVzOiBbICItYWxsIiwgIityZW1vdmUtdW5uZWNlc3NhcnktZmlsdGVycyIgXQogICAgfQogIH0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiAxLi4xMCBMRVQgYSA9IDEgTEVUIGIgPSAyIEZJTFRFUiBhICsgYiA9PSAzIFJFVFVSTiBpXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJvcHRpb25zXCI6IHtcbiAgICBcIm1heFBsYW5zXCI6IDEsXG4gICAgXCJvcHRpbWl6ZXJcIjoge1xuICAgICAgXCJydWxlc1wiOiBbXG4gICAgICAgIFwiLWFsbFwiLFxuICAgICAgICBcIityZW1vdmUtdW5uZWNlc3NhcnktZmlsdGVyc1wiXG4gICAgICBdXG4gICAgfVxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzgzXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicmVzdWx0XCIgOiBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMsIFxuICAgIDQsIFxuICAgIDUsIFxuICAgIDYsIFxuICAgIDcsIFxuICAgIDgsIFxuICAgIDksIFxuICAgIDEwIFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiBmYWxzZSwgXG4gIFwiY291bnRcIiA6IDEwLCBcbiAgXCJjYWNoZWRcIiA6IGZhbHNlLCBcbiAgXCJleHRyYVwiIDogeyBcbiAgICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICAgIFwic3RhdHNcIiA6IHsgXG4gICAgICBcIndyaXRlc0V4ZWN1dGVkXCIgOiAwLCBcbiAgICAgIFwid3JpdGVzSWdub3JlZFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRGdWxsXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEluZGV4XCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc0NyZWF0ZWRcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzUmVhcm1lZFwiIDogMCwgXG4gICAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgICBcImNhY2hlTWlzc2VzXCIgOiAwLCBcbiAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDE2NDgyNjAwMDAwMjQ0OTMsIFxuICAgICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgICAgXCJpbnRlcm1lZGlhdGVDb21taXRzXCIgOiAwIFxuICAgIH0gXG4gIH0sIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb3B0aW1pemVyIHJ1bGVzIiwibmFtZSI6IlJlc3RDdXJzb3JPcHRpbWl6ZXJSdWxlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorPostBatch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlcXVlc3QgdGhlIHNlY29uZCBiYXRjaCAoYWdhaW4pOgpuYW1lOiBSZXN0Q3Vyc29yUG9zdEJhdGNoCi0tLQp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBib2R5ID0gewogIHF1ZXJ5OiAiRk9SIGkgSU4gMS4uNSBSRVRVUk4gaSIsCiAgY291bnQ6IHRydWUsCiAgYmF0Y2hTaXplOiAyLAogIG9wdGlvbnM6IHsKICAgIGFsbG93UmV0cnk6IHRydWUKICB9Cn07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKdmFyIHNlY29uZEJhdGNoSWQgPSByZXNwb25zZS5wYXJzZWRCb2R5Lm5leHRCYXRjaElkOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCnJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwgKyAnLycgKyByZXNwb25zZS5wYXJzZWRCb2R5LmlkLCAnJyk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCArICcvJyArIHJlc3BvbnNlLnBhcnNlZEJvZHkuaWQgKyAnLycgKyBzZWNvbmRCYXRjaElkLCAnJyk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiAxLi41IFJFVFVSTiBpXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMixcbiAgXCJvcHRpb25zXCI6IHtcbiAgICBcImFsbG93UmV0cnlcIjogdHJ1ZVxuICB9XG59XG5FT0ZcblxuY3VybCAtWCBQT1NUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3IvNzIxOTEnXG5cbmN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvY3Vyc29yLzcyMTkxLzInIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDM5NlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICAxLCBcbiAgICAyIFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiB0cnVlLCBcbiAgXCJpZFwiIDogXCI3MjE5MVwiLCBcbiAgXCJjb3VudFwiIDogNSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gICAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgICBcInN0YXRzXCIgOiB7IFxuICAgICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMCwgXG4gICAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkRnVsbFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMzg0ODMwMDAwMDA2MzMxOCwgXG4gICAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiY2FjaGVkXCIgOiBmYWxzZSwgXG4gIFwibmV4dEJhdGNoSWRcIiA6IFwiMlwiLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSBcbn1cblxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDM5NlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICAzLCBcbiAgICA0IFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiB0cnVlLCBcbiAgXCJpZFwiIDogXCI3MjE5MVwiLCBcbiAgXCJjb3VudFwiIDogNSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gICAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgICBcInN0YXRzXCIgOiB7IFxuICAgICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMCwgXG4gICAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkRnVsbFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMzg0ODMwMDAwMDA2MzMxOCwgXG4gICAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiY2FjaGVkXCIgOiBmYWxzZSwgXG4gIFwibmV4dEJhdGNoSWRcIiA6IFwiM1wiLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCBcbn1cblxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDM5NlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogWyBcbiAgICAzLCBcbiAgICA0IFxuICBdLCBcbiAgXCJoYXNNb3JlXCIgOiB0cnVlLCBcbiAgXCJpZFwiIDogXCI3MjE5MVwiLCBcbiAgXCJjb3VudFwiIDogNSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gICAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgICBcInN0YXRzXCIgOiB7IFxuICAgICAgXCJ3cml0ZXNFeGVjdXRlZFwiIDogMCwgXG4gICAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgICAgXCJzY2FubmVkRnVsbFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRJbmRleFwiIDogMCwgXG4gICAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgICAgXCJjYWNoZUhpdHNcIiA6IDAsIFxuICAgICAgXCJjYWNoZU1pc3Nlc1wiIDogMCwgXG4gICAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICAgIFwiaHR0cFJlcXVlc3RzXCIgOiAwLCBcbiAgICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMzg0ODMwMDAwMDA2MzMxOCwgXG4gICAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gICAgfSBcbiAgfSwgXG4gIFwiY2FjaGVkXCIgOiBmYWxzZSwgXG4gIFwibmV4dEJhdGNoSWRcIiA6IFwiM1wiLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXF1ZXN0IHRoZSBzZWNvbmQgYmF0Y2ggKGFnYWluKToiLCJuYW1lIjoiUmVzdEN1cnNvclBvc3RCYXRjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestCursorPostForLimitReturnCont_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFZhbGlkIHJlcXVlc3QgZm9yIG5leHQgYmF0Y2gKbmFtZTogUmVzdEN1cnNvclBvc3RGb3JMaW1pdFJldHVybkNvbnQKLS0tCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yIjsKdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzEiOiJ3b3JsZDEifSk7CmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzIiOiJ3b3JsZDEifSk7CmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzMiOiJ3b3JsZDEifSk7CmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzQiOiJ3b3JsZDEifSk7CmRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzUiOiJ3b3JsZDEifSk7Cgp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBib2R5ID0gewogIHF1ZXJ5OiAiRk9SIHAgSU4gcHJvZHVjdHMgTElNSVQgNSBSRVRVUk4gcCIsCiAgY291bnQ6IHRydWUsCiAgYmF0Y2hTaXplOiAyCn07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCnJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwgKyAnLycgKyByZXNwb25zZS5wYXJzZWRCb2R5LmlkLCAnJyk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgcCBJTiBwcm9kdWN0cyBMSU1JVCA1IFJFVFVSTiBwXCIsXG4gIFwiY291bnRcIjogdHJ1ZSxcbiAgXCJiYXRjaFNpemVcIjogMlxufVxuRU9GXG5cbmN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvY3Vyc29yLzcyMTY4JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNTUwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicmVzdWx0XCIgOiBbIFxuICAgIHsgXG4gICAgICBcIl9rZXlcIiA6IFwiNzIxNjFcIiwgXG4gICAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy83MjE2MVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYUxYSy0tQVwiLCBcbiAgICAgIFwiaGVsbG8zXCIgOiBcIndvcmxkMVwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIl9rZXlcIiA6IFwiNzIxNjNcIiwgXG4gICAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy83MjE2M1wiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYUxYSy0tQlwiLCBcbiAgICAgIFwiaGVsbG80XCIgOiBcIndvcmxkMVwiIFxuICAgIH0gXG4gIF0sIFxuICBcImhhc01vcmVcIiA6IHRydWUsIFxuICBcImlkXCIgOiBcIjcyMTY4XCIsIFxuICBcImNvdW50XCIgOiA1LCBcbiAgXCJleHRyYVwiIDogeyBcbiAgICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICAgIFwic3RhdHNcIiA6IHsgXG4gICAgICBcIndyaXRlc0V4ZWN1dGVkXCIgOiAwLCBcbiAgICAgIFwid3JpdGVzSWdub3JlZFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRGdWxsXCIgOiA1LCBcbiAgICAgIFwic2Nhbm5lZEluZGV4XCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc0NyZWF0ZWRcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzUmVhcm1lZFwiIDogMCwgXG4gICAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgICBcImNhY2hlTWlzc2VzXCIgOiAwLCBcbiAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDE2MDQ4OTAwMDA1MjE2NjM4LCBcbiAgICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICAgIFwiaW50ZXJtZWRpYXRlQ29tbWl0c1wiIDogMCBcbiAgICB9IFxuICB9LCBcbiAgXCJjYWNoZWRcIiA6IGZhbHNlLCBcbiAgXCJuZXh0QmF0Y2hJZFwiIDogXCIzXCIsIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlZhbGlkIHJlcXVlc3QgZm9yIG5leHQgYmF0Y2giLCJuYW1lIjoiUmVzdEN1cnNvclBvc3RGb3JMaW1pdFJldHVybkNvbnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorPostInvalidCursorIdentifier_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gaWRlbnRpZmllcgpuYW1lOiBSZXN0Q3Vyc29yUG9zdEludmFsaWRDdXJzb3JJZGVudGlmaWVyCi0tLQp2YXIgdXJsID0gIi9fYXBpL2N1cnNvci8xMjMxMjMiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsICcnKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDQpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvY3Vyc29yLzEyMzEyMyciLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDQgTm90IEZvdW5kXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwNCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJjdXJzb3Igbm90IGZvdW5kXCIsIFxuICBcImVycm9yTnVtXCIgOiAxNjAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVua25vd24gaWRlbnRpZmllciIsIm5hbWUiOiJSZXN0Q3Vyc29yUG9zdEludmFsaWRDdXJzb3JJZGVudGlmaWVyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestCursorPostMissingCursorIdentifier_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE1pc3NpbmcgaWRlbnRpZmllcgpuYW1lOiBSZXN0Q3Vyc29yUG9zdE1pc3NpbmdDdXJzb3JJZGVudGlmaWVyCi0tLQp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgJycpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvY3Vyc29yJyIsIm91dHB1dCI6IkhUVFAvMS4xIDQwMCBCYWQgUmVxdWVzdFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDAsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwicXVlcnkgaXMgZW1wdHlcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDE1MDIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiTWlzc2luZyBpZGVudGlmaWVyIiwibmFtZSI6IlJlc3RDdXJzb3JQb3N0TWlzc2luZ0N1cnNvcklkZW50aWZpZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestCursorProfileQuery_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGUgaW5zdHJ1bWVudGVkIHF1ZXJ5IGFuZCByZXR1cm4gcmVzdWx0IHRvZ2V0aGVyIHdpdGgKICBleGVjdXRpb24gcGxhbiBhbmQgcHJvZmlsaW5nIGluZm9ybWF0aW9uCm5hbWU6IFJlc3RDdXJzb3JQcm9maWxlUXVlcnkKLS0tCnZhciB1cmwgPSAiL19hcGkvY3Vyc29yIjsKdmFyIGJvZHkgPSB7CiAgcXVlcnk6ICJMRVQgcyA9IFNMRUVQKDAuMjUpIExFVCB0ID0gU0xFRVAoMC41KSBSRVRVUk4gMSIsCiAgY291bnQ6IHRydWUsCiAgb3B0aW9uczogewogICAgcHJvZmlsZTogMgogIH0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJMRVQgcyA9IFNMRUVQKDAuMjUpIExFVCB0ID0gU0xFRVAoMC41KSBSRVRVUk4gMVwiLFxuICBcImNvdW50XCI6IHRydWUsXG4gIFwib3B0aW9uc1wiOiB7XG4gICAgXCJwcm9maWxlXCI6IDJcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI2MDRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJyZXN1bHRcIiA6IFsgXG4gICAgMSBcbiAgXSwgXG4gIFwiaGFzTW9yZVwiIDogZmFsc2UsIFxuICBcImNvdW50XCIgOiAxLCBcbiAgXCJjYWNoZWRcIiA6IGZhbHNlLCBcbiAgXCJleHRyYVwiIDogeyBcbiAgICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICAgIFwic3RhdHNcIiA6IHsgXG4gICAgICBcIndyaXRlc0V4ZWN1dGVkXCIgOiAwLCBcbiAgICAgIFwid3JpdGVzSWdub3JlZFwiIDogMCwgXG4gICAgICBcInNjYW5uZWRGdWxsXCIgOiAwLCBcbiAgICAgIFwic2Nhbm5lZEluZGV4XCIgOiAwLCBcbiAgICAgIFwiY3Vyc29yc0NyZWF0ZWRcIiA6IDAsIFxuICAgICAgXCJjdXJzb3JzUmVhcm1lZFwiIDogMCwgXG4gICAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgICBcImNhY2hlTWlzc2VzXCIgOiAwLCBcbiAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjc1NDcxMTc3ODAwMDAwMDgsIFxuICAgICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgICAgXCJpbnRlcm1lZGlhdGVDb21taXRzXCIgOiAwLCBcbiAgICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMSwgXG4gICAgICAgICAgXCJjYWxsc1wiIDogMSwgXG4gICAgICAgICAgXCJpdGVtc1wiIDogMSwgXG4gICAgICAgICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgICAgICAgXCJydW50aW1lXCIgOiAwLjAwMDAwMzMyNzk5OTk5MTE0Mjg2MDQgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICAgIFwiY2FsbHNcIiA6IDEsIFxuICAgICAgICAgIFwiaXRlbXNcIiA6IDEsIFxuICAgICAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgICAgIFwicnVudGltZVwiIDogMC4yNTE1ODY3NzI5OTk5ODU0NCBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMywgXG4gICAgICAgICAgXCJjYWxsc1wiIDogMSwgXG4gICAgICAgICAgXCJpdGVtc1wiIDogMSwgXG4gICAgICAgICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgICAgICAgXCJydW50aW1lXCIgOiAwLjc1NDU2NDk4Mjk5OTk2NjEgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgIFwiY2FsbHNcIiA6IDEsIFxuICAgICAgICAgIFwiaXRlbXNcIiA6IDEsIFxuICAgICAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgICAgIFwicnVudGltZVwiIDogMC4wMDAwMDQ5OTU5OTk5NzI4MzQzOTcgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwiaWRcIiA6IDUsIFxuICAgICAgICAgIFwiY2FsbHNcIiA6IDEsIFxuICAgICAgICAgIFwiaXRlbXNcIiA6IDEsIFxuICAgICAgICAgIFwiZmlsdGVyZWRcIiA6IDAsIFxuICAgICAgICAgIFwicnVudGltZVwiIDogMC43NTQ1NzU5MzQ5OTk5OTEyIFxuICAgICAgICB9IFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcInBsYW5cIiA6IHsgXG4gICAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJTaW5nbGV0b25Ob2RlXCIsIFxuICAgICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiQ2FsY3VsYXRpb25Ob2RlXCIsIFxuICAgICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgICAgMSBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDIsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQwLCBcbiAgICAgICAgICAgIFwidmFsdWVcIiA6IDEsIFxuICAgICAgICAgICAgXCJ2VHlwZUlEXCIgOiAyIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgICBcImlkXCIgOiAzLCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCIyXCIsIFxuICAgICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJqc29uXCIgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgICA0IFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMywgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgICBcInR5cGVcIiA6IFwiZnVuY3Rpb24gY2FsbFwiLCBcbiAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NywgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiU0xFRVBcIiwgXG4gICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhcnJheVwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDEsIFxuICAgICAgICAgICAgICAgIFwicmF3XCIgOiBbIFxuICAgICAgICAgICAgICAgICAgMC4yNSBcbiAgICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgXSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwic1wiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJjYW5UaHJvd1wiIDogZmFsc2UsIFxuICAgICAgICAgIFwiZXhwcmVzc2lvblR5cGVcIiA6IFwic2ltcGxlXCIgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgICAyIFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDMsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNCwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgICBcInR5cGVcIiA6IFwiZnVuY3Rpb24gY2FsbFwiLCBcbiAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NywgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiU0xFRVBcIiwgXG4gICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhcnJheVwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDEsIFxuICAgICAgICAgICAgICAgIFwicmF3XCIgOiBbIFxuICAgICAgICAgICAgICAgICAgMC41IFxuICAgICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBdIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCJ0XCIsIFxuICAgICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJzaW1wbGVcIiBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIlJldHVybk5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgICAzIFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDUsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgICBcImluVmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgICBcImlkXCIgOiAzLCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCIyXCIsIFxuICAgICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgICB9IFxuICAgICAgXSwgXG4gICAgICBcInJ1bGVzXCIgOiBbIFxuICAgICAgICBcIm1vdmUtY2FsY3VsYXRpb25zLXVwXCIgXG4gICAgICBdLCBcbiAgICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgICBcInZhcmlhYmxlc1wiIDogWyBcbiAgICAgICAgeyBcbiAgICAgICAgICBcImlkXCIgOiAzLCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiMlwiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImNvbnN0YW50VmFsdWVcIiA6IDEgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJ0XCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJzXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0gXG4gICAgICBdLCBcbiAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNSwgXG4gICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEsIFxuICAgICAgXCJpc01vZGlmaWNhdGlvblF1ZXJ5XCIgOiBmYWxzZSBcbiAgICB9LCBcbiAgICBcInByb2ZpbGVcIiA6IHsgXG4gICAgICBcImluaXRpYWxpemluZ1wiIDogMC4wMDAwMDIzODM5OTk5Njk4NzkzNjksIFxuICAgICAgXCJwYXJzaW5nXCIgOiAwLjAwMDAyMzUxNTk5OTk5ODgzNTQ3LCBcbiAgICAgIFwib3B0aW1pemluZyBhc3RcIiA6IDAuMDAwMDAzMzU5MDAwMDA0MzY1OTUzLCBcbiAgICAgIFwibG9hZGluZyBjb2xsZWN0aW9uc1wiIDogMC4wMDAwMDY3MDgwMDAwMDA3OTkwNzUsIFxuICAgICAgXCJpbnN0YW50aWF0aW5nIHBsYW5cIiA6IDAuMDAwMDEyNjAzMDAwMDE2MDQyNjQzLCBcbiAgICAgIFwib3B0aW1pemluZyBwbGFuXCIgOiAwLjAwMDA1NDQ3MTk5OTk4Nzk4MTY5LCBcbiAgICAgIFwiaW5zdGFudGlhdGluZyBleGVjdXRvcnNcIiA6IDAuMDAwMDI1NTY5OTk5OTkxMTQ4NTA3LCBcbiAgICAgIFwiZXhlY3V0aW5nXCIgOiAwLjc1NDU4NDM4MTAwMDAyOTIsIFxuICAgICAgXCJmaW5hbGl6aW5nXCIgOiAwLjAwMDAzNDczMTk5OTk2MDUxMzM1IFxuICAgIH0gXG4gIH0sIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4ZWN1dGUgaW5zdHJ1bWVudGVkIHF1ZXJ5IGFuZCByZXR1cm4gcmVzdWx0IHRvZ2V0aGVyIHdpdGhcbmV4ZWN1dGlvbiBwbGFuIGFuZCBwcm9maWxpbmcgaW5mb3JtYXRpb24iLCJuYW1lIjoiUmVzdEN1cnNvclByb2ZpbGVRdWVyeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDatabaseCreateUsers_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgZGF0YWJhc2UgbmFtZWQgYG15ZGJgIHdpdGggdHdvIHVzZXJzLCBmbGV4aWJsZSBzaGFyZGluZyBhbmQKICBkZWZhdWx0IHJlcGxpY2F0aW9uIGZhY3RvciBvZiAzIGZvciBjb2xsZWN0aW9ucyB0aGF0IHdpbGwgYmUgcGFydCBvZgogIHRoZSBuZXdseSBjcmVhdGVkIGRhdGFiYXNlLgpuYW1lOiBSZXN0RGF0YWJhc2VDcmVhdGVVc2VycwotLS0KdmFyIHVybCA9ICIvX2RiL19zeXN0ZW0vX2FwaS9kYXRhYmFzZSI7CnZhciBuYW1lID0gIm15ZGIiOwp0cnkgewogIGRiLl9kcm9wRGF0YWJhc2UobmFtZSk7Cn0KY2F0Y2ggKGVycikgewp9Cgp2YXIgZGF0YSA9IHsKICBuYW1lOiBuYW1lLAogIHVzZXJzOiBbCiAgICB7CiAgICAgIHVzZXJuYW1lOiAiYWRtaW4iLAogICAgICBwYXNzd2Q6ICJzZWNyZXQiLAogICAgICBhY3RpdmU6IHRydWUKICAgIH0sCiAgICB7CiAgICAgIHVzZXJuYW1lOiAidGVzdGVyIiwKICAgICAgcGFzc3dkOiAidGVzdDAwMSIsCiAgICAgIGFjdGl2ZTogZmFsc2UKICAgIH0KICBdCn07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBkYXRhKTsKCmRiLl9kcm9wRGF0YWJhc2UobmFtZSk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2RiL19zeXN0ZW0vX2FwaS9kYXRhYmFzZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwibXlkYlwiLFxuICBcInVzZXJzXCI6IFtcbiAgICB7XG4gICAgICBcInVzZXJuYW1lXCI6IFwiYWRtaW5cIixcbiAgICAgIFwicGFzc3dkXCI6IFwic2VjcmV0XCIsXG4gICAgICBcImFjdGl2ZVwiOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBcInVzZXJuYW1lXCI6IFwidGVzdGVyXCIsXG4gICAgICBcInBhc3N3ZFwiOiBcInRlc3QwMDFcIixcbiAgICAgIFwiYWN0aXZlXCI6IGZhbHNlXG4gICAgfVxuICBdXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSwgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNyZWF0aW5nIGEgZGF0YWJhc2UgbmFtZWQgYG15ZGJgIHdpdGggdHdvIHVzZXJzLCBmbGV4aWJsZSBzaGFyZGluZyBhbmRcbmRlZmF1bHQgcmVwbGljYXRpb24gZmFjdG9yIG9mIDMgZm9yIGNvbGxlY3Rpb25zIHRoYXQgd2lsbCBiZSBwYXJ0IG9mXG50aGUgbmV3bHkgY3JlYXRlZCBkYXRhYmFzZS4iLCJuYW1lIjoiUmVzdERhdGFiYXNlQ3JlYXRlVXNlcnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDatabaseCreate_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgZGF0YWJhc2UgbmFtZWQgYGV4YW1wbGVgLgpuYW1lOiBSZXN0RGF0YWJhc2VDcmVhdGUKLS0tCnZhciB1cmwgPSAiL19kYi9fc3lzdGVtL19hcGkvZGF0YWJhc2UiOwp2YXIgbmFtZSA9ICJleGFtcGxlIjsKdHJ5IHsKICBkYi5fZHJvcERhdGFiYXNlKG5hbWUpOwp9CmNhdGNoIChlcnIpIHsKfQoKdmFyIGRhdGEgPSB7CiAgbmFtZTogbmFtZSwKICBvcHRpb25zOiB7CiAgICBzaGFyZGluZzogImZsZXhpYmxlIiwKICAgIHJlcGxpY2F0aW9uRmFjdG9yOiAzCiAgfQp9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgZGF0YSk7CgpkYi5fZHJvcERhdGFiYXNlKG5hbWUpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2RiL19zeXN0ZW0vX2FwaS9kYXRhYmFzZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwiZXhhbXBsZVwiLFxuICBcIm9wdGlvbnNcIjoge1xuICAgIFwic2hhcmRpbmdcIjogXCJmbGV4aWJsZVwiLFxuICAgIFwicmVwbGljYXRpb25GYWN0b3JcIjogM1xuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSwgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNyZWF0aW5nIGEgZGF0YWJhc2UgbmFtZWQgYGV4YW1wbGVgLiIsIm5hbWUiOiJSZXN0RGF0YWJhc2VDcmVhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDatabaseDrop_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RGF0YWJhc2VEcm9wCi0tLQp2YXIgdXJsID0gIi9fZGIvX3N5c3RlbS9fYXBpL2RhdGFiYXNlIjsKdmFyIG5hbWUgPSAiZXhhbXBsZSI7CgpkYi5fY3JlYXRlRGF0YWJhc2UobmFtZSk7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwgKyAnLycgKyBuYW1lKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2RiL19zeXN0ZW0vX2FwaS9kYXRhYmFzZS9leGFtcGxlJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0RGF0YWJhc2VEcm9wIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDatabaseGetInfo_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RGF0YWJhc2VHZXRJbmZvCi0tLQp2YXIgdXJsID0gIi9fYXBpL2RhdGFiYXNlL2N1cnJlbnQiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RhdGFiYXNlL2N1cnJlbnQnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5M1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IHsgXG4gICAgXCJpZFwiIDogXCIxXCIsIFxuICAgIFwibmFtZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgIFwiaXNTeXN0ZW1cIiA6IHRydWUsIFxuICAgIFwicGF0aFwiIDogXCJub25lXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3REYXRhYmFzZUdldEluZm8iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDatabaseGetUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RGF0YWJhc2VHZXRVc2VyCi0tLQp2YXIgdXJsID0gIi9fYXBpL2RhdGFiYXNlL3VzZXIiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RhdGFiYXNlL3VzZXInIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IFsgXG4gICAgXCJfc3lzdGVtXCIgXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3REYXRhYmFzZUdldFVzZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDatabaseGet_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RGF0YWJhc2VHZXQKLS0tCnZhciB1cmwgPSAiL19kYi9fc3lzdGVtL19hcGkvZGF0YWJhc2UiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fZGIvX3N5c3RlbS9fYXBpL2RhdGFiYXNlJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiBbIFxuICAgIFwiX3N5c3RlbVwiIFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0RGF0YWJhc2VHZXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDeleteUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RGVsZXRlVXNlcgotLS0KdmFyIHVzZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIik7CnZhciB0aGVVc2VyID0gInVzZXJUb0RlbGV0ZUBteWFwcCI7CnVzZXJzLnNhdmUodGhlVXNlciwgInNlY3JldCIpCgp2YXIgdXJsID0gIi9fYXBpL3VzZXIvIiArIHRoZVVzZXI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIHt9KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvdXNlclRvRGVsZXRlQG15YXBwJyBcdTAwM2NcdTAwM2MnRU9GJ1xue31cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMjZcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdERlbGV0ZVVzZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerDeleteDocumentIdentifierMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGRvY3VtZW50IGlkZW50aWZpZXJzOgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRJZGVudGlmaWVyTXVsdGkKLS0tCnZhciBhc3NlcnRFcXVhbCA9IHJlcXVpcmUoImpzdW5pdHkiKS5qc1VuaXR5LmFzc2VydGlvbnMuYXNzZXJ0RXF1YWw7CiAgdmFyIGNuID0gInByb2R1Y3RzIjsKICBkYi5fZHJvcChjbik7CiAgZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKCnZhciBkb2N1bWVudHMgPSBkYi5wcm9kdWN0cy5zYXZlKCBbCiB7ICJfa2V5IjogIjEiLCAidHlwZSI6ICJ0diIgfSwKIHsgIl9rZXkiOiAiMiIsICJ0eXBlIjogImNvb2tib29rIiB9CiAgXSApOwoKICB2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBjbjsKCiAgdmFyIGJvZHkgPSBbICJwcm9kdWN0cy8xIiwgInByb2R1Y3RzLzIiIF07CiAgdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCwgYm9keSk7CgogIGFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwogIGFzc2VydEVxdWFsKHJlc3BvbnNlLnBhcnNlZEJvZHksIGRvY3VtZW50cyk7CgogIGxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xuW1xuICBcInByb2R1Y3RzLzFcIixcbiAgXCJwcm9kdWN0cy8yXCJcbl1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTA3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvMVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pkazYtLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvMlwiLCBcbiAgICBcIl9rZXlcIiA6IFwiMlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pkazYtLUFcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBkb2N1bWVudCBpZGVudGlmaWVyczoiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlckRlbGV0ZURvY3VtZW50SWRlbnRpZmllck11bHRpIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerDeleteDocumentIfMatchOther_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldmlzaW9uIGNvbmZsaWN0OgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRJZk1hdGNoT3RoZXIKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8iOiJ3b3JsZCJ9KTsKdmFyIGRvY3VtZW50MiA9IGRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzIiOiJ3b3JsZCJ9KTsKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgZG9jdW1lbnQuX2lkOwp2YXIgaGVhZGVycyA9IHsiSWYtTWF0Y2giOiAgIlwiIiArIGRvY3VtZW50Mi5fcmV2ICsgIlwiIn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsLCAiIiwgaGVhZGVycyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDEyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdJZi1NYXRjaDogXCJfanQzWmRmVy0tQVwiJyAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1NzYnIiwib3V0cHV0IjoiSFRUUC8xLjEgNDEyIFByZWNvbmRpdGlvbiBGYWlsZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE1MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IFwiX2p0M1pkZlctLV9cIlxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImNvZGVcIiA6IDQxMiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDAsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJjb25mbGljdCwgX3JldiB2YWx1ZXMgZG8gbm90IG1hdGNoXCIsIFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODU3NlwiLCBcbiAgXCJfa2V5XCIgOiBcIjY4NTc2XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkZlctLV9cIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXZpc2lvbiBjb25mbGljdDoiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlckRlbGV0ZURvY3VtZW50SWZNYXRjaE90aGVyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerDeleteDocumentKeyMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGRvY3VtZW50IGtleXM6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJEZWxldGVEb2N1bWVudEtleU11bHRpCi0tLQp2YXIgYXNzZXJ0RXF1YWwgPSByZXF1aXJlKCJqc3VuaXR5IikuanNVbml0eS5hc3NlcnRpb25zLmFzc2VydEVxdWFsOwogIHZhciBjbiA9ICJwcm9kdWN0cyI7CiAgZGIuX2Ryb3AoY24pOwogIGRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7Cgp2YXIgZG9jdW1lbnRzID0gZGIucHJvZHVjdHMuc2F2ZSggWwogeyAiX2tleSI6ICIxIiwgInR5cGUiOiAidHYiIH0sCiB7ICJfa2V5IjogIjIiLCAidHlwZSI6ICJjb29rYm9vayIgfQogIF0gKTsKCiAgdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY247CgogIHZhciBib2R5ID0gWyAiMSIsICIyIiBdOwogIHZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIGJvZHkpOwoKICBhc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKICBhc3NlcnRFcXVhbChyZXNwb25zZS5wYXJzZWRCb2R5LCBkb2N1bWVudHMpOwoKICBsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xuW1xuICBcIjFcIixcbiAgXCIyXCJcbl1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTA3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvMVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pka0ctLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvMlwiLCBcbiAgICBcIl9rZXlcIiA6IFwiMlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pka0ctLUFcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBkb2N1bWVudCBrZXlzOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRLZXlNdWx0aSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerDeleteDocumentObjectMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIG9iamVjdHMgd2l0aCBkb2N1bWVudCBrZXlzOgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRPYmplY3RNdWx0aQotLS0KdmFyIGFzc2VydEVxdWFsID0gcmVxdWlyZSgianN1bml0eSIpLmpzVW5pdHkuYXNzZXJ0aW9ucy5hc3NlcnRFcXVhbDsKICB2YXIgY24gPSAicHJvZHVjdHMiOwogIGRiLl9kcm9wKGNuKTsKICBkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwoKdmFyIGRvY3VtZW50cyA9IGRiLnByb2R1Y3RzLnNhdmUoIFsKIHsgIl9rZXkiOiAiMSIsICJ0eXBlIjogInR2IiB9LAogeyAiX2tleSI6ICIyIiwgInR5cGUiOiAiY29va2Jvb2siIH0KICBdICk7CgogIHZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGNuOwoKICB2YXIgYm9keSA9IFsgeyAiX2tleSI6ICIxIiB9LCB7ICJfa2V5IjogIjIiIH0gXTsKICB2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsLCBib2R5KTsKCiAgYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CiAgYXNzZXJ0RXF1YWwocmVzcG9uc2UucGFyc2VkQm9keSwgZG9jdW1lbnRzKTsKCiAgbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xuW1xuICB7XG4gICAgXCJfa2V5XCI6IFwiMVwiXG4gIH0sXG4gIHtcbiAgICBcIl9rZXlcIjogXCIyXCJcbiAgfVxuXVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMDdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy8xXCIsIFxuICAgIFwiX2tleVwiIDogXCIxXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRtQy0tX1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy8yXCIsIFxuICAgIFwiX2tleVwiIDogXCIyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRtQy0tQVwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVzaW5nIG9iamVjdHMgd2l0aCBkb2N1bWVudCBrZXlzOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRPYmplY3RNdWx0aSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerDeleteDocumentRevConflictMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldmlzaW9uIGNvbmZsaWN0OgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRSZXZDb25mbGljdE11bHRpCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7Cgp2YXIgZG9jdW1lbnRzID0gZGIucHJvZHVjdHMuc2F2ZSggWwp7ICJfa2V5IjogIjEiLCAidHlwZSI6ICJ0diIgfSwKeyAiX2tleSI6ICIyIiwgInR5cGUiOiAiY29va2Jvb2siIH0KXSApOwoKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY24gKyAiP2lnbm9yZVJldnM9ZmFsc2UiOwp2YXIgYm9keSA9IFsKeyAiX2tleSI6ICIxIiwgIl9yZXYiOiAibm9uLW1hdGNoaW5nIHJldmlzaW9uIiB9LAp7ICJfa2V5IjogIjIiLCAiX3JldiI6ICJub24tbWF0Y2hpbmcgcmV2aXNpb24iIH0KXTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CnJlc3BvbnNlLnBhcnNlZEJvZHkuZm9yRWFjaChmdW5jdGlvbihkb2MpIHsKYXNzZXJ0KGRvYy5lcnJvciA9PT0gdHJ1ZSk7CmFzc2VydChkb2MuZXJyb3JOdW0gPT09IDEyMDApOwp9KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzP2lnbm9yZVJldnM9ZmFsc2UnIFx1MDAzY1x1MDAzYydFT0YnXG5bXG4gIHtcbiAgICBcIl9rZXlcIjogXCIxXCIsXG4gICAgXCJfcmV2XCI6IFwibm9uLW1hdGNoaW5nIHJldmlzaW9uXCJcbiAgfSxcbiAge1xuICAgIFwiX2tleVwiOiBcIjJcIixcbiAgICBcIl9yZXZcIjogXCJub24tbWF0Y2hpbmcgcmV2aXNpb25cIlxuICB9XG5dXG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE2N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tZXJyb3ItY29kZXM6IHtcIjEyMDBcIjoyfVxueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5bIFxuICB7IFxuICAgIFwiZXJyb3JcIiA6IHRydWUsIFxuICAgIFwiZXJyb3JOdW1cIiA6IDEyMDAsIFxuICAgIFwiZXJyb3JNZXNzYWdlXCIgOiBcImNvbmZsaWN0LCBfcmV2IHZhbHVlcyBkbyBub3QgbWF0Y2hcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gICAgXCJlcnJvck51bVwiIDogMTIwMCwgXG4gICAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiY29uZmxpY3QsIF9yZXYgdmFsdWVzIGRvIG5vdCBtYXRjaFwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldmlzaW9uIGNvbmZsaWN0OiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRSZXZDb25mbGljdE11bHRpIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerDeleteDocumentRevMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENoZWNrIHJldmlzaW9uczoKbmFtZTogUmVzdERvY3VtZW50SGFuZGxlckRlbGV0ZURvY3VtZW50UmV2TXVsdGkKLS0tCnZhciBhc3NlcnRFcXVhbCA9IHJlcXVpcmUoImpzdW5pdHkiKS5qc1VuaXR5LmFzc2VydGlvbnMuYXNzZXJ0RXF1YWw7CiAgdmFyIGNuID0gInByb2R1Y3RzIjsKICBkYi5fZHJvcChjbik7CiAgZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKCnZhciBkb2N1bWVudHMgPSBkYi5wcm9kdWN0cy5zYXZlKCBbCiB7ICJfa2V5IjogIjEiLCAidHlwZSI6ICJ0diIgfSwKIHsgIl9rZXkiOiAiMiIsICJ0eXBlIjogImNvb2tib29rIiB9CiAgXSApOwoKICB2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBjbiArICI/aWdub3JlUmV2cz1mYWxzZSI7CnZhciBib2R5ID0gWwogeyAiX2tleSI6ICIxIiwgIl9yZXYiOiBkb2N1bWVudHNbMF0uX3JldiB9LAogeyAiX2tleSI6ICIyIiwgIl9yZXYiOiBkb2N1bWVudHNbMV0uX3JldiB9CiAgXTsKCiAgdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCwgYm9keSk7CgogIGFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwogIGFzc2VydEVxdWFsKHJlc3BvbnNlLnBhcnNlZEJvZHksIGRvY3VtZW50cyk7CgogIGxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzP2lnbm9yZVJldnM9ZmFsc2UnIFx1MDAzY1x1MDAzYydFT0YnXG5bXG4gIHtcbiAgICBcIl9rZXlcIjogXCIxXCIsXG4gICAgXCJfcmV2XCI6IFwiX2p0M1pkbjYtLS1cIlxuICB9LFxuICB7XG4gICAgXCJfa2V5XCI6IFwiMlwiLFxuICAgIFwiX3JldlwiOiBcIl9qdDNaZG42LS1fXCJcbiAgfVxuXVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMDdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy8xXCIsIFxuICAgIFwiX2tleVwiIDogXCIxXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRuNi0tLVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy8yXCIsIFxuICAgIFwiX2tleVwiIDogXCIyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRuNi0tX1wiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNoZWNrIHJldmlzaW9uczoiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlckRlbGV0ZURvY3VtZW50UmV2TXVsdGkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerDeleteDocumentUnknownHandle_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gZG9jdW1lbnQgaWRlbnRpZmllcjoKbmFtZTogUmVzdERvY3VtZW50SGFuZGxlckRlbGV0ZURvY3VtZW50VW5rbm93bkhhbmRsZQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8iOiJ3b3JsZCJ9KTsKZGIucHJvZHVjdHMucmVtb3ZlKGRvY3VtZW50Ll9pZCk7Cgp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBkb2N1bWVudC5faWQ7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDQpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODU2NiciLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDQgTm90IEZvdW5kXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwNCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJkb2N1bWVudCBub3QgZm91bmRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVW5rbm93biBkb2N1bWVudCBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRVbmtub3duSGFuZGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerDeleteDocumentUnknownMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gZG9jdW1lbnRzOgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRVbmtub3duTXVsdGkKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2Ryb3AoIm90aGVyIik7CmRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7CmRiLl9jcmVhdGUoIm90aGVyIiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKCnZhciBkb2N1bWVudHMgPSBkYi5wcm9kdWN0cy5zYXZlKCBbCnsgIl9rZXkiOiAiMSIsICJ0eXBlIjogInR2IiB9LAp7ICJfa2V5IjogIjIiLCAidHlwZSI6ICJjb29rYm9vayIgfQpdICk7CmRiLnByb2R1Y3RzLnJlbW92ZShkb2N1bWVudHMpOwpkYi5vdGhlci5zYXZlKCB7ICJfa2V5IjogIjIiIH0gKTsKCnZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGNuOwoKdmFyIGJvZHkgPSBbICIxIiwgIm90aGVyLzIiIF07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CnJlc3BvbnNlLnBhcnNlZEJvZHkuZm9yRWFjaChmdW5jdGlvbihkb2MpIHsKYXNzZXJ0KGRvYy5lcnJvciA9PT0gdHJ1ZSk7CmFzc2VydChkb2MuZXJyb3JOdW0gPT09IDEyMDIpOwp9KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTsKZGIuX2Ryb3AoIm90aGVyIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xuW1xuICBcIjFcIixcbiAgXCJvdGhlci8yXCJcbl1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTM1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1lcnJvci1jb2Rlczoge1wiMTIwMlwiOjJ9XG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIHsgXG4gICAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gICAgXCJlcnJvck51bVwiIDogMTIwMiwgXG4gICAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiZG9jdW1lbnQgbm90IGZvdW5kXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiZXJyb3JcIiA6IHRydWUsIFxuICAgIFwiZXJyb3JOdW1cIiA6IDEyMDIsIFxuICAgIFwiZXJyb3JNZXNzYWdlXCIgOiBcImRvY3VtZW50IG5vdCBmb3VuZFwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVua25vd24gZG9jdW1lbnRzOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnRVbmtub3duTXVsdGkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerDeleteDocument_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGRvY3VtZW50IGlkZW50aWZpZXI6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJEZWxldGVEb2N1bWVudAotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8iOiJ3b3JsZCJ9KTsKCnZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGRvY3VtZW50Ll9pZDsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODU1NyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDYwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRkdS0tX1wiXG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1NTdcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODU1N1wiLCBcbiAgXCJfa2V5XCIgOiBcIjY4NTU3XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkZHUtLV9cIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBkb2N1bWVudCBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyRGVsZXRlRG9jdW1lbnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerPatchDocumentMerge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE1lcmdpbmcgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgdXNpbmcgYG1lcmdlT2JqZWN0c2A6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJQYXRjaERvY3VtZW50TWVyZ2UKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaW5oYWJpdGFudHMiOnsiY2hpbmEiOjEzNjY5ODAwMDAsImluZGlhIjoxMjYzNTkwMDAwLCJ1c2EiOjMxOTIyMDAwMH19KTsKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgZG9jdW1lbnQuX2lkOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoIkdFVCIsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoIlBBVENIIiwgdXJsICsgIj9tZXJnZU9iamVjdHM9dHJ1ZSIsIHsgImluaGFiaXRhbnRzIjogeyJpbmRvbmVzaWEiOjI1MjE2NDgwMCwiYnJhemlsIjoyMDM1NTMwMDAgfX0pOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCnZhciByZXNwb25zZTIgPSBsb2dDdXJsUmVxdWVzdCgiR0VUIiwgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlMi5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UyKTsKCnZhciByZXNwb25zZTMgPSBsb2dDdXJsUmVxdWVzdCgiUEFUQ0giLCB1cmwgKyAiP21lcmdlT2JqZWN0cz1mYWxzZSIsIHsgImluaGFiaXRhbnRzIjogeyAicGFraXN0YW4iOjE4ODM0NjAwMCB9fSk7CmFzc2VydChyZXNwb25zZTMuY29kZSA9PT0gMjAyKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlMyk7Cgp2YXIgcmVzcG9uc2U0ID0gbG9nQ3VybFJlcXVlc3QoIkdFVCIsIHVybCk7CmFzc2VydChyZXNwb25zZTQuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlNCk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NTQ0J1xuXG5jdXJsIC1YIFBBVENIIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NTQ0P21lcmdlT2JqZWN0cz10cnVlJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcImluaGFiaXRhbnRzXCI6IHtcbiAgICBcImluZG9uZXNpYVwiOiAyNTIxNjQ4MDAsXG4gICAgXCJicmF6aWxcIjogMjAzNTUzMDAwXG4gIH1cbn1cbkVPRlxuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODU0NCdcblxuY3VybCAtWCBQQVRDSCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODU0ND9tZXJnZU9iamVjdHM9ZmFsc2UnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaW5oYWJpdGFudHNcIjoge1xuICAgIFwicGFraXN0YW5cIjogMTg4MzQ2MDAwXG4gIH1cbn1cbkVPRlxuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODU0NCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEzMFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IFwiX2p0M1pkY1ctLV9cIlxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiX2tleVwiIDogXCI2ODU0NFwiLCBcbiAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg1NDRcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmRjVy0tX1wiLCBcbiAgXCJpbmhhYml0YW50c1wiIDogeyBcbiAgICBcImNoaW5hXCIgOiAxMzY2OTgwMDAwLCBcbiAgICBcImluZGlhXCIgOiAxMjYzNTkwMDAwLCBcbiAgICBcInVzYVwiIDogMzE5MjIwMDAwIFxuICB9IFxufVxuXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTcxXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRjYS0tLVwiXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfa2V5XCIgOiBcIjY4NTQ0XCIsIFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODU0NFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZGNhLS0tXCIsIFxuICBcImluaGFiaXRhbnRzXCIgOiB7IFxuICAgIFwiY2hpbmFcIiA6IDEzNjY5ODAwMDAsIFxuICAgIFwiaW5kaWFcIiA6IDEyNjM1OTAwMDAsIFxuICAgIFwidXNhXCIgOiAzMTkyMjAwMDAsIFxuICAgIFwiYnJhemlsXCIgOiAyMDM1NTMwMDAsIFxuICAgIFwiaW5kb25lc2lhXCIgOiAyNTIxNjQ4MDAgXG4gIH0gXG59XG5cblxuSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA4NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IFwiX2p0M1pkY2UtLS1cIlxuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NTQ0XG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg1NDRcIiwgXG4gIFwiX2tleVwiIDogXCI2ODU0NFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZGNlLS0tXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M1pkY2EtLS1cIiBcbn1cblxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDk3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRjZS0tLVwiXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfa2V5XCIgOiBcIjY4NTQ0XCIsIFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODU0NFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZGNlLS0tXCIsIFxuICBcImluaGFiaXRhbnRzXCIgOiB7IFxuICAgIFwicGFraXN0YW5cIiA6IDE4ODM0NjAwMCBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJNZXJnaW5nIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IHVzaW5nIGBtZXJnZU9iamVjdHNgOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyUGF0Y2hEb2N1bWVudE1lcmdlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerPatchDocument_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFBhdGNoZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgd2l0aCBuZXcgY29udGVudC4KbmFtZTogUmVzdERvY3VtZW50SGFuZGxlclBhdGNoRG9jdW1lbnQKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsib25lIjoid29ybGQifSk7CnZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGRvY3VtZW50Ll9pZDsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCJQQVRDSCIsIHVybCwgeyAiaGVsbG8iOiAid29ybGQiIH0pOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwp2YXIgcmVzcG9uc2UyID0gbG9nQ3VybFJlcXVlc3QoIlBBVENIIiwgdXJsLCB7ICJudW1iZXJzIjogeyAib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDMsICJlbXB0eSI6IG51bGwgfSB9KTsKYXNzZXJ0KHJlc3BvbnNlMi5jb2RlID09PSAyMDIpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UyKTsKdmFyIHJlc3BvbnNlMyA9IGxvZ0N1cmxSZXF1ZXN0KCJHRVQiLCB1cmwpOwphc3NlcnQocmVzcG9uc2UzLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZTMpOwp2YXIgcmVzcG9uc2U0ID0gbG9nQ3VybFJlcXVlc3QoIlBBVENIIiwgdXJsICsgIj9rZWVwTnVsbD1mYWxzZSIsIHsgImhlbGxvIjogbnVsbCwgIm51bWJlcnMiOiB7ICJmb3VyIjogNCB9IH0pOwphc3NlcnQocmVzcG9uc2U0LmNvZGUgPT09IDIwMik7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZTQpOwp2YXIgcmVzcG9uc2U1ID0gbG9nQ3VybFJlcXVlc3QoIkdFVCIsIHVybCk7CmFzc2VydChyZXNwb25zZTUuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlNSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1MzEnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaGVsbG9cIjogXCJ3b3JsZFwiXG59XG5FT0ZcblxuY3VybCAtWCBQQVRDSCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODUzMScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJudW1iZXJzXCI6IHtcbiAgICBcIm9uZVwiOiAxLFxuICAgIFwidHdvXCI6IDIsXG4gICAgXCJ0aHJlZVwiOiAzLFxuICAgIFwiZW1wdHlcIjogbnVsbFxuICB9XG59XG5FT0ZcblxuY3VybCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1MzEnXG5cbmN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1MzE/a2VlcE51bGw9ZmFsc2UnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaGVsbG9cIjogbnVsbCxcbiAgXCJudW1iZXJzXCI6IHtcbiAgICBcImZvdXJcIjogNFxuICB9XG59XG5FT0ZcblxuY3VybCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1MzEnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA4NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IFwiX2p0M1pkYmUtLUFcIlxuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NTMxXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg1MzFcIiwgXG4gIFwiX2tleVwiIDogXCI2ODUzMVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZGJlLS1BXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M1pkYmUtLV9cIiBcbn1cblxuXG5IVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDg0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRiaS0tLVwiXG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1MzFcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODUzMVwiLCBcbiAgXCJfa2V5XCIgOiBcIjY4NTMxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkYmktLS1cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzWmRiZS0tQVwiIFxufVxuXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTQxXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRiaS0tLVwiXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfa2V5XCIgOiBcIjY4NTMxXCIsIFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODUzMVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZGJpLS0tXCIsIFxuICBcIm9uZVwiIDogXCJ3b3JsZFwiLCBcbiAgXCJoZWxsb1wiIDogXCJ3b3JsZFwiLCBcbiAgXCJudW1iZXJzXCIgOiB7IFxuICAgIFwib25lXCIgOiAxLCBcbiAgICBcInR3b1wiIDogMiwgXG4gICAgXCJ0aHJlZVwiIDogMywgXG4gICAgXCJlbXB0eVwiIDogbnVsbCBcbiAgfSBcbn1cblxuXG5IVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDg0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRibS0tLVwiXG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg1MzFcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODUzMVwiLCBcbiAgXCJfa2V5XCIgOiBcIjY4NTMxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkYm0tLS1cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzWmRiaS0tLVwiIFxufVxuXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTM0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRibS0tLVwiXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfa2V5XCIgOiBcIjY4NTMxXCIsIFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODUzMVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZGJtLS0tXCIsIFxuICBcIm9uZVwiIDogXCJ3b3JsZFwiLCBcbiAgXCJudW1iZXJzXCIgOiB7IFxuICAgIFwib25lXCIgOiAxLCBcbiAgICBcInR3b1wiIDogMiwgXG4gICAgXCJ0aHJlZVwiIDogMywgXG4gICAgXCJlbXB0eVwiIDogbnVsbCwgXG4gICAgXCJmb3VyXCIgOiA0IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlBhdGNoZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgd2l0aCBuZXcgY29udGVudC4iLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlclBhdGNoRG9jdW1lbnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerPostAccept1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIGRvY3VtZW50IGluIGEgY29sbGVjdGlvbiBuYW1lZCBgcHJvZHVjdHNgIHdpdGggYSBjb2xsZWN0aW9uLWxldmVsCiAgYHdhaXRGb3JTeW5jYCB2YWx1ZSBvZiBgZmFsc2VgLgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyUG9zdEFjY2VwdDEKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogZmFsc2UgfSk7Cgp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBjbjsKdmFyIGJvZHkgPSAneyAiSGVsbG8iOiAiV29ybGQiIH0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJIZWxsb1wiOiBcIldvcmxkXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2MFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IFwiX2p0M1pkVU8tLV9cIlxuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NDYxXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg0NjFcIiwgXG4gIFwiX2tleVwiIDogXCI2ODQ2MVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaZFVPLS1fXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRlIGEgZG9jdW1lbnQgaW4gYSBjb2xsZWN0aW9uIG5hbWVkIGBwcm9kdWN0c2Agd2l0aCBhIGNvbGxlY3Rpb24tbGV2ZWxcbmB3YWl0Rm9yU3luY2AgdmFsdWUgb2YgYGZhbHNlYC4iLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlclBvc3RBY2NlcHQxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerPostBadJson1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIElsbGVnYWwgZG9jdW1lbnQKbmFtZTogUmVzdERvY3VtZW50SGFuZGxlclBvc3RCYWRKc29uMQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCnZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGNuOwp2YXIgYm9keSA9ICd7IDE6ICJXb3JsZCIgfSc7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcbnsgMTogXCJXb3JsZFwiIH1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDQwMCBCYWQgUmVxdWVzdFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogOTdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDAsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiVlBhY2tFcnJvciBlcnJvcjogRXhwZWN0aW5nICdcXFwiJyBvciAnfSdcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDYwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJJbGxlZ2FsIGRvY3VtZW50IiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJQb3N0QmFkSnNvbjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerPostBadJsonMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFBhcnRpYWxseSBpbGxlZ2FsIGRvY3VtZW50czoKbmFtZTogUmVzdERvY3VtZW50SGFuZGxlclBvc3RCYWRKc29uTXVsdGkKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBjbjsKdmFyIGJvZHkgPSAnW3sgIl9rZXkiOiAxMTEgfSwgeyJfa2V5IjoiYWJjIn1dJzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcblt7IFwiX2tleVwiOiAxMTEgfSwge1wiX2tleVwiOlwiYWJjXCJ9XVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMjdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWVycm9yLWNvZGVzOiB7XCIxMjIxXCI6MX1cbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcImVycm9yXCIgOiB0cnVlLCBcbiAgICBcImVycm9yTnVtXCIgOiAxMjIxLCBcbiAgICBcImVycm9yTWVzc2FnZVwiIDogXCJpbGxlZ2FsIGRvY3VtZW50IGtleVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy9hYmNcIiwgXG4gICAgXCJfa2V5XCIgOiBcImFiY1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pkaW0tLS1cIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJQYXJ0aWFsbHkgaWxsZWdhbCBkb2N1bWVudHM6IiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJQb3N0QmFkSnNvbk11bHRpIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerPostCreate1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIGRvY3VtZW50IGluIGEgY29sbGVjdGlvbiBuYW1lZCBgcHJvZHVjdHNgLiBOb3RlIHRoYXQgdGhlCiAgcmV2aXNpb24gaWRlbnRpZmllciBtaWdodCBvciBtaWdodCBub3QgYnkgZXF1YWwgdG8gdGhlIGF1dG8tZ2VuZXJhdGVkCiAga2V5LgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyUG9zdENyZWF0ZTEKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKCnZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGNuOwp2YXIgYm9keSA9ICd7ICJIZWxsbyI6ICJXb3JsZCIgfSc7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJIZWxsb1wiOiBcIldvcmxkXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDYwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRUdS0tX1wiXG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg0NTNcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODQ1M1wiLCBcbiAgXCJfa2V5XCIgOiBcIjY4NDUzXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkVHUtLV9cIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGUgYSBkb2N1bWVudCBpbiBhIGNvbGxlY3Rpb24gbmFtZWQgYHByb2R1Y3RzYC4gTm90ZSB0aGF0IHRoZVxucmV2aXNpb24gaWRlbnRpZmllciBtaWdodCBvciBtaWdodCBub3QgYnkgZXF1YWwgdG8gdGhlIGF1dG8tZ2VuZXJhdGVkXG5rZXkuIiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJQb3N0Q3JlYXRlMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerPostMulti1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEluc2VydCBtdWx0aXBsZSBkb2N1bWVudHM6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJQb3N0TXVsdGkxCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY247CnZhciBib2R5ID0gJ1t7IkhlbGxvIjoiRWFydGgifSwgeyJIZWxsbyI6IlZlbnVzIn0sIHsiSGVsbG8iOiJNYXJzIn1dJzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcblt7XCJIZWxsb1wiOlwiRWFydGhcIn0sIHtcIkhlbGxvXCI6XCJWZW51c1wifSwge1wiSGVsbG9cIjpcIk1hcnNcIn1dXG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE4NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5bIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NTk3XCIsIFxuICAgIFwiX2tleVwiIDogXCI2ODU5N1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pkaE8tLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg1OThcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjY4NTk4XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRoTy0tX1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODU5OVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNjg1OTlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaZGhPLS1BXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiSW5zZXJ0IG11bHRpcGxlIGRvY3VtZW50czoiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlclBvc3RNdWx0aTEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerPostMulti2_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzZSBvZiByZXR1cm5OZXc6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJQb3N0TXVsdGkyCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY24gKyAiP3JldHVybk5ldz10cnVlIjsKdmFyIGJvZHkgPSAnW3siSGVsbG8iOiJFYXJ0aCJ9LCB7IkhlbGxvIjoiVmVudXMifSwgeyJIZWxsbyI6Ik1hcnMifV0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cz9yZXR1cm5OZXc9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcblt7XCJIZWxsb1wiOlwiRWFydGhcIn0sIHtcIkhlbGxvXCI6XCJWZW51c1wifSwge1wiSGVsbG9cIjpcIk1hcnNcIn1dXG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQzMlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5bIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NjA3XCIsIFxuICAgIFwiX2tleVwiIDogXCI2ODYwN1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pkaDYtLV9cIiwgXG4gICAgXCJuZXdcIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiNjg2MDdcIiwgXG4gICAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODYwN1wiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzWmRoNi0tX1wiLCBcbiAgICAgIFwiSGVsbG9cIiA6IFwiRWFydGhcIiBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy82ODYwOFwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNjg2MDhcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaZGg2LS1BXCIsIFxuICAgIFwibmV3XCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcIjY4NjA4XCIsIFxuICAgICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg2MDhcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M1pkaDYtLUFcIiwgXG4gICAgICBcIkhlbGxvXCIgOiBcIlZlbnVzXCIgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvNjg2MDlcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjY4NjA5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRoNi0tQlwiLCBcbiAgICBcIm5ld1wiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCI2ODYwOVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NjA5XCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNaZGg2LS1CXCIsIFxuICAgICAgXCJIZWxsb1wiIDogXCJNYXJzXCIgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2Ugb2YgcmV0dXJuTmV3OiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyUG9zdE11bHRpMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerPostOverwrite_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyUG9zdE92ZXJ3cml0ZQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiB0cnVlIH0pOwoKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY247CnZhciBib2R5ID0gJ3sgIkhlbGxvIjogIldvcmxkIiwgIl9rZXkiIDogImxvY2siIH0nOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Ci8vIGluc2VydAphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmJvZHkgPSAneyAiSGVsbG8iOiAiVW5pdmVyc2UiLCAiX2tleSIgOiAibG9jayIgfSc7CnVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY24gKyAiP292ZXJ3cml0ZT10cnVlIjsKcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Ci8vIGluc2VydCBzYW1lIGtleQphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJIZWxsb1wiOiBcIldvcmxkXCIsIFwiX2tleVwiIDogXCJsb2NrXCIgfVxuRU9GXG5cbmN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cz9vdmVyd3JpdGU9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJIZWxsb1wiOiBcIlVuaXZlcnNlXCIsIFwiX2tleVwiIDogXCJsb2NrXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRZLS0tLVwiXG5leHBpcmVzOiAwXG5sb2NhdGlvbjogL19kYi9fc3lzdGVtL19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvbG9ja1xucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiX2lkXCIgOiBcInByb2R1Y3RzL2xvY2tcIiwgXG4gIFwiX2tleVwiIDogXCJsb2NrXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkWS0tLS1cIiBcbn1cblxuXG5IVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogODJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBcIl9qdDNaZFlPLS0tXCJcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9kb2N1bWVudC9wcm9kdWN0cy9sb2NrXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfaWRcIiA6IFwicHJvZHVjdHMvbG9ja1wiLCBcbiAgXCJfa2V5XCIgOiBcImxvY2tcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmRZTy0tLVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNaZFktLS0tXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJQb3N0T3ZlcndyaXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerPostReturnNew_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzZSBvZiByZXR1cm5OZXc6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJQb3N0UmV0dXJuTmV3Ci0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY24gKyAiP3JldHVybk5ldz10cnVlIjsKdmFyIGJvZHkgPSAneyJIZWxsbyI6IldvcmxkIn0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cz9yZXR1cm5OZXc9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcIkhlbGxvXCI6XCJXb3JsZFwifVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNDNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBcIl9qdDNaZFhlLS0tXCJcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODQ4NFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NDg0XCIsIFxuICBcIl9rZXlcIiA6IFwiNjg0ODRcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmRYZS0tLVwiLCBcbiAgXCJuZXdcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcIjY4NDg0XCIsIFxuICAgIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NDg0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRYZS0tLVwiLCBcbiAgICBcIkhlbGxvXCIgOiBcIldvcmxkXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNlIG9mIHJldHVybk5ldzoiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlclBvc3RSZXR1cm5OZXciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerPostUnknownCollection1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gY29sbGVjdGlvbiBuYW1lCm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJQb3N0VW5rbm93bkNvbGxlY3Rpb24xCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwoKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgY247CnZhciBib2R5ID0gJ3sgIkhlbGxvIjogIldvcmxkIiB9JzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDQpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJIZWxsb1wiOiBcIldvcmxkXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogOTdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiY29sbGVjdGlvbiBvciB2aWV3IG5vdCBmb3VuZDogcHJvZHVjdHNcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDMgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVW5rbm93biBjb2xsZWN0aW9uIG5hbWUiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlclBvc3RVbmtub3duQ29sbGVjdGlvbjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerPostWait1_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0ZSBhIGRvY3VtZW50IGluIGEgY29sbGVjdGlvbiB3aXRoIGEgY29sbGVjdGlvbi1sZXZlbCBgd2FpdEZvclN5bmNgCiAgdmFsdWUgb2YgYGZhbHNlYCwgYnV0IHVzaW5nIHRoZSBgd2FpdEZvclN5bmNgIHF1ZXJ5IHBhcmFtZXRlci4KbmFtZTogUmVzdERvY3VtZW50SGFuZGxlclBvc3RXYWl0MQotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IHdhaXRGb3JTeW5jOiBmYWxzZSB9KTsKCnZhciB1cmwgPSAiL19hcGkvZG9jdW1lbnQvIiArIGNuICsgIj93YWl0Rm9yU3luYz10cnVlIjsKdmFyIGJvZHkgPSAneyAiSGVsbG8iOiAiV29ybGQiIH0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cz93YWl0Rm9yU3luYz10cnVlJyBcdTAwM2NcdTAwM2MnRU9GJ1xueyBcIkhlbGxvXCI6IFwiV29ybGRcIiB9XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBcIl9qdDNaZFYtLS1fXCJcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODQ2OVxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NDY5XCIsIFxuICBcIl9rZXlcIiA6IFwiNjg0NjlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmRWLS0tX1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNyZWF0ZSBhIGRvY3VtZW50IGluIGEgY29sbGVjdGlvbiB3aXRoIGEgY29sbGVjdGlvbi1sZXZlbCBgd2FpdEZvclN5bmNgXG52YWx1ZSBvZiBgZmFsc2VgLCBidXQgdXNpbmcgdGhlIGB3YWl0Rm9yU3luY2AgcXVlcnkgcGFyYW1ldGVyLiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyUG9zdFdhaXQxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerReadDocumentHead_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyUmVhZERvY3VtZW50SGVhZAotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCnZhciBkb2N1bWVudCA9IGRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbyI6IndvcmxkIn0pOwp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBkb2N1bWVudC5faWQ7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnSEVBRCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggSEVBRCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvZG9jdW1lbnQvcHJvZHVjdHMvNjg0NDQnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3NlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV0YWc6IFwiX2p0M1pkU2UtLS1cIlxuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJSZWFkRG9jdW1lbnRIZWFkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerReadDocumentIfNoneMatch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzZSBhIGRvY3VtZW50IGlkZW50aWZpZXIgYW5kIGFuIEVUYWc6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJSZWFkRG9jdW1lbnRJZk5vbmVNYXRjaAotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCnZhciBkb2N1bWVudCA9IGRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbyI6IndvcmxkIn0pOwp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBkb2N1bWVudC5faWQ7CnZhciBoZWFkZXJzID0geyJJZi1Ob25lLU1hdGNoIjogIlwiIiArIGRvY3VtZW50Ll9yZXYgKyAiXCIifTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwsICIiLCBoZWFkZXJzKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDMwNCk7CmxvZ1Jhd1Jlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ0lmLU5vbmUtTWF0Y2g6IFwiX2p0M1pkUkctLV9cIicgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NDI4JyIsIm91dHB1dCI6IkhUVFAvMS4xIDMwNCBOb3QgTW9kaWZpZWRcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBcIl9qdDNaZFJHLS1fXCJcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVzZSBhIGRvY3VtZW50IGlkZW50aWZpZXIgYW5kIGFuIEVUYWc6IiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJSZWFkRG9jdW1lbnRJZk5vbmVNYXRjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerReadDocumentUnknownHandle_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gZG9jdW1lbnQgaWRlbnRpZmllcjoKbmFtZTogUmVzdERvY3VtZW50SGFuZGxlclJlYWREb2N1bWVudFVua25vd25IYW5kbGUKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBjbiArICIvdW5rbm93bi1pZGVudGlmaWVyIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzL3Vua25vd24taWRlbnRpZmllciciLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDQgTm90IEZvdW5kXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwNCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJkb2N1bWVudCBub3QgZm91bmRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVW5rbm93biBkb2N1bWVudCBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyUmVhZERvY3VtZW50VW5rbm93bkhhbmRsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerReadDocument_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzZSBhIGRvY3VtZW50IGlkZW50aWZpZXI6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJSZWFkRG9jdW1lbnQKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8iOiJ3b3JsZCJ9KTsKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgZG9jdW1lbnQuX2lkOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NDE5JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzZcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBcIl9qdDNaZFF5LS1fXCJcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIl9rZXlcIiA6IFwiNjg0MTlcIiwgXG4gIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NDE5XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M1pkUXktLV9cIiwgXG4gIFwiaGVsbG9cIiA6IFwid29ybGRcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2UgYSBkb2N1bWVudCBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyUmVhZERvY3VtZW50IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestDocumentHandlerReadMultiDocument_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlYWRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3REb2N1bWVudEhhbmRsZXJSZWFkTXVsdGlEb2N1bWVudAotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCmRiLnByb2R1Y3RzLnNhdmUoeyJfa2V5IjoiZG9jMSIsICJoZWxsbyI6IndvcmxkIn0pOwpkYi5wcm9kdWN0cy5zYXZlKHsiX2tleSI6ImRvYzIiLCAic2F5IjoiaGkgdG8gbW9tIn0pOwp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzP29ubHlnZXQ9dHJ1ZSI7CnZhciBib2R5ID0gJ1siZG9jMSIsIHsiX2tleSI6ImRvYzIifV0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzP29ubHlnZXQ9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcbltcImRvYzFcIiwge1wiX2tleVwiOlwiZG9jMlwifV1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTUzXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImRvYzFcIiwgXG4gICAgXCJfaWRcIiA6IFwicHJvZHVjdHMvZG9jMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pkZ08tLS1cIiwgXG4gICAgXCJoZWxsb1wiIDogXCJ3b3JsZFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiZG9jMlwiLCBcbiAgICBcIl9pZFwiIDogXCJwcm9kdWN0cy9kb2MyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmRnTy0tX1wiLCBcbiAgICBcInNheVwiIDogXCJoaSB0byBtb21cIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZWFkaW5nIG11bHRpcGxlIGRvY3VtZW50cyBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyUmVhZE11bHRpRG9jdW1lbnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerUpdateDocumentIfMatchOther_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFByb2R1Y2UgYSByZXZpc2lvbiBjb25mbGljdApuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyVXBkYXRlRG9jdW1lbnRJZk1hdGNoT3RoZXIKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8iOiJ3b3JsZCJ9KTsKdmFyIGRvY3VtZW50MiA9IGRiLnByb2R1Y3RzLnNhdmUoeyJoZWxsbzIiOiJ3b3JsZCJ9KTsKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgZG9jdW1lbnQuX2lkOwp2YXIgaGVhZGVycyA9IHsiSWYtTWF0Y2giOiAgIlwiIiArIGRvY3VtZW50Mi5fcmV2ICsgIlwiIn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAneyJvdGhlciI6ImNvbnRlbnQifScsIGhlYWRlcnMpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQxMik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdJZi1NYXRjaDogXCJfanQzWmRhYS0tLVwiJyAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODUxOScgXHUwMDNjXHUwMDNjJ0VPRidcbntcIm90aGVyXCI6XCJjb250ZW50XCJ9XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSA0MTIgUHJlY29uZGl0aW9uIEZhaWxlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTUyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXRhZzogXCJfanQzWmRhVy0tX1wiXG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiY29kZVwiIDogNDEyLCBcbiAgXCJlcnJvck51bVwiIDogMTIwMCwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcImNvbmZsaWN0LCBfcmV2IHZhbHVlcyBkbyBub3QgbWF0Y2hcIiwgXG4gIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NTE5XCIsIFxuICBcIl9rZXlcIiA6IFwiNjg1MTlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmRhVy0tX1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlByb2R1Y2UgYSByZXZpc2lvbiBjb25mbGljdCIsIm5hbWUiOiJSZXN0RG9jdW1lbnRIYW5kbGVyVXBkYXRlRG9jdW1lbnRJZk1hdGNoT3RoZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestDocumentHandlerUpdateDocumentUnknownHandle_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVua25vd24gZG9jdW1lbnQgaWRlbnRpZmllcgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyVXBkYXRlRG9jdW1lbnRVbmtub3duSGFuZGxlCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIGRvY3VtZW50ID0gZGIucHJvZHVjdHMuc2F2ZSh7ImhlbGxvIjoid29ybGQifSk7CmRiLnByb2R1Y3RzLnJlbW92ZShkb2N1bWVudC5faWQpOwp2YXIgdXJsID0gIi9fYXBpL2RvY3VtZW50LyIgKyBkb2N1bWVudC5faWQ7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAie30iKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDQpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NTA5JyBcdTAwM2NcdTAwM2MnRU9GJ1xue31cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcImRvY3VtZW50IG5vdCBmb3VuZFwiLCBcbiAgXCJlcnJvck51bVwiIDogMTIwMiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVbmtub3duIGRvY3VtZW50IGlkZW50aWZpZXIiLCJuYW1lIjoiUmVzdERvY3VtZW50SGFuZGxlclVwZGF0ZURvY3VtZW50VW5rbm93bkhhbmRsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestDocumentHandlerUpdateDocument_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgZG9jdW1lbnQgaWRlbnRpZmllcgpuYW1lOiBSZXN0RG9jdW1lbnRIYW5kbGVyVXBkYXRlRG9jdW1lbnQKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgZG9jdW1lbnQgPSBkYi5wcm9kdWN0cy5zYXZlKHsiaGVsbG8iOiJ3b3JsZCJ9KTsKdmFyIHVybCA9ICIvX2FwaS9kb2N1bWVudC8iICsgZG9jdW1lbnQuX2lkOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgJ3siSGVsbG8iOiAieW91In0nKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2RvY3VtZW50L3Byb2R1Y3RzLzY4NTAwJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1wiSGVsbG9cIjogXCJ5b3VcIn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogODRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5ldGFnOiBcIl9qdDNaZFpPLS0tXCJcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9kb2N1bWVudC9wcm9kdWN0cy82ODUwMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiX2lkXCIgOiBcInByb2R1Y3RzLzY4NTAwXCIsIFxuICBcIl9rZXlcIiA6IFwiNjg1MDBcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmRaTy0tLVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNaZFpLLS1fXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYSBkb2N1bWVudCBpZGVudGlmaWVyIiwibmFtZSI6IlJlc3REb2N1bWVudEhhbmRsZXJVcGRhdGVEb2N1bWVudCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestEdgesReadEdgesAny_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEFueSBkaXJlY3Rpb24KbmFtZTogUmVzdEVkZ2VzUmVhZEVkZ2VzQW55Ci0tLQp2YXIgZGIgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYjsKZGIuX2NyZWF0ZSgidmVydGljZXMiKTsKZGIuX2NyZWF0ZUVkZ2VDb2xsZWN0aW9uKCJlZGdlcyIpOwoKZGIudmVydGljZXMuc2F2ZSh7X2tleTogIjEifSk7CmRiLnZlcnRpY2VzLnNhdmUoe19rZXk6ICIyIn0pOwpkYi52ZXJ0aWNlcy5zYXZlKHtfa2V5OiAiMyJ9KTsKZGIudmVydGljZXMuc2F2ZSh7X2tleTogIjQifSk7CgpkYi5lZGdlcy5zYXZlKHtfZnJvbTogInZlcnRpY2VzLzEiLCBfdG86ICJ2ZXJ0aWNlcy8zIiwgX2tleTogIjUiLCAiJGxhYmVsIjogInYxIC0+IHYzIn0pOwpkYi5lZGdlcy5zYXZlKHtfZnJvbTogInZlcnRpY2VzLzIiLCBfdG86ICJ2ZXJ0aWNlcy8xIiwgX2tleTogIjYiLCAiJGxhYmVsIjogInYyIC0+IHYxIn0pOwpkYi5lZGdlcy5zYXZlKHtfZnJvbTogInZlcnRpY2VzLzQiLCBfdG86ICJ2ZXJ0aWNlcy8xIiwgX2tleTogIjciLCAiJGxhYmVsIjogInY0IC0+IHYxIn0pOwoKdmFyIHVybCA9ICIvX2FwaS9lZGdlcy9lZGdlcz92ZXJ0ZXg9dmVydGljZXMvMSI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcCgiZWRnZXMiKTsKZGIuX2Ryb3AoInZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2VkZ2VzL2VkZ2VzP3ZlcnRleD12ZXJ0aWNlcy8xJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjMwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZWRnZXNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI1XCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZWRnZXMvNVwiLCBcbiAgICAgIFwiX2Zyb21cIiA6IFwidmVydGljZXMvMVwiLCBcbiAgICAgIFwiX3RvXCIgOiBcInZlcnRpY2VzLzNcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKWnEtLS1cIiwgXG4gICAgICBcIiRsYWJlbFwiIDogXCJ2MSAtXHUwMDNlIHYzXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI2XCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZWRnZXMvNlwiLCBcbiAgICAgIFwiX2Zyb21cIiA6IFwidmVydGljZXMvMlwiLCBcbiAgICAgIFwiX3RvXCIgOiBcInZlcnRpY2VzLzFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKWnEtLV9cIiwgXG4gICAgICBcIiRsYWJlbFwiIDogXCJ2MiAtXHUwMDNlIHYxXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI3XCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZWRnZXMvN1wiLCBcbiAgICAgIFwiX2Zyb21cIiA6IFwidmVydGljZXMvNFwiLCBcbiAgICAgIFwiX3RvXCIgOiBcInZlcnRpY2VzLzFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKWnEtLUFcIiwgXG4gICAgICBcIiRsYWJlbFwiIDogXCJ2NCAtXHUwMDNlIHYxXCIgXG4gICAgfSBcbiAgXSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDAsIFxuICAgIFwid3JpdGVzSWdub3JlZFwiIDogMCwgXG4gICAgXCJzY2FubmVkRnVsbFwiIDogMCwgXG4gICAgXCJzY2FubmVkSW5kZXhcIiA6IDMsIFxuICAgIFwiY3Vyc29yc0NyZWF0ZWRcIiA6IDIsIFxuICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICBcImNhY2hlTWlzc2VzXCIgOiAyLCBcbiAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICBcImh0dHBSZXF1ZXN0c1wiIDogMCwgXG4gICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDIzMTEwNTAwMDAxMTY2NjU2LCBcbiAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMzI3NjgsIFxuICAgIFwiaW50ZXJtZWRpYXRlQ29tbWl0c1wiIDogMCBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJBbnkgZGlyZWN0aW9uIiwibmFtZSI6IlJlc3RFZGdlc1JlYWRFZGdlc0FueSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestEdgesReadEdgesIn_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEluIGVkZ2VzCm5hbWU6IFJlc3RFZGdlc1JlYWRFZGdlc0luCi0tLQp2YXIgZGIgPSByZXF1aXJlKCJAYXJhbmdvZGIiKS5kYjsKZGIuX2NyZWF0ZSgidmVydGljZXMiKTsKZGIuX2NyZWF0ZUVkZ2VDb2xsZWN0aW9uKCJlZGdlcyIpOwoKZGIudmVydGljZXMuc2F2ZSh7X2tleTogIjEifSk7CmRiLnZlcnRpY2VzLnNhdmUoe19rZXk6ICIyIn0pOwpkYi52ZXJ0aWNlcy5zYXZlKHtfa2V5OiAiMyJ9KTsKZGIudmVydGljZXMuc2F2ZSh7X2tleTogIjQifSk7CgpkYi5lZGdlcy5zYXZlKHtfZnJvbTogInZlcnRpY2VzLzEiLCBfdG86ICJ2ZXJ0aWNlcy8zIiwgX2tleTogIjUiLCAiJGxhYmVsIjogInYxIC0+IHYzIn0pOwpkYi5lZGdlcy5zYXZlKHtfZnJvbTogInZlcnRpY2VzLzIiLCBfdG86ICJ2ZXJ0aWNlcy8xIiwgX2tleTogIjYiLCAiJGxhYmVsIjogInYyIC0+IHYxIn0pOwpkYi5lZGdlcy5zYXZlKHtfZnJvbTogInZlcnRpY2VzLzQiLCBfdG86ICJ2ZXJ0aWNlcy8xIiwgX2tleTogIjciLCAiJGxhYmVsIjogInY0IC0+IHYxIn0pOwoKdmFyIHVybCA9ICIvX2FwaS9lZGdlcy9lZGdlcz92ZXJ0ZXg9dmVydGljZXMvMSZkaXJlY3Rpb249aW4iOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoImVkZ2VzIik7CmRiLl9kcm9wKCJ2ZXJ0aWNlcyIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2VkZ2VzL2VkZ2VzP3ZlcnRleD12ZXJ0aWNlcy8xXHUwMDI2ZGlyZWN0aW9uPWluJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNTE1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZWRnZXNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI2XCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZWRnZXMvNlwiLCBcbiAgICAgIFwiX2Zyb21cIiA6IFwidmVydGljZXMvMlwiLCBcbiAgICAgIFwiX3RvXCIgOiBcInZlcnRpY2VzLzFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKYUstLUJcIiwgXG4gICAgICBcIiRsYWJlbFwiIDogXCJ2MiAtXHUwMDNlIHYxXCIgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCI3XCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZWRnZXMvN1wiLCBcbiAgICAgIFwiX2Zyb21cIiA6IFwidmVydGljZXMvNFwiLCBcbiAgICAgIFwiX3RvXCIgOiBcInZlcnRpY2VzLzFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FKYUstLUNcIiwgXG4gICAgICBcIiRsYWJlbFwiIDogXCJ2NCAtXHUwMDNlIHYxXCIgXG4gICAgfSBcbiAgXSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwid3JpdGVzRXhlY3V0ZWRcIiA6IDAsIFxuICAgIFwid3JpdGVzSWdub3JlZFwiIDogMCwgXG4gICAgXCJzY2FubmVkRnVsbFwiIDogMCwgXG4gICAgXCJzY2FubmVkSW5kZXhcIiA6IDIsIFxuICAgIFwiY3Vyc29yc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwiY3Vyc29yc1JlYXJtZWRcIiA6IDAsIFxuICAgIFwiY2FjaGVIaXRzXCIgOiAwLCBcbiAgICBcImNhY2hlTWlzc2VzXCIgOiAxLCBcbiAgICBcImZpbHRlcmVkXCIgOiAwLCBcbiAgICBcImh0dHBSZXF1ZXN0c1wiIDogMCwgXG4gICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDE3NDAzNjAwMDAzMjYyOTEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImludGVybWVkaWF0ZUNvbW1pdHNcIiA6IDAgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiSW4gZWRnZXMiLCJuYW1lIjoiUmVzdEVkZ2VzUmVhZEVkZ2VzSW4iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestEdgesReadEdgesOut_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE91dCBlZGdlcwpuYW1lOiBSZXN0RWRnZXNSZWFkRWRnZXNPdXQKLS0tCnZhciBkYiA9IHJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiOwpkYi5fY3JlYXRlKCJ2ZXJ0aWNlcyIpOwpkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oImVkZ2VzIik7CgpkYi52ZXJ0aWNlcy5zYXZlKHtfa2V5OiAiMSJ9KTsKZGIudmVydGljZXMuc2F2ZSh7X2tleTogIjIifSk7CmRiLnZlcnRpY2VzLnNhdmUoe19rZXk6ICIzIn0pOwpkYi52ZXJ0aWNlcy5zYXZlKHtfa2V5OiAiNCJ9KTsKCmRiLmVkZ2VzLnNhdmUoe19mcm9tOiAidmVydGljZXMvMSIsIF90bzogInZlcnRpY2VzLzMiLCBfa2V5OiAiNSIsICIkbGFiZWwiOiAidjEgLT4gdjMifSk7CmRiLmVkZ2VzLnNhdmUoe19mcm9tOiAidmVydGljZXMvMiIsIF90bzogInZlcnRpY2VzLzEiLCBfa2V5OiAiNiIsICIkbGFiZWwiOiAidjIgLT4gdjEifSk7CmRiLmVkZ2VzLnNhdmUoe19mcm9tOiAidmVydGljZXMvNCIsIF90bzogInZlcnRpY2VzLzEiLCBfa2V5OiAiNyIsICIkbGFiZWwiOiAidjQgLT4gdjEifSk7Cgp2YXIgdXJsID0gIi9fYXBpL2VkZ2VzL2VkZ2VzP3ZlcnRleD12ZXJ0aWNlcy8xJmRpcmVjdGlvbj1vdXQiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoImVkZ2VzIik7CmRiLl9kcm9wKCJ2ZXJ0aWNlcyIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2VkZ2VzL2VkZ2VzP3ZlcnRleD12ZXJ0aWNlcy8xXHUwMDI2ZGlyZWN0aW9uPW91dCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQwNlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVkZ2VzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcIl9rZXlcIiA6IFwiNVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImVkZ2VzLzVcIiwgXG4gICAgICBcIl9mcm9tXCIgOiBcInZlcnRpY2VzLzFcIiwgXG4gICAgICBcIl90b1wiIDogXCJ2ZXJ0aWNlcy8zXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhSmJpLS1fXCIsIFxuICAgICAgXCIkbGFiZWxcIiA6IFwidjEgLVx1MDAzZSB2M1wiIFxuICAgIH0gXG4gIF0sIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcIndyaXRlc0V4ZWN1dGVkXCIgOiAwLCBcbiAgICBcIndyaXRlc0lnbm9yZWRcIiA6IDAsIFxuICAgIFwic2Nhbm5lZEZ1bGxcIiA6IDAsIFxuICAgIFwic2Nhbm5lZEluZGV4XCIgOiAxLCBcbiAgICBcImN1cnNvcnNDcmVhdGVkXCIgOiAxLCBcbiAgICBcImN1cnNvcnNSZWFybWVkXCIgOiAwLCBcbiAgICBcImNhY2hlSGl0c1wiIDogMCwgXG4gICAgXCJjYWNoZU1pc3Nlc1wiIDogMSwgXG4gICAgXCJmaWx0ZXJlZFwiIDogMCwgXG4gICAgXCJodHRwUmVxdWVzdHNcIiA6IDAsIFxuICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxNzIyMzMwMDAwMDA2ODc3NSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgIFwiaW50ZXJtZWRpYXRlQ29tbWl0c1wiIDogMCBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJPdXQgZWRnZXMiLCJuYW1lIjoiUmVzdEVkZ2VzUmVhZEVkZ2VzT3V0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestEndpointGet_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RW5kcG9pbnRHZXQKLS0tCnZhciB1cmwgPSAiL19kYi9fc3lzdGVtL19hcGkvZW5kcG9pbnQiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fZGIvX3N5c3RlbS9fYXBpL2VuZHBvaW50JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzZcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcImVuZHBvaW50XCIgOiBcImh0dHA6Ly8wLjAuMC4wOjg1MjlcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEVuZHBvaW50R2V0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestEngine_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybiB0aGUgYWN0aXZlIHN0b3JhZ2UgZW5naW5lOgpuYW1lOiBSZXN0RW5naW5lCi0tLQp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgJy9fYXBpL2VuZ2luZScpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2VuZ2luZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIxMlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIm5hbWVcIiA6IFwicm9ja3NkYlwiLCBcbiAgXCJzdXBwb3J0c1wiIDogeyBcbiAgICBcImRmZGJcIiA6IGZhbHNlLCBcbiAgICBcImluZGV4ZXNcIiA6IFsgXG4gICAgICBcInByaW1hcnlcIiwgXG4gICAgICBcImVkZ2VcIiwgXG4gICAgICBcImhhc2hcIiwgXG4gICAgICBcInNraXBsaXN0XCIsIFxuICAgICAgXCJ0dGxcIiwgXG4gICAgICBcInBlcnNpc3RlbnRcIiwgXG4gICAgICBcImdlb1wiLCBcbiAgICAgIFwiZnVsbHRleHRcIiwgXG4gICAgICBcInprZFwiLCBcbiAgICAgIFwiaW52ZXJ0ZWRcIiBcbiAgICBdLCBcbiAgICBcImFsaWFzZXNcIiA6IHsgXG4gICAgICBcImluZGV4ZXNcIiA6IHsgXG4gICAgICAgIFwiaGFzaFwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICAgICAgICBcInNraXBsaXN0XCIgOiBcInBlcnNpc3RlbnRcIiBcbiAgICAgIH0gXG4gICAgfSBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXR1cm4gdGhlIGFjdGl2ZSBzdG9yYWdlIGVuZ2luZToiLCJuYW1lIjoiUmVzdEVuZ2luZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestExplainAllPlans_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybmluZyBhbGwgcGxhbnMKbmFtZTogUmVzdEV4cGxhaW5BbGxQbGFucwotLS0KdmFyIHVybCA9ICIvX2FwaS9leHBsYWluIjsKdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKZGIucHJvZHVjdHMuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyJpZCJdIH0pOwpib2R5ID0gewogIHF1ZXJ5IDogIkZPUiBwIElOIHByb2R1Y3RzIEZJTFRFUiBwLmlkID09IDI1IFJFVFVSTiBwIiwKICBvcHRpb25zOiB7CiAgICBhbGxQbGFuczogdHJ1ZQogIH0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInF1ZXJ5XCI6IFwiRk9SIHAgSU4gcHJvZHVjdHMgRklMVEVSIHAuaWQgPT0gMjUgUkVUVVJOIHBcIixcbiAgXCJvcHRpb25zXCI6IHtcbiAgICBcImFsbFBsYW5zXCI6IHRydWVcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxOTMwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicGxhbnNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXSwgXG4gICAgICAgICAgXCJpZFwiIDogMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJJbmRleE5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgICAxIFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDYsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAwLCBcbiAgICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcInByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICAgIFwiZmlsdGVyUHJvamVjdGlvbnNcIiA6IFsgXSwgXG4gICAgICAgICAgXCJjb3VudFwiIDogZmFsc2UsIFxuICAgICAgICAgIFwicHJvZHVjZXNSZXN1bHRcIiA6IHRydWUsIFxuICAgICAgICAgIFwicmVhZE93bldyaXRlc1wiIDogZmFsc2UsIFxuICAgICAgICAgIFwidXNlQ2FjaGVcIiA6IHRydWUsIFxuICAgICAgICAgIFwibWF4UHJvamVjdGlvbnNcIiA6IDUsIFxuICAgICAgICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICAgICAgICBcImNvbGxlY3Rpb25cIiA6IFwicHJvZHVjdHNcIiwgXG4gICAgICAgICAgXCJzYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImlzU2F0ZWxsaXRlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJpc1NhdGVsbGl0ZU9mXCIgOiBudWxsLCBcbiAgICAgICAgICBcIm5lZWRzR2F0aGVyTm9kZVNvcnRcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImluZGV4Q292ZXJzUHJvamVjdGlvbnNcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImluZGV4ZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcImlkXCIgOiBcIjcyMzA5XCIsIFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MjAwNzcxNDY5MzEyXCIsIFxuICAgICAgICAgICAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgICAgICAgICAgICBcImlkXCIgXG4gICAgICAgICAgICAgIF0sIFxuICAgICAgICAgICAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgICAgICAgICAgICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICAgICAgICAgICAgICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICAgICAgICAgICAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiY29uZGl0aW9uXCIgOiB7IFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcIm4tYXJ5IG9yXCIsIFxuICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDYzLCBcbiAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcIm4tYXJ5IGFuZFwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNjIsIFxuICAgICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwiY29tcGFyZSA9PVwiLCBcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDI1LCBcbiAgICAgICAgICAgICAgICAgICAgXCJleGNsdWRlc051bGxcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImF0dHJpYnV0ZSBhY2Nlc3NcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlkXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0NSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcInBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICAgIF0gXG4gICAgICAgICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0MCwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCIgOiAyNSwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInZUeXBlSURcIiA6IDIgXG4gICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIF0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJhbGxDb3ZlcmVkQnlPbmVJbmRleFwiIDogZmFsc2UsIFxuICAgICAgICAgIFwic29ydGVkXCIgOiB0cnVlLCBcbiAgICAgICAgICBcImFzY2VuZGluZ1wiIDogdHJ1ZSwgXG4gICAgICAgICAgXCJyZXZlcnNlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJldmFsRkNhbGxzXCIgOiB0cnVlLCBcbiAgICAgICAgICBcIndhaXRGb3JTeW5jXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJsaW1pdFwiIDogMCwgXG4gICAgICAgICAgXCJsb29rYWhlYWRcIiA6IDEgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgICAgNiBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcImlkXCIgOiA1LCBcbiAgICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMCwgXG4gICAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgICB9IFxuICAgICAgXSwgXG4gICAgICBcInJ1bGVzXCIgOiBbIFxuICAgICAgICBcInVzZS1pbmRleGVzXCIsIFxuICAgICAgICBcInJlbW92ZS1maWx0ZXItY292ZXJlZC1ieS1pbmRleFwiLCBcbiAgICAgICAgXCJyZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zLTJcIiBcbiAgICAgIF0sIFxuICAgICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgICAgeyBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwicHJvZHVjdHNcIiwgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcInJlYWRcIiBcbiAgICAgICAgfSBcbiAgICAgIF0sIFxuICAgICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInBcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiB0cnVlIFxuICAgICAgICB9IFxuICAgICAgXSwgXG4gICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEsIFxuICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAwLCBcbiAgICAgIFwiaXNNb2RpZmljYXRpb25RdWVyeVwiIDogZmFsc2UgXG4gICAgfSBcbiAgXSwgXG4gIFwid2FybmluZ3NcIiA6IFsgXSwgXG4gIFwic3RhdHNcIiA6IHsgXG4gICAgXCJydWxlc0V4ZWN1dGVkXCIgOiA0NCwgXG4gICAgXCJydWxlc1NraXBwZWRcIiA6IDAsIFxuICAgIFwicGxhbnNDcmVhdGVkXCIgOiAxLCBcbiAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDEzOTUzNjk5OTk5NTQ3MDk4IFxuICB9LCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXR1cm5pbmcgYWxsIHBsYW5zIiwibmFtZSI6IlJlc3RFeHBsYWluQWxsUGxhbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestExplainEmpty_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFRoZSBkYXRhIHJldHVybmVkIGluIHRoZSAqKnBsYW4qKiBhdHRyaWJ1dGUgb2YgdGhlIHJlc3VsdCBjb250YWlucyBvbmUgZWxlbWVudCBwZXIgQVFMIHRvcC1sZXZlbCBzdGF0ZW1lbnQKICAoaS5lLiBgRk9SYCwgYFJFVFVSTmAsIGBGSUxURVJgIGV0Yy4pLiBJZiB0aGUgcXVlcnkgb3B0aW1pemVyIHJlbW92ZWQgc29tZSB1bm5lY2Vzc2FyeSBzdGF0ZW1lbnRzLAogIHRoZSByZXN1bHQgbWlnaHQgYWxzbyBjb250YWluIGxlc3MgZWxlbWVudHMgdGhhbiB0aGVyZSB3ZXJlIHRvcC1sZXZlbCBzdGF0ZW1lbnRzIGluIHRoZSBBUUwgcXVlcnkuCgogIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHF1ZXJ5IHdpdGggYSBub24tc2Vuc2libGUgZmlsdGVyIGNvbmRpdGlvbiB0aGF0CiAgdGhlIG9wdGltaXplciBoYXMgcmVtb3ZlZCBzbyB0aGF0IHRoZXJlIGFyZSBsZXNzIHRvcC1sZXZlbCBzdGF0ZW1lbnRzLgpuYW1lOiBSZXN0RXhwbGFpbkVtcHR5Ci0tLQp2YXIgdXJsID0gIi9fYXBpL2V4cGxhaW4iOwp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24sIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7CmJvZHkgPSAneyAicXVlcnkiIDogIkZPUiBpIElOIFsgMSwgMiwgMyBdIEZJTFRFUiAxID09IDIgUkVUVVJOIGkiIH0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xueyBcInF1ZXJ5XCIgOiBcIkZPUiBpIElOIFsgMSwgMiwgMyBdIEZJTFRFUiAxID09IDIgUkVUVVJOIGlcIiB9XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEyOTRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJwbGFuXCIgOiB7IFxuICAgIFwibm9kZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiU2luZ2xldG9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXSwgXG4gICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDEsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDEgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJhcnJheVwiLCBcbiAgICAgICAgICBcInR5cGVJRFwiIDogNDEsIFxuICAgICAgICAgIFwicmF3XCIgOiBbIFxuICAgICAgICAgICAgMSwgXG4gICAgICAgICAgICAyLCBcbiAgICAgICAgICAgIDMgXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJqc29uXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJFbnVtZXJhdGVMaXN0Tm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgMiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDMsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDUsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDMsIFxuICAgICAgICBcImluVmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIk5vUmVzdWx0c05vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDMgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAwLjUsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDAgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA0IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMC41LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAwLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInJ1bGVzXCIgOiBbIF0sIFxuICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UsIFxuICAgICAgICBcImNvbnN0YW50VmFsdWVcIiA6IFsgXG4gICAgICAgICAgMSwgXG4gICAgICAgICAgMiwgXG4gICAgICAgICAgMyBcbiAgICAgICAgXSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcImVzdGltYXRlZENvc3RcIiA6IDAuNSwgXG4gICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAwLCBcbiAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJjYWNoZWFibGVcIiA6IHRydWUsIFxuICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwicnVsZXNFeGVjdXRlZFwiIDogNDQsIFxuICAgIFwicnVsZXNTa2lwcGVkXCIgOiAwLCBcbiAgICBcInBsYW5zQ3JlYXRlZFwiIDogMSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxMDA2MDcwMDAwMzU3Nzk0OSBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVGhlIGRhdGEgcmV0dXJuZWQgaW4gdGhlICoqcGxhbioqIGF0dHJpYnV0ZSBvZiB0aGUgcmVzdWx0IGNvbnRhaW5zIG9uZSBlbGVtZW50IHBlciBBUUwgdG9wLWxldmVsIHN0YXRlbWVudFxuKGkuZS4gYEZPUmAsIGBSRVRVUk5gLCBgRklMVEVSYCBldGMuKS4gSWYgdGhlIHF1ZXJ5IG9wdGltaXplciByZW1vdmVkIHNvbWUgdW5uZWNlc3Nhcnkgc3RhdGVtZW50cyxcbnRoZSByZXN1bHQgbWlnaHQgYWxzbyBjb250YWluIGxlc3MgZWxlbWVudHMgdGhhbiB0aGVyZSB3ZXJlIHRvcC1sZXZlbCBzdGF0ZW1lbnRzIGluIHRoZSBBUUwgcXVlcnkuXG5cblRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHF1ZXJ5IHdpdGggYSBub24tc2Vuc2libGUgZmlsdGVyIGNvbmRpdGlvbiB0aGF0XG50aGUgb3B0aW1pemVyIGhhcyByZW1vdmVkIHNvIHRoYXQgdGhlcmUgYXJlIGxlc3MgdG9wLWxldmVsIHN0YXRlbWVudHMuIiwibmFtZSI6IlJlc3RFeHBsYWluRW1wdHkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestExplainInvalid_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEludmFsaWQgcXVlcnkgKG1pc3NpbmcgYmluZCBwYXJhbWV0ZXIpCm5hbWU6IFJlc3RFeHBsYWluSW52YWxpZAotLS0KdmFyIHVybCA9ICIvX2FwaS9leHBsYWluIjsKdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKYm9keSA9IHsKICBxdWVyeSA6ICJGT1IgcCBJTiBwcm9kdWN0cyBGSUxURVIgcC5pZCA9PSBAaWQgTElNSVQgMiBSRVRVUk4gcC5uIgp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInF1ZXJ5XCI6IFwiRk9SIHAgSU4gcHJvZHVjdHMgRklMVEVSIHAuaWQgPT0gQGlkIExJTUlUIDIgUkVUVVJOIHAublwiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDAgQmFkIFJlcXVlc3RcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEyNlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJubyB2YWx1ZSBzcGVjaWZpZWQgZm9yIGRlY2xhcmVkIGJpbmQgcGFyYW1ldGVyICdpZCcgKHdoaWxlIHBhcnNpbmcpXCIsIFxuICBcImVycm9yTnVtXCIgOiAxNTUxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkludmFsaWQgcXVlcnkgKG1pc3NpbmcgYmluZCBwYXJhbWV0ZXIpIiwibmFtZSI6IlJlc3RFeHBsYWluSW52YWxpZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestExplainOptimizerRules_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEEgcGxhbiB3aXRoIHNvbWUgb3B0aW1pemVyIHJ1bGVzIGFwcGxpZWQKbmFtZTogUmVzdEV4cGxhaW5PcHRpbWl6ZXJSdWxlcwotLS0KdmFyIHVybCA9ICIvX2FwaS9leHBsYWluIjsKdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKZGIucHJvZHVjdHMuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyJpZCJdIH0pOwpmb3IgKHZhciBpID0gMDsgaSA8IDEwOyArK2kpIHsgZGIucHJvZHVjdHMuc2F2ZSh7IGlkOiBpIH0pOyB9CmJvZHkgPSB7CiAgcXVlcnkgOiAiRk9SIHAgSU4gcHJvZHVjdHMgTEVUIGEgPSBwLmlkIEZJTFRFUiBhID09IDQgTEVUIG5hbWUgPSBwLm5hbWUgU09SVCBwLmlkIExJTUlUIDEgUkVUVVJOIG5hbWUiLAp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInF1ZXJ5XCI6IFwiRk9SIHAgSU4gcHJvZHVjdHMgTEVUIGEgPSBwLmlkIEZJTFRFUiBhID09IDQgTEVUIG5hbWUgPSBwLm5hbWUgU09SVCBwLmlkIExJTUlUIDEgUkVUVVJOIG5hbWVcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyODc3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicGxhblwiIDogeyBcbiAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiSW5kZXhOb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAxIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogMTEsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDQuMzcxOTI4MDk0ODg3MzYyNCwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInBcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwicHJvamVjdGlvbnNcIiA6IFsgXG4gICAgICAgICAgXCJuYW1lXCIgXG4gICAgICAgIF0sIFxuICAgICAgICBcImZpbHRlclByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICBcImNvdW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwicHJvZHVjZXNSZXN1bHRcIiA6IHRydWUsIFxuICAgICAgICBcInJlYWRPd25Xcml0ZXNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJ1c2VDYWNoZVwiIDogdHJ1ZSwgXG4gICAgICAgIFwibWF4UHJvamVjdGlvbnNcIiA6IDUsIFxuICAgICAgICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJwcm9kdWN0c1wiLCBcbiAgICAgICAgXCJzYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICBcImlzU2F0ZWxsaXRlT2ZcIiA6IG51bGwsIFxuICAgICAgICBcIm5lZWRzR2F0aGVyTm9kZVNvcnRcIiA6IHRydWUsIFxuICAgICAgICBcImluZGV4Q292ZXJzUHJvamVjdGlvbnNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpbmRleGVzXCIgOiBbIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcImlkXCIgOiBcIjcyMjQ1XCIsIFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyMDA3MjQyODMzOTNcIiwgXG4gICAgICAgICAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgICAgICAgICAgXCJpZFwiIFxuICAgICAgICAgICAgXSwgXG4gICAgICAgICAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgICAgICAgICAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICAgICAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgICAgICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSBcbiAgICAgICAgICB9IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJjb25kaXRpb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIm4tYXJ5IG9yXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiA2MywgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJuLWFyeSBhbmRcIiwgXG4gICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA2MiwgXG4gICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJjb21wYXJlID09XCIsIFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDI1LCBcbiAgICAgICAgICAgICAgICAgIFwiZXhjbHVkZXNOdWxsXCIgOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiAzNSwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlkXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZUlEXCIgOiA0MCwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiIDogNCwgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ2VHlwZUlEXCIgOiAyIFxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJhbGxDb3ZlcmVkQnlPbmVJbmRleFwiIDogZmFsc2UsIFxuICAgICAgICBcInNvcnRlZFwiIDogdHJ1ZSwgXG4gICAgICAgIFwiYXNjZW5kaW5nXCIgOiB0cnVlLCBcbiAgICAgICAgXCJyZXZlcnNlXCIgOiBmYWxzZSwgXG4gICAgICAgIFwiZXZhbEZDYWxsc1wiIDogdHJ1ZSwgXG4gICAgICAgIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJsaW1pdFwiIDogMCwgXG4gICAgICAgIFwibG9va2FoZWFkXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiTGltaXROb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAxMSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDksIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDUuMzcxOTI4MDk0ODg3MzYyNCwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgIFwib2Zmc2V0XCIgOiAwLCBcbiAgICAgICAgXCJsaW1pdFwiIDogMSwgXG4gICAgICAgIFwiZnVsbENvdW50XCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgOSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDYsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDYuMzcxOTI4MDk0ODg3MzYyNCwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiYXR0cmlidXRlIGFjY2Vzc1wiLCBcbiAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJuYW1lXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgICAgICAgXCJpZFwiIDogMCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIm5hbWVcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJhdHRyaWJ1dGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlJldHVybk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDYgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAxMCwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNy4zNzE5MjgwOTQ4ODczNjI0LCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJuYW1lXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInJ1bGVzXCIgOiBbIFxuICAgICAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cFwiLCBcbiAgICAgIFwicmVtb3ZlLXJlZHVuZGFudC1jYWxjdWxhdGlvbnNcIiwgXG4gICAgICBcInJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnNcIiwgXG4gICAgICBcIm1vdmUtY2FsY3VsYXRpb25zLXVwLTJcIiwgXG4gICAgICBcInVzZS1pbmRleGVzXCIsIFxuICAgICAgXCJyZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcIiwgXG4gICAgICBcInVzZS1pbmRleC1mb3Itc29ydFwiLCBcbiAgICAgIFwicmVtb3ZlLXVubmVjZXNzYXJ5LWNhbGN1bGF0aW9ucy0yXCIsIFxuICAgICAgXCJtb3ZlLWNhbGN1bGF0aW9ucy1kb3duXCIsIFxuICAgICAgXCJyZWR1Y2UtZXh0cmFjdGlvbi10by1wcm9qZWN0aW9uXCIgXG4gICAgXSwgXG4gICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwibmFtZVwiIDogXCJwcm9kdWN0c1wiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcInJlYWRcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiA2LCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjVcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJuYW1lXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcImFcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA3LjM3MTkyODA5NDg4NzM2MjQsIFxuICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgXCJpc01vZGlmaWNhdGlvblF1ZXJ5XCIgOiBmYWxzZSBcbiAgfSwgXG4gIFwiY2FjaGVhYmxlXCIgOiB0cnVlLCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQ2LCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogMCwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMTg4ODA5OTk5OTk3Mzc0NyBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQSBwbGFuIHdpdGggc29tZSBvcHRpbWl6ZXIgcnVsZXMgYXBwbGllZCIsIm5hbWUiOiJSZXN0RXhwbGFpbk9wdGltaXplclJ1bGVzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestExplainOptions_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIHNvbWUgb3B0aW9ucwpuYW1lOiBSZXN0RXhwbGFpbk9wdGlvbnMKLS0tCnZhciB1cmwgPSAiL19hcGkvZXhwbGFpbiI7CnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CmRiLnByb2R1Y3RzLmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsiaWQiXSB9KTsKZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgKytpKSB7IGRiLnByb2R1Y3RzLnNhdmUoeyBpZDogaSB9KTsgfQpib2R5ID0gewogIHF1ZXJ5IDogIkZPUiBwIElOIHByb2R1Y3RzIExFVCBhID0gcC5pZCBGSUxURVIgYSA9PSA0IExFVCBuYW1lID0gcC5uYW1lIFNPUlQgcC5pZCBMSU1JVCAxIFJFVFVSTiBuYW1lIiwKICBvcHRpb25zIDogewogICAgbWF4TnVtYmVyT2ZQbGFucyA6IDIsCiAgICBhbGxQbGFucyA6IHRydWUsCiAgICBvcHRpbWl6ZXIgOiB7CiAgICAgIHJ1bGVzOiBbICItYWxsIiwgIit1c2UtaW5kZXgtZm9yLXNvcnQiLCAiK3VzZS1pbmRleC1yYW5nZSIgXQogICAgfQogIH0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInF1ZXJ5XCI6IFwiRk9SIHAgSU4gcHJvZHVjdHMgTEVUIGEgPSBwLmlkIEZJTFRFUiBhID09IDQgTEVUIG5hbWUgPSBwLm5hbWUgU09SVCBwLmlkIExJTUlUIDEgUkVUVVJOIG5hbWVcIixcbiAgXCJvcHRpb25zXCI6IHtcbiAgICBcIm1heE51bWJlck9mUGxhbnNcIjogMixcbiAgICBcImFsbFBsYW5zXCI6IHRydWUsXG4gICAgXCJvcHRpbWl6ZXJcIjoge1xuICAgICAgXCJydWxlc1wiOiBbXG4gICAgICAgIFwiLWFsbFwiLFxuICAgICAgICBcIit1c2UtaW5kZXgtZm9yLXNvcnRcIixcbiAgICAgICAgXCIrdXNlLWluZGV4LXJhbmdlXCJcbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzQzMFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInBsYW5zXCIgOiBbIFxuICAgIHsgXG4gICAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJTaW5nbGV0b25Ob2RlXCIsIFxuICAgICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDEsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiSW5kZXhOb2RlXCIsIFxuICAgICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgICAgMSBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcImlkXCIgOiAxMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMCwgXG4gICAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgICAgXCJuYW1lXCIgOiBcInBcIiwgXG4gICAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJwcm9qZWN0aW9uc1wiIDogWyBdLCBcbiAgICAgICAgICBcImZpbHRlclByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICAgIFwiY291bnRcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcInByb2R1Y2VzUmVzdWx0XCIgOiB0cnVlLCBcbiAgICAgICAgICBcInJlYWRPd25Xcml0ZXNcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcInVzZUNhY2hlXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJtYXhQcm9qZWN0aW9uc1wiIDogNSwgXG4gICAgICAgICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJwcm9kdWN0c1wiLCBcbiAgICAgICAgICBcInNhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICAgIFwiaXNTYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImlzU2F0ZWxsaXRlT2ZcIiA6IG51bGwsIFxuICAgICAgICAgIFwibmVlZHNHYXRoZXJOb2RlU29ydFwiIDogdHJ1ZSwgXG4gICAgICAgICAgXCJpbmRleENvdmVyc1Byb2plY3Rpb25zXCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJpbmRleGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJpZFwiIDogXCI3MjI3N1wiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjIwMDc0OTQ0OTIxNlwiLCBcbiAgICAgICAgICAgICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICAgICAgICAgICAgXCJpZFwiIFxuICAgICAgICAgICAgICBdLCBcbiAgICAgICAgICAgICAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgICAgICAgICAgICAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgICAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBcImNvbmRpdGlvblwiIDogeyBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImFsbENvdmVyZWRCeU9uZUluZGV4XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJzb3J0ZWRcIiA6IHRydWUsIFxuICAgICAgICAgIFwiYXNjZW5kaW5nXCIgOiB0cnVlLCBcbiAgICAgICAgICBcInJldmVyc2VcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImV2YWxGQ2FsbHNcIiA6IHRydWUsIFxuICAgICAgICAgIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImxpbWl0XCIgOiAwLCBcbiAgICAgICAgICBcImxvb2thaGVhZFwiIDogMSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDExIFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDMsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMjEsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAsIFxuICAgICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDM1LCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCJpZFwiLCBcbiAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJwXCIsIFxuICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBdIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCJhXCIsIFxuICAgICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJhdHRyaWJ1dGVcIiBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDMgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAzMSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMCwgXG4gICAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImNvbXBhcmUgPT1cIiwgXG4gICAgICAgICAgICBcInR5cGVJRFwiIDogMjUsIFxuICAgICAgICAgICAgXCJleGNsdWRlc051bGxcIiA6IGZhbHNlLCBcbiAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJhXCIsIFxuICAgICAgICAgICAgICAgIFwiaWRcIiA6IDEgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDAsIFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IDQsIFxuICAgICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogMiBcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIF0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgICBcImV4cHJlc3Npb25UeXBlXCIgOiBcInNpbXBsZVwiIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiRmlsdGVyTm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDQgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA0MSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMCwgXG4gICAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgICAgfSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDUgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA1MSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMCwgXG4gICAgICAgICAgXCJleHByZXNzaW9uXCIgOiB7IFxuICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImF0dHJpYnV0ZSBhY2Nlc3NcIiwgXG4gICAgICAgICAgICBcInR5cGVJRFwiIDogMzUsIFxuICAgICAgICAgICAgXCJuYW1lXCIgOiBcIm5hbWVcIiwgXG4gICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQ1LCBcbiAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgXSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwibmFtZVwiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJjYW5UaHJvd1wiIDogZmFsc2UsIFxuICAgICAgICAgIFwiZXhwcmVzc2lvblR5cGVcIiA6IFwiYXR0cmlidXRlXCIgXG4gICAgICAgIH0sIFxuICAgICAgICB7IFxuICAgICAgICAgIFwidHlwZVwiIDogXCJDYWxjdWxhdGlvbk5vZGVcIiwgXG4gICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgICA2IFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFwiaWRcIiA6IDcsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNjEsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAsIFxuICAgICAgICAgIFwiZXhwcmVzc2lvblwiIDogeyBcbiAgICAgICAgICAgIFwidHlwZVwiIDogXCJhdHRyaWJ1dGUgYWNjZXNzXCIsIFxuICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDM1LCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCJpZFwiLCBcbiAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInJlZmVyZW5jZVwiLCBcbiAgICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDUsIFxuICAgICAgICAgICAgICAgIFwibmFtZVwiIDogXCJwXCIsIFxuICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBdIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgICBcImlkXCIgOiA2LCBcbiAgICAgICAgICAgIFwibmFtZVwiIDogXCI1XCIsIFxuICAgICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImNhblRocm93XCIgOiBmYWxzZSwgXG4gICAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJhdHRyaWJ1dGVcIiBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcIkxpbWl0Tm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDcgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJpZFwiIDogOSwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiA2MiwgXG4gICAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxLCBcbiAgICAgICAgICBcIm9mZnNldFwiIDogMCwgXG4gICAgICAgICAgXCJsaW1pdFwiIDogMSwgXG4gICAgICAgICAgXCJmdWxsQ291bnRcIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiUmV0dXJuTm9kZVwiLCBcbiAgICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAgIDkgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgXCJpZFwiIDogMTAsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogNjMsIFxuICAgICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgICBcIm5hbWVcIiA6IFwibmFtZVwiLCBcbiAgICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJjb3VudFwiIDogdHJ1ZSBcbiAgICAgICAgfSBcbiAgICAgIF0sIFxuICAgICAgXCJydWxlc1wiIDogWyBcbiAgICAgICAgXCJ1c2UtaW5kZXgtZm9yLXNvcnRcIiBcbiAgICAgIF0sIFxuICAgICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgICAgeyBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwicHJvZHVjdHNcIiwgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcInJlYWRcIiBcbiAgICAgICAgfSBcbiAgICAgIF0sIFxuICAgICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogNiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjVcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogNCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIm5hbWVcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMSwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcImFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcInBcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiB0cnVlIFxuICAgICAgICB9IFxuICAgICAgXSwgXG4gICAgICBcImVzdGltYXRlZENvc3RcIiA6IDYzLCBcbiAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSwgXG4gICAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIF0sIFxuICBcIndhcm5pbmdzXCIgOiBbIF0sIFxuICBcInN0YXRzXCIgOiB7IFxuICAgIFwicnVsZXNFeGVjdXRlZFwiIDogNCwgXG4gICAgXCJydWxlc1NraXBwZWRcIiA6IDQwLCBcbiAgICBcInBsYW5zQ3JlYXRlZFwiIDogMSwgXG4gICAgXCJwZWFrTWVtb3J5VXNhZ2VcIiA6IDAsIFxuICAgIFwiZXhlY3V0aW9uVGltZVwiIDogMC4wMDAxNDIzMzg5OTk5Nzg2MTk1NCBcbiAgfSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgc29tZSBvcHRpb25zIiwibmFtZSI6IlJlc3RFeHBsYWluT3B0aW9ucyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestExplainValid_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFZhbGlkIHF1ZXJ5Cm5hbWU6IFJlc3RFeHBsYWluVmFsaWQKLS0tCnZhciB1cmwgPSAiL19hcGkvZXhwbGFpbiI7CnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CmZvciAodmFyIGkgPSAwOyBpIDwgMTA7ICsraSkgeyBkYi5wcm9kdWN0cy5zYXZlKHsgaWQ6IGkgfSk7IH0KYm9keSA9IHsKICBxdWVyeSA6ICJGT1IgcCBJTiBwcm9kdWN0cyBSRVRVUk4gcCIKfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInF1ZXJ5XCI6IFwiRk9SIHAgSU4gcHJvZHVjdHMgUkVUVVJOIHBcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMTM3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicGxhblwiIDogeyBcbiAgICBcIm5vZGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIlNpbmdsZXRvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIF0sIFxuICAgICAgICBcImlkXCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxLCBcbiAgICAgICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcInR5cGVcIiA6IFwiRW51bWVyYXRlQ29sbGVjdGlvbk5vZGVcIiwgXG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgOiBbIFxuICAgICAgICAgIDEgXG4gICAgICAgIF0sIFxuICAgICAgICBcImlkXCIgOiAyLCBcbiAgICAgICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAxMiwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMTAsIFxuICAgICAgICBcInJhbmRvbVwiIDogZmFsc2UsIFxuICAgICAgICBcImluZGV4SGludFwiIDogeyBcbiAgICAgICAgICBcImZvcmNlZFwiIDogZmFsc2UsIFxuICAgICAgICAgIFwibG9va2FoZWFkXCIgOiAxLCBcbiAgICAgICAgICBcInR5cGVcIiA6IFwibm9uZVwiIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiAwLCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwicFwiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IHRydWUgXG4gICAgICAgIH0sIFxuICAgICAgICBcInByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICBcImZpbHRlclByb2plY3Rpb25zXCIgOiBbIF0sIFxuICAgICAgICBcImNvdW50XCIgOiBmYWxzZSwgXG4gICAgICAgIFwicHJvZHVjZXNSZXN1bHRcIiA6IHRydWUsIFxuICAgICAgICBcInJlYWRPd25Xcml0ZXNcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJ1c2VDYWNoZVwiIDogdHJ1ZSwgXG4gICAgICAgIFwibWF4UHJvamVjdGlvbnNcIiA6IDUsIFxuICAgICAgICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJwcm9kdWN0c1wiLCBcbiAgICAgICAgXCJzYXRlbGxpdGVcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJpc1NhdGVsbGl0ZVwiIDogZmFsc2UsIFxuICAgICAgICBcImlzU2F0ZWxsaXRlT2ZcIiA6IG51bGwgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAyIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogMywgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMjIsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJwXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY291bnRcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwicnVsZXNcIiA6IFsgXSwgXG4gICAgXCJjb2xsZWN0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwibmFtZVwiIDogXCJwcm9kdWN0c1wiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcInJlYWRcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiAwLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcInBcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogdHJ1ZSBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJlc3RpbWF0ZWRDb3N0XCIgOiAyMiwgXG4gICAgXCJlc3RpbWF0ZWROckl0ZW1zXCIgOiAxMCwgXG4gICAgXCJpc01vZGlmaWNhdGlvblF1ZXJ5XCIgOiBmYWxzZSBcbiAgfSwgXG4gIFwiY2FjaGVhYmxlXCIgOiB0cnVlLCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBdLCBcbiAgXCJzdGF0c1wiIDogeyBcbiAgICBcInJ1bGVzRXhlY3V0ZWRcIiA6IDQ0LCBcbiAgICBcInJ1bGVzU2tpcHBlZFwiIDogMCwgXG4gICAgXCJwbGFuc0NyZWF0ZWRcIiA6IDEsIFxuICAgIFwicGVha01lbW9yeVVzYWdlXCIgOiAwLCBcbiAgICBcImV4ZWN1dGlvblRpbWVcIiA6IDAuMDAwMDk2ODU3MDAwMDE2ODI1NjIgXG4gIH0sIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlZhbGlkIHF1ZXJ5IiwibmFtZSI6IlJlc3RFeHBsYWluVmFsaWQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestExplainWarning_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEEgcXVlcnkgdGhhdCBwcm9kdWNlcyBhIHdhcm5pbmcKbmFtZTogUmVzdEV4cGxhaW5XYXJuaW5nCi0tLQp2YXIgdXJsID0gIi9fYXBpL2V4cGxhaW4iOwpib2R5ID0gewogIHF1ZXJ5IDogIkZPUiBpIElOIDEuLjEwIFJFVFVSTiAxIC8gMCIKfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9leHBsYWluJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInF1ZXJ5XCI6IFwiRk9SIGkgSU4gMS4uMTAgUkVUVVJOIDEgLyAwXCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTcyM1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInBsYW5cIiA6IHsgXG4gICAgXCJub2Rlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJTaW5nbGV0b25Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBdLCBcbiAgICAgICAgXCJpZFwiIDogMSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMSwgXG4gICAgICAgIFwiZXN0aW1hdGVkTnJJdGVtc1wiIDogMSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgMSBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDIsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEsIFxuICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcInJhbmdlXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiA0OSwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgXCJ0eXBlSURcIiA6IDQwLCBcbiAgICAgICAgICAgICAgXCJ2YWx1ZVwiIDogMSwgXG4gICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogMiBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICBcInR5cGVJRFwiIDogNDAsIFxuICAgICAgICAgICAgICBcInZhbHVlXCIgOiAxMCwgXG4gICAgICAgICAgICAgIFwidlR5cGVJRFwiIDogMiBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwib3V0VmFyaWFibGVcIiA6IHsgXG4gICAgICAgICAgXCJpZFwiIDogMiwgXG4gICAgICAgICAgXCJuYW1lXCIgOiBcIjFcIiwgXG4gICAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY2FuVGhyb3dcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJleHByZXNzaW9uVHlwZVwiIDogXCJzaW1wbGVcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkNhbGN1bGF0aW9uTm9kZVwiLCBcbiAgICAgICAgXCJkZXBlbmRlbmNpZXNcIiA6IFsgXG4gICAgICAgICAgMiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICBcImVzdGltYXRlZENvc3RcIiA6IDMsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEsIFxuICAgICAgICBcImV4cHJlc3Npb25cIiA6IHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgIFwidHlwZUlEXCIgOiA0MCwgXG4gICAgICAgICAgXCJ2YWx1ZVwiIDogbnVsbCwgXG4gICAgICAgICAgXCJ2VHlwZUlEXCIgOiAwIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJvdXRWYXJpYWJsZVwiIDogeyBcbiAgICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgICBcIm5hbWVcIiA6IFwiM1wiLCBcbiAgICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjYW5UaHJvd1wiIDogZmFsc2UsIFxuICAgICAgICBcImV4cHJlc3Npb25UeXBlXCIgOiBcImpzb25cIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIkVudW1lcmF0ZUxpc3ROb2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICA0IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogMywgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMTMsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIxXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcIm91dFZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwidHlwZVwiIDogXCJSZXR1cm5Ob2RlXCIsIFxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIDogWyBcbiAgICAgICAgICAzIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJpZFwiIDogNSwgXG4gICAgICAgIFwiZXN0aW1hdGVkQ29zdFwiIDogMjMsIFxuICAgICAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwLCBcbiAgICAgICAgXCJpblZhcmlhYmxlXCIgOiB7IFxuICAgICAgICAgIFwiaWRcIiA6IDQsIFxuICAgICAgICAgIFwibmFtZVwiIDogXCIzXCIsIFxuICAgICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvdW50XCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInJ1bGVzXCIgOiBbIFxuICAgICAgXCJtb3ZlLWNhbGN1bGF0aW9ucy11cFwiLCBcbiAgICAgIFwibW92ZS1jYWxjdWxhdGlvbnMtdXAtMlwiIFxuICAgIF0sIFxuICAgIFwiY29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgXCJ2YXJpYWJsZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcImlkXCIgOiA0LCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIjNcIiwgXG4gICAgICAgIFwiaXNGdWxsRG9jdW1lbnRGcm9tQ29sbGVjdGlvblwiIDogZmFsc2UsIFxuICAgICAgICBcImNvbnN0YW50VmFsdWVcIiA6IG51bGwgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiaWRcIiA6IDIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiMVwiLCBcbiAgICAgICAgXCJpc0Z1bGxEb2N1bWVudEZyb21Db2xsZWN0aW9uXCIgOiBmYWxzZSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJpZFwiIDogMCwgXG4gICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICBcImlzRnVsbERvY3VtZW50RnJvbUNvbGxlY3Rpb25cIiA6IGZhbHNlIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcImVzdGltYXRlZENvc3RcIiA6IDIzLCBcbiAgICBcImVzdGltYXRlZE5ySXRlbXNcIiA6IDEwLCBcbiAgICBcImlzTW9kaWZpY2F0aW9uUXVlcnlcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJjYWNoZWFibGVcIiA6IGZhbHNlLCBcbiAgXCJ3YXJuaW5nc1wiIDogWyBcbiAgICB7IFxuICAgICAgXCJjb2RlXCIgOiAxNTYyLCBcbiAgICAgIFwibWVzc2FnZVwiIDogXCJkaXZpc2lvbiBieSB6ZXJvXCIgXG4gICAgfSBcbiAgXSwgXG4gIFwic3RhdHNcIiA6IHsgXG4gICAgXCJydWxlc0V4ZWN1dGVkXCIgOiA0NCwgXG4gICAgXCJydWxlc1NraXBwZWRcIiA6IDAsIFxuICAgIFwicGxhbnNDcmVhdGVkXCIgOiAxLCBcbiAgICBcInBlYWtNZW1vcnlVc2FnZVwiIDogMCwgXG4gICAgXCJleGVjdXRpb25UaW1lXCIgOiAwLjAwMDEwNjQ3NDAwMDAwNjA3Mzc3IFxuICB9LCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJBIHF1ZXJ5IHRoYXQgcHJvZHVjZXMgYSB3YXJuaW5nIiwibmFtZSI6IlJlc3RFeHBsYWluV2FybmluZyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestFetchAllUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RmV0Y2hBbGxVc2VyCi0tLQp2YXIgdXJsID0gIi9fYXBpL3VzZXIiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXInIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNjRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiBbIFxuICAgIHsgXG4gICAgICBcInVzZXJcIiA6IFwidGVzdGVyXCIsIFxuICAgICAgXCJhY3RpdmVcIiA6IGZhbHNlLCBcbiAgICAgIFwiZXh0cmFcIiA6IHsgXG4gICAgICB9IFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcInVzZXJcIiA6IFwiYWRtaW5cIiwgXG4gICAgICBcImFjdGl2ZVwiIDogdHJ1ZSwgXG4gICAgICBcImV4dHJhXCIgOiB7IFxuICAgICAgfSBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJ1c2VyXCIgOiBcInJvb3RcIiwgXG4gICAgICBcImFjdGl2ZVwiIDogdHJ1ZSwgXG4gICAgICBcImV4dHJhXCIgOiB7IFxuICAgICAgfSBcbiAgICB9IFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0RmV0Y2hBbGxVc2VyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestFetchUserCollectionPermission_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RmV0Y2hVc2VyQ29sbGVjdGlvblBlcm1pc3Npb24KLS0tCnZhciB1c2VycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpOwp2YXIgdGhlVXNlcj0iYW5vdGhlckFkbWluQHNlY2FwcCI7CnVzZXJzLnNhdmUodGhlVXNlciwgInNlY3JldCIpOwp1c2Vycy5ncmFudERhdGFiYXNlKHRoZVVzZXIsICJfc3lzdGVtIiwgInJ3Iik7Cgp2YXIgdXJsID0gIi9fYXBpL3VzZXIvIiArIHRoZVVzZXIgKyAiL2RhdGFiYXNlL19zeXN0ZW0vX3VzZXJzIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CnVzZXJzLnJlbW92ZSh0aGVVc2VyKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYW5vdGhlckFkbWluQHNlY2FwcC9kYXRhYmFzZS9fc3lzdGVtL191c2VycyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInJlc3VsdFwiIDogXCJub25lXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RGZXRjaFVzZXJDb2xsZWN0aW9uUGVybWlzc2lvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestFetchUserDatabaseListFull_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFdpdGggdGhlIGZ1bGwgcmVzcG9uc2UgZm9ybWF0OgpuYW1lOiBSZXN0RmV0Y2hVc2VyRGF0YWJhc2VMaXN0RnVsbAotLS0KdmFyIHVzZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIik7CnZhciB0aGVVc2VyPSJhbm90aGVyQWRtaW5Ac2VjYXBwIjsKdXNlcnMuc2F2ZSh0aGVVc2VyLCAic2VjcmV0Iik7CnVzZXJzLmdyYW50RGF0YWJhc2UodGhlVXNlciwgIl9zeXN0ZW0iLCAicnciKTsKCnZhciB1cmwgPSAiL19hcGkvdXNlci8iICsgdGhlVXNlciArICIvZGF0YWJhc2U/ZnVsbD10cnVlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CnVzZXJzLnJlbW92ZSh0aGVVc2VyKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYW5vdGhlckFkbWluQHNlY2FwcC9kYXRhYmFzZT9mdWxsPXRydWUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1NjZcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiB7IFxuICAgIFwiX3N5c3RlbVwiIDogeyBcbiAgICAgIFwicGVybWlzc2lvblwiIDogXCJyd1wiLCBcbiAgICAgIFwiY29sbGVjdGlvbnNcIiA6IHsgXG4gICAgICAgIFwiX3N0YXRpc3RpY3NSYXdcIiA6IFwidW5kZWZpbmVkXCIsIFxuICAgICAgICBcIl9zdGF0aXN0aWNzXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfam9ic1wiIDogXCJ1bmRlZmluZWRcIiwgXG4gICAgICAgIFwiX2FxbGZ1bmN0aW9uc1wiIDogXCJ1bmRlZmluZWRcIiwgXG4gICAgICAgIFwiZGVtb1wiIDogXCJ1bmRlZmluZWRcIiwgXG4gICAgICAgIFwiX3VzZXJzXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfcHJlZ2VsX3F1ZXJpZXNcIiA6IFwidW5kZWZpbmVkXCIsIFxuICAgICAgICBcIl9hcHBidW5kbGVzXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfYW5hbHl6ZXJzXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfZ3JhcGhzXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfc3RhdGlzdGljczE1XCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfcXVldWVzXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJfYXBwc1wiIDogXCJ1bmRlZmluZWRcIiwgXG4gICAgICAgIFwiaWdub3JlXCIgOiBcInVuZGVmaW5lZFwiLCBcbiAgICAgICAgXCJteWNvbGxlY3Rpb25cIiA6IFwidW5kZWZpbmVkXCIsIFxuICAgICAgICBcInNjaGVtYUNvbGxlY3Rpb25cIiA6IFwidW5kZWZpbmVkXCIsIFxuICAgICAgICBcIl9mcm9udGVuZFwiIDogXCJ1bmRlZmluZWRcIiwgXG4gICAgICAgIFwiYW5pbWFsc1wiIDogXCJ1bmRlZmluZWRcIiwgXG4gICAgICAgIFwiKlwiIDogXCJ1bmRlZmluZWRcIiBcbiAgICAgIH0gXG4gICAgfSwgXG4gICAgXCIqXCIgOiB7IFxuICAgICAgXCJwZXJtaXNzaW9uXCIgOiBcIm5vbmVcIiBcbiAgICB9IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IldpdGggdGhlIGZ1bGwgcmVzcG9uc2UgZm9ybWF0OiIsIm5hbWUiOiJSZXN0RmV0Y2hVc2VyRGF0YWJhc2VMaXN0RnVsbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestFetchUserDatabaseList_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RmV0Y2hVc2VyRGF0YWJhc2VMaXN0Ci0tLQp2YXIgdXNlcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKTsKdmFyIHRoZVVzZXI9ImFub3RoZXJBZG1pbkBzZWNhcHAiOwp1c2Vycy5zYXZlKHRoZVVzZXIsICJzZWNyZXQiKTsKdXNlcnMuZ3JhbnREYXRhYmFzZSh0aGVVc2VyLCAiX3N5c3RlbSIsICJydyIpOwoKdmFyIHVybCA9ICIvX2FwaS91c2VyLyIgKyB0aGVVc2VyICsgIi9kYXRhYmFzZS8iOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKdXNlcnMucmVtb3ZlKHRoZVVzZXIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYW5vdGhlckFkbWluQHNlY2FwcC9kYXRhYmFzZS8nIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJyZXN1bHRcIiA6IHsgXG4gICAgXCJfc3lzdGVtXCIgOiBcInJ3XCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RGZXRjaFVzZXJEYXRhYmFzZUxpc3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestFetchUserDatabasePermission_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RmV0Y2hVc2VyRGF0YWJhc2VQZXJtaXNzaW9uCi0tLQp2YXIgdXNlcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKTsKdmFyIHRoZVVzZXI9ImFub3RoZXJBZG1pbkBzZWNhcHAiOwp1c2Vycy5zYXZlKHRoZVVzZXIsICJzZWNyZXQiKTsKdXNlcnMuZ3JhbnREYXRhYmFzZSh0aGVVc2VyLCAiX3N5c3RlbSIsICJydyIpOwoKdmFyIHVybCA9ICIvX2FwaS91c2VyLyIgKyB0aGVVc2VyICsgIi9kYXRhYmFzZS9fc3lzdGVtIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CnVzZXJzLnJlbW92ZSh0aGVVc2VyKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYW5vdGhlckFkbWluQHNlY2FwcC9kYXRhYmFzZS9fc3lzdGVtJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiBcInJ3XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RGZXRjaFVzZXJEYXRhYmFzZVBlcm1pc3Npb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestFetchUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0RmV0Y2hVc2VyCi0tLQp2YXIgdXNlcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKTsKdmFyIHRoZVVzZXIgPSAiYWRtaW5AbXlhcHAiOwp1c2Vycy5zYXZlKHRoZVVzZXIsICJzZWNyZXQiKQoKdmFyIHVybCA9ICIvX2FwaS91c2VyLyIgKyB0aGVVc2VyOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKdXNlcnMucmVtb3ZlKHRoZVVzZXIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYWRtaW5AbXlhcHAnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInVzZXJcIiA6IFwiYWRtaW5AbXlhcHBcIiwgXG4gIFwiYWN0aXZlXCIgOiB0cnVlLCBcbiAgXCJleHRyYVwiIDogeyBcbiAgfSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJlcnJvclwiIDogZmFsc2UgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RGZXRjaFVzZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestGetResponsibleShardExample_cluster": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0R2V0UmVzcG9uc2libGVTaGFyZEV4YW1wbGUKdHlwZTogY2x1c3RlcgotLS0KdmFyIGNuID0gInRlc3RDb2xsZWN0aW9uIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IG51bWJlck9mU2hhcmRzOiAzLCBzaGFyZEtleXM6IFsiX2tleSJdIH0pOwoKdmFyIGJvZHkgPSB7IF9rZXk6ICJ0ZXN0a2V5IiwgdmFsdWU6IDIzIH07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCAiL19hcGkvY29sbGVjdGlvbi8iICsgY24gKyAiL3Jlc3BvbnNpYmxlU2hhcmQiLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5oYXNPd25Qcm9wZXJ0eSgic2hhcmRJZCIpKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vdGVzdENvbGxlY3Rpb24vcmVzcG9uc2libGVTaGFyZCcgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJfa2V5XCI6IFwidGVzdGtleVwiLFxuICBcInZhbHVlXCI6IDIzXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2NvbGxlY3Rpb24vdGVzdENvbGxlY3Rpb24vcmVzcG9uc2libGVTaGFyZFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInNoYXJkSWRcIiA6IFwiczYwMTAwMzBcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEdldFJlc3BvbnNpYmxlU2hhcmRFeGFtcGxlIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestGetShardsWithDetails_cluster": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBzaGFyZHMgd2l0aCB0aGUgcmVzcG9uc2libGUgc2VydmVyczoKbmFtZTogUmVzdEdldFNoYXJkc1dpdGhEZXRhaWxzCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBjbiA9ICJ0ZXN0Q29sbGVjdGlvbiI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbiwgeyBudW1iZXJPZlNoYXJkczogMyB9KTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCAiL19hcGkvY29sbGVjdGlvbi8iICsgY24gKyAiL3NoYXJkcz9kZXRhaWxzPXRydWUiKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5oYXNPd25Qcm9wZXJ0eSgic2hhcmRzIikpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vdGVzdENvbGxlY3Rpb24vc2hhcmRzP2RldGFpbHM9dHJ1ZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc0MVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbmxvY2F0aW9uOiAvX2RiL19zeXN0ZW0vX2FwaS9jb2xsZWN0aW9uL3Rlc3RDb2xsZWN0aW9uL3NoYXJkc1xucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInNoYXJkc1wiIDogeyBcbiAgICBcInM2MDEwMDQwXCIgOiBbIFxuICAgICAgXCJQUk1SLWNkYTVlYTViLWNjYjMtNDE4NC1iNDRkLTc2OTQyNTZiMWZmMlwiIFxuICAgIF0sIFxuICAgIFwiczYwMTAwNDFcIiA6IFsgXG4gICAgICBcIlBSTVItYmQxMjg2NDktY2FkZS00MGUzLThjMzMtNTA0NDg2N2MyNDI1XCIgXG4gICAgXSwgXG4gICAgXCJzNjAxMDA0MlwiIDogWyBcbiAgICAgIFwiUFJNUi1iNTMyMGFlNS0xNmIzLTQ2NDUtOGEyMi04MTUzOWQ0NTk1YjRcIiBcbiAgICBdIFxuICB9LCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcIndhaXRGb3JTeW5jXCIgOiBmYWxzZSwgXG4gIFwidXNlc1JldmlzaW9uc0FzRG9jdW1lbnRJZHNcIiA6IHRydWUsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzaGFyZGluZ1N0cmF0ZWd5XCIgOiBcImhhc2hcIiwgXG4gIFwic2NoZW1hXCIgOiBudWxsLCBcbiAgXCJudW1iZXJPZlNoYXJkc1wiIDogMywgXG4gIFwibWluUmVwbGljYXRpb25GYWN0b3JcIiA6IDEsIFxuICBcImlkXCIgOiBcIjYwMTAwMzlcIiwgXG4gIFwiaXNTbWFydENoaWxkXCIgOiBmYWxzZSwgXG4gIFwibmFtZVwiIDogXCJ0ZXN0Q29sbGVjdGlvblwiLCBcbiAgXCJzdGF0dXNTdHJpbmdcIiA6IFwibG9hZGVkXCIsIFxuICBcImlzU21hcnRcIiA6IGZhbHNlLCBcbiAgXCJyZXBsaWNhdGlvbkZhY3RvclwiIDogMSwgXG4gIFwidHlwZVwiIDogMiwgXG4gIFwic3RhdHVzXCIgOiAzLCBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJpbnRlcm5hbFZhbGlkYXRvclR5cGVcIiA6IDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiYzYwMTAwMzkvXCIsIFxuICBcInNoYXJkS2V5c1wiIDogWyBcbiAgICBcIl9rZXlcIiBcbiAgXSwgXG4gIFwiaXNEaXNqb2ludFwiIDogZmFsc2UsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZXRyaWV2ZXMgdGhlIGxpc3Qgb2Ygc2hhcmRzIHdpdGggdGhlIHJlc3BvbnNpYmxlIHNlcnZlcnM6IiwibmFtZSI6IlJlc3RHZXRTaGFyZHNXaXRoRGV0YWlscyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestGetShards_cluster": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBzaGFyZHM6Cm5hbWU6IFJlc3RHZXRTaGFyZHMKdHlwZTogY2x1c3RlcgotLS0KdmFyIGNuID0gInRlc3RDb2xsZWN0aW9uIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuLCB7IG51bWJlck9mU2hhcmRzOiAzIH0pOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsICIvX2FwaS9jb2xsZWN0aW9uLyIgKyBjbiArICIvc2hhcmRzIik7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuaGFzT3duUHJvcGVydHkoInNoYXJkcyIpKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24vdGVzdENvbGxlY3Rpb24vc2hhcmRzJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjAzXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxubG9jYXRpb246IC9fZGIvX3N5c3RlbS9fYXBpL2NvbGxlY3Rpb24vdGVzdENvbGxlY3Rpb24vc2hhcmRzXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwic2hhcmRzXCIgOiBbIFxuICAgIFwiczYwMTAwMzRcIiwgXG4gICAgXCJzNjAxMDAzNVwiLCBcbiAgICBcInM2MDEwMDM2XCIgXG4gIF0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgXCJ1c2VzUmV2aXNpb25zQXNEb2N1bWVudElkc1wiIDogdHJ1ZSwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInNoYXJkaW5nU3RyYXRlZ3lcIiA6IFwiaGFzaFwiLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwsIFxuICBcIm51bWJlck9mU2hhcmRzXCIgOiAzLCBcbiAgXCJtaW5SZXBsaWNhdGlvbkZhY3RvclwiIDogMSwgXG4gIFwiaWRcIiA6IFwiNjAxMDAzM1wiLCBcbiAgXCJpc1NtYXJ0Q2hpbGRcIiA6IGZhbHNlLCBcbiAgXCJuYW1lXCIgOiBcInRlc3RDb2xsZWN0aW9uXCIsIFxuICBcInN0YXR1c1N0cmluZ1wiIDogXCJsb2FkZWRcIiwgXG4gIFwiaXNTbWFydFwiIDogZmFsc2UsIFxuICBcInJlcGxpY2F0aW9uRmFjdG9yXCIgOiAxLCBcbiAgXCJ0eXBlXCIgOiAyLCBcbiAgXCJzdGF0dXNcIiA6IDMsIFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcImludGVybmFsVmFsaWRhdG9yVHlwZVwiIDogMCwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJjNjAxMDAzMy9cIiwgXG4gIFwic2hhcmRLZXlzXCIgOiBbIFxuICAgIFwiX2tleVwiIFxuICBdLCBcbiAgXCJpc0Rpc2pvaW50XCIgOiBmYWxzZSwgXG4gIFwia2V5T3B0aW9uc1wiIDogeyBcbiAgICBcImFsbG93VXNlcktleXNcIiA6IHRydWUsIFxuICAgIFwidHlwZVwiIDogXCJ0cmFkaXRpb25hbFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHJpZXZlcyB0aGUgbGlzdCBvZiBzaGFyZHM6IiwibmFtZSI6IlJlc3RHZXRTaGFyZHMiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestGrantCollection_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0R3JhbnRDb2xsZWN0aW9uCi0tLQp2YXIgdXNlcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKTsKdmFyIHRoZVVzZXIgPSAiYWRtaW5AbXlhcHAiOwp0cnkgeyB1c2Vycy5yZW1vdmUodGhlVXNlcik7IH0gY2F0Y2ggKGVycikge30KdHJ5IHsgZGJfZHJvcCgicmVwb3J0cyIpOyB9IGNhdGNoIChlcnIpIHt9CmRiLl9jcmVhdGUoInJlcG9ydHMiKTsKdXNlcnMuc2F2ZSh0aGVVc2VyLCAic2VjcmV0IikKCnZhciB1cmwgPSAiL19hcGkvdXNlci8iICsgdGhlVXNlciArICIvZGF0YWJhc2UvX3N5c3RlbS9yZXBvcnRzIjsKdmFyIGRhdGEgPSB7IGdyYW50OiAicnciIH07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGEpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmRiLl9kcm9wKCJyZXBvcnRzIik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwp1c2Vycy5yZW1vdmUodGhlVXNlcik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYWRtaW5AbXlhcHAvZGF0YWJhc2UvX3N5c3RlbS9yZXBvcnRzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcImdyYW50XCI6IFwicndcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0OVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcIl9zeXN0ZW0vcmVwb3J0c1wiIDogXCJyd1wiLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImVycm9yXCIgOiBmYWxzZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdEdyYW50Q29sbGVjdGlvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestGrantDatabase_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0R3JhbnREYXRhYmFzZQotLS0KdmFyIHVzZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIik7CnZhciB0aGVVc2VyID0gImFkbWluQG15YXBwIjsKdXNlcnMuc2F2ZSh0aGVVc2VyLCAic2VjcmV0IikKCnZhciB1cmwgPSAiL19hcGkvdXNlci8iICsgdGhlVXNlciArICIvZGF0YWJhc2UvX3N5c3RlbSI7CnZhciBkYXRhID0geyBncmFudDogInJ3IiB9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCBkYXRhKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKdXNlcnMucmVtb3ZlKHRoZVVzZXIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYWRtaW5AbXlhcHAvZGF0YWJhc2UvX3N5c3RlbScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJncmFudFwiOiBcInJ3XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDFcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfc3lzdGVtXCIgOiBcInJ3XCIsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0R3JhbnREYXRhYmFzZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestImportCsvEdgeInvalid_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyBKU09OIGFycmF5cyBpbnRvIGFuIGVkZ2UgY29sbGVjdGlvbiwgb21pdHRpbmcgYF9mcm9tYCBvciBgX3RvYDoKbmFtZTogUmVzdEltcG9ydENzdkVkZ2VJbnZhbGlkCi0tLQp2YXIgY24gPSAibGlua3MiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGVFZGdlQ29sbGVjdGlvbihjbik7Cgp2YXIgYm9keSA9ICdbICJuYW1lIiBdXG5bICJzb21lIG5hbWUiIF1cblsgIm90aGVyIG5hbWUiIF0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3RSYXcoJ1BPU1QnLCAiL19hcGkvaW1wb3J0P2NvbGxlY3Rpb249IiArIGNuICsgIiZkZXRhaWxzPXRydWUiLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5jcmVhdGVkID09PSAwKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZXJyb3JzID09PSAyKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZW1wdHkgPT09IDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1saW5rc1x1MDAyNmRldGFpbHM9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcblsgXCJuYW1lXCIgXVxuWyBcInNvbWUgbmFtZVwiIF1cblsgXCJvdGhlciBuYW1lXCIgXVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI4MVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY3JlYXRlZFwiIDogMCwgXG4gIFwiZXJyb3JzXCIgOiAyLCBcbiAgXCJlbXB0eVwiIDogMCwgXG4gIFwidXBkYXRlZFwiIDogMCwgXG4gIFwiaWdub3JlZFwiIDogMCwgXG4gIFwiZGV0YWlsc1wiIDogWyBcbiAgICBcImF0IHBvc2l0aW9uIDE6IG1pc3NpbmcgJ19mcm9tJyBvciAnX3RvJyBhdHRyaWJ1dGUsIG9mZmVuZGluZyBkb2N1bWVudDoge1xcXCJuYW1lXFxcIjpcXFwic29tZSBuYW1lXFxcIn1cIiwgXG4gICAgXCJhdCBwb3NpdGlvbiAyOiBtaXNzaW5nICdfZnJvbScgb3IgJ190bycgYXR0cmlidXRlLCBvZmZlbmRpbmcgZG9jdW1lbnQ6IHtcXFwibmFtZVxcXCI6XFxcIm90aGVyIG5hbWVcXFwifVwiIFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkltcG9ydGluZyBKU09OIGFycmF5cyBpbnRvIGFuIGVkZ2UgY29sbGVjdGlvbiwgb21pdHRpbmcgYF9mcm9tYCBvciBgX3RvYDoiLCJuYW1lIjoiUmVzdEltcG9ydENzdkVkZ2VJbnZhbGlkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestImportCsvEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyBKU09OIGFycmF5cyBpbnRvIGFuIGVkZ2UgY29sbGVjdGlvbiwgd2l0aCBgX2Zyb21gLCBgX3RvYCwgYW5kIGBuYW1lYAogIGF0dHJpYnV0ZXM6Cm5hbWU6IFJlc3RJbXBvcnRDc3ZFZGdlCi0tLQp2YXIgY24gPSAibGlua3MiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGVFZGdlQ29sbGVjdGlvbihjbik7CmRiLl9kcm9wKCJwcm9kdWN0cyIpOwpkYi5fY3JlYXRlKCJwcm9kdWN0cyIpOwoKdmFyIGJvZHkgPSAnWyAiX2Zyb20iLCAiX3RvIiwgIm5hbWUiIF1cbicgKwogICAgICAgICAgICdbICJwcm9kdWN0cy8xMjMiLCJwcm9kdWN0cy8yMzQiLCAic29tZSBuYW1lIiBdXG4nICsKICAgICAgICAgICAnWyAicHJvZHVjdHMvMzMyIiwgInByb2R1Y3RzL2FiYyIsICJvdGhlciBuYW1lIiBdJzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0UmF3KCdQT1NUJywgIi9fYXBpL2ltcG9ydD9jb2xsZWN0aW9uPSIgKyBjbiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuY3JlYXRlZCA9PT0gMik7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVycm9ycyA9PT0gMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVtcHR5ID09PSAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTsKZGIuX2Ryb3AoInByb2R1Y3RzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1saW5rcycgXHUwMDNjXHUwMDNjJ0VPRidcblsgXCJfZnJvbVwiLCBcIl90b1wiLCBcIm5hbWVcIiBdXG5bIFwicHJvZHVjdHMvMTIzXCIsXCJwcm9kdWN0cy8yMzRcIiwgXCJzb21lIG5hbWVcIiBdXG5bIFwicHJvZHVjdHMvMzMyXCIsIFwicHJvZHVjdHMvYWJjXCIsIFwib3RoZXIgbmFtZVwiIF1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY3JlYXRlZFwiIDogMiwgXG4gIFwiZXJyb3JzXCIgOiAwLCBcbiAgXCJlbXB0eVwiIDogMCwgXG4gIFwidXBkYXRlZFwiIDogMCwgXG4gIFwiaWdub3JlZFwiIDogMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJJbXBvcnRpbmcgSlNPTiBhcnJheXMgaW50byBhbiBlZGdlIGNvbGxlY3Rpb24sIHdpdGggYF9mcm9tYCwgYF90b2AsIGFuZCBgbmFtZWBcbmF0dHJpYnV0ZXM6IiwibmFtZSI6IlJlc3RJbXBvcnRDc3ZFZGdlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestImportCsvExample_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyB0d28gZG9jdW1lbnRzIHVzaW5nIHRoZSBKU09OIGFycmF5cyBmb3JtYXQuIFRoZSBkb2N1bWVudHMgaGF2ZSBhCiAgYF9rZXlgLCBgdmFsdWUxYCwgYW5kIGB2YWx1ZTJgIGF0dHJpYnV0ZSBlYWNoLiBPbmUgbGluZSBpbiB0aGUgaW1wb3J0IGRhdGEgaXMKICBlbXB0eSBhbmQgc2tpcHBlZDoKbmFtZTogUmVzdEltcG9ydENzdkV4YW1wbGUKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgYm9keSA9ICdbICJfa2V5IiwgInZhbHVlMSIsICJ2YWx1ZTIiIF1cbicgKwogICAgICAgICAgICdbICJhYmMiLCAyNSwgInRlc3QiIF1cblxuJyArCiAgICAgICAgICAgJ1sgImZvbyIsICJiYXIiLCAiYmF6IiBdJzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0UmF3KCdQT1NUJywgIi9fYXBpL2ltcG9ydD9jb2xsZWN0aW9uPSIgKyBjbiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuY3JlYXRlZCA9PT0gMik7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVycm9ycyA9PT0gMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVtcHR5ID09PSAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcblsgXCJfa2V5XCIsIFwidmFsdWUxXCIsIFwidmFsdWUyXCIgXVxuWyBcImFiY1wiLCAyNSwgXCJ0ZXN0XCIgXVxuXG5bIFwiZm9vXCIsIFwiYmFyXCIsIFwiYmF6XCIgXVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDcyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjcmVhdGVkXCIgOiAyLCBcbiAgXCJlcnJvcnNcIiA6IDAsIFxuICBcImVtcHR5XCIgOiAxLCBcbiAgXCJ1cGRhdGVkXCIgOiAwLCBcbiAgXCJpZ25vcmVkXCIgOiAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkltcG9ydGluZyB0d28gZG9jdW1lbnRzIHVzaW5nIHRoZSBKU09OIGFycmF5cyBmb3JtYXQuIFRoZSBkb2N1bWVudHMgaGF2ZSBhXG5gX2tleWAsIGB2YWx1ZTFgLCBhbmQgYHZhbHVlMmAgYXR0cmlidXRlIGVhY2guIE9uZSBsaW5lIGluIHRoZSBpbXBvcnQgZGF0YSBpc1xuZW1wdHkgYW5kIHNraXBwZWQ6IiwibmFtZSI6IlJlc3RJbXBvcnRDc3ZFeGFtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestImportCsvInvalidBody_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbWFsZm9ybWVkIGJvZHkgd2l0aCBKU09OIGFycmF5cyBiZWluZyBleHBlY3RlZDoKbmFtZTogUmVzdEltcG9ydENzdkludmFsaWRCb2R5Ci0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIGJvZHkgPSAneyAiX2tleSI6ICJmb28iLCAidmFsdWUxIjogImJhciIgfSc7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsICIvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj0iICsgY24sIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0cycgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJfa2V5XCI6IFwiZm9vXCIsIFwidmFsdWUxXCI6IFwiYmFyXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJubyBKU09OIGFycmF5IGZvdW5kIGluIHNlY29uZCBsaW5lXCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYSBtYWxmb3JtZWQgYm9keSB3aXRoIEpTT04gYXJyYXlzIGJlaW5nIGV4cGVjdGVkOiIsIm5hbWUiOiJSZXN0SW1wb3J0Q3N2SW52YWxpZEJvZHkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestImportJsonEdgeInvalid_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyBhbiBhcnJheSBvZiBKU09OIG9iamVjdHMgaW50byBhbiBlZGdlIGNvbGxlY3Rpb24sCiAgb21pdHRpbmcgYF9mcm9tYCBvciBgX3RvYDoKbmFtZTogUmVzdEltcG9ydEpzb25FZGdlSW52YWxpZAotLS0KZGIuX2ZsdXNoQ2FjaGUoKTsKdmFyIGNuID0gImxpbmtzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oY24pOwpkYi5fZmx1c2hDYWNoZSgpOwoKdmFyIGJvZHkgPSBbIHsgbmFtZTogInNvbWUgbmFtZSIgfSBdOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3RSYXcoJ1BPU1QnLCAiL19hcGkvaW1wb3J0P2NvbGxlY3Rpb249IiArIGNuICsgIiZ0eXBlPWxpc3QmZGV0YWlscz10cnVlIiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuY3JlYXRlZCA9PT0gMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVycm9ycyA9PT0gMSk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVtcHR5ID09PSAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1saW5rc1x1MDAyNnR5cGU9bGlzdFx1MDAyNmRldGFpbHM9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcbltcbiAge1xuICAgIFwibmFtZVwiOiBcInNvbWUgbmFtZVwiXG4gIH1cbl1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxODJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNyZWF0ZWRcIiA6IDAsIFxuICBcImVycm9yc1wiIDogMSwgXG4gIFwiZW1wdHlcIiA6IDAsIFxuICBcInVwZGF0ZWRcIiA6IDAsIFxuICBcImlnbm9yZWRcIiA6IDAsIFxuICBcImRldGFpbHNcIiA6IFsgXG4gICAgXCJhdCBwb3NpdGlvbiAxOiBtaXNzaW5nICdfZnJvbScgb3IgJ190bycgYXR0cmlidXRlLCBvZmZlbmRpbmcgZG9jdW1lbnQ6IHtcXFwibmFtZVxcXCI6XFxcInNvbWUgbmFtZVxcXCJ9XCIgXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiSW1wb3J0aW5nIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cyBpbnRvIGFuIGVkZ2UgY29sbGVjdGlvbixcbm9taXR0aW5nIGBfZnJvbWAgb3IgYF90b2A6IiwibmFtZSI6IlJlc3RJbXBvcnRKc29uRWRnZUludmFsaWQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestImportJsonEdge_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyBKU09OTCBpbnRvIGFuIGVkZ2UgY29sbGVjdGlvbiwgd2l0aCBgX2Zyb21gLCBgX3RvYCBhbmQgYG5hbWVgCiAgYXR0cmlidXRlczoKbmFtZTogUmVzdEltcG9ydEpzb25FZGdlCi0tLQpkYi5fZmx1c2hDYWNoZSgpOwp2YXIgY24gPSAibGlua3MiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGVFZGdlQ29sbGVjdGlvbihjbik7CmRiLl9kcm9wKCJwcm9kdWN0cyIpOwpkYi5fY3JlYXRlKCJwcm9kdWN0cyIpOwpkYi5fZmx1c2hDYWNoZSgpOwoKdmFyIGJvZHkgPSAneyAiX2Zyb20iOiAicHJvZHVjdHMvMTIzIiwgIl90byI6ICJwcm9kdWN0cy8yMzQiIH1cbicgKwogICAgICAgICAgICd7Il9mcm9tIjogInByb2R1Y3RzLzMzMiIsICJfdG8iOiAicHJvZHVjdHMvYWJjIiwgJyArCiAgICAgICAgICAgJyAgIm5hbWUiOiAib3RoZXIgbmFtZSIgfSc7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdFJhdygnUE9TVCcsICIvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj0iICsgY24gKyAiJnR5cGU9ZG9jdW1lbnRzIiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuY3JlYXRlZCA9PT0gMik7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVycm9ycyA9PT0gMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVtcHR5ID09PSAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTsKZGIuX2Ryb3AoInByb2R1Y3RzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1saW5rc1x1MDAyNnR5cGU9ZG9jdW1lbnRzJyBcdTAwM2NcdTAwM2MnRU9GJ1xueyBcIl9mcm9tXCI6IFwicHJvZHVjdHMvMTIzXCIsIFwiX3RvXCI6IFwicHJvZHVjdHMvMjM0XCIgfVxue1wiX2Zyb21cIjogXCJwcm9kdWN0cy8zMzJcIiwgXCJfdG9cIjogXCJwcm9kdWN0cy9hYmNcIiwgICBcIm5hbWVcIjogXCJvdGhlciBuYW1lXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDcyXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjcmVhdGVkXCIgOiAyLCBcbiAgXCJlcnJvcnNcIiA6IDAsIFxuICBcImVtcHR5XCIgOiAwLCBcbiAgXCJ1cGRhdGVkXCIgOiAwLCBcbiAgXCJpZ25vcmVkXCIgOiAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkltcG9ydGluZyBKU09OTCBpbnRvIGFuIGVkZ2UgY29sbGVjdGlvbiwgd2l0aCBgX2Zyb21gLCBgX3RvYCBhbmQgYG5hbWVgXG5hdHRyaWJ1dGVzOiIsIm5hbWUiOiJSZXN0SW1wb3J0SnNvbkVkZ2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestImportJsonInvalidBody_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbWFsZm9ybWVkIGJvZHkgd2l0aCBhbiBhcnJheSBvZiBKU09OIG9iamVjdHMgYmVpbmcgZXhwZWN0ZWQ6Cm5hbWU6IFJlc3RJbXBvcnRKc29uSW52YWxpZEJvZHkKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CmRiLl9mbHVzaENhY2hlKCk7Cgp2YXIgYm9keSA9ICd7IH0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3RSYXcoJ1BPU1QnLCAiL19hcGkvaW1wb3J0P2NvbGxlY3Rpb249IiArIGNuICsgIiZ0eXBlPWxpc3QiLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9bGlzdCcgXHUwMDNjXHUwMDNjJ0VPRidcbnsgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5NVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJleHBlY3RpbmcgYSBKU09OIGFycmF5IGluIHRoZSByZXF1ZXN0XCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYSBtYWxmb3JtZWQgYm9keSB3aXRoIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cyBiZWluZyBleHBlY3RlZDoiLCJuYW1lIjoiUmVzdEltcG9ydEpzb25JbnZhbGlkQm9keSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestImportJsonInvalidCollection_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbm9uLWV4aXN0aW5nIGNvbGxlY3Rpb246Cm5hbWU6IFJlc3RJbXBvcnRKc29uSW52YWxpZENvbGxlY3Rpb24KLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKCnZhciBib2R5ID0gJ3sgIm5hbWUiOiAidGVzdCIgfSc7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdFJhdygnUE9TVCcsICIvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj0iICsgY24gKyAiJnR5cGU9ZG9jdW1lbnRzIiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9ZG9jdW1lbnRzJyBcdTAwM2NcdTAwM2MnRU9GJ1xueyBcIm5hbWVcIjogXCJ0ZXN0XCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogOTdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiY29sbGVjdGlvbiBvciB2aWV3IG5vdCBmb3VuZDogcHJvZHVjdHNcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDMgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYSBub24tZXhpc3RpbmcgY29sbGVjdGlvbjoiLCJuYW1lIjoiUmVzdEltcG9ydEpzb25JbnZhbGlkQ29sbGVjdGlvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestImportJsonLines_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyBkb2N1bWVudHMgdXNpbmcgSlNPTiBvYmplY3RzIHNlcGFyYXRlZCBieSBuZXcgbGluZXMgKEpTT05MKToKbmFtZTogUmVzdEltcG9ydEpzb25MaW5lcwotLS0KZGIuX2ZsdXNoQ2FjaGUoKTsKdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKZGIuX2ZsdXNoQ2FjaGUoKTsKCnZhciBib2R5ID0gJ3sgIl9rZXkiOiAiYWJjIiwgInZhbHVlMSI6IDI1LCAidmFsdWUyIjogInRlc3QiLCcgKwogICAgICAgICAgICciYWxsb3dlZCI6IHRydWUgfVxuJyArCiAgICAgICAgICAgJ3sgIl9rZXkiOiAiZm9vIiwgIm5hbWUiOiAiYmF6IiB9XG5cbicgKwogICAgICAgICAgICd7ICJuYW1lIjogeycgKwogICAgICAgICAgICcgImRldGFpbGVkIjogImRldGFpbGVkIG5hbWUiLCAic2hvcnQiOiAic2hvcnQgbmFtZSIgfSB9XG4nOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsICIvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj0iICsgY24gKyAiJnR5cGU9ZG9jdW1lbnRzIiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuY3JlYXRlZCA9PT0gMyk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVycm9ycyA9PT0gMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVtcHR5ID09PSAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9ZG9jdW1lbnRzJyBcdTAwM2NcdTAwM2MnRU9GJ1xueyBcIl9rZXlcIjogXCJhYmNcIiwgXCJ2YWx1ZTFcIjogMjUsIFwidmFsdWUyXCI6IFwidGVzdFwiLFwiYWxsb3dlZFwiOiB0cnVlIH1cbnsgXCJfa2V5XCI6IFwiZm9vXCIsIFwibmFtZVwiOiBcImJhelwiIH1cblxueyBcIm5hbWVcIjogeyBcImRldGFpbGVkXCI6IFwiZGV0YWlsZWQgbmFtZVwiLCBcInNob3J0XCI6IFwic2hvcnQgbmFtZVwiIH0gfVxuXG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNyZWF0ZWRcIiA6IDMsIFxuICBcImVycm9yc1wiIDogMCwgXG4gIFwiZW1wdHlcIiA6IDEsIFxuICBcInVwZGF0ZWRcIiA6IDAsIFxuICBcImlnbm9yZWRcIiA6IDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiSW1wb3J0aW5nIGRvY3VtZW50cyB1c2luZyBKU09OIG9iamVjdHMgc2VwYXJhdGVkIGJ5IG5ldyBsaW5lcyAoSlNPTkwpOiIsIm5hbWUiOiJSZXN0SW1wb3J0SnNvbkxpbmVzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestImportJsonList_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEltcG9ydGluZyBkb2N1bWVudHMgd2l0aCBoZXRlcm9nZW5vdXMgYXR0cmlidXRlcyBmcm9tIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0czoKbmFtZTogUmVzdEltcG9ydEpzb25MaXN0Ci0tLQpkYi5fZmx1c2hDYWNoZSgpOwp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwpkYi5fZmx1c2hDYWNoZSgpOwoKdmFyIGJvZHkgPSBbCiAgeyBfa2V5OiAiYWJjIiwgdmFsdWUxOiAyNSwgdmFsdWUyOiAidGVzdCIsIGFsbG93ZWQ6IHRydWUgfSwKICB7IF9rZXk6ICJmb28iLCBuYW1lOiAiYmF6IiB9LAogIHsgbmFtZTogeyBkZXRhaWxlZDogImRldGFpbGVkIG5hbWUiLCBzaG9ydDogInNob3J0IG5hbWUiIH0gfQpdOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCAiL19hcGkvaW1wb3J0P2NvbGxlY3Rpb249IiArIGNuICsgIiZ0eXBlPWxpc3QiLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5jcmVhdGVkID09PSAzKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZXJyb3JzID09PSAwKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuZW1wdHkgPT09IDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9bGlzdCcgXHUwMDNjXHUwMDNjJ0VPRidcbltcbiAge1xuICAgIFwiX2tleVwiOiBcImFiY1wiLFxuICAgIFwidmFsdWUxXCI6IDI1LFxuICAgIFwidmFsdWUyXCI6IFwidGVzdFwiLFxuICAgIFwiYWxsb3dlZFwiOiB0cnVlXG4gIH0sXG4gIHtcbiAgICBcIl9rZXlcIjogXCJmb29cIixcbiAgICBcIm5hbWVcIjogXCJiYXpcIlxuICB9LFxuICB7XG4gICAgXCJuYW1lXCI6IHtcbiAgICAgIFwiZGV0YWlsZWRcIjogXCJkZXRhaWxlZCBuYW1lXCIsXG4gICAgICBcInNob3J0XCI6IFwic2hvcnQgbmFtZVwiXG4gICAgfVxuICB9XG5dXG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNyZWF0ZWRcIiA6IDMsIFxuICBcImVycm9yc1wiIDogMCwgXG4gIFwiZW1wdHlcIiA6IDAsIFxuICBcInVwZGF0ZWRcIiA6IDAsIFxuICBcImlnbm9yZWRcIiA6IDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiSW1wb3J0aW5nIGRvY3VtZW50cyB3aXRoIGhldGVyb2dlbm91cyBhdHRyaWJ1dGVzIGZyb20gYW4gYXJyYXkgb2YgSlNPTiBvYmplY3RzOiIsIm5hbWUiOiJSZXN0SW1wb3J0SnNvbkxpc3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestImportJsonType_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIHRoZSBgYXV0b2AgdHlwZSBkZXRlY3Rpb246Cm5hbWU6IFJlc3RJbXBvcnRKc29uVHlwZQotLS0KZGIuX2ZsdXNoQ2FjaGUoKTsKdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKZGIuX2ZsdXNoQ2FjaGUoKTsKCnZhciBib2R5ID0gWwogIHsgX2tleTogImFiYyIsIHZhbHVlMTogMjUsIHZhbHVlMjogInRlc3QiLCBhbGxvd2VkOiB0cnVlIH0sCiAgeyBfa2V5OiAiZm9vIiwgbmFtZTogImJheiIgfSwKICB7IG5hbWU6IHsgZGV0YWlsZWQ6ICJkZXRhaWxlZCBuYW1lIiwgc2hvcnQ6ICJzaG9ydCBuYW1lIiB9IH0KXTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0UmF3KCdQT1NUJywgIi9fYXBpL2ltcG9ydD9jb2xsZWN0aW9uPSIgKyBjbiArICImdHlwZT1hdXRvIiwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkuY3JlYXRlZCA9PT0gMyk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVycm9ycyA9PT0gMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmVtcHR5ID09PSAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9YXV0bycgXHUwMDNjXHUwMDNjJ0VPRidcbltcbiAge1xuICAgIFwiX2tleVwiOiBcImFiY1wiLFxuICAgIFwidmFsdWUxXCI6IDI1LFxuICAgIFwidmFsdWUyXCI6IFwidGVzdFwiLFxuICAgIFwiYWxsb3dlZFwiOiB0cnVlXG4gIH0sXG4gIHtcbiAgICBcIl9rZXlcIjogXCJmb29cIixcbiAgICBcIm5hbWVcIjogXCJiYXpcIlxuICB9LFxuICB7XG4gICAgXCJuYW1lXCI6IHtcbiAgICAgIFwiZGV0YWlsZWRcIjogXCJkZXRhaWxlZCBuYW1lXCIsXG4gICAgICBcInNob3J0XCI6IFwic2hvcnQgbmFtZVwiXG4gICAgfVxuICB9XG5dXG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNyZWF0ZWRcIiA6IDMsIFxuICBcImVycm9yc1wiIDogMCwgXG4gIFwiZW1wdHlcIiA6IDAsIFxuICBcInVwZGF0ZWRcIiA6IDAsIFxuICBcImlnbm9yZWRcIiA6IDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgdGhlIGBhdXRvYCB0eXBlIGRldGVjdGlvbjoiLCJuYW1lIjoiUmVzdEltcG9ydEpzb25UeXBlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestImportJsonUniqueContinue_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFZpb2xhdGluZyBhIHVuaXF1ZSBjb25zdHJhaW50LCBidXQgYWxsb3dpbmcgcGFydGlhbCBpbXBvcnRzOgpuYW1lOiBSZXN0SW1wb3J0SnNvblVuaXF1ZUNvbnRpbnVlCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwpkYi5fZmx1c2hDYWNoZSgpOwoKdmFyIGJvZHkgPSAneyAiX2tleSI6ICJhYmMiLCAidmFsdWUxIjogMjUsICJ2YWx1ZTIiOiAidGVzdCIgfVxuJyArCiAgICAgICAgICAgJ3sgIl9rZXkiOiAiYWJjIiwgInZhbHVlMSI6ICJiYXIiLCAidmFsdWUyIjogImJheiIgfSc7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdFJhdygnUE9TVCcsICIvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj0iICsgY24KKyAiJnR5cGU9ZG9jdW1lbnRzJmRldGFpbHM9dHJ1ZSIsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmNyZWF0ZWQgPT09IDEpOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5lcnJvcnMgPT09IDEpOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5lbXB0eSA9PT0gMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9ZG9jdW1lbnRzXHUwMDI2ZGV0YWlscz10cnVlJyBcdTAwM2NcdTAwM2MnRU9GJ1xueyBcIl9rZXlcIjogXCJhYmNcIiwgXCJ2YWx1ZTFcIjogMjUsIFwidmFsdWUyXCI6IFwidGVzdFwiIH1cbnsgXCJfa2V5XCI6IFwiYWJjXCIsIFwidmFsdWUxXCI6IFwiYmFyXCIsIFwidmFsdWUyXCI6IFwiYmF6XCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI0NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY3JlYXRlZFwiIDogMSwgXG4gIFwiZXJyb3JzXCIgOiAxLCBcbiAgXCJlbXB0eVwiIDogMCwgXG4gIFwidXBkYXRlZFwiIDogMCwgXG4gIFwiaWdub3JlZFwiIDogMCwgXG4gIFwiZGV0YWlsc1wiIDogWyBcbiAgICBcImF0IHBvc2l0aW9uIDE6IGNyZWF0aW5nIGRvY3VtZW50IGZhaWxlZCB3aXRoIGVycm9yICd1bmlxdWUgY29uc3RyYWludCB2aW9sYXRlZCcsIG9mZmVuZGluZyBkb2N1bWVudDoge1xcXCJfa2V5XFxcIjpcXFwiYWJjXFxcIixcXFwidmFsdWUxXFxcIjpcXFwiYmFyXFxcIixcXFwidmFsdWUyXFxcIjpcXFwiYmF6XFxcIn1cIiBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJWaW9sYXRpbmcgYSB1bmlxdWUgY29uc3RyYWludCwgYnV0IGFsbG93aW5nIHBhcnRpYWwgaW1wb3J0czoiLCJuYW1lIjoiUmVzdEltcG9ydEpzb25VbmlxdWVDb250aW51ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestImportJsonUniqueFail_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFZpb2xhdGluZyBhIHVuaXF1ZSBjb25zdHJhaW50LCBub3QgYWxsb3dpbmcgcGFydGlhbCBpbXBvcnRzOgpuYW1lOiBSZXN0SW1wb3J0SnNvblVuaXF1ZUZhaWwKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CmRiLl9mbHVzaENhY2hlKCk7Cgp2YXIgYm9keSA9ICd7ICJfa2V5IjogImFiYyIsICJ2YWx1ZTEiOiAyNSwgInZhbHVlMiI6ICJ0ZXN0IiB9XG4nICsKICAgICAgICAgICAneyAiX2tleSI6ICJhYmMiLCAidmFsdWUxIjogImJhciIsICJ2YWx1ZTIiOiAiYmF6IiB9JzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0UmF3KCdQT1NUJywgIi9fYXBpL2ltcG9ydD9jb2xsZWN0aW9uPSIgKyBjbiArICImdHlwZT1kb2N1bWVudHMmY29tcGxldGU9dHJ1ZSIsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwOSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbXBvcnQ/Y29sbGVjdGlvbj1wcm9kdWN0c1x1MDAyNnR5cGU9ZG9jdW1lbnRzXHUwMDI2Y29tcGxldGU9dHJ1ZScgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJfa2V5XCI6IFwiYWJjXCIsIFwidmFsdWUxXCI6IDI1LCBcInZhbHVlMlwiOiBcInRlc3RcIiB9XG57IFwiX2tleVwiOiBcImFiY1wiLCBcInZhbHVlMVwiOiBcImJhclwiLCBcInZhbHVlMlwiOiBcImJhelwiIH1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDQwOSBDb25mbGljdFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogODVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDksIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwidW5pcXVlIGNvbnN0cmFpbnQgdmlvbGF0ZWRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMTAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVmlvbGF0aW5nIGEgdW5pcXVlIGNvbnN0cmFpbnQsIG5vdCBhbGxvd2luZyBwYXJ0aWFsIGltcG9ydHM6IiwibmFtZSI6IlJlc3RJbXBvcnRKc29uVW5pcXVlRmFpbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestIndexAllIndexes_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5kZXhlcwpuYW1lOiBSZXN0SW5kZXhBbGxJbmRleGVzCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwpkYltjbl0uZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyJuYW1lIl0gfSk7CmRiW2NuXS5lbnN1cmVJbmRleCh7IHR5cGU6ICJwZXJzaXN0ZW50IiwgZmllbGRzOiBbInByaWNlIl0sIHNwYXJzZTogdHJ1ZSB9KTsKCnZhciB1cmwgPSAiL19hcGkvaW5kZXg/Y29sbGVjdGlvbj0iICsgY247Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2luZGV4P2NvbGxlY3Rpb249cHJvZHVjdHMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMTc1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImluZGV4ZXNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgICBcIl9rZXlcIiBcbiAgICAgIF0sIFxuICAgICAgXCJpZFwiIDogXCJwcm9kdWN0cy8wXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcInByaW1hcnlcIiwgXG4gICAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICAgIFwidHlwZVwiIDogXCJwcmltYXJ5XCIsIFxuICAgICAgXCJ1bmlxdWVcIiA6IHRydWUgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gICAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgICBcIm5hbWVcIiBcbiAgICAgIF0sIFxuICAgICAgXCJpZFwiIDogXCJwcm9kdWN0cy84MzkyNlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjI0MTIwMjQ2MjcyMFwiLCBcbiAgICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICAgICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgICBcInVuaXF1ZVwiIDogZmFsc2UgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gICAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgICBcInByaWNlXCIgXG4gICAgICBdLCBcbiAgICAgIFwiaWRcIiA6IFwicHJvZHVjdHMvODM5MzBcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyNDEyMDI0NjI3MjFcIiwgXG4gICAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgICAgXCJzcGFyc2VcIiA6IHRydWUsIFxuICAgICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgICBcInVuaXF1ZVwiIDogZmFsc2UgXG4gICAgfSBcbiAgXSwgXG4gIFwiaWRlbnRpZmllcnNcIiA6IHsgXG4gICAgXCJwcm9kdWN0cy8wXCIgOiB7IFxuICAgICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICAgIFwiX2tleVwiIFxuICAgICAgXSwgXG4gICAgICBcImlkXCIgOiBcInByb2R1Y3RzLzBcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICAgICAgXCJ0eXBlXCIgOiBcInByaW1hcnlcIiwgXG4gICAgICBcInVuaXF1ZVwiIDogdHJ1ZSBcbiAgICB9LCBcbiAgICBcInByb2R1Y3RzLzgzOTI2XCIgOiB7IFxuICAgICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICAgICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICAgIFwibmFtZVwiIFxuICAgICAgXSwgXG4gICAgICBcImlkXCIgOiBcInByb2R1Y3RzLzgzOTI2XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MjQxMjAyNDYyNzIwXCIsIFxuICAgICAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgICAgIFwidW5pcXVlXCIgOiBmYWxzZSBcbiAgICB9LCBcbiAgICBcInByb2R1Y3RzLzgzOTMwXCIgOiB7IFxuICAgICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICAgICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICAgIFwicHJpY2VcIiBcbiAgICAgIF0sIFxuICAgICAgXCJpZFwiIDogXCJwcm9kdWN0cy84MzkzMFwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjI0MTIwMjQ2MjcyMVwiLCBcbiAgICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgICBcInNwYXJzZVwiIDogdHJ1ZSwgXG4gICAgICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgICAgIFwidW5pcXVlXCIgOiBmYWxzZSBcbiAgICB9IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5kZXhlcyIsIm5hbWUiOiJSZXN0SW5kZXhBbGxJbmRleGVzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestIndexCreateGeoLatitudeLongitude_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgZ2VvIGluZGV4IHdpdGggbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBhdHRyaWJ1dGVzCm5hbWU6IFJlc3RJbmRleENyZWF0ZUdlb0xhdGl0dWRlTG9uZ2l0dWRlCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9pbmRleD9jb2xsZWN0aW9uPSIgKyBjbjsKdmFyIGJvZHkgPSB7CiAgdHlwZTogImdlbyIsCiAgZmllbGRzOiBbICJlIiwgImYiIF0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXByb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJnZW9cIixcbiAgXCJmaWVsZHNcIjogW1xuICAgIFwiZVwiLFxuICAgIFwiZlwiXG4gIF1cbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyNjhcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJiZXN0SW5kZXhlZExldmVsXCIgOiAxNywgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwiZVwiLCBcbiAgICBcImZcIiBcbiAgXSwgXG4gIFwiZ2VvSnNvblwiIDogZmFsc2UsIFxuICBcImlkXCIgOiBcInByb2R1Y3RzLzcyMDE4XCIsIFxuICBcImlzTmV3bHlDcmVhdGVkXCIgOiB0cnVlLCBcbiAgXCJsZWdhY3lQb2x5Z29uc1wiIDogZmFsc2UsIFxuICBcIm1heE51bUNvdmVyQ2VsbHNcIiA6IDgsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYxOTkwOTY4OTM0NDBcIiwgXG4gIFwic3BhcnNlXCIgOiB0cnVlLCBcbiAgXCJ0eXBlXCIgOiBcImdlb1wiLCBcbiAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgXCJ3b3JzdEluZGV4ZWRMZXZlbFwiIDogNCwgXG4gIFwiY29kZVwiIDogMjAxLCBcbiAgXCJlcnJvclwiIDogZmFsc2UgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRpbmcgYSBnZW8gaW5kZXggd2l0aCBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGF0dHJpYnV0ZXMiLCJuYW1lIjoiUmVzdEluZGV4Q3JlYXRlR2VvTGF0aXR1ZGVMb25naXR1ZGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestIndexCreateGeoLocation_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgZ2VvIGluZGV4IHdpdGggYSBsb2NhdGlvbiBhdHRyaWJ1dGUKbmFtZTogUmVzdEluZGV4Q3JlYXRlR2VvTG9jYXRpb24KLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgdXJsID0gIi9fYXBpL2luZGV4P2NvbGxlY3Rpb249IiArIGNuOwp2YXIgYm9keSA9IHsKICB0eXBlOiAiZ2VvIiwKICBmaWVsZHMgOiBbICJiIiBdCn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXByb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJnZW9cIixcbiAgXCJmaWVsZHNcIjogW1xuICAgIFwiYlwiXG4gIF1cbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMSBDcmVhdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyNjRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJiZXN0SW5kZXhlZExldmVsXCIgOiAxNywgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwiYlwiIFxuICBdLCBcbiAgXCJnZW9Kc29uXCIgOiBmYWxzZSwgXG4gIFwiaWRcIiA6IFwicHJvZHVjdHMvNzIwMDhcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcImxlZ2FjeVBvbHlnb25zXCIgOiBmYWxzZSwgXG4gIFwibWF4TnVtQ292ZXJDZWxsc1wiIDogOCwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE5OTA4NDMxMDUyOFwiLCBcbiAgXCJzcGFyc2VcIiA6IHRydWUsIFxuICBcInR5cGVcIiA6IFwiZ2VvXCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcIndvcnN0SW5kZXhlZExldmVsXCIgOiA0LCBcbiAgXCJjb2RlXCIgOiAyMDEsIFxuICBcImVycm9yXCIgOiBmYWxzZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGluZyBhIGdlbyBpbmRleCB3aXRoIGEgbG9jYXRpb24gYXR0cmlidXRlIiwibmFtZSI6IlJlc3RJbmRleENyZWF0ZUdlb0xvY2F0aW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestIndexCreateNewFulltext_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgZnVsbHRleHQgaW5kZXgKbmFtZTogUmVzdEluZGV4Q3JlYXRlTmV3RnVsbHRleHQKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgdXJsID0gIi9fYXBpL2luZGV4P2NvbGxlY3Rpb249IiArIGNuOwp2YXIgYm9keSA9IHsKICB0eXBlOiAiZnVsbHRleHQiLAogIGZpZWxkczogWyAidGV4dCIgXQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXByb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJmdWxsdGV4dFwiLFxuICBcImZpZWxkc1wiOiBbXG4gICAgXCJ0ZXh0XCJcbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE4MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcInRleHRcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwicHJvZHVjdHMvNzE5OThcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm1pbkxlbmd0aFwiIDogMiwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE5OTA3MzgyNDc2OFwiLCBcbiAgXCJzcGFyc2VcIiA6IHRydWUsIFxuICBcInR5cGVcIiA6IFwiZnVsbHRleHRcIiwgXG4gIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxLCBcbiAgXCJlcnJvclwiIDogZmFsc2UgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRpbmcgYSBmdWxsdGV4dCBpbmRleCIsIm5hbWUiOiJSZXN0SW5kZXhDcmVhdGVOZXdGdWxsdGV4dCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestIndexCreateNewInverted_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGFuIGludmVydGVkIGluZGV4OgpuYW1lOiBSZXN0SW5kZXhDcmVhdGVOZXdJbnZlcnRlZAotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgdXJsID0gIi9fYXBpL2luZGV4P2NvbGxlY3Rpb249IiArIGNuOwp2YXIgYm9keSA9IHsKICB0eXBlOiAiaW52ZXJ0ZWQiLAogIGZpZWxkczogWyAiYSIsIHsgbmFtZTogImIiLCBhbmFseXplcjogInRleHRfZW4iIH0gXQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXByb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJpbnZlcnRlZFwiLFxuICBcImZpZWxkc1wiOiBbXG4gICAgXCJhXCIsXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiYlwiLFxuICAgICAgXCJhbmFseXplclwiOiBcInRleHRfZW5cIlxuICAgIH1cbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc1NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImFuYWx5emVyXCIgOiBcImlkZW50aXR5XCIsIFxuICBcImNsZWFudXBJbnRlcnZhbFN0ZXBcIiA6IDIsIFxuICBcImNvbW1pdEludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY29uc29saWRhdGlvbkludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY29uc29saWRhdGlvblBvbGljeVwiIDogeyBcbiAgICBcInR5cGVcIiA6IFwidGllclwiLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNGbG9vclwiIDogMjA5NzE1MiwgXG4gICAgXCJzZWdtZW50c0J5dGVzTWF4XCIgOiA1MzY4NzA5MTIwLCBcbiAgICBcInNlZ21lbnRzTWF4XCIgOiAxMCwgXG4gICAgXCJzZWdtZW50c01pblwiIDogMSwgXG4gICAgXCJtaW5TY29yZVwiIDogMCBcbiAgfSwgXG4gIFwiZmVhdHVyZXNcIiA6IFsgXG4gICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgXCJub3JtXCIgXG4gIF0sIFxuICBcImZpZWxkc1wiIDogWyBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBcImFcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICAgICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgICAgIFwicG9zaXRpb25cIiwgXG4gICAgICAgIFwibm9ybVwiIFxuICAgICAgXSwgXG4gICAgICBcImFuYWx5emVyXCIgOiBcInRleHRfZW5cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiYlwiIFxuICAgIH0gXG4gIF0sIFxuICBcImlkXCIgOiBcInByb2R1Y3RzLzcyMDI4XCIsIFxuICBcImluY2x1ZGVBbGxGaWVsZHNcIiA6IGZhbHNlLCBcbiAgXCJpc05ld2x5Q3JlYXRlZFwiIDogdHJ1ZSwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE5OTEzMDQ0Nzg3M1wiLCBcbiAgXCJwcmltYXJ5U29ydFwiIDogeyBcbiAgICBcImZpZWxkc1wiIDogWyBdLCBcbiAgICBcImNvbXByZXNzaW9uXCIgOiBcImx6NFwiIFxuICB9LCBcbiAgXCJzZWFyY2hGaWVsZFwiIDogZmFsc2UsIFxuICBcInNwYXJzZVwiIDogdHJ1ZSwgXG4gIFwic3RvcmVkVmFsdWVzXCIgOiBbIF0sIFxuICBcInRyYWNrTGlzdFBvc2l0aW9uc1wiIDogZmFsc2UsIFxuICBcInR5cGVcIiA6IFwiaW52ZXJ0ZWRcIiwgXG4gIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gIFwidmVyc2lvblwiIDogMSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQsIFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcImNvZGVcIiA6IDIwMSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNyZWF0aW5nIGFuIGludmVydGVkIGluZGV4OiIsIm5hbWUiOiJSZXN0SW5kZXhDcmVhdGVOZXdJbnZlcnRlZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestIndexCreateNewPersistent_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgcGVyc2lzdGVudCBpbmRleApuYW1lOiBSZXN0SW5kZXhDcmVhdGVOZXdQZXJzaXN0ZW50Ci0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9pbmRleD9jb2xsZWN0aW9uPSIgKyBjbjsKdmFyIGJvZHkgPSB7CiAgdHlwZTogInBlcnNpc3RlbnQiLAogIHVuaXF1ZTogZmFsc2UsCiAgZmllbGRzOiBbICJhIiwgImIiIF0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXByb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJwZXJzaXN0ZW50XCIsXG4gIFwidW5pcXVlXCI6IGZhbHNlLFxuICBcImZpZWxkc1wiOiBbXG4gICAgXCJhXCIsXG4gICAgXCJiXCJcbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI1M1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcImFcIiwgXG4gICAgXCJiXCIgXG4gIF0sIFxuICBcImlkXCIgOiBcInByb2R1Y3RzLzcyMDQ3XCIsIFxuICBcImlzTmV3bHlDcmVhdGVkXCIgOiB0cnVlLCBcbiAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MTk5MTcyMzkwOTEyXCIsIFxuICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEsIFxuICBcImVycm9yXCIgOiBmYWxzZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGluZyBhIHBlcnNpc3RlbnQgaW5kZXgiLCJuYW1lIjoiUmVzdEluZGV4Q3JlYXRlTmV3UGVyc2lzdGVudCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestIndexCreateNewTtlIndex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgVFRMIGluZGV4Cm5hbWU6IFJlc3RJbmRleENyZWF0ZU5ld1R0bEluZGV4Ci0tLQp2YXIgY24gPSAic2Vzc2lvbnMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9pbmRleD9jb2xsZWN0aW9uPSIgKyBjbjsKdmFyIGJvZHkgPSB7CiAgdHlwZTogInR0bCIsCiAgZXhwaXJlQWZ0ZXI6IDM2MDAsCiAgZmllbGRzIDogWyAiY3JlYXRlZEF0IiBdCn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXNlc3Npb25zJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJ0dGxcIixcbiAgXCJleHBpcmVBZnRlclwiOiAzNjAwLFxuICBcImZpZWxkc1wiOiBbXG4gICAgXCJjcmVhdGVkQXRcIlxuICBdXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDEgQ3JlYXRlZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMjA1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXN0aW1hdGVzXCIgOiBmYWxzZSwgXG4gIFwiZXhwaXJlQWZ0ZXJcIiA6IDM2MDAsIFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcImNyZWF0ZWRBdFwiIFxuICBdLCBcbiAgXCJpZFwiIDogXCJzZXNzaW9ucy83MjA2N1wiLCBcbiAgXCJpc05ld2x5Q3JlYXRlZFwiIDogdHJ1ZSwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE5OTE5OTY1Mzg4OFwiLCBcbiAgXCJzcGFyc2VcIiA6IHRydWUsIFxuICBcInR5cGVcIiA6IFwidHRsXCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNyZWF0aW5nIGEgVFRMIGluZGV4IiwibmFtZSI6IlJlc3RJbmRleENyZWF0ZU5ld1R0bEluZGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestIndexCreateNewZkd_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgbXVsdGktZGltZW5zaW9uYWwgaW5kZXgKbmFtZTogUmVzdEluZGV4Q3JlYXRlTmV3WmtkCi0tLQp2YXIgY24gPSAiaW50ZXJ2YWxzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCiAgICB2YXIgdXJsID0gIi9fYXBpL2luZGV4P2NvbGxlY3Rpb249IiArIGNuOwogICAgdmFyIGJvZHkgPSB7CiAgICAgIHR5cGU6ICJ6a2QiLAogICAgICBmaWVsZHM6IFsgImZyb20iLCAidG8iIF0sCiAgICAgIGZpZWxkVmFsdWVUeXBlczogImRvdWJsZSIKICAgIH07CgogICAgdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKICAgIGFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKICAgIGxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPWludGVydmFscycgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJ0eXBlXCI6IFwiemtkXCIsXG4gIFwiZmllbGRzXCI6IFtcbiAgICBcImZyb21cIixcbiAgICBcInRvXCJcbiAgXSxcbiAgXCJmaWVsZFZhbHVlVHlwZXNcIjogXCJkb3VibGVcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE5N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImZpZWxkVmFsdWVUeXBlc1wiIDogXCJkb3VibGVcIiwgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwiZnJvbVwiLCBcbiAgICBcInRvXCIgXG4gIF0sIFxuICBcImlkXCIgOiBcImludGVydmFscy83MjAzN1wiLCBcbiAgXCJpc05ld2x5Q3JlYXRlZFwiIDogdHJ1ZSwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjE5OTE1MDM3MDgxNlwiLCBcbiAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgXCJ0eXBlXCIgOiBcInprZFwiLCBcbiAgXCJ1bmlxdWVcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDEsIFxuICBcImVycm9yXCIgOiBmYWxzZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDcmVhdGluZyBhIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4IiwibmFtZSI6IlJlc3RJbmRleENyZWF0ZU5ld1prZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestIndexCreateSparsePersistent_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENyZWF0aW5nIGEgc3BhcnNlIHBlcnNpc3RlbnQgaW5kZXgKbmFtZTogUmVzdEluZGV4Q3JlYXRlU3BhcnNlUGVyc2lzdGVudAotLS0KdmFyIGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKCnZhciB1cmwgPSAiL19hcGkvaW5kZXg/Y29sbGVjdGlvbj0iICsgY247CnZhciBib2R5ID0gewogIHR5cGU6ICJwZXJzaXN0ZW50IiwKICB1bmlxdWU6IGZhbHNlLAogIHNwYXJzZTogdHJ1ZSwKICBmaWVsZHM6IFsgImEiIF0KfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDEpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleD9jb2xsZWN0aW9uPXByb2R1Y3RzJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcInR5cGVcIjogXCJwZXJzaXN0ZW50XCIsXG4gIFwidW5pcXVlXCI6IGZhbHNlLFxuICBcInNwYXJzZVwiOiB0cnVlLFxuICBcImZpZWxkc1wiOiBbXG4gICAgXCJhXCJcbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI0OFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcImFcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwicHJvZHVjdHMvNzIwNTdcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYxOTkxNzg2ODIzNjlcIiwgXG4gIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gIFwic3BhcnNlXCIgOiB0cnVlLCBcbiAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxLCBcbiAgXCJlcnJvclwiIDogZmFsc2UgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRpbmcgYSBzcGFyc2UgcGVyc2lzdGVudCBpbmRleCIsIm5hbWUiOiJSZXN0SW5kZXhDcmVhdGVTcGFyc2VQZXJzaXN0ZW50IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestIndexDeleteUniquePersistent_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0SW5kZXhEZWxldGVVbmlxdWVQZXJzaXN0ZW50Ci0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwoKdmFyIHVybCA9ICIvX2FwaS9pbmRleC8iICsgZGIucHJvZHVjdHMuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyJhIiwgImIiXSB9KS5pZDsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9pbmRleC9wcm9kdWN0cy84Mzk0OCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ4XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiaWRcIiA6IFwicHJvZHVjdHMvODM5NDhcIiwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RJbmRleERlbGV0ZVVuaXF1ZVBlcnNpc3RlbnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestIndexPrimaryIndex_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0SW5kZXhQcmltYXJ5SW5kZXgKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7Cgp2YXIgdXJsID0gIi9fYXBpL2luZGV4LyIgKyBjbiArICIvMCI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2luZGV4L3Byb2R1Y3RzLzAnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNDlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJmaWVsZHNcIiA6IFsgXG4gICAgXCJfa2V5XCIgXG4gIF0sIFxuICBcImlkXCIgOiBcInByb2R1Y3RzLzBcIiwgXG4gIFwibmFtZVwiIDogXCJwcmltYXJ5XCIsIFxuICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICBcInR5cGVcIiA6IFwicHJpbWFyeVwiLCBcbiAgXCJ1bmlxdWVcIiA6IHRydWUsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0SW5kZXhQcmltYXJ5SW5kZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestPregelCancelConnectedComponents_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENhbmNlbCBhIFByZWdlbCBqb2IgdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9yIHRvIGZyZWUgdXAgdGhlIHJlc3VsdHMgaWYgaXQgd2FzCiAgc3RhcnRlZCB3aXRoIGAic3RvcmUiOiBmYWxzZWAgYW5kIGlzIGluIHRoZSBkb25lIHN0YXRlOgpuYW1lOiBSZXN0UHJlZ2VsQ2FuY2VsQ29ubmVjdGVkQ29tcG9uZW50cwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKcHJpbnQoIjQuIENyZWF0aW5nIFByZWdlbCBncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOwoKdmFyIHVybCA9ICIvX2FwaS9jb250cm9sX3ByZWdlbCI7CnZhciBib2R5ID0gewogIGFsZ29yaXRobTogIndjYyIsCiAgZ3JhcGhOYW1lOiAiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIiwKICBwYXJhbXM6IHsKICAgIG1heEdTUzogZ3JhcGguY29tcG9uZW50cy5jb3VudCgpLAogICAgc3RvcmU6IGZhbHNlCiAgfQp9Owp2YXIgaWQgPSBpbnRlcm5hbC5hcmFuZ28uUE9TVCh1cmwsIGJvZHkpOwoKdmFyIHN0YXR1c1VybCA9ICIvX2FwaS9jb250cm9sX3ByZWdlbC8iICsgaWQ7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCJERUxFVEUiLCBzdGF0dXNVcmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpleGFtcGxlcy5kcm9wR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb250cm9sX3ByZWdlbC82OTQ2NCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuXCJcIiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNhbmNlbCBhIFByZWdlbCBqb2IgdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9yIHRvIGZyZWUgdXAgdGhlIHJlc3VsdHMgaWYgaXQgd2FzXG5zdGFydGVkIHdpdGggYFwic3RvcmVcIjogZmFsc2VgIGFuZCBpcyBpbiB0aGUgZG9uZSBzdGF0ZToiLCJuYW1lIjoiUmVzdFByZWdlbENhbmNlbENvbm5lY3RlZENvbXBvbmVudHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestPregelConnectedComponentsRemoveStatisticsId_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlbW92ZSB0aGUgcGVyc2lzdGVkIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGEgZmluaXNoZWQgUHJlZ2VsIGpvYjoKbmFtZTogUmVzdFByZWdlbENvbm5lY3RlZENvbXBvbmVudHNSZW1vdmVTdGF0aXN0aWNzSWQKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CnByaW50KCI4LiBDcmVhdGluZyBncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOwoKdmFyIHVybCA9ICIvX2FwaS9jb250cm9sX3ByZWdlbCI7CnZhciBib2R5ID0gewogIGFsZ29yaXRobTogIndjYyIsCiAgZ3JhcGhOYW1lOiAiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIiwKICBwYXJhbXM6IHsKICAgIG1heEdTUzogZ3JhcGguY29tcG9uZW50cy5jb3VudCgpLAogICAgc3RvcmU6IGZhbHNlCiAgfQp9Owp2YXIgaWQgPSBpbnRlcm5hbC5hcmFuZ28uUE9TVCh1cmwsIGJvZHkpOwoKY29uc3Qgc3RhdHVzVXJsID0gYCR7dXJsfS8ke2lkfWA7CndoaWxlICh0cnVlKSB7CiAgdmFyIHN0YXR1cyA9IGludGVybmFsLmFyYW5nby5HRVQoc3RhdHVzVXJsKTsKICBpZiAoc3RhdHVzLmVycm9yIHx8IFsiZG9uZSIsICJjYW5jZWxlZCIsICJmYXRhbCBlcnJvciJdLmluY2x1ZGVzKHN0YXR1cy5zdGF0ZSkpIHsKICAgIGFzc2VydChzdGF0dXMuc3RhdGUgPT0gImRvbmUiKTsKICAgIGJyZWFrOwogIH0gZWxzZSB7CiAgICBwcmludChgOC4gV2FpdGluZyBmb3IgUHJlZ2VsIGpvYiAke2lkfSAoJHtzdGF0dXMuc3RhdGV9KS4uLmApOwogICAgaW50ZXJuYWwuc2xlZXAoMC41KTsKICB9Cn0KCmNvbnN0IGhpc3RvcnlVcmwgPSBgL19hcGkvY29udHJvbF9wcmVnZWwvaGlzdG9yeS8ke2lkfWAKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoIkRFTEVURSIsIGhpc3RvcnlVcmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb250cm9sX3ByZWdlbC9oaXN0b3J5LzY5OTQ3JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJfaWRcIiA6IFwiX3ByZWdlbF9xdWVyaWVzLzY5OTQ3XCIsIFxuICBcIl9rZXlcIiA6IFwiNjk5NDdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYUlGUy0tRlwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJlbW92ZSB0aGUgcGVyc2lzdGVkIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGEgZmluaXNoZWQgUHJlZ2VsIGpvYjoiLCJuYW1lIjoiUmVzdFByZWdlbENvbm5lY3RlZENvbXBvbmVudHNSZW1vdmVTdGF0aXN0aWNzSWQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestPregelConnectedComponentsRemoveStatistics_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlbW92ZSB0aGUgcGVyc2lzdGVkIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGFsbCBwYXN0IFByZWdlbCBqb2JzOgpuYW1lOiBSZXN0UHJlZ2VsQ29ubmVjdGVkQ29tcG9uZW50c1JlbW92ZVN0YXRpc3RpY3MKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CnByaW50KCI3LiBDcmVhdGluZyBQcmVnZWwgZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGgiKTsKCnZhciB1cmwgPSAiL19hcGkvY29udHJvbF9wcmVnZWwiOwp2YXIgYm9keSA9IHsKICBhbGdvcml0aG06ICJ3Y2MiLAogIGdyYXBoTmFtZTogImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIsCiAgcGFyYW1zOiB7CiAgICBtYXhHU1M6IGdyYXBoLmNvbXBvbmVudHMuY291bnQoKSwKICAgIHN0b3JlOiBmYWxzZQogIH0KfTsKdmFyIGlkID0gaW50ZXJuYWwuYXJhbmdvLlBPU1QodXJsLCBib2R5KTsKCmNvbnN0IHN0YXR1c1VybCA9IGAke3VybH0vJHtpZH1gOwp3aGlsZSAodHJ1ZSkgewogIHZhciBzdGF0dXMgPSBpbnRlcm5hbC5hcmFuZ28uR0VUKHN0YXR1c1VybCk7CiAgaWYgKHN0YXR1cy5lcnJvciB8fCBbImRvbmUiLCAiY2FuY2VsZWQiLCAiZmF0YWwgZXJyb3IiXS5pbmNsdWRlcyhzdGF0dXMuc3RhdGUpKSB7CiAgICBhc3NlcnQoc3RhdHVzLnN0YXRlID09ICJkb25lIik7CiAgICBicmVhazsKICB9IGVsc2UgewogICAgcHJpbnQoYDcuIFdhaXRpbmcgZm9yIFByZWdlbCBqb2IgJHtpZH0gKCR7c3RhdHVzLnN0YXRlfSkuLi5gKTsKICAgIGludGVybmFsLnNsZWVwKDAuNSk7CiAgfQp9Cgpjb25zdCBkZWxldGVVcmwgPSAiL19hcGkvY29udHJvbF9wcmVnZWwvaGlzdG9yeSI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCJERUxFVEUiLCBkZWxldGVVcmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb250cm9sX3ByZWdlbC9oaXN0b3J5JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG50cnVlIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmVtb3ZlIHRoZSBwZXJzaXN0ZWQgZXhlY3V0aW9uIHN0YXRpc3RpY3Mgb2YgYWxsIHBhc3QgUHJlZ2VsIGpvYnM6IiwibmFtZSI6IlJlc3RQcmVnZWxDb25uZWN0ZWRDb21wb25lbnRzUmVtb3ZlU3RhdGlzdGljcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestPregelConnectedComponentsStatisticsId_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEdldCB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiBhIFByZWdlbCBqb2I6Cm5hbWU6IFJlc3RQcmVnZWxDb25uZWN0ZWRDb21wb25lbnRzU3RhdGlzdGljc0lkCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaC5qcyIpOwpwcmludCgiNi4gQ3JlYXRpbmcgUHJlZ2VsIGdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7Cgp2YXIgdXJsID0gIi9fYXBpL2NvbnRyb2xfcHJlZ2VsIjsKdmFyIGJvZHkgPSB7CiAgYWxnb3JpdGhtOiAid2NjIiwKICBncmFwaE5hbWU6ICJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGgiLAogIHBhcmFtczogewogICAgbWF4R1NTOiBncmFwaC5jb21wb25lbnRzLmNvdW50KCksCiAgICByZXN1bHRGaWVsZDogImNvbXBvbmVudCIKICB9Cn07CnZhciBpZCA9IGludGVybmFsLmFyYW5nby5QT1NUKHVybCwgYm9keSk7Cgpjb25zdCBzdGF0dXNVcmwgPSBgJHt1cmx9LyR7aWR9YDsKd2hpbGUgKHRydWUpIHsKICB2YXIgc3RhdHVzID0gaW50ZXJuYWwuYXJhbmdvLkdFVChzdGF0dXNVcmwpOwogIGlmIChzdGF0dXMuZXJyb3IgfHwgWyJkb25lIiwgImNhbmNlbGVkIiwgImZhdGFsIGVycm9yIl0uaW5jbHVkZXMoc3RhdHVzLnN0YXRlKSkgewogICAgYXNzZXJ0KHN0YXR1cy5zdGF0ZSA9PSAiZG9uZSIpOwogICAgYnJlYWs7CiAgfSBlbHNlIHsKICAgIHByaW50KGA2LiBXYWl0aW5nIGZvciBQcmVnZWwgam9iICR7aWR9ICgke3N0YXR1cy5zdGF0ZX0pLi4uYCk7CiAgICBpbnRlcm5hbC5zbGVlcCgwLjUpOwogIH0KfQoKY29uc3QgaGlzdG9yeVVybCA9IGAvX2FwaS9jb250cm9sX3ByZWdlbC9oaXN0b3J5LyR7aWR9YDsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoIkdFVCIsIGhpc3RvcnlVcmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbnRyb2xfcHJlZ2VsL2hpc3RvcnkvNjk2MTMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyODk0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiYWxnb3JpdGhtXCIgOiBcIndjY1wiLCBcbiAgXCJjcmVhdGVkXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTRaXCIsIFxuICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gIFwiZ3JhcGhMb2FkZWRcIiA6IHRydWUsIFxuICBcImdzc1wiIDogMTEsIFxuICBcImlkXCIgOiBcIjY5NjEzXCIsIFxuICBcInN0YXRlXCIgOiBcImRvbmVcIiwgXG4gIFwidHRsXCIgOiA2MDAsIFxuICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgXCJkZXRhaWxcIiA6IHsgXG4gICAgXCJhZ2dyZWdhdGVkU3RhdHVzXCIgOiB7IFxuICAgICAgXCJ0aW1lU3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxNFpcIiwgXG4gICAgICBcImdyYXBoU3RvcmVTdGF0dXNcIiA6IHsgXG4gICAgICB9LCBcbiAgICAgIFwiYWxsR3NzU3RhdHVzXCIgOiB7IFxuICAgICAgICBcIml0ZW1zXCIgOiBbIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxNzI4IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY5LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMzMTIgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjgsIFxuICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzI2NCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1NSwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNjQwIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDQ4LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDIzMDQgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzgsIFxuICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTgyNCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAyNywgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxMjk2IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDE2LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDc2OCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA4LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDM4NCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI0MCBcbiAgICAgICAgICB9IFxuICAgICAgICBdIFxuICAgICAgfSBcbiAgICB9LCBcbiAgICBcIndvcmtlclN0YXR1c1wiIDogeyBcbiAgICAgIFwiXCIgOiB7IFxuICAgICAgICBcInRpbWVTdGFtcFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE0WlwiLCBcbiAgICAgICAgXCJncmFwaFN0b3JlU3RhdHVzXCIgOiB7IFxuICAgICAgICB9LCBcbiAgICAgICAgXCJhbGxHc3NTdGF0dXNcIiA6IHsgXG4gICAgICAgICAgXCJpdGVtc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE3MjggXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY5LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzMxMiBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjgsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMjY0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1NSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI2NDAgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDQ4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjMwNCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzgsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxODI0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAyNywgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDEyOTYgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDE2LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogNzY4IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzg0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjQwIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9IFxuICB9LCBcbiAgXCJzZW5kQ291bnRcIiA6IDM3MCwgXG4gIFwiYWdncmVnYXRvcnNcIiA6IHsgXG4gIH0sIFxuICBcImdzc1RpbWVzXCIgOiBbIFxuICAgIDAuMDAwMTA0MDg1LCBcbiAgICAwLjAwMDA2ODM1OSwgXG4gICAgMC4wMDAwNDk0NzQsIFxuICAgIDAuMDAwMDU2ODQ3LCBcbiAgICAwLjAwMDA0NDc2MywgXG4gICAgMC4wMDAwNDM0OTksIFxuICAgIDAuMDAwMDQwNjMsIFxuICAgIDAuMDAwMDQwMTI3LCBcbiAgICAwLjAwMDAzNzE2MiwgXG4gICAgMC4wMDAwMzE3MjMsIFxuICAgIDAuMDAwMDM1MzcgXG4gIF0sIFxuICBcInJlY2VpdmVkQ291bnRcIiA6IDM3MCwgXG4gIFwiZXhwaXJlc1wiIDogXCIyMDI1LTA1LTIzVDE4OjI2OjE0WlwiLCBcbiAgXCJ2ZXJ0ZXhDb3VudFwiIDogMzYsIFxuICBcInN0b3JhZ2VUaW1lXCIgOiAwLjAwMDQ3ODM0OCwgXG4gIFwidG90YWxSdW50aW1lXCIgOiAwLjAwMjAxMDEzOSwgXG4gIFwicGFyYWxsZWxpc21cIiA6IDIsIFxuICBcIm1hc3RlckNvbnRleHRcIiA6IHsgXG4gIH0sIFxuICBcImVkZ2VDb3VudFwiIDogMzYsIFxuICBcInN0YXJ0dXBUaW1lXCIgOiAwLjAwMDI3MTYyNSwgXG4gIFwiY29tcHV0YXRpb25UaW1lXCIgOiAwLjAwMTIzMzMxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkdldCB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiBhIFByZWdlbCBqb2I6IiwibmFtZSI6IlJlc3RQcmVnZWxDb25uZWN0ZWRDb21wb25lbnRzU3RhdGlzdGljc0lkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestPregelConnectedComponentsStatistics_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEdldCB0aGUgc3RhdHVzIG9mIGFsbCBhY3RpdmUgYW5kIHBhc3QgUHJlZ2VsIGpvYnM6Cm5hbWU6IFJlc3RQcmVnZWxDb25uZWN0ZWRDb21wb25lbnRzU3RhdGlzdGljcwotLS0KdmFyIGFzc2VydEluc3RhbmNlT2YgPSByZXF1aXJlKCJqc3VuaXR5IikuanNVbml0eS5hc3NlcnRpb25zLmFzc2VydEluc3RhbmNlT2Y7CnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoLmpzIik7CnByaW50KCI1LiBDcmVhdGluZyBQcmVnZWwgZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGgiKTsKCnZhciB1cmwgPSAiL19hcGkvY29udHJvbF9wcmVnZWwiOwp2YXIgYm9keSA9IHsKICBhbGdvcml0aG06ICJ3Y2MiLAogIGdyYXBoTmFtZTogImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIsCiAgcGFyYW1zOiB7CiAgICBtYXhHU1M6IGdyYXBoLmNvbXBvbmVudHMuY291bnQoKSwKICAgIHJlc3VsdEZpZWxkOiAiY29tcG9uZW50IgogIH0KfTsKCmNvbnN0IGlkID0gaW50ZXJuYWwuYXJhbmdvLlBPU1QodXJsLCBib2R5KTsKY29uc3QgaGlzdG9yeVVybCA9IGAvX2FwaS9jb250cm9sX3ByZWdlbC9oaXN0b3J5YDsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCJHRVQiLCBoaXN0b3J5VXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmFzc2VydEluc3RhbmNlT2YoQXJyYXksIHJlc3BvbnNlLnBhcnNlZEJvZHkpOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5sZW5ndGggPiAwKTsKCmludGVybmFsLmFyYW5nby5ERUxFVEUodXJsICsgaWQpOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGgiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbnRyb2xfcHJlZ2VsL2hpc3RvcnknIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5MjI1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIHsgXG4gICAgXCJhbGdvcml0aG1cIiA6IFwid2NjXCIsIFxuICAgIFwiY3JlYXRlZFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjEyWlwiLCBcbiAgICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gICAgXCJncmFwaExvYWRlZFwiIDogdHJ1ZSwgXG4gICAgXCJnc3NcIiA6IDExLCBcbiAgICBcImlkXCIgOiBcIjY4OTY1XCIsIFxuICAgIFwic3RhdGVcIiA6IFwiZG9uZVwiLCBcbiAgICBcInR0bFwiIDogNjAwLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgICBcImRldGFpbFwiIDogeyBcbiAgICAgIFwiYWdncmVnYXRlZFN0YXR1c1wiIDogeyBcbiAgICAgICAgXCJ0aW1lU3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxMlpcIiwgXG4gICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiYWxsR3NzU3RhdHVzXCIgOiB7IFxuICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxNzI4IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMzMTIgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzI2NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNTUsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNjQwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA0OCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDIzMDQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTgyNCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMjcsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxMjk2IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAxNiwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDc2OCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogOCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDM4NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI0MCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCJ3b3JrZXJTdGF0dXNcIiA6IHsgXG4gICAgICAgIFwiXCIgOiB7IFxuICAgICAgICAgIFwidGltZVN0YW1wXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTJaXCIsIFxuICAgICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImFsbEdzc1N0YXR1c1wiIDogeyBcbiAgICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDAgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTcyOCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY5LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMzEyIFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMyNjQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1NSwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjY0MCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDQ4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyMzA0IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE4MjQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAyNywgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTI5NiBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDE2LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiA3NjggXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzODQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNDAgXG4gICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBdIFxuICAgICAgICAgIH0gXG4gICAgICAgIH0gXG4gICAgICB9IFxuICAgIH0sIFxuICAgIFwic2VuZENvdW50XCIgOiAzNzAsIFxuICAgIFwiYWdncmVnYXRvcnNcIiA6IHsgXG4gICAgfSwgXG4gICAgXCJnc3NUaW1lc1wiIDogWyBcbiAgICAgIDAuMDAwMTA5MzYxLCBcbiAgICAgIDAuMDAwMDgxNzI1LCBcbiAgICAgIDAuMDAwMDUyMjc5LCBcbiAgICAgIDAuMDAwMDQ4MDg4LCBcbiAgICAgIDAuMDAwMDY5MTY1LCBcbiAgICAgIDAuMDAwMDQ4NTc4LCBcbiAgICAgIDAuMDAwMDM1MDU2LCBcbiAgICAgIDAuMDAwMDQ4MTA5LCBcbiAgICAgIDAuMDAwMDQ3MjczLCBcbiAgICAgIDAuMDAwMDQyMzI2LCBcbiAgICAgIDAuMDAwMDQzNzAyIFxuICAgIF0sIFxuICAgIFwicmVjZWl2ZWRDb3VudFwiIDogMzcwLCBcbiAgICBcImV4cGlyZXNcIiA6IFwiMjAyNS0wNS0yM1QxODoyNjoxMlpcIiwgXG4gICAgXCJ2ZXJ0ZXhDb3VudFwiIDogMzYsIFxuICAgIFwic3RvcmFnZVRpbWVcIiA6IDAuMDAwNTk5MzM0LCBcbiAgICBcInRvdGFsUnVudGltZVwiIDogMC4wMDI0NTU3NTgsIFxuICAgIFwicGFyYWxsZWxpc21cIiA6IDIsIFxuICAgIFwibWFzdGVyQ29udGV4dFwiIDogeyBcbiAgICB9LCBcbiAgICBcImVkZ2VDb3VudFwiIDogMzYsIFxuICAgIFwic3RhcnR1cFRpbWVcIiA6IDAuMDAwNDgwOTc0LCBcbiAgICBcImNvbXB1dGF0aW9uVGltZVwiIDogMC4wMDEzNTAzMDQgXG4gIH0sIFxuICB7IFxuICAgIFwiYWxnb3JpdGhtXCIgOiBcIndjY1wiLCBcbiAgICBcImNyZWF0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxM1pcIiwgXG4gICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgIFwiZ3JhcGhMb2FkZWRcIiA6IHRydWUsIFxuICAgIFwiZ3NzXCIgOiAxMSwgXG4gICAgXCJpZFwiIDogXCI2OTEzN1wiLCBcbiAgICBcInN0YXRlXCIgOiBcImRvbmVcIiwgXG4gICAgXCJ0dGxcIiA6IDYwMCwgXG4gICAgXCJ1c2VyXCIgOiBcInJvb3RcIiwgXG4gICAgXCJkZXRhaWxcIiA6IHsgXG4gICAgICBcImFnZ3JlZ2F0ZWRTdGF0dXNcIiA6IHsgXG4gICAgICAgIFwidGltZVN0YW1wXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTNaXCIsIFxuICAgICAgICBcImdyYXBoU3RvcmVTdGF0dXNcIiA6IHsgXG4gICAgICAgIH0sIFxuICAgICAgICBcImFsbEdzc1N0YXR1c1wiIDogeyBcbiAgICAgICAgICBcIml0ZW1zXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDAgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTcyOCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjksIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMzEyIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMyNjQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDU1LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjY0MCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNDgsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyMzA0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzOCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE4MjQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDI3LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTI5NiBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMTYsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiA3NjggXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDgsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzODQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDUsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNDAgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIF0gXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIFwid29ya2VyU3RhdHVzXCIgOiB7IFxuICAgICAgICBcIlwiIDogeyBcbiAgICAgICAgICBcInRpbWVTdGFtcFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjEzWlwiLCBcbiAgICAgICAgICBcImdyYXBoU3RvcmVTdGF0dXNcIiA6IHsgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJhbGxHc3NTdGF0dXNcIiA6IHsgXG4gICAgICAgICAgICBcIml0ZW1zXCIgOiBbIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAwIFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE3MjggXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OSwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzMxMiBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMjY0IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNTUsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI2NDAgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA0OCwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjMwNCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxODI0IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMjcsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDEyOTYgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAxNiwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogNzY4IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogOCwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzg0IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNSwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjQwIFxuICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgXSBcbiAgICAgICAgICB9IFxuICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9LCBcbiAgICBcInNlbmRDb3VudFwiIDogMzcwLCBcbiAgICBcImFnZ3JlZ2F0b3JzXCIgOiB7IFxuICAgIH0sIFxuICAgIFwiZ3NzVGltZXNcIiA6IFsgXG4gICAgICAwLjAwMDA5ODA3MywgXG4gICAgICAwLjAwMDA3MDEwMywgXG4gICAgICAwLjAwMDA4Nzg3MiwgXG4gICAgICAwLjAwMDA1NDU2NiwgXG4gICAgICAwLjAwMDA1Mjk2MywgXG4gICAgICAwLjAwMDA1MTM5OSwgXG4gICAgICAwLjAwMDA0NzIsIFxuICAgICAgMC4wMDAwNDU0NzQsIFxuICAgICAgMC4wMDAwNDg3NDksIFxuICAgICAgMC4wMDAwMzc2MDksIFxuICAgICAgMC4wMDAwNDQ0MjQgXG4gICAgXSwgXG4gICAgXCJyZWNlaXZlZENvdW50XCIgOiAzNzAsIFxuICAgIFwiZXhwaXJlc1wiIDogXCIyMDI1LTA1LTIzVDE4OjI2OjEzWlwiLCBcbiAgICBcInZlcnRleENvdW50XCIgOiAzNiwgXG4gICAgXCJzdG9yYWdlVGltZVwiIDogMC4wMDA0NDQ5MzksIFxuICAgIFwidG90YWxSdW50aW1lXCIgOiAwLjAwMjA5NjUyLCBcbiAgICBcInBhcmFsbGVsaXNtXCIgOiAyLCBcbiAgICBcIm1hc3RlckNvbnRleHRcIiA6IHsgXG4gICAgfSwgXG4gICAgXCJlZGdlQ291bnRcIiA6IDM2LCBcbiAgICBcInN0YXJ0dXBUaW1lXCIgOiAwLjAwMDMyNjQ5MywgXG4gICAgXCJjb21wdXRhdGlvblRpbWVcIiA6IDAuMDAxMjkzMjA2IFxuICB9LCBcbiAgeyBcbiAgICBcImFsZ29yaXRobVwiIDogXCJ3Y2NcIiwgXG4gICAgXCJjcmVhdGVkXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTNaXCIsIFxuICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICBcImdyYXBoTG9hZGVkXCIgOiB0cnVlLCBcbiAgICBcImdzc1wiIDogNiwgXG4gICAgXCJpZFwiIDogXCI2OTMwNlwiLCBcbiAgICBcInN0YXRlXCIgOiBcImNhbmNlbGVkXCIsIFxuICAgIFwidHRsXCIgOiA2MDAsIFxuICAgIFwidXNlclwiIDogXCJyb290XCIsIFxuICAgIFwiZXhwaXJlc1wiIDogXCIyMDI1LTA1LTIzVDE4OjI2OjEzWlwiIFxuICB9LCBcbiAgeyBcbiAgICBcImFsZ29yaXRobVwiIDogXCJ3Y2NcIiwgXG4gICAgXCJjcmVhdGVkXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTRaXCIsIFxuICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICBcImdyYXBoTG9hZGVkXCIgOiBmYWxzZSwgXG4gICAgXCJnc3NcIiA6IDAsIFxuICAgIFwiaWRcIiA6IFwiNjk0NjRcIiwgXG4gICAgXCJzdGF0ZVwiIDogXCJjYW5jZWxlZFwiLCBcbiAgICBcInR0bFwiIDogNjAwLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgICBcImV4cGlyZXNcIiA6IFwiMjAyNS0wNS0yM1QxODoyNjoxNFpcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJhbGdvcml0aG1cIiA6IFwid2NjXCIsIFxuICAgIFwiY3JlYXRlZFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE0WlwiLCBcbiAgICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gICAgXCJncmFwaExvYWRlZFwiIDogdHJ1ZSwgXG4gICAgXCJnc3NcIiA6IDExLCBcbiAgICBcImlkXCIgOiBcIjY5NjEzXCIsIFxuICAgIFwic3RhdGVcIiA6IFwiZG9uZVwiLCBcbiAgICBcInR0bFwiIDogNjAwLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgICBcImRldGFpbFwiIDogeyBcbiAgICAgIFwiYWdncmVnYXRlZFN0YXR1c1wiIDogeyBcbiAgICAgICAgXCJ0aW1lU3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxNFpcIiwgXG4gICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiYWxsR3NzU3RhdHVzXCIgOiB7IFxuICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxNzI4IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMzMTIgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzI2NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNTUsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNjQwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA0OCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDIzMDQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTgyNCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMjcsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxMjk2IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAxNiwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDc2OCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogOCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDM4NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI0MCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCJ3b3JrZXJTdGF0dXNcIiA6IHsgXG4gICAgICAgIFwiXCIgOiB7IFxuICAgICAgICAgIFwidGltZVN0YW1wXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTRaXCIsIFxuICAgICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImFsbEdzc1N0YXR1c1wiIDogeyBcbiAgICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDAgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTcyOCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY5LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMzEyIFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMyNjQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1NSwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjY0MCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDQ4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyMzA0IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE4MjQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAyNywgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTI5NiBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDE2LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiA3NjggXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzODQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNDAgXG4gICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBdIFxuICAgICAgICAgIH0gXG4gICAgICAgIH0gXG4gICAgICB9IFxuICAgIH0sIFxuICAgIFwic2VuZENvdW50XCIgOiAzNzAsIFxuICAgIFwiYWdncmVnYXRvcnNcIiA6IHsgXG4gICAgfSwgXG4gICAgXCJnc3NUaW1lc1wiIDogWyBcbiAgICAgIDAuMDAwMTA0MDg1LCBcbiAgICAgIDAuMDAwMDY4MzU5LCBcbiAgICAgIDAuMDAwMDQ5NDc0LCBcbiAgICAgIDAuMDAwMDU2ODQ3LCBcbiAgICAgIDAuMDAwMDQ0NzYzLCBcbiAgICAgIDAuMDAwMDQzNDk5LCBcbiAgICAgIDAuMDAwMDQwNjMsIFxuICAgICAgMC4wMDAwNDAxMjcsIFxuICAgICAgMC4wMDAwMzcxNjIsIFxuICAgICAgMC4wMDAwMzE3MjMsIFxuICAgICAgMC4wMDAwMzUzNyBcbiAgICBdLCBcbiAgICBcInJlY2VpdmVkQ291bnRcIiA6IDM3MCwgXG4gICAgXCJleHBpcmVzXCIgOiBcIjIwMjUtMDUtMjNUMTg6MjY6MTRaXCIsIFxuICAgIFwidmVydGV4Q291bnRcIiA6IDM2LCBcbiAgICBcInN0b3JhZ2VUaW1lXCIgOiAwLjAwMDQ3ODM0OCwgXG4gICAgXCJ0b3RhbFJ1bnRpbWVcIiA6IDAuMDAyMDEwMTM5LCBcbiAgICBcInBhcmFsbGVsaXNtXCIgOiAyLCBcbiAgICBcIm1hc3RlckNvbnRleHRcIiA6IHsgXG4gICAgfSwgXG4gICAgXCJlZGdlQ291bnRcIiA6IDM2LCBcbiAgICBcInN0YXJ0dXBUaW1lXCIgOiAwLjAwMDI3MTYyNSwgXG4gICAgXCJjb21wdXRhdGlvblRpbWVcIiA6IDAuMDAxMjMzMzEgXG4gIH0sIFxuICB7IFxuICAgIFwiYWxnb3JpdGhtXCIgOiBcIndjY1wiLCBcbiAgICBcImNyZWF0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxNFpcIiwgXG4gICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgIFwiZ3JhcGhMb2FkZWRcIiA6IHRydWUsIFxuICAgIFwiZ3NzXCIgOiAwLCBcbiAgICBcImlkXCIgOiBcIjY5NzgyXCIsIFxuICAgIFwic3RhdGVcIiA6IFwicnVubmluZ1wiLCBcbiAgICBcInR0bFwiIDogNjAwLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkdldCB0aGUgc3RhdHVzIG9mIGFsbCBhY3RpdmUgYW5kIHBhc3QgUHJlZ2VsIGpvYnM6IiwibmFtZSI6IlJlc3RQcmVnZWxDb25uZWN0ZWRDb21wb25lbnRzU3RhdGlzdGljcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestPregelStartConnectedComponents_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJ1biB0aGUgV2Vha2x5IENvbm5lY3RlZCBDb21wb25lbnRzIChXQ0MpIGFsZ29yaXRobSBhZ2FpbnN0IGEgZ3JhcGggYW5kIHN0b3JlCiAgdGhlIHJlc3VsdHMgaW4gdGhlIHZlcnRpY2VzIGFzIGF0dHJpYnV0ZSBgY29tcG9uZW50YDoKbmFtZTogUmVzdFByZWdlbFN0YXJ0Q29ubmVjdGVkQ29tcG9uZW50cwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKcHJpbnQoIjEuIENyZWF0aW5nIFByZWdlbCBncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOwoKdmFyIHVybCA9ICIvX2FwaS9jb250cm9sX3ByZWdlbCI7CnZhciBib2R5ID0gewogIGFsZ29yaXRobTogIndjYyIsCiAgZ3JhcGhOYW1lOiAiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIiwKICBwYXJhbXM6IHsKICAgIG1heEdTUzogZ3JhcGguY29tcG9uZW50cy5jb3VudCgpLAogICAgcmVzdWx0RmllbGQ6ICJjb21wb25lbnQiLAogIH0KfQp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgiUE9TVCIsIHVybCwgYm9keSk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7Cgp2YXIgaWQgPSByZXNwb25zZS5wYXJzZWRCb2R5Owp2YXIgdXJsID0gIi9fYXBpL2NvbnRyb2xfcHJlZ2VsLyIgKyBpZDsKd2hpbGUgKHRydWUpIHsKICB2YXIgc3RhdHVzID0gaW50ZXJuYWwuYXJhbmdvLkdFVCh1cmwpOwogIGlmIChbImRvbmUiLCAiY2FuY2VsZWQiLCAiZmF0YWwgZXJyb3IiXS5pbmNsdWRlcyhzdGF0dXMuc3RhdGUpKSB7CiAgICBhc3NlcnQoc3RhdHVzLnN0YXRlID09ICJkb25lIik7CiAgICBicmVhazsKICB9IGVsc2UgewogICAgcHJpbnQoYDEuIFdhaXRpbmcgZm9yIFByZWdlbCBqb2IgJHtpZH0gKCR7c3RhdHVzLnN0YXRlfSkuLi5gKTsKICAgIGludGVybmFsLnNsZWVwKDAuNSk7CiAgfQp9CmV4YW1wbGVzLmRyb3BHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jb250cm9sX3ByZWdlbCcgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJhbGdvcml0aG1cIjogXCJ3Y2NcIixcbiAgXCJncmFwaE5hbWVcIjogXCJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGhcIixcbiAgXCJwYXJhbXNcIjoge1xuICAgIFwibWF4R1NTXCI6IDM2LFxuICAgIFwicmVzdWx0RmllbGRcIjogXCJjb21wb25lbnRcIlxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuXCI2ODk2NVwiIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUnVuIHRoZSBXZWFrbHkgQ29ubmVjdGVkIENvbXBvbmVudHMgKFdDQykgYWxnb3JpdGhtIGFnYWluc3QgYSBncmFwaCBhbmQgc3RvcmVcbnRoZSByZXN1bHRzIGluIHRoZSB2ZXJ0aWNlcyBhcyBhdHRyaWJ1dGUgYGNvbXBvbmVudGA6IiwibmFtZSI6IlJlc3RQcmVnZWxTdGFydENvbm5lY3RlZENvbXBvbmVudHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestPregelStatusAllConnectedComponents_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEdldCB0aGUgc3RhdHVzIG9mIGFsbCBhY3RpdmUgUHJlZ2VsIGpvYnM6Cm5hbWU6IFJlc3RQcmVnZWxTdGF0dXNBbGxDb25uZWN0ZWRDb21wb25lbnRzCi0tLQp2YXIgYXNzZXJ0SW5zdGFuY2VPZiA9IHJlcXVpcmUoImpzdW5pdHkiKS5qc1VuaXR5LmFzc2VydGlvbnMuYXNzZXJ0SW5zdGFuY2VPZjsKdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGguanMiKTsKcHJpbnQoIjIuIENyZWF0aW5nIFByZWdlbCBncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOwoKdmFyIHVybCA9ICIvX2FwaS9jb250cm9sX3ByZWdlbCI7CnZhciBib2R5ID0gewogIGFsZ29yaXRobTogIndjYyIsCiAgZ3JhcGhOYW1lOiAiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIiwKICBwYXJhbXM6IHsKICAgIG1heEdTUzogZ3JhcGguY29tcG9uZW50cy5jb3VudCgpLAogICAgcmVzdWx0RmllbGQ6ICJjb21wb25lbnQiCiAgfQp9Owp2YXIgaWQgPSBpbnRlcm5hbC5hcmFuZ28uUE9TVCh1cmwsIGJvZHkpOwoKdmFyIHVybCA9ICIvX2FwaS9jb250cm9sX3ByZWdlbC8iOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoIkdFVCIsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwphc3NlcnRJbnN0YW5jZU9mKEFycmF5LCByZXNwb25zZS5wYXJzZWRCb2R5KTsKYXNzZXJ0KHJlc3BvbnNlLnBhcnNlZEJvZHkubGVuZ3RoID4gMCk7CgppbnRlcm5hbC5hcmFuZ28uREVMRVRFKHVybCArIGlkKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmV4YW1wbGVzLmRyb3BHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbnRyb2xfcHJlZ2VsLyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDU5NTBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcImFsZ29yaXRobVwiIDogXCJ3Y2NcIiwgXG4gICAgXCJjcmVhdGVkXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTJaXCIsIFxuICAgIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiLCBcbiAgICBcImdyYXBoTG9hZGVkXCIgOiB0cnVlLCBcbiAgICBcImdzc1wiIDogMTEsIFxuICAgIFwiaWRcIiA6IFwiNjg5NjVcIiwgXG4gICAgXCJzdGF0ZVwiIDogXCJkb25lXCIsIFxuICAgIFwidHRsXCIgOiA2MDAsIFxuICAgIFwidXNlclwiIDogXCJyb290XCIsIFxuICAgIFwiZGV0YWlsXCIgOiB7IFxuICAgICAgXCJhZ2dyZWdhdGVkU3RhdHVzXCIgOiB7IFxuICAgICAgICBcInRpbWVTdGFtcFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjEyWlwiLCBcbiAgICAgICAgXCJncmFwaFN0b3JlU3RhdHVzXCIgOiB7IFxuICAgICAgICB9LCBcbiAgICAgICAgXCJhbGxHc3NTdGF0dXNcIiA6IHsgXG4gICAgICAgICAgXCJpdGVtc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE3MjggXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY5LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzMxMiBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjgsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMjY0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1NSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI2NDAgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDQ4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjMwNCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzgsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxODI0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAyNywgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDEyOTYgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDE2LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogNzY4IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzg0IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjQwIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9IFxuICAgICAgfSwgXG4gICAgICBcIndvcmtlclN0YXR1c1wiIDogeyBcbiAgICAgICAgXCJcIiA6IHsgXG4gICAgICAgICAgXCJ0aW1lU3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxMlpcIiwgXG4gICAgICAgICAgXCJncmFwaFN0b3JlU3RhdHVzXCIgOiB7IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiYWxsR3NzU3RhdHVzXCIgOiB7IFxuICAgICAgICAgICAgXCJpdGVtc1wiIDogWyBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxNzI4IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjksIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMzMTIgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OCwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzI2NCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDU1LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNjQwIFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNDgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDIzMDQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzOCwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTgyNCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDI3LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxMjk2IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMTYsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDc2OCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDM4NCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDUsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI0MCBcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIF0gXG4gICAgICAgICAgfSBcbiAgICAgICAgfSBcbiAgICAgIH0gXG4gICAgfSwgXG4gICAgXCJzZW5kQ291bnRcIiA6IDM3MCwgXG4gICAgXCJhZ2dyZWdhdG9yc1wiIDogeyBcbiAgICB9LCBcbiAgICBcImdzc1RpbWVzXCIgOiBbIFxuICAgICAgMC4wMDAxMDkzNjEsIFxuICAgICAgMC4wMDAwODE3MjUsIFxuICAgICAgMC4wMDAwNTIyNzksIFxuICAgICAgMC4wMDAwNDgwODgsIFxuICAgICAgMC4wMDAwNjkxNjUsIFxuICAgICAgMC4wMDAwNDg1NzgsIFxuICAgICAgMC4wMDAwMzUwNTYsIFxuICAgICAgMC4wMDAwNDgxMDksIFxuICAgICAgMC4wMDAwNDcyNzMsIFxuICAgICAgMC4wMDAwNDIzMjYsIFxuICAgICAgMC4wMDAwNDM3MDIgXG4gICAgXSwgXG4gICAgXCJyZWNlaXZlZENvdW50XCIgOiAzNzAsIFxuICAgIFwiZXhwaXJlc1wiIDogXCIyMDI1LTA1LTIzVDE4OjI2OjEyWlwiLCBcbiAgICBcInZlcnRleENvdW50XCIgOiAzNiwgXG4gICAgXCJzdG9yYWdlVGltZVwiIDogMC4wMDA1OTkzMzQsIFxuICAgIFwidG90YWxSdW50aW1lXCIgOiAwLjAwMjQ1NTc1OCwgXG4gICAgXCJwYXJhbGxlbGlzbVwiIDogMiwgXG4gICAgXCJtYXN0ZXJDb250ZXh0XCIgOiB7IFxuICAgIH0sIFxuICAgIFwiZWRnZUNvdW50XCIgOiAzNiwgXG4gICAgXCJzdGFydHVwVGltZVwiIDogMC4wMDA0ODA5NzQsIFxuICAgIFwiY29tcHV0YXRpb25UaW1lXCIgOiAwLjAwMTM1MDMwNCBcbiAgfSwgXG4gIHsgXG4gICAgXCJhbGdvcml0aG1cIiA6IFwid2NjXCIsIFxuICAgIFwiY3JlYXRlZFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjEzWlwiLCBcbiAgICBcImRhdGFiYXNlXCIgOiBcIl9zeXN0ZW1cIiwgXG4gICAgXCJncmFwaExvYWRlZFwiIDogdHJ1ZSwgXG4gICAgXCJnc3NcIiA6IDExLCBcbiAgICBcImlkXCIgOiBcIjY5MTM3XCIsIFxuICAgIFwic3RhdGVcIiA6IFwiZG9uZVwiLCBcbiAgICBcInR0bFwiIDogNjAwLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgICBcImRldGFpbFwiIDogeyBcbiAgICAgIFwiYWdncmVnYXRlZFN0YXR1c1wiIDogeyBcbiAgICAgICAgXCJ0aW1lU3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxM1pcIiwgXG4gICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiYWxsR3NzU3RhdHVzXCIgOiB7IFxuICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxNzI4IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMzMTIgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzI2NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNTUsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNjQwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA0OCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDIzMDQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTgyNCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMjcsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxMjk2IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAxNiwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDc2OCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogOCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDM4NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI0MCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCJ3b3JrZXJTdGF0dXNcIiA6IHsgXG4gICAgICAgIFwiXCIgOiB7IFxuICAgICAgICAgIFwidGltZVN0YW1wXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTNaXCIsIFxuICAgICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImFsbEdzc1N0YXR1c1wiIDogeyBcbiAgICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDAgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTcyOCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY5LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMzEyIFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNjgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMyNjQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1NSwgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjY0MCBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDQ4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyMzA0IFxuICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzgsIFxuICAgICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE4MjQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAyNywgXG4gICAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTI5NiBcbiAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDE2LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiA3NjggXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA4LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzODQgXG4gICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA1LCBcbiAgICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNDAgXG4gICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBdIFxuICAgICAgICAgIH0gXG4gICAgICAgIH0gXG4gICAgICB9IFxuICAgIH0sIFxuICAgIFwic2VuZENvdW50XCIgOiAzNzAsIFxuICAgIFwiYWdncmVnYXRvcnNcIiA6IHsgXG4gICAgfSwgXG4gICAgXCJnc3NUaW1lc1wiIDogWyBcbiAgICAgIDAuMDAwMDk4MDczLCBcbiAgICAgIDAuMDAwMDcwMTAzLCBcbiAgICAgIDAuMDAwMDg3ODcyLCBcbiAgICAgIDAuMDAwMDU0NTY2LCBcbiAgICAgIDAuMDAwMDUyOTYzLCBcbiAgICAgIDAuMDAwMDUxMzk5LCBcbiAgICAgIDAuMDAwMDQ3MiwgXG4gICAgICAwLjAwMDA0NTQ3NCwgXG4gICAgICAwLjAwMDA0ODc0OSwgXG4gICAgICAwLjAwMDAzNzYwOSwgXG4gICAgICAwLjAwMDA0NDQyNCBcbiAgICBdLCBcbiAgICBcInJlY2VpdmVkQ291bnRcIiA6IDM3MCwgXG4gICAgXCJleHBpcmVzXCIgOiBcIjIwMjUtMDUtMjNUMTg6MjY6MTNaXCIsIFxuICAgIFwidmVydGV4Q291bnRcIiA6IDM2LCBcbiAgICBcInN0b3JhZ2VUaW1lXCIgOiAwLjAwMDQ0NDkzOSwgXG4gICAgXCJ0b3RhbFJ1bnRpbWVcIiA6IDAuMDAyMDk2NTIsIFxuICAgIFwicGFyYWxsZWxpc21cIiA6IDIsIFxuICAgIFwibWFzdGVyQ29udGV4dFwiIDogeyBcbiAgICB9LCBcbiAgICBcImVkZ2VDb3VudFwiIDogMzYsIFxuICAgIFwic3RhcnR1cFRpbWVcIiA6IDAuMDAwMzI2NDkzLCBcbiAgICBcImNvbXB1dGF0aW9uVGltZVwiIDogMC4wMDEyOTMyMDYgXG4gIH0sIFxuICB7IFxuICAgIFwiaWRcIiA6IFwiNjkzMDZcIiwgXG4gICAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICAgIFwiYWxnb3JpdGhtXCIgOiBcIndjY1wiLCBcbiAgICBcImNyZWF0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxM1pcIiwgXG4gICAgXCJ0dGxcIiA6IDYwMCwgXG4gICAgXCJzdGF0ZVwiIDogXCJsb2FkaW5nXCIsIFxuICAgIFwiZ3NzXCIgOiAwLCBcbiAgICBcImdyYXBoTG9hZGVkXCIgOiBmYWxzZSwgXG4gICAgXCJ1c2VyXCIgOiBcInJvb3RcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJHZXQgdGhlIHN0YXR1cyBvZiBhbGwgYWN0aXZlIFByZWdlbCBqb2JzOiIsIm5hbWUiOiJSZXN0UHJlZ2VsU3RhdHVzQWxsQ29ubmVjdGVkQ29tcG9uZW50cyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestPregelStatusConnectedComponents_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEdldCB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiBhIFByZWdlbCBqb2I6Cm5hbWU6IFJlc3RQcmVnZWxTdGF0dXNDb25uZWN0ZWRDb21wb25lbnRzCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaC5qcyIpOwpwcmludCgiMy4gQ3JlYXRpbmcgUHJlZ2VsIGdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoIik7Cgp2YXIgdXJsID0gIi9fYXBpL2NvbnRyb2xfcHJlZ2VsIjsKdmFyIGJvZHkgPSB7CiAgYWxnb3JpdGhtOiAid2NjIiwKICBncmFwaE5hbWU6ICJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGgiLAogIHBhcmFtczogewogICAgbWF4R1NTOiBncmFwaC5jb21wb25lbnRzLmNvdW50KCksCiAgICByZXN1bHRGaWVsZDogImNvbXBvbmVudCIKICB9Cn07CnZhciBpZCA9IGludGVybmFsLmFyYW5nby5QT1NUKHVybCwgYm9keSk7CnZhciB1cmwgPSAiL19hcGkvY29udHJvbF9wcmVnZWwvIiArIGlkOwp3aGlsZSAodHJ1ZSkgewogIHZhciBzdGF0dXMgPSBpbnRlcm5hbC5hcmFuZ28uR0VUKHVybCk7CiAgaWYgKHN0YXR1cy5lcnJvciB8fCBbImRvbmUiLCAiY2FuY2VsZWQiLCAiZmF0YWwgZXJyb3IiXS5pbmNsdWRlcyhzdGF0dXMuc3RhdGUpKSB7CiAgICBhc3NlcnQoc3RhdHVzLnN0YXRlID09ICJkb25lIik7CiAgICBicmVhazsKICB9IGVsc2UgewogICAgcHJpbnQoYDMuIFdhaXRpbmcgZm9yIFByZWdlbCBqb2IgJHtpZH0gKCR7c3RhdHVzLnN0YXRlfSkuLi5gKTsKICAgIGludGVybmFsLnNsZWVwKDAuNSk7CiAgfQp9Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgiR0VUIiwgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpleGFtcGxlcy5kcm9wR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbnRyb2xfcHJlZ2VsLzY5MTM3JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMjg5M1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImFsZ29yaXRobVwiIDogXCJ3Y2NcIiwgXG4gIFwiY3JlYXRlZFwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjEzWlwiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICBcImdyYXBoTG9hZGVkXCIgOiB0cnVlLCBcbiAgXCJnc3NcIiA6IDExLCBcbiAgXCJpZFwiIDogXCI2OTEzN1wiLCBcbiAgXCJzdGF0ZVwiIDogXCJkb25lXCIsIFxuICBcInR0bFwiIDogNjAwLCBcbiAgXCJ1c2VyXCIgOiBcInJvb3RcIiwgXG4gIFwiZGV0YWlsXCIgOiB7IFxuICAgIFwiYWdncmVnYXRlZFN0YXR1c1wiIDogeyBcbiAgICAgIFwidGltZVN0YW1wXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MTNaXCIsIFxuICAgICAgXCJncmFwaFN0b3JlU3RhdHVzXCIgOiB7IFxuICAgICAgfSwgXG4gICAgICBcImFsbEdzc1N0YXR1c1wiIDogeyBcbiAgICAgICAgXCJpdGVtc1wiIDogWyBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDAgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTcyOCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OSwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzMzEyIFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY4LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMyNjQgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNTUsIFxuICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMjY0MCBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA0OCwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyMzA0IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIHsgXG4gICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM4LCBcbiAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDE4MjQgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMjcsIFxuICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTI5NiBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICB7IFxuICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAxNiwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiA3NjggXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogOCwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAzODQgXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgeyBcbiAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNSwgXG4gICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNDAgXG4gICAgICAgICAgfSBcbiAgICAgICAgXSBcbiAgICAgIH0gXG4gICAgfSwgXG4gICAgXCJ3b3JrZXJTdGF0dXNcIiA6IHsgXG4gICAgICBcIlwiIDogeyBcbiAgICAgICAgXCJ0aW1lU3RhbXBcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxM1pcIiwgXG4gICAgICAgIFwiZ3JhcGhTdG9yZVN0YXR1c1wiIDogeyBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiYWxsR3NzU3RhdHVzXCIgOiB7IFxuICAgICAgICAgIFwiaXRlbXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxNzI4IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA2OSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDMzMTIgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDY4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMzI2NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNTUsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAyNjQwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiA0OCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDIzMDQgXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidmVydGljZXNQcm9jZXNzZWRcIiA6IDM2LCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1NlbnRcIiA6IDAsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzUmVjZWl2ZWRcIiA6IDM4LCBcbiAgICAgICAgICAgICAgXCJtZW1vcnlCeXRlc1VzZWRGb3JNZXNzYWdlc1wiIDogMTgyNCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogMjcsIFxuICAgICAgICAgICAgICBcIm1lbW9yeUJ5dGVzVXNlZEZvck1lc3NhZ2VzXCIgOiAxMjk2IFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInZlcnRpY2VzUHJvY2Vzc2VkXCIgOiAzNiwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNTZW50XCIgOiAwLCBcbiAgICAgICAgICAgICAgXCJtZXNzYWdlc1JlY2VpdmVkXCIgOiAxNiwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDc2OCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogOCwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDM4NCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ2ZXJ0aWNlc1Byb2Nlc3NlZFwiIDogMzYsIFxuICAgICAgICAgICAgICBcIm1lc3NhZ2VzU2VudFwiIDogMCwgXG4gICAgICAgICAgICAgIFwibWVzc2FnZXNSZWNlaXZlZFwiIDogNSwgXG4gICAgICAgICAgICAgIFwibWVtb3J5Qnl0ZXNVc2VkRm9yTWVzc2FnZXNcIiA6IDI0MCBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIH0gXG4gICAgfSBcbiAgfSwgXG4gIFwic2VuZENvdW50XCIgOiAzNzAsIFxuICBcImFnZ3JlZ2F0b3JzXCIgOiB7IFxuICB9LCBcbiAgXCJnc3NUaW1lc1wiIDogWyBcbiAgICAwLjAwMDA5ODA3MywgXG4gICAgMC4wMDAwNzAxMDMsIFxuICAgIDAuMDAwMDg3ODcyLCBcbiAgICAwLjAwMDA1NDU2NiwgXG4gICAgMC4wMDAwNTI5NjMsIFxuICAgIDAuMDAwMDUxMzk5LCBcbiAgICAwLjAwMDA0NzIsIFxuICAgIDAuMDAwMDQ1NDc0LCBcbiAgICAwLjAwMDA0ODc0OSwgXG4gICAgMC4wMDAwMzc2MDksIFxuICAgIDAuMDAwMDQ0NDI0IFxuICBdLCBcbiAgXCJyZWNlaXZlZENvdW50XCIgOiAzNzAsIFxuICBcImV4cGlyZXNcIiA6IFwiMjAyNS0wNS0yM1QxODoyNjoxM1pcIiwgXG4gIFwidmVydGV4Q291bnRcIiA6IDM2LCBcbiAgXCJzdG9yYWdlVGltZVwiIDogMC4wMDA0NDQ5MzksIFxuICBcInRvdGFsUnVudGltZVwiIDogMC4wMDIwOTY1MiwgXG4gIFwicGFyYWxsZWxpc21cIiA6IDIsIFxuICBcIm1hc3RlckNvbnRleHRcIiA6IHsgXG4gIH0sIFxuICBcImVkZ2VDb3VudFwiIDogMzYsIFxuICBcInN0YXJ0dXBUaW1lXCIgOiAwLjAwMDMyNjQ5MywgXG4gIFwiY29tcHV0YXRpb25UaW1lXCIgOiAwLjAwMTI5MzIwNiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJHZXQgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgYSBQcmVnZWwgam9iOiIsIm5hbWUiOiJSZXN0UHJlZ2VsU3RhdHVzQ29ubmVjdGVkQ29tcG9uZW50cyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestQueryInvalid_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIGFuIGludmFsaWQgcXVlcnkKbmFtZTogUmVzdFF1ZXJ5SW52YWxpZAotLS0KdmFyIHVybCA9ICIvX2FwaS9xdWVyeSI7CnZhciBib2R5ID0gJ3sgInF1ZXJ5IiA6ICJGT1IgaSBJTiAxLi4xMDAgRklMVEVSIGkgPSAxIExJTUlUIDIgUkVUVVJOIGkgKiAzIiB9JzsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9xdWVyeScgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJxdWVyeVwiIDogXCJGT1IgaSBJTiAxLi4xMDAgRklMVEVSIGkgPSAxIExJTUlUIDIgUkVUVVJOIGkgKiAzXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNDNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDAsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkIGFzc2lnbm1lbnQgbmVhciAnPSAxIExJTUlUIDIgUkVUVVJOIGkgKiAzJyBhdCBwb3NpdGlvbiAxOjI2XCIsIFxuICBcImVycm9yTnVtXCIgOiAxNTAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6ImFuIGludmFsaWQgcXVlcnkiLCJuYW1lIjoiUmVzdFF1ZXJ5SW52YWxpZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestQueryRules_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbCBxdWVyeSBvcHRpbWl6ZXIgcnVsZXM6Cm5hbWU6IFJlc3RRdWVyeVJ1bGVzCi0tLQp2YXIgdXJsID0gIi9fYXBpL3F1ZXJ5L3J1bGVzIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3F1ZXJ5L3J1bGVzJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTczNzdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVwbGFjZS1mdW5jdGlvbi13aXRoLWluZGV4XCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiUmVwbGFjZSBkZXByZWNhdGVkIGluZGV4IGZ1bmN0aW9ucyBzdWNoIGFzIGBGVUxMVEVYVCgpYCxcXG5gTkVBUigpYCwgYFdJVEhJTigpYCwgb3IgYFdJVEhJTl9SRUNUQU5HTEUoKWAgd2l0aCBhIHJlZ3VsYXIgc3VicXVlcnkuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcImlubGluZS1zdWJxdWVyaWVzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVHJ5IHRvIHB1bGwgc3VicXVlcmllcyBvdXQgaW50byB0aGVpciBzdXJyb3VuZGluZyBzY29wZSwgZS5nLlxcbmBGT1IgeCBJTiAoRk9SIHkgSU4gY29sbGVjdGlvbiBGSUxURVIgeS52YWx1ZSBcdTAwM2U9IDUgUkVUVVJOIHkudGVzdCkgUkVUVVJOIHguYWBcXG5iZWNvbWVzIGBGT1IgdG1wIElOIGNvbGxlY3Rpb24gRklMVEVSIHRtcC52YWx1ZSBcdTAwM2U9IDUgTEVUIHggPSB0bXAudGVzdCBSRVRVUk4geC5hYC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJzaW1wbGlmeS1jb25kaXRpb25zXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiUmVwbGFjZSBwYXJ0cyBpbiBgQ2FsY3VsYXRpb25Ob2RlYCBleHByZXNzaW9ucyB3aXRoXFxuc2ltcGxlciBleHByZXNzaW9ucy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJtb3ZlLWNhbGN1bGF0aW9ucy11cFwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk1vdmUgY2FsY3VsYXRpb25zIHVwIGluIHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lIGFzIGZhciBhc1xcbnBvc3NpYmxlIChpZGVhbGx5IG91dCBvZiBlbnVtZXJhdGlvbnMpIHNvIHRoZXkgYXJlIG5vdCBleGVjdXRlZCBpbiBsb29wcyBpZiBub3RcXG5yZXF1aXJlZC4gSXQgaXMgcXVpdGUgY29tbW9uIHRoYXQgdGhpcyBydWxlIGVuYWJsZXMgZnVydGhlciBvcHRpbWl6YXRpb25zLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcIm1vdmUtZmlsdGVycy11cFwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk1vdmUgZmlsdGVycyB1cCBpbiB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZSBhcyBmYXIgYXMgcG9zc2libGVcXG4oaWRlYWxseSBvdXQgb2YgaW5uZXIgbG9vcHMpIHNvIHRoZXkgZmlsdGVyIHJlc3VsdHMgYXMgZWFybHkgYXMgcG9zc2libGUuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVtb3ZlLXJlZHVuZGFudC1jYWxjdWxhdGlvbnNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJSZXBsYWNlIHJlZmVyZW5jZXMgdG8gcmVkdW5kYW50IGNhbGN1bGF0aW9ucyAoZXhwcmVzc2lvbnNcXG53aXRoIHRoZSBleGFjdCBzYW1lIHJlc3VsdCkgd2l0aCBhIHNpbmdsZSByZWZlcmVuY2UsIGFsbG93aW5nIG90aGVyIHJ1bGVzIHRvXFxucmVtb3ZlIG5vIGxvbmdlciBuZWVkZWQgY2FsY3VsYXRpb25zLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcInJlbW92ZS11bm5lY2Vzc2FyeS1maWx0ZXJzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiUmVtb3ZlIGBGSUxURVJgIGNvbmRpdGlvbnMgdGhhdCBhbHdheXMgZXZhbHVhdGUgdG8gYHRydWVgLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcInJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJSZW1vdmUgYWxsIGNhbGN1bGF0aW9ucyB3aG9zZSByZXN1bHQgaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhlXFxucXVlcnkuIFRoaXMgY2FuIGJlIGEgY29uc2VxdWVuY2Ugb2YgYXBwbHlpbmcgb3RoZXIgb3B0aW1pemF0aW9ucy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJzcGVjaWFsaXplLWNvbGxlY3RcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJBcHBlYXJzIHdoZW5ldmVyIGEgYENPTExFQ1RgIHN0YXRlbWVudCBpcyB1c2VkIGluIGEgcXVlcnkgdG8gZGV0ZXJtaW5lXFxudGhlIHR5cGUgb2YgYENvbGxlY3ROb2RlYCB0byB1c2UuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogdHJ1ZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiB0cnVlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtcmVkdW5kYW50LXNvcnRzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVHJ5IHRvIG1lcmdlIG11bHRpcGxlIGBTT1JUYCBzdGF0ZW1lbnRzIGludG8gZmV3ZXIgc29ydHMuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwib3B0aW1pemUtc3VicXVlcmllc1wiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkFwcGx5IG9wdGltaXphdGlvbnMgdG8gc3VicXVlcmllcy5cXG5cXG5UaGlzIHJ1bGUgYWRkcyBhIGBMSU1JVGAgc3RhdGVtZW50IHRvIHF1YWxpZnlpbmcgc3VicXVlcmllcyB0byBtYWtlIHRoZW0gcmV0dXJuXFxubGVzcyBkYXRhLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSByZXN1bHQgdmFsdWUgb2Ygc3VicXVlcmllcyBpbiBjYXNlIG9ubHkgdGhlXFxubnVtYmVyIG9mIHN1YnF1ZXJ5IHJlc3VsdHMgaXMgY2hlY2tlZCBsYXRlci4gVGhpcyBzYXZlcyBjb3B5aW5nIHRoZSBkb2N1bWVudFxcbmRhdGEgZnJvbSB0aGUgc3VicXVlcnkgdG8gdGhlIG91dGVyIHNjb3BlIGFuZCBtYXkgZW5hYmxlIGZvbGxvdy11cFxcbm9wdGltaXphdGlvbnMuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwiaW50ZXJjaGFuZ2UtYWRqYWNlbnQtZW51bWVyYXRpb25zXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVHJ5IG91dCBwZXJtdXRhdGlvbnMgb2YgYEZPUmAgc3RhdGVtZW50cyBpbiBxdWVyaWVzIHRoYXQgY29udGFpblxcbm11bHRpcGxlIGxvb3BzLCB3aGljaCBtYXkgZW5hYmxlIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyBieSBvdGhlciBydWxlcy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IHRydWUsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcIm1vdmUtY2FsY3VsYXRpb25zLXVwLTJcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJTZWNvbmQgcGFzcyBvZiBtb3ZpbmcgY2FsY3VsYXRpb25zIHVwIGluIHRoZSBwcm9jZXNzaW5nXFxucGlwZWxpbmUgYXMgZmFyIGFzIHBvc3NpYmxlLCB0byBwdWxsIHRoZW0gb3V0IG9mIGlubmVyIGxvb3BzIGV0Yy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJtb3ZlLWZpbHRlcnMtdXAtMlwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlNlY29uZCBwYXNzIG9mIG1vdmluZyBmaWx0ZXJzIHVwIGluIHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lXFxuYXMgZmFyIGFzIHBvc3NpYmxlIHNvIHRoZXkgZmlsdGVyIHJlc3VsdHMgYXMgZWFybHkgYXMgcG9zc2libGUuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVtb3ZlLXJlZHVuZGFudC1zb3J0cy0yXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiU2Vjb25kIHBhc3Mgb2YgdHJ5aW5nIHRvIG1lcmdlIG11bHRpcGxlIGBTT1JUYCBzdGF0ZW1lbnRzXFxuaW50byBmZXdlciBzb3J0cy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtc29ydC1yYW5kLWxpbWl0LTFcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJSZW1vdmUgYFNPUlQgUkFORCgpIExJTUlUIDFgIGNvbnN0cnVjdHMgYnkgbW92aW5nIHRoZSByYW5kb20gaXRlcmF0aW9uXFxuaW50byBgRW51bWVyYXRlQ29sbGVjdGlvbk5vZGVgLlxcblxcblRoZSBSb2Nrc0RCIHN0b3JhZ2UgZW5naW5lIGRvZXNuJ3QgYWxsb3cgdG8gc2VlayByYW5kb20gZG9jdW1lbnRzIGVmZmljaWVudGx5LlxcblRoaXMgb3B0aW1pemF0aW9uIHBpY2tzIGEgcHNldWRvLXJhbmRvbSBkb2N1bWVudCBiYXNlZCBvbiBhIGxpbWl0ZWQgbnVtYmVyIG9mXFxuc2Vla3Mgd2l0aGluIHRoZSBjb2xsZWN0aW9uJ3Mga2V5IHJhbmdlLCBzZWxlY3RpbmcgYSByYW5kb20gc3RhcnQga2V5IGluIHRoZVxcbmtleSByYW5nZSwgYW5kIHRoZW4gZ29pbmcgYSBmZXcgc3RlcHMgYmVmb3JlIG9yIGFmdGVyIHRoYXQuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVtb3ZlLWNvbGxlY3QtdmFyaWFibGVzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiUmVtb3ZlIGBJTlRPYCBhbmQgYEFHR1JFR0FURWAgY2xhdXNlcyBmcm9tIGBDT0xMRUNUYFxcbnN0YXRlbWVudHMgaWYgdGhlIHJlc3VsdCBpcyBub3QgdXNlZC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJwcm9wYWdhdGUtY29uc3RhbnQtYXR0cmlidXRlc1wiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkluc2VydCBjb25zdGFudCB2YWx1ZXMgaW50byBgRklMVEVSYCBjb25kaXRpb25zLCByZXBsYWNpbmdcXG5keW5hbWljIGF0dHJpYnV0ZSB2YWx1ZXMuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVtb3ZlLWRhdGEtbW9kaWZpY2F0aW9uLW91dC12YXJpYWJsZXNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJBdm9pZCBzZXR0aW5nIHRoZSBwc2V1ZG8tdmFyaWFibGVzIGBPTERgIGFuZCBgTkVXYCBpZiB0aGV5XFxuYXJlIG5vdCB1c2VkIGluIGRhdGEgbW9kaWZpY2F0aW9uIHF1ZXJpZXMuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVwbGFjZS1vci13aXRoLWluXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiQ29tYmluZSBtdWx0aXBsZSBgT1JgIGVxdWFsaXR5IGNvbmRpdGlvbnMgb24gdGhlIHNhbWVcXG52YXJpYWJsZSBvciBhdHRyaWJ1dGUgd2l0aCBhbiBgSU5gIGNvbmRpdGlvbi5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtcmVkdW5kYW50LW9yXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiQ29tYmluZSBtdWx0aXBsZSBgT1JgIGNvbmRpdGlvbnMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlIG9yXFxuYXR0cmlidXRlIGludG8gYSBzaW5nbGUgY29uZGl0aW9uLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcImdlby1pbmRleC1vcHRpbWl6ZXJcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJVdGlsaXplIGdlby1zcGF0aWFsIGluZGV4ZXMuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwidXNlLWluZGV4ZXNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJVc2UgaW5kZXhlcyB0byBpdGVyYXRlIG92ZXIgY29sbGVjdGlvbnMsIHJlcGxhY2luZ1xcbmBFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZWAgd2l0aCBgSW5kZXhOb2RlYCBpbiB0aGUgcXVlcnkgcGxhbi5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtZmlsdGVyLWNvdmVyZWQtYnktaW5kZXhcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJSZXBsYWNlIG9yIHJlbW92ZSBgRmlsdGVyTm9kZWAgaWYgdGhlIGZpbHRlciBjb25kaXRpb25zIGFyZVxcbmFscmVhZHkgY292ZXJlZCBieSBgSW5kZXhOb2RlYC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtdW5uZWNlc3NhcnktZmlsdGVycy0yXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiU2Vjb25kIHBhc3Mgb2YgcmVtb3ZpbmcgYEZJTFRFUmAgY29uZGl0aW9ucyB0aGF0IGFsd2F5c1xcbmV2YWx1YXRlIHRvIGB0cnVlYC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJ1c2UtaW5kZXgtZm9yLXNvcnRcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJVc2UgaW5kZXhlcyB0byBhdm9pZCBgU09SVGAgb3BlcmF0aW9ucywgcmVtb3ZpbmcgYFNvcnROb2RlYFxcbmZyb20gdGhlIHF1ZXJ5IHBsYW4uXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwic29ydC1pbi12YWx1ZXNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJVc2UgYSBiaW5hcnkgc2VhcmNoIGZvciBpbi1saXN0IGxvb2t1cHMgd2l0aCBhIGxvZ2FyaXRobWljXFxuY29tcGxleGl0eSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGxpbmVhciBjb21wbGV4aXR5IGluLWxpc3QgbG9va3VwIGlmIHRoZVxcbmNvbXBhcmlzb24gYXJyYXkgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiBhbiBgSU5gIG9wZXJhdG9yIGlzIHByZS1zb3J0ZWQgYnkgYW5cXG5leHRyYSBmdW5jdGlvbiBjYWxsLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcIm9wdGltaXplLXRyYXZlcnNhbC1sYXN0LWVsZW1lbnQtYWNjZXNzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiVHJhbnNmb3JtIGFjY2Vzc2VzIHRvIHRoZSBsYXN0IHZlcnRleCBvciBlZGdlIG9mIHRoZSBwYXRoXFxub3V0cHV0IHZhcmlhYmxlIChgcC52ZXJ0aWNlc1stMV1gIGFuZCBgcC5lZGdlc1stMV1gKSBlbWl0dGVkIGJ5IEFRTCB0cmF2ZXJzYWxzXFxuKGBGT1IgdiwgZSwgcCBJTiAuLi5gKSB3aXRoIGFjY2Vzc2VzIHRvIHRoZSB2ZXJ0ZXggb3IgZWRnZSB2YXJpYWJsZVxcbihgdmAgYW5kIGBlYCkuIFRoaXMgY2FuIGF2b2lkIGNvbXB1dGluZyB0aGUgcGF0aCB2YXJpYWJsZSBhdCBhbGwgYW5kIGVuYWJsZVxcbmZ1cnRoZXIgb3B0aW1pemF0aW9ucyB0aGF0IGFyZSBub3QgcG9zc2libGUgb24gdGhlIHBhdGggdmFyaWFibGUgYHBgLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcIm9wdGltaXplLXRyYXZlcnNhbHNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJUcnkgdG8gbW92ZSBgRklMVEVSYCBjb25kaXRpb25zIGludG8gYFRyYXZlcnNhbE5vZGVgIGZvclxcbmVhcmx5IHBydW5pbmcgb2YgcmVzdWx0cywgYXBwbHkgdHJhdmVyc2FsIHByb2plY3Rpb25zLCBhbmQgYXZvaWQgY2FsY3VsYXRpbmdcXG5lZGdlIGFuZCBwYXRoIG91dHB1dCB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IGRlY2xhcmVkIGluIHRoZSBxdWVyeSBmb3IgdGhlXFxuQVFMIHRyYXZlcnNhbC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJvcHRpbWl6ZS1wYXRoc1wiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkNoZWNrIGhvdyB0aGUgb3V0cHV0IHZhcmlhYmxlcyBvZiBgS19QQVRIU2AsIGBLX1NIT1JURVNUX1BBVEhTYCxcXG5hbmQgYEFMTF9TSE9SVEVTVF9QQVRIU2AgcGF0aCBzZWFyY2ggZ3JhcGggYWxnb3JpdGhtcyBhcmUgdXNlZCBhbmQgYXZvaWRcXG5sb2FkaW5nIHRoZSB2ZXJ0ZXggZG9jdW1lbnRzIGlmIHRoZXkgYXJlIG5vdCBhY2Nlc3NlZCBpbiB0aGUgcXVlcnkuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwicmVtb3ZlLWZpbHRlci1jb3ZlcmVkLWJ5LXRyYXZlcnNhbFwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlJlcGxhY2Ugb3IgcmVtb3ZlIGBGaWx0ZXJOb2RlYCBpZiB0aGUgZmlsdGVyIGNvbmRpdGlvbnMgYXJlXFxuYWxyZWFkeSBjb3ZlcmVkIGJ5IGBUcmF2ZXJzYWxOb2RlYC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJoYW5kbGUtYXJhbmdvc2VhcmNoLXZpZXdzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiQXBwZWFycyB3aGVuZXZlciBhbiBgYXJhbmdvc2VhcmNoYCBvciBgc2VhcmNoLWFsaWFzYCBWaWV3IGlzIGFjY2Vzc2VkXFxuaW4gYSBxdWVyeS5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwiYXJhbmdvc2VhcmNoLWNvbnN0cmFpbmVkLXNvcnRcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJNYWtlIG5vZGVzIG9mIHR5cGUgYEVudW1lcmF0ZVZpZXdOb2RlYCBhd2FyZSBvZiBgU09SVGAgd2l0aCBhXFxuc3Vic2VxdWVudCBgTElNSVRgIHdoZW4gdXNpbmcgVmlld3MgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZSBhbmQgYXZvaWQgdW5uZWNlc3NhcnlcXG5zb3J0aW5nIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYXJyaWVkIG91dCBieSBBcmFuZ29TZWFyY2ggaW50ZXJuYWxseS5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zLTJcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJTZWNvbmQgcGFzcyBvZiByZW1vdmluZyBhbGwgY2FsY3VsYXRpb25zIHdob3NlIHJlc3VsdCBpcyBub3RcXG5yZWZlcmVuY2VkIGluIHRoZSBxdWVyeS4gVGhpcyBjYW4gYmUgYSBjb25zZXF1ZW5jZSBvZiBhcHBseWluZyBvdGhlclxcbm9wdGltaXphdGlvbnNcIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtcmVkdW5kYW50LXBhdGgtdmFyXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiQXZvaWQgY29tcHV0aW5nIHRoZSB2YXJpYWJsZXMgZW1pdHRlZCBieSBBUUwgdHJhdmVyc2FscyBpZlxcbnRoZXkgYXJlIGRlY2xhcmVkIGJ1dCB1bnVzZWQgaW4gdGhlIHF1ZXJ5LCBvciBvbmx5IHVzZWQgaW4gZmlsdGVycyB0aGF0IGFyZVxcbnB1bGxlZCBpbnRvIHRoZSB0cmF2ZXJzYWwsIHNpZ25pZmljYW50bHkgcmVkdWNpbmcgb3ZlcmhlYWQuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwibW92ZS1jYWxjdWxhdGlvbnMtZG93blwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk1vdmUgY2FsY3VsYXRpb25zIGRvd24gaW4gdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUgYXMgZmFyIGFzXFxucG9zc2libGUgKGJlbG93IGBGSUxURVJgLCBgTElNSVRgIGFuZCBgU1VCUVVFUllgIG5vZGVzKSBzbyB0aGV5IGFyZSBleGVjdXRlZCBhc1xcbmxhdGUgYXMgcG9zc2libGUgYW5kIG5vdCBiZWZvcmUgdGhlaXIgcmVzdWx0cyBhcmUgcmVxdWlyZWQuXCIsIFxuICAgIFwiZmxhZ3NcIiA6IHsgXG4gICAgICBcImhpZGRlblwiIDogZmFsc2UsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiBmYWxzZSwgXG4gICAgICBcImVudGVycHJpc2VPbmx5XCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIm5hbWVcIiA6IFwiZnVzZS1maWx0ZXJzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiTWVyZ2VzIGFkamFjZW50IGBGSUxURVJgIG5vZGVzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGVcXG5gRklMVEVSYCBub2RlLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcIm1vdmUtZmlsdGVycy1pbnRvLWVudW1lcmF0ZVwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk1vdmUgZmlsdGVycyBvbiBub24taW5kZXhlZCBjb2xsZWN0aW9uIGF0dHJpYnV0ZXMgaW50b1xcbmBJbmRleE5vZGVgIG9yIGBFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZWAgdG8gYWxsb3cgZWFybHkgcHJ1bmluZyBvZlxcbm5vbi1tYXRjaGluZyBkb2N1bWVudHMuIFRoaXMgb3B0aW1pemF0aW9uIGNhbiBoZWxwIHRvIGF2b2lkIGEgbG90IG9mIHRlbXBvcmFyeVxcbmRvY3VtZW50IGNvcGllcy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJyZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zLTNcIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJUaGlyZCBwYXNzIG9mIHJlbW92aW5nIGFsbCBjYWxjdWxhdGlvbnMgd2hvc2UgcmVzdWx0IGlzIG5vdFxcbnJlZmVyZW5jZWQgaW4gdGhlIHF1ZXJ5LiBUaGlzIGNhbiBiZSBhIGNvbnNlcXVlbmNlIG9mIGFwcGx5aW5nIG90aGVyXFxub3B0aW1pemF0aW9uc1wiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IHRydWUsIFxuICAgICAgXCJjbHVzdGVyT25seVwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5CZURpc2FibGVkXCIgOiB0cnVlLCBcbiAgICAgIFwiY2FuQ3JlYXRlQWRkaXRpb25hbFBsYW5zXCIgOiBmYWxzZSwgXG4gICAgICBcImRpc2FibGVkQnlEZWZhdWx0XCIgOiB0cnVlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJzb3J0LWxpbWl0XCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiTWFrZSBgU09SVGAgYXdhcmUgb2YgYSBzdWJzZXF1ZW50IGBMSU1JVGAgdG8gZW5hYmxlXFxub3B0aW1pemF0aW9ucyBpbnRlcm5hbCB0byB0aGUgYFNvcnROb2RlYCB0aGF0IGFsbG93IHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2VcXG5hbmQsIGluIG1hbnkgY2FzZXMsIGltcHJvdmUgdGhlIHNvcnRpbmcgc3BlZWQuXFxuXFxuQSBgU29ydE5vZGVgIG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IGEgYExpbWl0Tm9kZWAgd2l0aCBubyBpbnRlcnZlbmluZyBub2Rlc1xcbnRoYXQgbWF5IGNoYW5nZSB0aGUgZWxlbWVudCBjb3VudCAoZS5nLiBhIGBGaWx0ZXJOb2RlYCB3aGljaCBjYW5ub3QgYmUgbW92ZWRcXG5iZWZvcmUgdGhlIHNvcnQsIG9yIGEgc291cmNlIG5vZGUgbGlrZSBgRW51bWVyYXRlQ29sbGVjdGlvbk5vZGVgKS5cXG5cXG5UaGUgb3B0aW1pemVyIG1heSBjaG9vc2Ugbm90IHRvIGFwcGx5IHRoZSBydWxlIGlmIGl0IGRlY2lkZXMgdGhhdCBpdCBvZmZlcnNcXG5saXR0bGUgb3Igbm8gYmVuZWZpdC4gSW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgYXBwbHkgdGhlIHJ1bGUgaWYgdGhlIGlucHV0XFxuc2l6ZSBpcyB2ZXJ5IHNtYWxsIG9yIGlmIHRoZSBvdXRwdXQgZnJvbSB0aGUgYExpbWl0Tm9kZWAgaXMgc2ltaWxhciBpbiBzaXplIHRvXFxudGhlIGlucHV0LiBJbiBleGNlcHRpb25hbGx5IHJhcmUgY2FzZXMsIHRoaXMgcnVsZSBjb3VsZCByZXN1bHQgaW4gc29tZSBzbWFsbFxcbnNsb3dkb3duLiBJZiBvYnNlcnZlZCwgeW91IGNhbiBkaXNhYmxlIHRoZSBydWxlIGZvciB0aGUgYWZmZWN0ZWQgcXVlcnkgYXQgdGhlXFxuY29zdCBvZiBpbmNyZWFzZWQgbWVtb3J5IHVzYWdlLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcInJlZHVjZS1leHRyYWN0aW9uLXRvLXByb2plY3Rpb25cIiwgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogXCJNb2RpZnkgYEVudW1lcmF0aW9uQ29sbGVjdGlvbk5vZGVgIGFuZCBgSW5kZXhOb2RlYCB0aGF0IHdvdWxkIGhhdmVcXG5leHRyYWN0ZWQgZW50aXJlIGRvY3VtZW50cyB0byBvbmx5IHJldHVybiBhIHByb2plY3Rpb24gb2YgZWFjaCBkb2N1bWVudC5cXG5cXG5Qcm9qZWN0aW9ucyBhcmUgbGltaXRlZCB0byBhdCBtb3N0IDUgZGlmZmVyZW50IGRvY3VtZW50IGF0dHJpYnV0ZXMgYnkgZGVmYXVsdC5cXG5UaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvamVjdGVkIGF0dHJpYnV0ZXMgY2FuIG9wdGlvbmFsbHkgYmUgYWRqdXN0ZWQgYnlcXG5zZXR0aW5nIHRoZSBgbWF4UHJvamVjdGlvbnNgIGhpbnQgZm9yIGFuIEFRTCBgRk9SYCBvcGVyYXRpb24gc2luY2VcXG5BcmFuZ29EQiAzLjkuMS5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJvcHRpbWl6ZS1jb3VudFwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIk9wdGltaXplIHN1YnF1ZXJpZXMgdG8gdXNlIGFuIG9wdGltaXplZCBjb2RlIHBhdGggZm9yXFxuY291bnRpbmcgZG9jdW1lbnRzLlxcblxcblRoZSByZXF1aXJlbWVudHMgYXJlIHRoYXQgdGhlIHN1YnF1ZXJ5IHJlc3VsdCBtdXN0IG9ubHkgYmUgdXNlZCB3aXRoIHRoZVxcbmBDT1VOVCgpYCBvciBgTEVOR1RIKClgIEFRTCBmdW5jdGlvbiBhbmQgbm90IGZvciBhbnl0aGluZyBlbHNlLiBUaGUgc3VicXVlcnlcXG5pdHNlbGYgbXVzdCBiZSByZWFkLW9ubHkgKG5vIGRhdGEgbW9kaWZpY2F0aW9uIHN1YnF1ZXJ5KSwgbm90IHVzZSBuZXN0ZWQgYEZPUmBcXG5sb29wcywgbm8gYExJTUlUYCBzdGF0ZW1lbnQsIGFuZCBubyBgRklMVEVSYCBjb25kaXRpb24gb3IgY2FsY3VsYXRpb24gdGhhdFxcbnJlcXVpcmVzIGFjY2Vzc2luZyBkb2N1bWVudCBkYXRhLiBBY2Nlc3NpbmcgaW5kZXggZGF0YSBpcyBzdXBwb3J0ZWQgZm9yXFxuZmlsdGVyaW5nIGJ1dCBub3QgZm9yIGZ1cnRoZXIgY2FsY3VsYXRpb25zLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogdHJ1ZSwgXG4gICAgICBcImNhbkNyZWF0ZUFkZGl0aW9uYWxQbGFuc1wiIDogZmFsc2UsIFxuICAgICAgXCJkaXNhYmxlZEJ5RGVmYXVsdFwiIDogZmFsc2UsIFxuICAgICAgXCJlbnRlcnByaXNlT25seVwiIDogZmFsc2UgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcImxhdGUtZG9jdW1lbnQtbWF0ZXJpYWxpemF0aW9uLWFyYW5nb3NlYXJjaFwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlRyeSB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbnMgb2YgYSBWaWV3IGFzIGxhdGVcXG5hcyBwb3NzaWJsZSBpZiB0aGUgaW52b2x2ZWQgYXR0cmlidXRlcyBhcmUgY292ZXJlZCBieSB0aGUgVmlldyBpbmRleC5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJsYXRlLWRvY3VtZW50LW1hdGVyaWFsaXphdGlvblwiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIlRyeSB0byByZWFkIGZyb20gY29sbGVjdGlvbnMgYXMgbGF0ZSBhcyBwb3NzaWJsZSBpZiB0aGVcXG5pbnZvbHZlZCBhdHRyaWJ1dGVzIGFyZSBjb3ZlcmVkIGJ5IHJlZ3VsYXIgaW5kZXhlcy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJsYXRlLW1hdGVyaWFsaXphdGlvbi1vZmZzZXQtaW5mb1wiLCBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiBcIkdldCB0aGUgc2VhcmNoIGhpZ2hsaWdodGluZyBvZmZzZXRzIGFzIGxhdGUgYXMgcG9zc2libGUgdG9cXG5hdm9pZCB1bm5lY2Vzc2FyeSByZWFkcy5cIiwgXG4gICAgXCJmbGFnc1wiIDogeyBcbiAgICAgIFwiaGlkZGVuXCIgOiBmYWxzZSwgXG4gICAgICBcImNsdXN0ZXJPbmx5XCIgOiBmYWxzZSwgXG4gICAgICBcImNhbkJlRGlzYWJsZWRcIiA6IHRydWUsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IHRydWUgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJuYW1lXCIgOiBcInNwbGljZS1zdWJxdWVyaWVzXCIsIFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IFwiQXBwZWFycyBpZiBzdWJxdWVyaWVzIGFyZSBzcGxpY2VkIGludG8gdGhlIHN1cnJvdW5kaW5nIHF1ZXJ5LFxcbnJlZHVjaW5nIG92ZXJoZWFkIGZvciBleGVjdXRpbmcgc3VicXVlcmllcyBieSBpbmxpbmluZyB0aGUgZXhlY3V0aW9uLlxcblRoaXMgbWFpbmx5IGJlbmVmaXRzIHF1ZXJpZXMgd2hpY2ggZXhlY3V0ZSBzdWJxdWVyaWVzIHZlcnkgb2Z0ZW4gdGhhdCBvbmx5XFxucmV0dXJuIGEgZmV3IHJlc3VsdHMgYXQgYSB0aW1lLlxcblxcblRoaXMgb3B0aW1pemF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhbGwgc3VicXVlcmllcyBhbmQgaXMgYXBwbGllZCBhZnRlciBhbGwgb3RoZXJcXG5vcHRpbWl6YXRpb25zLlwiLCBcbiAgICBcImZsYWdzXCIgOiB7IFxuICAgICAgXCJoaWRkZW5cIiA6IGZhbHNlLCBcbiAgICAgIFwiY2x1c3Rlck9ubHlcIiA6IGZhbHNlLCBcbiAgICAgIFwiY2FuQmVEaXNhYmxlZFwiIDogZmFsc2UsIFxuICAgICAgXCJjYW5DcmVhdGVBZGRpdGlvbmFsUGxhbnNcIiA6IGZhbHNlLCBcbiAgICAgIFwiZGlzYWJsZWRCeURlZmF1bHRcIiA6IGZhbHNlLCBcbiAgICAgIFwiZW50ZXJwcmlzZU9ubHlcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsIHF1ZXJ5IG9wdGltaXplciBydWxlczoiLCJuYW1lIjoiUmVzdFF1ZXJ5UnVsZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestQueryValid_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIGEgdmFsaWQgcXVlcnkKbmFtZTogUmVzdFF1ZXJ5VmFsaWQKLS0tCnZhciB1cmwgPSAiL19hcGkvcXVlcnkiOwp2YXIgYm9keSA9ICd7ICJxdWVyeSIgOiAiRk9SIGkgSU4gMS4uMTAwIEZJTFRFUiBpID4gMTAgTElNSVQgMiBSRVRVUk4gaSAqIDMiIH0nOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9xdWVyeScgXHUwMDNjXHUwMDNjJ0VPRidcbnsgXCJxdWVyeVwiIDogXCJGT1IgaSBJTiAxLi4xMDAgRklMVEVSIGkgXHUwMDNlIDEwIExJTUlUIDIgUkVUVVJOIGkgKiAzXCIgfVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2MjBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicGFyc2VkXCIgOiB0cnVlLCBcbiAgXCJjb2xsZWN0aW9uc1wiIDogWyBdLCBcbiAgXCJiaW5kVmFyc1wiIDogWyBdLCBcbiAgXCJhc3RcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwidHlwZVwiIDogXCJyb290XCIsIFxuICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiZm9yXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwidmFyaWFibGVcIiwgXG4gICAgICAgICAgICAgIFwibmFtZVwiIDogXCJpXCIsIFxuICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmFuZ2VcIiwgXG4gICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IDEgXG4gICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IDEwMCBcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwibm8tb3BcIiBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSwgXG4gICAgICAgIHsgXG4gICAgICAgICAgXCJ0eXBlXCIgOiBcImZpbHRlclwiLCBcbiAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcImNvbXBhcmUgXHUwMDNlXCIsIFxuICAgICAgICAgICAgICBcInN1Yk5vZGVzXCIgOiBbIFxuICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwicmVmZXJlbmNlXCIsIFxuICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiBcImlcIiwgXG4gICAgICAgICAgICAgICAgICBcImlkXCIgOiAwIFxuICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIiA6IFwidmFsdWVcIiwgXG4gICAgICAgICAgICAgICAgICBcInZhbHVlXCIgOiAxMCBcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICBdIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwibGltaXRcIiwgXG4gICAgICAgICAgXCJzdWJOb2Rlc1wiIDogWyBcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgXCJ2YWx1ZVwiIDogMCBcbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgXCJ0eXBlXCIgOiBcInZhbHVlXCIsIFxuICAgICAgICAgICAgICBcInZhbHVlXCIgOiAyIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICBdIFxuICAgICAgICB9LCBcbiAgICAgICAgeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwicmV0dXJuXCIsIFxuICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBcInR5cGVcIiA6IFwidGltZXNcIiwgXG4gICAgICAgICAgICAgIFwic3ViTm9kZXNcIiA6IFsgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJyZWZlcmVuY2VcIiwgXG4gICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IFwiaVwiLCBcbiAgICAgICAgICAgICAgICAgIFwiaWRcIiA6IDAgXG4gICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICAgIFwidHlwZVwiIDogXCJ2YWx1ZVwiLCBcbiAgICAgICAgICAgICAgICAgIFwidmFsdWVcIiA6IDMgXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgXSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgXSBcbiAgICAgICAgfSBcbiAgICAgIF0gXG4gICAgfSBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJhIHZhbGlkIHF1ZXJ5IiwibmFtZSI6IlJlc3RRdWVyeVZhbGlkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestReplaceUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmVwbGFjZVVzZXIKLS0tCnZhciB1c2VycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpOwp2YXIgdGhlVXNlciA9ICJhZG1pbkBteWFwcCI7CnVzZXJzLnNhdmUodGhlVXNlciwgInNlY3JldCIpCgp2YXIgdXJsID0gIi9fYXBpL3VzZXIvIiArIHRoZVVzZXI7CnZhciBkYXRhID0geyBwYXNzd2Q6ICJzZWN1cmUiIH07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGEpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwp1c2Vycy5yZW1vdmUodGhlVXNlcik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3VzZXIvYWRtaW5AbXlhcHAnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicGFzc3dkXCI6IFwic2VjdXJlXCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJ1c2VyXCIgOiBcImFkbWluQG15YXBwXCIsIFxuICBcImFjdGl2ZVwiIDogdHJ1ZSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gIH0sIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwiZXJyb3JcIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0UmVwbGFjZVVzZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestReplicationApplierGetConfig_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmVwbGljYXRpb25BcHBsaWVyR2V0Q29uZmlnCi0tLQp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItY29uZmlnIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItY29uZmlnJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNTE5XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicmVxdWVzdFRpbWVvdXRcIiA6IDYwMCwgXG4gIFwiY29ubmVjdFRpbWVvdXRcIiA6IDEwLCBcbiAgXCJpZ25vcmVFcnJvcnNcIiA6IDAsIFxuICBcIm1heENvbm5lY3RSZXRyaWVzXCIgOiAxMDAsIFxuICBcImxvY2tUaW1lb3V0UmV0cmllc1wiIDogMCwgXG4gIFwic3NsUHJvdG9jb2xcIiA6IDAsIFxuICBcImNodW5rU2l6ZVwiIDogMCwgXG4gIFwic2tpcENyZWF0ZURyb3BcIiA6IGZhbHNlLCBcbiAgXCJhdXRvU3RhcnRcIiA6IGZhbHNlLCBcbiAgXCJhZGFwdGl2ZVBvbGxpbmdcIiA6IHRydWUsIFxuICBcImF1dG9SZXN5bmNcIiA6IGZhbHNlLCBcbiAgXCJhdXRvUmVzeW5jUmV0cmllc1wiIDogMiwgXG4gIFwibWF4UGFja2V0U2l6ZVwiIDogNTM2ODcwOTEyLCBcbiAgXCJpbmNsdWRlU3lzdGVtXCIgOiB0cnVlLCBcbiAgXCJpbmNsdWRlRm94eFF1ZXVlc1wiIDogZmFsc2UsIFxuICBcInJlcXVpcmVGcm9tUHJlc2VudFwiIDogdHJ1ZSwgXG4gIFwidmVyYm9zZVwiIDogZmFsc2UsIFxuICBcImluY3JlbWVudGFsXCIgOiBmYWxzZSwgXG4gIFwicmVzdHJpY3RUeXBlXCIgOiBcIlwiLCBcbiAgXCJyZXN0cmljdENvbGxlY3Rpb25zXCIgOiBbIF0sIFxuICBcImNvbm5lY3Rpb25SZXRyeVdhaXRUaW1lXCIgOiAxNSwgXG4gIFwiaW5pdGlhbFN5bmNNYXhXYWl0VGltZVwiIDogMzAwLCBcbiAgXCJpZGxlTWluV2FpdFRpbWVcIiA6IDEsIFxuICBcImlkbGVNYXhXYWl0VGltZVwiIDogMi41IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0UmVwbGljYXRpb25BcHBsaWVyR2V0Q29uZmlnIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestReplicationApplierSetConfig_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmVwbGljYXRpb25BcHBsaWVyU2V0Q29uZmlnCi0tLQp2YXIgcmUgPSByZXF1aXJlKCJAYXJhbmdvZGIvcmVwbGljYXRpb24iKTsKcmUuYXBwbGllci5zdG9wKCk7Cgp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItY29uZmlnIjsKdmFyIGJvZHkgPSB7CiAgZW5kcG9pbnQ6ICJ0Y3A6Ly8xMjcuMC4wLjE6ODUyOSIsCiAgdXNlcm5hbWU6ICJyZXBsaWNhdGlvbkFwcGxpZXIiLAogIHBhc3N3b3JkOiAiYXBwbGllcjEyMzRAZm94eCIsCiAgY2h1bmtTaXplOiA0MTk0MzA0LAogIGF1dG9TdGFydDogZmFsc2UsCiAgYWRhcHRpdmVQb2xsaW5nOiB0cnVlCn07Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCBib2R5KTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItY29uZmlnJyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcImVuZHBvaW50XCI6IFwidGNwOi8vMTI3LjAuMC4xOjg1MjlcIixcbiAgXCJ1c2VybmFtZVwiOiBcInJlcGxpY2F0aW9uQXBwbGllclwiLFxuICBcInBhc3N3b3JkXCI6IFwiYXBwbGllcjEyMzRAZm94eFwiLFxuICBcImNodW5rU2l6ZVwiOiA0MTk0MzA0LFxuICBcImF1dG9TdGFydFwiOiBmYWxzZSxcbiAgXCJhZGFwdGl2ZVBvbGxpbmdcIjogdHJ1ZVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2MTJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlbmRwb2ludFwiIDogXCJ0Y3A6Ly8xMjcuMC4wLjE6ODUyOVwiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIsIFxuICBcInVzZXJuYW1lXCIgOiBcInJlcGxpY2F0aW9uQXBwbGllclwiLCBcbiAgXCJyZXF1ZXN0VGltZW91dFwiIDogNjAwLCBcbiAgXCJjb25uZWN0VGltZW91dFwiIDogMTAsIFxuICBcImlnbm9yZUVycm9yc1wiIDogMCwgXG4gIFwibWF4Q29ubmVjdFJldHJpZXNcIiA6IDEwMCwgXG4gIFwibG9ja1RpbWVvdXRSZXRyaWVzXCIgOiAwLCBcbiAgXCJzc2xQcm90b2NvbFwiIDogMCwgXG4gIFwiY2h1bmtTaXplXCIgOiA0MTk0MzA0LCBcbiAgXCJza2lwQ3JlYXRlRHJvcFwiIDogZmFsc2UsIFxuICBcImF1dG9TdGFydFwiIDogZmFsc2UsIFxuICBcImFkYXB0aXZlUG9sbGluZ1wiIDogdHJ1ZSwgXG4gIFwiYXV0b1Jlc3luY1wiIDogZmFsc2UsIFxuICBcImF1dG9SZXN5bmNSZXRyaWVzXCIgOiAyLCBcbiAgXCJtYXhQYWNrZXRTaXplXCIgOiA1MzY4NzA5MTIsIFxuICBcImluY2x1ZGVTeXN0ZW1cIiA6IHRydWUsIFxuICBcImluY2x1ZGVGb3h4UXVldWVzXCIgOiBmYWxzZSwgXG4gIFwicmVxdWlyZUZyb21QcmVzZW50XCIgOiB0cnVlLCBcbiAgXCJ2ZXJib3NlXCIgOiBmYWxzZSwgXG4gIFwiaW5jcmVtZW50YWxcIiA6IGZhbHNlLCBcbiAgXCJyZXN0cmljdFR5cGVcIiA6IFwiXCIsIFxuICBcInJlc3RyaWN0Q29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gIFwiY29ubmVjdGlvblJldHJ5V2FpdFRpbWVcIiA6IDE1LCBcbiAgXCJpbml0aWFsU3luY01heFdhaXRUaW1lXCIgOiAzMDAsIFxuICBcImlkbGVNaW5XYWl0VGltZVwiIDogMSwgXG4gIFwiaWRsZU1heFdhaXRUaW1lXCIgOiAyLjUgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvbkFwcGxpZXJTZXRDb25maWciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestReplicationApplierStart_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmVwbGljYXRpb25BcHBsaWVyU3RhcnQKLS0tCnZhciByZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9yZXBsaWNhdGlvbiIpOwpyZS5hcHBsaWVyLnN0b3AoKTsKcmUuYXBwbGllci5wcm9wZXJ0aWVzKHsKICBlbmRwb2ludDogInRjcDovLzEyNy4wLjAuMTo4NTI5IiwKICB1c2VybmFtZTogInJlcGxpY2F0aW9uQXBwbGllciIsCiAgcGFzc3dvcmQ6ICJhcHBsaWVyMTIzNEBmb3h4IiwKICBhdXRvU3RhcnQ6IGZhbHNlLAogIGFkYXB0aXZlUG9sbGluZzogdHJ1ZQp9KTsKCnZhciB1cmwgPSAiL19hcGkvcmVwbGljYXRpb24vYXBwbGllci1zdGFydCI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiKTsKcmUuYXBwbGllci5zdG9wKCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9yZXBsaWNhdGlvbi9hcHBsaWVyLXN0YXJ0JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzMzXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwic3RhdGVcIiA6IHsgXG4gICAgXCJzdGFydGVkXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MThaXCIsIFxuICAgIFwicnVubmluZ1wiIDogdHJ1ZSwgXG4gICAgXCJwaGFzZVwiIDogXCJydW5uaW5nXCIsIFxuICAgIFwibGFzdEFwcGxpZWRDb250aW51b3VzVGlja1wiIDogbnVsbCwgXG4gICAgXCJsYXN0UHJvY2Vzc2VkQ29udGludW91c1RpY2tcIiA6IG51bGwsIFxuICAgIFwibGFzdEF2YWlsYWJsZUNvbnRpbnVvdXNUaWNrXCIgOiBudWxsLCBcbiAgICBcInNhZmVSZXN1bWVUaWNrXCIgOiBudWxsLCBcbiAgICBcInRpY2tzQmVoaW5kXCIgOiAwLCBcbiAgICBcInByb2dyZXNzXCIgOiB7IFxuICAgICAgXCJ0aW1lXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTU6MzNaXCIsIFxuICAgICAgXCJtZXNzYWdlXCIgOiBcImFwcGxpZXIgaW5pdGlhbGx5IGNyZWF0ZWQgZm9yIGRhdGFiYXNlICdfc3lzdGVtJ1wiLCBcbiAgICAgIFwiZmFpbGVkQ29ubmVjdHNcIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0b3RhbFJlcXVlc3RzXCIgOiAwLCBcbiAgICBcInRvdGFsRmFpbGVkQ29ubmVjdHNcIiA6IDAsIFxuICAgIFwidG90YWxFdmVudHNcIiA6IDAsIFxuICAgIFwidG90YWxEb2N1bWVudHNcIiA6IDAsIFxuICAgIFwidG90YWxSZW1vdmFsc1wiIDogMCwgXG4gICAgXCJ0b3RhbFJlc3luY3NcIiA6IDAsIFxuICAgIFwidG90YWxPcGVyYXRpb25zRXhjbHVkZWRcIiA6IDAsIFxuICAgIFwidG90YWxBcHBseVRpbWVcIiA6IDAsIFxuICAgIFwiYXZlcmFnZUFwcGx5VGltZVwiIDogMCwgXG4gICAgXCJ0b3RhbEZldGNoVGltZVwiIDogMCwgXG4gICAgXCJhdmVyYWdlRmV0Y2hUaW1lXCIgOiAwLCBcbiAgICBcImxhc3RFcnJvclwiIDogeyBcbiAgICAgIFwiZXJyb3JOdW1cIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MThaXCIgXG4gIH0sIFxuICBcInNlcnZlclwiIDogeyBcbiAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICBcInNlcnZlcklkXCIgOiBcIjExNDQzMzE4NTc0NDM0NlwiIFxuICB9LCBcbiAgXCJlbmRwb2ludFwiIDogXCJ0Y3A6Ly8xMjcuMC4wLjE6ODUyOVwiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvbkFwcGxpZXJTdGFydCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestReplicationApplierStateNotRunning_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSBzdGF0ZSBvZiBhbiBpbmFjdGl2ZSBhcHBsaWVyOgpuYW1lOiBSZXN0UmVwbGljYXRpb25BcHBsaWVyU3RhdGVOb3RSdW5uaW5nCi0tLQp2YXIgcmUgPSByZXF1aXJlKCJAYXJhbmdvZGIvcmVwbGljYXRpb24iKTsKcmUuYXBwbGllci5zdG9wKCk7Cgp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItc3RhdGUiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItc3RhdGUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2ODhcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJzdGF0ZVwiIDogeyBcbiAgICBcInN0YXJ0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxOFpcIiwgXG4gICAgXCJydW5uaW5nXCIgOiBmYWxzZSwgXG4gICAgXCJwaGFzZVwiIDogXCJpbmFjdGl2ZVwiLCBcbiAgICBcImxhc3RBcHBsaWVkQ29udGludW91c1RpY2tcIiA6IG51bGwsIFxuICAgIFwibGFzdFByb2Nlc3NlZENvbnRpbnVvdXNUaWNrXCIgOiBudWxsLCBcbiAgICBcImxhc3RBdmFpbGFibGVDb250aW51b3VzVGlja1wiIDogbnVsbCwgXG4gICAgXCJzYWZlUmVzdW1lVGlja1wiIDogbnVsbCwgXG4gICAgXCJwcm9ncmVzc1wiIDogeyBcbiAgICAgIFwidGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE4WlwiLCBcbiAgICAgIFwibWVzc2FnZVwiIDogXCJhcHBsaWVyIHNodXQgZG93blwiLCBcbiAgICAgIFwiZmFpbGVkQ29ubmVjdHNcIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0b3RhbFJlcXVlc3RzXCIgOiAyLCBcbiAgICBcInRvdGFsRmFpbGVkQ29ubmVjdHNcIiA6IDAsIFxuICAgIFwidG90YWxFdmVudHNcIiA6IDAsIFxuICAgIFwidG90YWxEb2N1bWVudHNcIiA6IDAsIFxuICAgIFwidG90YWxSZW1vdmFsc1wiIDogMCwgXG4gICAgXCJ0b3RhbFJlc3luY3NcIiA6IDAsIFxuICAgIFwidG90YWxPcGVyYXRpb25zRXhjbHVkZWRcIiA6IDAsIFxuICAgIFwidG90YWxBcHBseVRpbWVcIiA6IDAsIFxuICAgIFwiYXZlcmFnZUFwcGx5VGltZVwiIDogMCwgXG4gICAgXCJ0b3RhbEZldGNoVGltZVwiIDogMCwgXG4gICAgXCJhdmVyYWdlRmV0Y2hUaW1lXCIgOiAwLCBcbiAgICBcImxhc3RFcnJvclwiIDogeyBcbiAgICAgIFwiZXJyb3JOdW1cIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MThaXCIgXG4gIH0sIFxuICBcInNlcnZlclwiIDogeyBcbiAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICBcInNlcnZlcklkXCIgOiBcIjExNDQzMzE4NTc0NDM0NlwiIFxuICB9LCBcbiAgXCJlbmRwb2ludFwiIDogXCJ0Y3A6Ly8xMjcuMC4wLjE6ODUyOVwiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRmV0Y2hpbmcgdGhlIHN0YXRlIG9mIGFuIGluYWN0aXZlIGFwcGxpZXI6IiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvbkFwcGxpZXJTdGF0ZU5vdFJ1bm5pbmciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestReplicationApplierStateRunning_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSBzdGF0ZSBvZiBhbiBhY3RpdmUgYXBwbGllcjoKbmFtZTogUmVzdFJlcGxpY2F0aW9uQXBwbGllclN0YXRlUnVubmluZwotLS0KdmFyIHJlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3JlcGxpY2F0aW9uIik7CnJlLmFwcGxpZXIuc3RvcCgpOwpyZS5hcHBsaWVyLnN0YXJ0KCk7Cgp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItc3RhdGUiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKcmUuYXBwbGllci5zdG9wKCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItc3RhdGUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA4NDVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJzdGF0ZVwiIDogeyBcbiAgICBcInN0YXJ0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxOFpcIiwgXG4gICAgXCJydW5uaW5nXCIgOiBmYWxzZSwgXG4gICAgXCJwaGFzZVwiIDogXCJpbmFjdGl2ZVwiLCBcbiAgICBcImxhc3RBcHBsaWVkQ29udGludW91c1RpY2tcIiA6IG51bGwsIFxuICAgIFwibGFzdFByb2Nlc3NlZENvbnRpbnVvdXNUaWNrXCIgOiBudWxsLCBcbiAgICBcImxhc3RBdmFpbGFibGVDb250aW51b3VzVGlja1wiIDogbnVsbCwgXG4gICAgXCJzYWZlUmVzdW1lVGlja1wiIDogbnVsbCwgXG4gICAgXCJwcm9ncmVzc1wiIDogeyBcbiAgICAgIFwidGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE4WlwiLCBcbiAgICAgIFwibWVzc2FnZVwiIDogXCJhcHBsaWVyIHNodXQgZG93blwiLCBcbiAgICAgIFwiZmFpbGVkQ29ubmVjdHNcIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0b3RhbFJlcXVlc3RzXCIgOiAzLCBcbiAgICBcInRvdGFsRmFpbGVkQ29ubmVjdHNcIiA6IDAsIFxuICAgIFwidG90YWxFdmVudHNcIiA6IDAsIFxuICAgIFwidG90YWxEb2N1bWVudHNcIiA6IDAsIFxuICAgIFwidG90YWxSZW1vdmFsc1wiIDogMCwgXG4gICAgXCJ0b3RhbFJlc3luY3NcIiA6IDAsIFxuICAgIFwidG90YWxPcGVyYXRpb25zRXhjbHVkZWRcIiA6IDAsIFxuICAgIFwidG90YWxBcHBseVRpbWVcIiA6IDAsIFxuICAgIFwiYXZlcmFnZUFwcGx5VGltZVwiIDogMCwgXG4gICAgXCJ0b3RhbEZldGNoVGltZVwiIDogMCwgXG4gICAgXCJhdmVyYWdlRmV0Y2hUaW1lXCIgOiAwLCBcbiAgICBcImxhc3RFcnJvclwiIDogeyBcbiAgICAgIFwiZXJyb3JOdW1cIiA6IDE0MDUsIFxuICAgICAgXCJ0aW1lXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MThaXCIsIFxuICAgICAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiZ290IHNhbWUgc2VydmVyIGlkICgxMTQ0MzMxODU3NDQzNDYpIGZyb20gZW5kcG9pbnQgJ3RjcDovLzEyNy4wLjAuMTo4NTI5JyBhcyB0aGUgbG9jYWwgYXBwbGllciBzZXJ2ZXIncyBpZFwiIFxuICAgIH0sIFxuICAgIFwidGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE4WlwiIFxuICB9LCBcbiAgXCJzZXJ2ZXJcIiA6IHsgXG4gICAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gICAgXCJzZXJ2ZXJJZFwiIDogXCIxMTQ0MzMxODU3NDQzNDZcIiBcbiAgfSwgXG4gIFwiZW5kcG9pbnRcIiA6IFwidGNwOi8vMTI3LjAuMC4xOjg1MjlcIiwgXG4gIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkZldGNoaW5nIHRoZSBzdGF0ZSBvZiBhbiBhY3RpdmUgYXBwbGllcjoiLCJuYW1lIjoiUmVzdFJlcGxpY2F0aW9uQXBwbGllclN0YXRlUnVubmluZyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestReplicationApplierStop_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmVwbGljYXRpb25BcHBsaWVyU3RvcAotLS0KdmFyIHJlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3JlcGxpY2F0aW9uIik7CnJlLmFwcGxpZXIuc3RvcCgpOwpyZS5hcHBsaWVyLnByb3BlcnRpZXMoewogIGVuZHBvaW50OiAidGNwOi8vMTI3LjAuMC4xOjg1MjkiLAogIHVzZXJuYW1lOiAicmVwbGljYXRpb25BcHBsaWVyIiwKICBwYXNzd29yZDogImFwcGxpZXIxMjM0QGZveHgiLAogIGF1dG9TdGFydDogZmFsc2UsCiAgYWRhcHRpdmVQb2xsaW5nOiB0cnVlCn0pOwoKcmUuYXBwbGllci5zdGFydCgpOwp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2FwcGxpZXItc3RvcCI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiKTsKcmUuYXBwbGllci5zdG9wKCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9yZXBsaWNhdGlvbi9hcHBsaWVyLXN0b3AnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2ODhcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJzdGF0ZVwiIDogeyBcbiAgICBcInN0YXJ0ZWRcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoxOFpcIiwgXG4gICAgXCJydW5uaW5nXCIgOiBmYWxzZSwgXG4gICAgXCJwaGFzZVwiIDogXCJpbmFjdGl2ZVwiLCBcbiAgICBcImxhc3RBcHBsaWVkQ29udGludW91c1RpY2tcIiA6IG51bGwsIFxuICAgIFwibGFzdFByb2Nlc3NlZENvbnRpbnVvdXNUaWNrXCIgOiBudWxsLCBcbiAgICBcImxhc3RBdmFpbGFibGVDb250aW51b3VzVGlja1wiIDogbnVsbCwgXG4gICAgXCJzYWZlUmVzdW1lVGlja1wiIDogbnVsbCwgXG4gICAgXCJwcm9ncmVzc1wiIDogeyBcbiAgICAgIFwidGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE4WlwiLCBcbiAgICAgIFwibWVzc2FnZVwiIDogXCJhcHBsaWVyIHNodXQgZG93blwiLCBcbiAgICAgIFwiZmFpbGVkQ29ubmVjdHNcIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0b3RhbFJlcXVlc3RzXCIgOiAyLCBcbiAgICBcInRvdGFsRmFpbGVkQ29ubmVjdHNcIiA6IDAsIFxuICAgIFwidG90YWxFdmVudHNcIiA6IDAsIFxuICAgIFwidG90YWxEb2N1bWVudHNcIiA6IDAsIFxuICAgIFwidG90YWxSZW1vdmFsc1wiIDogMCwgXG4gICAgXCJ0b3RhbFJlc3luY3NcIiA6IDAsIFxuICAgIFwidG90YWxPcGVyYXRpb25zRXhjbHVkZWRcIiA6IDAsIFxuICAgIFwidG90YWxBcHBseVRpbWVcIiA6IDAsIFxuICAgIFwiYXZlcmFnZUFwcGx5VGltZVwiIDogMCwgXG4gICAgXCJ0b3RhbEZldGNoVGltZVwiIDogMCwgXG4gICAgXCJhdmVyYWdlRmV0Y2hUaW1lXCIgOiAwLCBcbiAgICBcImxhc3RFcnJvclwiIDogeyBcbiAgICAgIFwiZXJyb3JOdW1cIiA6IDAgXG4gICAgfSwgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjUtMDUtMjNUMTg6MTY6MThaXCIgXG4gIH0sIFxuICBcInNlcnZlclwiIDogeyBcbiAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICBcInNlcnZlcklkXCIgOiBcIjExNDQzMzE4NTc0NDM0NlwiIFxuICB9LCBcbiAgXCJlbmRwb2ludFwiIDogXCJ0Y3A6Ly8xMjcuMC4wLjE6ODUyOVwiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvbkFwcGxpZXJTdG9wIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestReplicationLoggerFirstTick_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybmluZyB0aGUgZmlyc3QgYXZhaWxhYmxlIHRpY2sKbmFtZTogUmVzdFJlcGxpY2F0aW9uTG9nZ2VyRmlyc3RUaWNrCi0tLQp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1maXJzdC10aWNrIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1maXJzdC10aWNrJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJmaXJzdFRpY2tcIiA6IFwiMVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHVybmluZyB0aGUgZmlyc3QgYXZhaWxhYmxlIHRpY2siLCJuYW1lIjoiUmVzdFJlcGxpY2F0aW9uTG9nZ2VyRmlyc3RUaWNrIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestReplicationLoggerFollowBufferLimit_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE1vcmUgZXZlbnRzIHRoYW4gd291bGQgZml0IGludG8gdGhlIHJlc3BvbnNlCm5hbWU6IFJlc3RSZXBsaWNhdGlvbkxvZ2dlckZvbGxvd0J1ZmZlckxpbWl0Ci0tLQp2YXIgcmUgPSByZXF1aXJlKCJAYXJhbmdvZGIvcmVwbGljYXRpb24iKTsKZGIuX2Ryb3AoInByb2R1Y3RzIik7Cgp2YXIgbGFzdFRpY2sgPSByZS5sb2dnZXIuc3RhdGUoKS5zdGF0ZS5sYXN0TG9nVGljazsKCmRiLl9jcmVhdGUoInByb2R1Y3RzIik7CmRiLnByb2R1Y3RzLnNhdmUoeyAiX2tleSI6ICJwMSIsICJuYW1lIiA6ICJmbHV4IGNvbXBlbnNhdG9yIiB9KTsKZGIucHJvZHVjdHMuc2F2ZSh7ICJfa2V5IjogInAyIiwgIm5hbWUiIDogImh5YnJpZCBob3ZlcmNyYWZ0IiwgImhwIiA6IDUxMDAgfSk7CmRiLnByb2R1Y3RzLnJlbW92ZSgicDEiKTsKZGIucHJvZHVjdHMudXBkYXRlKCJwMiIsIHsgIm5hbWUiIDogImJyb2tlbiBob3ZlcmNyYWZ0IiB9KTsKZGIucHJvZHVjdHMuZHJvcCgpOwoKcmVxdWlyZSgiaW50ZXJuYWwiKS53YWl0KDEpOwp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1mb2xsb3c/ZnJvbT0iICsgbGFzdFRpY2sgKyAiJmNodW5rU2l6ZT00MDAiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1mb2xsb3c/ZnJvbT0xODkyNzFcdTAwMjZjaHVua1NpemU9NDAwJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1kdW1wXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogOTQ1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWFyYW5nby1yZXBsaWNhdGlvbi1hY3RpdmU6IHRydWVcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWNoZWNrbW9yZTogdHJ1ZVxueC1hcmFuZ28tcmVwbGljYXRpb24tZnJvbXByZXNlbnQ6IHRydWVcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWxhc3RpbmNsdWRlZDogMTg5Mjc2XG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0c2Nhbm5lZDogMTg5MjczXG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0dGljazogMTg5Mjk3XG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwidGlja1wiIDogXCIxODkyNzRcIiwgXG4gIFwidHlwZVwiIDogMjMwMCwgXG4gIFwiZGF0YWJhc2VcIiA6IFwiMVwiLCBcbiAgXCJ0aWRcIiA6IFwiMFwiLCBcbiAgXCJjaWRcIiA6IFwiNFwiLCBcbiAgXCJjbmFtZVwiIDogXCJfdXNlcnNcIiwgXG4gIFwiZGF0YVwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiODVcIiwgXG4gICAgXCJfaWRcIiA6IFwiX3VzZXJzLzg1XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYU5KZS0tLVwiLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgICBcInNvdXJjZVwiIDogXCJMT0NBTFwiLCBcbiAgICBcImF1dGhEYXRhXCIgOiB7IFxuICAgICAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICAgICAgXCJzaW1wbGVcIiA6IHsgXG4gICAgICAgIFwiaGFzaFwiIDogXCIwZmY3OWIwOTA4ZWFjM2Q4ZThmMWViMGE5NmE5ZDQyYzI1ZGEyM2Y1ZWU1MGE1YTBmMDM5NWM1Y2E0N2NmZmEwXCIsIFxuICAgICAgICBcInNhbHRcIiA6IFwiOTljODUxMGVcIiwgXG4gICAgICAgIFwibWV0aG9kXCIgOiBcInNoYTI1NlwiIFxuICAgICAgfSBcbiAgICB9LCBcbiAgICBcImRhdGFiYXNlc1wiIDogeyBcbiAgICAgIFwiX3N5c3RlbVwiIDogeyBcbiAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvbGxlY3Rpb25zXCIgOiB7IFxuICAgICAgICAgIFwic2NoZW1hQ29sbGVjdGlvblwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiKlwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwibXljb2xsZWN0aW9uXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJkZW1vXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJpZ25vcmVcIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImFuaW1hbHNcIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcInByb2R1Y3RzXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJwcm9kdWN0czFcIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9IFxuICAgICAgICB9IFxuICAgICAgfSwgXG4gICAgICBcIipcIiA6IHsgXG4gICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjb2xsZWN0aW9uc1wiIDogeyBcbiAgICAgICAgICBcIipcIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9IFxuICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6Ik1vcmUgZXZlbnRzIHRoYW4gd291bGQgZml0IGludG8gdGhlIHJlc3BvbnNlIiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvbkxvZ2dlckZvbGxvd0J1ZmZlckxpbWl0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestReplicationLoggerFollowEmpty_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE5vIGxvZyBldmVudHMgYXZhaWxhYmxlCm5hbWU6IFJlc3RSZXBsaWNhdGlvbkxvZ2dlckZvbGxvd0VtcHR5Ci0tLQp2YXIgcmUgPSByZXF1aXJlKCJAYXJhbmdvZGIvcmVwbGljYXRpb24iKTsKdmFyIGxhc3RUaWNrID0gcmUubG9nZ2VyLnN0YXRlKCkuc3RhdGUubGFzdExvZ1RpY2s7Cgp2YXIgdXJsID0gIi9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1mb2xsb3c/ZnJvbT0iICsgbGFzdFRpY2s7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwNCk7Cgpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1mb2xsb3c/ZnJvbT0xODkyNDUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjA0IE5vIENvbnRlbnRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tZHVtcFxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWFjdGl2ZTogdHJ1ZVxueC1hcmFuZ28tcmVwbGljYXRpb24tY2hlY2ttb3JlOiBmYWxzZVxueC1hcmFuZ28tcmVwbGljYXRpb24tZnJvbXByZXNlbnQ6IHRydWVcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWxhc3RpbmNsdWRlZDogMFxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdHNjYW5uZWQ6IDE4OTI0NVxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdHRpY2s6IDE4OTI0NVxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6Ik5vIGxvZyBldmVudHMgYXZhaWxhYmxlIiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvbkxvZ2dlckZvbGxvd0VtcHR5IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestReplicationLoggerFollowSome_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEEgZmV3IGxvZyBldmVudHMgKihPbmUgSlNPTiBkb2N1bWVudCBwZXIgbGluZSkqCm5hbWU6IFJlc3RSZXBsaWNhdGlvbkxvZ2dlckZvbGxvd1NvbWUKLS0tCnZhciByZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9yZXBsaWNhdGlvbiIpOwpkYi5fZHJvcCgicHJvZHVjdHMiKTsKCnZhciBsYXN0VGljayA9IHJlLmxvZ2dlci5zdGF0ZSgpLnN0YXRlLmxhc3RMb2dUaWNrOwoKZGIuX2NyZWF0ZSgicHJvZHVjdHMiKTsKZGIucHJvZHVjdHMuc2F2ZSh7ICJfa2V5IjogInAxIiwgIm5hbWUiIDogImZsdXggY29tcGVuc2F0b3IiIH0pOwpkYi5wcm9kdWN0cy5zYXZlKHsgIl9rZXkiOiAicDIiLCAibmFtZSIgOiAiaHlicmlkIGhvdmVyY3JhZnQiLCAiaHAiIDogNTEwMCB9KTsKZGIucHJvZHVjdHMucmVtb3ZlKCJwMSIpOwpkYi5wcm9kdWN0cy51cGRhdGUoInAyIiwgeyAibmFtZSIgOiAiYnJva2VuIGhvdmVyY3JhZnQiIH0pOwpkYi5wcm9kdWN0cy5kcm9wKCk7CgpyZXF1aXJlKCJpbnRlcm5hbCIpLndhaXQoMSk7CnZhciB1cmwgPSAiL19hcGkvcmVwbGljYXRpb24vbG9nZ2VyLWZvbGxvdz9mcm9tPSIgKyBsYXN0VGljazsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25MUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1mb2xsb3c/ZnJvbT0xODkyNDUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWR1bXBcbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxOTU2XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWFyYW5nby1yZXBsaWNhdGlvbi1hY3RpdmU6IHRydWVcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWNoZWNrbW9yZTogZmFsc2VcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWZyb21wcmVzZW50OiB0cnVlXG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0aW5jbHVkZWQ6IDE4OTI3MVxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdHNjYW5uZWQ6IDE4OTI2OFxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdHRpY2s6IDE4OTI3MVxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInRpY2tcIiA6IFwiMTg5MjQ4XCIsIFxuICBcInR5cGVcIiA6IDIzMDAsIFxuICBcImRhdGFiYXNlXCIgOiBcIjFcIiwgXG4gIFwidGlkXCIgOiBcIjBcIiwgXG4gIFwiY2lkXCIgOiBcIjRcIiwgXG4gIFwiY25hbWVcIiA6IFwiX3VzZXJzXCIsIFxuICBcImRhdGFcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcIjg1XCIsIFxuICAgIFwiX2lkXCIgOiBcIl91c2Vycy84NVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FNSmUtLS1cIiwgXG4gICAgXCJ1c2VyXCIgOiBcInJvb3RcIiwgXG4gICAgXCJzb3VyY2VcIiA6IFwiTE9DQUxcIiwgXG4gICAgXCJhdXRoRGF0YVwiIDogeyBcbiAgICAgIFwiYWN0aXZlXCIgOiB0cnVlLCBcbiAgICAgIFwic2ltcGxlXCIgOiB7IFxuICAgICAgICBcImhhc2hcIiA6IFwiMGZmNzliMDkwOGVhYzNkOGU4ZjFlYjBhOTZhOWQ0MmMyNWRhMjNmNWVlNTBhNWEwZjAzOTVjNWNhNDdjZmZhMFwiLCBcbiAgICAgICAgXCJzYWx0XCIgOiBcIjk5Yzg1MTBlXCIsIFxuICAgICAgICBcIm1ldGhvZFwiIDogXCJzaGEyNTZcIiBcbiAgICAgIH0gXG4gICAgfSwgXG4gICAgXCJkYXRhYmFzZXNcIiA6IHsgXG4gICAgICBcIl9zeXN0ZW1cIiA6IHsgXG4gICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJjb2xsZWN0aW9uc1wiIDogeyBcbiAgICAgICAgICBcInNjaGVtYUNvbGxlY3Rpb25cIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcIipcIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcIm15Y29sbGVjdGlvblwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiZGVtb1wiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiaWdub3JlXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJhbmltYWxzXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJwcm9kdWN0c1wiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwicHJvZHVjdHMxXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCIqXCIgOiB7IFxuICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiY29sbGVjdGlvbnNcIiA6IHsgXG4gICAgICAgICAgXCIqXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSBcbiAgICAgICAgfSBcbiAgICAgIH0gXG4gICAgfSBcbiAgfSBcbn17IFxuICBcInRpY2tcIiA6IFwiMTg5MjYxXCIsIFxuICBcInR5cGVcIiA6IDIwMDEsIFxuICBcImRhdGFiYXNlXCIgOiBcIjFcIiwgXG4gIFwiY3VpZFwiIDogXCJoNjgxMzhENjMwNURBLzcyMzYyXCIsIFxuICBcImNpZFwiIDogXCI3MjM2MlwiLCBcbiAgXCJkYXRhXCIgOiB7IFxuICAgIFwiaWRcIiA6IFwiNzIzNjJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIlwiIFxuICB9IFxufXsgXG4gIFwidGlja1wiIDogXCIxODkyNjlcIiwgXG4gIFwidHlwZVwiIDogMjMwMCwgXG4gIFwiZGF0YWJhc2VcIiA6IFwiMVwiLCBcbiAgXCJ0aWRcIiA6IFwiMFwiLCBcbiAgXCJjaWRcIiA6IFwiNFwiLCBcbiAgXCJjbmFtZVwiIDogXCJfdXNlcnNcIiwgXG4gIFwiZGF0YVwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiODVcIiwgXG4gICAgXCJfaWRcIiA6IFwiX3VzZXJzLzg1XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYU1KbS0tLVwiLCBcbiAgICBcInVzZXJcIiA6IFwicm9vdFwiLCBcbiAgICBcInNvdXJjZVwiIDogXCJMT0NBTFwiLCBcbiAgICBcImF1dGhEYXRhXCIgOiB7IFxuICAgICAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICAgICAgXCJzaW1wbGVcIiA6IHsgXG4gICAgICAgIFwiaGFzaFwiIDogXCIwZmY3OWIwOTA4ZWFjM2Q4ZThmMWViMGE5NmE5ZDQyYzI1ZGEyM2Y1ZWU1MGE1YTBmMDM5NWM1Y2E0N2NmZmEwXCIsIFxuICAgICAgICBcInNhbHRcIiA6IFwiOTljODUxMGVcIiwgXG4gICAgICAgIFwibWV0aG9kXCIgOiBcInNoYTI1NlwiIFxuICAgICAgfSBcbiAgICB9LCBcbiAgICBcImRhdGFiYXNlc1wiIDogeyBcbiAgICAgIFwiKlwiIDogeyBcbiAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvbGxlY3Rpb25zXCIgOiB7IFxuICAgICAgICAgIFwiKlwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0gXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIFwiX3N5c3RlbVwiIDogeyBcbiAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgIH0sIFxuICAgICAgICBcImNvbGxlY3Rpb25zXCIgOiB7IFxuICAgICAgICAgIFwicHJvZHVjdHMxXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJhbmltYWxzXCIgOiB7IFxuICAgICAgICAgICAgXCJwZXJtaXNzaW9uc1wiIDogeyBcbiAgICAgICAgICAgICAgXCJyZWFkXCIgOiB0cnVlLCBcbiAgICAgICAgICAgICAgXCJ3cml0ZVwiIDogdHJ1ZSBcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgfSwgXG4gICAgICAgICAgXCJpZ25vcmVcIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcImRlbW9cIiA6IHsgXG4gICAgICAgICAgICBcInBlcm1pc3Npb25zXCIgOiB7IFxuICAgICAgICAgICAgICBcInJlYWRcIiA6IHRydWUsIFxuICAgICAgICAgICAgICBcIndyaXRlXCIgOiB0cnVlIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9LCBcbiAgICAgICAgICBcIm15Y29sbGVjdGlvblwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwiKlwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0sIFxuICAgICAgICAgIFwic2NoZW1hQ29sbGVjdGlvblwiIDogeyBcbiAgICAgICAgICAgIFwicGVybWlzc2lvbnNcIiA6IHsgXG4gICAgICAgICAgICAgIFwicmVhZFwiIDogdHJ1ZSwgXG4gICAgICAgICAgICAgIFwid3JpdGVcIiA6IHRydWUgXG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0gXG4gICAgICAgIH0gXG4gICAgICB9IFxuICAgIH0gXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQSBmZXcgbG9nIGV2ZW50cyAqKE9uZSBKU09OIGRvY3VtZW50IHBlciBsaW5lKSoiLCJuYW1lIjoiUmVzdFJlcGxpY2F0aW9uTG9nZ2VyRm9sbG93U29tZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestReplicationLoggerStateActive_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSByZXBsaWNhdGlvbiBsb2dnZXIuCm5hbWU6IFJlc3RSZXBsaWNhdGlvbkxvZ2dlclN0YXRlQWN0aXZlCi0tLQp2YXIgcmUgPSByZXF1aXJlKCJAYXJhbmdvZGIvcmVwbGljYXRpb24iKTsKCnZhciB1cmwgPSAiL19hcGkvcmVwbGljYXRpb24vbG9nZ2VyLXN0YXRlIjsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci1zdGF0ZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDIyNlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInN0YXRlXCIgOiB7IFxuICAgIFwicnVubmluZ1wiIDogdHJ1ZSwgXG4gICAgXCJsYXN0TG9nVGlja1wiIDogXCIxODkyNDVcIiwgXG4gICAgXCJsYXN0VW5jb21taXR0ZWRMb2dUaWNrXCIgOiBcIjE4OTI0NVwiLCBcbiAgICBcInRvdGFsRXZlbnRzXCIgOiAxODkyNDUsIFxuICAgIFwidGltZVwiIDogXCIyMDI1LTA1LTIzVDE4OjE2OjE4WlwiIFxuICB9LCBcbiAgXCJzZXJ2ZXJcIiA6IHsgXG4gICAgXCJ2ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gICAgXCJzZXJ2ZXJJZFwiIDogXCIxMTQ0MzMxODU3NDQzNDZcIiwgXG4gICAgXCJlbmdpbmVcIiA6IFwicm9ja3NkYlwiIFxuICB9LCBcbiAgXCJjbGllbnRzXCIgOiBbIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHJlcGxpY2F0aW9uIGxvZ2dlci4iLCJuYW1lIjoiUmVzdFJlcGxpY2F0aW9uTG9nZ2VyU3RhdGVBY3RpdmUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestReplicationLoggerTickRanges_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybnMgdGhlIGF2YWlsYWJsZSB0aWNrIHJhbmdlcy4KbmFtZTogUmVzdFJlcGxpY2F0aW9uTG9nZ2VyVGlja1JhbmdlcwotLS0KdmFyIHVybCA9ICIvX2FwaS9yZXBsaWNhdGlvbi9sb2dnZXItdGljay1yYW5nZXMiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL2xvZ2dlci10aWNrLXJhbmdlcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEyMDVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgeyBcbiAgICBcImRhdGFmaWxlXCIgOiBcIi9hcmNoaXZlLzAwMDAwNC5sb2dcIiwgXG4gICAgXCJzdGF0dXNcIiA6IFwiY29sbGVjdGVkXCIsIFxuICAgIFwidGlja01pblwiIDogXCIxXCIsIFxuICAgIFwidGlja01heFwiIDogXCIxNzg1NjRcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAwNDQubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTc4NTY0XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxNzkwNjlcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAwNTUubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTc5MDY5XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxNzkwODhcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAwNjAubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTc5MDg4XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODAyMjdcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAwNjkubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwMjI3XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODAyNzNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAwNzgubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwMjczXCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODAzODZcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAxMDMubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwMzg2XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODA0NDFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAxMDkubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwNDQxXCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODA0OTZcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAxMTIubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwNDk2XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODA1NTFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAxMTQubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwNTUxXCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODA2MDZcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAxMTcubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwNjA2XCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODA2NjFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvYXJjaGl2ZS8wMDAxMTkubG9nXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbGxlY3RlZFwiLCBcbiAgICBcInRpY2tNaW5cIiA6IFwiMTgwNjYxXCIsIFxuICAgIFwidGlja01heFwiIDogXCIxODA3MzNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRhZmlsZVwiIDogXCIvMDAwMTIyLmxvZ1wiLCBcbiAgICBcInN0YXR1c1wiIDogXCJvcGVuXCIsIFxuICAgIFwidGlja01pblwiIDogXCIxODA3MzNcIiwgXG4gICAgXCJ0aWNrTWF4XCIgOiBcIjE4OTI5N1wiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHVybnMgdGhlIGF2YWlsYWJsZSB0aWNrIHJhbmdlcy4iLCJuYW1lIjoiUmVzdFJlcGxpY2F0aW9uTG9nZ2VyVGlja1JhbmdlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestReplicationServerId_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmVwbGljYXRpb25TZXJ2ZXJJZAotLS0KdmFyIHVybCA9ICIvX2FwaS9yZXBsaWNhdGlvbi9zZXJ2ZXItaWQiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3JlcGxpY2F0aW9uL3NlcnZlci1pZCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDMwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwic2VydmVySWRcIiA6IFwiMTE0NDMzMTg1NzQ0MzQ2XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RSZXBsaWNhdGlvblNlcnZlcklkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestRevokeCollection_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmV2b2tlQ29sbGVjdGlvbgotLS0KdmFyIHVzZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIik7CnZhciB0aGVVc2VyID0gImFkbWluQG15YXBwIjsKdHJ5IHsgdXNlcnMucmVtb3ZlKHRoZVVzZXIpOyB9IGNhdGNoIChlcnIpIHt9CnRyeSB7IGRiX2Ryb3AoInJlcG9ydHMiKTsgfSBjYXRjaCAoZXJyKSB7fQpkYi5fY3JlYXRlKCJyZXBvcnRzIik7CnVzZXJzLnNhdmUodGhlVXNlciwgInNlY3JldCIpCnVzZXJzLmdyYW50Q29sbGVjdGlvbih0aGVVc2VyLCAiX3N5c3RlbSIsICJyZXBvcnRzIiwgInJ3Iik7Cgp2YXIgdXJsID0gIi9fYXBpL3VzZXIvIiArIHRoZVVzZXIgKyAiL2RhdGFiYXNlL19zeXN0ZW0vcmVwb3J0cyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CmRiLl9kcm9wKCJyZXBvcnRzIik7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwp1c2Vycy5yZW1vdmUodGhlVXNlcik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS91c2VyL2FkbWluQG15YXBwL2RhdGFiYXNlL19zeXN0ZW0vcmVwb3J0cyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDI2XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RSZXZva2VDb2xsZWN0aW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestRevokeDatabase_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0UmV2b2tlRGF0YWJhc2UKLS0tCnZhciB1c2VycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpOwp2YXIgdGhlVXNlciA9ICJhZG1pbkBteWFwcCI7CnRyeSB7IHVzZXJzLnJlbW92ZSh0aGVVc2VyKTsgfSBjYXRjaCAoZXJyKSB7fQp1c2Vycy5zYXZlKHRoZVVzZXIsICJzZWNyZXQiKQoKdmFyIHVybCA9ICIvX2FwaS91c2VyLyIgKyB0aGVVc2VyICsgIi9kYXRhYmFzZS9fc3lzdGVtIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CnVzZXJzLnJlbW92ZSh0aGVVc2VyKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS91c2VyL2FkbWluQG15YXBwL2RhdGFiYXNlL19zeXN0ZW0nIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyNlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAyIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0UmV2b2tlRGF0YWJhc2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestTasksCreate_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0VGFza3NDcmVhdGUKLS0tCnZhciB1cmwgPSAiL19hcGkvdGFza3MvIjsKCi8vIE5vdGU6IHByaW50cyBzdHVmZiBpZiBzZXJ2ZXIgaXMgcnVubmluZyBpbiBub24tZGFlbW9uIG1vZGUuCnZhciBzYW1wbGVUYXNrID0gewogIG5hbWU6ICJTYW1wbGVUYXNrIiwKICBjb21tYW5kOiAiKGZ1bmN0aW9uKHBhcmFtcykgeyByZXF1aXJlKCdAYXJhbmdvZGInKS5wcmludChwYXJhbXMpOyB9KShwYXJhbXMpIiwKICBwYXJhbXM6IHsgImZvbyI6ICJiYXIiLCAiYmFyIjogImZvbyJ9LAogIHBlcmlvZDogMgp9CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUYXNrKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCi8vIENsZWFudXA6CmN1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwgKyByZXNwb25zZS5wYXJzZWRCb2R5LmlkKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90YXNrcy8nIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibmFtZVwiOiBcIlNhbXBsZVRhc2tcIixcbiAgXCJjb21tYW5kXCI6IFwiKGZ1bmN0aW9uKHBhcmFtcykgeyByZXF1aXJlKCdAYXJhbmdvZGInKS5wcmludChwYXJhbXMpOyB9KShwYXJhbXMpXCIsXG4gIFwicGFyYW1zXCI6IHtcbiAgICBcImZvb1wiOiBcImJhclwiLFxuICAgIFwiYmFyXCI6IFwiZm9vXCJcbiAgfSxcbiAgXCJwZXJpb2RcIjogMlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyNDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJpZFwiIDogXCI3MDE1MVwiLCBcbiAgXCJuYW1lXCIgOiBcIlNhbXBsZVRhc2tcIiwgXG4gIFwiY3JlYXRlZFwiIDogMTc0ODAyNDE3NS43OTE2MzM2LCBcbiAgXCJ0eXBlXCIgOiBcInBlcmlvZGljXCIsIFxuICBcInBlcmlvZFwiIDogMiwgXG4gIFwib2Zmc2V0XCIgOiAwLCBcbiAgXCJjb21tYW5kXCIgOiBcIihmdW5jdGlvbiAocGFyYW1zKSB7IChmdW5jdGlvbihwYXJhbXMpIHsgcmVxdWlyZSgnQGFyYW5nb2RiJykucHJpbnQocGFyYW1zKTsgfSkocGFyYW1zKSB9ICkocGFyYW1zKTtcIiwgXG4gIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0VGFza3NDcmVhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestTasksDeleteFail_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFRyeSB0byBkZWxldGUgYSBub24tZXhpc3RlbnQgdGFzazoKbmFtZTogUmVzdFRhc2tzRGVsZXRlRmFpbAotLS0KdmFyIHVybCA9ICIvX2FwaS90YXNrcy9Ob1Rhc2tXaXRoVGhhdE5hbWUiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90YXNrcy9Ob1Rhc2tXaXRoVGhhdE5hbWUnIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzNcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwidGFzayBub3QgZm91bmRcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDE4NTIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVHJ5IHRvIGRlbGV0ZSBhIG5vbi1leGlzdGVudCB0YXNrOiIsIm5hbWUiOiJSZXN0VGFza3NEZWxldGVGYWlsIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTasksDelete_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlbW92ZSBleGlzdGluZyB0YXNrOgpuYW1lOiBSZXN0VGFza3NEZWxldGUKLS0tCnZhciB1cmwgPSAiL19hcGkvdGFza3MvIjsKCnZhciBzYW1wbGVUYXNrID0gewogIGlkOiAiU2FtcGxlVGFzayIsCiAgbmFtZTogIlNhbXBsZVRhc2siLAogIGNvbW1hbmQ6ICIyKzI7IiwKICBwZXJpb2Q6IDIKfQovLyBFbnN1cmUgaXQncyByZWFsbHkgbm90IHRoZXJlOgpjdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsICsgc2FtcGxlVGFzay5pZCwgbnVsbCwgbnVsbCwgWzQwNCwyMDBdKTsKLy8gcHV0IGluIHNvbWV0aGluZyB3ZSBtYXkgZGVsZXRlOgpjdXJsUmVxdWVzdCgnUFVUJywgdXJsICsgc2FtcGxlVGFzay5pZCwKICAgICAgICAgICAgc2FtcGxlVGFzayk7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsICsgc2FtcGxlVGFzay5pZCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90YXNrcy9TYW1wbGVUYXNrJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMjZcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZW1vdmUgZXhpc3RpbmcgdGFzazoiLCJuYW1lIjoiUmVzdFRhc2tzRGVsZXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTasksListAll_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiBGZXRjaGluZyBhbGwgdGFza3MKbmFtZTogUmVzdFRhc2tzTGlzdEFsbAotLS0KdmFyIHVybCA9ICIvX2FwaS90YXNrcyI7Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3Rhc2tzJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5bIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJGZXRjaGluZyBhbGwgdGFza3MiLCJuYW1lIjoiUmVzdFRhc2tzTGlzdEFsbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTasksListNonExisting_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiBUcnlpbmcgdG8gZmV0Y2ggYSBub24tZXhpc3RpbmcgdGFzawpuYW1lOiBSZXN0VGFza3NMaXN0Tm9uRXhpc3RpbmcKLS0tCnZhciB1cmwgPSAiL19hcGkvdGFza3Mvbm9uLWV4aXN0aW5nLXRhc2siOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3Rhc2tzL25vbi1leGlzdGluZy10YXNrJyIsIm91dHB1dCI6IkhUVFAvMS4xIDQwNCBOb3QgRm91bmRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDczXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogNDA0LCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcInRhc2sgbm90IGZvdW5kXCIsIFxuICBcImVycm9yTnVtXCIgOiAxODUyIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlRyeWluZyB0byBmZXRjaCBhIG5vbi1leGlzdGluZyB0YXNrIiwibmFtZSI6IlJlc3RUYXNrc0xpc3ROb25FeGlzdGluZyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTasksListOne_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiBGZXRjaGluZyBhIHNpbmdsZSB0YXNrIGJ5IGl0cyBpZApuYW1lOiBSZXN0VGFza3NMaXN0T25lCi0tLQp2YXIgdXJsID0gIi9fYXBpL3Rhc2tzIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIEpTT04uc3RyaW5naWZ5KHsgaWQ6ICJ0ZXN0VGFzayIsIGNvbW1hbmQ6ICJjb25zb2xlLmxvZygnSGVsbG8gZnJvbSB0YXNrIScpOyIsIG9mZnNldDogMTAwMDAgfSkpOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCArICIvdGVzdFRhc2siKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90YXNrcycgXHUwMDNjXHUwMDNjJ0VPRidcbntcImlkXCI6XCJ0ZXN0VGFza1wiLFwiY29tbWFuZFwiOlwiY29uc29sZS5sb2coJ0hlbGxvIGZyb20gdGFzayEnKTtcIixcIm9mZnNldFwiOjEwMDAwfVxuRU9GXG5cbmN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3Rhc2tzL3Rlc3RUYXNrJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMjA2XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiaWRcIiA6IFwidGVzdFRhc2tcIiwgXG4gIFwibmFtZVwiIDogXCJ1c2VyLWRlZmluZWQgdGFza1wiLCBcbiAgXCJjcmVhdGVkXCIgOiAxNzQ4MDI0MTc1Ljc2MjE3NzIsIFxuICBcInR5cGVcIiA6IFwidGltZWRcIiwgXG4gIFwib2Zmc2V0XCIgOiAxMDAwMCwgXG4gIFwiY29tbWFuZFwiIDogXCIoZnVuY3Rpb24gKHBhcmFtcykgeyBjb25zb2xlLmxvZygnSGVsbG8gZnJvbSB0YXNrIScpOyB9ICkocGFyYW1zKTtcIiwgXG4gIFwiZGF0YWJhc2VcIiA6IFwiX3N5c3RlbVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkZldGNoaW5nIGEgc2luZ2xlIHRhc2sgYnkgaXRzIGlkIiwibmFtZSI6IlJlc3RUYXNrc0xpc3RPbmUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestTasksPutWithId_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0VGFza3NQdXRXaXRoSWQKLS0tCnZhciB1cmwgPSAiL19hcGkvdGFza3MvIjsKCi8vIE5vdGU6IHByaW50cyBzdHVmZiBpZiBzZXJ2ZXIgaXMgcnVubmluZyBpbiBub24tZGFlbW9uIG1vZGUuCnZhciBzYW1wbGVUYXNrID0gewogIGlkOiAiU2FtcGxlVGFzayIsCiAgbmFtZTogIlNhbXBsZVRhc2siLAogIGNvbW1hbmQ6ICIoZnVuY3Rpb24ocGFyYW1zKSB7IHJlcXVpcmUoJ0BhcmFuZ29kYicpLnByaW50KHBhcmFtcyk7IH0pKHBhcmFtcykiLAogIHBhcmFtczogeyAiZm9vIjogImJhciIsICJiYXIiOiAiZm9vIn0sCiAgcGVyaW9kOiAyCn0KdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCArICdzYW1wbGVUYXNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGFzayk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCi8vIENsZWFudXA6CmN1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwgKyAnc2FtcGxlVGFzaycpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3Rhc2tzL3NhbXBsZVRhc2snIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaWRcIjogXCJTYW1wbGVUYXNrXCIsXG4gIFwibmFtZVwiOiBcIlNhbXBsZVRhc2tcIixcbiAgXCJjb21tYW5kXCI6IFwiKGZ1bmN0aW9uKHBhcmFtcykgeyByZXF1aXJlKCdAYXJhbmdvZGInKS5wcmludChwYXJhbXMpOyB9KShwYXJhbXMpXCIsXG4gIFwicGFyYW1zXCI6IHtcbiAgICBcImZvb1wiOiBcImJhclwiLFxuICAgIFwiYmFyXCI6IFwiZm9vXCJcbiAgfSxcbiAgXCJwZXJpb2RcIjogMlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAyNDVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJpZFwiIDogXCJzYW1wbGVUYXNrXCIsIFxuICBcIm5hbWVcIiA6IFwiU2FtcGxlVGFza1wiLCBcbiAgXCJjcmVhdGVkXCIgOiAxNzQ4MDI0MTc1LjgxMzUyODUsIFxuICBcInR5cGVcIiA6IFwicGVyaW9kaWNcIiwgXG4gIFwicGVyaW9kXCIgOiAyLCBcbiAgXCJvZmZzZXRcIiA6IDAsIFxuICBcImNvbW1hbmRcIiA6IFwiKGZ1bmN0aW9uIChwYXJhbXMpIHsgKGZ1bmN0aW9uKHBhcmFtcykgeyByZXF1aXJlKCdAYXJhbmdvZGInKS5wcmludChwYXJhbXMpOyB9KShwYXJhbXMpIH0gKShwYXJhbXMpO1wiLCBcbiAgXCJkYXRhYmFzZVwiIDogXCJfc3lzdGVtXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RUYXNrc1B1dFdpdGhJZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTransactionAbortInternal_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEFib3J0aW5nIGEgdHJhbnNhY3Rpb24gZHVlIHRvIGFuIGludGVybmFsIGVycm9yCm5hbWU6IFJlc3RUcmFuc2FjdGlvbkFib3J0SW50ZXJuYWwKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIHByb2R1Y3RzID0gZGIuX2NyZWF0ZShjbik7CnZhciB1cmwgPSAiL19hcGkvdHJhbnNhY3Rpb24iOwp2YXIgYm9keSA9IHsKICBjb2xsZWN0aW9uczogewogICAgd3JpdGUgOiAicHJvZHVjdHMiCiAgfSwKICBhY3Rpb24gOiAoCiAgICAiZnVuY3Rpb24gKCkgeyIgKwogICAgInZhciBkYiA9IHJlcXVpcmUoJ0BhcmFuZ29kYicpLmRiOyIgKwogICAgImRiLnByb2R1Y3RzLnNhdmUoeyBfa2V5OiAnYWJjJ30pOyIgKwogICAgImRiLnByb2R1Y3RzLnNhdmUoeyBfa2V5OiAnYWJjJ30pOyIgKwogICAgIn0iCiAgKQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA5KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJ3cml0ZVwiOiBcInByb2R1Y3RzXCJcbiAgfSxcbiAgXCJhY3Rpb25cIjogXCJmdW5jdGlvbiAoKSB7dmFyIGRiID0gcmVxdWlyZSgnQGFyYW5nb2RiJykuZGI7ZGIucHJvZHVjdHMuc2F2ZSh7IF9rZXk6ICdhYmMnfSk7ZGIucHJvZHVjdHMuc2F2ZSh7IF9rZXk6ICdhYmMnfSk7fVwiXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDkgQ29uZmxpY3RcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE1NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwOSwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJ1bmlxdWUgY29uc3RyYWludCB2aW9sYXRlZCAtIGluIGluZGV4IHByaW1hcnkgb2YgdHlwZSBwcmltYXJ5IG92ZXIgJ19rZXknOyBjb25mbGljdGluZyBrZXk6IGFiY1wiLCBcbiAgXCJlcnJvck51bVwiIDogMTIxMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJBYm9ydGluZyBhIHRyYW5zYWN0aW9uIGR1ZSB0byBhbiBpbnRlcm5hbCBlcnJvciIsIm5hbWUiOiJSZXN0VHJhbnNhY3Rpb25BYm9ydEludGVybmFsIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTransactionAbort_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEFib3J0aW5nIGEgdHJhbnNhY3Rpb24gYnkgZXhwbGljaXRseSB0aHJvd2luZyBhbiBleGNlcHRpb24KbmFtZTogUmVzdFRyYW5zYWN0aW9uQWJvcnQKLS0tCnZhciBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKdmFyIHByb2R1Y3RzID0gZGIuX2NyZWF0ZShjbiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKcHJvZHVjdHMuc2F2ZSh7ICJhIjogMSB9KTsKdmFyIHVybCA9ICIvX2FwaS90cmFuc2FjdGlvbiI7CnZhciBib2R5ID0gewogIGNvbGxlY3Rpb25zOiB7CiAgICByZWFkIDogInByb2R1Y3RzIgogIH0sCiAgYWN0aW9uIDogImZ1bmN0aW9uICgpIHsgdGhyb3cgJ2RvaCEnOyB9Igp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNTAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJyZWFkXCI6IFwicHJvZHVjdHNcIlxuICB9LFxuICBcImFjdGlvblwiOiBcImZ1bmN0aW9uICgpIHsgdGhyb3cgJ2RvaCEnOyB9XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDYzXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogNTAwLCBcbiAgXCJlcnJvclwiIDogdHJ1ZSwgXG4gIFwiZXJyb3JNZXNzYWdlXCIgOiBcImRvaCFcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDE2NTAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQWJvcnRpbmcgYSB0cmFuc2FjdGlvbiBieSBleHBsaWNpdGx5IHRocm93aW5nIGFuIGV4Y2VwdGlvbiIsIm5hbWUiOiJSZXN0VHJhbnNhY3Rpb25BYm9ydCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTransactionBeginAbort_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIENvbW1pdHRpbmcgYSB0cmFuc2FjdGlvbjoKbmFtZTogUmVzdFRyYW5zYWN0aW9uQmVnaW5BYm9ydAotLS0KY29uc3QgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CmRiLl9jcmVhdGUoY24pOwpsZXQgYm9keSA9IHsKICBjb2xsZWN0aW9uczogewogICAgcmVhZCA6IGNuCiAgfQp9OwpsZXQgdHJ4ID0gZGIuX2NyZWF0ZVRyYW5zYWN0aW9uKGJvZHkpOwpsZXQgdXJsID0gIi9fYXBpL3RyYW5zYWN0aW9uLyIgKyB0cnguaWQoKTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbi83MjQ3MiciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDcxXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcInJlc3VsdFwiIDogeyBcbiAgICBcImlkXCIgOiBcIjcyNDcyXCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImNvbW1pdHRlZFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNvbW1pdHRpbmcgYSB0cmFuc2FjdGlvbjoiLCJuYW1lIjoiUmVzdFRyYW5zYWN0aW9uQmVnaW5BYm9ydCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTransactionBeginCommit_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEFib3J0aW5nIGEgdHJhbnNhY3Rpb246Cm5hbWU6IFJlc3RUcmFuc2FjdGlvbkJlZ2luQ29tbWl0Ci0tLQpjb25zdCBjbiA9ICJwcm9kdWN0cyI7CmRiLl9kcm9wKGNuKTsKZGIuX2NyZWF0ZShjbik7CmxldCBib2R5ID0gewogIGNvbGxlY3Rpb25zOiB7CiAgICByZWFkIDogY24KICB9Cn07CmxldCB0cnggPSBkYi5fY3JlYXRlVHJhbnNhY3Rpb24oYm9keSk7CmxldCB1cmwgPSAiL19hcGkvdHJhbnNhY3Rpb24vIiArIHRyeC5pZCgpOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wKGNuKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbi83MjQ3OSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDY5XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcInJlc3VsdFwiIDogeyBcbiAgICBcImlkXCIgOiBcIjcyNDc5XCIsIFxuICAgIFwic3RhdHVzXCIgOiBcImFib3J0ZWRcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJBYm9ydGluZyBhIHRyYW5zYWN0aW9uOiIsIm5hbWUiOiJSZXN0VHJhbnNhY3Rpb25CZWdpbkNvbW1pdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTransactionBeginNonExisting_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlZmVycmluZyB0byBhIG5vbi1leGlzdGluZyBjb2xsZWN0aW9uCm5hbWU6IFJlc3RUcmFuc2FjdGlvbkJlZ2luTm9uRXhpc3RpbmcKLS0tCmNvbnN0IGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpsZXQgdXJsID0gIi9fYXBpL3RyYW5zYWN0aW9uL2JlZ2luIjsKbGV0IGJvZHkgPSB7CiAgY29sbGVjdGlvbnM6IHsKICAgIHJlYWQgOiAicHJvZHVjdHMiCiAgfQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbi9iZWdpbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJyZWFkXCI6IFwicHJvZHVjdHNcIlxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSA0MDQgTm90IEZvdW5kXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwNCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJjb2xsZWN0aW9uIG9yIHZpZXcgbm90IGZvdW5kOiBwcm9kdWN0c1wiLCBcbiAgXCJlcnJvck51bVwiIDogMTIwMyBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSZWZlcnJpbmcgdG8gYSBub24tZXhpc3RpbmcgY29sbGVjdGlvbiIsIm5hbWUiOiJSZXN0VHJhbnNhY3Rpb25CZWdpbk5vbkV4aXN0aW5nIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTransactionBeginSingle_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGluZyBhIHRyYW5zYWN0aW9uIG9uIGEgc2luZ2xlIGNvbGxlY3Rpb24KbmFtZTogUmVzdFRyYW5zYWN0aW9uQmVnaW5TaW5nbGUKLS0tCmNvbnN0IGNuID0gInByb2R1Y3RzIjsKZGIuX2Ryb3AoY24pOwpkYi5fY3JlYXRlKGNuKTsKbGV0IHVybCA9ICIvX2FwaS90cmFuc2FjdGlvbi9iZWdpbiI7CmxldCBib2R5ID0gewogIGNvbGxlY3Rpb25zOiB7CiAgICB3cml0ZSA6IGNuCiAgfSwKfTsKCmxldCByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7Cgp1cmwgPSAiL19hcGkvdHJhbnNhY3Rpb24vIiArIHJlc3BvbnNlLnBhcnNlZEJvZHkucmVzdWx0LmlkOwpkYi5fY29ubmVjdGlvbi5ERUxFVEUodXJsKTsKZGIuX2Ryb3AoY24pOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbi9iZWdpbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJ3cml0ZVwiOiBcInByb2R1Y3RzXCJcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDY5XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiY29kZVwiIDogMjAxLCBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcInJlc3VsdFwiIDogeyBcbiAgICBcImlkXCIgOiBcIjcyNDU3XCIsIFxuICAgIFwic3RhdHVzXCIgOiBcInJ1bm5pbmdcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeGVjdXRpbmcgYSB0cmFuc2FjdGlvbiBvbiBhIHNpbmdsZSBjb2xsZWN0aW9uIiwibmFtZSI6IlJlc3RUcmFuc2FjdGlvbkJlZ2luU2luZ2xlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTransactionGet_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEdldCB0cmFuc2FjdGlvbiBzdGF0dXMKbmFtZTogUmVzdFRyYW5zYWN0aW9uR2V0Ci0tLQpkYi5fZHJvcCgicHJvZHVjdHMiKTsKZGIuX2NyZWF0ZSgicHJvZHVjdHMiKTsKbGV0IGJvZHkgPSB7CiAgY29sbGVjdGlvbnM6IHsKICAgIHJlYWQgOiAicHJvZHVjdHMiCiAgfQp9OwpsZXQgdHJ4ID0gZGIuX2NyZWF0ZVRyYW5zYWN0aW9uKGJvZHkpOwpsZXQgdXJsID0gIi9fYXBpL3RyYW5zYWN0aW9uLyIgKyB0cnguaWQoKTsKCmxldCByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7Cgp0cnguYWJvcnQoKTsKZGIuX2Ryb3AoInByb2R1Y3RzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3RyYW5zYWN0aW9uLzcyNDY1JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwicmVzdWx0XCIgOiB7IFxuICAgIFwiaWRcIiA6IFwiNzI0NjVcIiwgXG4gICAgXCJzdGF0dXNcIiA6IFwicnVubmluZ1wiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkdldCB0cmFuc2FjdGlvbiBzdGF0dXMiLCJuYW1lIjoiUmVzdFRyYW5zYWN0aW9uR2V0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTransactionMulti_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGluZyBhIHRyYW5zYWN0aW9uIHVzaW5nIG11bHRpcGxlIGNvbGxlY3Rpb25zCm5hbWU6IFJlc3RUcmFuc2FjdGlvbk11bHRpCi0tLQp2YXIgY24xID0gIm1hdGVyaWFscyI7CmRiLl9kcm9wKGNuMSk7CnZhciBtYXRlcmlhbHMgPSBkYi5fY3JlYXRlKGNuMSk7CnZhciBjbjIgPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbjIpOwp2YXIgcHJvZHVjdHMgPSBkYi5fY3JlYXRlKGNuMik7CnByb2R1Y3RzLnNhdmUoeyAiYSI6IDF9KTsKbWF0ZXJpYWxzLnNhdmUoeyAiYiI6IDF9KTsKdmFyIHVybCA9ICIvX2FwaS90cmFuc2FjdGlvbiI7CnZhciBib2R5ID0gewogIGNvbGxlY3Rpb25zOiB7CiAgICB3cml0ZSA6IFsgInByb2R1Y3RzIiwgIm1hdGVyaWFscyIgXQogIH0sCiAgYWN0aW9uOiAoCiAgICAiZnVuY3Rpb24gKCkgeyIgKwogICAgInZhciBkYiA9IHJlcXVpcmUoJ0BhcmFuZ29kYicpLmRiOyIgKwogICAgImRiLnByb2R1Y3RzLnNhdmUoe30pOyIgKwogICAgImRiLm1hdGVyaWFscy5zYXZlKHt9KTsiICsKICAgICJyZXR1cm4gJ3dvcmtlZCEnOyIgKwogICAgIn0iCiAgKQp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CmRiLl9kcm9wKGNuMSk7CmRiLl9kcm9wKGNuMik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJ3cml0ZVwiOiBbXG4gICAgICBcInByb2R1Y3RzXCIsXG4gICAgICBcIm1hdGVyaWFsc1wiXG4gICAgXVxuICB9LFxuICBcImFjdGlvblwiOiBcImZ1bmN0aW9uICgpIHt2YXIgZGIgPSByZXF1aXJlKCdAYXJhbmdvZGInKS5kYjtkYi5wcm9kdWN0cy5zYXZlKHt9KTtkYi5tYXRlcmlhbHMuc2F2ZSh7fSk7cmV0dXJuICd3b3JrZWQhJzt9XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiBcIndvcmtlZCFcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeGVjdXRpbmcgYSB0cmFuc2FjdGlvbiB1c2luZyBtdWx0aXBsZSBjb2xsZWN0aW9ucyIsIm5hbWUiOiJSZXN0VHJhbnNhY3Rpb25NdWx0aSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestTransactionNonExisting_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJlZmVycmluZyB0byBhIG5vbi1leGlzdGluZyBjb2xsZWN0aW9uCm5hbWU6IFJlc3RUcmFuc2FjdGlvbk5vbkV4aXN0aW5nCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CnZhciB1cmwgPSAiL19hcGkvdHJhbnNhY3Rpb24iOwp2YXIgYm9keSA9IHsKICBjb2xsZWN0aW9uczogewogICAgcmVhZCA6ICJwcm9kdWN0cyIKICB9LAogIGFjdGlvbiA6ICJmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9Igp9OwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDA0KTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJyZWFkXCI6IFwicHJvZHVjdHNcIlxuICB9LFxuICBcImFjdGlvblwiOiBcImZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH1cIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogOTdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwiY29sbGVjdGlvbiBvciB2aWV3IG5vdCBmb3VuZDogcHJvZHVjdHNcIiwgXG4gIFwiZXJyb3JOdW1cIiA6IDEyMDMgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmVmZXJyaW5nIHRvIGEgbm9uLWV4aXN0aW5nIGNvbGxlY3Rpb24iLCJuYW1lIjoiUmVzdFRyYW5zYWN0aW9uTm9uRXhpc3RpbmciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestTransactionSingle_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEV4ZWN1dGluZyBhIHRyYW5zYWN0aW9uIG9uIGEgc2luZ2xlIGNvbGxlY3Rpb24KbmFtZTogUmVzdFRyYW5zYWN0aW9uU2luZ2xlCi0tLQp2YXIgY24gPSAicHJvZHVjdHMiOwpkYi5fZHJvcChjbik7CnZhciBwcm9kdWN0cyA9IGRiLl9jcmVhdGUoY24pOwp2YXIgdXJsID0gIi9fYXBpL3RyYW5zYWN0aW9uIjsKdmFyIGJvZHkgPSB7CiAgY29sbGVjdGlvbnM6IHsKICAgIHdyaXRlIDogInByb2R1Y3RzIgogIH0sCiAgYWN0aW9uOiAiZnVuY3Rpb24gKCkgeyB2YXIgZGIgPSByZXF1aXJlKCdAYXJhbmdvZGInKS5kYjsgZGIucHJvZHVjdHMuc2F2ZSh7fSk7ICByZXR1cm4gZGIucHJvZHVjdHMuY291bnQoKTsgfSIKfTsKCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwpkYi5fZHJvcChjbik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJ3cml0ZVwiOiBcInByb2R1Y3RzXCJcbiAgfSxcbiAgXCJhY3Rpb25cIjogXCJmdW5jdGlvbiAoKSB7IHZhciBkYiA9IHJlcXVpcmUoJ0BhcmFuZ29kYicpLmRiOyBkYi5wcm9kdWN0cy5zYXZlKHt9KTsgIHJldHVybiBkYi5wcm9kdWN0cy5jb3VudCgpOyB9XCJcbn1cbkVPRiIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMzdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4ZWN1dGluZyBhIHRyYW5zYWN0aW9uIG9uIGEgc2luZ2xlIGNvbGxlY3Rpb24iLCJuYW1lIjoiUmVzdFRyYW5zYWN0aW9uU2luZ2xlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestTransactionsGet_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEdldCBjdXJyZW50bHkgcnVubmluZyB0cmFuc2FjdGlvbnMKbmFtZTogUmVzdFRyYW5zYWN0aW9uc0dldAotLS0KZGIuX2Ryb3AoInByb2R1Y3RzIik7CmRiLl9jcmVhdGUoInByb2R1Y3RzIik7CmxldCBib2R5ID0gewogIGNvbGxlY3Rpb25zOiB7CiAgICByZWFkIDogInByb2R1Y3RzIgogIH0KfTsKbGV0IHRyeCA9IGRiLl9jcmVhdGVUcmFuc2FjdGlvbihib2R5KTsKbGV0IHVybCA9ICIvX2FwaS90cmFuc2FjdGlvbiI7CgpsZXQgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKdHJ4LmFib3J0KCk7CmRiLl9kcm9wKCJwcm9kdWN0cyIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3RyYW5zYWN0aW9uJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNTFcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJ0cmFuc2FjdGlvbnNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiaWRcIiA6IFwiNzI0ODZcIiwgXG4gICAgICBcInN0YXRlXCIgOiBcInJ1bm5pbmdcIiBcbiAgICB9IFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkdldCBjdXJyZW50bHkgcnVubmluZyB0cmFuc2FjdGlvbnMiLCJuYW1lIjoiUmVzdFRyYW5zYWN0aW9uc0dldCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestUpdateUser_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0VXBkYXRlVXNlcgotLS0KdmFyIHVzZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIik7CnZhciB0aGVVc2VyID0gImFkbWluQG15YXBwIjsKdXNlcnMuc2F2ZSh0aGVVc2VyLCAic2VjcmV0IikKCnZhciB1cmwgPSAiL19hcGkvdXNlci8iICsgdGhlVXNlcjsKdmFyIGRhdGEgPSB7IHBhc3N3ZDogInNlY3VyZSIgfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BBVENIJywgdXJsLCBkYXRhKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKdXNlcnMucmVtb3ZlKHRoZVVzZXIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvdXNlci9hZG1pbkBteWFwcCcgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJwYXNzd2RcIjogXCJzZWN1cmVcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInVzZXJcIiA6IFwiYWRtaW5AbXlhcHBcIiwgXG4gIFwiYWN0aXZlXCIgOiB0cnVlLCBcbiAgXCJleHRyYVwiIDogeyBcbiAgfSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJlcnJvclwiIDogZmFsc2UgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RVcGRhdGVVc2VyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestVersionDetails_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB3aXRoIGRldGFpbHMKbmFtZTogUmVzdFZlcnNpb25EZXRhaWxzCi0tLQp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgJy9fYXBpL3ZlcnNpb24/ZGV0YWlscz10cnVlJyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZlcnNpb24/ZGV0YWlscz10cnVlJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTU5NFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInNlcnZlclwiIDogXCJhcmFuZ29cIiwgXG4gIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgXCJkZXRhaWxzXCIgOiB7IFxuICAgIFwiYXJjaGl0ZWN0dXJlXCIgOiBcIjY0Yml0XCIsIFxuICAgIFwiYXJtXCIgOiBcImZhbHNlXCIsIFxuICAgIFwiYXNhblwiIDogXCJmYWxzZVwiLCBcbiAgICBcImFzc2VydGlvbnNcIiA6IFwiZmFsc2VcIiwgXG4gICAgXCJhdnhcIiA6IFwidHJ1ZVwiLCBcbiAgICBcImF2eDJcIiA6IFwiZmFsc2VcIiwgXG4gICAgXCJib29zdC12ZXJzaW9uXCIgOiBcIjEuNzguMFwiLCBcbiAgICBcImJ1aWxkLWRhdGVcIiA6IFwiMjAyNS0wNS0yMyAxNzo0MToyMFwiLCBcbiAgICBcImJ1aWxkLXJlcG9zaXRvcnlcIiA6IFwicmVmcy8zLjExLjE0IDQ2ZTJiMzA4N1wiLCBcbiAgICBcImNvbXBpbGVyXCIgOiBcImNsYW5nIFtVYnVudHUgQ2xhbmcgMTYuMC42ICgyM3VidW50dTQpXVwiLCBcbiAgICBcImNvdmVyYWdlXCIgOiBcImZhbHNlXCIsIFxuICAgIFwiY3BsdXNwbHVzXCIgOiBcIjIwMjAwMlwiLCBcbiAgICBcImN1cmwtdmVyc2lvblwiIDogXCJub25lXCIsIFxuICAgIFwiZGVidWdcIiA6IFwiZmFsc2VcIiwgXG4gICAgXCJlbmRpYW5uZXNzXCIgOiBcImxpdHRsZVwiLCBcbiAgICBcImVudGVycHJpc2UtYnVpbGQtcmVwb3NpdG9yeVwiIDogXCJyZWZzLzMuMTEuMTQgNjMzYTYzMVwiLCBcbiAgICBcImVudGVycHJpc2UtdmVyc2lvblwiIDogXCJlbnRlcnByaXNlXCIsIFxuICAgIFwiZmFpbHVyZS10ZXN0c1wiIDogXCJmYWxzZVwiLCBcbiAgICBcImZkLWNsaWVudC1ldmVudC1oYW5kbGVyXCIgOiBcInBvbGxcIiwgXG4gICAgXCJmZC1zZXRzaXplXCIgOiBcIjEwMjRcIiwgXG4gICAgXCJmdWxsLXZlcnNpb24tc3RyaW5nXCIgOiBcIkFyYW5nb0RCIDMuMTEuMTQgZW50ZXJwcmlzZSBbbGludXhdIDY0Yml0LCB1c2luZyBqZW1hbGxvYywgYnVpbGQgcmVmcy8zLjExLjE0IDQ2ZTJiMzA4NywgVlBhY2sgMC4yLjEsIFJvY2tzREIgNy4yLjAsIElDVSA2NC4yLCBWOCA3LjkuMzE3LCBPcGVuU1NMIDMuNS4wIDggQXByIDIwMjVcIiwgXG4gICAgXCJpY3UtdmVyc2lvblwiIDogXCI2NC4yXCIsIFxuICAgIFwiaXBvXCIgOiBcImZhbHNlXCIsIFxuICAgIFwiaXJlc2VhcmNoLXZlcnNpb25cIiA6IFwiMS4zLjAuMFwiLCBcbiAgICBcImplbWFsbG9jXCIgOiBcInRydWVcIiwgXG4gICAgXCJsaWJ1bndpbmRcIiA6IFwidHJ1ZVwiLCBcbiAgICBcImxpY2Vuc2VcIiA6IFwiZW50ZXJwcmlzZVwiLCBcbiAgICBcIm1haW50YWluZXItbW9kZVwiIDogXCJmYWxzZVwiLCBcbiAgICBcIm1lbW9yeS1wcm9maWxlclwiIDogXCJ0cnVlXCIsIFxuICAgIFwibmRlYnVnXCIgOiBcInRydWVcIiwgXG4gICAgXCJvcGVuc3NsLXZlcnNpb24tY29tcGlsZS10aW1lXCIgOiBcIk9wZW5TU0wgMy41LjAgOCBBcHIgMjAyNVwiLCBcbiAgICBcIm9wZW5zc2wtdmVyc2lvbi1ydW4tdGltZVwiIDogXCJPcGVuU1NMIDMuNS4wIDggQXByIDIwMjVcIiwgXG4gICAgXCJvcHRpbWl6YXRpb24tZmxhZ3NcIiA6IFwiLW1meHNyIC1tbW14IC1tc3NlIC1tc3NlMiAtbWN4MTYgLW1zYWhmIC1tcG9wY250IC1tc3NlMyAtbXNzZTQuMSAtbXNzZTQuMiAtbXNzc2UzIC1tcGNsbXVsIC1tYXZ4IC1teHNhdmVcIiwgXG4gICAgXCJwaWNcIiA6IFwiMlwiLCBcbiAgICBcInBpZVwiIDogXCIyXCIsIFxuICAgIFwicGxhdGZvcm1cIiA6IFwibGludXhcIiwgXG4gICAgXCJyZWFjdG9yLXR5cGVcIiA6IFwiZXBvbGxcIiwgXG4gICAgXCJyZXBsaWNhdGlvbjItZW5hYmxlZFwiIDogXCJmYWxzZVwiLCBcbiAgICBcInJvY2tzZGItdmVyc2lvblwiIDogXCI3LjIuMFwiLCBcbiAgICBcInNlcnZlci12ZXJzaW9uXCIgOiBcIjMuMTEuMTRcIiwgXG4gICAgXCJzaXplb2YgaW50XCIgOiBcIjRcIiwgXG4gICAgXCJzaXplb2YgbG9uZ1wiIDogXCI4XCIsIFxuICAgIFwic2l6ZW9mIHZvaWQqXCIgOiBcIjhcIiwgXG4gICAgXCJzc2U0MlwiIDogXCJ0cnVlXCIsIFxuICAgIFwidHNhblwiIDogXCJmYWxzZVwiLCBcbiAgICBcInVuYWxpZ25lZC1hY2Nlc3NcIiA6IFwidHJ1ZVwiLCBcbiAgICBcInY4LXZlcnNpb25cIiA6IFwiNy45LjMxN1wiLCBcbiAgICBcInZwYWNrLXZlcnNpb25cIiA6IFwiMC4yLjFcIiwgXG4gICAgXCJ6bGliLXZlcnNpb25cIiA6IFwiMS4yLjEzXCIsIFxuICAgIFwibW9kZVwiIDogXCJzZXJ2ZXJcIiwgXG4gICAgXCJyb2xlXCIgOiBcIlNJTkdMRVwiLCBcbiAgICBcImhvc3RcIiA6IFwibG9jYWxob3N0XCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0dXJuIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdpdGggZGV0YWlscyIsIm5hbWUiOiJSZXN0VmVyc2lvbkRldGFpbHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestVersion_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbgpuYW1lOiBSZXN0VmVyc2lvbgotLS0KdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsICcvX2FwaS92ZXJzaW9uJyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZlcnNpb24nIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInNlcnZlclwiIDogXCJhcmFuZ29cIiwgXG4gIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHVybiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiIsIm5hbWUiOiJSZXN0VmVyc2lvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewDeleteViewIdentifierArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3RWaWV3RGVsZXRlVmlld0lkZW50aWZpZXJBcmFuZ29TZWFyY2gKLS0tCnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoInByb2R1Y3RzVmlldyIsICJhcmFuZ29zZWFyY2giKTsKCnZhciB1cmwgPSAiL19hcGkvdmlldy8iKyB2aWV3Ll9pZDsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92aWV3LzcyNjg0JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVzaW5nIGFuIGlkZW50aWZpZXI6IiwibmFtZSI6IlJlc3RWaWV3RGVsZXRlVmlld0lkZW50aWZpZXJBcmFuZ29TZWFyY2giLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestViewDeleteViewNameArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbmFtZToKbmFtZTogUmVzdFZpZXdEZWxldGVWaWV3TmFtZUFyYW5nb1NlYXJjaAotLS0KdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgImFyYW5nb3NlYXJjaCIpOwoKdmFyIHVybCA9ICIvX2FwaS92aWV3L3Byb2R1Y3RzVmlldyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92aWV3L3Byb2R1Y3RzVmlldyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInJlc3VsdFwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBhIG5hbWU6IiwibmFtZSI6IlJlc3RWaWV3RGVsZXRlVmlld05hbWVBcmFuZ29TZWFyY2giLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestViewGetAllViews_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbGwgVmlld3M6Cm5hbWU6IFJlc3RWaWV3R2V0QWxsVmlld3MKLS0tCnZhciB2aWV3U2VhcmNoQWxpYXMgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgInNlYXJjaC1hbGlhcyIpOwp2YXIgdmlld0FyYW5nb1NlYXJjaCA9IGRiLl9jcmVhdGVWaWV3KCJyZXZpZXdzVmlldyIsICJhcmFuZ29zZWFyY2giKTsKCnZhciB1cmwgPSAiL19hcGkvdmlldyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygicHJvZHVjdHNWaWV3Iik7CmRiLl9kcm9wVmlldygicmV2aWV3c1ZpZXciKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAzMjhcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwicmVzdWx0XCIgOiBbIFxuICAgIHsgXG4gICAgICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS8xMzJcIiwgXG4gICAgICBcImlkXCIgOiBcIjEzMlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJkZW1vVmlld1wiLCBcbiAgICAgIFwidHlwZVwiIDogXCJhcmFuZ29zZWFyY2hcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzI2NDZcIiwgXG4gICAgICBcImlkXCIgOiBcIjcyNjQ2XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcInByb2R1Y3RzVmlld1wiLCBcbiAgICAgIFwidHlwZVwiIDogXCJzZWFyY2gtYWxpYXNcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzI2NDdcIiwgXG4gICAgICBcImlkXCIgOiBcIjcyNjQ3XCIsIFxuICAgICAgXCJuYW1lXCIgOiBcInJldmlld3NWaWV3XCIsIFxuICAgICAgXCJ0eXBlXCIgOiBcImFyYW5nb3NlYXJjaFwiIFxuICAgIH0gXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGFsbCBWaWV3czoiLCJuYW1lIjoiUmVzdFZpZXdHZXRBbGxWaWV3cyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewGetViewIdentifierArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3RWaWV3R2V0Vmlld0lkZW50aWZpZXJBcmFuZ29TZWFyY2gKLS0tCnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoInByb2R1Y3RzVmlldyIsICJhcmFuZ29zZWFyY2giKTsKCnZhciB1cmwgPSAiL19hcGkvdmlldy8iKyB2aWV3Ll9pZDsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZGIuX2Ryb3BWaWV3KCJwcm9kdWN0c1ZpZXciKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvNzI2MTgnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMjRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwidHlwZVwiIDogXCJhcmFuZ29zZWFyY2hcIiwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1ZpZXdcIiwgXG4gIFwiaWRcIiA6IFwiNzI2MThcIiwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzcyNjE4XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYW4gaWRlbnRpZmllcjoiLCJuYW1lIjoiUmVzdFZpZXdHZXRWaWV3SWRlbnRpZmllckFyYW5nb1NlYXJjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewGetViewNameArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbmFtZToKbmFtZTogUmVzdFZpZXdHZXRWaWV3TmFtZUFyYW5nb1NlYXJjaAotLS0KdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgImFyYW5nb3NlYXJjaCIpOwoKdmFyIHVybCA9ICIvX2FwaS92aWV3L3Byb2R1Y3RzVmlldyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygicHJvZHVjdHNWaWV3Iik7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvcHJvZHVjdHNWaWV3JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTI0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwiZXJyb3JcIiA6IGZhbHNlLCBcbiAgXCJjb2RlXCIgOiAyMDAsIFxuICBcInR5cGVcIiA6IFwiYXJhbmdvc2VhcmNoXCIsIFxuICBcIm5hbWVcIiA6IFwicHJvZHVjdHNWaWV3XCIsIFxuICBcImlkXCIgOiBcIjcyNjIyXCIsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjYyMlwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVzaW5nIGEgbmFtZToiLCJuYW1lIjoiUmVzdFZpZXdHZXRWaWV3TmFtZUFyYW5nb1NlYXJjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewGetViewPropertiesIdentifierArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3RWaWV3R2V0Vmlld1Byb3BlcnRpZXNJZGVudGlmaWVyQXJhbmdvU2VhcmNoCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImJvb2tzIik7CnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoInByb2R1Y3RzVmlldyIsICJhcmFuZ29zZWFyY2giLCB7IGxpbmtzOiB7IGJvb2tzOiB7IGZpZWxkczogeyB0aXRsZTogeyBhbmFseXplcnM6IFsidGV4dF9lbiJdIH0gfSB9IH0gfSk7Cgp2YXIgdXJsID0gIi9fYXBpL3ZpZXcvIisgdmlldy5faWQgKyAiL3Byb3BlcnRpZXMiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZHJvcFZpZXcoInByb2R1Y3RzVmlldyIpOwpkYi5fZHJvcCgiYm9va3MiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvNzI1MDUvcHJvcGVydGllcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDY1MlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ3cml0ZWJ1ZmZlclNpemVNYXhcIiA6IDMzNTU0NDMyLCBcbiAgXCJpZFwiIDogXCI3MjUwNVwiLCBcbiAgXCJzdG9yZWRWYWx1ZXNcIiA6IFsgXSwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1ZpZXdcIiwgXG4gIFwidHlwZVwiIDogXCJhcmFuZ29zZWFyY2hcIiwgXG4gIFwiY29uc29saWRhdGlvblBvbGljeVwiIDogeyBcbiAgICBcInR5cGVcIiA6IFwidGllclwiLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNGbG9vclwiIDogMjA5NzE1MiwgXG4gICAgXCJzZWdtZW50c0J5dGVzTWF4XCIgOiA1MzY4NzA5MTIwLCBcbiAgICBcInNlZ21lbnRzTWF4XCIgOiAxMCwgXG4gICAgXCJzZWdtZW50c01pblwiIDogMSwgXG4gICAgXCJtaW5TY29yZVwiIDogMCBcbiAgfSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcImxpbmtzXCIgOiB7IFxuICAgIFwiYm9va3NcIiA6IHsgXG4gICAgICBcImFuYWx5emVyc1wiIDogWyBcbiAgICAgICAgXCJpZGVudGl0eVwiIFxuICAgICAgXSwgXG4gICAgICBcImZpZWxkc1wiIDogeyBcbiAgICAgICAgXCJ0aXRsZVwiIDogeyBcbiAgICAgICAgICBcImFuYWx5emVyc1wiIDogWyBcbiAgICAgICAgICAgIFwidGV4dF9lblwiIFxuICAgICAgICAgIF0gXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIFwiaW5jbHVkZUFsbEZpZWxkc1wiIDogZmFsc2UsIFxuICAgICAgXCJzdG9yZVZhbHVlc1wiIDogXCJub25lXCIsIFxuICAgICAgXCJ0cmFja0xpc3RQb3NpdGlvbnNcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0sIFxuICBcImNvbW1pdEludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY29uc29saWRhdGlvbkludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzcyNTA1XCIsIFxuICBcImNsZWFudXBJbnRlcnZhbFN0ZXBcIiA6IDIsIFxuICBcInByaW1hcnlTb3J0XCIgOiBbIF0sIFxuICBcInByaW1hcnlTb3J0Q29tcHJlc3Npb25cIiA6IFwibHo0XCIsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYW4gaWRlbnRpZmllcjoiLCJuYW1lIjoiUmVzdFZpZXdHZXRWaWV3UHJvcGVydGllc0lkZW50aWZpZXJBcmFuZ29TZWFyY2giLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestViewGetViewPropertiesIdentifierSearchAlias_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGFuIGlkZW50aWZpZXI6Cm5hbWU6IFJlc3RWaWV3R2V0Vmlld1Byb3BlcnRpZXNJZGVudGlmaWVyU2VhcmNoQWxpYXMKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgiYm9va3MiKTsKdmFyIGlkeCA9IGNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiAiaW52ZXJ0ZWQiLCBuYW1lOiAiaW52LWlkeCIsIGZpZWxkczogWyB7IG5hbWU6ICJ0aXRsZSIsIGFuYWx5emVyOiAidGV4dF9lbiIgfSBdIH0pOwp2YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KCJwcm9kdWN0c1ZpZXciLCAic2VhcmNoLWFsaWFzIiwgeyBpbmRleGVzOiBbIHsgY29sbGVjdGlvbjogImJvb2tzIiwgaW5kZXg6ICJpbnYtaWR4IiB9IF0gfSk7Cgp2YXIgdXJsID0gIi9fYXBpL3ZpZXcvIisgdmlldy5faWQgKyAiL3Byb3BlcnRpZXMiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZHJvcFZpZXcoInByb2R1Y3RzVmlldyIpOwpkYi5fZHJvcCgiYm9va3MiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvNzI2MzQvcHJvcGVydGllcyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE3N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ0eXBlXCIgOiBcInNlYXJjaC1hbGlhc1wiLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzVmlld1wiLCBcbiAgXCJpbmRleGVzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcImNvbGxlY3Rpb25cIiA6IFwiYm9va3NcIiwgXG4gICAgICBcImluZGV4XCIgOiBcImludi1pZHhcIiBcbiAgICB9IFxuICBdLCBcbiAgXCJpZFwiIDogXCI3MjYzNFwiLCBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzI2MzRcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJVc2luZyBhbiBpZGVudGlmaWVyOiIsIm5hbWUiOiJSZXN0Vmlld0dldFZpZXdQcm9wZXJ0aWVzSWRlbnRpZmllclNlYXJjaEFsaWFzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestViewGetViewPropertiesNameArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbmFtZToKbmFtZTogUmVzdFZpZXdHZXRWaWV3UHJvcGVydGllc05hbWVBcmFuZ29TZWFyY2gKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgiYm9va3MiKTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgImFyYW5nb3NlYXJjaCIsIHsgbGlua3M6IHsgYm9va3M6IHsgZmllbGRzOiB7IHRpdGxlOiB7IGFuYWx5emVyczogWyJ0ZXh0X2VuIl0gfSB9IH0gfSB9KTsKCnZhciB1cmwgPSAiL19hcGkvdmlldy9wcm9kdWN0c1ZpZXcvcHJvcGVydGllcyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygicHJvZHVjdHNWaWV3Iik7CmRiLl9kcm9wKCJib29rcyIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvcHJvZHVjdHNWaWV3L3Byb3BlcnRpZXMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA2NTJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwid3JpdGVidWZmZXJTaXplTWF4XCIgOiAzMzU1NDQzMiwgXG4gIFwiaWRcIiA6IFwiNzI1MjFcIiwgXG4gIFwic3RvcmVkVmFsdWVzXCIgOiBbIF0sIFxuICBcIm5hbWVcIiA6IFwicHJvZHVjdHNWaWV3XCIsIFxuICBcInR5cGVcIiA6IFwiYXJhbmdvc2VhcmNoXCIsIFxuICBcImNvbnNvbGlkYXRpb25Qb2xpY3lcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcInRpZXJcIiwgXG4gICAgXCJzZWdtZW50c0J5dGVzRmxvb3JcIiA6IDIwOTcxNTIsIFxuICAgIFwic2VnbWVudHNCeXRlc01heFwiIDogNTM2ODcwOTEyMCwgXG4gICAgXCJzZWdtZW50c01heFwiIDogMTAsIFxuICAgIFwic2VnbWVudHNNaW5cIiA6IDEsIFxuICAgIFwibWluU2NvcmVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlYnVmZmVyQWN0aXZlXCIgOiAwLCBcbiAgXCJsaW5rc1wiIDogeyBcbiAgICBcImJvb2tzXCIgOiB7IFxuICAgICAgXCJhbmFseXplcnNcIiA6IFsgXG4gICAgICAgIFwiaWRlbnRpdHlcIiBcbiAgICAgIF0sIFxuICAgICAgXCJmaWVsZHNcIiA6IHsgXG4gICAgICAgIFwidGl0bGVcIiA6IHsgXG4gICAgICAgICAgXCJhbmFseXplcnNcIiA6IFsgXG4gICAgICAgICAgICBcInRleHRfZW5cIiBcbiAgICAgICAgICBdIFxuICAgICAgICB9IFxuICAgICAgfSwgXG4gICAgICBcImluY2x1ZGVBbGxGaWVsZHNcIiA6IGZhbHNlLCBcbiAgICAgIFwic3RvcmVWYWx1ZXNcIiA6IFwibm9uZVwiLCBcbiAgICAgIFwidHJhY2tMaXN0UG9zaXRpb25zXCIgOiBmYWxzZSBcbiAgICB9IFxuICB9LCBcbiAgXCJjb21taXRJbnRlcnZhbE1zZWNcIiA6IDEwMDAsIFxuICBcImNvbnNvbGlkYXRpb25JbnRlcnZhbE1zZWNcIiA6IDEwMDAsIFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjUyMVwiLCBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAyLCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJ3cml0ZWJ1ZmZlcklkbGVcIiA6IDY0IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlVzaW5nIGEgbmFtZToiLCJuYW1lIjoiUmVzdFZpZXdHZXRWaWV3UHJvcGVydGllc05hbWVBcmFuZ29TZWFyY2giLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestViewGetViewPropertiesNameSearchAlias_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFVzaW5nIGEgbmFtZToKbmFtZTogUmVzdFZpZXdHZXRWaWV3UHJvcGVydGllc05hbWVTZWFyY2hBbGlhcwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJib29rcyIpOwp2YXIgaWR4ID0gY29sbC5lbnN1cmVJbmRleCh7IHR5cGU6ICJpbnZlcnRlZCIsIG5hbWU6ICJpbnYtaWR4IiwgZmllbGRzOiBbIHsgbmFtZTogInRpdGxlIiwgYW5hbHl6ZXI6ICJ0ZXh0X2VuIiB9IF0gfSk7CnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoInByb2R1Y3RzVmlldyIsICJzZWFyY2gtYWxpYXMiLCB7IGluZGV4ZXM6IFsgeyBjb2xsZWN0aW9uOiAiYm9va3MiLCBpbmRleDogImludi1pZHgiIH0gXSB9KTsKCnZhciB1cmwgPSAiL19hcGkvdmlldy9wcm9kdWN0c1ZpZXcvcHJvcGVydGllcyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygicHJvZHVjdHNWaWV3Iik7CmRiLl9kcm9wKCJib29rcyIpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvcHJvZHVjdHNWaWV3L3Byb3BlcnRpZXMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNzdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJlcnJvclwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMCwgXG4gIFwidHlwZVwiIDogXCJzZWFyY2gtYWxpYXNcIiwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1ZpZXdcIiwgXG4gIFwiaW5kZXhlc1wiIDogWyBcbiAgICB7IFxuICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImJvb2tzXCIsIFxuICAgICAgXCJpbmRleFwiIDogXCJpbnYtaWR4XCIgXG4gICAgfSBcbiAgXSwgXG4gIFwiaWRcIiA6IFwiNzI2NDRcIiwgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzcyNjQ0XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXNpbmcgYSBuYW1lOiIsIm5hbWUiOiJSZXN0Vmlld0dldFZpZXdQcm9wZXJ0aWVzTmFtZVNlYXJjaEFsaWFzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestViewPatchPropertiesArangoSearch_single": { + "request": "LS0tCm5hbWU6IFJlc3RWaWV3UGF0Y2hQcm9wZXJ0aWVzQXJhbmdvU2VhcmNoCmRlc2NyaXB0aW9uOiB8CiAgVXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGBhcmFuZ29zZWFyY2hgIFZpZXcsIG9ubHkgY2hhbmdpbmcgb25lIHNldHRpbmcKICBhbmQgcmVtb3ZpbmcgYSBsaW5rLiBBbGwgb3RoZXIgbXV0YWJsZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQKICBrZWVwIHRoZWlyIGN1cnJlbnQgdmFsdWVzLgotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJ1c2VycyIpOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInByb2R1Y3RzIik7CnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoInByb2R1Y3RzVmlldyIsICJhcmFuZ29zZWFyY2giLCB7CiAgY2xlYW51cEludGVydmFsU3RlcDogNjY2LAogIGNvbW1pdEludGVydmFsTXNlYzogNjY2LAogIGNvbnNvbGlkYXRpb25JbnRlcnZhbE1zZWM6IDY2NiwKICBsaW5rczogewogICAgdXNlcnM6IHsKICAgICAgaW5jbHVkZUFsbEZpZWxkczogdHJ1ZQogICAgfSwKICAgIHByb2R1Y3RzOiB7CiAgICAgIGZpZWxkczogewogICAgICAgIGRlc2NyaXB0aW9uOiB7CiAgICAgICAgICBhbmFseXplcnM6IFsidGV4dF9lbiJdCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9KTsKCnZhciB1cmwgPSAiL19hcGkvdmlldy8iKyB2aWV3Lm5hbWUoKSArICIvcHJvcGVydGllcyI7CnZhciBib2R5ID0gewogIGNsZWFudXBJbnRlcnZhbFN0ZXA6IDEyLAogIGxpbmtzOiB7CiAgICBwcm9kdWN0czogbnVsbAogIH0KfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BBVENIJywgdXJsLCBib2R5KTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmxpbmtzLnByb2R1Y3RzID09PSB1bmRlZmluZWQpOwphc3NlcnQocmVzcG9uc2UucGFyc2VkQm9keS5saW5rcy51c2VycyAhPT0gdW5kZWZpbmVkKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygicHJvZHVjdHNWaWV3Iik7CmRiLl9kcm9wKCJ1c2VycyIpOwpkYi5fZHJvcCgicHJvZHVjdHMiKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvdmlldy9wcm9kdWN0c1ZpZXcvcHJvcGVydGllcycgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCI6IDEyLFxuICBcImxpbmtzXCI6IHtcbiAgICBcInByb2R1Y3RzXCI6IG51bGxcbiAgfVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1OTJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzI1NzlcIiwgXG4gIFwiaWRcIiA6IFwiNzI1NzlcIiwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1ZpZXdcIiwgXG4gIFwidHlwZVwiIDogXCJhcmFuZ29zZWFyY2hcIiwgXG4gIFwiY2xlYW51cEludGVydmFsU3RlcFwiIDogMTIsIFxuICBcImNvbW1pdEludGVydmFsTXNlY1wiIDogNjY2LCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiA2NjYsIFxuICBcImNvbnNvbGlkYXRpb25Qb2xpY3lcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcInRpZXJcIiwgXG4gICAgXCJzZWdtZW50c0J5dGVzRmxvb3JcIiA6IDIwOTcxNTIsIFxuICAgIFwic2VnbWVudHNCeXRlc01heFwiIDogNTM2ODcwOTEyMCwgXG4gICAgXCJzZWdtZW50c01heFwiIDogMTAsIFxuICAgIFwic2VnbWVudHNNaW5cIiA6IDEsIFxuICAgIFwibWluU2NvcmVcIiA6IDAgXG4gIH0sIFxuICBcInByaW1hcnlTb3J0XCIgOiBbIF0sIFxuICBcInByaW1hcnlTb3J0Q29tcHJlc3Npb25cIiA6IFwibHo0XCIsIFxuICBcInN0b3JlZFZhbHVlc1wiIDogWyBdLCBcbiAgXCJ3cml0ZWJ1ZmZlckFjdGl2ZVwiIDogMCwgXG4gIFwid3JpdGVidWZmZXJJZGxlXCIgOiA2NCwgXG4gIFwid3JpdGVidWZmZXJTaXplTWF4XCIgOiAzMzU1NDQzMiwgXG4gIFwibGlua3NcIiA6IHsgXG4gICAgXCJ1c2Vyc1wiIDogeyBcbiAgICAgIFwiYW5hbHl6ZXJzXCIgOiBbIFxuICAgICAgICBcImlkZW50aXR5XCIgXG4gICAgICBdLCBcbiAgICAgIFwiZmllbGRzXCIgOiB7IFxuICAgICAgfSwgXG4gICAgICBcImluY2x1ZGVBbGxGaWVsZHNcIiA6IHRydWUsIFxuICAgICAgXCJzdG9yZVZhbHVlc1wiIDogXCJub25lXCIsIFxuICAgICAgXCJ0cmFja0xpc3RQb3NpdGlvbnNcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGBhcmFuZ29zZWFyY2hgIFZpZXcsIG9ubHkgY2hhbmdpbmcgb25lIHNldHRpbmdcbmFuZCByZW1vdmluZyBhIGxpbmsuIEFsbCBvdGhlciBtdXRhYmxlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZFxua2VlcCB0aGVpciBjdXJyZW50IHZhbHVlcy5cbiIsIm5hbWUiOiJSZXN0Vmlld1BhdGNoUHJvcGVydGllc0FyYW5nb1NlYXJjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewPatchPropertiesSearchAlias_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Vmlld1BhdGNoUHJvcGVydGllc1NlYXJjaEFsaWFzCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImJvb2tzIik7CmNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiAiaW52ZXJ0ZWQiLCBuYW1lOiAiaW52X3RpdGxlIiwgZmllbGRzOiBbInRpdGxlIl0gfSk7CmNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiAiaW52ZXJ0ZWQiLCBuYW1lOiAiaW52X2Rlc2NyIiwgZmllbGRzOiBbImRlc2NyaXB0aW9uIl0gfSk7Cgp2YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KCJwcm9kdWN0c1ZpZXciLCAic2VhcmNoLWFsaWFzIiwgewogIGluZGV4ZXM6IFsgeyBjb2xsZWN0aW9uOiBjb2xsLm5hbWUoKSwgaW5kZXg6ICJpbnZfdGl0bGUiIH0gXSB9KTsKCnZhciB1cmwgPSAiL19hcGkvdmlldy8iKyB2aWV3Lm5hbWUoKSArICIvcHJvcGVydGllcyI7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQQVRDSCcsIHVybCwgewogICJpbmRleGVzIjogWyB7IGNvbGxlY3Rpb246IGNvbGwubmFtZSgpLCBpbmRleDogImludl9kZXNjciIgfSBdIH0pOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldyh2aWV3Lm5hbWUoKSk7CmRiLl9kcm9wKGNvbGwubmFtZSgpKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUEFUQ0ggLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSBALSAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvdmlldy9wcm9kdWN0c1ZpZXcvcHJvcGVydGllcycgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJpbmRleGVzXCI6IFtcbiAgICB7XG4gICAgICBcImNvbGxlY3Rpb25cIjogXCJib29rc1wiLFxuICAgICAgXCJpbmRleFwiOiBcImludl9kZXNjclwiXG4gICAgfVxuICBdXG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE5N1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjY3NlwiLCBcbiAgXCJpZFwiIDogXCI3MjY3NlwiLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzVmlld1wiLCBcbiAgXCJ0eXBlXCIgOiBcInNlYXJjaC1hbGlhc1wiLCBcbiAgXCJpbmRleGVzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcImNvbGxlY3Rpb25cIiA6IFwiYm9va3NcIiwgXG4gICAgICBcImluZGV4XCIgOiBcImludl90aXRsZVwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImNvbGxlY3Rpb25cIiA6IFwiYm9va3NcIiwgXG4gICAgICBcImluZGV4XCIgOiBcImludl9kZXNjclwiIFxuICAgIH0gXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RWaWV3UGF0Y2hQcm9wZXJ0aWVzU2VhcmNoQWxpYXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestViewPostViewArangoSearch_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Vmlld1Bvc3RWaWV3QXJhbmdvU2VhcmNoCi0tLQp2YXIgdXJsID0gIi9fYXBpL3ZpZXciOwp2YXIgYm9keSA9IHsKICBuYW1lOiAicHJvZHVjdHMiLAogIHR5cGU6ICJhcmFuZ29zZWFyY2giCn07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMSk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZHJvcFZpZXcoInByb2R1Y3RzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92aWV3JyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJwcm9kdWN0c1wiLFxuICBcInR5cGVcIjogXCJhcmFuZ29zZWFyY2hcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDQ3MVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjQ4OFwiLCBcbiAgXCJpZFwiIDogXCI3MjQ4OFwiLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IFwiYXJhbmdvc2VhcmNoXCIsIFxuICBcImNsZWFudXBJbnRlcnZhbFN0ZXBcIiA6IDIsIFxuICBcImNvbW1pdEludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY29uc29saWRhdGlvbkludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY29uc29saWRhdGlvblBvbGljeVwiIDogeyBcbiAgICBcInR5cGVcIiA6IFwidGllclwiLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNGbG9vclwiIDogMjA5NzE1MiwgXG4gICAgXCJzZWdtZW50c0J5dGVzTWF4XCIgOiA1MzY4NzA5MTIwLCBcbiAgICBcInNlZ21lbnRzTWF4XCIgOiAxMCwgXG4gICAgXCJzZWdtZW50c01pblwiIDogMSwgXG4gICAgXCJtaW5TY29yZVwiIDogMCBcbiAgfSwgXG4gIFwicHJpbWFyeVNvcnRcIiA6IFsgXSwgXG4gIFwicHJpbWFyeVNvcnRDb21wcmVzc2lvblwiIDogXCJsejRcIiwgXG4gIFwic3RvcmVkVmFsdWVzXCIgOiBbIF0sIFxuICBcIndyaXRlYnVmZmVyQWN0aXZlXCIgOiAwLCBcbiAgXCJ3cml0ZWJ1ZmZlcklkbGVcIiA6IDY0LCBcbiAgXCJ3cml0ZWJ1ZmZlclNpemVNYXhcIiA6IDMzNTU0NDMyLCBcbiAgXCJsaW5rc1wiIDogeyBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiUmVzdFZpZXdQb3N0Vmlld0FyYW5nb1NlYXJjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewPostViewSearchAlias_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Vmlld1Bvc3RWaWV3U2VhcmNoQWxpYXMKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgiYm9va3MiKTsKdmFyIGlkeCA9IGNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiAiaW52ZXJ0ZWQiLCBuYW1lOiAiaW52LWlkeCIsIGZpZWxkczogWyB7IG5hbWU6ICJ0aXRsZSIsIGFuYWx5emVyOiAidGV4dF9lbiIgfSBdIH0pOwoKdmFyIHVybCA9ICIvX2FwaS92aWV3IjsKdmFyIGJvZHkgPSB7CiAgbmFtZTogInByb2R1Y3RzIiwKICB0eXBlOiAic2VhcmNoLWFsaWFzIiwKICBpbmRleGVzOiBbCiAgICB7IGNvbGxlY3Rpb246ICJib29rcyIsIGluZGV4OiAiaW52LWlkeCIgfQogIF0KfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAxKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygicHJvZHVjdHMiKTsKZGIuX2Ryb3AoY29sbC5uYW1lKCkpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92aWV3JyBcdTAwM2NcdTAwM2MnRU9GJ1xue1xuICBcIm5hbWVcIjogXCJwcm9kdWN0c1wiLFxuICBcInR5cGVcIjogXCJzZWFyY2gtYWxpYXNcIixcbiAgXCJpbmRleGVzXCI6IFtcbiAgICB7XG4gICAgICBcImNvbGxlY3Rpb25cIjogXCJib29rc1wiLFxuICAgICAgXCJpbmRleFwiOiBcImludi1pZHhcIlxuICAgIH1cbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAxIENyZWF0ZWRcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE0OFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjYxNlwiLCBcbiAgXCJpZFwiIDogXCI3MjYxNlwiLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzXCIsIFxuICBcInR5cGVcIiA6IFwic2VhcmNoLWFsaWFzXCIsIFxuICBcImluZGV4ZXNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwiY29sbGVjdGlvblwiIDogXCJib29rc1wiLCBcbiAgICAgIFwiaW5kZXhcIiA6IFwiaW52LWlkeFwiIFxuICAgIH0gXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RWaWV3UG9zdFZpZXdTZWFyY2hBbGlhcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewPutPropertiesArangoSearch_single": { + "request": "LS0tCm5hbWU6IFJlc3RWaWV3UHV0UHJvcGVydGllc0FyYW5nb1NlYXJjaApkZXNjcmlwdGlvbjogfAogIFJlcGxhY2UgdGhlIHByb3BlcnRpZXMgb2YgYW4gYGFyYW5nb3NlYXJjaGAgVmlldyBpbmNsdWRpbmcgYW55IGxpbmtzIHdpdGggbmV3CiAgcHJvcGVydGllcy4gQWxsIG11dGFibGUgcHJvcGVydGllcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIGFyZSByZXNldCB0byB0aGVpcgogIGRlZmF1bHQgdmFsdWVzLgotLS0KZGIuX2NyZWF0ZSgidXNlcnMiKTsKZGIuX2NyZWF0ZSgicHJvZHVjdHMiKTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgImFyYW5nb3NlYXJjaCIsIHsKICBjb21taXRJbnRlcnZhbE1zZWM6IDEzMzcsCiAgbGlua3M6IHsKICAgIHVzZXJzOiB7fSwKICAgIHByb2R1Y3RzOiB7fQogIH0KfSk7Cgp2YXIgdXJsID0gIi9fYXBpL3ZpZXcvIisgdmlldy5uYW1lKCkgKyAiL3Byb3BlcnRpZXMiOwp2YXIgYm9keSA9IHsKICBjbGVhbnVwSW50ZXJ2YWxTdGVwOiAxMiwKICBsaW5rczogewogICAgcHJvZHVjdHM6IHsKICAgICAgZmllbGRzOiB7CiAgICAgICAgZGVzY3JpcHRpb246IHsKICAgICAgICAgIGFuYWx5emVyczogWyJ0ZXh0X2VuIl0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsIGJvZHkpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKYXNzZXJ0KE9iamVjdC5rZXlzKHJlc3BvbnNlLnBhcnNlZEJvZHkubGlua3MpLmxlbmd0aCA9PT0gMSk7CmFzc2VydChyZXNwb25zZS5wYXJzZWRCb2R5LmNvbW1pdEludGVydmFsTXNlYyAhPT0gMTMzNyk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7CgpkYi5fZHJvcFZpZXcodmlldy5uYW1lKCkpOwpkYi5fZHJvcCgidXNlcnMiKTsKZGIuX2Ryb3AoInByb2R1Y3RzIik7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvcHJvZHVjdHNWaWV3L3Byb3BlcnRpZXMnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiY2xlYW51cEludGVydmFsU3RlcFwiOiAxMixcbiAgXCJsaW5rc1wiOiB7XG4gICAgXCJwcm9kdWN0c1wiOiB7XG4gICAgICBcImZpZWxkc1wiOiB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjoge1xuICAgICAgICAgIFwiYW5hbHl6ZXJzXCI6IFtcbiAgICAgICAgICAgIFwidGV4dF9lblwiXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5FT0YiLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDYzN1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjU0OFwiLCBcbiAgXCJpZFwiIDogXCI3MjU0OFwiLCBcbiAgXCJuYW1lXCIgOiBcInByb2R1Y3RzVmlld1wiLCBcbiAgXCJ0eXBlXCIgOiBcImFyYW5nb3NlYXJjaFwiLCBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAxMiwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uUG9saWN5XCIgOiB7IFxuICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgIFwic2VnbWVudHNCeXRlc0Zsb29yXCIgOiAyMDk3MTUyLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNNYXhcIiA6IDUzNjg3MDkxMjAsIFxuICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICBcInNlZ21lbnRzTWluXCIgOiAxLCBcbiAgICBcIm1pblNjb3JlXCIgOiAwIFxuICB9LCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJzdG9yZWRWYWx1ZXNcIiA6IFsgXSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQsIFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcImxpbmtzXCIgOiB7IFxuICAgIFwicHJvZHVjdHNcIiA6IHsgXG4gICAgICBcImFuYWx5emVyc1wiIDogWyBcbiAgICAgICAgXCJpZGVudGl0eVwiIFxuICAgICAgXSwgXG4gICAgICBcImZpZWxkc1wiIDogeyBcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiIDogeyBcbiAgICAgICAgICBcImFuYWx5emVyc1wiIDogWyBcbiAgICAgICAgICAgIFwidGV4dF9lblwiIFxuICAgICAgICAgIF0gXG4gICAgICAgIH0gXG4gICAgICB9LCBcbiAgICAgIFwiaW5jbHVkZUFsbEZpZWxkc1wiIDogZmFsc2UsIFxuICAgICAgXCJzdG9yZVZhbHVlc1wiIDogXCJub25lXCIsIFxuICAgICAgXCJ0cmFja0xpc3RQb3NpdGlvbnNcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmVwbGFjZSB0aGUgcHJvcGVydGllcyBvZiBhbiBgYXJhbmdvc2VhcmNoYCBWaWV3IGluY2x1ZGluZyBhbnkgbGlua3Mgd2l0aCBuZXdcbnByb3BlcnRpZXMuIEFsbCBtdXRhYmxlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBhcmUgcmVzZXQgdG8gdGhlaXJcbmRlZmF1bHQgdmFsdWVzLlxuIiwibmFtZSI6IlJlc3RWaWV3UHV0UHJvcGVydGllc0FyYW5nb1NlYXJjaCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewPutPropertiesSearchAlias_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Vmlld1B1dFByb3BlcnRpZXNTZWFyY2hBbGlhcwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJib29rcyIpOwpjb2xsLmVuc3VyZUluZGV4KHsgdHlwZTogImludmVydGVkIiwgbmFtZTogImludl90aXRsZSIsIGZpZWxkczogWyJ0aXRsZSJdIH0pOwpjb2xsLmVuc3VyZUluZGV4KHsgdHlwZTogImludmVydGVkIiwgbmFtZTogImludl9kZXNjciIsIGZpZWxkczogWyJkZXNjcmlwdGlvbiJdIH0pOwoKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgInNlYXJjaC1hbGlhcyIsIHsKICBpbmRleGVzOiBbIHsgY29sbGVjdGlvbjogY29sbC5uYW1lKCksIGluZGV4OiAiaW52X3RpdGxlIiB9IF0gfSk7Cgp2YXIgdXJsID0gIi9fYXBpL3ZpZXcvIisgdmlldy5uYW1lKCkgKyAiL3Byb3BlcnRpZXMiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCB7CiAgImluZGV4ZXMiOiBbIHsgY29sbGVjdGlvbjogY29sbC5uYW1lKCksIGluZGV4OiAiaW52X2Rlc2NyIiB9IF0gfSk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOwoKZGIuX2Ryb3BWaWV3KHZpZXcubmFtZSgpKTsKZGIuX2Ryb3AoY29sbC5uYW1lKCkpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvcHJvZHVjdHNWaWV3L3Byb3BlcnRpZXMnIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwiaW5kZXhlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb2xsZWN0aW9uXCI6IFwiYm9va3NcIixcbiAgICAgIFwiaW5kZXhcIjogXCJpbnZfZGVzY3JcIlxuICAgIH1cbiAgXVxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNTRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzI2NjNcIiwgXG4gIFwiaWRcIiA6IFwiNzI2NjNcIiwgXG4gIFwibmFtZVwiIDogXCJwcm9kdWN0c1ZpZXdcIiwgXG4gIFwidHlwZVwiIDogXCJzZWFyY2gtYWxpYXNcIiwgXG4gIFwiaW5kZXhlc1wiIDogWyBcbiAgICB7IFxuICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImJvb2tzXCIsIFxuICAgICAgXCJpbmRleFwiIDogXCJpbnZfZGVzY3JcIiBcbiAgICB9IFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJSZXN0Vmlld1B1dFByb3BlcnRpZXNTZWFyY2hBbGlhcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestViewPutRename_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBSZXN0Vmlld1B1dFJlbmFtZQotLS0KdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygicHJvZHVjdHNWaWV3IiwgImFyYW5nb3NlYXJjaCIpOwoKdmFyIHVybCA9ICIvX2FwaS92aWV3LyIgKyB2aWV3Lm5hbWUoKSArICIvcmVuYW1lIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgeyBuYW1lOiAiY2F0YWxvZ1ZpZXciIH0pOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCmRiLl9kcm9wVmlldygiY2F0YWxvZ1ZpZXciKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3ZpZXcvcHJvZHVjdHNWaWV3L3JlbmFtZScgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJuYW1lXCI6IFwiY2F0YWxvZ1ZpZXdcIlxufVxuRU9GIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA0NzRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzI2NzhcIiwgXG4gIFwiaWRcIiA6IFwiNzI2NzhcIiwgXG4gIFwibmFtZVwiIDogXCJjYXRhbG9nVmlld1wiLCBcbiAgXCJ0eXBlXCIgOiBcImFyYW5nb3NlYXJjaFwiLCBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAyLCBcbiAgXCJjb21taXRJbnRlcnZhbE1zZWNcIiA6IDEwMDAsIFxuICBcImNvbnNvbGlkYXRpb25JbnRlcnZhbE1zZWNcIiA6IDEwMDAsIFxuICBcImNvbnNvbGlkYXRpb25Qb2xpY3lcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcInRpZXJcIiwgXG4gICAgXCJzZWdtZW50c0J5dGVzRmxvb3JcIiA6IDIwOTcxNTIsIFxuICAgIFwic2VnbWVudHNCeXRlc01heFwiIDogNTM2ODcwOTEyMCwgXG4gICAgXCJzZWdtZW50c01heFwiIDogMTAsIFxuICAgIFwic2VnbWVudHNNaW5cIiA6IDEsIFxuICAgIFwibWluU2NvcmVcIiA6IDAgXG4gIH0sIFxuICBcInByaW1hcnlTb3J0XCIgOiBbIF0sIFxuICBcInByaW1hcnlTb3J0Q29tcHJlc3Npb25cIiA6IFwibHo0XCIsIFxuICBcInN0b3JlZFZhbHVlc1wiIDogWyBdLCBcbiAgXCJ3cml0ZWJ1ZmZlckFjdGl2ZVwiIDogMCwgXG4gIFwid3JpdGVidWZmZXJJZGxlXCIgOiA2NCwgXG4gIFwid3JpdGVidWZmZXJTaXplTWF4XCIgOiAzMzU1NDQzMiwgXG4gIFwibGlua3NcIiA6IHsgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlJlc3RWaWV3UHV0UmVuYW1lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestWalAccessFirstTick_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybmluZyB0aGUgZmlyc3QgYXZhaWxhYmxlIHRpY2sKbmFtZTogUmVzdFdhbEFjY2Vzc0ZpcnN0VGljawotLS0KdmFyIHVybCA9ICIvX2FwaS93YWwvbGFzdFRpY2siOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3dhbC9sYXN0VGljayciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEwN1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInRpbWVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoyMFpcIiwgXG4gIFwidGlja1wiIDogXCIxODkyOTdcIiwgXG4gIFwic2VydmVyXCIgOiB7IFxuICAgIFwidmVyc2lvblwiIDogXCIzLjExLjE0XCIsIFxuICAgIFwic2VydmVySWRcIiA6IFwiMTE0NDMzMTg1NzQ0MzQ2XCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUmV0dXJuaW5nIHRoZSBmaXJzdCBhdmFpbGFibGUgdGljayIsIm5hbWUiOiJSZXN0V2FsQWNjZXNzRmlyc3RUaWNrIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "RestWalAccessTailingBufferLimit_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE1vcmUgZXZlbnRzIHRoYW4gd291bGQgZml0IGludG8gdGhlIHJlc3BvbnNlCm5hbWU6IFJlc3RXYWxBY2Nlc3NUYWlsaW5nQnVmZmVyTGltaXQKLS0tCnZhciByZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9yZXBsaWNhdGlvbiIpOwpkYi5fZHJvcCgicHJvZHVjdHMiKTsKCnZhciBsYXN0VGljayA9IHJlLmxvZ2dlci5zdGF0ZSgpLnN0YXRlLmxhc3RMb2dUaWNrOwoKZGIuX2NyZWF0ZSgicHJvZHVjdHMiKTsKZGIucHJvZHVjdHMuc2F2ZSh7ICJfa2V5IjogInAxIiwgIm5hbWUiIDogImZsdXggY29tcGVuc2F0b3IiIH0pOwpkYi5wcm9kdWN0cy5zYXZlKHsgIl9rZXkiOiAicDIiLCAibmFtZSIgOiAiaHlicmlkIGhvdmVyY3JhZnQiLCAiaHAiIDogNTEwMCB9KTsKZGIucHJvZHVjdHMucmVtb3ZlKCJwMSIpOwpkYi5wcm9kdWN0cy51cGRhdGUoInAyIiwgeyAibmFtZSIgOiAiYnJva2VuIGhvdmVyY3JhZnQiIH0pOwpkYi5wcm9kdWN0cy5kcm9wKCk7CgpyZXF1aXJlKCJpbnRlcm5hbCIpLndhaXQoMSk7CnZhciB1cmwgPSAiL19hcGkvd2FsL3RhaWw/ZnJvbT0iICsgbGFzdFRpY2sgKyAiJmNodW5rU2l6ZT00MDAiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwoKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3dhbC90YWlsP2Zyb209MTg5MzI2XHUwMDI2Y2h1bmtTaXplPTQwMCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC1hcmFuZ28tZHVtcFxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDc0XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWFyYW5nby1yZXBsaWNhdGlvbi1jaGVja21vcmU6IHRydWVcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWZyb21wcmVzZW50OiB0cnVlXG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0aW5jbHVkZWQ6IDE4OTM0MlxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdHNjYW5uZWQ6IDE4OTM1OFxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdHRpY2s6IDE4OTM1OFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInRpY2tcIiA6IFwiMTg5MzQyXCIsIFxuICBcInR5cGVcIiA6IDIwMDEsIFxuICBcImRiXCIgOiBcIl9zeXN0ZW1cIiwgXG4gIFwiY3VpZFwiIDogXCJoNjgxMzhENjMwNURBLzcyMzk1XCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiTW9yZSBldmVudHMgdGhhbiB3b3VsZCBmaXQgaW50byB0aGUgcmVzcG9uc2UiLCJuYW1lIjoiUmVzdFdhbEFjY2Vzc1RhaWxpbmdCdWZmZXJMaW1pdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestWalAccessTailingEmpty_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE5vIGxvZyBldmVudHMgYXZhaWxhYmxlCm5hbWU6IFJlc3RXYWxBY2Nlc3NUYWlsaW5nRW1wdHkKLS0tCnZhciByZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9yZXBsaWNhdGlvbiIpOwp2YXIgbGFzdFRpY2sgPSByZS5sb2dnZXIuc3RhdGUoKS5zdGF0ZS5sYXN0TG9nVGljazsKCnZhciB1cmwgPSAiL19hcGkvd2FsL3RhaWw/ZnJvbT0iICsgbGFzdFRpY2s7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwNCk7Cgpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3dhbC90YWlsP2Zyb209MTg5Mjk3JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwNCBObyBDb250ZW50XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtYXJhbmdvLWR1bXBcbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWFyYW5nby1yZXBsaWNhdGlvbi1jaGVja21vcmU6IGZhbHNlXG54LWFyYW5nby1yZXBsaWNhdGlvbi1mcm9tcHJlc2VudDogdHJ1ZVxueC1hcmFuZ28tcmVwbGljYXRpb24tbGFzdGluY2x1ZGVkOiAwXG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0c2Nhbm5lZDogMTg5Mjk0XG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0dGljazogMTg5Mjk3XG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiTm8gbG9nIGV2ZW50cyBhdmFpbGFibGUiLCJuYW1lIjoiUmVzdFdhbEFjY2Vzc1RhaWxpbmdFbXB0eSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "RestWalAccessTailingSome_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEEgZmV3IGxvZyBldmVudHMgKihPbmUgSlNPTiBkb2N1bWVudCBwZXIgbGluZSkqCm5hbWU6IFJlc3RXYWxBY2Nlc3NUYWlsaW5nU29tZQotLS0KdmFyIHJlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3JlcGxpY2F0aW9uIik7CmRiLl9kcm9wKCJwcm9kdWN0cyIpOwoKdmFyIGxhc3RUaWNrID0gcmUubG9nZ2VyLnN0YXRlKCkuc3RhdGUubGFzdExvZ1RpY2s7CgpkYi5fY3JlYXRlKCJwcm9kdWN0cyIpOwpkYi5wcm9kdWN0cy5zYXZlKHsgIl9rZXkiOiAicDEiLCAibmFtZSIgOiAiZmx1eCBjb21wZW5zYXRvciIgfSk7CmRiLnByb2R1Y3RzLnNhdmUoeyAiX2tleSI6ICJwMiIsICJuYW1lIiA6ICJoeWJyaWQgaG92ZXJjcmFmdCIsICJocCIgOiA1MTAwIH0pOwpkYi5wcm9kdWN0cy5yZW1vdmUoInAxIik7CmRiLnByb2R1Y3RzLnVwZGF0ZSgicDIiLCB7ICJuYW1lIiA6ICJicm9rZW4gaG92ZXJjcmFmdCIgfSk7CmRiLnByb2R1Y3RzLmRyb3AoKTsKCnJlcXVpcmUoImludGVybmFsIikud2FpdCgxKTsKdmFyIHVybCA9ICIvX2FwaS93YWwvdGFpbD9mcm9tPSIgKyBsYXN0VGljazsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25MUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3dhbC90YWlsP2Zyb209MTg5Mjk3JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LWFyYW5nby1kdW1wXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNzRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWNoZWNrbW9yZTogdHJ1ZVxueC1hcmFuZ28tcmVwbGljYXRpb24tZnJvbXByZXNlbnQ6IHRydWVcbngtYXJhbmdvLXJlcGxpY2F0aW9uLWxhc3RpbmNsdWRlZDogMTg5MzEzXG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0c2Nhbm5lZDogMTg5MzI2XG54LWFyYW5nby1yZXBsaWNhdGlvbi1sYXN0dGljazogMTg5MzI2XG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwidGlja1wiIDogXCIxODkzMTNcIiwgXG4gIFwidHlwZVwiIDogMjAwMSwgXG4gIFwiZGJcIiA6IFwiX3N5c3RlbVwiLCBcbiAgXCJjdWlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzIzODVcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJBIGZldyBsb2cgZXZlbnRzICooT25lIEpTT04gZG9jdW1lbnQgcGVyIGxpbmUpKiIsIm5hbWUiOiJSZXN0V2FsQWNjZXNzVGFpbGluZ1NvbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "RestWalAccessTickRange_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFJldHVybnMgdGhlIGF2YWlsYWJsZSB0aWNrIHJhbmdlcy4KbmFtZTogUmVzdFdhbEFjY2Vzc1RpY2tSYW5nZQotLS0KdmFyIHVybCA9ICIvX2FwaS93YWwvcmFuZ2UiOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL3dhbC9yYW5nZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDEyNFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInRpbWVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoyMFpcIiwgXG4gIFwidGlja01pblwiIDogXCIxXCIsIFxuICBcInRpY2tNYXhcIiA6IFwiMTg5Mjk3XCIsIFxuICBcInNlcnZlclwiIDogeyBcbiAgICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiLCBcbiAgICBcInNlcnZlcklkXCIgOiBcIjExNDQzMzE4NTc0NDM0NlwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlJldHVybnMgdGhlIGF2YWlsYWJsZSB0aWNrIHJhbmdlcy4iLCJuYW1lIjoiUmVzdFdhbEFjY2Vzc1RpY2tSYW5nZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "USER_02_saveUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDJfc2F2ZVVzZXIKZGVzY3JpcHRpb246ICcnCi0tLQpyZXF1aXJlKCdAYXJhbmdvZGIvdXNlcnMnKS5zYXZlKCdteS11c2VyJywgJ215LXNlY3JldC1wYXNzd29yZCcpOw==", + "response": "eyJpbnB1dCI6InJlcXVpcmUoJ0BhcmFuZ29kYi91c2VycycpLnNhdmUoJ215LXVzZXInLCAnbXktc2VjcmV0LXBhc3N3b3JkJyk7Iiwib3V0cHV0IjoieyBcbiAgXCJ1c2VyXCIgOiBcIm15LXVzZXJcIiwgXG4gIFwiYWN0aXZlXCIgOiB0cnVlLCBcbiAgXCJleHRyYVwiIDogeyBcbiAgfSwgXG4gIFwiY29kZVwiIDogMjAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJVU0VSXzAyX3NhdmVVc2VyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "USER_03_reloadUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDNfcmVsb2FkVXNlcgpkZXNjcmlwdGlvbjogJycKLS0tCnJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpLnJlbG9hZCgpOw==", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikucmVsb2FkKCk7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlVTRVJfMDNfcmVsb2FkVXNlciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "USER_03_replaceUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDNfcmVwbGFjZVVzZXIKZGVzY3JpcHRpb246ICcnCi0tLQpyZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKS5yZXBsYWNlKCJteS11c2VyIiwgIm15LWNoYW5nZWQtcGFzc3dvcmQiKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikucmVwbGFjZShcIm15LXVzZXJcIiwgXCJteS1jaGFuZ2VkLXBhc3N3b3JkXCIpOyIsIm91dHB1dCI6InsgXG4gIFwidXNlclwiIDogXCJteS11c2VyXCIsIFxuICBcImFjdGl2ZVwiIDogdHJ1ZSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gIH0sIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiVVNFUl8wM19yZXBsYWNlVXNlciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "USER_04_documentUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDRfZG9jdW1lbnRVc2VyCmRlc2NyaXB0aW9uOiAnJwotLS0KcmVxdWlyZSgiQGFyYW5nb2RiL3VzZXJzIikuZG9jdW1lbnQoIm15LXVzZXIiKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikuZG9jdW1lbnQoXCJteS11c2VyXCIpOyIsIm91dHB1dCI6InsgXG4gIFwidXNlclwiIDogXCJteS11c2VyXCIsIFxuICBcImFjdGl2ZVwiIDogdHJ1ZSwgXG4gIFwiZXh0cmFcIiA6IHsgXG4gIH0sIFxuICBcImNvZGVcIiA6IDIwMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiVVNFUl8wNF9kb2N1bWVudFVzZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "USER_04_updateUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDRfdXBkYXRlVXNlcgpkZXNjcmlwdGlvbjogJycKLS0tCnJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpLnVwZGF0ZSgibXktdXNlciIsICJteS1zZWNyZXQtcGFzc3dvcmQiKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikudXBkYXRlKFwibXktdXNlclwiLCBcIm15LXNlY3JldC1wYXNzd29yZFwiKTsiLCJvdXRwdXQiOiJ7IFxuICBcInVzZXJcIiA6IFwibXktdXNlclwiLCBcbiAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICBcImV4dHJhXCIgOiB7IFxuICB9LCBcbiAgXCJjb2RlXCIgOiAyMDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IlVTRVJfMDRfdXBkYXRlVXNlciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "USER_05_isValidUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDVfaXNWYWxpZFVzZXIKZGVzY3JpcHRpb246ICcnCi0tLQpyZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKS5pc1ZhbGlkKCJteS11c2VyIiwgIm15LXNlY3JldC1wYXNzd29yZCIpOw==", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikuaXNWYWxpZChcIm15LXVzZXJcIiwgXCJteS1zZWNyZXQtcGFzc3dvcmRcIik7Iiwib3V0cHV0IjoidHJ1ZSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJVU0VSXzA1X2lzVmFsaWRVc2VyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "USER_05_permission_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDVfcGVybWlzc2lvbgpkZXNjcmlwdGlvbjogJycKLS0tCn5yZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKS5ncmFudERhdGFiYXNlKCJteS11c2VyIiwgInRlc3RkYiIpOwpyZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKS5wZXJtaXNzaW9uKCJteS11c2VyIiwgInRlc3RkYiIpOw==", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikucGVybWlzc2lvbihcIm15LXVzZXJcIiwgXCJ0ZXN0ZGJcIik7Iiwib3V0cHV0IjoicnciLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiVVNFUl8wNV9wZXJtaXNzaW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "USER_06_AllUsers_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDZfQWxsVXNlcnMKZGVzY3JpcHRpb246ICcnCi0tLQpyZXF1aXJlKCJAYXJhbmdvZGIvdXNlcnMiKS5hbGwoKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikuYWxsKCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInVzZXJcIiA6IFwidGVzdGVyXCIsIFxuICAgIFwiYWN0aXZlXCIgOiBmYWxzZSwgXG4gICAgXCJleHRyYVwiIDogeyBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcInVzZXJcIiA6IFwiYWRtaW5cIiwgXG4gICAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICAgIFwiZXh0cmFcIiA6IHsgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ1c2VyXCIgOiBcInJvb3RcIiwgXG4gICAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICAgIFwiZXh0cmFcIiA6IHsgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ1c2VyXCIgOiBcIm15LXVzZXJcIiwgXG4gICAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICAgIFwiZXh0cmFcIiA6IHsgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiVVNFUl8wNl9BbGxVc2VycyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "USER_07_removeUser_single": { + "request": "LS0tCm5hbWU6IFVTRVJfMDdfcmVtb3ZlVXNlcgpkZXNjcmlwdGlvbjogJycKLS0tCnJlcXVpcmUoIkBhcmFuZ29kYi91c2VycyIpLnJlbW92ZSgibXktdXNlciIpOwp+cmVxdWlyZSgnQGFyYW5nb2RiL3VzZXJzJykuc2F2ZSgnbXktdXNlcicsICdteS1zZWNyZXQtcGFzc3dvcmQnKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGIvdXNlcnNcIikucmVtb3ZlKFwibXktdXNlclwiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiVVNFUl8wN19yZW1vdmVVc2VyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerAqlCollapse_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQXFsQ29sbGFwc2UKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYTEgPSBhbmFseXplcnMuc2F2ZSgiY29sbGFwc2VkIiwgImFxbCIsIHsgY29sbGFwc2VQb3NpdGlvbnM6IHRydWUsIHF1ZXJ5U3RyaW5nOgogICJGT1IgZCBJTiBTUExJVChAcGFyYW0sICctJykgUkVUVVJOIGQiCn0sIFsiZnJlcXVlbmN5IiwgInBvc2l0aW9uIl0pOwp2YXIgYTIgPSBhbmFseXplcnMuc2F2ZSgidW5jb2xsYXBzZWQiLCAiYXFsIiwgeyBjb2xsYXBzZVBvc2l0aW9uczogZmFsc2UsIHF1ZXJ5U3RyaW5nOgogICJGT1IgZCBJTiBTUExJVChAcGFyYW0sICctJykgUkVUVVJOIGQiCn0sIFsiZnJlcXVlbmN5IiwgInBvc2l0aW9uIl0pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImNvbGwiKTsKdmFyIGRvYyA9IGRiLmNvbGwuc2F2ZSh7IHRleHQ6ICJBLUItQy1EIiB9KTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygidmlldyIsICJhcmFuZ29zZWFyY2giLAogIHsgbGlua3M6IHsgY29sbDogeyBhbmFseXplcnM6IFsgImNvbGxhcHNlZCIsICJ1bmNvbGxhcHNlZCIgXSwgaW5jbHVkZUFsbEZpZWxkczogdHJ1ZSB9fX0pOwp+YXNzZXJ0KGRiLl9xdWVyeShgRk9SIGQgSU4gdmlldyBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjIFJFVFVSTiBjYCkudG9BcnJheSgpWzBdID09PSAxKTsKZGIuX3F1ZXJ5KCJGT1IgZCBJTiB2aWV3IFNFQVJDSCBQSFJBU0UoZC50ZXh0LCB7VEVSTTogJ0InfSwgMSwge1RFUk06ICdEJ30sICd1bmNvbGxhcHNlZCcpIFJFVFVSTiBkIik7CmRiLl9xdWVyeSgiRk9SIGQgSU4gdmlldyBTRUFSQ0ggUEhSQVNFKGQudGV4dCwge1RFUk06ICdCJ30sIC0xLCB7VEVSTTogJ0QnfSwgJ3VuY29sbGFwc2VkJykgUkVUVVJOIGQiKTsKZGIuX3F1ZXJ5KCJGT1IgZCBJTiB2aWV3IFNFQVJDSCBQSFJBU0UoZC50ZXh0LCB7VEVSTTogJ0InfSwgMSwge1RFUk06ICdEJ30sICdjb2xsYXBzZWQnKSBSRVRVUk4gZCIpOwpkYi5fcXVlcnkoIkZPUiBkIElOIHZpZXcgU0VBUkNIIFBIUkFTRShkLnRleHQsIHtURVJNOiAnQid9LCAtMSwge1RFUk06ICdEJ30sICdjb2xsYXBzZWQnKSBSRVRVUk4gZCIpOwp+ZGIuX2Ryb3BWaWV3KHZpZXcubmFtZSgpKTsKfmFuYWx5emVycy5yZW1vdmUoYTEubmFtZSk7Cn5hbmFseXplcnMucmVtb3ZlKGEyLm5hbWUpOwp+ZGIuX2Ryb3AoY29sbC5uYW1lKCkpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhMSA9IGFuYWx5emVycy5zYXZlKFwiY29sbGFwc2VkXCIsIFwiYXFsXCIsIHsgY29sbGFwc2VQb3NpdGlvbnM6IHRydWUsIHF1ZXJ5U3RyaW5nOlxuICBcIkZPUiBkIElOIFNQTElUKEBwYXJhbSwgJy0nKSBSRVRVUk4gZFwiXG59LCBbXCJmcmVxdWVuY3lcIiwgXCJwb3NpdGlvblwiXSk7XG52YXIgYTIgPSBhbmFseXplcnMuc2F2ZShcInVuY29sbGFwc2VkXCIsIFwiYXFsXCIsIHsgY29sbGFwc2VQb3NpdGlvbnM6IGZhbHNlLCBxdWVyeVN0cmluZzpcbiAgXCJGT1IgZCBJTiBTUExJVChAcGFyYW0sICctJykgUkVUVVJOIGRcIlxufSwgW1wiZnJlcXVlbmN5XCIsIFwicG9zaXRpb25cIl0pO1xudmFyIGNvbGwgPSBkYi5fY3JlYXRlKFwiY29sbFwiKTtcbnZhciBkb2MgPSBkYi5jb2xsLnNhdmUoeyB0ZXh0OiBcIkEtQi1DLURcIiB9KTtcbnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJ2aWV3XCIsIFwiYXJhbmdvc2VhcmNoXCIsXG4gIHsgbGlua3M6IHsgY29sbDogeyBhbmFseXplcnM6IFsgXCJjb2xsYXBzZWRcIiwgXCJ1bmNvbGxhcHNlZFwiIF0sIGluY2x1ZGVBbGxGaWVsZHM6IHRydWUgfX19KTtcbmRiLl9xdWVyeShcIkZPUiBkIElOIHZpZXcgU0VBUkNIIFBIUkFTRShkLnRleHQsIHtURVJNOiAnQid9LCAxLCB7VEVSTTogJ0QnfSwgJ3VuY29sbGFwc2VkJykgUkVUVVJOIGRcIik7XG5kYi5fcXVlcnkoXCJGT1IgZCBJTiB2aWV3IFNFQVJDSCBQSFJBU0UoZC50ZXh0LCB7VEVSTTogJ0InfSwgLTEsIHtURVJNOiAnRCd9LCAndW5jb2xsYXBzZWQnKSBSRVRVUk4gZFwiKTtcbmRiLl9xdWVyeShcIkZPUiBkIElOIHZpZXcgU0VBUkNIIFBIUkFTRShkLnRleHQsIHtURVJNOiAnQid9LCAxLCB7VEVSTTogJ0QnfSwgJ2NvbGxhcHNlZCcpIFJFVFVSTiBkXCIpO1xuZGIuX3F1ZXJ5KFwiRk9SIGQgSU4gdmlldyBTRUFSQ0ggUEhSQVNFKGQudGV4dCwge1RFUk06ICdCJ30sIC0xLCB7VEVSTTogJ0QnfSwgJ2NvbGxhcHNlZCcpIFJFVFVSTiBkXCIpOyIsIm91dHB1dCI6IltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiAxLCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiODAxMzFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29sbC84MDEzMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrSUctLV9cIiwgXG4gICAgXCJ0ZXh0XCIgOiBcIkEtQi1DLURcIiBcbiAgfSBcbl1cblxuW29iamVjdCBBcmFuZ29RdWVyeUN1cnNvciwgY291bnQ6IDEsIGNhY2hlZDogZmFsc2UsIGhhc01vcmU6IGZhbHNlXVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI4MDEzMVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb2xsLzgwMTMxXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWtJRy0tX1wiLCBcbiAgICBcInRleHRcIiA6IFwiQS1CLUMtRFwiIFxuICB9IFxuXVxuXG5bb2JqZWN0IEFyYW5nb1F1ZXJ5Q3Vyc29yLCBjb3VudDogMCwgY2FjaGVkOiBmYWxzZSwgaGFzTW9yZTogZmFsc2VdXG5cbltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiAxLCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiODAxMzFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29sbC84MDEzMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrSUctLV9cIiwgXG4gICAgXCJ0ZXh0XCIgOiBcIkEtQi1DLURcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJBcWxDb2xsYXBzZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerAqlConcat_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQXFsQ29uY2F0CmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgiY29uY2F0IiwgImFxbCIsIHsgcXVlcnlTdHJpbmc6CiAgIlJFVFVSTiBMT1dFUihMRUZUKEBwYXJhbSwgNSkpID09ICdpbnRlcicgPyBDT05DQVQoQHBhcmFtLCAnaXNtJykgOiBDT05DQVQoJ2ludGVyJywgQHBhcmFtKSIKfSwgW10pOwpkYi5fcXVlcnkoIlJFVFVSTiBUT0tFTlMoJ3N0YXRlJywgJ2NvbmNhdCcpIikudG9BcnJheSgpOwpkYi5fcXVlcnkoIlJFVFVSTiBUT0tFTlMoJ2ludGVybmF0aW9uYWwnLCAnY29uY2F0JykiKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJjb25jYXRcIiwgXCJhcWxcIiwgeyBxdWVyeVN0cmluZzpcbiAgXCJSRVRVUk4gTE9XRVIoTEVGVChAcGFyYW0sIDUpKSA9PSAnaW50ZXInID8gQ09OQ0FUKEBwYXJhbSwgJ2lzbScpIDogQ09OQ0FUKCdpbnRlcicsIEBwYXJhbSlcIlxufSwgW10pO1xuZGIuX3F1ZXJ5KFwiUkVUVVJOIFRPS0VOUygnc3RhdGUnLCAnY29uY2F0JylcIikudG9BcnJheSgpO1xuZGIuX3F1ZXJ5KFwiUkVUVVJOIFRPS0VOUygnaW50ZXJuYXRpb25hbCcsICdjb25jYXQnKVwiKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImludGVyc3RhdGVcIiBcbiAgXSBcbl1cblxuWyBcbiAgWyBcbiAgICBcImludGVybmF0aW9uYWxpc21cIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJBcWxDb25jYXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerAqlFilterNull_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQXFsRmlsdGVyTnVsbApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoImZpbHRlciIsICJhcWwiLCB7IGtlZXBOdWxsOiBmYWxzZSwgcXVlcnlTdHJpbmc6CiAgIlJFVFVSTiBMT1dFUihMRUZUKEBwYXJhbSwgMikpID09ICdpcicgPyBudWxsIDogQHBhcmFtIgp9LCBbXSk7CmRiLl9xdWVyeSgiUkVUVVJOIFRPS0VOUygncmVndWxhcicsICdmaWx0ZXInKSIpLnRvQXJyYXkoKTsKZGIuX3F1ZXJ5KCJSRVRVUk4gVE9LRU5TKCdpcnJlZ3VsYXInLCAnZmlsdGVyJykiKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJmaWx0ZXJcIiwgXCJhcWxcIiwgeyBrZWVwTnVsbDogZmFsc2UsIHF1ZXJ5U3RyaW5nOlxuICBcIlJFVFVSTiBMT1dFUihMRUZUKEBwYXJhbSwgMikpID09ICdpcicgPyBudWxsIDogQHBhcmFtXCJcbn0sIFtdKTtcbmRiLl9xdWVyeShcIlJFVFVSTiBUT0tFTlMoJ3JlZ3VsYXInLCAnZmlsdGVyJylcIikudG9BcnJheSgpO1xuZGIuX3F1ZXJ5KFwiUkVUVVJOIFRPS0VOUygnaXJyZWd1bGFyJywgJ2ZpbHRlcicpXCIpLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwicmVndWxhclwiIFxuICBdIFxuXVxuXG5bIFxuICBbIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyQXFsRmlsdGVyTnVsbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerAqlFilter_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQXFsRmlsdGVyCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgiZmlsdGVyIiwgImFxbCIsIHsgcXVlcnlTdHJpbmc6CiAgIkZJTFRFUiBMT1dFUihMRUZUKEBwYXJhbSwgMikpICE9ICdpcicgUkVUVVJOIEBwYXJhbSIKfSwgW10pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImNvbGwiKTsKdmFyIGRvYzEgPSBkYi5jb2xsLnNhdmUoeyB2YWx1ZTogInJlZ3VsYXIiIH0pOwp2YXIgZG9jMiA9IGRiLmNvbGwuc2F2ZSh7IHZhbHVlOiAiaXJyZWd1bGFyIiB9KTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygidmlldyIsICJhcmFuZ29zZWFyY2giLAogIHsgbGlua3M6IHsgY29sbDogeyBmaWVsZHM6IHsgdmFsdWU6IHsgYW5hbHl6ZXJzOiBbImZpbHRlciJdIH19fX19KQp+YXNzZXJ0KGRiLl9xdWVyeShgRk9SIGQgSU4gdmlldyBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjIFJFVFVSTiBjYCkudG9BcnJheSgpWzBdID4gMCk7CmRiLl9xdWVyeSgiRk9SIGRvYyBJTiB2aWV3IFNFQVJDSCBBTkFMWVpFUihkb2MudmFsdWUgSU4gWydyZWd1bGFyJywgJ2lycmVndWxhciddLCAnZmlsdGVyJykgUkVUVVJOIGRvYyIpLnRvQXJyYXkoKTsKfmRiLl9kcm9wVmlldyh2aWV3Lm5hbWUoKSkKfmFuYWx5emVycy5yZW1vdmUoYS5uYW1lKTsKfmRiLl9kcm9wKGNvbGwubmFtZSgpKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJmaWx0ZXJcIiwgXCJhcWxcIiwgeyBxdWVyeVN0cmluZzpcbiAgXCJGSUxURVIgTE9XRVIoTEVGVChAcGFyYW0sIDIpKSAhPSAnaXInIFJFVFVSTiBAcGFyYW1cIlxufSwgW10pO1xudmFyIGNvbGwgPSBkYi5fY3JlYXRlKFwiY29sbFwiKTtcbnZhciBkb2MxID0gZGIuY29sbC5zYXZlKHsgdmFsdWU6IFwicmVndWxhclwiIH0pO1xudmFyIGRvYzIgPSBkYi5jb2xsLnNhdmUoeyB2YWx1ZTogXCJpcnJlZ3VsYXJcIiB9KTtcbnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJ2aWV3XCIsIFwiYXJhbmdvc2VhcmNoXCIsXG4gIHsgbGlua3M6IHsgY29sbDogeyBmaWVsZHM6IHsgdmFsdWU6IHsgYW5hbHl6ZXJzOiBbXCJmaWx0ZXJcIl0gfX19fX0pXG5kYi5fcXVlcnkoXCJGT1IgZG9jIElOIHZpZXcgU0VBUkNIIEFOQUxZWkVSKGRvYy52YWx1ZSBJTiBbJ3JlZ3VsYXInLCAnaXJyZWd1bGFyJ10sICdmaWx0ZXInKSBSRVRVUk4gZG9jXCIpLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI4MDA4MlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb2xsLzgwMDgyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWtGRy0tLVwiLCBcbiAgICBcInZhbHVlXCIgOiBcInJlZ3VsYXJcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJBcWxGaWx0ZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerAqlSoundex_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQXFsU291bmRleApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoInNvdW5kZXgiLCAiYXFsIiwgeyBxdWVyeVN0cmluZzogIlJFVFVSTiBTT1VOREVYKEBwYXJhbSkiIH0sIFtdKTsKZGIuX3F1ZXJ5KCJSRVRVUk4gVE9LRU5TKCdBcmFuZ29EQicsICdzb3VuZGV4JykiKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJzb3VuZGV4XCIsIFwiYXFsXCIsIHsgcXVlcnlTdHJpbmc6IFwiUkVUVVJOIFNPVU5ERVgoQHBhcmFtKVwiIH0sIFtdKTtcbmRiLl9xdWVyeShcIlJFVFVSTiBUT0tFTlMoJ0FyYW5nb0RCJywgJ3NvdW5kZXgnKVwiKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIkE2NTJcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJBcWxTb3VuZGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerByName_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQnlOYW1lCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKYW5hbHl6ZXJzLmFuYWx5emVyKCJ0ZXh0X2VuIik7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5hbmFseXplcihcInRleHRfZW5cIik7Iiwib3V0cHV0IjoiW0FyYW5nb0FuYWx5emVyIFwidGV4dF9lblwiICh0eXBlIHRleHQpXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplckJ5TmFtZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerCollation_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQ29sbGF0aW9uCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGVuID0gYW5hbHl6ZXJzLnNhdmUoImNvbGxhdGlvbl9lbiIsICJjb2xsYXRpb24iLCB7IGxvY2FsZTogImVuIiB9LCBbXSk7CnZhciBzdiA9IGFuYWx5emVycy5zYXZlKCJjb2xsYXRpb25fc3YiLCAiY29sbGF0aW9uIiwgeyBsb2NhbGU6ICJzdiIgfSwgW10pOwp2YXIgdGVzdCA9IGRiLl9jcmVhdGUoInRlc3QiKTsKdmFyIGRvY3MgPSBkYi50ZXN0LnNhdmUoWwogIHsgdGV4dDogImEiIH0sCiAgeyB0ZXh0OiAiw6UiIH0sCiAgeyB0ZXh0OiAiYiIgfSwKICB7IHRleHQ6ICJ6IiB9LApdKTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygidmlldyIsICJhcmFuZ29zZWFyY2giLAogIHsgbGlua3M6IHsgdGVzdDogeyBhbmFseXplcnM6IFsgImNvbGxhdGlvbl9lbiIsICJjb2xsYXRpb25fc3YiIF0sIGluY2x1ZGVBbGxGaWVsZHM6IHRydWUgfX19KTsKfmFzc2VydChkYi5fcXVlcnkoYEZPUiBkIElOIHZpZXcgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gYyBSRVRVUk4gY2ApLnRvQXJyYXkoKVswXSA9PT0gNCk7CmRiLl9xdWVyeSgiRk9SIGRvYyBJTiB2aWV3IFNFQVJDSCBBTkFMWVpFUihkb2MudGV4dCA8IFRPS0VOUygnYycsICdjb2xsYXRpb25fZW4nKVswXSwgJ2NvbGxhdGlvbl9lbicpIFJFVFVSTiBkb2MudGV4dCIpLnRvQXJyYXkoKTsKZGIuX3F1ZXJ5KCJGT1IgZG9jIElOIHZpZXcgU0VBUkNIIEFOQUxZWkVSKGRvYy50ZXh0IDwgVE9LRU5TKCdjJywgJ2NvbGxhdGlvbl9zdicpWzBdLCAnY29sbGF0aW9uX3N2JykgUkVUVVJOIGRvYy50ZXh0IikudG9BcnJheSgpOwp+ZGIuX2Ryb3BWaWV3KHZpZXcubmFtZSgpKTsKfmRiLl9kcm9wKHRlc3QubmFtZSgpKTsKfmFuYWx5emVycy5yZW1vdmUoZW4ubmFtZSk7Cn5hbmFseXplcnMucmVtb3ZlKHN2Lm5hbWUpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBlbiA9IGFuYWx5emVycy5zYXZlKFwiY29sbGF0aW9uX2VuXCIsIFwiY29sbGF0aW9uXCIsIHsgbG9jYWxlOiBcImVuXCIgfSwgW10pO1xudmFyIHN2ID0gYW5hbHl6ZXJzLnNhdmUoXCJjb2xsYXRpb25fc3ZcIiwgXCJjb2xsYXRpb25cIiwgeyBsb2NhbGU6IFwic3ZcIiB9LCBbXSk7XG52YXIgdGVzdCA9IGRiLl9jcmVhdGUoXCJ0ZXN0XCIpO1xudmFyIGRvY3MgPSBkYi50ZXN0LnNhdmUoW1xuICB7IHRleHQ6IFwiYVwiIH0sXG4gIHsgdGV4dDogXCLDpVwiIH0sXG4gIHsgdGV4dDogXCJiXCIgfSxcbiAgeyB0ZXh0OiBcInpcIiB9LFxuXSk7XG52YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KFwidmlld1wiLCBcImFyYW5nb3NlYXJjaFwiLFxuICB7IGxpbmtzOiB7IHRlc3Q6IHsgYW5hbHl6ZXJzOiBbIFwiY29sbGF0aW9uX2VuXCIsIFwiY29sbGF0aW9uX3N2XCIgXSwgaW5jbHVkZUFsbEZpZWxkczogdHJ1ZSB9fX0pO1xuZGIuX3F1ZXJ5KFwiRk9SIGRvYyBJTiB2aWV3IFNFQVJDSCBBTkFMWVpFUihkb2MudGV4dCBcdTAwM2MgVE9LRU5TKCdjJywgJ2NvbGxhdGlvbl9lbicpWzBdLCAnY29sbGF0aW9uX2VuJykgUkVUVVJOIGRvYy50ZXh0XCIpLnRvQXJyYXkoKTtcbmRiLl9xdWVyeShcIkZPUiBkb2MgSU4gdmlldyBTRUFSQ0ggQU5BTFlaRVIoZG9jLnRleHQgXHUwMDNjIFRPS0VOUygnYycsICdjb2xsYXRpb25fc3YnKVswXSwgJ2NvbGxhdGlvbl9zdicpIFJFVFVSTiBkb2MudGV4dFwiKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgXCJhXCIsIFxuICBcIsOlXCIsIFxuICBcImJcIiBcbl1cblxuWyBcbiAgXCJhXCIsIFxuICBcImJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJDb2xsYXRpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerCreate_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQ3JlYXRlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKYW5hbHl6ZXJzLnNhdmUoImNzdiIsICJkZWxpbWl0ZXIiLCB7ICJkZWxpbWl0ZXIiOiAiLCIgfSwgWyJmcmVxdWVuY3kiLCAibm9ybSIsICJwb3NpdGlvbiJdKTsKfmFuYWx5emVycy5yZW1vdmUoImNzdiIpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5zYXZlKFwiY3N2XCIsIFwiZGVsaW1pdGVyXCIsIHsgXCJkZWxpbWl0ZXJcIjogXCIsXCIgfSwgW1wiZnJlcXVlbmN5XCIsIFwibm9ybVwiLCBcInBvc2l0aW9uXCJdKTsiLCJvdXRwdXQiOiJ7IFxuICBcIm5hbWVcIiA6IFwiX3N5c3RlbTo6Y3N2XCIsIFxuICBcInR5cGVcIiA6IFwiZGVsaW1pdGVyXCIsIFxuICBcInByb3BlcnRpZXNcIiA6IHsgXG4gICAgXCJkZWxpbWl0ZXJcIiA6IFwiLFwiIFxuICB9LCBcbiAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICBcInBvc2l0aW9uXCIsIFxuICAgIFwibm9ybVwiIFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplckNyZWF0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerCustomTokens_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyQ3VzdG9tVG9rZW5zCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKQp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJjdXN0b20iLCAidGV4dCIsIHsKICBsb2NhbGU6ICJlbiIsCiAgc3RvcHdvcmRzOiBbImEiLCAiZXhhbXBsZSJdCn0sIFtdKTsKZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKCJVUFBFUiAmIGxvd2VyLCBhIFN0ZW1taW5nIEV4YW1wbGUuIiwgImN1c3RvbSIpYCkudG9BcnJheSgpOwp+YW5hbHl6ZXJzLnJlbW92ZShhLm5hbWUpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKVxudmFyIGEgPSBhbmFseXplcnMuc2F2ZShcImN1c3RvbVwiLCBcInRleHRcIiwge1xuICBsb2NhbGU6IFwiZW5cIixcbiAgc3RvcHdvcmRzOiBbXCJhXCIsIFwiZXhhbXBsZVwiXVxufSwgW10pO1xuZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKFwiVVBQRVIgXHUwMDI2IGxvd2VyLCBhIFN0ZW1taW5nIEV4YW1wbGUuXCIsIFwiY3VzdG9tXCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJ1cHBlclwiLCBcbiAgICBcImxvd2VyXCIsIFxuICAgIFwic3RlbVwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplckN1c3RvbVRva2VucyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerDelimiter1_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyRGVsaW1pdGVyMQpkZXNjcmlwdGlvbjogU3BsaXQgY29tbWEtc2VwYXJhdGVkIHRleHQgaW50byB0b2tlbnMgYnV0IGRvIG5vdCBzcGxpdCBxdW90ZWQgZmllbGRzCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJkZWxpbWl0ZXJfY3N2IiwgImRlbGltaXRlciIsIHsKICBkZWxpbWl0ZXI6ICIsIgp9LCBbXSk7CmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUygnZm9vLGJhcixiYXosImJhcixiYXoiJywgImRlbGltaXRlcl9jc3YiKWApLnRvQXJyYXkoKTsKfmFuYWx5emVycy5yZW1vdmUoYS5uYW1lKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJkZWxpbWl0ZXJfY3N2XCIsIFwiZGVsaW1pdGVyXCIsIHtcbiAgZGVsaW1pdGVyOiBcIixcIlxufSwgW10pO1xuZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKCdmb28sYmFyLGJheixcImJhcixiYXpcIicsIFwiZGVsaW1pdGVyX2NzdlwiKWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiZm9vXCIsIFxuICAgIFwiYmFyXCIsIFxuICAgIFwiYmF6XCIsIFxuICAgIFwiYmFyLGJhelwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlNwbGl0IGNvbW1hLXNlcGFyYXRlZCB0ZXh0IGludG8gdG9rZW5zIGJ1dCBkbyBub3Qgc3BsaXQgcXVvdGVkIGZpZWxkcyIsIm5hbWUiOiJhbmFseXplckRlbGltaXRlcjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerDelimiter2_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyRGVsaW1pdGVyMgpkZXNjcmlwdGlvbjogPgogIFNwbGl0IGlucHV0IHN0cmluZ3MgaW50byB0b2tlbnMgYXQgZXZlcnkgY2hhcmFjdGVyIHNlcXVlbmNlIG9mIGh5cGhlbi1taW51cywKICByaWdodCBhbmdsZWQgYnJhY2tldCwgYW5kIGEgc3BhY2UKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoImRlbGltaXRlcl9hcnJvdyIsICJkZWxpbWl0ZXIiLCB7CiAgZGVsaW1pdGVyOiAiLT4gIgp9LCBbXSk7CmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUygic29tZS0+IGhhbmQtcGlja2VkLT4gd29yZHMiLCAiZGVsaW1pdGVyX2Fycm93IilgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJkZWxpbWl0ZXJfYXJyb3dcIiwgXCJkZWxpbWl0ZXJcIiwge1xuICBkZWxpbWl0ZXI6IFwiLVx1MDAzZSBcIlxufSwgW10pO1xuZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKFwic29tZS1cdTAwM2UgaGFuZC1waWNrZWQtXHUwMDNlIHdvcmRzXCIsIFwiZGVsaW1pdGVyX2Fycm93XCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJzb21lXCIsIFxuICAgIFwiaGFuZC1waWNrZWRcIiwgXG4gICAgXCJ3b3Jkc1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlNwbGl0IGlucHV0IHN0cmluZ3MgaW50byB0b2tlbnMgYXQgZXZlcnkgY2hhcmFjdGVyIHNlcXVlbmNlIG9mIGh5cGhlbi1taW51cywgcmlnaHQgYW5nbGVkIGJyYWNrZXQsIGFuZCBhIHNwYWNlXG4iLCJuYW1lIjoiYW5hbHl6ZXJEZWxpbWl0ZXIyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerFeatures_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyRmVhdHVyZXMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwphbmFseXplcnMuYW5hbHl6ZXIoInRleHRfZW4iKS5mZWF0dXJlcygpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5hbmFseXplcihcInRleHRfZW5cIikuZmVhdHVyZXMoKTsiLCJvdXRwdXQiOiJbIFxuICBcImZyZXF1ZW5jeVwiLCBcbiAgXCJwb3NpdGlvblwiLCBcbiAgXCJub3JtXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyRmVhdHVyZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerGeoJSON_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyR2VvSlNPTgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoImdlb19qc29uIiwgImdlb2pzb24iLCB7fSwgW10pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImdlbyIpOwp2YXIgZG9jcyA9IGRiLmdlby5zYXZlKFsKICB7IGxvY2F0aW9uOiB7IHR5cGU6ICJQb2ludCIsIGNvb3JkaW5hdGVzOiBbNi45MzcsIDUwLjkzMl0gfSB9LAogIHsgbG9jYXRpb246IHsgdHlwZTogIlBvaW50IiwgY29vcmRpbmF0ZXM6IFs2Ljk1NiwgNTAuOTQxXSB9IH0sCiAgeyBsb2NhdGlvbjogeyB0eXBlOiAiUG9pbnQiLCBjb29yZGluYXRlczogWzYuOTYyLCA1MC45MzJdIH0gfSwKXSk7CnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoImdlb192aWV3IiwgImFyYW5nb3NlYXJjaCIsIHsKICBsaW5rczogewogICAgZ2VvOiB7CiAgICAgIGZpZWxkczogewogICAgICAgIGxvY2F0aW9uOiB7CiAgICAgICAgICBhbmFseXplcnM6IFsiZ2VvX2pzb24iXQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfSk7Cn5hc3NlcnQoZGIuX3F1ZXJ5KGBGT1IgZCBJTiBnZW9fdmlldyBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjIFJFVFVSTiBjYCkudG9BcnJheSgpWzBdID09PSAzKTsKZGIuX3F1ZXJ5KGBMRVQgcG9pbnQgPSBHRU9fUE9JTlQoNi45MywgNTAuOTQpCiAgRk9SIGRvYyBJTiBnZW9fdmlldwogICAgU0VBUkNIIEFOQUxZWkVSKEdFT19ESVNUQU5DRShkb2MubG9jYXRpb24sIHBvaW50KSA8IDIwMDAsICJnZW9fanNvbiIpCiAgICBSRVRVUk4gTUVSR0UoZG9jLCB7IGRpc3RhbmNlOiBHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgfSlgKS50b0FycmF5KCk7Cn5kYi5fZHJvcFZpZXcoImdlb192aWV3Iik7Cn5hbmFseXplcnMucmVtb3ZlKCJnZW9fanNvbiIsIHRydWUpOwp+ZGIuX2Ryb3AoImdlbyIpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJnZW9fanNvblwiLCBcImdlb2pzb25cIiwge30sIFtdKTtcbnZhciBjb2xsID0gZGIuX2NyZWF0ZShcImdlb1wiKTtcbnZhciBkb2NzID0gZGIuZ2VvLnNhdmUoW1xuICB7IGxvY2F0aW9uOiB7IHR5cGU6IFwiUG9pbnRcIiwgY29vcmRpbmF0ZXM6IFs2LjkzNywgNTAuOTMyXSB9IH0sXG4gIHsgbG9jYXRpb246IHsgdHlwZTogXCJQb2ludFwiLCBjb29yZGluYXRlczogWzYuOTU2LCA1MC45NDFdIH0gfSxcbiAgeyBsb2NhdGlvbjogeyB0eXBlOiBcIlBvaW50XCIsIGNvb3JkaW5hdGVzOiBbNi45NjIsIDUwLjkzMl0gfSB9LFxuXSk7XG52YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KFwiZ2VvX3ZpZXdcIiwgXCJhcmFuZ29zZWFyY2hcIiwge1xuICBsaW5rczoge1xuICAgIGdlbzoge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgYW5hbHl6ZXJzOiBbXCJnZW9fanNvblwiXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbmRiLl9xdWVyeShgTEVUIHBvaW50ID0gR0VPX1BPSU5UKDYuOTMsIDUwLjk0KVxuICBGT1IgZG9jIElOIGdlb192aWV3XG4gICAgU0VBUkNIIEFOQUxZWkVSKEdFT19ESVNUQU5DRShkb2MubG9jYXRpb24sIHBvaW50KSBcdTAwM2MgMjAwMCwgXCJnZW9fanNvblwiKVxuICAgIFJFVFVSTiBNRVJHRShkb2MsIHsgZGlzdGFuY2U6IEdFT19ESVNUQU5DRShkb2MubG9jYXRpb24sIHBvaW50KSB9KWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImdlby84MDIyMlwiLCBcbiAgICBcIl9rZXlcIiA6IFwiODAyMjJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNha1ktLS0tXCIsIFxuICAgIFwibG9jYXRpb25cIiA6IHsgXG4gICAgICBcInR5cGVcIiA6IFwiUG9pbnRcIiwgXG4gICAgICBcImNvb3JkaW5hdGVzXCIgOiBbIFxuICAgICAgICA2LjkzNywgXG4gICAgICAgIDUwLjkzMiBcbiAgICAgIF0gXG4gICAgfSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMTAxNS44MzU1NzM5NDM2ODIzIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJnZW8vODAyMjNcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjgwMjIzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWtZLS0tX1wiLCBcbiAgICBcImxvY2F0aW9uXCIgOiB7IFxuICAgICAgXCJ0eXBlXCIgOiBcIlBvaW50XCIsIFxuICAgICAgXCJjb29yZGluYXRlc1wiIDogWyBcbiAgICAgICAgNi45NTYsIFxuICAgICAgICA1MC45NDEgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDE4MjUuMTMwNzE4MzU3MTI2NiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJHZW9KU09OIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerGeoPointLatLng_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyR2VvUG9pbnRMYXRMbmcKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJnZW9fbGF0bG5nIiwgImdlb3BvaW50IiwgewogIGxhdGl0dWRlOiBbImxhdCJdLAogIGxvbmdpdHVkZTogWyJsbmciXQp9LCBbXSk7CnZhciBjb2xsID0gZGIuX2NyZWF0ZSgiZ2VvIik7CnZhciBkb2NzID0gZGIuZ2VvLnNhdmUoWwogIHsgbG9jYXRpb246IHsgbGF0OiA1MC45MzIsIGxuZzogNi45MzcgfSB9LAogIHsgbG9jYXRpb246IHsgbGF0OiA1MC45NDEsIGxuZzogNi45NTYgfSB9LAogIHsgbG9jYXRpb246IHsgbGF0OiA1MC45MzIsIGxuZzogNi45NjIgfSB9LApdKTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygiZ2VvX3ZpZXciLCAiYXJhbmdvc2VhcmNoIiwgewogIGxpbmtzOiB7CiAgICBnZW86IHsKICAgICAgZmllbGRzOiB7CiAgICAgICAgbG9jYXRpb246IHsKICAgICAgICAgIGFuYWx5emVyczogWyJnZW9fbGF0bG5nIl0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0pOwp+YXNzZXJ0KGRiLl9xdWVyeShgRk9SIGQgSU4gZ2VvX3ZpZXcgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gYyBSRVRVUk4gY2ApLnRvQXJyYXkoKVswXSA9PT0gMyk7CmRiLl9xdWVyeShgTEVUIHBvaW50ID0gR0VPX1BPSU5UKDYuOTMsIDUwLjk0KQogIEZPUiBkb2MgSU4gZ2VvX3ZpZXcKICAgIFNFQVJDSCBBTkFMWVpFUihHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgPCAyMDAwLCAiZ2VvX2xhdGxuZyIpCiAgICBSRVRVUk4gTUVSR0UoZG9jLCB7IGRpc3RhbmNlOiBHRU9fRElTVEFOQ0UoW2RvYy5sb2NhdGlvbi5sbmcsIGRvYy5sb2NhdGlvbi5sYXRdLCBwb2ludCkgfSlgKS50b0FycmF5KCk7Cn5kYi5fZHJvcFZpZXcoImdlb192aWV3Iik7Cn5hbmFseXplcnMucmVtb3ZlKCJnZW9fbGF0bG5nIiwgdHJ1ZSk7Cn5kYi5fZHJvcCgiZ2VvIik7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJnZW9fbGF0bG5nXCIsIFwiZ2VvcG9pbnRcIiwge1xuICBsYXRpdHVkZTogW1wibGF0XCJdLFxuICBsb25naXR1ZGU6IFtcImxuZ1wiXVxufSwgW10pO1xudmFyIGNvbGwgPSBkYi5fY3JlYXRlKFwiZ2VvXCIpO1xudmFyIGRvY3MgPSBkYi5nZW8uc2F2ZShbXG4gIHsgbG9jYXRpb246IHsgbGF0OiA1MC45MzIsIGxuZzogNi45MzcgfSB9LFxuICB7IGxvY2F0aW9uOiB7IGxhdDogNTAuOTQxLCBsbmc6IDYuOTU2IH0gfSxcbiAgeyBsb2NhdGlvbjogeyBsYXQ6IDUwLjkzMiwgbG5nOiA2Ljk2MiB9IH0sXG5dKTtcbnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJnZW9fdmlld1wiLCBcImFyYW5nb3NlYXJjaFwiLCB7XG4gIGxpbmtzOiB7XG4gICAgZ2VvOiB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICBhbmFseXplcnM6IFtcImdlb19sYXRsbmdcIl1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5kYi5fcXVlcnkoYExFVCBwb2ludCA9IEdFT19QT0lOVCg2LjkzLCA1MC45NClcbiAgRk9SIGRvYyBJTiBnZW9fdmlld1xuICAgIFNFQVJDSCBBTkFMWVpFUihHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgXHUwMDNjIDIwMDAsIFwiZ2VvX2xhdGxuZ1wiKVxuICAgIFJFVFVSTiBNRVJHRShkb2MsIHsgZGlzdGFuY2U6IEdFT19ESVNUQU5DRShbZG9jLmxvY2F0aW9uLmxuZywgZG9jLmxvY2F0aW9uLmxhdF0sIHBvaW50KSB9KWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImdlby84MDI5NFwiLCBcbiAgICBcIl9rZXlcIiA6IFwiODAyOTRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNha2VLLS1fXCIsIFxuICAgIFwibG9jYXRpb25cIiA6IHsgXG4gICAgICBcImxhdFwiIDogNTAuOTMyLCBcbiAgICAgIFwibG5nXCIgOiA2LjkzNyBcbiAgICB9LCBcbiAgICBcImRpc3RhbmNlXCIgOiAxMDE1LjgzNTU3Mzk0MzY4MjMgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImdlby84MDI5NVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiODAyOTVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNha2VLLS1BXCIsIFxuICAgIFwibG9jYXRpb25cIiA6IHsgXG4gICAgICBcImxhdFwiIDogNTAuOTQxLCBcbiAgICAgIFwibG5nXCIgOiA2Ljk1NiBcbiAgICB9LCBcbiAgICBcImRpc3RhbmNlXCIgOiAxODI1LjEzMDcxODM1NzEyNjYgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyR2VvUG9pbnRMYXRMbmciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerGeoPointPair_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyR2VvUG9pbnRQYWlyCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgiZ2VvX3BhaXIiLCAiZ2VvcG9pbnQiLCB7fSwgW10pOwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImdlbyIpOwp2YXIgZG9jcyA9IGRiLmdlby5zYXZlKFsKICB7IGxvY2F0aW9uOiBbNTAuOTMyLCA2LjkzN10gfSwKICB7IGxvY2F0aW9uOiBbNTAuOTQxLCA2Ljk1Nl0gfSwKICB7IGxvY2F0aW9uOiBbNTAuOTMyLCA2Ljk2Ml0gfSwKXSk7CnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoImdlb192aWV3IiwgImFyYW5nb3NlYXJjaCIsIHsKICBsaW5rczogewogICAgZ2VvOiB7CiAgICAgIGZpZWxkczogewogICAgICAgIGxvY2F0aW9uOiB7CiAgICAgICAgICBhbmFseXplcnM6IFsiZ2VvX3BhaXIiXQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfSk7Cn5hc3NlcnQoZGIuX3F1ZXJ5KGBGT1IgZCBJTiBnZW9fdmlldyBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjIFJFVFVSTiBjYCkudG9BcnJheSgpWzBdID09PSAzKTsKZGIuX3F1ZXJ5KGBMRVQgcG9pbnQgPSBHRU9fUE9JTlQoNi45MywgNTAuOTQpCiAgRk9SIGRvYyBJTiBnZW9fdmlldwogICAgU0VBUkNIIEFOQUxZWkVSKEdFT19ESVNUQU5DRShkb2MubG9jYXRpb24sIHBvaW50KSA8IDIwMDAsICJnZW9fcGFpciIpCiAgICBSRVRVUk4gTUVSR0UoZG9jLCB7IGRpc3RhbmNlOiBHRU9fRElTVEFOQ0UoW2RvYy5sb2NhdGlvblsxXSwgZG9jLmxvY2F0aW9uWzBdXSwgcG9pbnQpIH0pYCkudG9BcnJheSgpOwp+ZGIuX2Ryb3BWaWV3KCJnZW9fdmlldyIpOwp+YW5hbHl6ZXJzLnJlbW92ZSgiZ2VvX3BhaXIiLCB0cnVlKTsKfmRiLl9kcm9wKCJnZW8iKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJnZW9fcGFpclwiLCBcImdlb3BvaW50XCIsIHt9LCBbXSk7XG52YXIgY29sbCA9IGRiLl9jcmVhdGUoXCJnZW9cIik7XG52YXIgZG9jcyA9IGRiLmdlby5zYXZlKFtcbiAgeyBsb2NhdGlvbjogWzUwLjkzMiwgNi45MzddIH0sXG4gIHsgbG9jYXRpb246IFs1MC45NDEsIDYuOTU2XSB9LFxuICB7IGxvY2F0aW9uOiBbNTAuOTMyLCA2Ljk2Ml0gfSxcbl0pO1xudmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldyhcImdlb192aWV3XCIsIFwiYXJhbmdvc2VhcmNoXCIsIHtcbiAgbGlua3M6IHtcbiAgICBnZW86IHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgIGFuYWx5emVyczogW1wiZ2VvX3BhaXJcIl1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5kYi5fcXVlcnkoYExFVCBwb2ludCA9IEdFT19QT0lOVCg2LjkzLCA1MC45NClcbiAgRk9SIGRvYyBJTiBnZW9fdmlld1xuICAgIFNFQVJDSCBBTkFMWVpFUihHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgXHUwMDNjIDIwMDAsIFwiZ2VvX3BhaXJcIilcbiAgICBSRVRVUk4gTUVSR0UoZG9jLCB7IGRpc3RhbmNlOiBHRU9fRElTVEFOQ0UoW2RvYy5sb2NhdGlvblsxXSwgZG9jLmxvY2F0aW9uWzBdXSwgcG9pbnQpIH0pYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiZ2VvLzgwMjcwXCIsIFxuICAgIFwiX2tleVwiIDogXCI4MDI3MFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrYm0tLV9cIiwgXG4gICAgXCJsb2NhdGlvblwiIDogWyBcbiAgICAgIDUwLjkzMiwgXG4gICAgICA2LjkzNyBcbiAgICBdLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxMDE1LjgzNTU3Mzk0MzY4MjMgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImdlby84MDI3MVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiODAyNzFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNha2JtLS1BXCIsIFxuICAgIFwibG9jYXRpb25cIiA6IFsgXG4gICAgICA1MC45NDEsIFxuICAgICAgNi45NTYgXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMTgyNS4xMzA3MTgzNTcxMjY2IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplckdlb1BvaW50UGFpciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerGeoS2_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyR2VvUzIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJnZW9fZWZmaWNpZW50IiwgImdlb19zMiIsIHsgZm9ybWF0OiAibGF0TG5nSW50IiB9LCBbXSk7CnZhciBjb2xsID0gZGIuX2NyZWF0ZSgiZ2VvIik7CnZhciBkb2NzID0gZGIuZ2VvLnNhdmUoWwogIHsgbG9jYXRpb246IHsgdHlwZTogIlBvaW50IiwgY29vcmRpbmF0ZXM6IFs2LjkzNywgNTAuOTMyXSB9IH0sCiAgeyBsb2NhdGlvbjogeyB0eXBlOiAiUG9pbnQiLCBjb29yZGluYXRlczogWzYuOTU2LCA1MC45NDFdIH0gfSwKICB7IGxvY2F0aW9uOiB7IHR5cGU6ICJQb2ludCIsIGNvb3JkaW5hdGVzOiBbNi45NjIsIDUwLjkzMl0gfSB9LApdKTsKdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygiZ2VvX3ZpZXciLCAiYXJhbmdvc2VhcmNoIiwgewogIGxpbmtzOiB7CiAgICBnZW86IHsKICAgICAgZmllbGRzOiB7CiAgICAgICAgbG9jYXRpb246IHsKICAgICAgICAgIGFuYWx5emVyczogWyJnZW9fZWZmaWNpZW50Il0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0pOwp+YXNzZXJ0KGRiLl9xdWVyeShgRk9SIGQgSU4gZ2VvX3ZpZXcgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gYyBSRVRVUk4gY2ApLnRvQXJyYXkoKVswXSA9PT0gMyk7CmRiLl9xdWVyeShgTEVUIHBvaW50ID0gR0VPX1BPSU5UKDYuOTMsIDUwLjk0KQogIEZPUiBkb2MgSU4gZ2VvX3ZpZXcKICAgIFNFQVJDSCBBTkFMWVpFUihHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgPCAyMDAwLCAiZ2VvX2VmZmljaWVudCIpCiAgICBSRVRVUk4gTUVSR0UoZG9jLCB7IGRpc3RhbmNlOiBHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgfSlgKS50b0FycmF5KCk7Cn5kYi5fZHJvcFZpZXcoImdlb192aWV3Iik7Cn5hbmFseXplcnMucmVtb3ZlKCJnZW9fZWZmaWNpZW50IiwgdHJ1ZSk7Cn5kYi5fZHJvcCgiZ2VvIik7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJnZW9fZWZmaWNpZW50XCIsIFwiZ2VvX3MyXCIsIHsgZm9ybWF0OiBcImxhdExuZ0ludFwiIH0sIFtdKTtcbnZhciBjb2xsID0gZGIuX2NyZWF0ZShcImdlb1wiKTtcbnZhciBkb2NzID0gZGIuZ2VvLnNhdmUoW1xuICB7IGxvY2F0aW9uOiB7IHR5cGU6IFwiUG9pbnRcIiwgY29vcmRpbmF0ZXM6IFs2LjkzNywgNTAuOTMyXSB9IH0sXG4gIHsgbG9jYXRpb246IHsgdHlwZTogXCJQb2ludFwiLCBjb29yZGluYXRlczogWzYuOTU2LCA1MC45NDFdIH0gfSxcbiAgeyBsb2NhdGlvbjogeyB0eXBlOiBcIlBvaW50XCIsIGNvb3JkaW5hdGVzOiBbNi45NjIsIDUwLjkzMl0gfSB9LFxuXSk7XG52YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KFwiZ2VvX3ZpZXdcIiwgXCJhcmFuZ29zZWFyY2hcIiwge1xuICBsaW5rczoge1xuICAgIGdlbzoge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgYW5hbHl6ZXJzOiBbXCJnZW9fZWZmaWNpZW50XCJdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuZGIuX3F1ZXJ5KGBMRVQgcG9pbnQgPSBHRU9fUE9JTlQoNi45MywgNTAuOTQpXG4gIEZPUiBkb2MgSU4gZ2VvX3ZpZXdcbiAgICBTRUFSQ0ggQU5BTFlaRVIoR0VPX0RJU1RBTkNFKGRvYy5sb2NhdGlvbiwgcG9pbnQpIFx1MDAzYyAyMDAwLCBcImdlb19lZmZpY2llbnRcIilcbiAgICBSRVRVUk4gTUVSR0UoZG9jLCB7IGRpc3RhbmNlOiBHRU9fRElTVEFOQ0UoZG9jLmxvY2F0aW9uLCBwb2ludCkgfSlgKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJnZW8vODAyNDZcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjgwMjQ2XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWtaTy0tLVwiLCBcbiAgICBcImxvY2F0aW9uXCIgOiB7IFxuICAgICAgXCJ0eXBlXCIgOiBcIlBvaW50XCIsIFxuICAgICAgXCJjb29yZGluYXRlc1wiIDogWyBcbiAgICAgICAgNi45MzcsIFxuICAgICAgICA1MC45MzIgXG4gICAgICBdIFxuICAgIH0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEwMTUuODM1NTczOTQzNjgyMyBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiZ2VvLzgwMjQ3XCIsIFxuICAgIFwiX2tleVwiIDogXCI4MDI0N1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrWk8tLV9cIiwgXG4gICAgXCJsb2NhdGlvblwiIDogeyBcbiAgICAgIFwidHlwZVwiIDogXCJQb2ludFwiLCBcbiAgICAgIFwiY29vcmRpbmF0ZXNcIiA6IFsgXG4gICAgICAgIDYuOTU2LCBcbiAgICAgICAgNTAuOTQxIFxuICAgICAgXSBcbiAgICB9LCBcbiAgICBcImRpc3RhbmNlXCIgOiAxODI1LjEzMDcxODM1NzEyNjYgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyR2VvUzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerIdentity_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVySWRlbnRpdHkKZGVzY3JpcHRpb246ICcnCi0tLQpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoIlVQUEVSIGxvd2VyIGTDr8OkY3LDrXRpY8WhIiwgImlkZW50aXR5IilgKS50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUyhcIlVQUEVSIGxvd2VyIGTDr8OkY3LDrXRpY8WhXCIsIFwiaWRlbnRpdHlcIilgKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIlVQUEVSIGxvd2VyIGTDr8OkY3LDrXRpY8WhXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVySWRlbnRpdHkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerList_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTGlzdApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgW0FyYW5nb0FuYWx5emVyIFwidGV4dF9maVwiICh0eXBlIHRleHQpXSwgXG4gIFtBcmFuZ29BbmFseXplciBcInRleHRfcnVcIiAodHlwZSB0ZXh0KV0sIFxuICBbQXJhbmdvQW5hbHl6ZXIgXCJ0ZXh0X2VzXCIgKHR5cGUgdGV4dCldLCBcbiAgW0FyYW5nb0FuYWx5emVyIFwidGV4dF9kZVwiICh0eXBlIHRleHQpXSwgXG4gIFtBcmFuZ29BbmFseXplciBcInRleHRfZW5cIiAodHlwZSB0ZXh0KV0sIFxuICBbQXJhbmdvQW5hbHl6ZXIgXCJ0ZXh0X2l0XCIgKHR5cGUgdGV4dCldLCBcbiAgW0FyYW5nb0FuYWx5emVyIFwidGV4dF9ub1wiICh0eXBlIHRleHQpXSwgXG4gIFtBcmFuZ29BbmFseXplciBcInRleHRfemhcIiAodHlwZSB0ZXh0KV0sIFxuICBbQXJhbmdvQW5hbHl6ZXIgXCJpZGVudGl0eVwiICh0eXBlIGlkZW50aXR5KV0sIFxuICBbQXJhbmdvQW5hbHl6ZXIgXCJ0ZXh0X2ZyXCIgKHR5cGUgdGV4dCldLCBcbiAgW0FyYW5nb0FuYWx5emVyIFwidGV4dF9ubFwiICh0eXBlIHRleHQpXSwgXG4gIFtBcmFuZ29BbmFseXplciBcInRleHRfcHRcIiAodHlwZSB0ZXh0KV0sIFxuICBbQXJhbmdvQW5hbHl6ZXIgXCJ0ZXh0X3N2XCIgKHR5cGUgdGV4dCldIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplckxpc3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerMinHash_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTWluSGFzaApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhbmFseXplck1pbkhhc2ggPSBhbmFseXplcnMuc2F2ZSgibWluaGFzaDUiLCAibWluaGFzaCIsIHsgYW5hbHl6ZXI6IHsgdHlwZTogInNlZ21lbnRhdGlvbiIsIHByb3BlcnRpZXM6IHsgYnJlYWs6ICJhbHBoYSIsIGNhc2U6ICJsb3dlciIgfSB9LCBudW1IYXNoZXM6IDUgfSwgW10pOwp2YXIgYW5hbHl6ZXJTZWdtZW50ID0gYW5hbHl6ZXJzLnNhdmUoInNlZ21lbnQiLCAic2VnbWVudGF0aW9uIiwgeyBicmVhazogImFscGhhIiwgY2FzZTogImxvd2VyIiB9LCBbXSk7CmRiLl9xdWVyeShgCiAgTEVUIHN0cjEgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iCiAgTEVUIHN0cjIgPSAiVGhlIGZveCBqdW1wcyBvdmVyIHRoZSBjcmF6eSBkb2cuIgogIFJFVFVSTiB7CiAgICBhcHByb3g6IEpBQ0NBUkQoVE9LRU5TKHN0cjEsICJtaW5oYXNoNSIpLCBUT0tFTlMoc3RyMiwgIm1pbmhhc2g1IikpLAogICAgYWN0dWFsOiBKQUNDQVJEKFRPS0VOUyhzdHIxLCAic2VnbWVudCIpLCBUT0tFTlMoc3RyMiwgInNlZ21lbnQiKSkKICB9YCkudG9BcnJheSgpOwp+YW5hbHl6ZXJzLnJlbW92ZShhbmFseXplck1pbkhhc2gubmFtZSk7Cn5hbmFseXplcnMucmVtb3ZlKGFuYWx5emVyU2VnbWVudC5uYW1lKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhbmFseXplck1pbkhhc2ggPSBhbmFseXplcnMuc2F2ZShcIm1pbmhhc2g1XCIsIFwibWluaGFzaFwiLCB7IGFuYWx5emVyOiB7IHR5cGU6IFwic2VnbWVudGF0aW9uXCIsIHByb3BlcnRpZXM6IHsgYnJlYWs6IFwiYWxwaGFcIiwgY2FzZTogXCJsb3dlclwiIH0gfSwgbnVtSGFzaGVzOiA1IH0sIFtdKTtcbnZhciBhbmFseXplclNlZ21lbnQgPSBhbmFseXplcnMuc2F2ZShcInNlZ21lbnRcIiwgXCJzZWdtZW50YXRpb25cIiwgeyBicmVhazogXCJhbHBoYVwiLCBjYXNlOiBcImxvd2VyXCIgfSwgW10pO1xuZGIuX3F1ZXJ5KGBcbiAgTEVUIHN0cjEgPSBcIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuXCJcbiAgTEVUIHN0cjIgPSBcIlRoZSBmb3gganVtcHMgb3ZlciB0aGUgY3JhenkgZG9nLlwiXG4gIFJFVFVSTiB7XG4gICAgYXBwcm94OiBKQUNDQVJEKFRPS0VOUyhzdHIxLCBcIm1pbmhhc2g1XCIpLCBUT0tFTlMoc3RyMiwgXCJtaW5oYXNoNVwiKSksXG4gICAgYWN0dWFsOiBKQUNDQVJEKFRPS0VOUyhzdHIxLCBcInNlZ21lbnRcIiksIFRPS0VOUyhzdHIyLCBcInNlZ21lbnRcIikpXG4gIH1gKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImFwcHJveFwiIDogMC40Mjg1NzE0Mjg1NzE0Mjg1NSwgXG4gICAgXCJhY3R1YWxcIiA6IDAuNTU1NTU1NTU1NTU1NTU1NiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJNaW5IYXNoIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerName_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTmFtZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy5hbmFseXplcigidGV4dF9lbiIpLm5hbWUoKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5hbmFseXplcihcInRleHRfZW5cIikubmFtZSgpOyIsIm91dHB1dCI6InRleHRfZW4iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJOYW1lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerNgram1_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTmdyYW0xCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgidHJpZ3JhbSIsICJuZ3JhbSIsIHsKICBtaW46IDMsCiAgbWF4OiAzLAogIHByZXNlcnZlT3JpZ2luYWw6IGZhbHNlLAogIHN0cmVhbVR5cGU6ICJ1dGY4Igp9LCBbXSk7CmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUygiZm9vYmFyIiwgInRyaWdyYW0iKWApLnRvQXJyYXkoKTsKfmFuYWx5emVycy5yZW1vdmUoYS5uYW1lKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJ0cmlncmFtXCIsIFwibmdyYW1cIiwge1xuICBtaW46IDMsXG4gIG1heDogMyxcbiAgcHJlc2VydmVPcmlnaW5hbDogZmFsc2UsXG4gIHN0cmVhbVR5cGU6IFwidXRmOFwiXG59LCBbXSk7XG5kYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoXCJmb29iYXJcIiwgXCJ0cmlncmFtXCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJmb29cIiwgXG4gICAgXCJvb2JcIiwgXG4gICAgXCJvYmFcIiwgXG4gICAgXCJiYXJcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJOZ3JhbTEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerNgram2_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTmdyYW0yCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgiYmlncmFtX21hcmtlcnMiLCAibmdyYW0iLCB7CiAgbWluOiAyLAogIG1heDogMiwKICBwcmVzZXJ2ZU9yaWdpbmFsOiB0cnVlLAogIHN0YXJ0TWFya2VyOiAiXiIsCiAgZW5kTWFya2VyOiAiJCIsCiAgc3RyZWFtVHlwZTogInV0ZjgiCn0sIFtdKTsKZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKCJmb29iYXIiLCAiYmlncmFtX21hcmtlcnMiKWApLnRvQXJyYXkoKTsKfmFuYWx5emVycy5yZW1vdmUoYS5uYW1lKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJiaWdyYW1fbWFya2Vyc1wiLCBcIm5ncmFtXCIsIHtcbiAgbWluOiAyLFxuICBtYXg6IDIsXG4gIHByZXNlcnZlT3JpZ2luYWw6IHRydWUsXG4gIHN0YXJ0TWFya2VyOiBcIl5cIixcbiAgZW5kTWFya2VyOiBcIiRcIixcbiAgc3RyZWFtVHlwZTogXCJ1dGY4XCJcbn0sIFtdKTtcbmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUyhcImZvb2JhclwiLCBcImJpZ3JhbV9tYXJrZXJzXCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJeZm9cIiwgXG4gICAgXCJeZm9vYmFyXCIsIFxuICAgIFwiZm9vYmFyJFwiLCBcbiAgICBcIm9vXCIsIFxuICAgIFwib2JcIiwgXG4gICAgXCJiYVwiLCBcbiAgICBcImFyJFwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplck5ncmFtMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerNorm1_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTm9ybTEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJub3JtX3VwcGVyIiwgIm5vcm0iLCB7CiAgbG9jYWxlOiAiZW4iLAogIGNhc2U6ICJ1cHBlciIKfSwgW10pOwpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoIlVQUEVSIGxvd2VyIGTDr8OkY3LDrXRpY8WhIiwgIm5vcm1fdXBwZXIiKWApLnRvQXJyYXkoKTsKfmFuYWx5emVycy5yZW1vdmUoYS5uYW1lKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJub3JtX3VwcGVyXCIsIFwibm9ybVwiLCB7XG4gIGxvY2FsZTogXCJlblwiLFxuICBjYXNlOiBcInVwcGVyXCJcbn0sIFtdKTtcbmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUyhcIlVQUEVSIGxvd2VyIGTDr8OkY3LDrXRpY8WhXCIsIFwibm9ybV91cHBlclwiKWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiVVBQRVIgTE9XRVIgRMOPw4RDUsONVElDxaBcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJOb3JtMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerNorm2_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTm9ybTIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJub3JtX2FjY2VudCIsICJub3JtIiwgewogIGxvY2FsZTogImVuIiwKICBhY2NlbnQ6IGZhbHNlCn0sIFtdKTsKZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKCJVUFBFUiBsb3dlciBkw6/DpGNyw610aWPFoSIsICJub3JtX2FjY2VudCIpYCkudG9BcnJheSgpOwp+YW5hbHl6ZXJzLnJlbW92ZShhLm5hbWUpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJub3JtX2FjY2VudFwiLCBcIm5vcm1cIiwge1xuICBsb2NhbGU6IFwiZW5cIixcbiAgYWNjZW50OiBmYWxzZVxufSwgW10pO1xuZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKFwiVVBQRVIgbG93ZXIgZMOvw6RjcsOtdGljxaFcIiwgXCJub3JtX2FjY2VudFwiKWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiVVBQRVIgbG93ZXIgZGlhY3JpdGljc1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplck5vcm0yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerNorm3_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyTm9ybTMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJub3JtX2FjY2VudF9sb3dlciIsICJub3JtIiwgewogIGxvY2FsZTogImVuIiwKICBhY2NlbnQ6IGZhbHNlLAogIGNhc2U6ICJsb3dlciIKfSwgW10pOwpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoIlVQUEVSIGxvd2VyIGTDr8OkY3LDrXRpY8WhIiwgIm5vcm1fYWNjZW50X2xvd2VyIilgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJub3JtX2FjY2VudF9sb3dlclwiLCBcIm5vcm1cIiwge1xuICBsb2NhbGU6IFwiZW5cIixcbiAgYWNjZW50OiBmYWxzZSxcbiAgY2FzZTogXCJsb3dlclwiXG59LCBbXSk7XG5kYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoXCJVUFBFUiBsb3dlciBkw6/DpGNyw610aWPFoVwiLCBcIm5vcm1fYWNjZW50X2xvd2VyXCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJ1cHBlciBsb3dlciBkaWFjcml0aWNzXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyTm9ybTMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerPipelineDelimiterStem_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyUGlwZWxpbmVEZWxpbWl0ZXJTdGVtCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgiZGVsaW1pdGVyX3N0ZW0iLCAicGlwZWxpbmUiLCB7IHBpcGVsaW5lOiBbCiAgeyB0eXBlOiAiZGVsaW1pdGVyIiwgcHJvcGVydGllczogeyBkZWxpbWl0ZXI6ICIsIiB9IH0sCiAgeyB0eXBlOiAiZGVsaW1pdGVyIiwgcHJvcGVydGllczogeyBkZWxpbWl0ZXI6ICI7IiB9IH0sCiAgeyB0eXBlOiAic3RlbSIsIHByb3BlcnRpZXM6IHsgbG9jYWxlOiAiZW4iIH0gfQpdIH0sIFtdKTsKZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKCJkZWxpbWl0ZWQsc3RlbW1hYmxlO3dvcmRzIiwgImRlbGltaXRlcl9zdGVtIilgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJkZWxpbWl0ZXJfc3RlbVwiLCBcInBpcGVsaW5lXCIsIHsgcGlwZWxpbmU6IFtcbiAgeyB0eXBlOiBcImRlbGltaXRlclwiLCBwcm9wZXJ0aWVzOiB7IGRlbGltaXRlcjogXCIsXCIgfSB9LFxuICB7IHR5cGU6IFwiZGVsaW1pdGVyXCIsIHByb3BlcnRpZXM6IHsgZGVsaW1pdGVyOiBcIjtcIiB9IH0sXG4gIHsgdHlwZTogXCJzdGVtXCIsIHByb3BlcnRpZXM6IHsgbG9jYWxlOiBcImVuXCIgfSB9XG5dIH0sIFtdKTtcbmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUyhcImRlbGltaXRlZCxzdGVtbWFibGU7d29yZHNcIiwgXCJkZWxpbWl0ZXJfc3RlbVwiKWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiZGVsaW1pdFwiLCBcbiAgICBcInN0ZW1tYWJsXCIsIFxuICAgIFwid29yZFwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplclBpcGVsaW5lRGVsaW1pdGVyU3RlbSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerPipelineStopwords_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyUGlwZWxpbmVTdG9wd29yZHMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYSA9IGFuYWx5emVycy5zYXZlKCJub3JtX3N0b3AiLCAicGlwZWxpbmUiLCB7ICJwaXBlbGluZSI6IFsKICB7IHR5cGU6ICJub3JtIiwgcHJvcGVydGllczogeyBsb2NhbGU6ICJlbiIsIGFjY2VudDogZmFsc2UsIGNhc2U6ICJsb3dlciIgfSB9LAogIHsgdHlwZTogInN0b3B3b3JkcyIsIHByb3BlcnRpZXM6IHsgc3RvcHdvcmRzOiBbImFuZCIsInRoZSJdLCBoZXg6IGZhbHNlIH0gfSwKXX0sIFtdKTsKZGIuX3F1ZXJ5KCJSRVRVUk4gRkxBVFRFTihUT0tFTlMoU1BMSVQoJ1RoZSBmb3ggQU5EIHRoZSBkb2cgw6TDseG4jyBhIMWjaMOpw6R0ZXInLCAnICcpLCAnbm9ybV9zdG9wJykpIikudG9BcnJheSgpOwp+YW5hbHl6ZXJzLnJlbW92ZShhLm5hbWUpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJub3JtX3N0b3BcIiwgXCJwaXBlbGluZVwiLCB7IFwicGlwZWxpbmVcIjogW1xuICB7IHR5cGU6IFwibm9ybVwiLCBwcm9wZXJ0aWVzOiB7IGxvY2FsZTogXCJlblwiLCBhY2NlbnQ6IGZhbHNlLCBjYXNlOiBcImxvd2VyXCIgfSB9LFxuICB7IHR5cGU6IFwic3RvcHdvcmRzXCIsIHByb3BlcnRpZXM6IHsgc3RvcHdvcmRzOiBbXCJhbmRcIixcInRoZVwiXSwgaGV4OiBmYWxzZSB9IH0sXG5dfSwgW10pO1xuZGIuX3F1ZXJ5KFwiUkVUVVJOIEZMQVRURU4oVE9LRU5TKFNQTElUKCdUaGUgZm94IEFORCB0aGUgZG9nIMOkw7HhuI8gYSDFo2jDqcOkdGVyJywgJyAnKSwgJ25vcm1fc3RvcCcpKVwiKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImZveFwiLCBcbiAgICBcImRvZ1wiLCBcbiAgICBcImFcIiwgXG4gICAgXCJ0aGVhdGVyXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyUGlwZWxpbmVTdG9wd29yZHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerPipelineUpperNgram_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyUGlwZWxpbmVVcHBlck5ncmFtCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgibmdyYW1fdXBwZXIiLCAicGlwZWxpbmUiLCB7IHBpcGVsaW5lOiBbCiAgeyB0eXBlOiAibm9ybSIsIHByb3BlcnRpZXM6IHsgbG9jYWxlOiAiZW4iLCBjYXNlOiAidXBwZXIiIH0gfSwKICB7IHR5cGU6ICJuZ3JhbSIsIHByb3BlcnRpZXM6IHsgbWluOiAyLCBtYXg6IDIsIHByZXNlcnZlT3JpZ2luYWw6IGZhbHNlLCBzdHJlYW1UeXBlOiAidXRmOCIgfSB9Cl0gfSwgW10pOwpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoIlF1aWNrIGJyb3duIGZvWCIsICJuZ3JhbV91cHBlciIpYCkudG9BcnJheSgpOwp+YW5hbHl6ZXJzLnJlbW92ZShhLm5hbWUpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJuZ3JhbV91cHBlclwiLCBcInBpcGVsaW5lXCIsIHsgcGlwZWxpbmU6IFtcbiAgeyB0eXBlOiBcIm5vcm1cIiwgcHJvcGVydGllczogeyBsb2NhbGU6IFwiZW5cIiwgY2FzZTogXCJ1cHBlclwiIH0gfSxcbiAgeyB0eXBlOiBcIm5ncmFtXCIsIHByb3BlcnRpZXM6IHsgbWluOiAyLCBtYXg6IDIsIHByZXNlcnZlT3JpZ2luYWw6IGZhbHNlLCBzdHJlYW1UeXBlOiBcInV0ZjhcIiB9IH1cbl0gfSwgW10pO1xuZGIuX3F1ZXJ5KGBSRVRVUk4gVE9LRU5TKFwiUXVpY2sgYnJvd24gZm9YXCIsIFwibmdyYW1fdXBwZXJcIilgKS50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIlFVXCIsIFxuICAgIFwiVUlcIiwgXG4gICAgXCJJQ1wiLCBcbiAgICBcIkNLXCIsIFxuICAgIFwiSyBcIiwgXG4gICAgXCIgQlwiLCBcbiAgICBcIkJSXCIsIFxuICAgIFwiUk9cIiwgXG4gICAgXCJPV1wiLCBcbiAgICBcIldOXCIsIFxuICAgIFwiTiBcIiwgXG4gICAgXCIgRlwiLCBcbiAgICBcIkZPXCIsIFxuICAgIFwiT1hcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJQaXBlbGluZVVwcGVyTmdyYW0iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerProperties_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyUHJvcGVydGllcwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy5hbmFseXplcigidGV4dF9lbiIpLnByb3BlcnRpZXMoKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5hbmFseXplcihcInRleHRfZW5cIikucHJvcGVydGllcygpOyIsIm91dHB1dCI6InsgXG4gIFwibG9jYWxlXCIgOiBcImVuXCIsIFxuICBcImNhc2VcIiA6IFwibG93ZXJcIiwgXG4gIFwic3RvcHdvcmRzXCIgOiBbIF0sIFxuICBcImFjY2VudFwiIDogZmFsc2UsIFxuICBcInN0ZW1taW5nXCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhbmFseXplclByb3BlcnRpZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerRemove_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyUmVtb3ZlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKfmFuYWx5emVycy5zYXZlKCJjc3YiLCAiZGVsaW1pdGVyIiwgeyAiZGVsaW1pdGVyIjogIiwiIH0sIFtdKTsKYW5hbHl6ZXJzLnJlbW92ZSgiY3N2Iik7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5yZW1vdmUoXCJjc3ZcIik7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyUmVtb3ZlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerSegmentationBreak_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyU2VnbWVudGF0aW9uQnJlYWsKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp2YXIgYWxsID0gYW5hbHl6ZXJzLnNhdmUoInNlZ21lbnRfYWxsIiwgInNlZ21lbnRhdGlvbiIsIHsgYnJlYWs6ICJhbGwiIH0sIFtdKTsKdmFyIGFscGhhID0gYW5hbHl6ZXJzLnNhdmUoInNlZ21lbnRfYWxwaGEiLCAic2VnbWVudGF0aW9uIiwgeyBicmVhazogImFscGhhIiB9LCBbXSk7CnZhciBncmFwaGljID0gYW5hbHl6ZXJzLnNhdmUoInNlZ21lbnRfZ3JhcGhpYyIsICJzZWdtZW50YXRpb24iLCB7IGJyZWFrOiAiZ3JhcGhpYyIgfSwgW10pOwpkYi5fcXVlcnkoYExFVCBzdHIgPSAnVGVzdFx0d2l0aCBBbl9FTUFJTC1hZGRyZXNzKzEyM0BleGFtcGxlLm9yZ1xu6J206J2244CCXHUyMDI40LHRg9GC0LXRgNCx0YDQvtC0JwogIFJFVFVSTiB7CiAgICAiYWxsIjogVE9LRU5TKHN0ciwgJ3NlZ21lbnRfYWxsJyksCiAgICAiYWxwaGEiOiBUT0tFTlMoc3RyLCAnc2VnbWVudF9hbHBoYScpLAogICAgImdyYXBoaWMiOiBUT0tFTlMoc3RyLCAnc2VnbWVudF9ncmFwaGljJyksCiAgfQpgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGFsbC5uYW1lKTsKfmFuYWx5emVycy5yZW1vdmUoYWxwaGEubmFtZSk7Cn5hbmFseXplcnMucmVtb3ZlKGdyYXBoaWMubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhbGwgPSBhbmFseXplcnMuc2F2ZShcInNlZ21lbnRfYWxsXCIsIFwic2VnbWVudGF0aW9uXCIsIHsgYnJlYWs6IFwiYWxsXCIgfSwgW10pO1xudmFyIGFscGhhID0gYW5hbHl6ZXJzLnNhdmUoXCJzZWdtZW50X2FscGhhXCIsIFwic2VnbWVudGF0aW9uXCIsIHsgYnJlYWs6IFwiYWxwaGFcIiB9LCBbXSk7XG52YXIgZ3JhcGhpYyA9IGFuYWx5emVycy5zYXZlKFwic2VnbWVudF9ncmFwaGljXCIsIFwic2VnbWVudGF0aW9uXCIsIHsgYnJlYWs6IFwiZ3JhcGhpY1wiIH0sIFtdKTtcbmRiLl9xdWVyeShgTEVUIHN0ciA9ICdUZXN0XFx0d2l0aCBBbl9FTUFJTC1hZGRyZXNzKzEyM0BleGFtcGxlLm9yZ1xcbuidtOidtuOAglxcdTIwMjjQsdGD0YLQtdGA0LHRgNC+0LQnXG4gIFJFVFVSTiB7XG4gICAgXCJhbGxcIjogVE9LRU5TKHN0ciwgJ3NlZ21lbnRfYWxsJyksXG4gICAgXCJhbHBoYVwiOiBUT0tFTlMoc3RyLCAnc2VnbWVudF9hbHBoYScpLFxuICAgIFwiZ3JhcGhpY1wiOiBUT0tFTlMoc3RyLCAnc2VnbWVudF9ncmFwaGljJyksXG4gIH1cbmApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiYWxsXCIgOiBbIFxuICAgICAgXCJ0ZXN0XCIsIFxuICAgICAgXCJcXHRcIiwgXG4gICAgICBcIndpdGhcIiwgXG4gICAgICBcIiBcIiwgXG4gICAgICBcImFuX2VtYWlsXCIsIFxuICAgICAgXCItXCIsIFxuICAgICAgXCJhZGRyZXNzXCIsIFxuICAgICAgXCIrXCIsIFxuICAgICAgXCIxMjNcIiwgXG4gICAgICBcIkBcIiwgXG4gICAgICBcImV4YW1wbGUub3JnXCIsIFxuICAgICAgXCJcXG5cIiwgXG4gICAgICBcIuidtFwiLCBcbiAgICAgIFwi6J22XCIsIFxuICAgICAgXCLjgIJcIiwgXG4gICAgICBcIlx1MjAyOFwiLCBcbiAgICAgIFwi0LHRg9GC0LXRgNCx0YDQvtC0XCIgXG4gICAgXSwgXG4gICAgXCJhbHBoYVwiIDogWyBcbiAgICAgIFwidGVzdFwiLCBcbiAgICAgIFwid2l0aFwiLCBcbiAgICAgIFwiYW5fZW1haWxcIiwgXG4gICAgICBcImFkZHJlc3NcIiwgXG4gICAgICBcIjEyM1wiLCBcbiAgICAgIFwiZXhhbXBsZS5vcmdcIiwgXG4gICAgICBcIuidtFwiLCBcbiAgICAgIFwi6J22XCIsIFxuICAgICAgXCLQsdGD0YLQtdGA0LHRgNC+0LRcIiBcbiAgICBdLCBcbiAgICBcImdyYXBoaWNcIiA6IFsgXG4gICAgICBcInRlc3RcIiwgXG4gICAgICBcIndpdGhcIiwgXG4gICAgICBcImFuX2VtYWlsXCIsIFxuICAgICAgXCItXCIsIFxuICAgICAgXCJhZGRyZXNzXCIsIFxuICAgICAgXCIrXCIsIFxuICAgICAgXCIxMjNcIiwgXG4gICAgICBcIkBcIiwgXG4gICAgICBcImV4YW1wbGUub3JnXCIsIFxuICAgICAgXCJcXG5cIiwgXG4gICAgICBcIuidtFwiLCBcbiAgICAgIFwi6J22XCIsIFxuICAgICAgXCLjgIJcIiwgXG4gICAgICBcItCx0YPRgtC10YDQsdGA0L7QtFwiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyU2VnbWVudGF0aW9uQnJlYWsiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerStem_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyU3RlbQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoInN0ZW1fZW4iLCAic3RlbSIsIHsKICBsb2NhbGU6ICJlbiIKfSwgW10pOwpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoImRhdGFiYXNlcyIsICJzdGVtX2VuIilgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJzdGVtX2VuXCIsIFwic3RlbVwiLCB7XG4gIGxvY2FsZTogXCJlblwiXG59LCBbXSk7XG5kYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoXCJkYXRhYmFzZXNcIiwgXCJzdGVtX2VuXCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJkYXRhYmFzXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyU3RlbSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerStopwords_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyU3RvcHdvcmRzCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGFuYWx5emVycyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9hbmFseXplcnMiKTsKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgic3RvcCIsICJzdG9wd29yZHMiLCB7CiAgc3RvcHdvcmRzOiBbIjYxNmU2NCIsIjc0Njg2NSJdLCBoZXg6IHRydWUKfSwgW10pOwpkYi5fcXVlcnkoIlJFVFVSTiBGTEFUVEVOKFRPS0VOUyhTUExJVCgndGhlIGZveCBhbmQgdGhlIGRvZyBhbmQgYSB0aGVhdGVyJywgJyAnKSwgJ3N0b3AnKSkiKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJzdG9wXCIsIFwic3RvcHdvcmRzXCIsIHtcbiAgc3RvcHdvcmRzOiBbXCI2MTZlNjRcIixcIjc0Njg2NVwiXSwgaGV4OiB0cnVlXG59LCBbXSk7XG5kYi5fcXVlcnkoXCJSRVRVUk4gRkxBVFRFTihUT0tFTlMoU1BMSVQoJ3RoZSBmb3ggYW5kIHRoZSBkb2cgYW5kIGEgdGhlYXRlcicsICcgJyksICdzdG9wJykpXCIpLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiZm94XCIsIFxuICAgIFwiZG9nXCIsIFxuICAgIFwiYVwiLCBcbiAgICBcInRoZWF0ZXJcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJTdG9wd29yZHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerTextEdgeNgram_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyVGV4dEVkZ2VOZ3JhbQpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpCnZhciBhID0gYW5hbHl6ZXJzLnNhdmUoInRleHRfZWRnZV9uZ3JhbXMiLCAidGV4dCIsIHsKICBlZGdlTmdyYW06IHsgbWluOiAzLCBtYXg6IDgsIHByZXNlcnZlT3JpZ2luYWw6IHRydWUgfSwKICBsb2NhbGU6ICJlbiIsCiAgY2FzZTogImxvd2VyIiwKICBhY2NlbnQ6IGZhbHNlLAogIHN0ZW1taW5nOiBmYWxzZSwKICBzdG9wd29yZHM6IFsgInRoZSIgXQp9LCBbXSk7CmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUygKICAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBkb2dXaXRoQVZlcnlMb25nTmFtZSIsCiAgInRleHRfZWRnZV9uZ3JhbXMiCilgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhID0gYW5hbHl6ZXJzLnNhdmUoXCJ0ZXh0X2VkZ2VfbmdyYW1zXCIsIFwidGV4dFwiLCB7XG4gIGVkZ2VOZ3JhbTogeyBtaW46IDMsIG1heDogOCwgcHJlc2VydmVPcmlnaW5hbDogdHJ1ZSB9LFxuICBsb2NhbGU6IFwiZW5cIixcbiAgY2FzZTogXCJsb3dlclwiLFxuICBhY2NlbnQ6IGZhbHNlLFxuICBzdGVtbWluZzogZmFsc2UsXG4gIHN0b3B3b3JkczogWyBcInRoZVwiIF1cbn0sIFtdKTtcbmRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUyhcbiAgXCJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGRvZ1dpdGhBVmVyeUxvbmdOYW1lXCIsXG4gIFwidGV4dF9lZGdlX25ncmFtc1wiXG4pYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJxdWlcIiwgXG4gICAgXCJxdWljXCIsIFxuICAgIFwicXVpY2tcIiwgXG4gICAgXCJicm9cIiwgXG4gICAgXCJicm93XCIsIFxuICAgIFwiYnJvd25cIiwgXG4gICAgXCJmb3hcIiwgXG4gICAgXCJqdW1cIiwgXG4gICAgXCJqdW1wXCIsIFxuICAgIFwianVtcHNcIiwgXG4gICAgXCJvdmVcIiwgXG4gICAgXCJvdmVyXCIsIFxuICAgIFwiZG9nXCIsIFxuICAgIFwiZG9nd1wiLCBcbiAgICBcImRvZ3dpXCIsIFxuICAgIFwiZG9nd2l0XCIsIFxuICAgIFwiZG9nd2l0aFwiLCBcbiAgICBcImRvZ3dpdGhhXCIsIFxuICAgIFwiZG9nd2l0aGF2ZXJ5bG9uZ25hbWVcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJUZXh0RWRnZU5ncmFtIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "analyzerTextNoStem_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyVGV4dE5vU3RlbQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIikKdmFyIGEgPSBhbmFseXplcnMuc2F2ZSgidGV4dF9lbl9ub3N0ZW0iLCAidGV4dCIsIHsKICBsb2NhbGU6ICJlbiIsCiAgY2FzZTogImxvd2VyIiwKICBhY2NlbnQ6IGZhbHNlLAogIHN0ZW1taW5nOiBmYWxzZSwKICBzdG9wd29yZHM6IFtdCn0sIFtdKQpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoIkNyYXp5IGZhc3QgTm9TUUwtZGF0YWJhc2UhIiwgInRleHRfZW5fbm9zdGVtIilgKS50b0FycmF5KCk7Cn5hbmFseXplcnMucmVtb3ZlKGEubmFtZSk7", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKVxudmFyIGEgPSBhbmFseXplcnMuc2F2ZShcInRleHRfZW5fbm9zdGVtXCIsIFwidGV4dFwiLCB7XG4gIGxvY2FsZTogXCJlblwiLFxuICBjYXNlOiBcImxvd2VyXCIsXG4gIGFjY2VudDogZmFsc2UsXG4gIHN0ZW1taW5nOiBmYWxzZSxcbiAgc3RvcHdvcmRzOiBbXVxufSwgW10pXG5kYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoXCJDcmF6eSBmYXN0IE5vU1FMLWRhdGFiYXNlIVwiLCBcInRleHRfZW5fbm9zdGVtXCIpYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJjcmF6eVwiLCBcbiAgICBcImZhc3RcIiwgXG4gICAgXCJub3NxbFwiLCBcbiAgICBcImRhdGFiYXNlXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyVGV4dE5vU3RlbSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerTextOffset_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyVGV4dE9mZnNldApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy5zYXZlKCJ0ZXh0X2VuX29mZnNldCIsICJ0ZXh0IiwgeyBsb2NhbGU6ICJlbiIsIHN0b3B3b3JkczogW10gfSwgWyJmcmVxdWVuY3kiLCAicG9zaXRpb24iLCAib2Zmc2V0Il0pOwp+YW5hbHl6ZXJzLnJlbW92ZSgidGV4dF9lbl9vZmZzZXQiKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5zYXZlKFwidGV4dF9lbl9vZmZzZXRcIiwgXCJ0ZXh0XCIsIHsgbG9jYWxlOiBcImVuXCIsIHN0b3B3b3JkczogW10gfSwgW1wiZnJlcXVlbmN5XCIsIFwicG9zaXRpb25cIiwgXCJvZmZzZXRcIl0pOyIsIm91dHB1dCI6InsgXG4gIFwibmFtZVwiIDogXCJfc3lzdGVtOjp0ZXh0X2VuX29mZnNldFwiLCBcbiAgXCJ0eXBlXCIgOiBcInRleHRcIiwgXG4gIFwicHJvcGVydGllc1wiIDogeyBcbiAgICBcImxvY2FsZVwiIDogXCJlblwiLCBcbiAgICBcImNhc2VcIiA6IFwibG93ZXJcIiwgXG4gICAgXCJzdG9wd29yZHNcIiA6IFsgXSwgXG4gICAgXCJhY2NlbnRcIiA6IGZhbHNlLCBcbiAgICBcInN0ZW1taW5nXCIgOiB0cnVlIFxuICB9LCBcbiAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICBcInBvc2l0aW9uXCIsIFxuICAgIFwib2Zmc2V0XCIgXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyVGV4dE9mZnNldCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "analyzerTextStem_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyVGV4dFN0ZW0KZGVzY3JpcHRpb246ICcnCi0tLQpkYi5fcXVlcnkoYFJFVFVSTiBUT0tFTlMoIkNyYXp5IGZhc3QgTm9TUUwtZGF0YWJhc2UhIiwgInRleHRfZW4iKWApLnRvQXJyYXkoKTs=", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgUkVUVVJOIFRPS0VOUyhcIkNyYXp5IGZhc3QgTm9TUUwtZGF0YWJhc2UhXCIsIFwidGV4dF9lblwiKWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiY3JhemlcIiwgXG4gICAgXCJmYXN0XCIsIFxuICAgIFwibm9zcWxcIiwgXG4gICAgXCJkYXRhYmFzXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFuYWx5emVyVGV4dFN0ZW0iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "analyzerType_single": { + "request": "LS0tCm5hbWU6IGFuYWx5emVyVHlwZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy5hbmFseXplcigidGV4dF9lbiIpLnR5cGUoKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5hbmFseXplcihcInRleHRfZW5cIikudHlwZSgpOyIsIm91dHB1dCI6InRleHQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYW5hbHl6ZXJUeXBlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayAppend_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5QXBwZW5kXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQVBQRU5EKFsgMSwgMiwgMyBdLCBbIDUsIDYsIDkgXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBBUFBFTkQoWyAxLCAyLCAzIF0sIFsgNSwgNiwgOSBdKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMywgXG4gICAgNSwgXG4gICAgNiwgXG4gICAgOSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlBcHBlbmRfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayAppend_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5QXBwZW5kXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQVBQRU5EKFsgMSwgMiwgMyBdLCBbIDMsIDQsIDUsIDIsIDkgXSwgdHJ1ZSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBBUFBFTkQoWyAxLCAyLCAzIF0sIFsgMywgNCwgNSwgMiwgOSBdLCB0cnVlKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMywgXG4gICAgNCwgXG4gICAgNSwgXG4gICAgOSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlBcHBlbmRfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayCountDistinct_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5Q291bnREaXN0aW5jdF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIENPVU5UX0RJU1RJTkNUKFsgMSwgMiwgMyBdKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT1VOVF9ESVNUSU5DVChbIDEsIDIsIDMgXSkiLCJvdXRwdXQiOiJbIFxuICAzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUNvdW50RGlzdGluY3RfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayCountDistinct_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5Q291bnREaXN0aW5jdF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIENPVU5UX0RJU1RJTkNUKFsgInllcyIsICJubyIsICJ5ZXMiLCAic2F1cm9uIiwgIm5vIiwgInllcyIgXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT1VOVF9ESVNUSU5DVChbIFwieWVzXCIsIFwibm9cIiwgXCJ5ZXNcIiwgXCJzYXVyb25cIiwgXCJub1wiLCBcInllc1wiIF0pIiwib3V0cHV0IjoiWyBcbiAgMyBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlDb3VudERpc3RpbmN0XzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayFirst_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5Rmlyc3RfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBGSVJTVChbIDEsIDIsIDMgXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSVJTVChbIDEsIDIsIDMgXSkiLCJvdXRwdXQiOiJbIFxuICAxIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUZpcnN0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayFirst_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5Rmlyc3RfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBGSVJTVChbXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSVJTVChbXSkiLCJvdXRwdXQiOiJbIFxuICBudWxsIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUZpcnN0XzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayFlatten_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5RmxhdHRlbl8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEZMQVRURU4oIFsgMSwgMiwgWyAzLCA0IF0sIDUsIFsgNiwgNyBdLCBbIDgsIFsgOSwgMTAgXSBdIF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGTEFUVEVOKCBbIDEsIDIsIFsgMywgNCBdLCA1LCBbIDYsIDcgXSwgWyA4LCBbIDksIDEwIF0gXSBdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMsIFxuICAgIDQsIFxuICAgIDUsIFxuICAgIDYsIFxuICAgIDcsIFxuICAgIDgsIFxuICAgIFsgXG4gICAgICA5LCBcbiAgICAgIDEwIFxuICAgIF0gXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5RmxhdHRlbl8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayFlatten_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5RmxhdHRlbl8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEZMQVRURU4oIFsgMSwgMiwgWyAzLCA0IF0sIDUsIFsgNiwgNyBdLCBbIDgsIFsgOSwgMTAgXSBdIF0sIDIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGTEFUVEVOKCBbIDEsIDIsIFsgMywgNCBdLCA1LCBbIDYsIDcgXSwgWyA4LCBbIDksIDEwIF0gXSBdLCAyICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMsIFxuICAgIDQsIFxuICAgIDUsIFxuICAgIDYsIFxuICAgIDcsIFxuICAgIDgsIFxuICAgIDksIFxuICAgIDEwIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUZsYXR0ZW5fMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayInterleave_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SW50ZXJsZWF2ZV8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElOVEVSTEVBVkUoIFsxLCAxLCAxXSwgWzIsIDIsIDJdLCBbMywgMywgM10gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJTlRFUkxFQVZFKCBbMSwgMSwgMV0sIFsyLCAyLCAyXSwgWzMsIDMsIDNdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMsIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMsIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5SW50ZXJsZWF2ZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayInterleave_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SW50ZXJsZWF2ZV8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElOVEVSTEVBVkUoIFsgMSBdLCBbMiwgMl0sIFszLCAzLCAzXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJTlRFUkxFQVZFKCBbIDEgXSwgWzIsIDJdLCBbMywgMywgM10gKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMywgXG4gICAgMiwgXG4gICAgMywgXG4gICAgMyBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlJbnRlcmxlYXZlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayInterleave_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SW50ZXJsZWF2ZV8zCmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBrU2hvcnRlc3RQYXRoc0dyYXBoCi0tLQpGT1IgdiwgZSwgcCBJTiAxLi4zIE9VVEJPVU5EICdwbGFjZXMvVG9yb250bycgR1JBUEggJ2tTaG9ydGVzdFBhdGhzR3JhcGgnCiAgUkVUVVJOIElOVEVSTEVBVkUocC52ZXJ0aWNlc1sqXS5faWQsIHAuZWRnZXNbKl0uX2lkKQ==", + "response": "eyJpbnB1dCI6IkZPUiB2LCBlLCBwIElOIDEuLjMgT1VUQk9VTkQgJ3BsYWNlcy9Ub3JvbnRvJyBHUkFQSCAna1Nob3J0ZXN0UGF0aHNHcmFwaCdcbiAgUkVUVVJOIElOVEVSTEVBVkUocC52ZXJ0aWNlc1sqXS5faWQsIHAuZWRnZXNbKl0uX2lkKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJwbGFjZXMvVG9yb250b1wiLCBcbiAgICBcImNvbm5lY3Rpb25zLzYxNDk3XCIsIFxuICAgIFwicGxhY2VzL1dpbm5pcGVnXCIgXG4gIF0sIFxuICBbIFxuICAgIFwicGxhY2VzL1Rvcm9udG9cIiwgXG4gICAgXCJjb25uZWN0aW9ucy82MTQ5N1wiLCBcbiAgICBcInBsYWNlcy9XaW5uaXBlZ1wiLCBcbiAgICBcImNvbm5lY3Rpb25zLzYxNTAxXCIsIFxuICAgIFwicGxhY2VzL1Nhc2thdG9vblwiIFxuICBdLCBcbiAgWyBcbiAgICBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiY29ubmVjdGlvbnMvNjE0OTdcIiwgXG4gICAgXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJjb25uZWN0aW9ucy82MTUwMVwiLCBcbiAgICBcInBsYWNlcy9TYXNrYXRvb25cIiwgXG4gICAgXCJjb25uZWN0aW9ucy82MTUwNVwiLCBcbiAgICBcInBsYWNlcy9FZG1vbnRvblwiIFxuICBdLCBcbiAgWyBcbiAgICBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiY29ubmVjdGlvbnMvNjE0OTdcIiwgXG4gICAgXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJjb25uZWN0aW9ucy82MTUwMVwiLCBcbiAgICBcInBsYWNlcy9TYXNrYXRvb25cIiwgXG4gICAgXCJjb25uZWN0aW9ucy82MTUwM1wiLCBcbiAgICBcInBsYWNlcy9XaW5uaXBlZ1wiIFxuICBdLCBcbiAgWyBcbiAgICBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiY29ubmVjdGlvbnMvNjE0OTdcIiwgXG4gICAgXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJjb25uZWN0aW9ucy82MTQ5OVwiLCBcbiAgICBcInBsYWNlcy9Ub3JvbnRvXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5SW50ZXJsZWF2ZV8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImRhdGFzZXQiOiJrU2hvcnRlc3RQYXRoc0dyYXBoIn19Cg==" + }, + "aqlArrayIntersection_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SW50ZXJzZWN0aW9uXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSU5URVJTRUNUSU9OKCBbMSwyLDMsNCw1XSwgWzIsMyw0LDUsNl0sIFszLDQsNSw2LDddICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJTlRFUlNFQ1RJT04oIFsxLDIsMyw0LDVdLCBbMiwzLDQsNSw2XSwgWzMsNCw1LDYsN10gKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgNSwgXG4gICAgNCwgXG4gICAgMyBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlJbnRlcnNlY3Rpb25fMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayIntersection_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SW50ZXJzZWN0aW9uXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSU5URVJTRUNUSU9OKCBbMiw0LDZdLCBbOCwxMCwxMl0sIFsxNCwxNiwxOF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJTlRFUlNFQ1RJT04oIFsyLDQsNl0sIFs4LDEwLDEyXSwgWzE0LDE2LDE4XSApIiwib3V0cHV0IjoiWyBcbiAgWyBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUludGVyc2VjdGlvbl8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayJaccard_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SmFjY2FyZF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpBQ0NBUkQoIFsxLDIsMyw0XSwgWzMsNCw1LDZdICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKQUNDQVJEKCBbMSwyLDMsNF0sIFszLDQsNSw2XSApIiwib3V0cHV0IjoiWyBcbiAgMC4zMzMzMzMzMzMzMzMzMzMzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUphY2NhcmRfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayJaccard_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SmFjY2FyZF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpBQ0NBUkQoIFsxLDEsMiwyLDIsM10sIFsyLDIsMyw0XSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKQUNDQVJEKCBbMSwxLDIsMiwyLDNdLCBbMiwyLDMsNF0gKSIsIm91dHB1dCI6IlsgXG4gIDAuNSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlKYWNjYXJkXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayJaccard_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SmFjY2FyZF8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpBQ0NBUkQoIFsxLDIsM10sIFtdICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKQUNDQVJEKCBbMSwyLDNdLCBbXSApIiwib3V0cHV0IjoiWyBcbiAgMCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlKYWNjYXJkXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayJaccard_4_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5SmFjY2FyZF80CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpBQ0NBUkQoIFtdLCBbXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKQUNDQVJEKCBbXSwgW10gKSIsIm91dHB1dCI6IlsgXG4gIDEgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5SmFjY2FyZF80IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayLast_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TGFzdF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIExBU1QoIFsxLDIsMyw0LDVdICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMQVNUKCBbMSwyLDMsNCw1XSApIiwib3V0cHV0IjoiWyBcbiAgNSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlMYXN0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayLength_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TGVuZ3RoXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTEVOR1RIKCAi8J+lkSIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoIFwi8J+lkVwiICkiLCJvdXRwdXQiOiJbIFxuICAxIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUxlbmd0aF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayLength_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TGVuZ3RoXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTEVOR1RIKCAxMjM0ICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoIDEyMzQgKSIsIm91dHB1dCI6IlsgXG4gIDQgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5TGVuZ3RoXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayLength_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TGVuZ3RoXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTEVOR1RIKCBbMSwyLDMsNCw1LDYsN10gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoIFsxLDIsMyw0LDUsNiw3XSApIiwib3V0cHV0IjoiWyBcbiAgNyBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlMZW5ndGhfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayLength_4_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TGVuZ3RoXzQKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTEVOR1RIKCBmYWxzZSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoIGZhbHNlICkiLCJvdXRwdXQiOiJbIFxuICAwIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheUxlbmd0aF80IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayLength_5_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TGVuZ3RoXzUKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTEVOR1RIKCB7YToxLCBiOjIsIGM6MywgZDo0LCBlOntmOjUsZzo2fX0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoIHthOjEsIGI6MiwgYzozLCBkOjQsIGU6e2Y6NSxnOjZ9fSApIiwib3V0cHV0IjoiWyBcbiAgNSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlMZW5ndGhfNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayMinus_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TWludXNfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBNSU5VUyggWzEsMiwzLDRdLCBbMyw0LDUsNl0sIFs1LDYsNyw4XSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNSU5VUyggWzEsMiwzLDRdLCBbMyw0LDUsNl0sIFs1LDYsNyw4XSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICAyLCBcbiAgICAxIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheU1pbnVzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayNth_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TnRoXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTlRIKCBbICJmb28iLCAiYmFyIiwgImJheiIgXSwgMiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBOVEgoIFsgXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIiBdLCAyICkiLCJvdXRwdXQiOiJbIFxuICBcImJhelwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheU50aF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayNth_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TnRoXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTlRIKCBbICJmb28iLCAiYmFyIiwgImJheiIgXSwgMyAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBOVEgoIFsgXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIiBdLCAzICkiLCJvdXRwdXQiOiJbIFxuICBudWxsIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheU50aF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayNth_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5TnRoXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTlRIKCBbICJmb28iLCAiYmFyIiwgImJheiIgXSwgLTEgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBOVEgoIFsgXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIiBdLCAtMSApIiwib3V0cHV0IjoiWyBcbiAgbnVsbCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlOdGhfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayOutersection_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5T3V0ZXJzZWN0aW9uXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gT1VURVJTRUNUSU9OKCBbIDEsIDIsIDMgXSwgWyAyLCAzLCA0IF0sIFsgMywgNCwgNSBdICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBPVVRFUlNFQ1RJT04oIFsgMSwgMiwgMyBdLCBbIDIsIDMsIDQgXSwgWyAzLCA0LCA1IF0gKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgNSwgXG4gICAgMSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlPdXRlcnNlY3Rpb25fMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayPop_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UG9wXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUE9QKCBbIDEsIDIsIDMsIDQgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQT1AoIFsgMSwgMiwgMywgNCBdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5UG9wXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayPop_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UG9wXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUE9QKCBbIDEgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQT1AoIFsgMSBdICkiLCJvdXRwdXQiOiJbIFxuICBbIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5UG9wXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayPosition_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UG9zaXRpb25fMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBQT1NJVElPTiggWzIsNCw2LDhdLCA0ICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQT1NJVElPTiggWzIsNCw2LDhdLCA0ICkiLCJvdXRwdXQiOiJbIFxuICB0cnVlIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVBvc2l0aW9uXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayPosition_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UG9zaXRpb25fMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBQT1NJVElPTiggWzIsNCw2LDhdLCA0LCB0cnVlICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQT1NJVElPTiggWzIsNCw2LDhdLCA0LCB0cnVlICkiLCJvdXRwdXQiOiJbIFxuICAxIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVBvc2l0aW9uXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayPosition_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UG9zaXRpb25fMwpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBhcnIgPSBbIHsgdmFsdWU6ICJmb28iIH0sIHsgdmFsdWU6ICJiYXIiIH0sIHsgdmFsdWU6ICJiYXoiIH0sIHsgdmFsdWU6ICJiYXkifSBdClJFVFVSTiBQT1NJVElPTihhcnJbKl0udmFsdWUsICJiYXoiLCB0cnVlKQ==", + "response": "eyJpbnB1dCI6IkxFVCBhcnIgPSBbIHsgdmFsdWU6IFwiZm9vXCIgfSwgeyB2YWx1ZTogXCJiYXJcIiB9LCB7IHZhbHVlOiBcImJhelwiIH0sIHsgdmFsdWU6IFwiYmF5XCJ9IF1cblJFVFVSTiBQT1NJVElPTihhcnJbKl0udmFsdWUsIFwiYmF6XCIsIHRydWUpIiwib3V0cHV0IjoiWyBcbiAgMiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlQb3NpdGlvbl8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayPush_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UHVzaF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFBVU0goWyAxLCAyLCAzIF0sIDQp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQVVNIKFsgMSwgMiwgMyBdLCA0KSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMywgXG4gICAgNCBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlQdXNoXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayPush_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UHVzaF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFBVU0goWyAxLCAyLCAyLCAzIF0sIDIsIHRydWUp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQVVNIKFsgMSwgMiwgMiwgMyBdLCAyLCB0cnVlKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMiwgXG4gICAgMyBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlQdXNoXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayRemoveNth_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVtb3ZlTnRoXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUkVNT1ZFX05USCggWyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiBdLCAxICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRU1PVkVfTlRIKCBbIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiBdLCAxICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiYVwiLCBcbiAgICBcImNcIiwgXG4gICAgXCJkXCIsIFxuICAgIFwiZVwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVJlbW92ZU50aF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayRemoveNth_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVtb3ZlTnRoXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUkVNT1ZFX05USCggWyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiBdLCAtMiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRU1PVkVfTlRIKCBbIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiBdLCAtMiApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImFcIiwgXG4gICAgXCJiXCIsIFxuICAgIFwiY1wiLCBcbiAgICBcImVcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlSZW1vdmVOdGhfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayRemoveValue_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVtb3ZlVmFsdWVfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRU1PVkVfVkFMVUUoIFsgImEiLCAiYiIsICJiIiwgImEiLCAiYyIgXSwgImEiICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRU1PVkVfVkFMVUUoIFsgXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJhXCIsIFwiY1wiIF0sIFwiYVwiICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiYlwiLCBcbiAgICBcImJcIiwgXG4gICAgXCJjXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5UmVtb3ZlVmFsdWVfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayRemoveValue_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVtb3ZlVmFsdWVfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRU1PVkVfVkFMVUUoIFsgImEiLCAiYiIsICJiIiwgImEiLCAiYyIgXSwgImEiLCAxICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRU1PVkVfVkFMVUUoIFsgXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJhXCIsIFwiY1wiIF0sIFwiYVwiLCAxICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiYlwiLCBcbiAgICBcImJcIiwgXG4gICAgXCJhXCIsIFxuICAgIFwiY1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVJlbW92ZVZhbHVlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayRemoveValues_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVtb3ZlVmFsdWVzXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUkVNT1ZFX1ZBTFVFUyggWyAiYSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIgXSwgWyAiYSIsICJmIiwgImQiIF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRU1PVkVfVkFMVUVTKCBbIFwiYVwiLCBcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCIsIFwiZlwiIF0sIFsgXCJhXCIsIFwiZlwiLCBcImRcIiBdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiYlwiLCBcbiAgICBcImNcIiwgXG4gICAgXCJlXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5UmVtb3ZlVmFsdWVzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayReplaceNth_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVwbGFjZU50aF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFUExBQ0VfTlRIKCBbICJhIiwgImIiLCAiYyIgXSwgMSAsICJ6Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVBMQUNFX05USCggWyBcImFcIiwgXCJiXCIsIFwiY1wiIF0sIDEgLCBcInpcIikiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiYVwiLCBcbiAgICBcInpcIiwgXG4gICAgXCJjXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5UmVwbGFjZU50aF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayReplaceNth_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVwbGFjZU50aF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFUExBQ0VfTlRIKCBbICJhIiwgImIiLCAiYyIgXSwgMyAsICJ6Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVBMQUNFX05USCggWyBcImFcIiwgXCJiXCIsIFwiY1wiIF0sIDMgLCBcInpcIikiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiYVwiLCBcbiAgICBcImJcIiwgXG4gICAgXCJjXCIsIFxuICAgIFwielwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVJlcGxhY2VOdGhfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayReplaceNth_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVwbGFjZU50aF8zCmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3F1ZXJ5KCdSRVRVUk4gUkVQTEFDRV9OVEgoIFsgImEiLCAiYiIsICJjIiBdLCA2ICwgInoiKScpOyAvLyB4cEVycm9yKEVSUk9SX1FVRVJZX0ZVTkNUSU9OX0FSR1VNRU5UX1RZUEVfTUlTTUFUQ0gp", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeSgnUkVUVVJOIFJFUExBQ0VfTlRIKCBbIFwiYVwiLCBcImJcIiwgXCJjXCIgXSwgNiAsIFwielwiKScpOyAiLCJvdXRwdXQiOiJbQXJhbmdvRXJyb3IgMTU0MjogQVFMOiBpbnZhbGlkIGFyZ3VtZW50IHR5cGUgaW4gY2FsbCB0byBmdW5jdGlvbiAnUkVQTEFDRV9OVEgoKScgKHdoaWxlIG9wdGltaXppbmcgYXN0KV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlSZXBsYWNlTnRoXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayReplaceNth_4_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVwbGFjZU50aF80CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFUExBQ0VfTlRIKCBbICJhIiwgImIiLCAiYyIgXSwgNiwgInoiLCAieSIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVBMQUNFX05USCggWyBcImFcIiwgXCJiXCIsIFwiY1wiIF0sIDYsIFwielwiLCBcInlcIiApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImFcIiwgXG4gICAgXCJiXCIsIFxuICAgIFwiY1wiLCBcbiAgICBcInlcIiwgXG4gICAgXCJ5XCIsIFxuICAgIFwieVwiLCBcbiAgICBcInpcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlSZXBsYWNlTnRoXzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayReplaceNth_5_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVwbGFjZU50aF81CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFUExBQ0VfTlRIKCBbICJhIiwgImIiLCAiYyIgXSwgLTEsICJ6IiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVBMQUNFX05USCggWyBcImFcIiwgXCJiXCIsIFwiY1wiIF0sIC0xLCBcInpcIiApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImFcIiwgXG4gICAgXCJiXCIsIFxuICAgIFwielwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVJlcGxhY2VOdGhfNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayReplaceNth_6_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmVwbGFjZU50aF82CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFUExBQ0VfTlRIKCBbICJhIiwgImIiLCAiYyIgXSwgLTksICJ6IiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVBMQUNFX05USCggWyBcImFcIiwgXCJiXCIsIFwiY1wiIF0sIC05LCBcInpcIiApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcInpcIiwgXG4gICAgXCJiXCIsIFxuICAgIFwiY1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVJlcGxhY2VOdGhfNiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayReverse_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5UmV2ZXJzZV8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFVkVSU0UgKCBbMiw0LDYsOCwxMF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVZFUlNFICggWzIsNCw2LDgsMTBdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEwLCBcbiAgICA4LCBcbiAgICA2LCBcbiAgICA0LCBcbiAgICAyIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVJldmVyc2VfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayShift_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2hpZnRfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTSElGVCggWyAxLCAyLCAzLCA0IF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTSElGVCggWyAxLCAyLCAzLCA0IF0gKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMiwgXG4gICAgMywgXG4gICAgNCBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlTaGlmdF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayShift_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2hpZnRfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTSElGVCggWyAxIF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTSElGVCggWyAxIF0gKSIsIm91dHB1dCI6IlsgXG4gIFsgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlTaGlmdF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArraySlice_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2xpY2VfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDAsIDEgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDAsIDEgKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlTbGljZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArraySlice_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2xpY2VfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDEsIDIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDEsIDIgKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMiwgXG4gICAgMyBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlTbGljZV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArraySlice_3_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2xpY2VfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDMgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDMgKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgNCwgXG4gICAgNSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlTbGljZV8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArraySlice_4_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2xpY2VfNApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDEsIC0xICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDEsIC0xICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDIsIFxuICAgIDMsIFxuICAgIDQgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5U2xpY2VfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArraySlice_5_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2xpY2VfNQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDAsIC0yICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIDAsIC0yICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5U2xpY2VfNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArraySlice_6_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U2xpY2VfNgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIC0zLCAyICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTTElDRSggWyAxLCAyLCAzLCA0LCA1IF0sIC0zLCAyICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDMsIFxuICAgIDQgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5U2xpY2VfNiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArraySortedUnique_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U29ydGVkVW5pcXVlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU09SVEVEX1VOSVFVRSggWyA4LDQsMiwxMCw2LDIsOCw2LDQgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTT1JURURfVU5JUVVFKCBbIDgsNCwyLDEwLDYsMiw4LDYsNCBdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDIsIFxuICAgIDQsIFxuICAgIDYsIFxuICAgIDgsIFxuICAgIDEwIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVNvcnRlZFVuaXF1ZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArraySorted_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5U29ydGVkXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU09SVEVEKCBbIDgsNCwyLDEwLDYgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTT1JURUQoIFsgOCw0LDIsMTAsNiBdICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDIsIFxuICAgIDQsIFxuICAgIDYsIFxuICAgIDgsIFxuICAgIDEwIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVNvcnRlZF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayUnionDistinct_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5VW5pb25EaXN0aW5jdF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFVOSU9OX0RJU1RJTkNUKAogICAgWyAxLCAyLCAzIF0sCiAgICBbIDEsIDIgXQop", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVTklPTl9ESVNUSU5DVChcbiAgICBbIDEsIDIsIDMgXSxcbiAgICBbIDEsIDIgXVxuKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMyBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlVbmlvbkRpc3RpbmN0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlArrayUnion_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5VW5pb25fMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBVTklPTigKICAgIFsgMSwgMiwgMyBdLAogICAgWyAxLCAyIF0KKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVTklPTihcbiAgICBbIDEsIDIsIDMgXSxcbiAgICBbIDEsIDIgXVxuKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgMSwgXG4gICAgMiwgXG4gICAgMywgXG4gICAgMSwgXG4gICAgMiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXJyYXlVbmlvbl8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayUnion_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5VW5pb25fMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBVTklRVUUoCiAgICBVTklPTigKICAgICAgICBbIDEsIDIsIDMgXSwKICAgICAgICBbIDEsIDIgXQogICAgKQop", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVTklRVUUoXG4gICAgVU5JT04oXG4gICAgICAgIFsgMSwgMiwgMyBdLFxuICAgICAgICBbIDEsIDIgXVxuICAgIClcbikiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEFycmF5VW5pb25fMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayUnique_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5VW5pcXVlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gVU5JUVVFKCBbIDEsMiwyLDMsMywzLDQsNCw0LDQsNSw1LDUsNSw1IF0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVTklRVUUoIFsgMSwyLDIsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDUgXSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICAxLCBcbiAgICAyLCBcbiAgICAzLCBcbiAgICA0LCBcbiAgICA1IFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVVuaXF1ZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlArrayUnshift_1_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5VW5zaGlmdF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFVOU0hJRlQoIFsgMSwgMiwgMyBdLCA0ICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVTlNISUZUKCBbIDEsIDIsIDMgXSwgNCApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICA0LCBcbiAgICAxLCBcbiAgICAyLCBcbiAgICAzIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVVuc2hpZnRfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlArrayUnshift_2_single": { + "request": "LS0tCm5hbWU6IGFxbEFycmF5VW5zaGlmdF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFVOU0hJRlQoIFsgMSwgMiwgMyBdLCAyLCB0cnVlICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVTlNISUZUKCBbIDEsIDIsIDMgXSwgMiwgdHJ1ZSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICAxLCBcbiAgICAyLCBcbiAgICAzIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxBcnJheVVuc2hpZnRfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlAttributesRemoveInternal_single": { + "request": "LS0tCm5hbWU6IGFxbEF0dHJpYnV0ZXNSZW1vdmVJbnRlcm5hbApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBBVFRSSUJVVEVTKCB7ICJmb28iOiAiYmFyIiwgIl9rZXkiOiAiMTIzIiwgIl9jdXN0b20iOiAieWVzIiB9LCB0cnVlICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBBVFRSSUJVVEVTKCB7IFwiZm9vXCI6IFwiYmFyXCIsIFwiX2tleVwiOiBcIjEyM1wiLCBcIl9jdXN0b21cIjogXCJ5ZXNcIiB9LCB0cnVlICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiZm9vXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEF0dHJpYnV0ZXNSZW1vdmVJbnRlcm5hbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlAttributesSort_single": { + "request": "LS0tCm5hbWU6IGFxbEF0dHJpYnV0ZXNTb3J0CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEFUVFJJQlVURVMoIHsgImZvbyI6ICJiYXIiLCAiX2tleSI6ICIxMjMiLCAiX2N1c3RvbSI6ICJ5ZXMiIH0sIGZhbHNlLCB0cnVlICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBBVFRSSUJVVEVTKCB7IFwiZm9vXCI6IFwiYmFyXCIsIFwiX2tleVwiOiBcIjEyM1wiLCBcIl9jdXN0b21cIjogXCJ5ZXNcIiB9LCBmYWxzZSwgdHJ1ZSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIl9jdXN0b21cIiwgXG4gICAgXCJfa2V5XCIsIFxuICAgIFwiZm9vXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEF0dHJpYnV0ZXNTb3J0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlAttributes_single": { + "request": "LS0tCm5hbWU6IGFxbEF0dHJpYnV0ZXMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQVRUUklCVVRFUyggeyAiZm9vIjogImJhciIsICJfa2V5IjogIjEyMyIsICJfY3VzdG9tIjogInllcyIgfSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBBVFRSSUJVVEVTKCB7IFwiZm9vXCI6IFwiYmFyXCIsIFwiX2tleVwiOiBcIjEyM1wiLCBcIl9jdXN0b21cIjogXCJ5ZXNcIiB9ICkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiX2N1c3RvbVwiLCBcbiAgICBcIl9rZXlcIiwgXG4gICAgXCJmb29cIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQXR0cmlidXRlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlCharLength_1_single": { + "request": "LS0tCm5hbWU6IGFxbENoYXJMZW5ndGhfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDSEFSX0xFTkdUSCgiZm9vIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDSEFSX0xFTkdUSChcImZvb1wiKSIsIm91dHB1dCI6IlsgXG4gIDMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENoYXJMZW5ndGhfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlCharLength_2_single": { + "request": "LS0tCm5hbWU6IGFxbENoYXJMZW5ndGhfMgpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCB2YWx1ZSA9IHtmb286ICJiYXIifQpSRVRVUk4gewogIHN0cjogSlNPTl9TVFJJTkdJRlkodmFsdWUpLAogIGxlbjogQ0hBUl9MRU5HVEgodmFsdWUpCn0=", + "response": "eyJpbnB1dCI6IkxFVCB2YWx1ZSA9IHtmb286IFwiYmFyXCJ9XG5SRVRVUk4ge1xuICBzdHI6IEpTT05fU1RSSU5HSUZZKHZhbHVlKSxcbiAgbGVuOiBDSEFSX0xFTkdUSCh2YWx1ZSlcbn0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwic3RyXCIgOiBcIntcXFwiZm9vXFxcIjpcXFwiYmFyXFxcIn1cIiwgXG4gICAgXCJsZW5cIiA6IDEzIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDaGFyTGVuZ3RoXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatCompoundTypes_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdENvbXBvdW5kVHlwZXNfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVQoWzUsIDZdLCB7Zm9vOiAiYmFyIn0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoWzUsIDZdLCB7Zm9vOiBcImJhclwifSkiLCJvdXRwdXQiOiJbIFxuICBcIls1LDZde1xcXCJmb29cXFwiOlxcXCJiYXJcXFwifVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXRDb21wb3VuZFR5cGVzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatCompoundTypes_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdENvbXBvdW5kVHlwZXNfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVQoIFtbNSwgNl0sIHtmb286ICJiYXIifV0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoIFtbNSwgNl0sIHtmb286IFwiYmFyXCJ9XSApIiwib3V0cHV0IjoiWyBcbiAgXCJbNSw2XXtcXFwiZm9vXFxcIjpcXFwiYmFyXFxcIn1cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQ29uY2F0Q29tcG91bmRUeXBlc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlConcatNumbers_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdE51bWJlcnNfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVQoMSwgMiwgMyk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoMSwgMiwgMykiLCJvdXRwdXQiOiJbIFxuICBcIjEyM1wiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXROdW1iZXJzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatNumbers_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdE51bWJlcnNfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVQoIFsxLCAyLCAzXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoIFsxLCAyLCAzXSApIiwib3V0cHV0IjoiWyBcbiAgXCIxMjNcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQ29uY2F0TnVtYmVyc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlConcatPrimitiveTypes_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFByaW1pdGl2ZVR5cGVzXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQ09OQ0FUKG51bGwsIGZhbHNlLCAwLCB0cnVlLCAiIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQobnVsbCwgZmFsc2UsIDAsIHRydWUsIFwiXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJmYWxzZTB0cnVlXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbmNhdFByaW1pdGl2ZVR5cGVzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatPrimitiveTypes_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFByaW1pdGl2ZVR5cGVzXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQ09OQ0FUKCBbbnVsbCwgZmFsc2UsIDAsIHRydWUsICIiXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoIFtudWxsLCBmYWxzZSwgMCwgdHJ1ZSwgXCJcIl0gKSIsIm91dHB1dCI6IlsgXG4gIFwiZmFsc2UwdHJ1ZVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXRQcmltaXRpdmVUeXBlc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlConcatSeparatorCompoundTypes_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvckNvbXBvdW5kVHlwZXNfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIsICIsIFs1LCA2XSwge2ZvbzogImJhciJ9KQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgWzUsIDZdLCB7Zm9vOiBcImJhclwifSkiLCJvdXRwdXQiOiJbIFxuICBcIls1LDZdLCB7XFxcImZvb1xcXCI6XFxcImJhclxcXCJ9XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbmNhdFNlcGFyYXRvckNvbXBvdW5kVHlwZXNfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlConcatSeparatorCompoundTypes_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvckNvbXBvdW5kVHlwZXNfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIsICIsIFtbNSwgNl0sIHtmb286ICJiYXIifV0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgW1s1LCA2XSwge2ZvbzogXCJiYXJcIn1dKSIsIm91dHB1dCI6IlsgXG4gIFwiWzUsNl0sIHtcXFwiZm9vXFxcIjpcXFwiYmFyXFxcIn1cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQ29uY2F0U2VwYXJhdG9yQ29tcG91bmRUeXBlc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlConcatSeparatorNumbers_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvck51bWJlcnNfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIsICIsIDEsIDIsIDMp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgMSwgMiwgMykiLCJvdXRwdXQiOiJbIFxuICBcIjEsIDIsIDNcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQ29uY2F0U2VwYXJhdG9yTnVtYmVyc18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlConcatSeparatorNumbers_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvck51bWJlcnNfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIsICIsIFsxLCAyLCAzXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgWzEsIDIsIDNdKSIsIm91dHB1dCI6IlsgXG4gIFwiMSwgMiwgM1wiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXRTZXBhcmF0b3JOdW1iZXJzXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatSeparatorPrimitiveTypes_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvclByaW1pdGl2ZVR5cGVzXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUigiLCAiLCBudWxsLCBmYWxzZSwgMCwgdHJ1ZSwgIiIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgbnVsbCwgZmFsc2UsIDAsIHRydWUsIFwiXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJmYWxzZSwgMCwgdHJ1ZSwgXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbmNhdFNlcGFyYXRvclByaW1pdGl2ZVR5cGVzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatSeparatorPrimitiveTypes_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvclByaW1pdGl2ZVR5cGVzXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQ09OQ0FUX1NFUEFSQVRPUigiLCAiLCBbbnVsbCwgZmFsc2UsIDAsIHRydWUsICIiXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgW251bGwsIGZhbHNlLCAwLCB0cnVlLCBcIlwiXSkiLCJvdXRwdXQiOiJbIFxuICBcImZhbHNlLCAwLCB0cnVlLCBcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQ29uY2F0U2VwYXJhdG9yUHJpbWl0aXZlVHlwZXNfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlConcatSeparatorStrings_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvclN0cmluZ3NfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIsICIsICJmb28iLCAiYmFyIiwgImJheiIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIikiLCJvdXRwdXQiOiJbIFxuICBcImZvbywgYmFyLCBiYXpcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsQ29uY2F0U2VwYXJhdG9yU3RyaW5nc18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlConcatSeparatorStrings_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFNlcGFyYXRvclN0cmluZ3NfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKCIsICIsIFsiZm9vIiwgImJhciIsICJiYXoiXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVRfU0VQQVJBVE9SKFwiLCBcIiwgW1wiZm9vXCIsIFwiYmFyXCIsIFwiYmF6XCJdKSIsIm91dHB1dCI6IlsgXG4gIFwiZm9vLCBiYXIsIGJhelwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXRTZXBhcmF0b3JTdHJpbmdzXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatStrings_1_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFN0cmluZ3NfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVQoImZvbyIsICJiYXIiLCAiYmF6Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIikiLCJvdXRwdXQiOiJbIFxuICBcImZvb2JhcmJhelwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXRTdHJpbmdzXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlConcatStrings_2_single": { + "request": "LS0tCm5hbWU6IGFxbENvbmNhdFN0cmluZ3NfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05DQVQoIFsgImZvbyIsICJiYXIiLCAiYmF6IiBdICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05DQVQoIFsgXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIiBdICkiLCJvdXRwdXQiOiJbIFxuICBcImZvb2JhcmJhelwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDb25jYXRTdHJpbmdzXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlContainsMatchIndex_single": { + "request": "LS0tCm5hbWU6IGFxbENvbnRhaW5zTWF0Y2hJbmRleApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBDT05UQUlOUygiZm9vYmFyYmF6IiwgImJhciIsIHRydWUp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05UQUlOUyhcImZvb2JhcmJhelwiLCBcImJhclwiLCB0cnVlKSIsIm91dHB1dCI6IlsgXG4gIDMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbnRhaW5zTWF0Y2hJbmRleCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlContainsMatch_single": { + "request": "LS0tCm5hbWU6IGFxbENvbnRhaW5zTWF0Y2gKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gQ09OVEFJTlMoImZvb2JhcmJheiIsICJiYXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05UQUlOUyhcImZvb2JhcmJhelwiLCBcImJhclwiKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbnRhaW5zTWF0Y2giLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlContainsNoMatchIndex_single": { + "request": "LS0tCm5hbWU6IGFxbENvbnRhaW5zTm9NYXRjaEluZGV4CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIENPTlRBSU5TKCJmb29iYXJiYXoiLCAiaG9yc2UiLCB0cnVlKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05UQUlOUyhcImZvb2JhcmJhelwiLCBcImhvcnNlXCIsIHRydWUpIiwib3V0cHV0IjoiWyBcbiAgLTEgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbnRhaW5zTm9NYXRjaEluZGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlContains_single": { + "request": "LS0tCm5hbWU6IGFxbENvbnRhaW5zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIENPTlRBSU5TKCJmb29iYXJiYXoiLCAiaG9yc2UiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDT05UQUlOUyhcImZvb2JhcmJhelwiLCBcImhvcnNlXCIpIiwib3V0cHV0IjoiWyBcbiAgZmFsc2UgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbENvbnRhaW5zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlCrc32_single": { + "request": "LS0tCm5hbWU6IGFxbENyYzMyCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIENSQzMyKCJmb29iYXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBDUkMzMihcImZvb2JhclwiKSIsIm91dHB1dCI6IlsgXG4gIFwiRDVGNUM3RlwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxDcmMzMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlDateGroupingLocalTime_1_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVHcm91cGluZ0xvY2FsVGltZV8xCmRlc2NyaXB0aW9uOiAnJwpiaW5kVmFyczogCiAgewogICAgImFjdGl2aXRpZXMiOiBbCiAgICAgIHsic3RhcnREYXRlIjogIjIwMjAtMDEtMzFUMjM6MDA6MDBaIiwgImVuZERhdGUiOiAiMjAyMC0wMi0wMVQwMzowMDowMFoiLCAiZHVyYXRpb24iOiA0LCAicmF0ZSI6IDI1MH0sCiAgICAgIHsic3RhcnREYXRlIjogIjIwMjAtMDItMDFUMDk6MDA6MDBaIiwgImVuZERhdGUiOiAiMjAyMC0wMi0wMVQxNzowMDowMFoiLCAiZHVyYXRpb24iOiA4LCAicmF0ZSI6IDI1MH0sCiAgICAgIHsic3RhcnREYXRlIjogIjIwMjAtMDMtMzFUMjE6MDA6MDBaIiwgImVuZERhdGUiOiAiMjAyMC0wMy0zMVQyMjowMDowMFoiLCAiZHVyYXRpb24iOiAxLCAicmF0ZSI6IDI1MH0sCiAgICAgIHsic3RhcnREYXRlIjogIjIwMjAtMDMtMzFUMjI6MDA6MDBaIiwgImVuZERhdGUiOiAiMjAyMC0wNC0wMVQwMzowMDowMFoiLCAiZHVyYXRpb24iOiA1LCAicmF0ZSI6IDI1MH0sCiAgICAgIHsic3RhcnREYXRlIjogIjIwMjAtMDQtMDFUMTM6MDA6MDBaIiwgImVuZERhdGUiOiAiMjAyMC0wNC0wMVQxNjowMDowMFoiLCAiZHVyYXRpb24iOiAzLCAicmF0ZSI6IDI1MH0KICAgIF0KICB9Ci0tLQpGT1IgYSBJTiBAYWN0aXZpdGllcwpDT0xMRUNUCiAgZGF5ID0gREFURV9UUlVOQyhEQVRFX1VUQ1RPTE9DQUwoYS5zdGFydERhdGUsICdFdXJvcGUvQmVybGluJyksICdkYXknKQpBR0dSRUdBVEUKICBob3VycyA9IFNVTShhLmR1cmF0aW9uKSwKICByZXZlbnVlID0gU1VNKGEuZHVyYXRpb24gKiBhLnJhdGUpClNPUlQgZGF5IEFTQwpSRVRVUk4gewogIGRheSwKICBob3VycywKICByZXZlbnVlCn0=", + "response": "eyJpbnB1dCI6IkZPUiBhIElOIEBhY3Rpdml0aWVzXG5DT0xMRUNUXG4gIGRheSA9IERBVEVfVFJVTkMoREFURV9VVENUT0xPQ0FMKGEuc3RhcnREYXRlLCAnRXVyb3BlL0JlcmxpbicpLCAnZGF5JylcbkFHR1JFR0FURVxuICBob3VycyA9IFNVTShhLmR1cmF0aW9uKSxcbiAgcmV2ZW51ZSA9IFNVTShhLmR1cmF0aW9uICogYS5yYXRlKVxuU09SVCBkYXkgQVNDXG5SRVRVUk4ge1xuICBkYXksXG4gIGhvdXJzLFxuICByZXZlbnVlXG59Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImRheVwiIDogXCIyMDIwLTAyLTAxVDAwOjAwOjAwLjAwMFpcIiwgXG4gICAgXCJob3Vyc1wiIDogMTIsIFxuICAgIFwicmV2ZW51ZVwiIDogMzAwMCBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXlcIiA6IFwiMjAyMC0wMy0zMVQwMDowMDowMC4wMDBaXCIsIFxuICAgIFwiaG91cnNcIiA6IDEsIFxuICAgIFwicmV2ZW51ZVwiIDogMjUwIFxuICB9LCBcbiAgeyBcbiAgICBcImRheVwiIDogXCIyMDIwLTA0LTAxVDAwOjAwOjAwLjAwMFpcIiwgXG4gICAgXCJob3Vyc1wiIDogOCwgXG4gICAgXCJyZXZlbnVlXCIgOiAyMDAwIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxEYXRlR3JvdXBpbmdMb2NhbFRpbWVfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJiaW5kVmFycyI6eyJhY3Rpdml0aWVzIjpbeyJkdXJhdGlvbiI6NCwiZW5kRGF0ZSI6IjIwMjAtMDItMDFUMDM6MDA6MDBaIiwicmF0ZSI6MjUwLCJzdGFydERhdGUiOiIyMDIwLTAxLTMxVDIzOjAwOjAwWiJ9LHsiZHVyYXRpb24iOjgsImVuZERhdGUiOiIyMDIwLTAyLTAxVDE3OjAwOjAwWiIsInJhdGUiOjI1MCwic3RhcnREYXRlIjoiMjAyMC0wMi0wMVQwOTowMDowMFoifSx7ImR1cmF0aW9uIjoxLCJlbmREYXRlIjoiMjAyMC0wMy0zMVQyMjowMDowMFoiLCJyYXRlIjoyNTAsInN0YXJ0RGF0ZSI6IjIwMjAtMDMtMzFUMjE6MDA6MDBaIn0seyJkdXJhdGlvbiI6NSwiZW5kRGF0ZSI6IjIwMjAtMDQtMDFUMDM6MDA6MDBaIiwicmF0ZSI6MjUwLCJzdGFydERhdGUiOiIyMDIwLTAzLTMxVDIyOjAwOjAwWiJ9LHsiZHVyYXRpb24iOjMsImVuZERhdGUiOiIyMDIwLTA0LTAxVDE2OjAwOjAwWiIsInJhdGUiOjI1MCwic3RhcnREYXRlIjoiMjAyMC0wNC0wMVQxMzowMDowMFoifV19fX0K" + }, + "aqlDateIsoWeekYear1_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVJc29XZWVrWWVhcjEKZGVzY3JpcHRpb246IHwKICBKYW51YXJ5IDFzdCBvZiAyMDIzIGlzIHBhcnQgb2YgdGhlIHByZXZpb3VzIHllYXIncyBsYXN0IHdlZWs6Ci0tLQpSRVRVUk4gREFURV9JU09XRUVLWUVBUigiMjAyMy0wMS0wMSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0lTT1dFRUtZRUFSKFwiMjAyMy0wMS0wMVwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ3ZWVrXCIgOiA1MiwgXG4gICAgXCJ5ZWFyXCIgOiAyMDIyIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkphbnVhcnkgMXN0IG9mIDIwMjMgaXMgcGFydCBvZiB0aGUgcHJldmlvdXMgeWVhcidzIGxhc3Qgd2VlazpcbiIsIm5hbWUiOiJhcWxEYXRlSXNvV2Vla1llYXIxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlDateIsoWeekYear2_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVJc29XZWVrWWVhcjIKZGVzY3JpcHRpb246IHwKICBUaGUgbGFzdCB0d28gZGF5cyBvZiAyMDE5IGFyZSBwYXJ0IG9mIHRoZSBuZXh0IHllYXIncyBmaXJzdCB3ZWVrOgotLS0KUkVUVVJOIERBVEVfSVNPV0VFS1lFQVIoIjIwMTktMTItMzAiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0lTT1dFRUtZRUFSKFwiMjAxOS0xMi0zMFwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ3ZWVrXCIgOiAxLCBcbiAgICBcInllYXJcIiA6IDIwMjAgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVGhlIGxhc3QgdHdvIGRheXMgb2YgMjAxOSBhcmUgcGFydCBvZiB0aGUgbmV4dCB5ZWFyJ3MgZmlyc3Qgd2VlazpcbiIsIm5hbWUiOiJhcWxEYXRlSXNvV2Vla1llYXIyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlDateTimeToLocal_1_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVUaW1lVG9Mb2NhbF8xCmRlc2NyaXB0aW9uOiB8CiAgQ29udmVydCBhIGRhdGUgdGltZSBzdHJpbmcgdG8gZGlmZmVyZW50IGxvY2FsIHRpbWV6b25lczoKLS0tClJFVFVSTiBbCiAgREFURV9VVENUT0xPQ0FMKCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMCIsICJFdXJvcGUvQmVybGluIiksCiAgREFURV9VVENUT0xPQ0FMKCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMCIsICJBbWVyaWNhL05ld19Zb3JrIiksCiAgREFURV9VVENUT0xPQ0FMKCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMCIsICJVVEMiKQpd", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIERBVEVfVVRDVE9MT0NBTChcIjIwMjAtMDMtMTVUMDA6MDA6MDAuMDAwXCIsIFwiRXVyb3BlL0JlcmxpblwiKSxcbiAgREFURV9VVENUT0xPQ0FMKFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDBcIiwgXCJBbWVyaWNhL05ld19Zb3JrXCIpLFxuICBEQVRFX1VUQ1RPTE9DQUwoXCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMFwiLCBcIlVUQ1wiKVxuXSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCIyMDIwLTAzLTE1VDAxOjAwOjAwLjAwMFwiLCBcbiAgICBcIjIwMjAtMDMtMTRUMjA6MDA6MDAuMDAwXCIsIFxuICAgIFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDBaXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ29udmVydCBhIGRhdGUgdGltZSBzdHJpbmcgdG8gZGlmZmVyZW50IGxvY2FsIHRpbWV6b25lczpcbiIsIm5hbWUiOiJhcWxEYXRlVGltZVRvTG9jYWxfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlDateTimeToLocal_2_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVUaW1lVG9Mb2NhbF8yCmRlc2NyaXB0aW9uOiB8CiAgQ29udmVydCBkYXRlIHRpbWUgc3RyaW5ncyB3aXRoIGFuZCB3aXRob3V0IFVUQyBpbmRpY2F0b3IgKGBaYCksIHdpdGggYSB0aW1lem9uZQogIG9mZnNldCwgYW5kIGEgVW5peCB0aW1lc3RhbXAgdG8gbG9jYWwgdGltZToKLS0tClJFVFVSTiBbCiAgREFURV9VVENUT0xPQ0FMKCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMCIsICJBc2lhL1NoYW5naGFpIiksCiAgREFURV9VVENUT0xPQ0FMKCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMFoiLCAiQXNpYS9TaGFuZ2hhaSIpLAogIERBVEVfVVRDVE9MT0NBTCgiMjAyMC0wMy0xNVQwMDowMDowMC4wMDAtMDI6MDAiLCAiQXNpYS9TaGFuZ2hhaSIpLAogIERBVEVfVVRDVE9MT0NBTCgxNTg0MjMwNDAwMDAwLCAiQXNpYS9TaGFuZ2hhaSIpCl0=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIERBVEVfVVRDVE9MT0NBTChcIjIwMjAtMDMtMTVUMDA6MDA6MDAuMDAwXCIsIFwiQXNpYS9TaGFuZ2hhaVwiKSxcbiAgREFURV9VVENUT0xPQ0FMKFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDBaXCIsIFwiQXNpYS9TaGFuZ2hhaVwiKSxcbiAgREFURV9VVENUT0xPQ0FMKFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDAtMDI6MDBcIiwgXCJBc2lhL1NoYW5naGFpXCIpLFxuICBEQVRFX1VUQ1RPTE9DQUwoMTU4NDIzMDQwMDAwMCwgXCJBc2lhL1NoYW5naGFpXCIpXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIjIwMjAtMDMtMTVUMDg6MDA6MDAuMDAwXCIsIFxuICAgIFwiMjAyMC0wMy0xNVQwODowMDowMC4wMDBcIiwgXG4gICAgXCIyMDIwLTAzLTE1VDEwOjAwOjAwLjAwMFwiLCBcbiAgICBcIjIwMjAtMDMtMTVUMDg6MDA6MDAuMDAwXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ29udmVydCBkYXRlIHRpbWUgc3RyaW5ncyB3aXRoIGFuZCB3aXRob3V0IFVUQyBpbmRpY2F0b3IgKGBaYCksIHdpdGggYSB0aW1lem9uZVxub2Zmc2V0LCBhbmQgYSBVbml4IHRpbWVzdGFtcCB0byBsb2NhbCB0aW1lOlxuIiwibmFtZSI6ImFxbERhdGVUaW1lVG9Mb2NhbF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlDateTimeToLocal_3_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVUaW1lVG9Mb2NhbF8zCmRlc2NyaXB0aW9uOiB8CiAgQ29udmVydCB0byBsb2NhbCB0aW1lIGFuZCBpbmNsdWRlIHRpbWV6b25lIGluZm9ybWF0aW9uOgotLS0KUkVUVVJOIERBVEVfVVRDVE9MT0NBTChEQVRFX05PVygpLCAiQWZyaWNhL0xhZ29zIiwgdHJ1ZSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX1VUQ1RPTE9DQUwoREFURV9OT1coKSwgXCJBZnJpY2EvTGFnb3NcIiwgdHJ1ZSkiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwibG9jYWxcIiA6IFwiMjAyNS0wNS0yM1QxOToxNToyNS4yMjdcIiwgXG4gICAgXCJ0emRiXCIgOiBcIjIwMjVhXCIsIFxuICAgIFwiem9uZUluZm9cIiA6IHsgXG4gICAgICBcIm5hbWVcIiA6IFwiV0FUXCIsIFxuICAgICAgXCJiZWdpblwiIDogXCIxOTE5LTA4LTMxVDIzOjMwOjAwLjAwMFpcIiwgXG4gICAgICBcImVuZFwiIDogbnVsbCwgXG4gICAgICBcImRzdFwiIDogZmFsc2UsIFxuICAgICAgXCJvZmZzZXRcIiA6IDM2MDAgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDb252ZXJ0IHRvIGxvY2FsIHRpbWUgYW5kIGluY2x1ZGUgdGltZXpvbmUgaW5mb3JtYXRpb246XG4iLCJuYW1lIjoiYXFsRGF0ZVRpbWVUb0xvY2FsXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlDateTimeToUTC_1_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVUaW1lVG9VVENfMQpkZXNjcmlwdGlvbjogfAogIENvbnZlcnQgYSBkYXRlIHRpbWUgc3RyaW5nIGZyb20gZGlmZmVyZW50IGxvY2FsIHRpbWV6b25lcyB0byBVVEM6Ci0tLQpSRVRVUk4gWwogIERBVEVfTE9DQUxUT1VUQygiMjAyMC0wMy0xNVQwMDowMDowMC4wMDAiLCAiRXVyb3BlL0JlcmxpbiIpLAogIERBVEVfTE9DQUxUT1VUQygiMjAyMC0wMy0xNVQwMDowMDowMC4wMDAiLCAiQW1lcmljYS9OZXdfWW9yayIpLAogIERBVEVfTE9DQUxUT1VUQygiMjAyMC0wMy0xNVQwMDowMDowMC4wMDAiLCAiVVRDIikKXQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIERBVEVfTE9DQUxUT1VUQyhcIjIwMjAtMDMtMTVUMDA6MDA6MDAuMDAwXCIsIFwiRXVyb3BlL0JlcmxpblwiKSxcbiAgREFURV9MT0NBTFRPVVRDKFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDBcIiwgXCJBbWVyaWNhL05ld19Zb3JrXCIpLFxuICBEQVRFX0xPQ0FMVE9VVEMoXCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMFwiLCBcIlVUQ1wiKVxuXSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCIyMDIwLTAzLTE0VDIzOjAwOjAwLjAwMFpcIiwgXG4gICAgXCIyMDIwLTAzLTE1VDA0OjAwOjAwLjAwMFpcIiwgXG4gICAgXCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMFpcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJDb252ZXJ0IGEgZGF0ZSB0aW1lIHN0cmluZyBmcm9tIGRpZmZlcmVudCBsb2NhbCB0aW1lem9uZXMgdG8gVVRDOlxuIiwibmFtZSI6ImFxbERhdGVUaW1lVG9VVENfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlDateTimeToUTC_2_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVUaW1lVG9VVENfMgpkZXNjcmlwdGlvbjogfAogIENvbnZlcnQgZGF0ZSB0aW1lIHN0cmluZ3Mgd2l0aCBhbmQgd2l0aG91dCBVVEMgaW5kaWNhdG9yIChgWmApLCB3aXRoIGEgdGltZXpvbmUKICBvZmZzZXQsIGFuZCBhIFVuaXggdGltZXN0YW1wIHRvIFVUQyB0aW1lOgotLS0KUkVUVVJOIFsKICBEQVRFX0xPQ0FMVE9VVEMoIjIwMjAtMDMtMTVUMDA6MDA6MDAuMDAwIiwgIkFzaWEvU2hhbmdoYWkiKSwKICBEQVRFX0xPQ0FMVE9VVEMoIjIwMjAtMDMtMTVUMDA6MDA6MDAuMDAwWiIsICJBc2lhL1NoYW5naGFpIiksCiAgREFURV9MT0NBTFRPVVRDKCIyMDIwLTAzLTE1VDAwOjAwOjAwLjAwMC0wMjowMCIsICJBc2lhL1NoYW5naGFpIiksCiAgREFURV9MT0NBTFRPVVRDKDE1ODQyMzA0MDAwMDAsICJBc2lhL1NoYW5naGFpIikKXQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIERBVEVfTE9DQUxUT1VUQyhcIjIwMjAtMDMtMTVUMDA6MDA6MDAuMDAwXCIsIFwiQXNpYS9TaGFuZ2hhaVwiKSxcbiAgREFURV9MT0NBTFRPVVRDKFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDBaXCIsIFwiQXNpYS9TaGFuZ2hhaVwiKSxcbiAgREFURV9MT0NBTFRPVVRDKFwiMjAyMC0wMy0xNVQwMDowMDowMC4wMDAtMDI6MDBcIiwgXCJBc2lhL1NoYW5naGFpXCIpLFxuICBEQVRFX0xPQ0FMVE9VVEMoMTU4NDIzMDQwMDAwMCwgXCJBc2lhL1NoYW5naGFpXCIpXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIjIwMjAtMDMtMTRUMTY6MDA6MDAuMDAwWlwiLCBcbiAgICBcIjIwMjAtMDMtMTRUMTY6MDA6MDAuMDAwWlwiLCBcbiAgICBcIjIwMjAtMDMtMTRUMTg6MDA6MDAuMDAwWlwiLCBcbiAgICBcIjIwMjAtMDMtMTRUMTY6MDA6MDAuMDAwWlwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkNvbnZlcnQgZGF0ZSB0aW1lIHN0cmluZ3Mgd2l0aCBhbmQgd2l0aG91dCBVVEMgaW5kaWNhdG9yIChgWmApLCB3aXRoIGEgdGltZXpvbmVcbm9mZnNldCwgYW5kIGEgVW5peCB0aW1lc3RhbXAgdG8gVVRDIHRpbWU6XG4iLCJuYW1lIjoiYXFsRGF0ZVRpbWVUb1VUQ18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlDateTimeToUTC_3_single": { + "request": "LS0tCm5hbWU6IGFxbERhdGVUaW1lVG9VVENfMwpkZXNjcmlwdGlvbjogfAogIENvbnZlcnQgdG8gVVRDIHRpbWUgYW5kIGluY2x1ZGUgdGltZXpvbmUgaW5mb3JtYXRpb246Ci0tLQpSRVRVUk4gREFURV9MT0NBTFRPVVRDKCIyMDIxLTAzLTE2VDEyOjAwOjAwLjAwMCIsICJBZnJpY2EvTGFnb3MiLCB0cnVlKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0xPQ0FMVE9VVEMoXCIyMDIxLTAzLTE2VDEyOjAwOjAwLjAwMFwiLCBcIkFmcmljYS9MYWdvc1wiLCB0cnVlKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ1dGNcIiA6IFwiMjAyMS0wMy0xNlQxMTowMDowMC4wMDBaXCIsIFxuICAgIFwidHpkYlwiIDogXCIyMDI1YVwiLCBcbiAgICBcInpvbmVJbmZvXCIgOiB7IFxuICAgICAgXCJuYW1lXCIgOiBcIldBVFwiLCBcbiAgICAgIFwiYmVnaW5cIiA6IFwiMTkxOS0wOC0zMVQyMzozMDowMC4wMDBaXCIsIFxuICAgICAgXCJlbmRcIiA6IG51bGwsIFxuICAgICAgXCJkc3RcIiA6IGZhbHNlLCBcbiAgICAgIFwib2Zmc2V0XCIgOiAzNjAwIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ29udmVydCB0byBVVEMgdGltZSBhbmQgaW5jbHVkZSB0aW1lem9uZSBpbmZvcm1hdGlvbjpcbiIsIm5hbWUiOiJhcWxEYXRlVGltZVRvVVRDXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlEncodeUriComponent_single": { + "request": "LS0tCm5hbWU6IGFxbEVuY29kZVVyaUNvbXBvbmVudApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBFTkNPREVfVVJJX0NPTVBPTkVOVCgiZsO8bmYgJSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBFTkNPREVfVVJJX0NPTVBPTkVOVChcImbDvG5mICVcIikiLCJvdXRwdXQiOiJbIFxuICBcImYlQzMlQkNuZiUyMCUyNVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxFbmNvZGVVcmlDb21wb25lbnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlFindFirst_1_single": { + "request": "LS0tCm5hbWU6IGFxbEZpbmRGaXJzdF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEZJTkRfRklSU1QoImZvb2JhcmJheiIsICJiYSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSU5EX0ZJUlNUKFwiZm9vYmFyYmF6XCIsIFwiYmFcIikiLCJvdXRwdXQiOiJbIFxuICAzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxGaW5kRmlyc3RfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlFindFirst_2_single": { + "request": "LS0tCm5hbWU6IGFxbEZpbmRGaXJzdF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEZJTkRfRklSU1QoImZvb2JhcmJheiIsICJiYSIsIDQp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSU5EX0ZJUlNUKFwiZm9vYmFyYmF6XCIsIFwiYmFcIiwgNCkiLCJvdXRwdXQiOiJbIFxuICA2IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxGaW5kRmlyc3RfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlFindFirst_3_single": { + "request": "LS0tCm5hbWU6IGFxbEZpbmRGaXJzdF8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEZJTkRfRklSU1QoImZvb2JhcmJheiIsICJiYSIsIDAsIDMp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSU5EX0ZJUlNUKFwiZm9vYmFyYmF6XCIsIFwiYmFcIiwgMCwgMykiLCJvdXRwdXQiOiJbIFxuICAtMSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsRmluZEZpcnN0XzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlFindLast_1_single": { + "request": "LS0tCm5hbWU6IGFxbEZpbmRMYXN0XzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gRklORF9MQVNUKCJmb29iYXJiYXoiLCAiYmEiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSU5EX0xBU1QoXCJmb29iYXJiYXpcIiwgXCJiYVwiKSIsIm91dHB1dCI6IlsgXG4gIDYgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEZpbmRMYXN0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlFindLast_2_single": { + "request": "LS0tCm5hbWU6IGFxbEZpbmRMYXN0XzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gRklORF9MQVNUKCJmb29iYXJiYXoiLCAiYmEiLCA3KQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSU5EX0xBU1QoXCJmb29iYXJiYXpcIiwgXCJiYVwiLCA3KSIsIm91dHB1dCI6IlsgXG4gIC0xIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxGaW5kTGFzdF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlFindLast_3_single": { + "request": "LS0tCm5hbWU6IGFxbEZpbmRMYXN0XzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gRklORF9MQVNUKCJmb29iYXJiYXoiLCAiYmEiLCAwLCA0KQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGSU5EX0xBU1QoXCJmb29iYXJiYXpcIiwgXCJiYVwiLCAwLCA0KSIsIm91dHB1dCI6IlsgXG4gIDMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEZpbmRMYXN0XzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlFnv64_single": { + "request": "LS0tCm5hbWU6IGFxbEZudjY0CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEZOVjY0KCJmb29iYXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBGTlY2NChcImZvb2JhclwiKSIsIm91dHB1dCI6IlsgXG4gIFwiODU5NDQxNzFGNzM5NjdFOFwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxGbnY2NCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlGeoLineString_1_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb0xpbmVTdHJpbmdfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBHRU9fTElORVNUUklORyhbCiAgICBbMzUsIDEwXSwgWzQ1LCA0NV0KXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fTElORVNUUklORyhbXG4gICAgWzM1LCAxMF0sIFs0NSwgNDVdXG5dKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ0eXBlXCIgOiBcIkxpbmVTdHJpbmdcIiwgXG4gICAgXCJjb29yZGluYXRlc1wiIDogWyBcbiAgICAgIFsgXG4gICAgICAgIDM1LCBcbiAgICAgICAgMTAgXG4gICAgICBdLCBcbiAgICAgIFsgXG4gICAgICAgIDQ1LCBcbiAgICAgICAgNDUgXG4gICAgICBdIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEdlb0xpbmVTdHJpbmdfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlGeoMultiLineString_1_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb011bHRpTGluZVN0cmluZ18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEdFT19NVUxUSUxJTkVTVFJJTkcoWwogICAgW1sxMDAuMCwgMC4wXSwgWzEwMS4wLCAxLjBdXSwKICAgIFtbMTAyLjAsIDIuMF0sIFsxMDEuMCwgMi4zXV0KXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fTVVMVElMSU5FU1RSSU5HKFtcbiAgICBbWzEwMC4wLCAwLjBdLCBbMTAxLjAsIDEuMF1dLFxuICAgIFtbMTAyLjAsIDIuMF0sIFsxMDEuMCwgMi4zXV1cbl0pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInR5cGVcIiA6IFwiTXVsdGlMaW5lU3RyaW5nXCIsIFxuICAgIFwiY29vcmRpbmF0ZXNcIiA6IFsgXG4gICAgICBbIFxuICAgICAgICBbIFxuICAgICAgICAgIDEwMCwgXG4gICAgICAgICAgMCBcbiAgICAgICAgXSwgXG4gICAgICAgIFsgXG4gICAgICAgICAgMTAxLCBcbiAgICAgICAgICAxIFxuICAgICAgICBdIFxuICAgICAgXSwgXG4gICAgICBbIFxuICAgICAgICBbIFxuICAgICAgICAgIDEwMiwgXG4gICAgICAgICAgMiBcbiAgICAgICAgXSwgXG4gICAgICAgIFsgXG4gICAgICAgICAgMTAxLCBcbiAgICAgICAgICAyLjMgXG4gICAgICAgIF0gXG4gICAgICBdIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEdlb011bHRpTGluZVN0cmluZ18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlGeoMultiPoint_1_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb011bHRpUG9pbnRfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBHRU9fTVVMVElQT0lOVChbCiAgICBbMzUsIDEwXSwgWzQ1LCA0NV0KXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fTVVMVElQT0lOVChbXG4gICAgWzM1LCAxMF0sIFs0NSwgNDVdXG5dKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ0eXBlXCIgOiBcIk11bHRpUG9pbnRcIiwgXG4gICAgXCJjb29yZGluYXRlc1wiIDogWyBcbiAgICAgIFsgXG4gICAgICAgIDM1LCBcbiAgICAgICAgMTAgXG4gICAgICBdLCBcbiAgICAgIFsgXG4gICAgICAgIDQ1LCBcbiAgICAgICAgNDUgXG4gICAgICBdIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEdlb011bHRpUG9pbnRfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlGeoMultiPolygon_1_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb011bHRpUG9seWdvbl8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEdFT19NVUxUSVBPTFlHT04oWwogICAgWwogICAgICAgIFtbNDAsIDQwXSwgWzIwLCA0NV0sIFs0NSwgMzBdLCBbNDAsIDQwXV0KICAgIF0sCiAgICBbCiAgICAgICAgW1syMCwgMzVdLCBbMTAsIDMwXSwgWzEwLCAxMF0sIFszMCwgNV0sIFs0NSwgMjBdLCBbMjAsIDM1XV0sCiAgICAgICAgW1szMCwgMjBdLCBbMjAsIDE1XSwgWzIwLCAyNV0sIFszMCwgMjBdXQogICAgXQpdKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fTVVMVElQT0xZR09OKFtcbiAgICBbXG4gICAgICAgIFtbNDAsIDQwXSwgWzIwLCA0NV0sIFs0NSwgMzBdLCBbNDAsIDQwXV1cbiAgICBdLFxuICAgIFtcbiAgICAgICAgW1syMCwgMzVdLCBbMTAsIDMwXSwgWzEwLCAxMF0sIFszMCwgNV0sIFs0NSwgMjBdLCBbMjAsIDM1XV0sXG4gICAgICAgIFtbMzAsIDIwXSwgWzIwLCAxNV0sIFsyMCwgMjVdLCBbMzAsIDIwXV1cbiAgICBdXG5dKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ0eXBlXCIgOiBcIk11bHRpUG9seWdvblwiLCBcbiAgICBcImNvb3JkaW5hdGVzXCIgOiBbIFxuICAgICAgWyBcbiAgICAgICAgWyBcbiAgICAgICAgICBbIFxuICAgICAgICAgICAgNDAsIFxuICAgICAgICAgICAgNDAgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgWyBcbiAgICAgICAgICAgIDIwLCBcbiAgICAgICAgICAgIDQ1IFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFsgXG4gICAgICAgICAgICA0NSwgXG4gICAgICAgICAgICAzMCBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBbIFxuICAgICAgICAgICAgNDAsIFxuICAgICAgICAgICAgNDAgXG4gICAgICAgICAgXSBcbiAgICAgICAgXSBcbiAgICAgIF0sIFxuICAgICAgWyBcbiAgICAgICAgWyBcbiAgICAgICAgICBbIFxuICAgICAgICAgICAgMjAsIFxuICAgICAgICAgICAgMzUgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgWyBcbiAgICAgICAgICAgIDEwLCBcbiAgICAgICAgICAgIDMwIFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFsgXG4gICAgICAgICAgICAxMCwgXG4gICAgICAgICAgICAxMCBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBbIFxuICAgICAgICAgICAgMzAsIFxuICAgICAgICAgICAgNSBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBbIFxuICAgICAgICAgICAgNDUsIFxuICAgICAgICAgICAgMjAgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgWyBcbiAgICAgICAgICAgIDIwLCBcbiAgICAgICAgICAgIDM1IFxuICAgICAgICAgIF0gXG4gICAgICAgIF0sIFxuICAgICAgICBbIFxuICAgICAgICAgIFsgXG4gICAgICAgICAgICAzMCwgXG4gICAgICAgICAgICAyMCBcbiAgICAgICAgICBdLCBcbiAgICAgICAgICBbIFxuICAgICAgICAgICAgMjAsIFxuICAgICAgICAgICAgMTUgXG4gICAgICAgICAgXSwgXG4gICAgICAgICAgWyBcbiAgICAgICAgICAgIDIwLCBcbiAgICAgICAgICAgIDI1IFxuICAgICAgICAgIF0sIFxuICAgICAgICAgIFsgXG4gICAgICAgICAgICAzMCwgXG4gICAgICAgICAgICAyMCBcbiAgICAgICAgICBdIFxuICAgICAgICBdIFxuICAgICAgXSBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxHZW9NdWx0aVBvbHlnb25fMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlGeoPoint_1_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb1BvaW50XzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gR0VPX1BPSU5UKDEuMCwgMi4wKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fUE9JTlQoMS4wLCAyLjApIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInR5cGVcIiA6IFwiUG9pbnRcIiwgXG4gICAgXCJjb29yZGluYXRlc1wiIDogWyBcbiAgICAgIDEsIFxuICAgICAgMiBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxHZW9Qb2ludF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlGeoPolygon_1_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb1BvbHlnb25fMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBHRU9fUE9MWUdPTihbCiAgICBbMC4wLCAwLjBdLCBbNy41LCAyLjVdLCBbMC4wLCA1LjBdLCBbMC4wLCAwLjBdCl0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fUE9MWUdPTihbXG4gICAgWzAuMCwgMC4wXSwgWzcuNSwgMi41XSwgWzAuMCwgNS4wXSwgWzAuMCwgMC4wXVxuXSkiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidHlwZVwiIDogXCJQb2x5Z29uXCIsIFxuICAgIFwiY29vcmRpbmF0ZXNcIiA6IFsgXG4gICAgICBbIFxuICAgICAgICBbIFxuICAgICAgICAgIDAsIFxuICAgICAgICAgIDAgXG4gICAgICAgIF0sIFxuICAgICAgICBbIFxuICAgICAgICAgIDcuNSwgXG4gICAgICAgICAgMi41IFxuICAgICAgICBdLCBcbiAgICAgICAgWyBcbiAgICAgICAgICAwLCBcbiAgICAgICAgICA1IFxuICAgICAgICBdLCBcbiAgICAgICAgWyBcbiAgICAgICAgICAwLCBcbiAgICAgICAgICAwIFxuICAgICAgICBdIFxuICAgICAgXSBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxHZW9Qb2x5Z29uXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlGeoPolygon_2_single": { + "request": "LS0tCm5hbWU6IGFxbEdlb1BvbHlnb25fMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBHRU9fUE9MWUdPTihbCiAgICBbWzM1LCAxMF0sIFs0NSwgNDVdLCBbMTUsIDQwXSwgWzEwLCAyMF0sIFszNSwgMTBdXSwKICAgIFtbMjAsIDMwXSwgWzMwLCAyMF0sIFszNSwgMzVdLCBbMjAsIDMwXV0KXSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBHRU9fUE9MWUdPTihbXG4gICAgW1szNSwgMTBdLCBbNDUsIDQ1XSwgWzE1LCA0MF0sIFsxMCwgMjBdLCBbMzUsIDEwXV0sXG4gICAgW1syMCwgMzBdLCBbMzAsIDIwXSwgWzM1LCAzNV0sIFsyMCwgMzBdXVxuXSkiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidHlwZVwiIDogXCJQb2x5Z29uXCIsIFxuICAgIFwiY29vcmRpbmF0ZXNcIiA6IFsgXG4gICAgICBbIFxuICAgICAgICBbIFxuICAgICAgICAgIDM1LCBcbiAgICAgICAgICAxMCBcbiAgICAgICAgXSwgXG4gICAgICAgIFsgXG4gICAgICAgICAgNDUsIFxuICAgICAgICAgIDQ1IFxuICAgICAgICBdLCBcbiAgICAgICAgWyBcbiAgICAgICAgICAxNSwgXG4gICAgICAgICAgNDAgXG4gICAgICAgIF0sIFxuICAgICAgICBbIFxuICAgICAgICAgIDEwLCBcbiAgICAgICAgICAyMCBcbiAgICAgICAgXSwgXG4gICAgICAgIFsgXG4gICAgICAgICAgMzUsIFxuICAgICAgICAgIDEwIFxuICAgICAgICBdIFxuICAgICAgXSwgXG4gICAgICBbIFxuICAgICAgICBbIFxuICAgICAgICAgIDIwLCBcbiAgICAgICAgICAzMCBcbiAgICAgICAgXSwgXG4gICAgICAgIFsgXG4gICAgICAgICAgMzAsIFxuICAgICAgICAgIDIwIFxuICAgICAgICBdLCBcbiAgICAgICAgWyBcbiAgICAgICAgICAzNSwgXG4gICAgICAgICAgMzUgXG4gICAgICAgIF0sIFxuICAgICAgICBbIFxuICAgICAgICAgIDIwLCBcbiAgICAgICAgICAzMCBcbiAgICAgICAgXSBcbiAgICAgIF0gXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsR2VvUG9seWdvbl8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlHas_1_single": { + "request": "LS0tCm5hbWU6IGFxbEhhc18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEhBUyggeyBuYW1lOiAiSmFuZSIgfSwgIm5hbWUiICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBIQVMoIHsgbmFtZTogXCJKYW5lXCIgfSwgXCJuYW1lXCIgKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEhhc18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlHas_2_single": { + "request": "LS0tCm5hbWU6IGFxbEhhc18yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEhBUyggeyBuYW1lOiAiSmFuZSIgfSwgImFnZSIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBIQVMoIHsgbmFtZTogXCJKYW5lXCIgfSwgXCJhZ2VcIiApIiwib3V0cHV0IjoiWyBcbiAgZmFsc2UgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEhhc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlHas_3_single": { + "request": "LS0tCm5hbWU6IGFxbEhhc18zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEhBUyggeyBuYW1lOiBudWxsIH0sICJuYW1lIiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBIQVMoIHsgbmFtZTogbnVsbCB9LCBcIm5hbWVcIiApIiwib3V0cHV0IjoiWyBcbiAgdHJ1ZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSGFzXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIPv4FromNumber_1_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRGcm9tTnVtYmVyXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSVBWNF9GUk9NX05VTUJFUigwKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X0ZST01fTlVNQkVSKDApIiwib3V0cHV0IjoiWyBcbiAgXCIwLjAuMC4wXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElQdjRGcm9tTnVtYmVyXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIPv4FromNumber_2_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRGcm9tTnVtYmVyXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSVBWNF9GUk9NX05VTUJFUigxMzQ3NDQwNzIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X0ZST01fTlVNQkVSKDEzNDc0NDA3MikiLCJvdXRwdXQiOiJbIFxuICBcIjguOC44LjhcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSVB2NEZyb21OdW1iZXJfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlIPv4FromNumber_3_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRGcm9tTnVtYmVyXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSVBWNF9GUk9NX05VTUJFUigyMTMwNzA2NDMzKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X0ZST01fTlVNQkVSKDIxMzA3MDY0MzMpIiwib3V0cHV0IjoiWyBcbiAgXCIxMjcuMC4wLjFcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSVB2NEZyb21OdW1iZXJfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlIPv4FromNumber_4_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRGcm9tTnVtYmVyXzQKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSVBWNF9GUk9NX05VTUJFUigzMjMyMjM1NTIxKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X0ZST01fTlVNQkVSKDMyMzIyMzU1MjEpIiwib3V0cHV0IjoiWyBcbiAgXCIxOTIuMTY4LjAuMVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxJUHY0RnJvbU51bWJlcl80IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlIPv4FromNumber_5_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRGcm9tTnVtYmVyXzUKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gSVBWNF9GUk9NX05VTUJFUigtMjMpIC8vIGludmFsaWQsIHByb2R1Y2VzIGEgd2FybmluZw==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X0ZST01fTlVNQkVSKC0yMykgLy8gaW52YWxpZCwgcHJvZHVjZXMgYSB3YXJuaW5nIiwib3V0cHV0IjoiWyBcbiAgbnVsbCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSVB2NEZyb21OdW1iZXJfNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlIPv4ToNumber_1_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRUb051bWJlcl8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElQVjRfVE9fTlVNQkVSKCIwLjAuMC4wIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X1RPX05VTUJFUihcIjAuMC4wLjBcIikiLCJvdXRwdXQiOiJbIFxuICAwIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxJUHY0VG9OdW1iZXJfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlIPv4ToNumber_2_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRUb051bWJlcl8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElQVjRfVE9fTlVNQkVSKCI4LjguOC44Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X1RPX05VTUJFUihcIjguOC44LjhcIikiLCJvdXRwdXQiOiJbIFxuICAxMzQ3NDQwNzIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElQdjRUb051bWJlcl8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlIPv4ToNumber_3_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRUb051bWJlcl8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElQVjRfVE9fTlVNQkVSKCIxMjcuMC4wLjEiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X1RPX05VTUJFUihcIjEyNy4wLjAuMVwiKSIsIm91dHB1dCI6IlsgXG4gIDIxMzA3MDY0MzMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElQdjRUb051bWJlcl8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlIPv4ToNumber_4_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRUb051bWJlcl80CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElQVjRfVE9fTlVNQkVSKCIxOTIuMTY4LjAuMSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X1RPX05VTUJFUihcIjE5Mi4xNjguMC4xXCIpIiwib3V0cHV0IjoiWyBcbiAgMzIzMjIzNTUyMSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSVB2NFRvTnVtYmVyXzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIPv4ToNumber_5_single": { + "request": "LS0tCm5hbWU6IGFxbElQdjRUb051bWJlcl81CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElQVjRfVE9fTlVNQkVSKCJtaWxrIikgLy8gaW52YWxpZCwgcHJvZHVjZXMgYSB3YXJuaW5n", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJUFY0X1RPX05VTUJFUihcIm1pbGtcIikgLy8gaW52YWxpZCwgcHJvZHVjZXMgYSB3YXJuaW5nIiwib3V0cHV0IjoiWyBcbiAgbnVsbCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSVB2NFRvTnVtYmVyXzUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIsIPv4_1_single": { + "request": "LS0tCm5hbWU6IGFxbElzSVB2NF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElTX0lQVjQoIjEyNy4wLjAuMSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJU19JUFY0KFwiMTI3LjAuMC4xXCIpIiwib3V0cHV0IjoiWyBcbiAgdHJ1ZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSXNJUHY0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIsIPv4_2_single": { + "request": "LS0tCm5hbWU6IGFxbElzSVB2NF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElTX0lQVjQoIjguOC44LjgiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJU19JUFY0KFwiOC44LjguOFwiKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElzSVB2NF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlIsIPv4_3_single": { + "request": "LS0tCm5hbWU6IGFxbElzSVB2NF8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElTX0lQVjQoIjAwOC4wMDguMDA4LjAwOCIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJU19JUFY0KFwiMDA4LjAwOC4wMDguMDA4XCIpIiwib3V0cHV0IjoiWyBcbiAgZmFsc2UgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElzSVB2NF8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlIsIPv4_4_single": { + "request": "LS0tCm5hbWU6IGFxbElzSVB2NF80CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElTX0lQVjQoIjEyMzQ1LjIuMy40Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJU19JUFY0KFwiMTIzNDUuMi4zLjRcIikiLCJvdXRwdXQiOiJbIFxuICBmYWxzZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSXNJUHY0XzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIsIPv4_5_single": { + "request": "LS0tCm5hbWU6IGFxbElzSVB2NF81CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElTX0lQVjQoIjEyLjM0Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJU19JUFY0KFwiMTIuMzRcIikiLCJvdXRwdXQiOiJbIFxuICBmYWxzZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSXNJUHY0XzUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlIsIPv4_6_single": { + "request": "LS0tCm5hbWU6IGFxbElzSVB2NF82CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIElTX0lQVjQoODg4OCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBJU19JUFY0KDg4ODgpIiwib3V0cHV0IjoiWyBcbiAgZmFsc2UgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElzSVB2NF82IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlIsSameCollection_single": { + "request": "LS0tCm5hbWU6IGFxbElzU2FtZUNvbGxlY3Rpb24KZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gWwogIElTX1NBTUVfQ09MTEVDVElPTiggIl91c2VycyIsICJfdXNlcnMvbXktdXNlciIgKSwKICBJU19TQU1FX0NPTExFQ1RJT04oICJfdXNlcnMiLCB7IF9pZDogIl91c2Vycy9teS11c2VyIiB9ICksCiAgSVNfU0FNRV9DT0xMRUNUSU9OKCAiX3VzZXJzIiwgImZvb2Jhci9iYXoiKSwKICBJU19TQU1FX0NPTExFQ1RJT04oICJfdXNlcnMiLCB7IF9pZDogInNvbWV0aGluZy9lbHNlIiB9ICkKXQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIElTX1NBTUVfQ09MTEVDVElPTiggXCJfdXNlcnNcIiwgXCJfdXNlcnMvbXktdXNlclwiICksXG4gIElTX1NBTUVfQ09MTEVDVElPTiggXCJfdXNlcnNcIiwgeyBfaWQ6IFwiX3VzZXJzL215LXVzZXJcIiB9ICksXG4gIElTX1NBTUVfQ09MTEVDVElPTiggXCJfdXNlcnNcIiwgXCJmb29iYXIvYmF6XCIpLFxuICBJU19TQU1FX0NPTExFQ1RJT04oIFwiX3VzZXJzXCIsIHsgX2lkOiBcInNvbWV0aGluZy9lbHNlXCIgfSApXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICB0cnVlLCBcbiAgICB0cnVlLCBcbiAgICBmYWxzZSwgXG4gICAgZmFsc2UgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbElzU2FtZUNvbGxlY3Rpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlJsonParse_1_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25QYXJzZV8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpTT05fUEFSU0UoIjEyMyIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1BBUlNFKFwiMTIzXCIpIiwib3V0cHV0IjoiWyBcbiAgMTIzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxKc29uUGFyc2VfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlJsonParse_2_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25QYXJzZV8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpTT05fUEFSU0UoIlsgdHJ1ZSwgZmFsc2UsIG51bGwsIC0wLjUgXSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1BBUlNFKFwiWyB0cnVlLCBmYWxzZSwgbnVsbCwgLTAuNSBdXCIpIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICB0cnVlLCBcbiAgICBmYWxzZSwgXG4gICAgbnVsbCwgXG4gICAgLTAuNSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSnNvblBhcnNlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlJsonParse_3_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25QYXJzZV8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpTT05fUEFSU0UoJ3siYSI6IDF9Jyk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1BBUlNFKCd7XCJhXCI6IDF9JykiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiYVwiIDogMSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSnNvblBhcnNlXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlJsonParse_4_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25QYXJzZV80CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpTT05fUEFSU0UoJyJhYmMiJyk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1BBUlNFKCdcImFiY1wiJykiLCJvdXRwdXQiOiJbIFxuICBcImFiY1wiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxKc29uUGFyc2VfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlJsonParse_5_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25QYXJzZV81CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIEpTT05fUEFSU0UoImFiYyIpIC8vIGludmFsaWQgSlNPTg==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1BBUlNFKFwiYWJjXCIpIC8vIGludmFsaWQgSlNPTiIsIm91dHB1dCI6IlsgXG4gIG51bGwgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEpzb25QYXJzZV81IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlJsonStringify_1_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25TdHJpbmdpZnlfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBKU09OX1NUUklOR0lGWSh0cnVlKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1NUUklOR0lGWSh0cnVlKSIsIm91dHB1dCI6IlsgXG4gIFwidHJ1ZVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxKc29uU3RyaW5naWZ5XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlJsonStringify_2_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25TdHJpbmdpZnlfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBKU09OX1NUUklOR0lGWSgiYWJjIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1NUUklOR0lGWShcImFiY1wiKSIsIm91dHB1dCI6IlsgXG4gIFwiXFxcImFiY1xcXCJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsSnNvblN0cmluZ2lmeV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlJsonStringify_3_single": { + "request": "LS0tCm5hbWU6IGFxbEpzb25TdHJpbmdpZnlfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBKU09OX1NUUklOR0lGWSggWzEsIHsnMic6IC41fV0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBKU09OX1NUUklOR0lGWSggWzEsIHsnMic6IC41fV0gKSIsIm91dHB1dCI6IlsgXG4gIFwiWzEse1xcXCIyXFxcIjowLjV9XVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxKc29uU3RyaW5naWZ5XzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlKeepRecursive_1_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfMQpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsICJmb28iKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBcImZvb1wiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmb29cIiA6IHsgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsS2VlcFJlY3Vyc2l2ZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlKeepRecursive_2_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfMgpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsICJiYXIiKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBcImJhclwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEtlZXBSZWN1cnNpdmVfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlKeepRecursive_3_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfMwpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsICJiYXoiKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBcImJhelwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJiYXpcIiA6IDQgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEtlZXBSZWN1cnNpdmVfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlKeepRecursive_4_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfNApkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsICJmb28iLCAiYmFyIik=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBcImZvb1wiLCBcImJhclwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmb29cIiA6IHsgXG4gICAgICBcImJhclwiIDogeyBcbiAgICAgICAgXCJmb29cIiA6IDEgXG4gICAgICB9IFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEtlZXBSZWN1cnNpdmVfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlKeepRecursive_5_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfNQpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsICJmb28iLCAiYmF6Iik=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBcImZvb1wiLCBcImJhelwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJiYXpcIiA6IDQsIFxuICAgIFwiZm9vXCIgOiB7IFxuICAgICAgXCJiYXpcIiA6IDMgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsS2VlcFJlY3Vyc2l2ZV81IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlKeepRecursive_6_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfNgpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsICJmb28iLCAiYmFyIiwgImJheiIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBcImZvb1wiLCBcImJhclwiLCBcImJhelwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJiYXpcIiA6IDQsIFxuICAgIFwiZm9vXCIgOiB7IFxuICAgICAgXCJiYXJcIiA6IHsgXG4gICAgICAgIFwiYmF6XCIgOiAyLCBcbiAgICAgICAgXCJmb29cIiA6IDEgXG4gICAgICB9LCBcbiAgICAgIFwiYmF6XCIgOiAzIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEtlZXBSZWN1cnNpdmVfNiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlKeepRecursive_7_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBSZWN1cnNpdmVfNwpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQX1JFQ1VSU0lWRShkb2MsIFsiZm9vIiwgImJheiJdKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUF9SRUNVUlNJVkUoZG9jLCBbXCJmb29cIiwgXCJiYXpcIl0pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImJhelwiIDogNCwgXG4gICAgXCJmb29cIiA6IHsgXG4gICAgICBcImJhelwiIDogMyBcbiAgICB9IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxLZWVwUmVjdXJzaXZlXzciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlKeep_1_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBfMQpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQKGRvYywgImZvbyIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUChkb2MsIFwiZm9vXCIpIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImZvb1wiIDogeyBcbiAgICAgIFwiYmFyXCIgOiB7IFxuICAgICAgICBcImZvb1wiIDogMSwgXG4gICAgICAgIFwiYmF6XCIgOiAyIFxuICAgICAgfSwgXG4gICAgICBcImJhelwiIDogMyBcbiAgICB9IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxLZWVwXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlKeep_2_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBfMgpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQKGRvYywgImJhciIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUChkb2MsIFwiYmFyXCIpIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsS2VlcF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlKeep_3_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBfMwpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQKGRvYywgImJheiIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUChkb2MsIFwiYmF6XCIpIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImJhelwiIDogNCBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsS2VlcF8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlKeep_4_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBfNApkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQKGRvYywgImZvbyIsICJiYXoiKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUChkb2MsIFwiZm9vXCIsIFwiYmF6XCIpIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImJhelwiIDogNCwgXG4gICAgXCJmb29cIiA6IHsgXG4gICAgICBcImJhclwiIDogeyBcbiAgICAgICAgXCJmb29cIiA6IDEsIFxuICAgICAgICBcImJhelwiIDogMiBcbiAgICAgIH0sIFxuICAgICAgXCJiYXpcIiA6IDMgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsS2VlcF80IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlKeep_5_single": { + "request": "LS0tCm5hbWU6IGFxbEtlZXBfNQpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9ClJFVFVSTiBLRUVQKGRvYywgWyJmb28iLCAiYmF6Il0p", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gS0VFUChkb2MsIFtcImZvb1wiLCBcImJhelwiXSkiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiYmF6XCIgOiA0LCBcbiAgICBcImZvb1wiIDogeyBcbiAgICAgIFwiYmFyXCIgOiB7IFxuICAgICAgICBcImZvb1wiIDogMSwgXG4gICAgICAgIFwiYmF6XCIgOiAyIFxuICAgICAgfSwgXG4gICAgICBcImJhelwiIDogMyBcbiAgICB9IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxLZWVwXzUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlLeft_1_single": { + "request": "LS0tCm5hbWU6IGFxbExlZnRfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRUZUKCJmb29iYXIiLCAzKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRUZUKFwiZm9vYmFyXCIsIDMpIiwib3V0cHV0IjoiWyBcbiAgXCJmb29cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTGVmdF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlLeft_2_single": { + "request": "LS0tCm5hbWU6IGFxbExlZnRfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRUZUKCJmb29iYXIiLCAxMCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRUZUKFwiZm9vYmFyXCIsIDEwKSIsIm91dHB1dCI6IlsgXG4gIFwiZm9vYmFyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbExlZnRfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLengthObject_single": { + "request": "LS0tCm5hbWU6IGFxbExlbmd0aE9iamVjdApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRU5HVEgoeyBuYW1lOiAiRW1tYSIsIGFnZTogMzYsIHBob25lOiB7IG1vYmlsZTogIi4uLiIgfSB9KQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoeyBuYW1lOiBcIkVtbWFcIiwgYWdlOiAzNiwgcGhvbmU6IHsgbW9iaWxlOiBcIi4uLlwiIH0gfSkiLCJvdXRwdXQiOiJbIFxuICAzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxMZW5ndGhPYmplY3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlLengthString_1_single": { + "request": "LS0tCm5hbWU6IGFxbExlbmd0aFN0cmluZ18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIExFTkdUSCgiZm9vYmFyIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoXCJmb29iYXJcIikiLCJvdXRwdXQiOiJbIFxuICA2IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxMZW5ndGhTdHJpbmdfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLengthString_2_single": { + "request": "LS0tCm5hbWU6IGFxbExlbmd0aFN0cmluZ18yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIExFTkdUSCgi55S16ISR5Z2P5LqGIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRU5HVEgoXCLnlLXohJHlnY/kuoZcIikiLCJvdXRwdXQiOiJbIFxuICA0IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxMZW5ndGhTdHJpbmdfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLevenshteinDistance_1_single": { + "request": "LS0tCm5hbWU6IGFxbExldmVuc2h0ZWluRGlzdGFuY2VfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRSgiZm9vYmFyIiwgImJhciIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRShcImZvb2JhclwiLCBcImJhclwiKSIsIm91dHB1dCI6IlsgXG4gIDMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbExldmVuc2h0ZWluRGlzdGFuY2VfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLevenshteinDistance_2_single": { + "request": "LS0tCm5hbWU6IGFxbExldmVuc2h0ZWluRGlzdGFuY2VfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRSgiICIsICIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRShcIiBcIiwgXCJcIikiLCJvdXRwdXQiOiJbIFxuICAxIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxMZXZlbnNodGVpbkRpc3RhbmNlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlLevenshteinDistance_3_single": { + "request": "LS0tCm5hbWU6IGFxbExldmVuc2h0ZWluRGlzdGFuY2VfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRSgiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyIsICJUaGUgcXVpY2sgYmxhY2sgZG9nIGp1bXBzIG92ZXIgdGhlIGJyb3duIGZveCIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRShcIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dcIiwgXCJUaGUgcXVpY2sgYmxhY2sgZG9nIGp1bXBzIG92ZXIgdGhlIGJyb3duIGZveFwiKSIsIm91dHB1dCI6IlsgXG4gIDEzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxMZXZlbnNodGVpbkRpc3RhbmNlXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlLevenshteinDistance_4_single": { + "request": "LS0tCm5hbWU6IGFxbExldmVuc2h0ZWluRGlzdGFuY2VfNApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRSgiZGVyIG3DtnTDtnIgdHLDtnRldCIsICJkZXIgdHLDtnRldCIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMRVZFTlNIVEVJTl9ESVNUQU5DRShcImRlciBtw7Z0w7ZyIHRyw7Z0ZXRcIiwgXCJkZXIgdHLDtnRldFwiKSIsIm91dHB1dCI6IlsgXG4gIDYgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbExldmVuc2h0ZWluRGlzdGFuY2VfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLikeString_1_single": { + "request": "LS0tCm5hbWU6IGFxbExpa2VTdHJpbmdfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBbCiAgTElLRSgiY2FydCIsICJjYV90IiksCiAgTElLRSgiY2Fycm90IiwgImNhX3QiKSwKICBMSUtFKCJjYXJyb3QiLCAiY2EldCIpCl0=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIExJS0UoXCJjYXJ0XCIsIFwiY2FfdFwiKSxcbiAgTElLRShcImNhcnJvdFwiLCBcImNhX3RcIiksXG4gIExJS0UoXCJjYXJyb3RcIiwgXCJjYSV0XCIpXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICB0cnVlLCBcbiAgICBmYWxzZSwgXG4gICAgdHJ1ZSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTGlrZVN0cmluZ18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlLikeString_2_single": { + "request": "LS0tCm5hbWU6IGFxbExpa2VTdHJpbmdfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBbCiAgTElLRSgiZm9vIGJhciBiYXoiLCAiYmFyIiksCiAgTElLRSgiZm9vIGJhciBiYXoiLCAiJWJhciUiKSwKICBMSUtFKCJiYXIiLCAiJWJhciUiKQpd", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIExJS0UoXCJmb28gYmFyIGJhelwiLCBcImJhclwiKSxcbiAgTElLRShcImZvbyBiYXIgYmF6XCIsIFwiJWJhciVcIiksXG4gIExJS0UoXCJiYXJcIiwgXCIlYmFyJVwiKVxuXSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgZmFsc2UsIFxuICAgIHRydWUsIFxuICAgIHRydWUgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbExpa2VTdHJpbmdfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLikeString_3_single": { + "request": "LS0tCm5hbWU6IGFxbExpa2VTdHJpbmdfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBbCiAgTElLRSgiRm9PIGJBciBCYVoiLCAiZk9vJWJBeiIpLAogIExJS0UoIkZvTyBiQXIgQmFaIiwgImZPbyViQXoiLCB0cnVlKQpd", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIExJS0UoXCJGb08gYkFyIEJhWlwiLCBcImZPbyViQXpcIiksXG4gIExJS0UoXCJGb08gYkFyIEJhWlwiLCBcImZPbyViQXpcIiwgdHJ1ZSlcbl0iLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIGZhbHNlLCBcbiAgICB0cnVlIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxMaWtlU3RyaW5nXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlLower_single": { + "request": "LS0tCm5hbWU6IGFxbExvd2VyCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIExPV0VSKCJBVk9jYWRvIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMT1dFUihcIkFWT2NhZG9cIikiLCJvdXRwdXQiOiJbIFxuICBcImF2b2NhZG9cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTG93ZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlLtrim_1_single": { + "request": "LS0tCm5hbWU6IGFxbEx0cmltXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTFRSSU0oImZvbyBiYXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMVFJJTShcImZvbyBiYXJcIikiLCJvdXRwdXQiOiJbIFxuICBcImZvbyBiYXJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTHRyaW1fMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLtrim_2_single": { + "request": "LS0tCm5hbWU6IGFxbEx0cmltXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTFRSSU0oIiAgZm9vIGJhciAgIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMVFJJTShcIiAgZm9vIGJhciAgXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJmb28gYmFyICBcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTHRyaW1fMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlLtrim_3_single": { + "request": "LS0tCm5hbWU6IGFxbEx0cmltXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTFRSSU0oIi0tPT1bZm9vLWJhcl09PS0tIiwgIi09W10iKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBMVFJJTShcIi0tPT1bZm9vLWJhcl09PS0tXCIsIFwiLT1bXVwiKSIsIm91dHB1dCI6IlsgXG4gIFwiZm9vLWJhcl09PS0tXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbEx0cmltXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMatches_1_single": { + "request": "LS0tCm5hbWU6IGFxbE1hdGNoZXNfMQpkZXNjcmlwdGlvbjogJycKLS0tCkxFVCBkb2MgPSB7CiAgbmFtZTogImphbmUiLAogIGFnZTogMjcsCiAgYWN0aXZlOiB0cnVlCn0KUkVUVVJOIE1BVENIRVMoZG9jLCB7IGFnZTogMjcsIGFjdGl2ZTogdHJ1ZSB9ICk=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7XG4gIG5hbWU6IFwiamFuZVwiLFxuICBhZ2U6IDI3LFxuICBhY3RpdmU6IHRydWVcbn1cblJFVFVSTiBNQVRDSEVTKGRvYywgeyBhZ2U6IDI3LCBhY3RpdmU6IHRydWUgfSApIiwib3V0cHV0IjoiWyBcbiAgdHJ1ZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTWF0Y2hlc18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlMatches_2_single": { + "request": "LS0tCm5hbWU6IGFxbE1hdGNoZXNfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBNQVRDSEVTKAogIHsgInRlc3QiOiAxIH0sCiAgWwogICAgeyAidGVzdCI6IDEsICJmb28iOiAiYmFyIiB9LAogICAgeyAiZm9vIjogMSB9LAogICAgeyAidGVzdCI6IDEgfQogIF0sCnRydWUp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNQVRDSEVTKFxuICB7IFwidGVzdFwiOiAxIH0sXG4gIFtcbiAgICB7IFwidGVzdFwiOiAxLCBcImZvb1wiOiBcImJhclwiIH0sXG4gICAgeyBcImZvb1wiOiAxIH0sXG4gICAgeyBcInRlc3RcIjogMSB9XG4gIF0sXG50cnVlKSIsIm91dHB1dCI6IlsgXG4gIDIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbE1hdGNoZXNfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlMd5_single": { + "request": "LS0tCm5hbWU6IGFxbE1kNQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBNRDUoImZvb2JhciIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRDUoXCJmb29iYXJcIikiLCJvdXRwdXQiOiJbIFxuICBcIjM4NThmNjIyMzBhYzNjOTE1ZjMwMGM2NjQzMTJjNjNmXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbE1kNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlMergeRecursive_1_single": { + "request": "LS0tCm5hbWU6IGFxbE1lcmdlUmVjdXJzaXZlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTUVSR0VfUkVDVVJTSVZFKAogIHsgInVzZXItMSI6IHsgIm5hbWUiOiAiSmFuZSIsICJsaXZlc0luIjogeyAiY2l0eSI6ICJMQSIgfSB9IH0sCiAgeyAidXNlci0xIjogeyAiYWdlIjogNDIsICJsaXZlc0luIjogeyAic3RhdGUiOiAiQ0EiIH0gfSB9Cik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRVJHRV9SRUNVUlNJVkUoXG4gIHsgXCJ1c2VyLTFcIjogeyBcIm5hbWVcIjogXCJKYW5lXCIsIFwibGl2ZXNJblwiOiB7IFwiY2l0eVwiOiBcIkxBXCIgfSB9IH0sXG4gIHsgXCJ1c2VyLTFcIjogeyBcImFnZVwiOiA0MiwgXCJsaXZlc0luXCI6IHsgXCJzdGF0ZVwiOiBcIkNBXCIgfSB9IH1cbikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidXNlci0xXCIgOiB7IFxuICAgICAgXCJsaXZlc0luXCIgOiB7IFxuICAgICAgICBcImNpdHlcIiA6IFwiTEFcIiwgXG4gICAgICAgIFwic3RhdGVcIiA6IFwiQ0FcIiBcbiAgICAgIH0sIFxuICAgICAgXCJuYW1lXCIgOiBcIkphbmVcIiwgXG4gICAgICBcImFnZVwiIDogNDIgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTWVyZ2VSZWN1cnNpdmVfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlMergeRecursive_2_single": { + "request": "LS0tCm5hbWU6IGFxbE1lcmdlUmVjdXJzaXZlXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTUVSR0VfUkVDVVJTSVZFKAogIFsKICAgIHsgInVzZXItMSI6IHsgIm5hbWUiOiAiSmFuZSIsICJsaXZlc0luIjogeyAiY2l0eSI6ICJMQSIgfSB9IH0sCiAgICB7ICJ1c2VyLTEiOiB7ICJhZ2UiOiA0MiwgImxpdmVzSW4iOiB7ICJjaXR5IjogIk5ZIiB9IH0gfQogIF0KKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRVJHRV9SRUNVUlNJVkUoXG4gIFtcbiAgICB7IFwidXNlci0xXCI6IHsgXCJuYW1lXCI6IFwiSmFuZVwiLCBcImxpdmVzSW5cIjogeyBcImNpdHlcIjogXCJMQVwiIH0gfSB9LFxuICAgIHsgXCJ1c2VyLTFcIjogeyBcImFnZVwiOiA0MiwgXCJsaXZlc0luXCI6IHsgXCJjaXR5XCI6IFwiTllcIiB9IH0gfVxuICBdXG4pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInVzZXItMVwiIDogeyBcbiAgICAgIFwibGl2ZXNJblwiIDogeyBcbiAgICAgICAgXCJjaXR5XCIgOiBcIk5ZXCIgXG4gICAgICB9LCBcbiAgICAgIFwibmFtZVwiIDogXCJKYW5lXCIsIFxuICAgICAgXCJhZ2VcIiA6IDQyIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbE1lcmdlUmVjdXJzaXZlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMerge_1_single": { + "request": "LS0tCm5hbWU6IGFxbE1lcmdlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTUVSR0UoCiAgeyAidXNlcjEiOiB7ICJuYW1lIjogIkphbmUiIH0gfSwKICB7ICJ1c2VyMiI6IHsgIm5hbWUiOiAiVG9tIiB9IH0KKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRVJHRShcbiAgeyBcInVzZXIxXCI6IHsgXCJuYW1lXCI6IFwiSmFuZVwiIH0gfSxcbiAgeyBcInVzZXIyXCI6IHsgXCJuYW1lXCI6IFwiVG9tXCIgfSB9XG4pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInVzZXIxXCIgOiB7IFxuICAgICAgXCJuYW1lXCIgOiBcIkphbmVcIiBcbiAgICB9LCBcbiAgICBcInVzZXIyXCIgOiB7IFxuICAgICAgXCJuYW1lXCIgOiBcIlRvbVwiIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbE1lcmdlXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMerge_2_single": { + "request": "LS0tCm5hbWU6IGFxbE1lcmdlXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTUVSR0UoCiAgeyAidXNlcnMiOiB7ICJuYW1lIjogIkphbmUiIH0gfSwKICB7ICJ1c2VycyI6IHsgIm5hbWUiOiAiVG9tIiB9IH0KKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRVJHRShcbiAgeyBcInVzZXJzXCI6IHsgXCJuYW1lXCI6IFwiSmFuZVwiIH0gfSxcbiAgeyBcInVzZXJzXCI6IHsgXCJuYW1lXCI6IFwiVG9tXCIgfSB9XG4pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInVzZXJzXCIgOiB7IFxuICAgICAgXCJuYW1lXCIgOiBcIlRvbVwiIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbE1lcmdlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMerge_3_single": { + "request": "LS0tCm5hbWU6IGFxbE1lcmdlXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTUVSR0UoCiAgWwogICAgeyBmb286ICJiYXIiIH0sCiAgICB7IHF1dXg6ICJxdWV0emFsY29hdGwiLCBydWxlZDogdHJ1ZSB9LAogICAgeyBiYXI6ICJiYXoiLCBmb286ICJkb25lIiB9CiAgXQop", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRVJHRShcbiAgW1xuICAgIHsgZm9vOiBcImJhclwiIH0sXG4gICAgeyBxdXV4OiBcInF1ZXR6YWxjb2F0bFwiLCBydWxlZDogdHJ1ZSB9LFxuICAgIHsgYmFyOiBcImJhelwiLCBmb286IFwiZG9uZVwiIH1cbiAgXVxuKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmb29cIiA6IFwiZG9uZVwiLCBcbiAgICBcInF1dXhcIiA6IFwicXVldHphbGNvYXRsXCIsIFxuICAgIFwicnVsZWRcIiA6IHRydWUsIFxuICAgIFwiYmFyXCIgOiBcImJhelwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxNZXJnZV8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlMinHashCount_single": { + "request": "LS0tCm5hbWU6IGFxbE1pbkhhc2hDb3VudApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBNSU5IQVNIX0NPVU5UKDAuMDUp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNSU5IQVNIX0NPVU5UKDAuMDUpIiwib3V0cHV0IjoiWyBcbiAgNDAwIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxNaW5IYXNoQ291bnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMinHashError_single": { + "request": "LS0tCm5hbWU6IGFxbE1pbkhhc2hFcnJvcgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBNSU5IQVNIX0VSUk9SKDQwMCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNSU5IQVNIX0VSUk9SKDQwMCkiLCJvdXRwdXQiOiJbIFxuICAwLjA1IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxNaW5IYXNoRXJyb3IiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMinHash_single": { + "request": "LS0tCm5hbWU6IGFxbE1pbkhhc2gKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gTUlOSEFTSChbImZvbyIsICJiYXIiLCAiYmF6Il0sIDUp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNSU5IQVNIKFtcImZvb1wiLCBcImJhclwiLCBcImJhelwiXSwgNSkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiT212RU9TZkFZczhcIiwgXG4gICAgXCJKY3orTFFnYWtnc1wiLCBcbiAgICBcIllmQnp5WGFTWElBXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbE1pbkhhc2giLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlMiscInRange_1_single": { + "request": "LS0tCm5hbWU6IGFxbE1pc2NJblJhbmdlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgdmFsdWUgPSA0ClJFVFVSTiBJTl9SQU5HRSh2YWx1ZSwgMywgNSwgdHJ1ZSwgdHJ1ZSkKLyogc2FtZSBhczoKICAgUkVUVVJOIHZhbHVlID49IDMgQU5EIHZhbHVlIDw9IDUKKi8=", + "response": "eyJpbnB1dCI6IkxFVCB2YWx1ZSA9IDRcblJFVFVSTiBJTl9SQU5HRSh2YWx1ZSwgMywgNSwgdHJ1ZSwgdHJ1ZSlcbi8qIHNhbWUgYXM6XG4gICBSRVRVUk4gdmFsdWUgXHUwMDNlPSAzIEFORCB2YWx1ZSBcdTAwM2M9IDVcbiovIiwib3V0cHV0IjoiWyBcbiAgdHJ1ZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTWlzY0luUmFuZ2VfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlMiscInRange_2_single": { + "request": "LS0tCm5hbWU6IGFxbE1pc2NJblJhbmdlXzIKZGVzY3JpcHRpb246ICcnCi0tLQpGT1IgdmFsdWUgSU4gMi4uNgogIFJFVFVSTiB7IHZhbHVlLCBpbl9yYW5nZTogSU5fUkFOR0UodmFsdWUsIDMsIDUsIGZhbHNlLCB0cnVlKSB9CiAgLyogc2FtZSBhczoKICAgICBSRVRVUk4geyB2YWx1ZSwgaW5fcmFuZ2U6IHZhbHVlID4gMyBBTkQgdmFsdWUgPD0gNSB9CiAgKi8=", + "response": "eyJpbnB1dCI6IkZPUiB2YWx1ZSBJTiAyLi42XG4gIFJFVFVSTiB7IHZhbHVlLCBpbl9yYW5nZTogSU5fUkFOR0UodmFsdWUsIDMsIDUsIGZhbHNlLCB0cnVlKSB9XG4gIC8qIHNhbWUgYXM6XG4gICAgIFJFVFVSTiB7IHZhbHVlLCBpbl9yYW5nZTogdmFsdWUgXHUwMDNlIDMgQU5EIHZhbHVlIFx1MDAzYz0gNSB9XG4gICovIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInZhbHVlXCIgOiAyLCBcbiAgICBcImluX3JhbmdlXCIgOiBmYWxzZSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2YWx1ZVwiIDogMywgXG4gICAgXCJpbl9yYW5nZVwiIDogZmFsc2UgXG4gIH0sIFxuICB7IFxuICAgIFwidmFsdWVcIiA6IDQsIFxuICAgIFwiaW5fcmFuZ2VcIiA6IHRydWUgXG4gIH0sIFxuICB7IFxuICAgIFwidmFsdWVcIiA6IDUsIFxuICAgIFwiaW5fcmFuZ2VcIiA6IHRydWUgXG4gIH0sIFxuICB7IFxuICAgIFwidmFsdWVcIiA6IDYsIFxuICAgIFwiaW5fcmFuZ2VcIiA6IGZhbHNlIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxNaXNjSW5SYW5nZV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlMiscInRange_3_single": { + "request": "LS0tCm5hbWU6IGFxbE1pc2NJblJhbmdlXzMKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgY29sbCA9IFsKICB7IHRleHQ6ICJmZW5uZWwiIH0sCiAgeyB0ZXh0OiAiZm94IGdyYXBlIiB9LAogIHsgdGV4dDogImZvcmVzdCBzdHJhd2JlcnJ5IiB9LAogIHsgdGV4dDogImZ1bmd1cyIgfQpdCkZPUiBkb2MgSU4gY29sbAogIEZJTFRFUiBJTl9SQU5HRShkb2MudGV4dCwiZm8iLCAiZnAiLCB0cnVlLCBmYWxzZSkgLy8gdmFsdWVzIHdpdGggcHJlZml4ICJmbyIKICAvKiBzYW1lIGFzOgogICAgIEZJTFRFUiBkb2MudGV4dCA+PSAiZm8iIEFORCBkb2MudGV4dCA8ICJmcCIKICAqLwogIFJFVFVSTiBkb2M=", + "response": "eyJpbnB1dCI6IkxFVCBjb2xsID0gW1xuICB7IHRleHQ6IFwiZmVubmVsXCIgfSxcbiAgeyB0ZXh0OiBcImZveCBncmFwZVwiIH0sXG4gIHsgdGV4dDogXCJmb3Jlc3Qgc3RyYXdiZXJyeVwiIH0sXG4gIHsgdGV4dDogXCJmdW5ndXNcIiB9XG5dXG5GT1IgZG9jIElOIGNvbGxcbiAgRklMVEVSIElOX1JBTkdFKGRvYy50ZXh0LFwiZm9cIiwgXCJmcFwiLCB0cnVlLCBmYWxzZSkgLy8gdmFsdWVzIHdpdGggcHJlZml4IFwiZm9cIlxuICAvKiBzYW1lIGFzOlxuICAgICBGSUxURVIgZG9jLnRleHQgXHUwMDNlPSBcImZvXCIgQU5EIGRvYy50ZXh0IFx1MDAzYyBcImZwXCJcbiAgKi9cbiAgUkVUVVJOIGRvYyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ0ZXh0XCIgOiBcImZveCBncmFwZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcInRleHRcIiA6IFwiZm9yZXN0IHN0cmF3YmVycnlcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsTWlzY0luUmFuZ2VfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlNgramPositionalSimilarity_single": { + "request": "LS0tCm5hbWU6IGFxbE5ncmFtUG9zaXRpb25hbFNpbWlsYXJpdHkKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gWwogIE5HUkFNX1BPU0lUSU9OQUxfU0lNSUxBUklUWSgicXVpY2sgZm94IiwgInF1aWNrIGZveHgiLCAyKSwKICBOR1JBTV9QT1NJVElPTkFMX1NJTUlMQVJJVFkoInF1aWNrIGZveCIsICJxdWljayBmb3h4IiwgMyksCiAgTkdSQU1fUE9TSVRJT05BTF9TSU1JTEFSSVRZKCJxdWljayBmb3giLCAicXVpcmt5IGZveCIsIDIpLAogIE5HUkFNX1BPU0lUSU9OQUxfU0lNSUxBUklUWSgicXVpY2sgZm94IiwgInF1aXJreSBmb3giLCAzKQpd", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIE5HUkFNX1BPU0lUSU9OQUxfU0lNSUxBUklUWShcInF1aWNrIGZveFwiLCBcInF1aWNrIGZveHhcIiwgMiksXG4gIE5HUkFNX1BPU0lUSU9OQUxfU0lNSUxBUklUWShcInF1aWNrIGZveFwiLCBcInF1aWNrIGZveHhcIiwgMyksXG4gIE5HUkFNX1BPU0lUSU9OQUxfU0lNSUxBUklUWShcInF1aWNrIGZveFwiLCBcInF1aXJreSBmb3hcIiwgMiksXG4gIE5HUkFNX1BPU0lUSU9OQUxfU0lNSUxBUklUWShcInF1aWNrIGZveFwiLCBcInF1aXJreSBmb3hcIiwgMylcbl0iLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIDAuODg4ODg4ODk1NTExNjI3MiwgXG4gICAgMC44NzUsIFxuICAgIDAuNzIyMjIyMjA4OTc2NzQ1NiwgXG4gICAgMC42NjY2NjY2ODY1MzQ4ODE2IFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxOZ3JhbVBvc2l0aW9uYWxTaW1pbGFyaXR5IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlNgramSimilarity_single": { + "request": "LS0tCm5hbWU6IGFxbE5ncmFtU2ltaWxhcml0eQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBbCiAgTkdSQU1fU0lNSUxBUklUWSgicXVpY2sgZm94IiwgInF1aWNrIGZveHgiLCAyKSwKICBOR1JBTV9TSU1JTEFSSVRZKCJxdWljayBmb3giLCAicXVpY2sgZm94eCIsIDMpLAogIE5HUkFNX1NJTUlMQVJJVFkoInF1aWNrIGZveCIsICJxdWlya3kgZm94IiwgMiksCiAgTkdSQU1fU0lNSUxBUklUWSgicXVpY2sgZm94IiwgInF1aXJreSBmb3giLCAzKQpd", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIE5HUkFNX1NJTUlMQVJJVFkoXCJxdWljayBmb3hcIiwgXCJxdWljayBmb3h4XCIsIDIpLFxuICBOR1JBTV9TSU1JTEFSSVRZKFwicXVpY2sgZm94XCIsIFwicXVpY2sgZm94eFwiLCAzKSxcbiAgTkdSQU1fU0lNSUxBUklUWShcInF1aWNrIGZveFwiLCBcInF1aXJreSBmb3hcIiwgMiksXG4gIE5HUkFNX1NJTUlMQVJJVFkoXCJxdWljayBmb3hcIiwgXCJxdWlya3kgZm94XCIsIDMpXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICAwLjg4ODg4ODg5NTUxMTYyNzIsIFxuICAgIDAuODc1LCBcbiAgICAwLjU1NTU1NTU4MjA0NjUwODgsIFxuICAgIDAuMzc1IFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxOZ3JhbVNpbWlsYXJpdHkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlOffsetInfo_single": { + "request": "LS0tCm5hbWU6IGFxbE9mZnNldEluZm8KZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZm9vZCIpOwp+ZGIuZm9vZC5zYXZlKHsgbmFtZTogImF2b2NhZG8iLCBkZXNjcmlwdGlvbjogeyBlbjogIlRoZSBhdm9jYWRvIGlzIGEgbWVkaXVtLXNpemVkLCBldmVyZ3JlZW4gdHJlZSwgbmF0aXZlIHRvIHRoZSBBbWVyaWNhcy4iIH0gfSk7Cn5kYi5mb29kLnNhdmUoeyBuYW1lOiAidG9tYXRvIiwgZGVzY3JpcHRpb246IHsgZW46ICJUaGUgdG9tYXRvIGlzIHRoZSBlZGlibGUgYmVycnkgb2YgdGhlIHRvbWF0byBwbGFudC4iIH0gfSk7Cn52YXIgYW5hbHl6ZXJzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2FuYWx5emVycyIpOwp+dmFyIGFuYWx5emVyID0gYW5hbHl6ZXJzLnNhdmUoInRleHRfZW5fb2Zmc2V0IiwgInRleHQiLCB7IGxvY2FsZTogImVuIiwgc3RvcHdvcmRzOiBbXSB9LCBbImZyZXF1ZW5jeSIsICJub3JtIiwgInBvc2l0aW9uIiwgIm9mZnNldCJdKTsKfmRiLl9jcmVhdGVWaWV3KCJmb29kX3ZpZXciLCAiYXJhbmdvc2VhcmNoIiwgeyBsaW5rczogeyBmb29kOiB7IGZpZWxkczogeyBkZXNjcmlwdGlvbjogeyBmaWVsZHM6IHsgZW46IHsgYW5hbHl6ZXJzOiBbInRleHRfZW5fb2Zmc2V0Il0gfSB9IH0gfSB9IH0gfSk7Cn5hc3NlcnQoZGIuX3F1ZXJ5KGBGT1IgZCBJTiBmb29kX3ZpZXcgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gYyBSRVRVUk4gY2ApLnRvQXJyYXkoKVswXSA9PT0gMik7CmRiLl9xdWVyeShgCiAgRk9SIGRvYyBJTiBmb29kX3ZpZXcKICAgIFNFQVJDSCBBTkFMWVpFUihUT0tFTlMoImF2b2NhZG8gdG9tYXRvIiwgInRleHRfZW5fb2Zmc2V0IikgQU5ZID09IGRvYy5kZXNjcmlwdGlvbi5lbiwgInRleHRfZW5fb2Zmc2V0IikKICAgIFJFVFVSTiBPRkZTRVRfSU5GTyhkb2MsIFsiZGVzY3JpcHRpb24uZW4iXSlgKTsKfmRiLl9kcm9wVmlldygiZm9vZF92aWV3Iik7Cn5kYi5fZHJvcCgiZm9vZCIpOwp+YW5hbHl6ZXJzLnJlbW92ZShhbmFseXplci5uYW1lKTs=", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgXG4gIEZPUiBkb2MgSU4gZm9vZF92aWV3XG4gICAgU0VBUkNIIEFOQUxZWkVSKFRPS0VOUyhcImF2b2NhZG8gdG9tYXRvXCIsIFwidGV4dF9lbl9vZmZzZXRcIikgQU5ZID09IGRvYy5kZXNjcmlwdGlvbi5lbiwgXCJ0ZXh0X2VuX29mZnNldFwiKVxuICAgIFJFVFVSTiBPRkZTRVRfSU5GTyhkb2MsIFtcImRlc2NyaXB0aW9uLmVuXCJdKWApOyIsIm91dHB1dCI6IltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiAyLCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgWyBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBbIFxuICAgICAgICBcImRlc2NyaXB0aW9uXCIsIFxuICAgICAgICBcImVuXCIgXG4gICAgICBdLCBcbiAgICAgIFwib2Zmc2V0c1wiIDogWyBcbiAgICAgICAgWyBcbiAgICAgICAgICA0LCBcbiAgICAgICAgICA3IFxuICAgICAgICBdIFxuICAgICAgXSBcbiAgICB9IFxuICBdLCBcbiAgWyBcbiAgICB7IFxuICAgICAgXCJuYW1lXCIgOiBbIFxuICAgICAgICBcImRlc2NyaXB0aW9uXCIsIFxuICAgICAgICBcImVuXCIgXG4gICAgICBdLCBcbiAgICAgIFwib2Zmc2V0c1wiIDogWyBcbiAgICAgICAgWyBcbiAgICAgICAgICA0LCBcbiAgICAgICAgICA2IFxuICAgICAgICBdLCBcbiAgICAgICAgWyBcbiAgICAgICAgICAzOCwgXG4gICAgICAgICAgNiBcbiAgICAgICAgXSBcbiAgICAgIF0gXG4gICAgfSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsT2Zmc2V0SW5mbyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlParseIdentifier_1_single": { + "request": "LS0tCm5hbWU6IGFxbFBhcnNlSWRlbnRpZmllcl8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFBBUlNFX0lERU5USUZJRVIoIl91c2Vycy9teS11c2VyIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQQVJTRV9JREVOVElGSUVSKFwiX3VzZXJzL215LXVzZXJcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiY29sbGVjdGlvblwiIDogXCJfdXNlcnNcIiwgXG4gICAgXCJrZXlcIiA6IFwibXktdXNlclwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxQYXJzZUlkZW50aWZpZXJfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlParseIdentifier_2_single": { + "request": "LS0tCm5hbWU6IGFxbFBhcnNlSWRlbnRpZmllcl8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFBBUlNFX0lERU5USUZJRVIoIHsgIl9pZCI6ICJteWNvbGxlY3Rpb24vbXlrZXkiLCAidmFsdWUiOiAic29tZSB2YWx1ZSIgfSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBQQVJTRV9JREVOVElGSUVSKCB7IFwiX2lkXCI6IFwibXljb2xsZWN0aW9uL215a2V5XCIsIFwidmFsdWVcIjogXCJzb21lIHZhbHVlXCIgfSApIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImNvbGxlY3Rpb25cIiA6IFwibXljb2xsZWN0aW9uXCIsIFxuICAgIFwia2V5XCIgOiBcIm15a2V5XCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFBhcnNlSWRlbnRpZmllcl8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRandomToken_single": { + "request": "LS0tCm5hbWU6IGFxbFJhbmRvbVRva2VuCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFsKICBSQU5ET01fVE9LRU4oOCksCiAgUkFORE9NX1RPS0VOKDgpCl0=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIFJBTkRPTV9UT0tFTig4KSxcbiAgUkFORE9NX1RPS0VOKDgpXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIkdXdXFyT21wXCIsIFxuICAgIFwiMnpDR0hnMVRcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUmFuZG9tVG9rZW4iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlRegexMatches_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4TWF0Y2hlc18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX01BVENIRVMoIk15LXVzM3JfbjRtMyIsICJeW2EtejAtOV8tXXszLDE2fSQiLCB0cnVlKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9NQVRDSEVTKFwiTXktdXMzcl9uNG0zXCIsIFwiXlthLXowLTlfLV17MywxNn0kXCIsIHRydWUpIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIk15LXVzM3JfbjRtM1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxSZWdleE1hdGNoZXNfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRegexMatches_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4TWF0Y2hlc18yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX01BVENIRVMoIiM0ZDgyaDQiLCAiXiM/KFthLWYwLTldezZ9fFthLWYwLTldezN9KSQiLCB0cnVlKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9NQVRDSEVTKFwiIzRkODJoNFwiLCBcIl4jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkXCIsIHRydWUpIiwib3V0cHV0IjoiWyBcbiAgbnVsbCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUmVnZXhNYXRjaGVzXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlRegexMatches_3_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4TWF0Y2hlc18zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX01BVENIRVMoImpvaG5AZG9lLmNvbSIsICJeKFthLXowLTlfXFxcXC4tXSspQChbXFxcXGRhLXotXSspXFxcXC4oW2EtelxcXFwuXXsyLDZ9KSQiLCBmYWxzZSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9NQVRDSEVTKFwiam9obkBkb2UuY29tXCIsIFwiXihbYS16MC05X1xcXFxcXFxcLi1dKylAKFtcXFxcXFxcXGRhLXotXSspXFxcXFxcXFwuKFthLXpcXFxcXFxcXC5dezIsNn0pJFwiLCBmYWxzZSkiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiam9obkBkb2UuY29tXCIsIFxuICAgIFwiam9oblwiLCBcbiAgICBcImRvZVwiLCBcbiAgICBcImNvbVwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxSZWdleE1hdGNoZXNfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRegexReplace_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4UmVwbGFjZV8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX1JFUExBQ0UoInRoZSBxdWljayBicm93biBmb3giLCAidGhlLipmb3giLCAianVtcGVkIG92ZXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9SRVBMQUNFKFwidGhlIHF1aWNrIGJyb3duIGZveFwiLCBcInRoZS4qZm94XCIsIFwianVtcGVkIG92ZXJcIikiLCJvdXRwdXQiOiJbIFxuICBcImp1bXBlZCBvdmVyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4UmVwbGFjZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRegexReplace_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4UmVwbGFjZV8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX1JFUExBQ0UoIkFuIEF2b2NhZG8iLCAiYSIsICJfIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9SRVBMQUNFKFwiQW4gQXZvY2Fkb1wiLCBcImFcIiwgXCJfXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJBbiBBdm9jX2RvXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4UmVwbGFjZV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRegexReplace_3_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4UmVwbGFjZV8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX1JFUExBQ0UoIkFuIEF2b2NhZG8iLCAiYSIsICJfIiwgdHJ1ZSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9SRVBMQUNFKFwiQW4gQXZvY2Fkb1wiLCBcImFcIiwgXCJfXCIsIHRydWUpIiwib3V0cHV0IjoiWyBcbiAgXCJfbiBfdm9jX2RvXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4UmVwbGFjZV8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRegexSplit_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4U3BsaXRfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRUdFWF9TUExJVCgiVGhpcyBpcyBhIGxpbmUuXFxuIFRoaXMgaXMgeWV0IGFub3RoZXIgbGluZVxcclxcbiBUaGlzIGFnYWluIGlzIGEgbGluZS5cXHIgTWFjIGxpbmUgIiwgIlxcXFwuP1xcclxcbnxcXHJ8XFxuIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9TUExJVChcIlRoaXMgaXMgYSBsaW5lLlxcXFxuIFRoaXMgaXMgeWV0IGFub3RoZXIgbGluZVxcXFxyXFxcXG4gVGhpcyBhZ2FpbiBpcyBhIGxpbmUuXFxcXHIgTWFjIGxpbmUgXCIsIFwiXFxcXFxcXFwuP1xcXFxyXFxcXG58XFxcXHJ8XFxcXG5cIikiLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiVGhpcyBpcyBhIGxpbmUuXCIsIFxuICAgIFwiIFRoaXMgaXMgeWV0IGFub3RoZXIgbGluZVwiLCBcbiAgICBcIiBUaGlzIGFnYWluIGlzIGEgbGluZS5cIiwgXG4gICAgXCIgTWFjIGxpbmUgXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4U3BsaXRfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRegexSplit_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4U3BsaXRfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRUdFWF9TUExJVCgiaHlwZXJ0ZXh0IGxhbmd1YWdlLCBwcm9ncmFtbWluZyIsICJbXFxcXHMsIF0rIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9TUExJVChcImh5cGVydGV4dCBsYW5ndWFnZSwgcHJvZ3JhbW1pbmdcIiwgXCJbXFxcXFxcXFxzLCBdK1wiKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJoeXBlcnRleHRcIiwgXG4gICAgXCJsYW5ndWFnZVwiLCBcbiAgICBcInByb2dyYW1taW5nXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4U3BsaXRfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRegexSplit_3_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4U3BsaXRfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBbCiAgUkVHRVhfU1BMSVQoIkNhcHR1cmUgdGhlIGFydGljbGUiLCAiKHRoZSkiKSwKICBSRUdFWF9TUExJVCgiRG9uJ3QgY2FwdHVyZSB0aGUgYXJ0aWNsZSIsICJ0aGUiKQpd", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIFJFR0VYX1NQTElUKFwiQ2FwdHVyZSB0aGUgYXJ0aWNsZVwiLCBcIih0aGUpXCIpLFxuICBSRUdFWF9TUExJVChcIkRvbid0IGNhcHR1cmUgdGhlIGFydGljbGVcIiwgXCJ0aGVcIilcbl0iLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFsgXG4gICAgICBcIkNhcHR1cmUgXCIsIFxuICAgICAgXCJ0aGVcIiwgXG4gICAgICBcIiBhcnRpY2xlXCIgXG4gICAgXSwgXG4gICAgWyBcbiAgICAgIFwiRG9uJ3QgY2FwdHVyZSBcIiwgXG4gICAgICBcIiBhcnRpY2xlXCIgXG4gICAgXSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUmVnZXhTcGxpdF8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRegexSplit_4_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4U3BsaXRfNApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRUdFWF9TUExJVCgiY0EsQmMsQSxCY0EsQmNBLEJjIiwgImEsYiIsIHRydWUsIDMp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9TUExJVChcImNBLEJjLEEsQmNBLEJjQSxCY1wiLCBcImEsYlwiLCB0cnVlLCAzKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJjXCIsIFxuICAgIFwiYyxcIiwgXG4gICAgXCJjXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4U3BsaXRfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRegexTest_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4VGVzdF8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX1RFU1QoInRoZSBxdWljayBicm93biBmb3giLCAidGhlLipmb3giKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9URVNUKFwidGhlIHF1aWNrIGJyb3duIGZveFwiLCBcInRoZS4qZm94XCIpIiwib3V0cHV0IjoiWyBcbiAgdHJ1ZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUmVnZXhUZXN0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlRegexTest_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4VGVzdF8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX1RFU1QoInRoZSBxdWljayBicm93biBmb3giLCAiXihhfHRoZSlcXFxccysocXVpY2t8c2xvdykuKmYueCQiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9URVNUKFwidGhlIHF1aWNrIGJyb3duIGZveFwiLCBcIl4oYXx0aGUpXFxcXFxcXFxzKyhxdWlja3xzbG93KS4qZi54JFwiKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4VGVzdF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRegexTest_3_single": { + "request": "LS0tCm5hbWU6IGFxbFJlZ2V4VGVzdF8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFJFR0VYX1RFU1QoInRoZVxcbnF1aWNrXFxuYnJvd25cXG5mb3giLCAiXnRoZShcXG5bYS13XSspK1xcbmZveCQiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRUdFWF9URVNUKFwidGhlXFxcXG5xdWlja1xcXFxuYnJvd25cXFxcbmZveFwiLCBcIl50aGUoXFxcXG5bYS13XSspK1xcXFxuZm94JFwiKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJlZ2V4VGVzdF8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlReverse_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJldmVyc2VfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRVZFUlNFKCJmb29iYXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVZFUlNFKFwiZm9vYmFyXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJyYWJvb2ZcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUmV2ZXJzZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlReverse_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJldmVyc2VfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBSRVZFUlNFKCLnlLXohJHlnY/kuoYiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSRVZFUlNFKFwi55S16ISR5Z2P5LqGXCIpIiwib3V0cHV0IjoiWyBcbiAgXCLkuoblnY/ohJHnlLVcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUmV2ZXJzZV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRight_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJpZ2h0XzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUklHSFQoImZvb2JhciIsIDMp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSSUdIVChcImZvb2JhclwiLCAzKSIsIm91dHB1dCI6IlsgXG4gIFwiYmFyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJpZ2h0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlRight_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJpZ2h0XzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUklHSFQoImZvb2JhciIsIDEwKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSSUdIVChcImZvb2JhclwiLCAxMCkiLCJvdXRwdXQiOiJbIFxuICBcImZvb2JhclwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxSaWdodF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlRtrim_1_single": { + "request": "LS0tCm5hbWU6IGFxbFJ0cmltXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUlRSSU0oImZvbyBiYXIiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSVFJJTShcImZvbyBiYXJcIikiLCJvdXRwdXQiOiJbIFxuICBcImZvbyBiYXJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUnRyaW1fMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRtrim_2_single": { + "request": "LS0tCm5hbWU6IGFxbFJ0cmltXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUlRSSU0oIiAgZm9vIGJhciAgIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSVFJJTShcIiAgZm9vIGJhciAgXCIpIiwib3V0cHV0IjoiWyBcbiAgXCIgIGZvbyBiYXJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsUnRyaW1fMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlRtrim_3_single": { + "request": "LS0tCm5hbWU6IGFxbFJ0cmltXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gUlRSSU0oIi0tPT1bZm9vLWJhcl09PS0tIiwgIi09W10iKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBSVFJJTShcIi0tPT1bZm9vLWJhcl09PS0tXCIsIFwiLT1bXVwiKSIsIm91dHB1dCI6IlsgXG4gIFwiLS09PVtmb28tYmFyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFJ0cmltXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSha1_single": { + "request": "LS0tCm5hbWU6IGFxbFNoYTEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU0hBMSgiZm9vYmFyIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTSEExKFwiZm9vYmFyXCIpIiwib3V0cHV0IjoiWyBcbiAgXCI4ODQzZDdmOTI0MTYyMTFkZTllYmI5NjNmZjRjZTI4MTI1OTMyODc4XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFNoYTEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSha256_single": { + "request": "LS0tCm5hbWU6IGFxbFNoYTI1NgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTSEEyNTYoImZvb2JhciIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTSEEyNTYoXCJmb29iYXJcIikiLCJvdXRwdXQiOiJbIFxuICBcImMzYWI4ZmYxMzcyMGU4YWQ5MDQ3ZGQzOTQ2NmIzYzg5NzRlNTkyYzJmYTM4M2Q0YTM5NjA3MTRjYWVmMGM0ZjJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsU2hhMjU2IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSha512_single": { + "request": "LS0tCm5hbWU6IGFxbFNoYTUxMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTSEE1MTIoImZvb2JhciIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTSEE1MTIoXCJmb29iYXJcIikiLCJvdXRwdXQiOiJbIFxuICBcIjBhNTAyNjFlYmQxYTM5MGZlZDJiZjMyNmYyNjczYzE0NTU4MmE2MzQyZDUyMzIwNDk3M2QwMjE5MzM3ZjgxNjE2YTgwNjliMDEyNTg3Y2Y1NjM1ZjY5MjVmMWI1NmMzNjAyMzBjMTliMjczNTAwZWUwMTNlMDMwNjAxYmYyNDI1XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFNoYTUxMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlSoundex_single": { + "request": "LS0tCm5hbWU6IGFxbFNvdW5kZXgKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gWwogIFNPVU5ERVgoImV4YW1wbGUiKSwKICBTT1VOREVYKCJla3phbXB1bCIpLAogIFNPVU5ERVgoInNvdW5kZXgiKSwKICBTT1VOREVYKCJzb3VudGVrcyIpCl0=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIFNPVU5ERVgoXCJleGFtcGxlXCIpLFxuICBTT1VOREVYKFwiZWt6YW1wdWxcIiksXG4gIFNPVU5ERVgoXCJzb3VuZGV4XCIpLFxuICBTT1VOREVYKFwic291bnRla3NcIilcbl0iLCJvdXRwdXQiOiJbIFxuICBbIFxuICAgIFwiRTI1MVwiLCBcbiAgICBcIkUyNTFcIiwgXG4gICAgXCJTNTMyXCIsIFxuICAgIFwiUzUzMlwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTb3VuZGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSplit_1_single": { + "request": "LS0tCm5hbWU6IGFxbFNwbGl0XzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1BMSVQoICJmb28tYmFyLWJheiIsICItIiAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTUExJVCggXCJmb28tYmFyLWJhelwiLCBcIi1cIiApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImZvb1wiLCBcbiAgICBcImJhclwiLCBcbiAgICBcImJhelwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTcGxpdF8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSplit_2_single": { + "request": "LS0tCm5hbWU6IGFxbFNwbGl0XzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1BMSVQoICJmb28tYmFyLWJheiIsICItIiwgMSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTUExJVCggXCJmb28tYmFyLWJhelwiLCBcIi1cIiwgMSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImZvb1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTcGxpdF8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSplit_3_single": { + "request": "LS0tCm5hbWU6IGFxbFNwbGl0XzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1BMSVQoICJmb28sIGJhciAmIGJheiIsIFsgIiwgIiwgIiAmICIgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTUExJVCggXCJmb28sIGJhciBcdTAwMjYgYmF6XCIsIFsgXCIsIFwiLCBcIiBcdTAwMjYgXCIgXSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcImZvb1wiLCBcbiAgICBcImJhclwiLCBcbiAgICBcImJhelwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTcGxpdF8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlStartsWith_1_single": { + "request": "LS0tCm5hbWU6IGFxbFN0YXJ0c1dpdGhfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVEFSVFNfV0lUSCgiZm9vYmFyIiwgImZvbyIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVEFSVFNfV0lUSChcImZvb2JhclwiLCBcImZvb1wiKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN0YXJ0c1dpdGhfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlStartsWith_2_single": { + "request": "LS0tCm5hbWU6IGFxbFN0YXJ0c1dpdGhfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVEFSVFNfV0lUSCgiZm9vYmFyIiwgImJheiIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVEFSVFNfV0lUSChcImZvb2JhclwiLCBcImJhelwiKSIsIm91dHB1dCI6IlsgXG4gIGZhbHNlIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTdGFydHNXaXRoXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlStartsWith_3_single": { + "request": "LS0tCm5hbWU6IGFxbFN0YXJ0c1dpdGhfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVEFSVFNfV0lUSCgiZm9vYmFyIiwgWyJiYXIiLCAiZm9vIl0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVEFSVFNfV0lUSChcImZvb2JhclwiLCBbXCJiYXJcIiwgXCJmb29cIl0pIiwib3V0cHV0IjoiWyBcbiAgdHJ1ZSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsU3RhcnRzV2l0aF8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlStartsWith_4_single": { + "request": "LS0tCm5hbWU6IGFxbFN0YXJ0c1dpdGhfNApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVEFSVFNfV0lUSCgiZm9vYmFyIiwgWyJiYXIiLCAiYmF6Il0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVEFSVFNfV0lUSChcImZvb2JhclwiLCBbXCJiYXJcIiwgXCJiYXpcIl0pIiwib3V0cHV0IjoiWyBcbiAgZmFsc2UgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN0YXJ0c1dpdGhfNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlSubstitute_1_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCAidGhlIHF1aWNrIGJyb3duIGZveHgiLCAicXVpY2siLCAibGF6eSIgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKCBcInRoZSBxdWljayBicm93biBmb3h4XCIsIFwicXVpY2tcIiwgXCJsYXp5XCIgKSIsIm91dHB1dCI6IlsgXG4gIFwidGhlIGxhenkgYnJvd24gZm94eFwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTdWJzdGl0dXRlXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSubstitute_2_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCAidGhlIHF1aWNrIGJyb3duIGZveHgiLCBbICJxdWljayIsICJmb3h4IiBdLCBbICJzbG93IiwgImRvZyIgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKCBcInRoZSBxdWljayBicm93biBmb3h4XCIsIFsgXCJxdWlja1wiLCBcImZveHhcIiBdLCBbIFwic2xvd1wiLCBcImRvZ1wiIF0gKSIsIm91dHB1dCI6IlsgXG4gIFwidGhlIHNsb3cgYnJvd24gZG9nXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0aXR1dGVfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlSubstitute_3_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCAidGhlIHF1aWNrIGJyb3duIGZveHgiLCBbICJ0aGUiLCAiZm94eCIgXSwgWyAidGhhdCIsICJkb2ciIF0sIDEgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKCBcInRoZSBxdWljayBicm93biBmb3h4XCIsIFsgXCJ0aGVcIiwgXCJmb3h4XCIgXSwgWyBcInRoYXRcIiwgXCJkb2dcIiBdLCAxICkiLCJvdXRwdXQiOiJbIFxuICBcInRoYXQgcXVpY2sgYnJvd24gZm94eFwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTdWJzdGl0dXRlXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSubstitute_4_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfNApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCAidGhlIHF1aWNrIGJyb3duIGZveHgiLCBbICJ0aGUiLCAicXVpY2siLCAiZm94eCIgXSwgWyAiQSIsICJWT0lEISIgXSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKCBcInRoZSBxdWljayBicm93biBmb3h4XCIsIFsgXCJ0aGVcIiwgXCJxdWlja1wiLCBcImZveHhcIiBdLCBbIFwiQVwiLCBcIlZPSUQhXCIgXSApIiwib3V0cHV0IjoiWyBcbiAgXCJBIFZPSUQhIGJyb3duIFwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTdWJzdGl0dXRlXzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSubstitute_5_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfNQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCAidGhlIHF1aWNrIGJyb3duIGZveHgiLCBbICJxdWljayIsICJmb3h4IiBdLCAieHgiICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKCBcInRoZSBxdWljayBicm93biBmb3h4XCIsIFsgXCJxdWlja1wiLCBcImZveHhcIiBdLCBcInh4XCIgKSIsIm91dHB1dCI6IlsgXG4gIFwidGhlIHh4IGJyb3duIHh4XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0aXR1dGVfNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlSubstitute_6_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfNgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCJ0aGUgcXVpY2sgYnJvd24gZm94eCIsIHsKICAicXVpY2siOiAic21hbGwiLAogICJicm93biI6ICJzbG93IiwKICAiZm94eCI6ICJhbnQiCn0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKFwidGhlIHF1aWNrIGJyb3duIGZveHhcIiwge1xuICBcInF1aWNrXCI6IFwic21hbGxcIixcbiAgXCJicm93blwiOiBcInNsb3dcIixcbiAgXCJmb3h4XCI6IFwiYW50XCJcbn0pIiwib3V0cHV0IjoiWyBcbiAgXCJ0aGUgc21hbGwgc2xvdyBhbnRcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsU3Vic3RpdHV0ZV82IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSubstitute_7_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfNwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCJ0aGUgcXVpY2sgYnJvd24gZm94eCIsIHsgCiAgInF1aWNrIjogIiIsCiAgImJyb3duIjogbnVsbCwKICAiZm94eCI6ICJhbnQiCn0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKFwidGhlIHF1aWNrIGJyb3duIGZveHhcIiwgeyBcbiAgXCJxdWlja1wiOiBcIlwiLFxuICBcImJyb3duXCI6IG51bGwsXG4gIFwiZm94eFwiOiBcImFudFwiXG59KSIsIm91dHB1dCI6IlsgXG4gIFwidGhlICAgYW50XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0aXR1dGVfNyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlSubstitute_8_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0aXR1dGVfOApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBTVUJTVElUVVRFKCJ0aGUgcXVpY2sgYnJvd24gZm94eCIsIHsKICAicXVpY2siOiAic21hbGwiLAogICJicm93biI6ICJzbG93IiwKICAiZm94eCI6ICJhbnQiCn0sIDIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVElUVVRFKFwidGhlIHF1aWNrIGJyb3duIGZveHhcIiwge1xuICBcInF1aWNrXCI6IFwic21hbGxcIixcbiAgXCJicm93blwiOiBcInNsb3dcIixcbiAgXCJmb3h4XCI6IFwiYW50XCJcbn0sIDIpIiwib3V0cHV0IjoiWyBcbiAgXCJ0aGUgc21hbGwgc2xvdyBmb3h4XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0aXR1dGVfOCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlSubstringBytes_1_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ0J5dGVzXzEKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1VCU1RSSU5HX0JZVEVTKCJXZSDinaTvuI8gYXZvY2FkbyEiLCAxMCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkdfQllURVMoXCJXZSDinaTvuI8gYXZvY2FkbyFcIiwgMTApIiwib3V0cHV0IjoiWyBcbiAgXCJhdm9jYWRvIVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTdWJzdHJpbmdCeXRlc18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSubstringBytes_2_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ0J5dGVzXzIKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1VCU1RSSU5HX0JZVEVTKCJXZSDinaTvuI8gYXZvY2FkbyEiLCAzLCAzKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkdfQllURVMoXCJXZSDinaTvuI8gYXZvY2FkbyFcIiwgMywgMykiLCJvdXRwdXQiOiJbIFxuICBcIuKdpFwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxTdWJzdHJpbmdCeXRlc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSubstringBytes_3_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ0J5dGVzXzMKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1VCU1RSSU5HX0JZVEVTKCJXZSDinaTvuI8gYXZvY2FkbyEiLCAtMTUsIDYp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkdfQllURVMoXCJXZSDinaTvuI8gYXZvY2FkbyFcIiwgLTE1LCA2KSIsIm91dHB1dCI6IlsgXG4gIFwi4p2k77iPXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0cmluZ0J5dGVzXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSubstringBytes_4_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ0J5dGVzXzQKZGVzY3JpcHRpb246ICcnCi0tLQpSRVRVUk4gU1VCU1RSSU5HX0JZVEVTKCJXZSDinaTvuI8gYXZvY2FkbyEiLCAtMTUsIDQp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkdfQllURVMoXCJXZSDinaTvuI8gYXZvY2FkbyFcIiwgLTE1LCA0KSIsIm91dHB1dCI6IlsgXG4gIG51bGwgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0cmluZ0J5dGVzXzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSubstring_1_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFNVQlNUUklORygiSG9seSBHdWFjYW1vbGUhIiwgNSk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkcoXCJIb2x5IEd1YWNhbW9sZSFcIiwgNSkiLCJvdXRwdXQiOiJbIFxuICBcIkd1YWNhbW9sZSFcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsU3Vic3RyaW5nXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlSubstring_2_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ18yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFNVQlNUUklORygiSG9seSBHdWFjYW1vbGUhIiwgMTAsIDQp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkcoXCJIb2x5IEd1YWNhbW9sZSFcIiwgMTAsIDQpIiwib3V0cHV0IjoiWyBcbiAgXCJtb2xlXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0cmluZ18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlSubstring_3_single": { + "request": "LS0tCm5hbWU6IGFxbFN1YnN0cmluZ18zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFNVQlNUUklORygiSG9seSBHdWFjYW1vbGUhIiwgLTUsIDQp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTVUJTVFJJTkcoXCJIb2x5IEd1YWNhbW9sZSFcIiwgLTUsIDQpIiwib3V0cHV0IjoiWyBcbiAgXCJtb2xlXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFN1YnN0cmluZ18zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlToBase64_single": { + "request": "LS0tCm5hbWU6IGFxbFRvQmFzZTY0CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFsKICBUT19CQVNFNjQoIkFCQy4iKSwKICBUT19CQVNFNjQoIjEyMzQ1NiIpCl0=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIFRPX0JBU0U2NChcIkFCQy5cIiksXG4gIFRPX0JBU0U2NChcIjEyMzQ1NlwiKVxuXSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJRVUpETGc9PVwiLCBcbiAgICBcIk1USXpORFUyXCIgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRvQmFzZTY0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlToHex_single": { + "request": "LS0tCm5hbWU6IGFxbFRvSGV4CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFsKICBUT19IRVgoIkFCQy4iKSwKICBUT19IRVgoIsO8IikKXQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBbXG4gIFRPX0hFWChcIkFCQy5cIiksXG4gIFRPX0hFWChcIsO8XCIpXG5dIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIjQxNDI0MzJlXCIsIFxuICAgIFwiYzNiY1wiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxUb0hleCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlTokens_1_single": { + "request": "LS0tCm5hbWU6IGFxbFRva2Vuc18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRPS0VOUygiTMO2cmVtIGlwc8O8bSwgRE9MT1IgU0lUIMOEbWV0LiIsICJ0ZXh0X2RlIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUT0tFTlMoXCJMw7ZyZW0gaXBzw7xtLCBET0xPUiBTSVQgw4RtZXQuXCIsIFwidGV4dF9kZVwiKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgXCJsb3JcIiwgXG4gICAgXCJpcHN1bVwiLCBcbiAgICBcImRvbG9yXCIsIFxuICAgIFwic2l0XCIsIFxuICAgIFwiYW1ldFwiIFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxUb2tlbnNfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlTokens_2_single": { + "request": "LS0tCm5hbWU6IGFxbFRva2Vuc18yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRPS0VOUygicXVpY2sgYnJvd24gZm94IiwgInRleHRfZW4iKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUT0tFTlMoXCJxdWljayBicm93biBmb3hcIiwgXCJ0ZXh0X2VuXCIpIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcInF1aWNrXCIsIFxuICAgIFwiYnJvd25cIiwgXG4gICAgXCJmb3hcIiBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVG9rZW5zXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlTokens_3_single": { + "request": "LS0tCm5hbWU6IGFxbFRva2Vuc18zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRPS0VOUyhbInF1aWNrIGJyb3duIiwgImZveCJdLCAidGV4dF9lbiIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUT0tFTlMoW1wicXVpY2sgYnJvd25cIiwgXCJmb3hcIl0sIFwidGV4dF9lblwiKSIsIm91dHB1dCI6IlsgXG4gIFsgXG4gICAgWyBcbiAgICAgIFwicXVpY2tcIiwgXG4gICAgICBcImJyb3duXCIgXG4gICAgXSwgXG4gICAgWyBcbiAgICAgIFwiZm94XCIgXG4gICAgXSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVG9rZW5zXzMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlTokens_4_single": { + "request": "LS0tCm5hbWU6IGFxbFRva2Vuc180CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRPS0VOUyhbInF1aWNrIGJyb3duIiwgWyJmb3giXV0sICJ0ZXh0X2VuIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUT0tFTlMoW1wicXVpY2sgYnJvd25cIiwgW1wiZm94XCJdXSwgXCJ0ZXh0X2VuXCIpIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBbIFxuICAgICAgXCJxdWlja1wiLCBcbiAgICAgIFwiYnJvd25cIiBcbiAgICBdLCBcbiAgICBbIFxuICAgICAgWyBcbiAgICAgICAgXCJmb3hcIiBcbiAgICAgIF0gXG4gICAgXSBcbiAgXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVG9rZW5zXzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlTranslate_1_single": { + "request": "LS0tCm5hbWU6IGFxbFRyYW5zbGF0ZV8xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRSQU5TTEFURSgiRlIiLCB7IFVTOiAiVW5pdGVkIFN0YXRlcyIsIFVLOiAiVW5pdGVkIEtpbmdkb20iLCBGUjogIkZyYW5jZSIgfSAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUkFOU0xBVEUoXCJGUlwiLCB7IFVTOiBcIlVuaXRlZCBTdGF0ZXNcIiwgVUs6IFwiVW5pdGVkIEtpbmdkb21cIiwgRlI6IFwiRnJhbmNlXCIgfSApIiwib3V0cHV0IjoiWyBcbiAgXCJGcmFuY2VcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVHJhbnNsYXRlXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlTranslate_2_single": { + "request": "LS0tCm5hbWU6IGFxbFRyYW5zbGF0ZV8yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRSQU5TTEFURSg0MiwgeyBmb286ICJiYXIiLCBiYXI6ICJiYXoiIH0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUkFOU0xBVEUoNDIsIHsgZm9vOiBcImJhclwiLCBiYXI6IFwiYmF6XCIgfSApIiwib3V0cHV0IjoiWyBcbiAgNDIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRyYW5zbGF0ZV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlTranslate_3_single": { + "request": "LS0tCm5hbWU6IGFxbFRyYW5zbGF0ZV8zCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRSQU5TTEFURSg0MiwgeyBmb286ICJiYXIiLCBiYXI6ICJiYXoiIH0sICJub3QgZm91bmQhIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUkFOU0xBVEUoNDIsIHsgZm9vOiBcImJhclwiLCBiYXI6IFwiYmF6XCIgfSwgXCJub3QgZm91bmQhXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJub3QgZm91bmQhXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRyYW5zbGF0ZV8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlTranslate_4_single": { + "request": "LS0tCm5hbWU6IGFxbFRyYW5zbGF0ZV80CmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFRSQU5TTEFURSg0MiwgeyAiNDIiOiB0cnVlIH0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUkFOU0xBVEUoNDIsIHsgXCI0MlwiOiB0cnVlIH0gKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRyYW5zbGF0ZV80IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlTrim_1_single": { + "request": "LS0tCm5hbWU6IGFxbFRyaW1fMQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBUUklNKCJmb28gYmFyIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUklNKFwiZm9vIGJhclwiKSIsIm91dHB1dCI6IlsgXG4gIFwiZm9vIGJhclwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxUcmltXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlTrim_2_single": { + "request": "LS0tCm5hbWU6IGFxbFRyaW1fMgpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBUUklNKCIgIGZvbyBiYXIgICIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUklNKFwiICBmb28gYmFyICBcIikiLCJvdXRwdXQiOiJbIFxuICBcImZvbyBiYXJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVHJpbV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlTrim_3_single": { + "request": "LS0tCm5hbWU6IGFxbFRyaW1fMwpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBUUklNKCItLT09W2Zvby1iYXJdPT0tLSIsICItPVtdIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUklNKFwiLS09PVtmb28tYmFyXT09LS1cIiwgXCItPVtdXCIpIiwib3V0cHV0IjoiWyBcbiAgXCJmb28tYmFyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRyaW1fMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlTrim_4_single": { + "request": "LS0tCm5hbWU6IGFxbFRyaW1fNApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBUUklNKCIgIGZvb2JhclxcdCBcXHJcXG4gIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUklNKFwiICBmb29iYXJcXFxcdCBcXFxcclxcXFxuIFwiKSIsIm91dHB1dCI6IlsgXG4gIFwiZm9vYmFyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRyaW1fNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlTrim_5_single": { + "request": "LS0tCm5hbWU6IGFxbFRyaW1fNQpkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBUUklNKCI7Zm9vO2JhcjtiYXosICIsICIsOyAiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBUUklNKFwiO2ZvbztiYXI7YmF6LCBcIiwgXCIsOyBcIikiLCJvdXRwdXQiOiJbIFxuICBcImZvbztiYXI7YmF6XCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFRyaW1fNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlUnsetRecursive_1_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgImZvbyIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgXCJmb29cIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiYmF6XCIgOiA0IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxVbnNldFJlY3Vyc2l2ZV8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlUnsetRecursive_2_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzIKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgImJhciIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgXCJiYXJcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiYmF6XCIgOiA0LCBcbiAgICBcImZvb1wiIDogeyBcbiAgICAgIFwiYmF6XCIgOiAzIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFVuc2V0UmVjdXJzaXZlXzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlUnsetRecursive_3_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzMKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgImJheiIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgXCJiYXpcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiZm9vXCIgOiB7IFxuICAgICAgXCJiYXJcIiA6IHsgXG4gICAgICAgIFwiZm9vXCIgOiAxIFxuICAgICAgfSBcbiAgICB9IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxVbnNldFJlY3Vyc2l2ZV8zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlUnsetRecursive_4_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzQKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgImZvbyIsICJiYXIiKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgXCJmb29cIiwgXCJiYXJcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiYmF6XCIgOiA0IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxVbnNldFJlY3Vyc2l2ZV80IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlUnsetRecursive_5_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzUKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgImZvbyIsICJiYXoiKQ==", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgXCJmb29cIiwgXCJiYXpcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxVbnNldFJlY3Vyc2l2ZV81IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlUnsetRecursive_6_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzYKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgImZvbyIsICJiYXIiLCAiYmF6Iik=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxVbnNldFJlY3Vyc2l2ZV82IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlUnsetRecursive_7_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0UmVjdXJzaXZlXzcKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgWyJiYXoiXSk=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVRfUkVDVVJTSVZFKGRvYywgW1wiYmF6XCJdKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmb29cIiA6IHsgXG4gICAgICBcImJhclwiIDogeyBcbiAgICAgICAgXCJmb29cIiA6IDEgXG4gICAgICB9IFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFVuc2V0UmVjdXJzaXZlXzciLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlUnset_1_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0XzEKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVQoZG9jLCAiZm9vIik=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVQoZG9jLCBcImZvb1wiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJiYXpcIiA6IDQgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFVuc2V0XzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlUnset_2_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0XzIKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVQoZG9jLCAiYmFyIik=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVQoZG9jLCBcImJhclwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJiYXpcIiA6IDQsIFxuICAgIFwiZm9vXCIgOiB7IFxuICAgICAgXCJiYXJcIiA6IHsgXG4gICAgICAgIFwiZm9vXCIgOiAxLCBcbiAgICAgICAgXCJiYXpcIiA6IDIgXG4gICAgICB9LCBcbiAgICAgIFwiYmF6XCIgOiAzIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFVuc2V0XzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlUnset_3_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0XzMKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVQoZG9jLCAiYmF6Iik=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVQoZG9jLCBcImJhelwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmb29cIiA6IHsgXG4gICAgICBcImJhclwiIDogeyBcbiAgICAgICAgXCJmb29cIiA6IDEsIFxuICAgICAgICBcImJhelwiIDogMiBcbiAgICAgIH0sIFxuICAgICAgXCJiYXpcIiA6IDMgXG4gICAgfSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVW5zZXRfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlUnset_4_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0XzQKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVQoZG9jLCAiZm9vIiwgImJheiIp", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVQoZG9jLCBcImZvb1wiLCBcImJhelwiKSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFVuc2V0XzQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlUnset_5_single": { + "request": "LS0tCm5hbWU6IGFxbFVuc2V0XzUKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgZG9jID0geyBmb286IHsgYmFyOiB7IGZvbzogMSwgYmF6OiAyIH0sIGJhejogMyB9LCBiYXo6IDQgfQpSRVRVUk4gVU5TRVQoZG9jLCBbImZvbyIsICJiYXIiXSk=", + "response": "eyJpbnB1dCI6IkxFVCBkb2MgPSB7IGZvbzogeyBiYXI6IHsgZm9vOiAxLCBiYXo6IDIgfSwgYmF6OiAzIH0sIGJhejogNCB9XG5SRVRVUk4gVU5TRVQoZG9jLCBbXCJmb29cIiwgXCJiYXJcIl0pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImJhelwiIDogNCBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVW5zZXRfNSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlUpper_single": { + "request": "LS0tCm5hbWU6IGFxbFVwcGVyCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFVQUEVSKCJBVk9jYWRvIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBVUFBFUihcIkFWT2NhZG9cIikiLCJvdXRwdXQiOiJbIFxuICBcIkFWT0NBRE9cIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVXBwZXIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlUuid_single": { + "request": "LS0tCm5hbWU6IGFxbFV1aWQKZGVzY3JpcHRpb246ICcnCi0tLQpGT1IgaSBJTiAxLi4zCiAgUkVUVVJOIFVVSUQoKQ==", + "response": "eyJpbnB1dCI6IkZPUiBpIElOIDEuLjNcbiAgUkVUVVJOIFVVSUQoKSIsIm91dHB1dCI6IlsgXG4gIFwiY2MxM2M3NWItNDJjOC00OTcyLThjYTUtODQwNzc2NjIyNWUwXCIsIFxuICBcImQwMTcyYjc3LWRlNGItNDA0MS05ZjBkLWQwMGI5MTQyMzNkMVwiLCBcbiAgXCI5MTQ0MmJlYy00MjA4LTQ0ZjgtYWUwOS0xZTVlNjU5MjQ2YTBcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVXVpZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlValue_1_single": { + "request": "LS0tCm5hbWU6IGFxbFZhbHVlXzEKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgb2JqID0geyBmb286IHsgYmFyOiAiYmF6IiB9IH0KUkVUVVJOIFZBTFVFKG9iaiwgWyJmb28iLCAiYmFyIl0p", + "response": "eyJpbnB1dCI6IkxFVCBvYmogPSB7IGZvbzogeyBiYXI6IFwiYmF6XCIgfSB9XG5SRVRVUk4gVkFMVUUob2JqLCBbXCJmb29cIiwgXCJiYXJcIl0pIiwib3V0cHV0IjoiWyBcbiAgXCJiYXpcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsVmFsdWVfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlValue_2_single": { + "request": "LS0tCm5hbWU6IGFxbFZhbHVlXzIKZGVzY3JpcHRpb246ICcnCi0tLQpMRVQgb2JqID0geyBmb286IFsgeyBiYXI6ICJiYXoiIH0sIHsgYmFyOiB7IGlubmVyOiB0cnVlIH0gfSBdIH0KUkVUVVJOIFZBTFVFKG9iaiwgWyJmb28iLCAxLCAiYmFyIl0p", + "response": "eyJpbnB1dCI6IkxFVCBvYmogPSB7IGZvbzogWyB7IGJhcjogXCJiYXpcIiB9LCB7IGJhcjogeyBpbm5lcjogdHJ1ZSB9IH0gXSB9XG5SRVRVUk4gVkFMVUUob2JqLCBbXCJmb29cIiwgMSwgXCJiYXJcIl0pIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImlubmVyXCIgOiB0cnVlIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxWYWx1ZV8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlValues_1_single": { + "request": "LS0tCm5hbWU6IGFxbFZhbHVlc18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFZBTFVFUyggeyAiX2lkIjogInVzZXJzL2phbmUiLCAibmFtZSI6ICJKYW5lIiwgImFnZSI6IDM1IH0gKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBWQUxVRVMoIHsgXCJfaWRcIjogXCJ1c2Vycy9qYW5lXCIsIFwibmFtZVwiOiBcIkphbmVcIiwgXCJhZ2VcIjogMzUgfSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcInVzZXJzL2phbmVcIiwgXG4gICAgXCJKYW5lXCIsIFxuICAgIDM1IFxuICBdIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxWYWx1ZXNfMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlValues_2_single": { + "request": "LS0tCm5hbWU6IGFxbFZhbHVlc18yCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIFZBTFVFUyggeyAiX2lkIjogInVzZXJzL2phbmUiLCAibmFtZSI6ICJKYW5lIiwgImFnZSI6IDM1IH0sIHRydWUgKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBWQUxVRVMoIHsgXCJfaWRcIjogXCJ1c2Vycy9qYW5lXCIsIFwibmFtZVwiOiBcIkphbmVcIiwgXCJhZ2VcIjogMzUgfSwgdHJ1ZSApIiwib3V0cHV0IjoiWyBcbiAgWyBcbiAgICBcIkphbmVcIiwgXG4gICAgMzUgXG4gIF0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFZhbHVlc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlWithoutCollections_1_single": { + "request": "LS0tCm5hbWU6IGFxbFdpdGhvdXRDb2xsZWN0aW9uc18xCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOICJ0aGlzIHdpbGwgYmUgcmV0dXJuZWQi", + "response": "eyJpbnB1dCI6IlJFVFVSTiBcInRoaXMgd2lsbCBiZSByZXR1cm5lZFwiIiwib3V0cHV0IjoiWyBcbiAgXCJ0aGlzIHdpbGwgYmUgcmV0dXJuZWRcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXFsV2l0aG91dENvbGxlY3Rpb25zXzEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "aqlWithoutCollections_2_single": { + "request": "LS0tCm5hbWU6IGFxbFdpdGhvdXRDb2xsZWN0aW9uc18yCmRlc2NyaXB0aW9uOiAnJwotLS0KTEVUIGFycmF5ID0gWzEsIDIsIDMsIDRdClJFVFVSTiB7IGFycmF5LCBzdW06IFNVTShhcnJheSkgfQ==", + "response": "eyJpbnB1dCI6IkxFVCBhcnJheSA9IFsxLCAyLCAzLCA0XVxuUkVUVVJOIHsgYXJyYXksIHN1bTogU1VNKGFycmF5KSB9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImFycmF5XCIgOiBbIFxuICAgICAgMSwgXG4gICAgICAyLCBcbiAgICAgIDMsIFxuICAgICAgNCBcbiAgICBdLCBcbiAgICBcInN1bVwiIDogMTAgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFdpdGhvdXRDb2xsZWN0aW9uc18yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "aqlWithoutCollections_3_single": { + "request": "LS0tCm5hbWU6IGFxbFdpdGhvdXRDb2xsZWN0aW9uc18zCmRlc2NyaXB0aW9uOiAnJwotLS0KRk9SIHllYXIgSU4gWyAyMDExLCAyMDEyLCAyMDEzIF0KICBGT1IgcXVhcnRlciBJTiBbIDEsIDIsIDMsIDQgXQogICAgUkVUVVJOIHsKICAgICAgeWVhciwKICAgICAgcXVhcnRlciwKICAgICAgZm9ybWF0dGVkOiBDT05DQVQocXVhcnRlciwgIiAvICIsIHllYXIpCiAgICB9", + "response": "eyJpbnB1dCI6IkZPUiB5ZWFyIElOIFsgMjAxMSwgMjAxMiwgMjAxMyBdXG4gIEZPUiBxdWFydGVyIElOIFsgMSwgMiwgMywgNCBdXG4gICAgUkVUVVJOIHtcbiAgICAgIHllYXIsXG4gICAgICBxdWFydGVyLFxuICAgICAgZm9ybWF0dGVkOiBDT05DQVQocXVhcnRlciwgXCIgLyBcIiwgeWVhcilcbiAgICB9Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInllYXJcIiA6IDIwMTEsIFxuICAgIFwicXVhcnRlclwiIDogMSwgXG4gICAgXCJmb3JtYXR0ZWRcIiA6IFwiMSAvIDIwMTFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJ5ZWFyXCIgOiAyMDExLCBcbiAgICBcInF1YXJ0ZXJcIiA6IDIsIFxuICAgIFwiZm9ybWF0dGVkXCIgOiBcIjIgLyAyMDExXCIgXG4gIH0sIFxuICB7IFxuICAgIFwieWVhclwiIDogMjAxMSwgXG4gICAgXCJxdWFydGVyXCIgOiAzLCBcbiAgICBcImZvcm1hdHRlZFwiIDogXCIzIC8gMjAxMVwiIFxuICB9LCBcbiAgeyBcbiAgICBcInllYXJcIiA6IDIwMTEsIFxuICAgIFwicXVhcnRlclwiIDogNCwgXG4gICAgXCJmb3JtYXR0ZWRcIiA6IFwiNCAvIDIwMTFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJ5ZWFyXCIgOiAyMDEyLCBcbiAgICBcInF1YXJ0ZXJcIiA6IDEsIFxuICAgIFwiZm9ybWF0dGVkXCIgOiBcIjEgLyAyMDEyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwieWVhclwiIDogMjAxMiwgXG4gICAgXCJxdWFydGVyXCIgOiAyLCBcbiAgICBcImZvcm1hdHRlZFwiIDogXCIyIC8gMjAxMlwiIFxuICB9LCBcbiAgeyBcbiAgICBcInllYXJcIiA6IDIwMTIsIFxuICAgIFwicXVhcnRlclwiIDogMywgXG4gICAgXCJmb3JtYXR0ZWRcIiA6IFwiMyAvIDIwMTJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJ5ZWFyXCIgOiAyMDEyLCBcbiAgICBcInF1YXJ0ZXJcIiA6IDQsIFxuICAgIFwiZm9ybWF0dGVkXCIgOiBcIjQgLyAyMDEyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwieWVhclwiIDogMjAxMywgXG4gICAgXCJxdWFydGVyXCIgOiAxLCBcbiAgICBcImZvcm1hdHRlZFwiIDogXCIxIC8gMjAxM1wiIFxuICB9LCBcbiAgeyBcbiAgICBcInllYXJcIiA6IDIwMTMsIFxuICAgIFwicXVhcnRlclwiIDogMiwgXG4gICAgXCJmb3JtYXR0ZWRcIiA6IFwiMiAvIDIwMTNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJ5ZWFyXCIgOiAyMDEzLCBcbiAgICBcInF1YXJ0ZXJcIiA6IDMsIFxuICAgIFwiZm9ybWF0dGVkXCIgOiBcIjMgLyAyMDEzXCIgXG4gIH0sIFxuICB7IFxuICAgIFwieWVhclwiIDogMjAxMywgXG4gICAgXCJxdWFydGVyXCIgOiA0LCBcbiAgICBcImZvcm1hdHRlZFwiIDogXCI0IC8gMjAxM1wiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcWxXaXRob3V0Q29sbGVjdGlvbnNfMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "aqlZip_single": { + "request": "LS0tCm5hbWU6IGFxbFppcApkZXNjcmlwdGlvbjogJycKLS0tClJFVFVSTiBaSVAoIFsgIm5hbWUiLCAiYWN0aXZlIiwgImhvYmJpZXMiIF0sIFsgInNvbWUgdXNlciIsIHRydWUsIFsgInN3aW1taW5nIiwgInJpZGluZyIgXSBdICk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBaSVAoIFsgXCJuYW1lXCIsIFwiYWN0aXZlXCIsIFwiaG9iYmllc1wiIF0sIFsgXCJzb21lIHVzZXJcIiwgdHJ1ZSwgWyBcInN3aW1taW5nXCIsIFwicmlkaW5nXCIgXSBdICkiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwibmFtZVwiIDogXCJzb21lIHVzZXJcIiwgXG4gICAgXCJhY3RpdmVcIiA6IHRydWUsIFxuICAgIFwiaG9iYmllc1wiIDogWyBcbiAgICAgIFwic3dpbW1pbmdcIiwgXG4gICAgICBcInJpZGluZ1wiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFxbFppcCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_create_collection_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2NyZWF0ZV9jb2xsZWN0aW9uCmRlc2NyaXB0aW9uOiAnJwotLS0KY29sbCA9IGRiLl9jcmVhdGUoImNvbGwiKTsKfmRiLl9kcm9wKCJjb2xsIik7", + "response": "eyJpbnB1dCI6ImNvbGwgPSBkYi5fY3JlYXRlKFwiY29sbFwiKTsiLCJvdXRwdXQiOiJbQXJhbmdvQ29sbGVjdGlvbiA2NzQzNSwgXCJjb2xsXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9jcmVhdGVfY29sbGVjdGlvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_create_database_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2NyZWF0ZV9kYXRhYmFzZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBvayA9IGRiLl91c2VEYXRhYmFzZSgiX3N5c3RlbSIpOyAvLyBfc3lzdGVtIGRhdGFiYXNlIGNvbnRleHQgcmVxdWlyZWQKZGIuX2NyZWF0ZURhdGFiYXNlKCJteWRiIik7Cn5kYi5fZHJvcERhdGFiYXNlKCJteWRiIik7", + "response": "eyJpbnB1dCI6InZhciBvayA9IGRiLl91c2VEYXRhYmFzZShcIl9zeXN0ZW1cIik7IC8vIF9zeXN0ZW0gZGF0YWJhc2UgY29udGV4dCByZXF1aXJlZFxuZGIuX2NyZWF0ZURhdGFiYXNlKFwibXlkYlwiKTsiLCJvdXRwdXQiOiJ0cnVlIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX2NyZWF0ZV9kYXRhYmFzZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_create_documents_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2NyZWF0ZV9kb2N1bWVudHMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp2YXIgY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJjb2xsIik7CgovLyBTaW5nbGUgZG9jdW1lbnQKY29sbC5pbnNlcnQoewogIF9rZXk6ICJ0aGUtZG9jdW1lbnQta2V5IiwKICBuYW1lOiAiQXJhbmdvREIiLAogIHRhZ3M6IFsiZ3JhcGgiLCAiZGF0YWJhc2UiLCAiTm9TUUwiXSwKICBzY2FsYWJsZTogdHJ1ZSwKICBjb21wYW55OiB7CiAgICBuYW1lOiAiQXJhbmdvREIgSW5jLiIsCiAgICBmb3VuZGVkOiAyMDE1CiAgfQp9KTsKCi8vIE11bHRpcGxlIGRvY3VtZW50cwpjb2xsLmluc2VydChbIHsgX2tleTogIm9uZSIgfSwgeyBfa2V5OiAidHdvIiB9LCB7IF9rZXk6ICJ0aHJlZSIgfSBdKTsKfmRiLl9kcm9wKCJjb2xsIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuXG4vLyBTaW5nbGUgZG9jdW1lbnRcbmNvbGwuaW5zZXJ0KHtcbiAgX2tleTogXCJ0aGUtZG9jdW1lbnQta2V5XCIsXG4gIG5hbWU6IFwiQXJhbmdvREJcIixcbiAgdGFnczogW1wiZ3JhcGhcIiwgXCJkYXRhYmFzZVwiLCBcIk5vU1FMXCJdLFxuICBzY2FsYWJsZTogdHJ1ZSxcbiAgY29tcGFueToge1xuICAgIG5hbWU6IFwiQXJhbmdvREIgSW5jLlwiLFxuICAgIGZvdW5kZWQ6IDIwMTVcbiAgfVxufSk7XG5cbi8vIE11bHRpcGxlIGRvY3VtZW50c1xuY29sbC5pbnNlcnQoWyB7IF9rZXk6IFwib25lXCIgfSwgeyBfa2V5OiBcInR3b1wiIH0sIHsgX2tleTogXCJ0aHJlZVwiIH0gXSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiY29sbC90aGUtZG9jdW1lbnQta2V5XCIsIFxuICBcIl9rZXlcIiA6IFwidGhlLWRvY3VtZW50LWtleVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNheF95LS0tXCIgXG59XG5bIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvb25lXCIsIFxuICAgIFwiX2tleVwiIDogXCJvbmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheF95LS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdHdvXCIsIFxuICAgIFwiX2tleVwiIDogXCJ0d29cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheF95LS1BXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdGhyZWVcIiwgXG4gICAgXCJfa2V5XCIgOiBcInRocmVlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYXhfeS0tQlwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9jcmVhdGVfZG9jdW1lbnRzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "arangosh_delete_collection_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2RlbGV0ZV9jb2xsZWN0aW9uCnJlbmRlcjogaW5wdXQKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwpkYi5fZHJvcCgiY29sbCIpOw==", + "response": "eyJpbnB1dCI6ImRiLl9kcm9wKFwiY29sbFwiKTsiLCJvdXRwdXQiOiJFbXB0eSBvdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXJhbmdvc2hfZGVsZXRlX2NvbGxlY3Rpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQifX0K" + }, + "arangosh_delete_database_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2RlbGV0ZV9kYXRhYmFzZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlRGF0YWJhc2UoIm15ZGIiKTsKdmFyIG9rID0gZGIuX3VzZURhdGFiYXNlKCJfc3lzdGVtIik7IC8vIF9zeXN0ZW0gZGF0YWJhc2UgY29udGV4dCByZXF1aXJlZApkYi5fZHJvcERhdGFiYXNlKCJteWRiIik7", + "response": "eyJpbnB1dCI6InZhciBvayA9IGRiLl91c2VEYXRhYmFzZShcIl9zeXN0ZW1cIik7IC8vIF9zeXN0ZW0gZGF0YWJhc2UgY29udGV4dCByZXF1aXJlZFxuZGIuX2Ryb3BEYXRhYmFzZShcIm15ZGJcIik7Iiwib3V0cHV0IjoidHJ1ZSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9kZWxldGVfZGF0YWJhc2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_delete_documents_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2RlbGV0ZV9kb2N1bWVudHMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp2YXIgY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJjb2xsIik7Cn5jb2xsLmluc2VydCh7IF9rZXk6ICJ0aGUtZG9jdW1lbnQta2V5IiB9KTsKfmNvbGwuaW5zZXJ0KFsgeyBfa2V5OiAib25lIiB9LCB7IF9rZXk6ICJ0d28iIH0sIHsgX2tleTogInRocmVlIiB9IF0pOwpjb2xsLnJlbW92ZSgidGhlLWRvY3VtZW50LWtleSIpOwpjb2xsLnJlbW92ZShbICJvbmUiLCAidHdvIiwgeyBfa2V5OiAidGhyZWUiIH0gXSk7Cn5kYi5fZHJvcCgiY29sbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuY29sbC5yZW1vdmUoXCJ0aGUtZG9jdW1lbnQta2V5XCIpO1xuY29sbC5yZW1vdmUoWyBcIm9uZVwiLCBcInR3b1wiLCB7IF9rZXk6IFwidGhyZWVcIiB9IF0pOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcImNvbGwvdGhlLWRvY3VtZW50LWtleVwiLCBcbiAgXCJfa2V5XCIgOiBcInRoZS1kb2N1bWVudC1rZXlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYXhIRy0tLVwiIFxufVxuXG5bIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvb25lXCIsIFxuICAgIFwiX2tleVwiIDogXCJvbmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheEhHLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdHdvXCIsIFxuICAgIFwiX2tleVwiIDogXCJ0d29cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheEhHLS1BXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdGhyZWVcIiwgXG4gICAgXCJfa2V5XCIgOiBcInRocmVlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYXhIRy0tQlwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9kZWxldGVfZG9jdW1lbnRzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "arangosh_execute_query_bindvars_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2V4ZWN1dGVfcXVlcnlfYmluZHZhcnMKZGVzY3JpcHRpb246ICcnCi0tLQpkYi5fcXVlcnkoYFJFVFVSTiBDT05DQVQoIkhlbGxvLCAiLCBAbmFtZSlgLCB7IG5hbWU6ICJBUUwiIH0pLnRvQXJyYXkoKTsKLy8gLS0gb3IgLS0KdmFyIG5hbWUgPSAiQVFMIjsKZGIuX3F1ZXJ5KGFxbGBSRVRVUk4gQ09OQ0FUKCJIZWxsbywgIiwgJHtuYW1lfSlgKS50b0FycmF5KCk7", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShgUkVUVVJOIENPTkNBVChcIkhlbGxvLCBcIiwgQG5hbWUpYCwgeyBuYW1lOiBcIkFRTFwiIH0pLnRvQXJyYXkoKTtcbi8vIC0tIG9yIC0tXG52YXIgbmFtZSA9IFwiQVFMXCI7XG5kYi5fcXVlcnkoYXFsYFJFVFVSTiBDT05DQVQoXCJIZWxsbywgXCIsICR7bmFtZX0pYCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIFwiSGVsbG8sIEFRTFwiIFxuXVxuXG5bIFxuICBcIkhlbGxvLCBBUUxcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXJhbmdvc2hfZXhlY3V0ZV9xdWVyeV9iaW5kdmFycyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_get_collection_properties_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2dldF9jb2xsZWN0aW9uX3Byb3BlcnRpZXMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp2YXIgY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJjb2xsIik7CmNvbGwucHJvcGVydGllcygpOwp+ZGIuX2Ryb3AoImNvbGwiKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuY29sbC5wcm9wZXJ0aWVzKCk7Iiwib3V0cHV0IjoieyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjc0OThcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX2dldF9jb2xsZWN0aW9uX3Byb3BlcnRpZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_get_collection_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2dldF9jb2xsZWN0aW9uCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImNvbGwiKTsKY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJjb2xsIik7Cn5kYi5fZHJvcCgiY29sbCIpOw==", + "response": "eyJpbnB1dCI6ImNvbGwgPSBkYi5fY29sbGVjdGlvbihcImNvbGxcIik7Iiwib3V0cHV0IjoiW0FyYW5nb0NvbGxlY3Rpb24gNjc0NDEsIFwiY29sbFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXJhbmdvc2hfZ2V0X2NvbGxlY3Rpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_get_database_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2dldF9kYXRhYmFzZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlRGF0YWJhc2UoIm15ZGIiKTsKdmFyIG9rID0gZGIuX3VzZURhdGFiYXNlKCJteWRiIik7CmRiLl9wcm9wZXJ0aWVzKCk7Cn5kYi5fdXNlRGF0YWJhc2UoIl9zeXN0ZW0iKTsKfmRiLl9kcm9wRGF0YWJhc2UoIm15ZGIiKTs=", + "response": "eyJpbnB1dCI6InZhciBvayA9IGRiLl91c2VEYXRhYmFzZShcIm15ZGJcIik7XG5kYi5fcHJvcGVydGllcygpOyIsIm91dHB1dCI6InsgXG4gIFwiaWRcIiA6IFwiNjc1OTBcIiwgXG4gIFwibmFtZVwiIDogXCJteWRiXCIsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwicGF0aFwiIDogXCJub25lXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX2dldF9kYXRhYmFzZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_get_documents_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2dldF9kb2N1bWVudHMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp2YXIgY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJjb2xsIik7Cgp+Y29sbC5pbnNlcnQoewp+ICBfa2V5OiAidGhlLWRvY3VtZW50LWtleSIsCn4gIG5hbWU6ICJBcmFuZ29EQiIsCn4gIHRhZ3M6IFsiZ3JhcGgiLCAiZGF0YWJhc2UiLCAiTm9TUUwiXSwKfiAgc2NhbGFibGU6IHRydWUsCn4gIGNvbXBhbnk6IHsKfiAgICBuYW1lOiAiQXJhbmdvREIgSW5jLiIsCn4gICAgZm91bmRlZDogMjAxNQp+ICB9Cn59KTsKfmNvbGwuaW5zZXJ0KFsgeyBfa2V5OiAib25lIiB9LCB7IF9rZXk6ICJ0d28iIH0sIHsgX2tleTogInRocmVlIiB9IF0pOwoKLy8gU2luZ2xlIGRvY3VtZW50CmNvbGwuZG9jdW1lbnQoInRoZS1kb2N1bWVudC1rZXkiKTsKCi8vIE11bHRpcGxlIGRvY3VtZW50cwpjb2xsLmRvY3VtZW50KFsgIm9uZSIsICJ0d28iLCB7IF9rZXk6ICJ0aHJlZSIgfSBdKTsKCn5kYi5fZHJvcCgiY29sbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuXG4vLyBTaW5nbGUgZG9jdW1lbnRcbmNvbGwuZG9jdW1lbnQoXCJ0aGUtZG9jdW1lbnQta2V5XCIpO1xuXG4vLyBNdWx0aXBsZSBkb2N1bWVudHNcbmNvbGwuZG9jdW1lbnQoWyBcIm9uZVwiLCBcInR3b1wiLCB7IF9rZXk6IFwidGhyZWVcIiB9IF0pOyIsIm91dHB1dCI6InsgXG4gIFwiX2tleVwiIDogXCJ0aGUtZG9jdW1lbnQta2V5XCIsIFxuICBcIl9pZFwiIDogXCJjb2xsL3RoZS1kb2N1bWVudC1rZXlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYXhBaS0tLVwiLCBcbiAgXCJuYW1lXCIgOiBcIkFyYW5nb0RCXCIsIFxuICBcInRhZ3NcIiA6IFsgXG4gICAgXCJncmFwaFwiLCBcbiAgICBcImRhdGFiYXNlXCIsIFxuICAgIFwiTm9TUUxcIiBcbiAgXSwgXG4gIFwic2NhbGFibGVcIiA6IHRydWUsIFxuICBcImNvbXBhbnlcIiA6IHsgXG4gICAgXCJuYW1lXCIgOiBcIkFyYW5nb0RCIEluYy5cIiwgXG4gICAgXCJmb3VuZGVkXCIgOiAyMDE1IFxuICB9IFxufVxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwib25lXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbGwvb25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYXhBaS0tX1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwidHdvXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdHdvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYXhBaS0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwidGhyZWVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29sbC90aHJlZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2F4QWktLUJcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXJhbmdvc2hfZ2V0X2RvY3VtZW50cyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_list_collections_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2xpc3RfY29sbGVjdGlvbnMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZURhdGFiYXNlKCJteWRiIik7Cn5kYi5fdXNlRGF0YWJhc2UoIm15ZGIiKTsKfmRiLl9jcmVhdGUoInByb2R1Y3RzIik7Cn5kYi5fY3JlYXRlKCJ1c2VycyIpOwpkYi5fY29sbGVjdGlvbnMoKTsKfmRiLl91c2VEYXRhYmFzZSgiX3N5c3RlbSIpOwp+ZGIuX2Ryb3BEYXRhYmFzZSgibXlkYiIpOw==", + "response": "eyJpbnB1dCI6ImRiLl9jb2xsZWN0aW9ucygpOyIsIm91dHB1dCI6IlsgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDY3NDUxLCBcIl9hbmFseXplcnNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNjc0NjYsIFwiX2FwcGJ1bmRsZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNjc0NjMsIFwiX2FwcHNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNjc0NTQsIFwiX2FxbGZ1bmN0aW9uc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiA2NzQ2OSwgXCJfZnJvbnRlbmRcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNjc0NDgsIFwiX2dyYXBoc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiA2NzQ2MCwgXCJfam9ic1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiA2NzQ3MiwgXCJfcHJlZ2VsX3F1ZXJpZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNjc0NTcsIFwiX3F1ZXVlc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiA2NzQ4NywgXCJwcm9kdWN0c1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiA2NzQ5MiwgXCJ1c2Vyc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX2xpc3RfY29sbGVjdGlvbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_list_databases_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX2xpc3RfZGF0YWJhc2VzCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGVEYXRhYmFzZSgibXlkYiIpOwp2YXIgb2sgPSBkYi5fdXNlRGF0YWJhc2UoIl9zeXN0ZW0iKTsgLy8gX3N5c3RlbSBkYXRhYmFzZSBjb250ZXh0IHJlcXVpcmVkCmRiLl9kYXRhYmFzZXMoKTsKfmRiLl9kcm9wRGF0YWJhc2UoIm15ZGIiKTs=", + "response": "eyJpbnB1dCI6InZhciBvayA9IGRiLl91c2VEYXRhYmFzZShcIl9zeXN0ZW1cIik7IC8vIF9zeXN0ZW0gZGF0YWJhc2UgY29udGV4dCByZXF1aXJlZFxuZGIuX2RhdGFiYXNlcygpOyIsIm91dHB1dCI6IlsgXG4gIFwiX3N5c3RlbVwiLCBcbiAgXCJteWRiXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX2xpc3RfZGF0YWJhc2VzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "arangosh_remove_collection_properties_schema_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3JlbW92ZV9jb2xsZWN0aW9uX3Byb3BlcnRpZXNfc2NoZW1hCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oInNjaGVtYUNvbGxlY3Rpb24iKTsKZGIuc2NoZW1hQ29sbGVjdGlvbi5wcm9wZXJ0aWVzKHsgInNjaGVtYSI6IG51bGwgfSk7Cn5yZW1vdmVJZ25vcmVDb2xsZWN0aW9uKGNvbGwubmFtZSgpKTsKfmRiLl9kcm9wKGNvbGwubmFtZSgpKTs=", + "response": "eyJpbnB1dCI6ImRiLnNjaGVtYUNvbGxlY3Rpb24ucHJvcGVydGllcyh7IFwic2NoZW1hXCI6IG51bGwgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImgyQzg1Qzk3RTVFNDkvNjcxMjVcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX3JlbW92ZV9jb2xsZWN0aW9uX3Byb3BlcnRpZXNfc2NoZW1hIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "arangosh_replace_documents_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3JlcGxhY2VfZG9jdW1lbnRzCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImNvbGwiKTsKdmFyIGNvbGwgPSBkYi5fY29sbGVjdGlvbigiY29sbCIpOwoKfmNvbGwuaW5zZXJ0KHsKfiAgX2tleTogInRoZS1kb2N1bWVudC1rZXkiLAp+ICBuYW1lOiAiQXJhbmdvREIiLAp+ICB0YWdzOiBbImdyYXBoIiwgImRhdGFiYXNlIiwgIk5vU1FMIl0sCn4gIHNjYWxhYmxlOiB0cnVlLAp+ICBjb21wYW55OiB7Cn4gICAgbmFtZTogIkFyYW5nb0RCIEluYy4iLAp+ICAgIGZvdW5kZWQ6IDIwMTUKfiAgfQp+fSk7Cn5jb2xsLmluc2VydChbIHsgX2tleTogIm9uZSIgfSwgeyBfa2V5OiAidHdvIiB9LCB7IF9rZXk6ICJ0aHJlZSIgfSBdKTsKCmNvbGwucmVwbGFjZSgidGhlLWRvY3VtZW50LWtleSIsIHsgbG9nbzogImF2b2NhZG8iIH0sIHsgcmV0dXJuTmV3OiB0cnVlIH0pOwpjb2xsLnJlcGxhY2UoWyAib25lIiwgInR3byIsIHsgX2tleTogInRocmVlIiB9IF0sIFsgeyB2YWw6IDEgfSwgeyB2YWw6IDIgfSwgeyB2YWw6IDMgfSBdKTsKfmRiLl9kcm9wKCJjb2xsIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuXG5jb2xsLnJlcGxhY2UoXCJ0aGUtZG9jdW1lbnQta2V5XCIsIHsgbG9nbzogXCJhdm9jYWRvXCIgfSwgeyByZXR1cm5OZXc6IHRydWUgfSk7XG5jb2xsLnJlcGxhY2UoWyBcIm9uZVwiLCBcInR3b1wiLCB7IF9rZXk6IFwidGhyZWVcIiB9IF0sIFsgeyB2YWw6IDEgfSwgeyB2YWw6IDIgfSwgeyB2YWw6IDMgfSBdKTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJjb2xsL3RoZS1kb2N1bWVudC1rZXlcIiwgXG4gIFwiX2tleVwiIDogXCJ0aGUtZG9jdW1lbnQta2V5XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2F4Rm0tLS1cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYXhFcS0tX1wiLCBcbiAgXCJuZXdcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcInRoZS1kb2N1bWVudC1rZXlcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29sbC90aGUtZG9jdW1lbnQta2V5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYXhGbS0tLVwiLCBcbiAgICBcImxvZ29cIiA6IFwiYXZvY2Fkb1wiIFxuICB9IFxufVxuXG5bIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvb25lXCIsIFxuICAgIFwiX2tleVwiIDogXCJvbmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheEZtLS1fXCIsIFxuICAgIFwiX29sZFJldlwiIDogXCJfanQzYXhGaS0tLVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJjb2xsL3R3b1wiLCBcbiAgICBcIl9rZXlcIiA6IFwidHdvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYXhGbS0tQVwiLCBcbiAgICBcIl9vbGRSZXZcIiA6IFwiX2p0M2F4RmktLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiY29sbC90aHJlZVwiLCBcbiAgICBcIl9rZXlcIiA6IFwidGhyZWVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheEZtLS1CXCIsIFxuICAgIFwiX29sZFJldlwiIDogXCJfanQzYXhGaS0tQVwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9yZXBsYWNlX2RvY3VtZW50cyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_set_collection_computed_values_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3NldF9jb2xsZWN0aW9uX2NvbXB1dGVkX3ZhbHVlcwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBjb21wdXRlZFZhbHVlcyA9IFsKICB7CiAgICBuYW1lOiAidGl0bGUiLAogICAgZXhwcmVzc2lvbjogIlJFVFVSTiBcIlRCQVwiIiwKICAgIG92ZXJ3cml0ZTogZmFsc2UsCiAgICBjb21wdXRlT246IFsiaW5zZXJ0IiwgInVwZGF0ZSIsICJyZXBsYWNlIl0sCiAgICBmYWlsT25XYXJuaW5nOiBmYWxzZSwKICAgIGtlZXBOdWxsOiB0cnVlCiAgfQpdOwoKLyogQ3JlYXRlIGEgbmV3IGNvbGxlY3Rpb24gd2l0aCBjb21wdXRlZCB2YWx1ZXMgKi8KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJjb21wVmFsQ29sbGVjdGlvbiIsIHsgY29tcHV0ZWRWYWx1ZXMgfSk7CgovKiBVcGRhdGUgdGhlIGNvbXB1dGVkIHZhbHVlcyBvZiBhbiBleGlzdGluZyBjb2xsZWN0aW9uICovCmRiLmNvbXBWYWxDb2xsZWN0aW9uLnByb3BlcnRpZXMoeyBjb21wdXRlZFZhbHVlcyB9KTsKfmFkZElnbm9yZUNvbGxlY3Rpb24oY29sbC5uYW1lKCkpOw==", + "response": "eyJpbnB1dCI6InZhciBjb21wdXRlZFZhbHVlcyA9IFtcbiAge1xuICAgIG5hbWU6IFwidGl0bGVcIixcbiAgICBleHByZXNzaW9uOiBcIlJFVFVSTiBcXFwiVEJBXFxcIlwiLFxuICAgIG92ZXJ3cml0ZTogZmFsc2UsXG4gICAgY29tcHV0ZU9uOiBbXCJpbnNlcnRcIiwgXCJ1cGRhdGVcIiwgXCJyZXBsYWNlXCJdLFxuICAgIGZhaWxPbldhcm5pbmc6IGZhbHNlLFxuICAgIGtlZXBOdWxsOiB0cnVlXG4gIH1cbl07XG5cbi8qIENyZWF0ZSBhIG5ldyBjb2xsZWN0aW9uIHdpdGggY29tcHV0ZWQgdmFsdWVzICovXG52YXIgY29sbCA9IGRiLl9jcmVhdGUoXCJjb21wVmFsQ29sbGVjdGlvblwiLCB7IGNvbXB1dGVkVmFsdWVzIH0pO1xuXG4vKiBVcGRhdGUgdGhlIGNvbXB1dGVkIHZhbHVlcyBvZiBhbiBleGlzdGluZyBjb2xsZWN0aW9uICovXG5kYi5jb21wVmFsQ29sbGVjdGlvbi5wcm9wZXJ0aWVzKHsgY29tcHV0ZWRWYWx1ZXMgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjc4NzRcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IFsgXG4gICAgeyBcbiAgICAgIFwibmFtZVwiIDogXCJ0aXRsZVwiLCBcbiAgICAgIFwiZXhwcmVzc2lvblwiIDogXCJSRVRVUk4gXFxcIlRCQVxcXCJcIiwgXG4gICAgICBcImNvbXB1dGVPblwiIDogWyBcbiAgICAgICAgXCJpbnNlcnRcIiwgXG4gICAgICAgIFwidXBkYXRlXCIsIFxuICAgICAgICBcInJlcGxhY2VcIiBcbiAgICAgIF0sIFxuICAgICAgXCJvdmVyd3JpdGVcIiA6IGZhbHNlLCBcbiAgICAgIFwiZmFpbE9uV2FybmluZ1wiIDogZmFsc2UsIFxuICAgICAgXCJrZWVwTnVsbFwiIDogdHJ1ZSBcbiAgICB9IFxuICBdLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9zZXRfY29sbGVjdGlvbl9jb21wdXRlZF92YWx1ZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_set_collection_properties_cluster": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3NldF9jb2xsZWN0aW9uX3Byb3BlcnRpZXMKdHlwZTogY2x1c3RlcgpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJjb2xsIik7CnZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oImNvbGwiKTsKY29sbC5wcm9wZXJ0aWVzKHsKICB3YWl0Rm9yU3luYzogdHJ1ZSwKICByZXBsaWNhdGlvbkZhY3RvcjogMwp9KTsKfmRiLl9kcm9wKCJjb2xsIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuY29sbC5wcm9wZXJ0aWVzKHtcbiAgd2FpdEZvclN5bmM6IHRydWUsXG4gIHJlcGxpY2F0aW9uRmFjdG9yOiAzXG59KTsiLCJvdXRwdXQiOiJ7IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiYzYwMTAwMjMvXCIsIFxuICBcImlzU21hcnRcIiA6IGZhbHNlLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcIndhaXRGb3JTeW5jXCIgOiB0cnVlLCBcbiAgXCJzaGFyZEtleXNcIiA6IFsgXG4gICAgXCJfa2V5XCIgXG4gIF0sIFxuICBcIm51bWJlck9mU2hhcmRzXCIgOiAxLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIgXG4gIH0sIFxuICBcInJlcGxpY2F0aW9uRmFjdG9yXCIgOiAzLCBcbiAgXCJtaW5SZXBsaWNhdGlvbkZhY3RvclwiIDogMSwgXG4gIFwid3JpdGVDb25jZXJuXCIgOiAxLCBcbiAgXCJzaGFyZGluZ1N0cmF0ZWd5XCIgOiBcImhhc2hcIiwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwsIFxuICBcImlzRGlzam9pbnRcIiA6IGZhbHNlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF9zZXRfY29sbGVjdGlvbl9wcm9wZXJ0aWVzIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_set_collection_properties_schema_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3NldF9jb2xsZWN0aW9uX3Byb3BlcnRpZXNfc2NoZW1hCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHNjaGVtYSA9IHsKICBydWxlOiB7IAogICAgdHlwZTogIm9iamVjdCIsCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIG51bXM6IHsKICAgICAgICB0eXBlOiAiYXJyYXkiLAogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICAgIG1heGltdW06IDYKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogeyB0eXBlOiAic3RyaW5nIiB9LAogICAgcmVxdWlyZWQ6IFsibnVtcyJdCiAgfSwKICBsZXZlbDogIm1vZGVyYXRlIiwKICBtZXNzYWdlOiAiVGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYW4gYXJyYXkgb2YgbnVtYmVycyBpbiBhdHRyaWJ1dGUgXCJudW1zXCIsIG9uZSBvZiB0aGUgbnVtYmVycyBpcyBncmVhdGVyIHRoYW4gNiwgb3IgYW5vdGhlciB0b3AtbGV2ZWwgYXR0cmlidXRlIGlzIG5vdCBhIHN0cmluZy4iCn07CgovKiBDcmVhdGUgYSBuZXcgY29sbGVjdGlvbiB3aXRoIHNjaGVtYSAqLwp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInNjaGVtYUNvbGxlY3Rpb24iLCB7ICJzY2hlbWEiOiBzY2hlbWEgfSk7CgovKiBVcGRhdGUgdGhlIHNjaGVtYSBvZiBhbiBleGlzdGluZyBjb2xsZWN0aW9uICovCmRiLnNjaGVtYUNvbGxlY3Rpb24ucHJvcGVydGllcyh7ICJzY2hlbWEiOiBzY2hlbWEgfSk7Cn5hZGRJZ25vcmVDb2xsZWN0aW9uKGNvbGwubmFtZSgpKTs=", + "response": "eyJpbnB1dCI6InZhciBzY2hlbWEgPSB7XG4gIHJ1bGU6IHsgXG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBudW1zOiB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIG1heGltdW06IDZcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgIHJlcXVpcmVkOiBbXCJudW1zXCJdXG4gIH0sXG4gIGxldmVsOiBcIm1vZGVyYXRlXCIsXG4gIG1lc3NhZ2U6IFwiVGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYW4gYXJyYXkgb2YgbnVtYmVycyBpbiBhdHRyaWJ1dGUgXFxcIm51bXNcXFwiLCBvbmUgb2YgdGhlIG51bWJlcnMgaXMgZ3JlYXRlciB0aGFuIDYsIG9yIGFub3RoZXIgdG9wLWxldmVsIGF0dHJpYnV0ZSBpcyBub3QgYSBzdHJpbmcuXCJcbn07XG5cbi8qIENyZWF0ZSBhIG5ldyBjb2xsZWN0aW9uIHdpdGggc2NoZW1hICovXG52YXIgY29sbCA9IGRiLl9jcmVhdGUoXCJzY2hlbWFDb2xsZWN0aW9uXCIsIHsgXCJzY2hlbWFcIjogc2NoZW1hIH0pO1xuXG4vKiBVcGRhdGUgdGhlIHNjaGVtYSBvZiBhbiBleGlzdGluZyBjb2xsZWN0aW9uICovXG5kYi5zY2hlbWFDb2xsZWN0aW9uLnByb3BlcnRpZXMoeyBcInNjaGVtYVwiOiBzY2hlbWEgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNjc4OTZcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzY2hlbWFcIiA6IHsgXG4gICAgXCJtZXNzYWdlXCIgOiBcIlRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGFuIGFycmF5IG9mIG51bWJlcnMgaW4gYXR0cmlidXRlIFxcXCJudW1zXFxcIiwgb25lIG9mIHRoZSBudW1iZXJzIGlzIGdyZWF0ZXIgdGhhbiA2LCBvciBhbm90aGVyIHRvcC1sZXZlbCBhdHRyaWJ1dGUgaXMgbm90IGEgc3RyaW5nLlwiLCBcbiAgICBcImxldmVsXCIgOiBcIm1vZGVyYXRlXCIsIFxuICAgIFwidHlwZVwiIDogXCJqc29uXCIsIFxuICAgIFwicnVsZVwiIDogeyBcbiAgICAgIFwidHlwZVwiIDogXCJvYmplY3RcIiwgXG4gICAgICBcInByb3BlcnRpZXNcIiA6IHsgXG4gICAgICAgIFwibnVtc1wiIDogeyBcbiAgICAgICAgICBcInR5cGVcIiA6IFwiYXJyYXlcIiwgXG4gICAgICAgICAgXCJpdGVtc1wiIDogeyBcbiAgICAgICAgICAgIFwidHlwZVwiIDogXCJudW1iZXJcIiwgXG4gICAgICAgICAgICBcIm1heGltdW1cIiA6IDYgXG4gICAgICAgICAgfSBcbiAgICAgICAgfSBcbiAgICAgIH0sIFxuICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiIDogeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcInN0cmluZ1wiIFxuICAgICAgfSwgXG4gICAgICBcInJlcXVpcmVkXCIgOiBbIFxuICAgICAgICBcIm51bXNcIiBcbiAgICAgIF0gXG4gICAgfSBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXJhbmdvc2hfc2V0X2NvbGxlY3Rpb25fcHJvcGVydGllc19zY2hlbWEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_unset_collection_properties_computed_values_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3Vuc2V0X2NvbGxlY3Rpb25fcHJvcGVydGllc19jb21wdXRlZF92YWx1ZXMKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIGNvbGwgPSBkYi5fY29sbGVjdGlvbigiY29tcFZhbENvbGxlY3Rpb24iKTsKLyogUmVtb3ZlIHRoZSBjb21wdXRlZCB2YWx1ZXMgb2YgYW4gZXhpc3RpbmcgY29sbGVjdGlvbiAqLwpkYi5jb21wVmFsQ29sbGVjdGlvbi5wcm9wZXJ0aWVzKHsgY29tcHV0ZWRWYWx1ZXM6IG51bGwgfSk7Cn5yZW1vdmVJZ25vcmVDb2xsZWN0aW9uKGNvbGwubmFtZSgpKTsKfmRiLl9kcm9wKGNvbGwubmFtZSgpKTs=", + "response": "eyJpbnB1dCI6Ii8qIFJlbW92ZSB0aGUgY29tcHV0ZWQgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIGNvbGxlY3Rpb24gKi9cbmRiLmNvbXBWYWxDb2xsZWN0aW9uLnByb3BlcnRpZXMoeyBjb21wdXRlZFZhbHVlczogbnVsbCB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS82Nzg3NFwiLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcIndhaXRGb3JTeW5jXCIgOiBmYWxzZSwgXG4gIFwia2V5T3B0aW9uc1wiIDogeyBcbiAgICBcImFsbG93VXNlcktleXNcIiA6IHRydWUsIFxuICAgIFwidHlwZVwiIDogXCJ0cmFkaXRpb25hbFwiLCBcbiAgICBcImxhc3RWYWx1ZVwiIDogMCBcbiAgfSwgXG4gIFwid3JpdGVDb25jZXJuXCIgOiAxLCBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJjb21wdXRlZFZhbHVlc1wiIDogbnVsbCwgXG4gIFwic3luY0J5UmV2aXNpb25cIiA6IHRydWUsIFxuICBcInNjaGVtYVwiIDogbnVsbCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiYXJhbmdvc2hfdW5zZXRfY29sbGVjdGlvbl9wcm9wZXJ0aWVzX2NvbXB1dGVkX3ZhbHVlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "arangosh_update_documents_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3VwZGF0ZV9kb2N1bWVudHMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp2YXIgY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJjb2xsIik7Cgp+Y29sbC5pbnNlcnQoewp+ICBfa2V5OiAidGhlLWRvY3VtZW50LWtleSIsCn4gIG5hbWU6ICJBcmFuZ29EQiIsCn4gIHRhZ3M6IFsiZ3JhcGgiLCAiZGF0YWJhc2UiLCAiTm9TUUwiXSwKfiAgc2NhbGFibGU6IHRydWUsCn4gIGNvbXBhbnk6IHsKfiAgICBuYW1lOiAiQXJhbmdvREIgSW5jLiIsCn4gICAgZm91bmRlZDogMjAxNQp+ICB9Cn59KTsKfmNvbGwuaW5zZXJ0KFsgeyBfa2V5OiAib25lIiB9LCB7IF9rZXk6ICJ0d28iIH0sIHsgX2tleTogInRocmVlIiB9IF0pOwoKY29sbC51cGRhdGUoInRoZS1kb2N1bWVudC1rZXkiLCB7IGxvZ286ICJhdm9jYWRvIiB9LCB7IHJldHVybk5ldzogdHJ1ZSB9KTsKY29sbC51cGRhdGUoWyAib25lIiwgInR3byIsIHsgX2tleTogInRocmVlIiB9IF0sIFsgeyB2YWw6IDEgfSwgeyB2YWw6IDIgfSwgeyB2YWw6IDMgfSBdKTsKfmRiLl9kcm9wKCJjb2xsIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJjb2xsXCIpO1xuXG5jb2xsLnVwZGF0ZShcInRoZS1kb2N1bWVudC1rZXlcIiwgeyBsb2dvOiBcImF2b2NhZG9cIiB9LCB7IHJldHVybk5ldzogdHJ1ZSB9KTtcbmNvbGwudXBkYXRlKFsgXCJvbmVcIiwgXCJ0d29cIiwgeyBfa2V5OiBcInRocmVlXCIgfSBdLCBbIHsgdmFsOiAxIH0sIHsgdmFsOiAyIH0sIHsgdmFsOiAzIH0gXSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiY29sbC90aGUtZG9jdW1lbnQta2V5XCIsIFxuICBcIl9rZXlcIiA6IFwidGhlLWRvY3VtZW50LWtleVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNheENxLS1DXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2F4Q3EtLS1cIiwgXG4gIFwibmV3XCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJ0aGUtZG9jdW1lbnQta2V5XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdGhlLWRvY3VtZW50LWtleVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2F4Q3EtLUNcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFyYW5nb0RCXCIsIFxuICAgIFwidGFnc1wiIDogWyBcbiAgICAgIFwiZ3JhcGhcIiwgXG4gICAgICBcImRhdGFiYXNlXCIsIFxuICAgICAgXCJOb1NRTFwiIFxuICAgIF0sIFxuICAgIFwic2NhbGFibGVcIiA6IHRydWUsIFxuICAgIFwiY29tcGFueVwiIDogeyBcbiAgICAgIFwibmFtZVwiIDogXCJBcmFuZ29EQiBJbmMuXCIsIFxuICAgICAgXCJmb3VuZGVkXCIgOiAyMDE1IFxuICAgIH0sIFxuICAgIFwibG9nb1wiIDogXCJhdm9jYWRvXCIgXG4gIH0gXG59XG5cblsgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiY29sbC9vbmVcIiwgXG4gICAgXCJfa2V5XCIgOiBcIm9uZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2F4Q3UtLS1cIiwgXG4gICAgXCJfb2xkUmV2XCIgOiBcIl9qdDNheENxLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImNvbGwvdHdvXCIsIFxuICAgIFwiX2tleVwiIDogXCJ0d29cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNheEN1LS1fXCIsIFxuICAgIFwiX29sZFJldlwiIDogXCJfanQzYXhDcS0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJjb2xsL3RocmVlXCIsIFxuICAgIFwiX2tleVwiIDogXCJ0aHJlZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2F4Q3UtLUFcIiwgXG4gICAgXCJfb2xkUmV2XCIgOiBcIl9qdDNheENxLS1CXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImFyYW5nb3NoX3VwZGF0ZV9kb2N1bWVudHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "arangosh_use_database_single": { + "request": "LS0tCm5hbWU6IGFyYW5nb3NoX3VzZV9kYXRhYmFzZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlRGF0YWJhc2UoIm15ZGIiKTsKZGIuX3VzZURhdGFiYXNlKCJteWRiIik7Cn5kYi5fdXNlRGF0YWJhc2UoIl9zeXN0ZW0iKTsKfmRiLl9kcm9wRGF0YWJhc2UoIm15ZGIiKTs=", + "response": "eyJpbnB1dCI6ImRiLl91c2VEYXRhYmFzZShcIm15ZGJcIik7Iiwib3V0cHV0IjoidHJ1ZSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJhcmFuZ29zaF91c2VfZGF0YWJhc2UiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "col_dropIndex_single": { + "request": "LS0tCm5hbWU6IGNvbF9kcm9wSW5kZXgKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwp2YXIgaWR4MSA9IGRiLmV4YW1wbGUuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyJhIiwgImIiXSB9KTsKdmFyIGlkeDIgPSBkYi5leGFtcGxlLmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsiYyJdIH0pOwp2YXIgaW5kZXhJbmZvID0gZGIuZXhhbXBsZS5pbmRleGVzKCk7CmluZGV4SW5mbzsKZGIuZXhhbXBsZS5kcm9wSW5kZXgoaW5kZXhJbmZvWzFdKQpkYi5leGFtcGxlLmRyb3BJbmRleChpbmRleEluZm9bMl0uaWQpCmluZGV4SW5mbyA9IGRiLmV4YW1wbGUuaW5kZXhlcygpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6InZhciBpZHgxID0gZGIuZXhhbXBsZS5lbnN1cmVJbmRleCh7IHR5cGU6IFwicGVyc2lzdGVudFwiLCBmaWVsZHM6IFtcImFcIiwgXCJiXCJdIH0pO1xudmFyIGlkeDIgPSBkYi5leGFtcGxlLmVuc3VyZUluZGV4KHsgdHlwZTogXCJwZXJzaXN0ZW50XCIsIGZpZWxkczogW1wiY1wiXSB9KTtcbnZhciBpbmRleEluZm8gPSBkYi5leGFtcGxlLmluZGV4ZXMoKTtcbmluZGV4SW5mbztcbmRiLmV4YW1wbGUuZHJvcEluZGV4KGluZGV4SW5mb1sxXSlcbmRiLmV4YW1wbGUuZHJvcEluZGV4KGluZGV4SW5mb1syXS5pZClcbmluZGV4SW5mbyA9IGRiLmV4YW1wbGUuaW5kZXhlcygpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICBcIl9rZXlcIiBcbiAgICBdLCBcbiAgICBcImlkXCIgOiBcImV4YW1wbGUvMFwiLCBcbiAgICBcIm5hbWVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0eXBlXCIgOiBcInByaW1hcnlcIiwgXG4gICAgXCJ1bmlxdWVcIiA6IHRydWUgXG4gIH0sIFxuICB7IFxuICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gICAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgXCJhXCIsIFxuICAgICAgXCJiXCIgXG4gICAgXSwgXG4gICAgXCJpZFwiIDogXCJleGFtcGxlLzg0MTYyXCIsIFxuICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjI0MTYxNjY1MDI0MVwiLCBcbiAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgXCJ1bmlxdWVcIiA6IGZhbHNlIFxuICB9LCBcbiAgeyBcbiAgICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICAgIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgIFwiY1wiIFxuICAgIF0sIFxuICAgIFwiaWRcIiA6IFwiZXhhbXBsZS84NDE2NlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyNDE2MTc2OTg4MTZcIiwgXG4gICAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICAgIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICAgIFwidW5pcXVlXCIgOiBmYWxzZSBcbiAgfSBcbl1cblxudHJ1ZVxuXG50cnVlXG5cblsgXG4gIHsgXG4gICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICBcIl9rZXlcIiBcbiAgICBdLCBcbiAgICBcImlkXCIgOiBcImV4YW1wbGUvMFwiLCBcbiAgICBcIm5hbWVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0eXBlXCIgOiBcInByaW1hcnlcIiwgXG4gICAgXCJ1bmlxdWVcIiA6IHRydWUgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbF9kcm9wSW5kZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionCount_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25Db3VudApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJ1c2VycyIpOwp+ZGIudXNlcnMuc2F2ZShbe30sIHt9LCB7fV0pOwpkYi51c2Vycy5jb3VudCgpOwp+ZGIuX2Ryb3AoInVzZXJzIik7", + "response": "eyJpbnB1dCI6ImRiLnVzZXJzLmNvdW50KCk7Iiwib3V0cHV0IjoiMyIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uQ291bnQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDatabaseCreateKey_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZUNyZWF0ZUtleQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgidXNlcnMiLCB7IGtleU9wdGlvbnM6IHsgdHlwZTogImF1dG9pbmNyZW1lbnQiLCBvZmZzZXQ6IDEwLCBpbmNyZW1lbnQ6IDUgfSB9KTsKZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJ1c2VyIDEiIH0pOwpkYi51c2Vycy5zYXZlKHsgbmFtZTogInVzZXIgMiIgfSk7CmRiLnVzZXJzLnNhdmUoeyBuYW1lOiAidXNlciAzIiB9KTsKfmRiLl9kcm9wKCJ1c2VycyIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHsga2V5T3B0aW9uczogeyB0eXBlOiBcImF1dG9pbmNyZW1lbnRcIiwgb2Zmc2V0OiAxMCwgaW5jcmVtZW50OiA1IH0gfSk7XG5kYi51c2Vycy5zYXZlKHsgbmFtZTogXCJ1c2VyIDFcIiB9KTtcbmRiLnVzZXJzLnNhdmUoeyBuYW1lOiBcInVzZXIgMlwiIH0pO1xuZGIudXNlcnMuc2F2ZSh7IG5hbWU6IFwidXNlciAzXCIgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwidXNlcnMvMTBcIiwgXG4gIFwiX2tleVwiIDogXCIxMFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU1ZPLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcInVzZXJzLzE1XCIsIFxuICBcIl9rZXlcIiA6IFwiMTVcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNWUy0tLVwiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJ1c2Vycy8yMFwiLCBcbiAgXCJfa2V5XCIgOiBcIjIwXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTVlMtLV9cIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkRhdGFiYXNlQ3JlYXRlS2V5IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionDatabaseCreateProperties_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZUNyZWF0ZVByb3BlcnRpZXMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInVzZXJzIiwgeyB3YWl0Rm9yU3luYzogdHJ1ZSB9KTsKY29sbC5wcm9wZXJ0aWVzKCk7Cn5kYi5fZHJvcCgidXNlcnMiKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHsgd2FpdEZvclN5bmM6IHRydWUgfSk7XG5jb2xsLnByb3BlcnRpZXMoKTsiLCJvdXRwdXQiOiJ7IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MzE5OVwiLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcIndhaXRGb3JTeW5jXCIgOiB0cnVlLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uRGF0YWJhc2VDcmVhdGVQcm9wZXJ0aWVzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionDatabaseCreateSpecialKey_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZUNyZWF0ZVNwZWNpYWxLZXkKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInVzZXJzIiwgeyBrZXlPcHRpb25zOiB7IGFsbG93VXNlcktleXM6IGZhbHNlIH0gfSk7CmRiLnVzZXJzLnNhdmUoeyBuYW1lOiAidXNlciAxIiB9KTsKZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJ1c2VyIDIiLCBfa2V5OiAibXl1c2VyIiB9KTsgLy8geHBFcnJvcihFUlJPUl9BUkFOR09fRE9DVU1FTlRfS0VZX1VORVhQRUNURUQpCmRiLnVzZXJzLnNhdmUoeyBuYW1lOiAidXNlciAzIiB9KTsKfmRiLl9kcm9wKCJ1c2VycyIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHsga2V5T3B0aW9uczogeyBhbGxvd1VzZXJLZXlzOiBmYWxzZSB9IH0pO1xuZGIudXNlcnMuc2F2ZSh7IG5hbWU6IFwidXNlciAxXCIgfSk7XG5kYi51c2Vycy5zYXZlKHsgbmFtZTogXCJ1c2VyIDJcIiwgX2tleTogXCJteXVzZXJcIiB9KTsgXG5kYi51c2Vycy5zYXZlKHsgbmFtZTogXCJ1c2VyIDNcIiB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJ1c2Vycy83MzIyMFwiLCBcbiAgXCJfa2V5XCIgOiBcIjczMjIwXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTVzItLV9cIiBcbn1cblxuW0FyYW5nb0Vycm9yIDEyMjI6IHVuZXhwZWN0ZWQgZG9jdW1lbnQga2V5XSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uRGF0YWJhc2VDcmVhdGVTcGVjaWFsS2V5IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionDatabaseCreateSuccess_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZUNyZWF0ZVN1Y2Nlc3MKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInVzZXJzIik7CmNvbGwucHJvcGVydGllcygpOwp+ZGIuX2Ryb3AoInVzZXJzIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIpO1xuY29sbC5wcm9wZXJ0aWVzKCk7Iiwib3V0cHV0IjoieyBcbiAgXCJnbG9iYWxseVVuaXF1ZUlkXCIgOiBcImg2ODEzOEQ2MzA1REEvNzMxOTJcIiwgXG4gIFwiaXNTeXN0ZW1cIiA6IGZhbHNlLCBcbiAgXCJ3YWl0Rm9yU3luY1wiIDogZmFsc2UsIFxuICBcImtleU9wdGlvbnNcIiA6IHsgXG4gICAgXCJhbGxvd1VzZXJLZXlzXCIgOiB0cnVlLCBcbiAgICBcInR5cGVcIiA6IFwidHJhZGl0aW9uYWxcIiwgXG4gICAgXCJsYXN0VmFsdWVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiY29tcHV0ZWRWYWx1ZXNcIiA6IG51bGwsIFxuICBcInN5bmNCeVJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJzY2hlbWFcIiA6IG51bGwgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25EYXRhYmFzZUNyZWF0ZVN1Y2Nlc3MiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDatabaseDropByObject_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZURyb3BCeU9iamVjdApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CnZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oImV4YW1wbGUiKTsKZGIuX2Ryb3AoY29sbCk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJleGFtcGxlXCIpO1xuZGIuX2Ryb3AoY29sbCk7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25EYXRhYmFzZURyb3BCeU9iamVjdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "collectionDatabaseDropName_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZURyb3BOYW1lCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJleGFtcGxlIik7CmRiLl9kcm9wKCJleGFtcGxlIik7CmNvbGw7", + "response": "eyJpbnB1dCI6ImNvbGwgPSBkYi5fY29sbGVjdGlvbihcImV4YW1wbGVcIik7XG5kYi5fZHJvcChcImV4YW1wbGVcIik7XG5jb2xsOyIsIm91dHB1dCI6IltBcmFuZ29Db2xsZWN0aW9uIDczMjYwLCBcImV4YW1wbGVcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldXG5bQXJhbmdvQ29sbGVjdGlvbiA3MzI2MCwgXCJleGFtcGxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBkZWxldGVkKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkRhdGFiYXNlRHJvcE5hbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDatabaseDropSystem_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZURyb3BTeXN0ZW0KZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiX2V4YW1wbGUiLCB7IGlzU3lzdGVtOiB0cnVlIH0pOwp2YXIgY29sbCA9IGRiLl9leGFtcGxlOwpkYi5fZHJvcCgiX2V4YW1wbGUiLCB7IGlzU3lzdGVtOiB0cnVlIH0pOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2V4YW1wbGU7XG5kYi5fZHJvcChcIl9leGFtcGxlXCIsIHsgaXNTeXN0ZW06IHRydWUgfSk7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25EYXRhYmFzZURyb3BTeXN0ZW0iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDatabaseNameKnown_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZU5hbWVLbm93bgpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9jb2xsZWN0aW9uKCJkZW1vIik7", + "response": "eyJpbnB1dCI6ImRiLl9jb2xsZWN0aW9uKFwiZGVtb1wiKTsiLCJvdXRwdXQiOiJbQXJhbmdvQ29sbGVjdGlvbiAxMTcsIFwiZGVtb1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkRhdGFiYXNlTmFtZUtub3duIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionDatabaseNameUnknown_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZU5hbWVVbmtub3duCmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX2NvbGxlY3Rpb24oInVua25vd24iKTs=", + "response": "eyJpbnB1dCI6ImRiLl9jb2xsZWN0aW9uKFwidW5rbm93blwiKTsiLCJvdXRwdXQiOiJudWxsIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25EYXRhYmFzZU5hbWVVbmtub3duIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionDatabaseTruncateByObject_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZVRydW5jYXRlQnlPYmplY3QKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwp2YXIgY29sbCA9IGRiLl9jb2xsZWN0aW9uKCJleGFtcGxlIik7CnZhciBkb2MgPSBjb2xsLnNhdmUoeyAiSGVsbG8iIDogIldvcmxkIiB9KTsKY29sbC5jb3VudCgpOwpkYi5fdHJ1bmNhdGUoY29sbCk7CmNvbGwuY291bnQoKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJleGFtcGxlXCIpO1xudmFyIGRvYyA9IGNvbGwuc2F2ZSh7IFwiSGVsbG9cIiA6IFwiV29ybGRcIiB9KTtcbmNvbGwuY291bnQoKTtcbmRiLl90cnVuY2F0ZShjb2xsKTtcbmNvbGwuY291bnQoKTsiLCJvdXRwdXQiOiIxXG4wIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25EYXRhYmFzZVRydW5jYXRlQnlPYmplY3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDatabaseTruncateName_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25EYXRhYmFzZVRydW5jYXRlTmFtZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CnZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oImV4YW1wbGUiKTsKdmFyIGRvYyA9IGNvbGwuc2F2ZSh7ICJIZWxsbyIgOiAiV29ybGQiIH0pOwpjb2xsLmNvdW50KCk7CmRiLl90cnVuY2F0ZSgiZXhhbXBsZSIpOwpjb2xsLmNvdW50KCk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NvbGxlY3Rpb24oXCJleGFtcGxlXCIpO1xudmFyIGRvYyA9IGNvbGwuc2F2ZSh7IFwiSGVsbG9cIiA6IFwiV29ybGRcIiB9KTtcbmNvbGwuY291bnQoKTtcbmRiLl90cnVuY2F0ZShcImV4YW1wbGVcIik7XG5jb2xsLmNvdW50KCk7Iiwib3V0cHV0IjoiMVxuMCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uRGF0YWJhc2VUcnVuY2F0ZU5hbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDropSystem_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25Ecm9wU3lzdGVtCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoIl9leGFtcGxlIiwgeyBpc1N5c3RlbTogdHJ1ZSB9KTsKdmFyIGNvbGwgPSBkYi5fZXhhbXBsZTsKY29sbC5kcm9wKHsgaXNTeXN0ZW06IHRydWUgfSk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIsIHsgaXNTeXN0ZW06IHRydWUgfSk7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2V4YW1wbGU7XG5jb2xsLmRyb3AoeyBpc1N5c3RlbTogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkRyb3BTeXN0ZW0iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionDrop_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25Ecm9wCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKdmFyIGNvbGwgPSBkYi5leGFtcGxlOwpjb2xsLmRyb3AoKTsKY29sbDsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuZXhhbXBsZTtcbmNvbGwuZHJvcCgpO1xuY29sbDsiLCJvdXRwdXQiOiJbQXJhbmdvQ29sbGVjdGlvbiA3MjY5MSwgXCJleGFtcGxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBkZWxldGVkKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkRyb3AiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionEnsureIndex_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25FbnN1cmVJbmRleApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJ0ZXN0Iik7CmRiLnRlc3QuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyAiYSIgXSwgc3BhcnNlOiB0cnVlIH0pOwpkYi50ZXN0LmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsgImEiLCAiYiIgXSwgdW5pcXVlOiB0cnVlIH0pOwp+ZGIuX2Ryb3AoInRlc3QiKTs=", + "response": "eyJpbnB1dCI6ImRiLnRlc3QuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInBlcnNpc3RlbnRcIiwgZmllbGRzOiBbIFwiYVwiIF0sIHNwYXJzZTogdHJ1ZSB9KTtcbmRiLnRlc3QuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInBlcnNpc3RlbnRcIiwgZmllbGRzOiBbIFwiYVwiLCBcImJcIiBdLCB1bmlxdWU6IHRydWUgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgXCJmaWVsZHNcIiA6IFsgXG4gICAgXCJhXCIgXG4gIF0sIFxuICBcImlkXCIgOiBcInRlc3QvODQxNDhcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyNDE1ODUxOTI5NjFcIiwgXG4gIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gIFwic3BhcnNlXCIgOiB0cnVlLCBcbiAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufVxuXG57IFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcImFcIiwgXG4gICAgXCJiXCIgXG4gIF0sIFxuICBcImlkXCIgOiBcInRlc3QvODQxNTJcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyNDE1ODYyNDE1MzZcIiwgXG4gIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICBcInVuaXF1ZVwiIDogdHJ1ZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uRW5zdXJlSW5kZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionFiguresDetails_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25GaWd1cmVzRGV0YWlscwpkZXNjcmlwdGlvbjogJycKLS0tCn5yZXF1aXJlKCJpbnRlcm5hbCIpLndhbC5mbHVzaCh0cnVlLCB0cnVlKTsKZGIuZGVtby5maWd1cmVzKHRydWUp", + "response": "eyJpbnB1dCI6ImRiLmRlbW8uZmlndXJlcyh0cnVlKSIsIm91dHB1dCI6InsgXG4gIFwiaW5kZXhlc1wiIDogeyBcbiAgICBcImNvdW50XCIgOiAxLCBcbiAgICBcInNpemVcIiA6IDAgXG4gIH0sIFxuICBcImRvY3VtZW50c1NpemVcIiA6IDAsIFxuICBcImNhY2hlSW5Vc2VcIiA6IGZhbHNlLCBcbiAgXCJjYWNoZVNpemVcIiA6IDAsIFxuICBcImNhY2hlVXNhZ2VcIiA6IDAsIFxuICBcImVuZ2luZVwiIDogeyBcbiAgICBcImRvY3VtZW50c1wiIDogMSwgXG4gICAgXCJpbmRleGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJ0eXBlXCIgOiBcInByaW1hcnlcIiwgXG4gICAgICAgIFwiaWRcIiA6IDAsIFxuICAgICAgICBcImNvdW50XCIgOiAxIFxuICAgICAgfSBcbiAgICBdIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uRmlndXJlc0RldGFpbHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionFigures_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25GaWd1cmVzCmRlc2NyaXB0aW9uOiAnJwotLS0KfnJlcXVpcmUoImludGVybmFsIikud2FsLmZsdXNoKHRydWUsIHRydWUpOwpkYi5kZW1vLmZpZ3VyZXMoKQ==", + "response": "eyJpbnB1dCI6ImRiLmRlbW8uZmlndXJlcygpIiwib3V0cHV0IjoieyBcbiAgXCJpbmRleGVzXCIgOiB7IFxuICAgIFwiY291bnRcIiA6IDEsIFxuICAgIFwic2l6ZVwiIDogMCBcbiAgfSwgXG4gIFwiZG9jdW1lbnRzU2l6ZVwiIDogMCwgXG4gIFwiY2FjaGVJblVzZVwiIDogZmFsc2UsIFxuICBcImNhY2hlU2l6ZVwiIDogMCwgXG4gIFwiY2FjaGVVc2FnZVwiIDogMCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkZpZ3VyZXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionFirstExample_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25GaXJzdEV4YW1wbGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgidXNlcnMiKTsKfmRiLnVzZXJzLmluc2VydCh7IG5hbWU6ICJHZXJoYXJkIiB9KTsKfmRiLnVzZXJzLmluc2VydCh7IG5hbWU6ICJIZWxtdXQiIH0pOwp+ZGIudXNlcnMuaW5zZXJ0KHsgbmFtZTogIkFuZ2VsYSIgfSk7CmRiLnVzZXJzLmZpcnN0RXhhbXBsZSgibmFtZSIsICJBbmdlbGEiKTsKfmRiLl9kcm9wKCJ1c2VycyIpOw==", + "response": "eyJpbnB1dCI6ImRiLnVzZXJzLmZpcnN0RXhhbXBsZShcIm5hbWVcIiwgXCJBbmdlbGFcIik7Iiwib3V0cHV0IjoieyBcbiAgXCJfa2V5XCIgOiBcIjcyODg1XCIsIFxuICBcIl9pZFwiIDogXCJ1c2Vycy83Mjg4NVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUnI2LS1BXCIsIFxuICBcIm5hbWVcIiA6IFwiQW5nZWxhXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25GaXJzdEV4YW1wbGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionIndexesStats_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25JbmRleGVzU3RhdHMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp+ZGIuY29sbC5zYXZlKHsgYXR0cjogImZvbyIgfSk7Cn5kYi5jb2xsLnNhdmUoeyBhdHRyOiAiYmFyIiB9KTsKfmRiLmNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiAiaW52ZXJ0ZWQiLCBmaWVsZHM6IFsiYXR0ciJdLCBuYW1lOiAiaW52LWlkeCIgfSk7Cn5kYi5fY3JlYXRlVmlldygiYXJhbmdvc2VhcmNoLXZpZXciLCAiYXJhbmdvc2VhcmNoIiwgeyBsaW5rczogeyBjb2xsOiB7IGluY2x1ZGVBbGxGaWVsZHM6IHRydWUgfSB9IH0pOwp+YXNzZXJ0KGRiLl9xdWVyeShgRk9SIGQgaW4gwrRhcmFuZ29zZWFyY2gtdmlld8K0IENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGMgUkVUVVJOIGNgKS50b0FycmF5KClbMF0gPT09IDIpOwpkYi5jb2xsLmluZGV4ZXModHJ1ZSwgdHJ1ZSk7Cn5kYi5fZHJvcCgiY29sbCIpOwp+ZGIuX2Ryb3BWaWV3KCJhcmFuZ29zZWFyY2gtdmlldyIpOw==", + "response": "eyJpbnB1dCI6ImRiLmNvbGwuaW5kZXhlcyh0cnVlLCB0cnVlKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgXCJfa2V5XCIgXG4gICAgXSwgXG4gICAgXCJmaWd1cmVzXCIgOiB7IFxuICAgICAgXCJtZW1vcnlcIiA6IDY0LCBcbiAgICAgIFwiY2FjaGVJblVzZVwiIDogZmFsc2UsIFxuICAgICAgXCJjYWNoZVNpemVcIiA6IDAsIFxuICAgICAgXCJjYWNoZVVzYWdlXCIgOiAwIFxuICAgIH0sIFxuICAgIFwiaWRcIiA6IFwiY29sbC8wXCIsIFxuICAgIFwibmFtZVwiIDogXCJwcmltYXJ5XCIsIFxuICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICBcInR5cGVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICBcInVuaXF1ZVwiIDogdHJ1ZSBcbiAgfSwgXG4gIHsgXG4gICAgXCJhbmFseXplclwiIDogXCJpZGVudGl0eVwiLCBcbiAgICBcImNsZWFudXBJbnRlcnZhbFN0ZXBcIiA6IDIsIFxuICAgIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgICBcImNvbnNvbGlkYXRpb25JbnRlcnZhbE1zZWNcIiA6IDEwMDAsIFxuICAgIFwiY29uc29saWRhdGlvblBvbGljeVwiIDogeyBcbiAgICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgICAgXCJzZWdtZW50c0J5dGVzRmxvb3JcIiA6IDIwOTcxNTIsIFxuICAgICAgXCJzZWdtZW50c0J5dGVzTWF4XCIgOiA1MzY4NzA5MTIwLCBcbiAgICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICAgIFwic2VnbWVudHNNaW5cIiA6IDEsIFxuICAgICAgXCJtaW5TY29yZVwiIDogMCBcbiAgICB9LCBcbiAgICBcImZlYXR1cmVzXCIgOiBbIFxuICAgICAgXCJmcmVxdWVuY3lcIiwgXG4gICAgICBcIm5vcm1cIiBcbiAgICBdLCBcbiAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwibmFtZVwiIDogXCJhdHRyXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZmlndXJlc1wiIDogeyBcbiAgICAgIFwibnVtRG9jc1wiIDogMiwgXG4gICAgICBcIm51bVByaW1hcnlEb2NzXCIgOiAyLCBcbiAgICAgIFwibnVtTGl2ZURvY3NcIiA6IDIsIFxuICAgICAgXCJudW1TZWdtZW50c1wiIDogMSwgXG4gICAgICBcIm51bUZpbGVzXCIgOiA2LCBcbiAgICAgIFwiaW5kZXhTaXplXCIgOiA3MjcgXG4gICAgfSwgXG4gICAgXCJpZFwiIDogXCJjb2xsLzg0MTI5XCIsIFxuICAgIFwiaW5jbHVkZUFsbEZpZWxkc1wiIDogZmFsc2UsIFxuICAgIFwibmFtZVwiIDogXCJpbnYtaWR4XCIsIFxuICAgIFwicHJpbWFyeVNvcnRcIiA6IHsgXG4gICAgICBcImZpZWxkc1wiIDogWyBdLCBcbiAgICAgIFwiY29tcHJlc3Npb25cIiA6IFwibHo0XCIgXG4gICAgfSwgXG4gICAgXCJzZWFyY2hGaWVsZFwiIDogZmFsc2UsIFxuICAgIFwic3BhcnNlXCIgOiB0cnVlLCBcbiAgICBcInN0b3JlZFZhbHVlc1wiIDogWyBdLCBcbiAgICBcInRyYWNrTGlzdFBvc2l0aW9uc1wiIDogZmFsc2UsIFxuICAgIFwidHlwZVwiIDogXCJpbnZlcnRlZFwiLCBcbiAgICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICAgIFwidmVyc2lvblwiIDogMSwgXG4gICAgXCJ3cml0ZWJ1ZmZlckFjdGl2ZVwiIDogMCwgXG4gICAgXCJ3cml0ZWJ1ZmZlcklkbGVcIiA6IDY0LCBcbiAgICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIgXG4gIH0sIFxuICB7IFxuICAgIFwiYW5hbHl6ZXJzXCIgOiBbIFxuICAgICAgXCJpZGVudGl0eVwiIFxuICAgIF0sIFxuICAgIFwiZmllbGRzXCIgOiB7IFxuICAgIH0sIFxuICAgIFwiZmlndXJlc1wiIDogeyBcbiAgICAgIFwibnVtRG9jc1wiIDogMiwgXG4gICAgICBcIm51bVByaW1hcnlEb2NzXCIgOiAyLCBcbiAgICAgIFwibnVtTGl2ZURvY3NcIiA6IDIsIFxuICAgICAgXCJudW1TZWdtZW50c1wiIDogMSwgXG4gICAgICBcIm51bUZpbGVzXCIgOiA2LCBcbiAgICAgIFwiaW5kZXhTaXplXCIgOiAxMjM5IFxuICAgIH0sIFxuICAgIFwiaWRcIiA6IFwiY29sbC84NDEzM1wiLCBcbiAgICBcImluY2x1ZGVBbGxGaWVsZHNcIiA6IHRydWUsIFxuICAgIFwic3RvcmVWYWx1ZXNcIiA6IFwibm9uZVwiLCBcbiAgICBcInRyYWNrTGlzdFBvc2l0aW9uc1wiIDogZmFsc2UsIFxuICAgIFwidHlwZVwiIDogXCJhcmFuZ29zZWFyY2hcIiwgXG4gICAgXCJ2aWV3XCIgOiBcImg2ODEzOEQ2MzA1REEvODQxMzFcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbkluZGV4ZXNTdGF0cyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "collectionIndexes_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25JbmRleGVzCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoInRlc3QiKTsKfmRiLnRlc3QuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyJhdHRyaWJ1dGUiXSwgdW5pcXVlOiB0cnVlIH0pOwp+ZGIudGVzdC5lbnN1cmVJbmRleCh7IHR5cGU6ICJwZXJzaXN0ZW50IiwgZmllbGRzOiBbInVuaXF1ZUF0dHJpYnV0ZSJdLCB1bmlxdWU6IHRydWUgfSk7Cn5kYi50ZXN0LmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsiYXR0cmlidXRlIiwgInNlY29uZEF0dHJpYnV0ZS5zdWJBdHRyaWJ1dGUiXSB9KTsKZGIudGVzdC5pbmRleGVzKCk7Cn5kYi5fZHJvcCgidGVzdCIpOw==", + "response": "eyJpbnB1dCI6ImRiLnRlc3QuaW5kZXhlcygpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICBcIl9rZXlcIiBcbiAgICBdLCBcbiAgICBcImlkXCIgOiBcInRlc3QvMFwiLCBcbiAgICBcIm5hbWVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0eXBlXCIgOiBcInByaW1hcnlcIiwgXG4gICAgXCJ1bmlxdWVcIiA6IHRydWUgXG4gIH0sIFxuICB7IFxuICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gICAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgXCJhdHRyaWJ1dGVcIiBcbiAgICBdLCBcbiAgICBcImlkXCIgOiBcInRlc3QvODQxMDZcIiwgXG4gICAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MjQxNDkwODIxMTIwXCIsIFxuICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgICBcInVuaXF1ZVwiIDogdHJ1ZSBcbiAgfSwgXG4gIHsgXG4gICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICBcInVuaXF1ZUF0dHJpYnV0ZVwiIFxuICAgIF0sIFxuICAgIFwiaWRcIiA6IFwidGVzdC84NDExMFwiLCBcbiAgICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyNDE0OTE4Njk2OTZcIiwgXG4gICAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgICBcInNwYXJzZVwiIDogZmFsc2UsIFxuICAgIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICAgIFwidW5pcXVlXCIgOiB0cnVlIFxuICB9LCBcbiAgeyBcbiAgICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICAgIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICAgIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgIFwiYXR0cmlidXRlXCIsIFxuICAgICAgXCJzZWNvbmRBdHRyaWJ1dGUuc3ViQXR0cmlidXRlXCIgXG4gICAgXSwgXG4gICAgXCJpZFwiIDogXCJ0ZXN0Lzg0MTE0XCIsIFxuICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjI0MTQ5MTg2OTY5N1wiLCBcbiAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgXCJ1bmlxdWVcIiA6IGZhbHNlIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uSW5kZXhlcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "collectionIterate_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25JdGVyYXRlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKdmFyIGFyciA9IFtdOwpmb3IgKHZhciBpID0gMDsgIGkgPCAxMDsgIGkrKykgewogIGFyci5wdXNoKHsgaSB9KTsKfQp2YXIgbWV0YSA9IGRiLmV4YW1wbGUuc2F2ZShhcnIpOwp2YXIgZGF0YSA9IFtdOwpkYi5leGFtcGxlLml0ZXJhdGUoIChkb2MsIGlkeCkgPT4gZGF0YS5wdXNoKHsgaWR4LCBpOiBkb2MuaSB9KSwgeyBwcm9iYWJpbGl0eTogMC4yNSwgbGltaXQ6IDUgfSk7CmRhdGE7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6InZhciBhcnIgPSBbXTtcbmZvciAodmFyIGkgPSAwOyAgaSBcdTAwM2MgMTA7ICBpKyspIHtcbiAgYXJyLnB1c2goeyBpIH0pO1xufVxudmFyIG1ldGEgPSBkYi5leGFtcGxlLnNhdmUoYXJyKTtcbnZhciBkYXRhID0gW107XG5kYi5leGFtcGxlLml0ZXJhdGUoIChkb2MsIGlkeCkgPVx1MDAzZSBkYXRhLnB1c2goeyBpZHgsIGk6IGRvYy5pIH0pLCB7IHByb2JhYmlsaXR5OiAwLjI1LCBsaW1pdDogNSB9KTtcbmRhdGE7Iiwib3V0cHV0IjoiMTBcblxuXG5bIFxuICB7IFxuICAgIFwiaWR4XCIgOiAwLCBcbiAgICBcImlcIiA6IDAgXG4gIH0sIFxuICB7IFxuICAgIFwiaWR4XCIgOiAxLCBcbiAgICBcImlcIiA6IDcgXG4gIH0sIFxuICB7IFxuICAgIFwiaWR4XCIgOiAyLCBcbiAgICBcImlcIiA6IDkgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25JdGVyYXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionLookupByKeys_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25Mb29rdXBCeUtleXMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2Ryb3AoImV4YW1wbGUiKTsKfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKdmFyIGtleXMgPSBbIF07CmZvciAodmFyIGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgZGIuZXhhbXBsZS5pbnNlcnQoeyBfa2V5OiAidGVzdCIgKyBpLCB2YWx1ZTogaSB9KTsKICBrZXlzLnB1c2goInRlc3QiICsgaSk7Cn0KZGIuZXhhbXBsZS5kb2N1bWVudHMoa2V5cyk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6InZhciBrZXlzID0gWyBdO1xuZm9yICh2YXIgaSA9IDA7IGkgXHUwMDNjIDU7ICsraSkge1xuICBkYi5leGFtcGxlLmluc2VydCh7IF9rZXk6IFwidGVzdFwiICsgaSwgdmFsdWU6IGkgfSk7XG4gIGtleXMucHVzaChcInRlc3RcIiArIGkpO1xufVxuZGIuZXhhbXBsZS5kb2N1bWVudHMoa2V5cyk7Iiwib3V0cHV0IjoiNVxuXG57IFxuICBcImRvY3VtZW50c1wiIDogWyBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcInRlc3QwXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZXhhbXBsZS90ZXN0MFwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVJxYS0tLVwiLCBcbiAgICAgIFwidmFsdWVcIiA6IDAgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCJ0ZXN0MVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvdGVzdDFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FScWEtLV9cIiwgXG4gICAgICBcInZhbHVlXCIgOiAxIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcIl9rZXlcIiA6IFwidGVzdDJcIiwgXG4gICAgICBcIl9pZFwiIDogXCJleGFtcGxlL3Rlc3QyXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhUnFhLS1BXCIsIFxuICAgICAgXCJ2YWx1ZVwiIDogMiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJfa2V5XCIgOiBcInRlc3QzXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZXhhbXBsZS90ZXN0M1wiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVJxYS0tQlwiLCBcbiAgICAgIFwidmFsdWVcIiA6IDMgXG4gICAgfSwgXG4gICAgeyBcbiAgICAgIFwiX2tleVwiIDogXCJ0ZXN0NFwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvdGVzdDRcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FScWUtLS1cIiwgXG4gICAgICBcInZhbHVlXCIgOiA0IFxuICAgIH0gXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25Mb29rdXBCeUtleXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionName_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25OYW1lCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJleGFtcGxlIik7CmNvbGwubmFtZSgpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcImV4YW1wbGVcIik7XG5jb2xsLm5hbWUoKTsiLCJvdXRwdXQiOiJleGFtcGxlIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25OYW1lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionProperties_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25Qcm9wZXJ0aWVzCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKZGIuZXhhbXBsZS5wcm9wZXJ0aWVzKCk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUucHJvcGVydGllcygpOyIsIm91dHB1dCI6InsgXG4gIFwiZ2xvYmFsbHlVbmlxdWVJZFwiIDogXCJoNjgxMzhENjMwNURBLzcyNzEwXCIsIFxuICBcImlzU3lzdGVtXCIgOiBmYWxzZSwgXG4gIFwid2FpdEZvclN5bmNcIiA6IGZhbHNlLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uUHJvcGVydGllcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "collectionProperty_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25Qcm9wZXJ0eQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmRiLmV4YW1wbGUucHJvcGVydGllcyh7IHdhaXRGb3JTeW5jIDogdHJ1ZSB9KTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUucHJvcGVydGllcyh7IHdhaXRGb3JTeW5jIDogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcImdsb2JhbGx5VW5pcXVlSWRcIiA6IFwiaDY4MTM4RDYzMDVEQS83MjcxN1wiLCBcbiAgXCJpc1N5c3RlbVwiIDogZmFsc2UsIFxuICBcIndhaXRGb3JTeW5jXCIgOiB0cnVlLCBcbiAgXCJrZXlPcHRpb25zXCIgOiB7IFxuICAgIFwiYWxsb3dVc2VyS2V5c1wiIDogdHJ1ZSwgXG4gICAgXCJ0eXBlXCIgOiBcInRyYWRpdGlvbmFsXCIsIFxuICAgIFwibGFzdFZhbHVlXCIgOiAwIFxuICB9LCBcbiAgXCJ3cml0ZUNvbmNlcm5cIiA6IDEsIFxuICBcImNhY2hlRW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImNvbXB1dGVkVmFsdWVzXCIgOiBudWxsLCBcbiAgXCJzeW5jQnlSZXZpc2lvblwiIDogdHJ1ZSwgXG4gIFwic2NoZW1hXCIgOiBudWxsIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uUHJvcGVydHkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionRemoveByKeys_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25SZW1vdmVCeUtleXMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2Ryb3AoImV4YW1wbGUiKTsKfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKdmFyIGtleXMgPSBbIF07CmZvciAodmFyIGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgZGIuZXhhbXBsZS5pbnNlcnQoeyBfa2V5OiAidGVzdCIgKyBpLCB2YWx1ZTogaSB9KTsKICBrZXlzLnB1c2goInRlc3QiICsgaSk7Cn0KZGIuZXhhbXBsZS5yZW1vdmVCeUtleXMoa2V5cyk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6InZhciBrZXlzID0gWyBdO1xuZm9yICh2YXIgaSA9IDA7IGkgXHUwMDNjIDU7ICsraSkge1xuICBkYi5leGFtcGxlLmluc2VydCh7IF9rZXk6IFwidGVzdFwiICsgaSwgdmFsdWU6IGkgfSk7XG4gIGtleXMucHVzaChcInRlc3RcIiArIGkpO1xufVxuZGIuZXhhbXBsZS5yZW1vdmVCeUtleXMoa2V5cyk7Iiwib3V0cHV0IjoiNVxuXG57IFxuICBcInJlbW92ZWRcIiA6IDUsIFxuICBcImlnbm9yZWRcIiA6IDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImNvbGxlY3Rpb25SZW1vdmVCeUtleXMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionRename_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25SZW5hbWUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwp2YXIgY29sbCA9IGRiLmV4YW1wbGU7CmNvbGwucmVuYW1lKCJiZXR0ZXItZXhhbXBsZSIpOwpjb2xsOwp+ZGIuX2Ryb3AoImJldHRlci1leGFtcGxlIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuZXhhbXBsZTtcbmNvbGwucmVuYW1lKFwiYmV0dGVyLWV4YW1wbGVcIik7XG5jb2xsOyIsIm91dHB1dCI6IltBcmFuZ29Db2xsZWN0aW9uIDcyNzI1LCBcImJldHRlci1leGFtcGxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uUmVuYW1lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "collectionTruncate_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25UcnVuY2F0ZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CnZhciBjb2xsID0gZGIuZXhhbXBsZTsKdmFyIGRvYyA9IGNvbGwuc2F2ZSh7ICJIZWxsbyIgOiAiV29ybGQiIH0pOwpjb2xsLmNvdW50KCk7CmNvbGwudHJ1bmNhdGUoKTsKY29sbC5jb3VudCgpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuZXhhbXBsZTtcbnZhciBkb2MgPSBjb2xsLnNhdmUoeyBcIkhlbGxvXCIgOiBcIldvcmxkXCIgfSk7XG5jb2xsLmNvdW50KCk7XG5jb2xsLnRydW5jYXRlKCk7XG5jb2xsLmNvdW50KCk7Iiwib3V0cHV0IjoiMVxuMCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb2xsZWN0aW9uVHJ1bmNhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "collectionsDatabaseName_single": { + "request": "LS0tCm5hbWU6IGNvbGxlY3Rpb25zRGF0YWJhc2VOYW1lCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKZGIuX2NvbGxlY3Rpb25zKCk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLl9jb2xsZWN0aW9ucygpOyIsIm91dHB1dCI6IlsgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDE5LCBcIl9hbmFseXplcnNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gMzQsIFwiX2FwcGJ1bmRsZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gMzEsIFwiX2FwcHNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gMjIsIFwiX2FxbGZ1bmN0aW9uc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiAzNywgXCJfZnJvbnRlbmRcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNywgXCJfZ3JhcGhzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDI4LCBcIl9qb2JzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDQwLCBcIl9wcmVnZWxfcXVlcmllc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiAyNSwgXCJfcXVldWVzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDEwLCBcIl9zdGF0aXN0aWNzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDEzLCBcIl9zdGF0aXN0aWNzMTVcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gMTYsIFwiX3N0YXRpc3RpY3NSYXdcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNCwgXCJfdXNlcnNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gMTIzLCBcImFuaW1hbHNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gMTE3LCBcImRlbW9cIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgW0FyYW5nb0NvbGxlY3Rpb24gNzMyMjYsIFwiZXhhbXBsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiAxMTIsIFwiaWdub3JlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFtBcmFuZ29Db2xsZWN0aW9uIDY3MjkwLCBcIm15Y29sbGVjdGlvblwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBbQXJhbmdvQ29sbGVjdGlvbiA2Nzg5NiwgXCJzY2hlbWFDb2xsZWN0aW9uXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29sbGVjdGlvbnNEYXRhYmFzZU5hbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "computedValuesCombine_single": { + "request": "LS0tCm5hbWU6IGNvbXB1dGVkVmFsdWVzQ29tYmluZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgidXNlcnMiLCB7CiAgY29tcHV0ZWRWYWx1ZXM6IFsKICAgIHsKICAgICAgbmFtZTogInNlYXJjaFRhZ3MiLAogICAgICBleHByZXNzaW9uOiAiUkVUVVJOIEFQUEVORChAZG9jLmlzWyogRklMVEVSIENVUlJFTlQucHVibGljID09IHRydWUgUkVUVVJOIExPV0VSKENVUlJFTlQubmFtZSldLCBAZG9jLmxvdmVzWyogUkVUVVJOIExPV0VSKENVUlJFTlQpXSkiLAogICAgICBvdmVyd3JpdGU6IHRydWUKICAgIH0KICBdCn0pOwp2YXIgZG9jID0gZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJQYXVsYSBQbGFudCIsIGlzOiBbIHsgbmFtZTogIkdhcmRlbmVyIiwgcHVibGljOiB0cnVlIH0sIHsgbmFtZTogImZlbWFsZSIgfSBdLCBsb3ZlczogWyJBVk9DQURPUyIsICJEYXRhYmFzZXMiXSB9KTsKdmFyIGlkeCA9IGRiLnVzZXJzLmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsic2VhcmNoVGFnc1sqXSJdIH0pOwpkYi5fcXVlcnkoYEZPUiB1IElOIHVzZXJzIEZJTFRFUiAiYXZvY2Fkb3MiIElOIHUuc2VhcmNoVGFncyBSRVRVUk4gdWApLnRvQXJyYXkoKTsKfmRiLl9kcm9wKCJ1c2VycyIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHtcbiAgY29tcHV0ZWRWYWx1ZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInNlYXJjaFRhZ3NcIixcbiAgICAgIGV4cHJlc3Npb246IFwiUkVUVVJOIEFQUEVORChAZG9jLmlzWyogRklMVEVSIENVUlJFTlQucHVibGljID09IHRydWUgUkVUVVJOIExPV0VSKENVUlJFTlQubmFtZSldLCBAZG9jLmxvdmVzWyogUkVUVVJOIExPV0VSKENVUlJFTlQpXSlcIixcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZVxuICAgIH1cbiAgXVxufSk7XG52YXIgZG9jID0gZGIudXNlcnMuc2F2ZSh7IG5hbWU6IFwiUGF1bGEgUGxhbnRcIiwgaXM6IFsgeyBuYW1lOiBcIkdhcmRlbmVyXCIsIHB1YmxpYzogdHJ1ZSB9LCB7IG5hbWU6IFwiZmVtYWxlXCIgfSBdLCBsb3ZlczogW1wiQVZPQ0FET1NcIiwgXCJEYXRhYmFzZXNcIl0gfSk7XG52YXIgaWR4ID0gZGIudXNlcnMuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInBlcnNpc3RlbnRcIiwgZmllbGRzOiBbXCJzZWFyY2hUYWdzWypdXCJdIH0pO1xuZGIuX3F1ZXJ5KGBGT1IgdSBJTiB1c2VycyBGSUxURVIgXCJhdm9jYWRvc1wiIElOIHUuc2VhcmNoVGFncyBSRVRVUk4gdWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzgwOFwiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy82NzgwOFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1piUHUtLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIlBhdWxhIFBsYW50XCIsIFxuICAgIFwiaXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIm5hbWVcIiA6IFwiR2FyZGVuZXJcIiwgXG4gICAgICAgIFwicHVibGljXCIgOiB0cnVlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIm5hbWVcIiA6IFwiZmVtYWxlXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwibG92ZXNcIiA6IFsgXG4gICAgICBcIkFWT0NBRE9TXCIsIFxuICAgICAgXCJEYXRhYmFzZXNcIiBcbiAgICBdLCBcbiAgICBcInNlYXJjaFRhZ3NcIiA6IFsgXG4gICAgICBcImdhcmRlbmVyXCIsIFxuICAgICAgXCJhdm9jYWRvc1wiLCBcbiAgICAgIFwiZGF0YWJhc2VzXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29tcHV0ZWRWYWx1ZXNDb21iaW5lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "computedValuesCreatedAt_single": { + "request": "LS0tCm5hbWU6IGNvbXB1dGVkVmFsdWVzQ3JlYXRlZEF0CmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJ1c2VycyIsIHsKICBjb21wdXRlZFZhbHVlczogWwogICAgewogICAgICBuYW1lOiAiY3JlYXRlZEF0IiwKICAgICAgZXhwcmVzc2lvbjogIlJFVFVSTiBEQVRFX05PVygpIiwKICAgICAgb3ZlcndyaXRlOiB0cnVlLAogICAgICBjb21wdXRlT246IFsiaW5zZXJ0Il0KICAgIH0KICBdCn0pOwp2YXIgZG9jID0gZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJQYXVsYSBQbGFudCIgfSk7CmRiLnVzZXJzLnRvQXJyYXkoKTsKfmRiLl9kcm9wKCJ1c2VycyIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHtcbiAgY29tcHV0ZWRWYWx1ZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNyZWF0ZWRBdFwiLFxuICAgICAgZXhwcmVzc2lvbjogXCJSRVRVUk4gREFURV9OT1coKVwiLFxuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgY29tcHV0ZU9uOiBbXCJpbnNlcnRcIl1cbiAgICB9XG4gIF1cbn0pO1xudmFyIGRvYyA9IGRiLnVzZXJzLnNhdmUoeyBuYW1lOiBcIlBhdWxhIFBsYW50XCIgfSk7XG5kYi51c2Vycy50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjc3NThcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjc3NThcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYk9xLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJQYXVsYSBQbGFudFwiLCBcbiAgICBcImNyZWF0ZWRBdFwiIDogMTc0ODAyNDEyODc3OSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiY29tcHV0ZWRWYWx1ZXNDcmVhdGVkQXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "computedValuesKeepNull_single": { + "request": "LS0tCm5hbWU6IGNvbXB1dGVkVmFsdWVzS2VlcE51bGwKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoInVzZXJzIiwgewogIGNvbXB1dGVkVmFsdWVzOiBbCiAgICB7CiAgICAgIG5hbWU6ICJmdWxsTmFtZSIsCiAgICAgIGV4cHJlc3Npb246ICJSRVRVUk4gQGRvYy5maXJzdE5hbWUgIT0gbnVsbCBBTkQgQGRvYy5sYXN0TmFtZSAhPSBudWxsID8gQ09OQ0FUX1NFUEFSQVRPUignICcsIEBkb2MuZmlyc3ROYW1lLCBAZG9jLmxhc3ROYW1lKSA6IG51bGwiLAogICAgICBvdmVyd3JpdGU6IGZhbHNlLAogICAgICBrZWVwTnVsbDogZmFsc2UKICAgIH0KICBdCn0pOwp2YXIgZG9jcyA9IGRiLnVzZXJzLnNhdmUoWwogIHsgZmlyc3ROYW1lOiAiUGF1bGEiLCBsYXN0TmFtZTogIlBsYW50IiB9LAogIHsgZmlyc3ROYW1lOiAiSmFtZXMiIH0sCiAgeyBsYXN0TmFtZTogIkJhcnJldHQiLCBmdWxsTmFtZTogIkFuZHkgSi4gQmFycmV0dCIgfQpdKTsKZGIudXNlcnMudG9BcnJheSgpOwp+ZGIuX2Ryb3AoInVzZXJzIik7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHtcbiAgY29tcHV0ZWRWYWx1ZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImZ1bGxOYW1lXCIsXG4gICAgICBleHByZXNzaW9uOiBcIlJFVFVSTiBAZG9jLmZpcnN0TmFtZSAhPSBudWxsIEFORCBAZG9jLmxhc3ROYW1lICE9IG51bGwgPyBDT05DQVRfU0VQQVJBVE9SKCcgJywgQGRvYy5maXJzdE5hbWUsIEBkb2MubGFzdE5hbWUpIDogbnVsbFwiLFxuICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAgIGtlZXBOdWxsOiBmYWxzZVxuICAgIH1cbiAgXVxufSk7XG52YXIgZG9jcyA9IGRiLnVzZXJzLnNhdmUoW1xuICB7IGZpcnN0TmFtZTogXCJQYXVsYVwiLCBsYXN0TmFtZTogXCJQbGFudFwiIH0sXG4gIHsgZmlyc3ROYW1lOiBcIkphbWVzXCIgfSxcbiAgeyBsYXN0TmFtZTogXCJCYXJyZXR0XCIsIGZ1bGxOYW1lOiBcIkFuZHkgSi4gQmFycmV0dFwiIH1cbl0pO1xuZGIudXNlcnMudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY3ODM0XCIsIFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzY3ODM0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmJRQy0tLVwiLCBcbiAgICBcImZpcnN0TmFtZVwiIDogXCJQYXVsYVwiLCBcbiAgICBcImxhc3ROYW1lXCIgOiBcIlBsYW50XCIsIFxuICAgIFwiZnVsbE5hbWVcIiA6IFwiUGF1bGEgUGxhbnRcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY3ODM1XCIsIFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzY3ODM1XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmJRQy0tX1wiLCBcbiAgICBcImZpcnN0TmFtZVwiIDogXCJKYW1lc1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjc4MzZcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjc4MzZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYlFDLS1BXCIsIFxuICAgIFwibGFzdE5hbWVcIiA6IFwiQmFycmV0dFwiLCBcbiAgICBcImZ1bGxOYW1lXCIgOiBcIkFuZHkgSi4gQmFycmV0dFwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb21wdXRlZFZhbHVlc0tlZXBOdWxsIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "computedValuesModifiedAt_single": { + "request": "LS0tCm5hbWU6IGNvbXB1dGVkVmFsdWVzTW9kaWZpZWRBdApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgidXNlcnMiLCB7CiAgY29tcHV0ZWRWYWx1ZXM6IFsKICAgIHsKICAgICAgbmFtZTogIm1vZGlmaWVkQXQiLAogICAgICBleHByZXNzaW9uOiAiUkVUVVJOIFpJUChbJ2RhdGUnLCAndGltZSddLCBTUExJVChEQVRFX0lTTzg2MDEoREFURV9OT1coKSksICdUJykpIiwKICAgICAgb3ZlcndyaXRlOiBmYWxzZSwKICAgICAgY29tcHV0ZU9uOiBbInVwZGF0ZSIsICJyZXBsYWNlIl0KICAgIH0KICBdCn0pOwp2YXIgZG9jID0gZGIudXNlcnMuc2F2ZSh7IF9rZXk6ICIxMjMiLCBuYW1lOiAiUGF1bGEgUGxhbnQiIH0pOwpkb2MgPSBkYi51c2Vycy51cGRhdGUoIjEyMyIsIHsgZW1haWw6ICJnYXJkZW5lckBhcmFuZ29kYi5jb20iIH0pOwpkYi51c2Vycy50b0FycmF5KCk7CmRvYyA9IGRiLnVzZXJzLnVwZGF0ZSgiMTIzIiwgeyBlbWFpbDogImdyZWVuaG91c2VAYXJhbmdvZGIuY29tIiwgbW9kaWZpZWRBdDogeyBkYXRlOiAiMjAxOS0wMS0wMSIsIHRpbWU6ICIyMDozMDowMC4wMDBaIiB9IH0pOwpkYi51c2Vycy50b0FycmF5KCk7Cn5kYi5fZHJvcCgidXNlcnMiKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHtcbiAgY29tcHV0ZWRWYWx1ZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiBcIm1vZGlmaWVkQXRcIixcbiAgICAgIGV4cHJlc3Npb246IFwiUkVUVVJOIFpJUChbJ2RhdGUnLCAndGltZSddLCBTUExJVChEQVRFX0lTTzg2MDEoREFURV9OT1coKSksICdUJykpXCIsXG4gICAgICBvdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgY29tcHV0ZU9uOiBbXCJ1cGRhdGVcIiwgXCJyZXBsYWNlXCJdXG4gICAgfVxuICBdXG59KTtcbnZhciBkb2MgPSBkYi51c2Vycy5zYXZlKHsgX2tleTogXCIxMjNcIiwgbmFtZTogXCJQYXVsYSBQbGFudFwiIH0pO1xuZG9jID0gZGIudXNlcnMudXBkYXRlKFwiMTIzXCIsIHsgZW1haWw6IFwiZ2FyZGVuZXJAYXJhbmdvZGIuY29tXCIgfSk7XG5kYi51c2Vycy50b0FycmF5KCk7XG5kb2MgPSBkYi51c2Vycy51cGRhdGUoXCIxMjNcIiwgeyBlbWFpbDogXCJncmVlbmhvdXNlQGFyYW5nb2RiLmNvbVwiLCBtb2RpZmllZEF0OiB7IGRhdGU6IFwiMjAxOS0wMS0wMVwiLCB0aW1lOiBcIjIwOjMwOjAwLjAwMFpcIiB9IH0pO1xuZGIudXNlcnMudG9BcnJheSgpOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcInVzZXJzLzEyM1wiLCBcbiAgXCJfa2V5XCIgOiBcIjEyM1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaYlBDLS0tXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M1piUC0tLV9cIiBcbn1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiMTIzXCIsIFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzEyM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1piUEMtLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIlBhdWxhIFBsYW50XCIsIFxuICAgIFwiZW1haWxcIiA6IFwiZ2FyZGVuZXJAYXJhbmdvZGIuY29tXCIsIFxuICAgIFwibW9kaWZpZWRBdFwiIDogeyBcbiAgICAgIFwiZGF0ZVwiIDogXCIyMDI1LTA1LTIzXCIsIFxuICAgICAgXCJ0aW1lXCIgOiBcIjE4OjE1OjI4Ljc4NVpcIiBcbiAgICB9IFxuICB9IFxuXVxuXG57IFxuICBcIl9pZFwiIDogXCJ1c2Vycy8xMjNcIiwgXG4gIFwiX2tleVwiIDogXCIxMjNcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWmJQRy0tLVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNaYlBDLS0tXCIgXG59XG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjEyM1wiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy8xMjNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYlBHLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJQYXVsYSBQbGFudFwiLCBcbiAgICBcImVtYWlsXCIgOiBcImdyZWVuaG91c2VAYXJhbmdvZGIuY29tXCIsIFxuICAgIFwibW9kaWZpZWRBdFwiIDogeyBcbiAgICAgIFwiZGF0ZVwiIDogXCIyMDE5LTAxLTAxXCIsIFxuICAgICAgXCJ0aW1lXCIgOiBcIjIwOjMwOjAwLjAwMFpcIiBcbiAgICB9IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb21wdXRlZFZhbHVlc01vZGlmaWVkQXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "computedValuesSubattribute_single": { + "request": "LS0tCm5hbWU6IGNvbXB1dGVkVmFsdWVzU3ViYXR0cmlidXRlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJ1c2VycyIsIHsKICBjb21wdXRlZFZhbHVlczogWwogICAgewogICAgICBuYW1lOiAibmFtZSIsCiAgICAgIGV4cHJlc3Npb246ICJSRVRVUk4gSVNfU1RSSU5HKEBkb2MubmFtZS5maXJzdCkgQU5EIElTX1NUUklORyhAZG9jLm5hbWUubGFzdCkgPyBNRVJHRShAZG9jLm5hbWUsIHsgJ2Z1bGwnOiBDT05DQVRfU0VQQVJBVE9SKCcgJywgQGRvYy5uYW1lLmZpcnN0LCBAZG9jLm5hbWUubGFzdCkgfSkgOiBAZG9jLm5hbWUiLAogICAgICBvdmVyd3JpdGU6IHRydWUgLy8gbXVzdCBiZSB0cnVlIHRvIHJlcGxhY2UgdGhlIHRvcC1sZXZlbCAibmFtZSIgYXR0cmlidXRlCiAgICB9CiAgXQp9KTsKdmFyIGRvY3MgPSBkYi51c2Vycy5zYXZlKFsKICB7IG5hbWU6IHsgZmlyc3Q6ICJKYW1lcyIgfSB9LAogIHsgbmFtZTogeyBmaXJzdDogIlBhdWxhIiwgbGFzdDogIlBsYW50IiB9IH0KXSk7CmRiLnVzZXJzLnRvQXJyYXkoKTsKfmRiLl9kcm9wKCJ1c2VycyIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcInVzZXJzXCIsIHtcbiAgY29tcHV0ZWRWYWx1ZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgIGV4cHJlc3Npb246IFwiUkVUVVJOIElTX1NUUklORyhAZG9jLm5hbWUuZmlyc3QpIEFORCBJU19TVFJJTkcoQGRvYy5uYW1lLmxhc3QpID8gTUVSR0UoQGRvYy5uYW1lLCB7ICdmdWxsJzogQ09OQ0FUX1NFUEFSQVRPUignICcsIEBkb2MubmFtZS5maXJzdCwgQGRvYy5uYW1lLmxhc3QpIH0pIDogQGRvYy5uYW1lXCIsXG4gICAgICBvdmVyd3JpdGU6IHRydWUgLy8gbXVzdCBiZSB0cnVlIHRvIHJlcGxhY2UgdGhlIHRvcC1sZXZlbCBcIm5hbWVcIiBhdHRyaWJ1dGVcbiAgICB9XG4gIF1cbn0pO1xudmFyIGRvY3MgPSBkYi51c2Vycy5zYXZlKFtcbiAgeyBuYW1lOiB7IGZpcnN0OiBcIkphbWVzXCIgfSB9LFxuICB7IG5hbWU6IHsgZmlyc3Q6IFwiUGF1bGFcIiwgbGFzdDogXCJQbGFudFwiIH0gfVxuXSk7XG5kYi51c2Vycy50b0FycmF5KCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjc4NTlcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjc4NTlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYlFlLS1fXCIsIFxuICAgIFwibmFtZVwiIDogeyBcbiAgICAgIFwiZmlyc3RcIiA6IFwiSmFtZXNcIiBcbiAgICB9IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjc4NjBcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjc4NjBcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYlFpLS0tXCIsIFxuICAgIFwibmFtZVwiIDogeyBcbiAgICAgIFwiZmlyc3RcIiA6IFwiUGF1bGFcIiwgXG4gICAgICBcImxhc3RcIiA6IFwiUGxhbnRcIiwgXG4gICAgICBcImZ1bGxcIiA6IFwiUGF1bGEgUGxhbnRcIiBcbiAgICB9IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjb21wdXRlZFZhbHVlc1N1YmF0dHJpYnV0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "cursorHasNext_single": { + "request": "LS0tCm5hbWU6IGN1cnNvckhhc05leHQKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZml2ZSIpOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJvbmUiIH0pOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJ0d28iIH0pOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJ0aHJlZSIgfSk7Cn5kYi5maXZlLnNhdmUoeyBuYW1lIDogImZvdXIiIH0pOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJmaXZlIiB9KTsKdmFyIGN1cnNvciA9IGRiLl9xdWVyeSgiRk9SIHggSU4gZml2ZSBSRVRVUk4geCIpOwp3aGlsZSAoY3Vyc29yLmhhc05leHQoKSkgewogIHByaW50KGN1cnNvci5uZXh0KCkpOwp9Cn5kYi5fZHJvcCgiZml2ZSIp", + "response": "eyJpbnB1dCI6InZhciBjdXJzb3IgPSBkYi5fcXVlcnkoXCJGT1IgeCBJTiBmaXZlIFJFVFVSTiB4XCIpO1xud2hpbGUgKGN1cnNvci5oYXNOZXh0KCkpIHtcbiAgcHJpbnQoY3Vyc29yLm5leHQoKSk7XG59Iiwib3V0cHV0IjoieyBcbiAgXCJfa2V5XCIgOiBcIjczMTYxXCIsIFxuICBcIl9pZFwiIDogXCJmaXZlLzczMTYxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTS20tLV9cIiwgXG4gIFwibmFtZVwiIDogXCJvbmVcIiBcbn1cbnsgXG4gIFwiX2tleVwiIDogXCI3MzE2M1wiLCBcbiAgXCJfaWRcIiA6IFwiZml2ZS83MzE2M1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0txLS0tXCIsIFxuICBcIm5hbWVcIiA6IFwidHdvXCIgXG59XG57IFxuICBcIl9rZXlcIiA6IFwiNzMxNjVcIiwgXG4gIFwiX2lkXCIgOiBcImZpdmUvNzMxNjVcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNLcS0tX1wiLCBcbiAgXCJuYW1lXCIgOiBcInRocmVlXCIgXG59XG57IFxuICBcIl9rZXlcIiA6IFwiNzMxNjdcIiwgXG4gIFwiX2lkXCIgOiBcImZpdmUvNzMxNjdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNLcS0tQVwiLCBcbiAgXCJuYW1lXCIgOiBcImZvdXJcIiBcbn1cbnsgXG4gIFwiX2tleVwiIDogXCI3MzE2OVwiLCBcbiAgXCJfaWRcIiA6IFwiZml2ZS83MzE2OVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0txLS1CXCIsIFxuICBcIm5hbWVcIiA6IFwiZml2ZVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJjdXJzb3JIYXNOZXh0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "cursorNext_single": { + "request": "LS0tCm5hbWU6IGN1cnNvck5leHQKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZml2ZSIpOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJvbmUiIH0pOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJ0d28iIH0pOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJ0aHJlZSIgfSk7Cn5kYi5maXZlLnNhdmUoeyBuYW1lIDogImZvdXIiIH0pOwp+ZGIuZml2ZS5zYXZlKHsgbmFtZSA6ICJmaXZlIiB9KTsKZGIuX3F1ZXJ5KCJGT1IgeCBJTiBmaXZlIFJFVFVSTiB4IikubmV4dCgpOwp+ZGIuX2Ryb3AoImZpdmUiKQ==", + "response": "eyJpbnB1dCI6ImRiLl9xdWVyeShcIkZPUiB4IElOIGZpdmUgUkVUVVJOIHhcIikubmV4dCgpOyIsIm91dHB1dCI6InsgXG4gIFwiX2tleVwiIDogXCI3MzE3OVwiLCBcbiAgXCJfaWRcIiA6IFwiZml2ZS83MzE3OVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0xXLS1fXCIsIFxuICBcIm5hbWVcIiA6IFwib25lXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImN1cnNvck5leHQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "dateFormat_single": { + "request": "LS0tCm5hbWU6IGRhdGVGb3JtYXQKZGVzY3JpcHRpb246IHwKICBFeGFtcGxlIGNhbGxzIG9mIHRoZSBmb3JtYXR0aW5nIGZ1bmN0aW9uIGFuZCB0aGVpciByZXN1bHRzOgpiaW5kVmFyczoKICB7CiAgICAiZm9ybWF0cyI6IFsKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTAzLTI1VDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJXciLCAiZXF1YWxUbyI6ICJEQVRFX0RBWU9GV0VFSyIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJXl5eXkiLCAiZXF1YWxUbyI6ICJEQVRFX1lFQVIiIH0sCiAgICAgIHsgImRhdGUiOiAiMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaIiwgInBsYWNlaG9sZGVyIjogIiVtIiwgImVxdWFsVG8iOiAiREFURV9NT05USCIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJWQiLCAiZXF1YWxUbyI6ICJEQVRFX0RBWSIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJWgiLCAiZXF1YWxUbyI6ICJEQVRFX0hPVVIiIH0sCiAgICAgIHsgImRhdGUiOiAiMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaIiwgInBsYWNlaG9sZGVyIjogIiVpIiwgImVxdWFsVG8iOiAiREFURV9NSU5VVEUiIH0sCiAgICAgIHsgImRhdGUiOiAiMjAyMy0xMi0zMVQyMzowMDoyMy4wMDBaIiwgInBsYWNlaG9sZGVyIjogIiVzIiwgImVxdWFsVG8iOiAiREFURV9TRUNPTkQiIH0sCiAgICAgIHsgImRhdGUiOiAiMjAyMy0xMi0zMVQyMzowMDowMC4wMzFaIiwgInBsYWNlaG9sZGVyIjogIiVmIiwgImVxdWFsVG8iOiAiREFURV9NSUxMSVNFQ09ORCIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJXgiLCAiZXF1YWxUbyI6ICJEQVRFX0RBWU9GWUVBUiIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJWsiLCAiZXF1YWxUbyI6ICJEQVRFX0lTT1dFRUsiIH0sCiAgICAgIHsgImRhdGUiOiAiMjAxNi0xMi0zMVQyMzowMDowMC4wMDBaIiwgInBsYWNlaG9sZGVyIjogIiVsIiwgImVxdWFsVG8iOiAiREFURV9MRUFQWUVBUiIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCAicGxhY2Vob2xkZXIiOiAiJXEiLCAiZXF1YWxUbyI6ICJEQVRFX1FVQVJURVIiIH0sCiAgICAgIHsgImRhdGUiOiAiMjAyMy0xMS0zMFQyMzowMDowMC4wMDBaIiwgInBsYWNlaG9sZGVyIjogIiVhIiwgImVxdWFsVG8iOiAiREFURV9EQVlTX0lOX01PTlRIIiB9LAogICAgICB7ICJkYXRlIjogIjIwMjMtMTEtMzBUMjM6MDA6MDAuMDAwWiIsICJwbGFjZWhvbGRlciI6ICIldCIsICJlcXVhbFRvIjogIkRBVEVfVElNRVNUQU1QIiB9CiAgICBdCiAgfQotLS0KRk9SIGZvcm1hdCBJTiBAZm9ybWF0cwogIFJFVFVSTiBDT05DQVQoCiAgICBmb3JtYXQuZXF1YWxUbywKICAgICIoJyIsCiAgICBmb3JtYXQuZGF0ZSwKICAgICInKSA9ICIsCiAgICBEQVRFX0ZPUk1BVChmb3JtYXQuZGF0ZSwgZm9ybWF0LnBsYWNlaG9sZGVyKQogICk=", + "response": "eyJpbnB1dCI6IkZPUiBmb3JtYXQgSU4gQGZvcm1hdHNcbiAgUkVUVVJOIENPTkNBVChcbiAgICBmb3JtYXQuZXF1YWxUbyxcbiAgICBcIignXCIsXG4gICAgZm9ybWF0LmRhdGUsXG4gICAgXCInKSA9IFwiLFxuICAgIERBVEVfRk9STUFUKGZvcm1hdC5kYXRlLCBmb3JtYXQucGxhY2Vob2xkZXIpXG4gICkiLCJvdXRwdXQiOiJbIFxuICBcIkRBVEVfREFZT0ZXRUVLKCcyMDIzLTAzLTI1VDIzOjAwOjAwLjAwMFonKSA9IDZcIiwgXG4gIFwiREFURV9ZRUFSKCcyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFonKSA9IDIwMjNcIiwgXG4gIFwiREFURV9NT05USCgnMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaJykgPSAxMlwiLCBcbiAgXCJEQVRFX0RBWSgnMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaJykgPSAzMVwiLCBcbiAgXCJEQVRFX0hPVVIoJzIwMjMtMTItMzFUMjM6MDA6MDAuMDAwWicpID0gMjNcIiwgXG4gIFwiREFURV9NSU5VVEUoJzIwMjMtMTItMzFUMjM6MDA6MDAuMDAwWicpID0gMFwiLCBcbiAgXCJEQVRFX1NFQ09ORCgnMjAyMy0xMi0zMVQyMzowMDoyMy4wMDBaJykgPSAyM1wiLCBcbiAgXCJEQVRFX01JTExJU0VDT05EKCcyMDIzLTEyLTMxVDIzOjAwOjAwLjAzMVonKSA9IDMxXCIsIFxuICBcIkRBVEVfREFZT0ZZRUFSKCcyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFonKSA9IDM2NVwiLCBcbiAgXCJEQVRFX0lTT1dFRUsoJzIwMjMtMTItMzFUMjM6MDA6MDAuMDAwWicpID0gNTJcIiwgXG4gIFwiREFURV9MRUFQWUVBUignMjAxNi0xMi0zMVQyMzowMDowMC4wMDBaJykgPSAxXCIsIFxuICBcIkRBVEVfUVVBUlRFUignMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaJykgPSA0XCIsIFxuICBcIkRBVEVfREFZU19JTl9NT05USCgnMjAyMy0xMS0zMFQyMzowMDowMC4wMDBaJykgPSAzMFwiLCBcbiAgXCJEQVRFX1RJTUVTVEFNUCgnMjAyMy0xMS0zMFQyMzowMDowMC4wMDBaJykgPSAxNzAxMzg1MjAwMDAwXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXhhbXBsZSBjYWxscyBvZiB0aGUgZm9ybWF0dGluZyBmdW5jdGlvbiBhbmQgdGhlaXIgcmVzdWx0czpcbiIsIm5hbWUiOiJkYXRlRm9ybWF0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImJpbmRWYXJzIjp7ImZvcm1hdHMiOlt7ImRhdGUiOiIyMDIzLTAzLTI1VDIzOjAwOjAwLjAwMFoiLCJlcXVhbFRvIjoiREFURV9EQVlPRldFRUsiLCJwbGFjZWhvbGRlciI6IiV3In0seyJkYXRlIjoiMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaIiwiZXF1YWxUbyI6IkRBVEVfWUVBUiIsInBsYWNlaG9sZGVyIjoiJXl5eXkifSx7ImRhdGUiOiIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCJlcXVhbFRvIjoiREFURV9NT05USCIsInBsYWNlaG9sZGVyIjoiJW0ifSx7ImRhdGUiOiIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCJlcXVhbFRvIjoiREFURV9EQVkiLCJwbGFjZWhvbGRlciI6IiVkIn0seyJkYXRlIjoiMjAyMy0xMi0zMVQyMzowMDowMC4wMDBaIiwiZXF1YWxUbyI6IkRBVEVfSE9VUiIsInBsYWNlaG9sZGVyIjoiJWgifSx7ImRhdGUiOiIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCJlcXVhbFRvIjoiREFURV9NSU5VVEUiLCJwbGFjZWhvbGRlciI6IiVpIn0seyJkYXRlIjoiMjAyMy0xMi0zMVQyMzowMDoyMy4wMDBaIiwiZXF1YWxUbyI6IkRBVEVfU0VDT05EIiwicGxhY2Vob2xkZXIiOiIlcyJ9LHsiZGF0ZSI6IjIwMjMtMTItMzFUMjM6MDA6MDAuMDMxWiIsImVxdWFsVG8iOiJEQVRFX01JTExJU0VDT05EIiwicGxhY2Vob2xkZXIiOiIlZiJ9LHsiZGF0ZSI6IjIwMjMtMTItMzFUMjM6MDA6MDAuMDAwWiIsImVxdWFsVG8iOiJEQVRFX0RBWU9GWUVBUiIsInBsYWNlaG9sZGVyIjoiJXgifSx7ImRhdGUiOiIyMDIzLTEyLTMxVDIzOjAwOjAwLjAwMFoiLCJlcXVhbFRvIjoiREFURV9JU09XRUVLIiwicGxhY2Vob2xkZXIiOiIlayJ9LHsiZGF0ZSI6IjIwMTYtMTItMzFUMjM6MDA6MDAuMDAwWiIsImVxdWFsVG8iOiJEQVRFX0xFQVBZRUFSIiwicGxhY2Vob2xkZXIiOiIlbCJ9LHsiZGF0ZSI6IjIwMjMtMTItMzFUMjM6MDA6MDAuMDAwWiIsImVxdWFsVG8iOiJEQVRFX1FVQVJURVIiLCJwbGFjZWhvbGRlciI6IiVxIn0seyJkYXRlIjoiMjAyMy0xMS0zMFQyMzowMDowMC4wMDBaIiwiZXF1YWxUbyI6IkRBVEVfREFZU19JTl9NT05USCIsInBsYWNlaG9sZGVyIjoiJWEifSx7ImRhdGUiOiIyMDIzLTExLTMwVDIzOjAwOjAwLjAwMFoiLCJlcXVhbFRvIjoiREFURV9USU1FU1RBTVAiLCJwbGFjZWhvbGRlciI6IiV0In1dfX19Cg==" + }, + "dateRoundAggregate_single": { + "request": "LS0tCm5hbWU6IGRhdGVSb3VuZEFnZ3JlZ2F0ZQpkZXNjcmlwdGlvbjogfAogIFJvdW5kIGZ1bGwgZGF0ZSB0aW1lIHN0cmluZ3MgdG8gNSBtaW51dGVzIGFuZCBhZ2dyZWdhdGUgdGVtcGVyYXR1cmUgcmVhZGluZ3MKICBieSB0aGVzZSB0aW1lIGJ1Y2tldHM6CgpiaW5kVmFyczoKICB7CiAgICAic2Vuc29yRGF0YSI6IFsKICAgICAgeyAidGltZXN0YW1wIjogIjIwMTktMTItMDRUMjE6MTc6NTIuNTgzWiIsICJ0ZW1wIjogMjAuNiB9LAogICAgICB7ICJ0aW1lc3RhbXAiOiAiMjAxOS0xMi0wNFQyMToxOTo1My41MTZaIiwgInRlbXAiOiAyMC4yIH0sCiAgICAgIHsgInRpbWVzdGFtcCI6ICIyMDE5LTEyLTA0VDIxOjIxOjUzLjYxMFoiLCAidGVtcCI6IDE5LjkgfSwKICAgICAgeyAidGltZXN0YW1wIjogIjIwMTktMTItMDRUMjE6MjM6NTIuNTIyWiIsICJ0ZW1wIjogMTkuOCB9LAogICAgICB7ICJ0aW1lc3RhbXAiOiAiMjAxOS0xMi0wNFQyMToyNTo1Mi45ODhaIiwgInRlbXAiOiAxOS44IH0sCiAgICAgIHsgInRpbWVzdGFtcCI6ICIyMDE5LTEyLTA0VDIxOjI3OjU0LjAwNVoiLCAidGVtcCI6IDE5LjcgfQogICAgXQogIH0KLS0tCkZPUiBkb2MgSU4gQHNlbnNvckRhdGEKICBDT0xMRUNUCiAgICBkYXRlID0gREFURV9ST1VORChkb2MudGltZXN0YW1wLCA1LCAibWludXRlcyIpCiAgQUdHUkVHQVRFCiAgICBjb3VudCA9IENPVU5UKDEpLAogICAgYXZnID0gQVZHKGRvYy50ZW1wKSwKICAgIG1pbiA9IE1JTihkb2MudGVtcCksCiAgICBtYXggPSBNQVgoZG9jLnRlbXApCiAgUkVUVVJOIHsgZGF0ZSwgY291bnQsIGF2ZywgbWluLCBtYXggfQ==", + "response": "eyJpbnB1dCI6IkZPUiBkb2MgSU4gQHNlbnNvckRhdGFcbiAgQ09MTEVDVFxuICAgIGRhdGUgPSBEQVRFX1JPVU5EKGRvYy50aW1lc3RhbXAsIDUsIFwibWludXRlc1wiKVxuICBBR0dSRUdBVEVcbiAgICBjb3VudCA9IENPVU5UKDEpLFxuICAgIGF2ZyA9IEFWRyhkb2MudGVtcCksXG4gICAgbWluID0gTUlOKGRvYy50ZW1wKSxcbiAgICBtYXggPSBNQVgoZG9jLnRlbXApXG4gIFJFVFVSTiB7IGRhdGUsIGNvdW50LCBhdmcsIG1pbiwgbWF4IH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiZGF0ZVwiIDogXCIyMDE5LTEyLTA0VDIxOjE1OjAwLjAwMFpcIiwgXG4gICAgXCJjb3VudFwiIDogMiwgXG4gICAgXCJhdmdcIiA6IDIwLjQsIFxuICAgIFwibWluXCIgOiAyMC4yLCBcbiAgICBcIm1heFwiIDogMjAuNiBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRlXCIgOiBcIjIwMTktMTItMDRUMjE6MjA6MDAuMDAwWlwiLCBcbiAgICBcImNvdW50XCIgOiAyLCBcbiAgICBcImF2Z1wiIDogMTkuODUsIFxuICAgIFwibWluXCIgOiAxOS44LCBcbiAgICBcIm1heFwiIDogMTkuOSBcbiAgfSwgXG4gIHsgXG4gICAgXCJkYXRlXCIgOiBcIjIwMTktMTItMDRUMjE6MjU6MDAuMDAwWlwiLCBcbiAgICBcImNvdW50XCIgOiAyLCBcbiAgICBcImF2Z1wiIDogMTkuNzUsIFxuICAgIFwibWluXCIgOiAxOS43LCBcbiAgICBcIm1heFwiIDogMTkuOCBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJSb3VuZCBmdWxsIGRhdGUgdGltZSBzdHJpbmdzIHRvIDUgbWludXRlcyBhbmQgYWdncmVnYXRlIHRlbXBlcmF0dXJlIHJlYWRpbmdzXG5ieSB0aGVzZSB0aW1lIGJ1Y2tldHM6XG4iLCJuYW1lIjoiZGF0ZVJvdW5kQWdncmVnYXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImJpbmRWYXJzIjp7InNlbnNvckRhdGEiOlt7InRlbXAiOjIwLjYsInRpbWVzdGFtcCI6IjIwMTktMTItMDRUMjE6MTc6NTIuNTgzWiJ9LHsidGVtcCI6MjAuMiwidGltZXN0YW1wIjoiMjAxOS0xMi0wNFQyMToxOTo1My41MTZaIn0seyJ0ZW1wIjoxOS45LCJ0aW1lc3RhbXAiOiIyMDE5LTEyLTA0VDIxOjIxOjUzLjYxMFoifSx7InRlbXAiOjE5LjgsInRpbWVzdGFtcCI6IjIwMTktMTItMDRUMjE6MjM6NTIuNTIyWiJ9LHsidGVtcCI6MTkuOCwidGltZXN0YW1wIjoiMjAxOS0xMi0wNFQyMToyNTo1Mi45ODhaIn0seyJ0ZW1wIjoxOS43LCJ0aW1lc3RhbXAiOiIyMDE5LTEyLTA0VDIxOjI3OjU0LjAwNVoifV19fX0K" + }, + "dateTruncGroup_single": { + "request": "LS0tCm5hbWU6IGRhdGVUcnVuY0dyb3VwCmRlc2NyaXB0aW9uOiB8CiAgVHJ1bmNhdGUgZGF0ZSB0aW1lIHN0cmluZ3MgY29tcHJpc2VkIG9mIGEgeWVhciwgbW9udGgsIGFuZCBkYXkgdG8gdGhlIHllYXIgYW5kCiAgZ3JvdXAgYW5vdGhlciBhdHRyaWJ1dGUgYnkgaXQ6CmJpbmRWYXJzOiAKICB7CiAgICAiZGF0YSI6IFsKICAgICAgeyAiZGF0ZSI6ICIyMDE4LTAzLTA1IiwgInZhbHVlIjogIlNwcmluZyIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDE4LTA3LTExIiwgInZhbHVlIjogIlN1bW1lciIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDE4LTEwLTI2IiwgInZhbHVlIjogIkF1dHVtbiIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDE5LTAxLTA5IiwgInZhbHVlIjogIldpbnRlciIgfSwKICAgICAgeyAiZGF0ZSI6ICIyMDE5LTA0LTAyIiwgInZhbHVlIjogIlNwcmluZyIgfQogICAgXQogIH0KLS0tClJFVFVSTiBNRVJHRSgKICBGT1IgZG9jIElOIEBkYXRhCiAgICBDT0xMRUNUIHEgPSBEQVRFX1RSVU5DKGRvYy5kYXRlLCAieWVhciIpIElOVE8gYnVja2V0CiAgICBSRVRVUk4geyBbREFURV9ZRUFSKHEpXTogYnVja2V0WypdLmRvYy52YWx1ZSB9Cik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBNRVJHRShcbiAgRk9SIGRvYyBJTiBAZGF0YVxuICAgIENPTExFQ1QgcSA9IERBVEVfVFJVTkMoZG9jLmRhdGUsIFwieWVhclwiKSBJTlRPIGJ1Y2tldFxuICAgIFJFVFVSTiB7IFtEQVRFX1lFQVIocSldOiBidWNrZXRbKl0uZG9jLnZhbHVlIH1cbikiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiMjAxOFwiIDogWyBcbiAgICAgIFwiU3ByaW5nXCIsIFxuICAgICAgXCJTdW1tZXJcIiwgXG4gICAgICBcIkF1dHVtblwiIFxuICAgIF0sIFxuICAgIFwiMjAxOVwiIDogWyBcbiAgICAgIFwiV2ludGVyXCIsIFxuICAgICAgXCJTcHJpbmdcIiBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlRydW5jYXRlIGRhdGUgdGltZSBzdHJpbmdzIGNvbXByaXNlZCBvZiBhIHllYXIsIG1vbnRoLCBhbmQgZGF5IHRvIHRoZSB5ZWFyIGFuZFxuZ3JvdXAgYW5vdGhlciBhdHRyaWJ1dGUgYnkgaXQ6XG4iLCJuYW1lIjoiZGF0ZVRydW5jR3JvdXAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiYmluZFZhcnMiOnsiZGF0YSI6W3siZGF0ZSI6IjIwMTgtMDMtMDUiLCJ2YWx1ZSI6IlNwcmluZyJ9LHsiZGF0ZSI6IjIwMTgtMDctMTEiLCJ2YWx1ZSI6IlN1bW1lciJ9LHsiZGF0ZSI6IjIwMTgtMTAtMjYiLCJ2YWx1ZSI6IkF1dHVtbiJ9LHsiZGF0ZSI6IjIwMTktMDEtMDkiLCJ2YWx1ZSI6IldpbnRlciJ9LHsiZGF0ZSI6IjIwMTktMDQtMDIiLCJ2YWx1ZSI6IlNwcmluZyJ9XX19fQo=" + }, + "datediff1_single": { + "request": "LS0tCm5hbWU6IGRhdGVkaWZmMQpkZXNjcmlwdGlvbjogfAogIERldGVybWluZSBob3cgbWFueSBkYXlzIGl0IGlzIGZyb20gTmV3IFllYXIncyBFdmUgdW50aWwgQXByaWwgRm9vbHMnIGRheToKLS0tClJFVFVSTiBEQVRFX0RJRkYoIjIwMjMtMTItMDEiLCAiMjAyNC0wNC0wMSIsICJkYXlzIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RJRkYoXCIyMDIzLTEyLTAxXCIsIFwiMjAyNC0wNC0wMVwiLCBcImRheXNcIikiLCJvdXRwdXQiOiJbIFxuICAxMjIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGV0ZXJtaW5lIGhvdyBtYW55IGRheXMgaXQgaXMgZnJvbSBOZXcgWWVhcidzIEV2ZSB1bnRpbCBBcHJpbCBGb29scycgZGF5OlxuIiwibmFtZSI6ImRhdGVkaWZmMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datedy1_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeTEKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSBkYXkgZnJvbSBhIGRhdGUgdGltZSBzdHJpbmc6Ci0tLQpSRVRVUk4gREFURV9EQVkoIjIwMjAtMDgtMjkiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWShcIjIwMjAtMDgtMjlcIikiLCJvdXRwdXQiOiJbIFxuICAyOSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeHRyYWN0IHRoZSBkYXkgZnJvbSBhIGRhdGUgdGltZSBzdHJpbmc6XG4iLCJuYW1lIjoiZGF0ZWR5MSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datedy2_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeTIKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSBkYXkgZnJvbSBhIFVuaXggdGltZXN0YW1wOgotLS0KUkVUVVJOIERBVEVfREFZKDAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWSgwKSIsIm91dHB1dCI6IlsgXG4gIDEgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXh0cmFjdCB0aGUgZGF5IGZyb20gYSBVbml4IHRpbWVzdGFtcDpcbiIsIm5hbWUiOiJkYXRlZHkyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datedyofwk1_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeW9md2sxCmRlc2NyaXB0aW9uOiB8CiAgVGhlIDI5dGggb2YgQXVndXN0IGluIDIwMjAgd2FzIGEgU2F0dXJkYXk6Ci0tLQpSRVRVUk4gREFURV9EQVlPRldFRUsoIjIwMjAtMDgtMjkiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWU9GV0VFSyhcIjIwMjAtMDgtMjlcIikiLCJvdXRwdXQiOiJbIFxuICA2IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlRoZSAyOXRoIG9mIEF1Z3VzdCBpbiAyMDIwIHdhcyBhIFNhdHVyZGF5OlxuIiwibmFtZSI6ImRhdGVkeW9md2sxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datedyofwk2_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeW9md2syCmRlc2NyaXB0aW9uOiB8CiAgVGhlIFVuaXggZXBvY2ggYmVnYW4gb24gdGhlIDFzdCBvZiBKYW51YXJ5IDE5NzAsIHdoaWNoIHdhcyBhIFRodXJzZGF5OgotLS0KUkVUVVJOIERBVEVfREFZT0ZXRUVLKDAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWU9GV0VFSygwKSIsIm91dHB1dCI6IlsgXG4gIDQgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiVGhlIFVuaXggZXBvY2ggYmVnYW4gb24gdGhlIDFzdCBvZiBKYW51YXJ5IDE5NzAsIHdoaWNoIHdhcyBhIFRodXJzZGF5OlxuIiwibmFtZSI6ImRhdGVkeW9md2syIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datedyofyr1_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeW9meXIxCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgZGF5IG9mIHllYXIgZnJvbSBhIGRhdGUgdGltZSBzdHJpbmc6Ci0tLQpSRVRVUk4gREFURV9EQVlPRllFQVIoIjIwMjAtMDgtMjkiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWU9GWUVBUihcIjIwMjAtMDgtMjlcIikiLCJvdXRwdXQiOiJbIFxuICAyNDIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXh0cmFjdCB0aGUgZGF5IG9mIHllYXIgZnJvbSBhIGRhdGUgdGltZSBzdHJpbmc6XG4iLCJuYW1lIjoiZGF0ZWR5b2Z5cjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datedyofyr2_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeW9meXIyCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgZGF5IG9mIHllYXIgZnJvbSBhIFVuaXggdGltZXN0YW1wOgotLS0KUkVUVVJOIERBVEVfREFZT0ZZRUFSKDg2NDAwMDAwKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWU9GWUVBUig4NjQwMDAwMCkiLCJvdXRwdXQiOiJbIFxuICAyIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4dHJhY3QgdGhlIGRheSBvZiB5ZWFyIGZyb20gYSBVbml4IHRpbWVzdGFtcDpcbiIsIm5hbWUiOiJkYXRlZHlvZnlyMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datedysmn1_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeXNtbjEKZGVzY3JpcHRpb246IHwKICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXlzIGluIEF1Z3VzdCB1c2luZyBhIGRhdGUgdGltZSBzdHJpbmc6Ci0tLQpSRVRVUk4gREFURV9EQVlTX0lOX01PTlRIKCIyMDIwLTA4LTAxIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoXCIyMDIwLTA4LTAxXCIpIiwib3V0cHV0IjoiWyBcbiAgMzEgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBBdWd1c3QgdXNpbmcgYSBkYXRlIHRpbWUgc3RyaW5nOlxuIiwibmFtZSI6ImRhdGVkeXNtbjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datedysmn2_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeXNtbjIKZGVzY3JpcHRpb246IHwKICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXlzIGluIFNlcHRlbWJlciB1c2luZyBhIGRhdGUgdGltZSBzdHJpbmc6Ci0tLQpSRVRVUk4gREFURV9EQVlTX0lOX01PTlRIKCIyMDIwLTA5LTAxIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoXCIyMDIwLTA5LTAxXCIpIiwib3V0cHV0IjoiWyBcbiAgMzAgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBTZXB0ZW1iZXIgdXNpbmcgYSBkYXRlIHRpbWUgc3RyaW5nOlxuIiwibmFtZSI6ImRhdGVkeXNtbjIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datedysmn3_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeXNtbjMKZGVzY3JpcHRpb246IHwKICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXlzIGluIEZlYnJ1YXJ5IGluIGEgbGVhcCB5ZWFyIHVzaW5nIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoIjIwMjAtMDItMDEiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoXCIyMDIwLTAyLTAxXCIpIiwib3V0cHV0IjoiWyBcbiAgMjkgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBGZWJydWFyeSBpbiBhIGxlYXAgeWVhciB1c2luZyBhIGRhdGUgdGltZSBzdHJpbmc6XG4iLCJuYW1lIjoiZGF0ZWR5c21uMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datedysmn4_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeXNtbjQKZGVzY3JpcHRpb246IHwKICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXlzIGluIEZlYnJ1YXJ5IGluIGEgYSBub24tbGVhcCB5ZWFyIHVzaW5nIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoIjIwMjEtMDItMDEiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoXCIyMDIxLTAyLTAxXCIpIiwib3V0cHV0IjoiWyBcbiAgMjggXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBGZWJydWFyeSBpbiBhIGEgbm9uLWxlYXAgeWVhciB1c2luZyBhIGRhdGUgdGltZSBzdHJpbmc6XG4iLCJuYW1lIjoiZGF0ZWR5c21uNCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datedysmn5_single": { + "request": "LS0tCm5hbWU6IGRhdGVkeXNtbjUKZGVzY3JpcHRpb246IHwKICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aCB1c2luZyBhIFVuaXggdGltZXN0YW1wOgotLS0KUkVUVVJOIERBVEVfREFZU19JTl9NT05USCgzMDQ1NjAwMDAwKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0RBWVNfSU5fTU9OVEgoMzA0NTYwMDAwMCkiLCJvdXRwdXQiOiJbIFxuICAyOCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aCB1c2luZyBhIFVuaXggdGltZXN0YW1wOlxuIiwibmFtZSI6ImRhdGVkeXNtbjUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datehr1_single": { + "request": "LS0tCm5hbWU6IGRhdGVocjEKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSBob3VyIG9mIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX0hPVVIoIjIwMjAtMDgtMjlUMTY6MzA6MDUuMTIzIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0hPVVIoXCIyMDIwLTA4LTI5VDE2OjMwOjA1LjEyM1wiKSIsIm91dHB1dCI6IlsgXG4gIDE2IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4dHJhY3QgdGhlIGhvdXIgb2YgYSBkYXRlIHRpbWUgc3RyaW5nOlxuIiwibmFtZSI6ImRhdGVocjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datehr2_single": { + "request": "LS0tCm5hbWU6IGRhdGVocjIKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSBob3VyIG9mIGEgVW5peCB0aW1lc3RhbXA6Ci0tLQpSRVRVUk4gREFURV9IT1VSKDE0NDAwMDAwKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0hPVVIoMTQ0MDAwMDApIiwib3V0cHV0IjoiWyBcbiAgNCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeHRyYWN0IHRoZSBob3VyIG9mIGEgVW5peCB0aW1lc3RhbXA6XG4iLCJuYW1lIjoiZGF0ZWhyMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "dateisofwk1_single": { + "request": "LS0tCm5hbWU6IGRhdGVpc29md2sxCmRlc2NyaXB0aW9uOiB8CiAgRGV0ZXJtaW5lIHRoZSB3ZWVrIG51bWJlciBmcm9tIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX0lTT1dFRUsoIjIwMjAtMDgtMjkiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0lTT1dFRUsoXCIyMDIwLTA4LTI5XCIpIiwib3V0cHV0IjoiWyBcbiAgMzUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGV0ZXJtaW5lIHRoZSB3ZWVrIG51bWJlciBmcm9tIGEgZGF0ZSB0aW1lIHN0cmluZzpcbiIsIm5hbWUiOiJkYXRlaXNvZndrMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "dateisofwk2_single": { + "request": "LS0tCm5hbWU6IGRhdGVpc29md2syCmRlc2NyaXB0aW9uOiB8CiAgRGV0ZXJtaW5lIHRoZSB3ZWVrIG51bWJlciBmcm9tIGEgVW5peCB0aW1lc3RhbXA6Ci0tLQpSRVRVUk4gREFURV9JU09XRUVLKDEyMzQ1Njc4OTAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0lTT1dFRUsoMTIzNDU2Nzg5MCkiLCJvdXRwdXQiOiJbIFxuICAzIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkRldGVybWluZSB0aGUgd2VlayBudW1iZXIgZnJvbSBhIFVuaXggdGltZXN0YW1wOlxuIiwibmFtZSI6ImRhdGVpc29md2syIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datelpyr1_single": { + "request": "LS0tCm5hbWU6IGRhdGVscHlyMQpkZXNjcmlwdGlvbjogfAogIDIwMjAgd2FzIGEgbGVhcCB5ZWFyOgotLS0KUkVUVVJOIERBVEVfTEVBUFlFQVIoIjIwMjAtMDEtMDEiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0xFQVBZRUFSKFwiMjAyMC0wMS0wMVwiKSIsIm91dHB1dCI6IlsgXG4gIHRydWUgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiMjAyMCB3YXMgYSBsZWFwIHllYXI6XG4iLCJuYW1lIjoiZGF0ZWxweXIxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datelpyr2_single": { + "request": "LS0tCm5hbWU6IGRhdGVscHlyMgpkZXNjcmlwdGlvbjogfAogIDIwMjEgd2FzIG5vdCBhIGxlYXAgeWVhcjoKLS0tClJFVFVSTiBEQVRFX0xFQVBZRUFSKCIyMDIxLTAxLTAxIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX0xFQVBZRUFSKFwiMjAyMS0wMS0wMVwiKSIsIm91dHB1dCI6IlsgXG4gIGZhbHNlIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IjIwMjEgd2FzIG5vdCBhIGxlYXAgeWVhcjpcbiIsIm5hbWUiOiJkYXRlbHB5cjIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datemilsec1_single": { + "request": "LS0tCm5hbWU6IGRhdGVtaWxzZWMxCmRlc2NyaXB0aW9uOiAnJwotLS0KUkVUVVJOIERBVEVfTUlMTElTRUNPTkQoIjIwMjAtMDgtMjlUMTY6MzA6MDUuMTIzIik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX01JTExJU0VDT05EKFwiMjAyMC0wOC0yOVQxNjozMDowNS4xMjNcIikiLCJvdXRwdXQiOiJbIFxuICAxMjMgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRhdGVtaWxzZWMxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datemilsec2_single": { + "request": "LS0tCm5hbWU6IGRhdGVtaWxzZWMyCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgbWlsbGlzZWNvbmQgb2YgYSBVbml4IHRpbWVzdGFtcDoKLS0tClJFVFVSTiBEQVRFX01JTExJU0VDT05EKDEyMzQ1Njc4OTAp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX01JTExJU0VDT05EKDEyMzQ1Njc4OTApIiwib3V0cHV0IjoiWyBcbiAgODkwIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4dHJhY3QgdGhlIG1pbGxpc2Vjb25kIG9mIGEgVW5peCB0aW1lc3RhbXA6XG4iLCJuYW1lIjoiZGF0ZW1pbHNlYzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "datemin1_single": { + "request": "LS0tCm5hbWU6IGRhdGVtaW4xCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgbWludXRlIG9mIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX01JTlVURSgiMjAyMC0wOC0yOVQxNjozMDowNS4xMjMiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX01JTlVURShcIjIwMjAtMDgtMjlUMTY6MzA6MDUuMTIzXCIpIiwib3V0cHV0IjoiWyBcbiAgMzAgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXh0cmFjdCB0aGUgbWludXRlIG9mIGEgZGF0ZSB0aW1lIHN0cmluZzpcbiIsIm5hbWUiOiJkYXRlbWluMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datemin2_single": { + "request": "LS0tCm5hbWU6IGRhdGVtaW4yCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgbWludXRlIG9mIGEgVW5peCB0aW1lc3RhbXA6Ci0tLQpSRVRVUk4gREFURV9NSU5VVEUoMjUyMDAwMCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX01JTlVURSgyNTIwMDAwKSIsIm91dHB1dCI6IlsgXG4gIDQyIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4dHJhY3QgdGhlIG1pbnV0ZSBvZiBhIFVuaXggdGltZXN0YW1wOlxuIiwibmFtZSI6ImRhdGVtaW4yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datemn1_single": { + "request": "LS0tCm5hbWU6IGRhdGVtbjEKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSBtb250aCBmcm9tIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX01PTlRIKCIyMDIwLTA4LTI5Iik=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX01PTlRIKFwiMjAyMC0wOC0yOVwiKSIsIm91dHB1dCI6IlsgXG4gIDggXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXh0cmFjdCB0aGUgbW9udGggZnJvbSBhIGRhdGUgdGltZSBzdHJpbmc6XG4iLCJuYW1lIjoiZGF0ZW1uMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "datemn2_single": { + "request": "LS0tCm5hbWU6IGRhdGVtbjIKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSBtb250aCBmcm9tIGEgVW5peCB0aW1lc3RhbXA6Ci0tLQpSRVRVUk4gREFURV9NT05USCgwKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX01PTlRIKDApIiwib3V0cHV0IjoiWyBcbiAgMSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeHRyYWN0IHRoZSBtb250aCBmcm9tIGEgVW5peCB0aW1lc3RhbXA6XG4iLCJuYW1lIjoiZGF0ZW1uMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "dateqtr1_single": { + "request": "LS0tCm5hbWU6IGRhdGVxdHIxCmRlc2NyaXB0aW9uOiB8CiAgRGV0ZXJtaW5lIHRoZSBxdWFydGVyIG9mIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX1FVQVJURVIoIjIwMjAtMDgtMjkiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX1FVQVJURVIoXCIyMDIwLTA4LTI5XCIpIiwib3V0cHV0IjoiWyBcbiAgMyBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJEZXRlcm1pbmUgdGhlIHF1YXJ0ZXIgb2YgYSBkYXRlIHRpbWUgc3RyaW5nOlxuIiwibmFtZSI6ImRhdGVxdHIxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datesec1_single": { + "request": "LS0tCm5hbWU6IGRhdGVzZWMxCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgc2Vjb25kIG9mIGEgZGF0ZSB0aW1lIHN0cmluZzoKLS0tClJFVFVSTiBEQVRFX1NFQ09ORCgiMjAyMC0wOC0yOVQxNjozMDowNS4xMjMiKQ==", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX1NFQ09ORChcIjIwMjAtMDgtMjlUMTY6MzA6MDUuMTIzXCIpIiwib3V0cHV0IjoiWyBcbiAgNSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeHRyYWN0IHRoZSBzZWNvbmQgb2YgYSBkYXRlIHRpbWUgc3RyaW5nOlxuIiwibmFtZSI6ImRhdGVzZWMxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "datesec2_single": { + "request": "LS0tCm5hbWU6IGRhdGVzZWMyCmRlc2NyaXB0aW9uOiB8CiAgRXh0cmFjdCB0aGUgc2Vjb25kIG9mIGEgVW5peCB0aW1lc3RhbXA6Ci0tLQpSRVRVUk4gREFURV9TRUNPTkQoMTIzNDU2Nzg5MCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX1NFQ09ORCgxMjM0NTY3ODkwKSIsIm91dHB1dCI6IlsgXG4gIDcgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRXh0cmFjdCB0aGUgc2Vjb25kIG9mIGEgVW5peCB0aW1lc3RhbXA6XG4iLCJuYW1lIjoiZGF0ZXNlYzIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "dateyr1_single": { + "request": "LS0tCm5hbWU6IGRhdGV5cjEKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSB5ZWFyIGZyb20gYSBkYXRlIHRpbWUgc3RyaW5nOgotLS0KUkVUVVJOIERBVEVfWUVBUigiMjAyMC0wOC0yOSIp", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX1lFQVIoXCIyMDIwLTA4LTI5XCIpIiwib3V0cHV0IjoiWyBcbiAgMjAyMCBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJFeHRyYWN0IHRoZSB5ZWFyIGZyb20gYSBkYXRlIHRpbWUgc3RyaW5nOlxuIiwibmFtZSI6ImRhdGV5cjEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "dateyr2_single": { + "request": "LS0tCm5hbWU6IGRhdGV5cjIKZGVzY3JpcHRpb246IHwKICBFeHRyYWN0IHRoZSB5ZWFyIGZyb20gYSBVbml4IHRpbWVzdGFtcDoKLS0tClJFVFVSTiBEQVRFX1lFQVIoMCk=", + "response": "eyJpbnB1dCI6IlJFVFVSTiBEQVRFX1lFQVIoMCkiLCJvdXRwdXQiOiJbIFxuICAxOTcwIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkV4dHJhY3QgdGhlIHllYXIgZnJvbSBhIFVuaXggdGltZXN0YW1wOlxuIiwibmFtZSI6ImRhdGV5cjIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "dbId_single": { + "request": "LS0tCm5hbWU6IGRiSWQKZGVzY3JpcHRpb246ICcnCi0tLQpyZXF1aXJlKCJAYXJhbmdvZGIiKS5kYi5faWQoKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGJcIikuZGIuX2lkKCk7Iiwib3V0cHV0IjoiMSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkYklkIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "dbName_single": { + "request": "LS0tCm5hbWU6IGRiTmFtZQpkZXNjcmlwdGlvbjogJycKLS0tCnJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiLl9uYW1lKCk7", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGJcIikuZGIuX25hbWUoKTsiLCJvdXRwdXQiOiJfc3lzdGVtIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRiTmFtZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "dbPath_single": { + "request": "LS0tCm5hbWU6IGRiUGF0aApkZXNjcmlwdGlvbjogJycKLS0tCnJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiLl9wYXRoKCk7", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGJcIikuZGIuX3BhdGgoKTsiLCJvdXRwdXQiOiJub25lIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRiUGF0aCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "dbProperties_cluster": { + "request": "LS0tCm5hbWU6IGRiUHJvcGVydGllcwpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KcmVxdWlyZSgiQGFyYW5nb2RiIikuZGIuX3Byb3BlcnRpZXMoKTs=", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGJcIikuZGIuX3Byb3BlcnRpZXMoKTsiLCJvdXRwdXQiOiJ7IFxuICBcImlkXCIgOiBcIjFcIiwgXG4gIFwibmFtZVwiIDogXCJfc3lzdGVtXCIsIFxuICBcImlzU3lzdGVtXCIgOiB0cnVlLCBcbiAgXCJzaGFyZGluZ1wiIDogXCJcIiwgXG4gIFwicmVwbGljYXRpb25GYWN0b3JcIiA6IDEsIFxuICBcIndyaXRlQ29uY2VyblwiIDogMSwgXG4gIFwicmVwbGljYXRpb25WZXJzaW9uXCIgOiBcIjFcIiwgXG4gIFwicGF0aFwiIDogXCJcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZGJQcm9wZXJ0aWVzIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "dbVersion_single": { + "request": "LS0tCm5hbWU6IGRiVmVyc2lvbgpkZXNjcmlwdGlvbjogJycKLS0tCnJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiLl92ZXJzaW9uKCk7", + "response": "eyJpbnB1dCI6InJlcXVpcmUoXCJAYXJhbmdvZGJcIikuZGIuX3ZlcnNpb24oKTsiLCJvdXRwdXQiOiIzLjExLjE0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRiVmVyc2lvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentDocumentRemoveConflict_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50RG9jdW1lbnRSZW1vdmVDb25mbGljdApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTsKYTIgPSBkYi5leGFtcGxlLnJlcGxhY2UoYTEsIHsgYSA6IDIgfSk7CmRiLmV4YW1wbGUucmVtb3ZlKGExKTsgICAgICAgLy8geHBFcnJvcihFUlJPUl9BUkFOR09fQ09ORkxJQ1QpOwpkYi5leGFtcGxlLnJlbW92ZShhMSwgdHJ1ZSk7CmRiLmV4YW1wbGUuZG9jdW1lbnQoYTEpOyAgICAgLy8geHBFcnJvcihFUlJPUl9BUkFOR09fRE9DVU1FTlRfTk9UX0ZPVU5EKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuZXhhbXBsZS5yZXBsYWNlKGExLCB7IGEgOiAyIH0pO1xuZGIuZXhhbXBsZS5yZW1vdmUoYTEpOyAgICAgICBcbmRiLmV4YW1wbGUucmVtb3ZlKGExLCB0cnVlKTtcbmRiLmV4YW1wbGUuZG9jdW1lbnQoYTEpOyAgICAgIiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83Mjk1NVwiLCBcbiAgXCJfa2V5XCIgOiBcIjcyOTU1XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSMG0tLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83Mjk1NVwiLCBcbiAgXCJfa2V5XCIgOiBcIjcyOTU1XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSMG0tLV9cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVIwbS0tLVwiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIwMDogY29uZmxpY3QsIF9yZXYgdmFsdWVzIGRvIG5vdCBtYXRjaF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnREb2N1bWVudFJlbW92ZUNvbmZsaWN0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentDocumentRemoveSimple_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50RG9jdW1lbnRSZW1vdmVTaW1wbGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwphMSA9IGRiLmV4YW1wbGUuaW5zZXJ0KHsgYSA6IDEgfSk7CmRiLmV4YW1wbGUuZG9jdW1lbnQoYTEpOwpkYi5leGFtcGxlLnJlbW92ZShhMSk7CmRiLmV4YW1wbGUuZG9jdW1lbnQoYTEpOyAvLyB4cEVycm9yKEVSUk9SX0FSQU5HT19ET0NVTUVOVF9OT1RfRk9VTkQpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmRiLmV4YW1wbGUuZG9jdW1lbnQoYTEpO1xuZGIuZXhhbXBsZS5yZW1vdmUoYTEpO1xuZGIuZXhhbXBsZS5kb2N1bWVudChhMSk7ICIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzI5NDRcIiwgXG4gIFwiX2tleVwiIDogXCI3Mjk0NFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUnkyLS1fXCIgXG59XG5cbnsgXG4gIFwiX2tleVwiIDogXCI3Mjk0NFwiLCBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83Mjk0NFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUnkyLS1fXCIsIFxuICBcImFcIiA6IDEgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzI5NDRcIiwgXG4gIFwiX2tleVwiIDogXCI3Mjk0NFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUnkyLS1fXCIgXG59XG5cbltBcmFuZ29FcnJvciAxMjAyOiBkb2N1bWVudCBub3QgZm91bmRdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50RG9jdW1lbnRSZW1vdmVTaW1wbGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentDocumentUpdateOverwrite_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50RG9jdW1lbnRVcGRhdGVPdmVyd3JpdGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwphMSA9IGRiLmV4YW1wbGUuaW5zZXJ0KHsgYSA6IDEgfSk7CmEyID0gZGIuX3VwZGF0ZShhMSwgeyBiIDogMiB9KTsKYTMgPSBkYi5fdXBkYXRlKGExLCB7IGMgOiAzIH0sIHsgb3ZlcndyaXRlOiB0cnVlIH0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuX3VwZGF0ZShhMSwgeyBiIDogMiB9KTtcbmEzID0gZGIuX3VwZGF0ZShhMSwgeyBjIDogMyB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMjg3XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMyODdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNscS0tX1wiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMjg3XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMyODdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNtUy0tLVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhU2xxLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzMyODdcIiwgXG4gIFwiX2tleVwiIDogXCI3MzI4N1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU21TLS1fXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FTbVMtLS1cIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnREb2N1bWVudFVwZGF0ZU92ZXJ3cml0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentDocumentUpdate_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50RG9jdW1lbnRVcGRhdGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwphMSA9IGRiLmV4YW1wbGUuaW5zZXJ0KHsgYSA6IDEgfSk7CmEyID0gZGIuX3VwZGF0ZShhMSwgeyBiIDogMiB9KTsKYTMgPSBkYi5fdXBkYXRlKGExLCB7IGMgOiAzIH0pOyAvLyB4cEVycm9yKEVSUk9SX0FSQU5HT19DT05GTElDVCk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuX3VwZGF0ZShhMSwgeyBiIDogMiB9KTtcbmEzID0gZGIuX3VwZGF0ZShhMSwgeyBjIDogMyB9KTsgIiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzI3NlwiLCBcbiAgXCJfa2V5XCIgOiBcIjczMjc2XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTa1MtLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzI3NlwiLCBcbiAgXCJfa2V5XCIgOiBcIjczMjc2XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTa1ctLS1cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVNrUy0tLVwiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIwMDogY29uZmxpY3QsIF9yZXYgdmFsdWVzIGRvIG5vdCBtYXRjaF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnREb2N1bWVudFVwZGF0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollectionInsertMulti_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25JbnNlcnRNdWx0aQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmRiLmV4YW1wbGUuaW5zZXJ0KFt7IEhlbGxvIDogIldvcmxkIiB9LCB7SGVsbG86ICJ0aGVyZSJ9XSkKZGIuZXhhbXBsZS5pbnNlcnQoW3sgSGVsbG8gOiAiV29ybGQiIH0sIHt9XSwge3dhaXRGb3JTeW5jOiB0cnVlfSk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KFt7IEhlbGxvIDogXCJXb3JsZFwiIH0sIHtIZWxsbzogXCJ0aGVyZVwifV0pXG5kYi5leGFtcGxlLmluc2VydChbeyBIZWxsbyA6IFwiV29ybGRcIiB9LCB7fV0sIHt3YWl0Rm9yU3luYzogdHJ1ZX0pOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MjkwNVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiNzI5MDVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUnVxLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvNzI5MDZcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjcyOTA2XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVJ1cS0tQVwiIFxuICB9IFxuXVxuXG5bIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvNzI5MDhcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjcyOTA4XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVJ1dS0tLVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJleGFtcGxlLzcyOTA5XCIsIFxuICAgIFwiX2tleVwiIDogXCI3MjkwOVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSdXUtLV9cIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnRzQ29sbGVjdGlvbkluc2VydE11bHRpIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentsCollectionInsertSingleOverwrite_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25JbnNlcnRTaW5nbGVPdmVyd3JpdGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwpkYi5leGFtcGxlLmluc2VydCh7IF9rZXkgOiAiNjY2IiwgSGVsbG8gOiAiV29ybGQiIH0pOwpkYi5leGFtcGxlLmluc2VydCh7IF9rZXkgOiAiNjY2IiwgSGVsbG8gOiAiVW5pdmVyc2UiIH0sIHtvdmVyd3JpdGU6IHRydWUsIHJldHVybk9sZDogdHJ1ZX0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHsgX2tleSA6IFwiNjY2XCIsIEhlbGxvIDogXCJXb3JsZFwiIH0pO1xuZGIuZXhhbXBsZS5pbnNlcnQoeyBfa2V5IDogXCI2NjZcIiwgSGVsbG8gOiBcIlVuaXZlcnNlXCIgfSwge292ZXJ3cml0ZTogdHJ1ZSwgcmV0dXJuT2xkOiB0cnVlfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS82NjZcIiwgXG4gIFwiX2tleVwiIDogXCI2NjZcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVJ3Ry0tLVwiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzY2NlwiLCBcbiAgXCJfa2V5XCIgOiBcIjY2NlwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUndHLS1fXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FSd0ctLS1cIiwgXG4gIFwib2xkXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCI2NjZcIiwgXG4gICAgXCJfaWRcIiA6IFwiZXhhbXBsZS82NjZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUndHLS0tXCIsIFxuICAgIFwiSGVsbG9cIiA6IFwiV29ybGRcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnRzQ29sbGVjdGlvbkluc2VydFNpbmdsZU92ZXJ3cml0ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollectionInsertSingle_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25JbnNlcnRTaW5nbGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwpkYi5leGFtcGxlLmluc2VydCh7IEhlbGxvIDogIldvcmxkIiB9KTsKZGIuZXhhbXBsZS5pbnNlcnQoeyBIZWxsbyA6ICJXb3JsZCIgfSwge3dhaXRGb3JTeW5jOiB0cnVlfSk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHsgSGVsbG8gOiBcIldvcmxkXCIgfSk7XG5kYi5leGFtcGxlLmluc2VydCh7IEhlbGxvIDogXCJXb3JsZFwiIH0sIHt3YWl0Rm9yU3luYzogdHJ1ZX0pOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzI4OTVcIiwgXG4gIFwiX2tleVwiIDogXCI3Mjg5NVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUnRTLS0tXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzI4OTdcIiwgXG4gIFwiX2tleVwiIDogXCI3Mjg5N1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUnRTLS1fXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25JbnNlcnRTaW5nbGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsCollectionNameHandle_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25OYW1lSGFuZGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKZGIuZXhhbXBsZS5kb2N1bWVudCgiIik7IC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0RPQ1VNRU5UX0hBTkRMRV9CQUQpCn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZG9jdW1lbnQoXCJcIik7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxMjA1OiBpbGxlZ2FsIGRvY3VtZW50IGlkZW50aWZpZXJdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25OYW1lSGFuZGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentsCollectionNameUnknown_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVW5rbm93bgpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7Cn52YXIgbXlpZCA9IGRiLmV4YW1wbGUuaW5zZXJ0KHtfa2V5OiAiMjg3MzkxNiJ9KTsKZGIuZXhhbXBsZS5kb2N1bWVudCgiZXhhbXBsZS80NDcyOTE3Iik7IC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0RPQ1VNRU5UX05PVF9GT1VORCkKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZG9jdW1lbnQoXCJleGFtcGxlLzQ0NzI5MTdcIik7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxMjAyOiBkb2N1bWVudCBub3QgZm91bmRdIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVW5rbm93biIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollectionNameValidByKey_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVmFsaWRCeUtleQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7Cn52YXIgbXlpZCA9IGRiLmV4YW1wbGUuaW5zZXJ0KHtfa2V5OiAiMjg3MzkxNiJ9KTsKZGIuZXhhbXBsZS5kb2N1bWVudCgiMjg3MzkxNiIpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZG9jdW1lbnQoXCIyODczOTE2XCIpOyIsIm91dHB1dCI6InsgXG4gIFwiX2tleVwiIDogXCIyODczOTE2XCIsIFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzI4NzM5MTZcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVJqaS0tX1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkb2N1bWVudHNDb2xsZWN0aW9uTmFtZVZhbGlkQnlLZXkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsCollectionNameValidByObject_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVmFsaWRCeU9iamVjdApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7Cn52YXIgbXlpZCA9IGRiLmV4YW1wbGUuaW5zZXJ0KHtfa2V5OiAiMjg3MzkxNiJ9KTsKZGIuZXhhbXBsZS5kb2N1bWVudCh7X2lkOiAiZXhhbXBsZS8yODczOTE2In0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZG9jdW1lbnQoe19pZDogXCJleGFtcGxlLzI4NzM5MTZcIn0pOyIsIm91dHB1dCI6InsgXG4gIFwiX2tleVwiIDogXCIyODczOTE2XCIsIFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzI4NzM5MTZcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVJrNi0tX1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkb2N1bWVudHNDb2xsZWN0aW9uTmFtZVZhbGlkQnlPYmplY3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsCollectionNameValidMulti_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVmFsaWRNdWx0aQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7Cn52YXIgbXlpZCA9IGRiLmV4YW1wbGUuaW5zZXJ0KHtfa2V5OiAiMjg3MzkxNiJ9KTsKfnZhciBteWlkID0gZGIuZXhhbXBsZS5pbnNlcnQoe19rZXk6ICIyODczOTE3In0pOwpkYi5leGFtcGxlLmRvY3VtZW50KFsiMjg3MzkxNiIsIjI4NzM5MTciXSk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZG9jdW1lbnQoW1wiMjg3MzkxNlwiLFwiMjg3MzkxN1wiXSk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiMjg3MzkxNlwiLCBcbiAgICBcIl9pZFwiIDogXCJleGFtcGxlLzI4NzM5MTZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhUm1lLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCIyODczOTE3XCIsIFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvMjg3MzkxN1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FSbWUtLV9cIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnRzQ29sbGVjdGlvbk5hbWVWYWxpZE11bHRpIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentsCollectionNameValidPlain_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVmFsaWRQbGFpbgpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7Cn52YXIgbXlpZCA9IGRiLmV4YW1wbGUuaW5zZXJ0KHtfa2V5OiAiMjg3MzkxNiJ9KTsKZGIuZXhhbXBsZS5kb2N1bWVudCgiZXhhbXBsZS8yODczOTE2Iik7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZG9jdW1lbnQoXCJleGFtcGxlLzI4NzM5MTZcIik7Iiwib3V0cHV0IjoieyBcbiAgXCJfa2V5XCIgOiBcIjI4NzM5MTZcIiwgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMjg3MzkxNlwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUmlTLS1fXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25OYW1lVmFsaWRQbGFpbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollectionRemoveConflict_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25SZW1vdmVDb25mbGljdApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTsKYTIgPSBkYi5fcmVwbGFjZShhMSwgeyBhIDogMiB9KTsKZGIuX3JlbW92ZShhMSk7IC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0NPTkZMSUNUKQpkYi5fcmVtb3ZlKGExLCB7b3ZlcndyaXRlOiB0cnVlfSk7CmRiLl9kb2N1bWVudChhMSk7IC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0RPQ1VNRU5UX05PVF9GT1VORCkKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuX3JlcGxhY2UoYTEsIHsgYSA6IDIgfSk7XG5kYi5fcmVtb3ZlKGExKTsgXG5kYi5fcmVtb3ZlKGExLCB7b3ZlcndyaXRlOiB0cnVlfSk7XG5kYi5fZG9jdW1lbnQoYTEpOyAiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMzI5XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMzMjlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNyLS0tX1wiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMzI5XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMzMjlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNyLS0tQVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhU3ItLS1fXCIgXG59XG5cbltBcmFuZ29FcnJvciAxMjAwOiBjb25mbGljdCwgX3JldiB2YWx1ZXMgZG8gbm90IG1hdGNoXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkb2N1bWVudHNDb2xsZWN0aW9uUmVtb3ZlQ29uZmxpY3QiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsCollectionRemoveIdentifier_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25SZW1vdmVJZGVudGlmaWVyCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKZGIuZXhhbXBsZS5pbnNlcnQoeyBfa2V5OiAiMTIzNDU2IiwgYTogMSB9ICk7CmRiLmV4YW1wbGUucmVtb3ZlKCJleGFtcGxlLzEyMzQ1NiIpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHsgX2tleTogXCIxMjM0NTZcIiwgYTogMSB9ICk7XG5kYi5leGFtcGxlLnJlbW92ZShcImV4YW1wbGUvMTIzNDU2XCIpOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMTIzNDU2XCIsIFxuICBcIl9rZXlcIiA6IFwiMTIzNDU2XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTdFMtLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS8xMjM0NTZcIiwgXG4gIFwiX2tleVwiIDogXCIxMjM0NTZcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVN0Uy0tLVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkb2N1bWVudHNDb2xsZWN0aW9uUmVtb3ZlSWRlbnRpZmllciIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollectionRemoveSuccess_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25SZW1vdmVTdWNjZXNzCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKYTEgPSBkYi5leGFtcGxlLmluc2VydCh7IGEgOiAxIH0pOwpkYi5fcmVtb3ZlKGExKTsKZGIuX3JlbW92ZShhMSk7IC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0RPQ1VNRU5UX05PVF9GT1VORCk7CmRiLl9yZW1vdmUoYTEsIHtvdmVyd3JpdGU6IHRydWV9KTsgLy8geHBFcnJvcihFUlJPUl9BUkFOR09fRE9DVU1FTlRfTk9UX0ZPVU5EKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmRiLl9yZW1vdmUoYTEpO1xuZGIuX3JlbW92ZShhMSk7IFxuZGIuX3JlbW92ZShhMSwge292ZXJ3cml0ZTogdHJ1ZX0pOyAiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMzE4XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMzMThcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNwcS0tX1wiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzczMzE4XCIsIFxuICBcIl9rZXlcIiA6IFwiNzMzMThcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNwcS0tX1wiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIwMjogZG9jdW1lbnQgbm90IGZvdW5kXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkb2N1bWVudHNDb2xsZWN0aW9uUmVtb3ZlU3VjY2VzcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollectionReplace1_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25SZXBsYWNlMQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTsKYTIgPSBkYi5leGFtcGxlLnJlcGxhY2UoYTEsIHsgYSA6IDIgfSk7CmEzID0gZGIuZXhhbXBsZS5yZXBsYWNlKGExLCB7IGEgOiAzIH0pOyAvLyB4cEVycm9yKEVSUk9SX0FSQU5HT19DT05GTElDVCk7CmEzID0gZGIuZXhhbXBsZS5yZXBsYWNlKGExLCB7IGEgOiAzIH0sIHsgb3ZlcndyaXRlOiB0cnVlIH0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuZXhhbXBsZS5yZXBsYWNlKGExLCB7IGEgOiAyIH0pO1xuYTMgPSBkYi5leGFtcGxlLnJlcGxhY2UoYTEsIHsgYSA6IDMgfSk7IFxuYTMgPSBkYi5leGFtcGxlLnJlcGxhY2UoYTEsIHsgYSA6IDMgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83Mjk5MVwiLCBcbiAgXCJfa2V5XCIgOiBcIjcyOTkxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSNWktLV9cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83Mjk5MVwiLCBcbiAgXCJfa2V5XCIgOiBcIjcyOTkxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSNWktLUFcIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVI1aS0tX1wiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIwMDogY29uZmxpY3QsIF9yZXYgdmFsdWVzIGRvIG5vdCBtYXRjaF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnRzQ29sbGVjdGlvblJlcGxhY2UxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentsCollectionReplaceHandle_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25SZXBsYWNlSGFuZGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKfnZhciBteWlkID0gZGIuZXhhbXBsZS5pbnNlcnQoe19rZXk6ICIzOTAzMDQ0In0pOwphMSA9IGRiLmV4YW1wbGUuaW5zZXJ0KHsgYSA6IDEgfSk7CmEyID0gZGIuZXhhbXBsZS5yZXBsYWNlKCJleGFtcGxlLzM5MDMwNDQiLCB7IGEgOiAyIH0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuZXhhbXBsZS5yZXBsYWNlKFwiZXhhbXBsZS8zOTAzMDQ0XCIsIHsgYSA6IDIgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS8zOTAzMDQ1XCIsIFxuICBcIl9rZXlcIiA6IFwiMzkwMzA0NVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhUjdDLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMzkwMzA0NFwiLCBcbiAgXCJfa2V5XCIgOiBcIjM5MDMwNDRcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVI3Mi0tLVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhUjdDLS0tXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25SZXBsYWNlSGFuZGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentsCollection_UpdateDocument_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlRG9jdW1lbnQKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwphMSA9IGRiLmV4YW1wbGUuaW5zZXJ0KHsiYSIgOiAxfSk7CmEyID0gZGIuZXhhbXBsZS51cGRhdGUoYTEsIHsiYiIgOiAyLCAiYyIgOiAzfSk7CmEzID0gZGIuZXhhbXBsZS51cGRhdGUoYTEsIHsiZCIgOiA0fSk7IC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0NPTkZMSUNUKTsKYTQgPSBkYi5leGFtcGxlLnVwZGF0ZShhMiwgeyJlIiA6IDUsICJmIiA6IDYgfSk7CmRiLmV4YW1wbGUuZG9jdW1lbnQoYTQpOwphNSA9IGRiLmV4YW1wbGUudXBkYXRlKGE0LCB7ImEiIDogMSwgYyA6IDksIGUgOiA0MiB9KTsKZGIuZXhhbXBsZS5kb2N1bWVudChhNSk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoe1wiYVwiIDogMX0pO1xuYTIgPSBkYi5leGFtcGxlLnVwZGF0ZShhMSwge1wiYlwiIDogMiwgXCJjXCIgOiAzfSk7XG5hMyA9IGRiLmV4YW1wbGUudXBkYXRlKGExLCB7XCJkXCIgOiA0fSk7IFxuYTQgPSBkYi5leGFtcGxlLnVwZGF0ZShhMiwge1wiZVwiIDogNSwgXCJmXCIgOiA2IH0pO1xuZGIuZXhhbXBsZS5kb2N1bWVudChhNCk7XG5hNSA9IGRiLmV4YW1wbGUudXBkYXRlKGE0LCB7XCJhXCIgOiAxLCBjIDogOSwgZSA6IDQyIH0pO1xuZGIuZXhhbXBsZS5kb2N1bWVudChhNSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzAyM1wiLCBcbiAgXCJfa2V5XCIgOiBcIjczMDIzXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSOXktLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzAyM1wiLCBcbiAgXCJfa2V5XCIgOiBcIjczMDIzXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FSOXktLV9cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVI5eS0tLVwiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIwMDogY29uZmxpY3QsIF9yZXYgdmFsdWVzIGRvIG5vdCBtYXRjaF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnRzQ29sbGVjdGlvbl9VcGRhdGVEb2N1bWVudCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "documentsCollection_UpdateHandleArray_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlSGFuZGxlQXJyYXkKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwp+dmFyIG15aWQgPSBkYi5leGFtcGxlLmluc2VydCh7X2tleTogIjIwNzc0ODAzIn0pOwpkYi5leGFtcGxlLmluc2VydCh7CiAgImEiIDogeyAib25lIiA6IDEsICJ0d28iIDogMiwgInRocmVlIiA6IDMgfSwKICAiYiIgOiB7IH0KfSk7CgpkYi5leGFtcGxlLnVwZGF0ZSgiZXhhbXBsZS8yMDc3NDgwMyIsIHsKICAiYSIgOiB7ICJmb3VyIiA6IDQgfSwKICAiYiIgOiB7ICJiMSIgOiAxIH0KfSk7CgpkYi5leGFtcGxlLmRvY3VtZW50KCJleGFtcGxlLzIwNzc0ODAzIik7CgpkYi5leGFtcGxlLnVwZGF0ZSgiZXhhbXBsZS8yMDc3NDgwMyIsIHsKICAiYSIgOiB7ICJvbmUiIDogbnVsbCB9LAogICJiIiA6IG51bGwKfSwgZmFsc2UsIGZhbHNlKTsKCmRiLmV4YW1wbGUuZG9jdW1lbnQoImV4YW1wbGUvMjA3NzQ4MDMiKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHtcbiAgXCJhXCIgOiB7IFwib25lXCIgOiAxLCBcInR3b1wiIDogMiwgXCJ0aHJlZVwiIDogMyB9LFxuICBcImJcIiA6IHsgfVxufSk7XG5cbmRiLmV4YW1wbGUudXBkYXRlKFwiZXhhbXBsZS8yMDc3NDgwM1wiLCB7XG4gIFwiYVwiIDogeyBcImZvdXJcIiA6IDQgfSxcbiAgXCJiXCIgOiB7IFwiYjFcIiA6IDEgfVxufSk7XG5cbmRiLmV4YW1wbGUuZG9jdW1lbnQoXCJleGFtcGxlLzIwNzc0ODAzXCIpO1xuXG5kYi5leGFtcGxlLnVwZGF0ZShcImV4YW1wbGUvMjA3NzQ4MDNcIiwge1xuICBcImFcIiA6IHsgXCJvbmVcIiA6IG51bGwgfSxcbiAgXCJiXCIgOiBudWxsXG59LCBmYWxzZSwgZmFsc2UpO1xuXG5kYi5leGFtcGxlLmRvY3VtZW50KFwiZXhhbXBsZS8yMDc3NDgwM1wiKTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzIwNzc0ODA0XCIsIFxuICBcIl9rZXlcIiA6IFwiMjA3NzQ4MDRcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNDSy0tX1wiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzIwNzc0ODAzXCIsIFxuICBcIl9rZXlcIiA6IFwiMjA3NzQ4MDNcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNDSy0tQVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhU0NLLS0tXCIgXG59XG5cbnsgXG4gIFwiX2tleVwiIDogXCIyMDc3NDgwM1wiLCBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS8yMDc3NDgwM1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0NLLS1BXCIsIFxuICBcImJcIiA6IHsgXG4gICAgXCJiMVwiIDogMSBcbiAgfSwgXG4gIFwiYVwiIDogeyBcbiAgICBcImZvdXJcIiA6IDQgXG4gIH0gXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMjA3NzQ4MDNcIiwgXG4gIFwiX2tleVwiIDogXCIyMDc3NDgwM1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0NPLS0tXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FTQ0stLUFcIiBcbn1cblxueyBcbiAgXCJfa2V5XCIgOiBcIjIwNzc0ODAzXCIsIFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzIwNzc0ODAzXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTQ08tLS1cIiwgXG4gIFwiYVwiIDogeyBcbiAgICBcImZvdXJcIiA6IDQgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlSGFuZGxlQXJyYXkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsCollection_UpdateHandleKeepNull_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlSGFuZGxlS2VlcE51bGwKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwp+dmFyIG15aWQgPSBkYi5leGFtcGxlLmluc2VydCh7X2tleTogIjE5OTg4MzcxIn0pOwpkYi5leGFtcGxlLmluc2VydCh7ImEiIDogMX0pOwpkYi5leGFtcGxlLnVwZGF0ZSgiZXhhbXBsZS8xOTk4ODM3MSIsIHsgImIiIDogbnVsbCwgImMiIDogbnVsbCwgImQiIDogMyB9KTsKZGIuZXhhbXBsZS5kb2N1bWVudCgiZXhhbXBsZS8xOTk4ODM3MSIpOwpkYi5leGFtcGxlLnVwZGF0ZSgiZXhhbXBsZS8xOTk4ODM3MSIsIHsgImEiIDogbnVsbCB9LCBmYWxzZSwgZmFsc2UpOwpkYi5leGFtcGxlLmRvY3VtZW50KCJleGFtcGxlLzE5OTg4MzcxIik7CmRiLmV4YW1wbGUudXBkYXRlKCJleGFtcGxlLzE5OTg4MzcxIiwgeyAiYiIgOiBudWxsLCAiYyI6IG51bGwsICJkIiA6IG51bGwgfSwgZmFsc2UsIGZhbHNlKTsKZGIuZXhhbXBsZS5kb2N1bWVudCgiZXhhbXBsZS8xOTk4ODM3MSIpOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuaW5zZXJ0KHtcImFcIiA6IDF9KTtcbmRiLmV4YW1wbGUudXBkYXRlKFwiZXhhbXBsZS8xOTk4ODM3MVwiLCB7IFwiYlwiIDogbnVsbCwgXCJjXCIgOiBudWxsLCBcImRcIiA6IDMgfSk7XG5kYi5leGFtcGxlLmRvY3VtZW50KFwiZXhhbXBsZS8xOTk4ODM3MVwiKTtcbmRiLmV4YW1wbGUudXBkYXRlKFwiZXhhbXBsZS8xOTk4ODM3MVwiLCB7IFwiYVwiIDogbnVsbCB9LCBmYWxzZSwgZmFsc2UpO1xuZGIuZXhhbXBsZS5kb2N1bWVudChcImV4YW1wbGUvMTk5ODgzNzFcIik7XG5kYi5leGFtcGxlLnVwZGF0ZShcImV4YW1wbGUvMTk5ODgzNzFcIiwgeyBcImJcIiA6IG51bGwsIFwiY1wiOiBudWxsLCBcImRcIiA6IG51bGwgfSwgZmFsc2UsIGZhbHNlKTtcbmRiLmV4YW1wbGUuZG9jdW1lbnQoXCJleGFtcGxlLzE5OTg4MzcxXCIpOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMTk5ODgzNzJcIiwgXG4gIFwiX2tleVwiIDogXCIxOTk4ODM3MlwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0FlLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMTk5ODgzNzFcIiwgXG4gIFwiX2tleVwiIDogXCIxOTk4ODM3MVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0FpLS0tXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FTQWUtLS1cIiBcbn1cblxueyBcbiAgXCJfa2V5XCIgOiBcIjE5OTg4MzcxXCIsIFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzE5OTg4MzcxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTQWktLS1cIiwgXG4gIFwiZFwiIDogMywgXG4gIFwiY1wiIDogbnVsbCwgXG4gIFwiYlwiIDogbnVsbCBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS8xOTk4ODM3MVwiLCBcbiAgXCJfa2V5XCIgOiBcIjE5OTg4MzcxXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTQWktLV9cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVNBaS0tLVwiIFxufVxuXG57IFxuICBcIl9rZXlcIiA6IFwiMTk5ODgzNzFcIiwgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvMTk5ODgzNzFcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNBaS0tX1wiLCBcbiAgXCJkXCIgOiAzLCBcbiAgXCJjXCIgOiBudWxsLCBcbiAgXCJiXCIgOiBudWxsIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzE5OTg4MzcxXCIsIFxuICBcIl9rZXlcIiA6IFwiMTk5ODgzNzFcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNBbS0tLVwiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhU0FpLS1fXCIgXG59XG5cbnsgXG4gIFwiX2tleVwiIDogXCIxOTk4ODM3MVwiLCBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS8xOTk4ODM3MVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU0FtLS0tXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlSGFuZGxlS2VlcE51bGwiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsCollection_UpdateHandleSingle_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlSGFuZGxlU2luZ2xlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImV4YW1wbGUiKTsKfnZhciBteWlkID0gZGIuZXhhbXBsZS5pbnNlcnQoe19rZXk6ICIxODYxMjExNSJ9KTsKYTEgPSBkYi5leGFtcGxlLmluc2VydCh7ImEiIDogMX0pOwphMiA9IGRiLmV4YW1wbGUudXBkYXRlKCJleGFtcGxlLzE4NjEyMTE1IiwgeyAieCIgOiAxLCAieSIgOiAyIH0pOwp+ZGIuX2Ryb3AoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoe1wiYVwiIDogMX0pO1xuYTIgPSBkYi5leGFtcGxlLnVwZGF0ZShcImV4YW1wbGUvMTg2MTIxMTVcIiwgeyBcInhcIiA6IDEsIFwieVwiIDogMiB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzE4NjEyMTE2XCIsIFxuICBcIl9rZXlcIiA6IFwiMTg2MTIxMTZcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNfUy0tLVwiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJleGFtcGxlLzE4NjEyMTE1XCIsIFxuICBcIl9rZXlcIiA6IFwiMTg2MTIxMTVcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVNfUy0tX1wiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhU19PLS1fXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImRvY3VtZW50c0NvbGxlY3Rpb25fVXBkYXRlSGFuZGxlU2luZ2xlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "documentsDocumentReplaceOverwrite_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0RvY3VtZW50UmVwbGFjZU92ZXJ3cml0ZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTsKYTIgPSBkYi5fcmVwbGFjZShhMSwgeyBhIDogMiB9KTsKYTMgPSBkYi5fcmVwbGFjZShhMSwgeyBhIDogMyB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuX3JlcGxhY2UoYTEsIHsgYSA6IDIgfSk7XG5hMyA9IGRiLl9yZXBsYWNlKGExLCB7IGEgOiAzIH0sIHsgb3ZlcndyaXRlOiB0cnVlIH0pOyIsIm91dHB1dCI6InsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzMzMDhcIiwgXG4gIFwiX2tleVwiIDogXCI3MzMwOFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU29XLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGUvNzMzMDhcIiwgXG4gIFwiX2tleVwiIDogXCI3MzMwOFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhU29XLS1BXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FTb1ctLV9cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzMwOFwiLCBcbiAgXCJfa2V5XCIgOiBcIjczMzA4XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTb1ctLUJcIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVNvVy0tQVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJkb2N1bWVudHNEb2N1bWVudFJlcGxhY2VPdmVyd3JpdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "documentsDocumentReplace_single": { + "request": "LS0tCm5hbWU6IGRvY3VtZW50c0RvY3VtZW50UmVwbGFjZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CmExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTsKYTIgPSBkYi5fcmVwbGFjZShhMSwgeyBhIDogMiB9KTsKYTMgPSBkYi5fcmVwbGFjZShhMSwgeyBhIDogMyB9KTsgIC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX0NPTkZMSUNUKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImExID0gZGIuZXhhbXBsZS5pbnNlcnQoeyBhIDogMSB9KTtcbmEyID0gZGIuX3JlcGxhY2UoYTEsIHsgYSA6IDIgfSk7XG5hMyA9IGRiLl9yZXBsYWNlKGExLCB7IGEgOiAzIH0pOyAgIiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzI5N1wiLCBcbiAgXCJfa2V5XCIgOiBcIjczMjk3XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTbkctLV9cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiZXhhbXBsZS83MzI5N1wiLCBcbiAgXCJfa2V5XCIgOiBcIjczMjk3XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FTbk8tLS1cIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYVNuRy0tX1wiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIwMDogY29uZmxpY3QsIF9yZXYgdmFsdWVzIGRvIG5vdCBtYXRjaF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZG9jdW1lbnRzRG9jdW1lbnRSZXBsYWNlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "dropIndex_single": { + "request": "LS0tCm5hbWU6IGRyb3BJbmRleApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJleGFtcGxlIik7CnZhciBpZHgxID0gZGIuZXhhbXBsZS5lbnN1cmVJbmRleCh7IHR5cGU6ICJwZXJzaXN0ZW50IiwgZmllbGRzOiBbICJhIiwgImIiIF0gfSk7CnZhciBpZHgyID0gZGIuZXhhbXBsZS5lbnN1cmVJbmRleCh7IHR5cGU6ICJwZXJzaXN0ZW50IiwgZmllbGRzOiBbICJjIiBdIH0pOwp2YXIgaW5kZXhJbmZvID0gZGIuZXhhbXBsZS5pbmRleGVzKCk7CmluZGV4SW5mbzsKZGIuX2Ryb3BJbmRleChpbmRleEluZm9bMV0pCmRiLl9kcm9wSW5kZXgoaW5kZXhJbmZvWzJdLmlkKQppbmRleEluZm8gPSBkYi5leGFtcGxlLmluZGV4ZXMoKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6InZhciBpZHgxID0gZGIuZXhhbXBsZS5lbnN1cmVJbmRleCh7IHR5cGU6IFwicGVyc2lzdGVudFwiLCBmaWVsZHM6IFsgXCJhXCIsIFwiYlwiIF0gfSk7XG52YXIgaWR4MiA9IGRiLmV4YW1wbGUuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInBlcnNpc3RlbnRcIiwgZmllbGRzOiBbIFwiY1wiIF0gfSk7XG52YXIgaW5kZXhJbmZvID0gZGIuZXhhbXBsZS5pbmRleGVzKCk7XG5pbmRleEluZm87XG5kYi5fZHJvcEluZGV4KGluZGV4SW5mb1sxXSlcbmRiLl9kcm9wSW5kZXgoaW5kZXhJbmZvWzJdLmlkKVxuaW5kZXhJbmZvID0gZGIuZXhhbXBsZS5pbmRleGVzKCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgIFwiX2tleVwiIFxuICAgIF0sIFxuICAgIFwiaWRcIiA6IFwiZXhhbXBsZS8wXCIsIFxuICAgIFwibmFtZVwiIDogXCJwcmltYXJ5XCIsIFxuICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICBcInR5cGVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICBcInVuaXF1ZVwiIDogdHJ1ZSBcbiAgfSwgXG4gIHsgXG4gICAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgICBcImRlZHVwbGljYXRlXCIgOiB0cnVlLCBcbiAgICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gICAgXCJmaWVsZHNcIiA6IFsgXG4gICAgICBcImFcIiwgXG4gICAgICBcImJcIiBcbiAgICBdLCBcbiAgICBcImlkXCIgOiBcImV4YW1wbGUvODQyMDNcIiwgXG4gICAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MjQxNzA5OTczNTA1XCIsIFxuICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICBcInR5cGVcIiA6IFwicGVyc2lzdGVudFwiLCBcbiAgICBcInVuaXF1ZVwiIDogZmFsc2UgXG4gIH0sIFxuICB7IFxuICAgIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gICAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gICAgXCJlc3RpbWF0ZXNcIiA6IHRydWUsIFxuICAgIFwiZmllbGRzXCIgOiBbIFxuICAgICAgXCJjXCIgXG4gICAgXSwgXG4gICAgXCJpZFwiIDogXCJleGFtcGxlLzg0MjA3XCIsIFxuICAgIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjI0MTcxMTAyMjA4MFwiLCBcbiAgICBcInNlbGVjdGl2aXR5RXN0aW1hdGVcIiA6IDEsIFxuICAgIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gICAgXCJ1bmlxdWVcIiA6IGZhbHNlIFxuICB9IFxuXVxuXG50cnVlXG5cbnRydWVcblxuWyBcbiAgeyBcbiAgICBcImZpZWxkc1wiIDogWyBcbiAgICAgIFwiX2tleVwiIFxuICAgIF0sIFxuICAgIFwiaWRcIiA6IFwiZXhhbXBsZS8wXCIsIFxuICAgIFwibmFtZVwiIDogXCJwcmltYXJ5XCIsIFxuICAgIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gICAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgICBcInR5cGVcIiA6IFwicHJpbWFyeVwiLCBcbiAgICBcInVuaXF1ZVwiIDogdHJ1ZSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZHJvcEluZGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "ensureFulltextIndex_single": { + "request": "LS0tCm5hbWU6IGVuc3VyZUZ1bGx0ZXh0SW5kZXgKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiZXhhbXBsZSIpOwpkYi5leGFtcGxlLmVuc3VyZUluZGV4KHsgdHlwZTogImZ1bGx0ZXh0IiwgZmllbGRzOiBbICJ0ZXh0IiBdLCBtaW5MZW5ndGg6IDMgfSk7CmRiLmV4YW1wbGUuc2F2ZShbCiAgeyB0ZXh0IDogInRoZSBxdWljayBicm93biIsIGIgOiB7IGMgOiAxIH0gfSwKICB7IHRleHQgOiAicXVpY2sgYnJvd24gZm94IiwgYiA6IHsgYyA6IDIgfSB9LAogIHsgdGV4dCA6ICJicm93biBmb3gganVtcHMiLCBiIDogeyBjIDogMyB9IH0sCiAgeyB0ZXh0IDogImZveCBqdW1wcyBvdmVyIiwgYiA6IHsgYyA6IDQgfSB9LAogIHsgdGV4dCA6ICJqdW1wcyBvdmVyIHRoZSIsIGIgOiB7IGMgOiA1IH0gfSwKICB7IHRleHQgOiAib3ZlciB0aGUgbGF6eSIsIGIgOiB7IGMgOiA2IH0gfSwKICB7IHRleHQgOiAidGhlIGxhenkgZG9nIiwgYiA6IHsgYyA6IDcgfSB9Cl0pOwpkYi5fcXVlcnkoIkZPUiBkb2N1bWVudCBJTiBGVUxMVEVYVChleGFtcGxlLCAndGV4dCcsICdxdWljaycpIFJFVFVSTiBkb2N1bWVudCIpLnRvQXJyYXkoKTsKfmRiLl9kcm9wKCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUuZW5zdXJlSW5kZXgoeyB0eXBlOiBcImZ1bGx0ZXh0XCIsIGZpZWxkczogWyBcInRleHRcIiBdLCBtaW5MZW5ndGg6IDMgfSk7XG5kYi5leGFtcGxlLnNhdmUoW1xuICB7IHRleHQgOiBcInRoZSBxdWljayBicm93blwiLCBiIDogeyBjIDogMSB9IH0sXG4gIHsgdGV4dCA6IFwicXVpY2sgYnJvd24gZm94XCIsIGIgOiB7IGMgOiAyIH0gfSxcbiAgeyB0ZXh0IDogXCJicm93biBmb3gganVtcHNcIiwgYiA6IHsgYyA6IDMgfSB9LFxuICB7IHRleHQgOiBcImZveCBqdW1wcyBvdmVyXCIsIGIgOiB7IGMgOiA0IH0gfSxcbiAgeyB0ZXh0IDogXCJqdW1wcyBvdmVyIHRoZVwiLCBiIDogeyBjIDogNSB9IH0sXG4gIHsgdGV4dCA6IFwib3ZlciB0aGUgbGF6eVwiLCBiIDogeyBjIDogNiB9IH0sXG4gIHsgdGV4dCA6IFwidGhlIGxhenkgZG9nXCIsIGIgOiB7IGMgOiA3IH0gfVxuXSk7XG5kYi5fcXVlcnkoXCJGT1IgZG9jdW1lbnQgSU4gRlVMTFRFWFQoZXhhbXBsZSwgJ3RleHQnLCAncXVpY2snKSBSRVRVUk4gZG9jdW1lbnRcIikudG9BcnJheSgpOyIsIm91dHB1dCI6InsgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwidGV4dFwiIFxuICBdLCBcbiAgXCJpZFwiIDogXCJleGFtcGxlLzgwMzkxXCIsIFxuICBcImlzTmV3bHlDcmVhdGVkXCIgOiB0cnVlLCBcbiAgXCJtaW5MZW5ndGhcIiA6IDMsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyMjc5NjIwOTM1NjhcIiwgXG4gIFwic3BhcnNlXCIgOiB0cnVlLCBcbiAgXCJ0eXBlXCIgOiBcImZ1bGx0ZXh0XCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSBcbn1cblxuWyBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJleGFtcGxlLzgwMzk1XCIsIFxuICAgIFwiX2tleVwiIDogXCI4MDM5NVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrNW0tLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiZXhhbXBsZS84MDM5NlwiLCBcbiAgICBcIl9rZXlcIiA6IFwiODAzOTZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhazVtLS1BXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvODAzOTdcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjgwMzk3XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWs1bS0tQlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJleGFtcGxlLzgwMzk4XCIsIFxuICAgIFwiX2tleVwiIDogXCI4MDM5OFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrNW0tLUNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiZXhhbXBsZS84MDM5OVwiLCBcbiAgICBcIl9rZXlcIiA6IFwiODAzOTlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhazVtLS1EXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvODA0MDBcIiwgXG4gICAgXCJfa2V5XCIgOiBcIjgwNDAwXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWs1bS0tRVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJleGFtcGxlLzgwNDAxXCIsIFxuICAgIFwiX2tleVwiIDogXCI4MDQwMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrNW0tLUZcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiODAzOTVcIiwgXG4gICAgXCJfaWRcIiA6IFwiZXhhbXBsZS84MDM5NVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FrNW0tLV9cIiwgXG4gICAgXCJ0ZXh0XCIgOiBcInRoZSBxdWljayBicm93blwiLCBcbiAgICBcImJcIiA6IHsgXG4gICAgICBcImNcIiA6IDEgXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjgwMzk2XCIsIFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGUvODAzOTZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhazVtLS1BXCIsIFxuICAgIFwidGV4dFwiIDogXCJxdWljayBicm93biBmb3hcIiwgXG4gICAgXCJiXCIgOiB7IFxuICAgICAgXCJjXCIgOiAyIFxuICAgIH0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImVuc3VyZUZ1bGx0ZXh0SW5kZXgiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "ensurePersistent_single": { + "request": "LS0tCm5hbWU6IGVuc3VyZVBlcnNpc3RlbnQKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgibmFtZXMiKTsKZGIubmFtZXMuZW5zdXJlSW5kZXgoeyB0eXBlOiAicGVyc2lzdGVudCIsIGZpZWxkczogWyAiZmlyc3QiIF0gfSk7CmRiLm5hbWVzLnNhdmUoeyAiZmlyc3QiIDogIlRpbSIgfSk7CmRiLm5hbWVzLnNhdmUoeyAiZmlyc3QiIDogIlRvbSIgfSk7CmRiLm5hbWVzLnNhdmUoeyAiZmlyc3QiIDogIkpvaG4iIH0pOwpkYi5uYW1lcy5zYXZlKHsgImZpcnN0IiA6ICJUaW0iIH0pOwpkYi5uYW1lcy5zYXZlKHsgImZpcnN0IiA6ICJUb20iIH0pOwp+ZGIuX2Ryb3AoIm5hbWVzIik7", + "response": "eyJpbnB1dCI6ImRiLm5hbWVzLmVuc3VyZUluZGV4KHsgdHlwZTogXCJwZXJzaXN0ZW50XCIsIGZpZWxkczogWyBcImZpcnN0XCIgXSB9KTtcbmRiLm5hbWVzLnNhdmUoeyBcImZpcnN0XCIgOiBcIlRpbVwiIH0pO1xuZGIubmFtZXMuc2F2ZSh7IFwiZmlyc3RcIiA6IFwiVG9tXCIgfSk7XG5kYi5uYW1lcy5zYXZlKHsgXCJmaXJzdFwiIDogXCJKb2huXCIgfSk7XG5kYi5uYW1lcy5zYXZlKHsgXCJmaXJzdFwiIDogXCJUaW1cIiB9KTtcbmRiLm5hbWVzLnNhdmUoeyBcImZpcnN0XCIgOiBcIlRvbVwiIH0pOyIsIm91dHB1dCI6InsgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwiZmlyc3RcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwibmFtZXMvODMzMDdcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyMjgzNTMyMTI0MTZcIiwgXG4gIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwibmFtZXMvODMzMTFcIiwgXG4gIFwiX2tleVwiIDogXCI4MzMxMVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhbFE2LS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcIm5hbWVzLzgzMzEzXCIsIFxuICBcIl9rZXlcIiA6IFwiODMzMTNcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWxRNi0tQVwiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJuYW1lcy84MzMxNVwiLCBcbiAgXCJfa2V5XCIgOiBcIjgzMzE1XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FsUi0tLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwibmFtZXMvODMzMTdcIiwgXG4gIFwiX2tleVwiIDogXCI4MzMxN1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhbFItLS1fXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcIm5hbWVzLzgzMzE5XCIsIFxuICBcIl9rZXlcIiA6IFwiODMzMTlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWxSLS0tQVwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJlbnN1cmVQZXJzaXN0ZW50IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "ensureTtlIndex_single": { + "request": "LS0tCm5hbWU6IGVuc3VyZVR0bEluZGV4CmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoInRlc3QiKTsKZGIudGVzdC5lbnN1cmVJbmRleCh7IHR5cGU6ICJ0dGwiLCBmaWVsZHM6IFsgImNyZWF0aW9uRGF0ZSIgXSwgZXhwaXJlQWZ0ZXI6IDYwMCB9KTsKZm9yIChsZXQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewogIGRiLnRlc3QuaW5zZXJ0KHsgY3JlYXRpb25EYXRlOiBEYXRlLm5vdygpIC8gMTAwMCB9KTsKfQp+ZGIuX2Ryb3AoInRlc3QiKTs=", + "response": "eyJpbnB1dCI6ImRiLnRlc3QuZW5zdXJlSW5kZXgoeyB0eXBlOiBcInR0bFwiLCBmaWVsZHM6IFsgXCJjcmVhdGlvbkRhdGVcIiBdLCBleHBpcmVBZnRlcjogNjAwIH0pO1xuZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIDEwMDsgKytpKSB7XG4gIGRiLnRlc3QuaW5zZXJ0KHsgY3JlYXRpb25EYXRlOiBEYXRlLm5vdygpIC8gMTAwMCB9KTtcbn0iLCJvdXRwdXQiOiJ7IFxuICBcImVzdGltYXRlc1wiIDogZmFsc2UsIFxuICBcImV4cGlyZUFmdGVyXCIgOiA2MDAsIFxuICBcImZpZWxkc1wiIDogWyBcbiAgICBcImNyZWF0aW9uRGF0ZVwiIFxuICBdLCBcbiAgXCJpZFwiIDogXCJ0ZXN0LzgzMzI3XCIsIFxuICBcImlzTmV3bHlDcmVhdGVkXCIgOiB0cnVlLCBcbiAgXCJuYW1lXCIgOiBcImlkeF8xODMyOTM2MjI4Mzg5OTEyNTc3XCIsIFxuICBcInNwYXJzZVwiIDogdHJ1ZSwgXG4gIFwidHlwZVwiIDogXCJ0dGxcIiwgXG4gIFwidW5pcXVlXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJ0ZXN0LzgzNTI5XCIsIFxuICBcIl9rZXlcIiA6IFwiODM1MjlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWxVVy0tX1wiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJlbnN1cmVUdGxJbmRleCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "ensureUniquePersistentMultiColmun_single": { + "request": "LS0tCm5hbWU6IGVuc3VyZVVuaXF1ZVBlcnNpc3RlbnRNdWx0aUNvbG11bgpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJpZHMiKTsKZGIuaWRzLmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsgIm5hbWUuZmlyc3QiLCAibmFtZS5sYXN0IiBdLCB1bmlxdWU6IHRydWUgfSk7CmRiLmlkcy5zYXZlKHsgIm5hbWUiIDogeyAiZmlyc3QiIDogImhhbnMiLCAibGFzdCI6ICJoYW5zZW4iIH19KTsKZGIuaWRzLnNhdmUoeyAibmFtZSIgOiB7ICJmaXJzdCIgOiAiamVucyIsICJsYXN0IjogImplbnNlbiIgfX0pOwpkYi5pZHMuc2F2ZSh7ICJuYW1lIiA6IHsgImZpcnN0IiA6ICJoYW5zIiwgImxhc3QiOiAiamVuc2VuIiB9fSk7CmRiLmlkcy5zYXZlKHsgIm5hbWUiIDogeyAiZmlyc3QiIDogImhhbnMiLCAibGFzdCI6ICJoYW5zZW4iIH19KTsgIC8vIHhwRXJyb3IoRVJST1JfQVJBTkdPX1VOSVFVRV9DT05TVFJBSU5UX1ZJT0xBVEVEKQp+ZGIuX2Ryb3AoImlkcyIpOw==", + "response": "eyJpbnB1dCI6ImRiLmlkcy5lbnN1cmVJbmRleCh7IHR5cGU6IFwicGVyc2lzdGVudFwiLCBmaWVsZHM6IFsgXCJuYW1lLmZpcnN0XCIsIFwibmFtZS5sYXN0XCIgXSwgdW5pcXVlOiB0cnVlIH0pO1xuZGIuaWRzLnNhdmUoeyBcIm5hbWVcIiA6IHsgXCJmaXJzdFwiIDogXCJoYW5zXCIsIFwibGFzdFwiOiBcImhhbnNlblwiIH19KTtcbmRiLmlkcy5zYXZlKHsgXCJuYW1lXCIgOiB7IFwiZmlyc3RcIiA6IFwiamVuc1wiLCBcImxhc3RcIjogXCJqZW5zZW5cIiB9fSk7XG5kYi5pZHMuc2F2ZSh7IFwibmFtZVwiIDogeyBcImZpcnN0XCIgOiBcImhhbnNcIiwgXCJsYXN0XCI6IFwiamVuc2VuXCIgfX0pO1xuZGIuaWRzLnNhdmUoeyBcIm5hbWVcIiA6IHsgXCJmaXJzdFwiIDogXCJoYW5zXCIsIFwibGFzdFwiOiBcImhhbnNlblwiIH19KTsgICIsIm91dHB1dCI6InsgXG4gIFwiY2FjaGVFbmFibGVkXCIgOiBmYWxzZSwgXG4gIFwiZGVkdXBsaWNhdGVcIiA6IHRydWUsIFxuICBcImVzdGltYXRlc1wiIDogdHJ1ZSwgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwibmFtZS5maXJzdFwiLCBcbiAgICBcIm5hbWUubGFzdFwiIFxuICBdLCBcbiAgXCJpZFwiIDogXCJpZHMvODMyODlcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyMjgzMTc1NjA4MzNcIiwgXG4gIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICBcInVuaXF1ZVwiIDogdHJ1ZSwgXG4gIFwiY29kZVwiIDogMjAxIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJpZHMvODMyOTNcIiwgXG4gIFwiX2tleVwiIDogXCI4MzI5M1wiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhbE95LS1BXCIgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImlkcy84MzI5NVwiLCBcbiAgXCJfa2V5XCIgOiBcIjgzMjk1XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FsTzItLS1cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiaWRzLzgzMjk3XCIsIFxuICBcIl9rZXlcIiA6IFwiODMyOTdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWxPMi0tX1wiIFxufVxuXG5bQXJhbmdvRXJyb3IgMTIxMDogdW5pcXVlIGNvbnN0cmFpbnQgdmlvbGF0ZWQgLSBpbiBpbmRleCBpZHhfMTgzMjkzNjIyODMxNzU2MDgzMyBvZiB0eXBlIHBlcnNpc3RlbnQgb3ZlciAnbmFtZS5maXJzdCwgbmFtZS5sYXN0JzsgY29uZmxpY3Rpbmcga2V5OiA4MzI5M10iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW5zdXJlVW5pcXVlUGVyc2lzdGVudE11bHRpQ29sbXVuIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "ensureUniquePersistentSingle_single": { + "request": "LS0tCm5hbWU6IGVuc3VyZVVuaXF1ZVBlcnNpc3RlbnRTaW5nbGUKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiaWRzIik7CmRiLmlkcy5lbnN1cmVJbmRleCh7IHR5cGU6ICJwZXJzaXN0ZW50IiwgZmllbGRzOiBbICJteUlkIiBdLCB1bmlxdWU6IHRydWUgfSk7CmRiLmlkcy5zYXZlKHsgIm15SWQiOiAxMjMgfSk7CmRiLmlkcy5zYXZlKHsgIm15SWQiOiA0NTYgfSk7CmRiLmlkcy5zYXZlKHsgIm15SWQiOiA3ODkgfSk7CmRiLmlkcy5zYXZlKHsgIm15SWQiOiAxMjMgfSk7ICAvLyB4cEVycm9yKEVSUk9SX0FSQU5HT19VTklRVUVfQ09OU1RSQUlOVF9WSU9MQVRFRCkKfmRiLl9kcm9wKCJpZHMiKTs=", + "response": "eyJpbnB1dCI6ImRiLmlkcy5lbnN1cmVJbmRleCh7IHR5cGU6IFwicGVyc2lzdGVudFwiLCBmaWVsZHM6IFsgXCJteUlkXCIgXSwgdW5pcXVlOiB0cnVlIH0pO1xuZGIuaWRzLnNhdmUoeyBcIm15SWRcIjogMTIzIH0pO1xuZGIuaWRzLnNhdmUoeyBcIm15SWRcIjogNDU2IH0pO1xuZGIuaWRzLnNhdmUoeyBcIm15SWRcIjogNzg5IH0pO1xuZGIuaWRzLnNhdmUoeyBcIm15SWRcIjogMTIzIH0pOyAgIiwib3V0cHV0IjoieyBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgXCJmaWVsZHNcIiA6IFsgXG4gICAgXCJteUlkXCIgXG4gIF0sIFxuICBcImlkXCIgOiBcImlkcy84MzI3MVwiLCBcbiAgXCJpc05ld2x5Q3JlYXRlZFwiIDogdHJ1ZSwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjIyODMxMTI2OTM3NlwiLCBcbiAgXCJzZWxlY3Rpdml0eUVzdGltYXRlXCIgOiAxLCBcbiAgXCJzcGFyc2VcIiA6IGZhbHNlLCBcbiAgXCJ0eXBlXCIgOiBcInBlcnNpc3RlbnRcIiwgXG4gIFwidW5pcXVlXCIgOiB0cnVlLCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59XG5cbnsgXG4gIFwiX2lkXCIgOiBcImlkcy84MzI3NVwiLCBcbiAgXCJfa2V5XCIgOiBcIjgzMjc1XCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FsT2EtLV9cIiBcbn1cblxueyBcbiAgXCJfaWRcIiA6IFwiaWRzLzgzMjc3XCIsIFxuICBcIl9rZXlcIiA6IFwiODMyNzdcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWxPZS0tLVwiIFxufVxuXG57IFxuICBcIl9pZFwiIDogXCJpZHMvODMyNzlcIiwgXG4gIFwiX2tleVwiIDogXCI4MzI3OVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhbE9lLS1fXCIgXG59XG5cbltBcmFuZ29FcnJvciAxMjEwOiB1bmlxdWUgY29uc3RyYWludCB2aW9sYXRlZCAtIGluIGluZGV4IGlkeF8xODMyOTM2MjI4MzExMjY5Mzc2IG9mIHR5cGUgcGVyc2lzdGVudCBvdmVyICdteUlkJzsgY29uZmxpY3Rpbmcga2V5OiA4MzI3NV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW5zdXJlVW5pcXVlUGVyc2lzdGVudFNpbmdsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "ensureVertexCentricIndex_single": { + "request": "LS0tCm5hbWU6IGVuc3VyZVZlcnRleENlbnRyaWNJbmRleApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlRWRnZUNvbGxlY3Rpb24oImVkZ2VDb2xsZWN0aW9uIik7CmRiLmVkZ2VDb2xsZWN0aW9uLmVuc3VyZUluZGV4KHsgdHlwZTogInBlcnNpc3RlbnQiLCBmaWVsZHM6IFsgIl9mcm9tIiwgInR5cGUiIF0gfSk7Cn5kYi5fZHJvcCgiZWRnZUNvbGxlY3Rpb24iKTs=", + "response": "eyJpbnB1dCI6ImRiLmVkZ2VDb2xsZWN0aW9uLmVuc3VyZUluZGV4KHsgdHlwZTogXCJwZXJzaXN0ZW50XCIsIGZpZWxkczogWyBcIl9mcm9tXCIsIFwidHlwZVwiIF0gfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJjYWNoZUVuYWJsZWRcIiA6IGZhbHNlLCBcbiAgXCJkZWR1cGxpY2F0ZVwiIDogdHJ1ZSwgXG4gIFwiZXN0aW1hdGVzXCIgOiB0cnVlLCBcbiAgXCJmaWVsZHNcIiA6IFsgXG4gICAgXCJfZnJvbVwiLCBcbiAgICBcInR5cGVcIiBcbiAgXSwgXG4gIFwiaWRcIiA6IFwiZWRnZUNvbGxlY3Rpb24vODM1MzlcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcIm5hbWVcIiA6IFwiaWR4XzE4MzI5MzYyMjg0Mjg3MDk4ODhcIiwgXG4gIFwic2VsZWN0aXZpdHlFc3RpbWF0ZVwiIDogMSwgXG4gIFwic3BhcnNlXCIgOiBmYWxzZSwgXG4gIFwidHlwZVwiIDogXCJwZXJzaXN0ZW50XCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcImNvZGVcIiA6IDIwMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW5zdXJlVmVydGV4Q2VudHJpY0luZGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "enterpriseGraphCreate1_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZTEKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtdLCBbXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW10sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoOyIsIm91dHB1dCI6IntbRW50ZXJwcmlzZUdyYXBoXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoQ3JlYXRlMSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "enterpriseGraphCreate2_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZTIKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgZWRnZURlZmluaXRpb25zID0gWyBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpIF07CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgZWRnZURlZmluaXRpb25zLCBbXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgZWRnZURlZmluaXRpb25zID0gWyBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiZWRnZXNcIiwgXCJ2ZXJ0aWNlc1wiLCBcInZlcnRpY2VzXCIpIF07XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgZWRnZURlZmluaXRpb25zLCBbXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaDsiLCJvdXRwdXQiOiJ7W0VudGVycHJpc2VHcmFwaF0gXG4gIFwiZWRnZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTAxOTEsIFwiZWRnZXNcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInZlcnRpY2VzXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMTgxLCBcInZlcnRpY2VzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoQ3JlYXRlMiIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "enterpriseGraphCreate3_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZTMKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgZWRnZURlZmluaXRpb25zID0gWyBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJteVJlbGF0aW9uIiwgWyJtYWxlIiwgImZlbWFsZSJdLCBbIm1hbGUiLCAiZmVtYWxlIl0pIF07CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgZWRnZURlZmluaXRpb25zLCBbInNlc3Npb25zIl0sIHtpc1NtYXJ0OiB0cnVlLCBudW1iZXJPZlNoYXJkczogOX0pOwpncmFwaDsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgZWRnZURlZmluaXRpb25zID0gWyBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlSZWxhdGlvblwiLCBbXCJtYWxlXCIsIFwiZmVtYWxlXCJdLCBbXCJtYWxlXCIsIFwiZmVtYWxlXCJdKSBdO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIGVkZ2VEZWZpbml0aW9ucywgW1wic2Vzc2lvbnNcIl0sIHtpc1NtYXJ0OiB0cnVlLCBudW1iZXJPZlNoYXJkczogOX0pO1xuZ3JhcGg7Iiwib3V0cHV0Ijoie1tFbnRlcnByaXNlR3JhcGhdIFxuICBcIm15UmVsYXRpb25cIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTAyNDEsIFwibXlSZWxhdGlvblwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwiZmVtYWxlXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMjQwLCBcImZlbWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm1hbGVcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTAyMzksIFwibWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInNlc3Npb25zXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMjI5LCBcInNlc3Npb25zXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoQ3JlYXRlMyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "enterpriseGraphCreateGraphHowTo1_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG8xCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBbXSwgW10sIHtpc1NtYXJ0OiB0cnVlLCBudW1iZXJPZlNoYXJkczogOX0pOwpncmFwaDsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW10sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoOyIsIm91dHB1dCI6IntbRW50ZXJwcmlzZUdyYXBoXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoQ3JlYXRlR3JhcGhIb3dUbzEiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "enterpriseGraphCreateGraphHowTo2_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG8yCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9lbnRlcnByaXNlLWdyYXBoIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtdLCBbXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJzaG9wIik7CmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJjdXN0b21lciIpOwpncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigicGV0Iik7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgibXlHcmFwaCIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwic2hvcFwiKTtcbmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwiY3VzdG9tZXJcIik7XG5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbihcInBldFwiKTtcbmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaChcIm15R3JhcGhcIik7Iiwib3V0cHV0Ijoie1tFbnRlcnByaXNlR3JhcGhdIFxuICBcImN1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMDU4LCBcImN1c3RvbWVyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwicGV0XCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMDY5LCBcInBldFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInNob3BcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTAwNDcsIFwic2hvcFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG8yIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "enterpriseGraphCreateGraphHowTo3_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG8zCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9lbnRlcnByaXNlLWdyYXBoIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtdLCBbXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7Cn5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigic2hvcCIpOwp+Z3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oImN1c3RvbWVyIik7Cn5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigicGV0Iik7CnZhciByZWwgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJpc0N1c3RvbWVyIiwgWyJzaG9wIl0sIFsiY3VzdG9tZXIiXSk7CmdyYXBoLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMocmVsKTsKZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKCJteUdyYXBoIik7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciByZWwgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiaXNDdXN0b21lclwiLCBbXCJzaG9wXCJdLCBbXCJjdXN0b21lclwiXSk7XG5ncmFwaC5fZXh0ZW5kRWRnZURlZmluaXRpb25zKHJlbCk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbRW50ZXJwcmlzZUdyYXBoXSBcbiAgXCJpc0N1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMTI0LCBcImlzQ3VzdG9tZXJcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInNob3BcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTAwOTAsIFwic2hvcFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImN1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMTAxLCBcImN1c3RvbWVyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwicGV0XCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMTEyLCBcInBldFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG8zIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "enterpriseGraphCreateGraphHowTo4_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG80CmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKdmFyIHJlbCA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImlzQ3VzdG9tZXIiLCAic2hvcCIsICJjdXN0b21lciIpCnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbF0sIFtdLCB7c2F0ZWxsaXRlczogWyJzaG9wIiwgImN1c3RvbWVyIl0sIGlzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgcmVsID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImlzQ3VzdG9tZXJcIiwgXCJzaG9wXCIsIFwiY3VzdG9tZXJcIilcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbcmVsXSwgW10sIHtzYXRlbGxpdGVzOiBbXCJzaG9wXCIsIFwiY3VzdG9tZXJcIl0sIGlzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaDsiLCJvdXRwdXQiOiJ7W0VudGVycHJpc2VHcmFwaF0gXG4gIFwiaXNDdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDE2OCwgXCJpc0N1c3RvbWVyXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJzaG9wXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwMTY2LCBcInNob3BcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJjdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDE2NywgXCJjdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImVudGVycHJpc2VHcmFwaENyZWF0ZUdyYXBoSG93VG80IiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "enterpriseGraphModify1_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTEKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFsib3RoZXIiXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiZWRnZXNcIiwgXCJ2ZXJ0aWNlc1wiLCBcInZlcnRpY2VzXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtyZWxhdGlvbl0sIFtcIm90aGVyXCJdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpOyIsIm91dHB1dCI6IlsgXG4gIFwib3RoZXJcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoTW9kaWZ5MSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "enterpriseGraphModify2_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTIKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKfnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFsib3RoZXIiXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJvdGhlciIsIHRydWUpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwib3RoZXJcIiwgdHJ1ZSk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbRW50ZXJwcmlzZUdyYXBoXSBcbiAgXCJlZGdlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDM3NCwgXCJlZGdlc1wiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwidmVydGljZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTAzNjMsIFwidmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJlbnRlcnByaXNlR3JhcGhNb2RpZnkyIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "enterpriseGraphModify3_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTMKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKfnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oInZlcnRpY2VzIik7IC8vIHhwRXJyb3IoRVJST1JfR1JBUEhfTk9UX0lOX09SUEhBTl9DT0xMRUNUSU9OKQp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwidmVydGljZXNcIik7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxOTI4OiBjb2xsZWN0aW9uIGlzIG5vdCBpbiBsaXN0IG9mIG9ycGhhbiBjb2xsZWN0aW9uc10iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoTW9kaWZ5MyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "enterpriseGraphModify4_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTQKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIpOwpncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbigidmVydGljZXMiKTsKZGIuX2Ryb3AoInZlcnRpY2VzIik7IC8vIHhwRXJyb3IoRVJST1JfQ0xVU1RFUl9NVVNUX05PVF9EUk9QX0NPTExfT1RIRVJfRElTVFJJQlVURVNIQVJEU0xJS0UpCn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTsKfmRiLl9kcm9wKCJlZGdlcyIpOwp+ZGIuX2Ryb3AoInZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiZWRnZXNcIiwgXCJ2ZXJ0aWNlc1wiLCBcInZlcnRpY2VzXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcImVkZ2VzXCIpO1xuZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oXCJ2ZXJ0aWNlc1wiKTtcbmRiLl9kcm9wKFwidmVydGljZXNcIik7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxNDg1OiBDb2xsZWN0aW9uICd2ZXJ0aWNlcycgbXVzdCBub3QgYmUgZHJvcHBlZCB3aGlsZSAnX2Zyb21fZWRnZXMnLCAnX3RvX2VkZ2VzJywgJ2VkZ2VzJywgJ19sb2NhbF9lZGdlcycgaGF2ZSBkaXN0cmlidXRlU2hhcmRzTGlrZSBzZXQgdG8gJ3ZlcnRpY2VzJy5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImVudGVycHJpc2VHcmFwaE1vZGlmeTQiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "enterpriseGraphModify5_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTUKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIpOyAgICAgIC8vIFJlbW92ZSBlZGdlIGNvbGxlY3Rpb24gZnJvbSBncmFwaCBkZWZpbml0aW9uCmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJ2ZXJ0aWNlcyIpOyAvLyBSZW1vdmUgdmVydGV4IGNvbGxlY3Rpb24gZnJvbSBncmFwaCBkZWZpbml0aW9uCmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOyAgICAgICAvLyBEb2VzIG5vdCBkcm9wIGFueSBjb2xsZWN0aW9ucyBiZWNhdXNlIG5vbmUgYXJlIGxlZnQgaW4gdGhlIGdyYXBoIGRlZmluaXRpb24KZGIuX2Ryb3AoImVkZ2VzIik7IC8vIE1hbnVhbGx5IGNsZWFuIHVwIHRoZSBjb2xsZWN0aW9ucyB0aGF0IHdlcmUgbGVmdCBiZWhpbmQsIGRyb3AgJ2VkZ2VzJyBiZWZvcmUgc2hhcmRpbmctZGVmaW5pbmcgJ3ZlcnRpY2VzJyBjb2xsZWN0aW9uCmRiLl9kcm9wKCJ2ZXJ0aWNlcyIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiZWRnZXNcIiwgXCJ2ZXJ0aWNlc1wiLCBcInZlcnRpY2VzXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcImVkZ2VzXCIpOyAgICAgIC8vIFJlbW92ZSBlZGdlIGNvbGxlY3Rpb24gZnJvbSBncmFwaCBkZWZpbml0aW9uXG5ncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbihcInZlcnRpY2VzXCIpOyAvLyBSZW1vdmUgdmVydGV4IGNvbGxlY3Rpb24gZnJvbSBncmFwaCBkZWZpbml0aW9uXG5ncmFwaF9tb2R1bGUuX2Ryb3AoXCJteUdyYXBoXCIsIHRydWUpOyAgICAgICAvLyBEb2VzIG5vdCBkcm9wIGFueSBjb2xsZWN0aW9ucyBiZWNhdXNlIG5vbmUgYXJlIGxlZnQgaW4gdGhlIGdyYXBoIGRlZmluaXRpb25cbmRiLl9kcm9wKFwiZWRnZXNcIik7IC8vIE1hbnVhbGx5IGNsZWFuIHVwIHRoZSBjb2xsZWN0aW9ucyB0aGF0IHdlcmUgbGVmdCBiZWhpbmQsIGRyb3AgJ2VkZ2VzJyBiZWZvcmUgc2hhcmRpbmctZGVmaW5pbmcgJ3ZlcnRpY2VzJyBjb2xsZWN0aW9uXG5kYi5fZHJvcChcInZlcnRpY2VzXCIpOyIsIm91dHB1dCI6IkVtcHR5IE91dHB1dCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJlbnRlcnByaXNlR3JhcGhNb2RpZnk1IiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "enterpriseGraphModify6_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTYKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZW50ZXJwcmlzZS1ncmFwaCIpOwp2YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIsIHRydWUpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGhcIik7XG52YXIgcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiZWRnZXNcIiwgXCJ2ZXJ0aWNlc1wiLCBcInZlcnRpY2VzXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcImVkZ2VzXCIsIHRydWUpO1xuZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKFwibXlHcmFwaFwiKTsiLCJvdXRwdXQiOiJ7W0VudGVycHJpc2VHcmFwaF0gXG4gIFwidmVydGljZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA1NjMsIFwidmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJlbnRlcnByaXNlR3JhcGhNb2RpZnk2IiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "enterpriseGraphModify7_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaE1vZGlmeTcKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKfnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFtdLCB7aXNTbWFydDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIpOwpncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbigidmVydGljZXMiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOwp+ZGIuX2Ryb3AoImVkZ2VzIik7Cn5kYi5fZHJvcCgidmVydGljZXMiKTs=", + "response": "eyJpbnB1dCI6ImdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcImVkZ2VzXCIpO1xuZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oXCJ2ZXJ0aWNlc1wiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZW50ZXJwcmlzZUdyYXBoTW9kaWZ5NyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "enterpriseGraphRemove1_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaFJlbW92ZTEKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKfnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFsib3RoZXIiXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImdyYXBoX21vZHVsZS5fZHJvcChcIm15R3JhcGhcIiwgdHJ1ZSk7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImVudGVycHJpc2VHcmFwaFJlbW92ZTEiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "enterpriseGraphRemove2_cluster": { + "request": "LS0tCm5hbWU6IGVudGVycHJpc2VHcmFwaFJlbW92ZTIKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2VudGVycHJpc2UtZ3JhcGgiKTsKfnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7Cn52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtyZWxhdGlvbl0sIFsib3RoZXIiXSwge2lzU21hcnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJvdGhlciIpOwpncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTsgLy8geHBFcnJvcihFUlJPUl9DTFVTVEVSX01VU1RfTk9UX0RST1BfQ09MTF9PVEhFUl9ESVNUUklCVVRFU0hBUkRTTElLRSkKfmRiLl9kcm9wKCJvdGhlciIpOwp+ZGIuX2Ryb3AoInZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwib3RoZXJcIik7XG5ncmFwaF9tb2R1bGUuX2Ryb3AoXCJteUdyYXBoXCIsIHRydWUpOyAiLCJvdXRwdXQiOiJbQXJhbmdvRXJyb3IgMTQ4NTogQ29sbGVjdGlvbiAndmVydGljZXMnIG11c3Qgbm90IGJlIGRyb3BwZWQgd2hpbGUgJ290aGVyJyBoYXMgZGlzdHJpYnV0ZVNoYXJkc0xpa2Ugc2V0IHRvICd2ZXJ0aWNlcycuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJlbnRlcnByaXNlR3JhcGhSZW1vdmUyIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "executeQueryBatchSize_single": { + "request": "LS0tCm5hbWU6IGV4ZWN1dGVRdWVyeUJhdGNoU2l6ZQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJ1c2VycyIpOwp+ZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJHZXJoYXJkIiB9KTsKfmRiLnVzZXJzLnNhdmUoeyBuYW1lOiAiSGVsbXV0IiB9KTsKfmRiLnVzZXJzLnNhdmUoeyBuYW1lOiAiQW5nZWxhIiB9KTsKdmFyIHJlc3VsdCA9IFsgXTsKdmFyIHEgPSBkYi51c2Vycy5hbGwoKTsKcS5leGVjdXRlKDEpOwp3aGlsZShxLmhhc05leHQoKSkgewogIHJlc3VsdC5wdXNoKHEubmV4dCgpKTsKfQpwcmludChyZXN1bHQpOwoKcmVzdWx0ID0gWyBdOwpxID0gZGIuX3F1ZXJ5KCJGT1IgeCBJTiB1c2VycyBSRVRVUk4geCIsIHt9LCB7IGJhdGNoU2l6ZTogMSB9KTsKd2hpbGUgKHEuaGFzTmV4dCgpKSB7CiAgcmVzdWx0LnB1c2gocS5uZXh0KCkpOwp9CnByaW50KHJlc3VsdCk7Cn5kYi5fZHJvcCgidXNlcnMiKQ==", + "response": "eyJpbnB1dCI6InZhciByZXN1bHQgPSBbIF07XG52YXIgcSA9IGRiLnVzZXJzLmFsbCgpO1xucS5leGVjdXRlKDEpO1xud2hpbGUocS5oYXNOZXh0KCkpIHtcbiAgcmVzdWx0LnB1c2gocS5uZXh0KCkpO1xufVxucHJpbnQocmVzdWx0KTtcblxucmVzdWx0ID0gWyBdO1xucSA9IGRiLl9xdWVyeShcIkZPUiB4IElOIHVzZXJzIFJFVFVSTiB4XCIsIHt9LCB7IGJhdGNoU2l6ZTogMSB9KTtcbndoaWxlIChxLmhhc05leHQoKSkge1xuICByZXN1bHQucHVzaChxLm5leHQoKSk7XG59XG5wcmludChyZXN1bHQpOyIsIm91dHB1dCI6IjNcblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczNDdcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczNDdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZxLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJHZXJoYXJkXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzM0OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy82NzM0OVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paNnEtLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkhlbG11dFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczNTFcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczNTFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZ1LS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbmdlbGFcIiBcbiAgfSBcbl1cblxuWyBdXG5cbltvYmplY3QgQXJhbmdvUXVlcnlDdXJzb3IsIGNvdW50OiAxLCBjYWNoZWQ6IGZhbHNlLCBoYXNNb3JlOiBmYWxzZV1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczNDdcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczNDdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZxLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJHZXJoYXJkXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzM0OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy82NzM0OVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paNnEtLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkhlbG11dFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczNTFcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczNTFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZ1LS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbmdlbGFcIiBcbiAgfSBcbl1cblxuMVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzM1MVwiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy82NzM1MVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paNnUtLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFuZ2VsYVwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJleGVjdXRlUXVlcnlCYXRjaFNpemUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "executeQueryNoBatchSize_single": { + "request": "LS0tCm5hbWU6IGV4ZWN1dGVRdWVyeU5vQmF0Y2hTaXplCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoInVzZXJzIik7Cn5kYi51c2Vycy5zYXZlKHsgbmFtZTogIkdlcmhhcmQiIH0pOwp+ZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJIZWxtdXQiIH0pOwp+ZGIudXNlcnMuc2F2ZSh7IG5hbWU6ICJBbmdlbGEiIH0pOwp2YXIgcmVzdWx0ID0gZGIudXNlcnMuYWxsKCkudG9BcnJheSgpOwpwcmludChyZXN1bHQpOwoKdmFyIHEgPSBkYi5fcXVlcnkoIkZPUiB4IElOIHVzZXJzIFJFVFVSTiB4Iik7CnJlc3VsdCA9IFsgXTsKd2hpbGUgKHEuaGFzTmV4dCgpKSB7CiAgcmVzdWx0LnB1c2gocS5uZXh0KCkpOwp9CnByaW50KHJlc3VsdCk7Cn5kYi5fZHJvcCgidXNlcnMiKQ==", + "response": "eyJpbnB1dCI6InZhciByZXN1bHQgPSBkYi51c2Vycy5hbGwoKS50b0FycmF5KCk7XG5wcmludChyZXN1bHQpO1xuXG52YXIgcSA9IGRiLl9xdWVyeShcIkZPUiB4IElOIHVzZXJzIFJFVFVSTiB4XCIpO1xucmVzdWx0ID0gWyBdO1xud2hpbGUgKHEuaGFzTmV4dCgpKSB7XG4gIHJlc3VsdC5wdXNoKHEubmV4dCgpKTtcbn1cbnByaW50KHJlc3VsdCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczMzBcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczMzBcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZLLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJHZXJoYXJkXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzMzMlwiLCBcbiAgICBcIl9pZFwiIDogXCJ1c2Vycy82NzMzMlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1paNkstLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkhlbG11dFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczMzRcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczMzRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZPLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbmdlbGFcIiBcbiAgfSBcbl1cblsgXVxuXG4zXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY3MzMwXCIsIFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzY3MzMwXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlo2Sy0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiR2VyaGFyZFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczMzJcIiwgXG4gICAgXCJfaWRcIiA6IFwidXNlcnMvNjczMzJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWjZLLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJIZWxtdXRcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY3MzM0XCIsIFxuICAgIFwiX2lkXCIgOiBcInVzZXJzLzY3MzM0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlo2Ty0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQW5nZWxhXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImV4ZWN1dGVRdWVyeU5vQmF0Y2hTaXplIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphCreateGraph2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoMgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgWwogIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15UmVsYXRpb24iLCBbIm1hbGUiLCAiZmVtYWxlIl0sIFsibWFsZSIsICJmZW1hbGUiXSkKXSwgWyJzZXNzaW9ucyJdKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbXG4gIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJteVJlbGF0aW9uXCIsIFtcIm1hbGVcIiwgXCJmZW1hbGVcIl0sIFtcIm1hbGVcIiwgXCJmZW1hbGVcIl0pXG5dLCBbXCJzZXNzaW9uc1wiXSk7Iiwib3V0cHV0Ijoie1tHZW5lcmFsR3JhcGhdIFxuICBcIm15UmVsYXRpb25cIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NTY1LCBcIm15UmVsYXRpb25cIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImZlbWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg1NjIsIFwiZmVtYWxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg1NTksIFwibWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInNlc3Npb25zXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODU1NiwgXCJzZXNzaW9uc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphCreateGraphHowTo1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoSG93VG8xCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIik7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIik7XG5ncmFwaDsiLCJvdXRwdXQiOiJ7W0dlbmVyYWxHcmFwaF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoSG93VG8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphCreateGraphHowTo2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoSG93VG8yCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwp+dmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiKTsKZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oInNob3AiKTsKZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oImN1c3RvbWVyIik7CmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJwZXQiKTsKZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKCJteUdyYXBoIik7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6ImdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwic2hvcFwiKTtcbmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwiY3VzdG9tZXJcIik7XG5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbihcInBldFwiKTtcbmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaChcIm15R3JhcGhcIik7Iiwib3V0cHV0Ijoie1tHZW5lcmFsR3JhcGhdIFxuICBcImN1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA4Mzk5MSwgXCJjdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInBldFwiIDogW0FyYW5nb0NvbGxlY3Rpb24gODQwMDAsIFwicGV0XCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwic2hvcFwiIDogW0FyYW5nb0NvbGxlY3Rpb24gODM5ODIsIFwic2hvcFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoSG93VG8yIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphCreateGraphHowTo3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoSG93VG8zCmRlc2NyaXB0aW9uOiAnJwotLS0KfnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwp+dmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiKTsKfmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJwZXQiKTsKdmFyIHJlbCA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImlzQ3VzdG9tZXIiLCBbInNob3AiXSwgWyJjdXN0b21lciJdKTsKZ3JhcGguX2V4dGVuZEVkZ2VEZWZpbml0aW9ucyhyZWwpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciByZWwgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiaXNDdXN0b21lclwiLCBbXCJzaG9wXCJdLCBbXCJjdXN0b21lclwiXSk7XG5ncmFwaC5fZXh0ZW5kRWRnZURlZmluaXRpb25zKHJlbCk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbR2VuZXJhbEdyYXBoXSBcbiAgXCJpc0N1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA4NDA2NCwgXCJpc0N1c3RvbWVyXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJzaG9wXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA4NDA1OCwgXCJzaG9wXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwiY3VzdG9tZXJcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDg0MDYxLCBcImN1c3RvbWVyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwicGV0XCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA4NDA0NywgXCJwZXRcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhDcmVhdGVHcmFwaEhvd1RvMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphCreateGraphNoData_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoTm9EYXRhCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiKTsiLCJvdXRwdXQiOiJ7W0dlbmVyYWxHcmFwaF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoTm9EYXRhIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphCreateGraphSingle_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaENyZWF0ZUdyYXBoU2luZ2xlCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9kcm9wKCJlZGdlcyIpOwp+ZGIuX2Ryb3AoInZlcnRpY2VzIik7CnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwp2YXIgZWRnZURlZmluaXRpb25zID0gWyB7IGNvbGxlY3Rpb246ICJlZGdlcyIsICJmcm9tIjogWyAidmVydGljZXMiIF0sICJ0byIgOiBbICJ2ZXJ0aWNlcyIgXSB9IF07CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBlZGdlRGVmaW5pdGlvbnMpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZWRnZURlZmluaXRpb25zID0gWyB7IGNvbGxlY3Rpb246IFwiZWRnZXNcIiwgXCJmcm9tXCI6IFsgXCJ2ZXJ0aWNlc1wiIF0sIFwidG9cIiA6IFsgXCJ2ZXJ0aWNlc1wiIF0gfSBdO1xuZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgZWRnZURlZmluaXRpb25zKTsiLCJvdXRwdXQiOiJ7W0dlbmVyYWxHcmFwaF0gXG4gIFwiZWRnZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NTI3LCBcImVkZ2VzXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJ2ZXJ0aWNlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg1MjQsIFwidmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhDcmVhdGVHcmFwaFNpbmdsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphDropGraphDropCollections_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaERyb3BHcmFwaERyb3BDb2xsZWN0aW9ucwpkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp+dmFyIGcxID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CmdyYXBoX21vZHVsZS5fZ3JhcGgoInNvY2lhbCIpOwpncmFwaF9tb2R1bGUuX2Ryb3AoInNvY2lhbCIsIHRydWUpOwpkYi5fY29sbGVjdGlvbigiZmVtYWxlIik7CmRiLl9jb2xsZWN0aW9uKCJtYWxlIik7CmRiLl9jb2xsZWN0aW9uKCJyZWxhdGlvbiIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaF9tb2R1bGUuX2dyYXBoKFwic29jaWFsXCIpO1xuZ3JhcGhfbW9kdWxlLl9kcm9wKFwic29jaWFsXCIsIHRydWUpO1xuZGIuX2NvbGxlY3Rpb24oXCJmZW1hbGVcIik7XG5kYi5fY29sbGVjdGlvbihcIm1hbGVcIik7XG5kYi5fY29sbGVjdGlvbihcInJlbGF0aW9uXCIpOyIsIm91dHB1dCI6IntbR2VuZXJhbEdyYXBoXSBcbiAgXCJyZWxhdGlvblwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg5MzIsIFwicmVsYXRpb25cIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImZlbWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg5MjIsIFwiZmVtYWxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg5MjcsIFwibWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59XG5udWxsXG5cbm51bGxcblxubnVsbCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhEcm9wR3JhcGhEcm9wQ29sbGVjdGlvbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphDropGraphKeep_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaERyb3BHcmFwaEtlZXAKZGVzY3JpcHRpb246ICcnCi0tLQp+dmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKfnZhciBnMSA9IGV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwpncmFwaF9tb2R1bGUuX2dyYXBoKCJzb2NpYWwiKTsKZ3JhcGhfbW9kdWxlLl9kcm9wKCJzb2NpYWwiKTsKZGIuX2NvbGxlY3Rpb24oImZlbWFsZSIpOwpkYi5fY29sbGVjdGlvbigibWFsZSIpOwpkYi5fY29sbGVjdGlvbigicmVsYXRpb24iKTsKfmRiLl9kcm9wKCJmZW1hbGUiKTsKfmRiLl9kcm9wKCJtYWxlIik7Cn5kYi5fZHJvcCgicmVsYXRpb24iKTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaF9tb2R1bGUuX2dyYXBoKFwic29jaWFsXCIpO1xuZ3JhcGhfbW9kdWxlLl9kcm9wKFwic29jaWFsXCIpO1xuZGIuX2NvbGxlY3Rpb24oXCJmZW1hbGVcIik7XG5kYi5fY29sbGVjdGlvbihcIm1hbGVcIik7XG5kYi5fY29sbGVjdGlvbihcInJlbGF0aW9uXCIpOyIsIm91dHB1dCI6IntbR2VuZXJhbEdyYXBoXSBcbiAgXCJyZWxhdGlvblwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg4ODQsIFwicmVsYXRpb25cIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImZlbWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg4NzQsIFwiZmVtYWxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg4NzksIFwibWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59XG5bQXJhbmdvQ29sbGVjdGlvbiA3ODg3NCwgXCJmZW1hbGVcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldXG5cbltBcmFuZ29Db2xsZWN0aW9uIDc4ODc5LCBcIm1hbGVcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldXG5cbltBcmFuZ29Db2xsZWN0aW9uIDc4ODg0LCBcInJlbGF0aW9uXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaERyb3BHcmFwaEtlZXAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphEdgeCollectionRemove_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uUmVtb3ZlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGRvYyA9IGdyYXBoLnJlbGF0aW9uLnNhdmUoImZlbWFsZS9hbGljZSIsICJmZW1hbGUvZGlhbmEiLCB7X2tleTogImFsaWNlQW5kRGlhbmEifSk7CmRiLl9leGlzdHMoInJlbGF0aW9uL2FsaWNlQW5kRGlhbmEiKQp2YXIgc3VjY2VzcyA9IGdyYXBoLnJlbGF0aW9uLnJlbW92ZSgicmVsYXRpb24vYWxpY2VBbmREaWFuYSIpCmRiLl9leGlzdHMoInJlbGF0aW9uL2FsaWNlQW5kRGlhbmEiKQp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBkb2MgPSBncmFwaC5yZWxhdGlvbi5zYXZlKFwiZmVtYWxlL2FsaWNlXCIsIFwiZmVtYWxlL2RpYW5hXCIsIHtfa2V5OiBcImFsaWNlQW5kRGlhbmFcIn0pO1xuZGIuX2V4aXN0cyhcInJlbGF0aW9uL2FsaWNlQW5kRGlhbmFcIilcbnZhciBzdWNjZXNzID0gZ3JhcGgucmVsYXRpb24ucmVtb3ZlKFwicmVsYXRpb24vYWxpY2VBbmREaWFuYVwiKVxuZGIuX2V4aXN0cyhcInJlbGF0aW9uL2FsaWNlQW5kRGlhbmFcIikiLCJvdXRwdXQiOiJ0cnVlXG5mYWxzZSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhFZGdlQ29sbGVjdGlvblJlbW92ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphEdgeCollectionReplace_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uUmVwbGFjZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgic29jaWFsIik7CnZhciBkb2MgPSBncmFwaC5yZWxhdGlvbi5zYXZlKCJmZW1hbGUvYWxpY2UiLCAiZmVtYWxlL2RpYW5hIiwge3R5cG86ICJub3NlIiwgX2tleTogImFsaWNlQW5kRGlhbmEifSk7CmdyYXBoLnJlbGF0aW9uLnJlcGxhY2UoInJlbGF0aW9uL2FsaWNlQW5kRGlhbmEiLAogIHsgdHlwZTogImtub3dzIiwgX2Zyb206ICJmZW1hbGUvYWxpY2UiLCBfdG86ICJmZW1hbGUvZGlhbmEiIH0sCiAgeyByZXR1cm5PbGQ6IHRydWUsIHJldHVybk5ldzogdHJ1ZSB9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBkb2MgPSBncmFwaC5yZWxhdGlvbi5zYXZlKFwiZmVtYWxlL2FsaWNlXCIsIFwiZmVtYWxlL2RpYW5hXCIsIHt0eXBvOiBcIm5vc2VcIiwgX2tleTogXCJhbGljZUFuZERpYW5hXCJ9KTtcbmdyYXBoLnJlbGF0aW9uLnJlcGxhY2UoXCJyZWxhdGlvbi9hbGljZUFuZERpYW5hXCIsXG4gIHsgdHlwZTogXCJrbm93c1wiLCBfZnJvbTogXCJmZW1hbGUvYWxpY2VcIiwgX3RvOiBcImZlbWFsZS9kaWFuYVwiIH0sXG4gIHsgcmV0dXJuT2xkOiB0cnVlLCByZXR1cm5OZXc6IHRydWUgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwicmVsYXRpb24vYWxpY2VBbmREaWFuYVwiLCBcbiAgXCJfa2V5XCIgOiBcImFsaWNlQW5kRGlhbmFcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWJCbS0tX1wiLCBcbiAgXCJfb2xkUmV2XCIgOiBcIl9qdDNhYkJtLS0tXCIsIFxuICBcIm9sZFwiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiYWxpY2VBbmREaWFuYVwiLCBcbiAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi9hbGljZUFuZERpYW5hXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgIFwiX3RvXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FiQm0tLS1cIiwgXG4gICAgXCJ0eXBvXCIgOiBcIm5vc2VcIiBcbiAgfSwgXG4gIFwibmV3XCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJhbGljZUFuZERpYW5hXCIsIFxuICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uL2FsaWNlQW5kRGlhbmFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfdG9cIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWJCbS0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwia25vd3NcIiBcbiAgfSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoRWRnZUNvbGxlY3Rpb25SZXBsYWNlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphEdgeCollectionSave1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uU2F2ZTEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwpncmFwaC5yZWxhdGlvbi5zYXZlKHsKICBfZnJvbTogIm1hbGUvYm9iIiwKICBfdG86ICJmZW1hbGUvYWxpY2UiLAogIF9rZXk6ICJib2JBbmRBbGljZSIsIHR5cGU6ICJtYXJyaWVkIiB9LCB7IHJldHVybk5ldzogdHJ1ZSB9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbmdyYXBoLnJlbGF0aW9uLnNhdmUoe1xuICBfZnJvbTogXCJtYWxlL2JvYlwiLFxuICBfdG86IFwiZmVtYWxlL2FsaWNlXCIsXG4gIF9rZXk6IFwiYm9iQW5kQWxpY2VcIiwgdHlwZTogXCJtYXJyaWVkXCIgfSwgeyByZXR1cm5OZXc6IHRydWUgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfaWRcIiA6IFwicmVsYXRpb24vYm9iQW5kQWxpY2VcIiwgXG4gIFwiX2tleVwiIDogXCJib2JBbmRBbGljZVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhYi1pLS1DXCIsIFxuICBcIm5ld1wiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiYm9iQW5kQWxpY2VcIiwgXG4gICAgXCJfaWRcIiA6IFwicmVsYXRpb24vYm9iQW5kQWxpY2VcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICBcIl90b1wiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhYi1pLS1DXCIsIFxuICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uU2F2ZTEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphEdgeCollectionSave2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uU2F2ZTIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwpncmFwaC5yZWxhdGlvbi5zYXZlKAogICJyZWxhdGlvbi9hbGljZUFuZEJvYiIsCiAgICJmZW1hbGUvYWxpY2UiLAogIHt0eXBlOiAibWFycmllZCIsIF9rZXk6ICJib2JBbmRBbGljZSJ9KTsgLy8geHBFcnJvcihFUlJPUl9HUkFQSF9JTlZBTElEX0VER0UpCn5leGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbmdyYXBoLnJlbGF0aW9uLnNhdmUoXG4gIFwicmVsYXRpb24vYWxpY2VBbmRCb2JcIixcbiAgIFwiZmVtYWxlL2FsaWNlXCIsXG4gIHt0eXBlOiBcIm1hcnJpZWRcIiwgX2tleTogXCJib2JBbmRBbGljZVwifSk7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxOTA2OiBpbnZhbGlkIGVkZ2UgYmV0d2VlbiByZWxhdGlvbi9hbGljZUFuZEJvYiBhbmQgZmVtYWxlL2FsaWNlLiBEb2Vzbid0IGNvbmZvcm0gdG8gYW55IGVkZ2UgZGVmaW5pdGlvbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoRWRnZUNvbGxlY3Rpb25TYXZlMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphEdgeCollectionUpdate_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uVXBkYXRlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGRvYyA9IGdyYXBoLnJlbGF0aW9uLnNhdmUoImZlbWFsZS9hbGljZSIsICJmZW1hbGUvZGlhbmEiLCB7dHlwZTogImtub3dzIiwgX2tleTogImFsaWNlQW5kRGlhbmEifSk7CmdyYXBoLnJlbGF0aW9uLnVwZGF0ZSgicmVsYXRpb24vYWxpY2VBbmREaWFuYSIsCiAgeyB0eXBlOiAicXVhcnJlbGVkIiwgX2tleTogImFsaWNlQW5kRGlhbmEiIH0sCiAgeyByZXR1cm5PbGQ6IHRydWUsIHJldHVybk5ldzogdHJ1ZSB9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBkb2MgPSBncmFwaC5yZWxhdGlvbi5zYXZlKFwiZmVtYWxlL2FsaWNlXCIsIFwiZmVtYWxlL2RpYW5hXCIsIHt0eXBlOiBcImtub3dzXCIsIF9rZXk6IFwiYWxpY2VBbmREaWFuYVwifSk7XG5ncmFwaC5yZWxhdGlvbi51cGRhdGUoXCJyZWxhdGlvbi9hbGljZUFuZERpYW5hXCIsXG4gIHsgdHlwZTogXCJxdWFycmVsZWRcIiwgX2tleTogXCJhbGljZUFuZERpYW5hXCIgfSxcbiAgeyByZXR1cm5PbGQ6IHRydWUsIHJldHVybk5ldzogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJyZWxhdGlvbi9hbGljZUFuZERpYW5hXCIsIFxuICBcIl9rZXlcIiA6IFwiYWxpY2VBbmREaWFuYVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhYkRTLS0tXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FiRE8tLUNcIiwgXG4gIFwib2xkXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJhbGljZUFuZERpYW5hXCIsIFxuICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uL2FsaWNlQW5kRGlhbmFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfdG9cIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWJETy0tQ1wiLCBcbiAgICBcInR5cGVcIiA6IFwia25vd3NcIiBcbiAgfSwgXG4gIFwibmV3XCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJhbGljZUFuZERpYW5hXCIsIFxuICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uL2FsaWNlQW5kRGlhbmFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfdG9cIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWJEUy0tLVwiLCBcbiAgICBcInR5cGVcIiA6IFwicXVhcnJlbGVkXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaEVkZ2VDb2xsZWN0aW9uVXBkYXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphEdgeDefinitionsExtend_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VEZWZpbml0aW9uc0V4dGVuZApkZXNjcmlwdGlvbjogJycKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwp2YXIgZGlyZWN0ZWRfcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJsaXZlc19pbiIsICJ1c2VyIiwgImNpdHkiKTsKdmFyIHVuZGlyZWN0ZWRfcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJrbm93cyIsICJ1c2VyIiwgInVzZXIiKTsKdmFyIGVkZ2VkZWZpbml0aW9ucyA9IGdyYXBoX21vZHVsZS5fZWRnZURlZmluaXRpb25zKGRpcmVjdGVkX3JlbGF0aW9uKTsKZ3JhcGhfbW9kdWxlLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMoZWRnZWRlZmluaXRpb25zLCB1bmRpcmVjdGVkX3JlbGF0aW9uKTsKZWRnZWRlZmluaXRpb25zOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZGlyZWN0ZWRfcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibGl2ZXNfaW5cIiwgXCJ1c2VyXCIsIFwiY2l0eVwiKTtcbnZhciB1bmRpcmVjdGVkX3JlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImtub3dzXCIsIFwidXNlclwiLCBcInVzZXJcIik7XG52YXIgZWRnZWRlZmluaXRpb25zID0gZ3JhcGhfbW9kdWxlLl9lZGdlRGVmaW5pdGlvbnMoZGlyZWN0ZWRfcmVsYXRpb24pO1xuZ3JhcGhfbW9kdWxlLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMoZWRnZWRlZmluaXRpb25zLCB1bmRpcmVjdGVkX3JlbGF0aW9uKTtcbmVkZ2VkZWZpbml0aW9uczsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiY29sbGVjdGlvblwiIDogXCJsaXZlc19pblwiLCBcbiAgICBcImZyb21cIiA6IFsgXG4gICAgICBcInVzZXJcIiBcbiAgICBdLCBcbiAgICBcInRvXCIgOiBbIFxuICAgICAgXCJjaXR5XCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJjb2xsZWN0aW9uXCIgOiBcImtub3dzXCIsIFxuICAgIFwiZnJvbVwiIDogWyBcbiAgICAgIFwidXNlclwiIFxuICAgIF0sIFxuICAgIFwidG9cIiA6IFsgXG4gICAgICBcInVzZXJcIiBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhFZGdlRGVmaW5pdGlvbnNFeHRlbmQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphEdgeDefinitionsSimple_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEVkZ2VEZWZpbml0aW9uc1NpbXBsZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwp2YXIgZGlyZWN0ZWRfcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJsaXZlc19pbiIsICJ1c2VyIiwgImNpdHkiKTsKdmFyIHVuZGlyZWN0ZWRfcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJrbm93cyIsICJ1c2VyIiwgInVzZXIiKTsKdmFyIGVkZ2VkZWZpbml0aW9ucyA9IGdyYXBoX21vZHVsZS5fZWRnZURlZmluaXRpb25zKGRpcmVjdGVkX3JlbGF0aW9uLCB1bmRpcmVjdGVkX3JlbGF0aW9uKTsKZWRnZWRlZmluaXRpb25zOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZGlyZWN0ZWRfcmVsYXRpb24gPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibGl2ZXNfaW5cIiwgXCJ1c2VyXCIsIFwiY2l0eVwiKTtcbnZhciB1bmRpcmVjdGVkX3JlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImtub3dzXCIsIFwidXNlclwiLCBcInVzZXJcIik7XG52YXIgZWRnZWRlZmluaXRpb25zID0gZ3JhcGhfbW9kdWxlLl9lZGdlRGVmaW5pdGlvbnMoZGlyZWN0ZWRfcmVsYXRpb24sIHVuZGlyZWN0ZWRfcmVsYXRpb24pO1xuZWRnZWRlZmluaXRpb25zOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJjb2xsZWN0aW9uXCIgOiBcImxpdmVzX2luXCIsIFxuICAgIFwiZnJvbVwiIDogWyBcbiAgICAgIFwidXNlclwiIFxuICAgIF0sIFxuICAgIFwidG9cIiA6IFsgXG4gICAgICBcImNpdHlcIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImNvbGxlY3Rpb25cIiA6IFwia25vd3NcIiwgXG4gICAgXCJmcm9tXCIgOiBbIFxuICAgICAgXCJ1c2VyXCIgXG4gICAgXSwgXG4gICAgXCJ0b1wiIDogWyBcbiAgICAgIFwidXNlclwiIFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaEVkZ2VEZWZpbml0aW9uc1NpbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphGetFromVertex_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEdldEZyb21WZXJ0ZXgKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgYW55ID0gcmVxdWlyZSgiQGFyYW5nb2RiIikuZGIucmVsYXRpb24uYW55KCk7CmdyYXBoLl9mcm9tVmVydGV4KCJyZWxhdGlvbi8iICsgYW55Ll9rZXkpOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBhbnkgPSByZXF1aXJlKFwiQGFyYW5nb2RiXCIpLmRiLnJlbGF0aW9uLmFueSgpO1xuZ3JhcGguX2Zyb21WZXJ0ZXgoXCJyZWxhdGlvbi9cIiArIGFueS5fa2V5KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhWk1tLS0tXCIsIFxuICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoR2V0RnJvbVZlcnRleCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphGetToVertex_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaEdldFRvVmVydGV4CmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGFueSA9IHJlcXVpcmUoIkBhcmFuZ29kYiIpLmRiLnJlbGF0aW9uLmFueSgpOwpncmFwaC5fdG9WZXJ0ZXgoInJlbGF0aW9uLyIgKyBhbnkuX2tleSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBhbnkgPSByZXF1aXJlKFwiQGFyYW5nb2RiXCIpLmRiLnJlbGF0aW9uLmFueSgpO1xuZ3JhcGguX3RvVmVydGV4KFwicmVsYXRpb24vXCIgKyBhbnkuX2tleSk7Iiwib3V0cHV0IjoieyBcbiAgXCJfa2V5XCIgOiBcImRpYW5hXCIsIFxuICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYVpPSy0tQVwiLCBcbiAgXCJuYW1lXCIgOiBcIkRpYW5hXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaEdldFRvVmVydGV4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphListObjects_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaExpc3RPYmplY3RzCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7Cn5ncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFsgeyBjb2xsZWN0aW9uOiAiZWRnZXMiLCAiZnJvbSI6IFsgInZlcnRpY2VzIiBdLCAidG8iIDogWyAidmVydGljZXMiIF0gfSBdKTsKfmdyYXBoX21vZHVsZS5fY3JlYXRlKCJteVN0b3JlIiwgWyB7IGNvbGxlY3Rpb246ICJmcmllbmRfb2YiLCBmcm9tOiBbICJDdXN0b21lciIgXSwgdG86IFsgIkN1c3RvbWVyIiBdIH0sIHsgY29sbGVjdGlvbjogImhhc19ib3VnaHQiLCBmcm9tOiBbICJDdXN0b21lciIsICJDb21wYW55IiBdLCB0bzogWyAiR3JvY2VyaWVzIiwgIkVsZWN0cm9uaWNzIiBdIH0gXSk7CmdyYXBoX21vZHVsZS5fbGlzdE9iamVjdHMoKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteVN0b3JlIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaF9tb2R1bGUuX2xpc3RPYmplY3RzKCk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9pZFwiIDogXCJfZ3JhcGhzL215R3JhcGhcIiwgXG4gICAgXCJfa2V5XCIgOiBcIm15R3JhcGhcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhYWp1LS1fXCIsIFxuICAgIFwiZWRnZURlZmluaXRpb25zXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImVkZ2VzXCIsIFxuICAgICAgICBcImZyb21cIiA6IFsgXG4gICAgICAgICAgXCJ2ZXJ0aWNlc1wiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcInZlcnRpY2VzXCIgXG4gICAgICAgIF0gXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgXCJuYW1lXCIgOiBcIm15R3JhcGhcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfaWRcIiA6IFwiX2dyYXBocy9teVN0b3JlXCIsIFxuICAgIFwiX2tleVwiIDogXCJteVN0b3JlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWFqMi0tX1wiLCBcbiAgICBcImVkZ2VEZWZpbml0aW9uc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiY29sbGVjdGlvblwiIDogXCJmcmllbmRfb2ZcIiwgXG4gICAgICAgIFwiZnJvbVwiIDogWyBcbiAgICAgICAgICBcIkN1c3RvbWVyXCIgXG4gICAgICAgIF0sIFxuICAgICAgICBcInRvXCIgOiBbIFxuICAgICAgICAgIFwiQ3VzdG9tZXJcIiBcbiAgICAgICAgXSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImhhc19ib3VnaHRcIiwgXG4gICAgICAgIFwiZnJvbVwiIDogWyBcbiAgICAgICAgICBcIkNvbXBhbnlcIiwgXG4gICAgICAgICAgXCJDdXN0b21lclwiIFxuICAgICAgICBdLCBcbiAgICAgICAgXCJ0b1wiIDogWyBcbiAgICAgICAgICBcIkVsZWN0cm9uaWNzXCIsIFxuICAgICAgICAgIFwiR3JvY2VyaWVzXCIgXG4gICAgICAgIF0gXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwib3JwaGFuQ29sbGVjdGlvbnNcIiA6IFsgXSwgXG4gICAgXCJuYW1lXCIgOiBcIm15U3RvcmVcIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTGlzdE9iamVjdHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphList_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaExpc3QKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIik7Cn5ncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlTdG9yZSIpOwpncmFwaF9tb2R1bGUuX2xpc3QoKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteVN0b3JlIik7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaF9tb2R1bGUuX2xpc3QoKTsiLCJvdXRwdXQiOiJbIFxuICBcIm15R3JhcGhcIiwgXG4gIFwibXlTdG9yZVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhMaXN0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphLoadGraph_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaExvYWRHcmFwaApkZXNjcmlwdGlvbjogJycKLS0tCn52YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp+dmFyIGcxID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgic29jaWFsIik7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJzb2NpYWxcIik7Iiwib3V0cHV0Ijoie1tHZW5lcmFsR3JhcGhdIFxuICBcInJlbGF0aW9uXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODgyNCwgXCJyZWxhdGlvblwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwiZmVtYWxlXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODgxNCwgXCJmZW1hbGVcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJtYWxlXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODgxOSwgXCJtYWxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTG9hZEdyYXBoIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleAbsBetweenness1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0JldHdlZW5uZXNzMQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9hYnNvbHV0ZUJldHdlZW5uZXNzKHt9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUJldHdlZW5uZXNzKHt9KTsiLCJvdXRwdXQiOiJ7IFxuICBcImZyZW5jaENpdHkvTHlvblwiIDogMCwgXG4gIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMCwgXG4gIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiA6IDAsIFxuICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIDogMCwgXG4gIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgOiAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVBYnNCZXR3ZWVubmVzczEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleAbsBetweenness2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0JldHdlZW5uZXNzMgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9hYnNvbHV0ZUJldHdlZW5uZXNzKHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUJldHdlZW5uZXNzKHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOyIsIm91dHB1dCI6InsgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZUFic0JldHdlZW5uZXNzMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAbsBetweenness3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0JldHdlZW5uZXNzMwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9hYnNvbHV0ZUJldHdlZW5uZXNzKHsgZGlyZWN0aW9uOiAnb3V0Ym91bmQnLCB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUJldHdlZW5uZXNzKHsgZGlyZWN0aW9uOiAnb3V0Ym91bmQnLCB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Iiwib3V0cHV0IjoieyBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzQmV0d2Vlbm5lc3MzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleAbsCloseness1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0Nsb3NlbmVzczEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fYWJzb2x1dGVDbG9zZW5lc3Moe30pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUNsb3NlbmVzcyh7fSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDQsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDQsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiA0LCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDQsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogNCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzQ2xvc2VuZXNzMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAbsCloseness2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0Nsb3NlbmVzczIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fYWJzb2x1dGVDbG9zZW5lc3Moe30sIHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUNsb3NlbmVzcyh7fSwgeyB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDQsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDQsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiA0LCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDQsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogNCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzQ2xvc2VuZXNzMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAbsCloseness3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0Nsb3NlbmVzczMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fYWJzb2x1dGVDbG9zZW5lc3Moe30sIHsKICBzdGFydFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknLAogIGRpcmVjdGlvbjogJ291dGJvdW5kJywKICB3ZWlnaHQ6ICdkaXN0YW5jZScKfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUNsb3NlbmVzcyh7fSwge1xuICBzdGFydFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknLFxuICBkaXJlY3Rpb246ICdvdXRib3VuZCcsXG4gIHdlaWdodDogJ2Rpc3RhbmNlJ1xufSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDAsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiA0LCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDIsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMyBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzQ2xvc2VuZXNzMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAbsEccentricity1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0VjY2VudHJpY2l0eTEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fYWJzb2x1dGVFY2NlbnRyaWNpdHkoe30pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUVjY2VudHJpY2l0eSh7fSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDEsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiAxLCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzRWNjZW50cmljaXR5MSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAbsEccentricity2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0VjY2VudHJpY2l0eTIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fYWJzb2x1dGVFY2NlbnRyaWNpdHkoe30sIHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUVjY2VudHJpY2l0eSh7fSwgeyB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDEsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiAxLCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzRWNjZW50cmljaXR5MiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAbsEccentricity3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFic0VjY2VudHJpY2l0eTMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fYWJzb2x1dGVFY2NlbnRyaWNpdHkoe30sIHsKICBzdGFydFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknLAogIGRpcmVjdGlvbjogJ291dGJvdW5kJywKICB3ZWlnaHQ6ICdkaXN0YW5jZScKfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9hYnNvbHV0ZUVjY2VudHJpY2l0eSh7fSwge1xuICBzdGFydFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknLFxuICBkaXJlY3Rpb246ICdvdXRib3VuZCcsXG4gIHdlaWdodDogJ2Rpc3RhbmNlJ1xufSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDAsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiAxLCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQWJzRWNjZW50cmljaXR5MyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleAmountProperties1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFtb3VudFByb3BlcnRpZXMxCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTsKZ3JhcGguX2NvdW50Q29tbW9uUHJvcGVydGllcyh7fSwge30pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jb3VudENvbW1vblByb3BlcnRpZXMoe30sIHt9KTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiZnJlbmNoQ2l0eS9MeW9uXCIgOiAyIFxuICB9LCBcbiAgeyBcbiAgICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgOiAyIFxuICB9LCBcbiAgeyBcbiAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQW1vdW50UHJvcGVydGllczEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleAmountProperties2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUFtb3VudFByb3BlcnRpZXMyCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTsKZ3JhcGguX2NvdW50Q29tbW9uUHJvcGVydGllcyh7fSwge30sIHsKICB2ZXJ0ZXgxQ29sbGVjdGlvblJlc3RyaWN0aW9uOiAnZ2VybWFuQ2l0eScsCiAgdmVydGV4MkNvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknLAogIGlnbm9yZVByb3BlcnRpZXM6ICdwb3B1bGF0aW9uJwp9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jb3VudENvbW1vblByb3BlcnRpZXMoe30sIHt9LCB7XG4gIHZlcnRleDFDb2xsZWN0aW9uUmVzdHJpY3Rpb246ICdnZXJtYW5DaXR5JyxcbiAgdmVydGV4MkNvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknLFxuICBpZ25vcmVQcm9wZXJ0aWVzOiAncG9wdWxhdGlvbidcbn0pOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgOiAyIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVBbW91bnRQcm9wZXJ0aWVzMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleBetweenness1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUJldHdlZW5uZXNzMQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9iZXR3ZWVubmVzcygpOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9iZXR3ZWVubmVzcygpOyIsIm91dHB1dCI6InsgXG4gIFwiZnJlbmNoQ2l0eS9MeW9uXCIgOiAwLCBcbiAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgOiAwLCBcbiAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIDogMCwgXG4gIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgOiAwLCBcbiAgXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiA6IDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZUJldHdlZW5uZXNzMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleBetweenness2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUJldHdlZW5uZXNzMgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9iZXR3ZWVubmVzcyh7IHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9iZXR3ZWVubmVzcyh7IHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcImZyZW5jaENpdHkvTHlvblwiIDogMCwgXG4gIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMCwgXG4gIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiA6IDAsIFxuICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIDogMCwgXG4gIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgOiAwIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVCZXR3ZWVubmVzczIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleBetweenness3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUJldHdlZW5uZXNzMwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9iZXR3ZWVubmVzcyh7IGRpcmVjdGlvbjogJ291dGJvdW5kJywgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9iZXR3ZWVubmVzcyh7IGRpcmVjdGlvbjogJ291dGJvdW5kJywgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOyIsIm91dHB1dCI6InsgXG4gIFwiZnJlbmNoQ2l0eS9MeW9uXCIgOiAwLCBcbiAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgOiAwLCBcbiAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIDogMCwgXG4gIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgOiAwLCBcbiAgXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiA6IDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZUJldHdlZW5uZXNzMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleCloseness1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNsb3NlbmVzczEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fY2xvc2VuZXNzKCk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jbG9zZW5lc3MoKTsiLCJvdXRwdXQiOiJ7IFxuICBcImZyZW5jaENpdHkvTHlvblwiIDogMSwgXG4gIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMSwgXG4gIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIDogMSwgXG4gIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgOiAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVDbG9zZW5lc3MxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleCloseness2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNsb3NlbmVzczIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fY2xvc2VuZXNzKHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jbG9zZW5lc3MoeyB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDEsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiAxLCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQ2xvc2VuZXNzMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleCloseness3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNsb3NlbmVzczMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fY2xvc2VuZXNzKHsgZGlyZWN0aW9uOiAnb3V0Ym91bmQnLCB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jbG9zZW5lc3MoeyBkaXJlY3Rpb246ICdvdXRib3VuZCcsIHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcImZyZW5jaENpdHkvTHlvblwiIDogMCwgXG4gIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMSwgXG4gIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiA6IDAuMjUsIFxuICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIDogMC41LCBcbiAgXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiA6IDAuMzMzMzMzMzMzMzMzMzMzMyBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQ2xvc2VuZXNzMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleCommonNeighbors1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNvbW1vbk5laWdoYm9yczEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fY29tbW9uTmVpZ2hib3JzKHtpc0NhcGl0YWwgOiB0cnVlfSwge2lzQ2FwaXRhbCA6IHRydWV9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jb21tb25OZWlnaGJvcnMoe2lzQ2FwaXRhbCA6IHRydWV9LCB7aXNDYXBpdGFsIDogdHJ1ZX0pOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJsZWZ0XCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJyaWdodFwiIDogXCJnZXJtYW5DaXR5L0JlcmxpblwiLCBcbiAgICBcIm5laWdoYm9yc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgICBcImZyZW5jaENpdHkvTHlvblwiIFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwibGVmdFwiIDogXCJnZXJtYW5DaXR5L0JlcmxpblwiLCBcbiAgICBcInJpZ2h0XCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJuZWlnaGJvcnNcIiA6IFsgXG4gICAgICBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVDb21tb25OZWlnaGJvcnMxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleCommonNeighbors2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNvbW1vbk5laWdoYm9yczIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fY29tbW9uTmVpZ2hib3JzKAogICdnZXJtYW5DaXR5L0hhbWJ1cmcnLAogIHt9LAogIHtkaXJlY3Rpb24gOiAnb3V0Ym91bmQnLCBtYXhEZXB0aCA6IDJ9LAogIHtkaXJlY3Rpb24gOiAnb3V0Ym91bmQnLCBtYXhEZXB0aCA6IDJ9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jb21tb25OZWlnaGJvcnMoXG4gICdnZXJtYW5DaXR5L0hhbWJ1cmcnLFxuICB7fSxcbiAge2RpcmVjdGlvbiA6ICdvdXRib3VuZCcsIG1heERlcHRoIDogMn0sXG4gIHtkaXJlY3Rpb24gOiAnb3V0Ym91bmQnLCBtYXhEZXB0aCA6IDJ9KTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwibGVmdFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJyaWdodFwiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgIFwibmVpZ2hib3JzXCIgOiBbIFxuICAgICAgXCJmcmVuY2hDaXR5L0x5b25cIiBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImxlZnRcIiA6IFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgIFwicmlnaHRcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJuZWlnaGJvcnNcIiA6IFsgXG4gICAgICBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgIFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJsZWZ0XCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICBcInJpZ2h0XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcIm5laWdoYm9yc1wiIDogWyBcbiAgICAgIFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQ29tbW9uTmVpZ2hib3JzMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleCommonNeighborsAmount1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNvbW1vbk5laWdoYm9yc0Ftb3VudDEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwp2YXIgZXhhbXBsZSA9IHsgaXNDYXBpdGFsOiB0cnVlIH07CnZhciBvcHRpb25zID0geyBpbmNsdWRlRGF0YTogdHJ1ZSB9OwpncmFwaC5fY291bnRDb21tb25OZWlnaGJvcnMoZXhhbXBsZSwgZXhhbXBsZSwgb3B0aW9ucywgb3B0aW9ucyk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbnZhciBleGFtcGxlID0geyBpc0NhcGl0YWw6IHRydWUgfTtcbnZhciBvcHRpb25zID0geyBpbmNsdWRlRGF0YTogdHJ1ZSB9O1xuZ3JhcGguX2NvdW50Q29tbW9uTmVpZ2hib3JzKGV4YW1wbGUsIGV4YW1wbGUsIG9wdGlvbnMsIG9wdGlvbnMpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIDogMyBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMyBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlQ29tbW9uTmVpZ2hib3JzQW1vdW50MSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleCommonNeighborsAmount2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUNvbW1vbk5laWdoYm9yc0Ftb3VudDIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwp2YXIgb3B0aW9ucyA9IHsgZGlyZWN0aW9uOiAnb3V0Ym91bmQnLCBtYXhEZXB0aDogMiwgaW5jbHVkZURhdGE6IHRydWUgfTsKZ3JhcGguX2NvdW50Q29tbW9uTmVpZ2hib3JzKCdnZXJtYW5DaXR5L0hhbWJ1cmcnLCB7fSwgb3B0aW9ucywgb3B0aW9ucyk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbnZhciBvcHRpb25zID0geyBkaXJlY3Rpb246ICdvdXRib3VuZCcsIG1heERlcHRoOiAyLCBpbmNsdWRlRGF0YTogdHJ1ZSB9O1xuZ3JhcGguX2NvdW50Q29tbW9uTmVpZ2hib3JzKCdnZXJtYW5DaXR5L0hhbWJ1cmcnLCB7fSwgb3B0aW9ucywgb3B0aW9ucyk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMSBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIDogMyBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDIgXG4gICAgICB9IFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZUNvbW1vbk5laWdoYm9yc0Ftb3VudDIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleDiameter1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZURpYW1ldGVyMQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9kaWFtZXRlcigpOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9kaWFtZXRlcigpOyIsIm91dHB1dCI6IjEiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlRGlhbWV0ZXIxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleDiameter2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZURpYW1ldGVyMgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9kaWFtZXRlcih7IHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9kaWFtZXRlcih7IHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsiLCJvdXRwdXQiOiIxIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZURpYW1ldGVyMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleDiameter3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZURpYW1ldGVyMwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaCgicm91dGVwbGFubmVyIik7CmdyYXBoLl9kaWFtZXRlcih7IGRpcmVjdGlvbjogJ291dGJvdW5kJywgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9kaWFtZXRlcih7IGRpcmVjdGlvbjogJ291dGJvdW5kJywgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOyIsIm91dHB1dCI6IjEiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlRGlhbWV0ZXIzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleDistanceTo1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZURpc3RhbmNlVG8xCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpnLl9kaXN0YW5jZVRvKHt9LCB7fSwgewogIHdlaWdodDogJ2Rpc3RhbmNlJywKICBlbmRWZXJ0ZXhDb2xsZWN0aW9uUmVzdHJpY3Rpb246ICdmcmVuY2hDaXR5JywKICBzdGFydFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknCn0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwicm91dGVwbGFubmVyXCIpO1xuZy5fZGlzdGFuY2VUbyh7fSwge30sIHtcbiAgd2VpZ2h0OiAnZGlzdGFuY2UnLFxuICBlbmRWZXJ0ZXhDb2xsZWN0aW9uUmVzdHJpY3Rpb246ICdmcmVuY2hDaXR5JyxcbiAgc3RhcnRWZXJ0ZXhDb2xsZWN0aW9uUmVzdHJpY3Rpb246ICdnZXJtYW5DaXR5J1xufSk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICBcInZlcnRleFwiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRWZXJ0ZXhcIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRWZXJ0ZXhcIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICBcInZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydFZlcnRleFwiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydFZlcnRleFwiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRWZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRWZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcInZlcnRleFwiIDogXCJmcmVuY2hDaXR5L0x5b25cIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydFZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcInZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0JlcmxpblwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInN0YXJ0VmVydGV4XCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcInZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydFZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwic3RhcnRWZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydFZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzdGFydFZlcnRleFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZURpc3RhbmNlVG8xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleDistanceTo2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZURpc3RhbmNlVG8yCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpnLl9kaXN0YW5jZVRvKFsKICB7X2lkOiAnZ2VybWFuQ2l0eS9Db2xvZ25lJ30sCiAge19pZDogJ2dlcm1hbkNpdHkvTXVuaWNoJ30KXSwgJ2ZyZW5jaENpdHkvTHlvbicsIHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwicm91dGVwbGFubmVyXCIpO1xuZy5fZGlzdGFuY2VUbyhbXG4gIHtfaWQ6ICdnZXJtYW5DaXR5L0NvbG9nbmUnfSxcbiAge19pZDogJ2dlcm1hbkNpdHkvTXVuaWNoJ31cbl0sICdmcmVuY2hDaXR5L0x5b24nLCB7IHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwic3RhcnRWZXJ0ZXhcIiA6IFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVEaXN0YW5jZVRvMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleEccentricity2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUVjY2VudHJpY2l0eTIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fZWNjZW50cmljaXR5KCk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9lY2NlbnRyaWNpdHkoKTsiLCJvdXRwdXQiOiJ7IFxuICBcImZyZW5jaENpdHkvTHlvblwiIDogMSwgXG4gIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIDogMSwgXG4gIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIDogMSwgXG4gIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgOiAxIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVFY2NlbnRyaWNpdHkyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleEccentricity3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZUVjY2VudHJpY2l0eTMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fZWNjZW50cmljaXR5KHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9lY2NlbnRyaWNpdHkoeyB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJmcmVuY2hDaXR5L0x5b25cIiA6IDEsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiAxLCBcbiAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiA6IDEsIFxuICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogMSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlRWNjZW50cmljaXR5MyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleNeighbors1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZU5laWdoYm9yczEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fbmVpZ2hib3JzKHtpc0NhcGl0YWwgOiB0cnVlfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9uZWlnaGJvcnMoe2lzQ2FwaXRhbCA6IHRydWV9KTsiLCJvdXRwdXQiOiJbIFxuICBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgXCJnZXJtYW5DaXR5L0JlcmxpblwiLCBcbiAgXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICBcImZyZW5jaENpdHkvUGFyaXNcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlTmVpZ2hib3JzMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphModuleNeighbors2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZU5laWdoYm9yczIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fbmVpZ2hib3JzKCdnZXJtYW5DaXR5L0hhbWJ1cmcnLCB7ZGlyZWN0aW9uIDogJ291dGJvdW5kJywgbWF4RGVwdGggOiAyfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9uZWlnaGJvcnMoJ2dlcm1hbkNpdHkvSGFtYnVyZycsIHtkaXJlY3Rpb24gOiAnb3V0Ym91bmQnLCBtYXhEZXB0aCA6IDJ9KTsiLCJvdXRwdXQiOiJbIFxuICBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICBcImZyZW5jaENpdHkvTHlvblwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVOZWlnaGJvcnMyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModulePaths1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVBhdGhzMQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKZy5fcGF0aHMoKTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwic29jaWFsXCIpO1xuZy5fcGF0aHMoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwic291cmNlXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tLVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgIH0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tLVwiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgICB9IFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwic291cmNlXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJjaGFybHlcIiwgXG4gICAgICBcIl9pZFwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tQVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJDaGFybHlcIiBcbiAgICB9LCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1NzY2XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTc2NlwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLURcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJmcmllbmRcIiwgXG4gICAgICAgIFwidmVydGV4XCIgOiBcImFsaWNlXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwidmVydGljZVwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLS1cIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiY2hhcmx5XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS1BXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQ2hhcmx5XCIgXG4gICAgICB9IFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwic291cmNlXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tQlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgIH0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU3NjZcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzc1NzY2XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tRFwiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcImZyaWVuZFwiLCBcbiAgICAgICAgXCJ2ZXJ0ZXhcIiA6IFwiYWxpY2VcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1NzY4XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTc2OFwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEstLS1cIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJjaGFybHlcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tLVwiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJjaGFybHlcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUFcIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJDaGFybHlcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImRpYW5hXCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tQlwiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkRpYW5hXCIgXG4gICAgICB9IFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwic291cmNlXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJib2JcIiwgXG4gICAgICBcIl9pZFwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tX1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJCb2JcIiBcbiAgICB9LCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1NzY0XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTc2NFwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUNcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJhbGljZVwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZlcnRpY2VcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS0tXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tX1wiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tLVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgIH0sIFxuICAgIFwiZGVzdGluYXRpb25cIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUJcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICB9LCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1NzY0XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTc2NFwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUNcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJhbGljZVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU3NzBcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzc1NzcwXCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoSy0tX1wiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcImZyaWVuZFwiLCBcbiAgICAgICAgXCJ2ZXJ0ZXhcIiA6IFwiYm9iXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwidmVydGljZVwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLS1cIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiYm9iXCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS1fXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQm9iXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUJcIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tQlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgIH0sIFxuICAgIFwiZGVzdGluYXRpb25cIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUJcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICB9LCBcbiAgICBcImVkZ2VzXCIgOiBbIF0sIFxuICAgIFwidmVydGljZVwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUJcIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJib2JcIiwgXG4gICAgICBcIl9pZFwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tX1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJCb2JcIiBcbiAgICB9LCBcbiAgICBcImRlc3RpbmF0aW9uXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgIFwiX2lkXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS1fXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgIH0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tX1wiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJib2JcIiwgXG4gICAgICBcIl9pZFwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tX1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJCb2JcIiBcbiAgICB9LCBcbiAgICBcImRlc3RpbmF0aW9uXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImRpYW5hXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS1CXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkRpYW5hXCIgXG4gICAgfSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTc3MFwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzU3NzBcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhLLS1fXCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwiZnJpZW5kXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJib2JcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tX1wiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS1CXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzb3VyY2VcIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiY2hhcmx5XCIsIFxuICAgICAgXCJfaWRcIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUFcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQ2hhcmx5XCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJjaGFybHlcIiwgXG4gICAgICBcIl9pZFwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tQVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJDaGFybHlcIiBcbiAgICB9LCBcbiAgICBcImVkZ2VzXCIgOiBbIF0sIFxuICAgIFwidmVydGljZVwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJjaGFybHlcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUFcIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJDaGFybHlcIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzb3VyY2VcIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiY2hhcmx5XCIsIFxuICAgICAgXCJfaWRcIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUFcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQ2hhcmx5XCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoRy0tQlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgIH0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU3NjhcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzc1NzY4XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpoSy0tLVwiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIm1hcnJpZWRcIiwgXG4gICAgICAgIFwidmVydGV4XCIgOiBcImNoYXJseVwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZlcnRpY2VcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiY2hhcmx5XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmhHLS1BXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQ2hhcmx5XCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaaEctLUJcIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVQYXRoczEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModulePaths2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVBhdGhzMgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBleGFtcGxlcyA9IHJlcXVpcmUoIkBhcmFuZ29kYi9ncmFwaC1leGFtcGxlcy9leGFtcGxlLWdyYXBoIik7CnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKZy5fcGF0aHMoeyBkaXJlY3Rpb246ICdpbmJvdW5kJywgbWluTGVuZ3RoOiAxLCBtYXhMZW5ndGg6IDIgfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwic29jaWFsXCIpO1xuZy5fcGF0aHMoeyBkaXJlY3Rpb246ICdpbmJvdW5kJywgbWluTGVuZ3RoOiAxLCBtYXhMZW5ndGg6IDIgfSk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tQlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgIH0sIFxuICAgIFwiZGVzdGluYXRpb25cIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiYm9iXCIsIFxuICAgICAgXCJfaWRcIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLV9cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQm9iXCIgXG4gICAgfSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTgzMVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzU4MzFcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpHLS1BXCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwiZnJpZW5kXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJib2JcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImRpYW5hXCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tQlwiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkRpYW5hXCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJib2JcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLV9cIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJCb2JcIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzb3VyY2VcIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLUJcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICB9LCBcbiAgICBcImRlc3RpbmF0aW9uXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgfSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTgzMVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzU4MzFcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpHLS1BXCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwiZnJpZW5kXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJib2JcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1ODI1XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTgyNVwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLUNcIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJhbGljZVwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZlcnRpY2VcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS1CXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tX1wiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS0tXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzb3VyY2VcIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICBcIl9pZFwiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLUJcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICB9LCBcbiAgICBcImRlc3RpbmF0aW9uXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImNoYXJseVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS1BXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkNoYXJseVwiIFxuICAgIH0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU4MjlcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzc1ODI5XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqRy0tX1wiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcIm1hcnJpZWRcIiwgXG4gICAgICAgIFwidmVydGV4XCIgOiBcImNoYXJseVwiIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcInZlcnRpY2VcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS1CXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImNoYXJseVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tQVwiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkNoYXJseVwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9kaWFuYVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tQlwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgIH0sIFxuICAgIFwiZGVzdGluYXRpb25cIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgICBcIl9pZFwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLS1cIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICB9LCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1ODI5XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTgyOVwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakctLV9cIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgICAgICBcInZlcnRleFwiIDogXCJjaGFybHlcIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1ODI3XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NTgyN1wiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcIm1hbGUvY2hhcmx5XCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakctLS1cIiwgXG4gICAgICAgIFwidHlwZVwiIDogXCJmcmllbmRcIiwgXG4gICAgICAgIFwidmVydGV4XCIgOiBcImFsaWNlXCIgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwidmVydGljZVwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJkaWFuYVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLUJcIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJEaWFuYVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiY2hhcmx5XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS1BXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQ2hhcmx5XCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLS1cIiwgXG4gICAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcInNvdXJjZVwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJib2JcIiwgXG4gICAgICBcIl9pZFwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tX1wiLCBcbiAgICAgIFwibmFtZVwiIDogXCJCb2JcIiBcbiAgICB9LCBcbiAgICBcImRlc3RpbmF0aW9uXCIgOiB7IFxuICAgICAgXCJfa2V5XCIgOiBcImFsaWNlXCIsIFxuICAgICAgXCJfaWRcIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS0tXCIsIFxuICAgICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gICAgfSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTgyNVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzU4MjVcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZmVtYWxlL2FsaWNlXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJtYWxlL2JvYlwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS1DXCIsIFxuICAgICAgICBcInR5cGVcIiA6IFwibWFycmllZFwiLCBcbiAgICAgICAgXCJ2ZXJ0ZXhcIiA6IFwiYWxpY2VcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImJvYlwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tX1wiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkJvYlwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS0tXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJzb3VyY2VcIiA6IHsgXG4gICAgICBcIl9rZXlcIiA6IFwiY2hhcmx5XCIsIFxuICAgICAgXCJfaWRcIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaakMtLUFcIiwgXG4gICAgICBcIm5hbWVcIiA6IFwiQ2hhcmx5XCIgXG4gICAgfSwgXG4gICAgXCJkZXN0aW5hdGlvblwiIDogeyBcbiAgICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tLVwiLCBcbiAgICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICAgIH0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU4MjdcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcInJlbGF0aW9uLzc1ODI3XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqRy0tLVwiLCBcbiAgICAgICAgXCJ0eXBlXCIgOiBcImZyaWVuZFwiLCBcbiAgICAgICAgXCJ2ZXJ0ZXhcIiA6IFwiYWxpY2VcIiBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJ2ZXJ0aWNlXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcImNoYXJseVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpqQy0tQVwiLCBcbiAgICAgICAgXCJuYW1lXCIgOiBcIkNoYXJseVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmpDLS0tXCIsIFxuICAgICAgICBcIm5hbWVcIiA6IFwiQWxpY2VcIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlUGF0aHMyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleProperties1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVByb3BlcnRpZXMxCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTsKZ3JhcGguX2NvbW1vblByb3BlcnRpZXMoe30sIHt9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jb21tb25Qcm9wZXJ0aWVzKHt9LCB7fSk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImZyZW5jaENpdHkvTHlvblwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9pZFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgICAgIFwiaXNDYXBpdGFsXCIgOiBmYWxzZSBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfaWRcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICAgIFwiaXNDYXBpdGFsXCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfaWRcIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfaWRcIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgICBcImlzQ2FwaXRhbFwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IGZhbHNlLCBcbiAgICAgICAgXCJwb3B1bGF0aW9uXCIgOiAxMDAwMDAwIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2lkXCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9pZFwiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgICAgIFwiaXNDYXBpdGFsXCIgOiBmYWxzZSwgXG4gICAgICAgIFwicG9wdWxhdGlvblwiIDogMTAwMDAwMCBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlUHJvcGVydGllczEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleProperties2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVByb3BlcnRpZXMyCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTsKZ3JhcGguX2NvbW1vblByb3BlcnRpZXMoe30sIHt9LCB7IGlnbm9yZVByb3BlcnRpZXM6ICdwb3B1bGF0aW9uJyB9KTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgicm91dGVwbGFubmVyIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9jb21tb25Qcm9wZXJ0aWVzKHt9LCB7fSwgeyBpZ25vcmVQcm9wZXJ0aWVzOiAncG9wdWxhdGlvbicgfSk7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcImZyZW5jaENpdHkvTHlvblwiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9pZFwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgICAgIFwiaXNDYXBpdGFsXCIgOiBmYWxzZSBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfaWRcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICAgIFwiaXNDYXBpdGFsXCIgOiB0cnVlIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImdlcm1hbkNpdHkvQmVybGluXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfaWRcIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IHRydWUgXG4gICAgICB9IFxuICAgIF0gXG4gIH0sIFxuICB7IFxuICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfaWRcIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgICBcImlzQ2FwaXRhbFwiIDogZmFsc2UgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IGZhbHNlIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2lkXCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgICAgXCJpc0NhcGl0YWxcIiA6IGZhbHNlIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIl9pZFwiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgICAgIFwiaXNDYXBpdGFsXCIgOiBmYWxzZSBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoTW9kdWxlUHJvcGVydGllczIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleRadius1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVJhZGl1czEKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fcmFkaXVzKCk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9yYWRpdXMoKTsiLCJvdXRwdXQiOiIxIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZVJhZGl1czEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleRadius2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVJhZGl1czIKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fcmFkaXVzKHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJyb3V0ZXBsYW5uZXIiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9yYWRpdXMoeyB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Iiwib3V0cHV0IjoiMSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhNb2R1bGVSYWRpdXMyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleRadius3_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVJhZGl1czMKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpncmFwaC5fcmFkaXVzKHsgZGlyZWN0aW9uOiAnb3V0Ym91bmQnLCB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInJvdXRlcGxhbm5lclwiKTtcbmdyYXBoLl9yYWRpdXMoeyBkaXJlY3Rpb246ICdvdXRib3VuZCcsIHdlaWdodDogJ2Rpc3RhbmNlJyB9KTsiLCJvdXRwdXQiOiIxIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZVJhZGl1czMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "generalGraphModuleShortestPaths1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVNob3J0ZXN0UGF0aHMxCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpnLl9zaG9ydGVzdFBhdGgoe30sIHt9LCB7CiAgd2VpZ2h0OiAnZGlzdGFuY2UnLAogIGVuZFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2ZyZW5jaENpdHknLAogIHN0YXJ0VmVydGV4Q29sbGVjdGlvblJlc3RyaWN0aW9uOiAnZ2VybWFuQ2l0eScKfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwicm91dGVwbGFubmVyXCIpO1xuZy5fc2hvcnRlc3RQYXRoKHt9LCB7fSwge1xuICB3ZWlnaHQ6ICdkaXN0YW5jZScsXG4gIGVuZFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2ZyZW5jaENpdHknLFxuICBzdGFydFZlcnRleENvbGxlY3Rpb25SZXN0cmljdGlvbjogJ2dlcm1hbkNpdHknXG59KTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgIFwiZnJlbmNoQ2l0eS9QYXJpc1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MDdcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImZyZW5jaEhpZ2h3YXkvNzU5MDdcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2Faa3ktLS1cIiwgXG4gICAgICAgIFwiZGlzdGFuY2VcIiA6IDU1MCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MDlcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImludGVybmF0aW9uYWxIaWdod2F5Lzc1OTA5XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L0x5b25cIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpreS0tX1wiLCBcbiAgICAgICAgXCJkaXN0YW5jZVwiIDogMTEwMCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1OTE3XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJpbnRlcm5hdGlvbmFsSGlnaHdheS83NTkxN1wiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmsyLS1BXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA3MDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkxNVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzU5MTVcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L0x5b25cIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVprMi0tX1wiLCBcbiAgICAgICAgXCJkaXN0YW5jZVwiIDogMTMwMCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgIFwiZnJlbmNoQ2l0eS9MeW9uXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkwN1wiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZnJlbmNoSGlnaHdheS83NTkwN1wiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L0x5b25cIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpreS0tLVwiLCBcbiAgICAgICAgXCJkaXN0YW5jZVwiIDogNTUwIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MTFcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImludGVybmF0aW9uYWxIaWdod2F5Lzc1OTExXCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2Faa3ktLUFcIiwgXG4gICAgICAgIFwiZGlzdGFuY2VcIiA6IDEyMDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MTlcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImludGVybmF0aW9uYWxIaWdod2F5Lzc1OTE5XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmsyLS1CXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA1NTAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MTNcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImludGVybmF0aW9uYWxIaWdod2F5Lzc1OTEzXCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmsyLS0tXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA5MDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgICAgXCJmcmVuY2hDaXR5L0x5b25cIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1OTA5XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJpbnRlcm5hdGlvbmFsSGlnaHdheS83NTkwOVwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0JlcmxpblwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2Faa3ktLV9cIiwgXG4gICAgICAgIFwiZGlzdGFuY2VcIiA6IDExMDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkxMVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzU5MTFcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVpreS0tQVwiLCBcbiAgICAgICAgXCJkaXN0YW5jZVwiIDogMTIwMCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICBcImdlcm1hbkNpdHkvQ29sb2duZVwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MDFcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkhpZ2h3YXkvNzU5MDFcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmt1LS0tXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA4NTAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc1OTAzXCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJnZXJtYW5IaWdod2F5Lzc1OTAzXCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVprdS0tX1wiLCBcbiAgICAgICAgXCJkaXN0YW5jZVwiIDogNDAwIFxuICAgICAgfSBcbiAgICBdLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcInZlcnRpY2VzXCIgOiBbIFxuICAgICAgXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgICBcImZyZW5jaENpdHkvTHlvblwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MTdcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImludGVybmF0aW9uYWxIaWdod2F5Lzc1OTE3XCIsIFxuICAgICAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaazItLUFcIiwgXG4gICAgICAgIFwiZGlzdGFuY2VcIiA6IDcwMCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkxOVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzU5MTlcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaazItLUJcIiwgXG4gICAgICAgIFwiZGlzdGFuY2VcIiA6IDU1MCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MDFcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkhpZ2h3YXkvNzU5MDFcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmt1LS0tXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA4NTAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkwNVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZ2VybWFuSGlnaHdheS83NTkwNVwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmt1LS1BXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA1MDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICAgIFwiZnJlbmNoQ2l0eS9MeW9uXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkxNVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzU5MTVcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L0x5b25cIiwgXG4gICAgICAgIFwiX3JldlwiIDogXCJfanQzYVprMi0tX1wiLCBcbiAgICAgICAgXCJkaXN0YW5jZVwiIDogMTMwMCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgICAgXCJmcmVuY2hDaXR5L1BhcmlzXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkxM1wiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzU5MTNcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgICAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgICAgICBcIl9yZXZcIiA6IFwiX2p0M2FaazItLS1cIiwgXG4gICAgICAgIFwiZGlzdGFuY2VcIiA6IDkwMCBcbiAgICAgIH0gXG4gICAgXSwgXG4gICAgXCJkaXN0YW5jZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9IYW1idXJnXCIsIFxuICAgICAgXCJnZXJtYW5DaXR5L0JlcmxpblwiIFxuICAgIF0sIFxuICAgIFwiZWRnZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIl9rZXlcIiA6IFwiNzU5MDNcIiwgXG4gICAgICAgIFwiX2lkXCIgOiBcImdlcm1hbkhpZ2h3YXkvNzU5MDNcIiwgXG4gICAgICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmt1LS1fXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA0MDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidmVydGljZXNcIiA6IFsgXG4gICAgICBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIgXG4gICAgXSwgXG4gICAgXCJlZGdlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwiX2tleVwiIDogXCI3NTkwNVwiLCBcbiAgICAgICAgXCJfaWRcIiA6IFwiZ2VybWFuSGlnaHdheS83NTkwNVwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWmt1LS1BXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA1MDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZVNob3J0ZXN0UGF0aHMxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphModuleShortestPaths2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaE1vZHVsZVNob3J0ZXN0UGF0aHMyCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpnLl9zaG9ydGVzdFBhdGgoWwogIHtfaWQ6ICdnZXJtYW5DaXR5L0NvbG9nbmUnfSwKICB7X2lkOiAnZ2VybWFuQ2l0eS9NdW5pY2gnfQpdLCAnZnJlbmNoQ2l0eS9MeW9uJywgeyB3ZWlnaHQ6ICdkaXN0YW5jZScgfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwicm91dGVwbGFubmVyXCIpO1xuZy5fc2hvcnRlc3RQYXRoKFtcbiAge19pZDogJ2dlcm1hbkNpdHkvQ29sb2duZSd9LFxuICB7X2lkOiAnZ2VybWFuQ2l0eS9NdW5pY2gnfVxuXSwgJ2ZyZW5jaENpdHkvTHlvbicsIHsgd2VpZ2h0OiAnZGlzdGFuY2UnIH0pOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ2ZXJ0aWNlc1wiIDogWyBcbiAgICAgIFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgICAgXCJmcmVuY2hDaXR5L0x5b25cIiBcbiAgICBdLCBcbiAgICBcImVkZ2VzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJfa2V5XCIgOiBcIjc2MDE1XCIsIFxuICAgICAgICBcIl9pZFwiIDogXCJpbnRlcm5hdGlvbmFsSGlnaHdheS83NjAxNVwiLCBcbiAgICAgICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgICAgIFwiX3RvXCIgOiBcImZyZW5jaENpdHkvTHlvblwiLCBcbiAgICAgICAgXCJfcmV2XCIgOiBcIl9qdDNhWm1pLS1BXCIsIFxuICAgICAgICBcImRpc3RhbmNlXCIgOiA3MDAgXG4gICAgICB9IFxuICAgIF0sIFxuICAgIFwiZGlzdGFuY2VcIiA6IDEgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaE1vZHVsZVNob3J0ZXN0UGF0aHMyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphRelationDefinitionSave_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaFJlbGF0aW9uRGVmaW5pdGlvblNhdmUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiaGFzX2JvdWdodCIsIFsiQ3VzdG9tZXIiLCAiQ29tcGFueSJdLCBbIkdyb2NlcmllcyIsICJFbGVjdHJvbmljcyJdKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiaGFzX2JvdWdodFwiLCBbXCJDdXN0b21lclwiLCBcIkNvbXBhbnlcIl0sIFtcIkdyb2Nlcmllc1wiLCBcIkVsZWN0cm9uaWNzXCJdKTsiLCJvdXRwdXQiOiJ7IFxuICBcImNvbGxlY3Rpb25cIiA6IFwiaGFzX2JvdWdodFwiLCBcbiAgXCJmcm9tXCIgOiBbIFxuICAgIFwiQ3VzdG9tZXJcIiwgXG4gICAgXCJDb21wYW55XCIgXG4gIF0sIFxuICBcInRvXCIgOiBbIFxuICAgIFwiR3JvY2VyaWVzXCIsIFxuICAgIFwiRWxlY3Ryb25pY3NcIiBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbEdyYXBoUmVsYXRpb25EZWZpbml0aW9uU2F2ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphRelationDefinitionSingle_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaFJlbGF0aW9uRGVmaW5pdGlvblNpbmdsZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpOwpncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJoYXNfYm91Z2h0IiwgIkN1c3RvbWVyIiwgIlByb2R1Y3QiKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG5ncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiaGFzX2JvdWdodFwiLCBcIkN1c3RvbWVyXCIsIFwiUHJvZHVjdFwiKTsiLCJvdXRwdXQiOiJ7IFxuICBcImNvbGxlY3Rpb25cIiA6IFwiaGFzX2JvdWdodFwiLCBcbiAgXCJmcm9tXCIgOiBbIFxuICAgIFwiQ3VzdG9tZXJcIiBcbiAgXSwgXG4gIFwidG9cIiA6IFsgXG4gICAgXCJQcm9kdWN0XCIgXG4gIF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaFJlbGF0aW9uRGVmaW5pdGlvblNpbmdsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphVertexCollectionRemove_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaFZlcnRleENvbGxlY3Rpb25SZW1vdmUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgZG9jID0gZ3JhcGgubWFsZS5zYXZlKHtuYW1lOiAiS2VybWl0IiwgX2tleTogImtlcm1pdCJ9KTsKZGIuX2V4aXN0cygibWFsZS9rZXJtaXQiKTsKdmFyIHN1Y2Nlc3MgPSBncmFwaC5tYWxlLnJlbW92ZSgibWFsZS9rZXJtaXQiKTsKZGIuX2V4aXN0cygibWFsZS9rZXJtaXQiKTsKfmV4YW1wbGVzLmRyb3BHcmFwaCgic29jaWFsIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBkb2MgPSBncmFwaC5tYWxlLnNhdmUoe25hbWU6IFwiS2VybWl0XCIsIF9rZXk6IFwia2VybWl0XCJ9KTtcbmRiLl9leGlzdHMoXCJtYWxlL2tlcm1pdFwiKTtcbnZhciBzdWNjZXNzID0gZ3JhcGgubWFsZS5yZW1vdmUoXCJtYWxlL2tlcm1pdFwiKTtcbmRiLl9leGlzdHMoXCJtYWxlL2tlcm1pdFwiKTsiLCJvdXRwdXQiOiJ0cnVlXG5mYWxzZSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhWZXJ0ZXhDb2xsZWN0aW9uUmVtb3ZlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphVertexCollectionReplace_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaFZlcnRleENvbGxlY3Rpb25SZXBsYWNlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKdmFyIGRvYyA9IGdyYXBoLm1hbGUuc2F2ZSh7bmV5bTogIkpvbiIsIF9rZXk6ICJqb2huIn0pOwpncmFwaC5tYWxlLnJlcGxhY2UoIm1hbGUvam9obiIsIHtuYW1lOiAiSm9obiJ9LCB7IHJldHVybk9sZDogdHJ1ZSwgcmV0dXJuTmV3OiB0cnVlIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBkb2MgPSBncmFwaC5tYWxlLnNhdmUoe25leW06IFwiSm9uXCIsIF9rZXk6IFwiam9oblwifSk7XG5ncmFwaC5tYWxlLnJlcGxhY2UoXCJtYWxlL2pvaG5cIiwge25hbWU6IFwiSm9oblwifSwgeyByZXR1cm5PbGQ6IHRydWUsIHJldHVybk5ldzogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJtYWxlL2pvaG5cIiwgXG4gIFwiX2tleVwiIDogXCJqb2huXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FhNXUtLUJcIiwgXG4gIFwiX29sZFJldlwiIDogXCJfanQzYWE1dS0tQVwiLCBcbiAgXCJvbGRcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcImpvaG5cIiwgXG4gICAgXCJfaWRcIiA6IFwibWFsZS9qb2huXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWE1dS0tQVwiLCBcbiAgICBcIm5leW1cIiA6IFwiSm9uXCIgXG4gIH0sIFxuICBcIm5ld1wiIDogeyBcbiAgICBcIl9rZXlcIiA6IFwiam9oblwiLCBcbiAgICBcIl9pZFwiIDogXCJtYWxlL2pvaG5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhYTV1LS1CXCIsIFxuICAgIFwibmFtZVwiIDogXCJKb2huXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaFZlcnRleENvbGxlY3Rpb25SZXBsYWNlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "generalGraphVertexCollectionSave_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaFZlcnRleENvbGxlY3Rpb25TYXZlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKZ3JhcGgubWFsZS5zYXZlKHtuYW1lOiAiRmxveWQiLCBfa2V5OiAiZmxveWQifSwgeyByZXR1cm5OZXc6IHRydWUgfSk7Cn5leGFtcGxlcy5kcm9wR3JhcGgoInNvY2lhbCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbmdyYXBoLm1hbGUuc2F2ZSh7bmFtZTogXCJGbG95ZFwiLCBfa2V5OiBcImZsb3lkXCJ9LCB7IHJldHVybk5ldzogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJtYWxlL2Zsb3lkXCIsIFxuICBcIl9rZXlcIiA6IFwiZmxveWRcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWE0Ty0tQlwiLCBcbiAgXCJuZXdcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcImZsb3lkXCIsIFxuICAgIFwiX2lkXCIgOiBcIm1hbGUvZmxveWRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhYTRPLS1CXCIsIFxuICAgIFwibmFtZVwiIDogXCJGbG95ZFwiIFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsR3JhcGhWZXJ0ZXhDb2xsZWN0aW9uU2F2ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "generalGraphVertexCollectionUpdate_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxHcmFwaFZlcnRleENvbGxlY3Rpb25VcGRhdGUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBleGFtcGxlcy5sb2FkR3JhcGgoInNvY2lhbCIpOwp2YXIgZG9jID0gZ3JhcGguZmVtYWxlLnNhdmUoe25hbWU6ICJMeW5kYSIsIF9rZXk6ICJsaW5kYSJ9KTsKZ3JhcGguZmVtYWxlLnVwZGF0ZSgiZmVtYWxlL2xpbmRhIiwge25hbWU6ICJMaW5kYSIsIF9rZXk6ICJsaW5kYSJ9LCB7IHJldHVybk9sZDogdHJ1ZSwgcmV0dXJuTmV3OiB0cnVlIH0pOwp+ZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbnZhciBkb2MgPSBncmFwaC5mZW1hbGUuc2F2ZSh7bmFtZTogXCJMeW5kYVwiLCBfa2V5OiBcImxpbmRhXCJ9KTtcbmdyYXBoLmZlbWFsZS51cGRhdGUoXCJmZW1hbGUvbGluZGFcIiwge25hbWU6IFwiTGluZGFcIiwgX2tleTogXCJsaW5kYVwifSwgeyByZXR1cm5PbGQ6IHRydWUsIHJldHVybk5ldzogdHJ1ZSB9KTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJmZW1hbGUvbGluZGFcIiwgXG4gIFwiX2tleVwiIDogXCJsaW5kYVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhYTdpLS0tXCIsIFxuICBcIl9vbGRSZXZcIiA6IFwiX2p0M2FhN2UtLUNcIiwgXG4gIFwib2xkXCIgOiB7IFxuICAgIFwiX2tleVwiIDogXCJsaW5kYVwiLCBcbiAgICBcIl9pZFwiIDogXCJmZW1hbGUvbGluZGFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhYTdlLS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJMeW5kYVwiIFxuICB9LCBcbiAgXCJuZXdcIiA6IHsgXG4gICAgXCJfa2V5XCIgOiBcImxpbmRhXCIsIFxuICAgIFwiX2lkXCIgOiBcImZlbWFsZS9saW5kYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FhN2ktLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkxpbmRhXCIgXG4gIH0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxHcmFwaFZlcnRleENvbGxlY3Rpb25VcGRhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "general_graph__addVertexCollection_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX2FkZFZlcnRleENvbGxlY3Rpb24KZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKdmFyIGVkMSA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15RUMxIiwgWyJteVZDMSJdLCBbIm15VkMyIl0pOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtlZDFdKTsKZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oIm15VkMzIiwgdHJ1ZSk7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgibXlHcmFwaCIpOwp+ZGIuX2Ryb3AoIm15VkMzIik7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZWQxID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcIm15RUMxXCIsIFtcIm15VkMxXCJdLCBbXCJteVZDMlwiXSk7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW2VkMV0pO1xuZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oXCJteVZDM1wiLCB0cnVlKTtcbmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaChcIm15R3JhcGhcIik7Iiwib3V0cHV0Ijoie1tHZW5lcmFsR3JhcGhdIFxuICBcIm15RUMxXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTI0OCwgXCJteUVDMVwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzFcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MjQ1LCBcIm15VkMxXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzJcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MjQyLCBcIm15VkMyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MjYxLCBcIm15VkMzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbF9ncmFwaF9fYWRkVmVydGV4Q29sbGVjdGlvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "general_graph__deleteEdgeDefinitionNoDrop_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX2RlbGV0ZUVkZ2VEZWZpbml0aW9uTm9Ecm9wCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIikKdmFyIGVkMSA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15RUMxIiwgWyJteVZDMSJdLCBbIm15VkMyIl0pOwp2YXIgZWQyID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigibXlFQzIiLCBbIm15VkMxIl0sIFsibXlWQzMiXSk7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW2VkMSwgZWQyXSk7CmdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbigibXlFQzEiKTsKZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKCJteUdyYXBoIik7CmRiLl9jb2xsZWN0aW9uKCJteUVDMSIpOwp+ZGIuX2Ryb3AoIm15RUMxIik7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIilcbnZhciBlZDEgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzFcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMyXCJdKTtcbnZhciBlZDIgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzJcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMzXCJdKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbZWQxLCBlZDJdKTtcbmdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcIm15RUMxXCIpO1xuZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKFwibXlHcmFwaFwiKTtcbmRiLl9jb2xsZWN0aW9uKFwibXlFQzFcIik7Iiwib3V0cHV0Ijoie1tHZW5lcmFsR3JhcGhdIFxuICBcIm15RUMyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTEyNSwgXCJteUVDMlwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzFcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MTIyLCBcIm15VkMxXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MTE2LCBcIm15VkMzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzJcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MTE5LCBcIm15VkMyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn1cblxuW0FyYW5nb0NvbGxlY3Rpb24gNzkxMzAsIFwibXlFQzFcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbF9ncmFwaF9fZGVsZXRlRWRnZURlZmluaXRpb25Ob0Ryb3AiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "general_graph__deleteEdgeDefinitionWithDrop_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX2RlbGV0ZUVkZ2VEZWZpbml0aW9uV2l0aERyb3AKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKQp2YXIgZWQxID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigibXlFQzEiLCBbIm15VkMxIl0sIFsibXlWQzIiXSk7CnZhciBlZDIgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJteUVDMiIsIFsibXlWQzEiXSwgWyJteVZDMyJdKTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBbZWQxLCBlZDJdKTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJteUVDMSIsIHRydWUpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKZGIuX2NvbGxlY3Rpb24oIm15RUMxIik7Cn5kYi5fZHJvcCgibXlFQzEiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIilcbnZhciBlZDEgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzFcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMyXCJdKTtcbnZhciBlZDIgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzJcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMzXCJdKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbZWQxLCBlZDJdKTtcbmdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcIm15RUMxXCIsIHRydWUpO1xuZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKFwibXlHcmFwaFwiKTtcbmRiLl9jb2xsZWN0aW9uKFwibXlFQzFcIik7Iiwib3V0cHV0Ijoie1tHZW5lcmFsR3JhcGhdIFxuICBcIm15RUMyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTE4NywgXCJteUVDMlwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzFcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MTg0LCBcIm15VkMxXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MTc4LCBcIm15VkMzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzJcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MTgxLCBcIm15VkMyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn1cblxubnVsbCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsX2dyYXBoX19kZWxldGVFZGdlRGVmaW5pdGlvbldpdGhEcm9wIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "general_graph__editEdgeDefinition_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX2VkaXRFZGdlRGVmaW5pdGlvbgpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpCnZhciBvcmlnaW5hbCA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15RUMxIiwgWyJteVZDMSJdLCBbIm15VkMyIl0pOwp2YXIgbW9kaWZpZWQgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJteUVDMSIsIFsibXlWQzIiXSwgWyJteVZDMyJdKTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBbb3JpZ2luYWxdKTsKZ3JhcGguX2VkaXRFZGdlRGVmaW5pdGlvbnMobW9kaWZpZWQpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIilcbnZhciBvcmlnaW5hbCA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJteUVDMVwiLCBbXCJteVZDMVwiXSwgW1wibXlWQzJcIl0pO1xudmFyIG1vZGlmaWVkID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcIm15RUMxXCIsIFtcIm15VkMyXCJdLCBbXCJteVZDM1wiXSk7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW29yaWdpbmFsXSk7XG5ncmFwaC5fZWRpdEVkZ2VEZWZpbml0aW9ucyhtb2RpZmllZCk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbR2VuZXJhbEdyYXBoXSBcbiAgXCJteUVDMVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzkwNjEsIFwibXlFQzFcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm15VkMyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTA1NSwgXCJteVZDMlwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm15VkMzXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTA3NCwgXCJteVZDM1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm15VkMxXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTA1OCwgXCJteVZDMVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxfZ3JhcGhfX2VkaXRFZGdlRGVmaW5pdGlvbiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "general_graph__extendEdgeDefinitions_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX2V4dGVuZEVkZ2VEZWZpbml0aW9ucwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaCIpCnZhciBlZDEgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJteUVDMSIsIFsibXlWQzEiXSwgWyJteVZDMiJdKTsKdmFyIGVkMiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15RUMyIiwgWyJteVZDMSJdLCBbIm15VkMzIl0pOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtlZDFdKTsKZ3JhcGguX2V4dGVuZEVkZ2VEZWZpbml0aW9ucyhlZDIpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIilcbnZhciBlZDEgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzFcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMyXCJdKTtcbnZhciBlZDIgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzJcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMzXCJdKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbZWQxXSk7XG5ncmFwaC5fZXh0ZW5kRWRnZURlZmluaXRpb25zKGVkMik7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbR2VuZXJhbEdyYXBoXSBcbiAgXCJteUVDMVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg5OTIsIFwibXlFQzFcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm15VkMxXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODk4OSwgXCJteVZDMVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm15VkMyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODk4NiwgXCJteVZDMlwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm15RUMyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3OTAxMCwgXCJteUVDMlwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibXlWQzNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc5MDA3LCBcIm15VkMzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbF9ncmFwaF9fZXh0ZW5kRWRnZURlZmluaXRpb25zIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "general_graph__orphanCollections_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX29ycGhhbkNvbGxlY3Rpb25zCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIikKdmFyIGVkMSA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15RUMxIiwgWyJteVZDMSJdLCBbIm15VkMyIl0pOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtlZDFdKTsKZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oIm15VkMzIiwgdHJ1ZSk7CmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIilcbnZhciBlZDEgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzFcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMyXCJdKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbZWQxXSk7XG5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbihcIm15VkMzXCIsIHRydWUpO1xuZ3JhcGguX29ycGhhbkNvbGxlY3Rpb25zKCk7Iiwib3V0cHV0IjoiWyBcbiAgXCJteVZDM1wiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJnZW5lcmFsX2dyYXBoX19vcnBoYW5Db2xsZWN0aW9ucyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "general_graph__removeVertexCollections_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfX3JlbW92ZVZlcnRleENvbGxlY3Rpb25zCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIikKdmFyIGVkMSA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15RUMxIiwgWyJteVZDMSJdLCBbIm15VkMyIl0pOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtlZDFdKTsKZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oIm15VkMzIiwgdHJ1ZSk7CmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJteVZDNCIsIHRydWUpOwpncmFwaC5fb3JwaGFuQ29sbGVjdGlvbnMoKTsKZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oIm15VkMzIik7CmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpOwp+ZGIuX2Ryb3AoIm15VkMzIik7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIilcbnZhciBlZDEgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwibXlFQzFcIiwgW1wibXlWQzFcIl0sIFtcIm15VkMyXCJdKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbZWQxXSk7XG5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbihcIm15VkMzXCIsIHRydWUpO1xuZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oXCJteVZDNFwiLCB0cnVlKTtcbmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpO1xuZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oXCJteVZDM1wiKTtcbmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpOyIsIm91dHB1dCI6IlsgXG4gIFwibXlWQzNcIiwgXG4gIFwibXlWQzRcIiBcbl1cblsgXG4gIFwibXlWQzRcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VuZXJhbF9ncmFwaF9fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbnMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "general_graph_create_graph_example1_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfY3JlYXRlX2dyYXBoX2V4YW1wbGUxCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CnZhciBlZGdlRGVmaW5pdGlvbnMgPSBncmFwaF9tb2R1bGUuX2VkZ2VEZWZpbml0aW9ucygpOwpncmFwaF9tb2R1bGUuX2V4dGVuZEVkZ2VEZWZpbml0aW9ucyhlZGdlRGVmaW5pdGlvbnMsIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImZyaWVuZF9vZiIsICJDdXN0b21lciIsICJDdXN0b21lciIpKTsKZ3JhcGhfbW9kdWxlLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMoZWRnZURlZmluaXRpb25zLCBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKAogICJoYXNfYm91Z2h0IiwgWyJDdXN0b21lciIsICJDb21wYW55Il0sIFsiR3JvY2VyaWVzIiwgIkVsZWN0cm9uaWNzIl0pCik7CmdyYXBoX21vZHVsZS5fY3JlYXRlKCJteVN0b3JlIiwgZWRnZURlZmluaXRpb25zKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlTdG9yZSIpOwp+ZGIuX2Ryb3AoIkVsZWN0cm9uaWNzIik7Cn5kYi5fZHJvcCgiQ3VzdG9tZXIiKTsKfmRiLl9kcm9wKCJHcm9jZXJpZXMiKTsKfmRiLl9kcm9wKCJDb21wYW55Iik7Cn5kYi5fZHJvcCgiaGFzX2JvdWdodCIpOwp+ZGIuX2Ryb3AoImZyaWVuZF9vZiIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZWRnZURlZmluaXRpb25zID0gZ3JhcGhfbW9kdWxlLl9lZGdlRGVmaW5pdGlvbnMoKTtcbmdyYXBoX21vZHVsZS5fZXh0ZW5kRWRnZURlZmluaXRpb25zKGVkZ2VEZWZpbml0aW9ucywgZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImZyaWVuZF9vZlwiLCBcIkN1c3RvbWVyXCIsIFwiQ3VzdG9tZXJcIikpO1xuZ3JhcGhfbW9kdWxlLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMoZWRnZURlZmluaXRpb25zLCBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFxuICBcImhhc19ib3VnaHRcIiwgW1wiQ3VzdG9tZXJcIiwgXCJDb21wYW55XCJdLCBbXCJHcm9jZXJpZXNcIiwgXCJFbGVjdHJvbmljc1wiXSlcbik7XG5ncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15U3RvcmVcIiwgZWRnZURlZmluaXRpb25zKTsiLCJvdXRwdXQiOiJ7W0dlbmVyYWxHcmFwaF0gXG4gIFwiZnJpZW5kX29mXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODYyNCwgXCJmcmllbmRfb2ZcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIkN1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODYxMywgXCJDdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImhhc19ib3VnaHRcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NjE5LCBcImhhc19ib3VnaHRcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIkNvbXBhbnlcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NjE2LCBcIkNvbXBhbnlcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJFbGVjdHJvbmljc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg2MTAsIFwiRWxlY3Ryb25pY3NcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJHcm9jZXJpZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NjA3LCBcIkdyb2Nlcmllc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxfZ3JhcGhfY3JlYXRlX2dyYXBoX2V4YW1wbGUxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "general_graph_create_graph_example2_single": { + "request": "LS0tCm5hbWU6IGdlbmVyYWxfZ3JhcGhfY3JlYXRlX2dyYXBoX2V4YW1wbGUyCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7CnZhciBlZGdlRGVmaW5pdGlvbnMgPSBncmFwaF9tb2R1bGUuX2VkZ2VEZWZpbml0aW9ucygKICBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJmcmllbmRfb2YiLCBbIkN1c3RvbWVyIl0sIFsiQ3VzdG9tZXIiXSksCiAgZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiaGFzX2JvdWdodCIsIFsiQ3VzdG9tZXIiLCAiQ29tcGFueSJdLCBbIkdyb2NlcmllcyIsICJFbGVjdHJvbmljcyJdKQopOwpncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlTdG9yZSIsIGVkZ2VEZWZpbml0aW9ucyk7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15U3RvcmUiKTsKfmRiLl9kcm9wKCJFbGVjdHJvbmljcyIpOwp+ZGIuX2Ryb3AoIkN1c3RvbWVyIik7Cn5kYi5fZHJvcCgiR3JvY2VyaWVzIik7Cn5kYi5fZHJvcCgiQ29tcGFueSIpOwp+ZGIuX2Ryb3AoImhhc19ib3VnaHQiKTsKfmRiLl9kcm9wKCJmcmllbmRfb2YiKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGhcIik7XG52YXIgZWRnZURlZmluaXRpb25zID0gZ3JhcGhfbW9kdWxlLl9lZGdlRGVmaW5pdGlvbnMoXG4gIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJmcmllbmRfb2ZcIiwgW1wiQ3VzdG9tZXJcIl0sIFtcIkN1c3RvbWVyXCJdKSxcbiAgZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImhhc19ib3VnaHRcIiwgW1wiQ3VzdG9tZXJcIiwgXCJDb21wYW55XCJdLCBbXCJHcm9jZXJpZXNcIiwgXCJFbGVjdHJvbmljc1wiXSlcbik7XG5ncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15U3RvcmVcIiwgZWRnZURlZmluaXRpb25zKTsiLCJvdXRwdXQiOiJ7W0dlbmVyYWxHcmFwaF0gXG4gIFwiZnJpZW5kX29mXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODY2NiwgXCJmcmllbmRfb2ZcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIkN1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA3ODY1NSwgXCJDdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImhhc19ib3VnaHRcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NjYxLCBcImhhc19ib3VnaHRcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIkNvbXBhbnlcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NjU4LCBcIkNvbXBhbnlcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJFbGVjdHJvbmljc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNzg2NTIsIFwiRWxlY3Ryb25pY3NcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJHcm9jZXJpZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDc4NjQ5LCBcIkdyb2Nlcmllc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdlbmVyYWxfZ3JhcGhfY3JlYXRlX2dyYXBoX2V4YW1wbGUyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "geoIndexCreateForArrayAttribute1_single": { + "request": "LS0tCm5hbWU6IGdlb0luZGV4Q3JlYXRlRm9yQXJyYXlBdHRyaWJ1dGUxCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImdlbyIpOwpkYi5nZW8uZW5zdXJlSW5kZXgoeyB0eXBlOiAiZ2VvIiwgZmllbGRzOiBbICJsb2MiIF0gfSk7Cn5kYi5fZHJvcCgiZ2VvIik7", + "response": "eyJpbnB1dCI6ImRiLmdlby5lbnN1cmVJbmRleCh7IHR5cGU6IFwiZ2VvXCIsIGZpZWxkczogWyBcImxvY1wiIF0gfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJiZXN0SW5kZXhlZExldmVsXCIgOiAxNywgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwibG9jXCIgXG4gIF0sIFxuICBcImdlb0pzb25cIiA6IGZhbHNlLCBcbiAgXCJpZFwiIDogXCJnZW8vODA0MTFcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcImxlZ2FjeVBvbHlnb25zXCIgOiBmYWxzZSwgXG4gIFwibWF4TnVtQ292ZXJDZWxsc1wiIDogOCwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjIyNzk3MjU3OTMyOFwiLCBcbiAgXCJzcGFyc2VcIiA6IHRydWUsIFxuICBcInR5cGVcIiA6IFwiZ2VvXCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcIndvcnN0SW5kZXhlZExldmVsXCIgOiA0LCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Imdlb0luZGV4Q3JlYXRlRm9yQXJyYXlBdHRyaWJ1dGUxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "geoIndexCreateForArrayAttribute2_single": { + "request": "LS0tCm5hbWU6IGdlb0luZGV4Q3JlYXRlRm9yQXJyYXlBdHRyaWJ1dGUyCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImdlbzIiKTsKZGIuZ2VvMi5lbnN1cmVJbmRleCh7IHR5cGU6ICJnZW8iLCBmaWVsZHM6IFsgImxvY2F0aW9uLmxhdGl0dWRlIiwgImxvY2F0aW9uLmxvbmdpdHVkZSIgXSB9KTsKfmRiLl9kcm9wKCJnZW8yIik7", + "response": "eyJpbnB1dCI6ImRiLmdlbzIuZW5zdXJlSW5kZXgoeyB0eXBlOiBcImdlb1wiLCBmaWVsZHM6IFsgXCJsb2NhdGlvbi5sYXRpdHVkZVwiLCBcImxvY2F0aW9uLmxvbmdpdHVkZVwiIF0gfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJiZXN0SW5kZXhlZExldmVsXCIgOiAxNywgXG4gIFwiZmllbGRzXCIgOiBbIFxuICAgIFwibG9jYXRpb24ubGF0aXR1ZGVcIiwgXG4gICAgXCJsb2NhdGlvbi5sb25naXR1ZGVcIiBcbiAgXSwgXG4gIFwiZ2VvSnNvblwiIDogZmFsc2UsIFxuICBcImlkXCIgOiBcImdlbzIvODA0MjFcIiwgXG4gIFwiaXNOZXdseUNyZWF0ZWRcIiA6IHRydWUsIFxuICBcImxlZ2FjeVBvbHlnb25zXCIgOiBmYWxzZSwgXG4gIFwibWF4TnVtQ292ZXJDZWxsc1wiIDogOCwgXG4gIFwibmFtZVwiIDogXCJpZHhfMTgzMjkzNjIyNzk5Nzc0NTE1MlwiLCBcbiAgXCJzcGFyc2VcIiA6IHRydWUsIFxuICBcInR5cGVcIiA6IFwiZ2VvXCIsIFxuICBcInVuaXF1ZVwiIDogZmFsc2UsIFxuICBcIndvcnN0SW5kZXhlZExldmVsXCIgOiA0LCBcbiAgXCJjb2RlXCIgOiAyMDEgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Imdlb0luZGV4Q3JlYXRlRm9yQXJyYXlBdHRyaWJ1dGUyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "geoIndexFilterOptimization_single": { + "request": "LS0tCm5hbWU6IGdlb0luZGV4RmlsdGVyT3B0aW1pemF0aW9uCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGUoImdlb0ZpbHRlciIpOwp2YXIgaWR4ID0gZGIuZ2VvRmlsdGVyLmVuc3VyZUluZGV4KHsgdHlwZTogImdlbyIsIGZpZWxkczogWyAibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIiBdIH0pOwpmb3IgKGkgPSAtOTA7ICBpIDw9IDkwOyAgaSArPSAxMCkgewogIGZvciAoaiA9IC0xODA7IGogPD0gMTgwOyBqICs9IDEwKSB7CiAgICBkYi5nZW9GaWx0ZXIuc2F2ZSh7IG5hbWUgOiAiTmFtZS8iICsgaSArICIvIiArIGosIGxhdGl0dWRlIDogaSwgbG9uZ2l0dWRlIDogaiB9KTsKICB9Cn0KdmFyIHF1ZXJ5ID0gIkZPUiBkb2MgaW4gZ2VvRmlsdGVyIEZJTFRFUiBESVNUQU5DRShkb2MubGF0aXR1ZGUsIGRvYy5sb25naXR1ZGUsIDAsIDApIDwgMjAwMCBSRVRVUk4gZG9jIgpkYi5fZXhwbGFpbihxdWVyeSwge30sIHtjb2xvcnM6IGZhbHNlfSk7CmRiLl9xdWVyeShxdWVyeSkudG9BcnJheSgpOwp+ZGIuX2Ryb3AoImdlb0ZpbHRlciIpOw==", + "response": "eyJpbnB1dCI6InZhciBpZHggPSBkYi5nZW9GaWx0ZXIuZW5zdXJlSW5kZXgoeyB0eXBlOiBcImdlb1wiLCBmaWVsZHM6IFsgXCJsYXRpdHVkZVwiLCBcImxvbmdpdHVkZVwiIF0gfSk7XG5mb3IgKGkgPSAtOTA7ICBpIFx1MDAzYz0gOTA7ICBpICs9IDEwKSB7XG4gIGZvciAoaiA9IC0xODA7IGogXHUwMDNjPSAxODA7IGogKz0gMTApIHtcbiAgICBkYi5nZW9GaWx0ZXIuc2F2ZSh7IG5hbWUgOiBcIk5hbWUvXCIgKyBpICsgXCIvXCIgKyBqLCBsYXRpdHVkZSA6IGksIGxvbmdpdHVkZSA6IGogfSk7XG4gIH1cbn1cbnZhciBxdWVyeSA9IFwiRk9SIGRvYyBpbiBnZW9GaWx0ZXIgRklMVEVSIERJU1RBTkNFKGRvYy5sYXRpdHVkZSwgZG9jLmxvbmdpdHVkZSwgMCwgMCkgXHUwMDNjIDIwMDAgUkVUVVJOIGRvY1wiXG5kYi5fZXhwbGFpbihxdWVyeSwge30sIHtjb2xvcnM6IGZhbHNlfSk7XG5kYi5fcXVlcnkocXVlcnkpLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJnZW9GaWx0ZXIvODMyNTlcIiwgXG4gIFwiX2tleVwiIDogXCI4MzI1OVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhbExPLS1FXCIgXG59XG5RdWVyeSBTdHJpbmcgKDg5IGNoYXJzLCBjYWNoZWFibGU6IHRydWUpOlxuIEZPUiBkb2MgaW4gZ2VvRmlsdGVyIEZJTFRFUiBESVNUQU5DRShkb2MubGF0aXR1ZGUsIGRvYy5sb25naXR1ZGUsIDAsIDApIFx1MDAzYyAyMDAwIFJFVFVSTiBkb2NcblxuRXhlY3V0aW9uIHBsYW46XG4gSWQgICBOb2RlVHlwZSAgICAgICAgRXN0LiAgIENvbW1lbnRcbiAgMSAgIFNpbmdsZXRvbk5vZGUgICAgICAxICAgKiBST09UXG4gIDYgICBJbmRleE5vZGUgICAgICAgICAgNyAgICAgLSBGT1IgZG9jIElOIGdlb0ZpbHRlciAgIC8qIGdlbyBpbmRleCBzY2FuLCBpbmRleCBzY2FuICsgZG9jdW1lbnQgbG9va3VwICovICAgIFxuICA1ICAgUmV0dXJuTm9kZSAgICAgICAgIDcgICAgICAgLSBSRVRVUk4gZG9jXG5cbkluZGV4ZXMgdXNlZDpcbiBCeSAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgIENvbGxlY3Rpb24gICBVbmlxdWUgICBTcGFyc2UgICBDYWNoZSAgIFNlbGVjdGl2aXR5ICAgRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVkIHZhbHVlcyAgIFJhbmdlc1xuICA2ICAgaWR4XzE4MzI5MzYyMjgxNDU1OTQzNjggICBnZW8gICAgZ2VvRmlsdGVyICAgIGZhbHNlICAgIHRydWUgICAgIGZhbHNlICAgICAgICAgICBuL2EgICBbIGBsYXRpdHVkZWAsIGBsb25naXR1ZGVgIF0gICBbICBdICAgICAgICAgICAgKEdFT19ESVNUQU5DRShbIDAsIDAgXSwgWyBkb2MuYGxvbmdpdHVkZWAsIGRvYy5gbGF0aXR1ZGVgIF0pIFx1MDAzYyAyMDAwKVxuXG5PcHRpbWl6YXRpb24gcnVsZXMgYXBwbGllZDpcbiBJZCAgIFJ1bGVOYW1lXG4gIDEgICBnZW8taW5kZXgtb3B0aW1pemVyXG4gIDIgICByZW1vdmUtdW5uZWNlc3NhcnktY2FsY3VsYXRpb25zLTJcblxuNDQgcnVsZShzKSBleGVjdXRlZCwgMSBwbGFuKHMpIGNyZWF0ZWQsIHBlYWsgbWVtIFtiXTogMCwgZXhlYyB0aW1lIFtzXTogMC4wMDAyMlxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI4MjU1N1wiLCBcbiAgICBcIl9pZFwiIDogXCJnZW9GaWx0ZXIvODI1NTdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhbElDLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJOYW1lLzAvMFwiLCBcbiAgICBcImxhdGl0dWRlXCIgOiAwLCBcbiAgICBcImxvbmdpdHVkZVwiIDogMCBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VvSW5kZXhGaWx0ZXJPcHRpbWl6YXRpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "geoIndexSortOptimization_single": { + "request": "LS0tCm5hbWU6IGdlb0luZGV4U29ydE9wdGltaXphdGlvbgpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJnZW9Tb3J0Iik7CnZhciBpZHggPSBkYi5nZW9Tb3J0LmVuc3VyZUluZGV4KHsgdHlwZTogImdlbyIsIGZpZWxkczogWyAibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIiBdIH0pOwpmb3IgKGkgPSAtOTA7ICBpIDw9IDkwOyAgaSArPSAxMCkgewogIGZvciAoaiA9IC0xODA7IGogPD0gMTgwOyBqICs9IDEwKSB7CiAgICBkYi5nZW9Tb3J0LnNhdmUoeyBuYW1lIDogIk5hbWUvIiArIGkgKyAiLyIgKyBqLCBsYXRpdHVkZSA6IGksIGxvbmdpdHVkZSA6IGogfSk7CiAgfQp9CnZhciBxdWVyeSA9ICJGT1IgZG9jIGluIGdlb1NvcnQgU09SVCBESVNUQU5DRShkb2MubGF0aXR1ZGUsIGRvYy5sb25naXR1ZGUsIDAsIDApIExJTUlUIDUgUkVUVVJOIGRvYyIKZGIuX2V4cGxhaW4ocXVlcnksIHt9LCB7Y29sb3JzOiBmYWxzZX0pOwpkYi5fcXVlcnkocXVlcnkpLnRvQXJyYXkoKTsKfmRiLl9kcm9wKCJnZW9Tb3J0Iik7", + "response": "eyJpbnB1dCI6InZhciBpZHggPSBkYi5nZW9Tb3J0LmVuc3VyZUluZGV4KHsgdHlwZTogXCJnZW9cIiwgZmllbGRzOiBbIFwibGF0aXR1ZGVcIiwgXCJsb25naXR1ZGVcIiBdIH0pO1xuZm9yIChpID0gLTkwOyAgaSBcdTAwM2M9IDkwOyAgaSArPSAxMCkge1xuICBmb3IgKGogPSAtMTgwOyBqIFx1MDAzYz0gMTgwOyBqICs9IDEwKSB7XG4gICAgZGIuZ2VvU29ydC5zYXZlKHsgbmFtZSA6IFwiTmFtZS9cIiArIGkgKyBcIi9cIiArIGosIGxhdGl0dWRlIDogaSwgbG9uZ2l0dWRlIDogaiB9KTtcbiAgfVxufVxudmFyIHF1ZXJ5ID0gXCJGT1IgZG9jIGluIGdlb1NvcnQgU09SVCBESVNUQU5DRShkb2MubGF0aXR1ZGUsIGRvYy5sb25naXR1ZGUsIDAsIDApIExJTUlUIDUgUkVUVVJOIGRvY1wiXG5kYi5fZXhwbGFpbihxdWVyeSwge30sIHtjb2xvcnM6IGZhbHNlfSk7XG5kYi5fcXVlcnkocXVlcnkpLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJ7IFxuICBcIl9pZFwiIDogXCJnZW9Tb3J0LzgxODM5XCIsIFxuICBcIl9rZXlcIiA6IFwiODE4MzlcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzYWxEMi0tRVwiIFxufVxuUXVlcnkgU3RyaW5nICg4NiBjaGFycywgY2FjaGVhYmxlOiB0cnVlKTpcbiBGT1IgZG9jIGluIGdlb1NvcnQgU09SVCBESVNUQU5DRShkb2MubGF0aXR1ZGUsIGRvYy5sb25naXR1ZGUsIDAsIDApIExJTUlUIDUgUkVUVVJOIGRvY1xuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICBFc3QuICAgQ29tbWVudFxuICAxICAgU2luZ2xldG9uTm9kZSAgICAgIDEgICAqIFJPT1RcbiAgNyAgIEluZGV4Tm9kZSAgICAgICAgICA3ICAgICAtIEZPUiBkb2MgSU4gZ2VvU29ydCAgIC8qIGdlbyBpbmRleCBzY2FuLCBpbmRleCBzY2FuICsgZG9jdW1lbnQgbG9va3VwICovICAgIFxuICA1ICAgTGltaXROb2RlICAgICAgICAgIDUgICAgICAgLSBMSU1JVCAwLCA1XG4gIDYgICBSZXR1cm5Ob2RlICAgICAgICAgNSAgICAgICAtIFJFVFVSTiBkb2NcblxuSW5kZXhlcyB1c2VkOlxuIEJ5ICAgTmFtZSAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgQ29sbGVjdGlvbiAgIFVuaXF1ZSAgIFNwYXJzZSAgIENhY2hlICAgU2VsZWN0aXZpdHkgICBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZWQgdmFsdWVzICAgUmFuZ2VzXG4gIDcgICBpZHhfMTgzMjkzNjIyODAyNTAwODEyOCAgIGdlbyAgICBnZW9Tb3J0ICAgICAgZmFsc2UgICAgdHJ1ZSAgICAgZmFsc2UgICAgICAgICAgIG4vYSAgIFsgYGxhdGl0dWRlYCwgYGxvbmdpdHVkZWAgXSAgIFsgIF0gICAgICAgICAgICAoR0VPX0RJU1RBTkNFKFsgMCwgMCBdLCBbIGRvYy5gbG9uZ2l0dWRlYCwgZG9jLmBsYXRpdHVkZWAgXSkgXHUwMDNjIFwidW5saW1pdGVkXCIpXG5cbk9wdGltaXphdGlvbiBydWxlcyBhcHBsaWVkOlxuIElkICAgUnVsZU5hbWVcbiAgMSAgIGdlby1pbmRleC1vcHRpbWl6ZXJcbiAgMiAgIHJlbW92ZS11bm5lY2Vzc2FyeS1jYWxjdWxhdGlvbnMtMlxuXG40NCBydWxlKHMpIGV4ZWN1dGVkLCAxIHBsYW4ocykgY3JlYXRlZCwgcGVhayBtZW0gW2JdOiAwLCBleGVjIHRpbWUgW3NdOiAwLjAwMDE2XG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjgxMTM3XCIsIFxuICAgIFwiX2lkXCIgOiBcImdlb1NvcnQvODExMzdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhbEF5LS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJOYW1lLzAvMFwiLCBcbiAgICBcImxhdGl0dWRlXCIgOiAwLCBcbiAgICBcImxvbmdpdHVkZVwiIDogMCBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjgxMjExXCIsIFxuICAgIFwiX2lkXCIgOiBcImdlb1NvcnQvODEyMTFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhbEJHLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJOYW1lLzEwLzBcIiwgXG4gICAgXCJsYXRpdHVkZVwiIDogMTAsIFxuICAgIFwibG9uZ2l0dWRlXCIgOiAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiODExMzlcIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VvU29ydC84MTEzOVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FsQXktLURcIiwgXG4gICAgXCJuYW1lXCIgOiBcIk5hbWUvMC8xMFwiLCBcbiAgICBcImxhdGl0dWRlXCIgOiAwLCBcbiAgICBcImxvbmdpdHVkZVwiIDogMTAgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI4MTA2M1wiLCBcbiAgICBcIl9pZFwiIDogXCJnZW9Tb3J0LzgxMDYzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYWxBVy0tQlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiTmFtZS8tMTAvMFwiLCBcbiAgICBcImxhdGl0dWRlXCIgOiAtMTAsIFxuICAgIFwibG9uZ2l0dWRlXCIgOiAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiODExMzVcIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VvU29ydC84MTEzNVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FsQXktLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIk5hbWUvMC8tMTBcIiwgXG4gICAgXCJsYXRpdHVkZVwiIDogMCwgXG4gICAgXCJsb25naXR1ZGVcIiA6IC0xMCBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ2VvSW5kZXhTb3J0T3B0aW1pemF0aW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "graph_create_cities_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV9jaXRpZXNfc2FtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInJvdXRlcGxhbm5lciIpOwpkYi5mcmVuY2hDaXR5LnRvQXJyYXkoKTsKZGIuZ2VybWFuQ2l0eS50b0FycmF5KCk7CmRiLmdlcm1hbkhpZ2h3YXkudG9BcnJheSgpOwpkYi5mcmVuY2hIaWdod2F5LnRvQXJyYXkoKTsKZGIuaW50ZXJuYXRpb25hbEhpZ2h3YXkudG9BcnJheSgpOwpleGFtcGxlcy5kcm9wR3JhcGgoInJvdXRlcGxhbm5lciIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwicm91dGVwbGFubmVyXCIpO1xuZGIuZnJlbmNoQ2l0eS50b0FycmF5KCk7XG5kYi5nZXJtYW5DaXR5LnRvQXJyYXkoKTtcbmRiLmdlcm1hbkhpZ2h3YXkudG9BcnJheSgpO1xuZGIuZnJlbmNoSGlnaHdheS50b0FycmF5KCk7XG5kYi5pbnRlcm5hdGlvbmFsSGlnaHdheS50b0FycmF5KCk7XG5leGFtcGxlcy5kcm9wR3JhcGgoXCJyb3V0ZXBsYW5uZXJcIik7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiTHlvblwiLCBcbiAgICBcIl9pZFwiIDogXCJmcmVuY2hDaXR5L0x5b25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXVDLS1CXCIsIFxuICAgIFwicG9wdWxhdGlvblwiIDogODAwMDAsIFxuICAgIFwiaXNDYXBpdGFsXCIgOiBmYWxzZSwgXG4gICAgXCJnZW9tZXRyeVwiIDogeyBcbiAgICAgIFwidHlwZVwiIDogXCJQb2ludFwiLCBcbiAgICAgIFwiY29vcmRpbmF0ZXNcIiA6IFsgXG4gICAgICAgIDQuODQsIFxuICAgICAgICA0NS43NiBcbiAgICAgIF0gXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlBhcmlzXCIsIFxuICAgIFwiX2lkXCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXVHLS0tXCIsIFxuICAgIFwicG9wdWxhdGlvblwiIDogNDAwMDAwMCwgXG4gICAgXCJpc0NhcGl0YWxcIiA6IHRydWUsIFxuICAgIFwiZ2VvbWV0cnlcIiA6IHsgXG4gICAgICBcInR5cGVcIiA6IFwiUG9pbnRcIiwgXG4gICAgICBcImNvb3JkaW5hdGVzXCIgOiBbIFxuICAgICAgICAyLjM1MDgsIFxuICAgICAgICA0OC44NTY3IFxuICAgICAgXSBcbiAgICB9IFxuICB9IFxuXVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCZXJsaW5cIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXVDLS0tXCIsIFxuICAgIFwicG9wdWxhdGlvblwiIDogMzAwMDAwMCwgXG4gICAgXCJpc0NhcGl0YWxcIiA6IHRydWUsIFxuICAgIFwiZ2VvbWV0cnlcIiA6IHsgXG4gICAgICBcInR5cGVcIiA6IFwiUG9pbnRcIiwgXG4gICAgICBcImNvb3JkaW5hdGVzXCIgOiBbIFxuICAgICAgICAxMy4zODMzLCBcbiAgICAgICAgNTIuNTE2NyBcbiAgICAgIF0gXG4gICAgfSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkNvbG9nbmVcIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VybWFuQ2l0eS9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Qy0tX1wiLCBcbiAgICBcInBvcHVsYXRpb25cIiA6IDEwMDAwMDAsIFxuICAgIFwiaXNDYXBpdGFsXCIgOiBmYWxzZSwgXG4gICAgXCJnZW9tZXRyeVwiIDogeyBcbiAgICAgIFwidHlwZVwiIDogXCJQb2ludFwiLCBcbiAgICAgIFwiY29vcmRpbmF0ZXNcIiA6IFsgXG4gICAgICAgIDYuOTUyOCwgXG4gICAgICAgIDUwLjkzNjQgXG4gICAgICBdIFxuICAgIH0gXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJIYW1idXJnXCIsIFxuICAgIFwiX2lkXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdUMtLUFcIiwgXG4gICAgXCJwb3B1bGF0aW9uXCIgOiAxMDAwMDAwLCBcbiAgICBcImlzQ2FwaXRhbFwiIDogZmFsc2UsIFxuICAgIFwiZ2VvbWV0cnlcIiA6IHsgXG4gICAgICBcInR5cGVcIiA6IFwiUG9pbnRcIiwgXG4gICAgICBcImNvb3JkaW5hdGVzXCIgOiBbIFxuICAgICAgICAxMC4wMDE0LCBcbiAgICAgICAgNTMuNTY1MyBcbiAgICAgIF0gXG4gICAgfSBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MjFcIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VybWFuSGlnaHdheS83NDQyMVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdUstLS1cIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogODUwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MjNcIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VybWFuSGlnaHdheS83NDQyM1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQmVybGluXCIsIFxuICAgIFwiX3RvXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdUstLV9cIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogNDAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MjVcIiwgXG4gICAgXCJfaWRcIiA6IFwiZ2VybWFuSGlnaHdheS83NDQyNVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvSGFtYnVyZ1wiLCBcbiAgICBcIl90b1wiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXVLLS1BXCIsIFxuICAgIFwiZGlzdGFuY2VcIiA6IDUwMCBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MjdcIiwgXG4gICAgXCJfaWRcIiA6IFwiZnJlbmNoSGlnaHdheS83NDQyN1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcImZyZW5jaENpdHkvUGFyaXNcIiwgXG4gICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Sy0tQlwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiA1NTAgXG4gIH0gXG5dXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NDI5XCIsIFxuICAgIFwiX2lkXCIgOiBcImludGVybmF0aW9uYWxIaWdod2F5Lzc0NDI5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiZ2VybWFuQ2l0eS9CZXJsaW5cIiwgXG4gICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Sy0tQ1wiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxMTAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MzFcIiwgXG4gICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzQ0MzFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0JlcmxpblwiLCBcbiAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Sy0tRFwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxMjAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MzNcIiwgXG4gICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzQ0MzNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9QYXJpc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdUstLUVcIiwgXG4gICAgXCJkaXN0YW5jZVwiIDogOTAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MzVcIiwgXG4gICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzQ0MzVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0hhbWJ1cmdcIiwgXG4gICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Ty0tLVwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiAxMzAwIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ0MzdcIiwgXG4gICAgXCJfaWRcIiA6IFwiaW50ZXJuYXRpb25hbEhpZ2h3YXkvNzQ0MzdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJnZXJtYW5DaXR5L0NvbG9nbmVcIiwgXG4gICAgXCJfdG9cIiA6IFwiZnJlbmNoQ2l0eS9MeW9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Ty0tX1wiLCBcbiAgICBcImRpc3RhbmNlXCIgOiA3MDAgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDQzOVwiLCBcbiAgICBcIl9pZFwiIDogXCJpbnRlcm5hdGlvbmFsSGlnaHdheS83NDQzOVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImdlcm1hbkNpdHkvQ29sb2duZVwiLCBcbiAgICBcIl90b1wiIDogXCJmcmVuY2hDaXR5L1BhcmlzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV1Ty0tQVwiLCBcbiAgICBcImRpc3RhbmNlXCIgOiA1NTAgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdyYXBoX2NyZWF0ZV9jaXRpZXNfc2FtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "graph_create_connectedcomponentsgraph_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV9jb25uZWN0ZWRjb21wb25lbnRzZ3JhcGhfc2FtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOwpkYi5jb21wb25lbnRzLnRvQXJyYXkoKTsKZGIuY29ubmVjdGlvbnMudG9BcnJheSgpOwpleGFtcGxlcy5kcm9wR3JhcGgoImNvbm5lY3RlZENvbXBvbmVudHNHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwiY29ubmVjdGVkQ29tcG9uZW50c0dyYXBoXCIpO1xuZGIuY29tcG9uZW50cy50b0FycmF5KCk7XG5kYi5jb25uZWN0aW9ucy50b0FycmF5KCk7XG5leGFtcGxlcy5kcm9wR3JhcGgoXCJjb25uZWN0ZWRDb21wb25lbnRzR3JhcGhcIik7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQTFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9BMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdy0tLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkEyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQTJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdDLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJBM1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0EzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Qy0tX1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQTRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9BNFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0MtLUFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQjFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdDLS1CXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCM1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Ry0tLVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQjJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9CMlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0ctLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkI0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQjRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdHLS1BXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCNlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0I2XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Ry0tQlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQjVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9CNVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0ctLUNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkI3XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQjdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdHLS1EXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCOFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0I4XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Ry0tRVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQjlcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9COVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0stLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxMFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0stLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxOVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxOVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0stLUFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxMVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0stLUJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxMlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxMlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0stLUNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxM1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd0stLURcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIyMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IyMFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxNFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxNVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxNVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLUFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxNlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxNlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLUJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxN1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxN1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLUNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIxOFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IxOFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLURcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIyMVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IyMVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd08tLUVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkIyMlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0IyMlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd1MtLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkMxXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQzFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdTLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDMlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0MyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Uy0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQzNcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9DM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd1MtLUJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkM0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQzRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdTLS1DXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDNVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0M1XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Uy0tRFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQzdcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9DN1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd1MtLUVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkM2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbXBvbmVudHMvQzZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdXLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDOFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0M4XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Vy0tX1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQzlcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29tcG9uZW50cy9DOVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd1ctLUFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkMxMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb21wb25lbnRzL0MxMFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd1ctLUJcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NDFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NDFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0ExXCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQTJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdXLS1DXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU0M1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU0M1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQTJcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9BM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd1ctLURcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTQ1XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTQ1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9BM1wiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0E0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3YS0tLVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NDdcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NDdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0E0XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQTFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdhLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU0OVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU0OVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjFcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9CM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd2EtLUFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTUxXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTUxXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CMlwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0I0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3YS0tQlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NTNcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NTNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0IzXCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjZcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdlLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU1NVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU1NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjRcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9CM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd2ktLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTU3XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTU3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CNFwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0I1XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3aS0tX1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NTlcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NTlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0I2XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdtLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU2MVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU2MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjdcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9COFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd20tLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTYzXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTYzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CN1wiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0I5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3bS0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NjVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NjVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0I3XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjEwXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3bS0tQlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NjdcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NjdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0I3XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjE5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3bS0tQ1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NjlcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NjlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0IxMVwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0IxMFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd3EtLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTcxXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTcxXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CMTJcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9CMTFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdxLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU3M1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU3M1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjEzXCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjEyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3cS0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1NzVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1NzVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0IxM1wiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0IyMFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd3EtLUJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTc3XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTc3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CMTRcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9CMTNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXdxLS1DXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU3OVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU3OVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjE1XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjE0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3cS0tRFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1ODFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1ODFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0IxNVwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0IxNlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd3UtLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTgzXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTgzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CMTdcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9CMTVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXd1LS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU4NVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU4NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjE3XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjE4XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3dS0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1ODdcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1ODdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0IxOVwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0IxN1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd3UtLUJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTg5XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTg5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9CMjBcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9CMjFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXd1LS1DXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU5MVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU5MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQjIwXCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQjIyXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3dS0tRFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1OTNcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1OTNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0MxXCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQzJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXd5LS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDU5NVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDU5NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQzJcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9DM1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd3ktLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NTk3XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NTk3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9DM1wiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0M0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3eS0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ1OTlcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ1OTlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0M0XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQzVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXd5LS1CXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDYwMVwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDYwMVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQzRcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9DN1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVd3ktLUNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NjAzXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NjAzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9DNVwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0M2XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3eS0tRFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ2MDVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ2MDVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0M1XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQzdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXcyLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDYwN1wiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83NDYwN1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNvbXBvbmVudHMvQzdcIiwgXG4gICAgXCJfdG9cIiA6IFwiY29tcG9uZW50cy9DOFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdzItLV9cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0NjA5XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzc0NjA5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY29tcG9uZW50cy9DOFwiLCBcbiAgICBcIl90b1wiIDogXCJjb21wb25lbnRzL0M5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Mi0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQ2MTFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzQ2MTFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjb21wb25lbnRzL0M4XCIsIFxuICAgIFwiX3RvXCIgOiBcImNvbXBvbmVudHMvQzEwXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV3Mi0tQlwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJncmFwaF9jcmVhdGVfY29ubmVjdGVkY29tcG9uZW50c2dyYXBoX3NhbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "graph_create_knows_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV9rbm93c19zYW1wbGUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZyA9IGV4YW1wbGVzLmxvYWRHcmFwaCgia25vd3NfZ3JhcGgiKTsKZGIucGVyc29ucy50b0FycmF5KCkKZGIua25vd3MudG9BcnJheSgpOwpleGFtcGxlcy5kcm9wR3JhcGgoImtub3dzX2dyYXBoIik7", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwia25vd3NfZ3JhcGhcIik7XG5kYi5wZXJzb25zLnRvQXJyYXkoKVxuZGIua25vd3MudG9BcnJheSgpO1xuZXhhbXBsZXMuZHJvcEdyYXBoKFwia25vd3NfZ3JhcGhcIik7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiYWxpY2VcIiwgXG4gICAgXCJfaWRcIiA6IFwicGVyc29ucy9hbGljZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZXUtLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFsaWNlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJib2JcIiwgXG4gICAgXCJfaWRcIiA6IFwicGVyc29ucy9ib2JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWV1LS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJCb2JcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNoYXJsaWVcIiwgXG4gICAgXCJfaWRcIiA6IFwicGVyc29ucy9jaGFybGllXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVldS0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQ2hhcmxpZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiZGF2ZVwiLCBcbiAgICBcIl9pZFwiIDogXCJwZXJzb25zL2RhdmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWV5LS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJEYXZlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJldmVcIiwgXG4gICAgXCJfaWRcIiA6IFwicGVyc29ucy9ldmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWV5LS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJFdmVcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM0NDVcIiwgXG4gICAgXCJfaWRcIiA6IFwia25vd3MvNzM0NDVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwZXJzb25zL2FsaWNlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBlcnNvbnMvYm9iXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVleS0tQVwiLCBcbiAgICBcInZlcnRleFwiIDogXCJhbGljZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM0NDdcIiwgXG4gICAgXCJfaWRcIiA6IFwia25vd3MvNzM0NDdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwZXJzb25zL2JvYlwiLCBcbiAgICBcIl90b1wiIDogXCJwZXJzb25zL2NoYXJsaWVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWV5LS1CXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImJvYlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM0NDlcIiwgXG4gICAgXCJfaWRcIiA6IFwia25vd3MvNzM0NDlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwZXJzb25zL2JvYlwiLCBcbiAgICBcIl90b1wiIDogXCJwZXJzb25zL2RhdmVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWV5LS1DXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImJvYlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM0NTFcIiwgXG4gICAgXCJfaWRcIiA6IFwia25vd3MvNzM0NTFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwZXJzb25zL2V2ZVwiLCBcbiAgICBcIl90b1wiIDogXCJwZXJzb25zL2FsaWNlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVleS0tRFwiLCBcbiAgICBcInZlcnRleFwiIDogXCJldmVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNDUzXCIsIFxuICAgIFwiX2lkXCIgOiBcImtub3dzLzczNDUzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGVyc29ucy9ldmVcIiwgXG4gICAgXCJfdG9cIiA6IFwicGVyc29ucy9ib2JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWV5LS1FXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImV2ZVwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJncmFwaF9jcmVhdGVfa25vd3Nfc2FtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "graph_create_kshortestpaths_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV9rc2hvcnRlc3RwYXRoc19zYW1wbGUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZyA9IGV4YW1wbGVzLmxvYWRHcmFwaCgia1Nob3J0ZXN0UGF0aHNHcmFwaCIpOwpkYi5wbGFjZXMudG9BcnJheSgpOwpkYi5jb25uZWN0aW9ucy50b0FycmF5KCk7CmV4YW1wbGVzLmRyb3BHcmFwaCgia1Nob3J0ZXN0UGF0aHNHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwia1Nob3J0ZXN0UGF0aHNHcmFwaFwiKTtcbmRiLnBsYWNlcy50b0FycmF5KCk7XG5kYi5jb25uZWN0aW9ucy50b0FycmF5KCk7XG5leGFtcGxlcy5kcm9wR3JhcGgoXCJrU2hvcnRlc3RQYXRoc0dyYXBoXCIpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkludmVybmVzc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoSy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkludmVybmVzc1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQWJlcmRlZW5cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoSy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkFiZXJkZWVuXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJMZXVjaGFyc1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhLLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiTGV1Y2hhcnNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlN0QW5kcmV3c1wiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoSy0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIlN0QW5kcmV3c1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRWRpbmJ1cmdoXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhPLS0tXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiRWRpbmJ1cmdoXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJHbGFzZ293XCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoTy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkdsYXNnb3dcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIllvcmtcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhPLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiWW9ya1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQ2FybGlzbGVcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoTy0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNhcmxpc2xlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJCaXJtaW5naGFtXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoTy0tQ1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJpcm1pbmdoYW1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkxvbmRvblwiLCBcbiAgICBcIl9pZFwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoTy0tRFwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkxvbmRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQnJ1c3NlbHNcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoUy0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIkJydXNzZWxzXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDb2xvZ25lXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoUy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIkNvbG9nbmVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIlRvcm9udG9cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Rvcm9udG9cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhTLS1BXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiVG9yb250b1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiV2lubmlwZWdcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoUy0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIldpbm5pcGVnXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJTYXNrYXRvb25cIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaFMtLUNcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJTYXNrYXRvb25cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVkbW9udG9uXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaFMtLURcIiwgXG4gICAgXCJsYWJlbFwiIDogXCJFZG1vbnRvblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiSmFzcGVyXCIsIFxuICAgIFwiX2lkXCIgOiBcInBsYWNlcy9KYXNwZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhXLS0tXCIsIFxuICAgIFwibGFiZWxcIiA6IFwiSmFzcGVyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJWYW5jb3V2ZXJcIiwgXG4gICAgXCJfaWRcIiA6IFwicGxhY2VzL1ZhbmNvdXZlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaFctLV9cIiwgXG4gICAgXCJsYWJlbFwiIDogXCJWYW5jb3V2ZXJcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM1ODRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM1ODRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSW52ZXJuZXNzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaFctLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM1ODZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM1ODZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQWJlcmRlZW5cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0ludmVybmVzc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaFctLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzU4OFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzU4OFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9BYmVyZGVlblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhhLS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMS41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM1OTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM1OTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0FiZXJkZWVuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoYS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzU5MlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzU5MlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoYS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTk0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNTk0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhhLS1CXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMyBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTk2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNTk2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0VkaW5idXJnaFwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaGEtLUNcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM1OThcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM1OThcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvR2xhc2dvd1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoZS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYwMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYwMFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZGluYnVyZ2hcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhlLS1fXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMy41IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2MDJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2MDJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRpbmJ1cmdoXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoZS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDQgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYwNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYwNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9HbGFzZ293XCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaGUtLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2MDZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2MDZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQ2FybGlzbGVcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0dsYXNnb3dcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhlLS1DXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjA4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjA4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Zb3JrXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoaS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjEwXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjEwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1lvcmtcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoaS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjEyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjEyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0Nhcmxpc2xlXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVoaS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYxNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYxNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CaXJtaW5naGFtXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9DYXJsaXNsZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaGktLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2MTZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2MTZcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVobS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjE4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjE4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvQmlybWluZ2hhbVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaG0tLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYyMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYyMFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9MZXVjaGFyc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU3RBbmRyZXdzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVobS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDAuMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjIyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjIyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1N0QW5kcmV3c1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTGV1Y2hhcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWhtLS1CXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMC4yIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2MjRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2MjRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVobS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDEuOCBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjI2XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjI2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0xvbmRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvWW9ya1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaG0tLURcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2MjhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2MjhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaG0tLUVcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAyLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYzMFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYzMFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvTG9uZG9uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVocS0tLVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDMuNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjMyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjMyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL0JydXNzZWxzXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVocS0tX1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYzNFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYzNFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Db2xvZ25lXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9CcnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaHEtLUFcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxLjUgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzYzNlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzYzNlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9XaW5uaXBlZ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaHEtLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAzNiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjM4XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjM4XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1dpbm5pcGVnXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9Ub3JvbnRvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVocS0tQ1wiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDM1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2NDBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2NDBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaHEtLURcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjQyXCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjQyXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvV2lubmlwZWdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWh1LS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNjQ0XCIsIFxuICAgIFwiX2lkXCIgOiBcImNvbm5lY3Rpb25zLzczNjQ0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwicGxhY2VzL1Nhc2thdG9vblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWh1LS1fXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzY0NlwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzY0NlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl90b1wiIDogXCJwbGFjZXMvU2Fza2F0b29uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVodS0tQVwiLCBcbiAgICBcInRyYXZlbFRpbWVcIiA6IDE3IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2NDhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2NDhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvRWRtb250b25cIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaHUtLUJcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA2IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2NTBcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2NTBcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9FZG1vbnRvblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaHUtLUNcIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiA1IFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM2NTJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY29ubmVjdGlvbnMvNzM2NTJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJwbGFjZXMvSmFzcGVyXCIsIFxuICAgIFwiX3RvXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWh5LS0tXCIsIFxuICAgIFwidHJhdmVsVGltZVwiIDogMTIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzY1NFwiLCBcbiAgICBcIl9pZFwiIDogXCJjb25uZWN0aW9ucy83MzY1NFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcInBsYWNlcy9WYW5jb3V2ZXJcIiwgXG4gICAgXCJfdG9cIiA6IFwicGxhY2VzL0phc3BlclwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVaHktLV9cIiwgXG4gICAgXCJ0cmF2ZWxUaW1lXCIgOiAxMyBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ3JhcGhfY3JlYXRlX2tzaG9ydGVzdHBhdGhzX3NhbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "graph_create_mps_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV9tcHNfc2FtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoIm1wc19ncmFwaCIpOwpkYi5tcHNfdmVydHMudG9BcnJheSgpOwpkYi5tcHNfZWRnZXMudG9BcnJheSgpOwpleGFtcGxlcy5kcm9wR3JhcGgoIm1wc19ncmFwaCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwibXBzX2dyYXBoXCIpO1xuZGIubXBzX3ZlcnRzLnRvQXJyYXkoKTtcbmRiLm1wc19lZGdlcy50b0FycmF5KCk7XG5leGFtcGxlcy5kcm9wR3JhcGgoXCJtcHNfZ3JhcGhcIik7Iiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiQVwiLCBcbiAgICBcIl9pZFwiIDogXCJtcHNfdmVydHMvQVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVakstLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkJcIiwgXG4gICAgXCJfaWRcIiA6IFwibXBzX3ZlcnRzL0JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWpLLS1fXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJDXCIsIFxuICAgIFwiX2lkXCIgOiBcIm1wc192ZXJ0cy9DXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVqSy0tQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiRFwiLCBcbiAgICBcIl9pZFwiIDogXCJtcHNfdmVydHMvRFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FValMtLS1cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVcIiwgXG4gICAgXCJfaWRcIiA6IFwibXBzX3ZlcnRzL0VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWpXLS0tXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJGXCIsIFxuICAgIFwiX2lkXCIgOiBcIm1wc192ZXJ0cy9GXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVqVy0tX1wiIFxuICB9IFxuXVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzcwMlwiLCBcbiAgICBcIl9pZFwiIDogXCJtcHNfZWRnZXMvNzM3MDJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJtcHNfdmVydHMvQVwiLCBcbiAgICBcIl90b1wiIDogXCJtcHNfdmVydHMvQlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FValctLUFcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM3MDRcIiwgXG4gICAgXCJfaWRcIiA6IFwibXBzX2VkZ2VzLzczNzA0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwibXBzX3ZlcnRzL0FcIiwgXG4gICAgXCJfdG9cIiA6IFwibXBzX3ZlcnRzL0VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWpXLS1CXCIsIFxuICAgIFwidmVydGV4XCIgOiBcIkFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNzA2XCIsIFxuICAgIFwiX2lkXCIgOiBcIm1wc19lZGdlcy83MzcwNlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIm1wc192ZXJ0cy9BXCIsIFxuICAgIFwiX3RvXCIgOiBcIm1wc192ZXJ0cy9EXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVqVy0tQ1wiLCBcbiAgICBcInZlcnRleFwiIDogXCJBXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzcwOFwiLCBcbiAgICBcIl9pZFwiIDogXCJtcHNfZWRnZXMvNzM3MDhcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJtcHNfdmVydHMvQlwiLCBcbiAgICBcIl90b1wiIDogXCJtcHNfdmVydHMvQ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVamEtLS1cIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiQlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM3MTBcIiwgXG4gICAgXCJfaWRcIiA6IFwibXBzX2VkZ2VzLzczNzEwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwibXBzX3ZlcnRzL0RcIiwgXG4gICAgXCJfdG9cIiA6IFwibXBzX3ZlcnRzL0NcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWphLS1fXCIsIFxuICAgIFwidmVydGV4XCIgOiBcIkRcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNzEyXCIsIFxuICAgIFwiX2lkXCIgOiBcIm1wc19lZGdlcy83MzcxMlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIm1wc192ZXJ0cy9FXCIsIFxuICAgIFwiX3RvXCIgOiBcIm1wc192ZXJ0cy9GXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVqYS0tQVwiLCBcbiAgICBcInZlcnRleFwiIDogXCJFXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzcxNFwiLCBcbiAgICBcIl9pZFwiIDogXCJtcHNfZWRnZXMvNzM3MTRcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJtcHNfdmVydHMvRlwiLCBcbiAgICBcIl90b1wiIDogXCJtcHNfdmVydHMvQ1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVamEtLUJcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiRlwiIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJncmFwaF9jcmVhdGVfbXBzX3NhbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "graph_create_social_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV9zb2NpYWxfc2FtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gZXhhbXBsZXMubG9hZEdyYXBoKCJzb2NpYWwiKTsKZGIuZmVtYWxlLnRvQXJyYXkoKQpkYi5tYWxlLnRvQXJyYXkoKQpkYi5yZWxhdGlvbi50b0FycmF5KCkKZXhhbXBsZXMuZHJvcEdyYXBoKCJzb2NpYWwiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBncmFwaCA9IGV4YW1wbGVzLmxvYWRHcmFwaChcInNvY2lhbFwiKTtcbmRiLmZlbWFsZS50b0FycmF5KClcbmRiLm1hbGUudG9BcnJheSgpXG5kYi5yZWxhdGlvbi50b0FycmF5KClcbmV4YW1wbGVzLmRyb3BHcmFwaChcInNvY2lhbFwiKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJhbGljZVwiLCBcbiAgICBcIl9pZFwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXRTLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbGljZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiZGlhbmFcIiwgXG4gICAgXCJfaWRcIiA6IFwiZmVtYWxlL2RpYW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV0Uy0tQlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiRGlhbmFcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiYm9iXCIsIFxuICAgIFwiX2lkXCIgOiBcIm1hbGUvYm9iXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVV0Uy0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQm9iXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjaGFybHlcIiwgXG4gICAgXCJfaWRcIiA6IFwibWFsZS9jaGFybHlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXRTLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJDaGFybHlcIiBcbiAgfSBcbl1cblxuWyBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQzMzlcIiwgXG4gICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzQzMzlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJmZW1hbGUvYWxpY2VcIiwgXG4gICAgXCJfdG9cIiA6IFwibWFsZS9ib2JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXRTLS1DXCIsIFxuICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImFsaWNlXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDM0MVwiLCBcbiAgICBcIl9pZFwiIDogXCJyZWxhdGlvbi83NDM0MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImZlbWFsZS9hbGljZVwiLCBcbiAgICBcIl90b1wiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVdFctLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImZyaWVuZFwiLCBcbiAgICBcInZlcnRleFwiIDogXCJhbGljZVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQzNDNcIiwgXG4gICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzQzNDNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJtYWxlL2NoYXJseVwiLCBcbiAgICBcIl90b1wiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXRXLS1fXCIsIFxuICAgIFwidHlwZVwiIDogXCJtYXJyaWVkXCIsIFxuICAgIFwidmVydGV4XCIgOiBcImNoYXJseVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzQzNDVcIiwgXG4gICAgXCJfaWRcIiA6IFwicmVsYXRpb24vNzQzNDVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJtYWxlL2JvYlwiLCBcbiAgICBcIl90b1wiIDogXCJmZW1hbGUvZGlhbmFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVXRXLS1BXCIsIFxuICAgIFwidHlwZVwiIDogXCJmcmllbmRcIiwgXG4gICAgXCJ2ZXJ0ZXhcIiA6IFwiYm9iXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdyYXBoX2NyZWF0ZV9zb2NpYWxfc2FtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "graph_create_traversal_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV90cmF2ZXJzYWxfc2FtcGxlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGV4YW1wbGVzID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dyYXBoLWV4YW1wbGVzL2V4YW1wbGUtZ3JhcGgiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoInRyYXZlcnNhbEdyYXBoIik7CmRiLmNpcmNsZXMudG9BcnJheSgpOwpkYi5lZGdlcy50b0FycmF5KCk7CmV4YW1wbGVzLmRyb3BHcmFwaCgidHJhdmVyc2FsR3JhcGgiKTs=", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwidHJhdmVyc2FsR3JhcGhcIik7XG5kYi5jaXJjbGVzLnRvQXJyYXkoKTtcbmRiLmVkZ2VzLnRvQXJyYXkoKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcInRyYXZlcnNhbEdyYXBoXCIpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkFcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9BXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmVy0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkJcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9CXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmYS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkNcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9DXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmYS0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkRcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9EXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmYS0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjRcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkVcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9FXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmYS0tQlwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkZcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9GXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmYS0tQ1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjZcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkdcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9HXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmYS0tRFwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjdcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkhcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9IXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmZS0tLVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjhcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIklcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9JXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmZS0tX1wiLCBcbiAgICBcImxhYmVsXCIgOiBcIjlcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIkpcIiwgXG4gICAgXCJfaWRcIiA6IFwiY2lyY2xlcy9KXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmZS0tQVwiLCBcbiAgICBcImxhYmVsXCIgOiBcIjEwXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJLXCIsIFxuICAgIFwiX2lkXCIgOiBcImNpcmNsZXMvS1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZmUtLUJcIiwgXG4gICAgXCJsYWJlbFwiIDogXCIxMVwiIFxuICB9IFxuXVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzUwNlwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy83MzUwNlwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvQVwiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWZlLS1DXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcImxlZnRfYmFyXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzUwOFwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy83MzUwOFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvQlwiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0NcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWZlLS1EXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcImxlZnRfYmxhcmdcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTEwXCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzczNTEwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9DXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvRFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZmktLS1cIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwibGVmdF9ibG9yZ1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM1MTJcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNzM1MTJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0JcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9FXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmaS0tX1wiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJsZWZ0X2JsdWJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTE0XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzczNTE0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9FXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvRlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZmktLUFcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwibGVmdF9zY2h1YmlcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTE2XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzczNTE2XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9BXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvR1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZmktLUJcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfZm9vXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzUxOFwiLCBcbiAgICBcIl9pZFwiIDogXCJlZGdlcy83MzUxOFwiLCBcbiAgICBcIl9mcm9tXCIgOiBcImNpcmNsZXMvR1wiLCBcbiAgICBcIl90b1wiIDogXCJjaXJjbGVzL0hcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWZpLS1DXCIsIFxuICAgIFwidGhlRmFsc2VcIiA6IGZhbHNlLCBcbiAgICBcInRoZVRydXRoXCIgOiB0cnVlLCBcbiAgICBcImxhYmVsXCIgOiBcInJpZ2h0X2Jsb2JcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTIwXCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzczNTIwXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9IXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvSVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZm0tLS1cIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfYmx1YlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM1MjJcIiwgXG4gICAgXCJfaWRcIiA6IFwiZWRnZXMvNzM1MjJcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJjaXJjbGVzL0dcIiwgXG4gICAgXCJfdG9cIiA6IFwiY2lyY2xlcy9KXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVmbS0tX1wiLCBcbiAgICBcInRoZUZhbHNlXCIgOiBmYWxzZSwgXG4gICAgXCJ0aGVUcnV0aFwiIDogdHJ1ZSwgXG4gICAgXCJsYWJlbFwiIDogXCJyaWdodF96aXBcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczNTI0XCIsIFxuICAgIFwiX2lkXCIgOiBcImVkZ2VzLzczNTI0XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwiY2lyY2xlcy9KXCIsIFxuICAgIFwiX3RvXCIgOiBcImNpcmNsZXMvS1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVZm0tLUFcIiwgXG4gICAgXCJ0aGVGYWxzZVwiIDogZmFsc2UsIFxuICAgIFwidGhlVHJ1dGhcIiA6IHRydWUsIFxuICAgIFwibGFiZWxcIiA6IFwicmlnaHRfenVwXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImdyYXBoX2NyZWF0ZV90cmF2ZXJzYWxfc2FtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "graph_create_world_sample_single": { + "request": "LS0tCm5hbWU6IGdyYXBoX2NyZWF0ZV93b3JsZF9zYW1wbGUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgZXhhbXBsZXMgPSByZXF1aXJlKCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaCIpOwp2YXIgZyA9IGV4YW1wbGVzLmxvYWRHcmFwaCgid29ybGRDb3VudHJ5Iik7CmRiLndvcmxkVmVydGljZXMudG9BcnJheSgpOwpkYi53b3JsZEVkZ2VzLnRvQXJyYXkoKTsKZXhhbXBsZXMuZHJvcEdyYXBoKCJ3b3JsZENvdW50cnkiKTsKdmFyIGcgPSBleGFtcGxlcy5sb2FkR3JhcGgoIndvcmxkQ291bnRyeVVuTWFuYWdlZCIpOwpleGFtcGxlcy5kcm9wR3JhcGgoIndvcmxkQ291bnRyeVVuTWFuYWdlZCIpOw==", + "response": "eyJpbnB1dCI6InZhciBleGFtcGxlcyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ3JhcGgtZXhhbXBsZXMvZXhhbXBsZS1ncmFwaFwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwid29ybGRDb3VudHJ5XCIpO1xuZGIud29ybGRWZXJ0aWNlcy50b0FycmF5KCk7XG5kYi53b3JsZEVkZ2VzLnRvQXJyYXkoKTtcbmV4YW1wbGVzLmRyb3BHcmFwaChcIndvcmxkQ291bnRyeVwiKTtcbnZhciBnID0gZXhhbXBsZXMubG9hZEdyYXBoKFwid29ybGRDb3VudHJ5VW5NYW5hZ2VkXCIpO1xuZXhhbXBsZXMuZHJvcEdyYXBoKFwid29ybGRDb3VudHJ5VW5NYW5hZ2VkXCIpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIndvcmxkXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvd29ybGRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxHLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJXb3JsZFwiLCBcbiAgICBcInR5cGVcIiA6IFwicm9vdFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY29udGluZW50LWFmcmljYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxHLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJBZnJpY2FcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvbnRpbmVudFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY29udGluZW50LWFzaWFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbEstLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFzaWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvbnRpbmVudFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY29udGluZW50LWF1c3RyYWxpYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hdXN0cmFsaWFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxLLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJBdXN0cmFsaWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvbnRpbmVudFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY29udGluZW50LWV1cm9wZVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxLLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJFdXJvcGVcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvbnRpbmVudFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY29udGluZW50LW5vcnRoLWFtZXJpY2FcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtbm9ydGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbE8tLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIk5vcnRoIEFtZXJpY2FcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvbnRpbmVudFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY29udGluZW50LXNvdXRoLWFtZXJpY2FcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbE8tLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIlNvdXRoIEFtZXJpY2FcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvbnRpbmVudFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1hZmdoYW5pc3RhblwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWZnaGFuaXN0YW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxPLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJBZmdoYW5pc3RhblwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQUZHXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWFsYmFuaWFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFsYmFuaWFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxPLS1CXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbGJhbmlhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJBTEJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYWxnZXJpYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxnZXJpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbE8tLUNcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFsZ2VyaWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkRaQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1hbmRvcnJhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1hbmRvcnJhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVsUy0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQW5kb3JyYVwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQU5EXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWFuZ29sYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYW5nb2xhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVsUy0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQW5nb2xhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJBR09cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYW50aWd1YS1hbmQtYmFyYnVkYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYW50aWd1YS1hbmQtYmFyYnVkYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbGktLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFudGlndWEgYW5kIEJhcmJ1ZGFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkFUR1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1hcmdlbnRpbmFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFyZ2VudGluYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbGktLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkFyZ2VudGluYVwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQVJHXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWF1c3RyYWxpYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYXVzdHJhbGlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVsaS0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQXVzdHJhbGlhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJBVVNcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYXVzdHJpYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYXVzdHJpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbGktLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkF1c3RyaWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkFVVFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1iYWhhbWFzXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1iYWhhbWFzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVsaS0tQ1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQmFoYW1hc1wiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQkhTXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWJhaHJhaW5cIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhaHJhaW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxtLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJCYWhyYWluXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJCSFJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYmFuZ2xhZGVzaFwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYmFuZ2xhZGVzaFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbG0tLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkJhbmdsYWRlc2hcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkJHRFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1iYXJiYWRvc1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYmFyYmFkb3NcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWxtLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJCYXJiYWRvc1wiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQlJCXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWJlbGdpdW1cIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJlbGdpdW1cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWx1LS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJCZWxnaXVtXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJCRUxcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYmh1dGFuXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1iaHV0YW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWx1LS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJCaHV0YW5cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkJUTlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1ib2xpdmlhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1ib2xpdmlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVsdS0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQm9saXZpYVwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQk9MXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWJvc25pYS1hbmQtaGVyemVnb3ZpbmFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJvc25pYS1hbmQtaGVyemVnb3ZpbmFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWx1LS1CXCIsIFxuICAgIFwibmFtZVwiIDogXCJCb3NuaWEgYW5kIEhlcnplZ292aW5hXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJCSUhcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYm90c3dhbmFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJvdHN3YW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVsdS0tQ1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQm90c3dhbmFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkJXQVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1icmF6aWxcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJyYXppbFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbHktLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkJyYXppbFwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQlJBXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWJydW5laVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYnJ1bmVpXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVseS0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQnJ1bmVpXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJCUk5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktYnVsZ2FyaWFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJ1bGdhcmlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVseS0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQnVsZ2FyaWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkJHUlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1idXJraW5hLWZhc29cIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJ1cmtpbmEtZmFzb1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbHktLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkJ1cmtpbmEgRmFzb1wiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQkZBXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWJ1cnVuZGlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJ1cnVuZGlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVWwyLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJCdXJ1bmRpXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJCRElcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktY2FtYm9kaWFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNhbWJvZGlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtQy0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQ2FtYm9kaWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIktITVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1jYW1lcm9vblwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2FtZXJvb25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1DLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJDYW1lcm9vblwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQ01SXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWNhbmFkYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2FuYWRhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtQy0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQ2FuYWRhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJDQU5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktY2hhZFwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2hhZFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUMtLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkNoYWRcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIlRDRFwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1jaGlsZVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2hpbGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1DLS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJDaGlsZVwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQ0hMXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWNvbG9tYmlhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1jb2xvbWJpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUctLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkNvbG9tYmlhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJDT0xcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktY290ZS1kLWl2b2lyZVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY290ZS1kLWl2b2lyZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUctLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkNvdGUgZCdJdm9pcmVcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkNJVlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1jcm9hdGlhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1jcm9hdGlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtRy0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQ3JvYXRpYVwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiSFJWXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWN6ZWNoLXJlcHVibGljXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1jemVjaC1yZXB1YmxpY1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUctLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkN6ZWNoIFJlcHVibGljXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJDWkVcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktZGVubWFya1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZGVubWFya1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUctLUNcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkRlbm1hcmtcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkROS1wiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1lY3VhZG9yXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1lY3VhZG9yXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtRy0tRFwiLCBcbiAgICBcIm5hbWVcIiA6IFwiRWN1YWRvclwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiRUNVXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWVneXB0XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1lZ3lwdFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUstLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkVneXB0XCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJFR1lcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktZXJpdHJlYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZXJpdHJlYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUstLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkVyaXRyZWFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkVSSVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1maW5sYW5kXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1maW5sYW5kXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtSy0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiRmlubGFuZFwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiRklOXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjb3VudHJ5LWZyYW5jZVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZnJhbmNlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtSy0tQlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiRnJhbmNlXCIsIFxuICAgIFwidHlwZVwiIDogXCJjb3VudHJ5XCIsIFxuICAgIFwiY29kZVwiIDogXCJGUkFcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcImNvdW50cnktZ2VybWFueVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZ2VybWFueVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbUstLUNcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkdlcm1hbnlcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImNvdW50cnlcIiwgXG4gICAgXCJjb2RlXCIgOiBcIkRFVVwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiY291bnRyeS1wZW9wbGUtcy1yZXB1YmxpYy1vZi1jaGluYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktcGVvcGxlLXMtcmVwdWJsaWMtb2YtY2hpbmFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1PLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYVwiLCBcbiAgICBcInR5cGVcIiA6IFwiY291bnRyeVwiLCBcbiAgICBcImNvZGVcIiA6IFwiQ0hOXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWFsZ2llcnNcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWFsZ2llcnNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1PLS1fXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbGdpZXJzXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWFuZG9ycmEtbGEtdmVsbGFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWFuZG9ycmEtbGEtdmVsbGFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1PLS1BXCIsIFxuICAgIFwibmFtZVwiIDogXCJBbmRvcnJhIGxhIFZlbGxhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWFzbWFyYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYXNtYXJhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtTy0tQlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQXNtYXJhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJhbmRhci1zZXJpLWJlZ2F3YW5cIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWJhbmRhci1zZXJpLWJlZ2F3YW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1PLS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJCYW5kYXIgU2VyaSBCZWdhd2FuXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJlaWppbmdcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWJlaWppbmdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1TLS0tXCIsIFxuICAgIFwibmFtZVwiIDogXCJCZWlqaW5nXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJlcmxpblwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYmVybGluXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtUy0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQmVybGluXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJvZ290YVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYm9nb3RhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtUy0tQVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQm9nb3RhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJyYXNpbGlhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1icmFzaWxpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbVMtLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkJyYXNpbGlhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJyaWRnZXRvd25cIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWJyaWRnZXRvd25cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1TLS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJCcmlkZ2V0b3duXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJydXNzZWxzXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1icnVzc2Vsc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbVMtLURcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkJydXNzZWxzXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJ1ZW5vcy1haXJlc1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYnVlbm9zLWFpcmVzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtVy0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiQnVlbm9zIEFpcmVzXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWJ1anVtYnVyYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYnVqdW1idXJhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtVy0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiQnVqdW1idXJhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWNhaXJvXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1jYWlyb1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbVctLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkNhaXJvXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWNhbmJlcnJhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1jYW5iZXJyYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbVctLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkNhbmJlcnJhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWNvcGVuaGFnZW5cIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWNvcGVuaGFnZW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1XLS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJDb3BlbmhhZ2VuXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWRoYWthXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1kaGFrYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWEtLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkRoYWthXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWdhYm9yb25lXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1nYWJvcm9uZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWEtLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIkdhYm9yb25lXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWhlbHNpbmtpXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1oZWxzaW5raVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWEtLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkhlbHNpbmtpXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWthYnVsXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1rYWJ1bFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWEtLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIkthYnVsXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWxhLXBhelwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbGEtcGF6XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtYS0tQ1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiTGEgUGF6XCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLWx1YW5kYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbHVhbmRhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtYS0tRFwiLCBcbiAgICBcIm5hbWVcIiA6IFwiTHVhbmRhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLW1hbmFtYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbWFuYW1hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtYS0tRVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiTWFuYW1hXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLW5hc3NhdVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbmFzc2F1XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtYS0tRlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiTmFzc2F1XCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLW4tZGphbWVuYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbi1kamFtZW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtZS0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiTidEamFtZW5hXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLW90dGF3YVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtb3R0YXdhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtZS0tX1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiT3R0YXdhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLW91YWdhZG91Z291XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1vdWFnYWRvdWdvdVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWUtLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIk91YWdhZG91Z291XCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXBhcmlzXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1wYXJpc1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWUtLUJcIiwgXG4gICAgXCJuYW1lXCIgOiBcIlBhcmlzXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXBobm9tLXBlbmhcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXBobm9tLXBlbmhcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1lLS1DXCIsIFxuICAgIFwibmFtZVwiIDogXCJQaG5vbSBQZW5oXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXByYWd1ZVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtcHJhZ3VlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtZS0tRFwiLCBcbiAgICBcIm5hbWVcIiA6IFwiUHJhZ3VlXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXF1aXRvXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1xdWl0b1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWUtLUVcIiwgXG4gICAgXCJuYW1lXCIgOiBcIlF1aXRvXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXNhaW50LWpvaG4tc1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtc2FpbnQtam9obi1zXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtZS0tRlwiLCBcbiAgICBcIm5hbWVcIiA6IFwiU2FpbnQgSm9obidzXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXNhbnRpYWdvXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1zYW50aWFnb1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWktLS1cIiwgXG4gICAgXCJuYW1lXCIgOiBcIlNhbnRpYWdvXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXNhcmFqZXZvXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1zYXJhamV2b1wiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWktLV9cIiwgXG4gICAgXCJuYW1lXCIgOiBcIlNhcmFqZXZvXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXNvZmlhXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1zb2ZpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbWktLUFcIiwgXG4gICAgXCJuYW1lXCIgOiBcIlNvZmlhXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXRoaW1waHVcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXRoaW1waHVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1pLS1CXCIsIFxuICAgIFwibmFtZVwiIDogXCJUaGltcGh1XCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXRpcmFuYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtdGlyYW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtaS0tQ1wiLCBcbiAgICBcIm5hbWVcIiA6IFwiVGlyYW5hXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXZpZW5uYVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtdmllbm5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtaS0tRFwiLCBcbiAgICBcIm5hbWVcIiA6IFwiVmllbm5hXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXlhbW91c3NvdWtyb1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwteWFtb3Vzc291a3JvXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtaS0tRVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiWWFtb3Vzc291a3JvXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXlhb3VuZGVcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXlhb3VuZGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1pLS1GXCIsIFxuICAgIFwibmFtZVwiIDogXCJZYW91bmRlXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCJjYXBpdGFsLXphZ3JlYlwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtemFncmViXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtbS0tLVwiLCBcbiAgICBcIm5hbWVcIiA6IFwiWmFncmViXCIsIFxuICAgIFwidHlwZVwiIDogXCJjYXBpdGFsXCIgXG4gIH0gXG5dXG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODQzXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4NDNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy93b3JsZFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbW0tLV9cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg0NVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODQ1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL3dvcmxkXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtbS0tQVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODQ3XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4NDdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hdXN0cmFsaWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy93b3JsZFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbW0tLUJcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg0OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODQ5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvd29ybGRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1tLS1DXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4NTFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg1MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LW5vcnRoLWFtZXJpY2FcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy93b3JsZFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbW0tLURcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg1M1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODUzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL3dvcmxkXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtbS0tRVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODU1XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4NTVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWZnaGFuaXN0YW5cIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXEtLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg1N1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODU3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFsYmFuaWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtcS0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODU5XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4NTlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxnZXJpYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1xLS1BXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4NjFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg2MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1hbmRvcnJhXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXEtLUJcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg2M1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODYzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFuZ29sYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1xLS1DXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4NjVcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg2NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1hbnRpZ3VhLWFuZC1iYXJidWRhXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LW5vcnRoLWFtZXJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1xLS1EXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4NjdcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg2N1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1hcmdlbnRpbmFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXEtLUVcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg2OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODY5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWF1c3RyYWxpYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hdXN0cmFsaWFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW1xLS1GXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4NzFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg3MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1hdXN0cmlhXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXUtLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg3M1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODczXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhaGFtYXNcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtbm9ydGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXUtLV9cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg3NVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODc1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhaHJhaW5cIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXUtLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg3N1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODc3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhbmdsYWRlc2hcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXUtLUJcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg3OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODc5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhcmJhZG9zXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LW5vcnRoLWFtZXJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW11LS1DXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4ODFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg4MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1iZWxnaXVtXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXUtLURcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg4M1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODgzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJodXRhblwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hc2lhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtdS0tRVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODg1XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4ODVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYm9saXZpYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1zb3V0aC1hbWVyaWNhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtdS0tRlwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODg3XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4ODdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYm9zbmlhLWFuZC1oZXJ6ZWdvdmluYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW15LS0tXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4ODlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg4OVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1ib3Rzd2FuYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW15LS1fXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM4OTFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzg5MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1icmF6aWxcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbXktLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg5M1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODkzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJydW5laVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hc2lhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVteS0tQlwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODk1XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4OTVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYnVsZ2FyaWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVteS0tQ1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczODk3XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM4OTdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYnVya2luYS1mYXNvXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWFmcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbTItLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzg5OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczODk5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJ1cnVuZGlcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYWZyaWNhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtMi0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTAxXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MDFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2FtYm9kaWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYXNpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbTItLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkwM1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTAzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNhbWVyb29uXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWFmcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbTItLUJcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkwNVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTA1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNhbmFkYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ub3J0aC1hbWVyaWNhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtMi0tQ1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTA3XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MDdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2hhZFwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hZnJpY2FcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW0yLS1EXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5MDlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83MzkwOVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1jaGlsZVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1zb3V0aC1hbWVyaWNhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtMi0tRVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTExXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MTFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY29sb21iaWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbTYtLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkxM1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTEzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNvdGUtZC1pdm9pcmVcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYWZyaWNhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVtNi0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTE1XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MTVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY3JvYXRpYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW02LS1BXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5MTdcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83MzkxN1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1jemVjaC1yZXB1YmxpY1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW02LS1CXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5MTlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83MzkxOVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1kZW5tYXJrXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWV1cm9wZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbTYtLUNcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkyMVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTIxXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWVjdWFkb3JcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtc291dGgtYW1lcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbi0tLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkyM1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTIzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWVneXB0XCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY29udGluZW50LWFmcmljYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbi0tLV9cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkyNVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTI1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWVyaXRyZWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtYWZyaWNhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuLS0tQVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTI3XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MjdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZmlubGFuZFwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW4tLS1CXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5MjlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83MzkyOVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1mcmFuY2VcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb250aW5lbnQtZXVyb3BlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuLS0tQ1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTMxXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MzFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZ2VybWFueVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1ldXJvcGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5DLS0tXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5MzNcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83MzkzM1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1wZW9wbGUtcy1yZXB1YmxpYy1vZi1jaGluYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvbnRpbmVudC1hc2lhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuQy0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTM1XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5MzVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYWxnaWVyc1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxnZXJpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbkMtLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3MzkzN1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTM3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWFuZG9ycmEtbGEtdmVsbGFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFuZG9ycmFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5DLS1CXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5MzlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83MzkzOVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1hc21hcmFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWVyaXRyZWFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5DLS1DXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NDFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk0MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1iYW5kYXItc2VyaS1iZWdhd2FuXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1icnVuZWlcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5DLS1EXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NDNcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk0M1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1iZWlqaW5nXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1wZW9wbGUtcy1yZXB1YmxpYy1vZi1jaGluYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbkMtLUVcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk0NVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTQ1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWJlcmxpblwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZ2VybWFueVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbkctLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk0N1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTQ3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWJvZ290YVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY29sb21iaWFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5HLS1fXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NDlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk0OVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1icmFzaWxpYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYnJhemlsXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuRy0tQVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTUxXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NTFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYnJpZGdldG93blwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYmFyYmFkb3NcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5HLS1CXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NTNcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk1M1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1icnVzc2Vsc1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYmVsZ2l1bVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbkctLUNcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk1NVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTU1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWJ1ZW5vcy1haXJlc1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYXJnZW50aW5hXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuRy0tRFwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTU3XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NTdcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtYnVqdW1idXJhXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1idXJ1bmRpXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuSy0tLVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTU5XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NTlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtY2Fpcm9cIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWVneXB0XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuSy0tX1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTYxXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NjFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtY2FuYmVycmFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWF1c3RyYWxpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbkstLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk2M1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTYzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWNvcGVuaGFnZW5cIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWRlbm1hcmtcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5PLS0tXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NjVcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk2NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1kaGFrYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYmFuZ2xhZGVzaFwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbk8tLV9cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk2N1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTY3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWdhYm9yb25lXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1ib3Rzd2FuYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbk8tLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk2OVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTY5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLWhlbHNpbmtpXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1maW5sYW5kXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuTy0tQlwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTcxXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NzFcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwta2FidWxcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFmZ2hhbmlzdGFuXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuTy0tQ1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTczXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NzNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbGEtcGF6XCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1ib2xpdmlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuTy0tRFwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTc1XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5NzVcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtbHVhbmRhXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1hbmdvbGFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5PLS1FXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NzdcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk3N1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1tYW5hbWFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhaHJhaW5cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5PLS1GXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5NzlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk3OVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1uYXNzYXVcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJhaGFtYXNcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5TLS0tXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5ODFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk4MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1uLWRqYW1lbmFcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNoYWRcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5TLS1fXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5ODNcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk4M1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1vdHRhd2FcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNhbmFkYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVblMtLUFcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3Mzk4NVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzczOTg1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLW91YWdhZG91Z291XCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1idXJraW5hLWZhc29cIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5TLS1CXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5ODdcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk4N1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1wYXJpc1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktZnJhbmNlXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuUy0tQ1wiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTg5XCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5ODlcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtcGhub20tcGVuaFwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2FtYm9kaWFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5TLS1EXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5OTFcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk5MVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1wcmFndWVcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWN6ZWNoLXJlcHVibGljXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuUy0tRVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjczOTkzXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzM5OTNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtcXVpdG9cIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWVjdWFkb3JcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5XLS0tXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5OTVcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk5NVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1zYWludC1qb2huLXNcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWFudGlndWEtYW5kLWJhcmJ1ZGFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5XLS1fXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5OTdcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk5N1wiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1zYW50aWFnb1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY2hpbGVcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNhVW5XLS1BXCIsIFxuICAgIFwidHlwZVwiIDogXCJpcy1pblwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNzM5OTlcIiwgXG4gICAgXCJfaWRcIiA6IFwid29ybGRFZGdlcy83Mzk5OVwiLCBcbiAgICBcIl9mcm9tXCIgOiBcIndvcmxkVmVydGljZXMvY2FwaXRhbC1zYXJhamV2b1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYm9zbmlhLWFuZC1oZXJ6ZWdvdmluYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVblctLUJcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDAwMVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzc0MDAxXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXNvZmlhXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1idWxnYXJpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVblctLUNcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDAwM1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzc0MDAzXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXRoaW1waHVcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWJodXRhblwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVblctLURcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDAwNVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzc0MDA1XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXRpcmFuYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYWxiYW5pYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVblctLUVcIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDAwN1wiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzc0MDA3XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXZpZW5uYVwiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktYXVzdHJpYVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbmEtLS1cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDAwOVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzc0MDA5XCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXlhbW91c3NvdWtyb1wiLCBcbiAgICBcIl90b1wiIDogXCJ3b3JsZFZlcnRpY2VzL2NvdW50cnktY290ZS1kLWl2b2lyZVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M2FVbmEtLV9cIiwgXG4gICAgXCJ0eXBlXCIgOiBcImlzLWluXCIgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI3NDAxMVwiLCBcbiAgICBcIl9pZFwiIDogXCJ3b3JsZEVkZ2VzLzc0MDExXCIsIFxuICAgIFwiX2Zyb21cIiA6IFwid29ybGRWZXJ0aWNlcy9jYXBpdGFsLXlhb3VuZGVcIiwgXG4gICAgXCJfdG9cIiA6IFwid29ybGRWZXJ0aWNlcy9jb3VudHJ5LWNhbWVyb29uXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuYS0tQVwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjc0MDEzXCIsIFxuICAgIFwiX2lkXCIgOiBcIndvcmxkRWRnZXMvNzQwMTNcIiwgXG4gICAgXCJfZnJvbVwiIDogXCJ3b3JsZFZlcnRpY2VzL2NhcGl0YWwtemFncmViXCIsIFxuICAgIFwiX3RvXCIgOiBcIndvcmxkVmVydGljZXMvY291bnRyeS1jcm9hdGlhXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzYVVuYS0tQlwiLCBcbiAgICBcInR5cGVcIiA6IFwiaXMtaW5cIiBcbiAgfSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiZ3JhcGhfY3JlYXRlX3dvcmxkX3NhbXBsZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "hybridSmartGraphCreateGraphHowTo1_cluster": { + "request": "LS0tCm5hbWU6IGh5YnJpZFNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvMQpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp2YXIgcmVsID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiaXNDdXN0b21lciIsICJzaG9wIiwgImN1c3RvbWVyIikKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBbcmVsXSwgW10sIHtzYXRlbGxpdGVzOiBbInNob3AiLCAiY3VzdG9tZXIiXSwgc21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIHJlbCA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJpc0N1c3RvbWVyXCIsIFwic2hvcFwiLCBcImN1c3RvbWVyXCIpXG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW3JlbF0sIFtdLCB7c2F0ZWxsaXRlczogW1wic2hvcFwiLCBcImN1c3RvbWVyXCJdLCBzbWFydEdyYXBoQXR0cmlidXRlOiBcInJlZ2lvblwiLCBudW1iZXJPZlNoYXJkczogOX0pO1xuZ3JhcGg7Iiwib3V0cHV0Ijoie1tTbWFydEdyYXBoXSBcbiAgXCJpc0N1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExMTgwLCBcImlzQ3VzdG9tZXJcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInNob3BcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTExNzgsIFwic2hvcFwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcImN1c3RvbWVyXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExMTc5LCBcImN1c3RvbWVyXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiaHlicmlkU21hcnRHcmFwaENyZWF0ZUdyYXBoSG93VG8xIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "hybridSmartGraphCreateGraphHowTo2_cluster": { + "request": "LS0tCm5hbWU6IGh5YnJpZFNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvMgpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp2YXIgcmVsID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiaXNDdXN0b21lciIsICJzaG9wIiwgImN1c3RvbWVyIikKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBbcmVsXSwgW10sIHtzYXRlbGxpdGVzOiBbInNob3AiXSwgc21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIGlzRGlzam9pbnQ6IHRydWUsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIHJlbCA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJpc0N1c3RvbWVyXCIsIFwic2hvcFwiLCBcImN1c3RvbWVyXCIpXG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW3JlbF0sIFtdLCB7c2F0ZWxsaXRlczogW1wic2hvcFwiXSwgc21hcnRHcmFwaEF0dHJpYnV0ZTogXCJyZWdpb25cIiwgaXNEaXNqb2ludDogdHJ1ZSwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoOyIsIm91dHB1dCI6IntbU21hcnRHcmFwaF0gXG4gIFwiaXNDdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTIwMywgXCJpc0N1c3RvbWVyXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJzaG9wXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExMjAyLCBcInNob3BcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJjdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTE5MiwgXCJjdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Imh5YnJpZFNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvMiIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "job_cancel_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiAnJwpuYW1lOiBqb2JfY2FuY2VsCi0tLQp2YXIgdXJsID0gIi9fYXBpL2N1cnNvciI7CnZhciBoZWFkZXJzID0geyd4LWFyYW5nby1hc3luYycgOiAnc3RvcmUnfTsKdmFyIHBvc3REYXRhID0geyJxdWVyeSI6CiAgICJGT1IgaSBJTiAxLi4xMCBGT1IgaiBJTiAxLi4xMCBMRVQgeCA9IHNsZWVwKDEuMCkgRklMVEVSIGkgPT0gNSAmJiBqID09IDUgUkVUVVJOIDQyIn0KCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBwb3N0RGF0YSwgaGVhZGVycyk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7Cgp2YXIgcXVlcnlJZCA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtYXJhbmdvLWFzeW5jLWlkJ107CnVybCA9ICcvX2FwaS9qb2IvcGVuZGluZyc7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCnVybCA9ICcvX2FwaS9qb2IvJyArIHF1ZXJ5SWQgKyAnL2NhbmNlbCcKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgIiIpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTsKCnVybCA9ICcvX2FwaS9qb2IvcGVuZGluZyc7CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAneC1hcmFuZ28tYXN5bmM6IHN0b3JlJyAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9jdXJzb3InIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwicXVlcnlcIjogXCJGT1IgaSBJTiAxLi4xMCBGT1IgaiBJTiAxLi4xMCBMRVQgeCA9IHNsZWVwKDEuMCkgRklMVEVSIGkgPT0gNSBcdTAwMjZcdTAwMjYgaiA9PSA1IFJFVFVSTiA0MlwiXG59XG5FT0ZcblxuY3VybCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvam9iL3BlbmRpbmcnXG5cbmN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvNjg4MjQvY2FuY2VsJ1xuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvcGVuZGluZyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgyNFxueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgXCI2ODgyNFwiIFxuXVxuXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJyZXN1bHRcIiA6IHRydWUgXG59XG5cblxuSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA5XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIFwiNjg4MjRcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoiam9iX2NhbmNlbCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "job_delete_01_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIERlbGV0aW5nIGFsbCBqb2JzOgpuYW1lOiBqb2JfZGVsZXRlXzAxCi0tLQp2YXIgdXJsID0gIi9fYXBpL3ZlcnNpb24iOwp2YXIgaGVhZGVycyA9IHsneC1hcmFuZ28tYXN5bmMnIDogJ3N0b3JlJ307CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiLCBoZWFkZXJzKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7Cgp1cmwgPSAnL19hcGkvam9iL2FsbCcKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0RFTEVURScsIHVybCwgIiIpOwphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAwKTsKbG9nSnNvblJlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC1YIERFTEVURSAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvam9iL2FsbCciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgyN1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkRlbGV0aW5nIGFsbCBqb2JzOiIsIm5hbWUiOiJqb2JfZGVsZXRlXzAxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "job_delete_02_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIERlbGV0aW5nIGV4cGlyZWQgam9iczoKbmFtZTogam9iX2RlbGV0ZV8wMgotLS0KdmFyIHVybCA9ICIvX2FwaS92ZXJzaW9uIjsKdmFyIGhlYWRlcnMgPSB7J3gtYXJhbmdvLWFzeW5jJyA6ICdzdG9yZSd9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAiIiwgaGVhZGVycyk7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gMjAyKTsKbG9nUmF3UmVzcG9uc2UocmVzcG9uc2UpOwoKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsICIvX2FkbWluL3RpbWUiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7Cm5vdyA9IHJlc3BvbnNlLnBhcnNlZEJvZHkudGltZTsKCnVybCA9ICcvX2FwaS9qb2IvZXhwaXJlZD9zdGFtcD0nICsgbm93CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7Cgp1cmwgPSAnL19hcGkvam9iL3BlbmRpbmcnOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FkbWluL3RpbWUnXG5cbmN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvZXhwaXJlZD9zdGFtcD0xNzQ4MDI0MTcyLjcyMDc2NydcblxuY3VybCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvam9iL3BlbmRpbmcnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IHRleHQvcGxhaW5cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1hc3luYy1pZDogNjg4MjhcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA1MVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImVycm9yXCIgOiBmYWxzZSwgXG4gIFwiY29kZVwiIDogMjAwLCBcbiAgXCJ0aW1lXCIgOiAxNzQ4MDI0MTcyLjcyMDc2NyBcbn1cblxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE1XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbnsgXG4gIFwicmVzdWx0XCIgOiB0cnVlIFxufVxuXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMlxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5bIF0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJEZWxldGluZyBleHBpcmVkIGpvYnM6IiwibmFtZSI6ImpvYl9kZWxldGVfMDIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "job_delete_03_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIERlbGV0aW5nIHRoZSByZXN1bHQgb2YgYSBzcGVjaWZpYyBqb2I6Cm5hbWU6IGpvYl9kZWxldGVfMDMKLS0tCnZhciB1cmwgPSAiL19hcGkvdmVyc2lvbiI7CnZhciBoZWFkZXJzID0geyd4LWFyYW5nby1hc3luYycgOiAnc3RvcmUnfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgIiIsIGhlYWRlcnMpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CmxvZ1Jhd1Jlc3BvbnNlKHJlc3BvbnNlKTsKCnZhciBxdWVyeUlkID0gcmVzcG9uc2UuaGVhZGVyc1sneC1hcmFuZ28tYXN5bmMtaWQnXTsKdXJsID0gJy9fYXBpL2pvYi8nICsgcXVlcnlJZAp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsLCAiIik7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC1YIERFTEVURSAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvam9iLzY4ODI5JyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiB0ZXh0L3BsYWluXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tYXN5bmMtaWQ6IDY4ODI5XG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMTVcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJyZXN1bHRcIiA6IHRydWUgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGVsZXRpbmcgdGhlIHJlc3VsdCBvZiBhIHNwZWNpZmljIGpvYjoiLCJuYW1lIjoiam9iX2RlbGV0ZV8wMyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "job_delete_04_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIERlbGV0aW5nIHRoZSByZXN1bHQgb2YgYSBub24tZXhpc3Rpbmcgam9iOgpuYW1lOiBqb2JfZGVsZXRlXzA0Ci0tLQp1cmwgPSAnL19hcGkvam9iL0FyZVlvdVRoZXJlJwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnREVMRVRFJywgdXJsLCAiIik7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSA0MDQpOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvQXJlWW91VGhlcmUnIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwibm90IGZvdW5kXCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDQgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRGVsZXRpbmcgdGhlIHJlc3VsdCBvZiBhIG5vbi1leGlzdGluZyBqb2I6IiwibmFtZSI6ImpvYl9kZWxldGVfMDQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "job_fetch_result_01_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIE5vdCBwcm92aWRpbmcgYSBgam9iLWlkYDoKbmFtZTogam9iX2ZldGNoX3Jlc3VsdF8wMQotLS0KdmFyIHVybCA9ICIvX2FwaS9qb2IiOwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAiIik7Cgphc3NlcnQocmVzcG9uc2UuY29kZSA9PT0gNDAwKTsKCmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2InIiwib3V0cHV0IjoiSFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiA3MVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJiYWQgcGFyYW1ldGVyXCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiTm90IHByb3ZpZGluZyBhIGBqb2ItaWRgOiIsIm5hbWUiOiJqb2JfZmV0Y2hfcmVzdWx0XzAxIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "job_fetch_result_02_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFByb3ZpZGluZyBhIGBqb2ItaWRgIGZvciBhIG5vbi1leGlzdGluZyBqb2I6Cm5hbWU6IGpvYl9mZXRjaF9yZXN1bHRfMDIKLS0tCnZhciB1cmwgPSAiL19hcGkvam9iL25vdHRoZXJlIjsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgIiIpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwNCk7Cgpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2Ivbm90dGhlcmUnIiwib3V0cHV0IjoiSFRUUC8xLjEgNDA0IE5vdCBGb3VuZFxuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjdcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxueyBcbiAgXCJjb2RlXCIgOiA0MDQsIFxuICBcImVycm9yXCIgOiB0cnVlLCBcbiAgXCJlcnJvck1lc3NhZ2VcIiA6IFwibm90IGZvdW5kXCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDQgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUHJvdmlkaW5nIGEgYGpvYi1pZGAgZm9yIGEgbm9uLWV4aXN0aW5nIGpvYjoiLCJuYW1lIjoiam9iX2ZldGNoX3Jlc3VsdF8wMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "job_fetch_result_03_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSByZXN1bHQgb2YgYW4gSFRUUCBHRVQgam9iOgpuYW1lOiBqb2JfZmV0Y2hfcmVzdWx0XzAzCi0tLQp2YXIgdXJsID0gIi9fYXBpL3ZlcnNpb24iOwp2YXIgaGVhZGVycyA9IHsneC1hcmFuZ28tYXN5bmMnIDogJ3N0b3JlJ307CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiLCBoZWFkZXJzKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7Cgp2YXIgcXVlcnlJZCA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtYXJhbmdvLWFzeW5jLWlkJ107CnVybCA9ICcvX2FwaS9qb2IvJyArIHF1ZXJ5SWQ7Cgpmb3IgKGxldCBpID0gMTsgaSA8PSAxMDsgaSsrKSB7CiAgdmFyIHN0YXR1cyA9IGFyYW5nby5HRVRfUkFXKHVybCk7CiAgaWYgKCFzdGF0dXMuaGVhZGVyc1sneC1hcmFuZ28tYXN5bmMtaWQnXSAmJiBzdGF0dXMuY29kZSA9PSAyMDQpIHsKICAgIGludGVybmFsLnNsZWVwKDAuMSAqIGkgKiBpKTsKICB9IGVsc2UgewogICAgYnJlYWs7CiAgfQp9Cgp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCAiIik7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDApOwpsb2dKc29uUmVzcG9uc2UocmVzcG9uc2UpOw==", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC1YIFBVVCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvam9iLzY4ODIyJyIsIm91dHB1dCI6IkhUVFAvMS4xIDIwMiBBY2NlcHRlZFxuY29udGVudC10eXBlOiB0ZXh0L3BsYWluXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tYXN5bmMtaWQ6IDY4ODIyXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cbkhUVFAvMS4xIDIwMCBPS1xuY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogNjJcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgyMlxueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInNlcnZlclwiIDogXCJhcmFuZ29cIiwgXG4gIFwibGljZW5zZVwiIDogXCJlbnRlcnByaXNlXCIsIFxuICBcInZlcnNpb25cIiA6IFwiMy4xMS4xNFwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkZldGNoaW5nIHRoZSByZXN1bHQgb2YgYW4gSFRUUCBHRVQgam9iOiIsIm5hbWUiOiJqb2JfZmV0Y2hfcmVzdWx0XzAzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "job_fetch_result_04_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSByZXN1bHQgb2YgYW4gSFRUUCBQT1NUIGpvYiB0aGF0IGZhaWxlZDoKbmFtZTogam9iX2ZldGNoX3Jlc3VsdF8wNAotLS0KdmFyIHVybCA9ICIvX2FwaS9jb2xsZWN0aW9uIjsKdmFyIGhlYWRlcnMgPSB7J3gtYXJhbmdvLWFzeW5jJyA6ICdzdG9yZSd9Owp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnUFVUJywgdXJsLCB7Im5hbWUiOiIgdGhpcyBuYW1lIGlzIGludmFsaWQgIn0sIGhlYWRlcnMpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CmxvZ1Jhd1Jlc3BvbnNlKHJlc3BvbnNlKTsKCnZhciBxdWVyeUlkID0gcmVzcG9uc2UuaGVhZGVyc1sneC1hcmFuZ28tYXN5bmMtaWQnXTsKdXJsID0gJy9fYXBpL2pvYi8nICsgcXVlcnlJZDsKCmZvciAobGV0IGkgPSAxOyBpIDw9IDEwOyBpKyspIHsKICB2YXIgc3RhdHVzID0gYXJhbmdvLkdFVF9SQVcodXJsKTsKICBpZiAoIXN0YXR1cy5oZWFkZXJzWyd4LWFyYW5nby1hc3luYy1pZCddICYmIHN0YXR1cy5jb2RlID09IDIwNCkgewogICAgaW50ZXJuYWwuc2xlZXAoMC4xICogaSAqIGkpOwogIH0gZWxzZSB7CiAgICBicmVhazsKICB9Cn0KCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDQwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZGF0YS1iaW5hcnkgQC0gLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2NvbGxlY3Rpb24nIFx1MDAzY1x1MDAzYydFT0YnXG57XG4gIFwibmFtZVwiOiBcIiB0aGlzIG5hbWUgaXMgaW52YWxpZCBcIlxufVxuRU9GXG5cbmN1cmwgLVggUFVUIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvNjg4MjMnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IHRleHQvcGxhaW5cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1hc3luYy1pZDogNjg4MjNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuSFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0XG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxMTRcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgyM1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcImNvZGVcIiA6IDQwMCwgXG4gIFwiZXJyb3JcIiA6IHRydWUsIFxuICBcImVycm9yTWVzc2FnZVwiIDogXCJleHBlY3RlZCBQVVQgL19hcGkvY29sbGVjdGlvbi9cdTAwM2Njb2xsZWN0aW9uLW5hbWVcdTAwM2UvXHUwMDNjYWN0aW9uXHUwMDNlXCIsIFxuICBcImVycm9yTnVtXCIgOiA0MDAgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiRmV0Y2hpbmcgdGhlIHJlc3VsdCBvZiBhbiBIVFRQIFBPU1Qgam9iIHRoYXQgZmFpbGVkOiIsIm5hbWUiOiJqb2JfZmV0Y2hfcmVzdWx0XzA0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "job_getByType_01_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSBsaXN0IG9mIGBkb25lYCBqb2JzOgpuYW1lOiBqb2JfZ2V0QnlUeXBlXzAxCi0tLQp2YXIgdXJsID0gIi9fYXBpL3ZlcnNpb24iOwp2YXIgaGVhZGVycyA9IHsneC1hcmFuZ28tYXN5bmMnIDogJ3N0b3JlJ307CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiLCBoZWFkZXJzKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7Cgp1cmwgPSAnL19hcGkvam9iL2RvbmUnCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvZG9uZSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgzM1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDE3XG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmXG5cblsgXG4gIFwiNjg4MzNcIiwgXG4gIFwiNjg4MzBcIiBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJGZXRjaGluZyB0aGUgbGlzdCBvZiBgZG9uZWAgam9iczoiLCJuYW1lIjoiam9iX2dldEJ5VHlwZV8wMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "job_getByType_02_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSBsaXN0IG9mIGBwZW5kaW5nYCBqb2JzOgpuYW1lOiBqb2JfZ2V0QnlUeXBlXzAyCi0tLQp2YXIgdXJsID0gIi9fYXBpL3ZlcnNpb24iOwp2YXIgaGVhZGVycyA9IHsneC1hcmFuZ28tYXN5bmMnIDogJ3N0b3JlJ307CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQVVQnLCB1cmwsICIiLCBoZWFkZXJzKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7Cgp1cmwgPSAnL19hcGkvam9iL3BlbmRpbmcnCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdHRVQnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvcGVuZGluZyciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgzNFxueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5IVFRQLzEuMSAyMDAgT0tcbmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDlcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuWyBcbiAgXCI2ODgzMVwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkZldGNoaW5nIHRoZSBsaXN0IG9mIGBwZW5kaW5nYCBqb2JzOiIsIm5hbWUiOiJqb2JfZ2V0QnlUeXBlXzAyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "job_getByType_03_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIEZldGNoaW5nIHRoZSBsaXN0IG9mIGEgYHBlbmRpbmdgIGpvYnMgd2hpbGUgYSBsb25nLXJ1bm5pbmcgam9iIGlzIGV4ZWN1dGluZwogIChhbmQgYWJvcnRpbmcgaXQpOgpuYW1lOiBqb2JfZ2V0QnlUeXBlXzAzCi0tLQp2YXIgdXJsID0gIi9fYXBpL3RyYW5zYWN0aW9uIjsKdmFyIGJvZHkgPSB7CiAgY29sbGVjdGlvbnM6IHsKICAgIHJlYWQgOiBbICJfZnJvbnRlbmQiIF0KICB9LAogIGFjdGlvbjogImZ1bmN0aW9uICgpIHtyZXF1aXJlKCdpbnRlcm5hbCcpLnNsZWVwKDE1LjApO30iCn07CnZhciBoZWFkZXJzID0geyd4LWFyYW5nby1hc3luYycgOiAnc3RvcmUnfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGJvZHksIGhlYWRlcnMpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CmxvZ1Jhd1Jlc3BvbnNlKHJlc3BvbnNlKTsKCnZhciBxdWVyeUlkID0gcmVzcG9uc2UuaGVhZGVyc1sneC1hcmFuZ28tYXN5bmMtaWQnXTsKdXJsID0gJy9fYXBpL2pvYi9wZW5kaW5nJwp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7Cgp1cmwgPSAnL19hcGkvam9iLycgKyBxdWVyeUlkCnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdERUxFVEUnLCB1cmwsICIiKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ0pzb25SZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAneC1hcmFuZ28tYXN5bmM6IHN0b3JlJyAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJyZWFkXCI6IFtcbiAgICAgIFwiX2Zyb250ZW5kXCJcbiAgICBdXG4gIH0sXG4gIFwiYWN0aW9uXCI6IFwiZnVuY3Rpb24gKCkge3JlcXVpcmUoJ2ludGVybmFsJykuc2xlZXAoMTUuMCk7fVwiXG59XG5FT0ZcblxuY3VybCAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWR1bXAgLSAnaHR0cDovL2xvY2FsaG9zdDo4NTI5L19hcGkvam9iL3BlbmRpbmcnXG5cbmN1cmwgLVggREVMRVRFIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvNjg4MzUnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IHRleHQvcGxhaW5cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1hc3luYy1pZDogNjg4MzVcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxN1xuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5bIFxuICBcIjY4ODM1XCIsIFxuICBcIjY4ODMxXCIgXG5dXG5cblxuSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAxNVxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG57IFxuICBcInJlc3VsdFwiIDogdHJ1ZSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiJGZXRjaGluZyB0aGUgbGlzdCBvZiBhIGBwZW5kaW5nYCBqb2JzIHdoaWxlIGEgbG9uZy1ydW5uaW5nIGpvYiBpcyBleGVjdXRpbmdcbihhbmQgYWJvcnRpbmcgaXQpOiIsIm5hbWUiOiJqb2JfZ2V0QnlUeXBlXzAzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "job_getStatusById_01_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFF1ZXJ5aW5nIHRoZSBzdGF0dXMgb2YgYSBkb25lIGpvYjoKbmFtZTogam9iX2dldFN0YXR1c0J5SWRfMDEKLS0tCnZhciB1cmwgPSAiL19hcGkvdmVyc2lvbiI7CnZhciBoZWFkZXJzID0geyd4LWFyYW5nby1hc3luYycgOiAnc3RvcmUnfTsKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ1BVVCcsIHVybCwgIiIsIGhlYWRlcnMpOwoKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMik7CmxvZ1Jhd1Jlc3BvbnNlKHJlc3BvbnNlKTsKCnZhciBxdWVyeUlkID0gcmVzcG9uc2UuaGVhZGVyc1sneC1hcmFuZ28tYXN5bmMtaWQnXTsKdXJsID0gJy9fYXBpL2pvYi8nICsgcXVlcnlJZAp2YXIgcmVzcG9uc2UgPSBsb2dDdXJsUmVxdWVzdCgnR0VUJywgdXJsKTsKYXNzZXJ0KHJlc3BvbnNlLmNvZGUgPT09IDIwMCk7CmxvZ1Jhd1Jlc3BvbnNlKHJlc3BvbnNlKTs=", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUFVUIC0taGVhZGVyICd4LWFyYW5nby1hc3luYzogc3RvcmUnIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS92ZXJzaW9uJ1xuXG5jdXJsIC0taGVhZGVyICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS9qb2IvNjg4MzAnIiwib3V0cHV0IjoiSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG5jb250ZW50LXR5cGU6IHRleHQvcGxhaW5cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1hc3luYy1pZDogNjg4MzBcbngtYXJhbmdvLXF1ZXVlLXRpbWUtc2Vjb25kczogMC4wMDAwMDBcbngtY29udGVudC10eXBlLW9wdGlvbnM6IG5vc25pZmZcblxuSFRUUC8xLjEgMjAwIE9LXG5jb250ZW50LXR5cGU6IHRleHQvcGxhaW5cbmNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAsIHMtbWF4YWdlPTBcbmNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbmNvbnRlbnQtbGVuZ3RoOiAwXG5jb250ZW50LXNlY3VyaXR5LXBvbGljeTogZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsgZm9ybS1hY3Rpb24gJ3NlbGYnO1xuZXhwaXJlczogMFxucHJhZ21hOiBuby1jYWNoZVxuc2VydmVyOiBBcmFuZ29EQlxuc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eTogbWF4LWFnZT0zMTUzNjAwMCA7IGluY2x1ZGVTdWJEb21haW5zXG54LWFyYW5nby1xdWV1ZS10aW1lLXNlY29uZHM6IDAuMDAwMDAwXG54LWNvbnRlbnQtdHlwZS1vcHRpb25zOiBub3NuaWZmIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiUXVlcnlpbmcgdGhlIHN0YXR1cyBvZiBhIGRvbmUgam9iOiIsIm5hbWUiOiJqb2JfZ2V0U3RhdHVzQnlJZF8wMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "job_getStatusById_02_single": { + "request": "LS0tCmRlc2NyaXB0aW9uOiB8LQogIFF1ZXJ5aW5nIHRoZSBzdGF0dXMgb2YgYSBwZW5kaW5nIGpvYjoKICAodGhlcmVmb3JlIHdlIGNyZWF0ZSBhIGxvbmcgcnVubmluZyBqb2IuLi4pCm5hbWU6IGpvYl9nZXRTdGF0dXNCeUlkXzAyCi0tLQp2YXIgdXJsID0gIi9fYXBpL3RyYW5zYWN0aW9uIjsKdmFyIGJvZHkgPSB7CiAgY29sbGVjdGlvbnM6IHsKICAgIHJlYWQgOiBbICJfYXFsZnVuY3Rpb25zIiBdCiAgfSwKICBhY3Rpb246ICJmdW5jdGlvbiAoKSB7cmVxdWlyZSgnaW50ZXJuYWwnKS5zbGVlcCgxNS4wKTt9Igp9Owp2YXIgaGVhZGVycyA9IHsneC1hcmFuZ28tYXN5bmMnIDogJ3N0b3JlJ307CnZhciByZXNwb25zZSA9IGxvZ0N1cmxSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5LCBoZWFkZXJzKTsKCmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDIpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7Cgp2YXIgcXVlcnlJZCA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtYXJhbmdvLWFzeW5jLWlkJ107CnVybCA9ICcvX2FwaS9qb2IvJyArIHF1ZXJ5SWQKdmFyIHJlc3BvbnNlID0gbG9nQ3VybFJlcXVlc3QoJ0dFVCcsIHVybCk7CmFzc2VydChyZXNwb25zZS5jb2RlID09PSAyMDQpOwpsb2dSYXdSZXNwb25zZShyZXNwb25zZSk7", + "response": "eyJpbnB1dCI6ImN1cmwgLVggUE9TVCAtLWhlYWRlciAneC1hcmFuZ28tYXN5bmM6IHN0b3JlJyAtLWhlYWRlciAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyAtLWRhdGEtYmluYXJ5IEAtIC0tZHVtcCAtICdodHRwOi8vbG9jYWxob3N0Ojg1MjkvX2FwaS90cmFuc2FjdGlvbicgXHUwMDNjXHUwMDNjJ0VPRidcbntcbiAgXCJjb2xsZWN0aW9uc1wiOiB7XG4gICAgXCJyZWFkXCI6IFtcbiAgICAgIFwiX2FxbGZ1bmN0aW9uc1wiXG4gICAgXVxuICB9LFxuICBcImFjdGlvblwiOiBcImZ1bmN0aW9uICgpIHtyZXF1aXJlKCdpbnRlcm5hbCcpLnNsZWVwKDE1LjApO31cIlxufVxuRU9GXG5cbmN1cmwgLS1oZWFkZXIgJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgLS1kdW1wIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9fYXBpL2pvYi82ODgzMSciLCJvdXRwdXQiOiJIVFRQLzEuMSAyMDIgQWNjZXB0ZWRcbmNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxuY2FjaGUtY29udHJvbDogbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MFxuY29ubmVjdGlvbjogS2VlcC1BbGl2ZVxuY29udGVudC1sZW5ndGg6IDBcbmNvbnRlbnQtc2VjdXJpdHktcG9saWN5OiBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyBmb3JtLWFjdGlvbiAnc2VsZic7XG5leHBpcmVzOiAwXG5wcmFnbWE6IG5vLWNhY2hlXG5zZXJ2ZXI6IEFyYW5nb0RCXG5zdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwIDsgaW5jbHVkZVN1YkRvbWFpbnNcbngtYXJhbmdvLWFzeW5jLWlkOiA2ODgzMVxueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZlxuXG5IVFRQLzEuMSAyMDQgTm8gQ29udGVudFxuY29udGVudC10eXBlOiB0ZXh0L3BsYWluXG5jYWNoZS1jb250cm9sOiBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wLCBzLW1heGFnZT0wXG5jb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5jb250ZW50LWxlbmd0aDogMFxuY29udGVudC1zZWN1cml0eS1wb2xpY3k6IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IGZvcm0tYWN0aW9uICdzZWxmJztcbmV4cGlyZXM6IDBcbnByYWdtYTogbm8tY2FjaGVcbnNlcnZlcjogQXJhbmdvREJcbnN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHk6IG1heC1hZ2U9MzE1MzYwMDAgOyBpbmNsdWRlU3ViRG9tYWluc1xueC1hcmFuZ28tcXVldWUtdGltZS1zZWNvbmRzOiAwLjAwMDAwMFxueC1jb250ZW50LXR5cGUtb3B0aW9uczogbm9zbmlmZiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IlF1ZXJ5aW5nIHRoZSBzdGF0dXMgb2YgYSBwZW5kaW5nIGpvYjpcbih0aGVyZWZvcmUgd2UgY3JlYXRlIGEgbG9uZyBydW5uaW5nIGpvYi4uLikiLCJuYW1lIjoiam9iX2dldFN0YXR1c0J5SWRfMDIiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "joinTuples_single": { + "request": "LS0tCm5hbWU6IGpvaW5UdXBsZXMKZGVzY3JpcHRpb246ICcnCmRhdGFzZXQ6IGpvaW5TYW1wbGVEYXRhc2V0CmJpbmRWYXJzOiAKICB7CiAgImZyaWVuZCI6ICJmcmllbmQiCiAgfQotLS0KRk9SIHUgSU4gdXNlcnMKICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZQogIExJTUlUIDAsIDQKICBGT1IgZiBJTiByZWxhdGlvbnMKICAgIEZJTFRFUiBmLnR5cGUgPT0gQGZyaWVuZCAmJiBmLmZyaWVuZE9mID09IHUudXNlcklkCiAgICBSRVRVUk4gewogICAgICAidXNlciIgOiB1Lm5hbWUsCiAgICAgICJmcmllbmRJZCIgOiBmLnRoaXNVc2VyCiAgICB9", + "response": "eyJpbnB1dCI6IkZPUiB1IElOIHVzZXJzXG4gIEZJTFRFUiB1LmFjdGl2ZSA9PSB0cnVlXG4gIExJTUlUIDAsIDRcbiAgRk9SIGYgSU4gcmVsYXRpb25zXG4gICAgRklMVEVSIGYudHlwZSA9PSBAZnJpZW5kIFx1MDAyNlx1MDAyNiBmLmZyaWVuZE9mID09IHUudXNlcklkXG4gICAgUkVUVVJOIHtcbiAgICAgIFwidXNlclwiIDogdS5uYW1lLFxuICAgICAgXCJmcmllbmRJZFwiIDogZi50aGlzVXNlclxuICAgIH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJBYmlnYWlsXCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJBYmlnYWlsXCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDMgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJBYmlnYWlsXCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDQgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJGcmVkXCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDUgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJGcmVkXCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDIgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJNYXJ5XCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDQgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJNYXJ5XCIsIFxuICAgIFwiZnJpZW5kSWRcIiA6IDEgXG4gIH0sIFxuICB7IFxuICAgIFwidXNlclwiIDogXCJNYXJpYWhcIiwgXG4gICAgXCJmcmllbmRJZFwiIDogMSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ1c2VyXCIgOiBcIk1hcmlhaFwiLCBcbiAgICBcImZyaWVuZElkXCIgOiAyIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJqb2luVHVwbGVzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCIsImJpbmRWYXJzIjp7ImZyaWVuZCI6ImZyaWVuZCJ9LCJkYXRhc2V0Ijoiam9pblNhbXBsZURhdGFzZXQifX0K" + }, + "jsStreamTransaction_1_single": { + "request": "LS0tCm5hbWU6IGpzU3RyZWFtVHJhbnNhY3Rpb25fMQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJ0YXNrcyIpOwp+ZGIudGFza3Muc2F2ZSh7IF9rZXk6ICIxMjMiLCB0eXBlOiAic2VuZEVtYWlsIiwgZGF0ZTogIjIwMjItMDctMDdUMTU6MjA6MDAuMDAwWiIgfSk7CnZhciBjb2xsID0gInRhc2tzIjsKdmFyIHRyeCA9IGRiLl9jcmVhdGVUcmFuc2FjdGlvbih7IGNvbGxlY3Rpb25zOiB7IHdyaXRlOiBbY29sbF0gfSB9KTsKdmFyIHRhc2sgPSB0cngucXVlcnkoYEZPUiB0IElOIEBAY29sbCBTT1JUIHQuZGF0ZSBERVNDIExJTUlUIDEgUkVUVVJOIHRgLCB7IkBjb2xsIjogY29sbH0pLnRvQXJyYXkoKVswXTsKaWYgKHRhc2spIHsKICBwcmludCh0YXNrKTsKICB0cnguY29sbGVjdGlvbihjb2xsKS5yZW1vdmUodGFzay5fa2V5KTsKICB2YXIgbmV3VGFzayA9IHRyeC5jb2xsZWN0aW9uKGNvbGwpLnNhdmUoeyBfa2V5OiAiMTI0IiwgdHlwZTogdGFzay50eXBlLCBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSwgeyByZXR1cm5OZXc6IHRydWUgfSkubmV3OwogIHByaW50KG5ld1Rhc2spOwogIHRyeC5jb21taXQoKTsKfSBlbHNlIHsKICB0cnguYWJvcnQoKTsKfQp0cnguc3RhdHVzKCk7Cn5kYi5fZHJvcCgidGFza3MiKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gXCJ0YXNrc1wiO1xudmFyIHRyeCA9IGRiLl9jcmVhdGVUcmFuc2FjdGlvbih7IGNvbGxlY3Rpb25zOiB7IHdyaXRlOiBbY29sbF0gfSB9KTtcbnZhciB0YXNrID0gdHJ4LnF1ZXJ5KGBGT1IgdCBJTiBAQGNvbGwgU09SVCB0LmRhdGUgREVTQyBMSU1JVCAxIFJFVFVSTiB0YCwge1wiQGNvbGxcIjogY29sbH0pLnRvQXJyYXkoKVswXTtcbmlmICh0YXNrKSB7XG4gIHByaW50KHRhc2spO1xuICB0cnguY29sbGVjdGlvbihjb2xsKS5yZW1vdmUodGFzay5fa2V5KTtcbiAgdmFyIG5ld1Rhc2sgPSB0cnguY29sbGVjdGlvbihjb2xsKS5zYXZlKHsgX2tleTogXCIxMjRcIiwgdHlwZTogdGFzay50eXBlLCBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSwgeyByZXR1cm5OZXc6IHRydWUgfSkubmV3O1xuICBwcmludChuZXdUYXNrKTtcbiAgdHJ4LmNvbW1pdCgpO1xufSBlbHNlIHtcbiAgdHJ4LmFib3J0KCk7XG59XG50cnguc3RhdHVzKCk7Iiwib3V0cHV0IjoieyBcbiAgXCJfa2V5XCIgOiBcIjEyM1wiLCBcbiAgXCJfaWRcIiA6IFwidGFza3MvMTIzXCIsIFxuICBcIl9yZXZcIiA6IFwiX2p0M2FVYS0tLV9cIiwgXG4gIFwidHlwZVwiIDogXCJzZW5kRW1haWxcIiwgXG4gIFwiZGF0ZVwiIDogXCIyMDIyLTA3LTA3VDE1OjIwOjAwLjAwMFpcIiBcbn1cbnsgXG4gIFwiX2tleVwiIDogXCIxMjRcIiwgXG4gIFwiX2lkXCIgOiBcInRhc2tzLzEyNFwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNhVWFHLS1fXCIsIFxuICBcInR5cGVcIiA6IFwic2VuZEVtYWlsXCIsIFxuICBcImRhdGVcIiA6IFwiMjAyNS0wNS0yM1QxODoxNjoyNy4zMzBaXCIgXG59XG57IFxuICBcImlkXCIgOiBcIjczNDE3XCIsIFxuICBcInN0YXR1c1wiIDogXCJjb21taXR0ZWRcIiBcbn1cblxueyBcbiAgXCJpZFwiIDogXCI3MzQxN1wiLCBcbiAgXCJzdGF0dXNcIiA6IFwiY29tbWl0dGVkXCIgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImpzU3RyZWFtVHJhbnNhY3Rpb25fMSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "lastExpressionResultCaptured_single": { + "request": "LS0tCm5hbWU6IGxhc3RFeHByZXNzaW9uUmVzdWx0Q2FwdHVyZWQKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgY2FsY3VsYXRpb25SZXN1bHQgPSA0MiAqIDIz", + "response": "eyJpbnB1dCI6InZhciBjYWxjdWxhdGlvblJlc3VsdCA9IDQyICogMjMiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoibGFzdEV4cHJlc3Npb25SZXN1bHRDYXB0dXJlZCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "lastExpressionResult_single": { + "request": "LS0tCm5hbWU6IGxhc3RFeHByZXNzaW9uUmVzdWx0CmRlc2NyaXB0aW9uOiAnJwotLS0KNDIgKiAyMw==", + "response": "eyJpbnB1dCI6IjQyICogMjMiLCJvdXRwdXQiOiI5NjYiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoibGFzdEV4cHJlc3Npb25SZXN1bHQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "levenshtein_match_sample_single": { + "request": "LS0tCm5hbWU6IGxldmVuc2h0ZWluX21hdGNoX3NhbXBsZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy5zYXZlKCJ0ZXh0X2VuX25vX3N0ZW0iLCAidGV4dCIsIHsgbG9jYWxlOiAiZW4iLCBhY2NlbnQ6IGZhbHNlLCBjYXNlOiAibG93ZXIiLCBzdGVtbWluZzogZmFsc2UsIHN0b3B3b3JkczogW10gfSwgWyJmcmVxdWVuY3kiLCAibm9ybSJdKTsKfmFuYWx5emVycy5yZW1vdmUoInRleHRfZW5fbm9fc3RlbSIpOw==", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5zYXZlKFwidGV4dF9lbl9ub19zdGVtXCIsIFwidGV4dFwiLCB7IGxvY2FsZTogXCJlblwiLCBhY2NlbnQ6IGZhbHNlLCBjYXNlOiBcImxvd2VyXCIsIHN0ZW1taW5nOiBmYWxzZSwgc3RvcHdvcmRzOiBbXSB9LCBbXCJmcmVxdWVuY3lcIiwgXCJub3JtXCJdKTsiLCJvdXRwdXQiOiJ7IFxuICBcIm5hbWVcIiA6IFwiX3N5c3RlbTo6dGV4dF9lbl9ub19zdGVtXCIsIFxuICBcInR5cGVcIiA6IFwidGV4dFwiLCBcbiAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICAgIFwibG9jYWxlXCIgOiBcImVuXCIsIFxuICAgIFwiY2FzZVwiIDogXCJsb3dlclwiLCBcbiAgICBcInN0b3B3b3Jkc1wiIDogWyBdLCBcbiAgICBcImFjY2VudFwiIDogZmFsc2UsIFxuICAgIFwic3RlbW1pbmdcIiA6IGZhbHNlIFxuICB9LCBcbiAgXCJmZWF0dXJlc1wiIDogWyBcbiAgICBcImZyZXF1ZW5jeVwiLCBcbiAgICBcIm5vcm1cIiBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoibGV2ZW5zaHRlaW5fbWF0Y2hfc2FtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "listCurrentConfigOpts_single": { + "request": "LS0tCm5hbWU6IGxpc3RDdXJyZW50Q29uZmlnT3B0cwpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9leGVjdXRlVHJhbnNhY3Rpb24oeyBjb2xsZWN0aW9uczoge30sIGFjdGlvbjogZnVuY3Rpb24oKSB7cmV0dXJuIHJlcXVpcmUoImludGVybmFsIikub3B0aW9ucygpOyB9IH0p", + "response": "eyJpbnB1dCI6ImRiLl9leGVjdXRlVHJhbnNhY3Rpb24oeyBjb2xsZWN0aW9uczoge30sIGFjdGlvbjogZnVuY3Rpb24oKSB7cmV0dXJuIHJlcXVpcmUoXCJpbnRlcm5hbFwiKS5vcHRpb25zKCk7IH0gfSkiLCJvdXRwdXQiOiJ7IFxuICBcImNoZWNrLWNvbmZpZ3VyYXRpb25cIiA6IGZhbHNlLCBcbiAgXCJjb25maWdcIiA6IFwiL3RtcC9hcmFuZ29kLmNvbmZcIiwgXG4gIFwiY29uZmlndXJhdGlvblwiIDogXCIvdG1wL2FyYW5nb2QuY29uZlwiLCBcbiAgXCJjb25zb2xlXCIgOiBmYWxzZSwgXG4gIFwiZGFlbW9uXCIgOiBmYWxzZSwgXG4gIFwiZGVmYXVsdC1sYW5ndWFnZVwiIDogXCJlbl9VU1wiLCBcbiAgXCJkZWZhdWx0LWxhbmd1YWdlLWNoZWNrXCIgOiB0cnVlLCBcbiAgXCJkZWZpbmVcIiA6IFsgXSwgXG4gIFwiZHVtcC1kZXBlbmRlbmNpZXNcIiA6IGZhbHNlLCBcbiAgXCJkdW1wLW9wdGlvbnNcIiA6IGZhbHNlLCBcbiAgXCJmb3J0dW5lXCIgOiBmYWxzZSwgXG4gIFwiZ2lkXCIgOiBcIlwiLCBcbiAgXCJob25vci1uc3N3aXRjaFwiIDogZmFsc2UsIFxuICBcImh1bmRcIiA6IGZhbHNlLCBcbiAgXCJpY3UtbGFuZ3VhZ2VcIiA6IFwiXCIsIFxuICBcImxvZ1wiIDogWyBcbiAgICBcImluZm9cIiwgXG4gICAgXCJpbmZvXCIgXG4gIF0sIFxuICBcInBpZC1maWxlXCIgOiBcIlwiLCBcbiAgXCJzdXBlcnZpc29yXCIgOiBmYWxzZSwgXG4gIFwidWlkXCIgOiBcIlwiLCBcbiAgXCJ1c2Utc3BsaWNlLXN5c2NhbGxcIiA6IHRydWUsIFxuICBcInZlcnNpb25cIiA6IGZhbHNlLCBcbiAgXCJ2ZXJzaW9uLWpzb25cIiA6IGZhbHNlLCBcbiAgXCJ3b3JraW5nLWRpcmVjdG9yeVwiIDogXCIvdmFyL3RtcFwiLCBcbiAgXCJhZ2VuY3kuYWN0aXZhdGVcIiA6IGZhbHNlLCBcbiAgXCJhZ2VuY3kuY29tcGFjdGlvbi1rZWVwLXNpemVcIiA6IDUwMDAwLCBcbiAgXCJhZ2VuY3kuY29tcGFjdGlvbi1zdGVwLXNpemVcIiA6IDEwMDAsIFxuICBcImFnZW5jeS5kaXNhc3Rlci1yZWNvdmVyeS1pZFwiIDogXCJcIiwgXG4gIFwiYWdlbmN5LmVsZWN0aW9uLXRpbWVvdXQtbWF4XCIgOiA1LCBcbiAgXCJhZ2VuY3kuZWxlY3Rpb24tdGltZW91dC1taW5cIiA6IDEsIFxuICBcImFnZW5jeS5lbmRwb2ludFwiIDogWyBdLCBcbiAgXCJhZ2VuY3kubWF4LWFwcGVuZC1zaXplXCIgOiAyNTAsIFxuICBcImFnZW5jeS5teS1hZGRyZXNzXCIgOiBcIlwiLCBcbiAgXCJhZ2VuY3kucG9vbC1zaXplXCIgOiAxLCBcbiAgXCJhZ2VuY3kuc2l6ZVwiIDogMSwgXG4gIFwiYWdlbmN5LnN1cGVydmlzaW9uXCIgOiBmYWxzZSwgXG4gIFwiYWdlbmN5LnN1cGVydmlzaW9uLWRlbGF5LWFkZC1mb2xsb3dlclwiIDogMCwgXG4gIFwiYWdlbmN5LnN1cGVydmlzaW9uLWRlbGF5LWZhaWxlZC1mb2xsb3dlclwiIDogMCwgXG4gIFwiYWdlbmN5LnN1cGVydmlzaW9uLWZhaWxlZC1sZWFkZXItYWRkcy1mb2xsb3dlclwiIDogdHJ1ZSwgXG4gIFwiYWdlbmN5LnN1cGVydmlzaW9uLWZyZXF1ZW5jeVwiIDogMSwgXG4gIFwiYWdlbmN5LnN1cGVydmlzaW9uLWdyYWNlLXBlcmlvZFwiIDogMTAsIFxuICBcImFnZW5jeS5zdXBlcnZpc2lvbi1vay10aHJlc2hvbGRcIiA6IDUsIFxuICBcImFnZW5jeS53YWl0LWZvci1zeW5jXCIgOiB0cnVlLCBcbiAgXCJhcmFuZ29zZWFyY2guY29sdW1ucy1jYWNoZS1saW1pdFwiIDogMCwgXG4gIFwiYXJhbmdvc2VhcmNoLmNvbHVtbnMtY2FjaGUtb25seS1sZWFkZXJcIiA6IGZhbHNlLCBcbiAgXCJhcmFuZ29zZWFyY2guY29tbWl0LXRocmVhZHNcIiA6IDEsIFxuICBcImFyYW5nb3NlYXJjaC5jb21taXQtdGhyZWFkcy1pZGxlXCIgOiAxLCBcbiAgXCJhcmFuZ29zZWFyY2guY29uc29saWRhdGlvbi10aHJlYWRzXCIgOiAxLCBcbiAgXCJhcmFuZ29zZWFyY2guY29uc29saWRhdGlvbi10aHJlYWRzLWlkbGVcIiA6IDEsIFxuICBcImFyYW5nb3NlYXJjaC5kZWZhdWx0LXBhcmFsbGVsaXNtXCIgOiAxLCBcbiAgXCJhcmFuZ29zZWFyY2guZXhlY3V0aW9uLXRocmVhZHMtbGltaXRcIiA6IDE2LCBcbiAgXCJhcmFuZ29zZWFyY2guZmFpbC1xdWVyaWVzLW9uLW91dC1vZi1zeW5jXCIgOiBmYWxzZSwgXG4gIFwiYXJhbmdvc2VhcmNoLnNraXAtcmVjb3ZlcnlcIiA6IFsgXSwgXG4gIFwiYXJhbmdvc2VhcmNoLnRocmVhZHNcIiA6IDAsIFxuICBcImFyYW5nb3NlYXJjaC50aHJlYWRzLWxpbWl0XCIgOiAwLCBcbiAgXCJhdWRpdC5ob3N0bmFtZVwiIDogXCJcIiwgXG4gIFwiYXVkaXQubWF4LWVudHJ5LWxlbmd0aFwiIDogMTM0MjE3NzI4LCBcbiAgXCJhdWRpdC5vdXRwdXRcIiA6IFsgXSwgXG4gIFwiYXVkaXQucXVldWVcIiA6IGZhbHNlLCBcbiAgXCJhdWRpdC53cml0ZS1sb2ctbGV2ZWxcIiA6IGZhbHNlLCBcbiAgXCJiYWNrdXAuYXBpLWVuYWJsZWRcIiA6IFwidHJ1ZVwiLCBcbiAgXCJiYWNrdXAuZmlsZXMtcGVyLWJhdGNoXCIgOiAxMDAsIFxuICBcImJhY2t1cC5sb2NhbC1wYXRoLXByZWZpeFwiIDogXCIvXCIsIFxuICBcImJhY2t1cC5udW1iZXItcGFyYWxsZWwtcmVtb3RlLWNvcGllc1wiIDogMTAwLCBcbiAgXCJjYWNoZS5hY2NlbGVyYXRpb24tZmFjdG9yLWZvci1lZGdlLWNvbXByZXNzaW9uXCIgOiAxLCBcbiAgXCJjYWNoZS5oaWdoLXdhdGVyLW11bHRpcGxpZXJcIiA6IDAuNTYsIFxuICBcImNhY2hlLmlkZWFsLWxvd2VyLWZpbGwtcmF0aW9cIiA6IDAuMDQsIFxuICBcImNhY2hlLmlkZWFsLXVwcGVyLWZpbGwtcmF0aW9cIiA6IDAuMjUsIFxuICBcImNhY2hlLm1heC1zcGFyZS1tZW1vcnktdXNhZ2VcIiA6IDY3MTA4ODY0LCBcbiAgXCJjYWNoZS5taW4tdmFsdWUtc2l6ZS1mb3ItZWRnZS1jb21wcmVzc2lvblwiIDogMTA3Mzc0MTgyNCwgXG4gIFwiY2FjaGUucmViYWxhbmNpbmctaW50ZXJ2YWxcIiA6IDIwMDAwMDAsIFxuICBcImNhY2hlLnNpemVcIiA6IDc3MzU1NjczNjAsIFxuICBcImNsdXN0ZXIuYWdlbmN5LWVuZHBvaW50XCIgOiBbIF0sIFxuICBcImNsdXN0ZXIuYXBpLWp3dC1wb2xpY3lcIiA6IFwiand0LWNvbXBhdFwiLCBcbiAgXCJjbHVzdGVyLmNvbm5lY3Rpdml0eS1jaGVjay1pbnRlcnZhbFwiIDogMzYwMCwgXG4gIFwiY2x1c3Rlci5jcmVhdGUtd2FpdHMtZm9yLXN5bmMtcmVwbGljYXRpb25cIiA6IHRydWUsIFxuICBcImNsdXN0ZXIuZGVmYXVsdC1yZXBsaWNhdGlvbi1mYWN0b3JcIiA6IDEsIFxuICBcImNsdXN0ZXIuZmFpbGVkLXdyaXRlLWNvbmNlcm4tc3RhdHVzLWNvZGVcIiA6IDQwMywgXG4gIFwiY2x1c3Rlci5mb3JjZS1vbmUtc2hhcmRcIiA6IGZhbHNlLCBcbiAgXCJjbHVzdGVyLmluZGV4LWNyZWF0ZS10aW1lb3V0XCIgOiAyNTkyMDAsIFxuICBcImNsdXN0ZXIubWF4LW51bWJlci1vZi1tb3ZlLXNoYXJkc1wiIDogMTAsIFxuICBcImNsdXN0ZXIubWF4LW51bWJlci1vZi1zaGFyZHNcIiA6IDEwMDAsIFxuICBcImNsdXN0ZXIubWF4LXJlcGxpY2F0aW9uLWZhY3RvclwiIDogMTAsIFxuICBcImNsdXN0ZXIubWluLXJlcGxpY2F0aW9uLWZhY3RvclwiIDogMSwgXG4gIFwiY2x1c3Rlci5teS1hZGRyZXNzXCIgOiBcIlwiLCBcbiAgXCJjbHVzdGVyLm15LWFkdmVydGlzZWQtZW5kcG9pbnRcIiA6IFwiXCIsIFxuICBcImNsdXN0ZXIubXktcm9sZVwiIDogXCJcIiwgXG4gIFwiY2x1c3Rlci5yZXF1aXJlLXBlcnNpc3RlZC1pZFwiIDogZmFsc2UsIFxuICBcImNsdXN0ZXIucmVzaWduLWxlYWRlcnNoaXAtb24tc2h1dGRvd25cIiA6IGZhbHNlLCBcbiAgXCJjbHVzdGVyLnNoYXJkLXN5bmNocm9uaXphdGlvbi1hdHRlbXB0LXRpbWVvdXRcIiA6IDEyMDAsIFxuICBcImNsdXN0ZXIuc3luY2hyb25vdXMtcmVwbGljYXRpb24tdGltZW91dC1mYWN0b3JcIiA6IDEsIFxuICBcImNsdXN0ZXIuc3luY2hyb25vdXMtcmVwbGljYXRpb24tdGltZW91dC1tYXhpbXVtXCIgOiAzNjAwLCBcbiAgXCJjbHVzdGVyLnN5bmNocm9ub3VzLXJlcGxpY2F0aW9uLXRpbWVvdXQtbWluaW11bVwiIDogOTAwLCBcbiAgXCJjbHVzdGVyLnN5bmNocm9ub3VzLXJlcGxpY2F0aW9uLXRpbWVvdXQtcGVyLTRrXCIgOiAwLjEsIFxuICBcImNsdXN0ZXIuc3lzdGVtLXJlcGxpY2F0aW9uLWZhY3RvclwiIDogMiwgXG4gIFwiY2x1c3Rlci51cGdyYWRlXCIgOiBcImF1dG9cIiwgXG4gIFwiY2x1c3Rlci53cml0ZS1jb25jZXJuXCIgOiAxLCBcbiAgXCJkYXRhYmFzZS5hdXRvLXVwZ3JhZGVcIiA6IGZhbHNlLCBcbiAgXCJkYXRhYmFzZS5jaGVjay12ZXJzaW9uXCIgOiBmYWxzZSwgXG4gIFwiZGF0YWJhc2UuZGlyZWN0b3J5XCIgOiBcIi92YXIvbGliL2FyYW5nb2RiM1wiLCBcbiAgXCJkYXRhYmFzZS5leHRlbmRlZC1uYW1lc1wiIDogZmFsc2UsIFxuICBcImRhdGFiYXNlLmlnbm9yZS1kYXRhZmlsZS1lcnJvcnNcIiA6IGZhbHNlLCBcbiAgXCJkYXRhYmFzZS5pbml0LWRhdGFiYXNlXCIgOiBmYWxzZSwgXG4gIFwiZGF0YWJhc2UuaW8taGVhcnRiZWF0XCIgOiB0cnVlLCBcbiAgXCJkYXRhYmFzZS5tYXgtZGF0YWJhc2VzXCIgOiAxODQ0Njc0NDA3MzcwOTU1MjAwMCwgXG4gIFwiZGF0YWJhc2UucmVxdWlyZWQtZGlyZWN0b3J5LXN0YXRlXCIgOiBcImFueVwiLCBcbiAgXCJkYXRhYmFzZS5yZXN0b3JlLWFkbWluXCIgOiBmYWxzZSwgXG4gIFwiZGF0YWJhc2UudXBncmFkZS1jaGVja1wiIDogdHJ1ZSwgXG4gIFwiZGF0YWJhc2Uud2FpdC1mb3Itc3luY1wiIDogZmFsc2UsIFxuICBcImVuY3J5cHRpb24ua2V5LWdlbmVyYXRvclwiIDogXCJcIiwgXG4gIFwiZW5jcnlwdGlvbi5rZXlmaWxlXCIgOiBcIlwiLCBcbiAgXCJmb3h4LmFsbG93LWluc3RhbGwtZnJvbS1yZW1vdGVcIiA6IGZhbHNlLCBcbiAgXCJmb3h4LmFwaVwiIDogdHJ1ZSwgXG4gIFwiZm94eC5lbmFibGVcIiA6IHRydWUsIFxuICBcImZveHguZm9yY2UtdXBkYXRlLW9uLXN0YXJ0dXBcIiA6IGZhbHNlLCBcbiAgXCJmb3h4LnF1ZXVlc1wiIDogdHJ1ZSwgXG4gIFwiZm94eC5xdWV1ZXMtcG9sbC1pbnRlcnZhbFwiIDogMSwgXG4gIFwiZm94eC5zdG9yZVwiIDogdHJ1ZSwgXG4gIFwiaHR0cC5hbGxvdy1tZXRob2Qtb3ZlcnJpZGVcIiA6IGZhbHNlLCBcbiAgXCJodHRwLmhpZGUtcHJvZHVjdC1oZWFkZXJcIiA6IGZhbHNlLCBcbiAgXCJodHRwLmtlZXAtYWxpdmUtdGltZW91dFwiIDogMzAwLCBcbiAgXCJodHRwLnBlcm1hbmVudGx5LXJlZGlyZWN0LXJvb3RcIiA6IHRydWUsIFxuICBcImh0dHAucmVkaXJlY3Qtcm9vdC10b1wiIDogXCIvX2FkbWluL2FhcmR2YXJrL2luZGV4Lmh0bWxcIiwgXG4gIFwiaHR0cC5yZXR1cm4tcXVldWUtdGltZS1oZWFkZXJcIiA6IHRydWUsIFxuICBcImh0dHAudHJ1c3RlZC1vcmlnaW5cIiA6IFsgXSwgXG4gIFwiamF2YXNjcmlwdC5hbGxvdy1hZG1pbi1leGVjdXRlXCIgOiBmYWxzZSwgXG4gIFwiamF2YXNjcmlwdC5hbGxvdy1leHRlcm5hbC1wcm9jZXNzLWNvbnRyb2xcIiA6IGZhbHNlLCBcbiAgXCJqYXZhc2NyaXB0LmFsbG93LXBvcnQtdGVzdGluZ1wiIDogZmFsc2UsIFxuICBcImphdmFzY3JpcHQuYXBwLXBhdGhcIiA6IFwiL3Zhci9saWIvYXJhbmdvZGIzLWFwcHNcIiwgXG4gIFwiamF2YXNjcmlwdC5jb3B5LWluc3RhbGxhdGlvblwiIDogZmFsc2UsIFxuICBcImphdmFzY3JpcHQuZW5hYmxlZFwiIDogdHJ1ZSwgXG4gIFwiamF2YXNjcmlwdC5lbmRwb2ludHMtYWxsb3dsaXN0XCIgOiBbIF0sIFxuICBcImphdmFzY3JpcHQuZW5kcG9pbnRzLWRlbnlsaXN0XCIgOiBbIF0sIFxuICBcImphdmFzY3JpcHQuZW52aXJvbm1lbnQtdmFyaWFibGVzLWFsbG93bGlzdFwiIDogWyBdLCBcbiAgXCJqYXZhc2NyaXB0LmVudmlyb25tZW50LXZhcmlhYmxlcy1kZW55bGlzdFwiIDogWyBdLCBcbiAgXCJqYXZhc2NyaXB0LmZpbGVzLWFsbG93bGlzdFwiIDogWyBdLCBcbiAgXCJqYXZhc2NyaXB0LmdjLWZyZXF1ZW5jeVwiIDogNjAsIFxuICBcImphdmFzY3JpcHQuZ2MtaW50ZXJ2YWxcIiA6IDIwMDAsIFxuICBcImphdmFzY3JpcHQuaGFyZGVuXCIgOiBmYWxzZSwgXG4gIFwiamF2YXNjcmlwdC5tb2R1bGUtZGlyZWN0b3J5XCIgOiBbIF0sIFxuICBcImphdmFzY3JpcHQuc2NyaXB0XCIgOiBbIF0sIFxuICBcImphdmFzY3JpcHQuc2NyaXB0LXBhcmFtZXRlclwiIDogWyBdLCBcbiAgXCJqYXZhc2NyaXB0LnN0YXJ0dXAtZGlyZWN0b3J5XCIgOiBcIi91c3Ivc2hhcmUvYXJhbmdvZGIzL2pzXCIsIFxuICBcImphdmFzY3JpcHQuc3RhcnR1cC1vcHRpb25zLWFsbG93bGlzdFwiIDogWyBdLCBcbiAgXCJqYXZhc2NyaXB0LnN0YXJ0dXAtb3B0aW9ucy1kZW55bGlzdFwiIDogWyBdLCBcbiAgXCJqYXZhc2NyaXB0LnRhc2tzXCIgOiB0cnVlLCBcbiAgXCJqYXZhc2NyaXB0LnRyYW5zYWN0aW9uc1wiIDogdHJ1ZSwgXG4gIFwiamF2YXNjcmlwdC51c2VyLWRlZmluZWQtZnVuY3Rpb25zXCIgOiB0cnVlLCBcbiAgXCJqYXZhc2NyaXB0LnY4LWNvbnRleHRzXCIgOiAyOCwgXG4gIFwiamF2YXNjcmlwdC52OC1jb250ZXh0cy1tYXgtYWdlXCIgOiA2MCwgXG4gIFwiamF2YXNjcmlwdC52OC1jb250ZXh0cy1tYXgtaW52b2NhdGlvbnNcIiA6IDAsIFxuICBcImphdmFzY3JpcHQudjgtY29udGV4dHMtbWluaW11bVwiIDogMSwgXG4gIFwiamF2YXNjcmlwdC52OC1tYXgtaGVhcFwiIDogMzA3MiwgXG4gIFwiamF2YXNjcmlwdC52OC1vcHRpb25zXCIgOiBbIF0sIFxuICBcImxkYXAuYWxsb3ctb2ZmbGluZVwiIDogZmFsc2UsIFxuICBcImxkYXAuYXN5bmMtY29ubmVjdFwiIDogZmFsc2UsIFxuICBcImxkYXAuYmFzZWRuXCIgOiBcIlwiLCBcbiAgXCJsZGFwLmJpbmRkblwiIDogXCJcIiwgXG4gIFwibGRhcC5kZWJ1Z1wiIDogZmFsc2UsIFxuICBcImxkYXAuZW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImxkYXAubmV0d29yay10aW1lb3V0XCIgOiAwLCBcbiAgXCJsZGFwLnBvcnRcIiA6IDM4OSwgXG4gIFwibGRhcC5wcmVmaXhcIiA6IFwiXCIsIFxuICBcImxkYXAucmVmZXJyYWxzXCIgOiBmYWxzZSwgXG4gIFwibGRhcC5yZWZyZXNoLXJhdGVcIiA6IDMwMCwgXG4gIFwibGRhcC5yZXNwb25zaWJsZS1mb3JcIiA6IFwiXCIsIFxuICBcImxkYXAucmVzdGFydFwiIDogZmFsc2UsIFxuICBcImxkYXAucmV0cmllc1wiIDogMSwgXG4gIFwibGRhcC5yb2xlcy1hdHRyaWJ1dGUtbmFtZVwiIDogXCJcIiwgXG4gIFwibGRhcC5yb2xlcy1leGNsdWRlXCIgOiBcIlwiLCBcbiAgXCJsZGFwLnJvbGVzLWluY2x1ZGVcIiA6IFwiXCIsIFxuICBcImxkYXAucm9sZXMtc2VhcmNoXCIgOiBcIlwiLCBcbiAgXCJsZGFwLnJvbGVzLXRyYW5zZm9ybWF0aW9uXCIgOiBbIF0sIFxuICBcImxkYXAuc2VhcmNoLWF0dHJpYnV0ZVwiIDogXCJ1aWRcIiwgXG4gIFwibGRhcC5zZWFyY2gtZmlsdGVyXCIgOiBcIm9iamVjdENsYXNzPSpcIiwgXG4gIFwibGRhcC5zZWFyY2gtc2NvcGVcIiA6IFwic3ViXCIsIFxuICBcImxkYXAuc2VyaWFsaXplLXRpbWVvdXRcIiA6IDUsIFxuICBcImxkYXAuc2VyaWFsaXplZFwiIDogZmFsc2UsIFxuICBcImxkYXAuc2VydmVyXCIgOiBcIlwiLCBcbiAgXCJsZGFwLnN1ZmZpeFwiIDogXCJcIiwgXG4gIFwibGRhcC5zdXBlcnVzZXItcm9sZVwiIDogXCJcIiwgXG4gIFwibGRhcC50aW1lb3V0XCIgOiAwLCBcbiAgXCJsZGFwLnRsc1wiIDogZmFsc2UsIFxuICBcImxkYXAudGxzLWNhY2VydC1kaXJcIiA6IFwiXCIsIFxuICBcImxkYXAudGxzLWNhY2VydC1maWxlXCIgOiBcIlwiLCBcbiAgXCJsZGFwLnRscy1jZXJ0LWNoZWNrLXN0cmF0ZWd5XCIgOiBcImhhcmRcIiwgXG4gIFwibGRhcC50bHMtdmVyc2lvblwiIDogXCIxLjJcIiwgXG4gIFwibGRhcC51cmxcIiA6IFwiXCIsIFxuICBcImxkYXAyLmFsbG93LW9mZmxpbmVcIiA6IGZhbHNlLCBcbiAgXCJsZGFwMi5hc3luYy1jb25uZWN0XCIgOiBmYWxzZSwgXG4gIFwibGRhcDIuYmFzZWRuXCIgOiBcIlwiLCBcbiAgXCJsZGFwMi5iaW5kZG5cIiA6IFwiXCIsIFxuICBcImxkYXAyLmRlYnVnXCIgOiBmYWxzZSwgXG4gIFwibGRhcDIuZW5hYmxlZFwiIDogZmFsc2UsIFxuICBcImxkYXAyLm5ldHdvcmstdGltZW91dFwiIDogMCwgXG4gIFwibGRhcDIucG9ydFwiIDogMzg5LCBcbiAgXCJsZGFwMi5wcmVmaXhcIiA6IFwiXCIsIFxuICBcImxkYXAyLnJlZmVycmFsc1wiIDogZmFsc2UsIFxuICBcImxkYXAyLnJlZnJlc2gtcmF0ZVwiIDogMzAwLCBcbiAgXCJsZGFwMi5yZXNwb25zaWJsZS1mb3JcIiA6IFwiXCIsIFxuICBcImxkYXAyLnJlc3RhcnRcIiA6IGZhbHNlLCBcbiAgXCJsZGFwMi5yZXRyaWVzXCIgOiAxLCBcbiAgXCJsZGFwMi5yb2xlcy1hdHRyaWJ1dGUtbmFtZVwiIDogXCJcIiwgXG4gIFwibGRhcDIucm9sZXMtZXhjbHVkZVwiIDogXCJcIiwgXG4gIFwibGRhcDIucm9sZXMtaW5jbHVkZVwiIDogXCJcIiwgXG4gIFwibGRhcDIucm9sZXMtc2VhcmNoXCIgOiBcIlwiLCBcbiAgXCJsZGFwMi5yb2xlcy10cmFuc2Zvcm1hdGlvblwiIDogWyBdLCBcbiAgXCJsZGFwMi5zZWFyY2gtYXR0cmlidXRlXCIgOiBcInVpZFwiLCBcbiAgXCJsZGFwMi5zZWFyY2gtZmlsdGVyXCIgOiBcIm9iamVjdENsYXNzPSpcIiwgXG4gIFwibGRhcDIuc2VhcmNoLXNjb3BlXCIgOiBcInN1YlwiLCBcbiAgXCJsZGFwMi5zZXJpYWxpemUtdGltZW91dFwiIDogNSwgXG4gIFwibGRhcDIuc2VyaWFsaXplZFwiIDogZmFsc2UsIFxuICBcImxkYXAyLnNlcnZlclwiIDogXCJcIiwgXG4gIFwibGRhcDIuc3VmZml4XCIgOiBcIlwiLCBcbiAgXCJsZGFwMi5zdXBlcnVzZXItcm9sZVwiIDogXCJcIiwgXG4gIFwibGRhcDIudGltZW91dFwiIDogMCwgXG4gIFwibGRhcDIudGxzXCIgOiBmYWxzZSwgXG4gIFwibGRhcDIudGxzLWNhY2VydC1kaXJcIiA6IFwiXCIsIFxuICBcImxkYXAyLnRscy1jYWNlcnQtZmlsZVwiIDogXCJcIiwgXG4gIFwibGRhcDIudGxzLWNlcnQtY2hlY2stc3RyYXRlZ3lcIiA6IFwiaGFyZFwiLCBcbiAgXCJsZGFwMi50bHMtdmVyc2lvblwiIDogXCIxLjJcIiwgXG4gIFwibGRhcDIudXJsXCIgOiBcIlwiLCBcbiAgXCJsb2cuYXBpLWVuYWJsZWRcIiA6IFwidHJ1ZVwiLCBcbiAgXCJsb2cuY29sb3JcIiA6IHRydWUsIFxuICBcImxvZy5lc2NhcGUtY29udHJvbC1jaGFyc1wiIDogdHJ1ZSwgXG4gIFwibG9nLmVzY2FwZS11bmljb2RlLWNoYXJzXCIgOiBmYWxzZSwgXG4gIFwibG9nLmZpbGVcIiA6IFwiLVwiLCBcbiAgXCJsb2cuZmlsZS1ncm91cFwiIDogXCJcIiwgXG4gIFwibG9nLmZpbGUtbW9kZVwiIDogXCJcIiwgXG4gIFwibG9nLmZvcmNlLWRpcmVjdFwiIDogZmFsc2UsIFxuICBcImxvZy5mb3JlZ3JvdW5kLXR0eVwiIDogZmFsc2UsIFxuICBcImxvZy5ob3N0bmFtZVwiIDogXCJcIiwgXG4gIFwibG9nLmlkc1wiIDogdHJ1ZSwgXG4gIFwibG9nLmluLW1lbW9yeVwiIDogdHJ1ZSwgXG4gIFwibG9nLmluLW1lbW9yeS1sZXZlbFwiIDogXCJpbmZvXCIsIFxuICBcImxvZy5rZWVwLWxvZ3JvdGF0ZVwiIDogZmFsc2UsIFxuICBcImxvZy5sZXZlbFwiIDogWyBcbiAgICBcImluZm9cIiwgXG4gICAgXCJpbmZvXCIgXG4gIF0sIFxuICBcImxvZy5saW5lLW51bWJlclwiIDogZmFsc2UsIFxuICBcImxvZy5tYXgtZW50cnktbGVuZ3RoXCIgOiAxMzQyMTc3MjgsIFxuICBcImxvZy5tYXgtcXVldWVkLWVudHJpZXNcIiA6IDEwMDAwLCBcbiAgXCJsb2cub3V0cHV0XCIgOiBbIFxuICAgIFwiLVwiIFxuICBdLCBcbiAgXCJsb2cucGVyZm9ybWFuY2VcIiA6IGZhbHNlLCBcbiAgXCJsb2cucHJlZml4XCIgOiBcIlwiLCBcbiAgXCJsb2cucHJvY2Vzc1wiIDogdHJ1ZSwgXG4gIFwibG9nLnJlcXVlc3QtcGFyYW1ldGVyc1wiIDogdHJ1ZSwgXG4gIFwibG9nLnJvbGVcIiA6IGZhbHNlLCBcbiAgXCJsb2cuc2hvcnRlbi1maWxlbmFtZXNcIiA6IHRydWUsIFxuICBcImxvZy5zdHJ1Y3R1cmVkLXBhcmFtXCIgOiBbIF0sIFxuICBcImxvZy50aHJlYWRcIiA6IGZhbHNlLCBcbiAgXCJsb2cudGhyZWFkLW5hbWVcIiA6IGZhbHNlLCBcbiAgXCJsb2cudGltZS1mb3JtYXRcIiA6IFwidXRjLWRhdGVzdHJpbmdcIiwgXG4gIFwibG9nLnVzZS1qc29uLWZvcm1hdFwiIDogZmFsc2UsIFxuICBcImxvZy51c2UtbG9jYWwtdGltZVwiIDogZmFsc2UsIFxuICBcImxvZy51c2UtbWljcm90aW1lXCIgOiBmYWxzZSwgXG4gIFwibmV0d29yay5pZGxlLWNvbm5lY3Rpb24tdHRsXCIgOiAxNTAwMDAsIFxuICBcIm5ldHdvcmsuaW8tdGhyZWFkc1wiIDogMiwgXG4gIFwibmV0d29yay5tYXgtb3Blbi1jb25uZWN0aW9uc1wiIDogMTAyNCwgXG4gIFwibmV0d29yay5tYXgtcmVxdWVzdHMtaW4tZmxpZ2h0XCIgOiA2NTUzNiwgXG4gIFwibmV0d29yay5wcm90b2NvbFwiIDogXCJcIiwgXG4gIFwibmV0d29yay52ZXJpZnktaG9zdHNcIiA6IGZhbHNlLCBcbiAgXCJwcmVnZWwubWF4LXBhcmFsbGVsaXNtXCIgOiA4LCBcbiAgXCJwcmVnZWwubWluLXBhcmFsbGVsaXNtXCIgOiAxLCBcbiAgXCJwcmVnZWwucGFyYWxsZWxpc21cIiA6IDIsIFxuICBcInF1ZXJ5LmFsbG93LWNvbGxlY3Rpb25zLWluLWV4cHJlc3Npb25zXCIgOiBmYWxzZSwgXG4gIFwicXVlcnkuY2FjaGUtZW50cmllc1wiIDogMTI4LCBcbiAgXCJxdWVyeS5jYWNoZS1lbnRyaWVzLW1heC1zaXplXCIgOiAyNjg0MzU0NTYsIFxuICBcInF1ZXJ5LmNhY2hlLWVudHJ5LW1heC1zaXplXCIgOiAxNjc3NzIxNiwgXG4gIFwicXVlcnkuY2FjaGUtaW5jbHVkZS1zeXN0ZW0tY29sbGVjdGlvbnNcIiA6IGZhbHNlLCBcbiAgXCJxdWVyeS5jYWNoZS1tb2RlXCIgOiBcIm9mZlwiLCBcbiAgXCJxdWVyeS5lbmFibGUtZGVidWctYXBpc1wiIDogdHJ1ZSwgXG4gIFwicXVlcnkuZmFpbC1vbi13YXJuaW5nXCIgOiBmYWxzZSwgXG4gIFwicXVlcnkuZ2xvYmFsLW1lbW9yeS1saW1pdFwiIDogMjY4MDI3MDAwMDIsIFxuICBcInF1ZXJ5LmxvZy1mYWlsZWRcIiA6IGZhbHNlLCBcbiAgXCJxdWVyeS5sb2ctbWVtb3J5LXVzYWdlLXRocmVzaG9sZFwiIDogNDI5NDk2NzI5NiwgXG4gIFwicXVlcnkubWF4LWFydGlmYWN0LWxvZy1sZW5ndGhcIiA6IDQwOTYsIFxuICBcInF1ZXJ5Lm1heC1jb2xsZWN0aW9ucy1wZXItcXVlcnlcIiA6IDIwNDgsIFxuICBcInF1ZXJ5Lm1heC1kbmYtY29uZGl0aW9uLW1lbWJlcnNcIiA6IDc4NjQzMiwgXG4gIFwicXVlcnkubWF4LW5vZGVzLXBlci1jYWxsc3RhY2tcIiA6IDI1MCwgXG4gIFwicXVlcnkubWF4LXBhcmFsbGVsaXNtXCIgOiA0LCBcbiAgXCJxdWVyeS5tYXgtcnVudGltZVwiIDogMCwgXG4gIFwicXVlcnkubWVtb3J5LWxpbWl0XCIgOiAxOTg1Mzg1MTg1MywgXG4gIFwicXVlcnkubWVtb3J5LWxpbWl0LW92ZXJyaWRlXCIgOiB0cnVlLCBcbiAgXCJxdWVyeS5vcHRpbWl6ZXItbWF4LXBsYW5zXCIgOiAxMjgsIFxuICBcInF1ZXJ5Lm9wdGltaXplci1ydWxlc1wiIDogWyBdLCBcbiAgXCJxdWVyeS5wYXJhbGxlbGl6ZS10cmF2ZXJzYWxzXCIgOiB0cnVlLCBcbiAgXCJxdWVyeS5yZWdpc3RyeS10dGxcIiA6IDMwLCBcbiAgXCJxdWVyeS5yZXF1aXJlLXdpdGhcIiA6IGZhbHNlLCBcbiAgXCJxdWVyeS5zbG93LXN0cmVhbWluZy10aHJlc2hvbGRcIiA6IDEwLCBcbiAgXCJxdWVyeS5zbG93LXRocmVzaG9sZFwiIDogMTAsIFxuICBcInF1ZXJ5LnNtYXJ0LWpvaW5zXCIgOiB0cnVlLCBcbiAgXCJxdWVyeS50cmFja2luZ1wiIDogdHJ1ZSwgXG4gIFwicXVlcnkudHJhY2tpbmctc2xvdy1xdWVyaWVzXCIgOiB0cnVlLCBcbiAgXCJxdWVyeS50cmFja2luZy13aXRoLWJpbmR2YXJzXCIgOiB0cnVlLCBcbiAgXCJxdWVyeS50cmFja2luZy13aXRoLWRhdGFzb3VyY2VzXCIgOiBmYWxzZSwgXG4gIFwicXVlcnkudHJhY2tpbmctd2l0aC1xdWVyeXN0cmluZ1wiIDogdHJ1ZSwgXG4gIFwicmFuZG9tLmdlbmVyYXRvclwiIDogMSwgXG4gIFwicmNsb25lLmFyZ3VtZW50XCIgOiBbIF0sIFxuICBcInJjbG9uZS5leGVjdXRhYmxlXCIgOiBcInJjbG9uZS1hcmFuZ29kYlwiLCBcbiAgXCJyZXBsaWNhdGlvbi5hY3RpdmUtZmFpbG92ZXJcIiA6IGZhbHNlLCBcbiAgXCJyZXBsaWNhdGlvbi5hY3RpdmUtZmFpbG92ZXItbGVhZGVyLWdyYWNlLXBlcmlvZFwiIDogMTIwLCBcbiAgXCJyZXBsaWNhdGlvbi5hdXRvLXJlcGFpci1yZXZpc2lvbi10cmVlc1wiIDogdHJ1ZSwgXG4gIFwicmVwbGljYXRpb24uYXV0by1zdGFydFwiIDogdHJ1ZSwgXG4gIFwicmVwbGljYXRpb24uY29ubmVjdC10aW1lb3V0XCIgOiAxMCwgXG4gIFwicmVwbGljYXRpb24ubWF4LXBhcmFsbGVsLXRhaWxpbmctaW52b2NhdGlvbnNcIiA6IDAsIFxuICBcInJlcGxpY2F0aW9uLnF1aWNrLWtleXMtbGltaXRcIiA6IDEwMDAwMDAsIFxuICBcInJlcGxpY2F0aW9uLnJlcXVlc3QtdGltZW91dFwiIDogNjAwLCBcbiAgXCJyZXBsaWNhdGlvbi5zeW5jLWJ5LXJldmlzaW9uXCIgOiB0cnVlLCBcbiAgXCJyb2Nrc2RiLmFsbG93LWZhbGxvY2F0ZVwiIDogdHJ1ZSwgXG4gIFwicm9ja3NkYi5hdXRvLWZpbGwtaW5kZXgtY2FjaGVzLW9uLXN0YXJ0dXBcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLmF1dG8tZmx1c2gtY2hlY2staW50ZXJ2YWxcIiA6IDE4MDAsIFxuICBcInJvY2tzZGIuYXV0by1mbHVzaC1taW4tbGl2ZS13YWwtZmlsZXNcIiA6IDIwLCBcbiAgXCJyb2Nrc2RiLmF1dG8tcmVmaWxsLWluZGV4LWNhY2hlcy1vbi1mb2xsb3dlcnNcIiA6IHRydWUsIFxuICBcInJvY2tzZGIuYXV0by1yZWZpbGwtaW5kZXgtY2FjaGVzLW9uLW1vZGlmeVwiIDogZmFsc2UsIFxuICBcInJvY2tzZGIuYXV0by1yZWZpbGwtaW5kZXgtY2FjaGVzLXF1ZXVlLWNhcGFjaXR5XCIgOiAxMzEwNzIsIFxuICBcInJvY2tzZGIuYmxvYi1jb21wcmVzc2lvbi10eXBlXCIgOiBcImx6NFwiLCBcbiAgXCJyb2Nrc2RiLmJsb2ItZmlsZS1zaXplXCIgOiAxMDczNzQxODI0LCBcbiAgXCJyb2Nrc2RiLmJsb2ItZ2FyYmFnZS1jb2xsZWN0aW9uLWFnZS1jdXRvZmZcIiA6IDAuMjUsIFxuICBcInJvY2tzZGIuYmxvYi1nYXJiYWdlLWNvbGxlY3Rpb24tZm9yY2UtdGhyZXNob2xkXCIgOiAxLCBcbiAgXCJyb2Nrc2RiLmJsb2NrLWFsaWduLWRhdGEtYmxvY2tzXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5ibG9jay1jYWNoZS1qZW1hbGxvYy1hbGxvY2F0b3JcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLmJsb2NrLWNhY2hlLXNoYXJkLWJpdHNcIiA6IC0xLCBcbiAgXCJyb2Nrc2RiLmJsb2NrLWNhY2hlLXNpemVcIiA6IDkyODI2ODA4MzIsIFxuICBcInJvY2tzZGIuYmxvb20tZmlsdGVyLWJpdHMtcGVyLWtleVwiIDogMTAsIFxuICBcInJvY2tzZGIuY2FjaGUtaW5kZXgtYW5kLWZpbHRlci1ibG9ja3NcIiA6IHRydWUsIFxuICBcInJvY2tzZGIuY2FjaGUtaW5kZXgtYW5kLWZpbHRlci1ibG9ja3Mtd2l0aC1oaWdoLXByaW9yaXR5XCIgOiB0cnVlLCBcbiAgXCJyb2Nrc2RiLmNoZWNrc3VtLXR5cGVcIiA6IFwieHhIYXNoNjRcIiwgXG4gIFwicm9ja3NkYi5jb21wYWN0aW9uLXJlYWQtYWhlYWQtc2l6ZVwiIDogMjA5NzE1MiwgXG4gIFwicm9ja3NkYi5jb21wYWN0aW9uLXN0eWxlXCIgOiBcImxldmVsXCIsIFxuICBcInJvY2tzZGIuY29tcHJlc3Npb24tdHlwZVwiIDogXCJsejRcIiwgXG4gIFwicm9ja3NkYi5jcmVhdGUtc2hhLWZpbGVzXCIgOiB0cnVlLCBcbiAgXCJyb2Nrc2RiLmRlYnVnLWxvZ2dpbmdcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLmRlbGF5ZWQtd3JpdGUtcmF0ZVwiIDogMCwgXG4gIFwicm9ja3NkYi5keW5hbWljLWxldmVsLWJ5dGVzXCIgOiB0cnVlLCBcbiAgXCJyb2Nrc2RiLmVkZ2UtY2FjaGVcIiA6IHRydWUsIFxuICBcInJvY2tzZGIuZW5hYmxlLWJsb2ItZmlsZXNcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLmVuYWJsZS1ibG9iLWdhcmJhZ2UtY29sbGVjdGlvblwiIDogZmFsc2UsIFxuICBcInJvY2tzZGIuZW5hYmxlLWluZGV4LWNvbXByZXNzaW9uXCIgOiB0cnVlLCBcbiAgXCJyb2Nrc2RiLmVuYWJsZS1waXBlbGluZWQtd3JpdGVcIiA6IHRydWUsIFxuICBcInJvY2tzZGIuZW5hYmxlLXN0YXRpc3RpY3NcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLmVuY3J5cHRpb24tZ2VuLWludGVybmFsLWtleVwiIDogZmFsc2UsIFxuICBcInJvY2tzZGIuZW5jcnlwdGlvbi1oYXJkd2FyZS1hY2NlbGVyYXRpb25cIiA6IHRydWUsIFxuICBcInJvY2tzZGIuZW5jcnlwdGlvbi1rZXktZ2VuZXJhdG9yXCIgOiBcIlwiLCBcbiAgXCJyb2Nrc2RiLmVuY3J5cHRpb24ta2V5LXJvdGF0aW9uXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5lbmNyeXB0aW9uLWtleWZpbGVcIiA6IFwiXCIsIFxuICBcInJvY2tzZGIuZW5jcnlwdGlvbi1rZXlmb2xkZXJcIiA6IFwiXCIsIFxuICBcInJvY2tzZGIuZW5mb3JjZS1ibG9jay1jYWNoZS1zaXplLWxpbWl0XCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5leGNsdXNpdmUtd3JpdGVzXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5mb3JjZS1sZWdhY3ktY29tcGFyYXRvclwiIDogZmFsc2UsIFxuICBcInJvY2tzZGIuZm9ybWF0LXZlcnNpb25cIiA6IDUsIFxuICBcInJvY2tzZGIuaW50ZXJtZWRpYXRlLWNvbW1pdC1jb3VudFwiIDogMTAwMDAwMCwgXG4gIFwicm9ja3NkYi5pbnRlcm1lZGlhdGUtY29tbWl0LXNpemVcIiA6IDUzNjg3MDkxMiwgXG4gIFwicm9ja3NkYi5sZXZlbDAtY29tcGFjdGlvbi10cmlnZ2VyXCIgOiAyLCBcbiAgXCJyb2Nrc2RiLmxldmVsMC1zbG93ZG93bi10cmlnZ2VyXCIgOiAxNiwgXG4gIFwicm9ja3NkYi5sZXZlbDAtc3RvcC10cmlnZ2VyXCIgOiAyNTYsIFxuICBcInJvY2tzZGIubGltaXQtb3Blbi1maWxlcy1hdC1zdGFydHVwXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5tYXgtYmFja2dyb3VuZC1qb2JzXCIgOiA4LCBcbiAgXCJyb2Nrc2RiLm1heC1ieXRlcy1mb3ItbGV2ZWwtYmFzZVwiIDogMjY4NDM1NDU2LCBcbiAgXCJyb2Nrc2RiLm1heC1ieXRlcy1mb3ItbGV2ZWwtbXVsdGlwbGllclwiIDogMTAsIFxuICBcInJvY2tzZGIubWF4LWNvbmN1cnJlbnQtaW5kZXgtZmlsbC10YXNrc1wiIDogMSwgXG4gIFwicm9ja3NkYi5tYXgtcGFyYWxsZWwtY29tcGFjdGlvbnNcIiA6IDIsIFxuICBcInJvY2tzZGIubWF4LXN1YmNvbXBhY3Rpb25zXCIgOiAyLCBcbiAgXCJyb2Nrc2RiLm1heC10b3RhbC13YWwtc2l6ZVwiIDogODM4ODYwODAsIFxuICBcInJvY2tzZGIubWF4LXRyYW5zYWN0aW9uLXNpemVcIiA6IDE4NDQ2NzQ0MDczNzA5NTUyMDAwLCBcbiAgXCJyb2Nrc2RiLm1heC13cml0ZS1idWZmZXItbnVtYmVyXCIgOiAxMCwgXG4gIFwicm9ja3NkYi5tYXgtd3JpdGUtYnVmZmVyLW51bWJlci1kZWZpbml0aW9uc1wiIDogMCwgXG4gIFwicm9ja3NkYi5tYXgtd3JpdGUtYnVmZmVyLW51bWJlci1kb2N1bWVudHNcIiA6IDAsIFxuICBcInJvY2tzZGIubWF4LXdyaXRlLWJ1ZmZlci1udW1iZXItZWRnZVwiIDogMCwgXG4gIFwicm9ja3NkYi5tYXgtd3JpdGUtYnVmZmVyLW51bWJlci1mdWxsdGV4dFwiIDogMCwgXG4gIFwicm9ja3NkYi5tYXgtd3JpdGUtYnVmZmVyLW51bWJlci1nZW9cIiA6IDAsIFxuICBcInJvY2tzZGIubWF4LXdyaXRlLWJ1ZmZlci1udW1iZXItcHJpbWFyeVwiIDogMCwgXG4gIFwicm9ja3NkYi5tYXgtd3JpdGUtYnVmZmVyLW51bWJlci1yZXBsaWNhdGVkLWxvZ3NcIiA6IDAsIFxuICBcInJvY2tzZGIubWF4LXdyaXRlLWJ1ZmZlci1udW1iZXItdnBhY2tcIiA6IDAsIFxuICBcInJvY2tzZGIubWF4LXdyaXRlLWJ1ZmZlci1zaXplLXRvLW1haW50YWluXCIgOiAwLCBcbiAgXCJyb2Nrc2RiLm1pbi1ibG9iLXNpemVcIiA6IDI1NiwgXG4gIFwicm9ja3NkYi5taW4td3JpdGUtYnVmZmVyLW51bWJlci10by1tZXJnZVwiIDogMSwgXG4gIFwicm9ja3NkYi5taW5pbXVtLWRpc2stZnJlZS1ieXRlc1wiIDogMTY3NzcyMTYsIFxuICBcInJvY2tzZGIubWluaW11bS1kaXNrLWZyZWUtcGVyY2VudFwiIDogMC4wMSwgXG4gIFwicm9ja3NkYi5udW0tbGV2ZWxzXCIgOiA3LCBcbiAgXCJyb2Nrc2RiLm51bS10aHJlYWRzLXByaW9yaXR5LWhpZ2hcIiA6IDQsIFxuICBcInJvY2tzZGIubnVtLXRocmVhZHMtcHJpb3JpdHktbG93XCIgOiA0LCBcbiAgXCJyb2Nrc2RiLm51bS11bmNvbXByZXNzZWQtbGV2ZWxzXCIgOiAyLCBcbiAgXCJyb2Nrc2RiLm9wdGltaXplLWZpbHRlcnMtZm9yLWhpdHNcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLnBhcnRpdGlvbi1maWxlcy1mb3ItZG9jdW1lbnRzXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5wYXJ0aXRpb24tZmlsZXMtZm9yLWVkZ2UtaW5kZXhcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLnBhcnRpdGlvbi1maWxlcy1mb3ItcGVyc2lzdGVudC1pbmRleFwiIDogZmFsc2UsIFxuICBcInJvY2tzZGIucGFydGl0aW9uLWZpbGVzLWZvci1wcmltYXJ5LWluZGV4XCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5wZW5kaW5nLWNvbXBhY3Rpb25zLXNsb3dkb3duLXRyaWdnZXJcIiA6IDEzMTA3MiwgXG4gIFwicm9ja3NkYi5wZW5kaW5nLWNvbXBhY3Rpb25zLXN0b3AtdHJpZ2dlclwiIDogMTcxNzk4NjkxODQsIFxuICBcInJvY2tzZGIucGVyaW9kaWMtY29tcGFjdGlvbi10dGxcIiA6IDI1OTIwMDAsIFxuICBcInJvY2tzZGIucGluLWwwLWZpbHRlci1hbmQtaW5kZXgtYmxvY2tzLWluLWNhY2hlXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5waW4tdG9wLWxldmVsLWluZGV4LWFuZC1maWx0ZXJcIiA6IHRydWUsIFxuICBcInJvY2tzZGIucHJlcG9wdWxhdGUtYmxvY2stY2FjaGVcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLnJlY3ljbGUtbG9nLWZpbGUtbnVtXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5yZXNlcnZlLWZpbGUtbWV0YWRhdGEtbWVtb3J5XCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5yZXNlcnZlLXRhYmxlLWJ1aWxkZXItbWVtb3J5XCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi5yZXNlcnZlLXRhYmxlLXJlYWRlci1tZW1vcnlcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLnN5bmMtZGVsYXktdGhyZXNob2xkXCIgOiA1MDAwLCBcbiAgXCJyb2Nrc2RiLnN5bmMtaW50ZXJ2YWxcIiA6IDEwMCwgXG4gIFwicm9ja3NkYi50YWJsZS1ibG9jay1zaXplXCIgOiAxNjM4NCwgXG4gIFwicm9ja3NkYi50YXJnZXQtZmlsZS1zaXplLWJhc2VcIiA6IDY3MTA4ODY0LCBcbiAgXCJyb2Nrc2RiLnRhcmdldC1maWxlLXNpemUtbXVsdGlwbGllclwiIDogMSwgXG4gIFwicm9ja3NkYi50aHJvdHRsZVwiIDogdHJ1ZSwgXG4gIFwicm9ja3NkYi50aHJvdHRsZS1mcmVxdWVuY3lcIiA6IDEwMDAsIFxuICBcInJvY2tzZGIudGhyb3R0bGUtbG93ZXItYm91bmQtYnBzXCIgOiAxMDQ4NTc2MCwgXG4gIFwicm9ja3NkYi50aHJvdHRsZS1tYXgtd3JpdGUtcmF0ZVwiIDogMCwgXG4gIFwicm9ja3NkYi50aHJvdHRsZS1zY2FsaW5nLWZhY3RvclwiIDogMTcsIFxuICBcInJvY2tzZGIudGhyb3R0bGUtc2xvdHNcIiA6IDEyMCwgXG4gIFwicm9ja3NkYi50aHJvdHRsZS1zbG93LWRvd24td3JpdGVzLXRyaWdnZXJcIiA6IDgsIFxuICBcInJvY2tzZGIudG90YWwtd3JpdGUtYnVmZmVyLXNpemVcIiA6IDEyMzc2OTA3Nzc2LCBcbiAgXCJyb2Nrc2RiLnRyYW5zYWN0aW9uLWxvY2stc3RyaXBlc1wiIDogMTYsIFxuICBcInJvY2tzZGIudHJhbnNhY3Rpb24tbG9jay10aW1lb3V0XCIgOiAxMDAwLCBcbiAgXCJyb2Nrc2RiLnVzZS1kaXJlY3QtaW8tZm9yLWZsdXNoLWFuZC1jb21wYWN0aW9uXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi51c2UtZGlyZWN0LXJlYWRzXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi51c2UtZmlsZS1sb2dnaW5nXCIgOiBmYWxzZSwgXG4gIFwicm9ja3NkYi51c2UtZnN5bmNcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLnVzZS1yYW5nZS1kZWxldGUtaW4td2FsXCIgOiB0cnVlLCBcbiAgXCJyb2Nrc2RiLnZlcmlmeS1zc3RcIiA6IGZhbHNlLCBcbiAgXCJyb2Nrc2RiLndhbC1hcmNoaXZlLXNpemUtbGltaXRcIiA6IDAsIFxuICBcInJvY2tzZGIud2FsLWRpcmVjdG9yeVwiIDogXCJcIiwgXG4gIFwicm9ja3NkYi53YWwtZmlsZS10aW1lb3V0XCIgOiAxMCwgXG4gIFwicm9ja3NkYi53YWwtZmlsZS10aW1lb3V0LWluaXRpYWxcIiA6IDYwLCBcbiAgXCJyb2Nrc2RiLndhbC1yZWNvdmVyeS1za2lwLWNvcnJ1cHRlZFwiIDogZmFsc2UsIFxuICBcInJvY2tzZGIud3JpdGUtYnVmZmVyLXNpemVcIiA6IDY3MTA4ODY0LCBcbiAgXCJzZXJ2ZXIuYWxsb3ctdXNlLWRhdGFiYXNlXCIgOiBmYWxzZSwgXG4gIFwic2VydmVyLmF1dGhlbnRpY2F0aW9uXCIgOiBmYWxzZSwgXG4gIFwic2VydmVyLmF1dGhlbnRpY2F0aW9uLXN5c3RlbS1vbmx5XCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuYXV0aGVudGljYXRpb24tdGltZW91dFwiIDogMCwgXG4gIFwic2VydmVyLmF1dGhlbnRpY2F0aW9uLXVuaXgtc29ja2V0c1wiIDogdHJ1ZSwgXG4gIFwic2VydmVyLmNsdXN0ZXItbWV0cmljcy10aW1lb3V0XCIgOiAwLCBcbiAgXCJzZXJ2ZXIuY291bnQtZGVzY3JpcHRvcnMtaW50ZXJ2YWxcIiA6IDYwMDAwLCBcbiAgXCJzZXJ2ZXIuZGVzY3JpcHRvcnMtbWluaW11bVwiIDogODE5MiwgXG4gIFwic2VydmVyLmVhcmx5LWNvbm5lY3Rpb25zXCIgOiBmYWxzZSwgXG4gIFwic2VydmVyLmVuZHBvaW50XCIgOiBbIFxuICAgIFwiaHR0cCt0Y3A6Ly8wLjAuMC4wOjg1MjlcIiBcbiAgXSwgXG4gIFwic2VydmVyLmVuc3VyZS13aGl0ZXNwYWNlLW1ldHJpY3MtZm9ybWF0XCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuZXhwb3J0LW1ldHJpY3MtYXBpXCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuZXhwb3J0LXJlYWQtd3JpdGUtbWV0cmljc1wiIDogZmFsc2UsIFxuICBcInNlcnZlci5leHBvcnQtc2hhcmQtdXNhZ2UtbWV0cmljc1wiIDogXCJkaXNhYmxlZFwiLCBcbiAgXCJzZXJ2ZXIuZ2lkXCIgOiBcIlwiLCBcbiAgXCJzZXJ2ZXIuaGFyZGVuXCIgOiBmYWxzZSwgXG4gIFwic2VydmVyLmlvLXRocmVhZHNcIiA6IDIsIFxuICBcInNlcnZlci5sb2NhbC1hdXRoZW50aWNhdGlvblwiIDogdHJ1ZSwgXG4gIFwic2VydmVyLm1haW50ZW5hbmNlLWFjdGlvbnMtYmxvY2tcIiA6IDIsIFxuICBcInNlcnZlci5tYWludGVuYW5jZS1hY3Rpb25zLWxpbmdlclwiIDogMzYwMCwgXG4gIFwic2VydmVyLm1haW50ZW5hbmNlLXNsb3ctdGhyZWFkc1wiIDogMSwgXG4gIFwic2VydmVyLm1haW50ZW5hbmNlLXRocmVhZHNcIiA6IDMsIFxuICBcInNlcnZlci5tYXgtbnVtYmVyLWRldGFjaGVkLXRocmVhZHNcIiA6IDEwMDAsIFxuICBcInNlcnZlci5tYXhpbWFsLW51bWJlci1zeW5jLXNoYXJkLWFjdGlvbnNcIiA6IDMyLCBcbiAgXCJzZXJ2ZXIubWF4aW1hbC1xdWV1ZS1zaXplXCIgOiA0MDk2LCBcbiAgXCJzZXJ2ZXIubWF4aW1hbC10aHJlYWRzXCIgOiAzMiwgXG4gIFwic2VydmVyLm1pbmltYWwtdGhyZWFkc1wiIDogNCwgXG4gIFwic2VydmVyLm9uZ29pbmctbG93LXByaW9yaXR5LW11bHRpcGxpZXJcIiA6IDQsIFxuICBcInNlcnZlci5wcmlvMS1zaXplXCIgOiA0MDk2LCBcbiAgXCJzZXJ2ZXIucHJpbzItc2l6ZVwiIDogNDA5NiwgXG4gIFwic2VydmVyLnJlc3Qtc2VydmVyXCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuc2NoZWR1bGVyLXF1ZXVlLXNpemVcIiA6IDQwOTYsIFxuICBcInNlcnZlci5zZXNzaW9uLXRpbWVvdXRcIiA6IDM2MDAsIFxuICBcInNlcnZlci5zdGF0aXN0aWNzXCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuc3RhdGlzdGljcy1hbGwtZGF0YWJhc2VzXCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuc3RhdGlzdGljcy1oaXN0b3J5XCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIuc3RvcmFnZS1lbmdpbmVcIiA6IFwicm9ja3NkYlwiLCBcbiAgXCJzZXJ2ZXIuc3VwcG9ydC1pbmZvLWFwaVwiIDogXCJhZG1pblwiLCBcbiAgXCJzZXJ2ZXIudGVsZW1ldHJpY3MtYXBpXCIgOiB0cnVlLCBcbiAgXCJzZXJ2ZXIudGVsZW1ldHJpY3MtYXBpLW1heC1yZXF1ZXN0c1wiIDogMywgXG4gIFwic2VydmVyLnVpZFwiIDogXCJcIiwgXG4gIFwic2VydmVyLnVuYXZhaWxhYmlsaXR5LXF1ZXVlLWZpbGwtZ3JhZGVcIiA6IDAuNzUsIFxuICBcInNlcnZlci52YWxpZGF0ZS11dGY4LXN0cmluZ3NcIiA6IHRydWUsIFxuICBcInNzbC5jYWZpbGVcIiA6IFwiXCIsIFxuICBcInNzbC5jaXBoZXItbGlzdFwiIDogXCJISUdIOiFFWFBPUlQ6IWFOVUxMQFNUUkVOR1RIXCIsIFxuICBcInNzbC5lY2RoLWN1cnZlXCIgOiBcInByaW1lMjU2djFcIiwgXG4gIFwic3NsLmtleWZpbGVcIiA6IFwiXCIsIFxuICBcInNzbC5vcHRpb25zXCIgOiAyMTQ3NDg1Nzc2LCBcbiAgXCJzc2wucHJlZmVyLWh0dHAxLWluLWFscG5cIiA6IGZhbHNlLCBcbiAgXCJzc2wucHJvdG9jb2xcIiA6IDksIFxuICBcInNzbC5yZXF1aXJlLXBlZXItY2VydGlmaWNhdGVcIiA6IGZhbHNlLCBcbiAgXCJzc2wuc2VydmVyLW5hbWUtaW5kaWNhdGlvblwiIDogWyBdLCBcbiAgXCJzc2wuc2Vzc2lvbi1jYWNoZVwiIDogZmFsc2UsIFxuICBcInRjcC5iYWNrbG9nLXNpemVcIiA6IDY0LCBcbiAgXCJ0Y3AucmV1c2UtYWRkcmVzc1wiIDogdHJ1ZSwgXG4gIFwidGVtcC5pbnRlcm1lZGlhdGUtcmVzdWx0cy1jYXBhY2l0eVwiIDogMCwgXG4gIFwidGVtcC5pbnRlcm1lZGlhdGUtcmVzdWx0cy1lbmNyeXB0aW9uXCIgOiBmYWxzZSwgXG4gIFwidGVtcC5pbnRlcm1lZGlhdGUtcmVzdWx0cy1lbmNyeXB0aW9uLWhhcmR3YXJlLWFjY2VsZXJhdGlvblwiIDogdHJ1ZSwgXG4gIFwidGVtcC5pbnRlcm1lZGlhdGUtcmVzdWx0cy1wYXRoXCIgOiBcIlwiLCBcbiAgXCJ0ZW1wLmludGVybWVkaWF0ZS1yZXN1bHRzLXNwaWxsb3Zlci10aHJlc2hvbGQtbWVtb3J5LXVzYWdlXCIgOiAxMzQyMTc3MjgsIFxuICBcInRlbXAuaW50ZXJtZWRpYXRlLXJlc3VsdHMtc3BpbGxvdmVyLXRocmVzaG9sZC1udW0tcm93c1wiIDogNTAwMDAwMCwgXG4gIFwidGVtcC5wYXRoXCIgOiBcIlwiLCBcbiAgXCJ0cmFuc2FjdGlvbi5zdHJlYW1pbmctaWRsZS10aW1lb3V0XCIgOiA2MCwgXG4gIFwidHJhbnNhY3Rpb24uc3RyZWFtaW5nLWxvY2stdGltZW91dFwiIDogOCwgXG4gIFwidHRsLmZyZXF1ZW5jeVwiIDogMzAwMDAsIFxuICBcInR0bC5tYXgtY29sbGVjdGlvbi1yZW1vdmVzXCIgOiAxMDAwMDAsIFxuICBcInR0bC5tYXgtdG90YWwtcmVtb3Zlc1wiIDogMTAwMDAwMCwgXG4gIFwid2ViLWludGVyZmFjZS5wcm94eS1yZXF1ZXN0LWNoZWNrXCIgOiB0cnVlLCBcbiAgXCJ3ZWItaW50ZXJmYWNlLnRydXN0ZWQtcHJveHlcIiA6IFsgXSwgXG4gIFwid2ViLWludGVyZmFjZS52ZXJzaW9uLWNoZWNrXCIgOiB0cnVlIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJsaXN0Q3VycmVudENvbmZpZ09wdHMiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "loadIndexesIntoMemory_single": { + "request": "LS0tCm5hbWU6IGxvYWRJbmRleGVzSW50b01lbW9yeQpkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fZHJvcCgiZXhhbXBsZSIpOwp+ZGIuX2NyZWF0ZUVkZ2VDb2xsZWN0aW9uKCJleGFtcGxlIik7CmRiLmV4YW1wbGUubG9hZEluZGV4ZXNJbnRvTWVtb3J5KCk7Cn5kYi5fZHJvcCgiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6ImRiLmV4YW1wbGUubG9hZEluZGV4ZXNJbnRvTWVtb3J5KCk7Iiwib3V0cHV0IjoieyBcbiAgXCJyZXN1bHRcIiA6IHRydWUgXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6ImxvYWRJbmRleGVzSW50b01lbW9yeSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "ngram_match_sample_single": { + "request": "LS0tCm5hbWU6IG5ncmFtX21hdGNoX3NhbXBsZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CmFuYWx5emVycy5zYXZlKCJ0cmlncmFtIiwgIm5ncmFtIiwgeyBtaW46IDMsIG1heDogMywgcHJlc2VydmVPcmlnaW5hbDogZmFsc2UsIHN0cmVhbVR5cGU6ICJ1dGY4IiB9LCBbImZyZXF1ZW5jeSIsICJwb3NpdGlvbiJdKTsKfmFuYWx5emVycy5yZW1vdmUoInRyaWdyYW0iKTs=", + "response": "eyJpbnB1dCI6InZhciBhbmFseXplcnMgPSByZXF1aXJlKFwiQGFyYW5nb2RiL2FuYWx5emVyc1wiKTtcbmFuYWx5emVycy5zYXZlKFwidHJpZ3JhbVwiLCBcIm5ncmFtXCIsIHsgbWluOiAzLCBtYXg6IDMsIHByZXNlcnZlT3JpZ2luYWw6IGZhbHNlLCBzdHJlYW1UeXBlOiBcInV0ZjhcIiB9LCBbXCJmcmVxdWVuY3lcIiwgXCJwb3NpdGlvblwiXSk7Iiwib3V0cHV0IjoieyBcbiAgXCJuYW1lXCIgOiBcIl9zeXN0ZW06OnRyaWdyYW1cIiwgXG4gIFwidHlwZVwiIDogXCJuZ3JhbVwiLCBcbiAgXCJwcm9wZXJ0aWVzXCIgOiB7IFxuICAgIFwibWluXCIgOiAzLCBcbiAgICBcIm1heFwiIDogMywgXG4gICAgXCJwcmVzZXJ2ZU9yaWdpbmFsXCIgOiBmYWxzZSwgXG4gICAgXCJzdHJlYW1UeXBlXCIgOiBcInV0ZjhcIiwgXG4gICAgXCJzdGFydE1hcmtlclwiIDogXCJcIiwgXG4gICAgXCJlbmRNYXJrZXJcIiA6IFwiXCIgXG4gIH0sIFxuICBcImZlYXR1cmVzXCIgOiBbIFxuICAgIFwiZnJlcXVlbmN5XCIsIFxuICAgIFwicG9zaXRpb25cIiBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoibmdyYW1fbWF0Y2hfc2FtcGxlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "printFunction_single": { + "request": "LS0tCm5hbWU6IHByaW50RnVuY3Rpb24KZGVzY3JpcHRpb246ICcnCi0tLQpwcmludCh7IGE6ICIxMjMiLCBiOiBbMSwyLDNdLCBjOiAidGVzdCIgfSk7", + "response": "eyJpbnB1dCI6InByaW50KHsgYTogXCIxMjNcIiwgYjogWzEsMiwzXSwgYzogXCJ0ZXN0XCIgfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJhXCIgOiBcIjEyM1wiLCBcbiAgXCJiXCIgOiBbIFxuICAgIDEsIFxuICAgIDIsIFxuICAgIDMgXG4gIF0sIFxuICBcImNcIiA6IFwidGVzdFwiIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJwcmludEZ1bmN0aW9uIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphCreate1_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoQ3JlYXRlMQpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIHNhdGVsbGl0ZUdyYXBoTW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKCJzYXRlbGxpdGVHcmFwaCIpOwpncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9ncmFwaCgic2F0ZWxsaXRlR3JhcGgiKTsKfnNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9kcm9wKCJzYXRlbGxpdGVHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoXCIpO1xudmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZShcInNhdGVsbGl0ZUdyYXBoXCIpO1xuZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fZ3JhcGgoXCJzYXRlbGxpdGVHcmFwaFwiKTsiLCJvdXRwdXQiOiJ7W1NhdGVsbGl0ZUdyYXBoXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhDcmVhdGUxIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "satelliteGraphCreate2_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoQ3JlYXRlMgpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KfnZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zYXRlbGxpdGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZSgic2F0ZWxsaXRlR3JhcGgiKTsKZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oImFWZXJ0ZXhDb2xsZWN0aW9uIik7CmdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2dyYXBoKCJzYXRlbGxpdGVHcmFwaCIpOwp+c2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2Ryb3AoInNhdGVsbGl0ZUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9jcmVhdGUoXCJzYXRlbGxpdGVHcmFwaFwiKTtcbmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwiYVZlcnRleENvbGxlY3Rpb25cIik7XG5ncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9ncmFwaChcInNhdGVsbGl0ZUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU2F0ZWxsaXRlR3JhcGhdIFxuICBcImFWZXJ0ZXhDb2xsZWN0aW9uXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwNzc5LCBcImFWZXJ0ZXhDb2xsZWN0aW9uXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhDcmVhdGUyIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "satelliteGraphCreate3_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoQ3JlYXRlMwpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KfnZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zYXRlbGxpdGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZSgic2F0ZWxsaXRlR3JhcGgiKTsKdmFyIHJlbGF0aW9uID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX3JlbGF0aW9uKCJpc0ZyaWVuZCIsIFsicGVyc29uIl0sIFsicGVyc29uIl0pOwpncmFwaC5fZXh0ZW5kRWRnZURlZmluaXRpb25zKHJlbGF0aW9uKTsKZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fZ3JhcGgoInNhdGVsbGl0ZUdyYXBoIik7Cn5zYXRlbGxpdGVHcmFwaE1vZHVsZS5fZHJvcCgic2F0ZWxsaXRlR3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9jcmVhdGUoXCJzYXRlbGxpdGVHcmFwaFwiKTtcbnZhciByZWxhdGlvbiA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9yZWxhdGlvbihcImlzRnJpZW5kXCIsIFtcInBlcnNvblwiXSwgW1wicGVyc29uXCJdKTtcbmdyYXBoLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMocmVsYXRpb24pO1xuZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fZ3JhcGgoXCJzYXRlbGxpdGVHcmFwaFwiKTsiLCJvdXRwdXQiOiJ7W1NhdGVsbGl0ZUdyYXBoXSBcbiAgXCJpc0ZyaWVuZFwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDc4OSwgXCJpc0ZyaWVuZFwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwicGVyc29uXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwNzg3LCBcInBlcnNvblwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoQ3JlYXRlMyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphGeneralGraph1_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoR2VuZXJhbEdyYXBoMQpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIGdyYXBoTW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL2dlbmVyYWwtZ3JhcGgiKTsKdmFyIHNhdGVsbGl0ZUdyYXBoTW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwpncmFwaE1vZHVsZS5fY3JlYXRlKCJub3JtYWxHcmFwaCIsIFsgZ3JhcGhNb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpIF0sIFtdLCB7fSk7CnNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9jcmVhdGUoInNhdGVsbGl0ZUdyYXBoIiwgWyBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fcmVsYXRpb24oInNhdEVkZ2VzIiwgInNhdFZlcnRpY2VzIiwgInNhdFZlcnRpY2VzIikgXSwgW10sIHt9KTsKZGIuX2NyZWF0ZSgiY29sbGVjdGlvbiIsIHtudW1iZXJPZlNoYXJkczogOH0pOwp+ZGIuX2Ryb3AoImNvbGxlY3Rpb24iKTsKfnNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9kcm9wKCJzYXRlbGxpdGVHcmFwaCIsIHRydWUpOwp+Z3JhcGhNb2R1bGUuX2Ryb3AoIm5vcm1hbEdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvZ2VuZXJhbC1ncmFwaFwiKTtcbnZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoXCIpO1xuZ3JhcGhNb2R1bGUuX2NyZWF0ZShcIm5vcm1hbEdyYXBoXCIsIFsgZ3JhcGhNb2R1bGUuX3JlbGF0aW9uKFwiZWRnZXNcIiwgXCJ2ZXJ0aWNlc1wiLCBcInZlcnRpY2VzXCIpIF0sIFtdLCB7fSk7XG5zYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKFwic2F0ZWxsaXRlR3JhcGhcIiwgWyBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fcmVsYXRpb24oXCJzYXRFZGdlc1wiLCBcInNhdFZlcnRpY2VzXCIsIFwic2F0VmVydGljZXNcIikgXSwgW10sIHt9KTtcbmRiLl9jcmVhdGUoXCJjb2xsZWN0aW9uXCIsIHtudW1iZXJPZlNoYXJkczogOH0pOyIsIm91dHB1dCI6IntbR2VuZXJhbEdyYXBoXSBcbiAgXCJlZGdlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDgxOSwgXCJlZGdlc1wiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwidmVydGljZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA4MTgsIFwidmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufVxuXG57W1NhdGVsbGl0ZUdyYXBoXSBcbiAgXCJzYXRFZGdlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDgyNiwgXCJzYXRFZGdlc1wiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwic2F0VmVydGljZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA4MjQsIFwic2F0VmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufVxuXG5bQXJhbmdvQ29sbGVjdGlvbiA2MDEwODMwLCBcImNvbGxlY3Rpb25cIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoR2VuZXJhbEdyYXBoMSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphGeneralGraph2_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoR2VuZXJhbEdyYXBoMgpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KfnZhciBncmFwaE1vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7Cn52YXIgc2F0ZWxsaXRlR3JhcGhNb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7Cn5ncmFwaE1vZHVsZS5fY3JlYXRlKCJub3JtYWxHcmFwaCIsIFsgZ3JhcGhNb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpIF0sIFtdLCB7fSk7Cn5zYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKCJzYXRlbGxpdGVHcmFwaCIsIFsgc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX3JlbGF0aW9uKCJzYXRFZGdlcyIsICJzYXRWZXJ0aWNlcyIsICJzYXRWZXJ0aWNlcyIpIF0sIFtdLCB7fSk7Cn5kYi5fY3JlYXRlKCJjb2xsZWN0aW9uIiwge251bWJlck9mU2hhcmRzOiA4fSk7CmRiLl9leHBsYWluKGBGT1IgZG9jIGluIGNvbGxlY3Rpb24gRk9SIHYsZSxwIElOIE9VVEJPVU5EICJ2ZXJ0aWNlcy9zdGFydCIgR1JBUEggIm5vcm1hbEdyYXBoIiBSRVRVUk4gW2RvYyx2LGUscF1gLCB7fSwge2NvbG9yczogZmFsc2V9KTsKfmRiLl9kcm9wKCJjb2xsZWN0aW9uIik7Cn5zYXRlbGxpdGVHcmFwaE1vZHVsZS5fZHJvcCgic2F0ZWxsaXRlR3JhcGgiLCB0cnVlKTsKfmdyYXBoTW9kdWxlLl9kcm9wKCJub3JtYWxHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImRiLl9leHBsYWluKGBGT1IgZG9jIGluIGNvbGxlY3Rpb24gRk9SIHYsZSxwIElOIE9VVEJPVU5EIFwidmVydGljZXMvc3RhcnRcIiBHUkFQSCBcIm5vcm1hbEdyYXBoXCIgUkVUVVJOIFtkb2MsdixlLHBdYCwge30sIHtjb2xvcnM6IGZhbHNlfSk7Iiwib3V0cHV0IjoiUXVlcnkgU3RyaW5nICg5OSBjaGFycywgY2FjaGVhYmxlOiB0cnVlKTpcbiBGT1IgZG9jIGluIGNvbGxlY3Rpb24gRk9SIHYsZSxwIElOIE9VVEJPVU5EIFwidmVydGljZXMvc3RhcnRcIiBHUkFQSCBcIm5vcm1hbEdyYXBoXCIgUkVUVVJOIFtkb2MsdixlLHBdXG5cbkV4ZWN1dGlvbiBwbGFuOlxuIElkICAgTm9kZVR5cGUgICAgICAgICAgICAgICAgICBTaXRlICBFc3QuICAgQ29tbWVudFxuICAxICAgU2luZ2xldG9uTm9kZSAgICAgICAgICAgICBEQlMgICAgICAxICAgKiBST09UXG4gIDIgICBFbnVtZXJhdGVDb2xsZWN0aW9uTm9kZSAgIERCUyAgICAgIDAgICAgIC0gRk9SIGRvYyBJTiBjb2xsZWN0aW9uICAgLyogZnVsbCBjb2xsZWN0aW9uIHNjYW4sIDggc2hhcmQocykgICovXG4gIDggICBSZW1vdGVOb2RlICAgICAgICAgICAgICAgIENPT1IgICAgIDAgICAgICAgLSBSRU1PVEVcbiAgOSAgIEdhdGhlck5vZGUgICAgICAgICAgICAgICAgQ09PUiAgICAgMCAgICAgICAtIEdBVEhFUiAgIC8qIHVuc29ydGVkICovXG4gIDMgICBUcmF2ZXJzYWxOb2RlICAgICAgICAgICAgIENPT1IgICAgIDEgICAgICAgLSBGT1IgdiAgLyogdmVydGV4ICovLCBlICAvKiBlZGdlICovLCBwICAvKiBwYXRoczogdmVydGljZXMsIGVkZ2VzICovIElOIDEuLjEgIC8qIG1pbi4ubWF4UGF0aERlcHRoICovIE9VVEJPVU5EICd2ZXJ0aWNlcy9zdGFydCcgLyogc3RhcnRub2RlICovICBHUkFQSCAnbm9ybWFsR3JhcGgnXG4gIDQgICBDYWxjdWxhdGlvbk5vZGUgICAgICAgICAgIENPT1IgICAgIDEgICAgICAgICAtIExFVCAjNiA9IFsgZG9jLCB2LCBlLCBwIF0gICAvKiBzaW1wbGUgZXhwcmVzc2lvbiAqLyAgIC8qIGNvbGxlY3Rpb25zIHVzZWQ6IGRvYyA6IGNvbGxlY3Rpb24gKi9cbiAgNSAgIFJldHVybk5vZGUgICAgICAgICAgICAgICAgQ09PUiAgICAgMSAgICAgICAgIC0gUkVUVVJOICM2XG5cbkluZGV4ZXMgdXNlZDpcbiBCeSAgIE5hbWUgICBUeXBlICAgQ29sbGVjdGlvbiAgIFVuaXF1ZSAgIFNwYXJzZSAgIENhY2hlICAgU2VsZWN0aXZpdHkgICBGaWVsZHMgICAgICAgIFN0b3JlZCB2YWx1ZXMgICBSYW5nZXNcbiAgMyAgIGVkZ2UgICBlZGdlICAgZWRnZXMgICAgICAgIGZhbHNlICAgIGZhbHNlICAgIGZhbHNlICAgICAgMTAwLjAwICUgICBbIGBfZnJvbWAgXSAgIFsgIF0gICAgICAgICAgICBiYXNlIE9VVEJPVU5EXG5cblRyYXZlcnNhbHMgb24gZ3JhcGhzOlxuIElkICBEZXB0aCAgVmVydGV4IGNvbGxlY3Rpb25zICBFZGdlIGNvbGxlY3Rpb25zICBPcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlciAvIFBydW5lIENvbmRpdGlvbnNcbiAzICAgMS4uMSAgIHZlcnRpY2VzICAgICAgICAgICAgZWRnZXMgICAgICAgICAgICAgdW5pcXVlVmVydGljZXM6IG5vbmUsIHVuaXF1ZUVkZ2VzOiBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbk9wdGltaXphdGlvbiBydWxlcyBhcHBsaWVkOlxuIElkICAgUnVsZU5hbWVcbiAgMSAgIHNjYXR0ZXItaW4tY2x1c3RlclxuICAyICAgcmVtb3ZlLXVubmVjZXNzYXJ5LXJlbW90ZS1zY2F0dGVyXG5cbjY0IHJ1bGUocykgZXhlY3V0ZWQsIDEgcGxhbihzKSBjcmVhdGVkLCBwZWFrIG1lbSBbYl06IDAsIGV4ZWMgdGltZSBbc106IDAuMDAxMTQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhHZW5lcmFsR3JhcGgyIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "satelliteGraphGeneralGraph3_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoR2VuZXJhbEdyYXBoMwpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KfnZhciBncmFwaE1vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9nZW5lcmFsLWdyYXBoIik7Cn52YXIgc2F0ZWxsaXRlR3JhcGhNb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7Cn5ncmFwaE1vZHVsZS5fY3JlYXRlKCJub3JtYWxHcmFwaCIsIFsgZ3JhcGhNb2R1bGUuX3JlbGF0aW9uKCJlZGdlcyIsICJ2ZXJ0aWNlcyIsICJ2ZXJ0aWNlcyIpIF0sIFtdLCB7fSk7Cn5zYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKCJzYXRlbGxpdGVHcmFwaCIsIFsgc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX3JlbGF0aW9uKCJzYXRFZGdlcyIsICJzYXRWZXJ0aWNlcyIsICJzYXRWZXJ0aWNlcyIpIF0sIFtdLCB7fSk7Cn5kYi5fY3JlYXRlKCJjb2xsZWN0aW9uIiwge251bWJlck9mU2hhcmRzOiA4fSk7CmRiLl9leHBsYWluKGBGT1IgZG9jIGluIGNvbGxlY3Rpb24gRk9SIHYsZSxwIElOIE9VVEJPVU5EICJ2ZXJ0aWNlcy9zdGFydCIgR1JBUEggInNhdGVsbGl0ZUdyYXBoIiBSRVRVUk4gW2RvYyx2LGUscF1gLCB7fSwge2NvbG9yczogZmFsc2V9KTsKfmRiLl9kcm9wKCJjb2xsZWN0aW9uIik7Cn5zYXRlbGxpdGVHcmFwaE1vZHVsZS5fZHJvcCgic2F0ZWxsaXRlR3JhcGgiLCB0cnVlKTsKfmdyYXBoTW9kdWxlLl9kcm9wKCJub3JtYWxHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImRiLl9leHBsYWluKGBGT1IgZG9jIGluIGNvbGxlY3Rpb24gRk9SIHYsZSxwIElOIE9VVEJPVU5EIFwidmVydGljZXMvc3RhcnRcIiBHUkFQSCBcInNhdGVsbGl0ZUdyYXBoXCIgUkVUVVJOIFtkb2MsdixlLHBdYCwge30sIHtjb2xvcnM6IGZhbHNlfSk7Iiwib3V0cHV0IjoiUXVlcnkgU3RyaW5nICgxMDIgY2hhcnMsIGNhY2hlYWJsZTogdHJ1ZSk6XG4gRk9SIGRvYyBpbiBjb2xsZWN0aW9uIEZPUiB2LGUscCBJTiBPVVRCT1VORCBcInZlcnRpY2VzL3N0YXJ0XCIgR1JBUEggXCJzYXRlbGxpdGVHcmFwaFwiIFJFVFVSTiBcbiBbZG9jLHYsZSxwXVxuXG5FeGVjdXRpb24gcGxhbjpcbiBJZCAgIE5vZGVUeXBlICAgICAgICAgICAgICAgICAgU2l0ZSAgRXN0LiAgIENvbW1lbnRcbiAgMSAgIFNpbmdsZXRvbk5vZGUgICAgICAgICAgICAgREJTICAgICAgMSAgICogUk9PVFxuICAyICAgRW51bWVyYXRlQ29sbGVjdGlvbk5vZGUgICBEQlMgICAgICAwICAgICAtIEZPUiBkb2MgSU4gY29sbGVjdGlvbiAgIC8qIGZ1bGwgY29sbGVjdGlvbiBzY2FuLCA4IHNoYXJkKHMpICAqL1xuIDEwICAgVHJhdmVyc2FsTm9kZSAgICAgICAgICAgICBEQlMgICAgICAxICAgICAgIC0gRk9SIHYgIC8qIHZlcnRleCAqLywgZSAgLyogZWRnZSAqLywgcCAgLyogcGF0aHM6IHZlcnRpY2VzLCBlZGdlcyAqLyBJTiAxLi4xICAvKiBtaW4uLm1heFBhdGhEZXB0aCAqLyBPVVRCT1VORCAndmVydGljZXMvc3RhcnQnIC8qIHN0YXJ0bm9kZSAqLyAgR1JBUEggJ3NhdGVsbGl0ZUdyYXBoJyAvKiBsb2NhbCBncmFwaCBub2RlLCB1c2VkIGFzIHNhdGVsbGl0ZSAqL1xuICA0ICAgQ2FsY3VsYXRpb25Ob2RlICAgICAgICAgICBEQlMgICAgICAxICAgICAgICAgLSBMRVQgIzYgPSBbIGRvYywgdiwgZSwgcCBdICAgLyogc2ltcGxlIGV4cHJlc3Npb24gKi8gICAvKiBjb2xsZWN0aW9ucyB1c2VkOiBkb2MgOiBjb2xsZWN0aW9uICovXG4gMTMgICBSZW1vdGVOb2RlICAgICAgICAgICAgICAgIENPT1IgICAgIDEgICAgICAgICAtIFJFTU9URVxuIDE0ICAgR2F0aGVyTm9kZSAgICAgICAgICAgICAgICBDT09SICAgICAxICAgICAgICAgLSBHQVRIRVIgICAvKiBwYXJhbGxlbCwgdW5zb3J0ZWQgKi9cbiAgNSAgIFJldHVybk5vZGUgICAgICAgICAgICAgICAgQ09PUiAgICAgMSAgICAgICAgIC0gUkVUVVJOICM2XG5cbkluZGV4ZXMgdXNlZDpcbiBCeSAgIE5hbWUgICBUeXBlICAgQ29sbGVjdGlvbiAgIFVuaXF1ZSAgIFNwYXJzZSAgIENhY2hlICAgU2VsZWN0aXZpdHkgICBGaWVsZHMgICAgICAgIFN0b3JlZCB2YWx1ZXMgICBSYW5nZXNcbiAxMCAgIGVkZ2UgICBlZGdlICAgc2F0RWRnZXMgICAgIGZhbHNlICAgIGZhbHNlICAgIGZhbHNlICAgICAgMTAwLjAwICUgICBbIGBfZnJvbWAgXSAgIFsgIF0gICAgICAgICAgICBiYXNlIE9VVEJPVU5EXG5cblRyYXZlcnNhbHMgb24gZ3JhcGhzOlxuIElkICBEZXB0aCAgVmVydGV4IGNvbGxlY3Rpb25zICBFZGdlIGNvbGxlY3Rpb25zICBPcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlciAvIFBydW5lIENvbmRpdGlvbnNcbiAxMCAgMS4uMSAgIHNhdFZlcnRpY2VzICAgICAgICAgc2F0RWRnZXMgICAgICAgICAgdW5pcXVlVmVydGljZXM6IG5vbmUsIHVuaXF1ZUVkZ2VzOiBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbk9wdGltaXphdGlvbiBydWxlcyBhcHBsaWVkOlxuIElkICAgUnVsZU5hbWVcbiAgMSAgIHNjYXR0ZXItaW4tY2x1c3RlclxuICAyICAgc2NhdHRlci1zYXRlbGxpdGUtZ3JhcGhzXG4gIDMgICByZW1vdmUtc2F0ZWxsaXRlLWpvaW5zXG4gIDQgICBkaXN0cmlidXRlLWZpbHRlcmNhbGMtdG8tY2x1c3RlclxuICA1ICAgcmVtb3ZlLXVubmVjZXNzYXJ5LXJlbW90ZS1zY2F0dGVyXG4gIDYgICBwYXJhbGxlbGl6ZS1nYXRoZXJcblxuNjQgcnVsZShzKSBleGVjdXRlZCwgMSBwbGFuKHMpIGNyZWF0ZWQsIHBlYWsgbWVtIFtiXTogMCwgZXhlYyB0aW1lIFtzXTogMC4wMDA5MiIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzYXRlbGxpdGVHcmFwaEdlbmVyYWxHcmFwaDMiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphManagementCreate1_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudENyZWF0ZTEKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zYXRlbGxpdGUtZ3JhcGgiKTsKdmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZSgic2F0ZWxsaXRlR3JhcGgiKTsKc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2dyYXBoKCJzYXRlbGxpdGVHcmFwaCIpOwp+c2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2Ryb3AoInNhdGVsbGl0ZUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoXCIpO1xudmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZShcInNhdGVsbGl0ZUdyYXBoXCIpO1xuc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2dyYXBoKFwic2F0ZWxsaXRlR3JhcGhcIik7Iiwib3V0cHV0Ijoie1tTYXRlbGxpdGVHcmFwaF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudENyZWF0ZTEiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphManagementCreate2_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudENyZWF0ZTIKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7CnZhciBlZGdlRGVmaW5pdGlvbnMgPSBbIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIikgXTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBlZGdlRGVmaW5pdGlvbnMpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaFwiKTtcbnZhciBlZGdlRGVmaW5pdGlvbnMgPSBbIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJlZGdlc1wiLCBcInZlcnRpY2VzXCIsIFwidmVydGljZXNcIikgXTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBlZGdlRGVmaW5pdGlvbnMpO1xuZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKFwibXlHcmFwaFwiKTsiLCJvdXRwdXQiOiJ7W1NhdGVsbGl0ZUdyYXBoXSBcbiAgXCJlZGdlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDkxNywgXCJlZGdlc1wiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwidmVydGljZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA5MTUsIFwidmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzYXRlbGxpdGVHcmFwaE1hbmFnZW1lbnRDcmVhdGUyIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "satelliteGraphManagementCreate3_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudENyZWF0ZTMKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7CnZhciBlZGdlRGVmaW5pdGlvbnMgPSBbIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15UmVsYXRpb24iLCBbIm1hbGUiLCAiZmVtYWxlIl0sIFsibWFsZSIsICJmZW1hbGUiXSkgXTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBlZGdlRGVmaW5pdGlvbnMsIFsic2Vzc2lvbnMiXSk7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgibXlHcmFwaCIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaFwiKTtcbnZhciBlZGdlRGVmaW5pdGlvbnMgPSBbIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJteVJlbGF0aW9uXCIsIFtcIm1hbGVcIiwgXCJmZW1hbGVcIl0sIFtcIm1hbGVcIiwgXCJmZW1hbGVcIl0pIF07XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgZWRnZURlZmluaXRpb25zLCBbXCJzZXNzaW9uc1wiXSk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU2F0ZWxsaXRlR3JhcGhdIFxuICBcIm15UmVsYXRpb25cIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA5MzAsIFwibXlSZWxhdGlvblwiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwiZmVtYWxlXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwOTI5LCBcImZlbWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcIm1hbGVcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA5MjgsIFwibWFsZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInNlc3Npb25zXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwOTI2LCBcInNlc3Npb25zXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhNYW5hZ2VtZW50Q3JlYXRlMyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphManagementModify1_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTEKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdKTsKZ3JhcGguX29ycGhhbkNvbGxlY3Rpb25zKCk7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaFwiKTtcbnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJlZGdlc1wiLCBcInZlcnRpY2VzXCIsIFwidmVydGljZXNcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW3JlbGF0aW9uXSwgW1wib3RoZXJcIl0pO1xuZ3JhcGguX29ycGhhbkNvbGxlY3Rpb25zKCk7Iiwib3V0cHV0IjoiWyBcbiAgXCJvdGhlclwiIFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzYXRlbGxpdGVHcmFwaE1hbmFnZW1lbnRNb2RpZnkxIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "satelliteGraphManagementModify2_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTIKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdKTsKZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oIm90aGVyIiwgdHJ1ZSk7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgibXlHcmFwaCIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwib3RoZXJcIiwgdHJ1ZSk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU2F0ZWxsaXRlR3JhcGhdIFxuICBcImVkZ2VzXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwOTY1LCBcImVkZ2VzXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJ2ZXJ0aWNlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDk2MiwgXCJ2ZXJ0aWNlc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTIiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphManagementModify3_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTMKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10pOwpncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbigidmVydGljZXMiKTsgLy8geHBFcnJvcihFUlJPUl9HUkFQSF9OT1RfSU5fT1JQSEFOX0NPTExFQ1RJT04pCn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwidmVydGljZXNcIik7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxOTI4OiBjb2xsZWN0aW9uIGlzIG5vdCBpbiBsaXN0IG9mIG9ycGhhbiBjb2xsZWN0aW9uc10iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhNYW5hZ2VtZW50TW9kaWZ5MyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphManagementModify4_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTQKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10pOwpncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oImVkZ2VzIik7CmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJ2ZXJ0aWNlcyIpOwpkYi5fZHJvcCgidmVydGljZXMiKTsgLy8geHBFcnJvcihFUlJPUl9DTFVTVEVSX01VU1RfTk9UX0RST1BfQ09MTF9PVEhFUl9ESVNUUklCVVRFU0hBUkRTTElLRSkKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOwp+ZGIuX2Ryb3AoImVkZ2VzIik7Cn5kYi5fZHJvcCgidmVydGljZXMiKTs=", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaFwiKTtcbnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJlZGdlc1wiLCBcInZlcnRpY2VzXCIsIFwidmVydGljZXNcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW3JlbGF0aW9uXSwgW10pO1xuZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKFwiZWRnZXNcIik7XG5ncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbihcInZlcnRpY2VzXCIpO1xuZGIuX2Ryb3AoXCJ2ZXJ0aWNlc1wiKTsgIiwib3V0cHV0IjoiW0FyYW5nb0Vycm9yIDE0ODU6IENvbGxlY3Rpb24gJ3ZlcnRpY2VzJyBtdXN0IG5vdCBiZSBkcm9wcGVkIHdoaWxlICdlZGdlcycgaGFzIGRpc3RyaWJ1dGVTaGFyZHNMaWtlIHNldCB0byAndmVydGljZXMnLl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhNYW5hZ2VtZW50TW9kaWZ5NCIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphManagementModify5_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTUKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10pOwpncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oImVkZ2VzIik7ICAgICAgLy8gUmVtb3ZlIGVkZ2UgY29sbGVjdGlvbiBmcm9tIGdyYXBoIGRlZmluaXRpb24KZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oInZlcnRpY2VzIik7IC8vIFJlbW92ZSB2ZXJ0ZXggY29sbGVjdGlvbiBmcm9tIGdyYXBoIGRlZmluaXRpb24KZ3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7ICAgICAgIC8vIERvZXMgbm90IGRyb3AgYW55IGNvbGxlY3Rpb25zIGJlY2F1c2Ugbm9uZSBhcmUgbGVmdCBpbiB0aGUgZ3JhcGggZGVmaW5pdGlvbgpkYi5fZHJvcCgiZWRnZXMiKTsgLy8gTWFudWFsbHkgY2xlYW4gdXAgdGhlIGNvbGxlY3Rpb25zIHRoYXQgd2VyZSBsZWZ0IGJlaGluZCwgZHJvcCAnZWRnZXMnIGJlZm9yZSBzaGFyZGluZy1kZWZpbmluZyAndmVydGljZXMnIGNvbGxlY3Rpb24KZGIuX2Ryb3AoInZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaFwiKTtcbnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJlZGdlc1wiLCBcInZlcnRpY2VzXCIsIFwidmVydGljZXNcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW3JlbGF0aW9uXSwgW10pO1xuZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKFwiZWRnZXNcIik7ICAgICAgLy8gUmVtb3ZlIGVkZ2UgY29sbGVjdGlvbiBmcm9tIGdyYXBoIGRlZmluaXRpb25cbmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwidmVydGljZXNcIik7IC8vIFJlbW92ZSB2ZXJ0ZXggY29sbGVjdGlvbiBmcm9tIGdyYXBoIGRlZmluaXRpb25cbmdyYXBoX21vZHVsZS5fZHJvcChcIm15R3JhcGhcIiwgdHJ1ZSk7ICAgICAgIC8vIERvZXMgbm90IGRyb3AgYW55IGNvbGxlY3Rpb25zIGJlY2F1c2Ugbm9uZSBhcmUgbGVmdCBpbiB0aGUgZ3JhcGggZGVmaW5pdGlvblxuZGIuX2Ryb3AoXCJlZGdlc1wiKTsgLy8gTWFudWFsbHkgY2xlYW4gdXAgdGhlIGNvbGxlY3Rpb25zIHRoYXQgd2VyZSBsZWZ0IGJlaGluZCwgZHJvcCAnZWRnZXMnIGJlZm9yZSBzaGFyZGluZy1kZWZpbmluZyAndmVydGljZXMnIGNvbGxlY3Rpb25cbmRiLl9kcm9wKFwidmVydGljZXNcIik7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTUiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphManagementModify6_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTYKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10pOwpncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oImVkZ2VzIiwgdHJ1ZSk7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgibXlHcmFwaCIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaFwiKTtcbnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oXCJlZGdlc1wiLCBcInZlcnRpY2VzXCIsIFwidmVydGljZXNcIik7XG52YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZShcIm15R3JhcGhcIiwgW3JlbGF0aW9uXSwgW10pO1xuZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKFwiZWRnZXNcIiwgdHJ1ZSk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU2F0ZWxsaXRlR3JhcGhdIFxuICBcInZlcnRpY2VzXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExMDA2LCBcInZlcnRpY2VzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhNYW5hZ2VtZW50TW9kaWZ5NiIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphManagementModify7_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudE1vZGlmeTcKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10pOwpncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oImVkZ2VzIik7CmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJ2ZXJ0aWNlcyIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7Cn5kYi5fZHJvcCgiZWRnZXMiKTsKfmRiLl9kcm9wKCJ2ZXJ0aWNlcyIpOw==", + "response": "eyJpbnB1dCI6ImdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcImVkZ2VzXCIpO1xuZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oXCJ2ZXJ0aWNlc1wiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhNYW5hZ2VtZW50TW9kaWZ5NyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphManagementRemove1_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudFJlbW92ZTEKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdKTsKZ3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImdyYXBoX21vZHVsZS5fZHJvcChcIm15R3JhcGhcIiwgdHJ1ZSk7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudFJlbW92ZTEiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphManagementRemove2_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoTWFuYWdlbWVudFJlbW92ZTIKZGVzY3JpcHRpb246ICcnCnR5cGU6IGNsdXN0ZXIKLS0tCn52YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdKTsKZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oIm90aGVyIik7CmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOyAvLyB4cEVycm9yKEVSUk9SX0NMVVNURVJfTVVTVF9OT1RfRFJPUF9DT0xMX09USEVSX0RJU1RSSUJVVEVTSEFSRFNMSUtFKQp+ZGIuX2Ryb3AoIm90aGVyIik7Cn5kYi5fZHJvcCgidmVydGljZXMiKTs=", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwib3RoZXJcIik7XG5ncmFwaF9tb2R1bGUuX2Ryb3AoXCJteUdyYXBoXCIsIHRydWUpOyAiLCJvdXRwdXQiOiJbQXJhbmdvRXJyb3IgMTQ4NTogQ29sbGVjdGlvbiAndmVydGljZXMnIG11c3Qgbm90IGJlIGRyb3BwZWQgd2hpbGUgJ290aGVyJyBoYXMgZGlzdHJpYnV0ZVNoYXJkc0xpa2Ugc2V0IHRvICd2ZXJ0aWNlcycuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzYXRlbGxpdGVHcmFwaE1hbmFnZW1lbnRSZW1vdmUyIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "satelliteGraphPrototype1_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoUHJvdG90eXBlMQpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIHNhdGVsbGl0ZUdyYXBoTW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKCJzYXRlbGxpdGVHcmFwaCIpOwpncmFwaDsKfnNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9kcm9wKCJzYXRlbGxpdGVHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoXCIpO1xudmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZShcInNhdGVsbGl0ZUdyYXBoXCIpO1xuZ3JhcGg7Iiwib3V0cHV0Ijoie1tTYXRlbGxpdGVHcmFwaF0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNhdGVsbGl0ZUdyYXBoUHJvdG90eXBlMSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "satelliteGraphPrototype2_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoUHJvdG90eXBlMgpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIHNhdGVsbGl0ZUdyYXBoTW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKCJzYXRlbGxpdGVHcmFwaCIpOwpncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigibXlQcm90b3R5cGVDb2xsIik7CmdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2dyYXBoKCJzYXRlbGxpdGVHcmFwaCIpOwp+c2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2Ryb3AoInNhdGVsbGl0ZUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoXCIpO1xudmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZShcInNhdGVsbGl0ZUdyYXBoXCIpO1xuZ3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oXCJteVByb3RvdHlwZUNvbGxcIik7XG5ncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9ncmFwaChcInNhdGVsbGl0ZUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU2F0ZWxsaXRlR3JhcGhdIFxuICBcIm15UHJvdG90eXBlQ29sbFwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMDc5OSwgXCJteVByb3RvdHlwZUNvbGxcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzYXRlbGxpdGVHcmFwaFByb3RvdHlwZTIiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "satelliteGraphPrototype3_cluster": { + "request": "LS0tCm5hbWU6IHNhdGVsbGl0ZUdyYXBoUHJvdG90eXBlMwpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIHNhdGVsbGl0ZUdyYXBoTW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NhdGVsbGl0ZS1ncmFwaCIpOwp2YXIgZ3JhcGggPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fY3JlYXRlKCJzYXRlbGxpdGVHcmFwaCIpOwp2YXIgcmVsYXRpb24gPSBzYXRlbGxpdGVHcmFwaE1vZHVsZS5fcmVsYXRpb24oImlzRnJpZW5kIiwgWyJwZXJzb24iXSwgWyJwZXJzb24iXSk7CmdyYXBoLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMocmVsYXRpb24pOwpncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9ncmFwaCgic2F0ZWxsaXRlR3JhcGgiKTsKfnNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9kcm9wKCJzYXRlbGxpdGVHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBzYXRlbGxpdGVHcmFwaE1vZHVsZSA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvc2F0ZWxsaXRlLWdyYXBoXCIpO1xudmFyIGdyYXBoID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX2NyZWF0ZShcInNhdGVsbGl0ZUdyYXBoXCIpO1xudmFyIHJlbGF0aW9uID0gc2F0ZWxsaXRlR3JhcGhNb2R1bGUuX3JlbGF0aW9uKFwiaXNGcmllbmRcIiwgW1wicGVyc29uXCJdLCBbXCJwZXJzb25cIl0pO1xuZ3JhcGguX2V4dGVuZEVkZ2VEZWZpbml0aW9ucyhyZWxhdGlvbik7XG5ncmFwaCA9IHNhdGVsbGl0ZUdyYXBoTW9kdWxlLl9ncmFwaChcInNhdGVsbGl0ZUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU2F0ZWxsaXRlR3JhcGhdIFxuICBcImlzRnJpZW5kXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDEwODA5LCBcImlzRnJpZW5kXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJwZXJzb25cIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTA4MDcsIFwicGVyc29uXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2F0ZWxsaXRlR3JhcGhQcm90b3R5cGUzIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "searchHighlighting_1_single": { + "request": "LS0tCm5hbWU6IHNlYXJjaEhpZ2hsaWdodGluZ18xCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJmb29kIik7CnZhciBkb2NzID0gZGIuZm9vZC5zYXZlKFsKICB7IG5hbWU6ICJhdm9jYWRvIiwgZGVzY3JpcHRpb246IHsgZW46ICJUaGUgYXZvY2FkbyBpcyBhIG1lZGl1bS1zaXplZCwgZXZlcmdyZWVuIHRyZWUsIG5hdGl2ZSB0byB0aGUgQW1lcmljYXMuIiB9IH0sCiAgeyBuYW1lOiAiY2Fycm90IiwgZGVzY3JpcHRpb246IHsgZW46ICJUaGUgY2Fycm90IGlzIGEgcm9vdCB2ZWdldGFibGUsIHR5cGljYWxseSBvcmFuZ2UgaW4gY29sb3IsIG5hdGl2ZSB0byBFdXJvcGUgYW5kIFNvdXRod2VzdGVybiBBc2lhLiIgfSB9LAogIHsgbmFtZTogImNoaWxpIHBlcHBlciIsIGRlc2NyaXB0aW9uOiB7IGVuOiAiQ2hpbGkgcGVwcGVycyBhcmUgdmFyaWV0aWVzIG9mIHRoZSBiZXJyeS1mcnVpdCBvZiBwbGFudHMgZnJvbSB0aGUgZ2VudXMgQ2Fwc2ljdW0sIGN1bHRpdmF0ZWQgZm9yIHRoZWlyIHB1bmdlbmN5LiIgfSB9LAogIHsgbmFtZTogInRvbWF0byIsIGRlc2NyaXB0aW9uOiB7IGVuOiAiVGhlIHRvbWF0byBpcyB0aGUgZWRpYmxlIGJlcnJ5IG9mIHRoZSB0b21hdG8gcGxhbnQuIiB9IH0KXSk7CnZhciBhbmFseXplcnMgPSByZXF1aXJlKCJAYXJhbmdvZGIvYW5hbHl6ZXJzIik7CnZhciBhbmFseXplciA9IGFuYWx5emVycy5zYXZlKCJ0ZXh0X2VuX29mZnNldCIsICJ0ZXh0IiwgeyBsb2NhbGU6ICJlbiIsIHN0b3B3b3JkczogW10gfSwgWyJmcmVxdWVuY3kiLCAicG9zaXRpb24iLCAib2Zmc2V0Il0pOwp2YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KCJmb29kX3ZpZXciLCAiYXJhbmdvc2VhcmNoIiwgeyBsaW5rczogeyBmb29kOiB7IGZpZWxkczogeyBkZXNjcmlwdGlvbjogeyBmaWVsZHM6IHsgZW46IHsgYW5hbHl6ZXJzOiBbInRleHRfZW5fb2Zmc2V0Il0gfSB9IH0gfSB9IH0gfSk7Cn5hc3NlcnQoZGIuX3F1ZXJ5KGBGT1IgZCBJTiBmb29kX3ZpZXcgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gYyBSRVRVUk4gY2ApLnRvQXJyYXkoKVswXSA9PT0gNCk7CmRiLl9xdWVyeShgRk9SIGRvYyBJTiBmb29kX3ZpZXcKICBTRUFSQ0ggQU5BTFlaRVIoCiAgICBUT0tFTlMoImF2b2NhZG8gdG9tYXRvIiwgInRleHRfZW5fb2Zmc2V0IikgQU5ZID09IGRvYy5kZXNjcmlwdGlvbi5lbiBPUgogICAgUEhSQVNFKGRvYy5kZXNjcmlwdGlvbi5lbiwgImN1bHRpdmF0ZWQiLCAyLCAicHVuZ2VuY3kiKSBPUgogICAgU1RBUlRTX1dJVEgoZG9jLmRlc2NyaXB0aW9uLmVuLCAiY2FwIikKICAsICJ0ZXh0X2VuX29mZnNldCIpCiAgRk9SIG9mZnNldEluZm8gSU4gT0ZGU0VUX0lORk8oZG9jLCBbImRlc2NyaXB0aW9uLmVuIl0pCiAgICBSRVRVUk4gewogICAgICBkZXNjcmlwdGlvbjogZG9jLmRlc2NyaXB0aW9uLAogICAgICBuYW1lOiBvZmZzZXRJbmZvLm5hbWUsCiAgICAgIG1hdGNoZXM6IG9mZnNldEluZm8ub2Zmc2V0c1sqIFJFVFVSTiB7CiAgICAgICAgb2Zmc2V0OiBDVVJSRU5ULAogICAgICAgIG1hdGNoOiBTVUJTVFJJTkdfQllURVMoVkFMVUUoZG9jLCBvZmZzZXRJbmZvLm5hbWUpLCBDVVJSRU5UWzBdLCBDVVJSRU5UWzFdKQogICAgICB9XQogICAgfWApLnRvQXJyYXkoKTsKfmRiLl9kcm9wVmlldygiZm9vZF92aWV3Iik7Cn5kYi5fZHJvcCgiZm9vZCIpOwp+YW5hbHl6ZXJzLnJlbW92ZShhbmFseXplci5uYW1lKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcImZvb2RcIik7XG52YXIgZG9jcyA9IGRiLmZvb2Quc2F2ZShbXG4gIHsgbmFtZTogXCJhdm9jYWRvXCIsIGRlc2NyaXB0aW9uOiB7IGVuOiBcIlRoZSBhdm9jYWRvIGlzIGEgbWVkaXVtLXNpemVkLCBldmVyZ3JlZW4gdHJlZSwgbmF0aXZlIHRvIHRoZSBBbWVyaWNhcy5cIiB9IH0sXG4gIHsgbmFtZTogXCJjYXJyb3RcIiwgZGVzY3JpcHRpb246IHsgZW46IFwiVGhlIGNhcnJvdCBpcyBhIHJvb3QgdmVnZXRhYmxlLCB0eXBpY2FsbHkgb3JhbmdlIGluIGNvbG9yLCBuYXRpdmUgdG8gRXVyb3BlIGFuZCBTb3V0aHdlc3Rlcm4gQXNpYS5cIiB9IH0sXG4gIHsgbmFtZTogXCJjaGlsaSBwZXBwZXJcIiwgZGVzY3JpcHRpb246IHsgZW46IFwiQ2hpbGkgcGVwcGVycyBhcmUgdmFyaWV0aWVzIG9mIHRoZSBiZXJyeS1mcnVpdCBvZiBwbGFudHMgZnJvbSB0aGUgZ2VudXMgQ2Fwc2ljdW0sIGN1bHRpdmF0ZWQgZm9yIHRoZWlyIHB1bmdlbmN5LlwiIH0gfSxcbiAgeyBuYW1lOiBcInRvbWF0b1wiLCBkZXNjcmlwdGlvbjogeyBlbjogXCJUaGUgdG9tYXRvIGlzIHRoZSBlZGlibGUgYmVycnkgb2YgdGhlIHRvbWF0byBwbGFudC5cIiB9IH1cbl0pO1xudmFyIGFuYWx5emVycyA9IHJlcXVpcmUoXCJAYXJhbmdvZGIvYW5hbHl6ZXJzXCIpO1xudmFyIGFuYWx5emVyID0gYW5hbHl6ZXJzLnNhdmUoXCJ0ZXh0X2VuX29mZnNldFwiLCBcInRleHRcIiwgeyBsb2NhbGU6IFwiZW5cIiwgc3RvcHdvcmRzOiBbXSB9LCBbXCJmcmVxdWVuY3lcIiwgXCJwb3NpdGlvblwiLCBcIm9mZnNldFwiXSk7XG52YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KFwiZm9vZF92aWV3XCIsIFwiYXJhbmdvc2VhcmNoXCIsIHsgbGlua3M6IHsgZm9vZDogeyBmaWVsZHM6IHsgZGVzY3JpcHRpb246IHsgZmllbGRzOiB7IGVuOiB7IGFuYWx5emVyczogW1widGV4dF9lbl9vZmZzZXRcIl0gfSB9IH0gfSB9IH0gfSk7XG5kYi5fcXVlcnkoYEZPUiBkb2MgSU4gZm9vZF92aWV3XG4gIFNFQVJDSCBBTkFMWVpFUihcbiAgICBUT0tFTlMoXCJhdm9jYWRvIHRvbWF0b1wiLCBcInRleHRfZW5fb2Zmc2V0XCIpIEFOWSA9PSBkb2MuZGVzY3JpcHRpb24uZW4gT1JcbiAgICBQSFJBU0UoZG9jLmRlc2NyaXB0aW9uLmVuLCBcImN1bHRpdmF0ZWRcIiwgMiwgXCJwdW5nZW5jeVwiKSBPUlxuICAgIFNUQVJUU19XSVRIKGRvYy5kZXNjcmlwdGlvbi5lbiwgXCJjYXBcIilcbiAgLCBcInRleHRfZW5fb2Zmc2V0XCIpXG4gIEZPUiBvZmZzZXRJbmZvIElOIE9GRlNFVF9JTkZPKGRvYywgW1wiZGVzY3JpcHRpb24uZW5cIl0pXG4gICAgUkVUVVJOIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBkb2MuZGVzY3JpcHRpb24sXG4gICAgICBuYW1lOiBvZmZzZXRJbmZvLm5hbWUsXG4gICAgICBtYXRjaGVzOiBvZmZzZXRJbmZvLm9mZnNldHNbKiBSRVRVUk4ge1xuICAgICAgICBvZmZzZXQ6IENVUlJFTlQsXG4gICAgICAgIG1hdGNoOiBTVUJTVFJJTkdfQllURVMoVkFMVUUoZG9jLCBvZmZzZXRJbmZvLm5hbWUpLCBDVVJSRU5UWzBdLCBDVVJSRU5UWzFdKVxuICAgICAgfV1cbiAgICB9YCkudG9BcnJheSgpOyIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogeyBcbiAgICAgIFwiZW5cIiA6IFwiVGhlIGF2b2NhZG8gaXMgYSBtZWRpdW0tc2l6ZWQsIGV2ZXJncmVlbiB0cmVlLCBuYXRpdmUgdG8gdGhlIEFtZXJpY2FzLlwiIFxuICAgIH0sIFxuICAgIFwibmFtZVwiIDogWyBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiwgXG4gICAgICBcImVuXCIgXG4gICAgXSwgXG4gICAgXCJtYXRjaGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJvZmZzZXRcIiA6IFsgXG4gICAgICAgICAgNCwgXG4gICAgICAgICAgNyBcbiAgICAgICAgXSwgXG4gICAgICAgIFwibWF0Y2hcIiA6IFwiYXZvY2Fkb1wiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiB7IFxuICAgICAgXCJlblwiIDogXCJDaGlsaSBwZXBwZXJzIGFyZSB2YXJpZXRpZXMgb2YgdGhlIGJlcnJ5LWZydWl0IG9mIHBsYW50cyBmcm9tIHRoZSBnZW51cyBDYXBzaWN1bSwgY3VsdGl2YXRlZCBmb3IgdGhlaXIgcHVuZ2VuY3kuXCIgXG4gICAgfSwgXG4gICAgXCJuYW1lXCIgOiBbIFxuICAgICAgXCJkZXNjcmlwdGlvblwiLCBcbiAgICAgIFwiZW5cIiBcbiAgICBdLCBcbiAgICBcIm1hdGNoZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIm9mZnNldFwiIDogWyBcbiAgICAgICAgICA4MiwgXG4gICAgICAgICAgMjkgXG4gICAgICAgIF0sIFxuICAgICAgICBcIm1hdGNoXCIgOiBcImN1bHRpdmF0ZWQgZm9yIHRoZWlyIHB1bmdlbmN5XCIgXG4gICAgICB9LCBcbiAgICAgIHsgXG4gICAgICAgIFwib2Zmc2V0XCIgOiBbIFxuICAgICAgICAgIDcyLCBcbiAgICAgICAgICA4IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJtYXRjaFwiIDogXCJDYXBzaWN1bVwiIFxuICAgICAgfSBcbiAgICBdIFxuICB9LCBcbiAgeyBcbiAgICBcImRlc2NyaXB0aW9uXCIgOiB7IFxuICAgICAgXCJlblwiIDogXCJUaGUgdG9tYXRvIGlzIHRoZSBlZGlibGUgYmVycnkgb2YgdGhlIHRvbWF0byBwbGFudC5cIiBcbiAgICB9LCBcbiAgICBcIm5hbWVcIiA6IFsgXG4gICAgICBcImRlc2NyaXB0aW9uXCIsIFxuICAgICAgXCJlblwiIFxuICAgIF0sIFxuICAgIFwibWF0Y2hlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwib2Zmc2V0XCIgOiBbIFxuICAgICAgICAgIDQsIFxuICAgICAgICAgIDYgXG4gICAgICAgIF0sIFxuICAgICAgICBcIm1hdGNoXCIgOiBcInRvbWF0b1wiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIm9mZnNldFwiIDogWyBcbiAgICAgICAgICAzOCwgXG4gICAgICAgICAgNiBcbiAgICAgICAgXSwgXG4gICAgICAgIFwibWF0Y2hcIiA6IFwidG9tYXRvXCIgXG4gICAgICB9IFxuICAgIF0gXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNlYXJjaEhpZ2hsaWdodGluZ18xIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "searchHighlighting_2_single": { + "request": "LS0tCm5hbWU6IHNlYXJjaEhpZ2hsaWdodGluZ18yCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIGNvbGwgPSBkYi5fY3JlYXRlKCJmb29kIik7CnZhciBkb2NzID0gZGIuZm9vZC5zYXZlKFsKICB7IG5hbWU6ICJhdm9jYWRvIiwgZGVzY3JpcHRpb246IHsgZW46ICJUaGUgYXZvY2FkbyBpcyBhIG1lZGl1bS1zaXplZCwgZXZlcmdyZWVuIHRyZWUsIG5hdGl2ZSB0byB0aGUgQW1lcmljYXMuIiB9IH0sCiAgeyBuYW1lOiAiY2Fycm90IiwgZGVzY3JpcHRpb246IHsgZW46ICJUaGUgY2Fycm90IGlzIGEgcm9vdCB2ZWdldGFibGUsIHR5cGljYWxseSBvcmFuZ2UgaW4gY29sb3IsIG5hdGl2ZSB0byBFdXJvcGUgYW5kIFNvdXRod2VzdGVybiBBc2lhLiIgfSB9LAogIHsgbmFtZTogImNoaWxpIHBlcHBlciIsIGRlc2NyaXB0aW9uOiB7IGVuOiAiQ2hpbGkgcGVwcGVycyBhcmUgdmFyaWV0aWVzIG9mIHRoZSBiZXJyeS1mcnVpdCBvZiBwbGFudHMgZnJvbSB0aGUgZ2VudXMgQ2Fwc2ljdW0sIGN1bHRpdmF0ZWQgZm9yIHRoZWlyIHB1bmdlbmN5LiIgfSB9LAogIHsgbmFtZTogInRvbWF0byIsIGRlc2NyaXB0aW9uOiB7IGVuOiAiVGhlIHRvbWF0byBpcyB0aGUgZWRpYmxlIGJlcnJ5IG9mIHRoZSB0b21hdG8gcGxhbnQuIiB9IH0KXSk7CnZhciBpZHggPSBkYi5mb29kLmVuc3VyZUluZGV4KHsgbmFtZTogImludi10ZXh0LW9mZnNldCIsIHR5cGU6ICJpbnZlcnRlZCIsIGZpZWxkczogWyB7IG5hbWU6ICJkZXNjcmlwdGlvbi5lbiIsIGFuYWx5emVyOiAidGV4dF9lbiIsIGZlYXR1cmVzOiBbImZyZXF1ZW5jeSIsICJwb3NpdGlvbiIsICJvZmZzZXQiXSB9IF0gfSk7CnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoImZvb2RfdmlldyIsICJzZWFyY2gtYWxpYXMiLCB7IGluZGV4ZXM6IFsgeyBjb2xsZWN0aW9uOiAiZm9vZCIsIGluZGV4OiAiaW52LXRleHQtb2Zmc2V0IiB9IF0gfSk7Cn5hc3NlcnQoZGIuX3F1ZXJ5KGBGT1IgZCBJTiBmb29kX3ZpZXcgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gYyBSRVRVUk4gY2ApLnRvQXJyYXkoKVswXSA9PT0gNCk7CmRiLl9xdWVyeShgRk9SIGRvYyBJTiBmb29kX3ZpZXcKICBTRUFSQ0gKICAgIFRPS0VOUygiYXZvY2FkbyB0b21hdG8iLCAidGV4dF9lbiIpIEFOWSA9PSBkb2MuZGVzY3JpcHRpb24uZW4gT1IKICAgIFBIUkFTRShkb2MuZGVzY3JpcHRpb24uZW4sICJjdWx0aXZhdGVkIiwgMiwgInB1bmdlbmN5IikgT1IKICAgIFNUQVJUU19XSVRIKGRvYy5kZXNjcmlwdGlvbi5lbiwgImNhcCIpCiAgRk9SIG9mZnNldEluZm8gSU4gT0ZGU0VUX0lORk8oZG9jLCBbImRlc2NyaXB0aW9uLmVuIl0pCiAgICBSRVRVUk4gewogICAgICBkZXNjcmlwdGlvbjogZG9jLmRlc2NyaXB0aW9uLAogICAgICBuYW1lOiBvZmZzZXRJbmZvLm5hbWUsCiAgICAgIG1hdGNoZXM6IG9mZnNldEluZm8ub2Zmc2V0c1sqIFJFVFVSTiB7CiAgICAgICAgb2Zmc2V0OiBDVVJSRU5ULAogICAgICAgIG1hdGNoOiBTVUJTVFJJTkdfQllURVMoVkFMVUUoZG9jLCBvZmZzZXRJbmZvLm5hbWUpLCBDVVJSRU5UWzBdLCBDVVJSRU5UWzFdKQogICAgICB9XQogICAgfWApLnRvQXJyYXkoKTsKfmRiLl9kcm9wVmlldygiZm9vZF92aWV3Iik7Cn5kYi5fZHJvcCgiZm9vZCIpOw==", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcImZvb2RcIik7XG52YXIgZG9jcyA9IGRiLmZvb2Quc2F2ZShbXG4gIHsgbmFtZTogXCJhdm9jYWRvXCIsIGRlc2NyaXB0aW9uOiB7IGVuOiBcIlRoZSBhdm9jYWRvIGlzIGEgbWVkaXVtLXNpemVkLCBldmVyZ3JlZW4gdHJlZSwgbmF0aXZlIHRvIHRoZSBBbWVyaWNhcy5cIiB9IH0sXG4gIHsgbmFtZTogXCJjYXJyb3RcIiwgZGVzY3JpcHRpb246IHsgZW46IFwiVGhlIGNhcnJvdCBpcyBhIHJvb3QgdmVnZXRhYmxlLCB0eXBpY2FsbHkgb3JhbmdlIGluIGNvbG9yLCBuYXRpdmUgdG8gRXVyb3BlIGFuZCBTb3V0aHdlc3Rlcm4gQXNpYS5cIiB9IH0sXG4gIHsgbmFtZTogXCJjaGlsaSBwZXBwZXJcIiwgZGVzY3JpcHRpb246IHsgZW46IFwiQ2hpbGkgcGVwcGVycyBhcmUgdmFyaWV0aWVzIG9mIHRoZSBiZXJyeS1mcnVpdCBvZiBwbGFudHMgZnJvbSB0aGUgZ2VudXMgQ2Fwc2ljdW0sIGN1bHRpdmF0ZWQgZm9yIHRoZWlyIHB1bmdlbmN5LlwiIH0gfSxcbiAgeyBuYW1lOiBcInRvbWF0b1wiLCBkZXNjcmlwdGlvbjogeyBlbjogXCJUaGUgdG9tYXRvIGlzIHRoZSBlZGlibGUgYmVycnkgb2YgdGhlIHRvbWF0byBwbGFudC5cIiB9IH1cbl0pO1xudmFyIGlkeCA9IGRiLmZvb2QuZW5zdXJlSW5kZXgoeyBuYW1lOiBcImludi10ZXh0LW9mZnNldFwiLCB0eXBlOiBcImludmVydGVkXCIsIGZpZWxkczogWyB7IG5hbWU6IFwiZGVzY3JpcHRpb24uZW5cIiwgYW5hbHl6ZXI6IFwidGV4dF9lblwiLCBmZWF0dXJlczogW1wiZnJlcXVlbmN5XCIsIFwicG9zaXRpb25cIiwgXCJvZmZzZXRcIl0gfSBdIH0pO1xudmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldyhcImZvb2Rfdmlld1wiLCBcInNlYXJjaC1hbGlhc1wiLCB7IGluZGV4ZXM6IFsgeyBjb2xsZWN0aW9uOiBcImZvb2RcIiwgaW5kZXg6IFwiaW52LXRleHQtb2Zmc2V0XCIgfSBdIH0pO1xuZGIuX3F1ZXJ5KGBGT1IgZG9jIElOIGZvb2Rfdmlld1xuICBTRUFSQ0hcbiAgICBUT0tFTlMoXCJhdm9jYWRvIHRvbWF0b1wiLCBcInRleHRfZW5cIikgQU5ZID09IGRvYy5kZXNjcmlwdGlvbi5lbiBPUlxuICAgIFBIUkFTRShkb2MuZGVzY3JpcHRpb24uZW4sIFwiY3VsdGl2YXRlZFwiLCAyLCBcInB1bmdlbmN5XCIpIE9SXG4gICAgU1RBUlRTX1dJVEgoZG9jLmRlc2NyaXB0aW9uLmVuLCBcImNhcFwiKVxuICBGT1Igb2Zmc2V0SW5mbyBJTiBPRkZTRVRfSU5GTyhkb2MsIFtcImRlc2NyaXB0aW9uLmVuXCJdKVxuICAgIFJFVFVSTiB7XG4gICAgICBkZXNjcmlwdGlvbjogZG9jLmRlc2NyaXB0aW9uLFxuICAgICAgbmFtZTogb2Zmc2V0SW5mby5uYW1lLFxuICAgICAgbWF0Y2hlczogb2Zmc2V0SW5mby5vZmZzZXRzWyogUkVUVVJOIHtcbiAgICAgICAgb2Zmc2V0OiBDVVJSRU5ULFxuICAgICAgICBtYXRjaDogU1VCU1RSSU5HX0JZVEVTKFZBTFVFKGRvYywgb2Zmc2V0SW5mby5uYW1lKSwgQ1VSUkVOVFswXSwgQ1VSUkVOVFsxXSlcbiAgICAgIH1dXG4gICAgfWApLnRvQXJyYXkoKTsiLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwiZGVzY3JpcHRpb25cIiA6IHsgXG4gICAgICBcImVuXCIgOiBcIlRoZSBhdm9jYWRvIGlzIGEgbWVkaXVtLXNpemVkLCBldmVyZ3JlZW4gdHJlZSwgbmF0aXZlIHRvIHRoZSBBbWVyaWNhcy5cIiBcbiAgICB9LCBcbiAgICBcIm5hbWVcIiA6IFsgXG4gICAgICBcImRlc2NyaXB0aW9uXCIsIFxuICAgICAgXCJlblwiIFxuICAgIF0sIFxuICAgIFwibWF0Y2hlc1wiIDogWyBcbiAgICAgIHsgXG4gICAgICAgIFwib2Zmc2V0XCIgOiBbIFxuICAgICAgICAgIDQsIFxuICAgICAgICAgIDcgXG4gICAgICAgIF0sIFxuICAgICAgICBcIm1hdGNoXCIgOiBcImF2b2NhZG9cIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogeyBcbiAgICAgIFwiZW5cIiA6IFwiQ2hpbGkgcGVwcGVycyBhcmUgdmFyaWV0aWVzIG9mIHRoZSBiZXJyeS1mcnVpdCBvZiBwbGFudHMgZnJvbSB0aGUgZ2VudXMgQ2Fwc2ljdW0sIGN1bHRpdmF0ZWQgZm9yIHRoZWlyIHB1bmdlbmN5LlwiIFxuICAgIH0sIFxuICAgIFwibmFtZVwiIDogWyBcbiAgICAgIFwiZGVzY3JpcHRpb25cIiwgXG4gICAgICBcImVuXCIgXG4gICAgXSwgXG4gICAgXCJtYXRjaGVzXCIgOiBbIFxuICAgICAgeyBcbiAgICAgICAgXCJvZmZzZXRcIiA6IFsgXG4gICAgICAgICAgODIsIFxuICAgICAgICAgIDI5IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJtYXRjaFwiIDogXCJjdWx0aXZhdGVkIGZvciB0aGVpciBwdW5nZW5jeVwiIFxuICAgICAgfSwgXG4gICAgICB7IFxuICAgICAgICBcIm9mZnNldFwiIDogWyBcbiAgICAgICAgICA3MiwgXG4gICAgICAgICAgOCBcbiAgICAgICAgXSwgXG4gICAgICAgIFwibWF0Y2hcIiA6IFwiQ2Fwc2ljdW1cIiBcbiAgICAgIH0gXG4gICAgXSBcbiAgfSwgXG4gIHsgXG4gICAgXCJkZXNjcmlwdGlvblwiIDogeyBcbiAgICAgIFwiZW5cIiA6IFwiVGhlIHRvbWF0byBpcyB0aGUgZWRpYmxlIGJlcnJ5IG9mIHRoZSB0b21hdG8gcGxhbnQuXCIgXG4gICAgfSwgXG4gICAgXCJuYW1lXCIgOiBbIFxuICAgICAgXCJkZXNjcmlwdGlvblwiLCBcbiAgICAgIFwiZW5cIiBcbiAgICBdLCBcbiAgICBcIm1hdGNoZXNcIiA6IFsgXG4gICAgICB7IFxuICAgICAgICBcIm9mZnNldFwiIDogWyBcbiAgICAgICAgICA0LCBcbiAgICAgICAgICA2IFxuICAgICAgICBdLCBcbiAgICAgICAgXCJtYXRjaFwiIDogXCJ0b21hdG9cIiBcbiAgICAgIH0sIFxuICAgICAgeyBcbiAgICAgICAgXCJvZmZzZXRcIiA6IFsgXG4gICAgICAgICAgMzgsIFxuICAgICAgICAgIDYgXG4gICAgICAgIF0sIFxuICAgICAgICBcIm1hdGNoXCIgOiBcInRvbWF0b1wiIFxuICAgICAgfSBcbiAgICBdIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzZWFyY2hIaWdobGlnaHRpbmdfMiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "shard_id1_cluster": { + "request": "LS0tCm5hbWU6IHNoYXJkX2lkMQpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgpkYXRhc2V0OiBvYnNlcnZhdGlvbnNTYW1wbGVEYXRhc2V0Ci0tLQpSRVRVUk4gU0hBUkRfSUQoIm9ic2VydmF0aW9ucyIsIHsgInRpbWUiOiAiMjAyMS0wNS0yNSAwNzoxNTowMCIsICJzdWJqZWN0IjogInhoNDU4IiwgInZhbCI6IDEwIH0p", + "response": "eyJpbnB1dCI6IlJFVFVSTiBTSEFSRF9JRChcIm9ic2VydmF0aW9uc1wiLCB7IFwidGltZVwiOiBcIjIwMjEtMDUtMjUgMDc6MTU6MDBcIiwgXCJzdWJqZWN0XCI6IFwieGg0NThcIiwgXCJ2YWxcIjogMTAgfSkiLCJvdXRwdXQiOiJbIFxuICBcInM2MDEwMDIwXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNoYXJkX2lkMSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6Im9ic2VydmF0aW9uc1NhbXBsZURhdGFzZXQifX0K" + }, + "shellHelp_single": { + "request": "LS0tCm5hbWU6IHNoZWxsSGVscApkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9oZWxwKCk7IA==", + "response": "eyJpbnB1dCI6ImRiLl9oZWxwKCk7ICIsIm91dHB1dCI6Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcmFuZ29EYXRhYmFzZSAoZGIpIGhlbHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5BZG1pbmlzdHJhdGlvbiBGdW5jdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBfaGVscCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaGVscCAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgX2ZsdXNoQ2FjaGUoKSAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaCBhbmQgcmVmaWxsIGNvbGxlY3Rpb24gY2FjaGUgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuQ29sbGVjdGlvbiBGdW5jdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgX2NvbGxlY3Rpb25zKCkgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGFsbCBjb2xsZWN0aW9ucyAgICAgICAgICAgICAgXG4gIF9jb2xsZWN0aW9uKFx1MDAzY25hbWVcdTAwM2UpICAgICAgICAgICAgICAgICAgIGdldCBjb2xsZWN0aW9uIGJ5IGlkZW50aWZpZXIvbmFtZSBcbiAgX2NyZWF0ZShcdTAwM2NuYW1lXHUwMDNlLCBcdTAwM2Nwcm9wZXJ0aWVzXHUwMDNlKSAgICAgICAgIGNyZWF0ZXMgYSBuZXcgY29sbGVjdGlvbiAgICAgICAgICBcbiAgX2NyZWF0ZUVkZ2VDb2xsZWN0aW9uKFx1MDAzY25hbWVcdTAwM2UpICAgICAgICAgY3JlYXRlcyBhIG5ldyBlZGdlIGNvbGxlY3Rpb24gICAgIFxuICBfZHJvcChcdTAwM2NuYW1lXHUwMDNlKSAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYSBjb2xsZWN0aW9uICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuRG9jdW1lbnQgRnVuY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgX2RvY3VtZW50KFx1MDAzY2lkXHUwMDNlKSAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGRvY3VtZW50IGJ5IGhhbmRsZSAoX2lkKSAgICAgIFxuICBfcmVwbGFjZShcdTAwM2NpZFx1MDAzZSwgXHUwMDNjZGF0YVx1MDAzZSwgXHUwMDNjb3ZlcndyaXRlXHUwMDNlKSAgIG92ZXJ3cml0ZSBkb2N1bWVudCAgICAgICAgICAgICAgICBcbiAgX3VwZGF0ZShcdTAwM2NpZFx1MDAzZSwgXHUwMDNjZGF0YVx1MDAzZSwgXHUwMDNjb3ZlcndyaXRlXHUwMDNlLCAgICBwYXJ0aWFsbHkgdXBkYXRlIGRvY3VtZW50ICAgICAgICAgXG4gICAgICAgICAgXHUwMDNja2VlcE51bGxcdTAwM2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgX3JlbW92ZShcdTAwM2NpZFx1MDAzZSkgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgIFxuICBfZXhpc3RzKFx1MDAzY2lkXHUwMDNlKSAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3Mgd2hldGhlciBhIGRvY3VtZW50IGV4aXN0cyAgXG4gIF90cnVuY2F0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFsbCBkb2N1bWVudHMgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbkRhdGFiYXNlIE1hbmFnZW1lbnQgRnVuY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIF9jcmVhdGVEYXRhYmFzZShcdTAwM2NuYW1lXHUwMDNlKSAgICAgICAgICAgICAgIGNyZWF0ZXMgYSBuZXcgZGF0YWJhc2UgICAgICAgICAgICBcbiAgX2Ryb3BEYXRhYmFzZShcdTAwM2NuYW1lXHUwMDNlKSAgICAgICAgICAgICAgICAgZHJvcHMgYW4gZXhpc3RpbmcgZGF0YWJhc2UgICAgICAgIFxuICBfdXNlRGF0YWJhc2UoXHUwMDNjbmFtZVx1MDAzZSkgICAgICAgICAgICAgICAgICBzd2l0Y2hlcyBpbnRvIGFuIGV4aXN0aW5nIGRhdGFiYXNlXG4gIF9kcm9wKFx1MDAzY25hbWVcdTAwM2UpICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhIGNvbGxlY3Rpb24gICAgICAgICAgICAgICBcbiAgX25hbWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuUXVlcnkgLyBUcmFuc2FjdGlvbiBGdW5jdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgX2V4ZWN1dGVUcmFuc2FjdGlvbihcdTAwM2N0cmFuc2FjdGlvblx1MDAzZSkgICAgZXhlY3V0ZSB0cmFuc2FjdGlvbiAgICAgICAgICAgICAgIFxuICBfcXVlcnkoXHUwMDNjcXVlcnlcdTAwM2UpICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIEFRTCBxdWVyeSAgICAgICAgICAgICAgICAgXG4gIF9jcmVhdGVTdGF0ZW1lbnQoXHUwMDNjZGF0YVx1MDAzZSkgICAgICAgICAgICAgIGNyZWF0ZSBhbmQgcmV0dXJuIEFRTCBxdWVyeSAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5WaWV3IEZ1bmN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBfdmlld3MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgYWxsIHZpZXdzICAgICAgICAgICAgICAgICAgICBcbiAgX3ZpZXcoXHUwMDNjbmFtZVx1MDAzZSkgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHZpZXcgYnkgbmFtZSAgICAgICAgICAgICAgICAgIFxuICBfY3JlYXRlVmlldyhcdTAwM2NuYW1lXHUwMDNlLCBcdTAwM2N0eXBlXHUwMDNlLCAgICAgICAgICAgY3JlYXRlcyBhIG5ldyB2aWV3ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcdTAwM2Nwcm9wZXJ0aWVzXHUwMDNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIF9kcm9wVmlldyhcdTAwM2NuYW1lXHUwMDNlKSAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhIHZpZXcgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5MaWNlbnNlIEZ1bmN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBfZ2V0TGljZW5zZSgpICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBsaWNlbnNlIGluZm9ybWF0aW9uICAgICAgICAgICBcbiAgX3NldExpY2Vuc2UoXHUwMDNjbGljZW5zZS1zdHJpbmdcdTAwM2UpICAgICAgICAgc2V0IGxpY2Vuc2Ugc3RyaW5nICAgICAgICAgICAgICAgICIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzaGVsbEhlbHAiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "shellPaste_single": { + "request": "LS0tCm5hbWU6IHNoZWxsUGFzdGUKZGVzY3JpcHRpb246ICcnCi0tLQpmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpICsrKSB7CiAgcmVxdWlyZSgiQGFyYW5nb2RiIikucHJpbnQoIkhlbGxvIHdvcmxkICIgKyBpICsgIiFcbiIpOwp9", + "response": "eyJpbnB1dCI6ImZvciAodmFyIGkgPSAwOyBpIFx1MDAzYyAxMDsgaSArKykge1xuICByZXF1aXJlKFwiQGFyYW5nb2RiXCIpLnByaW50KFwiSGVsbG8gd29ybGQgXCIgKyBpICsgXCIhXFxuXCIpO1xufSIsIm91dHB1dCI6IkhlbGxvIHdvcmxkIDAhXG5cbkhlbGxvIHdvcmxkIDEhXG5cbkhlbGxvIHdvcmxkIDIhXG5cbkhlbGxvIHdvcmxkIDMhXG5cbkhlbGxvIHdvcmxkIDQhXG5cbkhlbGxvIHdvcmxkIDUhXG5cbkhlbGxvIHdvcmxkIDYhXG5cbkhlbGxvIHdvcmxkIDchXG5cbkhlbGxvIHdvcmxkIDghXG5cbkhlbGxvIHdvcmxkIDkhIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNoZWxsUGFzdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "shellUseDB_single": { + "request": "LS0tCm5hbWU6IHNoZWxsVXNlREIKZGVzY3JpcHRpb246ICcnCi0tLQpkYi5fY3JlYXRlRGF0YWJhc2UoIm15YXBwIik7CmRiLl91c2VEYXRhYmFzZSgibXlhcHAiKTsKZGIuX3VzZURhdGFiYXNlKCJfc3lzdGVtIik7CmRiLl9kcm9wRGF0YWJhc2UoIm15YXBwIik7", + "response": "eyJpbnB1dCI6ImRiLl9jcmVhdGVEYXRhYmFzZShcIm15YXBwXCIpO1xuZGIuX3VzZURhdGFiYXNlKFwibXlhcHBcIik7XG5kYi5fdXNlRGF0YWJhc2UoXCJfc3lzdGVtXCIpO1xuZGIuX2Ryb3BEYXRhYmFzZShcIm15YXBwXCIpOyIsIm91dHB1dCI6InRydWVcblxudHJ1ZVxuXG50cnVlXG5cbnRydWUiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic2hlbGxVc2VEQiIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "smartGraphCreate1_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGUxCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW10sIFtdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtdLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaDsiLCJvdXRwdXQiOiJ7W1NtYXJ0R3JhcGhdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlMSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "smartGraphCreate2_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGUyCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciBlZGdlRGVmaW5pdGlvbnMgPSBbIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIikgXTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBlZGdlRGVmaW5pdGlvbnMsIFtdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIGVkZ2VEZWZpbml0aW9ucyA9IFsgZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImVkZ2VzXCIsIFwidmVydGljZXNcIiwgXCJ2ZXJ0aWNlc1wiKSBdO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIGVkZ2VEZWZpbml0aW9ucywgW10sIHtzbWFydEdyYXBoQXR0cmlidXRlOiBcInJlZ2lvblwiLCBudW1iZXJPZlNoYXJkczogOX0pO1xuZ3JhcGg7Iiwib3V0cHV0Ijoie1tTbWFydEdyYXBoXSBcbiAgXCJlZGdlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTIzNSwgXCJlZGdlc1wiICh0eXBlIGVkZ2UsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwidmVydGljZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTEyMjUsIFwidmVydGljZXNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlMiIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "smartGraphCreate3_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGUzCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciBlZGdlRGVmaW5pdGlvbnMgPSBbIGdyYXBoX21vZHVsZS5fcmVsYXRpb24oIm15UmVsYXRpb24iLCBbIm1hbGUiLCAiZmVtYWxlIl0sIFsibWFsZSIsICJmZW1hbGUiXSkgXTsKdmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoIm15R3JhcGgiLCBlZGdlRGVmaW5pdGlvbnMsIFsic2Vzc2lvbnMiXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6ICJyZWdpb24iLCBudW1iZXJPZlNoYXJkczogOX0pOwpncmFwaDsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIGVkZ2VEZWZpbml0aW9ucyA9IFsgZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcIm15UmVsYXRpb25cIiwgW1wibWFsZVwiLCBcImZlbWFsZVwiXSwgW1wibWFsZVwiLCBcImZlbWFsZVwiXSkgXTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBlZGdlRGVmaW5pdGlvbnMsIFtcInNlc3Npb25zXCJdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogXCJyZWdpb25cIiwgbnVtYmVyT2ZTaGFyZHM6IDl9KTtcbmdyYXBoOyIsIm91dHB1dCI6IntbU21hcnRHcmFwaF0gXG4gIFwibXlSZWxhdGlvblwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTI4NSwgXCJteVJlbGF0aW9uXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJmZW1hbGVcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTEyODQsIFwiZmVtYWxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwibWFsZVwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTI4MywgXCJtYWxlXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSwgXG4gIFwic2Vzc2lvbnNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTEyNzMsIFwic2Vzc2lvbnNcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlMyIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "smartGraphCreateGraphHowTo1_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvMQpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KdmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp2YXIgZ3JhcGggPSBncmFwaF9tb2R1bGUuX2NyZWF0ZSgibXlHcmFwaCIsIFtdLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6ICJyZWdpb24iLCBudW1iZXJPZlNoYXJkczogOX0pOwpncmFwaDsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtdLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaDsiLCJvdXRwdXQiOiJ7W1NtYXJ0R3JhcGhdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlR3JhcGhIb3dUbzEiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphCreateGraphHowTo2_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvMgpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KfnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc21hcnQtZ3JhcGgiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW10sIFtdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJzaG9wIik7CmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKCJjdXN0b21lciIpOwpncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigicGV0Iik7CmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaCgibXlHcmFwaCIpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwic2hvcFwiKTtcbmdyYXBoLl9hZGRWZXJ0ZXhDb2xsZWN0aW9uKFwiY3VzdG9tZXJcIik7XG5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbihcInBldFwiKTtcbmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaChcIm15R3JhcGhcIik7Iiwib3V0cHV0Ijoie1tTbWFydEdyYXBoXSBcbiAgXCJjdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTA3MCwgXCJjdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInBldFwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTA4MSwgXCJwZXRcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJzaG9wXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExMDU5LCBcInNob3BcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlR3JhcGhIb3dUbzIiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphCreateGraphHowTo3_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvMwpkZXNjcmlwdGlvbjogJycKdHlwZTogY2x1c3RlcgotLS0KfnZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKCJAYXJhbmdvZGIvc21hcnQtZ3JhcGgiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW10sIFtdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7Cn5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigic2hvcCIpOwp+Z3JhcGguX2FkZFZlcnRleENvbGxlY3Rpb24oImN1c3RvbWVyIik7Cn5ncmFwaC5fYWRkVmVydGV4Q29sbGVjdGlvbigicGV0Iik7CnZhciByZWwgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKCJpc0N1c3RvbWVyIiwgWyJzaG9wIl0sIFsiY3VzdG9tZXIiXSk7CmdyYXBoLl9leHRlbmRFZGdlRGVmaW5pdGlvbnMocmVsKTsKZ3JhcGggPSBncmFwaF9tb2R1bGUuX2dyYXBoKCJteUdyYXBoIik7Cn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTs=", + "response": "eyJpbnB1dCI6InZhciByZWwgPSBncmFwaF9tb2R1bGUuX3JlbGF0aW9uKFwiaXNDdXN0b21lclwiLCBbXCJzaG9wXCJdLCBbXCJjdXN0b21lclwiXSk7XG5ncmFwaC5fZXh0ZW5kRWRnZURlZmluaXRpb25zKHJlbCk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU21hcnRHcmFwaF0gXG4gIFwiaXNDdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTEzNiwgXCJpc0N1c3RvbWVyXCIgKHR5cGUgZWRnZSwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJzaG9wXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExMTAyLCBcInNob3BcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldLCBcbiAgXCJjdXN0b21lclwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTExMywgXCJjdXN0b21lclwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInBldFwiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTEyNCwgXCJwZXRcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlR3JhcGhIb3dUbzMiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphCreateGraphHowToDisjoint1_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhDcmVhdGVHcmFwaEhvd1RvRGlzam9pbnQxCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW10sIFtdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5LCBpc0Rpc2pvaW50OiB0cnVlfSk7CmdyYXBoOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIik7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIGdyYXBoID0gZ3JhcGhfbW9kdWxlLl9jcmVhdGUoXCJteUdyYXBoXCIsIFtdLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5LCBpc0Rpc2pvaW50OiB0cnVlfSk7XG5ncmFwaDsiLCJvdXRwdXQiOiJ7W1NtYXJ0R3JhcGhdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoQ3JlYXRlR3JhcGhIb3dUb0Rpc2pvaW50MSIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "smartGraphModify1_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnkxCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9vcnBoYW5Db2xsZWN0aW9ucygpOwp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImVkZ2VzXCIsIFwidmVydGljZXNcIiwgXCJ2ZXJ0aWNlc1wiKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbcmVsYXRpb25dLCBbXCJvdGhlclwiXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaC5fb3JwaGFuQ29sbGVjdGlvbnMoKTsiLCJvdXRwdXQiOiJbIFxuICBcIm90aGVyXCIgXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNtYXJ0R3JhcGhNb2RpZnkxIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "smartGraphModify2_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnkyCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJvdGhlciIsIHRydWUpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwib3RoZXJcIiwgdHJ1ZSk7XG5ncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoXCJteUdyYXBoXCIpOyIsIm91dHB1dCI6IntbU21hcnRHcmFwaF0gXG4gIFwiZWRnZXNcIiA6IFtBcmFuZ29Db2xsZWN0aW9uIDYwMTE0MTgsIFwiZWRnZXNcIiAodHlwZSBlZGdlLCBzdGF0dXMgbG9hZGVkKV0sIFxuICBcInZlcnRpY2VzXCIgOiBbQXJhbmdvQ29sbGVjdGlvbiA2MDExNDA3LCBcInZlcnRpY2VzXCIgKHR5cGUgZG9jdW1lbnQsIHN0YXR1cyBsb2FkZWQpXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic21hcnRHcmFwaE1vZGlmeTIiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphModify3_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnkzCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10sIHtzbWFydEdyYXBoQXR0cmlidXRlOiAicmVnaW9uIiwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oInZlcnRpY2VzIik7IC8vIHhwRXJyb3IoRVJST1JfR1JBUEhfTk9UX0lOX09SUEhBTl9DT0xMRUNUSU9OKQp+Z3JhcGhfbW9kdWxlLl9kcm9wKCJteUdyYXBoIiwgdHJ1ZSk7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwidmVydGljZXNcIik7ICIsIm91dHB1dCI6IltBcmFuZ29FcnJvciAxOTI4OiBjb2xsZWN0aW9uIGlzIG5vdCBpbiBsaXN0IG9mIG9ycGhhbiBjb2xsZWN0aW9uc10iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic21hcnRHcmFwaE1vZGlmeTMiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphModify4_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnk0CmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10sIHtzbWFydEdyYXBoQXR0cmlidXRlOiAicmVnaW9uIiwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIpOwpncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbigidmVydGljZXMiKTsKZGIuX2Ryb3AoInZlcnRpY2VzIik7IC8vIHhwRXJyb3IoRVJST1JfQ0xVU1RFUl9NVVNUX05PVF9EUk9QX0NPTExfT1RIRVJfRElTVFJJQlVURVNIQVJEU0xJS0UpCn5ncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTsKfmRiLl9kcm9wKCJlZGdlcyIpOwp+ZGIuX2Ryb3AoInZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImVkZ2VzXCIsIFwidmVydGljZXNcIiwgXCJ2ZXJ0aWNlc1wiKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbcmVsYXRpb25dLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oXCJlZGdlc1wiKTtcbmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwidmVydGljZXNcIik7XG5kYi5fZHJvcChcInZlcnRpY2VzXCIpOyAiLCJvdXRwdXQiOiJbQXJhbmdvRXJyb3IgMTQ4NTogQ29sbGVjdGlvbiAndmVydGljZXMnIG11c3Qgbm90IGJlIGRyb3BwZWQgd2hpbGUgJ19sb2NhbF9lZGdlcycsICdfZnJvbV9lZGdlcycsICdfdG9fZWRnZXMnLCAnZWRnZXMnIGhhdmUgZGlzdHJpYnV0ZVNoYXJkc0xpa2Ugc2V0IHRvICd2ZXJ0aWNlcycuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoTW9kaWZ5NCIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "smartGraphModify5_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnk1CmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10sIHtzbWFydEdyYXBoQXR0cmlidXRlOiAicmVnaW9uIiwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIpOyAgICAgIC8vIFJlbW92ZSBlZGdlIGNvbGxlY3Rpb24gZnJvbSBncmFwaCBkZWZpbml0aW9uCmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJ2ZXJ0aWNlcyIpOyAvLyBSZW1vdmUgdmVydGV4IGNvbGxlY3Rpb24gZnJvbSBncmFwaCBkZWZpbml0aW9uCmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOyAgICAgICAvLyBEb2VzIG5vdCBkcm9wIGFueSBjb2xsZWN0aW9ucyBiZWNhdXNlIG5vbmUgYXJlIGxlZnQgaW4gdGhlIGdyYXBoIGRlZmluaXRpb24KZGIuX2Ryb3AoImVkZ2VzIik7IC8vIE1hbnVhbGx5IGNsZWFuIHVwIHRoZSBjb2xsZWN0aW9ucyB0aGF0IHdlcmUgbGVmdCBiZWhpbmQsIGRyb3AgJ2VkZ2VzJyBiZWZvcmUgc2hhcmRpbmctZGVmaW5pbmcgJ3ZlcnRpY2VzJyBjb2xsZWN0aW9uCmRiLl9kcm9wKCJ2ZXJ0aWNlcyIpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImVkZ2VzXCIsIFwidmVydGljZXNcIiwgXCJ2ZXJ0aWNlc1wiKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbcmVsYXRpb25dLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oXCJlZGdlc1wiKTsgICAgICAvLyBSZW1vdmUgZWRnZSBjb2xsZWN0aW9uIGZyb20gZ3JhcGggZGVmaW5pdGlvblxuZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oXCJ2ZXJ0aWNlc1wiKTsgLy8gUmVtb3ZlIHZlcnRleCBjb2xsZWN0aW9uIGZyb20gZ3JhcGggZGVmaW5pdGlvblxuZ3JhcGhfbW9kdWxlLl9kcm9wKFwibXlHcmFwaFwiLCB0cnVlKTsgICAgICAgLy8gRG9lcyBub3QgZHJvcCBhbnkgY29sbGVjdGlvbnMgYmVjYXVzZSBub25lIGFyZSBsZWZ0IGluIHRoZSBncmFwaCBkZWZpbml0aW9uXG5kYi5fZHJvcChcImVkZ2VzXCIpOyAvLyBNYW51YWxseSBjbGVhbiB1cCB0aGUgY29sbGVjdGlvbnMgdGhhdCB3ZXJlIGxlZnQgYmVoaW5kLCBkcm9wICdlZGdlcycgYmVmb3JlIHNoYXJkaW5nLWRlZmluaW5nICd2ZXJ0aWNlcycgY29sbGVjdGlvblxuZGIuX2Ryb3AoXCJ2ZXJ0aWNlc1wiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic21hcnRHcmFwaE1vZGlmeTUiLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphModify6_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnk2CmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp2YXIgZ3JhcGhfbW9kdWxlID0gcmVxdWlyZSgiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoIik7CnZhciByZWxhdGlvbiA9IGdyYXBoX21vZHVsZS5fcmVsYXRpb24oImVkZ2VzIiwgInZlcnRpY2VzIiwgInZlcnRpY2VzIik7CnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10sIHtzbWFydEdyYXBoQXR0cmlidXRlOiAicmVnaW9uIiwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIsIHRydWUpOwpncmFwaCA9IGdyYXBoX21vZHVsZS5fZ3JhcGgoIm15R3JhcGgiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6InZhciBncmFwaF9tb2R1bGUgPSByZXF1aXJlKFwiQGFyYW5nb2RiL3NtYXJ0LWdyYXBoXCIpO1xudmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbihcImVkZ2VzXCIsIFwidmVydGljZXNcIiwgXCJ2ZXJ0aWNlc1wiKTtcbnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKFwibXlHcmFwaFwiLCBbcmVsYXRpb25dLCBbXSwge3NtYXJ0R3JhcGhBdHRyaWJ1dGU6IFwicmVnaW9uXCIsIG51bWJlck9mU2hhcmRzOiA5fSk7XG5ncmFwaC5fZGVsZXRlRWRnZURlZmluaXRpb24oXCJlZGdlc1wiLCB0cnVlKTtcbmdyYXBoID0gZ3JhcGhfbW9kdWxlLl9ncmFwaChcIm15R3JhcGhcIik7Iiwib3V0cHV0Ijoie1tTbWFydEdyYXBoXSBcbiAgXCJ2ZXJ0aWNlc1wiIDogW0FyYW5nb0NvbGxlY3Rpb24gNjAxMTYwNywgXCJ2ZXJ0aWNlc1wiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV0gXG59IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNtYXJ0R3JhcGhNb2RpZnk2IiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "smartGraphModify7_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhNb2RpZnk3CmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgW10sIHtzbWFydEdyYXBoQXR0cmlidXRlOiAicmVnaW9uIiwgbnVtYmVyT2ZTaGFyZHM6IDl9KTsKZ3JhcGguX2RlbGV0ZUVkZ2VEZWZpbml0aW9uKCJlZGdlcyIpOwpncmFwaC5fcmVtb3ZlVmVydGV4Q29sbGVjdGlvbigidmVydGljZXMiKTsKfmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOwp+ZGIuX2Ryb3AoImVkZ2VzIik7Cn5kYi5fZHJvcCgidmVydGljZXMiKTs=", + "response": "eyJpbnB1dCI6ImdyYXBoLl9kZWxldGVFZGdlRGVmaW5pdGlvbihcImVkZ2VzXCIpO1xuZ3JhcGguX3JlbW92ZVZlcnRleENvbGxlY3Rpb24oXCJ2ZXJ0aWNlc1wiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoic21hcnRHcmFwaE1vZGlmeTciLCJ0eXBlIjoiY2x1c3RlciIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "smartGraphRemove1_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhSZW1vdmUxCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoX21vZHVsZS5fZHJvcCgibXlHcmFwaCIsIHRydWUpOw==", + "response": "eyJpbnB1dCI6ImdyYXBoX21vZHVsZS5fZHJvcChcIm15R3JhcGhcIiwgdHJ1ZSk7Iiwib3V0cHV0IjoiRW1wdHkgT3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InNtYXJ0R3JhcGhSZW1vdmUxIiwidHlwZSI6ImNsdXN0ZXIiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "smartGraphRemove2_cluster": { + "request": "LS0tCm5hbWU6IHNtYXJ0R3JhcGhSZW1vdmUyCmRlc2NyaXB0aW9uOiAnJwp0eXBlOiBjbHVzdGVyCi0tLQp+dmFyIGdyYXBoX21vZHVsZSA9IHJlcXVpcmUoIkBhcmFuZ29kYi9zbWFydC1ncmFwaCIpOwp+dmFyIHJlbGF0aW9uID0gZ3JhcGhfbW9kdWxlLl9yZWxhdGlvbigiZWRnZXMiLCAidmVydGljZXMiLCAidmVydGljZXMiKTsKfnZhciBncmFwaCA9IGdyYXBoX21vZHVsZS5fY3JlYXRlKCJteUdyYXBoIiwgW3JlbGF0aW9uXSwgWyJvdGhlciJdLCB7c21hcnRHcmFwaEF0dHJpYnV0ZTogInJlZ2lvbiIsIG51bWJlck9mU2hhcmRzOiA5fSk7CmdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKCJvdGhlciIpOwpncmFwaF9tb2R1bGUuX2Ryb3AoIm15R3JhcGgiLCB0cnVlKTsgLy8geHBFcnJvcihFUlJPUl9DTFVTVEVSX01VU1RfTk9UX0RST1BfQ09MTF9PVEhFUl9ESVNUUklCVVRFU0hBUkRTTElLRSkKfmRiLl9kcm9wKCJvdGhlciIpOwp+ZGIuX2Ryb3AoInZlcnRpY2VzIik7", + "response": "eyJpbnB1dCI6ImdyYXBoLl9yZW1vdmVWZXJ0ZXhDb2xsZWN0aW9uKFwib3RoZXJcIik7XG5ncmFwaF9tb2R1bGUuX2Ryb3AoXCJteUdyYXBoXCIsIHRydWUpOyAiLCJvdXRwdXQiOiJbQXJhbmdvRXJyb3IgMTQ4NTogQ29sbGVjdGlvbiAndmVydGljZXMnIG11c3Qgbm90IGJlIGRyb3BwZWQgd2hpbGUgJ290aGVyJyBoYXMgZGlzdHJpYnV0ZVNoYXJkc0xpa2Ugc2V0IHRvICd2ZXJ0aWNlcycuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJzbWFydEdyYXBoUmVtb3ZlMiIsInR5cGUiOiJjbHVzdGVyIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "usingToArray_single": { + "request": "LS0tCm5hbWU6IHVzaW5nVG9BcnJheQpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl9jcmVhdGUoImZpdmUiKQpmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgZGIuZml2ZS5zYXZlKHt2YWx1ZTppfSk7Cn0KZGIuZml2ZS50b0FycmF5KCkKfmRiLl9kcm9wKCJmaXZlIik7", + "response": "eyJpbnB1dCI6ImRiLl9jcmVhdGUoXCJmaXZlXCIpXG5mb3IgKGkgPSAwOyBpIFx1MDAzYyA1OyBpKyspIHtcbiAgZGIuZml2ZS5zYXZlKHt2YWx1ZTppfSk7XG59XG5kYi5maXZlLnRvQXJyYXkoKSIsIm91dHB1dCI6IltBcmFuZ29Db2xsZWN0aW9uIDY3Mzc2LCBcImZpdmVcIiAodHlwZSBkb2N1bWVudCwgc3RhdHVzIGxvYWRlZCldXG5cbnsgXG4gIFwiX2lkXCIgOiBcImZpdmUvNjczODlcIiwgXG4gIFwiX2tleVwiIDogXCI2NzM4OVwiLCBcbiAgXCJfcmV2XCIgOiBcIl9qdDNaYXNPLS1DXCIgXG59XG5cblsgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY3MzgxXCIsIFxuICAgIFwiX2lkXCIgOiBcImZpdmUvNjczODFcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYXNPLS0tXCIsIFxuICAgIFwidmFsdWVcIiA6IDAgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzM4M1wiLCBcbiAgICBcIl9pZFwiIDogXCJmaXZlLzY3MzgzXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmFzTy0tX1wiLCBcbiAgICBcInZhbHVlXCIgOiAxIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjczODVcIiwgXG4gICAgXCJfaWRcIiA6IFwiZml2ZS82NzM4NVwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1phc08tLUFcIiwgXG4gICAgXCJ2YWx1ZVwiIDogMiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjY3Mzg3XCIsIFxuICAgIFwiX2lkXCIgOiBcImZpdmUvNjczODdcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaYXNPLS1CXCIsIFxuICAgIFwidmFsdWVcIiA6IDMgXG4gIH0sIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2NzM4OVwiLCBcbiAgICBcIl9pZFwiIDogXCJmaXZlLzY3Mzg5XCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWmFzTy0tQ1wiLCBcbiAgICBcInZhbHVlXCIgOiA0IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ1c2luZ1RvQXJyYXkiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "viewArangoSearchCreate_single": { + "request": "LS0tCm5hbWU6IHZpZXdBcmFuZ29TZWFyY2hDcmVhdGUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgY29sbCA9IGRiLl9jcmVhdGUoImJvb2tzIik7CmRiLl9jcmVhdGVWaWV3KCJwcm9kdWN0cyIsICJhcmFuZ29zZWFyY2giLCB7IGxpbmtzOiB7IGJvb2tzOiB7IGZpZWxkczogeyB0aXRsZTogeyBhbmFseXplcnM6IFsidGV4dF9lbiJdIH0gfSB9IH0gfSk7Cn5kYi5fZHJvcFZpZXcoInByb2R1Y3RzIik7Cn5kYi5fZHJvcChjb2xsLm5hbWUoKSk7", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcImJvb2tzXCIpO1xuZGIuX2NyZWF0ZVZpZXcoXCJwcm9kdWN0c1wiLCBcImFyYW5nb3NlYXJjaFwiLCB7IGxpbmtzOiB7IGJvb2tzOiB7IGZpZWxkczogeyB0aXRsZTogeyBhbmFseXplcnM6IFtcInRleHRfZW5cIl0gfSB9IH0gfSB9KTsiLCJvdXRwdXQiOiJbQXJhbmdvVmlldyA4MDMxNiwgXCJwcm9kdWN0c1wiICh0eXBlIGFyYW5nb3NlYXJjaCldIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InZpZXdBcmFuZ29TZWFyY2hDcmVhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "viewDatabaseCreate_single": { + "request": "LS0tCm5hbWU6IHZpZXdEYXRhYmFzZUNyZWF0ZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoImV4YW1wbGUiLCAiYXJhbmdvc2VhcmNoIik7CnZpZXcucHJvcGVydGllcygpCmRiLl9kcm9wVmlldygiZXhhbXBsZSIp", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJleGFtcGxlXCIsIFwiYXJhbmdvc2VhcmNoXCIpO1xudmlldy5wcm9wZXJ0aWVzKClcbmRiLl9kcm9wVmlldyhcImV4YW1wbGVcIikiLCJvdXRwdXQiOiJ7IFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcInN0b3JlZFZhbHVlc1wiIDogWyBdLCBcbiAgXCJjb25zb2xpZGF0aW9uUG9saWN5XCIgOiB7IFxuICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgIFwic2VnbWVudHNCeXRlc0Zsb29yXCIgOiAyMDk3MTUyLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNNYXhcIiA6IDUzNjg3MDkxMjAsIFxuICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICBcInNlZ21lbnRzTWluXCIgOiAxLCBcbiAgICBcIm1pblNjb3JlXCIgOiAwIFxuICB9LCBcbiAgXCJ3cml0ZWJ1ZmZlckFjdGl2ZVwiIDogMCwgXG4gIFwibGlua3NcIiA6IHsgXG4gIH0sIFxuICBcImNvbW1pdEludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY29uc29saWRhdGlvbkludGVydmFsTXNlY1wiIDogMTAwMCwgXG4gIFwiY2xlYW51cEludGVydmFsU3RlcFwiIDogMiwgXG4gIFwicHJpbWFyeVNvcnRcIiA6IFsgXSwgXG4gIFwicHJpbWFyeVNvcnRDb21wcmVzc2lvblwiIDogXCJsejRcIiwgXG4gIFwid3JpdGVidWZmZXJJZGxlXCIgOiA2NCBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld0RhdGFiYXNlQ3JlYXRlIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewDatabaseDrop_single": { + "request": "LS0tCm5hbWU6IHZpZXdEYXRhYmFzZURyb3AKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KCJleGFtcGxlVmlldyIsICJhcmFuZ29zZWFyY2giKTsKZGIuX2Ryb3BWaWV3KCJleGFtcGxlVmlldyIpOwpkYi5fdmlldygiZXhhbXBsZVZpZXciKTs=", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJleGFtcGxlVmlld1wiLCBcImFyYW5nb3NlYXJjaFwiKTtcbmRiLl9kcm9wVmlldyhcImV4YW1wbGVWaWV3XCIpO1xuZGIuX3ZpZXcoXCJleGFtcGxlVmlld1wiKTsiLCJvdXRwdXQiOiJudWxsIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InZpZXdEYXRhYmFzZURyb3AiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "viewDatabaseGet_single": { + "request": "LS0tCm5hbWU6IHZpZXdEYXRhYmFzZUdldApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlVmlldygiZXhhbXBsZSIsICJhcmFuZ29zZWFyY2giLCB7fSk7CnZhciB2aWV3ID0gZGIuX3ZpZXcoImV4YW1wbGUiKTsKLy8gb3IsIGFsdGVybmF0aXZlbHkKdmFyIHZpZXcgPSBkYlsiZXhhbXBsZSJdOwp+ZGIuX2Ryb3BWaWV3KCJleGFtcGxlIik7", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJleGFtcGxlXCIpO1xuLy8gb3IsIGFsdGVybmF0aXZlbHlcbnZhciB2aWV3ID0gZGJbXCJleGFtcGxlXCJdOyIsIm91dHB1dCI6IkVtcHR5IE91dHB1dCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3RGF0YWJhc2VHZXQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "viewDatabaseList_single": { + "request": "LS0tCm5hbWU6IHZpZXdEYXRhYmFzZUxpc3QKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZVZpZXcoImV4YW1wbGVWaWV3IiwgImFyYW5nb3NlYXJjaCIpOwpkYi5fdmlld3MoKTsKfmRiLl9kcm9wVmlldygiZXhhbXBsZVZpZXciKTs=", + "response": "eyJpbnB1dCI6ImRiLl92aWV3cygpOyIsIm91dHB1dCI6IlsgXG4gIFtBcmFuZ29WaWV3IDEzMiwgXCJkZW1vVmlld1wiICh0eXBlIGFyYW5nb3NlYXJjaCldLCBcbiAgW0FyYW5nb1ZpZXcgNzMzNDksIFwiZXhhbXBsZVZpZXdcIiAodHlwZSBhcmFuZ29zZWFyY2gpXSBcbl0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld0RhdGFiYXNlTGlzdCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "viewDatabaseNameKnown_single": { + "request": "LS0tCm5hbWU6IHZpZXdEYXRhYmFzZU5hbWVLbm93bgpkZXNjcmlwdGlvbjogJycKLS0tCmRiLl92aWV3KCJkZW1vVmlldyIpOw==", + "response": "eyJpbnB1dCI6ImRiLl92aWV3KFwiZGVtb1ZpZXdcIik7Iiwib3V0cHV0IjoiW0FyYW5nb1ZpZXcgMTMyLCBcImRlbW9WaWV3XCIgKHR5cGUgYXJhbmdvc2VhcmNoKV0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld0RhdGFiYXNlTmFtZUtub3duIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewDatabaseNameUnknown_single": { + "request": "LS0tCm5hbWU6IHZpZXdEYXRhYmFzZU5hbWVVbmtub3duCmRlc2NyaXB0aW9uOiAnJwotLS0KZGIuX3ZpZXcoInVua25vd24iKTs=", + "response": "eyJpbnB1dCI6ImRiLl92aWV3KFwidW5rbm93blwiKTsiLCJvdXRwdXQiOiJudWxsIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InZpZXdEYXRhYmFzZU5hbWVVbmtub3duIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewDrop_single": { + "request": "LS0tCm5hbWU6IHZpZXdEcm9wCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHZpZXcgPSBkYi5fY3JlYXRlVmlldygiZXhhbXBsZSIsICJhcmFuZ29zZWFyY2giKTsKLy8gb3IKdmFyIHZpZXcgPSBkYi5fdmlldygiZXhhbXBsZSIpOwp2aWV3LmRyb3AoKTsKZGIuX3ZpZXcoImV4YW1wbGUiKTs=", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJleGFtcGxlXCIsIFwiYXJhbmdvc2VhcmNoXCIpO1xuLy8gb3JcbnZhciB2aWV3ID0gZGIuX3ZpZXcoXCJleGFtcGxlXCIpO1xudmlldy5kcm9wKCk7XG5kYi5fdmlldyhcImV4YW1wbGVcIik7Iiwib3V0cHV0IjoibnVsbCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3RHJvcCIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "viewGetProperties_single": { + "request": "LS0tCm5hbWU6IHZpZXdHZXRQcm9wZXJ0aWVzCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHZpZXcgPSBkYi5fdmlldygiZGVtb1ZpZXciKTsKdmlldy5wcm9wZXJ0aWVzKCk7", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJkZW1vVmlld1wiKTtcbnZpZXcucHJvcGVydGllcygpOyIsIm91dHB1dCI6InsgXG4gIFwid3JpdGVidWZmZXJTaXplTWF4XCIgOiAzMzU1NDQzMiwgXG4gIFwic3RvcmVkVmFsdWVzXCIgOiBbIF0sIFxuICBcImNvbnNvbGlkYXRpb25Qb2xpY3lcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcInRpZXJcIiwgXG4gICAgXCJzZWdtZW50c0J5dGVzRmxvb3JcIiA6IDIwOTcxNTIsIFxuICAgIFwic2VnbWVudHNCeXRlc01heFwiIDogNTM2ODcwOTEyMCwgXG4gICAgXCJzZWdtZW50c01heFwiIDogMTAsIFxuICAgIFwic2VnbWVudHNNaW5cIiA6IDEsIFxuICAgIFwibWluU2NvcmVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlYnVmZmVyQWN0aXZlXCIgOiAwLCBcbiAgXCJsaW5rc1wiIDogeyBcbiAgfSwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAyLCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJ3cml0ZWJ1ZmZlcklkbGVcIiA6IDY0IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3R2V0UHJvcGVydGllcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "viewModifyPropertiesSearchAlias_single": { + "request": "LS0tCm5hbWU6IHZpZXdNb2RpZnlQcm9wZXJ0aWVzU2VhcmNoQWxpYXMKZGVzY3JpcHRpb246ICcnCi0tLQp+ZGIuX2NyZWF0ZSgiY29sbCIpOwp+ZGIuY29sbC5lbnN1cmVJbmRleCh7IG5hbWU6ICJpbnYxIiwgdHlwZTogImludmVydGVkIiwgZmllbGRzOiBbImEiXSB9KTsKfmRiLmNvbGwuZW5zdXJlSW5kZXgoeyBuYW1lOiAiaW52MiIsIHR5cGU6ICJpbnZlcnRlZCIsIGZpZWxkczogWyJiWypdIl0gfSk7Cn5kYi5jb2xsLmVuc3VyZUluZGV4KHsgbmFtZTogImludjMiLCB0eXBlOiAiaW52ZXJ0ZWQiLCBmaWVsZHM6IFsiYyJdIH0pOwp+ZGIuX2NyZWF0ZVZpZXcoImV4YW1wbGUiLCAic2VhcmNoLWFsaWFzIiwgeyBpbmRleGVzOiBbCn57IGNvbGxlY3Rpb246ICJjb2xsIiwgaW5kZXg6ICJpbnYxIiB9LAp+eyBjb2xsZWN0aW9uOiAiY29sbCIsIGluZGV4OiAiaW52MiIgfQp+XSB9KTsKdmFyIHZpZXcgPSBkYi5fdmlldygiZXhhbXBsZSIpOwp2aWV3LnByb3BlcnRpZXMoKTsKCnZpZXcucHJvcGVydGllcyh7IGluZGV4ZXM6IFsKICB7IGNvbGxlY3Rpb246ICJjb2xsIiwgaW5kZXg6ICJpbnYxIiwgb3BlcmF0aW9uOiAiZGVsIiB9LAogIHsgY29sbGVjdGlvbjogImNvbGwiLCBpbmRleDogImludjMiIH0KXSB9KTsKfmRiLl9kcm9wVmlldygiZXhhbXBsZSIpOwp+ZGIuX2Ryb3AoImNvbGwiKTs=", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJleGFtcGxlXCIpO1xudmlldy5wcm9wZXJ0aWVzKCk7XG5cbnZpZXcucHJvcGVydGllcyh7IGluZGV4ZXM6IFtcbiAgeyBjb2xsZWN0aW9uOiBcImNvbGxcIiwgaW5kZXg6IFwiaW52MVwiLCBvcGVyYXRpb246IFwiZGVsXCIgfSxcbiAgeyBjb2xsZWN0aW9uOiBcImNvbGxcIiwgaW5kZXg6IFwiaW52M1wiIH1cbl0gfSk7Iiwib3V0cHV0IjoieyBcbiAgXCJpbmRleGVzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcImNvbGxlY3Rpb25cIiA6IFwiY29sbFwiLCBcbiAgICAgIFwiaW5kZXhcIiA6IFwiaW52MVwiIFxuICAgIH0sIFxuICAgIHsgXG4gICAgICBcImNvbGxlY3Rpb25cIiA6IFwiY29sbFwiLCBcbiAgICAgIFwiaW5kZXhcIiA6IFwiaW52MlwiIFxuICAgIH0gXG4gIF0gXG59XG5cbnsgXG4gIFwiaW5kZXhlc1wiIDogWyBcbiAgICB7IFxuICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImNvbGxcIiwgXG4gICAgICBcImluZGV4XCIgOiBcImludjJcIiBcbiAgICB9LCBcbiAgICB7IFxuICAgICAgXCJjb2xsZWN0aW9uXCIgOiBcImNvbGxcIiwgXG4gICAgICBcImluZGV4XCIgOiBcImludjNcIiBcbiAgICB9IFxuICBdIFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3TW9kaWZ5UHJvcGVydGllc1NlYXJjaEFsaWFzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewModifyProperties_single": { + "request": "LS0tCm5hbWU6IHZpZXdNb2RpZnlQcm9wZXJ0aWVzCmRlc2NyaXB0aW9uOiAnJwotLS0KfmRiLl9jcmVhdGVWaWV3KCJleGFtcGxlIiwgImFyYW5nb3NlYXJjaCIpOwp2YXIgdmlldyA9IGRiLl92aWV3KCJleGFtcGxlIik7CnZpZXcucHJvcGVydGllcygpOwoKLy8gc2V0IGNsZWFudXBJbnRlcnZhbFN0ZXAgdG8gMTIKdmlldy5wcm9wZXJ0aWVzKHtjbGVhbnVwSW50ZXJ2YWxTdGVwOiAxMn0pOwoKLy8gYWRkIGEgbGluawp2aWV3LnByb3BlcnRpZXMoe2xpbmtzOiB7ZGVtbzoge319fSkKCi8vIHJlbW92ZSBhIGxpbmsKdmlldy5wcm9wZXJ0aWVzKHtsaW5rczoge2RlbW86IG51bGx9fSkKfmRiLl9kcm9wVmlldygiZXhhbXBsZSIpOw==", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJleGFtcGxlXCIpO1xudmlldy5wcm9wZXJ0aWVzKCk7XG5cbi8vIHNldCBjbGVhbnVwSW50ZXJ2YWxTdGVwIHRvIDEyXG52aWV3LnByb3BlcnRpZXMoe2NsZWFudXBJbnRlcnZhbFN0ZXA6IDEyfSk7XG5cbi8vIGFkZCBhIGxpbmtcbnZpZXcucHJvcGVydGllcyh7bGlua3M6IHtkZW1vOiB7fX19KVxuXG4vLyByZW1vdmUgYSBsaW5rXG52aWV3LnByb3BlcnRpZXMoe2xpbmtzOiB7ZGVtbzogbnVsbH19KSIsIm91dHB1dCI6InsgXG4gIFwid3JpdGVidWZmZXJTaXplTWF4XCIgOiAzMzU1NDQzMiwgXG4gIFwic3RvcmVkVmFsdWVzXCIgOiBbIF0sIFxuICBcImNvbnNvbGlkYXRpb25Qb2xpY3lcIiA6IHsgXG4gICAgXCJ0eXBlXCIgOiBcInRpZXJcIiwgXG4gICAgXCJzZWdtZW50c0J5dGVzRmxvb3JcIiA6IDIwOTcxNTIsIFxuICAgIFwic2VnbWVudHNCeXRlc01heFwiIDogNTM2ODcwOTEyMCwgXG4gICAgXCJzZWdtZW50c01heFwiIDogMTAsIFxuICAgIFwic2VnbWVudHNNaW5cIiA6IDEsIFxuICAgIFwibWluU2NvcmVcIiA6IDAgXG4gIH0sIFxuICBcIndyaXRlYnVmZmVyQWN0aXZlXCIgOiAwLCBcbiAgXCJsaW5rc1wiIDogeyBcbiAgfSwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAyLCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJ3cml0ZWJ1ZmZlcklkbGVcIiA6IDY0IFxufVxueyBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAxMiwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uUG9saWN5XCIgOiB7IFxuICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgIFwic2VnbWVudHNCeXRlc0Zsb29yXCIgOiAyMDk3MTUyLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNNYXhcIiA6IDUzNjg3MDkxMjAsIFxuICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICBcInNlZ21lbnRzTWluXCIgOiAxLCBcbiAgICBcIm1pblNjb3JlXCIgOiAwIFxuICB9LCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJzdG9yZWRWYWx1ZXNcIiA6IFsgXSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQsIFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcImxpbmtzXCIgOiB7IFxuICB9IFxufVxueyBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAxMiwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uUG9saWN5XCIgOiB7IFxuICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgIFwic2VnbWVudHNCeXRlc0Zsb29yXCIgOiAyMDk3MTUyLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNNYXhcIiA6IDUzNjg3MDkxMjAsIFxuICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICBcInNlZ21lbnRzTWluXCIgOiAxLCBcbiAgICBcIm1pblNjb3JlXCIgOiAwIFxuICB9LCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJzdG9yZWRWYWx1ZXNcIiA6IFsgXSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQsIFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcImxpbmtzXCIgOiB7IFxuICAgIFwiZGVtb1wiIDogeyBcbiAgICAgIFwiYW5hbHl6ZXJzXCIgOiBbIFxuICAgICAgICBcImlkZW50aXR5XCIgXG4gICAgICBdLCBcbiAgICAgIFwiZmllbGRzXCIgOiB7IFxuICAgICAgfSwgXG4gICAgICBcImluY2x1ZGVBbGxGaWVsZHNcIiA6IGZhbHNlLCBcbiAgICAgIFwic3RvcmVWYWx1ZXNcIiA6IFwibm9uZVwiLCBcbiAgICAgIFwidHJhY2tMaXN0UG9zaXRpb25zXCIgOiBmYWxzZSBcbiAgICB9IFxuICB9IFxufVxueyBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAxMiwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uUG9saWN5XCIgOiB7IFxuICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgIFwic2VnbWVudHNCeXRlc0Zsb29yXCIgOiAyMDk3MTUyLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNNYXhcIiA6IDUzNjg3MDkxMjAsIFxuICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICBcInNlZ21lbnRzTWluXCIgOiAxLCBcbiAgICBcIm1pblNjb3JlXCIgOiAwIFxuICB9LCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJzdG9yZWRWYWx1ZXNcIiA6IFsgXSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQsIFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcImxpbmtzXCIgOiB7IFxuICB9IFxufSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3TW9kaWZ5UHJvcGVydGllcyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "viewName_single": { + "request": "LS0tCm5hbWU6IHZpZXdOYW1lCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHZpZXcgPSBkYi5fdmlldygiZGVtb1ZpZXciKTsKdmlldy5uYW1lKCk7", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJkZW1vVmlld1wiKTtcbnZpZXcubmFtZSgpOyIsIm91dHB1dCI6ImRlbW9WaWV3IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6InZpZXdOYW1lIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewRename_single": { + "request": "LS0tCm5hbWU6IHZpZXdSZW5hbWUKZGVzY3JpcHRpb246ICcnCi0tLQp2YXIgdmlldyA9IGRiLl9jcmVhdGVWaWV3KCJleGFtcGxlIiwgImFyYW5nb3NlYXJjaCIpOwp2aWV3Lm5hbWUoKTsKdmlldy5yZW5hbWUoImV4YW1wbGVSZW5hbWVkIik7CnZpZXcubmFtZSgpOwp+ZGIuX2Ryb3BWaWV3KCJleGFtcGxlUmVuYW1lZCIpOw==", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX2NyZWF0ZVZpZXcoXCJleGFtcGxlXCIsIFwiYXJhbmdvc2VhcmNoXCIpO1xudmlldy5uYW1lKCk7XG52aWV3LnJlbmFtZShcImV4YW1wbGVSZW5hbWVkXCIpO1xudmlldy5uYW1lKCk7Iiwib3V0cHV0IjoiZXhhbXBsZVxuZXhhbXBsZVJlbmFtZWQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld1JlbmFtZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "viewSearchAliasCreate_single": { + "request": "LS0tCm5hbWU6IHZpZXdTZWFyY2hBbGlhc0NyZWF0ZQpkZXNjcmlwdGlvbjogJycKLS0tCnZhciBjb2xsID0gZGIuX2NyZWF0ZSgiYm9va3MiKTsKdmFyIGlkeCA9IGNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiAiaW52ZXJ0ZWQiLCBuYW1lOiAiaW52LWlkeCIsIGZpZWxkczogWyB7IG5hbWU6ICJ0aXRsZSIsIGFuYWx5emVyOiAidGV4dF9lbiIgfSBdIH0pOwpkYi5fY3JlYXRlVmlldygicHJvZHVjdHMiLCAic2VhcmNoLWFsaWFzIiwgeyBpbmRleGVzOiBbCiAgeyBjb2xsZWN0aW9uOiAiYm9va3MiLCBpbmRleDogImludi1pZHgiIH0KXSB9KTsKfmRiLl9kcm9wVmlldygicHJvZHVjdHMiKTsKfmRiLl9kcm9wKGNvbGwubmFtZSgpKTs=", + "response": "eyJpbnB1dCI6InZhciBjb2xsID0gZGIuX2NyZWF0ZShcImJvb2tzXCIpO1xudmFyIGlkeCA9IGNvbGwuZW5zdXJlSW5kZXgoeyB0eXBlOiBcImludmVydGVkXCIsIG5hbWU6IFwiaW52LWlkeFwiLCBmaWVsZHM6IFsgeyBuYW1lOiBcInRpdGxlXCIsIGFuYWx5emVyOiBcInRleHRfZW5cIiB9IF0gfSk7XG5kYi5fY3JlYXRlVmlldyhcInByb2R1Y3RzXCIsIFwic2VhcmNoLWFsaWFzXCIsIHsgaW5kZXhlczogW1xuICB7IGNvbGxlY3Rpb246IFwiYm9va3NcIiwgaW5kZXg6IFwiaW52LWlkeFwiIH1cbl0gfSk7Iiwib3V0cHV0IjoiW0FyYW5nb1ZpZXcgODAzMzcsIFwicHJvZHVjdHNcIiAodHlwZSBzZWFyY2gtYWxpYXMpXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3U2VhcmNoQWxpYXNDcmVhdGUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + }, + "viewType_single": { + "request": "LS0tCm5hbWU6IHZpZXdUeXBlCmRlc2NyaXB0aW9uOiAnJwotLS0KdmFyIHZpZXcgPSBkYi5fdmlldygiZGVtb1ZpZXciKTsKdmlldy50eXBlKCk7", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJkZW1vVmlld1wiKTtcbnZpZXcudHlwZSgpOyIsIm91dHB1dCI6ImFyYW5nb3NlYXJjaCIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ2aWV3VHlwZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQifX0K" + }, + "viewUsage_01_single": { + "request": "LS0tCm5hbWU6IHZpZXdVc2FnZV8wMQpyZW5kZXI6IGlucHV0CmRlc2NyaXB0aW9uOiB8CiAgQ3JlYXRlIGEgVmlldyB3aXRoIGRlZmF1bHQgcHJvcGVydGllczoKLS0tCn5kYi5fY3JlYXRlVmlldygibXlWaWV3IiwgInNlYXJjaC1hbGlhcyIpOwp2aWV3U2VhcmNoID0gZGIuX2NyZWF0ZVZpZXcoIm15QXJhbmdvU2VhcmNoVmlldyIsICJhcmFuZ29zZWFyY2giKTsKdmlld0FsaWFzID0gZGIuX2NyZWF0ZVZpZXcoIm15U2VhcmNoQWxpYXNWaWV3IiwgInNlYXJjaC1hbGlhcyIpOwp+YWRkSWdub3JlVmlldygibXlWaWV3Iik7Cn5hZGRJZ25vcmVWaWV3KCJteUFyYW5nb1NlYXJjaFZpZXciKTsKfmFkZElnbm9yZVZpZXcoIm15U2VhcmNoQWxpYXNWaWV3Iik7", + "response": "eyJpbnB1dCI6InZpZXdTZWFyY2ggPSBkYi5fY3JlYXRlVmlldyhcIm15QXJhbmdvU2VhcmNoVmlld1wiLCBcImFyYW5nb3NlYXJjaFwiKTtcbnZpZXdBbGlhcyA9IGRiLl9jcmVhdGVWaWV3KFwibXlTZWFyY2hBbGlhc1ZpZXdcIiwgXCJzZWFyY2gtYWxpYXNcIik7Iiwib3V0cHV0IjoiRW1wdHkgb3V0cHV0IiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiQ3JlYXRlIGEgVmlldyB3aXRoIGRlZmF1bHQgcHJvcGVydGllczpcbiIsIm5hbWUiOiJ2aWV3VXNhZ2VfMDEiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQifX0K" + }, + "viewUsage_02_single": { + "request": "LS0tCm5hbWU6IHZpZXdVc2FnZV8wMgpkZXNjcmlwdGlvbjogfAogIEdldCB0aGUgVmlldyBjYWxsZWQgYG15Vmlld2AgYnkgaXRzIG5hbWU6Ci0tLQp2aWV3ID0gZGIuX3ZpZXcoIm15VmlldyIpOw==", + "response": "eyJpbnB1dCI6InZpZXcgPSBkYi5fdmlldyhcIm15Vmlld1wiKTsiLCJvdXRwdXQiOiJbQXJhbmdvVmlldyA2NzcxMCwgXCJteVZpZXdcIiAodHlwZSBzZWFyY2gtYWxpYXMpXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IkdldCB0aGUgVmlldyBjYWxsZWQgYG15Vmlld2AgYnkgaXRzIG5hbWU6XG4iLCJuYW1lIjoidmlld1VzYWdlXzAyIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewUsage_03_single": { + "request": "LS0tCm5hbWU6IHZpZXdVc2FnZV8wMwpkZXNjcmlwdGlvbjogJycKLS0tCnZhciB2aWV3ID0gZGIuX3ZpZXcoIm15VmlldyIpOwp2aWV3LnByb3BlcnRpZXMoKTs=", + "response": "eyJpbnB1dCI6InZhciB2aWV3ID0gZGIuX3ZpZXcoXCJteVZpZXdcIik7XG52aWV3LnByb3BlcnRpZXMoKTsiLCJvdXRwdXQiOiJ7IFxuICBcImluZGV4ZXNcIiA6IFsgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld1VzYWdlXzAzIiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewUsage_04_single": { + "request": "LS0tCm5hbWU6IHZpZXdVc2FnZV8wNApkZXNjcmlwdGlvbjogJycKLS0tCn5kYi5fY3JlYXRlKCJjb2xsIik7CnZhciB2aWV3U2VhcmNoID0gZGIuX3ZpZXcoIm15QXJhbmdvU2VhcmNoVmlldyIpOwp2aWV3U2VhcmNoLnByb3BlcnRpZXMoewogIGNsZWFudXBJbnRlcnZhbFN0ZXA6IDEyLAogIGxpbmtzOiB7CiAgICBjb2xsOiB7CiAgICAgIGluY2x1ZGVBbGxGaWVsZHM6IHRydWUKICAgIH0KICB9Cn0sIC8qcGFydGlhbFVwZGF0ZSovIHRydWUpOwp+ZGIuX2Ryb3BWaWV3KCJteUFyYW5nb1NlYXJjaFZpZXciKTsKCn5kYi5jb2xsLmVuc3VyZUluZGV4KHsgdHlwZTogImludmVydGVkIiwgbmFtZTogImlkeCIsIGZpZWxkczogWyAiYXR0ciIgXSB9KTsKdmFyIHZpZXdBbGlhcyA9IGRiLl92aWV3KCJteVNlYXJjaEFsaWFzVmlldyIpOwp2aWV3QWxpYXMucHJvcGVydGllcyh7CiAgaW5kZXhlczogWwogICAgeyBjb2xsZWN0aW9uOiAiY29sbCIsIGluZGV4OiAiaWR4IiB9LAogIF0KfSwgLypwYXJ0aWFsVXBkYXRlKi8gdHJ1ZSk7Cn52aWV3U2VhcmNoLnByb3BlcnRpZXMoeyBsaW5rczogeyBjb2xsOiBudWxsIH0gfSk7Cn52aWV3QWxpYXMucHJvcGVydGllcyh7IGluZGV4ZXM6IFtdIH0sIGZhbHNlKTsKfmRiLl9kcm9wKCJjb2xsIik7", + "response": "eyJpbnB1dCI6InZhciB2aWV3U2VhcmNoID0gZGIuX3ZpZXcoXCJteUFyYW5nb1NlYXJjaFZpZXdcIik7XG52aWV3U2VhcmNoLnByb3BlcnRpZXMoe1xuICBjbGVhbnVwSW50ZXJ2YWxTdGVwOiAxMixcbiAgbGlua3M6IHtcbiAgICBjb2xsOiB7XG4gICAgICBpbmNsdWRlQWxsRmllbGRzOiB0cnVlXG4gICAgfVxuICB9XG59LCAvKnBhcnRpYWxVcGRhdGUqLyB0cnVlKTtcbnZhciB2aWV3QWxpYXMgPSBkYi5fdmlldyhcIm15U2VhcmNoQWxpYXNWaWV3XCIpO1xudmlld0FsaWFzLnByb3BlcnRpZXMoe1xuICBpbmRleGVzOiBbXG4gICAgeyBjb2xsZWN0aW9uOiBcImNvbGxcIiwgaW5kZXg6IFwiaWR4XCIgfSxcbiAgXVxufSwgLypwYXJ0aWFsVXBkYXRlKi8gdHJ1ZSk7Iiwib3V0cHV0IjoieyBcbiAgXCJjbGVhbnVwSW50ZXJ2YWxTdGVwXCIgOiAxMiwgXG4gIFwiY29tbWl0SW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uSW50ZXJ2YWxNc2VjXCIgOiAxMDAwLCBcbiAgXCJjb25zb2xpZGF0aW9uUG9saWN5XCIgOiB7IFxuICAgIFwidHlwZVwiIDogXCJ0aWVyXCIsIFxuICAgIFwic2VnbWVudHNCeXRlc0Zsb29yXCIgOiAyMDk3MTUyLCBcbiAgICBcInNlZ21lbnRzQnl0ZXNNYXhcIiA6IDUzNjg3MDkxMjAsIFxuICAgIFwic2VnbWVudHNNYXhcIiA6IDEwLCBcbiAgICBcInNlZ21lbnRzTWluXCIgOiAxLCBcbiAgICBcIm1pblNjb3JlXCIgOiAwIFxuICB9LCBcbiAgXCJwcmltYXJ5U29ydFwiIDogWyBdLCBcbiAgXCJwcmltYXJ5U29ydENvbXByZXNzaW9uXCIgOiBcImx6NFwiLCBcbiAgXCJzdG9yZWRWYWx1ZXNcIiA6IFsgXSwgXG4gIFwid3JpdGVidWZmZXJBY3RpdmVcIiA6IDAsIFxuICBcIndyaXRlYnVmZmVySWRsZVwiIDogNjQsIFxuICBcIndyaXRlYnVmZmVyU2l6ZU1heFwiIDogMzM1NTQ0MzIsIFxuICBcImxpbmtzXCIgOiB7IFxuICAgIFwiY29sbFwiIDogeyBcbiAgICAgIFwiYW5hbHl6ZXJzXCIgOiBbIFxuICAgICAgICBcImlkZW50aXR5XCIgXG4gICAgICBdLCBcbiAgICAgIFwiZmllbGRzXCIgOiB7IFxuICAgICAgfSwgXG4gICAgICBcImluY2x1ZGVBbGxGaWVsZHNcIiA6IHRydWUsIFxuICAgICAgXCJzdG9yZVZhbHVlc1wiIDogXCJub25lXCIsIFxuICAgICAgXCJ0cmFja0xpc3RQb3NpdGlvbnNcIiA6IGZhbHNlIFxuICAgIH0gXG4gIH0gXG59XG5cblxueyBcbiAgXCJpbmRleGVzXCIgOiBbIFxuICAgIHsgXG4gICAgICBcImNvbGxlY3Rpb25cIiA6IFwiY29sbFwiLCBcbiAgICAgIFwiaW5kZXhcIiA6IFwiaWR4XCIgXG4gICAgfSBcbiAgXSBcbn0iLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld1VzYWdlXzA0IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "viewUsage_08_single": { + "request": "LS0tCm5hbWU6IHZpZXdVc2FnZV8wOApkZXNjcmlwdGlvbjogJycKLS0tCn5yZW1vdmVJZ25vcmVWaWV3KCJteVZpZXciKTsKfnJlbW92ZUlnbm9yZVZpZXcoIm15QXJhbmdvU2VhcmNoVmlldyIpOwp+cmVtb3ZlSWdub3JlVmlldygibXlTZWFyY2hBbGlhc1ZpZXciKTsKZGIuX2Ryb3BWaWV3KCJteVZpZXciKTsKfmRiLl9kcm9wVmlldygibXlBcmFuZ29TZWFyY2hWaWV3Iik7Cn5kYi5fZHJvcFZpZXcoIm15U2VhcmNoQWxpYXNWaWV3Iik7", + "response": "eyJpbnB1dCI6ImRiLl9kcm9wVmlldyhcIm15Vmlld1wiKTsiLCJvdXRwdXQiOiJFbXB0eSBPdXRwdXQiLCJlcnJvciI6IiIsIm9wdGlvbnMiOnsiZGVzY3JpcHRpb24iOiIiLCJuYW1lIjoidmlld1VzYWdlXzA4IiwidHlwZSI6InNpbmdsZSIsInJlbmRlciI6ImlucHV0L291dHB1dCJ9fQo=" + }, + "windowAggregationRangeDuration_single": { + "request": "LS0tCm5hbWU6IHdpbmRvd0FnZ3JlZ2F0aW9uUmFuZ2VEdXJhdGlvbgpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogb2JzZXJ2YXRpb25zU2FtcGxlRGF0YXNldAotLS0KRk9SIHQgSU4gb2JzZXJ2YXRpb25zCiAgV0lORE9XIERBVEVfVElNRVNUQU1QKHQudGltZSkgV0lUSCB7IHByZWNlZGluZzogIlBUMzBNIiB9CiAgQUdHUkVHQVRFIHJvbGxpbmdBdmVyYWdlID0gQVZHKHQudmFsKSwgcm9sbGluZ1N1bSA9IFNVTSh0LnZhbCkKICBSRVRVUk4gewogICAgdGltZTogdC50aW1lLAogICAgc3ViamVjdDogdC5zdWJqZWN0LAogICAgdmFsOiB0LnZhbCwKICAgIHJvbGxpbmdBdmVyYWdlLAogICAgcm9sbGluZ1N1bQogIH0=", + "response": "eyJpbnB1dCI6IkZPUiB0IElOIG9ic2VydmF0aW9uc1xuICBXSU5ET1cgREFURV9USU1FU1RBTVAodC50aW1lKSBXSVRIIHsgcHJlY2VkaW5nOiBcIlBUMzBNXCIgfVxuICBBR0dSRUdBVEUgcm9sbGluZ0F2ZXJhZ2UgPSBBVkcodC52YWwpLCByb2xsaW5nU3VtID0gU1VNKHQudmFsKVxuICBSRVRVUk4ge1xuICAgIHRpbWU6IHQudGltZSxcbiAgICBzdWJqZWN0OiB0LnN1YmplY3QsXG4gICAgdmFsOiB0LnZhbCxcbiAgICByb2xsaW5nQXZlcmFnZSxcbiAgICByb2xsaW5nU3VtXG4gIH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjAwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJzdDExM1wiLCBcbiAgICBcInZhbFwiIDogMTAsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjAwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogNSwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiAxMCBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6MTU6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInN0MTEzXCIsIFxuICAgIFwidmFsXCIgOiA5LCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA3LjI1LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDI5IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzoxNTowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwieGg0NThcIiwgXG4gICAgXCJ2YWxcIiA6IDEwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA3LjI1LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDI5IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzozMDowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwic3QxMTNcIiwgXG4gICAgXCJ2YWxcIiA6IDI1LCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA5LjgzMzMzMzMzMzMzMzMzNCwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA1OSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6MzA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiA1LCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA5LjgzMzMzMzMzMzMzMzMzNCwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA1OSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6NDU6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInN0MTEzXCIsIFxuICAgIFwidmFsXCIgOiAyMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTYuNSwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA5OSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6NDU6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiAzMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTYuNSwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA5OSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDg6MDA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiAyNSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMjEsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTA1IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ3aW5kb3dBZ2dyZWdhdGlvblJhbmdlRHVyYXRpb24iLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6Im9ic2VydmF0aW9uc1NhbXBsZURhdGFzZXQifX0K" + }, + "windowAggregationRangeValue_single": { + "request": "LS0tCm5hbWU6IHdpbmRvd0FnZ3JlZ2F0aW9uUmFuZ2VWYWx1ZQpkZXNjcmlwdGlvbjogJycKZGF0YXNldDogb2JzZXJ2YXRpb25zU2FtcGxlRGF0YXNldAotLS0KRk9SIHQgSU4gb2JzZXJ2YXRpb25zCiAgV0lORE9XIHQudmFsIFdJVEggeyBwcmVjZWRpbmc6IDEwLCBmb2xsb3dpbmc6IDUgfQogIEFHR1JFR0FURSByb2xsaW5nQXZlcmFnZSA9IEFWRyh0LnZhbCksIHJvbGxpbmdTdW0gPSBTVU0odC52YWwpCiAgUkVUVVJOIHsKICAgIHRpbWU6IHQudGltZSwKICAgIHN1YmplY3Q6IHQuc3ViamVjdCwKICAgIHZhbDogdC52YWwsCiAgICByb2xsaW5nQXZlcmFnZSwKICAgIHJvbGxpbmdTdW0KICB9", + "response": "eyJpbnB1dCI6IkZPUiB0IElOIG9ic2VydmF0aW9uc1xuICBXSU5ET1cgdC52YWwgV0lUSCB7IHByZWNlZGluZzogMTAsIGZvbGxvd2luZzogNSB9XG4gIEFHR1JFR0FURSByb2xsaW5nQXZlcmFnZSA9IEFWRyh0LnZhbCksIHJvbGxpbmdTdW0gPSBTVU0odC52YWwpXG4gIFJFVFVSTiB7XG4gICAgdGltZTogdC50aW1lLFxuICAgIHN1YmplY3Q6IHQuc3ViamVjdCxcbiAgICB2YWw6IHQudmFsLFxuICAgIHJvbGxpbmdBdmVyYWdlLFxuICAgIHJvbGxpbmdTdW1cbiAgfSIsIm91dHB1dCI6IlsgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6MDA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiAwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiAyLjUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogNSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6MzA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiA1LCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA2LjgsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMzQgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjE1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJzdDExM1wiLCBcbiAgICBcInZhbFwiIDogOSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogNi44LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDM0IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzowMDowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwic3QxMTNcIiwgXG4gICAgXCJ2YWxcIiA6IDEwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA2LjgsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMzQgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjE1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMTAsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDYuOCwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiAzNCBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6NDU6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInN0MTEzXCIsIFxuICAgIFwidmFsXCIgOiAyMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTgsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogOTAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjMwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJzdDExM1wiLCBcbiAgICBcInZhbFwiIDogMjUsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDI1LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDEwMCBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDg6MDA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiAyNSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMjUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTAwIFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzo0NTowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwieGg0NThcIiwgXG4gICAgXCJ2YWxcIiA6IDMwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiAyNSwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiAxMDAgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6IndpbmRvd0FnZ3JlZ2F0aW9uUmFuZ2VWYWx1ZSIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoib2JzZXJ2YXRpb25zU2FtcGxlRGF0YXNldCJ9fQo=" + }, + "windowAggregationRowGrouped_single": { + "request": "LS0tCm5hbWU6IHdpbmRvd0FnZ3JlZ2F0aW9uUm93R3JvdXBlZApkZXNjcmlwdGlvbjogJycKZGF0YXNldDogb2JzZXJ2YXRpb25zU2FtcGxlRGF0YXNldAotLS0KRk9SIHQgSU4gb2JzZXJ2YXRpb25zCiAgQ09MTEVDVCBzdWJqZWN0ID0gdC5zdWJqZWN0IElOVE8gZ3JvdXAgPSB0CiAgTEVUIHN1YnF1ZXJ5ID0gKEZPUiB0MiBJTiBncm91cAogICAgU09SVCB0Mi50aW1lCiAgICBXSU5ET1cgeyBwcmVjZWRpbmc6IDEsIGZvbGxvd2luZzogMSB9CiAgICBBR0dSRUdBVEUgcm9sbGluZ0F2ZXJhZ2UgPSBBVkcodDIudmFsKSwgcm9sbGluZ1N1bSA9IFNVTSh0Mi52YWwpCiAgICBXSU5ET1cgeyBwcmVjZWRpbmc6ICJ1bmJvdW5kZWQiLCBmb2xsb3dpbmc6IDAgfQogICAgQUdHUkVHQVRFIGN1bXVsYXRpdmVTdW0gPSBTVU0odDIudmFsKQogICAgUkVUVVJOIHsKICAgICAgdGltZTogdDIudGltZSwKICAgICAgc3ViamVjdDogdDIuc3ViamVjdCwKICAgICAgdmFsOiB0Mi52YWwsCiAgICAgIHJvbGxpbmdBdmVyYWdlLAogICAgICByb2xsaW5nU3VtLAogICAgICBjdW11bGF0aXZlU3VtCiAgICB9CiAgKQogIC8vIGZsYXR0ZW4gc3VicXVlcnkgcmVzdWx0CiAgRk9SIHQyIElOIHN1YnF1ZXJ5CiAgICBSRVRVUk4gdDI=", + "response": "eyJpbnB1dCI6IkZPUiB0IElOIG9ic2VydmF0aW9uc1xuICBDT0xMRUNUIHN1YmplY3QgPSB0LnN1YmplY3QgSU5UTyBncm91cCA9IHRcbiAgTEVUIHN1YnF1ZXJ5ID0gKEZPUiB0MiBJTiBncm91cFxuICAgIFNPUlQgdDIudGltZVxuICAgIFdJTkRPVyB7IHByZWNlZGluZzogMSwgZm9sbG93aW5nOiAxIH1cbiAgICBBR0dSRUdBVEUgcm9sbGluZ0F2ZXJhZ2UgPSBBVkcodDIudmFsKSwgcm9sbGluZ1N1bSA9IFNVTSh0Mi52YWwpXG4gICAgV0lORE9XIHsgcHJlY2VkaW5nOiBcInVuYm91bmRlZFwiLCBmb2xsb3dpbmc6IDAgfVxuICAgIEFHR1JFR0FURSBjdW11bGF0aXZlU3VtID0gU1VNKHQyLnZhbClcbiAgICBSRVRVUk4ge1xuICAgICAgdGltZTogdDIudGltZSxcbiAgICAgIHN1YmplY3Q6IHQyLnN1YmplY3QsXG4gICAgICB2YWw6IHQyLnZhbCxcbiAgICAgIHJvbGxpbmdBdmVyYWdlLFxuICAgICAgcm9sbGluZ1N1bSxcbiAgICAgIGN1bXVsYXRpdmVTdW1cbiAgICB9XG4gIClcbiAgLy8gZmxhdHRlbiBzdWJxdWVyeSByZXN1bHRcbiAgRk9SIHQyIElOIHN1YnF1ZXJ5XG4gICAgUkVUVVJOIHQyIiwib3V0cHV0IjoiWyBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzowMDowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwic3QxMTNcIiwgXG4gICAgXCJ2YWxcIiA6IDEwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA5LjUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTksIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjE1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJzdDExM1wiLCBcbiAgICBcInZhbFwiIDogOSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTQuNjY2NjY2NjY2NjY2NjY2LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDQ0LCBcbiAgICBcImN1bXVsYXRpdmVTdW1cIiA6IDE5IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzozMDowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwic3QxMTNcIiwgXG4gICAgXCJ2YWxcIiA6IDI1LCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiAxOCwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA1NCwgXG4gICAgXCJjdW11bGF0aXZlU3VtXCIgOiA0NCBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6NDU6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInN0MTEzXCIsIFxuICAgIFwidmFsXCIgOiAyMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMjIuNSwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA0NSwgXG4gICAgXCJjdW11bGF0aXZlU3VtXCIgOiA2NCBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6MDA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInhoNDU4XCIsIFxuICAgIFwidmFsXCIgOiAwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiA1LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDEwLCBcbiAgICBcImN1bXVsYXRpdmVTdW1cIiA6IDAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjE1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMTAsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTUsIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjMwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogNSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogNDUsIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTUgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjQ1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMzAsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDIwLCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDYwLCBcbiAgICBcImN1bXVsYXRpdmVTdW1cIiA6IDQ1IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwODowMDowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwieGg0NThcIiwgXG4gICAgXCJ2YWxcIiA6IDI1LCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiAyNy41LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDU1LCBcbiAgICBcImN1bXVsYXRpdmVTdW1cIiA6IDcwIFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ3aW5kb3dBZ2dyZWdhdGlvblJvd0dyb3VwZWQiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0IiwiZGF0YXNldCI6Im9ic2VydmF0aW9uc1NhbXBsZURhdGFzZXQifX0K" + }, + "windowAggregationRow_single": { + "request": "LS0tCm5hbWU6IHdpbmRvd0FnZ3JlZ2F0aW9uUm93CmRlc2NyaXB0aW9uOiAnJwpkYXRhc2V0OiBvYnNlcnZhdGlvbnNTYW1wbGVEYXRhc2V0Ci0tLQpGT1IgdCBJTiBvYnNlcnZhdGlvbnMKICBTT1JUIHQudGltZQogIFdJTkRPVyB7IHByZWNlZGluZzogMSwgZm9sbG93aW5nOiAxIH0KICBBR0dSRUdBVEUgcm9sbGluZ0F2ZXJhZ2UgPSBBVkcodC52YWwpLCByb2xsaW5nU3VtID0gU1VNKHQudmFsKQogIFdJTkRPVyB7IHByZWNlZGluZzogInVuYm91bmRlZCIsIGZvbGxvd2luZzogMH0KICBBR0dSRUdBVEUgY3VtdWxhdGl2ZVN1bSA9IFNVTSh0LnZhbCkKICBSRVRVUk4gewogICAgdGltZTogdC50aW1lLAogICAgc3ViamVjdDogdC5zdWJqZWN0LAogICAgdmFsOiB0LnZhbCwKICAgIHJvbGxpbmdBdmVyYWdlLCAvLyBhdmVyYWdlIG9mIHRoZSB3aW5kb3cncyB2YWx1ZXMKICAgIHJvbGxpbmdTdW0sICAgICAvLyBzdW0gb2YgdGhlIHdpbmRvdydzIHZhbHVlcwogICAgY3VtdWxhdGl2ZVN1bSAgIC8vIHJ1bm5pbmcgdG90YWwKICB9", + "response": "eyJpbnB1dCI6IkZPUiB0IElOIG9ic2VydmF0aW9uc1xuICBTT1JUIHQudGltZVxuICBXSU5ET1cgeyBwcmVjZWRpbmc6IDEsIGZvbGxvd2luZzogMSB9XG4gIEFHR1JFR0FURSByb2xsaW5nQXZlcmFnZSA9IEFWRyh0LnZhbCksIHJvbGxpbmdTdW0gPSBTVU0odC52YWwpXG4gIFdJTkRPVyB7IHByZWNlZGluZzogXCJ1bmJvdW5kZWRcIiwgZm9sbG93aW5nOiAwfVxuICBBR0dSRUdBVEUgY3VtdWxhdGl2ZVN1bSA9IFNVTSh0LnZhbClcbiAgUkVUVVJOIHtcbiAgICB0aW1lOiB0LnRpbWUsXG4gICAgc3ViamVjdDogdC5zdWJqZWN0LFxuICAgIHZhbDogdC52YWwsXG4gICAgcm9sbGluZ0F2ZXJhZ2UsIC8vIGF2ZXJhZ2Ugb2YgdGhlIHdpbmRvdydzIHZhbHVlc1xuICAgIHJvbGxpbmdTdW0sICAgICAvLyBzdW0gb2YgdGhlIHdpbmRvdydzIHZhbHVlc1xuICAgIGN1bXVsYXRpdmVTdW0gICAvLyBydW5uaW5nIHRvdGFsXG4gIH0iLCJvdXRwdXQiOiJbIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjAwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJzdDExM1wiLCBcbiAgICBcInZhbFwiIDogMTAsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTAsIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjAwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogNi4zMzMzMzMzMzMzMzMzMzMsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTksIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTAgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjE1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJzdDExM1wiLCBcbiAgICBcInZhbFwiIDogOSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogNi4zMzMzMzMzMzMzMzMzMzMsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogMTksIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTkgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA3OjE1OjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMTAsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDE0LjY2NjY2NjY2NjY2NjY2NiwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA0NCwgXG4gICAgXCJjdW11bGF0aXZlU3VtXCIgOiAyOSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6MzA6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInN0MTEzXCIsIFxuICAgIFwidmFsXCIgOiAyNSwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTMuMzMzMzMzMzMzMzMzMzM0LCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDQwLCBcbiAgICBcImN1bXVsYXRpdmVTdW1cIiA6IDU0IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzozMDowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwieGg0NThcIiwgXG4gICAgXCJ2YWxcIiA6IDUsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDE2LjY2NjY2NjY2NjY2NjY2OCwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA1MCwgXG4gICAgXCJjdW11bGF0aXZlU3VtXCIgOiA1OSBcbiAgfSwgXG4gIHsgXG4gICAgXCJ0aW1lXCIgOiBcIjIwMjEtMDUtMjUgMDc6NDU6MDBcIiwgXG4gICAgXCJzdWJqZWN0XCIgOiBcInN0MTEzXCIsIFxuICAgIFwidmFsXCIgOiAyMCwgXG4gICAgXCJyb2xsaW5nQXZlcmFnZVwiIDogMTguMzMzMzMzMzMzMzMzMzMyLCBcbiAgICBcInJvbGxpbmdTdW1cIiA6IDU1LCBcbiAgICBcImN1bXVsYXRpdmVTdW1cIiA6IDc5IFxuICB9LCBcbiAgeyBcbiAgICBcInRpbWVcIiA6IFwiMjAyMS0wNS0yNSAwNzo0NTowMFwiLCBcbiAgICBcInN1YmplY3RcIiA6IFwieGg0NThcIiwgXG4gICAgXCJ2YWxcIiA6IDMwLCBcbiAgICBcInJvbGxpbmdBdmVyYWdlXCIgOiAyNSwgXG4gICAgXCJyb2xsaW5nU3VtXCIgOiA3NSwgXG4gICAgXCJjdW11bGF0aXZlU3VtXCIgOiAxMDkgXG4gIH0sIFxuICB7IFxuICAgIFwidGltZVwiIDogXCIyMDIxLTA1LTI1IDA4OjAwOjAwXCIsIFxuICAgIFwic3ViamVjdFwiIDogXCJ4aDQ1OFwiLCBcbiAgICBcInZhbFwiIDogMjUsIFxuICAgIFwicm9sbGluZ0F2ZXJhZ2VcIiA6IDI3LjUsIFxuICAgIFwicm9sbGluZ1N1bVwiIDogNTUsIFxuICAgIFwiY3VtdWxhdGl2ZVN1bVwiIDogMTM0IFxuICB9IFxuXSIsImVycm9yIjoiIiwib3B0aW9ucyI6eyJkZXNjcmlwdGlvbiI6IiIsIm5hbWUiOiJ3aW5kb3dBZ2dyZWdhdGlvblJvdyIsInR5cGUiOiJzaW5nbGUiLCJyZW5kZXIiOiJpbnB1dC9vdXRwdXQiLCJkYXRhc2V0Ijoib2JzZXJ2YXRpb25zU2FtcGxlRGF0YXNldCJ9fQo=" + }, + "working_with_date_time_single": { + "request": "LS0tCm5hbWU6IHdvcmtpbmdfd2l0aF9kYXRlX3RpbWUKZGVzY3JpcHRpb246ICcnCi0tLQpkYi5fY3JlYXRlKCJleGFtcGxlVGltZSIpOwp2YXIgdGltZXN0YW1wcyA9IFsKICAiMjAxNC0wNS0wN1QxNDoxOTowOS41MjIiLAogICIyMDE0LTA1LTA3VDIxOjE5OjA5LjUyMiIsCiAgIjIwMTQtMDUtMDhUMDQ6MTk6MDkuNTIyIiwKICAiMjAxNC0wNS0wOFQxMToxOTowOS41MjIiLAogICIyMDE0LTA1LTA4VDE4OjE5OjA5LjUyMiIKXTsKZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogIGRiLmV4YW1wbGVUaW1lLnNhdmUoe3ZhbHVlOmksIHRzOiB0aW1lc3RhbXBzW2ldfSk7Cn0KZGIuX3F1ZXJ5KGAKICBGT1IgZCBJTiBleGFtcGxlVGltZQogICAgRklMVEVSIGQudHMgPiAnMjAxNC0wNS0wN1QxNDoxOTowOS41MjInIEFORCBkLnRzIDwgJzIwMTQtMDUtMDhUMTg6MTk6MDkuNTIyJwogICAgUkVUVVJOIGQKYCkudG9BcnJheSgpCn5hZGRJZ25vcmVDb2xsZWN0aW9uKCJleGFtcGxlIikKfmRiLl9kcm9wKCJleGFtcGxlVGltZSIp", + "response": "eyJpbnB1dCI6ImRiLl9jcmVhdGUoXCJleGFtcGxlVGltZVwiKTtcbnZhciB0aW1lc3RhbXBzID0gW1xuICBcIjIwMTQtMDUtMDdUMTQ6MTk6MDkuNTIyXCIsXG4gIFwiMjAxNC0wNS0wN1QyMToxOTowOS41MjJcIixcbiAgXCIyMDE0LTA1LTA4VDA0OjE5OjA5LjUyMlwiLFxuICBcIjIwMTQtMDUtMDhUMTE6MTk6MDkuNTIyXCIsXG4gIFwiMjAxNC0wNS0wOFQxODoxOTowOS41MjJcIlxuXTtcbmZvciAoaSA9IDA7IGkgXHUwMDNjIDU7IGkrKykge1xuICBkYi5leGFtcGxlVGltZS5zYXZlKHt2YWx1ZTppLCB0czogdGltZXN0YW1wc1tpXX0pO1xufVxuZGIuX3F1ZXJ5KGBcbiAgRk9SIGQgSU4gZXhhbXBsZVRpbWVcbiAgICBGSUxURVIgZC50cyBcdTAwM2UgJzIwMTQtMDUtMDdUMTQ6MTk6MDkuNTIyJyBBTkQgZC50cyBcdTAwM2MgJzIwMTQtMDUtMDhUMTg6MTk6MDkuNTIyJ1xuICAgIFJFVFVSTiBkXG5gKS50b0FycmF5KCkiLCJvdXRwdXQiOiJbQXJhbmdvQ29sbGVjdGlvbiA2MTcxOSwgXCJleGFtcGxlVGltZVwiICh0eXBlIGRvY3VtZW50LCBzdGF0dXMgbG9hZGVkKV1cbnsgXG4gIFwiX2lkXCIgOiBcImV4YW1wbGVUaW1lLzYxNzMyXCIsIFxuICBcIl9rZXlcIiA6IFwiNjE3MzJcIiwgXG4gIFwiX3JldlwiIDogXCJfanQzWlh4bS0tQ1wiIFxufVxuXG5bIFxuICB7IFxuICAgIFwiX2tleVwiIDogXCI2MTcyNlwiLCBcbiAgICBcIl9pZFwiIDogXCJleGFtcGxlVGltZS82MTcyNlwiLCBcbiAgICBcIl9yZXZcIiA6IFwiX2p0M1pYeG0tLV9cIiwgXG4gICAgXCJ2YWx1ZVwiIDogMSwgXG4gICAgXCJ0c1wiIDogXCIyMDE0LTA1LTA3VDIxOjE5OjA5LjUyMlwiIFxuICB9LCBcbiAgeyBcbiAgICBcIl9rZXlcIiA6IFwiNjE3MjhcIiwgXG4gICAgXCJfaWRcIiA6IFwiZXhhbXBsZVRpbWUvNjE3MjhcIiwgXG4gICAgXCJfcmV2XCIgOiBcIl9qdDNaWHhtLS1BXCIsIFxuICAgIFwidmFsdWVcIiA6IDIsIFxuICAgIFwidHNcIiA6IFwiMjAxNC0wNS0wOFQwNDoxOTowOS41MjJcIiBcbiAgfSwgXG4gIHsgXG4gICAgXCJfa2V5XCIgOiBcIjYxNzMwXCIsIFxuICAgIFwiX2lkXCIgOiBcImV4YW1wbGVUaW1lLzYxNzMwXCIsIFxuICAgIFwiX3JldlwiIDogXCJfanQzWlh4bS0tQlwiLCBcbiAgICBcInZhbHVlXCIgOiAzLCBcbiAgICBcInRzXCIgOiBcIjIwMTQtMDUtMDhUMTE6MTk6MDkuNTIyXCIgXG4gIH0gXG5dIiwiZXJyb3IiOiIiLCJvcHRpb25zIjp7ImRlc2NyaXB0aW9uIjoiIiwibmFtZSI6Indvcmtpbmdfd2l0aF9kYXRlX3RpbWUiLCJ0eXBlIjoic2luZ2xlIiwicmVuZGVyIjoiaW5wdXQvb3V0cHV0In19Cg==" + } +} \ No newline at end of file diff --git a/site/data/oem/errors.yaml b/site/data/oem/errors.yaml new file mode 100644 index 0000000000..aab3f00fce --- /dev/null +++ b/site/data/oem/errors.yaml @@ -0,0 +1,1465 @@ +- group: General errors +- name: ERROR_NO_ERROR + text: "no error" + desc: "No error has occurred." + code: 0 +- name: ERROR_FAILED + text: "failed" + desc: "Will be raised when a general error occurred." + code: 1 +- name: ERROR_SYS_ERROR + text: "system error" + desc: "Will be raised when operating system error occurred." + code: 2 +- name: ERROR_OUT_OF_MEMORY + text: "out of memory" + desc: "Will be raised when there is a memory shortage." + code: 3 +- name: ERROR_INTERNAL + text: "internal error" + desc: "Will be raised when an internal error occurred." + code: 4 +- name: ERROR_ILLEGAL_NUMBER + text: "illegal number" + desc: "Will be raised when an illegal representation of a number was given." + code: 5 +- name: ERROR_NUMERIC_OVERFLOW + text: "numeric overflow" + desc: "Will be raised when a numeric overflow occurred." + code: 6 +- name: ERROR_ILLEGAL_OPTION + text: "illegal option" + desc: "Will be raised when an unknown option was supplied by the user." + code: 7 +- name: ERROR_DEAD_PID + text: "dead process identifier" + desc: "Will be raised when a PID without a living process was found." + code: 8 +- name: ERROR_NOT_IMPLEMENTED + text: "not implemented" + desc: "Will be raised when hitting an unimplemented feature." + code: 9 +- name: ERROR_BAD_PARAMETER + text: "bad parameter" + desc: "Will be raised when the parameter does not fulfill the requirements." + code: 10 +- name: ERROR_FORBIDDEN + text: "forbidden" + desc: "Will be raised when you are missing permission for the operation." + code: 11 +- name: ERROR_OUT_OF_MEMORY_MMAP + text: "out of memory in mmap" + desc: "Will be raised when there is a memory shortage." + code: 12 +- name: ERROR_CORRUPTED_CSV + text: "csv is corrupt" + desc: "Will be raised when encountering a corrupt csv line." + code: 13 +- name: ERROR_FILE_NOT_FOUND + text: "file not found" + desc: "Will be raised when a file is not found." + code: 14 +- name: ERROR_CANNOT_WRITE_FILE + text: "cannot write file" + desc: "Will be raised when a file cannot be written." + code: 15 +- name: ERROR_CANNOT_OVERWRITE_FILE + text: "cannot overwrite file" + desc: "Will be raised when an attempt is made to overwrite an existing file." + code: 16 +- name: ERROR_TYPE_ERROR + text: "type error" + desc: "Will be raised when a type error is encountered." + code: 17 +- name: ERROR_LOCK_TIMEOUT + text: "lock timeout" + desc: "Will be raised when there's a timeout waiting for a lock." + code: 18 +- name: ERROR_CANNOT_CREATE_DIRECTORY + text: "cannot create directory" + desc: "Will be raised when an attempt to create a directory fails." + code: 19 +- name: ERROR_CANNOT_CREATE_TEMP_FILE + text: "cannot create temporary file" + desc: "Will be raised when an attempt to create a temporary file fails." + code: 20 +- name: ERROR_REQUEST_CANCELED + text: "canceled request" + desc: "Will be raised when a request is canceled by the user." + code: 21 +- name: ERROR_DEBUG + text: "intentional debug error" + desc: "Will be raised intentionally during debugging." + code: 22 +- name: ERROR_IP_ADDRESS_INVALID + text: "IP address is invalid" + desc: "Will be raised when the structure of an IP address is invalid." + code: 25 +- name: ERROR_FILE_EXISTS + text: "file exists" + desc: "Will be raised when a file already exists." + code: 27 +- name: ERROR_LOCKED + text: "locked" + desc: "Will be raised when a resource or an operation is locked." + code: 28 +- name: ERROR_DEADLOCK + text: "deadlock detected" + desc: "Will be raised when a deadlock is detected when accessing collections." + code: 29 +- name: ERROR_SHUTTING_DOWN + text: "shutdown in progress" + desc: "Will be raised when a call cannot succeed because a server shutdown is already in progress." + code: 30 +- name: ERROR_ONLY_ENTERPRISE + text: "only enterprise version" + desc: "Will be raised when an Enterprise Edition feature is requested from the Community Edition." + code: 31 +- name: ERROR_RESOURCE_LIMIT + text: "resource limit exceeded" + desc: "Will be raised when the resources used by an operation exceed the configured maximum value." + code: 32 +- name: ERROR_ARANGO_ICU_ERROR + text: "icu error: %s" + desc: "will be raised if ICU operations failed." + code: 33 +- name: ERROR_CANNOT_READ_FILE + text: "cannot read file" + desc: "Will be raised when a file cannot be read." + code: 34 +- name: ERROR_INCOMPATIBLE_VERSION + text: "incompatible server version" + desc: "Will be raised when a server is running an incompatible version of ArangoDB." + code: 35 +- name: ERROR_DISABLED + text: "disabled" + desc: "Will be raised when a requested resource is not enabled." + code: 36 +- name: ERROR_MALFORMED_JSON + text: "malformed json" + desc: "Will be raised when a JSON string could not be parsed." + code: 37 +- name: ERROR_STARTING_UP + text: "startup ongoing" + desc: "Will be raised when a call cannot succeed because the server startup phase is still in progress." + code: 38 +- name: ERROR_DESERIALIZE + text: "error during deserialization" + desc: "Will be raised when a data structure cannot be deserialized, e.g. because the input is invalid." + code: 39 +- group: HTTP error status codes +- name: ERROR_HTTP_BAD_PARAMETER + text: "bad parameter" + desc: "Will be raised when the HTTP request does not fulfill the requirements." + code: 400 +- name: ERROR_HTTP_UNAUTHORIZED + text: "unauthorized" + desc: "Will be raised when authorization is required but the user is not authorized." + code: 401 +- name: ERROR_HTTP_FORBIDDEN + text: "forbidden" + desc: "Will be raised when the operation is forbidden." + code: 403 +- name: ERROR_HTTP_NOT_FOUND + text: "not found" + desc: "Will be raised when an URI is unknown." + code: 404 +- name: ERROR_HTTP_METHOD_NOT_ALLOWED + text: "method not supported" + desc: "Will be raised when an unsupported HTTP method is used for an operation." + code: 405 +- name: ERROR_HTTP_NOT_ACCEPTABLE + text: "request not acceptable" + desc: "Will be raised when an unsupported HTTP content type is used for an operation, or if a request is not acceptable for a leader or follower." + code: 406 +- name: ERROR_HTTP_REQUEST_TIMEOUT + text: "request timeout" + desc: "Will be raised when a timeout occured." + code: 408 +- name: ERROR_HTTP_CONFLICT + text: "conflict" + desc: "Will be raised when a conflict occurs in an HTTP operation." + code: 409 +- name: ERROR_HTTP_GONE + text: "content permanently deleted" + desc: "Will be raised when the requested content has been permanently deleted." + code: 410 +- name: ERROR_HTTP_PRECONDITION_FAILED + text: "precondition failed" + desc: "Will be raised when a precondition for an HTTP request is not met." + code: 412 +- name: ERROR_HTTP_ENHANCE_YOUR_CALM + text: "enhance your calm" + desc: "Will be raised when too many requests were sent to a rate-limited API." + code: 420 +- name: ERROR_HTTP_SERVER_ERROR + text: "internal server error" + desc: "Will be raised when an internal server is encountered." + code: 500 +- name: ERROR_HTTP_NOT_IMPLEMENTED + text: "not implemented" + desc: "Will be raised when an API is called this is not implemented in general, or not implemented for the current setup." + code: 501 +- name: ERROR_HTTP_SERVICE_UNAVAILABLE + text: "service unavailable" + desc: "Will be raised when a service is temporarily unavailable." + code: 503 +- name: ERROR_HTTP_GATEWAY_TIMEOUT + text: "gateway timeout" + desc: "Will be raised when a service contacted by ArangoDB does not respond in a timely manner." + code: 504 +- group: HTTP processing errors +- name: ERROR_HTTP_CORRUPTED_JSON + text: "invalid JSON object" + desc: "Will be raised when a string representation of a JSON object is corrupt." + code: 600 +- name: ERROR_HTTP_SUPERFLUOUS_SUFFICES + text: "superfluous URL suffices" + desc: "Will be raised when the URL contains superfluous suffices." + code: 601 +- group: Internal ArangoDB storage errors +- name: ERROR_ARANGO_ILLEGAL_STATE + text: "illegal state" + desc: "Internal error that will be raised when the datafile is not in the required state." + code: 1000 +- name: ERROR_ARANGO_READ_ONLY + text: "read only" + desc: "Internal error that will be raised when trying to write to a read-only datafile or collection." + code: 1004 +- name: ERROR_ARANGO_DUPLICATE_IDENTIFIER + text: "duplicate identifier" + desc: "Internal error that will be raised when a identifier duplicate is detected." + code: 1005 +- group: External ArangoDB storage errors +- name: ERROR_ARANGO_CORRUPTED_DATAFILE + text: "corrupted datafile" + desc: "Will be raised when a corruption is detected in a datafile." + code: 1100 +- name: ERROR_ARANGO_ILLEGAL_PARAMETER_FILE + text: "illegal or unreadable parameter file" + desc: "Will be raised if a parameter file is corrupted or cannot be read." + code: 1101 +- name: ERROR_ARANGO_CORRUPTED_COLLECTION + text: "corrupted collection" + desc: "Will be raised when a collection contains one or more corrupted data files." + code: 1102 +- name: ERROR_ARANGO_FILESYSTEM_FULL + text: "filesystem full" + desc: "Will be raised when the filesystem is full." + code: 1104 +- name: ERROR_ARANGO_DATADIR_LOCKED + text: "database directory is locked" + desc: "Will be raised when the database directory is locked by a different process." + code: 1107 +- group: General ArangoDB storage errors +- name: ERROR_ARANGO_CONFLICT + text: "conflict" + desc: "Will be raised when updating or deleting a document and a conflict has been detected." + code: 1200 +- name: ERROR_ARANGO_DOCUMENT_NOT_FOUND + text: "document not found" + desc: "Will be raised when a document with a given identifier is unknown." + code: 1202 +- name: ERROR_ARANGO_DATA_SOURCE_NOT_FOUND + text: "collection or view not found" + desc: "Will be raised when a collection or View with the given identifier or name is unknown." + code: 1203 +- name: ERROR_ARANGO_COLLECTION_PARAMETER_MISSING + text: "parameter 'collection' not found" + desc: "Will be raised when the collection parameter is missing." + code: 1204 +- name: ERROR_ARANGO_DOCUMENT_HANDLE_BAD + text: "illegal document identifier" + desc: "Will be raised when a document identifier is corrupt." + code: 1205 +- name: ERROR_ARANGO_DUPLICATE_NAME + text: "duplicate name" + desc: "Will be raised when a name duplicate is detected." + code: 1207 +- name: ERROR_ARANGO_ILLEGAL_NAME + text: "illegal name" + desc: "Will be raised when an illegal name is detected." + code: 1208 +- name: ERROR_ARANGO_NO_INDEX + text: "no suitable index known" + desc: "Will be raised when no suitable index for the query is known." + code: 1209 +- name: ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED + text: "unique constraint violated" + desc: "Will be raised when there is a unique constraint violation." + code: 1210 +- name: ERROR_ARANGO_INDEX_NOT_FOUND + text: "index not found" + desc: "Will be raised when an index with a given identifier is unknown." + code: 1212 +- name: ERROR_ARANGO_CROSS_COLLECTION_REQUEST + text: "cross collection request not allowed" + desc: "Will be raised when a cross-collection is requested." + code: 1213 +- name: ERROR_ARANGO_INDEX_HANDLE_BAD + text: "illegal index identifier" + desc: "Will be raised when a index identifier is corrupt." + code: 1214 +- name: ERROR_ARANGO_DOCUMENT_TOO_LARGE + text: "document too large" + desc: "Will be raised when the document cannot fit into any datafile because of it is too large." + code: 1216 +- name: ERROR_ARANGO_COLLECTION_NOT_UNLOADED + text: "collection must be unloaded" + desc: "Will be raised when a collection should be unloaded, but has a different status." + code: 1217 +- name: ERROR_ARANGO_COLLECTION_TYPE_INVALID + text: "collection type invalid" + desc: "Will be raised when an invalid collection type is used in a request." + code: 1218 +- name: ERROR_ARANGO_ATTRIBUTE_PARSER_FAILED + text: "parsing attribute name definition failed" + desc: "Will be raised when parsing an attribute name definition failed." + code: 1220 +- name: ERROR_ARANGO_DOCUMENT_KEY_BAD + text: "illegal document key" + desc: "Will be raised when a document key is corrupt." + code: 1221 +- name: ERROR_ARANGO_DOCUMENT_KEY_UNEXPECTED + text: "unexpected document key" + desc: "Will be raised when a user-defined document key is supplied for collections with auto key generation." + code: 1222 +- name: ERROR_ARANGO_DATADIR_NOT_WRITABLE + text: "server database directory not writable" + desc: "Will be raised when the server's database directory is not writable for the current user." + code: 1224 +- name: ERROR_ARANGO_OUT_OF_KEYS + text: "out of keys" + desc: "Will be raised when a key generator runs out of keys." + code: 1225 +- name: ERROR_ARANGO_DOCUMENT_KEY_MISSING + text: "missing document key" + desc: "Will be raised when a document key is missing." + code: 1226 +- name: ERROR_ARANGO_DOCUMENT_TYPE_INVALID + text: "invalid document type" + desc: "Will be raised when there is an attempt to create a document with an invalid type." + code: 1227 +- name: ERROR_ARANGO_DATABASE_NOT_FOUND + text: "database not found" + desc: "Will be raised when a non-existing database is accessed." + code: 1228 +- name: ERROR_ARANGO_DATABASE_NAME_INVALID + text: "database name invalid" + desc: "Will be raised when an invalid database name is used." + code: 1229 +- name: ERROR_ARANGO_USE_SYSTEM_DATABASE + text: "operation only allowed in system database" + desc: "Will be raised when an operation is requested in a database other than the system database." + code: 1230 +- name: ERROR_ARANGO_INVALID_KEY_GENERATOR + text: "invalid key generator" + desc: "Will be raised when an invalid key generator description is used." + code: 1232 +- name: ERROR_ARANGO_INVALID_EDGE_ATTRIBUTE + text: "edge attribute missing or invalid" + desc: "will be raised when the _from or _to values of an edge are undefined or contain an invalid value." + code: 1233 +- name: ERROR_ARANGO_INDEX_CREATION_FAILED + text: "index creation failed" + desc: "Will be raised when an attempt to create an index has failed." + code: 1235 +- name: ERROR_ARANGO_COLLECTION_TYPE_MISMATCH + text: "collection type mismatch" + desc: "Will be raised when a collection has a different type from what has been expected." + code: 1237 +- name: ERROR_ARANGO_COLLECTION_NOT_LOADED + text: "collection not loaded" + desc: "Will be raised when a collection is accessed that is not yet loaded." + code: 1238 +- name: ERROR_ARANGO_DOCUMENT_REV_BAD + text: "illegal document revision" + desc: "Will be raised when a document revision is corrupt or is missing where needed." + code: 1239 +- name: ERROR_ARANGO_INCOMPLETE_READ + text: "incomplete read" + desc: "Will be raised by the storage engine when a read cannot be completed." + code: 1240 +- name: ERROR_ARANGO_OLD_ROCKSDB_FORMAT + text: "not supported by old legacy data format" + desc: "Will be raised by the storage engine when an operation cannot be performed because the old, deprecated, little endian key encoding format is still used and an operation is tried which is not supported by this format." + code: 1241 +- name: ERROR_ARANGO_INDEX_HAS_LEGACY_SORTED_KEYS + text: "an index with legacy sorted keys has been found" + desc: "Will be raised if the VPackSortMigration has detected an index, which is using the old legacy sorting order and would be corrupt if the database is migrated to the new, correct sorting order." + code: 1242 +- group: Checked ArangoDB storage errors +- name: ERROR_ARANGO_EMPTY_DATADIR + text: "server database directory is empty" + desc: "Will be raised when encountering an empty server database directory." + code: 1301 +- name: ERROR_ARANGO_TRY_AGAIN + text: "operation should be tried again" + desc: "Will be raised when an operation should be retried." + code: 1302 +- name: ERROR_ARANGO_BUSY + text: "engine is busy" + desc: "Will be raised when storage engine is busy." + code: 1303 +- name: ERROR_ARANGO_MERGE_IN_PROGRESS + text: "merge in progress" + desc: "Will be raised when storage engine has a datafile merge in progress and cannot complete the operation." + code: 1304 +- name: ERROR_ARANGO_IO_ERROR + text: "storage engine I/O error" + desc: "Will be raised when storage engine encounters an I/O error." + code: 1305 +- group: ArangoDB replication errors +- name: ERROR_REPLICATION_NO_RESPONSE + text: "no response" + desc: "Will be raised when the replication applier does not receive any or an incomplete response from the leader." + code: 1400 +- name: ERROR_REPLICATION_INVALID_RESPONSE + text: "invalid response" + desc: "Will be raised when the replication applier receives an invalid response from the leader." + code: 1401 +- name: ERROR_REPLICATION_LEADER_ERROR + text: "leader error" + desc: "Will be raised when the replication applier receives a server error from the leader." + code: 1402 +- name: ERROR_REPLICATION_LEADER_INCOMPATIBLE + text: "leader incompatible" + desc: "Will be raised when the replication applier connects to a leader that has an incompatible version." + code: 1403 +- name: ERROR_REPLICATION_LEADER_CHANGE + text: "leader change" + desc: "Will be raised when the replication applier connects to a different leader than before." + code: 1404 +- name: ERROR_REPLICATION_LOOP + text: "loop detected" + desc: "Will be raised when the replication applier is asked to connect to itself for replication." + code: 1405 +- name: ERROR_REPLICATION_UNEXPECTED_MARKER + text: "unexpected marker" + desc: "Will be raised when an unexpected marker is found in the replication log stream." + code: 1406 +- name: ERROR_REPLICATION_INVALID_APPLIER_STATE + text: "invalid applier state" + desc: "Will be raised when an invalid replication applier state file is found." + code: 1407 +- name: ERROR_REPLICATION_UNEXPECTED_TRANSACTION + text: "invalid transaction" + desc: "Will be raised when an unexpected transaction id is found." + code: 1408 +- name: ERROR_REPLICATION_SHARD_SYNC_ATTEMPT_TIMEOUT_EXCEEDED + text: "shard synchronization attempt timeout exceeded" + desc: "Will be raised when the synchronization of a shard takes longer than the configured timeout." + code: 1409 +- name: ERROR_REPLICATION_INVALID_APPLIER_CONFIGURATION + text: "invalid replication applier configuration" + desc: "Will be raised when the configuration for the replication applier is invalid." + code: 1410 +- name: ERROR_REPLICATION_RUNNING + text: "cannot perform operation while applier is running" + desc: "Will be raised when there is an attempt to perform an operation while the replication applier is running." + code: 1411 +- name: ERROR_REPLICATION_APPLIER_STOPPED + text: "replication stopped" + desc: "Special error code used to indicate the replication applier was stopped by a user." + code: 1412 +- name: ERROR_REPLICATION_NO_START_TICK + text: "no start tick" + desc: "Will be raised when the replication applier is started without a known start tick value." + code: 1413 +- name: ERROR_REPLICATION_START_TICK_NOT_PRESENT + text: "start tick not present" + desc: "Will be raised when the replication applier fetches data using a start tick, but that start tick is not present on the logger server anymore." + code: 1414 +- name: ERROR_REPLICATION_WRONG_CHECKSUM + text: "wrong checksum" + desc: "Will be raised when a new born follower submits a wrong checksum" + code: 1416 +- name: ERROR_REPLICATION_SHARD_NONEMPTY + text: "shard not empty" + desc: "Will be raised when a shard is not empty and the follower tries a shortcut" + code: 1417 +- name: ERROR_REPLICATION_REPLICATED_LOG_NOT_FOUND + text: "replicated log {} not found" + desc: "Will be raised when a specific replicated log is not found" + code: 1418 +- name: ERROR_REPLICATION_REPLICATED_LOG_NOT_THE_LEADER + text: "not the log leader" + desc: "Will be raised when a participant of a replicated log is ordered to do something only the leader can do" + code: 1419 +- name: ERROR_REPLICATION_REPLICATED_LOG_NOT_A_FOLLOWER + text: "not a log follower" + desc: "Will be raised when a participant of a replicated log is ordered to do something only a follower can do" + code: 1420 +- name: ERROR_REPLICATION_REPLICATED_LOG_APPEND_ENTRIES_REJECTED + text: "follower rejected append entries request" + desc: "Will be raised when a follower of a replicated log rejects an append entries request" + code: 1421 +- name: ERROR_REPLICATION_REPLICATED_LOG_LEADER_RESIGNED + text: "a resigned leader instance rejected a request" + desc: "Will be raised when a leader instance of a replicated log rejects a request because it just resigned. This can also happen if the term changes (due to a configuration change), even if the leader stays the same." + code: 1422 +- name: ERROR_REPLICATION_REPLICATED_LOG_FOLLOWER_RESIGNED + text: "a resigned follower instance rejected a request" + desc: "Will be raised when a follower instance of a replicated log rejects a request because it just resigned. This can also happen if the term changes (due to a configuration change), even if the server stays a follower." + code: 1423 +- name: ERROR_REPLICATION_REPLICATED_LOG_PARTICIPANT_GONE + text: "the replicated log of the participant is gone" + desc: "Will be raised when a participant instance of a replicated log is no longer available." + code: 1424 +- name: ERROR_REPLICATION_REPLICATED_LOG_INVALID_TERM + text: "an invalid term was given" + desc: "Will be raised when a participant tries to change its term but found a invalid new term." + code: 1425 +- name: ERROR_REPLICATION_REPLICATED_LOG_UNCONFIGURED + text: "log participant unconfigured" + desc: "Will be raised when a participant is currently unconfigured, i.e. neither a leader nor a follower." + code: 1426 +- name: ERROR_REPLICATION_REPLICATED_STATE_NOT_FOUND + text: "replicated state {id:} of type {type:} not found" + desc: "Will be raised when a specific replicated state was not found." + code: 1427 +- name: ERROR_REPLICATION_REPLICATED_STATE_NOT_AVAILABLE + text: "replicated state {id:} of type {type:} is unavailable" + desc: "Will be raised when a specific replicated state was accessed but is not (yet) available." + code: 1428 +- name: ERROR_REPLICATION_WRITE_CONCERN_NOT_FULFILLED + text: "not enough replicas for the configured write-concern are present" + desc: "Will be raised when there are not enough replicas of a shard available to fulfill the write-concern for a write operation." + code: 1429 +- group: ArangoDB cluster errors +- name: ERROR_CLUSTER_NOT_FOLLOWER + text: "not a follower" + desc: "Will be raised when an operation is sent to a non-following server." + code: 1446 +- name: ERROR_CLUSTER_FOLLOWER_TRANSACTION_COMMIT_PERFORMED + text: "follower transaction intermediate commit already performed" + desc: "Will be raised when a follower transaction has already performed an intermediate commit and must be rolled back." + code: 1447 +- name: ERROR_CLUSTER_CREATE_COLLECTION_PRECONDITION_FAILED + text: "creating collection failed due to precondition" + desc: "Will be raised when updating the plan on collection creation failed." + code: 1448 +- name: ERROR_CLUSTER_SERVER_UNKNOWN + text: "got a request from an unknown server" + desc: "Will be raised on some occasions when one server gets a request from another, which has not (yet?) been made known via the Agency." + code: 1449 +- name: ERROR_CLUSTER_TOO_MANY_SHARDS + text: "too many shards" + desc: "Will be raised when the number of shards for a collection is higher than allowed." + code: 1450 +- name: ERROR_CLUSTER_COULD_NOT_CREATE_COLLECTION_IN_PLAN + text: "could not create collection in plan" + desc: "Will be raised when a Coordinator in a cluster cannot create an entry for a new collection in the Plan hierarchy in the Agency." + code: 1454 +- name: ERROR_CLUSTER_COULD_NOT_CREATE_COLLECTION + text: "could not create collection" + desc: "Will be raised when a Coordinator in a cluster notices that some DB-Servers report problems when creating shards for a new collection." + code: 1456 +- name: ERROR_CLUSTER_TIMEOUT + text: "timeout in cluster operation" + desc: "Will be raised when a Coordinator in a cluster runs into a timeout for some cluster wide operation." + code: 1457 +- name: ERROR_CLUSTER_COULD_NOT_REMOVE_COLLECTION_IN_PLAN + text: "could not remove collection from plan" + desc: "Will be raised when a Coordinator in a cluster cannot remove an entry for a collection in the Plan hierarchy in the Agency." + code: 1458 +- name: ERROR_CLUSTER_COULD_NOT_CREATE_DATABASE_IN_PLAN + text: "could not create database in plan" + desc: "Will be raised when a Coordinator in a cluster cannot create an entry for a new database in the Plan hierarchy in the Agency." + code: 1460 +- name: ERROR_CLUSTER_COULD_NOT_CREATE_DATABASE + text: "could not create database" + desc: "Will be raised when a Coordinator in a cluster notices that some DB-Servers report problems when creating databases for a new cluster wide database." + code: 1461 +- name: ERROR_CLUSTER_COULD_NOT_REMOVE_DATABASE_IN_PLAN + text: "could not remove database from plan" + desc: "Will be raised when a Coordinator in a cluster cannot remove an entry for a database in the Plan hierarchy in the Agency." + code: 1462 +- name: ERROR_CLUSTER_COULD_NOT_REMOVE_DATABASE_IN_CURRENT + text: "could not remove database from current" + desc: "Will be raised when a Coordinator in a cluster cannot remove an entry for a database in the Current hierarchy in the Agency." + code: 1463 +- name: ERROR_CLUSTER_SHARD_GONE + text: "no responsible shard found" + desc: "Will be raised when a Coordinator in a cluster cannot determine the shard that is responsible for a given document." + code: 1464 +- name: ERROR_CLUSTER_CONNECTION_LOST + text: "cluster internal HTTP connection broken" + desc: "Will be raised when a Coordinator in a cluster loses an HTTP connection to a DB-Server in the cluster whilst transferring data." + code: 1465 +- name: ERROR_CLUSTER_MUST_NOT_SPECIFY_KEY + text: "must not specify _key for this collection" + desc: "Will be raised when a Coordinator in a cluster finds that the _key attribute was specified in a sharded collection the uses not only _key as sharding attribute." + code: 1466 +- name: ERROR_CLUSTER_GOT_CONTRADICTING_ANSWERS + text: "got contradicting answers from different shards" + desc: "Will be raised if a Coordinator in a cluster gets conflicting results from different shards, which should never happen." + code: 1467 +- name: ERROR_CLUSTER_NOT_ALL_SHARDING_ATTRIBUTES_GIVEN + text: "not all sharding attributes given" + desc: "Will be raised if a Coordinator tries to find out which shard is responsible for a partial document, but cannot do this because not all sharding attributes are specified." + code: 1468 +- name: ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES + text: "must not change the value of a shard key attribute" + desc: "Will be raised if there is an attempt to update the value of a shard attribute." + code: 1469 +- name: ERROR_CLUSTER_UNSUPPORTED + text: "unsupported operation or parameter for clusters" + desc: "Will be raised when there is an attempt to carry out an operation that is not supported in the context of a sharded collection." + code: 1470 +- name: ERROR_CLUSTER_ONLY_ON_COORDINATOR + text: "this operation is only valid on a coordinator in a cluster" + desc: "Will be raised if there is an attempt to run a Coordinator-only operation on a different type of node." + code: 1471 +- name: ERROR_CLUSTER_READING_PLAN_AGENCY + text: "error reading Plan in agency" + desc: "Will be raised if a Coordinator or DB-Server cannot read the Plan in the Agency." + code: 1472 +- name: ERROR_CLUSTER_COULD_NOT_TRUNCATE_COLLECTION + text: "could not truncate collection" + desc: "Will be raised if a Coordinator cannot truncate all shards of a cluster collection." + code: 1473 +- name: ERROR_CLUSTER_AQL_COMMUNICATION + text: "error in cluster internal communication for AQL" + desc: "Will be raised if the internal communication of the cluster for AQL produces an error." + code: 1474 +- name: ERROR_CLUSTER_ONLY_ON_DBSERVER + text: "this operation is only valid on a DBserver in a cluster" + desc: "Will be raised if there is an attempt to run a DB-Server-only operation on a different type of node." + code: 1477 +- name: ERROR_CLUSTER_BACKEND_UNAVAILABLE + text: "A cluster backend which was required for the operation could not be reached" + desc: "Will be raised if a required DB-Server can't be reached." + code: 1478 +- name: ERROR_CLUSTER_AQL_COLLECTION_OUT_OF_SYNC + text: "collection/view is out of sync" + desc: "Will be raised if a collection/view needed during query execution is out of sync. This currently can happen when using SatelliteCollections, Arangosearch links or inverted indexes." + code: 1481 +- name: ERROR_CLUSTER_COULD_NOT_CREATE_INDEX_IN_PLAN + text: "could not create index in plan" + desc: "Will be raised when a Coordinator in a cluster cannot create an entry for a new index in the Plan hierarchy in the Agency." + code: 1482 +- name: ERROR_CLUSTER_COULD_NOT_DROP_INDEX_IN_PLAN + text: "could not drop index in plan" + desc: "Will be raised when a Coordinator in a cluster cannot remove an index from the Plan hierarchy in the Agency." + code: 1483 +- name: ERROR_CLUSTER_CHAIN_OF_DISTRIBUTESHARDSLIKE + text: "chain of distributeShardsLike references" + desc: "Will be raised if one tries to create a collection with a distributeShardsLike attribute which points to another collection that also has one." + code: 1484 +- name: ERROR_CLUSTER_MUST_NOT_DROP_COLL_OTHER_DISTRIBUTESHARDSLIKE + text: "must not drop collection while another has a distributeShardsLike attribute pointing to it" + desc: "Will be raised if one tries to drop a collection to which another collection points with its distributeShardsLike attribute." + code: 1485 +- name: ERROR_CLUSTER_UNKNOWN_DISTRIBUTESHARDSLIKE + text: "must not have a distributeShardsLike attribute pointing to an unknown collection" + desc: "Will be raised if one tries to create a collection which points to an unknown collection in its distributeShardsLike attribute." + code: 1486 +- name: ERROR_CLUSTER_INSUFFICIENT_DBSERVERS + text: "the number of current dbservers is lower than the requested replicationFactor" + desc: "Will be raised if one tries to create a collection with a replicationFactor greater than the available number of DB-Servers." + code: 1487 +- name: ERROR_CLUSTER_COULD_NOT_DROP_FOLLOWER + text: "a follower could not be dropped in agency" + desc: "Will be raised if a follower that ought to be dropped could not be dropped in the Agency (under Current)." + code: 1488 +- name: ERROR_CLUSTER_SHARD_LEADER_REFUSES_REPLICATION + text: "a shard leader refuses to perform a replication operation" + desc: "Will be raised if a replication operation is refused by a shard leader." + code: 1489 +- name: ERROR_CLUSTER_SHARD_FOLLOWER_REFUSES_OPERATION + text: "a shard follower refuses to perform an operation" + desc: "Will be raised if a replication operation is refused by a shard follower because it is coming from the wrong leader." + code: 1490 +- name: ERROR_CLUSTER_SHARD_LEADER_RESIGNED + text: "a (former) shard leader refuses to perform an operation, because it has resigned in the meantime" + desc: "Will be raised if a non-replication operation is refused by a former shard leader that has found out that it is no longer the leader." + code: 1491 +- name: ERROR_CLUSTER_AGENCY_COMMUNICATION_FAILED + text: "some agency operation failed" + desc: "Will be raised if after various retries an Agency operation could not be performed successfully." + code: 1492 +- name: ERROR_CLUSTER_LEADERSHIP_CHALLENGE_ONGOING + text: "leadership challenge is ongoing" + desc: "Will be raised when servers are currently competing for leadership, and the result is still unknown." + code: 1495 +- name: ERROR_CLUSTER_NOT_LEADER + text: "not a leader" + desc: "Will be raised when an operation is sent to a non-leading server." + code: 1496 +- name: ERROR_CLUSTER_COULD_NOT_CREATE_VIEW_IN_PLAN + text: "could not create view in plan" + desc: "Will be raised when a Coordinator in a cluster cannot create an entry for a new View in the Plan hierarchy in the Agency." + code: 1497 +- name: ERROR_CLUSTER_VIEW_ID_EXISTS + text: "view ID already exists" + desc: "Will be raised when a Coordinator in a cluster tries to create a View and the View ID already exists." + code: 1498 +- name: ERROR_CLUSTER_COULD_NOT_DROP_COLLECTION + text: "could not drop collection in plan" + desc: "Will be raised when a Coordinator in a cluster cannot drop a collection entry in the Plan hierarchy in the Agency." + code: 1499 +- group: ArangoDB query errors +- name: ERROR_QUERY_KILLED + text: "query killed" + desc: "Will be raised when a running query is killed by an explicit admin command." + code: 1500 +- name: ERROR_QUERY_PARSE + text: "%s" + desc: "Will be raised when query is parsed and is found to be syntactically invalid." + code: 1501 +- name: ERROR_QUERY_EMPTY + text: "query is empty" + desc: "Will be raised when an empty query is specified." + code: 1502 +- name: ERROR_QUERY_SCRIPT + text: "runtime error '%s'" + desc: "Will be raised when a runtime error is caused by the query." + code: 1503 +- name: ERROR_QUERY_NUMBER_OUT_OF_RANGE + text: "number out of range" + desc: "Will be raised when a number is outside the expected range." + code: 1504 +- name: ERROR_QUERY_INVALID_GEO_VALUE + text: "invalid geo coordinate value" + desc: "Will be raised when a geo index coordinate is invalid or out of range." + code: 1505 +- name: ERROR_QUERY_VARIABLE_NAME_INVALID + text: "variable name '%s' has an invalid format" + desc: "Will be raised when an invalid variable name is used." + code: 1510 +- name: ERROR_QUERY_VARIABLE_REDECLARED + text: "variable '%s' is assigned multiple times" + desc: "Will be raised when a variable gets re-assigned in a query." + code: 1511 +- name: ERROR_QUERY_VARIABLE_NAME_UNKNOWN + text: "unknown variable '%s'" + desc: "Will be raised when an unknown variable is used or the variable is undefined the context it is used." + code: 1512 +- name: ERROR_QUERY_COLLECTION_LOCK_FAILED + text: "unable to read-lock collection %s" + desc: "Will be raised when a read lock on the collection cannot be acquired." + code: 1521 +- name: ERROR_QUERY_TOO_MANY_COLLECTIONS + text: "too many collections/shards" + desc: "Will be raised when the number of collections or shards in a query is beyond the allowed value." + code: 1522 +- name: ERROR_QUERY_TOO_MUCH_NESTING + text: "too much nesting or too many objects" + desc: "Will be raised when a query contains expressions or other constructs with too many objects or that are too deeply nested." + code: 1524 +- name: ERROR_QUERY_INVALID_OPTIONS_ATTRIBUTE + text: "unknown OPTIONS attribute used" + desc: "Will be raised when an unknown attribute is used inside an OPTIONS clause." + code: 1539 +- name: ERROR_QUERY_FUNCTION_NAME_UNKNOWN + text: "usage of unknown function '%s()'" + desc: "Will be raised when an undefined function is called." + code: 1540 +- name: ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH + text: "invalid number of arguments for function '%s()', expected number of arguments: minimum: %d, maximum: %d" + desc: "Will be raised when the number of arguments used in a function call does not match the expected number of arguments for the function." + code: 1541 +- name: ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH + text: "invalid argument type in call to function '%s()'" + desc: "Will be raised when the type of an argument used in a function call does not match the expected argument type." + code: 1542 +- name: ERROR_QUERY_INVALID_REGEX + text: "invalid regex value" + desc: "Will be raised when an invalid regex argument value is used in a call to a function that expects a regex." + code: 1543 +- name: ERROR_QUERY_BIND_PARAMETERS_INVALID + text: "invalid structure of bind parameters" + desc: "Will be raised when the structure of bind parameters passed has an unexpected format." + code: 1550 +- name: ERROR_QUERY_BIND_PARAMETER_MISSING + text: "no value specified for declared bind parameter '%s'" + desc: "Will be raised when a bind parameter was declared in the query but the query is being executed with no value for that parameter." + code: 1551 +- name: ERROR_QUERY_BIND_PARAMETER_UNDECLARED + text: "bind parameter '%s' was not declared in the query" + desc: "Will be raised when a value gets specified for an undeclared bind parameter." + code: 1552 +- name: ERROR_QUERY_BIND_PARAMETER_TYPE + text: "bind parameter '%s' has an invalid value or type" + desc: "Will be raised when a bind parameter has an invalid value or type." + code: 1553 +- name: ERROR_QUERY_INVALID_ARITHMETIC_VALUE + text: "invalid arithmetic value" + desc: "Will be raised when a non-numeric value is used in an arithmetic operation." + code: 1561 +- name: ERROR_QUERY_DIVISION_BY_ZERO + text: "division by zero" + desc: "Will be raised when there is an attempt to divide by zero." + code: 1562 +- name: ERROR_QUERY_ARRAY_EXPECTED + text: "array expected" + desc: "Will be raised when a non-array operand is used for an operation that expects an array argument operand." + code: 1563 +- name: ERROR_QUERY_COLLECTION_USED_IN_EXPRESSION + text: "collection '%s' used as expression operand" + desc: "Will be raised when a collection is used as an operand in an AQL expression." + code: 1568 +- name: ERROR_QUERY_FAIL_CALLED + text: "FAIL(%s) called" + desc: "Will be raised when the function FAIL() is called from inside a query." + code: 1569 +- name: ERROR_QUERY_GEO_INDEX_MISSING + text: "no suitable geo index found for geo restriction on '%s'" + desc: "Will be raised when a geo restriction was specified but no suitable geo index is found to resolve it." + code: 1570 +- name: ERROR_QUERY_FULLTEXT_INDEX_MISSING + text: "no suitable fulltext index found for fulltext query on '%s'" + desc: "Will be raised when a fulltext query is performed on a collection without a suitable fulltext index." + code: 1571 +- name: ERROR_QUERY_INVALID_DATE_VALUE + text: "invalid date value" + desc: "Will be raised when a value cannot be converted to a date." + code: 1572 +- name: ERROR_QUERY_MULTI_MODIFY + text: "multi-modify query" + desc: "Will be raised when an AQL query contains more than one data-modifying operation." + code: 1573 +- name: ERROR_QUERY_INVALID_AGGREGATE_EXPRESSION + text: "invalid aggregate expression" + desc: "Will be raised when an AQL query contains an invalid aggregate expression." + code: 1574 +- name: ERROR_QUERY_COMPILE_TIME_OPTIONS + text: "query options must be readable at query compile time" + desc: "Will be raised when an AQL query contains OPTIONS that cannot be figured out at query compile time." + code: 1575 +- name: ERROR_QUERY_DNF_COMPLEXITY + text: "FILTER/PRUNE condition complexity is too high" + desc: "Will be raised internally when a too complex FILTER/PRUNE condition is encountered during the DNF conversion of the condition." + code: 1576 +- name: ERROR_QUERY_FORCED_INDEX_HINT_UNUSABLE + text: "could not use forced index hint" + desc: "Will be raised when forceIndexHint is specified, and the hint cannot be used to serve the query." + code: 1577 +- name: ERROR_QUERY_DISALLOWED_DYNAMIC_CALL + text: "disallowed dynamic call to '%s'" + desc: "Will be raised when a dynamic function call is made to a function that cannot be called dynamically." + code: 1578 +- name: ERROR_QUERY_ACCESS_AFTER_MODIFICATION + text: "access after data-modification by %s" + desc: "Will be raised when collection data are accessed after a data-modification operation." + code: 1579 +- group: AQL user function errors +- name: ERROR_QUERY_FUNCTION_INVALID_NAME + text: "invalid user function name" + desc: "Will be raised when a user function with an invalid name is registered." + code: 1580 +- name: ERROR_QUERY_FUNCTION_INVALID_CODE + text: "invalid user function code" + desc: "Will be raised when a user function is registered with invalid code." + code: 1581 +- name: ERROR_QUERY_FUNCTION_NOT_FOUND + text: "user function '%s()' not found" + desc: "Will be raised when a user function is accessed but not found." + code: 1582 +- name: ERROR_QUERY_FUNCTION_RUNTIME_ERROR + text: "user function runtime error: %s" + desc: "Will be raised when a user function throws a runtime exception." + code: 1583 +- group: AQL query registry errors +- name: ERROR_QUERY_BAD_JSON_PLAN + text: "bad execution plan JSON" + desc: "Will be raised when an HTTP API for a query got an invalid JSON object." + code: 1590 +- name: ERROR_QUERY_NOT_FOUND + text: "query ID not found" + desc: "Will be raised when an Id of a query is not found by the HTTP API." + code: 1591 +- name: ERROR_QUERY_USER_ASSERT + text: "%s" + desc: "Will be raised if and user provided expression fails to evaluate to true" + code: 1593 +- name: ERROR_QUERY_USER_WARN + text: "%s" + desc: "Will be raised if and user provided expression fails to evaluate to true" + code: 1594 +- name: ERROR_QUERY_WINDOW_AFTER_MODIFICATION + text: "window operation after data-modification" + desc: "Will be raised when a window node is created after a data-modification operation." + code: 1595 +- group: ArangoDB cursor errors +- name: ERROR_CURSOR_NOT_FOUND + text: "cursor not found" + desc: "Will be raised when a cursor is requested via its id but a cursor with that id cannot be found." + code: 1600 +- name: ERROR_CURSOR_BUSY + text: "cursor is busy" + desc: "Will be raised when a cursor is requested via its id but a concurrent request is still using the cursor." + code: 1601 +- group: ArangoDB schema validation errors +- name: ERROR_VALIDATION_FAILED + text: "schema validation failed" + desc: "Will be raised when a document does not pass schema validation." + code: 1620 +- name: ERROR_VALIDATION_BAD_PARAMETER + text: "invalid schema validation parameter" + desc: "Will be raised when the schema description is invalid." + code: 1621 +- group: ArangoDB transaction errors +- name: ERROR_TRANSACTION_INTERNAL + text: "internal transaction error" + desc: "Will be raised when a wrong usage of transactions is detected. this is an internal error and indicates a bug in ArangoDB." + code: 1650 +- name: ERROR_TRANSACTION_NESTED + text: "nested transactions detected" + desc: "Will be raised when transactions are nested." + code: 1651 +- name: ERROR_TRANSACTION_UNREGISTERED_COLLECTION + text: "unregistered collection used in transaction" + desc: "Will be raised when a collection is used in the middle of a transaction but was not registered at transaction start." + code: 1652 +- name: ERROR_TRANSACTION_DISALLOWED_OPERATION + text: "disallowed operation inside transaction" + desc: "Will be raised when a disallowed operation is carried out in a transaction." + code: 1653 +- name: ERROR_TRANSACTION_ABORTED + text: "transaction aborted" + desc: "Will be raised when a transaction was aborted." + code: 1654 +- name: ERROR_TRANSACTION_NOT_FOUND + text: "transaction not found" + desc: "Will be raised when a transaction was not found." + code: 1655 +- group: User management errors +- name: ERROR_USER_INVALID_NAME + text: "invalid user name" + desc: "Will be raised when an invalid user name is used." + code: 1700 +- name: ERROR_USER_DUPLICATE + text: "duplicate user" + desc: "Will be raised when a user name already exists." + code: 1702 +- name: ERROR_USER_NOT_FOUND + text: "user not found" + desc: "Will be raised when a user name is updated that does not exist." + code: 1703 +- name: ERROR_USER_EXTERNAL + text: "user is external" + desc: "Will be raised when the user is authenticated by an external server." + code: 1705 +- group: Service management errors (legacy) +- name: ERROR_SERVICE_DOWNLOAD_FAILED + text: "service download failed" + desc: "Will be raised when a service download from the central repository failed." + code: 1752 +- name: ERROR_SERVICE_UPLOAD_FAILED + text: "service upload failed" + desc: "Will be raised when a service upload from the client to the ArangoDB server failed." + code: 1753 +- group: LDAP errors +- name: ERROR_LDAP_CANNOT_INIT + text: "cannot init a LDAP connection" + desc: "can not init a LDAP connection" + code: 1800 +- name: ERROR_LDAP_CANNOT_SET_OPTION + text: "cannot set a LDAP option" + desc: "can not set a LDAP option" + code: 1801 +- name: ERROR_LDAP_CANNOT_BIND + text: "cannot bind to a LDAP server" + desc: "can not bind to a LDAP server" + code: 1802 +- name: ERROR_LDAP_CANNOT_UNBIND + text: "cannot unbind from a LDAP server" + desc: "can not unbind from a LDAP server" + code: 1803 +- name: ERROR_LDAP_CANNOT_SEARCH + text: "cannot issue a LDAP search" + desc: "can not search the LDAP server" + code: 1804 +- name: ERROR_LDAP_CANNOT_START_TLS + text: "cannot start a TLS LDAP session" + desc: "can not star a TLS LDAP session" + code: 1805 +- name: ERROR_LDAP_FOUND_NO_OBJECTS + text: "LDAP didn't found any objects" + desc: "LDAP didn't found any objects with the specified search query" + code: 1806 +- name: ERROR_LDAP_NOT_ONE_USER_FOUND + text: "LDAP found zero ore more than one user" + desc: "LDAP found zero ore more than one user" + code: 1807 +- name: ERROR_LDAP_USER_NOT_IDENTIFIED + text: "LDAP found a user, but its not the desired one" + desc: "LDAP found a user, but its not the desired one" + code: 1808 +- name: ERROR_LDAP_OPERATIONS_ERROR + text: "LDAP returned an operations error" + desc: "LDAP returned an operations error" + code: 1809 +- name: ERROR_LDAP_INVALID_MODE + text: "invalid ldap mode" + desc: "cant distinguish a valid mode for provided LDAP configuration" + code: 1820 +- group: Task errors +- name: ERROR_TASK_INVALID_ID + text: "invalid task id" + desc: "Will be raised when a task is created with an invalid id." + code: 1850 +- name: ERROR_TASK_DUPLICATE_ID + text: "duplicate task id" + desc: "Will be raised when a task id is created with a duplicate id." + code: 1851 +- name: ERROR_TASK_NOT_FOUND + text: "task not found" + desc: "Will be raised when a task with the specified id could not be found." + code: 1852 +- group: Graph / traversal errors +- name: ERROR_GRAPH_INVALID_GRAPH + text: "invalid graph" + desc: "Will be raised when an invalid name is passed to the server." + code: 1901 +- name: ERROR_GRAPH_INVALID_EDGE + text: "invalid edge" + desc: "Will be raised when an invalid edge id is passed to the server." + code: 1906 +- name: ERROR_GRAPH_TOO_MANY_ITERATIONS + text: "too many iterations - try increasing the value of 'maxIterations'" + desc: "Will be raised when too many iterations are done in a graph traversal." + code: 1909 +- name: ERROR_GRAPH_INVALID_FILTER_RESULT + text: "invalid filter result" + desc: "Will be raised when an invalid filter result is returned in a graph traversal." + code: 1910 +- name: ERROR_GRAPH_COLLECTION_MULTI_USE + text: "multi use of edge collection in edge def" + desc: "an edge collection may only be used once in one edge definition of a graph." + code: 1920 +- name: ERROR_GRAPH_COLLECTION_USE_IN_MULTI_GRAPHS + text: "edge collection already used in edge def" + desc: " is already used by another graph in a different edge definition." + code: 1921 +- name: ERROR_GRAPH_CREATE_MISSING_NAME + text: "missing graph name" + desc: "a graph name is required to create or drop a graph." + code: 1922 +- name: ERROR_GRAPH_CREATE_MALFORMED_EDGE_DEFINITION + text: "malformed edge definition" + desc: "the edge definition is malformed. It has to be an array of objects." + code: 1923 +- name: ERROR_GRAPH_NOT_FOUND + text: "graph '%s' not found" + desc: "a graph with this name could not be found." + code: 1924 +- name: ERROR_GRAPH_DUPLICATE + text: "graph already exists" + desc: "a graph with this name already exists." + code: 1925 +- name: ERROR_GRAPH_VERTEX_COL_DOES_NOT_EXIST + text: "vertex collection does not exist or is not part of the graph" + desc: "the specified vertex collection does not exist or is not part of the graph." + code: 1926 +- name: ERROR_GRAPH_WRONG_COLLECTION_TYPE_VERTEX + text: "collection not a vertex collection" + desc: "the collection is not a vertex collection." + code: 1927 +- name: ERROR_GRAPH_NOT_IN_ORPHAN_COLLECTION + text: "collection is not in list of orphan collections" + desc: "Vertex collection not in list of orphan collections of the graph." + code: 1928 +- name: ERROR_GRAPH_COLLECTION_USED_IN_EDGE_DEF + text: "collection already used in edge def" + desc: "The collection is already used in an edge definition of the graph." + code: 1929 +- name: ERROR_GRAPH_EDGE_COLLECTION_NOT_USED + text: "edge collection not used in graph" + desc: "The edge collection is not used in any edge definition of the graph." + code: 1930 +- name: ERROR_GRAPH_NO_GRAPH_COLLECTION + text: "collection _graphs does not exist" + desc: "collection _graphs does not exist." + code: 1932 +- name: ERROR_GRAPH_INVALID_NUMBER_OF_ARGUMENTS + text: "Invalid number of arguments. Expected: " + desc: "Invalid number of arguments. Expected: " + code: 1935 +- name: ERROR_GRAPH_INVALID_PARAMETER + text: "Invalid parameter type." + desc: "Invalid parameter type." + code: 1936 +- name: ERROR_GRAPH_COLLECTION_USED_IN_ORPHANS + text: "collection used in orphans" + desc: "The collection is already used in the orphans of the graph." + code: 1938 +- name: ERROR_GRAPH_EDGE_COL_DOES_NOT_EXIST + text: "edge collection does not exist or is not part of the graph" + desc: "the specified edge collection does not exist or is not part of the graph." + code: 1939 +- name: ERROR_GRAPH_EMPTY + text: "empty graph" + desc: "The requested graph has no edge collections." + code: 1940 +- name: ERROR_GRAPH_INTERNAL_DATA_CORRUPT + text: "internal graph data corrupt" + desc: "The _graphs collection contains invalid data." + code: 1941 +- name: ERROR_GRAPH_CREATE_MALFORMED_ORPHAN_LIST + text: "malformed orphan list" + desc: "the orphan list argument is malformed. It has to be an array of strings." + code: 1943 +- name: ERROR_GRAPH_EDGE_DEFINITION_IS_DOCUMENT + text: "edge definition collection is a document collection" + desc: "the collection used as a relation is existing, but is a document collection, it cannot be used here." + code: 1944 +- name: ERROR_GRAPH_COLLECTION_IS_INITIAL + text: "initial collection is not allowed to be removed manually" + desc: "the collection is used as the initial collection of this graph and is not allowed to be removed manually." + code: 1945 +- name: ERROR_GRAPH_NO_INITIAL_COLLECTION + text: "no valid initial collection found" + desc: "during the graph creation process no collection could be selected as the needed initial collection. Happens if a distributeShardsLike or replicationFactor mismatch was found." + code: 1946 +- name: ERROR_GRAPH_REFERENCED_VERTEX_COLLECTION_NOT_USED + text: "referenced vertex collection is not part of the graph" + desc: "the _from or _to collection specified for the edge refers to a vertex collection which is not used in any edge definition of the graph." + code: 1947 +- name: ERROR_GRAPH_NEGATIVE_EDGE_WEIGHT + text: "negative edge weight found" + desc: "a negative edge weight was found during a weighted graph traversal or shortest path query" + code: 1948 +- group: Session errors +- name: ERROR_SESSION_UNKNOWN + text: "unknown session" + desc: "Will be raised when an invalid/unknown session id is passed to the server." + code: 1950 +- name: ERROR_SESSION_EXPIRED + text: "session expired" + desc: "Will be raised when a session is expired." + code: 1951 +- group: Simple Client errors +- name: ERROR_SIMPLE_CLIENT_UNKNOWN_ERROR + text: "unknown client error" + desc: "This error should not happen." + code: 2000 +- name: ERROR_SIMPLE_CLIENT_COULD_NOT_CONNECT + text: "could not connect to server" + desc: "Will be raised when the client could not connect to the server." + code: 2001 +- name: ERROR_SIMPLE_CLIENT_COULD_NOT_WRITE + text: "could not write to server" + desc: "Will be raised when the client could not write data." + code: 2002 +- name: ERROR_SIMPLE_CLIENT_COULD_NOT_READ + text: "could not read from server" + desc: "Will be raised when the client could not read data." + code: 2003 +- name: ERROR_WAS_ERLAUBE + text: "was erlaube?!" + desc: "Will be raised if was erlaube?!" + code: 2019 +- group: internal AQL errors +- name: ERROR_INTERNAL_AQL + text: "General internal AQL error" + desc: "Internal error during AQL execution" + code: 2200 +- name: ERROR_WROTE_TOO_FEW_OUTPUT_REGISTERS + text: "An AQL block wrote too few output registers" + desc: "An AQL block wrote too few output registers" + code: 2201 +- name: ERROR_WROTE_TOO_MANY_OUTPUT_REGISTERS + text: "An AQL block wrote too many output registers" + desc: "An AQL block wrote too many output registers" + code: 2202 +- name: ERROR_WROTE_OUTPUT_REGISTER_TWICE + text: "An AQL block wrote an output register twice" + desc: "An AQL block wrote an output register twice" + code: 2203 +- name: ERROR_WROTE_IN_WRONG_REGISTER + text: "An AQL block wrote in a register that is not its output" + desc: "An AQL block wrote in a register that is not its output" + code: 2204 +- name: ERROR_INPUT_REGISTERS_NOT_COPIED + text: "An AQL block did not copy its input registers" + desc: "An AQL block did not copy its input registers" + code: 2205 +- group: Foxx management errors +- name: ERROR_MALFORMED_MANIFEST_FILE + text: "failed to parse manifest file" + desc: "The service manifest file is not well-formed JSON." + code: 3000 +- name: ERROR_INVALID_SERVICE_MANIFEST + text: "manifest file is invalid" + desc: "The service manifest contains invalid values." + code: 3001 +- name: ERROR_SERVICE_FILES_MISSING + text: "service files missing" + desc: "The service folder or bundle does not exist on this server." + code: 3002 +- name: ERROR_SERVICE_FILES_OUTDATED + text: "service files outdated" + desc: "The local service bundle does not match the checksum in the database." + code: 3003 +- name: ERROR_INVALID_FOXX_OPTIONS + text: "service options are invalid" + desc: "The service options contain invalid values." + code: 3004 +- name: ERROR_INVALID_MOUNTPOINT + text: "invalid mountpath" + desc: "The service mountpath contains invalid characters." + code: 3007 +- name: ERROR_SERVICE_NOT_FOUND + text: "service not found" + desc: "No service found at the given mountpath." + code: 3009 +- name: ERROR_SERVICE_NEEDS_CONFIGURATION + text: "service needs configuration" + desc: "The service is missing configuration or dependencies." + code: 3010 +- name: ERROR_SERVICE_MOUNTPOINT_CONFLICT + text: "service already exists" + desc: "A service already exists at the given mountpath." + code: 3011 +- name: ERROR_SERVICE_MANIFEST_NOT_FOUND + text: "missing manifest file" + desc: "The service directory does not contain a manifest file." + code: 3012 +- name: ERROR_SERVICE_OPTIONS_MALFORMED + text: "failed to parse service options" + desc: "The service options are not well-formed JSON." + code: 3013 +- name: ERROR_SERVICE_SOURCE_NOT_FOUND + text: "source path not found" + desc: "The source path does not match a file or directory." + code: 3014 +- name: ERROR_SERVICE_SOURCE_ERROR + text: "error resolving source" + desc: "The source path could not be resolved." + code: 3015 +- name: ERROR_SERVICE_UNKNOWN_SCRIPT + text: "unknown script" + desc: "The service does not have a script with this name." + code: 3016 +- name: ERROR_SERVICE_API_DISABLED + text: "service api disabled" + desc: "The API for managing Foxx services has been disabled on this server." + code: 3099 +- group: JavaScript module loader errors +- name: ERROR_MODULE_NOT_FOUND + text: "cannot locate module" + desc: "The module path could not be resolved." + code: 3100 +- name: ERROR_MODULE_SYNTAX_ERROR + text: "syntax error in module" + desc: "The module could not be parsed because of a syntax error." + code: 3101 +- name: ERROR_MODULE_FAILURE + text: "failed to invoke module" + desc: "Failed to invoke the module in its context." + code: 3103 +- group: Enterprise Edition errors +- name: ERROR_NO_SMART_COLLECTION + text: "collection is not smart" + desc: "The requested collection needs to be smart, but it isn't." + code: 4000 +- name: ERROR_NO_SMART_GRAPH_ATTRIBUTE + text: "smart graph attribute not given" + desc: "The given document does not have the SmartGraph attribute set." + code: 4001 +- name: ERROR_CANNOT_DROP_SMART_COLLECTION + text: "cannot drop this smart collection" + desc: "This smart collection cannot be dropped, it dictates sharding in the graph." + code: 4002 +- name: ERROR_KEY_MUST_BE_PREFIXED_WITH_SMART_GRAPH_ATTRIBUTE + text: "in smart vertex collections _key must be a string and prefixed with the value of the smart graph attribute" + desc: "In a smart vertex collection _key must be prefixed with the value of the SmartGraph attribute." + code: 4003 +- name: ERROR_ILLEGAL_SMART_GRAPH_ATTRIBUTE + text: "attribute cannot be used as smart graph attribute" + desc: "The given smartGraph attribute is illegal and cannot be used for sharding. All system attributes are forbidden." + code: 4004 +- name: ERROR_SMART_GRAPH_ATTRIBUTE_MISMATCH + text: "smart graph attribute mismatch" + desc: "The SmartGraph attribute of the given collection does not match the SmartGraph attribute of the graph." + code: 4005 +- name: ERROR_INVALID_SMART_JOIN_ATTRIBUTE + text: "invalid smart join attribute declaration" + desc: "Will be raised when the smartJoinAttribute declaration is invalid." + code: 4006 +- name: ERROR_KEY_MUST_BE_PREFIXED_WITH_SMART_JOIN_ATTRIBUTE + text: "shard key value must be prefixed with the value of the smart join attribute" + desc: "when using smartJoinAttribute for a collection, the shard key value must be prefixed with the value of the SmartJoin attribute." + code: 4007 +- name: ERROR_NO_SMART_JOIN_ATTRIBUTE + text: "smart join attribute not given or invalid" + desc: "The given document does not have the required SmartJoin attribute set or it has an invalid value." + code: 4008 +- name: ERROR_CLUSTER_MUST_NOT_CHANGE_SMART_JOIN_ATTRIBUTE + text: "must not change the value of the smartJoinAttribute" + desc: "Will be raised if there is an attempt to update the value of the smartJoinAttribute." + code: 4009 +- name: ERROR_INVALID_DISJOINT_SMART_EDGE + text: "non disjoint edge found" + desc: "Will be raised if there is an attempt to create an edge between separated graph components." + code: 4010 +- name: ERROR_UNSUPPORTED_CHANGE_IN_SMART_TO_SATELLITE_DISJOINT_EDGE_DIRECTION + text: "Unsupported alternating Smart and Satellite in Disjoint SmartGraph." + desc: "Switching back and forth between Satellite and Smart in Disjoint SmartGraph is not supported within a single AQL statement. Split into multiple statements." + code: 4011 +- group: Agency errors +- name: ERROR_AGENCY_MALFORMED_GOSSIP_MESSAGE + text: "malformed gossip message" + desc: "Malformed gossip message." + code: 20001 +- name: ERROR_AGENCY_MALFORMED_INQUIRE_REQUEST + text: "malformed inquire request" + desc: "Malformed inquire request." + code: 20002 +- name: ERROR_AGENCY_INFORM_MUST_BE_OBJECT + text: "Inform message must be an object." + desc: "The inform message in the Agency must be an object." + code: 20011 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_TERM + text: "Inform message must contain uint parameter 'term'" + desc: "The inform message in the Agency must contain a uint parameter 'term'." + code: 20012 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_ID + text: "Inform message must contain string parameter 'id'" + desc: "The inform message in the Agency must contain a string parameter 'id'." + code: 20013 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_ACTIVE + text: "Inform message must contain array 'active'" + desc: "The inform message in the Agency must contain an array 'active'." + code: 20014 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_POOL + text: "Inform message must contain object 'pool'" + desc: "The inform message in the Agency must contain an object 'pool'." + code: 20015 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_MIN_PING + text: "Inform message must contain object 'min ping'" + desc: "The inform message in the Agency must contain an object 'min ping'." + code: 20016 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_MAX_PING + text: "Inform message must contain object 'max ping'" + desc: "The inform message in the Agency must contain an object 'max ping'." + code: 20017 +- name: ERROR_AGENCY_INFORM_MUST_CONTAIN_TIMEOUT_MULT + text: "Inform message must contain object 'timeoutMult'" + desc: "The inform message in the Agency must contain an object 'timeoutMult'." + code: 20018 +- name: ERROR_AGENCY_CANNOT_REBUILD_DBS + text: "Cannot rebuild readDB and spearHead" + desc: "Will be raised if the readDB or the spearHead cannot be rebuilt from the replicated log." + code: 20021 +- name: ERROR_AGENCY_MALFORMED_TRANSACTION + text: "malformed agency transaction" + desc: "Malformed agency transaction." + code: 20030 +- group: Supervision errors +- name: ERROR_SUPERVISION_GENERAL_FAILURE + text: "general supervision failure" + desc: "General supervision failure." + code: 20501 +- group: Scheduler errors +- name: ERROR_QUEUE_FULL + text: "queue is full" + desc: "Will be returned if the scheduler queue is full." + code: 21003 +- name: ERROR_QUEUE_TIME_REQUIREMENT_VIOLATED + text: "queue time violated" + desc: "Will be returned if a request with a queue time requirement is set and it cannot be fulfilled." + code: 21004 +- name: ERROR_TOO_MANY_DETACHED_THREADS + text: "too many detached scheduler threads" + desc: "Will be returned if a scheduler thread tries to detach itself but there are already too many detached scheduler threads." + code: 21005 +- group: Maintenance errors +- name: ERROR_ACTION_OPERATION_UNABORTABLE + text: "this maintenance action cannot be stopped" + desc: "This maintenance action cannot be stopped once it is started" + code: 6002 +- name: ERROR_ACTION_UNFINISHED + text: "maintenance action still processing" + desc: "This maintenance action is still processing" + code: 6003 +- group: Backup/Restore errors +- name: ERROR_HOT_BACKUP_INTERNAL + text: "internal hot backup error" + desc: "Failed to create hot backup set" + code: 7001 +- name: ERROR_HOT_RESTORE_INTERNAL + text: "internal hot restore error" + desc: "Failed to restore to hot backup set" + code: 7002 +- name: ERROR_BACKUP_TOPOLOGY + text: "backup does not match this topology" + desc: "The hot backup set cannot be restored on non matching cluster topology" + code: 7003 +- name: ERROR_NO_SPACE_LEFT_ON_DEVICE + text: "no space left on device" + desc: "No space left on device" + code: 7004 +- name: ERROR_FAILED_TO_UPLOAD_BACKUP + text: "failed to upload hot backup set to remote target" + desc: "Failed to upload hot backup set to remote target" + code: 7005 +- name: ERROR_FAILED_TO_DOWNLOAD_BACKUP + text: "failed to download hot backup set from remote source" + desc: "Failed to download hot backup set from remote source" + code: 7006 +- name: ERROR_NO_SUCH_HOT_BACKUP + text: "no such hot backup set can be found" + desc: "Cannot find a hot backup set with this Id" + code: 7007 +- name: ERROR_REMOTE_REPOSITORY_CONFIG_BAD + text: "remote hotback repository configuration error" + desc: "The configuration given for upload or download operation to/from remote hot backup repositories is wrong." + code: 7008 +- name: ERROR_LOCAL_LOCK_FAILED + text: "some db servers cannot be reached for transaction locks" + desc: "Some of the DB-Servers cannot be reached for transaction locks." + code: 7009 +- name: ERROR_LOCAL_LOCK_RETRY + text: "some db servers cannot be reached for transaction locks" + desc: "Some of the DB-Servers cannot be reached for transaction locks." + code: 7010 +- name: ERROR_HOT_BACKUP_CONFLICT + text: "hot backup conflict" + desc: "Conflict of multiple hot backup processes." + code: 7011 +- name: ERROR_HOT_BACKUP_DBSERVERS_AWOL + text: "hot backup not all db servers reachable" + desc: "One or more DB-Servers could not be reached for hot backup inquiry" + code: 7012 +- group: Plan Analyzers errors +- name: ERROR_CLUSTER_COULD_NOT_MODIFY_ANALYZERS_IN_PLAN + text: "analyzers in plan could not be modified" + desc: "Plan could not be modified while creating or deleting Analyzers revision" + code: 7021 +- group: Licensing +- name: ERROR_LICENSE_EXPIRED_OR_INVALID + text: "license has expired or is invalid" + desc: "The license has expired or is invalid." + code: 9001 +- name: ERROR_LICENSE_SIGNATURE_VERIFICATION + text: "license verification failed" + desc: "Verification of license failed." + code: 9002 +- name: ERROR_LICENSE_NON_MATCHING_ID + text: "non-matching license id" + desc: "The ID of the license does not match the ID of this instance." + code: 9003 +- name: ERROR_LICENSE_FEATURE_NOT_ENABLED + text: "feature is not enabled by the license" + desc: "The installed license does not cover this feature." + code: 9004 +- name: ERROR_LICENSE_RESOURCE_EXHAUSTED + text: "the resource is exhausted" + desc: "The installed license does not cover a higher number of this resource." + code: 9005 +- name: ERROR_LICENSE_INVALID + text: "invalid license" + desc: "The license does not hold features of an ArangoDB license." + code: 9006 +- name: ERROR_LICENSE_CONFLICT + text: "conflicting license" + desc: "The license has one or more inferior features." + code: 9007 +- name: ERROR_LICENSE_VALIDATION_FAILED + text: "failed to validate license signature" + desc: "Could not verify the license's signature." + code: 9008 diff --git a/site/data/oem/exitcodes.yaml b/site/data/oem/exitcodes.yaml new file mode 100644 index 0000000000..d9b2248f5e --- /dev/null +++ b/site/data/oem/exitcodes.yaml @@ -0,0 +1,87 @@ +- group: General +- name: EXIT_SUCCESS + text: success + desc: No error has occurred. + code: 0 +- name: EXIT_FAILED + text: exit with error + desc: Will be returned when a general error occurred. + code: 1 +- name: EXIT_CODE_RESOLVING_FAILED + text: exit code resolving failed + desc: unspecified exit code + code: 2 +- name: EXIT_INVALID_OPTION_NAME + text: invalid startup option name + desc: invalid/unknown startup option name was used + code: 3 +- name: EXIT_INVALID_OPTION_VALUE + text: invalid startup option value + desc: invalid startup option value was used + code: 4 +- name: EXIT_BINARY_NOT_FOUND + text: binary not found + desc: Will be returned if a referenced binary was not found + code: 5 +- name: EXIT_CONFIG_NOT_FOUND + text: config not found or invalid + desc: Will be returned if no valid configuration was found or its contents are structurally invalid + code: 6 +- group: Internal +- name: EXIT_UPGRADE_FAILED + text: upgrade failed + desc: Will be returned when the database upgrade failed + code: 10 +- name: EXIT_UPGRADE_REQUIRED + text: db upgrade required + desc: Will be returned when a database upgrade is required + code: 11 +- name: EXIT_DOWNGRADE_REQUIRED + text: db downgrade required + desc: Will be returned when a database upgrade is required + code: 12 +- name: EXIT_VERSION_CHECK_FAILED + text: version check failed + desc: Will be returned when there is a version mismatch + code: 13 +- group: Startup +- name: EXIT_ALREADY_RUNNING + text: already running + desc: Will be returned when arangod is already running according to PID-file + code: 20 +- name: EXIT_COULD_NOT_BIND_PORT + text: port blocked + desc: Will be returned when the configured tcp endpoint is already occupied by another process + code: 21 +- name: EXIT_COULD_NOT_LOCK + text: could not lock - another process could be running + desc: Will be returned if another ArangoDB process is running, or the state can not be cleared + code: 22 +- name: EXIT_RECOVERY + text: recovery failed + desc: Will be returned if the automatic database startup recovery fails + code: 23 +- name: EXIT_DB_NOT_EMPTY + text: database not empty + desc: Will be returned when commanding to initialize a non empty directory as database + code: 24 +- name: EXIT_UNSUPPORTED_STORAGE_ENGINE + text: unsupported storage engine + desc: Will be returned when trying to start with an unsupported storage engine + code: 25 +- name: EXIT_ICU_INITIALIZATION_FAILED + text: failed to initialize ICU library + desc: Will be returned if icudtl.dat is not found, of the wrong version or invalid. Check for an incorrectly set ICU_DATA environment variable + code: 26 +- name: EXIT_TZDATA_INITIALIZATION_FAILED + text: failed to locate tzdata + desc: Will be returned if tzdata is not found + code: 27 +- name: EXIT_RESOURCES_TOO_LOW + text: the system restricts resources below what is required to start arangod + desc: Will be returned if i.e. ulimit is too restrictive + code: 28 +- name: EXIT_SST_FILE_CHECK + text: sst file check unsuccessful + desc: Will be returned when either sst file open or sst file check was unsuccessful i.e. sst file is not valid + code: 29 diff --git a/site/data/oem/optimizer-rules.json b/site/data/oem/optimizer-rules.json new file mode 100644 index 0000000000..8cf2946248 --- /dev/null +++ b/site/data/oem/optimizer-rules.json @@ -0,0 +1,794 @@ +[ + { + "name": "replace-function-with-index", + "description": "Replace deprecated index functions such as `FULLTEXT()`,\n`NEAR()`, `WITHIN()`, or `WITHIN_RECTANGLE()` with a regular subquery.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "inline-subqueries", + "description": "Try to pull subqueries out into their surrounding scope, e.g.\n`FOR x IN (FOR y IN collection FILTER y.value >= 5 RETURN y.test) RETURN x.a`\nbecomes `FOR tmp IN collection FILTER tmp.value >= 5 LET x = tmp.test RETURN x.a`.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "simplify-conditions", + "description": "Replace parts in `CalculationNode` expressions with\nsimpler expressions.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "move-calculations-up", + "description": "Move calculations up in the processing pipeline as far as\npossible (ideally out of enumerations) so they are not executed in loops if not\nrequired. It is quite common that this rule enables further optimizations.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "move-filters-up", + "description": "Move filters up in the processing pipeline as far as possible\n(ideally out of inner loops) so they filter results as early as possible.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-redundant-calculations", + "description": "Replace references to redundant calculations (expressions\nwith the exact same result) with a single reference, allowing other rules to\nremove no longer needed calculations.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-unnecessary-filters", + "description": "Remove `FILTER` conditions that always evaluate to `true`.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-unnecessary-calculations", + "description": "Remove all calculations whose result is not referenced in the\nquery. This can be a consequence of applying other optimizations.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "specialize-collect", + "description": "Appears whenever a `COLLECT` statement is used in a query to determine\nthe type of `CollectNode` to use.", + "flags": { + "hidden": true, + "clusterOnly": false, + "canBeDisabled": false, + "canCreateAdditionalPlans": true, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-redundant-sorts", + "description": "Try to merge multiple `SORT` statements into fewer sorts.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-subqueries", + "description": "Apply optimizations to subqueries.\n\nThis rule adds a `LIMIT` statement to qualifying subqueries to make them return\nless data. It also modifies the result value of subqueries in case only the\nnumber of subquery results is checked later. This saves copying the document\ndata from the subquery to the outer scope and may enable follow-up\noptimizations.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "interchange-adjacent-enumerations", + "description": "Try out permutations of `FOR` statements in queries that contain\nmultiple loops, which may enable further optimizations by other rules.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": true, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "move-calculations-up-2", + "description": "Second pass of moving calculations up in the processing\npipeline as far as possible, to pull them out of inner loops etc.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "move-filters-up-2", + "description": "Second pass of moving filters up in the processing pipeline\nas far as possible so they filter results as early as possible.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-redundant-sorts-2", + "description": "Second pass of trying to merge multiple `SORT` statements\ninto fewer sorts.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-sort-rand-limit-1", + "description": "Remove `SORT RAND() LIMIT 1` constructs by moving the random iteration\ninto `EnumerateCollectionNode`.\n\nThe RocksDB storage engine doesn't allow to seek random documents efficiently.\nThis optimization picks a pseudo-random document based on a limited number of\nseeks within the collection's key range, selecting a random start key in the\nkey range, and then going a few steps before or after that.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-collect-variables", + "description": "Remove `INTO` and `AGGREGATE` clauses from `COLLECT`\nstatements if the result is not used.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "propagate-constant-attributes", + "description": "Insert constant values into `FILTER` conditions, replacing\ndynamic attribute values.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-data-modification-out-variables", + "description": "Avoid setting the pseudo-variables `OLD` and `NEW` if they\nare not used in data modification queries.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "replace-or-with-in", + "description": "Combine multiple `OR` equality conditions on the same\nvariable or attribute with an `IN` condition.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-redundant-or", + "description": "Combine multiple `OR` conditions for the same variable or\nattribute into a single condition.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "geo-index-optimizer", + "description": "Utilize geo-spatial indexes.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "use-indexes", + "description": "Use indexes to iterate over collections, replacing\n`EnumerateCollectionNode` with `IndexNode` in the query plan.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-filter-covered-by-index", + "description": "Replace or remove `FilterNode` if the filter conditions are\nalready covered by `IndexNode`.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-unnecessary-filters-2", + "description": "Second pass of removing `FILTER` conditions that always\nevaluate to `true`.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "use-index-for-sort", + "description": "Use indexes to avoid `SORT` operations, removing `SortNode`\nfrom the query plan.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "sort-in-values", + "description": "Use a binary search for in-list lookups with a logarithmic\ncomplexity instead of the default linear complexity in-list lookup if the\ncomparison array on the right-hand side of an `IN` operator is pre-sorted by an\nextra function call.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-traversal-last-element-access", + "description": "Transform accesses to the last vertex or edge of the path\noutput variable (`p.vertices[-1]` and `p.edges[-1]`) emitted by AQL traversals\n(`FOR v, e, p IN ...`) with accesses to the vertex or edge variable\n(`v` and `e`). This can avoid computing the path variable at all and enable\nfurther optimizations that are not possible on the path variable `p`.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-traversals", + "description": "Try to move `FILTER` conditions into `TraversalNode` for\nearly pruning of results, apply traversal projections, and avoid calculating\nedge and path output variables that are not declared in the query for the\nAQL traversal.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-paths", + "description": "Check how the output variables of `K_PATHS`, `K_SHORTEST_PATHS`,\nand `ALL_SHORTEST_PATHS` path search graph algorithms are used and avoid\nloading the vertex documents if they are not accessed in the query.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-filter-covered-by-traversal", + "description": "Replace or remove `FilterNode` if the filter conditions are\nalready covered by `TraversalNode`.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "handle-arangosearch-views", + "description": "Appears whenever an `arangosearch` or `search-alias` View is accessed\nin a query.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "arangosearch-constrained-sort", + "description": "Make nodes of type `EnumerateViewNode` aware of `SORT` with a\nsubsequent `LIMIT` when using Views to reduce memory usage and avoid unnecessary\nsorting that has already been carried out by ArangoSearch internally.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-unnecessary-calculations-2", + "description": "Second pass of removing all calculations whose result is not\nreferenced in the query. This can be a consequence of applying other\noptimizations", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-redundant-path-var", + "description": "Avoid computing the variables emitted by AQL traversals if\nthey are declared but unused in the query, or only used in filters that are\npulled into the traversal, significantly reducing overhead.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-cluster-single-document-operations", + "description": "Let a Coordinator work with a document directly if you\nreference a document by its `_key`. In this case, no AQL is executed on the\nDB-Servers.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-cluster-multiple-document-operations", + "description": "For bulk `INSERT` operations in cluster deployments, avoid\nunnecessary overhead that AQL queries typically require for the setup and\nshutdown in clusters, as well as for the internal batching.\n\nThis optimization also decreases the number of HTTP requests to the DB-Servers.\n\nThe following patterns are recognized:\n\n- `FOR doc IN @docs INSERT doc INTO collection`, where `@docs` is a\n bind parameter with an array of documents to be inserted\n- `FOR doc IN [ { … }, { … }, … ] INSERT doc INTO collection`, where the `FOR`\n loop iterates over an array of input documents known at query compile time\n- `LET docs = [ { … }, { … }, … ] FOR doc IN docs INSERT doc INTO collection`,\n where the `docs` variable is a static array of input documents known at\n query compile time\n\nIf a query has such a pattern, and all of the following restrictions are met,\nthen the optimization is triggered:\n\n- There are no following `RETURN` nodes (including any `RETURN OLD` or `RETURN NEW`)\n- The `FOR` loop is not contained in another outer `FOR` loop or subquery\n- There are no other operations (e.g. `LET`, `FILTER`) between `FOR` and `INSERT`\n- `INSERT` is not used on a SmartGraph edge collection\n- The `FOR` loop iterates over a constant, deterministic expression\n\nThe optimization then replaces the `InsertNode` and `EnumerateListNode` with a\n`MultipleRemoteExecutionNode` in the query execution plan, which takes care of\ninserting all documents into the collection in one go. Further optimizer rules\nare skipped if the optimization is triggered.\n", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "move-calculations-down", + "description": "Move calculations down in the processing pipeline as far as\npossible (below `FILTER`, `LIMIT` and `SUBQUERY` nodes) so they are executed as\nlate as possible and not before their results are required.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "fuse-filters", + "description": "Merges adjacent `FILTER` nodes together into a single\n`FILTER` node.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "cluster-one-shard", + "description": "Offload the entire query to the DB-Server (except the client\ncommunication via a Coordinator). This saves all the back and forth that\nnormally exists in regular cluster queries, benefitting traversals and joins\nin particular.\n\nOnly for eligible queries in the OneShard deployment mode as well as for\nqueries that only involve collection(s) with a single shard (and identical\nsharding in case of multiple collections, e.g. via `distributeShardsLike`).\nQueries involving V8 / JavaScript (e.g. user-defined AQL functions) or\nSmartGraphs cannot be optimized.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "cluster-lift-constant-for-disjoint-graph-nodes", + "description": "Detect SmartGraph traversals with a constant start vertex to\nprepare follow-up optimizations that can determine the shard location and push\ndown calculations to a DB-Server.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "distribute-in-cluster", + "description": "Appears if query parts get distributed in a cluster.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "smart-joins", + "description": "Reduce inter-node joins to server-local joins.\nThis rule is only employed when joining two collections with identical sharding\nsetup via their shard keys.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "scatter-in-cluster", + "description": "Appears if nodes of the types `ScatterNode`, `GatherNode`,\nand `RemoteNode` are inserted into a distributed query plan.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "scatter-satellite-graphs", + "description": "Execute nodes of the types `TraversalNode`,\n`ShortestPathNode`, and `KShortestPathsNode` on a DB-Server instead of on a\nCoordinator if the nodes operate on SatelliteGraphs, removing the need to\ntransfer data for these nodes.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "remove-satellite-joins", + "description": "Optimize nodes of the types `ScatterNode`, `GatherNode`, and\n`RemoteNode` for SatelliteCollections and SatelliteGraphs away. Execute the\nrespective query parts on each participating DB-Server independently, so that\nthe results become available locally without network communication.\nDepends on the `remove-unnecessary-remote-scatter` rule.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "remove-distribute-nodes", + "description": "Combine multiples nodes of type `DistributeNode` into one if\ntwo adjacent `DistributeNode` nodes share the same input variables and\ntherefore can be optimized into a single `DistributeNode`.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "distribute-offset-info-to-cluster", + "description": "Push the calculation of search highlighting information to\nDB-Servers where the data for determining the offsets is stored.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "distribute-filtercalc-to-cluster", + "description": "Move filters up in a distributed execution plan. Filters are\nmoved as far up in the plan as possible to make result sets as small as\npossible, as early as possible.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "distribute-sort-to-cluster", + "description": "Move sort operations up in a distributed query. Sorts are\nmoved as far up in the query plan as possible to make result sets as small as\npossible, as early as possible.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "move-filters-into-enumerate", + "description": "Move filters on non-indexed collection attributes into\n`IndexNode` or `EnumerateCollectionNode` to allow early pruning of\nnon-matching documents. This optimization can help to avoid a lot of temporary\ndocument copies.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "remove-unnecessary-calculations-3", + "description": "Third pass of removing all calculations whose result is not\nreferenced in the query. This can be a consequence of applying other\noptimizations", + "flags": { + "hidden": true, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": true, + "enterpriseOnly": false + } + }, + { + "name": "remove-unnecessary-remote-scatter", + "description": "Avoid distributing calculations and handle them centrally if\na `RemoteNode` is followed by a `ScatterNode`, and the `ScatterNode` is only\nfollowed by calculations or a `SingletonNode`.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "undistribute-remove-after-enum-coll", + "description": "Push nodes of type `RemoveNode` into the same query part that\nenumerates over the documents of a collection. This saves inter-cluster\nroundtrips between the `EnumerateCollectionNode` and the `RemoveNode`.\nIt includes simple `UPDATE` and `REPLACE` operations that modify multiple\ndocuments and do not use `LIMIT`.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "collect-in-cluster", + "description": "Perform the heavy processing for `COLLECT` statements on\nDB-Servers and only light-weight aggregation on a Coordinator. Both sides get\na `CollectNode` in the query plan.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "sort-limit", + "description": "Make `SORT` aware of a subsequent `LIMIT` to enable\noptimizations internal to the `SortNode` that allow to reduce memory usage\nand, in many cases, improve the sorting speed.\n\nA `SortNode` needs to be followed by a `LimitNode` with no intervening nodes\nthat may change the element count (e.g. a `FilterNode` which cannot be moved\nbefore the sort, or a source node like `EnumerateCollectionNode`).\n\nThe optimizer may choose not to apply the rule if it decides that it offers\nlittle or no benefit. In particular, it does not apply the rule if the input\nsize is very small or if the output from the `LimitNode` is similar in size to\nthe input. In exceptionally rare cases, this rule could result in some small\nslowdown. If observed, you can disable the rule for the affected query at the\ncost of increased memory usage.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "reduce-extraction-to-projection", + "description": "Modify `EnumerationCollectionNode` and `IndexNode` that would have\nextracted entire documents to only return a projection of each document.\n\nProjections are limited to at most 5 different document attributes by default.\nThe maximum number of projected attributes can optionally be adjusted by\nsetting the `maxProjections` hint for an AQL `FOR` operation since\nArangoDB 3.9.1.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "restrict-to-single-shard", + "description": "Restrict operations to a single shard instead of applying\nthem for all shards if a collection operation (`IndexNode` or a\ndata modification node) only affects a single shard.\n \nThis optimization can be applied for queries that access a collection only once\nin the query, and that do not use traversals, shortest path queries, and that\ndo not access collection data dynamically using the `DOCUMENT()`, `FULLTEXT()`,\n`NEAR()` or `WITHIN()` AQL functions. Additionally, the optimizer can only\napply this optimization if it can safely determine the values of all the\ncollection's shard keys from the query, and when the shard keys are covered by\na single index (this is always true if the shard key is the default `_key`).", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "optimize-count", + "description": "Optimize subqueries to use an optimized code path for\ncounting documents.\n\nThe requirements are that the subquery result must only be used with the\n`COUNT()` or `LENGTH()` AQL function and not for anything else. The subquery\nitself must be read-only (no data modification subquery), not use nested `FOR`\nloops, no `LIMIT` statement, and no `FILTER` condition or calculation that\nrequires accessing document data. Accessing index data is supported for\nfiltering but not for further calculations.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "parallelize-gather", + "description": "Apply an optimization to execute Coordinator `GatherNode`\nnodes in parallel. These notes cannot be parallelized if they depend on a\n`TraversalNode`, except for certain Disjoint SmartGraph traversals where the\ntraversal can run completely on the local DB-Server.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "decay-unnecessary-sorted-gather", + "description": "Avoid merge-sorting results on a Coordinator if they are all\nfrom a single shard and fully sorted by a DB-Server already.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "push-subqueries-to-dbserver", + "description": "Execute subqueries entirely on a DB-Server if possible.\nSubqueries need to contain exactly one distribute/gather section, and only one\ncollection access or traversal, shortest path, or k-shortest paths query.", + "flags": { + "hidden": false, + "clusterOnly": true, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "late-document-materialization-arangosearch", + "description": "Try to read from the underlying collections of a View as late\nas possible if the involved attributes are covered by the View index.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "late-document-materialization", + "description": "Try to read from collections as late as possible if the\ninvolved attributes are covered by regular indexes.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + }, + { + "name": "late-materialization-offset-info", + "description": "Get the search highlighting offsets as late as possible to\navoid unnecessary reads.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": true, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": true + } + }, + { + "name": "splice-subqueries", + "description": "Appears if subqueries are spliced into the surrounding query,\nreducing overhead for executing subqueries by inlining the execution.\nThis mainly benefits queries which execute subqueries very often that only\nreturn a few results at a time.\n\nThis optimization is performed on all subqueries and is applied after all other\noptimizations.", + "flags": { + "hidden": false, + "clusterOnly": false, + "canBeDisabled": false, + "canCreateAdditionalPlans": false, + "disabledByDefault": false, + "enterpriseOnly": false + } + } +] diff --git a/site/data/versions.yaml b/site/data/versions.yaml index 00457f1de5..3f0b9fbfa1 100644 --- a/site/data/versions.yaml +++ b/site/data/versions.yaml @@ -19,3 +19,8 @@ version: "3.10.14" alias: "3.10" deprecated: true + + - name: "oem" + version: "3.11.15 (LTS)" + alias: "oem" + deprecated: false diff --git a/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html b/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html index cc19ff682d..0cdfaa0f21 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html @@ -41,8 +41,9 @@ {{ $coreVersion := .coreVersion -}} {{ $versions := index site.Data.versions "/arangodb/" -}} {{ range $i, $version := $versions -}} - {{ if eq $coreVersion $version.name -}} + {{ if or (eq $coreVersion $version.name) (eq $coreVersion $version.alias) -}} {{ $version.version -}} + {{ break -}} {{ end -}} {{ end -}} {{ end -}} diff --git a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html index 3466579da1..8b34ff212a 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/shortcodes/version.html @@ -8,7 +8,7 @@ {{- $page.Store.Set "versionShort" $version.name }} {{- $page.Store.Set "alias" $version.alias }} {{- $page.Store.Set "deprecated" $version.deprecated }} - {{- if ne $version.name "platform" }} + {{- if ne $version.name "oem" }} {{- template "checkVersionIsInDevelopment" dict "page" $page "pageVersion" $version.name "versions" $versions }} {{- end }} {{- break }} diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html index 20883b4ac0..78ffd56888 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html @@ -1,6 +1,8 @@ {{ $ver := (.Get 0) -}} {{- $versions := (where (index .Site.Data.versions "/arangodb/") "name" $ver) -}} {{ if $versions -}} + {{/* TODO: This is used to determine the release branch name, e.g. 3.12.6. + How will this work for OEM? 3.11.15-oem? */}} {{ (index $versions 0).version | htmlEscape -}} {{ else -}} {{ $path := "<non-file source>" -}} diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/program-options.md b/site/themes/arangodb-docs-theme/layouts/shortcodes/program-options.md index b47b578aac..fad13bf83d 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/program-options.md +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/program-options.md @@ -57,7 +57,7 @@ {{- if $option.experimental }} {{- $badges = $badges | append "Experimental"}} {{- end }} -{{- if or (eq $pageVersion "3.10") (eq $pageVersion "3.11") }}{{/* Only one Edition v3.12.5+ */}} +{{- if or (eq $pageVersion "3.10") (eq $pageVersion "3.11") (eq $pageVersion "oem") }}{{/* Only one Edition v3.12.5+ */}} {{- if $option.enterpriseOnly }} {{- $badges = $badges | append "Enterprise Edition" }} {{- end }} @@ -96,7 +96,7 @@ Default: `{{ string (index (slice | append .) 0) }}` {{ . }} {{ end }} -{{ if or (eq $pageVersion "3.10") (eq $pageVersion "3.11") }}{{/* No Windows/macOS in 3.12+, logic can be removed after 3.11 EOL */}} +{{ if or (eq $pageVersion "3.10") (eq $pageVersion "3.11") (eq $pageVersion "oem") }}{{/* No Windows/macOS in 3.12+, logic still needed for OEM LTS version */}} {{ with $option.os }} {{ $size := . | len }} {{ if lt $size 3 }}{{/* needs to be equal to the total number of possible OSes */}} diff --git a/toolchain/arangoproxy/internal/service/service.go b/toolchain/arangoproxy/internal/service/service.go index fe50f0af78..49ae21e1dd 100644 --- a/toolchain/arangoproxy/internal/service/service.go +++ b/toolchain/arangoproxy/internal/service/service.go @@ -161,7 +161,8 @@ func init() { "name": "Business Source License 1.1", "url": "https://github.com/arangodb/arangodb/blob/devel/LICENSE", } - if version.Name == "3.10" || version.Name == "3.11" { + // TODO: What branch does the OEM version have? Might not match (e.g. capitalization) with what we want to print below + if version.Name == "3.10" || version.Name == "3.11" || version.Name == "oem" { license["name"] = "Apache 2.0" license["url"] = fmt.Sprintf("https://github.com/arangodb/arangodb/blob/%s/LICENSE", version.Name) } diff --git a/toolchain/docker/amd64/docker-compose.yml b/toolchain/docker/amd64/docker-compose.yml index 3194cab15b..4e43161cc5 100644 --- a/toolchain/docker/amd64/docker-compose.yml +++ b/toolchain/docker/amd64/docker-compose.yml @@ -4,6 +4,7 @@ services: image: arangodb/docs-hugo:toolchain-amd64 tty: true volumes: + - ${ARANGODB_SRC_OEM:-/tmp/0}:/tmp/oem - ${ARANGODB_SRC_3_10:-/dev/null}:/tmp/3.10 - ${ARANGODB_SRC_3_11:-/tmp/1}:/tmp/3.11 - ${ARANGODB_SRC_3_12:-/tmp/2}:/tmp/3.12 @@ -16,10 +17,12 @@ services: HUGO_ENV: ${HUGO_ENV:-development} GENERATORS: ${GENERATORS} OVERRIDE: ${OVERRIDE} + ARANGODB_SRC_OEM: ${ARANGODB_SRC_OEM} ARANGODB_SRC_3_10: ${ARANGODB_SRC_3_10} ARANGODB_SRC_3_11: ${ARANGODB_SRC_3_11} ARANGODB_SRC_3_12: ${ARANGODB_SRC_3_12} ARANGODB_SRC_3_13: ${ARANGODB_SRC_3_13} + ARANGODB_BRANCH_OEM: ${ARANGODB_BRANCH_OEM} ARANGODB_BRANCH_3_10: ${ARANGODB_BRANCH_3_10} ARANGODB_BRANCH_3_11: ${ARANGODB_BRANCH_3_11} ARANGODB_BRANCH_3_12: ${ARANGODB_BRANCH_3_12} diff --git a/toolchain/docker/arm64/docker-compose.yml b/toolchain/docker/arm64/docker-compose.yml index a8d85a4462..884dc92aba 100644 --- a/toolchain/docker/arm64/docker-compose.yml +++ b/toolchain/docker/arm64/docker-compose.yml @@ -4,6 +4,7 @@ services: image: arangodb/docs-hugo:toolchain-arm64 tty: true volumes: + - ${ARANGODB_SRC_OEM:-/tmp/0}:/tmp/oem - ${ARANGODB_SRC_3_10:-/dev/null}:/tmp/3.10 - ${ARANGODB_SRC_3_11:-/tmp/1}:/tmp/3.11 - ${ARANGODB_SRC_3_12:-/tmp/2}:/tmp/3.12 @@ -16,10 +17,12 @@ services: HUGO_ENV: ${HUGO_ENV:-development} GENERATORS: ${GENERATORS} OVERRIDE: ${OVERRIDE} + ARANGODB_SRC_OEM: ${ARANGODB_SRC_OEM} ARANGODB_SRC_3_10: ${ARANGODB_SRC_3_10} ARANGODB_SRC_3_11: ${ARANGODB_SRC_3_11} ARANGODB_SRC_3_12: ${ARANGODB_SRC_3_12} ARANGODB_SRC_3_13: ${ARANGODB_SRC_3_13} + ARANGODB_BRANCH_OEM: ${ARANGODB_BRANCH_OEM} ARANGODB_BRANCH_3_10: ${ARANGODB_BRANCH_3_10} ARANGODB_BRANCH_3_11: ${ARANGODB_BRANCH_3_11} ARANGODB_BRANCH_3_12: ${ARANGODB_BRANCH_3_12} diff --git a/toolchain/docker/docker-compose.local.yml b/toolchain/docker/docker-compose.local.yml index b1eb18b9f0..7f16256004 100644 --- a/toolchain/docker/docker-compose.local.yml +++ b/toolchain/docker/docker-compose.local.yml @@ -7,6 +7,7 @@ services: target: toolchain volumes: - ${ARANGODB_SRC:-/dev/null}:${ARANGODB_SRC:-/dev/null} + - ${ARANGODB_SRC_1:-/tmp/0}:${ARANGODB_SRC_1:-/tmp/0} - ${ARANGODB_SRC_2:-/tmp/1}:${ARANGODB_SRC_2:-/tmp/1} - ${ARANGODB_SRC_3:-/tmp/2}:${ARANGODB_SRC_3:-/tmp/2} - ${ARANGODB_SRC_4:-/tmp/3}:${ARANGODB_SRC_4:-/tmp/3} @@ -17,10 +18,12 @@ services: HUGO_URL: ${HUGO_URL:-http://localhost} HUGO_ENV: ${HUGO_ENV:-development} GENERATORS: ${GENERATORS} + ARANGODB_SRC_OEM: ${ARANGODB_SRC_OEM} ARANGODB_SRC_3_10: ${ARANGODB_SRC_3_10} ARANGODB_SRC_3_11: ${ARANGODB_SRC_3_11} ARANGODB_SRC_3_12: ${ARANGODB_SRC_3_12} ARANGODB_SRC_3_13: ${ARANGODB_SRC_3_13} + ARANGODB_BRANCH_OEM: ${ARANGODB_BRANCH_OEM} ARANGODB_BRANCH_3_10: ${ARANGODB_BRANCH_3_10} ARANGODB_BRANCH_3_11: ${ARANGODB_BRANCH_3_11} ARANGODB_BRANCH_3_12: ${ARANGODB_BRANCH_3_12} diff --git a/toolchain/scripts/toolchain.sh b/toolchain/scripts/toolchain.sh index 4836f82571..b643bf12a3 100755 --- a/toolchain/scripts/toolchain.sh +++ b/toolchain/scripts/toolchain.sh @@ -38,6 +38,11 @@ if [[ -z "${GENERATORS}" ]] || [ "${GENERATORS}" == "" ]; then fi ## Split the ARANGODB_BRANCH env var into name, image, version fields (for CI/CD) +if [ "$ARANGODB_BRANCH_OEM" != "" ] ; then + export ARANGODB_BRANCH_OEM_IMAGE="$ARANGODB_BRANCH_OEM" + export ARANGODB_BRANCH_OEM_VERSION="oem" +fi + if [ "$ARANGODB_BRANCH_3_10" != "" ] ; then export ARANGODB_BRANCH_3_10_IMAGE="$ARANGODB_BRANCH_3_10" export ARANGODB_BRANCH_3_10_VERSION="3.10" From 1e37969d906eb79029a3e71e82b07115cad0f725 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 30 Oct 2025 10:35:34 +0100 Subject: [PATCH 40/44] CircleCI: Add parameter for OEM --- .circleci/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 954ff6a2ec..977b7d07cf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,6 +31,10 @@ parameters: type: string default: "undefined" + arangodb-oem: + type: string + default: "undefined" + arangodb-3_10: type: string default: "undefined" From 6cd97f614f8b460a730d37ced2da3b45c127a912 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 30 Oct 2025 10:41:28 +0100 Subject: [PATCH 41/44] Place OEM between 3.12 and 3.11 --- site/data/versions.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/site/data/versions.yaml b/site/data/versions.yaml index 3f0b9fbfa1..f88820fc3f 100644 --- a/site/data/versions.yaml +++ b/site/data/versions.yaml @@ -10,6 +10,11 @@ alias: "stable" deprecated: false + - name: "oem" + version: "3.11.15 (LTS)" + alias: "oem" + deprecated: false + - name: "3.11" version: "3.11.14" alias: "3.11" @@ -20,7 +25,3 @@ alias: "3.10" deprecated: true - - name: "oem" - version: "3.11.15 (LTS)" - alias: "oem" - deprecated: false From 6def4895580937bf0ef5ebbc5a88f934bdbac009 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 30 Oct 2025 10:41:35 +0100 Subject: [PATCH 42/44] Fix breadcrumbs --- .../layouts/partials/breadcrumbs.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html b/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html index 0cdfaa0f21..54af574214 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/breadcrumbs.html @@ -7,8 +7,9 @@ <meta itemprop="position" content="{{ .Params.menuTitle | markdownify }}" /> <a itemprop="item" class="link" href="{{ .RelPermalink }}"> <span itemprop="name" class="breadcrumb-entry"> - {{ if eq .Path "/arangodb/" -}} - {{ $coreVersion := index (split .Path "/") 2 }} + {{ $splitPath := split .Path "/" -}} + {{ if and (eq (index $splitPath 1) "arangodb") (eq ($splitPath | len) 3) -}} + {{ $coreVersion := index $splitPath 2 }} {{ template "getVersionLong" dict "coreVersion" $coreVersion -}} {{ else -}} {{ .Params.menuTitle | markdownify -}} @@ -24,8 +25,9 @@ <meta itemprop="position" content="{{ .Params.menuTitle | markdownify }}" /> <a itemprop="item" class="link" href="{{ .RelPermalink }}"> <span itemprop="name" class="breadcrumb-entry"> - {{ if eq .Path "/arangodb/" -}} - {{ $coreVersion := index (split .Path "/") 2 }} + {{ $splitPath := split .Path "/" -}} + {{ if and (eq (index $splitPath 1) "arangodb") (eq ($splitPath | len) 3) -}} + {{ $coreVersion := index $splitPath 2 }} {{ template "getVersionLong" dict "coreVersion" $coreVersion -}} {{ else -}} {{ .Params.menuTitle | markdownify -}} From 1bd12a8d8499336a886d6080ca4de309322829a7 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 30 Oct 2025 10:42:36 +0100 Subject: [PATCH 43/44] Improve version selector --- .../layouts/partials/version-selector.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html index 88ec7b6540..0098810e1c 100644 --- a/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html +++ b/site/themes/arangodb-docs-theme/layouts/partials/version-selector.html @@ -3,11 +3,10 @@ <optgroup label="Version"> {{ $versions := index site.Data.versions "/arangodb/" }} {{ range $i, $version := $versions }} - {{/* if eq $version.name "platform" }}{{ continue }}{{ end */}} - {{ if ne $version.name $version.alias }} - <option value="{{ $version.alias }}">{{ $version.alias }}</option> - {{ end }} - <option value="{{ $version.name }}"{{ if eq $version.name "3.12" }} selected{{ end }}>{{ $version.name }}</option> + <option value="{{ $version.name }}"> + {{- $version.name | upper }} + {{- if ne $version.name $version.alias }} ({{ $version.alias }}){{ end -}} + </option> {{ end }} </optgroup> </select> From 6e23959357ad36ee08f43cf682a85748ee1d6c35 Mon Sep 17 00:00:00 2001 From: Simran Spiller <simran@arangodb.com> Date: Thu, 30 Oct 2025 10:42:55 +0100 Subject: [PATCH 44/44] Fix whitespace in full-version shortcode --- .../arangodb-docs-theme/layouts/shortcodes/full-version.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html b/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html index 78ffd56888..592b6aa16d 100644 --- a/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html +++ b/site/themes/arangodb-docs-theme/layouts/shortcodes/full-version.html @@ -1,8 +1,8 @@ {{ $ver := (.Get 0) -}} -{{- $versions := (where (index .Site.Data.versions "/arangodb/") "name" $ver) -}} +{{ $versions := (where (index .Site.Data.versions "/arangodb/") "name" $ver) -}} {{ if $versions -}} {{/* TODO: This is used to determine the release branch name, e.g. 3.12.6. - How will this work for OEM? 3.11.15-oem? */}} + How will this work for OEM? 3.11.15-oem? */ -}} {{ (index $versions 0).version | htmlEscape -}} {{ else -}} {{ $path := "<non-file source>" -}}